ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNwaS1ob3RrZXkudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxMTVhNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYWNwaS1ob3RrZXkudHh0CkBAIC0wLDAgKzEsMzUgQEAKK2RyaXZlci9hY3BpL2hvdGtleS5jIGltcGxlbWVudDoKKzEuIC9wcm9jL2FjcGkvaG90a2V5L2V2ZW50X2NvbmZpZyAKKyhldmVudCBiYXNlZCBob3RrZXkgb3IgZXZlbnQgY29uZmlnIGludGVyZmFjZSk6CithLiBhZGQgYSAgZXZlbnQgYmFzZWQgaG90a2V5KGV2ZW50KSA6IAorZWNobyAiMDpidXM6OmFjdGlvbjptZXRob2Q6bnVtOm51bSIgPiBldmVudF9jb25maWcKKworYi4gZGVsZXRlIGEgZXZlbnQgYmFzZWQgaG90a2V5KGV2ZW50KTogCitlY2hvICIxOjo6OjpudW06bnVtIiA+IGV2ZW50X2NvbmZpZworCitjLiAgbW9kaWZ5IGEgZXZlbnQgYmFzZWQgaG90a2V5KGV2ZW50KTogICAgCitlY2hvICIyOmJ1czo6YWN0aW9uOm1ldGhvZDpudW06bnVtIiA+IGV2ZW50X2NvbmZpZworCisyLiAvcHJvYy9hY3BpL2hvdGtleS9wb2xsX2NvbmZpZyAKKyhwb2xsaW5nIGJhc2VkIGhvdGtleSBvciBldmVudCBjb25maWcgaW50ZXJmYWNlKToKK2EuYWRkIGEgcG9sbGluZyBiYXNlZCBob3RrZXkoZXZlbnQpIDogCQorZWNobyAiMDpidXM6bWV0aG9kOmFjdGlvbjptZXRob2Q6bnVtIiA+IHBvbGxfY29uZmlnCit0aGlzIGFkZGluZyBjb21tYW5kIHdpbGwgY3JlYXRlIGEgcHJvYyBmaWxlIAorL3Byb2MvYWNwaS9ob3RrZXkvbWV0aG9kLCB3aGljaCBpcyB1c2VkIHRvIGdldCAKK3Jlc3VsdCBvZiBwb2xsaW5nLgorCitiLmRlbGV0ZSBhIHBvbGxpbmcgYmFzZWQgaG90a2V5KGV2ZW50KTogCQorZWNobyAiMTo6Ojo6bnVtIiA+IGV2ZW50X2NvbmZpZworCitjLm1vZGlmeSBhIHBvbGxpbmcgYmFzZWQgaG90a2V5KGV2ZW50KTogICAgCitlY2hvICIyOmJ1czptZXRob2Q6YWN0aW9uOm1ldGhvZDpudW0iID4gcG9sbF9jb25maWcKKworMy4vcHJvYy9hY3BpL2hvdGtleS9hY3Rpb24gCisoaW50ZXJmYWNlIHRvIGNhbGwgYW1sIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggYSAKK3NwZWNpZmljIGhvdGtleShldmVudCkpCitlY2hvICJldmVudF9udW06ZXZlbnRfdHlwZTpldmVudF9hcmd1bWVudCIgPiAKKwkvcHJvYy9hY3BpL2hvdGtleS9hY3Rpb24uCitUaGUgcmVzdWx0IG9mIHRoZSBleGVjdXRpb24gb2YgdGhpcyBhbWwgbWV0aG9kIGlzIAorYXR0YWNoZWQgdG8gL3Byb2MvYWNwaS9ob3RrZXkvcG9sbF9tZXRob2QsIHdoaWNoIGlzIGRueWFtaWNhbGx5CitjcmVhdGVkLiAgUGxlYXNlIHVzZSBjb21tYW5kICJjYXQgL3Byb2MvYWNwaS9ob3RrZXkvcG9sbGluZ19tZXRob2QiIAordG8gcmV0cmlldmUgaXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBiL0RvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiCmluZGV4IGM3ZWQwMWIuLmFjMDc5N2UgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiCisrKyBiL0RvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiCkBAIC0xMywxNCArMTMsMTcgQEAKIFRoZSBmcmFtZXdvcmsgcHJvdmlkZXMgZ2VuZXJpYyBmdW5jdGlvbnMgKG1vc3RseSBrZXJuZWwgQVBJIGNhbGxzKSwgc3VjaCBhczoKIAogLSBUcmFuc3BvcnQgU3RyZWFtIFVSQiBoYW5kbGluZyBpbiBjb25qdW5jdGlvbiB3aXRoIGR2Yi1kZW11eC1mZWVkLWNvbnRyb2wKLSAgKGJ1bGsgYW5kIGlzb2MgKFRPRE8pIGFyZSBzdXBwb3J0ZWQpCisgIChidWxrIGFuZCBpc29jIGFyZSBzdXBwb3J0ZWQpCiAtIHJlZ2lzdGVyaW5nIHRoZSBkZXZpY2UgZm9yIHRoZSBEVkItQVBJCiAtIHJlZ2lzdGVyaW5nIGFuIEkyQy1hZGFwdGVyIGlmIGFwcGxpY2FibGUKIC0gcmVtb3RlLWNvbnRyb2wvaW5wdXQtZGV2aWNlIGhhbmRsaW5nCiAtIGZpcm13YXJlIHJlcXVlc3RpbmcgYW5kIGxvYWRpbmcgKGN1cnJlbnRseSBqdXN0IGZvciB0aGUgQ3lwcmVzcyBVU0IKLSAgY29udHJvbGxlcikKKyAgY29udHJvbGxlcnMpCiAtIG90aGVyIGZ1bmN0aW9ucy9tZXRob2RzIHdoaWNoIGNhbiBiZSBzaGFyZWQgYnkgc2V2ZXJhbCBkcml2ZXJzIChzdWNoIGFzCiAgIGZ1bmN0aW9ucyBmb3IgYnVsay1jb250cm9sLWNvbW1hbmRzKQorLSBUT0RPOiBhIEkyQy1jaHVua2VyLiBJdCBjcmVhdGVzIGRldmljZS1zcGVjaWZpYyBjaHVua3Mgb2YgcmVnaXN0ZXItYWNjZXNzZXMKKyAgZGVwZW5kaW5nIG9uIGxlbmd0aCBvZiBhIHJlZ2lzdGVyIGFuZCB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0aGF0IGNhbiBiZQorICBtdWx0aS13cml0dGVuIGFuZCBtdWx0aS1yZWFkLgogCiBUaGUgc291cmNlIGNvZGUgb2YgdGhlIHBhcnRpY3VsYXIgRFZCIFVTQiBkZXZpY2VzIGRvZXMganVzdCB0aGUgY29tbXVuaWNhdGlvbgogd2l0aCB0aGUgZGV2aWNlIHZpYSB0aGUgYnVzLiBUaGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBEVkItQVBJLWZ1bmN0aW9uYWxpdHkKQEAgLTM2LDkzICszOSwxOCBAQAogVE9ETzogZHluYW1pYyBlbmFibGluZyBhbmQgZGlzYWJsaW5nIG9mIHRoZSBwaWQtZmlsdGVyIGluIHJlZ2FyZCB0byBudW1iZXIgb2YKIGZlZWRzIHJlcXVlc3RlZC4KIAotU3VwcG9ydGVkIGRldmljZXMgVVNCMS4xCitTdXBwb3J0ZWQgZGV2aWNlcwogPT09PT09PT09PT09PT09PT09PT09PT09CiAKLVByb2R1Y2VkIGFuZCByZXNlbGxlZCBieSBUd2luaGFuOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIFR3aW5oYW5EVFYgVVNCLVRlciBEVkItVCBEZXZpY2UgKFZQNzA0MSkKLQlodHRwOi8vd3d3LnR3aW5oYW4uY29tL3Byb2R1Y3RfdGVycmVzdHJpYWxfMy5hc3AKK1NlZSB0aGUgTGludXhUViBEVkIgV2lraSBhdCB3d3cubGludXh0di5vcmcgZm9yIGEgY29tcGxldGUgbGlzdCBvZgorY2FyZHMvZHJpdmVycy9maXJtd2FyZXM6CiAKLS0gVHdpbmhhbkRUViBNYWdpYyBCb3ggKFZQNzA0MWUpCi0JaHR0cDovL3d3dy50d2luaGFuLmNvbS9wcm9kdWN0X3RlcnJlc3RyaWFsXzQuYXNwCi0KLS0gSEFNQSBEVkItVCBVU0IgZGV2aWNlCi0JaHR0cDovL3d3dy5oYW1hLmRlL3BvcnRhbC9hcnRpY2xlSWQqMTEwNjIwL2FjdGlvbioyNTk4Ci0KLS0gQ1RTIFBvcnRhYmxlIChDaGluZXNlIFRlbGV2aXNpb24gU3lzdGVtKSAoMikKLQlodHRwOi8vd3d3LjJjdHMudHYvY3RzcG9ydGFibGUvCi0KLS0gVW5rbm93biBVU0IgRFZCLVQgZGV2aWNlIHdpdGggdmVuZG9yIElEIEh5cGVyLVBhbHRlawotCi0KLVByb2R1Y2VkIGFuZCByZXNlbGxlZCBieSBLV29ybGQ6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBLV29ybGQgVi1TdHJlYW0gWFBFUlQgRFRWIERWQi1UIFVTQgotCWh0dHA6Ly93d3cua3dvcmxkLmNvbS50dy9lbi9wcm9kdWN0L0RWQlQtVVNCL0RWQlQtVVNCLmh0bWwKLQotLSBKZXRXYXkgRFRWIERWQi1UIFVTQgotCWh0dHA6Ly93d3cuamV0d2F5LmNvbS50dy9ldmlzbi9wcm9kdWN0L2xjZC10di9EVlQtVVNCL2R0di11c2IuaHRtCi0KLS0gQURTVGVjaCBJbnN0YW50IFRWIERWQi1UIFVTQgotCWh0dHA6Ly93d3cuYWRzdGVjaC5jb20vcHJvZHVjdHMvUFRWLTMzMy9pbnRyby9QVFYtMzMzX2ludHJvLmFzcD9waWQ9UFRWLTMzMwotCi0KLU90aGVyczoKLS0tLS0tLS0KLS0gVWx0aW1hIEVsZWN0cm9uaWMvQXJ0ZWMgVDEgVVNCIFRWQk9YIChBTjIxMzUsIEFOMjIzNSwgQU4yMjM1IHdpdGggUGFuYXNvbmljIFR1bmVyKQotCWh0dHA6Ly84Mi4xNjEuMjQ2LjI0OS9wcm9kdWN0cy10dmJveC5odG1sCi0KLS0gQ29tcHJvIFZpZGVvbWF0ZSBEVkItVTIwMDAgLSBEVkItVCBVU0IgKDIpCi0JaHR0cDovL3d3dy5jb21wcm91c2EuY29tL3Byb2R1Y3RzL3ZtdTIwMDAuaHRtCi0KLS0gR3JhbmR0ZWMgVVNCIERWQi1UCi0JaHR0cDovL3d3dy5ncmFuZC5jb20udHcvCi0KLS0gQVZlck1lZGlhIEF2ZXJUViBEVkJUIFVTQgotCWh0dHA6Ly93d3cuYXZlcm1lZGlhLmNvbS8KLQotLSBEaUJjb20gVVNCIERWQi1UIHJlZmVyZW5jZSBkZXZpY2UgKG5vbi1wdWJsaWMpCi0KLQotU3VwcG9ydGVkIGRldmljZXMgVVNCMi4wLW9ubHkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIFR3aW5oYW4gTWFnaWNCb3ggSUkKLQlodHRwOi8vd3d3LnR3aW5oYW4uY29tL3Byb2R1Y3RfdGVycmVzdHJpYWxfNy5hc3AKLQotLSBUd2luaGFuRFRWIEFscGhhCi0JaHR0cDovL3d3dy50d2luaGFuLmNvbS9wcm9kdWN0X3RlcnJlc3RyaWFsXzguYXNwCi0KLS0gRGlnaXRhbE5vdyBUaW55VVNCIDIgRFZCLXQgUmVjZWl2ZXIKLQlodHRwOi8vd3d3LmRpZ2l0YWxub3cuY29tLmF1L0RpZ2l0YWxOb3clMjB0aW55VVNCMiUyMFNwZWNpZmljYXRpb25zLmh0bWwKLQotLSBIYW5mdGVrIFVNVC0wMTAKLQlodHRwOi8vd3d3Lmdsb2JhbHNvdXJjZXMuY29tL3NpLzYwMDg4MTk3NTcwODIvUHJvZHVjdERldGFpbC9EaWdpdGFsLVRWL3Byb2R1Y3RfaWQtMTAwMDQ2NTI5Ci0KLQotU3VwcG9ydGVkIGRldmljZXMgVVNCMi4wIGFuZCBVU0IxLjEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIFR5cGhvb24vWWFrdW1vL0hBTUEvWXVhbiBEVkItVCBtb2JpbGUgVVNCMi4wCi0JaHR0cDovL3d3dy55YWt1bW8uZGUvcHJvZHVrdGUvaW5kZXgucGhwP3BpZD0xJmFnPURWQi1UCi0JaHR0cDovL3d3dy55dWFuLmNvbS50dy9lbi9wcm9kdWN0cy92ZG9fdWIzMDAuaHRtbAotCWh0dHA6Ly93d3cuaGFtYS5kZS9wb3J0YWwvYXJ0aWNsZUlkKjExNDY2My9hY3Rpb24qMjU2MwotCWh0dHA6Ly93d3cuYW51YmlzbGluZS5jb20vZW5nbGlzaC9hcnRpY2xlYy5hc3A/aWQ9NTA1MDImY2F0aWQ9MDAyCi0KLS0gQXJ0ZWMgVDEgVVNCIFRWQk9YIChGWDIpICgyKQotCi0tIEhhdXBwYXVnZSBXaW5UViBOT1ZBLVQgVVNCMgotCWh0dHA6Ly93d3cuaGF1cHBhdWdlLmNvbS8KLQotLSBLV29ybGQvQURTVGVjaCBJbnN0YW50IERWQi1UIFVTQjIuMCAoRGlCMzAwME0tQikKLQotLSBEaUJjb20gVVNCMi4wIERWQi1UIHJlZmVyZW5jZSBkZXZpY2UgKG5vbi1wdWJsaWMpCi0KLS0gQVZlck1lZGlhIEF2ZXJUViBBODAwIERWQi1UIFVTQjIuMAotCi0xKSBJdCBpcyB3b3JraW5nIGFsbW9zdCAtIHdvcmstaW4tcHJvZ3Jlc3MuCi0yKSBObyB0ZXN0IHJlcG9ydHMgcmVjZWl2ZWQgeWV0LgoraHR0cDovL3d3dy5saW51eHR2Lm9yZy93aWtpL2luZGV4LnBocC9EVkJfVVNCCiAKIDAuIEhpc3RvcnkgJiBOZXdzOgorICAyMDA1LTA2LTMwIC0gYWRkZWQgc3VwcG9ydCBmb3IgV2lkZVZpZXcgV1QtMjIwVSAoVGhhbmtzIHRvIFN0ZXZlIENoYW5nKQorICAyMDA1LTA1LTMwIC0gYWRkZWQgYmFzaWMgaXNvY2hyb25vdXMgc3VwcG9ydCB0byB0aGUgZHZiLXVzYi1mcmFtZXdvcmsKKyAgICAgICAgICAgICAgIGFkZGVkIHN1cHBvcnQgZm9yIENvbmV4YW50IEh5YnJpZCByZWZlcmVuY2UgZGVzaWduIGFuZCBOZWJ1bGEgRGlnaVRWIFVTQgogICAyMDA1LTA0LTE3IC0gYWxsIGRpYnVzYiBkZXZpY2VzIHBvcnRlZCB0byBtYWtlIHVzZSBvZiB0aGUgZHZiLXVzYi1mcmFtZXdvcmsKICAgMjAwNS0wNC0wMiAtIHJlLWVuYWJsZWQgYW5kIGltcHJvdmVkIHJlbW90ZSBjb250cm9sIGNvZGUuCiAgIDIwMDUtMDMtMzEgLSBwb3J0ZWQgdGhlIFlha3Vtby9IYW1hL1R5cGhvb24gRFZCLVQgVVNCMi4wIGRldmljZSB0byBkdmItdXNiLgpAQCAtMTM3LDcgKzY1LDcgQEAKICAgMjAwNS0wMS0zMSAtIGRpc3RvcnRlZCBzdHJlYW1pbmcgaXMgZ29uZSBmb3IgVVNCMS4xIGRldmljZXMKICAgMjAwNS0wMS0xMyAtIG1vdmVkIHRoZSBtaXJyb3JlZCBwaWRfZmlsdGVyX3RhYmxlIGJhY2sgdG8gZHZiLWRpYnVzYgogICAgICAgICAgICAgIC0gZmlyc3QgYWxtb3N0IHdvcmtpbmcgdmVyc2lvbiBmb3IgSGFuZlRlayBVTVQtMDEwCi0gICAgICAgICAgICAgLSBmb3VuZCBvdXQsIHRoYXQgWWFrdW1vL0hBTUEvVHlwaG9vbiBhcmUgcHJlZGVzc29ycyBvZiB0aGUgSGFuZlRlayBVTVQtMDEwCisgICAgICAgICAgICAgLSBmb3VuZCBvdXQsIHRoYXQgWWFrdW1vL0hBTUEvVHlwaG9vbiBhcmUgcHJlZGVjZXNzb3JzIG9mIHRoZSBIYW5mVGVrIFVNVC0wMTAKICAgMjAwNS0wMS0xMCAtIHJlZmFjdG9yaW5nIGNvbXBsZXRlZCwgbm93IGV2ZXJ5dGhpbmcgaXMgdmVyeSBkZWxpZ2h0ZnVsCiAgICAgICAgICAgICAgLSB0dW5lciBxdWlya3MgZm9yIHNvbWUgd2VpcmQgZGV2aWNlcyAoQXJ0ZWMgVDEgQU4yMjM1IGRldmljZSBoYXMgc29tZXRpbWVzIGEKICAgICAgICAgICAgICAgIFBhbmFzb25pYyBUdW5lciBhc3NlbWJsZWQpLiBUdW5lcnByb2JpbmcgaW1wbGVtZW50ZWQuIFRoYW5rcyBhIGxvdCB0byBHdW5uYXIgV2l0dGljaC4KQEAgLTE4NywyNSArMTE1LDEzIEBACiAxLiBIb3cgdG8gdXNlPwogMS4xLiBGaXJtd2FyZQogCi1Nb3N0IG9mIHRoZSBVU0IgZHJpdmVycyBuZWVkIHRvIGRvd25sb2FkIGEgZmlybXdhcmUgdG8gc3RhcnQgd29ya2luZy4KK01vc3Qgb2YgdGhlIFVTQiBkcml2ZXJzIG5lZWQgdG8gZG93bmxvYWQgYSBmaXJtd2FyZSB0byB0aGUgZGV2aWNlIGJlZm9yZSBzdGFydAord29ya2luZy4KIAotZm9yIFVTQjEuMSAoQU4yMTM1KSB5b3UgbmVlZDogZHZiLXVzYi1kaWJ1c2ItNS4wLjAuMTEuZncKLWZvciBVU0IyLjAgSGFuZlRlazogZHZiLXVzYi11bXQtMDEwLTAyLmZ3Ci1mb3IgVVNCMi4wIERpQmNvbTogZHZiLXVzYi1kaWJ1c2ItNi4wLjAuOC5mdwotZm9yIFVTQjIuMCBBVmVyTWVkaWEgQXZlclRWIERWQi1UIFVTQjI6IGR2Yi11c2ItYXZlcnR2LWE4MDAtMDEuZncKLWZvciBVU0IyLjAgVHdpbmhhbkRUViBBbHBoYS9NYWdpY0JveCBJSTogZHZiLXVzYi12cDcwNDUtMDEuZncKK0hhdmUgYSBsb29rIGF0IHRoZSBXaWtpcGFnZSBmb3IgdGhlIERWQi1VU0ItZHJpdmVycyB0byBmaW5kIG91dCwgd2hpY2ggZmlybXdhcmUKK3lvdSBuZWVkIGZvciB5b3VyIGRldmljZToKIAotVGhlIGZpbGVzIGNhbiBiZSBmb3VuZCBvbiBodHRwOi8vd3d3LmxpbnV4dHYub3JnL2Rvd25sb2FkL2Zpcm13YXJlLyAuCi0KLVdlIGRvIG5vdCBoYXZlIHRoZSBwZXJtaXNzaW9uICh5ZXQpIHRvIHB1Ymxpc2ggdGhlIGZvbGxvd2luZyBmaXJtd2FyZS1maWxlcy4KLVlvdSdsbCBuZWVkIHRvIGV4dHJhY3QgdGhlbSBmcm9tIHRoZSB3aW5kb3dzIGRyaXZlcnMuCi0KLVlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgImdldF9kdmJfZmlybXdhcmUgZHZiLXVzYiIgdG8gZ2V0IHRoZSBmaXJtd2FyZToKLQotZm9yIFVTQjEuMSAoQU4yMjM1KSAoYSBmZXcgQXJ0ZWMgVDEgZGV2aWNlcyk6IGR2Yi11c2ItZGlidXNiLWFuMjIzNS0wMS5mdwotZm9yIFVTQjIuMCBIYXVwcGF1Z2U6IGR2Yi11c2Itbm92YS10LXVzYjItMDEuZncKLWZvciBVU0IyLjAgQURTVGVjaC9Ld29ybGQgVVNCMi4wOiBkdmItdXNiLWFkc3RlY2gtdXNiMi0wMS5mdwotZm9yIFVTQjIuMCBZYWt1bW8vVHlwaG9vbi9IYW1hOiBkdmItdXNiLWR0dDIwMHUtMDEuZncKK2h0dHA6Ly93d3cubGludXh0di5vcmcvd2lraS9pbmRleC5waHAvRFZCX1VTQgogCiAxLjIuIENvbXBpbGluZwogCkBAIC0yODksNiArMjA1LDkgQEAKICAgIEd1bm5hciBXaXR0aWNoIGFuZCBKb2FjaGltIHZvbiBDYXJvbiBmb3IgdGhlaXIgdHJ1c3QgZm9yIHByb3ZpZGluZwogICAgIHJvb3Qtc2hlbGxzIG9uIHRoZWlyIG1hY2hpbmVzIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBuZXcgZGV2aWNlcy4KIAorICAgQWxsYW4gVGhpcmQgYW5kIE1pY2hhZWwgSHV0Y2hpbnNvbiBmb3IgdGhlaXIgaGVscCB0byB3cml0ZSB0aGUgTmVidWxhCisgICAgZGlnaXR2LWRyaXZlci4KKwogICAgR2xlbiBIYXJyaXMgZm9yIGJyaW5naW5nIHVwLCB0aGF0IHRoZXJlIGlzIGEgbmV3IGRpYnVzYi1kZXZpY2UgYW5kIEppdW4tS3VlaQogICAgIEp1bmcgZnJvbSBBVmVyTWVkaWEgd2hvIGtpbmRseSBwcm92aWRlZCBhIHNwZWNpYWwgZmlybXdhcmUgdG8gZ2V0IHRoZSBkZXZpY2UKICAgICB1cCBhbmQgcnVubmluZyBpbiBMaW51eC4KQEAgLTI5Niw3ICsyMTUsMTIgQEAKICAgIEplbm5pZmVyIENoZW4sIEplZmYgYW5kIEphY2sgZnJvbSBUd2luaGFuIGZvciBraW5kbHkgc3VwcG9ydGluZyBieQogCXdyaXRpbmcgdGhlIHZwNzA0NS1kcml2ZXIuCiAKLSAgIFNvbWUgZ3V5cyBvbiB0aGUgbGludXgtZHZiIG1haWxpbmcgbGlzdCBmb3IgZW5jb3VyYWdpbmcgbWUKKyAgIFN0ZXZlIENoYW5nIGZyb20gV2lkZVZpZXcgZm9yIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBmb3IgbmV3IGRldmljZXMgYW5kCisJZmlybXdhcmUgZmlsZXMuCisKKyAgIE1pY2hhZWwgUGF4dG9uIGZvciBzdWJtaXR0aW5nIHJlbW90ZSBjb250cm9sIGtleW1hcHMuCisKKyAgIFNvbWUgZ3V5cyBvbiB0aGUgbGludXgtZHZiIG1haWxpbmcgbGlzdCBmb3IgZW5jb3VyYWdpbmcgbWUuCiAKICAgIFBldGVyIFNjaGlsZG1hbm4gPnBldGVyLnNjaGlsZG1hbm4tbm9zcGFtLWF0LXdlYi5kZTwgZm9yIGhpcwogICAgIHVzZXItbGV2ZWwgZmlybXdhcmUgbG9hZGVyLCB3aGljaCBzYXZlcyBhIGxvdCBvZiB0aW1lCkBAIC0zMDUsNCArMjI5LDQgQEAKICAgIFVsZiBIZXJtZW5hdSBmb3IgaGVscGluZyBtZSBvdXQgd2l0aCB0cmFkaXRpb25hbCBjaGluZXNlLgogCiAgICBBbmRy6SBTbW9rdHVuIGFuZCBDaHJpc3RpYW4gRnL2bW1lbCBmb3Igc3VwcG9ydGluZyBtZSB3aXRoCi0gICAgaGFyZHdhcmUgYW5kIGxpc3RlbmluZyB0byBteSBwcm9ibGVtcyB2ZXJ5IHBhdGllbnQuCisgICAgaGFyZHdhcmUgYW5kIGxpc3RlbmluZyB0byBteSBwcm9ibGVtcyB2ZXJ5IHBhdGllbnRseS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL2J0OHh4LnR4dCBiL0RvY3VtZW50YXRpb24vZHZiL2J0OHh4LnR4dAppbmRleCAzYTMyNjA3Li5lNmI4ZDA1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvYnQ4eHgudHh0CkBAIC0xLDY2ICsxLDU1IEBACi1Ib3cgdG8gZ2V0IHRoZSBOZWJ1bGEsIFBDVFYgYW5kIFR3aW5oYW4gRFNUIGNhcmRzIHdvcmtpbmcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIGdldCB0aGUgTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViwgUGlubmFjbGUgUENUViBTYXQsIFR3aW5oYW4gRFNUICsgY2xvbmVzIHdvcmtpbmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoaXMgY2xhc3Mgb2YgY2FyZHMgaGFzIGEgYnQ4NzhhIGFzIHRoZSBQQ0kgaW50ZXJmYWNlLCBhbmQKLXJlcXVpcmUgdGhlIGJ0dHYgZHJpdmVyLgorMSkgR2VuZXJhbCBpbmZvcm1hdGlvbgorPT09PT09PT09PT09PT09PT09PT09PQogCi1QbGVhc2UgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgd2FybmluZyBhYm91dCB0aGUgYnR0diBtb2R1bGUKLW9wdGlvbnMgYmVsb3cgZm9yIHRoZSBEU1QgY2FyZC4KK1RoaXMgY2xhc3Mgb2YgY2FyZHMgaGFzIGEgYnQ4NzhhIGNoaXAgYXMgdGhlIFBDSSBpbnRlcmZhY2UuCitUaGUgZGlmZmVyZW50IGNhcmQgZHJpdmVycyByZXF1aXJlIHRoZSBidHR2IGRyaXZlciB0byBwcm92aWRlIHRoZSBtZWFucwordG8gYWNjZXNzIHRoZSBpMmMgYnVzIGFuZCB0aGUgZ3BpbyBwaW5zIG9mIHRoZSBidDh4eCBjaGlwc2V0LgogCi0xKSBHZW5lcmFsIGluZm9ybWF0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT0KKzIpIENvbXBpbGF0aW9uIHJ1bGVzIGZvciBLZXJuZWwgPj0gMi42LjEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGVzZSBkcml2ZXJzIHJlcXVpcmUgdGhlIGJ0dHYgZHJpdmVyIHRvIHByb3ZpZGUgdGhlIG1lYW5zIHRvIGFjY2VzcwotdGhlIGkyYyBidXMgYW5kIHRoZSBncGlvIHBpbnMgb2YgdGhlIGJ0OHh4IGNoaXBzZXQuCitFbmFibGUgdGhlIGZvbGxvd2luZyBvcHRpb25zOgogCi1CZWNhdXNlIG9mIHRoaXMsIHlvdSBuZWVkIHRvIGVuYWJsZQogIkRldmljZSBkcml2ZXJzIiA9PiAiTXVsdGltZWRpYSBkZXZpY2VzIgotICA9PiAiVmlkZW8gRm9yIExpbnV4IiA9PiAiQlQ4NDggVmlkZW8gRm9yIExpbnV4IgotCi1GdXJ0aGVybW9yZSB5b3UgbmVlZCB0byBlbmFibGUKKyA9PiAiVmlkZW8gRm9yIExpbnV4IiA9PiAiQlQ4NDggVmlkZW8gRm9yIExpbnV4IgogIkRldmljZSBkcml2ZXJzIiA9PiAiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcyIKLSAgPT4gIkRWQiBmb3IgTGludXgiICJEVkIgQ29yZSBTdXBwb3J0IiAiTmVidWxhL1Bpbm5hY2xlIFBDVFYvVHdpbkhhbiBQQ0kgQ2FyZHMiCisgPT4gIkRWQiBmb3IgTGludXgiICJEVkIgQ29yZSBTdXBwb3J0IiAiTmVidWxhL1Bpbm5hY2xlIFBDVFYvVHdpbkhhbiBQQ0kgQ2FyZHMiCiAKLTIpIExvYWRpbmcgTW9kdWxlcwotPT09PT09PT09PT09PT09PT09CiszKSBMb2FkaW5nIE1vZHVsZXMsIGRlc2NyaWJlZCBieSB0d28gYXBwcm9hY2hlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogSW4gZ2VuZXJhbCB5b3UgbmVlZCB0byBsb2FkIHRoZSBidHR2IGRyaXZlciwgd2hpY2ggd2lsbCBoYW5kbGUgdGhlIGdwaW8gYW5kCi1pMmMgY29tbXVuaWNhdGlvbiBmb3IgdXMsIHBsdXMgdGhlIGNvbW1vbiBkdmItYnQ4eHggZGV2aWNlIGRyaXZlci4KLVRoZSBmcm9udGVuZHMgZm9yIE5lYnVsYSAobnh0NjAwMCksIFBpbm5hY2xlIFBDVFYgKGN4MjQxMTApIGFuZAotVHdpbkhhbiAoZHN0KSBhcmUgbG9hZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGR2Yi1idDh4eCBkZXZpY2UgZHJpdmVyLgoraTJjIGNvbW11bmljYXRpb24gZm9yIHVzLCBwbHVzIHRoZSBjb21tb24gZHZiLWJ0OHh4IGRldmljZSBkcml2ZXIsCit3aGljaCBpcyBjYWxsZWQgdGhlIGJhY2tlbmQuCitUaGUgZnJvbnRlbmRzIGZvciBOZWJ1bGEgRGlnaVRWIChueHQ2MDAwKSwgUGlubmFjbGUgUENUViBTYXQgKGN4MjQxMTApLAorVHdpbkhhbiBEU1QgKyBjbG9uZXMgKGRzdCBhbmQgZHN0LWNhKSBhcmUgbG9hZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGJhY2tlbmQuCitGb3IgZnVydGhlciBkZXRhaWxzIGFib3V0IFR3aW5IYW4gRFNUICsgY2xvbmVzIHNlZSAvRG9jdW1lbnRhdGlvbi9kdmIvY2kudHh0LgogCi0zYSkgTmVidWxhIC8gUGlubmFjbGUgUENUVgorM2EpIFRoZSBtYW51YWwgYXBwcm9hY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xvYWRpbmcgbW9kdWxlczoKK21vZHByb2JlIGJ0dHYKK21vZHByb2JlIGR2Yi1idDh4eAorCitVbmxvYWRpbmcgbW9kdWxlczoKK21vZHByb2JlIC1yIGR2Yi1idDh4eAorbW9kcHJvYmUgLXIgYnR0dgorCiszYikgVGhlIGF1dG9tYXRpYyBhcHByb2FjaAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgJCBtb2Rwcm9iZSBidHR2IChub3JtYWxseSBidHR2IGlzIGJlaW5nIGxvYWRlZCBhdXRvbWF0aWNhbGx5IGJ5IGttb2QpCi0gICAkIG1vZHByb2JlIGR2Yi1idDh4eCAob3IganVzdCBwbGFjZSBkdmItYnQ4eHggaW4gL2V0Yy9tb2R1bGVzIGZvciBhdXRvbWF0aWMgbG9hZGluZykKK0lmIG5vdCBhbHJlYWR5IGRvbmUgYnkgaW5zdGFsbGF0aW9uLCBwbGFjZSBhIGxpbmUgZWl0aGVyIGluCisvZXRjL21vZHVsZXMuY29uZiBvciBpbiAvZXRjL21vZHByb2JlLmNvbmYgY29udGFpbmluZyB0aGlzIHRleHQ6CithbGlhcyBjaGFyLW1ham9yLTgxCWJ0dHYKIAorVGhlbiBwbGFjZSBhIGxpbmUgaW4gL2V0Yy9tb2R1bGVzIGNvbnRhaW5pbmcgdGhpcyB0ZXh0OgorZHZiLWJ0OHh4CiAKLTNiKSBUd2luSGFuIGFuZCBDbG9uZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICQgbW9kcHJvYmUgYnR0diBpMmNfaHc9MSBjYXJkPTB4NzEKLSAgICQgbW9kcHJvYmUgZHZiLWJ0OHh4Ci0gICAkIG1vZHByb2JlIGRzdAotCi1UaGUgdmFsdWUgMHg3MSB3aWxsIG92ZXJyaWRlIHRoZSBQQ0kgdHlwZSBkZXRlY3Rpb24gZm9yIGR2Yi1idDh4eCwKLXdoaWNoIGlzIG5lY2Vzc2FyeSBmb3IgVHdpbkhhbiBjYXJkcy4KLQotSWYgeW91J3JlIGhhdmluZyBhbiBvbGRlciBjYXJkIChibHVlIGNvbG9yIGNpcmN1aXQpIGFuZCBjYXJkPTB4NzEgbG9ja3MKLXlvdXIgbWFjaGluZSwgdHJ5IHVzaW5nIDB4NjgsIHRvby4gSWYgdGhhdCBkb2VzIG5vdCB3b3JrLCBhc2sgb24gdGhlCi1tYWlsaW5nIGxpc3QuCi0KLVRoZSBEU1QgbW9kdWxlIHRha2VzIGEgY291cGxlIG9mIHVzZWZ1bCBwYXJhbWV0ZXJzOgotCi1hLiB2ZXJib3NlIHRha2VzIHZhbHVlcyAwIHRvIDUuIFRoZXNlIHZhbHVlcyBjb250cm9sIHRoZSB2ZXJib3NpdHkgbGV2ZWwuCi1iLiBkZWJ1ZyB0YWtlcyB2YWx1ZXMgMCBhbmQgMS4gWW91IGNhbiBlaXRoZXIgZGlzYWJsZSBvciBlbmFibGUgZGVidWdnaW5nLgotYy4gZHN0X2FkZG9ucyB0YWtlcyB2YWx1ZXMgMCBhbmQgMHgyMDoKLS0gQSB2YWx1ZSBvZiAwIG1lYW5zIGl0IGlzIGEgRlRBIGNhcmQuCi0tIEEgdmFsdWUgb2YgMHgyMCBtZWFucyBpdCBoYXMgYSBDb25kaXRpb25hbCBBY2Nlc3Mgc2xvdC4KLQotVGhlIGF1dG9kZXRlY3RlZCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlICJyZXNwb25zZSBzdHJpbmciCi1vZiB0aGUgY2FyZCwgd2hpY2ggeW91IGNhbiBzZWUgaW4geW91ciBsb2dzOgotZS5nLjogZHN0X2dldF9kZXZpY2VfaWQ6IFJlY29nbml6ZSBbRFNUTUNJXQorUmVib290IHlvdXIgc3lzdGVtIGFuZCBoYXZlIGZ1biEKIAogLS0KIEF1dGhvcnM6IFJpY2hhcmQgV2Fsa2VyLCBKYW1pZSBIb25hbiwgTWljaGFlbCBIdW5vbGQsIE1hbnUgQWJyYWhhbSwgVXdlIEJ1Z2xhCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggMWQyMjdlZS4uMTJkZGU0MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMTE5LDMgKzExOSwxOSBAQAogCXdpbGwgYmUgYXZhaWxhYmxlIHVudGlsIHJlbW92YWwgb2Ygb2xkIG5hbWVzLgogV2hvOglHcmFudCBDb2FkeSA8Z2NvYWR5QGdtYWlsLmNvbT4KIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CVBDTUNJQSBjb250cm9sIGlvY3RsIChuZWVkZWQgZm9yIHBjbWNpYS1jcyBbY2FyZG1nciwgY2FyZGN0bF0pCitXaGVuOglOb3ZlbWJlciAyMDA1CitGaWxlczoJZHJpdmVycy9wY21jaWEvOiBwY21jaWFfaW9jdGwuYworV2h5OglXaXRoIHRoZSAxNi1iaXQgUENNQ0lBIHN1YnN5c3RlbSBub3cgYmVoYXZpbmcgKGFsbW9zdCkgbGlrZSBhCisJbm9ybWFsIGhvdHBsdWdnYWJsZSBidXMsIGFuZCB3aXRoIGl0IHVzaW5nIHRoZSBkZWZhdWx0IGtlcm5lbAorCWluZnJhc3RydWN0dXJlIChob3RwbHVnLCBkcml2ZXIgY29yZSwgc3lzZnMpIGtlZXBpbmcgdGhlIFBDTUNJQQorCWNvbnRyb2wgaW9jdGwgbmVlZGVkIGJ5IGNhcmRtZ3IgYW5kIGNhcmRjdGwgZnJvbSBwY21jaWEtY3MgaXMKKwl1bm5lY2Vzc2FyeSwgYW5kIG1ha2VzIGZ1cnRoZXIgY2xlYW51cHMgYW5kIGludGVncmF0aW9uIG9mIHRoZQorCVBDTUNJQSBzdWJzeXN0ZW0gaW50byB0aGUgTGludXgga2VybmVsIGRldmljZSBkcml2ZXIgbW9kZWwgbW9yZQorCWRpZmZpY3VsdC4gVGhlIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IGNhcmRtZ3IgYW5kIGNhcmRjdGwgYXJlIGVpdGhlcgorCWhhbmRsZWQgYnkgdGhlIGtlcm5lbCBpdHNlbGYgbm93IG9yIGFyZSBhdmFpbGFibGUgaW4gdGhlIG5ldworCXBjbWNpYXV0aWxzIHBhY2thZ2UgYXZhaWxhYmxlIGF0CisJaHR0cDovL2tlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9wY21jaWEvCitXaG86CURvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lub3RpZnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzE2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lub3RpZnkudHh0CkBAIC0wLDAgKzEsMTM4IEBACisJCQkJICAgIGlub3RpZnkKKwkgICAgIGEgcG93ZXJmdWwgeWV0IHNpbXBsZSBmaWxlIGNoYW5nZSBub3RpZmljYXRpb24gc3lzdGVtCisKKworCitEb2N1bWVudCBzdGFydGVkIDE1IE1hciAyMDA1IGJ5IFJvYmVydCBMb3ZlIDxybWxAbm92ZWxsLmNvbT4KKworKGkpIFVzZXIgSW50ZXJmYWNlCisKK0lub3RpZnkgaXMgY29udHJvbGxlZCBieSBhIHNldCBvZiB0aHJlZSBzeXMgY2FsbHMgCisKK0ZpcnN0IHN0ZXAgaW4gdXNpbmcgaW5vdGlmeSBpcyB0byBpbml0aWFsaXNlIGFuIGlub3RpZnkgaW5zdGFuY2UKKworCWludCBmZCA9IGlub3RpZnlfaW5pdCAoKTsKKworQ2hhbmdlIGV2ZW50cyBhcmUgbWFuYWdlZCBieSAid2F0Y2hlcyIuICBBIHdhdGNoIGlzIGFuIChvYmplY3QsbWFzaykgcGFpciB3aGVyZQordGhlIG9iamVjdCBpcyBhIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB0aGUgbWFzayBpcyBhIGJpdCBtYXNrIG9mIG9uZSBvciBtb3JlCitpbm90aWZ5IGV2ZW50cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgdG8gcmVjZWl2ZS4gIFNlZSA8bGludXgvaW5vdGlmeS5oPgorZm9yIHZhbGlkIGV2ZW50cy4gIEEgd2F0Y2ggaXMgcmVmZXJlbmNlZCBieSBhIHdhdGNoIGRlc2NyaXB0b3IsIG9yIHdkLgorCitXYXRjaGVzIGFyZSBhZGRlZCB2aWEgYSBwYXRoIHRvIHRoZSBmaWxlLgorCitXYXRjaGVzIG9uIGEgZGlyZWN0b3J5IHdpbGwgcmV0dXJuIGV2ZW50cyBvbiBhbnkgZmlsZXMgaW5zaWRlIG9mIHRoZSBkaXJlY3RvcnkuCisKK0FkZGluZyBhIHdhdGNoIGlzIHNpbXBsZSwKKworCWludCB3ZCA9IGlub3RpZnlfYWRkX3dhdGNoIChmZCwgcGF0aCwgbWFzayk7CisKK1lvdSBjYW4gYWRkIGEgbGFyZ2UgbnVtYmVyIG9mIGZpbGVzIHZpYSBzb21ldGhpbmcgbGlrZQorCisJZm9yIGVhY2ggZmlsZSB0byB3YXRjaCB7CisJCWludCB3ZCA9IGlub3RpZnlfYWRkX3dhdGNoIChmZCwgZmlsZSwgbWFzayk7CisJfQorCitZb3UgY2FuIHVwZGF0ZSBhbiBleGlzdGluZyB3YXRjaCBpbiB0aGUgc2FtZSBtYW5uZXIsIGJ5IHBhc3NpbmcgaW4gYSBuZXcgbWFzay4KKworQW4gZXhpc3Rpbmcgd2F0Y2ggaXMgcmVtb3ZlZCB2aWEgdGhlIElOT1RJRllfSUdOT1JFIGlvY3RsLCBmb3IgZXhhbXBsZQorCisJaW5vdGlmeV9ybV93YXRjaCAoZmQsIHdkKTsKKworRXZlbnRzIGFyZSBwcm92aWRlZCBpbiB0aGUgZm9ybSBvZiBhbiBpbm90aWZ5X2V2ZW50IHN0cnVjdHVyZSB0aGF0IGlzIHJlYWQoMikKK2Zyb20gYSBpbm90aWZ5IGluc3RhbmNlIGZkLiAgVGhlIGZpbGVuYW1lIGlzIG9mIGR5bmFtaWMgbGVuZ3RoIGFuZCBmb2xsb3dzIHRoZSAKK3N0cnVjdC4gSXQgaXMgb2Ygc2l6ZSBsZW4uICBUaGUgZmlsZW5hbWUgaXMgcGFkZGVkIHdpdGggbnVsbCBieXRlcyB0byBlbnN1cmUgCitwcm9wZXIgYWxpZ25tZW50LiAgVGhpcyBwYWRkaW5nIGlzIHJlZmxlY3RlZCBpbiBsZW4uCisKK1lvdSBjYW4gc2x1cnAgbXVsdGlwbGUgZXZlbnRzIGJ5IHBhc3NpbmcgYSBsYXJnZSBidWZmZXIsIGZvciBleGFtcGxlCisKKwlzaXplX3QgbGVuID0gcmVhZCAoZmQsIGJ1ZiwgQlVGX0xFTik7CisKK1dpbGwgcmV0dXJuIGFzIG1hbnkgZXZlbnRzIGFzIGFyZSBhdmFpbGFibGUgYW5kIGZpdCBpbiBCVUZfTEVOLgorCitlYWNoIGlub3RpZnkgaW5zdGFuY2UgZmQgaXMgYWxzbyBzZWxlY3QoKS0gYW5kIHBvbGwoKS1hYmxlLgorCitZb3UgY2FuIGZpbmQgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZXZlbnQgcXVldWUgdmlhIHRoZSBGSU9OUkVBRCBpb2N0bC4KKworQWxsIHdhdGNoZXMgYXJlIGRlc3Ryb3llZCBhbmQgY2xlYW5lZCB1cCBvbiBjbG9zZS4KKworCisoaWkpIEludGVybmFsIEtlcm5lbCBJbXBsZW1lbnRhdGlvbgorCitFYWNoIG9wZW4gaW5vdGlmeSBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5vdGlmeV9kZXZpY2Ugc3RydWN0dXJlLgorCitFYWNoIHdhdGNoIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbm90aWZ5X3dhdGNoIHN0cnVjdHVyZS4gIFdhdGNoZXMgYXJlIGNoYWluZWQKK29mZiBvZiBlYWNoIGFzc29jaWF0ZWQgZGV2aWNlIGFuZCBlYWNoIGFzc29jaWF0ZWQgaW5vZGUuCisKK1NlZSBmcy9pbm90aWZ5LmMgZm9yIHRoZSBsb2NraW5nIGFuZCBsaWZldGltZSBydWxlcy4KKworCisoaWlpKSBSYXRpb25hbGUKKworUTogV2hhdCBpcyB0aGUgZGVzaWduIGRlY2lzaW9uIGJlaGluZCBub3QgdHlpbmcgdGhlIHdhdGNoIHRvIHRoZSBvcGVuIGZkIG9mCisgICB0aGUgd2F0Y2hlZCBvYmplY3Q/CisKK0E6IFdhdGNoZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhbiBvcGVuIGlub3RpZnkgZGV2aWNlLCBub3QgYW4gb3BlbiBmaWxlLgorICAgVGhpcyBzb2x2ZXMgdGhlIHByaW1hcnkgcHJvYmxlbSB3aXRoIGRub3RpZnk6IGtlZXBpbmcgdGhlIGZpbGUgb3BlbiBwaW5zCisgICB0aGUgZmlsZSBhbmQgdGh1cywgd29yc2UsIHBpbnMgdGhlIG1vdW50LiAgRG5vdGlmeSBpcyB0aGVyZWZvcmUgaW5mZWFzaWJsZQorICAgZm9yIHVzZSBvbiBhIGRlc2t0b3Agc3lzdGVtIHdpdGggcmVtb3ZhYmxlIG1lZGlhIGFzIHRoZSBtZWRpYSBjYW5ub3QgYmUKKyAgIHVubW91bnRlZC4KKworUTogV2hhdCBpcyB0aGUgZGVzaWduIGRlY2lzaW9uIGJlaGluZCB1c2luZyBhbi1mZC1wZXItZGV2aWNlIGFzIG9wcG9zZWQgdG8KKyAgIGFuIGZkLXBlci13YXRjaD8KKworQTogQW4gZmQtcGVyLXdhdGNoIHF1aWNrbHkgY29uc3VtZXMgbW9yZSBmaWxlIGRlc2NyaXB0b3JzIHRoYW4gYXJlIGFsbG93ZWQsCisgICBtb3JlIGZkJ3MgdGhhbiBhcmUgZmVhc2libGUgdG8gbWFuYWdlLCBhbmQgbW9yZSBmZCdzIHRoYW4gYXJlIG9wdGltYWxseQorICAgc2VsZWN0KCktYWJsZS4gIFllcywgcm9vdCBjYW4gYnVtcCB0aGUgcGVyLXByb2Nlc3MgZmQgbGltaXQgYW5kIHllcywgdXNlcnMKKyAgIGNhbiB1c2UgZXBvbGwsIGJ1dCByZXF1aXJpbmcgYm90aCBpcyBhIHNpbGx5IGFuZCBleHRyYW5lb3VzIHJlcXVpcmVtZW50LgorICAgQSB3YXRjaCBjb25zdW1lcyBsZXNzIG1lbW9yeSB0aGFuIGFuIG9wZW4gZmlsZSwgc2VwYXJhdGluZyB0aGUgbnVtYmVyCisgICBzcGFjZXMgaXMgdGh1cyBzZW5zaWJsZS4gIFRoZSBjdXJyZW50IGRlc2lnbiBpcyB3aGF0IHVzZXItc3BhY2UgZGV2ZWxvcGVycworICAgd2FudDogVXNlcnMgaW5pdGlhbGl6ZSBpbm90aWZ5LCBvbmNlLCBhbmQgYWRkIG4gd2F0Y2hlcywgcmVxdWlyaW5nIGJ1dCBvbmUgZmQKKyAgIGFuZCBubyB0d2lkZGxpbmcgd2l0aCBmZCBsaW1pdHMuICBJbml0aWFsaXppbmcgYW4gaW5vdGlmeSBpbnN0YW5jZSB0d28KKyAgIHRob3VzYW5kIHRpbWVzIGlzIHNpbGx5LiAgSWYgd2UgY2FuIGltcGxlbWVudCB1c2VyLXNwYWNlJ3MgcHJlZmVyZW5jZXMgCisgICBjbGVhbmx5LS1hbmQgd2UgY2FuLCB0aGUgaWRyIGxheWVyIG1ha2VzIHN0dWZmIGxpa2UgdGhpcyB0cml2aWFsLS10aGVuIHdlIAorICAgc2hvdWxkLgorCisgICBUaGVyZSBhcmUgb3RoZXIgZ29vZCBhcmd1bWVudHMuICBXaXRoIGEgc2luZ2xlIGZkLCB0aGVyZSBpcyBhIHNpbmdsZQorICAgaXRlbSB0byBibG9jayBvbiwgd2hpY2ggaXMgbWFwcGVkIHRvIGEgc2luZ2xlIHF1ZXVlIG9mIGV2ZW50cy4gIFRoZSBzaW5nbGUKKyAgIGZkIHJldHVybnMgYWxsIHdhdGNoIGV2ZW50cyBhbmQgYWxzbyBhbnkgcG90ZW50aWFsIG91dC1vZi1iYW5kIGRhdGEuICBJZgorICAgZXZlcnkgZmQgd2FzIGEgc2VwYXJhdGUgd2F0Y2gsCisKKyAgIC0gVGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIGdldCBldmVudCBvcmRlcmluZy4gIEV2ZW50cyBvbiBmaWxlIGZvbyBhbmQKKyAgICAgZmlsZSBiYXIgd291bGQgcG9wIHBvbGwoKSBvbiBib3RoIGZkJ3MsIGJ1dCB0aGVyZSB3b3VsZCBiZSBubyB3YXkgdG8gdGVsbAorICAgICB3aGljaCBoYXBwZW5lZCBmaXJzdC4gIEEgc2luZ2xlIHF1ZXVlIHRyaXZpYWxseSBnaXZlcyB5b3Ugb3JkZXJpbmcuICBTdWNoCisgICAgIG9yZGVyaW5nIGlzIGNydWNpYWwgdG8gZXhpc3RpbmcgYXBwbGljYXRpb25zIHN1Y2ggYXMgQmVhZ2xlLiAgSW1hZ2luZQorICAgICAibXYgYSBiIDsgbXYgYiBhIiBldmVudHMgd2l0aG91dCBvcmRlcmluZy4KKworICAgLSBXZSdkIGhhdmUgdG8gbWFpbnRhaW4gbiBmZCdzIGFuZCBuIGludGVybmFsIHF1ZXVlcyB3aXRoIHN0YXRlLAorICAgICB2ZXJzdXMganVzdCBvbmUuICBJdCBpcyBhIGxvdCBtZXNzaWVyIGluIHRoZSBrZXJuZWwuICBBIHNpbmdsZSwgbGluZWFyCisgICAgIHF1ZXVlIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIHNlbnNlLgorCisgICAtIFVzZXItc3BhY2UgZGV2ZWxvcGVycyBwcmVmZXIgdGhlIGN1cnJlbnQgQVBJLiAgVGhlIEJlYWdsZSBndXlzLCBmb3IKKyAgICAgZXhhbXBsZSwgbG92ZSBpdC4gIFRydXN0IG1lLCBJIGFza2VkLiAgSXQgaXMgbm90IGEgc3VycHJpc2U6IFdobydkIHdhbnQKKyAgICAgdG8gbWFuYWdlIGFuZCBibG9jayBvbiAxMDAwIGZkJ3MgdmlhIHNlbGVjdD8KKworICAgLSBZb3UnZCBoYXZlIHRvIG1hbmFnZSB0aGUgZmQncywgYXMgYW4gZXhhbXBsZTogQ2FsbCBjbG9zZSgpIHdoZW4geW91CisgICAgIHJlY2VpdmVkIGEgZGVsZXRlIGV2ZW50LgorCisgICAtIE5vIHdheSB0byBnZXQgb3V0IG9mIGJhbmQgZGF0YS4KKworICAgLSAxMDI0IGlzIHN0aWxsIHRvbyBsb3cuICA7LSkKKworICAgV2hlbiB5b3UgdGFsayBhYm91dCBkZXNpZ25pbmcgYSBmaWxlIGNoYW5nZSBub3RpZmljYXRpb24gc3lzdGVtIHRoYXQKKyAgIHNjYWxlcyB0byAxMDAwcyBvZiBkaXJlY3RvcmllcywganVnZ2xpbmcgMTAwMHMgb2YgZmQncyBqdXN0IGRvZXMgbm90IHNlZW0KKyAgIHRoZSByaWdodCBpbnRlcmZhY2UuICBJdCBpcyB0b28gaGVhdnkuCisKK1E6IFdoeSB0aGUgc3lzdGVtIGNhbGwgYXBwcm9hY2g/CisKK0E6IFRoZSBwb29yIHVzZXItc3BhY2UgaW50ZXJmYWNlIGlzIHRoZSBzZWNvbmQgYmlnZ2VzdCBwcm9ibGVtIHdpdGggZG5vdGlmeS4KKyAgIFNpZ25hbHMgYXJlIGEgdGVycmlibGUsIHRlcnJpYmxlIGludGVyZmFjZSBmb3IgZmlsZSBub3RpZmljYXRpb24uICBPciBmb3IKKyAgIGFueXRoaW5nLCBmb3IgdGhhdCBtYXR0ZXIuICBUaGUgaWRlYWwgc29sdXRpb24sIGZyb20gYWxsIHBlcnNwZWN0aXZlcywgaXMgYQorICAgZmlsZSBkZXNjcmlwdG9yLWJhc2VkIG9uZSB0aGF0IGFsbG93cyBiYXNpYyBmaWxlIEkvTyBhbmQgcG9sbC9zZWxlY3QuCisgICBPYnRhaW5pbmcgdGhlIGZkIGFuZCBtYW5hZ2luZyB0aGUgd2F0Y2hlcyBjb3VsZCBoYXZlIGJlZW4gZG9uZSBlaXRoZXIgdmlhIGEKKyAgIGRldmljZSBmaWxlIG9yIGEgZmFtaWx5IG9mIG5ldyBzeXN0ZW0gY2FsbHMuICBXZSBkZWNpZGVkIHRvIGltcGxlbWVudCBhCisgICBmYW1pbHkgb2Ygc3lzdGVtIGNhbGxzIGJlY2F1c2UgdGhhdCBpcyB0aGUgcHJlZmZlcmVkIGFwcHJvYWNoIGZvciBuZXcga2VybmVsCisgICBmZWF0dXJlcyBhbmQgaXQgbWVhbnMgb3VyIHVzZXIgaW50ZXJmYWNlIHJlcXVpcmVtZW50cy4KKworICAgQWRkaXRpb25hbGx5LCBpdCBfaXNfIHBvc3NpYmxlIHRvICBtb3JlIHRoYW4gb25lIGluc3RhbmNlICBhbmQKKyAgIGp1Z2dsZSBtb3JlIHRoYW4gb25lIHF1ZXVlIGFuZCB0aHVzIG1vcmUgdGhhbiBvbmUgYXNzb2NpYXRlZCBmZC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAyMSBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyMQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAyMQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDIxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG0xMDI1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDI1CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG0xMDI1CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMjUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FkbTEwMjYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMjYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FkbTEwMjYKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyNgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAzMSBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAzMQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAzMQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDMxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG05MjQwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG05MjQwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG05MjQwCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FzYjEwMCBiL0RvY3VtZW50YXRpb24vaHdtb24vYXNiMTAwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hc2IxMDAKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vYXNiMTAwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9kczE2MjEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2RzMTYyMQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvZHMxNjIxCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2RzMTYyMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvZnNjaGVyIGIvRG9jdW1lbnRhdGlvbi9od21vbi9mc2NoZXIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2ZzY2hlcgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9mc2NoZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2dsNTE4c20gYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2dsNTE4c20Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2dsNTE4c20KcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vZ2w1MThzbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvaXQ4NyBiL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvaXQ4NwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTYzIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTYzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTYzCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtNjMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtNzUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtNzUKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG03NQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG03NyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03NwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG03NwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTc3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTc4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTc4CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTc4CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtNzgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODAKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG04MApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG04MyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG04MwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG04MwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTgzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTg1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg1CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTg1CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtODUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODcKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG04NwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG05MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05MApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG05MApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTkwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTkyIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTkyCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtOTIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDE2MTkgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2MTkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDE2MTkKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbWF4MTYxOQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvcGM4NzM2MCBiL0RvY3VtZW50YXRpb24vaHdtb24vcGM4NzM2MApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvcGM4NzM2MApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9wYzg3MzYwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9zaXM1NTk1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9zaXM1NTk1CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9zaXM1NTk1CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3NpczU1OTUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL3Ntc2M0N2IzOTcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N2IzOTcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3Ntc2M0N2IzOTcKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3YjM5NwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvc21zYzQ3bTEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N20xCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9zbXNjNDdtMQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvc3lzZnMtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL3N5c2ZzLWludGVyZmFjZQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL3VzZXJzcGFjZS10b29scyBiL0RvY3VtZW50YXRpb24vaHdtb24vdXNlcnNwYWNlLXRvb2xzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy91c2Vyc3BhY2UtdG9vbHMKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vdXNlcnNwYWNlLXRvb2xzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy92aWE2ODZhIGIvRG9jdW1lbnRhdGlvbi9od21vbi92aWE2ODZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy92aWE2ODZhCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3ZpYTY4NmEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL3c4MzYyN2hmIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdoZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvdzgzNjI3aGYKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL3c4Mzc4MWQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc4MWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3c4Mzc4MWQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vdzgzNzgxZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvdzgzbDc4NXRzIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODNsNzg1dHMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3c4M2w3ODV0cwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi93ODNsNzg1dHMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDY4NzUgYi9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9tYXg2ODc1CmluZGV4IGI0ZmI0OWIuLmIwMjAwMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDY4NzUKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4Njg3NQpAQCAtMiwxMCArMiwxMCBAQAogPT09PT09PT09PT09PT09PT09PT09CiAKIFN1cHBvcnRlZCBjaGlwczoKLSAgKiBNYXhpbSBtYXg2ODc0LCBtYXg2ODc1Ci0gICAgUHJlZml4ZXM6ICdtYXg2ODc1JworICAqIE1heGltIE1BWDY4NzQsIE1BWDY4NzUKKyAgICBQcmVmaXg6ICdtYXg2ODc1JwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiAweDUwLCAweDUyCi0gICAgRGF0YXNoZWV0czoKKyAgICBEYXRhc2hlZXQ6CiAgICAgICAgIGh0dHA6Ly9wZGZzZXJ2Lm1heGltLWljLmNvbS9lbi9kcy9NQVg2ODc0LU1BWDY4NzUucGRmCiAKIEF1dGhvcjogQmVuIEdhcmRuZXIgPGJnYXJkbmVyQHdhYnRlYy5jb20+CkBAIC0yMywxNCArMjMsMjYgQEAKIERlc2NyaXB0aW9uCiAtLS0tLS0tLS0tLQogCi1UaGUgTUFYSU0gbWF4Njg3NSBpcyBhIEVFUFJPTS1wcm9ncmFtbWFibGUgcG93ZXItc3VwcGx5IHNlcXVlbmNlci9zdXBlcnZpc29yLgorVGhlIE1heGltIE1BWDY4NzUgaXMgYW4gRUVQUk9NLXByb2dyYW1tYWJsZSBwb3dlci1zdXBwbHkgc2VxdWVuY2VyL3N1cGVydmlzb3IuCiBJdCBwcm92aWRlcyB0aW1lZCBvdXRwdXRzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSB3YXRjaGRvZywgaWYgcHJvcGVybHkgd2lyZWQuCiBJdCBhbHNvIHByb3ZpZGVzIDUxMiBieXRlcyBvZiB1c2VyIEVFUFJPTS4KIAotQXQgcmVzZXQsIHRoZSBtYXg2ODc1IHJlYWRzIHRoZSBjb25maWd1cmF0aW9uIGVlcHJvbSBpbnRvIGl0cyBjb25maWd1cmF0aW9uCitBdCByZXNldCwgdGhlIE1BWDY4NzUgcmVhZHMgdGhlIGNvbmZpZ3VyYXRpb24gRUVQUk9NIGludG8gaXRzIGNvbmZpZ3VyYXRpb24KIHJlZ2lzdGVycy4gIFRoZSBjaGlwIHRoZW4gYmVnaW5zIHRvIG9wZXJhdGUgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZXMgaW4gdGhlCiByZWdpc3RlcnMuCiAKK1RoZSBNYXhpbSBNQVg2ODc0IGlzIGEgc2ltaWxhciwgbW9zdGx5IGNvbXBhdGlibGUgZGV2aWNlLCB3aXRoIG1vcmUgaW50cHV0cworYW5kIG91dHB1dHM6CisKKyAgICAgICAgICAgICB2aW4gICAgIGdwaSAgICB2b3V0CitNQVg2ODc0ICAgICAgICA2ICAgICAgIDQgICAgICAgOAorTUFYNjg3NSAgICAgICAgNCAgICAgICAzICAgICAgIDUKKworTUFYNjg3NCBjaGlwcyBjYW4gaGF2ZSBmb3VyIGRpZmZlcmVudCBhZGRyZXNzZXMgKGFzIG9wcG9zZWQgdG8gb25seSB0d28gZm9yCit0aGUgTUFYNjg3NSkuIFRoZSBhZGRpdGlvbmFsIGFkZHJlc3NlcyAoMHg1NCBhbmQgMHg1NikgYXJlIG5vdCBwcm9iZWQgYnkKK3RoaXMgZHJpdmVyIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgcHJvYmUgbW9kdWxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCBpZgorbmVlZGVkLgorCiBTZWUgdGhlIGRhdGFzaGVldCBmb3IgZGV0YWlscyBvbiBob3cgdG8gcHJvZ3JhbSB0aGUgRUVQUk9NLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2kyYy9kZXYtaW50ZXJmYWNlCmluZGV4IDA5ZDZjZGEuLmI4NDlhZDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2UKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvZGV2LWludGVyZmFjZQpAQCAtMTQsOSArMTQsMTIgQEAKID09PT09PT09PQogCiBTbyBsZXQncyBzYXkgeW91IHdhbnQgdG8gYWNjZXNzIGFuIGkyYyBhZGFwdGVyIGZyb20gYSBDIHByb2dyYW0uIFRoZQotZmlyc3QgdGhpbmcgdG8gZG8gaXMgYCNpbmNsdWRlIDxsaW51eC9pMmMuaD4iIGFuZCAiI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4uIAotWWVzLCBJIGtub3csIHlvdSBzaG91bGQgbmV2ZXIgaW5jbHVkZSBrZXJuZWwgaGVhZGVyIGZpbGVzLCBidXQgdW50aWwgZ2xpYmMgCi1rbm93cyBhYm91dCBpMmMsIHRoZXJlIGlzIG5vdCBtdWNoIGNob2ljZS4KK2ZpcnN0IHRoaW5nIHRvIGRvIGlzICIjaW5jbHVkZSA8bGludXgvaTJjLWRldi5oPiIuIFBsZWFzZSBub3RlIHRoYXQKK3RoZXJlIGFyZSB0d28gZmlsZXMgbmFtZWQgImkyYy1kZXYuaCIgb3V0IHRoZXJlLCBvbmUgaXMgZGlzdHJpYnV0ZWQKK3dpdGggdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWVhbnQgdG8gYmUgaW5jbHVkZWQgZnJvbSBrZXJuZWwKK2RyaXZlciBjb2RlLCB0aGUgb3RoZXIgb25lIGlzIGRpc3RyaWJ1dGVkIHdpdGggbG1fc2Vuc29ycyBhbmQgaXMKK21lYW50IHRvIGJlIGluY2x1ZGVkIGZyb20gdXNlci1zcGFjZSBwcm9ncmFtcy4gWW91IG9idmlvdXNseSB3YW50Cit0aGUgc2Vjb25kIG9uZSBoZXJlLgogCiBOb3csIHlvdSBoYXZlIHRvIGRlY2lkZSB3aGljaCBhZGFwdGVyIHlvdSB3YW50IHRvIGFjY2Vzcy4gWW91IHNob3VsZAogaW5zcGVjdCAvc3lzL2NsYXNzL2kyYy1kZXYvIHRvIGRlY2lkZSB0aGlzLiBBZGFwdGVyIG51bWJlcnMgYXJlIGFzc2lnbmVkCkBAIC03OCw3ICs4MSw3IEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGUgZm9sbG93aW5nIElPQ1RMcyBhcmUgZGVmaW5lZCBhbmQgZnVsbHkgc3VwcG9ydGVkIAotKHNlZSBhbHNvIGkyYy1kZXYuaCBhbmQgaTJjLmgpOgorKHNlZSBhbHNvIGkyYy1kZXYuaCk6CiAKIGlvY3RsKGZpbGUsSTJDX1NMQVZFLGxvbmcgYWRkcikKICAgQ2hhbmdlIHNsYXZlIGFkZHJlc3MuIFRoZSBhZGRyZXNzIGlzIHBhc3NlZCBpbiB0aGUgNyBsb3dlciBiaXRzIG9mIHRoZQpAQCAtOTcsMTAgKzEwMCwxMCBAQAogaW9jdGwoZmlsZSxJMkNfRlVOQ1MsdW5zaWduZWQgbG9uZyAqZnVuY3MpCiAgIEdldHMgdGhlIGFkYXB0ZXIgZnVuY3Rpb25hbGl0eSBhbmQgcHV0cyBpdCBpbiAqZnVuY3MuCiAKLWlvY3RsKGZpbGUsSTJDX1JEV1Isc3RydWN0IGkyY19pb2N0bF9yZHdyX2RhdGEgKm1zZ3NldCkKK2lvY3RsKGZpbGUsSTJDX1JEV1Isc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgKm1zZ3NldCkKIAogICBEbyBjb21iaW5lZCByZWFkL3dyaXRlIHRyYW5zYWN0aW9uIHdpdGhvdXQgc3RvcCBpbiBiZXR3ZWVuLgotICBUaGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGkyY19pb2N0bF9yZHdyX2RhdGEgeworICBUaGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgewogCiAgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnczsgIC8qIHB0ciB0byBhcnJheSBvZiBzaW1wbGUgbWVzc2FnZXMgKi8KICAgICAgIGludCBubXNnczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGV4Y2hhbmdlICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMgYi9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMKaW5kZXggZjQ4MmRhZS4uOTE2NjRiZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cwpAQCAtMjcsNyArMjcsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGZvb19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJGb28gdmVyc2lvbiAyLjMgZHJpdmVyIiwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0ZPTywgLyogZnJvbSBpMmMtaWQuaCwgb3B0aW9uYWwgKi8KIAkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSAmZm9vX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gJmZvb19kZXRhY2hfY2xpZW50LApAQCAtMzcsMTIgKzM2LDYgQEAKIFRoZSBuYW1lIGNhbiBiZSBjaG9zZW4gZnJlZWx5LCBhbmQgbWF5IGJlIHVwdG8gNDAgY2hhcmFjdGVycyBsb25nLiBQbGVhc2UKIHVzZSBzb21ldGhpbmcgZGVzY3JpcHRpdmUgaGVyZS4KIAotSWYgdXNlZCwgdGhlIGlkIHNob3VsZCBiZSBhIHVuaXF1ZSBJRC4gVGhlIHJhbmdlIDB4ZjAwMCB0byAweGZmZmYgaXMKLXJlc2VydmVkIGZvciBsb2NhbCB1c2UsIGFuZCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhvc2UgdW50aWwgeW91IHN0YXJ0Ci1kaXN0cmlidXRpbmcgdGhlIGRyaXZlciwgYXQgd2hpY2ggdGltZSB5b3Ugc2hvdWxkIGNvbnRhY3QgdGhlIGkyYyBhdXRob3JzCi10byBnZXQgeW91ciBvd24gSUQocykuIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSB0aW1lIHlvdSBkb24ndCBuZWVkIGFuIElECi1hdCBhbGwgc28geW91IGNhbiBqdXN0IG9taXQgaXQuCi0KIERvbid0IHdvcnJ5IGFib3V0IHRoZSBmbGFncyBmaWVsZDsganVzdCBwdXQgSTJDX0RGX05PVElGWSBpbnRvIGl0LiBUaGlzCiBtZWFucyB0aGF0IHlvdXIgZHJpdmVyIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBuZXcgYWRhcHRlcnMgYXJlIGZvdW5kLgogVGhpcyBpcyBhbG1vc3QgYWx3YXlzIHdoYXQgeW91IHdhbnQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy50eHQgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0NzUwMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnR4dApAQCAtMCwwICsxLDY5IEBACitVU0VSU1BBQ0UgVkVSQlMgQUNDRVNTCisKKyAgVGhlIGliX3V2ZXJicyBtb2R1bGUsIGJ1aWx0IGJ5IGVuYWJsaW5nIENPTkZJR19JTkZJTklCQU5EX1VTRVJfVkVSQlMsCisgIGVuYWJsZXMgZGlyZWN0IHVzZXJzcGFjZSBhY2Nlc3MgdG8gSUIgaGFyZHdhcmUgdmlhICJ2ZXJicywiIGFzCisgIGRlc2NyaWJlZCBpbiBjaGFwdGVyIDExIG9mIHRoZSBJbmZpbmlCYW5kIEFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uLgorCisgIFRvIHVzZSB0aGUgdmVyYnMsIHRoZSBsaWJpYnZlcmJzIGxpYnJhcnksIGF2YWlsYWJsZSBmcm9tCisgIDxodHRwOi8vb3BlbmliLm9yZy8+LCBpcyByZXF1aXJlZC4gIGxpYmlidmVyYnMgY29udGFpbnMgYQorICBkZXZpY2UtaW5kZXBlbmRlbnQgQVBJIGZvciB1c2luZyB0aGUgaWJfdXZlcmJzIGludGVyZmFjZS4KKyAgbGliaWJ2ZXJicyBhbHNvIHJlcXVpcmVzIGFwcHJvcHJpYXRlIGRldmljZS1kZXBlbmRlbnQga2VybmVsIGFuZAorICB1c2Vyc3BhY2UgZHJpdmVyIGZvciB5b3VyIEluZmluaUJhbmQgaGFyZHdhcmUuICBGb3IgZXhhbXBsZSwgdG8gdXNlCisgIGEgTWVsbGFub3ggSENBLCB5b3Ugd2lsbCBuZWVkIHRoZSBpYl9tdGhjYSBrZXJuZWwgbW9kdWxlIGFuZCB0aGUKKyAgbGlibXRoY2EgdXNlcnNwYWNlIGRyaXZlciBiZSBpbnN0YWxsZWQuCisKK1VzZXIta2VybmVsIGNvbW11bmljYXRpb24KKworICBVc2Vyc3BhY2UgY29tbXVuaWNhdGVzIHdpdGggdGhlIGtlcm5lbCBmb3Igc2xvdyBwYXRoLCByZXNvdXJjZQorICBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgdmlhIHRoZSAvZGV2L2luZmluaWJhbmQvdXZlcmJzTiBjaGFyYWN0ZXIKKyAgZGV2aWNlcy4gIEZhc3QgcGF0aCBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgcGVyZm9ybWVkIGJ5IHdyaXRpbmcKKyAgZGlyZWN0bHkgdG8gaGFyZHdhcmUgcmVnaXN0ZXJzIG1tYXAoKWVkIGludG8gdXNlcnNwYWNlLCB3aXRoIG5vCisgIHN5c3RlbSBjYWxsIG9yIGNvbnRleHQgc3dpdGNoIGludG8gdGhlIGtlcm5lbC4KKworICBDb21tYW5kcyBhcmUgc2VudCB0byB0aGUga2VybmVsIHZpYSB3cml0ZSgpcyBvbiB0aGVzZSBkZXZpY2UgZmlsZXMuCisgIFRoZSBBQkkgaXMgZGVmaW5lZCBpbiBkcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl91c2VyX3ZlcmJzLmguCisgIFRoZSBzdHJ1Y3RzIGZvciBjb21tYW5kcyB0aGF0IHJlcXVpcmUgYSByZXNwb25zZSBmcm9tIHRoZSBrZXJuZWwKKyAgY29udGFpbiBhIDY0LWJpdCBmaWVsZCB1c2VkIHRvIHBhc3MgYSBwb2ludGVyIHRvIGFuIG91dHB1dCBidWZmZXIuCisgIFN0YXR1cyBpcyByZXR1cm5lZCB0byB1c2Vyc3BhY2UgYXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgd3JpdGUoKQorICBzeXN0ZW0gY2FsbC4KKworUmVzb3VyY2UgbWFuYWdlbWVudAorCisgIFNpbmNlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiBhbGwgSUIgcmVzb3VyY2VzIGlzIGRvbmUgYnkKKyAgY29tbWFuZHMgcGFzc2VkIHRocm91Z2ggYSBmaWxlIGRlc2NyaXB0b3IsIHRoZSBrZXJuZWwgY2FuIGtlZXAgdHJhY2sKKyAgb2Ygd2hpY2ggcmVzb3VyY2VzIGFyZSBhdHRhY2hlZCB0byBhIGdpdmVuIHVzZXJzcGFjZSBjb250ZXh0LiAgVGhlCisgIGliX3V2ZXJicyBtb2R1bGUgbWFpbnRhaW5zIGlkciB0YWJsZXMgdGhhdCBhcmUgdXNlZCB0byB0cmFuc2xhdGUKKyAgYmV0d2VlbiBrZXJuZWwgcG9pbnRlcnMgYW5kIG9wYXF1ZSB1c2Vyc3BhY2UgaGFuZGxlcywgc28gdGhhdCBrZXJuZWwKKyAgcG9pbnRlcnMgYXJlIG5ldmVyIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGFuZCB1c2Vyc3BhY2UgY2Fubm90IHRyaWNrCisgIHRoZSBrZXJuZWwgaW50byBmb2xsb3dpbmcgYSBib2d1cyBwb2ludGVyLgorCisgIFRoaXMgYWxzbyBhbGxvd3MgdGhlIGtlcm5lbCB0byBjbGVhbiB1cCB3aGVuIGEgcHJvY2VzcyBleGl0cyBhbmQKKyAgcHJldmVudCBvbmUgcHJvY2VzcyBmcm9tIHRvdWNoaW5nIGFub3RoZXIgcHJvY2VzcydzIHJlc291cmNlcy4KKworTWVtb3J5IHBpbm5pbmcKKworICBEaXJlY3QgdXNlcnNwYWNlIEkvTyByZXF1aXJlcyB0aGF0IG1lbW9yeSByZWdpb25zIHRoYXQgYXJlIHBvdGVudGlhbAorICBJL08gdGFyZ2V0cyBiZSBrZXB0IHJlc2lkZW50IGF0IHRoZSBzYW1lIHBoeXNpY2FsIGFkZHJlc3MuICBUaGUKKyAgaWJfdXZlcmJzIG1vZHVsZSBtYW5hZ2VzIHBpbm5pbmcgYW5kIHVucGlubmluZyBtZW1vcnkgcmVnaW9ucyB2aWEKKyAgZ2V0X3VzZXJfcGFnZXMoKSBhbmQgcHV0X3BhZ2UoKSBjYWxscy4gIEl0IGFsc28gYWNjb3VudHMgZm9yIHRoZQorICBhbW91bnQgb2YgbWVtb3J5IHBpbm5lZCBpbiB0aGUgcHJvY2VzcydzIGxvY2tlZF92bSwgYW5kIGNoZWNrcyB0aGF0CisgIHVucHJpdmlsZWdlZCBwcm9jZXNzZXMgZG8gbm90IGV4Y2VlZCB0aGVpciBSTElNSVRfTUVNTE9DSyBsaW1pdC4KKworICBQYWdlcyB0aGF0IGFyZSBwaW5uZWQgbXVsdGlwbGUgdGltZXMgYXJlIGNvdW50ZWQgZWFjaCB0aW1lIHRoZXkgYXJlCisgIHBpbm5lZCwgc28gdGhlIHZhbHVlIG9mIGxvY2tlZF92bSBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlIG9mIHRoZQorICBudW1iZXIgb2YgcGFnZXMgcGlubmVkIGJ5IGEgcHJvY2Vzcy4KKworL2RldiBmaWxlcworCisgIFRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY2hhcmFjdGVyIGRldmljZSBmaWxlcyBhdXRvbWF0aWNhbGx5IHdpdGgKKyAgdWRldiwgYSBydWxlIGxpa2UKKworICAgIEtFUk5FTD0idXZlcmJzKiIsIE5BTUU9ImluZmluaWJhbmQvJWsiCisKKyAgY2FuIGJlIHVzZWQuICBUaGlzIHdpbGwgY3JlYXRlIGRldmljZSBub2RlcyBuYW1lZAorCisgICAgL2Rldi9pbmZpbmliYW5kL3V2ZXJiczAKKworICBhbmQgc28gb24uICBTaW5jZSB0aGUgSW5maW5pQmFuZCB1c2Vyc3BhY2UgdmVyYnMgc2hvdWxkIGJlIHNhZmUgZm9yCisgIHVzZSBieSBub24tcHJpdmlsZWdlZCBwcm9jZXNzZXMsIGl0IG1heSBiZSB1c2VmdWwgdG8gYWRkIGFuCisgIGFwcHJvcHJpYXRlIE1PREUgb3IgR1JPVVAgdG8gdGhlIHVkZXYgcnVsZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggNGVjNzVjMC4uYTk5OGE4YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTM3LDcgKzM3LDcgQEAKIAlJQS0zMglJQS0zMiBha2EgaTM4NiBhcmNoaXRlY3R1cmUgaXMgZW5hYmxlZC4KIAlJQS02NAlJQS02NCBhcmNoaXRlY3R1cmUgaXMgZW5hYmxlZC4KIAlJT1NDSEVECU1vcmUgdGhhbiBvbmUgSS9PIHNjaGVkdWxlciBpcyBlbmFibGVkLgotCUlQX1BOUAlJUCBEQ0hQLCBCT09UUCwgb3IgUkFSUCBpcyBlbmFibGVkLgorCUlQX1BOUAlJUCBESENQLCBCT09UUCwgb3IgUkFSUCBpcyBlbmFibGVkLgogCUlTQVBOUAlJU0EgUG5QIGNvZGUgaXMgZW5hYmxlZC4KIAlJU0ROCUFwcHJvcHJpYXRlIElTRE4gc3VwcG9ydCBpcyBlbmFibGVkLgogCUpPWQlBcHByb3ByaWF0ZSBqb3lzdGljayBzdXBwb3J0IGlzIGVuYWJsZWQuCkBAIC03NTgsNiArNzU4LDkgQEAKIAltYXhjcHVzPQlbU01QXSBNYXhpbXVtIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQJYW4gU01QIGtlcm5lbAogCQkJc2hvdWxkIG1ha2UgdXNlIG9mCiAKKwltYXhfYWRkcj1bS01HXQlbS05MLEJPT1QsaWE2NF0gQWxsIHBoeXNpY2FsIG1lbW9yeSBncmVhdGVyIHRoYW4gb3IKKwkJCWVxdWFsIHRvIHRoaXMgcGh5c2ljYWwgYWRkcmVzcyBpcyBpZ25vcmVkLgorCiAJbWF4X2x1bnM9CVtTQ1NJXSBNYXhpbXVtIG51bWJlciBvZiBMVU5zIHRvIHByb2JlCiAJCQlTaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyXjMyLTEuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9maWJfdHJpZS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmliX3RyaWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGQwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmliX3RyaWUudHh0CkBAIC0wLDAgKzEsMTQ1IEBACisJCQlMQy10cmllIGltcGxlbWVudGF0aW9uIG5vdGVzLgorCitOb2RlIHR5cGVzCistLS0tLS0tLS0tCitsZWFmIAorCUFuIGVuZCBub2RlIHdpdGggZGF0YS4gVGhpcyBoYXMgYSBjb3B5IG9mIHRoZSByZWxldmFudCBrZXksIGFsb25nCisJd2l0aCAnaGxpc3QnIHdpdGggcm91dGluZyB0YWJsZSBlbnRyaWVzIHNvcnRlZCBieSBwcmVmaXggbGVuZ3RoLgorCVNlZSBzdHJ1Y3QgbGVhZiBhbmQgc3RydWN0IGxlYWZfaW5mby4KKwordHJpZSBub2RlIG9yIHRub2RlCisJQW4gaW50ZXJuYWwgbm9kZSwgaG9sZGluZyBhbiBhcnJheSBvZiBjaGlsZCAobGVhZiBvciB0bm9kZSkgcG9pbnRlcnMsCisJaW5kZXhlZAl0aHJvdWdoIGEgc3Vic2V0IG9mIHRoZSBrZXkuIFNlZSBMZXZlbCBDb21wcmVzc2lvbi4KKworQSBmZXcgY29uY2VwdHMgZXhwbGFpbmVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JpdHMgKHRub2RlKSAKKwlUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGtleSBzZWdtZW50IHVzZWQgZm9yIGluZGV4aW5nIGludG8gdGhlCisJY2hpbGQgYXJyYXkgLSB0aGUgImNoaWxkIGluZGV4Ii4gU2VlIExldmVsIENvbXByZXNzaW9uLgorCitQb3MgKHRub2RlKQorCVRoZSBwb3NpdGlvbiAoaW4gdGhlIGtleSkgb2YgdGhlIGtleSBzZWdtZW50IHVzZWQgZm9yIGluZGV4aW5nIGludG8KKwl0aGUgY2hpbGQgYXJyYXkuIFNlZSBQYXRoIENvbXByZXNzaW9uLgorCitQYXRoIENvbXByZXNzaW9uIC8gc2tpcHBlZCBiaXRzCisJQW55IGdpdmVuIHRub2RlIGlzIGxpbmtlZCB0byBmcm9tIHRoZSBjaGlsZCBhcnJheSBvZiBpdHMgcGFyZW50LCB1c2luZworCWEgc2VnbWVudCBvZiB0aGUga2V5IHNwZWNpZmllZCBieSB0aGUgcGFyZW50J3MgInBvcyIgYW5kICJiaXRzIiAKKwlJbiBjZXJ0YWluIGNhc2VzLCB0aGlzIHRub2RlJ3Mgb3duICJwb3MiIHdpbGwgbm90IGJlIGltbWVkaWF0ZWx5CisJYWRqYWNlbnQgdG8gdGhlIHBhcmVudCAocG9zK2JpdHMpLCBidXQgdGhlcmUgd2lsbCBiZSBzb21lIGJpdHMKKwlpbiB0aGUga2V5IHNraXBwZWQgb3ZlciBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IGEgc2luZ2xlIHBhdGggd2l0aCBubworCWRldmlhdGlvbnMuIFRoZXNlICJza2lwcGVkIGJpdHMiIGNvbnN0aXR1dGUgUGF0aCBDb21wcmVzc2lvbi4KKwlOb3RlIHRoYXQgdGhlIHNlYXJjaCBhbGdvcml0aG0gd2lsbCBzaW1wbHkgc2tpcCBvdmVyIHRoZXNlIGJpdHMgd2hlbgorCXNlYXJjaGluZywgbWFraW5nIGl0IG5lY2Vzc2FyeSB0byBzYXZlIHRoZSBrZXlzIGluIHRoZSBsZWF2ZXMgdG8KKwl2ZXJpZnkgdGhhdCB0aGV5IGFjdHVhbGx5IGRvIG1hdGNoIHRoZSBrZXkgd2UgYXJlIHNlYXJjaGluZyBmb3IuCisKK0xldmVsIENvbXByZXNzaW9uIC8gY2hpbGQgYXJyYXlzCisJdGhlIHRyaWUgaXMga2VwdCBsZXZlbCBiYWxhbmNlZCBtb3ZpbmcsIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhlCisJY2hpbGRyZW4gb2YgYSBmdWxsIGNoaWxkIChzZWUgImZ1bGxfY2hpbGRyZW4iKSB1cCBvbmUgbGV2ZWwsIHNvIHRoYXQKKwlpbnN0ZWFkIG9mIGEgcHVyZSBiaW5hcnkgdHJlZSwgZWFjaCBpbnRlcm5hbCBub2RlICgidG5vZGUiKSBtYXkKKwljb250YWluIGFuIGFyYml0cmFyaWx5IGxhcmdlIGFycmF5IG9mIGxpbmtzIHRvIHNldmVyYWwgY2hpbGRyZW4uCisJQ29udmVyc2VseSwgYSB0bm9kZSB3aXRoIGEgbW9zdGx5IGVtcHR5CWNoaWxkIGFycmF5IChzZWUgZW1wdHlfY2hpbGRyZW4pCisJbWF5IGJlICJoYWx2ZWQiLCBoYXZpbmcgc29tZSBvZiBpdHMgY2hpbGRyZW4gbW92ZWQgZG93bndhcmRzIG9uZSBsZXZlbCwKKwlpbiBvcmRlciB0byBhdm9pZCBldmVyLWluY3JlYXNpbmcgY2hpbGQgYXJyYXlzLgorCitlbXB0eV9jaGlsZHJlbgorCXRoZSBudW1iZXIgb2YgcG9zaXRpb25zIGluIHRoZSBjaGlsZCBhcnJheSBvZiBhIGdpdmVuIHRub2RlIHRoYXQgYXJlCisJTlVMTC4KKworZnVsbF9jaGlsZHJlbgorCXRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgYSBnaXZlbiB0bm9kZSB0aGF0IGFyZW4ndCBwYXRoIGNvbXByZXNzZWQuCisJKGluIG90aGVyIHdvcmRzLCB0aGV5IGFyZW4ndCBOVUxMIG9yIGxlYXZlcyBhbmQgdGhlaXIgInBvcyIgaXMgZXF1YWwKKwl0byB0aGlzCXRub2RlJ3MgInBvcyIrImJpdHMiKS4KKworCShUaGUgd29yZCAiZnVsbCIgaGVyZSBpcyB1c2VkIG1vcmUgaW4gdGhlIHNlbnNlIG9mICJjb21wbGV0ZSIgdGhhbgorCWFzIHRoZSBvcHBvc2l0ZSBvZiAiZW1wdHkiLCB3aGljaCBtaWdodCBiZSBhIHRhZCBjb25mdXNpbmcuKQorCitDb21tZW50cworLS0tLS0tLS0tCisKK1dlIGhhdmUgdHJpZWQgdG8ga2VlcCB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGFzIGNsb3NlIHRvIGZpYl9oYXNoIGFzIAorcG9zc2libGUgdG8gYWxsb3cgdmVyaWZpY2F0aW9uIGFuZCBoZWxwIHVwIHJldmlld2luZy4gCisKK2ZpYl9maW5kX25vZGUoKQorCUEgZ29vZCBzdGFydCBmb3IgdW5kZXJzdGFuZGluZyB0aGlzIGNvZGUuIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBhCisJc3RyYWlnaHRmb3J3YXJkIHRyaWUgbG9va3VwLgorCitmaWJfaW5zZXJ0X25vZGUoKQorCUluc2VydHMgYSBuZXcgbGVhZiBub2RlIGluIHRoZSB0cmllLiBUaGlzIGlzIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4KKwlmaWJfZmluZF9ub2RlKCkuIEluc2VydGluZyBhIG5ldyBub2RlIG1lYW5zIHdlIG1pZ2h0IGhhdmUgdG8gcnVuIHRoZQorCWxldmVsIGNvbXByZXNzaW9uIGFsZ29yaXRobSBvbiBwYXJ0IG9mIHRoZSB0cmllLgorCit0cmllX2xlYWZfcmVtb3ZlKCkKKwlMb29rcyB1cCBhIGtleSwgZGVsZXRlcyBpdCBhbmQgcnVucyB0aGUgbGV2ZWwgY29tcHJlc3Npb24gYWxnb3JpdGhtLgorCit0cmllX3JlYmFsYW5jZSgpCisJVGhlIGtleSBmdW5jdGlvbiBmb3IgdGhlIGR5bmFtaWMgdHJpZSBhZnRlciBhbnkgY2hhbmdlIGluIHRoZSB0cmllCisJaXQgaXMgcnVuIHRvIG9wdGltaXplIGFuZCByZW9yZ2FuaXplLiBUdCB3aWxsIHdhbGsgdGhlIHRyaWUgdXB3YXJkcyAKKwl0b3dhcmRzIHRoZSByb290IGZyb20gYSBnaXZlbiB0bm9kZSwgZG9pbmcgYSByZXNpemUoKSBhdCBlYWNoIHN0ZXAgCisJdG8gaW1wbGVtZW50IGxldmVsIGNvbXByZXNzaW9uLgorCityZXNpemUoKQorCUFuYWx5emVzIGEgdG5vZGUgYW5kIG9wdGltaXplcyB0aGUgY2hpbGQgYXJyYXkgc2l6ZSBieSBlaXRoZXIgaW5mbGF0aW5nCisJb3Igc2hyaW5raW5nIGl0IHJlcGVhdGVkbHkgdW50aWwgaXQgZnVsbGZpbGxzIHRoZSBjcml0ZXJpYSBmb3Igb3B0aW1hbAorCWxldmVsIGNvbXByZXNzaW9uLiBUaGlzIHBhcnQgZm9sbG93cyB0aGUgb3JpZ2luYWwgcGFwZXIgcHJldHR5IGNsb3NlbHkKKwlhbmQgdGhlcmUgbWF5IGJlIHNvbWUgcm9vbSBmb3IgZXhwZXJpbWVudGF0aW9uIGhlcmUuCisKK2luZmxhdGUoKQorCURvdWJsZXMgdGhlIHNpemUgb2YgdGhlIGNoaWxkIGFycmF5IHdpdGhpbiBhIHRub2RlLiBVc2VkIGJ5IHJlc2l6ZSgpLgorCitoYWx2ZSgpCisJSGFsdmVzIHRoZSBzaXplIG9mIHRoZSBjaGlsZCBhcnJheSB3aXRoaW4gYSB0bm9kZSAtIHRoZSBpbnZlcnNlIG9mCisJaW5mbGF0ZSgpLiBVc2VkIGJ5IHJlc2l6ZSgpOworCitmbl90cmllX2luc2VydCgpLCBmbl90cmllX2RlbGV0ZSgpLCBmbl90cmllX3NlbGVjdF9kZWZhdWx0KCkKKwlUaGUgcm91dGUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4gU2hvdWxkIGNvbmZvcm0gcHJldHR5IGNsb3NlbHkgdG8gdGhlCisJY29ycmVzcG9uZGluZyBmdW5jdGlvbnMgaW4gZmliX2hhc2guCisKK2ZuX3RyaWVfZmx1c2goKQorCVRoaXMgd2Fsa3MgdGhlIGZ1bGwgdHJpZSAodXNpbmcgbmV4dGxlYWYoKSkgYW5kIHNlYXJjaGVzIGZvciBlbXB0eQorCWxlYXZlcyB3aGljaCBoYXZlIHRvIGJlIHJlbW92ZWQuCisKK2ZuX3RyaWVfZHVtcCgpCisJRHVtcHMgdGhlIHJvdXRpbmcgdGFibGUgb3JkZXJlZCBieSBwcmVmaXggbGVuZ3RoLiBUaGlzIGlzIHNvbWV3aGF0CisJc2xvd2VyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgZmliX2hhc2ggZnVuY3Rpb24sIGFzIHdlIGhhdmUgdG8gd2FsayB0aGUKKwllbnRpcmUgdHJpZSBmb3IgZWFjaCBwcmVmaXggbGVuZ3RoLiBJbiBjb21wYXJpc29uLCBmaWJfaGFzaCBpcyBvcmdhbml6ZWQKKwlhcyBvbmUgInpvbmUiL2hhc2ggcGVyIHByZWZpeCBsZW5ndGguCisKK0xvY2tpbmcKKy0tLS0tLS0KKworZmliX2xvY2sgaXMgdXNlZCBmb3IgYW4gUlctbG9jayBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGlzIGlzIGRvbmUgaW4gZmliX2hhc2guCitIb3dldmVyLCB0aGUgZnVuY3Rpb25zIGFyZSBzb21ld2hhdCBzZXBhcmF0ZWQgZm9yIG90aGVyIHBvc3NpYmxlIGxvY2tpbmcKK3NjZW5hcmlvcy4gSXQgbWlnaHQgY29uY2VpdmFibHkgYmUgcG9zc2libGUgdG8gcnVuIHRyaWVfcmViYWxhbmNlIHZpYSBSQ1UKK3RvIGF2b2lkIHJlYWRfbG9jayBpbiB0aGUgZm5fdHJpZV9sb29rdXAoKSBmdW5jdGlvbi4KKworTWFpbiBsb29rdXAgbWVjaGFuaXNtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ZuX3RyaWVfbG9va3VwKCkgaXMgdGhlIG1haW4gbG9va3VwIGZ1bmN0aW9uLgorCitUaGUgbG9va3VwIGlzIGluIGl0cyBzaW1wbGVzdCBmb3JtIGp1c3QgbGlrZSBmaWJfZmluZF9ub2RlKCkuIFdlIGRlc2NlbmQgdGhlCit0cmllLCBrZXkgc2VnbWVudCBieSBrZXkgc2VnbWVudCwgdW50aWwgd2UgZmluZCBhIGxlYWYuIGNoZWNrX2xlYWYoKSBkb2VzCit0aGUgZmliX3NlbWFudGljX21hdGNoIGluIHRoZSBsZWFmJ3Mgc29ydGVkIHByZWZpeCBobGlzdC4KKworSWYgd2UgZmluZCBhIG1hdGNoLCB3ZSBhcmUgZG9uZS4KKworSWYgd2UgZG9uJ3QgZmluZCBhIG1hdGNoLCB3ZSBlbnRlciBwcmVmaXggbWF0Y2hpbmcgbW9kZS4gVGhlIHByZWZpeCBsZW5ndGgsCitzdGFydGluZyBvdXQgYXQgdGhlIHNhbWUgYXMgdGhlIGtleSBsZW5ndGgsIGlzIHJlZHVjZWQgb25lIHN0ZXAgYXQgYSB0aW1lLAorYW5kIHdlIGJhY2t0cmFjayB1cHdhcmRzIHRocm91Z2ggdGhlIHRyaWUgdHJ5aW5nIHRvIGZpbmQgYSBsb25nZXN0IG1hdGNoaW5nCitwcmVmaXguIFRoZSBnb2FsIGlzIGFsd2F5cyB0byByZWFjaCBhIGxlYWYgYW5kIGdldCBhIHBvc2l0aXZlIHJlc3VsdCBmcm9tIHRoZQorZmliX3NlbWFudGljX21hdGNoIG1lY2hhbmlzbS4KKworSW5zaWRlIGVhY2ggdG5vZGUsIHRoZSBzZWFyY2ggZm9yIGxvbmdlc3QgbWF0Y2hpbmcgcHJlZml4IGNvbnNpc3RzIG9mIHNlYXJjaGluZwordGhyb3VnaCB0aGUgY2hpbGQgYXJyYXksIGNob3BwaW5nIG9mZiAoemVyb2luZykgdGhlIGxlYXN0IHNpZ25pZmljYW50ICIxIiBvZgordGhlIGNoaWxkIGluZGV4IHVudGlsIHdlIGZpbmQgYSBtYXRjaCBvciB0aGUgY2hpbGQgaW5kZXggY29uc2lzdHMgb2Ygbm90aGluZyBidXQKK3plcm9zLgorCitBdCB0aGlzIHBvaW50IHdlIGJhY2t0cmFjayAodC0+c3RhdHMuYmFja3RyYWNrKyspIHVwIHRoZSB0cmllLCBjb250aW51aW5nIHRvCitjaG9wIG9mZiBwYXJ0IG9mIHRoZSBrZXkgaW4gb3JkZXIgdG8gZmluZCB0aGUgbG9uZ2VzdCBtYXRjaGluZyBwcmVmaXguCisKK0F0IHRoaXMgcG9pbnQgd2Ugd2lsbCByZXBlYXRlZGx5IGRlc2NlbmQgc3VidHJpZXMgdG8gbG9vayBmb3IgYSBtYXRjaCwgYW5kIHRoZXJlCithcmUgc29tZSBvcHRpbWl6YXRpb25zIGF2YWlsYWJsZSB0aGF0IGNhbiBwcm92aWRlIHVzIHdpdGggInNob3J0Y3V0cyIgdG8gYXZvaWQKK2Rlc2NlbmRpbmcgaW50byBkZWFkIGVuZHMuIExvb2sgZm9yICJITF9PUFRJTUlaRSIgc2VjdGlvbnMgaW4gdGhlIGNvZGUuCisKK1RvIGFsbGV2aWF0ZSBhbnkgZG91YnRzIGFib3V0IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgcm91dGUgc2VsZWN0aW9uIHByb2Nlc3MsCithIG5ldyBuZXRsaW5rIG9wZXJhdGlvbiBoYXMgYmVlbiBhZGRlZC4gTG9vayBmb3IgTkVUTElOS19GSUJfTE9PS1VQLCB3aGljaAorZ2l2ZXMgdXNlcmxhbmQgYWNjZXNzIHRvIGZpYl9sb29rdXAoKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci1jaGFuZ2VzLnR4dCBiL0RvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci1jaGFuZ2VzLnR4dAppbmRleCA5YzMxNWFiLi41OWNjYzYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3BjbWNpYS9kcml2ZXItY2hhbmdlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wY21jaWEvZHJpdmVyLWNoYW5nZXMudHh0CkBAIC0xLDYgKzEsMTMgQEAKIFRoaXMgZmlsZSBkZXRhaWxzIGNoYW5nZXMgaW4gMi42IHdoaWNoIGFmZmVjdCBQQ01DSUEgY2FyZCBkcml2ZXIgYXV0aG9yczoKIAotKiBpbi1rZXJuZWwgZGV2aWNlPC0+ZHJpdmVyIG1hdGNoaW5nCisqIGV2ZW50IGhhbmRsZXIgaW5pdGlhbGl6YXRpb24gaW4gc3RydWN0IHBjbWNpYV9kcml2ZXIgKGFzIG9mIDIuNi4xMykKKyAgIFRoZSBldmVudCBoYW5kbGVyIGlzIG5vdGlmaWVkIG9mIGFsbCBldmVudHMsIGFuZCBtdXN0IGJlIGluaXRpYWxpemVkCisgICBhcyB0aGUgZXZlbnQoKSBjYWxsYmFjayBpbiB0aGUgZHJpdmVyJ3Mgc3RydWN0IHBjbWNpYV9kcml2ZXIuCisKKyogcGNtY2lhL3ZlcnNpb24uaCBzaG91bGQgbm90IGJlIHVzZWQgKGFzIG9mIDIuNi4xMykKKyAgIFRoaXMgZmlsZSB3aWxsIGJlIHJlbW92ZWQgZXZlbnR1YWxseS4KKworKiBpbi1rZXJuZWwgZGV2aWNlPC0+ZHJpdmVyIG1hdGNoaW5nIChhcyBvZiAyLjYuMTMpCiAgICBQQ01DSUEgZGV2aWNlcyBhbmQgdGhlaXIgY29ycmVjdCBkcml2ZXJzIGNhbiBub3cgYmUgbWF0Y2hlZCBpbgogICAga2VybmVsc3BhY2UuIFNlZSAnZGV2aWNldGFibGUudHh0JyBmb3IgZGV0YWlscy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlby50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAppbmRleCA4ODFhMzdlLi43YTRhNTAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dApAQCAtMTE3LDYgKzExNyw3IEBACiBNZWRpb24gTUQ0MjIwCQkJPz8/ICgqKQogU2Ftc3VuZyBQMzUJCQl2YmV0b29sIG5lZWRlZCAoNikKIFNoYXJwIFBDLUFSMTAgKEFUSSByYWdlKQlub25lICgxKQorU29ueSBWYWlvIFBDRy1DMVZSWC9LCQlzM19iaW9zICgyKQogU29ueSBWYWlvIFBDRy1GNDAzCQk/Pz8gKCopCiBTb255IFZhaW8gUENHLU41MDVTTgkJPz8/ICgqKQogU29ueSBWYWlvIHZnbi1zMjYwCQlYIG9yIGJvb3QtcmFkZW9uIGNhbiBpbml0IGl0ICg1KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2Ivc245YzEwMi50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9zbjljMTAyLnR4dAppbmRleCBjZjlhMTE4Li4zZjhhMTE5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9zbjljMTAyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9zbjljMTAyLnR4dApAQCAtMjk3LDYgKzI5Nyw3IEBACiAweDBjNDUgICAgIDB4NjAyYQogMHgwYzQ1ICAgICAweDYwMmIKIDB4MGM0NSAgICAgMHg2MDJjCisweDBjNDUgICAgIDB4NjAyZAogMHgwYzQ1ICAgICAweDYwMzAKIDB4MGM0NSAgICAgMHg2MDgwCiAweDBjNDUgICAgIDB4NjA4MgpAQCAtMzMzLDYgKzMzNCw3IEBACiAtLS0tLSAgICAgICAtLS0tLS0tLS0tLS0KIEhWNzEzMUQgICAgIEh5bml4IFNlbWljb25kdWN0b3IsIEluYy4KIE1JLTAzNDMgICAgIE1pY3JvbiBUZWNobm9sb2d5LCBJbmMuCitPVjc2MzAgICAgICBPbW5pVmlzaW9uIFRlY2hub2xvZ2llcywgSW5jLgogUEFTMTA2QiAgICAgUGl4QXJ0IEltYWdpbmcsIEluYy4KIFBBUzIwMkJDQiAgIFBpeEFydCBJbWFnaW5nLCBJbmMuCiBUQVM1MTEwQzFCICBUYWl3YW4gQWR2YW5jZWQgU2Vuc29yIENvcnBvcmF0aW9uCkBAIC00NzAsOSArNDcyLDExIEBACiAtIEx1Y2EgQ2FwZWxsbyBmb3IgdGhlIGRvbmF0aW9uIG9mIGEgd2ViY2FtOwogLSBKb2FvIFJvZHJpZ28gRnV6YXJvLCBKb2FvIExpbWlyaW8sIENsYXVkaW8gRmlsaG8gYW5kIENhaW8gQmVnb3R0aSBmb3IgdGhlCiAgIGRvbmF0aW9uIG9mIGEgd2ViY2FtOworLSBKb24gSG9sbHN0cm9tIGZvciB0aGUgZG9uYXRpb24gb2YgYSB3ZWJjYW07CiAtIENhcmxvcyBFZHVhcmRvIE1lZGFnbGlhIER5b25pc2lvLCB3aG8gYWRkZWQgdGhlIHN1cHBvcnQgZm9yIHRoZSBQQVMyMDJCQ0IKICAgaW1hZ2Ugc2Vuc29yOwogLSBTdGVmYW5vIE1venppLCB3aG8gZG9uYXRlZCA0NSBFVTsKKy0gQW5kcmV3IFBlYXJjZSBmb3IgdGhlIGRvbmF0aW9uIG9mIGEgd2ViY2FtOwogLSBCZXJ0cmlrIFNpa2tlbiwgd2hvIHJldmVyc2UtZW5naW5lZXJlZCBhbmQgZG9jdW1lbnRlZCB0aGUgSHVmZm1hbiBjb21wcmVzc2lvbgogICBhbGdvcml0aG0gdXNlZCBpbiB0aGUgU045QzEweCBjb250cm9sbGVycyBhbmQgaW1wbGVtZW50ZWQgdGhlIGZpcnN0IGRlY29kZXI7CiAtIE1penVubyBUYWthZnVtaSBmb3IgdGhlIGRvbmF0aW9uIG9mIGEgd2ViY2FtOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvdXNibW9uLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQKaW5kZXggMmY4NDMxZi4uZjE4OTZlZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvdXNibW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0CkBAIC0xMDEsNiArMTAxLDEzIEBACiAgIG9yIDMgYW5kIDIgcG9zaXRpb25zLCBjb3JyZXNwb25kaW5nbHkuCiAtIFVSQiBTdGF0dXMuIFRoaXMgZmllbGQgbWFrZXMgbm8gc2Vuc2UgZm9yIHN1Ym1pc3Npb25zLCBidXQgaXMgcHJlc2VudAogICB0byBoZWxwIHNjcmlwdHMgd2l0aCBwYXJzaW5nLiBJbiBlcnJvciBjYXNlLCBpdCBjb250YWlucyB0aGUgZXJyb3IgY29kZS4KKyAgSW4gY2FzZSBvZiBhIHNldHVwIHBhY2tldCwgaXQgY29udGFpbnMgYSBTZXR1cCBUYWcuIElmIHNjcmlwdHMgcmVhZCBhIG51bWJlcgorICBpbiB0aGlzIGZpZWxkLCB0aGUgcHJvY2VlZCB0byByZWFkIERhdGEgTGVuZ3RoLiBPdGhlcndpc2UsIHRoZXkgcmVhZAorICB0aGUgc2V0dXAgcGFja2V0IGJlZm9yZSByZWFkaW5nIHRoZSBEYXRhIExlbmd0aC4KKy0gU2V0dXAgcGFja2V0LCBpZiBwcmVzZW50LCBjb25zaXN0cyBvZiA1IHdvcmRzOiBvbmUgb2YgZWFjaCBmb3IgYm1SZXF1ZXN0VHlwZSwKKyAgYlJlcXVlc3QsIHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoLCBhcyBzcGVjaWZpZWQgYnkgdGhlIFVTQiBTcGVjaWZpY2F0aW9uIDIuMC4KKyAgVGhlc2Ugd29yZHMgYXJlIHNhZmUgdG8gZGVjb2RlIGlmIFNldHVwIFRhZyB3YXMgJ3MnLiBPdGhlcndpc2UsIHRoZSBzZXR1cAorICBwYWNrZXQgd2FzIHByZXNlbnQsIGJ1dCBub3QgY2FwdHVyZWQsIGFuZCB0aGUgZmllbGRzIGNvbnRhaW4gZmlsbGVyLgogLSBEYXRhIExlbmd0aC4gVGhpcyBpcyB0aGUgYWN0dWFsIGxlbmd0aCBpbiB0aGUgVVJCLgogLSBEYXRhIHRhZy4gVGhlIHVzYm1vbiBtYXkgbm90IGFsd2F5cyBjYXB0dXJlIGRhdGEsIGV2ZW4gaWYgbGVuZ3RoIGlzIG5vbnplcm8uCiAgIE9ubHkgaWYgdGFnIGlzICc9JywgdGhlIGRhdGEgd29yZHMgYXJlIHByZXNlbnQuCkBAIC0xMjUsMjUgKzEzMiwzMSBAQAogCQkJU3RyaW5nIGRhdGFfc3RyID0gc3QubmV4dFRva2VuKCk7CiAJCQlpbnQgbGVuID0gZGF0YV9zdHIubGVuZ3RoKCkgLyAyOwogCQkJaW50IGk7CisJCQlpbnQgYjsJLy8gYnl0ZSBpcyBzaWduZWQsIGFwcGFyZW50bHk/ISBYWFgKIAkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWRhdGFbZGF0YV9sZW5dID0gQnl0ZS5wYXJzZUJ5dGUoCi0JCQkJICAgIGRhdGFfc3RyLnN1YnN0cmluZyhpKjIsIGkqMiArIDIpLAotCQkJCSAgICAxNik7CisJCQkJLy8gZGF0YVtkYXRhX2xlbl0gPSBCeXRlLnBhcnNlQnl0ZSgKKwkJCQkvLyAgICAgZGF0YV9zdHIuc3Vic3RyaW5nKGkqMiwgaSoyICsgMiksCisJCQkJLy8gICAgIDE2KTsKKwkJCQliID0gSW50ZWdlci5wYXJzZUludCgKKwkJCQkgICAgIGRhdGFfc3RyLnN1YnN0cmluZyhpKjIsIGkqMiArIDIpLAorCQkJCSAgICAgMTYpOworCQkJCWlmIChiID49IDEyOCkKKwkJCQkJYiAqPSAtMTsKKwkJCQlkYXRhW2RhdGFfbGVuXSA9IChieXRlKSBiOwogCQkJCWRhdGFfbGVuKys7CiAJCQl9CiAJCX0KIAl9CiB9CiAKLVRoaXMgZm9ybWF0IGlzIG9idmlvdXNseSBkZWZpY2llbnQuIEZvciBleGFtcGxlLCB0aGUgc2V0dXAgcGFja2V0IGZvciBjb250cm9sCi10cmFuc2ZlcnMgaXMgbm90IGRlbGl2ZXJlZC4gVGhpcyB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorVGhpcyBmb3JtYXQgbWF5IGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KIAogRXhhbXBsZXM6CiAKLUFuIGlucHV0IGNvbnRyb2wgdHJhbnNmZXIgdG8gZ2V0IGEgcG9ydCBzdGF0dXM6CitBbiBpbnB1dCBjb250cm9sIHRyYW5zZmVyIHRvIGdldCBhIHBvcnQgc3RhdHVzLgogCi1kNzRmZjlhMCAyNjQwMjg4MTk2IFMgQ2k6MDAxOjAwIC0xMTUgNCA8Ci1kNzRmZjlhMCAyNjQwMjg4MjAyIEMgQ2k6MDAxOjAwIDAgNCA9IDAxMDEwMTAwCitkNWVhODlhMCAzNTc1OTE0NTU1IFMgQ2k6MDAxOjAwIHMgYTMgMDAgMDAwMCAwMDAzIDAwMDQgNCA8CitkNWVhODlhMCAzNTc1OTE0NTYwIEMgQ2k6MDAxOjAwIDAgNCA9IDAxMDUwMDAwCiAKIEFuIG91dHB1dCBidWxrIHRyYW5zZmVyIHRvIHNlbmQgYSBTQ1NJIGNvbW1hbmQgMHg1RSBpbiBhIDMxLWJ5dGUgQnVsayB3cmFwcGVyCiB0byBhIHN0b3JhZ2UgZGV2aWNlIGF0IGFkZHJlc3MgNToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0diBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgppbmRleCBhZWVhZmVjLi42MmExMmEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CkBAIC0xLDQgKzEsNCBAQAotY2FyZD0wIC0gICoqKiBVTktOT1dOL0dFTkVSSUMgKioqIAorY2FyZD0wIC0gICoqKiBVTktOT1dOL0dFTkVSSUMgKioqCiBjYXJkPTEgLSBNSVJPIFBDVFYKIGNhcmQ9MiAtIEhhdXBwYXVnZSAoYnQ4NDgpCiBjYXJkPTMgLSBTVEIsIEdhdGV3YXkgUC9OIDYwMDA2OTkgKGJ0ODQ4KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CmluZGV4IDQzNzdhYTEuLjZkNDQ5NTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKQEAgLTI3LDMgKzI3LDUgQEAKIGNhcmQ9MjYgLSBJT0RBVEEgR1YvQkNUVjdFCiBjYXJkPTI3IC0gUGl4ZWxWaWV3IFBsYXlUViBVbHRyYSBQcm8gKFN0ZXJlbykKIGNhcmQ9MjggLSBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1UCitjYXJkPTI5IC0gQURTIFRlY2ggSW5zdGFudCBUViBEVkItVCBQQ0kKK2NhcmQ9MzAgLSBUZXJyYVRlYyBDaW5lcmd5IDE0MDAgRFZCLVQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAppbmRleCA3MzVlOGJhLi4xYjVhM2E5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CkBAIC0xLDEwICsxLDEwIEBACi0gIDAgLT4gVU5LTk9XTi9HRU5FUklDICAgICAgICAgICAgICAgICAgICAgICAgIAorICAwIC0+IFVOS05PV04vR0VORVJJQwogICAxIC0+IFByb3RldXMgUHJvIFtwaGlsaXBzIHJlZmVyZW5jZSBkZXNpZ25dICAgWzExMzE6MjAwMSwxMTMxOjIwMDFdCiAgIDIgLT4gTGlmZVZpZXcgRmx5VklERU8zMDAwICAgICAgICAgICAgICAgICAgICBbNTE2ODowMTM4LDRlNDI6MDEzOF0KICAgMyAtPiBMaWZlVmlldyBGbHlWSURFTzIwMDAgICAgICAgICAgICAgICAgICAgIFs1MTY4OjAxMzhdCiAgIDQgLT4gRU1QUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTEzMTo2NzUyXQogICA1IC0+IFNLTmV0IE1vbnN0ZXIgVFYgICAgICAgICAgICAgICAgICAgICAgICAgWzExMzE6NGU4NV0KLSAgNiAtPiBUZXZpb24gTUQgOTcxNyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIDYgLT4gVGV2aW9uIE1EIDk3MTcKICAgNyAtPiBLTkMgT25lIFRWLVN0YXRpb24gUkRTIC8gVHlwaG9vbiBUViBUdW5lciBSRFMgWzExMzE6ZmUwMSwxODk0OmZlMDFdCiAgIDggLT4gVGVycmF0ZWMgQ2luZXJneSA0MDAgVFYgICAgICAgICAgICAgICAgICBbMTUzQjoxMTQyXQogICA5IC0+IE1lZGlvbiA1MDQ0CkBAIC0zNCw2ICszNCw3IEBACiAgMzMgLT4gQVZlck1lZGlhIERWRCBFWk1ha2VyICAgICAgICAgICAgICAgICAgICBbMTQ2MToxMGZmXQogIDM0IC0+IE5vdmFsIFByaW1lIFRWIDcxMzMKICAzNSAtPiBBdmVyTWVkaWEgQXZlclRWIFN0dWRpbyAzMDUgICAgICAgICAgICAgIFsxNDYxOjIxMTVdCisgMzYgLT4gVVBNT1NUIFBVUlBMRSBUViAgICAgICAgICAgICAgICAgICAgICAgICBbMTJhYjowODAwXQogIDM3IC0+IEl0ZW1zIE11Y2hUViBQbHVzIC8gSVQtMDA1CiAgMzggLT4gVGVycmF0ZWMgQ2luZXJneSAyMDAgVFYgICAgICAgICAgICAgICAgICBbMTUzQjoxMTUyXQogIDM5IC0+IExpZmVWaWV3IEZseVRWIFBsYXRpbnVtIE1pbmkgICAgICAgICAgICAgWzUxNjg6MDIxMl0KQEAgLTQzLDIwICs0NCwyMSBAQAogIDQzIC0+IDpab2xpZCBYcGVydCBUVjcxMzQKICA0NCAtPiBFbXBpcmUgUENJIFRWLVJhZGlvIExFCiAgNDUgLT4gQXZlcm1lZGlhIEFWZXJUViBTdHVkaW8gMzA3ICAgICAgICAgICAgICBbMTQ2MTo5NzE1XQotIDQ2IC0+IEFWZXJNZWRpYSBDYXJkYnVzIFRWL1JhZGlvICAgICAgICAgICAgICAgWzE0NjE6ZDZlZV0KKyA0NiAtPiBBVmVyTWVkaWEgQ2FyZGJ1cyBUVi9SYWRpbyAoRTUwMCkgICAgICAgIFsxNDYxOmQ2ZWVdCiAgNDcgLT4gVGVycmF0ZWMgQ2luZXJneSA0MDAgbW9iaWxlICAgICAgICAgICAgICBbMTUzYjoxMTYyXQogIDQ4IC0+IFRlcnJhdGVjIENpbmVyZ3kgNjAwIFRWIE1LMyAgICAgICAgICAgICAgWzE1M0I6MTE1OF0KICA0OSAtPiBDb21wcm8gVmlkZW9NYXRlIEdvbGQrIFBhbCAgICAgICAgICAgICAgIFsxODViOmMyMDBdCiAgNTAgLT4gUGlubmFjbGUgUENUViAzMDBpIERWQi1UICsgUEFMICAgICAgICAgICBbMTFiZDowMDJkXQogIDUxIC0+IFByb1ZpZGVvIFBWOTUyICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE1NDA6OTUyNF0KICA1MiAtPiBBdmVyTWVkaWEgQXZlclRWLzMwNSAgICAgICAgICAgICAgICAgICAgIFsxNDYxOjIxMDhdCisgNTMgLT4gQVNVUyBUVi1GTSA3MTM1ICAgICAgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODQ1XQogIDU0IC0+IExpZmVWaWV3IEZseVRWIFBsYXRpbnVtIEZNICAgICAgICAgICAgICAgWzUxNjg6MDIxNCwxNDg5OjAyMTRdCi0gNTUgLT4gTGlmZVZpZXcgRmx5RFZCLVQgRFVPICAgICAgICAgICAgICAgICAgICBbNTE2ODowMzA2XQorIDU1IC0+IExpZmVWaWV3IEZseURWQi1UIERVTyAgICAgICAgICAgICAgICAgICAgWzUxNjg6MDUwMiw1MTY4OjAzMDZdCiAgNTYgLT4gQXZlcm1lZGlhIEFWZXJUViAzMDcgICAgICAgICAgICAgICAgICAgICBbMTQ2MTphNzBhXQogIDU3IC0+IEF2ZXJtZWRpYSBBVmVyVFYgR08gMDA3IEZNICAgICAgICAgICAgICAgWzE0NjE6ZjMxZl0KICA1OCAtPiBBRFMgVGVjaCBJbnN0YW50IFRWIChzYWE3MTM1KSAgICAgICAgICAgIFsxNDIxOjAzNTAsMTQyMTowMzcwXQogIDU5IC0+IEt3b3JsZC9UZXZpb24gVi1TdHJlYW0gWHBlcnQgVFYgUFZSNzEzNAotIDYwIC0+IFR5cGhvb24gRFZCLVQgRHVvIERpZ2l0YWwvQW5hbG9nIENhcmRidXMKLSA2MSAtPiBQaGlsaXBzIFRPVUdIIERWQi1UIHJlZmVyZW5jZSBkZXNpZ24KKyA2MCAtPiBUeXBob29uIERWQi1UIER1byBEaWdpdGFsL0FuYWxvZyBDYXJkYnVzIFs0ZTQyOjA1MDJdCisgNjEgLT4gUGhpbGlwcyBUT1VHSCBEVkItVCByZWZlcmVuY2UgZGVzaWduICAgICBbMTEzMToyMDA0XQogIDYyIC0+IENvbXBybyBWaWRlb01hdGUgVFYgR29sZCtJSQogIDYzIC0+IEt3b3JsZCBYcGVydCBUViBQVlI3MTM0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgppbmRleCBlNzgwMjBmLi5kMWI5ZDIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKQEAgLTU2LDkgKzU2LDkgQEAKIHR1bmVyPTU1IC0gTEcgUEFMIChUQVBFIHNlcmllcykKIHR1bmVyPTU2IC0gUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZRMTIxNkFNRSBNSzQpCiB0dW5lcj01NyAtIFBoaWxpcHMgRlExMjM2QSBNSzQKLXR1bmVyPTU4IC0gWW1lYyBUVmlzaW9uIFRWRi04NTMxTUYKK3R1bmVyPTU4IC0gWW1lYyBUVmlzaW9uIFRWRi04NTMxTUYvODgzMU1GLzg3MzFNRgogdHVuZXI9NTkgLSBZbWVjIFRWaXNpb24gVFZGLTU1MzNNRgogdHVuZXI9NjAgLSBUaG9tc29uIEREVCA3NjExIChBVFNDL05UU0MpCi10dW5lcj02MSAtIFRlbmEgVE5GOTUzMy1EL0lGCit0dW5lcj02MSAtIFRlbmEgVE5GOTUzMy1EL0lGL1RORjk1MzMtQi9ERgogdHVuZXI9NjIgLSBQaGlsaXBzIFRFQTU3NjdITiBGTSBSYWRpbwogdHVuZXI9NjMgLSBQaGlsaXBzIEZNRDEyMTZNRSBNSzMgSHlicmlkIFR1bmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ2FyZHMgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ2FyZHMKaW5kZXggN2Y4YzdlYi4uOGYxOTQxZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NhcmRzCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9DYXJkcwpAQCAtMjAsNyArMjAsNyBAQAogZGVjb2RlcnMsIEVFUFJPTXMsIHRlbGV0ZXh0IGRlY29kZXJzIC4uLgogCiAKLVVuc3VwcG9ydGVkIENhcmRzOiAKK1Vuc3VwcG9ydGVkIENhcmRzOgogLS0tLS0tLS0tLS0tLS0tLS0tCiAKIENhcmRzIHdpdGggWm9yYW4gKFpSKSBvciBQaGlsaXBzIChTQUEpIG9yIElTQSBhcmUgbm90IHN1cHBvcnRlZCBieQpAQCAtNTAsMTEgKzUwLDExIEBACiBNaXJvL1Bpbm5hY2xlIFBDVFYKIC0tLS0tLS0tLS0tLS0tLS0tLQogCi0tIEJ0ODQ4IAotICBzb21lIChhbGw/PykgY29tZSB3aXRoIDIgY3J5c3RhbHMgZm9yIFBBTC9TRUNBTSBhbmQgTlRTQyAKKy0gQnQ4NDgKKyAgc29tZSAoYWxsPz8pIGNvbWUgd2l0aCAyIGNyeXN0YWxzIGZvciBQQUwvU0VDQU0gYW5kIE5UU0MKIC0gUEFMLCBTRUNBTSBvciBOVFNDIFRWIHR1bmVyIChQaGlsaXBzIG9yIFRFTUlDKQogLSBNU1AzNHh4IHNvdW5kIGRlY29kZXIgb24gYWRkIG9uIGJvYXJkCi0gIGRlY29kZXIgaXMgc3VwcG9ydGVkIGJ1dCBBRkFJSyBkb2VzIG5vdCB5ZXQgd29yayAKKyAgZGVjb2RlciBpcyBzdXBwb3J0ZWQgYnV0IEFGQUlLIGRvZXMgbm90IHlldCB3b3JrCiAgIChvdGhlciBzb3VuZCBNVVggc2V0dGluZyBpbiBHUElPIHBvcnQgbmVlZGVkPz8/IHNvbWVib2R5IHdobyBmaXhlZCB0aGlzPz8/KQogLSAxIHR1bmVyLCAxIGNvbXBvc2l0ZSBhbmQgMSBTLVZIUyBpbnB1dAogLSB0dW5lciB0eXBlIGlzIGF1dG9kZXRlY3RlZApAQCAtNzAsNyArNzAsNyBAQAogSGF1cHBhdWdlIFdpbi9UViBwY2kKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgSGF1cHBhdWdlIGNhcmRzIHdpdGggZGlmZmVyZW50IAorVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBIYXVwcGF1Z2UgY2FyZHMgd2l0aCBkaWZmZXJlbnQKIHR1bmVycyAoVFYrUmFkaW8gLi4uKSwgdGVsZXRleHQgZGVjb2RlcnMuCiBOb3RlIHRoYXQgZXZlbiBjYXJkcyB3aXRoIHNhbWUgbW9kZWwgbnVtYmVycyBoYXZlIChkZXBlbmRpbmcgb24gdGhlIHJldmlzaW9uKQogZGlmZmVyZW50IGNoaXBzIG9uIGl0LgpAQCAtODAsMjIgKzgwLDIyIEBACiAtIFBBTCwgU0VDQU0sIE5UU0Mgb3IgdHVuZXIgd2l0aCBvciB3aXRob3V0IFJhZGlvIHN1cHBvcnQKIAogZS5nLjoKLSAgUEFMOiAKKyAgUEFMOgogICBUREE1NzM3OiBWSEYsIGh5cGVyYmFuZCBhbmQgVUhGIG1peGVyL29zY2lsbGF0b3IgZm9yIFRWIGFuZCBWQ1IgMy1iYW5kIHR1bmVycwogICBUU0E1NTIyOiAxLjQgR0h6IEkyQy1idXMgY29udHJvbGxlZCBzeW50aGVzaXplciwgSTJDIDB4YzItMHhjMwotICAKKwogICBOVFNDOgogICBUREE1NzMxOiBWSEYsIGh5cGVyYmFuZCBhbmQgVUhGIG1peGVyL29zY2lsbGF0b3IgZm9yIFRWIGFuZCBWQ1IgMy1iYW5kIHR1bmVycwogICBUU0E1NTE4OiBubyBkYXRhc2hlZXQgYXZhaWxhYmxlIG9uIFBoaWxpcHMgc2l0ZQotLSBQaGlsaXBzIFNBQTUyNDYgb3IgU0FBNTI4NCAoIG9yIG5vKSBUZWxldGV4dCBkZWNvZGVyIGNoaXAJCistIFBoaWxpcHMgU0FBNTI0NiBvciBTQUE1Mjg0ICggb3Igbm8pIFRlbGV0ZXh0IGRlY29kZXIgY2hpcAogICB3aXRoIGJ1ZmZlciBSQU0gKGUuZy4gV2luYm9uZCBXMjQyNTdBUy0zNTogMzJLeDggQ01PUyBzdGF0aWMgUkFNKQogICBTQUE1MjQ2IChJMkMgMHgyMikgaXMgc3VwcG9ydGVkCi0tIDI1NiBieXRlcyBFRVBST006IE1pY3JvY2hpcCAyNExDMDJCIG9yIFBoaWxpcHMgODU4MkUyWSAKKy0gMjU2IGJ5dGVzIEVFUFJPTTogTWljcm9jaGlwIDI0TEMwMkIgb3IgUGhpbGlwcyA4NTgyRTJZCiAgIHdpdGggY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgogICBJMkMgYWRkcmVzcyAweGEwICgyNExDMDJCIGFsc28gcmVzcG9uZHMgdG8gMHhhMi0weGFmKQogLSAxIHR1bmVyLCAxIGNvbXBvc2l0ZSBhbmQgKGRlcGVuZGluZyBvbiBtb2RlbCkgMSBTLVZIUyBpbnB1dAogLSAxNDA1MkI6IG11eCBmb3Igc2VsZWN0aW9uIG9mIHNvdW5kIHNvdXJjZQotLSBzb3VuZCBkZWNvZGVyOiBUREE5ODAwLCBNU1AzNHh4IChzdGVyZW8gY2FyZHMpIAorLSBzb3VuZCBkZWNvZGVyOiBUREE5ODAwLCBNU1AzNHh4IChzdGVyZW8gY2FyZHMpCiAKIAogQXNrZXkgQ1BILVNlcmllcwpAQCAtMTA4LDE3ICsxMDgsMTcgQEAKICAgICBDUEgwNXg6IEJUODc4IHdpdGggRk0KICAgICBDUEgwNng6IEJUODc4ICh3L28gRk0pCiAgICAgQ1BIMDd4OiBCVDg3OCBjYXB0dXJlIG9ubHkKLSAKKwogICBUViBzdGFuZGFyZHM6CiAgICAgIENQSDB4MDogTlRTQy1NL00KICAgICAgQ1BIMHgxOiBQQUwtQi9HCiAgICAgIENQSDB4MjogUEFMLUkvSQogICAgICBDUEgweDM6IFBBTC1EL0sKLSAgICAgQ1BIMHg0OiBTRUNBTS1ML0wgCi0gICAgIENQSDB4NTogU0VDQU0tQi9HIAotICAgICBDUEgweDY6IFNFQ0FNLUQvSyAKLSAgICAgQ1BIMHg3OiBQQUwtTi9OIAotICAgICBDUEgweDg6IFBBTC1CL0ggCisgICAgIENQSDB4NDogU0VDQU0tTC9MCisgICAgIENQSDB4NTogU0VDQU0tQi9HCisgICAgIENQSDB4NjogU0VDQU0tRC9LCisgICAgIENQSDB4NzogUEFMLU4vTgorICAgICBDUEgweDg6IFBBTC1CL0gKICAgICAgQ1BIMHg5OiBQQUwtTS9NCiAKICAgQ1BIMDN4IHdhcyBvZnRlbiBzb2xkIGFzICJUViBjYXB0dXJlciIuCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICAgICJUaGUgRmx5VmlkZW8yMDAwIGFuZCBGbHlWaWRlbzIwMDBzIHByb2R1Y3QgbmFtZSBoYXZlIHJlbmFtZWQgdG8gRmx5VmlkZW85OC4iCiAgICAgICBUaGVpciBCdDh4OCBjYXJkcyBhcmUgbGlzdGVkIGFzIGRpc2NvbnRpbnVlZC4KICAgICAgIEZseXZpZGVvIDIwMDBTIHdhcyBwcm9iYWJseSBzb2xkIGFzIEZseXZpZGVvIDMwMDAgaW4gc29tZSBjb250cmllcyhFdXJvcGU/KS4KLSAgICAgIFRoZSBuZXcgRmx5dmlkZW8gMjAwMC8zMDAwIGFyZSBTQUE3MTMwL1NBQTcxMzQgYmFzZWQuIAorICAgICAgVGhlIG5ldyBGbHl2aWRlbyAyMDAwLzMwMDAgYXJlIFNBQTcxMzAvU0FBNzEzNCBiYXNlZC4KIAogICAiRmx5dmlkZW8gSUkiIGhhZCBiZWVuIHRoZSBuYW1lIGZvciB0aGUgODQ4IGNhcmRzLCBub3dhZGF5cyAoaW4gR2VybWFueSkKICAgdGhpcyBuYW1lIGlzIHJlLXVzZWQgZm9yIExSNTAgUmV2LlcuCkBAIC0yMzUsMTIgKzIzNSwxMiBAQAogICAgTXVsdGltZWRpYSBUViBwYWNrYWdlcyAoY2FyZCArIHNvZnR3YXJlIHBhY2spOgogICAgUGl4ZWxWaWV3IFBsYXkgVFYgVGhlYXRlciAtIChNb2RlbDogUFYtTTQyMDApID0gIFBpeGVsVmlldyBQbGF5IFRWIHBybyArIFNvZnR3YXJlCiAgICBQaXhlbFZpZXcgUGxheSBUViBQQUsgLSAgICAgKE1vZGVsOiBQVi1CVDg3OFArIFJFViA0RSkKLSAgIFBpeGVsVmlldyBQbGF5IFRWL1ZDUiAtICAgICAoTW9kZWw6IFBWLU0zMjAwIFJFViA0QyAvIDhEIC8gMTBBICkgCisgICBQaXhlbFZpZXcgUGxheSBUVi9WQ1IgLSAgICAgKE1vZGVsOiBQVi1NMzIwMCBSRVYgNEMgLyA4RCAvIDEwQSApCiAgICBQaXhlbFZpZXcgU3R1ZGlvIFBBSyAtICAgICAgKE1vZGVsOiAgICBNMjIwMCBSRVYgNEMgLyA4RCAvIDEwQSApCiAgICBQaXhlbFZpZXcgUG93ZXJTdHVkaW8gUEFLIC0gKE1vZGVsOiBQVi1NMzYwMCBSRVYgNEUpCiAgICBQaXhlbFZpZXcgRGlnaXRhbFZDUiBQQUsgLSAgKE1vZGVsOiBQVi1NMjQwMCBSRVYgNEMgLyA4RCAvIDEwQSApCiAKLSAgIFBpeGVsVmlldyBQbGF5VFYgUEFLIElJIChUVi9GTSBjYXJkICsgdXNiIGNhbWVyYSkgIFBWLU0zODAwIAorICAgUGl4ZWxWaWV3IFBsYXlUViBQQUsgSUkgKFRWL0ZNIGNhcmQgKyB1c2IgY2FtZXJhKSAgUFYtTTM4MDAKICAgIFBpeGVsVmlldyBQbGF5VFYgWFAgUFYtTTQ3MDAsUFYtTTQ3MDAody9GTSkKICAgIFBpeGVsVmlldyBQbGF5VFYgRFZSIFBWLU00NjAwICBwYWNrYWdlIGNvbnRlbnRzOlBpeGVsVmlldyBQbGF5VFYgcHJvLCB3aW5kdnIgJiB2aWRlb01haWwgcy93CiAKQEAgLTI1NCw3ICsyNTQsNyBAQAogCiAgICBEVFYzMDAwIFBWLURUVjMwMDBQKyBEVkItUyBDSSA9IFR3aW5oYW4gVlAtMTAzMAogICAgRFRWMjAwMCBEVkItUyA9IFR3aW5oYW4gVlAtMTAyMAotICAgCisKICAgIFZpZGVvIENvbmZlcmVuY2luZzoKICAgIFBpeGVsVmlldyBNZWV0aW5nIFBBSyAtIChNb2RlbDogUFYtQlQ4NzhQKQogICAgUGl4ZWxWaWV3IE1lZXRpbmcgUEFLIExpdGUgLSAoTW9kZWw6IFBWLUJUODc4UCkKQEAgLTMwOCw3ICszMDgsNyBAQAogCiAgICBuZXdlciBDYXJkcyBoYXZlIHNhYTcxMzQsIGJ1dCBtb2RlbCBuYW1lIHN0YXllZCB0aGUgc2FtZT8KIAotUHJvdmlkZW8gCitQcm92aWRlbwogLS0tLS0tLS0KICAgUFY5NTEgb3IgUFYtOTUxIChhbHNvIGFyZSBzb2xkIGFzOgogICAgQm9lZGVyIFRWLUZNIFZpZGVvIENhcHR1cmUgQ2FyZApAQCAtMzUzLDcgKzM1Myw3IEBACiAgICBBVmVyVFYKICAgIEFWZXJUViBTdGVyZW8KICAgIEFWZXJUViBTdHVkaW8gKHcvRk0pCi0gICBBVmVyTWVkaWEgVFY5OCB3aXRoIFJlbW90ZSAKKyAgIEFWZXJNZWRpYSBUVjk4IHdpdGggUmVtb3RlCiAgICBBVmVyTWVkaWEgVFYvRk05OCBTdGVyZW8KICAgIEFWZXJNZWRpYSBUVkNBTTk4CiAgICBUVkNhcHR1cmUgKEJ0ODQ4KQpAQCAtMzczLDcgKzM3Myw3IEBACiAgICAoMSkgRGF1Z2h0ZXJib2FyZCBNQjY4LUEgd2l0aCBUREE5ODIwVCBhbmQgVERBOTg0MFQKICAgICgyKSBTb255IE5FNDFTIHNvbGRlcmVkIChzdGVyZW8gc291bmQ/KQogICAgKDMpIERhdWdodGVyYm9hcmQgTTExOC1BIHcvIHBpYyAxNmM1NCBhbmQgNCBNSHogcXVhcnR6Ci0gCisKICAgIFVTIHNpdGUgaGFzIGRpZmZlcmVudCBkcml2ZXJzIGZvciAoYXMgb2YgMDkvMjAwMik6CiAgICBFWiBDYXB0dXJlL0ludGVyQ2FtIFBDSSAoQlQtODQ4IGNoaXApCiAgICBFWiBDYXB0dXJlL0ludGVyQ2FtIFBDSSAoQlQtODc4IGNoaXApCkBAIC00MzcsNyArNDM3LDcgQEAKICAgIFRlcnJhIFRWYWx1ZVJhZGlvLCAgICAgICAgICAgICAiTFIxMDIgUmV2LkMiIHByaW50ZWQgb24gdGhlIFBDQgogICAgVGVycmEgVFYvUmFkaW8rIFZlcnNpb24gMS4wLCAgICI4MC1DUDI4MzAxMDAtMCIgVFRUVjMgcHJpbnRlZCBvbiB0aGUgUENCLAogCQkJCSAgICAgIkNQSDAxMC1FODMiIG9uIHRoZSBiYWNrLCBTQUE2NTg4VCwgVERBOTg3M0gKLSAgIFRlcnJhIFRWYWx1ZSBWZXJzaW9uIEJUODc4LCAgICAiODAtQ1AyODMwMTEwLTAgVFRUVjQiIHByaW50ZWQgb24gdGhlIFBDQiwgCisgICBUZXJyYSBUVmFsdWUgVmVyc2lvbiBCVDg3OCwgICAgIjgwLUNQMjgzMDExMC0wIFRUVFY0IiBwcmludGVkIG9uIHRoZSBQQ0IsCiAJCQkJICAgICAiQ1BIMDExLUQ4MyIgb24gYmFjawogICAgVGVycmEgVFZhbHVlIFZlcnNpb24gMS4wICAgICAgICJjZWIxMDUuUENCIiAocmVhbGx5IGlkZW50aWNhbCB0byBUZXJyYSBUVisgVmVyc2lvbiAxLjApCiAgICBUZXJyYSBUVmFsdWUgTmV3IFJldmlzaW9uCSAgIkxSMTAyIFJlYy5DIgpAQCAtNTI4LDcgKzUyOCw3IEBACiAgICBLVy02MDZSU0YKICAgIEtXLTYwN0EgKGNhcHR1cmUgb25seSkKICAgIEtXLTYwOCAoWm9yYW4gY2FwdHVyZSBvbmx5KQotIAorCiBJT0RBVEEgKGpwKQogLS0tLS0tCiAgICBHVi1CQ1RWL1BDSQpAQCAtNTQyLDE1ICs1NDIsMTUgQEAKIC0tLS0tLS0KICAgIFdpbkRWUgk9IEt3b3JsZCAiS1ctVFZMODc4UkYiCiAKLXd3dy5zaWdtYWNvbS5jby5rciAKK3d3dy5zaWdtYWNvbS5jby5rcgogLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBTaWdtYSBDeWJlciBUViBJSSAKKyAgIFNpZ21hIEN5YmVyIFRWIElJCiAKIHd3dy5zYXNlbS5jby5rcgogLS0tLS0tLS0tLS0tLS0tCiAgICBMaXR0ZSBPbkFpciBUVgogCi1oYW1hIAoraGFtYQogLS0tLQogICAgVFYvUmFkaW8tVHVuZXIgQ2FyZCwgUENJIChNb2RlbCA0NDY3NykgPSBDUEgwNTEKIApAQCAtNjM4LDcgKzYzOCw3IEBACiAKIEpldHdheSAod3d3LmpldHdheS5jb20udHcpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgSlctVFYgODc4TSAKKyAgIEpXLVRWIDg3OE0KICAgIEpXLVRWIDg3OCAgPSBLV29ybGQgS1ctVFY4NzhSRgogCiBHYWxheGlzCkBAIC03MTUsNyArNzE1LDcgQEAKICAgODA5IE15VmlkZW8KICAgODcyIE15VFYyR28gRk0KIAotIAorCiAgIDU0NiBXaW5UViBOb3ZhLVMgQ0kKICAgNTQzIFdpblRWIE5vdmEKICAgOTA3IE5vdmEtUyBVU0IKQEAgLTczOSw3ICs3MzksNyBAQAogICA4MzIgTXlUVjJHbwogICA4NjkgTXlUVjJHby1GTQogICA4MDUgTXlWaWRlbyAoVVNCKQotICAKKwogCiBNYXRyaXgtVmlzaW9uCiAtLS0tLS0tLS0tLS0tCkBAIC03NjQsNyArNzY0LDcgQEAKICAgIEludGVydmlzaW9uIElWLTU1MCAoYnQ4eDgpCiAgICBJbnRlcnZpc2lvbiBJVi0xMDAgKHpvcmFuKQogICAgSW50ZXJ2aXNpb24gSVYtMTAwMCAoYnQ4eDgpCi0gICAKKwogQXNvbmljICh3d3cuYXNvbmljLmNvbS5jbikgKHdlYnNpdGUgZG93bikKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTa3lFeWUgdHYgODc4CkBAIC04MDQsMTEgKzgwNCwxMSBAQAogCiBKVFQvIEp1c3R5IENvcnAuaHR0cDovL3d3dy5qdXN0eS5jby5qcC8gKHd3dy5qdHQuY29tLmpwIHdlYnNpdGUgZG93bikKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgSlRULTAyIChKVFQgVFYpICJUViB3YXRjaG1hdGUgcHJvIiAoYnQ4NDgpIAorICAgSlRULTAyIChKVFQgVFYpICJUViB3YXRjaG1hdGUgcHJvIiAoYnQ4NDgpCiAKIEFEUyB3d3cuYWRzdGVjaC5jb20KIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIENoYW5uZWwgU3VyZmVyIFRWICggQ0hYLTk1MCApIAorICAgQ2hhbm5lbCBTdXJmZXIgVFYgKCBDSFgtOTUwICkKICAgIENoYW5uZWwgU3VyZmVyIFRWK0ZNICggQ0hYLTk2MEZNICkKIAogQVZFQyB3d3cucHJvY2hpcHMuY29tCkBAIC04NzQsNyArODc0LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmFsY29uIFNlcmllcyAoY2FwdHVyZSBvbmx5KQogIEluIFVTQTogaHR0cDovL3d3dy50aGVpbWFnaW5nc291cmNlLmNvbS8KLSAgIERGRy9MQzEJCisgICBERkcvTEMxCiAKIHd3dy5za25ldC13ZWIuY28uanAKIC0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTg5MCw3ICs4OTAsNyBAQAogICAgQ3liZXJNYWlsIFh0cmVtZQogICBUaGVzZSBhcmUgRmx5dmlkZW8KIAotVkNSIChodHRwOi8vd3d3LnZjcmluYy5jb20vKSAKK1ZDUiAoaHR0cDovL3d3dy52Y3JpbmMuY29tLykKIC0tLQogICBWaWRlbyBDYXRjaGVyIDE2CiAKQEAgLTkyMCw3ICs5MjAsNyBAQAogICAgIFNESSBTaWxrIDIwMCBTREkgSW5wdXQgQ2FyZAogCiB3d3cuZXVyZXN5cy5jb20KLSAgICBQSUNPTE8gc2VyaWVzIAorICAgIFBJQ09MTyBzZXJpZXMKIAogUE1DL1BhY2UKIHd3dy5wYWNlY29tLmNvLnVrIHdlYnNpdGUgY2xvc2VkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L25vdC1pbi1jeDIzODh4LWRhdGFzaGVldC50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L25vdC1pbi1jeDIzODh4LWRhdGFzaGVldC50eHQKaW5kZXggOTZiNjM4Yi4uZWRiZmU3NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ub3QtaW4tY3gyMzg4eC1kYXRhc2hlZXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvbm90LWluLWN4MjM4OHgtZGF0YXNoZWV0LnR4dApAQCAtMzQsNCArMzQsOCBAQAogICAyOiBIQUNURVhUCiAgIDE6IEhTRk1UCiAKKzB4NDcgaXMgdGhlIHN5bmMgYnl0ZSBmb3IgTVBFRy0yIHRyYW5zcG9ydCBzdHJlYW0gcGFja2V0cy4KK0RhdGFzaGVldCBpbmNvcnJlY3RseSBzdGF0ZXMgdG8gdXNlIDQ3IGRlY2ltYWwuIDE4OCBpcyB0aGUgbGVuZ3RoLgorQWxsIERWQiBjb21wbGlhbnQgZnJvbnRlbmRzIG91dHB1dCBwYWNrZXRzIHdpdGggdGhpcyBzdGFydCBjb2RlLgorCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMTlhOWExYy4uNWQwMTQ3MiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTM3MCw2ICszNzAsMTAgQEAKIFc6CWh0dHA6Ly9hdG1lbHdsYW5kcml2ZXIuc291cmNlZm9yZ2UubmV0LwogUzoJTWFpbnRhaW5lZAogCitBVURJVCBTVUJTWVNURU0KK0w6CWxpbnV4LWF1ZGl0QHJlZGhhdC5jb20gKHN1YnNjcmliZXJzLW9ubHkpCitTOglNYWludGFpbmVkCisKIEFYLjI1IE5FVFdPUksgTEFZRVIKIFA6CVJhbGYgQmFlY2hsZQogTToJcmFsZkBsaW51eC1taXBzLm9yZwpAQCAtMTIzNiw3ICsxMjQwLDcgQEAKIAogSVJEQSBTVUJTWVNURU0KIFA6CUplYW4gVG91cnJpbGhlcwotTDoJaXJkYS11c2Vyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0w6CWlyZGEtdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpYmVycy1vbmx5KQogVzoJaHR0cDovL2lyZGEuc291cmNlZm9yZ2UubmV0LwogUzoJTWFpbnRhaW5lZAogCkBAIC0xODAzLDggKzE4MDcsOSBAQAogUzoJTWFpbnRhaW5lZAogCiBQQ01DSUEgU1VCU1lTVEVNCitQOglMaW51eCBQQ01DSUEgVGVhbQogTDoJaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1wY21jaWEKLVM6CVVubWFpbnRhaW5lZAorUzoJTWFpbnRhaW5lZAogCiBQQ05FVDMyIE5FVFdPUksgRFJJVkVSCiBQOglUaG9tYXMgQm9nZW5k9nJmZXIKQEAgLTIxNjEsNyArMjE2Niw3IEBACiBQOglEYXZpZCBTLiBNaWxsZXIKIE06CWRhdmVtQGRhdmVtbG9mdC5uZXQKIFA6CUVkZGllIEMuIERvc3QKLU06CWVjZEBza3luZXQuYmUKK006CWVjZEBicmFpbmFpZC5kZQogUDoJSmFrdWIgSmVsaW5lawogTToJampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jegogUDoJQW50b24gQmxhbmNoYXJkCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDc3YWFiN2IuLmNmMzRhNmIgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDIKIFBBVENITEVWRUwgPSA2CiBTVUJMRVZFTCA9IDEzCi1FWFRSQVZFUlNJT04gPS1yYzEKK0VYVFJBVkVSU0lPTiA9LXJjMwogTkFNRT1Xb296eSBOdW1iYXQKIAogIyAqRE9DVU1FTlRBVElPTioKQEAgLTc5Miw2ICs3OTIsOSBAQAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoQEQpICRACiAlLm86ICUuYyBzY3JpcHRzIEZPUkNFCiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChARCkgJEAKKyUua286IHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSBLQlVJTERfTU9EVUxFUz0kKGlmICQoQ09ORklHX01PRFVMRVMpLDEpICQoYnVpbGQpPSQoQEQpICQoQDoua289Lm8pCisJJChRKSQoTUFLRSkgLXJSIC1mICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CiAlLzogICAgICBzY3JpcHRzIHByZXBhcmUgRk9SQ0UKIAkkKFEpJChNQUtFKSBLQlVJTERfTU9EVUxFUz0kKGlmICQoQ09ORklHX01PRFVMRVMpLDEpICQoYnVpbGQpPSQoQEQpCiAlLmxzdDogJS5jIHNjcmlwdHMgRk9SQ0UKQEAgLTEwMzMsNiArMTAzNiw3IEBACiAJQGVjaG8gICcgIG1vZHVsZXNfaW5zdGFsbCAtIEluc3RhbGwgYWxsIG1vZHVsZXMnCiAJQGVjaG8gICcgIGRpci8gICAgICAgICAgICAtIEJ1aWxkIGFsbCBmaWxlcyBpbiBkaXIgYW5kIGJlbG93JwogCUBlY2hvICAnICBkaXIvZmlsZS5bb2lzXSAgLSBCdWlsZCBzcGVjaWZpZWQgdGFyZ2V0IG9ubHknCisJQGVjaG8gICcgIGRpci9maWxlLmtvICAgICAtIEJ1aWxkIG1vZHVsZSBpbmNsdWRpbmcgZmluYWwgbGluaycKIAlAZWNobyAgJyAgcnBtCQkgIC0gQnVpbGQgYSBrZXJuZWwgYXMgYW4gUlBNIHBhY2thZ2UnCiAJQGVjaG8gICcgIHRhZ3MvVEFHUwkgIC0gR2VuZXJhdGUgdGFncyBmaWxlIGZvciBlZGl0b3JzJwogCUBlY2hvICAnICBjc2NvcGUJICAtIEdlbmVyYXRlIGNzY29wZSBpbmRleCcKQEAgLTExNDksNyArMTE1Myw3IEBACiAjKHdoaWNoIGlzIHRoZSBtb3N0IGNvbW1vbiBjYXNlIElNSE8pIHRvIGF2b2lkIHVubmVlZGVkIGNsdXR0ZXIgaW4gdGhlIGJpZyB0YWdzIGZpbGUuCiAjQWRkaW5nICQoc3JjdHJlZSkgYWRkcyBhYm91dCAyME0gb24gaTM4NiB0byB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGZpbGUhCiAKLWlmZXEgKCQoS0JVSUxEX09VVFBVVCksKQoraWZlcSAoJChzcmMpLCQob2JqKSkKIF9fc3JjdHJlZSA9CiBlbHNlCiBfX3NyY3RyZWUgPSAkKHNyY3RyZWUpLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9LY29uZmlnIGIvYXJjaC9hbHBoYS9LY29uZmlnCmluZGV4IGM1NzM5ZDYuLjA4M2M1ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvS2NvbmZpZworKysgYi9hcmNoL2FscGhhL0tjb25maWcKQEAgLTU5Niw2ICs1OTYsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCA2MjBmMmNhLi43YmM0YTU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTIyMyw3ICsyMjMsOSBAQAogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtc2ExMTAwL0tjb25maWciCiAKLXNvdXJjZSAiYXJjaC9hcm0vbWFjaC1vbWFwL0tjb25maWciCitzb3VyY2UgImFyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnIgorCitzb3VyY2UgImFyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZyIKIAogc291cmNlICJhcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZyIKIApAQCAtNTE0LDcgKzUxNiw3IEBACiAKIGVuZG1lbnUKIAotaWYgKEFSQ0hfU0ExMTAwIHx8IEFSQ0hfSU5URUdSQVRPUikKK2lmIChBUkNIX1NBMTEwMCB8fCBBUkNIX0lOVEVHUkFUT1IgfHwgQVJDSF9PTUFQMSkKIAogbWVudSAiQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nIgogCkBAIC02OTgsNiArNzAwLDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBtZW51ICJEZXZpY2UgRHJpdmVycyIKIAogc291cmNlICJkcml2ZXJzL2Jhc2UvS2NvbmZpZyIKQEAgLTczMCw3ICs3MzQsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZyIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKIApAQCAtNzQyLDYgKzc0Niw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9pMmMvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL2h3bW9uL0tjb25maWciCisKICNzb3VyY2UgImRyaXZlcnMvbDMvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL21pc2MvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggZWI5MzNkYy4uNjdmMTQ1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTkxLDcgKzkxLDggQEAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSU9QM1hYKQkgICA6PSBpb3AzeHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSVhQNFhYKQkgICA6PSBpeHA0eHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSVhQMjAwMCkgICAgOj0gaXhwMjAwMAotIG1hY2hpbmUtJChDT05GSUdfQVJDSF9PTUFQKQkgICA6PSBvbWFwCisgbWFjaGluZS0kKENPTkZJR19BUkNIX09NQVAxKQkgICA6PSBvbWFwMQorICBpbmNkaXItJChDT05GSUdfQVJDSF9PTUFQKQkgICA6PSBvbWFwCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX1MzQzI0MTApCSAgIDo9IHMzYzI0MTAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTEg3QTQwWCkJICAgOj0gbGg3YTQweAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9WRVJTQVRJTEUpICA6PSB2ZXJzYXRpbGUKQEAgLTE0Miw2ICsxNDMsOSBAQAogY29yZS0kKENPTkZJR19GUEVfRkFTVEZQRSkJKz0gJChGQVNURlBFX09CSikKIGNvcmUtJChDT05GSUdfVkZQKQkJKz0gYXJjaC9hcm0vdmZwLwogCisjIElmIHdlIGhhdmUgYSBjb21tb24gcGxhdGZvcm0gZGlyZWN0b3J5LCB0aGVuIGluY2x1ZGUgaXQgaW4gdGhlIGJ1aWxkLgorY29yZS0kKENPTkZJR19BUkNIX09NQVApCSs9IGFyY2gvYXJtL3BsYXQtb21hcC8KKwogZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkgICAgICArPSBhcmNoL2FybS9vcHJvZmlsZS8KIGRyaXZlcnMtJChDT05GSUdfQVJDSF9DTFBTNzUwMCkJKz0gZHJpdmVycy9hY29ybi9jaGFyLwogZHJpdmVycy0kKENPTkZJR19BUkNIX0w3MjAwKQkrPSBkcml2ZXJzL2Fjb3JuL2NoYXIvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2VucDI2MTFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9lbnAyNjExX2RlZmNvbmZpZwppbmRleCBiOGM1MWVlLi5mNjdjYTAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2VucDI2MTFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvZW5wMjYxMV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItZ2l0NgotIyBTYXQgSnVuIDI1IDAwOjU3OjI5IDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMy1yYzIKKyMgVGh1IEp1bCAgNyAxNjo0MToyMSAyMDA1CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19NTVU9eQpAQCAtMTM3LDYgKzEzNyw3IEBACiAjCiAjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQpAQCAtMzQ1LDEwICszNDYsOSBAQAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQogQ09ORklHX0lQX1BOUD15CiBDT05GSUdfSVBfUE5QX0RIQ1A9eQogQ09ORklHX0lQX1BOUF9CT09UUD15CkBAIC0zNjMsMTcgKzM2Myw4IEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0KLSMKLSMgVENQIGNvbmdlc3Rpb24gY29udHJvbAotIworIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX1RDUF9DT05HX0JJQz15Ci1DT05GSUdfVENQX0NPTkdfV0VTVFdPT0Q9bQotQ09ORklHX1RDUF9DT05HX0hUQ1A9bQotIyBDT05GSUdfVENQX0NPTkdfSFNUQ1AgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfSFlCTEEgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfVkVHQVMgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC05MzEsNCArOTIyLDMgQEAKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKIENPTkZJR19aTElCX0RFRkxBVEU9eQotIyBDT05GSUdfVEVYVFNFQVJDSCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDBfZGVmY29uZmlnCmluZGV4IDNjZmJlMmUuLjVjNmM5MjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLWdpdDYKLSMgU2F0IEp1biAyNSAwMDo1ODozOCAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtcmMyCisjIFRodSBKdWwgIDcgMTY6NDk6MDEgMjAwNQogIwogQ09ORklHX0FSTT15CiBDT05GSUdfTU1VPXkKQEAgLTEzOCw2ICsxMzgsNyBAQAogIwogIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKQEAgLTM0NiwxMCArMzQ3LDkgQEAKIENPTkZJR19VTklYPXkKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLSMgQ09ORklHX0lQX0ZJQl9UUklFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKIENPTkZJR19JUF9QTlA9eQogQ09ORklHX0lQX1BOUF9ESENQPXkKIENPTkZJR19JUF9QTlBfQk9PVFA9eQpAQCAtMzY0LDE3ICszNjQsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotCi0jCi0jIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wKLSMKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19CSUM9eQotQ09ORklHX1RDUF9DT05HX1dFU1RXT09EPW0KLUNPTkZJR19UQ1BfQ09OR19IVENQPW0KLSMgQ09ORklHX1RDUF9DT05HX0hTVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX0hZQkxBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX1ZFR0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX1NDQUxBQkxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKIApAQCAtOTMyLDQgKzkyMywzIEBACiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfWkxJQl9ERUZMQVRFPXkKLSMgQ09ORklHX1RFWFRTRUFSQ0ggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZwppbmRleCA1Yzg3ZThlLi42ZGM0MGY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1naXQ2Ci0jIFNhdCBKdW4gMjUgMDA6NTk6MzUgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgorIyBUaHUgSnVsICA3IDE2OjQ5OjA4IDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0xMzgsNiArMTM4LDcgQEAKICMKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CkBAIC0zNDYsMTAgKzM0Nyw5IEBACiBDT05GSUdfVU5JWD15CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci0jIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM2NCwxNyArMzY0LDggQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JUF9UQ1BESUFHPXkKICMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0KLSMKLSMgVENQIGNvbmdlc3Rpb24gY29udHJvbAotIworIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX1RDUF9DT05HX0JJQz15Ci1DT05GSUdfVENQX0NPTkdfV0VTVFdPT0Q9bQotQ09ORklHX1RDUF9DT05HX0hUQ1A9bQotIyBDT05GSUdfVENQX0NPTkdfSFNUQ1AgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfSFlCTEEgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfVkVHQVMgaXMgbm90IHNldAotIyBDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC05MzMsNCArOTI0LDMgQEAKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKIENPTkZJR19aTElCX0RFRkxBVEU9eQotIyBDT05GSUdfVEVYVFNFQVJDSCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDBfZGVmY29uZmlnCmluZGV4IDNjYjU2MWEuLmQyYmIwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLWdpdDYKLSMgU2F0IEp1biAyNSAwMTowMDoyNyAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtcmMyCisjIFRodSBKdWwgIDcgMTY6NDk6MjAgMjAwNQogIwogQ09ORklHX0FSTT15CiBDT05GSUdfTU1VPXkKQEAgLTEzOCw2ICsxMzgsNyBAQAogIwogIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKQEAgLTM0NiwxMCArMzQ3LDkgQEAKIENPTkZJR19VTklYPXkKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLSMgQ09ORklHX0lQX0ZJQl9UUklFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKIENPTkZJR19JUF9QTlA9eQogQ09ORklHX0lQX1BOUF9ESENQPXkKIENPTkZJR19JUF9QTlBfQk9PVFA9eQpAQCAtMzY0LDE3ICszNjQsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotCi0jCi0jIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wKLSMKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19CSUM9eQotQ09ORklHX1RDUF9DT05HX1dFU1RXT09EPW0KLUNPTkZJR19UQ1BfQ09OR19IVENQPW0KLSMgQ09ORklHX1RDUF9DT05HX0hTVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX0hZQkxBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX1ZFR0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX1NDQUxBQkxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKIApAQCAtOTMyLDQgKzkyMywzIEBACiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfWkxJQl9ERUZMQVRFPXkKLSMgQ09ORklHX1RFWFRTRUFSQ0ggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZwppbmRleCBiMWUxNjJmLi4yZDZmOTYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1naXQ2Ci0jIFNhdCBKdW4gMjUgMDE6MDE6MTggMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgorIyBUaHUgSnVsICA3IDE2OjQ5OjEzIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0xMzgsNiArMTM4LDcgQEAKICMKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CkBAIC0zNDYsMTAgKzM0Nyw5IEBACiBDT05GSUdfVU5JWD15CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci0jIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM2NCwxNyArMzY0LDggQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLQotIwotIyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCi0jCisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQklDPXkKLUNPTkZJR19UQ1BfQ09OR19XRVNUV09PRD1tCi1DT05GSUdfVENQX0NPTkdfSFRDUD1tCi0jIENPTkZJR19UQ1BfQ09OR19IU1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19IWUJMQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19WRUdBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19TQ0FMQUJMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKQEAgLTkzMyw0ICs5MjQsMyBAQAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQogQ09ORklHX1pMSUJfREVGTEFURT15Ci0jIENPTkZJR19URVhUU0VBUkNIIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZwppbmRleCA0ZTU4ZDkzLi4yNDk1NTI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCkBAIC0xLDE0ICsxLDEzIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgotIyBTdW4gTWFyIDI3IDE3OjUyOjQxIDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMy1yYzIKKyMgRnJpIEp1bCAgOCAwNDo0OTozNCAyMDA1CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1VJRDE2PXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC0xNyw2ICsxNiw3IEBACiBDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CiBDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTMzLDggKzMzLDkgQEAKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKQEAgLTgyLDEwICs4MywyOCBAQAogIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKIAogIwogIyBUSSBPTUFQIEltcGxlbWVudGF0aW9ucwogIworQ09ORklHX0FSQ0hfT01BUF9PVEc9eQorQ09ORklHX0FSQ0hfT01BUDE9eQorIyBDT05GSUdfQVJDSF9PTUFQMiBpcyBub3Qgc2V0CisKKyMKKyMgT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMKKyMKKyMgQ09ORklHX09NQVBfUkVTRVRfQ0xPQ0tTIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX01VWD15CisjIENPTkZJR19PTUFQX01VWF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfT01BUF9NVVhfV0FSTklOR1M9eQorIyBDT05GSUdfT01BUF9NUFVfVElNRVIgaXMgbm90IHNldAorQ09ORklHX09NQVBfMzJLX1RJTUVSPXkKK0NPTkZJR19PTUFQXzMyS19USU1FUl9IWj0xMjgKK0NPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQxPXkKKyMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDIgaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMyBpcyBub3Qgc2V0CiAKICMKICMgT01BUCBDb3JlIFR5cGUKQEAgLTkzLDcgKzExMiw2IEBACiAjIENPTkZJR19BUkNIX09NQVA3MzAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9PTUFQMTUxMCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9PTUFQMTZYWD15Ci1DT05GSUdfQVJDSF9PTUFQX09URz15CiAKICMKICMgT01BUCBCb2FyZCBUeXBlCkBAIC0xMDEsMjEgKzExOSwxNCBAQAogIyBDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfTUFDSF9PTUFQX0gyPXkKICMgQ09ORklHX01BQ0hfT01BUF9IMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX09NQVBfSDQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9PTUFQX09TSyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX09NQVBfR0VORVJJQyBpcyBub3Qgc2V0CiAKICMKLSMgT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMKKyMgT01BUCBDUFUgU3BlZWQKICMKLUNPTkZJR19PTUFQX01VWD15Ci0jIENPTkZJR19PTUFQX01VWF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfT01BUF9NVVhfV0FSTklOR1M9eQotQ09ORklHX09NQVBfTVBVX1RJTUVSPXkKLSMgQ09ORklHX09NQVBfMzJLX1RJTUVSIGlzIG5vdCBzZXQKLUNPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQxPXkKLSMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDIgaXMgbm90IHNldAotIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0NMT0NLU19TRVRfQllfQk9PVExPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0FSTV8yMTZNSFogaXMgbm90IHNldAogQ09ORklHX09NQVBfQVJNXzE5Mk1IWj15CiAjIENPTkZJR19PTUFQX0FSTV8xNjhNSFogaXMgbm90IHNldAogIyBDT05GSUdfT01BUF9BUk1fMTIwTUhaIGlzIG5vdCBzZXQKQEAgLTE0NSw2ICsxNTYsNyBAQAogIwogIyBCdXMgc3VwcG9ydAogIworQ09ORklHX0lTQV9ETUFfQVBJPXkKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CkBAIC0xNTQsNyArMTY2LDE2IEBACiAjCiAjIEtlcm5lbCBGZWF0dXJlcwogIworIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19OT19JRExFX0haPXkKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CiAjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CiAKQEAgLTE2Nyw2ICsxODgsMjIgQEAKICMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAogCiAjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CisjIENPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRSBpcyBub3Qgc2V0CisKKyMKICMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCiAjCiAKQEAgLTIwMiw3ICsyMzksNiBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19EUklWRVI9eQogCiAjCiAjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKQEAgLTI5Miw3ICszMjgsNiBAQAogIwogIyBCbG9jayBkZXZpY2VzCiAjCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKICMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CkBAIC0zMjcsNiArMzYyLDcgQEAKICMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAogCiAjCiAjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwpAQCAtMzU2LDYgKzM5Miw3IEBACiAjCiAjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKICMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CiAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydApAQCAtMzc1LDEyICs0MTIsMTIgQEAKICMKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM5NSw2ICs0MzIsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogQ09ORklHX0lQX1RDUERJQUc9eQogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC00NDIsNiArNDgxLDcgQEAKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01JST15CiBDT05GSUdfU01DOTFYPXkKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKQEAgLTUxOCw3ICs1NTgsNiBAQAogQ09ORklHX1NFUklPX1NFUlBPUlQ9eQogIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15CiAKICMKICMgQ2hhcmFjdGVyIGRldmljZXMKQEAgLTU2NywxMyArNjA2LDExIEBACiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCiAjIFRQTSBkZXZpY2VzCiAjCi0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgc3VwcG9ydApAQCAtNjA0LDcgKzY0MSw5IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CkBAIC02MjAsNiArNjU5LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CkBAIC02MjcsMTUgKzY2NywyMSBAQAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogCiAjCiAjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKICMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CiBDT05GSUdfSVNQMTMwMV9PTUFQPXkKK0NPTkZJR19UUFM2NTAxMD15CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CkBAIC02NjMsOCArNzA5LDEwIEBACiAjIENPTkZJR19GQl9DRkJfQ09QWUFSRUEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TT0ZUX0NVUlNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CiBDT05GSUdfRkJfTU9ERV9IRUxQRVJTPXkKICMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtNjc3LDExICs3MjUsMTMgQEAKIENPTkZJR19GT05UXzh4OD15CiBDT05GSUdfRk9OVF84eDE2PXkKICMgQ09ORklHX0ZPTlRfNngxMSBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UXzd4MTQgaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF9QRUFSTF84eDggaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF9BQ09STl84eDggaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF9NSU5JXzR4NiBpcyBub3Qgc2V0CiAjIENPTkZJR19GT05UX1NVTjh4MTYgaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UXzEweDE4IGlzIG5vdCBzZXQKIAogIwogIyBMb2dvIGNvbmZpZ3VyYXRpb24KQEAgLTcyOSwxNCArNzc5LDE0IEBACiAjCiBDT05GSUdfVVNCX0dBREdFVD15CiAjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKICMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUX1BYQTJYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9TQTExMDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfR0FER0VUX09NQVA9eQogQ09ORklHX1VTQl9PTUFQPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfRFVBTFNQRUVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9aRVJPIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfRVRIPXkKQEAgLTc1NSw2ICs4MDUsNyBAQAogIwogQ09ORklHX0VYVDJfRlM9eQogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CkBAIC03OTEsNyArODQyLDYgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAogIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKQEAgLTgyOCwxMiArODc4LDE0IEBACiAjCiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKICMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogQ09ORklHX1NVTlJQQ19HU1M9eQogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CkBAIC05MDMsMjQgKzk1NSwxMSBAQAogIyBLZXJuZWwgaGFja2luZwogIwogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfUFJFRU1QVD15Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKLUNPTkZJR19ERUJVR19JTkZPPXkKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKLUNPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19FUlJPUlM9eQotQ09ORklHX0RFQlVHX0xMPXkKLSMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYyBiL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCmluZGV4IGI3MTNjNDQuLjgzNWQ0NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCkBAIC00MSw3ICs0MSwxMCBAQAogICogVGhpcyBoYXMgYSBzcGVjaWFsIGNhbGxpbmcgY29udmVudGlvbjsgaXQgZG9lc24ndAogICogbW9kaWZ5IGFueSBvZiB0aGUgdXN1YWwgcmVnaXN0ZXJzLCBleGNlcHQgZm9yIExSLgogICovCisjZGVmaW5lIEVYUE9SVF9DUkNfQUxJQVMoc3ltKSBfX0NSQ19TWU1CT0woc3ltLCAiIikKKwogI2RlZmluZSBFWFBPUlRfU1lNQk9MX0FMSUFTKHN5bSxvcmlnKQkJXAorIEVYUE9SVF9DUkNfQUxJQVMoc3ltKQkJCQlcCiAgY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgX19rc3ltdGFiXyMjc3ltCVwKICAgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX19rc3ltdGFiIikpKSA9CVwKICAgICB7ICh1bnNpZ25lZCBsb25nKSZvcmlnLCAjc3ltIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IDM1YjcyNzMuLmM5YjY5NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC03MzcsOCArNzM3LDggQEAKIAlpZiAobWRlc2MtPnNvZnRfcmVib290KQogCQlyZWJvb3Rfc2V0dXAoInMiKTsKIAotCWlmIChtZGVzYy0+cGFyYW1fb2Zmc2V0KQotCQl0YWdzID0gcGh5c190b192aXJ0KG1kZXNjLT5wYXJhbV9vZmZzZXQpOworCWlmIChtZGVzYy0+Ym9vdF9wYXJhbXMpCisJCXRhZ3MgPSBwaHlzX3RvX3ZpcnQobWRlc2MtPmJvb3RfcGFyYW1zKTsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSB0aGUgb2xkIHN0eWxlIHBhcmFtZXRlcnMsIGNvbnZlcnQgdGhlbSB0bwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IGE5MzE0MDkuLjdhZTQ1YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTM2LDcgKzM2LDcgQEAKICAqIFRoZSBwcmVzZW50IGJpdG1hc2sgaW5kaWNhdGVzIHRoYXQgdGhlIENQVSBpcyBwaHlzaWNhbGx5IHByZXNlbnQuCiAgKiBUaGUgb25saW5lIGJpdG1hc2sgaW5kaWNhdGVzIHRoYXQgdGhlIENQVSBpcyB1cCBhbmQgcnVubmluZy4KICAqLwotY3B1bWFza190IGNwdV9wcmVzZW50X21hc2s7CitjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcDsKIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKIAogLyoKQEAgLTIzNSw3ICsyMzUsOCBAQAogewogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQljcHVfc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFzayk7CisJY3B1X3NldChjcHUsIGNwdV9wb3NzaWJsZV9tYXApOworCWNwdV9zZXQoY3B1LCBjcHVfcHJlc2VudF9tYXApOwogCWNwdV9zZXQoY3B1LCBjcHVfb25saW5lX21hcCk7CiB9CiAKQEAgLTM1NSw3ICszNTYsNyBAQAogCiAJc2VxX3B1dHMocCwgIklQSToiKTsKIAotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkKIAkJc2VxX3ByaW50ZihwLCAiICUxMGx1IiwgcGVyX2NwdShpcGlfZGF0YSwgY3B1KS5pcGlfY291bnQpOwogCiAJc2VxX3B1dGMocCwgJ1xuJyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BsYXRzbXAuYwppbmRleCBlYWQxNWRmLi4yYmEwMjU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wbGF0c21wLmMKQEAgLTE3NCwxMSArMTc0LDEzIEBACiAJCW1heF9jcHVzID0gbmNvcmVzOwogCiAJLyoKLQkgKiBJbml0aWFsaXNlIHRoZSBwcmVzZW50IG1hc2sgLSB0aGlzIHRlbGxzIHVzIHdoaWNoIENQVXMgc2hvdWxkCi0JICogYmUgcHJlc2VudC4KKwkgKiBJbml0aWFsaXNlIHRoZSBwb3NzaWJsZS9wcmVzZW50IG1hcHMuCisJICogY3B1X3Bvc3NpYmxlX21hcCBkZXNjcmliZXMgdGhlIHNldCBvZiBDUFVzIHdoaWNoIG1heSBiZSBwcmVzZW50CisJICogY3B1X3ByZXNlbnRfbWFwIGRlc2NyaWJlcyB0aGUgc2V0IG9mIENQVXMgcG9wdWxhdGVkCiAJICovCiAJZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspIHsKLQkJY3B1X3NldChpLCBjcHVfcHJlc2VudF9tYXNrKTsKKwkJY3B1X3NldChpLCBjcHVfcG9zc2libGVfbWFwKTsKKwkJY3B1X3NldChpLCBjcHVfcHJlc2VudF9tYXApOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYwppbmRleCA0YjlkODQxLi40NWIxODY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgpAQCAtMTI1LDE5ICsxMjUsNiBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9wb3J0IGl4cDIwMDBfc2VyaWFsX3BvcnQgPSB7Ci0JLm1lbWJhc2UJPSAoY2hhciAqKShJWFAyMDAwX1VBUlRfVklSVF9CQVNFICsgMyksCi0JLm1hcGJhc2UJPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFICsgMywKLQkuaXJxCQk9IElSUV9JWFAyMDAwX1VBUlQsCi0JLmZsYWdzCQk9IFVQRl9TS0lQX1RFU1QsCi0JLmlvdHlwZQkJPSBVUElPX01FTSwKLQkucmVnc2hpZnQJPSAyLAotCS51YXJ0Y2xrCT0gNTAwMDAwMDAsCi0JLmxpbmUJCT0gMCwKLQkudHlwZQkJPSBQT1JUX1hTQ0FMRSwKLQkuZmlmb3NpemUJPSAxNgotfTsKLQogdm9pZCBfX2luaXQgaXhwMjAwMF9tYXBfaW8odm9pZCkKIHsKIAlleHRlcm4gdW5zaWduZWQgaW50IHByb2Nlc3Nvcl9pZDsKQEAgLTE1NywxMiArMTQ0LDUwIEBACiAJfQogCiAJaW90YWJsZV9pbml0KGl4cDIwMDBfaW9fZGVzYywgQVJSQVlfU0laRShpeHAyMDAwX2lvX2Rlc2MpKTsKLQllYXJseV9zZXJpYWxfc2V0dXAoJml4cDIwMDBfc2VyaWFsX3BvcnQpOwogCiAJLyogU2V0IHNsb3dwb3J0IHRvIDgtYml0IG1vZGUuICAqLwogCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfU0xPV1BPUlRfRlJNLCAxKTsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2VyaWFsIHBvcnQgc3VwcG9ydCBmb3IgSVhQMjAwMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGl4cDIwMDBfc2VyaWFsX3BvcnRbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwKKwkJLm1lbWJhc2UJPSAoY2hhciAqKShJWFAyMDAwX1VBUlRfVklSVF9CQVNFICsgMyksCisJCS5pcnEJCT0gSVJRX0lYUDIwMDBfVUFSVCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSA1MDAwMDAwMCwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXhwMjAwMF91YXJ0X3Jlc291cmNlID0geworCS5zdGFydAkJPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAorCS5lbmQJCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSArIDB4ZmZmZiwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeHAyMDAwX3NlcmlhbF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQkJPSBpeHAyMDAwX3NlcmlhbF9wb3J0LAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZpeHAyMDAwX3VhcnRfcmVzb3VyY2UsCit9OworCit2b2lkIF9faW5pdCBpeHAyMDAwX3VhcnRfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaXhwMjAwMF9zZXJpYWxfZGV2aWNlKTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVGltZXItdGljayBmdW5jdGlvbnMgZm9yIElYUDIwMDAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKaW5kZXggYjdlYmYzOC4uOWFhNTRkZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwpAQCAtMjE5LDYgKzIxOSw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZW5wMjYxMV9pbml0X21hY2hpbmUodm9pZCkKIHsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhlbnAyNjExX2RldmljZXMsIEFSUkFZX1NJWkUoZW5wMjYxMV9kZXZpY2VzKSk7CisJaXhwMjAwMF91YXJ0X2luaXQoKTsKIH0KIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCmluZGV4IDVlNDM4MDcuLmE0MzM2OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCkBAIC0zMDMsNSArMzAzLDYgQEAKIAlncGlvX2xpbmVfY29uZmlnKElYRFAyWDAwX0dQSU9fSTJDX0VOQUJMRSwgR1BJT19PVVQpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoaXhkcDJ4MDBfZGV2aWNlcywgQVJSQVlfU0laRShpeGRwMngwMF9kZXZpY2VzKSk7CisJaXhwMjAwMF91YXJ0X2luaXQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwppbmRleCBjNzM1ODg3Li40MzQ0N2RhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwpAQCAtMzcwLDYgKzM3MCw3IEBACiAJCSgoKklYRFAyWDAxX0NQTERfRkxBU0hfUkVHICYgSVhEUDJYMDFfQ1BMRF9GTEFTSF9CQU5LX01BU0spICsgMSk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpeGRwMngwMV9kZXZpY2VzLCBBUlJBWV9TSVpFKGl4ZHAyeDAxX2RldmljZXMpKTsKKwlpeHAyMDAwX3VhcnRfaW5pdCgpOwogfQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYwppbmRleCBhYTkyZTM3Li4yYjU0NDM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCkBAIC00NTMsOCArNDUzLDggQEAKIAlsb2NhbF93cml0ZV9jb25maWcoUENJX0NPTU1BTkQsIDIsIFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSk7CiAKIAlyZXNbMF0ubmFtZSA9ICJQQ0kgSS9PIFNwYWNlIjsKLQlyZXNbMF0uc3RhcnQgPSAweDAwMDAxMDAwOwotCXJlc1swXS5lbmQgPSAweGZmZmYwMDAwOworCXJlc1swXS5zdGFydCA9IDB4MDAwMDAwMDA7CisJcmVzWzBdLmVuZCA9IDB4MDAwMGZmZmY7CiAJcmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKIAogCXJlc1sxXS5uYW1lID0gIlBDSSBNZW1vcnkgU3BhY2UiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwppbmRleCBjNjMzNWY1Li40ZmY0MzkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwpAQCAtNTYsMjEgKzU2LDI0IEBACiAJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGNveW90ZV91YXJ0X2RhdGEgPSB7Ci0JLm1hcGJhc2UJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAotCS5tZW1iYXNlCT0gKGNoYXIgKilJWFA0WFhfVUFSVDJfQkFTRV9WSVJUICsgUkVHX09GRlNFVCwKLQkuaXJxCQk9IElSUV9JWFA0WFhfVUFSVDIsCi0JLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JLnJlZ3NoaWZ0CT0gMiwKLQkudWFydGNsawk9IElYUDRYWF9VQVJUX1hUQUwsCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGNveW90ZV91YXJ0X2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gSVhQNFhYX1VBUlQyX0JBU0VfUEhZUywKKwkJLm1lbWJhc2UJPSAoY2hhciAqKUlYUDRYWF9VQVJUMl9CQVNFX1ZJUlQgKyBSRUdfT0ZGU0VULAorCQkuaXJxCQk9IElSUV9JWFA0WFhfVUFSVDIsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBJWFA0WFhfVUFSVF9YVEFMLAorCX0sCisJeyB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY295b3RlX3VhcnQgPSB7CiAJLm5hbWUJCT0gInNlcmlhbDgyNTAiLAogCS5pZAkJPSAwLAogCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmY295b3RlX3VhcnRfZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEJPSBjb3lvdGVfdWFydF9kYXRhLAogCX0sCiAJLm51bV9yZXNvdXJjZXMJPSAxLAogCS5yZXNvdXJjZQk9ICZjb3lvdGVfdWFydF9yZXNvdXJjZSwKQEAgLTg3LDEwICs5MCwxMCBAQAogCSpJWFA0WFhfRVhQX0NTMSA9ICpJWFA0WFhfRVhQX0NTMDsKIAogCWlmIChtYWNoaW5lX2lzX2l4ZHBnNDI1KCkpIHsKLQkJY295b3RlX3VhcnRfZGF0YS5tZW1iYXNlID0KKwkJY295b3RlX3VhcnRfZGF0YVswXS5tZW1iYXNlID0KIAkJCShjaGFyKikoSVhQNFhYX1VBUlQxX0JBU0VfVklSVCArIFJFR19PRkZTRVQpOwotCQljb3lvdGVfdWFydF9kYXRhLm1hcGJhc2UgPSBJWFA0WFhfVUFSVDFfQkFTRV9QSFlTOwotCQljb3lvdGVfdWFydF9kYXRhLmlycSA9IElSUV9JWFA0WFhfVUFSVDE7CisJCWNveW90ZV91YXJ0X2RhdGFbMF0ubWFwYmFzZSA9IElYUDRYWF9VQVJUMV9CQVNFX1BIWVM7CisJCWNveW90ZV91YXJ0X2RhdGFbMF0uaXJxID0gSVJRX0lYUDRYWF9VQVJUMTsKIAl9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCmluZGV4IGYyZTljMGUuLmMyYmE3NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKQEAgLTk1LDcgKzk1LDggQEAKIAkJLmlvdHlwZQkJPSBVUElPX01FTSwKIAkJLnJlZ3NoaWZ0CT0gMiwKIAkJLnVhcnRjbGsJPSBJWFA0WFhfVUFSVF9YVEFMLAotCX0KKwl9LAorCXsgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGl4ZHA0MjVfdWFydCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDJlZmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotaWYgQVJDSF9PTUFQCi0KLW1lbnUgIlRJIE9NQVAgSW1wbGVtZW50YXRpb25zIgotCi1jb21tZW50ICJPTUFQIENvcmUgVHlwZSIKLQotY29uZmlnIEFSQ0hfT01BUDczMAotCWRlcGVuZHMgb24gQVJDSF9PTUFQCi0JYm9vbCAiT01BUDczMCBCYXNlZCBTeXN0ZW0iCi0Jc2VsZWN0IEFSQ0hfT01BUF9PVEcKLQotY29uZmlnIEFSQ0hfT01BUDE1MTAKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUAotCWRlZmF1bHQgeQotCWJvb2wgIk9NQVAxNTEwIEJhc2VkIFN5c3RlbSIKLQotY29uZmlnIEFSQ0hfT01BUDE2WFgKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUAotCWJvb2wgIk9NQVAxNlhYIEJhc2VkIFN5c3RlbSIKLQlzZWxlY3QgQVJDSF9PTUFQX09URwotCi1jb25maWcgQVJDSF9PTUFQX09URwotCWJvb2wKLQotY29tbWVudCAiT01BUCBCb2FyZCBUeXBlIgotCi1jb25maWcgTUFDSF9PTUFQX0lOTk9WQVRPUgotCWJvb2wgIlRJIElubm92YXRvciIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWAotCWhlbHAKLSAgICAgICAgICBUSSBPTUFQIDE1MTAgb3IgMTYxMCBJbm5vdmF0b3IgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UKLSAgICAgICAgICBoYXZlIHN1Y2ggYSBib2FyZC4KLQotY29uZmlnIE1BQ0hfT01BUF9IMgotCWJvb2wgIlRJIEgyIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCi0gICAgCWhlbHAKLQkgIFRJIE9NQVAgMTYxMC8xNjExQiBIMiBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKLQkgIGEgYm9hcmQuCi0KLWNvbmZpZyBNQUNIX09NQVBfSDMKLQlib29sICJUSSBIMyBTdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAotICAgIAloZWxwCi0JICBUSSBPTUFQIDE3MTAgSDMgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCi0JICBhIGJvYXJkLgotCi1jb25maWcgTUFDSF9PTUFQX0g0Ci0JYm9vbCAiVEkgSDQgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFgKLSAgICAJaGVscAotCSAgVEkgT01BUCAxNjEwIEg0IGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaAotCSAgYSBib2FyZC4KLQotY29uZmlnIE1BQ0hfT01BUF9PU0sKLQlib29sICJUSSBPU0sgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFgKLSAgICAJaGVscAotCSAgVEkgT01BUCA1OTEyIE9TSyAoT01BUCBTdGFydGVyIEtpdCkgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZQotICAgICAgICAgIGlmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZC4KLQotY29uZmlnIE1BQ0hfT01BUF9QRVJTRVVTMgotCWJvb2wgIlRJIFBlcnNldXMyIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQNzMwCi0gICAgCWhlbHAKLQkgIFN1cHBvcnQgZm9yIFRJIE9NQVAgNzMwIFBlcnNldXMyIGJvYXJkLiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKLQkgIGEgYm9hcmQuCi0KLWNvbmZpZyBNQUNIX1ZPSUNFQkxVRQotCWJvb2wgIlZvaWNlYmx1ZSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAKLQloZWxwCi0JICBTdXBwb3J0IGZvciBWb2ljZWJsdWUgR1NNL1ZvSVAgZ2F0ZXdheS4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCi0JICBib2FyZC4KLQotY29uZmlnIE1BQ0hfTkVUU1RBUgotCWJvb2wgIk5ldFN0YXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgTmV0U3RhciBQQlguIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLgotCi1jb25maWcgTUFDSF9PTUFQX0dFTkVSSUMKLQlib29sICJHZW5lcmljIE9NQVAgYm9hcmQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFgKLQloZWxwCi0gICAgICAgICAgU3VwcG9ydCBmb3IgZ2VuZXJpYyBPTUFQLTE1MTAsIDE2MTAgb3IgMTcxMCBib2FyZCB3aXRoCi0gICAgICAgICAgbm8gRlBHQS4gQ2FuIGJlIHVzZWQgYXMgdGVtcGxhdGUgZm9yIHBvcnRpbmcgTGludXggdG8KLSAgICAgICAgICBjdXN0b20gT01BUCBib2FyZHMuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBjdXN0b20KLSAgICAgICAgICBib2FyZC4KLQotY29tbWVudCAiT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMiCi0KLSNjb25maWcgT01BUF9CT09UX1RBRwotIwlib29sICJPTUFQIGJvb3Rsb2FkZXIgaW5mb3JtYXRpb24gcGFzc2luZyIKLSMgICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQCi0jICAgICAgICBkZWZhdWx0IG4KLSMgICAgICAgIGhlbHAKLSMgICAgICAgICAgU2F5IFksIGlmIHlvdSBoYXZlIGEgYm9vdGxvYWRlciB3aGljaCBwYXNzZXMgaW5mb3JtYXRpb24KLSMgICAgICAgICAgYWJvdXQgeW91ciBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWwgY29uZmlndXJhdGlvbi4KLQotY29uZmlnIE9NQVBfTVVYCi0JYm9vbCAiT01BUCBtdWx0aXBsZXhpbmcgc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBBUkNIX09NQVAKLQlkZWZhdWx0IHkKLSAgICAgICAgaGVscAotICAgICAgICAgIFBpbiBtdWx0aXBsZXhpbmcgc3VwcG9ydCBmb3IgT01BUCBib2FyZHMuIElmIHlvdXIgYm9vdGxvYWRlcgotICAgICAgICAgIHNldHMgdGhlIG11bHRpcGxleGluZyBjb3JyZWN0bHksIHNheSBOLiBPdGhlcndpc2UsIG9yIGlmIHVuc3VyZSwKLSAgICAgICAgICBzYXkgWS4KLQotY29uZmlnIE9NQVBfTVVYX0RFQlVHCi0JYm9vbCAiTXVsdGlwbGV4aW5nIGRlYnVnIG91dHB1dCIKLSAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgaGVscAotICAgICAgICAgIE1ha2VzIHRoZSBtdWx0aXBsZXhpbmcgZnVuY3Rpb25zIHByaW50IG91dCBhIGxvdCBvZiBkZWJ1ZyBpbmZvLgotICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZpbmQgb3V0IHRoZSBjb3JyZWN0IHZhbHVlcyBvZiB0aGUKLSAgICAgICAgICBtdWx0aXBsZXhpbmcgcmVnaXN0ZXJzLgotCi1jb25maWcgT01BUF9NVVhfV0FSTklOR1MKLQlib29sICJXYXJuIGFib3V0IHBpbnMgdGhlIGJvb3Rsb2FkZXIgZGlkbid0IHNldCB1cCIKLSAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAotICAgICAgICBkZWZhdWx0IHkKLSAgICAgICAgaGVscAotCSAgQ2hvb3NlIFkgaGVyZSB0byB3YXJuIHdoZW5ldmVyIGRyaXZlciBpbml0aWFsaXphdGlvbiBsb2dpYyBuZWVkcwotCSAgdG8gY2hhbmdlIHRoZSBwaW4gbXVsdGlwbGV4aW5nIHNldHVwLiAgV2hlbiB0aGVyZSBhcmUgbm8gd2FybmluZ3MKLQkgIHByaW50ZWQsIGl0J3Mgc2FmZSB0byBkZXNlbGVjdCBPTUFQX01VWCBmb3IgeW91ciBwcm9kdWN0LgotCi1jaG9pY2UKLSAgICAgICAgcHJvbXB0ICJTeXN0ZW0gdGltZXIiCi0JZGVmYXVsdCBPTUFQX01QVV9USU1FUgotCi1jb25maWcgT01BUF9NUFVfVElNRVIKLQlib29sICJVc2UgbXB1IHRpbWVyIgotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIE9NQVAgbXB1IHRpbWVyLiBUaGlzCi0JICB0aW1lciBwcm92aWRlcyBtb3JlIGludHJhLXRpY2sgcmVzb2x1dGlvbiB0aGFuIHRoZSAzMktIeiB0aW1lciwKLQkgIGJ1dCBjb25zdW1lcyBtb3JlIHBvd2VyLgotCi1jb25maWcgT01BUF8zMktfVElNRVIKLQlib29sICJVc2UgMzJLSHogdGltZXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgT01BUCAzMktIeiB0aW1lci4KLQkgIFRoaXMgdGltZXIgc2F2ZXMgcG93ZXIgY29tcGFyZWQgdG8gdGhlIE9NQVBfTVBVX1RJTUVSLCBhbmQgaGFzCi0JICBzdXBwb3J0IGZvciBubyB0aWNrIGR1cmluZyBpZGxlLiBUaGUgMzJLSHogdGltZXIgcHJvdmlkZXMgbGVzcwotCSAgaW50cmEtdGljayByZXNvbHV0aW9uIHRoYW4gT01BUF9NUFVfVElNRVIuIFRoZSAzMktIeiB0aW1lciBpcwotCSAgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBPTUFQLTE2eHguCi0KLWVuZGNob2ljZQotCi1jb25maWcgT01BUF8zMktfVElNRVJfSFoKLSAgICAgICBpbnQgIktlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgZm9yIDMyS0h6IHRpbWVyIgotICAgICAgIHJhbmdlIDMyIDEwMjQKLSAgICAgICBkZXBlbmRzIG9uIE9NQVBfMzJLX1RJTUVSCi0gICAgICAgZGVmYXVsdCAiMTI4IgotICAgICAgIGhlbHAKLQkgIEtlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgc2hvdWxkIGJlIGEgZGl2aXNvciBvZiAzMjc2OCwKLQkgIHN1Y2ggYXMgNjQgb3IgMTI4LgotCi1jaG9pY2UKLQlwcm9tcHQgIkxvdy1sZXZlbCBkZWJ1ZyBjb25zb2xlIFVBUlQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAKLQlkZWZhdWx0IE9NQVBfTExfREVCVUdfVUFSVDEKLQotY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDEKLQlib29sICJVQVJUMSIKLQotY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDIKLQlib29sICJVQVJUMiIKLQotY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDMKLQlib29sICJVQVJUMyIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBPTUFQX0FSTV8xOTVNSFoKLQlib29sICJPTUFQIEFSTSAxOTUgTUh6IENQVSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDczMAotCWhlbHAKLSAgICAgICAgICBFbmFibGUgMTk1TUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE9NQVBfQVJNXzE5Mk1IWgotCWJvb2wgIk9NQVAgQVJNIDE5MiBNSHogQ1BVIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAotCWhlbHAKLSAgICAgICAgICBFbmFibGUgMTkyTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE9NQVBfQVJNXzE4Mk1IWgotCWJvb2wgIk9NQVAgQVJNIDE4MiBNSHogQ1BVIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQNzMwCi0JaGVscAotICAgICAgICAgIEVuYWJsZSAxODJNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgT01BUF9BUk1fMTY4TUhaCi0JYm9vbCAiT01BUCBBUk0gMTY4IE1IeiBDUFUiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwCi0JaGVscAotICAgICAgICAgIEVuYWJsZSAxNjhNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgT01BUF9BUk1fMTIwTUhaCi0JYm9vbCAiT01BUCBBUk0gMTIwIE1IeiBDUFUiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwCi0JaGVscAotICAgICAgICAgIEVuYWJsZSAxMjBNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgT01BUF9BUk1fNjBNSFoKLQlib29sICJPTUFQIEFSTSA2MCBNSHogQ1BVIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMAotICAgICAgICBkZWZhdWx0IHkKLQloZWxwCi0gICAgICAgICAgRW5hYmxlIDYwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIE9NQVBfQVJNXzMwTUhaCi0JYm9vbCAiT01BUCBBUk0gMzAgTUh6IENQVSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzAKLQloZWxwCi0gICAgICAgICAgRW5hYmxlIDMwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotZW5kbWVudQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FmYjExLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCi0jCi0KLSMgQ29tbW9uIHN1cHBvcnQKLW9iai15IDo9IGNvbW1vbi5vIHRpbWUubyBpcnEubyBkbWEubyBjbG9jay5vIG11eC5vIGdwaW8ubyBtY2JzcC5vIHVzYi5vCi1vYmotbSA6PQotb2JqLW4gOj0KLW9iai0gIDo9Ci1sZWQteSA6PSBsZWRzLm8KLQotIyBTcGVjaWZpYyBib2FyZCBzdXBwb3J0Ci1vYmotJChDT05GSUdfTUFDSF9PTUFQX0gyKSArPSBib2FyZC1oMi5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gYm9hcmQtaW5ub3ZhdG9yLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfR0VORVJJQykgKz0gYm9hcmQtZ2VuZXJpYy5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyKSArPSBib2FyZC1wZXJzZXVzMi5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX09TSykgKz0gYm9hcmQtb3NrLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfSDMpICs9IGJvYXJkLWgzLm8KLW9iai0kKENPTkZJR19NQUNIX1ZPSUNFQkxVRSkgKz0gYm9hcmQtdm9pY2VibHVlLm8KLW9iai0kKENPTkZJR19NQUNIX05FVFNUQVIpICs9IGJvYXJkLW5ldHN0YXIubwotCi0jIE9DUEkgaW50ZXJjb25uZWN0IHN1cHBvcnQgZm9yIDE3MTAsIDE2MTAgYW5kIDU5MTIKLW9iai0kKENPTkZJR19BUkNIX09NQVAxNlhYKSArPSBvY3BpLm8KLQotIyBMRURzIHN1cHBvcnQKLWxlZC0kKENPTkZJR19NQUNIX09NQVBfSDIpICs9IGxlZHMtaDJwMi1kZWJ1Zy5vCi1sZWQtJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gbGVkcy1pbm5vdmF0b3IubwotbGVkLSQoQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMikgKz0gbGVkcy1oMnAyLWRlYnVnLm8KLW9iai0kKENPTkZJR19MRURTKSArPSAkKGxlZC15KQotCi0jIFBvd2VyIE1hbmFnZW1lbnQKLW9iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vCi0KLWlmZXEgKCQoQ09ORklHX0FSQ0hfT01BUDE1MTApLHkpCi0jIElubm92YXRvci0xNTEwIEZQR0EKLW9iai0kKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKSArPSBmcGdhLm8KLWVuZGlmCi0KLSMga2dkYiBzdXBwb3J0Ci1vYmotJChDT05GSUdfS0dEQl9TRVJJQUwpCSs9IGtnZGItc2VyaWFsLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1Y2RlNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvY29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uYwotICoKLSAqIENvZGUgY29tbW9uIHRvIGFsbCBPTUFQIG1hY2hpbmVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KLQotI2luY2x1ZGUgImNsb2NrLmgiCi0KLSNkZWZpbmUgREVCVUcgMQotCi1zdHJ1Y3Qgb21hcF9pZCB7Ci0JdTE2CWp0YWdfaWQ7CS8qIFVzZWQgdG8gZGV0ZXJtaW5lIE9NQVAgdHlwZSAqLwotCXU4CWRpZV9yZXY7CS8qIFByb2Nlc3NvciByZXZpc2lvbiAqLwotCXUzMglvbWFwX2lkOwkvKiBPTUFQIHJldmlzaW9uICovCi0JdTMyCXR5cGU7CQkvKiBDcHUgaWQgYml0cyBbMzE6MDhdLCBjcHUgY2xhc3MgYml0cyBbMDc6MDBdICovCi19OwotCi0vKiBSZWdpc3RlciB2YWx1ZXMgdG8gZGV0ZWN0IHRoZSBPTUFQIHZlcnNpb24gKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9pZCBvbWFwX2lkc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAuanRhZ19pZCA9IDB4MzU1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDA3MzAwMTAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNTVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MDczMDAzMDB9LAotCXsgLmp0YWdfaWQgPSAweGI0NzAsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMTAxMDAsIC50eXBlID0gMHgxNTEwMDAwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDE2MTAwMDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzIwMTAwLCAudHlwZSA9IDB4MTYxMTAwMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgzLCAub21hcF9pZCA9IDB4MDMzMjAxMDAsIC50eXBlID0gMHgxNjEwMGMwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDIwMCwgLnR5cGUgPSAweDE2MTAwZDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNjEzLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMzAwLCAudHlwZSA9IDB4MTYxMGVmMDB9LAotCXsgLmp0YWdfaWQgPSAweGI2MTMsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAzMDAsIC50eXBlID0gMHgxNjEwZWYwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDEsIC5vbWFwX2lkID0gMHgwMzMyMDEwMCwgLnR5cGUgPSAweDE2MTEwMDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNThjLCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzIwMjAwLCAudHlwZSA9IDB4MTYxMTBiMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1OGMsIC5kaWVfcmV2ID0gMHgzLCAub21hcF9pZCA9IDB4MDMzMjAyMDAsIC50eXBlID0gMHgxNjExMGMwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjY1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDQwMCwgLnR5cGUgPSAweDE2MjEyMzAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNjVmLCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzIwNDAwLCAudHlwZSA9IDB4MTYyMTIzMDB9LAotCXsgLmp0YWdfaWQgPSAweGI2NWYsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMjA1MDAsIC50eXBlID0gMHgxNjIxMjMwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjVmNywgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMzMDAwMCwgLnR5cGUgPSAweDE3MTAwMDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNWY3LCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzMwMTAwLCAudHlwZSA9IDB4MTcxMDAwMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1ZjcsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMzAxMDAsIC50eXBlID0gMHgxNzEwMDAwMH0sCi19OwotCi0vKgotICogR2V0IE9NQVAgdHlwZSBmcm9tIFBST0RfSUQuCi0gKiAxNzEwIGhhcyB0aGUgUFJPRF9JRCBpbiBiaXRzIDE1OjAwLCBub3QgaW4gMTY6MDEgYXMgZG9jdW1lbnRlZCBpbiBUUk0uCi0gKiAxNTEwIFBST0RfSUQgaXMgZW1wdHksIGFuZCAxNjEwIFBST0RfSUQgZG9lcyBub3QgbWFrZSBzZW5zZS4KLSAqIFVuZG9jdW1lbnRlZCByZWdpc3RlciBpbiBURVNUIEJMT0NLIGlzIHVzZWQgYXMgZmFsbGJhY2s7IFRoaXMgc2VlbXMgdG8KLSAqIHdvcmsgb24gMTUxMCwgMTYxMCAmIDE3MTAuIFRoZSBvZmZpY2lhbCB3YXkgaG9wZWZ1bGx5IHdpbGwgd29yayBpbiBmdXR1cmUKLSAqIHByb2Nlc3NvcnMuCi0gKi8KLXN0YXRpYyB1MTYgX19pbml0IG9tYXBfZ2V0X2p0YWdfaWQodm9pZCkKLXsKLQl1MzIgcHJvZF9pZCwgb21hcF9pZDsKLQotCXByb2RfaWQgPSBvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKTsKLQlvbWFwX2lkID0gb21hcF9yZWFkbChPTUFQMzJfSURfMSk7Ci0KLQkvKiBDaGVjayBmb3IgdW51c2FibGUgT01BUF9QUk9EVUNUSU9OX0lEXzEgb24gMTYxMUIvNTkxMiBhbmQgNzMwICovCi0JaWYgKCgocHJvZF9pZCA+PiAyMCkgPT0gMCkgfHwgKHByb2RfaWQgPT0gb21hcF9pZCkpCi0JCXByb2RfaWQgPSAwOwotCWVsc2UKLQkJcHJvZF9pZCAmPSAweGZmZmY7Ci0KLQlpZiAocHJvZF9pZCkKLQkJcmV0dXJuIHByb2RfaWQ7Ci0KLQkvKiBVc2UgT01BUDMyX0lEXzEgYXMgZmFsbGJhY2sgKi8KLQlwcm9kX2lkID0gKChvbWFwX2lkID4+IDEyKSAmIDB4ZmZmZik7Ci0KLQlyZXR1cm4gcHJvZF9pZDsKLX0KLQotLyoKLSAqIEdldCBPTUFQIHJldmlzaW9uIGZyb20gRElFX1JFVi4KLSAqIEVhcmx5IDE3MTAgcHJvY2Vzc29ycyBtYXkgaGF2ZSBicm9rZW4gT01BUF9ESUVfSUQsIGl0IGNvbnRhaW5zIFBST0RfSUQuCi0gKiBVbmRvY3VtZW50ZWQgcmVnaXN0ZXIgaW4gdGhlIFRFU1QgQkxPQ0sgaXMgdXNlZCBhcyBmYWxsYmFjay4KLSAqIFJFVklTSVQ6IFRoaXMgZG9lcyBub3Qgc2VlbSB0byB3b3JrIG9uIDE1MTAKLSAqLwotc3RhdGljIHU4IF9faW5pdCBvbWFwX2dldF9kaWVfcmV2KHZvaWQpCi17Ci0JdTMyIGRpZV9yZXY7Ci0KLQlkaWVfcmV2ID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKTsKLQotCS8qIENoZWNrIGZvciBicm9rZW4gT01BUF9ESUVfSUQgb24gZWFybHkgMTcxMCAqLwotCWlmICgoKGRpZV9yZXYgPj4gMTIpICYgMHhmZmZmKSA9PSBvbWFwX2dldF9qdGFnX2lkKCkpCi0JCWRpZV9yZXYgPSAwOwotCi0JZGllX3JldiA9IChkaWVfcmV2ID4+IDE3KSAmIDB4ZjsKLQlpZiAoZGllX3JldikKLQkJcmV0dXJuIGRpZV9yZXY7Ci0KLQlkaWVfcmV2ID0gKG9tYXBfcmVhZGwoT01BUDMyX0lEXzEpID4+IDI4KSAmIDB4ZjsKLQotCXJldHVybiBkaWVfcmV2OwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9jaGVja19yZXZpc2lvbih2b2lkKQotewotCWludCBpOwotCXUxNiBqdGFnX2lkOwotCXU4IGRpZV9yZXY7Ci0JdTMyIG9tYXBfaWQ7Ci0JdTggY3B1X3R5cGU7Ci0KLQlqdGFnX2lkID0gb21hcF9nZXRfanRhZ19pZCgpOwotCWRpZV9yZXYgPSBvbWFwX2dldF9kaWVfcmV2KCk7Ci0Jb21hcF9pZCA9IG9tYXBfcmVhZGwoT01BUDMyX0lEXzApOwotCi0jaWZkZWYgREVCVUcKLQlwcmludGsoIk9NQVBfRElFX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQX0RJRV9JRF8wKSk7Ci0JcHJpbnRrKCJPTUFQX0RJRV9JRF8xOiAweCUwOHggRElFX1JFVjogJWlcbiIsCi0JCW9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSksCi0JICAgICAgIChvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzEpID4+IDE3KSAmIDB4Zik7Ci0JcHJpbnRrKCJPTUFQX1BST0RVQ1RJT05fSURfMDogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8wKSk7Ci0JcHJpbnRrKCJPTUFQX1BST0RVQ1RJT05fSURfMTogMHglMDh4IEpUQUdfSUQ6IDB4JTA0eFxuIiwKLQkJb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMSksCi0JCW9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzEpICYgMHhmZmZmKTsKLQlwcmludGsoIk9NQVAzMl9JRF8wOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUDMyX0lEXzApKTsKLQlwcmludGsoIk9NQVAzMl9JRF8xOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUDMyX0lEXzEpKTsKLQlwcmludGsoIkpUQUdfSUQ6IDB4JTA0eCBESUVfUkVWOiAlaVxuIiwganRhZ19pZCwgZGllX3Jldik7Ci0jZW5kaWYKLQotCXN5c3RlbV9zZXJpYWxfaGlnaCA9IG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMCk7Ci0Jc3lzdGVtX3NlcmlhbF9sb3cgPSBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzEpOwotCi0JLyogRmlyc3QgY2hlY2sgb25seSB0aGUgbWFqb3IgdmVyc2lvbiBpbiBhIHNhZmUgd2F5ICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcF9pZHMpOyBpKyspIHsKLQkJaWYgKGp0YWdfaWQgPT0gKG9tYXBfaWRzW2ldLmp0YWdfaWQpKSB7Ci0JCQlzeXN0ZW1fcmV2ID0gb21hcF9pZHNbaV0udHlwZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgaWYgd2UgY2FuIGZpbmQgdGhlIGRpZSByZXZpc2lvbiAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBfaWRzKTsgaSsrKSB7Ci0JCWlmIChqdGFnX2lkID09IG9tYXBfaWRzW2ldLmp0YWdfaWQgJiYgZGllX3JldiA9PSBvbWFwX2lkc1tpXS5kaWVfcmV2KSB7Ci0JCQlzeXN0ZW1fcmV2ID0gb21hcF9pZHNbaV0udHlwZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogRmluYWxseSBjaGVjayBhbHNvIHRoZSBvbWFwX2lkICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcF9pZHMpOyBpKyspIHsKLQkJaWYgKGp0YWdfaWQgPT0gb21hcF9pZHNbaV0uanRhZ19pZAotCQkgICAgJiYgZGllX3JldiA9PSBvbWFwX2lkc1tpXS5kaWVfcmV2Ci0JCSAgICAmJiBvbWFwX2lkID09IG9tYXBfaWRzW2ldLm9tYXBfaWQpIHsKLQkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBBZGQgdGhlIGNwdSBjbGFzcyBpbmZvICg3eHgsIDE1eHgsIDE2eHgsIDI0eHgpICovCi0JY3B1X3R5cGUgPSBzeXN0ZW1fcmV2ID4+IDI0OwotCi0Jc3dpdGNoIChjcHVfdHlwZSkgewotCWNhc2UgMHgwNzoKLQkJc3lzdGVtX3JldiB8PSAweDA3OwotCQlicmVhazsKLQljYXNlIDB4MTU6Ci0JCXN5c3RlbV9yZXYgfD0gMHgxNTsKLQkJYnJlYWs7Ci0JY2FzZSAweDE2OgotCWNhc2UgMHgxNzoKLQkJc3lzdGVtX3JldiB8PSAweDE2OwotCQlicmVhazsKLQljYXNlIDB4MjQ6Ci0JCXN5c3RlbV9yZXYgfD0gMHgyNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKCJVbmtub3duIE9NQVAgY3B1IHR5cGU6IDB4JTAyeFxuIiwgY3B1X3R5cGUpOwotCX0KLQotCXByaW50aygiT01BUCUwNHgiLCBzeXN0ZW1fcmV2ID4+IDE2KTsKLQlpZiAoKHN5c3RlbV9yZXYgPj4gOCkgJiAweGZmKQotCQlwcmludGsoIiV4IiwgKHN5c3RlbV9yZXYgPj4gOCkgJiAweGZmKTsKLQlwcmludGsoIiByZXZpc2lvbiAlaSBoYW5kbGVkIGFzICUwMnh4eCBpZDogJTA4eCUwOHhcbiIsCi0JICAgICAgIGRpZV9yZXYsIHN5c3RlbV9yZXYgJiAweGZmLCBzeXN0ZW1fc2VyaWFsX2xvdywKLQkgICAgICAgc3lzdGVtX3NlcmlhbF9oaWdoKTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9NQVAgSS9PIG1hcHBpbmcKLSAqCi0gKiBUaGUgbWFjaGluZSBzcGVjaWZpYyBjb2RlIG1heSBwcm92aWRlIHRoZSBleHRyYSBtYXBwaW5nIGJlc2lkZXMgdGhlCi0gKiBkZWZhdWx0IG1hcHBpbmcgcHJvdmlkZWQgaGVyZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0geyBJT19WSVJULCAgICAgIAlJT19QSFlTLCAgICAgICAgICAgICBJT19TSVpFLCAgICAgICAgCSAgIE1UX0RFVklDRSB9LAotfTsKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDczMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLSB7IE9NQVA3MzBfRFNQX0JBU0UsICAgIE9NQVA3MzBfRFNQX1NUQVJULCAgICBPTUFQNzMwX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKLSB7IE9NQVA3MzBfRFNQUkVHX0JBU0UsIE9NQVA3MzBfRFNQUkVHX1NUQVJULCBPTUFQNzMwX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKLSB7IE9NQVA3MzBfU1JBTV9CQVNFLCAgIE9NQVA3MzBfU1JBTV9TVEFSVCwgICBPTUFQNzMwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQotfTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDE1MTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0geyBPTUFQMTUxMF9EU1BfQkFTRSwgICAgT01BUDE1MTBfRFNQX1NUQVJULCAgICBPTUFQMTUxMF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCi0geyBPTUFQMTUxMF9EU1BSRUdfQkFTRSwgT01BUDE1MTBfRFNQUkVHX1NUQVJULCBPTUFQMTUxMF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCi0geyBPTUFQMTUxMF9TUkFNX0JBU0UsICAgT01BUDE1MTBfU1JBTV9TVEFSVCwgICBPTUFQMTUxMF9TUkFNX1NJWkUsICAgTVRfREVWSUNFIH0KLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXAxNjEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAotIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAotIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDE2MTBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXA1OTEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAotIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAotLyoKLSAqIFRoZSBPTUFQNTkxMiBoYXMgMjUwa0J5dGUgaW50ZXJuYWwgU1JBTS4gQmVjYXVzZSB0aGUgbWFwcGluZyBpcyBiYXNlZWQgb24gcGFnZQotICogc2l6ZSAoNGtCeXRlKSwgaXQgc2VlbXMgdGhhdCB0aGUgbGFzdCAya0J5dGUgKD0weDgwMCkgb2YgdGhlIDI1MGtCeXRlIGFyZSBub3QgbWFwcGVkLgotICogQWRkIGFkZGl0aW9uYWwgMmtCeXRlICgweDgwMCkgc28gdGhhdCB0aGUgbGFzdCBwYWdlIGlzIG1hcHBlZCBhbmQgdGhlIGxhc3QgMmtCeXRlCi0gKiBjYW4gYmUgdXNlZC4KLSAqLwotIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDU5MTJfU1JBTV9TSVpFICsgMHg4MDAsICAgTVRfREVWSUNFIH0KLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBfb21hcF9tYXBfaW8odm9pZCkKLXsKLQlpbml0aWFsaXplZCA9IDE7Ci0KLQkvKiBXZSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIElPIHNwYWNlIG1hcHBpbmcgYmVmb3JlIHdlIGNhbiBydW4KLQkgKiBjcHVfaXNfb21hcHh4eCgpIG1hY3Jvcy4gKi8KLQlpb3RhYmxlX2luaXQob21hcF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXBfaW9fZGVzYykpOwotCW9tYXBfY2hlY2tfcmV2aXNpb24oKTsKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKLQlpZiAoY3B1X2lzX29tYXA3MzAoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDczMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA3MzBfaW9fZGVzYykpOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCWlvdGFibGVfaW5pdChvbWFwMTUxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNTEwX2lvX2Rlc2MpKTsKLQl9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQotCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDE2MTBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTYxMF9pb19kZXNjKSk7Ci0JfQotCWlmIChjcHVfaXNfb21hcDU5MTIoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDU5MTJfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwNTkxMl9pb19kZXNjKSk7Ci0JfQotI2VuZGlmCi0KLQkvKiBSRVZJU0lUOiBSZWZlciB0byBPTUFQNTkxMCBFcnJhdGEsIEFkdmlzb3J5IFNZU18xOiAiVGltZW91dCBBYm9ydAotCSAqIG9uIGEgUG9zdGVkIFdyaXRlIGluIHRoZSBUSVBCIEJyaWRnZSIuCi0JICovCi0Jb21hcF93cml0ZXcoMHgwLCBNUFVfUFVCTElDX1RJUEJfQ05UTCk7Ci0Jb21hcF93cml0ZXcoMHgwLCBNUFVfUFJJVkFURV9USVBCX0NOVEwpOwotCi0JLyogTXVzdCBpbml0IGNsb2NrcyBlYXJseSB0byBhc3N1cmUgdGhhdCB0aW1lciBpbnRlcnJ1cHQgd29ya3MKLQkgKi8KLQljbGtfaW5pdCgpOwotfQotCi0vKgotICogVGhpcyBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAotICovCi12b2lkIG9tYXBfbWFwX2lvKHZvaWQpCi17Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJX29tYXBfbWFwX2lvKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9tYXBfc2VyaWFsX2luKHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqdXAsCi0JCQkJCSAgaW50IG9mZnNldCkKLXsKLQlvZmZzZXQgPDw9IHVwLT5yZWdzaGlmdDsKLQlyZXR1cm4gKHVuc2lnbmVkIGludClfX3Jhd19yZWFkYih1cC0+bWVtYmFzZSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3NlcmlhbF9vdXRwKHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcCwgaW50IG9mZnNldCwKLQkJCQkgICAgaW50IHZhbHVlKQotewotCW9mZnNldCA8PD0gcC0+cmVnc2hpZnQ7Ci0JX19yYXdfd3JpdGViKHZhbHVlLCBwLT5tZW1iYXNlICsgb2Zmc2V0KTsKLX0KLQotLyoKLSAqIEludGVybmFsIFVBUlRzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgZm9yIHRoZSA4MjUwIGF1dG9jb25maWcgdG8gd29yawotICogcHJvcGVybHkuIE5vdGUgdGhhdCB0aGUgVFggd2F0ZXJtYXJrIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgbmVlZGVkCi0gKiBvbmNlIHRoZSA4MjUwLmMgd2F0ZXJtYXJrIGhhbmRsaW5nIGNvZGUgaXMgbWVyZ2VkLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9zZXJpYWxfcmVzZXQoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwKQotewotCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX01EUjEsIDB4MDcpOwkvKiBkaXNhYmxlIFVBUlQgKi8KLQlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9TQ1IsIDB4MDgpOwkvKiBUWCB3YXRlcm1hcmsgKi8KLQlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9NRFIxLCAweDAwKTsJLyogZW5hYmxlIFVBUlQgKi8KLQotCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfU1lTQywgMHgwMSk7Ci0JCXdoaWxlICghKG9tYXBfc2VyaWFsX2luKHAsIFVBUlRfT01BUF9TWVNDKSAmIDB4MDEpKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKLQl7Ci0JCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUMV9CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQxX0JBU0UsCi0JCS5pcnEJCT0gSU5UX1VBUlQxLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCi0JfSwKLQl7Ci0JCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUMl9CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQyX0JBU0UsCi0JCS5pcnEJCT0gSU5UX1VBUlQyLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCi0JfSwKLQl7Ci0JCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUM19CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQzX0JBU0UsCi0JCS5pcnEJCT0gSU5UX1VBUlQzLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCi0JfSwKLQl7IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewotCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKLQl9LAotfTsKLQotLyoKLSAqIE5vdGUgdGhhdCBvbiBJbm5vdmF0b3ItMTUxMCBVQVJUMiBwaW5zIGNvbmZsaWN0IHdpdGggVVNCMi4KLSAqIEJ5IGRlZmF1bHQgVUFSVDIgZG9lcyBub3Qgd29yayBvbiBJbm5vdmF0b3ItMTUxMCBpZiB5b3UgaGF2ZQotICogVVNCIE9IQ0kgZW5hYmxlZC4gVG8gdXNlIFVBUlQyLCB5b3UgbXVzdCBkaXNhYmxlIFVTQjIgZmlyc3QuCi0gKi8KLXZvaWQgX19pbml0IG9tYXBfc2VyaWFsX2luaXQoaW50IHBvcnRzW09NQVBfTUFYX05SX1BPUlRTXSkKLXsKLQlpbnQgaTsKLQotCWlmIChjcHVfaXNfb21hcDczMCgpKSB7Ci0JCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzBdLnJlZ3NoaWZ0ID0gMDsKLQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMV0ucmVnc2hpZnQgPSAwOwotCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVswXS5pcnEgPSBJTlRfNzMwX1VBUlRfTU9ERU1fMTsKLQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMV0uaXJxID0gSU5UXzczMF9VQVJUX01PREVNX0lSREFfMjsKLQl9Ci0KLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMF0udWFydGNsayA9IE9NQVAxNTEwX0JBU0VfQkFVRCAqIDE2OwotCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsxXS51YXJ0Y2xrID0gT01BUDE1MTBfQkFTRV9CQVVEICogMTY7Ci0JCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzJdLnVhcnRjbGsgPSBPTUFQMTUxMF9CQVNFX0JBVUQgKiAxNjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgT01BUF9NQVhfTlJfUE9SVFM7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyIHJlZzsKLQotCQlpZiAocG9ydHNbaV0gPT0gMCkgewotCQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0ubWVtYmFzZSA9IDA7Ci0JCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVtpXS5tYXBiYXNlID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3dpdGNoIChpKSB7Ci0JCWNhc2UgMDoKLQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMV9UWCk7Ci0JCQkJb21hcF9jZmdfcmVnKFVBUlQxX1JUUyk7Ci0JCQkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSkgewotCQkJCQlyZWcgPSBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXJlZyB8PSBPTUFQMTUxMF9GUEdBX1BDUl9DT00xX0VOOwotCQkJCQlmcGdhX3dyaXRlKHJlZywgT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXVkZWxheSgxMCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMl9UWCk7Ci0JCQkJb21hcF9jZmdfcmVnKFVBUlQyX1JUUyk7Ci0JCQkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSkgewotCQkJCQlyZWcgPSBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXJlZyB8PSBPTUFQMTUxMF9GUEdBX1BDUl9DT00yX0VOOwotCQkJCQlmcGdhX3dyaXRlKHJlZywgT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXVkZWxheSgxMCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUM19UWCk7Ci0JCQkJb21hcF9jZmdfcmVnKFVBUlQzX1JYKTsKLQkJCX0KLQkJCWlmIChjcHVfaXNfb21hcDE3MTAoKSkgewotCQkJCWNsa19lbmFibGUoY2xrX2dldCgwLCAidWFydDNfY2siKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlvbWFwX3NlcmlhbF9yZXNldCgmc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0pOwotCX0KLX0KLQotc3RhdGljIGludCBfX2luaXQgb21hcF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2VyaWFsX2RldmljZSk7Ci19Ci1hcmNoX2luaXRjYWxsKG9tYXBfaW5pdCk7Ci0KLSNkZWZpbmUgTk9fTEVOR1RIX0NIRUNLIDB4ZmZmZmZmZmYKLQotZXh0ZXJuIGludCBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbjsKLWV4dGVybiB1OCBvbWFwX2Jvb3Rsb2FkZXJfdGFnW107Ci0KLXN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgKm9tYXBfYm9hcmRfY29uZmlnOwotaW50IG9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSAwOwotCi1zdGF0aWMgY29uc3Qgdm9pZCAqZ2V0X2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgbGVuLCBpbnQgc2tpcCwgc2l6ZV90ICpsZW5fb3V0KQotewotCXN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgKmtpbmZvID0gTlVMTDsKLQlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19PTUFQX0JPT1RfVEFHCi0Jc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5ICppbmZvID0gTlVMTDsKLQotCWlmIChvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbiA+IDQpCi0JCWluZm8gPSAoc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5ICopIG9tYXBfYm9vdGxvYWRlcl90YWc7Ci0Jd2hpbGUgKGluZm8gIT0gTlVMTCkgewotCQl1OCAqbmV4dDsKLQotCQlpZiAoaW5mby0+dGFnID09IHRhZykgewotCQkJaWYgKHNraXAgPT0gMCkKLQkJCQlicmVhazsKLQkJCXNraXAtLTsKLQkJfQotCi0JCWlmICgoaW5mby0+bGVuICYgMHgwMykgIT0gMCkgewotCQkJLyogV2UgYmFpbCBvdXQgdG8gYXZvaWQgYW4gYWxpZ25tZW50IGZhdWx0ICovCi0JCQlwcmludGsoS0VSTl9FUlIgIk9NQVAgcGVyaXBoZXJhbCBjb25maWc6IExlbmd0aCAoJWQpIG5vdCB3b3JkLWFsaWduZWQgKHRhZyAlMDR4KVxuIiwKLQkJCSAgICAgICBpbmZvLT5sZW4sIGluZm8tPnRhZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQluZXh0ID0gKHU4ICopIGluZm8gKyBzaXplb2YoKmluZm8pICsgaW5mby0+bGVuOwotCQlpZiAobmV4dCA+PSBvbWFwX2Jvb3Rsb2FkZXJfdGFnICsgb21hcF9ib290bG9hZGVyX3RhZ19sZW4pCi0JCQlpbmZvID0gTlVMTDsKLQkJZWxzZQotCQkJaW5mbyA9IChzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgKikgbmV4dDsKLQl9Ci0JaWYgKGluZm8gIT0gTlVMTCkgewotCQkvKiBDaGVjayB0aGUgbGVuZ3RoIGFzIGEgbGFtZSBhdHRlbXB0IHRvIGNoZWNrIGZvcgotCQkgKiBiaW5hcnkgaW5jb25zaXN0YW5jeS4gKi8KLQkJaWYgKGxlbiAhPSBOT19MRU5HVEhfQ0hFQ0spIHsKLQkJCS8qIFdvcmQtYWxpZ24gbGVuICovCi0JCQlpZiAobGVuICYgMHgwMykKLQkJCQlsZW4gPSAobGVuICsgMykgJiB+MHgwMzsKLQkJCWlmIChpbmZvLT5sZW4gIT0gbGVuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIHBlcmlwaGVyYWwgY29uZmlnOiBMZW5ndGggbWlzbWF0Y2ggd2l0aCB0YWcgJXggKHdhbnQgJWQsIGdvdCAlZClcbiIsCi0JCQkJICAgICAgIHRhZywgbGVuLCBpbmZvLT5sZW4pOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCWlmIChsZW5fb3V0ICE9IE5VTEwpCi0JCQkqbGVuX291dCA9IGluZm8tPmxlbjsKLQkJcmV0dXJuIGluZm8tPmRhdGE7Ci0JfQotI2VuZGlmCi0JLyogVHJ5IHRvIGZpbmQgdGhlIGNvbmZpZyBmcm9tIHRoZSBib2FyZC1zcGVjaWZpYyBzdHJ1Y3R1cmVzCi0JICogaW4gdGhlIGtlcm5lbC4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgb21hcF9ib2FyZF9jb25maWdfc2l6ZTsgaSsrKSB7Ci0JCWlmIChvbWFwX2JvYXJkX2NvbmZpZ1tpXS50YWcgPT0gdGFnKSB7Ci0JCQlraW5mbyA9ICZvbWFwX2JvYXJkX2NvbmZpZ1tpXTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChraW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4ga2luZm8tPmRhdGE7Ci19Ci0KLWNvbnN0IHZvaWQgKl9fb21hcF9nZXRfY29uZmlnKHUxNiB0YWcsIHNpemVfdCBsZW4sIGludCBucikKLXsKLSAgICAgICAgcmV0dXJuIGdldF9jb25maWcodGFnLCBsZW4sIG5yLCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0woX19vbWFwX2dldF9jb25maWcpOwotCi1jb25zdCB2b2lkICpvbWFwX2dldF92YXJfY29uZmlnKHUxNiB0YWcsIHNpemVfdCAqbGVuKQotewotICAgICAgICByZXR1cm4gZ2V0X2NvbmZpZyh0YWcsIE5PX0xFTkdUSF9DSEVDSywgMCwgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0wob21hcF9nZXRfdmFyX2NvbmZpZyk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfYWRkX3NlcmlhbF9jb25zb2xlKHZvaWQpCi17Ci0JY29uc3Qgc3RydWN0IG9tYXBfdWFydF9jb25maWcgKmluZm87Ci0KLQlpbmZvID0gb21hcF9nZXRfY29uZmlnKE9NQVBfVEFHX1VBUlQsIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnKTsKLQlpZiAoaW5mbyAhPSBOVUxMICYmIGluZm8tPmNvbnNvbGVfdWFydCkgewotCQlzdGF0aWMgY2hhciBzcGVlZFsxMV0sICpvcHQgPSBOVUxMOwotCi0JCWlmIChpbmZvLT5jb25zb2xlX3NwZWVkKSB7Ci0JCQlzbnByaW50ZihzcGVlZCwgc2l6ZW9mKHNwZWVkKSwgIiV1IiwgaW5mby0+Y29uc29sZV9zcGVlZCk7Ci0JCQlvcHQgPSBzcGVlZDsKLQkJfQotCQlyZXR1cm4gYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlTIiwgaW5mby0+Y29uc29sZV91YXJ0IC0gMSwgb3B0KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1jb25zb2xlX2luaXRjYWxsKG9tYXBfYWRkX3NlcmlhbF9jb25zb2xlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA4YWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9LY29uZmlnCkBAIC0wLDAgKzEsMTQ0IEBACitjb21tZW50ICJPTUFQIENvcmUgVHlwZSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKKworY29uZmlnIEFSQ0hfT01BUDczMAorCWRlcGVuZHMgb24gQVJDSF9PTUFQMQorCWJvb2wgIk9NQVA3MzAgQmFzZWQgU3lzdGVtIgorCXNlbGVjdCBBUkNIX09NQVBfT1RHCisKK2NvbmZpZyBBUkNIX09NQVAxNTEwCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxCisJZGVmYXVsdCB5CisJYm9vbCAiT01BUDE1MTAgQmFzZWQgU3lzdGVtIgorCitjb25maWcgQVJDSF9PTUFQMTZYWAorCWRlcGVuZHMgb24gQVJDSF9PTUFQMQorCWJvb2wgIk9NQVAxNnh4IEJhc2VkIFN5c3RlbSIKKwlzZWxlY3QgQVJDSF9PTUFQX09URworCitjb21tZW50ICJPTUFQIEJvYXJkIFR5cGUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxCisKK2NvbmZpZyBNQUNIX09NQVBfSU5OT1ZBVE9SCisJYm9vbCAiVEkgSW5ub3ZhdG9yIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiAoQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYKQorCWhlbHAKKyAgICAgICAgICBUSSBPTUFQIDE1MTAgb3IgMTYxMCBJbm5vdmF0b3IgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UKKyAgICAgICAgICBoYXZlIHN1Y2ggYSBib2FyZC4KKworY29uZmlnIE1BQ0hfT01BUF9IMgorCWJvb2wgIlRJIEgyIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDE2WFgKKyAgICAJaGVscAorCSAgVEkgT01BUCAxNjEwLzE2MTFCIEgyIGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaAorCSAgYSBib2FyZC4KKworY29uZmlnIE1BQ0hfT01BUF9IMworCWJvb2wgIlRJIEgzIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDE2WFgKKyAgICAJaGVscAorCSAgVEkgT01BUCAxNzEwIEgzIGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaAorCSAgYSBib2FyZC4KKworY29uZmlnIE1BQ0hfT01BUF9PU0sKKwlib29sICJUSSBPU0sgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTZYWAorICAgIAloZWxwCisJICBUSSBPTUFQIDU5MTIgT1NLIChPTUFQIFN0YXJ0ZXIgS2l0KSBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlCisgICAgICAgICAgaWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLgorCitjb25maWcgTUFDSF9PTUFQX1BFUlNFVVMyCisJYm9vbCAiVEkgUGVyc2V1czIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDczMAorICAgIAloZWxwCisJICBTdXBwb3J0IGZvciBUSSBPTUFQIDczMCBQZXJzZXVzMiBib2FyZC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCisJICBhIGJvYXJkLgorCitjb25maWcgTUFDSF9WT0lDRUJMVUUKKwlib29sICJWb2ljZWJsdWUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDE1MTAKKwloZWxwCisJICBTdXBwb3J0IGZvciBWb2ljZWJsdWUgR1NNL1ZvSVAgZ2F0ZXdheS4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZQorCSAgc3VjaCBhIGJvYXJkLgorCitjb25maWcgTUFDSF9ORVRTVEFSCisJYm9vbCAiTmV0U3RhciIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTUxMAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIE5ldFN0YXIgUEJYLiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZC4KKworY29uZmlnIE1BQ0hfT01BUF9HRU5FUklDCisJYm9vbCAiR2VuZXJpYyBPTUFQIGJvYXJkIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiAoQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYKQorCWhlbHAKKyAgICAgICAgICBTdXBwb3J0IGZvciBnZW5lcmljIE9NQVAtMTUxMCwgMTYxMCBvciAxNzEwIGJvYXJkIHdpdGgKKyAgICAgICAgICBubyBGUEdBLiBDYW4gYmUgdXNlZCBhcyB0ZW1wbGF0ZSBmb3IgcG9ydGluZyBMaW51eCB0bworICAgICAgICAgIGN1c3RvbSBPTUFQIGJvYXJkcy4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIGN1c3RvbQorICAgICAgICAgIGJvYXJkLgorCitjb21tZW50ICJPTUFQIENQVSBTcGVlZCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKKworY29uZmlnIE9NQVBfQ0xPQ0tTX1NFVF9CWV9CT09UTE9BREVSCisJYm9vbCAiT01BUCBjbG9ja3Mgc2V0IGJ5IGJvb3Rsb2FkZXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxCisJaGVscAorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIHRvIHByZXZlbnQgdGhlIGtlcm5lbCBmcm9tIG92ZXJyaWRpbmcgdGhlIGNsb2NrCisJICBmcmVxdWVuY2llcyBwcm9ncmFtbWVkIGJ5IGJvb3Rsb2FkZXIgZm9yIE1QVSwgRFNQLCBNTVVzLCBUQywKKwkgIGludGVybmFsIExDRCBjb250cm9sbGVyIGFuZCBNUFUgcGVyaXBoZXJhbHMuCisKK2NvbmZpZyBPTUFQX0FSTV8yMTZNSFoKKwlib29sICJPTUFQIEFSTSAyMTYgTUh6IENQVSAoMTcxMCBvbmx5KSIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDE2WFgKKyAgICAgICAgaGVscAorICAgICAgICAgIEVuYWJsZSAyMTYgTUh6IGNsb2NrIGZvciBPTUFQMTcxMCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBPTUFQX0FSTV8xOTVNSFoKKwlib29sICJPTUFQIEFSTSAxOTUgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQNzMwCisJaGVscAorICAgICAgICAgIEVuYWJsZSAxOTVNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fMTkyTUhaCisJYm9vbCAiT01BUCBBUk0gMTkyIE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDE2WFgKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDE5Mk1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBPTUFQX0FSTV8xODJNSFoKKwlib29sICJPTUFQIEFSTSAxODIgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQNzMwCisJaGVscAorICAgICAgICAgIEVuYWJsZSAxODJNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fMTY4TUhaCisJYm9vbCAiT01BUCBBUk0gMTY4IE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIChBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwKQorCWhlbHAKKyAgICAgICAgICBFbmFibGUgMTY4TUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzE1ME1IWgorCWJvb2wgIk9NQVAgQVJNIDE1MCBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVAxNTEwCisJaGVscAorCSAgRW5hYmxlIDE1ME1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBPTUFQX0FSTV8xMjBNSFoKKwlib29sICJPTUFQIEFSTSAxMjAgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgKEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzApCisJaGVscAorICAgICAgICAgIEVuYWJsZSAxMjBNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fNjBNSFoKKwlib29sICJPTUFQIEFSTSA2MCBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiAoQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMCkKKyAgICAgICAgZGVmYXVsdCB5CisJaGVscAorICAgICAgICAgIEVuYWJsZSA2ME1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBPTUFQX0FSTV8zME1IWgorCWJvb2wgIk9NQVAgQVJNIDMwIE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIChBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwKQorCWhlbHAKKyAgICAgICAgICBFbmFibGUgMzBNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzg2ZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQpAQCAtMCwwICsxLDMwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCisjIENvbW1vbiBzdXBwb3J0CitvYmoteSA6PSBpby5vIGlkLm8gaXJxLm8gdGltZS5vIHNlcmlhbC5vCitsZWQteSA6PSBsZWRzLm8KKworIyBTcGVjaWZpYyBib2FyZCBzdXBwb3J0CitvYmotJChDT05GSUdfTUFDSF9PTUFQX0gyKQkJKz0gYm9hcmQtaDIubworb2JqLSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpCSs9IGJvYXJkLWlubm92YXRvci5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQX0dFTkVSSUMpCQkrPSBib2FyZC1nZW5lcmljLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIpCSs9IGJvYXJkLXBlcnNldXMyLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfT1NLKQkJKz0gYm9hcmQtb3NrLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfSDMpCQkrPSBib2FyZC1oMy5vCitvYmotJChDT05GSUdfTUFDSF9WT0lDRUJMVUUpCQkrPSBib2FyZC12b2ljZWJsdWUubworb2JqLSQoQ09ORklHX01BQ0hfTkVUU1RBUikJCSs9IGJvYXJkLW5ldHN0YXIubworCitpZmVxICgkKENPTkZJR19BUkNIX09NQVAxNTEwKSx5KQorIyBJbm5vdmF0b3ItMTUxMCBGUEdBCitvYmotJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikJKz0gZnBnYS5vCitlbmRpZgorCisjIExFRHMgc3VwcG9ydAorbGVkLSQoQ09ORklHX01BQ0hfT01BUF9IMikJCSs9IGxlZHMtaDJwMi1kZWJ1Zy5vCitsZWQtJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikJKz0gbGVkcy1pbm5vdmF0b3IubworbGVkLSQoQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMikJKz0gbGVkcy1oMnAyLWRlYnVnLm8KK2xlZC0kKENPTkZJR19NQUNIX09NQVBfT1NLKQkJKz0gbGVkcy1vc2subworb2JqLSQoQ09ORklHX0xFRFMpCQkJKz0gJChsZWQteSkKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlLmJvb3QKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlLmJvb3QKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUuYm9vdAppbmRleCBmZWUxYTZhLi4yOTJkNTZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvTWFrZWZpbGUuYm9vdAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlLmJvb3QKQEAgLTEsNCArMSwzIEBACiAgICB6cmVsYWRkci15CQk6PSAweDEwMDA4MDAwCiBwYXJhbXNfcGh5cy15CQk6PSAweDEwMDAwMTAwCiBpbml0cmRfcGh5cy15CQk6PSAweDEwODAwMDAwCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtZ2VuZXJpYy5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwppbmRleCAzODRiYzdjLi4xMjI3OTZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1nZW5lcmljLmMKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCiAgKgogICogTW9kaWZpZWQgZnJvbSBib2FyZC1pbm5vdmF0b3IxNTEwLmMKICAqCkBAIC0yNiw4ICsyNiw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgogCiBzdGF0aWMgaW50IF9faW5pdGRhdGEgZ2VuZXJpY19zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDEsIDF9OwogCkBAIC04NCw3ICs4Myw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcF9tYXBfaW8oKTsKKwlvbWFwX21hcF9jb21tb25faW8oKQogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfR0VORVJJQywgIkdlbmVyaWMgT01BUDE1MTAvMTYxMC8xNzEwIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMi5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKaW5kZXggZjM3Yzc2YS4uZjQ5ODNlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMi5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKICAqCiAgKiBCb2FyZCBzcGVjaWZpYyBpbml0cyBmb3IgT01BUC0xNjEwIEgyCiAgKgpAQCAtMzUsOCArMzUsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSA8YXNtL2FyY2gvY29tbW9uLmg+CiAKIGV4dGVybiBpbnQgb21hcF9ncGlvX2luaXQodm9pZCk7CiAKQEAgLTE3Miw3ICsxNzEsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgaDJfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcF9tYXBfaW8oKTsKKwlvbWFwX21hcF9jb21tb25faW8oKTsKIAlvbWFwX3NlcmlhbF9pbml0KGgyX3NlcmlhbF9wb3J0cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMy5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKaW5kZXggNzA1ZTQ4NS4uN2NkNDE5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMy5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgT01BUDE3MTAgSDMgc3BlY2lmaWMgY29kZS4KICAqCkBAIC0zNyw4ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KICNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgogCiBleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOwogCkBAIC0xOTAsNyArMTg5LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGgzX21hcF9pbyh2b2lkKQogewotCW9tYXBfbWFwX2lvKCk7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CiAJb21hcF9zZXJpYWxfaW5pdChoM19zZXJpYWxfcG9ydHMpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1pbm5vdmF0b3IuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwppbmRleCA1MjMzNjNmLi45MWRlNjBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmMKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKICAqCiAgKiBCb2FyZCBzcGVjaWZpYyBpbml0cyBmb3IgT01BUC0xNTEwIGFuZCBPTUFQLTE2MTAgSW5ub3ZhdG9yCiAgKgpAQCAtMzMsOCArMzMsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSA8YXNtL2FyY2gvY29tbW9uLmg+CiAKIHN0YXRpYyBpbnQgX19pbml0ZGF0YSBpbm5vdmF0b3Jfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKIApAQCAtMjUyLDcgKzI1MSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcF9tYXBfaW8oKTsKKwlvbWFwX21hcF9jb21tb25faW8oKTsKIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCiAJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtbmV0c3Rhci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW5ldHN0YXIuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKaW5kZXggOGM2NTM3My4uNjc1MGIyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW5ldHN0YXIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5ldHN0YXIuYwpAQCAtMjYsOCArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KICNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgogCiBleHRlcm4gdm9pZCBfX2luaXQgb21hcF9pbml0X3RpbWUodm9pZCk7CiBleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOwpAQCAtMTAwLDcgKzk5LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG5ldHN0YXJfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcF9tYXBfaW8oKTsKKwlvbWFwX21hcF9jb21tb25faW8oKTsKIAlvbWFwX3NlcmlhbF9pbml0KG9tYXBfc2VyaWFsX3BvcnRzKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtb3NrLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKaW5kZXggY2I0MzM0My4uNjg0NGU1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCiAgKgogICogQm9hcmQgc3BlY2lmaWMgaW5pdCBmb3IgT01BUDU5MTIgT1NLCiAgKgpAQCAtMzksOCArMzksNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvc2s1OTEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogeyBPTUFQX09TS19OT1JfRkxBU0hfQkFTRSwgT01BUF9PU0tfTk9SX0ZMQVNIX1NUQVJULCBPTUFQX09TS19OT1JfRkxBU0hfU0laRSwKQEAgLTE1Myw3ICsxNTIsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb3NrX21hcF9pbyh2b2lkKQogewotCW9tYXBfbWFwX2lvKCk7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CiAJaW90YWJsZV9pbml0KG9zazU5MTJfaW9fZGVzYywgQVJSQVlfU0laRShvc2s1OTEyX2lvX2Rlc2MpKTsKIAlvbWFwX3NlcmlhbF9pbml0KG9za19zZXJpYWxfcG9ydHMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwppbmRleCBkNTM0MjA0Li4yMTMzMTczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtcGVyc2V1czIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmMKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwogICoKICAqIE1vZGlmaWVkIGZyb20gYm9hcmQtZ2VuZXJpYy5jCiAgKgpAQCAtMjcsOCArMjcsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KICNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewpAQCAtMTQwLDcgKzEzOSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3BlcnNldXMyX21hcF9pbyh2b2lkKQogewotCW9tYXBfbWFwX2lvKCk7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CiAJaW90YWJsZV9pbml0KG9tYXBfcGVyc2V1czJfaW9fZGVzYywKIAkJICAgICBBUlJBWV9TSVpFKG9tYXBfcGVyc2V1czJfaW9fZGVzYykpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtdm9pY2VibHVlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwppbmRleCA2YjBjNTAwLi5lNDIyODE5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXZvaWNlYmx1ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXZvaWNlYmx1ZS5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCiAgKgogICogTW9kaWZpZWQgZnJvbSBib2FyZC1nZW5lcmljLmMKICAqCkBAIC0zMSw4ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KICNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgogCiBleHRlcm4gdm9pZCBvbWFwX2luaXRfdGltZSh2b2lkKTsKIGV4dGVybiBpbnQgb21hcF9ncGlvX2luaXQodm9pZCk7CkBAIC0xNzAsNyArMTY5LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9tYXBfaW8odm9pZCkKIHsKLQlvbWFwX21hcF9pbygpOworCW9tYXBfbWFwX2NvbW1vbl9pbygpOwogCW9tYXBfc2VyaWFsX2luaXQob21hcF9zZXJpYWxfcG9ydHMpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvZnBnYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9mcGdhLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2YzNiNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaWQuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvaWQuYworICoKKyAqIE9NQVAxIENQVSBpZGVudGlmaWNhdGlvbiBjb2RlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBXcml0dGVuIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0cnVjdCBvbWFwX2lkIHsKKwl1MTYJanRhZ19pZDsJLyogVXNlZCB0byBkZXRlcm1pbmUgT01BUCB0eXBlICovCisJdTgJZGllX3JldjsJLyogUHJvY2Vzc29yIHJldmlzaW9uICovCisJdTMyCW9tYXBfaWQ7CS8qIE9NQVAgcmV2aXNpb24gKi8KKwl1MzIJdHlwZTsJCS8qIENwdSBpZCBiaXRzIFszMTowOF0sIGNwdSBjbGFzcyBiaXRzIFswNzowMF0gKi8KK307CisKKy8qIFJlZ2lzdGVyIHZhbHVlcyB0byBkZXRlY3QgdGhlIE9NQVAgdmVyc2lvbiAqLworc3RhdGljIHN0cnVjdCBvbWFwX2lkIG9tYXBfaWRzW10gX19pbml0ZGF0YSA9IHsKKwl7IC5qdGFnX2lkID0gMHgzNTVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MDczMDAxMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1NWYsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAwMDAsIC50eXBlID0gMHgwNzMwMDMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjQ3MCwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMxMDEwMCwgLnR5cGUgPSAweDE1MTAwMDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MTYxMDAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMjAxMDAsIC50eXBlID0gMHgxNjExMDAwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDMsIC5vbWFwX2lkID0gMHgwMzMyMDEwMCwgLnR5cGUgPSAweDE2MTAwYzAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMjAwLCAudHlwZSA9IDB4MTYxMDBkMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2MTMsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAzMDAsIC50eXBlID0gMHgxNjEwZWYwMH0sCisJeyAuanRhZ19pZCA9IDB4YjYxMywgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDMwMCwgLnR5cGUgPSAweDE2MTBlZjAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzIwMTAwLCAudHlwZSA9IDB4MTYxMTAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1OGMsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMjAyMDAsIC50eXBlID0gMHgxNjExMGIwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU4YywgLmRpZV9yZXYgPSAweDMsIC5vbWFwX2lkID0gMHgwMzMyMDIwMCwgLnR5cGUgPSAweDE2MTEwYzAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNjVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwNDAwLCAudHlwZSA9IDB4MTYyMTIzMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2NWYsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMjA0MDAsIC50eXBlID0gMHgxNjIxMjMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjY1ZiwgLmRpZV9yZXYgPSAweDEsIC5vbWFwX2lkID0gMHgwMzMyMDUwMCwgLnR5cGUgPSAweDE2MjEyMzAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNWY3LCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzMwMDAwLCAudHlwZSA9IDB4MTcxMDAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1ZjcsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMzAxMDAsIC50eXBlID0gMHgxNzEwMDAwMH0sCisJeyAuanRhZ19pZCA9IDB4YjVmNywgLmRpZV9yZXYgPSAweDIsIC5vbWFwX2lkID0gMHgwMzMzMDEwMCwgLnR5cGUgPSAweDE3MTAwMDAwfSwKK307CisKKy8qCisgKiBHZXQgT01BUCB0eXBlIGZyb20gUFJPRF9JRC4KKyAqIDE3MTAgaGFzIHRoZSBQUk9EX0lEIGluIGJpdHMgMTU6MDAsIG5vdCBpbiAxNjowMSBhcyBkb2N1bWVudGVkIGluIFRSTS4KKyAqIDE1MTAgUFJPRF9JRCBpcyBlbXB0eSwgYW5kIDE2MTAgUFJPRF9JRCBkb2VzIG5vdCBtYWtlIHNlbnNlLgorICogVW5kb2N1bWVudGVkIHJlZ2lzdGVyIGluIFRFU1QgQkxPQ0sgaXMgdXNlZCBhcyBmYWxsYmFjazsgVGhpcyBzZWVtcyB0bworICogd29yayBvbiAxNTEwLCAxNjEwICYgMTcxMC4gVGhlIG9mZmljaWFsIHdheSBob3BlZnVsbHkgd2lsbCB3b3JrIGluIGZ1dHVyZQorICogcHJvY2Vzc29ycy4KKyAqLworc3RhdGljIHUxNiBfX2luaXQgb21hcF9nZXRfanRhZ19pZCh2b2lkKQoreworCXUzMiBwcm9kX2lkLCBvbWFwX2lkOworCisJcHJvZF9pZCA9IG9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzEpOworCW9tYXBfaWQgPSBvbWFwX3JlYWRsKE9NQVAzMl9JRF8xKTsKKworCS8qIENoZWNrIGZvciB1bnVzYWJsZSBPTUFQX1BST0RVQ1RJT05fSURfMSBvbiAxNjExQi81OTEyIGFuZCA3MzAgKi8KKwlpZiAoKChwcm9kX2lkID4+IDIwKSA9PSAwKSB8fCAocHJvZF9pZCA9PSBvbWFwX2lkKSkKKwkJcHJvZF9pZCA9IDA7CisJZWxzZQorCQlwcm9kX2lkICY9IDB4ZmZmZjsKKworCWlmIChwcm9kX2lkKQorCQlyZXR1cm4gcHJvZF9pZDsKKworCS8qIFVzZSBPTUFQMzJfSURfMSBhcyBmYWxsYmFjayAqLworCXByb2RfaWQgPSAoKG9tYXBfaWQgPj4gMTIpICYgMHhmZmZmKTsKKworCXJldHVybiBwcm9kX2lkOworfQorCisvKgorICogR2V0IE9NQVAgcmV2aXNpb24gZnJvbSBESUVfUkVWLgorICogRWFybHkgMTcxMCBwcm9jZXNzb3JzIG1heSBoYXZlIGJyb2tlbiBPTUFQX0RJRV9JRCwgaXQgY29udGFpbnMgUFJPRF9JRC4KKyAqIFVuZG9jdW1lbnRlZCByZWdpc3RlciBpbiB0aGUgVEVTVCBCTE9DSyBpcyB1c2VkIGFzIGZhbGxiYWNrLgorICogUkVWSVNJVDogVGhpcyBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgb24gMTUxMAorICovCitzdGF0aWMgdTggX19pbml0IG9tYXBfZ2V0X2RpZV9yZXYodm9pZCkKK3sKKwl1MzIgZGllX3JldjsKKworCWRpZV9yZXYgPSBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzEpOworCisJLyogQ2hlY2sgZm9yIGJyb2tlbiBPTUFQX0RJRV9JRCBvbiBlYXJseSAxNzEwICovCisJaWYgKCgoZGllX3JldiA+PiAxMikgJiAweGZmZmYpID09IG9tYXBfZ2V0X2p0YWdfaWQoKSkKKwkJZGllX3JldiA9IDA7CisKKwlkaWVfcmV2ID0gKGRpZV9yZXYgPj4gMTcpICYgMHhmOworCWlmIChkaWVfcmV2KQorCQlyZXR1cm4gZGllX3JldjsKKworCWRpZV9yZXYgPSAob21hcF9yZWFkbChPTUFQMzJfSURfMSkgPj4gMjgpICYgMHhmOworCisJcmV0dXJuIGRpZV9yZXY7Cit9CisKK3ZvaWQgX19pbml0IG9tYXBfY2hlY2tfcmV2aXNpb24odm9pZCkKK3sKKwlpbnQgaTsKKwl1MTYganRhZ19pZDsKKwl1OCBkaWVfcmV2OworCXUzMiBvbWFwX2lkOworCXU4IGNwdV90eXBlOworCisJanRhZ19pZCA9IG9tYXBfZ2V0X2p0YWdfaWQoKTsKKwlkaWVfcmV2ID0gb21hcF9nZXRfZGllX3JldigpOworCW9tYXBfaWQgPSBvbWFwX3JlYWRsKE9NQVAzMl9JRF8wKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJPTUFQX0RJRV9JRF8wOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMCkpOworCXByaW50aygiT01BUF9ESUVfSURfMTogMHglMDh4IERJRV9SRVY6ICVpXG4iLAorCQlvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzEpLAorCSAgICAgICAob21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKSA+PiAxNykgJiAweGYpOworCXByaW50aygiT01BUF9QUk9EVUNUSU9OX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMCkpOworCXByaW50aygiT01BUF9QUk9EVUNUSU9OX0lEXzE6IDB4JTA4eCBKVEFHX0lEOiAweCUwNHhcbiIsCisJCW9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzEpLAorCQlvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKSAmIDB4ZmZmZik7CisJcHJpbnRrKCJPTUFQMzJfSURfMDogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVAzMl9JRF8wKSk7CisJcHJpbnRrKCJPTUFQMzJfSURfMTogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVAzMl9JRF8xKSk7CisJcHJpbnRrKCJKVEFHX0lEOiAweCUwNHggRElFX1JFVjogJWlcbiIsIGp0YWdfaWQsIGRpZV9yZXYpOworI2VuZGlmCisKKwlzeXN0ZW1fc2VyaWFsX2hpZ2ggPSBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzApOworCXN5c3RlbV9zZXJpYWxfbG93ID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKTsKKworCS8qIEZpcnN0IGNoZWNrIG9ubHkgdGhlIG1ham9yIHZlcnNpb24gaW4gYSBzYWZlIHdheSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBfaWRzKTsgaSsrKSB7CisJCWlmIChqdGFnX2lkID09IChvbWFwX2lkc1tpXS5qdGFnX2lkKSkgeworCQkJc3lzdGVtX3JldiA9IG9tYXBfaWRzW2ldLnR5cGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBmaW5kIHRoZSBkaWUgcmV2aXNpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgeworCQlpZiAoanRhZ19pZCA9PSBvbWFwX2lkc1tpXS5qdGFnX2lkICYmIGRpZV9yZXYgPT0gb21hcF9pZHNbaV0uZGllX3JldikgeworCQkJc3lzdGVtX3JldiA9IG9tYXBfaWRzW2ldLnR5cGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEZpbmFsbHkgY2hlY2sgYWxzbyB0aGUgb21hcF9pZCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBfaWRzKTsgaSsrKSB7CisJCWlmIChqdGFnX2lkID09IG9tYXBfaWRzW2ldLmp0YWdfaWQKKwkJICAgICYmIGRpZV9yZXYgPT0gb21hcF9pZHNbaV0uZGllX3JldgorCQkgICAgJiYgb21hcF9pZCA9PSBvbWFwX2lkc1tpXS5vbWFwX2lkKSB7CisJCQlzeXN0ZW1fcmV2ID0gb21hcF9pZHNbaV0udHlwZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogQWRkIHRoZSBjcHUgY2xhc3MgaW5mbyAoN3h4LCAxNXh4LCAxNnh4LCAyNHh4KSAqLworCWNwdV90eXBlID0gc3lzdGVtX3JldiA+PiAyNDsKKworCXN3aXRjaCAoY3B1X3R5cGUpIHsKKwljYXNlIDB4MDc6CisJCXN5c3RlbV9yZXYgfD0gMHgwNzsKKwkJYnJlYWs7CisJY2FzZSAweDE1OgorCQlzeXN0ZW1fcmV2IHw9IDB4MTU7CisJCWJyZWFrOworCWNhc2UgMHgxNjoKKwljYXNlIDB4MTc6CisJCXN5c3RlbV9yZXYgfD0gMHgxNjsKKwkJYnJlYWs7CisJY2FzZSAweDI0OgorCQlzeXN0ZW1fcmV2IHw9IDB4MjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBPTUFQIGNwdSB0eXBlOiAweCUwMnhcbiIsIGNwdV90eXBlKTsKKwl9CisKKwlwcmludGsoIk9NQVAlMDR4Iiwgc3lzdGVtX3JldiA+PiAxNik7CisJaWYgKChzeXN0ZW1fcmV2ID4+IDgpICYgMHhmZikKKwkJcHJpbnRrKCIleCIsIChzeXN0ZW1fcmV2ID4+IDgpICYgMHhmZik7CisJcHJpbnRrKCIgcmV2aXNpb24gJWkgaGFuZGxlZCBhcyAlMDJ4eHggaWQ6ICUwOHglMDh4XG4iLAorCSAgICAgICBkaWVfcmV2LCBzeXN0ZW1fcmV2ICYgMHhmZiwgc3lzdGVtX3NlcmlhbF9sb3csCisJICAgICAgIHN5c3RlbV9zZXJpYWxfaGlnaCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDdkZjBmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCisgKgorICogT01BUDEgSS9PIG1hcHBpbmcgY29kZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CisKK2V4dGVybiBpbnQgY2xrX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwX2NoZWNrX3JldmlzaW9uKHZvaWQpOworCisvKgorICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBtYXkgcHJvdmlkZSB0aGUgZXh0cmEgbWFwcGluZyBiZXNpZGVzIHRoZQorICogZGVmYXVsdCBtYXBwaW5nIHByb3ZpZGVkIGhlcmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyB7IElPX1ZJUlQsICAgICAgCUlPX1BIWVMsICAgICAgICAgICAgIElPX1NJWkUsICAgICAgICAJICAgTVRfREVWSUNFIH0sCit9OworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwNzMwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgT01BUDczMF9EU1BfQkFTRSwgICAgT01BUDczMF9EU1BfU1RBUlQsICAgIE9NQVA3MzBfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAorIHsgT01BUDczMF9EU1BSRUdfQkFTRSwgT01BUDczMF9EU1BSRUdfU1RBUlQsIE9NQVA3MzBfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAorIHsgT01BUDczMF9TUkFNX0JBU0UsICAgT01BUDczMF9TUkFNX1NUQVJULCAgIE9NQVA3MzBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMTUxMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyB7IE9NQVAxNTEwX0RTUF9CQVNFLCAgICBPTUFQMTUxMF9EU1BfU1RBUlQsICAgIE9NQVAxNTEwX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKKyB7IE9NQVAxNTEwX0RTUFJFR19CQVNFLCBPTUFQMTUxMF9EU1BSRUdfU1RBUlQsIE9NQVAxNTEwX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKKyB7IE9NQVAxNTEwX1NSQU1fQkFTRSwgICBPTUFQMTUxMF9TUkFNX1NUQVJULCAgIE9NQVAxNTEwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDE2MTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgeyBPTUFQMTZYWF9EU1BfQkFTRSwgICAgT01BUDE2WFhfRFNQX1NUQVJULCAgICBPTUFQMTZYWF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCisgeyBPTUFQMTZYWF9EU1BSRUdfQkFTRSwgT01BUDE2WFhfRFNQUkVHX1NUQVJULCBPTUFQMTZYWF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCisgeyBPTUFQMTZYWF9TUkFNX0JBU0UsICAgT01BUDE2WFhfU1JBTV9TVEFSVCwgICBPTUFQMTYxMF9TUkFNX1NJWkUsICAgTVRfREVWSUNFIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDU5MTJfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgeyBPTUFQMTZYWF9EU1BfQkFTRSwgICAgT01BUDE2WFhfRFNQX1NUQVJULCAgICBPTUFQMTZYWF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCisgeyBPTUFQMTZYWF9EU1BSRUdfQkFTRSwgT01BUDE2WFhfRFNQUkVHX1NUQVJULCBPTUFQMTZYWF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCisvKgorICogVGhlIE9NQVA1OTEyIGhhcyAyNTBrQnl0ZSBpbnRlcm5hbCBTUkFNLiBCZWNhdXNlIHRoZSBtYXBwaW5nIGlzIGJhc2VlZCBvbiBwYWdlCisgKiBzaXplICg0a0J5dGUpLCBpdCBzZWVtcyB0aGF0IHRoZSBsYXN0IDJrQnl0ZSAoPTB4ODAwKSBvZiB0aGUgMjUwa0J5dGUgYXJlIG5vdCBtYXBwZWQuCisgKiBBZGQgYWRkaXRpb25hbCAya0J5dGUgKDB4ODAwKSBzbyB0aGF0IHRoZSBsYXN0IHBhZ2UgaXMgbWFwcGVkIGFuZCB0aGUgbGFzdCAya0J5dGUKKyAqIGNhbiBiZSB1c2VkLgorICovCisgeyBPTUFQMTZYWF9TUkFNX0JBU0UsICAgT01BUDE2WFhfU1JBTV9TVEFSVCwgICBPTUFQNTkxMl9TUkFNX1NJWkUgKyAweDgwMCwgICBNVF9ERVZJQ0UgfQorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworc3RhdGljIHZvaWQgX19pbml0IF9vbWFwX21hcF9pbyh2b2lkKQoreworCWluaXRpYWxpemVkID0gMTsKKworCS8qIFdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgSU8gc3BhY2UgbWFwcGluZyBiZWZvcmUgd2UgY2FuIHJ1bgorCSAqIGNwdV9pc19vbWFweHh4KCkgbWFjcm9zLiAqLworCWlvdGFibGVfaW5pdChvbWFwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcF9pb19kZXNjKSk7CisJb21hcF9jaGVja19yZXZpc2lvbigpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCWlvdGFibGVfaW5pdChvbWFwNzMwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDczMF9pb19kZXNjKSk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJaW90YWJsZV9pbml0KG9tYXAxNTEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDE1MTBfaW9fZGVzYykpOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7CisJCWlvdGFibGVfaW5pdChvbWFwMTYxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNjEwX2lvX2Rlc2MpKTsKKwl9CisJaWYgKGNwdV9pc19vbWFwNTkxMigpKSB7CisJCWlvdGFibGVfaW5pdChvbWFwNTkxMl9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA1OTEyX2lvX2Rlc2MpKTsKKwl9CisjZW5kaWYKKworCS8qIFJFVklTSVQ6IFJlZmVyIHRvIE9NQVA1OTEwIEVycmF0YSwgQWR2aXNvcnkgU1lTXzE6ICJUaW1lb3V0IEFib3J0CisJICogb24gYSBQb3N0ZWQgV3JpdGUgaW4gdGhlIFRJUEIgQnJpZGdlIi4KKwkgKi8KKwlvbWFwX3dyaXRldygweDAsIE1QVV9QVUJMSUNfVElQQl9DTlRMKTsKKwlvbWFwX3dyaXRldygweDAsIE1QVV9QUklWQVRFX1RJUEJfQ05UTCk7CisKKwkvKiBNdXN0IGluaXQgY2xvY2tzIGVhcmx5IHRvIGFzc3VyZSB0aGF0IHRpbWVyIGludGVycnVwdCB3b3JrcworCSAqLworCWNsa19pbml0KCk7Cit9CisKKy8qCisgKiBUaGlzIHNob3VsZCBvbmx5IGdldCBjYWxsZWQgZnJvbSBib2FyZCBzcGVjaWZpYyBpbml0CisgKi8KK3ZvaWQgb21hcF9tYXBfY29tbW9uX2lvKHZvaWQpCit7CisJaWYgKCFpbml0aWFsaXplZCkKKwkJX29tYXBfbWFwX2lvKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9pcnEuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwppbmRleCBmMDFjOTkyLi5hMTFiNmQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwpAQCAtNTYsNiArNTYsNyBAQAogc3RydWN0IG9tYXBfaXJxX2JhbmsgewogCXVuc2lnbmVkIGxvbmcgYmFzZV9yZWc7CiAJdW5zaWduZWQgbG9uZyB0cmlnZ2VyX21hcDsKKwl1bnNpZ25lZCBsb25nIHdha2VfZW5hYmxlOwogfTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBpcnFfYmFua19jb3VudCA9IDA7CkBAIC0xMDUsNiArMTA2LDE5IEBACiAJb21hcF9hY2tfaXJxKGlycSk7CiB9CiAKK3N0YXRpYyBpbnQgb21hcF93YWtlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCWludCBiYW5rID0gSVJRX0JBTksoaXJxKTsKKworCWlmIChlbmFibGUpCisJCWlycV9iYW5rc1tiYW5rXS53YWtlX2VuYWJsZSB8PSBJUlFfQklUKGlycSk7CisJZWxzZQorCQlpcnFfYmFua3NbYmFua10ud2FrZV9lbmFibGUgJj0gfklSUV9CSVQoaXJxKTsKKworCXJldHVybiAwOworfQorCisKIC8qCiAgKiBBbGxvd3MgdHVuaW5nIHRoZSBJUlEgdHlwZSBhbmQgcHJpb3JpdHkKICAqCkBAIC0xNDUsNyArMTU5LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9pcnFfYmFuayBvbWFwMTYxMF9pcnFfYmFua3NbXSA9IHsKIAl7IC5iYXNlX3JlZyA9IE9NQVBfSUgxX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhiM2ZlZmU4ZiB9LAogCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGZkYjdjMWZkIH0sCi0JeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFICsgMHgxMDAsCS50cmlnZ2VyX21hcCA9IDB4ZmZmZmY3ZmYgfSwKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UgKyAweDEwMCwJLnRyaWdnZXJfbWFwID0gMHhmZmZmYjdmZiB9LAogCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSArIDB4MjAwLAkudHJpZ2dlcl9tYXAgPSAweGZmZmZmZmZmIH0sCiB9OwogI2VuZGlmCkBAIC0xNTQsNiArMTY4LDcgQEAKIAkuYWNrICAgID0gb21hcF9tYXNrX2Fja19pcnEsCiAJLm1hc2sgICA9IG9tYXBfbWFza19pcnEsCiAJLnVubWFzayA9IG9tYXBfdW5tYXNrX2lycSwKKwkud2FrZQk9IG9tYXBfd2FrZV9pcnEsCiB9OwogCiB2b2lkIF9faW5pdCBvbWFwX2luaXRfaXJxKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1oMnAyLWRlYnVnLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9sZWRzLWgycDItZGVidWcuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwppbmRleCA2ZTk4MjkwLi5lYzBkODI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1oMnAyLWRlYnVnLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1pbm5vdmF0b3IuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtaW5ub3ZhdG9yLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1pbm5vdmF0b3IuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtb3NrLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYwppbmRleCBmNTE3N2Y0Li40YTBlOGI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1vc2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKQEAgLTEyOSwxNCArMTI5LDExIEBACiAKICNpZmRlZglDT05GSUdfRkJfT01BUAogCi0jaWZkZWYgQ09ORklHX0xFRFNfVElNRVIKIAljYXNlIGxlZF90aW1lcjoKIAkJaHdfbGVkX3N0YXRlIF49IFRJTUVSX0xFRDsKIAkJbWlzdHJhbF9zZXRsZWQoKTsKIAkJYnJlYWs7Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19MRURTX0NQVQogCWNhc2UgbGVkX2lkbGVfc3RhcnQ6CiAJCWh3X2xlZF9zdGF0ZSB8PSBJRExFX0xFRDsKIAkJbWlzdHJhbF9zZXRsZWQoKTsKQEAgLTE0Niw3ICsxNDMsNiBAQAogCQlod19sZWRfc3RhdGUgJj0gfklETEVfTEVEOwogCQltaXN0cmFsX3NldGxlZCgpOwogCQlicmVhazsKLSNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHX0ZCX09NQVAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMuaCBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0ZTVkMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKKyAqCisgKiBPTUFQMSBDUFUgaWRlbnRpZmljYXRpb24gY29kZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorCitzdGF0aWMgc3RydWN0IGNsayAqIHVhcnQxX2NrID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgY2xrICogdWFydDJfY2sgPSBOVUxMOworc3RhdGljIHN0cnVjdCBjbGsgKiB1YXJ0M19jayA9IE5VTEw7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9tYXBfc2VyaWFsX2luKHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqdXAsCisJCQkJCSAgaW50IG9mZnNldCkKK3sKKwlvZmZzZXQgPDw9IHVwLT5yZWdzaGlmdDsKKwlyZXR1cm4gKHVuc2lnbmVkIGludClfX3Jhd19yZWFkYih1cC0+bWVtYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3NlcmlhbF9vdXRwKHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcCwgaW50IG9mZnNldCwKKwkJCQkgICAgaW50IHZhbHVlKQoreworCW9mZnNldCA8PD0gcC0+cmVnc2hpZnQ7CisJX19yYXdfd3JpdGViKHZhbHVlLCBwLT5tZW1iYXNlICsgb2Zmc2V0KTsKK30KKworLyoKKyAqIEludGVybmFsIFVBUlRzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgZm9yIHRoZSA4MjUwIGF1dG9jb25maWcgdG8gd29yaworICogcHJvcGVybHkuIE5vdGUgdGhhdCB0aGUgVFggd2F0ZXJtYXJrIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgbmVlZGVkCisgKiBvbmNlIHRoZSA4MjUwLmMgd2F0ZXJtYXJrIGhhbmRsaW5nIGNvZGUgaXMgbWVyZ2VkLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9zZXJpYWxfcmVzZXQoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwKQoreworCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX01EUjEsIDB4MDcpOwkvKiBkaXNhYmxlIFVBUlQgKi8KKwlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9TQ1IsIDB4MDgpOwkvKiBUWCB3YXRlcm1hcmsgKi8KKwlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9NRFIxLCAweDAwKTsJLyogZW5hYmxlIFVBUlQgKi8KKworCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfU1lTQywgMHgwMSk7CisJCXdoaWxlICghKG9tYXBfc2VyaWFsX2luKHAsIFVBUlRfT01BUF9TWVNDKSAmIDB4MDEpKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUMV9CQVNFKSwKKwkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQxX0JBU0UsCisJCS5pcnEJCT0gSU5UX1VBUlQxLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCisJfSwKKwl7CisJCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUMl9CQVNFKSwKKwkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQyX0JBU0UsCisJCS5pcnEJCT0gSU5UX1VBUlQyLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCisJfSwKKwl7CisJCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUM19CQVNFKSwKKwkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQzX0JBU0UsCisJCS5pcnEJCT0gSU5UX1VBUlQzLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCisJfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSAwLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworLyoKKyAqIE5vdGUgdGhhdCBvbiBJbm5vdmF0b3ItMTUxMCBVQVJUMiBwaW5zIGNvbmZsaWN0IHdpdGggVVNCMi4KKyAqIEJ5IGRlZmF1bHQgVUFSVDIgZG9lcyBub3Qgd29yayBvbiBJbm5vdmF0b3ItMTUxMCBpZiB5b3UgaGF2ZQorICogVVNCIE9IQ0kgZW5hYmxlZC4gVG8gdXNlIFVBUlQyLCB5b3UgbXVzdCBkaXNhYmxlIFVTQjIgZmlyc3QuCisgKi8KK3ZvaWQgX19pbml0IG9tYXBfc2VyaWFsX2luaXQoaW50IHBvcnRzW09NQVBfTUFYX05SX1BPUlRTXSkKK3sKKwlpbnQgaTsKKworCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzBdLnJlZ3NoaWZ0ID0gMDsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMV0ucmVnc2hpZnQgPSAwOworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVswXS5pcnEgPSBJTlRfNzMwX1VBUlRfTU9ERU1fMTsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMV0uaXJxID0gSU5UXzczMF9VQVJUX01PREVNX0lSREFfMjsKKwl9CisKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMF0udWFydGNsayA9IE9NQVAxNTEwX0JBU0VfQkFVRCAqIDE2OworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsxXS51YXJ0Y2xrID0gT01BUDE1MTBfQkFTRV9CQVVEICogMTY7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzJdLnVhcnRjbGsgPSBPTUFQMTUxMF9CQVNFX0JBVUQgKiAxNjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgT01BUF9NQVhfTlJfUE9SVFM7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIHJlZzsKKworCQlpZiAocG9ydHNbaV0gPT0gMCkgeworCQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0ubWVtYmFzZSA9IE5VTEw7CisJCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVtpXS5tYXBiYXNlID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCXVhcnQxX2NrID0gY2xrX2dldChOVUxMLCAidWFydDFfY2siKTsKKwkJCWlmIChJU19FUlIodWFydDFfY2spKQorCQkJCXByaW50aygiQ291bGQgbm90IGdldCB1YXJ0MV9ja1xuIik7CisJCQllbHNlIHsKKwkJCQljbGtfdXNlKHVhcnQxX2NrKTsKKwkJCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpCisJCQkJCWNsa19zZXRfcmF0ZSh1YXJ0MV9jaywgMTIwMDAwMDApOworCQkJfQorCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQxX1RYKTsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDFfUlRTKTsKKwkJCQlpZiAobWFjaGluZV9pc19vbWFwX2lubm92YXRvcigpKSB7CisJCQkJCXJlZyA9IGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJCQkJcmVnIHw9IE9NQVAxNTEwX0ZQR0FfUENSX0NPTTFfRU47CisJCQkJCWZwZ2Ffd3JpdGUocmVnLCBPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdWFydDJfY2sgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0Ml9jayIpOworCQkJaWYgKElTX0VSUih1YXJ0Ml9jaykpCisJCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IHVhcnQyX2NrXG4iKTsKKwkJCWVsc2UgeworCQkJCWNsa191c2UodWFydDJfY2spOworCQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKKwkJCQkJY2xrX3NldF9yYXRlKHVhcnQyX2NrLCAxMjAwMDAwMCk7CisJCQkJZWxzZQorCQkJCQljbGtfc2V0X3JhdGUodWFydDJfY2ssIDQ4MDAwMDAwKTsKKwkJCX0KKwkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMl9UWCk7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQyX1JUUyk7CisJCQkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSkgeworCQkJCQlyZWcgPSBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUik7CisJCQkJCXJlZyB8PSBPTUFQMTUxMF9GUEdBX1BDUl9DT00yX0VOOworCQkJCQlmcGdhX3dyaXRlKHJlZywgT01BUDE1MTBfRlBHQV9QT1dFUik7CisJCQkJCXVkZWxheSgxMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXVhcnQzX2NrID0gY2xrX2dldChOVUxMLCAidWFydDNfY2siKTsKKwkJCWlmIChJU19FUlIodWFydDNfY2spKQorCQkJCXByaW50aygiQ291bGQgbm90IGdldCB1YXJ0M19ja1xuIik7CisJCQllbHNlIHsKKwkJCQljbGtfdXNlKHVhcnQzX2NrKTsKKwkJCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpCisJCQkJCWNsa19zZXRfcmF0ZSh1YXJ0M19jaywgMTIwMDAwMDApOworCQkJfQorCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQzX1RYKTsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDNfUlgpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJb21hcF9zZXJpYWxfcmVzZXQoJnNlcmlhbF9wbGF0Zm9ybV9kYXRhW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNlcmlhbF9kZXZpY2UpOworfQorYXJjaF9pbml0Y2FsbChvbWFwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC90aW1lLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jCmluZGV4IGRkMzRlOWYuLmQ1NDA1MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL3RpbWUuYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKICAqCiAgKiBPTUFQIFRpbWVycwogICoKQEAgLTU4LDE3ICs1OCw5IEBACiAgKiBNUFUgdGltZXIKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jZGVmaW5lIE9NQVBfTVBVX1RJTUVSMV9CQVNFCQkoMHhmZmZlYzUwMCkKLSNkZWZpbmUgT01BUF9NUFVfVElNRVIyX0JBU0UJCSgweGZmZmVjNjAwKQotI2RlZmluZSBPTUFQX01QVV9USU1FUjNfQkFTRQkJKDB4ZmZmZWM3MDApCiAjZGVmaW5lIE9NQVBfTVBVX1RJTUVSX0JBU0UJCU9NQVBfTVBVX1RJTUVSMV9CQVNFCiAjZGVmaW5lIE9NQVBfTVBVX1RJTUVSX09GRlNFVAkJMHgxMDAKIAotI2RlZmluZSBNUFVfVElNRVJfRlJFRQkJCSgxIDw8IDYpCi0jZGVmaW5lIE1QVV9USU1FUl9DTE9DS19FTkFCTEUJCSgxIDw8IDUpCi0jZGVmaW5lIE1QVV9USU1FUl9BUgkJCSgxIDw8IDEpCi0jZGVmaW5lIE1QVV9USU1FUl9TVAkJCSgxIDw8IDApCi0KIC8qIGN5Y2xlcyB0byBuc2VjIGNvbnZlcnNpb25zIHRha2VuIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMsCiAgKiBjb252ZXJ0ZWQgdG8gdXNlIGtIeiBieSBLZXZpbiBIaWxtYW4gKi8KIC8qIGNvbnZlcnQgZnJvbSBjeWNsZXMoNjRiaXRzKSA9PiBuYW5vc2Vjb25kcyAoNjRiaXRzKQpAQCAtMjU1LDYgKzI0NywxMyBAQAogI2RlZmluZSBPTUFQXzMyS19USU1FUl9UQ1IJCTB4MDQKIAogI2RlZmluZSBPTUFQXzMyS19USUNLU19QRVJfSFoJCSgzMjc2OCAvIEhaKQorI2lmICgzMjc2OCAlIEhaKSAhPSAwCisvKiBXZSBjYW5ub3QgaWdub3JlIG1vZHVsby4KKyAqIFBvdGVudGlhbCBlcnJvciBjYW4gYmUgYXMgaGlnaCBhcyBzZXZlcmFsIHBlcmNlbnQuCisgKi8KKyNkZWZpbmUgT01BUF8zMktfVElDS19NT0RVTE8JCSgzMjc2OCAlIEhaKQorc3RhdGljIHVuc2lnbmVkIG1vZHVsb19jb3VudCA9IDA7IC8qIENvdW50cyAxL0haIHVuaXRzICovCisjZW5kaWYKIAogLyoKICAqIFRSTSBzYXlzIDEgLyBIWiA9ICggVFZSICsgMSkgLyAzMjc2OCwgc28gVFJWID0gKDMyNzY4IC8gSFopIC0gMQpAQCAtMzMxLDYgKzMzMCwxOSBAQAogCW5vdyA9IG9tYXBfMzJrX3N5bmNfdGltZXJfcmVhZCgpOwogCiAJd2hpbGUgKG5vdyAtIG9tYXBfMzJrX2xhc3RfdGljayA+PSBPTUFQXzMyS19USUNLU19QRVJfSFopIHsKKyNpZmRlZiBPTUFQXzMyS19USUNLX01PRFVMTworCQkvKiBNb2R1bG8gYWRkaXRpb24gbWF5IHB1dCBvbWFwXzMya19sYXN0X3RpY2sgYWhlYWQgb2Ygbm93CisJCSAqIGFuZCBjYXVzZSB1bndhbnRlZCByZXBldGl0aW9uIG9mIHRoZSB3aGlsZSBsb29wLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KG5vdyAtIG9tYXBfMzJrX2xhc3RfdGljayA9PSB+MCkpCisJCQlicmVhazsKKworCQltb2R1bG9fY291bnQgKz0gT01BUF8zMktfVElDS19NT0RVTE87CisJCWlmIChtb2R1bG9fY291bnQgPiBIWikgeworCQkJKytvbWFwXzMya19sYXN0X3RpY2s7CisJCQltb2R1bG9fY291bnQgLT0gSFo7CisJCX0KKyNlbmRpZgogCQlvbWFwXzMya19sYXN0X3RpY2sgKz0gT01BUF8zMktfVElDS1NfUEVSX0haOwogCQl0aW1lcl90aWNrKHJlZ3MpOwogCX0KQEAgLTQwNyw3ICs0MTksNyBAQAogICogVGltZXIgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi12b2lkIF9faW5pdCBvbWFwX3RpbWVyX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3RpbWVyX2luaXQodm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX01QVV9USU1FUikKIAlvbWFwX2luaXRfbXB1X3RpbWVyKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwppbmRleCAyNzY0MzFiLi44NmI4NjJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKQEAgLTI4OSw3ICsyODksNyBAQAogTUFDSElORV9TVEFSVChDT1JHSSwgIlNIQVJQIENvcmdpIikKIAkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsKQorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5maXh1cAkJPSBmaXh1cF9jb3JnaSwKIAkubWFwX2lvCQk9IGNvcmdpX21hcF9pbywKIAkuaW5pdF9pcnEJPSBjb3JnaV9pbml0X2lycSwKQEAgLTMwMiw3ICszMDIsNyBAQAogTUFDSElORV9TVEFSVChTSEVQSEVSRCwgIlNIQVJQIFNoZXBoZXJkIikKIAkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsKQorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5maXh1cAkJPSBmaXh1cF9jb3JnaSwKIAkubWFwX2lvCQk9IGNvcmdpX21hcF9pbywKIAkuaW5pdF9pcnEJPSBjb3JnaV9pbml0X2lycSwKQEAgLTMxNSw3ICszMTUsNyBAQAogTUFDSElORV9TVEFSVChIVVNLWSwgIlNIQVJQIEh1c2t5IikKIAkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsKQorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5maXh1cAkJPSBmaXh1cF9jb3JnaSwKIAkubWFwX2lvCQk9IGNvcmdpX21hcF9pbywKIAkuaW5pdF9pcnEJPSBjb3JnaV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKaW5kZXggZjgyZjVhYS4uMzg2ZTEwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCS8qIE1haW50YWluZXI6IFZpYnJlbiBUZWNobm9sb2dpZXMgKi8KIAkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsKQorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5tYXBfaW8JCT0gaWRwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBpZHBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZweGFfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKaW5kZXggZTMwYjdjNi4uNjMwOTg1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuICovCiAJLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4NDAwMDAwMDAsCi0JLmlvX3BnX29mZnN0CT0gKChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLCkKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGx1YmJvY2tfbWFwX2lvLAogCS5pbml0X2lycQk9IGx1YmJvY2tfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZweGFfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCmluZGV4IDVkMmY3NmIuLjgyN2I3YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4gKi8KIAkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsKQorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5tYXBfaW8JCT0gbWFpbnN0b25lX21hcF9pbywKIAkuaW5pdF9pcnEJPSBtYWluc3RvbmVfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZweGFfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCmluZGV4IGViYWU5NjkuLjBlNGY2ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCkBAIC0xODIsNyArMTgyLDcgQEAKIE1BQ0hJTkVfU1RBUlQoUE9PRExFLCAiU0hBUlAgUG9vZGxlIikKIAkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsKQorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5maXh1cAkJPSBmaXh1cF9wb29kbGUsCiAJLm1hcF9pbwkJPSBwb29kbGVfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IDk1NjA2YjQuLmFmYmJlYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKICMgQVJNOTI1VAogY29uZmlnIENQVV9BUk05MjVUCi0gCWJvb2wgIlN1cHBvcnQgQVJNOTI1VCBwcm9jZXNzb3IiIGlmIEFSQ0hfT01BUAorIAlib29sICJTdXBwb3J0IEFSTTkyNVQgcHJvY2Vzc29yIiBpZiBBUkNIX09NQVAxCiAgCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMAogIAlkZWZhdWx0IHkgaWYgQVJDSF9PTUFQMTUxMAogCXNlbGVjdCBDUFVfMzJ2NApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW0tYXJtdi5jIGIvYXJjaC9hcm0vbW0vbW0tYXJtdi5jCmluZGV4IGMzYmQ1MDMuLmIxOWYwMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tLWFybXYuYworKysgYi9hcmNoL2FybS9tbS9tbS1hcm12LmMKQEAgLTM5OSw3ICszOTksNyBAQAogCQllY2NfbWFzayA9IDA7CiAJfQogCi0JaWYgKGNwdV9hcmNoIDw9IENQVV9BUkNIX0FSTXY1KSB7CisJaWYgKGNwdV9hcmNoIDw9IENQVV9BUkNIX0FSTXY1VEVKKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1lbV90eXBlcyk7IGkrKykgewogCQkJaWYgKG1lbV90eXBlc1tpXS5wcm90X2wxKQogCQkJCW1lbV90eXBlc1tpXS5wcm90X2wxIHw9IFBNRF9CSVQ0OwpAQCAtNTg0LDcgKzU4NCw3IEBACiAJCXBtZHZhbCA9IChpIDw8IFBHRElSX1NISUZUKSB8CiAJCQkgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfU0VDVF9BUF9SRUFEIHwKIAkJCSBQTURfVFlQRV9TRUNUOwotCQlpZiAoY3B1X2FyY2ggPD0gQ1BVX0FSQ0hfQVJNdjUpCisJCWlmIChjcHVfYXJjaCA8PSBDUFVfQVJDSF9BUk12NVRFSikKIAkJCXBtZHZhbCB8PSBQTURfQklUNDsKIAkJcG1kID0gcG1kX29mZihwZ2QsIGkgPDwgUEdESVJfU0hJRlQpOwogCQlwbWRbMF0gPSBfX3BtZChwbWR2YWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCmluZGV4IGUzZDg1MTAuLjM1MmRiOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCW1jcglwMTUsIDAsIHI0LCBjMiwgYzAsIDEJCUAgbG9hZCBUVEIxCiAjaWZkZWYgQ09ORklHX1ZGUAogCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDIKLQlvcnIJcjAsIHIwLCAjKDMgPDwgMjApCisJb3JyCXIwLCByMCwgIygweGYgPDwgMjApCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMgkJQCBFbmFibGUgZnVsbCBhY2Nlc3MgdG8gVkZQCiAjZW5kaWYKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIHJlYWQgY29udHJvbCByZWdpc3RlcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuYyBiL2FyY2gvYXJtL253ZnBlL2ZwbW9kdWxlLmMKaW5kZXggYTgwNmZlYS4uYThlZmNmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuYworKysgYi9hcmNoL2FybS9ud2ZwZS9mcG1vZHVsZS5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAiZnBhMTEuaCIKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogLyogWFhYICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTM2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwpAQCAtMCwwICsxLDExMiBAQAoraWYgQVJDSF9PTUFQCisKK21lbnUgIlRJIE9NQVAgSW1wbGVtZW50YXRpb25zIgorCitjb25maWcgQVJDSF9PTUFQX09URworCWJvb2wKKworY2hvaWNlCisJcHJvbXB0ICJPTUFQIFN5c3RlbSBUeXBlIgorCWRlZmF1bHQgQVJDSF9PTUFQMQorCitjb25maWcgQVJDSF9PTUFQMQorCWJvb2wgIlRJIE9NQVAxIgorCitjb25maWcgQVJDSF9PTUFQMgorCWJvb2wgIlRJIE9NQVAyIgorCitlbmRjaG9pY2UKKworY29tbWVudCAiT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMiCisKK2NvbmZpZyBPTUFQX1JFU0VUX0NMT0NLUworCWJvb2wgIlJlc2V0IHVudXNlZCBjbG9ja3MgZHVyaW5nIGJvb3QiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byByZXNldCB1bnVzZWQgY2xvY2tzIGR1cmluZyBib290LgorCSAgVGhpcyBvcHRpb24gc2F2ZXMgcG93ZXIsIGJ1dCBhc3N1bWVzIGFsbCBkcml2ZXJzIGFyZQorCSAgdXNpbmcgdGhlIGNsb2NrIGZyYW1ld29yay4gQnJva2VuIGRyaXZlcnMgdGhhdCBkbyBub3QKKwkgIHlldCB1c2UgY2xvY2sgZnJhbWV3b3JrIG1heSBub3Qgd29yayB3aXRoIHRoaXMgb3B0aW9uLgorCSAgSWYgeW91IGFyZSBib290aW5nIGZyb20gYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtLCB5b3UKKwkgIHByb2JhYmx5IGRvIG5vdCB3YW50IHRoaXMgb3B0aW9uIGVuYWJsZWQgdW50aWwgeW91cgorCSAgZGV2aWNlIGRyaXZlcnMgd29yayBwcm9wZXJseS4KKworY29uZmlnIE9NQVBfTVVYCisJYm9vbCAiT01BUCBtdWx0aXBsZXhpbmcgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX09NQVAKKwlkZWZhdWx0IHkKKyAgICAgICAgaGVscAorICAgICAgICAgIFBpbiBtdWx0aXBsZXhpbmcgc3VwcG9ydCBmb3IgT01BUCBib2FyZHMuIElmIHlvdXIgYm9vdGxvYWRlcgorICAgICAgICAgIHNldHMgdGhlIG11bHRpcGxleGluZyBjb3JyZWN0bHksIHNheSBOLiBPdGhlcndpc2UsIG9yIGlmIHVuc3VyZSwKKyAgICAgICAgICBzYXkgWS4KKworY29uZmlnIE9NQVBfTVVYX0RFQlVHCisJYm9vbCAiTXVsdGlwbGV4aW5nIGRlYnVnIG91dHB1dCIKKyAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAorICAgICAgICBkZWZhdWx0IG4KKyAgICAgICAgaGVscAorICAgICAgICAgIE1ha2VzIHRoZSBtdWx0aXBsZXhpbmcgZnVuY3Rpb25zIHByaW50IG91dCBhIGxvdCBvZiBkZWJ1ZyBpbmZvLgorICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZpbmQgb3V0IHRoZSBjb3JyZWN0IHZhbHVlcyBvZiB0aGUKKyAgICAgICAgICBtdWx0aXBsZXhpbmcgcmVnaXN0ZXJzLgorCitjb25maWcgT01BUF9NVVhfV0FSTklOR1MKKwlib29sICJXYXJuIGFib3V0IHBpbnMgdGhlIGJvb3Rsb2FkZXIgZGlkbid0IHNldCB1cCIKKyAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAorICAgICAgICBkZWZhdWx0IHkKKyAgICAgICAgaGVscAorCSAgQ2hvb3NlIFkgaGVyZSB0byB3YXJuIHdoZW5ldmVyIGRyaXZlciBpbml0aWFsaXphdGlvbiBsb2dpYyBuZWVkcworCSAgdG8gY2hhbmdlIHRoZSBwaW4gbXVsdGlwbGV4aW5nIHNldHVwLiAgV2hlbiB0aGVyZSBhcmUgbm8gd2FybmluZ3MKKwkgIHByaW50ZWQsIGl0J3Mgc2FmZSB0byBkZXNlbGVjdCBPTUFQX01VWCBmb3IgeW91ciBwcm9kdWN0LgorCitjaG9pY2UKKyAgICAgICAgcHJvbXB0ICJTeXN0ZW0gdGltZXIiCisJZGVmYXVsdCBPTUFQX01QVV9USU1FUgorCitjb25maWcgT01BUF9NUFVfVElNRVIKKwlib29sICJVc2UgbXB1IHRpbWVyIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIE9NQVAgbXB1IHRpbWVyLiBUaGlzCisJICB0aW1lciBwcm92aWRlcyBtb3JlIGludHJhLXRpY2sgcmVzb2x1dGlvbiB0aGFuIHRoZSAzMktIeiB0aW1lciwKKwkgIGJ1dCBjb25zdW1lcyBtb3JlIHBvd2VyLgorCitjb25maWcgT01BUF8zMktfVElNRVIKKwlib29sICJVc2UgMzJLSHogdGltZXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgT01BUCAzMktIeiB0aW1lci4KKwkgIFRoaXMgdGltZXIgc2F2ZXMgcG93ZXIgY29tcGFyZWQgdG8gdGhlIE9NQVBfTVBVX1RJTUVSLCBhbmQgaGFzCisJICBzdXBwb3J0IGZvciBubyB0aWNrIGR1cmluZyBpZGxlLiBUaGUgMzJLSHogdGltZXIgcHJvdmlkZXMgbGVzcworCSAgaW50cmEtdGljayByZXNvbHV0aW9uIHRoYW4gT01BUF9NUFVfVElNRVIuIFRoZSAzMktIeiB0aW1lciBpcworCSAgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBPTUFQLTE2eHguCisKK2VuZGNob2ljZQorCitjb25maWcgT01BUF8zMktfVElNRVJfSFoKKyAgICAgICBpbnQgIktlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgZm9yIDMyS0h6IHRpbWVyIgorICAgICAgIHJhbmdlIDMyIDEwMjQKKyAgICAgICBkZXBlbmRzIG9uIE9NQVBfMzJLX1RJTUVSCisgICAgICAgZGVmYXVsdCAiMTI4IgorICAgICAgIGhlbHAKKwkgIEtlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgc2hvdWxkIGJlIGEgZGl2aXNvciBvZiAzMjc2OCwKKwkgIHN1Y2ggYXMgNjQgb3IgMTI4LgorCitjaG9pY2UKKwlwcm9tcHQgIkxvdy1sZXZlbCBkZWJ1ZyBjb25zb2xlIFVBUlQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAKKwlkZWZhdWx0IE9NQVBfTExfREVCVUdfVUFSVDEKKworY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDEKKwlib29sICJVQVJUMSIKKworY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDIKKwlib29sICJVQVJUMiIKKworY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDMKKwlib29sICJVQVJUMyIKKworZW5kY2hvaWNlCisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzFlMTFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgQ29tbW9uIHN1cHBvcnQKK29iai15IDo9IGNvbW1vbi5vIGRtYS5vIGNsb2NrLm8gbXV4Lm8gZ3Bpby5vIG1jYnNwLm8gdXNiLm8KK29iai1tIDo9CitvYmotbiA6PQorb2JqLSAgOj0KKworIyBPQ1BJIGludGVyY29ubmVjdCBzdXBwb3J0IGZvciAxNzEwLCAxNjEwIGFuZCA1OTEyCitvYmotJChDT05GSUdfQVJDSF9PTUFQMTZYWCkgKz0gb2NwaS5vCisKKyMgUG93ZXIgTWFuYWdlbWVudAorb2JqLSQoQ09ORklHX1BNKSArPSBwbS5vIHNsZWVwLm8KKworb2JqLSQoQ09ORklHX0NQVV9GUkVRKSArPSBjcHUtb21hcC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9jbG9jay5jCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYwppbmRleCBlOTExODZiLi41OWQ5MWIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmMKKyAqICBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgY29ycG9yYXRpb24KICAqICBXcml0dGVuIGJ5IFR1dWtrYSBUaWtrYW5lbiA8dHV1a2thLnRpa2thbmVuQGVsZWt0cm9iaXQuY29tPgpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KQEAgLTI1LDYgKzI2LDggQEAKIHN0YXRpYyBERUNMQVJFX01VVEVYKGNsb2Nrc19zZW0pOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja2Z3X2xvY2spOwogc3RhdGljIHZvaWQgcHJvcGFnYXRlX3JhdGUoc3RydWN0IGNsayAqICBjbGspOworLyogVUFSVCBjbG9jayBmdW5jdGlvbiAqLworc3RhdGljIGludCBzZXRfdWFydF9yYXRlKHN0cnVjdCBjbGsgKiBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CiAvKiBFeHRlcm5hbCBjbG9jayAoTUNMSyAmIEJDTEspIGZ1bmN0aW9ucyAqLwogc3RhdGljIGludCBzZXRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwogc3RhdGljIGxvbmcgcm91bmRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwpAQCAtMzQsNyArMzcsNyBAQAogc3RhdGljIGxvbmcgcm91bmRfdG9fdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKIHZvaWQgY2xrX3NldGRwbGwoX191MTYsIF9fdTE2KTsKIAotc3RydWN0IG1wdV9yYXRlIHJhdGVfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbXB1X3JhdGUgcmF0ZV90YWJsZVtdID0gewogCS8qIE1QVSBNSHosIHh0YWwgTUh6LCBkcGxsMSBNSHosIENLQ1RMLCBEUExMX0NUTAogCSAqIGFybWRpdiwgZHNwZGl2LCBkc3BtbXUsIHRjZGl2LCBwZXJkaXYsIGxjZGRpdgogCSAqLwpAQCAtNDgsNyArNTEsNyBAQAogCXsgMTkyMDAwMDAwLCAxOTIwMDAwMCwgMTkyMDAwMDAwLCAweDA1MGYsIDB4MjUxMCB9LCAvKiAxLzEvMi8yLzgvOCAqLwogCXsgMTkyMDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDA1MGYsIDB4MjgxMCB9LCAvKiAxLzEvMi8yLzgvOCAqLwogCXsgIDk2MDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDA1NWYsIDB4MjgxMCB9LCAvKiAyLzIvMi8yLzgvOCAqLwotCXsgIDQ4MDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDBjY2YsIDB4MjgxMCB9LCAvKiA0LzQvNC80LzgvOCAqLworCXsgIDQ4MDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDBiYWYsIDB4MjgxMCB9LCAvKiA0LzgvNC80LzgvOCAqLwogCXsgIDI0MDAwMDAwLCAxMjAwMDAwMCwgMTkyMDAwMDAwLCAweDBmZmYsIDB4MjgxMCB9LCAvKiA4LzgvOC84LzgvOCAqLwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTgyTUhaKQpAQCAtNTgsNyArNjEsNyBAQAogCXsgMTY4MDAwMDAwLCAxMjAwMDAwMCwgMTY4MDAwMDAwLCAweDAxMGYsIDB4MjcxMCB9LCAvKiAxLzEvMS8yLzgvOCAqLwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTUwTUhaKQotCXsgMTUwMDAwMDAwLCAxMjAwMDAwMCwgMTUwMDAwMDAwLCAweDE1MGEsIDB4MmNiMCB9LCAvKiAwLzAvMS8xLzIvMiAqLworCXsgMTUwMDAwMDAwLCAxMjAwMDAwMCwgMTUwMDAwMDAwLCAweDAxMGEsIDB4MmNiMCB9LCAvKiAxLzEvMS8yLzQvNCAqLwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMTIwTUhaKQogCXsgMTIwMDAwMDAwLCAxMjAwMDAwMCwgMTIwMDAwMDAwLCAweDAxMGEsIDB4MjUxMCB9LCAvKiAxLzEvMS8yLzQvNCAqLwpAQCAtNzYsMTkgKzc5LDExIEBACiB9OwogCiAKLXN0YXRpYyB2b2lkIGNrY3RsX3JlY2FsYyhzdHJ1Y3QgY2xrICogIGNsaykKLXsKLQlpbnQgZHNvcjsKLQotCS8qIENhbGN1bGF0ZSBkaXZpc29yIGVuY29kZWQgYXMgMi1iaXQgZXhwb25lbnQgKi8KLQlkc29yID0gMSA8PCAoMyAmIChvbWFwX3JlYWR3KEFSTV9DS0NUTCkgPj4gY2xrLT5yYXRlX29mZnNldCkpOwotCWlmICh1bmxpa2VseShjbGstPnJhdGUgPT0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkc29yKSkKLQkJcmV0dXJuOyAvKiBObyBjaGFuZ2UsIHF1aWNrIGV4aXQgKi8KLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGRzb3I7Ci0KLQlpZiAodW5saWtlbHkoY2xrLT5mbGFncyAmIFJBVEVfUFJPUEFHQVRFUykpCi0JCXByb3BhZ2F0ZV9yYXRlKGNsayk7Ci19CitzdGF0aWMgdm9pZCBja2N0bF9yZWNhbGMoc3RydWN0IGNsayAqICBjbGspOworaW50IF9fY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBfX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsayk7Cit2b2lkIF9fY2xrX3VudXNlKHN0cnVjdCBjbGsgKmNsayk7CitpbnQgX19jbGtfdXNlKHN0cnVjdCBjbGsgKmNsayk7CiAKIAogc3RhdGljIHZvaWQgZm9sbG93cGFyZW50X3JlY2FsYyhzdHJ1Y3QgY2xrICogIGNsaykKQEAgLTEwMiw2ICs5NywxNCBAQAogCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gMTQ7CiB9CiAKK3N0YXRpYyB2b2lkIHVhcnRfcmVjYWxjKHN0cnVjdCBjbGsgKiBjbGspCit7CisJdW5zaWduZWQgaW50IHZhbCA9IG9tYXBfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwlpZiAodmFsICYgY2xrLT5lbmFibGVfYml0KQorCQljbGstPnJhdGUgPSA0ODAwMDAwMDsKKwllbHNlCisJCWNsay0+cmF0ZSA9IDEyMDAwMDAwOworfQogCiBzdGF0aWMgc3RydWN0IGNsayBja19yZWYgPSB7CiAJLm5hbWUJCT0gImNrX3JlZiIsCkBAIC0xMzgsNyArMTQxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGFybXBlcl9jayA9IHsKIAkubmFtZQkJPSAiYXJtcGVyX2NrIiwKIAkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA3MzAgfCBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKIAkJCSAgUkFURV9DS0NUTCwKIAkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAogCS5lbmFibGVfYml0CT0gRU5fUEVSQ0ssCkBAIC0xODUsNyArMTg4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGFybWludGhfY2sxNnh4ID0gewogCS5uYW1lCQk9ICJhcm1pbnRoX2NrIiwKIAkucGFyZW50CQk9ICZhcm1fY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IEFMV0FZU19FTkFCTEVELAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiAJLyogTm90ZTogT24gMTZ4eCB0aGUgZnJlcXVlbmN5IGNhbiBiZSBkaXZpZGVkIGJ5IDIgYnkgcHJvZ3JhbW1pbmcKIAkgKiBBUk1fQ0tDVEw6QVJNX0lOVEhDS19TRUwoMTQpIHRvIDEKQEAgLTIxNCw2ICsyMTcsMzggQEAKIAkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayBkc3BwZXJfY2sgPSB7CisJLm5hbWUJCT0gImRzcHBlcl9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMIHwgRFNQX0RPTUFJTl9DTE9DSyB8IFZJUlRVQUxfSU9fQUREUkVTUywKKwkuZW5hYmxlX3JlZwk9IERTUF9JRExFQ1QyLAorCS5lbmFibGVfYml0CT0gRU5fUEVSQ0ssCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfUEVSRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS8vLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNweG9yX2NrID0geworCS5uYW1lCQk9ICJkc3B4b3JfY2siLAorCS5wYXJlbnQJCT0gJmNrX3JlZiwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJCQkgIERTUF9ET01BSU5fQ0xPQ0sgfCBWSVJUVUFMX0lPX0FERFJFU1MsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX1hPUlBDSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNwdGltX2NrID0geworCS5uYW1lCQk9ICJkc3B0aW1fY2siLAorCS5wYXJlbnQJCT0gJmNrX3JlZiwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJCQkgIERTUF9ET01BSU5fQ0xPQ0sgfCBWSVJUVUFMX0lPX0FERFJFU1MsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX0RTUFRJTUNLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCiBzdGF0aWMgc3RydWN0IGNsayB0Y19jayA9IHsKIAkubmFtZQkJPSAidGNfY2siLAogCS5wYXJlbnQJCT0gJmNrX2RwbGwxLApAQCAtMjI2LDcgKzI2MSw3IEBACiBzdGF0aWMgc3RydWN0IGNsayBhcm1pbnRoX2NrMTUxMCA9IHsKIAkubmFtZQkJPSAiYXJtaW50aF9jayIsCiAJLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IEFMV0FZU19FTkFCTEVELAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiAJLyogTm90ZTogT24gMTUxMCB0aGUgZnJlcXVlbmN5IGZvbGxvd3MgVENfQ0sKIAkgKgpAQCAtMjM3LDcgKzI3Miw3IEBACiBzdGF0aWMgc3RydWN0IGNsayB0aXBiX2NrID0gewogCS5uYW1lCQk9ICJ0aWJwX2NrIiwKIAkucGFyZW50CQk9ICZ0Y19jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQUxXQVlTX0VOQUJMRUQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI3MSwxNCArMzA2LDE1IEBACiBzdGF0aWMgc3RydWN0IGNsayBkbWFfY2sgPSB7CiAJLm5hbWUJCT0gImRtYV9jayIsCiAJLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBBTFdBWVNfRU5BQkxFRCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZG1hX2xjZGZyZWVfY2sgPSB7CiAJLm5hbWUJCT0gImRtYV9sY2RmcmVlX2NrIiwKIAkucGFyZW50CQk9ICZ0Y19jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYIHwgQUxXQVlTX0VOQUJMRUQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTMwMywxNCArMzM5LDE0IEBACiBzdGF0aWMgc3RydWN0IGNsayByaGVhMV9jayA9IHsKIAkubmFtZQkJPSAicmhlYTFfY2siLAogCS5wYXJlbnQJCT0gJnRjX2NrLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBBTFdBWVNfRU5BQkxFRCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgcmhlYTJfY2sgPSB7CiAJLm5hbWUJCT0gInJoZWEyX2NrIiwKIAkucGFyZW50CQk9ICZ0Y19jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYIHwgQUxXQVlTX0VOQUJMRUQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTMyNSw0MyArMzYxLDU1IEBACiAJLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgdWFydDFfY2sgPSB7CitzdGF0aWMgc3RydWN0IGNsayB1YXJ0MV8xNTEwID0geworCS5uYW1lCQk9ICJ1YXJ0MV9jayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgRU5BQkxFX1JFR18zMkJJVCB8IEFMV0FZU19FTkFCTEVELAorCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAorCS5lbmFibGVfYml0CT0gMjksCS8qIENob29zZXMgYmV0d2VlbiAxMk1IeiBhbmQgNDhNSHogKi8KKwkuc2V0X3JhdGUJPSAmc2V0X3VhcnRfcmF0ZSwKKwkucmVjYWxjCQk9ICZ1YXJ0X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQxXzE2eHggPSB7CiAJLm5hbWUJCT0gInVhcnQxX2NrIiwKIAkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KIAkucmF0ZQkJPSA0ODAwMDAwMCwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAogCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAogCS5lbmFibGVfYml0CT0gMjksCi0JLyogKE9ubHkgb24gMTUxMCkKLQkgKiBUaGUgImVuYWJsZSBiaXQiIGFjdHVhbGx5IGNob29zZXMgYmV0d2VlbiA0OE1IeiBhbmQgMTJNSHouCi0JICovCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB1YXJ0Ml9jayA9IHsKIAkubmFtZQkJPSAidWFydDJfY2siLAogCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwotCS5yYXRlCQk9IDQ4MDAwMDAwLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKLQkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfCBFTkFCTEVfUkVHXzMyQklULAogCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAotCS5lbmFibGVfYml0CT0gMzAsCi0JLyogKGZvciBib3RoIDE1MTAgYW5kIDE2eHgpCi0JICogVGhlICJlbmFibGUgYml0IiBhY3R1YWxseSBjaG9vc2VzIGJldHdlZW4gNDhNSHogYW5kIDEyTUh6LzMya0h6LgotCSAqLworCS5lbmFibGVfYml0CT0gMzAsCS8qIENob29zZXMgYmV0d2VlbiAxMk1IeiBhbmQgNDhNSHogKi8KKwkuc2V0X3JhdGUJPSAmc2V0X3VhcnRfcmF0ZSwKKwkucmVjYWxjCQk9ICZ1YXJ0X3JlY2FsYywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQzX2NrID0geworc3RhdGljIHN0cnVjdCBjbGsgdWFydDNfMTUxMCA9IHsKKwkubmFtZQkJPSAidWFydDNfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDEyMDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IEVOQUJMRV9SRUdfMzJCSVQgfCBBTFdBWVNfRU5BQkxFRCwKKwkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKKwkuZW5hYmxlX2JpdAk9IDMxLAkvKiBDaG9vc2VzIGJldHdlZW4gMTJNSHogYW5kIDQ4TUh6ICovCisJLnNldF9yYXRlCT0gJnNldF91YXJ0X3JhdGUsCisJLnJlY2FsYwkJPSAmdWFydF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0M18xNnh4ID0gewogCS5uYW1lCQk9ICJ1YXJ0M19jayIsCiAJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCiAJLnJhdGUJCT0gNDgwMDAwMDAsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAotCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKIAkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKIAkuZW5hYmxlX2JpdAk9IDMxLAotCS8qIChPbmx5IG9uIDE1MTApCi0JICogVGhlICJlbmFibGUgYml0IiBhY3R1YWxseSBjaG9vc2VzIGJldHdlZW4gNDhNSHogYW5kIDEyTUh6LgotCSAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdXNiX2Nsa28gPSB7CS8qIDYgTUh6IG91dHB1dCBvbiBXNF9VU0JfQ0xLTyAqLwpAQCAtNDgwLDYgKzUyOCw5IEBACiAJLyogQ0tfR0VOMiBjbG9ja3MgKi8KIAkmZHNwX2NrLAogCSZkc3BtbXVfY2ssCisJJmRzcHBlcl9jaywKKwkmZHNweG9yX2NrLAorCSZkc3B0aW1fY2ssCiAJLyogQ0tfR0VOMyBjbG9ja3MgKi8KIAkmdGNfY2ssCiAJJnRpcGJfY2ssCkBAIC00OTQsOSArNTQ1LDExIEBACiAJJnJoZWEyX2NrLAogCSZsY2RfY2ssCiAJLyogVUxQRCBjbG9ja3MgKi8KLQkmdWFydDFfY2ssCisJJnVhcnQxXzE1MTAsCisJJnVhcnQxXzE2eHgsCiAJJnVhcnQyX2NrLAotCSZ1YXJ0M19jaywKKwkmdWFydDNfMTUxMCwKKwkmdWFydDNfMTZ4eCwKIAkmdXNiX2Nsa28sCiAJJnVzYl9oaGNfY2sxNTEwLCAmdXNiX2hoY19jazE2eHgsCiAJJm1jbGtfMTUxMCwgICZtY2xrXzE2eHgsCkBAIC01NDcsMTQgKzYwMCwzNCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoY2xrLT5mbGFncyAmIERTUF9ET01BSU5fQ0xPQ0spIHsKKwkJX19jbGtfdXNlKCZhcGlfY2spOworCX0KKwogCWlmIChjbGstPmZsYWdzICYgRU5BQkxFX1JFR18zMkJJVCkgewotCQlyZWd2YWwzMiA9IG9tYXBfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKLQkJcmVndmFsMzIgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKLQkJb21hcF93cml0ZWwocmVndmFsMzIsIGNsay0+ZW5hYmxlX3JlZyk7CisJCWlmIChjbGstPmZsYWdzICYgVklSVFVBTF9JT19BRERSRVNTKSB7CisJCQlyZWd2YWwzMiA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJCQlyZWd2YWwzMiB8PSAoMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQkJX19yYXdfd3JpdGVsKHJlZ3ZhbDMyLCBjbGstPmVuYWJsZV9yZWcpOworCQl9IGVsc2UgeworCQkJcmVndmFsMzIgPSBvbWFwX3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJCQlyZWd2YWwzMiB8PSAoMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQkJb21hcF93cml0ZWwocmVndmFsMzIsIGNsay0+ZW5hYmxlX3JlZyk7CisJCX0KIAl9IGVsc2UgewotCQlyZWd2YWwxNiA9IG9tYXBfcmVhZHcoY2xrLT5lbmFibGVfcmVnKTsKLQkJcmVndmFsMTYgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKLQkJb21hcF93cml0ZXcocmVndmFsMTYsIGNsay0+ZW5hYmxlX3JlZyk7CisJCWlmIChjbGstPmZsYWdzICYgVklSVFVBTF9JT19BRERSRVNTKSB7CisJCQlyZWd2YWwxNiA9IF9fcmF3X3JlYWR3KGNsay0+ZW5hYmxlX3JlZyk7CisJCQlyZWd2YWwxNiB8PSAoMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQkJX19yYXdfd3JpdGV3KHJlZ3ZhbDE2LCBjbGstPmVuYWJsZV9yZWcpOworCQl9IGVsc2UgeworCQkJcmVndmFsMTYgPSBvbWFwX3JlYWR3KGNsay0+ZW5hYmxlX3JlZyk7CisJCQlyZWd2YWwxNiB8PSAoMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQkJb21hcF93cml0ZXcocmVndmFsMTYsIGNsay0+ZW5hYmxlX3JlZyk7CisJCX0KKwl9CisKKwlpZiAoY2xrLT5mbGFncyAmIERTUF9ET01BSU5fQ0xPQ0spIHsKKwkJX19jbGtfdW51c2UoJmFwaV9jayk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC01NjksMTQgKzY0MiwzNCBAQAogCWlmIChjbGstPmVuYWJsZV9yZWcgPT0gMCkKIAkJcmV0dXJuOwogCisJaWYgKGNsay0+ZmxhZ3MgJiBEU1BfRE9NQUlOX0NMT0NLKSB7CisJCV9fY2xrX3VzZSgmYXBpX2NrKTsKKwl9CisKIAlpZiAoY2xrLT5mbGFncyAmIEVOQUJMRV9SRUdfMzJCSVQpIHsKLQkJcmVndmFsMzIgPSBvbWFwX3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7Ci0JCXJlZ3ZhbDMyICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOwotCQlvbWFwX3dyaXRlbChyZWd2YWwzMiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJaWYgKGNsay0+ZmxhZ3MgJiBWSVJUVUFMX0lPX0FERFJFU1MpIHsKKwkJCXJlZ3ZhbDMyID0gX19yYXdfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwkJCXJlZ3ZhbDMyICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQkJX19yYXdfd3JpdGVsKHJlZ3ZhbDMyLCBjbGstPmVuYWJsZV9yZWcpOworCQl9IGVsc2UgeworCQkJcmVndmFsMzIgPSBvbWFwX3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJCQlyZWd2YWwzMiAmPSB+KDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCW9tYXBfd3JpdGVsKHJlZ3ZhbDMyLCBjbGstPmVuYWJsZV9yZWcpOworCQl9CiAJfSBlbHNlIHsKLQkJcmVndmFsMTYgPSBvbWFwX3JlYWR3KGNsay0+ZW5hYmxlX3JlZyk7Ci0JCXJlZ3ZhbDE2ICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOwotCQlvbWFwX3dyaXRldyhyZWd2YWwxNiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJaWYgKGNsay0+ZmxhZ3MgJiBWSVJUVUFMX0lPX0FERFJFU1MpIHsKKwkJCXJlZ3ZhbDE2ID0gX19yYXdfcmVhZHcoY2xrLT5lbmFibGVfcmVnKTsKKwkJCXJlZ3ZhbDE2ICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQkJX19yYXdfd3JpdGV3KHJlZ3ZhbDE2LCBjbGstPmVuYWJsZV9yZWcpOworCQl9IGVsc2UgeworCQkJcmVndmFsMTYgPSBvbWFwX3JlYWR3KGNsay0+ZW5hYmxlX3JlZyk7CisJCQlyZWd2YWwxNiAmPSB+KDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCW9tYXBfd3JpdGV3KHJlZ3ZhbDE2LCBjbGstPmVuYWJsZV9yZWcpOworCQl9CisJfQorCisJaWYgKGNsay0+ZmxhZ3MgJiBEU1BfRE9NQUlOX0NMT0NLKSB7CisJCV9fY2xrX3VudXNlKCZhcGlfY2spOwogCX0KIH0KIApAQCAtNzY2LDYgKzg1OSwzMyBAQAogCXJldHVybiBkc29yX2V4cDsKIH0KIAorCitzdGF0aWMgdm9pZCBja2N0bF9yZWNhbGMoc3RydWN0IGNsayAqICBjbGspCit7CisJaW50IGRzb3I7CisKKwkvKiBDYWxjdWxhdGUgZGl2aXNvciBlbmNvZGVkIGFzIDItYml0IGV4cG9uZW50ICovCisJaWYgKGNsay0+ZmxhZ3MgJiBEU1BfRE9NQUlOX0NMT0NLKSB7CisJCS8qIFRoZSBjbG9jayBjb250cm9sIGJpdHMgYXJlIGluIERTUCBkb21haW4sCisJCSAqIHNvIGFwaV9jayBpcyBuZWVkZWQgZm9yIGFjY2Vzcy4KKwkJICogTm90ZSB0aGF0IERTUF9DS0NUTCB2aXJ0IGFkZHIgPSBwaHlzIGFkZHIsIHNvCisJCSAqIHdlIG11c3QgdXNlIF9fcmF3X3JlYWR3KCkgaW5zdGVhZCBvZiBvbWFwX3JlYWR3KCkuCisJCSAqLworCQlfX2Nsa191c2UoJmFwaV9jayk7CisJCWRzb3IgPSAxIDw8ICgzICYgKF9fcmF3X3JlYWR3KERTUF9DS0NUTCkgPj4gY2xrLT5yYXRlX29mZnNldCkpOworCQlfX2Nsa191bnVzZSgmYXBpX2NrKTsKKwl9IGVsc2UgeworCQlkc29yID0gMSA8PCAoMyAmIChvbWFwX3JlYWR3KEFSTV9DS0NUTCkgPj4gY2xrLT5yYXRlX29mZnNldCkpOworCX0KKwlpZiAodW5saWtlbHkoY2xrLT5yYXRlID09IGNsay0+cGFyZW50LT5yYXRlIC8gZHNvcikpCisJCXJldHVybjsgLyogTm8gY2hhbmdlLCBxdWljayBleGl0ICovCisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkc29yOworCisJaWYgKHVubGlrZWx5KGNsay0+ZmxhZ3MgJiBSQVRFX1BST1BBR0FURVMpKQorCQlwcm9wYWdhdGVfcmF0ZShjbGspOworfQorCisKIGxvbmcgY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJaW50IGRzb3JfZXhwOwpAQCAtODI2LDYgKzk0Niw5IEBACiAJaWYgKCFwdHItPnJhdGUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKCFwdHItPnJhdGUpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKHVubGlrZWx5KGNrX2RwbGwxLnJhdGUgPT0gMCkpIHsKIAkJb21hcF93cml0ZXcocHRyLT5kcGxsY3RsX3ZhbCwgRFBMTF9DVEwpOwogCQlja19kcGxsMS5yYXRlID0gcHRyLT5wbGxfcmF0ZTsKQEAgLTkyMSw2ICsxMDQ0LDIzIEBACiAJcmV0dXJuIGRzb3I7CiB9CiAKKy8qIE9ubHkgbmVlZGVkIG9uIDE1MTAgKi8KK3N0YXRpYyBpbnQgc2V0X3VhcnRfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IG9tYXBfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwlpZiAocmF0ZSA9PSAxMjAwMDAwMCkKKwkJdmFsICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCWVsc2UgaWYgKHJhdGUgPT0gNDgwMDAwMDApCisJCXZhbCB8PSAoMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJb21hcF93cml0ZWwodmFsLCBjbGstPmVuYWJsZV9yZWcpOworCWNsay0+cmF0ZSA9IHJhdGU7CisKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGludCBzZXRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CkBAIC05ODUsNyArMTEyNSwxOCBAQAogfQogRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CiAKLQorI2lmZGVmIENPTkZJR19PTUFQX1JFU0VUX0NMT0NLUworLyoKKyAqIFJlc2V0cyBzb21lIGNsb2NrcyB0aGF0IG1heSBiZSBsZWZ0IG9uIGZyb20gYm9vdGxvYWRlciwKKyAqIGJ1dCBsZWF2ZXMgc2VyaWFsIGNsb2NrcyBvbi4gU2VlIGFsc28gb21hcF9sYXRlX2Nsa19yZXNldCgpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9lYXJseV9jbGtfcmVzZXQodm9pZCkKK3sKKwkvL29tYXBfd3JpdGVsKDB4MyA8PCAyOSwgTU9EX0NPTkZfQ1RSTF8wKTsKK30KKyNlbHNlCisjZGVmaW5lIG9tYXBfZWFybHlfY2xrX3Jlc2V0KCkJe30KKyNlbmRpZgogCiBpbnQgX19pbml0IGNsa19pbml0KHZvaWQpCiB7CkBAIC05OTMsNiArMTE0NCw4IEBACiAJY29uc3Qgc3RydWN0IG9tYXBfY2xvY2tfY29uZmlnICppbmZvOwogCWludCBjcnlzdGFsX3R5cGUgPSAwOyAvKiBEZWZhdWx0IDEyIE1IeiAqLwogCisJb21hcF9lYXJseV9jbGtfcmVzZXQoKTsKKwogCWZvciAoY2xrcCA9IG9uY2hpcF9jbGtzOyBjbGtwIDwgb25jaGlwX2Nsa3MrQVJSQVlfU0laRShvbmNoaXBfY2xrcyk7IGNsa3ArKykgewogCQlpZiAoKCgqY2xrcCktPmZsYWdzICZDTE9DS19JTl9PTUFQMTUxMCkgJiYgY3B1X2lzX29tYXAxNTEwKCkpIHsKIAkJCWNsa19yZWdpc3RlcigqY2xrcCk7CkBAIC0xMDIzLDkgKzExNzYsNDIgQEAKIAkJY2tfcmVmLnJhdGUgPSAxOTIwMDAwMDsKICNlbmRpZgogCisJcHJpbnRrKCJDbG9ja3M6IEFSTV9TWVNTVDogMHglMDR4IERQTExfQ1RMOiAweCUwNHggQVJNX0NLQ1RMOiAweCUwNHhcbiIsCisJICAgICAgIG9tYXBfcmVhZHcoQVJNX1NZU1NUKSwgb21hcF9yZWFkdyhEUExMX0NUTCksCisJICAgICAgIG9tYXBfcmVhZHcoQVJNX0NLQ1RMKSk7CisKIAkvKiBXZSB3YW50IHRvIGJlIGluIHN5bmNyb25vdXMgc2NhbGFibGUgbW9kZSAqLwogCW9tYXBfd3JpdGV3KDB4MTAwMCwgQVJNX1NZU1NUKTsKIAorI2lmZGVmIENPTkZJR19PTUFQX0NMT0NLU19TRVRfQllfQk9PVExPQURFUgorCS8qIFVzZSB2YWx1ZXMgc2V0IGJ5IGJvb3Rsb2FkZXIuIERldGVybWluZSBQTEwgcmF0ZSBhbmQgcmVjYWxjdWxhdGUKKwkgKiBkZXBlbmRlbnQgY2xvY2tzIGFzIGlmIGtlcm5lbCBoYWQgY2hhbmdlZCBQTEwgb3IgZGl2aXNvcnMuCisJICovCisJeworCQl1bnNpZ25lZCBwbGxfY3RsX3ZhbCA9IG9tYXBfcmVhZHcoRFBMTF9DVEwpOworCisJCWNrX2RwbGwxLnJhdGUgPSBja19yZWYucmF0ZTsgLyogQmFzZSB4dGFsIHJhdGUgKi8KKwkJaWYgKHBsbF9jdGxfdmFsICYgMHgxMCkgeworCQkJLyogUExMIGVuYWJsZWQsIGFwcGx5IG11bHRpcGxpZXIgYW5kIGRpdmlzb3IgKi8KKwkJCWlmIChwbGxfY3RsX3ZhbCAmIDB4ZjgwKQorCQkJCWNrX2RwbGwxLnJhdGUgKj0gKHBsbF9jdGxfdmFsICYgMHhmODApID4+IDc7CisJCQlja19kcGxsMS5yYXRlIC89ICgocGxsX2N0bF92YWwgJiAweDYwKSA+PiA1KSArIDE7CisJCX0gZWxzZSB7CisJCQkvKiBQTEwgZGlzYWJsZWQsIGFwcGx5IGJ5cGFzcyBkaXZpc29yICovCisJCQlzd2l0Y2ggKHBsbF9jdGxfdmFsICYgMHhjKSB7CisJCQljYXNlIDA6CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NDoKKwkJCQlja19kcGxsMS5yYXRlIC89IDI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNrX2RwbGwxLnJhdGUgLz0gNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlwcm9wYWdhdGVfcmF0ZSgmY2tfZHBsbDEpOworI2Vsc2UKIAkvKiBGaW5kIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBmcmVxdWVuY3kgYW5kIGVuYWJsZSBpdCAqLwogCWlmIChzZWxlY3RfdGFibGVfcmF0ZSgmdmlydHVhbF9ja19tcHUsIH4wKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlN5c3RlbSBmcmVxdWVuY2llcyBub3Qgc2V0LiBDaGVjayB5b3VyIGNvbmZpZy5cbiIpOwpAQCAtMTAzNCwxMiArMTIyMCwxMyBAQAogCQlvbWFwX3dyaXRldygweDEwMDUsIEFSTV9DS0NUTCk7CiAJCWNrX2RwbGwxLnJhdGUgPSA2MDAwMDAwMDsKIAkJcHJvcGFnYXRlX3JhdGUoJmNrX2RwbGwxKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2xvY2tpbmcgcmF0ZSAoeHRhbC9EUExMMS9NUFUpOiAlbGQvJWxkLyVsZFxuIiwKLQkJICAgICAgIGNrX3JlZi5yYXRlLCBja19kcGxsMS5yYXRlLCBhcm1fY2sucmF0ZSk7CiAJfQotCisjZW5kaWYKIAkvKiBDYWNoZSByYXRlcyBmb3IgY2xvY2tzIGNvbm5lY3RlZCB0byBja19yZWYgKG5vdCBkcGxsMSkgKi8KIAlwcm9wYWdhdGVfcmF0ZSgmY2tfcmVmKTsKKwlwcmludGsoS0VSTl9JTkZPICJDbG9ja2luZyByYXRlICh4dGFsL0RQTEwxL01QVSk6ICVsZC4lMDFsZC8lbGQvJWxkIE1IelxuIiwKKwkgICAgICAgY2tfcmVmLnJhdGUgLyAxMDAwMDAwLCAoY2tfcmVmLnJhdGUgLyAxMDAwMDApICUgMTAsCisJICAgICAgIGNrX2RwbGwxLnJhdGUsIGFybV9jay5yYXRlKTsKIAogI2lmZGVmIENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIKIAkvKiBTZWxlY3Qgc2xpY2VyIG91dHB1dCBhcyBPTUFQIGlucHV0IGNsb2NrICovCkBAIC0xMDc0LDMgKzEyNjEsNjMgQEAKIAogCXJldHVybiAwOwogfQorCisKKyNpZmRlZiBDT05GSUdfT01BUF9SRVNFVF9DTE9DS1MKKworc3RhdGljIGludCBfX2luaXQgb21hcF9sYXRlX2Nsa19yZXNldCh2b2lkKQoreworCS8qIFR1cm4gb2ZmIGFsbCB1bnVzZWQgY2xvY2tzICovCisJc3RydWN0IGNsayAqcDsKKwlfX3UzMiByZWd2YWwzMjsKKworCW9tYXBfd3JpdGV3KDAsIFNPRlRfUkVRX1JFRyk7CisJb21hcF93cml0ZXcoMCwgU09GVF9SRVFfUkVHMik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKKwkJaWYgKHAtPnVzZWNvdW50ID4gMCB8fCAocC0+ZmxhZ3MgJiBBTFdBWVNfRU5BQkxFRCkgfHwKKwkJCXAtPmVuYWJsZV9yZWcgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFzc3VtZSBubyBEU1AgY2xvY2tzIGhhdmUgYmVlbiBhY3RpdmF0ZWQgYnkgYm9vdGxvYWRlciAqLworCQlpZiAocC0+ZmxhZ3MgJiBEU1BfRE9NQUlOX0NMT0NLKQorCQkJY29udGludWU7CisKKwkJLyogSXMgdGhlIGNsb2NrIGFscmVhZHkgZGlzYWJsZWQ/ICovCisJCWlmIChwLT5mbGFncyAmIEVOQUJMRV9SRUdfMzJCSVQpIHsKKwkJCWlmIChwLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykKKwkJCQlyZWd2YWwzMiA9IF9fcmF3X3JlYWRsKHAtPmVuYWJsZV9yZWcpOworCQkJZWxzZQorCQkJCXJlZ3ZhbDMyID0gb21hcF9yZWFkbChwLT5lbmFibGVfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykKKwkJCQlyZWd2YWwzMiA9IF9fcmF3X3JlYWR3KHAtPmVuYWJsZV9yZWcpOworCQkJZWxzZQorCQkJCXJlZ3ZhbDMyID0gb21hcF9yZWFkdyhwLT5lbmFibGVfcmVnKTsKKwkJfQorCisJCWlmICgocmVndmFsMzIgJiAoMSA8PCBwLT5lbmFibGVfYml0KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZJWE1FOiBUaGlzIGNsb2NrIHNlZW1zIHRvIGJlIG5lY2Vzc2FyeSBidXQgbm8tb25lCisJCSAqIGhhcyBhc2tlZCBmb3IgaXRzIGFjdGl2YXRpb24uICovCisJCWlmIChwID09ICZ0YzJfY2sgICAgICAgICAvLyBGSVg6IHBtLmMgKFNSQU0pLCBDQ1AsIENhbWVyYQorCQkgICAgfHwgcCA9PSAmY2tfZHBsbDFvdXQgLy8gRklYOiBTb1NTSSwgU1NSCisJCSAgICB8fCBwID09ICZhcm1fZ3Bpb19jayAvLyBGSVg6IEdQSU8gY29kZSBmb3IgMTUxMAorCQkgICAgKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJGSVhNRTogQ2xvY2sgXCIlc1wiIHNlZW1zIHVudXNlZFxuIiwKKwkJCSAgICAgICBwLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIHVudXNlZCBjbG9jayBcIiVzXCIuLi4gIiwgcC0+bmFtZSk7CisJCV9fY2xrX2Rpc2FibGUocCk7CisJCXByaW50aygiIGRvbmVcbiIpOworCX0KKworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKG9tYXBfbGF0ZV9jbGtfcmVzZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmgKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5oCmluZGV4IDA4YzBkZGQuLmE4OWUxZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suaAorICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5oCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBjb3Jwb3JhdGlvbgogICogIFdyaXR0ZW4gYnkgVHV1a2thIFRpa2thbmVuIDx0dXVra2EudGlra2FuZW5AZWxla3Ryb2JpdC5jb20+CkBAIC01Miw2ICs1Miw4IEBACiAjZGVmaW5lIENMT0NLX0lOX09NQVAxNlhYCTY0CiAjZGVmaW5lIENMT0NLX0lOX09NQVAxNTEwCTEyOAogI2RlZmluZSBDTE9DS19JTl9PTUFQNzMwCTI1NgorI2RlZmluZSBEU1BfRE9NQUlOX0NMT0NLCTUxMgorI2RlZmluZSBWSVJUVUFMX0lPX0FERFJFU1MJMTAyNAogCiAvKiBBUk1fQ0tDVEwgYml0IHNoaWZ0cyAqLwogI2RlZmluZSBDS0NUTF9QRVJESVZfT0ZGU0VUCTAKQEAgLTYzLDYgKzY1LDggQEAKIC8qI2RlZmluZSBBUk1fVElNWE8JCTEyKi8KICNkZWZpbmUgRU5fRFNQQ0sJCTEzCiAvKiNkZWZpbmUgQVJNX0lOVEhDS19TRUwJMTQqLyAvKiBEaXZpZGUtYnktMiBmb3IgbXB1IGludGhfY2sgKi8KKy8qIERTUF9DS0NUTCBiaXQgc2hpZnRzICovCisjZGVmaW5lIENLQ1RMX0RTUFBFUkRJVl9PRkZTRVQJMAogCiAvKiBBUk1fSURMRUNUMSBiaXQgc2hpZnRzICovCiAvKiNkZWZpbmUgSURMV0RUX0FSTQkwKi8KQEAgLTk2LDYgKzEwMCw5IEBACiAjZGVmaW5lIEVOX1RDMV9DSwkyCiAjZGVmaW5lIEVOX1RDMl9DSwk0CiAKKy8qIERTUF9JRExFQ1QyIGJpdCBzaGlmdHMgKDAsMSwyIGFyZSBzYW1lIGFzIGZvciBBUk1fSURMRUNUMikgKi8KKyNkZWZpbmUgRU5fRFNQVElNQ0sJNQorCiAvKiBWYXJpb3VzIHJlZ2lzdGVyIGRlZmluZXMgZm9yIGNsb2NrIGNvbnRyb2xzIHNjYXR0ZXJlZCBhcm91bmQgT01BUCBjaGlwICovCiAjZGVmaW5lIFVTQl9NQ0xLX0VOX0JJVAkJNAkvKiBJbiBVTFBEX0NMS0NfQ1RSTCAqLwogI2RlZmluZSBVU0JfSE9TVF9ISENfVUhPU1RfRU4JOQkvKiBJbiBNT0RfQ09ORl9DVFJMXzAgKi8KQEAgLTEwMyw3ICsxMTAsOCBAQAogI2RlZmluZSBDT01fVUxQRF9QTExfQ0xLX1JFUQkxCS8qIEluIENPTV9DTEtfRElWX0NUUkxfU0VMICovCiAjZGVmaW5lIFNXRF9DTEtfRElWX0NUUkxfU0VMCTB4ZmZmZTA4NzQKICNkZWZpbmUgQ09NX0NMS19ESVZfQ1RSTF9TRUwJMHhmZmZlMDg3OAotCisjZGVmaW5lIFNPRlRfUkVRX1JFRwkJMHhmZmZlMDgzNAorI2RlZmluZSBTT0ZUX1JFUV9SRUcyCQkweGZmZmUwODgwCiAKIGludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKTsKIHZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTk2N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCisgKgorICogQ29kZSBjb21tb24gdG8gYWxsIE9NQVAgbWFjaGluZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKworI2RlZmluZSBOT19MRU5HVEhfQ0hFQ0sgMHhmZmZmZmZmZgorCitleHRlcm4gaW50IG9tYXBfYm9vdGxvYWRlcl90YWdfbGVuOworZXh0ZXJuIHU4IG9tYXBfYm9vdGxvYWRlcl90YWdbXTsKKworc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCAqb21hcF9ib2FyZF9jb25maWc7CitpbnQgb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IDA7CisKK3N0YXRpYyBjb25zdCB2b2lkICpnZXRfY29uZmlnKHUxNiB0YWcsIHNpemVfdCBsZW4sIGludCBza2lwLCBzaXplX3QgKmxlbl9vdXQpCit7CisJc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCAqa2luZm8gPSBOVUxMOworCWludCBpOworCisjaWZkZWYgQ09ORklHX09NQVBfQk9PVF9UQUcKKwlzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgKmluZm8gPSBOVUxMOworCisJaWYgKG9tYXBfYm9vdGxvYWRlcl90YWdfbGVuID4gNCkKKwkJaW5mbyA9IChzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgKikgb21hcF9ib290bG9hZGVyX3RhZzsKKwl3aGlsZSAoaW5mbyAhPSBOVUxMKSB7CisJCXU4ICpuZXh0OworCisJCWlmIChpbmZvLT50YWcgPT0gdGFnKSB7CisJCQlpZiAoc2tpcCA9PSAwKQorCQkJCWJyZWFrOworCQkJc2tpcC0tOworCQl9CisKKwkJaWYgKChpbmZvLT5sZW4gJiAweDAzKSAhPSAwKSB7CisJCQkvKiBXZSBiYWlsIG91dCB0byBhdm9pZCBhbiBhbGlnbm1lbnQgZmF1bHQgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiT01BUCBwZXJpcGhlcmFsIGNvbmZpZzogTGVuZ3RoICglZCkgbm90IHdvcmQtYWxpZ25lZCAodGFnICUwNHgpXG4iLAorCQkJICAgICAgIGluZm8tPmxlbiwgaW5mby0+dGFnKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW5leHQgPSAodTggKikgaW5mbyArIHNpemVvZigqaW5mbykgKyBpbmZvLT5sZW47CisJCWlmIChuZXh0ID49IG9tYXBfYm9vdGxvYWRlcl90YWcgKyBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbikKKwkJCWluZm8gPSBOVUxMOworCQllbHNlCisJCQlpbmZvID0gKHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSAqKSBuZXh0OworCX0KKwlpZiAoaW5mbyAhPSBOVUxMKSB7CisJCS8qIENoZWNrIHRoZSBsZW5ndGggYXMgYSBsYW1lIGF0dGVtcHQgdG8gY2hlY2sgZm9yCisJCSAqIGJpbmFyeSBpbmNvbnNpc3RhbmN5LiAqLworCQlpZiAobGVuICE9IE5PX0xFTkdUSF9DSEVDSykgeworCQkJLyogV29yZC1hbGlnbiBsZW4gKi8KKwkJCWlmIChsZW4gJiAweDAzKQorCQkJCWxlbiA9IChsZW4gKyAzKSAmIH4weDAzOworCQkJaWYgKGluZm8tPmxlbiAhPSBsZW4pIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIk9NQVAgcGVyaXBoZXJhbCBjb25maWc6IExlbmd0aCBtaXNtYXRjaCB3aXRoIHRhZyAleCAod2FudCAlZCwgZ290ICVkKVxuIiwKKwkJCQkgICAgICAgdGFnLCBsZW4sIGluZm8tPmxlbik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKGxlbl9vdXQgIT0gTlVMTCkKKwkJCSpsZW5fb3V0ID0gaW5mby0+bGVuOworCQlyZXR1cm4gaW5mby0+ZGF0YTsKKwl9CisjZW5kaWYKKwkvKiBUcnkgdG8gZmluZCB0aGUgY29uZmlnIGZyb20gdGhlIGJvYXJkLXNwZWNpZmljIHN0cnVjdHVyZXMKKwkgKiBpbiB0aGUga2VybmVsLiAqLworCWZvciAoaSA9IDA7IGkgPCBvbWFwX2JvYXJkX2NvbmZpZ19zaXplOyBpKyspIHsKKwkJaWYgKG9tYXBfYm9hcmRfY29uZmlnW2ldLnRhZyA9PSB0YWcpIHsKKwkJCWtpbmZvID0gJm9tYXBfYm9hcmRfY29uZmlnW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGtpbmZvID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBraW5mby0+ZGF0YTsKK30KKworY29uc3Qgdm9pZCAqX19vbWFwX2dldF9jb25maWcodTE2IHRhZywgc2l6ZV90IGxlbiwgaW50IG5yKQoreworICAgICAgICByZXR1cm4gZ2V0X2NvbmZpZyh0YWcsIGxlbiwgbnIsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTChfX29tYXBfZ2V0X2NvbmZpZyk7CisKK2NvbnN0IHZvaWQgKm9tYXBfZ2V0X3Zhcl9jb25maWcodTE2IHRhZywgc2l6ZV90ICpsZW4pCit7CisgICAgICAgIHJldHVybiBnZXRfY29uZmlnKHRhZywgTk9fTEVOR1RIX0NIRUNLLCAwLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2dldF92YXJfY29uZmlnKTsKKworc3RhdGljIGludCBfX2luaXQgb21hcF9hZGRfc2VyaWFsX2NvbnNvbGUodm9pZCkKK3sKKwljb25zdCBzdHJ1Y3Qgb21hcF9zZXJpYWxfY29uc29sZV9jb25maWcgKmluZm87CisKKwlpbmZvID0gb21hcF9nZXRfY29uZmlnKE9NQVBfVEFHX1NFUklBTF9DT05TT0xFLAorCQkJICAgICAgIHN0cnVjdCBvbWFwX3NlcmlhbF9jb25zb2xlX2NvbmZpZyk7CisJaWYgKGluZm8gIT0gTlVMTCAmJiBpbmZvLT5jb25zb2xlX3VhcnQpIHsKKwkJc3RhdGljIGNoYXIgc3BlZWRbMTFdLCAqb3B0ID0gTlVMTDsKKworCQlpZiAoaW5mby0+Y29uc29sZV9zcGVlZCkgeworCQkJc25wcmludGYoc3BlZWQsIHNpemVvZihzcGVlZCksICIldSIsIGluZm8tPmNvbnNvbGVfc3BlZWQpOworCQkJb3B0ID0gc3BlZWQ7CisJCX0KKwkJcmV0dXJuIGFkZF9wcmVmZXJyZWRfY29uc29sZSgidHR5UyIsIGluZm8tPmNvbnNvbGVfdWFydCAtIDEsIG9wdCk7CisJfQorCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChvbWFwX2FkZF9zZXJpYWxfY29uc29sZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY3B1LW9tYXAuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jcHUtb21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOWFhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvY3B1LW9tYXAuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvY3B1LW9tYXAuYworICoKKyAqICBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgZm9yIE9NQVAKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiAgV3JpdHRlbiBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgorICoKKyAqICBCYXNlZCBvbiBjcHUtc2ExMTEwLmMsIENvcHlyaWdodCAoQykgMjAwMSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisKKy8qIFRPRE86IEFkZCBzdXBwb3J0IGZvciBTRFJBTSB0aW1pbmcgY2hhbmdlcyAqLworCitpbnQgb21hcF92ZXJpZnlfc3BlZWQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGNsayAqIG1wdV9jbGs7CisKKwlpZiAocG9saWN5LT5jcHUpCisJCXJldHVybiAtRUlOVkFMOworCisJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwKKwkJCQkgICAgIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7CisJbXB1X2NsayA9IGNsa19nZXQoTlVMTCwgIm1wdSIpOworCWlmIChJU19FUlIobXB1X2NsaykpCisJCXJldHVybiBQVFJfRVJSKG1wdV9jbGspOworCXBvbGljeS0+bWluID0gY2xrX3JvdW5kX3JhdGUobXB1X2NsaywgcG9saWN5LT5taW4gKiAxMDAwKSAvIDEwMDA7CisJcG9saWN5LT5tYXggPSBjbGtfcm91bmRfcmF0ZShtcHVfY2xrLCBwb2xpY3ktPm1heCAqIDEwMDApIC8gMTAwMDsKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxLAorCQkJCSAgICAgcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKTsKKwljbGtfcHV0KG1wdV9jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCBvbWFwX2dldHNwZWVkKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNsayAqIG1wdV9jbGs7CisJdW5zaWduZWQgbG9uZyByYXRlOworCisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisKKwltcHVfY2xrID0gY2xrX2dldChOVUxMLCAibXB1Iik7CisJaWYgKElTX0VSUihtcHVfY2xrKSkKKwkJcmV0dXJuIDA7CisJcmF0ZSA9IGNsa19nZXRfcmF0ZShtcHVfY2xrKSAvIDEwMDA7CisJY2xrX3B1dChtcHVfY2xrKTsKKworCXJldHVybiByYXRlOworfQorCitzdGF0aWMgaW50IG9tYXBfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCQkgICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXN0cnVjdCBjbGsgKiBtcHVfY2xrOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCWludCByZXQgPSAwOworCisJbXB1X2NsayA9IGNsa19nZXQoTlVMTCwgIm1wdSIpOworCWlmIChJU19FUlIobXB1X2NsaykpCisJCXJldHVybiBQVFJfRVJSKG1wdV9jbGspOworCisJZnJlcXMub2xkID0gb21hcF9nZXRzcGVlZCgwKTsKKwlmcmVxcy5uZXcgPSBjbGtfcm91bmRfcmF0ZShtcHVfY2xrLCB0YXJnZXRfZnJlcSAqIDEwMDApIC8gMTAwMDsKKwlmcmVxcy5jcHUgPSAwOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwlyZXQgPSBjbGtfc2V0X3JhdGUobXB1X2NsaywgdGFyZ2V0X2ZyZXEgKiAxMDAwKTsKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwljbGtfcHV0KG1wdV9jbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgb21hcF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgY2xrICogbXB1X2NsazsKKworCW1wdV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJtcHUiKTsKKwlpZiAoSVNfRVJSKG1wdV9jbGspKQorCQlyZXR1cm4gUFRSX0VSUihtcHVfY2xrKTsKKworCWlmIChwb2xpY3ktPmNwdSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwb2xpY3ktPmN1ciA9IHBvbGljeS0+bWluID0gcG9saWN5LT5tYXggPSBvbWFwX2dldHNwZWVkKDApOworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxID0gY2xrX3JvdW5kX3JhdGUobXB1X2NsaywgMCkgLyAxMDAwOworCXBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSA9IGNsa19yb3VuZF9yYXRlKG1wdV9jbGssIDIxNjAwMDAwMCkgLyAxMDAwOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJY2xrX3B1dChtcHVfY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIG9tYXBfZHJpdmVyID0geworCS5mbGFncwkJPSBDUFVGUkVRX1NUSUNLWSwKKwkudmVyaWZ5CQk9IG9tYXBfdmVyaWZ5X3NwZWVkLAorCS50YXJnZXQJCT0gb21hcF90YXJnZXQsCisJLmdldAkJPSBvbWFwX2dldHNwZWVkLAorCS5pbml0CQk9IG9tYXBfY3B1X2luaXQsCisJLm5hbWUJCT0gIm9tYXAiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcF9jcHVmcmVxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJm9tYXBfZHJpdmVyKTsKK30KKworYXJjaF9pbml0Y2FsbChvbWFwX2NwdWZyZXFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvZG1hLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2RtYS5jCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKaW5kZXggN2E5ZWJlOC4uYzBhNWMyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2RtYS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9vbWFwL2RtYS5jCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTm9raWEgQ29ycG9yYXRpb24KICAqIEF1dGhvcjogSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KQEAgLTc5NCwxMCArNzk0LDYgQEAKIAl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwogCS8qIEFsd2F5cyBzZXQgdGhlIHNvdXJjZSBwb3J0IGFzIFNEUkFNIGZvciBub3cqLwogCXcgJj0gfigweDAzIDw8IDYpOwotCWlmIChsY2RfZG1hLmV4dF9jdHJsKQotCQl3IHw9IDEgPDwgODsKLQllbHNlCi0JCXcgJj0gfigxIDw8IDgpOwogCWlmIChsY2RfZG1hLmNhbGxiYWNrICE9IE5VTEwpCiAJCXcgfD0gMSA8PCAxOyAgICAgICAgICAgIC8qIEJsb2NrIGludGVycnVwdCBlbmFibGUgKi8KIAllbHNlCkBAIC04ODksOSArODg1LDE1IEBACiAJICovCiAJaWYgKGVuYWJsZV8xNTEwX21vZGUgfHwgIWxjZF9kbWEuZXh0X2N0cmwpCiAJCXJldHVybjsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJdyB8PSAxIDw8IDg7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKwogCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKIAl3IHw9IDEgPDwgNzsKIAlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NDUik7CisKIAlsY2RfZG1hLmFjdGl2ZSA9IDE7CiB9CiAKQEAgLTkyMiwxMCArOTI0LDE5IEBACiAKIHZvaWQgb21hcF9zdG9wX2xjZF9kbWEodm9pZCkKIHsKKwl1MTYgdzsKKwogCWxjZF9kbWEuYWN0aXZlID0gMDsKLQlpZiAoIWVuYWJsZV8xNTEwX21vZGUgJiYgbGNkX2RtYS5leHRfY3RybCkKLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUikgJiB+KDEgPDwgNyksCi0JCQkgICAgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCWlmIChlbmFibGVfMTUxMF9tb2RlIHx8ICFsY2RfZG1hLmV4dF9jdHJsKQorCQlyZXR1cm47CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7CisJdyAmPSB+KDEgPDwgNyk7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKwl3ICY9IH4oMSA8PCA4KTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwogfQogCiAvKgpAQCAtOTcyLDYgKzk4MywyNSBAQAogCQkJICAgICAoT01BUF9ETUFfQ0RTQV9VKGxjaCkgPDwgMTYpKTsKIH0KIAoraW50IG9tYXBfZG1hX3J1bm5pbmcodm9pZCkKK3sKKwlpbnQgbGNoOworCisJLyogQ2hlY2sgaWYgTENEIERNQSBpcyBydW5uaW5nICovCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQorCQlpZiAob21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUikgJiBPTUFQX0RNQV9DQ1JfRU4pCisJCQlyZXR1cm4gMTsKKworCWZvciAobGNoID0gMDsgbGNoIDwgZG1hX2NoYW5fY291bnQ7IGxjaCsrKSB7CisJCXUxNiB3OworCisJCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKKwkJaWYgKHcgJiBPTUFQX0RNQV9DQ1JfRU4pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IG9tYXBfaW5pdF9kbWEodm9pZCkKIHsKIAlpbnQgY2gsIHI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvZ3Bpby5jCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCmluZGV4IDkwNDVkZmQuLjFjODViNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2dwaW8uYworICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKICAqCiAgKiBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgT01BUCBHUElPCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL21jYnNwLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYwpzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvbWNic3AuYwpyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKaW5kZXggN2M0YWQ3Ny4uNDM1NjdkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vb21hcC9tY2JzcC5jCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgogICogQXV0aG9yOiBTYW11ZWwgT3J0aXogPHNhbXVlbC5vcnRpekBub2tpYS5jb20+CkBAIC02Niw2ICs2Niw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfbWNic3AgbWNic3BbT01BUF9NQVhfTUNCU1BfQ09VTlRdOwogc3RhdGljIHN0cnVjdCBjbGsgKm1jYnNwX2RzcF9jayA9IDA7CiBzdGF0aWMgc3RydWN0IGNsayAqbWNic3BfYXBpX2NrID0gMDsKK3N0YXRpYyBzdHJ1Y3QgY2xrICptY2JzcF9kc3B4b3JfY2sgPSAwOwogCiAKIHN0YXRpYyB2b2lkIG9tYXBfbWNic3BfZHVtcF9yZWcodTggaWQpCkBAIC0xNzUsNyArMTc2LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpIHx8IGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpIHx8IGNwdV9pc19vbWFwMTZ4eCgpKSB7CiAJCWlmIChpZCA+IE9NQVBfTUFYX01DQlNQX0NPVU5UKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIk9NQVAtTWNCU1A6IE1jQlNQJWQgZG9lc24ndCBleGlzdFxuIiwgaWQgKyAxKTsKIAkJCXJldHVybiAtMTsKQEAgLTE5MSwxNSArMTkyLDEyIEBACiAKIHN0YXRpYyB2b2lkIG9tYXBfbWNic3BfZHNwX3JlcXVlc3Qodm9pZCkKIHsKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkgfHwgY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJb21hcF93cml0ZXcoKG9tYXBfcmVhZHcoQVJNX1JTVENUMSkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKLQkJCSAgICBBUk1fUlNUQ1QxKTsKLQkJY2xrX2VuYWJsZShtY2JzcF9kc3BfY2spOwotCQljbGtfZW5hYmxlKG1jYnNwX2FwaV9jayk7CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpIHx8IGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWNsa191c2UobWNic3BfZHNwX2NrKTsKKwkJY2xrX3VzZShtY2JzcF9hcGlfY2spOwogCiAJCS8qIGVuYWJsZSAxMk1IeiBjbG9jayB0byBtY2JzcCAxICYgMyAqLwotCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoRFNQX0lETEVDVDIpIHwgKDEgPDwgRU5fWE9SUENLKSwKLQkJCSAgICAgRFNQX0lETEVDVDIpOworCQljbGtfdXNlKG1jYnNwX2RzcHhvcl9jayk7CiAJCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhEU1BfUlNUQ1QyKSB8IDEgfCAxIDw8IDEsCiAJCQkgICAgIERTUF9SU1RDVDIpOwogCX0KQEAgLTIwNywxMCArMjA1LDEzIEBACiAKIHN0YXRpYyB2b2lkIG9tYXBfbWNic3BfZHNwX2ZyZWUodm9pZCkKIHsKLQkvKiBVc2VsZXNzIGZvciBub3cgKi8KKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkgfHwgY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJY2xrX3VudXNlKG1jYnNwX2RzcHhvcl9jayk7CisJCWNsa191bnVzZShtY2JzcF9kc3BfY2spOworCQljbGtfdW51c2UobWNic3BfYXBpX2NrKTsKKwl9CiB9CiAKLQogaW50IG9tYXBfbWNic3BfcmVxdWVzdCh1bnNpZ25lZCBpbnQgaWQpCiB7CiAJaW50IGVycjsKQEAgLTM1MCw2ICszNTEsNzMgQEAKIH0KIAogCisvKiBwb2xsZWQgbWNic3AgaS9vIG9wZXJhdGlvbnMgKi8KK2ludCBvbWFwX21jYnNwX3BvbGx3cml0ZSh1bnNpZ25lZCBpbnQgaWQsIHUxNiBidWYpCit7CisJdTMyIGJhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKKwl3cml0ZXcoYnVmLCBiYXNlICsgT01BUF9NQ0JTUF9SRUdfRFhSMSk7CisJLyogaWYgZnJhbWUgc3luYyBlcnJvciAtIGNsZWFyIHRoZSBlcnJvciAqLworCWlmIChyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpICYgWFNZTkNfRVJSKSB7CisJCS8qIGNsZWFyIGVycm9yICovCisJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpICYgKH5YU1lOQ19FUlIpLAorCQkgICAgICAgYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IyKTsKKwkJLyogcmVzZW5kICovCisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQkvKiB3YWl0IGZvciB0cmFuc21pdCBjb25maXJtYXRpb24gKi8KKwkJaW50IGF0dGVtcHMgPSAwOworCQl3aGlsZSAoIShyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpICYgWFJEWSkpIHsKKwkJCWlmIChhdHRlbXBzKysgPiAxMDAwKSB7CisJCQkJd3JpdGV3KHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMikgJgorCQkJCSAgICAgICAoflhSU1QpLAorCQkJCSAgICAgICBiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpOworCQkJCXVkZWxheSgxMCk7CisJCQkJd3JpdGV3KHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMikgfAorCQkJCSAgICAgICAoWFJTVCksCisJCQkJICAgICAgIGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMik7CisJCQkJdWRlbGF5KDEwKTsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgIiBDb3VsZCBub3Qgd3JpdGUgdG8gTWNCU1AgUmVnaXN0ZXJcbiIpOworCQkJCXJldHVybiAtMjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG9tYXBfbWNic3BfcG9sbHJlYWQodW5zaWduZWQgaW50IGlkLCB1MTYgKiBidWYpCit7CisJdTMyIGJhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKKwkvKiBpZiBmcmFtZSBzeW5jIGVycm9yIC0gY2xlYXIgdGhlIGVycm9yICovCisJaWYgKHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMSkgJiBSU1lOQ19FUlIpIHsKKwkJLyogY2xlYXIgZXJyb3IgKi8KKwkJd3JpdGV3KHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMSkgJiAoflJTWU5DX0VSUiksCisJCSAgICAgICBiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpOworCQkvKiByZXNlbmQgKi8KKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCS8qIHdhaXQgZm9yIHJlY2lldmUgY29uZmlybWF0aW9uICovCisJCWludCBhdHRlbXBzID0gMDsKKwkJd2hpbGUgKCEocmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKSAmIFJSRFkpKSB7CisJCQlpZiAoYXR0ZW1wcysrID4gMTAwMCkgeworCQkJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpICYKKwkJCQkgICAgICAgKH5SUlNUKSwKKwkJCQkgICAgICAgYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKTsKKwkJCQl1ZGVsYXkoMTApOworCQkJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpIHwKKwkJCQkgICAgICAgKFJSU1QpLAorCQkJCSAgICAgICBiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpOworCQkJCXVkZWxheSgxMCk7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIgQ291bGQgbm90IHJlYWQgZnJvbSBNY0JTUCBSZWdpc3RlclxuIik7CisJCQkJcmV0dXJuIC0yOworCQkJfQorCQl9CisJfQorCSpidWYgPSByZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfRFJSMSk7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBJUlEgYmFzZWQgd29yZCB0cmFuc21pc3Npb24uCiAgKi8KQEAgLTYyNSwxMCArNjkzLDE1IEBACiAJCXJldHVybiBQVFJfRVJSKG1jYnNwX2RzcF9jayk7CiAJfQogCW1jYnNwX2FwaV9jayA9IGNsa19nZXQoMCwgImFwaV9jayIpOwotCWlmIChJU19FUlIobWNic3BfZHNwX2NrKSkgeworCWlmIChJU19FUlIobWNic3BfYXBpX2NrKSkgewogCQlwcmludGsoS0VSTl9FUlIgIm1jYnNwOiBjb3VsZCBub3QgYWNxdWlyZSBhcGlfY2sgaGFuZGxlLlxuIik7CiAJCXJldHVybiBQVFJfRVJSKG1jYnNwX2FwaV9jayk7CiAJfQorCW1jYnNwX2RzcHhvcl9jayA9IGNsa19nZXQoMCwgImRzcHhvcl9jayIpOworCWlmIChJU19FUlIobWNic3BfZHNweG9yX2NrKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1jYnNwOiBjb3VsZCBub3QgYWNxdWlyZSBkc3B4b3JfY2sgaGFuZGxlLlxuIik7CisJCXJldHVybiBQVFJfRVJSKG1jYnNwX2RzcHhvcl9jayk7CisJfQogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAogCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CkBAIC02NDMsNyArNzE2LDcgQEAKIAl9CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQotCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgeworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewogCQltY2JzcF9pbmZvID0gbWNic3BfMTYxMDsKIAkJbWNic3BfY291bnQgPSBBUlJBWV9TSVpFKG1jYnNwXzE2MTApOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9tdXguYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYwpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvbXV4LmMKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtb21hcC9tdXguYwppbmRleCBiY2YzYzZlLi5lYTdiOTU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvbXV4LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9tdXguYworICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jCiAgKgogICogVXRpbGl0eSB0byBzZXQgdGhlIE9tYXAgTVVYIGFuZCBQVUxMX0RXTiByZWdpc3RlcnMgZnJvbSBhIHRhYmxlIGluIG11eC5oCiAgKgpAQCAtNTMsMTkgKzUzLDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWNmZyA9ICZyZWdfY2ZnX3RhYmxlW3JlZ19jZmddOwotCi0JLyoKLQkgKiBXZSBkbyBhIHByZXR0eSBsb25nIHNlY3Rpb24gaGVyZSB3aXRoIGxvY2sgb24sIGJ1dCBwaW4gbXV4aW5nCi0JICogc2hvdWxkIG9ubHkgaGFwcGVuIG9uIGRyaXZlciBpbml0IGZvciBlYWNoIGRyaXZlciwgc28gaXQncyBub3QgdGltZQotCSAqIGNyaXRpY2FsLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7CisJY2ZnID0gKHJlZ19jZmdfc2V0ICopJnJlZ19jZmdfdGFibGVbcmVnX2NmZ107CiAKIAkvKiBDaGVjayB0aGUgbXV4IHJlZ2lzdGVyIGluIHF1ZXN0aW9uICovCiAJaWYgKGNmZy0+bXV4X3JlZykgewogCQl1bnNpZ25lZAl0bXAxLCB0bXAyOwogCisJCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7CiAJCXJlZ19vcmlnID0gb21hcF9yZWFkbChjZmctPm11eF9yZWcpOwogCiAJCS8qIFRoZSBtdXggcmVnaXN0ZXJzIGFsd2F5cyBzZWVtIHRvIGJlIDMgYml0cyBsb25nICovCkBAIC04MCwxMSArNzQsMTMgQEAKIAkJCXdhcm4gPSAxOwogCiAJCW9tYXBfd3JpdGVsKHJlZywgY2ZnLT5tdXhfcmVnKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOwogCX0KIAogCS8qIENoZWNrIGZvciBwdWxsIHVwIG9yIHB1bGwgZG93biBzZWxlY3Rpb24gb24gMTYxMCAqLwogCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKIAkJaWYgKGNmZy0+cHVfcGRfcmVnICYmIGNmZy0+cHVsbF92YWwpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7CiAJCQlwdV9wZF9vcmlnID0gb21hcF9yZWFkbChjZmctPnB1X3BkX3JlZyk7CiAJCQltYXNrID0gMSA8PCBjZmctPnB1bGxfYml0OwogCkBAIC0xMDAsMTEgKzk2LDEzIEBACiAJCQkJcHVfcGQgPSBwdV9wZF9vcmlnICYgfm1hc2s7CiAJCQl9CiAJCQlvbWFwX3dyaXRlbChwdV9wZCwgY2ZnLT5wdV9wZF9yZWcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOwogCQl9CiAJfQogCiAJLyogQ2hlY2sgZm9yIGFuIGFzc29jaWF0ZWQgcHVsbCBkb3duIHJlZ2lzdGVyICovCiAJaWYgKGNmZy0+cHVsbF9yZWcpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKIAkJcHVsbF9vcmlnID0gb21hcF9yZWFkbChjZmctPnB1bGxfcmVnKTsKIAkJbWFzayA9IDEgPDwgY2ZnLT5wdWxsX2JpdDsKIApAQCAtMTIxLDYgKzExOSw3IEBACiAJCX0KIAogCQlvbWFwX3dyaXRlbChwdWxsLCBjZmctPnB1bGxfcmVnKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOwogCX0KIAogCWlmICh3YXJuKSB7CkBAIC0xNDksOCArMTQ4LDYgQEAKIAl9CiAjZW5kaWYKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKLQogI2lmZGVmIENPTkZJR19PTUFQX01VWF9FUlJPUlMKIAlyZXR1cm4gd2FybiA/IC1FVFhUQlNZIDogMDsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvb2NwaS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvb2NwaS5jCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCmluZGV4IGM5Y2VkMTMuLjJlZGUyZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9vY3BpLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvb2NwaS5jCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCiAgKgogICogTWluaW1hbCBPQ1AgYnVzIHN1cHBvcnQgZm9yIG9tYXAxNnh4CiAgKgpAQCAtMjUsNyArMjUsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9wbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL3BtLmMKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtb21hcC9wbS5jCmluZGV4IDZiMDNjY2QuLmU2NTM2YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9wbS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9wbS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9wbS5jCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvcG0uYwogICoKICAqIE9NQVAgUG93ZXIgTWFuYWdlbWVudCBSb3V0aW5lcwogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9zbGVlcC5TIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL3NsZWVwLlMKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtb21hcC9zbGVlcC5TCmluZGV4IDRkNDI2ZDEuLjI3OTQ5MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9zbGVlcC5TCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zbGVlcC5TCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9zbGVlcC5TCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvc2xlZXAuUwogICoKICAqIExvdy1sZXZlbCBPTUFQMTUxMC8xNjEwIHNsZWVwL3dha2VVcCBzdXBwb3J0CiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC91c2IuYwpyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCmluZGV4IGZkNDgzZmYuLjI1YmM0YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC91c2IuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jIC0tIHBsYXRmb3JtIGxldmVsIFVTQiBpbml0aWFsaXphdGlvbgorICogYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jIC0tIHBsYXRmb3JtIGxldmVsIFVTQiBpbml0aWFsaXphdGlvbgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogICoKQEAgLTMyNiw3ICszMjYsNyBAQAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvaGNpX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0CT0gT01BUF9PSENJX0JBU0UsCi0JCS5lbmQJPSBPTUFQX09IQ0lfQkFTRSArIDQwOTYsCisJCS5lbmQJPSBPTUFQX09IQ0lfQkFTRSArIDQwOTYgLSAxLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvS2NvbmZpZyBiL2FyY2gvYXJtMjYvS2NvbmZpZwppbmRleCBkYzBjMTkzLi4xZjAzNzMyIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L0tjb25maWcKKysrIGIvYXJjaC9hcm0yNi9LY29uZmlnCkBAIC0xODMsNiArMTgzLDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcGFycG9ydC9LY29uZmlnIgpAQCAtMTkzLDcgKzE5NSw3IEBACiAKIHNvdXJjZSAiZHJpdmVycy9tZC9LY29uZmlnIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaWRlL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9LY29uZmlnIGIvYXJjaC9jcmlzL0tjb25maWcKaW5kZXggZjg0OGUzNy4uZTU5NzlkNiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL0tjb25maWcKKysrIGIvYXJjaC9jcmlzL0tjb25maWcKQEAgLTEyMiw2ICsxMjIsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKICMgYnJpbmcgaW4gRVRSQVggYnVpbHQtaW4gZHJpdmVycwogbWVudSAiRHJpdmVycyBmb3IgYnVpbHQtaW4gaW50ZXJmYWNlcyIKIHNvdXJjZSBhcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9LY29uZmlnCkBAIC0xNDksNyArMTUxLDcgQEAKIAogc291cmNlICJkcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWciCiAKLXNvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L0tjb25maWcgYi9hcmNoL2Zydi9LY29uZmlnCmluZGV4IGM5M2Y5NTEuLmVjODVjMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L0tjb25maWcKKysrIGIvYXJjaC9mcnYvS2NvbmZpZwpAQCAtMzQ2LDYgKzM0Niw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2RlZmNvbmZpZyBiL2FyY2gvZnJ2L2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU0Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9mcnYvZGVmY29uZmlnCkBAIC0wLDAgKzEsNjI3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEuOAorIyBGcmkgTWF5IDEzIDE3OjE2OjAzIDIwMDUKKyMKK0NPTkZJR19GUlY9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorIyBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19IQVJESVJRUyBpcyBub3Qgc2V0CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tPQkpFQ1RfVUVWRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorCisjCisjIEZ1aml0c3UgRlItViBzeXN0ZW0gc2V0dXAKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX0ZSVl9PVVRPRkxJTkVfQVRPTUlDX09QUz15CitDT05GSUdfSElHSE1FTT15CitDT05GSUdfSElHSFBURT15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19GUlZfREVGTF9DQUNIRV9XQkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19GUlZfREVGTF9DQUNIRV9XQkVISU5EIGlzIG5vdCBzZXQKK0NPTkZJR19GUlZfREVGTF9DQUNIRV9XVEhSVT15CisjIENPTkZJR19GUlZfREVGTF9DQUNIRV9ESVNBQkxFRCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIGNvcmUgc3VwcG9ydAorIworQ09ORklHX0NQVV9GUjQ1MT15CitDT05GSUdfQ1BVX0ZSNDUxX0NPTVBJTEU9eQorQ09ORklHX0ZSVl9MMV9DQUNIRV9TSElGVD01CitDT05GSUdfTUI5MzA5MV9WREs9eQorIyBDT05GSUdfTUI5MzA5M19QREsgaXMgbm90IHNldAorQ09ORklHX01COTMwOTBfTUIwMD15CisjIENPTkZJR19NQjkzMDkxX05PX01CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQUkVMX0RBVEFfOCBpcyBub3Qgc2V0CitDT05GSUdfR1BSRUxfREFUQV80PXkKKyMgQ09ORklHX0dQUkVMX0RBVEFfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfUENJPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQSBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmb3JtYXRzCisjCisjIENPTkZJR19CSU5GTVRfRUxGIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGX0ZEUElDPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfRk9SS19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREJPRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTExfUlggaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorQ09ORklHX05FMktfUENJPXkKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xCitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMXzgyNTBfTVVMVElQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF84MjUwX1JTQSBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dEQlNUVUIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktaXJxLmMgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlycS5jCmluZGV4IDI0NjIyZDguLmFmOTgxYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktaXJxLmMKKysrIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1pcnEuYwpAQCAtNjAsNyArNjAsNyBAQAogCX0KIH0KIAotdm9pZCBfX2luaXQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCit2b2lkIF9faW5pdCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnIGIvYXJjaC9oODMwMC9LY29uZmlnCmluZGV4IDYyYTg5ZTguLjI2Njk4YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvS2NvbmZpZworKysgYi9hcmNoL2g4MzAwL0tjb25maWcKQEAgLTU1LDYgKzU1LDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbXRkL0tjb25maWciCkBAIC02NSw3ICs2Nyw3IEBACiAKIHNvdXJjZSAiYXJjaC9oODMwMC9LY29uZmlnLmlkZSIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogIwogIyBpbnB1dCAtIGlucHV0L2pveXN0aWNrIGRlcGVuZHMgb24gaXQuIEFzIGRvZXMgVVNCLgpAQCAtMTc5LDYgKzE4MSw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9pMmMvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL2h3bW9uL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy91c2IvS2NvbmZpZyIKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCA2YzAyMzM2Li5hODAxZDlkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtMTI4NSw2ICsxMjg1LDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCmluZGV4IGVlNzVjYjIuLjVlMjkxYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUKQEAgLTIsMyArMiw3IEBACiBvYmotJChDT05GSUdfWDg2X0lPX0FQSUMpCSs9IGVhcmx5cXVpcmsubwogb2JqLSQoQ09ORklHX0FDUElfU0xFRVApCSs9IHNsZWVwLm8gd2FrZXVwLm8KIAoraWZuZXEgKCQoQ09ORklHX0FDUElfUFJPQ0VTU09SKSwpCitvYmoteQkJCQkrPSBjc3RhdGUubworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzAzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBhcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24KKyAqIAlWZW5rYXRlc2ggUGFsbGlwYWRpIDx2ZW5rYXRlc2gucGFsbGlwYWRpQGludGVsLmNvbT4KKyAqIAktIEFkZGVkIF9QREMgZm9yIFNNUCBDLXN0YXRlcyBvbiBJbnRlbCBDUFVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisKKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisKK3N0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfaW50ZWxfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcgorCQkJCQkJKnBvdykKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqb2JqX2xpc3Q7CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKwl1MzIgKmJ1ZjsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBkYy4gSXQgd2lsbCBiZSB1c2VkIGxhdGVyLiAqLworCW9ial9saXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9ial9saXN0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQorCisJb2JqID0ga21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikgeworCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJa2ZyZWUob2JqX2xpc3QpOworCQlyZXR1cm47CisJfQorCisJYnVmID0ga21hbGxvYygxMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCWtmcmVlKG9iaik7CisJCWtmcmVlKG9ial9saXN0KTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOworCWJ1ZlsxXSA9IDE7CisJYnVmWzJdID0gQUNQSV9QRENfQ19DQVBBQklMSVRZX1NNUDsKKworCW9iai0+dHlwZSA9IEFDUElfVFlQRV9CVUZGRVI7CisJb2JqLT5idWZmZXIubGVuZ3RoID0gMTI7CisJb2JqLT5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBidWY7CisJb2JqX2xpc3QtPmNvdW50ID0gMTsKKwlvYmpfbGlzdC0+cG9pbnRlciA9IG9iajsKKwlwb3ctPnBkYyA9IG9ial9saXN0OworCisJcmV0dXJuOworfQorCisvKiBJbml0aWFsaXplIF9QREMgZGF0YSBiYXNlZCBvbiB0aGUgQ1BVIHZlbmRvciAqLwordm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgKnBvdywKKwkJCQkgICB1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhICsgY3B1OworCisJcG93LT5wZGMgPSBOVUxMOworCWlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpCisJCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfaW50ZWxfcGRjKHBvdyk7CisKKwlyZXR1cm47Cit9CisKK0VYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9wZGMpOworCisvKgorICogSW5pdGlhbGl6ZSBibV9mbGFncyBiYXNlZCBvbiB0aGUgQ1BVIGNhY2hlIHByb3BlcnRpZXMKKyAqIE9uIFNNUCBpdCBkZXBlbmRzIG9uIGNhY2hlIGNvbmZpZ3VyYXRpb24KKyAqIC0gV2hlbiBjYWNoZSBpcyBub3Qgc2hhcmVkIGFtb25nIGFsbCBDUFVzLCB3ZSBmbHVzaCBjYWNoZQorICogICBiZWZvcmUgZW50ZXJpbmcgQzMuCisgKiAtIFdoZW4gY2FjaGUgaXMgc2hhcmVkIGFtb25nIGFsbCBDUFVzLCB3ZSB1c2UgYm1fY2hlY2sKKyAqICAgbWVjaGFuaXNtIGFzIGluIFVQIGNhc2UKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgYWZ0ZXIgYWxsIHRoZSBDUFVzIGFyZSBvbmxpbmUKKyAqLwordm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9mbGFncyAqZmxhZ3MsCisJCQkJCXVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7CisKKwlmbGFncy0+Ym1fY2hlY2sgPSAwOworCWlmIChudW1fb25saW5lX2NwdXMoKSA9PSAxKQorCQlmbGFncy0+Ym1fY2hlY2sgPSAxOworCWVsc2UgaWYgKGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgeworCQkvKgorCQkgKiBUb2RheSBhbGwgQ1BVcyB0aGF0IHN1cHBvcnQgQzMgc2hhcmUgY2FjaGUuCisJCSAqIFRCRDogVGhpcyBuZWVkcyB0byBsb29rIGF0IGNhY2hlIHNoYXJlZCBtYXAsIG9uY2UKKwkJICogbXVsdGktY29yZSBkZXRlY3Rpb24gcGF0Y2ggbWFrZXMgdG8gdGhlIGJhc2UuCisJCSAqLworCQlmbGFncy0+Ym1fY2hlY2sgPSAxOworCX0KK30KKworRVhQT1JUX1NZTUJPTChhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwppbmRleCAzOWQzMjQ4NC4uNDRkODg2YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpAQCAtNzQsOCArNzQsOSBAQAogCW1vdncJJWF4LCVmcwogCW1vdncJJDB4MGUwMCArICdpJywgJWZzOigweDEyKQogCQotCSMgbmVlZCBhIGdkdAotCWxnZHQJcmVhbF9zYXZlX2dkdCAtIHdha2V1cF9jb2RlCisJIyBuZWVkIGEgZ2R0IC0tIHVzZSBsZ2R0bCB0byBmb3JjZSAzMi1iaXQgb3BlcmFuZHMsIGluIGNhc2UKKwkjIHRoZSBHRFQgaXMgbG9jYXRlZCBwYXN0IDE2IG1lZ2FieXRlcy4KKwlsZ2R0bAlyZWFsX3NhdmVfZ2R0IC0gd2FrZXVwX2NvZGUKIAogCW1vdmwJcmVhbF9zYXZlX2NyMCAtIHdha2V1cF9jb2RlLCAlZWF4CiAJbW92bAklZWF4LCAlY3IwCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCmluZGV4IDIyMDNhOWQuLjQ1NTNmZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC00MzUsNiArNDM1LDExIEBACiAJaWYgKGMgPT0gJmJvb3RfY3B1X2RhdGEpCiAJCXN5c2VudGVyX3NldHVwKCk7CiAJZW5hYmxlX3NlcF9jcHUoKTsKKworCWlmIChjID09ICZib290X2NwdV9kYXRhKQorCQltdHJyX2JwX2luaXQoKTsKKwllbHNlCisJCW10cnJfYXBfaW5pdCgpOwogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl9IVApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYwppbmRleCAxYTQ5YWRiLi5lODZlYTQ4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAKIAkvKiBkZXRlY3Qgd2hpY2ggY29tcGFuaW9uIGNoaXAgaXMgdXNlZCAqLwogCXdoaWxlICgoZ3hfcGNpID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZ3hfcGNpKSkgIT0gTlVMTCkgewotCQlpZiAoKHBjaV9tYXRjaF9kZXZpY2UgKGd4X2NoaXBzZXRfdGJsLCBneF9wY2kpKSAhPSBOVUxMKSB7CisJCWlmICgocGNpX21hdGNoX2lkKGd4X2NoaXBzZXRfdGJsLCBneF9wY2kpKSAhPSBOVUxMKSB7CiAJCQlyZXR1cm4gZ3hfcGNpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKaW5kZXggN2RjYmY3MC4uMzI3YTU1ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCkBAIC0zNzUsNyArMzc1LDcgQEAKIAlhcmcwLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGFyZzBfYnVmOwogCWFyZzBfYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7CiAJYXJnMF9idWZbMV0gPSAxOwotCWFyZzBfYnVmWzJdID0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QIHwgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfTVNSOworCWFyZzBfYnVmWzJdID0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QX01TUjsKIAogCXAucGRjID0gJmFyZ19saXN0OwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCA5NmE3NWQwLi5hMmMzM2MxIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKQEAgLTI1LDcgKzI1LDcgQEAKIC8qCiAgKiBBbGlnbm1lbnQgYXQgd2hpY2ggbW92c2wgaXMgcHJlZmVycmVkIGZvciBidWxrIG1lbW9yeSBjb3BpZXMuCiAgKi8KLXN0cnVjdCBtb3ZzbF9tYXNrIG1vdnNsX21hc2s7CitzdHJ1Y3QgbW92c2xfbWFzayBtb3ZzbF9tYXNrIF9fcmVhZF9tb3N0bHk7CiAjZW5kaWYKIAogdm9pZCBfX2RldmluaXQgZWFybHlfaW50ZWxfd29ya2Fyb3VuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCmluZGV4IDY0ZDkxZjcuLjE2OWFjOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCkBAIC02NywxMyArNjcsNiBAQAogCW10cnJfc3RhdGUuZW5hYmxlZCA9IChsbyAmIDB4YzAwKSA+PiAxMDsKIH0KIAotLyogIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHN0cnVjdCBtdHJyX3N0YXRlICAqLwotdm9pZCBfX2luaXQgZmluYWxpemVfbXRycl9zdGF0ZSh2b2lkKQotewotCWtmcmVlKG10cnJfc3RhdGUudmFyX3Jhbmdlcyk7Ci0JbXRycl9zdGF0ZS52YXJfcmFuZ2VzID0gTlVMTDsKLX0KLQogLyogIFNvbWUgQklPUydzIGFyZSBmdWNrZWQgYW5kIGRvbid0IHNldCBhbGwgTVRSUnMgdGhlIHNhbWUhICAqLwogdm9pZCBfX2luaXQgbXRycl9zdGF0ZV93YXJuKHZvaWQpCiB7CkBAIC0zMzQsNiArMzI3LDkgQEAKICovCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZyOworCisJdnIgPSAmbXRycl9zdGF0ZS52YXJfcmFuZ2VzW3JlZ107CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcHJlcGFyZV9zZXQoKTsKQEAgLTM0MiwxMSArMzM4LDE1IEBACiAJCS8qIFRoZSBpbnZhbGlkIGJpdCBpcyBrZXB0IGluIHRoZSBtYXNrLCBzbyB3ZSBzaW1wbHkgY2xlYXIgdGhlCiAJCSAgIHJlbGV2YW50IG1hc2sgcmVnaXN0ZXIgdG8gZGlzYWJsZSBhIHJhbmdlLiAqLwogCQltdHJyX3dybXNyKE1UUlJwaHlzTWFza19NU1IocmVnKSwgMCwgMCk7CisJCW1lbXNldCh2ciwgMCwgc2l6ZW9mKHN0cnVjdCBtdHJyX3Zhcl9yYW5nZSkpOwogCX0gZWxzZSB7Ci0JCW10cnJfd3Jtc3IoTVRSUnBoeXNCYXNlX01TUihyZWcpLCBiYXNlIDw8IFBBR0VfU0hJRlQgfCB0eXBlLAotCQkgICAgICAoYmFzZSAmIHNpemVfYW5kX21hc2spID4+ICgzMiAtIFBBR0VfU0hJRlQpKTsKLQkJbXRycl93cm1zcihNVFJScGh5c01hc2tfTVNSKHJlZyksIC1zaXplIDw8IFBBR0VfU0hJRlQgfCAweDgwMCwKLQkJICAgICAgKC1zaXplICYgc2l6ZV9hbmRfbWFzaykgPj4gKDMyIC0gUEFHRV9TSElGVCkpOworCQl2ci0+YmFzZV9sbyA9IGJhc2UgPDwgUEFHRV9TSElGVCB8IHR5cGU7CisJCXZyLT5iYXNlX2hpID0gKGJhc2UgJiBzaXplX2FuZF9tYXNrKSA+PiAoMzIgLSBQQUdFX1NISUZUKTsKKwkJdnItPm1hc2tfbG8gPSAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHg4MDA7CisJCXZyLT5tYXNrX2hpID0gKC1zaXplICYgc2l6ZV9hbmRfbWFzaykgPj4gKDMyIC0gUEFHRV9TSElGVCk7CisKKwkJbXRycl93cm1zcihNVFJScGh5c0Jhc2VfTVNSKHJlZyksIHZyLT5iYXNlX2xvLCB2ci0+YmFzZV9oaSk7CisJCW10cnJfd3Jtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCB2ci0+bWFza19sbywgdnItPm1hc2tfaGkpOwogCX0KIAogCXBvc3Rfc2V0KCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCmluZGV4IGQ2NmIwOWUuLjc2NGNhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCkBAIC0zMzIsNiArMzMyLDggQEAKIAogCWVycm9yID0gLUVJTlZBTDsKIAorCS8qIE5vIENQVSBob3RwbHVnIHdoZW4gd2UgY2hhbmdlIE1UUlIgZW50cmllcyAqLworCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAkvKiAgU2VhcmNoIGZvciBleGlzdGluZyBNVFJSICAqLwogCWRvd24oJm1haW5fbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IG51bV92YXJfcmFuZ2VzOyArK2kpIHsKQEAgLTM3Miw2ICszNzQsNyBAQAogCWVycm9yID0gaTsKICBvdXQ6CiAJdXAoJm1haW5fbG9jayk7CisJdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC00NjEsNiArNDY0LDggQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAogCW1heCA9IG51bV92YXJfcmFuZ2VzOworCS8qIE5vIENQVSBob3RwbHVnIHdoZW4gd2UgY2hhbmdlIE1UUlIgZW50cmllcyAqLworCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAlkb3duKCZtYWluX2xvY2spOwogCWlmIChyZWcgPCAwKSB7CiAJCS8qICBTZWFyY2ggZm9yIGV4aXN0aW5nIE1UUlIgICovCkBAIC01MDEsNiArNTA2LDcgQEAKIAllcnJvciA9IHJlZzsKICBvdXQ6CiAJdXAoJm1haW5fbG9jayk7CisJdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAJcmV0dXJuIGVycm9yOwogfQogLyoqCkBAIC01NDQsMjEgKzU1MCw5IEBACiAJY2VudGF1cl9pbml0X210cnIoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfb3RoZXJfY3B1cyh2b2lkKQotewotCWlmICh1c2VfaW50ZWwoKSkKLQkJZ2V0X210cnJfc3RhdGUoKTsKLQotCS8qIGJyaW5nIHVwIHRoZSBvdGhlciBwcm9jZXNzb3JzICovCi0Jc2V0X210cnIofjBVLDAsMCwwKTsKLQotCWlmICh1c2VfaW50ZWwoKSkgewotCQlmaW5hbGl6ZV9tdHJyX3N0YXRlKCk7Ci0JCW10cnJfc3RhdGVfd2FybigpOwotCX0KLX0KLQotCisvKiBUaGUgc3VzcGVuZC9yZXN1bWUgbWV0aG9kcyBhcmUgb25seSBmb3IgQ1BVIHdpdGhvdXQgTVRSUi4gQ1BVIHVzaW5nIGdlbmVyaWMKKyAqIE1UUlIgZHJpdmVyIGRvZXNuJ3QgcmVxdWlyZSB0aGlzCisgKi8KIHN0cnVjdCBtdHJyX3ZhbHVlIHsKIAltdHJyX3R5cGUJbHR5cGU7CiAJdW5zaWduZWQgbG9uZwlsYmFzZTsKQEAgLTYxMSwxMyArNjA1LDEzIEBACiAKIAogLyoqCi0gKiBtdHJyX2luaXQgLSBpbml0aWFsaXplIG10cnJzIG9uIHRoZSBib290IENQVQorICogbXRycl9icF9pbml0IC0gaW5pdGlhbGl6ZSBtdHJycyBvbiB0aGUgYm9vdCBDUFUKICAqCiAgKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBlYXJseTsgYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgQ1BVcyBhcmUgCiAgKiBpbml0aWFsaXplZCAoaS5lLiBiZWZvcmUgc21wX2luaXQoKSkuCiAgKiAKICAqLwotc3RhdGljIGludCBfX2luaXQgbXRycl9pbml0KHZvaWQpCit2b2lkIF9faW5pdCBtdHJyX2JwX2luaXQodm9pZCkKIHsKIAlpbml0X2lmcygpOwogCkBAIC02NzQsMTIgKzY2OCw0OCBAQAogCWlmIChtdHJyX2lmKSB7CiAJCXNldF9udW1fdmFyX3JhbmdlcygpOwogCQlpbml0X3RhYmxlKCk7Ci0JCWluaXRfb3RoZXJfY3B1cygpOwotCi0JCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLAotCQkJCQkgICAgICAmbXRycl9zeXNkZXZfZHJpdmVyKTsKKwkJaWYgKHVzZV9pbnRlbCgpKQorCQkJZ2V0X210cnJfc3RhdGUoKTsKIAl9Ci0JcmV0dXJuIC1FTlhJTzsKIH0KIAotc3Vic3lzX2luaXRjYWxsKG10cnJfaW5pdCk7Cit2b2lkIG10cnJfYXBfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIW10cnJfaWYgfHwgIXVzZV9pbnRlbCgpKQorCQlyZXR1cm47CisJLyoKKwkgKiBJZGVhbGx5IHdlIHNob3VsZCBob2xkIG1haW5fbG9jayBoZXJlIHRvIGF2b2lkIG10cnIgZW50cmllcyBjaGFuZ2VkLAorCSAqIGJ1dCB0aGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgaW4gY3B1IGJvb3QgdGltZSwgaG9sZGluZyB0aGUgbG9jaworCSAqIGJyZWFrcyBpdC4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpbiB0d28gY2FzZXM6IDEudmVyeSBlYXJpbHkgdGltZQorCSAqIG9mIHNvZnR3YXJlIHJlc3VtZSwgd2hlbiB0aGVyZSBhYnNvbHV0ZWx5IGlzbid0IG10cnIgZW50cnkgY2hhbmdlczsKKwkgKiAyLmNwdSBob3RhZGQgdGltZS4gV2UgbGV0IG10cnJfYWRkL2RlbF9wYWdlIGhvbGQgY3B1aG90cGx1ZyBsb2NrIHRvCisJICogcHJldmVudCBtdHJyIGVudHJ5IGNoYW5nZXMKKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwltdHJyX2lmLT5zZXRfYWxsKCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG10cnJfaW5pdF9maW5pYWxpemUodm9pZCkKK3sKKwlpZiAoIW10cnJfaWYpCisJCXJldHVybiAwOworCWlmICh1c2VfaW50ZWwoKSkKKwkJbXRycl9zdGF0ZV93YXJuKCk7CisJZWxzZSB7CisJCS8qIFRoZSBDUFVzIGhhdmVuJ3QgTVRSUiBhbmQgc2VlbWVzIG5vdCBzdXBwb3J0IFNNUC4gVGhleSBoYXZlCisJCSAqIHNwZWNpZmljIGRyaXZlcnMsIHdlIHVzZSBhIHRyaWNreSBtZXRob2QgdG8gc3VwcG9ydAorCQkgKiBzdXNwZW5kL3Jlc3VtZSBmb3IgdGhlbS4KKwkJICogVEJEOiBpcyB0aGVyZSBhbnkgc3lzdGVtIHdpdGggc3VjaCBDUFUgd2hpY2ggc3VwcG9ydHMKKwkJICogc3VzcGVuZC9yZXN1bWU/ICBpZiBubywgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29kZS4KKwkJICovCisJCXN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsCisJCQkmbXRycl9zeXNkZXZfZHJpdmVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwobXRycl9pbml0X2ZpbmlhbGl6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oCmluZGV4IGRlMTM1MTI0Li45OWM5ZjI2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaApAQCAtOTEsNyArOTEsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IG51bV92YXJfcmFuZ2VzOwogCi12b2lkIGZpbmFsaXplX210cnJfc3RhdGUodm9pZCk7CiB2b2lkIG10cnJfc3RhdGVfd2Fybih2b2lkKTsKIGNoYXIgKm10cnJfYXR0cmliX3RvX3N0cihpbnQgeCk7CiB2b2lkIG10cnJfd3Jtc3IodW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGZjOGIxNzUuLmE2ZDhjNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCkBAIC01MzcsNyArNTM3LDcgQEAKIAkucHJlX2hhbmRsZXIgPSB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIKIH07CiAKLWludCBfX2luaXQgYXJjaF9pbml0KHZvaWQpCitpbnQgX19pbml0IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpCiB7CiAJcmV0dXJuIHJlZ2lzdGVyX2twcm9iZSgmdHJhbXBvbGluZV9wKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggZDY2YmY0OC4uOGFjOGU5ZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKQEAgLTY4LDIxICs2OCwyMSBAQAogI2VuZGlmCiAKIC8qIFBhY2thZ2UgSUQgb2YgZWFjaCBsb2dpY2FsIENQVSAqLwotaW50IHBoeXNfcHJvY19pZFtOUl9DUFVTXSA9IHtbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUR9OworaW50IHBoeXNfcHJvY19pZFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0ge1swIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRH07CiBFWFBPUlRfU1lNQk9MKHBoeXNfcHJvY19pZCk7CiAKIC8qIENvcmUgSUQgb2YgZWFjaCBsb2dpY2FsIENQVSAqLwotaW50IGNwdV9jb3JlX2lkW05SX0NQVVNdID0ge1swIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRH07CitpbnQgY3B1X2NvcmVfaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHtbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUR9OwogRVhQT1JUX1NZTUJPTChjcHVfY29yZV9pZCk7CiAKLWNwdW1hc2tfdCBjcHVfc2libGluZ19tYXBbTlJfQ1BVU107CitjcHVtYXNrX3QgY3B1X3NpYmxpbmdfbWFwW05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKGNwdV9zaWJsaW5nX21hcCk7CiAKLWNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU107CitjcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKGNwdV9jb3JlX21hcCk7CiAKIC8qIGJpdG1hcCBvZiBvbmxpbmUgY3B1cyAqLwotY3B1bWFza190IGNwdV9vbmxpbmVfbWFwOworY3B1bWFza190IGNwdV9vbmxpbmVfbWFwIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKIAogY3B1bWFza190IGNwdV9jYWxsaW5fbWFwOwpAQCAtMTAwLDcgKzEwMCw3IEBACiBzdHJ1Y3QgY3B1aW5mb194ODYgY3B1X2RhdGFbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKIEVYUE9SVF9TWU1CT0woY3B1X2RhdGEpOwogCi11OCB4ODZfY3B1X3RvX2FwaWNpZFtOUl9DUFVTXSA9Cit1OCB4ODZfY3B1X3RvX2FwaWNpZFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAkJCXsgWzAgLi4uIE5SX0NQVVMtMV0gPSAweGZmIH07CiBFWFBPUlRfU1lNQk9MKHg4Nl9jcHVfdG9fYXBpY2lkKTsKIApAQCAtNTUwLDEwICs1NTAsMTAgQEAKICNpZmRlZiBDT05GSUdfTlVNQQogCiAvKiB3aGljaCBsb2dpY2FsIENQVXMgYXJlIG9uIHdoaWNoIG5vZGVzICovCi1jcHVtYXNrX3Qgbm9kZV8yX2NwdV9tYXNrW01BWF9OVU1OT0RFU10gPQorY3B1bWFza190IG5vZGVfMl9jcHVfbWFza1tNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHkgPQogCQkJCXsgWzAgLi4uIE1BWF9OVU1OT0RFUy0xXSA9IENQVV9NQVNLX05PTkUgfTsKIC8qIHdoaWNoIG5vZGUgZWFjaCBsb2dpY2FsIENQVSBpcyBvbiAqLwotaW50IGNwdV8yX25vZGVbTlJfQ1BVU10gPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gMCB9OworaW50IGNwdV8yX25vZGVbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSAwIH07CiBFWFBPUlRfU1lNQk9MKGNwdV8yX25vZGUpOwogCiAvKiBzZXQgdXAgYSBtYXBwaW5nIGJldHdlZW4gY3B1IGFuZCBub2RlLiAqLwpAQCAtNTgxLDcgKzU4MSw3IEBACiAKICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCi11OCBjcHVfMl9sb2dpY2FsX2FwaWNpZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07Cit1OCBjcHVfMl9sb2dpY2FsX2FwaWNpZFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUQgfTsKIAogc3RhdGljIHZvaWQgbWFwX2NwdV90b19sb2dpY2FsX2FwaWNpZCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMgYi9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUwppbmRleCAzZGI5YTA0Li40Njg1MDBhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUwpAQCAtMjkxLDMgKzI5MSw2IEBACiAJLmxvbmcgc3lzX2tleWN0bAogCS5sb25nIHN5c19pb3ByaW9fc2V0CiAJLmxvbmcgc3lzX2lvcHJpb19nZXQJCS8qIDI5MCAqLworCS5sb25nIHN5c19pbm90aWZ5X2luaXQKKwkubG9uZyBzeXNfaW5vdGlmeV9hZGRfd2F0Y2gKKwkubG9uZyBzeXNfaW5vdGlmeV9ybV93YXRjaApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWUuYwppbmRleCAyODU0YzM1Li4wZWU5ZGVlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWUuYwpAQCAtOTEsNyArOTEsNyBAQAogREVGSU5FX1NQSU5MT0NLKGk4MjUzX2xvY2spOwogRVhQT1JUX1NZTUJPTChpODI1M19sb2NrKTsKIAotc3RydWN0IHRpbWVyX29wdHMgKmN1cl90aW1lciA9ICZ0aW1lcl9ub25lOworc3RydWN0IHRpbWVyX29wdHMgKmN1cl90aW1lciBfX3JlYWRfbW9zdGx5ID0gJnRpbWVyX25vbmU7CiAKIC8qCiAgKiBUaGlzIGlzIGEgc3BlY2lhbCBsb2NrIHRoYXQgaXMgb3duZWQgYnkgdGhlIENQVSBhbmQgaG9sZHMgdGhlIGluZGV4CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKaW5kZXggZDc2NmUwOS4uZWY4ZGFjNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfaHBldC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKICNpbmNsdWRlIDxhc20vaHBldC5oPgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3VzZWNfcXVvdGllbnQ7CS8qIGNvbnZlcnQgaHBldCBjbGtzIHRvIHVzZWMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgaHBldF91c2VjX3F1b3RpZW50OwkvKiBjb252ZXJ0IGhwZXQgY2xrcyB0byB1c2VjICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0c2NfaHBldF9xdW90aWVudDsJCS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0OyAJLyogaHBldCBjb3VudGVyIHZhbHVlIGF0IGxhc3QgdGljayovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19sb3c7CS8qIGxzYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLwpAQCAtMTgwLDcgKzE4MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9ocGV0ID0geworc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX2hwZXQgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZSA9IAkJImhwZXQiLAogCS5tYXJrX29mZnNldCA9CQltYXJrX29mZnNldF9ocGV0LAogCS5nZXRfb2Zmc2V0ID0JCWdldF9vZmZzZXRfaHBldCwKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA3ZTAxYTUyLi43NjE5NzJmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC01Nyw2ICs1Nyw5IEBACiAJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKICAgfQogCisgIC8qIHJhcmVseSBjaGFuZ2VkIGRhdGEgbGlrZSBjcHUgbWFwcyAqLworICAuID0gQUxJR04oMzIpOworICAuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsgKiguZGF0YS5yZWFkX21vc3RseSkgfQogICBfZWRhdGEgPSAuOwkJCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KIAogICAuID0gQUxJR04oVEhSRUFEX1NJWkUpOwkvKiBpbml0X3Rhc2sgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9iYXNpYy5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMKaW5kZXggM2U0MzljZS4uODY4MDA4MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMKQEAgLTM2LDYgKzM2LDcgQEAKICAqIFBvd2VyIG9mZiBmdW5jdGlvbiwgaWYgYW55CiAgKi8KIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOworRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOwogCiBpbnQgdm95YWdlcl9sZXZlbCA9IDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYwppbmRleCA4Yzg1Mjc1Li4wZTFmNDIwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiB0aGUgdm95YWdlciBoYWwgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eQogICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC00MCw2ICs0MSw3IEBACiAvKiBwZXIgQ1BVIGRhdGEgc3RydWN0dXJlIChmb3IgL3Byb2MvY3B1aW5mbyBldCBhbCksIHZpc2libGUgZXh0ZXJuYWxseQogICogaW5kZXhlZCBwaHlzaWNhbGx5ICovCiBzdHJ1Y3QgY3B1aW5mb194ODYgY3B1X2RhdGFbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKK0VYUE9SVF9TWU1CT0woY3B1X2RhdGEpOwogCiAvKiBwaHlzaWNhbCBJRCBvZiB0aGUgQ1BVIHVzZWQgdG8gYm9vdCB0aGUgc3lzdGVtICovCiB1bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOwpAQCAtNzIsNiArNzQsNyBAQAogLyogQml0bWFzayBvZiBjdXJyZW50bHkgb25saW5lIENQVXMgLSB1c2VkIGJ5IHNldHVwLmMgZm9yCiAgICAvcHJvYy9jcHVpbmZvLCB2aXNpYmxlIGV4dGVybmFsbHkgYnV0IHN0aWxsIHBoeXNpY2FsICovCiBjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgPSBDUFVfTUFTS19OT05FOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CiAKIC8qIEJpdG1hc2sgb2YgQ1BVcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0gLSBleHBvcnRlZCBieSBpMzg2X3N5bXMuYywgdXNlZAogICogYnkgc2NoZWR1bGVyIGJ1dCBpbmRleGVkIHBoeXNpY2FsbHkgKi8KQEAgLTIzOCw2ICsyNDEsNyBAQAogLyogVGhpcyBpcyBmb3IgdGhlIG5ldyBkeW5hbWljIENQVSBib290IGNvZGUgKi8KIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcCA9IENQVV9NQVNLX05PTkU7CiBjcHVtYXNrX3QgY3B1X2NhbGxvdXRfbWFwID0gQ1BVX01BU0tfTk9ORTsKK0VYUE9SVF9TWU1CT0woY3B1X2NhbGxvdXRfbWFwKTsKIAogLyogVGhlIHBlciBwcm9jZXNzb3IgSVJRIG1hc2tzICh0aGVzZSBhcmUgdXN1YWxseSBrZXB0IGluIHN5bmMpICovCiBzdGF0aWMgX191MTYgdmljX2lycV9tYXNrW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CkBAIC05NzgsNiArOTgyLDcgQEAKIAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CitFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9wYWdlKTsKIAogLyogZW5hYmxlIHRoZSByZXF1ZXN0ZWQgSVJRcyAqLwogc3RhdGljIHZvaWQKQEAgLTExMDksNiArMTExNCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogCiAvKiBTb3JyeSBhYm91dCB0aGUgbmFtZS4gIEluIGFuIEFQSUMgYmFzZWQgc3lzdGVtLCB0aGUgQVBJQ3MKICAqIHRoZW1zZWx2ZXMgYXJlIHByb2dyYW1tZWQgdG8gc2VuZCBhIHRpbWVyIGludGVycnVwdC4gIFRoaXMgaXMgdXNlZApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2lvcmVtYXAuYyBiL2FyY2gvaTM4Ni9tbS9pb3JlbWFwLmMKaW5kZXggNmIyNWFmYy4uZjM3OWI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2lvcmVtYXAuYworKysgYi9hcmNoL2kzODYvbW0vaW9yZW1hcC5jCkBAIC0yMjgsNyArMjI4LDggQEAKIHZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJc3RydWN0IHZtX3N0cnVjdCAqcDsKLQlpZiAoKHZvaWQgX19mb3JjZSAqKSBhZGRyIDw9IGhpZ2hfbWVtb3J5KSAKKworCWlmICgodm9pZCBfX2ZvcmNlICopYWRkciA8PSBoaWdoX21lbW9yeSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTI0MSw5ICsyNDIsMTAgQEAKIAkJcmV0dXJuOwogCiAJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwotCXAgPSBfX3JlbW92ZV92bV9hcmVhKCh2b2lkICopIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSBhZGRyKSk7CisJcCA9IF9fcmVtb3ZlX3ZtX2FyZWEoKHZvaWQgKikoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyKSk7CiAJaWYgKCFwKSB7IAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpb3VubWFwOiBiYWQgYWRkcmVzcyAlcFxuIiwgYWRkcik7CisJCWR1bXBfc3RhY2soKTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9jb21tb24uYyBiL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMKaW5kZXggODczMjUyNi4uNzBiY2Q1MyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCkBAIC0xNjUsNiArMTY1LDcgQEAKIAlpZiAoKHBjaV9wcm9iZSAmIFBDSV9CSU9TX1NPUlQpICYmICEocGNpX3Byb2JlICYgUENJX05PX1NPUlQpKQogCQlwY2liaW9zX3NvcnQoKTsKICNlbmRpZgorCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yZXNvdXJjZXMoKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pMzg2LmMgYi9hcmNoL2kzODYvcGNpL2kzODYuYwppbmRleCBjMjA1ZWE3Li45M2EzNjRjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2kzODYuYworKysgYi9hcmNoL2kzODYvcGNpL2kzODYuYwpAQCAtMTA2LDExICsxMDYsMTYgQEAKIAkJaWYgKChkZXYgPSBidXMtPnNlbGYpKSB7CiAJCQlmb3IgKGlkeCA9IFBDSV9CUklER0VfUkVTT1VSQ0VTOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKIAkJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKLQkJCQlpZiAoIXItPnN0YXJ0KQorCQkJCWlmICghci0+ZmxhZ3MpCiAJCQkJCWNvbnRpbnVlOwogCQkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7Ci0JCQkJaWYgKCFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApCisJCQkJaWYgKCFyLT5zdGFydCB8fCAhcHIgfHwgcmVxdWVzdF9yZXNvdXJjZShwciwgcikgPCAwKSB7CiAJCQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBDYW5ub3QgYWxsb2NhdGUgcmVzb3VyY2UgcmVnaW9uICVkIG9mIGJyaWRnZSAlc1xuIiwgaWR4LCBwY2lfbmFtZShkZXYpKTsKKwkJCQkJLyogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIHJlZ2lvbi4KKwkJCQkJICAgSW52YWxpZGF0ZSB0aGUgcmVzb3VyY2UgdG8gcHJldmVudCBjaGlsZAorCQkJCQkgICByZXNvdXJjZSBhbGxvY2F0aW9ucyBpbiB0aGlzIHJhbmdlLiAqLworCQkJCQlyLT5mbGFncyA9IDA7CisJCQkJfQogCQkJfQogCQl9CiAJCXBjaWJpb3NfYWxsb2NhdGVfYnVzX3Jlc291cmNlcygmYnVzLT5jaGlsZHJlbik7CkBAIC0yMjcsNyArMjMyLDcgQEAKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7Ci0JZm9yKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKKwlmb3IoaWR4ID0gMDsgaWR4IDwgUENJX05VTV9SRVNPVVJDRVM7IGlkeCsrKSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1ZmYgKi8KIAkJaWYgKCEobWFzayAmICgxPDxpZHgpKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pcnEuYyBiL2FyY2gvaTM4Ni9wY2kvaXJxLmMKaW5kZXggNzhjYTFlYy4uNzY2YjEwNCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9pcnEuYworKysgYi9hcmNoL2kzODYvcGNpL2lycS5jCkBAIC0xMDUxLDI0ICsxMDUxLDI4IEBACiBzdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pcnFfaW5pdCk7CiAKIAotc3RhdGljIHZvaWQgcGlycV9wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgdm9pZCBwaXJxX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKgogCSAqICBJZiBhbnkgSVNBUG5QIGRldmljZSByZXBvcnRzIGFuIElSUSBpbiBpdHMgbGlzdCBvZiBwb3NzaWJsZQogCSAqICBJUlEncywgd2UgdHJ5IHRvIGF2b2lkIGFzc2lnbmluZyBpdCB0byBQQ0kgZGV2aWNlcy4KIAkgKi8KLQlpZiAoaXJxIDwgMTYpCi0JCXBpcnFfcGVuYWx0eVtpcnFdICs9IDEwMDsKKwlpZiAoaXJxIDwgMTYpIHsKKwkJaWYgKGFjdGl2ZSkKKwkJCXBpcnFfcGVuYWx0eVtpcnFdICs9IDEwMDA7CisJCWVsc2UKKwkJCXBpcnFfcGVuYWx0eVtpcnFdICs9IDEwMDsKKwl9CiB9CiAKLXZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCit2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogI2lmZGVmIENPTkZJR19BQ1BJX1BDSQogCWlmICghYWNwaV9ub2lycSkKLQkJYWNwaV9wZW5hbGl6ZV9pc2FfaXJxKGlycSk7CisJCWFjcGlfcGVuYWxpemVfaXNhX2lycShpcnEsIGFjdGl2ZSk7CiAJZWxzZQogI2VuZGlmCi0JCXBpcnFfcGVuYWxpemVfaXNhX2lycShpcnEpOworCQlwaXJxX3BlbmFsaXplX2lzYV9pcnEoaXJxLCBhY3RpdmUpOwogfQogCiBzdGF0aWMgaW50IHBpcnFfZW5hYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS92aXN3cy5jIGIvYXJjaC9pMzg2L3BjaS92aXN3cy5jCmluZGV4IDZhOTI0ODcuLjMxNGM5MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvdmlzd3MuYworKysgYi9hcmNoL2kzODYvcGNpL3Zpc3dzLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogaW50ICgqcGNpYmlvc19lbmFibGVfaXJxKShzdHJ1Y3QgcGNpX2RldiAqZGV2KSA9ICZwY2lfdmlzd3NfZW5hYmxlX2lycTsKIAotdm9pZCBfX2luaXQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpIHt9Cit2b2lkIF9faW5pdCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkge30KIAogCiB1bnNpZ25lZCBpbnQgcGNpX2J1czAsIHBjaV9idXMxOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jIGIvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jCmluZGV4IDBlNmI0NWIuLmM1NDdjMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wb3dlci9jcHUuYworKysgYi9hcmNoL2kzODYvcG93ZXIvY3B1LmMKQEAgLTEzNyw2ICsxMzcsNyBAQAogCiAJZml4X3Byb2Nlc3Nvcl9jb250ZXh0KCk7CiAJZG9fZnB1X2VuZCgpOworCW10cnJfYXBfaW5pdCgpOwogfQogCiB2b2lkIHJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IDAxYjc4ZTcuLjJlMDg5NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC00MjMsNiArNDIzLDggQEAKIAogZW5kaWYKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jCmluZGV4IGFlODRhMTAxLi4wNjM5ZWMwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOwogCXN0cnVjdCBzaW1ldGhfbG9jYWwgKmxvY2FsOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IGZkLCBpLCBlcnI7CisJaW50IGZkLCBpLCBlcnIsIHJjOwogCiAJLyoKIAkgKiBYWFggRml4IG1lCkBAIC0yMjgsNyArMjI4LDkgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlkZXYtPmlycSA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwlpZiAoKHJjID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pKSA8IDApCisJCXBhbmljKCIlczogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzIVxuIiwgX19GVU5DVElPTl9fKTsKKwlkZXYtPmlycSA9IHJjOwogCiAJLyoKIAkgKiBhdHRhY2ggdGhlIGludGVycnVwdCBpbiB0aGUgc2ltdWxhdG9yLCB0aGlzIGRvZXMgZW5hYmxlIGludGVycnVwdHMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCmluZGV4IDdhOGFlMGYuLjdkY2I4NTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwpAQCAtOTgyLDcgKzk4Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogc2ltcnNfaW5pdCAodm9pZCkKIHsKLQlpbnQJCQlpOworCWludAkJCWksIHJjOwogCXN0cnVjdCBzZXJpYWxfc3RhdGUJKnN0YXRlOwogCiAJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJocHNpbSIpKQpAQCAtMTAxNyw3ICsxMDE3LDEwIEBACiAJCWlmIChzdGF0ZS0+dHlwZSA9PSBQT1JUX1VOS05PV04pIGNvbnRpbnVlOwogCiAJCWlmICghc3RhdGUtPmlycSkgewotCQkJc3RhdGUtPmlycSA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwkJCWlmICgocmMgPSBhc3NpZ25faXJxX3ZlY3RvcihBVVRPX0FTU0lHTikpIDwgMCkKKwkJCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsCisJCQkJICAgICAgX19GVU5DVElPTl9fKTsKKwkJCXN0YXRlLT5pcnEgPSByYzsKIAkJCWlhNjRfc3NjX2Nvbm5lY3RfaXJxKEtFWUJPQVJEX0lOVFIsIHN0YXRlLT5pcnEpOwogCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGIyZTJmNjUuLmUxZmI2OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTcsNiArMTcsNyBAQAogb2JqLSQoQ09ORklHX0lPU0FQSUMpCQkrPSBpb3NhcGljLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzbXBib290Lm8gZG9tYWluLm8KK29iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vCiBvYmotJChDT05GSUdfUEVSRk1PTikJCSs9IHBlcmZtb25fZGVmYXVsdF9zbXBsLm8KIG9iai0kKENPTkZJR19JQTY0X0NZQ0xPTkUpCSs9IGN5Y2xvbmUubwogb2JqLSQoQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZKQkrPSBtY2FfcmVjb3ZlcnkubwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCBjZGEwNmY4Li45NjA5ZjI0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtMTEsNiArMTEsNyBAQAogICogIENvcHlyaWdodCAoQykgMjAwMSBKZW5uYSBIYWxsIDxqZW5uYS5zLmhhbGxAaW50ZWwuY29tPgogICogIENvcHlyaWdodCAoQykgMjAwMSBUYWtheW9zaGkgS29jaGkgPHQta29jaGlAYnEuanAubmVjLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgRXJpY2ggRm9jaHQgPGVmb2NodEBlc3MubmVjLmRlPgorICogIENvcHlyaWdodCAoQykgMjAwNCBBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+CiAgKgogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqCkBAIC02Nyw2ICs2OCwxMSBAQAogdW5zaWduZWQgY2hhciBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQgPSAxOwogdW5zaWduZWQgY2hhciBhY3BpX2xlZ2FjeV9kZXZpY2VzOwogCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgYWNwaV9tYWR0X3JldjsKKwordW5zaWduZWQgaW50IGFjcGlfY3BlaV9vdmVycmlkZTsKK3Vuc2lnbmVkIGludCBhY3BpX2NwZWlfcGh5c19jcHVpZDsKKwogI2RlZmluZSBNQVhfU0FQSUNTIDI1NgogdTE2IGlhNjRfYWNwaWlkX3RvX3NhcGljaWRbTUFYX1NBUElDU10gPQogCXsgWzAgLi4uIE1BWF9TQVBJQ1MgLSAxXSA9IC0xIH07CkBAIC0yNjUsMTAgKzI3MSw1NiBAQAogCQkJCQkJKHBsaW50c3JjLT5mbGFncy50cmlnZ2VyID09IDEpID8gSU9TQVBJQ19FREdFIDogSU9TQVBJQ19MRVZFTCk7CiAKIAlwbGF0Zm9ybV9pbnRyX2xpc3RbcGxpbnRzcmMtPnR5cGVdID0gdmVjdG9yOworCWlmIChhY3BpX21hZHRfcmV2ID4gMSkgeworCQlhY3BpX2NwZWlfb3ZlcnJpZGUgPSBwbGludHNyYy0+cGxpbnRfZmxhZ3MuY3BlaV9vdmVycmlkZV9mbGFnOworCX0KKworCS8qCisJICogU2F2ZSB0aGUgcGh5c2ljYWwgaWQsIHNvIHdlIGNhbiBjaGVjayB3aGVuIGl0cyBiZWluZyByZW1vdmVkCisJICovCisJYWNwaV9jcGVpX3BoeXNfY3B1aWQgPSAoKHBsaW50c3JjLT5pZCA8PCA4KSB8IChwbGludHNyYy0+ZWlkKSkgJiAweGZmZmY7CisKIAlyZXR1cm4gMDsKIH0KIAogCit1bnNpZ25lZCBpbnQgY2FuX2NwZWlfcmV0YXJnZXQodm9pZCkKK3sKKwlleHRlcm4gaW50IGNwZV92ZWN0b3I7CisKKwkvKgorCSAqIE9ubHkgaWYgQ1BFSSBpcyBzdXBwb3J0ZWQgYW5kIHRoZSBvdmVycmlkZSBmbGFnCisJICogaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGF0IGl0cyByZS10YXJnZXR0YWJsZQorCSAqIGlmIHdlIGFyZSBpbiBwb2xsaW5nIG1vZGUuCisJICovCisJaWYgKGNwZV92ZWN0b3IgPiAwICYmICFhY3BpX2NwZWlfb3ZlcnJpZGUpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGludCBpc19jcHVfY3BlaV90YXJnZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgbG9naWNhbF9pZDsKKworCWxvZ2ljYWxfaWQgPSBjcHVfbG9naWNhbF9pZChhY3BpX2NwZWlfcGh5c19jcHVpZCk7CisKKwlpZiAobG9naWNhbF9pZCA9PSBjcHUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X2NwZWlfdGFyZ2V0X2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWFjcGlfY3BlaV9waHlzX2NwdWlkID0gY3B1X3BoeXNpY2FsX2lkKGNwdSk7Cit9CisKK3Vuc2lnbmVkIGludCBnZXRfY3BlaV90YXJnZXRfY3B1KHZvaWQpCit7CisJcmV0dXJuIGFjcGlfY3BlaV9waHlzX2NwdWlkOworfQorCiBzdGF0aWMgaW50IF9faW5pdAogYWNwaV9wYXJzZV9pbnRfc3JjX292ciAoCiAJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCkBAIC0zMjYsNiArMzc4LDggQEAKIAogCWFjcGlfbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopIF9fdmEocGh5c19hZGRyKTsKIAorCWFjcGlfbWFkdF9yZXYgPSBhY3BpX21hZHQtPmhlYWRlci5yZXZpc2lvbjsKKwogCS8qIHJlbWVtYmVyIHRoZSB2YWx1ZSBmb3IgcmVmZXJlbmNlIGFmdGVyIGZyZWVfaW5pdG1lbSgpICovCiAjaWZkZWYgQ09ORklHX0lUQU5JVU0KIAloYXNfODI1OSA9IDE7IC8qIEZpcm13YXJlIG9uIG9sZCBJdGFuaXVtIHN5c3RlbXMgaXMgYnJva2VuICovCkBAIC02NDAsOSArNjk0LDExIEBACiAJCQlpZiAoc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdICE9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQkJCW5vZGVfY3B1aWRbaSsrXS5waHlzX2lkID0gc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdOwogCX0KLQlidWlsZF9jcHVfdG9fbm9kZV9tYXAoKTsKICMgZW5kaWYKICNlbmRpZgorI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKKwlidWlsZF9jcHVfdG9fbm9kZV9tYXAoKTsKKyNlbmRpZgogCS8qIE1ha2UgYm9vdC11cCBsb29rIHByZXR0eSAqLwogCXByaW50ayhLRVJOX0lORk8gIiVkIENQVXMgYXZhaWxhYmxlLCAlZCBDUFVzIHRvdGFsXG4iLCBhdmFpbGFibGVfY3B1cywgdG90YWxfY3B1cyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMgYi9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKaW5kZXggNjlmODhkNTYuLmJiOWE1MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKQEAgLTEyNDksNyArMTI0OSw3IEBACiAgCXN0Zi5zcGlsbCBbcjE3XT1mMTEKIAlhZGRzIG91dDA9MTYsc3AJCQkJLy8gb3V0MCA9ICZzaWdzY3JhdGNoCiAJYnIuY2FsbC5zcHRrLm1hbnkgcnA9aWE2NF9ydF9zaWdyZXR1cm4KLS5yZXQxOToJLnJlc3RvcmUgc3AgMAorLnJldDE5OgkucmVzdG9yZSBzcCwwCiAJYWRkcyBzcD0xNixzcAogCTs7CiAJbGQ4IHI5PVtzcF0JCQkJLy8gbG9hZCBuZXcgYXIudW5hdApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMgYi9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYwppbmRleCBjMTcwYmUwLi43OTM2YjYyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYwpAQCAtNDg5LDggKzQ4OSw2IEBACiAJCQl9CiAJCX0KIAl9Ci0JaWYgKHZlY3RvciA8IDApCi0JCXBhbmljKCIlczogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzIVxuIiwgX19GVU5DVElPTl9fKTsKIAogCXJldHVybiB2ZWN0b3I7CiB9CkBAIC01MDYsNiArNTA0LDggQEAKIAogCWlmICghbGlzdF9lbXB0eSgmaW9zYXBpY19pbnRyX2luZm9bdmVjdG9yXS5ydGVzKSkgewogCQluZXdfdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pOworCQlpZiAobmV3X3ZlY3RvciA8IDApCisJCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXByaW50ayhLRVJOX0lORk8gIlJlYXNzaWduaW5nIHZlY3RvciAlZCB0byAlZFxuIiwgdmVjdG9yLCBuZXdfdmVjdG9yKTsKIAkJbWVtY3B5KCZpb3NhcGljX2ludHJfaW5mb1tuZXdfdmVjdG9yXSwgJmlvc2FwaWNfaW50cl9pbmZvW3ZlY3Rvcl0sCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGlvc2FwaWNfaW50cl9pbmZvKSk7CkBAIC03MzQsOSArNzM0LDEyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9zYXBpY19sb2NrLCBmbGFncyk7CiAKIAkvKiBJZiB2ZWN0b3IgaXMgcnVubmluZyBvdXQsIHdlIHRyeSB0byBmaW5kIGEgc2hhcmFibGUgdmVjdG9yICovCi0JdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyhBVVRPX0FTU0lHTik7Ci0JaWYgKHZlY3RvciA8IDApCisJdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pOworCWlmICh2ZWN0b3IgPCAwKSB7CiAJCXZlY3RvciA9IGlvc2FwaWNfZmluZF9zaGFyYWJsZV92ZWN0b3IodHJpZ2dlciwgcG9sYXJpdHkpOworCQlpZiAodmVjdG9yIDwgMCkKKwkJCXBhbmljKCIlczogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzIVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2Rlc2NwKHZlY3RvciktPmxvY2ssIGZsYWdzKTsKIAlzcGluX2xvY2soJmlvc2FwaWNfbG9jayk7CkBAIC04ODQsNiArODg3LDggQEAKIAkJYnJlYWs7CiAJICAgICAgY2FzZSBBQ1BJX0lOVEVSUlVQVF9JTklUOgogCQl2ZWN0b3IgPSBhc3NpZ25faXJxX3ZlY3RvcihBVVRPX0FTU0lHTik7CisJCWlmICh2ZWN0b3IgPCAwKQorCQkJcGFuaWMoIiVzOiBvdXQgb2YgaW50ZXJydXB0IHZlY3RvcnMhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlkZWxpdmVyeSA9IElPU0FQSUNfSU5JVDsKIAkJYnJlYWs7CiAJICAgICAgY2FzZSBBQ1BJX0lOVEVSUlVQVF9DUEVJOgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCmluZGV4IDRmZTYwYzcuLjZjNGQ1OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKQEAgLTYzLDMwICs2MywxOSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaWE2NF92ZWN0b3JfbWFza1tCSVRTX1RPX0xPTkdTKElBNjRfTlVNX0RFVklDRV9WRUNUT1JTKV07CiAKIGludAotYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyAoaW50IGlycSkKK2Fzc2lnbl9pcnFfdmVjdG9yIChpbnQgaXJxKQogewogCWludCBwb3MsIHZlY3RvcjsKICBhZ2FpbjoKIAlwb3MgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGlhNjRfdmVjdG9yX21hc2ssIElBNjRfTlVNX0RFVklDRV9WRUNUT1JTKTsKIAl2ZWN0b3IgPSBJQTY0X0ZJUlNUX0RFVklDRV9WRUNUT1IgKyBwb3M7CiAJaWYgKHZlY3RvciA+IElBNjRfTEFTVF9ERVZJQ0VfVkVDVE9SKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PU1BDOwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KHBvcywgaWE2NF92ZWN0b3JfbWFzaykpCiAJCWdvdG8gYWdhaW47CiAJcmV0dXJuIHZlY3RvcjsKIH0KIAotaW50Ci1hc3NpZ25faXJxX3ZlY3RvciAoaW50IGlycSkKLXsKLQlpbnQgdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyhpcnEpOwotCi0JaWYgKHZlY3RvciA8IDApCi0JCXBhbmljKCJhc3NpZ25faXJxX3ZlY3Rvcjogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzISIpOwotCi0JcmV0dXJuIHZlY3RvcjsKLX0KLQogdm9pZAogZnJlZV9pcnFfdmVjdG9yIChpbnQgdmVjdG9yKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwppbmRleCAzYWEzMTY3Li44ODRmNWNkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNzEzLDcgKzcxMyw3IEBACiAJLnByZV9oYW5kbGVyID0gdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyCiB9OwogCi1pbnQgX19pbml0IGFyY2hfaW5pdCh2b2lkKQoraW50IF9faW5pdCBhcmNoX2luaXRfa3Byb2Jlcyh2b2lkKQogewogCXRyYW1wb2xpbmVfcC5hZGRyID0KIAkJKGtwcm9iZV9vcGNvZGVfdCAqKSgoc3RydWN0IGZucHRyICopa3JldHByb2JlX3RyYW1wb2xpbmUpLT5pcDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IDczNmUzMjguLjRlYmJmMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAKICNpZmRlZiBDT05GSUdfQUNQSQogCi1zdGF0aWMgaW50IGNwZV92ZWN0b3IgPSAtMTsKK2ludCBjcGVfdmVjdG9yID0gLTE7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdAogaWE2NF9tY2FfY3BlX2ludF9oYW5kbGVyIChpbnQgY3BlX2lycSwgdm9pZCAqYXJnLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9udW1hLmMgYi9hcmNoL2lhNjQva2VybmVsL251bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhjZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9udW1hLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogaWE2NCBrZXJuZWwgTlVNQSBzcGVjaWZpYyBzdHVmZgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBFcmljaCBGb2NodCA8ZWZvY2h0QGVzcy5uZWMuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogICBKZXNzZSBCYXJuZXMgPGpiYXJuZXNAc2dpLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKwordTggY3B1X3RvX25vZGVfbWFwW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CitFWFBPUlRfU1lNQk9MKGNwdV90b19ub2RlX21hcCk7CisKK2NwdW1hc2tfdCBub2RlX3RvX2NwdV9tYXNrW01BWF9OVU1OT0RFU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKKworLyoqCisgKiBidWlsZF9jcHVfdG9fbm9kZV9tYXAgLSBzZXR1cCBjcHUgdG8gbm9kZSBhbmQgbm9kZSB0byBjcHVtYXNrIGFycmF5cworICoKKyAqIEJ1aWxkIGNwdSB0byBub2RlIG1hcHBpbmcgYW5kIGluaXRpYWxpemUgdGhlIHBlciBub2RlIGNwdSBtYXNrcyB1c2luZworICogaW5mbyBmcm9tIHRoZSBub2RlX2NwdWlkIGFycmF5IGhhbmRlZCB0byB1cyBieSBBQ1BJLgorICovCit2b2lkIF9faW5pdCBidWlsZF9jcHVfdG9fbm9kZV9tYXAodm9pZCkKK3sKKwlpbnQgY3B1LCBpLCBub2RlOworCisJZm9yKG5vZGU9MDsgbm9kZSA8IE1BWF9OVU1OT0RFUzsgbm9kZSsrKQorCQljcHVzX2NsZWFyKG5vZGVfdG9fY3B1X21hc2tbbm9kZV0pOworCisJZm9yKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7CisJCW5vZGUgPSAtMTsKKwkJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7ICsraSkKKwkJCWlmIChjcHVfcGh5c2ljYWxfaWQoY3B1KSA9PSBub2RlX2NwdWlkW2ldLnBoeXNfaWQpIHsKKwkJCQlub2RlID0gbm9kZV9jcHVpZFtpXS5uaWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCWNwdV90b19ub2RlX21hcFtjcHVdID0gKG5vZGUgPj0gMCkgPyBub2RlIDogMDsKKwkJaWYgKG5vZGUgPj0gMCkKKwkJCWNwdV9zZXQoY3B1LCBub2RlX3RvX2NwdV9tYXNrW25vZGVdKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCmluZGV4IDY0MDdiZmYuLmI4ZWJiOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDZlMzViZmYuLmU0ODQ5MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xOTYsNiArMTk2LDcgQEAKIHZvaWQKIGRlZmF1bHRfaWRsZSAodm9pZCkKIHsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkKIAkJaWYgKGNhbl9kb19wYWxfaGFsdCkKIAkJCXNhZmVfaGFsdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDI2OTNlMTUuLjVjN2M5NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKQEAgLTQwLDYgKzQwLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9pYTMyLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KQEAgLTc4Myw2ICs3ODUsNyBAQAogCS8qIHNpemUgb2YgcGh5c2ljYWwgc3RhY2tlZCByZWdpc3RlciBwYXJ0aXRpb24gcGx1cyA4IGJ5dGVzOiAqLwogCV9fZ2V0X2NwdV92YXIoaWE2NF9waHlzX3N0YWNrZWRfc2l6ZV9wOCkgPSBudW1fcGh5c19zdGFja2VkKjggKyA4OwogCXBsYXRmb3JtX2NwdV9pbml0KCk7CisJcG1faWRsZSA9IGRlZmF1bHRfaWRsZTsKIH0KIAogdm9pZApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZWRkOWYwNy4uYjhhMGE3ZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NpZ25hbC5jCkBAIC0xNDMsNiArMTQzLDcgQEAKIAogCQlfX2NvcHlfZnJvbV91c2VyKGN1cnJlbnQtPnRocmVhZC5mcGgsICZzYy0+c2NfZnJbMzJdLCA5NioxNik7CiAJCXBzci0+bWZoID0gMDsJLyogZHJvcCBzaWduYWwgaGFuZGxlcidzIGZwaCBjb250ZW50cy4uLiAqLworCQlwcmVlbXB0X2Rpc2FibGUoKTsKIAkJaWYgKHBzci0+ZGZoKQogCQkJaWE2NF9kcm9wX2ZwdShjdXJyZW50KTsKIAkJZWxzZSB7CkBAIC0xNTAsNiArMTUxLDcgQEAKIAkJCV9faWE2NF9sb2FkX2ZwdShjdXJyZW50LT50aHJlYWQuZnBoKTsKIAkJCWlhNjRfc2V0X2xvY2FsX2ZwdV9vd25lcihjdXJyZW50KTsKIAkJfQorCQlwcmVlbXB0X2VuYWJsZSgpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL2lhNjQva2VybmVsL3NtcGJvb3QuYwppbmRleCA2MjNiMGE1Li43ZDcyYzBkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NtcGJvb3QuYwpAQCAtNTI1LDQ3ICs1MjUsNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19OVU1BCi0KLS8qIG9uIHdoaWNoIG5vZGUgaXMgZWFjaCBsb2dpY2FsIENQVSAob25lIGNhY2hlbGluZSBldmVuIGZvciA2NCBDUFVzKSAqLwotdTggY3B1X3RvX25vZGVfbWFwW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7Ci1FWFBPUlRfU1lNQk9MKGNwdV90b19ub2RlX21hcCk7Ci0vKiB3aGljaCBsb2dpY2FsIENQVXMgYXJlIG9uIHdoaWNoIG5vZGVzICovCi1jcHVtYXNrX3Qgbm9kZV90b19jcHVfbWFza1tNQVhfTlVNTk9ERVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7Ci0KLS8qCi0gKiBCdWlsZCBjcHUgdG8gbm9kZSBtYXBwaW5nIGFuZCBpbml0aWFsaXplIHRoZSBwZXIgbm9kZSBjcHUgbWFza3MuCi0gKi8KLXZvaWQgX19pbml0Ci1idWlsZF9jcHVfdG9fbm9kZV9tYXAgKHZvaWQpCi17Ci0JaW50IGNwdSwgaSwgbm9kZTsKLQotCWZvcihub2RlPTA7IG5vZGU8TUFYX05VTU5PREVTOyBub2RlKyspCi0JCWNwdXNfY2xlYXIobm9kZV90b19jcHVfbWFza1tub2RlXSk7Ci0JZm9yKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7Ci0JCS8qCi0JCSAqIEFsbCBJdGFuaXVtIE5VTUEgcGxhdGZvcm1zIEkga25vdyB1c2UgQUNQSSwgc28gbWF5YmUgd2UKLQkJICogY2FuIGRyb3AgdGhpcyBpZmRlZiBjb21wbGV0ZWx5LiAgICAgICAgICAgICAgICAgICAgW0VGXQotCQkgKi8KLSNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi0JCW5vZGUgPSAtMTsKLQkJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7ICsraSkKLQkJCWlmIChjcHVfcGh5c2ljYWxfaWQoY3B1KSA9PSBub2RlX2NwdWlkW2ldLnBoeXNfaWQpIHsKLQkJCQlub2RlID0gbm9kZV9jcHVpZFtpXS5uaWQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0jZWxzZQotIwkJZXJyb3IgRml4bWU6IER1bm5vIGhvdyB0byBidWlsZCBDUFUtdG8tbm9kZSBtYXAuCi0jZW5kaWYKLQkJY3B1X3RvX25vZGVfbWFwW2NwdV0gPSAobm9kZSA+PSAwKSA/IG5vZGUgOiAwOwotCQlpZiAobm9kZSA+PSAwKQotCQkJY3B1X3NldChjcHUsIG5vZGVfdG9fY3B1X21hc2tbbm9kZV0pOwotCX0KLX0KLQotI2VuZGlmIC8qIENPTkZJR19OVU1BICovCi0KIC8qCiAgKiBDeWNsZSB0aHJvdWdoIHRoZSBBUHMgc2VuZGluZyBXYWtldXAgSVBJcyB0byBib290IGVhY2guCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCBmMWFhZmQ0Li5kODAzMGYzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCkBAIC0zNiw2ICszNiwxMyBAQAogCXBhcmVudCA9ICZzeXNmc19ub2Rlc1tjcHVfdG9fbm9kZShudW0pXTsKICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCisJLyoKKwkgKiBJZiBDUEVJIGNhbm5vdCBiZSByZS10YXJnZXR0ZWQsIGFuZCB0aGlzIGlzCisJICogQ1BFSSB0YXJnZXQsIHRoZW4gZG9udCBjcmVhdGUgdGhlIGNvbnRyb2wgZmlsZQorCSAqLworCWlmICghY2FuX2NwZWlfcmV0YXJnZXQoKSAmJiBpc19jcHVfY3BlaV90YXJnZXQobnVtKSkKKwkJc3lzZnNfY3B1c1tudW1dLmNwdS5ub19jb250cm9sID0gMTsKKwogCXJldHVybiByZWdpc3Rlcl9jcHUoJnN5c2ZzX2NwdXNbbnVtXS5jcHUsIG51bSwgcGFyZW50KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGU3ZTUyMGQuLjQ0NDBjODMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKQEAgLTkwLDE0ICs5MCwxNiBAQAogCQkubG9ja19vd25lcl9kZXB0aCA9CTAKIAl9OwogCXN0YXRpYyBpbnQgZGllX2NvdW50ZXI7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKIAotCWlmIChkaWUubG9ja19vd25lciAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwlpZiAoZGllLmxvY2tfb3duZXIgIT0gY3B1KSB7CiAJCWNvbnNvbGVfdmVyYm9zZSgpOwogCQlzcGluX2xvY2tfaXJxKCZkaWUubG9jayk7Ci0JCWRpZS5sb2NrX293bmVyID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCQlkaWUubG9ja19vd25lciA9IGNwdTsKIAkJZGllLmxvY2tfb3duZXJfZGVwdGggPSAwOwogCQlidXN0X3NwaW5sb2NrcygxKTsKIAl9CisJcHV0X2NwdSgpOwogCiAJaWYgKCsrZGllLmxvY2tfb3duZXJfZGVwdGggPCAzKSB7CiAJCXByaW50aygiJXNbJWRdOiAlcyAlbGQgWyVkXVxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYyBiL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYwppbmRleCBmM2ZkNTI4Li5iNWM5MGU1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKKysrIGIvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCkBAIC00NCwxNTAgKzQ0LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZWFybHlfbm9kZV9kYXRhIG1lbV9kYXRhW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKLQotLyoqCi0gKiByZWFzc2lnbl9jcHVfb25seV9ub2RlcyAtIGNhbGxlZCBmcm9tIGZpbmRfbWVtb3J5IHRvIG1vdmUgQ1BVLW9ubHkgbm9kZXMgdG8gYSBtZW1vcnkgbm9kZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBtb3ZlIG5vZGVzIHdpdGggb25seSBDUFVzIChubyBtZW1vcnkpCi0gKiB0byBhIG5vZGUgd2l0aCBtZW1vcnkgd2hpY2ggaXMgYXQgdGhlIG1pbmltdW0gbnVtYV9zbGl0IGRpc3RhbmNlLgotICogQW55IHJlYXNzaWdtZW50cyB3aWxsIHJlc3VsdCBpbiB0aGUgY29tcHJlc3Npb24gb2YgdGhlIG5vZGVzCi0gKiBhbmQgcmVudW1iZXJpbmcgdGhlIG5pZCB2YWx1ZXMgd2hlcmUgYXBwcm9wcmlhdGUuCi0gKiBUaGUgc3RhdGljIGRlY2xhcmF0aW9ucyBiZWxvdyBhcmUgdG8gYXZvaWQgbGFyZ2Ugc3RhY2sgc2l6ZSB3aGljaAotICogbWFrZXMgdGhlIGNvZGUgbm90IHJlLWVudHJhbnQuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFzc2lnbl9jcHVfb25seV9ub2Rlcyh2b2lkKQotewotCXN0cnVjdCBub2RlX21lbWJsa19zICpwOwotCWludCBpLCBqLCBrLCBubm9kZSwgbmlkLCBjcHUsIGNwdW5pZCwgcHhtOwotCXU4IGNzbGl0LCBzbGl0OwotCXN0YXRpYyBERUNMQVJFX0JJVE1BUChub2Rlc193aXRoX21lbSwgTUFYX05VTU5PREVTKSBfX2luaXRkYXRhOwotCXN0YXRpYyB1OCBudW1hX3NsaXRfZml4W01BWF9OVU1OT0RFUyAqIE1BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKLQlzdGF0aWMgaW50IG5vZGVfZmxpcFtNQVhfTlVNTk9ERVNdIF9faW5pdGRhdGE7Ci0Jc3RhdGljIGludCBvbGRfbmlkX21hcFtOUl9DUFVTXSBfX2luaXRkYXRhOwotCi0JZm9yIChubm9kZSA9IDAsIHAgPSAmbm9kZV9tZW1ibGtbMF07IHAgPCAmbm9kZV9tZW1ibGtbbnVtX25vZGVfbWVtYmxrc107IHArKykKLQkJaWYgKCF0ZXN0X2JpdChwLT5uaWQsICh2b2lkICopIG5vZGVzX3dpdGhfbWVtKSkgewotCQkJc2V0X2JpdChwLT5uaWQsICh2b2lkICopIG5vZGVzX3dpdGhfbWVtKTsKLQkJCW5ub2RlKys7Ci0JCX0KLQotCS8qCi0JICogQWxsIG5pZHMgd2l0aCBtZW1vcnkuCi0JICovCi0JaWYgKG5ub2RlID09IG51bV9vbmxpbmVfbm9kZXMoKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBDaGFuZ2UgbmlkcyBhbmQgYXR0ZW1wdCB0byBtaWdyYXRlIENQVS1vbmx5IG5vZGVzCi0JICogdG8gdGhlIGJlc3QgbnVtYV9zbGl0IChjbG9zZXN0IG5laWdoYm9yKSBwb3NzaWJsZS4KLQkgKiBGb3IgcmVhc3NpZ25lZCBDUFUgbm9kZXMgYSBuaWQgY2FuJ3QgYmUgYXJyaXZlZCBhdAotCSAqIHVudGlsIGFmdGVyIHRoaXMgbG9vcCBiZWNhdXNlIHRoZSB0YXJnZXQgbmlkJ3MgbmV3Ci0JICogaWRlbnRpdHkgbWlnaHQgbm90IGhhdmUgYmVlbiBlc3RhYmxpc2hlZCB5ZXQuIFNvCi0JICogbmV3IG5pZCB2YWx1ZXMgYXJlIGZhYnJpY2F0ZWQgYWJvdmUgbnVtX29ubGluZV9ub2RlcygpIGFuZAotCSAqIG1hcHBlZCBiYWNrIGxhdGVyIHRvIHRoZWlyIHRydWUgdmFsdWUuCi0JICovCi0JLyogTUNEIC0gVGhpcyBjb2RlIGlzIGEgYml0IGNvbXBsaWNhdGVkLCBidXQgbWF5IGJlIHVubmVjZXNzYXJ5IG5vdy4KLQkgKiBXZSBjYW4gbm93IGhhbmRsZSBtdWNoIG1vcmUgaW50ZXJlc3Rpbmcgbm9kZS1udW1iZXJpbmcuCi0JICogVGhlIG9sZCByZXF1aXJlbWVudCB0aGF0IDAgPD0gbmlkIDw9IG51bW5vZGVzIDw9IE1BWF9OVU1OT0RFUwotCSAqIGFuZCB0aGF0IHRoZXJlIGJlIG5vIGhvbGVzIGluIHRoZSBudW1iZXJpbmcgMC4ubnVtbm9kZXMKLQkgKiBoYXMgYmVjb21lIHNpbXBseSAwIDw9IG5pZCA8PSBNQVhfTlVNTk9ERVMuCi0JICovCi0JbmlkID0gMDsKLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKSAgewotCQlpZiAodGVzdF9iaXQoaSwgKHZvaWQgKikgbm9kZXNfd2l0aF9tZW0pKSB7Ci0JCQkvKgotCQkJICogU2F2ZSBvcmlnaW5hbCBuaWQgdmFsdWUgZm9yIG51bWFfc2xpdAotCQkJICogZml4dXAgYW5kIG5vZGVfY3B1aWQgcmVhc3NpZ25tZW50cy4KLQkJCSAqLwotCQkJbm9kZV9mbGlwW25pZF0gPSBpOwotCi0JCQlpZiAoaSA9PSBuaWQpIHsKLQkJCQluaWQrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChwID0gJm5vZGVfbWVtYmxrWzBdOyBwIDwgJm5vZGVfbWVtYmxrW251bV9ub2RlX21lbWJsa3NdOyBwKyspCi0JCQkJaWYgKHAtPm5pZCA9PSBpKQotCQkJCQlwLT5uaWQgPSBuaWQ7Ci0KLQkJCWNwdW5pZCA9IG5pZDsKLQkJCW5pZCsrOwotCQl9IGVsc2UKLQkJCWNwdW5pZCA9IE1BWF9OVU1OT0RFUzsKLQotCQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQotCQkJaWYgKG5vZGVfY3B1aWRbY3B1XS5uaWQgPT0gaSkgewotCQkJCS8qCi0JCQkJICogRm9yIG5vZGVzIG5vdCBiZWluZyByZWFzc2lnbmVkIGp1c3QKLQkJCQkgKiBmaXggdGhlIGNwdSdzIG5pZCBhbmQgcmV2ZXJzZSBweG0gbWFwCi0JCQkJICovCi0JCQkJaWYgKGNwdW5pZCA8IE1BWF9OVU1OT0RFUykgewotCQkJCQlweG0gPSBuaWRfdG9fcHhtX21hcFtpXTsKLQkJCQkJcHhtX3RvX25pZF9tYXBbcHhtXSA9Ci0JCQkJCSAgICAgICAgICBub2RlX2NwdWlkW2NwdV0ubmlkID0gY3B1bmlkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEZvciBub2RlcyBiZWluZyByZWFzc2lnbmVkLCBmaW5kIGJlc3Qgbm9kZSBieQotCQkJCSAqIG51bWFfc2xpdCBpbmZvcm1hdGlvbiBhbmQgdGhlbiBtYWtlIGEgdGVtcG9yYXJ5Ci0JCQkJICogbmlkIHZhbHVlIGJhc2VkIG9uIGN1cnJlbnQgbmlkIGFuZCBudW1fb25saW5lX25vZGVzKCkuCi0JCQkJICovCi0JCQkJc2xpdCA9IDB4ZmY7Ci0JCQkJayA9IDIqbnVtX29ubGluZV9ub2RlcygpOwotCQkJCWZvcl9lYWNoX29ubGluZV9ub2RlKGopIHsKLQkJCQkJaWYgKGkgPT0gaikKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQllbHNlIGlmICh0ZXN0X2JpdChqLCAodm9pZCAqKSBub2Rlc193aXRoX21lbSkpIHsKLQkJCQkJCWNzbGl0ID0gbnVtYV9zbGl0W2kgKiBudW1fb25saW5lX25vZGVzKCkgKyBqXTsKLQkJCQkJCWlmIChjc2xpdCA8IHNsaXQpIHsKLQkJCQkJCQlrID0gbnVtX29ubGluZV9ub2RlcygpICsgajsKLQkJCQkJCQlzbGl0ID0gY3NsaXQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvKiBzYXZlIG9sZCBuaWQgbWFwIHNvIHdlIGNhbiB1cGRhdGUgdGhlIHB4bSAqLwotCQkJCW9sZF9uaWRfbWFwW2NwdV0gPSBub2RlX2NwdWlkW2NwdV0ubmlkOwotCQkJCW5vZGVfY3B1aWRbY3B1XS5uaWQgPSBrOwotCQkJfQotCX0KLQotCS8qCi0JICogRml4dXAgdGVtcG9yYXJ5IG5pZCB2YWx1ZXMgZm9yIENQVS1vbmx5IG5vZGVzLgotCSAqLwotCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspCi0JCWlmIChub2RlX2NwdWlkW2NwdV0ubmlkID09ICgyKm51bV9vbmxpbmVfbm9kZXMoKSkpIHsKLQkJCXB4bSA9IG5pZF90b19weG1fbWFwW29sZF9uaWRfbWFwW2NwdV1dOwotCQkJcHhtX3RvX25pZF9tYXBbcHhtXSA9IG5vZGVfY3B1aWRbY3B1XS5uaWQgPSBubm9kZSAtIDE7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbm5vZGU7IGkrKykgewotCQkJCWlmIChub2RlX2ZsaXBbaV0gIT0gKG5vZGVfY3B1aWRbY3B1XS5uaWQgLSBudW1fb25saW5lX25vZGVzKCkpKQotCQkJCQljb250aW51ZTsKLQotCQkJCXB4bSA9IG5pZF90b19weG1fbWFwW29sZF9uaWRfbWFwW2NwdV1dOwotCQkJCXB4bV90b19uaWRfbWFwW3B4bV0gPSBub2RlX2NwdWlkW2NwdV0ubmlkID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JLyoKLQkgKiBGaXggbnVtYV9zbGl0IGJ5IGNvbXByZXNzaW5nIGZyb20gbGFyZ2VyCi0JICogbmlkIGFycmF5IHRvIHJlZHVjZWQgbmlkIGFycmF5LgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBubm9kZTsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgbm5vZGU7IGorKykKLQkJCW51bWFfc2xpdF9maXhbaSAqIG5ub2RlICsgal0gPQotCQkJCW51bWFfc2xpdFtub2RlX2ZsaXBbaV0gKiBudW1fb25saW5lX25vZGVzKCkgKyBub2RlX2ZsaXBbal1dOwotCi0JbWVtY3B5KG51bWFfc2xpdCwgbnVtYV9zbGl0X2ZpeCwgc2l6ZW9mIChudW1hX3NsaXQpKTsKLQotCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7Ci0JZm9yIChpID0gMDsgaSA8IG5ub2RlOyBpKyspCi0JCW5vZGVfc2V0X29ubGluZShpKTsKLQotCXJldHVybjsKLX0KK3N0YXRpYyBub2RlbWFza190IG1lbW9yeV9sZXNzX21hc2sgX19pbml0ZGF0YTsKIAogLyoKICAqIFRvIHByZXZlbnQgY2FjaGUgYWxpYXNpbmcgZWZmZWN0cywgYWxpZ24gcGVyLW5vZGUgc3RydWN0dXJlcyBzbyB0aGF0IHRoZXkKQEAgLTIzMywyOCArOTAsNiBAQAogfQogCiAvKioKLSAqIGVhcmx5X25yX3BoeXNfY3B1c19ub2RlIC0gcmV0dXJuIG51bWJlciBvZiBwaHlzaWNhbCBjcHVzIG9uIGEgZ2l2ZW4gbm9kZQotICogQG5vZGU6IG5vZGUgdG8gY2hlY2sKLSAqCi0gKiBDb3VudCB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNwdXMgb24gQG5vZGUuICBUaGVzZSBhcmUgY3B1cyB0aGF0IGFjdHVhbGx5Ci0gKiBleGlzdC4gIFdlIGNhbid0IHVzZSBucl9jcHVzX25vZGUoKSB5ZXQgYmVjYXVzZQotICogYWNwaV9ib290X2luaXQoKSAod2hpY2ggYnVpbGRzIHRoZSBub2RlX3RvX2NwdV9tYXNrIGFycmF5KSBoYXNuJ3QgYmVlbgotICogY2FsbGVkIHlldC4KLSAqLwotc3RhdGljIGludCBlYXJseV9ucl9waHlzX2NwdXNfbm9kZShpbnQgbm9kZSkKLXsKLQlpbnQgY3B1LCBuID0gMDsKLQotCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspCi0JCWlmIChub2RlID09IG5vZGVfY3B1aWRbY3B1XS5uaWQpCi0JCQlpZiAoKGNwdSA9PSAwKSB8fCBub2RlX2NwdWlkW2NwdV0ucGh5c19pZCkKLQkJCQluKys7Ci0KLQlyZXR1cm4gbjsKLX0KLQotCi0vKioKICAqIGVhcmx5X25yX2NwdXNfbm9kZSAtIHJldHVybiBudW1iZXIgb2YgY3B1cyBvbiBhIGdpdmVuIG5vZGUKICAqIEBub2RlOiBub2RlIHRvIGNoZWNrCiAgKgpAQCAtMjYyLDcgKzk3LDcgQEAKICAqIGFjcGlfYm9vdF9pbml0KCkgKHdoaWNoIGJ1aWxkcyB0aGUgbm9kZV90b19jcHVfbWFzayBhcnJheSkgaGFzbid0IGJlZW4KICAqIGNhbGxlZCB5ZXQuICBOb3RlIHRoYXQgbm9kZSAwIHdpbGwgYWxzbyBjb3VudCBhbGwgbm9uLWV4aXN0ZW50IGNwdXMuCiAgKi8KLXN0YXRpYyBpbnQgZWFybHlfbnJfY3B1c19ub2RlKGludCBub2RlKQorc3RhdGljIGludCBfX2luaXQgZWFybHlfbnJfY3B1c19ub2RlKGludCBub2RlKQogewogCWludCBjcHUsIG4gPSAwOwogCkBAIC0yNzQsNiArMTA5LDg1IEBACiB9CiAKIC8qKgorICogY29tcHV0ZV9wZXJub2Rlc2l6ZSAtIGNvbXB1dGUgc2l6ZSBvZiBwZXJub2RlIGRhdGEKKyAqIEBub2RlOiB0aGUgbm9kZSBpZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGNvbXB1dGVfcGVybm9kZXNpemUoaW50IG5vZGUpCit7CisJdW5zaWduZWQgbG9uZyBwZXJub2Rlc2l6ZSA9IDAsIGNwdXM7CisKKwljcHVzID0gZWFybHlfbnJfY3B1c19ub2RlKG5vZGUpOworCXBlcm5vZGVzaXplICs9IFBFUkNQVV9QQUdFX1NJWkUgKiBjcHVzOworCXBlcm5vZGVzaXplICs9IG5vZGUgKiBMMV9DQUNIRV9CWVRFUzsKKwlwZXJub2Rlc2l6ZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2YocGdfZGF0YV90KSk7CisJcGVybm9kZXNpemUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHN0cnVjdCBpYTY0X25vZGVfZGF0YSkpOworCXBlcm5vZGVzaXplID0gUEFHRV9BTElHTihwZXJub2Rlc2l6ZSk7CisJcmV0dXJuIHBlcm5vZGVzaXplOworfQorCisvKioKKyAqIHBlcl9jcHVfbm9kZV9zZXR1cCAtIHNldHVwIHBlci1jcHUgYXJlYXMgb24gZWFjaCBub2RlCisgKiBAY3B1X2RhdGE6IHBlci1jcHUgYXJlYSBvbiB0aGlzIG5vZGUKKyAqIEBub2RlOiBub2RlIHRvIHNldHVwCisgKgorICogQ29weSB0aGUgc3RhdGljIHBlci1jcHUgZGF0YSBpbnRvIHRoZSByZWdpb24gd2UganVzdCBzZXQgYXNpZGUgYW5kIHRoZW4KKyAqIHNldHVwIF9fcGVyX2NwdV9vZmZzZXQgZm9yIGVhY2ggQ1BVIG9uIHRoaXMgbm9kZS4gIFJldHVybiBhIHBvaW50ZXIgdG8KKyAqIHRoZSBlbmQgb2YgdGhlIGFyZWEuCisgKi8KK3N0YXRpYyB2b2lkICpwZXJfY3B1X25vZGVfc2V0dXAodm9pZCAqY3B1X2RhdGEsIGludCBub2RlKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlpbnQgY3B1OworCisJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgeworCQlpZiAobm9kZSA9PSBub2RlX2NwdWlkW2NwdV0ubmlkKSB7CisJCQltZW1jcHkoX192YShjcHVfZGF0YSksIF9fcGh5c19wZXJfY3B1X3N0YXJ0LAorCQkJICAgICAgIF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQpOworCQkJX19wZXJfY3B1X29mZnNldFtjcHVdID0gKGNoYXIqKV9fdmEoY3B1X2RhdGEpIC0KKwkJCQlfX3Blcl9jcHVfc3RhcnQ7CisJCQljcHVfZGF0YSArPSBQRVJDUFVfUEFHRV9TSVpFOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIGNwdV9kYXRhOworfQorCisvKioKKyAqIGZpbGxfcGVybm9kZSAtIGluaXRpYWxpemUgcGVybm9kZSBkYXRhLgorICogQG5vZGU6IHRoZSBub2RlIGlkLgorICogQHBlcm5vZGU6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgcGVybm9kZSBkYXRhCisgKiBAcGVybm9kZXNpemU6IHNpemUgb2YgdGhlIHBlcm5vZGUgZGF0YQorICovCitzdGF0aWMgdm9pZCBfX2luaXQgZmlsbF9wZXJub2RlKGludCBub2RlLCB1bnNpZ25lZCBsb25nIHBlcm5vZGUsCisJdW5zaWduZWQgbG9uZyBwZXJub2Rlc2l6ZSkKK3sKKwl2b2lkICpjcHVfZGF0YTsKKwlpbnQgY3B1cyA9IGVhcmx5X25yX2NwdXNfbm9kZShub2RlKTsKKwlzdHJ1Y3QgYm9vdG1lbV9kYXRhICpiZHAgPSAmbWVtX2RhdGFbbm9kZV0uYm9vdG1lbV9kYXRhOworCisJbWVtX2RhdGFbbm9kZV0ucGVybm9kZV9hZGRyID0gcGVybm9kZTsKKwltZW1fZGF0YVtub2RlXS5wZXJub2RlX3NpemUgPSBwZXJub2Rlc2l6ZTsKKwltZW1zZXQoX192YShwZXJub2RlKSwgMCwgcGVybm9kZXNpemUpOworCisJY3B1X2RhdGEgPSAodm9pZCAqKXBlcm5vZGU7CisJcGVybm9kZSArPSBQRVJDUFVfUEFHRV9TSVpFICogY3B1czsKKwlwZXJub2RlICs9IG5vZGUgKiBMMV9DQUNIRV9CWVRFUzsKKworCW1lbV9kYXRhW25vZGVdLnBnZGF0ID0gX192YShwZXJub2RlKTsKKwlwZXJub2RlICs9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZihwZ19kYXRhX3QpKTsKKworCW1lbV9kYXRhW25vZGVdLm5vZGVfZGF0YSA9IF9fdmEocGVybm9kZSk7CisJcGVybm9kZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IGlhNjRfbm9kZV9kYXRhKSk7CisKKwltZW1fZGF0YVtub2RlXS5wZ2RhdC0+YmRhdGEgPSBiZHA7CisJcGVybm9kZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2YocGdfZGF0YV90KSk7CisKKwljcHVfZGF0YSA9IHBlcl9jcHVfbm9kZV9zZXR1cChjcHVfZGF0YSwgbm9kZSk7CisKKwlyZXR1cm47Cit9CisKKy8qKgogICogZmluZF9wZXJub2RlX3NwYWNlIC0gYWxsb2NhdGUgbWVtb3J5IGZvciBtZW1vcnkgbWFwIGFuZCBwZXItbm9kZSBzdHJ1Y3R1cmVzCiAgKiBAc3RhcnQ6IHBoeXNpY2FsIHN0YXJ0IG9mIHJhbmdlCiAgKiBAbGVuOiBsZW5ndGggb2YgcmFuZ2UKQEAgLTMwNCw5ICsyMTgsOCBAQAogc3RhdGljIGludCBfX2luaXQgZmluZF9wZXJub2RlX3NwYWNlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJCSAgICAgaW50IG5vZGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBlcGZuLCBjcHUsIGNwdXMsIHBoeXNfY3B1czsKKwl1bnNpZ25lZCBsb25nIGVwZm47CiAJdW5zaWduZWQgbG9uZyBwZXJub2Rlc2l6ZSA9IDAsIHBlcm5vZGUsIHBhZ2VzLCBtYXBzaXplOwotCXZvaWQgKmNwdV9kYXRhOwogCXN0cnVjdCBib290bWVtX2RhdGEgKmJkcCA9ICZtZW1fZGF0YVtub2RlXS5ib290bWVtX2RhdGE7CiAKIAllcGZuID0gKHN0YXJ0ICsgbGVuKSA+PiBQQUdFX1NISUZUOwpAQCAtMzI5LDQ5ICsyNDIsMTIgQEAKIAkgKiBDYWxjdWxhdGUgdG90YWwgc2l6ZSBuZWVkZWQsIGluY2wuIHdoYXQncyBuZWNlc3NhcnkKIAkgKiBmb3IgZ29vZCBhbGlnbm1lbnQgYW5kIGFsaWFzIHByZXZlbnRpb24uCiAJICovCi0JY3B1cyA9IGVhcmx5X25yX2NwdXNfbm9kZShub2RlKTsKLQlwaHlzX2NwdXMgPSBlYXJseV9ucl9waHlzX2NwdXNfbm9kZShub2RlKTsKLQlwZXJub2Rlc2l6ZSArPSBQRVJDUFVfUEFHRV9TSVpFICogY3B1czsKLQlwZXJub2Rlc2l6ZSArPSBub2RlICogTDFfQ0FDSEVfQllURVM7Ci0JcGVybm9kZXNpemUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHBnX2RhdGFfdCkpOwotCXBlcm5vZGVzaXplICs9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWE2NF9ub2RlX2RhdGEpKTsKLQlwZXJub2Rlc2l6ZSA9IFBBR0VfQUxJR04ocGVybm9kZXNpemUpOworCXBlcm5vZGVzaXplID0gY29tcHV0ZV9wZXJub2Rlc2l6ZShub2RlKTsKIAlwZXJub2RlID0gTk9ERURBVEFfQUxJR04oc3RhcnQsIG5vZGUpOwogCiAJLyogSXMgdGhpcyByYW5nZSBiaWcgZW5vdWdoIGZvciB3aGF0IHdlIHdhbnQgdG8gc3RvcmUgaGVyZT8gKi8KLQlpZiAoc3RhcnQgKyBsZW4gPiAocGVybm9kZSArIHBlcm5vZGVzaXplICsgbWFwc2l6ZSkpIHsKLQkJbWVtX2RhdGFbbm9kZV0ucGVybm9kZV9hZGRyID0gcGVybm9kZTsKLQkJbWVtX2RhdGFbbm9kZV0ucGVybm9kZV9zaXplID0gcGVybm9kZXNpemU7Ci0JCW1lbXNldChfX3ZhKHBlcm5vZGUpLCAwLCBwZXJub2Rlc2l6ZSk7Ci0KLQkJY3B1X2RhdGEgPSAodm9pZCAqKXBlcm5vZGU7Ci0JCXBlcm5vZGUgKz0gUEVSQ1BVX1BBR0VfU0laRSAqIGNwdXM7Ci0JCXBlcm5vZGUgKz0gbm9kZSAqIEwxX0NBQ0hFX0JZVEVTOwotCi0JCW1lbV9kYXRhW25vZGVdLnBnZGF0ID0gX192YShwZXJub2RlKTsKLQkJcGVybm9kZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2YocGdfZGF0YV90KSk7Ci0KLQkJbWVtX2RhdGFbbm9kZV0ubm9kZV9kYXRhID0gX192YShwZXJub2RlKTsKLQkJcGVybm9kZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IGlhNjRfbm9kZV9kYXRhKSk7Ci0KLQkJbWVtX2RhdGFbbm9kZV0ucGdkYXQtPmJkYXRhID0gYmRwOwotCQlwZXJub2RlICs9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZihwZ19kYXRhX3QpKTsKLQotCQkvKgotCQkgKiBDb3B5IHRoZSBzdGF0aWMgcGVyLWNwdSBkYXRhIGludG8gdGhlIHJlZ2lvbiB3ZQotCQkgKiBqdXN0IHNldCBhc2lkZSBhbmQgdGhlbiBzZXR1cCBfX3Blcl9jcHVfb2Zmc2V0Ci0JCSAqIGZvciBlYWNoIENQVSBvbiB0aGlzIG5vZGUuCi0JCSAqLwotCQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSB7Ci0JCQlpZiAobm9kZSA9PSBub2RlX2NwdWlkW2NwdV0ubmlkKSB7Ci0JCQkJbWVtY3B5KF9fdmEoY3B1X2RhdGEpLCBfX3BoeXNfcGVyX2NwdV9zdGFydCwKLQkJCQkgICAgICAgX19wZXJfY3B1X2VuZCAtIF9fcGVyX2NwdV9zdGFydCk7Ci0JCQkJX19wZXJfY3B1X29mZnNldFtjcHVdID0gKGNoYXIqKV9fdmEoY3B1X2RhdGEpIC0KLQkJCQkJX19wZXJfY3B1X3N0YXJ0OwotCQkJCWNwdV9kYXRhICs9IFBFUkNQVV9QQUdFX1NJWkU7Ci0JCQl9Ci0JCX0KLQl9CisJaWYgKHN0YXJ0ICsgbGVuID4gKHBlcm5vZGUgKyBwZXJub2Rlc2l6ZSArIG1hcHNpemUpKQorCQlmaWxsX3Blcm5vZGUobm9kZSwgcGVybm9kZSwgcGVybm9kZXNpemUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MTEsNiArMjg3LDkgQEAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CiAJCXBnX2RhdGFfdCAqcGRwID0gbWVtX2RhdGFbbm9kZV0ucGdkYXQ7CiAKKwkJaWYgKG5vZGVfaXNzZXQobm9kZSwgbWVtb3J5X2xlc3NfbWFzaykpCisJCQljb250aW51ZTsKKwogCQliZHAgPSBwZHAtPmJkYXRhOwogCiAJCS8qIEZpcnN0IHRoZSBib290bWVtX21hcCBpdHNlbGYgKi8KQEAgLTQzNiw4ICszMTUsOCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdGlhbGl6ZV9wZXJub2RlX2RhdGEodm9pZCkKIHsKLQlpbnQgY3B1LCBub2RlOwogCXBnX2RhdGFfdCAqcGdkYXRfbGlzdFtNQVhfTlVNTk9ERVNdOworCWludCBjcHUsIG5vZGU7CiAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKQogCQlwZ2RhdF9saXN0W25vZGVdID0gbWVtX2RhdGFbbm9kZV0ucGdkYXQ7CkBAIC00NDcsMTIgKzMyNiw5OSBAQAogCQltZW1jcHkobWVtX2RhdGFbbm9kZV0ubm9kZV9kYXRhLT5wZ19kYXRhX3B0cnMsIHBnZGF0X2xpc3QsCiAJCSAgICAgICBzaXplb2YocGdkYXRfbGlzdCkpOwogCX0KLQorI2lmZGVmIENPTkZJR19TTVAKIAkvKiBTZXQgdGhlIG5vZGVfZGF0YSBwb2ludGVyIGZvciBlYWNoIHBlci1jcHUgc3RydWN0ICovCiAJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgewogCQlub2RlID0gbm9kZV9jcHVpZFtjcHVdLm5pZDsKIAkJcGVyX2NwdShjcHVfaW5mbywgY3B1KS5ub2RlX2RhdGEgPSBtZW1fZGF0YVtub2RlXS5ub2RlX2RhdGE7CiAJfQorI2Vsc2UKKwl7CisJCXN0cnVjdCBjcHVpbmZvX2lhNjQgKmNwdTBfY3B1X2luZm87CisJCWNwdSA9IDA7CisJCW5vZGUgPSBub2RlX2NwdWlkW2NwdV0ubmlkOworCQljcHUwX2NwdV9pbmZvID0gKHN0cnVjdCBjcHVpbmZvX2lhNjQgKikoX19waHlzX3Blcl9jcHVfc3RhcnQgKworCQkJKChjaGFyICopJnBlcl9jcHVfX2NwdV9pbmZvIC0gX19wZXJfY3B1X3N0YXJ0KSk7CisJCWNwdTBfY3B1X2luZm8tPm5vZGVfZGF0YSA9IG1lbV9kYXRhW25vZGVdLm5vZGVfZGF0YTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworfQorCisvKioKKyAqIG1lbW9yeV9sZXNzX25vZGVfYWxsb2MgLSAqIGF0dGVtcHQgdG8gYWxsb2NhdGUgbWVtb3J5IG9uIHRoZSBiZXN0IE5VTUEgc2xpdAorICogCW5vZGUgYnV0IGZhbGwgYmFjayB0byBhbnkgb3RoZXIgbm9kZSB3aGVuIF9fYWxsb2NfYm9vdG1lbV9ub2RlIGZhaWxzCisgKglmb3IgYmVzdC4KKyAqIEBuaWQ6IG5vZGUgaWQKKyAqIEBwZXJub2Rlc2l6ZTogc2l6ZSBvZiB0aGlzIG5vZGUncyBwZXJub2RlIGRhdGEKKyAqIEBhbGlnbjogYWxpZ25tZW50IHRvIHVzZSBmb3IgdGhpcyBub2RlJ3MgcGVybm9kZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCAqbWVtb3J5X2xlc3Nfbm9kZV9hbGxvYyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHBlcm5vZGVzaXplLAorCXVuc2lnbmVkIGxvbmcgYWxpZ24pCit7CisJdm9pZCAqcHRyID0gTlVMTDsKKwl1OCBiZXN0ID0gMHhmZjsKKwlpbnQgYmVzdG5vZGUgPSAtMSwgbm9kZTsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJaWYgKG5vZGVfaXNzZXQobm9kZSwgbWVtb3J5X2xlc3NfbWFzaykpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAobm9kZV9kaXN0YW5jZShuaWQsIG5vZGUpIDwgYmVzdCkgeworCQkJYmVzdCA9IG5vZGVfZGlzdGFuY2UobmlkLCBub2RlKTsKKwkJCWJlc3Rub2RlID0gbm9kZTsKKwkJfQorCX0KKworCXB0ciA9IF9fYWxsb2NfYm9vdG1lbV9ub2RlKG1lbV9kYXRhW2Jlc3Rub2RlXS5wZ2RhdCwKKwkJcGVybm9kZXNpemUsIGFsaWduLCBfX3BhKE1BWF9ETUFfQUREUkVTUykpOworCisJaWYgKCFwdHIpCisJCXBhbmljKCJOTyBtZW1vcnkgZm9yIG1lbW9yeSBsZXNzIG5vZGVcbiIpOworCXJldHVybiBwdHI7Cit9CisKKy8qKgorICogcGdkYXRfaW5zZXJ0IC0gaW5zZXJ0IHRoZSBwZ2RhdCBpbnRvIGdsb2JhbCBwZ2RhdF9saXN0CisgKiBAcGdkYXQ6IHRoZSBwZ2RhdCBmb3IgYSBub2RlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGdkYXRfaW5zZXJ0KHBnX2RhdGFfdCAqcGdkYXQpCit7CisJcGdfZGF0YV90ICpwcmV2ID0gTlVMTCwgKm5leHQ7CisKKwlmb3JfZWFjaF9wZ2RhdChuZXh0KQorCQlpZiAocGdkYXQtPm5vZGVfaWQgPCBuZXh0LT5ub2RlX2lkKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCXByZXYgPSBuZXh0OworCisJaWYgKHByZXYpIHsKKwkJcHJldi0+cGdkYXRfbmV4dCA9IHBnZGF0OworCQlwZ2RhdC0+cGdkYXRfbmV4dCA9IG5leHQ7CisJfSBlbHNlIHsKKwkJcGdkYXQtPnBnZGF0X25leHQgPSBwZ2RhdF9saXN0OworCQlwZ2RhdF9saXN0ID0gcGdkYXQ7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIG1lbW9yeV9sZXNzX25vZGVzIC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgQ1BVIG9ubHkgbm9kZXMgcGVybm9kZQorICoJaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBtZW1vcnlfbGVzc19ub2Rlcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcGVybm9kZXNpemU7CisJdm9pZCAqcGVybm9kZTsKKwlpbnQgbm9kZTsKKworCWZvcl9lYWNoX25vZGVfbWFzayhub2RlLCBtZW1vcnlfbGVzc19tYXNrKSB7CisJCXBlcm5vZGVzaXplID0gY29tcHV0ZV9wZXJub2Rlc2l6ZShub2RlKTsKKwkJcGVybm9kZSA9IG1lbW9yeV9sZXNzX25vZGVfYWxsb2Mobm9kZSwgcGVybm9kZXNpemUsCisJCQkobm9kZSkgPyAobm9kZSAqIFBFUkNQVV9QQUdFX1NJWkUpIDogKDEwMjQqMTAyNCkpOworCQlmaWxsX3Blcm5vZGUobm9kZSwgX19wYShwZXJub2RlKSwgcGVybm9kZXNpemUpOworCX0KKworCXJldHVybjsKIH0KIAogLyoqCkBAIC00NzIsMTYgKzQzOCwxOSBAQAogCQlub2RlX3NldF9vbmxpbmUoMCk7CiAJfQogCisJbm9kZXNfb3IobWVtb3J5X2xlc3NfbWFzaywgbWVtb3J5X2xlc3NfbWFzaywgbm9kZV9vbmxpbmVfbWFwKTsKIAltaW5fbG93X3BmbiA9IC0xOwogCW1heF9sb3dfcGZuID0gMDsKIAotCWlmIChudW1fb25saW5lX25vZGVzKCkgPiAxKQotCQlyZWFzc2lnbl9jcHVfb25seV9ub2RlcygpOwotCiAJLyogVGhlc2UgYWN0dWFsbHkgZW5kIHVwIGdldHRpbmcgY2FsbGVkIGJ5IGNhbGxfcGVybm9kZV9tZW1vcnkoKSAqLwogCWVmaV9tZW1tYXBfd2FsayhmaWx0ZXJfcnN2ZF9tZW1vcnksIGJ1aWxkX25vZGVfbWFwcyk7CiAJZWZpX21lbW1hcF93YWxrKGZpbHRlcl9yc3ZkX21lbW9yeSwgZmluZF9wZXJub2RlX3NwYWNlKTsKIAorCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpCisJCWlmIChtZW1fZGF0YVtub2RlXS5ib290bWVtX2RhdGEubm9kZV9sb3dfcGZuKSB7CisJCQlub2RlX2NsZWFyKG5vZGUsIG1lbW9yeV9sZXNzX21hc2spOworCQkJbWVtX2RhdGFbbm9kZV0ubWluX3BmbiA9IH4wVUw7CisJCX0KIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIGJvb3QgbWVtb3J5IG1hcHMgaW4gcmV2ZXJzZSBvcmRlciBzaW5jZSB0aGF0J3MKIAkgKiB3aGF0IHRoZSBib290bWVtIGFsbG9jYXRvciBleHBlY3RzCkBAIC00OTIsMTcgKzQ2MSwxNCBAQAogCiAJCWlmICghbm9kZV9vbmxpbmUobm9kZSkpCiAJCQljb250aW51ZTsKKwkJZWxzZSBpZiAobm9kZV9pc3NldChub2RlLCBtZW1vcnlfbGVzc19tYXNrKSkKKwkJCWNvbnRpbnVlOwogCiAJCWJkcCA9ICZtZW1fZGF0YVtub2RlXS5ib290bWVtX2RhdGE7CiAJCXBlcm5vZGUgPSBtZW1fZGF0YVtub2RlXS5wZXJub2RlX2FkZHI7CiAJCXBlcm5vZGVzaXplID0gbWVtX2RhdGFbbm9kZV0ucGVybm9kZV9zaXplOwogCQltYXAgPSBwZXJub2RlICsgcGVybm9kZXNpemU7CiAKLQkJLyogU2FuaXR5IGNoZWNrLi4uICovCi0JCWlmICghcGVybm9kZSkKLQkJCXBhbmljKCJwZXJub2RlIHNwYWNlIGZvciBub2RlICVkICIKLQkJCSAgICAgICJjb3VsZCBub3QgYmUgYWxsb2NhdGVkISIsIG5vZGUpOwotCiAJCWluaXRfYm9vdG1lbV9ub2RlKG1lbV9kYXRhW25vZGVdLnBnZGF0LAogCQkJCSAgbWFwPj5QQUdFX1NISUZULAogCQkJCSAgYmRwLT5ub2RlX2Jvb3Rfc3RhcnQ+PlBBR0VfU0hJRlQsCkBAIC01MTIsNiArNDc4LDcgQEAKIAllZmlfbWVtbWFwX3dhbGsoZmlsdGVyX3JzdmRfbWVtb3J5LCBmcmVlX25vZGVfYm9vdG1lbSk7CiAKIAlyZXNlcnZlX3Blcm5vZGVfc3BhY2UoKTsKKwltZW1vcnlfbGVzc19ub2RlcygpOwogCWluaXRpYWxpemVfcGVybm9kZV9kYXRhKCk7CiAKIAltYXhfcGZuID0gbWF4X2xvd19wZm47CkBAIC01MTksNiArNDg2LDcgQEAKIAlmaW5kX2luaXRyZCgpOwogfQogCisjaWZkZWYgQ09ORklHX1NNUAogLyoqCiAgKiBwZXJfY3B1X2luaXQgLSBzZXR1cCBwZXItY3B1IHZhcmlhYmxlcwogICoKQEAgLTUyOSwxNSArNDk3LDE1IEBACiB7CiAJaW50IGNwdTsKIAotCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCkgewotCQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSB7Ci0JCQlwZXJfY3B1KGxvY2FsX3Blcl9jcHVfb2Zmc2V0LCBjcHUpID0KLQkJCQlfX3Blcl9jcHVfb2Zmc2V0W2NwdV07Ci0JCX0KLQl9CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKQorCQlyZXR1cm4gX19wZXJfY3B1X3N0YXJ0ICsgX19wZXJfY3B1X29mZnNldFtzbXBfcHJvY2Vzc29yX2lkKCldOworCisJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykKKwkJcGVyX2NwdShsb2NhbF9wZXJfY3B1X29mZnNldCwgY3B1KSA9IF9fcGVyX2NwdV9vZmZzZXRbY3B1XTsKIAogCXJldHVybiBfX3Blcl9jcHVfc3RhcnQgKyBfX3Blcl9jcHVfb2Zmc2V0W3NtcF9wcm9jZXNzb3JfaWQoKV07CiB9CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAvKioKICAqIHNob3dfbWVtIC0gZ2l2ZSBzaG9ydCBzdW1tYXJ5IG9mIG1lbW9yeSBzdGF0cwpAQCAtNjgwLDEyICs2NDgsMTMgQEAKIAogCW1heF9kbWEgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKikgTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOwogCi0JLyogc28gbWluKCkgd2lsbCB3b3JrIGluIGNvdW50X25vZGVfcGFnZXMgKi8KLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKQotCQltZW1fZGF0YVtub2RlXS5taW5fcGZuID0gfjBVTDsKLQogCWVmaV9tZW1tYXBfd2FsayhmaWx0ZXJfcnN2ZF9tZW1vcnksIGNvdW50X25vZGVfcGFnZXMpOwogCisJdm1hbGxvY19lbmQgLT0gUEFHRV9BTElHTihtYXhfbG93X3BmbiAqIHNpemVvZihzdHJ1Y3QgcGFnZSkpOworCXZtZW1fbWFwID0gKHN0cnVjdCBwYWdlICopIHZtYWxsb2NfZW5kOworCWVmaV9tZW1tYXBfd2FsayhjcmVhdGVfbWVtX21hcF9wYWdlX3RhYmxlLCBOVUxMKTsKKwlwcmludGsoIlZpcnR1YWwgbWVtX21hcCBzdGFydHMgYXQgMHglcFxuIiwgdm1lbV9tYXApOworCiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCQltZW1zZXQoem9uZXNfc2l6ZSwgMCwgc2l6ZW9mKHpvbmVzX3NpemUpKTsKIAkJbWVtc2V0KHpob2xlc19zaXplLCAwLCBzaXplb2YoemhvbGVzX3NpemUpKTsKQEAgLTcxOSwxNSArNjg4LDYgQEAKIAkJCQkgbWVtX2RhdGFbbm9kZV0ubnVtX2RtYV9waHlzcGFnZXMpOwogCQl9CiAKLQkJaWYgKG5vZGUgPT0gMCkgewotCQkJdm1hbGxvY19lbmQgLT0KLQkJCQlQQUdFX0FMSUdOKG1heF9sb3dfcGZuICogc2l6ZW9mKHN0cnVjdCBwYWdlKSk7Ci0JCQl2bWVtX21hcCA9IChzdHJ1Y3QgcGFnZSAqKSB2bWFsbG9jX2VuZDsKLQotCQkJZWZpX21lbW1hcF93YWxrKGNyZWF0ZV9tZW1fbWFwX3BhZ2VfdGFibGUsIE5VTEwpOwotCQkJcHJpbnRrKCJWaXJ0dWFsIG1lbV9tYXAgc3RhcnRzIGF0IDB4JXBcbiIsIHZtZW1fbWFwKTsKLQkJfQotCiAJCXBmbl9vZmZzZXQgPSBtZW1fZGF0YVtub2RlXS5taW5fcGZuOwogCiAJCU5PREVfREFUQShub2RlKS0+bm9kZV9tZW1fbWFwID0gdm1lbV9tYXAgKyBwZm5fb2Zmc2V0OwpAQCAtNzM1LDUgKzY5NSwxMSBAQAogCQkJCSAgICBwZm5fb2Zmc2V0LCB6aG9sZXNfc2l6ZSk7CiAJfQogCisJLyoKKwkgKiBNYWtlIG1lbW9yeSBsZXNzIG5vZGVzIGJlY29tZSBhIG1lbWJlciBvZiB0aGUga25vd24gbm9kZXMuCisJICovCisJZm9yX2VhY2hfbm9kZV9tYXNrKG5vZGUsIG1lbW9yeV9sZXNzX21hc2spCisJCXBnZGF0X2luc2VydChtZW1fZGF0YVtub2RlXS5wZ2RhdCk7CisKIAl6ZXJvX3BhZ2VfbWVtbWFwX3B0ciA9IHZpcnRfdG9fcGFnZShpYTY0X2ltdmEoZW1wdHlfemVyb19wYWdlKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vaW5pdC5jIGIvYXJjaC9pYTY0L21tL2luaXQuYwppbmRleCA0ZWIyZjUyLi42NWY5OTU4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKQEAgLTU5Nyw3ICs1OTcsOCBAQAogCWtjbGlzdF9hZGQoJmtjb3JlX2tlcm5lbCwgX3N0ZXh0LCBfZW5kIC0gX3N0ZXh0KTsKIAogCWZvcl9lYWNoX3BnZGF0KHBnZGF0KQotCQl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FsbF9ib290bWVtX25vZGUocGdkYXQpOworCQlpZiAocGdkYXQtPmJkYXRhLT5ub2RlX2Jvb3RtZW1fbWFwKQorCQkJdG90YWxyYW1fcGFnZXMgKz0gZnJlZV9hbGxfYm9vdG1lbV9ub2RlKHBnZGF0KTsKIAogCXJlc2VydmVkX3BhZ2VzID0gMDsKIAllZmlfbWVtbWFwX3dhbGsoY291bnRfcmVzZXJ2ZWRfcGFnZXMsICZyZXNlcnZlZF9wYWdlcyk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaCBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCmluZGV4IDg2OGU3ZWMuLjU4MGExYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCisrKyBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCkBAIC04LDYgKzgsOCBAQAogI2lmbmRlZiBfQVNNX0lBNjRfU05fWFRBTEtfSFVCREVWX0gKICNkZWZpbmUgX0FTTV9JQTY0X1NOX1hUQUxLX0hVQkRFVl9ICiAKKyNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCisKICNkZWZpbmUgSFVCX1dJREdFVF9JRF9NQVggMHhmCiAjZGVmaW5lIERFVl9QRVJfV0lER0VUICgyKjIqOCkKICNkZWZpbmUgSUlPX0lUVEVfV0lER0VUX0JJVFMgICAgNCAgICAgICAvKiBzaXplIG9mIHdpZGdldCBmaWVsZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYwppbmRleCA3ODNlYjQzLi5hNjdmMzllIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYwpAQCAtOSwyMSArOSwyOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vZ2VvLmg+CisjaW5jbHVkZSA8YXNtL3NuL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgotI2luY2x1ZGUgInBjaS9wY2licl9wcm92aWRlci5oIgotI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKLSNpbmNsdWRlIDxhc20vc24vZ2VvLmg+Ci0jaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCi0jaW5jbHVkZSA8YXNtL3NuL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NpbXVsYXRvci5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KICNpbmNsdWRlIDxhc20vc24vdGlvY2FfcHJvdmlkZXIuaD4KKyNpbmNsdWRlICJ4dGFsay9odWJkZXYuaCIKKyNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCiAKLWNoYXIgbWFzdGVyX2Jhc2Vpb193aWQ7CiBuYXNpZF90IG1hc3Rlcl9uYXNpZCA9IElOVkFMSURfTkFTSUQ7CS8qIFBhcnRpdGlvbiBNYXN0ZXIgKi8KIAorc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc25fc3lzZGF0YV9saXN0OworCisvKiBzeXNkYXRhIGxpc3Qgc3RydWN0ICovCitzdHJ1Y3Qgc3lzZGF0YV9lbCB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwl2b2lkICpzeXNkYXRhOworfTsKKwogc3RydWN0IHNsYWJfaW5mbyB7CiAJc3RydWN0IGh1YmRldl9pbmZvIGh1YmRldjsKIH07CkBAIC0xMzgsMjMgKzE0NSw2IEBACiB9CiAKIC8qCi0gKiBzbl9hbGxvY19wY2lfc3lzZGF0YSgpIC0gVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBhIHBjaSBjb250cm9sbGVyCi0gKgl3aGljaCBpcyBleHBlY3RlZCBhcyB0aGUgcGNpX2RldiBhbmQgcGNpX2J1cyBzeXNkYXRhIGJ5IHRoZSBMaW51eAotICoJUENJIGluZnJhc3RydWN0dXJlLgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfY29udHJvbGxlciAqc25fYWxsb2NfcGNpX3N5c2RhdGEodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9zeXNkYXRhOwotCi0JcGNpX3N5c2RhdGEgPSBrbWFsbG9jKHNpemVvZigqcGNpX3N5c2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjaV9zeXNkYXRhKQotCQlCVUcoKTsKLQotCW1lbXNldChwY2lfc3lzZGF0YSwgMCwgc2l6ZW9mKCpwY2lfc3lzZGF0YSkpOwotCXJldHVybiBwY2lfc3lzZGF0YTsKLX0KLQotLyoKICAqIHNuX2ZpeHVwX2lvbm9kZXMoKSAtIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgSFVCIGRhdGEgc3RyY3V0dXJlIGZvciAKICAqCWVhY2ggbm9kZSBpbiB0aGUgc3lzdGVtLgogICovCkBAIC0yMjEsMjIgKzIxMSwzNCBAQAogCiB9CiAKK3ZvaWQgc25fcGNpX3VuZml4dXBfc2xvdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpob3N0X3BjaV9kZXYgPSBTTl9QQ0lERVZfSU5GTyhkZXYpLT5ob3N0X3BjaV9kZXY7CisKKwlzbl9pcnFfdW5maXh1cChkZXYpOworCXBjaV9kZXZfcHV0KGhvc3RfcGNpX2Rldik7CisJcGNpX2Rldl9wdXQoZGV2KTsKK30KKwogLyoKICAqIHNuX3BjaV9maXh1cF9zbG90KCkgLSBUaGlzIHJvdXRpbmUgc2V0cyB1cCBhIHNsb3QncyByZXNvdXJjZXMKICAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgTGludXggUENJIGFic3RyYWN0aW9uIGxheWVyLiAgUmVzb3VyY2VzIGFjcXVpcmVkCiAgKiBmcm9tIG91ciBQQ0kgcHJvdmlkZXIgaW5jbHVkZSBQSU8gbWFwcyB0byBCQVIgc3BhY2UgYW5kIGludGVycnVwdAogICogb2JqZWN0cy4KICAqLwotc3RhdGljIHZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3ZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpbnQgaWR4OwogCWludCBzZWdtZW50ID0gMDsKLQl1aW50NjRfdCBzaXplOwotCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87Ci0Jc3RydWN0IHBjaV9kZXYgKmhvc3RfcGNpX2RldjsKIAlpbnQgc3RhdHVzID0gMDsKIAlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKmJzOworIAlzdHJ1Y3QgcGNpX2J1cyAqaG9zdF9wY2lfYnVzOworIAlzdHJ1Y3QgcGNpX2RldiAqaG9zdF9wY2lfZGV2OworIAlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvOworIAl1bnNpZ25lZCBsb25nIHNpemU7CisgCXVuc2lnbmVkIGludCBidXNfbm8sIGRldmZuOwogCisJcGNpX2Rldl9nZXQoZGV2KTsgLyogZm9yIHRoZSBzeXNkYXRhIHBvaW50ZXIgKi8KIAlkZXYtPnN5c2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoU05fUENJREVWX0lORk8oZGV2KSA8PSAwKQogCQlCVUcoKTsJCS8qIENhbm5vdCBhZmZvcmQgdG8gcnVuIG91dCBvZiBtZW1vcnkgKi8KQEAgLTI1Myw3ICsyNTUsNyBAQAogCQkJCSAgICAgKHU2NCkgX19wYShTTl9QQ0lERVZfSU5GTyhkZXYpKSwKIAkJCQkgICAgICh1NjQpIF9fcGEoc25faXJxX2luZm8pKTsKIAlpZiAoc3RhdHVzKQotCQlCVUcoKTsJCS8qIENhbm5vdCBnZXQgcGxhdGZvcm0gcGNpIGRldmljZSBpbmZvcm1hdGlvbiBpbmZvcm1hdGlvbiAqLworCQlCVUcoKTsgLyogQ2Fubm90IGdldCBwbGF0Zm9ybSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uICovCiAKIAkvKiBDb3B5IG92ZXIgUElPIE1hcHBlZCBBZGRyZXNzZXMgKi8KIAlmb3IgKGlkeCA9IDA7IGlkeCA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpZHgrKykgewpAQCAtMjc1LDE1ICsyNzcsMjEgQEAKIAkJCWRldi0+cmVzb3VyY2VbaWR4XS5wYXJlbnQgPSAmaW9tZW1fcmVzb3VyY2U7CiAJfQogCi0JLyogc2V0IHVwIGhvc3QgYnVzIGxpbmthZ2VzICovCi0JYnMgPSBTTl9QQ0lCVVNfQlVTU09GVChkZXYtPmJ1cyk7Ci0JaG9zdF9wY2lfZGV2ID0KLQkgICAgcGNpX2ZpbmRfc2xvdChTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfc2xvdF9ob3N0X2hhbmRsZSA+PiAzMiwKLQkJCSAgU05fUENJREVWX0lORk8oZGV2KS0+Ci0JCQkgIHBkaV9zbG90X2hvc3RfaGFuZGxlICYgMHhmZmZmZmZmZik7CisJLyoKKwkgKiBVc2luZyB0aGUgUFJPTXMgdmFsdWVzIGZvciB0aGUgUENJIGhvc3QgYnVzLCBnZXQgdGhlIExpbnV4CisgCSAqIFBDSSBob3N0X3BjaV9kZXYgc3RydWN0IGFuZCBzZXQgdXAgaG9zdCBidXMgbGlua2FnZXMKKyAJICovCisKKyAJYnVzX25vID0gU05fUENJREVWX0lORk8oZGV2KS0+cGRpX3Nsb3RfaG9zdF9oYW5kbGUgPj4gMzI7CisgCWRldmZuID0gU05fUENJREVWX0lORk8oZGV2KS0+cGRpX3Nsb3RfaG9zdF9oYW5kbGUgJiAweGZmZmZmZmZmOworIAlob3N0X3BjaV9idXMgPSBwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihkZXYtPmJ1cyksIGJ1c19ubyk7CisgCWhvc3RfcGNpX2RldiA9IHBjaV9nZXRfc2xvdChob3N0X3BjaV9idXMsIGRldmZuKTsKKworCVNOX1BDSURFVl9JTkZPKGRldiktPmhvc3RfcGNpX2RldiA9IGhvc3RfcGNpX2RldjsKIAlTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfaG9zdF9wY2lkZXZfaW5mbyA9Ci0JICAgIFNOX1BDSURFVl9JTkZPKGhvc3RfcGNpX2Rldik7CisJICAgIAkJCQkJU05fUENJREVWX0lORk8oaG9zdF9wY2lfZGV2KTsKIAlTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfbGludXhfcGNpZGV2ID0gZGV2OworCWJzID0gU05fUENJQlVTX0JVU1NPRlQoZGV2LT5idXMpOwogCVNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9wY2lidXNfaW5mbyA9IGJzOwogCiAJaWYgKGJzICYmIGJzLT5ic19hc2ljX3R5cGUgPCBQQ0lJT19BU0lDX01BWF9UWVBFUykgewpAQCAtMjk3LDYgKzMwNSw5IEBACiAJCVNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9zbl9pcnFfaW5mbyA9IHNuX2lycV9pbmZvOwogCQlkZXYtPmlycSA9IFNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9zbl9pcnFfaW5mby0+aXJxX2lycTsKIAkJc25faXJxX2ZpeHVwKGRldiwgc25faXJxX2luZm8pOworCX0gZWxzZSB7CisJCVNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9zbl9pcnFfaW5mbyA9IE5VTEw7CisJCWtmcmVlKHNuX2lycV9pbmZvKTsKIAl9CiB9CiAKQEAgLTMwNCw1NSArMzE1LDU3IEBACiAgKiBzbl9wY2lfY29udHJvbGxlcl9maXh1cCgpIC0gVGhpcyByb3V0aW5lIHNldHMgdXAgYSBidXMncyByZXNvdXJjZXMKICAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgTGludXggUENJIGFic3RyYWN0aW9uIGxheWVyLgogICovCi1zdGF0aWMgdm9pZCBzbl9wY2lfY29udHJvbGxlcl9maXh1cChpbnQgc2VnbWVudCwgaW50IGJ1c251bSkKK3ZvaWQgc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoaW50IHNlZ21lbnQsIGludCBidXNudW0sIHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IG5hc2lkLCBjbm9kZTsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlcjsKIAlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKnByb21fYnVzc29mdF9wdHI7CiAJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXZfaW5mbzsKIAl2b2lkICpwcm92aWRlcl9zb2Z0OwogCXN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnByb3ZpZGVyOwogCi0Jc3RhdHVzID0KLQkgICAgc2FsX2dldF9wY2lidXNfaW5mbygodTY0KSBzZWdtZW50LCAodTY0KSBidXNudW0sCi0JCQkJKHU2NCkgaWE2NF90cGEoJnByb21fYnVzc29mdF9wdHIpKTsKLQlpZiAoc3RhdHVzID4gMCkgewotCQlyZXR1cm47CQkvKiBidXMgIyBkb2VzIG5vdCBleGlzdCAqLwotCX0KLQorIAlzdGF0dXMgPSBzYWxfZ2V0X3BjaWJ1c19pbmZvKCh1NjQpIHNlZ21lbnQsICh1NjQpIGJ1c251bSwKKyAJCQkJICAgICAodTY0KSBpYTY0X3RwYSgmcHJvbV9idXNzb2Z0X3B0cikpOworIAlpZiAoc3RhdHVzID4gMCkKKwkJcmV0dXJuOwkJLypidXMgIyBkb2VzIG5vdCBleGlzdCAqLwogCXByb21fYnVzc29mdF9wdHIgPSBfX3ZhKHByb21fYnVzc29mdF9wdHIpOwotCWNvbnRyb2xsZXIgPSBzbl9hbGxvY19wY2lfc3lzZGF0YSgpOwotCS8qIGNvbnRyb2xsZXIgbm9uLXplcm8gaXMgQlVHJ2QgaW4gc25fYWxsb2NfcGNpX3N5c2RhdGEgKi8KIAotCWJ1cyA9IHBjaV9zY2FuX2J1cyhidXNudW0sICZwY2lfcm9vdF9vcHMsIGNvbnRyb2xsZXIpOworIAljb250cm9sbGVyID0ga2NhbGxvYygxLHNpemVvZihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIpLCBHRlBfS0VSTkVMKTsKKyAJaWYgKCFjb250cm9sbGVyKQorIAkJQlVHKCk7CisKIAlpZiAoYnVzID09IE5VTEwpIHsKLQkJcmV0dXJuOwkJLyogZXJyb3IsIG9yIGJ1cyBhbHJlYWR5IHNjYW5uZWQgKi8KKyAJCWJ1cyA9IHBjaV9zY2FuX2J1cyhidXNudW0sICZwY2lfcm9vdF9vcHMsIGNvbnRyb2xsZXIpOworIAkJaWYgKGJ1cyA9PSBOVUxMKQorIAkJCXJldHVybjsJLyogZXJyb3IsIG9yIGJ1cyBhbHJlYWR5IHNjYW5uZWQgKi8KKyAJCWJ1cy0+c3lzZGF0YSA9IE5VTEw7CiAJfQogCisJaWYgKGJ1cy0+c3lzZGF0YSkKKwkJZ290byBlcnJvcl9yZXR1cm47IC8qIHN5c2RhdGEgYWxyZWFkeSBhbGxvYydkICovCisKIAkvKgogCSAqIFBlci1wcm92aWRlciBmaXh1cC4gIENvcGllcyB0aGUgY29udGVudHMgZnJvbSBwcm9tIHRvIGxvY2FsCiAJICogYXJlYSBhbmQgbGlua3MgU05fUENJQlVTX0JVU1NPRlQoKS4KIAkgKi8KIAotCWlmIChwcm9tX2J1c3NvZnRfcHRyLT5ic19hc2ljX3R5cGUgPj0gUENJSU9fQVNJQ19NQVhfVFlQRVMpIHsKKwlpZiAocHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlID49IFBDSUlPX0FTSUNfTUFYX1RZUEVTKQogCQlyZXR1cm47CQkvKiB1bnN1cHBvcnRlZCBhc2ljIHR5cGUgKi8KLQl9CisKKwlpZiAocHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9QUEIpCisJCWdvdG8gZXJyb3JfcmV0dXJuOyAvKiBubyBmdXJ0aGVyIGZpeHVwIG5lY2Vzc2FyeSAqLwogCiAJcHJvdmlkZXIgPSBzbl9wY2lfcHJvdmlkZXJbcHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlXTsKLQlpZiAocHJvdmlkZXIgPT0gTlVMTCkgeworCWlmIChwcm92aWRlciA9PSBOVUxMKQogCQlyZXR1cm47CQkvKiBubyBwcm92aWRlciByZWdpc3RlcmQgZm9yIHRoaXMgYXNpYyAqLwotCX0KIAogCXByb3ZpZGVyX3NvZnQgPSBOVUxMOwotCWlmIChwcm92aWRlci0+YnVzX2ZpeHVwKSB7CisJaWYgKHByb3ZpZGVyLT5idXNfZml4dXApCiAJCXByb3ZpZGVyX3NvZnQgPSAoKnByb3ZpZGVyLT5idXNfZml4dXApIChwcm9tX2J1c3NvZnRfcHRyKTsKLQl9CiAKLQlpZiAocHJvdmlkZXJfc29mdCA9PSBOVUxMKSB7CisJaWYgKHByb3ZpZGVyX3NvZnQgPT0gTlVMTCkKIAkJcmV0dXJuOwkJLyogZml4dXAgZmFpbGVkIG9yIG5vdCBhcHBsaWNhYmxlICovCi0JfQogCiAJLyoKIAkgKiBHZW5lcmljIGJ1cyBmaXh1cCBnb2VzIGhlcmUuICBEb24ndCByZWZlcmVuY2UgcHJvbV9idXNzb2Z0X3B0cgpAQCAtMzYxLDEyICszNzQsNDcgQEAKIAogCWJ1cy0+c3lzZGF0YSA9IGNvbnRyb2xsZXI7CiAJUENJX0NPTlRST0xMRVIoYnVzKS0+cGxhdGZvcm1fZGF0YSA9IHByb3ZpZGVyX3NvZnQ7Ci0KIAluYXNpZCA9IE5BU0lEX0dFVChTTl9QQ0lCVVNfQlVTU09GVChidXMpLT5ic19iYXNlKTsKIAljbm9kZSA9IG5hc2lkX3RvX2Nub2RlaWQobmFzaWQpOwogCWh1YmRldl9pbmZvID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGNub2RlKS0+cGRpbmZvKTsKIAlTTl9QQ0lCVVNfQlVTU09GVChidXMpLT5ic194d2lkZ2V0X2luZm8gPQogCSAgICAmKGh1YmRldl9pbmZvLT5oZGlfeHdpZGdldF9pbmZvW1NOX1BDSUJVU19CVVNTT0ZUKGJ1cyktPmJzX3hpZF0pOworCisJcmV0dXJuOworCitlcnJvcl9yZXR1cm46CisKKwlrZnJlZShjb250cm9sbGVyKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgc25fYnVzX3N0b3JlX3N5c2RhdGEoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3lzZGF0YV9lbCAqZWxlbWVudDsKKworCWVsZW1lbnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc3lzZGF0YV9lbCksIEdGUF9LRVJORUwpOworCWlmICghZWxlbWVudCkgeworCQlkZXZfZGJnKGRldiwgIiVzOiBvdXQgb2YgbWVtb3J5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwllbGVtZW50LT5zeXNkYXRhID0gZGV2LT5zeXNkYXRhOworCWxpc3RfYWRkKCZlbGVtZW50LT5lbnRyeSwgJnNuX3N5c2RhdGFfbGlzdCk7Cit9CisKK3ZvaWQgc25fYnVzX2ZyZWVfc3lzZGF0YSh2b2lkKQoreworCXN0cnVjdCBzeXNkYXRhX2VsICplbGVtZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKK3NuX3N5c2RhdGFfZnJlZV9zdGFydDoKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZzbl9zeXNkYXRhX2xpc3QpIHsKKwkJZWxlbWVudCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHN5c2RhdGFfZWwsIGVudHJ5KTsKKwkJbGlzdF9kZWwoJmVsZW1lbnQtPmVudHJ5KTsKKwkJa2ZyZWUoZWxlbWVudC0+c3lzZGF0YSk7CisJCWtmcmVlKGVsZW1lbnQpOworCQlnb3RvIHNuX3N5c2RhdGFfZnJlZV9zdGFydDsKKwl9CisJcmV0dXJuOwogfQogCiAvKgpAQCAtNDAzLDIwICs0NTEsMTcgQEAKIAkgKi8KIAlpYTY0X21heF9pb21tdV9tZXJnZV9tYXNrID0gflBBR0VfTUFTSzsKIAlzbl9maXh1cF9pb25vZGVzKCk7Ci0Jc25faXJxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvICopICogTlJfSVJRUywgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNuX2lycSA8PSAwKQotCQlCVUcoKTsJCS8qIENhbm5vIGFmZm9yZCB0byBydW4gb3V0IG9mIG1lbW9yeS4gKi8KLQltZW1zZXQoc25faXJxLCAwLCBzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvICopICogTlJfSVJRUyk7Ci0KKwlzbl9pcnFfbGhfaW5pdCgpOworCUlOSVRfTElTVF9IRUFEKCZzbl9zeXNkYXRhX2xpc3QpOwogCXNuX2luaXRfY3BlaV90aW1lcigpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlyZWdpc3Rlcl9zbl9wcm9jZnMoKTsKICNlbmRpZgogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9CVVNFU19UT19TQ0FOOyBpKyspIHsKLQkJc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoMCwgaSk7Ci0JfQorCS8qIGJ1c3NlcyBhcmUgbm90IGtub3duIHlldCAuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUENJX0JVU0VTX1RPX1NDQU47IGkrKykKKwkJc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoMCwgaSwgTlVMTCk7CiAKIAkvKgogCSAqIEdlbmVyaWMgTGludXggUENJIExheWVyIGhhcyBjcmVhdGVkIHRoZSBwY2lfYnVzIGFuZCBwY2lfZGV2IApAQCAtNDI1LDkgKzQ3MCw4IEBACiAJICovCiAKIAl3aGlsZSAoKHBjaV9kZXYgPQotCQlwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpICE9IE5VTEwpIHsKKwkJcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpICE9IE5VTEwpCiAJCXNuX3BjaV9maXh1cF9zbG90KHBjaV9kZXYpOwotCX0KIAogCXNuX2lvaWZfaW5pdGVkID0gMTsJLyogc24gSS9PIGluZnJhc3RydWN0dXJlIG5vdyBpbml0aWFsaXplZCAqLwogCkBAIC00NjksMyArNTEzLDggQEAKIH0KIAogc3Vic3lzX2luaXRjYWxsKHNuX3BjaV9pbml0KTsKK0VYUE9SVF9TWU1CT0woc25fcGNpX2ZpeHVwX3Nsb3QpOworRVhQT1JUX1NZTUJPTChzbl9wY2lfdW5maXh1cF9zbG90KTsKK0VYUE9SVF9TWU1CT0woc25fcGNpX2NvbnRyb2xsZXJfZml4dXApOworRVhQT1JUX1NZTUJPTChzbl9idXNfc3RvcmVfc3lzZGF0YSk7CitFWFBPUlRfU1lNQk9MKHNuX2J1c19mcmVlX3N5c2RhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKaW5kZXggMGY0ZTgxMzguLjg0ZDI3NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwpAQCAtOSwxMyArOSwxMyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vc24vaW50ci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FyY2guaD4KLSNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCisjaW5jbHVkZSA8YXNtL3NuL2ludHIuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+Ci0jaW5jbHVkZSAicGNpL3BjaWJyX3Byb3ZpZGVyLmgiCiAjaW5jbHVkZSA8YXNtL3NuL3NodWJfbW1yLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogCkBAIC0yNSw3ICsyNSw4IEBACiAKIGV4dGVybiBpbnQgc25fZm9yY2VfaW50ZXJydXB0X2ZsYWc7CiBleHRlcm4gaW50IHNuX2lvaWZfaW5pdGVkOwotc3RydWN0IHNuX2lycV9pbmZvICoqc25faXJxOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKipzbl9pcnFfbGg7CitzdGF0aWMgc3BpbmxvY2tfdCBzbl9pcnFfaW5mb19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOyAvKiBub24tSVJRIGxvY2sgKi8KIAogc3RhdGljIGlubGluZSB1aW50NjRfdCBzbl9pbnRyX2FsbG9jKG5hc2lkX3QgbG9jYWxfbmFzaWQsIGludCBsb2NhbF93aWRnZXQsCiAJCQkJICAgICB1NjQgc25faXJxX2luZm8sCkBAIC0xMDEsNyArMTAyLDcgQEAKIAkJbmFzaWQgPSBnZXRfbmFzaWQoKTsKIAkJZXZlbnRfb2NjdXJyZWQgPSBIVUJfTCgodWludDY0X3QgKikgR0xPQkFMX01NUl9BRERSCiAJCQkJICAgICAgIChuYXNpZCwgU0hfRVZFTlRfT0NDVVJSRUQpKTsKLQkJLyogSWYgdGhlIFVBUlQgYml0IGlzIHNldCBoZXJlLCB3ZSBtYXkgaGF2ZSByZWNlaXZlZCBhbiAKKwkJLyogSWYgdGhlIFVBUlQgYml0IGlzIHNldCBoZXJlLCB3ZSBtYXkgaGF2ZSByZWNlaXZlZCBhbgogCQkgKiBpbnRlcnJ1cHQgZnJvbSB0aGUgVUFSVCB0aGF0IHRoZSBkcml2ZXIgbWlzc2VkLiAgVG8KIAkJICogbWFrZSBzdXJlLCB3ZSBJUEkgb3Vyc2VsdmVzIHRvIGZvcmNlIHVzIHRvIGxvb2sgYWdhaW4uCiAJCSAqLwpAQCAtMTE1LDgyICsxMTYsODQgQEAKIAkJZm9yY2VfaW50ZXJydXB0KGlycSk7CiB9CiAKK3N0YXRpYyB2b2lkIHNuX2lycV9pbmZvX2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKTsKKwogc3RhdGljIHZvaWQgc25fc2V0X2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKIHsKLQlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvID0gc25faXJxW2lycV07Ci0Jc3RydWN0IHNuX2lycV9pbmZvICp0bXBfc25faXJxX2luZm87CisJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbywgKnNuX2lycV9pbmZvX3NhZmU7CiAJaW50IGNwdWlkLCBjcHVwaHlzOwotCW5hc2lkX3QgdF9uYXNpZDsJLyogbmFzaWQgdG8gdGFyZ2V0ICovCi0JaW50IHRfc2xpY2U7CQkvKiBzbGljZSB0byB0YXJnZXQgKi8KLQotCS8qIGFsbG9jYXRlIGEgdGVtcCBzbl9pcnFfaW5mbyBzdHJ1Y3QgdG8gZ2V0IG5ldyB0YXJnZXQgaW5mbyAqLwotCXRtcF9zbl9pcnFfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCp0bXBfc25faXJxX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRtcF9zbl9pcnFfaW5mbykKLQkJcmV0dXJuOwogCiAJY3B1aWQgPSBmaXJzdF9jcHUobWFzayk7CiAJY3B1cGh5cyA9IGNwdV9waHlzaWNhbF9pZChjcHVpZCk7Ci0JdF9uYXNpZCA9IGNwdWlkX3RvX25hc2lkKGNwdWlkKTsKLQl0X3NsaWNlID0gY3B1aWRfdG9fc2xpY2UoY3B1aWQpOwogCi0Jd2hpbGUgKHNuX2lycV9pbmZvKSB7Ci0JCWludCBzdGF0dXM7Ci0JCWludCBsb2NhbF93aWRnZXQ7Ci0JCXVpbnQ2NF90IGJyaWRnZSA9ICh1aW50NjRfdCkgc25faXJxX2luZm8tPmlycV9icmlkZ2U7Ci0JCW5hc2lkX3QgbG9jYWxfbmFzaWQgPSBOQVNJRF9HRVQoYnJpZGdlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc25faXJxX2luZm8sIHNuX2lycV9pbmZvX3NhZmUsCisJCQkJIHNuX2lycV9saFtpcnFdLCBsaXN0KSB7CisJCXVpbnQ2NF90IGJyaWRnZTsKKwkJaW50IGxvY2FsX3dpZGdldCwgc3RhdHVzOworCQluYXNpZF90IGxvY2FsX25hc2lkOworCQlzdHJ1Y3Qgc25faXJxX2luZm8gKm5ld19pcnFfaW5mbzsKIAotCQlpZiAoIWJyaWRnZSkKLQkJCWJyZWFrOwkvKiBpcnEgaXMgbm90IGEgZGV2aWNlIGludGVycnVwdCAqLworCQluZXdfaXJxX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25faXJxX2luZm8pLCBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld19pcnFfaW5mbyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCW1lbWNweShuZXdfaXJxX2luZm8sIHNuX2lycV9pbmZvLCBzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvKSk7CisKKwkJYnJpZGdlID0gKHVpbnQ2NF90KSBuZXdfaXJxX2luZm8tPmlycV9icmlkZ2U7CisJCWlmICghYnJpZGdlKSB7CisJCQlrZnJlZShuZXdfaXJxX2luZm8pOworCQkJYnJlYWs7IC8qIGlycSBpcyBub3QgYSBkZXZpY2UgaW50ZXJydXB0ICovCisJCX0KKworCQlsb2NhbF9uYXNpZCA9IE5BU0lEX0dFVChicmlkZ2UpOwogCiAJCWlmIChsb2NhbF9uYXNpZCAmIDEpCiAJCQlsb2NhbF93aWRnZXQgPSBUSU9fU1dJTl9XSURHRVROVU0oYnJpZGdlKTsKIAkJZWxzZQogCQkJbG9jYWxfd2lkZ2V0ID0gU1dJTl9XSURHRVROVU0oYnJpZGdlKTsKIAotCQkvKiBGcmVlIHRoZSBvbGQgUFJPTSBzbl9pcnFfaW5mbyBzdHJ1Y3R1cmUgKi8KLQkJc25faW50cl9mcmVlKGxvY2FsX25hc2lkLCBsb2NhbF93aWRnZXQsIHNuX2lycV9pbmZvKTsKKwkJLyogRnJlZSB0aGUgb2xkIFBST00gbmV3X2lycV9pbmZvIHN0cnVjdHVyZSAqLworCQlzbl9pbnRyX2ZyZWUobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgbmV3X2lycV9pbmZvKTsKKwkJLyogVXBkYXRlIGtlcm5lbHMgbmV3X2lycV9pbmZvIHdpdGggbmV3IHRhcmdldCBpbmZvICovCisJCXVucmVnaXN0ZXJfaW50cl9wZGEobmV3X2lycV9pbmZvKTsKIAotCQkvKiBhbGxvY2F0ZSBhIG5ldyBQUk9NIHNuX2lycV9pbmZvIHN0cnVjdCAqLworCQkvKiBhbGxvY2F0ZSBhIG5ldyBQUk9NIG5ld19pcnFfaW5mbyBzdHJ1Y3QgKi8KIAkJc3RhdHVzID0gc25faW50cl9hbGxvYyhsb2NhbF9uYXNpZCwgbG9jYWxfd2lkZ2V0LAotCQkJCSAgICAgICBfX3BhKHRtcF9zbl9pcnFfaW5mbyksIGlycSwgdF9uYXNpZCwKLQkJCQkgICAgICAgdF9zbGljZSk7CisJCQkJICAgICAgIF9fcGEobmV3X2lycV9pbmZvKSwgaXJxLAorCQkJCSAgICAgICBjcHVpZF90b19uYXNpZChjcHVpZCksCisJCQkJICAgICAgIGNwdWlkX3RvX3NsaWNlKGNwdWlkKSk7CiAKLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQkvKiBVcGRhdGUga2VybmVscyBzbl9pcnFfaW5mbyB3aXRoIG5ldyB0YXJnZXQgaW5mbyAqLwotCQkJdW5yZWdpc3Rlcl9pbnRyX3BkYShzbl9pcnFfaW5mbyk7Ci0JCQlzbl9pcnFfaW5mby0+aXJxX2NwdWlkID0gY3B1aWQ7Ci0JCQlzbl9pcnFfaW5mby0+aXJxX25hc2lkID0gdF9uYXNpZDsKLQkJCXNuX2lycV9pbmZvLT5pcnFfc2xpY2UgPSB0X3NsaWNlOwotCQkJc25faXJxX2luZm8tPmlycV94dGFsa2FkZHIgPQotCQkJICAgIHRtcF9zbl9pcnFfaW5mby0+aXJxX3h0YWxrYWRkcjsKLQkJCXNuX2lycV9pbmZvLT5pcnFfY29va2llID0gdG1wX3NuX2lycV9pbmZvLT5pcnFfY29va2llOwotCQkJcmVnaXN0ZXJfaW50cl9wZGEoc25faXJxX2luZm8pOworCQkvKiBTQUwgY2FsbCBmYWlsZWQgKi8KKwkJaWYgKHN0YXR1cykgeworCQkJa2ZyZWUobmV3X2lycV9pbmZvKTsKKwkJCWJyZWFrOworCQl9CiAKLQkJCWlmIChJU19QQ0lfQlJJREdFX0FTSUMoc25faXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZSkpIHsKLQkJCQlwY2licl9jaGFuZ2VfZGV2aWNlc19pcnEoc25faXJxX2luZm8pOwotCQkJfQorCQluZXdfaXJxX2luZm8tPmlycV9jcHVpZCA9IGNwdWlkOworCQlyZWdpc3Rlcl9pbnRyX3BkYShuZXdfaXJxX2luZm8pOwogCi0JCQlzbl9pcnFfaW5mbyA9IHNuX2lycV9pbmZvLT5pcnFfbmV4dDsKKwkJaWYgKElTX1BDSV9CUklER0VfQVNJQyhuZXdfaXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZSkpCisJCQlwY2licl9jaGFuZ2VfZGV2aWNlc19pcnEobmV3X2lycV9pbmZvKTsKKworCQlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOworCQlsaXN0X3JlcGxhY2VfcmN1KCZzbl9pcnFfaW5mby0+bGlzdCwgJm5ld19pcnFfaW5mby0+bGlzdCk7CisJCXNwaW5fdW5sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKKwkJY2FsbF9yY3UoJnNuX2lycV9pbmZvLT5yY3UsIHNuX2lycV9pbmZvX2ZyZWUpOwogCiAjaWZkZWYgQ09ORklHX1NNUAotCQkJc2V0X2lycV9hZmZpbml0eV9pbmZvKChpcnEgJiAweGZmKSwgY3B1cGh5cywgMCk7CisJCXNldF9pcnFfYWZmaW5pdHlfaW5mbygoaXJxICYgMHhmZiksIGNwdXBoeXMsIDApOwogI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQlicmVhazsJLyogc25wX2FmZmluaXR5IGZhaWxlZCB0aGUgaW50cl9hbGxvYyAqLwotCQl9CiAJfQotCWtmcmVlKHRtcF9zbl9pcnFfaW5mbyk7CiB9CiAKIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9zbiA9IHsKLQkiU04gaHViIiwKLQlzbl9zdGFydHVwX2lycSwKLQlzbl9zaHV0ZG93bl9pcnEsCi0Jc25fZW5hYmxlX2lycSwKLQlzbl9kaXNhYmxlX2lycSwKLQlzbl9hY2tfaXJxLAotCXNuX2VuZF9pcnEsCi0Jc25fc2V0X2FmZmluaXR5X2lycQorCS50eXBlbmFtZQk9ICJTTiBodWIiLAorCS5zdGFydHVwCT0gc25fc3RhcnR1cF9pcnEsCisJLnNodXRkb3duCT0gc25fc2h1dGRvd25faXJxLAorCS5lbmFibGUJCT0gc25fZW5hYmxlX2lycSwKKwkuZGlzYWJsZQk9IHNuX2Rpc2FibGVfaXJxLAorCS5hY2sJCT0gc25fYWNrX2lycSwKKwkuZW5kCQk9IHNuX2VuZF9pcnEsCisJLnNldF9hZmZpbml0eQk9IHNuX3NldF9hZmZpbml0eV9pcnEKIH07CiAKIHVuc2lnbmVkIGludCBzbl9sb2NhbF92ZWN0b3JfdG9faXJxKHU4IHZlY3RvcikKQEAgLTIzMSwxOSArMjM0LDE4IEBACiAJc3RydWN0IHNuX2lycV9pbmZvICp0bXBfaXJxX2luZm87CiAJaW50IGksIGZvdW5kbWF0Y2g7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKHBkYWNwdShjcHUpLT5zbl9sYXN0X2lycSA9PSBpcnEpIHsKIAkJZm91bmRtYXRjaCA9IDA7Ci0JCWZvciAoaSA9IHBkYWNwdShjcHUpLT5zbl9sYXN0X2lycSAtIDE7IGk7IGktLSkgewotCQkJdG1wX2lycV9pbmZvID0gc25faXJxW2ldOwotCQkJd2hpbGUgKHRtcF9pcnFfaW5mbykgeworCQlmb3IgKGkgPSBwZGFjcHUoY3B1KS0+c25fbGFzdF9pcnEgLSAxOworCQkgICAgIGkgJiYgIWZvdW5kbWF0Y2g7IGktLSkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodG1wX2lycV9pbmZvLAorCQkJCQkJc25faXJxX2xoW2ldLAorCQkJCQkJbGlzdCkgewogCQkJCWlmICh0bXBfaXJxX2luZm8tPmlycV9jcHVpZCA9PSBjcHUpIHsKLQkJCQkJZm91bmRtYXRjaCsrOworCQkJCQlmb3VuZG1hdGNoID0gMTsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCXRtcF9pcnFfaW5mbyA9IHRtcF9pcnFfaW5mby0+aXJxX25leHQ7Ci0JCQl9Ci0JCQlpZiAoZm91bmRtYXRjaCkgewotCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJCXBkYWNwdShjcHUpLT5zbl9sYXN0X2lycSA9IGk7CkBAIC0yNTEsNjAgKzI1MywyNyBAQAogCiAJaWYgKHBkYWNwdShjcHUpLT5zbl9maXJzdF9pcnEgPT0gaXJxKSB7CiAJCWZvdW5kbWF0Y2ggPSAwOwotCQlmb3IgKGkgPSBwZGFjcHUoY3B1KS0+c25fZmlyc3RfaXJxICsgMTsgaSA8IE5SX0lSUVM7IGkrKykgewotCQkJdG1wX2lycV9pbmZvID0gc25faXJxW2ldOwotCQkJd2hpbGUgKHRtcF9pcnFfaW5mbykgeworCQlmb3IgKGkgPSBwZGFjcHUoY3B1KS0+c25fZmlyc3RfaXJxICsgMTsKKwkJICAgICBpIDwgTlJfSVJRUyAmJiAhZm91bmRtYXRjaDsgaSsrKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0bXBfaXJxX2luZm8sCisJCQkJCQlzbl9pcnFfbGhbaV0sCisJCQkJCQlsaXN0KSB7CiAJCQkJaWYgKHRtcF9pcnFfaW5mby0+aXJxX2NwdWlkID09IGNwdSkgewotCQkJCQlmb3VuZG1hdGNoKys7CisJCQkJCWZvdW5kbWF0Y2ggPSAxOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJdG1wX2lycV9pbmZvID0gdG1wX2lycV9pbmZvLT5pcnFfbmV4dDsKLQkJCX0KLQkJCWlmIChmb3VuZG1hdGNoKSB7Ci0JCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJcGRhY3B1KGNwdSktPnNuX2ZpcnN0X2lycSA9ICgoaSA9PSBOUl9JUlFTKSA/IDAgOiBpKTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2FsbG9jKG5hc2lkX3QgbG9jYWxfbmFzaWQsIGludCBsb2NhbF93aWRnZXQsIGludCBpcnEsCi0JCQkJIG5hc2lkX3QgbmFzaWQsIGludCBzbGljZSkKK3N0YXRpYyB2b2lkIHNuX2lycV9pbmZvX2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewogCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87Ci0JaW50IHN0YXR1czsKIAotCXNuX2lycV9pbmZvID0ga21hbGxvYyhzaXplb2YoKnNuX2lycV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNuX2lycV9pbmZvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JbWVtc2V0KHNuX2lycV9pbmZvLCAweDAsIHNpemVvZigqc25faXJxX2luZm8pKTsKLQotCXN0YXR1cyA9Ci0JICAgIHNuX2ludHJfYWxsb2MobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgX19wYShzbl9pcnFfaW5mbyksIGlycSwKLQkJCSAgbmFzaWQsIHNsaWNlKTsKLQotCWlmIChzdGF0dXMpIHsKLQkJa2ZyZWUoc25faXJxX2luZm8pOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQlyZXR1cm4gc25faXJxX2luZm87Ci0JfQotfQotCi12b2lkIHNuX2lycV9mcmVlKHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pCi17Ci0JdWludDY0X3QgYnJpZGdlID0gKHVpbnQ2NF90KSBzbl9pcnFfaW5mby0+aXJxX2JyaWRnZTsKLQluYXNpZF90IGxvY2FsX25hc2lkID0gTkFTSURfR0VUKGJyaWRnZSk7Ci0JaW50IGxvY2FsX3dpZGdldDsKLQotCWlmIChsb2NhbF9uYXNpZCAmIDEpCS8qIHRpbyBjaGVjayAqLwotCQlsb2NhbF93aWRnZXQgPSBUSU9fU1dJTl9XSURHRVROVU0oYnJpZGdlKTsKLQllbHNlCi0JCWxvY2FsX3dpZGdldCA9IFNXSU5fV0lER0VUTlVNKGJyaWRnZSk7Ci0KLQlzbl9pbnRyX2ZyZWUobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgc25faXJxX2luZm8pOwotCisJc25faXJxX2luZm8gPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHNuX2lycV9pbmZvLCByY3UpOwogCWtmcmVlKHNuX2lycV9pbmZvKTsKIH0KIApAQCAtMzE0LDMwICsyODMsNTQgQEAKIAlpbnQgc2xpY2UgPSBzbl9pcnFfaW5mby0+aXJxX3NsaWNlOwogCWludCBjcHUgPSBuYXNpZF9zbGljZV90b19jcHVpZChuYXNpZCwgc2xpY2UpOwogCisJcGNpX2Rldl9nZXQocGNpX2Rldik7CiAJc25faXJxX2luZm8tPmlycV9jcHVpZCA9IGNwdTsKIAlzbl9pcnFfaW5mby0+aXJxX3BjaWlvaW5mbyA9IFNOX1BDSURFVl9JTkZPKHBjaV9kZXYpOwogCiAJLyogbGluayBpdCBpbnRvIHRoZSBzbl9pcnFbaXJxXSBsaXN0ICovCi0Jc25faXJxX2luZm8tPmlycV9uZXh0ID0gc25faXJxW3NuX2lycV9pbmZvLT5pcnFfaXJxXTsKLQlzbl9pcnFbc25faXJxX2luZm8tPmlycV9pcnFdID0gc25faXJxX2luZm87CisJc3Bpbl9sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKKwlsaXN0X2FkZF9yY3UoJnNuX2lycV9pbmZvLT5saXN0LCBzbl9pcnFfbGhbc25faXJxX2luZm8tPmlycV9pcnFdKTsKKwlzcGluX3VubG9jaygmc25faXJxX2luZm9fbG9jayk7CiAKIAkodm9pZClyZWdpc3Rlcl9pbnRyX3BkYShzbl9pcnFfaW5mbyk7CiB9CiAKK3ZvaWQgc25faXJxX3VuZml4dXAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKKworCS8qIE9ubHkgY2xlYW51cCBJUlEgc3R1ZmYgaWYgdGhpcyBkZXZpY2UgaGFzIGEgaG9zdCBidXMgY29udGV4dCAqLworCWlmICghU05fUENJREVWX0JVU1NPRlQocGNpX2RldikpCisJCXJldHVybjsKKworCXNuX2lycV9pbmZvID0gU05fUENJREVWX0lORk8ocGNpX2RldiktPnBkaV9zbl9pcnFfaW5mbzsKKwlpZiAoIXNuX2lycV9pbmZvIHx8ICFzbl9pcnFfaW5mby0+aXJxX2lycSkgeworCQlrZnJlZShzbl9pcnFfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwl1bnJlZ2lzdGVyX2ludHJfcGRhKHNuX2lycV9pbmZvKTsKKwlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOworCWxpc3RfZGVsX3JjdSgmc25faXJxX2luZm8tPmxpc3QpOworCXNwaW5fdW5sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKKwljYWxsX3JjdSgmc25faXJxX2luZm8tPnJjdSwgc25faXJxX2luZm9fZnJlZSk7CisJcGNpX2Rldl9wdXQocGNpX2Rldik7Cit9CisKIHN0YXRpYyB2b2lkIGZvcmNlX2ludGVycnVwdChpbnQgaXJxKQogewogCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87CiAKIAlpZiAoIXNuX2lvaWZfaW5pdGVkKQogCQlyZXR1cm47Ci0Jc25faXJxX2luZm8gPSBzbl9pcnFbaXJxXTsKLQl3aGlsZSAoc25faXJxX2luZm8pIHsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzbl9pcnFfaW5mbywgc25faXJxX2xoW2lycV0sIGxpc3QpIHsKIAkJaWYgKElTX1BDSV9CUklER0VfQVNJQyhzbl9pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlKSAmJgotCQkgICAgKHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlICE9IE5VTEwpKSB7CisJCSAgICAoc25faXJxX2luZm8tPmlycV9icmlkZ2UgIT0gTlVMTCkpCiAJCQlwY2licl9mb3JjZV9pbnRlcnJ1cHQoc25faXJxX2luZm8pOwotCQl9Ci0JCXNuX2lycV9pbmZvID0gc25faXJxX2luZm8tPmlycV9uZXh0OwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogLyoKQEAgLTQwMiwxOSArMzk1LDQxIEBACiAKIHZvaWQgc25fbGJfaW50X3dhcl9jaGVjayh2b2lkKQogeworCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87CiAJaW50IGk7CiAKIAlpZiAoIXNuX2lvaWZfaW5pdGVkIHx8IHBkYS0+c25fZmlyc3RfaXJxID09IDApCiAJCXJldHVybjsKKworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGkgPSBwZGEtPnNuX2ZpcnN0X2lycTsgaSA8PSBwZGEtPnNuX2xhc3RfaXJxOyBpKyspIHsKLQkJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbyA9IHNuX2lycVtpXTsKLQkJd2hpbGUgKHNuX2lycV9pbmZvKSB7Ci0JCQkvKiBPbmx5IGNhbGwgZm9yIFBDSSBicmlkZ2VzIHRoYXQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzbl9pcnFfaW5mbywgc25faXJxX2xoW2ldLCBsaXN0KSB7CisJCQkvKgorCQkJICogT25seSBjYWxsIGZvciBQQ0kgYnJpZGdlcyB0aGF0IGFyZSBmdWxseQorCQkJICogaW5pdGlhbGl6ZWQuCisJCQkgKi8KIAkJCWlmIChJU19QQ0lfQlJJREdFX0FTSUMoc25faXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZSkgJiYKLQkJCSAgICAoc25faXJxX2luZm8tPmlycV9icmlkZ2UgIT0gTlVMTCkpIHsKKwkJCSAgICAoc25faXJxX2luZm8tPmlycV9icmlkZ2UgIT0gTlVMTCkpCiAJCQkJc25fY2hlY2tfaW50cihpLCBzbl9pcnFfaW5mbyk7Ci0JCQl9Ci0JCQlzbl9pcnFfaW5mbyA9IHNuX2lycV9pbmZvLT5pcnFfbmV4dDsKIAkJfQogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKwordm9pZCBzbl9pcnFfbGhfaW5pdCh2b2lkKQoreworCWludCBpOworCisJc25faXJxX2xoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCAqKSAqIE5SX0lSUVMsIEdGUF9LRVJORUwpOworCWlmICghc25faXJxX2xoKQorCQlwYW5pYygiU04gUENJIElOSVQ6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFBDSSBpbml0XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJc25faXJxX2xoW2ldID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOworCQlpZiAoIXNuX2lycV9saFtpXSkKKwkJCXBhbmljKCJTTiBQQ0kgSU5JVDogRmFpbGVkIElSUSBtZW1vcnkgYWxsb2NhdGlvblxuIik7CisKKwkJSU5JVF9MSVNUX0hFQUQoc25faXJxX2xoW2ldKTsKKwl9CisKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwppbmRleCAyMmUxMGQyLi43YzdmZTQ0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIHsKIAlsb25nIHN0YXR1cywgdGlja3NfcGVyX3NlYywgZHJpZnQ7CiAJaW50IHB4bTsKLQlpbnQgbWFqb3IgPSBzbl9zYWxfcmV2X21ham9yKCksIG1pbm9yID0gc25fc2FsX3Jldl9taW5vcigpOworCXUzMiB2ZXJzaW9uID0gc25fc2FsX3JldigpOwogCWV4dGVybiB2b2lkIHNuX2NwdV9pbml0KHZvaWQpOwogCiAJaWE2NF9zbl9wbGF0X3NldF9lcnJvcl9oYW5kbGluZ19mZWF0dXJlcygpOwpAQCAtMzA4LDIyICszMDgsMjEgQEAKIAkgKiBzdXBwb3J0IGhlcmUgc28gd2UgZG9uJ3QgaGF2ZSB0byBsaXN0ZW4gdG8gZmFpbGVkIGtleWJvYXJkIHByb2JlCiAJICogbWVzc2FnZXMuCiAJICovCi0JaWYgKChtYWpvciA8IDIgfHwgKG1ham9yID09IDIgJiYgbWlub3IgPD0gOSkpICYmCi0JICAgIGFjcGlfa2JkX2NvbnRyb2xsZXJfcHJlc2VudCkgeworCWlmICh2ZXJzaW9uIDw9IDB4MDIwOSAmJiBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIGxlZ2FjeSBrZXlib2FyZCBzdXBwb3J0IGFzIHByb20gIgogCQkgICAgICAgImlzIHRvbyBvbGQgYW5kIGRvZXNuJ3QgcHJvdmlkZSBGQURUXG4iKTsKIAkJYWNwaV9rYmRfY29udHJvbGxlcl9wcmVzZW50ID0gMDsKIAl9CiAKLQlwcmludGsoIlNHSSBTQUwgdmVyc2lvbiAleC4lMDJ4XG4iLCBtYWpvciwgbWlub3IpOworCXByaW50aygiU0dJIFNBTCB2ZXJzaW9uICV4LiUwMnhcbiIsIHZlcnNpb24gPj4gOCwgdmVyc2lvbiAmIDB4MDBGRik7CiAKIAkvKgogCSAqIENvbmZpcm0gdGhlIFNBTCB3ZSdyZSBydW5uaW5nIG9uIGlzIHJlY2VudCBlbm91Z2guLi4KIAkgKi8KLQlpZiAoKG1ham9yIDwgU05fU0FMX01JTl9NQUpPUikgfHwgKG1ham9yID09IFNOX1NBTF9NSU5fTUFKT1IgJiYKLQkJCQkJICAgbWlub3IgPCBTTl9TQUxfTUlOX01JTk9SKSkgeworCWlmICh2ZXJzaW9uIDwgU05fU0FMX01JTl9WRVJTSU9OKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiVGhpcyBrZXJuZWwgbmVlZHMgU0dJIFNBTCB2ZXJzaW9uID49ICIKLQkJICAgICAgICIleC4lMDJ4XG4iLCBTTl9TQUxfTUlOX01BSk9SLCBTTl9TQUxfTUlOX01JTk9SKTsKKwkJICAgICAgICIleC4lMDJ4XG4iLCBTTl9TQUxfTUlOX1ZFUlNJT04gPj4gOCwKKwkJICAgICAgICBTTl9TQUxfTUlOX1ZFUlNJT04gJiAweDAwRkYpOwogCQlwYW5pYygiUFJPTSB2ZXJzaW9uIHRvbyBvbGRcbiIpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCmluZGV4IDg3MTZmNGQuLjI1NGZlMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKQEAgLTgsMTIgKzgsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CkBAIC00ODEsNiArNDgxLDkgQEAKIAljbm9kZWlkX3QgY25vZGVpZDsKIAlpbnQgZm91bmRfdGlvY3hfZGV2aWNlID0gMDsKIAorCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikpCisJCXJldHVybiAtRU5PREVWOworCiAJYnVzX3JlZ2lzdGVyKCZ0aW9jeF9idXNfdHlwZSk7CiAKIAlmb3IgKGNub2RlaWQgPSAwOyBjbm9kZWlkIDwgTUFYX0NPTVBBQ1RfTk9ERVM7IGNub2RlaWQrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCmluZGV4IDE3N2RkYjcuLmQ1ODBhZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9zbi9pbnRyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zMDgsOCArMzA5LDcgQEAKIAkJCSJwYXJ0aXRpb24gJWRcbiIsIFhQQ19QQVJUSUQocGFydCkpOwogCiAJCS8qIHdhaXQgYSAxLzQgb2YgYSBzZWNvbmQgb3Igc28gKi8KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJKHZvaWQpIHNjaGVkdWxlX3RpbWVvdXQoMC4yNSAqIEhaKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMjUwKTsKIAogCQlpZiAocGFydC0+YWN0X3N0YXRlID09IFhQQ19QX0RFQUNUSVZBVElORykgewogCQkJcmV0dXJuIHBhcnQtPnJlYXNvbjsKQEAgLTg0MSw5ICs4NDEsNyBAQAogCWRvd24oJnhwY19kaXNjb3ZlcnlfZXhpdGVkKTsKIAogCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlzY2hlZHVsZV90aW1lb3V0KDAuMyAqIEhaKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDMwMCk7CiAKIAogCS8qIHdhaXQgZm9yIGFsbCBwYXJ0aXRpb25zIHRvIGJlY29tZSBpbmFjdGl2ZSAqLwpAQCAtODYwLDEyICs4NTgsOCBAQAogCQkJfQogCQl9CiAKLQkJaWYgKGFjdGl2ZV9wYXJ0X2NvdW50KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCgwLjMgKiBIWik7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQl9Ci0KKwkJaWYgKGFjdGl2ZV9wYXJ0X2NvdW50KQorCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMzAwKTsKIAl9IHdoaWxlIChhY3RpdmVfcGFydF9jb3VudCA+IDApOwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpX2RtYS5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKaW5kZXggNWRhOWJkYi4uYTJmN2E4OCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKQEAgLTExLDkgKzExLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KKyNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAKICNkZWZpbmUgU0dfRU5UX1ZJUlRfQUREUkVTUyhzZykJKHBhZ2VfYWRkcmVzcygoc2cpLT5wYWdlKSArIChzZyktPm9mZnNldCkKICNkZWZpbmUgU0dfRU5UX1BIWVNfQUREUkVTUyhTRykJdmlydF90b19waHlzKFNHX0VOVF9WSVJUX0FERFJFU1MoU0cpKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9hdGUuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfYXRlLmMKaW5kZXggMGU0N2JjZTguLmQxNjQ3YjggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfYXRlLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9hdGUuYwpAQCAtOCw5ICs4LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KLSNpbmNsdWRlICJwY2kvcGNpYnJfcHJvdmlkZXIuaCIKIAogaW50IHBjaWJyX2ludmFsaWRhdGVfYXRlID0gMDsJLyogYnkgZGVmYXVsdCBkb24ndCBpbnZhbGlkYXRlIEFURSBvbiBmcmVlICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCmluZGV4IDY0YWYyYjIuLmIwNThkYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYwpAQCAtOCwxOCArOCwxNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CisjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2dlby5oPgotI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKLSNpbmNsdWRlICJ4dGFsay9odWJkZXYuaCIKKyNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+Ci0jaW5jbHVkZSAicGNpL3Rpb2NwLmgiCi0jaW5jbHVkZSAicGNpL3BpYy5oIgotI2luY2x1ZGUgInBjaS9wY2licl9wcm92aWRlci5oIgotI2luY2x1ZGUgInBjaS90aW9jcC5oIgorI2luY2x1ZGUgPGFzbS9zbi9waWMuaD4KKyNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CisjaW5jbHVkZSA8YXNtL3NuL3Rpb2NwLmg+CiAjaW5jbHVkZSAidGlvLmgiCi0jaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CisjaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgorI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgogCiBleHRlcm4gaW50IHNuX2lvaWZfaW5pdGVkOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKaW5kZXggMzg5Mzk5OS4uOTgxM2RhNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYwpAQCAtNiwxOCArNiw1MSBAQAogICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgotI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vZ2VvLmg+Ci0jaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCisjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgotI2luY2x1ZGUgInBjaS9wY2licl9wcm92aWRlci5oIgotI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KKyNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCisjaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCiAKK2ludAorc2FsX3BjaWJyX3Nsb3RfZW5hYmxlKHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCwgaW50IGRldmljZSwgdm9pZCAqcmVzcCkKK3sKKwlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKKwl1aW50NjRfdCBidXNudW07CisKKwlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKKwlyZXRfc3R1ZmYudjAgPSAwOworCisJYnVzbnVtID0gc29mdC0+cGJpX2J1c2NvbW1vbi5ic19wZXJzaXN0X2J1c251bTsKKwlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLCAodTY0KSBTTl9TQUxfSU9JRl9TTE9UX0VOQUJMRSwgKHU2NCkgYnVzbnVtLAorCQkJKHU2NCkgZGV2aWNlLCAodTY0KSByZXNwLCAwLCAwLCAwLCAwKTsKKworCXJldHVybiAoaW50KXJldF9zdHVmZi52MDsKK30KKworaW50CitzYWxfcGNpYnJfc2xvdF9kaXNhYmxlKHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCwgaW50IGRldmljZSwgaW50IGFjdGlvbiwKKwkJICAgICAgIHZvaWQgKnJlc3ApCit7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CisJdWludDY0X3QgYnVzbnVtOworCisJcmV0X3N0dWZmLnN0YXR1cyA9IDA7CisJcmV0X3N0dWZmLnYwID0gMDsKKworCWJ1c251bSA9IHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW07CisJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgKHU2NCkgU05fU0FMX0lPSUZfU0xPVF9ESVNBQkxFLAorCQkJKHU2NCkgYnVzbnVtLCAodTY0KSBkZXZpY2UsICh1NjQpIGFjdGlvbiwKKwkJCSh1NjQpIHJlc3AsIDAsIDAsIDApOworCisJcmV0dXJuIChpbnQpcmV0X3N0dWZmLnYwOworfQogCiBzdGF0aWMgaW50IHNhbF9wY2licl9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IHBjaWJ1c19pbmZvICpzb2Z0KQogewpAQCAtMTg4LDMgKzIyMSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KKworRVhQT1JUX1NZTUJPTF9HUEwoc2FsX3BjaWJyX3Nsb3RfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNhbF9wY2licl9zbG90X2Rpc2FibGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9yZWcuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcmVnLmMKaW5kZXggODY1YzExYy4uMjE0MjZkMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9yZWcuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3JlZy5jCkBAIC02LDEzICs2LDEzIEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgotI2luY2x1ZGUgInBjaS90aW9jcC5oIgotI2luY2x1ZGUgInBjaS9waWMuaCIKLSNpbmNsdWRlICJwY2kvcGNpYnJfcHJvdmlkZXIuaCIKKyNpbmNsdWRlIDxhc20vc24vcGljLmg+CisjaW5jbHVkZSA8YXNtL3NuL3Rpb2NwLmg+CiAKIHVuaW9uIGJyX3B0ciB7CiAJc3RydWN0IHRpb2NwIHRpbzsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYwppbmRleCAwNWFhOGMyZi4uNTFjYzRlNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYwpAQCAtNTg5LDggKzU4OSw3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgcHJvbSByZXYgKi8KIAotCWlmIChzbl9zYWxfcmV2X21ham9yKCkgPCA0IHx8Ci0JICAgIChzbl9zYWxfcmV2X21ham9yKCkgPT0gNCAmJiBzbl9zYWxfcmV2X21pbm9yKCkgPCA2KSkgeworCWlmIChzbl9zYWxfcmV2KCkgPCAweDA0MDYpIHsKIAkJcHJpbnRrCiAJCSAgICAoS0VSTl9FUlIgIiVzOiAgU0dJIHByb20gcmV2IDQuMDYgb3IgZ3JlYXRlciByZXF1aXJlZCAiCiAJCSAgICAgImZvciB0aW9jYSBzdXBwb3J0XG4iLCBfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL0tjb25maWcgYi9hcmNoL20zMnIvS2NvbmZpZwppbmRleCA0MmNhOGEzLi43NzcyOTUxIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvS2NvbmZpZworKysgYi9hcmNoL20zMnIvS2NvbmZpZwpAQCAtMzU5LDYgKzM1OSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbTMyNzAwdXQuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbTMyNzAwdXQuYwppbmRleCBiMDE0ZTJjLi5hMTQ2YjI0IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwX20zMjcwMHV0LmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tMzI3MDB1dC5jCkBAIC0zLDggKzMsOCBAQAogICoKICAqICBTZXR1cCByb3V0aW5lcyBmb3IgUmVuZXNhcyBNMzI3MDBVVCBCb2FyZAogICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDIgCUhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBUYWtlbyBUYWthaGFzaGkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSAgSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bywgVGFrZW8gVGFrYWhhc2hpCiAgKgogICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKICAqICBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCWljdV9kYXRhW00zMlJfSVJRX0lOVDJdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDAxOwogCWVuYWJsZV9tMzI3MDB1dF9pcnEoTTMyUl9JUlFfSU5UMik7CiAKLS8vI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX00zMlJfQVIpCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTTMyUl9BUikKIAkvKgogCSAqIElOVDMjIGlzIHVzZWQgZm9yIEFSCiAJICovCkBAIC00NDUsOSArNDQ1LDExIEBACiAJaXJxX2Rlc2NbTTMyUl9JUlFfSU5UM10uZGVwdGggPSAxOwogCWljdV9kYXRhW00zMlJfSVJRX0lOVDNdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDEwOwogCWRpc2FibGVfbTMyNzAwdXRfaXJxKE0zMlJfSVJRX0lOVDMpOwotLy8jZW5kaWYJLyogQ09ORklHX1ZJREVPX00zMlJfQVIgKi8KKyNlbmRpZgkvKiBDT05GSUdfVklERU9fTTMyUl9BUiAqLwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKQorCiAjZGVmaW5lIExBTl9JT1NUQVJUICAgICAweDMwMAogI2RlZmluZSBMQU5fSU9FTkQgICAgICAgMHgzMjAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewpAQCAtNDY5LDEwICs0NzEsNTUgQEAKIAkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZSAgICAgICA9IHNtYzkxeF9yZXNvdXJjZXMsCiB9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9TMUQxM1hYWCkKKworI2luY2x1ZGUgPHZpZGVvL3MxZDEzeHh4ZmIuaD4KKyNpbmNsdWRlIDxhc20vczFkMTM4MDYuaD4KKworc3RhdGljIHN0cnVjdCBzMWQxM3h4eGZiX3BkYXRhIHMxZDEzeHh4ZmJfZGF0YSA9IHsKKwkuaW5pdHJlZ3MJCT0gczFkMTN4eHhmYl9pbml0cmVncywKKwkuaW5pdHJlZ3NzaXplCQk9IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9pbml0cmVncyksCisJLnBsYXRmb3JtX2luaXRfdmlkZW8JPSBOVUxMLAorI2lmZGVmIENPTkZJR19QTQorCS5wbGF0Zm9ybV9zdXNwZW5kX3ZpZGVvCT0gTlVMTCwKKwkucGxhdGZvcm1fcmVzdW1lX3ZpZGVvCT0gTlVMTCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzMWQxM3h4eGZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MTA2MDAwMDBVTCwKKwkJLmVuZCAgICA9IDB4MTA3M0ZGRkZVTCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gMHgxMDQwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxMDQwMDFGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczFkMTN4eHhmYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gUzFEX0RFVklDRU5BTUUsCisJLmlkCQk9IDAsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmczFkMTN4eHhmYl9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzMWQxM3h4eGZiX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gczFkMTN4eHhmYl9yZXNvdXJjZXMsCit9OworI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19pbml0IHBsYXRmb3JtX2luaXQodm9pZCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbWM5MXhfZGV2aWNlKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmczFkMTN4eHhmYl9kZXZpY2UpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiBhcmNoX2luaXRjYWxsKHBsYXRmb3JtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaS5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaS5jCmluZGV4IGFhZjhlNTYuLjRlNzA5ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpLmMKQEAgLTMsMTQgKzMsMTUgQEAKICAqCiAgKiAgU2V0dXAgcm91dGluZXMgZm9yIFJlbmVzYXMgTUFQUEkgQm9hcmQKICAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bworICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA1ICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vbTMyci5oPgpAQCAtMTU4LDMgKzE1OSw0OSBAQAogCWRpc2FibGVfbWFwcGlfaXJxKE0zMlJfSVJRX0lOVDIpOwogI2VuZGlmIC8qIENPTkZJR19NMzJSUENDICovCiB9CisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9TMUQxM1hYWCkKKworI2luY2x1ZGUgPHZpZGVvL3MxZDEzeHh4ZmIuaD4KKyNpbmNsdWRlIDxhc20vczFkMTM4MDYuaD4KKworc3RhdGljIHN0cnVjdCBzMWQxM3h4eGZiX3BkYXRhIHMxZDEzeHh4ZmJfZGF0YSA9IHsKKwkuaW5pdHJlZ3MJCT0gczFkMTN4eHhmYl9pbml0cmVncywKKwkuaW5pdHJlZ3NzaXplCQk9IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9pbml0cmVncyksCisJLnBsYXRmb3JtX2luaXRfdmlkZW8JPSBOVUxMLAorI2lmZGVmIENPTkZJR19QTQorCS5wbGF0Zm9ybV9zdXNwZW5kX3ZpZGVvCT0gTlVMTCwKKwkucGxhdGZvcm1fcmVzdW1lX3ZpZGVvCT0gTlVMTCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzMWQxM3h4eGZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MTAyMDAwMDBVTCwKKwkJLmVuZCAgICA9IDB4MTAzM0ZGRkZVTCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gMHgxMDAwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxMDAwMDFGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczFkMTN4eHhmYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gUzFEX0RFVklDRU5BTUUsCisJLmlkCQk9IDAsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmczFkMTN4eHhmYl9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzMWQxM3h4eGZiX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gczFkMTN4eHhmYl9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzMWQxM3h4eGZiX2RldmljZSk7CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHBsYXRmb3JtX2luaXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMi5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaTIuYwppbmRleCAzOGQ1ZTlhLi5hMWQ4MDE1IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMi5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkyLmMKQEAgLTMsOCArMyw4IEBACiAgKgogICogIFNldHVwIHJvdXRpbmVzIGZvciBSZW5lc2FzIE1BUFBJLUlJKE0zQS1aQTM2KSBCb2FyZAogICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgIEhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBNYW1vcnUgU2FrdWdhd2EKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSAgSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bywgTWFtb3J1IFNha3VnYXdhCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaTMuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkzLmMKaW5kZXggM2Q2MGE4NS4uYTc2NDEyZSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaTMuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMy5jCkBAIC0zLDggKzMsOCBAQAogICoKICAqICBTZXR1cCByb3V0aW5lcyBmb3IgUmVuZXNhcyBNQVBQSS1JSUkoTTNBLTIxNzApIEJvYXJkCiAgKgotICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA1ICAgSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpdG9zaGkgWWFtYW1vdG8sIE1hbW9ydSBTYWt1Z2F3YQorICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA1ICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBNYW1vcnUgU2FrdWdhd2EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC0xNzgsNiArMTc4LDggQEAKICNlbmRpZiAvKiBDT05GSUdfTTMyUl9DRkMgKi8KIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkKKwogI2RlZmluZSBMQU5fSU9TVEFSVCAgICAgMHgzMDAKICNkZWZpbmUgTEFOX0lPRU5EICAgICAgIDB4MzIwCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKQEAgLTIwMCw5ICsyMDIsNTUgQEAKIAkucmVzb3VyY2UgICAgICAgPSBzbWM5MXhfcmVzb3VyY2VzLAogfTsKIAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9TMUQxM1hYWCkKKworI2luY2x1ZGUgPHZpZGVvL3MxZDEzeHh4ZmIuaD4KKyNpbmNsdWRlIDxhc20vczFkMTM4MDYuaD4KKworc3RhdGljIHN0cnVjdCBzMWQxM3h4eGZiX3BkYXRhIHMxZDEzeHh4ZmJfZGF0YSA9IHsKKwkuaW5pdHJlZ3MJCT0gczFkMTN4eHhmYl9pbml0cmVncywKKwkuaW5pdHJlZ3NzaXplCQk9IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9pbml0cmVncyksCisJLnBsYXRmb3JtX2luaXRfdmlkZW8JPSBOVUxMLAorI2lmZGVmIENPTkZJR19QTQorCS5wbGF0Zm9ybV9zdXNwZW5kX3ZpZGVvCT0gTlVMTCwKKwkucGxhdGZvcm1fcmVzdW1lX3ZpZGVvCT0gTlVMTCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzMWQxM3h4eGZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MWQ2MDAwMDBVTCwKKwkJLmVuZCAgICA9IDB4MWQ3M0ZGRkZVTCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gMHgxZDQwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxZDQwMDFGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczFkMTN4eHhmYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gUzFEX0RFVklDRU5BTUUsCisJLmlkCQk9IDAsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmczFkMTN4eHhmYl9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzMWQxM3h4eGZiX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gczFkMTN4eHhmYl9yZXNvdXJjZXMsCit9OworI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IHBsYXRmb3JtX2luaXQodm9pZCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbWM5MXhfZGV2aWNlKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmczFkMTN4eHhmYl9kZXZpY2UpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiBhcmNoX2luaXRjYWxsKHBsYXRmb3JtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9vYWtzMzJyLmMgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX29ha3MzMnIuYwppbmRleCBkNjU2NjQwLi40NWFkZDViIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwX29ha3MzMnIuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX29ha3MzMnIuYwpAQCAtMyw4ICszLDggQEAKICAqCiAgKiAgU2V0dXAgcm91dGluZXMgZm9yIE9BS1MzMlIgQm9hcmQKICAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bywgTWFtb3J1IFNha3VnYXdhCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgIEhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpdG9zaGkgWWFtYW1vdG8sIE1hbW9ydSBTYWt1Z2F3YQogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTEzOSw1ICsxMzksNCBAQAogCWljdV9kYXRhW00zMlJfSVJRX1NJTzFfU10uaWN1Y3IgPSAwOwogCWRpc2FibGVfb2FrczMycl9pcnEoTTMyUl9JUlFfU0lPMV9TKTsKICNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX00zMlJfU0lPICovCi0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb3BzcHV0LmMgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX29wc3B1dC5jCmluZGV4IDg2ZjRjZjIuLmYwMzAxZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb3BzcHV0LmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9vcHNwdXQuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgU2V0dXAgcm91dGluZXMgZm9yIFJlbmVzYXMgT1BTUFVUIEJvYXJkCiAgKgotICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA0CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUKICAqIAlIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAogICogICAgICBIaXRvc2hpIFlhbWFtb3RvLCBUYWtlbyBUYWthaGFzaGksIE1hbW9ydSBTYWt1Z2F3YQogICoKQEAgLTQzOSw3ICs0MzksNyBAQAogCWljdV9kYXRhW00zMlJfSVJRX0lOVDJdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDAxOwogCWVuYWJsZV9vcHNwdXRfaXJxKE0zMlJfSVJRX0lOVDIpOwogCi0vLyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19NMzJSX0FSKQorI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX00zMlJfQVIpCiAJLyoKIAkgKiBJTlQzIyBpcyB1c2VkIGZvciBBUgogCSAqLwpAQCAtNDQ5LDkgKzQ0OSwxMSBAQAogCWlycV9kZXNjW00zMlJfSVJRX0lOVDNdLmRlcHRoID0gMTsKIAlpY3VfZGF0YVtNMzJSX0lSUV9JTlQzXS5pY3VjciA9IE0zMlJfSUNVQ1JfSUVOfE0zMlJfSUNVQ1JfSVNNT0QxMDsKIAlkaXNhYmxlX29wc3B1dF9pcnEoTTMyUl9JUlFfSU5UMyk7Ci0vLyNlbmRpZgkvKiBDT05GSUdfVklERU9fTTMyUl9BUiAqLworI2VuZGlmIC8qIENPTkZJR19WSURFT19NMzJSX0FSICovCiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpCisKICNkZWZpbmUgTEFOX0lPU1RBUlQgICAgIDB4MzAwCiAjZGVmaW5lIExBTl9JT0VORCAgICAgICAweDMyMAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CkBAIC00NzMsMTAgKzQ3NSw1NSBAQAogCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCiAJLnJlc291cmNlICAgICAgID0gc21jOTF4X3Jlc291cmNlcywKIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCisjaW5jbHVkZSA8dmlkZW8vczFkMTN4eHhmYi5oPgorI2luY2x1ZGUgPGFzbS9zMWQxMzgwNi5oPgorCitzdGF0aWMgc3RydWN0IHMxZDEzeHh4ZmJfcGRhdGEgczFkMTN4eHhmYl9kYXRhID0geworCS5pbml0cmVncwkJPSBzMWQxM3h4eGZiX2luaXRyZWdzLAorCS5pbml0cmVnc3NpemUJCT0gQVJSQVlfU0laRShzMWQxM3h4eGZiX2luaXRyZWdzKSwKKwkucGxhdGZvcm1faW5pdF92aWRlbwk9IE5VTEwsCisjaWZkZWYgQ09ORklHX1BNCisJLnBsYXRmb3JtX3N1c3BlbmRfdmlkZW8JPSBOVUxMLAorCS5wbGF0Zm9ybV9yZXN1bWVfdmlkZW8JPSBOVUxMLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMxZDEzeHh4ZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgxMDYwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxMDczRkZGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAweDEwNDAwMDAwVUwsCisJCS5lbmQgICAgPSAweDEwNDAwMUZGVUwsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzMWQxM3h4eGZiX2RldmljZSA9IHsKKwkubmFtZQkJPSBTMURfREVWSUNFTkFNRSwKKwkuaWQJCT0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZzMWQxM3h4eGZiX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHMxZDEzeHh4ZmJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBzMWQxM3h4eGZiX3Jlc291cmNlcywKK307CisjZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgcGxhdGZvcm1faW5pdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfUzFEMTNYWFgpCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzMWQxM3h4eGZiX2RldmljZSk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIGFyY2hfaW5pdGNhbGwocGxhdGZvcm1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDY5MWEyNDYuLjE3OGM0YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC00NTAsNiArNDUwLDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogbWVudSAiQ2hhcmFjdGVyIGRldmljZXMiCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9LY29uZmlnIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwppbmRleCBkYmZjZGM4Li4xMTdmMTgzIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9LY29uZmlnCisrKyBiL2FyY2gvbTY4a25vbW11L0tjb25maWcKQEAgLTU3NSw2ICs1NzUsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IGJkOWRlN2IuLmI1NzgyMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0xNjQwLDYgKzE2NDAsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9LY29uZmlnIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwppbmRleCBjZTMyN2M3Li4xYzJkODc0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9LY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL0tjb25maWcKQEAgLTE5MCw2ICsxOTAsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3BwYy84eHhfaW8vZW5ldC5jIGIvYXJjaC9wcGMvOHh4X2lvL2VuZXQuYwppbmRleCA0ZWE3MTU4Li5lY2U2YTlmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy84eHhfaW8vZW5ldC5jCisrKyBiL2FyY2gvcHBjLzh4eF9pby9lbmV0LmMKQEAgLTcxNCwxNyArNzE0LDI1IEBACiAJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gflBDX0VORVRfTEJLOwkvKiBEaXNhYmxlIExvb3BiYWNrICovCiAjZW5kaWYJLyogUENfRU5FVF9MQksgKi8KIAorI2lmZGVmIFBFX0VORVRfVENMSworCS8qIENvbmZpZ3VyZSBwb3J0IEUgZm9yIFRDTEsgYW5kIFJDTEsuCisJKi8KKwljcC0+Y3BfcGVwYXIgfD0gIChQRV9FTkVUX1RDTEsgfCBQRV9FTkVUX1JDTEspOworCWNwLT5jcF9wZWRpciAmPSB+KFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyk7CisJY3AtPmNwX3Blc28gICY9IH4oUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLKTsKKyNlbHNlCisJLyogQ29uZmlndXJlIHBvcnQgQSBmb3IgVENMSyBhbmQgUkNMSy4KKwkqLworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9ICAoUEFfRU5FVF9UQ0xLIHwgUEFfRU5FVF9SQ0xLKTsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+KFBBX0VORVRfVENMSyB8IFBBX0VORVRfUkNMSyk7CisjZW5kaWYKKwogCS8qIENvbmZpZ3VyZSBwb3J0IEMgcGlucyB0byBlbmFibGUgQ0xTTiBhbmQgUkVOQS4KIAkqLwogCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH4oUENfRU5FVF9DTFNOIHwgUENfRU5FVF9SRU5BKTsKIAlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciAmPSB+KFBDX0VORVRfQ0xTTiB8IFBDX0VORVRfUkVOQSk7CiAJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNzbyAgfD0gIChQQ19FTkVUX0NMU04gfCBQQ19FTkVUX1JFTkEpOwogCi0JLyogQ29uZmlndXJlIHBvcnQgQSBmb3IgVENMSyBhbmQgUkNMSy4KLQkqLwotCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9ICAoUEFfRU5FVF9UQ0xLIHwgUEFfRU5FVF9SQ0xLKTsKLQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+KFBBX0VORVRfVENMSyB8IFBBX0VORVRfUkNMSyk7Ci0KIAkvKiBDb25maWd1cmUgU2VyaWFsIEludGVyZmFjZSBjbG9jayByb3V0aW5nLgogCSAqIEZpcnN0LCBjbGVhciBhbGwgU0NDIGJpdHMgdG8gemVybywgdGhlbiBzZXQgdGhlIG9uZXMgd2Ugd2FudC4KIAkgKi8KQEAgLTg5NiwxNCArOTA0LDE4IEBACiAJLyogSXQgaXMgbm93IE9LIHRvIGVuYWJsZSB0aGUgRXRoZXJuZXQgdHJhbnNtaXR0ZXIuCiAJICogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIGJvYXJkIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzIGhlcmUuCiAJICovCi0jaWYgICAoIWRlZmluZWQgKFBCX0VORVRfVEVOQSkgJiYgIGRlZmluZWQgKFBDX0VORVRfVEVOQSkpCisjaWYgICAoIWRlZmluZWQgKFBCX0VORVRfVEVOQSkgJiYgIGRlZmluZWQgKFBDX0VORVRfVEVOQSkgJiYgIWRlZmluZWQgKFBFX0VORVRfVEVOQSkpCiAJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNwYXIgfD0gIFBDX0VORVRfVEVOQTsKIAlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciAmPSB+UENfRU5FVF9URU5BOwotI2VsaWYgKCBkZWZpbmVkIChQQl9FTkVUX1RFTkEpICYmICFkZWZpbmVkIChQQ19FTkVUX1RFTkEpKQorI2VsaWYgKCBkZWZpbmVkIChQQl9FTkVUX1RFTkEpICYmICFkZWZpbmVkIChQQ19FTkVUX1RFTkEpICYmICFkZWZpbmVkIChQRV9FTkVUX1RFTkEpKQogCWNwLT5jcF9wYnBhciB8PSBQQl9FTkVUX1RFTkE7CiAJY3AtPmNwX3BiZGlyIHw9IFBCX0VORVRfVEVOQTsKKyNlbGlmICggIWRlZmluZWQgKFBCX0VORVRfVEVOQSkgJiYgIWRlZmluZWQgKFBDX0VORVRfVEVOQSkgJiYgZGVmaW5lZCAoUEVfRU5FVF9URU5BKSkKKwljcC0+Y3BfcGVwYXIgfD0gIFBFX0VORVRfVEVOQTsKKwljcC0+Y3BfcGVkaXIgJj0gflBFX0VORVRfVEVOQTsKKwljcC0+Y3BfcGVzbyAgfD0gIFBFX0VORVRfVEVOQTsKICNlbHNlCi0jZXJyb3IgQ29uZmlndXJhdGlvbiBFcnJvcjogZGVmaW5lIGV4YWN0bHkgT05FIG9mIFBCX0VORVRfVEVOQSwgUENfRU5FVF9URU5BCisjZXJyb3IgQ29uZmlndXJhdGlvbiBFcnJvcjogZGVmaW5lIGV4YWN0bHkgT05FIG9mIFBCX0VORVRfVEVOQSwgUENfRU5FVF9URU5BLCBQRV9FTkVUX1RFTkEKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUlBYTElURSkgfHwgZGVmaW5lZChDT05GSUdfUlBYQ0xBU1NJQykKQEAgLTkzNiw2ICs5NDgsMjkgQEAKIAkqKCh2b2xhdGlsZSB1aW50ICopQkNTUjEpICY9IH5CQ1NSMV9FVEhFTjsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX01QQzg4NUFEUworCisJLyogRGVhc3NlcnQgUEhZIHJlc2V0IGFuZCBlbmFibGUgdGhlIFBIWS4KKwkgKi8KKwl7CisJCXZvbGF0aWxlIHVpbnQgX19pb21lbSAqYmNzciA9IGlvcmVtYXAoQkNTUl9BRERSLCBCQ1NSX1NJWkUpOworCQl1aW50IHRtcDsKKworCQl0bXAgPSBpbl9iZTMyKGJjc3IgKyAxIC8qIEJDU1IxICovKTsKKwkJdG1wIHw9IEJDU1IxX0VUSEVOOworCQlvdXRfYmUzMihiY3NyICsgMSwgdG1wKTsKKwkJdG1wID0gaW5fYmUzMihiY3NyICsgNCAvKiBCQ1NSNCAqLyk7CisJCXRtcCB8PSBCQ1NSNF9FVEgxMF9SU1Q7CisJCW91dF9iZTMyKGJjc3IgKyA0LCB0bXApOworCQlpb3VubWFwKGJjc3IpOworCX0KKworCS8qIE9uIE1QQzg4NUFEUyBTQ0MgZXRoZXJuZXQgUEhZIGRlZmF1bHRzIHRvIHRoZSBmdWxsIGR1cGxleCBtb2RlCisJICogdXBvbiByZXNldC4gU0NDIGlzIHNldCB0byBoYWxmIGR1cGxleCBieSBkZWZhdWx0LiBTbyB0aGlzCisJICogaW5jb25zaXN0ZW5jeSBzaG91bGQgYmUgYmV0dGVyIGZpeGVkIGJ5IHRoZSBzb2Z0d2FyZS4KKwkgKi8KKyNlbmRpZgorCiAJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZyllcDsKICNpZiAwCiAJZGV2LT5uYW1lID0gIkNQTV9FTkVUIjsKQEAgLTk2OSwzICsxMDA0LDQgQEAKIH0KIAogbW9kdWxlX2luaXQoc2NjX2VuZXRfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL0tjb25maWcgYi9hcmNoL3BwYy9LY29uZmlnCmluZGV4IGE3ODM1Y2QuLmI4MzNjYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL0tjb25maWcKKysrIGIvYXJjaC9wcGMvS2NvbmZpZwpAQCAtMjg0LDYgKzI4NCw5IEBACiAKIG1lbnUgIlBsYXRmb3JtIG9wdGlvbnMiCiAKK2NvbmZpZyBGQURTCisJYm9vbAorCiBjaG9pY2UKIAlwcm9tcHQgIjh4eCBNYWNoaW5lIFR5cGUiCiAJZGVwZW5kcyBvbiA4eHgKQEAgLTM5OSw4ICs0MDIsMjUgQEAKIAkgIDI2TUIgRFJBTSwgNE1CIGZsYXNoLCBFdGhlcm5ldCwgYSAxNkstZ2F0ZSBGUEdBLCBVU0IsIGFuIExDRC92aWRlbwogCSAgY29udHJvbGxlciwgYW5kIHR3byBSUzIzMiBwb3J0cy4KIAotY29uZmlnIEZBRFMKK2NvbmZpZyBNUEM4WFhGQURTCiAJYm9vbCAiRkFEUyIKKwlzZWxlY3QgRkFEUworCitjb25maWcgTVBDODZYQURTCisJYm9vbCAiTVBDODZYQURTIgorCWhlbHAKKwkgIE1QQzg2eCBBcHBsaWNhdGlvbiBEZXZlbG9wbWVudCBTeXN0ZW0gYnkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisJICBUaGUgTVBDODZ4QURTIGlzIG1lYW50IHRvIHNlcnZlIGFzIGEgcGxhdGZvcm0gZm9yIHMvdyBhbmQgaC93CisJICBkZXZlbG9wbWVudCBhcm91bmQgdGhlIE1QQzg2WCBwcm9jZXNzb3IgZmFtaWxpZXMuCisJc2VsZWN0IEZBRFMKKworY29uZmlnIE1QQzg4NUFEUworCWJvb2wgIk1QQzg4NUFEUyIKKwloZWxwCisJICBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBNUEM4ODUgQXBwbGljYXRpb24gRGV2ZWxvcG1lbnQgU3lzdGVtIChBRFMpLgorCSAgQWxzbyBrbm93biBhcyBEVUVULgorCSAgVGhlIE1QQzg4NUFEUyBpcyBtZWFudCB0byBzZXJ2ZSBhcyBhIHBsYXRmb3JtIGZvciBzL3cgYW5kIGgvdworCSAgZGV2ZWxvcG1lbnQgYXJvdW5kIHRoZSBNUEM4ODUgcHJvY2Vzc29yIGZhbWlseS4KIAogY29uZmlnIFRRTTgyM0wKIAlib29sICJUUU04MjNMIgpAQCAtMTMzNSw2ICsxMzU1LDggQEAKIAlkZXBlbmRzIG9uIEFEVkFOQ0VEX09QVElPTlMgJiYgOHh4CiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L2ltYWdlcy9NYWtlZmlsZSBiL2FyY2gvcHBjL2Jvb3QvaW1hZ2VzL01ha2VmaWxlCmluZGV4IGM5YWM1ZjUuLjUzMmU3ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3QvaW1hZ2VzL01ha2VmaWxlCisrKyBiL2FyY2gvcHBjL2Jvb3QvaW1hZ2VzL01ha2VmaWxlCkBAIC02LDEyICs2LDE3IEBACiAKIGV4dHJhLXkJCTo9IHZtbGludXguYmluIHZtbGludXguZ3oKIAorIyB0d28gbWFrZSBwcm9jZXNzZXMgbWF5IHdyaXRlIHRvIHZtbGludXguZ3ogYXQgdGhlIHNhbWUgdGltZSB3aXRoIG1ha2UgLWoKK3F1aWV0X2NtZF9teWd6aXAgPSBHWklQICAgICRACitjbWRfbXlnemlwID0gZ3ppcCAtZiAtOSA8ICQ8ID4gJEAuJCQkJCAmJiBtdiAkQC4kJCQkICRACisKKwogT0JKQ09QWUZMQUdTX3ZtbGludXguYmluIDo9IC1PIGJpbmFyeQogJChvYmopL3ZtbGludXguYmluOiB2bWxpbnV4IEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKIAogJChvYmopL3ZtbGludXguZ3o6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCisJJChjYWxsIGlmX2NoYW5nZWQsbXlnemlwKQogCiBxdWlldF9jbWRfdWltYWdlID0gVUlNQUdFICAkQAogICAgICAgY21kX3VpbWFnZSA9ICQoQ09ORklHX1NIRUxMKSAkKE1LSU1BR0UpIC1BIHBwYyAtTyBsaW51eCAtVCBrZXJuZWwgXApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9tcGM4NnhfYWRzX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODZ4X2Fkc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzYzZmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODZ4X2Fkc19kZWZjb25maWcKQEAgLTAsMCArMSw2MzMgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzQKKyMgVHVlIEp1biAxNCAxMzozNjozNSAyMDA1CisjCitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0hBVkVfREVDX0xPQ0s9eQorQ09ORklHX1BQQz15CitDT05GSUdfUFBDMzI9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX0NMRUFOX0NPTVBJTEUgaXMgbm90IHNldAorQ09ORklHX0JST0tFTj15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKK0NPTkZJR19GVVRFWD15CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCitDT05GSUdfVElOWV9TSE1FTT15CitDT05GSUdfQkFTRV9TTUFMTD0xCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNT0QgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvcgorIworIyBDT05GSUdfNnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSNCBpcyBub3Qgc2V0CitDT05GSUdfOHh4PXkKKyMgQ09ORklHX0U1MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFUSF9FTVVMQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEQk9PVD15CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFPXkKKworIworIyBQbGF0Zm9ybSBvcHRpb25zCisjCitDT05GSUdfRkFEUz15CisjIENPTkZJR19SUFhMSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQWENMQVNTSUMgaXMgbm90IHNldAorIyBDT05GSUdfQlNFSVAgaXMgbm90IHNldAorIyBDT05GSUdfTVBDOFhYRkFEUyBpcyBub3Qgc2V0CitDT05GSUdfTVBDODZYQURTPXkKKyMgQ09ORklHX1RRTTgyM0wgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODUwTCBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NTVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTg2MEwgaXMgbm90IHNldAorIyBDT05GSUdfRlBTODUwTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEQ4MjNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19JVk1TOCBpcyBub3Qgc2V0CisjIENPTkZJR19JVk1MMjQgaXMgbm90IHNldAorIyBDT05GSUdfU004NTAgaXMgbm90IHNldAorIyBDT05GSUdfSEVSTUVTX1BSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUDg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19MV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ1VfRSBpcyBub3Qgc2V0CisjIENPTkZJR19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOVEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01CWCBpcyBub3Qgc2V0CisjIENPTkZJR19XSU5DRVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfRE9NQUlOUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfUVNQQU4gaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TVEFSVD0weGZmMTAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TSVpFPTB4MDAyMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDQwMDAwMAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2PW0KKyMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19NSUkgaXMgbm90IHNldAorIyBDT05GSUdfT0FLTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NQTT15CitDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDNCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NQTV9TTUMxPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU01DMiBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBNUEM4eHggQ1BNIE9wdGlvbnMKKyMKK0NPTkZJR19TQ0NfRU5FVD15CitDT05GSUdfU0NDMV9FTkVUPXkKKyMgQ09ORklHX1NDQzJfRU5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0MzX0VORVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVDX0VORVQgaXMgbm90IHNldAorIyBDT05GSUdfRU5FVF9CSUdfQlVGRkVSUyBpcyBub3Qgc2V0CisKKyMKKyMgR2VuZXJpYyBNUEM4eHggT3B0aW9ucworIworIyBDT05GSUdfOHh4X0NPUFlCQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHXzh4eF9DUFU2IGlzIG5vdCBzZXQKK0NPTkZJR19OT19VQ09ERV9QQVRDSD15CisjIENPTkZJR19VU0JfU09GX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TUElfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NQSV9TTUMxX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL21wYzg4NWFkc19kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL21wYzg4NWFkc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2Zjk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODg1YWRzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDYyMiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjNgorIyBUaHUgSnVuICA5IDIxOjE3OjI5IDIwMDUKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfSEFWRV9ERUNfTE9DSz15CitDT05GSUdfUFBDPXkKK0NPTkZJR19QUEMzMj15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorIyBDT05GSUdfQ0xFQU5fQ09NUElMRSBpcyBub3Qgc2V0CitDT05GSUdfQlJPS0VOPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IKKyMKKyMgQ09ORklHXzZ4eCBpcyBub3Qgc2V0CisjIENPTkZJR180MHggaXMgbm90IHNldAorIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSMyBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUjQgaXMgbm90IHNldAorQ09ORklHXzh4eD15CisjIENPTkZJR19FNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFREJPT1Q9eQorIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15CisKKyMKKyMgUGxhdGZvcm0gb3B0aW9ucworIworIyBDT05GSUdfUlBYTElURSBpcyBub3Qgc2V0CisjIENPTkZJR19SUFhDTEFTU0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRUlQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBRFMgaXMgbm90IHNldAorQ09ORklHX01QQzg4NUFEUz15CisjIENPTkZJR19UUU04MjNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTg1MEwgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODU1TCBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NjBMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQUzg1MEwgaXMgbm90IHNldAorIyBDT05GSUdfU1BEODIzVFMgaXMgbm90IHNldAorIyBDT05GSUdfSVZNUzggaXMgbm90IHNldAorIyBDT05GSUdfSVZNTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFUk1FU19QUk8gaXMgbm90IHNldAorIyBDT05GSUdfSVA4NjAgaXMgbm90IHNldAorIyBDT05GSUdfTFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfUENVX0UgaXMgbm90IHNldAorIyBDT05GSUdfQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBTlRFQyBpcyBub3Qgc2V0CisjIENPTkZJR19NQlggaXMgbm90IHNldAorIyBDT05GSUdfV0lOQ0VQVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX1FTUEFOIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAorQ09ORklHX0NPTlNJU1RFTlRfU1RBUlQ9MHhmZjEwMDAwMAorQ09ORklHX0NPTlNJU1RFTlRfU0laRT0weDAwMjAwMDAwCitDT05GSUdfQk9PVF9MT0FEPTB4MDA0MDAwMDAKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfT0FLTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9eQorIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfQVNZTkM9eQorQ09ORklHX1BQUF9TWU5DX1RUWT15CitDT05GSUdfUFBQX0RFRkxBVEU9eQorIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NQTT15CitDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDNCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NQTV9TTUMxPXkKK0NPTkZJR19TRVJJQUxfQ1BNX1NNQzI9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CisjIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgTVBDOHh4IENQTSBPcHRpb25zCisjCitDT05GSUdfU0NDX0VORVQ9eQorIyBDT05GSUdfU0NDMV9FTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDQzJfRU5FVCBpcyBub3Qgc2V0CitDT05GSUdfU0NDM19FTkVUPXkKKyMgQ09ORklHX0ZFQ19FTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VORVRfQklHX0JVRkZFUlMgaXMgbm90IHNldAorCisjCisjIEdlbmVyaWMgTVBDOHh4IE9wdGlvbnMKKyMKK0NPTkZJR184eHhfQ09QWUJBQ0s9eQorQ09ORklHXzh4eF9DUFU2PXkKK0NPTkZJR19OT19VQ09ERV9QQVRDSD15CisjIENPTkZJR19VU0JfU09GX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TUElfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NQSV9TTUMxX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQ1JDX0NDSVRUPXkKKyMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3BwYy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCmluZGV4IDg0ZDY1YTguLmE3Mjc4NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMjgsNiArMjgsMTIgQEAKIGNvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKIGNvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOwogCisvKgorICogUHJvdmlkZSBhIGR1bW15IGNyYXNoX25vdGVzIGRlZmluaXRpb24gd2hpbGUgY3Jhc2ggZHVtcCBhcnJpdmVzIHRvIHBwYy4KKyAqIFRoaXMgcHJldmVudHMgYnJlYWthZ2Ugb2YgY3Jhc2hfbm90ZXMgYXR0cmlidXRlIGluIGtlcm5lbC9rc3lzZnMuYy4KKyAqLwordm9pZCAqY3Jhc2hfbm90ZXMgPSBOVUxMOworCiB2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKIHsKIAlpZiAocHBjX21kLm1hY2hpbmVfc2h1dGRvd24pCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wcGMva2VybmVsL3RpbWUuYwppbmRleCA3MzU4NjY1Li5iZjRkZGNhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMKQEAgLTg5LDYgKzg5LDkgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2FsbF9qaWZmaWVzOwogCisvKiB1c2VkIGZvciB0aW1lem9uZSBvZmZzZXQgKi8KK3N0YXRpYyBsb25nIHRpbWV6b25lX29mZnNldDsKKwogREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKIAogRVhQT1JUX1NZTUJPTChydGNfbG9jayk7CkBAIC0xNzAsNyArMTczLDcgQEAKIAkJICAgICB4dGltZS50dl9zZWMgLSBsYXN0X3J0Y191cGRhdGUgPj0gNjU5ICYmCiAJCSAgICAgYWJzKCh4dGltZS50dl9uc2VjIC8gMTAwMCkgLSAoMTAwMDAwMC0xMDAwMDAwL0haKSkgPCA1MDAwMDAvSFogJiYKIAkJICAgICBqaWZmaWVzIC0gd2FsbF9qaWZmaWVzID09IDEpIHsKLQkJICAJaWYgKHBwY19tZC5zZXRfcnRjX3RpbWUoeHRpbWUudHZfc2VjKzEgKyB0aW1lX29mZnNldCkgPT0gMCkKKwkJICAJaWYgKHBwY19tZC5zZXRfcnRjX3RpbWUoeHRpbWUudHZfc2VjKzEgKyB0aW1lem9uZV9vZmZzZXQpID09IDApCiAJCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjKzE7CiAJCQllbHNlCiAJCQkJLyogVHJ5IGFnYWluIG9uZSBtaW51dGUgbGF0ZXIgKi8KQEAgLTI4Niw3ICsyODksNyBAQAogCXVuc2lnbmVkIG9sZF9zdGFtcCwgc3RhbXAsIGVsYXBzZWQ7CiAKICAgICAgICAgaWYgKHBwY19tZC50aW1lX2luaXQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICB0aW1lX29mZnNldCA9IHBwY19tZC50aW1lX2luaXQoKTsKKyAgICAgICAgICAgICAgICB0aW1lem9uZV9vZmZzZXQgPSBwcGNfbWQudGltZV9pbml0KCk7CiAKIAlpZiAoX19VU0VfUlRDKCkpIHsKIAkJLyogNjAxIHByb2Nlc3NvcjogZGVjIGNvdW50cyBkb3duIGJ5IDEyOCBldmVyeSAxMjhucyAqLwpAQCAtMzMxLDEwICszMzQsMTAgQEAKIAlzZXRfZGVjKHRiX3RpY2tzX3Blcl9qaWZmeSk7CiAKIAkvKiBJZiBwbGF0Zm9ybSBwcm92aWRlZCBhIHRpbWV6b25lIChwbWFjKSwgd2UgY29ycmVjdCB0aGUgdGltZSAqLwotICAgICAgICBpZiAodGltZV9vZmZzZXQpIHsKLQkJc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ID0gLXRpbWVfb2Zmc2V0IC8gNjA7CisgICAgICAgIGlmICh0aW1lem9uZV9vZmZzZXQpIHsKKwkJc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ID0gLXRpbWV6b25lX29mZnNldCAvIDYwOwogCQlzeXNfdHoudHpfZHN0dGltZSA9IDA7Ci0JCXh0aW1lLnR2X3NlYyAtPSB0aW1lX29mZnNldDsKKwkJeHRpbWUudHZfc2VjIC09IHRpbWV6b25lX29mZnNldDsKICAgICAgICAgfQogICAgICAgICBzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9mYWRzLmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvZmFkcy5oCmluZGV4IDYzMmI4MTcuLmI2MGM1NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9mYWRzLmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2ZhZHMuaApAQCAtMyw3ICszLDE4IEBACiAgKiB0aGUgTW90b3JvbGEgODYwVCBGQURTIGJvYXJkLiAgQ29waWVkIGZyb20gdGhlIE1CWCBzdHVmZi4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTggRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKKyAqCisgKiBBZGRlZCBNUEM4NlhBRFMgc3VwcG9ydC4KKyAqIFRoZSBNUEM4NnhBRFMgbWFudWFsIHNheXMgdGhlIGJvYXJkICJpcyBjb21wYXRpYmxlIHdpdGggdGhlIE1QQzh4eEZBRFMKKyAqIGZvciBTVyBwb2ludCBvZiB2aWV3Ii4gVGhpcyBpcyA5OSUgY29ycmVjdC4KKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqIDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQKKyAqICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCisKICNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9fQVNNX0ZBRFNfSF9fCiAjZGVmaW5lIF9fQVNNX0ZBRFNfSF9fCkBAIC0xMiwxOCArMjMsNDUgQEAKIAogI2luY2x1ZGUgPGFzbS9wcGNib290Lmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NlhBRFMpCisKKy8qIFUtQm9vdCBtYXBzIEJDU1IgdG8gMHhmZjA4MDAwMCAqLworI2RlZmluZSBCQ1NSX0FERFIJCSgodWludCkweGZmMDgwMDAwKQorCisvKiBNUEM4NlhBRFMgaGFzIG9uZSBtb3JlIENQTEQgYW5kIGFuIGFkZGl0aW9uYWwgQkNTUi4KKyAqLworI2RlZmluZSBDRkdfUEhZREVWX0FERFIJCSgodWludCkweGZmMGEwMDAwKQorI2RlZmluZSBCQ1NSNQkJCSgodWludCkoQ0ZHX1BIWURFVl9BRERSICsgMHgzMDApKQorCisjZGVmaW5lIEJDU1I1X1QxX1JTVAkJMHgxMAorI2RlZmluZSBCQ1NSNV9BVE0xNTVfUlNUCTB4MDgKKyNkZWZpbmUgQkNTUjVfQVRNMjVfUlNUCQkweDA0CisjZGVmaW5lIEJDU1I1X01JSTFfRU4JCTB4MDIKKyNkZWZpbmUgQkNTUjVfTUlJMV9SU1QJCTB4MDEKKworLyogVGhlcmUgaXMgbm8gUEhZIGxpbmsgY2hhbmdlIGludGVycnVwdCAqLworI2RlZmluZSBQSFlfSU5URVJSVVBUCSgtMSkKKworI2Vsc2UgLyogRkFEUyAqLworCiAvKiBNZW1vcnkgbWFwIGlzIGNvbmZpZ3VyZWQgYnkgdGhlIFBST00gc3RhcnR1cC4KICAqIEkgdHJpZWQgdG8gZm9sbG93IHRoZSBGQURTIG1hbnVhbCwgYWx0aG91Z2ggdGhlIHN0YXJ0dXAgUFJPTQogICogZGljdGF0ZXMgdGhpcyBhbmQgd2Ugc2ltcGx5IGhhdmUgdG8gbW92ZSBzb21lIG9mIHRoZSBwaHlzaWNhbAogICogYWRkcmVzc2VzIGZvciBMaW51eC4KICAqLwogI2RlZmluZSBCQ1NSX0FERFIJCSgodWludCkweGZmMDEwMDAwKQorCisvKiBQSFkgbGluayBjaGFuZ2UgaW50ZXJydXB0ICovCisjZGVmaW5lIFBIWV9JTlRFUlJVUFQJU0lVX0lSUTIKKworI2VuZGlmIC8qIENPTkZJR19NUEM4NlhBRFMgKi8KKwogI2RlZmluZSBCQ1NSX1NJWkUJCSgodWludCkoNjQgKiAxMDI0KSkKLSNkZWZpbmUJQkNTUjAJCQkoKHVpbnQpMHhmZjAxMDAwMCkKLSNkZWZpbmUJQkNTUjEJCQkoKHVpbnQpMHhmZjAxMDAwNCkKLSNkZWZpbmUJQkNTUjIJCQkoKHVpbnQpMHhmZjAxMDAwOCkKLSNkZWZpbmUJQkNTUjMJCQkoKHVpbnQpMHhmZjAxMDAwYykKLSNkZWZpbmUJQkNTUjQJCQkoKHVpbnQpMHhmZjAxMDAxMCkKKyNkZWZpbmUgQkNTUjAJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MDApKQorI2RlZmluZSBCQ1NSMQkJCSgodWludCkoQkNTUl9BRERSICsgMHgwNCkpCisjZGVmaW5lIEJDU1IyCQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDA4KSkKKyNkZWZpbmUgQkNTUjMJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MGMpKQorI2RlZmluZSBCQ1NSNAkJCSgodWludCkoQkNTUl9BRERSICsgMHgxMCkpCiAKICNkZWZpbmUgSU1BUF9BRERSCQkoKHVpbnQpMHhmZjAwMDAwMCkKICNkZWZpbmUgSU1BUF9TSVpFCQkoKHVpbnQpKDY0ICogMTAyNCkpCkBAIC0zNCw4ICs3MiwxNyBAQAogLyogQml0cyBvZiBpbnRlcmVzdCBpbiB0aGUgQkNTUnMuCiAgKi8KICNkZWZpbmUgQkNTUjFfRVRIRU4JCSgodWludCkweDIwMDAwMDAwKQorI2RlZmluZSBCQ1NSMV9JUkRBRU4JCSgodWludCkweDEwMDAwMDAwKQogI2RlZmluZSBCQ1NSMV9SUzIzMkVOXzEJCSgodWludCkweDAxMDAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NFTgkJKCh1aW50KTB4MDA4MDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZDQzAJCSgodWludCkweDAwNDAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWUFAwCQkoKHVpbnQpMHgwMDIwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVlBQMQkJKCh1aW50KTB4MDAxMDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZQUF9NQVNLCShCQ1NSMV9QQ0NWUFAwIHwgQkNTUjFfUENDVlBQMSkKICNkZWZpbmUgQkNTUjFfUlMyMzJFTl8yCQkoKHVpbnQpMHgwMDA0MDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVkNDMQkJKCh1aW50KTB4MDAwMTAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZDQ19NQVNLCShCQ1NSMV9QQ0NWQ0MwIHwgQkNTUjFfUENDVkNDMSkKKwogI2RlZmluZSBCQ1NSNF9FVEhMT09QCQkoKHVpbnQpMHg4MDAwMDAwMCkJLyogRUVTVCBMb29wYmFjayAqLwogI2RlZmluZSBCQ1NSNF9FRUZEWAkJKCh1aW50KTB4NDAwMDAwMDApCS8qIEVFU1QgRkRYIGVuYWJsZSAqLwogI2RlZmluZSBCQ1NSNF9GRVRIX0VOCQkoKHVpbnQpMHgwODAwMDAwMCkJLyogUEhZIGVuYWJsZSAqLwpAQCAtNDQsMTQgKzkxLDY0IEBACiAjZGVmaW5lIEJDU1I0X0ZFVEhGREUJCSgodWludCkweDAyMDAwMDAwKQkvKiBQSFkgRkRYIGFkdmVydGlzZSAqLwogI2RlZmluZSBCQ1NSNF9GRVRIUlNUCQkoKHVpbnQpMHgwMDIwMDAwMCkJLyogUEhZIFJlc2V0ICovCiAKKy8qIElPX0JBU0UgZGVmaW5pdGlvbiBmb3IgcGNtY2lhLgorICovCisjZGVmaW5lIF9JT19CQVNFCTB4ODAwMDAwMDAKKyNkZWZpbmUgX0lPX0JBU0VfU0laRQkweDEwMDAKKworI2lmZGVmIENPTkZJR19JREUKKyNkZWZpbmUgTUFYX0hXSUZTIDEKKyNlbmRpZgorCiAvKiBJbnRlcnJ1cHQgbGV2ZWwgYXNzaWdubWVudHMuCiAgKi8KICNkZWZpbmUgRkVDX0lOVEVSUlVQVAlTSVVfTEVWRUwxCS8qIEZFQyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgUEhZX0lOVEVSUlVQVAlTSVVfSVJRMgkvKiBQSFkgbGluayBjaGFuZ2UgaW50ZXJydXB0ICovCiAKIC8qIFdlIGRvbid0IHVzZSB0aGUgODI1OS4KICAqLwogI2RlZmluZSBOUl84MjU5X0lOVFMJMAogCisvKiBDUE0gRXRoZXJuZXQgdGhyb3VnaCBTQ0MxIG9yIFNDQzIgKi8KKworI2lmZGVmIENPTkZJR19TQ0MxX0VORVQJCS8qIFByb2JhYmx5IDg2MCB2YXJpYW50ICovCisvKiBCaXRzIGluIHBhcmFsbGVsIEkvTyBwb3J0IHJlZ2lzdGVycyB0aGF0IGhhdmUgdG8gYmUgc2V0L2NsZWFyZWQKKyAqIHRvIGNvbmZpZ3VyZSB0aGUgcGlucyBmb3IgU0NDMSB1c2UuCisgKiBUQ0xLIC0gQ0xLMSwgUkNMSyAtIENMSzIuCisgKi8KKyNkZWZpbmUgUEFfRU5FVF9SWEQJKCh1c2hvcnQpMHgwMDAxKQorI2RlZmluZSBQQV9FTkVUX1RYRAkoKHVzaG9ydCkweDAwMDIpCisjZGVmaW5lIFBBX0VORVRfVENMSwkoKHVzaG9ydCkweDAxMDApCisjZGVmaW5lIFBBX0VORVRfUkNMSwkoKHVzaG9ydCkweDAyMDApCisjZGVmaW5lIFBCX0VORVRfVEVOQQkoKHVpbnQpMHgwMDAwMTAwMCkKKyNkZWZpbmUgUENfRU5FVF9DTFNOCSgodXNob3J0KTB4MDAxMCkKKyNkZWZpbmUgUENfRU5FVF9SRU5BCSgodXNob3J0KTB4MDAyMCkKKworLyogQ29udHJvbCBiaXRzIGluIHRoZSBTSUNSIHRvIHJvdXRlIFRDTEsgKENMSzEpIGFuZCBSQ0xLIChDTEsyKSB0bworICogU0NDMS4gIEFsc28sIG1ha2Ugc3VyZSBHUjEgKGJpdCAyNCkgYW5kIFNDMSAoYml0IDI1KSBhcmUgemVyby4KKyAqLworI2RlZmluZSBTSUNSX0VORVRfTUFTSwkoKHVpbnQpMHgwMDAwMDBmZikKKyNkZWZpbmUgU0lDUl9FTkVUX0NMS1JUCSgodWludCkweDAwMDAwMDJjKQorI2VuZGlmIC8qIENPTkZJR19TQ0MxX0VORVQgKi8KKworI2lmZGVmIENPTkZJR19TQ0MyX0VORVQJCS8qIFByb2JhYmx5IDgyMy84NTAgdmFyaWFudCAqLworLyogQml0cyBpbiBwYXJhbGxlbCBJL08gcG9ydCByZWdpc3RlcnMgdGhhdCBoYXZlIHRvIGJlIHNldC9jbGVhcmVkCisgKiB0byBjb25maWd1cmUgdGhlIHBpbnMgZm9yIFNDQzEgdXNlLgorICogVENMSyAtIENMSzEsIFJDTEsgLSBDTEsyLgorICovCisjZGVmaW5lIFBBX0VORVRfUlhECSgodXNob3J0KTB4MDAwNCkKKyNkZWZpbmUgUEFfRU5FVF9UWEQJKCh1c2hvcnQpMHgwMDA4KQorI2RlZmluZSBQQV9FTkVUX1RDTEsJKCh1c2hvcnQpMHgwNDAwKQorI2RlZmluZSBQQV9FTkVUX1JDTEsJKCh1c2hvcnQpMHgwMjAwKQorI2RlZmluZSBQQl9FTkVUX1RFTkEJKCh1aW50KTB4MDAwMDIwMDApCisjZGVmaW5lIFBDX0VORVRfQ0xTTgkoKHVzaG9ydCkweDAwNDApCisjZGVmaW5lIFBDX0VORVRfUkVOQQkoKHVzaG9ydCkweDAwODApCisKKy8qIENvbnRyb2wgYml0cyBpbiB0aGUgU0lDUiB0byByb3V0ZSBUQ0xLIGFuZCBSQ0xLIHRvCisgKiBTQ0MyLiAgQWxzbywgbWFrZSBzdXJlIEdSMSAoYml0IDI0KSBhbmQgU0MxIChiaXQgMjUpIGFyZSB6ZXJvLgorICovCisjZGVmaW5lIFNJQ1JfRU5FVF9NQVNLCSgodWludCkweDAwMDBmZjAwKQorI2RlZmluZSBTSUNSX0VORVRfQ0xLUlQJKCh1aW50KTB4MDAwMDJlMDApCisjZW5kaWYgLyogQ09ORklHX1NDQzJfRU5FVCAqLworCiAjZW5kaWYgLyogX19BU01fRkFEU19IX18gKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODg1YWRzLmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODg1YWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzODY2MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4ODVhZHMuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQSBjb2xsZWN0aW9uIG9mIHN0cnVjdHVyZXMsIGFkZHJlc3NlcywgYW5kIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSBGcmVlc2NhbGUgTVBDODg1QURTIGJvYXJkLgorICogQ29waWVkIGZyb20gdGhlIEZBRFMgc3R1ZmYuCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZAorICogImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19BU01fTVBDODg1QURTX0hfXworI2RlZmluZSBfX0FTTV9NUEM4ODVBRFNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGFzbS9wcGNib290Lmg+CisKKy8qIFUtQm9vdCBtYXBzIEJDU1IgdG8gMHhmZjA4MDAwMCAqLworI2RlZmluZSBCQ1NSX0FERFIJCSgodWludCkweGZmMDgwMDAwKQorI2RlZmluZSBCQ1NSX1NJWkUJCSgodWludCkzMikKKyNkZWZpbmUgQkNTUjAJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MDApKQorI2RlZmluZSBCQ1NSMQkJCSgodWludCkoQkNTUl9BRERSICsgMHgwNCkpCisjZGVmaW5lIEJDU1IyCQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDA4KSkKKyNkZWZpbmUgQkNTUjMJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MGMpKQorI2RlZmluZSBCQ1NSNAkJCSgodWludCkoQkNTUl9BRERSICsgMHgxMCkpCisKKyNkZWZpbmUgQ0ZHX1BIWURFVl9BRERSCQkoKHVpbnQpMHhmZjBhMDAwMCkKKyNkZWZpbmUgQkNTUjUJCQkoKHVpbnQpKENGR19QSFlERVZfQUREUiArIDB4MzAwKSkKKworI2RlZmluZSBJTUFQX0FERFIJCSgodWludCkweGZmMDAwMDAwKQorI2RlZmluZSBJTUFQX1NJWkUJCSgodWludCkoNjQgKiAxMDI0KSkKKworI2RlZmluZSBQQ01DSUFfTUVNX0FERFIJCSgodWludCkweGZmMDIwMDAwKQorI2RlZmluZSBQQ01DSUFfTUVNX1NJWkUJCSgodWludCkoNjQgKiAxMDI0KSkKKworLyogQml0cyBvZiBpbnRlcmVzdCBpbiB0aGUgQkNTUnMuCisgKi8KKyNkZWZpbmUgQkNTUjFfRVRIRU4JCSgodWludCkweDIwMDAwMDAwKQorI2RlZmluZSBCQ1NSMV9JUkRBRU4JCSgodWludCkweDEwMDAwMDAwKQorI2RlZmluZSBCQ1NSMV9SUzIzMkVOXzEJCSgodWludCkweDAxMDAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NFTgkJKCh1aW50KTB4MDA4MDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZDQzAJCSgodWludCkweDAwNDAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWUFAwCQkoKHVpbnQpMHgwMDIwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVlBQMQkJKCh1aW50KTB4MDAxMDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZQUF9NQVNLCShCQ1NSMV9QQ0NWUFAwIHwgQkNTUjFfUENDVlBQMSkKKyNkZWZpbmUgQkNTUjFfUlMyMzJFTl8yCQkoKHVpbnQpMHgwMDA0MDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVkNDMQkJKCh1aW50KTB4MDAwMTAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZDQ19NQVNLCShCQ1NSMV9QQ0NWQ0MwIHwgQkNTUjFfUENDVkNDMSkKKworI2RlZmluZSBCQ1NSNF9FVEgxMF9SU1QJCSgodWludCkweDgwMDAwMDAwKQkvKiAxMEJhc2UtVCBQSFkgcmVzZXQqLworI2RlZmluZSBCQ1NSNF9VU0JfTE9fU1BECSgodWludCkweDA0MDAwMDAwKQorI2RlZmluZSBCQ1NSNF9VU0JfVkNDCQkoKHVpbnQpMHgwMjAwMDAwMCkKKyNkZWZpbmUgQkNTUjRfVVNCX0ZVTExfU1BECSgodWludCkweDAwMDQwMDAwKQorI2RlZmluZSBCQ1NSNF9VU0JfRU4JCSgodWludCkweDAwMDIwMDAwKQorCisjZGVmaW5lIEJDU1I1X01JSTJfRU4JCTB4NDAKKyNkZWZpbmUgQkNTUjVfTUlJMl9SU1QJCTB4MjAKKyNkZWZpbmUgQkNTUjVfVDFfUlNUCQkweDEwCisjZGVmaW5lIEJDU1I1X0FUTTE1NV9SU1QJMHgwOAorI2RlZmluZSBCQ1NSNV9BVE0yNV9SU1QJCTB4MDQKKyNkZWZpbmUgQkNTUjVfTUlJMV9FTgkJMHgwMgorI2RlZmluZSBCQ1NSNV9NSUkxX1JTVAkJMHgwMQorCisvKiBJbnRlcnJ1cHQgbGV2ZWwgYXNzaWdubWVudHMgKi8KKyNkZWZpbmUgUEhZX0lOVEVSUlVQVAlTSVVfSVJRNwkvKiBQSFkgbGluayBjaGFuZ2UgaW50ZXJydXB0ICovCisjZGVmaW5lIFNJVV9JTlRfRkVDMQlTSVVfTEVWRUwxCS8qIEZFQzEgaW50ZXJydXB0ICovCisjZGVmaW5lIFNJVV9JTlRfRkVDMglTSVVfTEVWRUwzCS8qIEZFQzIgaW50ZXJydXB0ICovCisjZGVmaW5lIEZFQ19JTlRFUlJVUFQJU0lVX0lOVF9GRUMxCS8qIEZFQyBpbnRlcnJ1cHQgKi8KKworLyogV2UgZG9uJ3QgdXNlIHRoZSA4MjU5ICovCisjZGVmaW5lIE5SXzgyNTlfSU5UUwkwCisKKy8qIENQTSBFdGhlcm5ldCB0aHJvdWdoIFNDQzMgKi8KKyNkZWZpbmUgUEFfRU5FVF9SWEQJKCh1c2hvcnQpMHgwMDQwKQorI2RlZmluZSBQQV9FTkVUX1RYRAkoKHVzaG9ydCkweDAwODApCisjZGVmaW5lIFBFX0VORVRfVENMSwkoKHVpbnQpMHgwMDAwNDAwMCkKKyNkZWZpbmUgUEVfRU5FVF9SQ0xLCSgodWludCkweDAwMDA4MDAwKQorI2RlZmluZSBQRV9FTkVUX1RFTkEJKCh1aW50KTB4MDAwMDAwMTApCisjZGVmaW5lIFBDX0VORVRfQ0xTTgkoKHVzaG9ydCkweDA0MDApCisjZGVmaW5lIFBDX0VORVRfUkVOQQkoKHVzaG9ydCkweDA4MDApCisKKy8qIENvbnRyb2wgYml0cyBpbiB0aGUgU0lDUiB0byByb3V0ZSBUQ0xLIChDTEs1KSBhbmQgUkNMSyAoQ0xLNikgdG8KKyAqIFNDQzMuICBBbHNvLCBtYWtlIHN1cmUgR1IzIChiaXQgOCkgYW5kIFNDMyAoYml0IDkpIGFyZSB6ZXJvICovCisjZGVmaW5lIFNJQ1JfRU5FVF9NQVNLCSgodWludCkweDAwZmYwMDAwKQorI2RlZmluZSBTSUNSX0VORVRfQ0xLUlQJKCh1aW50KTB4MDAyYzAwMDApCisKKyNlbmRpZiAvKiBfX0FTTV9NUEM4ODVBRFNfSF9fICovCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfY3B1ZnJlcS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfY3B1ZnJlcS5jCmluZGV4IDVmZGQ0ZjYuLmMwNjA1MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2NwdWZyZXEuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19jcHVmcmVxLmMKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCXJldHVybiBvZmZzZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19wbWFjIHBtYWNfY3B1ZnJlcV9zdXNwZW5kKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCB1MzIgc3RhdGUpCitzdGF0aWMgaW50IF9fcG1hYyBwbWFjX2NwdWZyZXFfc3VzcGVuZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgcG1fbWVzc2FnZV90IHBtc2cpCiB7CiAJLyogT2ssIHRoaXMgY291bGQgYmUgbWFkZSBhIGJpdCBzbWFydGVyLCBidXQgbGV0J3MgYmUgcm9idXN0IGZvciBub3cuIFdlCiAJICogYWx3YXlzIGZvcmNlIGEgc3BlZWQgY2hhbmdlIHRvIGhpZ2ggc3BlZWQgYmVmb3JlIHNsZWVwLCB0byBtYWtlIHN1cmUKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9vZl9kZXZpY2UuYyBiL2FyY2gvcHBjL3N5c2xpYi9vZl9kZXZpY2UuYwppbmRleCA0OWMwZTM0Li4xZWI0ZjcyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL29mX2RldmljZS5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAKQEAgLTE1LDIwICsxNiwyMCBAQAogICogVXNlZCBieSBhIGRyaXZlciB0byBjaGVjayB3aGV0aGVyIGFuIG9mX2RldmljZSBwcmVzZW50IGluIHRoZQogICogc3lzdGVtIGlzIGluIGl0cyBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzLgogICovCi1jb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKiBvZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaGVzLAorY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG9mX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAogCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCiB7CiAJaWYgKCFkZXYtPm5vZGUpCiAJCXJldHVybiBOVUxMOwotCXdoaWxlIChtYXRjaGVzLT5uYW1lIHx8IG1hdGNoZXMtPnR5cGUgfHwgbWF0Y2hlcy0+Y29tcGF0aWJsZSkgeworCXdoaWxlIChtYXRjaGVzLT5uYW1lWzBdIHx8IG1hdGNoZXMtPnR5cGVbMF0gfHwgbWF0Y2hlcy0+Y29tcGF0aWJsZVswXSkgewogCQlpbnQgbWF0Y2ggPSAxOwotCQlpZiAobWF0Y2hlcy0+bmFtZSAmJiBtYXRjaGVzLT5uYW1lICE9IE9GX0FOWV9NQVRDSCkKKwkJaWYgKG1hdGNoZXMtPm5hbWVbMF0pCiAJCQltYXRjaCAmPSBkZXYtPm5vZGUtPm5hbWUKIAkJCQkmJiAhc3RyY21wKG1hdGNoZXMtPm5hbWUsIGRldi0+bm9kZS0+bmFtZSk7Ci0JCWlmIChtYXRjaGVzLT50eXBlICYmIG1hdGNoZXMtPnR5cGUgIT0gT0ZfQU5ZX01BVENIKQorCQlpZiAobWF0Y2hlcy0+dHlwZVswXSkKIAkJCW1hdGNoICY9IGRldi0+bm9kZS0+dHlwZQogCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+dHlwZSwgZGV2LT5ub2RlLT50eXBlKTsKLQkJaWYgKG1hdGNoZXMtPmNvbXBhdGlibGUgJiYgbWF0Y2hlcy0+Y29tcGF0aWJsZSAhPSBPRl9BTllfTUFUQ0gpCisJCWlmIChtYXRjaGVzLT5jb21wYXRpYmxlWzBdKQogCQkJbWF0Y2ggJj0gZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5ub2RlLAogCQkJCW1hdGNoZXMtPmNvbXBhdGlibGUpOwogCQlpZiAobWF0Y2gpCkBAIC00Miw3ICs0Myw3IEBACiB7CiAJc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOwogCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBvZl9kcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KTsKLQljb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKiBtYXRjaGVzID0gb2ZfZHJ2LT5tYXRjaF90YWJsZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICogbWF0Y2hlcyA9IG9mX2Rydi0+bWF0Y2hfdGFibGU7CiAKIAlpZiAoIW1hdGNoZXMpCiAJCXJldHVybiAwOwpAQCAtNzUsNyArNzYsNyBAQAogCWludCBlcnJvciA9IC1FTk9ERVY7CiAJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2OwogCXN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldjsKLQljb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfcGljLmMgYi9hcmNoL3BwYy9zeXNsaWIvcHBjNHh4X3BpYy5jCmluZGV4IDA1Njg2ZmEuLjQwMDg2MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfcGljLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9waWMuYwpAQCAtMTEwLDYgKzExMCwxMCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHBjNHh4X3BpY19pbXBsX2luaXQodm9pZCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR180NDBHWCkKKwkvKiBEaXNhYmxlIDQ0MEdQIGNvbXBhdGliaWxpdHkgbW9kZSBpZiBpdCB3YXMgZW5hYmxlZCBpbiBmaXJtd2FyZSAqLworCVNEUl9XUklURShEQ1JOX1NEUl9NRlIsIFNEUl9SRUFEKERDUk5fU0RSX01GUikgJiB+RENSTl9TRFJfTUZSX1BDTSk7CisjZW5kaWYKIAkvKiBDb25maWd1cmUgQmFzZSBVSUMgKi8KIAltdGRjcihEQ1JOX1VJQ19DUihVSUNCKSwgMCk7CiAJbXRkY3IoRENSTl9VSUNfVFIoVUlDQiksIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9LY29uZmlnIGIvYXJjaC9wcGM2NC9LY29uZmlnCmluZGV4IGY4MDRmMjUuLmZkZDhhZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvS2NvbmZpZworKysgYi9hcmNoL3BwYzY0L0tjb25maWcKQEAgLTQyOSw2ICs0MjksOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMgYi9hcmNoL3BwYzY0L2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKaW5kZXggNDJmYzA4Yy4uMDQ4MmMwNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvY3B1X3NldHVwX3Bvd2VyNC5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwpAQCAtMzEsMTAgKzMxLDEzIEBACiAJICovCiAJbWZzcHIJcjAsU1BSTl9QVlIKIAlzcndpCXIwLHIwLDE2Ci0JY21wd2kJY3IwLHIwLDB4MzkKLQljbXB3aQljcjEscjAsMHgzYwotCWNyb3IJNCpjcjArZXEsNCpjcjArZXEsNCpjcjErZXEKKwljbXB3aQlyMCwweDM5CisJYmVxCTFmCisJY21wd2kJcjAsMHgzYworCWJlcQkxZgorCWNtcHdpCXIwLDB4NDQKIAlibmVscgorMToKIAogCS8qIE1ha2Ugc3VyZSBISUQ0OnJtX2NpIGlzIG9mZiBiZWZvcmUgTU1VIGlzIHR1cm5lZCBvZmYsIHRoYXQgbGFyZ2UKIAkgKiBwYWdlcyBhcmUgZW5hYmxlZCB3aXRoIEhJRDQ6NjEgYW5kIGNsZWFyIEhJRDU6RENCWl9zaXplIGFuZApAQCAtMTMzLDEyICsxMzYsMTQgQEAKIAkvKiBXZSBvbmx5IGRlYWwgd2l0aCA5NzAgZm9yIG5vdyAqLwogCW1mc3ByCXIwLFNQUk5fUFZSCiAJc3J3aQlyMCxyMCwxNgotCWNtcHdpCWNyMCxyMCwweDM5Ci0JY21wd2kJY3IxLHIwLDB4M2MKLQljcm9yCTQqY3IwK2VxLDQqY3IwK2VxLDQqY3IxK2VxCi0JYm5lCTFmCisJY21wd2kJcjAsMHgzOQorCWJlcQkxZgorCWNtcHdpCXIwLDB4M2MKKwliZXEJMWYKKwljbXB3aQlyMCwweDQ0CisJYm5lCTJmCiAKLQkvKiBTYXZlIEhJRDAsMSw0IGFuZCA1ICovCisxOgkvKiBTYXZlIEhJRDAsMSw0IGFuZCA1ICovCiAJbWZzcHIJcjMsU1BSTl9ISUQwCiAJc3RkCXIzLENTX0hJRDAocjUpCiAJbWZzcHIJcjMsU1BSTl9ISUQxCkBAIC0xNDgsNyArMTUzLDcgQEAKIAltZnNwcglyMyxTUFJOX0hJRDUKIAlzdGQJcjMsQ1NfSElENShyNSkKIAkKLTE6CisyOgogCW10Y3IJcjcKIAlibHIKIApAQCAtMTY1LDEyICsxNzAsMTQgQEAKIAkvKiBXZSBvbmx5IGRlYWwgd2l0aCA5NzAgZm9yIG5vdyAqLwogCW1mc3ByCXIwLFNQUk5fUFZSCiAJc3J3aQlyMCxyMCwxNgotCWNtcHdpCWNyMCxyMCwweDM5Ci0JY21wd2kJY3IxLHIwLDB4M2MKLQljcm9yCTQqY3IwK2VxLDQqY3IwK2VxLDQqY3IxK2VxCi0JYm5lCTFmCisJY21wd2kJcjAsMHgzOQorCWJlcQkxZgorCWNtcHdpCXIwLDB4M2MKKwliZXEJMWYKKwljbXB3aQlyMCwweDQ0CisJYm5lbHIKIAotCS8qIEJlZm9yZSBhY2Nlc3NpbmcgbWVtb3J5LCB3ZSBtYWtlIHN1cmUgcm1fY2kgaXMgY2xlYXIgKi8KKzE6CS8qIEJlZm9yZSBhY2Nlc3NpbmcgbWVtb3J5LCB3ZSBtYWtlIHN1cmUgcm1fY2kgaXMgY2xlYXIgKi8KIAlsaQlyMCwwCiAJbWZzcHIJcjMsU1BSTl9ISUQ0CiAJcmxkaW1pCXIzLHIwLDQwLDIzCS8qIGNsZWFyIGJpdCAyMyAocm1fY2kpICovCkBAIC0yMjMsNiArMjMwLDUgQEAKIAltdHNwcglTUFJOX0hJRDUscjMKIAlzeW5jCiAJaXN5bmMKLTE6CiAJYmxyCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDFkMTYyYzcuLjc3Y2VjNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvY3B1dGFibGUuYwpAQCAtNDksMTYwICs0OSwyMzQgQEAKICNlbmRpZgogCiBzdHJ1Y3QgY3B1X3NwZWMJY3B1X3NwZWNzW10gPSB7Ci0gICAgewkvKiBQb3dlcjMgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDQwMDAwMCwgIlBPV0VSMyAoNjMwKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BNQzgsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUG93ZXIzKyAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwNDEwMDAwLCAiUE9XRVIzICg2MzArKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BNQzgsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogTm9ydGhzdGFyICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzMzAwMDAsICJSUzY0LUlJIChub3J0aHN0YXIpIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfSUFCUiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUHVsc2FyICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzNDAwMDAsICJSUzY0LUlJSSAocHVsc2FyKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyMywKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIEktc3RhciAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwMzYwMDAwLCAiUlM2NC1JSUkgKGljZXN0YXIpIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfSUFCUiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUy1zdGFyICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzNzAwMDAsICJSUzY0LUlWIChzc3RhcikiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9wb3dlcjMsCi0JICAgIENPTU1PTl9QUEM2NF9GVwotICAgIH0sCi0gICAgewkvKiBQb3dlcjQgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDM1MDAwMCwgIlBPV0VSNCAoZ3ApIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXI0LAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUG93ZXI0KyAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwMzgwMDAwLCAiUE9XRVI0KyAoZ3EpIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXI0LAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUFBDOTcwICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzOTAwMDAsICJQUEM5NzAiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfAotCQkgICAgQ1BVX0ZUUl9DQU5fTkFQIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQgfCBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcHBjOTcwLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUFBDOTcwRlggKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDNjMDAwMCwgIlBQQzk3MEZYIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKLQkJICAgIENQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3BwYzk3MCwKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFBvd2VyNSAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwM2EwMDAwLCAiUE9XRVI1IChncikiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwKLQkJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8Ci0JCSAgICBDUFVfRlRSX01NQ1JBX1NJSFYsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXI0LAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUG93ZXI1ICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzYjAwMDAsICJQT1dFUjUgKGdzKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfAotCQkgICAgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwKLQkJICAgIENQVV9GVFJfTU1DUkFfU0lIViwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9wb3dlcjQsCi0JICAgIENPTU1PTl9QUEM2NF9GVwotICAgIH0sCi0gICAgewkvKiBCRSBERDEueCAgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDcwMDAwMCwgIkJyb2FkYmFuZCBFbmdpbmUiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfAotCQkgICAgQ1BVX0ZUUl9TTVQsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X2JlLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogZGVmYXVsdCBtYXRjaCAqLwotCSAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAiUE9XRVI0IChjb21wYXRpYmxlKSIsCi0gIAkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9wb3dlcjQsCi0JICAgIENPTU1PTl9QUEM2NF9GVwotICAgIH0KKwl7CS8qIFBvd2VyMyAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwNDAwMDAwLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSMyAoNjMwKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8CisJCQlDUFVfRlRSX1BNQzgsCisJCS5jcHVfdXNlcl9mZWF0dXJlcyA9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBvd2VyMysgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDQxMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjMgKDYzMCspIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwKKwkJCUNQVV9GVFJfUE1DOCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogTm9ydGhzdGFyICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzMzAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUlM2NC1JSSAobm9ydGhzdGFyKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8CisJCQlDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9DVFJMLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBQdWxzYXIgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDM0MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJSUzY0LUlJSSAocHVsc2FyKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8CisJCQlDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9DVFJMLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBJLXN0YXIgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDM2MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJSUzY0LUlJSSAoaWNlc3RhcikiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfAorCQkJQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUy1zdGFyICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzNzAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUlM2NC1JViAoc3N0YXIpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwKKwkJCUNQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NUUkwsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBvd2VyNCAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwMzUwMDAwLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSNCAoZ3ApIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKKwkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBvd2VyNCsgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDM4MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjQrIChncSkiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUFBDOTcwICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzOTAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUFBDOTcwIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKKwkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKKwkJCUNQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0IHwKKwkJCVBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wcGM5NzAsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUFBDOTcwRlggKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDNjMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQUEM5NzBGWCIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8CisJCQlDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCB8CisJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBQQzk3ME1QICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDA0NDAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUFBDOTcwTVAiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfAorCQkJQ1BVX0ZUUl9DQU5fTkFQIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBQb3dlcjUgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDNhMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjUgKGdyKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfAorCQkJQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwKKwkJCUNQVV9GVFJfTU1DUkFfU0lIViwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUG93ZXI1ICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzYjAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVI1IChncykiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwKKwkJCUNQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8CisJCQlDUFVfRlRSX01NQ1JBX1NJSFYsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIEJFIEREMS54ICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDA3MDAwMDAsCisJCS5jcHVfbmFtZQkJPSAiQnJvYWRiYW5kIEVuZ2luZSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8CisJCQlDUFVfRlRSX1NNVCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X2JlLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIGRlZmF1bHQgbWF0Y2ggKi8KKwkJLnB2cl9tYXNrCQk9IDB4MDAwMDAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjQgKGNvbXBhdGlibGUpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKKwkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9CiB9OwogCiBmaXJtd2FyZV9mZWF0dXJlX3QgZmlybXdhcmVfZmVhdHVyZXNfdGFibGVbRklSTVdBUkVfTUFYX0ZFQVRVUkVTXSA9IHsKLSAgICB7RldfRkVBVFVSRV9QRlQsCQkiaGNhbGwtcGZ0In0sCi0gICAge0ZXX0ZFQVRVUkVfVENFLAkJImhjYWxsLXRjZSJ9LAotICAgIHtGV19GRUFUVVJFX1NQUkcwLAkJImhjYWxsLXNwcmcwIn0sCi0gICAge0ZXX0ZFQVRVUkVfREFCUiwJCSJoY2FsbC1kYWJyIn0sCi0gICAge0ZXX0ZFQVRVUkVfQ09QWSwJCSJoY2FsbC1jb3B5In0sCi0gICAge0ZXX0ZFQVRVUkVfQVNSLAkJImhjYWxsLWFzciJ9LAotICAgIHtGV19GRUFUVVJFX0RFQlVHLAkJImhjYWxsLWRlYnVnIn0sCi0gICAge0ZXX0ZFQVRVUkVfUEVSRiwJCSJoY2FsbC1wZXJmIn0sCi0gICAge0ZXX0ZFQVRVUkVfRFVNUCwJCSJoY2FsbC1kdW1wIn0sCi0gICAge0ZXX0ZFQVRVUkVfSU5URVJSVVBULAkiaGNhbGwtaW50ZXJydXB0In0sCi0gICAge0ZXX0ZFQVRVUkVfTUlHUkFURSwJImhjYWxsLW1pZ3JhdGUifSwKLSAgICB7RldfRkVBVFVSRV9QRVJGTU9OLAkiaGNhbGwtcGVyZm1vbiJ9LAotICAgIHtGV19GRUFUVVJFX0NSUSwgICAgCSJoY2FsbC1jcnEifSwKLSAgICB7RldfRkVBVFVSRV9WSU8sCSAgICAgICAgImhjYWxsLXZpbyJ9LAotICAgIHtGV19GRUFUVVJFX1JETUEsCSAgICAgICAgImhjYWxsLXJkbWEifSwKLSAgICB7RldfRkVBVFVSRV9MTEFOLAkgICAgICAgICJoY2FsbC1sTEFOIn0sCi0gICAge0ZXX0ZFQVRVUkVfQlVMSywgICAJImhjYWxsLWJ1bGsifSwKLSAgICB7RldfRkVBVFVSRV9YREFCUiwgIAkiaGNhbGwteGRhYnIifSwKLSAgICB7RldfRkVBVFVSRV9NVUxUSVRDRSwJImhjYWxsLW11bHRpLXRjZSJ9LAotICAgIHtGV19GRUFUVVJFX1NQTFBBUiwJICAgICAgICAiaGNhbGwtc3BscGFyIn0sCisJe0ZXX0ZFQVRVUkVfUEZULAkJImhjYWxsLXBmdCJ9LAorCXtGV19GRUFUVVJFX1RDRSwJCSJoY2FsbC10Y2UifSwKKwl7RldfRkVBVFVSRV9TUFJHMCwJCSJoY2FsbC1zcHJnMCJ9LAorCXtGV19GRUFUVVJFX0RBQlIsCQkiaGNhbGwtZGFiciJ9LAorCXtGV19GRUFUVVJFX0NPUFksCQkiaGNhbGwtY29weSJ9LAorCXtGV19GRUFUVVJFX0FTUiwJCSJoY2FsbC1hc3IifSwKKwl7RldfRkVBVFVSRV9ERUJVRywJCSJoY2FsbC1kZWJ1ZyJ9LAorCXtGV19GRUFUVVJFX1BFUkYsCQkiaGNhbGwtcGVyZiJ9LAorCXtGV19GRUFUVVJFX0RVTVAsCQkiaGNhbGwtZHVtcCJ9LAorCXtGV19GRUFUVVJFX0lOVEVSUlVQVCwJCSJoY2FsbC1pbnRlcnJ1cHQifSwKKwl7RldfRkVBVFVSRV9NSUdSQVRFLAkJImhjYWxsLW1pZ3JhdGUifSwKKwl7RldfRkVBVFVSRV9QRVJGTU9OLAkJImhjYWxsLXBlcmZtb24ifSwKKwl7RldfRkVBVFVSRV9DUlEsCQkiaGNhbGwtY3JxIn0sCisJe0ZXX0ZFQVRVUkVfVklPLAkJImhjYWxsLXZpbyJ9LAorCXtGV19GRUFUVVJFX1JETUEsCQkiaGNhbGwtcmRtYSJ9LAorCXtGV19GRUFUVVJFX0xMQU4sCQkiaGNhbGwtbExBTiJ9LAorCXtGV19GRUFUVVJFX0JVTEssCQkiaGNhbGwtYnVsayJ9LAorCXtGV19GRUFUVVJFX1hEQUJSLAkJImhjYWxsLXhkYWJyIn0sCisJe0ZXX0ZFQVRVUkVfTVVMVElUQ0UsCQkiaGNhbGwtbXVsdGktdGNlIn0sCisJe0ZXX0ZFQVRVUkVfU1BMUEFSLAkJImhjYWxsLXNwbHBhciJ9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUwppbmRleCA2NzVjMjcwLi45M2ViY2FjMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUwpAQCAtMzA4LDYgKzMwOCw3IEBACiBsYWJlbCMjX3BTZXJpZXM6CQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCVwKIAltdHNwcglTUFJHMSxyMTM7CQkvKiBzYXZlIHIxMyAqLwlcCisJUlVOTEFUQ0hfT04ocjEzKTsJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBsYWJlbCMjX2NvbW1vbikKIAogI2RlZmluZSBTVERfRVhDRVBUSU9OX0lTRVJJRVMobiwgbGFiZWwsIGFyZWEpCQlcCkBAIC0zMTUsNiArMzE2LDcgQEAKIGxhYmVsIyNfaVNlcmllczoJCQkJCVwKIAlITVRfTUVESVVNOwkJCQkJXAogCW10c3ByCVNQUkcxLHIxMzsJCS8qIHNhdmUgcjEzICovCVwKKwlSVU5MQVRDSF9PTihyMTMpOwkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR19JU0VSSUVTXzEoYXJlYSk7CQlcCiAJRVhDRVBUSU9OX1BST0xPR19JU0VSSUVTXzI7CQkJXAogCWIJbGFiZWwjI19jb21tb24KQEAgLTMyNCw2ICszMjYsNyBAQAogbGFiZWwjI19pU2VyaWVzOgkJCQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCQkJXAogCW10c3ByCVNQUkcxLHIxMzsJCS8qIHNhdmUgcjEzICovCQkJXAorCVJVTkxBVENIX09OKHIxMyk7CQkJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfSVNFUklFU18xKFBBQ0FfRVhHRU4pOwkJCQlcCiAJbGJ6CXIxMCxQQUNBUFJPQ0VOQUJMRUQocjEzKTsJCQkJXAogCWNtcHdpCTAscjEwLDA7CQkJCQkJXApAQCAtMzkzLDYgKzM5Niw3IEBACiBfbWFjaGluZV9jaGVja19wU2VyaWVzOgogCUhNVF9NRURJVU0KIAltdHNwcglTUFJHMSxyMTMJCS8qIHNhdmUgcjEzICovCisJUlVOTEFUQ0hfT04ocjEzKQogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYTUMsIG1hY2hpbmVfY2hlY2tfY29tbW9uKQogCiAJLiA9IDB4MzAwCkBAIC00MTksNiArNDIzLDcgQEAKIGRhdGFfYWNjZXNzX3NsYl9wU2VyaWVzOgogCUhNVF9NRURJVU0KIAltdHNwcglTUFJHMSxyMTMKKwlSVU5MQVRDSF9PTihyMTMpCiAJbWZzcHIJcjEzLFNQUkczCQkvKiBnZXQgcGFjYSBhZGRyZXNzIGludG8gcjEzICovCiAJc3RkCXI5LFBBQ0FfRVhTTEIrRVhfUjkocjEzKQkvKiBzYXZlIHI5IC0gcjEyICovCiAJc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMChyMTMpCkBAIC00MzksNiArNDQ0LDcgQEAKIGluc3RydWN0aW9uX2FjY2Vzc19zbGJfcFNlcmllczoKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCisJUlVOTEFUQ0hfT04ocjEzKQogCW1mc3ByCXIxMyxTUFJHMwkJLyogZ2V0IHBhY2EgYWRkcmVzcyBpbnRvIHIxMyAqLwogCXN0ZAlyOSxQQUNBX0VYU0xCK0VYX1I5KHIxMykJLyogc2F2ZSByOSAtIHIxMiAqLwogCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9SMTAocjEzKQpAQCAtNDY0LDYgKzQ3MCw3IEBACiAJLmdsb2JsCXN5c3RlbV9jYWxsX3BTZXJpZXMKIHN5c3RlbV9jYWxsX3BTZXJpZXM6CiAJSE1UX01FRElVTQorCVJVTkxBVENIX09OKHI5KQogCW1yCXI5LHIxMwogCW1mbXNyCXIxMAogCW1mc3ByCXIxMyxTUFJHMwpAQCAtNzA3LDExICs3MTQsMTMgQEAKIHN5c3RlbV9yZXNldF9md25taToKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCQkvKiBzYXZlIHIxMyAqLworCVJVTkxBVENIX09OKHIxMykKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgc3lzdGVtX3Jlc2V0X2NvbW1vbikKIAkuZ2xvYmwgbWFjaGluZV9jaGVja19md25taQogbWFjaGluZV9jaGVja19md25taToKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCQkvKiBzYXZlIHIxMyAqLworCVJVTkxBVENIX09OKHIxMykKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWE1DLCBtYWNoaW5lX2NoZWNrX2NvbW1vbikKIAogCS8qCkBAIC04NDgsNiArODU3LDcgQEAKIAkuYWxpZ24JNwogCS5nbG9ibCBkYXRhX2FjY2Vzc19jb21tb24KIGRhdGFfYWNjZXNzX2NvbW1vbjoKKwlSVU5MQVRDSF9PTihyMTApCQkvKiBJdCB3b250IGZpdCBpbiB0aGUgMHgzMDAgaGFuZGxlciAqLwogCW1mc3ByCXIxMCxEQVIKIAlzdGQJcjEwLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKIAltZnNwcglyMTAsRFNJU1IKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2h2Y29uc29sZS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaHZjb25zb2xlLmMKaW5kZXggYzcyZmI4Zi4uMTM4ZTEyOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaHZjb25zb2xlLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvaHZjb25zb2xlLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKIC8qKgogICogaHZjX2dldF9jaGFycyAtIHJldHJpZXZlIGNoYXJhY3RlcnMgZnJvbSBmaXJtd2FyZSBmb3IgZGVub3RlZCB2dGVybSBhZGF0cGVyCkBAIC00MiwyOSArNDEsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGdvdDsKIAogCWlmIChwbHBhcl9oY2FsbChIX0dFVF9URVJNX0NIQVIsIHZ0ZXJtbm8sIDAsIDAsIDAsICZnb3QsCi0JCSh1bnNpZ25lZCBsb25nICopYnVmLCAodW5zaWduZWQgbG9uZyAqKWJ1ZisxKSA9PSBIX1N1Y2Nlc3MpIHsKLQkJLyoKLQkJICogV29yayBhcm91bmQgYSBIViBidWcgd2hlcmUgaXQgZ2l2ZXMgdXMgYSBudWxsCi0JCSAqIGFmdGVyIGV2ZXJ5IFxyLiAgLS0gcGF1bHVzCi0JCSAqLwotCQlpZiAoZ290ID4gMCkgewotCQkJaW50IGk7Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZ290OyArK2kpIHsKLQkJCQlpZiAoYnVmW2ldID09IDAgJiYgYnVmW2ktMV0gPT0gJ1xyJykgewotCQkJCQktLWdvdDsKLQkJCQkJaWYgKGkgPCBnb3QpCi0JCQkJCQltZW1tb3ZlKCZidWZbaV0sICZidWZbaSsxXSwKLQkJCQkJCQlnb3QgLSBpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKwkJKHVuc2lnbmVkIGxvbmcgKilidWYsICh1bnNpZ25lZCBsb25nICopYnVmKzEpID09IEhfU3VjY2VzcykKIAkJcmV0dXJuIGdvdDsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKIEVYUE9SVF9TWU1CT0woaHZjX2dldF9jaGFycyk7CiAKKwogLyoqCiAgKiBodmNfcHV0X2NoYXJzOiBzZW5kIGNoYXJhY3RlcnMgdG8gZmlybXdhcmUgZm9yIGRlbm90ZWQgdnRlcm0gYWRhcHRlcgogICogQHZ0ZXJtbm86IFRoZSB2dGVybW5vIG9yIHVuaXRfYWRkcmVzcyBvZiB0aGUgYWRhcHRlciBmcm9tIHdoaWNoIHRoZSBkYXRhCkBAIC04OCwzNCArNzIsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGh2Y19wdXRfY2hhcnMpOwotCi0vKgotICogV2UgaG9wZS9hc3N1bWUgdGhhdCB0aGUgZmlyc3QgdnR5IGZvdW5kIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBjb25zb2xlCi0gKiBkZXZpY2UuCi0gKi8KLWludCBodmNfZmluZF92dHlzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICp2dHk7Ci0JaW50IG51bV9mb3VuZCA9IDA7Ci0KLQlmb3IgKHZ0eSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2dHkiKTsgdnR5ICE9IE5VTEw7Ci0JCQl2dHkgPSBvZl9maW5kX25vZGVfYnlfbmFtZSh2dHksICJ2dHkiKSkgewotCQl1aW50MzJfdCAqdnRlcm1ubzsKLQotCQkvKiBXZSBoYXZlIHN0YXRpY2FsbHkgZGVmaW5lZCBzcGFjZSBmb3Igb25seSBhIGNlcnRhaW4gbnVtYmVyIG9mCi0JCSAqIGNvbnNvbGUgYWRhcHRlcnMuICovCi0JCWlmIChudW1fZm91bmQgPj0gTUFYX05SX0hWQ19DT05TT0xFUykKLQkJCWJyZWFrOwotCi0JCXZ0ZXJtbm8gPSAodWludDMyX3QgKilnZXRfcHJvcGVydHkodnR5LCAicmVnIiwgTlVMTCk7Ci0JCWlmICghdnRlcm1ubykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZSh2dHksICJodnRlcm0xIikpIHsKLQkJCWh2Y19pbnN0YW50aWF0ZSgqdnRlcm1ubywgbnVtX2ZvdW5kKTsKLQkJCSsrbnVtX2ZvdW5kOwotCQl9Ci0JfQotCi0JcmV0dXJuIG51bV9mb3VuZDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfaHRhYi5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19odGFiLmMKaW5kZXggYWE5ZThmZC4uYjAyNTBhZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19odGFiLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19odGFiLmMKQEAgLTM4LDExICszOCwxMiBAQAogfQogCiBzdGF0aWMgbG9uZyBpU2VyaWVzX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwgdW5zaWduZWQgbG9uZyB2YSwKLQkJCSB1bnNpZ25lZCBsb25nIHBycG4sIGludCBzZWNvbmRhcnksCi0JCQkgdW5zaWduZWQgbG9uZyBocHRlZmxhZ3MsIGludCBib2x0ZWQsIGludCBsYXJnZSkKKwkJCQl1bnNpZ25lZCBsb25nIHBycG4sIHVuc2lnbmVkIGxvbmcgdmZsYWdzLAorCQkJCXVuc2lnbmVkIGxvbmcgcmZsYWdzKQogewogCWxvbmcgc2xvdDsKLQlIUFRFIGxocHRlOworCWhwdGVfdCBsaHB0ZTsKKwlpbnQgc2Vjb25kYXJ5ID0gMDsKIAogCS8qCiAJICogVGhlIGh5cGVydmlzb3IgdHJpZXMgYm90aCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkuCkBAIC01MCwxMyArNTEsMTMgQEAKIAkgKiBpdCBtZWFucyB3ZSBoYXZlIGFscmVhZHkgdHJpZWQgYm90aCBwcmltYXJ5IGFuZCBzZWNvbmRhcnksCiAJICogc28gd2UgcmV0dXJuIGZhaWx1cmUgaW1tZWRpYXRlbHkuCiAJICovCi0JaWYgKHNlY29uZGFyeSkKKwlpZiAodmZsYWdzICYgSFBURV9WX1NFQ09OREFSWSkKIAkJcmV0dXJuIC0xOwogCiAJaVNlcmllc19obG9jayhocHRlX2dyb3VwKTsKIAogCXNsb3QgPSBIdkNhbGxIcHRfZmluZFZhbGlkKCZsaHB0ZSwgdmEgPj4gUEFHRV9TSElGVCk7Ci0JQlVHX09OKGxocHRlLmR3MC5kdzAudik7CisJQlVHX09OKGxocHRlLnYgJiBIUFRFX1ZfVkFMSUQpOwogCiAJaWYgKHNsb3QgPT0gLTEpCXsgLyogTm8gYXZhaWxhYmxlIGVudHJ5IGZvdW5kIGluIGVpdGhlciBncm91cCAqLwogCQlpU2VyaWVzX2h1bmxvY2soaHB0ZV9ncm91cCk7CkBAIC02NCwxOSArNjUsMTMgQEAKIAl9CiAKIAlpZiAoc2xvdCA8IDApIHsJCS8qIE1TQiBzZXQgbWVhbnMgc2Vjb25kYXJ5IGdyb3VwICovCisJCXZmbGFncyB8PSBIUFRFX1ZfVkFMSUQ7CiAJCXNlY29uZGFyeSA9IDE7CiAJCXNsb3QgJj0gMHg3ZmZmZmZmZmZmZmZmZmZmOwogCX0KIAotCWxocHRlLmR3MS5kd29yZDEgICAgICA9IDA7Ci0JbGhwdGUuZHcxLmR3MS5ycG4gICAgID0gcGh5c1Jwbl90b19hYnNScG4ocHJwbik7Ci0JbGhwdGUuZHcxLmZsYWdzLmZsYWdzID0gaHB0ZWZsYWdzOwotCi0JbGhwdGUuZHcwLmR3b3JkMCAgICAgID0gMDsKLQlsaHB0ZS5kdzAuZHcwLmF2cG4gICAgPSB2YSA+PiAyMzsKLQlsaHB0ZS5kdzAuZHcwLmggICAgICAgPSBzZWNvbmRhcnk7Ci0JbGhwdGUuZHcwLmR3MC5ib2x0ZWQgID0gYm9sdGVkOwotCWxocHRlLmR3MC5kdzAudiAgICAgICA9IDE7CisJbGhwdGUudiA9ICh2YSA+PiAyMykgPDwgSFBURV9WX0FWUE5fU0hJRlQgfCB2ZmxhZ3MgfCBIUFRFX1ZfVkFMSUQ7CisJbGhwdGUuciA9IChwaHlzUnBuX3RvX2Fic1JwbihwcnBuKSA8PCBIUFRFX1JfUlBOX1NISUZUKSB8IHJmbGFnczsKIAogCS8qIE5vdyBmaWxsIGluIHRoZSBhY3R1YWwgSFBURSAqLwogCUh2Q2FsbEhwdF9hZGRWYWxpZGF0ZShzbG90LCBzZWNvbmRhcnksICZsaHB0ZSk7CkBAIC04OCwyMCArODMsMTcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaVNlcmllc19ocHRlX2dldHdvcmQwKHVuc2lnbmVkIGxvbmcgc2xvdCkKIHsKLQl1bnNpZ25lZCBsb25nIGR3b3JkMDsKLQlIUFRFIGhwdGU7CisJaHB0ZV90IGhwdGU7CiAKIAlIdkNhbGxIcHRfZ2V0KCZocHRlLCBzbG90KTsKLQlkd29yZDAgPSBocHRlLmR3MC5kd29yZDA7Ci0KLQlyZXR1cm4gZHdvcmQwOworCXJldHVybiBocHRlLnY7CiB9CiAKIHN0YXRpYyBsb25nIGlTZXJpZXNfaHB0ZV9yZW1vdmUodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwKQogewogCXVuc2lnbmVkIGxvbmcgc2xvdF9vZmZzZXQ7CiAJaW50IGk7Ci0JSFBURSBsaHB0ZTsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAogCS8qIFBpY2sgYSByYW5kb20gc2xvdCB0byBzdGFydCBhdCAqLwogCXNsb3Rfb2Zmc2V0ID0gbWZ0YigpICYgMHg3OwpAQCAtMTA5LDEwICsxMDEsOSBAQAogCWlTZXJpZXNfaGxvY2soaHB0ZV9ncm91cCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSFBURVNfUEVSX0dST1VQOyBpKyspIHsKLQkJbGhwdGUuZHcwLmR3b3JkMCA9IAotCQkJaVNlcmllc19ocHRlX2dldHdvcmQwKGhwdGVfZ3JvdXAgKyBzbG90X29mZnNldCk7CisJCWhwdGVfdiA9IGlTZXJpZXNfaHB0ZV9nZXR3b3JkMChocHRlX2dyb3VwICsgc2xvdF9vZmZzZXQpOwogCi0JCWlmICghbGhwdGUuZHcwLmR3MC5ib2x0ZWQpIHsKKwkJaWYgKCEgKGhwdGVfdiAmIEhQVEVfVl9CT0xURUQpKSB7CiAJCQlIdkNhbGxIcHRfaW52YWxpZGF0ZVNldFN3Qml0c0dldChocHRlX2dyb3VwICsgCiAJCQkJCQkJIHNsb3Rfb2Zmc2V0LCAwLCAwKTsKIAkJCWlTZXJpZXNfaHVubG9jayhocHRlX2dyb3VwKTsKQEAgLTEzNywxMyArMTI4LDEzIEBACiBzdGF0aWMgbG9uZyBpU2VyaWVzX2hwdGVfdXBkYXRlcHAodW5zaWduZWQgbG9uZyBzbG90LCB1bnNpZ25lZCBsb25nIG5ld3BwLAogCQkJCSAgdW5zaWduZWQgbG9uZyB2YSwgaW50IGxhcmdlLCBpbnQgbG9jYWwpCiB7Ci0JSFBURSBocHRlOworCWhwdGVfdCBocHRlOwogCXVuc2lnbmVkIGxvbmcgYXZwbiA9IHZhID4+IDIzOwogCiAJaVNlcmllc19obG9jayhzbG90KTsKIAogCUh2Q2FsbEhwdF9nZXQoJmhwdGUsIHNsb3QpOwotCWlmICgoaHB0ZS5kdzAuZHcwLmF2cG4gPT0gYXZwbikgJiYgKGhwdGUuZHcwLmR3MC52KSkgeworCWlmICgoSFBURV9WX0FWUE5fVkFMKGhwdGUudikgPT0gYXZwbikgJiYgKGhwdGUudiAmIEhQVEVfVl9WQUxJRCkpIHsKIAkJLyoKIAkJICogSHlwZXJ2aXNvciBleHBlY3RzIGJpdHMgYXMgTlBQUCwgd2hpY2ggaXMKIAkJICogZGlmZmVyZW50IGZyb20gaG93IHRoZXkgYXJlIG1hcHBlZCBpbiBvdXIgUFAuCkBAIC0xNjcsNyArMTU4LDcgQEAKICAqLwogc3RhdGljIGxvbmcgaVNlcmllc19ocHRlX2ZpbmQodW5zaWduZWQgbG9uZyB2cG4pCiB7Ci0JSFBURSBocHRlOworCWhwdGVfdCBocHRlOwogCWxvbmcgc2xvdDsKIAogCS8qCkBAIC0xNzcsNyArMTY4LDcgQEAKIAkgKiAweDgwMDAwMDAweHh4eHh4eHggOiBFbnRyeSBmb3VuZCBpbiBzZWNvbmRhcnkgZ3JvdXAsIHNsb3QgeAogCSAqLwogCXNsb3QgPSBIdkNhbGxIcHRfZmluZFZhbGlkKCZocHRlLCB2cG4pOyAKLQlpZiAoaHB0ZS5kdzAuZHcwLnYpIHsKKwlpZiAoaHB0ZS52ICYgSFBURV9WX1ZBTElEKSB7CiAJCWlmIChzbG90IDwgMCkgewogCQkJc2xvdCAmPSAweDdmZmZmZmZmZmZmZmZmZmY7CiAJCQlzbG90ID0gLXNsb3Q7CkBAIC0yMTIsNyArMjAzLDcgQEAKIHN0YXRpYyB2b2lkIGlTZXJpZXNfaHB0ZV9pbnZhbGlkYXRlKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyB2YSwKIAkJCQkgICAgaW50IGxhcmdlLCBpbnQgbG9jYWwpCiB7Ci0JSFBURSBsaHB0ZTsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIGF2cG4gPSB2YSA+PiAyMzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yMjAsOSArMjExLDkgQEAKIAogCWlTZXJpZXNfaGxvY2soc2xvdCk7CiAKLQlsaHB0ZS5kdzAuZHdvcmQwID0gaVNlcmllc19ocHRlX2dldHdvcmQwKHNsb3QpOworCWhwdGVfdiA9IGlTZXJpZXNfaHB0ZV9nZXR3b3JkMChzbG90KTsKIAkKLQlpZiAoKGxocHRlLmR3MC5kdzAuYXZwbiA9PSBhdnBuKSAmJiBsaHB0ZS5kdzAuZHcwLnYpCisJaWYgKChIUFRFX1ZfQVZQTl9WQUwoaHB0ZV92KSA9PSBhdnBuKSAmJiAoaHB0ZV92ICYgSFBURV9WX1ZBTElEKSkKIAkJSHZDYWxsSHB0X2ludmFsaWRhdGVTZXRTd0JpdHNHZXQoc2xvdCwgMCwgMCk7CiAKIAlpU2VyaWVzX2h1bmxvY2soc2xvdCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pU2VyaWVzX3NldHVwLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9pU2VyaWVzX3NldHVwLmMKaW5kZXggYjNmNzcwZi4uYTY0OWVkYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19zZXR1cC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfc2V0dXAuYwpAQCAtNTAzLDcgKzUwMyw3IEBACiAKIAkvKiBGaWxsIGluIHRoZSBoYXNoZWQgcGFnZSB0YWJsZSBoYXNoIG1hc2sgKi8KIAludW1fcHRlZ3MgPSBocHRTaXplUGFnZXMgKgotCQkoUEFHRV9TSVpFIC8gKHNpemVvZihIUFRFKSAqIEhQVEVTX1BFUl9HUk9VUCkpOworCQkoUEFHRV9TSVpFIC8gKHNpemVvZihocHRlX3QpICogSFBURVNfUEVSX0dST1VQKSk7CiAJaHRhYl9oYXNoX21hc2sgPSBudW1fcHRlZ3MgLSAxOwogCiAJLyoKQEAgLTYxOCwyNSArNjE4LDIzIEBACiBzdGF0aWMgdm9pZCBpU2VyaWVzX21ha2VfcHRlKHVuc2lnbmVkIGxvbmcgdmEsIHVuc2lnbmVkIGxvbmcgcGEsCiAJCQkgICAgIGludCBtb2RlKQogewotCUhQVEUgbG9jYWxfaHB0ZSwgcmhwdGU7CisJaHB0ZV90IGxvY2FsX2hwdGUsIHJocHRlOwogCXVuc2lnbmVkIGxvbmcgaGFzaCwgdnBuOwogCWxvbmcgc2xvdDsKIAogCXZwbiA9IHZhID4+IFBBR0VfU0hJRlQ7CiAJaGFzaCA9IGhwdF9oYXNoKHZwbiwgMCk7CiAKLQlsb2NhbF9ocHRlLmR3MS5kd29yZDEgPSBwYSB8IG1vZGU7Ci0JbG9jYWxfaHB0ZS5kdzAuZHdvcmQwID0gMDsKLQlsb2NhbF9ocHRlLmR3MC5kdzAuYXZwbiA9IHZhID4+IDIzOwotCWxvY2FsX2hwdGUuZHcwLmR3MC5ib2x0ZWQgPSAxOwkJLyogYm9sdGVkICovCi0JbG9jYWxfaHB0ZS5kdzAuZHcwLnYgPSAxOworCWxvY2FsX2hwdGUuciA9IHBhIHwgbW9kZTsKKwlsb2NhbF9ocHRlLnYgPSAoKHZhID4+IDIzKSA8PCBIUFRFX1ZfQVZQTl9TSElGVCkKKwkJfCBIUFRFX1ZfQk9MVEVEIHwgSFBURV9WX1ZBTElEOwogCiAJc2xvdCA9IEh2Q2FsbEhwdF9maW5kVmFsaWQoJnJocHRlLCB2cG4pOwogCWlmIChzbG90IDwgMCkgewogCQkvKiBNdXN0IGZpbmQgc3BhY2UgaW4gcHJpbWFyeSBncm91cCAqLwogCQlwYW5pYygiaGFzaF9wYWdlOiBocHRlIGFscmVhZHkgZXhpc3RzXG4iKTsKIAl9Ci0JSHZDYWxsSHB0X2FkZFZhbGlkYXRlKHNsb3QsIDAsIChIUFRFICopJmxvY2FsX2hwdGUgKTsKKwlIdkNhbGxIcHRfYWRkVmFsaWRhdGUoc2xvdCwgMCwgJmxvY2FsX2hwdGUpOwogfQogCiAvKgpAQCAtNjQ2LDcgKzY0NCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBwYTsKIAl1bnNpZ25lZCBsb25nIG1vZGVfcncgPSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0NPSEVSRU5UIHwgUFBfUldYWDsKLQlIUFRFIGhwdGU7CisJaHB0ZV90IGhwdGU7CiAKIAlmb3IgKHBhID0gc2FkZHI7IHBhIDwgZWFkZHIgO3BhICs9IFBBR0VfU0laRSkgewogCQl1bnNpZ25lZCBsb25nIGVhID0gKHVuc2lnbmVkIGxvbmcpX192YShwYSk7CkBAIC02NTksNyArNjU3LDcgQEAKIAkJaWYgKCFpbl9rZXJuZWxfdGV4dChlYSkpCiAJCQltb2RlX3J3IHw9IEhXX05PX0VYRUM7CiAKLQkJaWYgKGhwdGUuZHcwLmR3MC52KSB7CisJCWlmIChocHRlLnYgJiBIUFRFX1ZfVkFMSUQpIHsKIAkJCS8qIEhQVEUgZXhpc3RzLCBzbyBqdXN0IGJvbHQgaXQgKi8KIAkJCUh2Q2FsbEhwdF9zZXRTd0JpdHMoc2xvdCwgMHgxMCwgMCk7CiAJCQkvKiBBbmQgbWFrZSBzdXJlIHRoZSBwcCBiaXRzIGFyZSBjb3JyZWN0ICovCkBAIC04MzQsNiArODMyLDkyIEBACiAKIGxhdGVfaW5pdGNhbGwoaVNlcmllc19zcmNfaW5pdCk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlICgibGkgMCwweDU1NTU7IHNjIiA6IDogOiAicjAiLCAicjMiKTsKK30KKworc3RhdGljIHZvaWQgeWllbGRfc2hhcmVkX3Byb2Nlc3Nvcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdGI7CisKKwlIdkNhbGxfc2V0RW5hYmxlZEludGVycnVwdHMoSHZDYWxsX01hc2tJUEkgfAorCQkJCSAgICBIdkNhbGxfTWFza0xwRXZlbnQgfAorCQkJCSAgICBIdkNhbGxfTWFza0xwUHJvZCB8CisJCQkJICAgIEh2Q2FsbF9NYXNrVGltZW91dCk7CisKKwl0YiA9IGdldF90YigpOworCS8qIENvbXB1dGUgZnV0dXJlIHRiIHZhbHVlIHdoZW4geWllbGQgc2hvdWxkIGV4cGlyZSAqLworCUh2Q2FsbF95aWVsZFByb2Nlc3NvcihIdkNhbGxfWWllbGRUaW1lZCwgdGIrdGJfdGlja3NfcGVyX2ppZmZ5KTsKKworCS8qCisJICogVGhlIGRlY3JlbWVudGVyIHN0b3BzIGR1cmluZyB0aGUgeWllbGQuICBGb3JjZSBhIGZha2UgZGVjcmVtZW50ZXIKKwkgKiBoZXJlIGFuZCBsZXQgdGhlIHRpbWVyX2ludGVycnVwdCBjb2RlIHNvcnQgb3V0IHRoZSBhY3R1YWwgdGltZS4KKwkgKi8KKwlnZXRfcGFjYSgpLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDE7CisJcHJvY2Vzc19pU2VyaWVzX2V2ZW50cygpOworfQorCitzdGF0aWMgaW50IGlzZXJpZXNfc2hhcmVkX2lkbGUodm9pZCkKK3sKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFodmxwZXZlbnRfaXNfcGVuZGluZygpKSB7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CisKKwkJCS8qIFJlY2hlY2sgd2l0aCBpcnFzIG9mZiAqLworCQkJaWYgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkKKwkJCQl5aWVsZF9zaGFyZWRfcHJvY2Vzc29yKCk7CisKKwkJCUhNVF9tZWRpdW0oKTsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJfQorCisJCXBwYzY0X3J1bmxhdGNoX29uKCk7CisKKwkJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJCQlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7CisKKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc2VyaWVzX2RlZGljYXRlZF9pZGxlKHZvaWQpCit7CisJbG9uZyBvbGR2YWw7CisKKwl3aGlsZSAoMSkgeworCQlvbGR2YWwgPSB0ZXN0X2FuZF9jbGVhcl90aHJlYWRfZmxhZyhUSUZfTkVFRF9SRVNDSEVEKTsKKworCQlpZiAoIW9sZHZhbCkgeworCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisKKwkJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJCQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKKwkJCQlITVRfbG93KCk7CisKKwkJCQlpZiAoaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkgeworCQkJCQlITVRfbWVkaXVtKCk7CisJCQkJCXBwYzY0X3J1bmxhdGNoX29uKCk7CisJCQkJCXByb2Nlc3NfaVNlcmllc19ldmVudHMoKTsKKwkJCQl9CisJCQl9CisKKwkJCUhNVF9tZWRpdW0oKTsKKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJCX0gZWxzZSB7CisJCQlzZXRfbmVlZF9yZXNjaGVkKCk7CisJCX0KKworCQlwcGM2NF9ydW5sYXRjaF9vbigpOworCQlzY2hlZHVsZSgpOworCX0KKworCXJldHVybiAwOworfQorCiAjaWZuZGVmIENPTkZJR19QQ0kKIHZvaWQgX19pbml0IGlTZXJpZXNfaW5pdF9JUlEodm9pZCkgeyB9CiAjZW5kaWYKQEAgLTg1OSw1ICs5NDMsMTMgQEAKIAlwcGNfbWQuZ2V0X3J0Y190aW1lID0gaVNlcmllc19nZXRfcnRjX3RpbWU7CiAJcHBjX21kLmNhbGlicmF0ZV9kZWNyID0gaVNlcmllc19jYWxpYnJhdGVfZGVjcjsKIAlwcGNfbWQucHJvZ3Jlc3MgPSBpU2VyaWVzX3Byb2dyZXNzOworCisJaWYgKGdldF9wYWNhKCktPmxwcGFjYS5zaGFyZWRfcHJvYykgeworCQlwcGNfbWQuaWRsZV9sb29wID0gaXNlcmllc19zaGFyZWRfaWRsZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgc2hhcmVkIHByb2Nlc3NvciBpZGxlIGxvb3BcbiIpOworCX0gZWxzZSB7CisJCXBwY19tZC5pZGxlX2xvb3AgPSBpc2VyaWVzX2RlZGljYXRlZF9pZGxlOworCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWRpY2F0ZWQgaWRsZSBsb29wXG4iKTsKKwl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2lkbGUuYyBiL2FyY2gvcHBjNjQva2VybmVsL2lkbGUuYwppbmRleCAwODk1MmM3Li45NTQzOTVkIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9pZGxlLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvaWRsZS5jCkBAIC0yMCwxMDkgKzIwLDE4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2Q2FsbC5oPgotI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0l0THBRdWV1ZS5oPgotI2luY2x1ZGUgPGFzbS9wbHBhcl93cmFwcGVycy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW1jZmcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogCiBleHRlcm4gdm9pZCBwb3dlcjRfaWRsZSh2b2lkKTsKIAotc3RhdGljIGludCAoKmlkbGVfbG9vcCkodm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1heFlpZWxkVGltZSA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBtaW5ZaWVsZFRpbWUgPSAweGZmZmZmZmZmZmZmZmZmZmZVTDsKLQotc3RhdGljIGlubGluZSB2b2lkIHByb2Nlc3NfaVNlcmllc19ldmVudHModm9pZCkKLXsKLQlhc20gdm9sYXRpbGUgKCJsaSAwLDB4NTU1NTsgc2MiIDogOiA6ICJyMCIsICJyMyIpOwotfQotCi1zdGF0aWMgdm9pZCB5aWVsZF9zaGFyZWRfcHJvY2Vzc29yKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB0YjsKLQl1bnNpZ25lZCBsb25nIHlpZWxkVGltZTsKLQotCUh2Q2FsbF9zZXRFbmFibGVkSW50ZXJydXB0cyhIdkNhbGxfTWFza0lQSSB8Ci0JCQkJICAgIEh2Q2FsbF9NYXNrTHBFdmVudCB8Ci0JCQkJICAgIEh2Q2FsbF9NYXNrTHBQcm9kIHwKLQkJCQkgICAgSHZDYWxsX01hc2tUaW1lb3V0KTsKLQotCXRiID0gZ2V0X3RiKCk7Ci0JLyogQ29tcHV0ZSBmdXR1cmUgdGIgdmFsdWUgd2hlbiB5aWVsZCBzaG91bGQgZXhwaXJlICovCi0JSHZDYWxsX3lpZWxkUHJvY2Vzc29yKEh2Q2FsbF9ZaWVsZFRpbWVkLCB0Yit0Yl90aWNrc19wZXJfamlmZnkpOwotCi0JeWllbGRUaW1lID0gZ2V0X3RiKCkgLSB0YjsKLQlpZiAoeWllbGRUaW1lID4gbWF4WWllbGRUaW1lKQotCQltYXhZaWVsZFRpbWUgPSB5aWVsZFRpbWU7Ci0KLQlpZiAoeWllbGRUaW1lIDwgbWluWWllbGRUaW1lKQotCQltaW5ZaWVsZFRpbWUgPSB5aWVsZFRpbWU7Ci0JCi0JLyoKLQkgKiBUaGUgZGVjcmVtZW50ZXIgc3RvcHMgZHVyaW5nIHRoZSB5aWVsZC4gIEZvcmNlIGEgZmFrZSBkZWNyZW1lbnRlcgotCSAqIGhlcmUgYW5kIGxldCB0aGUgdGltZXJfaW50ZXJydXB0IGNvZGUgc29ydCBvdXQgdGhlIGFjdHVhbCB0aW1lLgotCSAqLwotCWdldF9wYWNhKCktPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMTsKLQlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7Ci19Ci0KLXN0YXRpYyBpbnQgaVNlcmllc19pZGxlKHZvaWQpCi17Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYTsKLQlsb25nIG9sZHZhbDsKLQotCS8qIGVuc3VyZSBpU2VyaWVzIHJ1biBsaWdodCB3aWxsIGJlIG91dCB3aGVuIGlkbGUgKi8KLQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKLQotCWxwYWNhID0gZ2V0X3BhY2EoKTsKLQotCXdoaWxlICgxKSB7Ci0JCWlmIChscGFjYS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7Ci0JCQlpZiAoaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkKLQkJCQlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7Ci0JCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJCXlpZWxkX3NoYXJlZF9wcm9jZXNzb3IoKTsKLQkJfSBlbHNlIHsKLQkJCW9sZHZhbCA9IHRlc3RfYW5kX2NsZWFyX3RocmVhZF9mbGFnKFRJRl9ORUVEX1JFU0NIRUQpOwotCi0JCQlpZiAoIW9sZHZhbCkgewotCQkJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwotCi0JCQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewotCQkJCQlITVRfbWVkaXVtKCk7Ci0JCQkJCWlmIChodmxwZXZlbnRfaXNfcGVuZGluZygpKQotCQkJCQkJcHJvY2Vzc19pU2VyaWVzX2V2ZW50cygpOwotCQkJCQlITVRfbG93KCk7Ci0JCQkJfQotCi0JCQkJSE1UX21lZGl1bSgpOwotCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0JCQl9IGVsc2UgewotCQkJCXNldF9uZWVkX3Jlc2NoZWQoKTsKLQkJCX0KLQkJfQotCi0JCXBwYzY0X3J1bmxhdGNoX29uKCk7Ci0JCXNjaGVkdWxlKCk7Ci0JCXBwYzY0X3J1bmxhdGNoX29mZigpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW50IGRlZmF1bHRfaWRsZSh2b2lkKQoraW50IGRlZmF1bHRfaWRsZSh2b2lkKQogewogCWxvbmcgb2xkdmFsOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CkBAIC0xMzQsNyArNDMsOCBAQAogCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAKIAkJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKLQkJCQliYXJyaWVyKCk7CisJCQkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CisKIAkJCQkvKgogCQkJCSAqIEdvIGludG8gbG93IHRocmVhZCBwcmlvcml0eSBhbmQgcG9zc2libHkKIAkJCQkgKiBsb3cgcG93ZXIgbW9kZS4KQEAgLTE0OSw2ICs1OSw3IEBACiAJCQlzZXRfbmVlZF9yZXNjaGVkKCk7CiAJCX0KIAorCQlwcGM2NF9ydW5sYXRjaF9vbigpOwogCQlzY2hlZHVsZSgpOwogCQlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCiAJCQljcHVfZGllKCk7CkBAIC0xNTcsMTI3ICs2OCwxOSBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCi0KLURFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBzbXRfc25vb3plX2RlbGF5KTsKLQotaW50IGRlZGljYXRlZF9pZGxlKHZvaWQpCitpbnQgbmF0aXZlX2lkbGUodm9pZCkKIHsKLQlsb25nIG9sZHZhbDsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKSwgKnBwYWNhOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfc25vb3plOwotCXVuc2lnbmVkIGxvbmcgKnNtdF9zbm9vemVfZGVsYXkgPSAmX19nZXRfY3B1X3ZhcihzbXRfc25vb3plX2RlbGF5KTsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JcHBhY2EgPSAmcGFjYVtjcHUgXiAxXTsKLQogCXdoaWxlICgxKSB7Ci0JCS8qCi0JCSAqIEluZGljYXRlIHRvIHRoZSBIViB0aGF0IHdlIGFyZSBpZGxlLiBOb3cgd291bGQgYmUKLQkJICogYSBnb29kIHRpbWUgdG8gZmluZCBvdGhlciB3b3JrIHRvIGRpc3BhdGNoLgotCQkgKi8KLQkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMTsKKwkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CiAKLQkJb2xkdmFsID0gdGVzdF9hbmRfY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05FRURfUkVTQ0hFRCk7Ci0JCWlmICghb2xkdmFsKSB7Ci0JCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKLQkJCXN0YXJ0X3Nub296ZSA9IF9fZ2V0X3RiKCkgKwotCQkJCSpzbXRfc25vb3plX2RlbGF5ICogdGJfdGlja3NfcGVyX3VzZWM7Ci0JCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFjcHVfaXNfb2ZmbGluZShjcHUpKSB7Ci0JCQkJLyoKLQkJCQkgKiBHbyBpbnRvIGxvdyB0aHJlYWQgcHJpb3JpdHkgYW5kIHBvc3NpYmx5Ci0JCQkJICogbG93IHBvd2VyIG1vZGUuCi0JCQkJICovCi0JCQkJSE1UX2xvdygpOwotCQkJCUhNVF92ZXJ5X2xvdygpOworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJcG93ZXI0X2lkbGUoKTsKIAotCQkJCWlmICgqc210X3Nub296ZV9kZWxheSA9PSAwIHx8Ci0JCQkJICAgIF9fZ2V0X3RiKCkgPCBzdGFydF9zbm9vemUpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSE1UX21lZGl1bSgpOwotCi0JCQkJaWYgKCEocHBhY2EtPmxwcGFjYS5pZGxlKSkgewotCQkJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0JCQkJCS8qCi0JCQkJCSAqIFdlIGFyZSBhYm91dCB0byBzbGVlcCB0aGUgdGhyZWFkCi0JCQkJCSAqIGFuZCBzbyB3b250IGJlIHBvbGxpbmcgYW55Ci0JCQkJCSAqIG1vcmUuCi0JCQkJCSAqLwotCQkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwotCi0JCQkJCS8qCi0JCQkJCSAqIFNNVCBkeW5hbWljIG1vZGUuIENlZGUgd2lsbCByZXN1bHQKLQkJCQkJICogaW4gdGhpcyB0aHJlYWQgZ29pbmcgZG9ybWFudCwgaWYgdGhlCi0JCQkJCSAqIHBhcnRuZXIgdGhyZWFkIGlzIHN0aWxsIGRvaW5nIHdvcmsuCi0JCQkJCSAqIFRocmVhZCB3YWtlcyB1cCBpZiBwYXJ0bmVyIGdvZXMgaWRsZSwKLQkJCQkJICogYW4gaW50ZXJydXB0IGlzIHByZXNlbnRlZCwgb3IgYSBwcm9kCi0JCQkJCSAqIG9jY3Vycy4gIFJldHVybmluZyBmcm9tIHRoZSBjZWRlCi0JCQkJCSAqIGVuYWJsZXMgZXh0ZXJuYWwgaW50ZXJydXB0cy4KLQkJCQkJICovCi0JCQkJCWlmICghbmVlZF9yZXNjaGVkKCkpCi0JCQkJCQljZWRlX3Byb2Nlc3NvcigpOwotCQkJCQllbHNlCi0JCQkJCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogR2l2ZSB0aGUgSFYgYW4gb3Bwb3J0dW5pdHkgYXQgdGhlCi0JCQkJCSAqIHByb2Nlc3Nvciwgc2luY2Ugd2UgYXJlIG5vdCBkb2luZwotCQkJCQkgKiBhbnkgd29yay4KLQkJCQkJICovCi0JCQkJCXBvbGxfcGVuZGluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9uZWVkX3Jlc2NoZWQoKTsKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCQlwcGM2NF9ydW5sYXRjaF9vbigpOworCQkJc2NoZWR1bGUoKTsKIAkJfQogCi0JCUhNVF9tZWRpdW0oKTsKLQkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMDsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKQotCQkJY3B1X2RpZSgpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGFyZWRfaWRsZSh2b2lkKQotewotCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOwotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQl3aGlsZSAoMSkgewotCQkvKgotCQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCi0JCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KLQkJICovCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDE7Ci0KLQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkgewotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQotCQkJLyoKLQkJCSAqIFlpZWxkIHRoZSBwcm9jZXNzb3IgdG8gdGhlIGh5cGVydmlzb3IuICBXZSByZXR1cm4gaWYKLQkJCSAqIGFuIGV4dGVybmFsIGludGVycnVwdCBvY2N1cnMgKHdoaWNoIGFyZSBkcml2ZW4gcHJpb3IKLQkJCSAqIHRvIHJldHVybmluZyBoZXJlKSBvciBpZiBhIHByb2Qgb2NjdXJzIGZyb20gYW5vdGhlciAKLQkJCSAqIHByb2Nlc3Nvci4gV2hlbiByZXR1cm5pbmcgaGVyZSwgZXh0ZXJuYWwgaW50ZXJydXB0cwotCQkJICogYXJlIGVuYWJsZWQuCi0JCQkgKgotCQkJICogQ2hlY2sgbmVlZF9yZXNjaGVkKCkgYWdhaW4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCi0JCQkgKiB0byBhdm9pZCBhIHJhY2UuCi0JCQkgKi8KLQkJCWlmICghbmVlZF9yZXNjaGVkKCkpCi0JCQkJY2VkZV9wcm9jZXNzb3IoKTsKLQkJCWVsc2UKLQkJCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCX0KLQotCQlITVRfbWVkaXVtKCk7Ci0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDA7Ci0JCXNjaGVkdWxlKCk7CiAJCWlmIChjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpICYmCiAJCSAgICBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCiAJCQljcHVfZGllKCk7CkBAIC0yODYsMjkgKzg5LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KLQotc3RhdGljIGludCBuYXRpdmVfaWRsZSh2b2lkKQotewotCXdoaWxlKDEpIHsKLQkJLyogY2hlY2sgQ1BVIHR5cGUgaGVyZSAqLwotCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJcG93ZXI0X2lkbGUoKTsKLQkJaWYgKG5lZWRfcmVzY2hlZCgpKQotCQkJc2NoZWR1bGUoKTsKLQotCQlpZiAoY3B1X2lzX29mZmxpbmUocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgJiYKLQkJICAgIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKLQkJCWNwdV9kaWUoKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KLQogdm9pZCBjcHVfaWRsZSh2b2lkKQogewotCWlkbGVfbG9vcCgpOworCUJVR19PTihOVUxMID09IHBwY19tZC5pZGxlX2xvb3ApOworCXBwY19tZC5pZGxlX2xvb3AoKTsKIH0KIAogaW50IHBvd2Vyc2F2ZV9uYXA7CkBAIC0zNDIsNDIgKzEyNiwzIEBACiB9CiBfX2luaXRjYWxsKHJlZ2lzdGVyX3Bvd2Vyc2F2ZV9uYXBfc3lzY3RsKTsKICNlbmRpZgotCi1pbnQgaWRsZV9zZXR1cCh2b2lkKQotewotCS8qCi0JICogTW92ZSB0aGF0IGp1bmsgdG8gZWFjaCBwbGF0Zm9ybSBzcGVjaWZpYyBmaWxlLCBldmVudHVhbGx5IGRlZmluZQotCSAqIGEgcFNlcmllc19pZGxlIGZvciBzaGFyZWQgcHJvY2Vzc29yIHN0dWZmCi0JICovCi0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JaWRsZV9sb29wID0gaVNlcmllc19pZGxlOwotCXJldHVybiAxOwotI2Vsc2UKLQlpZGxlX2xvb3AgPSBkZWZhdWx0X2lkbGU7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKLQlpZiAoc3lzdGVtY2ZnLT5wbGF0Zm9ybSAmIFBMQVRGT1JNX1BTRVJJRVMpIHsKLQkJaWYgKGN1cl9jcHVfc3BlYy0+ZmlybXdhcmVfZmVhdHVyZXMgJiBGV19GRUFUVVJFX1NQTFBBUikgewotCQkJaWYgKGdldF9wYWNhKCktPmxwcGFjYS5zaGFyZWRfcHJvYykgewotCQkJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIHNoYXJlZCBwcm9jZXNzb3IgaWRsZSBsb29wXG4iKTsKLQkJCQlpZGxlX2xvb3AgPSBzaGFyZWRfaWRsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgZGVkaWNhdGVkIGlkbGUgbG9vcFxuIik7Ci0JCQkJaWRsZV9sb29wID0gZGVkaWNhdGVkX2lkbGU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWZhdWx0IGlkbGUgbG9vcFxuIik7Ci0JCQlpZGxlX2xvb3AgPSBkZWZhdWx0X2lkbGU7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCi0jaWZuZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmIChzeXN0ZW1jZmctPnBsYXRmb3JtID09IFBMQVRGT1JNX1BPV0VSTUFDIHx8Ci0JICAgIHN5c3RlbWNmZy0+cGxhdGZvcm0gPT0gUExBVEZPUk1fTUFQTEUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgbmF0aXZlL05BUCBpZGxlIGxvb3BcbiIpOwotCQlpZGxlX2xvb3AgPSBuYXRpdmVfaWRsZTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCi0KLQlyZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvcHBjNjQva2VybmVsL2twcm9iZXMuYwppbmRleCAxZDJmZjZkLi5hM2Q1MTk1IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC00NDQsNyArNDQ0LDcgQEAKIAkucHJlX2hhbmRsZXIgPSB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIKIH07CiAKLWludCBfX2luaXQgYXJjaF9pbml0KHZvaWQpCitpbnQgX19pbml0IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpCiB7CiAJcmV0dXJuIHJlZ2lzdGVyX2twcm9iZSgmdHJhbXBvbGluZV9wKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3NldHVwLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9tYXBsZV9zZXR1cC5jCmluZGV4IGRhODkwMGIuLmJiNTViNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3NldHVwLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfc2V0dXAuYwpAQCAtMTc3LDYgKzE3Nyw4IEBACiAjaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKIAljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKICNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgbmF0aXZlL05BUCBpZGxlIGxvb3BcbiIpOwogfQogCiAvKiAKQEAgLTI5Nyw0ICsyOTksNSBAQAogICAgICAgIAkuZ2V0X3J0Y190aW1lCQk9IG1hcGxlX2dldF9ydGNfdGltZSwKICAgICAgIAkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJCT0gbWFwbGVfcHJvZ3Jlc3MsCisJLmlkbGVfbG9vcAkJPSBuYXRpdmVfaWRsZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYzY0L2tlcm5lbC9taXNjLlMKaW5kZXggZjNkZWEwYy4uNTlmNGY5OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvbWlzYy5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL21pc2MuUwpAQCAtMTEyNCw5ICsxMTI0LDExIEBACiAJLmxsb25nIC5jb21wYXRfc3lzX21xX2dldHNldGF0dHIKIAkubGxvbmcgLmNvbXBhdF9zeXNfa2V4ZWNfbG9hZAogCS5sbG9uZyAuc3lzMzJfYWRkX2tleQotCS5sbG9uZyAuc3lzMzJfcmVxdWVzdF9rZXkKKwkubGxvbmcgLnN5czMyX3JlcXVlc3Rfa2V5CS8qIDI3MCAqLwogCS5sbG9uZyAuY29tcGF0X3N5c19rZXljdGwKIAkubGxvbmcgLmNvbXBhdF9zeXNfd2FpdGlkCisJLmxsb25nIC5zeXMzMl9pb3ByaW9fc2V0CisJLmxsb25nIC5zeXMzMl9pb3ByaW9fZ2V0CiAKIAkuYmFsaWduIDgKIF9HTE9CQUwoc3lzX2NhbGxfdGFibGUpCkBAIC0xNDAzLDMgKzE0MDUsNSBAQAogCS5sbG9uZyAuc3lzX3JlcXVlc3Rfa2V5CQkvKiAyNzAgKi8KIAkubGxvbmcgLnN5c19rZXljdGwKIAkubGxvbmcgLnN5c193YWl0aWQKKwkubGxvbmcgLnN5c19pb3ByaW9fc2V0CisJLmxsb25nIC5zeXNfaW9wcmlvX2dldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9vZl9kZXZpY2UuYwppbmRleCA2NmJkNWFiNy4uYjgwZTgxOSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTMsNiArMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KIApAQCAtMTUsMjAgKzE2LDIwIEBACiAgKiBVc2VkIGJ5IGEgZHJpdmVyIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZfZGV2aWNlIHByZXNlbnQgaW4gdGhlCiAgKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuCiAgKi8KLWNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqIG9mX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoZXMsCitjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywKIAkJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZSAqZGV2KQogewogCWlmICghZGV2LT5ub2RlKQogCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAobWF0Y2hlcy0+bmFtZSB8fCBtYXRjaGVzLT50eXBlIHx8IG1hdGNoZXMtPmNvbXBhdGlibGUpIHsKKwl3aGlsZSAobWF0Y2hlcy0+bmFtZVswXSB8fCBtYXRjaGVzLT50eXBlWzBdIHx8IG1hdGNoZXMtPmNvbXBhdGlibGVbMF0pIHsKIAkJaW50IG1hdGNoID0gMTsKLQkJaWYgKG1hdGNoZXMtPm5hbWUgJiYgbWF0Y2hlcy0+bmFtZSAhPSBPRl9BTllfTUFUQ0gpCisJCWlmIChtYXRjaGVzLT5uYW1lWzBdKQogCQkJbWF0Y2ggJj0gZGV2LT5ub2RlLT5uYW1lCiAJCQkJJiYgIXN0cmNtcChtYXRjaGVzLT5uYW1lLCBkZXYtPm5vZGUtPm5hbWUpOwotCQlpZiAobWF0Y2hlcy0+dHlwZSAmJiBtYXRjaGVzLT50eXBlICE9IE9GX0FOWV9NQVRDSCkKKwkJaWYgKG1hdGNoZXMtPnR5cGVbMF0pCiAJCQltYXRjaCAmPSBkZXYtPm5vZGUtPnR5cGUKIAkJCQkmJiAhc3RyY21wKG1hdGNoZXMtPnR5cGUsIGRldi0+bm9kZS0+dHlwZSk7Ci0JCWlmIChtYXRjaGVzLT5jb21wYXRpYmxlICYmIG1hdGNoZXMtPmNvbXBhdGlibGUgIT0gT0ZfQU5ZX01BVENIKQorCQlpZiAobWF0Y2hlcy0+Y29tcGF0aWJsZVswXSkKIAkJCW1hdGNoICY9IGRldmljZV9pc19jb21wYXRpYmxlKGRldi0+bm9kZSwKIAkJCQltYXRjaGVzLT5jb21wYXRpYmxlKTsKIAkJaWYgKG1hdGNoKQpAQCAtNDIsNyArNDMsNyBAQAogewogCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogb2ZfZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRydik7Ci0JY29uc3Qgc3RydWN0IG9mX21hdGNoICogbWF0Y2hlcyA9IG9mX2Rydi0+bWF0Y2hfdGFibGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG1hdGNoZXMgPSBvZl9kcnYtPm1hdGNoX3RhYmxlOwogCiAJaWYgKCFtYXRjaGVzKQogCQlyZXR1cm4gMDsKQEAgLTc1LDcgKzc2LDcgQEAKIAlpbnQgZXJyb3IgPSAtRU5PREVWOwogCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydjsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXY7Ci0JY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAogCWRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7CiAJb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX2xwYXIuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCmluZGV4IDY1MzQ4MTIuLjc0ZGQxNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCkBAIC0yNzcsMzEgKzI3NywyMCBAQAogCiBsb25nIHBTZXJpZXNfbHBhcl9ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhLCB1bnNpZ25lZCBsb25nIHBycG4sCi0JCQkgICAgICBpbnQgc2Vjb25kYXJ5LCB1bnNpZ25lZCBsb25nIGhwdGVmbGFncywKLQkJCSAgICAgIGludCBib2x0ZWQsIGludCBsYXJnZSkKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCB1bnNpZ25lZCBsb25nIHJmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGFycG4gPSBwaHlzUnBuX3RvX2Fic1JwbihwcnBuKTsKIAl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIHNsb3Q7Ci0JSFBURSBsaHB0ZTsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOwogCXVuc2lnbmVkIGxvbmcgZHVtbXkwLCBkdW1teTE7CiAKLQkvKiBGaWxsIGluIHRoZSBsb2NhbCBIUFRFIHdpdGggYWJzb2x1dGUgcnBuLCBhdnBuIGFuZCBmbGFncyAqLwotCWxocHRlLmR3MS5kd29yZDEgICAgICA9IDA7Ci0JbGhwdGUuZHcxLmR3MS5ycG4gICAgID0gYXJwbjsKLQlsaHB0ZS5kdzEuZmxhZ3MuZmxhZ3MgPSBocHRlZmxhZ3M7CisJaHB0ZV92ID0gKCh2YSA+PiAyMykgPDwgSFBURV9WX0FWUE5fU0hJRlQpIHwgdmZsYWdzIHwgSFBURV9WX1ZBTElEOworCWlmICh2ZmxhZ3MgJiBIUFRFX1ZfTEFSR0UpCisJCWhwdGVfdiAmPSB+KDFVTCA8PCBIUFRFX1ZfQVZQTl9TSElGVCk7CiAKLQlsaHB0ZS5kdzAuZHdvcmQwICAgICAgPSAwOwotCWxocHRlLmR3MC5kdzAuYXZwbiAgICA9IHZhID4+IDIzOwotCWxocHRlLmR3MC5kdzAuaCAgICAgICA9IHNlY29uZGFyeTsKLQlsaHB0ZS5kdzAuZHcwLmJvbHRlZCAgPSBib2x0ZWQ7Ci0JbGhwdGUuZHcwLmR3MC52ICAgICAgID0gMTsKLQotCWlmIChsYXJnZSkgewotCQlsaHB0ZS5kdzAuZHcwLmwgPSAxOwotCQlsaHB0ZS5kdzAuZHcwLmF2cG4gJj0gfjB4MVVMOwotCX0KKwlocHRlX3IgPSAoYXJwbiA8PCBIUFRFX1JfUlBOX1NISUZUKSB8IHJmbGFnczsKIAogCS8qIE5vdyBmaWxsIGluIHRoZSBhY3R1YWwgSFBURSAqLwogCS8qIFNldCBDRUMgY29va2llIHRvIDAgICAgICAgICAqLwpAQCAtMzEyLDExICszMDEsMTEgQEAKIAlmbGFncyA9IDA7CiAKIAkvKiBYWFggd2h5IGlzIHRoaXMgaGVyZT8gLSBBbnRvbiAqLwotCWlmIChocHRlZmxhZ3MgJiAoX1BBR0VfR1VBUkRFRHxfUEFHRV9OT19DQUNIRSkpCi0JCWxocHRlLmR3MS5mbGFncy5mbGFncyAmPSB+X1BBR0VfQ09IRVJFTlQ7CisJaWYgKHJmbGFncyAmIChfUEFHRV9HVUFSREVEfF9QQUdFX05PX0NBQ0hFKSkKKwkJaHB0ZV9yICY9IH5fUEFHRV9DT0hFUkVOVDsKIAotCWxwYXJfcmMgPSBwbHBhcl9oY2FsbChIX0VOVEVSLCBmbGFncywgaHB0ZV9ncm91cCwgbGhwdGUuZHcwLmR3b3JkMCwKLQkJCSAgICAgIGxocHRlLmR3MS5kd29yZDEsICZzbG90LCAmZHVtbXkwLCAmZHVtbXkxKTsKKwlscGFyX3JjID0gcGxwYXJfaGNhbGwoSF9FTlRFUiwgZmxhZ3MsIGhwdGVfZ3JvdXAsIGhwdGVfdiwKKwkJCSAgICAgIGhwdGVfciwgJnNsb3QsICZkdW1teTAsICZkdW1teTEpOwogCiAJaWYgKHVubGlrZWx5KGxwYXJfcmMgPT0gSF9QVEVHX0Z1bGwpKQogCQlyZXR1cm4gLTE7CkBAIC0zMzIsNyArMzIxLDcgQEAKIAkvKiBCZWNhdXNlIG9mIGlTZXJpZXMsIHdlIGhhdmUgdG8gcGFzcyBkb3duIHRoZSBzZWNvbmRhcnkKIAkgKiBidWNrZXQgYml0IGhlcmUgYXMgd2VsbAogCSAqLwotCXJldHVybiAoc2xvdCAmIDcpIHwgKHNlY29uZGFyeSA8PCAzKTsKKwlyZXR1cm4gKHNsb3QgJiA3KSB8ICghISh2ZmxhZ3MgJiBIUFRFX1ZfU0VDT05EQVJZKSA8PCAzKTsKIH0KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhwU2VyaWVzX2xwYXJfdGxiaWVfbG9jayk7CkBAIC00MjcsMjIgKzQxNiwxOCBAQAogCXVuc2lnbmVkIGxvbmcgaGFzaDsKIAl1bnNpZ25lZCBsb25nIGksIGo7CiAJbG9uZyBzbG90OwotCXVuaW9uIHsKLQkJdW5zaWduZWQgbG9uZyBkd29yZDA7Ci0JCUhwdGVfZHdvcmQwIGR3MDsKLQl9IGhwdGVfZHcwOwotCUhwdGVfZHdvcmQwIGR3MDsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAogCWhhc2ggPSBocHRfaGFzaCh2cG4sIDApOwogCiAJZm9yIChqID0gMDsgaiA8IDI7IGorKykgewogCQlzbG90ID0gKGhhc2ggJiBodGFiX2hhc2hfbWFzaykgKiBIUFRFU19QRVJfR1JPVVA7CiAJCWZvciAoaSA9IDA7IGkgPCBIUFRFU19QRVJfR1JPVVA7IGkrKykgewotCQkJaHB0ZV9kdzAuZHdvcmQwID0gcFNlcmllc19scGFyX2hwdGVfZ2V0d29yZDAoc2xvdCk7Ci0JCQlkdzAgPSBocHRlX2R3MC5kdzA7CisJCQlocHRlX3YgPSBwU2VyaWVzX2xwYXJfaHB0ZV9nZXR3b3JkMChzbG90KTsKIAotCQkJaWYgKChkdzAuYXZwbiA9PSAodnBuID4+IDExKSkgJiYgZHcwLnYgJiYKLQkJCSAgICAoZHcwLmggPT0gaikpIHsKKwkJCWlmICgoSFBURV9WX0FWUE5fVkFMKGhwdGVfdikgPT0gKHZwbiA+PiAxMSkpCisJCQkgICAgJiYgKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkKKwkJCSAgICAmJiAoISEoaHB0ZV92ICYgSFBURV9WX1NFQ09OREFSWSkgPT0gaikpIHsKIAkJCQkvKiBIUFRFIG1hdGNoZXMgKi8KIAkJCQlpZiAoaikKIAkJCQkJc2xvdCA9IC1zbG90OwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zZXR1cC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zZXR1cC5jCmluZGV4IDQ0ZDlhZjcuLjViZWM5NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX3NldHVwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtODIsNiArODMsOSBAQAogZXh0ZXJuIHZvaWQgcFNlcmllc19zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBpbnQgcFNlcmllc19tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKK3N0YXRpYyBpbnQgcHNlcmllc19zaGFyZWRfaWRsZSh2b2lkKTsKK3N0YXRpYyBpbnQgcHNlcmllc19kZWRpY2F0ZWRfaWRsZSh2b2lkKTsKKwogc3RhdGljIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqIGNocnBfaW50X2Fja19zcGVjaWFsOwogc3RydWN0IG1waWMgKnBTZXJpZXNfbXBpYzsKIApAQCAtMjI5LDYgKzIzMywyMCBAQAogCiAJaWYgKGN1cl9jcHVfc3BlYy0+ZmlybXdhcmVfZmVhdHVyZXMgJiBGV19GRUFUVVJFX1NQTFBBUikKIAkJdnBhX2luaXQoYm9vdF9jcHVpZCk7CisKKwkvKiBDaG9vc2UgYW4gaWRsZSBsb29wICovCisJaWYgKGN1cl9jcHVfc3BlYy0+ZmlybXdhcmVfZmVhdHVyZXMgJiBGV19GRUFUVVJFX1NQTFBBUikgeworCQlpZiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBzaGFyZWQgcHJvY2Vzc29yIGlkbGUgbG9vcFxuIik7CisJCQlwcGNfbWQuaWRsZV9sb29wID0gcHNlcmllc19zaGFyZWRfaWRsZTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIGRlZGljYXRlZCBpZGxlIGxvb3BcbiIpOworCQkJcHBjX21kLmlkbGVfbG9vcCA9IHBzZXJpZXNfZGVkaWNhdGVkX2lkbGU7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWZhdWx0IGlkbGUgbG9vcFxuIik7CisJCXBwY19tZC5pZGxlX2xvb3AgPSBkZWZhdWx0X2lkbGU7CisJfQogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwU2VyaWVzX2luaXRfcGFuZWwodm9pZCkKQEAgLTQxOCw2ICs0MzYsMTQ0IEBACiAJcmV0dXJuIDE7CiB9CiAKK0RFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBzbXRfc25vb3plX2RlbGF5KTsKKworc3RhdGljIGlubGluZSB2b2lkIGRlZGljYXRlZF9pZGxlX3NsZWVwKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IHBhY2Ffc3RydWN0ICpwcGFjYSA9ICZwYWNhW2NwdSBeIDFdOworCisJLyogT25seSBzbGVlcCBpZiB0aGUgb3RoZXIgdGhyZWFkIGlzIG5vdCBpZGxlICovCisJaWYgKCEocHBhY2EtPmxwcGFjYS5pZGxlKSkgeworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJCS8qCisJCSAqIFdlIGFyZSBhYm91dCB0byBzbGVlcCB0aGUgdGhyZWFkIGFuZCBzbyB3b250IGJlIHBvbGxpbmcgYW55CisJCSAqIG1vcmUuCisJCSAqLworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCisJCS8qCisJCSAqIFNNVCBkeW5hbWljIG1vZGUuIENlZGUgd2lsbCByZXN1bHQgaW4gdGhpcyB0aHJlYWQgZ29pbmcKKwkJICogZG9ybWFudCwgaWYgdGhlIHBhcnRuZXIgdGhyZWFkIGlzIHN0aWxsIGRvaW5nIHdvcmsuICBUaHJlYWQKKwkJICogd2FrZXMgdXAgaWYgcGFydG5lciBnb2VzIGlkbGUsIGFuIGludGVycnVwdCBpcyBwcmVzZW50ZWQsIG9yCisJCSAqIGEgcHJvZCBvY2N1cnMuICBSZXR1cm5pbmcgZnJvbSB0aGUgY2VkZSBlbmFibGVzIGV4dGVybmFsCisJCSAqIGludGVycnVwdHMuCisJCSAqLworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJY2VkZV9wcm9jZXNzb3IoKTsKKwkJZWxzZQorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEdpdmUgdGhlIEhWIGFuIG9wcG9ydHVuaXR5IGF0IHRoZSBwcm9jZXNzb3IsIHNpbmNlIHdlIGFyZQorCQkgKiBub3QgZG9pbmcgYW55IHdvcmsuCisJCSAqLworCQlwb2xsX3BlbmRpbmcoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHNlcmllc19kZWRpY2F0ZWRfaWRsZSh2b2lkKQoreworCWxvbmcgb2xkdmFsOworCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBzdGFydF9zbm9vemU7CisJdW5zaWduZWQgbG9uZyAqc210X3Nub296ZV9kZWxheSA9ICZfX2dldF9jcHVfdmFyKHNtdF9zbm9vemVfZGVsYXkpOworCisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogSW5kaWNhdGUgdG8gdGhlIEhWIHRoYXQgd2UgYXJlIGlkbGUuIE5vdyB3b3VsZCBiZQorCQkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCisJCSAqLworCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAxOworCisJCW9sZHZhbCA9IHRlc3RfYW5kX2NsZWFyX3RocmVhZF9mbGFnKFRJRl9ORUVEX1JFU0NIRUQpOworCQlpZiAoIW9sZHZhbCkgeworCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisKKwkJCXN0YXJ0X3Nub296ZSA9IF9fZ2V0X3RiKCkgKworCQkJCSpzbXRfc25vb3plX2RlbGF5ICogdGJfdGlja3NfcGVyX3VzZWM7CisKKwkJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKKwkJCQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKKworCQkJCS8qCisJCQkJICogR28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5IGFuZCBwb3NzaWJseQorCQkJCSAqIGxvdyBwb3dlciBtb2RlLgorCQkJCSAqLworCQkJCUhNVF9sb3coKTsKKwkJCQlITVRfdmVyeV9sb3coKTsKKworCQkJCWlmICgqc210X3Nub296ZV9kZWxheSAhPSAwICYmCisJCQkJICAgIF9fZ2V0X3RiKCkgPiBzdGFydF9zbm9vemUpIHsKKwkJCQkJSE1UX21lZGl1bSgpOworCQkJCQlkZWRpY2F0ZWRfaWRsZV9zbGVlcChjcHUpOworCQkJCX0KKworCQkJfQorCisJCQlITVRfbWVkaXVtKCk7CisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQl9IGVsc2UgeworCQkJc2V0X25lZWRfcmVzY2hlZCgpOworCQl9CisKKwkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMDsKKwkJcHBjNjRfcnVubGF0Y2hfb24oKTsKKworCQlzY2hlZHVsZSgpOworCisJCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKKwkJCWNwdV9kaWUoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHNlcmllc19zaGFyZWRfaWRsZSh2b2lkKQoreworCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCisJCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KKwkJICovCisJCWxwYWNhLT5scHBhY2EuaWRsZSA9IDE7CisKKwkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkgeworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCXBwYzY0X3J1bmxhdGNoX29mZigpOworCisJCQkvKgorCQkJICogWWllbGQgdGhlIHByb2Nlc3NvciB0byB0aGUgaHlwZXJ2aXNvci4gIFdlIHJldHVybiBpZgorCQkJICogYW4gZXh0ZXJuYWwgaW50ZXJydXB0IG9jY3VycyAod2hpY2ggYXJlIGRyaXZlbiBwcmlvcgorCQkJICogdG8gcmV0dXJuaW5nIGhlcmUpIG9yIGlmIGEgcHJvZCBvY2N1cnMgZnJvbSBhbm90aGVyCisJCQkgKiBwcm9jZXNzb3IuIFdoZW4gcmV0dXJuaW5nIGhlcmUsIGV4dGVybmFsIGludGVycnVwdHMKKwkJCSAqIGFyZSBlbmFibGVkLgorCQkJICoKKwkJCSAqIENoZWNrIG5lZWRfcmVzY2hlZCgpIGFnYWluIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorCQkJICogdG8gYXZvaWQgYSByYWNlLgorCQkJICovCisJCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJCWNlZGVfcHJvY2Vzc29yKCk7CisJCQllbHNlCisJCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJCQlITVRfbWVkaXVtKCk7CisJCX0KKworCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAwOworCQlwcGM2NF9ydW5sYXRjaF9vbigpOworCisJCXNjaGVkdWxlKCk7CisKKwkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKQorCQkJY3B1X2RpZSgpOworCX0KKworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgbWFjaGRlcF9jYWxscyBfX2luaXRkYXRhIHBTZXJpZXNfbWQgPSB7CiAJLnByb2JlCQkJPSBwU2VyaWVzX3Byb2JlLAogCS5zZXR1cF9hcmNoCQk9IHBTZXJpZXNfc2V0dXBfYXJjaCwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfc2V0dXAuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfc2V0dXAuYwppbmRleCA2Y2YwM2QzLi4zMDEzY2RiIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3NldHVwLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19zZXR1cC5jCkBAIC0xODYsNiArMTg2LDggQEAKICNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQogCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOwogI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJVc2luZyBuYXRpdmUvTkFQIGlkbGUgbG9vcFxuIik7CiB9CiAKICNpZmRlZiBDT05GSUdfU0NTSQpAQCAtNTA3LDUgKzUwOSw2IEBACiAgICAgICAJLmNhbGlicmF0ZV9kZWNyCQk9IHBtYWNfY2FsaWJyYXRlX2RlY3IsCiAJLmZlYXR1cmVfY2FsbAkJPSBwbWFjX2RvX2ZlYXR1cmVfY2FsbCwKIAkucHJvZ3Jlc3MJCT0gcG1hY19wcm9ncmVzcywKLQkuY2hlY2tfbGVnYWN5X2lvcG9ydAk9IHBtYWNfY2hlY2tfbGVnYWN5X2lvcG9ydAorCS5jaGVja19sZWdhY3lfaW9wb3J0CT0gcG1hY19jaGVja19sZWdhY3lfaW9wb3J0LAorCS5pZGxlX2xvb3AJCT0gbmF0aXZlX2lkbGUsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcHBjNjQva2VybmVsL3NldHVwLmMKaW5kZXggZDVlNDg2Ni4uZDFiMzNmMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jCkBAIC05Niw3ICs5Niw2IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBrbGltaXQ7CiAKIGV4dGVybiB2b2lkIG1tX2luaXRfcHBjNjQodm9pZCk7Ci1leHRlcm4gaW50ICBpZGxlX3NldHVwKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3RhYl9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgc3RhYik7CiBleHRlcm4gdm9pZCBodGFiX2luaXRpYWxpemUodm9pZCk7CiBleHRlcm4gdm9pZCBlYXJseV9pbml0X2RldnRyZWUodm9pZCAqZmxhdF9kdCk7CkBAIC0xMDgxLDggKzEwODAsMTEgQEAKIAogCXBwY19tZC5zZXR1cF9hcmNoKCk7CiAKLQkvKiBTZWxlY3QgdGhlIGNvcnJlY3QgaWRsZSBsb29wIGZvciB0aGUgcGxhdGZvcm0uICovCi0JaWRsZV9zZXR1cCgpOworCS8qIFVzZSB0aGUgZGVmYXVsdCBpZGxlIGxvb3AgaWYgdGhlIHBsYXRmb3JtIGhhc24ndCBwcm92aWRlZCBvbmUuICovCisJaWYgKE5VTEwgPT0gcHBjX21kLmlkbGVfbG9vcCkgeworCQlwcGNfbWQuaWRsZV9sb29wID0gZGVmYXVsdF9pZGxlOworCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWZhdWx0IGlkbGUgbG9vcFxuIik7CisJfQogCiAJcGFnaW5nX2luaXQoKTsKIAlwcGM2NF9ib290X21zZygweDE1LCAiU2V0dXAgRG9uZSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzX3BwYzMyLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9zeXNfcHBjMzIuYwppbmRleCAxMTg0MzZlLi4yMDY2MTkwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9zeXNfcHBjMzIuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9zeXNfcHBjMzIuYwpAQCAtMzAsNDcgKzMwLDI2IEBACiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXNnLmg+CiAjaW5jbHVkZSA8bGludXgvc2htLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC94ZHIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogCi0jaW5jbHVkZSA8bmV0L3NjbS5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2lwYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxhc20vcHBjZGVidWcuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW1jZmcuaD4KQEAgLTM1MCw4ICszMjksNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotLyogVGhlc2UgYXJlIGhlcmUganVzdCBpbiBjYXNlIHNvbWUgb2xkIHNwYXJjMzIgYmluYXJ5IGNhbGxzIGl0LiAqLwogYXNtbGlua2FnZSBsb25nIHN5czMyX3BhdXNlKHZvaWQpCiB7CiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CkBAIC0zNjAsOCArMzM3LDYgQEAKIAlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCi0KLQogc3RhdGljIGlubGluZSBsb25nIGdldF90czMyKHN0cnVjdCB0aW1lc3BlYyAqbywgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqaSkKIHsKIAlsb25nIHVzZWM7CkBAIC04NDcsMTYgKzgyMiw2IEBACiB9CiAKIAotLyogTm90ZTogaXQgaXMgbmVjZXNzYXJ5IHRvIHRyZWF0IHdoaWNoIGFuZCB3aG8gYXMgdW5zaWduZWQgaW50cywKLSAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY2FzdCB0byBhIHNpZ25lZCBpbnQgdG8gaW5zdXJlIHRoYXQgdGhlIAotICogcHJvcGVyIGNvbnZlcnNpb24gKHNpZ24gZXh0ZW5zaW9uKSBiZXR3ZWVuIHRoZSByZWdpc3RlciByZXByZXNlbnRhdGlvbiBvZiBhIHNpZ25lZCBpbnQgKG1zciBpbiAzMi1iaXQgbW9kZSkKLSAqIGFuZCB0aGUgcmVnaXN0ZXIgcmVwcmVzZW50YXRpb24gb2YgYSBzaWduZWQgaW50IChtc3IgaW4gNjQtYml0IG1vZGUpIGlzIHBlcmZvcm1lZC4KLSAqLwotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldHByaW9yaXR5KHUzMiB3aGljaCwgdTMyIHdobykKLXsKLQlyZXR1cm4gc3lzX2dldHByaW9yaXR5KChpbnQpd2hpY2gsIChpbnQpd2hvKTsKLX0KLQogCiAvKiBOb3RlOiBpdCBpcyBuZWNlc3NhcnkgdG8gdHJlYXQgcGlkIGFzIGFuIHVuc2lnbmVkIGludCwKICAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY2FzdCB0byBhIHNpZ25lZCBpbnQgdG8gaW5zdXJlIHRoYXQgdGhlIApAQCAtMTA0OCw2ICsxMDEzLDExIEBACiAJcmV0dXJuIHN5c19zZXRwZ2lkKChpbnQpcGlkLCAoaW50KXBnaWQpOwogfQogCitsb25nIHN5czMyX2dldHByaW9yaXR5KHUzMiB3aGljaCwgdTMyIHdobykKK3sKKwkvKiBzaWduIGV4dGVuZCB3aGljaCBhbmQgd2hvICovCisJcmV0dXJuIHN5c19nZXRwcmlvcml0eSgoaW50KXdoaWNoLCAoaW50KXdobyk7Cit9CiAKIGxvbmcgc3lzMzJfc2V0cHJpb3JpdHkodTMyIHdoaWNoLCB1MzIgd2hvLCB1MzIgbmljZXZhbCkKIHsKQEAgLTEwNTUsNiArMTAyNSwxOCBAQAogCXJldHVybiBzeXNfc2V0cHJpb3JpdHkoKGludCl3aGljaCwgKGludCl3aG8sIChpbnQpbmljZXZhbCk7CiB9CiAKK2xvbmcgc3lzMzJfaW9wcmlvX2dldCh1MzIgd2hpY2gsIHUzMiB3aG8pCit7CisJLyogc2lnbiBleHRlbmQgd2hpY2ggYW5kIHdobyAqLworCXJldHVybiBzeXNfaW9wcmlvX2dldCgoaW50KXdoaWNoLCAoaW50KXdobyk7Cit9CisKK2xvbmcgc3lzMzJfaW9wcmlvX3NldCh1MzIgd2hpY2gsIHUzMiB3aG8sIHUzMiBpb3ByaW8pCit7CisJLyogc2lnbiBleHRlbmQgd2hpY2gsIHdobyBhbmQgaW9wcmlvICovCisJcmV0dXJuIHN5c19pb3ByaW9fc2V0KChpbnQpd2hpY2gsIChpbnQpd2hvLCAoaW50KWlvcHJpbyk7Cit9CisKIC8qIE5vdGU6IGl0IGlzIG5lY2Vzc2FyeSB0byB0cmVhdCBuZXdtYXNrIGFzIGFuIHVuc2lnbmVkIGludCwKICAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY2FzdCB0byBhIHNpZ25lZCBpbnQgdG8gaW5zdXJlIHRoYXQgdGhlIAogICogcHJvcGVyIGNvbnZlcnNpb24gKHNpZ24gZXh0ZW5zaW9uKSBiZXR3ZWVuIHRoZSByZWdpc3RlciByZXByZXNlbnRhdGlvbiBvZiBhIHNpZ25lZCBpbnQgKG1zciBpbiAzMi1iaXQgbW9kZSkKQEAgLTEyNzMsOCArMTI1NSw2IEBACiAJCQkgICAgICh1NjQpbGVuX2hpZ2ggPDwgMzIgfCBsZW5fbG93LCBhZHZpY2UpOwogfQogCi1leHRlcm4gYXNtbGlua2FnZSBsb25nIHN5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90LCBzaWdldmVudF90IF9fdXNlciAqLCB0aW1lcl90IF9fdXNlciAqKTsKLQogbG9uZyBwcGMzMl90aW1lcl9jcmVhdGUoY2xvY2tpZF90IGNsb2NrLAogCQkJc3RydWN0IGNvbXBhdF9zaWdldmVudCBfX3VzZXIgKmV2MzIsCiAJCQl0aW1lcl90IF9fdXNlciAqdGltZXJfaWQpCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9zeXNmcy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvc3lzZnMuYwppbmRleCAyZjcwNGEyLi4wMmI4YWM0IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3N5c2ZzLmMKQEAgLTExMiw3ICsxMTIsNiBAQAogCXVuc2lnbmVkIGxvbmcgaGlkMDsKICNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKIAl1bnNpZ25lZCBsb25nIHNldCwgcmVzZXQ7Ci0JaW50IHJldDsKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KIAogCS8qIE9ubHkgbmVlZCB0byBlbmFibGUgdGhlbSBvbmNlICovCkBAIC0xNDUsMTEgKzE0NCw3IEBACiAJY2FzZSBQTEFURk9STV9QU0VSSUVTX0xQQVI6CiAJCXNldCA9IDFVTCA8PCA2MzsKIAkJcmVzZXQgPSAwOwotCQlyZXQgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9QRVJGTU9OLCBzZXQsIHJlc2V0KTsKLQkJaWYgKHJldCkKLQkJCXByaW50ayhLRVJOX0VSUiAiSF9QRVJGTU9OIGNhbGwgb24gY3B1ICV1ICIKLQkJCSAgICAgICAicmV0dXJuZWQgJWRcbiIsCi0JCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCByZXQpOworCQlwbHBhcl9oY2FsbF9ub3JldHMoSF9QRVJGTU9OLCBzZXQsIHJlc2V0KTsKIAkJYnJlYWs7CiAjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCiAKQEAgLTE2MSwxMyArMTU2LDYgQEAKIAkvKiBpbnN0cnVjdCBoeXBlcnZpc29yIHRvIG1haW50YWluIFBNQ3MgKi8KIAlpZiAoY3VyX2NwdV9zcGVjLT5maXJtd2FyZV9mZWF0dXJlcyAmIEZXX0ZFQVRVUkVfU1BMUEFSKQogCQlnZXRfcGFjYSgpLT5scHBhY2EucG1jcmVnc19pbl91c2UgPSAxOwotCi0JLyoKLQkgKiBPbiBTTVQgbWFjaGluZXMgd2UgaGF2ZSB0byBzZXQgdGhlIHJ1biBsYXRjaCBpbiB0aGUgY3RybCByZWdpc3RlcgotCSAqIGluIG9yZGVyIHRvIG1ha2UgUE1DNiBzcGluLgotCSAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQotCQlwcGM2NF9ydW5sYXRjaF9vbigpOwogI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvdmRzbzMyLmxkcy5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL3Zkc28zMi5sZHMuUwppbmRleCAxMTI5MGM5Li42Zjg3YTkxIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvdmRzbzMyLmxkcy5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi92ZHNvMzIubGRzLlMKQEAgLTQwLDkgKzQwLDkgQEAKICAgLmdjY19leGNlcHRfdGFibGUJOiB7ICooLmdjY19leGNlcHRfdGFibGUpIH0KICAgLmZpeHVwCQk6IHsgKiguZml4dXApIH0KIAotICAuZ290IEFMSUdOKDQpCQk6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0KICAgLmR5bmFtaWMJCTogeyAqKC5keW5hbWljKSB9CQk6dGV4dAk6ZHluYW1pYworICAuZ290IDogeyAqKC5nb3QpIH0KKyAgLnBsdCA6IHsgKigucGx0KSB9CiAKICAgX2VuZCA9IC47CiAgIF9fZW5kID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvbW0vaGFzaF9sb3cuUyBiL2FyY2gvcHBjNjQvbW0vaGFzaF9sb3cuUwppbmRleCBjMjNkNDY5Li5mYmZmMjQ4IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL2hhc2hfbG93LlMKKysrIGIvYXJjaC9wcGM2NC9tbS9oYXNoX2xvdy5TCkBAIC0xNzAsOSArMTcwLDcgQEAKIAkvKiBDYWxsIHBwY19tZC5ocHRlX2luc2VydCAqLwogCWxkCXI3LFNUS19QQVJNKHI0KShyMSkJLyogUmV0cmVpdmUgbmV3IHBwIGJpdHMgKi8KIAltcglyNCxyMjkJCQkvKiBSZXRyZWl2ZSB2YSAqLwotCWxpCXI2LDAJCQkvKiBwcmltYXJ5IHNsb3QgKi8KLQlsaQlyOCwwCQkJLyogbm90IGJvbHRlZCBhbmQgbm90IGxhcmdlICovCi0JbGkJcjksMAorCWxpCXI2LDAJCQkvKiBubyB2ZmxhZ3MgKi8KIF9HTE9CQUwoaHRhYl9jYWxsX2hwdGVfaW5zZXJ0MSkKIAlibAkuCQkJLyogV2lsbCBiZSBwYXRjaGVkIGJ5IGh0YWJfZmluaXNoX2luaXQoKSAqLwogCWNtcGRpCTAscjMsMApAQCAtMTkyLDkgKzE5MCw3IEBACiAJLyogQ2FsbCBwcGNfbWQuaHB0ZV9pbnNlcnQgKi8KIAlsZAlyNyxTVEtfUEFSTShyNCkocjEpCS8qIFJldHJlaXZlIG5ldyBwcCBiaXRzICovCiAJbXIJcjQscjI5CQkJLyogUmV0cmVpdmUgdmEgKi8KLQlsaQlyNiwxCQkJLyogc2Vjb25kYXJ5IHNsb3QgKi8KLQlsaQlyOCwwCQkJLyogbm90IGJvbHRlZCBhbmQgbm90IGxhcmdlICovCi0JbGkJcjksMAorCWxpCXI2LEhQVEVfVl9TRUNPTkRBUllAbAkvKiBzZWNvbmRhcnkgc2xvdCAqLwogX0dMT0JBTChodGFiX2NhbGxfaHB0ZV9pbnNlcnQyKQogCWJsCS4JCQkvKiBXaWxsIGJlIHBhdGNoZWQgYnkgaHRhYl9maW5pc2hfaW5pdCgpICovCiAJY21wZGkJMCxyMywwCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L21tL2hhc2hfbmF0aXZlLmMgYi9hcmNoL3BwYzY0L21tL2hhc2hfbmF0aXZlLmMKaW5kZXggNGZlYzA1OC4uYTZhYmQzYSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9tbS9oYXNoX25hdGl2ZS5jCisrKyBiL2FyY2gvcHBjNjQvbW0vaGFzaF9uYXRpdmUuYwpAQCAtMjcsOSArMjcsOSBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5hdGl2ZV90bGJpZV9sb2NrKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9sb2NrX2hwdGUoSFBURSAqaHB0ZXApCitzdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX2xvY2tfaHB0ZShocHRlX3QgKmhwdGVwKQogewotCXVuc2lnbmVkIGxvbmcgKndvcmQgPSAmaHB0ZXAtPmR3MC5kd29yZDA7CisJdW5zaWduZWQgbG9uZyAqd29yZCA9ICZocHRlcC0+djsKIAogCXdoaWxlICgxKSB7CiAJCWlmICghdGVzdF9hbmRfc2V0X2JpdChIUFRFX0xPQ0tfQklULCB3b3JkKSkKQEAgLTM5LDMyICszOSwyOCBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV91bmxvY2tfaHB0ZShIUFRFICpocHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZV90ICpocHRlcCkKIHsKLQl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT5kdzAuZHdvcmQwOworCXVuc2lnbmVkIGxvbmcgKndvcmQgPSAmaHB0ZXAtPnY7CiAKIAlhc20gdm9sYXRpbGUoImx3c3luYyI6OjoibWVtb3J5Iik7CiAJY2xlYXJfYml0KEhQVEVfTE9DS19CSVQsIHdvcmQpOwogfQogCiBsb25nIG5hdGl2ZV9ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsIHVuc2lnbmVkIGxvbmcgdmEsCi0JCQl1bnNpZ25lZCBsb25nIHBycG4sIGludCBzZWNvbmRhcnksCi0JCQl1bnNpZ25lZCBsb25nIGhwdGVmbGFncywgaW50IGJvbHRlZCwgaW50IGxhcmdlKQorCQkJdW5zaWduZWQgbG9uZyBwcnBuLCB1bnNpZ25lZCBsb25nIHZmbGFncywKKwkJCXVuc2lnbmVkIGxvbmcgcmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgYXJwbiA9IHBoeXNScG5fdG9fYWJzUnBuKHBycG4pOwotCUhQVEUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgaHB0ZV9ncm91cDsKLQlIcHRlX2R3b3JkMCBkdzA7Ci0JSFBURSBsaHB0ZTsKKwlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgaHB0ZV9ncm91cDsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEhQVEVTX1BFUl9HUk9VUDsgaSsrKSB7Ci0JCWR3MCA9IGhwdGVwLT5kdzAuZHcwOwotCi0JCWlmICghZHcwLnYpIHsKKwkJaWYgKCEgKGhwdGVwLT52ICYgSFBURV9WX1ZBTElEKSkgewogCQkJLyogcmV0cnkgd2l0aCBsb2NrIGhlbGQgKi8KIAkJCW5hdGl2ZV9sb2NrX2hwdGUoaHB0ZXApOwotCQkJZHcwID0gaHB0ZXAtPmR3MC5kdzA7Ci0JCQlpZiAoIWR3MC52KQorCQkJaWYgKCEgKGhwdGVwLT52ICYgSFBURV9WX1ZBTElEKSkKIAkJCQlicmVhazsKIAkJCW5hdGl2ZV91bmxvY2tfaHB0ZShocHRlcCk7CiAJCX0KQEAgLTc1LDU2ICs3MSw0NSBAQAogCWlmIChpID09IEhQVEVTX1BFUl9HUk9VUCkKIAkJcmV0dXJuIC0xOwogCi0JbGhwdGUuZHcxLmR3b3JkMSAgICAgID0gMDsKLQlsaHB0ZS5kdzEuZHcxLnJwbiAgICAgPSBhcnBuOwotCWxocHRlLmR3MS5mbGFncy5mbGFncyA9IGhwdGVmbGFnczsKKwlocHRlX3YgPSAodmEgPj4gMjMpIDw8IEhQVEVfVl9BVlBOX1NISUZUIHwgdmZsYWdzIHwgSFBURV9WX1ZBTElEOworCWlmICh2ZmxhZ3MgJiBIUFRFX1ZfTEFSR0UpCisJCXZhICY9IH4oMVVMIDw8IEhQVEVfVl9BVlBOX1NISUZUKTsKKwlocHRlX3IgPSAoYXJwbiA8PCBIUFRFX1JfUlBOX1NISUZUKSB8IHJmbGFnczsKIAotCWxocHRlLmR3MC5kd29yZDAgICAgICA9IDA7Ci0JbGhwdGUuZHcwLmR3MC5hdnBuICAgID0gdmEgPj4gMjM7Ci0JbGhwdGUuZHcwLmR3MC5oICAgICAgID0gc2Vjb25kYXJ5OwotCWxocHRlLmR3MC5kdzAuYm9sdGVkICA9IGJvbHRlZDsKLQlsaHB0ZS5kdzAuZHcwLnYgICAgICAgPSAxOwotCi0JaWYgKGxhcmdlKSB7Ci0JCWxocHRlLmR3MC5kdzAubCA9IDE7Ci0JCWxocHRlLmR3MC5kdzAuYXZwbiAmPSB+MHgxVUw7Ci0JfQotCi0JaHB0ZXAtPmR3MS5kd29yZDEgPSBsaHB0ZS5kdzEuZHdvcmQxOwotCisJaHB0ZXAtPnIgPSBocHRlX3I7CiAJLyogR3VhcmFudGVlIHRoZSBzZWNvbmQgZHdvcmQgaXMgdmlzaWJsZSBiZWZvcmUgdGhlIHZhbGlkIGJpdCAqLwogCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKLQogCS8qCiAJICogTm93IHNldCB0aGUgZmlyc3QgZHdvcmQgaW5jbHVkaW5nIHRoZSB2YWxpZCBiaXQKIAkgKiBOT1RFOiB0aGlzIGFsc28gdW5sb2NrcyB0aGUgaHB0ZQogCSAqLwotCWhwdGVwLT5kdzAuZHdvcmQwID0gbGhwdGUuZHcwLmR3b3JkMDsKKwlocHRlcC0+diA9IGhwdGVfdjsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fICgicHRlc3luYyIgOiA6IDogIm1lbW9yeSIpOwogCi0JcmV0dXJuIGkgfCAoc2Vjb25kYXJ5IDw8IDMpOworCXJldHVybiBpIHwgKCEhKHZmbGFncyAmIEhQVEVfVl9TRUNPTkRBUlkpIDw8IDMpOwogfQogCiBzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9yZW1vdmUodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwKQogewotCUhQVEUgKmhwdGVwOwotCUhwdGVfZHdvcmQwIGR3MDsKKwlocHRlX3QgKmhwdGVwOwogCWludCBpOwogCWludCBzbG90X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAogCS8qIHBpY2sgYSByYW5kb20gZW50cnkgdG8gc3RhcnQgYXQgKi8KIAlzbG90X29mZnNldCA9IG1mdGIoKSAmIDB4NzsKIAogCWZvciAoaSA9IDA7IGkgPCBIUFRFU19QRVJfR1JPVVA7IGkrKykgewogCQlocHRlcCA9IGh0YWJfYWRkcmVzcyArIGhwdGVfZ3JvdXAgKyBzbG90X29mZnNldDsKLQkJZHcwID0gaHB0ZXAtPmR3MC5kdzA7CisJCWhwdGVfdiA9IGhwdGVwLT52OwogCi0JCWlmIChkdzAudiAmJiAhZHcwLmJvbHRlZCkgeworCQlpZiAoKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkgJiYgIShocHRlX3YgJiBIUFRFX1ZfQk9MVEVEKSkgewogCQkJLyogcmV0cnkgd2l0aCBsb2NrIGhlbGQgKi8KIAkJCW5hdGl2ZV9sb2NrX2hwdGUoaHB0ZXApOwotCQkJZHcwID0gaHB0ZXAtPmR3MC5kdzA7Ci0JCQlpZiAoZHcwLnYgJiYgIWR3MC5ib2x0ZWQpCisJCQlocHRlX3YgPSBocHRlcC0+djsKKwkJCWlmICgoaHB0ZV92ICYgSFBURV9WX1ZBTElEKQorCQkJICAgICYmICEoaHB0ZV92ICYgSFBURV9WX0JPTFRFRCkpCiAJCQkJYnJlYWs7CiAJCQluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCQl9CkBAIC0xMzcsMTUgKzEyMiwxNSBAQAogCQlyZXR1cm4gLTE7CiAKIAkvKiBJbnZhbGlkYXRlIHRoZSBocHRlLiBOT1RFOiB0aGlzIGFsc28gdW5sb2NrcyBpdCAqLwotCWhwdGVwLT5kdzAuZHdvcmQwID0gMDsKKwlocHRlcC0+diA9IDA7CiAKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9wcF9iaXQodW5zaWduZWQgbG9uZyBwcCwgSFBURSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcHBfYml0KHVuc2lnbmVkIGxvbmcgcHAsIGhwdGVfdCAqYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIG9sZDsKLQl1bnNpZ25lZCBsb25nICpwID0gJmFkZHItPmR3MS5kd29yZDE7CisJdW5zaWduZWQgbG9uZyAqcCA9ICZhZGRyLT5yOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJIjE6CWxkYXJ4CSUwLDAsJTNcblwKQEAgLTE2MywxMSArMTQ4LDExIEBACiAgKi8KIHN0YXRpYyBsb25nIG5hdGl2ZV9ocHRlX2ZpbmQodW5zaWduZWQgbG9uZyB2cG4pCiB7Ci0JSFBURSAqaHB0ZXA7CisJaHB0ZV90ICpocHRlcDsKIAl1bnNpZ25lZCBsb25nIGhhc2g7CiAJdW5zaWduZWQgbG9uZyBpLCBqOwogCWxvbmcgc2xvdDsKLQlIcHRlX2R3b3JkMCBkdzA7CisJdW5zaWduZWQgbG9uZyBocHRlX3Y7CiAKIAloYXNoID0gaHB0X2hhc2godnBuLCAwKTsKIApAQCAtMTc1LDEwICsxNjAsMTEgQEAKIAkJc2xvdCA9IChoYXNoICYgaHRhYl9oYXNoX21hc2spICogSFBURVNfUEVSX0dST1VQOwogCQlmb3IgKGkgPSAwOyBpIDwgSFBURVNfUEVSX0dST1VQOyBpKyspIHsKIAkJCWhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKLQkJCWR3MCA9IGhwdGVwLT5kdzAuZHcwOworCQkJaHB0ZV92ID0gaHB0ZXAtPnY7CiAKLQkJCWlmICgoZHcwLmF2cG4gPT0gKHZwbiA+PiAxMSkpICYmIGR3MC52ICYmCi0JCQkgICAgKGR3MC5oID09IGopKSB7CisJCQlpZiAoKEhQVEVfVl9BVlBOX1ZBTChocHRlX3YpID09ICh2cG4gPj4gMTEpKQorCQkJICAgICYmIChocHRlX3YgJiBIUFRFX1ZfVkFMSUQpCisJCQkgICAgJiYgKCAhIShocHRlX3YgJiBIUFRFX1ZfU0VDT05EQVJZKSA9PSBqKSkgewogCQkJCS8qIEhQVEUgbWF0Y2hlcyAqLwogCQkJCWlmIChqKQogCQkJCQlzbG90ID0gLXNsb3Q7CkBAIC0xOTUsMjAgKzE4MSwyMSBAQAogc3RhdGljIGxvbmcgbmF0aXZlX2hwdGVfdXBkYXRlcHAodW5zaWduZWQgbG9uZyBzbG90LCB1bnNpZ25lZCBsb25nIG5ld3BwLAogCQkJCSB1bnNpZ25lZCBsb25nIHZhLCBpbnQgbGFyZ2UsIGludCBsb2NhbCkKIHsKLQlIUFRFICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7Ci0JSHB0ZV9kd29yZDAgZHcwOworCWhwdGVfdCAqaHB0ZXAgPSBodGFiX2FkZHJlc3MgKyBzbG90OworCXVuc2lnbmVkIGxvbmcgaHB0ZV92OwogCXVuc2lnbmVkIGxvbmcgYXZwbiA9IHZhID4+IDIzOwogCWludCByZXQgPSAwOwogCiAJaWYgKGxhcmdlKQotCQlhdnBuICY9IH4weDFVTDsKKwkJYXZwbiAmPSB+MTsKIAogCW5hdGl2ZV9sb2NrX2hwdGUoaHB0ZXApOwogCi0JZHcwID0gaHB0ZXAtPmR3MC5kdzA7CisJaHB0ZV92ID0gaHB0ZXAtPnY7CiAKIAkvKiBFdmVuIGlmIHdlIG1pc3MsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgVExCICovCi0JaWYgKChkdzAuYXZwbiAhPSBhdnBuKSB8fCAhZHcwLnYpIHsKKwlpZiAoKEhQVEVfVl9BVlBOX1ZBTChocHRlX3YpICE9IGF2cG4pCisJICAgIHx8ICEoaHB0ZV92ICYgSFBURV9WX1ZBTElEKSkgewogCQluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCQlyZXQgPSAtMTsKIAl9IGVsc2UgewpAQCAtMjQ0LDcgKzIzMSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB2c2lkLCB2YSwgdnBuLCBmbGFncyA9IDA7CiAJbG9uZyBzbG90OwotCUhQVEUgKmhwdGVwOworCWhwdGVfdCAqaHB0ZXA7CiAJaW50IGxvY2tfdGxiaWUgPSAhY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfTE9DS0xFU1NfVExCSUUpOwogCiAJdnNpZCA9IGdldF9rZXJuZWxfdnNpZChlYSk7CkBAIC0yNjksMjYgKzI1NiwyNyBAQAogc3RhdGljIHZvaWQgbmF0aXZlX2hwdGVfaW52YWxpZGF0ZSh1bnNpZ25lZCBsb25nIHNsb3QsIHVuc2lnbmVkIGxvbmcgdmEsCiAJCQkJICAgIGludCBsYXJnZSwgaW50IGxvY2FsKQogewotCUhQVEUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKLQlIcHRlX2R3b3JkMCBkdzA7CisJaHB0ZV90ICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7CisJdW5zaWduZWQgbG9uZyBocHRlX3Y7CiAJdW5zaWduZWQgbG9uZyBhdnBuID0gdmEgPj4gMjM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbG9ja190bGJpZSA9ICFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSk7CiAKIAlpZiAobGFyZ2UpCi0JCWF2cG4gJj0gfjB4MVVMOworCQlhdnBuICY9IH4xOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCW5hdGl2ZV9sb2NrX2hwdGUoaHB0ZXApOwogCi0JZHcwID0gaHB0ZXAtPmR3MC5kdzA7CisJaHB0ZV92ID0gaHB0ZXAtPnY7CiAKIAkvKiBFdmVuIGlmIHdlIG1pc3MsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgVExCICovCi0JaWYgKChkdzAuYXZwbiAhPSBhdnBuKSB8fCAhZHcwLnYpIHsKKwlpZiAoKEhQVEVfVl9BVlBOX1ZBTChocHRlX3YpICE9IGF2cG4pCisJICAgIHx8ICEoaHB0ZV92ICYgSFBURV9WX1ZBTElEKSkgewogCQluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCX0gZWxzZSB7CiAJCS8qIEludmFsaWRhdGUgdGhlIGhwdGUuIE5PVEU6IHRoaXMgYWxzbyB1bmxvY2tzIGl0ICovCi0JCWhwdGVwLT5kdzAuZHdvcmQwID0gMDsKKwkJaHB0ZXAtPnYgPSAwOwogCX0KIAogCS8qIEludmFsaWRhdGUgdGhlIHRsYiAqLwpAQCAtMzE1LDggKzMwMyw4IEBACiBzdGF0aWMgdm9pZCBuYXRpdmVfaHB0ZV9jbGVhcih2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgc2xvdCwgc2xvdHMsIGZsYWdzOwotCUhQVEUgKmhwdGVwID0gaHRhYl9hZGRyZXNzOwotCUhwdGVfZHdvcmQwIGR3MDsKKwlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgaHB0ZV92OwogCXVuc2lnbmVkIGxvbmcgcHRlZ19jb3VudDsKIAogCXB0ZWdfY291bnQgPSBodGFiX2hhc2hfbWFzayArIDE7CkBAIC0zMzYsMTEgKzMyNCwxMSBAQAogCQkgKiBydW5uaW5nLCAgcmlnaHQ/ICBhbmQgZm9yIGNyYXNoIGR1bXAsIHdlIHByb2JhYmx5CiAJCSAqIGRvbid0IHdhbnQgdG8gd2FpdCBmb3IgYSBtYXliZSBiYWQgY3B1LgogCQkgKi8KLQkJZHcwID0gaHB0ZXAtPmR3MC5kdzA7CisJCWhwdGVfdiA9IGhwdGVwLT52OwogCi0JCWlmIChkdzAudikgewotCQkJaHB0ZXAtPmR3MC5kd29yZDAgPSAwOwotCQkJdGxiaWUoc2xvdDJ2YShkdzAuYXZwbiwgZHcwLmwsIGR3MC5oLCBzbG90KSwgZHcwLmwpOworCQlpZiAoaHB0ZV92ICYgSFBURV9WX1ZBTElEKSB7CisJCQlocHRlcC0+diA9IDA7CisJCQl0bGJpZShzbG90MnZhKGhwdGVfdiwgc2xvdCksIGhwdGVfdiAmIEhQVEVfVl9MQVJHRSk7CiAJCX0KIAl9CiAKQEAgLTM1Myw4ICszNDEsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgdnNpZCwgdnBuLCB2YSwgaGFzaCwgc2Vjb25kYXJ5LCBzbG90LCBmbGFncywgYXZwbjsKIAlpbnQgaSwgajsKLQlIUFRFICpocHRlcDsKLQlIcHRlX2R3b3JkMCBkdzA7CisJaHB0ZV90ICpocHRlcDsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAlzdHJ1Y3QgcHBjNjRfdGxiX2JhdGNoICpiYXRjaCA9ICZfX2dldF9jcHVfdmFyKHBwYzY0X3RsYl9iYXRjaCk7CiAKIAkvKiBYWFggZml4IGZvciBsYXJnZSBwdGVzICovCkBAIC0zOTAsMTQgKzM3OCwxNSBAQAogCiAJCW5hdGl2ZV9sb2NrX2hwdGUoaHB0ZXApOwogCi0JCWR3MCA9IGhwdGVwLT5kdzAuZHcwOworCQlocHRlX3YgPSBocHRlcC0+djsKIAogCQkvKiBFdmVuIGlmIHdlIG1pc3MsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgVExCICovCi0JCWlmICgoZHcwLmF2cG4gIT0gYXZwbikgfHwgIWR3MC52KSB7CisJCWlmICgoSFBURV9WX0FWUE5fVkFMKGhwdGVfdikgIT0gYXZwbikKKwkJICAgIHx8ICEoaHB0ZV92ICYgSFBURV9WX1ZBTElEKSkgewogCQkJbmF0aXZlX3VubG9ja19ocHRlKGhwdGVwKTsKIAkJfSBlbHNlIHsKIAkJCS8qIEludmFsaWRhdGUgdGhlIGhwdGUuIE5PVEU6IHRoaXMgYWxzbyB1bmxvY2tzIGl0ICovCi0JCQlocHRlcC0+ZHcwLmR3b3JkMCA9IDA7CisJCQlocHRlcC0+diA9IDA7CiAJCX0KIAogCQlqKys7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L21tL2hhc2hfdXRpbHMuYyBiL2FyY2gvcHBjNjQvbW0vaGFzaF91dGlscy5jCmluZGV4IDE2NDdiMWMuLjYyM2I1ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvbW0vaGFzaF91dGlscy5jCisrKyBiL2FyY2gvcHBjNjQvbW0vaGFzaF91dGlscy5jCkBAIC03NSw4ICs3NSw4IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBkYXJ0X3RhYmxlYmFzZTsKICNlbmRpZiAvKiBDT05GSUdfVTNfREFSVCAqLwogCi1IUFRFCQkqaHRhYl9hZGRyZXNzOwotdW5zaWduZWQgbG9uZwlodGFiX2hhc2hfbWFzazsKK2hwdGVfdCAqaHRhYl9hZGRyZXNzOwordW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX1NEUjE7CiAKQEAgLTk3LDExICs5NywxNSBAQAogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1bnNpZ25lZCBpbnQgc3RlcDsKIAl1bnNpZ25lZCBsb25nIHRtcF9tb2RlOworCXVuc2lnbmVkIGxvbmcgdmZsYWdzOwogCi0JaWYgKGxhcmdlKQorCWlmIChsYXJnZSkgewogCQlzdGVwID0gMTYqTUI7Ci0JZWxzZQorCQl2ZmxhZ3MgPSBIUFRFX1ZfQk9MVEVEIHwgSFBURV9WX0xBUkdFOworCX0gZWxzZSB7CiAJCXN0ZXAgPSA0KktCOworCQl2ZmxhZ3MgPSBIUFRFX1ZfQk9MVEVEOworCX0KIAogCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IHN0ZXApIHsKIAkJdW5zaWduZWQgbG9uZyB2cG4sIGhhc2gsIGhwdGVnOwpAQCAtMTI5LDEyICsxMzMsMTIgQEAKIAkJaWYgKHN5c3RlbWNmZy0+cGxhdGZvcm0gJiBQTEFURk9STV9MUEFSKQogCQkJcmV0ID0gcFNlcmllc19scGFyX2hwdGVfaW5zZXJ0KGhwdGVnLCB2YSwKIAkJCQl2aXJ0X3RvX2FicyhhZGRyKSA+PiBQQUdFX1NISUZULAotCQkJCTAsIHRtcF9tb2RlLCAxLCBsYXJnZSk7CisJCQkJdmZsYWdzLCB0bXBfbW9kZSk7CiAJCWVsc2UKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KIAkJCXJldCA9IG5hdGl2ZV9ocHRlX2luc2VydChocHRlZywgdmEsCiAJCQkJdmlydF90b19hYnMoYWRkcikgPj4gUEFHRV9TSElGVCwKLQkJCQkwLCB0bXBfbW9kZSwgMSwgbGFyZ2UpOworCQkJCXZmbGFncywgdG1wX21vZGUpOwogCiAJCWlmIChyZXQgPT0gLTEpIHsKIAkJCXBwYzY0X3Rlcm1pbmF0ZV9tc2coMHgyMCwgImNyZWF0ZV9wdGVfbWFwcGluZyIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9wcGM2NC9tbS9odWdldGxicGFnZS5jCmluZGV4IGZkY2ZlOTcuLmY5NTI0NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3BwYzY0L21tL2h1Z2V0bGJwYWdlLmMKQEAgLTU4Myw3ICs1ODMsNyBAQAogCXB0ZV90ICpwdGVwOwogCXVuc2lnbmVkIGxvbmcgdmEsIHZwbjsKIAlwdGVfdCBvbGRfcHRlLCBuZXdfcHRlOwotCXVuc2lnbmVkIGxvbmcgaHB0ZWZsYWdzLCBwcnBuOworCXVuc2lnbmVkIGxvbmcgcmZsYWdzLCBwcnBuOwogCWxvbmcgc2xvdDsKIAlpbnQgZXJyID0gMTsKIApAQCAtNjI2LDkgKzYyNiw5IEBACiAJb2xkX3B0ZSA9ICpwdGVwOwogCW5ld19wdGUgPSBvbGRfcHRlOwogCi0JaHB0ZWZsYWdzID0gMHgyIHwgKCEgKHB0ZV92YWwobmV3X3B0ZSkgJiBfUEFHRV9SVykpOworCXJmbGFncyA9IDB4MiB8ICghIChwdGVfdmFsKG5ld19wdGUpICYgX1BBR0VfUlcpKTsKICAJLyogX1BBR0VfRVhFQyAtPiBIV19OT19FWEVDIHNpbmNlIGl0J3MgaW52ZXJ0ZWQgKi8KLQlocHRlZmxhZ3MgfD0gKChwdGVfdmFsKG5ld19wdGUpICYgX1BBR0VfRVhFQykgPyAwIDogSFdfTk9fRVhFQyk7CisJcmZsYWdzIHw9ICgocHRlX3ZhbChuZXdfcHRlKSAmIF9QQUdFX0VYRUMpID8gMCA6IEhXX05PX0VYRUMpOwogCiAJLyogQ2hlY2sgaWYgcHRlIGFscmVhZHkgaGFzIGFuIGhwdGUgKGNhc2UgMikgKi8KIAlpZiAodW5saWtlbHkocHRlX3ZhbChvbGRfcHRlKSAmIF9QQUdFX0hBU0hQVEUpKSB7CkBAIC02NDEsNyArNjQxLDcgQEAKIAkJc2xvdCA9IChoYXNoICYgaHRhYl9oYXNoX21hc2spICogSFBURVNfUEVSX0dST1VQOwogCQlzbG90ICs9IChwdGVfdmFsKG9sZF9wdGUpICYgX1BBR0VfR1JPVVBfSVgpID4+IDEyOwogCi0JCWlmIChwcGNfbWQuaHB0ZV91cGRhdGVwcChzbG90LCBocHRlZmxhZ3MsIHZhLCAxLCBsb2NhbCkgPT0gLTEpCisJCWlmIChwcGNfbWQuaHB0ZV91cGRhdGVwcChzbG90LCByZmxhZ3MsIHZhLCAxLCBsb2NhbCkgPT0gLTEpCiAJCQlwdGVfdmFsKG9sZF9wdGUpICY9IH5fUEFHRV9IUFRFRkxBR1M7CiAJfQogCkBAIC02NjEsMTAgKzY2MSwxMCBAQAogCiAJCS8qIEFkZCBpbiBXSU1HIGJpdHMgKi8KIAkJLyogWFhYIFdlIHNob3VsZCBzdG9yZSB0aGVzZSBpbiB0aGUgcHRlICovCi0JCWhwdGVmbGFncyB8PSBfUEFHRV9DT0hFUkVOVDsKKwkJcmZsYWdzIHw9IF9QQUdFX0NPSEVSRU5UOwogCi0JCXNsb3QgPSBwcGNfbWQuaHB0ZV9pbnNlcnQoaHB0ZV9ncm91cCwgdmEsIHBycG4sIDAsCi0JCQkJCSAgaHB0ZWZsYWdzLCAwLCAxKTsKKwkJc2xvdCA9IHBwY19tZC5ocHRlX2luc2VydChocHRlX2dyb3VwLCB2YSwgcHJwbiwKKwkJCQkJICBIUFRFX1ZfTEFSR0UsIHJmbGFncyk7CiAKIAkJLyogUHJpbWFyeSBpcyBmdWxsLCB0cnkgdGhlIHNlY29uZGFyeSAqLwogCQlpZiAodW5saWtlbHkoc2xvdCA9PSAtMSkpIHsKQEAgLTY3Miw3ICs2NzIsNyBAQAogCQkJaHB0ZV9ncm91cCA9ICgofmhhc2ggJiBodGFiX2hhc2hfbWFzaykgKgogCQkJCSAgICAgIEhQVEVTX1BFUl9HUk9VUCkgJiB+MHg3VUw7IAogCQkJc2xvdCA9IHBwY19tZC5ocHRlX2luc2VydChocHRlX2dyb3VwLCB2YSwgcHJwbiwKLQkJCQkJCSAgMSwgaHB0ZWZsYWdzLCAwLCAxKTsKKwkJCQkJCSAgSFBURV9WX0xBUkdFLCByZmxhZ3MpOwogCQkJaWYgKHNsb3QgPT0gLTEpIHsKIAkJCQlpZiAobWZ0YigpICYgMHgxKQogCQkJCQlocHRlX2dyb3VwID0gKChoYXNoICYgaHRhYl9oYXNoX21hc2spICogSFBURVNfUEVSX0dST1VQKSAmIH4weDdVTDsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvbW0vaW5pdC5jIGIvYXJjaC9wcGM2NC9tbS9pbml0LmMKaW5kZXggYjUwYjNhNC4uZTU4YTI0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9wcGM2NC9tbS9pbml0LmMKQEAgLTE4MCw5ICsxODAsMTAgQEAKIAkJaHB0ZWcgPSAoKGhhc2ggJiBodGFiX2hhc2hfbWFzaykgKiBIUFRFU19QRVJfR1JPVVApOwogCiAJCS8qIFBhbmljIGlmIGEgcHRlIGdycHVwIGlzIGZ1bGwgKi8KLQkJaWYgKHBwY19tZC5ocHRlX2luc2VydChocHRlZywgdmEsIHBhID4+IFBBR0VfU0hJRlQsIDAsCi0JCQkJICAgICAgIF9QQUdFX05PX0NBQ0hFfF9QQUdFX0dVQVJERUR8UFBfUldYWCwKLQkJCQkgICAgICAgMSwgMCkgPT0gLTEpIHsKKwkJaWYgKHBwY19tZC5ocHRlX2luc2VydChocHRlZywgdmEsIHBhID4+IFBBR0VfU0hJRlQsCisJCQkJICAgICAgIEhQVEVfVl9CT0xURUQsCisJCQkJICAgICAgIF9QQUdFX05PX0NBQ0hFfF9QQUdFX0dVQVJERUR8UFBfUldYWCkKKwkJICAgID09IC0xKSB7CiAJCQlwYW5pYygibWFwX2lvX3BhZ2U6IGNvdWxkIG5vdCBpbnNlcnQgbWFwcGluZyIpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCA2NjAwZWU4Li40NzdhYzI3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtNDY1LDYgKzQ2NSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogY29uZmlnIFBDTUNJQQogCWJvb2wKIAlkZWZhdWx0IG4KQEAgLTQ3NSw3ICs0NzcsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvczM5MC9LY29uZmlnIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IDYxNDA1NjIuLjE4NjEwY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZhZHZpc2UuaD4KIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcGMuaD4KQEAgLTEwNDMsMyArMTA0NCw0MCBAQAogCiAJcmV0dXJuIHJldDsKIH0KKworLyoKKyAqIDMxIGJpdCBlbXVsYXRpb24gd3JhcHBlciBmdW5jdGlvbnMgZm9yIHN5c19mYWR2aXNlNjQvZmFkdmlzZTY0XzY0LgorICogVGhlc2UgbmVlZCB0byByZXdyaXRlIHRoZSBhZHZpc2UgdmFsdWVzIGZvciBQT1NJWF9GQURWX3tET05UTkVFRCxOT1JFVVNFfQorICogYmVjYXVzZSB0aGUgMzEgYml0IHZhbHVlcyBkaWZmZXIgZnJvbSB0aGUgNjQgYml0IHZhbHVlcy4KKyAqLworCithc21saW5rYWdlIGxvbmcKK3N5czMyX2ZhZHZpc2U2NChpbnQgZmQsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBsZW4sIGludCBhZHZpc2UpCit7CisJaWYgKGFkdmlzZSA9PSA0KQorCQlhZHZpc2UgPSBQT1NJWF9GQURWX0RPTlRORUVEOworCWVsc2UgaWYgKGFkdmlzZSA9PSA1KQorCQlhZHZpc2UgPSBQT1NJWF9GQURWX05PUkVVU0U7CisJcmV0dXJuIHN5c19mYWR2aXNlNjQoZmQsIG9mZnNldCwgbGVuLCBhZHZpc2UpOworfQorCitzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgeworCWludCBmZDsKKwlsb25nIGxvbmcgb2Zmc2V0OworCWxvbmcgbG9uZyBsZW47CisJaW50IGFkdmljZTsKK307CisKK2FzbWxpbmthZ2UgbG9uZworc3lzMzJfZmFkdmlzZTY0XzY0KHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyBfX3VzZXIgKmFyZ3MpCit7CisJc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIGE7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCZhLCBhcmdzLCBzaXplb2YoYSkpICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGEuYWR2aWNlID09IDQpCisJCWEuYWR2aWNlID0gUE9TSVhfRkFEVl9ET05UTkVFRDsKKwllbHNlIGlmIChhLmFkdmljZSA9PSA1KQorCQlhLmFkdmljZSA9IFBPU0lYX0ZBRFZfTk9SRVVTRTsKKwlyZXR1cm4gc3lzX2ZhZHZpc2U2NF82NChhLmZkLCBhLm9mZnNldCwgYS5sZW4sIGEuYWR2aWNlKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwppbmRleCBiZjUyOTczLi43OTlhOThlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCkBAIC0xMjUxLDEyICsxMjUxLDEyIEBACiAJb3IJJXIzLCVyNAkJCSMgZ2V0IGxvdyB3b3JkIG9mIDY0Yml0IGxvZmZfdAogCWxsZ2ZyCSVyNCwlcjUJCQkjIHNpemVfdCAodW5zaWduZWQgbG9uZykKIAlsZ2ZyCSVyNSwlcjYJCQkjIGludAotCWpnCXN5c19mYWR2aXNlNjQKKwlqZwlzeXMzMl9mYWR2aXNlNjQKIAogCS5nbG9ibAlzeXMzMl9mYWR2aXNlNjRfNjRfd3JhcHBlcgogc3lzMzJfZmFkdmlzZTY0XzY0X3dyYXBwZXI6CiAJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzICoKLQlqZwlzMzkwX2ZhZHZpc2U2NF82NAorCWpnCXN5czMyX2ZhZHZpc2U2NF82NAogCiAJLmdsb2JsCXN5czMyX2Nsb2NrX3NldHRpbWVfd3JhcHBlcgogc3lzMzJfY2xvY2tfc2V0dGltZV93cmFwcGVyOgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnIGIvYXJjaC9zaC9LY29uZmlnCmluZGV4IGE3YzhiZmMuLmFkYzgxMDlmIDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC03ODQsNiArNzg0LDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L0tjb25maWcgYi9hcmNoL3NoNjQvS2NvbmZpZwppbmRleCA3MDhlNTk3My4uNGMzZTUzMyAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L0tjb25maWcKKysrIGIvYXJjaC9zaDY0L0tjb25maWcKQEAgLTI2OCw2ICsyNjgsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggN2ExMTdlZi4uYWNhMDI4YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjY4LDYgKzI2OCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIGlmICFTVU40CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMKaW5kZXggOTI4ZmZlYi4uMDI1ZjQ1MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuUwpAQCAtNTcsMTEgKzU3LDExIEBACiAvKjE4MCovCS5sb25nIHN5c19mbGlzdHhhdHRyLCBzeXNfcmVtb3ZleGF0dHIsIHN5c19scmVtb3ZleGF0dHIsIHN5c19zaWdwZW5kaW5nLCBzeXNfbmlfc3lzY2FsbAogLyoxODUqLwkubG9uZyBzeXNfc2V0cGdpZCwgc3lzX2ZyZW1vdmV4YXR0ciwgc3lzX3RraWxsLCBzeXNfZXhpdF9ncm91cCwgc3lzX25ld3VuYW1lCiAvKjE5MCovCS5sb25nIHN5c19pbml0X21vZHVsZSwgc3lzX3BlcnNvbmFsaXR5LCBzcGFyY19yZW1hcF9maWxlX3BhZ2VzLCBzeXNfZXBvbGxfY3JlYXRlLCBzeXNfZXBvbGxfY3RsCi0vKjE5NSovCS5sb25nIHN5c19lcG9sbF93YWl0LCBzeXNfbmlzX3N5c2NhbGwsIHN5c19nZXRwcGlkLCBzcGFyY19zaWdhY3Rpb24sIHN5c19zZ2V0bWFzaworLyoxOTUqLwkubG9uZyBzeXNfZXBvbGxfd2FpdCwgc3lzX2lvcHJpb19zZXQsIHN5c19nZXRwcGlkLCBzcGFyY19zaWdhY3Rpb24sIHN5c19zZ2V0bWFzawogLyoyMDAqLwkubG9uZyBzeXNfc3NldG1hc2ssIHN5c19zaWdzdXNwZW5kLCBzeXNfbmV3bHN0YXQsIHN5c191c2VsaWIsIG9sZF9yZWFkZGlyCiAvKjIwNSovCS5sb25nIHN5c19yZWFkYWhlYWQsIHN5c19zb2NrZXRjYWxsLCBzeXNfc3lzbG9nLCBzeXNfbG9va3VwX2Rjb29raWUsIHN5c19mYWR2aXNlNjQKIC8qMjEwKi8JLmxvbmcgc3lzX2ZhZHZpc2U2NF82NCwgc3lzX3Rna2lsbCwgc3lzX3dhaXRwaWQsIHN5c19zd2Fwb2ZmLCBzeXNfc3lzaW5mbwotLyoyMTUqLwkubG9uZyBzeXNfaXBjLCBzeXNfc2lncmV0dXJuLCBzeXNfY2xvbmUsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2FkanRpbWV4CisvKjIxNSovCS5sb25nIHN5c19pcGMsIHN5c19zaWdyZXR1cm4sIHN5c19jbG9uZSwgc3lzX2lvcHJpb19nZXQsIHN5c19hZGp0aW1leAogLyoyMjAqLwkubG9uZyBzeXNfc2lncHJvY21hc2ssIHN5c19uaV9zeXNjYWxsLCBzeXNfZGVsZXRlX21vZHVsZSwgc3lzX25pX3N5c2NhbGwsIHN5c19nZXRwZ2lkCiAvKjIyNSovCS5sb25nIHN5c19iZGZsdXNoLCBzeXNfc3lzZnMsIHN5c19uaXNfc3lzY2FsbCwgc3lzX3NldGZzdWlkMTYsIHN5c19zZXRmc2dpZDE2CiAvKjIzMCovCS5sb25nIHN5c19zZWxlY3QsIHN5c190aW1lLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zdGltZSwgc3lzX3N0YXRmczY0CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvS2NvbmZpZyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCmluZGV4IGUyYjA1MGUuLjlhZmQyOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCkBAIC00Myw2ICs0MywyNSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIFNFQ0NPTVAKKwlib29sICJFbmFibGUgc2VjY29tcCB0byBzYWZlbHkgY29tcHV0ZSB1bnRydXN0ZWQgYnl0ZWNvZGUiCisJZGVwZW5kcyBvbiBQUk9DX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBrZXJuZWwgZmVhdHVyZSBpcyB1c2VmdWwgZm9yIG51bWJlciBjcnVuY2hpbmcgYXBwbGljYXRpb25zCisJICB0aGF0IG1heSBuZWVkIHRvIGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIGR1cmluZyB0aGVpcgorCSAgZXhlY3V0aW9uLiBCeSB1c2luZyBwaXBlcyBvciBvdGhlciB0cmFuc3BvcnRzIG1hZGUgYXZhaWxhYmxlIHRvCisJICB0aGUgcHJvY2VzcyBhcyBmaWxlIGRlc2NyaXB0b3JzIHN1cHBvcnRpbmcgdGhlIHJlYWQvd3JpdGUKKwkgIHN5c2NhbGxzLCBpdCdzIHBvc3NpYmxlIHRvIGlzb2xhdGUgdGhvc2UgYXBwbGljYXRpb25zIGluCisJICB0aGVpciBvd24gYWRkcmVzcyBzcGFjZSB1c2luZyBzZWNjb21wLiBPbmNlIHNlY2NvbXAgaXMKKwkgIGVuYWJsZWQgdmlhIC9wcm9jLzxwaWQ+L3NlY2NvbXAsIGl0IGNhbm5vdCBiZSBkaXNhYmxlZAorCSAgYW5kIHRoZSB0YXNrIGlzIG9ubHkgYWxsb3dlZCB0byBleGVjdXRlIGEgZmV3IHNhZmUgc3lzY2FsbHMKKwkgIGRlZmluZWQgYnkgZWFjaCBzZWNjb21wIG1vZGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuIE9ubHkgZW1iZWRkZWQgc2hvdWxkIHNheSBOIGhlcmUuCisKK3NvdXJjZSBrZXJuZWwvS2NvbmZpZy5oegorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogY29uZmlnIFNZU1ZJUENfQ09NUEFUCkBAIC00NDQsNiArNDYzLDI0IEBACiAJICBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gOCBwcmludGVycywgeW91IG5lZWQgdG8gaW5jcmVhc2UgdGhlIExQX05PCiAJICBtYWNybyBpbiBscC5jIGFuZCB0aGUgUEFSUE9SVF9NQVggbWFjcm8gaW4gcGFycG9ydC5oLgogCitjb25maWcgUFBERVYKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdXNlci1zcGFjZSBwYXJhbGxlbCBwb3J0IGRldmljZSBkcml2ZXJzIgorCWRlcGVuZHMgb24gUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFNheWluZyBZIHRvIHRoaXMgYWRkcyBzdXBwb3J0IGZvciAvZGV2L3BhcnBvcnQgZGV2aWNlIG5vZGVzLiAgVGhpcworCSAgaXMgbmVlZGVkIGZvciBwcm9ncmFtcyB0aGF0IHdhbnQgcG9ydGFibGUgYWNjZXNzIHRvIHRoZSBwYXJhbGxlbAorCSAgcG9ydCwgZm9yIGluc3RhbmNlIGRldmljZWlkICh3aGljaCBkaXNwbGF5cyBQbHVnLWFuZC1QbGF5IGRldmljZQorCSAgSURzKS4KKworCSAgVGhpcyBpcyB0aGUgcGFyYWxsZWwgcG9ydCBlcXVpdmFsZW50IG9mIFNDU0kgZ2VuZXJpYyBzdXBwb3J0IChzZykuCisJICBJdCBpcyBzYWZlIHRvIHNheSBOIHRvIHRoaXMgLS0gaXQgaXMgbm90IG5lZWRlZCBmb3Igbm9ybWFsIHByaW50aW5nCisJICBvciBwYXJhbGxlbCBwb3J0IENELVJPTS9kaXNrIHN1cHBvcnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBwZGV2LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgRU5WQ1RSTAogCXRyaXN0YXRlICJTVU5XLCBlbnZjdHJsIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKQEAgLTQ4OCw2ICs1MjUsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy92aWRlby9LY29uZmlnIgpAQCAtNTE0LDcgKzU1Myw3IEBACiAKIHNvdXJjZSAiZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9LY29uZmlnIgogCkBAIC02MTAsNiArNjQ5LDggQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKKwogc291cmNlICJmcy9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHRsYl9iYWNrZW5kLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2R0bGJfYmFja2VuZC5TCmluZGV4IGI3M2EzYzguLjUzODUyMjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHRsYl9iYWNrZW5kLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9kdGxiX2JhY2tlbmQuUwpAQCAtMTYsNyArMTYsNyBAQAogI2VsaWYgUEFHRV9TSElGVCA9PSAxOQogI2RlZmluZSBTWl9CSVRTCQlfUEFHRV9TWjUxMksKICNlbGlmIFBBR0VfU0hJRlQgPT0gMjIKLSNkZWZpbmUgU1pfQklUUwkJX1BBR0VfU1o0TQorI2RlZmluZSBTWl9CSVRTCQlfUEFHRV9TWjRNQgogI2VuZGlmCiAKICNkZWZpbmUgVkFMSURfU1pfQklUUwkoX1BBR0VfVkFMSUQgfCBTWl9CSVRTKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IGVlZTUxNmEuLmQ3ODFmMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMKQEAgLTIyLDggKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vZXN0YXRlLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAKLS8qICNkZWZpbmUgU1lTQ0FMTF9UUkFDSU5HCTEgKi8KLQogI2RlZmluZSBjdXJwdHIgICAgICBnNgogCiAjZGVmaW5lIE5SX1NZU0NBTExTIDI4NCAgICAgIC8qIEVhY2ggT1MgaXMgZGlmZmVyZW50Li4uICovCkBAIC01NTMsMTMgKzU1MSwxMSBAQAogCXNsbHgJCSVnMywgNSwgJWczCiAJb3IJCSVnMiwgJWxvKGl2ZWN0b3JfdGFibGUpLCAlZzIKIAlhZGQJCSVnMiwgJWczLCAlZzMKLQlsZHgJCVslZzMgKyAweDA4XSwgJWcyCS8qIGlycV9pbmZvICovCiAJbGR1YgkJWyVnMyArIDB4MDRdLCAlZzQJLyogcGlsICovCi0JYnJ6LHBuCQklZzIsIGRvX2l2ZWNfc3B1cmlvdXMKLQkgbW92CQkxLCAlZzIKLQorCW1vdgkJMSwgJWcyCiAJc2xseAkJJWcyLCAlZzQsICVnMgogCXNsbHgJCSVnNCwgMiwgJWc0CisKIAlsZHV3CQlbJWc2ICsgJWc0XSwgJWc1CS8qIGc1ID0gaXJxX3dvcmsoY3B1LCBwaWwpICovCiAJc3R3CQklZzUsIFslZzMgKyAweDAwXQkvKiBidWNrZXQtPmlycV9jaGFpbiA9IGc1ICovCiAJc3R3CQklZzMsIFslZzYgKyAlZzRdCS8qIGlycV93b3JrKGNwdSwgcGlsKSA9IGJ1Y2tldCAqLwpAQCAtNTY3LDkgKzU2Myw5IEBACiAJcmV0cnkKIGRvX2l2ZWNfeGNhbGw6CiAJbW92CQkweDUwLCAlZzEKLQogCWxkeGEJCVslZzEgKyAlZzBdIEFTSV9JTlRSX1IsICVnMQogCXNybAkJJWczLCAwLCAlZzMKKwogCW1vdgkJMHg2MCwgJWc3CiAJbGR4YQkJWyVnNyArICVnMF0gQVNJX0lOVFJfUiwgJWc3CiAJc3R4YQkJJWcwLCBbJWcwXSBBU0lfSU5UUl9SRUNFSVZFCkBAIC01ODEsMTkgKzU3Nyw2IEBACiAxOglqbXBsCQklZzMsICVnMAogCSBub3AKIAotZG9faXZlY19zcHVyaW91czoKLQlzdHcJCSVnMywgWyVnNiArIDB4MDBdCS8qIGlycV93b3JrKGNwdSwgMCkgPSBidWNrZXQgKi8KLQlyZHByCQklcHN0YXRlLCAlZzUKLQotCXdycHIJCSVnNSwgUFNUQVRFX0lHIHwgUFNUQVRFX0FHLCAlcHN0YXRlCi0Jc2V0aGkJCSVoaSgxMDlmKSwgJWc3Ci0JYmEscHQJCSV4Y2MsIGV0cmFwCi0xMDk6CSBvcgkJJWc3LCAlbG8oMTA5YiksICVnNwotCWNhbGwJCWNhdGNoX2Rpc2FibGVkX2l2ZWMKLQkgYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAotCWJhLHB0CQkleGNjLCBydHJhcAotCSBjbHIJCSVsNgotCiAJLmdsb2JsCQlzYXZlX2FsdGVybmF0ZV9nbG9iYWxzCiBzYXZlX2FsdGVybmF0ZV9nbG9iYWxzOiAvKiAlbzAgPSBzYXZlX2FyZWEgKi8KIAlyZHByCQklcHN0YXRlLCAlbzUKQEAgLTE1NjksMTEgKzE1NTIsMTIgQEAKIAkJbm9wCiAJCS5hbGlnbgkJMzIKIDE6CQlsZHgJCVslY3VycHRyICsgVElfRkxBR1NdLCAlbDUKLQkJYW5kY2MJCSVsNSwgX1RJRl9TWVNDQUxMX1RSQUNFLCAlZzAKKwkJYW5kY2MJCSVsNSwgKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NFQ0NPTVB8X1RJRl9TWVNDQUxMX0FVRElUKSwgJWcwCiAJCWJlLHB0CQklaWNjLCBydHJhcAogCQkgY2xyCQklbDYKKwkJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAogCQljYWxsCQlzeXNjYWxsX3RyYWNlCi0JCSBub3AKKwkJIG1vdgkJMSwgJW8xCiAKIAkJYmEscHQJCSV4Y2MsIHJ0cmFwCiAJCSBjbHIJCSVsNgpAQCAtMTY1NywxOCArMTY0MSwyMCBAQAogCSBvcgkJJWw3LCAlbG8oc3lzX25pX3N5c2NhbGwpLCAlbDcKIAogbGludXhfc3lzY2FsbF90cmFjZTMyOgorCWFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAljYWxsCQlzeXNjYWxsX3RyYWNlCi0JIG5vcAorCSBjbHIJCSVvMQogCXNybAkJJWkwLCAwLCAlbzAKLQltb3YJCSVpNCwgJW80CisJc3JsCQklaTQsIDAsICVvNAogCXNybAkJJWkxLCAwLCAlbzEKIAlzcmwJCSVpMiwgMCwgJW8yCiAJYixwdAkJJXhjYywgMmYKIAkgc3JsCQklaTMsIDAsICVvMwogCiBsaW51eF9zeXNjYWxsX3RyYWNlOgorCWFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAljYWxsCQlzeXNjYWxsX3RyYWNlCi0JIG5vcAorCSBjbHIJCSVvMQogCW1vdgkJJWkwLCAlbzAKIAltb3YJCSVpMSwgJW8xCiAJbW92CQklaTIsICVvMgpAQCAtMTY4NiwxMSArMTY3Miw2IEBACiAJYmdldSxwbgkJJXhjYywgbGludXhfc3BhcmNfbmlfc3lzY2FsbAkJISBDVEkKIAkgc3JsCQklaTAsIDAsICVvMAkJCQkhIElFVTAKIAlzbGwJCSVnMSwgMiwgJWw0CQkJCSEgSUVVMAlHcm91cAotI2lmZGVmIFNZU0NBTExfVFJBQ0lORwotCWNhbGwJCXN5c2NhbGxfdHJhY2VfZW50cnkKLQkgYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAotCXNybAkJJWkwLCAwLCAlbzAKLSNlbmRpZgogCXNybAkJJWk0LCAwLCAlbzQJCQkJISBJRVUxCiAJbGR1dwkJWyVsNyArICVsNF0sICVsNwkJCSEgTG9hZAogCXNybAkJJWkxLCAwLCAlbzEJCQkJISBJRVUwCUdyb3VwCkBAIC0xNjk4LDcgKzE2NzksNyBAQAogCiAJc3JsCQklaTUsIDAsICVvNQkJCQkhIElFVTEKIAlzcmwJCSVpMiwgMCwgJW8yCQkJCSEgSUVVMAlHcm91cAotCWFuZGNjCQklbDAsIF9USUZfU1lTQ0FMTF9UUkFDRSwgJWcwCQkhIElFVTAJR3JvdXAKKwlhbmRjYwkJJWwwLCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKIAlibmUscG4JCSVpY2MsIGxpbnV4X3N5c2NhbGxfdHJhY2UzMgkJISBDVEkKIAkgbW92CQklaTAsICVsNQkJCQkhIElFVTEKIAljYWxsCQklbDcJCQkJCSEgQ1RJCUdyb3VwIGJyayBmb3JjZWQKQEAgLTE3MTQsMTEgKzE2OTUsNiBAQAogCWJnZXUscG4JCSV4Y2MsIGxpbnV4X3NwYXJjX25pX3N5c2NhbGwJCSEgQ1RJCiAJIG1vdgkJJWkwLCAlbzAJCQkJISBJRVUwCiAJc2xsCQklZzEsIDIsICVsNAkJCQkhIElFVTAJR3JvdXAKLSNpZmRlZiBTWVNDQUxMX1RSQUNJTkcKLQljYWxsCQlzeXNjYWxsX3RyYWNlX2VudHJ5Ci0JIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQltb3YJCSVpMCwgJW8wCi0jZW5kaWYKIAltb3YJCSVpMSwgJW8xCQkJCSEgSUVVMQogCWxkdXcJCVslbDcgKyAlbDRdLCAlbDcJCQkhIExvYWQKIDQ6CW1vdgkJJWkyLCAlbzIJCQkJISBJRVUwCUdyb3VwCkBAIC0xNzI2LDcgKzE3MDIsNyBAQAogCiAJbW92CQklaTMsICVvMwkJCQkhIElFVTEKIAltb3YJCSVpNCwgJW80CQkJCSEgSUVVMAlHcm91cAotCWFuZGNjCQklbDAsIF9USUZfU1lTQ0FMTF9UUkFDRSwgJWcwCQkhIElFVTEJR3JvdXArMSBidWJibGUKKwlhbmRjYwkJJWwwLCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKIAlibmUscG4JCSVpY2MsIGxpbnV4X3N5c2NhbGxfdHJhY2UJCSEgQ1RJCUdyb3VwCiAJIG1vdgkJJWkwLCAlbDUJCQkJISBJRVUwCiAyOgljYWxsCQklbDcJCQkJCSEgQ1RJCUdyb3VwIGJyayBmb3JjZWQKQEAgLTE3MzUsMTIgKzE3MTEsNiBAQAogCiAzOglzdHgJCSVvMCwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9JMF0KIHJldF9zeXNfY2FsbDoKLSNpZmRlZiBTWVNDQUxMX1RSQUNJTkcKLQltb3YJCSVvMCwgJW8xCi0JY2FsbAkJc3lzY2FsbF90cmFjZV9leGl0Ci0JIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQltb3YJCSVvMSwgJW8wCi0jZW5kaWYKIAlsZHgJCVslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfVFNUQVRFXSwgJWczCiAJbGR4CQlbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1ROUENdLCAlbDEgISBwYyA9IG5wYwogCXNyYQkJJW8wLCAwLCAlbzAKQEAgLTE3NjAsNyArMTczMCw3IEBACiAxOgogCWNtcAkJJW8wLCAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLCiAJYmdldSxwbgkJJXhjYywgMWYKLQkgYW5kY2MJCSVsMCwgX1RJRl9TWVNDQUxMX1RSQUNFLCAlbDYJCisJIGFuZGNjCQklbDAsIChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TRUNDT01QfF9USUZfU1lTQ0FMTF9BVURJVCksICVsNgogODA6CiAJLyogU3lzdGVtIGNhbGwgc3VjY2VzcywgY2xlYXIgQ2FycnkgY29uZGl0aW9uIGNvZGUuICovCiAJYW5kbgkJJWczLCAlZzIsICVnMwpAQCAtMTc3NSw3ICsxNzQ1LDcgQEAKIAkvKiBTeXN0ZW0gY2FsbCBmYWlsdXJlLCBzZXQgQ2FycnkgY29uZGl0aW9uIGNvZGUuCiAJICogQWxzbywgZ2V0IGFicyhlcnJubykgdG8gcmV0dXJuIHRvIHRoZSBwcm9jZXNzLgogCSAqLwotCWFuZGNjCQklbDAsIF9USUZfU1lTQ0FMTF9UUkFDRSwgJWw2CQorCWFuZGNjCQklbDAsIChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TRUNDT01QfF9USUZfU1lTQ0FMTF9BVURJVCksICVsNgkKIAlzdWIJCSVnMCwgJW8wLCAlbzAKIAlvcgkJJWczLCAlZzIsICVnMwogCXN0eAkJJW8wLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X0kwXQpAQCAtMTc4OCw4ICsxNzU4LDkgQEAKIAliLHB0CQkleGNjLCBydHJhcAogCSBzdHgJCSVsMiwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9UTlBDXQogbGludXhfc3lzY2FsbF90cmFjZTI6CisJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAogCWNhbGwJCXN5c2NhbGxfdHJhY2UKLQkgbm9wCisJIG1vdgkJMSwgJW8xCiAJc3R4CQklbDEsIFslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfVFBDXQogCWJhLHB0CQkleGNjLCBydHJhcAogCSBzdHgJCSVsMiwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9UTlBDXQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKaW5kZXggNDI0NzEyNS4uZGFhMmZiOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCkBAIC03MSwzMSArNzEsNyBAQAogc3RydWN0IGlycV93b3JrX3N0cnVjdCBfX2lycV93b3JrW05SX0NQVVNdOwogI2RlZmluZSBpcnFfd29yayhfX2NwdSwgX19waWwpCSYoX19pcnFfd29ya1soX19jcHUpXS5pcnFfd29ya2xpc3RzWyhfX3BpbCldKQogCi0jaWZkZWYgQ09ORklHX1BDSQotLyogVGhpcyBpcyBhIHRhYmxlIG9mIHBoeXNpY2FsIGFkZHJlc3NlcyB1c2VkIHRvIGRlYWwgd2l0aCBJQkZfRE1BX1NZTkMuCi0gKiBJdCBpcyB1c2VkIGZvciBQQ0kgb25seSB0byBzeW5jaHJvbml6ZSBETUEgdHJhbnNmZXJzIHdpdGggSVJRIGRlbGl2ZXJ5Ci0gKiBmb3IgZGV2aWNlcyBiZWhpbmQgYnVzc2VzIG90aGVyIHRoYW4gQVBCIG9uIFNhYnJlIHN5c3RlbXMuCi0gKgotICogQ3VycmVudGx5IHRoZXNlIHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUganVzdCBjb25maWcgc3BhY2UgYWNjZXNzZXMKLSAqIHRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIGZvciB0aGF0IGRldmljZS4KLSAqLwotdW5zaWduZWQgbG9uZyBwY2lfZG1hX3dzeW5jOwotdW5zaWduZWQgbG9uZyBkbWFfc3luY19yZWdfdGFibGVbMjU2XTsKLXVuc2lnbmVkIGNoYXIgZG1hX3N5bmNfcmVnX3RhYmxlX2VudHJ5ID0gMDsKLSNlbmRpZgotCi0vKiBUaGlzIGlzIGJhc2VkIHVwb24gY29kZSBpbiB0aGUgMzItYml0IFNwYXJjIGtlcm5lbCB3cml0dGVuIG1vc3RseSBieQotICogRGF2aWQgUmVkbWFuIChkamhyQHRhZHBvbGUuY28udWspLgotICovCi0jZGVmaW5lIE1BWF9TVEFUSUNfQUxMT0MJNAotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gc3RhdGljX2lycWFjdGlvbltNQVhfU1RBVElDX0FMTE9DXTsKLXN0YXRpYyBpbnQgc3RhdGljX2lycV9jb3VudDsKLQotLyogVGhpcyBpcyBleHBvcnRlZCBzbyB0aGF0IGZhc3QgSVJRIGhhbmRsZXJzIGNhbiBnZXQgYXQgaXQuLi4gLURhdmVNICovCi1zdHJ1Y3QgaXJxYWN0aW9uICppcnFfYWN0aW9uW05SX0lSUVMrMV0gPSB7Ci0JICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICwgTlVMTCwgTlVMTCwKLQkgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgLCBOVUxMLCBOVUxMCi19Oworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gKmlycV9hY3Rpb25bTlJfSVJRUysxXTsKIAogLyogVGhpcyBvbmx5IHN5bmNocm9uaXplcyBlbnRpdGllcyB3aGljaCBtb2RpZnkgSVJRIGhhbmRsZXIKICAqIHN0YXRlIGFuZCBzb21lIHNlbGVjdGVkIHVzZXItbGV2ZWwgc3BvdHMgdGhhdCB3YW50IHRvCkBAIC0yNDEsMTcgKzIxNywyMiBAQAogICogdGhlIENQVSAldGljayByZWdpc3RlciBhbmQgbm90IGJ5IHNvbWUgbm9ybWFsIHZlY3RvcmVkIGludGVycnVwdAogICogc291cmNlLiAgVG8gaGFuZGxlIHRoaXMgc3BlY2lhbCBjYXNlLCB3ZSB1c2UgdGhpcyBkdW1teSBJTk8gYnVja2V0LgogICovCitzdGF0aWMgc3RydWN0IGlycV9kZXNjIHBpbDBfZHVtbXlfZGVzYzsKIHN0YXRpYyBzdHJ1Y3QgaW5vX2J1Y2tldCBwaWwwX2R1bW15X2J1Y2tldCA9IHsKLQkwLAkvKiBpcnFfY2hhaW4gKi8KLQkwLAkvKiBwaWwgKi8KLQkwLAkvKiBwZW5kaW5nICovCi0JMCwJLyogZmxhZ3MgKi8KLQkwLAkvKiBfX3VudXNlZCAqLwotCU5VTEwsCS8qIGlycV9pbmZvICovCi0JMFVMLAkvKiBpY2xyICovCi0JMFVMLAkvKiBpbWFwICovCisJLmlycV9pbmZvCT0JJnBpbDBfZHVtbXlfZGVzYywKIH07CiAKK3N0YXRpYyB2b2lkIGJ1aWxkX2lycV9lcnJvcihjb25zdCBjaGFyICptc2csIHVuc2lnbmVkIGludCBpbm8sIGludCBwaWwsIGludCBpbm9maXh1cCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGljbHIsIHVuc2lnbmVkIGxvbmcgaW1hcCwKKwkJCSAgICBzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0KQoreworCXByb21fcHJpbnRmKCJJUlE6IElOTyAlMDR4ICglZDolMDE2bHg6JTAxNmx4KSAtLT4gIgorCQkgICAgIiglZDolZDolMDE2bHg6JTAxNmx4KSwgaGFsdGluZy4uLlxuIiwKKwkJICAgIGlubywgYnVja2V0LT5waWwsIGJ1Y2tldC0+aWNsciwgYnVja2V0LT5pbWFwLAorCQkgICAgcGlsLCBpbm9maXh1cCwgaWNsciwgaW1hcCk7CisJcHJvbV9oYWx0KCk7Cit9CisKIHVuc2lnbmVkIGludCBidWlsZF9pcnEoaW50IHBpbCwgaW50IGlub2ZpeHVwLCB1bnNpZ25lZCBsb25nIGljbHIsIHVuc2lnbmVkIGxvbmcgaW1hcCkKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0OwpAQCAtMjgwLDI4ICsyNjEsMzUgQEAKIAkJcHJvbV9oYWx0KCk7CiAJfQogCisJYnVja2V0ID0gJml2ZWN0b3JfdGFibGVbaW5vXTsKKwlpZiAoYnVja2V0LT5mbGFncyAmIElCRl9BQ1RJVkUpCisJCWJ1aWxkX2lycV9lcnJvcigiSVJROiBUcnlpbmcgdG8gYnVpbGQgYWN0aXZlIElOTyBidWNrZXQuXG4iLAorCQkJCWlubywgcGlsLCBpbm9maXh1cCwgaWNsciwgaW1hcCwgYnVja2V0KTsKKworCWlmIChidWNrZXQtPmlycV9pbmZvKSB7CisJCWlmIChidWNrZXQtPmltYXAgIT0gaW1hcCB8fCBidWNrZXQtPmljbHIgIT0gaWNscikKKwkJCWJ1aWxkX2lycV9lcnJvcigiSVJROiBUcnlpbmcgdG8gcmVpbml0IElOTyBidWNrZXQuXG4iLAorCQkJCQlpbm8sIHBpbCwgaW5vZml4dXAsIGljbHIsIGltYXAsIGJ1Y2tldCk7CisKKwkJZ290byBvdXQ7CisJfQorCisJYnVja2V0LT5pcnFfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFfZGVzYyksIEdGUF9BVE9NSUMpOworCWlmICghYnVja2V0LT5pcnFfaW5mbykgeworCQlwcm9tX3ByaW50ZigiSVJROiBFcnJvciwga21hbGxvYyhpcnFfZGVzYykgZmFpbGVkLlxuIik7CisJCXByb21faGFsdCgpOworCX0KKwltZW1zZXQoYnVja2V0LT5pcnFfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpcnFfZGVzYykpOworCiAJLyogT2ssIGxvb2tzIGdvb2QsIHNldCBpdCB1cC4gIERvbid0IHRvdWNoIHRoZSBpcnFfY2hhaW4gb3IKIAkgKiB0aGUgcGVuZGluZyBmbGFnLgogCSAqLwotCWJ1Y2tldCA9ICZpdmVjdG9yX3RhYmxlW2lub107Ci0JaWYgKChidWNrZXQtPmZsYWdzICYgSUJGX0FDVElWRSkgfHwKLQkgICAgKGJ1Y2tldC0+aXJxX2luZm8gIT0gTlVMTCkpIHsKLQkJLyogVGhpcyBpcyBhIGdyb3NzIGZhdGFsIGVycm9yIGlmIGl0IGhhcHBlbnMgaGVyZS4gKi8KLQkJcHJvbV9wcmludGYoIklSUTogVHJ5aW5nIHRvIHJlaW5pdCBJTk8gYnVja2V0LCBmYXRhbCBlcnJvci5cbiIpOwotCQlwcm9tX3ByaW50ZigiSVJROiBSZXF1ZXN0IElOTyAlMDR4ICglZDolZDolMDE2bHg6JTAxNmx4KVxuIiwKLQkJCSAgICBpbm8sIHBpbCwgaW5vZml4dXAsIGljbHIsIGltYXApOwotCQlwcm9tX3ByaW50ZigiSVJROiBFeGlzdGluZyAoJWQ6JTAxNmx4OiUwMTZseClcbiIsCi0JCQkgICAgYnVja2V0LT5waWwsIGJ1Y2tldC0+aWNsciwgYnVja2V0LT5pbWFwKTsKLQkJcHJvbV9wcmludGYoIklSUTogQ2Fubm90IGNvbnRpbnVlLCBoYWx0aW5nLi4uXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQogCWJ1Y2tldC0+aW1hcCAgPSBpbWFwOwogCWJ1Y2tldC0+aWNsciAgPSBpY2xyOwogCWJ1Y2tldC0+cGlsICAgPSBwaWw7CiAJYnVja2V0LT5mbGFncyA9IDA7CiAKLQlidWNrZXQtPmlycV9pbmZvID0gTlVMTDsKLQorb3V0OgogCXJldHVybiBfX2lycShidWNrZXQpOwogfQogCkBAIC0zMTksMjYgKzMwNyw2NSBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByICUwLCAweDAsICUlcHN0YXRlIiA6IDogInIiIChwc3RhdGUpKTsKIH0KIAorc3RhdGljIGludCBjaGVja19pcnFfc2hhcmluZyhpbnQgcGlsLCB1bnNpZ25lZCBsb25nIGlycWZsYWdzKQoreworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbiwgKnRtcDsKKworCWFjdGlvbiA9ICooaXJxX2FjdGlvbiArIHBpbCk7CisJaWYgKGFjdGlvbikgeworCQlpZiAoKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TSElSUSkgJiYgKGlycWZsYWdzICYgU0FfU0hJUlEpKSB7CisJCQlmb3IgKHRtcCA9IGFjdGlvbjsgdG1wLT5uZXh0OyB0bXAgPSB0bXAtPm5leHQpCisJCQkJOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX2lycV9hY3Rpb24oaW50IHBpbCwgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQoreworCXN0cnVjdCBpcnFhY3Rpb24gKipwcCA9IGlycV9hY3Rpb24gKyBwaWw7CisKKwl3aGlsZSAoKnBwKQorCQlwcCA9ICYoKCpwcCktPm5leHQpOworCSpwcCA9IGFjdGlvbjsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gKmdldF9hY3Rpb25fc2xvdChzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0KQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGJ1Y2tldC0+aXJxX2luZm87CisJaW50IG1heF9pcnEsIGk7CisKKwltYXhfaXJxID0gMTsKKwlpZiAoYnVja2V0LT5mbGFncyAmIElCRl9QQ0kpCisJCW1heF9pcnEgPSBNQVhfSVJRX0RFU0NfQUNUSU9OOworCWZvciAoaSA9IDA7IGkgPCBtYXhfaXJxOyBpKyspIHsKKwkJc3RydWN0IGlycWFjdGlvbiAqcCA9ICZkZXNjLT5hY3Rpb25baV07CisJCXUzMiBtYXNrID0gKDEgPDwgaSk7CisKKwkJaWYgKGRlc2MtPmFjdGlvbl9hY3RpdmVfbWFzayAmIG1hc2spCisJCQljb250aW51ZTsKKworCQlkZXNjLT5hY3Rpb25fYWN0aXZlX21hc2sgfD0gbWFzazsKKwkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworfQorCiBpbnQgcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCiAJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24sICp0bXAgPSBOVUxMOworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gX19idWNrZXQoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwZW5kaW5nID0gMDsKIAotCWlmICgoYnVja2V0ICE9ICZwaWwwX2R1bW15X2J1Y2tldCkgJiYKLQkgICAgKGJ1Y2tldCA8ICZpdmVjdG9yX3RhYmxlWzBdIHx8Ci0JICAgICBidWNrZXQgPj0gJml2ZWN0b3JfdGFibGVbTlVNX0lWRUNTXSkpIHsKLQkJdW5zaWduZWQgaW50ICpjYWxsZXI7Ci0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAlJWk3LCAlMCIgOiAiPXIiIChjYWxsZXIpKTsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAicmVxdWVzdF9pcnE6IE9sZCBzdHlsZSBJUlEgcmVnaXN0cnkgYXR0ZW1wdCAiCi0JCSAgICAgICAiZnJvbSAlcCwgaXJxICUwOHguXG4iLCBjYWxsZXIsIGlycSk7CisJaWYgKHVubGlrZWx5KCFoYW5kbGVyKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQkKLQlpZiAoIWhhbmRsZXIpCi0JICAgIHJldHVybiAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KCFidWNrZXQtPmlycV9pbmZvKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGJ1Y2tldCAhPSAmcGlsMF9kdW1teV9idWNrZXQpICYmIChpcnFmbGFncyAmIFNBX1NBTVBMRV9SQU5ET00pKSB7CiAJCS8qCkBAIC0zNTYsOTMgKzM4MywyMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwogCi0JYWN0aW9uID0gKihidWNrZXQtPnBpbCArIGlycV9hY3Rpb24pOwotCWlmIChhY3Rpb24pIHsKLQkJaWYgKChhY3Rpb24tPmZsYWdzICYgU0FfU0hJUlEpICYmIChpcnFmbGFncyAmIFNBX1NISVJRKSkKLQkJCWZvciAodG1wID0gYWN0aW9uOyB0bXAtPm5leHQ7IHRtcCA9IHRtcC0+bmV4dCkKLQkJCQk7Ci0JCWVsc2UgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWFjdGlvbiA9IE5VTEw7CQkvKiBPciBlbHNlISAqLworCWlmIChjaGVja19pcnFfc2hhcmluZyhidWNrZXQtPnBpbCwgaXJxZmxhZ3MpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCS8qIElmIHRoaXMgaXMgZmxhZ2dlZCBhcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0aGVuIHdlIHVzZSBvdXIKLQkgKiBwcml2YXRlIHN0cnVjdCB3aGljaCBpcyBuZXZlciBmcmVlZC4KLQkgKi8KLQlpZiAoaXJxZmxhZ3MgJiBTQV9TVEFUSUNfQUxMT0MpIHsKLQkgICAgaWYgKHN0YXRpY19pcnFfY291bnQgPCBNQVhfU1RBVElDX0FMTE9DKQotCQlhY3Rpb24gPSAmc3RhdGljX2lycWFjdGlvbltzdGF0aWNfaXJxX2NvdW50KytdOwotCSAgICBlbHNlCi0JCXByaW50aygiUmVxdWVzdCBmb3IgSVJRJWQgKCVzKSBTQV9TVEFUSUNfQUxMT0MgZmFpbGVkICIKLQkJICAgICAgICJ1c2luZyBrbWFsbG9jXG4iLCBpcnEsIG5hbWUpOwotCX0JCi0JaWYgKGFjdGlvbiA9PSBOVUxMKQotCSAgICBhY3Rpb24gPSAoc3RydWN0IGlycWFjdGlvbiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFhY3Rpb24pLAotCQkJCQkJIEdGUF9BVE9NSUMpOwotCQorCWFjdGlvbiA9IGdldF9hY3Rpb25fc2xvdChidWNrZXQpOwogCWlmICghYWN0aW9uKSB7IAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKGJ1Y2tldCA9PSAmcGlsMF9kdW1teV9idWNrZXQpIHsKLQkJYnVja2V0LT5pcnFfaW5mbyA9IGFjdGlvbjsKLQkJYnVja2V0LT5mbGFncyB8PSBJQkZfQUNUSVZFOwotCX0gZWxzZSB7Ci0JCWlmICgoYnVja2V0LT5mbGFncyAmIElCRl9BQ1RJVkUpICE9IDApIHsKLQkJCXZvaWQgKm9yaWcgPSBidWNrZXQtPmlycV9pbmZvOwotCQkJdm9pZCAqKnZlY3RvciA9IE5VTEw7Ci0KLQkJCWlmICgoYnVja2V0LT5mbGFncyAmIElCRl9QQ0kpID09IDApIHsKLQkJCQlwcmludGsoIklSUTogVHJ5aW5nIHRvIHNoYXJlIG5vbi1QQ0kgYnVja2V0LlxuIik7Ci0JCQkJZ290byBmcmVlX2FuZF9lYnVzeTsKLQkJCX0KLQkJCWlmICgoYnVja2V0LT5mbGFncyAmIElCRl9NVUxUSSkgPT0gMCkgewotCQkJCXZlY3RvciA9IGttYWxsb2Moc2l6ZW9mKHZvaWQgKikgKiA0LCBHRlBfQVRPTUlDKTsKLQkJCQlpZiAodmVjdG9yID09IE5VTEwpCi0JCQkJCWdvdG8gZnJlZV9hbmRfZW5vbWVtOwotCi0JCQkJLyogV2UgbWlnaHQgaGF2ZSBzbGVwdC4gKi8KLQkJCQlpZiAoKGJ1Y2tldC0+ZmxhZ3MgJiBJQkZfTVVMVEkpICE9IDApIHsKLQkJCQkJaW50IGVudDsKLQotCQkJCQlrZnJlZSh2ZWN0b3IpOwotCQkJCQl2ZWN0b3IgPSAodm9pZCAqKilidWNrZXQtPmlycV9pbmZvOwotCQkJCQlmb3IoZW50ID0gMDsgZW50IDwgNDsgZW50KyspIHsKLQkJCQkJCWlmICh2ZWN0b3JbZW50XSA9PSBOVUxMKSB7Ci0JCQkJCQkJdmVjdG9yW2VudF0gPSBhY3Rpb247Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGVudCA9PSA0KQotCQkJCQkJZ290byBmcmVlX2FuZF9lYnVzeTsKLQkJCQl9IGVsc2UgewotCQkJCQl2ZWN0b3JbMF0gPSBvcmlnOwotCQkJCQl2ZWN0b3JbMV0gPSBhY3Rpb247Ci0JCQkJCXZlY3RvclsyXSA9IE5VTEw7Ci0JCQkJCXZlY3RvclszXSA9IE5VTEw7Ci0JCQkJCWJ1Y2tldC0+aXJxX2luZm8gPSB2ZWN0b3I7Ci0JCQkJCWJ1Y2tldC0+ZmxhZ3MgfD0gSUJGX01VTFRJOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGVudDsKLQotCQkJCXZlY3RvciA9ICh2b2lkICoqKW9yaWc7Ci0JCQkJZm9yIChlbnQgPSAwOyBlbnQgPCA0OyBlbnQrKykgewotCQkJCQlpZiAodmVjdG9yW2VudF0gPT0gTlVMTCkgewotCQkJCQkJdmVjdG9yW2VudF0gPSBhY3Rpb247Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW50ID09IDQpCi0JCQkJCWdvdG8gZnJlZV9hbmRfZWJ1c3k7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlidWNrZXQtPmlycV9pbmZvID0gYWN0aW9uOwotCQkJYnVja2V0LT5mbGFncyB8PSBJQkZfQUNUSVZFOwotCQl9CisJYnVja2V0LT5mbGFncyB8PSBJQkZfQUNUSVZFOworCXBlbmRpbmcgPSAwOworCWlmIChidWNrZXQgIT0gJnBpbDBfZHVtbXlfYnVja2V0KSB7CiAJCXBlbmRpbmcgPSBidWNrZXQtPnBlbmRpbmc7CiAJCWlmIChwZW5kaW5nKQogCQkJYnVja2V0LT5wZW5kaW5nID0gMDsKQEAgLTQ1NiwxMCArNDEwLDcgQEAKIAlwdXRfaW5vX2luX2lycWFjdGlvbihhY3Rpb24sIGlycSk7CiAJcHV0X3NtcGFmZl9pbl9pcnFhY3Rpb24oYWN0aW9uLCBDUFVfTUFTS19OT05FKTsKIAotCWlmICh0bXApCi0JCXRtcC0+bmV4dCA9IGFjdGlvbjsKLQllbHNlCi0JCSooYnVja2V0LT5waWwgKyBpcnFfYWN0aW9uKSA9IGFjdGlvbjsKKwlhcHBlbmRfaXJxX2FjdGlvbihidWNrZXQtPnBpbCwgYWN0aW9uKTsKIAogCWVuYWJsZV9pcnEoaXJxKTsKIApAQCAtNDY4LDE0NyArNDE5LDEwMyBAQAogCQlhdG9taWNfYnVja2V0X2luc2VydChidWNrZXQpOwogCQlzZXRfc29mdGludCgxIDw8IGJ1Y2tldC0+cGlsKTsKIAl9CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKLQlpZiAoKGJ1Y2tldCAhPSAmcGlsMF9kdW1teV9idWNrZXQpICYmICghKGlycWZsYWdzICYgU0FfU1RBVElDX0FMTE9DKSkpCisKKwlpZiAoYnVja2V0ICE9ICZwaWwwX2R1bW15X2J1Y2tldCkKIAkJcmVnaXN0ZXJfaXJxX3Byb2MoX19pcnFfaW5vKGlycSkpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWRpc3RyaWJ1dGVfaXJxcygpOwogI2VuZGlmCiAJcmV0dXJuIDA7Ci0KLWZyZWVfYW5kX2VidXN5OgotCWtmcmVlKGFjdGlvbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FQlVTWTsKLQotZnJlZV9hbmRfZW5vbWVtOgotCWtmcmVlKGFjdGlvbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIEVYUE9SVF9TWU1CT0wocmVxdWVzdF9pcnEpOwogCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiAqdW5saW5rX2lycV9hY3Rpb24odW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQgPSBfX2J1Y2tldChpcnEpOworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbiwgKipwcDsKKworCXBwID0gaXJxX2FjdGlvbiArIGJ1Y2tldC0+cGlsOworCWFjdGlvbiA9ICpwcDsKKwlpZiAodW5saWtlbHkoIWFjdGlvbikpCisJCXJldHVybiBOVUxMOworCisJaWYgKHVubGlrZWx5KCFhY3Rpb24tPmhhbmRsZXIpKSB7CisJCXByaW50aygiRnJlZWluZyBmcmVlIElSUSAlZFxuIiwgYnVja2V0LT5waWwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aGlsZSAoYWN0aW9uICYmIGFjdGlvbi0+ZGV2X2lkICE9IGRldl9pZCkgeworCQlwcCA9ICZhY3Rpb24tPm5leHQ7CisJCWFjdGlvbiA9ICpwcDsKKwl9CisKKwlpZiAobGlrZWx5KGFjdGlvbikpCisJCSpwcCA9IGFjdGlvbi0+bmV4dDsKKworCXJldHVybiBhY3Rpb247Cit9CisKIHZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKLQlzdHJ1Y3QgaXJxYWN0aW9uICp0bXAgPSBOVUxMOworCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gX19idWNrZXQoaXJxKSwgKmJwOwogCi0JaWYgKChidWNrZXQgIT0gJnBpbDBfZHVtbXlfYnVja2V0KSAmJgotCSAgICAoYnVja2V0IDwgJml2ZWN0b3JfdGFibGVbMF0gfHwKLQkgICAgIGJ1Y2tldCA+PSAmaXZlY3Rvcl90YWJsZVtOVU1fSVZFQ1NdKSkgewotCQl1bnNpZ25lZCBpbnQgKmNhbGxlcjsKLQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUlaTcsICUwIiA6ICI9ciIgKGNhbGxlcikpOwotCQlwcmludGsoS0VSTl9DUklUICJmcmVlX2lycTogT2xkIHN0eWxlIElSUSByZW1vdmFsIGF0dGVtcHQgIgotCQkgICAgICAgImZyb20gJXAsIGlycSAlMDh4LlxuIiwgY2FsbGVyLCBpcnEpOwotCQlyZXR1cm47Ci0JfQotCQogCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKIAotCWFjdGlvbiA9ICooYnVja2V0LT5waWwgKyBpcnFfYWN0aW9uKTsKLQlpZiAoIWFjdGlvbi0+aGFuZGxlcikgewotCQlwcmludGsoIkZyZWVpbmcgZnJlZSBJUlEgJWRcbiIsIGJ1Y2tldC0+cGlsKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZGV2X2lkKSB7Ci0JCWZvciAoIDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpIHsKLQkJCWlmIChhY3Rpb24tPmRldl9pZCA9PSBkZXZfaWQpCi0JCQkJYnJlYWs7Ci0JCQl0bXAgPSBhY3Rpb247Ci0JCX0KLQkJaWYgKCFhY3Rpb24pIHsKLQkJCXByaW50aygiVHJ5aW5nIHRvIGZyZWUgZnJlZSBzaGFyZWQgSVJRICVkXG4iLCBidWNrZXQtPnBpbCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSBpZiAoYWN0aW9uLT5mbGFncyAmIFNBX1NISVJRKSB7Ci0JCXByaW50aygiVHJ5aW5nIHRvIGZyZWUgc2hhcmVkIElSUSAlZCB3aXRoIE5VTEwgZGV2aWNlIElEXG4iLCBidWNrZXQtPnBpbCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TVEFUSUNfQUxMT0MpIHsKLQkJcHJpbnRrKCJBdHRlbXB0IHRvIGZyZWUgc3RhdGljYWxseSBhbGxvY2F0ZWQgSVJRICVkICglcylcbiIsCi0JCSAgICAgICBidWNrZXQtPnBpbCwgYWN0aW9uLT5uYW1lKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYWN0aW9uICYmIHRtcCkKLQkJdG1wLT5uZXh0ID0gYWN0aW9uLT5uZXh0OwotCWVsc2UKLQkJKihidWNrZXQtPnBpbCArIGlycV9hY3Rpb24pID0gYWN0aW9uLT5uZXh0OworCWFjdGlvbiA9IHVubGlua19pcnFfYWN0aW9uKGlycSwgZGV2X2lkKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwogCisJaWYgKHVubGlrZWx5KCFhY3Rpb24pKQorCQlyZXR1cm47CisKIAlzeW5jaHJvbml6ZV9pcnEoaXJxKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKIAorCWJ1Y2tldCA9IF9fYnVja2V0KGlycSk7CiAJaWYgKGJ1Y2tldCAhPSAmcGlsMF9kdW1teV9idWNrZXQpIHsKKwkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gYnVja2V0LT5pcnFfaW5mbzsKIAkJdW5zaWduZWQgbG9uZyBpbWFwID0gYnVja2V0LT5pbWFwOwotCQl2b2lkICoqdmVjdG9yLCAqb3JpZzsKLQkJaW50IGVudDsKKwkJaW50IGVudCwgaTsKIAotCQlvcmlnID0gYnVja2V0LT5pcnFfaW5mbzsKLQkJdmVjdG9yID0gKHZvaWQgKiopb3JpZzsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JUlFfREVTQ19BQ1RJT047IGkrKykgeworCQkJc3RydWN0IGlycWFjdGlvbiAqcCA9ICZkZXNjLT5hY3Rpb25baV07CiAKLQkJaWYgKChidWNrZXQtPmZsYWdzICYgSUJGX01VTFRJKSAhPSAwKSB7Ci0JCQlpbnQgb3RoZXIgPSAwOwotCQkJdm9pZCAqb3JwaGFuID0gTlVMTDsKLQkJCWZvciAoZW50ID0gMDsgZW50IDwgNDsgZW50KyspIHsKLQkJCQlpZiAodmVjdG9yW2VudF0gPT0gYWN0aW9uKQotCQkJCQl2ZWN0b3JbZW50XSA9IE5VTEw7Ci0JCQkJZWxzZSBpZiAodmVjdG9yW2VudF0gIT0gTlVMTCkgewotCQkJCQlvcnBoYW4gPSB2ZWN0b3JbZW50XTsKLQkJCQkJb3RoZXIrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIE9ubHkgZnJlZSB3aGVuIG5vIG90aGVyIHNoYXJlZCBpcnEKLQkJCSAqIHVzZXMgdGhpcyBidWNrZXQuCi0JCQkgKi8KLQkJCWlmIChvdGhlcikgewotCQkJCWlmIChvdGhlciA9PSAxKSB7Ci0JCQkJCS8qIENvbnZlcnQgYmFjayB0byBub24tc2hhcmVkIGJ1Y2tldC4gKi8KLQkJCQkJYnVja2V0LT5pcnFfaW5mbyA9IG9ycGhhbjsKLQkJCQkJYnVja2V0LT5mbGFncyAmPSB+KElCRl9NVUxUSSk7Ci0JCQkJCWtmcmVlKHZlY3Rvcik7Ci0JCQkJfQotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9IGVsc2UgewotCQkJYnVja2V0LT5pcnFfaW5mbyA9IE5VTEw7Ci0JCX0KLQotCQkvKiBUaGlzIHVuaXF1ZSBpbnRlcnJ1cHQgc291cmNlIGlzIG5vdyBpbmFjdGl2ZS4gKi8KLQkJYnVja2V0LT5mbGFncyAmPSB+SUJGX0FDVElWRTsKLQotCQkvKiBTZWUgaWYgYW55IG90aGVyIGJ1Y2tldHMgc2hhcmUgdGhpcyBidWNrZXQncyBJTUFQCi0JCSAqIGFuZCBhcmUgc3RpbGwgYWN0aXZlLgotCQkgKi8KLQkJZm9yIChlbnQgPSAwOyBlbnQgPCBOVU1fSVZFQ1M7IGVudCsrKSB7Ci0JCQlicCA9ICZpdmVjdG9yX3RhYmxlW2VudF07Ci0JCQlpZiAoYnAgIT0gYnVja2V0CSYmCi0JCQkgICAgYnAtPmltYXAgPT0gaW1hcAkmJgotCQkJICAgIChicC0+ZmxhZ3MgJiBJQkZfQUNUSVZFKSAhPSAwKQorCQkJaWYgKHAgPT0gYWN0aW9uKSB7CisJCQkJZGVzYy0+YWN0aW9uX2FjdGl2ZV9tYXNrICY9IH4oMSA8PCBpKTsKIAkJCQlicmVhazsKKwkJCX0KIAkJfQogCi0JCS8qIE9ubHkgZGlzYWJsZSB3aGVuIG5vIG90aGVyIHN1Yi1pcnEgbGV2ZWxzIG9mCi0JCSAqIHRoZSBzYW1lIElNQVAgYXJlIGFjdGl2ZS4KLQkJICovCi0JCWlmIChlbnQgPT0gTlVNX0lWRUNTKQotCQkJZGlzYWJsZV9pcnEoaXJxKTsKKwkJaWYgKCFkZXNjLT5hY3Rpb25fYWN0aXZlX21hc2spIHsKKwkJCS8qIFRoaXMgdW5pcXVlIGludGVycnVwdCBzb3VyY2UgaXMgbm93IGluYWN0aXZlLiAqLworCQkJYnVja2V0LT5mbGFncyAmPSB+SUJGX0FDVElWRTsKKworCQkJLyogU2VlIGlmIGFueSBvdGhlciBidWNrZXRzIHNoYXJlIHRoaXMgYnVja2V0J3MgSU1BUAorCQkJICogYW5kIGFyZSBzdGlsbCBhY3RpdmUuCisJCQkgKi8KKwkJCWZvciAoZW50ID0gMDsgZW50IDwgTlVNX0lWRUNTOyBlbnQrKykgeworCQkJCXN0cnVjdCBpbm9fYnVja2V0ICpicCA9ICZpdmVjdG9yX3RhYmxlW2VudF07CisJCQkJaWYgKGJwICE9IGJ1Y2tldAkmJgorCQkJCSAgICBicC0+aW1hcCA9PSBpbWFwCSYmCisJCQkJICAgIChicC0+ZmxhZ3MgJiBJQkZfQUNUSVZFKSAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyogT25seSBkaXNhYmxlIHdoZW4gbm8gb3RoZXIgc3ViLWlycSBsZXZlbHMgb2YKKwkJCSAqIHRoZSBzYW1lIElNQVAgYXJlIGFjdGl2ZS4KKwkJCSAqLworCQkJaWYgKGVudCA9PSBOVU1fSVZFQ1MpCisJCQkJZGlzYWJsZV9pcnEoaXJxKTsKKwkJfQogCX0KIAotb3V0OgotCWtmcmVlKGFjdGlvbik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTY0Nyw5OSArNTU0LDU1IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi12b2lkIGNhdGNoX2Rpc2FibGVkX2l2ZWMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBwcm9jZXNzX2J1Y2tldChpbnQgaXJxLCBzdHJ1Y3QgaW5vX2J1Y2tldCAqYnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IF9fYnVja2V0KCppcnFfd29yayhjcHUsIDApKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBicC0+aXJxX2luZm87CisJdW5zaWduZWQgY2hhciBmbGFncyA9IGJwLT5mbGFnczsKKwl1MzIgYWN0aW9uX21hc2ssIGk7CisJaW50IHJhbmRvbTsKIAotCS8qIFdlIGNhbiBhY3R1YWxseSBzZWUgdGhpcyBvbiBVbHRyYS9QQ0kgUENJIGNhcmRzLCB3aGljaCBhcmUgYnJpZGdlcwotCSAqIHRvIG90aGVyIGRldmljZXMuICBIZXJlIGEgc2luZ2xlIElNQVAgZW5hYmxlZCBwb3RlbnRpYWxseSBtdWx0aXBsZQotCSAqIHVuaXF1ZSBpbnRlcnJ1cHQgc291cmNlcyAod2hpY2ggZWFjaCBkbyBoYXZlIGEgdW5pcXVlIElDTFIgcmVnaXN0ZXIuCi0JICoKLQkgKiBTbyB3aGF0IHdlIGRvIGlzIGp1c3QgcmVnaXN0ZXIgdGhhdCB0aGUgSVZFQyBhcnJpdmVkLCB3aGVuIHJlZ2lzdGVyZWQKLQkgKiBmb3IgcmVhbCB0aGUgcmVxdWVzdF9pcnEoKSBjb2RlIHdpbGwgY2hlY2sgdGhlIGJpdCBhbmQgc2lnbmFsCi0JICogYSBsb2NhbCBDUFUgaW50ZXJydXB0IGZvciBpdC4KLQkgKi8KLSNpZiAwCi0JcHJpbnRrKCJJVkVDOiBTcHVyaW91cyBpbnRlcnJ1cHQgdmVjdG9yICgleCkgcmVjZWl2ZWQgYXQgKCUwMTZseClcbiIsCi0JICAgICAgIGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdLCByZWdzLT50cGMpOwotI2VuZGlmCi0JKmlycV93b3JrKGNwdSwgMCkgPSAwOwotCWJ1Y2tldC0+cGVuZGluZyA9IDE7Ci19CisJYnAtPmZsYWdzIHw9IElCRl9JTlBST0dSRVNTOwogCi0vKiBUdW5lIHRoaXMuLi4gKi8KLSNkZWZpbmUgRk9SV0FSRF9WT0xVTUUJCTEyCi0KLSNpZmRlZiBDT05GSUdfU01QCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWRpcmVjdF9pbnRyKGludCBjcHUsIHN0cnVjdCBpbm9fYnVja2V0ICpicCkKLXsKLQkvKiBPaywgaGVyZSBpcyB3aGF0IGlzIGdvaW5nIG9uOgotCSAqIDEpIFJldGFyZ2V0aW5nIElSUXMgb24gU3RhcmZpcmUgaXMgdmVyeQotCSAqICAgIGV4cGVuc2l2ZSBzbyBqdXN0IGZvcmdldCBhYm91dCBpdCBvbiB0aGVtLgotCSAqIDIpIE1vdmluZyBhcm91bmQgdmVyeSBoaWdoIHByaW9yaXR5IGludGVycnVwdHMKLQkgKiAgICBpcyBhIGxvc2luZyBnYW1lLgotCSAqIDMpIElmIHRoZSBjdXJyZW50IGNwdSBpcyBpZGxlLCBpbnRlcnJ1cHRzIGFyZQotCSAqICAgIHVzZWZ1bCB3b3JrLCBzbyBrZWVwIHRoZW0gaGVyZS4gIEJ1dCBkbyBub3QKLQkgKiAgICBwYXNzIHRvIG91ciBuZWlnaGJvdXIgaWYgaGUgaXMgbm90IHZlcnkgaWRsZS4KLQkgKiA0KSBJZiBzeXNhZG1pbiBleHBsaWNpdGx5IGFza3MgZm9yIGRpcmVjdGVkIGludHJzLAotCSAqICAgIEp1c3QgRG8gSXQuCi0JICovCi0Jc3RydWN0IGlycWFjdGlvbiAqYXAgPSBicC0+aXJxX2luZm87Ci0JY3B1bWFza190IGNwdV9tYXNrOwotCXVuc2lnbmVkIGludCBidWRkeSwgdGlja3M7Ci0KLQljcHVfbWFzayA9IGdldF9zbXBhZmZfaW5faXJxYWN0aW9uKGFwKTsKLQljcHVzX2FuZChjcHVfbWFzaywgY3B1X21hc2ssIGNwdV9vbmxpbmVfbWFwKTsKLQlpZiAoY3B1c19lbXB0eShjcHVfbWFzaykpCi0JCWNwdV9tYXNrID0gY3B1X29ubGluZV9tYXA7Ci0KLQlpZiAodGhpc19pc19zdGFyZmlyZSAhPSAwIHx8Ci0JICAgIGJwLT5waWwgPj0gMTAgfHwgY3VycmVudC0+cGlkID09IDApCisJaWYgKHVubGlrZWx5KCEoZmxhZ3MgJiBJQkZfQUNUSVZFKSkpIHsKKwkJYnAtPnBlbmRpbmcgPSAxOwogCQlnb3RvIG91dDsKLQotCS8qICdjcHUnIGlzIHRoZSBNSUQgKGllLiBVUEFJRCksIGNhbGN1bGF0ZSB0aGUgTUlECi0JICogb2Ygb3VyIGJ1ZGR5LgotCSAqLwotCWJ1ZGR5ID0gY3B1ICsgMTsKLQlpZiAoYnVkZHkgPj0gTlJfQ1BVUykKLQkJYnVkZHkgPSAwOwotCi0JdGlja3MgPSAwOwotCXdoaWxlICghY3B1X2lzc2V0KGJ1ZGR5LCBjcHVfbWFzaykpIHsKLQkJaWYgKCsrYnVkZHkgPj0gTlJfQ1BVUykKLQkJCWJ1ZGR5ID0gMDsKLQkJaWYgKCsrdGlja3MgPiBOUl9DUFVTKSB7Ci0JCQlwdXRfc21wYWZmX2luX2lycWFjdGlvbihhcCwgQ1BVX01BU0tfTk9ORSk7Ci0JCQlnb3RvIG91dDsKLQkJfQogCX0KIAotCWlmIChidWRkeSA9PSBjcHUpCi0JCWdvdG8gb3V0OworCWlmIChkZXNjLT5wcmVfaGFuZGxlcikKKwkJZGVzYy0+cHJlX2hhbmRsZXIoYnAsCisJCQkJICBkZXNjLT5wcmVfaGFuZGxlcl9hcmcxLAorCQkJCSAgZGVzYy0+cHJlX2hhbmRsZXJfYXJnMik7CiAKLQkvKiBWb28tZG9vIHByb2dyYW1taW5nLiAqLwotCWlmIChjcHVfZGF0YShidWRkeSkuaWRsZV92b2x1bWUgPCBGT1JXQVJEX1ZPTFVNRSkKLQkJZ290byBvdXQ7CisJYWN0aW9uX21hc2sgPSBkZXNjLT5hY3Rpb25fYWN0aXZlX21hc2s7CisJcmFuZG9tID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lSUV9ERVNDX0FDVElPTjsgaSsrKSB7CisJCXN0cnVjdCBpcnFhY3Rpb24gKnAgPSAmZGVzYy0+YWN0aW9uW2ldOworCQl1MzIgbWFzayA9ICgxIDw8IGkpOwogCi0JLyogVGhpcyBqdXN0IHNvIGhhcHBlbnMgdG8gYmUgY29ycmVjdCBvbiBDaGVldGFoCi0JICogYXQgdGhlIG1vbWVudC4KLQkgKi8KLQlidWRkeSA8PD0gMjY7CisJCWlmICghKGFjdGlvbl9tYXNrICYgbWFzaykpCisJCQljb250aW51ZTsKIAotCS8qIFB1c2ggaXQgdG8gb3VyIGJ1ZGR5LiAqLwotCXVwYV93cml0ZWwoYnVkZHkgfCBJTUFQX1ZBTElELCBicC0+aW1hcCk7CisJCWFjdGlvbl9tYXNrICY9IH5tYXNrOwogCisJCWlmIChwLT5oYW5kbGVyKF9faXJxKGJwKSwgcC0+ZGV2X2lkLCByZWdzKSA9PSBJUlFfSEFORExFRCkKKwkJCXJhbmRvbSB8PSBwLT5mbGFnczsKKworCQlpZiAoIWFjdGlvbl9tYXNrKQorCQkJYnJlYWs7CisJfQorCWlmIChicC0+cGlsICE9IDApIHsKKwkJdXBhX3dyaXRlbChJQ0xSX0lETEUsIGJwLT5pY2xyKTsKKwkJLyogVGVzdCBhbmQgYWRkIGVudHJvcHkgKi8KKwkJaWYgKHJhbmRvbSAmIFNBX1NBTVBMRV9SQU5ET00pCisJCQlhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaXJxKTsKKwl9CiBvdXQ6Ci0JcmV0dXJuOworCWJwLT5mbGFncyAmPSB+SUJGX0lOUFJPR1JFU1M7CiB9CiAKLSNlbmRpZgotCiB2b2lkIGhhbmRsZXJfaXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBpbm9fYnVja2V0ICpicCwgKm5icDsKKwlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnA7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogI2lmbmRlZiBDT05GSUdfU01QCkBAIC03NTcsOCArNjIwLDYgQEAKIAkJY2xlYXJfc29mdGludChjbHJfbWFzayk7CiAJfQogI2Vsc2UKLQlpbnQgc2hvdWxkX2ZvcndhcmQgPSAwOwotCiAJY2xlYXJfc29mdGludCgxIDw8IGlycSk7CiAjZW5kaWYKIApAQCAtNzczLDYzICs2MzQsMTIgQEAKICNlbHNlCiAJYnAgPSBfX2J1Y2tldCh4Y2hnMzIoaXJxX3dvcmsoY3B1LCBpcnEpLCAwKSk7CiAjZW5kaWYKLQlmb3IgKCA7IGJwICE9IE5VTEw7IGJwID0gbmJwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSBicC0+ZmxhZ3M7Ci0JCXVuc2lnbmVkIGNoYXIgcmFuZG9tID0gMDsKKwl3aGlsZSAoYnApIHsKKwkJc3RydWN0IGlub19idWNrZXQgKm5icCA9IF9fYnVja2V0KGJwLT5pcnFfY2hhaW4pOwogCi0JCW5icCA9IF9fYnVja2V0KGJwLT5pcnFfY2hhaW4pOwogCQlicC0+aXJxX2NoYWluID0gMDsKLQotCQlicC0+ZmxhZ3MgfD0gSUJGX0lOUFJPR1JFU1M7Ci0KLQkJaWYgKChmbGFncyAmIElCRl9BQ1RJVkUpICE9IDApIHsKLSNpZmRlZiBDT05GSUdfUENJCi0JCQlpZiAoKGZsYWdzICYgSUJGX0RNQV9TWU5DKSAhPSAwKSB7Ci0JCQkJdXBhX3JlYWRsKGRtYV9zeW5jX3JlZ190YWJsZVticC0+c3luY3RhYl9lbnRdKTsKLQkJCQl1cGFfcmVhZHEocGNpX2RtYV93c3luYyk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWlmICgoZmxhZ3MgJiBJQkZfTVVMVEkpID09IDApIHsKLQkJCQlzdHJ1Y3QgaXJxYWN0aW9uICphcCA9IGJwLT5pcnFfaW5mbzsKLQkJCQlpbnQgcmV0OwotCi0JCQkJcmV0ID0gYXAtPmhhbmRsZXIoX19pcnEoYnApLCBhcC0+ZGV2X2lkLCByZWdzKTsKLQkJCQlpZiAocmV0ID09IElSUV9IQU5ETEVEKQotCQkJCQlyYW5kb20gfD0gYXAtPmZsYWdzOwotCQkJfSBlbHNlIHsKLQkJCQl2b2lkICoqdmVjdG9yID0gKHZvaWQgKiopYnAtPmlycV9pbmZvOwotCQkJCWludCBlbnQ7Ci0JCQkJZm9yIChlbnQgPSAwOyBlbnQgPCA0OyBlbnQrKykgewotCQkJCQlzdHJ1Y3QgaXJxYWN0aW9uICphcCA9IHZlY3RvcltlbnRdOwotCQkJCQlpZiAoYXAgIT0gTlVMTCkgewotCQkJCQkJaW50IHJldDsKLQotCQkJCQkJcmV0ID0gYXAtPmhhbmRsZXIoX19pcnEoYnApLAotCQkJCQkJCQkgIGFwLT5kZXZfaWQsCi0JCQkJCQkJCSAgcmVncyk7Ci0JCQkJCQlpZiAocmV0ID09IElSUV9IQU5ETEVEKQotCQkJCQkJCXJhbmRvbSB8PSBhcC0+ZmxhZ3M7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvKiBPbmx5IHRoZSBkdW1teSBidWNrZXQgbGFja3MgSU1BUC9JQ0xSLiAqLwotCQkJaWYgKGJwLT5waWwgIT0gMCkgewotI2lmZGVmIENPTkZJR19TTVAKLQkJCQlpZiAoc2hvdWxkX2ZvcndhcmQpIHsKLQkJCQkJcmVkaXJlY3RfaW50cihjcHUsIGJwKTsKLQkJCQkJc2hvdWxkX2ZvcndhcmQgPSAwOwotCQkJCX0KLSNlbmRpZgotCQkJCXVwYV93cml0ZWwoSUNMUl9JRExFLCBicC0+aWNscik7Ci0KLQkJCQkvKiBUZXN0IGFuZCBhZGQgZW50cm9weSAqLwotCQkJCWlmIChyYW5kb20gJiBTQV9TQU1QTEVfUkFORE9NKQotCQkJCQlhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaXJxKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlicC0+cGVuZGluZyA9IDE7Ci0KLQkJYnAtPmZsYWdzICY9IH5JQkZfSU5QUk9HUkVTUzsKKwkJcHJvY2Vzc19idWNrZXQoaXJxLCBicCwgcmVncyk7CisJCWJwID0gbmJwOwogCX0KIAlpcnFfZXhpdCgpOwogfQpAQCAtOTU5LDcgKzc2OSwxMCBAQAogCSAqLwogCWZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IE5SX0lSUVM7IGxldmVsKyspIHsKIAkJc3RydWN0IGlycWFjdGlvbiAqcCA9IGlycV9hY3Rpb25bbGV2ZWxdOwotCQlpZiAobGV2ZWwgPT0gMTIpIGNvbnRpbnVlOworCisJCWlmIChsZXZlbCA9PSAxMikKKwkJCWNvbnRpbnVlOworCiAJCXdoaWxlKHApIHsKIAkJCWNwdSA9IHJldGFyZ2V0X29uZV9pcnEocCwgY3B1KTsKIAkJCXAgPSBwLT5uZXh0OwpAQCAtMTEwNCw3ICs5MTcsOCBAQAogCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnAgPSBpdmVjdG9yX3RhYmxlICsgKGxvbmcpZGF0YTsKLQlzdHJ1Y3QgaXJxYWN0aW9uICphcCA9IGJwLT5pcnFfaW5mbzsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBicC0+aXJxX2luZm87CisJc3RydWN0IGlycWFjdGlvbiAqYXAgPSBkZXNjLT5hY3Rpb247CiAJY3B1bWFza190IG1hc2s7CiAJaW50IGxlbjsKIApAQCAtMTEyMiwxMSArOTM2LDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ludHJfYWZmaW5pdHkoaW50IGlycSwgY3B1bWFza190IGh3X2FmZikKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnAgPSBpdmVjdG9yX3RhYmxlICsgaXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGJwLT5pcnFfaW5mbzsKKwlzdHJ1Y3QgaXJxYWN0aW9uICphcCA9IGRlc2MtPmFjdGlvbjsKIAogCS8qIFVzZXJzIHNwZWNpZnkgYWZmaW5pdHkgaW4gdGVybXMgb2YgaHcgY3B1IGlkcy4KIAkgKiBBcyBzb29uIGFzIHdlIGRvIHRoaXMsIGhhbmRsZXJfaXJxKCkgbWlnaHQgc2VlIGFuZCB0YWtlIGFjdGlvbi4KIAkgKi8KLQlwdXRfc21wYWZmX2luX2lycWFjdGlvbigoc3RydWN0IGlycWFjdGlvbiAqKWJwLT5pcnFfaW5mbywgaHdfYWZmKTsKKwlwdXRfc21wYWZmX2luX2lycWFjdGlvbihhcCwgaHdfYWZmKTsKIAogCS8qIE1pZ3JhdGlvbiBpcyBzaW1wbHkgZG9uZSBieSB0aGUgbmV4dCBjcHUgdG8gc2VydmljZSB0aGlzCiAJICogaW50ZXJydXB0LgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYwppbmRleCBiZGFjNjMxLi5iYmYxMWY4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNDMzLDMgKzQzMyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworaW50IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCmluZGV4IDUzNDMyMGUuLjkxYWI0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCkBAIC0xMzAzLDggKzEzMDMsNyBAQAogewogCXU2NCB0bXA7CiAKLQkvKiBQUk9NIHNldHMgdGhlIElSUSByZXRyeSB2YWx1ZSB0b28gbG93LCBpbmNyZWFzZSBpdC4gKi8KLQlwc3ljaG9fd3JpdGUocC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX0lSUV9SRVRSWSwgMHhmZik7CisJcHN5Y2hvX3dyaXRlKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JUlFfUkVUUlksIDUpOwogCiAJLyogRW5hYmxlIGFyYml0ZXIgZm9yIGFsbCBQQ0kgc2xvdHMuICovCiAJdG1wID0gcHN5Y2hvX3JlYWQocC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUFfQ1RSTCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYwppbmRleCA1M2QzMzNiLi41MmJmMzQzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKQEAgLTU5NSw2ICs1OTUsMjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBXaGVuIGEgZGV2aWNlIGxpdmVzIGJlaGluZCBhIGJyaWRnZSBkZWVwZXIgaW4gdGhlIFBDSSBidXMgdG9wb2xvZ3kKKyAqIHRoYW4gQVBCLCBhIHNwZWNpYWwgc2VxdWVuY2UgbXVzdCBydW4gdG8gbWFrZSBzdXJlIGFsbCBwZW5kaW5nIERNQQorICogdHJhbnNmZXJzIGF0IHRoZSB0aW1lIG9mIElSUSBkZWxpdmVyeSBhcmUgdmlzaWJsZSBpbiB0aGUgY29oZXJlbmN5CisgKiBkb21haW4gYnkgdGhlIGNwdS4gIFRoaXMgc2VxdWVuY2UgaXMgdG8gcGVyZm9ybSBhIHJlYWQgb24gdGhlIGZhcgorICogc2lkZSBvZiB0aGUgbm9uLUFQQiBicmlkZ2UsIHRoZW4gcGVyZm9ybSBhIHJlYWQgb2YgU2FicmUncyBETUEKKyAqIHdyaXRlLXN5bmMgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHNhYnJlX3dzeW5jX2hhbmRsZXIoc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCwgdm9pZCAqX2FyZzEsIHZvaWQgKl9hcmcyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gX2FyZzE7CisJdW5zaWduZWQgbG9uZyBzeW5jX3JlZyA9ICh1bnNpZ25lZCBsb25nKSBfYXJnMjsKKwl1MTYgX3VudXNlZDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9WRU5ET1JfSUQsICZfdW51c2VkKTsKKwlzYWJyZV9yZWFkKHN5bmNfcmVnKTsKK30KKwogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgc2FicmVfaXJxX2J1aWxkKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKIAkJCQkJICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCSAgIHVuc2lnbmVkIGludCBpbm8pCkBAIC02MzksMjQgKzY1NiwxNCBAQAogCWlmIChwZGV2KSB7CiAJCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwogCi0JCS8qIFdoZW4gYSBkZXZpY2UgbGl2ZXMgYmVoaW5kIGEgYnJpZGdlIGRlZXBlciBpbiB0aGUKLQkJICogUENJIGJ1cyB0b3BvbG9neSB0aGFuIEFQQiwgYSBzcGVjaWFsIHNlcXVlbmNlIG11c3QKLQkJICogcnVuIHRvIG1ha2Ugc3VyZSBhbGwgcGVuZGluZyBETUEgdHJhbnNmZXJzIGF0IHRoZQotCQkgKiB0aW1lIG9mIElSUSBkZWxpdmVyeSBhcmUgdmlzaWJsZSBpbiB0aGUgY29oZXJlbmN5Ci0JCSAqIGRvbWFpbiBieSB0aGUgY3B1LiAgVGhpcyBzZXF1ZW5jZSBpcyB0byBwZXJmb3JtCi0JCSAqIGEgcmVhZCBvbiB0aGUgZmFyIHNpZGUgb2YgdGhlIG5vbi1BUEIgYnJpZGdlLCB0aGVuCi0JCSAqIHBlcmZvcm0gYSByZWFkIG9mIFNhYnJlJ3MgRE1BIHdyaXRlLXN5bmMgcmVnaXN0ZXIuCi0JCSAqCi0JCSAqIEN1cnJlbnRseSwgdGhlIFBDSV9DT05GSUcgcmVnaXN0ZXIgZm9yIHRoZSBkZXZpY2UKLQkJICogaXMgdXNlZCBmb3IgdGhpcyByZWFkIGZyb20gdGhlIGZhciBzaWRlIG9mIHRoZSBicmlkZ2UuCi0JCSAqLwogCQlpZiAocGRldi0+YnVzLT5udW1iZXIgIT0gcGNwLT5wYm0tPnBjaV9maXJzdF9idXNubykgewotCQkJYnVja2V0LT5mbGFncyB8PSBJQkZfRE1BX1NZTkM7Ci0JCQlidWNrZXQtPnN5bmN0YWJfZW50ID0gZG1hX3N5bmNfcmVnX3RhYmxlX2VudHJ5Kys7Ci0JCQlkbWFfc3luY19yZWdfdGFibGVbYnVja2V0LT5zeW5jdGFiX2VudF0gPQotCQkJCSh1bnNpZ25lZCBsb25nKSBzYWJyZV9wY2lfY29uZmlnX21rYWRkcigKLQkJCQkJcGNwLT5wYm0sCi0JCQkJCXBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbiwgUENJX0NPTU1BTkQpOworCQkJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAgPSBwY3AtPnBibS0+cGFyZW50OworCQkJc3RydWN0IGlycV9kZXNjICpkID0gYnVja2V0LT5pcnFfaW5mbzsKKworCQkJZC0+cHJlX2hhbmRsZXIgPSBzYWJyZV93c3luY19oYW5kbGVyOworCQkJZC0+cHJlX2hhbmRsZXJfYXJnMSA9IHBkZXY7CisJCQlkLT5wcmVfaGFuZGxlcl9hcmcyID0gKHZvaWQgKikKKwkJCQlwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9XUlNZTkM7CiAJCX0KIAl9CiAJcmV0dXJuIF9faXJxKGJ1Y2tldCk7CkBAIC0xNjI2LDEwICsxNjMzLDkgQEAKIAkgKi8KIAlwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgPSBwcl9yZWdzWzBdLnBoeXNfYWRkcjsKIAlwLT5wYm1fQi5jb250cm9sbGVyX3JlZ3MgPSBwcl9yZWdzWzBdLnBoeXNfYWRkcjsKLQlwY2lfZG1hX3dzeW5jID0gcC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgU0FCUkVfV1JTWU5DOwogCi0JcHJpbnRrKCJQQ0k6IEZvdW5kIFNBQlJFLCBtYWluIHJlZ3MgYXQgJTAxNmx4LCB3c3luYyBhdCAlMDE2bHhcbiIsCi0JICAgICAgIHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncywgcGNpX2RtYV93c3luYyk7CisJcHJpbnRrKCJQQ0k6IEZvdW5kIFNBQlJFLCBtYWluIHJlZ3MgYXQgJTAxNmx4XG4iLAorCSAgICAgICBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MpOwogCiAJLyogQ2xlYXIgaW50ZXJydXB0cyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IDU3NTMxNzUuLjZhMTgyYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS91cGEuaD4KKyNpbmNsdWRlIDxhc20vcHN0YXRlLmg+CiAKICNpbmNsdWRlICJwY2lfaW1wbC5oIgogI2luY2x1ZGUgImlvbW11X2NvbW1vbi5oIgpAQCAtMzI2LDYgKzMyNyw0NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHRvbWF0aWxsb193c3luY19oYW5kbGVyKHN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQsIHZvaWQgKl9hcmcxLCB2b2lkICpfYXJnMikKK3sKKwl1bnNpZ25lZCBsb25nIHN5bmNfcmVnID0gKHVuc2lnbmVkIGxvbmcpIF9hcmcyOworCXU2NCBtYXNrID0gMSA8PCAoX19pcnFfaW5vKF9faXJxKGJ1Y2tldCkpICYgSU1BUF9JTk8pOworCXU2NCB2YWw7CisJaW50IGxpbWl0OworCisJc2NoaXpvX3dyaXRlKHN5bmNfcmVnLCBtYXNrKTsKKworCWxpbWl0ID0gMTAwMDAwOworCXZhbCA9IDA7CisJd2hpbGUgKC0tbGltaXQpIHsKKwkJdmFsID0gc2NoaXpvX3JlYWQoc3luY19yZWcpOworCQlpZiAoISh2YWwgJiBtYXNrKSkKKwkJCWJyZWFrOworCX0KKwlpZiAobGltaXQgPD0gMCkgeworCQlwcmludGsoInRvbWF0aWxsb193c3luY19oYW5kbGVyOiBETUEgd29uJ3Qgc3luYyBbJWx4OiVseF1cbiIsCisJCSAgICAgICB2YWwsIG1hc2spOworCX0KKworCWlmIChfYXJnMSkgeworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBjYWNoZWxpbmVbNjRdCisJCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNjQpKSk7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkICUlZnBycywgJTBcblx0IgorCQkJCSAgICAgIm9yICUwLCAlNCwgJTFcblx0IgorCQkJCSAgICAgIndyICUxLCAweDAsICUlZnByc1xuXHQiCisJCQkJICAgICAic3RkYSAlJWYwLCBbJTVdICU2XG5cdCIKKwkJCQkgICAgICJ3ciAlMCwgMHgwLCAlJWZwcnNcblx0IgorCQkJCSAgICAgIm1lbWJhciAjU3luYyIKKwkJCQkgICAgIDogIj0mciIgKG1hc2spLCAiPSZyIiAodmFsKQorCQkJCSAgICAgOiAiMCIgKG1hc2spLCAiMSIgKHZhbCksCisJCQkJICAgICAiaSIgKEZQUlNfRkVGKSwgInIiICgmY2FjaGVsaW5lWzBdKSwKKwkJCQkgICAgICJpIiAoQVNJX0JMS19DT01NSVRfUCkpOworCX0KK30KKwogc3RhdGljIHVuc2lnbmVkIGludCBzY2hpem9faXJxX2J1aWxkKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKIAkJCQkgICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgdW5zaWduZWQgaW50IGlubykKQEAgLTM2OSw2ICs0MDgsMTUgQEAKIAlidWNrZXQgPSBfX2J1Y2tldChidWlsZF9pcnEocGlsLCBpZ25fZml4dXAsIGljbHIsIGltYXApKTsKIAlidWNrZXQtPmZsYWdzIHw9IElCRl9QQ0k7CiAKKwlpZiAocGRldiAmJiBwYm0tPmNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTykgeworCQlzdHJ1Y3QgaXJxX2Rlc2MgKnAgPSBidWNrZXQtPmlycV9pbmZvOworCisJCXAtPnByZV9oYW5kbGVyID0gdG9tYXRpbGxvX3dzeW5jX2hhbmRsZXI7CisJCXAtPnByZV9oYW5kbGVyX2FyZzEgPSAoKHBibS0+Y2hpcF92ZXJzaW9uIDw9IDQpID8KKwkJCQkgICAgICAgKHZvaWQgKikgMSA6ICh2b2lkICopIDApOworCQlwLT5wcmVfaGFuZGxlcl9hcmcyID0gKHZvaWQgKikgcGJtLT5zeW5jX3JlZzsKKwl9CisKIAlyZXR1cm4gX19pcnEoYnVja2V0KTsKIH0KIApAQCAtODg1LDYgKzkzMyw3IEBACiAKICNkZWZpbmUgU0NISVpPX1BDSV9DVFJMCQkoMHgyMDAwVUwpCiAjZGVmaW5lIFNDSElaT19QQ0lDVFJMX0JVU19VTlVTCSgxVUwgPDwgNjNVTCkgLyogU2FmYXJpICovCisjZGVmaW5lIFNDSElaT19QQ0lDVFJMX0RUT19JTlQJKDFVTCA8PCA2MVVMKSAvKiBUb21hdGlsbG8gKi8KICNkZWZpbmUgU0NISVpPX1BDSUNUUkxfQVJCX1BSSU8gKDB4MWZmIDw8IDUyVUwpIC8qIFRvbWF0aWxsbyAqLwogI2RlZmluZSBTQ0hJWk9fUENJQ1RSTF9FU0xDSwkoMVVMIDw8IDUxVUwpIC8qIFNhZmFyaSAqLwogI2RlZmluZSBTQ0hJWk9fUENJQ1RSTF9FUlJTTE9UCSg3VUwgPDwgNDhVTCkgLyogU2FmYXJpICovCkBAIC0xODg3LDM3ICsxOTM2LDI3IEBACiB7CiAJdTY0IHRtcDsKIAotCS8qIFNldCBJUlEgcmV0cnkgdG8gaW5maW5pdHkuICovCi0Jc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0lSUV9SRVRSWSwKLQkJICAgICBTQ0hJWk9fSVJRX1JFVFJZX0lORik7CisJc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0lSUV9SRVRSWSwgNSk7CiAKLQkvKiBFbmFibGUgYXJiaXRlciBmb3IgYWxsIFBDSSBzbG90cy4gIEFsc28sIGRpc2FibGUgUENJIGludGVydmFsCi0JICogdGltZXIgc28gdGhhdCBEVE8gKERpc2NhcmQgVGltZU91dHMpIGFyZSBub3QgcmVwb3J0ZWQgYmVjYXVzZQotCSAqIHNvbWUgU2NoaXpvIHJldmlzaW9ucyByZXBvcnQgdGhlbSBlcnJvbmVvdXNseS4KLQkgKi8KIAl0bXAgPSBzY2hpem9fcmVhZChwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMKTsKLQlpZiAocGJtLT5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9TQ0hJWk9fUExVUyAmJgotCSAgICBwYm0tPmNoaXBfdmVyc2lvbiA9PSAweDUgJiYKLQkgICAgcGJtLT5jaGlwX3JldmlzaW9uID09IDB4MSkKLQkJdG1wIHw9IDB4MGY7Ci0JZWxzZQotCQl0bXAgfD0gMHhmZjsKIAotCXRtcCAmPSB+U0NISVpPX1BDSUNUUkxfUFRPOworCS8qIEVuYWJsZSBhcmJpdGVyIGZvciBhbGwgUENJIHNsb3RzLiAgKi8KKwl0bXAgfD0gMHhmZjsKKwogCWlmIChwYm0tPmNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTyAmJgogCSAgICBwYm0tPmNoaXBfdmVyc2lvbiA+PSAweDIpCiAJCXRtcCB8PSAweDNVTCA8PCBTQ0hJWk9fUENJQ1RSTF9QVE9fU0hJRlQ7Ci0JZWxzZQotCQl0bXAgfD0gMHgxVUwgPDwgU0NISVpPX1BDSUNUUkxfUFRPX1NISUZUOwogCiAJaWYgKCFwcm9tX2dldGJvb2wocGJtLT5wcm9tX25vZGUsICJuby1idXMtcGFya2luZyIpKQogCQl0bXAgfD0gU0NISVpPX1BDSUNUUkxfUEFSSzsKKwllbHNlCisJCXRtcCAmPSB+U0NISVpPX1BDSUNUUkxfUEFSSzsKIAogCWlmIChwYm0tPmNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTyAmJgogCSAgICBwYm0tPmNoaXBfdmVyc2lvbiA8PSAweDEpCi0JCXRtcCB8PSAoMVVMIDw8IDYxKTsKKwkJdG1wIHw9IFNDSElaT19QQ0lDVFJMX0RUT19JTlQ7CiAJZWxzZQotCQl0bXAgJj0gfigxVUwgPDwgNjEpOworCQl0bXAgJj0gflNDSElaT19QQ0lDVFJMX0RUT19JTlQ7CiAKIAlpZiAocGJtLT5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8pCiAJCXRtcCB8PSAoU0NISVpPX1BDSUNUUkxfTVJNX1BSRUYgfApAQCAtMjAxNSw2ICsyMDU0LDkgQEAKIAlwYm0tPnBibV9yZWdzID0gcHJfcmVnc1swXS5waHlzX2FkZHI7CiAJcGJtLT5jb250cm9sbGVyX3JlZ3MgPSBwcl9yZWdzWzFdLnBoeXNfYWRkciAtIDB4MTAwMDBVTDsKIAorCWlmIChjaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8pCisJCXBibS0+c3luY19yZWcgPSBwcl9yZWdzWzNdLnBoeXNfYWRkciArIDB4MWExOFVMOworCiAJc3ByaW50ZihwYm0tPm5hbWUsCiAJCShjaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8gPwogCQkgIlRPTUFUSUxMTyVkIFBCTSVjIiA6CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKaW5kZXggNTJmMTRlMy4uNTMzMTA0YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYwpAQCAtNCw2ICs0LDggQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCiAgKi8KIAorI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCisKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTE3LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxhc20vZWJ1cy5oPgogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgogCi0jZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDgwYTc2ZTIuLjIzYWQ4MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYwpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KIAogI2luY2x1ZGUgPGFzbS9hc2kuaD4KQEAgLTYyOCwxNSArNjMwLDI3IEBACiAJdW5sb2NrX2tlcm5lbCgpOwogfQogCi1hc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZSh2b2lkKQorYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBzeXNjYWxsX2V4aXRfcCkKIHsKLSNpZmRlZiBERUJVR19QVFJBQ0UKLQlwcmludGsoIiVzIFslZF06IHN5c2NhbGxfdHJhY2VcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7Ci0jZW5kaWYKLQlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQotCQlyZXR1cm47CisJLyogZG8gdGhlIHNlY3VyZSBjb21wdXRpbmcgY2hlY2sgZmlyc3QgKi8KKwlzZWN1cmVfY29tcHV0aW5nKHJlZ3MtPnVfcmVnc1tVUkVHX0cxXSk7CisKKwlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkgJiYgc3lzY2FsbF9leGl0X3ApIHsKKwkJdW5zaWduZWQgbG9uZyB0c3RhdGUgPSByZWdzLT50c3RhdGU7CisJCWludCByZXN1bHQgPSBBVURJVFNDX1NVQ0NFU1M7CisKKwkJaWYgKHVubGlrZWx5KHRzdGF0ZSAmIChUU1RBVEVfWENBUlJZIHwgVFNUQVRFX0lDQVJSWSkpKQorCQkJcmVzdWx0ID0gQVVESVRTQ19GQUlMVVJFOworCisJCWF1ZGl0X3N5c2NhbGxfZXhpdChjdXJyZW50LCByZXN1bHQsIHJlZ3MtPnVfcmVnc1tVUkVHX0kwXSk7CisJfQorCiAJaWYgKCEoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CisKKwlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorCQlnb3RvIG91dDsKKwogCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKQogCQkJCSA/IDB4ODAgOiAwKSk7CiAKQEAgLTY0NSwxMiArNjU5LDIwIEBACiAJICogZm9yIG5vcm1hbCB1c2UuICBzdHJhY2Ugb25seSBjb250aW51ZXMgd2l0aCBhIHNpZ25hbCBpZiB0aGUKIAkgKiBzdG9wcGluZyBzaWduYWwgaXMgbm90IFNJR1RSQVAuICAtYnJsCiAJICovCi0jaWZkZWYgREVCVUdfUFRSQUNFCi0JcHJpbnRrKCIlcyBbJWRdOiBzeXNjYWxsX3RyYWNlIGV4aXQ9ICV4XG4iLCBjdXJyZW50LT5jb21tLAotCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmV4aXRfY29kZSk7Ci0jZW5kaWYKIAlpZiAoY3VycmVudC0+ZXhpdF9jb2RlKSB7Ci0JCXNlbmRfc2lnIChjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOworCQlzZW5kX3NpZyhjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOwogCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOwogCX0KKworb3V0OgorCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSAmJiAhc3lzY2FsbF9leGl0X3ApCisJCWF1ZGl0X3N5c2NhbGxfZW50cnkoY3VycmVudCwKKwkJCQkgICAgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSA/CisJCQkJICAgICBBVURJVF9BUkNIX1NQQVJDIDoKKwkJCQkgICAgIEFVRElUX0FSQ0hfU1BBUkM2NCksCisJCQkJICAgIHJlZ3MtPnVfcmVnc1tVUkVHX0cxXSwKKwkJCQkgICAgcmVncy0+dV9yZWdzW1VSRUdfSTBdLAorCQkJCSAgICByZWdzLT51X3JlZ3NbVVJFR19JMV0sCisJCQkJICAgIHJlZ3MtPnVfcmVnc1tVUkVHX0kyXSwKKwkJCQkgICAgcmVncy0+dV9yZWdzW1VSRUdfSTNdKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCmluZGV4IGU1YjljN2EuLjdlOGUyOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwpAQCAtNDUsOCArNDUsOCBAQAogLyogUGxlYXNlIGRvbid0IG1ha2UgdGhpcyBzdHVmZiBpbml0ZGF0YSEhISAgLS1EYXZlTSAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7CiAKLWNwdW1hc2tfdCBjcHVfb25saW5lX21hcCA9IENQVV9NQVNLX05PTkU7Ci1jcHVtYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXAgPSBDUFVfTUFTS19OT05FOworY3B1bWFza190IGNwdV9vbmxpbmVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOworY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogc3RhdGljIGNwdW1hc2tfdCBzbXBfY29tbWVuY2VkX21hc2s7CiBzdGF0aWMgY3B1bWFza190IGNwdV9jYWxsb3V0X21hcDsKIApAQCAtMTU1LDcgKzE1NSw3IEBACiAJcGFuaWMoIlNNUCBib2xpeGVkXG4iKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aWNrX29mZnNldDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGlja19vZmZzZXQgX19yZWFkX21vc3RseTsKIAogLyogVGhpcyB0aWNrIHJlZ2lzdGVyIHN5bmNocm9uaXphdGlvbiBzY2hlbWUgaXMgdGFrZW4gZW50aXJlbHkgZnJvbQogICogdGhlIGlhNjQgcG9ydCwgc2VlIGFyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jIGZvciBkZXRhaWxzIGFuZCBjcmVkaXQuCkBAIC0xMTkzLDggKzExOTMsOCBAQAogewogfQogCi11bnNpZ25lZCBsb25nIF9fcGVyX2NwdV9iYXNlOwotdW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfc2hpZnQ7Cit1bnNpZ25lZCBsb25nIF9fcGVyX2NwdV9iYXNlIF9fcmVhZF9tb3N0bHk7Cit1bnNpZ25lZCBsb25nIF9fcGVyX2NwdV9zaGlmdCBfX3JlYWRfbW9zdGx5OwogCiBFWFBPUlRfU1lNQk9MKF9fcGVyX2NwdV9iYXNlKTsKIEVYUE9SVF9TWU1CT0woX19wZXJfY3B1X3NoaWZ0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKaW5kZXggNTZjZDk2Zi4uOTIwMmQ5MiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKQEAgLTc5LDcgKzc5LDcgQEAKIGV4dGVybiB2b2lkIHJ0cmFwKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgc29sYXJpc19zeXNjYWxsKHZvaWQpOwotZXh0ZXJuIHZvaWQgc3lzY2FsbF90cmFjZSh2b2lkKTsKK2V4dGVybiB2b2lkIHN5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKiwgaW50KTsKIGV4dGVybiB1MzIgc3Vub3Nfc3lzX3RhYmxlW10sIHN5c19jYWxsX3RhYmxlMzJbXTsKIGV4dGVybiB2b2lkIHRsMF9zb2xhcmlzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3lzX3NpZ3N1c3BlbmQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5czMyLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5czMyLlMKaW5kZXggNWE5NWU5OC4uNWY5ZTRmYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXMzMi5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzMzIuUwpAQCAtMTM1LDYgKzEzNSw4IEBACiBTSUdOMyhzeXMzMl9zb2NrZXRwYWlyLCBzeXNfc29ja2V0cGFpciwgJW8wLCAlbzEsICVvMikKIFNJR04xKHN5czMyX2dldHBlZXJuYW1lLCBzeXNfZ2V0cGVlcm5hbWUsICVvMCkKIFNJR04xKHN5czMyX2dldHNvY2tuYW1lLCBzeXNfZ2V0c29ja25hbWUsICVvMCkKK1NJR04yKHN5czMyX2lvcHJpb19nZXQsIHN5c19pb3ByaW9fZ2V0LCAlbzAsICVvMSkKK1NJR04zKHN5czMyX2lvcHJpb19zZXQsIHN5c19pb3ByaW9fc2V0LCAlbzAsICVvMSwgJW8yKQogCiAJLmdsb2JsCQlzeXMzMl9tbWFwMgogc3lzMzJfbW1hcDI6CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TCmluZGV4IGE1ZTM2YTQuLmJjZWI5MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TCkBAIC01OSwxMSArNTksMTEgQEAKIC8qMTgwKi8JLndvcmQgc3lzMzJfZmxpc3R4YXR0ciwgc3lzX3JlbW92ZXhhdHRyLCBzeXNfbHJlbW92ZXhhdHRyLCBjb21wYXRfc3lzX3NpZ3BlbmRpbmcsIHN5c19uaV9zeXNjYWxsCiAJLndvcmQgc3lzMzJfc2V0cGdpZCwgc3lzMzJfZnJlbW92ZXhhdHRyLCBzeXMzMl90a2lsbCwgc3lzMzJfZXhpdF9ncm91cCwgc3BhcmM2NF9uZXd1bmFtZQogLyoxOTAqLwkud29yZCBzeXMzMl9pbml0X21vZHVsZSwgc3BhcmM2NF9wZXJzb25hbGl0eSwgc3lzX3JlbWFwX2ZpbGVfcGFnZXMsIHN5czMyX2Vwb2xsX2NyZWF0ZSwgc3lzMzJfZXBvbGxfY3RsCi0JLndvcmQgc3lzMzJfZXBvbGxfd2FpdCwgc3lzX25pc19zeXNjYWxsLCBzeXNfZ2V0cHBpZCwgc3lzMzJfc2lnYWN0aW9uLCBzeXNfc2dldG1hc2sKKwkud29yZCBzeXMzMl9lcG9sbF93YWl0LCBzeXMzMl9pb3ByaW9fc2V0LCBzeXNfZ2V0cHBpZCwgc3lzMzJfc2lnYWN0aW9uLCBzeXNfc2dldG1hc2sKIC8qMjAwKi8JLndvcmQgc3lzMzJfc3NldG1hc2ssIHN5c19zaWdzdXNwZW5kLCBjb21wYXRfc3lzX25ld2xzdGF0LCBzeXNfdXNlbGliLCBjb21wYXRfc3lzX29sZF9yZWFkZGlyCiAJLndvcmQgc3lzMzJfcmVhZGFoZWFkLCBzeXMzMl9zb2NrZXRjYWxsLCBzeXMzMl9zeXNsb2csIHN5czMyX2xvb2t1cF9kY29va2llLCBzeXMzMl9mYWR2aXNlNjQKIC8qMjEwKi8JLndvcmQgc3lzMzJfZmFkdmlzZTY0XzY0LCBzeXMzMl90Z2tpbGwsIHN5czMyX3dhaXRwaWQsIHN5c19zd2Fwb2ZmLCBzeXMzMl9zeXNpbmZvCi0JLndvcmQgc3lzMzJfaXBjLCBzeXMzMl9zaWdyZXR1cm4sIHN5c19jbG9uZSwgc3lzX25pc19zeXNjYWxsLCBzeXMzMl9hZGp0aW1leAorCS53b3JkIHN5czMyX2lwYywgc3lzMzJfc2lncmV0dXJuLCBzeXNfY2xvbmUsIHN5czMyX2lvcHJpb19nZXQsIHN5czMyX2FkanRpbWV4CiAvKjIyMCovCS53b3JkIHN5czMyX3NpZ3Byb2NtYXNrLCBzeXNfbmlfc3lzY2FsbCwgc3lzMzJfZGVsZXRlX21vZHVsZSwgc3lzX25pX3N5c2NhbGwsIHN5czMyX2dldHBnaWQKIAkud29yZCBzeXMzMl9iZGZsdXNoLCBzeXMzMl9zeXNmcywgc3lzX25pc19zeXNjYWxsLCBzeXMzMl9zZXRmc3VpZDE2LCBzeXMzMl9zZXRmc2dpZDE2CiAvKjIzMCovCS53b3JkIHN5czMyX3NlbGVjdCwgY29tcGF0X3N5c190aW1lLCBzeXNfbmlzX3N5c2NhbGwsIGNvbXBhdF9zeXNfc3RpbWUsIGNvbXBhdF9zeXNfc3RhdGZzNjQKQEAgLTEyNSwxMSArMTI1LDExIEBACiAvKjE4MCovCS53b3JkIHN5c19mbGlzdHhhdHRyLCBzeXNfcmVtb3ZleGF0dHIsIHN5c19scmVtb3ZleGF0dHIsIHN5c19uaXNfc3lzY2FsbCwgc3lzX25pX3N5c2NhbGwKIAkud29yZCBzeXNfc2V0cGdpZCwgc3lzX2ZyZW1vdmV4YXR0ciwgc3lzX3RraWxsLCBzeXNfZXhpdF9ncm91cCwgc3BhcmM2NF9uZXd1bmFtZQogLyoxOTAqLwkud29yZCBzeXNfaW5pdF9tb2R1bGUsIHNwYXJjNjRfcGVyc29uYWxpdHksIHN5c19yZW1hcF9maWxlX3BhZ2VzLCBzeXNfZXBvbGxfY3JlYXRlLCBzeXNfZXBvbGxfY3RsCi0JLndvcmQgc3lzX2Vwb2xsX3dhaXQsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2dldHBwaWQsIHN5c19uaXNfc3lzY2FsbCwgc3lzX3NnZXRtYXNrCisJLndvcmQgc3lzX2Vwb2xsX3dhaXQsIHN5c19pb3ByaW9fc2V0LCBzeXNfZ2V0cHBpZCwgc3lzX25pc19zeXNjYWxsLCBzeXNfc2dldG1hc2sKIC8qMjAwKi8JLndvcmQgc3lzX3NzZXRtYXNrLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19uZXdsc3RhdCwgc3lzX3VzZWxpYiwgc3lzX25pc19zeXNjYWxsCiAJLndvcmQgc3lzX3JlYWRhaGVhZCwgc3lzX3NvY2tldGNhbGwsIHN5c19zeXNsb2csIHN5c19sb29rdXBfZGNvb2tpZSwgc3lzX2ZhZHZpc2U2NAogLyoyMTAqLwkud29yZCBzeXNfZmFkdmlzZTY0XzY0LCBzeXNfdGdraWxsLCBzeXNfd2FpdHBpZCwgc3lzX3N3YXBvZmYsIHN5c19zeXNpbmZvCi0JLndvcmQgc3lzX2lwYywgc3lzX25pc19zeXNjYWxsLCBzeXNfY2xvbmUsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2FkanRpbWV4CisJLndvcmQgc3lzX2lwYywgc3lzX25pc19zeXNjYWxsLCBzeXNfY2xvbmUsIHN5c19pb3ByaW9fZ2V0LCBzeXNfYWRqdGltZXgKIC8qMjIwKi8JLndvcmQgc3lzX25pc19zeXNjYWxsLCBzeXNfbmlfc3lzY2FsbCwgc3lzX2RlbGV0ZV9tb2R1bGUsIHN5c19uaV9zeXNjYWxsLCBzeXNfZ2V0cGdpZAogCS53b3JkIHN5c19iZGZsdXNoLCBzeXNfc3lzZnMsIHN5c19uaXNfc3lzY2FsbCwgc3lzX3NldGZzdWlkLCBzeXNfc2V0ZnNnaWQKIC8qMjMwKi8JLndvcmQgc3lzX3NlbGVjdCwgc3lzX25pc19zeXNjYWxsLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zdGltZSwgc3lzX3N0YXRmczY0CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCmluZGV4IDcxYjRlMzguLjM2MmI5YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCkBAIC03Myw3ICs3Myw3IEBACiAJLmdldF90aWNrCT0gZHVtbXlfZ2V0X3RpY2ssCiB9OwogCi1zdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyAqdGlja19vcHMgPSAmZHVtbXlfdGlja19vcHM7CitzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyAqdGlja19vcHMgX19yZWFkX21vc3RseSA9ICZkdW1teV90aWNrX29wczsKIAogI2RlZmluZSBUSUNLX1BSSVZfQklUCSgxVUwgPDwgNjMpCiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiBuZXdfdGljazsKIH0KIAotc3RhdGljIHN0cnVjdCBzcGFyYzY0X3RpY2tfb3BzIHRpY2tfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyB0aWNrX29wZXJhdGlvbnMgX19yZWFkX21vc3RseSA9IHsKIAkuaW5pdF90aWNrCT0JdGlja19pbml0X3RpY2ssCiAJLmdldF90aWNrCT0JdGlja19nZXRfdGljaywKIAkuZ2V0X2NvbXBhcmUJPQl0aWNrX2dldF9jb21wYXJlLApAQCAtMjc2LDcgKzI3Niw3IEBACiAJcmV0dXJuIG5ld19jb21wYXJlOwogfQogCi1zdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgc3RpY2tfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyBzdGlja19vcGVyYXRpb25zIF9fcmVhZF9tb3N0bHkgPSB7CiAJLmluaXRfdGljawk9CXN0aWNrX2luaXRfdGljaywKIAkuZ2V0X3RpY2sJPQlzdGlja19nZXRfdGljaywKIAkuZ2V0X2NvbXBhcmUJPQlzdGlja19nZXRfY29tcGFyZSwKQEAgLTQyMiw3ICs0MjIsNyBAQAogCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyBoYnRpY2tfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyBoYnRpY2tfb3BlcmF0aW9ucyBfX3JlYWRfbW9zdGx5ID0gewogCS5pbml0X3RpY2sJPQloYnRpY2tfaW5pdF90aWNrLAogCS5nZXRfdGljawk9CWhidGlja19nZXRfdGljaywKIAkuZ2V0X2NvbXBhcmUJPQloYnRpY2tfZ2V0X2NvbXBhcmUsCkBAIC00MzcsMTAgKzQzNyw5IEBACiAgKiBOT1RFOiBPbiBTVU41IHN5c3RlbXMgdGhlIHRpY2tlciBpbnRlcnJ1cHQgY29tZXMgaW4gdXNpbmcgMgogICogICAgICAgaW50ZXJydXB0cywgb25lIGF0IGxldmVsMTQgYW5kIG9uZSB3aXRoIHNvZnRpbnQgYml0IDAuCiAgKi8KLXVuc2lnbmVkIGxvbmcgdGltZXJfdGlja19vZmZzZXQ7Ci11bnNpZ25lZCBsb25nIHRpbWVyX3RpY2tfY29tcGFyZTsKK3Vuc2lnbmVkIGxvbmcgdGltZXJfdGlja19vZmZzZXQgX19yZWFkX21vc3RseTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfdGlja3NfcGVyX25zZWNfcXVvdGllbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcl90aWNrc19wZXJfbnNlY19xdW90aWVudCBfX3JlYWRfbW9zdGx5OwogCiAjZGVmaW5lIFRJQ0tfU0laRSAodGlja19uc2VjIC8gMTAwMCkKIApAQCAtNDY0LDcgKzQ2Myw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyB0aWNrcywgcHN0YXRlOworCXVuc2lnbmVkIGxvbmcgdGlja3MsIGNvbXBhcmUsIHBzdGF0ZTsKIAogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwogCkBAIC00ODMsMTQgKzQ4MiwxNCBAQAogCQkJCSAgICAgOiAiPXIiIChwc3RhdGUpCiAJCQkJICAgICA6ICJpIiAoUFNUQVRFX0lFKSk7CiAKLQkJdGltZXJfdGlja19jb21wYXJlID0gdGlja19vcHMtPmFkZF9jb21wYXJlKHRpbWVyX3RpY2tfb2Zmc2V0KTsKKwkJY29tcGFyZSA9IHRpY2tfb3BzLT5hZGRfY29tcGFyZSh0aW1lcl90aWNrX29mZnNldCk7CiAJCXRpY2tzID0gdGlja19vcHMtPmdldF90aWNrKCk7CiAKIAkJLyogUmVzdG9yZSBQU1RBVEVfSUUuICovCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByCSUwLCAweDAsICUlcHN0YXRlIgogCQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovCiAJCQkJICAgICA6ICJyIiAocHN0YXRlKSk7Ci0JfSB3aGlsZSAodGltZV9hZnRlcl9lcSh0aWNrcywgdGltZXJfdGlja19jb21wYXJlKSk7CisJfSB3aGlsZSAodGltZV9hZnRlcl9lcSh0aWNrcywgY29tcGFyZSkpOwogCiAJdGltZXJfY2hlY2tfcnRjKCk7CiAKQEAgLTUwNiwxMSArNTA1LDYgQEAKIAogCWRvX3RpbWVyKHJlZ3MpOwogCi0JLyoKLQkgKiBPbmx5IGtlZXAgdGltZXJfdGlja19vZmZzZXQgdXB0b2RhdGUsIGJ1dCBkb24ndCBzZXQgVElDS19DTVBSLgotCSAqLwotCXRpbWVyX3RpY2tfY29tcGFyZSA9IHRpY2tfb3BzLT5nZXRfY29tcGFyZSgpICsgdGltZXJfdGlja19vZmZzZXQ7Ci0KIAl0aW1lcl9jaGVja19ydGMoKTsKIAogCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CkBAIC05NzMsNyArOTY3LDcgQEAKIAlpbnQgZXJyOwogCiAJLyogUmVnaXN0ZXIgSVJRIGhhbmRsZXIuICovCi0JZXJyID0gcmVxdWVzdF9pcnEoYnVpbGRfaXJxKDAsIDAsIDBVTCwgMFVMKSwgY2Z1bmMsIFNBX1NUQVRJQ19BTExPQywKKwllcnIgPSByZXF1ZXN0X2lycShidWlsZF9pcnEoMCwgMCwgMFVMLCAwVUwpLCBjZnVuYywgMCwKIAkJCSAgInRpbWVyIiwgTlVMTCk7CiAKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggMzgyZmQ2Ny4uOTUwNDIzZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMzIsNiArMzIsOCBAQAogICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH0KICAgLiA9IEFMSUdOKDY0KTsKICAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7ICooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpIH0KKyAgLiA9IEFMSUdOKDY0KTsKKyAgLmRhdGEucmVhZF9tb3N0bHkgOiB7ICooLmRhdGEucmVhZF9tb3N0bHkpIH0KICAgX2VkYXRhICA9ICAuOwogICBQUk9WSURFIChlZGF0YSA9IC4pOwogICAuZml4dXAgICA6IHsgKiguZml4dXApIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jIGIvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKaW5kZXggM2ZmZWU3Yi4uNTJlOTM3NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKQEAgLTM0LDIyICszNCw2IEBACiBleHRlcm4gc3RydWN0IHNwYXJjX3BoeXNfYmFua3Mgc3BfYmFua3NbU1BBUkNfUEhZU19CQU5LU107CiAKIC8qCi0gKiBUbyBkZWJ1ZyBrZXJuZWwgZHVyaW5nIHN5c2NhbGwgZW50cnkuCi0gKi8KLXZvaWQgc3lzY2FsbF90cmFjZV9lbnRyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwcmludGsoInNjYWxsIGVudHJ5OiAlc1slZF0vY3B1JWQ6ICVkXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHNtcF9wcm9jZXNzb3JfaWQoKSwgKGludCkgcmVncy0+dV9yZWdzW1VSRUdfRzFdKTsKLX0KLQotLyoKLSAqIFRvIGRlYnVnIGtlcm5lbCBkdXJpbmcgc3lzY2FsbCBleGl0LgotICovCi12b2lkIHN5c2NhbGxfdHJhY2VfZXhpdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwcmludGsoInNjYWxsIGV4aXQ6ICVzWyVkXS9jcHUlZDogJWRcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc21wX3Byb2Nlc3Nvcl9pZCgpLCAoaW50KSByZWdzLT51X3JlZ3NbVVJFR19HMV0pOwotfQotCi0vKgogICogVG8gZGVidWcga2VybmVsIHRvIGNhdGNoIGFjY2Vzc2VzIHRvIGNlcnRhaW4gdmlydHVhbC9waHlzaWNhbCBhZGRyZXNzZXMuCiAgKiBNb2RlID0gMCBzZWxlY3RzIHBoeXNpY2FsIHdhdGNocG9pbnRzLCBtb2RlID0gMSBzZWxlY3RzIHZpcnR1YWwgd2F0Y2hwb2ludHMuCiAgKiBmbGFncyA9IFZNX1JFQUQgd2F0Y2hlcyBtZW1yZWFkIGFjY2Vzc2VzLCBmbGFncyA9IFZNX1dSSVRFIHdhdGNoZXMgbWVtd3JpdGUgYWNjZXNzZXMuCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vdWx0cmEuUyBiL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCmluZGV4IDdhMjQzMWQuLjM2Mzc3MDggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCisrKyBiL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCkBAIC03Miw2ICs3Miw3IEBACiAJZmx1c2gJCSVnNgogCXJldGwKIAkgd3JwcgkJJWc3LCAweDAsICVwc3RhdGUKKwlub3AKIAogCS5hbGlnbgkJMzIKIAkuZ2xvYmwJCV9fZmx1c2hfdGxiX2tlcm5lbF9yYW5nZQpAQCAtMjQ5LDcgKzI1MCw3IEBACiAJcmV0bAogCSB3cnByCQklZzcsIDB4MCwgJXBzdGF0ZQogCi1fX2NoZWV0YWhfZmx1c2hfdGxiX3BlbmRpbmc6CS8qIDIyIGluc25zICovCitfX2NoZWV0YWhfZmx1c2hfdGxiX3BlbmRpbmc6CS8qIDIzIGluc25zICovCiAJLyogJW8wID0gY29udGV4dCwgJW8xID0gbnIsICVvMiA9IHZhZGRyc1tdICovCiAJcmRwcgkJJXBzdGF0ZSwgJWc3CiAJc2xseAkJJW8xLCAzLCAlbzEKQEAgLTMxNyw3ICszMTgsNyBAQAogCXNldGhpCQklaGkoX19jaGVldGFoX2ZsdXNoX3RsYl9wZW5kaW5nKSwgJW8xCiAJb3IJCSVvMSwgJWxvKF9fY2hlZXRhaF9mbHVzaF90bGJfcGVuZGluZyksICVvMQogCWNhbGwJCWNoZWV0YWhfcGF0Y2hfb25lCi0JIG1vdgkJMjIsICVvMgorCSBtb3YJCTIzLCAlbzIKIAogI2lmZGVmIERDQUNIRV9BTElBU0lOR19QT1NTSUJMRQogCXNldGhpCQklaGkoX19mbHVzaF9kY2FjaGVfcGFnZSksICVvMApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZW50cnk2NC5TIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZW50cnk2NC5TCmluZGV4IDBjYzlkYWQuLjRiNmFlNTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2VudHJ5NjQuUworKysgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9lbnRyeTY0LlMKQEAgLTI0LDggKzI0LDkgQEAKIAogCS50ZXh0CiBzb2xhcmlzX3N5c2NhbGxfdHJhY2U6CisJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAogCWNhbGwJCXN5c2NhbGxfdHJhY2UKLQkgbm9wCisJIG1vdgkJMCwgJW8xCiAJc3JsCQklaTAsIDAsICVvMAogCW1vdgkJJWk0LCAlbzQKIAlzcmwJCSVpMSwgMCwgJW8xCkBAIC0xNTksOCArMTYwLDEwIEBACiAJIHN0eAkJJWwyLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1ROUENdICFucGMgPSBucGMrNCAKIAogc29sYXJpc19zeXNjYWxsX3RyYWNlMjoKKwlhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAJY2FsbAkJc3lzY2FsbF90cmFjZQotCSBhZGQJCSVsMSwgMHg0LCAlbDIJCQkvKiBucGMgPSBucGMrNCAqLworCSBtb3YJCTEsICVvMQorCWFkZAkJJWwxLCAweDQsICVsMgkJCS8qIG5wYyA9IG5wYys0ICovCiAJYW5kY2MJCSVsMSwgMSwgJWcwCiAJYm5lLHBuCQklaWNjLCAyYgogCSBub3AKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZyBiL2FyY2gvdW0vS2NvbmZpZwppbmRleCA5NDY5ZTc3Li5mOTQ1NDQ0IDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcKKysrIGIvYXJjaC91bS9LY29uZmlnCkBAIC0xMjgsNyArMTI4LDYgQEAKIAogY29uZmlnIEhQUEZTCiAJdHJpc3RhdGUgIkhvbmV5UG90IFByb2NGUyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEJST0tFTgogCWhlbHAKIAlocHBmcyAoSG9uZXlQb3QgUHJvY0ZTKSBpcyBhIGZpbGVzeXN0ZW0gd2hpY2ggYWxsb3dzIFVNTCAvcHJvYwogCWVudHJpZXMgdG8gYmUgb3ZlcnJpZGRlbiwgcmVtb3ZlZCwgb3IgZmFicmljYXRlZCBmcm9tIHRoZSBob3N0LgpAQCAtMTQxLDggKzE0MCw5IEBACiAJWW91IG9ubHkgbmVlZCB0aGlzIGlmIHlvdSBhcmUgc2V0dGluZyB1cCBhIFVNTCBob25leXBvdC4gIE90aGVyd2lzZSwKIAlpdCBpcyBzYWZlIHRvIHNheSAnTicgaGVyZS4KIAotCUlmIHlvdSBhcmUgYWN0aXZlbHkgdXNpbmcgaXQsIHBsZWFzZSBhc2sgZm9yIGl0IHRvIGJlIGZpeGVkLiBJbiB0aGlzCi0JbW9tZW50LCBpdCBkb2VzIG5vdCB3b3JrIG9uIDIuNiAoaXQgd29ya3Mgc29tZWhvdyBvbiAyLjQpLgorCUlmIHlvdSBhcmUgYWN0aXZlbHkgdXNpbmcgaXQsIHBsZWFzZSByZXBvcnQgYW55IHByb2JsZW1zLCBzaW5jZSBpdCdzCisJZ2V0dGluZyBmaXhlZC4gSW4gdGhpcyBtb21lbnQsIGl0IGlzIGV4cGVyaW1lbnRhbCBvbiAyLjYgKGl0IHdvcmtzIG9uCisJMi40KS4KIAogY29uZmlnIE1DT05TT0xFCiAJYm9vbCAiTWFuYWdlbWVudCBjb25zb2xlIgpAQCAtMjc1LDYgKzI3NSw4IEBACiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvdW0vS2NvbmZpZ19jaGFyIgpAQCAtMjg3LDcgKzI4OSw3IEBACiAKIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnX25ldCIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWdfaTM4NiBiL2FyY2gvdW0vS2NvbmZpZ19pMzg2CmluZGV4IGU0MWYzNzQuLjI3YzE4YTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZ19pMzg2CisrKyBiL2FyY2gvdW0vS2NvbmZpZ19pMzg2CkBAIC0xOSw2ICsxOSwxOCBAQAogCW1lbW9yeS4gIEFsbCB0aGUgbWVtb3J5IHRoYXQgY2FuJ3QgYmUgbWFwcGVkIGRpcmVjdGx5IHdpbGwgYmUgdHJlYXRlZAogCWFzIGhpZ2ggbWVtb3J5LgogCitjb25maWcgU1RVQl9DT0RFCisJaGV4CisJZGVmYXVsdCAweGJmZmZlMDAwCisKK2NvbmZpZyBTVFVCX0RBVEEKKwloZXgKKwlkZWZhdWx0IDB4YmZmZmYwMDAKKworY29uZmlnIFNUVUJfU1RBUlQKKwloZXgKKwlkZWZhdWx0IFNUVUJfQ09ERQorCiBjb25maWcgQVJDSF9IQVNfU0NfU0lHTkFMUwogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZ194ODZfNjQgYi9hcmNoL3VtL0tjb25maWdfeDg2XzY0CmluZGV4IGYxNjJmNTAuLjczNWEwNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZ194ODZfNjQKKysrIGIvYXJjaC91bS9LY29uZmlnX3g4Nl82NApAQCAtMTQsNiArMTQsMTggQEAKICAgICAgICBib29sCiAgICAgICAgZGVmYXVsdCB5CiAKK2NvbmZpZyBTVFVCX0NPREUKKwloZXgKKwlkZWZhdWx0IDB4N2ZiZmZmZTAwMAorCitjb25maWcgU1RVQl9EQVRBCisJaGV4CisJZGVmYXVsdCAweDdmYmZmZmYwMDAKKworY29uZmlnIFNUVUJfU1RBUlQKKwloZXgKKwlkZWZhdWx0IFNUVUJfQ09ERQorCiBjb25maWcgQVJDSF9IQVNfU0NfU0lHTkFMUwogCWJvb2wKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUgYi9hcmNoL3VtL01ha2VmaWxlCmluZGV4IDNmMDczOTAuLjRhMzc1YmJhYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZQorKysgYi9hcmNoL3VtL01ha2VmaWxlCkBAIC0xNDAsNyArMTQwLDggQEAKICNXaGVuIGNsZWFuaW5nIHdlIGRvbid0IGluY2x1ZGUgLmNvbmZpZywgc28gd2UgZG9uJ3QgaW5jbHVkZQogI1RUIG9yIHNrYXMgbWFrZWZpbGVzIGFuZCBkb24ndCBjbGVhbiBza2FzX3B0cmVncy5oLgogQ0xFQU5fRklMRVMgKz0gbGludXggeC5pIGdtb24ub3V0ICQoQVJDSF9ESVIpL2luY2x1ZGUvdW1sLWNvbmZpZy5oIFwKLQkkKEdFTl9IRUFERVJTKSAkKEFSQ0hfRElSKS9pbmNsdWRlL3NrYXNfcHRyZWdzLmgKKwkkKEdFTl9IRUFERVJTKSAkKEFSQ0hfRElSKS9pbmNsdWRlL3NrYXNfcHRyZWdzLmggXAorCSQoQVJDSF9ESVIpL2luY2x1ZGUvdXNlcl9jb25zdGFudHMuaAogCiBNUlBST1BFUl9GSUxFUyArPSAkKFNZTUxJTktfSEVBREVSUykgJChBUkNIX1NZTUxJTktTKSBcCiAJJChhZGRwcmVmaXggJChBUkNIX0RJUikva2VybmVsLywkKEtFUk5fU1lNTElOS1MpKSAkKEFSQ0hfRElSKS9vcyBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlLWkzODYgYi9hcmNoL3VtL01ha2VmaWxlLWkzODYKaW5kZXggMjllMTgyZC4uMzAxMDU5MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZS1pMzg2CisrKyBiL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgpAQCAtOCw3ICs4LDcgQEAKICAgZW5kaWYKIGVuZGlmCiAKLUNGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1VJChTVUJBUkNIKQorQ0ZMQUdTICs9IC1VX18kKFNVQkFSQ0gpX18gLVUkKFNVQkFSQ0gpICQoU1RVQl9DRkxBR1MpCiBBUkNIX1VTRVJfQ0ZMQUdTIDo9CiAKIGlmbmVxICgkKENPTkZJR19HUFJPRikseSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0IGIvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKaW5kZXggMzIxNDQ1Ni4uZDgwYmQwMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKKysrIGIvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKQEAgLTQsNyArNCw3IEBACiBTVUJBUkNIX0xJQlMgOj0gYXJjaC91bS9zeXMteDg2XzY0LwogU1RBUlQgOj0gMHg2MDAwMDAwMAogCi1DRkxBR1MgKz0gLVVfXyQoU1VCQVJDSClfXyAtZm5vLWJ1aWx0aW4KK0NGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1mbm8tYnVpbHRpbiAkKFNUVUJfQ0ZMQUdTKQogQVJDSF9VU0VSX0NGTEFHUyA6PSAtRF9feDg2XzY0X18KIAogRUxGX0FSQ0ggOj0gaTM4Njp4ODYtNjQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZGVmY29uZmlnIGIvYXJjaC91bS9kZWZjb25maWcKaW5kZXggNDA2N2MzYS4uODBkMzBkMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kZWZjb25maWcKKysrIGIvYXJjaC91bS9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMzLXNrYXMzLXY5LXByZTIKLSMgU3VuIEFwciAyNCAxOTo0NjoxMCAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmM2LW1tMQorIyBUdWUgSnVuIDE0IDE4OjIyOjIxIDIwMDUKICMKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19VTUw9eQpAQCAtMTMsMjMgKzEzLDMyIEBACiAjCiAjIFVNTC1zcGVjaWZpYyBvcHRpb25zCiAjCi1DT05GSUdfTU9ERV9UVD15CisjIENPTkZJR19NT0RFX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQVRJQ19MSU5LIGlzIG5vdCBzZXQKIENPTkZJR19NT0RFX1NLQVM9eQogQ09ORklHX1VNTF9YODY9eQogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1RPUF9BRERSPTB4YzAwMDAwMDAKICMgQ09ORklHXzNfTEVWRUxfUEdUQUJMRVMgaXMgbm90IHNldAorQ09ORklHX1NUVUJfQ09ERT0weGJmZmZlMDAwCitDT05GSUdfU1RVQl9EQVRBPTB4YmZmZmYwMDAKK0NPTkZJR19TVFVCX1NUQVJUPTB4YmZmZmUwMDAKIENPTkZJR19BUkNIX0hBU19TQ19TSUdOQUxTPXkKIENPTkZJR19BUkNIX1JFVVNFX0hPU1RfVlNZU0NBTExfQVJFQT15Ci1DT05GSUdfTERfU0NSSVBUX1NUQVRJQz15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfTERfU0NSSVBUX0RZTj15CiBDT05GSUdfTkVUPXkKIENPTkZJR19CSU5GTVRfRUxGPXkKIENPTkZJR19CSU5GTVRfTUlTQz1tCi1DT05GSUdfSE9TVEZTPXkKKyMgQ09ORklHX0hPU1RGUyBpcyBub3Qgc2V0CiBDT05GSUdfTUNPTlNPTEU9eQogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfSE9TVF8yR18yRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAogQ09ORklHX05FU1RfTEVWRUw9MAogQ09ORklHX0tFUk5FTF9IQUxGX0dJR1M9MQogIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CkBAIC02Myw2ICs3Miw4IEBACiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQpAQCAtODEsNiArOTIsNyBAQAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0tNT0Q9eQogCkBAIC0xMTUsNiArMTI3LDcgQEAKIENPTkZJR19TT1VORD1tCiBDT05GSUdfSE9TVEFVRElPPW0KIENPTkZJR19VTUxfUkFORE9NPXkKKyMgQ09ORklHX01NQVBQRVIgaXMgbm90IHNldAogCiAjCiAjIEJsb2NrIGRldmljZXMKQEAgLTE3Niw2ICsxODksMTcgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JUF9UQ1BESUFHPXkKICMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisKKyMKKyMgVENQIGNvbmdlc3Rpb24gY29udHJvbAorIworQ09ORklHX1RDUF9DT05HX0JJQz15CitDT05GSUdfVENQX0NPTkdfV0VTVFdPT0Q9eQorQ09ORklHX1RDUF9DT05HX0hUQ1A9eQorIyBDT05GSUdfVENQX0NPTkdfSFNUQ1AgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfSFlCTEEgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfVkVHQVMgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC0yMDYsMTEgKzIzMCwxNSBAQAogIyBOZXR3b3JrIHRlc3RpbmcKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfS0dEQk9FIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9SWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMX1RSQVAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVk9bQogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldApAQCAtMjI3LDYgKzI1NSw3IEBACiAjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAogIyBDT05GSUdfUFBQX0RFRkxBVEUgaXMgbm90IHNldAogIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX01QUEUgaXMgbm90IHNldAogIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAogQ09ORklHX1NMSVA9bQogIyBDT05GSUdfU0xJUF9DT01QUkVTU0VEIGlzIG5vdCBzZXQKQEAgLTI0MCwxMCArMjY5LDEyIEBACiAjCiBDT05GSUdfRVhUMl9GUz15CiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKICMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSNF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfUkVJU0VSRlNfRlM9eQogIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKQEAgLTI1Niw2ICsyODcsNyBAQAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKIENPTkZJR19RVU9UQT15CiAjIENPTkZJR19RRk1UX1YxIGlzIG5vdCBzZXQKICMgQ09ORklHX1FGTVRfVjIgaXMgbm90IHNldApAQCAtMjY1LDYgKzI5NywxMiBAQAogQ09ORklHX0FVVE9GUzRfRlM9bQogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiBDT05GSUdfSVNPOTY2MF9GUz1tCkBAIC0yOTEsNiArMzI5LDggQEAKICMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwpAQCAtMzE5LDYgKzM1OSw3IEBACiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtNDA0LDE0ICs0NDUsMTUgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NMQUI9eQogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSU5GTz15CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfUFRfUFJPWFk9eQorIyBDT05GSUdfR1BST0YgaXMgbm90IHNldAogIyBDT05GSUdfR0NPViBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNDQUxMX0RFQlVHIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9saW5lLmMgYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCmluZGV4IDJiYjRjNGY1Li5lMGZkZmZhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTY2MywxMSArNjYzLDE1IEBACiAJcmV0dXJuIGRyaXZlcjsKIH0KIAorc3RhdGljIHNwaW5sb2NrX3Qgd2luY2hfaGFuZGxlcl9sb2NrOworTElTVF9IRUFEKHdpbmNoX2hhbmRsZXJzKTsKKwogdm9pZCBsaW5lc19pbml0KHN0cnVjdCBsaW5lICpsaW5lcywgaW50IG5saW5lcykKIHsKIAlzdHJ1Y3QgbGluZSAqbGluZTsKIAlpbnQgaTsKIAorCXNwaW5fbG9ja19pbml0KCZ3aW5jaF9oYW5kbGVyX2xvY2spOwogCWZvcihpID0gMDsgaSA8IG5saW5lczsgaSsrKXsKIAkJbGluZSA9ICZsaW5lc1tpXTsKIAkJSU5JVF9MSVNUX0hFQUQoJmxpbmUtPmNoYW5fbGlzdCk7CkBAIC03MjQsMzEgKzcyOCwzMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotREVDTEFSRV9NVVRFWCh3aW5jaF9oYW5kbGVyX3NlbSk7Ci1MSVNUX0hFQUQod2luY2hfaGFuZGxlcnMpOwotCiB2b2lkIHJlZ2lzdGVyX3dpbmNoX2lycShpbnQgZmQsIGludCB0dHlfZmQsIGludCBwaWQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHdpbmNoICp3aW5jaDsKIAotCWRvd24oJndpbmNoX2hhbmRsZXJfc2VtKTsKIAl3aW5jaCA9IGttYWxsb2Moc2l6ZW9mKCp3aW5jaCksIEdGUF9LRVJORUwpOwogCWlmICh3aW5jaCA9PSBOVUxMKSB7CiAJCXByaW50aygicmVnaXN0ZXJfd2luY2hfaXJxIC0ga21hbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCX0KKwogCSp3aW5jaCA9ICgoc3RydWN0IHdpbmNoKSB7IC5saXN0ICAJPSBMSVNUX0hFQURfSU5JVCh3aW5jaC0+bGlzdCksCiAJCQkJICAgLmZkICAJPSBmZCwKIAkJCQkgICAudHR5X2ZkIAk9IHR0eV9mZCwKIAkJCQkgICAucGlkICAJPSBwaWQsCiAJCQkJICAgLnR0eSAJPSB0dHkgfSk7CisKKwlzcGluX2xvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAJbGlzdF9hZGQoJndpbmNoLT5saXN0LCAmd2luY2hfaGFuZGxlcnMpOworCXNwaW5fdW5sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOworCiAJaWYodW1fcmVxdWVzdF9pcnEoV0lOQ0hfSVJRLCBmZCwgSVJRX1JFQUQsIHdpbmNoX2ludGVycnVwdCwKIAkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCAKIAkJCSAgIndpbmNoIiwgd2luY2gpIDwgMCkKIAkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaF9pcnEgLSBmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKLSBvdXQ6Ci0JdXAoJndpbmNoX2hhbmRsZXJfc2VtKTsKIH0KIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl93aW5jaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtNzU2LDcgKzc1OSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZWxlOwogCXN0cnVjdCB3aW5jaCAqd2luY2gsICpmb3VuZCA9IE5VTEw7CiAKLQlkb3duKCZ3aW5jaF9oYW5kbGVyX3NlbSk7CisJc3Bpbl9sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOwogCWxpc3RfZm9yX2VhY2goZWxlLCAmd2luY2hfaGFuZGxlcnMpewogCQl3aW5jaCA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3Qgd2luY2gsIGxpc3QpOwogICAgICAgICAgICAgICAgIGlmKHdpbmNoLT50dHkgPT0gdHR5KXsKQEAgLTc2NCwyMCArNzY3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBpZihmb3VuZCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCQlnb3RvIGVycjsKKworCWxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7CisJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAKICAgICAgICAgaWYod2luY2gtPnBpZCAhPSAtMSkKICAgICAgICAgICAgICAgICBvc19raWxsX3Byb2Nlc3Mod2luY2gtPnBpZCwgMSk7CiAKICAgICAgICAgZnJlZV9pcnEoV0lOQ0hfSVJRLCB3aW5jaCk7Ci0gICAgICAgIGxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7CiAgICAgICAgIGtmcmVlKHdpbmNoKTsKLSBvdXQ6Ci0JdXAoJndpbmNoX2hhbmRsZXJfc2VtKTsKKworCXJldHVybjsKK2VycjoKKwlzcGluX3VubG9jaygmd2luY2hfaGFuZGxlcl9sb2NrKTsKIH0KIAorLyogWFhYOiBObyBsb2NrIGFzIGl0J3MgYW4gZXhpdGNhbGwuLi4gaXMgdGhpcyB2YWxpZD8gRGVwZW5kaW5nIG9uIGNsZWFudXAKKyAqIG9yZGVyLi4uIGFyZSB3ZSBzdXJlIHRoYXQgbm90aGluZyBlbHNlIGlzIGRvbmUgb24gdGhlIGxpc3Q/ICovCiBzdGF0aWMgdm9pZCB3aW5jaF9jbGVhbnVwKHZvaWQpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZWxlOwpAQCAtNzg2LDYgKzc5NCw5IEBACiAJbGlzdF9mb3JfZWFjaChlbGUsICZ3aW5jaF9oYW5kbGVycyl7CiAJCXdpbmNoID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCB3aW5jaCwgbGlzdCk7CiAJCWlmKHdpbmNoLT5mZCAhPSAtMSl7CisJCQkvKiBXaHkgaXMgdGhpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgZnJlZV9pcnEoKSwKKwkJCSAqIHdoaWNoIGRlYWN0aXZhdGVzIFNJR0lPPyBUaGlzIHNlYXJjaGVzIHRoZSBGRAorCQkJICogc29tZXdoZXJlIGVsc2UgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbGlzdC4uLiAqLwogCQkJZGVhY3RpdmF0ZV9mZCh3aW5jaC0+ZmQsIFdJTkNIX0lSUSk7CiAJCQlvc19jbG9zZV9maWxlKHdpbmNoLT5mZCk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9tZW0uaCBiL2FyY2gvdW0vaW5jbHVkZS9tZW0uaAppbmRleCAxMGM0NmMzLi45OWQzYWQ0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvbWVtLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL21lbS5oCkBAIC0xMyw2ICsxMyw3IEBACiBleHRlcm4gaW50IGlzX3JlbWFwcGVkKHZvaWQgKnZpcnQpOwogZXh0ZXJuIGludCBwaHlzbWVtX3JlbW92ZV9tYXBwaW5nKHZvaWQgKnZpcnQpOwogZXh0ZXJuIHZvaWQgcGh5c21lbV9mb3JnZXRfZGVzY3JpcHRvcihpbnQgZmQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG9fcGh5cyh2b2lkICp2aXJ0KTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9yZWdpc3RlcnMuaCBiL2FyY2gvdW0vaW5jbHVkZS9yZWdpc3RlcnMuaAppbmRleCA4NzQ0YWJiLi4wYTM1ZTZkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvcmVnaXN0ZXJzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3JlZ2lzdGVycy5oCkBAIC0xNCw2ICsxNCw3IEBACiBleHRlcm4gdm9pZCBzYXZlX3JlZ2lzdGVycyhpbnQgcGlkLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCByZXN0b3JlX3JlZ2lzdGVycyhpbnQgcGlkLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBpbml0X3JlZ2lzdGVycyhpbnQgcGlkKTsKK2V4dGVybiB2b2lkIGdldF9zYWZlX3JlZ2lzdGVycyh1bnNpZ25lZCBsb25nICogcmVncyk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvcHRyYWNlX3VzZXIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCmluZGV4IGVjYTgwNjYuLjg5OWFhNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCkBAIC0yMCwxMSArMjAsMjQgQEAKICNkZWZpbmUgUFRfU1lTQ0FMTF9BUkczX09GRlNFVCBQVF9PRkZTRVQoRURYKQogI2RlZmluZSBQVF9TWVNDQUxMX0FSRzRfT0ZGU0VUIFBUX09GRlNFVChFU0kpCiAjZGVmaW5lIFBUX1NZU0NBTExfQVJHNV9PRkZTRVQgUFRfT0ZGU0VUKEVESSkKKyNkZWZpbmUgUFRfU1lTQ0FMTF9BUkc2X09GRlNFVCBQVF9PRkZTRVQoRUJQKQogCiAjZGVmaW5lIFBUX1NZU0NBTExfUkVUX09GRlNFVCBQVF9PRkZTRVQoRUFYKQogCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9OUiBFQVggLyogVGhpcyBpcyB1c2VkIGJlZm9yZSBhIHN5c3RlbSBjYWxsICovCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkcxIEVCWAorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMiBFQ1gKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzMgRURYCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkc0IEVTSQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNSBFREkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzYgRUJQCisKKyNkZWZpbmUgUkVHU19JUF9JTkRFWCBFSVAKKyNkZWZpbmUgUkVHU19TUF9JTkRFWCBVRVNQCisKICNkZWZpbmUgUFRfSVBfT0ZGU0VUIFBUX09GRlNFVChFSVApCiAjZGVmaW5lIFBUX0lQKHJlZ3MpICgocmVncylbRUlQXSkKKyNkZWZpbmUgUFRfU1BfT0ZGU0VUIFBUX09GRlNFVChVRVNQKQogI2RlZmluZSBQVF9TUChyZWdzKSAoKHJlZ3MpW1VFU1BdKQogCiAjaWZuZGVmIEZSQU1FX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9zdHViLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvc3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjk5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvc3R1Yi5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1NUVUJfSAorI2RlZmluZSBfX1NZU0RFUF9TVFVCX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKK2V4dGVybiB2b2lkIHN0dWJfc2Vndl9oYW5kbGVyKGludCBzaWcpOworZXh0ZXJuIHZvaWQgc3R1Yl9jbG9uZV9oYW5kbGVyKHZvaWQpOworCisjZGVmaW5lIFNUVUJfU1lTQ0FMTF9SRVQgRUFYCisjZGVmaW5lIFNUVUJfTU1BUF9OUiBfX05SX21tYXAyCisjZGVmaW5lIE1NQVBfT0ZGU0VUKG8pICgobykgPj4gUEFHRV9TSElGVCkKKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDIobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMikKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18oIm1vdmwgJTAsICUlZWN4OyAiIDogOiAiZyIgKGFyZzIpIDogIiVlY3giKTsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVieDsgIiA6IDogImciIChhcmcxKSA6ICIlZWJ4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlYXg7ICIgOiA6ICJnIiAoc3lzY2FsbCkgOiAiJWVheCIpOworCV9fYXNtX18oImludCAkMHg4MDsiIDogOiA6ICIlZWF4Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlYXgsICUwOyAiIDogIj1nIiAocmV0KSA6KTsKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDMobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczKQoreworCV9fYXNtX18oIm1vdmwgJTAsICUlZWR4OyAiIDogOiAiZyIgKGFyZzMpIDogIiVlZHgiKTsKKwlyZXR1cm4oc3R1Yl9zeXNjYWxsMihzeXNjYWxsLCBhcmcxLCBhcmcyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw0KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKKwkJCQkgbG9uZyBhcmc0KQoreworCV9fYXNtX18oIm1vdmwgJTAsICUlZXNpOyAiIDogOiAiZyIgKGFyZzQpIDogIiVlc2kiKTsKKwlyZXR1cm4oc3R1Yl9zeXNjYWxsMyhzeXNjYWxsLCBhcmcxLCBhcmcyLCBhcmczKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw2KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKKwkJCQkgbG9uZyBhcmc0LCBsb25nIGFyZzUsIGxvbmcgYXJnNikKK3sKKwlsb25nIHJldDsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVheDsgIiA6IDogImciIChzeXNjYWxsKSA6ICIlZWF4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlYng7ICIgOiA6ICJnIiAoYXJnMSkgOiAiJWVieCIpOworCV9fYXNtX18oIm1vdmwgJTAsICUlZWN4OyAiIDogOiAiZyIgKGFyZzIpIDogIiVlY3giKTsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVkeDsgIiA6IDogImciIChhcmczKSA6ICIlZWR4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlc2k7ICIgOiA6ICJnIiAoYXJnNCkgOiAiJWVzaSIpOworCV9fYXNtX18oIm1vdmwgJTAsICUlZWRpOyAiIDogOiAiZyIgKGFyZzUpIDogIiVlZGkiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGwgJSVlYnAgOyBtb3ZsICUxLCAlJWVicDsgIgorCQkiaW50ICQweDgwOyBwb3BsICUlZWJwIDsgIgorCQkibW92bCAlJWVheCwgJTA7ICIgOiAiPWciIChyZXQpIDogImciIChhcmc2KSA6ICIlZWF4Iik7CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFwX215c2VsZih2b2lkKQoreworCV9fYXNtKCJpbnQzIik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvcHRyYWNlX3VzZXIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZV91c2VyLmgKaW5kZXggMzE3Mjk5Ny4uMTI4ZmFmMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvcHRyYWNlX3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2VfdXNlci5oCkBAIC01NSw2ICs1NSwyMCBAQAogI2RlZmluZSBQVFJBQ0VfT0xEU0VUT1BUSU9OUyAyMQogI2VuZGlmCiAKKy8qIFRoZXNlIGFyZSBiZWZvcmUgdGhlIHN5c3RlbSBjYWxsLCBzbyB0aGUgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpcyBSQVgKKyAqIHJhdGhlciB0aGFuIE9SSUdfUkFYLCBhbmQgYXJnNCBpcyBSMTAgcmF0aGVyIHRoYW4gUkNYCisgKi8KKyNkZWZpbmUgUkVHU19TWVNDQUxMX05SIFBUX0lOREVYKFJBWCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzEgUFRfSU5ERVgoUkRJKQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMiBQVF9JTkRFWChSU0kpCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkczIFBUX0lOREVYKFJEWCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzQgUFRfSU5ERVgoUjEwKQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNSBQVF9JTkRFWChSOCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzYgUFRfSU5ERVgoUjkpCisKKyNkZWZpbmUgUkVHU19JUF9JTkRFWCBQVF9JTkRFWChSSVApCisjZGVmaW5lIFJFR1NfU1BfSU5ERVggUFRfSU5ERVgoUlNQKQorCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N0dWIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk5MDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3R1Yi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1NUVUJfSAorI2RlZmluZSBfX1NZU0RFUF9TVFVCX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzZGVwL3B0cmFjZV91c2VyLmg+CisKK2V4dGVybiB2b2lkIHN0dWJfc2Vndl9oYW5kbGVyKGludCBzaWcpOworZXh0ZXJuIHZvaWQgc3R1Yl9jbG9uZV9oYW5kbGVyKHZvaWQpOworCisjZGVmaW5lIFNUVUJfU1lTQ0FMTF9SRVQgUFRfSU5ERVgoUkFYKQorI2RlZmluZSBTVFVCX01NQVBfTlIgX19OUl9tbWFwCisjZGVmaW5lIE1NQVBfT0ZGU0VUKG8pIChvKQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMihsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyKQoreworCWxvbmcgcmV0OworCisJX19hc21fXygibW92cSAlMCwgJSVyc2k7ICIgOiA6ICJnIiAoYXJnMikgOiAiJXJzaSIpOworCV9fYXNtX18oIm1vdnEgJTAsICUlcmRpOyAiIDogOiAiZyIgKGFyZzEpIDogIiVyZGkiKTsKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXJheDsgIiA6IDogImciIChzeXNjYWxsKSA6ICIlcmF4Iik7CisJX19hc21fXygic3lzY2FsbDsiIDogOiA6ICIlcmF4IiwgIiVyMTEiLCAiJXJjeCIpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmF4LCAlMDsgIiA6ICI9ZyIgKHJldCkgOik7CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwzKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMykKK3sKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXJkeDsgIiA6IDogImciIChhcmczKSA6ICIlcmR4Iik7CisJcmV0dXJuKHN0dWJfc3lzY2FsbDIoc3lzY2FsbCwgYXJnMSwgYXJnMikpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNChsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCisJCQkJIGxvbmcgYXJnNCkKK3sKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXIxMDsgIiA6IDogImciIChhcmc0KSA6ICIlcjEwIik7CisJcmV0dXJuKHN0dWJfc3lzY2FsbDMoc3lzY2FsbCwgYXJnMSwgYXJnMiwgYXJnMykpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNihsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCisJCQkJIGxvbmcgYXJnNCwgbG9uZyBhcmc1LCBsb25nIGFyZzYpCit7CisJX19hc21fXygibW92cSAlMCwgJSVyOTsgIiA6IDogImciIChhcmc2KSA6ICIlcjkiKTsKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXI4OyAiIDogOiAiZyIgKGFyZzUpIDogIiVyOCIpOworCXJldHVybihzdHViX3N5c2NhbGw0KHN5c2NhbGwsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYXBfbXlzZWxmKHZvaWQpCit7CisJX19hc20oImludDMiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdGltZV91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvdGltZV91c2VyLmgKaW5kZXggZjY0ZWY3Ny4uMTdkN2VmMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3RpbWVfdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90aW1lX3VzZXIuaApAQCAtMTAsNiArMTAsNyBAQAogZXh0ZXJuIHZvaWQgc3dpdGNoX3RpbWVycyhpbnQgdG9fcmVhbCk7CiBleHRlcm4gdm9pZCBpZGxlX3NsZWVwKGludCBzZWNzKTsKIGV4dGVybiB2b2lkIGVuYWJsZV90aW1lcih2b2lkKTsKK2V4dGVybiB2b2lkIHByZXBhcmVfdGltZXIodm9pZCAqIHB0cik7CiBleHRlcm4gdm9pZCBkaXNhYmxlX3RpbWVyKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGltZV9sb2NrKHZvaWQpOwogZXh0ZXJuIHZvaWQgdGltZV91bmxvY2sodW5zaWduZWQgbG9uZyk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdGxiLmggYi9hcmNoL3VtL2luY2x1ZGUvdGxiLmgKaW5kZXggZGExMDk3Mi4uYzZmOTYyOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3RsYi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90bGIuaApAQCAtMzcsMzEgKzM3LDI1IEBACiBleHRlcm4gdm9pZCBtcHJvdGVjdF9rZXJuZWxfdm0oaW50IHcpOwogZXh0ZXJuIHZvaWQgZm9yY2VfZmx1c2hfYWxsKHZvaWQpOwogZXh0ZXJuIHZvaWQgZml4X3JhbmdlX2NvbW1vbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGVuZF9hZGRyLCBpbnQgZm9yY2UsIGludCBkYXRhLAotCQkJICAgICB2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGVuZF9hZGRyLCBpbnQgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKHVuaW9uIG1tX2NvbnRleHQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSk7CiBleHRlcm4gaW50IGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkJCSB1bnNpZ25lZCBsb25nIGVuZCk7CiAKIGV4dGVybiBpbnQgYWRkX21tYXAodW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkgICAgaW50IHIsIGludCB3LCBpbnQgeCwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LAotCQkgICAgaW50IGxhc3RfZmlsbGVkLCBpbnQgZGF0YSwKLQkJICAgIHZvaWQgKCpkb19vcHMpKGludCwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSk7CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0X2ZpbGxlZCwgdW5pb24gbW1fY29udGV4dCAqbW11LAorICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOwogZXh0ZXJuIGludCBhZGRfbXVubWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCSAgICAgIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwgaW50IGxhc3RfZmlsbGVkLAotCQkgICAgICBpbnQgZGF0YSwgdm9pZCAoKmRvX29wcykoaW50LCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBtbV9jb250ZXh0ICptbXUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOwogZXh0ZXJuIGludCBhZGRfbXByb3RlY3QodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LAogCQkJaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwKLQkJCWludCBsYXN0X2ZpbGxlZCwgaW50IGRhdGEsCi0JCQl2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RfZmlsbGVkLCB1bmlvbiBtbV9jb250ZXh0ICptbXUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKTsKICNlbmRpZgotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCmluZGV4IDcxNWIwODMuLjM5NDJhNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKQEAgLTY3LDYgKzY3LDEyIEBACiAgICAgKiguc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQogICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwogICAgICooLmdudS53YXJuaW5nKQorCisgICAgLiA9IEFMSUdOKDQwOTYpOworICAgIF9fc3lzY2FsbF9zdHViX3N0YXJ0ID0gLjsKKyAgICAqKC5fX3N5c2NhbGxfc3R1YiopCisgICAgX19zeXNjYWxsX3N0dWJfZW5kID0gLjsKKyAgICAuID0gQUxJR04oNDA5Nik7CiAgIH0gPTB4OTA5MDkwOTAKICAgLmZpbmkgICAgICAgICAgIDogewogICAgIEtFRVAgKCooLmZpbmkpKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jIGIvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCmluZGV4IDQyMGU2ZDUuLmEyNGUzYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKQEAgLTM1Myw2ICszNTMsOCBAQAogCiAjZGVmaW5lIFBGTl9VUCh4KSAoKCh4KSArIFBBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUKQogCitleHRlcm4gaW50IF9fc3lzY2FsbF9zdHViX3N0YXJ0LCBfX2JpbmFyeV9zdGFydDsKKwogdm9pZCBzZXR1cF9waHlzbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZV9lbmQsCiAJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGhpZ2htZW0pCiB7CkBAIC0zNzEsNiArMzczLDEyIEBACiAJCWV4aXQoMSk7CiAJfQogCisJLyogU3BlY2lhbCBrbHVkZ2UgLSBUaGlzIHBhZ2Ugd2lsbCBiZSBtYXBwZWQgaW4gdG8gdXNlcnNwYWNlIHByb2Nlc3NlcworCSAqIGZyb20gcGh5c21lbV9mZCwgc28gaXQgbmVlZHMgdG8gYmUgd3JpdHRlbiBvdXQgdGhlcmUuCisJICovCisJb3Nfc2Vla19maWxlKHBoeXNtZW1fZmQsIF9fcGEoJl9fc3lzY2FsbF9zdHViX3N0YXJ0KSk7CisJb3Nfd3JpdGVfZmlsZShwaHlzbWVtX2ZkLCAmX19zeXNjYWxsX3N0dWJfc3RhcnQsIFBBR0VfU0laRSk7CisKIAlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW0ocGZuLCBwZm4gKyBkZWx0YSk7CiAJZnJlZV9ib290bWVtKF9fcGEocmVzZXJ2ZV9lbmQpICsgYm9vdG1hcF9zaXplLAogCQkgICAgIGxlbiAtIGJvb3RtYXBfc2l6ZSAtIHJlc2VydmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDFiNWVmM2UuLmM0NWE2MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKICNpbmNsdWRlICJtb2RlLmgiCisjaW5jbHVkZSAidGVtcGZpbGUuaCIKICNpZmRlZiBVTUxfQ09ORklHX01PREVfU0tBUwogI2luY2x1ZGUgInNrYXMuaCIKICNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgpAQCAtMzU4LDExICszNTksMTYgQEAKIAkJa2lsbCh0YXJnZXQsIFNJR0lPKTsKIH0KIAoraW50IHB0cmFjZV9mYXVsdGluZm8gPSAwOworaW50IHByb2NfbW0gPSAxOworCitleHRlcm4gdm9pZCAqX19zeXNjYWxsX3N0dWJfc3RhcnQsIF9fc3lzY2FsbF9zdHViX2VuZDsKKwogI2lmZGVmIFVNTF9DT05GSUdfTU9ERV9TS0FTCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19za2FzM19wdHJhY2Vfc3VwcG9ydCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NrYXMzX3B0cmFjZV9zdXBwb3J0KHZvaWQpCiB7CiAJc3RydWN0IHB0cmFjZV9mYXVsdGluZm8gZmk7Ci0JaW50IHBpZCwgbiwgcmV0ID0gMTsKKwlpbnQgcGlkLCBuOwogCiAJcHJpbnRmKCJDaGVja2luZyBmb3IgdGhlIHNrYXMzIHBhdGNoIGluIHRoZSBob3N0Li4uIik7CiAJcGlkID0gc3RhcnRfcHRyYWNlZF9jaGlsZCgpOwpAQCAtMzc0LDMzICszODAsMzEgQEAKIAkJZWxzZSB7CiAJCQlwZXJyb3IoIm5vdCBmb3VuZCIpOwogCQl9Ci0JCXJldCA9IDA7Ci0JfSBlbHNlIHsKKwl9CisJZWxzZSB7CisJCXB0cmFjZV9mYXVsdGluZm8gPSAxOwogCQlwcmludGYoImZvdW5kXG4iKTsKIAl9CiAKIAlpbml0X3JlZ2lzdGVycyhwaWQpOwogCXN0b3BfcHRyYWNlZF9jaGlsZChwaWQsIDEsIDEpOwotCi0JcmV0dXJuKHJldCk7CiB9CiAKIGludCBjYW5fZG9fc2thcyh2b2lkKQogewotCWludCByZXQgPSAxOwotCiAJcHJpbnRmKCJDaGVja2luZyBmb3IgL3Byb2MvbW0uLi4iKTsKIAlpZiAob3NfYWNjZXNzKCIvcHJvYy9tbSIsIE9TX0FDQ19XX09LKSA8IDApIHsKKwkJcHJvY19tbSA9IDA7CiAJCXByaW50Zigibm90IGZvdW5kXG4iKTsKLQkJcmV0ID0gMDsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIHsKKwl9CisJZWxzZSB7CiAJCXByaW50ZigiZm91bmRcbiIpOwogCX0KIAotCXJldCA9IGNoZWNrX3NrYXMzX3B0cmFjZV9zdXBwb3J0KCk7CiBvdXQ6Ci0JcmV0dXJuIHJldDsKKwljaGVja19za2FzM19wdHJhY2Vfc3VwcG9ydCgpOworCXJldHVybiAxOwogfQogI2Vsc2UKIGludCBjYW5fZG9fc2thcyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZSBiL2FyY2gvdW0va2VybmVsL3NrYXMvTWFrZWZpbGUKaW5kZXggZmY2OWM0Yi4uZDI5NmQ1NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZQorKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlCkBAIC0zLDExICszLDE0IEBACiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICMKIAotb2JqLXkgOj0gZXhlY19rZXJuLm8gbWVtLm8gbWVtX3VzZXIubyBtbXUubyBwcm9jZXNzLm8gcHJvY2Vzc19rZXJuLm8gXAorb2JqLXkgOj0gY2xvbmUubyBleGVjX2tlcm4ubyBtZW0ubyBtZW1fdXNlci5vIG1tdS5vIHByb2Nlc3MubyBwcm9jZXNzX2tlcm4ubyBcCiAJc3lzY2FsbF9rZXJuLm8gc3lzY2FsbF91c2VyLm8gdGxiLm8gdHJhcF91c2VyLm8gdWFjY2Vzcy5vIFwKIAogc3ViZGlyLSA6PSB1dGlsCiAKLVVTRVJfT0JKUyA6PSBwcm9jZXNzLm8KK1VTRVJfT0JKUyA6PSBwcm9jZXNzLm8gY2xvbmUubwogCiBpbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcworCisjIGNsb25lLm8gaXMgaW4gdGhlIHN0dWIsIHNvIGl0IGNhbid0IGJlIGJ1aWx0IHdpdGggcHJvZmlsaW5nCiskKG9iaikvY2xvbmUubyA6IGNfZmxhZ3MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChjYWxsIHVucHJvZmlsZSwkKFVTRVJfQ0ZMQUdTKSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvY2xvbmUuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvY2xvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM1NWYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9jbG9uZS5jCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgorI2luY2x1ZGUgInNrYXMuaCIKKyNpbmNsdWRlICJzdHViLWRhdGEuaCIKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKKworLyogVGhpcyBpcyBpbiBhIHNlcGFyYXRlIGZpbGUgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoIGFueQorICogZXh0cmFuZW91cyBnY2MgZmxhZ3MgKC1wZywgLWZwcm9maWxlLWFyY3MsIC1mdGVzdC1jb3ZlcmFnZSkgZGlzYWJsZWQKKyAqLwordm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCitzdHViX2Nsb25lX2hhbmRsZXIodm9pZCkKK3sKKwlsb25nIGVycjsKKwlzdHJ1Y3Qgc3R1Yl9kYXRhICpmcm9tID0gKHN0cnVjdCBzdHViX2RhdGEgKikgVU1MX0NPTkZJR19TVFVCX0RBVEE7CisKKwllcnIgPSBzdHViX3N5c2NhbGwyKF9fTlJfY2xvbmUsIENMT05FX1BBUkVOVCB8IENMT05FX0ZJTEVTIHwgU0lHQ0hMRCwKKwkJCSAgICBVTUxfQ09ORklHX1NUVUJfREFUQSArIFBBR0VfU0laRSAvIDIgLQorCQkJICAgIHNpemVvZih2b2lkICopKTsKKwlpZihlcnIgIT0gMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzdHViX3N5c2NhbGw0KF9fTlJfcHRyYWNlLCBQVFJBQ0VfVFJBQ0VNRSwgMCwgMCwgMCk7CisJaWYoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHN0dWJfc3lzY2FsbDMoX19OUl9zZXRpdGltZXIsIElUSU1FUl9WSVJUVUFMLAorCQkJICAgIChsb25nKSAmZnJvbS0+dGltZXIsIDApOworCWlmKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzdHViX3N5c2NhbGw2KFNUVUJfTU1BUF9OUiwgVU1MX0NPTkZJR19TVFVCX0RBVEEsIFBBR0VfU0laRSwKKwkJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfRklYRUQgfCBNQVBfU0hBUkVELAorCQkJICAgIGZyb20tPmZkLCBmcm9tLT5vZmZzZXQpOworIG91dDoKKwkvKiBzYXZlIGN1cnJlbnQgcmVzdWx0LiBQYXJlbnQ6IHBpZDsgY2hpbGQ6IHJldGNvZGUgb2YgbW1hcCAqLworCWZyb20tPmVyciA9IGVycjsKKwl0cmFwX215c2VsZigpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9leGVjX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvZXhlY19rZXJuLmMKaW5kZXggYzZiNGQ1ZC4uNzdlZDdiYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9leGVjX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL2V4ZWNfa2Vybi5jCkBAIC0xOCw3ICsxOCw3IEBACiB2b2lkIGZsdXNoX3RocmVhZF9za2FzKHZvaWQpCiB7CiAJZm9yY2VfZmx1c2hfYWxsKCk7Ci0Jc3dpdGNoX21tX3NrYXMoY3VycmVudC0+bW0tPmNvbnRleHQuc2thcy5tbV9mZCk7CisgICAgICAgIHN3aXRjaF9tbV9za2FzKCZjdXJyZW50LT5tbS0+Y29udGV4dC5za2FzLmlkKTsKIH0KIAogdm9pZCBzdGFydF90aHJlYWRfc2thcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlaXAsIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tX2lkLmggYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvbW1faWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRkMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tX2lkLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX01NX0lEX0gKKyNkZWZpbmUgX19NTV9JRF9ICisKK3N0cnVjdCBtbV9pZCB7CisJdW5pb24geworCQlpbnQgbW1fZmQ7CisJCWludCBwaWQ7CisJfSB1OworCXVuc2lnbmVkIGxvbmcgc3RhY2s7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tbXUtc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKaW5kZXggNGNkNjBkNy4uMjc4YjcyZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKQEAgLTYsMTAgKzYsMTUgQEAKICNpZm5kZWYgX19TS0FTX01NVV9ICiAjZGVmaW5lIF9fU0tBU19NTVVfSAogCisjaW5jbHVkZSAibW1faWQuaCIKKwogc3RydWN0IG1tdV9jb250ZXh0X3NrYXMgewotCWludCBtbV9mZDsKKwlzdHJ1Y3QgbW1faWQgaWQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlX3RhYmxlOwogfTsKIAorZXh0ZXJuIHZvaWQgc3dpdGNoX21tX3NrYXMoc3RydWN0IG1tX2lkICogbW1faWRwKTsKKwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3NrYXMuaAppbmRleCA5NmI1MWRiLi5kOTgzZWE4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvc2thcy5oCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9za2FzLmgKQEAgLTYsOSArNiwxMSBAQAogI2lmbmRlZiBfX1NLQVNfSAogI2RlZmluZSBfX1NLQVNfSAogCisjaW5jbHVkZSAibW1faWQuaCIKICNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCiAKIGV4dGVybiBpbnQgdXNlcnNwYWNlX3BpZFtdOworZXh0ZXJuIGludCBwcm9jX21tLCBwdHJhY2VfZmF1bHRpbmZvOwogCiBleHRlcm4gdm9pZCBzd2l0Y2hfdGhyZWFkcyh2b2lkICptZSwgdm9pZCAqbmV4dCk7CiBleHRlcm4gdm9pZCB0aHJlYWRfd2FpdCh2b2lkICpzdywgdm9pZCAqZmIpOwpAQCAtMjIsMTYgKzI0LDE4IEBACiBleHRlcm4gdm9pZCByZW1vdmVfc2lnc3RhY2sodm9pZCk7CiBleHRlcm4gdm9pZCBuZXdfdGhyZWFkX2hhbmRsZXIoaW50IHNpZyk7CiBleHRlcm4gdm9pZCBoYW5kbGVfc3lzY2FsbCh1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCBtYXAoaW50IGZkLCB1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsCi0JCWludCB4LCBpbnQgcGh5c19mZCwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCk7Ci1leHRlcm4gaW50IHVubWFwKGludCBmZCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOwotZXh0ZXJuIGludCBwcm90ZWN0KGludCBmZCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgCi0JCSAgIGludCByLCBpbnQgdywgaW50IHgpOworZXh0ZXJuIGludCBtYXAoc3RydWN0IG1tX2lkICogbW1faWRwLCB1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgbGVuLAorICAgICAgICAgICAgICAgaW50IHIsIGludCB3LCBpbnQgeCwgaW50IHBoeXNfZmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQpOworZXh0ZXJuIGludCB1bm1hcChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2V4dGVybiBpbnQgcHJvdGVjdChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAgdW5zaWduZWQgbG9uZyBsZW4sIGludCByLCBpbnQgdywgaW50IHgpOwogZXh0ZXJuIHZvaWQgdXNlcl9zaWduYWwoaW50IHNpZywgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MsIGludCBwaWQpOwogZXh0ZXJuIGludCBuZXdfbW0oaW50IGZyb20pOwotZXh0ZXJuIHZvaWQgc3RhcnRfdXNlcnNwYWNlKGludCBjcHUpOworZXh0ZXJuIGludCBzdGFydF91c2Vyc3BhY2UodW5zaWduZWQgbG9uZyBzdHViX3N0YWNrKTsKK2V4dGVybiBpbnQgY29weV9jb250ZXh0X3NrYXMwKHVuc2lnbmVkIGxvbmcgc3RhY2ssIGludCBwaWQpOwogZXh0ZXJuIHZvaWQgZ2V0X3NrYXNfZmF1bHRpbmZvKGludCBwaWQsIHN0cnVjdCBmYXVsdGluZm8gKiBmaSk7CiBleHRlcm4gbG9uZyBleGVjdXRlX3N5c2NhbGxfc2thcyh2b2lkICpyKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3R1Yl9zdGFjayh2b2lkKTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9zdHViLWRhdGEuaCBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9zdHViLWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmVkOTJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3N0dWItZGF0YS5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TVFVCX0RBVEFfSAorI2RlZmluZSBfX1NUVUJfREFUQV9ICisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitzdHJ1Y3Qgc3R1Yl9kYXRhIHsKKwlsb25nIG9mZnNldDsKKwlpbnQgZmQ7CisJc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKKwlsb25nIGVycjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tZW0uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtLmMKaW5kZXggNDM4ZGIyZi4uMTQ3NDY2ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9tZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21lbS5jCkBAIC01LDcgKzUsOSBAQAogCiAjaW5jbHVkZSAibGludXgvY29uZmlnLmgiCiAjaW5jbHVkZSAibGludXgvbW0uaCIKKyNpbmNsdWRlICJhc20vcGd0YWJsZS5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCisjaW5jbHVkZSAic2thcy5oIgogCiB1bnNpZ25lZCBsb25nIHNldF90YXNrX3NpemVzX3NrYXMoaW50IGFyZywgdW5zaWduZWQgbG9uZyAqaG9zdF9zaXplX291dCwgCiAJCQkJICB1bnNpZ25lZCBsb25nICp0YXNrX3NpemVfb3V0KQpAQCAtMTgsNyArMjAsOSBAQAogCSp0YXNrX3NpemVfb3V0ID0gQ09ORklHX0hPU1RfVEFTS19TSVpFOwogI2Vsc2UKIAkqaG9zdF9zaXplX291dCA9IHRvcDsKLQkqdGFza19zaXplX291dCA9IHRvcDsKKwlpZiAocHJvY19tbSAmJiBwdHJhY2VfZmF1bHRpbmZvKQorCQkqdGFza19zaXplX291dCA9IHRvcDsKKwllbHNlICp0YXNrX3NpemVfb3V0ID0gQ09ORklHX1NUVUJfU1RBUlQgJiBQR0RJUl9NQVNLOwogI2VuZGlmCiAJcmV0dXJuKCgodW5zaWduZWQgbG9uZykgc2V0X3Rhc2tfc2l6ZXNfc2thcykgJiB+MHhmZmZmZmYpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tZW1fdXNlci5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tZW1fdXNlci5jCmluZGV4IDEzMTBiZjEuLmIwOTgwZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtX3VzZXIuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21lbV91c2VyLmMKQEAgLTMsMTAwICszLDE3MSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKKyNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlICJtZW1fdXNlci5oIgogI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgIm1tX2lkLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAicHJvY19tbS5oIgorI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCisjaW5jbHVkZSAidXNlcl91dGlsLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKKyNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCisjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKKyNpbmNsdWRlICJza2FzLmgiCiAKLXZvaWQgbWFwKGludCBmZCwgdW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LAotCSBpbnQgeCwgaW50IHBoeXNfZmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQpCitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNjYWxsX3N0dWIsIF9fc3lzY2FsbF9zdHViX3N0YXJ0OworCitleHRlcm4gdm9pZCB3YWl0X3N0dWJfZG9uZShpbnQgcGlkLCBpbnQgc2lnLCBjaGFyICogZm5hbWUpOworCitzdGF0aWMgbG9uZyBydW5fc3lzY2FsbF9zdHViKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgaW50IHN5c2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHByb2NfbW1fb3AgbWFwOwotCWludCBwcm90LCBuOworICAgICAgICBpbnQgbiwgcGlkID0gbW1faWRwLT51LnBpZDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyByZWdzW01BWF9SRUdfTlJdOwogCi0JcHJvdCA9IChyID8gUFJPVF9SRUFEIDogMCkgfCAodyA/IFBST1RfV1JJVEUgOiAwKSB8IAotCQkoeCA/IFBST1RfRVhFQyA6IDApOworICAgICAgICBnZXRfc2FmZV9yZWdpc3RlcnMocmVncyk7CisgICAgICAgIHJlZ3NbUkVHU19JUF9JTkRFWF0gPSBVTUxfQ09ORklHX1NUVUJfQ09ERSArCisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKSAmc3lzY2FsbF9zdHViIC0KKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICZfX3N5c2NhbGxfc3R1Yl9zdGFydCk7CisgICAgICAgIC8qIFhYWCBEb24ndCBoYXZlIGEgZGVmaW5lIGZvciBzdGFydGluZyBhIHN5c2NhbGwgKi8KKyAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfTlJdID0gc3lzY2FsbDsKKyAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfQVJHMV0gPSBhcmdzWzBdOworICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9BUkcyXSA9IGFyZ3NbMV07CisgICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX0FSRzNdID0gYXJnc1syXTsKKyAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfQVJHNF0gPSBhcmdzWzNdOworICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9BUkc1XSA9IGFyZ3NbNF07CisgICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX0FSRzZdID0gYXJnc1s1XTsKKyAgICAgICAgbiA9IHB0cmFjZV9zZXRyZWdzKHBpZCwgcmVncyk7CisgICAgICAgIGlmKG4gPCAwKXsKKyAgICAgICAgICAgICAgICBwcmludGsoInJ1bl9zeXNjYWxsX3N0dWIgOiBQVFJBQ0VfU0VUUkVHUyBmYWlsZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgImVycm5vID0gJWRcbiIsIG4pOworICAgICAgICAgICAgICAgIHJldHVybihuKTsKKyAgICAgICAgfQogCi0JbWFwID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fTU1BUCwKLQkJCQkgICAgIC51IAk9IAotCQkJCSAgICAgeyAubW1hcAk9IAotCQkJCSAgICAgICB7IC5hZGRyIAkJPSB2aXJ0LAotCQkJCQkgLmxlbgkJPSBsZW4sCi0JCQkJCSAucHJvdAkJPSBwcm90LAotCQkJCQkgLmZsYWdzCQk9IE1BUF9TSEFSRUQgfCAKLQkJCQkJICAgICAgICAgICAgICAgICAgTUFQX0ZJWEVELAotCQkJCQkgLmZkCQk9IHBoeXNfZmQsCi0JCQkJCSAub2Zmc2V0CT0gb2Zmc2V0Ci0JCQkJICAgICAgIH0gfSB9ICk7Ci0JbiA9IG9zX3dyaXRlX2ZpbGUoZmQsICZtYXAsIHNpemVvZihtYXApKTsKLQlpZihuICE9IHNpemVvZihtYXApKSAKLQkJcHJpbnRrKCJtYXAgOiAvcHJvYy9tbSBtYXAgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLW4pOworICAgICAgICB3YWl0X3N0dWJfZG9uZShwaWQsIDAsICJydW5fc3lzY2FsbF9zdHViIik7CisKKyAgICAgICAgcmV0dXJuKCooKHVuc2lnbmVkIGxvbmcgKikgbW1faWRwLT5zdGFjaykpOwogfQogCi1pbnQgdW5tYXAoaW50IGZkLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK2ludCBtYXAoc3RydWN0IG1tX2lkICptbV9pZHAsIHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBsZW4sCisgICAgICAgIGludCByLCBpbnQgdywgaW50IHgsIGludCBwaHlzX2ZkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0KQogewotCXN0cnVjdCBwcm9jX21tX29wIHVubWFwOwotCWludCBuOworICAgICAgICBpbnQgcHJvdCwgbjsKIAotCXVubWFwID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fTVVOTUFQLAotCQkJCSAgICAgICAudSAJPSAKLQkJCQkgICAgICAgeyAubXVubWFwCT0gCi0JCQkJCSB7IC5hZGRyIAk9ICh1bnNpZ25lZCBsb25nKSBhZGRyLAotCQkJCQkgICAubGVuCQk9IGxlbiB9IH0gfSApOwotCW4gPSBvc193cml0ZV9maWxlKGZkLCAmdW5tYXAsIHNpemVvZih1bm1hcCkpOwotCWlmKG4gIT0gc2l6ZW9mKHVubWFwKSkgewotCQlpZihuIDwgMCkKLQkJCXJldHVybihuKTsKLQkJZWxzZSBpZihuID4gMCkKLQkJCXJldHVybigtRUlPKTsKLQl9CisgICAgICAgIHByb3QgPSAociA/IFBST1RfUkVBRCA6IDApIHwgKHcgPyBQUk9UX1dSSVRFIDogMCkgfAorICAgICAgICAgICAgICAgICh4ID8gUFJPVF9FWEVDIDogMCk7CiAKLQlyZXR1cm4oMCk7CisgICAgICAgIGlmKHByb2NfbW0peworICAgICAgICAgICAgICAgIHN0cnVjdCBwcm9jX21tX29wIG1hcDsKKyAgICAgICAgICAgICAgICBpbnQgZmQgPSBtbV9pZHAtPnUubW1fZmQ7CisgICAgICAgICAgICAgICAgbWFwID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AJPSBNTV9NTUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnUJCT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm1tYXAJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5hZGRyCT0gdmlydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuCT0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm90CT0gcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmxhZ3MJPSBNQVBfU0hBUkVEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfRklYRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZkCT0gcGh5c19mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0PSBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9IH0gKTsKKyAgICAgICAgICAgICAgICBuID0gb3Nfd3JpdGVfZmlsZShmZCwgJm1hcCwgc2l6ZW9mKG1hcCkpOworICAgICAgICAgICAgICAgIGlmKG4gIT0gc2l6ZW9mKG1hcCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm1hcCA6IC9wcm9jL21tIG1hcCBmYWlsZWQsIGVyciA9ICVkXG4iLCAtbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbG9uZyByZXM7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7IHZpcnQsIGxlbiwgcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgcGh5c19mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1BUF9PRkZTRVQob2Zmc2V0KSB9OworCisgICAgICAgICAgICAgICAgcmVzID0gcnVuX3N5c2NhbGxfc3R1YihtbV9pZHAsIFNUVUJfTU1BUF9OUiwgYXJncyk7CisgICAgICAgICAgICAgICAgaWYoKHZvaWQgKikgcmVzID09IE1BUF9GQUlMRUQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm1tYXAgc3R1YiBmYWlsZWQsIGVycm5vID0gJWRcbiIsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKIH0KIAotaW50IHByb3RlY3QoaW50IGZkLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIAotCSAgICBpbnQgeCwgaW50IG11c3Rfc3VjY2VlZCkKK2ludCB1bm1hcChzdHJ1Y3QgbW1faWQgKm1tX2lkcCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0Jc3RydWN0IHByb2NfbW1fb3AgcHJvdGVjdDsKLQlpbnQgcHJvdCwgbjsKKyAgICAgICAgaW50IG47CiAKLQlwcm90ID0gKHIgPyBQUk9UX1JFQUQgOiAwKSB8ICh3ID8gUFJPVF9XUklURSA6IDApIHwgCi0JCSh4ID8gUFJPVF9FWEVDIDogMCk7CisgICAgICAgIGlmKHByb2NfbW0peworICAgICAgICAgICAgICAgIHN0cnVjdCBwcm9jX21tX29wIHVubWFwOworICAgICAgICAgICAgICAgIGludCBmZCA9IG1tX2lkcC0+dS5tbV9mZDsKKyAgICAgICAgICAgICAgICB1bm1hcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wCT0gTU1fTVVOTUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudQk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm11bm1hcAk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuYWRkcgk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW4JCT0gbGVuIH0gfSB9ICk7CisgICAgICAgICAgICAgICAgbiA9IG9zX3dyaXRlX2ZpbGUoZmQsICZ1bm1hcCwgc2l6ZW9mKHVubWFwKSk7CisgICAgICAgICAgICAgICAgaWYobiAhPSBzaXplb2YodW5tYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKG4pOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihuID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC1FSU8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyAodW5zaWduZWQgbG9uZykgYWRkciwgbGVuLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH07CiAKLQlwcm90ZWN0ID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fTVBST1RFQ1QsCi0JCQkJICAgICAgIC51IAk9IAotCQkJCSAgICAgICB7IC5tcHJvdGVjdAk9IAotCQkJCQkgeyAuYWRkciAJPSAodW5zaWduZWQgbG9uZykgYWRkciwKLQkJCQkJICAgLmxlbgkJPSBsZW4sCi0JCQkJCSAgIC5wcm90CT0gcHJvdCB9IH0gfSApOworICAgICAgICAgICAgICAgIHJlcyA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX211bm1hcCwgYXJncyk7CisgICAgICAgICAgICAgICAgaWYocmVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygibXVubWFwIHN0dWIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCByZXMpOworICAgICAgICB9CiAKLQluID0gb3Nfd3JpdGVfZmlsZShmZCwgJnByb3RlY3QsIHNpemVvZihwcm90ZWN0KSk7Ci0JaWYobiAhPSBzaXplb2YocHJvdGVjdCkpIHsKLQkJaWYobiA9PSAwKSByZXR1cm4oMCk7CisgICAgICAgIHJldHVybigwKTsKK30KIAotCQlpZihtdXN0X3N1Y2NlZWQpCi0JCQlwYW5pYygicHJvdGVjdCBmYWlsZWQsIGVyciA9ICVkIiwgLW4pOworaW50IHByb3RlY3Qoc3RydWN0IG1tX2lkICptbV9pZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJICAgIGludCByLCBpbnQgdywgaW50IHgpCit7CisgICAgICAgIHN0cnVjdCBwcm9jX21tX29wIHByb3RlY3Q7CisgICAgICAgIGludCBwcm90LCBuOwogCi0JCXJldHVybigtRUlPKTsKLQl9CisgICAgICAgIHByb3QgPSAociA/IFBST1RfUkVBRCA6IDApIHwgKHcgPyBQUk9UX1dSSVRFIDogMCkgfAorICAgICAgICAgICAgICAgICh4ID8gUFJPVF9FWEVDIDogMCk7CiAKLQlyZXR1cm4oMCk7CisgICAgICAgIGlmKHByb2NfbW0peworICAgICAgICAgICAgICAgIGludCBmZCA9IG1tX2lkcC0+dS5tbV9mZDsKKyAgICAgICAgICAgICAgICBwcm90ZWN0ID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AJPSBNTV9NUFJPVEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudQk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAubXByb3RlY3QJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuYWRkcgk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuCT0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvdAk9IHByb3QgfSB9IH0gKTsKKworICAgICAgICAgICAgICAgIG4gPSBvc193cml0ZV9maWxlKGZkLCAmcHJvdGVjdCwgc2l6ZW9mKHByb3RlY3QpKTsKKyAgICAgICAgICAgICAgICBpZihuICE9IHNpemVvZihwcm90ZWN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJwcm90ZWN0IGZhaWxlZCwgZXJyID0gJWQiLCAtbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgYWRkciwgbGVuLCBwcm90LCAwLCAwLCAwIH07CisKKyAgICAgICAgICAgICAgICByZXMgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgX19OUl9tcHJvdGVjdCwgYXJncyk7CisgICAgICAgICAgICAgICAgaWYocmVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJtcHJvdGVjdCBzdHViIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybigwKTsKIH0KIAogdm9pZCBiZWZvcmVfbWVtX3NrYXModW5zaWduZWQgbG9uZyB1bnVzZWQpCiB7CiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYwppbmRleCA2Y2I5YTZkLi5kMjMyZGFhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKQEAgLTMsNDYgKzMsMTQzIEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIAorI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgogI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCiAjaW5jbHVkZSAibGludXgvbGlzdC5oIgogI2luY2x1ZGUgImxpbnV4L3NwaW5sb2NrLmgiCiAjaW5jbHVkZSAibGludXgvc2xhYi5oIgorI2luY2x1ZGUgImxpbnV4L2Vycm5vLmgiCisjaW5jbHVkZSAibGludXgvbW0uaCIKICNpbmNsdWRlICJhc20vY3VycmVudC5oIgogI2luY2x1ZGUgImFzbS9zZWdtZW50LmgiCiAjaW5jbHVkZSAiYXNtL21tdS5oIgorI2luY2x1ZGUgImFzbS9wZ2FsbG9jLmgiCisjaW5jbHVkZSAiYXNtL3BndGFibGUuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInNrYXMuaCIKIAorZXh0ZXJuIGludCBfX3N5c2NhbGxfc3R1Yl9zdGFydDsKKworc3RhdGljIGludCBpbml0X3N0dWJfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHByb2MsCisJCQkgdW5zaWduZWQgbG9uZyBrZXJuZWwpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcGdkID0gcGdkX29mZnNldChtbSwgcHJvYyk7CisJcHVkID0gcHVkX2FsbG9jKG1tLCBwZ2QsIHByb2MpOworCWlmICghcHVkKQorCQlnb3RvIG91dDsKKworCXBtZCA9IHBtZF9hbGxvYyhtbSwgcHVkLCBwcm9jKTsKKwlpZiAoIXBtZCkKKwkJZ290byBvdXRfcG1kOworCisJcHRlID0gcHRlX2FsbG9jX21hcChtbSwgcG1kLCBwcm9jKTsKKwlpZiAoIXB0ZSkKKwkJZ290byBvdXRfcHRlOworCisJLyogVGhlcmUncyBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBza2FzMCBzdHViIHBhZ2VzLCBzdGFjaworCSAqIHJhbmRvbWl6YXRpb24sIGFuZCB0aGUgQlVHIGF0IHRoZSBlbmQgb2YgZXhpdF9tbWFwLiAgZXhpdF9tbWFwCisgICAgICAgICAqIGNoZWNrcyB0aGF0IHRoZSBudW1iZXIgb2YgcGFnZSB0YWJsZXMgZnJlZWQgaXMgdGhlIHNhbWUgYXMgaGFkCisgICAgICAgICAqIGJlZW4gYWxsb2NhdGVkLiAgSWYgdGhlIHN0YWNrIGlzIG9uIHRoZSBsYXN0IHBhZ2UgdGFibGUgcGFnZSwKKwkgKiB0aGVuIHRoZSBzdGFjayBwdGUgcGFnZSB3aWxsIGJlIGZyZWVkLCBhbmQgaWYgbm90LCBpdCB3b24ndC4gIFRvCisJICogYXZvaWQgaGF2aW5nIHRvIGtub3cgd2hlcmUgdGhlIHN0YWNrIGlzLCBvciBpZiB0aGUgcHJvY2VzcyBtYXBwZWQKKwkgKiBzb21ldGhpbmcgYXQgdGhlIHRvcCBvZiBpdHMgYWRkcmVzcyBzcGFjZSBmb3Igc29tZSBvdGhlciByZWFzb24sCisJICogd2Ugc2V0IFRBU0tfU0laRSB0byBlbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IHBhZ2UgdGFibGUuCisJICogVGhpcyBrZWVwcyBleGl0X21tYXAgb2ZmIHRoZSBsYXN0IHBhZ2UsIGJ1dCBpbnRyb2R1Y2VzIGEgbGVhaworCSAqIG9mIHRoYXQgcGFnZS4gIFNvLCB3ZSBoYW5nIG9udG8gaXQgaGVyZSBhbmQgZnJlZSBpdCBpbgorCSAqIGRlc3Ryb3lfY29udGV4dF9za2FzLgorCSAqLworCisgICAgICAgIG1tLT5jb250ZXh0LnNrYXMubGFzdF9wYWdlX3RhYmxlID0gcG1kX3BhZ2Vfa2VybmVsKCpwbWQpOworCisJKnB0ZSA9IG1rX3B0ZSh2aXJ0X3RvX3BhZ2Uoa2VybmVsKSwgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCkpOworCSpwdGUgPSBwdGVfbWtleGVjKCpwdGUpOworCSpwdGUgPSBwdGVfd3Jwcm90ZWN0KCpwdGUpOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlyZXR1cm4oMCk7CisKKyBvdXRfcG1kOgorCXB1ZF9mcmVlKHB1ZCk7Cisgb3V0X3B0ZToKKwlwbWRfZnJlZShwbWQpOworIG91dDoKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcmV0dXJuKC1FTk9NRU0pOworfQorCiBpbnQgaW5pdF9uZXdfY29udGV4dF9za2FzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JaW50IGZyb207CisJc3RydWN0IG1tX3N0cnVjdCAqY3VyX21tID0gY3VycmVudC0+bW07CisJc3RydWN0IG1tX2lkICpjdXJfbW1faWQgPSAmY3VyX21tLT5jb250ZXh0LnNrYXMuaWQ7CisJc3RydWN0IG1tX2lkICptbV9pZCA9ICZtbS0+Y29udGV4dC5za2FzLmlkOworCXVuc2lnbmVkIGxvbmcgc3RhY2s7CisJaW50IGZyb20sIHJldDsKIAotCWlmKChjdXJyZW50LT5tbSAhPSBOVUxMKSAmJiAoY3VycmVudC0+bW0gIT0gJmluaXRfbW0pKQotCQlmcm9tID0gY3VycmVudC0+bW0tPmNvbnRleHQuc2thcy5tbV9mZDsKLQllbHNlIGZyb20gPSAtMTsKKwlpZihwcm9jX21tKXsKKwkJaWYoKGN1cl9tbSAhPSBOVUxMKSAmJiAoY3VyX21tICE9ICZpbml0X21tKSkKKwkJCWZyb20gPSBjdXJfbW0tPmNvbnRleHQuc2thcy5pZC51Lm1tX2ZkOworCQllbHNlIGZyb20gPSAtMTsKIAotCW1tLT5jb250ZXh0LnNrYXMubW1fZmQgPSBuZXdfbW0oZnJvbSk7Ci0JaWYobW0tPmNvbnRleHQuc2thcy5tbV9mZCA8IDApewotCQlwcmludGsoImluaXRfbmV3X2NvbnRleHRfc2thcyAtIG5ld19tbSBmYWlsZWQsIGVycm5vID0gJWRcbiIsCi0JCSAgICAgICBtbS0+Y29udGV4dC5za2FzLm1tX2ZkKTsKLQkJcmV0dXJuKG1tLT5jb250ZXh0LnNrYXMubW1fZmQpOworCQlyZXQgPSBuZXdfbW0oZnJvbSk7CisJCWlmKHJldCA8IDApeworCQkJcHJpbnRrKCJpbml0X25ld19jb250ZXh0X3NrYXMgLSBuZXdfbW0gZmFpbGVkLCAiCisJCQkgICAgICAgImVycm5vID0gJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW1tX2lkLT51Lm1tX2ZkID0gcmV0OworCX0KKwllbHNlIHsKKwkJLyogVGhpcyB6ZXJvcyB0aGUgZW50cnkgdGhhdCBwZ2RfYWxsb2MgZGlkbid0LCBuZWVkZWQgc2luY2UKKwkJICogd2UgYXJlIGFib3V0IHRvIHJlaW5pdGlhbGl6ZSBpdCwgYW5kIHdhbnQgbW0ubnJfcHRlcyB0bworCQkgKiBiZSBhY2N1cmF0ZS4KKwkJICovCisJCW1tLT5wZ2RbVVNFUl9QVFJTX1BFUl9QR0RdID0gX19wZ2QoMCk7CisKKwkJcmV0ID0gaW5pdF9zdHViX3B0ZShtbSwgQ09ORklHX1NUVUJfQ09ERSwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpICZfX3N5c2NhbGxfc3R1Yl9zdGFydCk7CisJCWlmKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IC1FTk9NRU07CisJCXN0YWNrID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZihzdGFjayA9PSAwKQorCQkJZ290byBvdXQ7CisJCW1tX2lkLT5zdGFjayA9IHN0YWNrOworCisJCXJldCA9IGluaXRfc3R1Yl9wdGUobW0sIENPTkZJR19TVFVCX0RBVEEsIHN0YWNrKTsKKwkJaWYocmV0KQorCQkJZ290byBvdXRfZnJlZTsKKworCQltbS0+bnJfcHRlcy0tOworCisJCWlmKChjdXJfbW0gIT0gTlVMTCkgJiYgKGN1cl9tbSAhPSAmaW5pdF9tbSkpCisJCQltbV9pZC0+dS5waWQgPSBjb3B5X2NvbnRleHRfc2thczAoc3RhY2ssCisJCQkJCQkJICBjdXJfbW1faWQtPnUucGlkKTsKKwkJZWxzZSBtbV9pZC0+dS5waWQgPSBzdGFydF91c2Vyc3BhY2Uoc3RhY2spOwogCX0KIAotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWZyZWVfcGFnZShtbV9pZC0+c3RhY2spOworIG91dDoKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGRlc3Ryb3lfY29udGV4dF9za2FzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCW9zX2Nsb3NlX2ZpbGUobW0tPmNvbnRleHQuc2thcy5tbV9mZCk7Ci19CisJc3RydWN0IG1tdV9jb250ZXh0X3NrYXMgKm1tdSA9ICZtbS0+Y29udGV4dC5za2FzOwogCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLworCWlmKHByb2NfbW0pCisJCW9zX2Nsb3NlX2ZpbGUobW11LT5pZC51Lm1tX2ZkKTsKKwllbHNlIHsKKwkJb3Nfa2lsbF9wdHJhY2VkX3Byb2Nlc3MobW11LT5pZC51LnBpZCwgMSk7CisJCWZyZWVfcGFnZShtbXUtPmlkLnN0YWNrKTsKKwkJZnJlZV9wYWdlKG1tdS0+bGFzdF9wYWdlX3RhYmxlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCmluZGV4IDc3M2NkMmIuLmJhNjcxZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCkBAIC0xLDUgKzEsNSBAQAogLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAyLSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIApAQCAtMTMsNyArMTMsOSBAQAogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgogI2luY2x1ZGUgInRpbWVfdXNlci5oIgpAQCAtMjEsMTMgKzIzLDE4IEBACiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAic2thcy5oIgorI2luY2x1ZGUgInN0dWItZGF0YS5oIgorI2luY2x1ZGUgIm1tX2lkLmgiCiAjaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKKyNpbmNsdWRlICJzeXNkZXAvc3R1Yi5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAicHJvY19tbS5oIgogI2luY2x1ZGUgInNrYXNfcHRyYWNlLmgiCiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCiAjaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogCiBpbnQgaXNfc2thc193aW5jaChpbnQgcGlkLCBpbnQgZmQsIHZvaWQgKmRhdGEpCkBAIC0zOSwyMCArNDYsNTUgQEAKIAlyZXR1cm4oMSk7CiB9CiAKK3ZvaWQgd2FpdF9zdHViX2RvbmUoaW50IHBpZCwgaW50IHNpZywgY2hhciAqIGZuYW1lKQoreworICAgICAgICBpbnQgbiwgc3RhdHVzLCBlcnI7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmICggc2lnICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcHRyYWNlKFBUUkFDRV9DT05ULCBwaWQsIDAsIHNpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCIlcyA6IGNvbnRpbnVlIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsIGVycm5vKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2lnID0gMDsKKworICAgICAgICAgICAgICAgIENBVENIX0VJTlRSKG4gPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV1VOVFJBQ0VEKSk7CisgICAgICAgIH0gd2hpbGUoKG4gPj0gMCkgJiYgV0lGU1RPUFBFRChzdGF0dXMpICYmCisgICAgICAgICAgICAgICAgKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHVlRBTFJNKSk7CisKKyAgICAgICAgaWYoKG4gPCAwKSB8fCAhV0lGU1RPUFBFRChzdGF0dXMpIHx8CisgICAgICAgICAgIChXU1RPUFNJRyhzdGF0dXMpICE9IFNJR1VTUjEgJiYgV1NUT1BTSUcoc3RhdHVzICE9IFNJR1RSQVApKSl7CisgICAgICAgICAgICAgICAgcGFuaWMoIiVzIDogZmFpbGVkIHRvIHdhaXQgZm9yIFNJR1VTUjEvU0lHVFJBUCwgIgorICAgICAgICAgICAgICAgICAgICAgICJwaWQgPSAlZCwgbiA9ICVkLCBlcnJubyA9ICVkLCBzdGF0dXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBwaWQsIG4sIGVycm5vLCBzdGF0dXMpOworICAgICAgICB9Cit9CisKIHZvaWQgZ2V0X3NrYXNfZmF1bHRpbmZvKGludCBwaWQsIHN0cnVjdCBmYXVsdGluZm8gKiBmaSkKIHsKLQlpbnQgZXJyOworICAgICAgICBpbnQgZXJyOwogCi0gICAgICAgIGVyciA9IHB0cmFjZShQVFJBQ0VfRkFVTFRJTkZPLCBwaWQsIDAsIGZpKTsKLQlpZihlcnIpCi0gICAgICAgICAgICAgICAgcGFuaWMoImdldF9za2FzX2ZhdWx0aW5mbyAtIFBUUkFDRV9GQVVMVElORk8gZmFpbGVkLCAiCi0gICAgICAgICAgICAgICAgICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKyAgICAgICAgaWYocHRyYWNlX2ZhdWx0aW5mbyl7CisgICAgICAgICAgICAgICAgZXJyID0gcHRyYWNlKFBUUkFDRV9GQVVMVElORk8sIHBpZCwgMCwgZmkpOworICAgICAgICAgICAgICAgIGlmKGVycikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJnZXRfc2thc19mYXVsdGluZm8gLSBQVFJBQ0VfRkFVTFRJTkZPIGZhaWxlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKIAotICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpMzg2LCB3aGljaCBoYXMgZGlmZmVyZW50IHN0cnVjdHMgKi8KLSAgICAgICAgaWYgKHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbykgPCBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykpCi0gICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyICopZmkgKyBzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pLCAwLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykgLQotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pKTsKKyAgICAgICAgICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpMzg2LCB3aGljaCBoYXMgZGlmZmVyZW50IHN0cnVjdHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2l6ZW9mKHN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvKSA8IHNpemVvZihzdHJ1Y3QgZmF1bHRpbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKWZpICsgc2l6ZW9mKHN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbykpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHdhaXRfc3R1Yl9kb25lKHBpZCwgU0lHU0VHViwgImdldF9za2FzX2ZhdWx0aW5mbyIpOworCisgICAgICAgICAgICAgICAgLyogZmF1bHRpbmZvIGlzIHByZXBhcmVkIGJ5IHRoZSBzdHViLXNlZ3YtaGFuZGxlciBhdCBzdGFydCBvZgorICAgICAgICAgICAgICAgICAqIHRoZSBzdHViIHN0YWNrIHBhZ2UuIFdlIGp1c3QgaGF2ZSB0byBjb3B5IGl0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG1lbWNweShmaSwgKHZvaWQgKiljdXJyZW50X3N0dWJfc3RhY2soKSwgc2l6ZW9mKCpmaSkpOworICAgICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9zZWd2KGludCBwaWQsIHVuaW9uIHVtbF9wdF9yZWdzICogcmVncykKQEAgLTkxLDExICsxMzMsNTYgQEAKIAloYW5kbGVfc3lzY2FsbChyZWdzKTsKIH0KIAotc3RhdGljIGludCB1c2Vyc3BhY2VfdHJhbXAodm9pZCAqYXJnKQorZXh0ZXJuIGludCBfX3N5c2NhbGxfc3R1Yl9zdGFydDsKKworc3RhdGljIGludCB1c2Vyc3BhY2VfdHJhbXAodm9pZCAqc3RhY2spCiB7Ci0JaW5pdF9uZXdfdGhyZWFkX3NpZ25hbHMoMCk7Ci0JZW5hYmxlX3RpbWVyKCk7CisJdm9pZCAqYWRkcjsKKwogCXB0cmFjZShQVFJBQ0VfVFJBQ0VNRSwgMCwgMCwgMCk7CisKKwlpbml0X25ld190aHJlYWRfc2lnbmFscygxKTsKKwllbmFibGVfdGltZXIoKTsKKworCWlmKCFwcm9jX21tKXsKKwkJLyogVGhpcyBoYXMgYSBwdGUsIGJ1dCBpdCBjYW4ndCBiZSBtYXBwZWQgaW4gd2l0aCB0aGUgdXN1YWwKKwkJICogdGxiX2ZsdXNoIG1lY2hhbmlzbSBiZWNhdXNlIHRoaXMgaXMgcGFydCBvZiB0aGF0IG1lY2hhbmlzbQorCQkgKi8KKwkJaW50IGZkOworCQlfX3U2NCBvZmZzZXQ7CisKKwkJZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cygmX19zeXNjYWxsX3N0dWJfc3RhcnQpLCAmb2Zmc2V0KTsKKwkJYWRkciA9IG1tYXA2NCgodm9pZCAqKSBVTUxfQ09ORklHX1NUVUJfQ09ERSwgcGFnZV9zaXplKCksCisJCQkgICAgICBQUk9UX0VYRUMsIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCBmZCwgb2Zmc2V0KTsKKwkJaWYoYWRkciA9PSBNQVBfRkFJTEVEKXsKKwkJCXByaW50aygibWFwcGluZyBtbWFwIHN0dWIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIGVycm5vKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlpZihzdGFjayAhPSBOVUxMKXsKKwkJCWZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoc3RhY2spLCAmb2Zmc2V0KTsKKwkJCWFkZHIgPSBtbWFwKCh2b2lkICopIFVNTF9DT05GSUdfU1RVQl9EQVRBLCBwYWdlX3NpemUoKSwKKwkJCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQkgICAgTUFQX0ZJWEVEIHwgTUFQX1NIQVJFRCwgZmQsIG9mZnNldCk7CisJCQlpZihhZGRyID09IE1BUF9GQUlMRUQpeworCQkJCXByaW50aygibWFwcGluZyBzZWdmYXVsdCBzdGFjayBmYWlsZWQsICIKKwkJCQkgICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQl9CisJfQorCWlmKCFwdHJhY2VfZmF1bHRpbmZvICYmIChzdGFjayAhPSBOVUxMKSl7CisJCXVuc2lnbmVkIGxvbmcgdiA9IFVNTF9DT05GSUdfU1RVQl9DT0RFICsKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBzdHViX3NlZ3ZfaGFuZGxlciAtCisJCQkJICAodW5zaWduZWQgbG9uZykgJl9fc3lzY2FsbF9zdHViX3N0YXJ0OworCisJCXNldF9zaWdzdGFjaygodm9pZCAqKSBVTUxfQ09ORklHX1NUVUJfREFUQSwgcGFnZV9zaXplKCkpOworCQlzZXRfaGFuZGxlcihTSUdTRUdWLCAodm9pZCAqKSB2LCBTQV9PTlNUQUNLLAorCQkJICAgIFNJR0lPLCBTSUdXSU5DSCwgU0lHQUxSTSwgU0lHVlRBTFJNLAorCQkJICAgIFNJR1VTUjEsIC0xKTsKKwl9CisKIAlvc19zdG9wX3Byb2Nlc3Mob3NfZ2V0cGlkKCkpOwogCXJldHVybigwKTsKIH0KQEAgLTEwNSwxMSArMTkyLDExIEBACiAjZGVmaW5lIE5SX0NQVVMgMQogaW50IHVzZXJzcGFjZV9waWRbTlJfQ1BVU107CiAKLXZvaWQgc3RhcnRfdXNlcnNwYWNlKGludCBjcHUpCitpbnQgc3RhcnRfdXNlcnNwYWNlKHVuc2lnbmVkIGxvbmcgc3R1Yl9zdGFjaykKIHsKIAl2b2lkICpzdGFjazsKIAl1bnNpZ25lZCBsb25nIHNwOwotCWludCBwaWQsIHN0YXR1cywgbjsKKwlpbnQgcGlkLCBzdGF0dXMsIG4sIGZsYWdzOwogCiAJc3RhY2sgPSBtbWFwKE5VTEwsIFBBR0VfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKIAkJICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKQEAgLTExNyw4ICsyMDQsOSBAQAogCQlwYW5pYygic3RhcnRfdXNlcnNwYWNlIDogbW1hcCBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7CiAJc3AgPSAodW5zaWduZWQgbG9uZykgc3RhY2sgKyBQQUdFX1NJWkUgLSBzaXplb2Yodm9pZCAqKTsKIAotCXBpZCA9IGNsb25lKHVzZXJzcGFjZV90cmFtcCwgKHZvaWQgKikgc3AsIAotCQkgICAgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsIE5VTEwpOworCWZsYWdzID0gQ0xPTkVfRklMRVMgfCBTSUdDSExEOworCWlmKHByb2NfbW0pIGZsYWdzIHw9IENMT05FX1ZNOworCXBpZCA9IGNsb25lKHVzZXJzcGFjZV90cmFtcCwgKHZvaWQgKikgc3AsIGZsYWdzLCAodm9pZCAqKSBzdHViX3N0YWNrKTsKIAlpZihwaWQgPCAwKQogCQlwYW5pYygic3RhcnRfdXNlcnNwYWNlIDogY2xvbmUgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOwogCkBAIC0xNDAsNyArMjI4LDcgQEAKIAlpZihtdW5tYXAoc3RhY2ssIFBBR0VfU0laRSkgPCAwKQogCQlwYW5pYygic3RhcnRfdXNlcnNwYWNlIDogbXVubWFwIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOwogCi0JdXNlcnNwYWNlX3BpZFtjcHVdID0gcGlkOworCXJldHVybihwaWQpOwogfQogCiB2b2lkIHVzZXJzcGFjZSh1bmlvbiB1bWxfcHRfcmVncyAqcmVncykKQEAgLTE3NCw3ICsyNjIsOSBAQAogCQlpZihXSUZTVE9QUEVEKHN0YXR1cykpewogCQkgIAlzd2l0Y2goV1NUT1BTSUcoc3RhdHVzKSl7CiAJCQljYXNlIFNJR1NFR1Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9zZWd2KHBpZCwgcmVncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFBUUkFDRV9GVUxMX0ZBVUxUSU5GTyB8fCAhcHRyYWNlX2ZhdWx0aW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX3NpZ25hbChTSUdTRUdWLCByZWdzLCBwaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGhhbmRsZV9zZWd2KHBpZCwgcmVncyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNJR1RSQVAgKyAweDgwOgogCQkJICAgICAgICBoYW5kbGVfdHJhcChwaWQsIHJlZ3MsIGxvY2FsX3VzaW5nX3N5c2VtdSk7CkBAIC0xOTQsNiArMjg0LDcgQEAKIAkJCSAgICAgICAgcHJpbnRrKCJ1c2Vyc3BhY2UgLSBjaGlsZCBzdG9wcGVkIHdpdGggc2lnbmFsICIKIAkJCQkgICAgICAgIiVkXG4iLCBXU1RPUFNJRyhzdGF0dXMpKTsKIAkJCX0KKwkJCXBpZCA9IHVzZXJzcGFjZV9waWRbMF07CiAJCQlpbnRlcnJ1cHRfZW5kKCk7CiAKIAkJCS8qIEF2b2lkIC1FUkVTVEFSVFNZUyBoYW5kbGluZyBpbiBob3N0ICovCkBAIC0yMDcsNiArMjk4LDY3IEBACiAjZGVmaW5lIElOSVRfSk1QX0hBTFQgMwogI2RlZmluZSBJTklUX0pNUF9SRUJPT1QgNAogCisKK2ludCBjb3B5X2NvbnRleHRfc2thczAodW5zaWduZWQgbG9uZyBuZXdfc3RhY2ssIGludCBwaWQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIHJlZ3NbTUFYX1JFR19OUl07CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0YWNrID0gY3VycmVudF9zdHViX3N0YWNrKCk7CisJc3RydWN0IHN0dWJfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc3R1Yl9kYXRhICopIGN1cnJlbnRfc3RhY2s7CisJc3RydWN0IHN0dWJfZGF0YSAqY2hpbGRfZGF0YSA9IChzdHJ1Y3Qgc3R1Yl9kYXRhICopIG5ld19zdGFjazsKKwlfX3U2NCBuZXdfb2Zmc2V0OworCWludCBuZXdfZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cygodm9pZCAqKW5ld19zdGFjayksICZuZXdfb2Zmc2V0KTsKKworCS8qIHByZXBhcmUgb2Zmc2V0IGFuZCBmZCBvZiBjaGlsZCdzIHN0YWNrIGFzIGFyZ3VtZW50IGZvciBwYXJlbnQncworCSAqIGFuZCBjaGlsZCdzIG1tYXAyIGNhbGxzCisJICovCisJKmRhdGEgPSAoKHN0cnVjdCBzdHViX2RhdGEpIHsgLm9mZnNldAk9IE1NQVBfT0ZGU0VUKG5ld19vZmZzZXQpLAorCQkJCSAgICAgIC5mZAk9IG5ld19mZCwKKwkJCQkgICAgICAudGltZXIJPSAoKHN0cnVjdCBpdGltZXJ2YWwpCisJCQkJCSAgICAgICAgICAgeyB7IDAsIDEwMDAwMDAgLyBoeigpIH0sCisJCQkJCQkgICAgIHsgMCwgMTAwMDAwMCAvIGh6KCkgfX0pfSk7CisJZ2V0X3NhZmVfcmVnaXN0ZXJzKHJlZ3MpOworCisJLyogU2V0IHBhcmVudCdzIGluc3RydWN0aW9uIHBvaW50ZXIgdG8gc3RhcnQgb2YgY2xvbmUtc3R1YiAqLworCXJlZ3NbUkVHU19JUF9JTkRFWF0gPSBVTUxfQ09ORklHX1NUVUJfQ09ERSArCisJCQkJKHVuc2lnbmVkIGxvbmcpIHN0dWJfY2xvbmVfaGFuZGxlciAtCisJCQkJKHVuc2lnbmVkIGxvbmcpICZfX3N5c2NhbGxfc3R1Yl9zdGFydDsKKwlyZWdzW1JFR1NfU1BfSU5ERVhdID0gVU1MX0NPTkZJR19TVFVCX0RBVEEgKyBQQUdFX1NJWkUgLQorCQlzaXplb2Yodm9pZCAqKTsKKwllcnIgPSBwdHJhY2Vfc2V0cmVncyhwaWQsIHJlZ3MpOworCWlmKGVyciA8IDApCisJCXBhbmljKCJjb3B5X2NvbnRleHRfc2thczAgOiBQVFJBQ0VfU0VUUkVHUyBmYWlsZWQsICIKKwkJICAgICAgInBpZCA9ICVkLCBlcnJubyA9ICVkXG4iLCBwaWQsIGVycm5vKTsKKworCS8qIHNldCBhIHdlbGwga25vd24gcmV0dXJuIGNvZGUgZm9yIGRldGVjdGlvbiBvZiBjaGlsZCB3cml0ZSBmYWlsdXJlICovCisJY2hpbGRfZGF0YS0+ZXJyID0gMTIzNDU2Nzg7CisKKwkvKiBXYWl0LCB1bnRpbCBwYXJlbnQgaGFzIGZpbmlzaGVkIGl0cyB3b3JrOiByZWFkIGNoaWxkJ3MgcGlkIGZyb20KKwkgKiBwYXJlbnQncyBzdGFjaywgYW5kIGNoZWNrLCBpZiBiYWQgcmVzdWx0LgorCSAqLworCXdhaXRfc3R1Yl9kb25lKHBpZCwgMCwgImNvcHlfY29udGV4dF9za2FzMCIpOworCisJcGlkID0gZGF0YS0+ZXJyOworCWlmKHBpZCA8IDApCisJCXBhbmljKCJjb3B5X2NvbnRleHRfc2thczAgLSBzdHViLXBhcmVudCByZXBvcnRzIGVycm9yICVkXG4iLAorCQkgICAgICBwaWQpOworCisJLyogV2FpdCwgdW50aWwgY2hpbGQgaGFzIGZpbmlzaGVkIHRvbzogcmVhZCBjaGlsZCdzIHJlc3VsdCBmcm9tCisJICogY2hpbGQncyBzdGFjayBhbmQgY2hlY2sgaXQuCisJICovCisJd2FpdF9zdHViX2RvbmUocGlkLCAtMSwgImNvcHlfY29udGV4dF9za2FzMCIpOworCWlmIChjaGlsZF9kYXRhLT5lcnIgIT0gVU1MX0NPTkZJR19TVFVCX0RBVEEpCisJCXBhbmljKCJjb3B5X2NvbnRleHRfc2thczAgLSBzdHViLWNoaWxkIHJlcG9ydHMgZXJyb3IgJWRcbiIsCisJCSAgICAgIGNoaWxkX2RhdGEtPmVycik7CisKKwlpZiAocHRyYWNlKFBUUkFDRV9PTERTRVRPUFRJT05TLCBwaWQsIE5VTEwsCisJCSAgICh2b2lkICopUFRSQUNFX09fVFJBQ0VTWVNHT09EKSA8IDApCisJCXBhbmljKCJjb3B5X2NvbnRleHRfc2thczAgOiBQVFJBQ0VfU0VUT1BUSU9OUyBmYWlsZWQsICIKKwkJICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKworCXJldHVybiBwaWQ7Cit9CisKIHZvaWQgbmV3X3RocmVhZCh2b2lkICpzdGFjaywgdm9pZCAqKnN3aXRjaF9idWZfcHRyLCB2b2lkICoqZm9ya19idWZfcHRyLAogCQl2b2lkICgqaGFuZGxlcikoaW50KSkKIHsKQEAgLTMzNCwyMSArNDg2LDE5IEBACiAJc2lnbG9uZ2ptcChpbml0aWFsX2ptcGJ1ZiwgSU5JVF9KTVBfUkVCT09UKTsKIH0KIAotdm9pZCBzd2l0Y2hfbW1fc2thcyhpbnQgbW1fZmQpCit2b2lkIHN3aXRjaF9tbV9za2FzKHN0cnVjdCBtbV9pZCAqbW1faWRwKQogewogCWludCBlcnI7CiAKICN3YXJuaW5nIG5lZWQgY3B1IHBpZCBpbiBzd2l0Y2hfbW1fc2thcwotCWVyciA9IHB0cmFjZShQVFJBQ0VfU1dJVENIX01NLCB1c2Vyc3BhY2VfcGlkWzBdLCAwLCBtbV9mZCk7Ci0JaWYoZXJyKQotCQlwYW5pYygic3dpdGNoX21tX3NrYXMgLSBQVFJBQ0VfU1dJVENIX01NIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKLQkJICAgICAgZXJybm8pOwotfQotCi12b2lkIGtpbGxfb2ZmX3Byb2Nlc3Nlc19za2FzKHZvaWQpCi17Ci0jd2FybmluZyBuZWVkIHRvIGxvb3Agb3ZlciB1c2Vyc3BhY2VfcGlkcyBpbiBraWxsX29mZl9wcm9jZXNzZXNfc2thcwotCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKHVzZXJzcGFjZV9waWRbMF0sIDEpOworCWlmKHByb2NfbW0peworCQllcnIgPSBwdHJhY2UoUFRSQUNFX1NXSVRDSF9NTSwgdXNlcnNwYWNlX3BpZFswXSwgMCwKKwkJCSAgICAgbW1faWRwLT51Lm1tX2ZkKTsKKwkJaWYoZXJyKQorCQkJcGFuaWMoInN3aXRjaF9tbV9za2FzIC0gUFRSQUNFX1NXSVRDSF9NTSBmYWlsZWQsICIKKwkJCSAgICAgICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJfQorCWVsc2UgdXNlcnNwYWNlX3BpZFswXSA9IG1tX2lkcC0+dS5waWQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYwppbmRleCAwYTdiOGFhLi5jYmFiYWIxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzc19rZXJuLmMKQEAgLTE3NSw5ICsxNzUsMTIgQEAKIAlyZXR1cm4oMCk7CiB9CiAKK2V4dGVybiBpbnQgdXNlcnNwYWNlX3BpZFtdOworCiBpbnQgc3RhcnRfdW1sX3NrYXModm9pZCkKIHsKLQlzdGFydF91c2Vyc3BhY2UoMCk7CisJaWYocHJvY19tbSkKKwkJdXNlcnNwYWNlX3BpZFswXSA9IHN0YXJ0X3VzZXJzcGFjZSgwKTsKIAogCWluaXRfbmV3X3RocmVhZF9zaWduYWxzKDEpOwogCkBAIC0xOTksMyArMjAyLDMxIEBACiAjd2FybmluZyBOZWVkIHRvIGxvb2sgdXAgdXNlcnNwYWNlX3BpZCBieSBjcHUKIAlyZXR1cm4odXNlcnNwYWNlX3BpZFswXSk7CiB9CisKK3ZvaWQga2lsbF9vZmZfcHJvY2Vzc2VzX3NrYXModm9pZCkKK3sKKwlpZihwcm9jX21tKQorI3dhcm5pbmcgbmVlZCB0byBsb29wIG92ZXIgdXNlcnNwYWNlX3BpZHMgaW4ga2lsbF9vZmZfcHJvY2Vzc2VzX3NrYXMKKwkJb3Nfa2lsbF9wdHJhY2VkX3Byb2Nlc3ModXNlcnNwYWNlX3BpZFswXSwgMSk7CisJZWxzZSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwkJaW50IHBpZCwgbWU7CisKKwkJbWUgPSBvc19nZXRwaWQoKTsKKwkJZm9yX2VhY2hfcHJvY2VzcyhwKXsKKwkJCWlmKHAtPm1tID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCXBpZCA9IHAtPm1tLT5jb250ZXh0LnNrYXMuaWQudS5waWQ7CisJCQlvc19raWxsX3B0cmFjZWRfcHJvY2VzcyhwaWQsIDEpOworCQl9CisJfQorfQorCit1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3R1Yl9zdGFjayh2b2lkKQoreworCWlmKGN1cnJlbnQtPm1tID09IE5VTEwpCisJCXJldHVybigwKTsKKworCXJldHVybihjdXJyZW50LT5tbS0+Y29udGV4dC5za2FzLmlkLnN0YWNrKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvdGxiLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3RsYi5jCmluZGV4IGI4YzVlNzE3Li42MjMwOTk5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL3RsYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvdGxiLmMKQEAgLTYsNiArNiw3IEBACiAKICNpbmNsdWRlICJsaW51eC9zdGRkZWYuaCIKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgorI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgogI2luY2x1ZGUgImxpbnV4L21tLmgiCiAjaW5jbHVkZSAiYXNtL3BhZ2UuaCIKICNpbmNsdWRlICJhc20vcGd0YWJsZS5oIgpAQCAtMTcsNyArMTgsNyBAQAogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidGxiLmgiCiAKLXN0YXRpYyB2b2lkIGRvX29wcyhpbnQgZmQsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBsYXN0KQorc3RhdGljIHZvaWQgZG9fb3BzKHVuaW9uIG1tX2NvbnRleHQgKm1tdSwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGxhc3QpCiB7CiAJc3RydWN0IGhvc3Rfdm1fb3AgKm9wOwogCWludCBpOwpAQCAtMjYsMTggKzI3LDE4IEBACiAJCW9wID0gJm9wc1tpXTsKIAkJc3dpdGNoKG9wLT50eXBlKXsKIAkJY2FzZSBNTUFQOgotCQkJbWFwKGZkLCBvcC0+dS5tbWFwLmFkZHIsIG9wLT51Lm1tYXAubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCZtbXUtPnNrYXMuaWQsIG9wLT51Lm1tYXAuYWRkciwgb3AtPnUubW1hcC5sZW4sCiAJCQkgICAgb3AtPnUubW1hcC5yLCBvcC0+dS5tbWFwLncsIG9wLT51Lm1tYXAueCwKIAkJCSAgICBvcC0+dS5tbWFwLmZkLCBvcC0+dS5tbWFwLm9mZnNldCk7CiAJCQlicmVhazsKIAkJY2FzZSBNVU5NQVA6Ci0JCQl1bm1hcChmZCwgKHZvaWQgKikgb3AtPnUubXVubWFwLmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bm1hcCgmbW11LT5za2FzLmlkLCAodm9pZCAqKSBvcC0+dS5tdW5tYXAuYWRkciwKIAkJCSAgICAgIG9wLT51Lm11bm1hcC5sZW4pOwogCQkJYnJlYWs7CiAJCWNhc2UgTVBST1RFQ1Q6Ci0JCQlwcm90ZWN0KGZkLCBvcC0+dS5tcHJvdGVjdC5hZGRyLCBvcC0+dS5tcHJvdGVjdC5sZW4sCi0JCQkJb3AtPnUubXByb3RlY3Quciwgb3AtPnUubXByb3RlY3QudywKLQkJCQlvcC0+dS5tcHJvdGVjdC54KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3QoJm1tdS0+c2thcy5pZCwgb3AtPnUubXByb3RlY3QuYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPnUubXByb3RlY3QubGVuLCBvcC0+dS5tcHJvdGVjdC5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+dS5tcHJvdGVjdC53LCBvcC0+dS5tcHJvdGVjdC54KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKCJVbmtub3duIG9wIHR5cGUgJWQgaW4gZG9fb3BzXG4iLCBvcC0+dHlwZSk7CkBAIC00NiwxMiArNDcsMTUgQEAKIAl9CiB9CiAKK2V4dGVybiBpbnQgcHJvY19tbTsKKwogc3RhdGljIHZvaWQgZml4X3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsIGludCBmb3JjZSkKIHsKLSAgICAgICAgaW50IGZkID0gbW0tPmNvbnRleHQuc2thcy5tbV9mZDsKKyAgICAgICAgaWYoIXByb2NfbW0gJiYgKGVuZF9hZGRyID4gQ09ORklHX1NUVUJfU1RBUlQpKQorICAgICAgICAgICAgICAgIGVuZF9hZGRyID0gQ09ORklHX1NUVUJfU1RBUlQ7CiAKLSAgICAgICAgZml4X3JhbmdlX2NvbW1vbihtbSwgc3RhcnRfYWRkciwgZW5kX2FkZHIsIGZvcmNlLCBmZCwgZG9fb3BzKTsKKyAgICAgICAgZml4X3JhbmdlX2NvbW1vbihtbSwgc3RhcnRfYWRkciwgZW5kX2FkZHIsIGZvcmNlLCBkb19vcHMpOwogfQogCiB2b2lkIF9fZmx1c2hfdGxiX29uZV9za2FzKHVuc2lnbmVkIGxvbmcgYWRkcikKQEAgLTY5LDE3ICs3MywyMCBAQAogCiB2b2lkIGZsdXNoX3RsYl9tbV9za2FzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCXVuc2lnbmVkIGxvbmcgZW5kOworCiAJLyogRG9uJ3QgYm90aGVyIGZsdXNoaW5nIGlmIHRoaXMgYWRkcmVzcyBzcGFjZSBpcyBhYm91dCB0byBiZQogICAgICAgICAgKiBkZXN0cm95ZWQuCiAgICAgICAgICAqLwogICAgICAgICBpZihhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA9PSAwKQogICAgICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBmaXhfcmFuZ2UobW0sIDAsIGhvc3RfdGFza19zaXplLCAwKTsKLSAgICAgICAgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24oc3RhcnRfdm0sIGVuZF92bSk7CisJZW5kID0gcHJvY19tbSA/IHRhc2tfc2l6ZSA6IENPTkZJR19TVFVCX1NUQVJUOworICAgICAgICBmaXhfcmFuZ2UobW0sIDAsIGVuZCwgMCk7CiB9CiAKIHZvaWQgZm9yY2VfZmx1c2hfYWxsX3NrYXModm9pZCkKIHsKLSAgICAgICAgZml4X3JhbmdlKGN1cnJlbnQtPm1tLCAwLCBob3N0X3Rhc2tfc2l6ZSwgMSk7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBwcm9jX21tID8gdGFza19zaXplIDogQ09ORklHX1NUVUJfU1RBUlQ7CisgICAgICAgIGZpeF9yYW5nZShjdXJyZW50LT5tbSwgMCwgZW5kLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RpbWUuYyBiL2FyY2gvdW0va2VybmVsL3RpbWUuYwppbmRleCBmODI5YjMwLi5jNDBiNjExIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdGltZS5jCkBAIC00OCw2ICs0OCwxMyBAQAogCXNldF9pbnRlcnZhbChJVElNRVJfVklSVFVBTCk7CiB9CiAKK3ZvaWQgcHJlcGFyZV90aW1lcih2b2lkICogcHRyKQoreworCWludCB1c2VjID0gMTAwMDAwMC9oeigpOworCSooc3RydWN0IGl0aW1lcnZhbCAqKXB0ciA9ICgoc3RydWN0IGl0aW1lcnZhbCkgeyB7IDAsIHVzZWMgfSwKKwkJCQkJCQkgeyAwLCB1c2VjIH19KTsKK30KKwogdm9pZCBkaXNhYmxlX3RpbWVyKHZvaWQpCiB7CiAJc3RydWN0IGl0aW1lcnZhbCBkaXNhYmxlID0gKChzdHJ1Y3QgaXRpbWVydmFsKSB7IHsgMCwgMCB9LCB7IDAsIDAgfX0pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdGxiLmMgYi9hcmNoL3VtL2tlcm5lbC90bGIuYwppbmRleCBlZGE0NzdlLi44M2VjOGQ0NyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdGxiLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdGxiLmMKQEAgLTE4LDEzICsxOCwxNSBAQAogI2RlZmluZSBBRERfUk9VTkQobiwgaW5jKSAoKChuKSArIChpbmMpKSAmIH4oKGluYykgLSAxKSkKIAogdm9pZCBmaXhfcmFuZ2VfY29tbW9uKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBlbmRfYWRkciwgaW50IGZvcmNlLCBpbnQgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBlbmRfYWRkciwgaW50IGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKHVuaW9uIG1tX2NvbnRleHQgKiwgc3RydWN0IGhvc3Rfdm1fb3AgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKQogewogICAgICAgICBwZ2RfdCAqbnBnZDsKICAgICAgICAgcHVkX3QgKm5wdWQ7CiAgICAgICAgIHBtZF90ICpucG1kOwogICAgICAgICBwdGVfdCAqbnB0ZTsKKyAgICAgICAgdW5pb24gbW1fY29udGV4dCAqbW11ID0gJm1tLT5jb250ZXh0OwogICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIGVuZDsKICAgICAgICAgaW50IHIsIHcsIHg7CiAgICAgICAgIHN0cnVjdCBob3N0X3ZtX29wIG9wc1sxNl07CkBAIC00MCw3ICs0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZF9hZGRyOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9yY2UgfHwgcGdkX25ld3BhZ2UoKm5wZ2QpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXggPSBhZGRfbXVubWFwKGFkZHIsIGVuZCAtIGFkZHIsIG9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnZF9ta3VwdG9kYXRlKCpucGdkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU1LDcgKzU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JjZSB8fCBwdWRfbmV3cGFnZSgqbnB1ZCkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgbW11LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVkX21rdXB0b2RhdGUoKm5wdWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzAsNyArNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmRfYWRkcjsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcmNlIHx8IHBtZF9uZXdwYWdlKCpucG1kKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4ID0gYWRkX211bm1hcChhZGRyLCBlbmQgLSBhZGRyLCBvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBtbXUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19vcHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWRfbWt1cHRvZGF0ZSgqbnBtZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC05MywyMSArOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXggPSBhZGRfbW1hcChhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZV92YWwoKm5wdGUpICYgUEFHRV9NQVNLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRSwgciwgdywgeCwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBtbXUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugb3BfaW5kZXggPSBhZGRfbXVubWFwKGFkZHIsIFBBR0VfU0laRSwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgbW11LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSBpZihwdGVfbmV3cHJvdCgqbnB0ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tcHJvdGVjdChhZGRyLCBQQUdFX1NJWkUsIHIsIHcsIHgsIG9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CiAKICAgICAgICAgICAgICAgICAqbnB0ZSA9IHB0ZV9ta3VwdG9kYXRlKCpucHRlKTsKICAgICAgICAgICAgICAgICBhZGRyICs9IFBBR0VfU0laRTsKICAgICAgICAgfQotICAgICAgICAoKmRvX29wcykoZGF0YSwgb3BzLCBvcF9pbmRleCk7CisgICAgICAgICgqZG9fb3BzKShtbXUsIG9wcywgb3BfaW5kZXgpOwogfQogCiBpbnQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCkBAIC0xOTUsNTEgKzE5Nyw2IEBACiAgICAgICAgIHJldHVybih1cGRhdGVkKTsKIH0KIAotdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotICAgICAgICBhZGRyZXNzICY9IFBBR0VfTUFTSzsKLSAgICAgICAgZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIFBBR0VfU0laRSk7Ci19Ci0KLXZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQotewotICAgICAgICBmbHVzaF90bGJfbW0oY3VycmVudC0+bW0pOwotfQotICAKLXZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLSAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhmbHVzaF90bGJfa2VybmVsX3JhbmdlX3R0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uLCBzdGFydCwgZW5kKTsKLX0KLQotdm9pZCBmbHVzaF90bGJfa2VybmVsX3ZtKHZvaWQpCi17Ci0gICAgICAgIENIT09TRV9NT0RFKGZsdXNoX3RsYl9rZXJuZWxfdm1fdHQoKSwKLSAgICAgICAgICAgICAgICAgICAgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24oc3RhcnRfdm0sIGVuZF92bSkpOwotfQotCi12b2lkIF9fZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0gICAgICAgIENIT09TRV9NT0RFX1BST0MoX19mbHVzaF90bGJfb25lX3R0LCBfX2ZsdXNoX3RsYl9vbmVfc2thcywgYWRkcik7Ci19Ci0KLXZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCAKLSAgICAgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0gICAgICAgIENIT09TRV9NT0RFX1BST0MoZmx1c2hfdGxiX3JhbmdlX3R0LCBmbHVzaF90bGJfcmFuZ2Vfc2thcywgdm1hLCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpOwotfQotCi12b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLSAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhmbHVzaF90bGJfbW1fdHQsIGZsdXNoX3RsYl9tbV9za2FzLCBtbSk7Ci19Ci0KLXZvaWQgZm9yY2VfZmx1c2hfYWxsKHZvaWQpCi17Ci0gICAgICAgIENIT09TRV9NT0RFKGZvcmNlX2ZsdXNoX2FsbF90dCgpLCBmb3JjZV9mbHVzaF9hbGxfc2thcygpKTsKLX0KLQogcGdkX3QgKnBnZF9vZmZzZXRfcHJvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogICAgICAgICByZXR1cm4ocGdkX29mZnNldChtbSwgYWRkcmVzcykpOwpAQCAtMjcwLDkgKzIyNyw5IEBACiB9CiAKIGludCBhZGRfbW1hcCh1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBsZW4sCi0gICAgIGludCByLCBpbnQgdywgaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwKLSAgICAgaW50IGxhc3RfZmlsbGVkLCBpbnQgZGF0YSwKLSAgICAgdm9pZCAoKmRvX29wcykoaW50LCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKQorICAgICAgICAgICAgIGludCByLCBpbnQgdywgaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwKKyAgICAgICAgICAgICBpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwKKyAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCiB7CiAgICAgICAgIF9fdTY0IG9mZnNldDsKIAlzdHJ1Y3QgaG9zdF92bV9vcCAqbGFzdDsKQEAgLTI5Miw3ICsyNDksNyBAQAogCX0KIAogCWlmKGluZGV4ID09IGxhc3RfZmlsbGVkKXsKLQkJKCpkb19vcHMpKGRhdGEsIG9wcywgbGFzdF9maWxsZWQpOworCQkoKmRvX29wcykobW11LCBvcHMsIGxhc3RfZmlsbGVkKTsKIAkJaW5kZXggPSAtMTsKIAl9CiAKQEAgLTMxMCw4ICsyNjcsOCBAQAogfQogCiBpbnQgYWRkX211bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLAotCSAgICAgICBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwgaW50IGRhdGEsCi0JICAgICAgIHZvaWQgKCpkb19vcHMpKGludCwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSkKKwkgICAgICAgaW50IGluZGV4LCBpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwKKwkgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKQogewogCXN0cnVjdCBob3N0X3ZtX29wICpsYXN0OwogCkBAIC0zMjUsNyArMjgyLDcgQEAKIAl9CiAKIAlpZihpbmRleCA9PSBsYXN0X2ZpbGxlZCl7Ci0JCSgqZG9fb3BzKShkYXRhLCBvcHMsIGxhc3RfZmlsbGVkKTsKKwkJKCpkb19vcHMpKG1tdSwgb3BzLCBsYXN0X2ZpbGxlZCk7CiAJCWluZGV4ID0gLTE7CiAJfQogCkBAIC0zMzcsOCArMjk0LDkgQEAKIH0KIAogaW50IGFkZF9tcHJvdGVjdCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIGludCB4LAotCQkgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LCBpbnQgbGFzdF9maWxsZWQsIGludCBkYXRhLAotCQkgdm9pZCAoKmRvX29wcykoaW50LCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKQorICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwKKyAgICAgICAgICAgICAgICAgdW5pb24gbW1fY29udGV4dCAqbW11LAorICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCiB7CiAJc3RydWN0IGhvc3Rfdm1fb3AgKmxhc3Q7CiAKQEAgLTM1NCw3ICszMTIsNyBAQAogCX0KIAogCWlmKGluZGV4ID09IGxhc3RfZmlsbGVkKXsKLQkJKCpkb19vcHMpKGRhdGEsIG9wcywgbGFzdF9maWxsZWQpOworCQkoKmRvX29wcykobW11LCBvcHMsIGxhc3RfZmlsbGVkKTsKIAkJaW5kZXggPSAtMTsKIAl9CiAKQEAgLTM2NywzICszMjUsNDkgQEAKIAkJCQkJCSAgICAgIC54CT0geCB9IH0gfSk7CiAJcmV0dXJuKGluZGV4KTsKIH0KKwordm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworICAgICAgICBhZGRyZXNzICY9IFBBR0VfTUFTSzsKKyAgICAgICAgZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIFBBR0VfU0laRSk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQoreworICAgICAgICBmbHVzaF90bGJfbW0oY3VycmVudC0+bW0pOworfQorCit2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisgICAgICAgIENIT09TRV9NT0RFX1BST0MoZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV90dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaF90bGJfa2VybmVsX3JhbmdlX2NvbW1vbiwgc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX2tlcm5lbF92bSh2b2lkKQoreworICAgICAgICBDSE9PU0VfTU9ERShmbHVzaF90bGJfa2VybmVsX3ZtX3R0KCksCisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHN0YXJ0X3ZtLCBlbmRfdm0pKTsKK30KKwordm9pZCBfX2ZsdXNoX3RsYl9vbmUodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgICAgICBDSE9PU0VfTU9ERV9QUk9DKF9fZmx1c2hfdGxiX29uZV90dCwgX19mbHVzaF90bGJfb25lX3NrYXMsIGFkZHIpOworfQorCit2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKyAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhmbHVzaF90bGJfcmFuZ2VfdHQsIGZsdXNoX3RsYl9yYW5nZV9za2FzLCB2bWEsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworICAgICAgICBDSE9PU0VfTU9ERV9QUk9DKGZsdXNoX3RsYl9tbV90dCwgZmx1c2hfdGxiX21tX3NrYXMsIG1tKTsKK30KKwordm9pZCBmb3JjZV9mbHVzaF9hbGwodm9pZCkKK3sKKyAgICAgICAgQ0hPT1NFX01PREUoZm9yY2VfZmx1c2hfYWxsX3R0KCksIGZvcmNlX2ZsdXNoX2FsbF9za2FzKCkpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC90bGIuYyBiL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCmluZGV4IDIwMzIxNmEuLjJlZWZiNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ0bGIuaCIKIAotc3RhdGljIHZvaWQgZG9fb3BzKGludCB1bnVzZWQsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBsYXN0KQorc3RhdGljIHZvaWQgZG9fb3BzKHVuaW9uIG1tX2NvbnRleHQgKm1tdSwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGxhc3QpCiB7CiAJc3RydWN0IGhvc3Rfdm1fb3AgKm9wOwogCWludCBpOwpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgICAgIHBhbmljKCJmaXhfcmFuZ2UgZml4aW5nIHdyb25nIGFkZHJlc3Mgc3BhY2UsIGN1cnJlbnQgPSAweCVwIiwKICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKIAotICAgICAgICBmaXhfcmFuZ2VfY29tbW9uKG1tLCBzdGFydF9hZGRyLCBlbmRfYWRkciwgZm9yY2UsIDAsIGRvX29wcyk7CisgICAgICAgIGZpeF9yYW5nZV9jb21tb24obW0sIHN0YXJ0X2FkZHIsIGVuZF9hZGRyLCBmb3JjZSwgZG9fb3BzKTsKIH0KIAogYXRvbWljX3Qgdm1jaGFuZ2Vfc2VxID0gQVRPTUlDX0lOSVQoMSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMgYi9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKaW5kZXggNjFkZmQ0Zi4uMTYzNDc2YSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCisrKyBiL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUwpAQCAtMzAsNiArMzAsNyBAQAogCV9laW5pdHRleHQgPSAuOwogICB9CiAgIC4gPSBBTElHTig0MDk2KTsKKwogICAudGV4dCAgICAgIDoKICAgewogICAgICooLnRleHQpCkBAIC0zOSw2ICs0MCwxMiBAQAogICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwogICAgICooLmdudS53YXJuaW5nKQogICAgICooLmdudS5saW5rb25jZS50KikKKworICAgIC4gPSBBTElHTig0MDk2KTsKKyAgICBfX3N5c2NhbGxfc3R1Yl9zdGFydCA9IC47CisgICAgKiguX19zeXNjYWxsX3N0dWIqKQorICAgIF9fc3lzY2FsbF9zdHViX2VuZCA9IC47CisgICAgLiA9IEFMSUdOKDQwOTYpOwogICB9CiAKICAgI2luY2x1ZGUgImFzbS9jb21tb24ubGRzLlMiCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3JlZ2lzdGVycy5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYwppbmRleCA5YTBhZDA5Li4zMTI1ZDMyIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3JlZ2lzdGVycy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvcmVnaXN0ZXJzLmMKQEAgLTEyMSw2ICsxMjEsMTEgQEAKIAkJICAgICAgZXJyKTsKIH0KIAordm9pZCBnZXRfc2FmZV9yZWdpc3RlcnModW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwltZW1jcHkocmVncywgZXhlY19yZWdzLCBIT1NUX0ZSQU1FX1NJWkUgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworfQorCiAvKgogICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCiAgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9yZWdpc3RlcnMuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9yZWdpc3RlcnMuYwppbmRleCA2Mjg2Yzk3Li40NDQzOGQxIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvcmVnaXN0ZXJzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jCkBAIC02OSw2ICs2OSwxMSBAQAogCQkgICAgICBlcnIpOwogfQogCit2b2lkIGdldF9zYWZlX3JlZ2lzdGVycyh1bnNpZ25lZCBsb25nICpyZWdzKQoreworCW1lbWNweShyZWdzLCBleGVjX3JlZ3MsIEhPU1RfRlJBTUVfU0laRSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Cit9CisKIC8qCiAgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KICAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzIGIvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCmluZGV4IDc0NTlkMDkuLjE3ZjMwNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcworKysgYi9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKQEAgLTE2LDYgKzE2LDExIEBACiBlbmRlZgogCiAKKyMgVGhlIHN0dWJzIGFuZCB1bm1hcC5vIGNhbid0IHRyeSB0byBjYWxsIG1jb3VudCBvciB1cGRhdGUgYmFzaWMgYmxvY2sgZGF0YQorZGVmaW5lIHVucHJvZmlsZQorCSQocGF0c3Vic3QgLXBnLCwkKHBhdHN1YnN0IC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSwsJCgxKSkpCitlbmRlZgorCiBxdWlldF9jbWRfbWFrZV9saW5rID0gU1lNTElOSyAkQAogY21kX21ha2VfbGluayAgICAgICA9IGxuIC1zZiAkKHNyY3RyZWUpL2FyY2gvJChTVUJBUkNIKS8kKCQobm90ZGlyICRAKS1kaXIpLyQobm90ZGlyICRAKSAkQAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlIGIvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQppbmRleCAwOTViY2RiLi43N2MzYzRkIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBvYmoteSA9IGJpdG9wcy5vIGJ1Z3MubyBjaGVja3N1bS5vIGRlbGF5Lm8gZmF1bHQubyBrc3ltcy5vIGxkdC5vIHB0cmFjZS5vIFwKLQlwdHJhY2VfdXNlci5vIHNlbWFwaG9yZS5vIHNpZ25hbC5vIHNpZ2NvbnRleHQubyBzeXNjYWxscy5vIHN5c3JxLm8gXAotCXN5c19jYWxsX3RhYmxlLm8KKwlwdHJhY2VfdXNlci5vIHNlbWFwaG9yZS5vIHNpZ25hbC5vIHNpZ2NvbnRleHQubyBzdHViLm8gc3R1Yl9zZWd2Lm8gXAorCXN5c2NhbGxzLm8gc3lzcnEubyBzeXNfY2FsbF90YWJsZS5vCiAKIG9iai0kKENPTkZJR19ISUdITUVNKSArPSBoaWdobWVtLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubwpAQCAtMTYsNiArMTYsMTQgQEAKIGhpZ2htZW0uYy1kaXIgPSBtbQogbW9kdWxlLmMtZGlyID0ga2VybmVsCiAKK1NUVUJfQ0ZMQUdTID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoY2FsbCB1bnByb2ZpbGUsJChVU0VSX0NGTEFHUykpCisKKyMgX2NmbGFncyB3b3JrcyB3aXRoIGtlcm5lbCBmaWxlcywgbm90IHdpdGggdXNlcnNwYWNlIG9uZXMsIGJ1dCBjX2ZsYWdzIGRvZXMsCisjIHdoeSBhc2sgd2h5PworJChvYmopL3N0dWJfc2Vndi5vIDogY19mbGFncyA9ICQoU1RVQl9DRkxBR1MpCisKKyQob2JqKS9zdHViLm8gOiBhX2ZsYWdzID0gJChTVFVCX0NGTEFHUykKKwogc3ViZGlyLSA6PSB1dGlsCiAKIGluY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnVubWFwCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3N0dWIuUyBiL2FyY2gvdW0vc3lzLWkzODYvc3R1Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMmM3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy1pMzg2L3N0dWIuUwpAQCAtMCwwICsxLDggQEAKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisKKwkuZ2xvYmwgc3lzY2FsbF9zdHViCisuc2VjdGlvbiAuX19zeXNjYWxsX3N0dWIsICJ4Igorc3lzY2FsbF9zdHViOgorCWludCAJJDB4ODAKKwltb3YJJWVheCwgVU1MX0NPTkZJR19TVFVCX0RBVEEKKwlpbnQzCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3N0dWJfc2Vndi5jIGIvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjUxNDQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKKyNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgorI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCitzdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKQoreworCXN0cnVjdCBzaWdjb250ZXh0ICpzYyA9IChzdHJ1Y3Qgc2lnY29udGV4dCAqKSAoJnNpZyArIDEpOworCisJR0VUX0ZBVUxUSU5GT19GUk9NX1NDKCooKHN0cnVjdCBmYXVsdGluZm8gKikgVU1MX0NPTkZJR19TVFVCX0RBVEEpLAorCQkJICAgICAgc2MpOworCisJX19hc21fXygibW92bCAlMCwgJSVlYXggOyBpbnQgJDB4ODAiOiA6ICJnIiAoX19OUl9nZXRwaWQpKTsKKwlfX2FzbV9fKCJtb3ZsICUlZWF4LCAlJWVieCA7IG1vdmwgJTAsICUlZWF4IDsgbW92bCAlMSwgJSVlY3ggOyIKKwkJImludCAkMHg4MCI6IDogImciIChfX05SX2tpbGwpLCAiZyIgKFNJR1VTUjEpKTsKKwkvKiBQb3AgdGhlIGZyYW1lIHBvaW50ZXIgYW5kIHJldHVybiBhZGRyZXNzIHNpbmNlIHdlIG5lZWQgdG8gbGVhdmUKKwkgKiB0aGUgc3RhY2sgaW4gaXRzIG9yaWdpbmFsIGZvcm0gd2hlbiB3ZSBkbyB0aGUgc2lncmV0dXJuIGhlcmUsIGJ5CisJICogaGFuZC4KKwkgKi8KKwlfX2FzbV9fKCJwb3BsICUlZWF4IDsgcG9wbCAlJWVheCA7IHBvcGwgJSVlYXggOyBtb3ZsICUwLCAlJWVheCA7ICIKKwkJImludCAkMHg4MCIgOiA6ICJnIiAoX19OUl9zaWdyZXR1cm4pKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZQppbmRleCAyYmM2ZjY4Li43NDg4MjA2IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlCkBAIC02LDggKzYsOCBAQAogCiAjWFhYOiB3aHkgaW50byBsaWIteT8KIGxpYi15ID0gYml0b3BzLm8gYnVncy5vIGNzdW0tcGFydGlhbC5vIGRlbGF5Lm8gZmF1bHQubyBtZW0ubyBtZW1jcHkubyBcCi0JcHRyYWNlLm8gcHRyYWNlX3VzZXIubyBzZW1hcGhvcmUubyBzaWdjb250ZXh0Lm8gc2lnbmFsLm8gXAotCXN5c2NhbGxzLm8gc3lzcnEubyB0aHVuay5vIHN5c2NhbGxfdGFibGUubworCXB0cmFjZS5vIHB0cmFjZV91c2VyLm8gc2VtYXBob3JlLm8gc2lnY29udGV4dC5vIHNpZ25hbC5vIHN0dWIubyBcCisJc3R1Yl9zZWd2Lm8gc3lzY2FsbHMubyBzeXNjYWxsX3RhYmxlLm8gc3lzcnEubyB0aHVuay5vCiAKIG9iai15IDo9IGtzeW1zLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubyB1bV9tb2R1bGUubwpAQCAtMjgsNiArMjgsMTQgQEAKIHRodW5rLlMtZGlyID0gbGliCiBtb2R1bGUuYy1kaXIgPSBrZXJuZWwKIAorU1RVQl9DRkxBR1MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChjYWxsIHVucHJvZmlsZSwkKFVTRVJfQ0ZMQUdTKSkKKworIyBfY2ZsYWdzIHdvcmtzIHdpdGgga2VybmVsIGZpbGVzLCBub3Qgd2l0aCB1c2Vyc3BhY2Ugb25lcywgYnV0IGNfZmxhZ3MgZG9lcywKKyMgd2h5IGFzayB3aHk/CiskKG9iaikvc3R1Yl9zZWd2Lm8gOiBjX2ZsYWdzID0gJChTVFVCX0NGTEFHUykKKworJChvYmopL3N0dWIubyA6IGFfZmxhZ3MgPSAkKFNUVUJfQ0ZMQUdTKQorCiBzdWJkaXItIDo9IHV0aWwKIAogaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUudW5tYXAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViLlMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzE0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisKKwkuZ2xvYmwgc3lzY2FsbF9zdHViCisuc2VjdGlvbiAuX19zeXNjYWxsX3N0dWIsICJ4Igorc3lzY2FsbF9zdHViOgorCXN5c2NhbGwKKwkvKiBXZSBkb24ndCBoYXZlIDY0LWJpdCBjb25zdGFudHMsIHNvIHRoaXMgY29uc3RydWN0cyB0aGUgYWRkcmVzcworCSAqIHdlIG5lZWQuCisJICovCisJbW92cQkkKFVNTF9DT05GSUdfU1RVQl9EQVRBID4+IDMyKSwgJXJieAorCXNhbHEJJDMyLCAlcmJ4CisJbW92cQkkKFVNTF9DT05GSUdfU1RVQl9EQVRBICYgMHhmZmZmZmZmZiksICVyY3gKKwlvcgklcmN4LCAlcmJ4CisJbW92cQklcmF4LCAoJXJieCkKKwlpbnQzCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZDFmZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViX3NlZ3YuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKKyNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgorI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCitzdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKQoreworCXN0cnVjdCB1Y29udGV4dCAqdWM7CisKKwlfX2FzbV9fKCJtb3ZxICUlcmR4LCAlMCIgOiAiPWciICh1YykgOik7CisgICAgICAgIEdFVF9GQVVMVElORk9fRlJPTV9TQygqKChzdHJ1Y3QgZmF1bHRpbmZvICopIFVNTF9DT05GSUdfU1RVQl9EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1Yy0+dWNfbWNvbnRleHQpOworCisJX19hc21fXygibW92cSAlMCwgJSVyYXggOyBzeXNjYWxsIjogOiAiZyIgKF9fTlJfZ2V0cGlkKSk7CisJX19hc21fXygibW92cSAlJXJheCwgJSVyZGkgOyBtb3ZxICUwLCAlJXJheCA7IG1vdnEgJTEsICUlcnNpIDsiCisJCSJzeXNjYWxsIjogOiAiZyIgKF9fTlJfa2lsbCksICJnIiAoU0lHVVNSMSkpOworCS8qIFR3byBwb3BxcyB0byByZXN0b3JlIHRoZSBzdGFjayB0byB0aGUgc3RhdGUganVzdCBiZWZvcmUgZW50ZXJpbmcKKwkgKiB0aGUgaGFuZGxlciwgb25lIHBvcHMgdGhlIHJldHVybiBhZGRyZXNzLCB0aGUgb3RoZXIgcG9wcyB0aGUgZnJhbWUKKwkgKiBwb2ludGVyLgorCSAqLworCV9fYXNtX18oInBvcHEgJSVyYXggOyBwb3BxICUlcmF4IDsgbW92cSAlMCwgJSVyYXggOyBzeXNjYWxsIiA6IDogImciCisJCShfX05SX3J0X3NpZ3JldHVybikpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL0tjb25maWcgYi9hcmNoL3Y4NTAvS2NvbmZpZwppbmRleCAyN2ZlYmQ2Li44OWMwNTNiIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAvS2NvbmZpZworKysgYi9hcmNoL3Y4NTAvS2NvbmZpZwpAQCAtMjUwLDYgKzI1MCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogc291cmNlICJkcml2ZXJzL2Jhc2UvS2NvbmZpZyIKQEAgLTI4Myw3ICsyODUsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZyIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC92ODUwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGJiZDM0MjkuLmMzNjZhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3Y4NTAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTEsOCArMSw4IEBACiAvKgogICogYXJjaC92ODUwL3ZtbGludXgubGRzLlMgLS0ga2VybmVsIGxpbmtlciBzY3JpcHQgZm9yIHY4NTAgcGxhdGZvcm1zCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMiwwMywwNCAgTkVDIEVsZWN0cm9uaWNzIENvcnBvcmF0aW9uCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLDAzLDA0ICBNaWxlcyBCYWRlciA8bWlsZXNAZ251Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsMDMsMDQsMDUgIE5FQyBFbGVjdHJvbmljcyBDb3Jwb3JhdGlvbgorICogIENvcHlyaWdodCAoQykgMjAwMiwwMywwNCwwNSAgTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5vcmc+CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAogICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwpAQCAtNjEsNiArNjEsNyBAQAogCQkJKihfX2tjcmN0YWJfZ3BsKQkJCQkgICAgICBcCiAJCV9fX3N0b3BfX19rY3JjdGFiX2dwbCA9IC47CQkJCSAgICAgIFwKIAkJLyogQnVpbHQtaW4gbW9kdWxlIHBhcmFtZXRlcnMgKi8JCQkgICAgICBcCisJCS4gPSBBTElHTiAoNCkgOwkJCQkJCSAgICAgIFwKIAkJX19fc3RhcnRfX19wYXJhbSA9IC47CQkJCQkgICAgICBcCiAJCSooX19wYXJhbSkJCQkJCQkgICAgICBcCiAJCV9fX3N0b3BfX19wYXJhbSA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAvbGliL2NoZWNrc3VtLmMgYi9hcmNoL3Y4NTAvbGliL2NoZWNrc3VtLmMKaW5kZXggZDMwOGI3Mi4uZmE1ODcyNiAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvdjg1MC9saWIvY2hlY2tzdW0uYwpAQCAtMTM4LDcgKzEzOCw4IEBACiAgKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgSWYgd2UgY2F0Y2ggYW4gZXhjZXB0aW9uCiAgKiB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlciAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCit1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCisJCQkJCSAgdW5zaWduZWQgY2hhciAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZXJyX3B0cikKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L0tjb25maWcgYi9hcmNoL3g4Nl82NC9LY29uZmlnCmluZGV4IGQwOTQzN2IuLjRiODMyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L0tjb25maWcKKysrIGIvYXJjaC94ODZfNjQvS2NvbmZpZwpAQCAtNTE1LDYgKzUxNSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlIGRyaXZlcnMvS2NvbmZpZwogCiBzb3VyY2UgImRyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L01ha2VmaWxlIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKaW5kZXggOGE3Mzc5NC4uNDI4OTE1NiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKQEAgLTY1LDcgKzY1LDkgQEAKIGhlYWQteSA6PSBhcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5vIGFyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQubyBhcmNoL3g4Nl82NC9rZXJuZWwvaW5pdF90YXNrLm8KIAogbGlicy15IAkJCQkJKz0gYXJjaC94ODZfNjQvbGliLwotY29yZS15CQkJCQkrPSBhcmNoL3g4Nl82NC9rZXJuZWwvIGFyY2gveDg2XzY0L21tLworY29yZS15CQkJCQkrPSBhcmNoL3g4Nl82NC9rZXJuZWwvIFwKKwkJCQkJICAgYXJjaC94ODZfNjQvbW0vIFwKKwkJCQkJICAgYXJjaC94ODZfNjQvY3J5cHRvLwogY29yZS0kKENPTkZJR19JQTMyX0VNVUxBVElPTikJCSs9IGFyY2gveDg2XzY0L2lhMzIvCiBkcml2ZXJzLSQoQ09ORklHX1BDSSkJCQkrPSBhcmNoL3g4Nl82NC9wY2kvCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkJKz0gYXJjaC94ODZfNjQvb3Byb2ZpbGUvCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9jcnlwdG8vTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9jcnlwdG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ZDIwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2NyeXB0by9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKKyMgCisjIHg4Nl82NC9jcnlwdG8vTWFrZWZpbGUgCisjIAorIyBBcmNoLXNwZWNpZmljIENyeXB0b0FQSSBtb2R1bGVzLgorIyAKKworb2JqLSQoQ09ORklHX0NSWVBUT19BRVNfWDg2XzY0KSArPSBhZXMteDg2XzY0Lm8KKworYWVzLXg4Nl82NC15IDo9IGFlcy14ODZfNjQtYXNtLm8gYWVzLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2NyeXB0by9hZXMteDg2XzY0LWFzbS5TIGIvYXJjaC94ODZfNjQvY3J5cHRvL2Flcy14ODZfNjQtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzY2JiMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2NyeXB0by9hZXMteDg2XzY0LWFzbS5TCkBAIC0wLDAgKzEsMTg2IEBACisvKiBBRVMgKFJpam5kYWVsKSBpbXBsZW1lbnRhdGlvbiAoRklQUyBQVUIgMTk3KSBmb3IgeDg2XzY0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJlYXMgU3RlaW5tZXR6LCA8YXN0QGRvbWR2LmRlPgorICoKKyAqIExpY2Vuc2U6CisgKiBUaGlzIGNvZGUgY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBoZWFkZXIgZG93biB0byBhbmQKKyAqIGluY2x1ZGluZyB0aGlzIHNlbnRlbmNlIGlzIHJldGFpbmVkIGluIGZ1bGwuCisgKi8KKworLmV4dGVybiBhZXNfZnRfdGFiCisuZXh0ZXJuIGFlc19pdF90YWIKKy5leHRlcm4gYWVzX2ZsX3RhYgorLmV4dGVybiBhZXNfaWxfdGFiCisKKy50ZXh0CisKKyNkZWZpbmUgUjEJJXJheAorI2RlZmluZSBSMUUJJWVheAorI2RlZmluZSBSMVgJJWF4CisjZGVmaW5lIFIxSAklYWgKKyNkZWZpbmUgUjFMCSVhbAorI2RlZmluZSBSMgklcmJ4CisjZGVmaW5lIFIyRQklZWJ4CisjZGVmaW5lIFIyWAklYngKKyNkZWZpbmUgUjJICSViaAorI2RlZmluZSBSMkwJJWJsCisjZGVmaW5lIFIzCSVyY3gKKyNkZWZpbmUgUjNFCSVlY3gKKyNkZWZpbmUgUjNYCSVjeAorI2RlZmluZSBSM0gJJWNoCisjZGVmaW5lIFIzTAklY2wKKyNkZWZpbmUgUjQJJXJkeAorI2RlZmluZSBSNEUJJWVkeAorI2RlZmluZSBSNFgJJWR4CisjZGVmaW5lIFI0SAklZGgKKyNkZWZpbmUgUjRMCSVkbAorI2RlZmluZSBSNQklcnNpCisjZGVmaW5lIFI1RQklZXNpCisjZGVmaW5lIFI2CSVyZGkKKyNkZWZpbmUgUjZFCSVlZGkKKyNkZWZpbmUgUjcJJXJicAorI2RlZmluZSBSN0UJJWVicAorI2RlZmluZSBSOAklcjgKKyNkZWZpbmUgUjkJJXI5CisjZGVmaW5lIFIxMAklcjEwCisjZGVmaW5lIFIxMQklcjExCisKKyNkZWZpbmUgcHJvbG9ndWUoRlVOQyxCQVNFLEIxMjgsQjE5MixyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExKSBcCisJLmdsb2JhbAlGVU5DOwkJCVwKKwkudHlwZQlGVU5DLEBmdW5jdGlvbjsJCVwKKwkuYWxpZ24JODsJCQlcCitGVU5DOgltb3ZxCXIxLHIyOwkJCVwKKwltb3ZxCXIzLHI0OwkJCVwKKwlsZWFxCUJBU0UrNTIocjgpLHI5OwkJXAorCW1vdnEJcjEwLHIxMTsJCVwKKwltb3ZsCShyNykscjUgIyMgRTsJCVwKKwltb3ZsCTQocjcpLHIxICMjIEU7CQlcCisJbW92bAk4KHI3KSxyNiAjIyBFOwkJXAorCW1vdmwJMTIocjcpLHI3ICMjIEU7CQlcCisJbW92bAkocjgpLHIxMCAjIyBFOwkJXAorCXhvcmwJLTQ4KHI5KSxyNSAjIyBFOwlcCisJeG9ybAktNDQocjkpLHIxICMjIEU7CVwKKwl4b3JsCS00MChyOSkscjYgIyMgRTsJXAorCXhvcmwJLTM2KHI5KSxyNyAjIyBFOwlcCisJY21wbAkkMjQscjEwICMjIEU7CQlcCisJamIJQjEyODsJCQlcCisJbGVhcQkzMihyOSkscjk7CQlcCisJamUJQjE5MjsJCQlcCisJbGVhcQkzMihyOSkscjk7CisKKyNkZWZpbmUgZXBpbG9ndWUocjEscjIscjMscjQscjUscjYscjcscjgscjkpIFwKKwltb3ZxCXIxLHIyOwkJCVwKKwltb3ZxCXIzLHI0OwkJCVwKKwltb3ZsCXI1ICMjIEUsKHI5KTsJCVwKKwltb3ZsCXI2ICMjIEUsNChyOSk7CQlcCisJbW92bAlyNyAjIyBFLDgocjkpOwkJXAorCW1vdmwJcjggIyMgRSwxMihyOSk7CQlcCisJcmV0OworCisjZGVmaW5lIHJvdW5kKFRBQixPRkZTRVQscjEscjIscjMscjQscjUscjYscjcscjgscmEscmIscmMscmQpIFwKKwltb3Z6YmwJcjIgIyMgSCxyNSAjIyBFOwlcCisJbW92emJsCXIyICMjIEwscjYgIyMgRTsJXAorCW1vdmwJVEFCKzEwMjQoLHI1LDQpLHI1ICMjIEU7XAorCW1vdncJcjQgIyMgWCxyMiAjIyBYOwlcCisJbW92bAlUQUIoLHI2LDQpLHI2ICMjIEU7CVwKKwlyb2xsCSQxNixyMiAjIyBFOwkJXAorCXNocmwJJDE2LHI0ICMjIEU7CQlcCisJbW92emJsCXI0ICMjIEgscjcgIyMgRTsJXAorCW1vdnpibAlyNCAjIyBMLHI0ICMjIEU7CVwKKwl4b3JsCU9GRlNFVChyOCkscmEgIyMgRTsJXAorCXhvcmwJT0ZGU0VUKzQocjgpLHJiICMjIEU7CVwKKwl4b3JsCVRBQiszMDcyKCxyNyw0KSxyNSAjIyBFO1wKKwl4b3JsCVRBQisyMDQ4KCxyNCw0KSxyNiAjIyBFO1wKKwltb3Z6YmwJcjEgIyMgTCxyNyAjIyBFOwlcCisJbW92emJsCXIxICMjIEgscjQgIyMgRTsJXAorCW1vdmwJVEFCKzEwMjQoLHI0LDQpLHI0ICMjIEU7XAorCW1vdncJcjMgIyMgWCxyMSAjIyBYOwlcCisJcm9sbAkkMTYscjEgIyMgRTsJCVwKKwlzaHJsCSQxNixyMyAjIyBFOwkJXAorCXhvcmwJVEFCKCxyNyw0KSxyNSAjIyBFOwlcCisJbW92emJsCXIzICMjIEgscjcgIyMgRTsJXAorCW1vdnpibAlyMyAjIyBMLHIzICMjIEU7CVwKKwl4b3JsCVRBQiszMDcyKCxyNyw0KSxyNCAjIyBFO1wKKwl4b3JsCVRBQisyMDQ4KCxyMyw0KSxyNSAjIyBFO1wKKwltb3Z6YmwJcjEgIyMgSCxyNyAjIyBFOwlcCisJbW92emJsCXIxICMjIEwscjMgIyMgRTsJXAorCXNocmwJJDE2LHIxICMjIEU7CQlcCisJeG9ybAlUQUIrMzA3MigscjcsNCkscjYgIyMgRTtcCisJbW92bAlUQUIrMjA0OCgscjMsNCkscjMgIyMgRTtcCisJbW92emJsCXIxICMjIEgscjcgIyMgRTsJXAorCW1vdnpibAlyMSAjIyBMLHIxICMjIEU7CVwKKwl4b3JsCVRBQisxMDI0KCxyNyw0KSxyNiAjIyBFO1wKKwl4b3JsCVRBQigscjEsNCkscjMgIyMgRTsJXAorCW1vdnpibAlyMiAjIyBILHIxICMjIEU7CVwKKwltb3Z6YmwJcjIgIyMgTCxyNyAjIyBFOwlcCisJc2hybAkkMTYscjIgIyMgRTsJCVwKKwl4b3JsCVRBQiszMDcyKCxyMSw0KSxyMyAjIyBFO1wKKwl4b3JsCVRBQisyMDQ4KCxyNyw0KSxyNCAjIyBFO1wKKwltb3Z6YmwJcjIgIyMgSCxyMSAjIyBFOwlcCisJbW92emJsCXIyICMjIEwscjIgIyMgRTsJXAorCXhvcmwJT0ZGU0VUKzgocjgpLHJjICMjIEU7CVwKKwl4b3JsCU9GRlNFVCsxMihyOCkscmQgIyMgRTsJXAorCXhvcmwJVEFCKzEwMjQoLHIxLDQpLHIzICMjIEU7XAorCXhvcmwJVEFCKCxyMiw0KSxyNCAjIyBFOworCisjZGVmaW5lIG1vdmVfcmVncyhyMSxyMixyMyxyNCkgXAorCW1vdmwJcjMgIyMgRSxyMSAjIyBFOwlcCisJbW92bAlyNCAjIyBFLHIyICMjIEU7CisKKyNkZWZpbmUgZW50cnkoRlVOQyxCQVNFLEIxMjgsQjE5MikgXAorCXByb2xvZ3VlKEZVTkMsQkFTRSxCMTI4LEIxOTIsUjIsUjgsUjcsUjksUjEsUjMsUjQsUjYsUjEwLFI1LFIxMSkKKworI2RlZmluZSByZXR1cm4gZXBpbG9ndWUoUjgsUjIsUjksUjcsUjUsUjYsUjMsUjQsUjExKQorCisjZGVmaW5lIGVuY3J5cHRfcm91bmQoVEFCLE9GRlNFVCkgXAorCXJvdW5kKFRBQixPRkZTRVQsUjEsUjIsUjMsUjQsUjUsUjYsUjcsUjEwLFI1LFI2LFIzLFI0KSBcCisJbW92ZV9yZWdzKFIxLFIyLFI1LFI2KQorCisjZGVmaW5lIGVuY3J5cHRfZmluYWwoVEFCLE9GRlNFVCkgXAorCXJvdW5kKFRBQixPRkZTRVQsUjEsUjIsUjMsUjQsUjUsUjYsUjcsUjEwLFI1LFI2LFIzLFI0KQorCisjZGVmaW5lIGRlY3J5cHRfcm91bmQoVEFCLE9GRlNFVCkgXAorCXJvdW5kKFRBQixPRkZTRVQsUjIsUjEsUjQsUjMsUjYsUjUsUjcsUjEwLFI1LFI2LFIzLFI0KSBcCisJbW92ZV9yZWdzKFIxLFIyLFI1LFI2KQorCisjZGVmaW5lIGRlY3J5cHRfZmluYWwoVEFCLE9GRlNFVCkgXAorCXJvdW5kKFRBQixPRkZTRVQsUjIsUjEsUjQsUjMsUjYsUjUsUjcsUjEwLFI1LFI2LFIzLFI0KQorCisvKiB2b2lkIGFlc19lbmNyeXB0KHZvaWQgKmN0eCwgdTggKm91dCwgY29uc3QgdTggKmluKSAqLworCisJZW50cnkoYWVzX2VuY3J5cHQsMCxlbmMxMjgsZW5jMTkyKQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwtOTYpCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLC04MCkKK2VuYzE5MjoJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLC02NCkKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsLTQ4KQorZW5jMTI4OgllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsLTMyKQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwtMTYpCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLCAgMCkKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsIDE2KQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwgMzIpCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLCA0OCkKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsIDY0KQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwgODApCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLCA5NikKKwllbmNyeXB0X2ZpbmFsKGFlc19mbF90YWIsMTEyKQorCXJldHVybgorCisvKiB2b2lkIGFlc19kZWNyeXB0KHZvaWQgKmN0eCwgdTggKm91dCwgY29uc3QgdTggKmluKSAqLworCisJZW50cnkoYWVzX2RlY3J5cHQsMjQwLGRlYzEyOCxkZWMxOTIpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLC05NikKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsLTgwKQorZGVjMTkyOglkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsLTY0KQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwtNDgpCitkZWMxMjg6CWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwtMzIpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLC0xNikKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsICAwKQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwgMTYpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLCAzMikKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsIDQ4KQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwgNjQpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLCA4MCkKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsIDk2KQorCWRlY3J5cHRfZmluYWwoYWVzX2lsX3RhYiwxMTIpCisJcmV0dXJuCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLmMgYi9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1YzQwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2NyeXB0by9hZXMuYwpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIEFFUyBDaXBoZXIgQWxnb3JpdGhtLgorICoKKyAqIEJhc2VkIG9uIEJyaWFuIEdsYWRtYW4ncyBjb2RlLgorICoKKyAqIExpbnV4IGRldmVsb3BlcnM6CisgKiAgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgorICogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBodnJsYWIub3JnPgorICogIEt5bGUgTWNNYXJ0aW4gPGt5bGVAZGViaWFuLm9yZz4KKyAqICBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4gKGNvbnZlcnNpb24gdG8gMi41IEFQSSkuCisgKiAgQW5kcmVhcyBTdGVpbm1ldHogPGFzdEBkb21kdi5kZT4gKGFkYXB0ZWQgdG8geDg2XzY0IGFzc2VtYmxlcikKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChjKSAyMDAyLCBEciBCcmlhbiBHbGFkbWFuIDxicmdAZ2xhZG1hbi5tZS51az4sIFdvcmNlc3RlciwgVUsuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisgKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBTb21lIGNoYW5nZXMgZnJvbSB0aGUgR2xhZG1hbiB2ZXJzaW9uOgorICAgIHMvUklKTkRBRUwoZV9rZXkpL0VfS0VZL2cKKyAgICBzL1JJSk5EQUVMKGRfa2V5KS9EX0tFWS9nCisqLworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQUVTX01JTl9LRVlfU0laRQkxNgorI2RlZmluZSBBRVNfTUFYX0tFWV9TSVpFCTMyCisKKyNkZWZpbmUgQUVTX0JMT0NLX1NJWkUJCTE2CisKKy8qCisgKiAjZGVmaW5lIGJ5dGUoeCwgbnIpICgodW5zaWduZWQgY2hhcikoKHgpID4+IChucio4KSkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggYnl0ZShjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4geCA+PiAobiA8PCAzKTsKK30KKworI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCBfX2xlMzIgKikoeCkpCisKK3N0cnVjdCBhZXNfY3R4Cit7CisJdTMyIGtleV9sZW5ndGg7CisJdTMyIEVbNjBdOworCXUzMiBEWzYwXTsKK307CisKKyNkZWZpbmUgRV9LRVkgY3R4LT5FCisjZGVmaW5lIERfS0VZIGN0eC0+RAorCitzdGF0aWMgdTggcG93X3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggbG9nX3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggc2J4X3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggaXNiX3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTMyIHJjb190YWJbMTBdOwordTMyIGFlc19mdF90YWJbNF1bMjU2XTsKK3UzMiBhZXNfaXRfdGFiWzRdWzI1Nl07CisKK3UzMiBhZXNfZmxfdGFiWzRdWzI1Nl07Cit1MzIgYWVzX2lsX3RhYls0XVsyNTZdOworCitzdGF0aWMgaW5saW5lIHU4IGZfbXVsdCh1OCBhLCB1OCBiKQoreworCXU4IGFhID0gbG9nX3RhYlthXSwgY2MgPSBhYSArIGxvZ190YWJbYl07CisKKwlyZXR1cm4gcG93X3RhYltjYyArIChjYyA8IGFhID8gMSA6IDApXTsKK30KKworI2RlZmluZSBmZl9tdWx0KGEsIGIpIChhICYmIGIgPyBmX211bHQoYSwgYikgOiAwKQorCisjZGVmaW5lIGxzX2JveCh4KQkJCQlcCisJKGFlc19mbF90YWJbMF1bYnl0ZSh4LCAwKV0gXgkJXAorCSBhZXNfZmxfdGFiWzFdW2J5dGUoeCwgMSldIF4JCVwKKwkgYWVzX2ZsX3RhYlsyXVtieXRlKHgsIDIpXSBeCQlcCisJIGFlc19mbF90YWJbM11bYnl0ZSh4LCAzKV0pCisKK3N0YXRpYyB2b2lkIF9faW5pdCBnZW5fdGFicyh2b2lkKQoreworCXUzMiBpLCB0OworCXU4IHAsIHE7CisKKwkvKiBsb2cgYW5kIHBvd2VyIHRhYmxlcyBmb3IgR0YoMioqOCkgZmluaXRlIGZpZWxkIHdpdGgKKwkgICAweDAxMWIgYXMgbW9kdWxhciBwb2x5bm9taWFsIC0gdGhlIHNpbXBsZXN0IHByaW1pdGl2ZQorCSAgIHJvb3QgaXMgMHgwMywgdXNlZCBoZXJlIHRvIGdlbmVyYXRlIHRoZSB0YWJsZXMgKi8KKworCWZvciAoaSA9IDAsIHAgPSAxOyBpIDwgMjU2OyArK2kpIHsKKwkJcG93X3RhYltpXSA9ICh1OClwOworCQlsb2dfdGFiW3BdID0gKHU4KWk7CisKKwkJcCBePSAocCA8PCAxKSBeIChwICYgMHg4MCA/IDB4MDFiIDogMCk7CisJfQorCisJbG9nX3RhYlsxXSA9IDA7CisKKwlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDEwOyArK2kpIHsKKwkJcmNvX3RhYltpXSA9IHA7CisKKwkJcCA9IChwIDw8IDEpIF4gKHAgJiAweDgwID8gMHgwMWIgOiAwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJcCA9IChpID8gcG93X3RhYlsyNTUgLSBsb2dfdGFiW2ldXSA6IDApOworCQlxID0gKChwID4+IDcpIHwgKHAgPDwgMSkpIF4gKChwID4+IDYpIHwgKHAgPDwgMikpOworCQlwIF49IDB4NjMgXiBxIF4gKChxID4+IDYpIHwgKHEgPDwgMikpOworCQlzYnhfdGFiW2ldID0gcDsKKwkJaXNiX3RhYltwXSA9ICh1OClpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlwID0gc2J4X3RhYltpXTsKKworCQl0ID0gcDsKKwkJYWVzX2ZsX3RhYlswXVtpXSA9IHQ7CisJCWFlc19mbF90YWJbMV1baV0gPSByb2wzMih0LCA4KTsKKwkJYWVzX2ZsX3RhYlsyXVtpXSA9IHJvbDMyKHQsIDE2KTsKKwkJYWVzX2ZsX3RhYlszXVtpXSA9IHJvbDMyKHQsIDI0KTsKKworCQl0ID0gKCh1MzIpZmZfbXVsdCgyLCBwKSkgfAorCQkgICAgKCh1MzIpcCA8PCA4KSB8CisJCSAgICAoKHUzMilwIDw8IDE2KSB8ICgodTMyKWZmX211bHQoMywgcCkgPDwgMjQpOworCisJCWFlc19mdF90YWJbMF1baV0gPSB0OworCQlhZXNfZnRfdGFiWzFdW2ldID0gcm9sMzIodCwgOCk7CisJCWFlc19mdF90YWJbMl1baV0gPSByb2wzMih0LCAxNik7CisJCWFlc19mdF90YWJbM11baV0gPSByb2wzMih0LCAyNCk7CisKKwkJcCA9IGlzYl90YWJbaV07CisKKwkJdCA9IHA7CisJCWFlc19pbF90YWJbMF1baV0gPSB0OworCQlhZXNfaWxfdGFiWzFdW2ldID0gcm9sMzIodCwgOCk7CisJCWFlc19pbF90YWJbMl1baV0gPSByb2wzMih0LCAxNik7CisJCWFlc19pbF90YWJbM11baV0gPSByb2wzMih0LCAyNCk7CisKKwkJdCA9ICgodTMyKWZmX211bHQoMTQsIHApKSB8CisJCSAgICAoKHUzMilmZl9tdWx0KDksIHApIDw8IDgpIHwKKwkJICAgICgodTMyKWZmX211bHQoMTMsIHApIDw8IDE2KSB8CisJCSAgICAoKHUzMilmZl9tdWx0KDExLCBwKSA8PCAyNCk7CisKKwkJYWVzX2l0X3RhYlswXVtpXSA9IHQ7CisJCWFlc19pdF90YWJbMV1baV0gPSByb2wzMih0LCA4KTsKKwkJYWVzX2l0X3RhYlsyXVtpXSA9IHJvbDMyKHQsIDE2KTsKKwkJYWVzX2l0X3RhYlszXVtpXSA9IHJvbDMyKHQsIDI0KTsKKwl9Cit9CisKKyNkZWZpbmUgc3Rhcl94KHgpICgoKHgpICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXiAoKCgoeCkgJiAweDgwODA4MDgwKSA+PiA3KSAqIDB4MWIpCisKKyNkZWZpbmUgaW1peF9jb2woeSwgeCkJCQlcCisJdSAgICA9IHN0YXJfeCh4KTsJCVwKKwl2ICAgID0gc3Rhcl94KHUpOwkJXAorCXcgICAgPSBzdGFyX3godik7CQlcCisJdCAgICA9IHcgXiAoeCk7CQkJXAorCSh5KSAgPSB1IF4gdiBeIHc7CQlcCisJKHkpIF49IHJvcjMyKHUgXiB0LCAgOCkgXglcCisJICAgICAgIHJvcjMyKHYgXiB0LCAxNikgXglcCisJICAgICAgIHJvcjMyKHQsIDI0KQorCisvKiBpbml0aWFsaXNlIHRoZSBrZXkgc2NoZWR1bGUgZnJvbSB0aGUgdXNlciBzdXBwbGllZCBrZXkgKi8KKworI2RlZmluZSBsb29wNChpKQkJCQkJXAorewkJCQkJCQlcCisJdCA9IHJvcjMyKHQsICA4KTsgdCA9IGxzX2JveCh0KSBeIHJjb190YWJbaV07CVwKKwl0IF49IEVfS0VZWzQgKiBpXTsgICAgIEVfS0VZWzQgKiBpICsgNF0gPSB0OwlcCisJdCBePSBFX0tFWVs0ICogaSArIDFdOyBFX0tFWVs0ICogaSArIDVdID0gdDsJXAorCXQgXj0gRV9LRVlbNCAqIGkgKyAyXTsgRV9LRVlbNCAqIGkgKyA2XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzQgKiBpICsgM107IEVfS0VZWzQgKiBpICsgN10gPSB0OwlcCit9CisKKyNkZWZpbmUgbG9vcDYoaSkJCQkJCVwKK3sJCQkJCQkJXAorCXQgPSByb3IzMih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOwlcCisJdCBePSBFX0tFWVs2ICogaV07ICAgICBFX0tFWVs2ICogaSArIDZdID0gdDsJXAorCXQgXj0gRV9LRVlbNiAqIGkgKyAxXTsgRV9LRVlbNiAqIGkgKyA3XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzYgKiBpICsgMl07IEVfS0VZWzYgKiBpICsgOF0gPSB0OwlcCisJdCBePSBFX0tFWVs2ICogaSArIDNdOyBFX0tFWVs2ICogaSArIDldID0gdDsJXAorCXQgXj0gRV9LRVlbNiAqIGkgKyA0XTsgRV9LRVlbNiAqIGkgKyAxMF0gPSB0OwlcCisJdCBePSBFX0tFWVs2ICogaSArIDVdOyBFX0tFWVs2ICogaSArIDExXSA9IHQ7CVwKK30KKworI2RlZmluZSBsb29wOChpKQkJCQkJXAorewkJCQkJCQlcCisJdCA9IHJvcjMyKHQsICA4KTsgOyB0ID0gbHNfYm94KHQpIF4gcmNvX3RhYltpXTsJXAorCXQgXj0gRV9LRVlbOCAqIGldOyAgICAgRV9LRVlbOCAqIGkgKyA4XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzggKiBpICsgMV07IEVfS0VZWzggKiBpICsgOV0gPSB0OwlcCisJdCBePSBFX0tFWVs4ICogaSArIDJdOyBFX0tFWVs4ICogaSArIDEwXSA9IHQ7CVwKKwl0IF49IEVfS0VZWzggKiBpICsgM107IEVfS0VZWzggKiBpICsgMTFdID0gdDsJXAorCXQgID0gRV9LRVlbOCAqIGkgKyA0XSBeIGxzX2JveCh0KTsJCVwKKwlFX0tFWVs4ICogaSArIDEyXSA9IHQ7CQkJCVwKKwl0IF49IEVfS0VZWzggKiBpICsgNV07IEVfS0VZWzggKiBpICsgMTNdID0gdDsJXAorCXQgXj0gRV9LRVlbOCAqIGkgKyA2XTsgRV9LRVlbOCAqIGkgKyAxNF0gPSB0OwlcCisJdCBePSBFX0tFWVs4ICogaSArIDddOyBFX0tFWVs4ICogaSArIDE1XSA9IHQ7CVwKK30KKworc3RhdGljIGludCBhZXNfc2V0X2tleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1OCAqaW5fa2V5LCB1bnNpZ25lZCBpbnQga2V5X2xlbiwKKwkJICAgICAgIHUzMiAqZmxhZ3MpCit7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJdTMyIGksIGosIHQsIHUsIHYsIHc7CisKKwlpZiAoa2V5X2xlbiAhPSAxNiAmJiBrZXlfbGVuICE9IDI0ICYmIGtleV9sZW4gIT0gMzIpIHsKKwkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdHgtPmtleV9sZW5ndGggPSBrZXlfbGVuOworCisJRF9LRVlba2V5X2xlbiArIDI0XSA9IEVfS0VZWzBdID0gdTMyX2luKGluX2tleSk7CisJRF9LRVlba2V5X2xlbiArIDI1XSA9IEVfS0VZWzFdID0gdTMyX2luKGluX2tleSArIDQpOworCURfS0VZW2tleV9sZW4gKyAyNl0gPSBFX0tFWVsyXSA9IHUzMl9pbihpbl9rZXkgKyA4KTsKKwlEX0tFWVtrZXlfbGVuICsgMjddID0gRV9LRVlbM10gPSB1MzJfaW4oaW5fa2V5ICsgMTIpOworCisJc3dpdGNoIChrZXlfbGVuKSB7CisJY2FzZSAxNjoKKwkJdCA9IEVfS0VZWzNdOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKwkJCWxvb3A0KGkpOworCQlicmVhazsKKworCWNhc2UgMjQ6CisJCUVfS0VZWzRdID0gdTMyX2luKGluX2tleSArIDE2KTsKKwkJdCA9IEVfS0VZWzVdID0gdTMyX2luKGluX2tleSArIDIwKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJCWxvb3A2IChpKTsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQlFX0tFWVs0XSA9IHUzMl9pbihpbl9rZXkgKyAxNik7CisJCUVfS0VZWzVdID0gdTMyX2luKGluX2tleSArIDIwKTsKKwkJRV9LRVlbNl0gPSB1MzJfaW4oaW5fa2V5ICsgMjQpOworCQl0ID0gRV9LRVlbN10gPSB1MzJfaW4oaW5fa2V5ICsgMjgpOworCQlmb3IgKGkgPSAwOyBpIDwgNzsgKytpKQorCQkJbG9vcDgoaSk7CisJCWJyZWFrOworCX0KKworCURfS0VZWzBdID0gRV9LRVlba2V5X2xlbiArIDI0XTsKKwlEX0tFWVsxXSA9IEVfS0VZW2tleV9sZW4gKyAyNV07CisJRF9LRVlbMl0gPSBFX0tFWVtrZXlfbGVuICsgMjZdOworCURfS0VZWzNdID0gRV9LRVlba2V5X2xlbiArIDI3XTsKKworCWZvciAoaSA9IDQ7IGkgPCBrZXlfbGVuICsgMjQ7ICsraSkgeworCQlqID0ga2V5X2xlbiArIDI0IC0gKGkgJiB+MykgKyAoaSAmIDMpOworCQlpbWl4X2NvbChEX0tFWVtqXSwgRV9LRVlbaV0pOworCX0KKworCXJldHVybiAwOworfQorCitleHRlcm4gdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pOworZXh0ZXJuIHZvaWQgYWVzX2RlY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKTsKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFlc19hbGcgPSB7CisJLmNyYV9uYW1lCQk9CSJhZXMiLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBhZXNfY3R4KSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYWVzX2FsZy5jcmFfbGlzdCksCisJLmNyYV91CQkJPQl7CisJCS5jaXBoZXIgPSB7CisJCQkuY2lhX21pbl9rZXlzaXplCT0JQUVTX01JTl9LRVlfU0laRSwKKwkJCS5jaWFfbWF4X2tleXNpemUJPQlBRVNfTUFYX0tFWV9TSVpFLAorCQkJLmNpYV9zZXRrZXkJICAgCT0gCWFlc19zZXRfa2V5LAorCQkJLmNpYV9lbmNyeXB0CSAJPQlhZXNfZW5jcnlwdCwKKwkJCS5jaWFfZGVjcnlwdAkgIAk9CWFlc19kZWNyeXB0CisJCX0KKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZXNfaW5pdCh2b2lkKQoreworCWdlbl90YWJzKCk7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWVzX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOworfQorCittb2R1bGVfaW5pdChhZXNfaW5pdCk7Cittb2R1bGVfZXhpdChhZXNfZmluaSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUmlqbmRhZWwgKEFFUykgQ2lwaGVyIEFsZ29yaXRobSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggYWNkMmE3Ny4uNWM2ZGM3MCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC02ODIsNyArNjgyLDcgQEAKIAkucHJlX2hhbmRsZXIgPSB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIKIH07CiAKLWludCBfX2luaXQgYXJjaF9pbml0KHZvaWQpCitpbnQgX19pbml0IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpCiB7CiAJcmV0dXJuIHJlZ2lzdGVyX2twcm9iZSgmdHJhbXBvbGluZV9wKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKaW5kZXggYjAyZDkyMS4uNWZkMDMyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKQEAgLTEwNzYsNiArMTA3NiwxMCBAQAogI2lmZGVmIENPTkZJR19YODZfTUNFCiAJbWNoZWNrX2luaXQoYyk7CiAjZW5kaWYKKwlpZiAoYyA9PSAmYm9vdF9jcHVfZGF0YSkKKwkJbXRycl9icF9pbml0KCk7CisJZWxzZQorCQltdHJyX2FwX2luaXQoKTsKICNpZmRlZiBDT05GSUdfTlVNQQogCWlmIChjICE9ICZib290X2NwdV9kYXRhKQogCQludW1hX2FkZF9jcHUoYyAtIGNwdV9kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZC5jCmluZGV4IDZjMGY0MDJlLi4wNjEyNjQwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kLmMKQEAgLTExOSw2ICsxMTksNyBAQAogCWZpeF9wcm9jZXNzb3JfY29udGV4dCgpOwogCiAJZG9fZnB1X2VuZCgpOworCW10cnJfYXBfaW5pdCgpOwogfQogCiB2b2lkIHJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDczMzg5ZjUuLjJhOTRmOWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC01NiwxMCArNTYsMTQgQEAKICAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CiAJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKICAgfQorICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7CisgIC5kYXRhLnJlYWRfbW9zdGx5IDogQVQoQUREUiguZGF0YS5yZWFkX21vc3RseSkgLSBMT0FEX09GRlNFVCkgeworICAJKiguZGF0YS5yZWFkX21vc3RseSkKKyAgfQogCiAjZGVmaW5lIFZTWVNDQUxMX0FERFIgKC0xMCoxMDI0KjEwMjQpCi0jZGVmaW5lIFZTWVNDQUxMX1BIWVNfQUREUiAoKExPQURBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSArIFNJWkVPRiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgKyA0MDk1KSAmIH4oNDA5NSkpCi0jZGVmaW5lIFZTWVNDQUxMX1ZJUlRfQUREUiAoKEFERFIoLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpICsgU0laRU9GKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSArIDQwOTUpICYgfig0MDk1KSkKKyNkZWZpbmUgVlNZU0NBTExfUEhZU19BRERSICgoTE9BREFERFIoLmRhdGEucmVhZF9tb3N0bHkpICsgU0laRU9GKC5kYXRhLnJlYWRfbW9zdGx5KSArIDQwOTUpICYgfig0MDk1KSkKKyNkZWZpbmUgVlNZU0NBTExfVklSVF9BRERSICgoQUREUiguZGF0YS5yZWFkX21vc3RseSkgKyBTSVpFT0YoLmRhdGEucmVhZF9tb3N0bHkpICsgNDA5NSkgJiB+KDQwOTUpKQogCiAjZGVmaW5lIFZMT0FEX09GRlNFVCAoVlNZU0NBTExfQUREUiAtIFZTWVNDQUxMX1BIWVNfQUREUikKICNkZWZpbmUgVkxPQUQoeCkgKEFERFIoeCkgLSBWTE9BRF9PRkZTRVQpCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9LY29uZmlnIGIvYXJjaC94dGVuc2EvS2NvbmZpZwppbmRleCBjOWI1ZDI5Li4yYjYyNTdiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9LY29uZmlnCisrKyBiL2FyY2gveHRlbnNhL0tjb25maWcKQEAgLTIyOCw2ICsyMjgsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDg0MGNkOWEuLjdjZDFkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5jCmluZGV4IGFiYzhlZDYuLmYyMGM2NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5jCkBAIC00MiwxMiArNDIsOSBAQAogI2luY2x1ZGUgPGFzbS9tbWFuLmg+CiAjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vaXBjLmg+CiAKIGV4dGVybiB2b2lkIGRvX3N5c2NhbGxfdHJhY2Uodm9pZCk7CiB0eXBlZGVmIGludCAoKnN5c2NhbGxfdCkodm9pZCAqYTAsLi4uKTsKLWV4dGVybiBpbnQgKCpkb19zeXNjYWxscykoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN5c2NhbGxfdCBmdW4sCi0JCQkJICAgICBpbnQgbmFyZyk7CiBleHRlcm4gc3lzY2FsbF90IHN5c19jYWxsX3RhYmxlW107CiBleHRlcm4gdW5zaWduZWQgY2hhciBzeXNfbmFyZ190YWJsZVtdOwogCkBAIC03MiwxMCArNjksOCBAQAogLyoKICAqIENvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcy4KICAqLwotCi1zdGF0aWMgaW5saW5lIGxvbmcgZG9fbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLSAgICAJCQkgICAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCitsb25nIHN5c19tbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKKwkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewogCWludCBlcnJvciA9IC1FQkFERjsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwpAQCAtOTcsMjkgKzkyLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXVuc2lnbmVkIGxvbmcgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgbGVuLCBpbnQgcHJvdCwKLQkJICAgICAgIGludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpCi17Ci0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7Ci19Ci0KLWxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKLQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlyZXR1cm4gZG9fbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmKTsKLX0KLQotaW50IHN5c19mb3JrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiBkb19mb3JrKFNJR0NITEQsIHJlZ3MtPmFyZWdbMV0sIHJlZ3MsIDAsIE5VTEwsIE5VTEwpOwotfQotCi1pbnQgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiBkb19mb3JrKENMT05FX1ZGT1JLfENMT05FX1ZNfFNJR0NITEQsIHJlZ3MtPmFyZWdbMV0sCi0JCSAgICAgICByZWdzLCAwLCBOVUxMLCBOVUxMKTsKLX0KLQogaW50IHN5c19jbG9uZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzOwpAQCAtMTYyLDMwICsxMzQsNiBAQAogCXJldHVybiAtRUZBVUxUOwogfQogCi1pbnQgc3lzX29sZHVuYW1lKHN0cnVjdCBvbGRvbGRfdXRzbmFtZSAqIG5hbWUpCi17Ci0JaW50IGVycm9yOwotCi0JaWYgKCFuYW1lKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsbmFtZSxzaXplb2Yoc3RydWN0IG9sZG9sZF91dHNuYW1lKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JZXJyb3IgPSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+c3lzbmFtZSwmc3lzdGVtX3V0c25hbWUuc3lzbmFtZSxfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX3B1dF91c2VyKDAsbmFtZS0+c3lzbmFtZStfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+bm9kZW5hbWUsJnN5c3RlbV91dHNuYW1lLm5vZGVuYW1lLF9fT0xEX1VUU19MRU4pOwotCWVycm9yIC09IF9fcHV0X3VzZXIoMCxuYW1lLT5ub2RlbmFtZStfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+cmVsZWFzZSwmc3lzdGVtX3V0c25hbWUucmVsZWFzZSxfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX3B1dF91c2VyKDAsbmFtZS0+cmVsZWFzZStfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+dmVyc2lvbiwmc3lzdGVtX3V0c25hbWUudmVyc2lvbixfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX3B1dF91c2VyKDAsbmFtZS0+dmVyc2lvbitfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+bWFjaGluZSwmc3lzdGVtX3V0c25hbWUubWFjaGluZSxfX09MRF9VVFNfTEVOKTsKLQllcnJvciAtPSBfX3B1dF91c2VyKDAsbmFtZS0+bWFjaGluZStfX09MRF9VVFNfTEVOKTsKLQotCXJldHVybiBlcnJvciA/IC1FRkFVTFQgOiAwOwotfQotCi0KIC8qCiAgKiBCdWlsZCB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGUgYnVpbHRpbiAicG9vciBtYW4ncyBzdHJhY2UiLgogICovCkBAIC0zMTksMTAwICsyNjcsMyBAQAogCXJlZ3MtPmFyZWdbMl0gPSByZXM7CiAJZG9fc3lzY2FsbF90cmFjZSgpOwogfQotCi0vKgotICogc3lzX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzLi4KLSAqCi0gKiBUaGlzIGlzIHJlYWxseSBob3JyaWJseSB1Z2x5LgotICovCi0KLWludCBzeXNfaXBjICh1aW50IGNhbGwsIGludCBmaXJzdCwgaW50IHNlY29uZCwKLQkJCWludCB0aGlyZCwgdm9pZCBfX3VzZXIgKnB0ciwgbG9uZyBmaWZ0aCkKLXsKLQlpbnQgdmVyc2lvbiwgcmV0OwotCi0JdmVyc2lvbiA9IGNhbGwgPj4gMTY7IC8qIGhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLQljYWxsICY9IDB4ZmZmZjsKLQlyZXQgPSAtRU5PU1lTOwotCi0Jc3dpdGNoIChjYWxsKSB7Ci0JY2FzZSBTRU1PUDoKLQkJcmV0ID0gc3lzX3NlbXRpbWVkb3AgKGZpcnN0LCAoc3RydWN0IHNlbWJ1ZiBfX3VzZXIgKilwdHIsCi0JCQkJICAgICBzZWNvbmQsIE5VTEwpOwotCQlicmVhazsKLQotCWNhc2UgU0VNVElNRURPUDoKLQkJcmV0ID0gc3lzX3NlbXRpbWVkb3AgKGZpcnN0LCAoc3RydWN0IHNlbWJ1ZiBfX3VzZXIgKilwdHIsCi0JCQkJICAgICAgc2Vjb25kLCAoY29uc3Qgc3RydWN0IHRpbWVzcGVjICopIGZpZnRoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNFTUdFVDoKLQkJcmV0ID0gc3lzX3NlbWdldCAoZmlyc3QsIHNlY29uZCwgdGhpcmQpOwotCQlicmVhazsKLQotCWNhc2UgU0VNQ1RMOiB7Ci0JCXVuaW9uIHNlbXVuIGZvdXJ0aDsKLQotCQlpZiAocHRyICYmICFnZXRfdXNlcihmb3VydGguX19wYWQsICh2b2lkICpfX3VzZXIgKikgcHRyKSkKLQkJCXJldCA9IHN5c19zZW1jdGwgKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBmb3VydGgpOwotCQlicmVhazsKLQkJfQotCi0JY2FzZSBNU0dTTkQ6Ci0JCXJldCA9IHN5c19tc2dzbmQgKGZpcnN0LCAoc3RydWN0IG1zZ2J1ZiBfX3VzZXIqKSBwdHIsCi0JCQkJICBzZWNvbmQsIHRoaXJkKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TR1JDVjoKLQkJc3dpdGNoICh2ZXJzaW9uKSB7Ci0JCWNhc2UgMDogewotCQkJc3RydWN0IGlwY19rbHVkZ2UgdG1wOwotCi0JCQlpZiAocHRyICYmICFjb3B5X2Zyb21fdXNlcigmdG1wLAotCQkJCQkgICAoc3RydWN0IGlwY19rbHVkZ2UgKikgcHRyLAotCQkJCQkgICBzaXplb2YgKHRtcCkpKQotCQkJCXJldCA9IHN5c19tc2dyY3YgKGZpcnN0LCB0bXAubXNncCwgc2Vjb25kLAotCQkJCQkJICB0bXAubXNndHlwLCB0aGlyZCk7Ci0JCQlicmVhazsKLQkJCX0KLQotCQlkZWZhdWx0OgotCQkJcmV0ID0gc3lzX21zZ3JjdiAoZmlyc3QsIChzdHJ1Y3QgbXNnYnVmIF9fdXNlciAqKSBwdHIsCi0JCQkJCSAgc2Vjb25kLCAwLCB0aGlyZCk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTVNHR0VUOgotCQlyZXQgPSBzeXNfbXNnZ2V0ICgoa2V5X3QpIGZpcnN0LCBzZWNvbmQpOwotCQlicmVhazsKLQotCWNhc2UgTVNHQ1RMOgotCQlyZXQgPSBzeXNfbXNnY3RsIChmaXJzdCwgc2Vjb25kLCAoc3RydWN0IG1zcWlkX2RzIF9fdXNlciopIHB0cik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSE1BVDogewotCQl1bG9uZyByYWRkcjsKLQkJcmV0ID0gZG9fc2htYXQgKGZpcnN0LCAoY2hhciBfX3VzZXIgKikgcHRyLCBzZWNvbmQsICZyYWRkcik7Ci0KLQkJaWYgKCFyZXQpCi0JCQlyZXQgPSBwdXRfdXNlciAocmFkZHIsICh1bG9uZyBfX3VzZXIgKikgdGhpcmQpOwotCi0JCWJyZWFrOwotCQl9Ci0KLQljYXNlIFNITURUOgotCQlyZXQgPSBzeXNfc2htZHQgKChjaGFyIF9fdXNlciAqKXB0cik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSE1HRVQ6Ci0JCXJldCA9IHN5c19zaG1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNITUNUTDoKLQkJcmV0ID0gc3lzX3NobWN0bCAoZmlyc3QsIHNlY29uZCwgKHN0cnVjdCBzaG1pZF9kcyBfX3VzZXIqKSBwdHIpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGxzLmggYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuaAppbmRleCA1YjNmNzVmLi4yMTZjMTBhIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuaAorKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuaApAQCAtMjUsNDEgKzI1LDQwIEBACiAgKi8KIAogU1lTQ0FMTCgwLCAwKQkJICAgICAgICAgICAgICAgIC8qIDAwICovCi0KIFNZU0NBTEwoc3lzX2V4aXQsIDEpCi1TWVNDQUxMKHN5c19mb3JrLCAwKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX3JlYWQsIDMpCiBTWVNDQUxMKHN5c193cml0ZSwgMykKIFNZU0NBTEwoc3lzX29wZW4sIDMpCQkJLyogMDUgKi8KIFNZU0NBTEwoc3lzX2Nsb3NlLCAxKQotU1lTQ0FMTChzeXNfd2FpdHBpZCwgMykKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDMpCiBTWVNDQUxMKHN5c19jcmVhdCwgMikKIFNZU0NBTEwoc3lzX2xpbmssIDIpCiBTWVNDQUxMKHN5c191bmxpbmssIDEpCQkJLyogMTAgKi8KIFNZU0NBTEwoc3lzX2V4ZWN2ZSwgMCkKIFNZU0NBTEwoc3lzX2NoZGlyLCAxKQotU1lTQ0FMTChzeXNfdGltZSwgMSkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCiBTWVNDQUxMKHN5c19ta25vZCwgMykKIFNZU0NBTEwoc3lzX2NobW9kLCAyKQkJCS8qIDE1ICovCiBTWVNDQUxMKHN5c19sY2hvd24sIDMpCiBTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfc3RhdCwgMikKK1NZU0NBTEwoc3lzX25ld3N0YXQsIDIpCiBTWVNDQUxMKHN5c19sc2VlaywgMykKIFNZU0NBTEwoc3lzX2dldHBpZCwgMCkJCQkvKiAyMCAqLwogU1lTQ0FMTChzeXNfbW91bnQsIDUpCi1TWVNDQUxMKHN5c19vbGR1bW91bnQsIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQogU1lTQ0FMTChzeXNfc2V0dWlkLCAxKQogU1lTQ0FMTChzeXNfZ2V0dWlkLCAwKQotU1lTQ0FMTChzeXNfc3RpbWUsIDEpCQkJLyogMjUgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCQkvKiAyNSAqLwogU1lTQ0FMTChzeXNfcHRyYWNlLCA0KQotU1lTQ0FMTChzeXNfYWxhcm0sIDEpCi1TWVNDQUxMKHN5c19mc3RhdCwgMikKLVNZU0NBTEwoc3lzX3BhdXNlLCAwKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkKK1NZU0NBTEwoc3lzX25ld2ZzdGF0LCAyKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX3V0aW1lLCAyKQkJCS8qIDMwICovCiBTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX2FjY2VzcywgMikKLVNZU0NBTEwoc3lzX25pY2UsIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIDM1ICovCiBTWVNDQUxMKHN5c19zeW5jLCAwKQogU1lTQ0FMTChzeXNfa2lsbCwgMikKQEAgLTczLDcgKzcyLDcgQEAKIFNZU0NBTEwoc3lzX2JyaywgMSkJCQkvKiA0NSAqLwogU1lTQ0FMTChzeXNfc2V0Z2lkLCAxKQogU1lTQ0FMTChzeXNfZ2V0Z2lkLCAwKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIHdhcyBzaWduYWwoMikgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCiBTWVNDQUxMKHN5c19nZXRldWlkLCAwKQogU1lTQ0FMTChzeXNfZ2V0ZWdpZCwgMCkJCQkvKiA1MCAqLwogU1lTQ0FMTChzeXNfYWNjdCwgMSkKQEAgLTg0LDIxICs4MywyMSBAQAogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMikKIFNZU0NBTEwoc3lzX3NldHBnaWQsIDIpCiBTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfb2xkdW5hbWUsIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfdW1hc2ssIDEpCQkJLyogNjAgKi8KIFNZU0NBTEwoc3lzX2Nocm9vdCwgMSkKIFNZU0NBTEwoc3lzX3VzdGF0LCAyKQogU1lTQ0FMTChzeXNfZHVwMiwgMikKIFNZU0NBTEwoc3lzX2dldHBwaWQsIDApCi1TWVNDQUxMKHN5c19nZXRwZ3JwLCAwKQkJCS8qIDY1ICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQkJLyogNjUgKi8KIFNZU0NBTEwoc3lzX3NldHNpZCwgMCkKIFNZU0NBTEwoc3lzX3NpZ2FjdGlvbiwgMykKLVNZU0NBTEwoc3lzX3NnZXRtYXNrLCAwKQotU1lTQ0FMTChzeXNfc3NldG1hc2ssIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkKIFNZU0NBTEwoc3lzX3NldHJldWlkLCAyKQkJLyogNzAgKi8KIFNZU0NBTEwoc3lzX3NldHJlZ2lkLCAyKQogU1lTQ0FMTChzeXNfc2lnc3VzcGVuZCwgMCkKLVNZU0NBTEwoc3lzX3NpZ3BlbmRpbmcsIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQogU1lTQ0FMTChzeXNfc2V0aG9zdG5hbWUsIDIpCiBTWVNDQUxMKHN5c19zZXRybGltaXQsIDIpCQkvKiA3NSAqLwogU1lTQ0FMTChzeXNfZ2V0cmxpbWl0LCAyKQpAQCAtMTA3LDE1ICsxMDYsMTUgQEAKIFNZU0NBTEwoc3lzX3NldHRpbWVvZmRheSwgMikKIFNZU0NBTEwoc3lzX2dldGdyb3VwcywgMikJCS8qIDgwICovCiBTWVNDQUxMKHN5c19zZXRncm91cHMsIDIpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQkJIC8qIG9sZF9zZWxlY3QgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCiBTWVNDQUxMKHN5c19zeW1saW5rLCAyKQotU1lTQ0FMTChzeXNfbHN0YXQsIDIpCitTWVNDQUxMKHN5c19uZXdsc3RhdCwgMikKIFNZU0NBTEwoc3lzX3JlYWRsaW5rLCAzKQkJLyogODUgKi8KIFNZU0NBTEwoc3lzX3VzZWxpYiwgMSkKIFNZU0NBTEwoc3lzX3N3YXBvbiwgMikKIFNZU0NBTEwoc3lzX3JlYm9vdCwgMykKLVNZU0NBTEwob2xkX3JlYWRkaXIsIDMpCi1TWVNDQUxMKG9sZF9tbWFwLCA2KQkJCS8qIDkwICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAzKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgNikJCS8qIDkwICovCiBTWVNDQUxMKHN5c19tdW5tYXAsIDIpCiBTWVNDQUxMKHN5c190cnVuY2F0ZSwgMikKIFNZU0NBTEwoc3lzX2Z0cnVuY2F0ZSwgMikKQEAgLTEyNyw3ICsxMjYsNyBAQAogU1lTQ0FMTChzeXNfc3RhdGZzLCAyKQogU1lTQ0FMTChzeXNfZnN0YXRmcywgMikJCQkvKiAxMDAgKi8KIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDMpCi1TWVNDQUxMKHN5c19zb2NrZXRjYWxsLCAyKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMikKIFNZU0NBTEwoc3lzX3N5c2xvZywgMykKIFNZU0NBTEwoc3lzX3NldGl0aW1lciwgMykKIFNZU0NBTEwoc3lzX2dldGl0aW1lciwgMikJCS8qIDEwNSAqLwpAQCAtMTM3LDMyICsxMzYsMzIgQEAKIFNZU0NBTEwoc3lzX3VuYW1lLCAxKQogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIDExMCAqLwogU1lTQ0FMTChzeXNfdmhhbmd1cCwgMCkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCQkvKiB3YXMgc3lzX2lkbGUoKSAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCiBTWVNDQUxMKHN5c193YWl0NCwgNCkKIFNZU0NBTEwoc3lzX3N3YXBvZmYsIDEpCQkJLyogMTE1ICovCiBTWVNDQUxMKHN5c19zeXNpbmZvLCAxKQotU1lTQ0FMTChzeXNfaXBjLCA1KSAgIAkJCS8qIDYgcmVhbGx5LCBidXQgZ2xpYmMgdXNlcyBvbmx5IDUpICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfZnN5bmMsIDEpCiBTWVNDQUxMKHN5c19zaWdyZXR1cm4sIDApCiBTWVNDQUxMKHN5c19jbG9uZSwgMCkJCQkvKiAxMjAgKi8KIFNZU0NBTEwoc3lzX3NldGRvbWFpbm5hbWUsIDIpCiBTWVNDQUxMKHN5c19uZXd1bmFtZSwgMSkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApIAkJLyogc3lzX21vZGlmeV9sZHQgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCiBTWVNDQUxMKHN5c19hZGp0aW1leCwgMSkKIFNZU0NBTEwoc3lzX21wcm90ZWN0LCAzKQkJLyogMTI1ICovCi1TWVNDQUxMKHN5c19zaWdwcm9jbWFzaywgMykKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDIpCQkvKiBvbGQgc3lzX2NyZWF0ZV9tb2R1bGUgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDMpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAyKQogU1lTQ0FMTChzeXNfaW5pdF9tb2R1bGUsIDIpCiBTWVNDQUxMKHN5c19kZWxldGVfbW9kdWxlLCAxKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkJCS8qIG9sZCBzeXNfZ2V0X2tlcm5lbF9zeXNtICovCS8qIDEzMCAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkJCS8qIDEzMCAqLwogU1lTQ0FMTChzeXNfcXVvdGFjdGwsIDApCiBTWVNDQUxMKHN5c19nZXRwZ2lkLCAxKQogU1lTQ0FMTChzeXNfZmNoZGlyLCAxKQogU1lTQ0FMTChzeXNfYmRmbHVzaCwgMikKIFNZU0NBTEwoc3lzX3N5c2ZzLCAzKQkJCS8qIDEzNSAqLwogU1lTQ0FMTChzeXNfcGVyc29uYWxpdHksIDEpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQkJLyogZm9yIGFmc19zeXNjYWxsICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfc2V0ZnN1aWQsIDEpCiBTWVNDQUxMKHN5c19zZXRmc2dpZCwgMSkKIFNZU0NBTEwoc3lzX2xsc2VlaywgNSkJCQkvKiAxNDAgKi8KQEAgLTIxMiw3ICsyMTEsNyBAQAogU1lTQ0FMTChzeXNfc29ja2V0cGFpciwgNCkKIFNZU0NBTEwoc3lzX3NldHJlc3VpZCwgMykJCS8qIDE4NSAqLwogU1lTQ0FMTChzeXNfZ2V0cmVzdWlkLCAzKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgNSkJCS8qIG9sZCBzeXNfcXVlcnlfbW9kdWxlICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCA1KQogU1lTQ0FMTChzeXNfcG9sbCwgMykKIFNZU0NBTEwoc3lzX25mc3NlcnZjdGwsIDMpCiBTWVNDQUxMKHN5c19zZXRyZXNnaWQsIDMpCQkvKiAxOTAgKi8KQEAgLTIzNSw3ICsyMzQsNyBAQAogU1lTQ0FMTChzeXNfc2VuZGZpbGUsIDQpCiBTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQogU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX21tYXAyLCA2KQkJCS8qIDIxMCAqLworU1lTQ0FMTChzeXNfbW1hcCwgNikJCQkvKiAyMTAgKi8KIFNZU0NBTEwoc3lzX3RydW5jYXRlNjQsIDIpCiBTWVNDQUxMKHN5c19mdHJ1bmNhdGU2NCwgMikKIFNZU0NBTEwoc3lzX3N0YXQ2NCwgMikKQEAgLTI0NSw0ICsyNDQsNCBAQAogU1lTQ0FMTChzeXNfbWluY29yZSwgMykKIFNZU0NBTEwoc3lzX21hZHZpc2UsIDMpCiBTWVNDQUxMKHN5c19nZXRkZW50czY0LCAzKQotU1lTQ0FMTChzeXNfdmZvcmssIDApCQkJLyogMjIwICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQkJLyogMjIwICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC90cmFwcy5jCmluZGV4IDgwNDI0NmUuLjIyNWQ2NGQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC90cmFwcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS90aW1leC5oPgpAQCAtNDg4LDggKzQ4OSw3IEBACiAKIAlpZiAocGFuaWNfb25fb29wcykgewogCQlwcmludGsoS0VSTl9FTUVSRyAiRmF0YWwgZXhjZXB0aW9uOiBwYW5pYyBpbiA1IHNlY29uZHNcbiIpOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoNSAqIEhaKTsKKwkJc3NsZWVwKDUpOwogCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CiAJfQogCWRvX2V4aXQoZXJyKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNDc2YjJiNS4uNWVkNzFkZiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTkwLDEwICs5MCwxMCBAQAogICAgICooLmxpdGVyYWwgLnRleHQpCiAgICAgKiguc3JvbS50ZXh0KQogICAgIFZNTElOVVhfU1lNQk9MKF9fc2NoZWRfdGV4dF9zdGFydCkgPSAuOwotICAgICooLnNjaGVkLnRleHQubGl0ZXJhbCAuc2NoZWQudGV4dCkKKyAgICAqKC5zY2hlZC5saXRlcmFsIC5zY2hlZC50ZXh0KQogICAgIFZNTElOVVhfU1lNQk9MKF9fc2NoZWRfdGV4dF9lbmQpID0gLjsKICAgICBWTUxJTlVYX1NZTUJPTChfX2xvY2tfdGV4dF9zdGFydCkgPSAuOwotICAgICooLnNwaW5sb2NrLnRleHQubGl0ZXJhbCAuc3BpbmxvY2sudGV4dCkKKyAgICAqKC5zcGlubG9jay5saXRlcmFsIC5zcGlubG9jay50ZXh0KQogICAgIFZNTElOVVhfU1lNQk9MKF9fbG9ja190ZXh0X2VuZCkgPSAuOwogCiAgIH0KQEAgLTE2NCw3ICsxNjQsNyBAQAogICBfX2luaXRfYmVnaW4gPSAuOwogICAuaW5pdC50ZXh0IDogewogICAJX3Npbml0dGV4dCA9IC47Ci0JKiguaW5pdC50ZXh0LmxpdGVyYWwpICooLmluaXQudGV4dCkKKwkqKC5pbml0LmxpdGVyYWwpICooLmluaXQudGV4dCkKIAlfZWluaXR0ZXh0ID0gLjsKICAgfQogCmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnCmluZGV4IDkwZDYwODkuLjI1NmMwYjEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9LY29uZmlnCisrKyBiL2NyeXB0by9LY29uZmlnCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogY29uZmlnIENSWVBUT19BRVMKIAl0cmlzdGF0ZSAiQUVTIGNpcGhlciBhbGdvcml0aG1zIgotCWRlcGVuZHMgb24gQ1JZUFRPICYmICEoKFg4NiB8fCBVTUxfWDg2KSAmJiAhNjRCSVQpCisJZGVwZW5kcyBvbiBDUllQVE8gJiYgIShYODYgfHwgVU1MX1g4NikKIAloZWxwCiAJICBBRVMgY2lwaGVyIGFsZ29yaXRobXMgKEZJUFMtMTk3KS4gQUVTIHVzZXMgdGhlIFJpam5kYWVsIAogCSAgYWxnb3JpdGhtLgpAQCAtMTg0LDYgKzE4NCwyNiBAQAogCiAJICBTZWUgPGh0dHA6Ly9jc3JjLm5pc3QuZ292L2VuY3J5cHRpb24vYWVzLz4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKK2NvbmZpZyBDUllQVE9fQUVTX1g4Nl82NAorCXRyaXN0YXRlICJBRVMgY2lwaGVyIGFsZ29yaXRobXMgKHg4Nl82NCkiCisJZGVwZW5kcyBvbiBDUllQVE8gJiYgKChYODYgfHwgVU1MX1g4NikgJiYgNjRCSVQpCisJaGVscAorCSAgQUVTIGNpcGhlciBhbGdvcml0aG1zIChGSVBTLTE5NykuIEFFUyB1c2VzIHRoZSBSaWpuZGFlbCAKKwkgIGFsZ29yaXRobS4KKworCSAgUmlqbmRhZWwgYXBwZWFycyB0byBiZSBjb25zaXN0ZW50bHkgYSB2ZXJ5IGdvb2QgcGVyZm9ybWVyIGluCisJICBib3RoIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBhY3Jvc3MgYSB3aWRlIHJhbmdlIG9mIGNvbXB1dGluZyAKKwkgIGVudmlyb25tZW50cyByZWdhcmRsZXNzIG9mIGl0cyB1c2UgaW4gZmVlZGJhY2sgb3Igbm9uLWZlZWRiYWNrIAorCSAgbW9kZXMuIEl0cyBrZXkgc2V0dXAgdGltZSBpcyBleGNlbGxlbnQsIGFuZCBpdHMga2V5IGFnaWxpdHkgaXMgCisJICBnb29kLiBSaWpuZGFlbCdzIHZlcnkgbG93IG1lbW9yeSByZXF1aXJlbWVudHMgbWFrZSBpdCB2ZXJ5IHdlbGwgCisJICBzdWl0ZWQgZm9yIHJlc3RyaWN0ZWQtc3BhY2UgZW52aXJvbm1lbnRzLCBpbiB3aGljaCBpdCBhbHNvIAorCSAgZGVtb25zdHJhdGVzIGV4Y2VsbGVudCBwZXJmb3JtYW5jZS4gUmlqbmRhZWwncyBvcGVyYXRpb25zIGFyZSAKKwkgIGFtb25nIHRoZSBlYXNpZXN0IHRvIGRlZmVuZCBhZ2FpbnN0IHBvd2VyIGFuZCB0aW1pbmcgYXR0YWNrcy4JCisKKwkgIFRoZSBBRVMgc3BlY2lmaWVzIHRocmVlIGtleSBzaXplczogMTI4LCAxOTIgYW5kIDI1NiBiaXRzCSAgCisKKwkgIFNlZSA8aHR0cDovL2NzcmMubmlzdC5nb3YvZW5jcnlwdGlvbi9hZXMvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwogY29uZmlnIENSWVBUT19DQVNUNQogCXRyaXN0YXRlICJDQVNUNSAoQ0FTVC0xMjgpIGNpcGhlciBhbGdvcml0aG0iCiAJZGVwZW5kcyBvbiBDUllQVE8KZGlmZiAtLWdpdCBhL2NyeXB0by9hcGkuYyBiL2NyeXB0by9hcGkuYwppbmRleCAzOTQxNjlhLi5iNDcyODgxIDEwMDY0NAotLS0gYS9jcnlwdG8vYXBpLmMKKysrIGIvY3J5cHRvL2FwaS5jCkBAIC0xMyw5ICsxMywxMiBAQAogICogYW55IGxhdGVyIHZlcnNpb24uCiAgKgogICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMzMsNyArMzYsNyBAQAogCW1vZHVsZV9wdXQoYWxnLT5jcmFfbW9kdWxlKTsKIH0KIAotc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGNyeXB0b19hbGcgKnEsICphbGcgPSBOVUxMOwogCkBAIC01NCw2ICs1NywxMyBAQAogCXJldHVybiBhbGc7CiB9CiAKKy8qIEEgZmFyIG1vcmUgaW50ZWxsaWdlbnQgdmVyc2lvbiBvZiB0aGlzIGlzIHBsYW5uZWQuICBGb3Igbm93LCBqdXN0CisgKiB0cnkgYW4gZXhhY3QgbWF0Y2ggb24gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShjcnlwdG9fYWxnX2xvb2t1cChuYW1lKSwgbmFtZSk7Cit9CisKIHN0YXRpYyBpbnQgY3J5cHRvX2luaXRfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQogewogCXRmbS0+Y3J0X2ZsYWdzID0gMDsKQEAgLTExNywyMCArMTI3LDQ2IEBACiAJfQogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b19jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJc3dpdGNoIChhbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLKSB7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CisJCWxlbiA9IGNyeXB0b19jaXBoZXJfY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVDoKKwkJbGVuID0gY3J5cHRvX2RpZ2VzdF9jdHhzaXplKGFsZywgZmxhZ3MpOworCQlicmVhazsKKwkJCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6CisJCWxlbiA9IGNyeXB0b19jb21wcmVzc19jdHhzaXplKGFsZywgZmxhZ3MpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbGVuICsgYWxnLT5jcmFfYWxpZ25tYXNrOworfQorCiBzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7CiAJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKwl1bnNpZ25lZCBpbnQgdGZtX3NpemU7CiAKIAlhbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAobmFtZSk7CiAJaWYgKGFsZyA9PSBOVUxMKQogCQlnb3RvIG91dDsKLQkKLQl0Zm0gPSBrbWFsbG9jKHNpemVvZigqdGZtKSArIGFsZy0+Y3JhX2N0eHNpemUsIEdGUF9LRVJORUwpOworCisJdGZtX3NpemUgPSBzaXplb2YoKnRmbSkgKyBjcnlwdG9fY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwl0Zm0gPSBrbWFsbG9jKHRmbV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAodGZtID09IE5VTEwpCiAJCWdvdG8gb3V0X3B1dDsKIAotCW1lbXNldCh0Zm0sIDAsIHNpemVvZigqdGZtKSArIGFsZy0+Y3JhX2N0eHNpemUpOworCW1lbXNldCh0Zm0sIDAsIHRmbV9zaXplKTsKIAkKIAl0Zm0tPl9fY3J0X2FsZyA9IGFsZzsKIAkKQEAgLTE1NSw4ICsxOTEsMTQgQEAKIAogdm9pZCBjcnlwdG9fZnJlZV90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gdGZtLT5fX2NydF9hbGc7Ci0JaW50IHNpemUgPSBzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplOworCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisJaW50IHNpemU7CisKKwlpZiAodW5saWtlbHkoIXRmbSkpCisJCXJldHVybjsKKworCWFsZyA9IHRmbS0+X19jcnRfYWxnOworCXNpemUgPSBzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplOwogCiAJY3J5cHRvX2V4aXRfb3BzKHRmbSk7CiAJY3J5cHRvX2FsZ19wdXQoYWxnKTsKQEAgLTE2OCw2ICsyMTAsMTIgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqcTsKKworCWlmIChhbGctPmNyYV9hbGlnbm1hc2sgJiAoYWxnLT5jcmFfYWxpZ25tYXNrICsgMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFsZy0+Y3JhX2FsaWdubWFzayA+IFBBR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJCiAJZG93bl93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOwogCQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NpcGhlci5jIGIvY3J5cHRvL2NpcGhlci5jCmluZGV4IGY0MzRjZTcuLjFjOTJjNmIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jaXBoZXIuYworKysgYi9jcnlwdG8vY2lwaGVyLmMKQEAgLTQsNiArNCw3IEBACiAgKiBDaXBoZXIgb3BlcmF0aW9ucy4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpAQCAtMjIsMTAgKzIzLDYgQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInNjYXR0ZXJ3YWxrLmgiCiAKLXR5cGVkZWYgdm9pZCAoY3J5cHRmbl90KSh2b2lkICosIHU4ICosIGNvbnN0IHU4ICopOwotdHlwZWRlZiB2b2lkIChwcm9jZm5fdCkoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHU4KiwgY3J5cHRmbl90LCB2b2lkICopOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgeG9yXzY0KHU4ICphLCBjb25zdCB1OCAqYikKIHsKIAkoKHUzMiAqKWEpWzBdIF49ICgodTMyICopYilbMF07CkBAIC0zOSw2MyArMzYsNzAgQEAKIAkoKHUzMiAqKWEpWzJdIF49ICgodTMyICopYilbMl07CiAJKCh1MzIgKilhKVszXSBePSAoKHUzMiAqKWIpWzNdOwogfQotIAotc3RhdGljIGlubGluZSB2b2lkICpwcmVwYXJlX3NyYyhzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgYnNpemUsCi0JCQkJdm9pZCAqdG1wLCBpbnQgaW5fcGxhY2UpCi17Ci0Jdm9pZCAqc3JjID0gd2Fsay0+ZGF0YTsKLQlpbnQgbiA9IGJzaXplOwogCi0JaWYgKHVubGlrZWx5KHNjYXR0ZXJ3YWxrX2Fjcm9zc19wYWdlcyh3YWxrLCBic2l6ZSkpKSB7CitzdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0X3Nsb3coY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJICAgICAgIHN0cnVjdCBzY2F0dGVyX3dhbGsgKmluLAorCQkJICAgICAgIHN0cnVjdCBzY2F0dGVyX3dhbGsgKm91dCwgdW5zaWduZWQgaW50IGJzaXplKQoreworCXVuc2lnbmVkIGludCBhbGlnbm1hc2sgPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2soZGVzYy0+dGZtKTsKKwl1OCBidWZmZXJbYnNpemUgKiAyICsgYWxpZ25tYXNrXTsKKwl1OCAqc3JjID0gKHU4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCBhbGlnbm1hc2sgKyAxKTsKKwl1OCAqZHN0ID0gc3JjICsgYnNpemU7CisJdW5zaWduZWQgaW50IG47CisKKwluID0gc2NhdHRlcndhbGtfY29weWNodW5rcyhzcmMsIGluLCBic2l6ZSwgMCk7CisJc2NhdHRlcndhbGtfYWR2YW5jZShpbiwgbik7CisKKwlkZXNjLT5wcmZuKGRlc2MsIGRzdCwgc3JjLCBic2l6ZSk7CisKKwluID0gc2NhdHRlcndhbGtfY29weWNodW5rcyhkc3QsIG91dCwgYnNpemUsIDEpOworCXNjYXR0ZXJ3YWxrX2FkdmFuY2Uob3V0LCBuKTsKKworCXJldHVybiBic2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRfZmFzdChjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqaW4sCisJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqb3V0LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICp0bXApCit7CisJdTggKnNyYywgKmRzdDsKKworCXNyYyA9IGluLT5kYXRhOworCWRzdCA9IHNjYXR0ZXJ3YWxrX3NhbWVidWYoaW4sIG91dCkgPyBzcmMgOiBvdXQtPmRhdGE7CisKKwlpZiAodG1wKSB7CisJCW1lbWNweSh0bXAsIGluLT5kYXRhLCBuYnl0ZXMpOwogCQlzcmMgPSB0bXA7Ci0JCW4gPSBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHNyYywgd2FsaywgYnNpemUsIDApOwotCX0KLQlzY2F0dGVyd2Fsa19hZHZhbmNlKHdhbGssIG4pOwotCXJldHVybiBzcmM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqcHJlcGFyZV9kc3Qoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IGJzaXplLAotCQkJCXZvaWQgKnRtcCwgaW50IGluX3BsYWNlKQotewotCXZvaWQgKmRzdCA9IHdhbGstPmRhdGE7Ci0KLQlpZiAodW5saWtlbHkoc2NhdHRlcndhbGtfYWNyb3NzX3BhZ2VzKHdhbGssIGJzaXplKSkgfHwgaW5fcGxhY2UpCiAJCWRzdCA9IHRtcDsKLQlyZXR1cm4gZHN0OwotfQorCX0KIAotc3RhdGljIGlubGluZSB2b2lkIGNvbXBsZXRlX3NyYyhzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgYnNpemUsCi0JCQkJdm9pZCAqc3JjLCBpbnQgaW5fcGxhY2UpCi17Ci19CisJbmJ5dGVzID0gZGVzYy0+cHJmbihkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGNvbXBsZXRlX2RzdChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgYnNpemUsCi0JCQkJdm9pZCAqZHN0LCBpbnQgaW5fcGxhY2UpCi17Ci0JaW50IG4gPSBic2l6ZTsKKwlpZiAodG1wKQorCQltZW1jcHkob3V0LT5kYXRhLCB0bXAsIG5ieXRlcyk7CiAKLQlpZiAodW5saWtlbHkoc2NhdHRlcndhbGtfYWNyb3NzX3BhZ2VzKHdhbGssIGJzaXplKSkpCi0JCW4gPSBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKGRzdCwgd2FsaywgYnNpemUsIDEpOwotCWVsc2UgaWYgKGluX3BsYWNlKQotCQltZW1jcHkod2Fsay0+ZGF0YSwgZHN0LCBic2l6ZSk7Ci0Jc2NhdHRlcndhbGtfYWR2YW5jZSh3YWxrLCBuKTsKKwlzY2F0dGVyd2Fsa19hZHZhbmNlKGluLCBuYnl0ZXMpOworCXNjYXR0ZXJ3YWxrX2FkdmFuY2Uob3V0LCBuYnl0ZXMpOworCisJcmV0dXJuIG5ieXRlczsKIH0KIAogLyogCiAgKiBHZW5lcmljIGVuY3J5cHQvZGVjcnlwdCB3cmFwcGVyIGZvciBjaXBoZXJzLCBoYW5kbGVzIG9wZXJhdGlvbnMgYWNyb3NzCiAgKiBtdWx0aXBsZSBwYWdlIGJvdW5kYXJpZXMgYnkgdXNpbmcgdGVtcG9yYXJ5IGJsb2Nrcy4gIEluIHVzZXIgY29udGV4dCwKLSAqIHRoZSBrZXJuZWwgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gc2NoZWR1bGUgdXMgb25jZSBwZXIgYmxvY2suCisgKiB0aGUga2VybmVsIGlzIGdpdmVuIGEgY2hhbmNlIHRvIHNjaGVkdWxlIHVzIG9uY2UgcGVyIHBhZ2UuCiAgKi8KLXN0YXRpYyBpbnQgY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKK3N0YXRpYyBpbnQgY3J5cHQoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAogCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgY3J5cHRmbl90IGNyZm4sCi0gICAgICAgICAgICAgICAgIHByb2Nmbl90IHByZm4sIHZvaWQgKmluZm8pCisJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXN0cnVjdCBzY2F0dGVyX3dhbGsgd2Fsa19pbiwgd2Fsa19vdXQ7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGRlc2MtPnRmbTsKIAljb25zdCB1bnNpZ25lZCBpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKLQl1OCB0bXBfc3JjW2JzaXplXTsKLQl1OCB0bXBfZHN0W2JzaXplXTsKKwl1bnNpZ25lZCBpbnQgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHRmbSk7CisJdW5zaWduZWQgbG9uZyBidWZmZXIgPSAwOwogCiAJaWYgKCFuYnl0ZXMpCiAJCXJldHVybiAwOwpAQCAtMTA5LDY0ICsxMTMsMTQ0IEBACiAJc2NhdHRlcndhbGtfc3RhcnQoJndhbGtfb3V0LCBkc3QpOwogCiAJZm9yKDs7KSB7Ci0JCXU4ICpzcmNfcCwgKmRzdF9wOwotCQlpbnQgaW5fcGxhY2U7CisJCXVuc2lnbmVkIGludCBuID0gbmJ5dGVzOworCQl1OCAqdG1wID0gTlVMTDsKKworCQlpZiAoIXNjYXR0ZXJ3YWxrX2FsaWduZWQoJndhbGtfaW4sIGFsaWdubWFzaykgfHwKKwkJICAgICFzY2F0dGVyd2Fsa19hbGlnbmVkKCZ3YWxrX291dCwgYWxpZ25tYXNrKSkgeworCQkJaWYgKCFidWZmZXIpIHsKKwkJCQlidWZmZXIgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQyk7CisJCQkJaWYgKCFidWZmZXIpCisJCQkJCW4gPSAwOworCQkJfQorCQkJdG1wID0gKHU4ICopYnVmZmVyOworCQl9CiAKIAkJc2NhdHRlcndhbGtfbWFwKCZ3YWxrX2luLCAwKTsKIAkJc2NhdHRlcndhbGtfbWFwKCZ3YWxrX291dCwgMSk7CiAKLQkJaW5fcGxhY2UgPSBzY2F0dGVyd2Fsa19zYW1lYnVmKCZ3YWxrX2luLCAmd2Fsa19vdXQpOworCQluID0gc2NhdHRlcndhbGtfY2xhbXAoJndhbGtfaW4sIG4pOworCQluID0gc2NhdHRlcndhbGtfY2xhbXAoJndhbGtfb3V0LCBuKTsKIAotCQlkbyB7Ci0JCQlzcmNfcCA9IHByZXBhcmVfc3JjKCZ3YWxrX2luLCBic2l6ZSwgdG1wX3NyYywKLQkJCQkJICAgIGluX3BsYWNlKTsKLQkJCWRzdF9wID0gcHJlcGFyZV9kc3QoJndhbGtfb3V0LCBic2l6ZSwgdG1wX2RzdCwKLQkJCQkJICAgIGluX3BsYWNlKTsKKwkJaWYgKGxpa2VseShuID49IGJzaXplKSkKKwkJCW4gPSBjcnlwdF9mYXN0KGRlc2MsICZ3YWxrX2luLCAmd2Fsa19vdXQsIG4sIHRtcCk7CisJCWVsc2UKKwkJCW4gPSBjcnlwdF9zbG93KGRlc2MsICZ3YWxrX2luLCAmd2Fsa19vdXQsIGJzaXplKTsKIAotCQkJcHJmbih0Zm0sIGRzdF9wLCBzcmNfcCwgY3JmbiwgaW5mbyk7Ci0KLQkJCWNvbXBsZXRlX3NyYygmd2Fsa19pbiwgYnNpemUsIHNyY19wLCBpbl9wbGFjZSk7Ci0JCQljb21wbGV0ZV9kc3QoJndhbGtfb3V0LCBic2l6ZSwgZHN0X3AsIGluX3BsYWNlKTsKLQotCQkJbmJ5dGVzIC09IGJzaXplOwotCQl9IHdoaWxlIChuYnl0ZXMgJiYKLQkJCSAhc2NhdHRlcndhbGtfYWNyb3NzX3BhZ2VzKCZ3YWxrX2luLCBic2l6ZSkgJiYKLQkJCSAhc2NhdHRlcndhbGtfYWNyb3NzX3BhZ2VzKCZ3YWxrX291dCwgYnNpemUpKTsKKwkJbmJ5dGVzIC09IG47CiAKIAkJc2NhdHRlcndhbGtfZG9uZSgmd2Fsa19pbiwgMCwgbmJ5dGVzKTsKIAkJc2NhdHRlcndhbGtfZG9uZSgmd2Fsa19vdXQsIDEsIG5ieXRlcyk7CiAKIAkJaWYgKCFuYnl0ZXMpCi0JCQlyZXR1cm4gMDsKKwkJCWJyZWFrOwogCiAJCWNyeXB0b195aWVsZCh0Zm0pOwogCX0KKworCWlmIChidWZmZXIpCisJCWZyZWVfcGFnZShidWZmZXIpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNiY19wcm9jZXNzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgdTggKnNyYywKLQkJCQljcnlwdGZuX3QgZm4sIHZvaWQgKmluZm8pCitzdGF0aWMgaW50IGNyeXB0X2l2X3VuYWxpZ25lZChzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQl1OCAqaXYgPSBpbmZvOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CisJdW5zaWduZWQgaW50IGFsaWdubWFzayA9IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayh0Zm0pOworCXU4ICppdiA9IGRlc2MtPmluZm87CiAKLQl0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrKGl2LCBzcmMpOwotCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgaXYpOwotCW1lbWNweShpdiwgZHN0LCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJaWYgKHVubGlrZWx5KCgodW5zaWduZWQgbG9uZylpdiAmIGFsaWdubWFzaykpKSB7CisJCXVuc2lnbmVkIGludCBpdnNpemUgPSB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2c2l6ZTsKKwkJdTggYnVmZmVyW2l2c2l6ZSArIGFsaWdubWFza107CisJCXU4ICp0bXAgPSAodTggKilBTElHTigodW5zaWduZWQgbG9uZylidWZmZXIsIGFsaWdubWFzayArIDEpOworCQlpbnQgZXJyOworCisJCWRlc2MtPmluZm8gPSBtZW1jcHkodG1wLCBpdiwgaXZzaXplKTsKKwkJZXJyID0gY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CisJCW1lbWNweShpdiwgdG1wLCBpdnNpemUpOworCisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIGNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCi1zdGF0aWMgdm9pZCBjYmNfcHJvY2Vzc19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIHU4ICpzcmMsCi0JCQkJY3J5cHRmbl90IGZuLCB2b2lkICppbmZvKQorc3RhdGljIHVuc2lnbmVkIGludCBjYmNfcHJvY2Vzc19lbmNyeXB0KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKKwkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQl1OCAqaXYgPSBpbmZvOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CisJdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKikgPSB0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrOworCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwogCi0JZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOwotCXRmbS0+Y3J0X3UuY2lwaGVyLmNpdF94b3JfYmxvY2soZHN0LCBpdik7Ci0JbWVtY3B5KGl2LCBzcmMsIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKKwl2b2lkICgqZm4pKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOworCXU4ICppdiA9IGRlc2MtPmluZm87CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJZG8geworCQl4b3IoaXYsIHNyYyk7CisJCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgaXYpOworCQltZW1jcHkoaXYsIGRzdCwgYnNpemUpOworCisJCXNyYyArPSBic2l6ZTsKKwkJZHN0ICs9IGJzaXplOworCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8IG5ieXRlcyk7CisKKwlyZXR1cm4gZG9uZTsKIH0KIAotc3RhdGljIHZvaWQgZWNiX3Byb2Nlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgdTggKnNyYywKLQkJCWNyeXB0Zm5fdCBmbiwgdm9pZCAqaW5mbykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2JjX3Byb2Nlc3NfZGVjcnlwdChjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CisJdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKikgPSB0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrOworCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOworCisJdTggc3RhY2tbc3JjID09IGRzdCA/IGJzaXplIDogMF07CisJdTggKmJ1ZiA9IHN0YWNrOworCXU4ICoqZHN0X3AgPSBzcmMgPT0gZHN0ID8gJmJ1ZiA6ICZkc3Q7CisKKwl2b2lkICgqZm4pKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOworCXU4ICppdiA9IGRlc2MtPmluZm87CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJZG8geworCQl1OCAqdG1wX2RzdCA9ICpkc3RfcDsKKworCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCB0bXBfZHN0LCBzcmMpOworCQl4b3IodG1wX2RzdCwgaXYpOworCQltZW1jcHkoaXYsIHNyYywgYnNpemUpOworCQlpZiAodG1wX2RzdCAhPSBkc3QpCisJCQltZW1jcHkoZHN0LCB0bXBfZHN0LCBic2l6ZSk7CisKKwkJc3JjICs9IGJzaXplOworCQlkc3QgKz0gYnNpemU7CisJfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDwgbmJ5dGVzKTsKKworCXJldHVybiBkb25lOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGVjYl9wcm9jZXNzKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKmRzdCwKKwkJCQljb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CisJaW50IGJzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7CisJdm9pZCAoKmZuKSh2b2lkICosIHU4ICosIGNvbnN0IHU4ICopID0gZGVzYy0+Y3JmbjsKKwl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7CisKKwlkbyB7CisJCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgc3JjKTsKKworCQlzcmMgKz0gYnNpemU7CisJCWRzdCArPSBic2l6ZTsKKwl9IHdoaWxlICgoZG9uZSArPSBic2l6ZSkgPCBuYnl0ZXMpOworCisJcmV0dXJuIGRvbmU7CiB9CiAKIHN0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCkBAIC0xODUsOSArMjY5LDE0IEBACiAJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkgICAgICAgICAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQsCi0JICAgICAgICAgICAgIGVjYl9wcm9jZXNzLCBOVUxMKTsKKwlzdHJ1Y3QgY2lwaGVyX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgY2lwaGVyX2FsZyAqY2lwaGVyID0gJnRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOworCisJZGVzYy50Zm0gPSB0Zm07CisJZGVzYy5jcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdDsKKwlkZXNjLnByZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0X2VjYiA/OiBlY2JfcHJvY2VzczsKKworCXJldHVybiBjcnlwdCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiB9CiAKIHN0YXRpYyBpbnQgZWNiX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKQEAgLTE5NSw5ICsyODQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JICAgICAgICAgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAotCSAgICAgICAgICAgICBlY2JfcHJvY2VzcywgTlVMTCk7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdF9lY2IgPzogZWNiX3Byb2Nlc3M7CisKKwlyZXR1cm4gY3J5cHQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IGNiY19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCkBAIC0yMDUsOSArMjk5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCSAgICAgICAgICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKLQkgICAgICAgICAgICAgY2JjX3Byb2Nlc3NfZW5jcnlwdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZW5jcnlwdDsKKwlkZXNjLmluZm8gPSB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2OworCisJcmV0dXJuIGNyeXB0KCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAogc3RhdGljIGludCBjYmNfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLApAQCAtMjE1LDkgKzMxNSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQogewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JICAgICAgICAgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0LAotCSAgICAgICAgICAgICBjYmNfcHJvY2Vzc19lbmNyeXB0LCBpdik7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZW5jcnlwdDsKKwlkZXNjLmluZm8gPSBpdjsKKworCXJldHVybiBjcnlwdF9pdl91bmFsaWduZWQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IGNiY19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCkBAIC0yMjUsOSArMzMxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCSAgICAgICAgICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZGVjcnlwdCwKLQkgICAgICAgICAgICAgY2JjX3Byb2Nlc3NfZGVjcnlwdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZGVjcnlwdDsKKwlkZXNjLmluZm8gPSB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2OworCisJcmV0dXJuIGNyeXB0KCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAogc3RhdGljIGludCBjYmNfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLApAQCAtMjM1LDkgKzM0NywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQogewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JICAgICAgICAgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAotCSAgICAgICAgICAgICBjYmNfcHJvY2Vzc19kZWNyeXB0LCBpdik7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZGVjcnlwdDsKKwlkZXNjLmluZm8gPSBpdjsKKworCXJldHVybiBjcnlwdF9pdl91bmFsaWduZWQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IG5vY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKQEAgLTMwNiw2ICs0MjQsOCBAQAogCX0KIAkKIAlpZiAob3BzLT5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfQ0JDKSB7CisJCXVuc2lnbmVkIGludCBhbGlnbjsKKwkJdW5zaWduZWQgbG9uZyBhZGRyOwogCSAgICAJCiAJICAgIAlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKSB7CiAJICAgIAljYXNlIDg6CkBAIC0zMjUsOSArNDQ1LDExIEBACiAJICAgIAl9CiAJICAgIAkKIAkJb3BzLT5jaXRfaXZzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7Ci0JICAgIAlvcHMtPmNpdF9pdiA9IGttYWxsb2Mob3BzLT5jaXRfaXZzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKG9wcy0+Y2l0X2l2ID09IE5VTEwpCi0JCQlyZXQgPSAtRU5PTUVNOworCQlhbGlnbiA9IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayh0Zm0pICsgMTsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWNyeXB0b190Zm1fY3R4KHRmbSk7CisJCWFkZHIgPSBBTElHTihhZGRyLCBhbGlnbik7CisJCWFkZHIgKz0gQUxJR04odGZtLT5fX2NydF9hbGctPmNyYV9jdHhzaXplLCBhbGlnbik7CisJCW9wcy0+Y2l0X2l2ID0gKHZvaWQgKilhZGRyOwogCX0KIAogb3V0OgkKQEAgLTMzNiw2ICs0NTgsNCBAQAogCiB2b2lkIGNyeXB0b19leGl0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlpZiAodGZtLT5jcnRfY2lwaGVyLmNpdF9pdikKLQkJa2ZyZWUodGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7CiB9CmRpZmYgLS1naXQgYS9jcnlwdG8vZGVzLmMgYi9jcnlwdG8vZGVzLmMKaW5kZXggMWM3ZTZkZS4uYTNjODYzZCAxMDA2NDQKLS0tIGEvY3J5cHRvL2Rlcy5jCisrKyBiL2NyeXB0by9kZXMuYwpAQCAtMSwxOCArMSw5IEBACi0vKiAKKy8qCiAgKiBDcnlwdG9ncmFwaGljIEFQSS4KICAqCiAgKiBERVMgJiBUcmlwbGUgREVTIEVERSBDaXBoZXIgQWxnb3JpdGhtcy4KICAqCi0gKiBPcmlnaW5hbGx5IHJlbGVhc2VkIGFzIGRlc2NvcmUgYnkgRGFuYSBMLiBIb3cgPGhvd0Bpc2wuc3RhbmZvcmQuZWR1Pi4KLSAqIE1vZGlmaWVkIGJ5IFJhaW1hciBGYWxrZSA8cmYxM0BpbmYudHUtZHJlc2Rlbi5kZT4gZm9yIHRoZSBMaW51eC1LZXJuZWwuCi0gKiBEZXJpdmVkIGZyb20gQ3J5cHRvYXBpIGFuZCBOZXR0bGUgaW1wbGVtZW50YXRpb25zLCBhZGFwdGVkIGZvciBpbi1wbGFjZQotICogc2NhdHRlcmxpc3QgaW50ZXJmYWNlLiAgQ2hhbmdlZCBMR1BMIHRvIEdQTCBwZXIgc2VjdGlvbiAzIG9mIHRoZSBMR1BMLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5MiBEYW5hIEwuIEhvdy4KLSAqIENvcHlyaWdodCAoYykgUmFpbWFyIEZhbGtlIDxyZjEzQGluZi50dS1kcmVzZGVuLmRlPiAKLSAqIENvcHlyaWdodCAoYykgR2lzbGUgU+ZsZW5zbWluZGUgPGdpc2xlQGlpLnVpYi5ubz4KLSAqIENvcHlyaWdodCAoQykgMjAwMSBOaWVscyBN9mxsZXIuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGFnIEFybmUgT3N2aWsgPGRhQG9zdmlrLm5vPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjAsMTEgKzExLDExIEBACiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKICAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KIAogI2RlZmluZSBERVNfS0VZX1NJWkUJCTgKQEAgLTM1LDExNTcgKzI2LDgyNiBAQAogI2RlZmluZSBERVMzX0VERV9FWFBLRVlfV09SRFMJKDMgKiBERVNfRVhQS0VZX1dPUkRTKQogI2RlZmluZSBERVMzX0VERV9CTE9DS19TSVpFCURFU19CTE9DS19TSVpFCiAKLSNkZWZpbmUgUk9SKGQsYyxvKQkoKGQpID0gKGQpID4+IChjKSB8IChkKSA8PCAobykpCisjZGVmaW5lIFJPTCh4LCByKSAoKHgpID0gcm9sMzIoKHgpLCAocikpKQorI2RlZmluZSBST1IoeCwgcikgKCh4KSA9IHJvcjMyKCh4KSwgKHIpKSkKIAogc3RydWN0IGRlc19jdHggewotCXU4IGl2W0RFU19CTE9DS19TSVpFXTsKIAl1MzIgZXhwa2V5W0RFU19FWFBLRVlfV09SRFNdOwogfTsKIAogc3RydWN0IGRlczNfZWRlX2N0eCB7Ci0JdTggaXZbREVTX0JMT0NLX1NJWkVdOwogCXUzMiBleHBrZXlbREVTM19FREVfRVhQS0VZX1dPUkRTXTsKIH07CiAKLXN0YXRpYyBjb25zdCB1MzIgZGVzX2tleW1hcFtdID0gewotCTB4MDIwODAwMDgsIDB4MDIwODIwMDAsIDB4MDAwMDIwMDgsIDB4MDAwMDAwMDAsCi0JMHgwMjAwMjAwMCwgMHgwMDA4MDAwOCwgMHgwMjA4MDAwMCwgMHgwMjA4MjAwOCwKLQkweDAwMDAwMDA4LCAweDAyMDAwMDAwLCAweDAwMDgyMDAwLCAweDAwMDAyMDA4LAotCTB4MDAwODIwMDgsIDB4MDIwMDIwMDgsIDB4MDIwMDAwMDgsIDB4MDIwODAwMDAsCi0JMHgwMDAwMjAwMCwgMHgwMDA4MjAwOCwgMHgwMDA4MDAwOCwgMHgwMjAwMjAwMCwKLQkweDAyMDgyMDA4LCAweDAyMDAwMDA4LCAweDAwMDAwMDAwLCAweDAwMDgyMDAwLAotCTB4MDIwMDAwMDAsIDB4MDAwODAwMDAsIDB4MDIwMDIwMDgsIDB4MDIwODAwMDgsCi0JMHgwMDA4MDAwMCwgMHgwMDAwMjAwMCwgMHgwMjA4MjAwMCwgMHgwMDAwMDAwOCwKLQkweDAwMDgwMDAwLCAweDAwMDAyMDAwLCAweDAyMDAwMDA4LCAweDAyMDgyMDA4LAotCTB4MDAwMDIwMDgsIDB4MDIwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwODIwMDAsCi0JMHgwMjA4MDAwOCwgMHgwMjAwMjAwOCwgMHgwMjAwMjAwMCwgMHgwMDA4MDAwOCwKLQkweDAyMDgyMDAwLCAweDAwMDAwMDA4LCAweDAwMDgwMDA4LCAweDAyMDAyMDAwLAotCTB4MDIwODIwMDgsIDB4MDAwODAwMDAsIDB4MDIwODAwMDAsIDB4MDIwMDAwMDgsCi0JMHgwMDA4MjAwMCwgMHgwMDAwMjAwOCwgMHgwMjAwMjAwOCwgMHgwMjA4MDAwMCwKLQkweDAwMDAwMDA4LCAweDAyMDgyMDAwLCAweDAwMDgyMDA4LCAweDAwMDAwMDAwLAotCTB4MDIwMDAwMDAsIDB4MDIwODAwMDgsIDB4MDAwMDIwMDAsIDB4MDAwODIwMDgsCisvKiBMb29rdXAgdGFibGVzIGZvciBrZXkgZXhwYW5zaW9uICovCiAKLQkweDA4MDAwMDA0LCAweDAwMDIwMDA0LCAweDAwMDAwMDAwLCAweDA4MDIwMjAwLAotCTB4MDAwMjAwMDQsIDB4MDAwMDAyMDAsIDB4MDgwMDAyMDQsIDB4MDAwMjAwMDAsCi0JMHgwMDAwMDIwNCwgMHgwODAyMDIwNCwgMHgwMDAyMDIwMCwgMHgwODAwMDAwMCwKLQkweDA4MDAwMjAwLCAweDA4MDAwMDA0LCAweDA4MDIwMDAwLCAweDAwMDIwMjA0LAotCTB4MDAwMjAwMDAsIDB4MDgwMDAyMDQsIDB4MDgwMjAwMDQsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDIwMCwgMHgwMDAwMDAwNCwgMHgwODAyMDIwMCwgMHgwODAyMDAwNCwKLQkweDA4MDIwMjA0LCAweDA4MDIwMDAwLCAweDA4MDAwMDAwLCAweDAwMDAwMjA0LAotCTB4MDAwMDAwMDQsIDB4MDAwMjAyMDAsIDB4MDAwMjAyMDQsIDB4MDgwMDAyMDAsCi0JMHgwMDAwMDIwNCwgMHgwODAwMDAwMCwgMHgwODAwMDIwMCwgMHgwMDAyMDIwNCwKLQkweDA4MDIwMjAwLCAweDAwMDIwMDA0LCAweDAwMDAwMDAwLCAweDA4MDAwMjAwLAotCTB4MDgwMDAwMDAsIDB4MDAwMDAyMDAsIDB4MDgwMjAwMDQsIDB4MDAwMjAwMDAsCi0JMHgwMDAyMDAwNCwgMHgwODAyMDIwNCwgMHgwMDAyMDIwMCwgMHgwMDAwMDAwNCwKLQkweDA4MDIwMjA0LCAweDAwMDIwMjAwLCAweDAwMDIwMDAwLCAweDA4MDAwMjA0LAotCTB4MDgwMDAwMDQsIDB4MDgwMjAwMDAsIDB4MDAwMjAyMDQsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDIwMCwgMHgwODAwMDAwNCwgMHgwODAwMDIwNCwgMHgwODAyMDIwMCwKLQkweDA4MDIwMDAwLCAweDAwMDAwMjA0LCAweDAwMDAwMDA0LCAweDA4MDIwMDA0LAotCi0JMHg4MDA0MDEwMCwgMHgwMTAwMDEwMCwgMHg4MDAwMDAwMCwgMHg4MTA0MDEwMCwKLQkweDAwMDAwMDAwLCAweDAxMDQwMDAwLCAweDgxMDAwMTAwLCAweDgwMDQwMDAwLAotCTB4MDEwNDAxMDAsIDB4ODEwMDAwMDAsIDB4MDEwMDAwMDAsIDB4ODAwMDAxMDAsCi0JMHg4MTAwMDAwMCwgMHg4MDA0MDEwMCwgMHgwMDA0MDAwMCwgMHgwMTAwMDAwMCwKLQkweDgxMDQwMDAwLCAweDAwMDQwMTAwLCAweDAwMDAwMTAwLCAweDgwMDAwMDAwLAotCTB4MDAwNDAxMDAsIDB4ODEwMDAxMDAsIDB4MDEwNDAwMDAsIDB4MDAwMDAxMDAsCi0JMHg4MDAwMDEwMCwgMHgwMDAwMDAwMCwgMHg4MDA0MDAwMCwgMHgwMTA0MDEwMCwKLQkweDAxMDAwMTAwLCAweDgxMDQwMDAwLCAweDgxMDQwMTAwLCAweDAwMDQwMDAwLAotCTB4ODEwNDAwMDAsIDB4ODAwMDAxMDAsIDB4MDAwNDAwMDAsIDB4ODEwMDAwMDAsCi0JMHgwMDA0MDEwMCwgMHgwMTAwMDEwMCwgMHg4MDAwMDAwMCwgMHgwMTA0MDAwMCwKLQkweDgxMDAwMTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMTAwLCAweDgwMDQwMDAwLAotCTB4MDAwMDAwMDAsIDB4ODEwNDAwMDAsIDB4MDEwNDAxMDAsIDB4MDAwMDAxMDAsCi0JMHgwMTAwMDAwMCwgMHg4MTA0MDEwMCwgMHg4MDA0MDEwMCwgMHgwMDA0MDAwMCwKLQkweDgxMDQwMTAwLCAweDgwMDAwMDAwLCAweDAxMDAwMTAwLCAweDgwMDQwMTAwLAotCTB4ODAwNDAwMDAsIDB4MDAwNDAxMDAsIDB4MDEwNDAwMDAsIDB4ODEwMDAxMDAsCi0JMHg4MDAwMDEwMCwgMHgwMTAwMDAwMCwgMHg4MTAwMDAwMCwgMHgwMTA0MDEwMCwKLQotCTB4MDQwMTA4MDEsIDB4MDAwMDAwMDAsIDB4MDAwMTA4MDAsIDB4MDQwMTAwMDAsCi0JMHgwNDAwMDAwMSwgMHgwMDAwMDgwMSwgMHgwNDAwMDgwMCwgMHgwMDAxMDgwMCwKLQkweDAwMDAwODAwLCAweDA0MDEwMDAxLCAweDAwMDAwMDAxLCAweDA0MDAwODAwLAotCTB4MDAwMTAwMDEsIDB4MDQwMTA4MDAsIDB4MDQwMTAwMDAsIDB4MDAwMDAwMDEsCi0JMHgwMDAxMDAwMCwgMHgwNDAwMDgwMSwgMHgwNDAxMDAwMSwgMHgwMDAwMDgwMCwKLQkweDAwMDEwODAxLCAweDA0MDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMDAxLAotCTB4MDQwMDA4MDEsIDB4MDAwMTA4MDEsIDB4MDQwMTA4MDAsIDB4MDQwMDAwMDEsCi0JMHgwNDAwMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDAwMDgwMSwgMHgwNDAxMDgwMSwKLQkweDAwMDEwMDAxLCAweDA0MDEwODAwLCAweDA0MDAwODAwLCAweDAwMDEwODAxLAotCTB4MDQwMTA4MDEsIDB4MDAwMTAwMDEsIDB4MDQwMDAwMDEsIDB4MDAwMDAwMDAsCi0JMHgwNDAwMDAwMCwgMHgwMDAwMDgwMSwgMHgwMDAxMDAwMCwgMHgwNDAxMDAwMSwKLQkweDAwMDAwODAwLCAweDA0MDAwMDAwLCAweDAwMDEwODAxLCAweDA0MDAwODAxLAotCTB4MDQwMTA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDAwMDAsIDB4MDQwMDAwMDEsCi0JMHgwMDAwMDAwMSwgMHgwNDAxMDgwMSwgMHgwMDAxMDgwMCwgMHgwNDAxMDAwMCwKLQkweDA0MDEwMDAxLCAweDAwMDEwMDAwLCAweDAwMDAwODAxLCAweDA0MDAwODAwLAotCTB4MDQwMDA4MDEsIDB4MDAwMDAwMDEsIDB4MDQwMTAwMDAsIDB4MDAwMTA4MDAsCi0KLQkweDAwMDAwNDAwLCAweDAwMDAwMDIwLCAweDAwMTAwMDIwLCAweDQwMTAwMDAwLAotCTB4NDAxMDA0MjAsIDB4NDAwMDA0MDAsIDB4MDAwMDA0MjAsIDB4MDAwMDAwMDAsCi0JMHgwMDEwMDAwMCwgMHg0MDEwMDAyMCwgMHg0MDAwMDAyMCwgMHgwMDEwMDQwMCwKLQkweDQwMDAwMDAwLCAweDAwMTAwNDIwLCAweDAwMTAwNDAwLCAweDQwMDAwMDIwLAotCTB4NDAxMDAwMjAsIDB4MDAwMDA0MDAsIDB4NDAwMDA0MDAsIDB4NDAxMDA0MjAsCi0JMHgwMDAwMDAwMCwgMHgwMDEwMDAyMCwgMHg0MDEwMDAwMCwgMHgwMDAwMDQyMCwKLQkweDQwMTAwNDAwLCAweDQwMDAwNDIwLCAweDAwMTAwNDIwLCAweDQwMDAwMDAwLAotCTB4NDAwMDA0MjAsIDB4NDAxMDA0MDAsIDB4MDAwMDAwMjAsIDB4MDAxMDAwMDAsCi0JMHg0MDAwMDQyMCwgMHgwMDEwMDQwMCwgMHg0MDEwMDQwMCwgMHg0MDAwMDAyMCwKLQkweDAwMDAwNDAwLCAweDAwMDAwMDIwLCAweDAwMTAwMDAwLCAweDQwMTAwNDAwLAotCTB4NDAxMDAwMjAsIDB4NDAwMDA0MjAsIDB4MDAwMDA0MjAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAyMCwgMHg0MDEwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDEwMDAyMCwKLQkweDAwMDAwMDAwLCAweDQwMTAwMDIwLCAweDAwMTAwMDIwLCAweDAwMDAwNDIwLAotCTB4NDAwMDAwMjAsIDB4MDAwMDA0MDAsIDB4NDAxMDA0MjAsIDB4MDAxMDAwMDAsCi0JMHgwMDEwMDQyMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDQwMCwgMHg0MDEwMDQyMCwKLQkweDQwMTAwMDAwLCAweDAwMTAwNDIwLCAweDAwMTAwNDAwLCAweDQwMDAwNDAwLAotCi0JMHgwMDgwMDAwMCwgMHgwMDAwMTAwMCwgMHgwMDAwMDA0MCwgMHgwMDgwMTA0MiwKLQkweDAwODAxMDAyLCAweDAwODAwMDQwLCAweDAwMDAxMDQyLCAweDAwODAxMDAwLAotCTB4MDAwMDEwMDAsIDB4MDAwMDAwMDIsIDB4MDA4MDAwMDIsIDB4MDAwMDEwNDAsCi0JMHgwMDgwMDA0MiwgMHgwMDgwMTAwMiwgMHgwMDgwMTA0MCwgMHgwMDAwMDAwMCwKLQkweDAwMDAxMDQwLCAweDAwODAwMDAwLCAweDAwMDAxMDAyLCAweDAwMDAwMDQyLAotCTB4MDA4MDAwNDAsIDB4MDAwMDEwNDIsIDB4MDAwMDAwMDAsIDB4MDA4MDAwMDIsCi0JMHgwMDAwMDAwMiwgMHgwMDgwMDA0MiwgMHgwMDgwMTA0MiwgMHgwMDAwMTAwMiwKLQkweDAwODAxMDAwLCAweDAwMDAwMDQwLCAweDAwMDAwMDQyLCAweDAwODAxMDQwLAotCTB4MDA4MDEwNDAsIDB4MDA4MDAwNDIsIDB4MDAwMDEwMDIsIDB4MDA4MDEwMDAsCi0JMHgwMDAwMTAwMCwgMHgwMDAwMDAwMiwgMHgwMDgwMDAwMiwgMHgwMDgwMDA0MCwKLQkweDAwODAwMDAwLCAweDAwMDAxMDQwLCAweDAwODAxMDQyLCAweDAwMDAwMDAwLAotCTB4MDAwMDEwNDIsIDB4MDA4MDAwMDAsIDB4MDAwMDAwNDAsIDB4MDAwMDEwMDIsCi0JMHgwMDgwMDA0MiwgMHgwMDAwMDA0MCwgMHgwMDAwMDAwMCwgMHgwMDgwMTA0MiwKLQkweDAwODAxMDAyLCAweDAwODAxMDQwLCAweDAwMDAwMDQyLCAweDAwMDAxMDAwLAotCTB4MDAwMDEwNDAsIDB4MDA4MDEwMDIsIDB4MDA4MDAwNDAsIDB4MDAwMDAwNDIsCi0JMHgwMDAwMDAwMiwgMHgwMDAwMTA0MiwgMHgwMDgwMTAwMCwgMHgwMDgwMDAwMiwKLQotCTB4MTA0MDAwMDAsIDB4MDA0MDQwMTAsIDB4MDAwMDAwMTAsIDB4MTA0MDAwMTAsCi0JMHgxMDAwNDAwMCwgMHgwMDQwMDAwMCwgMHgxMDQwMDAxMCwgMHgwMDAwNDAxMCwKLQkweDAwNDAwMDEwLCAweDAwMDA0MDAwLCAweDAwNDA0MDAwLCAweDEwMDAwMDAwLAotCTB4MTA0MDQwMTAsIDB4MTAwMDAwMTAsIDB4MTAwMDAwMDAsIDB4MTA0MDQwMDAsCi0JMHgwMDAwMDAwMCwgMHgxMDAwNDAwMCwgMHgwMDQwNDAxMCwgMHgwMDAwMDAxMCwKLQkweDEwMDAwMDEwLCAweDEwNDA0MDEwLCAweDAwMDA0MDAwLCAweDEwNDAwMDAwLAotCTB4MTA0MDQwMDAsIDB4MDA0MDAwMTAsIDB4MTAwMDQwMTAsIDB4MDA0MDQwMDAsCi0JMHgwMDAwNDAxMCwgMHgwMDAwMDAwMCwgMHgwMDQwMDAwMCwgMHgxMDAwNDAxMCwKLQkweDAwNDA0MDEwLCAweDAwMDAwMDEwLCAweDEwMDAwMDAwLCAweDAwMDA0MDAwLAotCTB4MTAwMDAwMTAsIDB4MTAwMDQwMDAsIDB4MDA0MDQwMDAsIDB4MTA0MDAwMTAsCi0JMHgwMDAwMDAwMCwgMHgwMDQwNDAxMCwgMHgwMDAwNDAxMCwgMHgxMDQwNDAwMCwKLQkweDEwMDA0MDAwLCAweDAwNDAwMDAwLCAweDEwNDA0MDEwLCAweDEwMDAwMDAwLAotCTB4MTAwMDQwMTAsIDB4MTA0MDAwMDAsIDB4MDA0MDAwMDAsIDB4MTA0MDQwMTAsCi0JMHgwMDAwNDAwMCwgMHgwMDQwMDAxMCwgMHgxMDQwMDAxMCwgMHgwMDAwNDAxMCwKLQkweDAwNDAwMDEwLCAweDAwMDAwMDAwLCAweDEwNDA0MDAwLCAweDEwMDAwMDEwLAotCTB4MTA0MDAwMDAsIDB4MTAwMDQwMTAsIDB4MDAwMDAwMTAsIDB4MDA0MDQwMDAsCi0KLQkweDAwMjA4MDgwLCAweDAwMDA4MDAwLCAweDIwMjAwMDAwLCAweDIwMjA4MDgwLAotCTB4MDAyMDAwMDAsIDB4MjAwMDgwODAsIDB4MjAwMDgwMDAsIDB4MjAyMDAwMDAsCi0JMHgyMDAwODA4MCwgMHgwMDIwODA4MCwgMHgwMDIwODAwMCwgMHgyMDAwMDA4MCwKLQkweDIwMjAwMDgwLCAweDAwMjAwMDAwLCAweDAwMDAwMDAwLCAweDIwMDA4MDAwLAotCTB4MDAwMDgwMDAsIDB4MjAwMDAwMDAsIDB4MDAyMDAwODAsIDB4MDAwMDgwODAsCi0JMHgyMDIwODA4MCwgMHgwMDIwODAwMCwgMHgyMDAwMDA4MCwgMHgwMDIwMDA4MCwKLQkweDIwMDAwMDAwLCAweDAwMDAwMDgwLCAweDAwMDA4MDgwLCAweDIwMjA4MDAwLAotCTB4MDAwMDAwODAsIDB4MjAyMDAwODAsIDB4MjAyMDgwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgyMDIwODA4MCwgMHgwMDIwMDA4MCwgMHgyMDAwODAwMCwKLQkweDAwMjA4MDgwLCAweDAwMDA4MDAwLCAweDIwMDAwMDgwLCAweDAwMjAwMDgwLAotCTB4MjAyMDgwMDAsIDB4MDAwMDAwODAsIDB4MDAwMDgwODAsIDB4MjAyMDAwMDAsCi0JMHgyMDAwODA4MCwgMHgyMDAwMDAwMCwgMHgyMDIwMDAwMCwgMHgwMDIwODAwMCwKLQkweDIwMjA4MDgwLCAweDAwMDA4MDgwLCAweDAwMjA4MDAwLCAweDIwMjAwMDgwLAotCTB4MDAyMDAwMDAsIDB4MjAwMDAwODAsIDB4MjAwMDgwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwODAwMCwgMHgwMDIwMDAwMCwgMHgyMDIwMDA4MCwgMHgwMDIwODA4MCwKLQkweDIwMDAwMDAwLCAweDIwMjA4MDAwLCAweDAwMDAwMDgwLCAweDIwMDA4MDgwLAorc3RhdGljIGNvbnN0IHU4IHBjMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4NDAsIDB4MDQsIDB4MTAsIDB4MTAsIDB4NTAsIDB4MTQsCisJMHgwNCwgMHg0MCwgMHg0NCwgMHg0NCwgMHgxNCwgMHg1MCwgMHg1NCwgMHg1NCwKKwkweDAyLCAweDAyLCAweDQyLCAweDA2LCAweDEyLCAweDEyLCAweDUyLCAweDE2LAorCTB4MDYsIDB4NDIsIDB4NDYsIDB4NDYsIDB4MTYsIDB4NTIsIDB4NTYsIDB4NTYsCisJMHg4MCwgMHgwOCwgMHhjMCwgMHgwYywgMHg5MCwgMHgxOCwgMHhkMCwgMHgxYywKKwkweDg0LCAweDQ4LCAweGM0LCAweDRjLCAweDk0LCAweDU4LCAweGQ0LCAweDVjLAorCTB4ODIsIDB4MGEsIDB4YzIsIDB4MGUsIDB4OTIsIDB4MWEsIDB4ZDIsIDB4MWUsCisJMHg4NiwgMHg0YSwgMHhjNiwgMHg0ZSwgMHg5NiwgMHg1YSwgMHhkNiwgMHg1ZSwKKwkweDIwLCAweDIwLCAweDYwLCAweDI0LCAweDMwLCAweDMwLCAweDcwLCAweDM0LAorCTB4MjQsIDB4NjAsIDB4NjQsIDB4NjQsIDB4MzQsIDB4NzAsIDB4NzQsIDB4NzQsCisJMHgyMiwgMHgyMiwgMHg2MiwgMHgyNiwgMHgzMiwgMHgzMiwgMHg3MiwgMHgzNiwKKwkweDI2LCAweDYyLCAweDY2LCAweDY2LCAweDM2LCAweDcyLCAweDc2LCAweDc2LAorCTB4YTAsIDB4MjgsIDB4ZTAsIDB4MmMsIDB4YjAsIDB4MzgsIDB4ZjAsIDB4M2MsCisJMHhhNCwgMHg2OCwgMHhlNCwgMHg2YywgMHhiNCwgMHg3OCwgMHhmNCwgMHg3YywKKwkweGEyLCAweDJhLCAweGUyLCAweDJlLCAweGIyLCAweDNhLCAweGYyLCAweDNlLAorCTB4YTYsIDB4NmEsIDB4ZTYsIDB4NmUsIDB4YjYsIDB4N2EsIDB4ZjYsIDB4N2UsCisJMHgwOCwgMHg4MCwgMHg0OCwgMHg4NCwgMHgxOCwgMHg5MCwgMHg1OCwgMHg5NCwKKwkweDBjLCAweGMwLCAweDRjLCAweGM0LCAweDFjLCAweGQwLCAweDVjLCAweGQ0LAorCTB4MGEsIDB4ODIsIDB4NGEsIDB4ODYsIDB4MWEsIDB4OTIsIDB4NWEsIDB4OTYsCisJMHgwZSwgMHhjMiwgMHg0ZSwgMHhjNiwgMHgxZSwgMHhkMiwgMHg1ZSwgMHhkNiwKKwkweDg4LCAweDg4LCAweGM4LCAweDhjLCAweDk4LCAweDk4LCAweGQ4LCAweDljLAorCTB4OGMsIDB4YzgsIDB4Y2MsIDB4Y2MsIDB4OWMsIDB4ZDgsIDB4ZGMsIDB4ZGMsCisJMHg4YSwgMHg4YSwgMHhjYSwgMHg4ZSwgMHg5YSwgMHg5YSwgMHhkYSwgMHg5ZSwKKwkweDhlLCAweGNhLCAweGNlLCAweGNlLCAweDllLCAweGRhLCAweGRlLCAweGRlLAorCTB4MjgsIDB4YTAsIDB4NjgsIDB4YTQsIDB4MzgsIDB4YjAsIDB4NzgsIDB4YjQsCisJMHgyYywgMHhlMCwgMHg2YywgMHhlNCwgMHgzYywgMHhmMCwgMHg3YywgMHhmNCwKKwkweDJhLCAweGEyLCAweDZhLCAweGE2LCAweDNhLCAweGIyLCAweDdhLCAweGI2LAorCTB4MmUsIDB4ZTIsIDB4NmUsIDB4ZTYsIDB4M2UsIDB4ZjIsIDB4N2UsIDB4ZjYsCisJMHhhOCwgMHhhOCwgMHhlOCwgMHhhYywgMHhiOCwgMHhiOCwgMHhmOCwgMHhiYywKKwkweGFjLCAweGU4LCAweGVjLCAweGVjLCAweGJjLCAweGY4LCAweGZjLCAweGZjLAorCTB4YWEsIDB4YWEsIDB4ZWEsIDB4YWUsIDB4YmEsIDB4YmEsIDB4ZmEsIDB4YmUsCisJMHhhZSwgMHhlYSwgMHhlZSwgMHhlZSwgMHhiZSwgMHhmYSwgMHhmZSwgMHhmZQogfTsKIAotc3RhdGljIGNvbnN0IHU4IHJvdG9yc1tdID0gewotCTM0LCAxMywgIDUsIDQ2LCA0NywgMTgsIDMyLCA0MSwgMTEsIDUzLCAzMywgMjAsCi0JMTQsIDM2LCAzMCwgMjQsIDQ5LCAgMiwgMTUsIDM3LCA0MiwgNTAsICAwLCAyMSwKLQkzOCwgNDgsICA2LCAyNiwgMzksICA0LCA1MiwgMjUsIDEyLCAyNywgMzEsIDQwLAotCTEsIDE3LCAyOCwgMjksIDIzLCA1MSwgMzUsICA3LCAgMywgMjIsICA5LCA0MywKLQotCTQxLCAyMCwgMTIsIDUzLCA1NCwgMjUsIDM5LCA0OCwgMTgsIDMxLCA0MCwgMjcsCi0JMjEsIDQzLCAzNywgIDAsICAxLCAgOSwgMjIsIDQ0LCA0OSwgIDIsICA3LCAyOCwKLQk0NSwgNTUsIDEzLCAzMywgNDYsIDExLCAgNiwgMzIsIDE5LCAzNCwgMzgsIDQ3LAotCTgsIDI0LCAzNSwgMzYsIDMwLCAgMywgNDIsIDE0LCAxMCwgMjksIDE2LCA1MCwKLQotCTU1LCAzNCwgMjYsIDM4LCAxMSwgMzksIDUzLCAgNSwgMzIsIDQ1LCA1NCwgNDEsCi0JMzUsICAyLCA1MSwgMTQsIDE1LCAyMywgMzYsICAzLCAgOCwgMTYsIDIxLCA0MiwKLQk2LCAxMiwgMjcsIDQ3LCAzMSwgMjUsIDIwLCA0NiwgMzMsIDQ4LCA1MiwgIDQsCi0JMjIsICA3LCA0OSwgNTAsIDQ0LCAxNywgIDEsIDI4LCAyNCwgNDMsIDMwLCAgOSwKLQotCTEyLCA0OCwgNDAsIDUyLCAyNSwgNTMsIDM4LCAxOSwgNDYsICA2LCAxMSwgNTUsCi0JNDksIDE2LCAxMCwgMjgsIDI5LCAzNywgNTAsIDE3LCAyMiwgMzAsIDM1LCAgMSwKLQkyMCwgMjYsIDQxLCAgNCwgNDUsIDM5LCAzNCwgMzEsIDQ3LCAgNSwgMTMsIDE4LAotCTM2LCAyMSwgIDgsICA5LCAgMywgIDAsIDE1LCA0MiwgIDcsICAyLCA0NCwgMjMsCi0KLQkyNiwgIDUsIDU0LCAxMywgMzksIDM4LCA1MiwgMzMsIDMxLCAyMCwgMjUsIDEyLAotCTgsIDMwLCAyNCwgNDIsIDQzLCA1MSwgIDksICAwLCAzNiwgNDQsIDQ5LCAxNSwKLQkzNCwgNDAsIDU1LCAxOCwgIDYsIDUzLCA0OCwgNDUsICA0LCAxOSwgMjcsIDMyLAotCTUwLCAzNSwgMjIsIDIzLCAxNywgMTQsIDI5LCAgMSwgMjEsIDE2LCAgMywgMzcsCi0KLQk0MCwgMTksIDExLCAyNywgNTMsIDUyLCAxMywgNDcsIDQ1LCAzNCwgMzksIDI2LAotCTIyLCA0NCwgIDcsICAxLCAgMiwgMTAsIDIzLCAxNCwgNTAsICAzLCAgOCwgMjksCi0JNDgsIDU0LCAxMiwgMzIsIDIwLCAzOCwgIDUsICA2LCAxOCwgMzMsIDQxLCA0NiwKLQk5LCA0OSwgMzYsIDM3LCAgMCwgMjgsIDQzLCAxNSwgMzUsIDMwLCAxNywgNTEsCi0KLQk1NCwgMzMsIDI1LCA0MSwgMzgsIDEzLCAyNywgIDQsICA2LCA0OCwgNTMsIDQwLAotCTM2LCAgMywgMjEsIDE1LCAxNiwgMjQsIDM3LCAyOCwgIDksIDE3LCAyMiwgNDMsCi0JNSwgMTEsIDI2LCA0NiwgMzQsIDUyLCAxOSwgMjAsIDMyLCA0NywgNTUsIDMxLAotCTIzLCAgOCwgNTAsIDUxLCAxNCwgNDIsICAyLCAyOSwgNDksIDQ0LCAgMCwgMTAsCi0KLQkxMSwgNDcsIDM5LCA1NSwgNTIsIDI3LCA0MSwgMTgsIDIwLCAgNSwgMzgsIDU0LAotCTUwLCAxNywgMzUsIDI5LCAzMCwgIDcsIDUxLCA0MiwgMjMsICAwLCAzNiwgIDIsCi0JMTksIDI1LCA0MCwgMzEsIDQ4LCAxMywgMzMsIDM0LCA0NiwgIDQsIDEyLCA0NSwKLQkzNywgMjIsICA5LCAxMCwgMjgsICAxLCAxNiwgNDMsICA4LCAgMywgMTQsIDI0LAotCi0JMTgsIDU0LCA0NiwgIDUsICA2LCAzNCwgNDgsIDI1LCAyNywgMTIsIDQ1LCAgNCwKLQkyLCAyNCwgNDIsIDM2LCAzNywgMTQsICAzLCA0OSwgMzAsICA3LCA0MywgIDksCi0JMjYsIDMyLCA0NywgMzgsIDU1LCAyMCwgNDAsIDQxLCA1MywgMTEsIDE5LCA1MiwKLQk0NCwgMjksIDE2LCAxNywgMzUsICA4LCAyMywgNTAsIDE1LCAxMCwgMjEsICAwLAotCi0JMzIsIDExLCAzMSwgMTksIDIwLCA0OCwgIDUsIDM5LCA0MSwgMjYsICA2LCAxOCwKLQkxNiwgIDcsICAxLCA1MCwgNTEsIDI4LCAxNywgIDgsIDQ0LCAyMSwgIDIsIDIzLAotCTQwLCA0NiwgIDQsIDUyLCAxMiwgMzQsIDU0LCA1NSwgMzgsIDI1LCAzMywgMTMsCi0JMywgNDMsIDMwLCAgMCwgNDksIDIyLCAzNywgIDksIDI5LCAyNCwgMzUsIDE0LAotCi0JNDYsIDI1LCA0NSwgMzMsIDM0LCAgNSwgMTksIDUzLCA1NSwgNDAsIDIwLCAzMiwKLQkzMCwgMjEsIDE1LCAgOSwgMTAsIDQyLCAgMCwgMjIsICAzLCAzNSwgMTYsIDM3LAotCTU0LCAzMSwgMTgsIDEzLCAyNiwgNDgsIDExLCAxMiwgNTIsIDM5LCA0NywgMjcsCi0JMTcsICAyLCA0NCwgMTQsICA4LCAzNiwgNTEsIDIzLCA0MywgIDcsIDQ5LCAyOCwKLQotCTMxLCAzOSwgIDYsIDQ3LCA0OCwgMTksIDMzLCAzOCwgMTIsIDU0LCAzNCwgNDYsCi0JNDQsIDM1LCAyOSwgMjMsIDI0LCAgMSwgMTQsIDM2LCAxNywgNDksIDMwLCA1MSwKLQkxMSwgNDUsIDMyLCAyNywgNDAsICA1LCAyNSwgMjYsIDEzLCA1MywgIDQsIDQxLAotCTAsIDE2LCAgMywgMjgsIDIyLCA1MCwgMTAsIDM3LCAgMiwgMjEsICA4LCA0MiwKLQotCTQ1LCA1MywgMjAsICA0LCAgNSwgMzMsIDQ3LCA1MiwgMjYsIDExLCA0OCwgMzEsCi0JMywgNDksIDQzLCAzNywgIDcsIDE1LCAyOCwgNTAsICAwLCAgOCwgNDQsIDEwLAotCTI1LCAgNiwgNDYsIDQxLCA1NCwgMTksIDM5LCA0MCwgMjcsIDM4LCAxOCwgNTUsCi0JMTQsIDMwLCAxNywgNDIsIDM2LCAgOSwgMjQsIDUxLCAxNiwgMzUsIDIyLCAgMSwKLQotCTYsIDM4LCAzNCwgMTgsIDE5LCA0NywgIDQsIDEzLCA0MCwgMjUsICA1LCA0NSwKLQkxNywgIDgsICAyLCA1MSwgMjEsIDI5LCA0MiwgIDksIDE0LCAyMiwgIDMsIDI0LAotCTM5LCAyMCwgMzEsIDU1LCAxMSwgMzMsIDUzLCA1NCwgNDEsIDUyLCAzMiwgMTIsCi0JMjgsIDQ0LCAgMCwgIDEsIDUwLCAyMywgIDcsIDEwLCAzMCwgNDksIDM2LCAxNSwKLQotCTIwLCA1MiwgNDgsIDMyLCAzMywgIDQsIDE4LCAyNywgNTQsIDM5LCAxOSwgIDYsCi0JMCwgMjIsIDE2LCAxMCwgMzUsIDQzLCAgMSwgMjMsIDI4LCAzNiwgMTcsICA3LAotCTUzLCAzNCwgNDUsIDEyLCAyNSwgNDcsIDM4LCAxMSwgNTUsIDEzLCA0NiwgMjYsCi0JNDIsICAzLCAxNCwgMTUsICA5LCAzNywgMjEsIDI0LCA0NCwgIDgsIDUwLCAyOSwKLQotCTI3LCAgNiwgNTUsIDM5LCA0MCwgMTEsIDI1LCAzNCwgIDQsIDQ2LCAyNiwgMTMsCi0JNywgMjksIDIzLCAxNywgNDIsIDUwLCAgOCwgMzAsIDM1LCA0MywgMjQsIDE0LAotCTMxLCA0MSwgNTIsIDE5LCAzMiwgNTQsIDQ1LCAxOCwgIDUsIDIwLCA1MywgMzMsCi0JNDksIDEwLCAyMSwgMjIsIDE2LCA0NCwgMjgsICAwLCA1MSwgMTUsICAyLCAzNiwKK3N0YXRpYyBjb25zdCB1OCByc1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDIsIDB4MDIsIDB4ODIsIDB4ODIsCisJMHgwNCwgMHgwNCwgMHg4NCwgMHg4NCwgMHgwNiwgMHgwNiwgMHg4NiwgMHg4NiwKKwkweDA4LCAweDA4LCAweDg4LCAweDg4LCAweDBhLCAweDBhLCAweDhhLCAweDhhLAorCTB4MGMsIDB4MGMsIDB4OGMsIDB4OGMsIDB4MGUsIDB4MGUsIDB4OGUsIDB4OGUsCisJMHgxMCwgMHgxMCwgMHg5MCwgMHg5MCwgMHgxMiwgMHgxMiwgMHg5MiwgMHg5MiwKKwkweDE0LCAweDE0LCAweDk0LCAweDk0LCAweDE2LCAweDE2LCAweDk2LCAweDk2LAorCTB4MTgsIDB4MTgsIDB4OTgsIDB4OTgsIDB4MWEsIDB4MWEsIDB4OWEsIDB4OWEsCisJMHgxYywgMHgxYywgMHg5YywgMHg5YywgMHgxZSwgMHgxZSwgMHg5ZSwgMHg5ZSwKKwkweDIwLCAweDIwLCAweGEwLCAweGEwLCAweDIyLCAweDIyLCAweGEyLCAweGEyLAorCTB4MjQsIDB4MjQsIDB4YTQsIDB4YTQsIDB4MjYsIDB4MjYsIDB4YTYsIDB4YTYsCisJMHgyOCwgMHgyOCwgMHhhOCwgMHhhOCwgMHgyYSwgMHgyYSwgMHhhYSwgMHhhYSwKKwkweDJjLCAweDJjLCAweGFjLCAweGFjLCAweDJlLCAweDJlLCAweGFlLCAweGFlLAorCTB4MzAsIDB4MzAsIDB4YjAsIDB4YjAsIDB4MzIsIDB4MzIsIDB4YjIsIDB4YjIsCisJMHgzNCwgMHgzNCwgMHhiNCwgMHhiNCwgMHgzNiwgMHgzNiwgMHhiNiwgMHhiNiwKKwkweDM4LCAweDM4LCAweGI4LCAweGI4LCAweDNhLCAweDNhLCAweGJhLCAweGJhLAorCTB4M2MsIDB4M2MsIDB4YmMsIDB4YmMsIDB4M2UsIDB4M2UsIDB4YmUsIDB4YmUsCisJMHg0MCwgMHg0MCwgMHhjMCwgMHhjMCwgMHg0MiwgMHg0MiwgMHhjMiwgMHhjMiwKKwkweDQ0LCAweDQ0LCAweGM0LCAweGM0LCAweDQ2LCAweDQ2LCAweGM2LCAweGM2LAorCTB4NDgsIDB4NDgsIDB4YzgsIDB4YzgsIDB4NGEsIDB4NGEsIDB4Y2EsIDB4Y2EsCisJMHg0YywgMHg0YywgMHhjYywgMHhjYywgMHg0ZSwgMHg0ZSwgMHhjZSwgMHhjZSwKKwkweDUwLCAweDUwLCAweGQwLCAweGQwLCAweDUyLCAweDUyLCAweGQyLCAweGQyLAorCTB4NTQsIDB4NTQsIDB4ZDQsIDB4ZDQsIDB4NTYsIDB4NTYsIDB4ZDYsIDB4ZDYsCisJMHg1OCwgMHg1OCwgMHhkOCwgMHhkOCwgMHg1YSwgMHg1YSwgMHhkYSwgMHhkYSwKKwkweDVjLCAweDVjLCAweGRjLCAweGRjLCAweDVlLCAweDVlLCAweGRlLCAweGRlLAorCTB4NjAsIDB4NjAsIDB4ZTAsIDB4ZTAsIDB4NjIsIDB4NjIsIDB4ZTIsIDB4ZTIsCisJMHg2NCwgMHg2NCwgMHhlNCwgMHhlNCwgMHg2NiwgMHg2NiwgMHhlNiwgMHhlNiwKKwkweDY4LCAweDY4LCAweGU4LCAweGU4LCAweDZhLCAweDZhLCAweGVhLCAweGVhLAorCTB4NmMsIDB4NmMsIDB4ZWMsIDB4ZWMsIDB4NmUsIDB4NmUsIDB4ZWUsIDB4ZWUsCisJMHg3MCwgMHg3MCwgMHhmMCwgMHhmMCwgMHg3MiwgMHg3MiwgMHhmMiwgMHhmMiwKKwkweDc0LCAweDc0LCAweGY0LCAweGY0LCAweDc2LCAweDc2LCAweGY2LCAweGY2LAorCTB4NzgsIDB4NzgsIDB4ZjgsIDB4ZjgsIDB4N2EsIDB4N2EsIDB4ZmEsIDB4ZmEsCisJMHg3YywgMHg3YywgMHhmYywgMHhmYywgMHg3ZSwgMHg3ZSwgMHhmZSwgMHhmZQogfTsKIAotc3RhdGljIGNvbnN0IHU4IHBhcml0eVtdID0gewotCTgsMSwwLDgsMCw4LDgsMCwwLDgsOCwwLDgsMCwyLDgsMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMywKLQkwLDgsOCwwLDgsMCwwLDgsOCwwLDAsOCwwLDgsOCwwLDgsMCwwLDgsMCw4LDgsMCwwLDgsOCwwLDgsMCwwLDgsCi0JMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LAotCTgsMCwwLDgsMCw4LDgsMCwwLDgsOCwwLDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCwKLQkwLDgsOCwwLDgsMCwwLDgsOCwwLDAsOCwwLDgsOCwwLDgsMCwwLDgsMCw4LDgsMCwwLDgsOCwwLDgsMCwwLDgsCi0JOCwwLDAsOCwwLDgsOCwwLDAsOCw4LDAsOCwwLDAsOCwwLDgsOCwwLDgsMCwwLDgsOCwwLDAsOCwwLDgsOCwwLAotCTgsMCwwLDgsMCw4LDgsMCwwLDgsOCwwLDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCwKLQk0LDgsOCwwLDgsMCwwLDgsOCwwLDAsOCwwLDgsOCwwLDgsNSwwLDgsMCw4LDgsMCwwLDgsOCwwLDgsMCw2LDgsCitzdGF0aWMgY29uc3QgdTMyIHBjMlsxMDI0XSA9IHsKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwNDAwMDAsIDB4MDAwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDAxMDAwMDAsCisJMHgwMDQwMDAwMCwgMHgwMDAwMDAwOCwgMHgwMDAwMDgwMCwgMHg0MDAwMDAwMCwKKwkweDAwNDQwMDAwLCAweDAwMDAwMDA4LCAweDA0MDAwODAwLCAweDQwMTAwMDAwLAorCTB4MDAwMDA0MDAsIDB4MDAwMDAwMjAsIDB4MDgwMDAwMDAsIDB4MDAwMDAxMDAsCisJMHgwMDA0MDQwMCwgMHgwMDAwMDAyMCwgMHgwYzAwMDAwMCwgMHgwMDEwMDEwMCwKKwkweDAwNDAwNDAwLCAweDAwMDAwMDI4LCAweDA4MDAwODAwLCAweDQwMDAwMTAwLAorCTB4MDA0NDA0MDAsIDB4MDAwMDAwMjgsIDB4MGMwMDA4MDAsIDB4NDAxMDAxMDAsCisJMHg4MDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwgMHgwMDgwMDAwMCwKKwkweDgwMDQwMDAwLCAweDAwMDAwMDEwLCAweDA0MDAwMDAwLCAweDAwOTAwMDAwLAorCTB4ODA0MDAwMDAsIDB4MDAwMDAwMTgsIDB4MDAwMDA4MDAsIDB4NDA4MDAwMDAsCisJMHg4MDQ0MDAwMCwgMHgwMDAwMDAxOCwgMHgwNDAwMDgwMCwgMHg0MDkwMDAwMCwKKwkweDgwMDAwNDAwLCAweDAwMDAwMDMwLCAweDA4MDAwMDAwLCAweDAwODAwMTAwLAorCTB4ODAwNDA0MDAsIDB4MDAwMDAwMzAsIDB4MGMwMDAwMDAsIDB4MDA5MDAxMDAsCisJMHg4MDQwMDQwMCwgMHgwMDAwMDAzOCwgMHgwODAwMDgwMCwgMHg0MDgwMDEwMCwKKwkweDgwNDQwNDAwLCAweDAwMDAwMDM4LCAweDBjMDAwODAwLCAweDQwOTAwMTAwLAorCTB4MTAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDAwMDEwMDAsCisJMHgxMDA0MDAwMCwgMHgwMDAwMDAwMCwgMHgwNDIwMDAwMCwgMHgwMDEwMTAwMCwKKwkweDEwNDAwMDAwLCAweDAwMDAwMDA4LCAweDAwMjAwODAwLCAweDQwMDAxMDAwLAorCTB4MTA0NDAwMDAsIDB4MDAwMDAwMDgsIDB4MDQyMDA4MDAsIDB4NDAxMDEwMDAsCisJMHgxMDAwMDQwMCwgMHgwMDAwMDAyMCwgMHgwODIwMDAwMCwgMHgwMDAwMTEwMCwKKwkweDEwMDQwNDAwLCAweDAwMDAwMDIwLCAweDBjMjAwMDAwLCAweDAwMTAxMTAwLAorCTB4MTA0MDA0MDAsIDB4MDAwMDAwMjgsIDB4MDgyMDA4MDAsIDB4NDAwMDExMDAsCisJMHgxMDQ0MDQwMCwgMHgwMDAwMDAyOCwgMHgwYzIwMDgwMCwgMHg0MDEwMTEwMCwKKwkweDkwMDAwMDAwLCAweDAwMDAwMDEwLCAweDAwMjAwMDAwLCAweDAwODAxMDAwLAorCTB4OTAwNDAwMDAsIDB4MDAwMDAwMTAsIDB4MDQyMDAwMDAsIDB4MDA5MDEwMDAsCisJMHg5MDQwMDAwMCwgMHgwMDAwMDAxOCwgMHgwMDIwMDgwMCwgMHg0MDgwMTAwMCwKKwkweDkwNDQwMDAwLCAweDAwMDAwMDE4LCAweDA0MjAwODAwLCAweDQwOTAxMDAwLAorCTB4OTAwMDA0MDAsIDB4MDAwMDAwMzAsIDB4MDgyMDAwMDAsIDB4MDA4MDExMDAsCisJMHg5MDA0MDQwMCwgMHgwMDAwMDAzMCwgMHgwYzIwMDAwMCwgMHgwMDkwMTEwMCwKKwkweDkwNDAwNDAwLCAweDAwMDAwMDM4LCAweDA4MjAwODAwLCAweDQwODAxMTAwLAorCTB4OTA0NDA0MDAsIDB4MDAwMDAwMzgsIDB4MGMyMDA4MDAsIDB4NDA5MDExMDAsCisJMHgwMDAwMDIwMCwgMHgwMDA4MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNCwKKwkweDAwMDQwMjAwLCAweDAwMDgwMDAwLCAweDA0MDAwMDAwLCAweDAwMTAwMDA0LAorCTB4MDA0MDAyMDAsIDB4MDAwODAwMDgsIDB4MDAwMDA4MDAsIDB4NDAwMDAwMDQsCisJMHgwMDQ0MDIwMCwgMHgwMDA4MDAwOCwgMHgwNDAwMDgwMCwgMHg0MDEwMDAwNCwKKwkweDAwMDAwNjAwLCAweDAwMDgwMDIwLCAweDA4MDAwMDAwLCAweDAwMDAwMTA0LAorCTB4MDAwNDA2MDAsIDB4MDAwODAwMjAsIDB4MGMwMDAwMDAsIDB4MDAxMDAxMDQsCisJMHgwMDQwMDYwMCwgMHgwMDA4MDAyOCwgMHgwODAwMDgwMCwgMHg0MDAwMDEwNCwKKwkweDAwNDQwNjAwLCAweDAwMDgwMDI4LCAweDBjMDAwODAwLCAweDQwMTAwMTA0LAorCTB4ODAwMDAyMDAsIDB4MDAwODAwMTAsIDB4MDAwMDAwMDAsIDB4MDA4MDAwMDQsCisJMHg4MDA0MDIwMCwgMHgwMDA4MDAxMCwgMHgwNDAwMDAwMCwgMHgwMDkwMDAwNCwKKwkweDgwNDAwMjAwLCAweDAwMDgwMDE4LCAweDAwMDAwODAwLCAweDQwODAwMDA0LAorCTB4ODA0NDAyMDAsIDB4MDAwODAwMTgsIDB4MDQwMDA4MDAsIDB4NDA5MDAwMDQsCisJMHg4MDAwMDYwMCwgMHgwMDA4MDAzMCwgMHgwODAwMDAwMCwgMHgwMDgwMDEwNCwKKwkweDgwMDQwNjAwLCAweDAwMDgwMDMwLCAweDBjMDAwMDAwLCAweDAwOTAwMTA0LAorCTB4ODA0MDA2MDAsIDB4MDAwODAwMzgsIDB4MDgwMDA4MDAsIDB4NDA4MDAxMDQsCisJMHg4MDQ0MDYwMCwgMHgwMDA4MDAzOCwgMHgwYzAwMDgwMCwgMHg0MDkwMDEwNCwKKwkweDEwMDAwMjAwLCAweDAwMDgwMDAwLCAweDAwMjAwMDAwLCAweDAwMDAxMDA0LAorCTB4MTAwNDAyMDAsIDB4MDAwODAwMDAsIDB4MDQyMDAwMDAsIDB4MDAxMDEwMDQsCisJMHgxMDQwMDIwMCwgMHgwMDA4MDAwOCwgMHgwMDIwMDgwMCwgMHg0MDAwMTAwNCwKKwkweDEwNDQwMjAwLCAweDAwMDgwMDA4LCAweDA0MjAwODAwLCAweDQwMTAxMDA0LAorCTB4MTAwMDA2MDAsIDB4MDAwODAwMjAsIDB4MDgyMDAwMDAsIDB4MDAwMDExMDQsCisJMHgxMDA0MDYwMCwgMHgwMDA4MDAyMCwgMHgwYzIwMDAwMCwgMHgwMDEwMTEwNCwKKwkweDEwNDAwNjAwLCAweDAwMDgwMDI4LCAweDA4MjAwODAwLCAweDQwMDAxMTA0LAorCTB4MTA0NDA2MDAsIDB4MDAwODAwMjgsIDB4MGMyMDA4MDAsIDB4NDAxMDExMDQsCisJMHg5MDAwMDIwMCwgMHgwMDA4MDAxMCwgMHgwMDIwMDAwMCwgMHgwMDgwMTAwNCwKKwkweDkwMDQwMjAwLCAweDAwMDgwMDEwLCAweDA0MjAwMDAwLCAweDAwOTAxMDA0LAorCTB4OTA0MDAyMDAsIDB4MDAwODAwMTgsIDB4MDAyMDA4MDAsIDB4NDA4MDEwMDQsCisJMHg5MDQ0MDIwMCwgMHgwMDA4MDAxOCwgMHgwNDIwMDgwMCwgMHg0MDkwMTAwNCwKKwkweDkwMDAwNjAwLCAweDAwMDgwMDMwLCAweDA4MjAwMDAwLCAweDAwODAxMTA0LAorCTB4OTAwNDA2MDAsIDB4MDAwODAwMzAsIDB4MGMyMDAwMDAsIDB4MDA5MDExMDQsCisJMHg5MDQwMDYwMCwgMHgwMDA4MDAzOCwgMHgwODIwMDgwMCwgMHg0MDgwMTEwNCwKKwkweDkwNDQwNjAwLCAweDAwMDgwMDM4LCAweDBjMjAwODAwLCAweDQwOTAxMTA0LAorCTB4MDAwMDAwMDIsIDB4MDAwMDIwMDAsIDB4MjAwMDAwMDAsIDB4MDAwMDAwMDEsCisJMHgwMDA0MDAwMiwgMHgwMDAwMjAwMCwgMHgyNDAwMDAwMCwgMHgwMDEwMDAwMSwKKwkweDAwNDAwMDAyLCAweDAwMDAyMDA4LCAweDIwMDAwODAwLCAweDQwMDAwMDAxLAorCTB4MDA0NDAwMDIsIDB4MDAwMDIwMDgsIDB4MjQwMDA4MDAsIDB4NDAxMDAwMDEsCisJMHgwMDAwMDQwMiwgMHgwMDAwMjAyMCwgMHgyODAwMDAwMCwgMHgwMDAwMDEwMSwKKwkweDAwMDQwNDAyLCAweDAwMDAyMDIwLCAweDJjMDAwMDAwLCAweDAwMTAwMTAxLAorCTB4MDA0MDA0MDIsIDB4MDAwMDIwMjgsIDB4MjgwMDA4MDAsIDB4NDAwMDAxMDEsCisJMHgwMDQ0MDQwMiwgMHgwMDAwMjAyOCwgMHgyYzAwMDgwMCwgMHg0MDEwMDEwMSwKKwkweDgwMDAwMDAyLCAweDAwMDAyMDEwLCAweDIwMDAwMDAwLCAweDAwODAwMDAxLAorCTB4ODAwNDAwMDIsIDB4MDAwMDIwMTAsIDB4MjQwMDAwMDAsIDB4MDA5MDAwMDEsCisJMHg4MDQwMDAwMiwgMHgwMDAwMjAxOCwgMHgyMDAwMDgwMCwgMHg0MDgwMDAwMSwKKwkweDgwNDQwMDAyLCAweDAwMDAyMDE4LCAweDI0MDAwODAwLCAweDQwOTAwMDAxLAorCTB4ODAwMDA0MDIsIDB4MDAwMDIwMzAsIDB4MjgwMDAwMDAsIDB4MDA4MDAxMDEsCisJMHg4MDA0MDQwMiwgMHgwMDAwMjAzMCwgMHgyYzAwMDAwMCwgMHgwMDkwMDEwMSwKKwkweDgwNDAwNDAyLCAweDAwMDAyMDM4LCAweDI4MDAwODAwLCAweDQwODAwMTAxLAorCTB4ODA0NDA0MDIsIDB4MDAwMDIwMzgsIDB4MmMwMDA4MDAsIDB4NDA5MDAxMDEsCisJMHgxMDAwMDAwMiwgMHgwMDAwMjAwMCwgMHgyMDIwMDAwMCwgMHgwMDAwMTAwMSwKKwkweDEwMDQwMDAyLCAweDAwMDAyMDAwLCAweDI0MjAwMDAwLCAweDAwMTAxMDAxLAorCTB4MTA0MDAwMDIsIDB4MDAwMDIwMDgsIDB4MjAyMDA4MDAsIDB4NDAwMDEwMDEsCisJMHgxMDQ0MDAwMiwgMHgwMDAwMjAwOCwgMHgyNDIwMDgwMCwgMHg0MDEwMTAwMSwKKwkweDEwMDAwNDAyLCAweDAwMDAyMDIwLCAweDI4MjAwMDAwLCAweDAwMDAxMTAxLAorCTB4MTAwNDA0MDIsIDB4MDAwMDIwMjAsIDB4MmMyMDAwMDAsIDB4MDAxMDExMDEsCisJMHgxMDQwMDQwMiwgMHgwMDAwMjAyOCwgMHgyODIwMDgwMCwgMHg0MDAwMTEwMSwKKwkweDEwNDQwNDAyLCAweDAwMDAyMDI4LCAweDJjMjAwODAwLCAweDQwMTAxMTAxLAorCTB4OTAwMDAwMDIsIDB4MDAwMDIwMTAsIDB4MjAyMDAwMDAsIDB4MDA4MDEwMDEsCisJMHg5MDA0MDAwMiwgMHgwMDAwMjAxMCwgMHgyNDIwMDAwMCwgMHgwMDkwMTAwMSwKKwkweDkwNDAwMDAyLCAweDAwMDAyMDE4LCAweDIwMjAwODAwLCAweDQwODAxMDAxLAorCTB4OTA0NDAwMDIsIDB4MDAwMDIwMTgsIDB4MjQyMDA4MDAsIDB4NDA5MDEwMDEsCisJMHg5MDAwMDQwMiwgMHgwMDAwMjAzMCwgMHgyODIwMDAwMCwgMHgwMDgwMTEwMSwKKwkweDkwMDQwNDAyLCAweDAwMDAyMDMwLCAweDJjMjAwMDAwLCAweDAwOTAxMTAxLAorCTB4OTA0MDA0MDIsIDB4MDAwMDIwMzgsIDB4MjgyMDA4MDAsIDB4NDA4MDExMDEsCisJMHg5MDQ0MDQwMiwgMHgwMDAwMjAzOCwgMHgyYzIwMDgwMCwgMHg0MDkwMTEwMSwKKwkweDAwMDAwMjAyLCAweDAwMDgyMDAwLCAweDIwMDAwMDAwLCAweDAwMDAwMDA1LAorCTB4MDAwNDAyMDIsIDB4MDAwODIwMDAsIDB4MjQwMDAwMDAsIDB4MDAxMDAwMDUsCisJMHgwMDQwMDIwMiwgMHgwMDA4MjAwOCwgMHgyMDAwMDgwMCwgMHg0MDAwMDAwNSwKKwkweDAwNDQwMjAyLCAweDAwMDgyMDA4LCAweDI0MDAwODAwLCAweDQwMTAwMDA1LAorCTB4MDAwMDA2MDIsIDB4MDAwODIwMjAsIDB4MjgwMDAwMDAsIDB4MDAwMDAxMDUsCisJMHgwMDA0MDYwMiwgMHgwMDA4MjAyMCwgMHgyYzAwMDAwMCwgMHgwMDEwMDEwNSwKKwkweDAwNDAwNjAyLCAweDAwMDgyMDI4LCAweDI4MDAwODAwLCAweDQwMDAwMTA1LAorCTB4MDA0NDA2MDIsIDB4MDAwODIwMjgsIDB4MmMwMDA4MDAsIDB4NDAxMDAxMDUsCisJMHg4MDAwMDIwMiwgMHgwMDA4MjAxMCwgMHgyMDAwMDAwMCwgMHgwMDgwMDAwNSwKKwkweDgwMDQwMjAyLCAweDAwMDgyMDEwLCAweDI0MDAwMDAwLCAweDAwOTAwMDA1LAorCTB4ODA0MDAyMDIsIDB4MDAwODIwMTgsIDB4MjAwMDA4MDAsIDB4NDA4MDAwMDUsCisJMHg4MDQ0MDIwMiwgMHgwMDA4MjAxOCwgMHgyNDAwMDgwMCwgMHg0MDkwMDAwNSwKKwkweDgwMDAwNjAyLCAweDAwMDgyMDMwLCAweDI4MDAwMDAwLCAweDAwODAwMTA1LAorCTB4ODAwNDA2MDIsIDB4MDAwODIwMzAsIDB4MmMwMDAwMDAsIDB4MDA5MDAxMDUsCisJMHg4MDQwMDYwMiwgMHgwMDA4MjAzOCwgMHgyODAwMDgwMCwgMHg0MDgwMDEwNSwKKwkweDgwNDQwNjAyLCAweDAwMDgyMDM4LCAweDJjMDAwODAwLCAweDQwOTAwMTA1LAorCTB4MTAwMDAyMDIsIDB4MDAwODIwMDAsIDB4MjAyMDAwMDAsIDB4MDAwMDEwMDUsCisJMHgxMDA0MDIwMiwgMHgwMDA4MjAwMCwgMHgyNDIwMDAwMCwgMHgwMDEwMTAwNSwKKwkweDEwNDAwMjAyLCAweDAwMDgyMDA4LCAweDIwMjAwODAwLCAweDQwMDAxMDA1LAorCTB4MTA0NDAyMDIsIDB4MDAwODIwMDgsIDB4MjQyMDA4MDAsIDB4NDAxMDEwMDUsCisJMHgxMDAwMDYwMiwgMHgwMDA4MjAyMCwgMHgyODIwMDAwMCwgMHgwMDAwMTEwNSwKKwkweDEwMDQwNjAyLCAweDAwMDgyMDIwLCAweDJjMjAwMDAwLCAweDAwMTAxMTA1LAorCTB4MTA0MDA2MDIsIDB4MDAwODIwMjgsIDB4MjgyMDA4MDAsIDB4NDAwMDExMDUsCisJMHgxMDQ0MDYwMiwgMHgwMDA4MjAyOCwgMHgyYzIwMDgwMCwgMHg0MDEwMTEwNSwKKwkweDkwMDAwMjAyLCAweDAwMDgyMDEwLCAweDIwMjAwMDAwLCAweDAwODAxMDA1LAorCTB4OTAwNDAyMDIsIDB4MDAwODIwMTAsIDB4MjQyMDAwMDAsIDB4MDA5MDEwMDUsCisJMHg5MDQwMDIwMiwgMHgwMDA4MjAxOCwgMHgyMDIwMDgwMCwgMHg0MDgwMTAwNSwKKwkweDkwNDQwMjAyLCAweDAwMDgyMDE4LCAweDI0MjAwODAwLCAweDQwOTAxMDA1LAorCTB4OTAwMDA2MDIsIDB4MDAwODIwMzAsIDB4MjgyMDAwMDAsIDB4MDA4MDExMDUsCisJMHg5MDA0MDYwMiwgMHgwMDA4MjAzMCwgMHgyYzIwMDAwMCwgMHgwMDkwMTEwNSwKKwkweDkwNDAwNjAyLCAweDAwMDgyMDM4LCAweDI4MjAwODAwLCAweDQwODAxMTA1LAorCTB4OTA0NDA2MDIsIDB4MDAwODIwMzgsIDB4MmMyMDA4MDAsIDB4NDA5MDExMDUsCisKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDgsIDB4MDAwODAwMDAsIDB4MTAwMDAwMDAsCisJMHgwMjAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDA4MCwgMHgwMDAwMTAwMCwKKwkweDAyMDAwMDAwLCAweDAwMDAwMDA4LCAweDAwMDgwMDgwLCAweDEwMDAxMDAwLAorCTB4MDAwMDQwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNDAsIDB4MDAwNDAwMDAsCisJMHgwMDAwNDAwMCwgMHgwMDAwMDAwOCwgMHgwMDA4MDA0MCwgMHgxMDA0MDAwMCwKKwkweDAyMDA0MDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMGMwLCAweDAwMDQxMDAwLAorCTB4MDIwMDQwMDAsIDB4MDAwMDAwMDgsIDB4MDAwODAwYzAsIDB4MTAwNDEwMDAsCisJMHgwMDAyMDAwMCwgMHgwMDAwODAwMCwgMHgwODAwMDAwMCwgMHgwMDIwMDAwMCwKKwkweDAwMDIwMDAwLCAweDAwMDA4MDA4LCAweDA4MDgwMDAwLCAweDEwMjAwMDAwLAorCTB4MDIwMjAwMDAsIDB4MDAwMDgwMDAsIDB4MDgwMDAwODAsIDB4MDAyMDEwMDAsCisJMHgwMjAyMDAwMCwgMHgwMDAwODAwOCwgMHgwODA4MDA4MCwgMHgxMDIwMTAwMCwKKwkweDAwMDI0MDAwLCAweDAwMDA4MDAwLCAweDA4MDAwMDQwLCAweDAwMjQwMDAwLAorCTB4MDAwMjQwMDAsIDB4MDAwMDgwMDgsIDB4MDgwODAwNDAsIDB4MTAyNDAwMDAsCisJMHgwMjAyNDAwMCwgMHgwMDAwODAwMCwgMHgwODAwMDBjMCwgMHgwMDI0MTAwMCwKKwkweDAyMDI0MDAwLCAweDAwMDA4MDA4LCAweDA4MDgwMGMwLCAweDEwMjQxMDAwLAorCTB4MDAwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDAwMjAsCisJMHgwMDAwMDAwMCwgMHgwMTAwMDAwOCwgMHgwMDA4MjAwMCwgMHgxMDAwMDAyMCwKKwkweDAyMDAwMDAwLCAweDAxMDAwMDAwLCAweDAwMDAyMDgwLCAweDAwMDAxMDIwLAorCTB4MDIwMDAwMDAsIDB4MDEwMDAwMDgsIDB4MDAwODIwODAsIDB4MTAwMDEwMjAsCisJMHgwMDAwNDAwMCwgMHgwMTAwMDAwMCwgMHgwMDAwMjA0MCwgMHgwMDA0MDAyMCwKKwkweDAwMDA0MDAwLCAweDAxMDAwMDA4LCAweDAwMDgyMDQwLCAweDEwMDQwMDIwLAorCTB4MDIwMDQwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMDIwYzAsIDB4MDAwNDEwMjAsCisJMHgwMjAwNDAwMCwgMHgwMTAwMDAwOCwgMHgwMDA4MjBjMCwgMHgxMDA0MTAyMCwKKwkweDAwMDIwMDAwLCAweDAxMDA4MDAwLCAweDA4MDAyMDAwLCAweDAwMjAwMDIwLAorCTB4MDAwMjAwMDAsIDB4MDEwMDgwMDgsIDB4MDgwODIwMDAsIDB4MTAyMDAwMjAsCisJMHgwMjAyMDAwMCwgMHgwMTAwODAwMCwgMHgwODAwMjA4MCwgMHgwMDIwMTAyMCwKKwkweDAyMDIwMDAwLCAweDAxMDA4MDA4LCAweDA4MDgyMDgwLCAweDEwMjAxMDIwLAorCTB4MDAwMjQwMDAsIDB4MDEwMDgwMDAsIDB4MDgwMDIwNDAsIDB4MDAyNDAwMjAsCisJMHgwMDAyNDAwMCwgMHgwMTAwODAwOCwgMHgwODA4MjA0MCwgMHgxMDI0MDAyMCwKKwkweDAyMDI0MDAwLCAweDAxMDA4MDAwLCAweDA4MDAyMGMwLCAweDAwMjQxMDIwLAorCTB4MDIwMjQwMDAsIDB4MDEwMDgwMDgsIDB4MDgwODIwYzAsIDB4MTAyNDEwMjAsCisJMHgwMDAwMDQwMCwgMHgwNDAwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDAwMDAwNCwKKwkweDAwMDAwNDAwLCAweDA0MDAwMDA4LCAweDAwMTgwMDAwLCAweDEwMDAwMDA0LAorCTB4MDIwMDA0MDAsIDB4MDQwMDAwMDAsIDB4MDAxMDAwODAsIDB4MDAwMDEwMDQsCisJMHgwMjAwMDQwMCwgMHgwNDAwMDAwOCwgMHgwMDE4MDA4MCwgMHgxMDAwMTAwNCwKKwkweDAwMDA0NDAwLCAweDA0MDAwMDAwLCAweDAwMTAwMDQwLCAweDAwMDQwMDA0LAorCTB4MDAwMDQ0MDAsIDB4MDQwMDAwMDgsIDB4MDAxODAwNDAsIDB4MTAwNDAwMDQsCisJMHgwMjAwNDQwMCwgMHgwNDAwMDAwMCwgMHgwMDEwMDBjMCwgMHgwMDA0MTAwNCwKKwkweDAyMDA0NDAwLCAweDA0MDAwMDA4LCAweDAwMTgwMGMwLCAweDEwMDQxMDA0LAorCTB4MDAwMjA0MDAsIDB4MDQwMDgwMDAsIDB4MDgxMDAwMDAsIDB4MDAyMDAwMDQsCisJMHgwMDAyMDQwMCwgMHgwNDAwODAwOCwgMHgwODE4MDAwMCwgMHgxMDIwMDAwNCwKKwkweDAyMDIwNDAwLCAweDA0MDA4MDAwLCAweDA4MTAwMDgwLCAweDAwMjAxMDA0LAorCTB4MDIwMjA0MDAsIDB4MDQwMDgwMDgsIDB4MDgxODAwODAsIDB4MTAyMDEwMDQsCisJMHgwMDAyNDQwMCwgMHgwNDAwODAwMCwgMHgwODEwMDA0MCwgMHgwMDI0MDAwNCwKKwkweDAwMDI0NDAwLCAweDA0MDA4MDA4LCAweDA4MTgwMDQwLCAweDEwMjQwMDA0LAorCTB4MDIwMjQ0MDAsIDB4MDQwMDgwMDAsIDB4MDgxMDAwYzAsIDB4MDAyNDEwMDQsCisJMHgwMjAyNDQwMCwgMHgwNDAwODAwOCwgMHgwODE4MDBjMCwgMHgxMDI0MTAwNCwKKwkweDAwMDAwNDAwLCAweDA1MDAwMDAwLCAweDAwMTAyMDAwLCAweDAwMDAwMDI0LAorCTB4MDAwMDA0MDAsIDB4MDUwMDAwMDgsIDB4MDAxODIwMDAsIDB4MTAwMDAwMjQsCisJMHgwMjAwMDQwMCwgMHgwNTAwMDAwMCwgMHgwMDEwMjA4MCwgMHgwMDAwMTAyNCwKKwkweDAyMDAwNDAwLCAweDA1MDAwMDA4LCAweDAwMTgyMDgwLCAweDEwMDAxMDI0LAorCTB4MDAwMDQ0MDAsIDB4MDUwMDAwMDAsIDB4MDAxMDIwNDAsIDB4MDAwNDAwMjQsCisJMHgwMDAwNDQwMCwgMHgwNTAwMDAwOCwgMHgwMDE4MjA0MCwgMHgxMDA0MDAyNCwKKwkweDAyMDA0NDAwLCAweDA1MDAwMDAwLCAweDAwMTAyMGMwLCAweDAwMDQxMDI0LAorCTB4MDIwMDQ0MDAsIDB4MDUwMDAwMDgsIDB4MDAxODIwYzAsIDB4MTAwNDEwMjQsCisJMHgwMDAyMDQwMCwgMHgwNTAwODAwMCwgMHgwODEwMjAwMCwgMHgwMDIwMDAyNCwKKwkweDAwMDIwNDAwLCAweDA1MDA4MDA4LCAweDA4MTgyMDAwLCAweDEwMjAwMDI0LAorCTB4MDIwMjA0MDAsIDB4MDUwMDgwMDAsIDB4MDgxMDIwODAsIDB4MDAyMDEwMjQsCisJMHgwMjAyMDQwMCwgMHgwNTAwODAwOCwgMHgwODE4MjA4MCwgMHgxMDIwMTAyNCwKKwkweDAwMDI0NDAwLCAweDA1MDA4MDAwLCAweDA4MTAyMDQwLCAweDAwMjQwMDI0LAorCTB4MDAwMjQ0MDAsIDB4MDUwMDgwMDgsIDB4MDgxODIwNDAsIDB4MTAyNDAwMjQsCisJMHgwMjAyNDQwMCwgMHgwNTAwODAwMCwgMHgwODEwMjBjMCwgMHgwMDI0MTAyNCwKKwkweDAyMDI0NDAwLCAweDA1MDA4MDA4LCAweDA4MTgyMGMwLCAweDEwMjQxMDI0LAorCTB4MDAwMDA4MDAsIDB4MDAwMTAwMDAsIDB4MjAwMDAwMDAsIDB4MDAwMDAwMTAsCisJMHgwMDAwMDgwMCwgMHgwMDAxMDAwOCwgMHgyMDA4MDAwMCwgMHgxMDAwMDAxMCwKKwkweDAyMDAwODAwLCAweDAwMDEwMDAwLCAweDIwMDAwMDgwLCAweDAwMDAxMDEwLAorCTB4MDIwMDA4MDAsIDB4MDAwMTAwMDgsIDB4MjAwODAwODAsIDB4MTAwMDEwMTAsCisJMHgwMDAwNDgwMCwgMHgwMDAxMDAwMCwgMHgyMDAwMDA0MCwgMHgwMDA0MDAxMCwKKwkweDAwMDA0ODAwLCAweDAwMDEwMDA4LCAweDIwMDgwMDQwLCAweDEwMDQwMDEwLAorCTB4MDIwMDQ4MDAsIDB4MDAwMTAwMDAsIDB4MjAwMDAwYzAsIDB4MDAwNDEwMTAsCisJMHgwMjAwNDgwMCwgMHgwMDAxMDAwOCwgMHgyMDA4MDBjMCwgMHgxMDA0MTAxMCwKKwkweDAwMDIwODAwLCAweDAwMDE4MDAwLCAweDI4MDAwMDAwLCAweDAwMjAwMDEwLAorCTB4MDAwMjA4MDAsIDB4MDAwMTgwMDgsIDB4MjgwODAwMDAsIDB4MTAyMDAwMTAsCisJMHgwMjAyMDgwMCwgMHgwMDAxODAwMCwgMHgyODAwMDA4MCwgMHgwMDIwMTAxMCwKKwkweDAyMDIwODAwLCAweDAwMDE4MDA4LCAweDI4MDgwMDgwLCAweDEwMjAxMDEwLAorCTB4MDAwMjQ4MDAsIDB4MDAwMTgwMDAsIDB4MjgwMDAwNDAsIDB4MDAyNDAwMTAsCisJMHgwMDAyNDgwMCwgMHgwMDAxODAwOCwgMHgyODA4MDA0MCwgMHgxMDI0MDAxMCwKKwkweDAyMDI0ODAwLCAweDAwMDE4MDAwLCAweDI4MDAwMGMwLCAweDAwMjQxMDEwLAorCTB4MDIwMjQ4MDAsIDB4MDAwMTgwMDgsIDB4MjgwODAwYzAsIDB4MTAyNDEwMTAsCisJMHgwMDAwMDgwMCwgMHgwMTAxMDAwMCwgMHgyMDAwMjAwMCwgMHgwMDAwMDAzMCwKKwkweDAwMDAwODAwLCAweDAxMDEwMDA4LCAweDIwMDgyMDAwLCAweDEwMDAwMDMwLAorCTB4MDIwMDA4MDAsIDB4MDEwMTAwMDAsIDB4MjAwMDIwODAsIDB4MDAwMDEwMzAsCisJMHgwMjAwMDgwMCwgMHgwMTAxMDAwOCwgMHgyMDA4MjA4MCwgMHgxMDAwMTAzMCwKKwkweDAwMDA0ODAwLCAweDAxMDEwMDAwLCAweDIwMDAyMDQwLCAweDAwMDQwMDMwLAorCTB4MDAwMDQ4MDAsIDB4MDEwMTAwMDgsIDB4MjAwODIwNDAsIDB4MTAwNDAwMzAsCisJMHgwMjAwNDgwMCwgMHgwMTAxMDAwMCwgMHgyMDAwMjBjMCwgMHgwMDA0MTAzMCwKKwkweDAyMDA0ODAwLCAweDAxMDEwMDA4LCAweDIwMDgyMGMwLCAweDEwMDQxMDMwLAorCTB4MDAwMjA4MDAsIDB4MDEwMTgwMDAsIDB4MjgwMDIwMDAsIDB4MDAyMDAwMzAsCisJMHgwMDAyMDgwMCwgMHgwMTAxODAwOCwgMHgyODA4MjAwMCwgMHgxMDIwMDAzMCwKKwkweDAyMDIwODAwLCAweDAxMDE4MDAwLCAweDI4MDAyMDgwLCAweDAwMjAxMDMwLAorCTB4MDIwMjA4MDAsIDB4MDEwMTgwMDgsIDB4MjgwODIwODAsIDB4MTAyMDEwMzAsCisJMHgwMDAyNDgwMCwgMHgwMTAxODAwMCwgMHgyODAwMjA0MCwgMHgwMDI0MDAzMCwKKwkweDAwMDI0ODAwLCAweDAxMDE4MDA4LCAweDI4MDgyMDQwLCAweDEwMjQwMDMwLAorCTB4MDIwMjQ4MDAsIDB4MDEwMTgwMDAsIDB4MjgwMDIwYzAsIDB4MDAyNDEwMzAsCisJMHgwMjAyNDgwMCwgMHgwMTAxODAwOCwgMHgyODA4MjBjMCwgMHgxMDI0MTAzMCwKKwkweDAwMDAwYzAwLCAweDA0MDEwMDAwLCAweDIwMTAwMDAwLCAweDAwMDAwMDE0LAorCTB4MDAwMDBjMDAsIDB4MDQwMTAwMDgsIDB4MjAxODAwMDAsIDB4MTAwMDAwMTQsCisJMHgwMjAwMGMwMCwgMHgwNDAxMDAwMCwgMHgyMDEwMDA4MCwgMHgwMDAwMTAxNCwKKwkweDAyMDAwYzAwLCAweDA0MDEwMDA4LCAweDIwMTgwMDgwLCAweDEwMDAxMDE0LAorCTB4MDAwMDRjMDAsIDB4MDQwMTAwMDAsIDB4MjAxMDAwNDAsIDB4MDAwNDAwMTQsCisJMHgwMDAwNGMwMCwgMHgwNDAxMDAwOCwgMHgyMDE4MDA0MCwgMHgxMDA0MDAxNCwKKwkweDAyMDA0YzAwLCAweDA0MDEwMDAwLCAweDIwMTAwMGMwLCAweDAwMDQxMDE0LAorCTB4MDIwMDRjMDAsIDB4MDQwMTAwMDgsIDB4MjAxODAwYzAsIDB4MTAwNDEwMTQsCisJMHgwMDAyMGMwMCwgMHgwNDAxODAwMCwgMHgyODEwMDAwMCwgMHgwMDIwMDAxNCwKKwkweDAwMDIwYzAwLCAweDA0MDE4MDA4LCAweDI4MTgwMDAwLCAweDEwMjAwMDE0LAorCTB4MDIwMjBjMDAsIDB4MDQwMTgwMDAsIDB4MjgxMDAwODAsIDB4MDAyMDEwMTQsCisJMHgwMjAyMGMwMCwgMHgwNDAxODAwOCwgMHgyODE4MDA4MCwgMHgxMDIwMTAxNCwKKwkweDAwMDI0YzAwLCAweDA0MDE4MDAwLCAweDI4MTAwMDQwLCAweDAwMjQwMDE0LAorCTB4MDAwMjRjMDAsIDB4MDQwMTgwMDgsIDB4MjgxODAwNDAsIDB4MTAyNDAwMTQsCisJMHgwMjAyNGMwMCwgMHgwNDAxODAwMCwgMHgyODEwMDBjMCwgMHgwMDI0MTAxNCwKKwkweDAyMDI0YzAwLCAweDA0MDE4MDA4LCAweDI4MTgwMGMwLCAweDEwMjQxMDE0LAorCTB4MDAwMDBjMDAsIDB4MDUwMTAwMDAsIDB4MjAxMDIwMDAsIDB4MDAwMDAwMzQsCisJMHgwMDAwMGMwMCwgMHgwNTAxMDAwOCwgMHgyMDE4MjAwMCwgMHgxMDAwMDAzNCwKKwkweDAyMDAwYzAwLCAweDA1MDEwMDAwLCAweDIwMTAyMDgwLCAweDAwMDAxMDM0LAorCTB4MDIwMDBjMDAsIDB4MDUwMTAwMDgsIDB4MjAxODIwODAsIDB4MTAwMDEwMzQsCisJMHgwMDAwNGMwMCwgMHgwNTAxMDAwMCwgMHgyMDEwMjA0MCwgMHgwMDA0MDAzNCwKKwkweDAwMDA0YzAwLCAweDA1MDEwMDA4LCAweDIwMTgyMDQwLCAweDEwMDQwMDM0LAorCTB4MDIwMDRjMDAsIDB4MDUwMTAwMDAsIDB4MjAxMDIwYzAsIDB4MDAwNDEwMzQsCisJMHgwMjAwNGMwMCwgMHgwNTAxMDAwOCwgMHgyMDE4MjBjMCwgMHgxMDA0MTAzNCwKKwkweDAwMDIwYzAwLCAweDA1MDE4MDAwLCAweDI4MTAyMDAwLCAweDAwMjAwMDM0LAorCTB4MDAwMjBjMDAsIDB4MDUwMTgwMDgsIDB4MjgxODIwMDAsIDB4MTAyMDAwMzQsCisJMHgwMjAyMGMwMCwgMHgwNTAxODAwMCwgMHgyODEwMjA4MCwgMHgwMDIwMTAzNCwKKwkweDAyMDIwYzAwLCAweDA1MDE4MDA4LCAweDI4MTgyMDgwLCAweDEwMjAxMDM0LAorCTB4MDAwMjRjMDAsIDB4MDUwMTgwMDAsIDB4MjgxMDIwNDAsIDB4MDAyNDAwMzQsCisJMHgwMDAyNGMwMCwgMHgwNTAxODAwOCwgMHgyODE4MjA0MCwgMHgxMDI0MDAzNCwKKwkweDAyMDI0YzAwLCAweDA1MDE4MDAwLCAweDI4MTAyMGMwLCAweDAwMjQxMDM0LAorCTB4MDIwMjRjMDAsIDB4MDUwMTgwMDgsIDB4MjgxODIwYzAsIDB4MTAyNDEwMzQKIH07CiAKKy8qIFMtYm94IGxvb2t1cCB0YWJsZXMgKi8KIAotc3RhdGljIHZvaWQgZGVzX3NtYWxsX2ZpcHNfZW5jcnlwdCh1MzIgKmV4cGtleSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyBjb25zdCB1MzIgUzFbNjRdID0geworCTB4MDEwMTA0MDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAwMDAsIDB4MDEwMTA0MDQsCisJMHgwMTAxMDAwNCwgMHgwMDAxMDQwNCwgMHgwMDAwMDAwNCwgMHgwMDAxMDAwMCwKKwkweDAwMDAwNDAwLCAweDAxMDEwNDAwLCAweDAxMDEwNDA0LCAweDAwMDAwNDAwLAorCTB4MDEwMDA0MDQsIDB4MDEwMTAwMDQsIDB4MDEwMDAwMDAsIDB4MDAwMDAwMDQsCisJMHgwMDAwMDQwNCwgMHgwMTAwMDQwMCwgMHgwMTAwMDQwMCwgMHgwMDAxMDQwMCwKKwkweDAwMDEwNDAwLCAweDAxMDEwMDAwLCAweDAxMDEwMDAwLCAweDAxMDAwNDA0LAorCTB4MDAwMTAwMDQsIDB4MDEwMDAwMDQsIDB4MDEwMDAwMDQsIDB4MDAwMTAwMDQsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDQwNCwgMHgwMDAxMDQwNCwgMHgwMTAwMDAwMCwKKwkweDAwMDEwMDAwLCAweDAxMDEwNDA0LCAweDAwMDAwMDA0LCAweDAxMDEwMDAwLAorCTB4MDEwMTA0MDAsIDB4MDEwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMDA0MDAsCisJMHgwMTAxMDAwNCwgMHgwMDAxMDAwMCwgMHgwMDAxMDQwMCwgMHgwMTAwMDAwNCwKKwkweDAwMDAwNDAwLCAweDAwMDAwMDA0LCAweDAxMDAwNDA0LCAweDAwMDEwNDA0LAorCTB4MDEwMTA0MDQsIDB4MDAwMTAwMDQsIDB4MDEwMTAwMDAsIDB4MDEwMDA0MDQsCisJMHgwMTAwMDAwNCwgMHgwMDAwMDQwNCwgMHgwMDAxMDQwNCwgMHgwMTAxMDQwMCwKKwkweDAwMDAwNDA0LCAweDAxMDAwNDAwLCAweDAxMDAwNDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMTAwMDQsIDB4MDAwMTA0MDAsIDB4MDAwMDAwMDAsIDB4MDEwMTAwMDQKK307CisKK3N0YXRpYyBjb25zdCB1MzIgUzJbNjRdID0geworCTB4ODAxMDgwMjAsIDB4ODAwMDgwMDAsIDB4MDAwMDgwMDAsIDB4MDAxMDgwMjAsCisJMHgwMDEwMDAwMCwgMHgwMDAwMDAyMCwgMHg4MDEwMDAyMCwgMHg4MDAwODAyMCwKKwkweDgwMDAwMDIwLCAweDgwMTA4MDIwLCAweDgwMTA4MDAwLCAweDgwMDAwMDAwLAorCTB4ODAwMDgwMDAsIDB4MDAxMDAwMDAsIDB4MDAwMDAwMjAsIDB4ODAxMDAwMjAsCisJMHgwMDEwODAwMCwgMHgwMDEwMDAyMCwgMHg4MDAwODAyMCwgMHgwMDAwMDAwMCwKKwkweDgwMDAwMDAwLCAweDAwMDA4MDAwLCAweDAwMTA4MDIwLCAweDgwMTAwMDAwLAorCTB4MDAxMDAwMjAsIDB4ODAwMDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAxMDgwMDAsCisJMHgwMDAwODAyMCwgMHg4MDEwODAwMCwgMHg4MDEwMDAwMCwgMHgwMDAwODAyMCwKKwkweDAwMDAwMDAwLCAweDAwMTA4MDIwLCAweDgwMTAwMDIwLCAweDAwMTAwMDAwLAorCTB4ODAwMDgwMjAsIDB4ODAxMDAwMDAsIDB4ODAxMDgwMDAsIDB4MDAwMDgwMDAsCisJMHg4MDEwMDAwMCwgMHg4MDAwODAwMCwgMHgwMDAwMDAyMCwgMHg4MDEwODAyMCwKKwkweDAwMTA4MDIwLCAweDAwMDAwMDIwLCAweDAwMDA4MDAwLCAweDgwMDAwMDAwLAorCTB4MDAwMDgwMjAsIDB4ODAxMDgwMDAsIDB4MDAxMDAwMDAsIDB4ODAwMDAwMjAsCisJMHgwMDEwMDAyMCwgMHg4MDAwODAyMCwgMHg4MDAwMDAyMCwgMHgwMDEwMDAyMCwKKwkweDAwMTA4MDAwLCAweDAwMDAwMDAwLCAweDgwMDA4MDAwLCAweDAwMDA4MDIwLAorCTB4ODAwMDAwMDAsIDB4ODAxMDAwMjAsIDB4ODAxMDgwMjAsIDB4MDAxMDgwMDAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgUzNbNjRdID0geworCTB4MDAwMDAyMDgsIDB4MDgwMjAyMDAsIDB4MDAwMDAwMDAsIDB4MDgwMjAwMDgsCisJMHgwODAwMDIwMCwgMHgwMDAwMDAwMCwgMHgwMDAyMDIwOCwgMHgwODAwMDIwMCwKKwkweDAwMDIwMDA4LCAweDA4MDAwMDA4LCAweDA4MDAwMDA4LCAweDAwMDIwMDAwLAorCTB4MDgwMjAyMDgsIDB4MDAwMjAwMDgsIDB4MDgwMjAwMDAsIDB4MDAwMDAyMDgsCisJMHgwODAwMDAwMCwgMHgwMDAwMDAwOCwgMHgwODAyMDIwMCwgMHgwMDAwMDIwMCwKKwkweDAwMDIwMjAwLCAweDA4MDIwMDAwLCAweDA4MDIwMDA4LCAweDAwMDIwMjA4LAorCTB4MDgwMDAyMDgsIDB4MDAwMjAyMDAsIDB4MDAwMjAwMDAsIDB4MDgwMDAyMDgsCisJMHgwMDAwMDAwOCwgMHgwODAyMDIwOCwgMHgwMDAwMDIwMCwgMHgwODAwMDAwMCwKKwkweDA4MDIwMjAwLCAweDA4MDAwMDAwLCAweDAwMDIwMDA4LCAweDAwMDAwMjA4LAorCTB4MDAwMjAwMDAsIDB4MDgwMjAyMDAsIDB4MDgwMDAyMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDIwMCwgMHgwMDAyMDAwOCwgMHgwODAyMDIwOCwgMHgwODAwMDIwMCwKKwkweDA4MDAwMDA4LCAweDAwMDAwMjAwLCAweDAwMDAwMDAwLCAweDA4MDIwMDA4LAorCTB4MDgwMDAyMDgsIDB4MDAwMjAwMDAsIDB4MDgwMDAwMDAsIDB4MDgwMjAyMDgsCisJMHgwMDAwMDAwOCwgMHgwMDAyMDIwOCwgMHgwMDAyMDIwMCwgMHgwODAwMDAwOCwKKwkweDA4MDIwMDAwLCAweDA4MDAwMjA4LCAweDAwMDAwMjA4LCAweDA4MDIwMDAwLAorCTB4MDAwMjAyMDgsIDB4MDAwMDAwMDgsIDB4MDgwMjAwMDgsIDB4MDAwMjAyMDAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgUzRbNjRdID0geworCTB4MDA4MDIwMDEsIDB4MDAwMDIwODEsIDB4MDAwMDIwODEsIDB4MDAwMDAwODAsCisJMHgwMDgwMjA4MCwgMHgwMDgwMDA4MSwgMHgwMDgwMDAwMSwgMHgwMDAwMjAwMSwKKwkweDAwMDAwMDAwLCAweDAwODAyMDAwLCAweDAwODAyMDAwLCAweDAwODAyMDgxLAorCTB4MDAwMDAwODEsIDB4MDAwMDAwMDAsIDB4MDA4MDAwODAsIDB4MDA4MDAwMDEsCisJMHgwMDAwMDAwMSwgMHgwMDAwMjAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMjAwMSwKKwkweDAwMDAwMDgwLCAweDAwODAwMDAwLCAweDAwMDAyMDAxLCAweDAwMDAyMDgwLAorCTB4MDA4MDAwODEsIDB4MDAwMDAwMDEsIDB4MDAwMDIwODAsIDB4MDA4MDAwODAsCisJMHgwMDAwMjAwMCwgMHgwMDgwMjA4MCwgMHgwMDgwMjA4MSwgMHgwMDAwMDA4MSwKKwkweDAwODAwMDgwLCAweDAwODAwMDAxLCAweDAwODAyMDAwLCAweDAwODAyMDgxLAorCTB4MDAwMDAwODEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDA4MDIwMDAsCisJMHgwMDAwMjA4MCwgMHgwMDgwMDA4MCwgMHgwMDgwMDA4MSwgMHgwMDAwMDAwMSwKKwkweDAwODAyMDAxLCAweDAwMDAyMDgxLCAweDAwMDAyMDgxLCAweDAwMDAwMDgwLAorCTB4MDA4MDIwODEsIDB4MDAwMDAwODEsIDB4MDAwMDAwMDEsIDB4MDAwMDIwMDAsCisJMHgwMDgwMDAwMSwgMHgwMDAwMjAwMSwgMHgwMDgwMjA4MCwgMHgwMDgwMDA4MSwKKwkweDAwMDAyMDAxLCAweDAwMDAyMDgwLCAweDAwODAwMDAwLCAweDAwODAyMDAxLAorCTB4MDAwMDAwODAsIDB4MDA4MDAwMDAsIDB4MDAwMDIwMDAsIDB4MDA4MDIwODAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgUzVbNjRdID0geworCTB4MDAwMDAxMDAsIDB4MDIwODAxMDAsIDB4MDIwODAwMDAsIDB4NDIwMDAxMDAsCisJMHgwMDA4MDAwMCwgMHgwMDAwMDEwMCwgMHg0MDAwMDAwMCwgMHgwMjA4MDAwMCwKKwkweDQwMDgwMTAwLCAweDAwMDgwMDAwLCAweDAyMDAwMTAwLCAweDQwMDgwMTAwLAorCTB4NDIwMDAxMDAsIDB4NDIwODAwMDAsIDB4MDAwODAxMDAsIDB4NDAwMDAwMDAsCisJMHgwMjAwMDAwMCwgMHg0MDA4MDAwMCwgMHg0MDA4MDAwMCwgMHgwMDAwMDAwMCwKKwkweDQwMDAwMTAwLCAweDQyMDgwMTAwLCAweDQyMDgwMTAwLCAweDAyMDAwMTAwLAorCTB4NDIwODAwMDAsIDB4NDAwMDAxMDAsIDB4MDAwMDAwMDAsIDB4NDIwMDAwMDAsCisJMHgwMjA4MDEwMCwgMHgwMjAwMDAwMCwgMHg0MjAwMDAwMCwgMHgwMDA4MDEwMCwKKwkweDAwMDgwMDAwLCAweDQyMDAwMTAwLCAweDAwMDAwMTAwLCAweDAyMDAwMDAwLAorCTB4NDAwMDAwMDAsIDB4MDIwODAwMDAsIDB4NDIwMDAxMDAsIDB4NDAwODAxMDAsCisJMHgwMjAwMDEwMCwgMHg0MDAwMDAwMCwgMHg0MjA4MDAwMCwgMHgwMjA4MDEwMCwKKwkweDQwMDgwMTAwLCAweDAwMDAwMTAwLCAweDAyMDAwMDAwLCAweDQyMDgwMDAwLAorCTB4NDIwODAxMDAsIDB4MDAwODAxMDAsIDB4NDIwMDAwMDAsIDB4NDIwODAxMDAsCisJMHgwMjA4MDAwMCwgMHgwMDAwMDAwMCwgMHg0MDA4MDAwMCwgMHg0MjAwMDAwMCwKKwkweDAwMDgwMTAwLCAweDAyMDAwMTAwLCAweDQwMDAwMTAwLCAweDAwMDgwMDAwLAorCTB4MDAwMDAwMDAsIDB4NDAwODAwMDAsIDB4MDIwODAxMDAsIDB4NDAwMDAxMDAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgUzZbNjRdID0geworCTB4MjAwMDAwMTAsIDB4MjA0MDAwMDAsIDB4MDAwMDQwMDAsIDB4MjA0MDQwMTAsCisJMHgyMDQwMDAwMCwgMHgwMDAwMDAxMCwgMHgyMDQwNDAxMCwgMHgwMDQwMDAwMCwKKwkweDIwMDA0MDAwLCAweDAwNDA0MDEwLCAweDAwNDAwMDAwLCAweDIwMDAwMDEwLAorCTB4MDA0MDAwMTAsIDB4MjAwMDQwMDAsIDB4MjAwMDAwMDAsIDB4MDAwMDQwMTAsCisJMHgwMDAwMDAwMCwgMHgwMDQwMDAxMCwgMHgyMDAwNDAxMCwgMHgwMDAwNDAwMCwKKwkweDAwNDA0MDAwLCAweDIwMDA0MDEwLCAweDAwMDAwMDEwLCAweDIwNDAwMDEwLAorCTB4MjA0MDAwMTAsIDB4MDAwMDAwMDAsIDB4MDA0MDQwMTAsIDB4MjA0MDQwMDAsCisJMHgwMDAwNDAxMCwgMHgwMDQwNDAwMCwgMHgyMDQwNDAwMCwgMHgyMDAwMDAwMCwKKwkweDIwMDA0MDAwLCAweDAwMDAwMDEwLCAweDIwNDAwMDEwLCAweDAwNDA0MDAwLAorCTB4MjA0MDQwMTAsIDB4MDA0MDAwMDAsIDB4MDAwMDQwMTAsIDB4MjAwMDAwMTAsCisJMHgwMDQwMDAwMCwgMHgyMDAwNDAwMCwgMHgyMDAwMDAwMCwgMHgwMDAwNDAxMCwKKwkweDIwMDAwMDEwLCAweDIwNDA0MDEwLCAweDAwNDA0MDAwLCAweDIwNDAwMDAwLAorCTB4MDA0MDQwMTAsIDB4MjA0MDQwMDAsIDB4MDAwMDAwMDAsIDB4MjA0MDAwMTAsCisJMHgwMDAwMDAxMCwgMHgwMDAwNDAwMCwgMHgyMDQwMDAwMCwgMHgwMDQwNDAxMCwKKwkweDAwMDA0MDAwLCAweDAwNDAwMDEwLCAweDIwMDA0MDEwLCAweDAwMDAwMDAwLAorCTB4MjA0MDQwMDAsIDB4MjAwMDAwMDAsIDB4MDA0MDAwMTAsIDB4MjAwMDQwMTAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgUzdbNjRdID0geworCTB4MDAyMDAwMDAsIDB4MDQyMDAwMDIsIDB4MDQwMDA4MDIsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDgwMCwgMHgwNDAwMDgwMiwgMHgwMDIwMDgwMiwgMHgwNDIwMDgwMCwKKwkweDA0MjAwODAyLCAweDAwMjAwMDAwLCAweDAwMDAwMDAwLCAweDA0MDAwMDAyLAorCTB4MDAwMDAwMDIsIDB4MDQwMDAwMDAsIDB4MDQyMDAwMDIsIDB4MDAwMDA4MDIsCisJMHgwNDAwMDgwMCwgMHgwMDIwMDgwMiwgMHgwMDIwMDAwMiwgMHgwNDAwMDgwMCwKKwkweDA0MDAwMDAyLCAweDA0MjAwMDAwLCAweDA0MjAwODAwLCAweDAwMjAwMDAyLAorCTB4MDQyMDAwMDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDIsIDB4MDQyMDA4MDIsCisJMHgwMDIwMDgwMCwgMHgwMDAwMDAwMiwgMHgwNDAwMDAwMCwgMHgwMDIwMDgwMCwKKwkweDA0MDAwMDAwLCAweDAwMjAwODAwLCAweDAwMjAwMDAwLCAweDA0MDAwODAyLAorCTB4MDQwMDA4MDIsIDB4MDQyMDAwMDIsIDB4MDQyMDAwMDIsIDB4MDAwMDAwMDIsCisJMHgwMDIwMDAwMiwgMHgwNDAwMDAwMCwgMHgwNDAwMDgwMCwgMHgwMDIwMDAwMCwKKwkweDA0MjAwODAwLCAweDAwMDAwODAyLCAweDAwMjAwODAyLCAweDA0MjAwODAwLAorCTB4MDAwMDA4MDIsIDB4MDQwMDAwMDIsIDB4MDQyMDA4MDIsIDB4MDQyMDAwMDAsCisJMHgwMDIwMDgwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwNDIwMDgwMiwKKwkweDAwMDAwMDAwLCAweDAwMjAwODAyLCAweDA0MjAwMDAwLCAweDAwMDAwODAwLAorCTB4MDQwMDAwMDIsIDB4MDQwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAyMDAwMDIKK307CisKK3N0YXRpYyBjb25zdCB1MzIgUzhbNjRdID0geworCTB4MTAwMDEwNDAsIDB4MDAwMDEwMDAsIDB4MDAwNDAwMDAsIDB4MTAwNDEwNDAsCisJMHgxMDAwMDAwMCwgMHgxMDAwMTA0MCwgMHgwMDAwMDA0MCwgMHgxMDAwMDAwMCwKKwkweDAwMDQwMDQwLCAweDEwMDQwMDAwLCAweDEwMDQxMDQwLCAweDAwMDQxMDAwLAorCTB4MTAwNDEwMDAsIDB4MDAwNDEwNDAsIDB4MDAwMDEwMDAsIDB4MDAwMDAwNDAsCisJMHgxMDA0MDAwMCwgMHgxMDAwMDA0MCwgMHgxMDAwMTAwMCwgMHgwMDAwMTA0MCwKKwkweDAwMDQxMDAwLCAweDAwMDQwMDQwLCAweDEwMDQwMDQwLCAweDEwMDQxMDAwLAorCTB4MDAwMDEwNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MTAwNDAwNDAsCisJMHgxMDAwMDA0MCwgMHgxMDAwMTAwMCwgMHgwMDA0MTA0MCwgMHgwMDA0MDAwMCwKKwkweDAwMDQxMDQwLCAweDAwMDQwMDAwLCAweDEwMDQxMDAwLCAweDAwMDAxMDAwLAorCTB4MDAwMDAwNDAsIDB4MTAwNDAwNDAsIDB4MDAwMDEwMDAsIDB4MDAwNDEwNDAsCisJMHgxMDAwMTAwMCwgMHgwMDAwMDA0MCwgMHgxMDAwMDA0MCwgMHgxMDA0MDAwMCwKKwkweDEwMDQwMDQwLCAweDEwMDAwMDAwLCAweDAwMDQwMDAwLCAweDEwMDAxMDQwLAorCTB4MDAwMDAwMDAsIDB4MTAwNDEwNDAsIDB4MDAwNDAwNDAsIDB4MTAwMDAwNDAsCisJMHgxMDA0MDAwMCwgMHgxMDAwMTAwMCwgMHgxMDAwMTA0MCwgMHgwMDAwMDAwMCwKKwkweDEwMDQxMDQwLCAweDAwMDQxMDAwLCAweDAwMDQxMDAwLCAweDAwMDAxMDQwLAorCTB4MDAwMDEwNDAsIDB4MDAwNDAwNDAsIDB4MTAwMDAwMDAsIDB4MTAwNDEwMDAKK307CisKKy8qIEVuY3J5cHRpb24gY29tcG9uZW50czogSVAsIEZQLCBhbmQgcm91bmQgZnVuY3Rpb24gKi8KKworI2RlZmluZSBJUChMLCBSLCBUKQkJXAorCVJPTChSLCA0KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGYwZjBmMGYwOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChSLCAxMik7CQlcCisJVCAgPSBMOwkJCVwKKwlMIF49IFI7CQkJXAorCUwgJj0gMHhmZmZmMDAwMDsJXAorCVIgXj0gTDsJCQlcCisJTCBePSBUOwkJCVwKKwlST1IoUiwgMTQpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4Y2NjY2NjY2M7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9MKFIsIDYpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4ZmYwMGZmMDA7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9SKFIsIDcpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4YWFhYWFhYWE7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9MKEwsIDEpOworCisjZGVmaW5lIEZQKEwsIFIsIFQpCQlcCisJUk9SKEwsIDEpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4YWFhYWFhYWE7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9MKFIsIDcpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4ZmYwMGZmMDA7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9SKFIsIDYpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4Y2NjY2NjY2M7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9MKFIsIDE0KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGZmZmYwMDAwOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPUihSLCAxMik7CQlcCisJVCAgPSBMOwkJCVwKKwlMIF49IFI7CQkJXAorCUwgJj0gMHhmMGYwZjBmMDsJXAorCVIgXj0gTDsJCQlcCisJTCBePSBUOwkJCVwKKwlST1IoUiwgNCk7CisKKyNkZWZpbmUgUk9VTkQoTCwgUiwgQSwgQiwgSywgZCkJCQkJCVwKKwlCID0gS1swXTsJCQlBID0gS1sxXTsJSyArPSBkOwlcCisJQiBePSBSOwkJCQlBIF49IFI7CQkJXAorCUIgJj0gMHgzZjNmM2YzZjsJCVJPUihBLCA0KTsJCVwKKwlMIF49IFM4WzB4ZmYgJiBCXTsJCUEgJj0gMHgzZjNmM2YzZjsJXAorCUwgXj0gUzZbMHhmZiAmIChCID4+IDgpXTsJQiA+Pj0gMTY7CQlcCisJTCBePSBTN1sweGZmICYgQV07CQkJCQlcCisJTCBePSBTNVsweGZmICYgKEEgPj4gOCldOwlBID4+PSAxNjsJCVwKKwlMIF49IFM0WzB4ZmYgJiBCXTsJCQkJCVwKKwlMIF49IFMyWzB4ZmYgJiAoQiA+PiA4KV07CQkJCVwKKwlMIF49IFMzWzB4ZmYgJiBBXTsJCQkJCVwKKwlMIF49IFMxWzB4ZmYgJiAoQSA+PiA4KV07CisKKy8qCisgKiBQQzIgbG9va3VwIHRhYmxlcyBhcmUgb3JnYW5pemVkIGFzIDIgY29uc2VjdXRpdmUgc2V0cyBvZiA0IGludGVybGVhdmVkCisgKiB0YWJsZXMgb2YgMTI4IGVsZW1lbnRzLiAgT25lIHNldCBpcyBmb3IgQ19pIGFuZCB0aGUgb3RoZXIgZm9yIERfaSwgd2hpbGUKKyAqIHRoZSA0IGludGVybGVhdmVkIHRhYmxlcyBjb3JyZXNwb25kIHRvIGZvdXIgNy1iaXQgc3Vic2V0cyBvZiBDX2kgb3IgRF9pLgorICoKKyAqIEFmdGVyIFBDMSBlYWNoIG9mIHRoZSB2YXJpYWJsZXMgYSxiLGMsZCBjb250YWlucyBhIDcgYml0IHN1YnNldCBvZiBDX2kKKyAqIG9yIERfaSBpbiBiaXRzIDctMSAoYml0IDAgYmVpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50KS4KKyAqLworCisjZGVmaW5lIFQxKHgpIHB0WzIgKiAoeCkgKyAwXQorI2RlZmluZSBUMih4KSBwdFsyICogKHgpICsgMV0KKyNkZWZpbmUgVDMoeCkgcHRbMiAqICh4KSArIDJdCisjZGVmaW5lIFQ0KHgpIHB0WzIgKiAoeCkgKyAzXQorCisjZGVmaW5lIFBDMihhLCBiLCBjLCBkKSAoVDQoZCkgfCBUMyhjKSB8IFQyKGIpIHwgVDEoYSkpCisKKy8qCisgKiBFbmNyeXB0aW9uIGtleSBleHBhbnNpb24KKyAqCisgKiBSRkMyNDUxOiBXZWFrIGtleSBjaGVja3MgU0hPVUxEIGJlIHBlcmZvcm1lZC4KKyAqCisgKiBGSVBTIDc0OgorICoKKyAqICAgS2V5cyBoYXZpbmcgZHVhbHMgYXJlIGtleXMgd2hpY2ggcHJvZHVjZSBhbGwgemVyb3MsIGFsbCBvbmVzLCBvcgorICogICBhbHRlcm5hdGluZyB6ZXJvLW9uZSBwYXR0ZXJucyBpbiB0aGUgQyBhbmQgRCByZWdpc3RlcnMgYWZ0ZXIgUGVybXV0ZWQKKyAqICAgQ2hvaWNlIDEgaGFzIG9wZXJhdGVkIG9uIHRoZSBrZXkuCisgKgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBla2V5KHUzMiAqcGUsIGNvbnN0IHU4ICprKQogewotCXUzMiB4LCB5LCB6OwotCQotCXggID0gc3JjWzddOwotCXggPDw9IDg7Ci0JeCB8PSBzcmNbNl07Ci0JeCA8PD0gODsKLQl4IHw9IHNyY1s1XTsKLQl4IDw8PSA4OwotCXggfD0gc3JjWzRdOwotCXkgID0gc3JjWzNdOwotCXkgPDw9IDg7Ci0JeSB8PSBzcmNbMl07Ci0JeSA8PD0gODsKLQl5IHw9IHNyY1sxXTsKLQl5IDw8PSA4OwotCXkgfD0gc3JjWzBdOwotCXogID0gKCh4ID4+IDAwNCkgXiB5KSAmIDB4MEYwRjBGMEZMOwotCXggXj0geiA8PCAwMDQ7Ci0JeSBePSB6OwotCXogID0gKCh5ID4+IDAyMCkgXiB4KSAmIDB4MDAwMEZGRkZMOwotCXkgXj0geiA8PCAwMjA7Ci0JeCBePSB6OwotCXogID0gKCh4ID4+IDAwMikgXiB5KSAmIDB4MzMzMzMzMzNMOwotCXggXj0geiA8PCAwMDI7Ci0JeSBePSB6OwotCXogID0gKCh5ID4+IDAxMCkgXiB4KSAmIDB4MDBGRjAwRkZMOwotCXkgXj0geiA8PCAwMTA7Ci0JeCBePSB6OwotCXggID0geCA+PiAxIHwgeCA8PCAzMTsKLQl6ICA9ICh4IF4geSkgJiAweDU1NTU1NTU1TDsKLQl5IF49IHo7Ci0JeCBePSB6OwotCXkgID0geSA+PiAxIHwgeSA8PCAzMTsKLQl6ICA9IGV4cGtleVswXTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxXTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbM107Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzRdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzVdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs2XTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs3XTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbOF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbOV07Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzEwXTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxMV07Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzEyXTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxM107Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE0XTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxNV07Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE2XTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxN107Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE4XTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxOV07Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzIwXTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyMV07Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzIyXTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyM107Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI0XTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyNV07Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI2XTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyN107Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI4XTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyOV07Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzMwXTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVszMV07Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXggID0geCA8PCAxIHwgeCA+PiAzMTsKLQl6ICA9ICh4IF4geSkgJiAweDU1NTU1NTU1TDsKLQl5IF49IHo7Ci0JeCBePSB6OwotCXkgID0geSA8PCAxIHwgeSA+PiAzMTsKLQl6ICA9ICgoeCA+PiAwMTApIF4geSkgJiAweDAwRkYwMEZGTDsKLQl4IF49IHogPDwgMDEwOwotCXkgXj0gejsKLQl6ICA9ICgoeSA+PiAwMDIpIF4geCkgJiAweDMzMzMzMzMzTDsKLQl5IF49IHogPDwgMDAyOwotCXggXj0gejsKLQl6ICA9ICgoeCA+PiAwMjApIF4geSkgJiAweDAwMDBGRkZGTDsKLQl4IF49IHogPDwgMDIwOwotCXkgXj0gejsKLQl6ICA9ICgoeSA+PiAwMDQpIF4geCkgJiAweDBGMEYwRjBGTDsKLQl5IF49IHogPDwgMDA0OwotCXggXj0gejsKLQlkc3RbMF0gPSB4OwotCXggPj49IDg7Ci0JZHN0WzFdID0geDsKLQl4ID4+PSA4OwotCWRzdFsyXSA9IHg7Ci0JeCA+Pj0gODsKLQlkc3RbM10gPSB4OwotCWRzdFs0XSA9IHk7Ci0JeSA+Pj0gODsKLQlkc3RbNV0gPSB5OwotCXkgPj49IDg7Ci0JZHN0WzZdID0geTsKLQl5ID4+PSA4OwotCWRzdFs3XSA9IHk7Ci19CisJLyogSyZSOiBsb25nIGlzIGF0IGxlYXN0IDMyIGJpdHMgKi8KKwl1bnNpZ25lZCBsb25nIGEsIGIsIGMsIGQsIHc7CisJY29uc3QgdTMyICpwdCA9IHBjMjsKIAotc3RhdGljIHZvaWQgZGVzX3NtYWxsX2ZpcHNfZGVjcnlwdCh1MzIgKmV4cGtleSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKLXsKLQl1MzIgeCwgeSwgejsKLQkKLQl4ICA9IHNyY1s3XTsKLQl4IDw8PSA4OwotCXggfD0gc3JjWzZdOwotCXggPDw9IDg7Ci0JeCB8PSBzcmNbNV07Ci0JeCA8PD0gODsKLQl4IHw9IHNyY1s0XTsKLQl5ICA9IHNyY1szXTsKLQl5IDw8PSA4OwotCXkgfD0gc3JjWzJdOwotCXkgPDw9IDg7Ci0JeSB8PSBzcmNbMV07Ci0JeSA8PD0gODsKLQl5IHw9IHNyY1swXTsKLQl6ICA9ICgoeCA+PiAwMDQpIF4geSkgJiAweDBGMEYwRjBGTDsKLQl4IF49IHogPDwgMDA0OwotCXkgXj0gejsKLQl6ICA9ICgoeSA+PiAwMjApIF4geCkgJiAweDAwMDBGRkZGTDsKLQl5IF49IHogPDwgMDIwOwotCXggXj0gejsKLQl6ICA9ICgoeCA+PiAwMDIpIF4geSkgJiAweDMzMzMzMzMzTDsKLQl4IF49IHogPDwgMDAyOwotCXkgXj0gejsKLQl6ICA9ICgoeSA+PiAwMTApIF4geCkgJiAweDAwRkYwMEZGTDsKLQl5IF49IHogPDwgMDEwOwotCXggXj0gejsKLQl4ICA9IHggPj4gMSB8IHggPDwgMzE7Ci0JeiAgPSAoeCBeIHkpICYgMHg1NTU1NTU1NUw7Ci0JeSBePSB6OwotCXggXj0gejsKLQl5ICA9IHkgPj4gMSB8IHkgPDwgMzE7Ci0JeiAgPSBleHBrZXlbMzFdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVszMF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjldOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyOF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjddOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyNl07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjVdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyNF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjNdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyMl07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjFdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyMF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTldOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxOF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTddOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxNl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTVdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxNF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTNdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxMl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTFdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxMF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbOV07Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzhdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzddOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs2XTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs1XTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbNF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbM107Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzJdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzFdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVswXTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl4ICA9IHggPDwgMSB8IHggPj4gMzE7Ci0JeiAgPSAoeCBeIHkpICYgMHg1NTU1NTU1NUw7Ci0JeSBePSB6OwotCXggXj0gejsKLQl5ICA9IHkgPDwgMSB8IHkgPj4gMzE7Ci0JeiAgPSAoKHggPj4gMDEwKSBeIHkpICYgMHgwMEZGMDBGRkw7Ci0JeCBePSB6IDw8IDAxMDsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDAyKSBeIHgpICYgMHgzMzMzMzMzM0w7Ci0JeSBePSB6IDw8IDAwMjsKLQl4IF49IHo7Ci0JeiAgPSAoKHggPj4gMDIwKSBeIHkpICYgMHgwMDAwRkZGRkw7Ci0JeCBePSB6IDw8IDAyMDsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDA0KSBeIHgpICYgMHgwRjBGMEYwRkw7Ci0JeSBePSB6IDw8IDAwNDsKLQl4IF49IHo7Ci0JZHN0WzBdID0geDsKLQl4ID4+PSA4OwotCWRzdFsxXSA9IHg7Ci0JeCA+Pj0gODsKLQlkc3RbMl0gPSB4OwotCXggPj49IDg7Ci0JZHN0WzNdID0geDsKLQlkc3RbNF0gPSB5OwotCXkgPj49IDg7Ci0JZHN0WzVdID0geTsKLQl5ID4+PSA4OwotCWRzdFs2XSA9IHk7Ci0JeSA+Pj0gODsKLQlkc3RbN10gPSB5OworCWQgPSBrWzRdOyBkICY9IDB4MGU7IGQgPDw9IDQ7IGQgfD0ga1swXSAmIDB4MWU7IGQgPSBwYzFbZF07CisJYyA9IGtbNV07IGMgJj0gMHgwZTsgYyA8PD0gNDsgYyB8PSBrWzFdICYgMHgxZTsgYyA9IHBjMVtjXTsKKwliID0ga1s2XTsgYiAmPSAweDBlOyBiIDw8PSA0OyBiIHw9IGtbMl0gJiAweDFlOyBiID0gcGMxW2JdOworCWEgPSBrWzddOyBhICY9IDB4MGU7IGEgPDw9IDQ7IGEgfD0ga1szXSAmIDB4MWU7IGEgPSBwYzFbYV07CisKKwlwZVsxNSAqIDIgKyAwXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOworCXBlWzE0ICogMiArIDBdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsxMyAqIDIgKyAwXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbMTIgKiAyICsgMF0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWzExICogMiArIDBdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsxMCAqIDIgKyAwXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDkgKiAyICsgMF0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWyA4ICogMiArIDBdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107CisJcGVbIDcgKiAyICsgMF0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyA2ICogMiArIDBdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsgNSAqIDIgKyAwXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbIDQgKiAyICsgMF0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWyAzICogMiArIDBdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsgMiAqIDIgKyAwXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbIDEgKiAyICsgMF0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsKKwlwZVsgMCAqIDIgKyAwXSA9IFBDMihiLCBjLCBkLCBhKTsKKworCS8qIENoZWNrIGlmIGZpcnN0IGhhbGYgaXMgd2VhayAqLworCXcgID0gKGEgXiBjKSB8IChiIF4gZCkgfCAocnNbYV0gXiBjKSB8IChiIF4gcnNbZF0pOworCisJLyogU2tpcCB0byBuZXh0IHRhYmxlIHNldCAqLworCXB0ICs9IDUxMjsKKworCWQgPSBrWzBdOyBkICY9IDB4ZTA7IGQgPj49IDQ7IGQgfD0ga1s0XSAmIDB4ZjA7IGQgPSBwYzFbZCArIDFdOworCWMgPSBrWzFdOyBjICY9IDB4ZTA7IGMgPj49IDQ7IGMgfD0ga1s1XSAmIDB4ZjA7IGMgPSBwYzFbYyArIDFdOworCWIgPSBrWzJdOyBiICY9IDB4ZTA7IGIgPj49IDQ7IGIgfD0ga1s2XSAmIDB4ZjA7IGIgPSBwYzFbYiArIDFdOworCWEgPSBrWzNdOyBhICY9IDB4ZTA7IGEgPj49IDQ7IGEgfD0ga1s3XSAmIDB4ZjA7IGEgPSBwYzFbYSArIDFdOworCisJLyogQ2hlY2sgaWYgc2Vjb25kIGhhbGYgaXMgd2VhayAqLworCXcgfD0gKGEgXiBjKSB8IChiIF4gZCkgfCAocnNbYV0gXiBjKSB8IChiIF4gcnNbZF0pOworCisJcGVbMTUgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsKKwlwZVsxNCAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbMTMgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWzEyICogMiArIDFdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsxMSAqIDIgKyAxXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbMTAgKiAyICsgMV0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWyA5ICogMiArIDFdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgOCAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOworCXBlWyA3ICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsgNiAqIDIgKyAxXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbIDUgKiAyICsgMV0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyA0ICogMiArIDFdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsgMyAqIDIgKyAxXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbIDIgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWyAxICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07CisJcGVbIDAgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7CisKKwkvKiBGaXh1cDogMjQxMyA1NzY4IC0+IDEzNTcgMjQ2OCAqLworCWZvciAoZCA9IDA7IGQgPCAxNjsgKytkKSB7CisJCWEgPSBwZVsyICogZF07CisJCWIgPSBwZVsyICogZCArIDFdOworCQljID0gYSBeIGI7CisJCWMgJj0gMHhmZmZmMDAwMDsKKwkJYSBePSBjOworCQliIF49IGM7CisJCVJPTChiLCAxOCk7CisJCXBlWzIgKiBkXSA9IGE7CisJCXBlWzIgKiBkICsgMV0gPSBiOworCX0KKworCS8qIFplcm8gaWYgd2VhayBrZXkgKi8KKwlyZXR1cm4gdzsKIH0KIAogLyoKLSAqIFJGQzI0NTE6IFdlYWsga2V5IGNoZWNrcyBTSE9VTEQgYmUgcGVyZm9ybWVkLgorICogRGVjcnlwdGlvbiBrZXkgZXhwYW5zaW9uCisgKgorICogTm8gd2VhayBrZXkgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLCBhcyB0aGlzIGlzIG9ubHkgdXNlZCBieSB0cmlwbGUgREVTCisgKgogICovCi1zdGF0aWMgaW50IHNldGtleSh1MzIgKmV4cGtleSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKK3N0YXRpYyB2b2lkIGRrZXkodTMyICpwZSwgY29uc3QgdTggKmspCiB7Ci0JY29uc3QgdTggKms7Ci0JdTggKmIwLCAqYjE7Ci0JdTMyIG4sIHc7Ci0JdTggYml0czBbNTZdLCBiaXRzMVs1Nl07CisJLyogSyZSOiBsb25nIGlzIGF0IGxlYXN0IDMyIGJpdHMgKi8KKwl1bnNpZ25lZCBsb25nIGEsIGIsIGMsIGQ7CisJY29uc3QgdTMyICpwdCA9IHBjMjsKIAotCW4gID0gcGFyaXR5W2tleVswXV07IG4gPDw9IDQ7Ci0JbiB8PSBwYXJpdHlba2V5WzFdXTsgbiA8PD0gNDsKLQluIHw9IHBhcml0eVtrZXlbMl1dOyBuIDw8PSA0OwotCW4gfD0gcGFyaXR5W2tleVszXV07IG4gPDw9IDQ7Ci0JbiB8PSBwYXJpdHlba2V5WzRdXTsgbiA8PD0gNDsKLQluIHw9IHBhcml0eVtrZXlbNV1dOyBuIDw8PSA0OwotCW4gfD0gcGFyaXR5W2tleVs2XV07IG4gPDw9IDQ7Ci0JbiB8PSBwYXJpdHlba2V5WzddXTsKLQl3ID0gMHg4ODg4ODg4OEw7Ci0JCi0JaWYgKCgqZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkKLQkgICAgJiYgISgobiAtICh3ID4+IDMpKSAmIHcpKSB7ICAvKiAxIGluIDEwXjEwIGtleXMgcGFzc2VzIHRoaXMgdGVzdCAqLwotCQlpZiAobiA8IDB4NDE0MTUxNTEpIHsKLQkJCWlmIChuIDwgMHgzMTMxMjEyMSkgewotCQkJCWlmIChuIDwgMHgxNDE0MTUxNSkgewotCQkJCQkvKiAwMSAwMSAwMSAwMSAwMSAwMSAwMSAwMSAqLwotCQkJCQlpZiAobiA9PSAweDExMTExMTExKSBnb3RvIHdlYWs7Ci0JCQkJCS8qIDAxIDFGIDAxIDFGIDAxIDBFIDAxIDBFICovCi0JCQkJCWlmIChuID09IDB4MTMxMzEyMTIpIGdvdG8gd2VhazsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiAwMSBFMCAwMSBFMCAwMSBGMSAwMSBGMSAqLwotCQkJCQlpZiAobiA9PSAweDE0MTQxNTE1KSBnb3RvIHdlYWs7Ci0JCQkJCS8qIDAxIEZFIDAxIEZFIDAxIEZFIDAxIEZFICovCi0JCQkJCWlmIChuID09IDB4MTYxNjE2MTYpIGdvdG8gd2VhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChuIDwgMHgzNDM0MjUyNSkgewotCQkJCQkvKiAxRiAwMSAxRiAwMSAwRSAwMSAwRSAwMSAqLwotCQkJCQlpZiAobiA9PSAweDMxMzEyMTIxKSBnb3RvIHdlYWs7Ci0JCQkJCS8qIDFGIDFGIDFGIDFGIDBFIDBFIDBFIDBFICg/KSAqLwotCQkJCQlpZiAobiA9PSAweDMzMzMyMjIyKSBnb3RvIHdlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogMUYgRTAgMUYgRTAgMEUgRjEgMEUgRjEgKi8KLQkJCQkJaWYgKG4gPT0gMHgzNDM0MjUyNSkgZ290byB3ZWFrOwotCQkJCQkvKiAxRiBGRSAxRiBGRSAwRSBGRSAwRSBGRSAqLwotCQkJCQlpZiAobiA9PSAweDM2MzYyNjI2KSBnb3RvIHdlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG4gPCAweDYxNjE2MTYxKSB7Ci0JCQkJaWYgKG4gPCAweDQ0NDQ1NTU1KSB7Ci0JCQkJCS8qIEUwIDAxIEUwIDAxIEYxIDAxIEYxIDAxICovCi0JCQkJCWlmIChuID09IDB4NDE0MTUxNTEpIGdvdG8gd2VhazsKLQkJCQkJLyogRTAgMUYgRTAgMUYgRjEgMEUgRjEgMEUgKi8KLQkJCQkJaWYgKG4gPT0gMHg0MzQzNTI1MikgZ290byB3ZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIEUwIEUwIEUwIEUwIEYxIEYxIEYxIEYxICg/KSAqLwotCQkJCQlpZiAobiA9PSAweDQ0NDQ1NTU1KSBnb3RvIHdlYWs7Ci0JCQkJCS8qIEUwIEZFIEUwIEZFIEYxIEZFIEYxIEZFICovCi0JCQkJCWlmIChuID09IDB4NDY0NjU2NTYpIGdvdG8gd2VhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChuIDwgMHg2NDY0NjU2NSkgewotCQkJCQkvKiBGRSAwMSBGRSAwMSBGRSAwMSBGRSAwMSAqLwotCQkJCQlpZiAobiA9PSAweDYxNjE2MTYxKSBnb3RvIHdlYWs7Ci0JCQkJCS8qIEZFIDFGIEZFIDFGIEZFIDBFIEZFIDBFICovCi0JCQkJCWlmIChuID09IDB4NjM2MzYyNjIpIGdvdG8gd2VhazsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBGRSBFMCBGRSBFMCBGRSBGMSBGRSBGMSAqLwotCQkJCQlpZiAobiA9PSAweDY0NjQ2NTY1KSBnb3RvIHdlYWs7Ci0JCQkJCS8qIEZFIEZFIEZFIEZFIEZFIEZFIEZFIEZFICovCi0JCQkJCWlmIChuID09IDB4NjY2NjY2NjYpIGdvdG8gd2VhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJZ290byBub3Rfd2VhazsKLXdlYWs6Ci0JCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJZCA9IGtbNF07IGQgJj0gMHgwZTsgZCA8PD0gNDsgZCB8PSBrWzBdICYgMHgxZTsgZCA9IHBjMVtkXTsKKwljID0ga1s1XTsgYyAmPSAweDBlOyBjIDw8PSA0OyBjIHw9IGtbMV0gJiAweDFlOyBjID0gcGMxW2NdOworCWIgPSBrWzZdOyBiICY9IDB4MGU7IGIgPDw9IDQ7IGIgfD0ga1syXSAmIDB4MWU7IGIgPSBwYzFbYl07CisJYSA9IGtbN107IGEgJj0gMHgwZTsgYSA8PD0gNDsgYSB8PSBrWzNdICYgMHgxZTsgYSA9IHBjMVthXTsKKworCXBlWyAwICogMl0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsKKwlwZVsgMSAqIDJdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsgMiAqIDJdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgMyAqIDJdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsgNCAqIDJdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgNSAqIDJdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsgNiAqIDJdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgNyAqIDJdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107CisJcGVbIDggKiAyXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbIDkgKiAyXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbMTAgKiAyXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbMTEgKiAyXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbMTIgKiAyXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbMTMgKiAyXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbMTQgKiAyXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOworCXBlWzE1ICogMl0gPSBQQzIoYiwgYywgZCwgYSk7CisKKwkvKiBTa2lwIHRvIG5leHQgdGFibGUgc2V0ICovCisJcHQgKz0gNTEyOworCisJZCA9IGtbMF07IGQgJj0gMHhlMDsgZCA+Pj0gNDsgZCB8PSBrWzRdICYgMHhmMDsgZCA9IHBjMVtkICsgMV07CisJYyA9IGtbMV07IGMgJj0gMHhlMDsgYyA+Pj0gNDsgYyB8PSBrWzVdICYgMHhmMDsgYyA9IHBjMVtjICsgMV07CisJYiA9IGtbMl07IGIgJj0gMHhlMDsgYiA+Pj0gNDsgYiB8PSBrWzZdICYgMHhmMDsgYiA9IHBjMVtiICsgMV07CisJYSA9IGtbM107IGEgJj0gMHhlMDsgYSA+Pj0gNDsgYSB8PSBrWzddICYgMHhmMDsgYSA9IHBjMVthICsgMV07CisKKwlwZVsgMCAqIDIgKyAxXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOworCXBlWyAxICogMiArIDFdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsgMiAqIDIgKyAxXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDMgKiAyICsgMV0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWyA0ICogMiArIDFdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgNSAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDYgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWyA3ICogMiArIDFdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107CisJcGVbIDggKiAyICsgMV0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyA5ICogMiArIDFdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsxMCAqIDIgKyAxXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbMTEgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzEyICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsxMyAqIDIgKyAxXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbMTQgKiAyICsgMV0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsKKwlwZVsxNSAqIDIgKyAxXSA9IFBDMihiLCBjLCBkLCBhKTsKKworCS8qIEZpeHVwOiAyNDEzIDU3NjggLT4gMTM1NyAyNDY4ICovCisJZm9yIChkID0gMDsgZCA8IDE2OyArK2QpIHsKKwkJYSA9IHBlWzIgKiBkXTsKKwkJYiA9IHBlWzIgKiBkICsgMV07CisJCWMgPSBhIF4gYjsKKwkJYyAmPSAweGZmZmYwMDAwOworCQlhIF49IGM7CisJCWIgXj0gYzsKKwkJUk9MKGIsIDE4KTsKKwkJcGVbMiAqIGRdID0gYTsKKwkJcGVbMiAqIGQgKyAxXSA9IGI7CiAJfQotCi1ub3Rfd2VhazoKLQotCS8qIGV4cGxvZGUgdGhlIGJpdHMgKi8KLQluID0gNTY7Ci0JYjAgPSBiaXRzMDsKLQliMSA9IGJpdHMxOwotCQotCWRvIHsKLQkJdyA9ICgyNTYgfCAqa2V5KyspIDw8IDI7Ci0JCWRvIHsKLQkJCS0tbjsKLQkJCWIxW25dID0gOCAmIHc7Ci0JCQl3ID4+PSAxOwotCQkJYjBbbl0gPSA0ICYgdzsKLQkJfSB3aGlsZSAoIHcgPj0gMTYgKTsKLQl9IHdoaWxlICggbiApOwotCQotCS8qIHB1dCB0aGUgYml0cyBpbiB0aGUgY29ycmVjdCBwbGFjZXMgKi8KLQluID0gMTY7Ci0JayA9IHJvdG9yczsKLQkKLQlkbyB7Ci0JCXcgICA9IChiMVtrWyAwICAgXV0gfCBiMFtrWyAxICAgXV0pIDw8IDQ7Ci0JCXcgIHw9IChiMVtrWyAyICAgXV0gfCBiMFtrWyAzICAgXV0pIDw8IDI7Ci0JCXcgIHw9ICBiMVtrWyA0ICAgXV0gfCBiMFtrWyA1ICAgXV07Ci0JCXcgPDw9IDg7Ci0JCXcgIHw9IChiMVtrWyA2ICAgXV0gfCBiMFtrWyA3ICAgXV0pIDw8IDQ7Ci0JCXcgIHw9IChiMVtrWyA4ICAgXV0gfCBiMFtrWyA5ICAgXV0pIDw8IDI7Ci0JCXcgIHw9ICBiMVtrWzEwICAgXV0gfCBiMFtrWzExICAgXV07Ci0JCXcgPDw9IDg7Ci0JCXcgIHw9IChiMVtrWzEyICAgXV0gfCBiMFtrWzEzICAgXV0pIDw8IDQ7Ci0JCXcgIHw9IChiMVtrWzE0ICAgXV0gfCBiMFtrWzE1ICAgXV0pIDw8IDI7Ci0JCXcgIHw9ICBiMVtrWzE2ICAgXV0gfCBiMFtrWzE3ICAgXV07Ci0JCXcgPDw9IDg7Ci0JCXcgIHw9IChiMVtrWzE4ICAgXV0gfCBiMFtrWzE5ICAgXV0pIDw8IDQ7Ci0JCXcgIHw9IChiMVtrWzIwICAgXV0gfCBiMFtrWzIxICAgXV0pIDw8IDI7Ci0JCXcgIHw9ICBiMVtrWzIyICAgXV0gfCBiMFtrWzIzICAgXV07Ci0JCWV4cGtleVswXSA9IHc7Ci0JCQotCQl3ICAgPSAoYjFba1sgMCsyNF1dIHwgYjBba1sgMSsyNF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sgMisyNF1dIHwgYjBba1sgMysyNF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sgNCsyNF1dIHwgYjBba1sgNSsyNF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sgNisyNF1dIHwgYjBba1sgNysyNF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sgOCsyNF1dIHwgYjBba1sgOSsyNF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sxMCsyNF1dIHwgYjBba1sxMSsyNF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sxMisyNF1dIHwgYjBba1sxMysyNF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sxNCsyNF1dIHwgYjBba1sxNSsyNF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sxNisyNF1dIHwgYjBba1sxNysyNF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sxOCsyNF1dIHwgYjBba1sxOSsyNF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1syMCsyNF1dIHwgYjBba1syMSsyNF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1syMisyNF1dIHwgYjBba1syMysyNF1dOwotCQkKLQkJUk9SKHcsIDQsIDI4KTsgICAgICAvKiBjb3VsZCBiZSBlbGltaW5hdGVkICovCi0JCWV4cGtleVsxXSA9IHc7Ci0KLQkJayArPSA0ODsKLQkJZXhwa2V5ICs9IDI7Ci0JfSB3aGlsZSAoLS1uKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRlc19zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQogewotCXJldHVybiBzZXRrZXkoKChzdHJ1Y3QgZGVzX2N0eCAqKWN0eCktPmV4cGtleSwga2V5LCBrZXlsZW4sIGZsYWdzKTsKKwlzdHJ1Y3QgZGVzX2N0eCAqZGN0eCA9IGN0eDsKKwl1MzIgdG1wW0RFU19FWFBLRVlfV09SRFNdOworCWludCByZXQ7CisKKwkvKiBFeHBhbmQgdG8gdG1wICovCisJcmV0ID0gZWtleSh0bXAsIGtleSk7CisKKwlpZiAodW5saWtlbHkocmV0ID09IDApICYmICgqZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpIHsKKwkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX1dFQUtfS0VZOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb3B5IHRvIG91dHB1dCAqLworCW1lbWNweShkY3R4LT5leHBrZXksIHRtcCwgc2l6ZW9mKGRjdHgtPmV4cGtleSkpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGRlc19lbmNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKLQlkZXNfc21hbGxfZmlwc19lbmNyeXB0KCgoc3RydWN0IGRlc19jdHggKiljdHgpLT5leHBrZXksIGRzdCwgc3JjKTsKKwljb25zdCB1MzIgKksgPSAoKHN0cnVjdCBkZXNfY3R4ICopY3R4KS0+ZXhwa2V5OworCWNvbnN0IF9fbGUzMiAqcyA9IChjb25zdCBfX2xlMzIgKilzcmM7CisJX19sZTMyICpkID0gKF9fbGUzMiAqKWRzdDsKKwl1MzIgTCwgUiwgQSwgQjsKKwlpbnQgaTsKKworCUwgPSBsZTMyX3RvX2NwdShzWzBdKTsKKwlSID0gbGUzMl90b19jcHUoc1sxXSk7CisKKwlJUChMLCBSLCBBKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCVJPVU5EKEwsIFIsIEEsIEIsIEssIDIpOworCQlST1VORChSLCBMLCBBLCBCLCBLLCAyKTsKKwl9CisJRlAoUiwgTCwgQSk7CisKKwlkWzBdID0gY3B1X3RvX2xlMzIoUik7CisJZFsxXSA9IGNwdV90b19sZTMyKEwpOwogfQogCiBzdGF0aWMgdm9pZCBkZXNfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0JZGVzX3NtYWxsX2ZpcHNfZGVjcnlwdCgoKHN0cnVjdCBkZXNfY3R4ICopY3R4KS0+ZXhwa2V5LCBkc3QsIHNyYyk7CisJY29uc3QgdTMyICpLID0gKChzdHJ1Y3QgZGVzX2N0eCAqKWN0eCktPmV4cGtleSArIERFU19FWFBLRVlfV09SRFMgLSAyOworCWNvbnN0IF9fbGUzMiAqcyA9IChjb25zdCBfX2xlMzIgKilzcmM7CisJX19sZTMyICpkID0gKF9fbGUzMiAqKWRzdDsKKwl1MzIgTCwgUiwgQSwgQjsKKwlpbnQgaTsKKworCUwgPSBsZTMyX3RvX2NwdShzWzBdKTsKKwlSID0gbGUzMl90b19jcHUoc1sxXSk7CisKKwlJUChMLCBSLCBBKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCVJPVU5EKEwsIFIsIEEsIEIsIEssIC0yKTsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgLTIpOworCX0KKwlGUChSLCBMLCBBKTsKKworCWRbMF0gPSBjcHVfdG9fbGUzMihSKTsKKwlkWzFdID0gY3B1X3RvX2xlMzIoTCk7CiB9CiAKLS8qIAorLyoKICAqIFJGQzI0NTE6CiAgKgogICogICBGb3IgREVTLUVERTMsIHRoZXJlIGlzIG5vIGtub3duIG5lZWQgdG8gcmVqZWN0IHdlYWsgb3IKQEAgLTExOTksNDQgKzg1OSw4NiBAQAogICoKICAqLwogc3RhdGljIGludCBkZXMzX2VkZV9zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKKwkJCSAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCiB7Ci0JdW5zaWduZWQgaW50IGksIG9mZjsKKwljb25zdCB1MzIgKksgPSAoY29uc3QgdTMyICopa2V5OwogCXN0cnVjdCBkZXMzX2VkZV9jdHggKmRjdHggPSBjdHg7CisJdTMyICpleHBrZXkgPSBkY3R4LT5leHBrZXk7CiAKLQlpZiAoIShtZW1jbXAoa2V5LCAma2V5W0RFU19LRVlfU0laRV0sIERFU19LRVlfU0laRSkgJiYgCi0JICAgIG1lbWNtcCgma2V5W0RFU19LRVlfU0laRV0sICZrZXlbREVTX0tFWV9TSVpFICogMl0sCi0JICAgIAkJCQkJREVTX0tFWV9TSVpFKSkpIHsKLQorCWlmICh1bmxpa2VseSghKChLWzBdIF4gS1syXSkgfCAoS1sxXSBeIEtbM10pKSB8fAorCQkgICAgICEoKEtbMl0gXiBLWzRdKSB8IChLWzNdIF4gS1s1XSkpKSkKKwl7CiAJCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX1NDSEVEOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JCi0JZm9yIChpID0gMCwgb2ZmID0gMDsgaSA8IDM7IGkrKywgb2ZmICs9IERFU19FWFBLRVlfV09SRFMsCi0JCQkJCQkJa2V5ICs9IERFU19LRVlfU0laRSkgewotCQlpbnQgcmV0ID0gc2V0a2V5KCZkY3R4LT5leHBrZXlbb2ZmXSwga2V5LCBERVNfS0VZX1NJWkUsIGZsYWdzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0JCisKKwlla2V5KGV4cGtleSwga2V5KTsgZXhwa2V5ICs9IERFU19FWFBLRVlfV09SRFM7IGtleSArPSBERVNfS0VZX1NJWkU7CisJZGtleShleHBrZXksIGtleSk7IGV4cGtleSArPSBERVNfRVhQS0VZX1dPUkRTOyBrZXkgKz0gREVTX0tFWV9TSVpFOworCWVrZXkoZXhwa2V5LCBrZXkpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGRlczNfZWRlX2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewogCXN0cnVjdCBkZXMzX2VkZV9jdHggKmRjdHggPSBjdHg7Ci0JCi0JZGVzX3NtYWxsX2ZpcHNfZW5jcnlwdChkY3R4LT5leHBrZXksIGRzdCwgc3JjKTsKLQlkZXNfc21hbGxfZmlwc19kZWNyeXB0KCZkY3R4LT5leHBrZXlbREVTX0VYUEtFWV9XT1JEU10sIGRzdCwgZHN0KTsKLQlkZXNfc21hbGxfZmlwc19lbmNyeXB0KCZkY3R4LT5leHBrZXlbREVTX0VYUEtFWV9XT1JEUyAqIDJdLCBkc3QsIGRzdCk7CisJY29uc3QgdTMyICpLID0gZGN0eC0+ZXhwa2V5OworCWNvbnN0IF9fbGUzMiAqcyA9IChjb25zdCBfX2xlMzIgKilzcmM7CisJX19sZTMyICpkID0gKF9fbGUzMiAqKWRzdDsKKwl1MzIgTCwgUiwgQSwgQjsKKwlpbnQgaTsKKworCUwgPSBsZTMyX3RvX2NwdShzWzBdKTsKKwlSID0gbGUzMl90b19jcHUoc1sxXSk7CisKKwlJUChMLCBSLCBBKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCVJPVU5EKEwsIFIsIEEsIEIsIEssIDIpOworCQlST1VORChSLCBMLCBBLCBCLCBLLCAyKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChSLCBMLCBBLCBCLCBLLCAyKTsKKwkJUk9VTkQoTCwgUiwgQSwgQiwgSywgMik7CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoTCwgUiwgQSwgQiwgSywgMik7CisJCVJPVU5EKFIsIEwsIEEsIEIsIEssIDIpOworCX0KKwlGUChSLCBMLCBBKTsKKworCWRbMF0gPSBjcHVfdG9fbGUzMihSKTsKKwlkWzFdID0gY3B1X3RvX2xlMzIoTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlczNfZWRlX2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewogCXN0cnVjdCBkZXMzX2VkZV9jdHggKmRjdHggPSBjdHg7CisJY29uc3QgdTMyICpLID0gZGN0eC0+ZXhwa2V5ICsgREVTM19FREVfRVhQS0VZX1dPUkRTIC0gMjsKKwljb25zdCBfX2xlMzIgKnMgPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqZCA9IChfX2xlMzIgKilkc3Q7CisJdTMyIEwsIFIsIEEsIEI7CisJaW50IGk7CiAKLQlkZXNfc21hbGxfZmlwc19kZWNyeXB0KCZkY3R4LT5leHBrZXlbREVTX0VYUEtFWV9XT1JEUyAqIDJdLCBkc3QsIHNyYyk7Ci0JZGVzX3NtYWxsX2ZpcHNfZW5jcnlwdCgmZGN0eC0+ZXhwa2V5W0RFU19FWFBLRVlfV09SRFNdLCBkc3QsIGRzdCk7Ci0JZGVzX3NtYWxsX2ZpcHNfZGVjcnlwdChkY3R4LT5leHBrZXksIGRzdCwgZHN0KTsKKwlMID0gbGUzMl90b19jcHUoc1swXSk7CisJUiA9IGxlMzJfdG9fY3B1KHNbMV0pOworCisJSVAoTCwgUiwgQSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChMLCBSLCBBLCBCLCBLLCAtMik7CisJCVJPVU5EKFIsIEwsIEEsIEIsIEssIC0yKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChSLCBMLCBBLCBCLCBLLCAtMik7CisJCVJPVU5EKEwsIFIsIEEsIEIsIEssIC0yKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChMLCBSLCBBLCBCLCBLLCAtMik7CisJCVJPVU5EKFIsIEwsIEEsIEIsIEssIC0yKTsKKwl9CisJRlAoUiwgTCwgQSk7CisKKwlkWzBdID0gY3B1X3RvX2xlMzIoUik7CisJZFsxXSA9IGNwdV90b19sZTMyKEwpOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgZGVzX2FsZyA9IHsKQEAgLTEyNDksNyArOTUxLDcgQEAKIAkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKIAkuY2lhX21pbl9rZXlzaXplCT0JREVTX0tFWV9TSVpFLAogCS5jaWFfbWF4X2tleXNpemUJPQlERVNfS0VZX1NJWkUsCi0JLmNpYV9zZXRrZXkJCT0gCWRlc19zZXRrZXksCisJLmNpYV9zZXRrZXkJCT0JZGVzX3NldGtleSwKIAkuY2lhX2VuY3J5cHQJCT0JZGVzX2VuY3J5cHQsCiAJLmNpYV9kZWNyeXB0CQk9CWRlc19kZWNyeXB0IH0gfQogfTsKQEAgLTEyNjQsOSArOTY2LDkgQEAKIAkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKIAkuY2lhX21pbl9rZXlzaXplCT0JREVTM19FREVfS0VZX1NJWkUsCiAJLmNpYV9tYXhfa2V5c2l6ZQk9CURFUzNfRURFX0tFWV9TSVpFLAotCS5jaWFfc2V0a2V5CSAgIAk9IAlkZXMzX2VkZV9zZXRrZXksCi0JLmNpYV9lbmNyeXB0CSAJPQlkZXMzX2VkZV9lbmNyeXB0LAotCS5jaWFfZGVjcnlwdAkgIAk9CWRlczNfZWRlX2RlY3J5cHQgfSB9CisJLmNpYV9zZXRrZXkJCT0JZGVzM19lZGVfc2V0a2V5LAorCS5jaWFfZW5jcnlwdAkJPQlkZXMzX2VkZV9lbmNyeXB0LAorCS5jaWFfZGVjcnlwdAkJPQlkZXMzX2VkZV9kZWNyeXB0IH0gfQogfTsKIAogTU9EVUxFX0FMSUFTKCJkZXMzX2VkZSIpOwpAQCAtMTI3NCw3ICs5NzYsNyBAQAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewogCWludCByZXQgPSAwOwotCQorCiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZGVzX2FsZyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMTI4Miw3ICs5ODQsNyBAQAogCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlczNfZWRlX2FsZyk7CiAJaWYgKHJldCA8IDApCiAJCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZGVzX2FsZyk7Ci1vdXQ6CQorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyOTcsMyArOTk5LDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJERVMgJiBUcmlwbGUgREVTIEVERSBDaXBoZXIgQWxnb3JpdGhtcyIpOworTU9EVUxFX0FVVEhPUigiRGFnIEFybmUgT3N2aWsgPGRhQG9zdmlrLm5vPiIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2htYWMuYyBiL2NyeXB0by9obWFjLmMKaW5kZXggODQ3ZGY5Mi4uZGEwNDU2YiAxMDA2NDQKLS0tIGEvY3J5cHRvL2htYWMuYworKysgYi9jcnlwdG8vaG1hYy5jCkBAIC00OSw4ICs0OSw3IEBACiAKIHZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewotCWlmICh0Zm0tPmNydF9kaWdlc3QuZGl0X2htYWNfYmxvY2spCi0JCWtmcmVlKHRmbS0+Y3J0X2RpZ2VzdC5kaXRfaG1hY19ibG9jayk7CisJa2ZyZWUodGZtLT5jcnRfZGlnZXN0LmRpdF9obWFjX2Jsb2NrKTsKIH0KIAogdm9pZCBjcnlwdG9faG1hY19pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2ludGVybmFsLmggYi9jcnlwdG8vaW50ZXJuYWwuaAppbmRleCA5NjRiOWE2Li42ODYxMjg3IDEwMDY0NAotLS0gYS9jcnlwdG8vaW50ZXJuYWwuaAorKysgYi9jcnlwdG8vaW50ZXJuYWwuaApAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CiAKIGV4dGVybiBlbnVtIGttX3R5cGUgY3J5cHRvX2ttX3R5cGVzW107CkBAIC00MiwyMCArNDIsNiBAQAogCQljb25kX3Jlc2NoZWQoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fdGZtX2N0eChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXJldHVybiAodm9pZCAqKSZ0Zm1bMV07Ci19Ci0KLXN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKLQotLyogQSBmYXIgbW9yZSBpbnRlbGxpZ2VudCB2ZXJzaW9uIG9mIHRoaXMgaXMgcGxhbm5lZC4gIEZvciBub3csIGp1c3QKLSAqIHRyeSBhbiBleGFjdCBtYXRjaCBvbiB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGNyeXB0b19hbGdfbG9va3VwKG5hbWUpLCBuYW1lKTsKLX0KLQogI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQwogaW50IGNyeXB0b19hbGxvY19obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwogdm9pZCBjcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwpAQCAtNzYsNiArNjIsMzMgQEAKIHsgfQogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19kaWdlc3RfY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLAorCQkJCQkJIGludCBmbGFncykKK3sKKwlyZXR1cm4gYWxnLT5jcmFfY3R4c2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2NpcGhlcl9jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCisJCQkJCQkgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBhbGctPmNyYV9jdHhzaXplOworCQorCXN3aXRjaCAoZmxhZ3MgJiBDUllQVE9fVEZNX01PREVfTUFTSykgeworCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0NCQzoKKwkJbGVuID0gQUxJR04obGVuLCBhbGctPmNyYV9hbGlnbm1hc2sgKyAxKTsKKwkJbGVuICs9IGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2NvbXByZXNzX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywKKwkJCQkJCSAgIGludCBmbGFncykKK3sKKwlyZXR1cm4gYWxnLT5jcmFfY3R4c2l6ZTsKK30KKwogaW50IGNyeXB0b19pbml0X2RpZ2VzdF9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOwogaW50IGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOwogaW50IGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CmRpZmYgLS1naXQgYS9jcnlwdG8vc2NhdHRlcndhbGsuYyBiL2NyeXB0by9zY2F0dGVyd2Fsay5jCmluZGV4IDUwYzk0NjEuLjQ3YWM5MGUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zY2F0dGVyd2Fsay5jCisrKyBiL2NyeXB0by9zY2F0dGVyd2Fsay5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIGludCBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHZvaWQgKmJ1Ziwgc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywKIAkJCSAgIHNpemVfdCBuYnl0ZXMsIGludCBvdXQpCiB7Ci0JZG8geworCXdoaWxlIChuYnl0ZXMgPiB3YWxrLT5sZW5fdGhpc19wYWdlKSB7CiAJCW1lbWNweV9kaXIoYnVmLCB3YWxrLT5kYXRhLCB3YWxrLT5sZW5fdGhpc19wYWdlLCBvdXQpOwogCQlidWYgKz0gd2Fsay0+bGVuX3RoaXNfcGFnZTsKIAkJbmJ5dGVzIC09IHdhbGstPmxlbl90aGlzX3BhZ2U7CkBAIC0xMDgsNyArMTA4LDcgQEAKIAkJc2NhdHRlcndhbGtfdW5tYXAod2Fsaywgb3V0KTsKIAkJc2NhdHRlcndhbGtfcGFnZWRvbmUod2Fsaywgb3V0LCAxKTsKIAkJc2NhdHRlcndhbGtfbWFwKHdhbGssIG91dCk7Ci0JfSB3aGlsZSAobmJ5dGVzID4gd2Fsay0+bGVuX3RoaXNfcGFnZSk7CisJfQogCiAJbWVtY3B5X2RpcihidWYsIHdhbGstPmRhdGEsIG5ieXRlcywgb3V0KTsKIAlyZXR1cm4gbmJ5dGVzOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NjYXR0ZXJ3YWxrLmggYi9jcnlwdG8vc2NhdHRlcndhbGsuaAppbmRleCAwMmFhNTZjLi5lNzk5MjVjIDEwMDY0NAotLS0gYS9jcnlwdG8vc2NhdHRlcndhbGsuaAorKysgYi9jcnlwdG8vc2NhdHRlcndhbGsuaApAQCAtNDAsMTAgKzQwLDEwIEBACiAJICAgICAgIHdhbGtfaW4tPm9mZnNldCA9PSB3YWxrX291dC0+b2Zmc2V0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzY2F0dGVyd2Fsa19hY3Jvc3NfcGFnZXMoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywKLQkJCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNjYXR0ZXJ3YWxrX2NsYW1wKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlyZXR1cm4gbmJ5dGVzID4gd2Fsay0+bGVuX3RoaXNfcGFnZTsKKwlyZXR1cm4gbmJ5dGVzID4gd2Fsay0+bGVuX3RoaXNfcGFnZSA/IHdhbGstPmxlbl90aGlzX3BhZ2UgOiBuYnl0ZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2F0dGVyd2Fsa19hZHZhbmNlKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCkBAIC01NSw2ICs1NSwxMiBAQAogCXdhbGstPmxlbl90aGlzX3NlZ21lbnQgLT0gbmJ5dGVzOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzY2F0dGVyd2Fsa19hbGlnbmVkKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tYXNrKQoreworCXJldHVybiAhKHdhbGstPm9mZnNldCAmIGFsaWdubWFzayk7Cit9CisKIHZvaWQgc2NhdHRlcndhbGtfc3RhcnQoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsaywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyk7CiBpbnQgc2NhdHRlcndhbGtfY29weWNodW5rcyh2b2lkICpidWYsIHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHNpemVfdCBuYnl0ZXMsIGludCBvdXQpOwogdm9pZCBzY2F0dGVyd2Fsa19tYXAoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCk7CmRpZmYgLS1naXQgYS9jcnlwdG8vc2VycGVudC5jIGIvY3J5cHRvL3NlcnBlbnQuYwppbmRleCA3ZDE1MmU4Li4zY2YyYzUwIDEwMDY0NAotLS0gYS9jcnlwdG8vc2VycGVudC5jCisrKyBiL2NyeXB0by9zZXJwZW50LmMKQEAgLTIxMCw3ICsyMTAsNiBAQAogCXg0IF49IHgyOwogCiBzdHJ1Y3Qgc2VycGVudF9jdHggewotCXU4IGl2W1NFUlBFTlRfQkxPQ0tfU0laRV07CiAJdTMyIGV4cGtleVtTRVJQRU5UX0VYUEtFWV9XT1JEU107CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL0tjb25maWcgYi9kcml2ZXJzL0tjb25maWcKaW5kZXggYWVkNGE5Yi4uY2VjYWIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9LY29uZmlnCisrKyBiL2RyaXZlcnMvS2NvbmZpZwpAQCAtMjgsNyArMjgsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWFjaW50b3NoL0tjb25maWciCiAKLXNvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL0tjb25maWciCiAKQEAgLTQ0LDYgKzQ0LDggQEAKIAogc291cmNlICJkcml2ZXJzL3cxL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9od21vbi9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDMxNjdiZTUuLjEyNmE4NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtNTIsNiArNTIsNyBAQAogb2JqLSQoQ09ORklHX0kyTykJCSs9IG1lc3NhZ2UvCiBvYmotJChDT05GSUdfSTJDKQkJKz0gaTJjLwogb2JqLSQoQ09ORklHX1cxKQkJKz0gdzEvCitvYmotJChDT05GSUdfSFdNT04pCQkrPSBod21vbi8KIG9iai0kKENPTkZJR19QSE9ORSkJCSs9IHRlbGVwaG9ueS8KIG9iai0kKENPTkZJR19NRCkJCSs9IG1kLwogb2JqLSQoQ09ORklHX0JUKQkJKz0gYmx1ZXRvb3RoLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwppbmRleCA4NmM1MjUyLi45ODY0MTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwpAQCAtMyw2ICszLDcgQEAKICMKIAogbWVudSAiQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBTdXBwb3J0IgorCWRlcGVuZHMgb24gUE0KIAlkZXBlbmRzIG9uICFYODZfVklTV1MKIAlkZXBlbmRzIG9uICFJQTY0X0hQX1NJTQogCWRlcGVuZHMgb24gSUE2NCB8fCBYODYKQEAgLTQ4LDcgKzQ5LDYgQEAKIAogY29uZmlnIEFDUElfSU5URVJQUkVURVIKIAlib29sCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IHkKIAogaWYgQUNQSV9JTlRFUlBSRVRFUgpAQCAtNzksNiArNzksMTQgQEAKIAlkZXBlbmRzIG9uIEFDUElfU0xFRVAgJiYgUFJPQ19GUwogCWRlZmF1bHQgeQogCitjb25maWcgQUNQSV9TTEVFUF9QUk9DX1NMRUVQCisJYm9vbCAiL3Byb2MvYWNwaS9zbGVlcCAoZGVwcmVjYXRlZCkiCisJZGVwZW5kcyBvbiBBQ1BJX1NMRUVQX1BST0NfRlMKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBDcmVhdGUgL3Byb2MvYWNwaS9zbGVlcAorCSAgRGVwcmVjYXRlZCBieSAvc3lzL3Bvd2VyL3N0YXRlCisKIGNvbmZpZyBBQ1BJX0FDCiAJdHJpc3RhdGUgIkFDIEFkYXB0ZXIiCiAJZGVwZW5kcyBvbiBYODYKQEAgLTk5LDcgKzEwNyw2IEBACiAKIGNvbmZpZyBBQ1BJX0JVVFRPTgogCXRyaXN0YXRlICJCdXR0b24iCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IG0KIAloZWxwCiAJICBUaGlzIGRyaXZlciByZWdpc3RlcnMgZm9yIGV2ZW50cyBiYXNlZCBvbiBidXR0b25zLCBzdWNoIGFzIHRoZQpAQCAtMTExLDcgKzExOCw2IEBACiBjb25maWcgQUNQSV9WSURFTwogCXRyaXN0YXRlICJWaWRlbyIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBtCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50IHRoZSBBQ1BJIEV4dGVuc2lvbnMgRm9yIERpc3BsYXkgQWRhcHRlcnMKQEAgLTEyMiw5ICsxMjgsMTcgQEAKIAkgIE5vdGUgdGhhdCB0aGlzIGlzIGFuIHJlZi4gaW1wbGVtZW50YXRpb24gb25seS4gIEl0IG1heSBvciBtYXkgbm90IHdvcmsKIAkgIGZvciB5b3VyIGludGVncmF0ZWQgdmlkZW8gZGV2aWNlLgogCitjb25maWcgQUNQSV9IT1RLRVkKKwl0cmlzdGF0ZSAiR2VuZXJpYyBIb3RrZXkiCisJZGVwZW5kcyBvbiBBQ1BJX0lOVEVSUFJFVEVSCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgorCWRlZmF1bHQgbQorCWhlbHAKKwlBQ1BJIGdlbmVyaWMgaG90a2V5CisKIGNvbmZpZyBBQ1BJX0ZBTgogCXRyaXN0YXRlICJGYW4iCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IG0KIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEFDUEkgZmFuIGRldmljZXMsIGFsbG93aW5nIHVzZXItbW9kZSAKQEAgLTEzMiw3ICsxNDYsNiBAQAogCiBjb25maWcgQUNQSV9QUk9DRVNTT1IKIAl0cmlzdGF0ZSAiUHJvY2Vzc29yIgotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBtCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW5zdGFsbHMgQUNQSSBhcyB0aGUgaWRsZSBoYW5kbGVyIGZvciBMaW51eCwgYW5kIHVzZXMKQEAgLTE0Miw3ICsxNTUsNiBAQAogY29uZmlnIEFDUElfSE9UUExVR19DUFUKIAlib29sICJQcm9jZXNzb3IgSG90cGx1ZyAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEFDUElfUFJPQ0VTU09SICYmIEhPVFBMVUdfQ1BVICYmIEVYUEVSSU1FTlRBTAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJc2VsZWN0IEFDUElfQ09OVEFJTkVSCiAJZGVmYXVsdCBuCiAJIC0tLWhlbHAtLS0KQEAgLTI2Miw3ICsyNzQsNiBAQAogCiBjb25maWcgQUNQSV9ERUJVRwogCWJvb2wgIkRlYnVnIFN0YXRlbWVudHMiCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IG4KIAloZWxwCiAJICBUaGUgQUNQSSBkcml2ZXIgY2FuIG9wdGlvbmFsbHkgcmVwb3J0IGVycm9ycyB3aXRoIGEgZ3JlYXQgZGVhbApAQCAtMjcxLDcgKzI4Miw2IEBACiAKIGNvbmZpZyBBQ1BJX0JVUwogCWJvb2wKLQlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgogCWRlZmF1bHQgeQogCiBjb25maWcgQUNQSV9FQwpAQCAtMjg1LDE3ICsyOTUsMTQgQEAKIAogY29uZmlnIEFDUElfUE9XRVIKIAlib29sCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IHkKIAogY29uZmlnIEFDUElfUENJCiAJYm9vbAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBQQ0kKIAogY29uZmlnIEFDUElfU1lTVEVNCiAJYm9vbAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgd2lsbCBlbmFibGUgeW91ciBzeXN0ZW0gdG8gc2h1dCBkb3duIHVzaW5nIEFDUEksIGFuZApAQCAtMzI3LDggKzMzNCwxMyBAQAogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCAoQUNQSV9IT1RQTFVHX01FTU9SWSB8fCBBQ1BJX0hPVFBMVUdfQ1BVIHx8IEFDUElfSE9UUExVR19JTykKIAkgLS0taGVscC0tLQotCSAJVGhpcyBpcyB0aGUgQUNQSSBnZW5lcmljIGNvbnRhaW5lciBkcml2ZXIgd2hpY2ggc3VwcG9ydHMKLQkJQUNQSTAwMDQsIFBOUDBBMDUgYW5kIFBOUDBBMDYgZGV2aWNlcworCSAgVGhpcyBhbGxvd3MgX3BoeXNpY2FsXyBpbnNlcnRpb24gYW5kIHJlbW92YWwgb2YgQ1BVcyBhbmQgbWVtb3J5LgorCSAgVGhpcyBjYW4gYmUgdXNlZnVsLCBmb3IgZXhhbXBsZSwgb24gTlVNQSBtYWNoaW5lcyB0aGF0IHN1cHBvcnQKKwkgIEFDUEkgYmFzZWQgcGh5c2ljYWwgaG90cGx1ZyBvZiBub2Rlcywgb3Igbm9uLU5VTUEgbWFjaGluZXMgdGhhdAorCSAgc3VwcG9ydCBwaHlzaWNhbCBjcHUvbWVtb3J5IGhvdC1wbHVnLgorCisJICBJZiBvbmUgc2VsZWN0cyAibSIsIHRoaXMgZHJpdmVyIGNhbiBiZSBsb2FkZWQgd2l0aAorCSAgIm1vZHByb2JlIGFjcGlfY29udGFpbmVyIi4KIAogY29uZmlnIEFDUElfSE9UUExVR19NRU1PUlkKIAl0cmlzdGF0ZSAiTWVtb3J5IEhvdHBsdWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKaW5kZXggNjVjOTJlMi4uYWQ2N2U4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQpAQCAtMzYsMTMgKzM2LDE0IEBACiBlbmRpZgogCiBvYmotJChDT05GSUdfQUNQSV9CVVMpCQkrPSBzbGVlcC8KLW9iai0kKENPTkZJR19BQ1BJX0JVUykJCSs9IGJ1cy5vCitvYmotJChDT05GSUdfQUNQSV9CVVMpCQkrPSBidXMubyBnbHVlLm8KIG9iai0kKENPTkZJR19BQ1BJX0FDKSAJCSs9IGFjLm8KIG9iai0kKENPTkZJR19BQ1BJX0JBVFRFUlkpCSs9IGJhdHRlcnkubwogb2JqLSQoQ09ORklHX0FDUElfQlVUVE9OKQkrPSBidXR0b24ubwogb2JqLSQoQ09ORklHX0FDUElfRUMpCQkrPSBlYy5vCiBvYmotJChDT05GSUdfQUNQSV9GQU4pCQkrPSBmYW4ubwotb2JqLSQoQ09ORklHX0FDUElfVklERU8pCSs9IHZpZGVvLm8KK29iai0kKENPTkZJR19BQ1BJX1ZJREVPKQkrPSB2aWRlby5vIAorb2JqLSQoQ09ORklHX0FDUElfSE9US0VZKQkrPSBob3RrZXkubwogb2JqLSQoQ09ORklHX0FDUElfUENJKQkJKz0gcGNpX3Jvb3QubyBwY2lfbGluay5vIHBjaV9pcnEubyBwY2lfYmluZC5vCiBvYmotJChDT05GSUdfQUNQSV9QT1dFUikJKz0gcG93ZXIubwogb2JqLSQoQ09ORklHX0FDUElfUFJPQ0VTU09SKQkrPSBwcm9jZXNzb3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCmluZGV4IGE3NWNiNTYuLmE1NjBiMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKQEAgLTEyMDQsNiArMTIwNCwxMCBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCl7CisJCXByaW50ayhLRVJOX0VSUiAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CQorCX0KIAlhc3VzX3Byb2NfZGlyID0gcHJvY19ta2RpcihQUk9DX0FTVVMsIGFjcGlfcm9vdF9kaXIpOwogCWlmICghYXN1c19wcm9jX2RpcikgewogCQlwcmludGsoS0VSTl9FUlIgIkFzdXMgQUNQSTogVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYyBlbnRyeVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggNGVkZmYxNy4uZDc3YzIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtMjEyLDYgKzIxMiwxMiBAQAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJEZXZpY2UgaXMgbm90IHBvd2VyIG1hbmFnZWFibGVcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KKwkvKgorCSAqIEdldCBkZXZpY2UncyBjdXJyZW50IHBvd2VyIHN0YXRlIGlmIGl0J3MgdW5rbm93bgorCSAqIFRoaXMgbWVhbnMgZGV2aWNlIHBvd2VyIHN0YXRlIGlzbid0IGluaXRpYWxpemVkIG9yIHByZXZpb3VzIHNldHRpbmcgZmFpbGVkCisJICovCisJaWYgKGRldmljZS0+cG93ZXIuc3RhdGUgPT0gQUNQSV9TVEFURV9VTktOT1dOKQorCQlhY3BpX2J1c19nZXRfcG93ZXIoZGV2aWNlLT5oYW5kbGUsICZkZXZpY2UtPnBvd2VyLnN0YXRlKTsKIAlpZiAoc3RhdGUgPT0gZGV2aWNlLT5wb3dlci5zdGF0ZSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgaXMgYWxyZWFkeSBhdCBEJWRcbiIsIHN0YXRlKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKQEAgLTIzMSw3ICsyMzcsNyBAQAogCSAqIE9uIHRyYW5zaXRpb25zIHRvIGEgaGlnaC1wb3dlcmVkIHN0YXRlIHdlIGZpcnN0IGFwcGx5IHBvd2VyICh2aWEKIAkgKiBwb3dlciByZXNvdXJjZXMpIHRoZW4gZXZhbHV0ZSBfUFN4LiAgQ29udmVyc2x5IGZvciB0cmFuc2l0aW9ucyB0bwogCSAqIGEgbG93ZXItcG93ZXJlZCBzdGF0ZS4KLQkgKi8gCisJICovCiAJaWYgKHN0YXRlIDwgZGV2aWNlLT5wb3dlci5zdGF0ZSkgewogCQlpZiAoZGV2aWNlLT5wb3dlci5mbGFncy5wb3dlcl9yZXNvdXJjZXMpIHsKIAkJCXJlc3VsdCA9IGFjcGlfcG93ZXJfdHJhbnNpdGlvbihkZXZpY2UsIHN0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXR0b24uYyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwppbmRleCBlYzQ0MzBlLi4wZjQ1ZDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCkBAIC0yNiw5ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKQEAgLTM2LDkgKzMzLDYgQEAKICNkZWZpbmUgQUNQSV9CVVRUT05fQ09NUE9ORU5UCQkweDAwMDgwMDAwCiAjZGVmaW5lIEFDUElfQlVUVE9OX0RSSVZFUl9OQU1FCQkiQUNQSSBCdXR0b24gRHJpdmVyIgogI2RlZmluZSBBQ1BJX0JVVFRPTl9DTEFTUwkJImJ1dHRvbiIKLSNkZWZpbmUgQUNQSV9CVVRUT05fRklMRV9JTkZPCQkiaW5mbyIKLSNkZWZpbmUgQUNQSV9CVVRUT05fRklMRV9TVEFURQkJInN0YXRlIgotI2RlZmluZSBBQ1BJX0JVVFRPTl9UWVBFX1VOS05PV04JMHgwMAogI2RlZmluZSBBQ1BJX0JVVFRPTl9OT1RJRllfU1RBVFVTCTB4ODAKIAogI2RlZmluZSBBQ1BJX0JVVFRPTl9TVUJDTEFTU19QT1dFUgkicG93ZXIiCkBAIC03MCw4ICs2NCw2IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9idXR0b25fYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgYWNwaV9idXR0b25faW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgYWNwaV9idXR0b25fc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9idXR0b25fZHJpdmVyID0gewogCS5uYW1lID0JCUFDUElfQlVUVE9OX0RSSVZFUl9OQU1FLApAQCAtOTAsMTg3ICs4Miw2IEBACiAJdW5zaWduZWQgbG9uZwkJcHVzaGVkOwogfTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9idXR0b25faW5mb19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfYnV0dG9uX2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9idXR0b25fc3RhdGVfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2J1dHRvbl9zdGF0ZV9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi19OwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSphY3BpX2J1dHRvbl9kaXI7Ci0KLXN0YXRpYyBpbnQgYWNwaV9idXR0b25faW5mb19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKSBzZXEtPnByaXZhdGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9pbmZvX3NlcV9zaG93Iik7Ci0KLQlpZiAoIWJ1dHRvbiB8fCAhYnV0dG9uLT5kZXZpY2UpCi0JCXJldHVybl9WQUxVRSgwKTsKLQotCXNlcV9wcmludGYoc2VxLCAidHlwZTogICAgICAgICAgICAgICAgICAgICVzXG4iLCAKLQkJYWNwaV9kZXZpY2VfbmFtZShidXR0b24tPmRldmljZSkpOwotCi0JcmV0dXJuX1ZBTFVFKDApOwotfQotCi1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9idXR0b25faW5mb19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Ci19Ci0JCi1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX3N0YXRlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSAoc3RydWN0IGFjcGlfYnV0dG9uICopIHNlcS0+cHJpdmF0ZTsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJCXN0YXRlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fc3RhdGVfc2VxX3Nob3ciKTsKLQotCWlmICghYnV0dG9uIHx8ICFidXR0b24tPmRldmljZSkKLQkJcmV0dXJuX1ZBTFVFKDApOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGJ1dHRvbi0+aGFuZGxlLCJfTElEIixOVUxMLCZzdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAic3RhdGU6ICAgICAgdW5zdXBwb3J0ZWRcbiIpOwotCX0KLQllbHNlewotCQlzZXFfcHJpbnRmKHNlcSwgInN0YXRlOiAgICAgICVzXG4iLCAoc3RhdGUgPyAib3BlbiIgOiAiY2xvc2VkIikpOyAKLQl9Ci0KLQlyZXR1cm5fVkFMVUUoMCk7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9idXR0b25fc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9idXR0b25fc3RhdGVfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwotfQotCi1zdGF0aWMgaW50Ci1hY3BpX2J1dHRvbl9hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX2FkZF9mcyIpOwotCi0JaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKLQkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCi0JYnV0dG9uID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCi0Jc3dpdGNoIChidXR0b24tPnR5cGUpIHsKLQljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVI6Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSRjoKLQkJCWVudHJ5ID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9TVUJDTEFTU19QT1dFUiwgCi0JCQkJYWNwaV9idXR0b25fZGlyKTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1NMRUVQOgotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCQllbnRyeSA9IHByb2NfbWtkaXIoQUNQSV9CVVRUT05fU1VCQ0xBU1NfU0xFRVAsIAotCQkJCWFjcGlfYnV0dG9uX2Rpcik7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9MSUQ6Ci0JCQllbnRyeSA9IHByb2NfbWtkaXIoQUNQSV9CVVRUT05fU1VCQ0xBU1NfTElELCAKLQkJCQlhY3BpX2J1dHRvbl9kaXIpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIWVudHJ5KQotCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IHByb2NfbWtkaXIoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksIGVudHJ5KTsKLQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQotCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQkvKiAnaW5mbycgW1JdICovCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX0lORk8sCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKLQlpZiAoIWVudHJ5KQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfQlVUVE9OX0ZJTEVfSU5GTykpOwotCWVsc2UgewotCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYnV0dG9uX2luZm9fZm9wczsKLQkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7Ci0JCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwotCX0KLQotCS8qIHNob3cgbGlkIHN0YXRlIFtSXSAqLwotCWlmIChidXR0b24tPnR5cGUgPT0gQUNQSV9CVVRUT05fVFlQRV9MSUQpIHsKLQkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX1NUQVRFLAotCQkJU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCQlpZiAoIWVudHJ5KQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJCUFDUElfQlVUVE9OX0ZJTEVfSU5GTykpOwotCQllbHNlIHsKLQkJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9idXR0b25fc3RhdGVfZm9wczsKLQkJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCQkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fVkFMVUUoMCk7Ci19Ci0KLQotc3RhdGljIGludAotYWNwaV9idXR0b25fcmVtb3ZlX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKLXsKLQlzdHJ1Y3QgYWNwaV9idXR0b24JKmJ1dHRvbiA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9yZW1vdmVfZnMiKTsKLQotCWJ1dHRvbiA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKLQlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKLQkJaWYgKGJ1dHRvbi0+dHlwZSA9PSBBQ1BJX0JVVFRPTl9UWVBFX0xJRCkKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX0ZJTEVfU1RBVEUsCi0JCQkJCSAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX0lORk8sCi0JCQkJICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7Ci0KLQkJcmVtb3ZlX3Byb2NfZW50cnkoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCQkJICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKS0+cGFyZW50KTsKLQotCi0JCXN3aXRjaCAoYnV0dG9uLT50eXBlKSB7Ci0JCQljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVI6Ci0JCQljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOgotCQkJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX1NVQkNMQVNTX1BPV0VSLCAKLQkJCQkJYWNwaV9idXR0b25fZGlyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUDoKLQkJCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fU1VCQ0xBU1NfU0xFRVAsIAotCQkJCQlhY3BpX2J1dHRvbl9kaXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX0xJRDoKLQkJCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9TVUJDTEFTU19MSUQsIAotCQkJCQlhY3BpX2J1dHRvbl9kaXIpOwotCQkJCWJyZWFrOwotCQl9Ci0JCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm5fVkFMVUUoMCk7Ci19Ci0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIEludGVyZmFjZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTMxMCw4ICsxMjEsNyBAQAogCQogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCIpOwogCi0JaWYgKCFidXR0b24pCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwlCVUdfT04oIWJ1dHRvbik7CiAKIAlhY3BpX2J1dHRvbl9ub3RpZnkoYnV0dG9uLT5oYW5kbGUsIEFDUElfQlVUVE9OX05PVElGWV9TVEFUVVMsIGJ1dHRvbik7CiAKQEAgLTMyNywxMCArMTM3LDYgQEAKIAlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CiAJc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSBOVUxMOwogCi0Jc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqcG93ZXJfYnV0dG9uOwotCXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnNsZWVwX2J1dHRvbjsKLQlzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICpsaWRfYnV0dG9uOwotCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fYWRkIik7CiAKIAlpZiAoIWRldmljZSkKQEAgLTM5MSw0MiArMTk3LDYgQEAKIAkJZ290byBlbmQ7CiAJfQogCi0JLyoKLQkgKiBFbnN1cmUgb25seSBvbmUgYnV0dG9uIG9mIGVhY2ggdHlwZSBpcyB1c2VkLgotCSAqLwotCXN3aXRjaCAoYnV0dG9uLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSOgotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY6Ci0JCWlmICghcG93ZXJfYnV0dG9uKQotCQkJcG93ZXJfYnV0dG9uID0gZGV2aWNlOwotCQllbHNlIHsKLQkJCWtmcmVlKGJ1dHRvbik7Ci0JCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1NMRUVQOgotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCWlmICghc2xlZXBfYnV0dG9uKQotCQkJc2xlZXBfYnV0dG9uID0gZGV2aWNlOwotCQllbHNlIHsKLQkJCWtmcmVlKGJ1dHRvbik7Ci0JCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX0xJRDoKLQkJaWYgKCFsaWRfYnV0dG9uKQotCQkJbGlkX2J1dHRvbiA9IGRldmljZTsKLQkJZWxzZSB7Ci0JCQlrZnJlZShidXR0b24pOwotCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJlc3VsdCA9IGFjcGlfYnV0dG9uX2FkZF9mcyhkZXZpY2UpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZW5kOwotCiAJc3dpdGNoIChidXR0b24tPnR5cGUpIHsKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOgogCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciAoCkBAIC00NzAsNyArMjQwLDYgQEAKIAogZW5kOgogCWlmIChyZXN1bHQpIHsKLQkJYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7CiAJCWtmcmVlKGJ1dHRvbik7CiAJfQogCkBAIC01MTEsOCArMjgwLDYgQEAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKIAkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCi0JYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7CQotCiAJa2ZyZWUoYnV0dG9uKTsKIAogCXJldHVybl9WQUxVRSgwKTsKQEAgLTUyNiwyMSArMjkzLDE0IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9pbml0Iik7CiAKLQlhY3BpX2J1dHRvbl9kaXIgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX0NMQVNTLCBhY3BpX3Jvb3RfZGlyKTsKLQlpZiAoIWFjcGlfYnV0dG9uX2RpcikKLQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCWFjcGlfYnV0dG9uX2Rpci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQogCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9idXR0b25fZHJpdmVyKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9DTEFTUywgYWNwaV9yb290X2Rpcik7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogc3RhdGljIHZvaWQgX19leGl0CiBhY3BpX2J1dHRvbl9leGl0ICh2b2lkKQogewpAQCAtNTQ4LDExICszMDgsOCBAQAogCiAJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfYnV0dG9uX2RyaXZlcik7CiAKLQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9DTEFTUywgYWNwaV9yb290X2Rpcik7Ci0KIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBtb2R1bGVfaW5pdChhY3BpX2J1dHRvbl9pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfYnV0dG9uX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jCmluZGV4IDI3NzkyMTEuLjg0MTkzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKQEAgLTUzLDEzICs1MywyMCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNmaWVsZCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2dldF9maWVsZF9uYW1lcyAoCisJc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gICAqaW5mbywKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZyk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfYnVmZmVyX2ZpZWxkCiAgKgotICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBUaGUgb3Bjb2RlIHRvIGJlIGV4ZWN1dGVkCi0gKiAgICAgICAgICAgICAgT3BlcmFuZHMgICAgICAgICAgICAtIExpc3Qgb2Ygb3BlcmFuZHMgZm9yIHRoZSBvcGNvZGUKKyAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBwYXJzZSBvcCAoY3JlYXRlX3hYRmllbGQpCiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC03MCw3ICs3Nyw3IEBACiAgKiAgICAgICAgICAgICAgY3JlYXRlX3dvcmRfZmllbGRfb3AsCiAgKiAgICAgICAgICAgICAgY3JlYXRlX2R3b3JkX2ZpZWxkX29wLAogICogICAgICAgICAgICAgIGNyZWF0ZV9xd29yZF9maWVsZF9vcCwKLSAqICAgICAgICAgICAgICBjcmVhdGVfZmllbGRfb3AgICAgIChhbGwgb2Ygd2hpY2ggZGVmaW5lIGZpZWxkcyBpbiBidWZmZXJzKQorICogICAgICAgICAgICAgIGNyZWF0ZV9maWVsZF9vcCAgICAgKGFsbCBvZiB3aGljaCBkZWZpbmUgYSBmaWVsZCBpbiBhIGJ1ZmZlcikKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMTksNyArMTI2LDggQEAKIAkJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFOwogCQl9CiAJCWVsc2UgewotCQkJZmxhZ3MgPSBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfCBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EOworCQkJZmxhZ3MgPSBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfAorCQkJCQlBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EOwogCQl9CiAKIAkJLyoKQEAgLTEzNCwxNiArMTQyLDE2IEBACiAJCX0KIAl9CiAKLQkvKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IgbGF0ZXIsIGJ1dAotCSAqIGZvciBub3csIHdlIHdpbGwgcHV0IGl0IGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKLQkgKiBjYW4gZ2V0IGl0IGFnYWluIGF0IHRoZSBlbmQgb2YgdGhpcyBzY29wZQorCS8qIFdlIGNvdWxkIHB1dCB0aGUgcmV0dXJuZWQgb2JqZWN0IChOb2RlKSBvbiB0aGUgb2JqZWN0IHN0YWNrIGZvciBsYXRlciwKKwkgKiBidXQgZm9yIG5vdywgd2Ugd2lsbCBwdXQgaXQgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlIHBhcnNlciB1c2VzLAorCSAqIHNvIHdlIGNhbiBnZXQgaXQgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGlzIHNjb3BlCiAJICovCiAJb3AtPmNvbW1vbi5ub2RlID0gbm9kZTsKIAogCS8qCi0JICogSWYgdGhlcmUgaXMgbm8gb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBub2RlLCB0aGlzIG5vZGUgd2FzIGp1c3QgY3JlYXRlZCBhbmQKLQkgKiB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgZmllbGQgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGlzIHdhcyBhIGxvb2t1cCBvZiBhbgotCSAqIGV4aXN0aW5nIG5vZGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIHRoZSBmaWVsZCBvYmplY3QgYWdhaW4uCisJICogSWYgdGhlcmUgaXMgbm8gb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBub2RlLCB0aGlzIG5vZGUgd2FzIGp1c3QgY3JlYXRlZAorCSAqIGFuZCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgZmllbGQgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGlzIHdhcyBhIGxvb2t1cAorCSAqIG9mIGFuIGV4aXN0aW5nIG5vZGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIHRoZSBmaWVsZCBvYmplY3QgYWdhaW4uCiAJICovCiAJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwogCWlmIChvYmpfZGVzYykgewpAQCAtMjA1LDcgKzIxMyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKAogCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8sCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTIzOCw3ICsyNDYsOCBAQAogCQkJCQkgKyAoYWNwaV9pbnRlZ2VyKSBhcmctPmNvbW1vbi52YWx1ZS5zaXplOwogCiAJCQlpZiAocG9zaXRpb24gPiBBQ1BJX1VJTlQzMl9NQVgpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJCaXQgb2Zmc2V0IHdpdGhpbiBmaWVsZCB0b28gbGFyZ2UgKD4gMHhGRkZGRkZGRilcbiIpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCQkiQml0IG9mZnNldCB3aXRoaW4gZmllbGQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpXG4iKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKIAkJCX0KIApAQCAtMjUwLDEyICsyNTksMTUgQEAKIAogCQkJLyoKIAkJCSAqIEdldCBhIG5ldyBhY2Nlc3NfdHlwZSBhbmQgYWNjZXNzX2F0dHJpYnV0ZSAtLSB0byBiZSB1c2VkIGZvciBhbGwKLQkJCSAqIGZpZWxkIHVuaXRzIHRoYXQgZm9sbG93LCB1bnRpbCBmaWVsZCBlbmQgb3IgYW5vdGhlciBhY2Nlc3NfYXMga2V5d29yZC4KKwkJCSAqIGZpZWxkIHVuaXRzIHRoYXQgZm9sbG93LCB1bnRpbCBmaWVsZCBlbmQgb3IgYW5vdGhlciBhY2Nlc3NfYXMKKwkJCSAqIGtleXdvcmQuCiAJCQkgKgotCQkJICogSW4gZmllbGRfZmxhZ3MsIHByZXNlcnZlIHRoZSBmbGFnIGJpdHMgb3RoZXIgdGhhbiB0aGUgQUNDRVNTX1RZUEUgYml0cworCQkJICogSW4gZmllbGRfZmxhZ3MsIHByZXNlcnZlIHRoZSBmbGFnIGJpdHMgb3RoZXIgdGhhbiB0aGUKKwkJCSAqIEFDQ0VTU19UWVBFIGJpdHMKIAkJCSAqLwotCQkJaW5mby0+ZmllbGRfZmxhZ3MgPSAodTgpICgoaW5mby0+ZmllbGRfZmxhZ3MgJiB+KEFNTF9GSUVMRF9BQ0NFU1NfVFlQRV9NQVNLKSkgfAotCQkJCQkgICgodTgpICgodTMyKSBhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID4+IDgpKSk7CisJCQlpbmZvLT5maWVsZF9mbGFncyA9ICh1OCkKKwkJCQkoKGluZm8tPmZpZWxkX2ZsYWdzICYgfihBTUxfRklFTERfQUNDRVNTX1RZUEVfTUFTSykpIHwKKwkJCQkoKHU4KSAoKHUzMikgYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciA+PiA4KSkpOwogCiAJCQlpbmZvLT5hdHRyaWJ1dGUgPSAodTgpIChhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyKTsKIAkJCWJyZWFrOwpAQCAtMjY3LDcgKzI3OSw4IEBACiAKIAkJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAogCQkJCQkgIChjaGFyICopICZhcmctPm5hbWVkLm5hbWUsCi0JCQkJCSAgaW5mby0+ZmllbGRfdHlwZSwgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwKKwkJCQkJICBpbmZvLT5maWVsZF90eXBlLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJCSAgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCiAJCQkJCSAgd2Fsa19zdGF0ZSwgJmluZm8tPmZpZWxkX25vZGUpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKChjaGFyICopICZhcmctPm5hbWVkLm5hbWUsIHN0YXR1cyk7CkBAIC0yOTUsOCArMzA4LDkgQEAKIAkJCQkJICsgKGFjcGlfaW50ZWdlcikgYXJnLT5jb21tb24udmFsdWUuc2l6ZTsKIAogCQkJaWYgKHBvc2l0aW9uID4gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiRmllbGQgWyU0LjRzXSBiaXQgb2Zmc2V0IHRvbyBsYXJnZSAoPiAweEZGRkZGRkZGKVxuIiwKLQkJCQkJCShjaGFyICopICZpbmZvLT5maWVsZF9ub2RlLT5uYW1lKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkJIkZpZWxkIFslNC40c10gYml0IG9mZnNldCB0b28gbGFyZ2UgKD4gMHhGRkZGRkZGRilcbiIsCisJCQkJCShjaGFyICopICZpbmZvLT5maWVsZF9ub2RlLT5uYW1lKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKIAkJCX0KIApAQCAtMzA2LDcgKzMyMCw4IEBACiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIG9wY29kZSBpbiBmaWVsZCBsaXN0OiAlWFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJJbnZhbGlkIG9wY29kZSBpbiBmaWVsZCBsaXN0OiAlWFxuIiwKIAkJCQlhcmctPmNvbW1vbi5hbWxfb3Bjb2RlKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfT1BDT0RFKTsKIAkJfQpAQCAtNDM1LDcgKzQ1MCw4IEBACiAJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKIAkJCQkJICAoY2hhciAqKSAmYXJnLT5uYW1lZC5uYW1lLAogCQkJCQkgIHR5cGUsIEFDUElfSU1PREVfTE9BRF9QQVNTMSwKLQkJCQkJICBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfCBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5ELAorCQkJCQkgIEFDUElfTlNfTk9fVVBTRUFSQ0ggfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSB8CisJCQkJCSAgQUNQSV9OU19FUlJPUl9JRl9GT1VORCwKIAkJCQkJICB3YWxrX3N0YXRlLCAmbm9kZSk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoKGNoYXIgKikgJmFyZy0+bmFtZWQubmFtZSwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKaW5kZXggYjRkMjY0ZC4uZDc3OTBkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKQEAgLTQ5LDEyICs0OSwyMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNpbml0IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfaW5pdF9vbmVfb2JqZWN0ICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0CiAgKgotICogUEFSQU1FVEVSUzogIG9ial9oYW5kbGUgICAgICAtIE5vZGUKKyAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBOb2RlIGZvciB0aGUgb2JqZWN0CiAgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgIC0gQ3VycmVudCBuZXN0aW5nIGxldmVsCiAgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gUG9pbnRzIHRvIGEgaW5pdCBpbmZvIHN0cnVjdAogICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAtIE5vdCB1c2VkCkBAIC03MCw3ICs3OSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9kc19pbml0X29uZV9vYmplY3QgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLApAQCAtMTA1LDcgKzExNCw4IEBACiAKIAkJc3RhdHVzID0gYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbiAob2JqX2hhbmRsZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiUmVnaW9uICVwIFslNC40c10gLSBJbml0IGZhaWx1cmUsICVzXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIlJlZ2lvbiAlcCBbJTQuNHNdIC0gSW5pdCBmYWlsdXJlLCAlc1xuIiwKIAkJCQlvYmpfaGFuZGxlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9oYW5kbGUpLAogCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQl9CkBAIC0xMTgsOCArMTI4LDEwIEBACiAKIAkJaW5mby0+bWV0aG9kX2NvdW50Kys7CiAKLQkJLyogUHJpbnQgYSBkb3QgZm9yIGVhY2ggbWV0aG9kIHVubGVzcyB3ZSBhcmUgZ29pbmcgdG8gcHJpbnQgdGhlIGVudGlyZSBwYXRobmFtZSAqLwotCisJCS8qCisJCSAqIFByaW50IGEgZG90IGZvciBlYWNoIG1ldGhvZCB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHByaW50CisJCSAqIHRoZSBlbnRpcmUgcGF0aG5hbWUKKwkJICovCiAJCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTklUX05BTUVTKSkgewogCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsICIuIikpOwogCQl9CkBAIC0xNDAsNyArMTUyLDggQEAKIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfZHNfcGFyc2VfbWV0aG9kIChvYmpfaGFuZGxlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJNZXRob2QgJXAgWyU0LjRzXSAtIHBhcnNlIGZhaWx1cmUsICVzXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIk1ldGhvZCAlcCBbJTQuNHNdIC0gcGFyc2UgZmFpbHVyZSwgJXNcbiIsCiAJCQkJb2JqX2hhbmRsZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfaGFuZGxlKSwKIAkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIApAQCAtMTU0LDcgKzE2Nyw4IEBACiAJCSAqIGZvciBldmVyeSBleGVjdXRpb24gc2luY2UgdGhlcmUgaXNuJ3QgbXVjaCBvdmVyaGVhZAogCQkgKi8KIAkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUgKG9ial9oYW5kbGUpOwotCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIgKCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2hhbmRsZSktPm9iamVjdC0+bWV0aG9kLm93bmluZ19pZCk7CisJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lciAoCisJCQkoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9oYW5kbGUpLT5vYmplY3QtPm1ldGhvZC5vd25pbmdfaWQpOwogCQlicmVhazsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYwppbmRleCA5ZjA0NTZjLi45ZmMzZjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKQEAgLTE1MywxMiArMTUzLDExIEBACiAJLyoKIAkgKiBQYXJzZSB0aGUgbWV0aG9kLCBmaXJzdCBwYXNzCiAJICoKLQkgKiBUaGUgZmlyc3QgcGFzcyBsb2FkIGlzIHdoZXJlIG5ld2x5IGRlY2xhcmVkIG5hbWVkIG9iamVjdHMgYXJlCi0JICogYWRkZWQgaW50byB0aGUgbmFtZXNwYWNlLiAgQWN0dWFsIGV2YWx1YXRpb24gb2YKLQkgKiB0aGUgbmFtZWQgb2JqZWN0cyAod2hhdCB3b3VsZCBiZSBjYWxsZWQgYSAic2Vjb25kCi0JICogcGFzcyIpIGhhcHBlbnMgZHVyaW5nIHRoZSBhY3R1YWwgZXhlY3V0aW9uIG9mIHRoZQotCSAqIG1ldGhvZCBzbyB0aGF0IG9wZXJhbmRzIHRvIHRoZSBuYW1lZCBvYmplY3RzIGNhbgotCSAqIHRha2Ugb24gZHluYW1pYyBydW4tdGltZSB2YWx1ZXMuCisJICogVGhlIGZpcnN0IHBhc3MgbG9hZCBpcyB3aGVyZSBuZXdseSBkZWNsYXJlZCBuYW1lZCBvYmplY3RzIGFyZSBhZGRlZCBpbnRvCisJICogdGhlIG5hbWVzcGFjZS4gIEFjdHVhbCBldmFsdWF0aW9uIG9mIHRoZSBuYW1lZCBvYmplY3RzICh3aGF0IHdvdWxkIGJlCisJICogY2FsbGVkIGEgInNlY29uZCBwYXNzIikgaGFwcGVucyBkdXJpbmcgdGhlIGFjdHVhbCBleGVjdXRpb24gb2YgdGhlCisJICogbWV0aG9kIHNvIHRoYXQgb3BlcmFuZHMgdG8gdGhlIG5hbWVkIG9iamVjdHMgY2FuIHRha2Ugb24gZHluYW1pYworCSAqIHJ1bi10aW1lIHZhbHVlcy4KIAkgKi8KIAlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCAod2Fsa19zdGF0ZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKaW5kZXggZjMxZDA5NS4uZjc5OTgzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCkBAIC01Miw2ICs1MiwyOSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNtdGhkYXQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZSAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworYWNwaV9vYmplY3RfdHlwZQorYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKyNlbmRpZgorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjIsOCArODUsOCBAQAogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBob2xkIHRoZSBtZXRob2QncyBhcmd1bWVudHMKLSAqICAgICAgICAgICAgICBhbmQgbG9jYWxzLiAgVGhlIGRhdGEgc3RydWN0IGlzIGFuIGFycmF5IG9mIE5URXMgZm9yIGVhY2guCi0gKiAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgcmVmX29mIGFuZCBkZV9yZWZfb2YgdG8gd29yayBwcm9wZXJseSBmb3IgdGhlc2UKKyAqICAgICAgICAgICAgICBhbmQgbG9jYWxzLiAgVGhlIGRhdGEgc3RydWN0IGlzIGFuIGFycmF5IG9mIG5hbWVzcGFjZSBub2RlcyBmb3IKKyAqICAgICAgICAgICAgICBlYWNoIC0gdGhpcyBhbGxvd3MgcmVmX29mIGFuZCBkZV9yZWZfb2YgdG8gd29yayBwcm9wZXJseSBmb3IgdGhlc2UKICAqICAgICAgICAgICAgICBzcGVjaWFsIGRhdGEgdHlwZXMuCiAgKgogICogTk9URVM6ICAgICAgIHdhbGtfc3RhdGUgZmllbGRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvIGJ5IHRoZQpAQCAtOTIsNyArMTE1LDggQEAKIAkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7CiAJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5kZXNjcmlwdG9yICAgPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDsKIAkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLnR5cGUgICAgICAgICA9IEFDUElfVFlQRV9BTlk7Ci0JCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5mbGFncyAgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwgQU5PQkpfTUVUSE9EX0FSRzsKKwkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLmZsYWdzICAgICAgICA9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgfAorCQkJCSAgQU5PQkpfTUVUSE9EX0FSRzsKIAl9CiAKIAkvKiBJbml0IHRoZSBtZXRob2QgbG9jYWxzICovCkBAIC0xMDQsNyArMTI4LDggQEAKIAkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7CiAJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5kZXNjcmlwdG9yICA9IEFDUElfREVTQ19UWVBFX05BTUVEOwogCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0udHlwZSAgICAgICAgPSBBQ1BJX1RZUEVfQU5ZOwotCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZmxhZ3MgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwgQU5PQkpfTUVUSE9EX0xPQ0FMOworCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZmxhZ3MgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwKKwkJCQkgQU5PQkpfTUVUSE9EX0xPQ0FMOwogCX0KIAogCXJldHVybl9WT0lEOwpAQCAtMTk4LDE1ICsyMjMsMTggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJfQogCi0JLyogQ29weSBwYXNzZWQgcGFyYW1ldGVycyBpbnRvIHRoZSBuZXcgbWV0aG9kIHN0YWNrIGZyYW1lICAqLworCS8qIENvcHkgcGFzc2VkIHBhcmFtZXRlcnMgaW50byB0aGUgbmV3IG1ldGhvZCBzdGFjayBmcmFtZSAqLwogCi0Jd2hpbGUgKChpbmRleCA8IEFDUElfTUVUSE9EX05VTV9BUkdTKSAmJiAoaW5kZXggPCBtYXhfcGFyYW1fY291bnQpICYmIHBhcmFtc1tpbmRleF0pIHsKKwl3aGlsZSAoKGluZGV4IDwgQUNQSV9NRVRIT0RfTlVNX0FSR1MpICYmCisJCSAgIChpbmRleCA8IG1heF9wYXJhbV9jb3VudCkgICAgICAmJgorCQkJcGFyYW1zW2luZGV4XSkgewogCQkvKgogCQkgKiBBIHZhbGlkIHBhcmFtZXRlci4KIAkJICogU3RvcmUgdGhlIGFyZ3VtZW50IGluIHRoZSBtZXRob2Qvd2FsayBkZXNjcmlwdG9yLgogCQkgKiBEbyBub3QgY29weSB0aGUgYXJnIGluIG9yZGVyIHRvIGltcGxlbWVudCBjYWxsIGJ5IHJlZmVyZW5jZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKEFNTF9BUkdfT1AsIGluZGV4LCBwYXJhbXNbaW5kZXhdLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKEFNTF9BUkdfT1AsIGluZGV4LAorCQkJCSBwYXJhbXNbaW5kZXhdLCB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0yMjQsMTEgKzI1MiwxMyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUKICAqCiAgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEVpdGhlciBBTUxfTE9DQUxfT1Agb3IgQU1MX0FSR19PUAotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSB3aGljaCBsb2NhbF92YXIgb3IgYXJndW1lbnQgd2hvc2UgdHlwZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGdldAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGljaCBMb2NhbCBvciBBcmcgd2hvc2UgdHlwZSB0byBnZXQKICAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAorICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgbm9kZSBpcyByZXR1cm5lZC4KICAqCi0gKiBSRVRVUk46ICAgICAgR2V0IHRoZSBOb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2FsIG9yIGFyZy4KKyAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIG5vZGUKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSBOb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2FsIG9yIGFyZy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNDksNyArMjc5LDggQEAKIAljYXNlIEFNTF9MT0NBTF9PUDoKIAogCQlpZiAoaW5kZXggPiBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTG9jYWwgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJMb2NhbCBpbmRleCAlZCBpcyBpbnZhbGlkIChtYXggJWQpXG4iLAogCQkJCWluZGV4LCBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfSU5ERVgpOwogCQl9CkBAIC0yNjIsNyArMjkzLDggQEAKIAljYXNlIEFNTF9BUkdfT1A6CiAKIAkJaWYgKGluZGV4ID4gQUNQSV9NRVRIT0RfTUFYX0FSRykgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJBcmcgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJBcmcgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKIAkJCQlpbmRleCwgQUNQSV9NRVRIT0RfTUFYX0FSRykpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5WQUxJRF9JTkRFWCk7CiAJCX0KQEAgLTI4Niw3ICszMTgsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlCiAgKgogICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBFaXRoZXIgQU1MX0xPQ0FMX09QIG9yIEFNTF9BUkdfT1AKLSAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gd2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHRvIGdldAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGljaCBMb2NhbCBvciBBcmcgdG8gZ2V0CiAgKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAtIE9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzdGFjayBlbnRyeQogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CiAgKgpAQCAtMjk3LDcgKzMyOSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCkBAIC0zNDAsNjggKzM3MiwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlCi0gKgotICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBFaXRoZXIgQU1MX0xPQ0FMX09QIG9yIEFNTF9BUkdfT1AKLSAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gd2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHdob3NlIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBnZXQKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBEYXRhIHR5cGUgb2YgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgQXJnIG9yIExvY2FsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9vYmplY3RfdHlwZQotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0OwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUiKTsKLQotCi0JLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX1ZBTFVFICgoQUNQSV9UWVBFX05PVF9GT1VORCkpOwotCX0KLQotCS8qIEdldCB0aGUgb2JqZWN0ICovCi0KLQlvYmplY3QgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwotCWlmICghb2JqZWN0KSB7Ci0JCS8qIFVuaW5pdGlhbGl6ZWQgbG9jYWwvYXJnLCByZXR1cm4gVFlQRV9BTlkgKi8KLQotCQlyZXR1cm5fVkFMVUUgKEFDUElfVFlQRV9BTlkpOwotCX0KLQotCS8qIEdldCB0aGUgb2JqZWN0IHR5cGUgKi8KLQotCXJldHVybl9WQUxVRSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9iamVjdCkpOwotfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUKICAqCiAgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEVpdGhlciBBTUxfTE9DQUxfT1Agb3IgQU1MX0FSR19PUAogICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSB3aGljaCBsb2NhbF92YXIgb3IgYXJndW1lbnQgdG8gZ2V0CiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKLSAqICAgICAgICAgICAgICAqZGVzdF9kZXNjICAgICAgICAgIC0gUHRyIHRvIERlc2NyaXB0b3IgaW50byB3aGljaCBzZWxlY3RlZCBBcmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTG9jYWwgdmFsdWUgc2hvdWxkIGJlIGNvcGllZAorICogICAgICAgICAgICAgIGRlc3RfZGVzYyAgICAgICAgICAgLSBXaGVyZSBBcmcgb3IgTG9jYWwgdmFsdWUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlIHZhbHVlIG9mIHNlbGVjdGVkIEFyZyBvciBMb2NhbCBmcm9tIHRoZSBtZXRob2QgZnJhbWUKLSAqICAgICAgICAgICAgICBhdCB0aGUgY3VycmVudCB0b3Agb2YgdGhlIG1ldGhvZCBzdGFjay4KKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB2YWx1ZSBvZiBzZWxlY3RlZCBBcmcgb3IgTG9jYWwgZm9yIHRoaXMgbWV0aG9kCiAgKiAgICAgICAgICAgICAgVXNlZCBvbmx5IGluIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgpLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NjcsMTQgKzQ0NywxNiBAQAogCQllbHNlIHN3aXRjaCAob3Bjb2RlKSB7CiAJCWNhc2UgQU1MX0FSR19PUDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmluaXRpYWxpemVkIEFyZ1slZF0gYXQgbm9kZSAlcFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJVbmluaXRpYWxpemVkIEFyZ1slZF0gYXQgbm9kZSAlcFxuIiwKIAkJCQlpbmRleCwgbm9kZSkpOwogCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9VTklOSVRJQUxJWkVEX0FSRyk7CiAKIAkJY2FzZSBBTUxfTE9DQUxfT1A6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5pbml0aWFsaXplZCBMb2NhbFslZF0gYXQgbm9kZSAlcFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJVbmluaXRpYWxpemVkIExvY2FsWyVkXSBhdCBub2RlICVwXG4iLAogCQkJCWluZGV4LCBub2RlKSk7CiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpOwpAQCAtNTA2LDEyICs0ODgsMTIgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGUgdGhlIGVudHJ5IGF0IE9wY29kZTpJbmRleCBvbiB0aGUgbWV0aG9kIHN0YWNrLiAgSW5zZXJ0cworICogREVTQ1JJUFRJT046IERlbGV0ZSB0aGUgZW50cnkgYXQgT3Bjb2RlOkluZGV4LiAgSW5zZXJ0cwogICogICAgICAgICAgICAgIGEgbnVsbCBpbnRvIHRoZSBzdGFjayBzbG90IGFmdGVyIHRoZSBvYmplY3QgaXMgZGVsZXRlZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCkBAIC01NjIsNyArNTQ0LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbAogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIHdoaWNoIGxvY2FsX3ZhciBvciBhcmd1bWVudCB0byBzZXQKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggTG9jYWwgb3IgQXJnIHRvIHNldAogICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKICAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCiAgKgpAQCAtNjUxLDE5ICs2MzMsMjAgQEAKIAkJICovCiAJCWlmIChvcGNvZGUgPT0gQU1MX0FSR19PUCkgewogCQkJLyoKLQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBvYmplY3QgaXMgdGhlIGNvcnJlY3QgdHlwZS4gIFRoaXMgbWF5IGJlIG92ZXJraWxsLCBidXQKLQkJCSAqIGl0IGlzIGhlcmUgYmVjYXVzZSByZWZlcmVuY2VzIHdlcmUgTlMgbm9kZXMgaW4gdGhlIHBhc3QuICBOb3cgdGhleSBhcmUKLQkJCSAqIG9wZXJhbmQgb2JqZWN0cyBvZiB0eXBlIFJlZmVyZW5jZS4KKwkJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBvYmplY3QgaXMgdGhlIGNvcnJlY3QgdHlwZS4gIFRoaXMgbWF5IGJlCisJCQkgKiBvdmVya2lsbCwgYnV0aXQgaXMgaGVyZSBiZWNhdXNlIHJlZmVyZW5jZXMgd2VyZSBOUyBub2RlcyBpbgorCQkJICogIHRoZSBwYXN0LiAgTm93IHRoZXkgYXJlIG9wZXJhbmQgb2JqZWN0cyBvZiB0eXBlIFJlZmVyZW5jZS4KIAkJCSAqLwogCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoY3VycmVudF9vYmpfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgZGVzY3JpcHRvciB0eXBlIHdoaWxlIHN0b3JpbmcgdG8gbWV0aG9kIGFyZzogWyVzXVxuIiwKLQkJCQkJCWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAoY3VycmVudF9vYmpfZGVzYykpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCQkiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgd2hpbGUgc3RvcmluZyB0byBtZXRob2QgYXJnOiBbJXNdXG4iLAorCQkJCQlhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKGN1cnJlbnRfb2JqX2Rlc2MpKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOwogCQkJfQogCiAJCQkvKgotCQkJICogSWYgd2UgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSBvYmplY3QgdGhhdCBjYW1lIGZyb20gcmVmX29mKCksIGRvIHRoZQotCQkJICogaW5kaXJlY3Qgc3RvcmUKKwkJCSAqIElmIHdlIGhhdmUgYSB2YWxpZCByZWZlcmVuY2Ugb2JqZWN0IHRoYXQgY2FtZSBmcm9tIHJlZl9vZigpLAorCQkJICogZG8gdGhlIGluZGlyZWN0IHN0b3JlCiAJCQkgKi8KIAkJCWlmICgoY3VycmVudF9vYmpfZGVzYy0+Y29tbW9uLnR5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgJiYKIAkJCQkoY3VycmVudF9vYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfUkVGX09GX09QKSkgewpAQCAtNzEzLDMgKzY5Niw1NSBAQAogfQogCiAKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCisgKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIExvY2FsIG9yIEFyZyB3aG9zZSB0eXBlIHRvIGdldAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIERhdGEgdHlwZSBvZiBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBBcmcgb3IgTG9jYWwKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgc3RvcmVkIGluIHRoZSBMb2NhbCBvciBBcmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX29iamVjdF90eXBlCithY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlICgKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCit7CisJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3Q7CisKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19tZXRob2RfZGF0YV9nZXRfdHlwZSIpOworCisKKwkvKiBHZXQgdGhlIG5hbWVzcGFjZSBub2RlIGZvciB0aGUgYXJnL2xvY2FsICovCisKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChvcGNvZGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlyZXR1cm5fVkFMVUUgKChBQ1BJX1RZUEVfTk9UX0ZPVU5EKSk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgKi8KKworCW9iamVjdCA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJaWYgKCFvYmplY3QpIHsKKwkJLyogVW5pbml0aWFsaXplZCBsb2NhbC9hcmcsIHJldHVybiBUWVBFX0FOWSAqLworCisJCXJldHVybl9WQUxVRSAoQUNQSV9UWVBFX0FOWSk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgdHlwZSAqLworCisJcmV0dXJuX1ZBTFVFIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqZWN0KSk7Cit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYwppbmRleCBlYjhhZjQ3Li5iZmJhZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKQEAgLTUyLDkgKzUyLDE1IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc29iamVjdCIpCiAKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9kZXNjX3B0cik7CisKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QKICAqCkBAIC02Nyw5ICs3Myw5IEBACiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2VyIE9wIG9iamVjdCB0byB0aGUgZXF1aXZhbGVudCBuYW1lc3BhY2Ugb2JqZWN0CiAgKiAgICAgICAgICAgICAgU2ltcGxlIG9iamVjdHMgYXJlIGFueSBvYmplY3RzIG90aGVyIHRoYW4gYSBwYWNrYWdlIG9iamVjdCEKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLApAQCAtOTAsOSArOTYsMTEgQEAKIAkJICogT3RoZXJ3aXNlLCBnbyBhaGVhZCBhbmQgbG9vayBpdCB1cCBub3cKIAkJICovCiAJCWlmICghb3AtPmNvbW1vbi5ub2RlKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgb3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkJICBvcC0+Y29tbW9uLnZhbHVlLnN0cmluZywKIAkJCQkJICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIE5VTEwsCisJCQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCisJCQkJCSAgTlVMTCwKIAkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICYob3AtPmNvbW1vbi5ub2RlKSk7CiAKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTEwNCwxMiArMTEyLDE0IEBACiAKIAkvKiBDcmVhdGUgYW5kIGluaXQgdGhlIGludGVybmFsIEFDUEkgb2JqZWN0ICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKS0+b2JqZWN0X3R5cGUpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0ICgKKwkJCSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24uYW1sX29wY29kZSkpLT5vYmplY3RfdHlwZSk7CiAJaWYgKCFvYmpfZGVzYykgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICh3YWxrX3N0YXRlLCBvcCwgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCAmb2JqX2Rlc2MpOworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAod2Fsa19zdGF0ZSwgb3AsIG9wLT5jb21tb24uYW1sX29wY29kZSwKKwkJCSAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTEyMCw3ICsxMzAsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqCiAgKgpAQCAtMTM0LDcgKzE0NCw3IEBACiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2VyIE9wIHBhY2thZ2Ugb2JqZWN0IHRvIHRoZSBlcXVpdmFsZW50CiAgKiAgICAgICAgICAgICAgbmFtZXNwYWNlIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaiAoCkBAIC0yMjksNyArMjM5LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmoKICAqCkBAIC0yNDMsNyArMjUzLDcgQEAKICAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBwYXJzZXIgT3AgcGFja2FnZSBvYmplY3QgdG8gdGhlIGVxdWl2YWxlbnQKICAqICAgICAgICAgICAgICBuYW1lc3BhY2Ugb2JqZWN0CiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaiAoCkBAIC0zMzEsMTEgKzM0MSwxMiBAQAogCQlpZiAoYXJnLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCkgewogCQkJLyogT2JqZWN0IChwYWNrYWdlIG9yIGJ1ZmZlcikgaXMgYWxyZWFkeSBidWlsdCAqLwogCi0JCQlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIGFyZy0+Y29tbW9uLm5vZGUpOworCQkJb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0gPQorCQkJCUFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIGFyZy0+Y29tbW9uLm5vZGUpOwogCQl9CiAJCWVsc2UgewogCQkJc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKHdhbGtfc3RhdGUsIGFyZywKLQkJCQkJICAmb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0pOworCQkJCQkgJm9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldKTsKIAkJfQogCiAJCWkrKzsKQEAgLTM0OCw3ICszNTksNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfbm9kZQogICoKQEAgLTM2MCw3ICszNzEsNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgdGhlIG9iamVjdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBuYW1lc3BhY2Ugbm9kZQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfY3JlYXRlX25vZGUgKApAQCAtMzkyLDcgKzQwMyw4IEBACiAKIAkvKiBCdWlsZCBhbiBpbnRlcm5hbCBvYmplY3QgZm9yIHRoZSBhcmd1bWVudChzKSAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnLCAmb2JqX2Rlc2MpOworCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZywKKwkJCSAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTQxNCw3ICs0MjYsNyBAQAogI2VuZGlmIC8qIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTiAqLwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wCiAgKgpAQCAtNDI5LDcgKzQ0MSw3IEBACiAgKiAgICAgICAgICAgICAgYXNzb2NpYXRlZCBhcmd1bWVudHMuICBUaGUgbmFtZXNwYWNlIG9iamVjdCBpcyBhIG1vcmUgY29tcGFjdAogICogICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBPcCBhbmQgaXRzIGFyZ3VtZW50cy4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3AgKApAQCAtNDYyLDcgKzQ3NCw4IEBACiAJCS8qCiAJCSAqIERlZmVyIGV2YWx1YXRpb24gb2YgQnVmZmVyIHRlcm1fYXJnIG9wZXJhbmQKIAkJICovCi0JCW9ial9kZXNjLT5idWZmZXIubm9kZSAgICAgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJCW9ial9kZXNjLT5idWZmZXIubm9kZSAgICAgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKIAkJYnJlYWs7CkBAIC00NzMsNyArNDg2LDggQEAKIAkJLyoKIAkJICogRGVmZXIgZXZhbHVhdGlvbiBvZiBQYWNrYWdlIHRlcm1fYXJnIG9wZXJhbmQKIAkJICovCi0JCW9ial9kZXNjLT5wYWNrYWdlLm5vZGUgICAgID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCQlvYmpfZGVzYy0+cGFja2FnZS5ub2RlICAgICA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCSAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCQlvYmpfZGVzYy0+cGFja2FnZS5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKIAkJb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX2xlbmd0aCA9IG9wLT5uYW1lZC5sZW5ndGg7CiAJCWJyZWFrOwpAQCAtNDg2LDkgKzUwMCwxMCBAQAogCQkJLyoKIAkJCSAqIFJlc29sdmUgQU1MIENvbnN0YW50cyBoZXJlIC0gQU5EIE9OTFkgSEVSRSEKIAkJCSAqIEFsbCBjb25zdGFudHMgYXJlIGludGVnZXJzLgotCQkJICogV2UgbWFyayB0aGUgaW50ZWdlciB3aXRoIGEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGl0IHN0YXJ0ZWQgbGlmZQotCQkJICogYXMgYSBjb25zdGFudCAtLSBzbyB0aGF0IHN0b3JlcyB0byBjb25zdGFudHMgd2lsbCBwZXJmb3JtIGFzIGV4cGVjdGVkIChub29wKS4KLQkJCSAqICh6ZXJvX29wIGlzIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3Igb3B0aW9uYWwgdGFyZ2V0IG9wZXJhbmRzLikKKwkJCSAqIFdlIG1hcmsgdGhlIGludGVnZXIgd2l0aCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpdCBzdGFydGVkCisJCQkgKiBsaWZlIGFzIGEgY29uc3RhbnQgLS0gc28gdGhhdCBzdG9yZXMgdG8gY29uc3RhbnRzIHdpbGwgcGVyZm9ybQorCQkJICogYXMgZXhwZWN0ZWQgKG5vb3ApLiB6ZXJvX29wIGlzIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3Igb3B0aW9uYWwKKwkJCSAqIHRhcmdldCBvcGVyYW5kcy4KIAkJCSAqLwogCQkJb2JqX2Rlc2MtPmNvbW1vbi5mbGFncyA9IEFPUE9CSl9BTUxfQ09OU1RBTlQ7CiAKQEAgLTUyMSw3ICs1MzYsOCBAQAogCiAJCQlkZWZhdWx0OgogCi0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmtub3duIGNvbnN0YW50IG9wY29kZSAlWFxuIiwgb3Bjb2RlKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJCSJVbmtub3duIGNvbnN0YW50IG9wY29kZSAlWFxuIiwgb3Bjb2RlKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTUzNSw3ICs1NTEsOCBAQAogCiAKIAkJZGVmYXVsdDoKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBJbnRlZ2VyIHR5cGUgJVhcbiIsIG9wX2luZm8tPnR5cGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBJbnRlZ2VyIHR5cGUgJVhcbiIsCisJCQkJb3BfaW5mby0+dHlwZSkpOwogCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCWJyZWFrOwogCQl9CkBAIC01NzAsOCArNTg3LDEwIEBACiAJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCA9IG9wY29kZSAtIEFNTF9MT0NBTF9PUDsKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKEFNTF9MT0NBTF9PUCwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsCi0JCQkJCSB3YWxrX3N0YXRlLCAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChBTUxfTE9DQUxfT1AsCisJCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKKwkJCQkJIHdhbGtfc3RhdGUsCisJCQkJCSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAjZW5kaWYKIAkJCWJyZWFrOwogCkBAIC01ODQsOCArNjAzLDEwIEBACiAJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCA9IG9wY29kZSAtIEFNTF9BUkdfT1A7CiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChBTUxfQVJHX09QLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKLQkJCQkJIHdhbGtfc3RhdGUsIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKikgJm9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKEFNTF9BUkdfT1AsCisJCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKKwkJCQkJIHdhbGtfc3RhdGUsCisJCQkJCSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAjZW5kaWYKIAkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYwppbmRleCA1Yzk4N2EwLi5iYTEzYmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKQEAgLTU0LDEyICs1NCwzMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNvcGNvZGUiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzICgKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnNjb3BlX25vZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZCAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmJ1ZmZlcl9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9mZnNldF9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmxlbmd0aF9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlc3VsdF9kZXNjKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzCiAgKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBQYXJlbnQgTlMgbm9kZQorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBPYmplY3QgTlMgbm9kZQorICogICAgICAgICAgICAgIHNjb3BlX25vZGUgICAgICAgICAgLSBQYXJlbnQgTlMgbm9kZQogICogICAgICAgICAgICAgIGFtbF9sZW5ndGggICAgICAgICAgLSBMZW5ndGggb2YgZXhlY3V0YWJsZSBBTUwKICAqICAgICAgICAgICAgICBhbWxfc3RhcnQgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgQU1MCiAgKgpAQCAtNjcsOSArODYsOSBAQAogICoKICAqIERFU0NSSVBUSU9OOiBMYXRlIChkZWZlcnJlZCkgZXhlY3V0aW9uIG9mIHJlZ2lvbiBvciBmaWVsZCBhcmd1bWVudHMKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc2NvcGVfbm9kZSwKQEAgLTE2Miw3ICsxODEsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cwogICoKQEAgLTE3Myw3ICsxOTIsNyBAQAogICogREVTQ1JJUFRJT046IEdldCBidWZmZXJfZmllbGQgQnVmZmVyIGFuZCBJbmRleC4gVGhpcyBpbXBsZW1lbnRzIHRoZSBsYXRlCiAgKiAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiB0aGVzZSBmaWVsZCBhdHRyaWJ1dGVzLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKApAQCAtMjA4LDcgKzIyNyw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzCiAgKgpAQCAtMjE5LDcgKzIzOCw3IEBACiAgKiBERVNDUklQVElPTjogR2V0IEJ1ZmZlciBsZW5ndGggYW5kIGluaXRpYWxpemVyIGJ5dGUgbGlzdC4gIFRoaXMgaW1wbGVtZW50cwogICogICAgICAgICAgICAgIHRoZSBsYXRlIGV2YWx1YXRpb24gb2YgdGhlc2UgYXR0cmlidXRlcy4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzICgKQEAgLTI1NSw3ICsyNzQsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMKICAqCkBAIC0yNjYsNyArMjg1LDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgUGFja2FnZSBsZW5ndGggYW5kIGluaXRpYWxpemVyIGJ5dGUgbGlzdC4gIFRoaXMgaW1wbGVtZW50cwogICogICAgICAgICAgICAgIHRoZSBsYXRlIGV2YWx1YXRpb24gb2YgdGhlc2UgYXR0cmlidXRlcy4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyAoCkBAIC0zNTMsMTcgKzM3MiwxNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbgogICoKLSAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBBIHZhbGlkIHJlZ2lvbiBPcCBvYmplY3QKKyAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBSZWdpb24gbmFtZXNwYWNlIG5vZGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IEZyb250IGVuZCB0byBldl9pbml0aWFsaXplX3JlZ2lvbgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24gKApAQCAtMzgyLDcgKzQwMSw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkCiAgKgpAQCAtMzkwLDE2ICs0MDksMTYgQEAKICAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBidWZmZXJfZmllbGQgb2JqZWN0CiAgKiAgICAgICAgICAgICAgYnVmZmVyX2Rlc2MgICAgIC0gSG9zdCBCdWZmZXIKICAqICAgICAgICAgICAgICBvZmZzZXRfZGVzYyAgICAgLSBPZmZzZXQgaW50byBidWZmZXIKLSAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgLSBMZW5ndGggb2YgZmllbGQgKENSRUFURV9GSUVMRF9PUCBvbmx5KQotICogICAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyAqICAgICAgICAgICAgICBsZW5ndGhfZGVzYyAgICAgLSBMZW5ndGggb2YgZmllbGQgKENSRUFURV9GSUVMRF9PUCBvbmx5KQorICogICAgICAgICAgICAgIHJlc3VsdF9kZXNjICAgICAtIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IFBlcmZvcm0gYWN0dWFsIGluaXRpYWxpemF0aW9uIG9mIGEgYnVmZmVyIGZpZWxkCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkICgKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vcGNvZGUsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC00MzUsOCArNDU0LDEwIEBACiAJICogYWZ0ZXIgcmVzb2x1dGlvbiBpbiBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMoKS4KIAkgKi8KIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChyZXN1bHRfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIoJXMpIGRlc3RpbmF0aW9uIG5vdCBhIE5TIE5vZGUgWyVzXVxuIiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoYW1sX29wY29kZSksIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAocmVzdWx0X2Rlc2MpKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSIoJXMpIGRlc3RpbmF0aW9uIG5vdCBhIE5TIE5vZGUgWyVzXVxuIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoYW1sX29wY29kZSksCisJCQkJYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChyZXN1bHRfZGVzYykpKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlnb3RvIGNsZWFudXA7CkBAIC00NTIsOSArNDczLDE4IEBACiAKIAkJLyogT2Zmc2V0IGlzIGluIGJpdHMsIGNvdW50IGlzIGluIGJpdHMgKi8KIAorCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKIAkJYml0X29mZnNldCA9IG9mZnNldDsKIAkJYml0X2NvdW50ICA9ICh1MzIpIGxlbmd0aF9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKKworCQkvKiBNdXN0IGhhdmUgYSB2YWxpZCAoPjApIGJpdCBjb3VudCAqLworCisJCWlmIChiaXRfY291bnQgPT0gMCkgeworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIkF0dGVtcHQgdG8gY3JlYXRlX2ZpZWxkIG9mIGxlbmd0aCAwXG4iKSk7CisJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9WQUxVRTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQU1MX0NSRUFURV9CSVRfRklFTERfT1A6CkBAIC01MjcsNyArNTU3LDggQEAKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBhcmVhcyBvZiB0aGUgZmllbGQgb2JqZWN0IHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgZmllbGRzCi0JICogRm9yIGZpZWxkX2ZsYWdzLCB1c2UgTE9DS19SVUxFID0gMCAoTk9fTE9DSyksIFVQREFURV9SVUxFID0gMCAoVVBEQVRFX1BSRVNFUlZFKQorCSAqIEZvciBmaWVsZF9mbGFncywgdXNlIExPQ0tfUlVMRSA9IDAgKE5PX0xPQ0spLAorCSAqIFVQREFURV9SVUxFID0gMCAoVVBEQVRFX1BSRVNFUlZFKQogCSAqLwogCXN0YXR1cyA9IGFjcGlfZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0IChvYmpfZGVzYywgZmllbGRfZmxhZ3MsIDAsCiAJCQkgIGJpdF9vZmZzZXQsIGJpdF9jb3VudCk7CkBAIC01MzksOCArNTcwLDggQEAKIAogCS8qIFJlZmVyZW5jZSBjb3VudCBmb3IgYnVmZmVyX2Rlc2MgaW5oZXJpdHMgb2JqX2Rlc2MgY291bnQgKi8KIAotCWJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gKHUxNikgKGJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ICsKLQkJCSAgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOworCWJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gKHUxNikKKwkJKGJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ICsgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCiAKIGNsZWFudXA6CkBAIC01NjksNyArNjAwLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMKICAqCkBAIC01ODEsNyArNjEyLDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgYnVmZmVyX2ZpZWxkIEJ1ZmZlciBhbmQgSW5kZXgKICAqICAgICAgICAgICAgICBDYWxsZWQgZnJvbSBhY3BpX2RzX2V4ZWNfZW5kX29wIGR1cmluZyBidWZmZXJfZmllbGQgcGFyc2UgdHJlZSB3YWxrCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyAoCkBAIC02NTYsNyArNjg3LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9yZWdpb25fb3BlcmFuZHMKICAqCkBAIC02NjgsNyArNjk5LDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgcmVnaW9uIGFkZHJlc3MgYW5kIGxlbmd0aAogICogICAgICAgICAgICAgIENhbGxlZCBmcm9tIGFjcGlfZHNfZXhlY19lbmRfb3AgZHVyaW5nIG9wX3JlZ2lvbiBwYXJzZSB0cmVlIHdhbGsKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzICgKQEAgLTY4Niw3ICs3MTcsOCBAQAogCiAKIAkvKgotCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBmaWVsZHMgb2YgdGhlIG9wX3JlZ2lvbiBkZWNsYXJhdGlvbgorCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBmaWVsZHMgb2YgdGhlCisJICogb3BfcmVnaW9uIGRlY2xhcmF0aW9uCiAJICovCiAJbm9kZSA9ICBvcC0+Y29tbW9uLm5vZGU7CiAKQEAgLTcwNyw3ICs3MzksOCBAQAogCiAJLyogUmVzb2x2ZSB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzIG9wZXJhbmRzIHRvIG51bWJlcnMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCBBQ1BJX1dBTEtfT1BFUkFORFMsIHdhbGtfc3RhdGUpOworCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAorCQkJIEFDUElfV0FMS19PUEVSQU5EUywgd2Fsa19zdGF0ZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQpAQCAtNzM2LDcgKzc2OSw4IEBACiAJICovCiAJb3BlcmFuZF9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gMl07CiAKLQlvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBvcGVyYW5kX2Rlc2MtPmludGVnZXIudmFsdWU7CisJb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCSAgb3BlcmFuZF9kZXNjLT5pbnRlZ2VyLnZhbHVlOwogCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob3BlcmFuZF9kZXNjKTsKIAogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJyZ25fb2JqICVwIEFkZHIgJTguOFglOC44WCBMZW4gJVhcbiIsCkBAIC03NTIsNyArNzg2LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcwogICoKQEAgLTc2NSw3ICs3OTksNyBAQAogICogREVTQ1JJUFRJT046IEdldCB0aGUgb3BlcmFuZHMgYW5kIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZGF0YSBvYmplY3QgdHlwZXM6CiAgKiAgICAgICAgICAgICAgQnVmZmVyLCBQYWNrYWdlLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyAoCkBAIC04MzAsNyArODY0LDcgQEAKIAogCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKIAkJLyoKLQkJICogUmV0dXJuIHRoZSBvYmplY3QgaW4gdGhlIHdhbGtfc3RhdGUsIHVubGVzcyB0aGUgcGFyZW50IGlzIGEgcGFja2FnZSAtLQorCQkgKiBSZXR1cm4gdGhlIG9iamVjdCBpbiB0aGUgd2Fsa19zdGF0ZSwgdW5sZXNzIHRoZSBwYXJlbnQgaXMgYSBwYWNrYWdlIC0KIAkJICogaW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIG9iamVjdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcGFyc2UgdHJlZQogCQkgKiBmb3IgdGhlIHBhY2thZ2UuCiAJCSAqLwpAQCAtOTg4LDcgKzEwMjIsOCBAQAogCQkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwogCQl9CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJbV0hJTEVfT1BdIHRlcm1pbmF0aW9uISBPcD0lcFxuIiwgb3ApKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCisJCQkiW1dISUxFX09QXSB0ZXJtaW5hdGlvbiEgT3A9JXBcbiIsb3ApKTsKIAogCQkvKiBQb3AgdGhpcyBjb250cm9sIHN0YXRlIGFuZCBmcmVlIGl0ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYwppbmRleCA0NjJjNWQ4Li45NjEzMzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCkBAIC0xMDAsNyArMTAwLDYgQEAKIAogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybgpAQCAtMjA1LDcgKzIwNCw3IEBACiAJICogTk9URTogdGhpcyBpcyBvcHRpb25hbCBiZWNhdXNlIHRoZSBBU0wgbGFuZ3VhZ2UgZG9lcyBub3QgYWN0dWFsbHkKIAkgKiBzdXBwb3J0IHRoaXMgYmVoYXZpb3IuCiAJICovCi0JYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4gKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUsIFRSVUUpOworCSh2b2lkKSBhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSwgVFJVRSk7CiAKIAkvKgogCSAqIE5vdyBkZXRlcm1pbmUgaWYgdGhlIHBhcmVudCB3aWxsIHVzZSB0aGUgcmVzdWx0CkBAIC0yMTksOCArMjE4LDkgQEAKIAkJKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfU0NPUEVfT1ApKSB7CiAJCS8qIE5vIHBhcmVudCwgdGhlIHJldHVybiB2YWx1ZSBjYW5ub3QgcG9zc2libHkgYmUgdXNlZCAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiQXQgTWV0aG9kIGxldmVsLCByZXN1bHQgb2YgWyVzXSBub3QgdXNlZFxuIiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSJBdCBNZXRob2QgbGV2ZWwsIHJlc3VsdCBvZiBbJXNdIG5vdCB1c2VkXG4iLAorCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSkpKTsKIAkJcmV0dXJuX1ZBTFVFIChGQUxTRSk7CiAJfQogCkBAIC0yMjgsNyArMjI4LDggQEAKIAogCXBhcmVudF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSk7CiAJaWYgKHBhcmVudF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gcGFyZW50IG9wY29kZS4gT3A9JXBcbiIsIG9wKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIlVua25vd24gcGFyZW50IG9wY29kZS4gT3A9JXBcbiIsIG9wKSk7CiAJCXJldHVybl9WQUxVRSAoRkFMU0UpOwogCX0KIApAQCAtMzA5LDE3ICszMTAsMTkgQEAKIAogCiByZXN1bHRfdXNlZDoKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIlJlc3VsdCBvZiBbJXNdIHVzZWQgYnkgUGFyZW50IFslc10gT3A9JXBcbiIsCi0JCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKLQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkiUmVzdWx0IG9mIFslc10gdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOwogCiAJcmV0dXJuX1ZBTFVFIChUUlVFKTsKIAogCiByZXN1bHRfbm90X3VzZWQ6Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJSZXN1bHQgb2YgWyVzXSBub3QgdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKLQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAotCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSksIG9wKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCisJCSJSZXN1bHQgb2YgWyVzXSBub3QgdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOwogCiAJcmV0dXJuX1ZBTFVFIChGQUxTRSk7CiB9CkBAIC01MjIsNyArNTI1LDggQEAKIAkJaWYgKCh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlKSAmJgogCQkJKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgJiYKIAkJCShhcmdfaW5kZXggIT0gMCkpIHsKLQkJCW9ial9kZXNjID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSk7CisJCQlvYmpfZGVzYyA9IEFDUElfQ0FTVF9QVFIgKAorCQkJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSk7CiAJCQlzdGF0dXMgPSBBRV9PSzsKIAkJfQogCQllbHNlICAgIC8qIEFsbCBvdGhlciBvcGNvZGVzICovIHsKQEAgLTU2NSw3ICs1NjksOCBAQAogCQkJCQkgKiBpbmRpY2F0ZSB0aGlzIHRvIHRoZSBpbnRlcnByZXRlciwgc2V0IHRoZQogCQkJCQkgKiBvYmplY3QgdG8gdGhlIHJvb3QKIAkJCQkJICovCi0JCQkJCW9ial9kZXNjID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwkJCQkJb2JqX2Rlc2MgPSBBQ1BJX0NBU1RfUFRSICgKKwkJCQkJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKIAkJCQkJc3RhdHVzID0gQUVfT0s7CiAJCQkJfQogCQkJCWVsc2UgewpAQCAtNjEyLDcgKzYxNyw4IEBACiAJCQkgKi8KIAkJCW9wY29kZSA9IEFNTF9aRVJPX09QOyAgICAgICAvKiBIYXMgbm8gYXJndW1lbnRzISAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIk51bGwgbmFtZXBhdGg6IEFyZz0lcFxuIiwgYXJnKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkiTnVsbCBuYW1lcGF0aDogQXJnPSVwXG4iLCBhcmcpKTsKIAkJfQogCQllbHNlIHsKIAkJCW9wY29kZSA9IGFyZy0+Y29tbW9uLmFtbF9vcGNvZGU7CkBAIC02NDIsNyArNjQ4LDggQEAKIAkJCQkgKiBPbmx5IGVycm9yIGlzIHVuZGVyZmxvdywgYW5kIHRoaXMgaW5kaWNhdGVzCiAJCQkJICogYSBtaXNzaW5nIG9yIG51bGwgb3BlcmFuZCEKIAkJCQkgKi8KLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kLCAlc1xuIiwKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJIk1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kLCAlc1xuIiwKIAkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQkJfQpAQCAtNjU3LDggKzY2NCw4IEBACiAKIAkJCS8qIEluaXRpYWxpemUgdGhlIG5ldyBvYmplY3QgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICh3YWxrX3N0YXRlLCBhcmcsCi0JCQkJCSBvcGNvZGUsICZvYmpfZGVzYyk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3AgKAorCQkJCQkgd2Fsa19zdGF0ZSwgYXJnLCBvcGNvZGUsICZvYmpfZGVzYyk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9ial9kZXNjKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMKaW5kZXggMjA3MWEwZC4uMTBmNzEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYwpAQCAtNzMsMTEgKzczLDEzIEBACiAJCQkgIGFjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSLAogCQkJICBhY3BpX2V4X29wY29kZV82QV8wVF8xUn07CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZQogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKKyAqICAgICAgICAgICAgICByZXN1bHRfb2JqICAgICAgLSBpZiBub24temVybywgcG9wIHJlc3VsdCBmcm9tIHJlc3VsdCBzdGFjawogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xMjQsNyArMTI2LDggQEAKIAl9CiAKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gcHJlZGljYXRlIG9ial9kZXNjPSVwIFN0YXRlPSVwXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJObyBwcmVkaWNhdGUgb2JqX2Rlc2M9JXAgU3RhdGU9JXBcbiIsCiAJCQlvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX09QRVJBTkQpOwpAQCAtMTk3LDcgKzIwMCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2JlZ2luX29wCiAgKgogICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAorICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFdoZXJlIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yMzMsNyArMjM2LDggQEAKIAkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwogCiAJCWlmIChhY3BpX25zX29wZW5zX3Njb3BlICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZSkpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiKCVzKSBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSIoJXMpIFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAogCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAod2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGUpLCBvcCkpOwogCiAJCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCAod2Fsa19zdGF0ZSk7CkBAIC0yOTcsMTEgKzMwMSwxMCBAQAogCiAJCWlmICh3YWxrX3N0YXRlLT53YWxrX3R5cGUgPT0gQUNQSV9XQUxLX01FVEhPRCkgewogCQkJLyoKLQkJCSAqIEZvdW5kIGEgbmFtZWQgb2JqZWN0IGRlY2xhcmF0aW9uIGR1cmluZyBtZXRob2QKLQkJCSAqIGV4ZWN1dGlvbjsgIHdlIG11c3QgZW50ZXIgdGhpcyBvYmplY3QgaW50byB0aGUKLQkJCSAqIG5hbWVzcGFjZS4gIFRoZSBjcmVhdGVkIG9iamVjdCBpcyB0ZW1wb3JhcnkgYW5kCi0JCQkgKiB3aWxsIGJlIGRlbGV0ZWQgdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24KLQkJCSAqIG9mIHRoaXMgbWV0aG9kLgorCQkJICogRm91bmQgYSBuYW1lZCBvYmplY3QgZGVjbGFyYXRpb24gZHVyaW5nIG1ldGhvZCBleGVjdXRpb247CisJCQkgKiB3ZSBtdXN0IGVudGVyIHRoaXMgb2JqZWN0IGludG8gdGhlIG5hbWVzcGFjZS4gIFRoZSBjcmVhdGVkCisJCQkgKiBvYmplY3QgaXMgdGVtcG9yYXJ5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgdXBvbiBjb21wbGV0aW9uIG9mCisJCQkgKiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLgogCQkJICovCiAJCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2JlZ2luX29wICh3YWxrX3N0YXRlLCBOVUxMKTsKIAkJfQpAQCAtMzM4LDggKzM0MSw2IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2VuZF9vcAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBPcCB0aGF0IGhhcyBiZWVuIGp1c3QgYmVlbiBjb21wbGV0ZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsazsgIEFyZ3VtZW50cyBoYXZlIG5vdyBiZWVuIGV2YWx1YXRlZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzg5LDcgKzM5MCw3IEBACiAJLyogRGVjb2RlIHRoZSBPcGNvZGUgQ2xhc3MgKi8KIAogCXN3aXRjaCAob3BfY2xhc3MpIHsKLQljYXNlIEFNTF9DTEFTU19BUkdVTUVOVDogICAgLyogY29uc3RhbnRzLCBsaXRlcmFscywgZXRjLiAtLSBkbyBub3RoaW5nICovCisJY2FzZSBBTUxfQ0xBU1NfQVJHVU1FTlQ6ICAgIC8qIGNvbnN0YW50cywgbGl0ZXJhbHMsIGV0Yy4gLSBkbyBub3RoaW5nICovCiAJCWJyZWFrOwogCiAKQEAgLTQxNywxMiArNDE4LDEyIEBACiAJCQkvKiBSZXNvbHZlIGFsbCBvcGVyYW5kcyAqLwogCiAJCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKHdhbGtfc3RhdGUtPm9wY29kZSwKLQkJCQkJICAmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSwKLQkJCQkJICB3YWxrX3N0YXRlKTsKKwkJCQkJICYod2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtMV0pLAorCQkJCQkgd2Fsa19zdGF0ZSk7CiAJCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCQkJQUNQSV9EVU1QX09QRVJBTkRTIChBQ1BJX1dBTEtfT1BFUkFORFMsIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSksCi0JCQkJCQkgIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcywgImFmdGVyIGV4X3Jlc29sdmVfb3BlcmFuZHMiKTsKKwkJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSksCisJCQkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcywgImFmdGVyIGV4X3Jlc29sdmVfb3BlcmFuZHMiKTsKIAkJCX0KIAkJfQogCkBAIC01MDYsNyArNTA3LDggQEAKIAkJCWlmICgob3AtPmFzbC5wYXJlbnQpICYmCiAJCQkgICAoKG9wLT5hc2wucGFyZW50LT5hc2wuYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgfHwKIAkJCQkob3AtPmFzbC5wYXJlbnQtPmFzbC5hbWxfb3Bjb2RlID09IEFNTF9WQVJfUEFDS0FHRV9PUCkpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJNZXRob2QgUmVmZXJlbmNlIGluIGEgUGFja2FnZSwgT3A9JXBcbiIsIG9wKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSJNZXRob2QgUmVmZXJlbmNlIGluIGEgUGFja2FnZSwgT3A9JXBcbiIsIG9wKSk7CiAJCQkJb3AtPmNvbW1vbi5ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wLT5hc2wudmFsdWUuYXJnLT5hc2wubm9kZS0+b2JqZWN0OwogCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob3AtPmFzbC52YWx1ZS5hcmctPmFzbC5ub2RlLT5vYmplY3QpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwpAQCAtNTgzLDEzICs1ODUsMTUgQEAKIAkJCWNhc2UgQU1MX05BTUVfT1A6CiAKIAkJCQkvKgotCQkJCSAqIFB1dCB0aGUgTm9kZSBvbiB0aGUgb2JqZWN0IHN0YWNrIChDb250YWlucyB0aGUgQUNQSSBOYW1lIG9mCi0JCQkJICogdGhpcyBvYmplY3QpCisJCQkJICogUHV0IHRoZSBOb2RlIG9uIHRoZSBvYmplY3Qgc3RhY2sgKENvbnRhaW5zIHRoZSBBQ1BJIE5hbWUKKwkJCQkgKiBvZiB0aGlzIG9iamVjdCkKIAkJCQkgKi8KIAkJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9ICh2b2lkICopIG9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZTsKIAkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOwogCi0JCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSAod2Fsa19zdGF0ZSwgb3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5ub2RlLCBvcC0+Y29tbW9uLnBhcmVudCk7CisJCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSAod2Fsa19zdGF0ZSwKKwkJCQkJCSBvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGUsCisJCQkJCQkgb3AtPmNvbW1vbi5wYXJlbnQpOwogCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtNjAwLDcgKzYwNCw3IEBACiAJCQljYXNlIEFNTF9JTlRfRVZBTF9TVUJUUkVFX09QOgogCiAJCQkJc3RhdHVzID0gYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzICh3YWxrX3N0YXRlLCBvcCwKLQkJCQkJCSAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGUpKTsKKwkJCQkJCSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZSkpOwogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgpAQCAtNjA5LDcgKzYxMyw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCS8qIERvbmUgd2l0aCB0aGlzIHJlc3VsdCBzdGF0ZSAoTm93IHRoYXQgb3BlcmFuZCBzdGFjayBpcyBidWlsdCkgKi8KKwkJCS8qIERvbmUgd2l0aCByZXN1bHQgc3RhdGUgKE5vdyB0aGF0IG9wZXJhbmQgc3RhY2sgaXMgYnVpbHQpICovCiAKIAkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCAod2Fsa19zdGF0ZSk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC02MjAsOCArNjI0LDcgQEAKIAkJCSAqIElmIGEgcmVzdWx0IG9iamVjdCB3YXMgcmV0dXJuZWQgZnJvbSBhYm92ZSwgcHVzaCBpdCBvbiB0aGUKIAkJCSAqIGN1cnJlbnQgcmVzdWx0IHN0YWNrCiAJCQkgKi8KLQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykgJiYKLQkJCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CisJCQlpZiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewogCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3B1c2ggKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUpOwogCQkJfQogCQkJYnJlYWs7CkBAIC02NTQsNyArNjU3LDggQEAKIAogCQljYXNlIEFNTF9UWVBFX1VOREVGSU5FRDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmRlZmluZWQgb3Bjb2RlIHR5cGUgT3A9JXBcbiIsIG9wKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiVW5kZWZpbmVkIG9wY29kZSB0eXBlIE9wPSVwXG4iLCBvcCkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfSU1QTEVNRU5URUQpOwogCiAKQEAgLTcwOSwxMyArNzEzLDE0IEBACiAJCXN0YXR1cyA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyIChzdGF0dXMsCiAJCQkJIHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLT5uYW1lLmludGVnZXIsIHdhbGtfc3RhdGUtPm9wY29kZSwKIAkJCQkgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCwgTlVMTCk7Ci0JCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7CisJCSh2b2lkKSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOwogCX0KIAogCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CiAJCS8qIEJyZWFrIHRvIGRlYnVnZ2VyIHRvIGRpc3BsYXkgcmVzdWx0ICovCiAKLQkJQUNQSV9ERUJVR0dFUl9FWEVDIChhY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdCAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHR0VSX0VYRUMgKGFjcGlfZGJfZGlzcGxheV9yZXN1bHRfb2JqZWN0ICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLAorCQkJCSB3YWxrX3N0YXRlKSk7CiAKIAkJLyoKIAkJICogRGVsZXRlIHRoZSByZXN1bHQgb3AgaWYgYW5kIG9ubHkgaWY6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMKaW5kZXggMDZkNzU4Ni4uMWFjMTk3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYwpAQCAtNzksMjAgKzc5LDIzIEBACiAKIAlzd2l0Y2ggKHBhc3NfbnVtYmVyKSB7CiAJY2FzZSAxOgotCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAgICAgICA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8IEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CisJCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgID0gQUNQSV9QQVJTRV9MT0FEX1BBU1MxIHwKKwkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwogCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9iZWdpbl9vcDsKIAkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9lbmRfb3A7CiAJCWJyZWFrOwogCiAJY2FzZSAyOgotCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAgICAgICA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8IEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CisJCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgID0gQUNQSV9QQVJTRV9MT0FEX1BBU1MxIHwKKwkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwogCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcDsKIAkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9lbmRfb3A7CiAJCWJyZWFrOwogCiAJY2FzZSAzOgogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgICAgICB8PSBBQ1BJX1BBUlNFX0VYRUNVVEUgIHwgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKKwkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgICAgICB8PSBBQ1BJX1BBUlNFX0VYRUNVVEUgIHwKKwkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwogCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19leGVjX2JlZ2luX29wOwogCQl3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgPSBhY3BpX2RzX2V4ZWNfZW5kX29wOwogI2VuZGlmCkBAIC0xMTEsOCArMTE0LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2JlZ2luX29wCiAgKgogICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIE9wIHRoYXQgaGFzIGJlZW4ganVzdCBiZWVuIHJlYWNoZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsazsgIEFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIGV2YWx1YXRlZCB5ZXQuCisgKiAgICAgICAgICAgICAgb3V0X29wICAgICAgICAgIC0gV2hlcmUgdG8gcmV0dXJuIG9wIGlmIGEgbmV3IG9uZSBpcyBjcmVhdGVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTE0Niw3ICsxNDgsOCBAQAogI2lmIDAKIAkJCWlmICgod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0VYRUNVVEUpIHx8CiAJCQkJKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19DT05UUk9MKSkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiXG5cbioqKkVYRUNVVEFCTEUgT1BDT0RFICVzKioqXG5cbiIsIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUpOworCQkJCWFjcGlfb3NfcHJpbnRmICgiXG5cbioqKkVYRUNVVEFCTEUgT1BDT0RFICVzKioqXG5cbiIsCisJCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUpOwogCQkJCSpvdXRfb3AgPSBvcDsKIAkJCQlyZXR1cm4gKEFFX0NUUkxfU0tJUCk7CiAJCQl9CkBAIC0xOTEsNyArMTk0LDggQEAKIAkJCSAqLwogCQkJYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdCAocGF0aCk7CiAJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwgb2JqZWN0X3R5cGUsCi0JCQkJCSAgIEFDUElfSU1PREVfTE9BRF9QQVNTMSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJCQkJICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCisJCQkJCSAgIHdhbGtfc3RhdGUsICYobm9kZSkpOwogCQl9CiAjZW5kaWYKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMjI0LDEwICsyMjgsMTIgQEAKIAkJCSAqICBOYW1lIChERUIsIDApCiAJCQkgKiAgU2NvcGUgKERFQikgeyAuLi4gfQogCQkJICoKLQkJCSAqIE5vdGU6IHNpbGVudGx5IGNoYW5nZSB0aGUgdHlwZSBoZXJlLiAgT24gdGhlIHNlY29uZCBwYXNzLCB3ZSB3aWxsIHJlcG9ydCBhIHdhcm5pbmcKKwkJCSAqIE5vdGU6IHNpbGVudGx5IGNoYW5nZSB0aGUgdHlwZSBoZXJlLiAgT24gdGhlIHNlY29uZCBwYXNzLCB3ZSB3aWxsIHJlcG9ydAorCQkJICogYSB3YXJuaW5nCiAJCQkgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCisJCQkJIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKIAkJCQlwYXRoLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpKSk7CiAKIAkJCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwpAQCAtMjM4LDcgKzI0NCw4IEBACiAKIAkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgYW4gZXJyb3IgKi8KIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIChDYW5ub3Qgb3ZlcnJpZGUpXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIChDYW5ub3Qgb3ZlcnJpZGUpXG4iLAogCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSksIHBhdGgpKTsKIAogCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKQEAgLTI0OSw3ICsyNTYsOCBAQAogCWRlZmF1bHQ6CiAKIAkJLyoKLQkJICogRm9yIGFsbCBvdGhlciBuYW1lZCBvcGNvZGVzLCB3ZSB3aWxsIGVudGVyIHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZS4KKwkJICogRm9yIGFsbCBvdGhlciBuYW1lZCBvcGNvZGVzLCB3ZSB3aWxsIGVudGVyIHRoZSBuYW1lIGludG8KKwkJICogdGhlIG5hbWVzcGFjZS4KIAkJICoKIAkJICogU2V0dXAgdGhlIHNlYXJjaCBmbGFncy4KIAkJICogU2luY2Ugd2UgYXJlIGVudGVyaW5nIGEgbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UsIHdlIGRvIG5vdCB3YW50IHRvCkBAIC0yNzksMTQgKzI4NywxNiBAQAogCQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG9iamVjdF90eXBlKSkpOwogCQl9CiAJCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJbJXNdIEJvdGggRmluZCBvciBDcmVhdGUgYWxsb3dlZFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSJbJXNdIEJvdGggRmluZCBvciBDcmVhdGUgYWxsb3dlZFxuIiwKIAkJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3RfdHlwZSkpKTsKIAkJfQogCiAJCS8qCiAJCSAqIEVudGVyIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIGludGVybmFsIG5hbWVzcGFjZS4gIFdlIGVudGVyIHRoZSBuYW1lCi0JCSAqIGFzIHdlIGdvIGRvd253YXJkIGluIHRoZSBwYXJzZSB0cmVlLiAgQW55IG5lY2Vzc2FyeSBzdWJvYmplY3RzIHRoYXQgaW52b2x2ZQotCQkgKiBhcmd1bWVudHMgdG8gdGhlIG9wY29kZSBtdXN0IGJlIGNyZWF0ZWQgYXMgd2UgZ28gYmFjayB1cCB0aGUgcGFyc2UgdHJlZSBsYXRlci4KKwkJICogYXMgd2UgZ28gZG93bndhcmQgaW4gdGhlIHBhcnNlIHRyZWUuICBBbnkgbmVjZXNzYXJ5IHN1Ym9iamVjdHMgdGhhdAorCQkgKiBpbnZvbHZlIGFyZ3VtZW50cyB0byB0aGUgb3Bjb2RlIG11c3QgYmUgY3JlYXRlZCBhcyB3ZSBnbyBiYWNrIHVwIHRoZQorCQkgKiBwYXJzZSB0cmVlIGxhdGVyLgogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAogCQkJCSAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBmbGFncywgd2Fsa19zdGF0ZSwgJihub2RlKSk7CkBAIC0zMzUsOCArMzQ1LDYgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2VuZF9vcAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBPcCB0aGF0IGhhcyBiZWVuIGp1c3QgYmVlbiBjb21wbGV0ZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsazsgIEFyZ3VtZW50cyBoYXZlIG5vdyBiZWVuIGV2YWx1YXRlZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzgzLDcgKzM5MSw5IEBACiAKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKIAkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfcmVnaW9uIChvcC0+bmFtZWQuZGF0YSwgb3AtPm5hbWVkLmxlbmd0aCwKLQkJCQkgICAoYWNwaV9hZHJfc3BhY2VfdHlwZSkgKChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi52YWx1ZS5pbnRlZ2VyKSwgd2Fsa19zdGF0ZSk7CisJCQkJICAgKGFjcGlfYWRyX3NwYWNlX3R5cGUpCisJCQkJCQkgKChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi52YWx1ZS5pbnRlZ2VyKSwKKwkJCQkJCSB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CkBAIC0zOTQsNyArNDA0LDggQEAKIAkJLyogRm9yIE5hbWUgb3Bjb2RlLCBnZXQgdGhlIG9iamVjdCB0eXBlIGZyb20gdGhlIGFyZ3VtZW50ICovCiAKIAkJaWYgKG9wLT5jb21tb24udmFsdWUuYXJnKSB7Ci0JCQlvYmplY3RfdHlwZSA9IChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAoKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLmFtbF9vcGNvZGUpKS0+b2JqZWN0X3R5cGU7CisJCQlvYmplY3RfdHlwZSA9IChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAoCisJCQkJKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLmFtbF9vcGNvZGUpKS0+b2JqZWN0X3R5cGU7CiAJCQlvcC0+Y29tbW9uLm5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOwogCQl9CiAJfQpAQCAtNDQ4LDggKzQ1OSw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMl9iZWdpbl9vcAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBPcCB0aGF0IGhhcyBiZWVuIGp1c3QgYmVlbiByZWFjaGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGs7ICBBcmd1bWVudHMgaGF2ZSBub3QgYmVlbiBldmFsdWF0ZWQgeWV0LgorICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFdoZXIgdG8gcmV0dXJuIG9wIGlmIGEgbmV3IG9uZSBpcyBjcmVhdGVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTQ3OCwxNCArNDg4LDIwIEBACiAJaWYgKG9wKSB7CiAJCS8qIFdlIG9ubHkgY2FyZSBhYm91dCBOYW1lc3BhY2Ugb3Bjb2RlcyBoZXJlICovCiAKLQkJaWYgKCghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05TT1BDT0RFKSAmJiAod2Fsa19zdGF0ZS0+b3Bjb2RlICE9IEFNTF9JTlRfTkFNRVBBVEhfT1ApKSB8fAorCQlpZiAoKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTlNPUENPREUpICYmCisJCQkgICh3YWxrX3N0YXRlLT5vcGNvZGUgIT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkpIHx8CiAJCQkoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OQU1FRCkpKSB7CisJCQlpZiAoKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19FWEVDVVRFKSB8fAorCQkJCSh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfQ09OVFJPTCkpIHsKKwkJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCisJCQkJCSJFbmNvdW50ZXJlZCBleGVjdXRhYmxlIGNvZGUgYXQgbW9kdWxlIGxldmVsLCBbJXNdXG4iLAorCQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSkpOworCQkJfQogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJCX0KIAotCQkvKgotCQkgKiBHZXQgdGhlIG5hbWUgd2UgYXJlIGdvaW5nIHRvIGVudGVyIG9yIGxvb2t1cCBpbiB0aGUgbmFtZXNwYWNlCi0JCSAqLworCQkvKiBHZXQgdGhlIG5hbWUgd2UgYXJlIGdvaW5nIHRvIGVudGVyIG9yIGxvb2t1cCBpbiB0aGUgbmFtZXNwYWNlICovCisKIAkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7CiAJCQkvKiBGb3IgTmFtZXBhdGggb3AsIGdldCB0aGUgcGF0aCBzdHJpbmcgKi8KIApAQCAtNTI4LDIxICs1NDQsMjUgQEAKIAljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6CiAKIAkJLyoKLQkJICogVGhlIG5hbWVfcGF0aCBpcyBhbiBvYmplY3QgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4gRG9uJ3QgZW50ZXIgdGhlCi0JCSAqIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cCBmb3IgdXNlIGxhdGVyCisJCSAqIFRoZSBuYW1lX3BhdGggaXMgYW4gb2JqZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBvYmplY3QuCisJCSAqIERvbid0IGVudGVyIHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgYnV0IGxvb2sgaXQgdXAKKwkJICogZm9yIHVzZSBsYXRlci4KIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLCBvYmplY3RfdHlwZSwKLQkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgd2Fsa19zdGF0ZSwgJihub2RlKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfU0NPUEVfT1A6CiAKIAkJLyoKLQkJICogVGhlIFBhdGggaXMgYW4gb2JqZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBvYmplY3QuICBEb24ndCBlbnRlciB0aGUKLQkJICogbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UsIGJ1dCBsb29rIGl0IHVwIGZvciB1c2UgbGF0ZXIKKwkJICogVGhlIFBhdGggaXMgYW4gb2JqZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBvYmplY3QuCisJCSAqIERvbid0IGVudGVyIHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgYnV0IGxvb2sgaXQgdXAKKwkJICogZm9yIHVzZSBsYXRlci4KIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLCBvYmplY3RfdHlwZSwKLQkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgd2Fsa19zdGF0ZSwgJihub2RlKSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKICNpZmRlZiBfQUNQSV9BU0xfQ09NUElMRVIKIAkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CkBAIC01ODIsNyArNjAyLDggQEAKIAkJCSAqICBTY29wZSAoREVCKSB7IC4uLiB9CiAJCQkgKi8KIAotCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJUeXBlIG92ZXJyaWRlIC0gWyU0LjRzXSBoYWQgaW52YWxpZCB0eXBlICglcykgZm9yIFNjb3BlIG9wZXJhdG9yLCBjaGFuZ2VkIHRvIChTY29wZSlcbiIsCisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCisJCQkJIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKIAkJCQlidWZmZXJfcHRyLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpKSk7CiAKIAkJCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwpAQCAtNTkzLDcgKzYxNCw4IEBACiAKIAkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgYW4gZXJyb3IgKi8KIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdXG4iLAogCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSksIGJ1ZmZlcl9wdHIpKTsKIAogCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKQEAgLTYyMSw4ICs2NDMsOSBAQAogCiAJCS8qCiAJCSAqIEVudGVyIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIGludGVybmFsIG5hbWVzcGFjZS4gIFdlIGVudGVyIHRoZSBuYW1lCi0JCSAqIGFzIHdlIGdvIGRvd253YXJkIGluIHRoZSBwYXJzZSB0cmVlLiAgQW55IG5lY2Vzc2FyeSBzdWJvYmplY3RzIHRoYXQgaW52b2x2ZQotCQkgKiBhcmd1bWVudHMgdG8gdGhlIG9wY29kZSBtdXN0IGJlIGNyZWF0ZWQgYXMgd2UgZ28gYmFjayB1cCB0aGUgcGFyc2UgdHJlZSBsYXRlci4KKwkJICogYXMgd2UgZ28gZG93bndhcmQgaW4gdGhlIHBhcnNlIHRyZWUuICBBbnkgbmVjZXNzYXJ5IHN1Ym9iamVjdHMgdGhhdAorCQkgKiBpbnZvbHZlIGFyZ3VtZW50cyB0byB0aGUgb3Bjb2RlIG11c3QgYmUgY3JlYXRlZCBhcyB3ZSBnbyBiYWNrIHVwIHRoZQorCQkgKiBwYXJzZSB0cmVlIGxhdGVyLgogCQkgKgogCQkgKiBOb3RlOiBOYW1lIG1heSBhbHJlYWR5IGV4aXN0IGlmIHdlIGFyZSBleGVjdXRpbmcgYSBkZWZlcnJlZCBvcGNvZGUuCiAJCSAqLwpAQCAtNjM1LDcgKzY1OCw4IEBACiAJCX0KIAogCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwgb2JqZWN0X3R5cGUsCi0JCQkJICBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfTk9fVVBTRUFSQ0gsIHdhbGtfc3RhdGUsICYobm9kZSkpOworCQkJCSAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX05PX1VQU0VBUkNILAorCQkJCSAgd2Fsa19zdGF0ZSwgJihub2RlKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjc4LDggKzcwMiw2IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMl9lbmRfb3AKICAqCiAgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gT3AgdGhhdCBoYXMgYmVlbiBqdXN0IGJlZW4gY29tcGxldGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGs7ICBBcmd1bWVudHMgaGF2ZSBub3cgYmVlbiBldmFsdWF0ZWQuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTczOCw3ICs3NjAsOCBAQAogCiAJLyogUG9wIHRoZSBzY29wZSBzdGFjayAqLwogCi0JaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUgKG9iamVjdF90eXBlKSAmJiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkpIHsKKwlpZiAoYWNwaV9uc19vcGVuc19zY29wZSAob2JqZWN0X3R5cGUpICYmCisJICAgKG9wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfSU5UX01FVEhPRENBTExfT1ApKSB7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiKCVzKSBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKIAkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAob2JqZWN0X3R5cGUpLCBvcCkpOwogCkBAIC04MDMsNyArODI2LDcgQEAKIAkJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6CiAKIAkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX2luZGV4X2ZpZWxkIChvcCwgKGFjcGlfaGFuZGxlKSBhcmctPmNvbW1vbi5ub2RlLAotCQkJCQkgICB3YWxrX3N0YXRlKTsKKwkJCQkJIHdhbGtfc3RhdGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBTUxfQkFOS19GSUVMRF9PUDoKQEAgLTg4NCwxNCArOTA3LDE2IEBACiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgogCQljYXNlIEFNTF9SRUdJT05fT1A6CiAJCQkvKgotCQkJICogVGhlIG9wX3JlZ2lvbiBpcyBub3QgZnVsbHkgcGFyc2VkIGF0IHRoaXMgdGltZS4gT25seSB2YWxpZCBhcmd1bWVudCBpcyB0aGUgc3BhY2VfaWQuCi0JCQkgKiAoV2UgbXVzdCBzYXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBBTUwgb2YgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvcGVyYW5kcykKKwkJCSAqIFRoZSBvcF9yZWdpb24gaXMgbm90IGZ1bGx5IHBhcnNlZCBhdCB0aGlzIHRpbWUuIE9ubHkgdmFsaWQKKwkJCSAqIGFyZ3VtZW50IGlzIHRoZSBzcGFjZV9pZC4gKFdlIG11c3Qgc2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUKKwkJCSAqIEFNTCBvZiB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9wZXJhbmRzKQogCQkJICovCiAJCQkvKgogCQkJICogSWYgd2UgaGF2ZSBhIHZhbGlkIHJlZ2lvbiwgaW5pdGlhbGl6ZSBpdAogCQkJICogTmFtZXNwYWNlIGlzIE5PVCBsb2NrZWQgYXQgdGhpcyBwb2ludC4KIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKSwgRkFMU0UpOworCQkJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKSwKKwkJCQkJIEZBTFNFKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQkvKgogCQkJCSAqICBJZiBBRV9OT1RfRVhJU1QgaXMgcmV0dXJuZWQsIGl0IGlzIG5vdCBmYXRhbApAQCAtOTQyLDE1ICs5NjcsMTYgQEAKIAkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewogCQkJLyoKIAkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdoYXQgd2UgZm91bmQgaXMgaW5kZWVkIGEgbWV0aG9kCi0JCQkgKiBXZSBkaWRuJ3Qgc2VhcmNoIGZvciBhIG1ldGhvZCBvbiBwdXJwb3NlLCB0byBzZWUgaWYgdGhlIG5hbWUgd291bGQgcmVzb2x2ZQorCQkJICogV2UgZGlkbid0IHNlYXJjaCBmb3IgYSBtZXRob2Qgb24gcHVycG9zZSwgdG8gc2VlIGlmIHRoZSBuYW1lCisJCQkgKiB3b3VsZCByZXNvbHZlCiAJCQkgKi8KIAkJCWlmIChuZXdfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfTUVUSE9EKSB7CiAJCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCX0KIAotCQkJLyogV2UgY291bGQgcHV0IHRoZSByZXR1cm5lZCBvYmplY3QgKE5vZGUpIG9uIHRoZSBvYmplY3Qgc3RhY2sgZm9yIGxhdGVyLCBidXQKLQkJCSAqIGZvciBub3csIHdlIHdpbGwgcHV0IGl0IGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKLQkJCSAqIGNhbiBnZXQgaXQgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGlzIHNjb3BlCisJCQkvKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IKKwkJCSAqIGxhdGVyLCBidXQgZm9yIG5vdywgd2Ugd2lsbCBwdXQgaXQgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlCisJCQkgKiBwYXJzZXIgdXNlcywgc28gd2UgY2FuIGdldCBpdCBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoaXMgc2NvcGUKIAkJCSAqLwogCQkJb3AtPmNvbW1vbi5ub2RlID0gbmV3X25vZGU7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCmluZGV4IDY1ZjQ1NjEuLjIxZjQ1NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYwpAQCAtNTAsMTQgKzUwLDEzIEBACiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc3dzY29wZSIpCiAKIAotI2RlZmluZSBTVEFDS19QT1AoaGVhZCkgaGVhZAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBQb3AgKGFuZCBmcmVlKSBldmVyeXRoaW5nIG9uIHRoZSBzY29wZSBzdGFjayBleGNlcHQgdGhlCiAgKiAgICAgICAgICAgICAgcm9vdCBzY29wZSBvYmplY3QgKHdoaWNoIHJlbWFpbnMgYXQgdGhlIHN0YWNrIHRvcC4pCkBAIC04MCw3ICs3OSw4IEBACiAJCXdhbGtfc3RhdGUtPnNjb3BlX2luZm8gPSBzY29wZV9pbmZvLT5zY29wZS5uZXh0OwogCiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkiUG9wcGVkIG9iamVjdCB0eXBlICglcylcbiIsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOworCQkJIlBvcHBlZCBvYmplY3QgdHlwZSAoJXMpXG4iLAorCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChzY29wZV9pbmZvLT5jb21tb24udmFsdWUpKSk7CiAJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHNjb3BlX2luZm8pOwogCX0KIH0KQEAgLTkwLDggKzkwLDExIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaAogICoKLSAqIFBBUkFNRVRFUlM6ICAqTm9kZSwgICAgICAgICAgICAgIC0gTmFtZSB0byBiZSBtYWRlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICBUeXBlLCAgICAgICAgICAgICAgIC0gVHlwZSBvZiBmcmFtZSBiZWluZyBwdXNoZWQKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOYW1lIHRvIGJlIG1hZGUgY3VycmVudAorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIFR5cGUgb2YgZnJhbWUgYmVpbmcgcHVzaGVkCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogUHVzaCB0aGUgY3VycmVudCBzY29wZSBvbiB0aGUgc2NvcGUgc3RhY2ssIGFuZCBtYWtlIHRoZQogICogICAgICAgICAgICAgIHBhc3NlZCBOb2RlIGN1cnJlbnQuCkBAIC0xMjEsNyArMTI0LDggQEAKIAkvKiBNYWtlIHN1cmUgb2JqZWN0IHR5cGUgaXMgdmFsaWQgKi8KIAogCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSAodHlwZSkpIHsKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJkc19zY29wZV9zdGFja19wdXNoOiBJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYXG4iLCB0eXBlKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKKwkJCSJkc19zY29wZV9zdGFja19wdXNoOiBJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYXG4iLCB0eXBlKSk7CiAJfQogCiAJLyogQWxsb2NhdGUgYSBuZXcgc2NvcGUgb2JqZWN0ICovCkBAIC0xNzAsMTYgKzE3NCwxMSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcAogICoKLSAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gVGhlIHR5cGUgb2YgZnJhbWUgdG8gYmUgZm91bmQKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCiAgKgotICogREVTQ1JJUFRJT046IFBvcCB0aGUgc2NvcGUgc3RhY2sgdW50aWwgYSBmcmFtZSBvZiB0aGUgcmVxdWVzdGVkIHR5cGUKLSAqICAgICAgICAgICAgICBpcyBmb3VuZC4KKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBSRVRVUk46ICAgICAgQ291bnQgb2YgZnJhbWVzIHBvcHBlZC4gIElmIG5vIGZyYW1lIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZQotICogICAgICAgICAgICAgIHdhcyBmb3VuZCwgdGhlIGNvdW50IGlzIHJldHVybmVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGFuZAotICogICAgICAgICAgICAgIHRoZSBzY29wZSBzdGFjayBpcyBlbXB0aWVkICh3aGljaCBzZXRzIHRoZSBjdXJyZW50IHNjb3BlCi0gKiAgICAgICAgICAgICAgdG8gdGhlIHJvb3QpLiAgSWYgdGhlIHNjb3BlIHN0YWNrIHdhcyBlbXB0eSBhdCBlbnRyeSwgdGhlCi0gKiAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgYSBuby1vcCBhbmQgcmV0dXJucyAwLgorICogREVTQ1JJUFRJT046IFBvcCB0aGUgc2NvcGUgc3RhY2sgb25jZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYwppbmRleCBlNTU1YjNmLi45Y2QzZGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMKQEAgLTUwLDY3ICs1MCwzMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHN3c3RhdGUiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9pbnNlcnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIE9iamVjdCB0byBwdXNoCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoZXJlIHRvIGluc2VydCB0aGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5zZXJ0IGFuIG9iamVjdCBvbnRvIHRoaXMgd2FsaydzIHJlc3VsdCBzdGFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogYWNwaV9zdGF0dXMKIGFjcGlfZHNfcmVzdWx0X2luc2VydCAoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0LAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAorYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X2luc2VydCIpOworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKK3ZvaWQgKgorYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworI2VuZGlmCiAKLQlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7Ci0JaWYgKCFzdGF0ZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKLQkJCXdhbGtfc3RhdGUpKTsKLQkJcmV0dXJuIChBRV9OT1RfRVhJU1QpOwotCX0KLQotCWlmIChpbmRleCA+PSBBQ1BJX09CSl9OVU1fT1BFUkFORFMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiSW5kZXggb3V0IG9mIHJhbmdlOiAlWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkJaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJOdWxsIE9iamVjdCEgSW5kZXg9JVggT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCWluZGV4LCBvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0Jc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4XSA9IG9iamVjdDsKLQlzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cysrOwotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJIk9iaj0lcCBbJXNdIFN0YXRlPSVwIE51bT0lWCBDdXI9JVhcbiIsCi0JCW9iamVjdCwgb2JqZWN0ID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgb2JqZWN0KSA6ICJOVUxMIiwKLQkJd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsIHdhbGtfc3RhdGUtPmN1cnJlbnRfcmVzdWx0KSk7Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQorI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTc4LDcgKzE0Miw2IEBACiAKICNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X3BvcApAQCAtMjI3LDE1ICsxOTAsMTggQEAKIAkJCSpvYmplY3QgPSBzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXggLTFdOwogCQkJc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4IC0xXSA9IE5VTEw7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBJbmRleD0lWCBTdGF0ZT0lcCBOdW09JVhcbiIsCi0JCQkJKm9iamVjdCwgKCpvYmplY3QpID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCkgOiAiTlVMTCIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJCSJPYmo9JXAgWyVzXSBJbmRleD0lWCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkJKm9iamVjdCwKKwkJCQkoKm9iamVjdCkgPyBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgqb2JqZWN0KSA6ICJOVUxMIiwKIAkJCQkodTMyKSBpbmRleCAtMSwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkiTm8gcmVzdWx0IG9iamVjdHMhIFN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7CiAJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIH0KIApAQCAtMjc0LDcgKzI0MCw4IEBACiAJfQogCiAJaWYgKCFzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwKKwkJCXdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CiAKQEAgLTI5Myw3ICsyNjAsOCBAQAogCS8qIENoZWNrIGZvciBhIHZhbGlkIHJlc3VsdCBvYmplY3QgKi8KIAogCWlmICghKm9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWCwgSW5kZXg9JVhcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWCwgSW5kZXg9JVhcbiIsCiAJCQl3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywgKHUzMikgaW5kZXgpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CkBAIC0zNDQsNyArMzEyLDggQEAKIAl9CiAKIAlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk51bGwgT2JqZWN0ISBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJOdWxsIE9iamVjdCEgT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKIAkJCW9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CkBAIC00MzksNDMgKzQwOCw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ2xlYXIgdGhlIG9iamVjdCBzdGFjayBieSBkZWxldGluZyBhbGwgb2JqZWN0cyB0aGF0IGFyZSBvbiBpdC4KLSAqICAgICAgICAgICAgICBTaG91bGQgYmUgdXNlZCB3aXRoIGdyZWF0IGNhcmUsIGlmIGF0IGFsbCEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwiLCB3YWxrX3N0YXRlKTsKLQotCi0JLyogVGhlIHN0YWNrIHNpemUgaXMgY29uZmlndXJhYmxlLCBidXQgZml4ZWQgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX09CSl9OVU1fT1BFUkFORFM7IGkrKykgewotCQlpZiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pIHsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOwotCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0gPSBOVUxMOwotCQl9Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7Ci19Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wdXNoCiAgKgogICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gcHVzaApAQCAtNTE3LDY3ICs0NDksNiBAQAogfQogCiAKLSNpZiAwCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHBvcF9jb3VudCAgICAgICAgICAgLSBOdW1iZXIgb2Ygb2JqZWN0cy9lbnRyaWVzIHRvIHBvcAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFBvcCB0aGlzIHdhbGsncyBvYmplY3Qgc3RhY2suICBPYmplY3RzIG9uIHRoZSBzdGFjayBhcmUgTk9UCi0gKiAgICAgICAgICAgICAgZGVsZXRlZCBieSB0aGlzIHJvdXRpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19vYmpfc3RhY2tfcG9wX29iamVjdCIpOwotCi0KLQkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCi0KLQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTWlzc2luZyBvcGVyYW5kL3N0YWNrIGVtcHR5ISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7Ci0JCSpvYmplY3QgPSBOVUxMOwotCQlyZXR1cm4gKEFFX0FNTF9OT19PUEVSQU5EKTsKLQl9Ci0KLQkvKiBQb3AgdGhlIHN0YWNrICovCi0KLQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMtLTsKLQotCS8qIENoZWNrIGZvciBhIHZhbGlkIG9wZXJhbmQgKi8KLQotCWlmICghd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7Ci0JCSpvYmplY3QgPSBOVUxMOwotCQlyZXR1cm4gKEFFX0FNTF9OT19PUEVSQU5EKTsKLQl9Ci0KLQkvKiBHZXQgb3BlcmFuZCBhbmQgc2V0IHN0YWNrIGVudHJ5IHRvIG51bGwgKi8KLQotCSpvYmplY3QgPSB3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXTsKLQl3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCSAgKm9iamVjdCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCksCi0JCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wb3AKQEAgLTY4MCw0OCArNTUxLDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlCi0gKgotICogUEFSQU1FVEVSUzogIEluZGV4ICAgICAgICAgICAgICAgLSBTdGFjayBpbmRleCB3aG9zZSB2YWx1ZSBpcyBkZXNpcmVkLiAgQmFzZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGluZGV4PTAgPT0gdG9wKQotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlIGFuIG9iamVjdCBmcm9tIHRoaXMgd2FsaydzIG9iamVjdCBzdGFjay4gIEluZGV4IG11c3QKLSAqICAgICAgICAgICAgICBiZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdm9pZCAqCi1hY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2dldF92YWx1ZSIsIHdhbGtfc3RhdGUpOwotCi0KLQkvKiBDYW4ndCBkbyBpdCBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgKi8KLQotCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQkvKiBvciBpZiB0aGUgaW5kZXggaXMgcGFzdCB0aGUgdG9wIG9mIHRoZSBzdGFjayAqLwotCi0JaWYgKGluZGV4ID4gKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtICh1MzIpIDEpKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOwotCX0KLQotCXJldHVybl9QVFIgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWyhhY3BpX25hdGl2ZV91aW50KSh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxKSAtCi0JCQkgIGluZGV4XSk7Ci19Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUKICAqCiAgKiBQQVJBTUVURVJTOiAgVGhyZWFkICAgICAgICAgIC0gR2V0IGN1cnJlbnQgYWN0aXZlIHN0YXRlIGZvciB0aGlzIFRocmVhZApAQCAtNzU3LDExICs1ODYsMTEgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZQogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBTdGF0ZSB0byBwdXNoCi0gKiAgICAgICAgICAgICAgd2Fsa19saXN0ICAgICAgIC0gVGhlIGxpc3QgdGhhdCBvd25zIHRoZSB3YWxrIHN0YWNrCisgKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gVGhyZWFkIHN0YXRlIG9iamVjdAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IFBsYWNlIHRoZSB3YWxrX3N0YXRlIGF0IHRoZSBoZWFkIG9mIHRoZSBzdGF0ZSBsaXN0LgorICogREVTQ1JJUFRJT046IFBsYWNlIHRoZSBUaHJlYWQgc3RhdGUgYXQgdGhlIGhlYWQgb2YgdGhlIHN0YXRlIGxpc3QuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNzg0LDkgKzYxMyw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcG9wX3dhbGtfc3RhdGUKICAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19saXN0ICAgICAgIC0gVGhlIGxpc3QgdGhhdCBvd25zIHRoZSB3YWxrIHN0YWNrCisgKiBQQVJBTUVURVJTOiAgVGhyZWFkICAgICAgLSBDdXJyZW50IHRocmVhZCBzdGF0ZQogICoKLSAqIFJFVFVSTjogICAgICBBIHdhbGtfc3RhdGUgb2JqZWN0IHBvcHBlZCBmcm9tIHRoZSBzdGFjaworICogUkVUVVJOOiAgICAgIEEgd2Fsa19zdGF0ZSBvYmplY3QgcG9wcGVkIGZyb20gdGhlIHRocmVhZCdzIHN0YWNrCiAgKgogICogREVTQ1JJUFRJT046IFJlbW92ZSBhbmQgcmV0dXJuIHRoZSB3YWxrc3RhdGUgb2JqZWN0IHRoYXQgaXMgYXQgdGhlIGhlYWQgb2YKICAqICAgICAgICAgICAgICB0aGUgd2FsayBzdGFjayBmb3IgdGhlIGdpdmVuIHdhbGsgbGlzdC4gIE5VTEwgaW5kaWNhdGVzIHRoYXQKQEAgLTgxNCw3ICs2NDMsNyBAQAogCQkvKgogCQkgKiBEb24ndCBjbGVhciB0aGUgTkVYVCBmaWVsZCwgdGhpcyBzZXJ2ZXMgYXMgYW4gaW5kaWNhdG9yCiAJCSAqIHRoYXQgdGhlcmUgaXMgYSBwYXJlbnQgV0FMSyBTVEFURQotCQkgKiAgICAgTk86IHdhbGtfc3RhdGUtPk5leHQgPSBOVUxMOworCQkgKiBEbyBOb3Q6IHdhbGtfc3RhdGUtPk5leHQgPSBOVUxMOwogCQkgKi8KIAl9CiAKQEAgLTgyNiw3ICs2NTUsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlCiAgKgotICogUEFSQU1FVEVSUzogIE9yaWdpbiAgICAgICAgICAtIFN0YXJ0aW5nIHBvaW50IGZvciB0aGlzIHdhbGsKKyAqIFBBUkFNRVRFUlM6ICBvd25lcl9pZCAgICAgICAgLSBJRCBmb3Igb2JqZWN0IGNyZWF0aW9uCisgKiAgICAgICAgICAgICAgT3JpZ2luICAgICAgICAgIC0gU3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMgd2FsaworICogICAgICAgICAgICAgIG10aF9kZXNjICAgICAgICAtIE1ldGhvZCBvYmplY3QKICAqICAgICAgICAgICAgICBUaHJlYWQgICAgICAgICAgLSBDdXJyZW50IHRocmVhZCBzdGF0ZQogICoKICAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBuZXcgd2FsayBzdGF0ZS4KQEAgLTg5Niw4ICs3MjcsNyBAQAogICogICAgICAgICAgICAgIG1ldGhvZF9ub2RlICAgICAtIENvbnRyb2wgbWV0aG9kIE5TIG5vZGUsIGlmIGFueQogICogICAgICAgICAgICAgIGFtbF9zdGFydCAgICAgICAtIFN0YXJ0IG9mIEFNTAogICogICAgICAgICAgICAgIGFtbF9sZW5ndGggICAgICAtIExlbmd0aCBvZiBBTUwKLSAqICAgICAgICAgICAgICBQYXJhbXMgICAgICAgICAgLSBNZXRob2QgYXJncywgaWYgYW55Ci0gKiAgICAgICAgICAgICAgcmV0dXJuX29ial9kZXNjIC0gV2hlcmUgdG8gc3RvcmUgYSByZXR1cm4gb2JqZWN0LCBpZiBhbnkKKyAqICAgICAgICAgICAgICBJbmZvICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jayAocGFyYW1zLCBldGMuKQogICogICAgICAgICAgICAgIHBhc3NfbnVtYmVyICAgICAtIDEsIDIsIG9yIDMKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC05MzEsNyArNzYxLDcgQEAKIAogCS8qIFRoZSBuZXh0X29wIG9mIHRoZSBuZXh0X3dhbGsgd2lsbCBiZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2QgKi8KIAotCXdhbGtfc3RhdGUtPm5leHRfb3AgICAgICAgICAgICAgPSBOVUxMOworCXdhbGtfc3RhdGUtPm5leHRfb3AgPSBOVUxMOwogCiAJaWYgKGluZm8pIHsKIAkJaWYgKGluZm8tPnBhcmFtZXRlcl90eXBlID09IEFDUElfUEFSQU1fR1BFKSB7CkBAIC05MzksOCArNzY5LDggQEAKIAkJCQkJICAgaW5mby0+cGFyYW1ldGVycyk7CiAJCX0KIAkJZWxzZSB7Ci0JCQl3YWxrX3N0YXRlLT5wYXJhbXMgICAgICAgICAgICAgID0gaW5mby0+cGFyYW1ldGVyczsKLQkJCXdhbGtfc3RhdGUtPmNhbGxlcl9yZXR1cm5fZGVzYyAgPSAmaW5mby0+cmV0dXJuX29iamVjdDsKKwkJCXdhbGtfc3RhdGUtPnBhcmFtcyAgICAgICAgICA9IGluZm8tPnBhcmFtZXRlcnM7CisJCQl3YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MgPSAmaW5mby0+cmV0dXJuX29iamVjdDsKIAkJfQogCX0KIApAQCAtOTY0LDcgKzc5NCw4IEBACiAKIAkJLyogSW5pdCB0aGUgbWV0aG9kIGFyZ3VtZW50cyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzICh3YWxrX3N0YXRlLT5wYXJhbXMsIEFDUElfTUVUSE9EX05VTV9BUkdTLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MgKHdhbGtfc3RhdGUtPnBhcmFtcywKKwkJCQkgQUNQSV9NRVRIT0RfTlVNX0FSR1MsIHdhbGtfc3RhdGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTEwMzEsMTIgKzg2MiwxNCBAQAogCX0KIAogCWlmICh3YWxrX3N0YXRlLT5kYXRhX3R5cGUgIT0gQUNQSV9ERVNDX1RZUEVfV0FMSykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiVwIGlzIG5vdCBhIHZhbGlkIHdhbGsgc3RhdGVcbiIsIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIlcCBpcyBub3QgYSB2YWxpZCB3YWxrIHN0YXRlXG4iLAorCQkJd2Fsa19zdGF0ZSkpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zY29wZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiVwIHdhbGsgc3RpbGwgaGFzIGEgc2NvcGUgbGlzdFxuIiwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiVwIHdhbGsgc3RpbGwgaGFzIGEgc2NvcGUgbGlzdFxuIiwKKwkJCXdhbGtfc3RhdGUpKTsKIAl9CiAKIAkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KQEAgLTEwNzgsNyArOTExLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IFB1cmdlIHRoZSBnbG9iYWwgc3RhdGUgb2JqZWN0IGNhY2hlLiAgVXNlZCBkdXJpbmcgc3Vic3lzdGVtCiAgKiAgICAgICAgICAgICAgdGVybWluYXRpb24uCkBAIC0xMDk4LDMgKzkzMSwyMDAgQEAKICNlbmRpZgogCiAKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN1bHRfaW5zZXJ0CisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gcHVzaAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGVyZSB0byBpbnNlcnQgdGhlIG9iamVjdAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc2VydCBhbiBvYmplY3Qgb250byB0aGlzIHdhbGsncyByZXN1bHQgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19yZXN1bHRfaW5zZXJ0ICgKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOworCisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19yZXN1bHRfaW5zZXJ0Iik7CisKKworCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKKwlpZiAoIXN0YXRlKSB7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLAorCQkJd2Fsa19zdGF0ZSkpOworCQlyZXR1cm4gKEFFX05PVF9FWElTVCk7CisJfQorCisJaWYgKGluZGV4ID49IEFDUElfT0JKX05VTV9PUEVSQU5EUykgeworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJJbmRleCBvdXQgb2YgcmFuZ2U6ICVYIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQlpbmRleCwgb2JqZWN0LCB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmICghb2JqZWN0KSB7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIk51bGwgT2JqZWN0ISBJbmRleD0lWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXhdID0gb2JqZWN0OworCXN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKys7CisKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkiT2JqPSVwIFslc10gU3RhdGU9JXAgTnVtPSVYIEN1cj0lWFxuIiwKKwkJb2JqZWN0LCBvYmplY3QgPyBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKSBvYmplY3QpIDogIk5VTEwiLAorCQl3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywgd2Fsa19zdGF0ZS0+Y3VycmVudF9yZXN1bHQpKTsKKworCXJldHVybiAoQUVfT0spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2xlYXIgdGhlIG9iamVjdCBzdGFjayBieSBkZWxldGluZyBhbGwgb2JqZWN0cyB0aGF0IGFyZSBvbiBpdC4KKyAqICAgICAgICAgICAgICBTaG91bGQgYmUgdXNlZCB3aXRoIGdyZWF0IGNhcmUsIGlmIGF0IGFsbCEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbCAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3sKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwiLCB3YWxrX3N0YXRlKTsKKworCisJLyogVGhlIHN0YWNrIHNpemUgaXMgY29uZmlndXJhYmxlLCBidXQgZml4ZWQgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX09CSl9OVU1fT1BFUkFORFM7IGkrKykgeworCQlpZiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pIHsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOworCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0gPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSBwb3BwZWQgb2JqZWN0CisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUG9wIHRoaXMgd2FsaydzIG9iamVjdCBzdGFjay4gIE9iamVjdHMgb24gdGhlIHN0YWNrIGFyZSBOT1QKKyAqICAgICAgICAgICAgICBkZWxldGVkIGJ5IHRoaXMgcm91dGluZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQoreworCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX29ial9zdGFja19wb3Bfb2JqZWN0Iik7CisKKworCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KKworCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJNaXNzaW5nIG9wZXJhbmQvc3RhY2sgZW1wdHkhIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJCQl3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKKwkJKm9iamVjdCA9IE5VTEw7CisJCXJldHVybiAoQUVfQU1MX05PX09QRVJBTkQpOworCX0KKworCS8qIFBvcCB0aGUgc3RhY2sgKi8KKworCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcy0tOworCisJLyogQ2hlY2sgZm9yIGEgdmFsaWQgb3BlcmFuZCAqLworCisJaWYgKCF3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJCQl3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKKwkJKm9iamVjdCA9IE5VTEw7CisJCXJldHVybiAoQUVfQU1MX05PX09QRVJBTkQpOworCX0KKworCS8qIEdldCBvcGVyYW5kIGFuZCBzZXQgc3RhY2sgZW50cnkgdG8gbnVsbCAqLworCisJKm9iamVjdCA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdOworCXdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdID0gTlVMTDsKKworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJICAqb2JqZWN0LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgqb2JqZWN0KSwKKwkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5kZXggICAgICAgICAgICAgICAtIFN0YWNrIGluZGV4IHdob3NlIHZhbHVlIGlzIGRlc2lyZWQuICBCYXNlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayAoaW5kZXg9MCA9PSB0b3ApCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgb3BlcmFuZAorICoKKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSBhbiBvYmplY3QgZnJvbSB0aGlzIHdhbGsncyBvcGVyYW5kIHN0YWNrLiAgSW5kZXggbXVzdAorICogICAgICAgICAgICAgIGJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICoKK2FjcGlfZHNfb2JqX3N0YWNrX2dldF92YWx1ZSAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQoreworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19vYmpfc3RhY2tfZ2V0X3ZhbHVlIiwgd2Fsa19zdGF0ZSk7CisKKworCS8qIENhbid0IGRvIGl0IGlmIHRoZSBzdGFjayBpcyBlbXB0eSAqLworCisJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7CisJCXJldHVybl9QVFIgKE5VTEwpOworCX0KKworCS8qIG9yIGlmIHRoZSBpbmRleCBpcyBwYXN0IHRoZSB0b3Agb2YgdGhlIHN0YWNrICovCisKKwlpZiAoaW5kZXggPiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gKHUzMikgMSkpIHsKKwkJcmV0dXJuX1BUUiAoTlVMTCk7CisJfQorCisJcmV0dXJuX1BUUiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbKGFjcGlfbmF0aXZlX3VpbnQpKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDEpIC0KKwkJCSAgaW5kZXhdKTsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggZmRmMTQzYi4uOGU2NjVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgpAQCAtNDksMTcgKzUwLDE5IEBACiAKICNkZWZpbmUgQUNQSV9FQ19GTEFHX09CRgkweDAxCS8qIE91dHB1dCBidWZmZXIgZnVsbCAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfSUJGCTB4MDIJLyogSW5wdXQgYnVmZmVyIGZ1bGwgKi8KKyNkZWZpbmUgQUNQSV9FQ19GTEFHX0JVUlNUCTB4MTAJLyogYnVyc3QgbW9kZSAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfU0NJCTB4MjAJLyogRUMtU0NJIG9jY3VycmVkICovCiAKICNkZWZpbmUgQUNQSV9FQ19FVkVOVF9PQkYJMHgwMQkvKiBPdXRwdXQgYnVmZmVyIGZ1bGwgKi8KICNkZWZpbmUgQUNQSV9FQ19FVkVOVF9JQkUJMHgwMgkvKiBJbnB1dCBidWZmZXIgZW1wdHkgKi8KIAotI2RlZmluZSBBQ1BJX0VDX1VERUxBWQkJMTAwCS8qIFBvbGwgQCAxMDB1cyBpbmNyZW1lbnRzICovCi0jZGVmaW5lIEFDUElfRUNfVURFTEFZX0NPVU5UCTEwMDAJLyogV2FpdCAxMG1zIG1heC4gZHVyaW5nIEVDIG9wcyAqLworI2RlZmluZSBBQ1BJX0VDX0RFTEFZCQk1MAkvKiBXYWl0IDUwbXMgbWF4LiBkdXJpbmcgRUMgb3BzICovCiAjZGVmaW5lIEFDUElfRUNfVURFTEFZX0dMSwkxMDAwCS8qIFdhaXQgMW1zIG1heC4gdG8gZ2V0IGdsb2JhbCBsb2NrICovCiAKICNkZWZpbmUgQUNQSV9FQ19DT01NQU5EX1JFQUQJMHg4MAogI2RlZmluZSBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUJMHg4MQorI2RlZmluZSBBQ1BJX0VDX0JVUlNUX0VOQUJMRQkweDgyCisjZGVmaW5lIEFDUElfRUNfQlVSU1RfRElTQUJMRQkweDgzCiAjZGVmaW5lIEFDUElfRUNfQ09NTUFORF9RVUVSWQkweDg0CiAKIHN0YXRpYyBpbnQgYWNwaV9lY19hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKQEAgLTg3LDcgKzkwLDExIEBACiAJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCWNvbW1hbmRfYWRkcjsKIAlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MJZGF0YV9hZGRyOwogCXVuc2lnbmVkIGxvbmcJCQlnbG9iYWxfbG9jazsKLQlzcGlubG9ja190CQkJbG9jazsKKwl1bnNpZ25lZCBpbnQJCQlleHBlY3RfZXZlbnQ7CisJYXRvbWljX3QJCQlsZWF2aW5nX2J1cnN0OyAvKiAwIDogTm8sIDEgOiBZZXMsIDI6IGFib3J0Ki8KKwlhdG9taWNfdAkJCXBlbmRpbmdfZ3BlOworCXN0cnVjdCBzZW1hcGhvcmUJCXNlbTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJd2FpdDsKIH07CiAKIC8qIElmIHdlIGZpbmQgYW4gRUMgdmlhIHRoZSBFQ0RULCB3ZSBuZWVkIHRvIGtlZXAgYSBwdHIgdG8gaXRzIGNvbnRleHQgKi8KQEAgLTEwMCw0MiArMTA3LDEyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbiBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3dhaXQgKAotCXN0cnVjdCBhY3BpX2VjCQkqZWMsCi0JdTgJCQlldmVudCkKK3N0YXRpYyBpbmxpbmUgdTMyIGFjcGlfZWNfcmVhZF9zdGF0dXMoc3RydWN0IGFjcGlfZWMgKmVjKQogewotCXUzMgkJCWFjcGlfZWNfc3RhdHVzID0gMDsKLQl1MzIJCQlpID0gQUNQSV9FQ19VREVMQVlfQ09VTlQ7CisJdTMyCXN0YXR1cyA9IDA7CiAKLQlpZiAoIWVjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFBvbGwgdGhlIEVDIHN0YXR1cyByZWdpc3RlciB3YWl0aW5nIGZvciB0aGUgZXZlbnQgdG8gb2NjdXIuICovCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgQUNQSV9FQ19FVkVOVF9PQkY6Ci0JCWRvIHsKLQkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLCAmZWMtPnN0YXR1c19hZGRyKTsKLQkJCWlmIChhY3BpX2VjX3N0YXR1cyAmIEFDUElfRUNfRkxBR19PQkYpCi0JCQkJcmV0dXJuIDA7Ci0JCQl1ZGVsYXkoQUNQSV9FQ19VREVMQVkpOwotCQl9IHdoaWxlICgtLWk+MCk7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkU6Ci0JCWRvIHsKLQkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLCAmZWMtPnN0YXR1c19hZGRyKTsKLQkJCWlmICghKGFjcGlfZWNfc3RhdHVzICYgQUNQSV9FQ19GTEFHX0lCRikpCi0JCQkJcmV0dXJuIDA7Ci0JCQl1ZGVsYXkoQUNQSV9FQ19VREVMQVkpOwotCQl9IHdoaWxlICgtLWk+MCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAtRVRJTUU7CisJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmc3RhdHVzLCAmZWMtPnN0YXR1c19hZGRyKTsKKwlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgaW50IGFjcGlfZWNfd2FpdChzdHJ1Y3QgYWNwaV9lYyAqZWMsIHVuc2lnbmVkIGludCBldmVudCkKK3sKKwlpbnQJcmVzdWx0ID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfd2FpdCIpOworCisJZWMtPmV4cGVjdF9ldmVudCA9IGV2ZW50OworCXNtcF9tYigpOworCisJcmVzdWx0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZWMtPndhaXQsCisJCQkJCSFlYy0+ZXhwZWN0X2V2ZW50LAorCQkJCQltc2Vjc190b19qaWZmaWVzKEFDUElfRUNfREVMQVkpKTsKKwkKKwllYy0+ZXhwZWN0X2V2ZW50ID0gMDsKKwlzbXBfbWIoKTsKKworCWlmIChyZXN1bHQgPCAwKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiIHJlc3VsdCAgPSAlZCAiLCByZXN1bHQpKTsKKwkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CisJfQorCisJLyoKKwkgKiBWZXJpZnkgdGhhdCB0aGUgZXZlbnQgaW4gcXVlc3Rpb24gaGFzIGFjdHVhbGx5IGhhcHBlbmVkIGJ5CisJICogcXVlcnlpbmcgRUMgc3RhdHVzLiBEbyB0aGUgY2hlY2sgZXZlbiBpZiBvcGVyYXRpb24gdGltZWQtb3V0CisJICogdG8gbWFrZSBzdXJlIHRoYXQgd2UgZGlkIG5vdCBtaXNzIGludGVycnVwdC4KKwkgKi8KKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBBQ1BJX0VDX0VWRU5UX09CRjoKKwkJaWYgKGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX09CRikKKwkJCXJldHVybl9WQUxVRSgwKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfRUNfRVZFTlRfSUJFOgorCQlpZiAofmFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX0lCRikKKwkJCXJldHVybl9WQUxVRSgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuX1ZBTFVFKC1FVElNRSk7Cit9CisKKworCitzdGF0aWMgaW50CithY3BpX2VjX2VudGVyX2J1cnN0X21vZGUgKAorCXN0cnVjdCBhY3BpX2VjCQkqZWMpCit7CisJdTMyCQkJdG1wID0gMDsKKwlpbnQJCQlzdGF0dXMgPSAwOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlIik7CisKKwlzdGF0dXMgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKKwlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYKKwkJIShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJlbnRlcmluZyBidXJzdCBtb2RlIFxuIikpOworCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwgJmVjLT5jb21tYW5kX2FkZHIpOworCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKKwkJaWYgKHN0YXR1cyl7CisJCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCIgc3RhdHVzID0gJWRcbiIsIHN0YXR1cykpOworCQkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCQl9CisJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnRtcCwgJmVjLT5kYXRhX2FkZHIpOworCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCWlmKHRtcCAhPSAweDkwICkgey8qIEJ1cnN0IEFDSyBieXRlKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIkFjayBmYWlsZWQgXG4iKSk7CisJCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJCX0KKwl9IGVsc2UKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJhbHJlYWR5IGJlIGluIGJ1cnN0IG1vZGUgXG4iKSk7CisJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QgLCAwKTsKKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZSAoCisJc3RydWN0IGFjcGlfZWMJCSplYykKK3sKKwlpbnQJCQlzdGF0dXMgPTA7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUiKTsKKworCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0ICwgMSk7CisJc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7CisJaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmCisJCShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJsZWF2aW5nIGJ1cnN0IG1vZGVcbiIpKTsKKwkJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19CVVJTVF9ESVNBQkxFLCAmZWMtPmNvbW1hbmRfYWRkcik7CisJCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19GTEFHX0lCRik7CisJCWlmIChzdGF0dXMpeworCQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiLS0tLS0tLT53YWl0IGZhaWxcbiIpKTsKKwkJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwkJfQorCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOworCQlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYKKwkJCShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCItLS0tLS0tPnN0YXR1cyBmYWlsXG4iKSk7CisJCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJCX0KKwl9ZWxzZQorCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sImFscmVhZHkgYmUgaW4gTm9uLWJ1cnN0IG1vZGUgXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJsZWF2aW5nIGJ1cnN0IG1vZGVcbiIpKTsKKworCXJldHVybl9WQUxVRSgwKTsKK30KIAogc3RhdGljIGludAogYWNwaV9lY19yZWFkICgKQEAgLTE0MywxNiArMjMwLDE1IEBACiAJdTgJCQlhZGRyZXNzLAogCXUzMgkJCSpkYXRhKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWludAkJCXN0YXR1cyA9IDA7CisJdTMyCQkJZ2xrOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19yZWFkIik7CiAKIAlpZiAoIWVjIHx8ICFkYXRhKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKK3JldHJ5OgogCSpkYXRhID0gMDsKIAogCWlmIChlYy0+Z2xvYmFsX2xvY2spIHsKQEAgLTE2MCwzMiArMjQ2LDUwIEBACiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisKKwlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKKwlkb3duKCZlYy0+c2VtKTsKKworCWlmKGFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZShlYykpCisJCWdvdG8gZW5kOwogCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsICZlYy0+Y29tbWFuZF9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAocmVzdWx0KQorCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwlpZiAoc3RhdHVzKSB7CiAJCWdvdG8gZW5kOworCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+ZGF0YV9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQlpZiAocmVzdWx0KQorCXN0YXR1cz0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7CisJaWYgKHN0YXR1cyl7CisJCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAkJZ290byBlbmQ7Ci0KKwl9CiAKIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+ZGF0YV9hZGRyKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWFkIFslMDJ4XSBmcm9tIGFkZHJlc3MgWyUwMnhdXG4iLAogCQkqZGF0YSwgYWRkcmVzcykpOwotCisJCiBlbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoZWMpOworCXVwKCZlYy0+c2VtKTsKIAogCWlmIChlYy0+Z2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwogCi0JcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CisJaWYoYXRvbWljX3JlYWQoJmVjLT5sZWF2aW5nX2J1cnN0KSA9PSAyKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJhYm9ydGVkLCByZXRyeSAuLi5cbiIpKTsKKwkJd2hpbGUoYXRvbWljX3JlYWQoJmVjLT5wZW5kaW5nX2dwZSkpeworCQkJbXNsZWVwKDEpOwkKKwkJfQorCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCWdvdG8gcmV0cnk7CisJfQorCisJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKIApAQCAtMTk1LDQ5ICsyOTksODAgQEAKIAl1OAkJCWFkZHJlc3MsCiAJdTgJCQlkYXRhKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWludAkJCXN0YXR1cyA9IDA7CisJdTMyCQkJZ2xrOworCXUzMgkJCXRtcDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfd3JpdGUiKTsKIAogCWlmICghZWMpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQorcmV0cnk6CiAJaWYgKGVjLT5nbG9iYWxfbG9jaykgewogCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOworCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOworCWRvd24oJmVjLT5zZW0pOworCisJaWYoYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKSkKKwkJZ290byBlbmQ7CisKKwlzdGF0dXMgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKKwlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYKKwkJIShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKKwkJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19CVVJTVF9FTkFCTEUsICZlYy0+Y29tbWFuZF9hZGRyKTsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGVuZDsKKwkJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmdG1wLCAmZWMtPmRhdGFfYWRkcik7CisJCWlmKHRtcCAhPSAweDkwICkgLyogQnVyc3QgQUNLIGJ5dGUqLworCQkJZ290byBlbmQ7CisJfQorCS8qTm93IHdlIGFyZSBpbiBidXJzdCBtb2RlKi8KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9XUklURSwgJmVjLT5jb21tYW5kX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWlmIChyZXN1bHQpCisJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CisJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCWlmIChzdGF0dXMpewogCQlnb3RvIGVuZDsKKwl9CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBhZGRyZXNzLCAmZWMtPmRhdGFfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHJlc3VsdCkKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwlpZiAoc3RhdHVzKXsKKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCQlnb3RvIGVuZDsKKwl9CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBkYXRhLCAmZWMtPmRhdGFfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHJlc3VsdCkKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJaWYgKHN0YXR1cykKIAkJZ290byBlbmQ7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJXcm90ZSBbJTAyeF0gdG8gYWRkcmVzcyBbJTAyeF1cbiIsCiAJCWRhdGEsIGFkZHJlc3MpKTsKIAogZW5kOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7CisJYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlKGVjKTsKKwl1cCgmZWMtPnNlbSk7CiAKIAlpZiAoZWMtPmdsb2JhbF9sb2NrKQogCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKIAotCXJldHVybl9WQUxVRShyZXN1bHQpOworCWlmKGF0b21pY19yZWFkKCZlYy0+bGVhdmluZ19idXJzdCkgPT0gMil7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywiYWJvcnRlZCwgcmV0cnkgLi4uXG4iKSk7CisJCXdoaWxlKGF0b21pY19yZWFkKCZlYy0+cGVuZGluZ19ncGUpKXsKKwkJCW1zbGVlcCgxKTsJCisJCX0KKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQlnb3RvIHJldHJ5OworCX0KKworCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCiAvKgpAQCAtMjg5LDE2ICs0MjQsMTMgQEAKIAlzdHJ1Y3QgYWNwaV9lYwkJKmVjLAogCXUzMgkJCSpkYXRhKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWludAkJCXN0YXR1cyA9IDA7CisJdTMyCQkJZ2xrOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19xdWVyeSIpOwogCiAJaWYgKCFlYyB8fCAhZGF0YSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCiAJKmRhdGEgPSAwOwogCiAJaWYgKGVjLT5nbG9iYWxfbG9jaykgewpAQCAtMzA3LDI5ICs0MzksMzkgQEAKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKKwlkb3duKCZlYy0+c2VtKTsKKwlpZihhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoZWMpKQorCQlnb3RvIGVuZDsKIAkvKgogCSAqIFF1ZXJ5IHRoZSBFQyB0byBmaW5kIG91dCB3aGljaCBfUXh4IG1ldGhvZCB3ZSBuZWVkIHRvIGV2YWx1YXRlLgogCSAqIE5vdGUgdGhhdCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHF1ZXJ5IGNhdXNlcyB0aGUgQUNQSV9FQ19TQ0kKIAkgKiBiaXQgdG8gYmUgY2xlYXJlZCAoYW5kIHRodXMgY2xlYXJpbmcgdGhlIGludGVycnVwdCBzb3VyY2UpLgogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOwotCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1FVRVJZLCAmZWMtPmNvbW1hbmRfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JaWYgKHJlc3VsdCkKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKKwlpZiAoc3RhdHVzKXsKKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCQlnb3RvIGVuZDsKLQkKKwl9CisKIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+ZGF0YV9hZGRyKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAJaWYgKCEqZGF0YSkKLQkJcmVzdWx0ID0gLUVOT0RBVEE7CisJCXN0YXR1cyA9IC1FTk9EQVRBOwogCiBlbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoZWMpOworCXVwKCZlYy0+c2VtKTsKIAogCWlmIChlYy0+Z2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwogCi0JcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CisJaWYoYXRvbWljX3JlYWQoJmVjLT5sZWF2aW5nX2J1cnN0KSA9PSAyKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJhYm9ydGVkLCByZXRyeSAuLi5cbiIpKTsKKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQlzdGF0dXMgPSAtRU5PREFUQTsKKwl9CisJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKIApAQCAtMzQ3LDQyICs0ODksMjkgQEAKIAl2b2lkCQkJKmVjX2N4dCkKIHsKIAlzdHJ1Y3QgYWNwaV9lYwkJKmVjID0gKHN0cnVjdCBhY3BpX2VjICopIGVjX2N4dDsKLQl1MzIJCQl2YWx1ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOworCXUzMgkJCXZhbHVlOworCWludAkJCXJlc3VsdCA9IC1FTk9EQVRBOwogCXN0YXRpYyBjaGFyCQlvYmplY3RfbmFtZVs1XSA9IHsnXycsJ1EnLCcwJywnMCcsJ1wwJ307CiAJY29uc3QgY2hhcgkJaGV4W10gPSB7JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywKIAkJCQkgICAgICAgICAnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfZ3BlX3F1ZXJ5Iik7CiAKLQlpZiAoIWVjX2N4dCkKLQkJZ290byBlbmQ7CQorCWlmIChhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIEFDUElfRUNfRkxBR19TQ0kpCisJCXJlc3VsdCA9IGFjcGlfZWNfcXVlcnkoZWMsICZ2YWx1ZSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKLQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ2YWx1ZSwgJmVjLT5jb21tYW5kX2FkZHIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBUQkQ6IEltcGxlbWVudCBhc3luY2ggZXZlbnRzIQotCSAqIE5PVEU6IEFsbCB3ZSBjYXJlIGFib3V0IGFyZSBFQy1TQ0kncy4gIE90aGVyIEVDIGV2ZW50cyBhcmUKLQkgKiBoYW5kbGVkIHZpYSBwb2xsaW5nICh5dWNrISkuICBUaGlzIGlzIGJlY2F1c2Ugc29tZSBzeXN0ZW1zCi0JICogdHJlYXQgRUMtU0NJcyBhcyBsZXZlbCAodmVyc3VzIEVER0UhKSB0cmlnZ2VyZWQsIHByZXZlbnRpbmcKLQkgKiAgYSBwdXJlbHkgaW50ZXJydXB0LWRyaXZlbiBhcHByb2FjaCAoZ3J1bWJsZSwgZ3J1bWJsZSkuCi0JICovCi0JaWYgKCEodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfU0NJKSkKKwlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCWlmIChhY3BpX2VjX3F1ZXJ5KGVjLCAmdmFsdWUpKQotCQlnb3RvIGVuZDsKLQkKIAlvYmplY3RfbmFtZVsyXSA9IGhleFsoKHZhbHVlID4+IDQpICYgMHgwRildOwogCW9iamVjdF9uYW1lWzNdID0gaGV4Wyh2YWx1ZSAmIDB4MEYpXTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkV2YWx1YXRpbmcgJXNcbiIsIG9iamVjdF9uYW1lKSk7CiAKIAlhY3BpX2V2YWx1YXRlX29iamVjdChlYy0+aGFuZGxlLCBvYmplY3RfbmFtZSwgTlVMTCwgTlVMTCk7Ci0KLWVuZDoKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CitlbmQ6CQorCWF0b21pY19kZWMoJmVjLT5wZW5kaW5nX2dwZSk7CisJcmV0dXJuOwogfQogCiBzdGF0aWMgdTMyCkBAIC0zOTAsNiArNTE5LDcgQEAKIAl2b2lkCQkJKmRhdGEpCiB7CiAJYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOworCXUzMgkJCXZhbHVlOwogCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSAoc3RydWN0IGFjcGlfZWMgKikgZGF0YTsKIAogCWlmICghZWMpCkBAIC0zOTcsMTMgKzUyNyw0MSBAQAogCiAJYWNwaV9kaXNhYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9JU1IpOwogCi0Jc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9HUEUsCi0JCWFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CisJdmFsdWUgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKIAotCWlmIChzdGF0dXMgPT0gQUVfT0spCi0JCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEOwotCWVsc2UKLQkJcmV0dXJuIEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOworCWlmKCh2YWx1ZSAmIEFDUElfRUNfRkxBR19JQkYpICYmCisJCSEodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpICYmCisJCQkoYXRvbWljX3JlYWQoJmVjLT5sZWF2aW5nX2J1cnN0KSA9PSAwKSkgeyAKKwkvKgorCSAqIHRoZSBlbWJlZGRlZCBjb250cm9sbGVyIGRpc2FibGVzIAorCSAqIGJ1cnN0IG1vZGUgZm9yIGFueSByZWFzb24gb3RoZXIgCisJICogdGhhbiB0aGUgYnVyc3QgZGlzYWJsZSBjb21tYW5kCisJICogdG8gcHJvY2VzcyBjcml0aWNhbCBldmVudC4KKwkgKi8KKwkJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QgLCAyKTsgLyogYmxvY2sgY3VycmVudCBwZW5kaW5nIHRyYW5zYWN0aW9uCisJCQkJCWFuZCByZXRyeSAqLworCQl3YWtlX3VwKCZlYy0+d2FpdCk7CisJfWVsc2UgeworCQlpZiAoKGVjLT5leHBlY3RfZXZlbnQgPT0gQUNQSV9FQ19FVkVOVF9PQkYgJiYKKwkJCQkodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfT0JGKSkgfHwKKwkgICAgCQkJKGVjLT5leHBlY3RfZXZlbnQgPT0gQUNQSV9FQ19FVkVOVF9JQkUgJiYKKwkJCQkhKHZhbHVlICYgQUNQSV9FQ19GTEFHX0lCRikpKSB7CisJCQllYy0+ZXhwZWN0X2V2ZW50ID0gMDsKKwkJCXdha2VfdXAoJmVjLT53YWl0KTsKKwkJCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEOworCQl9CisJfQorCisJaWYgKHZhbHVlICYgQUNQSV9FQ19GTEFHX1NDSSl7CisJCWF0b21pY19hZGQoMSwgJmVjLT5wZW5kaW5nX2dwZSkgOworCQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oT1NEX1BSSU9SSVRZX0dQRSwKKwkJCQkJCWFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CisJCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPworCQlBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJfSAKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfSVNSKTsKKwlyZXR1cm4gc3RhdHVzID09IEFFX09LID8KKwkJQUNQSV9JTlRFUlJVUFRfSEFORExFRCA6IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDIxLDEwICs1NzksOCBAQAogCSAqIFRoZSBFQyBvYmplY3QgaXMgaW4gdGhlIGhhbmRsZXIgY29udGV4dCBhbmQgaXMgbmVlZGVkCiAJICogd2hlbiBjYWxsaW5nIHRoZSBhY3BpX2VjX3NwYWNlX2hhbmRsZXIuCiAJICovCi0JaWYoZnVuY3Rpb24gPT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgCi0JCSpyZXR1cm5fY29udGV4dCA9IE5VTEw7Ci0JZWxzZSAKLQkJKnJldHVybl9jb250ZXh0ID0gaGFuZGxlcl9jb250ZXh0OworCSpyZXR1cm5fY29udGV4dCAgPSAoZnVuY3Rpb24gIT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgPworCQkJCQkJaGFuZGxlcl9jb250ZXh0IDogTlVMTDsKIAogCXJldHVybiBBRV9PSzsKIH0KQEAgLTQ0MSw3ICs1OTcsNyBAQAogewogCWludAkJCXJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfZWMJCSplYyA9IE5VTEw7Ci0JdTMyCQkJdGVtcCA9IDA7CisJdTY0CQkJdGVtcCA9ICp2YWx1ZTsKIAlhY3BpX2ludGVnZXIJCWZfdiA9IDA7CiAJaW50IAkJCWkgPSAwOwogCkBAIC00NTAsMTAgKzYwNiw5IEBACiAJaWYgKChhZGRyZXNzID4gMHhGRikgfHwgIXZhbHVlIHx8ICFoYW5kbGVyX2NvbnRleHQpCiAJCXJldHVybl9WQUxVRShBRV9CQURfUEFSQU1FVEVSKTsKIAotCWlmKGJpdF93aWR0aCAhPSA4KSB7CisJaWYgKGJpdF93aWR0aCAhPSA4ICYmIGFjcGlfc3RyaWN0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJhY3BpX2VjX3NwYWNlX2hhbmRsZXI6IGJpdF93aWR0aCBzaG91bGQgYmUgOFxuIik7Ci0JCWlmIChhY3BpX3N0cmljdCkKLQkJCXJldHVybl9WQUxVRShBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX1ZBTFVFKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCWVjID0gKHN0cnVjdCBhY3BpX2VjICopIGhhbmRsZXJfY29udGV4dDsKQEAgLTQ2MSwxMSArNjE2LDExIEBACiBuZXh0X2J5dGU6CiAJc3dpdGNoIChmdW5jdGlvbikgewogCWNhc2UgQUNQSV9SRUFEOgotCQlyZXN1bHQgPSBhY3BpX2VjX3JlYWQoZWMsICh1OCkgYWRkcmVzcywgJnRlbXApOwotCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSB0ZW1wOworCQl0ZW1wID0gMDsKKwkJcmVzdWx0ID0gYWNwaV9lY19yZWFkKGVjLCAodTgpIGFkZHJlc3MsICh1MzIgKikmdGVtcCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9XUklURToKLQkJcmVzdWx0ID0gYWNwaV9lY193cml0ZShlYywgKHU4KSBhZGRyZXNzLCAodTgpICp2YWx1ZSk7CisJCXJlc3VsdCA9IGFjcGlfZWNfd3JpdGUoZWMsICh1OCkgYWRkcmVzcywgKHU4KSB0ZW1wKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVzdWx0ID0gLUVJTlZBTDsKQEAgLTQ3NCwxOSArNjI5LDE4IEBACiAJfQogCiAJYml0X3dpZHRoIC09IDg7Ci0JaWYoYml0X3dpZHRoKXsKLQotCQlpZihmdW5jdGlvbiA9PSBBQ1BJX1JFQUQpCi0JCQlmX3YgfD0gKGFjcGlfaW50ZWdlcikgKCp2YWx1ZSkgPDwgOCppOwotCQlpZihmdW5jdGlvbiA9PSBBQ1BJX1dSSVRFKQotCQkJKCp2YWx1ZSkgPj49ODsgCisJaWYgKGJpdF93aWR0aCkgeworCQlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUFEKQorCQkJZl92IHw9IHRlbXAgPDwgOCAqIGk7CisJCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1dSSVRFKQorCQkJdGVtcCA+Pj0gODsKIAkJaSsrOworCQlhZGRyZXNzKys7CiAJCWdvdG8gbmV4dF9ieXRlOwogCX0KIAotCi0JaWYoZnVuY3Rpb24gPT0gQUNQSV9SRUFEKXsKLQkJZl92IHw9IChhY3BpX2ludGVnZXIpICgqdmFsdWUpIDw8IDgqaTsKKwlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUFEKSB7CisJCWZfdiB8PSB0ZW1wIDw8IDggKiBpOwogCQkqdmFsdWUgPSBmX3Y7CiAJfQogCkBAIC01MDUsOCArNjU5LDYgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm5fVkFMVUUoQUVfT0spOwogCX0KLQkKLQogfQogCiAKQEAgLTUzMyw2ICs2ODUsNyBAQAogCQkodTMyKSBlYy0+c3RhdHVzX2FkZHIuYWRkcmVzcywgKHUzMikgZWMtPmRhdGFfYWRkci5hZGRyZXNzKTsKIAlzZXFfcHJpbnRmKHNlcSwgInVzZSBnbG9iYWwgbG9jazogICAgICAgICAlc1xuIiwKIAkJZWMtPmdsb2JhbF9sb2NrPyJ5ZXMiOiJubyIpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAogZW5kOgogCXJldHVybl9WQUxVRSgwKTsKQEAgLTU1NSw3ICs3MDgsNyBAQAogYWNwaV9lY19hZGRfZnMgKAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnk7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2FkZF9mcyIpOwogCkBAIC02MDYsOSArNzU5LDkgQEAKIGFjcGlfZWNfYWRkICgKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9lYwkJKmVjID0gTlVMTDsKKwlpbnQJCQlyZXN1bHQ7CisJYWNwaV9zdGF0dXMJCXN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9lYwkJKmVjOwogCXVuc2lnbmVkIGxvbmcJCXVpZDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfYWRkIik7CkBAIC02MjMsNyArNzc2LDEwIEBACiAKIAllYy0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CiAJZWMtPnVpZCA9IC0xOwotCXNwaW5fbG9ja19pbml0KCZlYy0+bG9jayk7CisgCWF0b21pY19zZXQoJmVjLT5wZW5kaW5nX2dwZSwgMCk7CisgCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0ICwgMSk7CisgCWluaXRfTVVURVgoJmVjLT5zZW0pOworIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlYy0+d2FpdCk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9FQ19ERVZJQ0VfTkFNRSk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfRUNfQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGVjOwpAQCAtNjM3LDcgKzc5Myw3IEBACiAJaWYgKGVjX2VjZHQgJiYgZWNfZWNkdC0+dWlkID09IHVpZCkgewogCQlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKIAkJCUFDUElfQURSX1NQQUNFX0VDLCAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKLQkKKwogCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlY19lY2R0LT5ncGVfYml0LCAmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAKIAkJa2ZyZWUoZWNfZWNkdCk7CkBAIC02NzcsNyArODMzLDcgQEAKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKIAlpbnQJCQl0eXBlKQogewotCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjCQkqZWM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3JlbW92ZSIpOwogCkBAIC03MzIsOCArODg4LDggQEAKIGFjcGlfZWNfc3RhcnQgKAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9lYwkJKmVjID0gTlVMTDsKKwlhY3BpX3N0YXR1cwkJc3RhdHVzOworCXN0cnVjdCBhY3BpX2VjCQkqZWM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3N0YXJ0Iik7CiAKQEAgLTc4OSw4ICs5NDUsOCBAQAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAogCWludAkJCXR5cGUpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSBOVUxMOworCWFjcGlfc3RhdHVzCQlzdGF0dXM7CisJc3RydWN0IGFjcGlfZWMJCSplYzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfc3RvcCIpOwogCkBAIC04MzIsNyArOTg4LDYgQEAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dQRSIsIE5VTEwsICZlY19lY2R0LT5ncGVfYml0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7Ci0Jc3Bpbl9sb2NrX2luaXQoJmVjX2VjZHQtPmxvY2spOwogCWVjX2VjZHQtPmdsb2JhbF9sb2NrID0gVFJVRTsKIAllY19lY2R0LT5oYW5kbGUgPSBoYW5kbGU7CiAKQEAgLTg5MCw3ICsxMDQ1LDcgQEAKIAlhY3BpX3N0YXR1cwkJc3RhdHVzOwogCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgCSplY2R0X3B0cjsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJFQ0RUIiwgMSwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsIAorCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJFQ0RUIiwgMSwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCiAJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopICZlY2R0X3B0cik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTkwNSwxMSArMTA2MCwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQoZWNfZWNkdCwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSk7CiAKKyAJaW5pdF9NVVRFWCgmZWNfZWNkdC0+c2VtKTsKKyAJaW5pdF93YWl0cXVldWVfaGVhZCgmZWNfZWNkdC0+d2FpdCk7CiAJZWNfZWNkdC0+Y29tbWFuZF9hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7CiAJZWNfZWNkdC0+c3RhdHVzX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKIAllY19lY2R0LT5kYXRhX2FkZHIgPSBlY2R0X3B0ci0+ZWNfZGF0YTsKIAllY19lY2R0LT5ncGVfYml0ID0gZWNkdF9wdHItPmdwZV9iaXQ7Ci0Jc3Bpbl9sb2NrX2luaXQoJmVjX2VjZHQtPmxvY2spOwogCS8qIHVzZSB0aGUgR0wganVzdCB0byBiZSBzYWZlICovCiAJZWNfZWNkdC0+Z2xvYmFsX2xvY2sgPSBUUlVFOwogCWVjX2VjZHQtPnVpZCA9IGVjZHRfcHRyLT51aWQ7CkBAIC05NzgsNyArMTEzNCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfaW5pdCAodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludAkJCXJlc3VsdDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfaW5pdCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2ZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCmluZGV4IDJhMjEzNjAuLmRkM2E3MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCkBAIC00Nyw2ICs0NywxNiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJldmV2ZW50IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSAoCisJdm9pZCk7CisKK3N0YXRpYyB1MzIKK2FjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2ggKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNTYsNyArNjYsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBldmVudHMuCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBBQ1BJIGV2ZW50cyAoRml4ZWQsIEdQRSkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC03OCw5ICs4OCw5IEBACiAJfQogCiAJLyoKLQkgKiBJbml0aWFsaXplIHRoZSBGaXhlZCBhbmQgR2VuZXJhbCBQdXJwb3NlIEV2ZW50cy4gVGhpcyBpcwotCSAqIGRvbmUgcHJpb3IgdG8gZW5hYmxpbmcgU0NJcyB0byBwcmV2ZW50IGludGVycnVwdHMgZnJvbQotCSAqIG9jY3VycmluZyBiZWZvcmUgaGFuZGVycyBhcmUgaW5zdGFsbGVkLgorCSAqIEluaXRpYWxpemUgdGhlIEZpeGVkIGFuZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnRzLiBUaGlzIGlzIGRvbmUgcHJpb3IgdG8KKwkgKiBlbmFibGluZyBTQ0lzIHRvIHByZXZlbnQgaW50ZXJydXB0cyBmcm9tIG9jY3VycmluZyBiZWZvcmUgdGhlIGhhbmRsZXJzIGFyZQorCSAqIGluc3RhbGxlZC4KIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUgKCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMTYxLDcgKzE3MSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplICgKIAl2b2lkKQogewpAQCAtMTgwLDcgKzE5MCw4IEBACiAJCS8qIEVuYWJsZSB0aGUgZml4ZWQgZXZlbnQgKi8KIAogCQlpZiAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQgIT0gMHhGRikgewotCQkJc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9baV0uZW5hYmxlX3JlZ2lzdGVyX2lkLAorCQkJc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKAorCQkJCQkgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQsCiAJCQkJCSAwLCBBQ1BJX01UWF9MT0NLKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQlyZXR1cm4gKHN0YXR1cyk7CkBAIC0yMDAsNyArMjExLDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgSU5URVJSVVBUX0hBTkRMRUQgb3IgSU5URVJSVVBUX05PVF9IQU5ETEVECiAgKgotICogREVTQ1JJUFRJT046IENoZWNrcyB0aGUgUE0gc3RhdHVzIHJlZ2lzdGVyIGZvciBmaXhlZCBldmVudHMKKyAqIERFU0NSSVBUSU9OOiBDaGVja3MgdGhlIFBNIHN0YXR1cyByZWdpc3RlciBmb3IgYWN0aXZlIGZpeGVkIGV2ZW50cwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTIyMSw4ICsyMzIsMTAgQEAKIAkgKiBSZWFkIHRoZSBmaXhlZCBmZWF0dXJlIHN0YXR1cyBhbmQgZW5hYmxlIHJlZ2lzdGVycywgYXMgYWxsIHRoZSBjYXNlcwogCSAqIGRlcGVuZCBvbiB0aGVpciB2YWx1ZXMuICBJZ25vcmUgZXJyb3JzIGhlcmUuCiAJICovCi0JKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywgJmZpeGVkX3N0YXR1cyk7Ci0JKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgJmZpeGVkX2VuYWJsZSk7CisJKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCSAmZml4ZWRfc3RhdHVzKTsKKwkodm9pZCkgYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJICZmaXhlZF9lbmFibGUpOwogCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5URVJSVVBUUywKIAkJIkZpeGVkIEV2ZW50IEJsb2NrOiBFbmFibGUgJTA4WCBTdGF0dXMgJTA4WFxuIiwKQEAgLTI1OSw3ICsyNzIsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMgorc3RhdGljIHUzMgogYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaCAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYwppbmRleCAxMThkNzJhLi4wODExMjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCkBAIC00OCw2ICs0OCwxMiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJldmdwZSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKK2FjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zMzUsOCArMzQxLDEwIEBACiAJCQlncGVfYmxvY2sgPSBhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbaV07CiAJCQlpZiAoZ3BlX2Jsb2NrKSB7CiAJCQkJaWYgKChncGVfbnVtYmVyID49IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIpICYmCi0JCQkJCShncGVfbnVtYmVyIDwgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArIChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSB7Ci0JCQkJCXJldHVybiAoJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl0pOworCQkJCQkoZ3BlX251bWJlciA8IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKworCQkJCQkJKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKKwkJCQkJcmV0dXJuICgmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvW2dwZV9udW1iZXIgLQorCQkJCQkJZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl0pOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNDM3LDcgKzQ0NSw3IEBACiAJCQkJIlJlYWQgR1BFIFJlZ2lzdGVyIGF0IEdQRSVYOiBTdGF0dXM9JTAyWCwgRW5hYmxlPSUwMlhcbiIsCiAJCQkJZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlciwgc3RhdHVzX3JlZywgZW5hYmxlX3JlZykpOwogCi0JCQkvKiBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyBhY3RpdmUgYXQgYWxsIGluIHRoaXMgcmVnaXN0ZXIgKi8KKwkJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIGFjdGl2ZSBhdCBhbGwgaW4gdGhpcyByZWdpc3RlciAqLwogCiAJCQllbmFibGVkX3N0YXR1c19ieXRlID0gKHU4KSAoc3RhdHVzX3JlZyAmIGVuYWJsZV9yZWcpOwogCQkJaWYgKCFlbmFibGVkX3N0YXR1c19ieXRlKSB7CkBAIC00NTcsOCArNDY1LDggQEAKIAkJCQkJICogb3IgbWV0aG9kLgogCQkJCQkgKi8KIAkJCQkJaW50X3N0YXR1cyB8PSBhY3BpX2V2X2dwZV9kaXNwYXRjaCAoCi0JCQkJCQkJICAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal0sCi0JCQkJCQkJICAodTMyKSBqICsgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcik7CisJCQkJCQkmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal0sCisJCQkJCQkodTMyKSBqICsgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcik7CiAJCQkJfQogCQkJfQogCQl9CkBAIC01MjMsNyArNTMxLDggQEAKIAkgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIEdQRSBpbmZvIGZvciB0aGlzIGxldmVsIC0gd2UgY29weSB0aGUKIAkgKiBpbmZvIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHJlbW92ZV9oYW5kbGVyL3JlbW92ZV9ibG9jay4KIAkgKi8KLQlBQ1BJX01FTUNQWSAoJmxvY2FsX2dwZV9ldmVudF9pbmZvLCBncGVfZXZlbnRfaW5mbywgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbykpOworCUFDUElfTUVNQ1BZICgmbG9jYWxfZ3BlX2V2ZW50X2luZm8sIGdwZV9ldmVudF9pbmZvLAorCQlzaXplb2YgKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CiAKIAlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtNTM0LDcgKzU0Myw4IEBACiAJICogTXVzdCBjaGVjayBmb3IgY29udHJvbCBtZXRob2QgdHlwZSBkaXNwYXRjaCBvbmUgbW9yZQogCSAqIHRpbWUgdG8gYXZvaWQgcmFjZSB3aXRoIGV2X2dwZV9pbnN0YWxsX2hhbmRsZXIKIAkgKi8KLQlpZiAoKGxvY2FsX2dwZV9ldmVudF9pbmZvLmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0gQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EKSB7CisJaWYgKChsb2NhbF9ncGVfZXZlbnRfaW5mby5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09CisJCQlBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpIHsKIAkJLyoKIAkJICogSW52b2tlIHRoZSBHUEUgTWV0aG9kIChfTHh4LCBfRXh4KSBpLmUuLCBldmFsdWF0ZSB0aGUgX0x4eC9fRXh4CiAJCSAqIGNvbnRyb2wgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUKQEAgLTU1Myw3ICs1NjMsOCBAQAogCQl9CiAJfQogCi0JaWYgKChsb2NhbF9ncGVfZXZlbnRfaW5mby5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0gQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7CisJaWYgKChsb2NhbF9ncGVfZXZlbnRfaW5mby5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0KKwkJCUFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgewogCQkvKgogCQkgKiBHUEUgaXMgbGV2ZWwtdHJpZ2dlcmVkLCB3ZSBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgYWZ0ZXIKIAkJICogaGFuZGxpbmcgdGhlIGV2ZW50LgpAQCAtNTc1LDcgKzU4Niw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ3BlX2Rpc3BhdGNoCiAgKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAtIGluZm8gZm9yIHRoaXMgR1BFCisgKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gIC0gSW5mbyBmb3IgdGhpcyBHUEUKICAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBOdW1iZXIgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBHUEUgYmxvY2sKICAqCiAgKiBSRVRVUk46ICAgICAgSU5URVJSVVBUX0hBTkRMRUQgb3IgSU5URVJSVVBUX05PVF9IQU5ETEVECkBAIC02MDIsMTAgKzYxMywxMiBAQAogCSAqIElmIGVkZ2UtdHJpZ2dlcmVkLCBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgbm93LiAgTm90ZSB0aGF0CiAJICogbGV2ZWwtdHJpZ2dlcmVkIGV2ZW50cyBhcmUgY2xlYXJlZCBhZnRlciB0aGUgR1BFIGlzIHNlcnZpY2VkLgogCSAqLwotCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PSBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCkgeworCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PQorCQkJQUNQSV9HUEVfRURHRV9UUklHR0VSRUQpIHsKIAkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUgKGdwZV9ldmVudF9pbmZvKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gY2xlYXIgR1BFWyUyWF1cbiIsCisJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCSJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBjbGVhciBHUEVbJTJYXVxuIiwKIAkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKIAkJCXJldHVybl9WQUxVRSAoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCQl9CkBAIC02MzksNyArNjUyLDggQEAKIAogCQkvKiBJdCBpcyBub3cgc2FmZSB0byBjbGVhciBsZXZlbC10cmlnZ2VyZWQgZXZlbnRzLiAqLwogCi0JCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PSBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKKwkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09CisJCQkJQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7CiAJCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZSAoZ3BlX2V2ZW50X2luZm8pOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCkBAIC03MDQsNyArNzE4LDYgQEAKIAogCiAjaWZkZWYgQUNQSV9HUEVfTk9USUZZX0NIRUNLCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUQkQ6IE5PVCBVU0VELCBQUk9UT1RZUEUgT05MWSBBTkQgV0lMTCBQUk9CQUJMWSBCRSBSRU1PVkVECiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCmluZGV4IDAwZDk4MWYuLjg0MTg2YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGVibGsuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKQEAgLTQ4LDYgKzQ4LDM5IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2Z3BlYmxrIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbyAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2Rlc2MsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9tYXRjaF9wcndfYW5kX2dwZSAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mbywKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICoKK2FjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jayAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfZGVsZXRlX2dwZV94cnVwdCAoCisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0KTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X2luc3RhbGxfZ3BlX2Jsb2NrICgKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2ssCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyAoCisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE1NSw3ICsxODgsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycwogICoKQEAgLTE5MCw3ICsyMjMsOCBAQAogCQlmb3IgKGogPSAwOyBqIDwgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7IGorKykgewogCQkJZ3BlX2V2ZW50X2luZm8gPSAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal07CiAKLQkJCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0gQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUikgeworCQkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQorCQkJCQlBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7CiAJCQkJQUNQSV9NRU1fRlJFRSAoZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIpOwogCQkJCWdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyID0gTlVMTDsKIAkJCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJj0gfkFDUElfR1BFX0RJU1BBVENIX01BU0s7CkBAIC00NzEsNyArNTA1LDcgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfZ2V0X2dwZV94cnVwdF9ibG9jayIpOwogCiAKLQkvKiBObyBuZWVkIGZvciBzcGluIGxvY2sgc2luY2Ugd2UgYXJlIG5vdCBjaGFuZ2luZyBhbnkgbGlzdCBlbGVtZW50cyBoZXJlICovCisJLyogTm8gbmVlZCBmb3IgbG9jayBzaW5jZSB3ZSBhcmUgbm90IGNoYW5naW5nIGFueSBsaXN0IGVsZW1lbnRzIGhlcmUgKi8KIAogCW5leHRfZ3BlX3hydXB0ID0gYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKIAl3aGlsZSAobmV4dF9ncGVfeHJ1cHQpIHsKQEAgLTYxOSw3ICs2NTMsNyBAQAogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKLQkvKiBJbnN0YWxsIHRoZSBuZXcgYmxvY2sgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBmb3IgdGhpcyBpbnRlcnJ1cHQgd2l0aCBsb2NrICovCisJLyogSW5zdGFsbCB0aGUgbmV3IGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2l0aCBsb2NrICovCiAKIAlhY3BpX29zX2FjcXVpcmVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CiAJaWYgKGdwZV94cnVwdF9ibG9jay0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCkgewpAQCAtNzU2LDEwICs3OTAsMTIgQEAKIAkgKiBwZXIgcmVnaXN0ZXIuICBJbml0aWFsaXphdGlvbiB0byB6ZXJvcyBpcyBzdWZmaWNpZW50LgogCSAqLwogCWdwZV9ldmVudF9pbmZvID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKLQkJCSAgICgoYWNwaV9zaXplKSBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICoKKwkJCSAgICgoYWNwaV9zaXplKSBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICoKKwkJCSAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAqCiAJCQkgICBzaXplb2YgKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CiAJaWYgKCFncGVfZXZlbnRfaW5mbykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgZ3BlX2V2ZW50X2luZm8gdGFibGVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBncGVfZXZlbnRfaW5mbyB0YWJsZVxuIikpOwogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CkBAIC04OTksNyArOTM1LDggQEAKIAlncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyID0gZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyOwogCWdwZV9ibG9jay0+bm9kZSAgICAgICAgICAgPSBncGVfZGV2aWNlOwogCi0JQUNQSV9NRU1DUFkgKCZncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MsIGdwZV9ibG9ja19hZGRyZXNzLCBzaXplb2YgKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcykpOworCUFDUElfTUVNQ1BZICgmZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLCBncGVfYmxvY2tfYWRkcmVzcywKKwkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpKTsKIAogCS8qIENyZWF0ZSB0aGUgcmVnaXN0ZXJfaW5mbyBhbmQgZXZlbnRfaW5mbyBzdWItc3RydWN0dXJlcyAqLwogCkBAIC0xMDYxLDggKzEwOTgsOSBAQAogCiAJCS8qIEluc3RhbGwgR1BFIEJsb2NrIDAgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sgKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwgJmFjcGlfZ2JsX0ZBRFQtPnhncGUwX2JsaywKLQkJCQkgcmVnaXN0ZXJfY291bnQwLCAwLCBhY3BpX2dibF9GQURULT5zY2lfaW50LCAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzBdKTsKKwkJc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrIChhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJICZhY3BpX2dibF9GQURULT54Z3BlMF9ibGssIHJlZ2lzdGVyX2NvdW50MCwgMCwKKwkJCQkgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwgJmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1swXSk7CiAKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKQEAgLTEwOTQsOCArMTEzMiw5IEBACiAJCWVsc2UgewogCQkJLyogSW5zdGFsbCBHUEUgQmxvY2sgMSAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sgKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwgJmFjcGlfZ2JsX0ZBRFQtPnhncGUxX2JsaywKLQkJCQkJIHJlZ2lzdGVyX2NvdW50MSwgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlLAorCQkJc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrIChhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJCSAmYWNwaV9nYmxfRkFEVC0+eGdwZTFfYmxrLCByZWdpc3Rlcl9jb3VudDEsCisJCQkJCSBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UsCiAJCQkJCSBhY3BpX2dibF9GQURULT5zY2lfaW50LCAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzFdKTsKIAogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMTEwOSw3ICsxMTQ4LDcgQEAKIAkJCSAqIHNwYWNlLiBIb3dldmVyLCBHUEUwIGFsd2F5cyBzdGFydHMgYXQgR1BFIG51bWJlciB6ZXJvLgogCQkJICovCiAJCQlncGVfbnVtYmVyX21heCA9IGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSArCi0JCQkJCSAgICgocmVnaXN0ZXJfY291bnQxICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMSk7CisJCQkJCSAgKChyZWdpc3Rlcl9jb3VudDEgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKaW5kZXggMjU0OGVmYS4uNjU5ZTkwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCkBAIC01MCw2ICs1MCwzNSBAQAogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZtaXNjIikKIAogCisjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKK3N0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICphY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tdID0KK3sKKwkiQnVzIENoZWNrIiwKKwkiRGV2aWNlIENoZWNrIiwKKwkiRGV2aWNlIFdha2UiLAorCSJFamVjdCByZXF1ZXN0IiwKKwkiRGV2aWNlIENoZWNrIExpZ2h0IiwKKwkiRnJlcXVlbmN5IE1pc21hdGNoIiwKKwkiQnVzIE1vZGUgTWlzbWF0Y2giLAorCSJQb3dlciBGYXVsdCIKK307CisjZW5kaWYKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQorYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2ggKAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQorYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQgKAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCitzdGF0aWMgdTMyCithY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIgKAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaXNfbm90aWZ5X29iamVjdApAQCAtOTgsMjAgKzEyNyw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqYWNwaV9ub3RpZnlfdmFsdWVfbmFtZXNbXSA9Ci17Ci0JIkJ1cyBDaGVjayIsCi0JIkRldmljZSBDaGVjayIsCi0JIkRldmljZSBXYWtlIiwKLQkiRWplY3QgcmVxdWVzdCIsCi0JIkRldmljZSBDaGVjayBMaWdodCIsCi0JIkZyZXF1ZW5jeSBNaXNtYXRjaCIsCi0JIkJ1cyBNb2RlIE1pc21hdGNoIiwKLQkiUG93ZXIgRmF1bHQiCi19OwotI2VuZGlmCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V2X3F1ZXVlX25vdGlmeV9yZXF1ZXN0ICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLApAQCAtMTI4LDkgKzE0MywxMCBAQAogCiAJLyoKIAkgKiBGb3IgdmFsdWUgMyAoRWplY3Rpb24gUmVxdWVzdCksIHNvbWUgZGV2aWNlIG1ldGhvZCBtYXkgbmVlZCB0byBiZSBydW4uCi0JICogRm9yIHZhbHVlIDIgKERldmljZSBXYWtlKSBpZiBfUFJXIGV4aXN0cywgdGhlIF9QUzAgbWV0aG9kIG1heSBuZWVkIHRvIGJlIHJ1bi4KKwkgKiBGb3IgdmFsdWUgMiAoRGV2aWNlIFdha2UpIGlmIF9QUlcgZXhpc3RzLCB0aGUgX1BTMCBtZXRob2QgbWF5IG5lZWQKKwkgKiAgIHRvIGJlIHJ1bi4KIAkgKiBGb3IgdmFsdWUgMHg4MCAoU3RhdHVzIENoYW5nZSkgb24gdGhlIHBvd2VyIGJ1dHRvbiBvciBzbGVlcCBidXR0b24sCi0JICogaW5pdGlhdGUgc29mdC1vZmYgb3Igc2xlZXAgb3BlcmF0aW9uPworCSAqICAgaW5pdGlhdGUgc29mdC1vZmYgb3Igc2xlZXAgb3BlcmF0aW9uPwogCSAqLwogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCiAJCSJEaXNwYXRjaGluZyBOb3RpZnkoJVgpIG9uIG5vZGUgJXBcbiIsIG5vdGlmeV92YWx1ZSwgbm9kZSkpOwpAQCAtMTQwLDggKzE1Niw5IEBACiAJCQkJYWNwaV9ub3RpZnlfdmFsdWVfbmFtZXNbbm90aWZ5X3ZhbHVlXSkpOwogCX0KIAllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIk5vdGlmeSB2YWx1ZTogMHglMi4yWCAqKkRldmljZSBTcGVjaWZpYyoqXG4iLAotCQkJCW5vdGlmeV92YWx1ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAorCQkJIk5vdGlmeSB2YWx1ZTogMHglMi4yWCAqKkRldmljZSBTcGVjaWZpYyoqXG4iLAorCQkJbm90aWZ5X3ZhbHVlKSk7CiAJfQogCiAJLyogR2V0IHRoZSBub3RpZnkgb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBOUyBOb2RlICovCkBAIC0yMTAsNyArMjI3LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2gKICAqCi0gKiBQQVJBTUVURVJTOiAgQ29udGV4dCAgICAgICAgIC0gVG8gYmUgcGFzc3NlZCB0byB0aGUgbm90aWZ5IGhhbmRsZXIKKyAqIFBBUkFNRVRFUlM6ICBDb250ZXh0ICAgICAgICAgLSBUbyBiZSBwYXNzZWQgdG8gdGhlIG5vdGlmeSBoYW5kbGVyCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUuCiAgKgpAQCAtMjE5LDcgKzIzNiw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQorc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoICgKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQogewpAQCAtMjM0LDcgKzI1MSw4IEBACiAKIAkvKgogCSAqIFdlIHdpbGwgaW52b2tlIGEgZ2xvYmFsIG5vdGlmeSBoYW5kbGVyIGlmIGluc3RhbGxlZC4KLQkgKiBUaGlzIGlzIGRvbmUgX2JlZm9yZV8gd2UgaW52b2tlIHRoZSBwZXItZGV2aWNlIGhhbmRsZXIgYXR0YWNoZWQgdG8gdGhlIGRldmljZS4KKwkgKiBUaGlzIGlzIGRvbmUgX2JlZm9yZV8gd2UgaW52b2tlIHRoZSBwZXItZGV2aWNlIGhhbmRsZXIgYXR0YWNoZWQKKwkgKiB0byB0aGUgZGV2aWNlLgogCSAqLwogCWlmIChub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpIHsKIAkJLyogR2xvYmFsIHN5c3RlbSBub3RpZmljYXRpb24gaGFuZGxlciAqLwpAQCAtMjU2LDE1ICsyNzQsMTcgQEAKIAkvKiBJbnZva2UgdGhlIHN5c3RlbSBoYW5kbGVyIGZpcnN0LCBpZiBwcmVzZW50ICovCiAKIAlpZiAoZ2xvYmFsX2hhbmRsZXIpIHsKLQkJZ2xvYmFsX2hhbmRsZXIgKG5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSwgbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwgZ2xvYmFsX2NvbnRleHQpOworCQlnbG9iYWxfaGFuZGxlciAobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLCBub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLAorCQkJZ2xvYmFsX2NvbnRleHQpOwogCX0KIAogCS8qIE5vdyBpbnZva2UgdGhlIHBlci1kZXZpY2UgaGFuZGxlciwgaWYgcHJlc2VudCAqLwogCiAJaGFuZGxlcl9vYmogPSBub3RpZnlfaW5mby0+bm90aWZ5LmhhbmRsZXJfb2JqOwogCWlmIChoYW5kbGVyX29iaikgewotCQloYW5kbGVyX29iai0+bm90aWZ5LmhhbmRsZXIgKG5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSwgbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwKLQkJCQkgIGhhbmRsZXJfb2JqLT5ub3RpZnkuY29udGV4dCk7CisJCWhhbmRsZXJfb2JqLT5ub3RpZnkuaGFuZGxlciAobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLAorCQkJbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwKKwkJCWhhbmRsZXJfb2JqLT5ub3RpZnkuY29udGV4dCk7CiAJfQogCiAJLyogQWxsIGRvbmUgd2l0aCB0aGUgaW5mbyBvYmplY3QgKi8KQEAgLTM3MCw3ICszOTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyICh2b2lkKQorYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIgKAorCXZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKQEAgLTM4MCw3ICs0MDEsNyBAQAogCiAJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCA9IFRSVUU7CiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIgKEFDUElfRVZFTlRfR0xPQkFMLAotCQkJICBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIsIE5VTEwpOworCQkJIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciwgTlVMTCk7CiAKIAkvKgogCSAqIElmIHRoZSBnbG9iYWwgbG9jayBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBsYXRmb3JtLCB0aGUgYXR0ZW1wdApAQCAtNDMzLDggKzQ1NCwxMCBAQAogCiAJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50Kys7CiAKLQkvKiBJZiB3ZSAoT1Mgc2lkZSB2cy4gQklPUyBzaWRlKSBoYXZlIHRoZSBoYXJkd2FyZSBsb2NrIGFscmVhZHksIHdlIGFyZSBkb25lICovCi0KKwkvKgorCSAqIElmIHdlIChPUyBzaWRlIHZzLiBCSU9TIHNpZGUpIGhhdmUgdGhlIGhhcmR3YXJlIGxvY2sgYWxyZWFkeSwKKwkgKiB3ZSBhcmUgZG9uZQorCSAqLwogCWlmIChhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIAl9CkBAIC00ODAsNyArNTAzLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKHZvaWQpCithY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKAorCXZvaWQpCiB7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nID0gRkFMU0U7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKQEAgLTQ5MCw3ICs1MTQsOCBAQAogCiAKIAlpZiAoIWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiQ2Fubm90IHJlbGVhc2UgSFcgR2xvYmFsIExvY2ssIGl0IGhhcyBub3QgYmVlbiBhY3F1aXJlZFxuIikpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgKKwkJCSJDYW5ub3QgcmVsZWFzZSBIVyBHbG9iYWwgTG9jaywgaXQgaGFzIG5vdCBiZWVuIGFjcXVpcmVkXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0FDUVVJUkVEKTsKIAl9CiAKQEAgLTUxNSw3ICs1NDAsOCBAQAogCSAqIHJlZ2lzdGVyCiAJICovCiAJaWYgKHBlbmRpbmcpIHsKLQkJc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1JFTEVBU0UsIDEsIEFDUElfTVRYX0xPQ0spOworCQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfUkVMRUFTRSwKKwkJCQkgMSwgQUNQSV9NVFhfTE9DSyk7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtNTM1LDcgKzU2MSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX2V2X3Rlcm1pbmF0ZSAodm9pZCkKK2FjcGlfZXZfdGVybWluYXRlICgKKwl2b2lkKQogewogCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKQEAgLTU1NSw3ICs1ODIsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fRklYRURfRVZFTlRTOyBpKyspIHsKIAkJCXN0YXR1cyA9IGFjcGlfZGlzYWJsZV9ldmVudCAoKHUzMikgaSwgMCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJDb3VsZCBub3QgZGlzYWJsZSBmaXhlZCBldmVudCAlZFxuIiwgKHUzMikgaSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkiQ291bGQgbm90IGRpc2FibGUgZml4ZWQgZXZlbnQgJWRcbiIsICh1MzIpIGkpKTsKIAkJCX0KIAkJfQogCkBAIC01NjcsNyArNTk1LDggQEAKIAogCQlzdGF0dXMgPSBhY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlciAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCByZW1vdmUgU0NJIGhhbmRsZXJcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJDb3VsZCBub3QgcmVtb3ZlIFNDSSBoYW5kbGVyXG4iKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwppbmRleCA3NzIzNDI3Li5hMWQ3Mjc2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwpAQCAtNTgsNiArNTgsMjIgQEAKIAkJCSBBQ1BJX0FEUl9TUEFDRV9QQ0lfQ09ORklHLAogCQkJIEFDUElfQURSX1NQQUNFX0RBVEFfVEFCTEV9OwogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9yZWdfcnVuICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5zdGFsbF9oYW5kbGVyICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTc5LDggKzE5NSw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kCiAgKgotICogUEFSQU1FVEVSUzogIHJlZ2lvbl9vYmogICAgICAgICAgLSBPYmplY3Qgc3RydWN0dXJlCi0gKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFBhc3NlZCB0byBfUkVHOiAgT24gKDEpIG9yIE9mZiAoMCkKKyAqIFBBUkFNRVRFUlM6ICByZWdpb25fb2JqICAgICAgICAgIC0gUmVnaW9uIG9iamVjdAorICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBQYXNzZWQgdG8gX1JFRzogT24gKDEpIG9yIE9mZiAoMCkKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzIzLDE0ICszMzksMTYgQEAKIAkJaWYgKCFyZWdpb25fc2V0dXApIHsKIAkJCS8qIE5vIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIGV4aXQgd2l0aCBlcnJvciAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIGluaXQgcm91dGluZSBmb3IgcmVnaW9uKCVwKSBbJXNdXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIk5vIGluaXQgcm91dGluZSBmb3IgcmVnaW9uKCVwKSBbJXNdXG4iLAogCQkJCXJlZ2lvbl9vYmosIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CiAJCX0KIAogCQkvKgotCQkgKiBXZSBtdXN0IGV4aXQgdGhlIGludGVycHJldGVyIGJlY2F1c2UgdGhlIHJlZ2lvbiBzZXR1cCB3aWxsIHBvdGVudGlhbGx5Ci0JCSAqIGV4ZWN1dGUgY29udHJvbCBtZXRob2RzIChlLmcuLCBfUkVHIG1ldGhvZCBmb3IgdGhpcyByZWdpb24pCisJCSAqIFdlIG11c3QgZXhpdCB0aGUgaW50ZXJwcmV0ZXIgYmVjYXVzZSB0aGUgcmVnaW9uCisJCSAqIHNldHVwIHdpbGwgcG90ZW50aWFsbHkgZXhlY3V0ZSBjb250cm9sIG1ldGhvZHMKKwkJICogKGUuZy4sIF9SRUcgbWV0aG9kIGZvciB0aGlzIHJlZ2lvbikKIAkJICovCiAJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKIApAQCAtNjIxLDcgKzYzOSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLApAQCAtODQ4LDcgKzg2Niw4IEBACiAJCQkJaWYgKGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXIgPT0gaGFuZGxlcikgewogCQkJCQkvKgogCQkJCQkgKiBJdCBpcyAocmVsYXRpdmVseSkgT0sgdG8gYXR0ZW1wdCB0byBpbnN0YWxsIHRoZSBTQU1FCi0JCQkJCSAqIGhhbmRsZXIgdHdpY2UuIFRoaXMgY2FuIGVhc2lseSBoYXBwZW4gd2l0aCBQQ0lfQ29uZmlnIHNwYWNlLgorCQkJCQkgKiBoYW5kbGVyIHR3aWNlLiBUaGlzIGNhbiBlYXNpbHkgaGFwcGVuCisJCQkJCSAqIHdpdGggUENJX0NvbmZpZyBzcGFjZS4KIAkJCQkJICovCiAJCQkJCXN0YXR1cyA9IEFFX1NBTUVfSEFORExFUjsKIAkJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC0xMDExLDcgKzEwMzAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXZfcmVnX3J1biAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKaW5kZXggNDk4M2EzMy4uOTViYzA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYwpAQCAtNjEsNyArNjEsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRG8gYW55IHByZXAgd29yayBmb3IgcmVnaW9uIGhhbmRsaW5nLCBhIG5vcCBmb3Igbm93CisgKiBERVNDUklQVElPTjogU2V0dXAgYSBzeXN0ZW1fbWVtb3J5IG9wZXJhdGlvbiByZWdpb24KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMTUsNyArMTE1LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IERvIGFueSBwcmVwIHdvcmsgZm9yIHJlZ2lvbiBoYW5kbGluZworICogREVTQ1JJUFRJT046IFNldHVwIGEgSU8gb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE0NCwxNCArMTQ0LDE0IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAKICAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgIC0gUmVnaW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIFJlZ2lvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbgogICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBTdGFydCBvciBzdG9wCiAgKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIEFkZHJlc3Mgc3BhY2UgaGFuZGxlciBjb250ZXh0CiAgKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFJlZ2lvbiBzcGVjaWZpYyBjb250ZXh0CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcKKyAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIFBDSV9Db25maWcgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBub3QgbG9ja2VkCiAgKgpAQCAtMzI0LDcgKzMyNCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcKKyAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIHBjaV9iQVIgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBub3QgbG9ja2VkCiAgKgpAQCAtMzU1LDcgKzM1NSw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcKKyAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIENNT1Mgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBub3QgbG9ja2VkCiAgKgpAQCAtMzg2LDcgKzM4Niw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcKKyAqIERFU0NSSVBUSU9OOiBEZWZhdWx0IHJlZ2lvbiBpbml0aWFsaXphdGlvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYwppbmRleCA0NmIzMTk5Li5mMzEyM2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCkBAIC00OSw2ICs0OSwxMiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJldnNjaSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHUzMiBBQ1BJX1NZU1RFTV9YRkFDRQorYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlciAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNDYsNyArMTUyLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHUzMgotYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyICh2b2lkKQorYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyICgKKwl2b2lkKQogewogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAKQEAgLTE4MCw3ICsxODcsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyICh2b2lkKQorYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIgKAorCXZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMKaW5kZXggMGJmZWMxMC4uNDA5MmQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMKQEAgLTY0LDYgKzY0LDcgQEAKICAqIERFU0NSSVBUSU9OOiBTYXZlcyB0aGUgcG9pbnRlciB0byB0aGUgaGFuZGxlciBmdW5jdGlvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlciAoCkBAIC00NTcsNyArNDU4LDggQEAKIAkvKiBSb290IE9iamVjdCAqLwogCiAJaWYgKGRldmljZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJSZW1vdmluZyBub3RpZnkgaGFuZGxlciBmb3IgUk9PVCBvYmplY3QuXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCisJCQkiUmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXIgZm9yIFJPT1Qgb2JqZWN0LlxuIikpOwogCiAJCWlmICgoKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgJiYKIAkJCSAgIWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlcikgICAgICB8fApAQCAtNTY0LDggKzU2Niw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcgogICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfbnVtYmVyICAgICAgLSBUaGUgR1BFIG51bWJlciB3aXRoaW4gdGhlIEdQRSBibG9jawotICogICAgICAgICAgICAgIGdwZV9ibG9jayAgICAgICAtIEdQRSBibG9jayAoTlVMTCA9PSBGQURUIEdQRXMpCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBHUEUgKE5VTEwgZm9yIEZBRFQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIEdQRXMpCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gVGhlIEdQRSBudW1iZXIgd2l0aGluIHRoZSBHUEUgYmxvY2sKICAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBXaGV0aGVyIHRoaXMgR1BFIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZS0gb3IgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdC4KICAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBoYW5kbGVyCkBAIC02NjIsOCArNjY1LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIKICAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX251bWJlciAgICAgIC0gVGhlIGV2ZW50IHRvIHJlbW92ZSBhIGhhbmRsZXIKLSAqICAgICAgICAgICAgICBncGVfYmxvY2sgICAgICAgLSBHUEUgYmxvY2sgKE5VTEwgPT0gRkFEVCBHUEVzKQorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgR1BFIChOVUxMIGZvciBGQURUCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBHUEVzKQorICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIFRoZSBldmVudCB0byByZW1vdmUgYSBoYW5kbGVyCiAgKiAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgaGFuZGxlcgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTc2Niw3ICs3NzAsOCBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jawogICoKICAqIFBBUkFNRVRFUlM6ICBUaW1lb3V0ICAgICAgICAgLSBIb3cgbG9uZyB0aGUgY2FsbGVyIGlzIHdpbGxpbmcgdG8gd2FpdAotICogICAgICAgICAgICAgIG91dF9oYW5kbGUgICAgICAtIEEgaGFuZGxlIHRvIHRoZSBsb2NrIGlmIGFjcXVpcmVkCisgKiAgICAgICAgICAgICAgSGFuZGxlICAgICAgICAgIC0gV2hlcmUgdGhlIGhhbmRsZSB0byB0aGUgbG9jayBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBhY3F1aXJlZCkKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtODEyLDcgKzgxNyw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIHRoZSBBQ1BJIEdsb2JhbCBMb2NrCisgKiBERVNDUklQVElPTjogUmVsZWFzZSB0aGUgQUNQSSBHbG9iYWwgTG9jay4gVGhlIGhhbmRsZSBtdXN0IGJlIHZhbGlkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYwppbmRleCBmYThkNWYyLi5mMzM3ZGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCkBAIC02NCw3ICs2NCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9lbmFibGUgKHZvaWQpCithY3BpX2VuYWJsZSAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwogCkBAIC05MSw3ICs5Miw4IEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULCAiVHJhbnNpdGlvbiB0byBBQ1BJIG1vZGUgc3VjY2Vzc2Z1bFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULAorCQkJIlRyYW5zaXRpb24gdG8gQUNQSSBtb2RlIHN1Y2Nlc3NmdWxcbiIpKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0xMDYsMTIgKzEwOCwxMyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogVHJhbnNmZXJzIHRoZSBzeXN0ZW0gaW50byBMRUdBQ1kgbW9kZS4KKyAqIERFU0NSSVBUSU9OOiBUcmFuc2ZlcnMgdGhlIHN5c3RlbSBpbnRvIExFR0FDWSAobm9uLUFDUEkpIG1vZGUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZGlzYWJsZSAodm9pZCkKK2FjcGlfZGlzYWJsZSAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwogCkBAIC0xMjUsNyArMTI4LDggQEAKIAl9CiAKIAlpZiAoYWNwaV9od19nZXRfbW9kZSgpID09IEFDUElfU1lTX01PREVfTEVHQUNZKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsICJTeXN0ZW0gaXMgYWxyZWFkeSBpbiBsZWdhY3kgKG5vbi1BQ1BJKSBtb2RlXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCisJCQkiU3lzdGVtIGlzIGFscmVhZHkgaW4gbGVnYWN5IChub24tQUNQSSkgbW9kZVxuIikpOwogCX0KIAllbHNlIHsKIAkJLyogVHJhbnNpdGlvbiB0byBMRUdBQ1kgbW9kZSAqLwpAQCAtMTMzLDcgKzEzNyw4IEBACiAJCXN0YXR1cyA9IGFjcGlfaHdfc2V0X21vZGUgKEFDUElfU1lTX01PREVfTEVHQUNZKTsKIAogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBleGl0IEFDUEkgbW9kZSB0byBsZWdhY3kgbW9kZSIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJDb3VsZCBub3QgZXhpdCBBQ1BJIG1vZGUgdG8gbGVnYWN5IG1vZGUiKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KIApAQCAtMjE0LDcgKzIxOSw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFbmFibGUgYW4gQUNQSSBldmVudCAoZ2VuZXJhbCBwdXJwb3NlKQorICogREVTQ1JJUFRJT046IFNldCB0aGUgdHlwZSBvZiBhbiBpbmRpdmlkdWFsIEdQRQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTUxOSwxMyArNTI0LDEyIEBACiAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2V2ZW50X3N0YXR1cwogICoKICAqIFBBUkFNRVRFUlM6ICBFdmVudCAgICAgICAgICAgLSBUaGUgZml4ZWQgZXZlbnQKLSAqICAgICAgICAgICAgICBFdmVudCBTdGF0dXMgICAgLSBXaGVyZSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGV2ZW50IHdpbGwKKyAqICAgICAgICAgICAgICBldmVudF9zdGF0dXMgICAgLSBXaGVyZSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGV2ZW50IHdpbGwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTU3MSw3ICs1NzUsNyBAQAogICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlCiAgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCiAgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gQ2FsbGVkIGZyb20gYW4gSVNSIG9yIG5vdAotICogICAgICAgICAgICAgIEV2ZW50IFN0YXR1cyAgICAtIFdoZXJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZXZlbnQgd2lsbAorICogICAgICAgICAgICAgIGV2ZW50X3N0YXR1cyAgICAtIFdoZXJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZXZlbnQgd2lsbAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtNzc1LDQgKzc3OSw1IEBACiAJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKaW5kZXggYWMzYzA2MS4uNzM0YjJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKQEAgLTU0LDYgKzU0LDE0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhjb25maWciKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9hZGRfdGFibGUgKAorCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlLAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipkZGJfaGFuZGxlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTcwLDcgKzc4LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2FkZF90YWJsZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGUsCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGUsCkBAIC05NSwxMCArMTAzLDEwIEBACiAKIAlBQ1BJX01FTVNFVCAoJnRhYmxlX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwogCi0JdGFibGVfaW5mby50eXBlICAgICAgICA9IEFDUElfVEFCTEVfU1NEVDsKLQl0YWJsZV9pbmZvLnBvaW50ZXIgICAgID0gdGFibGU7Ci0JdGFibGVfaW5mby5sZW5ndGggICAgICA9IChhY3BpX3NpemUpIHRhYmxlLT5sZW5ndGg7Ci0JdGFibGVfaW5mby5hbGxvY2F0aW9uICA9IEFDUElfTUVNX0FMTE9DQVRFRDsKKwl0YWJsZV9pbmZvLnR5cGUgICAgICA9IEFDUElfVEFCTEVfU1NEVDsKKwl0YWJsZV9pbmZvLnBvaW50ZXIgICA9IHRhYmxlOworCXRhYmxlX2luZm8ubGVuZ3RoICAgID0gKGFjcGlfc2l6ZSkgdGFibGUtPmxlbmd0aDsKKwl0YWJsZV9pbmZvLmFsbG9jYXRpb24gPSBBQ1BJX01FTV9BTExPQ0FURUQ7CiAKIAlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUgKCZ0YWJsZV9pbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0yMjYsMTEgKzIzNCwxMCBAQAogCQkJc3RhcnRfbm9kZSA9IHBhcmVudF9ub2RlOwogCQl9CiAKLQkJLyoKLQkJICogRmluZCB0aGUgbm9kZSByZWZlcmVuY2VkIGJ5IHRoZSBwYXJhbWV0ZXJfcGF0aF9zdHJpbmcKLQkJICovCisJCS8qIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcGFyYW1ldGVyX3BhdGhfc3RyaW5nICovCisKIAkJc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoIChvcGVyYW5kWzRdLT5zdHJpbmcucG9pbnRlciwgc3RhcnRfbm9kZSwKLQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJhbWV0ZXJfbm9kZSk7CisJCQkJIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgJnBhcmFtZXRlcl9ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0yNDgsNyArMjU1LDggQEAKIAlpZiAocGFyYW1ldGVyX25vZGUpIHsKIAkJLyogU3RvcmUgdGhlIHBhcmFtZXRlciBkYXRhIGludG8gdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvYmplY3QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChvcGVyYW5kWzVdLCBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCBwYXJhbWV0ZXJfbm9kZSksCisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKG9wZXJhbmRbNV0sCisJCQkJIEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHBhcmFtZXRlcl9ub2RlKSwKIAkJCQkgd2Fsa19zdGF0ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCSh2b2lkKSBhY3BpX2V4X3VubG9hZF90YWJsZSAoZGRiX2hhbmRsZSk7CkBAIC0zNzEsNyArMzc5LDggQEAKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCXRhYmxlX3B0ciA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKKwkJdGFibGVfcHRyID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLAorCQkJCSAgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKIAogCQkgLyogU2FuaXR5IGNoZWNrIHRoZSB0YWJsZSBsZW5ndGggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYwppbmRleCBkZjdiYTEyLi45Nzg1NmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYwpAQCAtNTAsNiArNTAsMTUgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGNvbnZydCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHUzMgorYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpICgKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIsCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTE1LDkgKzEyNCw4IEBACiAJICovCiAJcmVzdWx0ID0gMDsKIAotCS8qCi0JICogU3RyaW5nIGNvbnZlcnNpb24gaXMgZGlmZmVyZW50IHRoYW4gQnVmZmVyIGNvbnZlcnNpb24KLQkgKi8KKwkvKiBTdHJpbmcgY29udmVyc2lvbiBpcyBkaWZmZXJlbnQgdGhhbiBCdWZmZXIgY29udmVyc2lvbiAqLworCiAJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCkBAIC0xNjgsOSArMTc2LDggQEAKIAkJYnJlYWs7CiAJfQogCi0JLyoKLQkgKiBDcmVhdGUgYSBuZXcgaW50ZWdlcgotCSAqLworCS8qIENyZWF0ZSBhIG5ldyBpbnRlZ2VyICovCisKIAlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOwogCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwpAQCAtMjUxLDcgKzI1OCw4IEBACiAJCSAqIEFTTC9BTUwgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIG51bGwgYmVpbmcgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldwogCQkgKiBidWZmZXIuCiAJCSAqLwotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QgKChhY3BpX3NpemUpIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoCisJCQkJICAoYWNwaV9zaXplKSBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDEpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJCX0KQEAgLTI5MSw3ICsyOTksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMgorc3RhdGljIHUzMgogYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpICgKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIsCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLApAQCAtMzU3LDggKzM2NSw5IEBACiAKIAljYXNlIDE2OgogCi0JCWhleF9sZW5ndGggPSBBQ1BJX01VTF8yIChkYXRhX3dpZHRoKTsgLyogMiBhc2NpaSBoZXggY2hhcnMgcGVyIGRhdGEgYnl0ZSAqLworCQkvKiBoZXhfbGVuZ3RoOiAyIGFzY2lpIGhleCBjaGFycyBwZXIgZGF0YSBieXRlICovCiAKKwkJaGV4X2xlbmd0aCA9IEFDUElfTVVMXzIgKGRhdGFfd2lkdGgpOwogCQlmb3IgKGkgPSAwLCBqID0gKGhleF9sZW5ndGgtMSk7IGkgPCBoZXhfbGVuZ3RoOyBpKyssIGotLSkgewogCQkJLyogR2V0IG9uZSBoZXggZGlnaXQsIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGZpcnN0ICovCiAKQEAgLTQ3NSw3ICs0ODQsNyBAQAogCQkvKiBTZXR1cCBzdHJpbmcgbGVuZ3RoLCBiYXNlLCBhbmQgc2VwYXJhdG9yICovCiAKIAkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0RFQ0lNQUw6IC8qIFVzZWQgYnkgdG9fZGVjaW1hbF9zdHJpbmcgb3BlcmF0b3IgKi8KKwkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTDogLyogVXNlZCBieSB0b19kZWNpbWFsX3N0cmluZyAqLwogCQkJLyoKIAkJCSAqIEZyb20gQUNQSTogIklmIERhdGEgaXMgYSBidWZmZXIsIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBvZgogCQkJICogZGVjaW1hbCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iCkBAIC01MDksNyArNTE4LDcgQEAKIAkJCXN0cmluZ19sZW5ndGggPSAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGggKiAzKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0hFWDogICAgIC8qIFVzZWQgYnkgdG9faGV4X3N0cmluZyBvcGVyYXRvciAqLworCQljYXNlIEFDUElfRVhQTElDSVRfQ09OVkVSVF9IRVg6ICAgICAvKiBVc2VkIGJ5IHRvX2hleF9zdHJpbmcgKi8KIAkJCS8qCiAJCQkgKiBGcm9tIEFDUEk6ICJJZiBEYXRhIGlzIGEgYnVmZmVyLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2YKIAkJCSAqIGhleGFkZWNpbWFsIHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiIKQEAgLTUzMCw5ICs1MzksOCBAQAogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfU1RSSU5HX0xJTUlUKTsKIAkJfQogCi0JCS8qCi0JCSAqIENyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGFuZCBzdHJpbmcgYnVmZmVyCi0JCSAqLworCQkvKiBDcmVhdGUgYSBuZXcgc3RyaW5nIG9iamVjdCBhbmQgc3RyaW5nIGJ1ZmZlciAqLworCiAJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdCAoKGFjcGlfc2l6ZSkgc3RyaW5nX2xlbmd0aCk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKQEAgLTU1MSw4ICs1NTksMTAgQEAKIAkJCSpuZXdfYnVmKysgPSBzZXBhcmF0b3I7IC8qIGVhY2ggc2VwYXJhdGVkIGJ5IGEgY29tbWEgb3Igc3BhY2UgKi8KIAkJfQogCi0JCS8qIE51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgKG92ZXJ3cml0ZXMgZmluYWwgY29tbWEvc3BhY2UgZnJvbSBhYm92ZSkgKi8KLQorCQkvKgorCQkgKiBOdWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nCisJCSAqIChvdmVyd3JpdGVzIGZpbmFsIGNvbW1hL3NwYWNlIGZyb20gYWJvdmUpCisJCSAqLwogCQluZXdfYnVmLS07CiAJCSpuZXdfYnVmID0gMDsKIAkJYnJlYWs7CkBAIC02NDUsNyArNjU1LDYgQEAKIAogCiAJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQogCQkJLyoKIAkJCSAqIFRoZSBvcGVyYW5kIG11c3QgYmUgYSBTdHJpbmcuICBXZSBjYW4gY29udmVydCBhbgogCQkJICogSW50ZWdlciBvciBCdWZmZXIgaWYgbmVjZXNzYXJ5CkBAIC02NTYsNyArNjY1LDYgQEAKIAogCiAJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQogCQkJLyoKIAkJCSAqIFRoZSBvcGVyYW5kIG11c3QgYmUgYSBCdWZmZXIuICBXZSBjYW4gY29udmVydCBhbgogCQkJICogSW50ZWdlciBvciBTdHJpbmcgaWYgbmVjZXNzYXJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCmluZGV4IGQ5NGMyNjAuLjgxMmNkY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCkBAIC01NSw3ICs1NSw3IEBACiAKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfYWxpYXMKICAqCkBAIC02NSw3ICs2NSw3IEBACiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBuYW1lZCBhbGlhcwogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX2FsaWFzICgKQEAgLTE0MCw4ICsxNDAsNyBAQAogCQkgKiB0YXJnZXQgbm9kZSBvciB0aGUgYWxpYXMgTm9kZQogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChhbGlhc19ub2RlLAotCQkJCSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKHRhcmdldF9ub2RlKSwKLQkJCQkgdGFyZ2V0X25vZGUtPnR5cGUpOworCQkJCSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKHRhcmdldF9ub2RlKSwgdGFyZ2V0X25vZGUtPnR5cGUpOwogCQlicmVhazsKIAl9CiAKQEAgLTE1MSw3ICsxNTAsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfZXZlbnQKICAqCkBAIC0xNjEsNyArMTYwLDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IGV2ZW50IG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX2V2ZW50ICgKQEAgLTE4NSw3ICsxODQsNyBAQAogCSAqIHRoYXQgdGhlIGV2ZW50IGlzIGNyZWF0ZWQgaW4gYW4gdW5zaWduYWxsZWQgc3RhdGUKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKEFDUElfTk9fVU5JVF9MSU1JVCwgMCwKLQkJCSAgICZvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKKwkJCSAmb2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMTkzLDcgKzE5Miw3IEBACiAJLyogQXR0YWNoIG9iamVjdCB0byB0aGUgTm9kZSAqLwogCiAJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0sCi0JCQkgICBvYmpfZGVzYywgQUNQSV9UWVBFX0VWRU5UKTsKKwkJCSBvYmpfZGVzYywgQUNQSV9UWVBFX0VWRU5UKTsKIAogY2xlYW51cDoKIAkvKgpAQCAtMjA1LDcgKzIwNCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9tdXRleAogICoKQEAgLTIxNyw3ICsyMTYsNyBAQAogICoKICAqICAgICAgICAgICAgICBNdXRleCAoTmFtZVswXSwgc3luY19sZXZlbFsxXSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NyZWF0ZV9tdXRleCAoCkBAIC0yNjcsMjAgKzI2NiwyMCBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfcmVnaW9uCiAgKgogICogUEFSQU1FVEVSUzogIGFtbF9zdGFydCAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZWdpb24gZGVjbGFyYXRpb24gQU1MCiAgKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgICAgICAtIE1heCBsZW5ndGggb2YgdGhlIGRlY2xhcmF0aW9uIEFNTAotICogICAgICAgICAgICAgIE9wZXJhbmRzICAgICAgICAgICAgLSBMaXN0IG9mIG9wZXJhbmRzIGZvciB0aGUgb3Bjb2RlCisgKiAgICAgICAgICAgICAgcmVnaW9uX3NwYWNlICAgICAgICAtIHNwYWNlX2lEIGZvciB0aGUgcmVnaW9uCiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBvcGVyYXRpb24gcmVnaW9uIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX3JlZ2lvbiAoCkBAIC0zMjEsNyArMzIwLDcgQEAKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAiUmVnaW9uIFR5cGUgLSAlcyAoJVgpXG4iLAotCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnaW9uX3NwYWNlKSwgcmVnaW9uX3NwYWNlKSk7CisJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fc3BhY2UpLCByZWdpb25fc3BhY2UpKTsKIAogCS8qIENyZWF0ZSB0aGUgcmVnaW9uIGRlc2NyaXB0b3IgKi8KIApAQCAtMzYwLDcgKzM1OSw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV90YWJsZV9yZWdpb24KICAqCkBAIC0zNzAsNyArMzY5LDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IGRhdGFfdGFibGVfcmVnaW9uIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbiAoCkBAIC00NTUsNyArNDU0LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3Byb2Nlc3NvcgogICoKQEAgLTQ2Nyw3ICs0NjYsNyBAQAogICoKICAqICAgICAgICAgICAgICBQcm9jZXNzb3IgKE5hbWVbMF0sIGNwdV9pRFsxXSwgcGJsb2NrX2FkZHJbMl0sIHBibG9ja19sZW5ndGhbM10pCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jcmVhdGVfcHJvY2Vzc29yICgKQEAgLTQ4OCw5ICs0ODcsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJfQogCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzb3Igb2JqZWN0IGZyb20gdGhlIG9wZXJhbmRzCi0JICovCisJLyogSW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc29yIG9iamVjdCBmcm9tIHRoZSBvcGVyYW5kcyAqLworCiAJb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkID0gKHU4KSAgICAgICAgICBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwogCW9ial9kZXNjLT5wcm9jZXNzb3IuYWRkcmVzcyA9IChhY3BpX2lvX2FkZHJlc3MpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7CiAJb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGggPSAodTgpICAgICAgICAgICBvcGVyYW5kWzNdLT5pbnRlZ2VyLnZhbHVlOwpAQCAtNTA3LDcgKzUwNSw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZQogICoKQEAgLTUxOSw3ICs1MTcsNyBAQAogICoKICAqICAgICAgICAgICAgICBwb3dlcl9yZXNvdXJjZSAoTmFtZVswXSwgc3lzdGVtX2xldmVsWzFdLCByZXNvdXJjZV9vcmRlclsyXSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZSAoCkBAIC01NTUsMTAgKzU1MywxMCBAQAogCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KLQogI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9tZXRob2QKICAqCkBAIC01NzAsNyArNTY4LDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IG1ldGhvZCBvYmplY3QKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NyZWF0ZV9tZXRob2QgKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCmluZGV4IGUyZjdjMzIuLjQwODUwMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKQEAgLTUxLDIzICs1MSw0OCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4ZHVtcCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCitzdGF0aWMgdm9pZAorYWNwaV9leF9vdXRfc3RyaW5nICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkCithY3BpX2V4X291dF9wb2ludGVyICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkCithY3BpX2V4X291dF9pbnRlZ2VyICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKworc3RhdGljIHZvaWQKK2FjcGlfZXhfb3V0X2FkZHJlc3MgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAorCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgdmFsdWUpOworI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCisKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHVzZWQgZm9yIGRlYnVnIG91dHB1dCBvbmx5CiAgKi8KICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29wZXJhbmQKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgLSBQb2ludGVyIHRvIGVudHJ5IHRvIGJlIGR1bXBlZAorICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAtIFBvaW50ZXIgdG8gZW50cnkgdG8gYmUgZHVtcGVkCisgKiAgICAgICAgICAgICAgRGVwdGggICAgICAgICAgIC0gQ3VycmVudCBuZXN0aW5nIGRlcHRoCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogRHVtcCBhbiBvcGVyYW5kIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV9leF9kdW1wX29wZXJhbmQgKApAQCAtODYsOSArMTExLDggQEAKIAl9CiAKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCS8qCi0JCSAqIFRoaXMgY291bGQgYmUgYSBudWxsIGVsZW1lbnQgb2YgYSBwYWNrYWdlCi0JCSAqLworCQkvKiBUaGlzIGNvdWxkIGJlIGEgbnVsbCBlbGVtZW50IG9mIGEgcGFja2FnZSAqLworCiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJOdWxsIE9iamVjdCBEZXNjcmlwdG9yXG4iKSk7CiAJCXJldHVybjsKIAl9CkBAIC0xMTcsNiArMTQxLDggQEAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIiVwICIsIG9ial9kZXNjKSk7CiAJfQogCisJLyogRGVjb2RlIG9iamVjdCB0eXBlICovCisKIAlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKQEAgLTI3NCw3ICszMDAsOSBAQAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQlhY3BpX29zX3ByaW50ZiAoIlN0cmluZyBsZW5ndGggJVggQCAlcCAiLAotCQkJb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisJCQlvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCwKKwkJCW9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisKIAkJYWNwaV91dF9wcmludF9zdHJpbmcgKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgQUNQSV9VSU5UOF9NQVgpOwogCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CiAJCWJyZWFrOwpAQCAtMjkwLDEwICszMTgsMTMgQEAKIAogCQlhY3BpX29zX3ByaW50ZiAoCiAJCQkicmVnaW9uX2ZpZWxkOiBCaXRzPSVYIGFjY193aWR0aD0lWCBMb2NrPSVYIFVwZGF0ZT0lWCBhdCBieXRlPSVYIGJpdD0lWCBvZiBiZWxvdzpcbiIsCi0JCQlvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCwgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJb2JqX2Rlc2MtPmZpZWxkLmJpdF9sZW5ndGgsCisJCQlvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCiAJCQlvYmpfZGVzYy0+ZmllbGQuZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfTE9DS19SVUxFX01BU0ssCiAJCQlvYmpfZGVzYy0+ZmllbGQuZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSywKLQkJCW9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LCBvYmpfZGVzYy0+ZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CisJCQlvYmpfZGVzYy0+ZmllbGQuYmFzZV9ieXRlX29mZnNldCwKKwkJCW9ial9kZXNjLT5maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwogCQlhY3BpX2V4X2R1bXBfb3BlcmFuZCAob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmosIGRlcHRoKzEpOwogCQlicmVhazsKIApAQCAtMzA4LDEzICszMzksMTUgQEAKIAogCQlhY3BpX29zX3ByaW50ZiAoCiAJCQkiYnVmZmVyX2ZpZWxkOiAlWCBiaXRzIGF0IGJ5dGUgJVggYml0ICVYIG9mIFxuIiwKLQkJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuYml0X2xlbmd0aCwgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAogCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKIAogCQlpZiAoIW9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaikgewogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIipOVUxMKiBcbiIpKTsKIAkJfQotCQllbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopICE9CisJCQkJIEFDUElfVFlQRV9CVUZGRVIpIHsKIAkJCWFjcGlfb3NfcHJpbnRmICgiKm5vdCBhIEJ1ZmZlciogXG4iKTsKIAkJfQogCQllbHNlIHsKQEAgLTMzMSwxMCArMzY0LDEwIEBACiAKIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKLQkJYWNwaV9vc19wcmludGYgKAotCQkJIk1ldGhvZCglWCkgQCAlcDolWFxuIiwKKwkJYWNwaV9vc19wcmludGYgKCJNZXRob2QoJVgpIEAgJXA6JVhcbiIsCiAJCQlvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50LAotCQkJb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCk7CisJCQlvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKKwkJCW9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCk7CiAJCWJyZWFrOwogCiAKQEAgLTM3OSw3ICs0MTIsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29wZXJhbmRzCiAgKgpAQCAtMzkzLDcgKzQyNiw3IEBACiAgKgogICogREVTQ1JJUFRJT046IER1bXAgdGhlIG9iamVjdCBzdGFjawogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV9leF9kdW1wX29wZXJhbmRzICgKQEAgLTQ0MSwxMCArNDc0LDkgQEAKIAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X291dCoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X291dCogZnVuY3Rpb25zCiAgKgogICogUEFSQU1FVEVSUzogIFRpdGxlICAgICAgICAgICAgICAgLSBEZXNjcmlwdGl2ZSB0ZXh0CiAgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGRpc3BsYXllZApAQCAtNDUzLDkgKzQ4NSw5IEBACiAgKiAgICAgICAgICAgICAgcmVkdWNlIHRoZSBudW1iZXIgb2YgZm9ybWF0IHN0cmluZ3MgcmVxdWlyZWQgYW5kIGtlZXBzIHRoZW0KICAqICAgICAgICAgICAgICBhbGwgaW4gb25lIHBsYWNlIGZvciBlYXN5IG1vZGlmaWNhdGlvbi4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX2V4X291dF9zdHJpbmcgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKQpAQCAtNDYzLDcgKzQ5NSw3IEBACiAJYWNwaV9vc19wcmludGYgKCIlMjBzIDogJXNcbiIsIHRpdGxlLCB2YWx1ZSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX2V4X291dF9wb2ludGVyICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSkKQEAgLTQ3MSw3ICs1MDMsNyBAQAogCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVwXG4iLCB0aXRsZSwgdmFsdWUpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9leF9vdXRfaW50ZWdlciAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKQEAgLTQ3OSw3ICs1MTEsNyBAQAogCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVYXG4iLCB0aXRsZSwgdmFsdWUpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9leF9vdXRfYWRkcmVzcyAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCiAJYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICB2YWx1ZSkKQEAgLTQ5MywxNiArNTI1LDE2IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfbm9kZQogICoKICAqIFBBUkFNRVRFUlM6ICAqTm9kZSAgICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEZvcmNlIGRpc3BsYXkKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRm9yY2UgZGlzcGxheSBpZiBUUlVFCiAgKgogICogREVTQ1JJUFRJT046IER1bXBzIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbi5Ob2RlCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX2V4X2R1bXBfbm9kZSAoCkBAIC01MzEsMTYgKzU2MywxNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yCiAgKgogICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRm9yY2UgZGlzcGxheQorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBGb3JjZSBkaXNwbGF5IGlmIFRSVUUKICAqCiAgKiBERVNDUklQVElPTjogRHVtcHMgdGhlIG1lbWJlcnMgb2YgdGhlIG9iamVjdCBkZXNjcmlwdG9yIGdpdmVuLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yICgKQEAgLTU1Myw2ICs1ODUsMTAgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvciIpOwogCiAKKwlpZiAoIW9ial9kZXNjKSB7CisJCXJldHVybl9WT0lEOworCX0KKwogCWlmICghZmxhZ3MpIHsKIAkJaWYgKCEoKEFDUElfTFZfT0JKRUNUUyAmIGFjcGlfZGJnX2xldmVsKSAmJiAoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKIAkJCXJldHVybl9WT0lEOwpAQCAtNzQ3LDExICs3ODMsMTcgQEAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKIAkJYWNwaV9leF9vdXRfaW50ZWdlciAoInRhcmdldF90eXBlIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSk7Ci0JCWFjcGlfZXhfb3V0X3N0cmluZyAoIk9wY29kZSIsICAgICAgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKS0+bmFtZSk7CisJCWFjcGlfZXhfb3V0X3N0cmluZyAoIk9wY29kZSIsICAgICAgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAoCisJCQkJICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpLT5uYW1lKTsKIAkJYWNwaV9leF9vdXRfaW50ZWdlciAoIk9mZnNldCIsICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQpOwogCQlhY3BpX2V4X291dF9wb2ludGVyICgib2JqX2Rlc2MiLCAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAJCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJOb2RlIiwgICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uubm9kZSk7CiAJCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJXaGVyZSIsICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uud2hlcmUpOworCisJCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgeworCQkJYWNwaV9vc19wcmludGYgKCJcblJlZmVyZW5jZWQgT2JqZWN0OlxuIik7CisJCQlhY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LCBmbGFncyk7CisJCX0KIAkJYnJlYWs7CiAKIApAQCAtNzg4LDYgKzgzMCw1IEBACiB9CiAKICNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKaW5kZXggYmU3ZjIxMi4uMjJjOGZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jCkBAIC0xMjAsOCArMTIwLDggQEAKIAkJICogTm90ZTogU21idXMgcHJvdG9jb2wgdmFsdWUgaXMgcGFzc2VkIGluIHVwcGVyIDE2LWJpdHMgb2YgRnVuY3Rpb24KIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbiAob2JqX2Rlc2MsIDAsCi0JCQkJICBBQ1BJX0NBU1RfUFRSIChhY3BpX2ludGVnZXIsIGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlciksCi0JCQkJICBBQ1BJX1JFQUQgfCAob2JqX2Rlc2MtPmZpZWxkLmF0dHJpYnV0ZSA8PCAxNikpOworCQkJCSBBQ1BJX0NBU1RfUFRSIChhY3BpX2ludGVnZXIsIGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlciksCisJCQkJIEFDUElfUkVBRCB8IChvYmpfZGVzYy0+ZmllbGQuYXR0cmlidXRlIDw8IDE2KSk7CiAJCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAobG9ja2VkKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTE5Niw2ICsxOTYsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBzb3VyY2VfZGVzYyAgICAgICAgIC0gQ29udGFpbnMgZGF0YSB0byB3cml0ZQogICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBUaGUgbmFtZWQgZmllbGQKKyAqICAgICAgICAgICAgICByZXN1bHRfZGVzYyAgICAgICAgIC0gV2hlcmUgdGhlIHJldHVybiB2YWx1ZSBpcyByZXR1cm5lZCwgaWYgYW55CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTI1MCwxMiArMjUxLDE1IEBACiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKIAkJCUFDUElfUkVQT1JUX0VSUk9SICgoIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciwgZm91bmQgdHlwZSAlc1xuIiwKIAkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKKwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCiAJCWlmIChzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IEFDUElfU01CVVNfQlVGRkVSX1NJWkUpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciBvZiBsZW5ndGggJVgsIGZvdW5kIGxlbmd0aCAlWFxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciBvZiBsZW5ndGggJVgsIGZvdW5kIGxlbmd0aCAlWFxuIiwKIAkJCQlBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFLCBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOworCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CVUZGRVJfTElNSVQpOwogCQl9CiAKQEAgLTI2NSwxNCArMjY5LDE2IEBACiAJCX0KIAogCQlidWZmZXIgPSBidWZmZXJfZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JCUFDUElfTUVNQ1BZIChidWZmZXIsIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwgQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CisJCUFDUElfTUVNQ1BZIChidWZmZXIsIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCUFDUElfU01CVVNfQlVGRkVSX1NJWkUpOwogCiAJCS8qIExvY2sgZW50aXJlIHRyYW5zYWN0aW9uIGlmIHJlcXVlc3RlZCAqLwogCiAJCWxvY2tlZCA9IGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CiAKIAkJLyoKLQkJICogUGVyZm9ybSB0aGUgd3JpdGUgKHJldHVybnMgc3RhdHVzIGFuZCBwZXJoYXBzIGRhdGEgaW4gdGhlIHNhbWUgYnVmZmVyKQorCQkgKiBQZXJmb3JtIHRoZSB3cml0ZSAocmV0dXJucyBzdGF0dXMgYW5kIHBlcmhhcHMgZGF0YSBpbiB0aGUKKwkJICogc2FtZSBidWZmZXIpCiAJCSAqIE5vdGU6IFNNQnVzIHByb3RvY29sIHR5cGUgaXMgcGFzc2VkIGluIHVwcGVyIDE2LWJpdHMgb2YgRnVuY3Rpb24uCiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX2V4X2FjY2Vzc19yZWdpb24gKG9ial9kZXNjLCAwLApAQCAtMjg0LDkgKzI5MCw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQkvKgotCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgd3JpdHRlbgotCSAqLworCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiAqLworCiAJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJYnVmZmVyID0gJnNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlOwpAQCAtMzE0LDcgKzMxOSw4IEBACiAJICogdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KIAkgKi8KIAluZXdfYnVmZmVyID0gTlVMTDsKLQlyZXF1aXJlZF9sZW5ndGggPSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCk7CisJcmVxdWlyZWRfbGVuZ3RoID0gQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTICgKKwkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCk7CiAKIAlpZiAobGVuZ3RoIDwgcmVxdWlyZWRfbGVuZ3RoKSB7CiAJCS8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlciAqLwpAQCAtMzM4LDYgKzM0NCw3IEBACiAJCSJmaWVsZF93cml0ZSBbRlJPTV06IE9iaiAlcCAoJXM6JVgpLCBCdWYgJXAsIGJ5dGVfbGVuICVYXG4iLAogCQlzb3VyY2VfZGVzYywgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKSwKIAkJQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSwgYnVmZmVyLCBsZW5ndGgpKTsKKwogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKIAkJImZpZWxkX3dyaXRlIFtUT106ICBPYmogJXAgKCVzOiVYKSwgYml0X2xlbiAlWCwgYml0X29mZiAlWCwgYnl0ZV9vZmYgJVhcbiIsCiAJCW9ial9kZXNjLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKaW5kZXggOWQwZjlkMi4uM2MyZjg5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jCkBAIC01MiwxMiArNTIsMzEgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGZsZGlvIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfZmllbGRfZGF0dW1faW8gKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlKTsKKworc3RhdGljIHU4CithY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93ICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V4X3NldHVwX3JlZ2lvbiAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zZXR1cF9yZWdpb24KICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgICAgICAgLSBGaWVsZCB0byBiZSByZWFkIG9yIHdyaXR0ZW4KKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQgb3Igd3JpdHRlbgogICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gQnl0ZSBvZmZzZXQgb2YgdGhpcyBkYXR1bSB3aXRoaW4gdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgZmllbGQKICAqCkBAIC02OSw3ICs4OCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9leF9zZXR1cF9yZWdpb24gKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpCkBAIC0xMjcsOSArMTQ2LDkgQEAKIAkgKiBsZW5ndGggb2Ygb25lIGZpZWxkIGRhdHVtIChhY2Nlc3Mgd2lkdGgpIG11c3QgZml0IHdpdGhpbiB0aGUgcmVnaW9uLgogCSAqIChSZWdpb24gbGVuZ3RoIGlzIHNwZWNpZmllZCBpbiBieXRlcykKIAkgKi8KLQlpZiAocmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0Ci0JCQkgICArIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0Ci0JCQkgICArIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKSB7CisJaWYgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoIDwgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCArCisJCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSkgewogCQlpZiAoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB7CiAJCQkvKgogCQkJICogU2xhY2sgbW9kZSBvbmx5OiAgV2Ugd2lsbCBnbyBhaGVhZCBhbmQgYWxsb3cgYWNjZXNzIHRvIHRoaXMKQEAgLTE1NSw3ICsxNzQsOCBAQAogCQkJCSJGaWVsZCBbJTQuNHNdIGFjY2VzcyB3aWR0aCAoJWQgYnl0ZXMpIHRvbyBsYXJnZSBmb3IgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsCiAJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpLAogCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChyZ25fZGVzYy0+cmVnaW9uLm5vZGUpLCByZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOworCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocmduX2Rlc2MtPnJlZ2lvbi5ub2RlKSwKKwkJCQlyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwogCQl9CiAKIAkJLyoKQEAgLTE2Nyw3ICsxODcsOCBAQAogCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpLAogCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAogCQkJZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHJnbl9kZXNjLT5yZWdpb24ubm9kZSksIHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CisJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHJnbl9kZXNjLT5yZWdpb24ubm9kZSksCisJCQlyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1JFR0lPTl9MSU1JVCk7CiAJfQpAQCAtMTgwLDEwICsyMDEsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hY2Nlc3NfcmVnaW9uCiAgKgotICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZAorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZAogICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gQnl0ZSBvZmZzZXQgb2YgdGhpcyBkYXR1bSB3aXRoaW4gdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgZmllbGQKLSAqICAgICAgICAgICAgICAqVmFsdWUgICAgICAgICAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHZhbHVlIChtdXN0IGF0IGxlYXN0CisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB2YWx1ZSAobXVzdCBhdCBsZWFzdAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNpemUgb2YgYWNwaV9pbnRlZ2VyKQogICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBmbGFnIHBsdXMgb3RoZXIgcmVnaW9uLQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50IGZsYWdzCkBAIC0yMjYsOSArMjQ3LDkgQEAKIAkgKiAzKSBUaGUgY3VycmVudCBvZmZzZXQgaW50byB0aGUgZmllbGQKIAkgKi8KIAlyZ25fZGVzYyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQucmVnaW9uX29iajsKLQlhZGRyZXNzID0gcmduX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzCi0JCQkgKyBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQKLQkJCSArIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0OworCWFkZHJlc3MgPSByZ25fZGVzYy0+cmVnaW9uLmFkZHJlc3MgKworCQkJIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQ7CiAKIAlpZiAoKGZ1bmN0aW9uICYgQUNQSV9JT19NQVNLKSA9PSBBQ1BJX1JFQUQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELCAiW1JFQURdIikpOwpAQCAtMjQ5LDcgKzI3MCw4IEBACiAJLyogSW52b2tlIHRoZSBhcHByb3ByaWF0ZSBhZGRyZXNzX3NwYWNlL29wX3JlZ2lvbiBoYW5kbGVyICovCiAKIAlzdGF0dXMgPSBhY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2ggKHJnbl9kZXNjLCBmdW5jdGlvbiwKLQkJCSAgYWRkcmVzcywgQUNQSV9NVUxfOCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCksIHZhbHVlKTsKKwkJCSBhZGRyZXNzLAorCQkJIEFDUElfTVVMXzggKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpLCB2YWx1ZSk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0lNUExFTUVOVEVEKSB7CkBAIC0yNzQsNyArMjk2LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdwogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgICAgICAtIFJlZ2lzdGVyKEZpZWxkKSB0byBiZSB3cml0dGVuCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAgICAgLSBSZWdpc3RlcihGaWVsZCkgdG8gYmUgd3JpdHRlbgogICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCiAgKgogICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdmFsdWUgb3ZlcmZsb3dzIHRoZSBmaWVsZCwgRkFMU0Ugb3RoZXJ3aXNlCkBAIC0yODcsNyArMzA5LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAorc3RhdGljIHU4CiBhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKQpAQCAtMzE5LDEwICszNDEsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9maWVsZF9kYXR1bV9pbwogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQKICAqICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCAtIEJ5dGUgb2Zmc2V0IG9mIHRoaXMgZGF0dW0gd2l0aGluIHRoZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IGZpZWxkCi0gKiAgICAgICAgICAgICAgKlZhbHVlICAgICAgICAgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB2YWx1ZSAobXVzdCBiZSA2NCBiaXRzKQorICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgIC0gV2hlcmUgdG8gc3RvcmUgdmFsdWUgKG11c3QgYmUgNjQgYml0cykKICAqICAgICAgICAgICAgICByZWFkX3dyaXRlICAgICAgICAgICAgICAtIFJlYWQgb3IgV3JpdGUgZmxhZwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTMzMyw3ICszNTUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfZmllbGRfZGF0dW1faW8gKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCkBAIC0zNTAsNyArMzcyLDkgQEAKIAlpZiAocmVhZF93cml0ZSA9PSBBQ1BJX1JFQUQpIHsKIAkJaWYgKCF2YWx1ZSkgewogCQkJbG9jYWxfdmFsdWUgPSAwOwotCQkJdmFsdWUgPSAmbG9jYWxfdmFsdWU7IC8qIFRvIHN1cHBvcnQgcmVhZHMgd2l0aG91dCBzYXZpbmcgcmV0dXJuIHZhbHVlICovCisKKwkJCS8qIFRvIHN1cHBvcnQgcmVhZHMgd2l0aG91dCBzYXZpbmcgcmV0dXJuIHZhbHVlICovCisJCQl2YWx1ZSA9ICZsb2NhbF92YWx1ZTsKIAkJfQogCiAJCS8qIENsZWFyIHRoZSBlbnRpcmUgcmV0dXJuIGJ1ZmZlciBmaXJzdCwgW1ZlcnkgSW1wb3J0YW50IV0gKi8KQEAgLTM2Myw4ICszODcsMTAgQEAKIAkgKgogCSAqIGJ1ZmZlcl9maWVsZCAtIFJlYWQvd3JpdGUgZnJvbS90byBhIEJ1ZmZlcgogCSAqIHJlZ2lvbl9maWVsZCAtIFJlYWQvd3JpdGUgZnJvbS90byBhIE9wZXJhdGlvbiBSZWdpb24uCi0JICogYmFua19maWVsZCAgLSBXcml0ZSB0byBhIEJhbmsgUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGFuIG9wX3JlZ2lvbgotCSAqIGluZGV4X2ZpZWxkIC0gV3JpdGUgdG8gYW4gSW5kZXggUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGEgRGF0YSBSZWdpc3RlcgorCSAqIGJhbmtfZmllbGQgIC0gV3JpdGUgdG8gYSBCYW5rIFJlZ2lzdGVyLCB0aGVuIHJlYWQvd3JpdGUgZnJvbS90byBhbgorCSAqICAgICAgICAgICAgICAgb3BlcmF0aW9uX3JlZ2lvbgorCSAqIGluZGV4X2ZpZWxkIC0gV3JpdGUgdG8gYW4gSW5kZXggUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGEKKwkgKiAgICAgICAgICAgICAgIERhdGEgUmVnaXN0ZXIKIAkgKi8KIAlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CkBAIC0zODQsMTkgKzQxMCwyMCBAQAogCQkJICogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyLgogCQkJICogTGVuZ3RoIGlzIHRoZSBmaWVsZCB3aWR0aCBpbiBieXRlcy4KIAkJCSAqLwotCQkJQUNQSV9NRU1DUFkgKHZhbHVlLCAob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLnBvaW50ZXIKLQkJCQkJICArIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldAotCQkJCQkgICsgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CisJCQlBQ1BJX01FTUNQWSAodmFsdWUsCisJCQkJKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiktPmJ1ZmZlci5wb2ludGVyICsKKwkJCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKKwkJCQkJZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CiAJCX0KIAkJZWxzZSB7CiAJCQkvKgogCQkJICogQ29weSB0aGUgZGF0YSB0byB0aGUgdGFyZ2V0IGJ1ZmZlci4KIAkJCSAqIExlbmd0aCBpcyB0aGUgZmllbGQgd2lkdGggaW4gYnl0ZXMuCiAJCQkgKi8KLQkJCUFDUElfTUVNQ1BZICgob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLnBvaW50ZXIKLQkJCQkJKyBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQKLQkJCQkJKyBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCUFDUElfTUVNQ1BZICgob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLnBvaW50ZXIgKworCQkJCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKworCQkJCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKIAkJCQkJdmFsdWUsIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpOwogCQl9CiAKQEAgLTQwNiw4ICs0MzMsMTAgQEAKIAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAKLQkJLyogRW5zdXJlIHRoYXQgdGhlIGJhbmtfdmFsdWUgaXMgbm90IGJleW9uZCB0aGUgY2FwYWNpdHkgb2YgdGhlIHJlZ2lzdGVyICovCi0KKwkJLyoKKwkJICogRW5zdXJlIHRoYXQgdGhlIGJhbmtfdmFsdWUgaXMgbm90IGJleW9uZCB0aGUgY2FwYWNpdHkgb2YKKwkJICogdGhlIHJlZ2lzdGVyCisJCSAqLwogCQlpZiAoYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAob2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmosCiAJCQkJICAoYWNwaV9pbnRlZ2VyKSBvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSkpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKQEAgLTQ0NSw4ICs0NzQsMTAgQEAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAogCi0JCS8qIEVuc3VyZSB0aGF0IHRoZSBpbmRleF92YWx1ZSBpcyBub3QgYmV5b25kIHRoZSBjYXBhY2l0eSBvZiB0aGUgcmVnaXN0ZXIgKi8KLQorCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB0aGUgaW5kZXhfdmFsdWUgaXMgbm90IGJleW9uZCB0aGUgY2FwYWNpdHkgb2YKKwkJICogdGhlIHJlZ2lzdGVyCisJCSAqLwogCQlpZiAoYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaiwKIAkJCQkgIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSkpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKQEAgLTQ5NiwxNCArNTI3LDE2IEBACiAKIAlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELCAiVmFsdWUgUmVhZCAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKLQkJCQkJICAgQUNQSV9GT1JNQVRfVUlOVDY0ICgqdmFsdWUpLAotCQkJCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCisJCQkJIlZhbHVlIFJlYWQgJTguOFglOC44WCwgV2lkdGggJWRcbiIsCisJCQkJQUNQSV9GT1JNQVRfVUlOVDY0ICgqdmFsdWUpLAorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKTsKIAkJfQogCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwgIlZhbHVlIFdyaXR0ZW4gJTguOFglOC44WCwgV2lkdGggJWRcbiIsCi0JCQkJCSAgIEFDUElfRk9STUFUX1VJTlQ2NCAoKnZhbHVlKSwKLQkJCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAorCQkJCSJWYWx1ZSBXcml0dGVuICU4LjhYJTguOFgsIFdpZHRoICVkXG4iLAorCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoKnZhbHVlKSwKKwkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CiAJCX0KIAl9CiAKQEAgLTUxNSw4ICs1NDgsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlCiAgKgotICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAgICAgLSBGaWVsZCB0byBiZSBzZXQKLSAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIC0gVmFsdWUgdG8gc3RvcmUKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICBNYXNrICAgICAgICAgICAgICAgICAgICAtIGJpdG1hc2sgd2l0aGluIGZpZWxkIGRhdHVtCisgKiAgICAgICAgICAgICAgZmllbGRfdmFsdWUgICAgICAgICAgICAgLSBWYWx1ZSB0byB3cml0ZQorICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gT2Zmc2V0IG9mIGRhdHVtIHdpdGhpbiBmaWVsZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC02ODksNyArNzI0LDggQEAKIAkJLyogTWVyZ2Ugd2l0aCBwcmV2aW91cyBkYXR1bSBpZiBuZWNlc3NhcnkgKi8KIAogCQltZXJnZWRfZGF0dW0gfD0gcmF3X2RhdHVtIDw8Ci0JCQkob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoIC0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CiAKIAkJaWYgKGkgPT0gZGF0dW1fY291bnQpIHsKIAkJCWJyZWFrOwpAQCAtNzA3LDcgKzc0Myw4IEBACiAKIAkvKiBNYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiB0aGUgbGFzdCBkYXR1bSAqLwogCi0JYnVmZmVyX3RhaWxfYml0cyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCAlIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKKwlidWZmZXJfdGFpbF9iaXRzID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICUKKwkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKIAlpZiAoYnVmZmVyX3RhaWxfYml0cykgewogCQltZXJnZWRfZGF0dW0gJj0gQUNQSV9NQVNLX0JJVFNfQUJPVkUgKGJ1ZmZlcl90YWlsX2JpdHMpOwogCX0KQEAgLTc5MSw3ICs4MjgsOCBAQAogCQkvKiBXcml0ZSBtZXJnZWQgZGF0dW0gdG8gdGhlIHRhcmdldCBmaWVsZCAqLwogCiAJCW1lcmdlZF9kYXR1bSAmPSBtYXNrOwotCQlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUgKG9ial9kZXNjLCBtYXNrLCBtZXJnZWRfZGF0dW0sIGZpZWxkX29mZnNldCk7CisJCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAob2JqX2Rlc2MsIG1hc2ssCisJCQkJIG1lcmdlZF9kYXR1bSwgZmllbGRfb2Zmc2V0KTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC04MDAsNyArODM4LDggQEAKIAogCQlmaWVsZF9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKIAkJbWVyZ2VkX2RhdHVtID0gcmF3X2RhdHVtID4+Ci0JCQkob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoIC0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CiAJCW1hc2sgPSBBQ1BJX0lOVEVHRVJfTUFYOwogCiAJCWlmIChpID09IGRhdHVtX2NvdW50KSB7CkBAIC04MTksNyArODU4LDggQEAKIAkvKiBNYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiB0aGUgbGFzdCBkYXR1bSAqLwogCiAJYnVmZmVyX3RhaWxfYml0cyA9IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKwotCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSAlIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKKwkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCkgJQorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKIAlpZiAoYnVmZmVyX3RhaWxfYml0cykgewogCQltYXNrICY9IEFDUElfTUFTS19CSVRTX0FCT1ZFIChidWZmZXJfdGFpbF9iaXRzKTsKIAl9CkBAIC04MjcsNyArODY3LDggQEAKIAkvKiBXcml0ZSB0aGUgbGFzdCBkYXR1bSB0byB0aGUgZmllbGQgKi8KIAogCW1lcmdlZF9kYXR1bSAmPSBtYXNrOwotCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAob2JqX2Rlc2MsIG1hc2ssIG1lcmdlZF9kYXR1bSwgZmllbGRfb2Zmc2V0KTsKKwlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUgKG9ial9kZXNjLAorCQkJIG1hc2ssIG1lcmdlZF9kYXR1bSwgZmllbGRfb2Zmc2V0KTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYwppbmRleCBiNTQyZGNkLi4wMjJmMjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCkBAIC0xMzksOCArMTM5LDkgQEAKIAlyZWZlcmVuY2Vfb2JqLT5yZWZlcmVuY2Uub2JqZWN0ID0gcmVmZXJlbmNlZF9vYmo7CiAJKnJldHVybl9kZXNjID0gcmVmZXJlbmNlX29iajsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmplY3QgJXAgVHlwZSBbJXNdLCByZXR1cm5pbmcgUmVmZXJlbmNlICVwXG4iLAotCQkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgKnJldHVybl9kZXNjKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJIk9iamVjdCAlcCBUeXBlIFslc10sIHJldHVybmluZyBSZWZlcmVuY2UgJXBcbiIsCisJCW9ial9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksICpyZXR1cm5fZGVzYykpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC00NTYsNyArNDU3LDcgQEAKIAkJcmV0dXJuIChpbnRlZ2VyMCAqIGludGVnZXIxKTsKIAogCi0JY2FzZSBBTUxfU0hJRlRfTEVGVF9PUDogICAgICAgICAvKiBzaGlmdF9sZWZ0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSAqLworCWNhc2UgQU1MX1NISUZUX0xFRlRfT1A6ICAgICAgICAgLyogc2hpZnRfbGVmdCAoT3BlcmFuZCwgc2hpZnRfY291bnQsIFJlc3VsdCkqLwogCiAJCXJldHVybiAoaW50ZWdlcjAgPDwgaW50ZWdlcjEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYwppbmRleCA2OGM0YmIxLi5jM2NiNzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKQEAgLTQ5LDYgKzQ5LDEzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhtdXRleCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfZXhfbGlua19tdXRleCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCisJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU2LDcgKzYzLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBtdXRleCB0byBiZSB1bmxpbmtlZAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IFJlbW92ZSBhIG11dGV4IGZyb20gdGhlICJhY3F1aXJlZF9tdXRleCIgbGlzdAogICoKQEAgLTkyLDE2ICs5OSwxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2xpbmtfbXV0ZXgKICAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBtdXRleCB0byBiZSBsaW5rZWQKLSAqICAgICAgICAgICAgICBsaXN0X2hlYWQgICAgICAgICAgIC0gaGVhZCBvZiB0aGUgImFjcXVpcmVkX211dGV4IiBsaXN0CisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG11dGV4IHRvIGJlIGxpbmtlZAorICogICAgICAgICAgICAgIFRocmVhZCAgICAgICAgICAtIEN1cnJlbnQgZXhlY3V0aW5nIHRocmVhZCBvYmplY3QKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBBZGQgYSBtdXRleCB0byB0aGUgImFjcXVpcmVkX211dGV4IiBsaXN0IGZvciB0aGlzIHdhbGsKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9leF9saW5rX211dGV4ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKIAlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpCkBAIC0xMzIsOCArMTM5LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hY3F1aXJlX211dGV4CiAgKgotICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAgICAgLSBUaGUgJ3RpbWUgdG8gZGVsYXknIG9iamVjdCBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAgICAgLSBUaW1lb3V0IGludGVnZXIKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgICAgIC0gTXV0ZXggb2JqZWN0CisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgbWV0aG9kIGV4ZWN1dGlvbiBzdGF0ZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xNjEsNyArMTY5LDcgQEAKIAogCWlmICghd2Fsa19zdGF0ZS0+dGhyZWFkKSB7CiAJCUFDUElfUkVQT1JUX0VSUk9SICgoIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIG51bGwgdGhyZWFkIGluZm9cbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKKwkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKIAl9CiAKQEAgLTE3MCw4ICsxNzgsOSBAQAogCSAqIG11dGV4LiAgVGhpcyBtZWNoYW5pc20gcHJvdmlkZXMgc29tZSBkZWFkbG9jayBwcmV2ZW50aW9uCiAJICovCiAJaWYgKHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID4gb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ2Fubm90IGFjcXVpcmUgTXV0ZXggWyU0LjRzXSwgaW5jb3JyZWN0IHN5bmNfbGV2ZWxcbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJDYW5ub3QgYWNxdWlyZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwKKwkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX01VVEVYX09SREVSKTsKIAl9CiAKQEAgLTE4MCw4ICsxODksMTAgQEAKIAlpZiAob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCkgewogCQkvKiBTcGVjaWFsIGNhc2UgZm9yIEdsb2JhbCBMb2NrLCBhbGxvdyBhbGwgdGhyZWFkcyAqLwogCi0JCWlmICgob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkID09IHdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKSB8fAotCQkJKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSkgeworCQlpZiAoKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCA9PQorCQkJCXdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKSAgICAgIHx8CisJCQkob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSA9PQorCQkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSkpIHsKIAkJCS8qCiAJCQkgKiBUaGUgbXV0ZXggaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRocmVhZCwKIAkJCSAqIGp1c3QgaW5jcmVtZW50IHRoZSBhY3F1aXNpdGlvbiBkZXB0aApAQCAtMjIxLDYgKzIzMiw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX211dGV4CiAgKgogICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBtZXRob2QgZXhlY3V0aW9uIHN0YXRlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTI3OCw4ICsyOTAsOSBAQAogCSAqIGVxdWFsIHRvIHRoZSBjdXJyZW50IHN5bmMgbGV2ZWwKIAkgKi8KIAlpZiAob2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPiB3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJIkNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10sIGluY29ycmVjdCBzeW5jX2xldmVsXG4iLAorCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTVVURVhfT1JERVIpOwogCX0KIApAQCAtMzEzLDExICszMjYsMTEgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzCiAgKgotICogUEFSQU1FVEVSUzogIG11dGV4X2xpc3QgICAgICAgICAgICAtIEhlYWQgb2YgdGhlIG11dGV4IGxpc3QKKyAqIFBBUkFNRVRFUlM6ICBUaHJlYWQgICAgICAgICAgLSBDdXJyZW50IGV4ZWN1dGluZyB0aHJlYWQgb2JqZWN0CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGFsbCBtdXRleGVzIGluIHRoZSBsaXN0CisgKiBERVNDUklQVElPTjogUmVsZWFzZSBhbGwgbXV0ZXhlcyBoZWxkIGJ5IHRoaXMgdGhyZWFkCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMKaW5kZXggNzkxMWM1My4uNjM5ZjBiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCkBAIC01MCwxMyArNTAsMTcgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleG5hbWVzIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCi0vKiBBTUwgUGFja2FnZSBMZW5ndGggZW5jb2RpbmdzICovCitzdGF0aWMgY2hhciAqCithY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9jb3VudCwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9uYW1lX3NlZ3MpOwogCi0jZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTEgICAweDQwCi0jZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTIgICAweDQwMDAKLSNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMyAgIDB4NDAwMDAwCi0jZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTQgICAweDQwMDAwMDAwCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfbmFtZV9zZWdtZW50ICgKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqaW5fYW1sX2FkZHJlc3MsCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9zdHJpbmcpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NCw3ICs2OCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZwogICoKICAqIFBBUkFNRVRFUlM6ICBwcmVmaXhfY291bnQgICAgICAgIC0gQ291bnQgb2YgcGFyZW50IGxldmVscy4gU3BlY2lhbCBjYXNlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xKSA9IHJvb3QsICAwID0gbm9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEpPT1yb290LCAgMD09bm9uZQogICogICAgICAgICAgICAgIG51bV9uYW1lX3NlZ3MgICAgICAgLSBjb3VudCBvZiA0LWNoYXJhY3RlciBuYW1lIHNlZ21lbnRzCiAgKgogICogUkVUVVJOOiAgICAgIEEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHN0cmluZyBzZWdtZW50LiAgVGhpcyBzZWdtZW50IG11c3QKQEAgLTc1LDcgKzc5LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1jaGFyICoKK3N0YXRpYyBjaGFyICoKIGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X2NvdW50LAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25hbWVfc2VncykKQEAgLTg4LDcgKzkyLDcgQEAKIAogCiAJLyoKLQkgKiBBbGxvdyByb29tIGZvciBhbGwgXCBhbmQgXiBwcmVmaXhlcywgYWxsIHNlZ21lbnRzLCBhbmQgYSBtdWx0aV9uYW1lX3ByZWZpeC4KKwkgKiBBbGxvdyByb29tIGZvciBhbGwgXCBhbmQgXiBwcmVmaXhlcywgYWxsIHNlZ21lbnRzIGFuZCBhIG11bHRpX25hbWVfcHJlZml4LgogCSAqIEFsc28sIG9uZSBieXRlIGZvciB0aGUgbnVsbCB0ZXJtaW5hdG9yLgogCSAqIFRoaXMgbWF5IGFjdHVhbGx5IGJlIHNvbWV3aGF0IGxvbmdlciB0aGFuIG5lZWRlZC4KIAkgKi8KQEAgLTEwNyw3ICsxMTEsOCBAQAogCSAqLwogCW5hbWVfc3RyaW5nID0gQUNQSV9NRU1fQUxMT0NBVEUgKHNpemVfbmVlZGVkKTsKIAlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImV4X2FsbG9jYXRlX25hbWVfc3RyaW5nOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlZFxuIiwgc2l6ZV9uZWVkZWQpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJleF9hbGxvY2F0ZV9uYW1lX3N0cmluZzogQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJWRcbiIsIHNpemVfbmVlZGVkKSk7CiAJCXJldHVybl9QVFIgKE5VTEwpOwogCX0KIApAQCAtMTUyLDE1ICsxNTcsMTcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9uYW1lX3NlZ21lbnQKICAqCi0gKiBQQVJBTUVURVJTOiAgaW50ZXJwcmV0ZXJfbW9kZSAgICAtIEN1cnJlbnQgcnVubmluZyBtb2RlIChsb2FkMS9Mb2FkMi9FeGVjKQorICogUEFSQU1FVEVSUzogIGluX2FtbF9hZGRyZXNzICAtIFBvaW50ZXIgdG8gdGhlIG5hbWUgaW4gdGhlIEFNTCBjb2RlCisgKiAgICAgICAgICAgICAgbmFtZV9zdHJpbmcgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSBuYW1lLiBUaGUgbmFtZSBpcyBhcHBlbmRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFueSBleGlzdGluZyBzdHJpbmcgdG8gZm9ybSBhIG5hbWVwYXRoCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIGEgbmFtZSBzZWdtZW50ICg0IGJ5dGVzKQorICogREVTQ1JJUFRJT046IEV4dHJhY3QgYW4gQUNQSSBuYW1lICg0IGJ5dGVzKSBmcm9tIHRoZSBBTUwgYnl0ZSBzdHJlYW0KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X25hbWVfc2VnbWVudCAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmluX2FtbF9hZGRyZXNzLAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfc3RyaW5nKQpAQCAtMjIzLDEwICsyMzAsMTMgQEAKIAkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwogCX0KIAllbHNlIHsKLQkJLyogU2VnbWVudCBzdGFydGVkIHdpdGggb25lIG9yIG1vcmUgdmFsaWQgY2hhcmFjdGVycywgYnV0IGZld2VyIHRoYW4gNCAqLwotCisJCS8qCisJCSAqIFNlZ21lbnQgc3RhcnRlZCB3aXRoIG9uZSBvciBtb3JlIHZhbGlkIGNoYXJhY3RlcnMsIGJ1dCBmZXdlciB0aGFuCisJCSAqIHRoZSByZXF1aXJlZCA0CisJCSAqLwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX05BTUU7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQmFkIGNoYXJhY3RlciAlMDJ4IGluIG5hbWUsIGF0ICVwXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJCYWQgY2hhcmFjdGVyICUwMnggaW4gbmFtZSwgYXQgJXBcbiIsCiAJCQkqYW1sX2FkZHJlc3MsIGFtbF9hZGRyZXNzKSk7CiAJfQogCkBAIC0yMzksMTEgKzI0OSwxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2dldF9uYW1lX3N0cmluZwogICoKLSAqIFBBUkFNRVRFUlM6ICBkYXRhX3R5cGUgICAgICAgICAgIC0gRGF0YSB0eXBlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWUKKyAqIFBBUkFNRVRFUlM6ICBkYXRhX3R5cGUgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZQorICogICAgICAgICAgICAgIGluX2FtbF9hZGRyZXNzICAgICAgLSBQb2ludGVyIHRvIHRoZSBuYW1lc3RyaW5nIGluIHRoZSBBTUwgY29kZQorICogICAgICAgICAgICAgIG91dF9uYW1lX3N0cmluZyAgICAgLSBXaGVyZSB0aGUgbmFtZXN0cmluZyBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIG91dF9uYW1lX2xlbmd0aCAgICAgLSBMZW5ndGggb2YgdGhlIHJldHVybmVkIHN0cmluZwogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBTdGF0dXMsIG5hbWVzdHJpbmcgYW5kIGxlbmd0aAogICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgYSBuYW1lLCBpbmNsdWRpbmcgYW55IHByZWZpeGVzLgorICogREVTQ1JJUFRJT046IEV4dHJhY3QgYSBmdWxsIG5hbWVwYXRoIGZyb20gdGhlIEFNTCBieXRlIHN0cmVhbSwKKyAqICAgICAgICAgICAgICBpbmNsdWRpbmcgYW55IHByZWZpeGVzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTI4Niw3ICszMDEsOCBAQAogCQlzd2l0Y2ggKCphbWxfYWRkcmVzcykgewogCQljYXNlIEFNTF9ST09UX1BSRUZJWDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgInJvb3RfcHJlZml4KFxcKSBhdCAlcFxuIiwgYW1sX2FkZHJlc3MpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJyb290X3ByZWZpeChcXCkgYXQgJXBcbiIsCisJCQkJYW1sX2FkZHJlc3MpKTsKIAogCQkJLyoKIAkJCSAqIFJlbWVtYmVyIHRoYXQgd2UgaGF2ZSBhIHJvb3RfcHJlZml4IC0tCkBAIC0zMDMsNyArMzE5LDggQEAKIAkJCS8qIEluY3JlbWVudCBwYXN0IHBvc3NpYmx5IG11bHRpcGxlIHBhcmVudCBwcmVmaXhlcyAqLwogCiAJCQlkbyB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgInBhcmVudF9wcmVmaXggKF4pIGF0ICVwXG4iLCBhbWxfYWRkcmVzcykpOworCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJwYXJlbnRfcHJlZml4ICheKSBhdCAlcFxuIiwKKwkJCQkJYW1sX2FkZHJlc3MpKTsKIAogCQkJCWFtbF9hZGRyZXNzKys7CiAJCQkJcHJlZml4X2NvdW50Kys7CkBAIC0zMjEsMTMgKzMzOCwxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCiAJCS8qIEV4YW1pbmUgZmlyc3QgY2hhcmFjdGVyIG9mIG5hbWUgZm9yIG5hbWUgc2VnbWVudCBwcmVmaXggb3BlcmF0b3IgKi8KIAogCQlzd2l0Y2ggKCphbWxfYWRkcmVzcykgewogCQljYXNlIEFNTF9EVUFMX05BTUVfUFJFRklYOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAiZHVhbF9uYW1lX3ByZWZpeCBhdCAlcFxuIiwgYW1sX2FkZHJlc3MpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJkdWFsX25hbWVfcHJlZml4IGF0ICVwXG4iLAorCQkJCWFtbF9hZGRyZXNzKSk7CiAKIAkJCWFtbF9hZGRyZXNzKys7CiAJCQluYW1lX3N0cmluZyA9IGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKHByZWZpeF9jb3VudCwgMik7CkBAIC0zNDksNyArMzY2LDggQEAKIAogCQljYXNlIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgIm11bHRpX25hbWVfcHJlZml4IGF0ICVwXG4iLCBhbWxfYWRkcmVzcykpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgIm11bHRpX25hbWVfcHJlZml4IGF0ICVwXG4iLAorCQkJCWFtbF9hZGRyZXNzKSk7CiAKIAkJCS8qIEZldGNoIGNvdW50IG9mIHNlZ21lbnRzIHJlbWFpbmluZyBpbiBuYW1lIHBhdGggKi8KIApAQCAtMzY4LDcgKzM4Niw4IEBACiAJCQloYXNfcHJlZml4ID0gVFJVRTsKIAogCQkJd2hpbGUgKG51bV9zZWdtZW50cyAmJgotCQkJCQkoc3RhdHVzID0gYWNwaV9leF9uYW1lX3NlZ21lbnQgKCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpKSA9PSBBRV9PSykgeworCQkJCQkoc3RhdHVzID0gYWNwaV9leF9uYW1lX3NlZ21lbnQgKCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpKSA9PQorCQkJCQkJQUVfT0spIHsKIAkJCQludW1fc2VnbWVudHMtLTsKIAkJCX0KIApAQCAtMzgwLDcgKzM5OSw4IEBACiAJCQkvKiBudWxsX25hbWUgdmFsaWQgYXMgb2YgOC0xMi05OCBBU0wvQU1MIEdyYW1tYXIgVXBkYXRlICovCiAKIAkJCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIm5hbWVfc2VnIGlzIFwiXFxcIiBmb2xsb3dlZCBieSBOVUxMXG4iKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCQkJIm5hbWVfc2VnIGlzIFwiXFxcIiBmb2xsb3dlZCBieSBOVUxMXG4iKSk7CiAJCQl9CiAKIAkJCS8qIENvbnN1bWUgdGhlIE5VTEwgYnl0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYwppbmRleCA4NDgyYWVmLi5kYmRmODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYwpAQCAtOTcsNyArOTcsOCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKIAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMEFfMFRfMVIiLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMEFfMFRfMVIiLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KQEAgLTE2MSw3ICsxNjIsOCBAQAogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzBUXzBSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzBUXzBSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCkBAIC0yMzYsNyArMjM4LDggQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMVRfMFIiLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMVRfMFIiLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KQEAgLTI4OSw3ICsyOTIsOCBAQAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgZGlnaXQ7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzFUXzFSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzFUXzFSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCkBAIC00MDksOCArNDEzLDEwIEBACiAJCQlmb3IgKGkgPSAwOyAoaSA8IGFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoKSAmJiAoZGlnaXQgPiAwKTsgaSsrKSB7CiAJCQkJKHZvaWQpIGFjcGlfdXRfc2hvcnRfZGl2aWRlIChkaWdpdCwgMTAsICZkaWdpdCwgJnRlbXAzMik7CiAKLQkJCQkvKiBJbnNlcnQgdGhlIEJDRCBkaWdpdCB0aGF0IHJlc2lkZXMgaW4gdGhlIHJlbWFpbmRlciBmcm9tIGFib3ZlICovCi0KKwkJCQkvKgorCQkJCSAqIEluc2VydCB0aGUgQkNEIGRpZ2l0IHRoYXQgcmVzaWRlcyBpbiB0aGUKKwkJCQkgKiByZW1haW5kZXIgZnJvbSBhYm92ZQorCQkJCSAqLwogCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlIHw9ICgoKGFjcGlfaW50ZWdlcikgdGVtcDMyKSA8PAogCQkJCQkJICAgQUNQSV9NVUxfNCAoaSkpOwogCQkJfQpAQCAtNDQ1LDcgKzQ1MSw4IEBACiAKIAkJCS8qIEdldCB0aGUgb2JqZWN0IHJlZmVyZW5jZSwgc3RvcmUgaXQsIGFuZCByZW1vdmUgb3VyIHJlZmVyZW5jZSAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlIChvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MyLCB3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKG9wZXJhbmRbMF0sCisJCQkJCSAmcmV0dXJuX2Rlc2MyLCB3YWxrX3N0YXRlKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CkBAIC00ODIsMTAgKzQ4OSwxMCBAQAogCiAJCWlmICghd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewogCQkJLyoKLQkJCSAqIE5vcm1hbGx5LCB3ZSB3b3VsZCByZW1vdmUgYSByZWZlcmVuY2Ugb24gdGhlIE9wZXJhbmRbMF0gcGFyYW1ldGVyOwotCQkJICogQnV0IHNpbmNlIGl0IGlzIGJlaW5nIHVzZWQgYXMgdGhlIGludGVybmFsIHJldHVybiBvYmplY3QKLQkJCSAqIChtZWFuaW5nIHdlIHdvdWxkIG5vcm1hbGx5IGluY3JlbWVudCBpdCksIHRoZSB0d28gY2FuY2VsIG91dCwKLQkJCSAqIGFuZCB3ZSBzaW1wbHkgZG9uJ3QgZG8gYW55dGhpbmcuCisJCQkgKiBOb3JtYWxseSwgd2Ugd291bGQgcmVtb3ZlIGEgcmVmZXJlbmNlIG9uIHRoZSBPcGVyYW5kWzBdCisJCQkgKiBwYXJhbWV0ZXI7IEJ1dCBzaW5jZSBpdCBpcyBiZWluZyB1c2VkIGFzIHRoZSBpbnRlcm5hbCByZXR1cm4KKwkJCSAqIG9iamVjdCAobWVhbmluZyB3ZSB3b3VsZCBub3JtYWxseSBpbmNyZW1lbnQgaXQpLCB0aGUgdHdvCisJCQkgKiBjYW5jZWwgb3V0LCBhbmQgd2Ugc2ltcGx5IGRvbid0IGRvIGFueXRoaW5nLgogCQkJICovCiAJCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gb3BlcmFuZFswXTsKIAkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsgLyogUHJldmVudCBkZWxldGlvbiAqLwpAQCAtNTQ5LDkgKzU1Niw4IEBACiAJY2FzZSBBTUxfU0hJRlRfTEVGVF9CSVRfT1A6ICAgICAvKiBzaGlmdF9sZWZ0X2JpdCAoU291cmNlLCBiaXRfbnVtKSAqLwogCWNhc2UgQU1MX1NISUZUX1JJR0hUX0JJVF9PUDogICAgLyogc2hpZnRfcmlnaHRfYml0IChTb3VyY2UsIGJpdF9udW0pICovCiAKLQkJLyoKLQkJICogVGhlc2UgYXJlIHR3byBvYnNvbGV0ZSBvcGNvZGVzCi0JCSAqLworCQkvKiBUaGVzZSBhcmUgdHdvIG9ic29sZXRlIG9wY29kZXMgKi8KKwogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCSIlcyBpcyBvYnNvbGV0ZSBhbmQgbm90IGltcGxlbWVudGVkXG4iLAogCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpKTsKQEAgLTU2OCw5ICs1NzQsOCBAQAogCX0KIAogCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJLyoKLQkJICogU3RvcmUgdGhlIHJldHVybiB2YWx1ZSBjb21wdXRlZCBhYm92ZSBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0Ci0JCSAqLworCQkvKiBTdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGNvbXB1dGVkIGFib3ZlIGludG8gdGhlIHRhcmdldCBvYmplY3QgKi8KKwogCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYywgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7CiAJfQogCkBAIC02MTUsNyArNjIwLDggQEAKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8wVF8xUiIsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8wVF8xUiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCiAJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwpAQCAtNzA2LDkgKzcxMiw5IEBACiAKIAkJLyoKIAkJICogTm90ZTogVGhlIG9wZXJhbmQgaXMgbm90IHJlc29sdmVkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZSB3YW50IHRvCi0JCSAqIGdldCB0aGUgYXNzb2NpYXRlZCBvYmplY3QsIG5vdCBpdHMgdmFsdWUuICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgd2FudAotCQkgKiB0byByZXNvbHZlIGEgZmllbGRfdW5pdCB0byBpdHMgdmFsdWUsIHdlIHdhbnQgdGhlIGFjdHVhbCBmaWVsZF91bml0Ci0JCSAqIG9iamVjdC4KKwkJICogZ2V0IHRoZSBhc3NvY2lhdGVkIG9iamVjdCwgbm90IGl0cyB2YWx1ZS4gIEZvciBleGFtcGxlLCB3ZSBkb24ndAorCQkgKiB3YW50IHRvIHJlc29sdmUgYSBmaWVsZF91bml0IHRvIGl0cyB2YWx1ZSwgd2Ugd2FudCB0aGUgYWN0dWFsCisJCSAqIGZpZWxkX3VuaXQgb2JqZWN0LgogCQkgKi8KIAogCQkvKiBHZXQgdGhlIHR5cGUgb2YgdGhlIGJhc2Ugb2JqZWN0ICovCkBAIC03MzgsNyArNzQ0LDggQEAKIAogCQkvKiBHZXQgdGhlIGJhc2Ugb2JqZWN0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX211bHRpcGxlICh3YWxrX3N0YXRlLCBvcGVyYW5kWzBdLCAmdHlwZSwgJnRlbXBfZGVzYyk7CisJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSAod2Fsa19zdGF0ZSwKKwkJCQkgb3BlcmFuZFswXSwgJnR5cGUsICZ0ZW1wX2Rlc2MpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTgxOCw4ICs4MjUsMTAgQEAKIAogCQkJCQkvKiBTZXQgT3BlcmFuZFswXSB0byB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsL2FyZyAqLwogCi0JCQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlIChvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlLAotCQkJCQkJCSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2Zmc2V0LCB3YWxrX3N0YXRlLCAmdGVtcF9kZXNjKTsKKwkJCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKAorCQkJCQkJCSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlLAorCQkJCQkJCSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2Zmc2V0LAorCQkJCQkJCSB3YWxrX3N0YXRlLCAmdGVtcF9kZXNjKTsKIAkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQkJZ290byBjbGVhbnVwOwogCQkJCQl9CkBAIC04NTIsMjEgKzg2MSwyNiBAQAogCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCQkJLyoKLQkJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKFN0cmluZykuIFRoZSBzdHJpbmcgaXMgYSByZWZlcmVuY2UgdG8gYSBuYW1lZCBBQ1BJIG9iamVjdC4KKwkJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKFN0cmluZykuIFRoZSBzdHJpbmcgaXMgYSByZWZlcmVuY2UKKwkJCQkgKiB0byBhIG5hbWVkIEFDUEkgb2JqZWN0LgogCQkJCSAqCiAJCQkJICogMSkgRmluZCB0aGUgb3duaW5nIE5vZGUKLQkJCQkgKiAyKSBEZXJlZmVyZW5jZSB0aGUgbm9kZSB0byBhbiBhY3R1YWwgb2JqZWN0LiAgQ291bGQgYmUgYSBGaWVsZCwgc28gd2UgbmVlCi0JCQkJICogICAgdG8gcmVzb2x2ZSB0aGUgbm9kZSB0byBhIHZhbHVlLgorCQkJCSAqIDIpIERlcmVmZXJlbmNlIHRoZSBub2RlIHRvIGFuIGFjdHVhbCBvYmplY3QuICBDb3VsZCBiZSBhCisJCQkJICogICAgRmllbGQsIHNvIHdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgbm9kZSB0byBhIHZhbHVlLgogCQkJCSAqLwogCQkJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJCQkgIHdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPnNjb3BlLm5vZGUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKLQkJCQkJCSAgQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsICZyZXR1cm5fZGVzYykpOworCQkJCQkJIHdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPnNjb3BlLm5vZGUsCisJCQkJCQkgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkJIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKAorCQkJCQkJCQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSk7CiAJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQlnb3RvIGNsZWFudXA7CiAJCQkJfQogCiAJCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgKAotCQkJCQkJICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSwgd2Fsa19zdGF0ZSk7CisJCQkJCQkgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKAorCQkJCQkJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsICZyZXR1cm5fZGVzYyksCisJCQkJCQkJCXdhbGtfc3RhdGUpOwogCQkJCWdvdG8gY2xlYW51cDsKIAogCkBAIC04ODMsMTQgKzg5NywxNiBAQAogCQkJLyoKIAkJCSAqIFRoaXMgaXMgYSBkZXJlZl9vZiAob2JqZWN0X3JlZmVyZW5jZSkKIAkJCSAqIEdldCB0aGUgYWN0dWFsIG9iamVjdCBmcm9tIHRoZSBOb2RlIChUaGlzIGlzIHRoZSBkZXJlZmVyZW5jZSkuCi0JCQkgKiAtLSBUaGlzIGNhc2UgbWF5IG9ubHkgaGFwcGVuIHdoZW4gYSBsb2NhbF94IG9yIGFyZ194IGlzIGRlcmVmZXJlbmNlZCBhYm92ZS4KKwkJCSAqIFRoaXMgY2FzZSBtYXkgb25seSBoYXBwZW4gd2hlbiBhIGxvY2FsX3ggb3IgYXJnX3ggaXMKKwkJCSAqIGRlcmVmZXJlbmNlZCBhYm92ZS4KIAkJCSAqLwotCQkJcmV0dXJuX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvcGVyYW5kWzBdKTsKKwkJCXJldHVybl9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKKwkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb3BlcmFuZFswXSk7CiAJCX0KIAkJZWxzZSB7CiAJCQkvKgotCQkJICogVGhpcyBtdXN0IGJlIGEgcmVmZXJlbmNlIG9iamVjdCBwcm9kdWNlZCBieSBlaXRoZXIgdGhlIEluZGV4KCkgb3IKLQkJCSAqIHJlZl9vZigpIG9wZXJhdG9yCisJCQkgKiBUaGlzIG11c3QgYmUgYSByZWZlcmVuY2Ugb2JqZWN0IHByb2R1Y2VkIGJ5IGVpdGhlciB0aGUKKwkJCSAqIEluZGV4KCkgb3IgcmVmX29mKCkgb3BlcmF0b3IKIAkJCSAqLwogCQkJc3dpdGNoIChvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlKSB7CiAJCQljYXNlIEFNTF9JTkRFWF9PUDoKQEAgLTkzMSw4ICs5NDcsOCBAQAogCQkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKIAkJCQkJLyoKLQkJCQkJICogUmV0dXJuIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UuICBXZSBtdXN0IGFkZAotCQkJCQkgKiBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QsIGhvd2V2ZXIuCisJCQkJCSAqIFJldHVybiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IG9mIHRoZSBwYWNrYWdlLiAgV2UgbXVzdAorCQkJCQkgKiBhZGQgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LCBob3dldmVyLgogCQkJCQkgKi8KIAkJCQkJcmV0dXJuX2Rlc2MgPSAqKG9wZXJhbmRbMF0tPnJlZmVyZW5jZS53aGVyZSk7CiAJCQkJCWlmICghcmV0dXJuX2Rlc2MpIHsKQEAgLTk2Nyw5ICs5ODMsMTEgQEAKIAogCQkJCXJldHVybl9kZXNjID0gb3BlcmFuZFswXS0+cmVmZXJlbmNlLm9iamVjdDsKIAotCQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHJldHVybl9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHJldHVybl9kZXNjKSA9PQorCQkJCQkJQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAotCQkJCQlyZXR1cm5fZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHJldHVybl9kZXNjKTsKKwkJCQkJcmV0dXJuX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAorCQkJCQkJCSAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHJldHVybl9kZXNjKTsKIAkJCQl9CiAKIAkJCQkvKiBBZGQgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKaW5kZXggOGJlNGQ4MC4uNzQyOTAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAJCXZhbHVlID0gKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKIAotCQkvKiBOb3RpZmllcyBhbGxvd2VkIG9uIHRoaXMgb2JqZWN0PyAqLworCQkvKiBBcmUgbm90aWZpZXMgYWxsb3dlZCBvbiB0aGlzIG9iamVjdD8gKi8KIAogCQlpZiAoIWFjcGlfZXZfaXNfbm90aWZ5X29iamVjdCAobm9kZSkpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLApAQCAtMjAzLDExICsyMDMsMTIgQEAKIAkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG9wY29kZQotCSAqLworCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLworCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9ESVZJREVfT1A6ICAgICAgICAgICAgIC8qIERpdmlkZSAoRGl2aWRlbmQsIERpdmlzb3IsIHJlbWFpbmRlcl9yZXN1bHQgcXVvdGllbnRfcmVzdWx0KSAqLworCWNhc2UgQU1MX0RJVklERV9PUDoKKworCQkvKiBEaXZpZGUgKERpdmlkZW5kLCBEaXZpc29yLCByZW1haW5kZXJfcmVzdWx0IHF1b3RpZW50X3Jlc3VsdCkgKi8KIAogCQlyZXR1cm5fZGVzYzEgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYzEpIHsKQEAgLTI0MSw3ICsyNDIsNiBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0KIAkvKiBTdG9yZSB0aGUgcmVzdWx0cyB0byB0aGUgdGFyZ2V0IHJlZmVyZW5jZSBvcGVyYW5kcyAqLwogCiAJc3RhdHVzID0gYWNwaV9leF9zdG9yZSAocmV0dXJuX2Rlc2MyLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKQEAgLTI5NSw3ICsyOTUsNyBAQAogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5kZXg7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKIApAQCAtMzA0LDkgKzMwNCw4IEBACiAJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBvcGNvZGUKLQkgKi8KKwkvKiBFeGVjdXRlIHRoZSBvcGNvZGUgKi8KKwogCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9NQVRIKSB7CiAJCS8qIEFsbCBzaW1wbGUgbWF0aCBvcGNvZGVzIChhZGQsIGV0Yy4pICovCiAKQEAgLTMyMiw5ICszMjEsOCBAQAogCQlnb3RvIHN0b3JlX3Jlc3VsdF90b190YXJnZXQ7CiAJfQogCi0KIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX01PRF9PUDogICAgICAgICAgICAgICAgLyogTW9kIChEaXZpZGVuZCwgRGl2aXNvciwgcmVtYWluZGVyX3Jlc3VsdCAoQUNQSSAyLjApICovCisJY2FzZSBBTUxfTU9EX09QOiAvKiBNb2QgKERpdmlkZW5kLCBEaXZpc29yLCByZW1haW5kZXJfcmVzdWx0IChBQ1BJIDIuMCkgKi8KIAogCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CkBAIC0zNDEsMTggKzMzOSwxOSBAQAogCQlicmVhazsKIAogCi0JY2FzZSBBTUxfQ09OQ0FUX09QOiAgICAgICAgICAgICAvKiBDb25jYXRlbmF0ZSAoRGF0YTEsIERhdGEyLCBSZXN1bHQpICovCisJY2FzZSBBTUxfQ09OQ0FUX09QOiAvKiBDb25jYXRlbmF0ZSAoRGF0YTEsIERhdGEyLCBSZXN1bHQpICovCiAKIAkJc3RhdHVzID0gYWNwaV9leF9kb19jb25jYXRlbmF0ZSAob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKIAkJCQkgJnJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKIAkJYnJlYWs7CiAKIAotCWNhc2UgQU1MX1RPX1NUUklOR19PUDogICAgICAgICAgLyogdG9fc3RyaW5nIChCdWZmZXIsIExlbmd0aCwgUmVzdWx0KSAoQUNQSSAyLjApICovCisJY2FzZSBBTUxfVE9fU1RSSU5HX09QOiAvKiB0b19zdHJpbmcgKEJ1ZmZlciwgTGVuZ3RoLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KIAogCQkvKgogCQkgKiBJbnB1dCBvYmplY3QgaXMgZ3VhcmFudGVlZCB0byBiZSBhIGJ1ZmZlciBhdCB0aGlzIHBvaW50IChpdCBtYXkgaGF2ZQotCQkgKiBiZWVuIGNvbnZlcnRlZC4pICBDb3B5IHRoZSByYXcgYnVmZmVyIGRhdGEgdG8gYSBuZXcgb2JqZWN0IG9mIHR5cGUgU3RyaW5nLgorCQkgKiBiZWVuIGNvbnZlcnRlZC4pICBDb3B5IHRoZSByYXcgYnVmZmVyIGRhdGEgdG8gYSBuZXcgb2JqZWN0IG9mCisJCSAqIHR5cGUgU3RyaW5nLgogCQkgKi8KIAogCQkvKgpAQCAtMzgzLDE0ICszODIsMTYgQEAKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCS8qIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB3aXRoIG5vIHRyYW5zZm9ybS4gTlVMTCB0ZXJtaW5hdGVkIGFscmVhZHkuICovCisJCS8qIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB3aXRoIG5vIHRyYW5zZm9ybS4gTlVMTCB0ZXJtaW5hdGVkIGFscmVhZHkqLwogCiAJCUFDUElfTUVNQ1BZIChyZXR1cm5fZGVzYy0+c3RyaW5nLnBvaW50ZXIsCiAJCQlvcGVyYW5kWzBdLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoKTsKIAkJYnJlYWs7CiAKIAotCWNhc2UgQU1MX0NPTkNBVF9SRVNfT1A6ICAgICAgICAgLyogY29uY2F0ZW5hdGVfcmVzX3RlbXBsYXRlIChCdWZmZXIsIEJ1ZmZlciwgUmVzdWx0KSAoQUNQSSAyLjApICovCisJY2FzZSBBTUxfQ09OQ0FUX1JFU19PUDoKKworCQkvKiBjb25jYXRlbmF0ZV9yZXNfdGVtcGxhdGUgKEJ1ZmZlciwgQnVmZmVyLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSAob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKIAkJCQkgJnJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKQEAgLTQwNywzMyArNDA4LDMzIEBACiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQlpbmRleCA9ICh1MzIpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CisJCWluZGV4ID0gb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKIAotCQkvKgotCQkgKiBBdCB0aGlzIHBvaW50LCB0aGUgU291cmNlIG9wZXJhbmQgaXMgYSBQYWNrYWdlLCBCdWZmZXIsIG9yIFN0cmluZwotCQkgKi8KKwkJLyogQXQgdGhpcyBwb2ludCwgdGhlIFNvdXJjZSBvcGVyYW5kIGlzIGEgUGFja2FnZSwgQnVmZmVyLCBvciBTdHJpbmcgKi8KKwogCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9wZXJhbmRbMF0pID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCQkvKiBPYmplY3QgdG8gYmUgaW5kZXhlZCBpcyBhIFBhY2thZ2UgKi8KIAogCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkluZGV4IHZhbHVlICglWCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsCi0JCQkJCWluZGV4LCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CisJCQkJCSJJbmRleCB2YWx1ZSAoJVglOC44WCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsCisJCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoaW5kZXgpLCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX1BBQ0tBR0VfTElNSVQ7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQogCiAJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlID0gQUNQSV9UWVBFX1BBQ0tBR0U7CiAJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9iamVjdCAgICA9IG9wZXJhbmRbMF07Ci0JCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLndoZXJlICAgICA9ICZvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzIFtpbmRleF07CisJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLndoZXJlICAgICA9ICZvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzIFsKKwkJCQkJICBpbmRleF07CiAJCX0KIAkJZWxzZSB7CiAJCQkvKiBPYmplY3QgdG8gYmUgaW5kZXhlZCBpcyBhIEJ1ZmZlci9TdHJpbmcgKi8KIAogCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkluZGV4IHZhbHVlICglWCkgYmV5b25kIGVuZCBvZiBidWZmZXIgKCVYKVxuIiwKLQkJCQkJaW5kZXgsIG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpKTsKKwkJCQkJIkluZGV4IHZhbHVlICglWCU4LjhYKSBiZXlvbmQgZW5kIG9mIGJ1ZmZlciAoJVgpXG4iLAorCQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGluZGV4KSwgb3BlcmFuZFswXS0+YnVmZmVyLmxlbmd0aCkpOwogCQkJCXN0YXR1cyA9IEFFX0FNTF9CVUZGRVJfTElNSVQ7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQpAQCAtNDUxLDcgKzQ1Miw3IEBACiAJCS8qIENvbXBsZXRlIHRoZSBJbmRleCByZWZlcmVuY2Ugb2JqZWN0ICovCiAKIAkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgICAgPSBBTUxfSU5ERVhfT1A7Ci0JCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0ICAgID0gaW5kZXg7CisJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0ICAgID0gKHUzMikgaW5kZXg7CiAKIAkJLyogU3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgVGFyZ2V0ICovCiAKQEAgLTUzNiwyMiArNTM3LDI0IEBACiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIE9wY29kZQotCSAqLwotCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9MT0dJQ0FMX05VTUVSSUMpIC8qIGxvZ2ljYWxfb3AgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8geworCS8qIEV4ZWN1dGUgdGhlIE9wY29kZSAqLworCisJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUxfTlVNRVJJQykgeworCQkvKiBsb2dpY2FsX29wIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisKIAkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AgKHdhbGtfc3RhdGUtPm9wY29kZSwKIAkJCQkgIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCiAJCQkJICAmbG9naWNhbF9yZXN1bHQpOwogCQlnb3RvIHN0b3JlX2xvZ2ljYWxfcmVzdWx0OwogCX0KLQllbHNlIGlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9MT0dJQ0FMKSAgLyogbG9naWNhbF9vcCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLyB7CisJZWxzZSBpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTE9HSUNBTCkgeworCQkvKiBsb2dpY2FsX29wIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisKIAkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX29wICh3YWxrX3N0YXRlLT5vcGNvZGUsIG9wZXJhbmRbMF0sCiAJCQkJIG9wZXJhbmRbMV0sICZsb2dpY2FsX3Jlc3VsdCk7CiAJCWdvdG8gc3RvcmVfbG9naWNhbF9yZXN1bHQ7CiAJfQogCi0KIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewogCWNhc2UgQU1MX0FDUVVJUkVfT1A6ICAgICAgICAgICAgLyogQWNxdWlyZSAobXV0ZXhfb2JqZWN0LCBUaW1lb3V0KSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCmluZGV4IDI5ZDBiMTYuLjIzYjA2OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCkBAIC05NywxMSArOTcsMTIgQEAKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8wVF8wUiIsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8wVF8wUiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9GQVRBTF9PUDogICAgICAgICAgLyogRmF0YWwgKGZhdGFsX3R5cGUgZmF0YWxfY29kZSBmYXRhbF9hcmcpICAgKi8KKwljYXNlIEFNTF9GQVRBTF9PUDogICAgICAgICAgLyogRmF0YWwgKGZhdGFsX3R5cGUgZmF0YWxfY29kZSBmYXRhbF9hcmcpICovCiAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKIAkJCSJmYXRhbF9vcDogVHlwZSAlWCBDb2RlICVYIEFyZyAlWCA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8XG4iLApAQCAtMTE2LDkgKzExNyw4IEBACiAJCQlmYXRhbC0+YXJndW1lbnQgPSAodTMyKSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOwogCQl9CiAKLQkJLyoKLQkJICogQWx3YXlzIHNpZ25hbCB0aGUgT1MhCi0JCSAqLworCQkvKiBBbHdheXMgc2lnbmFsIHRoZSBPUyEgKi8KKwogCQlzdGF0dXMgPSBhY3BpX29zX3NpZ25hbCAoQUNQSV9TSUdOQUxfRkFUQUwsIGZhdGFsKTsKIAogCQkvKiBNaWdodCByZXR1cm4gd2hpbGUgT1MgaXMgc2h1dHRpbmcgZG93biwganVzdCBjb250aW51ZSAqLwpAQCAtMTYyLDIxICsxNjIsMjMgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYyA9IE5VTEw7CiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpbmRleDsKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluZGV4OwogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8xVF8xUiIsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8xVF8xUiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9NSURfT1A6ICAgICAgICAvKiBNaWQgIChTb3VyY2VbMF0sIEluZGV4WzFdLCBMZW5ndGhbMl0sIFJlc3VsdFszXSkgKi8KKwljYXNlIEFNTF9NSURfT1A6ICAgIC8qIE1pZCAoU291cmNlWzBdLCBJbmRleFsxXSwgTGVuZ3RoWzJdLCBSZXN1bHRbM10pICovCiAKIAkJLyoKIAkJICogQ3JlYXRlIHRoZSByZXR1cm4gb2JqZWN0LiAgVGhlIFNvdXJjZSBvcGVyYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUKIAkJICogZWl0aGVyIGEgU3RyaW5nIG9yIGEgQnVmZmVyLCBzbyBqdXN0IHVzZSBpdHMgdHlwZS4KIAkJICovCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZFswXSkpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoCisJCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZFswXSkpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0xODQsNyArMTg2LDcgQEAKIAogCQkvKiBHZXQgdGhlIEludGVnZXIgdmFsdWVzIGZyb20gdGhlIG9iamVjdHMgKi8KIAotCQlpbmRleCA9IChhY3BpX25hdGl2ZV91aW50KSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCQlpbmRleCA9IG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CiAJCWxlbmd0aCA9IChhY3BpX3NpemUpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7CiAKIAkJLyoKQEAgLTE5Nyw3ICsxOTksOCBAQAogCiAJCQlpZiAoKGluZGV4ICsgbGVuZ3RoKSA+CiAJCQkJb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCkgewotCQkJCWxlbmd0aCA9IChhY3BpX3NpemUpIG9wZXJhbmRbMF0tPnN0cmluZy5sZW5ndGggLSBpbmRleDsKKwkJCQlsZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoIC0KKwkJCQkJCSAoYWNwaV9zaXplKSBpbmRleDsKIAkJCX0KIAogCQkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgU3RyaW5nL0J1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3Bhcmc2LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYwppbmRleCBkMzI2MjQzLi4xN2Y4MWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYwpAQCAtNzUsNiArNzUsMTQgQEAKICAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgogISovCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHU4CithY3BpX2V4X2RvX21hdGNoICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX29wLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm1hdGNoX29iaik7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05Miw3ICsxMDAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4CitzdGF0aWMgdTgKIGFjcGlfZXhfZG9fbWF0Y2ggKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfb3AsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFja2FnZV9vYmosCkBAIC0yMTYsMTEgKzIyNCwxMiBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbmRleDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aGlzX2VsZW1lbnQ7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzZBXzBUXzFSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzZBXzBUXzFSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewpAQCAtMjQxLDkgKzI1MCwxMSBAQAogCiAJCS8qIEdldCB0aGUgcGFja2FnZSBzdGFydF9pbmRleCwgdmFsaWRhdGUgYWdhaW5zdCB0aGUgcGFja2FnZSBsZW5ndGggKi8KIAotCQlpbmRleCA9ICh1MzIpIG9wZXJhbmRbNV0tPmludGVnZXIudmFsdWU7Ci0JCWlmIChpbmRleCA+PSAodTMyKSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkluZGV4IGJleW9uZCBwYWNrYWdlIGVuZFxuIikpOworCQlpbmRleCA9IG9wZXJhbmRbNV0tPmludGVnZXIudmFsdWU7CisJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiSW5kZXggKCVYJTguOFgpIGJleW9uZCBwYWNrYWdlIGVuZCAoJVgpXG4iLAorCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoaW5kZXgpLCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQpAQCAtMzE0LDEzICszMjUsMTIgQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfM0FfMFRfMFI6IFVua25vd24gb3Bjb2RlICVYXG4iLAorCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV82QV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCiAJCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0KIAl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCmluZGV4IDI2NGVmM2IuLmM5ZTNjNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKQEAgLTUyLDggKzUyLDIzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhwcmVwIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTMyCithY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3MgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmxhZ3MsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0dXJuX2J5dGVfYWxpZ25tZW50KTsKKwogCiAjaWZkZWYgQUNQSV9VTkRFUl9ERVZFTE9QTUVOVAorCitzdGF0aWMgdTMyCithY3BpX2V4X2dlbmVyYXRlX2FjY2VzcyAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaXRfb2Zmc2V0LAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYml0X2xlbmd0aCwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9sZW5ndGgpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2dlbmVyYXRlX2FjY2VzcwpAQCAtOTksMTIgKzExNCwxNCBAQAogCS8qIFJvdW5kIEZpZWxkIHN0YXJ0IG9mZnNldCBhbmQgbGVuZ3RoIHRvICJtaW5pbWFsIiBieXRlIGJvdW5kYXJpZXMgKi8KIAogCWZpZWxkX2J5dGVfb2Zmc2V0ICA9IEFDUElfRElWXzggKEFDUElfUk9VTkRfRE9XTiAoZmllbGRfYml0X29mZnNldCwgOCkpOwotCWZpZWxkX2J5dGVfZW5kX29mZnNldCA9IEFDUElfRElWXzggKEFDUElfUk9VTkRfVVAgKGZpZWxkX2JpdF9sZW5ndGggKyBmaWVsZF9iaXRfb2Zmc2V0LCA4KSk7CisJZmllbGRfYnl0ZV9lbmRfb2Zmc2V0ID0gQUNQSV9ESVZfOCAoQUNQSV9ST1VORF9VUCAoZmllbGRfYml0X2xlbmd0aCArCisJCQkgICBmaWVsZF9iaXRfb2Zmc2V0LCA4KSk7CiAJZmllbGRfYnl0ZV9sZW5ndGggID0gZmllbGRfYnl0ZV9lbmRfb2Zmc2V0IC0gZmllbGRfYnl0ZV9vZmZzZXQ7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkiQml0IGxlbmd0aCAlZCwgQml0IG9mZnNldCAlZFxuIiwKIAkJCWZpZWxkX2JpdF9sZW5ndGgsIGZpZWxkX2JpdF9vZmZzZXQpKTsKKwogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKIAkJCSJCeXRlIExlbmd0aCAlZCwgQnl0ZSBPZmZzZXQgJWQsIEVuZCBPZmZzZXQgJWRcbiIsCiAJCQlmaWVsZF9ieXRlX2xlbmd0aCwgZmllbGRfYnl0ZV9vZmZzZXQsIGZpZWxkX2J5dGVfZW5kX29mZnNldCkpOwpAQCAtMTE3LDIwICsxMzQsMjYgQEAKIAkgKi8KIAlmb3IgKGFjY2Vzc19ieXRlX3dpZHRoID0gMTsgYWNjZXNzX2J5dGVfd2lkdGggPD0gODsgYWNjZXNzX2J5dGVfd2lkdGggPDw9IDEpIHsKIAkJLyoKLQkJICogMSkgUm91bmQgZW5kIG9mZnNldCB1cCB0byBuZXh0IGFjY2VzcyBib3VuZGFyeSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhpcwotCQkgKiAgICBkb2VzIG5vdCBnbyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IHJlZ2lvbi4KLQkJICogMikgV2hlbiB0aGUgQWNjZXNzIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZmllbGRfYnl0ZV9sZW5ndGgsIHdlIGFyZSBkb25lLgotCQkgKiAgICAoVGhpcyBkb2VzIG5vdCBvcHRpbWl6ZSBmb3IgdGhlIHBlcmZlY3RseSBhbGlnbmVkIGNhc2UgeWV0KS4KKwkJICogMSkgUm91bmQgZW5kIG9mZnNldCB1cCB0byBuZXh0IGFjY2VzcyBib3VuZGFyeSBhbmQgbWFrZSBzdXJlIHRoYXQKKwkJICogICAgdGhpcyBkb2VzIG5vdCBnbyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IHJlZ2lvbi4KKwkJICogMikgV2hlbiB0aGUgQWNjZXNzIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZmllbGRfYnl0ZV9sZW5ndGgsIHdlCisJCSAqICAgIGFyZSBkb25lLiAoVGhpcyBkb2VzIG5vdCBvcHRpbWl6ZSBmb3IgdGhlIHBlcmZlY3RseSBhbGlnbmVkCisJCSAqICAgIGNhc2UgeWV0KS4KIAkJICovCiAJCWlmIChBQ1BJX1JPVU5EX1VQIChmaWVsZF9ieXRlX2VuZF9vZmZzZXQsIGFjY2Vzc19ieXRlX3dpZHRoKSA8PSByZWdpb25fbGVuZ3RoKSB7Ci0JCQlmaWVsZF9zdGFydF9vZmZzZXQgPSBBQ1BJX1JPVU5EX0RPV04gKGZpZWxkX2J5dGVfb2Zmc2V0LCBhY2Nlc3NfYnl0ZV93aWR0aCkgLwotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoOwotCQkJZmllbGRfZW5kX29mZnNldCA9IEFDUElfUk9VTkRfVVAgICAoKGZpZWxkX2J5dGVfbGVuZ3RoICsgZmllbGRfYnl0ZV9vZmZzZXQpLAotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSAvIGFjY2Vzc19ieXRlX3dpZHRoOwotCQkJYWNjZXNzZXMgICAgICAgICA9IGZpZWxkX2VuZF9vZmZzZXQgLSBmaWVsZF9zdGFydF9vZmZzZXQ7CisJCQlmaWVsZF9zdGFydF9vZmZzZXQgPQorCQkJCUFDUElfUk9VTkRfRE9XTiAoZmllbGRfYnl0ZV9vZmZzZXQsIGFjY2Vzc19ieXRlX3dpZHRoKSAvCisJCQkJYWNjZXNzX2J5dGVfd2lkdGg7CisKKwkJCWZpZWxkX2VuZF9vZmZzZXQgPQorCQkJCUFDUElfUk9VTkRfVVAgKChmaWVsZF9ieXRlX2xlbmd0aCArIGZpZWxkX2J5dGVfb2Zmc2V0KSwKKwkJCQkJYWNjZXNzX2J5dGVfd2lkdGgpIC8gYWNjZXNzX2J5dGVfd2lkdGg7CisKKwkJCWFjY2Vzc2VzID0gZmllbGRfZW5kX29mZnNldCAtIGZpZWxkX3N0YXJ0X29mZnNldDsKIAogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAogCQkJCQkiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyB3aXRoaW4gcmVnaW9uXG4iLCBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkJCSJGaWVsZCBTdGFydCAlZCwgRmllbGQgRW5kICVkIC0tIHJlcXVpcmVzICVkIGFjY2Vzc2VzXG4iLAogCQkJCQlmaWVsZF9zdGFydF9vZmZzZXQsIGZpZWxkX2VuZF9vZmZzZXQsIGFjY2Vzc2VzKSk7CkBAIC0xMzksOCArMTYyLDggQEAKIAogCQkJaWYgKGFjY2Vzc2VzIDw9IDEpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJCQkiRW50aXJlIGZpZWxkIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIG9uZSBvcGVyYXRpb24gb2Ygc2l6ZSAlZFxuIiwKLQkJCQkJCWFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQkJCSJFbnRpcmUgZmllbGQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggb25lIG9wZXJhdGlvbiBvZiBzaXplICVkXG4iLAorCQkJCQlhY2Nlc3NfYnl0ZV93aWR0aCkpOwogCQkJCXJldHVybl9WQUxVRSAoYWNjZXNzX2J5dGVfd2lkdGgpOwogCQkJfQogCkBAIC0xNTUsMTUgKzE3OCwyMCBAQAogCQl9CiAJCWVsc2UgewogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCQkiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyBOT1Qgd2l0aGluIHJlZ2lvblxuIiwgYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJCQkiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyBOT1Qgd2l0aGluIHJlZ2lvblxuIiwgYWNjZXNzX2J5dGVfd2lkdGgpKTsKIAkJCWlmIChhY2Nlc3NfYnl0ZV93aWR0aCA9PSAxKSB7CiAJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAogCQkJCQkJIkZpZWxkIGdvZXMgYmV5b25kIGVuZC1vZi1yZWdpb24hXG4iKSk7Ci0JCQkJcmV0dXJuX1ZBTFVFICgwKTsgICAgIC8qIEZpZWxkIGRvZXMgbm90IGZpdCBpbiB0aGUgcmVnaW9uIGF0IGFsbCAqLworCisJCQkJLyogRmllbGQgZG9lcyBub3QgZml0IGluIHRoZSByZWdpb24gYXQgYWxsICovCisKKwkJCQlyZXR1cm5fVkFMVUUgKDApOwogCQkJfQogCi0JCQkvKiBUaGlzIHdpZHRoIGdvZXMgYmV5b25kIHRoZSBlbmQtb2YtcmVnaW9uLCBiYWNrIG9mZiB0byBwcmV2aW91cyBhY2Nlc3MgKi8KLQorCQkJLyoKKwkJCSAqIFRoaXMgd2lkdGggZ29lcyBiZXlvbmQgdGhlIGVuZC1vZi1yZWdpb24sIGJhY2sgb2ZmIHRvCisJCQkgKiBwcmV2aW91cyBhY2Nlc3MKKwkJCSAqLwogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAogCQkJCQkiQmFja2luZyBvZmYgdG8gcHJldmlvdXMgb3B0aW1hbCBhY2Nlc3Mgd2lkdGggb2YgJWRcbiIsCiAJCQkJCW1pbmltdW1fYWNjZXNzX3dpZHRoKSk7CkBAIC0xNzEsOCArMTk5LDEwIEBACiAJCX0KIAl9CiAKLQkvKiBDb3VsZCBub3QgcmVhZC93cml0ZSBmaWVsZCB3aXRoIG9uZSBvcGVyYXRpb24sIGp1c3QgdXNlIG1heCBhY2Nlc3Mgd2lkdGggKi8KLQorCS8qCisJICogQ291bGQgbm90IHJlYWQvd3JpdGUgZmllbGQgd2l0aCBvbmUgb3BlcmF0aW9uLAorCSAqIGp1c3QgdXNlIG1heCBhY2Nlc3Mgd2lkdGgKKwkgKi8KIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkiQ2Fubm90IGFjY2VzcyBmaWVsZCBpbiBvbmUgb3BlcmF0aW9uLCB1c2luZyB3aWR0aCA4XG4iKSk7CiAJcmV0dXJuX1ZBTFVFICg4KTsKQEAgLTE4NCw4ICsyMTQsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3MKICAqCi0gKiBQQVJBTUVURVJTOiAgQWNjZXNzICAgICAgICAgIC0gRW5jb2RlZCBmaWVsZCBhY2Nlc3MgYml0cwotICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAtIEZpZWxkIGxlbmd0aC4KKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRmllbGQgb2JqZWN0CisgKiAgICAgICAgICAgICAgZmllbGRfZmxhZ3MgICAgICAgICAtIEVuY29kZWQgZmllbGRmbGFncyAoY29udGFpbnMgYWNjZXNzIGJpdHMpCisgKiAgICAgICAgICAgICAgcmV0dXJuX2J5dGVfYWxpZ25tZW50IC0gV2hlcmUgdGhlIGJ5dGUgYWxpZ25tZW50IGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIEZpZWxkIGdyYW51bGFyaXR5ICg4LCAxNiwgMzIgb3IgNjQpIGFuZAogICogICAgICAgICAgICAgIGJ5dGVfYWxpZ25tZW50ICgxLCAyLCAzLCBvciA0KQpAQCAtMjE0LDkgKzI0NSwxMCBAQAogCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19BTlk6CiAKICNpZmRlZiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UCi0JCWJ5dGVfYWxpZ25tZW50ID0gYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3MgKG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJCQkgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJCSAweEZGRkZGRkZGIC8qIFRlbXAgdW50aWwgd2UgcGFzcyByZWdpb25fbGVuZ3RoIGFzIHBhcmFtICovKTsKKwkJYnl0ZV9hbGlnbm1lbnQgPQorCQkJYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3MgKG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkJMHhGRkZGRkZGRiAvKiBUZW1wIHVudGlsIHdlIHBhc3MgcmVnaW9uX2xlbmd0aCBhcyBwYXJhbWV0ZXIgKi8pOwogCQliaXRfbGVuZ3RoID0gYnl0ZV9hbGlnbm1lbnQgKiA4OwogI2VuZGlmCiAKQEAgLTI3Niw2ICszMDgsNyBAQAogICogICAgICAgICAgICAgIGZpZWxkX2ZsYWdzICAgICAgICAgLSBBY2Nlc3MsIGxvY2tfcnVsZSwgYW5kIHVwZGF0ZV9ydWxlLgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IG9mIGEgZmllbGRfZmxhZyBpcyBkZXNjcmliZWQKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbgorICogICAgICAgICAgICAgIGZpZWxkX2F0dHJpYnV0ZSAgICAgLSBTcGVjaWFsIGF0dHJpYnV0ZXMgKG5vdCB1c2VkKQogICogICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbiAgLSBGaWVsZCBzdGFydCBwb3NpdGlvbgogICogICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGggICAgLSBGaWVsZCBsZW5ndGggaW4gbnVtYmVyIG9mIGJpdHMKICAqCkBAIC0zMzcsNyArMzcwLDcgQEAKIAkvKiBTZXR1cCB3aWR0aCAoYWNjZXNzIGdyYW51bGFyaXR5KSBmaWVsZHMgKi8KIAogCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGggPSAodTgpCi0JCQlBQ1BJX0RJVl84IChhY2Nlc3NfYml0X3dpZHRoKTsgLyogMSwgMiwgNCwgIDggKi8KKwkJCUFDUElfRElWXzggKGFjY2Vzc19iaXRfd2lkdGgpOyAgICAgICAgICAvKiAxLCAgMiwgIDQsICA4ICovCiAKIAlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggPSAodTgpIGFjY2Vzc19iaXRfd2lkdGg7CiAKQEAgLTM4MCwxMSArNDEzLDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlCiAgKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBPd25pbmcgTm9kZQotICogICAgICAgICAgICAgIHJlZ2lvbl9ub2RlICAgICAgICAgLSBSZWdpb24gaW4gd2hpY2ggZmllbGQgaXMgYmVpbmcgZGVmaW5lZAotICogICAgICAgICAgICAgIGZpZWxkX2ZsYWdzICAgICAgICAgLSBBY2Nlc3MsIGxvY2tfcnVsZSwgYW5kIHVwZGF0ZV9ydWxlLgotICogICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbiAgLSBGaWVsZCBzdGFydCBwb3NpdGlvbgotICogICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGggICAgLSBGaWVsZCBsZW5ndGggaW4gbnVtYmVyIG9mIGJpdHMKKyAqIFBBUkFNRVRFUlM6ICBJbmZvICAgIC0gQ29udGFpbnMgYWxsIGZpZWxkIGNyZWF0aW9uIGluZm8KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDQ1LDcgKzQ3NCw3IEBACiAJc3dpdGNoIChpbmZvLT5maWVsZF90eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCi0JCW9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqICAgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKGluZm8tPnJlZ2lvbl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKGluZm8tPnJlZ2lvbl9ub2RlKTsKIAogCQkvKiBBbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIGNvbnRhaW5lciAqLwogCkBAIC00NjEsOCArNDkwLDEwIEBACiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAogCQlvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSAgID0gaW5mby0+YmFua192YWx1ZTsKLQkJb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+cmVnaW9uX25vZGUpOwotCQlvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+cmVnaXN0ZXJfbm9kZSk7CisJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAorCQkJCSBpbmZvLT5yZWdpb25fbm9kZSk7CisJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKKwkJCQkgaW5mby0+cmVnaXN0ZXJfbm9kZSk7CiAKIAkJLyogQW4gYWRkaXRpb25hbCByZWZlcmVuY2UgZm9yIHRoZSBhdHRhY2hlZCBvYmplY3RzICovCiAKQEAgLTQ4MSwxMCArNTEyLDEzIEBACiAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKLQkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5kYXRhX3JlZ2lzdGVyX25vZGUpOworCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKKwkJCQkgaW5mby0+cmVnaXN0ZXJfbm9kZSk7CisJCW9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCisJCQkJIGluZm8tPmRhdGFfcmVnaXN0ZXJfbm9kZSk7CiAJCW9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSAgPSAodTMyKQotCQkJKGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiAvIEFDUElfTVVMXzggKG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOworCQkJKGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiAvIEFDUElfTVVMXzggKAorCQkJCQkgIG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOwogCiAJCWlmICghb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqIHx8ICFvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKSB7CiAJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJOdWxsIEluZGV4IE9iamVjdCBkdXJpbmcgZmllbGQgcHJlcFxuIikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwppbmRleCA3Y2ZkMDY4Li43MjNhYWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVkFMVUUpOwogCX0KIAotCiAjaWZuZGVmIEFDUElfTUlTQUxJR05FRF9UUkFOU0ZFUlMKIAkvKgogCSAqIEhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgbm9uLWFsaWduZWQgZGF0YSB0cmFuc2ZlcnMsIHdlIG11c3QgdmVyaWZ5CkBAIC0xMzQsNyArMTMzLDggQEAKIAkgKi8KIAlpZiAoKGFkZHJlc3MgPCBtZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MpIHx8CiAJCSgoKGFjcGlfaW50ZWdlcikgYWRkcmVzcyArIGxlbmd0aCkgPgotCQkJKChhY3BpX2ludGVnZXIpIG1lbV9pbmZvLT5tYXBwZWRfcGh5c2ljYWxfYWRkcmVzcyArIG1lbV9pbmZvLT5tYXBwZWRfbGVuZ3RoKSkpIHsKKwkJCSgoYWNwaV9pbnRlZ2VyKQorCQkJbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzICsgbWVtX2luZm8tPm1hcHBlZF9sZW5ndGgpKSkgewogCQkvKgogCQkgKiBUaGUgcmVxdWVzdCBjYW5ub3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGN1cnJlbnQgbWVtb3J5IG1hcHBpbmc7CiAJCSAqIERlbGV0ZSB0aGUgZXhpc3RpbmcgbWFwcGluZyBhbmQgY3JlYXRlIGEgbmV3IG9uZS4KQEAgLTE1MCw3ICsxNTAsOSBAQAogCQkgKiBEb24ndCBhdHRlbXB0IHRvIG1hcCBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbiwgYW5kCiAJCSAqIGNvbnN0cmFpbiB0aGUgbWF4aW11bSBtYXBwaW5nIHNpemUgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuCiAJCSAqLwotCQl3aW5kb3dfc2l6ZSA9IChhY3BpX3NpemUpICgobWVtX2luZm8tPmFkZHJlc3MgKyBtZW1faW5mby0+bGVuZ3RoKSAtIGFkZHJlc3MpOworCQl3aW5kb3dfc2l6ZSA9IChhY3BpX3NpemUpCisJCQkoKG1lbV9pbmZvLT5hZGRyZXNzICsgbWVtX2luZm8tPmxlbmd0aCkgLSBhZGRyZXNzKTsKKwogCQlpZiAod2luZG93X3NpemUgPiBBQ1BJX1NZU01FTV9SRUdJT05fV0lORE9XX1NJWkUpIHsKIAkJCXdpbmRvd19zaXplID0gQUNQSV9TWVNNRU1fUkVHSU9OX1dJTkRPV19TSVpFOwogCQl9CkBAIC0xNjAsOCArMTYyLDkgQEAKIAkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLCB3aW5kb3dfc2l6ZSwKIAkJCQkgICh2b2lkICoqKSAmbWVtX2luZm8tPm1hcHBlZF9sb2dpY2FsX2FkZHJlc3MpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFgsIHNpemUgJVhcbiIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcyksICh1MzIpIHdpbmRvd19zaXplKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCwgc2l6ZSAlWFxuIiwKKwkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLCAodTMyKSB3aW5kb3dfc2l6ZSkpOwogCQkJbWVtX2luZm8tPm1hcHBlZF9sZW5ndGggPSAwOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0xNzcsMTAgKzE4MCwxMiBAQAogCSAqIGFjY2VzcwogCSAqLwogCWxvZ2ljYWxfYWRkcl9wdHIgPSBtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyArCi0JCQkgICgoYWNwaV9pbnRlZ2VyKSBhZGRyZXNzIC0gKGFjcGlfaW50ZWdlcikgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKTsKKwkJCSAgICgoYWNwaV9pbnRlZ2VyKSBhZGRyZXNzIC0KKwkJCQkJICAoYWNwaV9pbnRlZ2VyKSBtZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MpOwogCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCSJzeXN0ZW1fbWVtb3J5ICVkICglZCB3aWR0aCkgQWRkcmVzcz0lOC44WCU4LjhYXG4iLCBmdW5jdGlvbiwgYml0X3dpZHRoLAorCQkJInN5c3RlbV9tZW1vcnkgJWQgKCVkIHdpZHRoKSBBZGRyZXNzPSU4LjhYJTguOFhcbiIsCisJCQlmdW5jdGlvbiwgYml0X3dpZHRoLAogCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSkpOwogCiAgICAvKgpAQCAtMjk4LDEzICszMDMsMTUgQEAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6CiAKLQkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BvcnQgKChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsICZ2YWx1ZTMyLCBiaXRfd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCAoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKKwkJCQkgJnZhbHVlMzIsIGJpdF93aWR0aCk7CiAJCSp2YWx1ZSA9IHZhbHVlMzI7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1dSSVRFOgogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywgKHUzMikgKnZhbHVlLCBiaXRfd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsCisJCQkJICh1MzIpICp2YWx1ZSwgYml0X3dpZHRoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzc1LDEyICszODIsMTQgQEAKIAljYXNlIEFDUElfUkVBRDoKIAogCQkqdmFsdWUgPSAwOwotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24gKHBjaV9pZCwgcGNpX3JlZ2lzdGVyLCB2YWx1ZSwgYml0X3dpZHRoKTsKKwkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uIChwY2lfaWQsIHBjaV9yZWdpc3RlciwKKwkJCQkgdmFsdWUsIGJpdF93aWR0aCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1dSSVRFOgogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24gKHBjaV9pZCwgcGNpX3JlZ2lzdGVyLCAqdmFsdWUsIGJpdF93aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24gKHBjaV9pZCwgcGNpX3JlZ2lzdGVyLAorCQkJCSAqdmFsdWUsIGJpdF93aWR0aCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTUwNSw4ICs1MTQsNyBAQAogCiAJbG9naWNhbF9hZGRyX3B0ciA9IEFDUElfUEhZU0FERFJfVE9fUFRSIChhZGRyZXNzKTsKIAotCi0gICAvKiBQZXJmb3JtIHRoZSBtZW1vcnkgcmVhZCBvciB3cml0ZSAqLworCS8qIFBlcmZvcm0gdGhlIG1lbW9yeSByZWFkIG9yIHdyaXRlICovCiAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCmluZGV4IDc5MzYzMjkuLjIxZDVjNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCkBAIC0yMTAsMTUgKzIxMCwxNSBAQAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgImZpZWxkX3JlYWQgTm9kZT0lcCBzb3VyY2VfZGVzYz0lcCBUeXBlPSVYXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJImZpZWxkX3JlYWQgTm9kZT0lcCBzb3VyY2VfZGVzYz0lcCBUeXBlPSVYXG4iLAogCQkJbm9kZSwgc291cmNlX2Rlc2MsIGVudHJ5X3R5cGUpKTsKIAogCQlzdGF0dXMgPSBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkICh3YWxrX3N0YXRlLCBzb3VyY2VfZGVzYywgJm9ial9kZXNjKTsKIAkJYnJlYWs7CiAKLQkvKgotCSAqIEZvciB0aGVzZSBvYmplY3RzLCBqdXN0IHJldHVybiB0aGUgb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBOb2RlCi0JICovCisJLyogRm9yIHRoZXNlIG9iamVjdHMsIGp1c3QgcmV0dXJuIHRoZSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5vZGUgKi8KKwogCWNhc2UgQUNQSV9UWVBFX01VVEVYOgogCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKIAljYXNlIEFDUElfVFlQRV9QT1dFUjoKQEAgLTIzMywxMiArMjMzLDEyIEBACiAJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwogCQlicmVhazsKIAotCiAJLyogVFlQRV9BTlkgaXMgdW50eXBlZCwgYW5kIHRodXMgdGhlcmUgaXMgbm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBpdCAqLwogCiAJY2FzZSBBQ1BJX1RZUEVfQU5ZOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW50eXBlZCBlbnRyeSAlcCwgbm8gYXR0YWNoZWQgb2JqZWN0IVxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiVW50eXBlZCBlbnRyeSAlcCwgbm8gYXR0YWNoZWQgb2JqZWN0IVxuIiwKIAkJCW5vZGUpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOyAgLyogQ2Fubm90IGJlIEFFX1RZUEUgKi8KQEAgLTI1OSw3ICsyNTksOCBAQAogCQlkZWZhdWx0OgogCQkJLyogTm8gbmFtZWQgcmVmZXJlbmNlcyBhcmUgYWxsb3dlZCBoZXJlICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5zdXBwb3J0ZWQgUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIlVuc3VwcG9ydGVkIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKVxuIiwKIAkJCQlzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKIAkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKSk7CiAKQEAgLTI2OCwxMSArMjY5LDEyIEBACiAJCWJyZWFrOwogCiAKLQkvKiBEZWZhdWx0IGNhc2UgaXMgZm9yIHVua25vd24gdHlwZXMgKi8KLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOb2RlICVwIC0gVW5rbm93biBvYmplY3QgdHlwZSAlWFxuIiwKKwkJLyogRGVmYXVsdCBjYXNlIGlzIGZvciB1bmtub3duIHR5cGVzICovCisKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiTm9kZSAlcCAtIFVua25vd24gb2JqZWN0IHR5cGUgJVhcbiIsCiAJCQlub2RlLCBlbnRyeV90eXBlKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKQEAgLTI4MCw3ICsyODIsNyBAQAogCX0gLyogc3dpdGNoIChlbnRyeV90eXBlKSAqLwogCiAKLQkvKiBQdXQgdGhlIG9iamVjdCBkZXNjcmlwdG9yIG9uIHRoZSBzdGFjayAqLworCS8qIFJldHVybiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgKi8KIAogCSpvYmplY3RfcHRyID0gKHZvaWQgKikgb2JqX2Rlc2M7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYwppbmRleCA3YmU2MDQ5Li4zZGU0NTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYwpAQCAtNTQsNiArNTQsMTMgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHJlc29sdiIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTYsNiArMTAzLDExIEBACiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQorCisJCWlmICghKnN0YWNrX3B0cikgeworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnRlcm5hbCAtIG51bGwgcG9pbnRlclxuIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fT1BFUkFORCk7CisJCX0KIAl9CiAKIAkvKgpAQCAtMTIwLDE4ICsxMzIsMTcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBzdGFja19wdHIgICAgICAgLSBQb2ludGVyIHRvIGEgc3RhY2sgbG9jYXRpb24gdGhhdCBjb250YWlucyBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyIHRvIGFuIGludGVybmFsIG9iamVjdC4KKyAqIFBBUkFNRVRFUlM6ICBzdGFja19wdHIgICAgICAgLSBQb2ludGVyIHRvIGFuIGludGVybmFsIG9iamVjdAogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgbWV0aG9kIHN0YXRlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSBhbiBpbnRlcm5hbCBvYmplY3QuICBUaGUgUmVmZXJlbmNlIHR5cGUKKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSBhbiBpbnRlcm5hbCBvYmplY3QuIFRoZSBSZWZlcmVuY2UgdHlwZQogICogICAgICAgICAgICAgIHVzZXMgdGhlIGFzc29jaWF0ZWQgQU1MIG9wY29kZSB0byBkZXRlcm1pbmUgdGhlIHZhbHVlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzdGFja19wdHIsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKQEAgLTE1OSw3ICsxNzAsNyBAQAogCQljYXNlIEFNTF9OQU1FX09QOgogCiAJCQkvKgotCQkJICogQ29udmVydCBpbmRpcmVjdCBuYW1lIHB0ciB0byBhIGRpcmVjdCBuYW1lIHB0ci4KKwkJCSAqIENvbnZlcnQgbmFtZSByZWZlcmVuY2UgdG8gYSBuYW1lc3BhY2Ugbm9kZQogCQkJICogVGhlbiwgYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZQogCQkJICovCiAJCQl0ZW1wX25vZGUgPSBzdGFja19kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OwpAQCAtMTY4LDcgKzE3OSw3IEBACiAKIAkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoc3RhY2tfZGVzYyk7CiAKLQkJCS8qIFB1dCBkaXJlY3QgbmFtZSBwb2ludGVyIG9udG8gc3RhY2sgYW5kIGV4aXQgKi8KKwkJCS8qIFJldHVybiB0aGUgbmFtZXNwYWNlIG5vZGUgKi8KIAogCQkJKCpzdGFja19wdHIpID0gdGVtcF9ub2RlOwogCQkJYnJlYWs7CkBAIC0yNTUsMTAgKzI2NiwxOSBAQAogCiAJCQlicmVhazsKIAorCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6ICAgLyogUmVmZXJlbmNlIHRvIGEgbmFtZWQgb2JqZWN0ICovCisKKwkJCS8qIEdldCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIG5hbWVzcGFjZSBub2RlICovCisKKwkJCSpzdGFja19wdHIgPSAoc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm5vZGUpLT5vYmplY3Q7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKCpzdGFja19wdHIpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChzdGFja19kZXNjKTsKKwkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkR1cmluZyByZXNvbHZlLCBVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKSBpbiAlcFxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIkR1cmluZyByZXNvbHZlLCBVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKSBpbiAlcFxuIiwKIAkJCQlvcGNvZGUsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcGNvZGUpLCBzdGFja19kZXNjKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJCQlicmVhazsKQEAgLTI3OCw5ICsyOTgsOCBAQAogCQlicmVhazsKIAogCi0JLyoKLQkgKiBUaGVzZSBjYXNlcyBtYXkgbmV2ZXIgaGFwcGVuIGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLgotCSAqLworCS8qIFRoZXNlIGNhc2VzIG1heSBuZXZlciBoYXBwZW4gaGVyZSwgYnV0IGp1c3QgaW4gY2FzZS4uICovCisKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CkBAIC0zMzMsOSArMzUyLDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlIik7CiAKIAotCS8qCi0JICogT3BlcmFuZCBjYW4gYmUgZWl0aGVyIGEgbmFtZXNwYWNlIG5vZGUgb3IgYW4gb3BlcmFuZCBkZXNjcmlwdG9yCi0JICovCisJLyogT3BlcmFuZCBjYW4gYmUgZWl0aGVyIGEgbmFtZXNwYWNlIG5vZGUgb3IgYW4gb3BlcmFuZCBkZXNjcmlwdG9yICovCisKIAlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EOgogCQl0eXBlID0gb2JqX2Rlc2MtPmNvbW1vbi50eXBlOwpAQCAtMzU3LDEwICszNzUsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCX0KIAorCS8qIElmIHR5cGUgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHJlZmVyZW5jZSwgd2UgYXJlIGRvbmUgKi8KIAotCS8qCi0JICogSWYgdHlwZSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgcmVmZXJlbmNlLCB3ZSBhcmUgZG9uZQotCSAqLwogCWlmICh0eXBlICE9IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKIAkJZ290byBleGl0OwogCX0KQEAgLTM4Miw4ICszOTgsOSBAQAogCQkJLyogQWxsICJSZWZlcmVuY2VzIiBwb2ludCB0byBhIE5TIG5vZGUgKi8KIAogCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAobm9kZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKLQkJCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCQkiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBOb3QgYSBOUyBub2RlICVwIFslc11cbiIsCisJCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CiAJCQl9CiAKQEAgLTQ0MCw4ICs0NTcsOSBAQAogCQkJLyogQWxsICJSZWZlcmVuY2VzIiBwb2ludCB0byBhIE5TIG5vZGUgKi8KIAogCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAobm9kZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKLQkJCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCQkiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBOb3QgYSBOUyBub2RlICVwIFslc11cbiIsCisJCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKIAkJCSAgIHJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKIAkJCX0KIApAQCAtNDY4LDcgKzQ4Niw3IEBACiAKIAkJCWlmIChyZXR1cm5fZGVzYykgewogCQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQkJCSAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsIHdhbGtfc3RhdGUsICZvYmpfZGVzYyk7CisJCQkJCQkgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsIHdhbGtfc3RhdGUsICZvYmpfZGVzYyk7CiAJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCQkJfQpAQCAtNTAwLDcgKzUxOCw4IEBACiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBVbmtub3duIFJlZmVyZW5jZSBzdWJ0eXBlICVYXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBVbmtub3duIFJlZmVyZW5jZSBzdWJ0eXBlICVYXG4iLAogCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCmluZGV4IGM5Mjg5MDIuLmQ4YjQ3MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYwpAQCAtNTIsNiArNTIsMTQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHJlc29wIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUgKAorCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZV9uZWVkZWQsCisJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0aGlzX3R5cGUsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY3LDcgKzc1LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NoZWNrX29iamVjdF90eXBlICgKIAlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGVfbmVlZGVkLAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdGhpc190eXBlLApAQCAtMTQyLDYgKzE1MCw3IEBACiAJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAqb3BfaW5mbzsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfYXJnX3R5cGU7CiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlX25lZWRlZDsKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9vcCA9IDA7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgiZXhfcmVzb2x2ZV9vcGVyYW5kcyIsIG9wY29kZSk7CkBAIC0xNjAsNyArMTY5LDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPcGNvZGUgJVggWyVzXSByZXF1aXJlZF9vcGVyYW5kX3R5cGVzPSU4LjhYIFxuIiwKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkiT3Bjb2RlICVYIFslc10gcmVxdWlyZWRfb3BlcmFuZF90eXBlcz0lOC44WCBcbiIsCiAJCW9wY29kZSwgb3BfaW5mby0+bmFtZSwgYXJnX3R5cGVzKSk7CiAKIAkvKgpAQCAtMTg3LDcgKzE5Nyw3IEBACiAJCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykpIHsKIAkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKIAotCQkJLyogTm9kZSAqLworCQkJLyogTmFtZXNwYWNlIE5vZGUgKi8KIAogCQkJb2JqZWN0X3R5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjKS0+dHlwZTsKIAkJCWJyZWFrOwpAQCAtMjAyLDE2ICsyMTIsMTYgQEAKIAkJCS8qIENoZWNrIGZvciBiYWQgYWNwaV9vYmplY3RfdHlwZSAqLwogCiAJCQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKG9iamVjdF90eXBlKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQmFkIG9wZXJhbmQgb2JqZWN0IHR5cGUgWyVYXVxuIiwKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJIkJhZCBvcGVyYW5kIG9iamVjdCB0eXBlIFslWF1cbiIsCiAJCQkJCW9iamVjdF90eXBlKSk7CiAKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJfQogCiAJCQlpZiAob2JqZWN0X3R5cGUgPT0gKHU4KSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7Ci0JCQkJLyoKLQkJCQkgKiBEZWNvZGUgdGhlIFJlZmVyZW5jZQotCQkJCSAqLworCQkJCS8qIERlY29kZSB0aGUgUmVmZXJlbmNlICovCisKIAkJCQlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wY29kZSk7CiAJCQkJaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7CiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9PUENPREUpOwpAQCAtMjE5LDEyICsyMjksMTcgQEAKIAogCQkJCXN3aXRjaCAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpIHsKIAkJCQljYXNlIEFNTF9ERUJVR19PUDoKKwkJCQkJdGFyZ2V0X29wID0gQU1MX0RFQlVHX09QOworCisJCQkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KKwogCQkJCWNhc2UgQU1MX05BTUVfT1A6CiAJCQkJY2FzZSBBTUxfSU5ERVhfT1A6CiAJCQkJY2FzZSBBTUxfUkVGX09GX09QOgogCQkJCWNhc2UgQU1MX0FSR19PUDoKIAkJCQljYXNlIEFNTF9MT0NBTF9PUDoKLQkJCQljYXNlIEFNTF9MT0FEX09QOiAgIC8qIGRkYl9oYW5kbGUgZnJvbSBMT0FEX09QIG9yIExPQURfVEFCTEVfT1AgKi8KKwkJCQljYXNlIEFNTF9MT0FEX09QOiAvKiBkZGJfaGFuZGxlIGZyb20gTE9BRF9PUCBvciBMT0FEX1RBQkxFX09QICovCisJCQkJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOiAvKiBSZWZlcmVuY2UgdG8gYSBuYW1lZCBvYmplY3QgKi8KIAogCQkJCQlBQ1BJX0RFQlVHX09OTFlfTUVNQkVSUyAoQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKIAkJCQkJCSJPcGVyYW5kIGlzIGEgUmVmZXJlbmNlLCByZWZfb3Bjb2RlIFslc11cbiIsCkBAIC0yNTQsMTAgKzI2OSw4IEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKKwkJLyogR2V0IG9uZSBhcmd1bWVudCB0eXBlLCBwb2ludCB0byB0aGUgbmV4dCAqLwogCi0JCS8qCi0JCSAqIEdldCBvbmUgYXJndW1lbnQgdHlwZSwgcG9pbnQgdG8gdGhlIG5leHQKLQkJICovCiAJCXRoaXNfYXJnX3R5cGUgPSBHRVRfQ1VSUkVOVF9BUkdfVFlQRSAoYXJnX3R5cGVzKTsKIAkJSU5DUkVNRU5UX0FSR19MSVNUIChhcmdfdHlwZXMpOwogCkBAIC0yNzEsMjYgKzI4NCwzMSBAQAogCQkJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSAmJgogCQkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9TVFJJTkcpKSB7CiAJCQkJLyoKLQkJCQkgKiBTdHJpbmcgZm91bmQgLSB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBuYW1lZCBvYmplY3QgYW5kIG11c3QgYmUKLQkJCQkgKiByZXNvbHZlZCB0byBhIG5vZGUKKwkJCQkgKiBTdHJpbmcgZm91bmQgLSB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBuYW1lZCBvYmplY3QgYW5kCisJCQkJICogbXVzdCBiZSByZXNvbHZlZCB0byBhIG5vZGUKIAkJCQkgKi8KIAkJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAkJCX0KIAotCQkJLyogRWxzZSBub3QgYSBzdHJpbmcgLSBmYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBSZWZlcmVuY2UgY2FzZSBiZWxvdyAqLworCQkJLyoKKwkJCSAqIEVsc2Ugbm90IGEgc3RyaW5nIC0gZmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgUmVmZXJlbmNlCisJCQkgKiBjYXNlIGJlbG93CisJCQkgKi8KIAkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KIAogCQljYXNlIEFSR0lfUkVGRVJFTkNFOiAgICAgICAgICAgIC8qIFJlZmVyZW5jZXM6ICovCiAJCWNhc2UgQVJHSV9JTlRFR0VSX1JFRjoKIAkJY2FzZSBBUkdJX09CSkVDVF9SRUY6CiAJCWNhc2UgQVJHSV9ERVZJQ0VfUkVGOgotCQljYXNlIEFSR0lfVEFSR0VUUkVGOiAgICAgICAgICAgIC8qIEFsbG93cyBpbXBsaWNpdCBjb252ZXJzaW9uIHJ1bGVzIGJlZm9yZSBzdG9yZSAqLwotCQljYXNlIEFSR0lfRklYRURfVEFSR0VUOiAgICAgICAgIC8qIE5vIGltcGxpY2l0IGNvbnZlcnNpb24gYmVmb3JlIHN0b3JlIHRvIHRhcmdldCAqLwotCQljYXNlIEFSR0lfU0lNUExFX1RBUkdFVDogICAgICAgIC8qIE5hbWUsIExvY2FsLCBvciBBcmcgLSBubyBpbXBsaWNpdCBjb252ZXJzaW9uICAqLworCQljYXNlIEFSR0lfVEFSR0VUUkVGOiAgICAgLyogQWxsb3dzIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMgYmVmb3JlIHN0b3JlICovCisJCWNhc2UgQVJHSV9GSVhFRF9UQVJHRVQ6ICAvKiBObyBpbXBsaWNpdCBjb252ZXJzaW9uIGJlZm9yZSBzdG9yZSB0byB0YXJnZXQgKi8KKwkJY2FzZSBBUkdJX1NJTVBMRV9UQVJHRVQ6IC8qIE5hbWUsIExvY2FsLCBvciBBcmcgLSBubyBpbXBsaWNpdCBjb252ZXJzaW9uICAqLwogCi0JCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFICovCi0KLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgLyogTm9kZSAobmFtZSkgcHRyIE9LIGFzLWlzICovIHsKKwkJCS8qCisJCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFCisJCQkgKiBBIE5hbWVzcGFjZSBOb2RlIGlzIE9LIGFzLWlzCisJCQkgKi8KKwkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewogCQkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCQkJfQogCkBAIC0zMDAsMTEgKzMxOCw5IEBACiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQkJfQogCi0JCQlpZiAoQU1MX05BTUVfT1AgPT0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpIHsKLQkJCQkvKgotCQkJCSAqIENvbnZlcnQgYW4gaW5kaXJlY3QgbmFtZSBwdHIgdG8gZGlyZWN0IG5hbWUgcHRyIGFuZCBwdXQKLQkJCQkgKiBpdCBvbiB0aGUgc3RhY2sKLQkJCQkgKi8KKwkJCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfTkFNRV9PUCkgeworCQkJCS8qIENvbnZlcnQgYSBuYW1lZCByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBuYW1lZCBvYmplY3QgKi8KKwogCQkJCXRlbXBfbm9kZSA9IG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OwogCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwogCQkJCSgqc3RhY2tfcHRyKSA9IHRlbXBfbm9kZTsKQEAgLTMzMiw3ICszNDgsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAotCiAJCS8qCiAJCSAqIFJlc29sdmUgdGhpcyBvYmplY3QgdG8gYSB2YWx1ZQogCQkgKi8KQEAgLTM5Miw3ICs0MDcsNyBAQAogCQkvKgogCQkgKiBUaGUgbW9yZSBjb21wbGV4IGNhc2VzIGFsbG93IG11bHRpcGxlIHJlc29sdmVkIG9iamVjdCB0eXBlcwogCQkgKi8KLQkJY2FzZSBBUkdJX0lOVEVHRVI6ICAgLyogTnVtYmVyICovCisJCWNhc2UgQVJHSV9JTlRFR0VSOgogCiAJCQkvKgogCQkJICogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0lOVEVHRVIsCkBAIC01NjMsNyArNTc4LDcgQEAKIAogCQljYXNlIEFSR0lfUkVHSU9OX09SX0ZJRUxEOgogCi0JCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfUkVHSU9OIG9yIGEgRklFTEQgaW4gYSByZWdpb24gKi8KKwkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIFJFR0lPTiBvciBhIEZJRUxEIGluIGEgcmVnaW9uICovCiAKIAkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgpAQCAtNjE0LDYgKzYyOSwxMiBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKKwkJCQlpZiAodGFyZ2V0X29wID09IEFNTF9ERUJVR19PUCkgeworCQkJCQkvKiBBbGxvdyBzdG9yZSBvZiBhbnkgb2JqZWN0IHRvIHRoZSBEZWJ1ZyBvYmplY3QgKi8KKworCQkJCQlicmVhazsKKwkJCQl9CisKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCQkJIk5lZWRlZCBJbnRlZ2VyL0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWYvRGRiXSwgZm91bmQgWyVzXSAlcFxuIiwKIAkJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwpAQCAtNjUyLDggKzY3Myw3IEBACiAJCWlmIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSAoYXJnX3R5cGVzKSkgewogCQkJc3RhY2tfcHRyLS07CiAJCX0KLQotCX0gICAvKiB3aGlsZSAoKlR5cGVzKSAqLworCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCmluZGV4IGUwZmM2YWIuLjI3MjVkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYwpAQCAtNDgsMTEgKzQ4LDE3MSBAQAogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogCiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHN0b3JlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXggKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbF9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYywKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX2RlYnVnX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBzb3VyY2VfZGVzYyAgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCisgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICAgICAtIEluZGVudGF0aW9uIGxldmVsICh1c2VkIGZvciBwYWNrYWdlcykKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gQ3VycmVudCBwYWNrYWdlIGVsZW1lbnQsIHplcm8gaWYgbm90IHBrZworICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEhhbmRsZXMgc3RvcmVzIHRvIHRoZSBEZWJ1ZyBPYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2FjcGlfZXhfZG9fZGVidWdfb2JqZWN0ICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpCit7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2RvX2RlYnVnX29iamVjdCIsIHNvdXJjZV9kZXNjKTsKKworCisJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIltBQ1BJIERlYnVnXSAlKnMiLAorCQlsZXZlbCwgIiAiKSk7CisKKwkvKiBEaXNwbGF5IGluZGV4IGZvciBwYWNrYWdlIG91dHB1dCBvbmx5ICovCisKKwlpZiAoaW5kZXggPiAwKSB7CisJICAgQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJICAgIiglLjJ1KSAiLCBpbmRleCAtMSkpOworCX0KKworCWlmICghc291cmNlX2Rlc2MpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIjxOdWxsIE9iamVjdD5cbiIpKTsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoc291cmNlX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzOiAiLAorCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7CisKKwkJaWYgKCFhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCAoc291cmNlX2Rlc2MpKSB7CisJCSAgIEFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsCisJCQkgICAiJXAsIEludmFsaWQgSW50ZXJuYWwgT2JqZWN0IVxuIiwgc291cmNlX2Rlc2MpKTsKKwkJICAgcmV0dXJuX1ZPSUQ7CisJCX0KKwl9CisJZWxzZSBpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChzb3VyY2VfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzOiAlcFxuIiwKKwkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBzb3VyY2VfZGVzYyktPnR5cGUpLAorCQkJc291cmNlX2Rlc2MpKTsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCWVsc2UgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpIHsKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCisJCS8qIE91dHB1dCBjb3JyZWN0IGludGVnZXIgd2lkdGggKi8KKworCQlpZiAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID09IDQpIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYXG4iLAorCQkJCSh1MzIpIHNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKSk7CisJCX0KKwkJZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiMHglOC44WCU4LjhYXG4iLAorCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIiwKKwkJCSh1MzIpIHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CisJCUFDUElfRFVNUF9CVUZGRVIgKHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCShzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IDMyKSA/IHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDogMzIpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWF0gXCIlc1wiXG4iLAorCQkJc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGgsIHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlggRWxlbWVudHNdXG4iLAorCQkJc291cmNlX2Rlc2MtPnBhY2thZ2UuY291bnQpKTsKKworCQkvKiBPdXRwdXQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgcGFja2FnZSAqLworCisJCWZvciAoaSA9IDA7IGkgPCBzb3VyY2VfZGVzYy0+cGFja2FnZS5jb3VudDsgaSsrKSB7CisJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoc291cmNlX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0sCisJCQkJbGV2ZWwrNCwgaSsxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKKworCQlpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0lOREVYX09QKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWyVzLCAweCVYXVxuIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpLAorCQkJCXNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KSk7CisJCX0KKwkJZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWyVzXVxuIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKSk7CisJCX0KKworCisJCWlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgeworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpID09CisJCQkJCUFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkJc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5vYmplY3QsCisJCQkJCWxldmVsKzQsIDApOworCQkJfQorCQkJZWxzZSB7CisJCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LCBsZXZlbCs0LCAwKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm5vZGUpIHsKKwkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0ICgoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKS0+b2JqZWN0LAorCQkJCWxldmVsKzQsIDApOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiJXAgJXNcbiIsCisJCQlzb3VyY2VfZGVzYywgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7CisJCWJyZWFrOworCX0KKworCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9FWEVDLCAiXG4iKSk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNTQsOCArMzE0LDkgQEAKIAogCQkvKiBTdG9yaW5nIGFuIG9iamVjdCBpbnRvIGEgTmFtZSAiY29udGFpbmVyIiAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKHNvdXJjZV9kZXNjLCByZWZfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwKLQkJCQkgIHdhbGtfc3RhdGUsIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTik7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKHNvdXJjZV9kZXNjLAorCQkJCSByZWZfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwKKwkJCQkgd2Fsa19zdGF0ZSwgQUNQSV9JTVBMSUNJVF9DT05WRVJTSU9OKTsKIAkJYnJlYWs7CiAKIApAQCAtMTczLDcgKzMzNCw3IEBACiAJCS8qIFN0b3JlIHRvIGEgbWV0aG9kIGxvY2FsL2FyZyAgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbCAocmVmX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUsCi0JCQkJICByZWZfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgc291cmNlX2Rlc2MsIHdhbGtfc3RhdGUpOworCQkJCSByZWZfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgc291cmNlX2Rlc2MsIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAogCkBAIC0xODcsNjAgKzM0OCw3IEBACiAJCQkiKioqKiBXcml0ZSB0byBEZWJ1ZyBPYmplY3Q6IE9iamVjdCAlcCAlcyAqKioqOlxuXG4iLAogCQkJc291cmNlX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOwogCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbQUNQSSBEZWJ1Z10gJXM6ICIsCi0JCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKLQotCQlpZiAoIWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0IChzb3VyY2VfZGVzYykpIHsKLQkJICAgQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKLQkJCSAgICIlcCwgSW52YWxpZCBJbnRlcm5hbCBPYmplY3QhXG4iLCBzb3VyY2VfZGVzYykpOwotCQkgICBicmVhazsKLQkJfQotCi0JCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSkgewotCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCi0JCQlpZiAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID09IDQpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiMHglOC44WFxuIiwKLQkJCQkJKHUzMikgc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYJTguOFhcbiIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIiwKLQkJCQkodTMyKSBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwotCQkJQUNQSV9EVU1QX0JVRkZFUiAoc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJCShzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IDMyKSA/IHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDogMzIpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXSBcIiVzXCJcbiIsCi0JCQkJc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGgsIHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWF0gRWxlbWVudHMgUHRyIC0gJXBcbiIsCi0JCQkJc291cmNlX2Rlc2MtPnBhY2thZ2UuY291bnQsIHNvdXJjZV9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKSk7Ci0JCQlicmVhazsKLQotCi0JCWRlZmF1bHQ6Ci0KLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlcFxuIiwKLQkJCQlzb3VyY2VfZGVzYykpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfRVhFQywgIlxuIikpOworCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoc291cmNlX2Rlc2MsIDAsIDApOwogCQlicmVhazsKIAogCkBAIC0yNzIsNyArMzgwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW5kZXhfZGVzYywKQEAgLTMxMywxNiArNDIxLDIyIEBACiAJCWlmIChvYmpfZGVzYykgewogCQkJLyogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZSAqLwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIGluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OyBpKyspIHsKKwkJCWZvciAoaSA9IDA7CisJCQkJIGkgPCAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikKKwkJCQkJCWluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OworCQkJCSBpKyspIHsKIAkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKIAkJCX0KIAkJfQogCiAJCSooaW5kZXhfZGVzYy0+cmVmZXJlbmNlLndoZXJlKSA9IG5ld19kZXNjOwogCi0JCS8qIEluY3JlbWVudCByZWZlcmVuY2UgY291bnQgYnkgdGhlIHJlZiBjb3VudCBvZiB0aGUgcGFyZW50IHBhY2thZ2UgLTEgKi8KKwkJLyogSW5jcmVtZW50IHJlZiBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZS0xICovCiAKLQkJZm9yIChpID0gMTsgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKSBpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudDsgaSsrKSB7CisJCWZvciAoaSA9IDE7CisJCQkgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCQlpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudDsKKwkJCSBpKyspIHsKIAkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAobmV3X2Rlc2MpOwogCQl9CiAKQEAgLTQ0MCw5ICs1NTQsOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUiLCBzb3VyY2VfZGVzYyk7CiAKIAotCS8qCi0JICogR2V0IGN1cnJlbnQgdHlwZSBvZiB0aGUgbm9kZSwgYW5kIG9iamVjdCBhdHRhY2hlZCB0byBOb2RlCi0JICovCisJLyogR2V0IGN1cnJlbnQgdHlwZSBvZiB0aGUgbm9kZSwgYW5kIG9iamVjdCBhdHRhY2hlZCB0byBOb2RlICovCisKIAl0YXJnZXRfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUgKG5vZGUpOwogCXRhcmdldF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKIApAQCAtNDY3LDE5ICs1ODAsMTggQEAKIAkJdGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCX0KIAotCS8qCi0JICogRG8gdGhlIGFjdHVhbCBzdG9yZSBvcGVyYXRpb24KLQkgKi8KKwkvKiBEbyB0aGUgYWN0dWFsIHN0b3JlIG9wZXJhdGlvbiAqLworCiAJc3dpdGNoICh0YXJnZXRfdHlwZSkgewogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQkvKgotCQkgKiBGb3IgZmllbGRzLCBjb3B5IHRoZSBzb3VyY2UgZGF0YSB0byB0aGUgdGFyZ2V0IGZpZWxkLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkIChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsICZ3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKKwkJLyogRm9yIGZpZWxkcywgY29weSB0aGUgc291cmNlIGRhdGEgdG8gdGhlIHRhcmdldCBmaWVsZC4gKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX2RhdGFfdG9fZmllbGQgKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywKKwkJCQkgJndhbGtfc3RhdGUtPnJlc3VsdF9vYmopOwogCQlicmVhazsKIAogCkBAIC00OTMsNyArNjA1LDggQEAKIAkJICoKIAkJICogQ29weSBhbmQvb3IgY29udmVydCB0aGUgc291cmNlIG9iamVjdCB0byBhIG5ldyB0YXJnZXQgb2JqZWN0CiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19vYmplY3QgKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywgJm5ld19kZXNjLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0IChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsCisJCQkJICZuZXdfZGVzYywgd2Fsa19zdGF0ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQpAQCAtNTI2LDcgKzYzOSw4IEBACiAKIAkJLyogTm8gY29udmVyc2lvbnMgZm9yIGFsbCBvdGhlciB0eXBlcy4gIEp1c3QgYXR0YWNoIHRoZSBzb3VyY2Ugb2JqZWN0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBzb3VyY2VfZGVzYywgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAobm9kZSwgc291cmNlX2Rlc2MsCisJCQkJIEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKaW5kZXggZDM2NzdmZS4uMTIwZjMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKQEAgLTgxLDkgKzgxLDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfcmVzb2x2ZV9vYmplY3QiKTsKIAogCi0JLyoKLQkgKiBFbnN1cmUgd2UgaGF2ZSBhIFRhcmdldCB0aGF0IGNhbiBiZSBzdG9yZWQgdG8KLQkgKi8KKwkvKiBFbnN1cmUgd2UgaGF2ZSBhIFRhcmdldCB0aGF0IGNhbiBiZSBzdG9yZWQgdG8gKi8KKwogCXN3aXRjaCAodGFyZ2V0X3R5cGUpIHsKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgpAQCAtMTE4LDE2ICsxMTcsMTQgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJLyoKLQkJICogTXVzdCBoYXZlIGEgSW50ZWdlciwgQnVmZmVyLCBvciBTdHJpbmcKLQkJICovCisJCS8qIE11c3QgaGF2ZSBhIEludGVnZXIsIEJ1ZmZlciwgb3IgU3RyaW5nICovCisKIAkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSAgICYmCiAJCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSAgICAmJgogCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1NUUklORykgICAgJiYKIAkJCSEoKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgJiYgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9MT0FEX09QKSkpIHsKLQkJCS8qCi0JCQkgKiBDb252ZXJzaW9uIHN1Y2Nlc3NmdWwgYnV0IHN0aWxsIG5vdCBhIHZhbGlkIHR5cGUKLQkJCSAqLworCQkJLyogQ29udmVyc2lvbiBzdWNjZXNzZnVsIGJ1dCBzdGlsbCBub3QgYSB2YWxpZCB0eXBlICovCisKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJCSJDYW5ub3QgYXNzaWduIHR5cGUgJXMgdG8gJXMgKG11c3QgYmUgdHlwZSBJbnQvU3RyL0J1ZilcbiIsCiAJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpLApAQCAtMTQwLDkgKzEzNyw4IEBACiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVM6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTOgogCi0JCS8qCi0JCSAqIEFsaWFzZXMgYXJlIHJlc29sdmVkIGJ5IGFjcGlfZXhfcHJlcF9vcGVyYW5kcwotCQkgKi8KKwkJLyogQWxpYXNlcyBhcmUgcmVzb2x2ZWQgYnkgYWNwaV9leF9wcmVwX29wZXJhbmRzICovCisKIAkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU3RvcmUgaW50byBBbGlhcyAtIHNob3VsZCBuZXZlciBoYXBwZW5cbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKaW5kZXggMDVlMWVjYS4uMTJkMTUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKQEAgLTEyOCw3ICsxMjgsOCBAQAogCWVsc2UgewogCQkvKiBUcnVuY2F0ZSB0aGUgc291cmNlLCBjb3B5IG9ubHkgd2hhdCB3aWxsIGZpdCAqLwogCi0JCUFDUElfTUVNQ1BZICh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ1ZmZlciwgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWSAodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLCBidWZmZXIsCisJCQl0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CiAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKIAkJCSJUcnVuY2F0aW5nIHNvdXJjZSBidWZmZXIgZnJvbSAlWCB0byAlWFxuIiwKQEAgLTE4Myw3ICsxODQsOCBAQAogCQkgKiBTdHJpbmcgd2lsbCBmaXQgaW4gZXhpc3Rpbmcgbm9uLXN0YXRpYyBidWZmZXIuCiAJCSAqIENsZWFyIG9sZCBzdHJpbmcgYW5kIGNvcHkgaW4gdGhlIG5ldyBvbmUKIAkJICovCi0JCUFDUElfTUVNU0VUICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIDAsIChhY3BpX3NpemUpIHRhcmdldF9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCUFDUElfTUVNU0VUICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIDAsCisJCQkoYWNwaV9zaXplKSB0YXJnZXRfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDEpOwogCQlBQ1BJX01FTUNQWSAodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyLCBidWZmZXIsIGxlbmd0aCk7CiAJfQogCWVsc2UgewpAQCAtMTk4LDcgKzIwMCw4IEBACiAJCQlBQ1BJX01FTV9GUkVFICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOwogCQl9CiAKLQkJdGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgoYWNwaV9zaXplKSBsZW5ndGggKyAxKTsKKwkJdGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKKwkJCQkgICAoYWNwaV9zaXplKSBsZW5ndGggKyAxKTsKIAkJaWYgKCF0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3lzdGVtLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYwppbmRleCBmOTJlZmM1Li5jYWZhNzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYwpAQCAtNTUsOCArNTUsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZQogICoKLSAqIFBBUkFNRVRFUlM6ICBTZW1hcGhvcmUgICAgICAgICAgIC0gT1NEIHNlbWFwaG9yZSB0byB3YWl0IG9uCi0gKiAgICAgICAgICAgICAgVGltZW91dCAgICAgICAgICAgICAtIE1heCB0aW1lIHRvIHdhaXQKKyAqIFBBUkFNRVRFUlM6ICBTZW1hcGhvcmUgICAgICAgLSBTZW1hcGhvcmUgdG8gd2FpdCBvbgorICogICAgICAgICAgICAgIFRpbWVvdXQgICAgICAgICAtIE1heCB0aW1lIHRvIHdhaXQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtOTAsNyArOTAsOCBAQAogCiAJCXN0YXR1cyA9IGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUgKHNlbWFwaG9yZSwgMSwgdGltZW91dCk7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIioqKiBUaHJlYWQgYXdha2UgYWZ0ZXIgYmxvY2tpbmcsICVzXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIioqKiBUaHJlYWQgYXdha2UgYWZ0ZXIgYmxvY2tpbmcsICVzXG4iLAogCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAKIAkJLyogUmVhY3F1aXJlIHRoZSBpbnRlcnByZXRlciAqLwpAQCAtMTExLDggKzExMiw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2RvX3N0YWxsCiAgKgotICogUEFSQU1FVEVSUzogIGhvd19sb25nICAgICAgICAgICAgLSBUaGUgYW1vdW50IG9mIHRpbWUgdG8gc3RhbGwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pY3Jvc2Vjb25kcworICogUEFSQU1FVEVSUzogIGhvd19sb25nICAgICAgICAtIFRoZSBhbW91bnQgb2YgdGltZSB0byBzdGFsbCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWNyb3NlY29uZHMKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMTQxLDcgKzE0Miw4IEBACiAJCSAqIChBQ1BJIHNwZWNpZmllcyAxMDAgdXNlYyBhcyBtYXgsIGJ1dCB0aGlzIGdpdmVzIHNvbWUgc2xhY2sgaW4KIAkJICogb3JkZXIgdG8gc3VwcG9ydCBleGlzdGluZyBCSU9TcykKIAkJICovCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIlN0YWxsOiBUaW1lIHBhcmFtZXRlciBpcyB0b28gbGFyZ2UgKCVkKVxuIiwgaG93X2xvbmcpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU3RhbGw6IFRpbWUgcGFyYW1ldGVyIGlzIHRvbyBsYXJnZSAoJWQpXG4iLAorCQkJaG93X2xvbmcpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7CiAJfQogCWVsc2UgewpAQCAtMTU2LDggKzE1OCw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2RvX3N1c3BlbmQKICAqCi0gKiBQQVJBTUVURVJTOiAgaG93X2xvbmcgICAgICAgICAgICAtIFRoZSBhbW91bnQgb2YgdGltZSB0byBzdXNwZW5kLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMKKyAqIFBBUkFNRVRFUlM6ICBob3dfbG9uZyAgICAgICAgLSBUaGUgYW1vdW50IG9mIHRpbWUgdG8gc3VzcGVuZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTE5Miw4ICsxOTQsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV9hY3F1aXJlX211dGV4CiAgKgotICogUEFSQU1FVEVSUzogICp0aW1lX2Rlc2MgICAgICAgICAgLSBUaGUgJ3RpbWUgdG8gZGVsYXknIG9iamVjdCBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgKm9ial9kZXNjICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAtIFRoZSAndGltZSB0byBkZWxheScgb2JqZWN0IGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjE4LDE2ICsyMjAsMTUgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKgotCSAqIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSBnbyBnZXQgdGhlIGdsb2JhbCBsb2NrCi0JICovCisJLyogU3VwcG9ydCBmb3IgdGhlIF9HTF8gTXV0ZXggb2JqZWN0IC0tIGdvIGdldCB0aGUgZ2xvYmFsIGxvY2sgKi8KKwogCWlmIChvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlID09IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSkgewogCQlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKCh1MTYpIHRpbWVfZGVzYy0+aW50ZWdlci52YWx1ZSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSAob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSwKLQkJCSAgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJCSAodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KIApAQCAtMjM2LDcgKzIzNyw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yNjEsOSArMjYyLDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKgotCSAqIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSByZWxlYXNlIHRoZSBnbG9iYWwgbG9jawotCSAqLworCS8qIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSByZWxlYXNlIHRoZSBnbG9iYWwgbG9jayAqLworCiAJaWYgKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSB7CiAJCXN0YXR1cyA9IGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayAoKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMjc4LDkgKzI3OCw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudAogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCiAgKgotICogUkVUVVJOOiAgICAgIEFFX09LCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IFByb3ZpZGVzIGFuIGFjY2VzcyBwb2ludCB0byBwZXJmb3JtIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zCiAgKiAgICAgICAgICAgICAgd2l0aGluIHRoZSBBTUwuCkBAIC0zMDksOCArMzA5LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9ldmVudAogICoKLSAqIFBBUkFNRVRFUlM6ICAqdGltZV9kZXNjICAgICAgICAgIC0gVGhlICd0aW1lIHRvIGRlbGF5JyBvYmplY3QgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgICpvYmpfZGVzYyAgICAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKKyAqIFBBUkFNRVRFUlM6ICB0aW1lX2Rlc2MgICAgICAgLSBUaGUgJ3RpbWUgdG8gZGVsYXknIG9iamVjdCBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTMzMyw3ICszMzMsNyBAQAogCiAJaWYgKG9ial9kZXNjKSB7CiAJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlIChvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlLAotCQkJCSAgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJCQkgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fcmVzZXRfZXZlbnQKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYwppbmRleCA0MGM2YWJiLi41YzdlYzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKQEAgLTY3LDIyICs2NywzMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4dXRpbHMiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB1MzIKK2FjcGlfZXhfZGlnaXRzX25lZWRlZCAoCisJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpOworCiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCiAgKiBERVNDUklQVElPTjogRW50ZXIgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24uICBGYWlsdXJlIHRvIGVudGVyCiAgKiAgICAgICAgICAgICAgdGhlIGludGVycHJldGVyIHJlZ2lvbiBpcyBhIGZhdGFsIHN5c3RlbSBlcnJvcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2VudGVyX2ludGVycHJldGVyICh2b2lkKQorYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIApAQCAtMTA0LDYgKzExMyw4IEBACiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBFeGl0IHRoZSBpbnRlcnByZXRlciBleGVjdXRpb24gcmVnaW9uCiAgKgogICogQ2FzZXMgd2hlcmUgdGhlIGludGVycHJldGVyIGlzIHVubG9ja2VkOgpAQCAtMTE5LDcgKzEzMCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKHZvaWQpCithY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKAorCXZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKQEAgLTIxMiw3ICsyMjQsOCBAQAogCQkJbG9ja2VkID0gVFJVRTsKIAkJfQogCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ291bGQgbm90IGFjcXVpcmUgR2xvYmFsIExvY2ssICVzXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIkNvdWxkIG5vdCBhY3F1aXJlIEdsb2JhbCBMb2NrLCAlc1xuIiwKIAkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJfQogCX0KQEAgLTIyOCw3ICsyNDEsNyBAQAogICogUEFSQU1FVEVSUzogIGxvY2tlZF9ieV9tZSAgICAtIFJldHVybiB2YWx1ZSBmcm9tIGNvcnJlc3BvbmRpbmcgY2FsbCB0bwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVfZ2xvYmFsX2xvY2suCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogUmVsZWFzZSB0aGUgZ2xvYmFsIGxvY2sgaWYgaXQgaXMgbG9ja2VkLgogICoKQEAgLTI2OSwxMSArMjgyLDE0IEBACiAgKiBQQVJBTUVURVJTOiAgVmFsdWUgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgcmVwcmVzZW50ZWQKICAqICAgICAgICAgICAgICBCYXNlICAgICAgICAgICAgLSBCYXNlIG9mIHJlcHJlc2VudGF0aW9uCiAgKgotICogUkVUVVJOOiAgICAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIG5lZWRlZCB0byByZXByZXNlbnQgVmFsdWUgaW4gQmFzZQorICogUkVUVVJOOiAgICAgIFRoZSBudW1iZXIgb2YgZGlnaXRzLgorICoKKyAqIERFU0NSSVBUSU9OOiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkaWdpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgVmFsdWUKKyAqICAgICAgICAgICAgICBpbiB0aGUgZ2l2ZW4gQmFzZSAoUmFkaXgpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCitzdGF0aWMgdTMyCiBhY3BpX2V4X2RpZ2l0c19uZWVkZWQgKAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlKQpAQCAtMzEyLDYgKzMyOCw4IEBACiAgKiBQQVJBTUVURVJTOiAgbnVtZXJpY19pZCAgICAgIC0gRUlTQSBJRCB0byBiZSBjb252ZXJ0ZWQKICAqICAgICAgICAgICAgICBvdXRfc3RyaW5nICAgICAgLSBXaGVyZSB0byBwdXQgdGhlIGNvbnZlcnRlZCBzdHJpbmcgKDggYnl0ZXMpCiAgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBhIG51bWVyaWMgRUlTQSBJRCB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzQ5LDcgKzM2NywxMCBAQAogICogUEFSQU1FVEVSUzogIFZhbHVlICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZAogICogICAgICAgICAgICAgIG91dF9zdHJpbmcgICAgICAtIFdoZXJlIHRvIHB1dCB0aGUgY29udmVydGVkIHN0cmluZyAoOCBieXRlcykKICAqCi0gKiBSRVRVUk46ICAgICAgQ29udmVydCBhIG51bWJlciB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAqIFJFVFVSTjogICAgICBOb25lLCBzdHJpbmcKKyAqCisgKiBERVNDUklQVE9JTjogQ29udmVydCBhIG51bWJlciB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24uIEFzc3VtZXMgc3RyaW5nCisgKiAgICAgICAgICAgICAgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBzdHJpbmcuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwY2ZjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBMaW5rIHBoeXNpY2FsIGRldmljZXMgd2l0aCBBQ1BJIGRldmljZXMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTaGFvaHVhIExpIDxzaGFvaHVhLmxpQGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBJbnRlbCBDb3JwLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisjZGVmaW5lIEFDUElfR0xVRV9ERUJVRwkwCisjaWYgQUNQSV9HTFVFX0RFQlVHCisjZGVmaW5lIERCRyh4Li4uKSBwcmludGsoUFJFRklYIHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikKKyNlbmRpZgorc3RhdGljIExJU1RfSEVBRChidXNfdHlwZV9saXN0KTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKGJ1c190eXBlX3NlbSk7CisKK2ludCByZWdpc3Rlcl9hY3BpX2J1c190eXBlKHN0cnVjdCBhY3BpX2J1c190eXBlICp0eXBlKQoreworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAodHlwZSAmJiB0eXBlLT5idXMgJiYgdHlwZS0+ZmluZF9kZXZpY2UpIHsKKwkJZG93bl93cml0ZSgmYnVzX3R5cGVfc2VtKTsKKwkJbGlzdF9hZGRfdGFpbCgmdHlwZS0+bGlzdCwgJmJ1c190eXBlX2xpc3QpOworCQl1cF93cml0ZSgmYnVzX3R5cGVfc2VtKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggImJ1cyB0eXBlICVzIHJlZ2lzdGVyZWRcbiIsIHR5cGUtPmJ1cy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9hY3BpX2J1c190eXBlKTsKKworaW50IHVucmVnaXN0ZXJfYWNwaV9idXNfdHlwZShzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqdHlwZSkKK3sKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisJaWYgKHR5cGUpIHsKKwkJZG93bl93cml0ZSgmYnVzX3R5cGVfc2VtKTsKKwkJbGlzdF9kZWxfaW5pdCgmdHlwZS0+bGlzdCk7CisJCXVwX3dyaXRlKCZidXNfdHlwZV9zZW0pOworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiQUNQSSBidXMgdHlwZSAlcyB1bnJlZ2lzdGVyZWRcbiIsIHR5cGUtPmJ1cy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUpOworCitzdGF0aWMgc3RydWN0IGFjcGlfYnVzX3R5cGUgKmFjcGlfZ2V0X2J1c190eXBlKHN0cnVjdCBidXNfdHlwZSAqdHlwZSkKK3sKKwlzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqdG1wLCAqcmV0ID0gTlVMTDsKKworCWRvd25fcmVhZCgmYnVzX3R5cGVfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmJ1c190eXBlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRtcC0+YnVzID09IHR5cGUpIHsKKwkJCXJldCA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwX3JlYWQoJmJ1c190eXBlX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhY3BpX2ZpbmRfYnJpZGdlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGFjcGlfaGFuZGxlICogaGFuZGxlKQoreworCXN0cnVjdCBhY3BpX2J1c190eXBlICp0bXA7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlkb3duX3JlYWQoJmJ1c190eXBlX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZidXNfdHlwZV9saXN0LCBsaXN0KSB7CisJCWlmICh0bXAtPmZpbmRfYnJpZGdlICYmICF0bXAtPmZpbmRfYnJpZGdlKGRldiwgaGFuZGxlKSkgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwX3JlYWQoJmJ1c190eXBlX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyogR2V0IFBDSSByb290IGJyaWRnZSdzIGhhbmRsZSBmcm9tIGl0cyBzZWdtZW50IGFuZCBidXMgbnVtYmVyICovCitzdHJ1Y3QgYWNwaV9maW5kX3BjaV9yb290IHsKKwl1bnNpZ25lZCBpbnQgc2VnOworCXVuc2lnbmVkIGludCBidXM7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworfTsKKworc3RhdGljIGFjcGlfc3RhdHVzCitkb19yb290X2JyaWRnZV9idXNucl9jYWxsYmFjayhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmRhdGEpCit7CisJaW50ICpidXNuciA9IChpbnQgKilkYXRhOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyZXNzOworCisJaWYgKHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9BRERSRVNTMTYgJiYKKwkgICAgcmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX0FERFJFU1MzMiAmJgorCSAgICByZXNvdXJjZS0+aWQgIT0gQUNQSV9SU1RZUEVfQUREUkVTUzY0KQorCQlyZXR1cm4gQUVfT0s7CisKKwlhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChyZXNvdXJjZSwgJmFkZHJlc3MpOworCWlmICgoYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCA+IDApICYmCisJICAgIChhZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9CVVNfTlVNQkVSX1JBTkdFKSkKKwkJKmJ1c25yID0gYWRkcmVzcy5taW5fYWRkcmVzc19yYW5nZTsKKworCXJldHVybiBBRV9PSzsKK30KKworc3RhdGljIGludCBnZXRfcm9vdF9icmlkZ2VfYnVzbnIoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgYnVzLCBiYm47CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKworCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX0JCTiwgTlVMTCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgKikmYmJuKTsKKwlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgeworCQkvKiBBc3N1bWUgYnVzID0gMCAqLworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkgICAgICAgIkFzc3VtZSByb290IGJyaWRnZSBbJXNdIGJ1cyBpcyAwXG4iLAorCQkgICAgICAgKGNoYXIgKilidWZmZXIucG9pbnRlcik7CisJCXN0YXR1cyA9IEFFX09LOworCQliYm4gPSAwOworCX0KKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYmJuID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKwlpZiAoYmJuID4gMCkKKwkJZ290byBleGl0OworCisJLyogX0JCTiBpbiBzb21lIHN5c3RlbXMgcmV0dXJuIDAgZm9yIGFsbCByb290IGJyaWRnZXMgKi8KKwlidXMgPSAtMTsKKwlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCQkgICAgIGRvX3Jvb3RfYnJpZGdlX2J1c25yX2NhbGxiYWNrLCAmYnVzKTsKKwkvKiBJZiBfQ1JTIGZhaWxlZCwgd2UganVzdCB1c2UgX0JCTiAqLworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAoYnVzID09IC0xKSkKKwkJZ290byBleGl0OworCS8qIFdlIHNlbGVjdCBfQ1JTICovCisJaWYgKGJibiAhPSBidXMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJICAgICAgICJfQkJOIGFuZCBfQ1JTIHJldHVybnMgZGlmZmVyZW50IHZhbHVlIGZvciAlcy4gU2VsZWN0IF9DUlNcbiIsCisJCSAgICAgICAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKKwkJYmJuID0gYnVzOworCX0KKyAgICAgIGV4aXQ6CisJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwlyZXR1cm4gYmJuOworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMKK2ZpbmRfcGNpX3Jvb3RicmlkZ2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJc3RydWN0IGFjcGlfZmluZF9wY2lfcm9vdCAqZmluZCA9IChzdHJ1Y3QgYWNwaV9maW5kX3BjaV9yb290ICopY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIHNlZywgYnVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgdG1wOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIE1FVEhPRF9OQU1FX19TRUcsIE5VTEwsICZzZWcpOworCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CisJCS8qIEFzc3VtZSBzZWcgPSAwICovCisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCSAgICAgICAiQXNzdW1lIHJvb3QgYnJpZGdlIFslc10gc2VnbWVudCBpcyAwXG4iLAorCQkgICAgICAgKGNoYXIgKilidWZmZXIucG9pbnRlcik7CisJCXN0YXR1cyA9IEFFX09LOworCQlzZWcgPSAwOworCX0KKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gQUVfQ1RSTF9ERVBUSDsKKwkJZ290byBleGl0OworCX0KKworCXRtcCA9IGdldF9yb290X2JyaWRnZV9idXNucihoYW5kbGUpOworCWlmICh0bXAgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJGaW5kIHJvb3QgYnJpZGdlIGZhaWxlZCBmb3IgJXNcbiIsCisJCSAgICAgICAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKKwkJc3RhdHVzID0gQUVfQ1RSTF9ERVBUSDsKKwkJZ290byBleGl0OworCX0KKwlidXMgPSB0bXA7CisKKwlpZiAoc2VnID09IGZpbmQtPnNlZyAmJiBidXMgPT0gZmluZC0+YnVzKQorCQlmaW5kLT5oYW5kbGUgPSBoYW5kbGU7CisJc3RhdHVzID0gQUVfT0s7CisgICAgICBleGl0OgorCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CisJcmV0dXJuIHN0YXR1czsKK30KKworYWNwaV9oYW5kbGUgYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMpCit7CisJc3RydWN0IGFjcGlfZmluZF9wY2lfcm9vdCBmaW5kID0geyBzZWcsIGJ1cywgTlVMTCB9OworCisJYWNwaV9nZXRfZGV2aWNlcyhQQ0lfUk9PVF9ISURfU1RSSU5HLCBmaW5kX3BjaV9yb290YnJpZGdlLCAmZmluZCwgTlVMTCk7CisJcmV0dXJuIGZpbmQuaGFuZGxlOworfQorCisvKiBHZXQgZGV2aWNlJ3MgaGFuZGxlciBwZXIgaXRzIGFkZHJlc3MgdW5kZXIgaXRzIHBhcmVudCAqLworc3RydWN0IGFjcGlfZmluZF9jaGlsZCB7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWFjcGlfaW50ZWdlciBhZGRyZXNzOworfTsKKworc3RhdGljIGFjcGlfc3RhdHVzCitkb19hY3BpX2ZpbmRfY2hpbGQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IGFjcGlfZmluZF9jaGlsZCAqZmluZCA9IChzdHJ1Y3QgYWNwaV9maW5kX2NoaWxkICopY29udGV4dDsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X29iamVjdF9pbmZvKGhhbmRsZSwgJmJ1ZmZlcik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWluZm8gPSBidWZmZXIucG9pbnRlcjsKKwkJaWYgKGluZm8tPmFkZHJlc3MgPT0gZmluZC0+YWRkcmVzcykKKwkJCWZpbmQtPmhhbmRsZSA9IGhhbmRsZTsKKwkJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwl9CisJcmV0dXJuIEFFX09LOworfQorCithY3BpX2hhbmRsZSBhY3BpX2dldF9jaGlsZChhY3BpX2hhbmRsZSBwYXJlbnQsIGFjcGlfaW50ZWdlciBhZGRyZXNzKQoreworCXN0cnVjdCBhY3BpX2ZpbmRfY2hpbGQgZmluZCA9IHsgTlVMTCwgYWRkcmVzcyB9OworCisJaWYgKCFwYXJlbnQpCisJCXJldHVybiBOVUxMOworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgcGFyZW50LAorCQkJICAgIDEsIGRvX2FjcGlfZmluZF9jaGlsZCwgJmZpbmQsIE5VTEwpOworCXJldHVybiBmaW5kLmhhbmRsZTsKK30KKworRVhQT1JUX1NZTUJPTChhY3BpX2dldF9jaGlsZCk7CisKKy8qIExpbmsgQUNQSSBkZXZpY2VzIHdpdGggcGh5c2ljYWwgZGV2aWNlcyAqLworc3RhdGljIHZvaWQgYWNwaV9nbHVlX2RhdGFfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJICAgdTMyIGZ1bmN0aW9uLCB2b2lkICpjb250ZXh0KQoreworCS8qIHdlIHByb3ZpZGUgYW4gZW1wdHkgaGFuZGxlciAqLworfQorCisvKiBOb3RlOiBhIHN1Y2Nlc3MgY2FsbCB3aWxsIGluY3JlYXNlIHJlZmVyZW5jZSBjb3VudCBieSBvbmUgKi8KK3N0cnVjdCBkZXZpY2UgKmFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoaGFuZGxlLCBhY3BpX2dsdWVfZGF0YV9oYW5kbGVyLCAodm9pZCAqKikmZGV2KTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiBnZXRfZGV2aWNlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKTsKKworc3RhdGljIGludCBhY3BpX2JpbmRfb25lKHN0cnVjdCBkZXZpY2UgKmRldiwgYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmIChkZXYtPmZpcm13YXJlX2RhdGEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJICAgICAgICJEcml2ZXJzIGNoYW5nZWQgJ2Zpcm13YXJlX2RhdGEnIGZvciAlc1xuIiwgZGV2LT5idXNfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZ2V0X2RldmljZShkZXYpOworCXN0YXR1cyA9IGFjcGlfYXR0YWNoX2RhdGEoaGFuZGxlLCBhY3BpX2dsdWVfZGF0YV9oYW5kbGVyLCBkZXYpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwdXRfZGV2aWNlKGRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXYtPmZpcm13YXJlX2RhdGEgPSBoYW5kbGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX3VuYmluZF9vbmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICghZGV2LT5maXJtd2FyZV9kYXRhKQorCQlyZXR1cm4gMDsKKwlpZiAoZGV2ID09IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShkZXYtPmZpcm13YXJlX2RhdGEpKSB7CisJCS8qIGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZSBpbmNyZWFzZSByZWZjbnQgYnkgb25lICovCisJCXB1dF9kZXZpY2UoZGV2KTsKKwkJYWNwaV9kZXRhY2hfZGF0YShkZXYtPmZpcm13YXJlX2RhdGEsIGFjcGlfZ2x1ZV9kYXRhX2hhbmRsZXIpOworCQlkZXYtPmZpcm13YXJlX2RhdGEgPSBOVUxMOworCQkvKiBhY3BpX2JpbmRfb25lIGluY3JlYXNlIHJlZmNudCBieSBvbmUgKi8KKwkJcHV0X2RldmljZShkZXYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJPb3BzLCAnZmlybXdhcmVfZGF0YScgY29ycnVwdCBmb3IgJXNcbiIsIGRldi0+YnVzX2lkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9wbGF0Zm9ybV9ub3RpZnkoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhY3BpX2J1c190eXBlICp0eXBlOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmICghZGV2LT5idXMgfHwgIWRldi0+cGFyZW50KSB7CisJCS8qIGJyaWRnZSBkZXZpY2VzIGdlbmVybmFsbHkgaGF2ZW4ndCBidXMgb3IgcGFyZW50ICovCisJCXJldCA9IGFjcGlfZmluZF9icmlkZ2VfZGV2aWNlKGRldiwgJmhhbmRsZSk7CisJCWdvdG8gZW5kOworCX0KKwl0eXBlID0gYWNwaV9nZXRfYnVzX3R5cGUoZGV2LT5idXMpOworCWlmICghdHlwZSkgeworCQlEQkcoIk5vIEFDUEkgYnVzIHN1cHBvcnQgZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKwlpZiAoKHJldCA9IHR5cGUtPmZpbmRfZGV2aWNlKGRldiwgJmhhbmRsZSkpICE9IDApCisJCURCRygiQ2FuJ3QgZ2V0IGhhbmRsZXIgZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CisgICAgICBlbmQ6CisJaWYgKCFyZXQpCisJCWFjcGlfYmluZF9vbmUoZGV2LCBoYW5kbGUpOworCisjaWYgQUNQSV9HTFVFX0RFQlVHCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKworCQlhY3BpX2dldF9uYW1lKGRldi0+ZmlybXdhcmVfZGF0YSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKKwkJREJHKCJEZXZpY2UgJXMgLT4gJXNcbiIsIGRldi0+YnVzX2lkLCAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKKwkJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwl9IGVsc2UKKwkJREJHKCJEZXZpY2UgJXMgLT4gTm8gQUNQSSBzdXBwb3J0XG4iLCBkZXYtPmJ1c19pZCk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9wbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlhY3BpX3VuYmluZF9vbmUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9hY3BpX2RldmljZV9ub3RpZnkodm9pZCkKK3sKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisJaWYgKHBsYXRmb3JtX25vdGlmeSB8fCBwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkNhbid0IHVzZSBwbGF0Zm9ybV9ub3RpZnlcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcGxhdGZvcm1fbm90aWZ5ID0gYWNwaV9wbGF0Zm9ybV9ub3RpZnk7CisJcGxhdGZvcm1fbm90aWZ5X3JlbW92ZSA9IGFjcGlfcGxhdGZvcm1fbm90aWZ5X3JlbW92ZTsKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChpbml0X2FjcGlfZGV2aWNlX25vdGlmeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMKaW5kZXggNTI5ZTkyMi4uYjUxMDAxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYwpAQCAtNTgsNyArNTgsOCBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBhbmQgdmFsaWRhdGUgdmFyaW91cyBBQ1BJIHJlZ2lzdGVycworICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYW5kIHZhbGlkYXRlIHRoZSB2YXJpb3VzIEFDUEkgcmVnaXN0ZXJzIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICB0aGUgRkFEVC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC03NSw3ICs3Niw3IEBACiAJLyogV2UgbXVzdCBoYXZlIHRoZSBBQ1BJIHRhYmxlcyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSAqLwogCiAJaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQSBGQURUIGlzIG5vdCBsb2FkZWRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJObyBGQURUIGlzIHByZXNlbnRcbiIpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CkBAIC0xMzEsNyArMTMyLDggQEAKIAkgKiB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KIAkgKi8KIAlpZiAoIWFjcGlfZ2JsX0ZBRFQtPmFjcGlfZW5hYmxlICYmICFhY3BpX2dibF9GQURULT5hY3BpX2Rpc2FibGUpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTm8gQUNQSSBtb2RlIHRyYW5zaXRpb24gc3VwcG9ydGVkIGluIHRoaXMgc3lzdGVtIChlbmFibGUvZGlzYWJsZSBib3RoIHplcm8pXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiTm8gQUNQSSBtb2RlIHRyYW5zaXRpb24gc3VwcG9ydGVkIGluIHRoaXMgc3lzdGVtIChlbmFibGUvZGlzYWJsZSBib3RoIHplcm8pXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCX0KIApAQCAtMTYyLDcgKzE2NCw4IEBACiAJfQogCiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3Qgd3JpdGUgbW9kZSBjaGFuZ2UsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IHdyaXRlIG1vZGUgY2hhbmdlLCAlc1xuIiwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCkBAIC0xNzMsNyArMTc2LDggQEAKIAlyZXRyeSA9IDMwMDA7CiAJd2hpbGUgKHJldHJ5KSB7CiAJCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gbW9kZSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIk1vZGUgJVggc3VjY2Vzc2Z1bGx5IGVuYWJsZWRcbiIsIG1vZGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJNb2RlICVYIHN1Y2Nlc3NmdWxseSBlbmFibGVkXG4iLAorCQkJCW1vZGUpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCQl9CiAJCWFjcGlfb3Nfc3RhbGwoMTAwMCk7CkBAIC0xODUsNyArMTg5LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2dldF9tb2RlCiAgKgpAQCAtMTk5LDcgKzIwMyw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1MzIKLWFjcGlfaHdfZ2V0X21vZGUgKHZvaWQpCithY3BpX2h3X2dldF9tb2RlICgKKwl2b2lkKQogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCmluZGV4IDlhYzFkNjMuLjhkYWVhYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCkBAIC00OCw2ICs0OCwxMyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImh3Z3BlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2sgKAorCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAorCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEzNSw2ICsxNDIsNyBAQAogICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgc3RhdHVzIG9mIGEgc2luZ2xlIEdQRS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX2h3X2dldF9ncGVfc3RhdHVzICgKQEAgLTIwNiw3ICsyMTQsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRGlzYWJsZSBhbGwgR1BFcyB3aXRoaW4gYSBHUEUgYmxvY2sKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFsbCBHUEVzIHdpdGhpbiBhIHNpbmdsZSBHUEUgYmxvY2sKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNDQsNyArMjUyLDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IENsZWFyIHN0YXR1cyBiaXRzIGZvciBhbGwgR1BFcyB3aXRoaW4gYSBHUEUgYmxvY2sKKyAqIERFU0NSSVBUSU9OOiBDbGVhciBzdGF0dXMgYml0cyBmb3IgYWxsIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jawogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTI4Miw4ICsyOTAsOCBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAicnVudGltZSIgR1BFcyB3aXRoaW4gYSBHUEUgYmxvY2suIChJbmNsdWRlcwotICogICAgICAgICAgICAgIGNvbWJpbmF0aW9uIHdha2UvcnVuIEdQRXMuKQorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jay4gSW5jbHVkZXMKKyAqICAgICAgICAgICAgICBjb21iaW5hdGlvbiB3YWtlL3J1biBHUEVzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTMyNywxMiArMzM1LDEyIEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFbmFibGUgYWxsICJ3YWtlIiBHUEVzIHdpdGhpbiBhIEdQRSBibG9jay4gIChJbmNsdWRlcwotICogICAgICAgICAgICAgIGNvbWJpbmF0aW9uIHdha2UvcnVuIEdQRXMuKQorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgIndha2UiIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jay4gSW5jbHVkZXMKKyAqICAgICAgICAgICAgICBjb21iaW5hdGlvbiB3YWtlL3J1biBHUEVzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2sgKAogCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaykKQEAgLTM1MCw3ICszNTgsOCBAQAogCiAJCS8qIEVuYWJsZSBhbGwgIndha2UiIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICg4LCBncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uZW5hYmxlX2Zvcl93YWtlLAorCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoOCwKKwkJCQkgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9mb3Jfd2FrZSwKIAkJCQkgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5lbmFibGVfYWRkcmVzcyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybiAoc3RhdHVzKTsKQEAgLTM2OSw3ICszNzgsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRGlzYWJsZSBhbmQgY2xlYXIgYWxsIEdQRXMKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFuZCBjbGVhciBhbGwgR1BFcyBpbiBhbGwgR1BFIGJsb2NrcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTM5Nyw3ICs0MDYsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCBHUEVzIG9mIHRoZSBnaXZlbiB0eXBlCisgKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAicnVudGltZSIgR1BFcywgaW4gYWxsIEdQRSBibG9ja3MKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00MjQsNyArNDMzLDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgR1BFcyBvZiB0aGUgZ2l2ZW4gdHlwZQorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgIndha2V1cCIgR1BFcywgaW4gYWxsIEdQRSBibG9ja3MKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKaW5kZXggOTFhZjBjMi4uNmQ5ZTRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYwpAQCAtODcsOCArODcsOSBAQAogCQl9CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKLQkJCSAgQUNQSV9CSVRNQVNLX0FMTF9GSVhFRF9TVEFUVVMpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCSBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CkBAIC0xMzgsMjggKzEzOSwzMCBAQAogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICBpbmZvOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNsZWVwX3N0YXRlX25hbWU7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEiKTsKIAogCi0JLyoKLQkgKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzCi0JICovCisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLworCiAJaWYgKChzbGVlcF9zdGF0ZSA+IEFDUElfU19TVEFURVNfTUFYKSB8fAogCQkhc2xlZXBfdHlwZV9hIHx8ICFzbGVlcF90eXBlX2IpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKgotCSAqIEV2YWx1YXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgdGhpcyBzdGF0ZQotCSAqLworCS8qIEV2YWx1YXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgdGhpcyBzdGF0ZSAqLworCiAJaW5mby5wYXJhbWV0ZXJzID0gTlVMTDsKLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X25hbWUgKChjaGFyICopIGFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXSwKLQkJCSAgJmluZm8pOworCWluZm8ucmV0dXJuX29iamVjdCA9IE5VTEw7CisJc2xlZXBfc3RhdGVfbmFtZSA9IChjaGFyICopIGFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXTsKKworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZSAoc2xlZXBfc3RhdGVfbmFtZSwgJmluZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIiVzIHdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXVxuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwgYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbc2xlZXBfc3RhdGVdKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiJXMgd2hpbGUgZXZhbHVhdGluZyBzbGVlcF9zdGF0ZSBbJXNdXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBzbGVlcF9zdGF0ZV9uYW1lKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTE2Nyw0NSArMTcwLDU3IEBACiAJLyogTXVzdCBoYXZlIGEgcmV0dXJuIG9iamVjdCAqLwogCiAJaWYgKCFpbmZvLnJldHVybl9vYmplY3QpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWlzc2luZyBTbGVlcCBTdGF0ZSBvYmplY3RcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTm8gU2xlZXAgU3RhdGUgb2JqZWN0IHJldHVybmVkIGZyb20gWyVzXVxuIiwKKwkJCXNsZWVwX3N0YXRlX25hbWUpKTsKIAkJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwogCX0KIAogCS8qIEl0IG11c3QgYmUgb2YgdHlwZSBQYWNrYWdlICovCiAKIAllbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW5mby5yZXR1cm5fb2JqZWN0KSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCBTdGF0ZSBvYmplY3Qgbm90IGEgUGFja2FnZVxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCBTdGF0ZSByZXR1cm4gb2JqZWN0IGlzIG5vdCBhIFBhY2thZ2VcbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAl9CiAKLQkvKiBUaGUgcGFja2FnZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzICovCi0KKwkvKgorCSAqIFRoZSBwYWNrYWdlIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuICBOT1RFIChNYXJjaCAyMDA1KTogVGhpcworCSAqIGdvZXMgYWdhaW5zdCB0aGUgY3VycmVudCBBQ1BJIHNwZWMgd2hpY2ggZGVmaW5lcyB0aGlzIG9iamVjdCBhcyBhCisJICogcGFja2FnZSB3aXRoIG9uZSBlbmNvZGVkIERXT1JEIGVsZW1lbnQuICBIb3dldmVyLCBleGlzdGluZyBwcmFjdGljZQorCSAqIGJ5IEJJT1MgdmVuZG9ycyBzZWVtcyB0byBiZSB0byBoYXZlIDIgb3IgbW9yZSBlbGVtZW50cywgYXQgbGVhc3QKKwkgKiBvbmUgcGVyIHNsZWVwIHR5cGUgKEEvQikuCisJICovCiAJZWxzZSBpZiAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmNvdW50IDwgMikgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCBTdGF0ZSBwYWNrYWdlIGRvZXMgbm90IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiU2xlZXAgU3RhdGUgcmV0dXJuIHBhY2thZ2UgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHNcbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX05PX09QRVJBTkQ7CiAJfQogCiAJLyogVGhlIGZpcnN0IHR3byBlbGVtZW50cyBtdXN0IGJvdGggYmUgb2YgdHlwZSBJbnRlZ2VyICovCiAKLQllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSkgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHx8Ci0JCQkgKEFDUElfR0VUX09CSkVDVF9UWVBFIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCBTdGF0ZSBwYWNrYWdlIGVsZW1lbnRzIGFyZSBub3QgYm90aCBJbnRlZ2VycyAoJXMsICVzKVxuIiwKKwllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSkKKwkJCSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgfHwKKwkJCSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSkKKwkJCQkhPSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJTbGVlcCBTdGF0ZSByZXR1cm4gcGFja2FnZSBlbGVtZW50cyBhcmUgbm90IGJvdGggSW50ZWdlcnMgKCVzLCAlcylcbiIsCiAJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pLAogCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCX0KIAllbHNlIHsKLQkJLyoKLQkJICogVmFsaWQgX1N4XyBwYWNrYWdlIHNpemUsIHR5cGUsIGFuZCB2YWx1ZQotCQkgKi8KLQkJKnNsZWVwX3R5cGVfYSA9ICh1OCkgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSktPmludGVnZXIudmFsdWU7Ci0JCSpzbGVlcF90eXBlX2IgPSAodTgpIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pLT5pbnRlZ2VyLnZhbHVlOworCQkvKiBWYWxpZCBfU3hfIHBhY2thZ2Ugc2l6ZSwgdHlwZSwgYW5kIHZhbHVlICovCisKKwkJKnNsZWVwX3R5cGVfYSA9ICh1OCkKKwkJCShpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pLT5pbnRlZ2VyLnZhbHVlOworCQkqc2xlZXBfdHlwZV9iID0gKHU4KQorCQkJKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSktPmludGVnZXIudmFsdWU7CiAJfQogCiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJXaGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc10sIGJhZCBTbGVlcCBvYmplY3QgJXAgdHlwZSAlc1xuIiwKLQkJCWFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXSwgaW5mby5yZXR1cm5fb2JqZWN0LAorCQkJIiVzIFdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXSwgYmFkIFNsZWVwIG9iamVjdCAlcCB0eXBlICVzXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLAorCQkJc2xlZXBfc3RhdGVfbmFtZSwgaW5mby5yZXR1cm5fb2JqZWN0LAogCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoaW5mby5yZXR1cm5fb2JqZWN0KSkpOwogCX0KIApAQCAtMjIxLDkgKzIzNiw5IEBACiAgKgogICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAgICAgLSBJbmRleCBvZiBBQ1BJIFJlZ2lzdGVyIHRvIGFjY2VzcwogICoKLSAqIFJFVFVSTjogICAgICBUaGUgYml0IG1hc2sgdG8gYmUgdXNlZCB3aGVuIGFjY2Vzc2luZyB0aGUgcmVnaXN0ZXIKKyAqIFJFVFVSTjogICAgICBUaGUgYml0bWFzayB0byBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIHRoZSByZWdpc3RlcgogICoKLSAqIERFU0NSSVBUSU9OOiBNYXAgcmVnaXN0ZXJfaWQgaW50byBhIHJlZ2lzdGVyIGJpdCBtYXNrLgorICogREVTQ1JJUFRJT046IE1hcCByZWdpc3Rlcl9pZCBpbnRvIGEgcmVnaXN0ZXIgYml0bWFzay4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zNTksNyArMzc0LDcgQEAKIAkvKiBBbHdheXMgZG8gYSByZWdpc3RlciByZWFkIGZpcnN0IHNvIHdlIGNhbiBpbnNlcnQgdGhlIG5ldyBiaXRzICAqLwogCiAJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCSAgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsICZyZWdpc3Rlcl92YWx1ZSk7CisJCQkgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsICZyZWdpc3Rlcl92YWx1ZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CkBAIC0zOTYsNyArNDExLDcgQEAKIAkJCQliaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywgdmFsdWUpOwogCiAJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSAgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLCAodTE2KSByZWdpc3Rlcl92YWx1ZSk7CisJCQkJIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgKHUxNikgcmVnaXN0ZXJfdmFsdWUpOwogCQlicmVhazsKIAogCkBAIC00MTMsNyArNDI4LDcgQEAKIAkJCQliaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywgdmFsdWUpOwogCiAJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSAgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgKHUxNikgcmVnaXN0ZXJfdmFsdWUpOworCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAodTE2KSByZWdpc3Rlcl92YWx1ZSk7CiAJCWJyZWFrOwogCiAKQEAgLTQyNywxNyArNDQyLDE5IEBACiAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJQTTIgY29udHJvbDogUmVhZCAlWCBmcm9tICU4LjhYJTguOFhcbiIsCiAJCQlyZWdpc3Rlcl92YWx1ZSwKLQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CisJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKAorCQkJCWFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzKSkpOwogCiAJCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFIChyZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCiAJCQkJYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssIHZhbHVlKTsKIAogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIkFib3V0IHRvIHdyaXRlICU0LjRYIHRvICU4LjhYJTguOFhcbiIsCiAJCQlyZWdpc3Rlcl92YWx1ZSwKLQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CisJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKAorCQkJCWFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzKSkpOwogCiAJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSAgIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsICh1OCkgKHJlZ2lzdGVyX3ZhbHVlKSk7CisJCQkJIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsICh1OCkgKHJlZ2lzdGVyX3ZhbHVlKSk7CiAJCWJyZWFrOwogCiAKQEAgLTQ1NCw3ICs0NzEsOSBAQAogCiAJLyogTm9ybWFsaXplIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkICovCiAKLQlBQ1BJX0RFQlVHX0VYRUMgKHJlZ2lzdGVyX3ZhbHVlID0gKChyZWdpc3Rlcl92YWx1ZSAmIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKSA+PiBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbikpOworCUFDUElfREVCVUdfRVhFQyAocmVnaXN0ZXJfdmFsdWUgPQorCQkoKHJlZ2lzdGVyX3ZhbHVlICYgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spID4+CisJCQliaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbikpOwogCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJTZXQgYml0czogJTguOFggYWN0dWFsICU4LjhYIHJlZ2lzdGVyICVYXG4iLAogCQkJdmFsdWUsIHJlZ2lzdGVyX3ZhbHVlLCBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlcikpOwpAQCAtNDY5LDcgKzQ4OCw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIHVzZV9sb2NrICAgICAgICAgICAgLSBNdXRleCBodyBhY2Nlc3MKICAqICAgICAgICAgICAgICByZWdpc3Rlcl9pZCAgICAgICAgIC0gcmVnaXN0ZXJfaUQgKyBPZmZzZXQKLSAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgIC0gVmFsdWUgdGhhdCB3YXMgcmVhZCBmcm9tIHRoZSByZWdpc3RlcgorICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBXaGVyZSB0aGUgcmVnaXN0ZXIgdmFsdWUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCB0aGUgdmFsdWUgcmVhZC4KICAqCkBAIC01NTcsNyArNTc2LDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gUmVnaXN0ZXIgSUQ6ICVYXG4iLCByZWdpc3Rlcl9pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gUmVnaXN0ZXIgSUQ6ICVYXG4iLAorCQkJcmVnaXN0ZXJfaWQpKTsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJYnJlYWs7CiAJfQpAQCAtNzYzLDEwICs3ODMsMTEgQEAKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIlJlYWQ6ICAlOC44WCB3aWR0aCAlMmQgZnJvbSAlOC44WCU4LjhYICglcylcbiIsCi0JCQkqdmFsdWUsIHdpZHRoLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwKLQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWctPmFkZHJlc3Nfc3BhY2VfaWQpKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sCisJCSJSZWFkOiAgJTguOFggd2lkdGggJTJkIGZyb20gJTguOFglOC44WCAoJXMpXG4iLAorCQkqdmFsdWUsIHdpZHRoLAorCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAorCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSkpOwogCiAJcmV0dXJuIChzdGF0dXMpOwogfQpAQCAtODQxLDEwICs4NjIsMTEgQEAKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIldyb3RlOiAlOC44WCB3aWR0aCAlMmQgICB0byAlOC44WCU4LjhYICglcylcbiIsCi0JCQl2YWx1ZSwgd2lkdGgsCi0JCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAotCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywKKwkJIldyb3RlOiAlOC44WCB3aWR0aCAlMmQgICB0byAlOC44WCU4LjhYICglcylcbiIsCisJCXZhbHVlLCB3aWR0aCwKKwkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwKKwkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKIAogCXJldHVybiAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCmluZGV4IDc3YjNlOWEuLjQxNWQzNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYwpAQCAtNDMsMjcgKzQzLDEzIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJod3NsZWVwIikKIAogCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19CRlMgICAgICAgICJcXF9CRlMiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19HVFMgICAgICAgICJcXF9HVFMiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19QVFMgICAgICAgICJcXF9QVFMiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19TU1QgICAgICAgICJcXF9TSS5fU1NUIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fV0FLICAgICAgICAiXFxfV0FLIgotCi0jZGVmaW5lIEFDUElfU1NUX0lORElDQVRPUl9PRkYgIDAKLSNkZWZpbmUgQUNQSV9TU1RfV09SS0lORyAgICAgICAgMQotI2RlZmluZSBBQ1BJX1NTVF9XQUtJTkcgICAgICAgICAyCi0jZGVmaW5lIEFDUElfU1NUX1NMRUVQSU5HICAgICAgIDMKLSNkZWZpbmUgQUNQSV9TU1RfU0xFRVBfQ09OVEVYVCAgNAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IKICAqCkBAIC03Miw3ICs1OCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBhY2Nlc3MgZnVuY3Rpb24gZm9yIGRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCisgKiBERVNDUklQVElPTjogQWNjZXNzIGZ1bmN0aW9uIGZvciB0aGUgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtOTksMTkgKzg1LDIwIEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcgogICoKLSAqIFBBUkFNRVRFUlM6ICAqcGh5c2ljYWxfYWRkcmVzcyAgIC0gT3V0cHV0IGJ1ZmZlciB3aGVyZSBjb250ZW50cyBvZgorICogUEFSQU1FVEVSUzogICpwaHlzaWNhbF9hZGRyZXNzICAgLSBXaGVyZSB0aGUgY29udGVudHMgb2YKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcm13YXJlX3dha2luZ192ZWN0b3IgZmllbGQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZBQ1Mgd2lsbCBiZSBzdG9yZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGQUNTIHdpbGwgYmUgcmV0dXJuZWQuCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIFN0YXR1cywgdmVjdG9yCiAgKgotICogREVTQ1JJUFRJT046IEFjY2VzcyBmdW5jdGlvbiBmb3IgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCisgKiBERVNDUklQVElPTjogQWNjZXNzIGZ1bmN0aW9uIGZvciB0aGUgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciAoCkBAIC0xNDEsNyArMTI4LDcgQEAKICNlbmRpZgogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcAogICoKQEAgLTIxNSw3ICsyMDIsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfSU5ESUNBVE9SX09GRjsgLyogRGVmYXVsdCBpcyBpbmRpY2F0b3Igb2ZmICovCisJCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfSU5ESUNBVE9SX09GRjsgLyogRGVmYXVsdCBpcyBvZmYgKi8KIAkJYnJlYWs7CiAJfQogCkBAIC0yMjMsMTQgKzIxMCwxNSBAQAogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCSBBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJIEFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2VudGVyX3NsZWVwX3N0YXRlCiAgKgpAQCAtMjk5LDE1ICsyODcsMTggQEAKIAogCS8qIEdldCBjdXJyZW50IHZhbHVlIG9mIFBNMUEgY29udHJvbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgJlBNMUFjb250cm9sKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICZQTTFBY29udHJvbCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsICJFbnRlcmluZyBzbGVlcCBzdGF0ZSBbUyVkXVxuIiwgc2xlZXBfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULAorCQkiRW50ZXJpbmcgc2xlZXAgc3RhdGUgW1MlZF1cbiIsIHNsZWVwX3N0YXRlKSk7CiAKIAkvKiBDbGVhciBTTFBfRU4gYW5kIFNMUF9UWVAgZmllbGRzICovCiAKLQlQTTFBY29udHJvbCAmPSB+KHNsZWVwX3R5cGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayB8IHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKTsKKwlQTTFBY29udHJvbCAmPSB+KHNsZWVwX3R5cGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayB8CisJCQkgICBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7CiAJUE0xQmNvbnRyb2wgPSBQTTFBY29udHJvbDsKIAogCS8qIEluc2VydCBTTFBfVFlQIGJpdHMgKi8KQEAgLTMyMiwxMiArMzEzLDE0IEBACiAKIAkvKiBXcml0ZSAjMTogZmlsbCBpbiBTTFBfVFlQIGRhdGEgKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLCBBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTCwgUE0xQWNvbnRyb2wpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLCBQTTFBY29udHJvbCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLCBQTTFCY29udHJvbCk7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsIFBNMUJjb250cm9sKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CkBAIC0zNDEsMjIgKzMzNCwyNSBAQAogCiAJQUNQSV9GTFVTSF9DUFVfQ0FDSEUgKCk7CiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsIFBNMUFjb250cm9sKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCSBBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTCwgUE0xQWNvbnRyb2wpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLCBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwgUE0xQmNvbnRyb2wpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLCBQTTFCY29udHJvbCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCiAJaWYgKHNsZWVwX3N0YXRlID4gQUNQSV9TVEFURV9TMykgewogCQkvKgotCQkgKiBXZSB3YW50ZWQgdG8gc2xlZXAgPiBTMywgYnV0IGl0IGRpZG4ndCBoYXBwZW4gKGJ5IHZpcnR1ZSBvZiB0aGUgZmFjdCB0aGF0Ci0JCSAqIHdlIGFyZSBzdGlsbCBleGVjdXRpbmchKQorCQkgKiBXZSB3YW50ZWQgdG8gc2xlZXAgPiBTMywgYnV0IGl0IGRpZG4ndCBoYXBwZW4gKGJ5IHZpcnR1ZSBvZiB0aGUKKwkJICogZmFjdCB0aGF0IHdlIGFyZSBzdGlsbCBleGVjdXRpbmchKQogCQkgKgotCQkgKiBXYWl0IHRlbiBzZWNvbmRzLCB0aGVuIHRyeSBhZ2Fpbi4gVGhpcyBpcyB0byBnZXQgUzQvUzUgdG8gd29yayBvbiBhbGwgbWFjaGluZXMuCisJCSAqIFdhaXQgdGVuIHNlY29uZHMsIHRoZW4gdHJ5IGFnYWluLiBUaGlzIGlzIHRvIGdldCBTNC9TNSB0byB3b3JrIG9uCisJCSAqIGFsbCBtYWNoaW5lcy4KIAkJICoKIAkJICogV2Ugd2FpdCBzbyBsb25nIHRvIGFsbG93IGNoaXBzZXRzIHRoYXQgcG9sbCB0aGlzIHJlZyB2ZXJ5IHNsb3dseSB0bwogCQkgKiBzdGlsbCByZWFkIHRoZSByaWdodCB2YWx1ZS4gSWRlYWxseSwgdGhpcyBibG9jayB3b3VsZCBnbwpAQCAtMzY0LDcgKzM2MCw4IEBACiAJCSAqLwogCQlhY3BpX29zX3N0YWxsICgxMDAwMDAwMCk7CiAKLQkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCisJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAogCQkJCSBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTM3NCw3ICszNzEsOCBAQAogCS8qIFdhaXQgdW50aWwgd2UgZW50ZXIgc2xlZXAgc3RhdGUgKi8KIAogCWRvIHsKLQkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsCisJCQlBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQpAQCAtMzg4LDcgKzM4Niw3IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUpOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zCiAgKgpAQCAtNDM5LDExICs0MzcsMTMgQEAKIAogCUFDUElfRkxVU0hfQ1BVX0NBQ0hFICgpOwogCi0Jc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0IChhY3BpX2dibF9GQURULT5zbWlfY21kLCAodTMyKSBhY3BpX2dibF9GQURULT5TNGJpb3NfcmVxLCA4KTsKKwlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCisJCQkgKHUzMikgYWNwaV9nYmxfRkFEVC0+UzRiaW9zX3JlcSwgOCk7CiAKIAlkbyB7CiAJCWFjcGlfb3Nfc3RhbGwoMTAwMCk7Ci0JCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlLAorCQkJQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTQ1NCw3ICs0NTQsNyBAQAogRVhQT1JUX1NZTUJPTChhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0Ymlvcyk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZQogICoKQEAgLTUzNCwxOCArNTM0LDIxIEBACiAJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XQUtJTkc7CiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJfQogCiAJYXJnLmludGVnZXIudmFsdWUgPSBzbGVlcF9zdGF0ZTsKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX0JGUywgJmFyZ19saXN0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9CRlMgZmFpbGVkLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfQkZTIGZhaWxlZCwgJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX1dBSywgJmFyZ19saXN0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9XQUsgZmFpbGVkLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfV0FLIGZhaWxlZCwgJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAJLyogVEJEOiBfV0FLICJzb21ldGltZXMiIHJldHVybnMgc3R1ZmYgLSBkbyB3ZSB3YW50IHRvIGxvb2sgYXQgaXQ/ICovCiAKQEAgLTU2NywxNSArNTcwLDE5IEBACiAKIAkvKiBFbmFibGUgcG93ZXIgYnV0dG9uICovCiAKLQkodm9pZCkgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uZW5hYmxlX3JlZ2lzdGVyX2lkLAorCSh2b2lkKSBhY3BpX3NldF9yZWdpc3RlcigKKwkJCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bQUNQSV9FVkVOVF9QT1dFUl9CVVRUT05dLmVuYWJsZV9yZWdpc3Rlcl9pZCwKIAkJCTEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKLQkodm9pZCkgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uc3RhdHVzX3JlZ2lzdGVyX2lkLAorCisJKHZvaWQpIGFjcGlfc2V0X3JlZ2lzdGVyKAorCQkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uc3RhdHVzX3JlZ2lzdGVyX2lkLAogCQkJMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCiAJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XT1JLSU5HOwogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fU1NULCAmYXJnX2xpc3QsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9TU1QgZmFpbGVkLCAlc1xuIiwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCmluZGV4IDE5MDYxNjcuLjQ5ZDdiMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYwpAQCAtNDMsNyArNDMsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQpAQCAtOTAsNyArODksNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBUaWNrcyAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHRpbWVyIHZhbHVlIGlzIHJldHVybmVkCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgY3VycmVudCB0aWNrcworICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgY3VycmVudCB0aW1lciB2YWx1ZSAodGlja3MpCiAgKgogICogREVTQ1JJUFRJT046IE9idGFpbnMgY3VycmVudCB2YWx1ZSBvZiBBQ1BJIFBNIFRpbWVyIChpbiB0aWNrcykuCiAgKgpAQCAtMTk5LDUgKzE5OCw2IEBACiAJKnRpbWVfZWxhcHNlZCA9ICh1MzIpIHF1b3RpZW50OwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9kdXJhdGlvbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ob3RrZXkuYyBiL2RyaXZlcnMvYWNwaS9ob3RrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWJkZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2hvdGtleS5jCkBAIC0wLDAgKzEsMTAxOSBAQAorLyogCisgKiAgaG90a2V5LmMgLSBBQ1BJIEhvdGtleSBEcml2ZXIgKCRSZXZpc2lvbjokKQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgTHVtaW5nIFl1IDxsdW1pbmcueXVAaW50ZWwuY29tPgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBIT1RLRVlfQUNQSV9WRVJTSU9OICIwLjEiCisKKyNkZWZpbmUgSE9US0VZX1BST0MgImhvdGtleSIKKyNkZWZpbmUgSE9US0VZX0VWX0NPTkZJRyAgICAiZXZlbnRfY29uZmlnIgorI2RlZmluZSBIT1RLRVlfUExfQ09ORklHICAgICJwb2xsX2NvbmZpZyIKKyNkZWZpbmUgSE9US0VZX0FDVElPTiAgICJhY3Rpb24iCisjZGVmaW5lIEhPVEtFWV9JTkZPICJpbmZvIgorCisjZGVmaW5lIEFDUElfSE9US19OQU1FICAgICAgICAgICJHZW5lcmljIEhvdGtleSBEcml2ZXIiCisjZGVmaW5lIEFDUElfSE9US19DTEFTUyAgICAgICAgICJIb3RrZXkiCisjZGVmaW5lIEFDUElfSE9US19ERVZJQ0VfTkFNRSAgICJIb3RrZXkiCisjZGVmaW5lIEFDUElfSE9US19ISUQgICAgICAgICAgICJVbmtub3duPyIKKyNkZWZpbmUgQUNQSV9IT1RLRVlfQ09NUE9ORU5UICAgMHgyMDAwMDAwMAorCisjZGVmaW5lIEFDUElfSE9US0VZX0VWRU5UICAgMHgxCisjZGVmaW5lIEFDUElfSE9US0VZX1BPTExJTkcgMHgyCisjZGVmaW5lIEFDUElfVU5ERUZJTkVEX0VWRU5UICAgIDB4ZgorCisjZGVmaW5lIE1BWF9DT05GSUdfUkVDT1JEX0xFTiAgIDgwCisjZGVmaW5lIE1BWF9OQU1FX1BBVEhfTEVOICAgODAKKyNkZWZpbmUgTUFYX0NBTExfUEFSTSAgICAgICA4MAorCisjZGVmaW5lIElTX0VWRU5UKGUpICAgICAgIDB4ZmYJLyogKChlKSAmIDB4NDAwMDAwMDApICAqLworI2RlZmluZSBJU19QT0xMKGUpICAgICAgMHhmZgkvKiAofigoZSkgJiAweDQwMDAwMDAwKSkgICovCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICAgICAgQUNQSV9IT1RLRVlfQ09NUE9ORU5UCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2hvdGtleSIpCisKKyAgICBNT0RVTEVfQVVUSE9SKCJsdW1pbmcueXVAaW50ZWwuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9IT1RLX05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAgc3RhbmRhcmRpemVkIGludGVybmFsIGhvdGtleSBudW1iZXIvZXZlbnQgICovCitlbnVtIHsKKwkvKiBWaWRlbyBFeHRlbnNpb24gZXZlbnQgKi8KKwlIS19FVkVOVF9DWUNMRV9PVVRQVVRfREVWSUNFID0gMHg4MCwKKwlIS19FVkVOVF9PVVRQVVRfREVWSUNFX1NUQVRVU19DSEFOR0UsCisJSEtfRVZFTlRfQ1lDTEVfRElTUExBWV9PVVRQVVQsCisJSEtfRVZFTlRfTkVYVF9ESVNQTEFZX09VVFBVVCwKKwlIS19FVkVOVF9QUkVWSU9VU19ESVNQTEFZX09VVFBVVCwKKwlIS19FVkVOVF9DWUNMRV9CUklHSFRORVNTLAorCUhLX0VWRU5UX0lOQ1JFQVNFX0JSSUdIVE5FU1MsCisJSEtfRVZFTlRfREVDUkVBU0VfQlJJR0hUTkVTUywKKwlIS19FVkVOVF9aRVJPX0JSSUdIVE5FU1MsCisJSEtfRVZFTlRfRElTUExBWV9ERVZJQ0VfT0ZGLAorCisJLyogU25kIENhcmQgZXZlbnQgKi8KKwlIS19FVkVOVF9WT0xVTUVfTVVURSwKKwlIS19FVkVOVF9WT0xVTUVfSU5DTFJFQVNFLAorCUhLX0VWRU5UX1ZPTFVNRV9ERUNSRUFTRSwKKworCS8qIHJ1bm5pbmcgc3RhdGUgY29udHJvbCAqLworCUhLX0VWRU5UX0VOVEVSUklOR19TMywKKwlIS19FVkVOVF9FTlRFUlJJTkdfUzQsCisJSEtfRVZFTlRfRU5URVJSSU5HX1M1LAorfTsKKworLyogIHByb2NkaXIgd2UgdXNlICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfcHJvY19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfY29uZmlnOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG90a2V5X3BvbGxfY29uZmlnOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG90a2V5X2FjdGlvbjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvdGtleV9pbmZvOworCisvKiBsaW5rYWdlIGZvciBhbGwgdHlwZSBvZiBob3RrZXkgKi8KK3N0cnVjdCBhY3BpX2hvdGtleV9saW5rIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7CisJaW50IGhvdGtleV90eXBlOwkvKiBldmVudCBvciBwb2xsaW5nIGJhc2VkIGhvdGtleSAgKi8KKwlpbnQgaG90a2V5X3N0YW5kYXJkX251bTsJLyogc3RhbmRhcmRpemVkIGhvdGtleShldmVudCkgbnVtYmVyICovCit9OworCisvKiBldmVudCBiYXNlZCBob3RrZXkgKi8KK3N0cnVjdCBhY3BpX2V2ZW50X2hvdGtleSB7CisJc3RydWN0IGFjcGlfaG90a2V5X2xpbmsgaG90a2V5X2xpbms7CisJaW50IGZsYWc7CisJYWNwaV9oYW5kbGUgYnVzX2hhbmRsZTsJLyogYnVzIHRvIGluc3RhbGwgbm90aWZ5IGhhbmRsZXIgKi8KKwlpbnQgZXh0ZXJuYWxfaG90a2V5X251bTsJLyogZXh0ZXJuYWwgaG90a2V5L2V2ZW50IG51bWJlciAqLworCWFjcGlfaGFuZGxlIGFjdGlvbl9oYW5kbGU7CS8qIGFjcGkgaGFuZGxlIGF0dGFjaGVkIGFtbCBhY3Rpb24gbWV0aG9kICovCisJY2hhciAqYWN0aW9uX21ldGhvZDsJLyogYWN0aW9uIG1ldGhvZCAqLworfTsKKworLyogCisgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gcG9sbCBzdGF0dXMKKyAqIDEuIGRpcmVjdHkgY2FsbCByZWFkX3h4eCBtZXRob2QsIHdpdGhvdXQgYW55IGFyZ3VtZW50cyBwYXNzZWQgaW4KKyAqIDIuIGNhbGwgd3JpdGVfeHh4IG1ldGhvZCwgd2l0aCBhcmd1bWVudHMgcGFzc2VkIGluLCB5b3UgbmVlZAorICogdGhlIHJlc3VsdCBpcyBzYXZlZCBpbiBhY3BpX3BvbGxpbmdfaG90a2V5LnBvbGxfcmVzdWx0LgorICogYW50aG9lciByZWFkIGNvbW1hbmQgdGhyb3VnaCBwb2xsaW5nIGludGVyZmFjZS4KKyAqCisgKi8KKworLyogcG9sbGluZyBiYXNlZCBob3RrZXkgKi8KK3N0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5IHsKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGluayBob3RrZXlfbGluazsKKwlpbnQgZmxhZzsKKwlhY3BpX2hhbmRsZSBwb2xsX2hhbmRsZTsJLyogYWNwaSBoYW5kbGUgYXR0YWNoZWQgcG9sbGluZyBtZXRob2QgKi8KKwljaGFyICpwb2xsX21ldGhvZDsJLyogcG9sbCBtZXRob2QgKi8KKwlhY3BpX2hhbmRsZSBhY3Rpb25faGFuZGxlOwkvKiBhY3BpIGhhbmRsZSBhdHRhY2hlZCBhY3Rpb24gbWV0aG9kICovCisJY2hhciAqYWN0aW9uX21ldGhvZDsJLyogYWN0aW9uIG1ldGhvZCAqLworCXZvaWQgKnBvbGxfcmVzdWx0OwkvKiBwb2xsaW5nX3Jlc3VsdCAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKK307CisKKy8qIGhvdGtleSBvYmplY3QgdW5pb24gKi8KK3VuaW9uIGFjcGlfaG90a2V5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7CisJc3RydWN0IGFjcGlfaG90a2V5X2xpbmsgbGluazsKKwlzdHJ1Y3QgYWNwaV9ldmVudF9ob3RrZXkgZXZlbnRfaG90a2V5OworCXN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5IHBvbGxfaG90a2V5OworfTsKKworLyogaG90a2V5IG9iamVjdCBsaXN0ICovCitzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllczsKKwlpbnQgY291bnQ7Cit9OworCitzdGF0aWMgaW50IGF1dG9faG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGF1dG9faG90a2V5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGhvdGtleV9kcml2ZXIgPSB7CisJLm5hbWUgPSBBQ1BJX0hPVEtfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX0hPVEtfQ0xBU1MsCisJLmlkcyA9IEFDUElfSE9US19ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGF1dG9faG90a2V5X2FkZCwKKwkJLnJlbW92ZSA9IGF1dG9faG90a2V5X3JlbW92ZSwKKwkJfSwKK307CisKK3N0YXRpYyBpbnQgaG90a2V5X29wZW5fY29uZmlnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBzc2l6ZV90IGhvdGtleV93cml0ZV9jb25maWcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKK3N0YXRpYyBzc2l6ZV90IGhvdGtleV93cml0ZV9wb2xsX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSk7CitzdGF0aWMgaW50IGhvdGtleV9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBob3RrZXlfYWN0aW9uX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHNzaXplX3QgaG90a2V5X2V4ZWN1dGVfYW1sX21ldGhvZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgaG90a2V5X2NvbmZpZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK3N0YXRpYyBpbnQgaG90a2V5X3BvbGxpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKKy8qIGV2ZW50IGJhc2VkIGNvbmZpZyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X2NvbmZpZ19mb3BzID0geworCS5vcGVuID0gaG90a2V5X29wZW5fY29uZmlnLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gaG90a2V5X3dyaXRlX2NvbmZpZywKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBwb2xsaW5nIGJhc2VkIGNvbmZpZyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X3BvbGxfY29uZmlnX2ZvcHMgPSB7CisJLm9wZW4gPSBob3RrZXlfb3Blbl9jb25maWcsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBob3RrZXlfd3JpdGVfcG9sbF9jb25maWcsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyogaG90a2V5IGRyaXZlciBpbmZvICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfaW5mb19mb3BzID0geworCS5vcGVuID0gaG90a2V5X2luZm9fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qIGFjdGlvbiAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X2FjdGlvbl9mb3BzID0geworCS5vcGVuID0gaG90a2V5X2FjdGlvbl9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gaG90a2V5X2V4ZWN1dGVfYW1sX21ldGhvZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBwb2xsaW5nIHJlc3VsdHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvdGtleV9wb2xsaW5nX2ZvcHMgPSB7CisJLm9wZW4gPSBob3RrZXlfcG9sbGluZ19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgZ2xvYmFsX2hvdGtleV9saXN0OwkvKiBsaW5rIGFsbCBldiBvciBwbCBob3RrZXkgICovCitzdHJ1Y3QgbGlzdF9oZWFkIGhvdGtleV9lbnRyaWVzOwkvKiBoZWFkIG9mIHRoZSBsaXN0IG9mIGhvdGtleV9saXN0ICovCisKK3N0YXRpYyBpbnQgaG90a2V5X2luZm9fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfaW5mb19zZXFfc2hvdyIpOworCisJc2VxX3ByaW50ZihzZXEsICJIb3RrZXkgZ2VuZXJpYyBkcml2ZXIgdmVyOiAlcyIsIEhPVEtFWV9BQ1BJX1ZFUlNJT04pOworCisJcmV0dXJuX1ZBTFVFKDApOworfQorCitzdGF0aWMgaW50IGhvdGtleV9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhvdGtleV9pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworc3RhdGljIGNoYXIgKmZvcm1hdF9yZXN1bHQodW5pb24gYWNwaV9vYmplY3QgKm9iamVjdCkKK3sKKwljaGFyICpidWYgPSAoY2hhciAqKWttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKTsKKworCS8qIE5vdywganVzdCBzdXBwb3J0IGludGVnZXIgdHlwZSAqLworCWlmIChvYmplY3QtPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCisJCXNwcmludGYoYnVmLCAiJWQiLCAodTMyKSBvYmplY3QtPmludGVnZXIudmFsdWUpOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBob3RrZXlfcG9sbGluZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5ICpwb2xsX2hvdGtleSA9CisJICAgIChzdHJ1Y3QgYWNwaV9wb2xsaW5nX2hvdGtleSAqKXNlcS0+cHJpdmF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9wb2xsaW5nX3NlcV9zaG93Iik7CisKKwlpZiAocG9sbF9ob3RrZXktPnBvbGxfcmVzdWx0KQorCQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgZm9ybWF0X3Jlc3VsdChwb2xsX2hvdGtleS0+cG9sbF9yZXN1bHQpKTsKKworCXJldHVybl9WQUxVRSgwKTsKK30KKworc3RhdGljIGludCBob3RrZXlfcG9sbGluZ19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBob3RrZXlfcG9sbGluZ19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X2FjdGlvbl9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBob3RrZXlfaW5mb19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKKy8qIE1hcHBpbmcgZXh0ZXJuYWwgaG90a2V5IG51bWJlciB0byBzdGFuZGFyZGl6ZWQgaG90a2V5IGV2ZW50IG51bSAqLworc3RhdGljIGludCBob3RrZXlfZ2V0X2ludGVybmFsX2V2ZW50KGludCBldmVudCwgc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKmxpc3QpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisJaW50IHZhbCA9IDA7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfZ2V0X2ludGVybmFsX2V2ZW50Iik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgbGlzdC0+ZW50cmllcykgeworCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KKwkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CisJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQKKwkJICAgICYmIGtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0gPT0gZXZlbnQpCisJCQl2YWwgPSBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bTsKKwkJZWxzZQorCQkJdmFsID0gLTE7CisJfQorCisJcmV0dXJuX1ZBTFVFKHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCithY3BpX2hvdGtleV9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CisJdTMyIGludGVybmFsX2V2ZW50OworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9ob3RrZXlfbm90aWZ5X2hhbmRsZXIiKTsKKworCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSkpCisJCXJldHVybl9WT0lEOworCisJaW50ZXJuYWxfZXZlbnQgPSBob3RrZXlfZ2V0X2ludGVybmFsX2V2ZW50KGV2ZW50LCAmZ2xvYmFsX2hvdGtleV9saXN0KTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKKworCXJldHVybl9WT0lEOworfQorCisvKiBOZWVkIHRvIGludmVudCBhdXRvbWF0aWNhbGx5IGhvdGtleSBhZGQgbWV0aG9kICovCitzdGF0aWMgaW50IGF1dG9faG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwkvKiBJbXBsZW1lbnQgbWUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogTmVlZCB0byBpbnZlbnQgYXV0b21hdGljYWxseSBob3RrZXkgcmVtb3ZlIG1ldGhvZCAqLworc3RhdGljIGludCBhdXRvX2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCS8qIEltcGxlbWVudCBtZSAqLworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgYSBwcm9jIGZpbGUgZm9yIGVhY2ggcG9sbGluZyBtZXRob2QgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX3BvbGxpbmdfcHJvYyh1bmlvbiBhY3BpX2hvdGtleSAqZGV2aWNlKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKKwltb2RlX3QgbW9kZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImNyZWF0ZV9wb2xsaW5nX3Byb2MiKTsKKwltb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPOworCisJcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldmljZS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCwKKwkJCQkgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKKworCWlmICghcHJvYykgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkhvdGtleTogVW5hYmxlIHRvIGNyZWF0ZSAlcyBlbnRyeVxuIiwKKwkJCQkgIGRldmljZS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOworCX0gZWxzZSB7CisJCXByb2MtPnByb2NfZm9wcyA9ICZob3RrZXlfcG9sbGluZ19mb3BzOworCQlwcm9jLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlwcm9jLT5kYXRhID0gZGV2aWNlOworCQlwcm9jLT51aWQgPSAwOworCQlwcm9jLT5naWQgPSAwOworCQlkZXZpY2UtPnBvbGxfaG90a2V5LnByb2MgPSBwcm9jOworCX0KKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKK3N0YXRpYyBpbnQgaXNfdmFsaWRfYWNwaV9wYXRoKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaXNfdmFsaWRfYWNwaV9wYXRoIik7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCwgKGNoYXIgKilwYXRobmFtZSwgJmhhbmRsZSk7CisJcmV0dXJuX1ZBTFVFKCFBQ1BJX0ZBSUxVUkUoc3RhdHVzKSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfdmFsaWRfaG90a2V5KHVuaW9uIGFjcGlfaG90a2V5ICpkZXZpY2UpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaXNfdmFsaWRfaG90a2V5Iik7CisJLyogSW1wbGVtZW50IHZhbGlkIGNoZWNrICovCisJcmV0dXJuX1ZBTFVFKDEpOworfQorCitzdGF0aWMgaW50IGhvdGtleV9hZGQodW5pb24gYWNwaV9ob3RrZXkgKmRldmljZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfYWRkIik7CisKKwlpZiAoZGV2aWNlLT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2J1c19nZXRfZGV2aWNlKGRldmljZS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUsICZkZXYpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CisKKwkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGRldi0+aGFuZGxlLAorCQkJCQkJICAgICBBQ1BJX1NZU1RFTV9OT1RJRlksCisJCQkJCQkgICAgIGFjcGlfaG90a2V5X25vdGlmeV9oYW5kbGVyLAorCQkJCQkJICAgICBkZXZpY2UpOworCX0gZWxzZQkJCS8qIEFkZCBwb2xsaW5nIGhvdGtleSAqLworCQljcmVhdGVfcG9sbGluZ19wcm9jKGRldmljZSk7CisKKwlnbG9iYWxfaG90a2V5X2xpc3QuY291bnQrKzsKKworCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+bGluay5lbnRyaWVzLCBnbG9iYWxfaG90a2V5X2xpc3QuZW50cmllcyk7CisKKwlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKK30KKworc3RhdGljIGludCBob3RrZXlfcmVtb3ZlKHVuaW9uIGFjcGlfaG90a2V5ICpkZXZpY2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfcmVtb3ZlIik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPT0KKwkJICAgIGRldmljZS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKSB7CisJCQlsaXN0X2RlbCgma2V5LT5saW5rLmVudHJpZXMpOworCQkJcmVtb3ZlX3Byb2NfZW50cnkoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kLAorCQkJCQkgIGhvdGtleV9wcm9jX2Rpcik7CisJCQlnbG9iYWxfaG90a2V5X2xpc3QuY291bnQtLTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybl9WQUxVRSgwKTsKK30KKworc3RhdGljIHZvaWQgaG90a2V5X3VwZGF0ZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXMsICpuZXh0OworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X3VwZGF0ZSIpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJpZXMsIG5leHQsIGdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzKSB7CisJCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQorCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKKwkJaWYgKGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09CisJCSAgICBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSkgeworCQkJa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSA9CisJCQkgICAga2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZTsKKwkJCWtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0gPQorCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW07CisJCQlrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlID0KKwkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlOworCQkJa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9CisJCQkgICAga2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuX1ZPSUQ7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2OworCWludCBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJmcmVlX2hvdGtleV9kZXZpY2UiKTsKKworCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfYnVzX2dldF9kZXZpY2Uoa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSwgJmRldik7CisJCWlmIChkZXYtPmhhbmRsZSkKKwkJCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGRldi0+aGFuZGxlLAorCQkJCQkJICAgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJCQkJICAgYWNwaV9ob3RrZXlfbm90aWZ5X2hhbmRsZXIpOworCX0gZWxzZQorCQlyZW1vdmVfcHJvY19lbnRyeShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QsCisJCQkJICBob3RrZXlfcHJvY19kaXIpOworCWtmcmVlKGtleSk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LCBjaGFyICpidXNfc3RyLCBjaGFyICphY3Rpb25fc3RyLAorCQkgICBjaGFyICptZXRob2QsIGludCBzdGRfbnVtLCBpbnQgZXh0ZXJuYWxfbnVtKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImluaXRfaG90a2V5X2RldmljZSIpOworCisJa2V5LT5saW5rLmhvdGtleV90eXBlID0gQUNQSV9IT1RLRVlfRVZFTlQ7CisJa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPSBzdGRfbnVtOworCWtleS0+ZXZlbnRfaG90a2V5LmZsYWcgPSAwOworCWlmIChpc192YWxpZF9hY3BpX3BhdGgoYnVzX3N0cikpCisJCWFjcGlfZ2V0X2hhbmRsZSgoYWNwaV9oYW5kbGUpIDAsCisJCQkJYnVzX3N0ciwgJihrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlKSk7CisJZWxzZQorCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CisJa2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9IGV4dGVybmFsX251bTsKKwlpZiAoaXNfdmFsaWRfYWNwaV9wYXRoKGFjdGlvbl9zdHIpKQorCQlhY3BpX2dldF9oYW5kbGUoKGFjcGlfaGFuZGxlKSAwLAorCQkJCWFjdGlvbl9zdHIsICYoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSkpOworCWtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QgPSBrbWFsbG9jKHNpemVvZihtZXRob2QpLCBHRlBfS0VSTkVMKTsKKwlzdHJjcHkoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCwgbWV0aG9kKTsKKworCXJldHVybl9WQUxVRSghaXNfdmFsaWRfaG90a2V5KGtleSkpOworfQorCitzdGF0aWMgaW50Citpbml0X3BvbGxfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LAorCQkJY2hhciAqcG9sbF9zdHIsCisJCQljaGFyICpwb2xsX21ldGhvZCwKKwkJCWNoYXIgKmFjdGlvbl9zdHIsIGNoYXIgKmFjdGlvbl9tZXRob2QsIGludCBzdGRfbnVtKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImluaXRfcG9sbF9ob3RrZXlfZGV2aWNlIik7CisKKwlrZXktPmxpbmsuaG90a2V5X3R5cGUgPSBBQ1BJX0hPVEtFWV9QT0xMSU5HOworCWtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID0gc3RkX251bTsKKwlrZXktPnBvbGxfaG90a2V5LmZsYWcgPSAwOworCWlmIChpc192YWxpZF9hY3BpX3BhdGgocG9sbF9zdHIpKQorCQlhY3BpX2dldF9oYW5kbGUoKGFjcGlfaGFuZGxlKSAwLAorCQkJCXBvbGxfc3RyLCAmKGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUpKTsKKwllbHNlCisJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKKwlrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kID0gcG9sbF9tZXRob2Q7CisJaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChhY3Rpb25fc3RyKSkKKwkJYWNwaV9nZXRfaGFuZGxlKChhY3BpX2hhbmRsZSkgMCwKKwkJCQlhY3Rpb25fc3RyLCAmKGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZSkpOworCWtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9CisJICAgIGttYWxsb2Moc2l6ZW9mKGFjdGlvbl9tZXRob2QpLCBHRlBfS0VSTkVMKTsKKwlzdHJjcHkoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kLCBhY3Rpb25fbWV0aG9kKTsKKwlrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0ID0KKwkgICAgKHVuaW9uIGFjcGlfb2JqZWN0ICopa21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm5fVkFMVUUoaXNfdmFsaWRfaG90a2V5KGtleSkpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2hvdGtleV92YWxpZCh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LAorCQkJICAgICAgc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKmxpc3QpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiY2hlY2tfaG90a2V5X3ZhbGlkIik7CisJcmV0dXJuX1ZBTFVFKDApOworfQorCitzdGF0aWMgaW50IGhvdGtleV9vcGVuX2NvbmZpZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfb3Blbl9jb25maWciKTsKKwlyZXR1cm5fVkFMVUUoc2luZ2xlX29wZW4KKwkJICAgICAoZmlsZSwgaG90a2V5X2NvbmZpZ19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSkpOworfQorCitzdGF0aWMgaW50IGhvdGtleV9jb25maWdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPSAmZ2xvYmFsX2hvdGtleV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXMsICpuZXh0OworCWNoYXIgYnVzX25hbWVbQUNQSV9QQVRITkFNRV9NQVhdID0geyAwIH07CisJY2hhciBhY3Rpb25fbmFtZVtBQ1BJX1BBVEhOQU1FX01BWF0gPSB7IDAgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVzID0geyBBQ1BJX1BBVEhOQU1FX01BWCwgYnVzX25hbWUgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYWN0ID0geyBBQ1BJX1BBVEhOQU1FX01BWCwgYWN0aW9uX25hbWUgfTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoKCJob3RrZXlfY29uZmlnX3NlcV9zaG93IikpOworCisJaWYgKCFob3RrZXlfbGlzdCkKKwkJZ290byBlbmQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgaG90a2V5X2xpc3QtPmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UKSB7CisJCQlhY3BpX2dldF9uYW1lKGtleS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUsCisJCQkJICAgICAgQUNQSV9OQU1FX1RZUEVfTUFYLCAmYnVzKTsKKwkJCWFjcGlfZ2V0X25hbWUoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSwKKwkJCQkgICAgICBBQ1BJX05BTUVfVFlQRV9NQVgsICZhY3QpOworCQkJc2VxX3ByaW50ZihzZXEsICIlczolczolczolZDolZCIsIGJ1c19uYW1lLAorCQkJCSAgIGFjdGlvbl9uYW1lLAorCQkJCSAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QsCisJCQkJICAga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0sCisJCQkJICAga2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSk7CisJCX0gLyogQUNQSV9IT1RLRVlfUE9MTElORyAqLworCQllbHNlIHsKKwkJCWFjcGlfZ2V0X25hbWUoa2V5LT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZSwKKwkJCQkgICAgICBBQ1BJX05BTUVfVFlQRV9NQVgsICZidXMpOworCQkJYWNwaV9nZXRfbmFtZShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUsCisJCQkJICAgICAgQUNQSV9OQU1FX1RZUEVfTUFYLCAmYWN0KTsKKwkJCXNlcV9wcmludGYoc2VxLCAiJXM6JXM6JXM6JXM6JWQiLCBidXNfbmFtZSwKKwkJCQkgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kLAorCQkJCSAgIGFjdGlvbl9uYW1lLAorCQkJCSAgIGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCwKKwkJCQkgICBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSk7CisJCX0KKwl9CisJc2VxX3B1dHMoc2VxLCAiXG4iKTsKKyAgICAgIGVuZDoKKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9wYXJtcyhjaGFyICpjb25maWdfcmVjb3JkLAorCSAgaW50ICpjbWQsCisJICBjaGFyICpidXNfaGFuZGxlLAorCSAgY2hhciAqYnVzX21ldGhvZCwKKwkgIGNoYXIgKmFjdGlvbl9oYW5kbGUsCisJICBjaGFyICptZXRob2QsIGludCAqaW50ZXJuYWxfZXZlbnRfbnVtLCBpbnQgKmV4dGVybmFsX2V2ZW50X251bSkKK3sKKwljaGFyICp0bXAsICp0bXAxOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoKCJnZXRfcGFybXMiKSk7CisKKwlzc2NhbmYoY29uZmlnX3JlY29yZCwgIiVkIiwgY21kKTsKKworCXRtcCA9IHN0cmNocihjb25maWdfcmVjb3JkLCAnOicpOworCXRtcCsrOworCXRtcDEgPSBzdHJjaHIodG1wLCAnOicpOworCXN0cm5jcHkoYnVzX2hhbmRsZSwgdG1wLCB0bXAxIC0gdG1wKTsKKwlidXNfaGFuZGxlW3RtcDEgLSB0bXBdID0gMDsKKworCXRtcCA9IHRtcDE7CisJdG1wKys7CisJdG1wMSA9IHN0cmNocih0bXAsICc6Jyk7CisJc3RybmNweShidXNfbWV0aG9kLCB0bXAsIHRtcDEgLSB0bXApOworCWJ1c19tZXRob2RbdG1wMSAtIHRtcF0gPSAwOworCisJdG1wID0gdG1wMTsKKwl0bXArKzsKKwl0bXAxID0gc3RyY2hyKHRtcCwgJzonKTsKKwlzdHJuY3B5KGFjdGlvbl9oYW5kbGUsIHRtcCwgdG1wMSAtIHRtcCk7CisJYWN0aW9uX2hhbmRsZVt0bXAxIC0gdG1wXSA9IDA7CisKKwl0bXAgPSB0bXAxOworCXRtcCsrOworCXRtcDEgPSBzdHJjaHIodG1wLCAnOicpOworCXN0cm5jcHkobWV0aG9kLCB0bXAsIHRtcDEgLSB0bXApOworCW1ldGhvZFt0bXAxIC0gdG1wXSA9IDA7CisKKwlzc2NhbmYodG1wMSArIDEsICIlZDolZCIsIGludGVybmFsX2V2ZW50X251bSwgZXh0ZXJuYWxfZXZlbnRfbnVtKTsKKwlyZXR1cm5fVkFMVUUoNik7Cit9CisKKy8qICBjb3VudCBpcyBsZW5ndGggZm9yIG9uZSBpbnB1dCByZWNvcmQgKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV93cml0ZV9jb25maWcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKQoreworCXN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7CisJY2hhciBjb25maWdfcmVjb3JkW01BWF9DT05GSUdfUkVDT1JEX0xFTl07CisJY2hhciBidXNfaGFuZGxlW01BWF9OQU1FX1BBVEhfTEVOXTsKKwljaGFyIGJ1c19tZXRob2RbTUFYX05BTUVfUEFUSF9MRU5dOworCWNoYXIgYWN0aW9uX2hhbmRsZVtNQVhfTkFNRV9QQVRIX0xFTl07CisJY2hhciBtZXRob2RbMjBdOworCWludCBjbWQsIGludGVybmFsX2V2ZW50X251bSwgZXh0ZXJuYWxfZXZlbnRfbnVtOworCWludCByZXQgPSAwOworCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgoImhvdGtleV93cml0ZV9jb25maWciKSk7CisKKwlpZiAoIWhvdGtleV9saXN0IHx8IGNvdW50ID4gTUFYX0NPTkZJR19SRUNPUkRfTEVOKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGFyZ3VtZW50c1xuIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGNvbmZpZ19yZWNvcmQsIGJ1ZmZlciwgY291bnQpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGEgXG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisJY29uZmlnX3JlY29yZFtjb3VudF0gPSAnXDAnOworCisJcmV0ID0gZ2V0X3Bhcm1zKGNvbmZpZ19yZWNvcmQsCisJCQkmY21kLAorCQkJYnVzX2hhbmRsZSwKKwkJCWJ1c19tZXRob2QsCisJCQlhY3Rpb25faGFuZGxlLAorCQkJbWV0aG9kLCAmaW50ZXJuYWxfZXZlbnRfbnVtLCAmZXh0ZXJuYWxfZXZlbnRfbnVtKTsKKwlpZiAocmV0ICE9IDYpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJJbnZhbGlkIGRhdGEgZm9ybWF0IHJldD0lZFxuIiwgcmV0KSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisKKwlrZXkgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2hvdGtleSksIEdGUF9LRVJORUwpOworCXJldCA9IGluaXRfaG90a2V5X2RldmljZShrZXksIGJ1c19oYW5kbGUsIGFjdGlvbl9oYW5kbGUsIG1ldGhvZCwKKwkJCQkgaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW0pOworCisJaWYgKHJldCB8fCBjaGVja19ob3RrZXlfdmFsaWQoa2V5LCBob3RrZXlfbGlzdCkpIHsKKwkJa2ZyZWUoa2V5KTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgaG90a2V5IFxuIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSAwOgorCQlob3RrZXlfYWRkKGtleSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaG90a2V5X3JlbW92ZShrZXkpOworCQlmcmVlX2hvdGtleV9kZXZpY2Uoa2V5KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlob3RrZXlfdXBkYXRlKGtleSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm5fVkFMVUUoY291bnQpOworfQorCisvKiAgY291bnQgaXMgbGVuZ3RoIGZvciBvbmUgaW5wdXQgcmVjb3JkICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfd3JpdGVfcG9sbF9jb25maWcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCWNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCit7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPQorCSAgICAoc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKiltLT5wcml2YXRlOworCisJY2hhciBjb25maWdfcmVjb3JkW01BWF9DT05GSUdfUkVDT1JEX0xFTl07CisJY2hhciBwb2xsaW5nX2hhbmRsZVtNQVhfTkFNRV9QQVRIX0xFTl07CisJY2hhciBhY3Rpb25faGFuZGxlW01BWF9OQU1FX1BBVEhfTEVOXTsKKwljaGFyIHBvbGxfbWV0aG9kWzIwXSwgYWN0aW9uX21ldGhvZFsyMF07CisJaW50IHJldCwgaW50ZXJuYWxfZXZlbnRfbnVtLCBjbWQsIGV4dGVybmFsX2V2ZW50X251bTsKKwl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV93cml0ZV9wb2xsX2NvbmZpZyIpOworCisJaWYgKCFob3RrZXlfbGlzdCB8fCBjb3VudCA+IE1BWF9DT05GSUdfUkVDT1JEX0xFTikgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhcmd1bWVudHNcbiIpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihjb25maWdfcmVjb3JkLCBidWZmZXIsIGNvdW50KSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBkYXRhIFxuIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCWNvbmZpZ19yZWNvcmRbY291bnRdID0gJ1wwJzsKKworCXJldCA9IGdldF9wYXJtcyhjb25maWdfcmVjb3JkLAorCQkJJmNtZCwKKwkJCXBvbGxpbmdfaGFuZGxlLAorCQkJcG9sbF9tZXRob2QsCisJCQlhY3Rpb25faGFuZGxlLAorCQkJYWN0aW9uX21ldGhvZCwKKwkJCSZpbnRlcm5hbF9ldmVudF9udW0sICZleHRlcm5hbF9ldmVudF9udW0pOworCisJaWYgKHJldCAhPSA2KSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGEgZm9ybWF0XG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisKKwlrZXkgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2hvdGtleSksIEdGUF9LRVJORUwpOworCXJldCA9IGluaXRfcG9sbF9ob3RrZXlfZGV2aWNlKGtleSwgcG9sbGluZ19oYW5kbGUsIHBvbGxfbWV0aG9kLAorCQkJCSAgICAgIGFjdGlvbl9oYW5kbGUsIGFjdGlvbl9tZXRob2QsCisJCQkJICAgICAgaW50ZXJuYWxfZXZlbnRfbnVtKTsKKwlpZiAocmV0IHx8IGNoZWNrX2hvdGtleV92YWxpZChrZXksIGhvdGtleV9saXN0KSkgeworCQlrZnJlZShrZXkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBob3RrZXkgXG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIDA6CisJCWhvdGtleV9hZGQoa2V5KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlob3RrZXlfcmVtb3ZlKGtleSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaG90a2V5X3VwZGF0ZShrZXkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuX1ZBTFVFKGNvdW50KTsKK30KKworLyogIAorICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgYW4gQUNQSSBtZXRob2QsIGdpdmVuIGFuIGludCBhcyBwYXJhbWV0ZXIsIHRoZQorICogbWV0aG9kIGlzIHNlYXJjaGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGhhbmRsZSwgY2FuIGJlIE5VTEwuIFRoZSBvdXRwdXQKKyAqIG9mIHRoZSBtZXRob2QgaXMgd3JpdHRlbiBpcyBvdXRwdXQsIHdoaWNoIGNhbiBhbHNvIGJlIE5VTEwKKyAqCisgKiByZXR1cm5zIDEgaWYgd3JpdGUgaXMgc3VjY2Vzc2Z1bCwgMCBlbHNlLgorICovCitzdGF0aWMgaW50IHdyaXRlX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgdmFsLAorCQkJICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dCkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CS8qIGxpc3Qgb2YgaW5wdXQgcGFyYW1ldGVycyAoYW4gaW50IGhlcmUpICovCisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOwkvKiB0aGUgb25seSBwYXJhbSB3ZSB1c2UgKi8KKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ3cml0ZV9hY3BpX2ludCIpOworCXBhcmFtcy5jb3VudCA9IDE7CisJcGFyYW1zLnBvaW50ZXIgPSAmaW5fb2JqOworCWluX29iai50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJaW5fb2JqLmludGVnZXIudmFsdWUgPSB2YWw7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCAmcGFyYW1zLCBvdXRwdXQpOworCisJcmV0dXJuX1ZBTFVFKHN0YXR1cyA9PSBBRV9PSyk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9hY3BpX2ludChhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50ICp2YWwpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dDsKKwl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJlYWRfYWNwaV9pbnQiKTsKKwlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOworCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCBOVUxMLCAmb3V0cHV0KTsKKwkqdmFsID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOworCXJldHVybl9WQUxVRSgoc3RhdHVzID09IEFFX09LKQorCQkgICAgICYmIChvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpKTsKK30KKworc3RhdGljIGFjcGlfaGFuZGxlCitnZXRfaGFuZGxlX2Zyb21faG90a2V5bGlzdChzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QsIGludCBldmVudF9udW0pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgaG90a2V5X2xpc3QtPmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UCisJCSAgICAmJiBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9PSBldmVudF9udW0pIHsKKwkJCXJldHVybiAoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSk7CisJCX0KKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljCitjaGFyICpnZXRfbWV0aG9kX2Zyb21faG90a2V5bGlzdChzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QsCisJCQkJIGludCBldmVudF9udW0pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgaG90a2V5X2xpc3QtPmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCisJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQgJiYKKwkJICAgIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09IGV2ZW50X251bSkKKwkJCXJldHVybiAoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9wb2xsaW5nX2hvdGtleSAqZ2V0X2hvdGtleV9ieV9ldmVudChzdHJ1Y3QKKwkJCQkJCSAgICAgICBhY3BpX2hvdGtleV9saXN0CisJCQkJCQkgICAgICAgKmhvdGtleV9saXN0LCBpbnQgZXZlbnQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgaG90a2V5X2xpc3QtPmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX1BPTExJTkcKKwkJICAgICYmIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09IGV2ZW50KSB7CisJCQlyZXR1cm4gKCZrZXktPnBvbGxfaG90a2V5KTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCisvKiAgCisgKiB1c2VyIGNhbGwgQU1MIG1ldGhvZCBpbnRlcmZhY2U6CisgKiBDYWxsIGNvbnZlbnRpb246CisgKiBlY2hvICJldmVudF9udW06IGFyZyB0eXBlIDogdmFsdWUiCisgKiBleGFtcGxlOiBlY2hvICIxOjE6MzAiID4gL3Byb2MvYWNwaS9hY3Rpb24KKyAqIEp1c3Qgc3VwcG9ydCAxIGludGVnZXIgYXJnIHBhc3NpbmcgdG8gQU1MIG1ldGhvZAorICovCisKK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9leGVjdXRlX2FtbF9tZXRob2Qoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPSAmZ2xvYmFsX2hvdGtleV9saXN0OworCWNoYXIgYXJnW01BWF9DQUxMX1BBUk1dOworCWludCBldmVudCwgdHlwZSwgdmFsdWU7CisKKwljaGFyICptZXRob2Q7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X2V4ZWN0ZV9hbWxfbWV0aG9kIik7CisKKwlpZiAoIWhvdGtleV9saXN0IHx8IGNvdW50ID4gTUFYX0NBTExfUEFSTSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhcmd1bWVudCAxIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGFyZywgYnVmZmVyLCBjb3VudCkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgYXJndW1lbnQgMiIpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCX0KKworCWFyZ1tjb3VudF0gPSAnXDAnOworCisJaWYgKHNzY2FuZihhcmcsICIlZDolZDolZCIsICZldmVudCwgJnR5cGUsICZ2YWx1ZSkgIT0gMykgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhcmd1bWVudCAzIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJaWYgKHR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJaGFuZGxlID0gZ2V0X2hhbmRsZV9mcm9tX2hvdGtleWxpc3QoaG90a2V5X2xpc3QsIGV2ZW50KTsKKwkJbWV0aG9kID0gKGNoYXIgKilnZXRfbWV0aG9kX2Zyb21faG90a2V5bGlzdChob3RrZXlfbGlzdCwgZXZlbnQpOworCQlpZiAoSVNfRVZFTlQoZXZlbnQpKQorCQkJd3JpdGVfYWNwaV9pbnQoaGFuZGxlLCBtZXRob2QsIHZhbHVlLCBOVUxMKTsKKwkJZWxzZSBpZiAoSVNfUE9MTChldmVudCkpIHsKKwkJCXN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5ICprZXk7CisJCQlrZXkgPSAoc3RydWN0IGFjcGlfcG9sbGluZ19ob3RrZXkgKikKKwkJCSAgICBnZXRfaG90a2V5X2J5X2V2ZW50KGhvdGtleV9saXN0LCBldmVudCk7CisJCQlyZWFkX2FjcGlfaW50KGhhbmRsZSwgbWV0aG9kLCBrZXktPnBvbGxfcmVzdWx0KTsKKwkJfQorCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJOb3Qgc3VwcG9ydGVkIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuX1ZBTFVFKGNvdW50KTsKK30KKworc3RhdGljIGludCBfX2luaXQgaG90a2V5X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X2luaXQiKTsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKSB7CisJCXByaW50aygiVXNpbmcgc3BlY2lmaWMgaG90a2V5IGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWhvdGtleV9wcm9jX2RpciA9IHByb2NfbWtkaXIoSE9US0VZX1BST0MsIGFjcGlfcm9vdF9kaXIpOworCWlmICghaG90a2V5X3Byb2NfZGlyKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgSE9US0VZX1BST0MpKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisJaG90a2V5X3Byb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJaG90a2V5X2NvbmZpZyA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9FVl9DT05GSUcsIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7CisJaWYgKCFob3RrZXlfY29uZmlnKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgSE9US0VZX0VWX0NPTkZJRykpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0gZWxzZSB7CisJCWhvdGtleV9jb25maWctPnByb2NfZm9wcyA9ICZob3RrZXlfY29uZmlnX2ZvcHM7CisJCWhvdGtleV9jb25maWctPmRhdGEgPSAmZ2xvYmFsX2hvdGtleV9saXN0OworCQlob3RrZXlfY29uZmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlob3RrZXlfY29uZmlnLT51aWQgPSAwOworCQlob3RrZXlfY29uZmlnLT5naWQgPSAwOworCX0KKworCWhvdGtleV9wb2xsX2NvbmZpZyA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9QTF9DT05GSUcsIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7CisJaWYgKCFob3RrZXlfcG9sbF9jb25maWcpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJIb3RrZXk6IFVuYWJsZSB0byBjcmVhdGUgJXMgZW50cnlcbiIsCisJCQkJICBIT1RLRVlfRVZfQ09ORklHKSk7CisJCXJldHVybiAoLUVOT0RFVik7CisJfSBlbHNlIHsKKwkJaG90a2V5X3BvbGxfY29uZmlnLT5wcm9jX2ZvcHMgPSAmaG90a2V5X3BvbGxfY29uZmlnX2ZvcHM7CisJCWhvdGtleV9wb2xsX2NvbmZpZy0+ZGF0YSA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7CisJCWhvdGtleV9wb2xsX2NvbmZpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJaG90a2V5X3BvbGxfY29uZmlnLT51aWQgPSAwOworCQlob3RrZXlfcG9sbF9jb25maWctPmdpZCA9IDA7CisJfQorCisJaG90a2V5X2FjdGlvbiA9IGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9BQ1RJT04sIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7CisJaWYgKCFob3RrZXlfYWN0aW9uKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgSE9US0VZX0FDVElPTikpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0gZWxzZSB7CisJCWhvdGtleV9hY3Rpb24tPnByb2NfZm9wcyA9ICZob3RrZXlfYWN0aW9uX2ZvcHM7CisJCWhvdGtleV9hY3Rpb24tPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWhvdGtleV9hY3Rpb24tPnVpZCA9IDA7CisJCWhvdGtleV9hY3Rpb24tPmdpZCA9IDA7CisJfQorCisJaG90a2V5X2luZm8gPSBjcmVhdGVfcHJvY19lbnRyeShIT1RLRVlfSU5GTywgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKKwlpZiAoIWhvdGtleV9pbmZvKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgSE9US0VZX0lORk8pKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9IGVsc2UgeworCQlob3RrZXlfaW5mby0+cHJvY19mb3BzID0gJmhvdGtleV9pbmZvX2ZvcHM7CisJCWhvdGtleV9pbmZvLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlob3RrZXlfaW5mby0+dWlkID0gMDsKKwkJaG90a2V5X2luZm8tPmdpZCA9IDA7CisJfQorCisJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZob3RrZXlfZHJpdmVyKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfUFJPQywgYWNwaV9yb290X2Rpcik7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCWdsb2JhbF9ob3RrZXlfbGlzdC5jb3VudCA9IDA7CisJZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMgPSAmaG90a2V5X2VudHJpZXM7CisKKwlJTklUX0xJU1RfSEVBRCgmaG90a2V5X2VudHJpZXMpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhvdGtleV9leGl0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfcmVtb3ZlIik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCisJCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7CisJCWxpc3RfZGVsKCZrZXktPmxpbmsuZW50cmllcyk7CisJCWdsb2JhbF9ob3RrZXlfbGlzdC5jb3VudC0tOworCQlmcmVlX2hvdGtleV9kZXZpY2Uoa2V5KTsKKwl9CisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmhvdGtleV9kcml2ZXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9FVl9DT05GSUcsIGhvdGtleV9wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX1BMX0NPTkZJRywgaG90a2V5X3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfQUNUSU9OLCBob3RrZXlfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9JTkZPLCBob3RrZXlfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QUk9DLCBhY3BpX3Jvb3RfZGlyKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGhvdGtleV9pbml0KTsKK21vZHVsZV9leGl0KGhvdGtleV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jIGIvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKaW5kZXggMGZiNzMxYS4uYWQ4NWUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKQEAgLTEwMjUsNyArMTAyNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGV2aWNlX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgaWJtYWNwaV9kZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCXJldHVybiAwOwogfQpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKIAltZW1zZXQoaWJtLT5kcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9kcml2ZXIpKTsKIAlzcHJpbnRmKGlibS0+ZHJpdmVyLT5uYW1lLCAiJXMvJXMiLCBJQk1fTkFNRSwgaWJtLT5uYW1lKTsKIAlpYm0tPmRyaXZlci0+aWRzID0gaWJtLT5oaWQ7Ci0JaWJtLT5kcml2ZXItPm9wcy5hZGQgPSAmZGV2aWNlX2FkZDsKKwlpYm0tPmRyaXZlci0+b3BzLmFkZCA9ICZpYm1hY3BpX2RldmljZV9hZGQ7CiAKIAlyZXQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoaWJtLT5kcml2ZXIpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xMTg1LDYgKzExODUsMTAgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpeworCQlwcmludGsoSUJNX0VSUiAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CQorCX0KIAkvKiB0aGVzZSBoYW5kbGVzIGFyZSByZXF1aXJlZCAqLwogCWlmIChJQk1fSEFORExFX0lOSVQoZWMsCSAgMSkgPCAwIHx8CiAJICAgIElCTV9IQU5ETEVfSU5JVChoa2V5LCAxKSA8IDAgfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYwppbmRleCAxYzBjMTIzLi5lY2U3YTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCkBAIC02Nyw3ICs2Nyw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19yb290X2luaXRpYWxpemUgKHZvaWQpCithY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZSAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAJY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyAqaW5pdF92YWwgPSBOVUxMOwpAQCAtMjY1LDcgKzI2Niw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9va3VwCiAgKgotICogUEFSQU1FVEVSUzogIHByZWZpeF9ub2RlICAgICAtIFNlYXJjaCBzY29wZSBpZiBuYW1lIGlzIG5vdCBmdWxseSBxdWFsaWZpZWQKKyAqIFBBUkFNRVRFUlM6ICBzY29wZV9pbmZvICAgICAgLSBDdXJyZW50IHNjb3BlIGluZm8gYmxvY2sKICAqICAgICAgICAgICAgICBQYXRobmFtZSAgICAgICAgLSBTZWFyY2ggcGF0aG5hbWUsIGluIGludGVybmFsIGZvcm1hdAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcyByZXByZXNlbnRlZCBpbiB0aGUgQU1MIHN0cmVhbSkKICAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBUeXBlIGFzc29jaWF0ZWQgd2l0aCBuYW1lCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCmluZGV4IGJmZDkyMmMuLjU2NTNhMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCkBAIC00OSwxNCArNDksMjAgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNhbGxvYyIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZSAoCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19jcmVhdGVfbm9kZQogICoKLSAqIFBBUkFNRVRFUlM6ICBhY3BpX25hbWUgICAgICAgLSBOYW1lIG9mIHRoZSBuZXcgbm9kZQorICogUEFSQU1FVEVSUzogIE5hbWUgICAgICAgICAgICAtIE5hbWUgb2YgdGhlIG5ldyBub2RlICg0IGNoYXIgQUNQSSBuYW1lKQogICoKLSAqIFJFVFVSTjogICAgICBOb25lCisgKiBSRVRVUk46ICAgICAgTmV3IG5hbWVzcGFjZSBub2RlIChOdWxsIG9uIGZhaWx1cmUpCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5hbWVzcGFjZSBub2RlCiAgKgpAQCAtMTQ1LDcgKzE1MSw2IEBACiAJCX0KIAl9CiAKLQogCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9OU05PREVdLnRvdGFsX2ZyZWVkKyspOwogCiAJLyoKQEAgLTE1Nyw1NyArMTYyLDYgQEAKIH0KIAogCi0jaWZkZWYgQUNQSV9BTFBIQUJFVElDX05BTUVTUEFDRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19jb21wYXJlX25hbWVzCi0gKgotICogUEFSQU1FVEVSUzogIE5hbWUxICAgICAgICAgICAtIEZpcnN0IG5hbWUgdG8gY29tcGFyZQotICogICAgICAgICAgICAgIE5hbWUyICAgICAgICAgICAtIFNlY29uZCBuYW1lIHRvIGNvbXBhcmUKLSAqCi0gKiBSRVRVUk46ICAgICAgdmFsdWUgZnJvbSBzdHJuY21wCi0gKgotICogREVTQ1JJUFRJT046IENvbXBhcmUgdHdvIEFDUEkgbmFtZXMuICBOYW1lcyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIGFuCi0gKiAgICAgICAgICAgICAgdW5kZXJzY29yZSBhcmUgZm9yY2VkIHRvIGJlIGFscGhhYmV0aWNhbGx5IGZpcnN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludAotYWNwaV9uc19jb21wYXJlX25hbWVzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMikKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX25hbWUxW0FDUElfTkFNRV9TSVpFXTsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX25hbWUyW0FDUElfTkFNRV9TSVpFXTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqOwotCi0KLQkvKgotCSAqIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAidW5kZXJzY29yZSIgd2l0aCBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciBzbwotCSAqIHRoYXQgYWxsIG5hbWVzIHRoYXQgYXJlIHByZWZpeGVkIHdpdGggdW5kZXJzY29yZShzKSBhcmUgYWxwaGFiZXRpY2FsbHkKLQkgKiBmaXJzdC4KLQkgKgotCSAqIFJldmVyc2UgdGhlIG5hbWUgYnl0ZXdpc2Ugc28gd2UgY2FuIGp1c3QgZG8gYSAzMi1iaXQgY29tcGFyZSBpbnN0ZWFkCi0JICogb2YgYSBzdHJuY21wLgotCSAqLwotCWZvciAoaSA9IDAsIGo9IChBQ1BJX05BTUVfU0laRSAtIDEpOyBpIDwgQUNQSV9OQU1FX1NJWkU7IGkrKywgai0tKSB7Ci0JCXJldmVyc2VkX25hbWUxW2pdID0gbmFtZTFbaV07Ci0JCWlmIChuYW1lMVtpXSA9PSAnXycpIHsKLQkJCXJldmVyc2VkX25hbWUxW2pdID0gJyonOwotCQl9Ci0KLQkJcmV2ZXJzZWRfbmFtZTJbal0gPSBuYW1lMltpXTsKLQkJaWYgKG5hbWUyW2ldID09ICdfJykgewotCQkJcmV2ZXJzZWRfbmFtZTJbal0gPSAnKic7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKCooaW50ICopIHJldmVyc2VkX25hbWUxIC0gKihpbnQgKikgcmV2ZXJzZWRfbmFtZTIpOwotfQotI2VuZGlmCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19pbnN0YWxsX25vZGUKQEAgLTI3MSw3ICsyMjUsOCBAQAogCQkgKiBhbHBoYWJldGljIHBsYWNlbWVudC4KIAkJICovCiAJCXByZXZpb3VzX2NoaWxkX25vZGUgPSBOVUxMOwotCQl3aGlsZSAoYWNwaV9uc19jb21wYXJlX25hbWVzIChhY3BpX3V0X2dldF9ub2RlX25hbWUgKGNoaWxkX25vZGUpLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpKSA8IDApIHsKKwkJd2hpbGUgKGFjcGlfbnNfY29tcGFyZV9uYW1lcyAoYWNwaV91dF9nZXRfbm9kZV9uYW1lIChjaGlsZF9ub2RlKSwKKwkJCQkgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSkgPCAwKSB7CiAJCQlpZiAoY2hpbGRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7CiAJCQkJLyogTGFzdCBwZWVyOyAgQ2xlYXIgZW5kLW9mLWxpc3QgZmxhZyAqLwogCkBAIC00MjksNyArMzg0LDggQEAKIAkJLyogVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIHJlZmVyZW5jZSByZW1haW5pbmcgb24gdGhpcyBub2RlICovCiAKIAkJaWYgKGNoaWxkX25vZGUtPnJlZmVyZW5jZV9jb3VudCAhPSAxKSB7Ci0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkV4aXN0aW5nIHJlZmVyZW5jZXMgKCVkKSBvbiBub2RlIGJlaW5nIGRlbGV0ZWQgKCVwKVxuIiwKKwkJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKKwkJCQkiRXhpc3RpbmcgcmVmZXJlbmNlcyAoJWQpIG9uIG5vZGUgYmVpbmcgZGVsZXRlZCAoJXApXG4iLAogCQkJCWNoaWxkX25vZGUtPnJlZmVyZW5jZV9jb3VudCwgY2hpbGRfbm9kZSkpOwogCQl9CiAKQEAgLTU0OCw3ICs1MDQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX25zX3JlbW92ZV9yZWZlcmVuY2UgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCiB7CkBAIC02ODMsMyArNjM5LDU0IEBACiB9CiAKIAorI2lmZGVmIEFDUElfQUxQSEFCRVRJQ19OQU1FU1BBQ0UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY29tcGFyZV9uYW1lcworICoKKyAqIFBBUkFNRVRFUlM6ICBOYW1lMSAgICAgICAgICAgLSBGaXJzdCBuYW1lIHRvIGNvbXBhcmUKKyAqICAgICAgICAgICAgICBOYW1lMiAgICAgICAgICAgLSBTZWNvbmQgbmFtZSB0byBjb21wYXJlCisgKgorICogUkVUVVJOOiAgICAgIHZhbHVlIGZyb20gc3RybmNtcAorICoKKyAqIERFU0NSSVBUSU9OOiBDb21wYXJlIHR3byBBQ1BJIG5hbWVzLiAgTmFtZXMgdGhhdCBhcmUgcHJlZml4ZWQgd2l0aCBhbgorICogICAgICAgICAgICAgIHVuZGVyc2NvcmUgYXJlIGZvcmNlZCB0byBiZSBhbHBoYWJldGljYWxseSBmaXJzdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK2FjcGlfbnNfY29tcGFyZV9uYW1lcyAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTEsCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTIpCit7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlZF9uYW1lMVtBQ1BJX05BTUVfU0laRV07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlZF9uYW1lMltBQ1BJX05BTUVfU0laRV07CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgajsKKworCisJLyoKKwkgKiBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgInVuZGVyc2NvcmUiIHdpdGggYSB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIgc28KKwkgKiB0aGF0IGFsbCBuYW1lcyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIHVuZGVyc2NvcmUocykgYXJlIGFscGhhYmV0aWNhbGx5CisJICogZmlyc3QuCisJICoKKwkgKiBSZXZlcnNlIHRoZSBuYW1lIGJ5dGV3aXNlIHNvIHdlIGNhbiBqdXN0IGRvIGEgMzItYml0IGNvbXBhcmUgaW5zdGVhZAorCSAqIG9mIGEgc3RybmNtcC4KKwkgKi8KKwlmb3IgKGkgPSAwLCBqPSAoQUNQSV9OQU1FX1NJWkUgLSAxKTsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyssIGotLSkgeworCQlyZXZlcnNlZF9uYW1lMVtqXSA9IG5hbWUxW2ldOworCQlpZiAobmFtZTFbaV0gPT0gJ18nKSB7CisJCQlyZXZlcnNlZF9uYW1lMVtqXSA9ICcqJzsKKwkJfQorCisJCXJldmVyc2VkX25hbWUyW2pdID0gbmFtZTJbaV07CisJCWlmIChuYW1lMltpXSA9PSAnXycpIHsKKwkJCXJldmVyc2VkX25hbWUyW2pdID0gJyonOworCQl9CisJfQorCisJcmV0dXJuICgqKGludCAqKSByZXZlcnNlZF9uYW1lMSAtICooaW50ICopIHJldmVyc2VkX25hbWUyKTsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jCmluZGV4IDFmNmFmM2UuLjZjMmFlZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYwpAQCAtNTAsMTYgKzUwLDMyIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zZHVtcCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCit2b2lkCithY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzICgKKwl2b2lkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2R1bXBfb25lX2RldmljZSAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKyNlbmRpZgorCiAKICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgbnVtX3NlZ21lbnQgICAgICAgICAtIE51bWJlciBvZiBBQ1BJIG5hbWUgc2VnbWVudHMKKyAqIFBBUkFNRVRFUlM6ICBudW1fc2VnbWVudHMgICAgICAgIC0gTnVtYmVyIG9mIEFDUEkgbmFtZSBzZWdtZW50cwogICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAgICAgLSBUaGUgY29tcHJlc3NlZCAoaW50ZXJuYWwpIHBhdGgKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBQcmludCBhbiBvYmplY3QncyBmdWxsIG5hbWVzcGFjZSBwYXRobmFtZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDMsNiArMTE5LDggQEAKICAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gRGVzaXJlZCBkZWJ1ZyBsZXZlbAogICogICAgICAgICAgICAgIENvbXBvbmVudCAgICAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBQcmludCBhbiBvYmplY3QncyBmdWxsIG5hbWVzcGFjZSBwYXRobmFtZQogICogICAgICAgICAgICAgIE1hbmFnZXMgYWxsb2NhdGlvbi9mcmVlaW5nIG9mIGEgcGF0aG5hbWUgYnVmZmVyCiAgKgpAQCAtMTM3LDkgKzE1NSwxMiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfb25lX29iamVjdAogICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gTm9kZSB0byBiZSBkdW1wZWQKKyAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgICAgIC0gTm9kZSB0byBiZSBkdW1wZWQKICAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gTmVzdGluZyBsZXZlbCBvZiB0aGUgaGFuZGxlCiAgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCBpbnRvIHdhbGtfbmFtZXNwYWNlCisgKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgICAgICAtIE5vdCB1c2VkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBEdW1wIGEgc2luZ2xlIE5vZGUKICAqICAgICAgICAgICAgICBUaGlzIHByb2NlZHVyZSBpcyBhIHVzZXJfZnVuY3Rpb24gY2FsbGVkIGJ5IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UuCkBAIC0zOTQsOCArNDE1LDcgQEAKIAkJCXJldHVybiAoQUVfT0spOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIoUiVkKSIsCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOworCQlhY3BpX29zX3ByaW50ZiAoIihSJWQpIiwgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCiAJCXN3aXRjaCAodHlwZSkgewogCQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CkBAIC01NTEsMTggKzU3MSwyMCBAQAogCiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfb2JqZWN0cwogICoKICAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gYmUgZHVtcGVkCisgKiAgICAgICAgICAgICAgZGlzcGxheV90eXBlICAgICAgICAtIDAgb3IgQUNQSV9ESVNQTEFZX1NVTU1BUlkKICAqICAgICAgICAgICAgICBtYXhfZGVwdGggICAgICAgICAgIC0gTWF4aW11bSBkZXB0aCBvZiBkdW1wLiBVc2UgQUNQSV9VSU5UMzJfTUFYCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBlZmZlY3RpdmVseSB1bmxpbWl0ZWQgZGVwdGguCiAgKiAgICAgICAgICAgICAgb3duZXJfaWQgICAgICAgICAgICAtIER1bXAgb25seSBvYmplY3RzIG93bmVkIGJ5IHRoaXMgSUQuICBVc2UKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMzJfTUFYIHRvIG1hdGNoIGFsbCBvd25lcnMuCiAgKiAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlICAgICAgICAtIFdoZXJlIGluIG5hbWVzcGFjZSB0byBzdGFydC9lbmQgc2VhcmNoCiAgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCiAgKiBERVNDUklQVElPTjogRHVtcCB0eXBlZCBvYmplY3RzIHdpdGhpbiB0aGUgbG9hZGVkIG5hbWVzcGFjZS4KICAqICAgICAgICAgICAgICBVc2VzIGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgaW4gY29uanVuY3Rpb24gd2l0aCBhY3BpX25zX2R1bXBfb25lX29iamVjdC4KICAqCkBAIC01OTAsMTAgKzYxMiw0NCBAQAogCQkJIEFDUElfTlNfV0FMS19OT19VTkxPQ0ssIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0LAogCQkJICh2b2lkICopICZpbmZvLCBOVUxMKTsKIH0KKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9lbnRyeQorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gTm9kZSB0byBiZSBkdW1wZWQKKyAqICAgICAgICAgICAgICBkZWJ1Z19sZXZlbCAgICAgICAgIC0gT3V0cHV0IGxldmVsCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9uc19kdW1wX2VudHJ5ICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2xldmVsKQoreworCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAgICAgICAgICAgaW5mbzsKKworCisJQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKworCisJaW5mby5kZWJ1Z19sZXZlbCA9IGRlYnVnX2xldmVsOworCWluZm8ub3duZXJfaWQgPSBBQ1BJX1VJTlQzMl9NQVg7CisJaW5mby5kaXNwbGF5X3R5cGUgPSBBQ1BJX0RJU1BMQVlfU1VNTUFSWTsKKworCSh2b2lkKSBhY3BpX25zX2R1bXBfb25lX29iamVjdCAoaGFuZGxlLCAxLCAmaW5mbywgTlVMTCk7Cit9CisKKworI2lmZGVmIF9BQ1BJX0FTTF9DT01QSUxFUgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX3RhYmxlcwogICoKICAqIFBBUkFNRVRFUlM6ICBzZWFyY2hfYmFzZSAgICAgICAgIC0gUm9vdCBvZiBzdWJ0cmVlIHRvIGJlIGR1bXBlZCwgb3IKQEAgLTYwMSw2ICs2NTcsOCBAQAogICogICAgICAgICAgICAgIG1heF9kZXB0aCAgICAgICAgICAgLSBNYXhpbXVtIGRlcHRoIG9mIGR1bXAuICBVc2UgSU5UX01BWAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gZWZmZWN0aXZlbHkgdW5saW1pdGVkIGRlcHRoLgogICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgogICogREVTQ1JJUFRJT046IER1bXAgdGhlIG5hbWUgc3BhY2UsIG9yIGEgcG9ydGlvbiBvZiBpdC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjI2LDcgKzY4NCw3IEBACiAJfQogCiAJaWYgKEFDUElfTlNfQUxMID09IHNlYXJjaF9iYXNlKSB7Ci0JCS8qICBlbnRpcmUgbmFtZXNwYWNlICAgICovCisJCS8qIEVudGlyZSBuYW1lc3BhY2UgKi8KIAogCQlzZWFyY2hfaGFuZGxlID0gYWNwaV9nYmxfcm9vdF9ub2RlOwogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsICJcXFxuIikpOwpAQCAtNjM2LDM4ICs2OTQsNSBAQAogCQkJQUNQSV9VSU5UMzJfTUFYLCBzZWFyY2hfaGFuZGxlKTsKIAlyZXR1cm5fVk9JRDsKIH0KLQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX2VudHJ5Ci0gKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBOb2RlIHRvIGJlIGR1bXBlZAotICogICAgICAgICAgICAgIGRlYnVnX2xldmVsICAgICAgICAgLSBPdXRwdXQgbGV2ZWwKLSAqCi0gKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9uc19kdW1wX2VudHJ5ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2xldmVsKQotewotCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAgICAgICAgICAgaW5mbzsKLQotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JaW5mby5kZWJ1Z19sZXZlbCA9IGRlYnVnX2xldmVsOwotCWluZm8ub3duZXJfaWQgPSBBQ1BJX1VJTlQzMl9NQVg7Ci0JaW5mby5kaXNwbGF5X3R5cGUgPSBBQ1BJX0RJU1BMQVlfU1VNTUFSWTsKLQotCSh2b2lkKSBhY3BpX25zX2R1bXBfb25lX29iamVjdCAoaGFuZGxlLCAxLCAmaW5mbywgTlVMTCk7Ci19Ci0KLSNlbmRpZgotCisjZW5kaWYJLyogX0FDUElfQVNMX0NPTVBJTEVSICovCisjZW5kaWYJLyogZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCmluZGV4IGQzMGE1OWUuLjI3YzRmN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMKQEAgLTQzLDE1ICs0MywxOCBAQAogCiAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKIAorLyogVEJEOiBUaGlzIGVudGlyZSBtb2R1bGUgaXMgYXBwYXJlbnRseSBvYnNvbGV0ZSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgKi8KKwogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc2R1bXBkdiIpCiAKLQorI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiAjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQogCisjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfb25lX2RldmljZQpAQCAtNTksMTMgKzYyLDE2IEBACiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE5vZGUgdG8gYmUgZHVtcGVkCiAgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICAgICAtIE5lc3RpbmcgbGV2ZWwgb2YgdGhlIGhhbmRsZQogICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgaW50byB3YWxrX25hbWVzcGFjZQorICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBOb3QgdXNlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIGRldmljZQogICogICAgICAgICAgICAgIFRoaXMgcHJvY2VkdXJlIGlzIGEgdXNlcl9mdW5jdGlvbiBjYWxsZWQgYnkgYWNwaV9uc193YWxrX25hbWVzcGFjZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX25zX2R1bXBfb25lX2RldmljZSAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCkBAIC0xMDgsMTIgKzExNCwxNSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCiAgKiBERVNDUklQVElPTjogRHVtcCBhbGwgb2JqZWN0cyBvZiB0eXBlICJkZXZpY2UiCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcyAodm9pZCkKK2FjcGlfbnNfZHVtcF9yb290X2RldmljZXMgKAorCXZvaWQpCiB7CiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzeXNfYnVzX2hhbmRsZTsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKQEAgLTE0Miw1ICsxNTEsNiBAQAogfQogCiAjZW5kaWYKKyNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jCmluZGV4IDBkMDA4ZDUuLjFhZTg5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYwpAQCAtNTIsMTkgKzUyLDMzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zZXZhbCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QgKAorCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfZ2V0X29iamVjdF92YWx1ZSAoCisJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiBtZXRob2QgdG8gZXhlY3V0ZSwgSWYgTlVMTCwgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBpcyB0aGUgb2JqZWN0IHRvIGV4ZWN1dGUKLSAqICAgICAgICAgICAgICBJbmZvICAgICAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sKKyAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBOYW1lIG9mIG1ldGhvZCB0byBleGVjdXRlLCBJZiBOVUxMLCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgaXMgdGhlIG9iamVjdCB0byBleGVjdXRlCisgKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiAgSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgICAgIFBhcmFtcyAgICAgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIFBhcmFtcyBpdHNlbGYgbWF5IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRmluZCBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCB1c2luZyB0aGUgaGFuZGxlIGFzIGEKLSAqICAgICAgICAgICAgICBzY29wZQorICogREVTQ1JJUFRJT046IEV2YWx1YXRlIHRoZSBvYmplY3Qgb3IgZmluZCBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZAogICoKICAqIE1VVEVYOiAgICAgICBMb2NrcyBOYW1lc3BhY2UKICAqCkBAIC0xNTcsOCArMTcxLDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lCiAgKgotICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAgICAgLSBGdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUgdG8gdGhlIG9iamVjdAotICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAgICAgLSBDb250YWluczoKKyAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBGdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUgdG8gdGhlIG9iamVjdAorICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jaywgY29udGFpbnM6CiAgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuICBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqICAgICAgICAgICAgICAgICAgUGFyYW1zICAgICAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCwKQEAgLTE2Nyw4ICsxODEsOCBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRmluZCBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCBwYXNzaW5nIHRoZSBnaXZlbgotICogICAgICAgICAgICAgIHBhcmFtZXRlcnMKKyAqIERFU0NSSVBUSU9OOiBFdmFsdWF0ZSB0aGUgb2JqZWN0IG9yIHJpbmQgYW5kIGV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBtZXRob2QKKyAqICAgICAgICAgICAgICBwYXNzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCiAgKgogICogTVVURVg6ICAgICAgIExvY2tzIE5hbWVzcGFjZQogICoKQEAgLTI0MSwxNyArMjU1LDIxIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlCiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBNZXRob2QgTm9kZSB0byBleGVjdXRlCi0gKiAgICAgICAgICAgICAgUGFyYW1zICAgICAgICAgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIFBhcmFtcyBpdHNlbGYgbWF5IGJlCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBNZXRob2QvT2JqZWN0IE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuIFBhcmFtcyBpdHNlbGYgbWF5IGJlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICogICAgICAgICAgICAgIHBhcmFtX3R5cGUgICAgICAgICAgLSBUeXBlIG9mIFBhcmFtZXRlciBsaXN0Ci0gKiAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgICAgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuICBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl90eXBlICAtIFR5cGUgb2YgUGFyYW1ldGVyIGxpc3QKKyAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHBhc3NpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMKKyAqIERFU0NSSVBUSU9OOiBFdmFsdWF0ZSBvYmplY3Qgb3IgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCBwYXNzaW5nIHRoZQorICogICAgICAgICAgICAgIGdpdmVuIHBhcmFtZXRlcnMKICAqCiAgKiBNVVRFWDogICAgICAgTG9ja3MgTmFtZXNwYWNlCiAgKgpAQCAtMzQ1LDcgKzM2MywxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QKICAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sgKHcvcGFyYW1zKQorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kIE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuIFBhcmFtcyBpdHNlbGYgbWF5IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3R5cGUgIC0gVHlwZSBvZiBQYXJhbWV0ZXIgbGlzdAorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzU1LDcgKzM4Miw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kICgKIAlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKQogewpAQCAtNDE0LDcgKzQ0MSwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUKICAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sgKHcvcGFyYW1zKQorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gT2JqZWN0J3MgTlMgbm9kZQorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgb2JqZWN0IHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDI0LDcgKzQ1NCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlICgKIAlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNpbml0LmMKaW5kZXggNGE0NmIzOC4uMzYyODAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCkBAIC01MCw2ICs1MCwyMiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc2luaXQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19pbml0X29uZV9vYmplY3QgKAorCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19pbml0X29uZV9kZXZpY2UgKAorCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE5MSw3ICsyMDcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfbnNfaW5pdF9vbmVfb2JqZWN0ICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKQEAgLTMzMSw3ICszNDcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLApAQCAtMzc0LDcgKzM5MCw4IEBACiAJLyoKIAkgKiBSdW4gX1NUQSB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHJ1biBfSU5JIG9uIHRoZSBkZXZpY2UuCiAJICovCi0JQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoQUNQSV9UWVBFX01FVEhPRCwgcGluZm8ubm9kZSwgIl9TVEEiKSk7CisJQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoQUNQSV9UWVBFX01FVEhPRCwKKwkJCSAgIHBpbmZvLm5vZGUsIE1FVEhPRF9OQU1FX19TVEEpKTsKIAlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBIChwaW5mby5ub2RlLCAmZmxhZ3MpOwogCiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMzk5LDggKzQxNiw5IEBACiAJLyoKIAkgKiBUaGUgZGV2aWNlIGlzIHByZXNlbnQuIFJ1biBfSU5JLgogCSAqLwotCUFDUElfREVCVUdfRVhFQyAoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKEFDUElfVFlQRV9NRVRIT0QsIHBpbmZvLm5vZGUsICJfSU5JIikpOwotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKCJfSU5JIiwgJnBpbmZvKTsKKwlBQ1BJX0RFQlVHX0VYRUMgKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lIChBQ1BJX1RZUEVfTUVUSE9ELAorCQkJICAgcGluZm8ubm9kZSwgTUVUSE9EX05BTUVfX0lOSSkpOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKE1FVEhPRF9OQU1FX19JTkksICZwaW5mbyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkvKiBObyBfSU5JIChBRV9OT1RfRk9VTkQpIG1lYW5zIGRldmljZSByZXF1aXJlcyBubyBpbml0aWFsaXphdGlvbiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYwppbmRleCAxZDdhZWRmLi4zNGU0OTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMKQEAgLTUwLDkgKzUwLDI0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zbG9hZCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoCisJYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKTsKKworI2lmZGVmIEFDUElfRlVUVVJFX0lNUExFTUVOVEFUSU9OCithY3BpX3N0YXR1cworYWNwaV9uc191bmxvYWRfbmFtZXNwYWNlICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19kZWxldGVfc3VidHJlZSAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUpOworI2VuZGlmCisKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19sb2FkX3RhYmxlCkBAIC0xNTksNyArMTc0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoCiAJYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKQogewpAQCAtMzIxLDggKzMzNiw3IEBACiB9CiAKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0KKyNpZmRlZiBBQ1BJX0ZVVFVSRV9JTVBMRU1FTlRBVElPTgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZWxldGVfc3VidHJlZQpAQCAtMzM5LDcgKzM1Myw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9uc19kZWxldGVfc3VidHJlZSAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUpCiB7CkBAIC00NTMsOCArNDY3LDYgQEAKIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KLQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KKyNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKaW5kZXggYjZmOGY5MS4uZDhjZTdlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKQEAgLTUwLDYgKzUwLDE0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zbmFtZXMiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGggKAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfYnVmZmVyKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY2LDcgKzc0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKQEAgLTEyNiw3ICsxMzQsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZQogICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOUyBub2RlIHdob3NlIHBhdGhuYW1lIGlzIG5lZWRlZAorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIHdob3NlIHBhdGhuYW1lIGlzIG5lZWRlZAogICoKICAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHN0b3JhZ2UgY29udGFpbmluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YKICAqICAgICAgICAgICAgICB0aGUgbm9kZSwgSW4gZXh0ZXJuYWwgZm9ybWF0IChuYW1lIHNlZ21lbnRzIHNlcGFyYXRlZCBieSBwYXRoCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKaW5kZXggNGU0MWU2Ni4uMjcyNThjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYwpAQCAtNjAsNiArNjAsOCBAQAogICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgLSBUeXBlIG9mIG9iamVjdCwgb3IgQUNQSV9UWVBFX0FOWSBpZiBub3QKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd24KICAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgogICogREVTQ1JJUFRJT046IFJlY29yZCB0aGUgZ2l2ZW4gb2JqZWN0IGFzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCiAgKiAgICAgICAgICAgICAgbmFtZSB3aG9zZSBhY3BpX2hhbmRsZSBpcyBwYXNzZWQuICBJZiBPYmplY3QgaXMgTlVMTAogICogICAgICAgICAgICAgIGFuZCBUeXBlIGlzIEFDUElfVFlQRV9BTlksIHNldCB0aGUgbmFtZSBhcyBoYXZpbmcgbm8gdmFsdWUuCkBAIC05Nyw3ICs5OSw4IEBACiAJaWYgKCFvYmplY3QgJiYgKEFDUElfVFlQRV9BTlkgIT0gdHlwZSkpIHsKIAkJLyogTnVsbCBvYmplY3QgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJuc19hdHRhY2hfb2JqZWN0OiBOdWxsIG9iamVjdCwgYnV0IHR5cGUgbm90IEFDUElfVFlQRV9BTllcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJuc19hdHRhY2hfb2JqZWN0OiBOdWxsIG9iamVjdCwgYnV0IHR5cGUgbm90IEFDUElfVFlQRV9BTllcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKQEAgLTExMiw3ICsxMTUsOCBAQAogCS8qIENoZWNrIGlmIHRoaXMgb2JqZWN0IGlzIGFscmVhZHkgYXR0YWNoZWQgKi8KIAogCWlmIChub2RlLT5vYmplY3QgPT0gb2JqZWN0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmogJXAgYWxyZWFkeSBpbnN0YWxsZWQgaW4gbmFtZV9vYmogJXBcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiT2JqICVwIGFscmVhZHkgaW5zdGFsbGVkIGluIG5hbWVfb2JqICVwXG4iLAogCQkJb2JqZWN0LCBub2RlKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CkBAIC0xOTIsNyArMTk2LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZXRhY2hfb2JqZWN0CiAgKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgIC0gQW4gbm9kZSB3aG9zZSBvYmplY3Qgd2lsbCBiZSBkZXRhY2hlZAorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgIC0gQSBOYW1lc3BhY2Ugbm9kZSB3aG9zZSBvYmplY3Qgd2lsbCBiZSBkZXRhY2hlZAogICoKICAqIFJFVFVSTjogICAgICBOb25lLgogICoKQEAgLTI0OCw3ICsyNTIsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIFBhcmVudCBOb2RlIHRvIGJlIGV4YW1pbmVkCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCiAgKgogICogUkVUVVJOOiAgICAgIEN1cnJlbnQgdmFsdWUgb2YgdGhlIG9iamVjdCBmaWVsZCBmcm9tIHRoZSBOb2RlIHdob3NlCiAgKiAgICAgICAgICAgICAgaGFuZGxlIGlzIHBhc3NlZApAQCAtMjg0LDcgKzI4OCw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIFBhcmVudCBOb2RlIHRvIGJlIGV4YW1pbmVkCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCiAgKgogICogUkVUVVJOOiAgICAgIEN1cnJlbnQgdmFsdWUgb2YgdGhlIG9iamVjdCBmaWVsZCBmcm9tIHRoZSBOb2RlIHdob3NlCiAgKiAgICAgICAgICAgICAgaGFuZGxlIGlzIHBhc3NlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYwppbmRleCAwZTZkZWEyLi5hZjhhYWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCkBAIC00OSwxNSArNDksMjQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNzZWFyY2giKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X25hbWUsCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKKwlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKnJldHVybl9ub2RlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3NlYXJjaF9ub2RlCiAgKgotICogUEFSQU1FVEVSUzogICp0YXJnZXRfbmFtZSAgICAgICAgLSBBc2NpaSBBQ1BJIG5hbWUgdG8gc2VhcmNoIGZvcgotICogICAgICAgICAgICAgICpOb2RlICAgICAgICAgICAgICAgLSBTdGFydGluZyBub2RlIHdoZXJlIHNlYXJjaCB3aWxsIGJlZ2luCi0gKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCi0gKiAgICAgICAgICAgICAgKipyZXR1cm5fbm9kZSAgICAgICAtIFdoZXJlIHRoZSBtYXRjaGVkIE5hbWVkIG9iaiBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIHRhcmdldF9uYW1lICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yCisgKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCisgKiAgICAgICAgICAgICAgcmV0dXJuX25vZGUgICAgIC0gV2hlcmUgdGhlIG1hdGNoZWQgTmFtZWQgb2JqIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTE2MywxMCArMTcyLDEwIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlCiAgKgotICogUEFSQU1FVEVSUzogICp0YXJnZXRfbmFtZSAgICAgICAgLSBBc2NpaSBBQ1BJIG5hbWUgdG8gc2VhcmNoIGZvcgotICogICAgICAgICAgICAgICpOb2RlICAgICAgICAgICAgICAgLSBTdGFydGluZyBub2RlIHdoZXJlIHNlYXJjaCB3aWxsIGJlZ2luCi0gKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCi0gKiAgICAgICAgICAgICAgKipyZXR1cm5fbm9kZSAgICAgICAtIFdoZXJlIHRoZSBtYXRjaGVkIE5vZGUgaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICB0YXJnZXRfbmFtZSAgICAgLSBBc2NpaSBBQ1BJIG5hbWUgdG8gc2VhcmNoIGZvcgorICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KKyAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBPYmplY3QgdHlwZSB0byBtYXRjaAorICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAtIFdoZXJlIHRoZSBtYXRjaGVkIE5vZGUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjU3LDEyICsyNjYsMTIgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgdGFyZ2V0X25hbWUgICAgICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yICg0IGNoYXJzKQogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSB3YWxrCi0gKiAgICAgICAgICAgICAgKk5vZGUgICAgICAgICAgICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KKyAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgogICogICAgICAgICAgICAgIGludGVycHJldGVyX21vZGUgICAgLSBBZGQgbmFtZXMgb25seSBpbiBBQ1BJX01PREVfTE9BRF9QQVNTX3guCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSxzZWFyY2ggb25seS4KICAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gbWF0Y2gKICAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRmxhZ3MgZGVzY3JpYmluZyB0aGUgc2VhcmNoIHJlc3RyaWN0aW9ucwotICogICAgICAgICAgICAgICoqcmV0dXJuX25vZGUgICAgICAgLSBXaGVyZSB0aGUgTm9kZSBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAgICAgLSBXaGVyZSB0aGUgTm9kZSBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCmluZGV4IDc1ZGE3NmMuLmM1M2I4MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCkBAIC01MSw2ICs1MSwxOCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc3V0aWxzIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTgKK2FjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwKTsKKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCithY3BpX25hbWUKK2FjcGlfbnNfZmluZF9wYXJlbnRfbmFtZSAoCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZV90b19zZWFyY2gpOworI2VuZGlmCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01OSw3ICs3MSw4IEBACiAgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCisgKiAgICAgICAgICAgICAgaW50ZXJuYWxfbmFtZSAgICAgICAtIE5hbWUgb3IgcGF0aCBvZiB0aGUgbmFtZXNwYWNlIG5vZGUKKyAqICAgICAgICAgICAgICBsb29rdXBfc3RhdHVzICAgICAgIC0gRXhjZXB0aW9uIGNvZGUgZnJvbSBOUyBsb29rdXAKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTEyMSw2ICsxMzQsOSBAQAogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCisgKiAgICAgICAgICAgICAgcHJlZml4X25vZGUgICAgICAgICAtIFByZWZpeCByZWxhdGl2ZSB0byB0aGUgcGF0aAorICogICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgLSBQYXRoIHRvIHRoZSBub2RlCisgKiAgICAgICAgICAgICAgbWV0aG9kX3N0YXR1cyAgICAgICAtIEV4ZWN1dGlvbiBzdGF0dXMKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTE2MSw4ICsxNzcsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAgICAtIE9iamVjdAotICogICAgICAgICAgICAgIE1zZyAgICAgICAgICAgICAgICAgLSBQcmVmaXggbWVzc2FnZQorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE9iamVjdAorICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAtIFByZWZpeCBtZXNzYWdlCiAgKgogICogREVTQ1JJUFRJT046IFByaW50IGFuIG9iamVjdCdzIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCiAgKiAgICAgICAgICAgICAgTWFuYWdlcyBhbGxvY2F0aW9uL2ZyZWVpbmcgb2YgYSBwYXRobmFtZSBidWZmZXIKQEAgLTE3Miw3ICsxODgsNyBAQAogdm9pZAogYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1zZykKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgYnVmZmVyOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwpAQCAtMTg5LDggKzIwNSw4IEBACiAKIAlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZSAobm9kZSwgJmJ1ZmZlcik7CiAJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQlpZiAobXNnKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiVzICIsIG1zZyk7CisJCWlmIChtZXNzYWdlKSB7CisJCQlhY3BpX29zX3ByaW50ZiAoIiVzICIsIG1lc3NhZ2UpOwogCQl9CiAKIAkJYWNwaV9vc19wcmludGYgKCJbJXNdIChOb2RlICVwKSIsIChjaGFyICopIGJ1ZmZlci5wb2ludGVyLCBub2RlKTsKQEAgLTIyNCw3ICsyNDAsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yCiAgKgotICogUEFSQU1FVEVSUzogIFNlcCAgICAgICAgICAgICAgLSBDaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZAorICogUEFSQU1FVEVSUzogIFNlcCAgICAgICAgIC0gQ2hhcmFjdGVyIHRvIGJlIGNoZWNrZWQKICAqCiAgKiBSRVRVUk46ICAgICAgVFJVRSBpZiBhIHZhbGlkIHBhdGggc2VwYXJhdG9yCiAgKgpAQCAtMjMyLDcgKzI0OCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKK3N0YXRpYyB1OAogYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvciAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXApCiB7CkBAIC0yNDUsMTAgKzI2MSwxMiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF90eXBlCiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBQYXJlbnQgTm9kZSB0byBiZSBleGFtaW5lZAorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgIC0gUGFyZW50IE5vZGUgdG8gYmUgZXhhbWluZWQKICAqCiAgKiBSRVRVUk46ICAgICAgVHlwZSBmaWVsZCBmcm9tIE5vZGUgd2hvc2UgaGFuZGxlIGlzIHBhc3NlZAogICoKKyAqIERFU0NSSVBUSU9OOiBSZXR1cm4gdGhlIHR5cGUgb2YgYSBOYW1lc3BhY2Ugbm9kZQorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfb2JqZWN0X3R5cGUKQEAgLTI3MSwxMSArMjg5LDEzIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9jYWwKICAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgIC0gQSBuYW1lc3BhY2Ugb2JqZWN0IHR5cGUKKyAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAtIEEgbmFtZXNwYWNlIG9iamVjdCB0eXBlCiAgKgogICogUkVUVVJOOiAgICAgIExPQ0FMIGlmIG5hbWVzIG11c3QgYmUgZm91bmQgbG9jYWxseSBpbiBvYmplY3RzIG9mIHRoZQogICogICAgICAgICAgICAgIHBhc3NlZCB0eXBlLCAwIGlmIGVuY2xvc2luZyBzY29wZXMgc2hvdWxkIGJlIHNlYXJjaGVkCiAgKgorICogREVTQ1JJUFRJT046IFJldHVybnMgc2NvcGUgcnVsZSBmb3IgdGhlIGdpdmVuIG9iamVjdCB0eXBlLgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHUzMgpAQCAtMzAzLDcgKzMyMyw3IEBACiAgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gSW5mbyBzdHJ1Y3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBuYW1lIHBvaW50ZXIuCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGludGVybmFsIChBTUwpIG5hbWVzdHJpbmcKICAqICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHRlcm5hbCAoQVNMKSBuYW1lc3RyaW5nLgpAQCAtNTUxLDE0ICs1NzEsMTYgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lCiAgKgotICogUEFSQU1FVEVSUzogICppbnRlcm5hbF9uYW1lICAgICAgICAgLSBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBuYW1lCi0gKiAgICAgICAgICAgICAgKipjb252ZXJ0ZWRfbmFtZSAgICAgICAtIFdoZXJlIHRvIHJldHVybiB0aGUgcmVzdWx0aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIG5hbWUKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9uYW1lX2xlbmd0aCAtIExlbnRoIG9mIHRoZSBpbnRlcm5hbCBuYW1lIGJlbG93CisgKiAgICAgICAgICAgICAgaW50ZXJuYWxfbmFtZSAgICAgICAtIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIG5hbWUKKyAqICAgICAgICAgICAgICBjb252ZXJ0ZWRfbmFtZV9sZW5ndGggLSBXaGVyZSB0aGUgbGVuZ3RoIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgY29udmVydGVkX25hbWUgICAgICAtIFdoZXJlIHRoZSByZXN1bHRpbmcgZXh0ZXJuYWwgbmFtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBpbnRlcm5hbCBuYW1lIChlLmcuIDVjIDJmIDAyIDVmIDUwIDUyIDVmIDQzIDUwIDU1IDMwKQotICogICAgICAgICAgICAgIHRvIGl0cyBleHRlcm5hbCBmb3JtIChlLmcuICJcX1BSXy5DUFUwIikKKyAqICAgICAgICAgICAgICB0byBpdHMgZXh0ZXJuYWwgKHByaW50YWJsZSkgZm9ybSAoZS5nLiAiXF9QUl8uQ1BVMCIpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNzE3LDggKzczOSw5IEBACiAgKgogICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBuYW1lc3BhY2UgaGFuZGxlIHRvIGEgcmVhbCBOb2RlCiAgKgotICogTm90ZTogUmVhbCBpbnRlZ2VyIGhhbmRsZXMgYWxsb3cgZm9yIG1vcmUgdmVyaWZpY2F0aW9uCi0gKiAgICAgICBhbmQga2VlcCBhbGwgcG9pbnRlcnMgd2l0aGluIHRoaXMgc3Vic3lzdGVtLgorICogTm90ZTogUmVhbCBpbnRlZ2VyIGhhbmRsZXMgd291bGQgYWxsb3cgZm9yIG1vcmUgdmVyaWZpY2F0aW9uCisgKiAgICAgICBhbmQga2VlcCBhbGwgcG9pbnRlcnMgd2l0aGluIHRoaXMgc3Vic3lzdGVtIC0gaG93ZXZlciB0aGlzIGludHJvZHVjZXMKKyAqICAgICAgIG1vcmUgKGFuZCBwZXJoYXBzIHVubmVjZXNzYXJ5KSBvdmVyaGVhZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC03NzUsNyArNzk4LDcgQEAKIAlyZXR1cm4gKChhY3BpX2hhbmRsZSkgbm9kZSk7CiAKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBFeGFtcGxlIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCWlmICghTm9kZSkKIAl7CkBAIC04MDEsMTIgKzgyNCwxMyBAQAogICoKICAqIFJFVFVSTjogICAgICBub25lCiAgKgotICogREVTQ1JJUFRJT046IGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGFibGUgc3RvcmFnZS4KKyAqIERFU0NSSVBUSU9OOiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG5hbWVzcGFjZSBhbmQgQUNQSSB0YWJsZSBzdG9yYWdlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfbnNfdGVybWluYXRlICh2b2lkKQorYWNwaV9uc190ZXJtaW5hdGUgKAorCXZvaWQpCiB7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CiAKQEAgLTk0MCw3ICs5NjQsNiBAQAogCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CiAKIGNsZWFudXA6Ci0JLyogQ2xlYW51cCAqLwogCWlmIChpbnRlcm5hbF9wYXRoKSB7CiAJCUFDUElfTUVNX0ZSRUUgKGludGVybmFsX3BhdGgpOwogCX0KQEAgLTk1MCw2ICs5NzMsNzQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfcGFyZW50X25vZGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAtIEN1cnJlbnQgdGFibGUgZW50cnkKKyAqCisgKiBSRVRVUk46ICAgICAgUGFyZW50IGVudHJ5IG9mIHRoZSBnaXZlbiBlbnRyeQorICoKKyAqIERFU0NSSVBUSU9OOiBPYnRhaW4gdGhlIHBhcmVudCBlbnRyeSBmb3IgYSBnaXZlbiBlbnRyeSBpbiB0aGUgbmFtZXNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKK2FjcGlfbnNfZ2V0X3BhcmVudF9ub2RlICgKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisKKworCWlmICghbm9kZSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogV2FsayB0byB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LiBUaGUgbGFzdCBlbnRyeSBpcyBtYXJrZWQgd2l0aCBhIGZsYWcKKwkgKiBhbmQgdGhlIHBlZXIgcG9pbnRlciBpcyByZWFsbHkgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHBhcmVudC4gVGhpcyBzYXZlcworCSAqIHB1dHRpbmcgYSBwYXJlbnQgYmFjayBwb2ludGVyIGluIGVhY2ggYW5kIGV2ZXJ5IG5hbWVkIG9iamVjdCEKKwkgKi8KKwl3aGlsZSAoIShub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpKSB7CisJCW5vZGUgPSBub2RlLT5wZWVyOworCX0KKworCXJldHVybiAobm9kZS0+cGVlcik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgLSBDdXJyZW50IHRhYmxlIGVudHJ5CisgKgorICogUkVUVVJOOiAgICAgIE5leHQgdmFsaWQgTm9kZSBpbiB0aGUgbGlua2VkIG5vZGUgbGlzdC4gTlVMTCBpZiBubyBtb3JlIHZhbGlkCisgKiAgICAgICAgICAgICAgbm9kZXMuCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgdGhlIG5leHQgdmFsaWQgbm9kZSB3aXRoaW4gYSBuYW1lIHRhYmxlLgorICogICAgICAgICAgICAgIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIE5VTEwtZW5kLW9mLWxpc3QgbG9vcHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgorYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlICgKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQoreworCisJLyogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhpcyBwZWVyIGxpc3QsIHJldHVybiBOVUxMICovCisKKwlpZiAobm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgbmV4dCBwZWVyICovCisKKwlyZXR1cm4gKG5vZGUtPnBlZXIpOworfQorCisKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19maW5kX3BhcmVudF9uYW1lCiAgKgogICogUEFSQU1FVEVSUzogICpjaGlsZF9ub2RlICAgICAgICAgICAgLSBOYW1lZCBPYmogd2hvc2UgbmFtZSBpcyB0byBiZSBmb3VuZApAQCAtOTYxLDcgKzEwNTIsNyBAQAogICogICAgICAgICAgICAgICh3aGljaCAic2hvdWxkIG5vdCBoYXBwZW4iKS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisKIGFjcGlfbmFtZQogYWNwaV9uc19maW5kX3BhcmVudF9uYW1lICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlKQpAQCAtOTk3LDczICsxMDg4LDMgQEAKICNlbmRpZgogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgLSBDdXJyZW50IHRhYmxlIGVudHJ5Ci0gKgotICogUkVUVVJOOiAgICAgIFBhcmVudCBlbnRyeSBvZiB0aGUgZ2l2ZW4gZW50cnkKLSAqCi0gKiBERVNDUklQVElPTjogT2J0YWluIHRoZSBwYXJlbnQgZW50cnkgZm9yIGEgZ2l2ZW4gZW50cnkgaW4gdGhlIG5hbWVzcGFjZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWlmICghbm9kZSkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCS8qCi0JICogV2FsayB0byB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LiBUaGUgbGFzdCBlbnRyeSBpcyBtYXJrZWQgd2l0aCBhIGZsYWcKLQkgKiBhbmQgdGhlIHBlZXIgcG9pbnRlciBpcyByZWFsbHkgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHBhcmVudC4gVGhpcyBzYXZlcwotCSAqIHB1dHRpbmcgYSBwYXJlbnQgYmFjayBwb2ludGVyIGluIGVhY2ggYW5kIGV2ZXJ5IG5hbWVkIG9iamVjdCEKLQkgKi8KLQl3aGlsZSAoIShub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpKSB7Ci0JCW5vZGUgPSBub2RlLT5wZWVyOwotCX0KLQotCi0JcmV0dXJuIChub2RlLT5wZWVyKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAtIEN1cnJlbnQgdGFibGUgZW50cnkKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV4dCB2YWxpZCBOb2RlIGluIHRoZSBsaW5rZWQgbm9kZSBsaXN0LiBOVUxMIGlmIG5vIG1vcmUgdmFsaWQKLSAqICAgICAgICAgICAgICBub2Rlcy4KLSAqCi0gKiBERVNDUklQVElPTjogRmluZCB0aGUgbmV4dCB2YWxpZCBub2RlIHdpdGhpbiBhIG5hbWUgdGFibGUuCi0gKiAgICAgICAgICAgICAgVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgTlVMTC1lbmQtb2YtbGlzdCBsb29wcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSkKLXsKLQotCS8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LCByZXR1cm4gTlVMTCAqLwotCi0JaWYgKG5vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBPdGhlcndpc2UganVzdCByZXR1cm4gdGhlIG5leHQgcGVlciAqLwotCi0JcmV0dXJuIChub2RlLT5wZWVyKTsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYwppbmRleCA0ZGUyNDQ0Li5mOWE3Mjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIFR5cGUgb2Ygbm9kZSB0byBiZSBzZWFyY2hlZCBmb3IKICAqICAgICAgICAgICAgICBwYXJlbnRfbm9kZSAgICAgICAgIC0gUGFyZW50IG5vZGUgd2hvc2UgY2hpbGRyZW4gd2UgYXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcKICAqICAgICAgICAgICAgICBjaGlsZF9ub2RlICAgICAgICAgIC0gUHJldmlvdXMgY2hpbGQgdGhhdCB3YXMgZm91bmQuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBORVhUIGNoaWxkIHdpbGwgYmUgcmV0dXJuZWQKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKaW5kZXggMWRjOTk1NS4uMTJlYTIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYwpAQCAtNTgsMTEgKzU4LDExIEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQKICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE9iamVjdCBoYW5kbGUgKG9wdGlvbmFsKQotICogICAgICAgICAgICAgICpQYXRobmFtZSAgICAgICAgICAgLSBPYmplY3QgcGF0aG5hbWUgKG9wdGlvbmFsKQotICogICAgICAgICAgICAgICoqZXh0ZXJuYWxfcGFyYW1zICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBtZXRob2QsCisgKiAgICAgICAgICAgICAgUGF0aG5hbWUgICAgICAgICAgICAtIE9iamVjdCBwYXRobmFtZSAob3B0aW9uYWwpCisgKiAgICAgICAgICAgICAgZXh0ZXJuYWxfcGFyYW1zICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIG1ldGhvZCwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBOVUxMLiAgTWF5IGJlIE5VTEwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICogICAgICAgICAgICAgICpyZXR1cm5fYnVmZmVyICAgICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgIHJldHVybl9idWZmZXIgICAgICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiAgSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCiAgKiAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgICAgICAgICAtIEV4cGVjdGVkIHR5cGUgb2YgcmV0dXJuIG9iamVjdAogICoKQEAgLTczLDYgKzczLDcgQEAKICAqICAgICAgICAgICAgICBiZSB2YWxpZCAobm9uLW51bGwpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQgKApAQCAtMzA3LDcgKzMwOCw4IEBACiAJCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewogCQkJCQkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQkJCQkJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAocmV0dXJuX2J1ZmZlciwgYnVmZmVyX3NwYWNlX25lZWRlZCk7CisJCQkJCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKHJldHVybl9idWZmZXIsCisJCQkJCQkJICBidWZmZXJfc3BhY2VfbmVlZGVkKTsKIAkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQkJLyoKIAkJCQkJCSAqIENhbGxlcidzIGJ1ZmZlciBpcyB0b28gc21hbGwgb3IgYSBuZXcgb25lIGNhbid0IGJlIGFsbG9jYXRlZApAQCAtNDIzLDcgKzQyNSw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlICh0eXBlLCBzdGFydF9vYmplY3QsIG1heF9kZXB0aCwgQUNQSV9OU19XQUxLX1VOTE9DSywKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlICh0eXBlLCBzdGFydF9vYmplY3QsIG1heF9kZXB0aCwKKwkJCSAgQUNQSV9OU19XQUxLX1VOTE9DSywKIAkJCSAgdXNlcl9mdW5jdGlvbiwgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKIAogCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CkBAIC01MjUsNyArNTI4LDggQEAKIAkJfQogCX0KIAotCXN0YXR1cyA9IGluZm8tPnVzZXJfZnVuY3Rpb24gKG9ial9oYW5kbGUsIG5lc3RpbmdfbGV2ZWwsIGluZm8tPmNvbnRleHQsIHJldHVybl92YWx1ZSk7CisJc3RhdHVzID0gaW5mby0+dXNlcl9mdW5jdGlvbiAob2JqX2hhbmRsZSwgbmVzdGluZ19sZXZlbCwgaW5mby0+Y29udGV4dCwKKwkJCSByZXR1cm5fdmFsdWUpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCmluZGV4IGYyNDA1ZWYuLjhkMDk3OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm5hbWUuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKQEAgLTU3LDkgKzU3LDkgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9oYW5kbGUKICAqCiAgKiBQQVJBTUVURVJTOiAgUGFyZW50ICAgICAgICAgIC0gT2JqZWN0IHRvIHNlYXJjaCB1bmRlciAoc2VhcmNoIHNjb3BlKS4KLSAqICAgICAgICAgICAgICBwYXRoX25hbWUgICAgICAgLSBQb2ludGVyIHRvIGFuIGFzY2lpeiBzdHJpbmcgY29udGFpbmluZyB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKLSAqICAgICAgICAgICAgICByZXRfaGFuZGxlICAgICAgLSBXaGVyZSB0aGUgcmV0dXJuIGhhbmRsZSBpcyBwbGFjZWQKKyAqICAgICAgICAgICAgICBQYXRobmFtZSAgICAgICAgLSBQb2ludGVyIHRvIGFuIGFzY2lpeiBzdHJpbmcgY29udGFpbmluZyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lCisgKiAgICAgICAgICAgICAgcmV0X2hhbmRsZSAgICAgIC0gV2hlcmUgdGhlIHJldHVybiBoYW5kbGUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjIwLDcgKzIyMCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfb2JqZWN0X2luZm8KICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gT2JqZWN0IEhhbmRsZQotICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAtIFdoZXJlIHRoZSBpbmZvIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgQnVmZmVyICAgICAgICAgIC0gV2hlcmUgdGhlIGluZm8gaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYwppbmRleCAxOWFjZjMyLi4zNjNlMWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYwpAQCAtNTYsNyArNTYsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3R5cGUKICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gSGFuZGxlIG9mIG9iamVjdCB3aG9zZSB0eXBlIGlzIGRlc2lyZWQKLSAqICAgICAgICAgICAgICAqcmV0X3R5cGUgICAgICAgLSBXaGVyZSB0aGUgdHlwZSB3aWxsIGJlIHBsYWNlZAorICogICAgICAgICAgICAgIHJldF90eXBlICAgICAgICAtIFdoZXJlIHRoZSB0eXBlIHdpbGwgYmUgcGxhY2VkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTI1OCw1ICsyNTgsNSBAQAogCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9uZXh0X29iamVjdCk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfbmV4dF9vYmplY3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IDVhOTEyOGQuLmJkZDlmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTcxLDYgKzcxLDkgQEAKIGV4dGVybiBjaGFyIGxpbmVfYnVmWzgwXTsKICNlbmRpZiAvKkVOQUJMRV9ERUJVR0dFUiovCiAKK2ludCBhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkOworRVhQT1JUX1NZTUJPTChhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKTsKKwogc3RhdGljIHVuc2lnbmVkIGludCBhY3BpX2lycV9pcnE7CiBzdGF0aWMgYWNwaV9vc2RfaGFuZGxlciBhY3BpX2lycV9oYW5kbGVyOwogc3RhdGljIHZvaWQgKmFjcGlfaXJxX2NvbnRleHQ7CkBAIC0xMTUyLDYgKzExNTUsMTUgQEAKIAogX19zZXR1cCgiYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uIiwgYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uX3NldHVwKTsKIAoraW50IF9faW5pdAorYWNwaV9ob3RrZXlfc2V0dXAoY2hhciAqc3RyKQoreworCWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQgPSBUUlVFOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJhY3BpX3NwZWNpZmljX2hvdGtleSIsIGFjcGlfaG90a2V5X3NldHVwKTsKKwogLyoKICAqIG1heF9jc3RhdGUgaXMgZGVmaW5lZCBpbiB0aGUgYmFzZSBrZXJuZWwgc28gbW9kdWxlcyBjYW4KICAqIGNoYW5nZSBpdCB3L28gZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIG1vZHVsZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCmluZGV4IGI1ZDk4ODkuLmI3YWM2OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYwpAQCAtNTAsNiArNTAsMTYgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHNhcmdzIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTMyCithY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoICgKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOworCitzdGF0aWMgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgorYWNwaV9wc19nZXRfbmV4dF9maWVsZCAoCisJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY0LDcgKzc0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIKK3N0YXRpYyB1MzIKIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGggKAogCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKIHsKQEAgLTc4LDcgKzg4LDYgQEAKIAllbmNvZGVkX2xlbmd0aCA9ICh1MzIpIEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpOwogCXBhcnNlcl9zdGF0ZS0+YW1sKys7CiAKLQogCXN3aXRjaCAoZW5jb2RlZF9sZW5ndGggPj4gNikgLyogYml0cyA2LTcgY29udGFpbiBlbmNvZGluZyBzY2hlbWUgKi8gewogCWNhc2UgMDogLyogMS1ieXRlIGVuY29kaW5nIChiaXRzIDAtNSkgKi8KIApAQCAtMjg3LDEzICsyOTYsMTQgQEAKIAkJICogcGFyZW50IHRyZWUsIGJ1dCBkb24ndCBvcGVuIGEgbmV3IHNjb3BlIC0tIHdlIGp1c3Qgd2FudCB0byBsb29rdXAgdGhlCiAJCSAqIG9iamVjdCAgKE1VU1QgQkUgbW9kZSBFWEVDVVRFIHRvIHBlcmZvcm0gdXBzZWFyY2gpCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAoJnNjb3BlX2luZm8sIHBhdGgsIEFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIE5VTEwsICZub2RlKTsKKwkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKCZzY29wZV9pbmZvLCBwYXRoLCBBQ1BJX1RZUEVfQU5ZLAorCQkJCSBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJIEFDUElfTlNfU0VBUkNIX1BBUkVOVCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLAorCQkJCSBOVUxMLCAmbm9kZSk7CiAJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykgJiYgbWV0aG9kX2NhbGwpIHsKIAkJCWlmIChub2RlLT50eXBlID09IEFDUElfVFlQRV9NRVRIT0QpIHsKLQkJCQkvKgotCQkJCSAqIFRoaXMgbmFtZSBpcyBhY3R1YWxseSBhIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24KLQkJCQkgKi8KKwkJCQkvKiBUaGlzIG5hbWUgaXMgYWN0dWFsbHkgYSBjb250cm9sIG1ldGhvZCBpbnZvY2F0aW9uICovCisKIAkJCQltZXRob2RfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CiAJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCiAJCQkJCSJDb250cm9sIE1ldGhvZCAtICVwIERlc2MgJXAgUGF0aD0lcFxuIiwKQEAgLTM2MCw3ICszNzAsNyBAQAogCQkJCS8qCiAJCQkJICogV2UgZ290IGEgTk9UX0ZPVU5EIGR1cmluZyB0YWJsZSBsb2FkIG9yIHdlIGVuY291bnRlcmVkCiAJCQkJICogYSBjb25kX3JlZl9vZih4KSB3aGVyZSB0aGUgdGFyZ2V0IGRvZXMgbm90IGV4aXN0LgotCQkJCSAqIC0tIGVpdGhlciBjYXNlIGlzIG9rCisJCQkJICogRWl0aGVyIGNhc2UgaXMgb2sKIAkJCQkgKi8KIAkJCQlzdGF0dXMgPSBBRV9PSzsKIAkJCX0KQEAgLTQ4NiwxMiArNDk2LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgorc3RhdGljIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKIGFjcGlfcHNfZ2V0X25leHRfZmllbGQgKAogCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vZmZzZXQgPSAodTMyKSBBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwKLQkJCSBwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb2Zmc2V0ID0gKHUzMikKKwkJCSAgQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5hbWwsCisJCQkJCSAgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpmaWVsZDsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7CkBAIC01MDAsNyArNTExLDcgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfZ2V0X25leHRfZmllbGQiKTsKIAogCi0JLyogZGV0ZXJtaW5lIGZpZWxkIHR5cGUgKi8KKwkvKiBEZXRlcm1pbmUgZmllbGQgdHlwZSAqLwogCiAJc3dpdGNoIChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKSkgewogCWRlZmF1bHQ6CkBAIC01MjEsNyArNTMyLDYgQEAKIAkJYnJlYWs7CiAJfQogCi0KIAkvKiBBbGxvY2F0ZSBhIG5ldyBmaWVsZCBvcCAqLwogCiAJZmllbGQgPSBhY3BpX3BzX2FsbG9jX29wIChvcGNvZGUpOwpAQCAtNTgyLDEwICs1OTIsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9hcmcKICAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKiAgICAgICAgICAgICAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAogICogICAgICAgICAgICAgIGFyZ190eXBlICAgICAgICAgICAgLSBUaGUgYXJndW1lbnQgdHlwZSAoQU1MXypfQVJHKQotICogICAgICAgICAgICAgIGFyZ19jb3VudCAgICAgICAgICAgLSBJZiB0aGUgYXJndW1lbnQgcG9pbnRzIHRvIGEgY29udHJvbCBtZXRob2QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCdzIGFyZ3VtZW50IGlzIHJldHVybmVkIGhlcmUuCisgKiAgICAgICAgICAgICAgcmV0dXJuX2FyZyAgICAgICAgICAtIFdoZXJlIHRoZSBuZXh0IGFyZyBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMsIGFuZCBhbiBvcCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV4dCBhcmd1bWVudC4KICAqCkBAIC02MTksNyArNjI5LDcgQEAKIAljYXNlIEFSR1BfTkFNRToKIAljYXNlIEFSR1BfTkFNRVNUUklORzoKIAotCQkvKiBjb25zdGFudHMsIHN0cmluZ3MsIGFuZCBuYW1lc3RyaW5ncyBhcmUgYWxsIHRoZSBzYW1lIHNpemUgKi8KKwkJLyogQ29uc3RhbnRzLCBzdHJpbmdzLCBhbmQgbmFtZXN0cmluZ3MgYXJlIGFsbCB0aGUgc2FtZSBzaXplICovCiAKIAkJYXJnID0gYWNwaV9wc19hbGxvY19vcCAoQU1MX0JZVEVfT1ApOwogCQlpZiAoIWFyZykgewpAQCAtNjU0LDcgKzY2NCw2IEBACiAJCQkJZWxzZSB7CiAJCQkJCWFyZyA9IGZpZWxkOwogCQkJCX0KLQogCQkJCXByZXYgPSBmaWVsZDsKIAkJCX0KIApAQCAtNjc3LDggKzY4Niw4IEBACiAKIAkJCS8qIEZpbGwgaW4gYnl0ZWxpc3QgZGF0YSAqLwogCi0JCQlhcmctPmNvbW1vbi52YWx1ZS5zaXplID0gKHUzMikgQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5wa2dfZW5kLAotCQkJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sKTsKKwkJCWFyZy0+Y29tbW9uLnZhbHVlLnNpemUgPSAodTMyKQorCQkJCUFDUElfUFRSX0RJRkYgKHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCwgcGFyc2VyX3N0YXRlLT5hbWwpOwogCQkJYXJnLT5uYW1lZC5kYXRhID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAKIAkJCS8qIFNraXAgdG8gRW5kIG9mIGJ5dGUgZGF0YSAqLwpAQCAtNzA2LDcgKzcxNSw3IEBACiAJCQlzdGF0dXMgPSBhY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoICh3YWxrX3N0YXRlLCBwYXJzZXJfc3RhdGUsIGFyZywgMCk7CiAJCX0KIAkJZWxzZSB7Ci0JCQkvKiBzaW5nbGUgY29tcGxleCBhcmd1bWVudCwgbm90aGluZyByZXR1cm5lZCAqLworCQkJLyogU2luZ2xlIGNvbXBsZXggYXJndW1lbnQsIG5vdGhpbmcgcmV0dXJuZWQgKi8KIAogCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMTsKIAkJfQpAQCAtNzE2LDcgKzcyNSw3IEBACiAJY2FzZSBBUkdQX0RBVEFPQko6CiAJY2FzZSBBUkdQX1RFUk1BUkc6CiAKLQkJLyogc2luZ2xlIGNvbXBsZXggYXJndW1lbnQsIG5vdGhpbmcgcmV0dXJuZWQgKi8KKwkJLyogU2luZ2xlIGNvbXBsZXggYXJndW1lbnQsIG5vdGhpbmcgcmV0dXJuZWQgKi8KIAogCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAxOwogCQlicmVhazsKQEAgLTcyNyw3ICs3MzYsNyBAQAogCWNhc2UgQVJHUF9PQkpMSVNUOgogCiAJCWlmIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgewotCQkJLyogbm9uLWVtcHR5IGxpc3Qgb2YgdmFyaWFibGUgYXJndW1lbnRzLCBub3RoaW5nIHJldHVybmVkICovCisJCQkvKiBOb24tZW1wdHkgbGlzdCBvZiB2YXJpYWJsZSBhcmd1bWVudHMsIG5vdGhpbmcgcmV0dXJuZWQgKi8KIAogCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gQUNQSV9WQVJfQVJHUzsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCmluZGV4IDAzZTMzZmUuLjU3NDQ2NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKIAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KKyNpbmNsdWRlIDxhY3BpL2Fjb3Bjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKIApAQCAtNTEsMjMgKzUyLDYgQEAKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzb3Bjb2RlIikKIAogCi0jZGVmaW5lIF9VTksgICAgICAgICAgICAgICAgICAgICAgICAweDZCCi0vKgotICogUmVzZXJ2ZWQgQVNDSUkgY2hhcmFjdGVycy4gIERvIG5vdCB1c2UgYW55IG9mIHRoZXNlIGZvcgotICogaW50ZXJuYWwgb3Bjb2Rlcywgc2luY2UgdGhleSBhcmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlCi0gKiBuYW1lIHN0cmluZ3MgZnJvbSBBTUwgb3Bjb2RlcwotICovCi0jZGVmaW5lIF9BU0MgICAgICAgICAgICAgICAgICAgICAgICAweDZDCi0jZGVmaW5lIF9OQU0gICAgICAgICAgICAgICAgICAgICAgICAweDZDCi0jZGVmaW5lIF9QRlggICAgICAgICAgICAgICAgICAgICAgICAweDZECi0jZGVmaW5lIF9VTktOT1dOX09QQ09ERSAgICAgICAgICAgICAweDAyICAgIC8qIEFuIGV4YW1wbGUgdW5rbm93biBvcGNvZGUgKi8KLQotI2RlZmluZSBNQVhfRVhURU5ERURfT1BDT0RFICAgICAgICAgMHg4OAotI2RlZmluZSBOVU1fRVhURU5ERURfT1BDT0RFICAgICAgICAgKE1BWF9FWFRFTkRFRF9PUENPREUgKyAxKQotI2RlZmluZSBNQVhfSU5URVJOQUxfT1BDT0RFCi0jZGVmaW5lIE5VTV9JTlRFUk5BTF9PUENPREUgICAgICAgICAoTUFYX0lOVEVSTkFMX09QQ09ERSArIDEpCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBOQU1FOiAgICAgICAgYWNwaV9nYmxfYW1sX29wX2luZm8KQEAgLTc5LDI3NCArNjMsOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQotLyoKLSAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHBhcnNlLXRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MIHBhcnNlciAgRWFjaCBsaXN0IGlzIGNvbXByZXNzZWQKLSAqIGludG8gYSAzMi1iaXQgbnVtYmVyIGFuZCBzdG9yZWQgaW4gdGhlIG1hc3RlciBvcGNvZGUgdGFibGUgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCi0gKi8KLQotCi0jZGVmaW5lIEFSR1BfQUNDRVNTRklFTERfT1AgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQotI2RlZmluZSBBUkdQX0FDUVVJUkVfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9XT1JEREFUQSkKLSNkZWZpbmUgQVJHUF9BRERfT1AgICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQUxJQVNfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FU1RSSU5HLCBBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfQVJHMCAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9BUkcxICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0FSRzIgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQVJHMyAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9BUkc0ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0FSRzUgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQVJHNiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9CQU5LX0ZJRUxEX09QICAgICAgICAgICAgICBBUkdQX0xJU1Q2IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRVNUUklORywgICAgQVJHUF9OQU1FU1RSSU5HLEFSR1BfVEVSTUFSRywgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9GSUVMRExJU1QpCi0jZGVmaW5lIEFSR1BfQklUX0FORF9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0JJVF9OQU5EX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9CSVRfTk9SX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQklUX05PVF9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9CSVRfT1JfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQklUX1hPUl9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0JSRUFLX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQlJFQUtfUE9JTlRfT1AgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9CVUZGRVJfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9CWVRFTElTVCkKLSNkZWZpbmUgQVJHUF9CWVRFX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX0JZVEVEQVRBKQotI2RlZmluZSBBUkdQX0JZVEVMSVNUX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKLSNkZWZpbmUgQVJHUF9DT05DQVRfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQ09OQ0FUX1JFU19PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0NPTkRfUkVGX09GX09QICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfQ09OVElOVUVfT1AgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9DT1BZX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfU0lNUExFTkFNRSkKLSNkZWZpbmUgQVJHUF9DUkVBVEVfQklUX0ZJRUxEX09QICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQotI2RlZmluZSBBUkdQX0NSRUFURV9CWVRFX0ZJRUxEX09QICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKLSNkZWZpbmUgQVJHUF9DUkVBVEVfRklFTERfT1AgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfTkFNRSkKLSNkZWZpbmUgQVJHUF9DUkVBVEVfUVdPUkRfRklFTERfT1AgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQotI2RlZmluZSBBUkdQX0NSRUFURV9XT1JEX0ZJRUxEX09QICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfREFUQV9SRUdJT05fT1AgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9OQU1FLCAgICAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfREVCVUdfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9ERUNSRU1FTlRfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9ERVJFRl9PRl9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfREVWSUNFX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfT0JKTElTVCkKLSNkZWZpbmUgQVJHUF9ESVZJREVfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0RXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfRFdPUkREQVRBKQotI2RlZmluZSBBUkdQX0VMU0VfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNTElTVCkKLSNkZWZpbmUgQVJHUF9FVkVOVF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfRkFUQUxfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9CWVRFREFUQSwgICBBUkdQX0RXT1JEREFUQSwgICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9GSUVMRF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRVNUUklORywgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfRklFTERMSVNUKQotI2RlZmluZSBBUkdQX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfRklORF9TRVRfUklHSFRfQklUX09QICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9GUk9NX0JDRF9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0lGX09QICAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1MSVNUKQotI2RlZmluZSBBUkdQX0lOQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX0lOREVYX0ZJRUxEX09QICAgICAgICAgICAgIEFSR1BfTElTVDUgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FU1RSSU5HLCAgICBBUkdQX05BTUVTVFJJTkcsQVJHUF9CWVRFREFUQSwgIEFSR1BfRklFTERMSVNUKQotI2RlZmluZSBBUkdQX0lOREVYX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9MQU5EX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MRVFVQUxfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MR1JFQVRFUl9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MR1JFQVRFUkVRVUFMX09QICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MTEVTU19PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MTEVTU0VRVUFMX09QICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MTk9UX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTE5PVEVRVUFMX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTE9BRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FU1RSSU5HLCBBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9MT0FEX1RBQkxFX09QICAgICAgICAgICAgICBBUkdQX0xJU1Q2IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRywgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTE9DQUwwICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9MT0NBTDEgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPQ0FMMiAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfTE9DQUwzICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9MT0NBTDQgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPQ0FMNSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfTE9DQUw2ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9MT0NBTDcgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPUl9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX01BVENIX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9CWVRFREFUQSwgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTUVUSE9EX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfQllURURBVEEsICBBUkdQX1RFUk1MSVNUKQotI2RlZmluZSBBUkdQX01FVEhPRENBTExfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKLSNkZWZpbmUgQVJHUF9NSURfT1AgICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX01PRF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9NVUxUSVBMWV9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfTVVURVhfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FLCAgICAgICBBUkdQX0JZVEVEQVRBKQotI2RlZmluZSBBUkdQX05BTUVfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfTkFNRSwgICAgICAgQVJHUF9EQVRBT0JKKQotI2RlZmluZSBBUkdQX05BTUVERklFTERfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKLSNkZWZpbmUgQVJHUF9OQU1FUEFUSF9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCi0jZGVmaW5lIEFSR1BfTk9PUF9PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9OT1RJRllfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9PTkVfT1AgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX09ORVNfT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfUEFDS0FHRV9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX0JZVEVEQVRBLCAgICAgIEFSR1BfREFUQU9CSkxJU1QpCi0jZGVmaW5lIEFSR1BfUE9XRVJfUkVTX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUNSAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfQllURURBVEEsICBBUkdQX1dPUkREQVRBLCAgQVJHUF9PQkpMSVNUKQotI2RlZmluZSBBUkdQX1BST0NFU1NPUl9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9EV09SRERBVEEsIEFSR1BfQllURURBVEEsICBBUkdQX09CSkxJU1QpCi0jZGVmaW5lIEFSR1BfUVdPUkRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9RV09SRERBVEEpCi0jZGVmaW5lIEFSR1BfUkVGX09GX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfUkVHSU9OX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9OQU1FLCAgICAgICBBUkdQX0JZVEVEQVRBLCAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfUkVMRUFTRV9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfUkVTRVJWRURGSUVMRF9PUCAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQotI2RlZmluZSBBUkdQX1JFU0VUX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX1JFVFVSTl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9SRVZJU0lPTl9PUCAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX1NDT1BFX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX1RFUk1MSVNUKQotI2RlZmluZSBBUkdQX1NISUZUX0xFRlRfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9TSElGVF9SSUdIVF9PUCAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfU0lHTkFMX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfU0laRV9PRl9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfU0xFRVBfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX1NUQUxMX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9TVEFUSUNTVFJJTkdfT1AgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCi0jZGVmaW5lIEFSR1BfU1RPUkVfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9TVFJJTkdfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX0NIQVJMSVNUKQotI2RlZmluZSBBUkdQX1NVQlRSQUNUX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9USEVSTUFMX1pPTkVfT1AgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9PQkpMSVNUKQotI2RlZmluZSBBUkdQX1RJTUVSX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfVE9fQkNEX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9UT19CVUZGRVJfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1RPX0RFQ19TVFJfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfVE9fSEVYX1NUUl9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9UT19JTlRFR0VSX09QICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1RPX1NUUklOR19PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9UWVBFX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9VTkxPQURfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9WQVJfUEFDS0FHRV9PUCAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9EQVRBT0JKTElTVCkKLSNkZWZpbmUgQVJHUF9XQUlUX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9XSElMRV9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNTElTVCkKLSNkZWZpbmUgQVJHUF9XT1JEX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1dPUkREQVRBKQotI2RlZmluZSBBUkdQX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0KLQotLyoKLSAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHJ1bnRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MIGludGVycHJldGVyICBFYWNoIGxpc3QgaXMgY29tcHJlc3NlZAotICogaW50byBhIDMyLWJpdCBudW1iZXIgYW5kIHN0b3JlZCBpbiB0aGUgbWFzdGVyIG9wY29kZSB0YWJsZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KLSAqCi0gKiAoVXNlZCBieSBwcmVwX29wZXJhbmRzIHByb2NlZHVyZSBhbmQgdGhlIEFTTCBDb21waWxlcikKLSAqLwotCi0KLSNkZWZpbmUgQVJHSV9BQ0NFU1NGSUVMRF9PUCAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfQUNRVUlSRV9PUCAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9NVVRFWCwgICAgICBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfQUREX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0FMSUFTX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9BUkcwICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0FSRzEgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfQVJHMiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9BUkczICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0FSRzQgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfQVJHNSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9BUkc2ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0JBTktfRklFTERfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9CSVRfQU5EX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQklUX05BTkRfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0JJVF9OT1JfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9CSVRfTk9UX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0JJVF9PUl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9CSVRfWE9SX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQlJFQUtfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9CUkVBS19QT0lOVF9PUCAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0JVRkZFUl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9CWVRFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfQllURUxJU1RfT1AgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0NPTkNBVF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9DT01QVVRFREFUQSwgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9DT05DQVRfUkVTX09QICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfQlVGRkVSLCAgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQ09ORF9SRUZfT0ZfT1AgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9PQkpFQ1RfUkVGLCBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9DT05USU5VRV9PUCAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfQ09QWV9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9BTllUWVBFLCAgICBBUkdJX1NJTVBMRV9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfQ1JFQVRFX0JJVF9GSUVMRF9PUCAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQotI2RlZmluZSBBUkdJX0NSRUFURV9CWVRFX0ZJRUxEX09QICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1JFRkVSRU5DRSkKLSNkZWZpbmUgQVJHSV9DUkVBVEVfRFdPUkRfRklFTERfT1AgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCi0jZGVmaW5lIEFSR0lfQ1JFQVRFX0ZJRUxEX09QICAgICAgICAgICAgQVJHSV9MSVNUNCAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfSU5URUdFUiwgICAgICBBUkdJX1JFRkVSRU5DRSkKLSNkZWZpbmUgQVJHSV9DUkVBVEVfUVdPUkRfRklFTERfT1AgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCi0jZGVmaW5lIEFSR0lfQ1JFQVRFX1dPUkRfRklFTERfT1AgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQotI2RlZmluZSBBUkdJX0RBVEFfUkVHSU9OX09QICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfU1RSSU5HLCAgICAgQVJHSV9TVFJJTkcsICAgICAgICBBUkdJX1NUUklORykKLSNkZWZpbmUgQVJHSV9ERUJVR19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0RFQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUl9SRUYpCi0jZGVmaW5lIEFSR0lfREVSRUZfT0ZfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9SRUZfT1JfU1RSSU5HKQotI2RlZmluZSBBUkdJX0RFVklDRV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9ESVZJREVfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1Q0IChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYsICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0RXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9FTFNFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfRVZFTlRfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0ZBVEFMX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfRklFTERfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9GUk9NX0JDRF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0lGX09QICAgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9JTkNSRU1FTlRfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVJfUkVGKQotI2RlZmluZSBBUkdJX0lOREVYX0ZJRUxEX09QICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9JTkRFWF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0NPTVBMRVhPQkosIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfTEFORF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfTEVRVUFMX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQotI2RlZmluZSBBUkdJX0xHUkVBVEVSX09QICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9DT01QVVRFREFUQSkKLSNkZWZpbmUgQVJHSV9MR1JFQVRFUkVRVUFMX09QICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfTExFU1NfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQotI2RlZmluZSBBUkdJX0xMRVNTRVFVQUxfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9MTk9UX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfTE5PVEVRVUFMX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0xPQURfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfUkVHSU9OX09SX0ZJRUxELEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0xPQURfVEFCTEVfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDYgKEFSR0lfU1RSSU5HLCAgICAgQVJHSV9TVFJJTkcsICAgICAgICBBUkdJX1NUUklORywgICAgICAgQVJHSV9TVFJJTkcsICAgIEFSR0lfU1RSSU5HLCBBUkdJX0FOWVRZUEUpCi0jZGVmaW5lIEFSR0lfTE9DQUwwICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9MT0NBTDEgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPQ0FMMiAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfTE9DQUwzICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9MT0NBTDQgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPQ0FMNSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfTE9DQUw2ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9MT0NBTDcgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPUl9PUCAgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX01BVENIX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDYgKEFSR0lfUEFDS0FHRSwgICAgQVJHSV9JTlRFR0VSLCAgIEFSR0lfQ09NUFVURURBVEEsICAgICAgQVJHSV9JTlRFR0VSLEFSR0lfQ09NUFVURURBVEEsQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX01FVEhPRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9NRVRIT0RDQUxMX09QICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfTUlEX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUNCAoQVJHSV9CVUZGRVJfT1JfU1RSSU5HLEFSR0lfSU5URUdFUiwgIEFSR0lfSU5URUdFUiwgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9NT0RfT1AgICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfTVVMVElQTFlfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX01VVEVYX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9OQU1FX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfTkFNRURGSUVMRF9PUCAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX05BTUVQQVRIX09QICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9OT09QX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX05PVElGWV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfREVWSUNFX1JFRiwgQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX09ORV9PUCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfT05FU19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9QQUNLQUdFX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfUE9XRVJfUkVTX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1BST0NFU1NPUl9PUCAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9RV09SRF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfUkVGX09GX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9PQkpFQ1RfUkVGKQotI2RlZmluZSBBUkdJX1JFR0lPTl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX1JFTEVBU0VfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfTVVURVgpCi0jZGVmaW5lIEFSR0lfUkVTRVJWRURGSUVMRF9PUCAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1JFU0VUX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfRVZFTlQpCi0jZGVmaW5lIEFSR0lfUkVUVVJOX09QICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1JFVklTSU9OX09QICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfU0NPUEVfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1NISUZUX0xFRlRfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9TSElGVF9SSUdIVF9PUCAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfU0lHTkFMX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9FVkVOVCkKLSNkZWZpbmUgQVJHSV9TSVpFX09GX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0RBVEFPQkpFQ1QpCi0jZGVmaW5lIEFSR0lfU0xFRVBfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX1NUQUxMX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9TVEFUSUNTVFJJTkdfT1AgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfU1RPUkVfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9EQVRBUkVGT0JKLCBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9TVFJJTkdfT1AgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfU1VCVFJBQ1RfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX1RIRVJNQUxfWk9ORV9PUCAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9USU1FUl9PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX1RPX0JDRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9GSVhFRF9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfVE9fQlVGRkVSX09QICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKLSNkZWZpbmUgQVJHSV9UT19ERUNfU1RSX09QICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfRklYRURfVEFSR0VUKQotI2RlZmluZSBBUkdJX1RPX0hFWF9TVFJfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9GSVhFRF9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfVE9fSU5URUdFUl9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKLSNkZWZpbmUgQVJHSV9UT19TVFJJTkdfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9GSVhFRF9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfVFlQRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9BTllUWVBFKQotI2RlZmluZSBBUkdJX1VOTE9BRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfRERCSEFORExFKQotI2RlZmluZSBBUkdJX1ZBUl9QQUNLQUdFX09QICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9XQUlUX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0VWRU5ULCAgICAgIEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9XSElMRV9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfV09SRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0KLQogLyoKICAqIFN1bW1hcnkgb2Ygb3Bjb2RlIHR5cGVzL2ZsYWdzCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKIAogIE9wY29kZXMgdGhhdCBoYXZlIGFzc29jaWF0ZWQgbmFtZXNwYWNlIG9iamVjdHMgKEFNTF9OU09CSkVDVCBmbGFnKQogCkBAIC00NjAsMTQgKzE3OSwxMyBAQAogCUFNTF9DUkVBVEVfRFdPUkRfRklFTERfT1AKIAlBTUxfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAogLyoKLSAqIE1hc3RlciBPcGNvZGUgaW5mb3JtYXRpb24gdGFibGUuICBBIHN1bW1hcnkgb2YgZXZlcnl0aGluZyB3ZSBrbm93IGFib3V0IGVhY2ggb3Bjb2RlLCBhbGwgaW4gb25lIHBsYWNlLgorICogTWFzdGVyIE9wY29kZSBpbmZvcm1hdGlvbiB0YWJsZS4gIEEgc3VtbWFyeSBvZiBldmVyeXRoaW5nIHdlIGtub3cgYWJvdXQgZWFjaAorICogb3Bjb2RlLCBhbGwgaW4gb25lIHBsYWNlLgogICovCi0KLQogY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAgIGFjcGlfZ2JsX2FtbF9vcF9pbmZvW0FNTF9OVU1fT1BDT0RFU10gPQogewogLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKi8KQEAgLTY5Myw4ICs0MTEsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gVGhlIEFNTCBvcGNvZGUKICAqCi0gKiBSRVRVUk46ICAgICAgQSBwb2ludGVyIHRvIHRoZSBpbmZvIGFib3V0IHRoZSBvcGNvZGUuICBOVUxMIGlmIHRoZSBvcGNvZGUgd2FzCi0gKiAgICAgICAgICAgICAgbm90IGZvdW5kIGluIHRoZSB0YWJsZS4KKyAqIFJFVFVSTjogICAgICBBIHBvaW50ZXIgdG8gdGhlIGluZm8gYWJvdXQgdGhlIG9wY29kZS4KICAqCiAgKiBERVNDUklQVElPTjogRmluZCBBTUwgb3Bjb2RlIGRlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBvcGNvZGUuCiAgKiAgICAgICAgICAgICAgTk9URTogVGhpcyBwcm9jZWR1cmUgbXVzdCBBTFdBWVMgcmV0dXJuIGEgdmFsaWQgcG9pbnRlciEKQEAgLTczMSw3ICs0NDgsOCBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gQU1MIG9wY29kZSBbJTQuNFhdXG4iLCBvcGNvZGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiVW5rbm93biBBTUwgb3Bjb2RlIFslNC40WF1cbiIsIG9wY29kZSkpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKaW5kZXggZTc5ZWRiNS4uYmJmZGMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKQEAgLTY0LDYgKzY0LDIzIEBACiAKIHN0YXRpYyB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlcHRoID0gMDsKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCisJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfcGFyc2VfbG9vcCAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMDAsNyArMTE3LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEEgcGFyc2VyIHN0YXRlIG9iamVjdAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOZXh0IEFNTCBvcGNvZGUKICAqCiAgKiBERVNDUklQVElPTjogR2V0IG5leHQgQU1MIG9wY29kZSAod2l0aG91dCBpbmNyZW1lbnRpbmcgQU1MIHBvaW50ZXIpCiAgKgpAQCAtMTE3LDcgKzEzNCw2IEBACiAJYW1sID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAJb3Bjb2RlID0gKHUxNikgQUNQSV9HRVQ4IChhbWwpOwogCi0KIAlpZiAob3Bjb2RlID09IEFNTF9FWFRPUCkgewogCQkvKiBFeHRlbmRlZCBvcGNvZGUgKi8KIApAQCAtMTQyLDcgKzE1OCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKQEAgLTI3Miw3ICsyODgsNiBAQAogCQkJCQluZXh0ID0gTlVMTDsKIAkJCQl9CiAJCQl9Ci0KIAkJCXByZXYgPSBuZXh0OwogCQl9CiAJfQpAQCAtMjgwLDcgKzI5NSw3IEBACiAKIGNsZWFudXA6CiAKLQkvKiBOb3cgd2UgY2FuIGFjdHVhbGx5IGRlbGV0ZSB0aGUgc3VidHJlZSByb290ZWQgYXQgb3AgKi8KKwkvKiBOb3cgd2UgY2FuIGFjdHVhbGx5IGRlbGV0ZSB0aGUgc3VidHJlZSByb290ZWQgYXQgT3AgKi8KIAogCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKG9wKTsKIAlyZXR1cm5fVk9JRDsKQEAgLTI5MSw3ICszMDYsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUKICAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgcGFyc2Ugb3AKKyAqICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMgICAgIC0gU3RhdHVzIGZyb20gcHJldmlvdXMgb3BlcmF0aW9uCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTMwMCw3ICszMTcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKQEAgLTM4Miw5ICszOTksOCBAQAogCiAJY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgogCi0JCS8qCi0JCSAqIEEgbWV0aG9kIGNhbGwgKGludm9jYXRpb24pIC0tIHRyYW5zZmVyIGNvbnRyb2wKLQkJICovCisJCS8qIEEgbWV0aG9kIGNhbGwgKGludm9jYXRpb24pIC0tIHRyYW5zZmVyIGNvbnRyb2wgKi8KKwogCQlzdGF0dXMgPSBBRV9DVFJMX1RSQU5TRkVSOwogCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7CiAJCXdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX29wID0gb3A7CkBAIC0zOTcsNiArNDEzLDcgQEAKIAogCiAJZGVmYXVsdDoKKwogCQlzdGF0dXMgPSBjYWxsYmFja19zdGF0dXM7CiAJCWlmICgoY2FsbGJhY2tfc3RhdHVzICYgQUVfQ09ERV9NQVNLKSA9PSBBRV9DT0RFX0NPTlRST0wpIHsKIAkJCXN0YXR1cyA9IEFFX09LOwpAQCAtNDEyLDcgKzQyOSw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGFyc2VfbG9vcAogICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDIxLDcgKzQzOCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9wc19wYXJzZV9sb29wICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQogewpAQCAtNDQzLDYgKzQ2MCw3IEBACiAJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gMDsKIAogI2lmICghZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSAmJiAhZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpKQorCiAJaWYgKHdhbGtfc3RhdGUtPndhbGtfdHlwZSAmIEFDUElfV0FMS19NRVRIT0RfUkVTVEFSVCkgewogCQkvKiBXZSBhcmUgcmVzdGFydGluZyBhIHByZWVtcHRlZCBjb250cm9sIG1ldGhvZCAqLwogCkBAIC00NzEsNyArNDg5LDggQEAKIAkJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAogCQkJCQl9Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiZ2V0X3ByZWRpY2F0ZSBGYWlsZWQsICVzXG4iLAorCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSJnZXRfcHJlZGljYXRlIEZhaWxlZCwgJXNcbiIsCiAJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQkJCX0KQEAgLTQ5MiwxNiArNTExLDE1IEBACiAJfQogI2VuZGlmCiAKLQkvKgotCSAqIEl0ZXJhdGl2ZSBwYXJzaW5nIGxvb3AsIHdoaWxlIHRoZXJlIGlzIG1vcmUgYW1sIHRvIHByb2Nlc3M6Ci0JICovCisJLyogSXRlcmF0aXZlIHBhcnNpbmcgbG9vcCwgd2hpbGUgdGhlcmUgaXMgbW9yZSBBTUwgdG8gcHJvY2VzczogKi8KKwogCXdoaWxlICgocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPmFtbF9lbmQpIHx8IChvcCkpIHsKIAkJYW1sX29wX3N0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAJCWlmICghb3ApIHsKIAkJCS8qIEdldCB0aGUgbmV4dCBvcGNvZGUgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLwogCiAJCQl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0gKHUzMikgQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5hbWwsCi0JCQkJCSAgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKKwkJCQkJICBwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7CiAJCQl3YWxrX3N0YXRlLT5vcGNvZGUgICA9IGFjcGlfcHNfcGVla19vcGNvZGUgKHBhcnNlcl9zdGF0ZSk7CiAKIAkJCS8qCkBAIC01NzgsOCArNTk2LDEwIEBACiAJCQkJCUlOQ1JFTUVOVF9BUkdfTElTVCAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKTsKIAkJCQl9CiAKLQkJCQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBmb3VuZCBhIE5BTUUgYW5kIGRpZG4ndCBydW4gb3V0IG9mIGFyZ3VtZW50cyAqLwotCisJCQkJLyoKKwkJCQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBmb3VuZCBhIE5BTUUgYW5kIGRpZG4ndCBydW4gb3V0IG9mCisJCQkJICogYXJndW1lbnRzCisJCQkJICovCiAJCQkJaWYgKCFHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSkgewogCQkJCQlzdGF0dXMgPSBBRV9BTUxfTk9fT1BFUkFORDsKIAkJCQkJZ290byBjbG9zZV90aGlzX29wOwpAQCAtNTk3LDEyICs2MTcsMTMgQEAKIAogCQkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgKHdhbGtfc3RhdGUsICZvcCk7CiAJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkR1cmluZyBuYW1lIGxvb2t1cC9jYXRhbG9nLCAlc1xuIiwKLQkJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJCQkiRHVyaW5nIG5hbWUgbG9va3VwL2NhdGFsb2csICVzXG4iLAorCQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKIAkJCQl9CiAKLQkJCQlpZiAob3AgPT0gTlVMTCkgeworCQkJCWlmICghb3ApIHsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCkBAIC02NTksNyArNjgwLDcgQEAKIAogCQkJCWlmICgod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSkgewogCQkJCQkvKgotCQkJCQkgKiBGaW5kIHRoZSBvYmplY3QuICBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KKwkJCQkJICogRmluZCB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KIAkJCQkJICogdGhlIG5hbWVzcGFjZSBvciBzaW1wbHkgbG9vayBpdCB1cAogCQkJCQkgKi8KIAkJCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKQEAgLTY4OCwxMSArNzA5LDE1IEBACiAJCX0KIAogCi0JCS8qIFN0YXJ0IGFyZ19jb3VudCBhdCB6ZXJvIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBhcmUgYW55IGFyZ3MgeWV0ICovCi0KKwkJLyoKKwkJICogU3RhcnQgYXJnX2NvdW50IGF0IHplcm8gYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIGFyZQorCQkgKiBhbnkgYXJncyB5ZXQKKwkJICovCiAJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CiAKLQkJaWYgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgLyogQXJlIHRoZXJlIGFueSBhcmd1bWVudHMgdGhhdCBtdXN0IGJlIHByb2Nlc3NlZD8gKi8geworCQkvKiBBcmUgdGhlcmUgYW55IGFyZ3VtZW50cyB0aGF0IG11c3QgYmUgcHJvY2Vzc2VkPyAqLworCisJCWlmICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpIHsKIAkJCS8qIEdldCBhcmd1bWVudHMgKi8KIAogCQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKQEAgLTcyMCwxNCArNzQ1LDE4IEBACiAKIAkJCWRlZmF1bHQ6CiAKLQkJCQkvKiBPcCBpcyBub3QgYSBjb25zdGFudCBvciBzdHJpbmcsIGFwcGVuZCBlYWNoIGFyZ3VtZW50IHRvIHRoZSBPcCAqLwotCisJCQkJLyoKKwkJCQkgKiBPcCBpcyBub3QgYSBjb25zdGFudCBvciBzdHJpbmcsIGFwcGVuZCBlYWNoIGFyZ3VtZW50CisJCQkJICogdG8gdGhlIE9wCisJCQkJICovCiAJCQkJd2hpbGUgKEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICYmCiAJCQkJCQkhd2Fsa19zdGF0ZS0+YXJnX2NvdW50KSB7Ci0JCQkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPSAodTMyKSBBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwKLQkJCQkJCQkgICBwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7CisJCQkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPSAodTMyKQorCQkJCQkJQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5hbWwsIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKKwogCQkJCQlzdGF0dXMgPSBhY3BpX3BzX2dldF9uZXh0X2FyZyAod2Fsa19zdGF0ZSwgcGFyc2VyX3N0YXRlLAotCQkJCQkJCSBHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSwgJmFyZyk7CisJCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpLAorCQkJCQkJCSAmYXJnKTsKIAkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQkJZ290byBjbG9zZV90aGlzX29wOwogCQkJCQl9CkBAIC03NTIsNyArNzgxLDggQEAKIAkJCQkJICogU2F2ZSB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzIG9mIHRoZSBib2R5CiAJCQkJCSAqLwogCQkJCQlvcC0+bmFtZWQuZGF0YSAgID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0JCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5wa2dfZW5kIC0gcGFyc2VyX3N0YXRlLT5hbWwpOworCQkJCQlvcC0+bmFtZWQubGVuZ3RoID0gKHUzMikgKHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCAtCisJCQkJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwogCiAJCQkJCS8qIFNraXAgYm9keSBvZiBtZXRob2QgKi8KIApAQCAtNzczLDcgKzgwMyw4IEBACiAJCQkJCQkgKiB0byBwYXJzZSB0aGVtIGNvcnJlY3RseS4KIAkJCQkJCSAqLwogCQkJCQkJb3AtPm5hbWVkLmRhdGEgICA9IGFtbF9vcF9zdGFydDsKLQkJCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5wa2dfZW5kIC0gYW1sX29wX3N0YXJ0KTsKKwkJCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5wa2dfZW5kIC0KKwkJCQkJCQkJICAgYW1sX29wX3N0YXJ0KTsKIAogCQkJCQkJLyogU2tpcCBib2R5ICovCiAKQEAgLTc4NSw3ICs4MTYsOCBAQAogCQkJCWNhc2UgQU1MX1dISUxFX09QOgogCiAJCQkJCWlmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSB7Ci0JCQkJCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOworCQkJCQkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wYWNrYWdlX2VuZCA9CisJCQkJCQkJcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCkBAIC04MDEsOCArODMzLDEwIEBACiAJCS8qIENoZWNrIGZvciBhcmd1bWVudHMgdGhhdCBuZWVkIHRvIGJlIHByb2Nlc3NlZCAqLwogCiAJCWlmICh3YWxrX3N0YXRlLT5hcmdfY291bnQpIHsKLQkJCS8qIFRoZXJlIGFyZSBhcmd1bWVudHMgKGNvbXBsZXggb25lcyksIHB1c2ggT3AgYW5kIHByZXBhcmUgZm9yIGFyZ3VtZW50ICovCi0KKwkJCS8qCisJCQkgKiBUaGVyZSBhcmUgYXJndW1lbnRzIChjb21wbGV4IG9uZXMpLCBwdXNoIE9wIGFuZAorCQkJICogcHJlcGFyZSBmb3IgYXJndW1lbnQKKwkJCSAqLwogCQkJc3RhdHVzID0gYWNwaV9wc19wdXNoX3Njb3BlIChwYXJzZXJfc3RhdGUsIG9wLAogCQkJCQkgd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLCB3YWxrX3N0YXRlLT5hcmdfY291bnQpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtODEyLDggKzg0NiwxMCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBBbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgLS0gT3AgaXMgY29tcGxldGUsIHByZXBhcmUgZm9yIG5leHQgKi8KLQorCQkvKgorCQkgKiBBbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgLS0gT3AgaXMgY29tcGxldGUsCisJCSAqIHByZXBhcmUgZm9yIG5leHQKKwkJICovCiAJCXdhbGtfc3RhdGUtPm9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKIAkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7CiAJCQlpZiAoYWNwaV9nYmxfZGVwdGgpIHsKQEAgLTg4MCw5ICs5MTYsOCBAQAogCiAJCWNhc2UgQUVfQ1RSTF9UUkFOU0ZFUjoKIAotCQkJLyoKLQkJCSAqIFdlIGFyZSBhYm91dCB0byB0cmFuc2ZlciB0byBhIGNhbGxlZCBtZXRob2QuCi0JCQkgKi8KKwkJCS8qIFdlIGFyZSBhYm91dCB0byB0cmFuc2ZlciB0byBhIGNhbGxlZCBtZXRob2QuICovCisKIAkJCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBvcDsKIAkJCXdhbGtfc3RhdGUtPnByZXZfYXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+YXJnX3R5cGVzOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMTA1MSwxMCArMTA4Niw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGFyc2VfYW1sCiAgKgotICogUEFSQU1FVEVSUzogIHN0YXJ0X3Njb3BlICAgICAtIFRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgcGFyc2UuICBCZWNvbWVzIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBhcnNlZCBvcCB0cmVlLgotICogICAgICAgICAgICAgIEFtbCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgY29kZSB0byBwYXJzZQotICogICAgICAgICAgICAgIGFtbF9zaXplICAgICAgICAtIExlbmd0aCBvZiB0aGUgQU1MIHRvIHBhcnNlCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQogICoKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC0xMDc2LDggKzExMDgsMTAgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJwc19wYXJzZV9hbWwiKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiRW50ZXJlZCB3aXRoIHdhbGtfc3RhdGU9JXAgQW1sPSVwIHNpemU9JVhcbiIsCi0JCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc2l6ZSkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAorCQkiRW50ZXJlZCB3aXRoIHdhbGtfc3RhdGU9JXAgQW1sPSVwIHNpemU9JVhcbiIsCisJCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsCisJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc2l6ZSkpOwogCiAKIAkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgdGhyZWFkIHN0YXRlICovCkBAIC0xMTQyLDkgKzExNzYsMTAgQEAKIAkJCWlmICgoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSAmJgogCQkJCSghd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpKSB7CiAJCQkJLyoKLQkJCQkgKiBUaGlzIG1ldGhvZCBpcyBtYXJrZWQgbm90X3NlcmlhbGl6ZWQsIGJ1dCBpdCB0cmllZCB0byBjcmVhdGUgYSBuYW1lZAotCQkJCSAqIG9iamVjdCwgY2F1c2luZyB0aGUgc2Vjb25kIHRocmVhZCBlbnRyYW5jZSB0byBmYWlsLiAgV2Ugd2lsbCB3b3JrYXJvdW5kCi0JCQkJICogdGhpcyBieSBtYXJraW5nIHRoZSBtZXRob2QgcGVybWFuZW50bHkgYXMgU2VyaWFsaXplZC4KKwkJCQkgKiBUaGlzIG1ldGhvZCBpcyBtYXJrZWQgbm90X3NlcmlhbGl6ZWQsIGJ1dCBpdCB0cmllZCB0byBjcmVhdGUKKwkJCQkgKiBhIG5hbWVkIG9iamVjdCwgY2F1c2luZyB0aGUgc2Vjb25kIHRocmVhZCBlbnRyYW5jZSB0byBmYWlsLgorCQkJCSAqIFdlIHdpbGwgd29ya2Fyb3VuZCB0aGlzIGJ5IG1hcmtpbmcgdGhlIG1ldGhvZCBwZXJtYW5lbnRseQorCQkJCSAqIGFzIFNlcmlhbGl6ZWQuCiAJCQkJICovCiAJCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgfD0gQU1MX01FVEhPRF9TRVJJQUxJWkVEOwogCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgPSAxOwpAQCAtMTE4Nyw3ICsxMjIyLDggQEAKIAogCQlwcmV2aW91c193YWxrX3N0YXRlID0gd2Fsa19zdGF0ZTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwgInJldHVybl92YWx1ZT0lcCwgaW1wbGljaXRfdmFsdWU9JXAgU3RhdGU9JXBcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAorCQkJInJldHVybl92YWx1ZT0lcCwgaW1wbGljaXRfdmFsdWU9JXAgU3RhdGU9JXBcbiIsCiAJCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYywgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiwgd2Fsa19zdGF0ZSkpOwogCiAJCS8qIENoZWNrIGlmIHdlIGhhdmUgcmVzdGFydGVkIGEgcHJlZW1wdGVkIHdhbGsgKi8KQEAgLTEyMzEsMTIgKzEyNjcsMTQgQEAKIAkJICovCiAJCWVsc2UgaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPmNhbGxlcl9yZXR1cm5fZGVzYykgewogCQkJaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopIHsKLQkJCQkqKHByZXZpb3VzX3dhbGtfc3RhdGUtPmNhbGxlcl9yZXR1cm5fZGVzYykgPSBwcmV2aW91c193YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqOworCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9CisJCQkJCXByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmo7CiAJCQl9CiAJCQllbHNlIHsKIAkJCQkgLyogTlVMTCBpZiBubyByZXR1cm4gdmFsdWUgKi8KIAotCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9IHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjOworCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9CisJCQkJCXByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjOwogCQkJfQogCQl9CiAJCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwppbmRleCBkY2JlZDQ5Li44ZGNkMWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwpAQCAtNjUsNiArNjUsNyBAQAogYWNwaV9wc19nZXRfcGFyZW50X3Njb3BlICgKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpCiB7CisKIAlyZXR1cm4gKHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLm9wKTsKIH0KIApAQCAtODcsOCArODgsMTAgQEAKIGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZSAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQogewotCXJldHVybiAoKHU4KSAoKHBhcnNlcl9zdGF0ZS0+YW1sID49IHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgfHwKLQkJCSAgICFwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQpKSk7CisKKwlyZXR1cm4gKCh1OCkKKwkJCSgocGFyc2VyX3N0YXRlLT5hbWwgPj0gcGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZCB8fAorCQkJICFwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQpKSk7CiB9CiAKIApAQCAtMTY3LDIzICsxNzAsMjMgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwogCX0KIAotCXNjb3BlLT5jb21tb24uZGF0YV90eXBlICAgICAgICA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BTQ09QRTsKLQlzY29wZS0+cGFyc2Vfc2NvcGUub3AgICAgICAgICAgPSBvcDsKLQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3QgICAgPSByZW1haW5pbmdfYXJnczsKLQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50ICAgPSBhcmdfY291bnQ7Ci0Jc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQgICAgID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOworCXNjb3BlLT5jb21tb24uZGF0YV90eXBlICAgID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUFNDT1BFOworCXNjb3BlLT5wYXJzZV9zY29wZS5vcCAgICAgID0gb3A7CisJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19saXN0ID0gcmVtYWluaW5nX2FyZ3M7CisJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudCA9IGFyZ19jb3VudDsKKwlzY29wZS0+cGFyc2Vfc2NvcGUucGtnX2VuZCA9IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKIAogCS8qIFB1c2ggb250byBzY29wZSBzdGFjayAqLwogCiAJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKCZwYXJzZXJfc3RhdGUtPnNjb3BlLCBzY29wZSk7CiAKIAlpZiAoYXJnX2NvdW50ID09IEFDUElfVkFSX0FSR1MpIHsKLQkJLyogbXVsdGlwbGUgYXJndW1lbnRzICovCisJCS8qIE11bHRpcGxlIGFyZ3VtZW50cyAqLwogCiAJCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwogCX0KIAllbHNlIHsKLQkJLyogc2luZ2xlIGFyZ3VtZW50ICovCisJCS8qIFNpbmdsZSBhcmd1bWVudCAqLwogCiAJCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gQUNQSV9UT19QT0lOVEVSIChBQ1BJX01BWF9QVFIpOwogCX0KQEAgLTIyMSwxOCArMjI0LDE3IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInBzX3BvcF9zY29wZSIpOwogCiAKLQkvKgotCSAqIE9ubHkgcG9wIHRoZSBzY29wZSBpZiB0aGVyZSBpcyBpbiBmYWN0IGEgbmV4dCBzY29wZQotCSAqLworCS8qIE9ubHkgcG9wIHRoZSBzY29wZSBpZiB0aGVyZSBpcyBpbiBmYWN0IGEgbmV4dCBzY29wZSAqLworCiAJaWYgKHNjb3BlLT5jb21tb24ubmV4dCkgewogCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKCZwYXJzZXJfc3RhdGUtPnNjb3BlKTsKIAogCQkvKiByZXR1cm4gdG8gcGFyc2luZyBwcmV2aW91cyBvcCAqLwogCi0JCSpvcCAgICAgICAgICAgICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLm9wOwotCQkqYXJnX2xpc3QgICAgICAgICAgICAgICA9IHNjb3BlLT5wYXJzZV9zY29wZS5hcmdfbGlzdDsKLQkJKmFyZ19jb3VudCAgICAgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50OwotCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQgICA9IHNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kOworCQkqb3AgICAgICAgICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLm9wOworCQkqYXJnX2xpc3QgICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19saXN0OworCQkqYXJnX2NvdW50ICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudDsKKwkJcGFyc2VyX3N0YXRlLT5wa2dfZW5kID0gc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQ7CiAKIAkJLyogQWxsIGRvbmUgd2l0aCB0aGlzIHNjb3BlIHN0YXRlIHN0cnVjdHVyZSAqLwogCkBAIC0yNDEsMTIgKzI0MywxMyBAQAogCWVsc2UgewogCQkvKiBlbXB0eSBwYXJzZSBzdGFjaywgcHJlcGFyZSB0byBmZXRjaCBuZXh0IG9wY29kZSAqLwogCi0JCSpvcCAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKLQkJKmFyZ19saXN0ICAgICAgICAgICAgICAgPSAwOwotCQkqYXJnX2NvdW50ICAgICAgICAgICAgICA9IDA7CisJCSpvcCAgICAgICA9IE5VTEw7CisJCSphcmdfbGlzdCA9IDA7CisJCSphcmdfY291bnQgPSAwOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiUG9wcGVkIE9wICVwIEFyZ3MgJVhcbiIsICpvcCwgKmFyZ19jb3VudCkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAorCQkiUG9wcGVkIE9wICVwIEFyZ3MgJVhcbiIsICpvcCwgKmFyZ19jb3VudCkpOwogCXJldHVybl9WT0lEOwogfQogCkBAIC0yNTcsNyArMjYwLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IERlc3Ryb3kgYXZhaWxhYmxlIGxpc3QsIHJlbWFpbmluZyBzdGFjayBsZXZlbHMsIGFuZCByZXR1cm4KICAqICAgICAgICAgICAgICByb290IHNjb3BlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYwppbmRleCAyMTQwYmQxLi5kNWFhZmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKQEAgLTQ5LDYgKzQ5LDE0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzdHJlZSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCithY3BpX3BzX2dldF9jaGlsZCAoCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOworI2VuZGlmCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01Nyw3ICs2NSw3IEBACiAgKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gR2V0IGFuIGFyZ3VtZW50IGZvciB0aGlzIG9wCiAgKiAgICAgICAgICAgICAgQXJnbiAgICAgICAgICAgIC0gTnRoIGFyZ3VtZW50IHRvIGdldAogICoKLSAqIFJFVFVSTjogICAgICBUaGUgYXJndW1lbnQgKGFzIGFuIE9wIG9iamVjdCkuICBOVUxMIGlmIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0CisgKiBSRVRVUk46ICAgICAgVGhlIGFyZ3VtZW50IChhcyBhbiBPcCBvYmplY3QpLiBOVUxMIGlmIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0CiAgKgogICogREVTQ1JJUFRJT046IEdldCB0aGUgc3BlY2lmaWVkIG9wJ3MgYXJndW1lbnQuCiAgKgpAQCAtMTUyLDcgKzE2MCw2IEBACiAJCXJldHVybjsKIAl9CiAKLQogCS8qIEFwcGVuZCB0aGUgYXJndW1lbnQgdG8gdGhlIGxpbmtlZCBhcmd1bWVudCBsaXN0ICovCiAKIAlpZiAob3AtPmNvbW1vbi52YWx1ZS5hcmcpIHsKQEAgLTE2NCwxNCArMTcxLDEyIEBACiAJCX0KIAkJcHJldl9hcmctPmNvbW1vbi5uZXh0ID0gYXJnOwogCX0KLQogCWVsc2UgewogCQkvKiBObyBhcmd1bWVudCBsaXN0LCB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGFyZ3VtZW50ICovCiAKIAkJb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBhcmc7CiAJfQogCi0KIAkvKiBTZXQgdGhlIHBhcmVudCBpbiB0aGlzIGFyZyBhbmQgYW55IGFyZ3MgbGlua2VkIGFmdGVyIGl0ICovCiAKIAl3aGlsZSAoYXJnKSB7CkBAIC0xODIsNyArMTg3LDgyIEBACiAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9kZXB0aF9uZXh0CisgKgorICogUEFSQU1FVEVSUzogIE9yaWdpbiAgICAgICAgICAtIFJvb3Qgb2Ygc3VidHJlZSB0byBzZWFyY2gKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBMYXN0IChwcmV2aW91cykgT3AgdGhhdCB3YXMgZm91bmQKKyAqCisgKiBSRVRVUk46ICAgICAgTmV4dCBPcCBmb3VuZCBpbiB0aGUgc2VhcmNoLgorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBvcCBpbiB0cmVlICh3YWxraW5nIHRoZSB0cmVlIGluIGRlcHRoLWZpcnN0IG9yZGVyKQorICogICAgICAgICAgICAgIFJldHVybiBOVUxMIHdoZW4gcmVhY2hpbmcgIm9yaWdpbiIgb3Igd2hlbiB3YWxraW5nIHVwIGZyb20gcm9vdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKK2FjcGlfcHNfZ2V0X2RlcHRoX25leHQgKAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpuZXh0ID0gTlVMTDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpwYXJlbnQ7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOworCisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCisKKwlpZiAoIW9wKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogTG9vayBmb3IgYW4gYXJndW1lbnQgb3IgY2hpbGQgKi8KKworCW5leHQgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAwKTsKKwlpZiAobmV4dCkgeworCQlyZXR1cm4gKG5leHQpOworCX0KKworCS8qIExvb2sgZm9yIGEgc2libGluZyAqLworCisJbmV4dCA9IG9wLT5jb21tb24ubmV4dDsKKwlpZiAobmV4dCkgeworCQlyZXR1cm4gKG5leHQpOworCX0KKworCS8qIExvb2sgZm9yIGEgc2libGluZyBvZiBwYXJlbnQgKi8KKworCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OworCisJd2hpbGUgKHBhcmVudCkgeworCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcgKHBhcmVudCwgMCk7CisJCXdoaWxlIChhcmcgJiYgKGFyZyAhPSBvcmlnaW4pICYmIChhcmcgIT0gb3ApKSB7CisJCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OworCQl9CisKKwkJaWYgKGFyZyA9PSBvcmlnaW4pIHsKKwkJCS8qIFJlYWNoZWQgcGFyZW50IG9mIG9yaWdpbiwgZW5kIHNlYXJjaCAqLworCisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisKKwkJaWYgKHBhcmVudC0+Y29tbW9uLm5leHQpIHsKKwkJCS8qIEZvdW5kIHNpYmxpbmcgb2YgcGFyZW50ICovCisKKwkJCXJldHVybiAocGFyZW50LT5jb21tb24ubmV4dCk7CisJCX0KKworCQlvcCA9IHBhcmVudDsKKwkJcGFyZW50ID0gcGFyZW50LT5jb21tb24ucGFyZW50OworCX0KKworCXJldHVybiAobmV4dCk7Cit9CisKKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9jaGlsZApAQCAtMTk0LDYgKzI3NCw3IEBACiAgKiBERVNDUklQVElPTjogR2V0IG9wJ3MgY2hpbGRyZW4gb3IgTlVMTCBpZiBub25lCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgogYWNwaV9wc19nZXRfY2hpbGQgKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQpAQCAtMjQ3LDgxICszMjgsNyBAQAogCiAJcmV0dXJuIChjaGlsZCk7CiB9Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfZGVwdGhfbmV4dAotICoKLSAqIFBBUkFNRVRFUlM6ICBPcmlnaW4gICAgICAgICAgLSBSb290IG9mIHN1YnRyZWUgdG8gc2VhcmNoCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gTGFzdCAocHJldmlvdXMpIE9wIHRoYXQgd2FzIGZvdW5kCi0gKgotICogUkVUVVJOOiAgICAgIE5leHQgT3AgZm91bmQgaW4gdGhlIHNlYXJjaC4KLSAqCi0gKiBERVNDUklQVElPTjogR2V0IG5leHQgb3AgaW4gdHJlZSAod2Fsa2luZyB0aGUgdHJlZSBpbiBkZXB0aC1maXJzdCBvcmRlcikKLSAqICAgICAgICAgICAgICBSZXR1cm4gTlVMTCB3aGVuIHJlYWNoaW5nICJvcmlnaW4iIG9yIHdoZW4gd2Fsa2luZyB1cCBmcm9tIHJvb3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9kZXB0aF9uZXh0ICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcmlnaW4sCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmV4dCA9IE5VTEw7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcGFyZW50OwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKLQotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JaWYgKCFvcCkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCS8qIGxvb2sgZm9yIGFuIGFyZ3VtZW50IG9yIGNoaWxkICovCi0KLQluZXh0ID0gYWNwaV9wc19nZXRfYXJnIChvcCwgMCk7Ci0JaWYgKG5leHQpIHsKLQkJcmV0dXJuIChuZXh0KTsKLQl9Ci0KLQkvKiBsb29rIGZvciBhIHNpYmxpbmcgKi8KLQotCW5leHQgPSBvcC0+Y29tbW9uLm5leHQ7Ci0JaWYgKG5leHQpIHsKLQkJcmV0dXJuIChuZXh0KTsKLQl9Ci0KLQkvKiBsb29rIGZvciBhIHNpYmxpbmcgb2YgcGFyZW50ICovCi0KLQlwYXJlbnQgPSBvcC0+Y29tbW9uLnBhcmVudDsKLQotCXdoaWxlIChwYXJlbnQpIHsKLQkJYXJnID0gYWNwaV9wc19nZXRfYXJnIChwYXJlbnQsIDApOwotCQl3aGlsZSAoYXJnICYmIChhcmcgIT0gb3JpZ2luKSAmJiAoYXJnICE9IG9wKSkgewotCQkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKLQkJfQotCi0JCWlmIChhcmcgPT0gb3JpZ2luKSB7Ci0JCQkvKiByZWFjaGVkIHBhcmVudCBvZiBvcmlnaW4sIGVuZCBzZWFyY2ggKi8KLQotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCi0JCWlmIChwYXJlbnQtPmNvbW1vbi5uZXh0KSB7Ci0JCQkvKiBmb3VuZCBzaWJsaW5nIG9mIHBhcmVudCAqLwotCi0JCQlyZXR1cm4gKHBhcmVudC0+Y29tbW9uLm5leHQpOwotCQl9Ci0KLQkJb3AgPSBwYXJlbnQ7Ci0JCXBhcmVudCA9IHBhcmVudC0+Y29tbW9uLnBhcmVudDsKLQl9Ci0KLQlyZXR1cm4gKG5leHQpOwotfQorI2VuZGlmCiAKICNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCmluZGV4IGIzNTk3Y2IuLmExMGY4ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCkBAIC00NSw3ICs0NSw2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJwc3V0aWxzIikKQEAgLTU3LDcgKzU2LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBzY29wZV9vcAorICogUkVUVVJOOiAgICAgIEEgbmV3IFNjb3BlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIFNjb3BlIGFuZCBhc3NvY2lhdGVkIG5hbWVwYXRoIG9wIHdpdGggdGhlIHJvb3QgbmFtZQogICoKQEAgLTc1LDcgKzc0LDYgQEAKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKLQogCXNjb3BlX29wLT5uYW1lZC5uYW1lID0gQUNQSV9ST09UX05BTUU7CiAJcmV0dXJuIChzY29wZV9vcCk7CiB9CkBAIC04OCwxMCArODYsOSBAQAogICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEEgbmV3bHkgYWxsb2NhdGVkIE9wIG9iamVjdAogICogICAgICAgICAgICAgIE9wY29kZSAgICAgICAgICAtIE9wY29kZSB0byBzdG9yZSBpbiB0aGUgT3AKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhbiBhY3BpX29wLCBjaG9vc2Ugb3AgdHlwZSAoYW5kIHRodXMgc2l6ZSkgYmFzZWQgb24KLSAqICAgICAgICAgICAgICBvcGNvZGUKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgcGFyc2UgKE9wKSBvYmplY3QKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMDcsNyArMTA0LDggQEAKIAlvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPSBvcGNvZGU7CiAKIAlBQ1BJX0RJU0FTTV9PTkxZX01FTUJFUlMgKEFDUElfU1RSTkNQWSAob3AtPmNvbW1vbi5hbWxfb3BfbmFtZSwKLQkJCShhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKSktPm5hbWUsIHNpemVvZiAob3AtPmNvbW1vbi5hbWxfb3BfbmFtZSkpKTsKKwkJCShhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKSktPm5hbWUsCisJCQkJc2l6ZW9mIChvcC0+Y29tbW9uLmFtbF9vcF9uYW1lKSkpOwogfQogCiAKQEAgLTExNyw3ICsxMTUsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgLSBPcGNvZGUgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgbmV3IE9wCiAgKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gdGhlIG5ldyBPcC4KKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBuZXcgT3AsIG51bGwgb24gZmFpbHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhbiBhY3BpX29wLCBjaG9vc2Ugb3AgdHlwZSAoYW5kIHRodXMgc2l6ZSkgYmFzZWQgb24KICAqICAgICAgICAgICAgICBvcGNvZGUuICBBIGNhY2hlIG9mIG9wY29kZXMgaXMgYXZhaWxhYmxlIGZvciB0aGUgcHVyZQpAQCAtMjc1LDcgKzI3Myw2IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCiB7CiAKLQogCS8qIFRoZSAiZ2VuZXJpYyIgb2JqZWN0IGhhcyBubyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwogCiAJaWYgKG9wLT5jb21tb24uZmxhZ3MgJiBBQ1BJX1BBUlNFT1BfR0VORVJJQykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKaW5kZXggMTEwZDJjZS4uOWQyMGNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jCkBAIC05MCwxNyArOTAsMTUgQEAKIAkJCX0KIAkJfQogCi0JCS8qCi0JCSAqIE5vIG1vcmUgY2hpbGRyZW4sIHRoaXMgT3AgaXMgY29tcGxldGUuCi0JCSAqLworCQkvKiBObyBtb3JlIGNoaWxkcmVuLCB0aGlzIE9wIGlzIGNvbXBsZXRlLiAqLworCiAJCW5leHQgPSBvcC0+Y29tbW9uLm5leHQ7CiAJCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OwogCiAJCWFjcGlfcHNfZnJlZV9vcCAob3ApOwogCi0JCS8qCi0JCSAqIElmIHdlIGFyZSBiYWNrIHRvIHRoZSBzdGFydGluZyBwb2ludCwgdGhlIHdhbGsgaXMgY29tcGxldGUuCi0JCSAqLworCQkvKiBJZiB3ZSBhcmUgYmFjayB0byB0aGUgc3RhcnRpbmcgcG9pbnQsIHRoZSB3YWxrIGlzIGNvbXBsZXRlLiAqLworCiAJCWlmIChvcCA9PSBzdWJ0cmVlX3Jvb3QpIHsKIAkJCXJldHVybl9WT0lEOwogCQl9CkBAIC0xMTEsNSArMTA5LDYgQEAKIAkJCW9wID0gcGFyZW50OwogCQl9CiAJfQorCiAJcmV0dXJuX1ZPSUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCmluZGV4IGIzMThhZDIuLmRiYTg5MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCkBAIC01NywxMyArNTcsMTYgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc3hfZXhlY3V0ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBJbmZvLT5Ob2RlICAgICAgICAgIC0gQSBtZXRob2Qgb2JqZWN0IGNvbnRhaW5pbmcgYm90aCB0aGUgQU1MCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgYW5kIGxlbmd0aC4KLSAqICAgICAgICAgICAgICAqKlBhcmFtcyAgICAgICAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gbWV0aG9kLAorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kIE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuIFBhcmFtcyBpdHNlbGYgbWF5IGJlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICogICAgICAgICAgICAgICoqcmV0dXJuX29ial9kZXNjICAgLSBSZXR1cm4gb2JqZWN0IGZyb20gZXhlY3V0aW9uIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuCisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfdHlwZSAgLSBUeXBlIG9mIFBhcmFtZXRlciBsaXN0CisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xOTYsOSArMTk5LDggQEAKIAkJZ290byBjbGVhbnVwMzsKIAl9CiAKLQkvKgotCSAqIFRoZSB3YWxrIG9mIHRoZSBwYXJzZSB0cmVlIGlzIHdoZXJlIHdlIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIG1ldGhvZAotCSAqLworCS8qIFRoZSB3YWxrIG9mIHRoZSBwYXJzZSB0cmVlIGlzIHdoZXJlIHdlIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIG1ldGhvZCAqLworCiAJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOwogCWdvdG8gY2xlYW51cDI7IC8qIFdhbGsgc3RhdGUgYWxyZWFkeSBkZWxldGVkICovCiAKQEAgLTIxNyw3ICsyMTksOCBAQAogCQlmb3IgKGkgPSAwOyBpbmZvLT5wYXJhbWV0ZXJzW2ldOyBpKyspIHsKIAkJCS8qIElnbm9yZSBlcnJvcnMsIGp1c3QgZG8gdGhlbSBhbGwgKi8KIAotCQkJKHZvaWQpIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKGluZm8tPnBhcmFtZXRlcnNbaV0sIFJFRl9ERUNSRU1FTlQpOworCQkJKHZvaWQpIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKAorCQkJCQkgaW5mby0+cGFyYW1ldGVyc1tpXSwgUkVGX0RFQ1JFTUVOVCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKaW5kZXggNTIwYjI4YS4uNmFkMGU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKQEAgLTcyLDEwICs3MiwxMiBAQAogCXU4CQkJYWN0aXZlOwkJCS8qIEN1cnJlbnQgSVJRICovCiAJdTgJCQllZGdlX2xldmVsOwkJLyogQWxsIElSUXMgKi8KIAl1OAkJCWFjdGl2ZV9oaWdoX2xvdzsJLyogQWxsIElSUXMgKi8KLQl1OAkJCWluaXRpYWxpemVkOwogCXU4CQkJcmVzb3VyY2VfdHlwZTsKIAl1OAkJCXBvc3NpYmxlX2NvdW50OwogCXU4CQkJcG9zc2libGVbQUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEVdOworCXU4CQkJaW5pdGlhbGl6ZWQ6MTsKKwl1OAkJCXN1c3BlbmRfcmVzdW1lOjE7CisJdTgJCQlyZXNlcnZlZDo2OwogfTsKIAogc3RydWN0IGFjcGlfcGNpX2xpbmsgewpAQCAtNTMwLDYgKzUzMiwxMCBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19hbGxvY2F0ZSIpOwogCisJaWYgKGxpbmstPmlycS5zdXNwZW5kX3Jlc3VtZSkgeworCQlhY3BpX3BjaV9saW5rX3NldChsaW5rLCBsaW5rLT5pcnEuYWN0aXZlKTsKKwkJbGluay0+aXJxLnN1c3BlbmRfcmVzdW1lID0gMDsKKwl9CiAJaWYgKGxpbmstPmlycS5pbml0aWFsaXplZCkKIAkJcmV0dXJuX1ZBTFVFKDApOwogCkBAIC03MTMsMzggKzcxOSwyNCBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KIHN0YXRpYyBpbnQKLWFjcGlfcGNpX2xpbmtfcmVzdW1lICgKLQlzdHJ1Y3QgYWNwaV9wY2lfbGluawkqbGluaykKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9saW5rX3Jlc3VtZSIpOwotCQotCWlmIChsaW5rLT5pcnEuYWN0aXZlICYmIGxpbmstPmlycS5pbml0aWFsaXplZCkKLQkJcmV0dXJuX1ZBTFVFKGFjcGlfcGNpX2xpbmtfc2V0KGxpbmssIGxpbmstPmlycS5hY3RpdmUpKTsKLQllbHNlCi0JCXJldHVybl9WQUxVRSgwKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1pcnFyb3V0ZXJfcmVzdW1lKAotCXN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCitpcnFyb3V0ZXJfc3VzcGVuZCgKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCXUzMglzdGF0ZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqbm9kZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcGNpX2xpbmsgICAgKmxpbmsgPSBOVUxMOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiaXJxcm91dGVyX3Jlc3VtZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImlycXJvdXRlcl9zdXNwZW5kIik7CiAKIAlsaXN0X2Zvcl9lYWNoKG5vZGUsICZhY3BpX2xpbmsuZW50cmllcykgewotCiAJCWxpbmsgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBhY3BpX3BjaV9saW5rLCBub2RlKTsKIAkJaWYgKCFsaW5rKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBsaW5rIGNvbnRleHRcbiIpKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0KLQkJYWNwaV9wY2lfbGlua19yZXN1bWUobGluayk7CisJCWlmIChsaW5rLT5pcnEuYWN0aXZlICYmIGxpbmstPmlycS5pbml0aWFsaXplZCkKKwkJCWxpbmstPmlycS5zdXNwZW5kX3Jlc3VtZSA9IDE7CiAJfQogCXJldHVybl9WQUxVRSgwKTsKIH0KQEAgLTgxMiw5ICs4MDQsMTIgQEAKICAqIFRoZXJlIGlzIG5vIElTQV9QT1NTSUJMRSB3ZWlnaHQsIHNvIHdlIHNpbXBseSB1c2UKICAqIHRoZSAoc21hbGwpIFBDSV9VU0lORyBwZW5hbHR5LgogICovCi12b2lkIGFjcGlfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQordm9pZCBhY3BpX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKLQlhY3BpX2lycV9wZW5hbHR5W2lycV0gKz0gUElSUV9QRU5BTFRZX1BDSV9VU0lORzsKKwlpZiAoYWN0aXZlKQorCQlhY3BpX2lycV9wZW5hbHR5W2lycV0gKz0gUElSUV9QRU5BTFRZX0lTQV9VU0VEOworCWVsc2UKKwkJYWNwaV9pcnFfcGVuYWx0eVtpcnFdICs9IFBJUlFfUEVOQUxUWV9QQ0lfVVNJTkc7CiB9CiAKIC8qCkBAIC04NTYsNyArODUxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgaXJxcm91dGVyX3N5c2Rldl9jbGFzcyA9IHsKICAgICAgICAgc2V0X2tzZXRfbmFtZSgiaXJxcm91dGVyIiksCi0gICAgICAgIC5yZXN1bWUgPSBpcnFyb3V0ZXJfcmVzdW1lLAorICAgICAgICAuc3VzcGVuZCA9IGlycXJvdXRlcl9zdXNwZW5kLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCmluZGV4IDc2MTU2YWMuLmQ1NmE0MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCkBAIC0yNTYsNiArMjU2LDQzIEBACiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbiBBQ1BJIHByb2Nlc3NvciBmdWNudGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBfUERDIGlzIHJlcXVpcmVkIGZvciBhIEJJT1MtT1MgaGFuZHNoYWtlIGZvciBtb3N0IG9mIHRoZSBuZXdlcgorICogQUNQSSBwcm9jZXNzb3IgZmVhdHVyZXMuCisgKi8KKworaW50IGFjcGlfcHJvY2Vzc29yX3NldF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjX2luKQoreworCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKKwl1MzIJCQlhcmcwX2J1ZlszXTsKKwl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9CVUZGRVJ9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CW5vX29iamVjdCA9IHsxLCAmYXJnMH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJKnBkYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3NldF9wZGMiKTsKKworCWFyZzAuYnVmZmVyLmxlbmd0aCA9IDEyOworCWFyZzAuYnVmZmVyLnBvaW50ZXIgPSAodTggKikgYXJnMF9idWY7CisJYXJnMF9idWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKKwlhcmcwX2J1ZlsxXSA9IDA7CisJYXJnMF9idWZbMl0gPSAwOworCisJcGRjID0gKHBkY19pbikgPyBwZGNfaW4gOiAmbm9fb2JqZWN0OworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9QREMiLCBwZGMsIE5VTEwpOworCisJaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgJiYgKHBkY19pbikpCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkVycm9yIGV2YWx1YXRpbmcgX1BEQywgdXNpbmcgbGVnYWN5IHBlcmYuIGNvbnRyb2wuLi5cbiIpKTsKKworCXJldHVybl9WQUxVRShzdGF0dXMpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwppbmRleCBjOWQ2NzFjLi44OTNiMDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwpAQCAtNiw2ICs2LDggQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgICAgICAgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgogICogIENvcHlyaWdodCAoQykgMjAwNCAgQW5pbCBTIEtlc2hhdmFtdXJ0aHkgPGFuaWwucy5rZXNoYXZhbXVydGh5QGludGVsLmNvbT4KICAqICAJCQktIEFkZGVkIHByb2Nlc3NvciBob3RwbHVnIHN1cHBvcnQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFZlbmthdGVzaCBQYWxsaXBhZGkgPHZlbmthdGVzaC5wYWxsaXBhZGlAaW50ZWwuY29tPgorICogIAkJCS0gQWRkZWQgc3VwcG9ydCBmb3IgQzMgb24gU01QCiAgKgogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqCkBAIC0xNDIsNyArMTQ0LDcgQEAKIAkJc3dpdGNoIChvbGQtPnR5cGUpIHsKIAkJY2FzZSBBQ1BJX1NUQVRFX0MzOgogCQkJLyogRGlzYWJsZSBidXMgbWFzdGVyIHJlbG9hZCAqLwotCQkJaWYgKG5ldy0+dHlwZSAhPSBBQ1BJX1NUQVRFX0MzKQorCQkJaWYgKG5ldy0+dHlwZSAhPSBBQ1BJX1NUQVRFX0MzICYmIHByLT5mbGFncy5ibV9jaGVjaykKIAkJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCwgMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE1Miw3ICsxNTQsNyBAQAogCXN3aXRjaCAobmV3LT50eXBlKSB7CiAJY2FzZSBBQ1BJX1NUQVRFX0MzOgogCQkvKiBFbmFibGUgYnVzIG1hc3RlciByZWxvYWQgKi8KLQkJaWYgKG9sZC0+dHlwZSAhPSBBQ1BJX1NUQVRFX0MzKQorCQlpZiAob2xkLT50eXBlICE9IEFDUElfU1RBVEVfQzMgJiYgcHItPmZsYWdzLmJtX2NoZWNrKQogCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTYzLDYgKzE2NSw5IEBACiB9CiAKIAorc3RhdGljIGF0b21pY190IAljM19jcHVfY291bnQ7CisKKwogc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfaWRsZSAodm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gTlVMTDsKQEAgLTI5Nyw4ICszMDIsMjIgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfU1RBVEVfQzM6Ci0JCS8qIERpc2FibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbiAqLwotCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkKKwkJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgeworCQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZjM19jcHVfY291bnQpID09CisJCQkJCW51bV9vbmxpbmVfY3B1cygpKSB7CisJCQkJLyoKKwkJCQkgKiBBbGwgQ1BVcyBhcmUgdHJ5aW5nIHRvIGdvIHRvIEMzCisJCQkJICogRGlzYWJsZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uCisJCQkJICovCisJCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDEsCisJCQkJCUFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNNUCB3aXRoIG5vIHNoYXJlZCBjYWNoZS4uLiBJbnZhbGlkYXRlIGNhY2hlICAqLworCQkJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKKwkJfQorCQkKIAkJLyogR2V0IHN0YXJ0IHRpbWUgKHRpY2tzKSAqLwogCQl0MSA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7CiAJCS8qIEludm9rZSBDMyAqLwpAQCAtMzA3LDggKzMyNiwxMiBAQAogCQl0MiA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7CiAJCS8qIEdldCBlbmQgdGltZSAodGlja3MpICovCiAJCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKLQkJLyogRW5hYmxlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gKi8KLQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDAsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgeworCQkJLyogRW5hYmxlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gKi8KKwkJCWF0b21pY19kZWMoJmMzX2NwdV9jb3VudCk7CisJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQl9CisKIAkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQkvKiBDb21wdXRlIHRpbWUgKHRpY2tzKSB0aGF0IHdlIHdlcmUgYWN0dWFsbHkgYXNsZWVwICovCkBAIC01MTksNiArNTQyLDI5IEBACiB9CiAKIAorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoreworCWludCBpOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZGVmYXVsdF9jMSIpOworCisJZm9yIChpID0gMDsgaSA8IEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUjsgaSsrKQorCQltZW1zZXQocHItPnBvd2VyLnN0YXRlcywgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCkpOworCisJLyogaWYgaW5mbyBpcyBvYnRhaW5lZCBmcm9tIHBibGsvZmFkdCwgdHlwZSBlcXVhbHMgc3RhdGUgKi8KKwlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnR5cGUgPSBBQ1BJX1NUQVRFX0MxOworCXByLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9DMl0udHlwZSA9IEFDUElfU1RBVEVfQzI7CisJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MzXS50eXBlID0gQUNQSV9TVEFURV9DMzsKKworCS8qIHRoZSBDMCBzdGF0ZSBvbmx5IGV4aXN0cyBhcyBhIGZpbGxlciBpbiBvdXIgYXJyYXksCisJICogYW5kIGFsbCBwcm9jZXNzb3JzIG5lZWQgdG8gc3VwcG9ydCBDMSAqLworCXByLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9DMF0udmFsaWQgPSAxOworCXByLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9DMV0udmFsaWQgPSAxOworCisJcmV0dXJuX1ZBTFVFKDApOworfQorCisKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fY3N0IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewogCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSAwOwpAQCAtNTI5LDkgKzU3NSw2IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19jc3QiKTsKIAotCWlmIChlcnJhdGEuc21wKQotCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0KIAlpZiAobm9jc3QpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIApAQCAtNjY0LDEzICs3MDcsNiBAQAogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQkvKiBXZSdyZSAoY3VycmVudGx5KSBvbmx5IHN1cHBvcnRpbmcgQzIgb24gVVAgKi8KLQllbHNlIGlmIChlcnJhdGEuc21wKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJDMiBub3Qgc3VwcG9ydGVkIGluIFNNUCBtb2RlXG4iKSk7Ci0JCXJldHVybl9WT0lEOwotCX0KLQogCS8qCiAJICogT3RoZXJ3aXNlIHdlJ3ZlIG1ldCBhbGwgb2Ygb3VyIEMyIHJlcXVpcmVtZW50cy4KIAkgKiBOb3JtYWxpemUgdGhlIEMyIGxhdGVuY3kgdG8gZXhwaWRpdGUgcG9saWN5CkBAIC02ODYsNiArNzIyLDggQEAKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gpCiB7CisJc3RhdGljIGludCBibV9jaGVja19mbGFnOworCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX3ZlcmlmeV9jMyIpOwogCiAJaWYgKCFjeC0+YWRkcmVzcykKQEAgLTcwMiwyMCArNzQwLDYgQEAKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCi0JLyogYnVzIG1hc3RlcmluZyBjb250cm9sIGlzIG5lY2Vzc2FyeSAqLwotCWVsc2UgaWYgKCFwci0+ZmxhZ3MuYm1fY29udHJvbCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAiQzMgc3VwcG9ydCByZXF1aXJlcyBidXMgbWFzdGVyaW5nIGNvbnRyb2xcbiIpKTsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JLyogV2UncmUgKGN1cnJlbnRseSkgb25seSBzdXBwb3J0aW5nIEMyIG9uIFVQICovCi0JZWxzZSBpZiAoZXJyYXRhLnNtcCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAiQzMgbm90IHN1cHBvcnRlZCBpbiBTTVAgbW9kZVxuIikpOwotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KIAkvKgogCSAqIFBJSVg0IEVycmF0dW0gIzE4OiBXZSBkb24ndCBzdXBwb3J0IEMzIHdoZW4gVHlwZS1GIChmYXN0KQogCSAqIERNQSB0cmFuc2ZlcnMgYXJlIHVzZWQgYnkgYW55IElTQSBkZXZpY2UgdG8gYXZvaWQgbGl2ZWxvY2suCkBAIC03MjksNiArNzUzLDM5IEBACiAJCXJldHVybl9WT0lEOwogCX0KIAorCS8qIEFsbCB0aGUgbG9naWMgaGVyZSBhc3N1bWVzIGZsYWdzLmJtX2NoZWNrIGlzIHNhbWUgYWNyb3NzIGFsbCBDUFVzICovCisJaWYgKCFibV9jaGVja19mbGFnKSB7CisJCS8qIERldGVybWluZSB3aGV0aGVyIGJtX2NoZWNrIGlzIG5lZWRlZCBiYXNlZCBvbiBDUFUgICovCisJCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soJihwci0+ZmxhZ3MpLCBwci0+aWQpOworCQlibV9jaGVja19mbGFnID0gcHItPmZsYWdzLmJtX2NoZWNrOworCX0gZWxzZSB7CisJCXByLT5mbGFncy5ibV9jaGVjayA9IGJtX2NoZWNrX2ZsYWc7CisJfQorCisJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgeworCQlwcmludGsoIkRpc2FibGluZyBCTSBhY2Nlc3MgYmVmb3JlIGVudGVyaW5nIEMzXG4iKTsKKwkJLyogYnVzIG1hc3RlcmluZyBjb250cm9sIGlzIG5lY2Vzc2FyeSAqLworCQlpZiAoIXByLT5mbGFncy5ibV9jb250cm9sKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJDMyBzdXBwb3J0IHJlcXVpcmVzIGJ1cyBtYXN0ZXJpbmcgY29udHJvbFxuIikpOworCQkJcmV0dXJuX1ZPSUQ7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoIkludmFsaWRhdGluZyBjYWNoZSBiZWZvcmUgZW50ZXJpbmcgQzNcbiIpOworCQkvKgorCQkgKiBXQklOVkQgc2hvdWxkIGJlIHNldCBpbiBmYWR0LCBmb3IgQzMgc3RhdGUgdG8gYmUKKwkJICogc3VwcG9ydGVkIG9uIHdoZW4gYm1fY2hlY2sgaXMgbm90IHJlcXVpcmVkLgorCQkgKi8KKwkJaWYgKGFjcGlfZmFkdC53Yl9pbnZkICE9IDEpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIkNhY2hlIGludmFsaWRhdGlvbiBzaG91bGQgd29yayBwcm9wZXJseSIKKwkJCSAgIiBmb3IgQzMgdG8gYmUgZW5hYmxlZCBvbiBTTVAgc3lzdGVtc1xuIikpOworCQkJcmV0dXJuX1ZPSUQ7CisJCX0KKwkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsCisJCQkJMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCX0KKwogCS8qCiAJICogT3RoZXJ3aXNlIHdlJ3ZlIG1ldCBhbGwgb2Ygb3VyIEMzIHJlcXVpcmVtZW50cy4KIAkgKiBOb3JtYWxpemUgdGhlIEMzIGxhdGVuY3kgdG8gZXhwaWRpdGUgcG9saWN5LiAgRW5hYmxlCkBAIC03MzcsNyArNzk0LDYgQEAKIAkgKi8KIAljeC0+dmFsaWQgPSAxOwogCWN4LT5sYXRlbmN5X3RpY2tzID0gVVNfVE9fUE1fVElNRVJfVElDS1MoY3gtPmxhdGVuY3kpOwotCXByLT5mbGFncy5ibV9jaGVjayA9IDE7CiAKIAlyZXR1cm5fVk9JRDsKIH0KQEAgLTc4NywxMCArODQzLDcgQEAKIAlpZiAoKHJlc3VsdCkgfHwgKGFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeShwcikgPCAyKSkgewogCQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19mYWR0KHByKTsKIAkJaWYgKHJlc3VsdCkKLQkJCXJldHVybl9WQUxVRShyZXN1bHQpOwotCi0JCWlmIChhY3BpX3Byb2Nlc3Nvcl9wb3dlcl92ZXJpZnkocHIpIDwgMikKLQkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKKwkJCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHRfYzEocHIpOwogCX0KIAogCS8qCkBAIC04MTAsMTEgKzg2MywxMCBAQAogCSAqIENQVSBhcyBiZWluZyAiaWRsZSBtYW5hZ2VhYmxlIgogCSAqLwogCWZvciAoaSA9IDE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgewotCQlpZiAocHItPnBvd2VyLnN0YXRlc1tpXS52YWxpZCkKKwkJaWYgKHByLT5wb3dlci5zdGF0ZXNbaV0udmFsaWQpIHsKIAkJCXByLT5wb3dlci5jb3VudCA9IGk7Ci0JCWlmICgocHItPnBvd2VyLnN0YXRlc1tpXS52YWxpZCkgJiYKLQkJICAgIChwci0+cG93ZXIuc3RhdGVzW2ldLnR5cGUgPj0gQUNQSV9TVEFURV9DMikpCiAJCQlwci0+ZmxhZ3MucG93ZXIgPSAxOworCQl9CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwpAQCAtODI5LDcgKzg4MSw3IEBACiAJaWYgKCFwcikKICAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCWlmIChlcnJhdGEuc21wIHx8IG5vY3N0KSB7CisJaWYgKCBub2NzdCkgewogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCkBAIC05MjksNyArOTgxLDYgQEAKIAkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotCiBpbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKQEAgLTk0Niw3ICs5OTcsMTAgQEAKIAkJZmlyc3RfcnVuKys7CiAJfQogCi0JaWYgKCFlcnJhdGEuc21wICYmIChwci0+aWQgPT0gMCkgJiYgYWNwaV9mYWR0LmNzdF9jbnQgJiYgIW5vY3N0KSB7CisJaWYgKCFwcikKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCisJaWYgKGFjcGlfZmFkdC5jc3RfY250ICYmICFub2NzdCkgewogCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9mYWR0LnNtaV9jbWQsIGFjcGlfZmFkdC5jc3RfY250LCA4KTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLApAQCAtOTU0LDYgKzEwMDgsOCBAQAogCQl9CiAJfQogCisJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9wZGMoJihwci0+cG93ZXIpLCBwci0+aWQpOworCWFjcGlfcHJvY2Vzc29yX3NldF9wZGMocHIsIHByLT5wb3dlci5wZGMpOwogCWFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvKHByKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCmluZGV4IGE5YTFhOGYuLjFmMGQ2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCkBAIC0xNjUsMzcgKzE2NSw2IEBACiAJYWNwaV9wcm9jZXNzb3JfcHBjX3N0YXR1cyAmPSB+UFBDX1JFR0lTVEVSRUQ7CiB9CiAKLS8qCi0gKiB3aGVuIHJlZ2lzdGVyaW5nIGEgY3B1ZnJlcSBkcml2ZXIgd2l0aCB0aGlzIEFDUEkgcHJvY2Vzc29yIGRyaXZlciwgdGhlCi0gKiBfUENUIGFuZCBfUFNTIHN0cnVjdHVyZXMgYXJlIHJlYWQgb3V0IGFuZCB3cml0dGVuIGludG8gc3RydWN0Ci0gKiBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZS4KLSAqLwotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQotewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMgkJCWFyZzBfYnVmWzNdOwotCXVuaW9uIGFjcGlfb2JqZWN0CWFyZzAgPSB7QUNQSV9UWVBFX0JVRkZFUn07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3Qgbm9fb2JqZWN0ID0gezEsICZhcmcwfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyIpOwotCi0JYXJnMC5idWZmZXIubGVuZ3RoID0gMTI7Ci0JYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKLQlhcmcwX2J1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOwotCWFyZzBfYnVmWzFdID0gMDsKLQlhcmcwX2J1ZlsyXSA9IDA7Ci0KLQlwZGMgPSAocHItPnBlcmZvcm1hbmNlLT5wZGMpID8gcHItPnBlcmZvcm1hbmNlLT5wZGMgOiAmbm9fb2JqZWN0OwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9QREMiLCBwZGMsIE5VTEwpOwotCi0JaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgJiYgKHByLT5wZXJmb3JtYW5jZS0+cGRjKSkKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRXJyb3IgZXZhbHVhdGluZyBfUERDLCB1c2luZyBsZWdhY3kgcGVyZi4gY29udHJvbC4uLlxuIikpOwotCi0JcmV0dXJuX1ZBTFVFKHN0YXR1cyk7Ci19Ci0KIAogc3RhdGljIGludAogYWNwaV9wcm9jZXNzb3JfZ2V0X3BlcmZvcm1hbmNlX2NvbnRyb2wgKApAQCAtMzU3LDcgKzMyNiw3IEBACiAJaWYgKCFwciB8fCAhcHItPnBlcmZvcm1hbmNlIHx8ICFwci0+aGFuZGxlKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjKHByKTsKKwlhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjKHByLCBwci0+cGVyZm9ybWFuY2UtPnBkYyk7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocHItPmhhbmRsZSwgIl9QQ1QiLCAmaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jCmluZGV4IDQ3ODhjMDcuLjU1ZDI2NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYwpAQCAtNzcsMjEgKzc3LDIxIEBACiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3B0cjsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNik7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNjsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4OworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcHRyOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2FkZHJlc3MxNl9yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKLQkgKi8KKwkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKQEAgLTEwNCw5ICsxMDQsOCBAQAogCSpieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9BRERSRVNTMTY7CiAKLQkvKgotCSAqIEdldCB0aGUgUmVzb3VyY2UgVHlwZSAoQnl0ZTMpCi0JICovCisJLyogR2V0IHRoZSBSZXNvdXJjZSBUeXBlIChCeXRlMykgKi8KKwogCWJ1ZmZlciArPSAyOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtMTE4LDkgKzExNyw4IEBACiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV90eXBlID0gdGVtcDg7CiAKLQkvKgotCSAqIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpCi0JICovCisJLyogR2V0IHRoZSBHZW5lcmFsIEZsYWdzIChCeXRlNCkgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtMTQwLDkgKzEzOCw4IEBACiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5tYXhfYWRkcmVzc19maXhlZCA9ICh0ZW1wOCA+PiAzKSAmIDB4MDE7CiAKLQkvKgotCSAqIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpCi0JICovCisJLyogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtMTY1LDM5ICsxNjIsMzQgQEAKIAkJfQogCX0KIAotCS8qCi0JICogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTcpCi0JICovCisJLyogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTcpICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5ncmFudWxhcml0eSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyA4LTkpCi0JICovCisJLyogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyA4LTkpICovCisKIAlidWZmZXIgKz0gMjsKIAlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5taW5fYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IG1heF9hZGRyZXNzX3JhbmdlIChCeXRlcyAxMC0xMSkKLQkgKi8KKwkvKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDEwLTExKSAqLworCiAJYnVmZmVyICs9IDI7CiAJQUNQSV9NT1ZFXzE2X1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYubWF4X2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMTItMTMpCi0JICovCi0JYnVmZmVyICs9IDI7Ci0JQUNQSV9NT1ZFXzE2X1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsIGJ1ZmZlcik7CisJLyogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAxMi0xMykgKi8KIAotCS8qCi0JICogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAxNC0xNSkKLQkgKi8KKwlidWZmZXIgKz0gMjsKKwlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwKKwkJYnVmZmVyKTsKKworCS8qIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMTQtMTUpICovCisKIAlidWZmZXIgKz0gMjsKIAlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX2xlbmd0aCwgYnVmZmVyKTsKIAotCS8qCi0JICogUmVzb3VyY2UgU291cmNlIEluZGV4IChpZiBwcmVzZW50KQotCSAqLworCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkgKi8KKwogCWJ1ZmZlciArPSAyOwogCiAJLyoKQEAgLTIyNSw3ICsyMTcsOCBAQAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9CiAJCQkJKGNoYXIgKikoKHU4ICogKW91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CiAKLQkJdGVtcF9wdHIgPSAodTggKikgb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CisJCXRlbXBfcHRyID0gKHU4ICopCisJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKIAogCQkvKiBDb3B5IHRoZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyICovCiAKQEAgLTIzOSw5ICsyMzIsOCBAQAogCQkJaW5kZXggKz0gMTsKIAkJfQogCi0JCS8qCi0JCSAqIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbAotCQkgKi8KKwkJLyogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsICovCisKIAkJKnRlbXBfcHRyID0gMHgwMDsKIAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IGluZGV4ICsgMTsKQEAgLTI2MCwxNCArMjUyLDEyIEBACiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0gTlVMTDsKIAl9CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMzA1LDI4ICsyOTUsMjQgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfYWRkcmVzczE2X3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4ODg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIKLQkgKi8KKwkvKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCisKIAlsZW5ndGhfZmllbGQgPSBidWZmZXI7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikKLQkgKi8KKwkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV90eXBlICYgMHgwMyk7CiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MKLQkgKi8KKwkvKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7CiAKIAl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmRlY29kZSAmIDB4MDEpIDw8IDE7CkBAIC0zMzYsOSArMzIyLDggQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncwotCSAqLworCS8qIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncyAqLworCiAJdGVtcDggPSAwOwogCiAJaWYgKEFDUElfTUVNT1JZX1JBTkdFID09IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV90eXBlKSB7CkBAIC0zNjIsMzkgKzM0NywzNCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5Ci0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5ICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5ncmFudWxhcml0eSk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtaW5pbXVtCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1pbmltdW0gKi8KKwogCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2Lm1pbl9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0KLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWF4aW11bSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYubWF4X2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0Ci0JICovCi0JQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCS8qIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQgKi8KKworCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLAorCQkmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyBsZW5ndGggKi8KKwogCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfbGVuZ3RoKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsCi0JICovCisJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCisKIAlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKIAkJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7CiAKQEAgLTQwMyw5ICszODMsOCBAQAogCiAJCXRlbXBfcG9pbnRlciA9IChjaGFyICopIGJ1ZmZlcjsKIAotCQkvKgotCQkgKiBDb3B5IHRoZSBzdHJpbmcKLQkJICovCisJCS8qIENvcHkgdGhlIHN0cmluZyAqLworCiAJCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsCiAJCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIApAQCAtNDEzLDEyICszOTIsMTIgQEAKIAkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdGluZyArIG9uZSBmb3IgdGhlCiAJCSAqIHRlcm1pbmF0aW5nIG51bGwKIAkJICovCi0JCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOworCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKAorCQkJCSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CiAJfQogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAlhY3R1YWxfYnl0ZXMgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAkqYnl0ZXNfY29uc3VtZWQgPSBhY3R1YWxfYnl0ZXM7CiAKQEAgLTQ3NSw5ICs0NTQsOCBAQAogCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKIAlzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIpOwogCi0JLyoKLQkgKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICovCisJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCkBAIC00OTAsOSArNDY4LDggQEAKIAkqYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfQUREUkVTUzMyOwogCi0JLyoKLQkgKiBHZXQgdGhlIFJlc291cmNlIFR5cGUgKEJ5dGUzKQotCSAqLworCS8qIEdldCB0aGUgUmVzb3VyY2UgVHlwZSAoQnl0ZTMpICovCisKIAlidWZmZXIgKz0gMjsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTUwNCwzNSArNDgxLDI5IEBACiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlID0gdGVtcDg7CiAKLQkvKgotCSAqIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpCi0JICovCisJLyogR2V0IHRoZSBHZW5lcmFsIEZsYWdzIChCeXRlNCkgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAotCS8qCi0JICogUHJvZHVjZXIgLyBDb25zdW1lcgotCSAqLworCS8qIFByb2R1Y2VyIC8gQ29uc3VtZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnByb2R1Y2VyX2NvbnN1bWVyID0gdGVtcDggJiAweDAxOwogCi0JLyoKLQkgKiBEZWNvZGUKLQkgKi8KKwkvKiBEZWNvZGUgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmRlY29kZSA9ICh0ZW1wOCA+PiAxKSAmIDB4MDE7CiAKLQkvKgotCSAqIE1pbiBBZGRyZXNzIEZpeGVkCi0JICovCisJLyogTWluIEFkZHJlc3MgRml4ZWQgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLm1pbl9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDIpICYgMHgwMTsKIAotCS8qCi0JICogTWF4IEFkZHJlc3MgRml4ZWQKLQkgKi8KKwkvKiBNYXggQWRkcmVzcyBGaXhlZCAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWF4X2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMykgJiAweDAxOwogCi0JLyoKLQkgKiBHZXQgdGhlIFR5cGUgU3BlY2lmaWMgRmxhZ3MgKEJ5dGU1KQotCSAqLworCS8qIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTU1NiwzOSArNTI3LDM0IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIEdldCBHcmFudWxhcml0eSAoQnl0ZXMgNi05KQotCSAqLworCS8qIEdldCBHcmFudWxhcml0eSAoQnl0ZXMgNi05KSAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuZ3JhbnVsYXJpdHksIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBtaW5fYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTAtMTMpCi0JICovCisJLyogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyAxMC0xMykgKi8KKwogCWJ1ZmZlciArPSA0OwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLm1pbl9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDE0LTE3KQotCSAqLworCS8qIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTQtMTcpICovCisKIAlidWZmZXIgKz0gNDsKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5tYXhfYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAxOC0yMSkKLQkgKi8KLQlidWZmZXIgKz0gNDsKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwgYnVmZmVyKTsKKwkvKiBHZXQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQgKEJ5dGVzIDE4LTIxKSAqLwogCi0JLyoKLQkgKiBHZXQgYWRkcmVzc19sZW5ndGggKEJ5dGVzIDIyLTI1KQotCSAqLworCWJ1ZmZlciArPSA0OworCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LAorCQlidWZmZXIpOworCisJLyogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAyMi0yNSkgKi8KKwogCWJ1ZmZlciArPSA0OwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfbGVuZ3RoLCBidWZmZXIpOwogCi0JLyoKLQkgKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpCi0JICovCisJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IChpZiBwcmVzZW50KSAqLworCiAJYnVmZmVyICs9IDQ7CiAKIAkvKgpAQCAtNjE1LDcgKzU4MSw4IEBACiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0KIAkJCQkoY2hhciAqKSgodTggKilvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOwogCi0JCXRlbXBfcHRyID0gKHU4ICopIG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOworCQl0ZW1wX3B0ciA9ICh1OCAqKQorCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CiAKIAkJLyogQ29weSB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwogCkBAIC02MjgsOSArNTk1LDggQEAKIAkJCWluZGV4ICs9IDE7CiAJCX0KIAotCQkvKgotCQkgKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwKLQkJICovCisJCS8qIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbCAqLworCiAJCSp0ZW1wX3B0ciA9IDB4MDA7CiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gaW5kZXggKyAxOwogCkBAIC02NDgsMTQgKzYxNCwxMiBAQAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9IE5VTEw7CiAJfQogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTY5NCwyOSArNjU4LDI1IEBACiAKIAlidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg4NzsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyCi0JICovCisJLyogU2V0IGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCisKIAlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSICh1MTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikKLQkgKi8KKwkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlICYgMHgwMyk7CiAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgZ2VuZXJhbCBmbGFncwotCSAqLworCS8qIFNldCB0aGUgZ2VuZXJhbCBmbGFncyAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucHJvZHVjZXJfY29uc3VtZXIgJiAweDAxKTsKIAl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmRlY29kZSAmIDB4MDEpIDw8IDE7CiAJdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDI7CkBAIC03MjUsOSArNjg1LDggQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncwotCSAqLworCS8qIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncyAqLworCiAJdGVtcDggPSAwOwogCiAJaWYgKEFDUElfTUVNT1JZX1JBTkdFID09IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlKSB7CkBAIC03NTEsMzkgKzcxMCwzNCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5Ci0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5ICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5ncmFudWxhcml0eSk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtaW5pbXVtCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1pbmltdW0gKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLm1pbl9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0KLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWF4aW11bSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWF4X2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0Ci0JICovCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCS8qIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQgKi8KKworCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLAorCQkmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyBsZW5ndGggKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfbGVuZ3RoKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsCi0JICovCisJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCisKIAlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKIAkJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7CiAKQEAgLTc5Miw5ICs3NDYsOCBAQAogCiAJCXRlbXBfcG9pbnRlciA9IChjaGFyICopIGJ1ZmZlcjsKIAotCQkvKgotCQkgKiBDb3B5IHRoZSBzdHJpbmcKLQkJICovCisJCS8qIENvcHkgdGhlIHN0cmluZyAqLworCiAJCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsCiAJCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwogCkBAIC04MDIsMTIgKzc1NSwxMiBAQAogCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0aW5nICsgb25lIGZvciB0aGUKIAkJICogIHRlcm1pbmF0aW5nIG51bGwKIAkJICovCi0JCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOworCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKAorCQkJCSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CiAJfQogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAogCS8qCkBAIC04NjQsOSArODE3LDggQEAKIAlzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpOwogCXJlc291cmNlX3R5cGUgPSAqYnVmZmVyOwogCi0JLyoKLQkgKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICovCisJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCkBAIC04NzksOSArODMxLDggQEAKIAkqYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfQUREUkVTUzY0OwogCi0JLyoKLQkgKiBHZXQgdGhlIFJlc291cmNlIFR5cGUgKEJ5dGUzKQotCSAqLworCS8qIEdldCB0aGUgUmVzb3VyY2UgVHlwZSAoQnl0ZTMpICovCisKIAlidWZmZXIgKz0gMjsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTg5MywzNSArODQ0LDI5IEBACiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlID0gdGVtcDg7CiAKLQkvKgotCSAqIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpCi0JICovCisJLyogR2V0IHRoZSBHZW5lcmFsIEZsYWdzIChCeXRlNCkgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAotCS8qCi0JICogUHJvZHVjZXIgLyBDb25zdW1lcgotCSAqLworCS8qIFByb2R1Y2VyIC8gQ29uc3VtZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnByb2R1Y2VyX2NvbnN1bWVyID0gdGVtcDggJiAweDAxOwogCi0JLyoKLQkgKiBEZWNvZGUKLQkgKi8KKwkvKiBEZWNvZGUgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmRlY29kZSA9ICh0ZW1wOCA+PiAxKSAmIDB4MDE7CiAKLQkvKgotCSAqIE1pbiBBZGRyZXNzIEZpeGVkCi0JICovCisJLyogTWluIEFkZHJlc3MgRml4ZWQgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1pbl9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDIpICYgMHgwMTsKIAotCS8qCi0JICogTWF4IEFkZHJlc3MgRml4ZWQKLQkgKi8KKwkvKiBNYXggQWRkcmVzcyBGaXhlZCAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQubWF4X2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMykgJiAweDAxOwogCi0JLyoKLQkgKiBHZXQgdGhlIFR5cGUgU3BlY2lmaWMgRmxhZ3MgKEJ5dGU1KQotCSAqLworCS8qIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTk1MSwzMyArODk2LDI5IEBACiAJCWJ1ZmZlciArPSAyOwogCX0KIAotCS8qCi0JICogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTEzKSBvciAoQnl0ZXMgOC0xNSkKLQkgKi8KKwkvKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtMTMpIG9yIChCeXRlcyA4LTE1KSAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuZ3JhbnVsYXJpdHksIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBtaW5fYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTQtMjEpIG9yIChCeXRlcyAxNi0yMykKLQkgKi8KKwkvKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDE0LTIxKSBvciAoQnl0ZXMgMTYtMjMpICovCisKIAlidWZmZXIgKz0gODsKIAlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IG1heF9hZGRyZXNzX3JhbmdlIChCeXRlcyAyMi0yOSkgb3IgKEJ5dGVzIDI0LTMxKQotCSAqLworCS8qIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMjItMjkpIG9yIChCeXRlcyAyNC0zMSkgKi8KKwogCWJ1ZmZlciArPSA4OwogCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQgKEJ5dGVzIDMwLTM3KSBvciAoQnl0ZXMgMzItMzkpCi0JICovCi0JYnVmZmVyICs9IDg7Ci0JQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsIGJ1ZmZlcik7CisJLyogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAzMC0zNykgb3IgKEJ5dGVzIDMyLTM5KSAqLwogCi0JLyoKLQkgKiBHZXQgYWRkcmVzc19sZW5ndGggKEJ5dGVzIDM4LTQ1KSBvciAoQnl0ZXMgNDAtNDcpCi0JICovCisJYnVmZmVyICs9IDg7CisJQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsCisJCWJ1ZmZlcik7CisKKwkvKiBHZXQgYWRkcmVzc19sZW5ndGggKEJ5dGVzIDM4LTQ1KSBvciAoQnl0ZXMgNDAtNDcpICovCisKIAlidWZmZXIgKz0gODsKIAlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX2xlbmd0aCwgYnVmZmVyKTsKIApAQCAtOTg5LDE0ICs5MzAsMTUgQEAKIAkJLyogR2V0IHR5cGVfc3BlY2lmaWNfYXR0cmlidXRlIChCeXRlcyA0OC01NSkgKi8KIAogCQlidWZmZXIgKz0gODsKLQkJQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQudHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzLCBidWZmZXIpOworCQlBQ1BJX01PVkVfNjRfVE9fNjQgKAorCQkJJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnR5cGVfc3BlY2lmaWNfYXR0cmlidXRlcywKKwkJCWJ1ZmZlcik7CiAJfQogCWVsc2UgewogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC50eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMgPSAwOwogCi0JCS8qCi0JCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkKLQkJICovCisJCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkgKi8KKwogCQlidWZmZXIgKz0gODsKIAogCQkvKgpAQCAtMTAyNSw3ICs5NjcsOCBAQAogCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQogCQkJCQkoY2hhciAqKSgodTggKilvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOwogCi0JCQl0ZW1wX3B0ciA9ICh1OCAqKSBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKKwkJCXRlbXBfcHRyID0gKHU4ICopCisJCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CiAKIAkJCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KIApAQCAtMTA0Miw3ICs5ODUsOCBAQAogCQkJICogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsCiAJCQkgKi8KIAkJCSp0ZW1wX3B0ciA9IDB4MDA7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IGluZGV4ICsgMTsKKwkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0KKwkJCQlpbmRleCArIDE7CiAKIAkJCS8qCiAJCQkgKiBJbiBvcmRlciBmb3IgdGhlIHN0cnVjdF9zaXplIHRvIGZhbGwgb24gYSAzMi1iaXQgYm91bmRhcnksCkBAIC0xMDU0LDE0ICs5OTgsMTIgQEAKIAkJfQogCX0KIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0xMTAwLDI5ICsxMDQyLDI1IEBACiAKIAlidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg4QTsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyCi0JICovCisJLyogU2V0IGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCisKIAlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSICh1MTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikKLQkgKi8KKwkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlICYgMHgwMyk7CiAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgZ2VuZXJhbCBmbGFncwotCSAqLworCS8qIFNldCB0aGUgZ2VuZXJhbCBmbGFncyAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucHJvZHVjZXJfY29uc3VtZXIgJiAweDAxKTsKIAl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmRlY29kZSAmIDB4MDEpIDw8IDE7CiAJdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDI7CkBAIC0xMTMxLDkgKzEwNjksOCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzCi0JICovCisJLyogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzICovCisKIAl0ZW1wOCA9IDA7CiAKIAlpZiAoQUNQSV9NRU1PUllfUkFOR0UgPT0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3R5cGUpIHsKQEAgLTExNTcsMzkgKzEwOTQsMzQgQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eSAqLworCiAJQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuZ3JhbnVsYXJpdHkpOwogCWJ1ZmZlciArPSA4OwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtaW5pbXVtICovCisKIAlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDg7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0gKi8KKwogCUFDUElfTU9WRV82NF9UT182NCAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gODsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldAotCSAqLwotCUFDUElfTU9WRV82NF9UT182NCAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKKwkvKiBTZXQgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0ICovCisKKwlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwKKwkJJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CiAJYnVmZmVyICs9IDg7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgbGVuZ3RoICovCisKIAlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX2xlbmd0aCk7CiAJYnVmZmVyICs9IDg7CiAKLQkvKgotCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbAotCSAqLworCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbCAqLworCiAJaWYgKDAgIT0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoKSB7CiAJCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLmluZGV4OwogCkBAIC0xMTk4LDIxICsxMTMwLDIxIEBACiAKIAkJdGVtcF9wb2ludGVyID0gKGNoYXIgKikgYnVmZmVyOwogCi0JCS8qCi0JCSAqIENvcHkgdGhlIHN0cmluZwotCQkgKi8KLQkJQUNQSV9TVFJDUFkgKHRlbXBfcG9pbnRlciwgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKKwkJLyogQ29weSB0aGUgc3RyaW5nICovCisKKwkJQUNQSV9TVFJDUFkgKHRlbXBfcG9pbnRlciwKKwkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAKIAkJLyoKIAkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdGluZyArIG9uZSBmb3IgdGhlCiAJCSAqIHRlcm1pbmF0aW5nIG51bGwKIAkJICovCi0JCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOworCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKAorCQkJCSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CiAJfQogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYwppbmRleCA4YTVmMGE1Li45ODE3NmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMKQEAgLTgxLDkgKzgxLDggQEAKIAogCiAJd2hpbGUgKCFkb25lKSB7Ci0JCS8qCi0JCSAqIEluaXQgdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBob2xkIHRoZSBzaXplIHRvIGFkZCB0byB0aGUgdG90YWwuCi0JCSAqLworCQkvKiBJbml0IHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgaG9sZCB0aGUgc2l6ZSB0byBhZGQgdG8gdGhlIHRvdGFsLiAqLworCiAJCXNlZ21lbnRfc2l6ZSA9IDA7CiAKIAkJc3dpdGNoIChsaW5rZWRfbGlzdC0+aWQpIHsKQEAgLTE5Niw3ICsxOTUsOCBAQAogCQkJc2VnbWVudF9zaXplID0gMTY7CiAKIAkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpIHsKLQkJCQlzZWdtZW50X3NpemUgKz0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOworCQkJCXNlZ21lbnRfc2l6ZSArPQorCQkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CiAJCQkJc2VnbWVudF9zaXplKys7CiAJCQl9CiAJCQlicmVhazsKQEAgLTIxMiw3ICsyMTIsOCBAQAogCQkJc2VnbWVudF9zaXplID0gMjY7CiAKIAkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpIHsKLQkJCQlzZWdtZW50X3NpemUgKz0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOworCQkJCXNlZ21lbnRfc2l6ZSArPQorCQkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CiAJCQkJc2VnbWVudF9zaXplKys7CiAJCQl9CiAJCQlicmVhazsKQEAgLTIyNyw3ICsyMjgsOCBAQAogCQkJc2VnbWVudF9zaXplID0gNDY7CiAKIAkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpIHsKLQkJCQlzZWdtZW50X3NpemUgKz0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOworCQkJCXNlZ21lbnRfc2l6ZSArPQorCQkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CiAJCQkJc2VnbWVudF9zaXplKys7CiAJCQl9CiAJCQlicmVhazsKQEAgLTI0MSwzOCArMjQzLDM2IEBACiAJCQkgKiBJbmRleCArIHRoZSBsZW5ndGggb2YgdGhlIG51bGwgdGVybWluYXRlZCBzdHJpbmcKIAkJCSAqIFJlc291cmNlIFNvdXJjZSArIDEgZm9yIHRoZSBudWxsLgogCQkJICovCi0JCQlzZWdtZW50X3NpemUgPSA5ICsKLQkJCQkoKChhY3BpX3NpemUpIGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyAtIDEpICogNCk7CisJCQlzZWdtZW50X3NpemUgPSA5ICsgKCgoYWNwaV9zaXplKQorCQkJCWxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyAtIDEpICogNCk7CiAKIAkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpIHsKLQkJCQlzZWdtZW50X3NpemUgKz0gbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOworCQkJCXNlZ21lbnRfc2l6ZSArPQorCQkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CiAJCQkJc2VnbWVudF9zaXplKys7CiAJCQl9CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJLyoKLQkJCSAqIElmIHdlIGdldCBoZXJlLCBldmVyeXRoaW5nIGlzIG91dCBvZiBzeW5jLCBleGl0IHdpdGggZXJyb3IKLQkJCSAqLworCisJCQkvKiBJZiB3ZSBnZXQgaGVyZSwgZXZlcnl0aGluZyBpcyBvdXQgb2Ygc3luYywgZXhpdCB3aXRoIGVycm9yICovCisKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CiAKIAkJfSAvKiBzd2l0Y2ggKGxpbmtlZF9saXN0LT5JZCkgKi8KIAotCQkvKgotCQkgKiBVcGRhdGUgdGhlIHRvdGFsCi0JCSAqLworCQkvKiBVcGRhdGUgdGhlIHRvdGFsICovCisKIAkJYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQgKz0gc2VnbWVudF9zaXplOwogCi0JCS8qCi0JCSAqIFBvaW50IHRvIHRoZSBuZXh0IG9iamVjdAotCQkgKi8KKwkJLyogUG9pbnQgdG8gdGhlIG5leHQgb2JqZWN0ICovCisKIAkJbGlua2VkX2xpc3QgPSBBQ1BJX1BUUl9BREQgKHN0cnVjdCBhY3BpX3Jlc291cmNlLAogCQkJCSAgbGlua2VkX2xpc3QsIGxpbmtlZF9saXN0LT5sZW5ndGgpOwogCX0KIAotCS8qCi0JICogVGhpcyBpcyB0aGUgZGF0YSB0aGUgY2FsbGVyIG5lZWRzCi0JICovCisJLyogVGhpcyBpcyB0aGUgZGF0YSB0aGUgY2FsbGVyIG5lZWRzICovCisKIAkqc2l6ZV9uZWVkZWQgPSBieXRlX3N0cmVhbV9zaXplX25lZWRlZDsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTMyMCw5ICszMjAsOCBAQAogCiAKIAl3aGlsZSAoYnl0ZXNfcGFyc2VkIDwgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCkgewotCQkvKgotCQkgKiBUaGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gaXMgdGhlIHJlc291cmNlIHR5cGUKLQkJICovCisJCS8qIFRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbSBpcyB0aGUgcmVzb3VyY2UgdHlwZSAqLworCiAJCXJlc291cmNlX3R5cGUgPSBhY3BpX3JzX2dldF9yZXNvdXJjZV90eXBlICgqYnl0ZV9zdHJlYW1fYnVmZmVyKTsKIAogCQlzd2l0Y2ggKHJlc291cmNlX3R5cGUpIHsKQEAgLTM0Niw5ICszNDUsOCBAQAogCQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCQkJYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwogCi0JCQkvKgotCQkJICogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCi0JCQkgKi8KKwkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLworCiAJCQl0ZW1wMTYgPSAodTE2KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXAxNik7CiAKIAkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcikgKwpAQCAtNDE2LDkgKzQxNCw4IEBACiAJCQkJdGVtcDggPSAwOwogCQkJfQogCi0JCQkvKgotCQkJICogRW5zdXJlIGEgNjQtYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCi0JCQkgKi8KKwkJCS8qIEVuc3VyZSBhIDY0LWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLworCiAJCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b182NF9iSVRTICh0ZW1wOCk7CiAKIAkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCkgKwpAQCAtNDUyLDkgKzQ0OSw4IEBACiAJCQkJdGVtcDggPSAwOwogCQkJfQogCi0JCQkvKgotCQkJICogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCi0JCQkgKi8KKwkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLworCiAJCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7CiAKIAkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMikgKwpAQCAtNDg4LDkgKzQ4NCw4IEBACiAJCQkJdGVtcDggPSAwOwogCQkJfQogCi0JCQkvKgotCQkJICogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCi0JCQkgKi8KKwkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLworCiAJCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7CiAKIAkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNikgKwpAQCAtNTM3LDkgKzUzMiw4IEBACiAJCQkJdGVtcDggPSAwOwogCQkJfQogCi0JCQkvKgotCQkJICogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCi0JCQkgKi8KKwkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLworCiAJCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7CiAKIAkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEpICsKQEAgLTU2Nyw5ICs1NjEsOCBAQAogCiAJCQkrK2J1ZmZlcjsKIAotCQkJLyoKLQkJCSAqIExvb2sgYXQgdGhlIG51bWJlciBvZiBiaXRzIHNldAotCQkJICovCisJCQkvKiBMb29rIGF0IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgKi8KKwogCQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCiAJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxNjsgaW5kZXgrKykgewpAQCAtNTk2LDkgKzU4OSw4IEBACiAKIAkJCSsrYnVmZmVyOwogCi0JCQkvKgotCQkJICogTG9vayBhdCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0Ci0JCQkgKi8KKwkJCS8qIExvb2sgYXQgdGhlIG51bWJlciBvZiBiaXRzIHNldCAqLworCiAJCQl0ZW1wOCA9ICpidWZmZXI7CiAKIAkJCWZvcihpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgewpAQCAtNjcwLDkgKzY2Miw4IEBACiAJCQl0ZW1wOCA9ICh1OCkgKHRlbXA4ICYgMHg3KTsKIAkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDggKyAxOwogCi0JCQkvKgotCQkJICogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCi0JCQkgKi8KKwkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLworCiAJCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7CiAJCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpICsKIAkJCQkJICAgKHRlbXA4ICogc2l6ZW9mICh1OCkpOwpAQCAtNjk3LDIxICs2ODgsMTggQEAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CiAJCX0KIAotCQkvKgotCQkgKiBVcGRhdGUgdGhlIHJldHVybiB2YWx1ZSBhbmQgY291bnRlcgotCQkgKi8KKwkJLyogVXBkYXRlIHRoZSByZXR1cm4gdmFsdWUgYW5kIGNvdW50ZXIgKi8KKwogCQlidWZmZXJfc2l6ZSArPSAodTMyKSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUgKHN0cnVjdHVyZV9zaXplKTsKIAkJYnl0ZXNfcGFyc2VkICs9IGJ5dGVzX2NvbnN1bWVkOwogCi0JCS8qCi0JCSAqIFNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gcG9pbnQgdG8gdGhlIG5leHQgcmVzb3VyY2UKLQkJICovCisJCS8qIFNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gcG9pbnQgdG8gdGhlIG5leHQgcmVzb3VyY2UgKi8KKwogCQlieXRlX3N0cmVhbV9idWZmZXIgKz0gYnl0ZXNfY29uc3VtZWQ7CiAJfQogCi0JLyoKLQkgKiBUaGlzIGlzIHRoZSBkYXRhIHRoZSBjYWxsZXIgbmVlZHMKLQkgKi8KKwkvKiBUaGlzIGlzIHRoZSBkYXRhIHRoZSBjYWxsZXIgbmVlZHMgKi8KKwogCSpzaXplX25lZWRlZCA9IGJ1ZmZlcl9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNzY3LDkgKzc1NSw4IEBACiAJdG9wX29iamVjdF9saXN0ID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJfb2ZfZWxlbWVudHM7IGluZGV4KyspIHsKLQkJLyoKLQkJICogRGVyZWZlcmVuY2UgdGhlIHN1Yi1wYWNrYWdlCi0JCSAqLworCQkvKiBEZXJlZmVyZW5jZSB0aGUgc3ViLXBhY2thZ2UgKi8KKwogCQlwYWNrYWdlX2VsZW1lbnQgPSAqdG9wX29iamVjdF9saXN0OwogCiAJCS8qCkBAIC03NzgsMzcgKzc2NSw0MCBAQAogCQkgKi8KIAkJc3ViX29iamVjdF9saXN0ID0gcGFja2FnZV9lbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzOwogCi0JCS8qCi0JCSAqIFNjYW4gdGhlIGlycV90YWJsZV9lbGVtZW50cyBmb3IgdGhlIFNvdXJjZSBOYW1lIFN0cmluZwotCQkgKi8KKwkJLyogU2NhbiB0aGUgaXJxX3RhYmxlX2VsZW1lbnRzIGZvciB0aGUgU291cmNlIE5hbWUgU3RyaW5nICovCisKIAkJbmFtZV9mb3VuZCA9IEZBTFNFOwogCiAJCWZvciAodGFibGVfaW5kZXggPSAwOyB0YWJsZV9pbmRleCA8IDQgJiYgIW5hbWVfZm91bmQ7IHRhYmxlX2luZGV4KyspIHsKLQkJCWlmICgoQUNQSV9UWVBFX1NUUklORyA9PSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN1Yl9vYmplY3RfbGlzdCkpIHx8Ci0JCQkJKChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFID09IEFDUElfR0VUX09CSkVDVF9UWVBFICgqc3ViX29iamVjdF9saXN0KSkgJiYKLQkJCQkJKCgqc3ViX29iamVjdF9saXN0KS0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSkpIHsKKwkJCWlmICgoQUNQSV9UWVBFX1NUUklORyA9PQorCQkJCQlBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN1Yl9vYmplY3RfbGlzdCkpIHx8CisKKwkJCQkoKEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UgPT0KKwkJCQkJQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCpzdWJfb2JqZWN0X2xpc3QpKSAmJgorCisJCQkJCSgoKnN1Yl9vYmplY3RfbGlzdCktPnJlZmVyZW5jZS5vcGNvZGUgPT0KKwkJCQkJCUFNTF9JTlRfTkFNRVBBVEhfT1ApKSkgewogCQkJCW5hbWVfZm91bmQgPSBUUlVFOwogCQkJfQogCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBMb29rIGF0IHRoZSBuZXh0IGVsZW1lbnQKLQkJCQkgKi8KKwkJCQkvKiBMb29rIGF0IHRoZSBuZXh0IGVsZW1lbnQgKi8KKwogCQkJCXN1Yl9vYmplY3RfbGlzdCsrOwogCQkJfQogCQl9CiAKIAkJdGVtcF9zaXplX25lZWRlZCArPSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSkgLSA0KTsKIAotCQkvKgotCQkgKiBXYXMgYSBTdHJpbmcgdHlwZSBmb3VuZD8KLQkJICovCisJCS8qIFdhcyBhIFN0cmluZyB0eXBlIGZvdW5kPyAqLworCiAJCWlmIChuYW1lX2ZvdW5kKSB7CiAJCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCpzdWJfb2JqZWN0X2xpc3QpID09IEFDUElfVFlQRV9TVFJJTkcpIHsKIAkJCQkvKgogCQkJCSAqIFRoZSBsZW5ndGggU3RyaW5nLkxlbmd0aCBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHRoZQogCQkJCSAqIHRlcm1pbmF0aW5nIE5VTEwsIGFkZCAxCiAJCQkJICovCi0JCQkJdGVtcF9zaXplX25lZWRlZCArPSAoKGFjcGlfc2l6ZSkgKCpzdWJfb2JqZWN0X2xpc3QpLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCQkJdGVtcF9zaXplX25lZWRlZCArPSAoKGFjcGlfc2l6ZSkKKwkJCQkJKCpzdWJfb2JqZWN0X2xpc3QpLT5zdHJpbmcubGVuZ3RoICsgMSk7CiAJCQl9CiAJCQllbHNlIHsKIAkJCQl0ZW1wX3NpemVfbmVlZGVkICs9IGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aCAoCkBAIC04MjcsMTQgKzgxNywxNCBAQAogCiAJCXRlbXBfc2l6ZV9uZWVkZWQgPSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFMgKHRlbXBfc2l6ZV9uZWVkZWQpOwogCi0JCS8qCi0JCSAqIFBvaW50IHRvIHRoZSBuZXh0IHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKLQkJICovCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKi8KKwogCQl0b3Bfb2JqZWN0X2xpc3QrKzsKIAl9CiAKIAkvKgotCSAqIEFkZGluZyBhbiBleHRyYSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIGVzc2VudGlhbGx5IGEgTlVMTCB0ZXJtaW5hdG9yCisJICogQWRkaW5nIGFuIGV4dHJhIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgZXNzZW50aWFsbHkgYQorCSAqIE5VTEwgdGVybWluYXRvcgogCSAqLwogCSpidWZmZXJfc2l6ZV9uZWVkZWQgPSB0ZW1wX3NpemVfbmVlZGVkICsgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSk7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKaW5kZXggYTNhMGNiZi4uOGUwZWFlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwpAQCAtODcsOSArODcsOCBAQAogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJieXRlX3N0cmVhbV9idWZmZXIgPSAlcFxuIiwKIAkJYnl0ZV9zdHJlYW1fYnVmZmVyKSk7CiAKLQkvKgotCSAqIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZQotCSAqLworCS8qIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZSAqLworCiAJYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCA9IGJ5dGVfc3RyZWFtX2J1ZmZlci0+YnVmZmVyLmxlbmd0aDsKIAlieXRlX3N0cmVhbV9zdGFydCA9IGJ5dGVfc3RyZWFtX2J1ZmZlci0+YnVmZmVyLnBvaW50ZXI7CiAKQEAgLTE3MSw5ICsxNzAsOCBAQAogCiAJLyogUGFyYW1zIGFscmVhZHkgdmFsaWRhdGVkLCBzbyB3ZSBkb24ndCByZS12YWxpZGF0ZSBoZXJlICovCiAKLQkvKgotCSAqIEdldCB0aGUgcmVxdWlyZWQgYnVmZmVyIGxlbmd0aAotCSAqLworCS8qIEdldCB0aGUgcmVxdWlyZWQgYnVmZmVyIGxlbmd0aCAqLworCiAJc3RhdHVzID0gYWNwaV9yc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoIChwYWNrYWdlX29iamVjdCwKIAkJCSAmYnVmZmVyX3NpemVfbmVlZGVkKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0yMTcsOSArMjE1LDggQEAKIAkJICovCiAJCXVzZXJfcHJ0LT5sZW5ndGggPSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSkgLSA0KTsKIAotCQkvKgotCQkgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIHRvcC1sZXZlbCBwYWNrYWdlIG11c3QgYWxzbyBiZSBhIHBhY2thZ2UKLQkJICovCisJCS8qIEVhY2ggZWxlbWVudCBvZiB0aGUgdG9wLWxldmVsIHBhY2thZ2UgbXVzdCBhbHNvIGJlIGEgcGFja2FnZSAqLworCiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnRvcF9vYmplY3RfbGlzdCkgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJCSIoUFJUWyVYXSkgTmVlZCBzdWItcGFja2FnZSwgZm91bmQgJXNcbiIsCkBAIC0yNDMsOSArMjQwLDggQEAKIAkJICovCiAJCXN1Yl9vYmplY3RfbGlzdCA9ICgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5lbGVtZW50czsKIAotCQkvKgotCQkgKiAxKSBGaXJzdCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuQWRkcmVzcwotCQkgKi8KKwkJLyogMSkgRmlyc3Qgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULkFkZHJlc3MgKi8KKwogCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFswXTsKIAkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCXVzZXJfcHJ0LT5hZGRyZXNzID0gb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CkBAIC0yNTcsOSArMjUzLDggQEAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0RBVEEpOwogCQl9CiAKLQkJLyoKLQkJICogMikgU2Vjb25kIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5QaW4KLQkJICovCisJCS8qIDIpIFNlY29uZCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuUGluICovCisKIAkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3RbMV07CiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCQl1c2VyX3BydC0+cGluID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CkBAIC0yNzEsOSArMjY2LDggQEAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0RBVEEpOwogCQl9CiAKLQkJLyoKLQkJICogMykgVGhpcmQgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULnNvdXJjZV9uYW1lCi0JCSAqLworCQkvKiAzKSBUaGlyZCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuc291cmNlX25hbWUgKi8KKwogCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFsyXTsKIAkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKQEAgLTI5Niw3ICsyOTAsOSBAQAogCiAJCQlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZSAoKGFjcGlfaGFuZGxlKSBub2RlLCAmcGF0aF9idWZmZXIpOwogCi0JCQl1c2VyX3BydC0+bGVuZ3RoICs9ICh1MzIpIEFDUElfU1RSTEVOICh1c2VyX3BydC0+c291cmNlKSArIDE7IC8qIGluY2x1ZGUgbnVsbCB0ZXJtaW5hdG9yICovCisJCQkvKiArMSB0byBpbmNsdWRlIG51bGwgdGVybWluYXRvciAqLworCisJCQl1c2VyX3BydC0+bGVuZ3RoICs9ICh1MzIpIEFDUElfU1RSTEVOICh1c2VyX3BydC0+c291cmNlKSArIDE7CiAJCQlicmVhazsKIAogCkBAIC0zMDQsOCArMzAwLDEwIEBACiAKIAkJCUFDUElfU1RSQ1BZICh1c2VyX3BydC0+c291cmNlLCBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOwogCi0JCQkvKiBBZGQgdG8gdGhlIExlbmd0aCBmaWVsZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKGFkZCAxIGZvciB0ZXJtaW5hdG9yKSAqLwotCisJCQkvKgorCQkJICogQWRkIHRvIHRoZSBMZW5ndGggZmllbGQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCisJCQkgKiAoYWRkIDEgZm9yIHRlcm1pbmF0b3IpCisJCQkgKi8KIAkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxOwogCQkJYnJlYWs7CiAKQEAgLTMzMyw5ICszMzEsOCBAQAogCiAJCXVzZXJfcHJ0LT5sZW5ndGggPSAodTMyKSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFMgKHVzZXJfcHJ0LT5sZW5ndGgpOwogCi0JCS8qCi0JCSAqIDQpIEZvdXJ0aCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuc291cmNlX2luZGV4Ci0JCSAqLworCQkvKiA0KSBGb3VydGggc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULnNvdXJjZV9pbmRleCAqLworCiAJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzNdOwogCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQkJdXNlcl9wcnQtPnNvdXJjZV9pbmRleCA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMKaW5kZXggZWVmMWIxZi4uMTkzNWRhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCkBAIC00OCw5ICs0OCw2MiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc2R1bXAiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfaXJxICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9hZGRyZXNzMTYgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2FkZHJlc3MzMiAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfYWRkcmVzczY0ICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9kbWEgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2lvICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2ZpeGVkX2lvICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMiAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfbWVtb3J5MjQgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX21lbW9yeTMyICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9zdGFydF9kZXBlbmRfZm5zICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWMgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCiAKICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9pcnEKQEAgLTYzLDcgKzExNiw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9pcnEgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC03NywxMyArMTMwLDEzIEBACiAJYWNwaV9vc19wcmludGYgKCJJUlEgUmVzb3VyY2VcbiIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVzIFRyaWdnZXJlZFxuIiwKLQkJCSBBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBpcnFfZGF0YS0+ZWRnZV9sZXZlbCA/ICJMZXZlbCIgOiAiRWRnZSIpOworCQlBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBpcnFfZGF0YS0+ZWRnZV9sZXZlbCA/ICJMZXZlbCIgOiAiRWRnZSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFjdGl2ZSAlc1xuIiwKLQkJCSBBQ1BJX0FDVElWRV9MT1cgPT0gaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/ICJMb3ciIDogIkhpZ2giKTsKKwkJQUNQSV9BQ1RJVkVfTE9XID09IGlycV9kYXRhLT5hY3RpdmVfaGlnaF9sb3cgPyAiTG93IiA6ICJIaWdoIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJXNcbiIsCi0JCQkgQUNQSV9TSEFSRUQgPT0gaXJxX2RhdGEtPnNoYXJlZF9leGNsdXNpdmUgPyAiU2hhcmVkIiA6ICJFeGNsdXNpdmUiKTsKKwkJQUNQSV9TSEFSRUQgPT0gaXJxX2RhdGEtPnNoYXJlZF9leGNsdXNpdmUgPyAiU2hhcmVkIiA6ICJFeGNsdXNpdmUiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlWCBJbnRlcnJ1cHRzICggIiwgaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKTsKIApAQCAtMTA4LDcgKzE2MSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9kbWEgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC0xNDQsNyArMTk3LDcgQEAKIAl9CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJXNCdXMgTWFzdGVyXG4iLAotCQkJIEFDUElfQlVTX01BU1RFUiA9PSBkbWFfZGF0YS0+YnVzX21hc3RlciA/ICIiIDogIk5vdCBhICIpOworCQlBQ1BJX0JVU19NQVNURVIgPT0gZG1hX2RhdGEtPmJ1c19tYXN0ZXIgPyAiIiA6ICJOb3QgYSAiKTsKIAogCiAJc3dpdGNoIChkbWFfZGF0YS0+dHJhbnNmZXIpIHsKQEAgLTE2NSw3ICsyMTgsOCBAQAogCQlicmVhazsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgTnVtYmVyIG9mIENoYW5uZWxzOiAlWCAoICIsIGRtYV9kYXRhLT5udW1iZXJfb2ZfY2hhbm5lbHMpOworCWFjcGlfb3NfcHJpbnRmICgiICBOdW1iZXIgb2YgQ2hhbm5lbHM6ICVYICggIiwKKwkJZG1hX2RhdGEtPm51bWJlcl9vZl9jaGFubmVscyk7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBkbWFfZGF0YS0+bnVtYmVyX29mX2NoYW5uZWxzOyBpbmRleCsrKSB7CiAJCWFjcGlfb3NfcHJpbnRmICgiJVggIiwgZG1hX2RhdGEtPmNoYW5uZWxzW2luZGV4XSk7CkBAIC0xODgsNyArMjQyLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnMgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC0yMzIsOCArMjg2LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlhY3BpX29zX3ByaW50ZiAoIiAgSW52YWxpZCBwZXJmb3JtYW5jZSAiCi0JCQkJICAicm9idXN0bmVzcyBwcmVmZXJlbmNlXG4iKTsKKwkJYWNwaV9vc19wcmludGYgKCIgIEludmFsaWQgcGVyZm9ybWFuY2Ugcm9idXN0bmVzcyBwcmVmZXJlbmNlXG4iKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTMsNyArMzA2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2lvICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtMjY2LDE5ICszMTksMTUgQEAKIAlhY3BpX29zX3ByaW50ZiAoIklvIFJlc291cmNlXG4iKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlZCBiaXQgZGVjb2RlXG4iLAotCQkJIEFDUElfREVDT0RFXzE2ID09IGlvX2RhdGEtPmlvX2RlY29kZSA/IDE2IDogMTApOworCQlBQ1BJX0RFQ09ERV8xNiA9PSBpb19kYXRhLT5pb19kZWNvZGUgPyAxNiA6IDEwKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtaW5pbXVtIGJhc2U6ICUwOFhcbiIsCi0JCQkgaW9fZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CisJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwgaW9fZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAotCQkJIGlvX2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOworCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtYXhpbXVtIGJhc2U6ICUwOFhcbiIsIGlvX2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFsaWdubWVudDogJTA4WFxuIiwKLQkJCSBpb19kYXRhLT5hbGlnbm1lbnQpOworCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIGlvX2RhdGEtPmFsaWdubWVudCk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgTGVuZ3RoOiAlMDhYXG4iLAotCQkJIGlvX2RhdGEtPnJhbmdlX2xlbmd0aCk7CisJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIExlbmd0aDogJTA4WFxuIiwgaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KQEAgLTI5Niw3ICszNDUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfZml4ZWRfaW8gKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC0zMDcsMTEgKzM1Niw5IEBACiAKIAogCWFjcGlfb3NfcHJpbnRmICgiRml4ZWQgSW8gUmVzb3VyY2VcbiIpOwotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBiYXNlIGFkZHJlc3M6ICUwOFgiLAotCQkJIGZpeGVkX2lvX2RhdGEtPmJhc2VfYWRkcmVzcyk7CisJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGJhc2UgYWRkcmVzczogJTA4WCIsIGZpeGVkX2lvX2RhdGEtPmJhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYIiwKLQkJCSBmaXhlZF9pb19kYXRhLT5yYW5nZV9sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFgiLCBmaXhlZF9pb19kYXRhLT5yYW5nZV9sZW5ndGgpOwogCiAJcmV0dXJuOwogfQpAQCAtMzI5LDcgKzM3Niw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWMgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC0zNDYsNyArMzkzLDcgQEAKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHZlbmRvcl9kYXRhLT5sZW5ndGg7IGluZGV4KyspIHsKIAkJYWNwaV9vc19wcmludGYgKCIgIEJ5dGUgJVg6ICUwOFhcbiIsCi0JCQkJIGluZGV4LCB2ZW5kb3JfZGF0YS0+cmVzZXJ2ZWRbaW5kZXhdKTsKKwkJCWluZGV4LCB2ZW5kb3JfZGF0YS0+cmVzZXJ2ZWRbaW5kZXhdKTsKIAl9CiAKIAlyZXR1cm47CkBAIC0zNjUsNyArNDEyLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX21lbW9yeTI0ICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtMzc4LDIxICs0MjUsMTkgQEAKIAlhY3BpX29zX3ByaW50ZiAoIjI0LUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJlYWQlc1xuIiwKLQkJCSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQkgbWVtb3J5MjRfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkJICIvV3JpdGUiIDogIiBvbmx5Iik7CisJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KKwkJCW1lbW9yeTI0X2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8KKwkJCSIvV3JpdGUiIDogIiBvbmx5Iik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAotCQkJIG1lbW9yeTI0X2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOworCQltZW1vcnkyNF9kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtYXhpbXVtIGJhc2U6ICUwOFhcbiIsCi0JCQkgbWVtb3J5MjRfZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CisJCW1lbW9yeTI0X2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFsaWdubWVudDogJTA4WFxuIiwKLQkJCSBtZW1vcnkyNF9kYXRhLT5hbGlnbm1lbnQpOworCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIG1lbW9yeTI0X2RhdGEtPmFsaWdubWVudCk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLAotCQkJIG1lbW9yeTI0X2RhdGEtPnJhbmdlX2xlbmd0aCk7CisJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwgbWVtb3J5MjRfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KQEAgLTQxMCw3ICs0NTUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfbWVtb3J5MzIgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC00MjMsMjEgKzQ2OCwxOSBAQAogCWFjcGlfb3NfcHJpbnRmICgiMzItQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZVxuIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmVhZCVzXG4iLAotCQkJIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCSBtZW1vcnkzMl9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkgIi9Xcml0ZSIgOiAiIG9ubHkiKTsKKwkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQorCQkJbWVtb3J5MzJfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPworCQkJIi9Xcml0ZSIgOiAiIG9ubHkiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtaW5pbXVtIGJhc2U6ICUwOFhcbiIsCi0JCQkgbWVtb3J5MzJfZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CisJCW1lbW9yeTMyX2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1heGltdW0gYmFzZTogJTA4WFxuIiwKLQkJCSBtZW1vcnkzMl9kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKKwkJbWVtb3J5MzJfZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgQWxpZ25tZW50OiAlMDhYXG4iLAotCQkJIG1lbW9yeTMyX2RhdGEtPmFsaWdubWVudCk7CisJYWNwaV9vc19wcmludGYgKCIgIEFsaWdubWVudDogJTA4WFxuIiwgbWVtb3J5MzJfZGF0YS0+YWxpZ25tZW50KTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsCi0JCQkgbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLCBtZW1vcnkzMl9kYXRhLT5yYW5nZV9sZW5ndGgpOwogCiAJcmV0dXJuOwogfQpAQCAtNDU1LDExICs0OTgsMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICAgICAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAgICAqZml4ZWRfbWVtb3J5MzJfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAqKSBkYXRhOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyICAgICpmaXhlZF9tZW1vcnkzMl9kYXRhID0KKwkJCSAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAqKSBkYXRhOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwpAQCAtNDY4LDE1ICs1MTIsMTQgQEAKIAlhY3BpX29zX3ByaW50ZiAoIjMyLUJpdCBGaXhlZCBMb2NhdGlvbiBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJlYWQlc1xuIiwKLQkJCSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQkgZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkJICIvV3JpdGUiIDogIiBPbmx5Iik7CisJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KKwkJCWZpeGVkX21lbW9yeTMyX2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8gIi9Xcml0ZSIgOiAiIE9ubHkiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBiYXNlIGFkZHJlc3M6ICUwOFhcbiIsCi0JCQkgZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmFuZ2VfYmFzZV9hZGRyZXNzKTsKKwkJZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmFuZ2VfYmFzZV9hZGRyZXNzKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsCi0JCQkgZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwkJZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KQEAgLTQ5NCw3ICs1MzcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfYWRkcmVzczE2ICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtNTE0LDM1ICs1NTcsMzAgQEAKIAogCQlzd2l0Y2ggKGFkZHJlc3MxNl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSkgewogCQljYXNlIEFDUElfTk9OX0NBQ0hFQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9DQUNIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJDYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBDYWNoZWFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9XUklURV9DT01CSU5JTkdfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUFJFRkVUQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIlByZWZldGNoYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFByZWZldGNoYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7CiAJCQlicmVhazsKIAkJfQogCiAJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBSZWFkJXNcbiIsCiAJCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQlhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkiL1dyaXRlIiA6ICIgT25seSIpOworCQkJCWFkZHJlc3MxNl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID8KKwkJCQkiL1dyaXRlIiA6ICIgT25seSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9JT19SQU5HRToKQEAgLTU1MSwzMCArNTg5LDI2IEBACiAKIAkJc3dpdGNoIChhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSkgewogCQljYXNlIEFDUElfTk9OX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIk5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfRU5USVJFX1JBTkdFOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSW52YWxpZCByYW5nZSBhdHRyaWJ1dGVcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgcmFuZ2UgYXR0cmlidXRlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAogCQkJQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KLQkJCWFkZHJlc3MxNl9kYXRhLT5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID8KLQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CisJCQkJYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPworCQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6CkBAIC01ODksNDEgKzYyMyw0MiBAQAogCX0KIAogCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSAlc1xuIiwKLQkJCUFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczE2X2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KKwkJQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMTZfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwogCQkJIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVzIGRlY29kZVxuIiwKLQkJCSBBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczE2X2RhdGEtPmRlY29kZSA/Ci0JCQkgIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOworCQlBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczE2X2RhdGEtPmRlY29kZSA/CisJCQkiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgTWluIGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCQkgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MxNl9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/Ci0JCQkgIiIgOiAibm90Iik7CisJCUFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMTZfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPworCQkJIiIgOiAibm90Iik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgTWF4IGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCQkgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MxNl9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/Ci0JCQkgIiIgOiAibm90Iik7CisJCUFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMTZfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPworCQkJIiIgOiAibm90Iik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgR3JhbnVsYXJpdHk6ICUwOFhcbiIsCi0JCQkgYWRkcmVzczE2X2RhdGEtPmdyYW51bGFyaXR5KTsKKwkJYWRkcmVzczE2X2RhdGEtPmdyYW51bGFyaXR5KTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1pbjogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMTZfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpOworCQlhZGRyZXNzMTZfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWF4OiAlMDhYXG4iLAotCQkJIGFkZHJlc3MxNl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7CisJCWFkZHJlc3MxNl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQ6ICUwOFhcbiIsCi0JCQkgYWRkcmVzczE2X2RhdGEtPmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKKwkJYWRkcmVzczE2X2RhdGEtPmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIExlbmd0aDogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMTZfZGF0YS0+YWRkcmVzc19sZW5ndGgpOworCQlhZGRyZXNzMTZfZGF0YS0+YWRkcmVzc19sZW5ndGgpOwogCiAJaWYgKDB4RkYgIT0gYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCkgewogCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWFxuIiwKLQkJCQkgYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisJCQlhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwogCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCQkgYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKKwkJCWFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAJfQogCiAJcmV0dXJuOwpAQCAtNjQyLDcgKzY3Nyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9hZGRyZXNzMzIgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC02NjEsMzUgKzY5NiwzMCBAQAogCiAJCXN3aXRjaCAoYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fQ0FDSEVBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIk5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0NBQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1dSSVRFX0NPTUJJTklOR19NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9QUkVGRVRDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKIAkJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCWFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCSIvV3JpdGUiIDogIiBPbmx5Iik7CisJCQkJYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPworCQkJCSIvV3JpdGUiIDogIiBPbmx5Iik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0lPX1JBTkdFOgpAQCAtNjk4LDMwICs3MjgsMjYgQEAKIAogCQlzd2l0Y2ggKGFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9FTlRJUkVfUkFOR0U6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJbnZhbGlkIFJhbmdlIGF0dHJpYnV0ZSIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgUmFuZ2UgYXR0cmlidXRlIik7CiAJCQlicmVhazsKIAkJfQogCiAJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAlcyBUcmFuc2xhdGlvblxuIiwKIAkJCUFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09Ci0JCQlhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/Ci0JCQkiU3BhcnNlIiA6ICJEZW5zZSIpOworCQkJCWFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID8KKwkJCQkiU3BhcnNlIiA6ICJEZW5zZSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9CVVNfTlVNQkVSX1JBTkdFOgpAQCAtNzMxLDQ2ICs3NTcsNDggQEAKIAogCWRlZmF1bHQ6CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IDB4JTIuMlhcbiIsIGFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV90eXBlKTsKKwkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IDB4JTIuMlhcbiIsCisJCQlhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CiAJCWJyZWFrOwogCX0KIAogCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSAlc1xuIiwKLQkJCSBBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3MzMl9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/Ci0JCQkgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOworCQlBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3MzMl9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/CisJCQkiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJXMgZGVjb2RlXG4iLAotCQkJIEFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzMzJfZGF0YS0+ZGVjb2RlID8KLQkJCSAiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CisJCUFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzMzJfZGF0YS0+ZGVjb2RlID8KKwkJCSJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJCSBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczMyX2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KLQkJCSAiIiA6ICJub3QgIik7CisJCUFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMzJfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPworCQkJIiIgOiAibm90ICIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIE1heCBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQkJIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMzJfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPwotCQkJICIiIDogIm5vdCAiKTsKKwkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MzMl9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/CisJCQkiIiA6ICJub3QgIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgR3JhbnVsYXJpdHk6ICUwOFhcbiIsCi0JCQkgYWRkcmVzczMyX2RhdGEtPmdyYW51bGFyaXR5KTsKKwkJYWRkcmVzczMyX2RhdGEtPmdyYW51bGFyaXR5KTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1pbjogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMzJfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpOworCQlhZGRyZXNzMzJfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWF4OiAlMDhYXG4iLAotCQkJIGFkZHJlc3MzMl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7CisJCWFkZHJlc3MzMl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQ6ICUwOFhcbiIsCi0JCQkgYWRkcmVzczMyX2RhdGEtPmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKKwkJYWRkcmVzczMyX2RhdGEtPmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIExlbmd0aDogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMzJfZGF0YS0+YWRkcmVzc19sZW5ndGgpOworCQlhZGRyZXNzMzJfZGF0YS0+YWRkcmVzc19sZW5ndGgpOwogCiAJaWYoMHhGRiAhPSBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7CiAJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2UgSW5kZXg6ICVYXG4iLAotCQkJCSBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwkJCWFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCiAJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2U6ICVzXG4iLAotCQkJCSBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQkJYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAl9CiAKIAlyZXR1cm47CkBAIC03ODksNyArODE3LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2FkZHJlc3M2NCAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTgwOCwzNSArODM2LDMwIEBACiAKIAkJc3dpdGNoIChhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9DQUNIRUFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQ0FDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiQ2FjaGVhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogQ2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIldyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAogCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAogCQkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKKwkJCQlhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/CisJCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfSU9fUkFOR0U6CkBAIC04NDUsMzAgKzg2OCwyNiBAQAogCiAJCXN3aXRjaCAoYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJOb24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIklTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0VOVElSRV9SQU5HRToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIklTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkludmFsaWQgUmFuZ2UgYXR0cmlidXRlIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBSYW5nZSBhdHRyaWJ1dGUiKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAogCQkJQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KLQkJCWFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID8KLQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CisJCQkJYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPworCQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6CkBAIC04NzgsNDkgKzg5Nyw1MSBAQAogCiAJZGVmYXVsdDoKIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgVHlwZTogMHglMi4yWFxuIiwgYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3R5cGUpOworCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgVHlwZTogMHglMi4yWFxuIiwKKwkJCWFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV90eXBlKTsKIAkJYnJlYWs7CiAJfQogCiAJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlICVzXG4iLAotCQkJIEFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczY0X2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KLQkJCSAiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CisJCUFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczY0X2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KKwkJCSJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlcyBkZWNvZGVcbiIsCi0JCQkgQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3M2NF9kYXRhLT5kZWNvZGUgPwotCQkJICJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKKwkJQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3M2NF9kYXRhLT5kZWNvZGUgPworCQkJIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIE1pbiBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQkJIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzNjRfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPwotCQkJICIiIDogIm5vdCAiKTsKKwkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3M2NF9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/CisJCQkiIiA6ICJub3QgIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgTWF4IGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCQkgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3M2NF9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/Ci0JCQkgIiIgOiAibm90ICIpOworCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczY0X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KKwkJCSIiIDogIm5vdCAiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBHcmFudWxhcml0eTogJTguOFglOC44WFxuIiwKLQkJCSBBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5ncmFudWxhcml0eSkpOworCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5ncmFudWxhcml0eSkpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlOC44WCU4LjhYXG4iLAotCQkJIEFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKSk7CisJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyByYW5nZSBtYXg6ICU4LjhYJTguOFhcbiIsCi0JCQkgQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpKTsKKwkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldDogJTguOFglOC44WFxuIiwKLQkJCSBBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCkpOworCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCkpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgTGVuZ3RoOiAlOC44WCU4LjhYXG4iLAotCQkJIEFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPmFkZHJlc3NfbGVuZ3RoKSk7CisJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPmFkZHJlc3NfbGVuZ3RoKSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYyBBdHRyaWJ1dGVzOiAlOC44WCU4LjhYXG4iLAotCQkJIEFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPnR5cGVfc3BlY2lmaWNfYXR0cmlidXRlcykpOworCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT50eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMpKTsKIAogCWlmICgweEZGICE9IGFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKIAkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQkJIGFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCQkJYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisKIAkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCi0JCQkJIGFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCQlhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwogCX0KIAogCXJldHVybjsKQEAgLTkzOSw3ICs5NjAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfZXh0ZW5kZWRfaXJxICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtOTUzLDIzICs5NzQsMjIgQEAKIAlhY3BpX29zX3ByaW50ZiAoIkV4dGVuZGVkIElSUSBSZXNvdXJjZVxuIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgJXNcbiIsCi0JCQkgQUNQSV9DT05TVU1FUiA9PSBleHRfaXJxX2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KLQkJCSAiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CisJCUFDUElfQ09OU1VNRVIgPT0gZXh0X2lycV9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/CisJCQkiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJXNcbiIsCi0JCQkgQUNQSV9MRVZFTF9TRU5TSVRJVkUgPT0gZXh0X2lycV9kYXRhLT5lZGdlX2xldmVsID8KLQkJCSAiTGV2ZWwiIDogIkVkZ2UiKTsKKwkJQUNQSV9MRVZFTF9TRU5TSVRJVkUgPT0gZXh0X2lycV9kYXRhLT5lZGdlX2xldmVsID8KKwkJCSJMZXZlbCIgOiAiRWRnZSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFjdGl2ZSAlc1xuIiwKLQkJCSBBQ1BJX0FDVElWRV9MT1cgPT0gZXh0X2lycV9kYXRhLT5hY3RpdmVfaGlnaF9sb3cgPwotCQkJICJsb3ciIDogImhpZ2giKTsKKwkJQUNQSV9BQ1RJVkVfTE9XID09IGV4dF9pcnFfZGF0YS0+YWN0aXZlX2hpZ2hfbG93ID8KKwkJCSJsb3ciIDogImhpZ2giKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlc1xuIiwKLQkJCSBBQ1BJX1NIQVJFRCA9PSBleHRfaXJxX2RhdGEtPnNoYXJlZF9leGNsdXNpdmUgPwotCQkJICJTaGFyZWQiIDogIkV4Y2x1c2l2ZSIpOworCQlBQ1BJX1NIQVJFRCA9PSBleHRfaXJxX2RhdGEtPnNoYXJlZF9leGNsdXNpdmUgPworCQkJIlNoYXJlZCIgOiAiRXhjbHVzaXZlIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgSW50ZXJydXB0cyA6ICVYICggIiwKLQkJCSBleHRfaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgSW50ZXJydXB0cyA6ICVYICggIiwgZXh0X2lycV9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0cyk7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBleHRfaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpbmRleCsrKSB7CiAJCWFjcGlfb3NfcHJpbnRmICgiJVggIiwgZXh0X2lycV9kYXRhLT5pbnRlcnJ1cHRzW2luZGV4XSk7CkBAIC05NzksOSArOTk5LDEwIEBACiAKIAlpZigweEZGICE9IGV4dF9pcnFfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7CiAJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2UgSW5kZXg6ICVYIiwKLQkJCQkgZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCQkJZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCiAJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2U6ICVzIiwKLQkJCQkgZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCQlleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAl9CiAKIAlyZXR1cm47CkBAIC05OTIsNyArMTAxMyw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0CiAgKgotICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMTA5Niw3ICsxMTE3LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2lycV9saXN0CiAgKgotICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJvdXRpbmcgdGFibGUgdG8gZHVtcC4KKyAqIFBBUkFNRVRFUlM6ICByb3V0ZV90YWJsZSAgICAgLSBwb2ludGVyIHRvIHRoZSByb3V0aW5nIHRhYmxlIHRvIGR1bXAuCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC0xMTI0LDIwICsxMTQ1LDE3IEBACiAJCQlhY3BpX29zX3ByaW50ZiAoIlBDSSBJUlEgUm91dGluZyBUYWJsZSBzdHJ1Y3R1cmUgJVguXG4iLCBjb3VudCsrKTsKIAogCQkJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3M6ICU4LjhYJTguOFhcbiIsCi0JCQkJCSBBQ1BJX0ZPUk1BVF9VSU5UNjQgKHBydF9lbGVtZW50LT5hZGRyZXNzKSk7CisJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChwcnRfZWxlbWVudC0+YWRkcmVzcykpOwogCiAJCQlhY3BpX29zX3ByaW50ZiAoIiAgUGluOiAlWFxuIiwgcHJ0X2VsZW1lbnQtPnBpbik7CiAKIAkJCWFjcGlfb3NfcHJpbnRmICgiICBTb3VyY2U6ICVzXG4iLCBwcnRfZWxlbWVudC0+c291cmNlKTsKIAotCQkJYWNwaV9vc19wcmludGYgKCIgIHNvdXJjZV9pbmRleDogJVhcbiIsCi0JCQkJCSBwcnRfZWxlbWVudC0+c291cmNlX2luZGV4KTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBzb3VyY2VfaW5kZXg6ICVYXG4iLCBwcnRfZWxlbWVudC0+c291cmNlX2luZGV4KTsKIAogCQkJYnVmZmVyICs9IHBydF9lbGVtZW50LT5sZW5ndGg7Ci0KIAkJCXBydF9lbGVtZW50ID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsIGJ1ZmZlcik7Ci0KLQkJCWlmKDAgPT0gcHJ0X2VsZW1lbnQtPmxlbmd0aCkgeworCQkJaWYgKDAgPT0gcHJ0X2VsZW1lbnQtPmxlbmd0aCkgewogCQkJCWRvbmUgPSBUUlVFOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW8uYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jCmluZGV4IDk3MmM3NDYuLjIzYTRkMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jCkBAIC04MSw2NyArODEsNjAgQEAKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7CiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2lvX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQKLQkgKi8KKwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudCAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gODsKIAogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfSU87CiAKLQkvKgotCSAqIENoZWNrIERlY29kZQotCSAqLworCS8qIENoZWNrIERlY29kZSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5pb19kZWNvZGUgPSB0ZW1wOCAmIDB4MDE7CiAKLQkvKgotCSAqIENoZWNrIG1pbl9iYXNlIEFkZHJlc3MKLQkgKi8KKwkvKiBDaGVjayBtaW5fYmFzZSBBZGRyZXNzICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmlvLm1pbl9iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7CiAKLQkvKgotCSAqIENoZWNrIG1heF9iYXNlIEFkZHJlc3MKLQkgKi8KKwkvKiBDaGVjayBtYXhfYmFzZSBBZGRyZXNzICovCisKIAlidWZmZXIgKz0gMjsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmlvLm1heF9iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7CiAKLQkvKgotCSAqIENoZWNrIEJhc2UgYWxpZ25tZW50Ci0JICovCisJLyogQ2hlY2sgQmFzZSBhbGlnbm1lbnQgKi8KKwogCWJ1ZmZlciArPSAyOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaW8uYWxpZ25tZW50ID0gdGVtcDg7CiAKLQkvKgotCSAqIENoZWNrIHJhbmdlX2xlbmd0aAotCSAqLworCS8qIENoZWNrIHJhbmdlX2xlbmd0aCAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5yYW5nZV9sZW5ndGggPSB0ZW1wODsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0xNzksNDMgKzE3MiwzOSBAQAogCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyk7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8pOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZml4ZWRfaW9fcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudAotCSAqLworCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIENvbnN0YW50ICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSA0OwogCiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9GSVhFRF9JTzsKIAotCS8qCi0JICogQ2hlY2sgUmFuZ2UgQmFzZSBBZGRyZXNzCi0JICovCisJLyogQ2hlY2sgUmFuZ2UgQmFzZSBBZGRyZXNzICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX2lvLmJhc2VfYWRkcmVzcyA9IHRlbXAxNjsKIAotCS8qCi0JICogQ2hlY2sgcmFuZ2VfbGVuZ3RoCi0JICovCisJLyogQ2hlY2sgcmFuZ2VfbGVuZ3RoICovCisKIAlidWZmZXIgKz0gMjsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX2lvLnJhbmdlX2xlbmd0aCA9IHRlbXA4OwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTI1MSw1NSArMjQwLDQ4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2lvX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4NDc7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIElvIEluZm9ybWF0aW9uIEJ5dGUKLQkgKi8KKwkvKiBJbyBJbmZvcm1hdGlvbiBCeXRlICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmlvLmlvX2RlY29kZSAmIDB4MDEpOwogCiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJhbmdlIG1pbmltdW0gYmFzZSBhZGRyZXNzCi0JICovCisJLyogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcyAqLworCiAJdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuaW8ubWluX2Jhc2VfYWRkcmVzczsKIAogCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcwotCSAqLworCS8qIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MgKi8KKwogCXRlbXAxNiA9ICh1MTYpIGxpbmtlZF9saXN0LT5kYXRhLmlvLm1heF9iYXNlX2FkZHJlc3M7CiAKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQKLQkgKi8KKwkvKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50ICovCisKIAl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuaW8uYWxpZ25tZW50OwogCiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIHJhbmdlIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCisKIAl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuaW8ucmFuZ2VfbGVuZ3RoOwogCiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTMzNSwzMiArMzE3LDI4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2ZpeGVkX2lvX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4NEI7CiAKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBSYW5nZSBiYXNlIGFkZHJlc3MKLQkgKi8KKwkvKiBTZXQgdGhlIFJhbmdlIGJhc2UgYWRkcmVzcyAqLworCiAJdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfaW8uYmFzZV9hZGRyZXNzOwogCiAJQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIHJhbmdlIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCisKIAl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfaW8ucmFuZ2VfbGVuZ3RoOwogCiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTM5OSwyMSArMzc3LDIwIEBACiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEpOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSk7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19kbWFfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudAotCSAqLworCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIENvbnN0YW50ICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSAzOwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfRE1BOwogCi0JLyoKLQkgKiBQb2ludCB0byB0aGUgOC1iaXRzIG9mIEJ5dGUgMQotCSAqLworCS8qIFBvaW50IHRvIHRoZSA4LWJpdHMgb2YgQnl0ZSAxICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTQzMCw0NiArNDA3LDQwIEBACiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS5udW1iZXJfb2ZfY2hhbm5lbHMgPSBpOwogCWlmIChpID4gMCkgewotCQkvKgotCQkgKiBDYWxjdWxhdGUgdGhlIHN0cnVjdHVyZSBzaXplIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzCi0JCSAqLworCQkvKiBDYWxjdWxhdGUgdGhlIHN0cnVjdHVyZSBzaXplIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisKIAkJc3RydWN0X3NpemUgKz0gKChhY3BpX3NpemUpIGkgLSAxKSAqIDQ7CiAJfQogCi0JLyoKLQkgKiBQb2ludCB0byBCeXRlIDIKLQkgKi8KKwkvKiBQb2ludCB0byBCeXRlIDIgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAotCS8qCi0JICogQ2hlY2sgZm9yIHRyYW5zZmVyIHByZWZlcmVuY2UgKEJpdHNbMTowXSkKLQkgKi8KKwkvKiBDaGVjayBmb3IgdHJhbnNmZXIgcHJlZmVyZW5jZSAoQml0c1sxOjBdKSAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEudHJhbnNmZXIgPSB0ZW1wOCAmIDB4MDM7CiAKIAlpZiAoMHgwMyA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS50cmFuc2ZlcikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgRE1BLlRyYW5zZmVyIHByZWZlcmVuY2UgKDMpXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIkludmFsaWQgRE1BLlRyYW5zZmVyIHByZWZlcmVuY2UgKDMpXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0RBVEEpOwogCX0KIAotCS8qCi0JICogR2V0IGJ1cyBtYXN0ZXIgcHJlZmVyZW5jZSAoQml0WzJdKQotCSAqLworCS8qIEdldCBidXMgbWFzdGVyIHByZWZlcmVuY2UgKEJpdFsyXSkgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZG1hLmJ1c19tYXN0ZXIgPSAodGVtcDggPj4gMikgJiAweDAxOwogCi0JLyoKLQkgKiBHZXQgY2hhbm5lbCBzcGVlZCBzdXBwb3J0IChCaXRzWzY6NV0pCi0JICovCisJLyogR2V0IGNoYW5uZWwgc3BlZWQgc3VwcG9ydCAoQml0c1s2OjVdKSAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEudHlwZSA9ICh0ZW1wOCA+PiA1KSAmIDB4MDM7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNTA2LDE2ICs0NzcsMTQgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZG1hX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4MkE7CiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAwOwogCi0JLyoKLQkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBDaGFubmVscyBhbmQgc2V0IHRoZSBtYXNrIGJpdHMKLQkgKi8KKwkvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBDaGFubmVscyBhbmQgc2V0IHRoZSBtYXNrIGJpdHMgKi8KKwogCWZvciAoaW5kZXggPSAwOwogCQkgaW5kZXggPCBsaW5rZWRfbGlzdC0+ZGF0YS5kbWEubnVtYmVyX29mX2NoYW5uZWxzOwogCQkgaW5kZXgrKykgewpAQCAtNTI2LDkgKzQ5NSw4IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIERNQSBJbmZvCi0JICovCisJLyogU2V0IHRoZSBETUEgSW5mbyAqLworCiAJdGVtcDggPSAodTgpICgobGlua2VkX2xpc3QtPmRhdGEuZG1hLnR5cGUgJiAweDAzKSA8PCA1KTsKIAl0ZW1wOCB8PSAoKGxpbmtlZF9saXN0LT5kYXRhLmRtYS5idXNfbWFzdGVyICYgMHgwMSkgPDwgMik7CiAJdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmRtYS50cmFuc2ZlciAmIDB4MDMpOwpAQCAtNTM2LDkgKzUwNCw4IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYwppbmRleCBmZDA3YTg3Li44YTJiNjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jCkBAIC04Myw3ICs4Myw4IEBACiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEpOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSk7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19pcnFfcmVzb3VyY2UiKTsKQEAgLTkxLDE1ICs5MiwxNCBAQAogCiAJLyoKIAkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBjb250YWluZWQgaW4gdGhlIGRlc2NyaXB0b3IKLQkgKiAgKEJpdHM6MC0xKQorCSAqIChCaXRzOjAtMSkKIAkgKi8KIAl0ZW1wOCA9ICpidWZmZXI7CiAJKmJ5dGVzX2NvbnN1bWVkID0gKHRlbXA4ICYgMHgwMykgKyAxOwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfSVJROwogCi0JLyoKLQkgKiBQb2ludCB0byB0aGUgMTYtYml0cyBvZiBCeXRlcyAxIGFuZCAyCi0JICovCisJLyogUG9pbnQgdG8gdGhlIDE2LWJpdHMgb2YgQnl0ZXMgMSBhbmQgMiAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCkBAIC0xMTgsMjIgKzExOCwxOSBAQAogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEubnVtYmVyX29mX2ludGVycnVwdHMgPSBpOwogCWlmIChpID4gMCkgewotCQkvKgotCQkgKiBDYWxjdWxhdGUgdGhlIHN0cnVjdHVyZSBzaXplIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzCi0JCSAqLworCQkvKiBDYWxjdWxhdGUgdGhlIHN0cnVjdHVyZSBzaXplIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisKIAkJc3RydWN0X3NpemUgKz0gKChhY3BpX3NpemUpIGkgLSAxKSAqIDQ7CiAJfQogCi0JLyoKLQkgKiBQb2ludCB0byBCeXRlIDMgaWYgaXQgaXMgdXNlZAotCSAqLworCS8qIFBvaW50IHRvIEJ5dGUgMyBpZiBpdCBpcyB1c2VkICovCisKIAlpZiAoNCA9PSAqYnl0ZXNfY29uc3VtZWQpIHsKIAkJYnVmZmVyICs9IDI7CiAJCXRlbXA4ID0gKmJ1ZmZlcjsKIAotCQkvKgotCQkgKiBDaGVjayBmb3IgSEUsIExMIGludGVycnVwdHMKLQkJICovCisJCS8qIENoZWNrIGZvciBIRSwgTEwgaW50ZXJydXB0cyAqLworCiAJCXN3aXRjaCAodGVtcDggJiAweDA5KSB7CiAJCWNhc2UgMHgwMTogLyogSEUgKi8KIAkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwgPSBBQ1BJX0VER0VfU0VOU0lUSVZFOwpAQCAtMTUyLDEzICsxNDksMTMgQEAKIAkJCSAqIHNvIDB4MDAgYW5kIDB4MDkgYXJlIGlsbGVnYWwuCiAJCQkgKi8KIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJJbnZhbGlkIGludGVycnVwdCBwb2xhcml0eS90cmlnZ2VyIGluIHJlc291cmNlIGxpc3QsICVYXG4iLCB0ZW1wOCkpOworCQkJCSJJbnZhbGlkIGludGVycnVwdCBwb2xhcml0eS90cmlnZ2VyIGluIHJlc291cmNlIGxpc3QsICVYXG4iLAorCQkJCXRlbXA4KSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKIAkJfQogCi0JCS8qCi0JCSAqIENoZWNrIGZvciBzaGFyYWJsZQotCQkgKi8KKwkJLyogQ2hlY2sgZm9yIHNoYXJhYmxlICovCisKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9ICh0ZW1wOCA+PiAzKSAmIDB4MDE7CiAJfQogCWVsc2UgewpAQCAtMTcxLDE0ICsxNjgsMTIgQEAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9IEFDUElfRVhDTFVTSVZFOwogCX0KIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0yMzQsOSArMjI5LDggQEAKIAlidWZmZXIgKz0gMTsKIAl0ZW1wMTYgPSAwOwogCi0JLyoKLQkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBpbnRlcnJ1cHRzIGFuZCBzZXQgdGhlIG1hc2sgYml0cwotCSAqLworCS8qIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIGludGVycnVwdHMgYW5kIHNldCB0aGUgbWFzayBiaXRzICovCisKIAlmb3IoaW5kZXggPSAwOwogCQlpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLmlycS5udW1iZXJfb2ZfaW50ZXJydXB0czsKIAkJaW5kZXgrKykgewpAQCAtMjQ3LDkgKzI0MSw4IEBACiAJQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIElSUSBJbmZvIGJ5dGUgaWYgbmVlZGVkLgotCSAqLworCS8qIFNldCB0aGUgSVJRIEluZm8gYnl0ZSBpZiBuZWVkZWQuICovCisKIAlpZiAoSVJxaW5mb19ieXRlX25lZWRlZCkgewogCQl0ZW1wOCA9IDA7CiAJCXRlbXA4ID0gKHU4KSAoKGxpbmtlZF9saXN0LT5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlICYKQEAgLTI2Nyw5ICsyNjAsOCBAQAogCQlidWZmZXIgKz0gMTsKIAl9CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMzA5LDE1ICszMDEsMTUgQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3B0cjsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSk7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSk7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19leHRlbmRlZF9pcnFfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICovCisJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCkBAIC0zMzAsOSArMzIyLDggQEAKIAkqYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfRVhUX0lSUTsKIAotCS8qCi0JICogUG9pbnQgdG8gdGhlIEJ5dGUzCi0JICovCisJLyogUG9pbnQgdG8gdGhlIEJ5dGUzICovCisKIAlidWZmZXIgKz0gMjsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTM0NywyMSArMzM4LDE4IEBACiAJICogLSBFZGdlL0xldmVsIGFyZSBkZWZpbmVkIG9wcG9zaXRlIGluIHRoZSB0YWJsZSB2cyB0aGUgaGVhZGVycwogCSAqLwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLmVkZ2VfbGV2ZWwgPQotCQkJICAgKHRlbXA4ICYgMHgyKSA/IEFDUElfRURHRV9TRU5TSVRJVkUgOiBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKKwkJKHRlbXA4ICYgMHgyKSA/IEFDUElfRURHRV9TRU5TSVRJVkUgOiBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKIAotCS8qCi0JICogQ2hlY2sgSW50ZXJydXB0IFBvbGFyaXR5Ci0JICovCisJLyogQ2hlY2sgSW50ZXJydXB0IFBvbGFyaXR5ICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5hY3RpdmVfaGlnaF9sb3cgPSAodGVtcDggPj4gMikgJiAweDE7CiAKLQkvKgotCSAqIENoZWNrIGZvciBzaGFyYWJsZQotCSAqLworCS8qIENoZWNrIGZvciBzaGFyYWJsZSAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9ICh0ZW1wOCA+PiAzKSAmIDB4MDE7CiAKLQkvKgotCSAqIFBvaW50IHRvIEJ5dGU0IChJUlEgVGFibGUgbGVuZ3RoKQotCSAqLworCS8qIFBvaW50IHRvIEJ5dGU0IChJUlEgVGFibGUgbGVuZ3RoKSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC0zNzksMTQgKzM2NywxMiBAQAogCSAqLwogCXN0cnVjdF9zaXplICs9ICh0ZW1wOCAtIDEpICogNDsKIAotCS8qCi0JICogUG9pbnQgdG8gQnl0ZTUgKEZpcnN0IElSUSBOdW1iZXIpCi0JICovCisJLyogUG9pbnQgdG8gQnl0ZTUgKEZpcnN0IElSUSBOdW1iZXIpICovCisKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogQ3ljbGUgdGhyb3VnaCBldmVyeSBJUlEgaW4gdGhlIHRhYmxlCi0JICovCisJLyogQ3ljbGUgdGhyb3VnaCBldmVyeSBJUlEgaW4gdGhlIHRhYmxlICovCisKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0ZW1wODsgaW5kZXgrKykgewogCQlBQ1BJX01PVkVfMzJfVE9fMzIgKAogCQkJJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbaW5kZXhdLCBidWZmZXIpOwpAQCAtNDA3LDcgKzM5Myw4IEBACiAJICogd2UgYWRkIDEgdG8gdGhlIGxlbmd0aC4KIAkgKi8KIAlpZiAoKmJ5dGVzX2NvbnN1bWVkID4KLQkJKChhY3BpX3NpemUpIG91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzICogNCkgKyAoNSArIDEpKSB7CisJCSgoYWNwaV9zaXplKSBvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyAqIDQpICsKKwkJKDUgKyAxKSkgewogCQkvKiBEZXJlZmVyZW5jZSB0aGUgSW5kZXggKi8KIAogCQl0ZW1wOCA9ICpidWZmZXI7CkBAIC00MTcsMTMgKzQwNCwxMyBAQAogCiAJCWJ1ZmZlciArPSAxOwogCi0JCS8qCi0JCSAqIFBvaW50IHRoZSBTdHJpbmcgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlLgotCQkgKi8KKwkJLyogUG9pbnQgdGhlIFN0cmluZyBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBzdHJ1Y3R1cmUuICovCisKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQogCQkJCShjaGFyICopKChjaGFyICopIG91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CiAKLQkJdGVtcF9wdHIgPSAodTggKikgb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CisJCXRlbXBfcHRyID0gKHU4ICopCisJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKIAogCQkvKiBDb3B5IHRoZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyICovCiAKQEAgLTQzNiw5ICs0MjMsOCBAQAogCQkJaW5kZXggKz0gMTsKIAkJfQogCi0JCS8qCi0JCSAqIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbAotCQkgKi8KKwkJLyogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsICovCisKIAkJKnRlbXBfcHRyID0gMHgwMDsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSBpbmRleCArIDE7CiAKQEAgLTQ1NiwxNCArNDQyLDEyIEBACiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0gTlVMTDsKIAl9CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNTAxLDIxICs0ODUsMTggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZXh0ZW5kZWRfaXJxX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4ODk7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlcgotCSAqLworCS8qIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLworCiAJbGVuZ3RoX2ZpZWxkID0gQUNQSV9DQVNUX1BUUiAodTE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIEludGVycnVwdCB2ZWN0b3IgZmxhZ3MKLQkgKi8KKwkvKiBTZXQgdGhlIEludGVycnVwdCB2ZWN0b3IgZmxhZ3MgKi8KKwogCXRlbXA4ID0gKHU4KShsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucHJvZHVjZXJfY29uc3VtZXIgJiAweDAxKTsKIAl0ZW1wOCB8PSAoKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5zaGFyZWRfZXhjbHVzaXZlICYgMHgwMSkgPDwgMyk7CiAKQEAgLTUzMiwxNyArNTEzLDE1IEBACiAJCXRlbXA4IHw9IDB4MjsKIAl9CiAKLQkvKgotCSAqIFNldCB0aGUgSW50ZXJydXB0IFBvbGFyaXR5Ci0JICovCisJLyogU2V0IHRoZSBJbnRlcnJ1cHQgUG9sYXJpdHkgKi8KKwogCXRlbXA4IHw9ICgobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLmFjdGl2ZV9oaWdoX2xvdyAmIDB4MSkgPDwgMik7CiAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgSW50ZXJydXB0IHRhYmxlIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgSW50ZXJydXB0IHRhYmxlIGxlbmd0aCAqLworCiAJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0czsKIAogCSpidWZmZXIgPSB0ZW1wODsKQEAgLTU1NSwxOCArNTM0LDE2IEBACiAJCWJ1ZmZlciArPSA0OwogCX0KIAotCS8qCi0JICogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsCi0JICovCisJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCisKIAlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKIAkJKmJ1ZmZlciA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5pbmRleDsKIAkJYnVmZmVyICs9IDE7CiAKIAkJdGVtcF9wb2ludGVyID0gKGNoYXIgKikgYnVmZmVyOwogCi0JCS8qCi0JCSAqIENvcHkgdGhlIHN0cmluZwotCQkgKi8KKwkJLyogQ29weSB0aGUgc3RyaW5nICovCisKIAkJQUNQSV9TVFJDUFkgKHRlbXBfcG9pbnRlciwKIAkJCWxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAKQEAgLTU3NCwxMiArNTUxLDEyIEBACiAJCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RpbmcgKyBvbmUgZm9yIHRoZQogCQkgKiB0ZXJtaW5hdGluZyBudWxsCiAJCSAqLwotCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKKwkJYnVmZmVyICs9IChhY3BpX3NpemUpIChBQ1BJX1NUUkxFTiAoCisJCQlsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CiAJfQogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYwppbmRleCBlNDljMWUwLi5kYjdiY2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKQEAgLTU1LDcgKzU1LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgcmVzb3VyY2Vfc3RhcnRfYnl0ZSAgICAgLSBCeXRlIDAgb2YgYSByZXNvdXJjZSBkZXNjcmlwdG9yCiAgKgotICogUkVUVVJOOiAgICAgIFRoZSBSZXNvdXJjZSBUeXBlIChOYW1lKSB3aXRoIG5vIGV4dHJhbmVvdXMgYml0cworICogUkVUVVJOOiAgICAgIFRoZSBSZXNvdXJjZSBUeXBlIHdpdGggbm8gZXh0cmFuZW91cyBiaXRzCiAgKgogICogREVTQ1JJUFRJT046IEV4dHJhY3QgdGhlIFJlc291cmNlIFR5cGUvTmFtZSBmcm9tIHRoZSBmaXJzdCBieXRlIG9mCiAgKiAgICAgICAgICAgICAgYSByZXNvdXJjZSBkZXNjcmlwdG9yLgpAQCAtNzAsMjggKzcwLDI1IEBACiAJQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKIAogCi0JLyoKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHNtYWxsIG9yIGxhcmdlIHJlc291cmNlCi0JICovCisJLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBzbWFsbCBvciBsYXJnZSByZXNvdXJjZSAqLworCiAJc3dpdGNoIChyZXNvdXJjZV9zdGFydF9ieXRlICYgQUNQSV9SREVTQ19UWVBFX01BU0spIHsKIAljYXNlIEFDUElfUkRFU0NfVFlQRV9TTUFMTDoKIAotCQkvKgotCQkgKiBTbWFsbCBSZXNvdXJjZSBUeXBlIC0tIE9ubHkgYml0cyA2OjMgYXJlIHZhbGlkCi0JCSAqLworCQkvKiBTbWFsbCBSZXNvdXJjZSBUeXBlIC0tIE9ubHkgYml0cyA2OjMgYXJlIHZhbGlkICovCisKIAkJcmV0dXJuICgodTgpIChyZXNvdXJjZV9zdGFydF9ieXRlICYgQUNQSV9SREVTQ19TTUFMTF9NQVNLKSk7CiAKIAogCWNhc2UgQUNQSV9SREVTQ19UWVBFX0xBUkdFOgogCi0JCS8qCi0JCSAqIExhcmdlIFJlc291cmNlIFR5cGUgLS0gQWxsIGJpdHMgYXJlIHZhbGlkCi0JCSAqLworCQkvKiBMYXJnZSBSZXNvdXJjZSBUeXBlIC0tIEFsbCBiaXRzIGFyZSB2YWxpZCAqLworCiAJCXJldHVybiAocmVzb3VyY2Vfc3RhcnRfYnl0ZSk7CiAKIAogCWRlZmF1bHQ6Ci0JCS8qIE5vIG90aGVyIHR5cGVzIG9mIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKwkJLyogSW52YWxpZCB0eXBlICovCiAJCWJyZWFrOwogCX0KIApAQCAtMTM1LDkgKzEzMiw4IEBACiAKIAl3aGlsZSAoYnl0ZXNfcGFyc2VkIDwgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCAmJgogCQkJIWVuZF90YWdfcHJvY2Vzc2VkKSB7Ci0JCS8qCi0JCSAqIFRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbSBpcyB0aGUgcmVzb3VyY2UgdHlwZQotCQkgKi8KKwkJLyogVGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtIGlzIHRoZSByZXNvdXJjZSB0eXBlICovCisKIAkJcmVzb3VyY2VfdHlwZSA9IGFjcGlfcnNfZ2V0X3Jlc291cmNlX3R5cGUgKCpieXRlX3N0cmVhbV9idWZmZXIpOwogCiAJCXN3aXRjaCAocmVzb3VyY2VfdHlwZSkgewpAQCAtMjk5LDI4ICsyOTUsMjMgQEAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQogCi0JCS8qCi0JCSAqIFVwZGF0ZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBjb3VudGVyCi0JCSAqLworCQkvKiBVcGRhdGUgdGhlIHJldHVybiB2YWx1ZSBhbmQgY291bnRlciAqLworCiAJCWJ5dGVzX3BhcnNlZCArPSBieXRlc19jb25zdW1lZDsKIAotCQkvKgotCQkgKiBTZXQgdGhlIGJ5dGUgc3RyZWFtIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlCi0JCSAqLworCQkvKiBTZXQgdGhlIGJ5dGUgc3RyZWFtIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlICovCisKIAkJYnl0ZV9zdHJlYW1fYnVmZmVyICs9IGJ5dGVzX2NvbnN1bWVkOwogCi0JCS8qCi0JCSAqIFNldCB0aGUgQnVmZmVyIHRvIHRoZSBuZXh0IHN0cnVjdHVyZQotCQkgKi8KKwkJLyogU2V0IHRoZSBCdWZmZXIgdG8gdGhlIG5leHQgc3RydWN0dXJlICovCisKIAkJcmVzb3VyY2UgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgYnVmZmVyKTsKIAkJcmVzb3VyY2UtPmxlbmd0aCA9ICh1MzIpIEFDUElfQUxJR05fUkVTT1VSQ0VfU0laRSAocmVzb3VyY2UtPmxlbmd0aCk7CiAJCWJ1ZmZlciArPSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUgKHN0cnVjdHVyZV9zaXplKTsKKwl9CiAKLQl9IC8qICBlbmQgd2hpbGUgKi8KKwkvKiBDaGVjayB0aGUgcmVhc29uIGZvciBleGl0aW5nIHRoZSB3aGlsZSBsb29wICovCiAKLQkvKgotCSAqIENoZWNrIHRoZSByZWFzb24gZm9yIGV4aXRpbmcgdGhlIHdoaWxlIGxvb3AKLQkgKi8KIAlpZiAoIWVuZF90YWdfcHJvY2Vzc2VkKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOwogCX0KQEAgLTQyNCw5ICs0MTUsOCBAQAogCQkJICovCiAJCQlzdGF0dXMgPSBhY3BpX3JzX2VuZF90YWdfc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwgJmJ5dGVzX2NvbnN1bWVkKTsKIAotCQkJLyoKLQkJCSAqIEFuIEVuZCBUYWcgaW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlIFJlc291cmNlIFRlbXBsYXRlCi0JCQkgKi8KKwkJCS8qIEFuIEVuZCBUYWcgaW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlIFJlc291cmNlIFRlbXBsYXRlICovCisKIAkJCWRvbmUgPSBUUlVFOwogCQkJYnJlYWs7CiAKQEAgLTQ4OCwyNyArNDc4LDI1IEBACiAJCWRlZmF1bHQ6CiAJCQkvKgogCQkJICogSWYgd2UgZ2V0IGhlcmUsIGV2ZXJ5dGhpbmcgaXMgb3V0IG9mIHN5bmMsCi0JCQkgKiAgc28gZXhpdCB3aXRoIGFuIGVycm9yCisJCQkgKiBzbyBleGl0IHdpdGggYW4gZXJyb3IKIAkJCSAqLwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSAoJVgpIGluIHJlc291cmNlIGxpc3RcbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgKCVYKSBpbiByZXNvdXJjZSBsaXN0XG4iLAogCQkJCWxpbmtlZF9saXN0LT5pZCkpOwogCQkJc3RhdHVzID0gQUVfQkFEX0RBVEE7CiAJCQlicmVhazsKLQotCQl9IC8qIHN3aXRjaCAobGlua2VkX2xpc3QtPklkKSAqLworCQl9CiAKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CiAKLQkJLyoKLQkJICogU2V0IHRoZSBCdWZmZXIgdG8gcG9pbnQgdG8gdGhlIG9wZW4gYnl0ZQotCQkgKi8KKwkJLyogU2V0IHRoZSBCdWZmZXIgdG8gcG9pbnQgdG8gdGhlIG9wZW4gYnl0ZSAqLworCiAJCWJ1ZmZlciArPSBieXRlc19jb25zdW1lZDsKIAotCQkvKgotCQkgKiBQb2ludCB0byB0aGUgbmV4dCBvYmplY3QKLQkJICovCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IG9iamVjdCAqLworCiAJCWxpbmtlZF9saXN0ID0gQUNQSV9QVFJfQUREIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwKIAkJCQkgIGxpbmtlZF9saXN0LCBsaW5rZWRfbGlzdC0+bGVuZ3RoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMKaW5kZXggN2M5MzVhZS4uOTFkMDIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYwpAQCAtODEsMTUgKzgxLDE1IEBACiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0KTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCk7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19tZW1vcnkyNF9yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKLQkgKi8KKwkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisKIAlidWZmZXIgKz0gMTsKIAogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKQEAgLTk3LDQ4ICs5Nyw0MSBAQAogCSpieXRlc19jb25zdW1lZCA9IChhY3BpX3NpemUpIHRlbXAxNiArIDM7CiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9NRU0yNDsKIAotCS8qCi0JICogQ2hlY2sgQnl0ZSAzIHRoZSBSZWFkL1dyaXRlIGJpdAotCSAqLworCS8qIENoZWNrIEJ5dGUgMyB0aGUgUmVhZC9Xcml0ZSBiaXQgKi8KKwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAlidWZmZXIgKz0gMTsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0LnJlYWRfd3JpdGVfYXR0cmlidXRlID0gdGVtcDggJiAweDAxOwogCi0JLyoKLQkgKiBHZXQgbWluX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC01KQotCSAqLworCS8qIEdldCBtaW5fYmFzZV9hZGRyZXNzIChCeXRlcyA0LTUpICovCisKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5taW5fYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCi0JLyoKLQkgKiBHZXQgbWF4X2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNi03KQotCSAqLworCS8qIEdldCBtYXhfYmFzZV9hZGRyZXNzIChCeXRlcyA2LTcpICovCisKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5tYXhfYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCi0JLyoKLQkgKiBHZXQgQWxpZ25tZW50IChCeXRlcyA4LTkpCi0JICovCisJLyogR2V0IEFsaWdubWVudCAoQnl0ZXMgOC05KSAqLworCiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MjQuYWxpZ25tZW50ID0gdGVtcDE2OwogCi0JLyoKLQkgKiBHZXQgcmFuZ2VfbGVuZ3RoIChCeXRlcyAxMC0xMSkKLQkgKi8KKwkvKiBHZXQgcmFuZ2VfbGVuZ3RoIChCeXRlcyAxMC0xMSkgKi8KKwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0LnJhbmdlX2xlbmd0aCA9IHRlbXAxNjsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0xNzQsNTMgKzE2Nyw0NSBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19tZW1vcnkyNF9zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDgxOwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBsZW5ndGggZmllbGQgaXMgc3RhdGljICovCisKIAl0ZW1wMTYgPSAweDA5OwogCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlCi0JICovCisJLyogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LnJlYWRfd3JpdGVfYXR0cmlidXRlICYgMHgwMSk7CiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJhbmdlIG1pbmltdW0gYmFzZSBhZGRyZXNzCi0JICovCisJLyogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcyAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5taW5fYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcwotCSAqLworCS8qIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MgKi8KKwogCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQubWF4X2Jhc2VfYWRkcmVzcyk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQKLQkgKi8KKwkvKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50ICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LmFsaWdubWVudCk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgcmFuZ2UgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSByYW5nZSBsZW5ndGggKi8KKwogCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQucmFuZ2VfbGVuZ3RoKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0yNTgsMTUgKzI0MywxNSBAQAogCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMik7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfbWVtb3J5MzJfcmFuZ2VfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICovCisJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCiAJYnVmZmVyICs9IDE7CiAKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CkBAIC0yODUsNDUgKzI3MCwzOCBAQAogCSAqICA0ICogc2l6ZW9mKFJFU09VUkNFX0RBVEEpIGluc3RlYWQgb2YgNCAqIHNpemVvZih1OCkKIAkgKi8KIAotCS8qCi0JICogQ2hlY2sgQnl0ZSAzIHRoZSBSZWFkL1dyaXRlIGJpdAotCSAqLworCS8qIENoZWNrIEJ5dGUgMyB0aGUgUmVhZC9Xcml0ZSBiaXQgKi8KKwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAlidWZmZXIgKz0gMTsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIucmVhZF93cml0ZV9hdHRyaWJ1dGUgPSB0ZW1wOCAmIDB4MDE7CiAKLQkvKgotCSAqIEdldCBtaW5fYmFzZV9hZGRyZXNzIChCeXRlcyA0LTcpCi0JICovCisJLyogR2V0IG1pbl9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNykgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIubWluX2Jhc2VfYWRkcmVzcywgYnVmZmVyKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogR2V0IG1heF9iYXNlX2FkZHJlc3MgKEJ5dGVzIDgtMTEpCi0JICovCisJLyogR2V0IG1heF9iYXNlX2FkZHJlc3MgKEJ5dGVzIDgtMTEpICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLm1heF9iYXNlX2FkZHJlc3MsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIEdldCBBbGlnbm1lbnQgKEJ5dGVzIDEyLTE1KQotCSAqLworCS8qIEdldCBBbGlnbm1lbnQgKEJ5dGVzIDEyLTE1KSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5hbGlnbm1lbnQsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDE2LTE5KQotCSAqLworCS8qIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDE2LTE5KSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5yYW5nZV9sZW5ndGgsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMzYxLDE1ICszMzksMTUgQEAKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7CiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIpOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqLworCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIApAQCAtMzc4LDMyICszNTYsMjggQEAKIAogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfRklYRURfTUVNMzI7CiAKLQkvKgotCSAqIENoZWNrIEJ5dGUgMyB0aGUgUmVhZC9Xcml0ZSBiaXQKLQkgKi8KKwkvKiBDaGVjayBCeXRlIDMgdGhlIFJlYWQvV3JpdGUgYml0ICovCisKIAl0ZW1wOCA9ICpidWZmZXI7CiAJYnVmZmVyICs9IDE7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA9IHRlbXA4ICYgMHgwMTsKIAotCS8qCi0JICogR2V0IHJhbmdlX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC03KQotCSAqLwotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfYmFzZV9hZGRyZXNzLCBidWZmZXIpOworCS8qIEdldCByYW5nZV9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNykgKi8KKworCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfYmFzZV9hZGRyZXNzLAorCQlidWZmZXIpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBHZXQgcmFuZ2VfbGVuZ3RoIChCeXRlcyA4LTExKQotCSAqLworCS8qIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDgtMTEpICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2xlbmd0aCwgYnVmZmVyKTsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC00MzksNTQgKzQxMyw0NiBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19tZW1vcnkzMl9yYW5nZV9zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDg1OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBsZW5ndGggZmllbGQgaXMgc3RhdGljICovCisKIAl0ZW1wMTYgPSAweDExOwogCiAJQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIEluZm9ybWF0aW9uIEJ5dGUKLQkgKi8KKwkvKiBTZXQgdGhlIEluZm9ybWF0aW9uIEJ5dGUgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIucmVhZF93cml0ZV9hdHRyaWJ1dGUgJiAweDAxKTsKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MKLQkgKi8KKwkvKiBTZXQgdGhlIFJhbmdlIG1pbmltdW0gYmFzZSBhZGRyZXNzICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLm1pbl9iYXNlX2FkZHJlc3MpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBTZXQgdGhlIFJhbmdlIG1heGltdW0gYmFzZSBhZGRyZXNzCi0JICovCisJLyogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcyAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5tYXhfYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogU2V0IHRoZSBiYXNlIGFsaWdubWVudAotCSAqLworCS8qIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIuYWxpZ25tZW50KTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogU2V0IHRoZSByYW5nZSBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5yYW5nZV9sZW5ndGgpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTUyMiw0NCArNDg4LDM4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2ZpeGVkX21lbW9yeTMyX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4ODY7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFRoZSBsZW5ndGggZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGxlbmd0aCBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCXRlbXAxNiA9IDB4MDk7CiAKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZQotCSAqLworCS8qIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZSAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmIDB4MDEpOwogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBSYW5nZSBiYXNlIGFkZHJlc3MKLQkgKi8KKwkvKiBTZXQgdGhlIFJhbmdlIGJhc2UgYWRkcmVzcyAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsCi0JCQkgJmxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2Jhc2VfYWRkcmVzcyk7CisJCSZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9iYXNlX2FkZHJlc3MpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBTZXQgdGhlIHJhbmdlIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwKLQkJCSAmbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKKwkJJmxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2xlbmd0aCk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKaW5kZXggZDE2YmU0NC4uYTFmMTc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCkBAIC04NCwyNCArODQsMjAgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZW5kX3RhZ19yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpcyBzdGF0aWMgKi8KKwogCSpieXRlc19jb25zdW1lZCA9IDI7CiAKLQkvKgotCSAqICBGaWxsIG91dCB0aGUgc3RydWN0dXJlCi0JICovCisJLyogIEZpbGwgb3V0IHRoZSBzdHJ1Y3R1cmUgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfRU5EX1RBRzsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAwOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTEzNiw5ICsxMzIsOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19lbmRfdGFnX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4Nzk7CiAJYnVmZmVyICs9IDE7CiAKQEAgLTE1MSw5ICsxNDYsOCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0xOTIsMjEgKzE4NiwyMCBAQAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfdmVuZG9yX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogRGVyZWZlcmVuY2UgdGhlIERlc2NyaXB0b3IgdG8gZmluZCBpZiB0aGlzIGlzIGEgbGFyZ2Ugb3Igc21hbGwgaXRlbS4KLQkgKi8KKwkvKiBEZXJlZmVyZW5jZSB0aGUgRGVzY3JpcHRvciB0byBmaW5kIGlmIHRoaXMgaXMgYSBsYXJnZSBvciBzbWFsbCBpdGVtLiAqLworCiAJdGVtcDggPSAqYnVmZmVyOwogCiAJaWYgKHRlbXA4ICYgMHg4MCkgewotCQkvKgotCQkgKiBMYXJnZSBJdGVtLCBwb2ludCB0byB0aGUgbGVuZ3RoIGZpZWxkCi0JCSAqLworCQkvKiBMYXJnZSBJdGVtLCBwb2ludCB0byB0aGUgbGVuZ3RoIGZpZWxkICovCisKIAkJYnVmZmVyICs9IDE7CiAKIAkJLyogRGVyZWZlcmVuY2UgKi8KQEAgLTIyMiw5ICsyMTUsOCBAQAogCQlidWZmZXIgKz0gMjsKIAl9CiAJZWxzZSB7Ci0JCS8qCi0JCSAqIFNtYWxsIEl0ZW0sIGRlcmVmZXJlbmNlIHRoZSBzaXplCi0JCSAqLworCQkvKiBTbWFsbCBJdGVtLCBkZXJlZmVyZW5jZSB0aGUgc2l6ZSAqLworCiAJCXRlbXAxNiA9ICh1OCkoKmJ1ZmZlciAmIDB4MDcpOwogCiAJCS8qIENhbGN1bGF0ZSBieXRlcyBjb25zdW1lZCAqLwpAQCAtMjUxLDE0ICsyNDMsMTIgQEAKIAkgKi8KIAlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXAxNik7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMjk1LDEzICsyODUsMTEgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfdmVuZG9yX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIERlcmVmZXJlbmNlIHRoZSBsZW5ndGggdG8gZmluZCBpZiB0aGlzIGlzIGEgbGFyZ2Ugb3Igc21hbGwgaXRlbS4KLQkgKi8KKwkvKiBEZXJlZmVyZW5jZSB0aGUgbGVuZ3RoIHRvIGZpbmQgaWYgdGhpcyBpcyBhIGxhcmdlIG9yIHNtYWxsIGl0ZW0uICovCisKIAlpZihsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoID4gNykgewotCQkvKgotCQkgKiBMYXJnZSBJdGVtLCBTZXQgdGhlIGRlc2NyaXB0b3IgZmllbGQgYW5kIGxlbmd0aCBieXRlcwotCQkgKi8KKwkJLyogTGFyZ2UgSXRlbSwgU2V0IHRoZSBkZXNjcmlwdG9yIGZpZWxkIGFuZCBsZW5ndGggYnl0ZXMgKi8KKwogCQkqYnVmZmVyID0gMHg4NDsKIAkJYnVmZmVyICs9IDE7CiAKQEAgLTMxMSw5ICsyOTksOCBAQAogCQlidWZmZXIgKz0gMjsKIAl9CiAJZWxzZSB7Ci0JCS8qCi0JCSAqIFNtYWxsIEl0ZW0sIFNldCB0aGUgZGVzY3JpcHRvciBmaWVsZAotCQkgKi8KKwkJLyogU21hbGwgSXRlbSwgU2V0IHRoZSBkZXNjcmlwdG9yIGZpZWxkICovCisKIAkJdGVtcDggPSAweDcwOwogCQl0ZW1wOCB8PSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGg7CiAKQEAgLTMyMSw5ICszMDgsOCBAQAogCQlidWZmZXIgKz0gMTsKIAl9CiAKLQkvKgotCSAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIFZlbmRvciBTcGVjaWZpYyBmaWVsZHMKLQkgKi8KKwkvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBWZW5kb3IgU3BlY2lmaWMgZmllbGRzICovCisKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoOyBpbmRleCsrKSB7CiAJCXRlbXA4ID0gbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLnJlc2VydmVkW2luZGV4XTsKIApAQCAtMzMxLDkgKzMxNyw4IEBACiAJCWJ1ZmZlciArPSAxOwogCX0KIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0zNzAsNDAgKzM1NSwzNyBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYpOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZik7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19zdGFydF9kZXBlbmRfZm5zX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgY29udGFpbmVkIGluIHRoZSBkZXNjcmlwdG9yIChCaXRzOjAtMSkKLQkgKi8KKwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBmb3VuZCBpbiB0aGUgZGVzY3JpcHRvciAoQml0czowLTEpICovCisKIAl0ZW1wOCA9ICpidWZmZXI7CiAKIAkqYnl0ZXNfY29uc3VtZWQgPSAodGVtcDggJiAweDAxKSArIDE7CiAKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX1NUQVJUX0RQRjsKIAotCS8qCi0JICogUG9pbnQgdG8gQnl0ZSAxIGlmIGl0IGlzIHVzZWQKLQkgKi8KKwkvKiBQb2ludCB0byBCeXRlIDEgaWYgaXQgaXMgdXNlZCAqLworCiAJaWYgKDIgPT0gKmJ5dGVzX2NvbnN1bWVkKSB7CiAJCWJ1ZmZlciArPSAxOwogCQl0ZW1wOCA9ICpidWZmZXI7CiAKLQkJLyoKLQkJICogQ2hlY2sgQ29tcGF0aWJpbGl0eSBwcmlvcml0eQotCQkgKi8KKwkJLyogQ2hlY2sgQ29tcGF0aWJpbGl0eSBwcmlvcml0eSAqLworCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkgPSB0ZW1wOCAmIDB4MDM7CiAKIAkJaWYgKDMgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX1JFU09VUkNFX1ZBTFVFKTsKIAkJfQogCi0JCS8qCi0JCSAqIENoZWNrIFBlcmZvcm1hbmNlL1JvYnVzdG5lc3MgcHJlZmVyZW5jZQotCQkgKi8KKwkJLyogQ2hlY2sgUGVyZm9ybWFuY2UvUm9idXN0bmVzcyBwcmVmZXJlbmNlICovCisKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyA9ICh0ZW1wOCA+PiAyKSAmIDB4MDM7CiAKIAkJaWYgKDMgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgewpAQCAtNDEyLDIwICszOTQsMTggQEAKIAl9CiAJZWxzZSB7CiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkgPQotCQkJCUFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOworCQkJQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT047CiAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyA9Ci0JCQkJQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT047CisJCQlBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjsKIAl9CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNDY2LDI0ICs0NDYsMjAgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaXMgc3RhdGljICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSAxOwogCi0JLyoKLQkgKiAgRmlsbCBvdXQgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qICBGaWxsIG91dCB0aGUgc3RydWN0dXJlICovCisKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0VORF9EUEY7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNTMzLDkgKzUwOSw4IEBACiAJCSpidWZmZXIgPSAweDMxOwogCQlidWZmZXIgKz0gMTsKIAotCQkvKgotCQkgKiBTZXQgdGhlIFByaW9yaXR5IEJ5dGUgRGVmaW5pdGlvbgotCQkgKi8KKwkJLyogU2V0IHRoZSBQcmlvcml0eSBCeXRlIERlZmluaXRpb24gKi8KKwogCQl0ZW1wOCA9IDA7CiAJCXRlbXA4ID0gKHU4KSAoKGxpbmtlZF9saXN0LT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzICYKIAkJCQkgICAweDAzKSA8PCAyKTsKQEAgLTU0Niw5ICs1MjEsOCBAQAogCiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNTgyLDE1ICs1NTYsMTMgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHgzODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCmluZGV4IGVlOWNlMTMuLjcwMGNmN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCkBAIC04MywxMCArODMsMTAgQEAKIAogCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KIAotCS8qCi0JICogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzCi0JICovCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgIl9QUlQiLCBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZvYmpfZGVzYyk7CisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJULAorCQkJIEFDUElfQlRZUEVfUEFDS0FHRSwgJm9ial9kZXNjKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CkBAIC0xMzYsMTAgKzEzNiwxMCBAQAogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCAiX0NSUyIsIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOworCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCSBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CkBAIC0xNzUsNiArMTc1LDcgQEAKICAqICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYWxsZXJzIGJ1ZmZlciBpcyB1bmRlZmluZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhICgKQEAgLTE5MCwxMCArMTkxLDEwIEBACiAKIAkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycwotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsICJfUFJTIiwgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJTLAorCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTIxOCw2ICsyMTksNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhCiAgKgogICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIGEgaGFuZGxlIHRvIHRoZSBjb250YWluaW5nIG9iamVjdAorICogICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAtIFBhdGggdG8gbWV0aG9kLCByZWxhdGl2ZSB0byBIYW5kbGUKICAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBhIHBvaW50ZXIgdG8gYSBidWZmZXIgc3RydWN0dXJlIGZvciB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMKICAqCkBAIC0yNDYsOSArMjQ4LDggQEAKIAogCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KIAotCS8qCi0JICogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzCi0JICovCisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCisKIAlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCBwYXRoLCBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTMxNCwxOCArMzE1LDE2IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQkvKgotCSAqIEluaXQgdGhlIHBhcmFtIG9iamVjdAotCSAqLworCS8qIEluaXQgdGhlIHBhcmFtIG9iamVjdCAqLworCiAJcGFyYW1zWzBdID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfQlVGRkVSKTsKIAlpZiAoIXBhcmFtc1swXSkgewogCQlhY3BpX29zX2ZyZWUgKGJ1ZmZlci5wb2ludGVyKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwogCX0KIAotCS8qCi0JICogU2V0IHVwIHRoZSBwYXJhbWV0ZXIgb2JqZWN0Ci0JICovCisJLyogU2V0IHVwIHRoZSBwYXJhbWV0ZXIgb2JqZWN0ICovCisKIAlwYXJhbXNbMF0tPmJ1ZmZlci5sZW5ndGggID0gKHUzMikgYnVmZmVyLmxlbmd0aDsKIAlwYXJhbXNbMF0tPmJ1ZmZlci5wb2ludGVyID0gYnVmZmVyLnBvaW50ZXI7CiAJcGFyYW1zWzBdLT5jb21tb24uZmxhZ3MgICA9IEFPUE9CSl9EQVRBX1ZBTElEOwpAQCAtMzM1LDEwICszMzQsOSBAQAogCWluZm8ucGFyYW1ldGVycyA9IHBhcmFtczsKIAlpbmZvLnBhcmFtZXRlcl90eXBlID0gQUNQSV9QQVJBTV9BUkdTOwogCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHJldHVybiB2YWx1ZQotCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKCJfU1JTIiwgJmluZm8pOworCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcmV0dXJuIHZhbHVlICovCisKKwlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlIChNRVRIT0RfTkFNRV9fU1JTLCAmaW5mbyk7CiAJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewogCQkvKiBEZWxldGUgYW55IHJldHVybiBvYmplY3QgKGVzcGVjaWFsbHkgaWYgaW1wbGljaXRfcmV0dXJuIGlzIGVuYWJsZWQpICovCiAKQEAgLTM0Nyw5ICszNDUsOCBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBDbGVhbiB1cCBhbmQgcmV0dXJuIHRoZSBzdGF0dXMgZnJvbSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlCi0JICovCisJLyogQ2xlYW4gdXAgYW5kIHJldHVybiB0aGUgc3RhdHVzIGZyb20gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAqLworCiAJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChwYXJhbXNbMF0pOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKaW5kZXggYTljZGNiZS4uODNjOTQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKQEAgLTQ5LDYgKzQ5LDIzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzeGZhY2UiKQogCisvKiBMb2NhbCBtYWNyb3MgZm9yIDE2LDMyLWJpdCB0byA2NC1iaXQgY29udmVyc2lvbiAqLworCisjZGVmaW5lIEFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBmaWVsZCkgICgob3V0KS0+ZmllbGQgPSAoaW4pLT5maWVsZCkKKyNkZWZpbmUgQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBpbikgICAgICAgICAgICAgICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCByZXNvdXJjZV90eXBlKTsgICAgICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBwcm9kdWNlcl9jb25zdW1lcik7ICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBkZWNvZGUpOyAgICAgICAgICAgICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtaW5fYWRkcmVzc19maXhlZCk7ICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtYXhfYWRkcmVzc19maXhlZCk7ICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBhdHRyaWJ1dGUpOyAgICAgICAgICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBncmFudWxhcml0eSk7ICAgICAgICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtaW5fYWRkcmVzc19yYW5nZSk7ICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtYXhfYWRkcmVzc19yYW5nZSk7ICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7IFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYWRkcmVzc19sZW5ndGgpOyAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcmVzb3VyY2Vfc291cmNlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE4MCw2ICsxOTcsNyBAQAogICogICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgb2YgcmV0X2J1ZmZlciBpcyB1bmRlZmluZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzICgKQEAgLTM0Niw5ICszNjQsOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyIpOwogCiAKLQkvKgotCSAqIE11c3QgaGF2ZSBhIHZhbGlkIGhhbmRsZSBhbmQgYnVmZmVyCi0JICovCisJLyogTXVzdCBoYXZlIGEgdmFsaWQgaGFuZGxlIGFuZCBidWZmZXIgKi8KKwogCWlmICgoIWRldmljZV9oYW5kbGUpICAgICAgfHwKIAkJKCFpbl9idWZmZXIpICAgICAgICAgIHx8CiAJCSghaW5fYnVmZmVyLT5wb2ludGVyKSB8fApAQCAtMzYyLDIxICszNzksNiBAQAogRVhQT1JUX1NZTUJPTChhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyk7CiAKIAotI2RlZmluZSBBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZmllbGQpICAoKG91dCktPmZpZWxkID0gKGluKS0+ZmllbGQpCi0jZGVmaW5lIEFDUElfQ09QWV9BRERSRVNTKG91dCwgaW4pICAgICAgICAgICAgICAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcmVzb3VyY2VfdHlwZSk7ICAgICAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcHJvZHVjZXJfY29uc3VtZXIpOyAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZGVjb2RlKTsgICAgICAgICAgICAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWluX2FkZHJlc3NfZml4ZWQpOyAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWF4X2FkZHJlc3NfZml4ZWQpOyAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYXR0cmlidXRlKTsgICAgICAgICAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZ3JhbnVsYXJpdHkpOyAgICAgICAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWluX2FkZHJlc3NfcmFuZ2UpOyAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWF4X2FkZHJlc3NfcmFuZ2UpOyAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOyBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGFkZHJlc3NfbGVuZ3RoKTsgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHJlc291cmNlX3NvdXJjZSk7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQKQEAgLTQwOCwxNCArNDEwLDE0IEBACiAJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMTY6CiAKIAkJYWRkcmVzczE2ID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqKSAmcmVzb3VyY2UtPmRhdGE7Ci0JCUFDUElfQ09QWV9BRERSRVNTKG91dCwgYWRkcmVzczE2KTsKKwkJQUNQSV9DT1BZX0FERFJFU1MgKG91dCwgYWRkcmVzczE2KTsKIAkJYnJlYWs7CiAKIAogCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzMyOgogCiAJCWFkZHJlc3MzMiA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgKikgJnJlc291cmNlLT5kYXRhOwotCQlBQ1BJX0NPUFlfQUREUkVTUyhvdXQsIGFkZHJlc3MzMik7CisJCUFDUElfQ09QWV9BRERSRVNTIChvdXQsIGFkZHJlc3MzMik7CiAJCWJyZWFrOwogCiAKQEAgLTQzNCw0ICs0MzYsMyBAQAogCXJldHVybiAoQUVfT0spOwogfQogRVhQT1JUX1NZTUJPTChhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IDMzN2Q0OWIuLmNiY2RhMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtMTA2MSwxMyArMTA2MSwxNSBAQAogCS8qCiAJICogU3RhdHVzCiAJICogLS0tLS0tCi0JICogU2VlIGlmIHRoZSBkZXZpY2UgaXMgcHJlc2VudC4gIFdlIGFsd2F5cyBhc3N1bWUgdGhhdCBub24tRGV2aWNlKCkKLQkgKiBvYmplY3RzIChlLmcuIHRoZXJtYWwgem9uZXMsIHBvd2VyIHJlc291cmNlcywgcHJvY2Vzc29ycywgZXRjLikgYXJlCi0JICogcHJlc2VudCwgZnVuY3Rpb25pbmcsIGV0Yy4gKGF0IGxlYXN0IHdoZW4gcGFyZW50IG9iamVjdCBpcyBwcmVzZW50KS4KLQkgKiBOb3RlIHRoYXQgX1NUQSBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3Igc29tZSBvYmplY3RzIChlLmcuCi0JICogcG93ZXIgcmVzb3VyY2VzKSBzbyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgaG93IHdlIHVzZSBpdC4KKwkgKiBTZWUgaWYgdGhlIGRldmljZSBpcyBwcmVzZW50LiAgV2UgYWx3YXlzIGFzc3VtZSB0aGF0IG5vbi1EZXZpY2UKKwkgKiBhbmQgbm9uLVByb2Nlc3NvciBvYmplY3RzIChlLmcuIHRoZXJtYWwgem9uZXMsIHBvd2VyIHJlc291cmNlcywKKwkgKiBldGMuKSBhcmUgcHJlc2VudCwgZnVuY3Rpb25pbmcsIGV0Yy4gKGF0IGxlYXN0IHdoZW4gcGFyZW50IG9iamVjdAorCSAqIGlzIHByZXNlbnQpLiAgTm90ZSB0aGF0IF9TVEEgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yIHNvbWUKKwkgKiBvYmplY3RzIChlLmcuIHBvd2VyIHJlc291cmNlcykgc28gd2UgbmVlZCB0byBiZSBjYXJlZnVsIGhvdyB3ZSB1c2UKKwkgKiBpdC4KIAkgKi8KIAlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDUElfQlVTX1RZUEVfUFJPQ0VTU09SOgogCWNhc2UgQUNQSV9CVVNfVFlQRV9ERVZJQ0U6CiAJCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9zdGF0dXMoZGV2aWNlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShyZXN1bHQpIHx8ICFkZXZpY2UtPnN0YXR1cy5wcmVzZW50KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYwppbmRleCAwYTVkMmE5Li43MjQ5YmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKQEAgLTEsNiArMSw3IEBACiAvKgogICogc2xlZXAuYyAtIEFDUEkgc2xlZXAgc3VwcG9ydC4KICAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQWxleGV5IFN0YXJpa292c2tpeSA8YWxleGV5Lnkuc3Rhcmlrb3Zza2l5QGludGVsLmNvbT4KICAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTaGFvaHVhIExpIDxzaGFvaHVhLmxpQGludGVsLmNvbT4KICAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFBhdHJpY2sgTW9jaGVsCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgT3BlbiBTb3VyY2UgRGV2ZWxvcG1lbnQgTGFiCkBAIC0xNCw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogI2luY2x1ZGUgInNsZWVwLmgiCkBAIC0yNywxMCArMjcsMTEgQEAKIGV4dGVybiB2b2lkIGRvX3N1c3BlbmRfbG93bGV2ZWwodm9pZCk7CiAKIHN0YXRpYyB1MzIgYWNwaV9zdXNwZW5kX3N0YXRlc1tdID0gewotCVtQTV9TVVNQRU5EX09OXQkJPSBBQ1BJX1NUQVRFX1MwLAotCVtQTV9TVVNQRU5EX1NUQU5EQlldCT0gQUNQSV9TVEFURV9TMSwKLQlbUE1fU1VTUEVORF9NRU1dCT0gQUNQSV9TVEFURV9TMywKLQlbUE1fU1VTUEVORF9ESVNLXQk9IEFDUElfU1RBVEVfUzQsCisJW1BNX1NVU1BFTkRfT05dID0gQUNQSV9TVEFURV9TMCwKKwlbUE1fU1VTUEVORF9TVEFOREJZXSA9IEFDUElfU1RBVEVfUzEsCisJW1BNX1NVU1BFTkRfTUVNXSA9IEFDUElfU1RBVEVfUzMsCisJW1BNX1NVU1BFTkRfRElTS10gPSBBQ1BJX1NUQVRFX1M0LAorCVtQTV9TVVNQRU5EX01BWF0gPSBBQ1BJX1NUQVRFX1M1CiB9OwogCiBzdGF0aWMgaW50IGluaXRfODI1OUFfYWZ0ZXJfUzE7CkBAIC00NCwzMCArNDUsMjAgQEAKICAqCXdha2V1cCBjb2RlIHRvIHRoZSB3YWtpbmcgdmVjdG9yLiAKICAqLwogCitleHRlcm4gaW50IGFjcGlfc2xlZXBfcHJlcGFyZSh1MzIgYWNwaV9zdGF0ZSk7CitleHRlcm4gdm9pZCBhY3BpX3Bvd2VyX29mZih2b2lkKTsKKwogc3RhdGljIGludCBhY3BpX3BtX3ByZXBhcmUoc3VzcGVuZF9zdGF0ZV90IHBtX3N0YXRlKQogewogCXUzMiBhY3BpX3N0YXRlID0gYWNwaV9zdXNwZW5kX3N0YXRlc1twbV9zdGF0ZV07CiAKLQlpZiAoIXNsZWVwX3N0YXRlc1thY3BpX3N0YXRlXSkKKwlpZiAoIXNsZWVwX3N0YXRlc1thY3BpX3N0YXRlXSkgeworCQlwcmludGsoImFjcGlfcG1fcHJlcGFyZSBkb2VzIG5vdCBzdXBwb3J0ICVkIFxuIiwgcG1fc3RhdGUpOwogCQlyZXR1cm4gLUVQRVJNOwotCi0JLyogZG8gd2UgaGF2ZSBhIHdha2V1cCBhZGRyZXNzIGZvciBTMiBhbmQgUzM/ICovCi0JLyogSGVyZSwgd2Ugc3VwcG9ydCBvbmx5IFM0QklPUywgdGhvc2Ugd2Ugc2V0IHRoZSB3YWtldXAgYWRkcmVzcyAqLwotCS8qIFM0T1MgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG5vdyB2aWEgc3dzdXNwLi4gKi8KLQlpZiAocG1fc3RhdGUgPT0gUE1fU1VTUEVORF9NRU0gfHwgcG1fc3RhdGUgPT0gUE1fU1VTUEVORF9ESVNLKSB7Ci0JCWlmICghYWNwaV93YWtldXBfYWRkcmVzcykKLQkJCXJldHVybiAtRUZBVUxUOwotCQlhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgdmlydF90b19waHlzKAotCQkJCSh2b2lkICopYWNwaV93YWtldXBfYWRkcmVzcykpOwogCX0KLQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOwotCWFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcHJlcChhY3BpX3N0YXRlKTsKLQlhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAoYWNwaV9zdGF0ZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGFjcGlfc2xlZXBfcHJlcGFyZShhY3BpX3N0YXRlKTsKIH0KIAotCiAvKioKICAqCWFjcGlfcG1fZW50ZXIgLSBBY3R1YWxseSBlbnRlciBhIHNsZWVwIHN0YXRlLgogICoJQHBtX3N0YXRlOgkJU3RhdGUgd2UncmUgZW50ZXJpbmcuCkBAIC05MiwxMSArODMsOSBAQAogCQkJcmV0dXJuIGVycm9yOwogCX0KIAotCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2UoYWNwaV9zdGF0ZSk7Ci0Jc3dpdGNoIChwbV9zdGF0ZSkKLQl7CisJc3dpdGNoIChwbV9zdGF0ZSkgewogCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgogCQliYXJyaWVyKCk7CiAJCXN0YXR1cyA9IGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUoYWNwaV9zdGF0ZSk7CkBAIC0xMTIsNiArMTAxLDEwIEBACiAJCWVsc2UKIAkJCWRvX3N1c3BlbmRfbG93bGV2ZWxfczRiaW9zKCk7CiAJCWJyZWFrOworCWNhc2UgUE1fU1VTUEVORF9NQVg6CisJCWFjcGlfcG93ZXJfb2ZmKCk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTI2LDExICsxMTksOSBAQAogCWlmIChwbV9zdGF0ZSA+IFBNX1NVU1BFTkRfU1RBTkRCWSkKIAkJYWNwaV9yZXN0b3JlX3N0YXRlX21lbSgpOwogCi0KIAlyZXR1cm4gQUNQSV9TVUNDRVNTKHN0YXR1cykgPyAwIDogLUVGQVVMVDsKIH0KIAotCiAvKioKICAqCWFjcGlfcG1fZmluaXNoIC0gRmluaXNoIHVwIHN1c3BlbmQgc2VxdWVuY2UuCiAgKglAcG1fc3RhdGU6CQlTdGF0ZSB3ZSdyZSBjb21pbmcgb3V0IG9mLgpAQCAtMTU2LDI3ICsxNDcsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBpbnQgYWNwaV9zdXNwZW5kKHUzMiBhY3BpX3N0YXRlKQogewogCXN1c3BlbmRfc3RhdGVfdCBzdGF0ZXNbXSA9IHsKLQkJWzFdCT0gUE1fU1VTUEVORF9TVEFOREJZLAotCQlbM10JPSBQTV9TVVNQRU5EX01FTSwKLQkJWzRdCT0gUE1fU1VTUEVORF9ESVNLLAorCQlbMV0gPSBQTV9TVVNQRU5EX1NUQU5EQlksCisJCVszXSA9IFBNX1NVU1BFTkRfTUVNLAorCQlbNF0gPSBQTV9TVVNQRU5EX0RJU0ssCisJCVs1XSA9IFBNX1NVU1BFTkRfTUFYCiAJfTsKIAotCWlmIChhY3BpX3N0YXRlIDw9IDQgJiYgc3RhdGVzW2FjcGlfc3RhdGVdKQorCWlmIChhY3BpX3N0YXRlIDwgNiAmJiBzdGF0ZXNbYWNwaV9zdGF0ZV0pCiAJCXJldHVybiBwbV9zdXNwZW5kKHN0YXRlc1thY3BpX3N0YXRlXSk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcG1fb3BzIGFjcGlfcG1fb3BzID0gewotCS5wcmVwYXJlCT0gYWNwaV9wbV9wcmVwYXJlLAotCS5lbnRlcgkJPSBhY3BpX3BtX2VudGVyLAotCS5maW5pc2gJCT0gYWNwaV9wbV9maW5pc2gsCisJLnByZXBhcmUgPSBhY3BpX3BtX3ByZXBhcmUsCisJLmVudGVyID0gYWNwaV9wbV9lbnRlciwKKwkuZmluaXNoID0gYWNwaV9wbV9maW5pc2gsCiB9OwogCi0KIC8qCiAgKiBUb3NoaWJhIGZhaWxzIHRvIHByZXNlcnZlIGludGVycnVwdHMgb3ZlciBTMSwgcmVpbml0aWFsaXphdGlvbgogICogb2YgODI1OSBpcyBuZWVkZWQgYWZ0ZXIgUzEgcmVzdW1lLgpAQCAtMTkwLDE2ICsxODAsMTYgQEAKIAogc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgYWNwaXNsZWVwX2RtaV90YWJsZVtdID0gewogCXsKLQkJLmNhbGxiYWNrID0gaW5pdF9pbnRzX2FmdGVyX3MxLAotCQkuaWRlbnQgPSAiVG9zaGliYSBTYXRlbGxpdGUgNDAzMGNkdCIsCi0JCS5tYXRjaGVzID0geyBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlM0MDMwQ0RULzQuMyIpLCB9LAotCX0sCi0JeyB9LAorCSAuY2FsbGJhY2sgPSBpbml0X2ludHNfYWZ0ZXJfczEsCisJIC5pZGVudCA9ICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwKKwkgLm1hdGNoZXMgPSB7RE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJTNDAzMENEVC80LjMiKSx9LAorCSB9LAorCXt9LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9zbGVlcF9pbml0KHZvaWQpCiB7Ci0JaW50CQkJaSA9IDA7CisJaW50IGkgPSAwOwogCiAJZG1pX2NoZWNrX3N5c3RlbShhY3Bpc2xlZXBfZG1pX3RhYmxlKTsKIApAQCAtMjA3LDcgKzE5Nyw3IEBACiAJCXJldHVybiAwOwogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIihzdXBwb3J0cyIpOwotCWZvciAoaT0wOyBpIDwgQUNQSV9TX1NUQVRFX0NPVU5UOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9TX1NUQVRFX0NPVU5UOyBpKyspIHsKIAkJYWNwaV9zdGF0dXMgc3RhdHVzOwogCQl1OCB0eXBlX2EsIHR5cGVfYjsKIAkJc3RhdHVzID0gYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKGksICZ0eXBlX2EsICZ0eXBlX2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcG93ZXJvZmYuYwppbmRleCBkYTIzNzc1Li4xZmM4NmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvcG93ZXJvZmYuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcG93ZXJvZmYuYwpAQCAtMywzNSArMywxMDAgQEAKICAqCiAgKiBBS0EgUzUsIGJ1dCBpdCBpcyBpbmRlcGVuZGVudCBvZiB3aGV0aGVyIG9yIG5vdCB0aGUga2VybmVsIHN1cHBvcnRzCiAgKiBhbnkgb3RoZXIgc2xlZXAgc3VwcG9ydCBpbiB0aGUgc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbGV4ZXkgU3Rhcmlrb3Zza2l5IDxhbGV4ZXkueS5zdGFyaWtvdnNraXlAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgInNsZWVwLmgiCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3Bvd2VyX29mZiAodm9pZCkKK2ludCBhY3BpX3NsZWVwX3ByZXBhcmUodTMyIGFjcGlfc3RhdGUpCiB7Ci0JcHJpbnRrKCIlcyBjYWxsZWRcbiIsX19GVU5DVElPTl9fKTsKKwkvKiBGbGFnIHRvIGRvIG5vdCBhbGxvdyBzZWNvbmQgdGltZSBpbnZvY2F0aW9uIGZvciBTNSBzdGF0ZSAqLworCXN0YXRpYyBpbnQgc2h1dGRvd25fcHJlcGFyZWQgPSAwOworI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCisJLyogZG8gd2UgaGF2ZSBhIHdha2V1cCBhZGRyZXNzIGZvciBTMiBhbmQgUzM/ICovCisJLyogSGVyZSwgd2Ugc3VwcG9ydCBvbmx5IFM0QklPUywgdGhvc2Ugd2Ugc2V0IHRoZSB3YWtldXAgYWRkcmVzcyAqLworCS8qIFM0T1MgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG5vdyB2aWEgc3dzdXNwLi4gKi8KKwlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MzIHx8IGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TNCkgeworCQlpZiAoIWFjcGlfd2FrZXVwX2FkZHJlc3MpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWFjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJCXZpcnRfdG9fcGh5cygodm9pZCAqKQorCQkJCQkJCSAgICAgYWNwaV93YWtldXBfYWRkcmVzcykpOworCisJfQorCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisJYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wcmVwKGFjcGlfc3RhdGUpOworI2VuZGlmCisJaWYgKGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TNSkgeworCQkvKiBDaGVjayBpZiB3ZSB3ZXJlIGFscmVhZHkgY2FsbGVkICovCisJCWlmIChzaHV0ZG93bl9wcmVwYXJlZCkKKwkJCXJldHVybiAwOworCQlhY3BpX3dha2V1cF9ncGVfcG93ZXJvZmZfcHJlcGFyZSgpOworCQlzaHV0ZG93bl9wcmVwYXJlZCA9IDE7CisJfQorCWFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcChhY3BpX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhY3BpX3Bvd2VyX29mZih2b2lkKQoreworCXByaW50aygiJXMgY2FsbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCWFjcGlfc2xlZXBfcHJlcGFyZShBQ1BJX1NUQVRFX1M1KTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCS8qIFNvbWUgU01QIG1hY2hpbmVzIG9ubHkgY2FuIHBvd2Vyb2ZmIGluIGJvb3QgQ1BVICovCiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSgwKSk7Ci0JYWNwaV93YWtldXBfZ3BlX3Bvd2Vyb2ZmX3ByZXBhcmUoKTsKLQlhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAoQUNQSV9TVEFURV9TNSk7Ci0JQUNQSV9ESVNBQkxFX0lSUVMoKTsKIAlhY3BpX2VudGVyX3NsZWVwX3N0YXRlKEFDUElfU1RBVEVfUzUpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgYWNwaV9zaHV0ZG93bihzdHJ1Y3Qgc3lzX2RldmljZSAqeCkKK3sKKwlyZXR1cm4gYWNwaV9zbGVlcF9wcmVwYXJlKEFDUElfU1RBVEVfUzUpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBhY3BpX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoImFjcGkiKSwKKwkuc2h1dGRvd24gPSBhY3BpX3NodXRkb3duCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2FjcGkgPSB7CisJLmlkID0gMCwKKwkuY2xzID0gJmFjcGlfc3lzY2xhc3MsCit9OworCisjZW5kaWYKKwogc3RhdGljIGludCBhY3BpX3Bvd2Vyb2ZmX2luaXQodm9pZCkKIHsKIAlpZiAoIWFjcGlfZGlzYWJsZWQpIHsKIAkJdTggdHlwZV9hLCB0eXBlX2I7CiAJCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCQlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoQUNQSV9TVEFURV9TNSwgJnR5cGVfYSwgJnR5cGVfYik7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YShBQ1BJX1NUQVRFX1M1LCAmdHlwZV9hLCAmdHlwZV9iKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQlwbV9wb3dlcl9vZmYgPSBhY3BpX3Bvd2VyX29mZjsKKyNpZmRlZiBDT05GSUdfUE0KKwkJCXsKKwkJCQlpbnQgZXJyb3I7CisJCQkJZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmFjcGlfc3lzY2xhc3MpOworCQkJCWlmICghZXJyb3IpCisJCQkJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfYWNwaSk7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorI2VuZGlmCisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYwppbmRleCBmZDdjNWEwLi4xYmU5OWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKQEAgLTEzLDEzICsxMywxNyBAQAogCiAjaW5jbHVkZSAic2xlZXAuaCIKIAorI2lmZGVmCUNPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9TTEVFUAkJInNsZWVwIgorI2VuZGlmCisKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9BTEFSTQkJImFsYXJtIgogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX1dBS0VVUF9ERVZJQ0UgICAid2FrZXVwIgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfU1lTVEVNX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRQkJKCJzbGVlcCIpCiAKKyNpZmRlZglDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQCiAKIHN0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fc2xlZXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKQEAgLTc4LDYgKzgyLDcgQEAKICBEb25lOgogCXJldHVybiBlcnJvciA/IGVycm9yIDogY291bnQ7CiB9CisjZW5kaWYJLyogQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUCAqLwogCiBzdGF0aWMgaW50IGFjcGlfc3lzdGVtX2FsYXJtX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CkBAIC00NTIsNiArNDU3LDcgQEAKIAkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAorI2lmZGVmCUNPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX3NsZWVwX2ZvcHMgPSB7CiAJLm9wZW4JCT0gYWNwaV9zeXN0ZW1fc2xlZXBfb3Blbl9mcywKIAkucmVhZAkJPSBzZXFfcmVhZCwKQEAgLTQ1OSw2ICs0NjUsNyBAQAogCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OworI2VuZGlmCS8qIENPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAgKi8KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1fYWxhcm1fZm9wcyA9IHsKIAkub3BlbgkJPSBhY3BpX3N5c3RlbV9hbGFybV9vcGVuX2ZzLApAQCAtNDg0LDExICs0OTEsMTMgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIDA7CiAgCisjaWZkZWYJQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUAogCS8qICdzbGVlcCcgW1IvV10qLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9TWVNURU1fRklMRV9TTEVFUCwKIAkJCQkgIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoZW50cnkpCiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9zeXN0ZW1fc2xlZXBfZm9wczsKKyNlbmRpZgogCiAJLyogJ2FsYXJtJyBbUi9XXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9TWVNURU1fRklMRV9BTEFSTSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYwppbmRleCAzMzQzMjdjLi45MmUwYzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jCkBAIC01MCw2ICs1MCwyNCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YmNvbnZydCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKAorCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgKm5ld19nYXNfc3RydWN0LAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYml0X3dpZHRoLAorCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcyk7CisKK3N0YXRpYyB2b2lkCithY3BpX3RiX2NvbnZlcnRfZmFkdDEgKAorCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAgICAqbG9jYWxfZmFkdCwKKwlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgICAgKm9yaWdpbmFsX2ZhZHQpOworCitzdGF0aWMgdm9pZAorYWNwaV90Yl9jb252ZXJ0X2ZhZHQyICgKKwlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKmxvY2FsX2ZhZHQsCisJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpvcmlnaW5hbF9mYWR0KTsKKwogCiB1OCBhY3BpX2ZhZHRfaXNfdjE7CiBFWFBPUlRfU1lNQk9MKGFjcGlfZmFkdF9pc192MSk7CkBAIC0xNDIsMTEgKzE2MCwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50OyBpKyspIHsKIAkJaWYgKGFjcGlfZ2JsX1JTRFAtPnJldmlzaW9uIDwgMikgewogCQkJQUNQSV9TVE9SRV9BRERSRVNTIChuZXdfdGFibGUtPnRhYmxlX29mZnNldF9lbnRyeVtpXSwKLQkJCQkoQUNQSV9DQVNUX1BUUiAoc3RydWN0IHJzZHRfZGVzY3JpcHRvcl9yZXYxLCB0YWJsZV9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXSk7CisJCQkJKEFDUElfQ0FTVF9QVFIgKHN0cnVjdCByc2R0X2Rlc2NyaXB0b3JfcmV2MSwKKwkJCQkJdGFibGVfaW5mby0+cG9pbnRlcikpLT50YWJsZV9vZmZzZXRfZW50cnlbaV0pOwogCQl9CiAJCWVsc2UgewogCQkJbmV3X3RhYmxlLT50YWJsZV9vZmZzZXRfZW50cnlbaV0gPQotCQkJCShBQ1BJX0NBU1RfUFRSIChYU0RUX0RFU0NSSVBUT1IsIHRhYmxlX2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOworCQkJCShBQ1BJX0NBU1RfUFRSIChYU0RUX0RFU0NSSVBUT1IsCisJCQkJCXRhYmxlX2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOwogCQl9CiAJfQogCkBAIC0xNjQsNyArMTg0LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzCiAgKgpAQCAtMjAxLDcgKzIyMSw3IEBACiAgKiBQQVJBTUVURVJTOiAgbG9jYWxfZmFkdCAgICAgIC0gUG9pbnRlciB0byBuZXcgRkFEVAogICogICAgICAgICAgICAgIG9yaWdpbmFsX2ZhZHQgICAtIFBvaW50ZXIgdG8gb2xkIEZBRFQKICAqCi0gKiBSRVRVUk46ICAgICAgUG9wdWxhdGVzIGxvY2FsX2ZhZHQKKyAqIFJFVFVSTjogICAgICBOb25lLCBwb3B1bGF0ZXMgbG9jYWxfZmFkdAogICoKICAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIEFDUEkgMS4wIEZBRFQgdG8gY29tbW9uIGludGVybmFsIGZvcm1hdAogICoKQEAgLTIxMyw3ICsyMzMsNiBAQAogCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSAgICAqb3JpZ2luYWxfZmFkdCkKIHsKIAotCiAJLyogQUNQSSAxLjAgRkFDUyAqLwogCS8qIFRoZSBCSU9TIHN0b3JlZCBGQURUIHNob3VsZCBhZ3JlZSB3aXRoIFJldmlzaW9uIDEuMCAqLwogCWFjcGlfZmFkdF9pc192MSA9IDE7CkBAIC0yMzIsNyArMjUxLDggQEAKIAlBQ1BJX1NUT1JFX0FERFJFU1MgKGxvY2FsX2ZhZHQtPlhkc2R0LCBsb2NhbF9mYWR0LT5WMV9kc2R0KTsKIAogCS8qCi0JICogU3lzdGVtIEludGVycnVwdCBNb2RlbCBpc24ndCB1c2VkIGluIEFDUEkgMi4wIChsb2NhbF9mYWR0LT5SZXNlcnZlZDEgPSAwOykKKwkgKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsIGlzbid0IHVzZWQgaW4gQUNQSSAyLjAKKwkgKiAobG9jYWxfZmFkdC0+UmVzZXJ2ZWQxID0gMDspCiAJICovCiAKIAkvKgpAQCAtMjY5LDcgKzI4OSw4IEBACiAJCSAqIHRoYXQgaW1tZWRpYXRlbHkgZm9sbG93cy4KIAkJICovCiAJCUFDUElfTUVNQ1BZICgmbG9jYWxfZmFkdC0+cmVzZXRfcmVnaXN0ZXIsCi0JCQkmKEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cywgb3JpZ2luYWxfZmFkdCkpLT5yZXNldF9yZWdpc3RlciwKKwkJCSYoQUNQSV9DQVNUX1BUUiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyX21pbnVzLAorCQkJCW9yaWdpbmFsX2ZhZHQpKS0+cmVzZXRfcmVnaXN0ZXIsCiAgIAkJCXNpemVvZiAoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzKSArIDEpOwogCX0KIAllbHNlIHsKQEAgLTMwNCw3ICszMjUsOCBAQAogCiAJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmFjcGlfZ2JsX3hwbTFhX2VuYWJsZSwKIAkJICh1OCkgQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pLAotCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCisJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCiAJCQlBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKIAogCS8qIFBNMUIgaXMgb3B0aW9uYWw7IGxlYXZlIG51bGwgaWYgbm90IHByZXNlbnQgKi8KQEAgLTMxMiw3ICszMzQsOCBAQAogCWlmIChsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MpIHsKIAkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSwKIAkJCSAodTgpIEFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSwKLQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzICsKKwkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCShsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MgKwogCQkJCUFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSkpOwogCX0KIH0KQEAgLTMyNSw3ICszNDgsNyBAQAogICogUEFSQU1FVEVSUzogIGxvY2FsX2ZhZHQgICAgICAtIFBvaW50ZXIgdG8gbmV3IEZBRFQKICAqICAgICAgICAgICAgICBvcmlnaW5hbF9mYWR0ICAgLSBQb2ludGVyIHRvIG9sZCBGQURUCiAgKgotICogUkVUVVJOOiAgICAgIFBvcHVsYXRlcyBsb2NhbF9mYWR0CisgKiBSRVRVUk46ICAgICAgTm9uZSwgcG9wdWxhdGVzIGxvY2FsX2ZhZHQKICAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBhbiBBQ1BJIDIuMCBGQURUIHRvIGNvbW1vbiBpbnRlcm5hbCBmb3JtYXQuCiAgKiAgICAgICAgICAgICAgSGFuZGxlcyBvcHRpb25hbCAiWCIgZmllbGRzLgpAQCAtMzQ4LDcgKzM3MSw4IEBACiAJICogaXMgemVyby4KIAkgKi8KIAlpZiAoIShsb2NhbF9mYWR0LT54ZmlybXdhcmVfY3RybCkpIHsKLQkJQUNQSV9TVE9SRV9BRERSRVNTIChsb2NhbF9mYWR0LT54ZmlybXdhcmVfY3RybCwgbG9jYWxfZmFkdC0+VjFfZmlybXdhcmVfY3RybCk7CisJCUFDUElfU1RPUkVfQUREUkVTUyAobG9jYWxfZmFkdC0+eGZpcm13YXJlX2N0cmwsCisJCQlsb2NhbF9mYWR0LT5WMV9maXJtd2FyZV9jdHJsKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT5YZHNkdCkpIHsKQEAgLTM1NywzMiArMzgxLDM4IEBACiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MpKSB7CiAJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMWFfZXZ0X2Jsayk7CisJCQlsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKKwkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMWFfZXZ0X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzKSkgewogCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLCAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFiX2V2dF9ibGspOworCQkJbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sCisJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFiX2V2dF9ibGspOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPnhwbTFhX2NudF9ibGsuYWRkcmVzcykpIHsKIAkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTFhX2NudF9ibGssCi0JCQlsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYV9jbnRfYmxrKTsKKwkJCWxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAorCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYV9jbnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0xYl9jbnRfYmxrLmFkZHJlc3MpKSB7CiAJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYl9jbnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0xX2NudF9sZW4sIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMWJfY250X2Jsayk7CisJCQlsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKKwkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMWJfY250X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSB7CiAJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0yX2NudF9ibGssCi0JCQlsb2NhbF9mYWR0LT5wbTJfY250X2xlbiwgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0yX2NudF9ibGspOworCQkJbG9jYWxfZmFkdC0+cG0yX2NudF9sZW4sCisJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTJfY250X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtX3Rtcl9ibGsuYWRkcmVzcykpIHsKIAkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbV90bXJfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG1fdG1fbGVuLCAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbV90bXJfYmxrKTsKKwkJCWxvY2FsX2ZhZHQtPnBtX3RtX2xlbiwKKwkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtX3Rtcl9ibGspOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPnhncGUwX2Jsay5hZGRyZXNzKSkgewpAQCAtMzk5LDE4ICs0MjksMjQgQEAKIAogCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZhY3BpX2dibF94cG0xYV9lbmFibGUsCiAJCSh1OCkgQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pLAotCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzICsKKwkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCShsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MgKwogCQkJQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pKSk7Ci0JYWNwaV9nYmxfeHBtMWFfZW5hYmxlLmFkZHJlc3Nfc3BhY2VfaWQgPSBsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3Nfc3BhY2VfaWQ7CisKKwlhY3BpX2dibF94cG0xYV9lbmFibGUuYWRkcmVzc19zcGFjZV9pZCA9CisJCWxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzc19zcGFjZV9pZDsKIAogCS8qIFBNMUIgaXMgb3B0aW9uYWw7IGxlYXZlIG51bGwgaWYgbm90IHByZXNlbnQgKi8KIAogCWlmIChsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MpIHsKIAkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSwKIAkJCSh1OCkgQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pLAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcyArCisJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCShsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MgKwogCQkJCUFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSkpOwotCQlhY3BpX2dibF94cG0xYl9lbmFibGUuYWRkcmVzc19zcGFjZV9pZCA9IGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzc19zcGFjZV9pZDsKKworCQlhY3BpX2dibF94cG0xYl9lbmFibGUuYWRkcmVzc19zcGFjZV9pZCA9CisJCQlsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3Nfc3BhY2VfaWQ7CiAJfQogfQogCkBAIC00MzIsNyArNDY4LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCAodm9pZCkKK2FjcGlfdGJfY29udmVydF90YWJsZV9mYWR0ICgKKwl2b2lkKQogewogCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAgICAqbG9jYWxfZmFkdDsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgKnRhYmxlX2Rlc2M7CkBAIC00NDYsNyArNDgzLDggQEAKIAkgKiBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSB2ZXJzaW9uIDEuMCBGQURUCiAJICovCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA8IHNpemVvZiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJGQURUIGlzIGludmFsaWQsIHRvbyBzaG9ydDogMHglWFxuIiwgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoIkZBRFQgaXMgaW52YWxpZCwgdG9vIHNob3J0OiAweCVYXG4iLAorCQkJYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOwogCX0KIApAQCAtNDYxLDggKzQ5OSw5IEBACiAJCWlmIChhY3BpX2dibF9GQURULT5sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MikpIHsKIAkJCS8qIExlbmd0aCBpcyB0b28gc2hvcnQgdG8gYmUgYSBWMi4wIHRhYmxlICovCiAKLQkJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiSW5jb25zaXN0ZW50IEZBRFQgbGVuZ3RoICgweCVYKSBhbmQgcmV2aXNpb24gKDB4JVgpLCB1c2luZyBGQURUIFYxLjAgcG9ydGlvbiBvZiB0YWJsZVxuIiwKLQkJCQkJIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCwgYWNwaV9nYmxfRkFEVC0+cmV2aXNpb24pKTsKKwkJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKKwkJCQkiSW5jb25zaXN0ZW50IEZBRFQgbGVuZ3RoICgweCVYKSBhbmQgcmV2aXNpb24gKDB4JVgpLCB1c2luZyBGQURUIFYxLjAgcG9ydGlvbiBvZiB0YWJsZVxuIiwKKwkJCQlhY3BpX2dibF9GQURULT5sZW5ndGgsIGFjcGlfZ2JsX0ZBRFQtPnJldmlzaW9uKSk7CiAKIAkJCWFjcGlfdGJfY29udmVydF9mYWR0MSAobG9jYWxfZmFkdCwgKHZvaWQgKikgYWNwaV9nYmxfRkFEVCk7CiAJCX0KQEAgLTQ3OCw5ICs1MTcsOCBAQAogCQlhY3BpX3RiX2NvbnZlcnRfZmFkdDEgKGxvY2FsX2ZhZHQsICh2b2lkICopIGFjcGlfZ2JsX0ZBRFQpOwogCX0KIAotCS8qCi0JICogR2xvYmFsIEZBRFQgcG9pbnRlciB3aWxsIHBvaW50IHRvIHRoZSBuZXcgY29tbW9uIFYyLjAgRkFEVAotCSAqLworCS8qIEdsb2JhbCBGQURUIHBvaW50ZXIgd2lsbCBwb2ludCB0byB0aGUgbmV3IGNvbW1vbiBWMi4wIEZBRFQgKi8KKwogCWFjcGlfZ2JsX0ZBRFQgPSBsb2NhbF9mYWR0OwogCWFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA9IHNpemVvZiAoRkFEVF9ERVNDUklQVE9SKTsKIApAQCAtNTA4LDcgKzU0Niw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfY29udmVydF90YWJsZV9mYWNzCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcwogICoKICAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmZvICAgICAgLSBJbmZvIGZvciBjdXJyZW50bHkgaW5zdGFsbGVkIEZBQ1MKICAqCkBAIC01MzAsMTIgKzU2OCwxNCBAQAogCS8qIEFic29sdXRlIG1pbmltdW0gbGVuZ3RoIGlzIDI0LCBidXQgdGhlIEFDUEkgc3BlYyBzYXlzIDY0ICovCiAKIAlpZiAoYWNwaV9nYmxfRkFDUy0+bGVuZ3RoIDwgMjQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCBGQUNTIHRhYmxlIGxlbmd0aDogMHglWFxuIiwgYWNwaV9nYmxfRkFDUy0+bGVuZ3RoKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgRkFDUyB0YWJsZSBsZW5ndGg6IDB4JVhcbiIsCisJCQlhY3BpX2dibF9GQUNTLT5sZW5ndGgpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7CiAJfQogCiAJaWYgKGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCA8IDY0KSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiRkFDUyBpcyBzaG9ydGVyIHRoYW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiBhbGxvd3M6IDB4JVgsIHVzaW5nIGFueXdheVxuIiwKKwkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAorCQkJIkZBQ1MgaXMgc2hvcnRlciB0aGFuIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gYWxsb3dzOiAweCVYLCB1c2luZyBhbnl3YXlcbiIsCiAJCQlhY3BpX2dibF9GQUNTLT5sZW5ndGgpKTsKIAl9CiAKQEAgLTU0OCw3ICs1ODgsOCBAQAogCQkoIShhY3BpX2dibF9GQUNTLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpKSB7CiAJCS8qIEFDUEkgMS4wIEZBQ1Mgb3Igc2hvcnQgdGFibGUgb3Igb3B0aW9uYWwgWF8gZmllbGQgaXMgemVybyAqLwogCi0JCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IgPSBBQ1BJX0NBU1RfUFRSICh1NjQsICYoYWNwaV9nYmxfRkFDUy0+ZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpOworCQlhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gQUNQSV9DQVNUX1BUUiAodTY0LAorCQkJCSYoYWNwaV9nYmxfRkFDUy0+ZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpOwogCQlhY3BpX2dibF9jb21tb25fZkFDUy52ZWN0b3Jfd2lkdGggPSAzMjsKIAl9CiAJZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKaW5kZXggODk2ZjNkZC4uNGFiMmFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYwpAQCAtNDksNiArNDksMTkgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJnZXQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV90Yl9nZXRfdGhpc190YWJsZSAoCisJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV90Yl90YWJsZV9vdmVycmlkZSAoCisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyLAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzYsOSArODksOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9nZXRfdGFibGUiKTsKIAogCi0JLyoKLQkgKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBnZXQgc2lnbmF0dXJlIGFuZCB0YWJsZSBzaXplCi0JICovCisJLyogR2V0IHRoZSBoZWFkZXIgaW4gb3JkZXIgdG8gZ2V0IHNpZ25hdHVyZSBhbmQgdGFibGUgc2l6ZSAqLworCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyIChhZGRyZXNzLCAmaGVhZGVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTEyNyw4ICsxMzksOCBAQAogCiAKIAkvKgotCSAqIEZsYWdzIGNvbnRhaW5zIHRoZSBjdXJyZW50IHByb2Nlc3NvciBtb2RlIChWaXJ0dWFsIG9yIFBoeXNpY2FsIGFkZHJlc3NpbmcpCi0JICogVGhlIHBvaW50ZXJfdHlwZSBpcyBlaXRoZXIgTG9naWNhbCBvciBQaHlzaWNhbAorCSAqIEZsYWdzIGNvbnRhaW5zIHRoZSBjdXJyZW50IHByb2Nlc3NvciBtb2RlIChWaXJ0dWFsIG9yIFBoeXNpY2FsCisJICogYWRkcmVzc2luZykgVGhlIHBvaW50ZXJfdHlwZSBpcyBlaXRoZXIgTG9naWNhbCBvciBQaHlzaWNhbAogCSAqLwogCXN3aXRjaCAoYWRkcmVzcy0+cG9pbnRlcl90eXBlKSB7CiAJY2FzZSBBQ1BJX1BIWVNNT0RFX1BIWVNQVFI6CkBAIC0xMzYsNyArMTQ4LDggQEAKIAogCQkvKiBQb2ludGVyIG1hdGNoZXMgcHJvY2Vzc29yIG1vZGUsIGNvcHkgdGhlIGhlYWRlciAqLwogCi0JCUFDUElfTUVNQ1BZIChyZXR1cm5faGVhZGVyLCBhZGRyZXNzLT5wb2ludGVyLmxvZ2ljYWwsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCUFDUElfTUVNQ1BZIChyZXR1cm5faGVhZGVyLCBhZGRyZXNzLT5wb2ludGVyLmxvZ2ljYWwsCisJCQlzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQlicmVhazsKIAogCkBAIC0xNDQsMTAgKzE1NywxMSBAQAogCiAJCS8qIENyZWF0ZSBhIGxvZ2ljYWwgYWRkcmVzcyBmb3IgdGhlIHBoeXNpY2FsIHBvaW50ZXIqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpLAotCQkJCSAgKHZvaWQgKikgJmhlYWRlcik7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwKKwkJCQkgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpLCAodm9pZCAqKSAmaGVhZGVyKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYXG4iLAogCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCksCiAJCQkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0yMTAsOSArMjI0LDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKgotCSAqIEF0dGVtcHQgdGFibGUgb3ZlcnJpZGUuCi0JICovCisJLyogQXR0ZW1wdCB0YWJsZSBvdmVycmlkZS4gKi8KKwogCXN0YXR1cyA9IGFjcGlfdGJfdGFibGVfb3ZlcnJpZGUgKGhlYWRlciwgdGFibGVfaW5mbyk7CiAJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewogCQkvKiBUYWJsZSB3YXMgb3ZlcnJpZGRlbiBieSB0aGUgaG9zdCBPUyAqLwpAQCAtMjQxLDcgKzI1NCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV90Yl90YWJsZV9vdmVycmlkZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyLAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pCkBAIC0zMTUsNyArMzI4LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2dldF90aGlzX3RhYmxlICgKIAlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKQEAgLTMzMCw4ICszNDMsOCBAQAogCiAKIAkvKgotCSAqIEZsYWdzIGNvbnRhaW5zIHRoZSBjdXJyZW50IHByb2Nlc3NvciBtb2RlIChWaXJ0dWFsIG9yIFBoeXNpY2FsIGFkZHJlc3NpbmcpCi0JICogVGhlIHBvaW50ZXJfdHlwZSBpcyBlaXRoZXIgTG9naWNhbCBvciBQaHlzaWNhbAorCSAqIEZsYWdzIGNvbnRhaW5zIHRoZSBjdXJyZW50IHByb2Nlc3NvciBtb2RlIChWaXJ0dWFsIG9yIFBoeXNpY2FsCisJICogYWRkcmVzc2luZykgVGhlIHBvaW50ZXJfdHlwZSBpcyBlaXRoZXIgTG9naWNhbCBvciBQaHlzaWNhbAogCSAqLwogCXN3aXRjaCAoYWRkcmVzcy0+cG9pbnRlcl90eXBlKSB7CiAJY2FzZSBBQ1BJX1BIWVNNT0RFX1BIWVNQVFI6CkBAIC0zNDEsNyArMzU0LDggQEAKIAogCQlmdWxsX3RhYmxlID0gQUNQSV9NRU1fQUxMT0NBVEUgKGhlYWRlci0+bGVuZ3RoKTsKIAkJaWYgKCFmdWxsX3RhYmxlKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgYWxsb2NhdGUgdGFibGUgbWVtb3J5IGZvciBbJTQuNHNdIGxlbmd0aCAlWFxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZSB0YWJsZSBtZW1vcnkgZm9yIFslNC40c10gbGVuZ3RoICVYXG4iLAogCQkJCWhlYWRlci0+c2lnbmF0dXJlLCBoZWFkZXItPmxlbmd0aCkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwogCQl9CkBAIC0zNjIsMTIgKzM3NiwxNCBAQAogCQkgKiBKdXN0IG1hcCB0aGUgdGFibGUncyBwaHlzaWNhbCBtZW1vcnkKIAkJICogaW50byBvdXIgYWRkcmVzcyBzcGFjZS4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwgKGFjcGlfc2l6ZSkgaGVhZGVyLT5sZW5ndGgsCi0JCQkJICAodm9pZCAqKSAmZnVsbF90YWJsZSk7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwKKwkJCQkgKGFjcGlfc2l6ZSkgaGVhZGVyLT5sZW5ndGgsICh2b2lkICopICZmdWxsX3RhYmxlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IG1hcCBtZW1vcnkgZm9yIHRhYmxlIFslNC40c10gYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgZm9yIHRhYmxlIFslNC40c10gYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYXG4iLAogCQkJCWhlYWRlci0+c2lnbmF0dXJlLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCksIGhlYWRlci0+bGVuZ3RoKSk7CisJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsKSwKKwkJCQloZWFkZXItPmxlbmd0aCkpOwogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAKQEAgLTQ2NSw5ICs0ODEsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIAl9CiAKLQkvKgotCSAqIENoZWNrIGZvciBpbnN0YW5jZSBvdXQgb2YgcmFuZ2UKLQkgKi8KKwkvKiBDaGVjayBmb3IgaW5zdGFuY2Ugb3V0IG9mIHJhbmdlICovCisKIAlpZiAoaW5zdGFuY2UgPiBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5jb3VudCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jCmluZGV4IGFkYzQyNzAuLmVlYTViOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMKQEAgLTQ5LDYgKzQ5LDE5IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRiZ2V0YWxsIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfZ2V0X3ByaW1hcnlfdGFibGUgKAorCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlICgKKwlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAorCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjMsNyArNzYsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdGJfZ2V0X3ByaW1hcnlfdGFibGUgKAogCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKQEAgLTgxLDkgKzk0LDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJfQogCi0JLyoKLQkgKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBnZXQgc2lnbmF0dXJlIGFuZCB0YWJsZSBzaXplCi0JICovCisJLyogR2V0IHRoZSBoZWFkZXIgaW4gb3JkZXIgdG8gZ2V0IHNpZ25hdHVyZSBhbmQgdGFibGUgc2l6ZSAqLworCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyIChhZGRyZXNzLCAmaGVhZGVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTEzMCw3ICsxNDIsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoCiAJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKIAlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKQEAgLTE1Myw3ICsxNjUsOCBAQAogCS8qIFNpZ25hdHVyZSBtdXN0IG1hdGNoIHJlcXVlc3QgKi8KIAogCWlmIChBQ1BJX1NUUk5DTVAgKGhlYWRlci5zaWduYXR1cmUsIHNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkluY29ycmVjdCB0YWJsZSBzaWduYXR1cmUgLSB3YW50ZWQgWyVzXSBmb3VuZCBbJTQuNHNdXG4iLAorCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJIkluY29ycmVjdCB0YWJsZSBzaWduYXR1cmUgLSB3YW50ZWQgWyVzXSBmb3VuZCBbJTQuNHNdXG4iLAogCQkJc2lnbmF0dXJlLCBoZWFkZXIuc2lnbmF0dXJlKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1NJR05BVFVSRSk7CiAJfQpAQCAtMjMwLDcgKzI0Myw4IEBACiAJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQ7IGkrKykgewogCQkvKiBHZXQgdGhlIHRhYmxlIGFkZHJlc3MgZnJvbSB0aGUgY29tbW9uIGludGVybmFsIFhTRFQgKi8KIAotCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9YU0RULT50YWJsZV9vZmZzZXRfZW50cnlbaV07CisJCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9CisJCQkJICBhY3BpX2dibF9YU0RULT50YWJsZV9vZmZzZXRfZW50cnlbaV07CiAKIAkJLyoKIAkJICogR2V0IHRoZSB0YWJsZXMgbmVlZGVkIGJ5IHRoaXMgc3Vic3lzdGVtIChGQURUIGFuZCBhbnkgU1NEVHMpLgpAQCAtMjUyLDE4ICsyNjYsMTggQEAKIAl9CiAKIAkvKgotCSAqIENvbnZlcnQgdGhlIEZBRFQgdG8gYSBjb21tb24gZm9ybWF0LiAgVGhpcyBhbGxvd3MgZWFybGllciByZXZpc2lvbnMgb2YgdGhlCi0JICogdGFibGUgdG8gY29leGlzdCB3aXRoIG5ld2VyIHZlcnNpb25zLCB1c2luZyBjb21tb24gYWNjZXNzIGNvZGUuCisJICogQ29udmVydCB0aGUgRkFEVCB0byBhIGNvbW1vbiBmb3JtYXQuICBUaGlzIGFsbG93cyBlYXJsaWVyIHJldmlzaW9ucyBvZgorCSAqIHRoZSB0YWJsZSB0byBjb2V4aXN0IHdpdGggbmV3ZXIgdmVyc2lvbnMsIHVzaW5nIGNvbW1vbiBhY2Nlc3MgY29kZS4KIAkgKi8KIAlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCAoKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBjb252ZXJ0IEZBRFQgdG8gaW50ZXJuYWwgY29tbW9uIGZvcm1hdFxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJIkNvdWxkIG5vdCBjb252ZXJ0IEZBRFQgdG8gaW50ZXJuYWwgY29tbW9uIGZvcm1hdFxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCi0JLyoKLQkgKiBHZXQgdGhlIEZBQ1MgKFBvaW50ZWQgdG8gYnkgdGhlIEZBRFQpCi0JICovCisJLyogR2V0IHRoZSBGQUNTIChQb2ludGVkIHRvIGJ5IHRoZSBGQURUKSAqLworCiAJYWRkcmVzcy5wb2ludGVyLnZhbHVlID0gYWNwaV9nYmxfRkFEVC0+eGZpcm13YXJlX2N0cmw7CiAKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUgKCZhZGRyZXNzLCBGQUNTX1NJRywgJnRhYmxlX2luZm8pOwpAQCAtMjgyLDkgKzI5Niw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQkvKgotCSAqIEdldC9pbnN0YWxsIHRoZSBEU0RUIChQb2ludGVkIHRvIGJ5IHRoZSBGQURUKQotCSAqLworCS8qIEdldC9pbnN0YWxsIHRoZSBEU0RUIChQb2ludGVkIHRvIGJ5IHRoZSBGQURUKSAqLworCiAJYWRkcmVzcy5wb2ludGVyLnZhbHVlID0gYWNwaV9nYmxfRkFEVC0+WGRzZHQ7CiAKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUgKCZhZGRyZXNzLCBEU0RUX1NJRywgJnRhYmxlX2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jCmluZGV4IDg1ZDViYjAuLjYyOWI2NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKQEAgLTQ5LDYgKzQ5LDE0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRiaW5zdGFsIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaWduYXR1cmUsCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF90eXBlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU2LDYgKzY0LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgU2lnbmF0dXJlICAgICAgICAgICAtIFRhYmxlIHNpZ25hdHVyZSB0byBtYXRjaAogICogICAgICAgICAgICAgIHRhYmxlX2luZm8gICAgICAgICAgLSBSZXR1cm4gZGF0YQorICogICAgICAgICAgICAgIHNlYXJjaF90eXBlICAgICAgICAgLSBUYWJsZSB0eXBlIHRvIG1hdGNoIChwcmltYXJ5L3NlY29uZGFyeSkKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNjQsNyArNzMsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaWduYXR1cmUsCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKQEAgLTc2LDkgKzg1LDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfbWF0Y2hfc2lnbmF0dXJlIik7CiAKIAotCS8qCi0JICogU2VhcmNoIGZvciBhIHNpZ25hdHVyZSBtYXRjaCBhbW9uZyB0aGUga25vd24gdGFibGUgdHlwZXMKLQkgKi8KKwkvKiBTZWFyY2ggZm9yIGEgc2lnbmF0dXJlIG1hdGNoIGFtb25nIHRoZSBrbm93biB0YWJsZSB0eXBlcyAqLworCiAJZm9yIChpID0gMDsgaSA8IE5VTV9BQ1BJX1RBQkxFX1RZUEVTOyBpKyspIHsKIAkJaWYgKCEoYWNwaV9nYmxfdGFibGVfZGF0YVtpXS5mbGFncyAmIHNlYXJjaF90eXBlKSkgewogCQkJY29udGludWU7CkBAIC0xNjEsNiArMTY5LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3JlY29nbml6ZV90YWJsZQogICoKICAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmZvICAgICAgICAgIC0gUmV0dXJuIHZhbHVlIGZyb20gYWNwaV90Yl9nZXRfdGFibGVfYm9keQorICogICAgICAgICAgICAgIHNlYXJjaF90eXBlICAgICAgICAgLSBUYWJsZSB0eXBlIHRvIG1hdGNoIChwcmltYXJ5L3NlY29uZGFyeSkKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjAzLDcgKzIxMiw4IEBACiAJICogVGhpcyBjYW4gYmUgYW55IG9uZSBvZiBtYW55IHZhbGlkIEFDUEkgdGFibGVzLCBpdCBqdXN0IGlzbid0IG9uZSBvZgogCSAqIHRoZSB0YWJsZXMgdGhhdCBpcyBjb25zdW1lZCBieSB0aGUgY29yZSBzdWJzeXN0ZW0KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3RiX21hdGNoX3NpZ25hdHVyZSAodGFibGVfaGVhZGVyLT5zaWduYXR1cmUsIHRhYmxlX2luZm8sIHNlYXJjaF90eXBlKTsKKwlzdGF0dXMgPSBhY3BpX3RiX21hdGNoX3NpZ25hdHVyZSAodGFibGVfaGVhZGVyLT5zaWduYXR1cmUsCisJCQkgdGFibGVfaW5mbywgc2VhcmNoX3R5cGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTI1Myw5ICsyNjMsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJfQogCi0JLyoKLQkgKiBJbnN0YWxsIHRoZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBJbnN0YWxsIHRoZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgKi8KKwogCWxpc3RfaGVhZCA9ICZhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXTsKIAogCS8qCkBAIC0zMTYsNyArMzI1LDggQEAKIAl0YWJsZV9kZXNjLT5hbWxfc3RhcnQgICAgICAgICAgID0gKHU4ICopICh0YWJsZV9kZXNjLT5wb2ludGVyICsgMSksCiAJdGFibGVfZGVzYy0+YW1sX2xlbmd0aCAgICAgICAgICA9ICh1MzIpICh0YWJsZV9kZXNjLT5sZW5ndGggLQogCQkJICh1MzIpIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JdGFibGVfZGVzYy0+dGFibGVfaWQgICAgICAgICAgICA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQgKEFDUElfT1dORVJfVFlQRV9UQUJMRSk7CisJdGFibGVfZGVzYy0+dGFibGVfaWQgICAgICAgICAgICA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQgKAorCQkJIEFDUElfT1dORVJfVFlQRV9UQUJMRSk7CiAJdGFibGVfZGVzYy0+bG9hZGVkX2ludG9fbmFtZXNwYWNlID0gRkFMU0U7CiAKIAkvKgpAQCAtMzQ5LDcgKzM1OSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzICh2b2lkKQorYWNwaV90Yl9kZWxldGVfYWxsX3RhYmxlcyAoCisJdm9pZCkKIHsKIAlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHR5cGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCmluZGV4IDljNjkxMzIuLmI3ZmZlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYwpAQCAtODQsOCArODQsOSBAQAogCQkvKgogCQkgKiBPYnRhaW4gYWNjZXNzIHRvIHRoZSBSU0RQIHN0cnVjdHVyZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLCBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpLAotCQkJCSAgKHZvaWQgKikgJnJzZHApOworCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCisJCQkJIHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciksCisJCQkJCQkgICAodm9pZCAqKSAmcnNkcCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQpAQCAtMTU0LDkgKzE1NSw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcwogICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCisgKiBQQVJBTUVURVJTOiAgb3V0X2FkZHJlc3MgICAgICAgICAtIFdoZXJlIHRoZSBhZGRyZXNzIGlzIHJldHVybmVkCiAgKgotICogUkVUVVJOOiAgICAgIFJTRFQgcGh5c2ljYWwgYWRkcmVzcworICogUkVUVVJOOiAgICAgIE5vbmUsIEFkZHJlc3MKICAqCiAgKiBERVNDUklQVElPTjogRXh0cmFjdCB0aGUgYWRkcmVzcyBvZiB0aGUgUlNEVCBvciBYU0RULCBkZXBlbmRpbmcgb24gdGhlCiAgKiAgICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgUlNEUApAQCAtMTgxLDcgKzE4Miw4IEBACiAJCW91dF9hZGRyZXNzLT5wb2ludGVyLnZhbHVlID0gYWNwaV9nYmxfUlNEUC0+cnNkdF9waHlzaWNhbF9hZGRyZXNzOwogCX0KIAllbHNlIHsKLQkJb3V0X2FkZHJlc3MtPnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9SU0RQLT54c2R0X3BoeXNpY2FsX2FkZHJlc3M7CisJCW91dF9hZGRyZXNzLT5wb2ludGVyLnZhbHVlID0KKwkJCWFjcGlfZ2JsX1JTRFAtPnhzZHRfcGh5c2ljYWxfYWRkcmVzczsKIAl9CiB9CiAKQEAgLTIyNCw3ICsyMjYsOCBAQAogCWlmIChub19tYXRjaCkgewogCQkvKiBJbnZhbGlkIFJTRFQgb3IgWFNEVCBzaWduYXR1cmUgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIHNpZ25hdHVyZSB3aGVyZSBSU0RQIGluZGljYXRlcyBSU0RUL1hTRFQgc2hvdWxkIGJlIGxvY2F0ZWRcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJJbnZhbGlkIHNpZ25hdHVyZSB3aGVyZSBSU0RQIGluZGljYXRlcyBSU0RUL1hTRFQgc2hvdWxkIGJlIGxvY2F0ZWRcbiIpKTsKIAogCQlBQ1BJX0RVTVBfQlVGRkVSIChhY3BpX2dibF9SU0RQLCAyMCk7CiAKQEAgLTI4Miw2ICsyODUsNyBAQAogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJDb3VsZCBub3QgZ2V0IHRoZSBSU0RUL1hTRFQsICVzXG4iLAogCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIApAQCAtMjk5LDcgKzMwMyw4IEBACiAKIAkvKiBHZXQgdGhlIG51bWJlciBvZiB0YWJsZXMgZGVmaW5lZCBpbiB0aGUgUlNEVCBvciBYU0RUICovCiAKLQlhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50ID0gYWNwaV90Yl9nZXRfdGFibGVfY291bnQgKGFjcGlfZ2JsX1JTRFAsIHRhYmxlX2luZm8ucG9pbnRlcik7CisJYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCA9IGFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50IChhY3BpX2dibF9SU0RQLAorCQkJICB0YWJsZV9pbmZvLnBvaW50ZXIpOwogCiAJLyogQ29udmVydCBhbmQvb3IgY29weSB0byBhbiBYU0RUIHN0cnVjdHVyZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCmluZGV4IGZlZGU1ODAuLmU2OWQwMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCkBAIC00OSw0OCArNDksMTQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJ1dGlscyIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHRhYmxlX2lkICAgICAgICAgICAgLSBJZCBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIHNlYXJjaGluZwotICogICAgICAgICAgICAgIHRhYmxlX2Rlc2MgICAgICAgICAgLSBQb2ludGVyIHRvIHJldHVybiB0aGUgbWF0Y2hpbmcgdGFibGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLgotICoKLSAqIFJFVFVSTjogICAgICBTZWFyY2ggdGhlIHRhYmxlcyB0byBmaW5kIG9uZSB3aXRoIGEgbWF0Y2hpbmcgdGFibGVfaWQgYW5kCi0gKiAgICAgICAgICAgICAgcmV0dXJuIGEgcG9pbnRlciB0byB0aGF0IHRhYmxlIGRlc2NyaXB0b3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiBhY3BpX3N0YXR1cwogYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0ICgKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKipyZXR1cm5fdGFibGVfZGVzYykKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYzsKLQotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgidGJfaGFuZGxlX3RvX29iamVjdCIpOwotCi0KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9UQUJMRV9NQVg7IGkrKykgewotCQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0ubmV4dDsKLQkJd2hpbGUgKHRhYmxlX2Rlc2MpIHsKLQkJCWlmICh0YWJsZV9kZXNjLT50YWJsZV9pZCA9PSB0YWJsZV9pZCkgewotCQkJCSpyZXR1cm5fdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2M7Ci0JCQkJcmV0dXJuIChBRV9PSyk7Ci0JCQl9Ci0KLQkJCXRhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OwotCQl9Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJ0YWJsZV9pZD0lWCBkb2VzIG5vdCBleGlzdFxuIiwgdGFibGVfaWQpKTsKLQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqKnRhYmxlX2Rlc2MpOworI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyOCw2ICs5NCw3IEBACiAJaWYgKCFhY3BpX29zX3JlYWRhYmxlICh0YWJsZV9oZWFkZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCiAJCQkiQ2Fubm90IHJlYWQgdGFibGUgaGVhZGVyIGF0ICVwXG4iLCB0YWJsZV9oZWFkZXIpKTsKKwogCQlyZXR1cm4gKEFFX0JBRF9BRERSRVNTKTsKIAl9CiAKQEAgLTE0MSw2ICsxMDgsNyBAQAogCiAJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiSW52YWxpZCB0YWJsZSBzaWduYXR1cmUgZm91bmQ6IFslNC40c11cbiIsCiAJCQkoY2hhciAqKSAmc2lnbmF0dXJlKSk7CisKIAkJQUNQSV9EVU1QX0JVRkZFUiAodGFibGVfaGVhZGVyLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQlyZXR1cm4gKEFFX0JBRF9TSUdOQVRVUkUpOwogCX0KQEAgLTE1NCw2ICsxMjIsNyBAQAogCiAJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiSW52YWxpZCB0YWJsZSBoZWFkZXIgbGVuZ3RoICgweCVYKSBmb3VuZFxuIiwKIAkJCSh1MzIpIHRhYmxlX2hlYWRlci0+bGVuZ3RoKSk7CisKIAkJQUNQSV9EVU1QX0JVRkZFUiAodGFibGVfaGVhZGVyLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQlyZXR1cm4gKEFFX0JBRF9IRUFERVIpOwogCX0KQEAgLTE5Myw4ICsxNjIsMTAgQEAKIAkvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiAqLwogCiAJaWYgKGNoZWNrc3VtKSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiSW52YWxpZCBjaGVja3N1bSBpbiB0YWJsZSBbJTQuNHNdICglMDJYLCBzdW0gJTAyWCBpcyBub3QgemVybylcbiIsCi0JCQl0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwgKHUzMikgdGFibGVfaGVhZGVyLT5jaGVja3N1bSwgKHUzMikgY2hlY2tzdW0pKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAorCQkJIkludmFsaWQgY2hlY2tzdW0gaW4gdGFibGUgWyU0LjRzXSAoJTAyWCwgc3VtICUwMlggaXMgbm90IHplcm8pXG4iLAorCQkJdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsICh1MzIpIHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0sCisJCQkodTMyKSBjaGVja3N1bSkpOwogCiAJCXN0YXR1cyA9IEFFX0JBRF9DSEVDS1NVTTsKIAl9CkBAIC0yMDksNyArMTgwLDcgQEAKICAqIFBBUkFNRVRFUlM6ICBCdWZmZXIgICAgICAgICAgICAgIC0gQnVmZmVyIHRvIGNoZWNrc3VtCiAgKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAtIFNpemUgb2YgdGhlIGJ1ZmZlcgogICoKLSAqIFJFVFVSTlMgICAgICA4IGJpdCBjaGVja3N1bSBvZiBidWZmZXIKKyAqIFJFVFVSTjogICAgICA4IGJpdCBjaGVja3N1bSBvZiBidWZmZXIKICAqCiAgKiBERVNDUklQVElPTjogQ29tcHV0ZXMgYW4gOCBiaXQgY2hlY2tzdW0gb2YgdGhlIGJ1ZmZlcihsZW5ndGgpIGFuZCByZXR1cm5zIGl0LgogICoKQEAgLTIzOCwzICsyMDksNDcgQEAKIH0KIAogCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaGFuZGxlX3RvX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pZCAgICAgICAgICAgIC0gSWQgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBzZWFyY2hpbmcKKyAqICAgICAgICAgICAgICB0YWJsZV9kZXNjICAgICAgICAgIC0gUG9pbnRlciB0byByZXR1cm4gdGhlIG1hdGNoaW5nIHRhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci4KKyAqCisgKiBSRVRVUk46ICAgICAgU2VhcmNoIHRoZSB0YWJsZXMgdG8gZmluZCBvbmUgd2l0aCBhIG1hdGNoaW5nIHRhYmxlX2lkIGFuZAorICogICAgICAgICAgICAgIHJldHVybiBhIHBvaW50ZXIgdG8gdGhhdCB0YWJsZSBkZXNjcmlwdG9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3RiX2hhbmRsZV90b19vYmplY3QgKAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfaWQsCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqKnJldHVybl90YWJsZV9kZXNjKQoreworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjOworCisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ0Yl9oYW5kbGVfdG9fb2JqZWN0Iik7CisKKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RBQkxFX01BWDsgaSsrKSB7CisJCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1tpXS5uZXh0OworCQl3aGlsZSAodGFibGVfZGVzYykgeworCQkJaWYgKHRhYmxlX2Rlc2MtPnRhYmxlX2lkID09IHRhYmxlX2lkKSB7CisJCQkJKnJldHVybl90YWJsZV9kZXNjID0gdGFibGVfZGVzYzsKKwkJCQlyZXR1cm4gKEFFX09LKTsKKwkJCX0KKworCQkJdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2MtPm5leHQ7CisJCX0KKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgInRhYmxlX2lkPSVYIGRvZXMgbm90IGV4aXN0XG4iLCB0YWJsZV9pZCkpOworCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Cit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCmluZGV4IDc3MTUwNDMuLjBjMGI5MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCkBAIC02Nyw3ICs2Nyw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9sb2FkX3RhYmxlcyAodm9pZCkKK2FjcGlfbG9hZF90YWJsZXMgKAorCXZvaWQpCiB7CiAJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICByc2RwX2FkZHJlc3M7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CkBAIC04Miw3ICs4Myw3IEBACiAJCQkgICZyc2RwX2FkZHJlc3MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9sb2FkX3RhYmxlczogQ291bGQgbm90IGdldCBSU0RQLCAlc1xuIiwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKQEAgLTkzLDcgKzk0LDcgQEAKIAlzdGF0dXMgPSBhY3BpX3RiX3ZlcmlmeV9yc2RwICgmcnNkcF9hZGRyZXNzKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IFJTRFAgRmFpbGVkIHZhbGlkYXRpb246ICVzXG4iLAotCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIApAQCAtMTAyLDcgKzEwMyw3IEBACiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcnNkdCAoKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIFJTRFQ6ICVzXG4iLAotCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIApAQCAtMTEwLDIwICsxMTEsMjAgQEAKIAogCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyAoKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IEVycm9yIGdldHRpbmcgcmVxdWlyZWQgdGFibGVzIChEU0RUL0ZBRFQvRkFDUyk6ICVzXG4iLAotCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiYWNwaV9sb2FkX3RhYmxlczogRXJyb3IgZ2V0dGluZyByZXF1aXJlZCB0YWJsZXMgKERTRFQvRkFEVC9GQUNTKTogJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIAogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsICJBQ1BJIFRhYmxlcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWRcbiIpKTsKIAotCiAJLyogTG9hZCB0aGUgbmFtZXNwYWNlIGZyb20gdGhlIHRhYmxlcyAqLwogCiAJc3RhdHVzID0gYWNwaV9uc19sb2FkX25hbWVzcGFjZSAoKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIG5hbWVzcGFjZTogJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCkBAIC0xMzksNyArMTQwLDYgQEAKIAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9sb2FkX3RhYmxlCkBAIC0yNTAsNyArMjUwLDYgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQogCS8qIEZpbmQgYWxsIHRhYmxlcyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgKi8KIAogCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5uZXh0OwpAQCAtMzIxLDcgKzMyMCw2IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0KIAkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBlbnRpcmUgdGFibGUgKi8KIAogCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX3B0ciAodGFibGVfdHlwZSwgaW5zdGFuY2UsICZ0YmxfcHRyKTsKQEAgLTMyOSwyMyArMzI3LDIwIEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQkvKgotCSAqIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhIE5VTEwgcG9pbnRlciBpZiB0aGUgdGFibGUgaXMgbm90IGxvYWRlZAotCSAqLworCS8qIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhIE5VTEwgcG9pbnRlciBpZiB0aGUgdGFibGUgaXMgbm90IGxvYWRlZCAqLworCiAJaWYgKHRibF9wdHIgPT0gTlVMTCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CiAJfQogCi0JLyoKLQkgKiBDb3B5IHRoZSBoZWFkZXIgdG8gdGhlIGNhbGxlcidzIGJ1ZmZlcgotCSAqLworCS8qIENvcHkgdGhlIGhlYWRlciB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyICovCisKIAlBQ1BJX01FTUNQWSAoKHZvaWQgKikgb3V0X3RhYmxlX2hlYWRlciwgKHZvaWQgKikgdGJsX3B0ciwKLQkJCSBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogfQogCi0KICNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDA0LDcgKzM5OSw2IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0KIAkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBlbnRpcmUgdGFibGUgKi8KIAogCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX3B0ciAodGFibGVfdHlwZSwgaW5zdGFuY2UsICZ0YmxfcHRyKTsKQEAgLTQyMyw5ICs0MTcsOCBAQAogCS8qIEdldCB0aGUgdGFibGUgbGVuZ3RoICovCiAKIAlpZiAodGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1JTRFApIHsKLQkJLyoKLQkJICogIFJTRCBQVFIgaXMgdGhlIG9ubHkgInRhYmxlIiB3aXRob3V0IGEgaGVhZGVyCi0JCSAqLworCQkvKiBSU0QgUFRSIGlzIHRoZSBvbmx5ICJ0YWJsZSIgd2l0aG91dCBhIGhlYWRlciAqLworCiAJCXRhYmxlX2xlbmd0aCA9IHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvcik7CiAJfQogCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCmluZGV4IDZlODA3MmUuLmRjM2MzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKQEAgLTUwLDYgKzUwLDE4IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRieGZyb290IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfZmluZF9yc2RwICgKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCitzdGF0aWMgdTggKgorYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhcnRfYWRkcmVzcywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01Nyw3ICs2OSw4IEBACiAgKgogICogUEFSQU1FVEVSUzogIFNpZ25hdHVyZSAgICAgICAgICAgLSBTdHJpbmcgd2l0aCBBQ1BJIHRhYmxlIHNpZ25hdHVyZQogICogICAgICAgICAgICAgIG9lbV9pZCAgICAgICAgICAgICAgLSBTdHJpbmcgd2l0aCB0aGUgdGFibGUgT0VNIElECi0gKiAgICAgICAgICAgICAgb2VtX3RhYmxlX2lkICAgICAgICAtIFN0cmluZyB3aXRoIHRoZSBPRU0gVGFibGUgSUQuCisgKiAgICAgICAgICAgICAgb2VtX3RhYmxlX2lkICAgICAgICAtIFN0cmluZyB3aXRoIHRoZSBPRU0gVGFibGUgSUQKKyAqICAgICAgICAgICAgICB0YWJsZV9wdHIgICAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIHBvaW50ZXIgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtOTksMTQgKzExMiwxMyBAQAogCQlpZiAoIWFjcGlfZ2JsX0RTRFQpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOwogCQl9Ci0KIAkJdGFibGUgPSBhY3BpX2dibF9EU0RUOwogCX0KIAllbHNlIHsKIAkJLyogRmluZCB0aGUgdGFibGUgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2dldF9maXJtd2FyZV90YWJsZSAoc2lnbmF0dXJlLCAxLAotCQkJCSAgIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLCAmdGFibGUpOworCQkJCSBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywgJnRhYmxlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0xMTQsMTQgKzEyNiwxOSBAQAogCiAJLyogQ2hlY2sgb2VtX2lkIGFuZCBvZW1fdGFibGVfaWQgKi8KIAotCWlmICgob2VtX2lkWzBdICAgICAmJiBBQ1BJX1NUUk5DTVAgKAotCQkJIG9lbV9pZCwgdGFibGUtPm9lbV9pZCwgc2l6ZW9mICh0YWJsZS0+b2VtX2lkKSkpIHx8CisJaWYgKChvZW1faWRbMF0gJiYgQUNQSV9TVFJOQ01QICgKKwkJCSAgIG9lbV9pZCwgdGFibGUtPm9lbV9pZCwKKwkJCSAgIHNpemVvZiAodGFibGUtPm9lbV9pZCkpKSB8fAorCiAJCShvZW1fdGFibGVfaWRbMF0gJiYgQUNQSV9TVFJOQ01QICgKLQkJCQkgICBvZW1fdGFibGVfaWQsIHRhYmxlLT5vZW1fdGFibGVfaWQsIHNpemVvZiAodGFibGUtPm9lbV90YWJsZV9pZCkpKSkgeworCQkJCSAgIG9lbV90YWJsZV9pZCwgdGFibGUtPm9lbV90YWJsZV9pZCwKKwkJCQkgICBzaXplb2YgKHRhYmxlLT5vZW1fdGFibGVfaWQpKSkpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTkFNRV9OT1RfRk9VTkQpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1RBQkxFUywgIkZvdW5kIHRhYmxlIFslNC40c11cbiIsIHRhYmxlLT5zaWduYXR1cmUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsICJGb3VuZCB0YWJsZSBbJTQuNHNdXG4iLAorCQl0YWJsZS0+c2lnbmF0dXJlKSk7CisKIAkqdGFibGVfcHRyID0gdGFibGU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0xOTEsOCArMjA4LDggQEAKIAkJLyogTWFwIGFuZCB2YWxpZGF0ZSB0aGUgUlNEUCAqLwogCiAJCWlmICgoZmxhZ3MgJiBBQ1BJX01FTU9SWV9NT0RFKSA9PSBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORykgewotCQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLnBvaW50ZXIucGh5c2ljYWwsIHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciksCi0JCQkJCSAgKHZvaWQgKikgJmFjcGlfZ2JsX1JTRFApOworCQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLnBvaW50ZXIucGh5c2ljYWwsCisJCQkJCSBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpLCAodm9pZCAqKSAmYWNwaV9nYmxfUlNEUCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQkJfQpAQCAtMjAzLDcgKzIyMCw4IEBACiAKIAkJLyogVGhlIHNpZ25hdHVyZSBhbmQgY2hlY2tzdW0gbXVzdCBib3RoIGJlIGNvcnJlY3QgKi8KIAotCQlpZiAoQUNQSV9TVFJOQ01QICgoY2hhciAqKSBhY3BpX2dibF9SU0RQLCBSU0RQX1NJRywgc2l6ZW9mIChSU0RQX1NJRyktMSkgIT0gMCkgeworCQlpZiAoQUNQSV9TVFJOQ01QICgoY2hhciAqKSBhY3BpX2dibF9SU0RQLCBSU0RQX1NJRywKKwkJCQlzaXplb2YgKFJTRFBfU0lHKS0xKSAhPSAwKSB7CiAJCQkvKiBOb3BlLCBCQUQgU2lnbmF0dXJlICovCiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1NJR05BVFVSRSk7CkBAIC0zMTMsNyArMzMxLDggQEAKIAogCiBjbGVhbnVwOgotCWFjcGlfb3NfdW5tYXBfbWVtb3J5IChyc2R0X2luZm8tPnBvaW50ZXIsIChhY3BpX3NpemUpIHJzZHRfaW5mby0+cG9pbnRlci0+bGVuZ3RoKTsKKwlhY3BpX29zX3VubWFwX21lbW9yeSAocnNkdF9pbmZvLT5wb2ludGVyLAorCQkoYWNwaV9zaXplKSByc2R0X2luZm8tPnBvaW50ZXItPmxlbmd0aCk7CiAJQUNQSV9NRU1fRlJFRSAocnNkdF9pbmZvKTsKIAogCWlmIChoZWFkZXIpIHsKQEAgLTMzNSw4ICszNTQsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2ZpbmRfcm9vdF9wb2ludGVyCiAgKgotICogUEFSQU1FVEVSUzogICoqcnNkcF9hZGRyZXNzICAgICAgICAgIC0gV2hlcmUgdG8gcGxhY2UgdGhlIFJTRFAgYWRkcmVzcwotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgICAgIC0gTG9naWNhbC9QaHlzaWNhbCBhZGRyZXNzaW5nCisgKiBQQVJBTUVURVJTOiAgRmxhZ3MgICAgICAgICAgICAgICAgICAgLSBMb2dpY2FsL1BoeXNpY2FsIGFkZHJlc3NpbmcKKyAqICAgICAgICAgICAgICByc2RwX2FkZHJlc3MgICAgICAgICAgICAtIFdoZXJlIHRvIHBsYWNlIHRoZSBSU0RQIGFkZHJlc3MKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzLCBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBSU0RQCiAgKgpAQCAtMzYzLDYgKzM4Miw3IEBACiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJIlJTRFAgc3RydWN0dXJlIG5vdCBmb3VuZCwgJXMgRmxhZ3M9JVhcbiIsCiAJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIGZsYWdzKSk7CisKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCkBAIC0zODUsNyArNDA1LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OCAqCitzdGF0aWMgdTggKgogYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhcnRfYWRkcmVzcywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCkKQEAgLTQwNiw3ICs0MjYsOCBAQAogCQkgbWVtX3JvdmVyICs9IEFDUElfUlNEUF9TQ0FOX1NURVApIHsKIAkJLyogVGhlIHNpZ25hdHVyZSBhbmQgY2hlY2tzdW0gbXVzdCBib3RoIGJlIGNvcnJlY3QgKi8KIAotCQlpZiAoQUNQSV9TVFJOQ01QICgoY2hhciAqKSBtZW1fcm92ZXIsIFJTRFBfU0lHLCBzaXplb2YgKFJTRFBfU0lHKS0xKSAhPSAwKSB7CisJCWlmIChBQ1BJX1NUUk5DTVAgKChjaGFyICopIG1lbV9yb3ZlciwKKwkJCQlSU0RQX1NJRywgc2l6ZW9mIChSU0RQX1NJRykgLSAxKSAhPSAwKSB7CiAJCQkvKiBObyBzaWduYXR1cmUgbWF0Y2gsIGtlZXAgbG9va2luZyAqLwogCiAJCQljb250aW51ZTsKQEAgLTQ1MCw3ICs0NzEsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2ZpbmRfcnNkcAogICoKLSAqIFBBUkFNRVRFUlM6ICAqdGFibGVfaW5mbyAgICAgICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBpbmZvIGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5mbyAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgaW5mbyBpcyByZXR1cm5lZAogICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBtZW1vcnkgbW9kZSAobG9naWNhbCB2cy4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsIGFkZHJlc3NpbmcpCiAgKgpAQCAtNDY4LDcgKzQ4OSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV90Yl9maW5kX3JzZHAgKAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKQEAgLTQ4Myw0MyArNTA0LDQ5IEBACiAKIAogCS8qCi0JICogU2NhbiBzdXBwb3J0cyBlaXRoZXIgMSkgTG9naWNhbCBhZGRyZXNzaW5nIG9yIDIpIFBoeXNpY2FsIGFkZHJlc3NpbmcKKwkgKiBTY2FuIHN1cHBvcnRzIGVpdGhlciBsb2dpY2FsIGFkZHJlc3Npbmcgb3IgcGh5c2ljYWwgYWRkcmVzc2luZwogCSAqLwogCWlmICgoZmxhZ3MgJiBBQ1BJX01FTU9SWV9NT0RFKSA9PSBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORykgewotCQkvKgotCQkgKiAxYSkgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgRUJEQQotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5ICgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OLAotCQkJCSAgQUNQSV9FQkRBX1BUUl9MRU5HVEgsCi0JCQkJICAodm9pZCAqKSAmdGFibGVfcHRyKTsKKwkJLyogMWEpIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIEV4dGVuZGVkIEJJT1MgRGF0YSBBcmVhIChFQkRBKSAqLworCisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoCisJCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfRUJEQV9QVFJfTE9DQVRJT04sCisJCQkJIEFDUElfRUJEQV9QVFJfTEVOR1RILCAodm9pZCAqKSAmdGFibGVfcHRyKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCiAJCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsCiAJCQkJQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwgQUNQSV9FQkRBX1BUUl9MRU5HVEgpKTsKKwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CiAKIAkJQUNQSV9NT1ZFXzE2X1RPXzMyICgmcGh5c2ljYWxfYWRkcmVzcywgdGFibGVfcHRyKTsKLQkJcGh5c2ljYWxfYWRkcmVzcyA8PD0gNDsgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgc2VnbWVudCB0byBwaHlzaWNhbCBhZGRyZXNzICovCisKKwkJLyogQ29udmVydCBzZWdtZW50IHBhcnQgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLworCisJCXBoeXNpY2FsX2FkZHJlc3MgPDw9IDQ7CiAJCWFjcGlfb3NfdW5tYXBfbWVtb3J5ICh0YWJsZV9wdHIsIEFDUElfRUJEQV9QVFJfTEVOR1RIKTsKIAogCQkvKiBFQkRBIHByZXNlbnQ/ICovCiAKIAkJaWYgKHBoeXNpY2FsX2FkZHJlc3MgPiAweDQwMCkgewogCQkJLyoKLQkJCSAqIDFiKSBTZWFyY2ggRUJEQSBwYXJhZ3JhcGhzIChFQkRhIGlzIHJlcXVpcmVkIHRvIGJlIGEgbWluaW11bSBvZiAxX2sgbGVuZ3RoKQorCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCRGEgaXMgcmVxdWlyZWQgdG8gYmUgYQorCQkJICogICAgIG1pbmltdW0gb2YgMV9rIGxlbmd0aCkKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5ICgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBwaHlzaWNhbF9hZGRyZXNzLAotCQkJCQkgIEFDUElfRUJEQV9XSU5ET1dfU0laRSwKLQkJCQkJICAodm9pZCAqKSAmdGFibGVfcHRyKTsKKwkJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoCisJCQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBwaHlzaWNhbF9hZGRyZXNzLAorCQkJCQkgQUNQSV9FQkRBX1dJTkRPV19TSVpFLCAodm9pZCAqKSAmdGFibGVfcHRyKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsCiAJCQkJCXBoeXNpY2FsX2FkZHJlc3MsIEFDUElfRUJEQV9XSU5ET1dfU0laRSkpOworCiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQkJfQogCi0JCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwICh0YWJsZV9wdHIsIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CisJCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwICh0YWJsZV9wdHIsCisJCQkJCSAgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKIAkJCWFjcGlfb3NfdW5tYXBfbWVtb3J5ICh0YWJsZV9wdHIsIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CiAKIAkJCWlmIChtZW1fcm92ZXIpIHsKQEAgLTUyNyw3ICs1NTQsOCBAQAogCiAJCQkJcGh5c2ljYWxfYWRkcmVzcyArPSBBQ1BJX1BUUl9ESUZGIChtZW1fcm92ZXIsIHRhYmxlX3B0cik7CiAKLQkJCQl0YWJsZV9pbmZvLT5waHlzaWNhbF9hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzczsKKwkJCQl0YWJsZV9pbmZvLT5waHlzaWNhbF9hZGRyZXNzID0KKwkJCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzczsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIAkJCX0KIAkJfQpAQCAtNTM1LDEzICs1NjMsMTUgQEAKIAkJLyoKIAkJICogMikgU2VhcmNoIHVwcGVyIG1lbW9yeTogMTYtYnl0ZSBib3VuZGFyaWVzIGluIEUwMDAwaC1GRkZGRmgKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFLAotCQkJCSAgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFLAotCQkJCSAgKHZvaWQgKikgJnRhYmxlX3B0cik7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoCisJCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwKKwkJCQkgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFLCAodm9pZCAqKSAmdGFibGVfcHRyKTsKKwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKIAkJCQlBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSkpOworCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KIApAQCAtNTUxLDkgKzU4MSwxMSBAQAogCQlpZiAobWVtX3JvdmVyKSB7CiAJCQkvKiBGb3VuZCBpdCwgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCiAKLQkJCXBoeXNpY2FsX2FkZHJlc3MgPSBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UgKyBBQ1BJX1BUUl9ESUZGIChtZW1fcm92ZXIsIHRhYmxlX3B0cik7CisJCQlwaHlzaWNhbF9hZGRyZXNzID0KKwkJCQlBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UgKyBBQ1BJX1BUUl9ESUZGIChtZW1fcm92ZXIsIHRhYmxlX3B0cik7CiAKLQkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBwaHlzaWNhbF9hZGRyZXNzOworCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9CisJCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzczsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCQl9CiAJfQpAQCAtNTYyLDkgKzU5NCw4IEBACiAJICogUGh5c2ljYWwgYWRkcmVzc2luZwogCSAqLwogCWVsc2UgewotCQkvKgotCQkgKiAxYSkgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgRUJEQQotCQkgKi8KKwkJLyogMWEpIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIEVCREEgKi8KKwogCQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZwaHlzaWNhbF9hZGRyZXNzLCBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OKTsKIAkJcGh5c2ljYWxfYWRkcmVzcyA8PD0gNDsgICAgIC8qIENvbnZlcnQgc2VnbWVudCB0byBwaHlzaWNhbCBhZGRyZXNzICovCiAKQEAgLTU3Miw5ICs2MDMsMTEgQEAKIAogCQlpZiAocGh5c2ljYWxfYWRkcmVzcyA+IDB4NDAwKSB7CiAJCQkvKgotCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCRGEgaXMgcmVxdWlyZWQgdG8gYmUgYSBtaW5pbXVtIG9mIDFfayBsZW5ndGgpCisJCQkgKiAxYikgU2VhcmNoIEVCREEgcGFyYWdyYXBocyAoRUJEYSBpcyByZXF1aXJlZCB0byBiZSBhIG1pbmltdW0gb2YKKwkJCSAqICAgICAxX2sgbGVuZ3RoKQogCQkJICovCi0JCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwIChBQ1BJX1BIWVNBRERSX1RPX1BUUiAocGh5c2ljYWxfYWRkcmVzcyksCisJCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwICgKKwkJCQkJICBBQ1BJX1BIWVNBRERSX1RPX1BUUiAocGh5c2ljYWxfYWRkcmVzcyksCiAJCQkJCSAgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKIAkJCWlmIChtZW1fcm92ZXIpIHsKIAkJCQkvKiBGb3VuZCBpdCwgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCkBAIC01ODQsMTAgKzYxNywxMCBAQAogCQkJfQogCQl9CiAKLQkJLyoKLQkJICogMikgU2VhcmNoIHVwcGVyIG1lbW9yeTogMTYtYnl0ZSBib3VuZGFyaWVzIGluIEUwMDAwaC1GRkZGRmgKLQkJICovCi0JCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKEFDUElfUEhZU0FERFJfVE9fUFRSIChBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UpLAorCQkvKiAyKSBTZWFyY2ggdXBwZXIgbWVtb3J5OiAxNi1ieXRlIGJvdW5kYXJpZXMgaW4gRTAwMDBoLUZGRkZGaCAqLworCisJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAorCQkJCSAgQUNQSV9QSFlTQUREUl9UT19QVFIgKEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSksCiAJCQkJICBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOwogCQlpZiAobWVtX3JvdmVyKSB7CiAJCQkvKiBGb3VuZCBpdCwgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKaW5kZXggYzg0OTk3Yy4uNzNiMWQ4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYwpAQCAtMjYzLDYgKzI2Myw5IEBACiAJICogZGVzdGluYXRpb24gc28gdGhhdCBzc2NhbmYgY2FuIGJlIHVzZWQgb24gaXQgc2FmZWx5LgogCSAqLwogCXRtcF9idWZmZXIgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYoIXRtcF9idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJaWYgKGNvcHlfZnJvbV91c2VyKHRtcF9idWZmZXIsIGJ1ZmZlciwgY291bnQpKSB7CiAJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJfQpAQCAtNTI5LDYgKzUzMiwxMSBAQAogCiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKXsKKwkJcHJpbnRrKE1ZX0lORk8gIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOwkKKwl9CiAJLyogc2ltcGxlIGRldmljZSBkZXRlY3Rpb246IGxvb2sgZm9yIEhDSSBtZXRob2QgKi8KIAlpZiAoaXNfdmFsaWRfYWNwaV9wYXRoKE1FVEhPRF9IQ0lfMSkpCiAJCW1ldGhvZF9oY2kgPSBNRVRIT0RfSENJXzE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0YWxsb2MuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCmluZGV4IDMzMTM0MzkuLmM0ZTdmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCkBAIC00Nyw4ICs0NywzNSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGFsbG9jIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjaWZkZWYJQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKgorYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24gKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICphZGRyZXNzLAorCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3R5cGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAorCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7CisjZW5kaWYJLyogQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbGVhc2VfdG9fY2FjaGUKICAqCkBAIC05OCw3ICsxMjUsOCBAQAogCiAJCS8qIFB1dCB0aGUgb2JqZWN0IGF0IHRoZSBoZWFkIG9mIHRoZSBjYWNoZSBsaXN0ICovCiAKLQkJKiAoQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoY2hhciwgJigoKGNoYXIgKikgb2JqZWN0KVtjYWNoZV9pbmZvLT5saW5rX29mZnNldF0pKSkgPSBjYWNoZV9pbmZvLT5saXN0X2hlYWQ7CisJCSogKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKGNoYXIsCisJCQkmKCgoY2hhciAqKSBvYmplY3QpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKSA9IGNhY2hlX2luZm8tPmxpc3RfaGVhZDsKIAkJY2FjaGVfaW5mby0+bGlzdF9oZWFkID0gb2JqZWN0OwogCQljYWNoZV9pbmZvLT5jYWNoZV9kZXB0aCsrOwogCkBAIC0xMTUsNyArMTQzLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZQogICoKQEAgLTE1Niw3ICsxODQsOCBAQAogCQkvKiBUaGVyZSBpcyBhbiBvYmplY3QgYXZhaWxhYmxlLCB1c2UgaXQgKi8KIAogCQlvYmplY3QgPSBjYWNoZV9pbmZvLT5saXN0X2hlYWQ7Ci0JCWNhY2hlX2luZm8tPmxpc3RfaGVhZCA9ICooQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoY2hhciwgJigoKGNoYXIgKikgb2JqZWN0KVtjYWNoZV9pbmZvLT5saW5rX29mZnNldF0pKSk7CisJCWNhY2hlX2luZm8tPmxpc3RfaGVhZCA9ICooQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoY2hhciwKKwkJCQkgJigoKGNoYXIgKikgb2JqZWN0KVtjYWNoZV9pbmZvLT5saW5rX29mZnNldF0pKSk7CiAKIAkJQUNQSV9NRU1fVFJBQ0tJTkcgKGNhY2hlX2luZm8tPmNhY2hlX2hpdHMrKyk7CiAJCWNhY2hlX2luZm8tPmNhY2hlX2RlcHRoLS07CkBAIC0yMDEsNyArMjMwLDcgQEAKIAogCiAjaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX2NhY2hlCiAgKgpAQCAtMjI4LDcgKzI1Nyw4IEBACiAJd2hpbGUgKGNhY2hlX2luZm8tPmxpc3RfaGVhZCkgewogCQkvKiBEZWxldGUgb25lIGNhY2hlZCBzdGF0ZSBvYmplY3QgKi8KIAotCQluZXh0ID0gKihBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChjaGFyLCAmKCgoY2hhciAqKSBjYWNoZV9pbmZvLT5saXN0X2hlYWQpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKTsKKwkJbmV4dCA9ICooQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoY2hhciwKKwkJCQkgJigoKGNoYXIgKikgY2FjaGVfaW5mby0+bGlzdF9oZWFkKVtjYWNoZV9pbmZvLT5saW5rX29mZnNldF0pKSk7CiAJCUFDUElfTUVNX0ZSRUUgKGNhY2hlX2luZm8tPmxpc3RfaGVhZCk7CiAKIAkJY2FjaGVfaW5mby0+bGlzdF9oZWFkID0gbmV4dDsKQEAgLTQ5Nyw4ICs1MjcsOCBAQAogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogCiAKLQlhbGxvY2F0aW9uID0gYWNwaV91dF9hbGxvY2F0ZSAoc2l6ZSArIHNpemVvZiAoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciksIGNvbXBvbmVudCwKLQkJCSAgbW9kdWxlLCBsaW5lKTsKKwlhbGxvY2F0aW9uID0gYWNwaV91dF9hbGxvY2F0ZSAoc2l6ZSArIHNpemVvZiAoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciksCisJCQkgIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKIAlpZiAoIWFsbG9jYXRpb24pIHsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CkBAIC01NDMsOCArNTczLDggQEAKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIAogCi0JYWxsb2NhdGlvbiA9IGFjcGlfdXRfY2FsbG9jYXRlIChzaXplICsgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyKSwgY29tcG9uZW50LAotCQkJICBtb2R1bGUsIGxpbmUpOworCWFsbG9jYXRpb24gPSBhY3BpX3V0X2NhbGxvY2F0ZSAoc2l6ZSArIHNpemVvZiAoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciksCisJCQkgIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKIAlpZiAoIWFsbG9jYXRpb24pIHsKIAkJLyogUmVwb3J0IGFsbG9jYXRpb24gZXJyb3IgKi8KIApAQCAtNjM3LDcgKzY2Nyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICoKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKgogYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uKQpAQCAtNjg2LDcgKzcxNiw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF90cmFja19hbGxvY2F0aW9uICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCiAJc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWxsb2NhdGlvbiwKQEAgLTcyMSwxMCArNzUxLDEyIEBACiAKIAllbGVtZW50ID0gYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKGxpc3RfaWQsIGFsbG9jYXRpb24pOwogCWlmIChlbGVtZW50KSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoInV0X3RyYWNrX2FsbG9jYXRpb246IEFsbG9jYXRpb24gYWxyZWFkeSBwcmVzZW50IGluIGxpc3QhICglcClcbiIsCisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkidXRfdHJhY2tfYWxsb2NhdGlvbjogQWxsb2NhdGlvbiBhbHJlYWR5IHByZXNlbnQgaW4gbGlzdCEgKCVwKVxuIiwKIAkJCWFsbG9jYXRpb24pKTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkVsZW1lbnQgJXAgQWRkcmVzcyAlcFxuIiwgZWxlbWVudCwgYWxsb2NhdGlvbikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkVsZW1lbnQgJXAgQWRkcmVzcyAlcFxuIiwKKwkJCWVsZW1lbnQsIGFsbG9jYXRpb24pKTsKIAogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CkBAIC03NzMsNyArODA1LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X3JlbW92ZV9hbGxvY2F0aW9uICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCiAJc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWxsb2NhdGlvbiwKQEAgLTc5Nyw3ICs4MjksNyBAQAogCQkvKiBObyBhbGxvY2F0aW9ucyEgKi8KIAogCQlfQUNQSV9SRVBPUlRfRVJST1IgKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAotCQkJCSgidXRfcmVtb3ZlX2FsbG9jYXRpb246IEVtcHR5IGFsbG9jYXRpb24gbGlzdCwgbm90aGluZyB0byBmcmVlIVxuIikpOworCQkJKCJ1dF9yZW1vdmVfYWxsb2NhdGlvbjogRW1wdHkgYWxsb2NhdGlvbiBsaXN0LCBub3RoaW5nIHRvIGZyZWUhXG4iKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJfQpAQCAtODI0LDcgKzg1Niw4IEBACiAKIAlBQ1BJX01FTVNFVCAoJmFsbG9jYXRpb24tPnVzZXJfc3BhY2UsIDB4RUEsIGFsbG9jYXRpb24tPnNpemUpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJGcmVlaW5nIHNpemUgMCVYXG4iLCBhbGxvY2F0aW9uLT5zaXplKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJGcmVlaW5nIHNpemUgMCVYXG4iLAorCQlhbGxvY2F0aW9uLT5zaXplKSk7CiAKIAlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX01FTU9SWSk7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtODQyLDYgKzg3NSw3IEBACiAgKiBERVNDUklQVElPTjogUHJpbnQgc29tZSBpbmZvIGFib3V0IHRoZSBvdXRzdGFuZGluZyBhbGxvY2F0aW9ucy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIHZvaWQKIGFjcGlfdXRfZHVtcF9hbGxvY2F0aW9uX2luZm8gKApAQCAtODg0LDcgKzkxOCw4IEBACiAJQUNQSV9ERUJVR19QUklOVCAoVFJBQ0VfQUxMT0NBVElPTlMgfCBUUkFDRV9UQUJMRVMsCiAJCQkgICgiJTMwczogJTRkICglM2QgS2IpXG4iLCAiTWF4IE5vZGVzIiwKIAkJCSAgYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudCwKLQkJCSAgUk9VTkRfVVBfVE9fMUsgKChhY3BpX2dibF9tYXhfY29uY3VycmVudF9ub2RlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSkpKSkpOworCQkJICBST1VORF9VUF9UT18xSyAoKGFjcGlfZ2JsX21heF9jb25jdXJyZW50X25vZGVfY291bnQgKgorCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSkpKSkpOwogKi8KIAlyZXR1cm5fVk9JRDsKIH0KQEAgLTkzMywyNiArOTY4LDI2IEBACiAJCQlkZXNjcmlwdG9yID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9kZXNjcmlwdG9yLCAmZWxlbWVudC0+dXNlcl9zcGFjZSk7CiAJCQlpZiAoZGVzY3JpcHRvci0+ZGVzY3JpcHRvcl9pZCAhPSBBQ1BJX0RFU0NfVFlQRV9DQUNIRUQpIHsKIAkJCQlhY3BpX29zX3ByaW50ZiAoIiVwIExlbiAlMDRYICU5LjlzLSVkIFslc10gIiwKLQkJCQkJCSBkZXNjcmlwdG9yLCBlbGVtZW50LT5zaXplLCBlbGVtZW50LT5tb2R1bGUsCi0JCQkJCQkgZWxlbWVudC0+bGluZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChkZXNjcmlwdG9yKSk7CisJCQkJCWRlc2NyaXB0b3IsIGVsZW1lbnQtPnNpemUsIGVsZW1lbnQtPm1vZHVsZSwKKwkJCQkJZWxlbWVudC0+bGluZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChkZXNjcmlwdG9yKSk7CiAKIAkJCQkvKiBNb3N0IG9mIHRoZSBlbGVtZW50cyB3aWxsIGJlIE9wZXJhbmQgb2JqZWN0cy4gKi8KIAogCQkJCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChkZXNjcmlwdG9yKSkgewogCQkJCWNhc2UgQUNQSV9ERVNDX1RZUEVfT1BFUkFORDoKIAkJCQkJYWNwaV9vc19wcmludGYgKCIlMTIuMTJzIFIlaGQiLAotCQkJCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoZGVzY3JpcHRvci0+b2JqZWN0LmNvbW1vbi50eXBlKSwKLQkJCQkJCQlkZXNjcmlwdG9yLT5vYmplY3QuY29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CisJCQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKGRlc2NyaXB0b3ItPm9iamVjdC5jb21tb24udHlwZSksCisJCQkJCQlkZXNjcmlwdG9yLT5vYmplY3QuY29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9QQVJTRVI6CiAJCQkJCWFjcGlfb3NfcHJpbnRmICgiYW1sX29wY29kZSAlMDRoWCIsCi0JCQkJCQkJZGVzY3JpcHRvci0+b3AuYXNsLmFtbF9vcGNvZGUpOworCQkJCQkJZGVzY3JpcHRvci0+b3AuYXNsLmFtbF9vcGNvZGUpOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6CiAJCQkJCWFjcGlfb3NfcHJpbnRmICgiJTQuNHMiLAotCQkJCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAoJmRlc2NyaXB0b3ItPm5vZGUpKTsKKwkJCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAoJmRlc2NyaXB0b3ItPm5vZGUpKTsKIAkJCQkJYnJlYWs7CiAKIAkJCQlkZWZhdWx0OgpAQCAtOTgzLDYgKzEwMTgsNSBAQAogCXJldHVybl9WT0lEOwogfQogCi0KICNlbmRpZiAgLyogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jCmluZGV4IDBmY2Q5OGIuLjExZTg4NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYwpAQCAtNDksMjEgKzQ5LDY5IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0Y29weSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCisJdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc3BhY2UsCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3NwYWNlX3VzZWQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudCAoCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAorCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzcGFjZV91c2VkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlKAorCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKnVzZXJfb2JqLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fb2JqKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9kZXNjKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQgKAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmosCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9vYmosCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqaW50ZXJuYWxfb2JqZWN0ICAgIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHdlIGFyZSBleGFtaW5pbmcKLSAqICAgICAgICAgICAgICAqQnVmZmVyICAgICAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgICpzcGFjZV91c2VkICAgICAgICAgLSBXaGVyZSB0aGUgZGF0YSBsZW5ndGggaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgIC0gU291cmNlIG9iamVjdCB0byBiZSBjb3BpZWQKKyAqICAgICAgICAgICAgICBleHRlcm5hbF9vYmplY3QgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSBjb3BpZWQgb2JqZWN0CisgKiAgICAgICAgICAgICAgZGF0YV9zcGFjZSAgICAgICAgICAtIFdoZXJlIG9iamVjdCBkYXRhIGlzIHJldHVybmVkIChzdWNoIGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBhbmQgc3RyaW5nIGRhdGEpCisgKiAgICAgICAgICAgICAgYnVmZmVyX3NwYWNlX3VzZWQgICAtIExlbmd0aCBvZiBkYXRhX3NwYWNlIHRoYXQgd2FzIHVzZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHBsYWNlIGEgc2ltcGxlIG9iamVjdCBpbiBhIHVzZXIKLSAqICAgICAgICAgICAgICBidWZmZXIuCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29weSBhIHNpbXBsZSBpbnRlcm5hbCBvYmplY3QgdG8KKyAqICAgICAgICAgICAgICBhbiBleHRlcm5hbCBvYmplY3QuCiAgKgotICogICAgICAgICAgICAgIFRoZSBidWZmZXIgaXMgYXNzdW1lZCB0byBoYXZlIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRoZSBvYmplY3QuCisgKiAgICAgICAgICAgICAgVGhlIGRhdGFfc3BhY2UgYnVmZmVyIGlzIGFzc3VtZWQgdG8gaGF2ZSBzdWZmaWNpZW50IHNwYWNlIGZvcgorICogICAgICAgICAgICAgIHRoZSBvYmplY3QuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTA3LDEwICsxNTUsMTIgQEAKIAogCQlleHRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyID0gKGNoYXIgKikgZGF0YV9zcGFjZTsKIAkJZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoID0gaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoOwotCQkqYnVmZmVyX3NwYWNlX3VzZWQgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJKmJ1ZmZlcl9zcGFjZV91c2VkID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoCisJCQkJICAgKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMSk7CiAKLQkJQUNQSV9NRU1DUFkgKCh2b2lkICopIGRhdGFfc3BhY2UsICh2b2lkICopIGludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJIChhY3BpX3NpemUpIGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCArIDEpOworCQlBQ1BJX01FTUNQWSAoKHZvaWQgKikgZGF0YV9zcGFjZSwKKwkJCSh2b2lkICopIGludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCisJCQkoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKIAkJYnJlYWs7CiAKIApAQCAtMTE4LDEwICsxNjgsMTIgQEAKIAogCQlleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyID0gZGF0YV9zcGFjZTsKIAkJZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoID0gaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOwotCQkqYnVmZmVyX3NwYWNlX3VzZWQgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEIChpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGgpOworCQkqYnVmZmVyX3NwYWNlX3VzZWQgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKKwkJCQkgICBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGgpOwogCi0JCUFDUElfTUVNQ1BZICgodm9pZCAqKSBkYXRhX3NwYWNlLCAodm9pZCAqKSBpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLAotCQkJCSBpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWSAoKHZvaWQgKikgZGF0YV9zcGFjZSwKKwkJCSh2b2lkICopIGludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCisJCQlpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGgpOwogCQlicmVhazsKIAogCkBAIC0xOTQsNyArMjQ2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKQEAgLTIxMyw3ICsyNjUsNyBAQAogCiAJdGhpc19pbmRleCAgID0gc3RhdGUtPnBrZy5pbmRleDsKIAl0YXJnZXRfb2JqZWN0ID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopCi0JCQkgICYoKHVuaW9uIGFjcGlfb2JqZWN0ICopKHN0YXRlLT5wa2cuZGVzdF9vYmplY3QpKS0+cGFja2FnZS5lbGVtZW50c1t0aGlzX2luZGV4XTsKKwkJJigodW5pb24gYWNwaV9vYmplY3QgKikoc3RhdGUtPnBrZy5kZXN0X29iamVjdCkpLT5wYWNrYWdlLmVsZW1lbnRzW3RoaXNfaW5kZXhdOwogCiAJc3dpdGNoIChvYmplY3RfdHlwZSkgewogCWNhc2UgQUNQSV9DT1BZX1RZUEVfU0lNUExFOgpAQCAtMjM2LDcgKzI4OCw4IEBACiAJCSAqLwogCQl0YXJnZXRfb2JqZWN0LT50eXBlICAgICAgICAgICAgID0gQUNQSV9UWVBFX1BBQ0tBR0U7CiAJCXRhcmdldF9vYmplY3QtPnBhY2thZ2UuY291bnQgICAgPSBzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwotCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vYmplY3QsIGluZm8tPmZyZWVfc3BhY2UpOworCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0KKwkJCUFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb2JqZWN0LCBpbmZvLT5mcmVlX3NwYWNlKTsKIAogCQkvKgogCQkgKiBQYXNzIHRoZSBuZXcgcGFja2FnZSBvYmplY3QgYmFjayB0byB0aGUgcGFja2FnZSB3YWxrIHJvdXRpbmUKQEAgLTI0OCw3ICszMDEsOCBAQAogCQkgKiB1cGRhdGUgdGhlIGJ1ZmZlciBsZW5ndGggY291bnRlcgogCQkgKi8KIAkJb2JqZWN0X3NwYWNlID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoCi0JCQkJICAgKGFjcGlfc2l6ZSkgdGFyZ2V0X29iamVjdC0+cGFja2FnZS5jb3VudCAqIHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKKwkJCQkgICAoYWNwaV9zaXplKSB0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmNvdW50ICoKKwkJCQkgICBzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7CiAJCWJyZWFrOwogCiAKQEAgLTI2Niw5ICszMjAsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UKICAqCi0gKiBQQVJBTUVURVJTOiAgKmludGVybmFsX29iamVjdCAgICAtIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB3ZSBhcmUgcmV0dXJuaW5nCi0gKiAgICAgICAgICAgICAgKkJ1ZmZlciAgICAgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAqc3BhY2VfdXNlZCAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCBsZW5ndGggaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHdlIGFyZSByZXR1cm5pbmcKKyAqICAgICAgICAgICAgICBCdWZmZXIgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIHNwYWNlX3VzZWQgICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGxlbmd0aCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0zMDQsMTMgKzM1OCwxNSBAQAogCSAqIEZyZWUgc3BhY2UgYmVnaW5zIHJpZ2h0IGFmdGVyIHRoZSBmaXJzdCBwYWNrYWdlCiAJICovCiAJaW5mby5sZW5ndGggICAgICA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKLQlpbmZvLmZyZWVfc3BhY2UgID0gYnVmZmVyICsgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpOworCWluZm8uZnJlZV9zcGFjZSAgPSBidWZmZXIgKyBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKKwkJCSAgIHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKIAlpbmZvLm9iamVjdF9zcGFjZSA9IDA7CiAJaW5mby5udW1fcGFja2FnZXMgPSAxOwogCiAJZXh0ZXJuYWxfb2JqZWN0LT50eXBlICAgICAgICAgICAgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KTsKIAlleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgICA9IGludGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudDsKLQlleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHMgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29iamVjdCwgaW5mby5mcmVlX3NwYWNlKTsKKwlleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHMgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29iamVjdCwKKwkJCSAgaW5mby5mcmVlX3NwYWNlKTsKIAogCS8qCiAJICogTGVhdmUgcm9vbSBmb3IgYW4gYXJyYXkgb2YgQUNQSV9PQkpFQ1RTIGluIHRoZSBidWZmZXIKQEAgLTMzMyw4ICszODksOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0CiAgKgotICogUEFSQU1FVEVSUzogICppbnRlcm5hbF9vYmplY3QgICAgLSBUaGUgaW50ZXJuYWwgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAotICogICAgICAgICAgICAgICpidWZmZXJfcHRyICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIFRoZSBpbnRlcm5hbCBvYmplY3QgdG8gYmUgY29udmVydGVkCisgKiAgICAgICAgICAgICAgYnVmZmVyX3B0ciAgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzY3LDEwICs0MjMsMTAgQEAKIAkJICogQnVpbGQgYSBzaW1wbGUgb2JqZWN0IChubyBuZXN0ZWQgb2JqZWN0cykKIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUgKGludGVybmFsX29iamVjdCwKLQkJCQkgICh1bmlvbiBhY3BpX29iamVjdCAqKSByZXRfYnVmZmVyLT5wb2ludGVyLAotCQkJCSAgKCh1OCAqKSByZXRfYnVmZmVyLT5wb2ludGVyICsKLQkJCQkgIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKSksCi0JCQkJICAmcmV0X2J1ZmZlci0+bGVuZ3RoKTsKKwkJCQkgKHVuaW9uIGFjcGlfb2JqZWN0ICopIHJldF9idWZmZXItPnBvaW50ZXIsCisJCQkJICgodTggKikgcmV0X2J1ZmZlci0+cG9pbnRlciArCisJCQkJIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKSksCisJCQkJICZyZXRfYnVmZmVyLT5sZW5ndGgpOwogCQkvKgogCQkgKiBidWlsZCBzaW1wbGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgb2JqZWN0IHNpemUgaW4gdGhlIGxlbmd0aAogCQkgKiBzbyB3ZSBhZGQgaXQgaW4gaGVyZQpAQCAtMzg2LDggKzQ0Miw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUKICAqCi0gKiBQQVJBTUVURVJTOiAgKmV4dGVybmFsX29iamVjdCAgIC0gVGhlIGV4dGVybmFsIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQKLSAqICAgICAgICAgICAgICAqaW50ZXJuYWxfb2JqZWN0ICAgLSBXaGVyZSB0aGUgaW50ZXJuYWwgb2JqZWN0IGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgZXh0ZXJuYWxfb2JqZWN0ICAgICAtIFRoZSBleHRlcm5hbCBvYmplY3QgdG8gYmUgY29udmVydGVkCisgKiAgICAgICAgICAgICAgcmV0X2ludGVybmFsX29iamVjdCAtIFdoZXJlIHRoZSBpbnRlcm5hbCBvYmplY3QgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzk4LDcgKzQ1NCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSAoCiAJdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXRfaW50ZXJuYWxfb2JqZWN0KQpAQCAtNDE3LDcgKzQ3Myw4IEBACiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKLQkJaW50ZXJuYWxfb2JqZWN0ID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0ICgodTgpIGV4dGVybmFsX29iamVjdC0+dHlwZSk7CisJCWludGVybmFsX29iamVjdCA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoCisJCQkJICAgKHU4KSBleHRlcm5hbF9vYmplY3QtPnR5cGUpOwogCQlpZiAoIWludGVybmFsX29iamVjdCkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwogCQl9CkBAIC00ODYsNyArNTQzLDYgQEAKIAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfSU1QTEVNRU5UQVRJT04KLQogLyogQ29kZSB0byBjb252ZXJ0IHBhY2thZ2VzIHRoYXQgYXJlIHBhcmFtZXRlcnMgdG8gY29udHJvbCBtZXRob2RzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02MTQsNyArNjcwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9kZXNjKQpAQCAtNzI0LDcgKzc4MCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50ICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCkBAIC04MzcsNyArODkzLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmosCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9vYmosCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWJ1Zy5jCmluZGV4IDk4NWM1ZDAuLjc5NGM3ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWJ1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWJ1Zy5jCkBAIC01Niw3ICs1Niw3IEBACiBzdGF0aWMgY2hhciAgICAgKmFjcGlfZ2JsX2ZuX2V4aXRfc3RyID0gIi0tLS1FeGl0LSI7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlCiAgKgpAQCAtNjQsOSArNjQsOSBAQAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlcgorICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgQ1BVIHN0YWNrIHBvaW50ZXIgYXQgc3Vic3lzdGVtIHN0YXJ0dXAKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2UgKApAQCAtNzksNyArNzksNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFja19zdGFja19wdHIKICAqCkBAIC04Nyw5ICs4Nyw5IEBACiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCi0gKiBERVNDUklQVElPTjogU2F2ZSB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyCisgKiBERVNDUklQVElPTjogU2F2ZSB0aGUgY3VycmVudCBDUFUgc3RhY2sgcG9pbnRlcgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF90cmFja19zdGFja19wdHIgKApAQCAtMTEwLDE2ICsxMTAsMTYgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVidWdfcHJpbnQKICAqCi0gKiBQQVJBTUVURVJTOiAgZGVidWdfbGV2ZWwgICAgICAgICAtIFJlcXVlc3RlZCBkZWJ1ZyBwcmludCBsZXZlbAotICogICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZSAoZm9yIGVycm9yIG91dHB1dCkKKyAqIFBBUkFNRVRFUlM6ICByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwgLSBSZXF1ZXN0ZWQgZGVidWcgcHJpbnQgbGV2ZWwKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRCAoZm9yIGVycm9yIG91dHB1dCkKLSAqCisgKiAgICAgICAgICAgICAgZGJnX2luZm8gICAgICAgICAgICAtIENvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKKyAqICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgIC0gUHJpbnRmIGZvcm1hdCBmaWVsZAogICogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgLSBPcHRpb25hbCBwcmludGYgYXJndW1lbnRzCiAgKgpAQCAtMTI4LDcgKzEyOCw3IEBACiAgKiBERVNDUklQVElPTjogUHJpbnQgZXJyb3IgbWVzc2FnZSB3aXRoIHByZWZpeCBjb25zaXN0aW5nIG9mIHRoZSBtb2R1bGUgbmFtZSwKICAqICAgICAgICAgICAgICBsaW5lIG51bWJlciwgYW5kIGNvbXBvbmVudCBJRC4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQgIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCiBhY3BpX3V0X2RlYnVnX3ByaW50ICgKQEAgLTE1Nyw3ICsxNTcsOCBAQAogCiAJaWYgKHRocmVhZF9pZCAhPSBhY3BpX2dibF9wcmV2X3RocmVhZF9pZCkgewogCQlpZiAoQUNQSV9MVl9USFJFQURTICYgYWNwaV9kYmdfbGV2ZWwpIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiXG4qKioqIENvbnRleHQgU3dpdGNoIGZyb20gVElEICVYIHRvIFRJRCAlWCAqKioqXG5cbiIsCisJCQlhY3BpX29zX3ByaW50ZiAoCisJCQkJIlxuKioqKiBDb250ZXh0IFN3aXRjaCBmcm9tIFRJRCAlWCB0byBUSUQgJVggKioqKlxuXG4iLAogCQkJCWFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkLCB0aHJlYWRfaWQpOwogCQl9CiAKQEAgLTE3NCwxNSArMTc1LDE2IEBACiAJCWFjcGlfb3NfcHJpbnRmICgiWyUwNGxYXSAiLCB0aHJlYWRfaWQpOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiWyUwMmxkXSAlLTIyLjIyczogIiwgYWNwaV9nYmxfbmVzdGluZ19sZXZlbCwgZGJnX2luZm8tPnByb2NfbmFtZSk7CisJYWNwaV9vc19wcmludGYgKCJbJTAybGRdICUtMjIuMjJzOiAiLAorCQlhY3BpX2dibF9uZXN0aW5nX2xldmVsLCBkYmdfaW5mby0+cHJvY19uYW1lKTsKIAogCXZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwogCWFjcGlfb3NfdnByaW50ZiAoZm9ybWF0LCBhcmdzKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3V0X2RlYnVnX3ByaW50KTsKIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVidWdfcHJpbnRfcmF3CiAgKgpAQCAtMjAwLDcgKzIwMiw3IEBACiAgKiBERVNDUklQVElPTjogUHJpbnQgbWVzc2FnZSB3aXRoIG5vIGhlYWRlcnMuICBIYXMgc2FtZSBpbnRlcmZhY2UgYXMKICAqICAgICAgICAgICAgICBkZWJ1Z19wcmludCBzbyB0aGF0IHRoZSBzYW1lIG1hY3JvcyBjYW4gYmUgdXNlZC4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQgIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCiBhY3BpX3V0X2RlYnVnX3ByaW50X3JhdyAoCkBAIC0yMjQsNyArMjI2LDcgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV91dF9kZWJ1Z19wcmludF9yYXcpOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZQogICoKQEAgLTIzOSw3ICsyNDEsNyBAQAogICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGVudHJ5IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwogICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF90cmFjZSAoCkBAIC0yNTYsNyArMjU4LDcgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV91dF90cmFjZSk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNlX3B0cgogICoKQEAgLTI3Miw3ICsyNzQsNyBAQAogICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGVudHJ5IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwogICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF90cmFjZV9wdHIgKApAQCAtMjg4LDcgKzI5MCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNlX3N0cgogICoKQEAgLTMwNCw3ICszMDYsNyBAQAogICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGVudHJ5IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwogICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF90cmFjZV9zdHIgKApAQCAtMzIxLDcgKzMyMyw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNlX3UzMgogICoKQEAgLTMzNyw3ICszMzksNyBAQAogICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGVudHJ5IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwogICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF90cmFjZV91MzIgKApAQCAtMzU0LDcgKzM1Niw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4aXQKICAqCkBAIC0zNjksNyArMzcxLDcgQEAKICAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBleGl0IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwogICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF9leGl0ICgKQEAgLTM4NSw3ICszODcsNyBAQAogRVhQT1JUX1NZTUJPTChhY3BpX3V0X2V4aXQpOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9zdGF0dXNfZXhpdAogICoKQEAgLTQwMSw3ICs0MDMsNyBAQAogICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGV4aXQgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsLiBQcmludHMgZXhpdCBzdGF0dXMgYWxzby4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfc3RhdHVzX2V4aXQgKApAQCAtNDI2LDcgKzQyOCw3IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfdXRfc3RhdHVzX2V4aXQpOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWx1ZV9leGl0CiAgKgpAQCAtNDQyLDcgKzQ0NCw3IEBACiAgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZXhpdCB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwuIFByaW50cyBleGl0IHZhbHVlIGFsc28uCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X3ZhbHVlX2V4aXQgKApAQCAtNDYwLDcgKzQ2Miw3IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfdXRfdmFsdWVfZXhpdCk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3B0cl9leGl0CiAgKgpAQCAtNDY5LDE0ICs0NzEsMTQgQEAKICAqICAgICAgICAgICAgICAgICAgcHJvY19uYW1lICAgICAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCiAgKiAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQogICogICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECi0gKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIHByaW50ZWQgd2l0aCBleGl0IG1zZworICogICAgICAgICAgICAgIFB0ciAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGRpc3BsYXkKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBleGl0IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwogICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbC4gUHJpbnRzIGV4aXQgdmFsdWUgYWxzby4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfcHRyX2V4aXQgKApAQCAtNDk0LDcgKzQ5Niw3IEBACiAjZW5kaWYKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZHVtcF9idWZmZXIKICAqCkBAIC01MDcsNyArNTA5LDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogR2VuZXJpYyBkdW1wIGJ1ZmZlciBpbiBib3RoIGhleCBhbmQgYXNjaWkuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X2R1bXBfYnVmZmVyICgKQEAgLTUzMywzNCArNTM1LDI4IEBACiAJCWRpc3BsYXkgPSBEQl9CWVRFX0RJU1BMQVk7CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCJcbk9mZnNldCBWYWx1ZVxuIik7CisJLyogTmFzdHkgbGl0dGxlIGR1bXAgYnVmZmVyIHJvdXRpbmUhICovCiAKLQkvKgotCSAqIE5hc3R5IGxpdHRsZSBkdW1wIGJ1ZmZlciByb3V0aW5lIQotCSAqLwogCXdoaWxlIChpIDwgY291bnQpIHsKIAkJLyogUHJpbnQgY3VycmVudCBvZmZzZXQgKi8KIAotCQlhY3BpX29zX3ByaW50ZiAoIiUwNVggICIsICh1MzIpIGkpOworCQlhY3BpX29zX3ByaW50ZiAoIiU2LjRYOiAiLCAodTMyKSBpKTsKIAogCQkvKiBQcmludCAxNiBoZXggY2hhcnMgKi8KIAogCQlmb3IgKGogPSAwOyBqIDwgMTY7KSB7CiAJCQlpZiAoaSArIGogPj0gY291bnQpIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7Ci0JCQkJcmV0dXJuOworCQkJCS8qIER1bXAgZmlsbCBzcGFjZXMgKi8KKworCQkJCWFjcGlfb3NfcHJpbnRmICgiJSpzIiwgKChkaXNwbGF5ICogMikgKyAxKSwgIiAiKTsKKwkJCQlqICs9IGRpc3BsYXk7CisJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzOCBkb2Vzbid0IGdldCBzaWduLWV4dGVuZGVkISAqLwotCiAJCQlzd2l0Y2ggKGRpc3BsYXkpIHsKLQkJCS8qIERlZmF1bHQgaXMgQllURSBkaXNwbGF5ICovCisJCQlkZWZhdWx0OiAgICAvKiBEZWZhdWx0IGlzIEJZVEUgZGlzcGxheSAqLwogCi0JCQlkZWZhdWx0OgotCi0JCQkJYWNwaV9vc19wcmludGYgKCIlMDJYICIsCi0JCQkJCQkqKCh1OCAqKSAmYnVmZmVyW2kgKyBqXSkpOwotCQkJCWogKz0gMTsKKwkJCQlhY3BpX29zX3ByaW50ZiAoIiUwMlggIiwgYnVmZmVyW2kgKyBqXSk7CiAJCQkJYnJlYWs7CiAKIApAQCAtNTY4LDcgKzU2NCw2IEBACiAKIAkJCQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZ0ZW1wMzIsICZidWZmZXJbaSArIGpdKTsKIAkJCQlhY3BpX29zX3ByaW50ZiAoIiUwNFggIiwgdGVtcDMyKTsKLQkJCQlqICs9IDI7CiAJCQkJYnJlYWs7CiAKIApAQCAtNTc2LDcgKzU3MSw2IEBACiAKIAkJCQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZ0ZW1wMzIsICZidWZmZXJbaSArIGpdKTsKIAkJCQlhY3BpX29zX3ByaW50ZiAoIiUwOFggIiwgdGVtcDMyKTsKLQkJCQlqICs9IDQ7CiAJCQkJYnJlYWs7CiAKIApAQCAtNTg3LDE1ICs1ODEsMTcgQEAKIAogCQkJCUFDUElfTU9WRV8zMl9UT18zMiAoJnRlbXAzMiwgJmJ1ZmZlcltpICsgaiArIDRdKTsKIAkJCQlhY3BpX29zX3ByaW50ZiAoIiUwOFggIiwgdGVtcDMyKTsKLQkJCQlqICs9IDg7CiAJCQkJYnJlYWs7CiAJCQl9CisKKwkJCWogKz0gZGlzcGxheTsKIAkJfQogCiAJCS8qCiAJCSAqIFByaW50IHRoZSBBU0NJSSBlcXVpdmFsZW50IGNoYXJhY3RlcnMKIAkJICogQnV0IHdhdGNoIG91dCBmb3IgdGhlIGJhZCB1bnByaW50YWJsZSBvbmVzLi4uCiAJCSAqLworCQlhY3BpX29zX3ByaW50ZiAoIiAiKTsKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKIAkJCWlmIChpICsgaiA+PSBjb3VudCkgewogCQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYwppbmRleCA5YTUyYWQ1Li5iYzU0MDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCkBAIC01MSwxMiArNTEsMjMgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRkZWxldGUiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmogKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCk7CisKK3N0YXRpYyB2b2lkCithY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbik7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqCiAgKgotICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgIC0gUG9pbnRlciB0byB0aGUgbGlzdCB0byBiZSBkZWxldGVkCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgLSBPYmplY3QgdG8gYmUgZGVsZXRlZAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtNjUsNyArNzYsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmogKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCkKIHsKQEAgLTE1Miw3ICsxNjMsOCBAQAogCiAJY2FzZSBBQ1BJX1RZUEVfTVVURVg6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIqKioqKiBNdXRleCAlcCwgU2VtYXBob3JlICVwXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCSIqKioqKiBNdXRleCAlcCwgU2VtYXBob3JlICVwXG4iLAogCQkJb2JqZWN0LCBvYmplY3QtPm11dGV4LnNlbWFwaG9yZSkpOwogCiAJCWFjcGlfZXhfdW5saW5rX211dGV4IChvYmplY3QpOwpAQCAtMTYyLDcgKzE3NCw4IEBACiAKIAljYXNlIEFDUElfVFlQRV9FVkVOVDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIioqKioqIEV2ZW50ICVwLCBTZW1hcGhvcmUgJXBcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJIioqKioqIEV2ZW50ICVwLCBTZW1hcGhvcmUgJXBcbiIsCiAJCQlvYmplY3QsIG9iamVjdC0+ZXZlbnQuc2VtYXBob3JlKSk7CiAKIAkJKHZvaWQpIGFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZSAob2JqZWN0LT5ldmVudC5zZW1hcGhvcmUpOwpAQCAtMTcyLDcgKzE4NSw4IEBACiAKIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIqKioqKiBNZXRob2QgJXBcbiIsIG9iamVjdCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCSIqKioqKiBNZXRob2QgJXBcbiIsIG9iamVjdCkpOwogCiAJCS8qIERlbGV0ZSB0aGUgbWV0aG9kIHNlbWFwaG9yZSBpZiBpdCBleGlzdHMgKi8KIApAQCAtMTg1LDcgKzE5OSw4IEBACiAKIAljYXNlIEFDUElfVFlQRV9SRUdJT046CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIqKioqKiBSZWdpb24gJXBcbiIsIG9iamVjdCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCSIqKioqKiBSZWdpb24gJXBcbiIsIG9iamVjdCkpOwogCiAJCXNlY29uZF9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAob2JqZWN0KTsKIAkJaWYgKHNlY29uZF9kZXNjKSB7CkBAIC0yMTIsNyArMjI3LDggQEAKIAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIioqKioqIEJ1ZmZlciBGaWVsZCAlcFxuIiwgb2JqZWN0KSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJIioqKioqIEJ1ZmZlciBGaWVsZCAlcFxuIiwgb2JqZWN0KSk7CiAKIAkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0IChvYmplY3QpOwogCQlpZiAoc2Vjb25kX2Rlc2MpIHsKQEAgLTI0Nyw3ICsyNjMsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdAogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2xpc3QgICAgICAgLSBQb2ludGVyIHRvIHRoZSBsaXN0IHRvIGJlIGRlbGV0ZWQKKyAqIFBBUkFNRVRFUlM6ICBvYmpfbGlzdCAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBsaXN0IHRvIGJlIGRlbGV0ZWQKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTI4Myw3ICsyOTksNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQKICAqCi0gKiBQQVJBTUVURVJTOiAgKk9iamVjdCAgICAgICAgIC0gT2JqZWN0IHdob3NlIHJlZiBjb3VudCBpcyB0byBiZSB1cGRhdGVkCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gT2JqZWN0IHdob3NlIHJlZiBjb3VudCBpcyB0byBiZSB1cGRhdGVkCiAgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gV2hhdCB0byBkbwogICoKICAqIFJFVFVSTjogICAgICBOZXcgcmVmIGNvdW50CkBAIC0zMTIsNyArMzI4LDggQEAKIAluZXdfY291bnQgPSBjb3VudDsKIAogCS8qCi0JICogUGVyZm9ybSB0aGUgcmVmZXJlbmNlIGNvdW50IGFjdGlvbiAoaW5jcmVtZW50LCBkZWNyZW1lbnQsIG9yIGZvcmNlIGRlbGV0ZSkKKwkgKiBQZXJmb3JtIHRoZSByZWZlcmVuY2UgY291bnQgYWN0aW9uCisJICogKGluY3JlbWVudCwgZGVjcmVtZW50LCBvciBmb3JjZSBkZWxldGUpCiAJICovCiAJc3dpdGNoIChhY3Rpb24pIHsKIApAQCAtMzIxLDcgKzMzOCw4IEBACiAJCW5ld19jb3VudCsrOwogCQlvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPSBuZXdfY291bnQ7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJPYmogJXAgUmVmcz0lWCwgW0luY3JlbWVudGVkXVxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkiT2JqICVwIFJlZnM9JVgsIFtJbmNyZW1lbnRlZF1cbiIsCiAJCQlvYmplY3QsIG5ld19jb3VudCkpOwogCQlicmVhazsKIApAQCAtMzI5LDcgKzM0Nyw4IEBACiAJY2FzZSBSRUZfREVDUkVNRU5UOgogCiAJCWlmIChjb3VudCA8IDEpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiT2JqICVwIFJlZnM9JVgsIGNhbid0IGRlY3JlbWVudCEgKFNldCB0byAwKVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSJPYmogJXAgUmVmcz0lWCwgY2FuJ3QgZGVjcmVtZW50ISAoU2V0IHRvIDApXG4iLAogCQkJCW9iamVjdCwgbmV3X2NvdW50KSk7CiAKIAkJCW5ld19jb3VudCA9IDA7CkBAIC0zMzcsMTIgKzM1NiwxNCBAQAogCQllbHNlIHsKIAkJCW5ld19jb3VudC0tOwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIk9iaiAlcCBSZWZzPSVYLCBbRGVjcmVtZW50ZWRdXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJIk9iaiAlcCBSZWZzPSVYLCBbRGVjcmVtZW50ZWRdXG4iLAogCQkJCW9iamVjdCwgbmV3X2NvdW50KSk7CiAJCX0KIAogCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9iamVjdCkgPT0gQUNQSV9UWVBFX01FVEhPRCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJNZXRob2QgT2JqICVwIFJlZnM9JVgsIFtEZWNyZW1lbnRlZF1cbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkiTWV0aG9kIE9iaiAlcCBSZWZzPSVYLCBbRGVjcmVtZW50ZWRdXG4iLAogCQkJCW9iamVjdCwgbmV3X2NvdW50KSk7CiAJCX0KIApAQCAtMzU2LDcgKzM3Nyw4IEBACiAKIAljYXNlIFJFRl9GT1JDRV9ERUxFVEU6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJPYmogJXAgUmVmcz0lWCwgRm9yY2UgZGVsZXRlISAoU2V0IHRvIDApXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCSJPYmogJXAgUmVmcz0lWCwgRm9yY2UgZGVsZXRlISAoU2V0IHRvIDApXG4iLAogCQkJb2JqZWN0LCBjb3VudCkpOwogCiAJCW5ld19jb3VudCA9IDA7CkBAIC0zOTAsNyArNDEyLDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqT2JqZWN0ICAgICAgICAgICAgIC0gSW5jcmVtZW50IHJlZiBjb3VudCBmb3IgdGhpcyBvYmplY3QKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gSW5jcmVtZW50IHJlZiBjb3VudCBmb3IgdGhpcyBvYmplY3QKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsbCBzdWItb2JqZWN0cwogICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgLSBFaXRoZXIgUkVGX0lOQ1JFTUVOVCBvciBSRUZfREVDUkVNRU5UIG9yCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRl9GT1JDRV9ERUxFVEUKQEAgLTQzMSw3ICs0NTMsOCBAQAogCS8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXNuJ3QgYSBuYW1lc3BhY2UgaGFuZGxlICovCiAKIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiT2JqZWN0ICVwIGlzIE5TIGhhbmRsZVxuIiwgb2JqZWN0KSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJIk9iamVjdCAlcCBpcyBOUyBoYW5kbGVcbiIsIG9iamVjdCkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIAl9CiAKQEAgLTYxNCw4ICs2MzcsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FkZF9yZWZlcmVuY2UKICAqCi0gKiBQQVJBTUVURVJTOiAgKk9iamVjdCAgICAgICAgLSBPYmplY3Qgd2hvc2UgcmVmZXJlbmNlIGNvdW50IGlzIHRvIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRlZAorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB3aG9zZSByZWZlcmVuY2UgY291bnQgaXMgdG8gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRlZAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtNjUyLDcgKzY3NSw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqT2JqZWN0ICAgICAgICAtIE9iamVjdCB3aG9zZSByZWYgY291bnQgd2lsbCBiZSBkZWNyZW1lbnRlZAorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgIC0gT2JqZWN0IHdob3NlIHJlZiBjb3VudCB3aWxsIGJlIGRlY3JlbWVudGVkCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYwppbmRleCBlYWQyN2QyLi4wMDA0NmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKQEAgLTUwLDYgKzUwLDE5IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0ZXZhbCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfdXRfY29weV9pZF9zdHJpbmcgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RpbmF0aW9uLAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvdXJjZSwKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQgICAgICAgKm9uZV9jaWQpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjM3LDkgKzI1MCw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9iamVjdF9uYW1lICAgICAgICAtIE9iamVjdCBuYW1lIHRvIGJlIGV2YWx1YXRlZAorICogUEFSQU1FVEVSUzogIG9iamVjdF9uYW1lICAgICAgICAgLSBPYmplY3QgbmFtZSB0byBiZSBldmFsdWF0ZWQKICAqICAgICAgICAgICAgICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgICpBZGRyZXNzICAgICAgICAgICAgLSBXaGVyZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHZhbHVlIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTMwMyw3ICszMTYsNiBAQAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xlbmd0aCkKIHsKIAotCiAJLyoKIAkgKiBXb3JrYXJvdW5kIGZvciBJRCBzdHJpbmdzIHRoYXQgaGF2ZSBhIGxlYWRpbmcgYXN0ZXJpc2suIFRoaXMgY29uc3RydWN0CiAJICogaXMgbm90IGFsbG93ZWQgYnkgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiAgKElEIHN0cmluZ3MgbXVzdCBiZQpAQCAtMzI1LDcgKzMzNyw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX0hJRAogICoKICAqIFBBUkFNRVRFUlM6ICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgICpIaWQgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgSElEIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgSGlkICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBISUQgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDI5LDcgKzQ0MSw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX0NJRAogICoKICAqIFBBUkFNRVRFUlM6ICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgICpDaWQgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgQ0lEIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgcmV0dXJuX2NpZF9saXN0ICAgICAtIFdoZXJlIHRoZSBDSUQgbGlzdCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00ODgsMTAgKzUwMCwxMCBAQAogCWNpZF9saXN0LT5zaXplID0gc2l6ZTsKIAogCS8qCi0JICogIEEgX0NJRCBjYW4gcmV0dXJuIGVpdGhlciBhIHNpbmdsZSBjb21wYXRpYmxlIElEIG9yIGEgcGFja2FnZSBvZiBjb21wYXRpYmxlCi0JICogIElEcy4gIEVhY2ggY29tcGF0aWJsZSBJRCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogIC0tIE51bWJlciAoMzIgYml0IGNvbXByZXNzZWQgRUlTQSBJRCkgb3IKLQkgKiAgLS0gU3RyaW5nIChQQ0kgSUQgZm9ybWF0LCBlLmcuICJQQ0lcVkVOX3Z2dnYmREVWX2RkZGQmU1VCU1lTX3Nzc3Nzc3NzIikuCisJICogIEEgX0NJRCBjYW4gcmV0dXJuIGVpdGhlciBhIHNpbmdsZSBjb21wYXRpYmxlIElEIG9yIGEgcGFja2FnZSBvZgorCSAqICBjb21wYXRpYmxlIElEcy4gIEVhY2ggY29tcGF0aWJsZSBJRCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICogIDEpIEludGVnZXIgKDMyIGJpdCBjb21wcmVzc2VkIEVJU0EgSUQpIG9yCisJICogIDIpIFN0cmluZyAoUENJIElEIGZvcm1hdCwgZS5nLiAiUENJXFZFTl92dnZ2JkRFVl9kZGRkJlNVQlNZU19zc3Nzc3NzcyIpCiAJICovCiAKIAkvKiBUaGUgX0NJRCBvYmplY3QgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBDSUQgb3IgYSBwYWNrYWdlIChsaXN0KSBvZiBDSURzICovCkBAIC01MzQsNyArNTQ2LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4ZWN1dGVfVUlECiAgKgogICogUEFSQU1FVEVSUzogIGRldmljZV9ub2RlICAgICAgICAgLSBOb2RlIGZvciB0aGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgKlVpZCAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBVSUQgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBVaWQgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIFVJRCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC01ODcsNyArNTk5LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4ZWN1dGVfU1RBCiAgKgogICogUEFSQU1FVEVSUzogIGRldmljZV9ub2RlICAgICAgICAgLSBOb2RlIGZvciB0aGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgKkZsYWdzICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBzdGF0dXMgZmxhZ3MgYXJlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBzdGF0dXMgZmxhZ3MgYXJlIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTY0MSw3ICs2NTMsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9TeGRzCiAgKgogICogUEFSQU1FVEVSUzogIGRldmljZV9ub2RlICAgICAgICAgLSBOb2RlIGZvciB0aGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgKkZsYWdzICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBzdGF0dXMgZmxhZ3MgYXJlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBzdGF0dXMgZmxhZ3MgYXJlIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYwppbmRleCAyNWIwZjhhLi40MTQ2MDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCkBAIC00NCw3ICs0NCw2IEBACiAjZGVmaW5lIERFRklORV9BQ1BJX0dMT0JBTFMKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCkBAIC01MiwxMyArNTEsMTQgQEAKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0Z2xvYmFsIikKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KICAqCiAgKiBQQVJBTUVURVJTOiAgU3RhdHVzICAgICAgIC0gVGhlIGFjcGlfc3RhdHVzIGNvZGUgdG8gYmUgZm9ybWF0dGVkCiAgKgotICogUkVUVVJOOiAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiAgdGV4dAorICogUkVUVVJOOiAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0LiBBIHZhbGlkIHBvaW50ZXIgaXMKKyAqICAgICAgICAgICAgICBhbHdheXMgcmV0dXJuZWQuCiAgKgogICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyBhbiBBQ1BJIGV4Y2VwdGlvbiBpbnRvIGFuIEFTQ0lJIHN0cmluZy4KICAqCkBAIC02OCw4ICs2OCw4IEBACiBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKAogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKQogewotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKmV4Y2VwdGlvbiA9ICJVTktOT1dOX1NUQVRVU19DT0RFIjsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN1Yl9zdGF0dXM7CisJY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqZXhjZXB0aW9uID0gTlVMTDsKIAogCiAJQUNQSV9GVU5DVElPTl9OQU1FICgiZm9ybWF0X2V4Y2VwdGlvbiIpOwpAQCAtODIsNTcgKzgyLDU1IEBACiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9FTlZfTUFYKSB7CiAJCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfZW52IFtzdWJfc3RhdHVzXTsKLQkJCWJyZWFrOwogCQl9Ci0JCWdvdG8gdW5rbm93bjsKKwkJYnJlYWs7CiAKIAljYXNlIEFFX0NPREVfUFJPR1JBTU1FUjoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1BHTV9NQVgpIHsKIAkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19wZ20gW3N1Yl9zdGF0dXMgLTFdOwotCQkJYnJlYWs7CiAJCX0KLQkJZ290byB1bmtub3duOworCQlicmVhazsKIAogCWNhc2UgQUVfQ09ERV9BQ1BJX1RBQkxFUzoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1RCTF9NQVgpIHsKIAkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc190YmwgW3N1Yl9zdGF0dXMgLTFdOwotCQkJYnJlYWs7CiAJCX0KLQkJZ290byB1bmtub3duOworCQlicmVhazsKIAogCWNhc2UgQUVfQ09ERV9BTUw6CiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9BTUxfTUFYKSB7CiAJCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfYW1sIFtzdWJfc3RhdHVzIC0xXTsKLQkJCWJyZWFrOwogCQl9Ci0JCWdvdG8gdW5rbm93bjsKKwkJYnJlYWs7CiAKIAljYXNlIEFFX0NPREVfQ09OVFJPTDoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0NUUkxfTUFYKSB7CiAJCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfY3RybCBbc3ViX3N0YXR1cyAtMV07Ci0JCQlicmVhazsKIAkJfQotCQlnb3RvIHVua25vd247CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJZ290byB1bmtub3duOworCQlicmVhazsKIAl9CiAKKwlpZiAoIWV4Y2VwdGlvbikgeworCQkvKiBFeGNlcHRpb24gY29kZSB3YXMgbm90IHJlY29nbml6ZWQgKi8KIAotCXJldHVybiAoKGNvbnN0IGNoYXIgKikgZXhjZXB0aW9uKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiVW5rbm93biBleGNlcHRpb24gY29kZTogMHglOC44WFxuIiwgc3RhdHVzKSk7CiAKLXVua25vd246CisJCXJldHVybiAoKGNvbnN0IGNoYXIgKikgIlVOS05PV05fU1RBVFVTX0NPREUiKTsKKwl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gZXhjZXB0aW9uIGNvZGU6IDB4JTguOFhcbiIsIHN0YXR1cykpOwogCXJldHVybiAoKGNvbnN0IGNoYXIgKikgZXhjZXB0aW9uKTsKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFN0YXRpYyBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uCiAgKgpAQCAtMjEyLDEzICsyMTAsMTIgQEAKIH07CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBOYW1lc3BhY2UgZ2xvYmFscwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyoKICAqIFByZWRlZmluZWQgQUNQSSBOYW1lcyAoQnVpbHQtaW4gdG8gdGhlIEludGVycHJldGVyKQogICoKQEAgLTI0MSw5ICsyMzgsMTEgQEAKICNpZiAhZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSB8fCBkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkKIAl7Il9PU0kiLCAgICBBQ1BJX1RZUEVfTUVUSE9ELCAgICAgICAgICAgKGNoYXIgKikgMX0sCiAjZW5kaWYKLQl7TlVMTCwgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAgIC8qIFRhYmxlIHRlcm1pbmF0b3IgKi8KLX07CiAKKwkvKiBUYWJsZSB0ZXJtaW5hdG9yICovCisKKwl7TlVMTCwgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgTlVMTH0KK307CiAKIC8qCiAgKiBQcm9wZXJ0aWVzIG9mIHRoZSBBQ1BJIE9iamVjdCBUeXBlcywgYm90aCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwuCkBAIC0yODgsMjIgKzI4NywyNSBAQAogLyogSGV4IHRvIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUgKi8KIAogc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaGV4X3RvX2FzY2lpW10gPQotCQkJICB7JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywKLQkJCQkJICc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRid9OworeworCScwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsCisJJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJworfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIKICAqCiAgKiBQQVJBTUVURVJTOiAgSW50ZWdlciAgICAgICAgICAgICAtIENvbnRhaW5zIHRoZSBoZXggZGlnaXQKICAqICAgICAgICAgICAgICBQb3NpdGlvbiAgICAgICAgICAgIC0gYml0IHBvc2l0aW9uIG9mIHRoZSBkaWdpdCB3aXRoaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciAobXVsdGlwbGUgb2YgNCkKICAqCi0gKiBSRVRVUk46ICAgICAgQXNjaWkgY2hhcmFjdGVyCisgKiBSRVRVUk46ICAgICAgVGhlIGNvbnZlcnRlZCBBc2NpaSBjaGFyYWN0ZXIKICAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBhIGhleCBkaWdpdCB0byBhbiBhc2NpaSBjaGFyYWN0ZXIKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgaGV4IGRpZ2l0IHRvIGFuIEFzY2lpIGNoYXJhY3RlcgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogY2hhcgogYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhciAoCkBAIC0zMTUsNyArMzE3LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFRhYmxlIG5hbWUgZ2xvYmFscwogICoKQEAgLTMyNCw3ICszMjYsNyBAQAogICogdGhhdCBhcmUgbm90IHVzZWQgYnkgdGhlIHN1YnN5c3RlbSBhcmUgc2ltcGx5IGlnbm9yZWQuCiAgKgogICogRG8gTk9UIGFkZCBhbnkgdGFibGUgdG8gdGhpcyBsaXN0IHRoYXQgaXMgbm90IGNvbnN1bWVkIGRpcmVjdGx5IGJ5IHRoaXMKLSAqIHN1YnN5c3RlbS4KKyAqIHN1YnN5c3RlbSAoTm8gTUFEVCwgRUNEVCwgU0JTVCwgZXRjLikKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zOTEsNyArMzkzLDcgQEAKIAkvKiBBQ1BJX0VWRU5UX1JUQyAgICAgICAgICAgKi8gIHtBQ1BJX0JJVFJFR19SVF9DTE9DS19TVEFUVVMsICAgICAgIEFDUElfQklUUkVHX1JUX0NMT0NLX0VOQUJMRSwgICAgIEFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVMsICAgICAgIEFDUElfQklUTUFTS19SVF9DTE9DS19FTkFCTEV9LAogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZQogICoKQEAgLTQwMSw3ICs0MDMsNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBTcGFjZSBJRCBpbnRvIGEgbmFtZSBzdHJpbmcgKERlYnVnIG9ubHkpCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBSZWdpb24gdHlwZSBkZWNvZGluZyAqLwogCkBAIC00MjksNyArNDMxLDYgQEAKIAl7CiAJCXJldHVybiAoInVzZXJfZGVmaW5lZF9yZWdpb24iKTsKIAl9Ci0KIAllbHNlIGlmIChzcGFjZV9pZCA+PSBBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlMpCiAJewogCQlyZXR1cm4gKCJpbnZhbGlkX3NwYWNlX2lkIik7CkBAIC00MzksNyArNDQwLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUKICAqCkBAIC00NDksNyArNDUwLDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgRXZlbnQgSUQgaW50byBhIG5hbWUgc3RyaW5nIChEZWJ1ZyBvbmx5KQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogRXZlbnQgdHlwZSBkZWNvZGluZyAqLwogCkBAIC00NzcsNyArNDc4LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZQogICoKQEAgLTQ4NywyMCArNDg4LDIxIEBACiAgKgogICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIFR5cGUgSUQgaW50byBhIG5hbWUgc3RyaW5nIChEZWJ1ZyBvbmx5KQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKICAqIEVsZW1lbnRzIG9mIGFjcGlfZ2JsX25zX3R5cGVfbmFtZXMgYmVsb3cgbXVzdCBtYXRjaAogICogb25lLXRvLW9uZSB3aXRoIHZhbHVlcyBvZiBhY3BpX29iamVjdF90eXBlCiAgKgotICogVGhlIHR5cGUgQUNQSV9UWVBFX0FOWSAoVW50eXBlZCkgaXMgdXNlZCBhcyBhICJkb24ndCBjYXJlIiB3aGVuIHNlYXJjaGluZzsgd2hlbgotICogc3RvcmVkIGluIGEgdGFibGUgaXQgcmVhbGx5IG1lYW5zIHRoYXQgd2UgaGF2ZSB0aHVzIGZhciBzZWVuIG5vIGV2aWRlbmNlIHRvCi0gKiBpbmRpY2F0ZSB3aGF0IHR5cGUgaXMgYWN0dWFsbHkgZ29pbmcgdG8gYmUgc3RvcmVkIGZvciB0aGlzIGVudHJ5LgorICogVGhlIHR5cGUgQUNQSV9UWVBFX0FOWSAoVW50eXBlZCkgaXMgdXNlZCBhcyBhICJkb24ndCBjYXJlIiB3aGVuIHNlYXJjaGluZzsKKyAqIHdoZW4gc3RvcmVkIGluIGEgdGFibGUgaXQgcmVhbGx5IG1lYW5zIHRoYXQgd2UgaGF2ZSB0aHVzIGZhciBzZWVuIG5vCisgKiBldmlkZW5jZSB0byBpbmRpY2F0ZSB3aGF0IHR5cGUgaXMgYWN0dWFsbHkgZ29pbmcgdG8gYmUgc3RvcmVkIGZvciB0aGlzIGVudHJ5LgogICovCiBzdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9iYWRfdHlwZVtdID0gIlVOREVGSU5FRCI7Ci0jZGVmaW5lIFRZUEVfTkFNRV9MRU5HVEggICAgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGxlbmd0aCBvZiBlYWNoIHN0cmluZyAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfbnNfdHlwZV9uYW1lc1tdID0gLyogcHJpbnRhYmxlIG5hbWVzIG9mIEFDUEkgdHlwZXMgKi8KKy8qIFByaW50YWJsZSBuYW1lcyBvZiB0aGUgQUNQSSBvYmplY3QgdHlwZXMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX25zX3R5cGVfbmFtZXNbXSA9CiB7CiAJLyogMDAgKi8gIlVudHlwZWQiLAogCS8qIDAxICovICJJbnRlZ2VyIiwKQEAgLTU2NCw3ICs1NjYsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lCiAgKgpAQCAtNTc0LDcgKzU3Niw3IEBACiAgKgogICogREVTQ1JJUFRJT046IFZhbGlkYXRlIHRoZSBub2RlIGFuZCByZXR1cm4gdGhlIG5vZGUncyBBQ1BJIG5hbWUuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBjaGFyICoKIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAoCkBAIC02MTgsNyArNjIwLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQogICoKQEAgLTYyOCw5ICs2MzAsMTEgQEAKICAqCiAgKiBERVNDUklQVElPTjogVmFsaWRhdGUgb2JqZWN0IGFuZCByZXR1cm4gdGhlIGRlc2NyaXB0b3IgdHlwZQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tdID0gLyogcHJpbnRhYmxlIG5hbWVzIG9mIGRlc2NyaXB0b3IgdHlwZXMgKi8KKy8qIFByaW50YWJsZSBuYW1lcyBvZiBvYmplY3QgZGVzY3JpcHRvciB0eXBlcyAqLworCitzdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfZGVzY190eXBlX25hbWVzW10gPQogewogCS8qIDAwICovICJJbnZhbGlkIiwKIAkvKiAwMSAqLyAiQ2FjaGVkIiwKQEAgLTY3NiwxNyArNjgwLDE4IEBACiAgKiBTdHJpbmdzIGFuZCBwcm9jZWR1cmVzIHVzZWQgZm9yIGRlYnVnIG9ubHkKICAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZS4KKyAqIFBBUkFNRVRFUlM6ICBtdXRleF9pZCAgICAgICAgLSBUaGUgcHJlZGVmaW5lZCBJRCBmb3IgdGhpcyBtdXRleC4KICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIG11dGV4LiBBbHdheXMgcmV0dXJucyBhIHZhbGlkCisgKiAgICAgICAgICAgICAgcG9pbnRlci4KICAqCiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgbXV0ZXggSUQgaW50byBhIG5hbWUgc3RyaW5nIChEZWJ1ZyBvbmx5KQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogY2hhciAqCiBhY3BpX3V0X2dldF9tdXRleF9uYW1lICgKQEAgLTcwMCwyMSArNzA1LDIwIEBACiAKIAlyZXR1cm4gKGFjcGlfZ2JsX211dGV4X25hbWVzW211dGV4X2lkXSk7CiB9Ci0KICNlbmRpZgogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZQogICoKICAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgLSBPYmplY3QgdHlwZSB0byBiZSB2YWxpZGF0ZWQKICAqCi0gKiBSRVRVUk46ICAgICAgVFJVRSBpZiB2YWxpZCBvYmplY3QgdHlwZQorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdmFsaWQgb2JqZWN0IHR5cGUsIEZBTFNFIG90aGVyd2lzZQogICoKICAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBhbiBvYmplY3QgdHlwZQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdTgKIGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKApAQCAtNzMyLDcgKzczNiw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQKICAqCkBAIC03NDAsNyArNzQ0LDEwIEBACiAgKgogICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIGlkCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIE5PVEU6IHRoaXMgYWxnb3JpdGhtIGhhcyBhIHdyYXBhcm91bmQgcHJvYmxlbSBhdCA2NF9rIG1ldGhvZCBpbnZvY2F0aW9ucywgYW5kCisgKiAgICAgICBzaG91bGQgYmUgcmV2aXNpdGVkIChUQkQpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9vd25lcl9pZAogYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCAoCkBAIC03OTYsMTYgKzgwMywxOCBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2luaXRfZ2xvYmFscwogICoKLSAqIFBBUkFNRVRFUlM6ICBub25lCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IEluaXQgbGlicmFyeSBnbG9iYWxzLiAgQWxsIGdsb2JhbHMgdGhhdCByZXF1aXJlIHNwZWNpZmljCiAgKiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIGluaXRpYWxpemVkIGhlcmUhCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfaW5pdF9nbG9iYWxzICgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jCmluZGV4IGJkYmFkYWYuLjdmMzcxMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYwpAQCAtNDksMTkgKzQ5LDI5IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0aW5pdCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaXN0ZXJfbmFtZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKworc3RhdGljIHZvaWQgYWNwaV91dF90ZXJtaW5hdGUgKAorCXZvaWQpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcgogICoKLSAqIFBBUkFNRVRFUlM6ICAqcmVnaXN0ZXJfbmFtZSAgICAgICAgICAtIFBvaW50ZXIgdG8gc3RyaW5nIGlkZW50aWZ5aW5nIHJlZ2lzdGVyCisgKiBQQVJBTUVURVJTOiAgcmVnaXN0ZXJfbmFtZSAgICAgICAgICAgLSBQb2ludGVyIHRvIHN0cmluZyBpZGVudGlmeWluZyByZWdpc3RlcgogICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgIC0gQWN0dWFsIHJlZ2lzdGVyIGNvbnRlbnRzIHZhbHVlCi0gKiAgICAgICAgICAgICAgYWNwaV90ZXN0X3NwZWNfc2VjdGlvbiAgLSBURFMgc2VjdGlvbiBjb250YWluaW5nIGFzc2VydGlvbgotICogICAgICAgICAgICAgIGFjcGlfYXNzZXJ0aW9uICAgICAgICAgIC0gQXNzZXJ0aW9uIG51bWJlciBiZWluZyB0ZXN0ZWQKKyAqICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAtIEJ5dGUgb2Zmc2V0IGluIHRoZSBGQURUCiAgKgogICogUkVUVVJOOiAgICAgIEFFX0JBRF9WQUxVRQogICoKLSAqIERFU0NSSVBUSU9OOiBEaXNwbGF5IGZhaWx1cmUgbWVzc2FnZSBhbmQgbGluayBmYWlsdXJlIHRvIFREUyBhc3NlcnRpb24KKyAqIERFU0NSSVBUSU9OOiBEaXNwbGF5IGZhaWx1cmUgbWVzc2FnZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE2NiwxMiArMTc2LDEzIEBACiAgKgogICogUkVUVVJOOiAgICAgIG5vbmUKICAqCi0gKiBERVNDUklQVElPTjogZnJlZSBnbG9iYWwgbWVtb3J5CisgKiBERVNDUklQVElPTjogRnJlZSBnbG9iYWwgbWVtb3J5CiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF90ZXJtaW5hdGUgKHZvaWQpCitzdGF0aWMgdm9pZAorYWNwaV91dF90ZXJtaW5hdGUgKAorCXZvaWQpCiB7CiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrOwogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKm5leHRfZ3BlX2Jsb2NrOwpAQCAtMTgzLDggKzE5NCw2IEBACiAKIAogCS8qIEZyZWUgZ2xvYmFsIHRhYmxlcywgZXRjLiAqLwotCi0KIAkvKiBGcmVlIGdsb2JhbCBHUEUgYmxvY2tzIGFuZCByZWxhdGVkIGluZm8gc3RydWN0dXJlcyAqLwogCiAJZ3BlX3hydXB0X2luZm8gPSBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkOwpAQCAtMjIxLDcgKzIzMCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93biAodm9pZCkKK2FjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICgKKwl2b2lkKQogewogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X3N1YnN5c3RlbV9zaHV0ZG93biIpOwpAQCAtMjI5LDE0ICsyMzksMTYgQEAKIAkvKiBKdXN0IGV4aXQgaWYgc3Vic3lzdGVtIGlzIGFscmVhZHkgc2h1dGRvd24gKi8KIAogCWlmIChhY3BpX2dibF9zaHV0ZG93bikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkFDUEkgU3Vic3lzdGVtIGlzIGFscmVhZHkgdGVybWluYXRlZFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJBQ1BJIFN1YnN5c3RlbSBpcyBhbHJlYWR5IHRlcm1pbmF0ZWRcbiIpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCiAJLyogU3Vic3lzdGVtIGFwcGVhcnMgYWN0aXZlLCBnbyBhaGVhZCBhbmQgc2h1dCBpdCBkb3duICovCiAKIAlhY3BpX2dibF9zaHV0ZG93biA9IFRSVUU7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIlNodXR0aW5nIGRvd24gQUNQSSBTdWJzeXN0ZW0uLi5cbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAorCQkiU2h1dHRpbmcgZG93biBBQ1BJIFN1YnN5c3RlbS4uLlxuIikpOwogCiAJLyogQ2xvc2UgdGhlIGFjcGlfZXZlbnQgSGFuZGxpbmcgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKaW5kZXggMjUyNWMxYS4uMGQ1MjdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jCkBAIC0yNTksNiArMjU5LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9zaG9ydF9kaXZpZGUsIGFjcGlfdXRfZGl2aWRlCiAgKgorICogUEFSQU1FVEVSUzogIFNlZSBmdW5jdGlvbiBoZWFkZXJzIGFib3ZlCisgKgogICogREVTQ1JJUFRJT046IE5hdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgdXRfZGl2aWRlIGZ1bmN0aW9ucy4gVXNlIHRoZXNlIGlmIGVpdGhlcgogICogICAgICAgICAgICAgIDEpIFRoZSB0YXJnZXQgaXMgYSA2NC1iaXQgcGxhdGZvcm0gYW5kIHRoZXJlZm9yZSA2NC1iaXQKICAqICAgICAgICAgICAgICAgICBpbnRlZ2VyIG1hdGggaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGJ5IHRoZSBtYWNoaW5lLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKaW5kZXggZjY1OTg1NC4uZjZkZTRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCkBAIC00OSwxMiArNDksNTcgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRtaXNjIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY3JlYXRlX211dGV4ICgKKwlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2RlbGV0ZV9tdXRleCAoCisJYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9zdHJ1cHIgKHN0cnVwcikKKyAqCisgKiBQQVJBTUVURVJTOiAgc3JjX3N0cmluZyAgICAgIC0gVGhlIHNvdXJjZSBzdHJpbmcgdG8gY29udmVydAorICoKKyAqIFJFVFVSTjogICAgICBDb252ZXJ0ZWQgc3JjX3N0cmluZyAoc2FtZSBhcyBpbnB1dCBwb2ludGVyKQorICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IHN0cmluZyB0byB1cHBlcmNhc2UKKyAqCisgKiBOT1RFOiBUaGlzIGlzIG5vdCBhIFBPU0lYIGZ1bmN0aW9uLCBzbyBpdCBhcHBlYXJzIGhlcmUsIG5vdCBpbiB1dGNsaWIuYworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NoYXIgKgorYWNwaV91dF9zdHJ1cHIgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNyY19zdHJpbmcpCit7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nOworCisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCisKKwkvKiBXYWxrIGVudGlyZSBzdHJpbmcsIHVwcGVyY2FzaW5nIHRoZSBsZXR0ZXJzICovCisKKwlmb3IgKHN0cmluZyA9IHNyY19zdHJpbmc7ICpzdHJpbmc7IHN0cmluZysrKSB7CisJCSpzdHJpbmcgPSAoY2hhcikgQUNQSV9UT1VQUEVSICgqc3RyaW5nKTsKKwl9CisKKwlyZXR1cm4gKHNyY19zdHJpbmcpOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHJpbnRfc3RyaW5nCiAgKgogICogUEFSQU1FVEVSUzogIFN0cmluZyAgICAgICAgICAtIE51bGwgdGVybWluYXRlZCBBU0NJSSBzdHJpbmcKKyAqICAgICAgICAgICAgICBtYXhfbGVuZ3RoICAgICAgLSBNYXhpbXVtIG91dHB1dCBsZW5ndGgKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTE0OCw2ICsxOTMsOCBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBWYWx1ZSAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQKICAqCisgKiBSRVRVUk46ICAgICAgdTMyIGludGVnZXIgd2l0aCBieXRlcyBzd2FwcGVkCisgKgogICogREVTQ1JJUFRJT046IENvbnZlcnQgYSAzMi1iaXQgdmFsdWUgdG8gYmlnLWVuZGlhbiAoc3dhcCB0aGUgYnl0ZXMpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE2MCw3ICsyMDcsNiBAQAogCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CiAJCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1s0XTsKIAl9IG91dDsKLQogCXVuaW9uIHsKIAkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogCQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNbNF07CkBAIC0yMTksNyArMjY1LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgICAgICAtIEhhbmRsZSB3aG9zZSBwYXRobmFtZSB3aWxsIGJlIGRpc3BsYXllZAorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBPYmplY3QgdHlwZSBvZiB0aGUgbm9kZQorICogICAgICAgICAgICAgIG9ial9oYW5kbGUgICAgICAgICAgLSBIYW5kbGUgd2hvc2UgcGF0aG5hbWUgd2lsbCBiZSBkaXNwbGF5ZWQKICAqICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgIC0gQWRkaXRpb25hbCBwYXRoIHN0cmluZyB0byBiZSBhcHBlbmRlZC4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCBpZiBubyBleHRyYSBwYXRoKQogICoKQEAgLTI3MCw3ICszMTcsOCBAQAogCiAJLyogUHJpbnQgdGhlIG9iamVjdCB0eXBlIGFuZCBwYXRobmFtZSAqLwogCi0JYWNwaV9vc19wcmludGYgKCIlLTEycyAlcyIsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSksIChjaGFyICopIGJ1ZmZlci5wb2ludGVyKTsKKwlhY3BpX29zX3ByaW50ZiAoIiUtMTJzICVzIiwKKwkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSwgKGNoYXIgKikgYnVmZmVyLnBvaW50ZXIpOwogCiAJLyogRXh0cmEgcGF0aCBpcyB1c2VkIHRvIGFwcGVuZCBuYW1lcyBsaWtlIF9TVEEsIF9JTkksIGV0Yy4gKi8KIApAQCAtMjg4LDkgKzMzNiw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lCiAgKgotICogUEFSQU1FVEVSUzogIENoYXJhY3RlciAgICAgICAgICAgLSBUaGUgY2hhcmFjdGVyIHRvIGJlIGV4YW1pbmVkCisgKiBQQVJBTUVURVJTOiAgTmFtZSAgICAgICAgICAgIC0gVGhlIG5hbWUgdG8gYmUgZXhhbWluZWQKICAqCi0gKiBSRVRVUk46ICAgICAgMSBpZiBDaGFyYWN0ZXIgbWF5IGFwcGVhciBpbiBhIG5hbWUsIGVsc2UgMAorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGhlIG5hbWUgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZQogICoKICAqIERFU0NSSVBUSU9OOiBDaGVjayBmb3IgYSB2YWxpZCBBQ1BJIG5hbWUuICBFYWNoIGNoYXJhY3RlciBtdXN0IGJlIG9uZSBvZjoKICAqICAgICAgICAgICAgICAxKSBVcHBlciBjYXNlIGFscGhhCkBAIC00OTUsNDAgKzU0Myw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydXByCi0gKgotICogUEFSQU1FVEVSUzogIHNyY19zdHJpbmcgICAgICAtIFRoZSBzb3VyY2Ugc3RyaW5nIHRvIGNvbnZlcnQgdG8KLSAqCi0gKiBSRVRVUk46ICAgICAgc3JjX3N0cmluZwotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IHN0cmluZyB0byB1cHBlcmNhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1jaGFyICoKLWFjcGlfdXRfc3RydXByICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKQotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZzsKLQotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JLyogV2FsayBlbnRpcmUgc3RyaW5nLCB1cHBlcmNhc2luZyB0aGUgbGV0dGVycyAqLwotCi0JZm9yIChzdHJpbmcgPSBzcmNfc3RyaW5nOyAqc3RyaW5nOyApIHsKLQkJKnN0cmluZyA9IChjaGFyKSBBQ1BJX1RPVVBQRVIgKCpzdHJpbmcpOwotCQlzdHJpbmcrKzsKLQl9Ci0KLQlyZXR1cm4gKHNyY19zdHJpbmcpOwotfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9tdXRleF9pbml0aWFsaXplCiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUuCkBAIC02MTEsNyArNjI1LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NyZWF0ZV9tdXRleCAoCiAJYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCkKIHsKQEAgLTY0OCw3ICs2NjIsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfZGVsZXRlX211dGV4ICgKIAlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKQogewpAQCAtNzE1LDE2ICs3MjksMTYgQEAKIAkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7CiAJCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKIAkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkJIk11dGV4IFslc10gYWxyZWFkeSBhY3F1aXJlZCBieSB0aGlzIHRocmVhZCBbJVhdXG4iLAotCQkJCQkJCWFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSwgdGhpc190aHJlYWRfaWQpKTsKKwkJCQkJCSJNdXRleCBbJXNdIGFscmVhZHkgYWNxdWlyZWQgYnkgdGhpcyB0aHJlYWQgWyVYXVxuIiwKKwkJCQkJCWFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSwgdGhpc190aHJlYWRfaWQpKTsKIAogCQkJCQlyZXR1cm4gKEFFX0FMUkVBRFlfQUNRVUlSRUQpOwogCQkJCX0KIAogCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJIkludmFsaWQgYWNxdWlyZSBvcmRlcjogVGhyZWFkICVYIG93bnMgWyVzXSwgd2FudHMgWyVzXVxuIiwKLQkJCQkJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChpKSwKLQkJCQkJCWFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOworCQkJCQkiSW52YWxpZCBhY3F1aXJlIG9yZGVyOiBUaHJlYWQgJVggb3ducyBbJXNdLCB3YW50cyBbJXNdXG4iLAorCQkJCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAoaSksCisJCQkJCWFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOwogCiAJCQkJcmV0dXJuIChBRV9BQ1FVSVJFX0RFQURMT0NLKTsKIAkJCX0KQEAgLTczMywyMiArNzQ3LDIzIEBACiAjZW5kaWYKIAogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLAotCQkJICJUaHJlYWQgJVggYXR0ZW1wdGluZyB0byBhY3F1aXJlIE11dGV4IFslc11cbiIsCi0JCQkgdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOworCQkiVGhyZWFkICVYIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBNdXRleCBbJXNdXG4iLAorCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CiAKIAlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwKIAkJCSAgIDEsIEFDUElfV0FJVF9GT1JFVkVSKTsKIAlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiVGhyZWFkICVYIGFjcXVpcmVkIE11dGV4IFslc11cbiIsCi0JCQkJIHRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKKwkJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKIAogCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS51c2VfY291bnQrKzsKIAkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ub3duZXJfaWQgPSB0aGlzX3RocmVhZF9pZDsKIAl9CiAJZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVGhyZWFkICVYIGNvdWxkIG5vdCBhY3F1aXJlIE11dGV4IFslc10gJXNcbiIsCi0JCQkJIHRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCksCi0JCQkJIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJUaHJlYWQgJVggY291bGQgbm90IGFjcXVpcmUgTXV0ZXggWyVzXSAlc1xuIiwKKwkJCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpLAorCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCX0KIAogCXJldHVybiAoc3RhdHVzKTsKQEAgLTc5Myw4ICs4MDgsOCBAQAogCSAqLwogCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9PSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRCkgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiTXV0ZXggWyVzXSBpcyBub3QgYWNxdWlyZWQsIGNhbm5vdCByZWxlYXNlXG4iLAotCQkJCWFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOworCQkJIk11dGV4IFslc10gaXMgbm90IGFjcXVpcmVkLCBjYW5ub3QgcmVsZWFzZVxuIiwKKwkJCWFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOwogCiAJCXJldHVybiAoQUVfTk9UX0FDUVVJUkVEKTsKIAl9CkBAIC04MTIsOCArODI3LDggQEAKIAkJCX0KIAogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJJbnZhbGlkIHJlbGVhc2Ugb3JkZXI6IG93bnMgWyVzXSwgcmVsZWFzaW5nIFslc11cbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X211dGV4X25hbWUgKGkpLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKKwkJCQkiSW52YWxpZCByZWxlYXNlIG9yZGVyOiBvd25zIFslc10sIHJlbGVhc2luZyBbJXNdXG4iLAorCQkJCWFjcGlfdXRfZ2V0X211dGV4X25hbWUgKGkpLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKIAogCQkJcmV0dXJuIChBRV9SRUxFQVNFX0RFQURMT0NLKTsKIAkJfQpAQCAtODI2LDEzICs4NDEsMTQgQEAKIAlzdGF0dXMgPSBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUgKGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4LCAxKTsKIAogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJUaHJlYWQgJVggY291bGQgbm90IHJlbGVhc2UgTXV0ZXggWyVzXSAlc1xuIiwKLQkJCQkgdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSwKLQkJCQkgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIlRocmVhZCAlWCBjb3VsZCBub3QgcmVsZWFzZSBNdXRleCBbJXNdICVzXG4iLAorCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCX0KIAllbHNlIHsKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJUaHJlYWQgJVggcmVsZWFzZWQgTXV0ZXggWyVzXVxuIiwKLQkJCQkgdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOworCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOwogCX0KIAogCXJldHVybiAoc3RhdHVzKTsKQEAgLTg0MywxMSArODU5LDExIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaAogICoKLSAqIFBBUkFNRVRFUlM6ICAqT2JqZWN0ICAgICAgICAgLSBPYmplY3QgdG8gYmUgYWRkZWQgdG8gdGhlIG5ldyBzdGF0ZQorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHN0YXRlCiAgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gSW5jcmVtZW50L0RlY3JlbWVudAogICogICAgICAgICAgICAgIHN0YXRlX2xpc3QgICAgICAtIExpc3QgdGhlIHN0YXRlIHdpbGwgYmUgYWRkZWQgdG8KICAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQorICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgc3RhdGUgYW5kIHB1c2ggaXQKICAqCkBAIC04ODUsMTUgKzkwMSwxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2gKICAqCi0gKiBQQVJBTUVURVJTOiAgKk9iamVjdCAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcgc3RhdGUKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBPYmplY3QgdG8gYmUgYWRkZWQgdG8gdGhlIG5ldyBzdGF0ZQogICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIEluY3JlbWVudC9EZWNyZW1lbnQKICAqICAgICAgICAgICAgICBzdGF0ZV9saXN0ICAgICAgLSBMaXN0IHRoZSBzdGF0ZSB3aWxsIGJlIGFkZGVkIHRvCiAgKgotICogUkVUVVJOOiAgICAgIE5vbmUKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IHN0YXRlIGFuZCBwdXNoIGl0CiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoICgKQEAgLTkyNSw3ICs5NDIsNyBAQAogICogUEFSQU1FVEVSUzogIGxpc3RfaGVhZCAgICAgICAgICAgLSBIZWFkIG9mIHRoZSBzdGF0ZSBzdGFjawogICogICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgLSBTdGF0ZSBvYmplY3QgdG8gcHVzaAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IFB1c2ggYSBzdGF0ZSBvYmplY3Qgb250byBhIHN0YXRlIHN0YWNrCiAgKgpAQCAtOTU0LDcgKzk3MSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIGxpc3RfaGVhZCAgICAgICAgICAgLSBIZWFkIG9mIHRoZSBzdGF0ZSBzdGFjawogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBUaGUgcG9wcGVkIHN0YXRlIG9iamVjdAogICoKICAqIERFU0NSSVBUSU9OOiBQb3AgYSBzdGF0ZSBvYmplY3QgZnJvbSBhIHN0YXRlIHN0YWNrCiAgKgpAQCAtOTg5LDcgKzEwMDYsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIFRoZSBuZXcgc3RhdGUgb2JqZWN0LiBOVUxMIG9uIGZhaWx1cmUuCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGdlbmVyaWMgc3RhdGUgb2JqZWN0LiAgQXR0ZW1wdCB0byBvYnRhaW4gb25lIGZyb20KICAqICAgICAgICAgICAgICB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlOyAgSWYgbm9uZSBhdmFpbGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUuCkBAIC05OTcsNyArMTAxNCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKgotYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSAodm9pZCkKK2FjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKAorCXZvaWQpCiB7CiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7CiAKQEAgLTEwMjMsNyArMTA0MSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUKICAqCi0gKiBSRVRVUk46ICAgICAgVGhyZWFkIFN0YXRlCisgKiBSRVRVUk46ICAgICAgTmV3IFRocmVhZCBTdGF0ZS4gTlVMTCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJUaHJlYWQgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAogICogICAgICAgICAgICAgIHRvIHRyYWNrIHBlci10aHJlYWQgaW5mbyBkdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbgpAQCAtMTA2MCwxMSArMTA3OCwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUKICAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIEluaXRpYWwgT2JqZWN0IHRvIGJlIGluc3RhbGxlZCBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhbiAiVXBkYXRlIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKICAqICAgICAgICAgICAgICB0byB1cGRhdGUgcmVmZXJlbmNlIGNvdW50cyBhbmQgZGVsZXRlIGNvbXBsZXggb2JqZWN0cyBzdWNoCkBAIC0xMTA0LDExICsxMTIxLDEwIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gSW5pdGlhbCBPYmplY3QgdG8gYmUgaW5zdGFsbGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZQotICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgLSBVcGRhdGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZAorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIEluaXRpYWwgT2JqZWN0IHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgc3RhdGUKKyAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBVcGRhdGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIlBhY2thZ2UgU3RhdGUiCiAgKgpAQCAtMTE1MSw3ICsxMTY3LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIkNvbnRyb2wgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAogICogICAgICAgICAgICAgIHRvIHN1cHBvcnQgbmVzdGVkIElGL1dISUxFIGNvbnN0cnVjdHMgaW4gdGhlIEFNTC4KQEAgLTExOTAsNyArMTIwNiw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIFN0YXRlICAgICAgICAgICAgICAgLSBUaGUgc3RhdGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWQKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBQdXQgYSBzdGF0ZSBvYmplY3QgYmFjayBpbnRvIHRoZSBnbG9iYWwgc3RhdGUgY2FjaGUuICBUaGUgb2JqZWN0CiAgKiAgICAgICAgICAgICAgaXMgbm90IGFjdHVhbGx5IGZyZWVkIGF0IHRoaXMgdGltZS4KQEAgLTEyMTYsNyArMTIzMiw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBQdXJnZSB0aGUgZ2xvYmFsIHN0YXRlIG9iamVjdCBjYWNoZS4gIFVzZWQgZHVyaW5nIHN1YnN5c3RlbQogICogICAgICAgICAgICAgIHRlcm1pbmF0aW9uLgpAQCAtMTI0MCw3ICsxMjU2LDEwIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUKICAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIFBhY2thZ2Ugb2JqZWN0IG9uIHdoaWNoIHRvIHJlc29sdmUgcmVmcworICogUEFSQU1FVEVSUzogIHNvdXJjZV9vYmplY3QgICAgICAgLSBUaGUgcGFja2FnZSB0byB3YWxrCisgKiAgICAgICAgICAgICAgdGFyZ2V0X29iamVjdCAgICAgICAtIFRhcmdldCBvYmplY3QgKGlmIHBhY2thZ2UgaXMgYmVpbmcgY29waWVkKQorICogICAgICAgICAgICAgIHdhbGtfY2FsbGJhY2sgICAgICAgLSBDYWxsZWQgb25jZSBmb3IgZWFjaCBwYWNrYWdlIGVsZW1lbnQKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgIC0gUGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xMzU5LDcgKzEzNzgsNyBAQAogICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAtIEJ1ZmZlciB0byBiZSBzY2FubmVkCiAgKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIGV4YW1pbmUKICAqCi0gKiBSRVRVUk46ICAgICAgY2hlY2tzdW0KKyAqIFJFVFVSTjogICAgICBUaGUgZ2VuZXJhdGVkIGNoZWNrc3VtCiAgKgogICogREVTQ1JJUFRJT046IEdlbmVyYXRlIGEgY2hlY2tzdW0gb24gYSByYXcgYnVmZmVyCiAgKgpAQCAtMTQ0Miw3ICsxNDYxLDYgQEAKICAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICAgICAtIEVycm9yIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTE0NTcsNyArMTQ3NSw2IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQpCiB7CiAKLQogCWFjcGlfb3NfcHJpbnRmICgiJThzLSUwNGQ6ICoqKiBFcnJvcjogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKIH0KIApAQCAtMTQ2OSw3ICsxNDg2LDYgQEAKICAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICAgICAtIEVycm9yIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTE0OTUsNyArMTUxMSw2IEBACiAgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKaW5kZXggOWVlNDBhNC4uY2QzODk5YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKQEAgLTUwLDYgKzUwLDI1IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0b2JqZWN0IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLAorCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCAoCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAorCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjAsNyArNzksNyBAQAogICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDb21wb25lbnQgdHlwZSBvZiBjYWxsZXIKICAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgIC0gQUNQSSBUeXBlIG9mIHRoZSBuZXcgb2JqZWN0CiAgKgotICogUkVUVVJOOiAgICAgIE9iamVjdCAgICAgICAgICAgICAgLSBUaGUgbmV3IG9iamVjdC4gIE51bGwgb24gZmFpbHVyZQorICogUkVUVVJOOiAgICAgIEEgbmV3IGludGVybmFsIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnRlcm5hbCBvYmplY3QuCiAgKgpAQCAtODMsNyArMTAyLDggQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzZWNvbmRfb2JqZWN0OwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoInV0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnIiwgYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJ1dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyIsCisJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSkpOwogCiAKIAkvKiBBbGxvY2F0ZSB0aGUgcmF3IG9iamVjdCBkZXNjcmlwdG9yICovCkBAIC05OSw3ICsxMTksOCBAQAogCiAJCS8qIFRoZXNlIHR5cGVzIHJlcXVpcmUgYSBzZWNvbmRhcnkgb2JqZWN0ICovCiAKLQkJc2Vjb25kX29iamVjdCA9IGFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2NfZGJnIChtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsIGNvbXBvbmVudF9pZCk7CisJCXNlY29uZF9vYmplY3QgPSBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyAobW9kdWxlX25hbWUsCisJCQkJICAgbGluZV9udW1iZXIsIGNvbXBvbmVudF9pZCk7CiAJCWlmICghc2Vjb25kX29iamVjdCkgewogCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9iamVjdCk7CiAJCQlyZXR1cm5fUFRSIChOVUxMKTsKQEAgLTEzOCw3ICsxNTksNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBidWZmZXJfc2l6ZSAgICAgICAgICAgIC0gU2l6ZSBvZiBidWZmZXIgdG8gYmUgY3JlYXRlZAogICoKLSAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIGEgbmV3IEJ1ZmZlciBvYmplY3QKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIGEgbmV3IEJ1ZmZlciBvYmplY3QsIG51bGwgb24gZmFpbHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZCBidWZmZXIgb2JqZWN0CiAgKgpAQCAtMTkyLDkgKzIxMyw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QKICAqCi0gKiBQQVJBTUVURVJTOiAgc3RyaW5nX3NpemUgICAgICAgICAgICAtIFNpemUgb2Ygc3RyaW5nIHRvIGJlIGNyZWF0ZWQuICBEb2VzIG5vdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIE5VTEwgdGVybWluYXRvciwgdGhpcyBpcyBhZGRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5LgorICogUEFSQU1FVEVSUzogIHN0cmluZ19zaXplICAgICAgICAgLSBTaXplIG9mIHN0cmluZyB0byBiZSBjcmVhdGVkLiBEb2VzIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIE5VTEwgdGVybWluYXRvciwgdGhpcyBpcyBhZGRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5LgogICoKICAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIGEgbmV3IFN0cmluZyBvYmplY3QKICAqCkBAIC0yNDksNyArMjcwLDkgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIE9iamVjdCB0byBiZSB2YWxpZGF0ZWQKICAqCi0gKiBSRVRVUk46ICAgICAgVmFsaWRhdGUgYSBwb2ludGVyIHRvIGJlIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlCisgKgorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGEgcG9pbnRlciB0byBiZSBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0CiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMzk5LDggKzQyMiw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqaW50ZXJuYWxfb2JqZWN0ICAgIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHdlIGFyZSBleGFtaW5pbmcKLSAqICAgICAgICAgICAgICAqb2JqX2xlbmd0aCAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAtIEFuIEFDUEkgb3BlcmFuZCBvYmplY3QKKyAqICAgICAgICAgICAgICBvYmpfbGVuZ3RoICAgICAgICAgLSBXaGVyZSB0aGUgbGVuZ3RoIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTQxMiw3ICs0MzUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpCkBAIC00MjQsOCArNDQ3LDEwIEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJ1dF9nZXRfc2ltcGxlX29iamVjdF9zaXplIiwgaW50ZXJuYWxfb2JqZWN0KTsKIAogCi0JLyogSGFuZGxlIGEgbnVsbCBvYmplY3QgKENvdWxkIGJlIGEgdW5pbml0aWFsaXplZCBwYWNrYWdlIGVsZW1lbnQgLS0gd2hpY2ggaXMgbGVnYWwpICovCi0KKwkvKgorCSAqIEhhbmRsZSBhIG51bGwgb2JqZWN0IChDb3VsZCBiZSBhIHVuaW5pdGlhbGl6ZWQgcGFja2FnZQorCSAqIGVsZW1lbnQgLS0gd2hpY2ggaXMgbGVnYWwpCisJICovCiAJaWYgKCFpbnRlcm5hbF9vYmplY3QpIHsKIAkJKm9ial9sZW5ndGggPSAwOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKQEAgLTQ4MCw3ICs1MDUsOCBAQAogCQkJICogR2V0IHRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBmdWxsIHBhdGhuYW1lIHRvIHRoaXMgb2JqZWN0LgogCQkJICogVGhlIHJlZmVyZW5jZSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgcGF0aG5hbWUgdG8gdGhlIG9iamVjdAogCQkJICovCi0JCQlsZW5ndGggKz0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoIChpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlKSk7CisJCQlsZW5ndGggKz0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoCisJCQkJCSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGggKGludGVybmFsX29iamVjdC0+cmVmZXJlbmNlLm5vZGUpKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC01MzAsNyArNTU2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LApAQCAtNTgyLDggKzYwOCw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUKICAqCi0gKiBQQVJBTUVURVJTOiAgKmludGVybmFsX29iamVjdCAgICAtIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB3ZSBhcmUgZXhhbWluaW5nCi0gKiAgICAgICAgICAgICAgKm9ial9sZW5ndGggICAgICAgICAtIFdoZXJlIHRoZSBsZW5ndGggaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgIC0gQW4gQUNQSSBpbnRlcm5hbCBvYmplY3QKKyAqICAgICAgICAgICAgICBvYmpfbGVuZ3RoICAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC01OTUsNyArNjIxLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCkKQEAgLTYzNiw4ICs2NjIsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9vYmplY3Rfc2l6ZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqaW50ZXJuYWxfb2JqZWN0ICAgIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHdlIGFyZSBleGFtaW5pbmcKLSAqICAgICAgICAgICAgICAqb2JqX2xlbmd0aCAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCB3aWxsIGJlIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIEFuIEFDUEkgaW50ZXJuYWwgb2JqZWN0CisgKiAgICAgICAgICAgICAgb2JqX2xlbmd0aCAgICAgICAgICAtIFdoZXJlIHRoZSBsZW5ndGggd2lsbCBiZSByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC02NDcsNyArNjczLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9vYmplY3Rfc2l6ZSgKK2FjcGlfdXRfZ2V0X29iamVjdF9zaXplICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXR4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMKaW5kZXggOTdhOTFmMy4uZTg4MDNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMKQEAgLTczLDYgKzczLDcgQEAKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIAorCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0iKTsKIAogCkBAIC0xMDUsNyArMTA2LDYgQEAKIAkgKiBJbml0aWFsaXplIHRoZSBuYW1lc3BhY2UgbWFuYWdlciBhbmQKIAkgKiB0aGUgcm9vdCBvZiB0aGUgbmFtZXNwYWNlIHRyZWUKIAkgKi8KLQogCXN0YXR1cyA9IGFjcGlfbnNfcm9vdF9pbml0aWFsaXplICgpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTmFtZXNwYWNlIGluaXRpYWxpemF0aW9uIGZhaWx1cmUsICVzXG4iLApAQCAtMTEzLDcgKzExMyw2IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQogCS8qIElmIGNvbmZpZ3VyZWQsIGluaXRpYWxpemUgdGhlIEFNTCBkZWJ1Z2dlciAqLwogCiAJQUNQSV9ERUJVR0dFUl9FWEVDIChzdGF0dXMgPSBhY3BpX2RiX2luaXRpYWxpemUgKCkpOwpAQCAtMTUwLDcgKzE0OSw4IEBACiAJICogVGhlIHZhbHVlcyBmcm9tIHRoZSBGQURUIGFyZSB2YWxpZGF0ZWQgaGVyZS4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFSRFdBUkVfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBoYXJkd2FyZVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBoYXJkd2FyZVxuIikpOwogCiAJCXN0YXR1cyA9IGFjcGlfaHdfaW5pdGlhbGl6ZSAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMTc4LDcgKzE3OCw4IEBACiAJICogaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIgaW50ZXJmYWNlLgogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19BRERSRVNTX1NQQUNFX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbSW5pdF0gSW5zdGFsbGluZyBkZWZhdWx0IGFkZHJlc3Mgc3BhY2UgaGFuZGxlcnNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSJbSW5pdF0gSW5zdGFsbGluZyBkZWZhdWx0IGFkZHJlc3Mgc3BhY2UgaGFuZGxlcnNcbiIpKTsKIAogCQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzICgpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0xODksMTIgKzE5MCwxNCBAQAogCS8qCiAJICogSW5pdGlhbGl6ZSBBQ1BJIEV2ZW50IGhhbmRsaW5nIChGaXhlZCBhbmQgR2VuZXJhbCBQdXJwb3NlKQogCSAqCi0JICogTk9URTogV2UgbXVzdCBoYXZlIHRoZSBoYXJkd2FyZSBBTkQgZXZlbnRzIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBjYW4gZXhlY3V0ZQotCSAqIEFOWSBjb250cm9sIG1ldGhvZHMgU0FGRUxZLiAgQW55IGNvbnRyb2wgbWV0aG9kIGNhbiByZXF1aXJlIEFDUEkgaGFyZHdhcmUKLQkgKiBzdXBwb3J0LCBzbyB0aGUgaGFyZHdhcmUgTVVTVCBiZSBpbml0aWFsaXplZCBiZWZvcmUgZXhlY3V0aW9uIQorCSAqIE5PVEU6IFdlIG11c3QgaGF2ZSB0aGUgaGFyZHdhcmUgQU5EIGV2ZW50cyBpbml0aWFsaXplZCBiZWZvcmUgd2UgY2FuCisJICogZXhlY3V0ZSBBTlkgY29udHJvbCBtZXRob2RzIFNBRkVMWS4gIEFueSBjb250cm9sIG1ldGhvZCBjYW4gcmVxdWlyZQorCSAqIEFDUEkgaGFyZHdhcmUgc3VwcG9ydCwgc28gdGhlIGhhcmR3YXJlIE1VU1QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlCisJICogZXhlY3V0aW9uIQogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19FVkVOVF9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIGV2ZW50c1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBldmVudHNcbiIpKTsKIAogCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzICgpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0yMDUsNyArMjA4LDggQEAKIAkvKiBJbnN0YWxsIHRoZSBTQ0kgaGFuZGxlciBhbmQgR2xvYmFsIExvY2sgaGFuZGxlciAqLwogCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0hBTkRMRVJfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBJbnN0YWxsaW5nIFNDSS9HTCBoYW5kbGVyc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIltJbml0XSBJbnN0YWxsaW5nIFNDSS9HTCBoYW5kbGVyc1xuIikpOwogCiAJCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMjQ3LDcgKzI1MSw4IEBACiAJICogY29udGFpbiBleGVjdXRhYmxlIEFNTCAoc2VlIGNhbGwgdG8gYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMgYmVsb3cpLgogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19BRERSRVNTX1NQQUNFX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbSW5pdF0gRXhlY3V0aW5nIF9SRUcgb3BfcmVnaW9uIG1ldGhvZHNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSJbSW5pdF0gRXhlY3V0aW5nIF9SRUcgb3BfcmVnaW9uIG1ldGhvZHNcbiIpKTsKIAogCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfb3BfcmVnaW9ucyAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMjYxLDcgKzI2Niw4IEBACiAJICogb2JqZWN0czogb3BlcmF0aW9uX3JlZ2lvbnMsIGJ1ZmZlcl9maWVsZHMsIEJ1ZmZlcnMsIGFuZCBQYWNrYWdlcy4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fT0JKRUNUX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbSW5pdF0gQ29tcGxldGluZyBJbml0aWFsaXphdGlvbiBvZiBBQ1BJIE9iamVjdHNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSJbSW5pdF0gQ29tcGxldGluZyBJbml0aWFsaXphdGlvbiBvZiBBQ1BJIE9iamVjdHNcbiIpKTsKIAogCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMjc0LDcgKzI4MCw4IEBACiAJICogVGhpcyBydW5zIHRoZSBfU1RBIGFuZCBfSU5JIG1ldGhvZHMuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0RFVklDRV9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIERldmljZXNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCSJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgRGV2aWNlc1xuIikpOwogCiAJCXN0YXR1cyA9IGFjcGlfbnNfaW5pdGlhbGl6ZV9kZXZpY2VzICgpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0zMDcsNyArMzE0LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3Rlcm1pbmF0ZSAodm9pZCkKK2FjcGlfdGVybWluYXRlICgKKwl2b2lkKQogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKQEAgLTM0NCw4ICszNTIsNyBAQAogCiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfc3Vic3lzdGVtX3N0YXR1cwogICoKQEAgLTM1NCwxNCArMzYxLDE2IEBACiAgKiBSRVRVUk46ICAgICAgU3RhdHVzIG9mIHRoZSBBQ1BJIHN1YnN5c3RlbQogICoKICAqIERFU0NSSVBUSU9OOiBPdGhlciBkcml2ZXJzIHRoYXQgdXNlIHRoZSBBQ1BJIHN1YnN5c3RlbSBzaG91bGQgY2FsbCB0aGlzCi0gKiAgICAgICAgICAgICAgYmVmb3JlIG1ha2luZyBhbnkgb3RoZXIgY2FsbHMsIHRvIGVuc3VyZSB0aGUgc3Vic3lzdGVtIGluaXRpYWwtCi0gKiAgICAgICAgICAgICAgaXplZCBzdWNjZXNzZnVsbHkuCisgKiAgICAgICAgICAgICAgYmVmb3JlIG1ha2luZyBhbnkgb3RoZXIgY2FsbHMsIHRvIGVuc3VyZSB0aGUgc3Vic3lzdGVtCisgKiAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfc3Vic3lzdGVtX3N0YXR1cyAodm9pZCkKK2FjcGlfc3Vic3lzdGVtX3N0YXR1cyAoCisJdm9pZCkKIHsKKwogCWlmIChhY3BpX2dibF9zdGFydHVwX2ZsYWdzICYgQUNQSV9JTklUSUFMSVpFRF9PSykgewogCQlyZXR1cm4gKEFFX09LKTsKIAl9CkBAIC0zNzEsMTMgKzM4MCwxMiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3N5c3RlbV9pbmZvCiAgKgotICogUEFSQU1FVEVSUzogIG91dF9idWZmZXIgICAgICAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGggICAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIKKyAqIFBBUkFNRVRFUlM6ICBvdXRfYnVmZmVyICAgICAgLSBBIGJ1ZmZlciB0byByZWNlaXZlIHRoZSByZXNvdXJjZXMgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMgICAgICAgICAgLSB0aGUgc3RhdHVzIG9mIHRoZSBjYWxsCiAgKgpAQCAtMzk1LDggKzQwMyw4IEBACiAJc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqb3V0X2J1ZmZlcikKIHsKIAlzdHJ1Y3QgYWNwaV9zeXN0ZW1faW5mbyAgICAgICAgICppbmZvX3B0cjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfc3lzdGVtX2luZm8iKTsKQEAgLTQ2Niw2ICs0NzQsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyCiAgKgogICogUEFSQU1FVEVSUzogIEhhbmRsZXIgICAgICAgICAgICAgLSBDYWxsYmFjayBwcm9jZWR1cmUKKyAqICAgICAgICAgICAgICBGdW5jdGlvbiAgICAgICAgICAgIC0gTm90IChjdXJyZW50bHkpIHVzZWQsIHNlZSBiZWxvdwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00OTUsNyArNTA0LDYgQEAKIAogI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMKQEAgLTUwOSw3ICs1MTcsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzICh2b2lkKQorYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyAoCisJdm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdmlkZW8uYyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCmluZGV4IDcxZmExMDEuLjJjZjI2NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlby5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCkBAIC01NjQsMTIgKzU2NCwxMyBAQAogCQlpbnQgY291bnQgPSAwOwogCQl1bmlvbiBhY3BpX29iamVjdCAqbzsKIAkJCi0JCWJyID0ga21hbGxvYyhzaXplb2YgJmJyLCBHRlBfS0VSTkVMKTsKKwkJYnIgPSBrbWFsbG9jKHNpemVvZigqYnIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFicikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQl9IGVsc2UgewotCQkJbWVtc2V0KGJyLCAwLCBzaXplb2YgJmJyKTsKLQkJCWJyLT5sZXZlbHMgPSBrbWFsbG9jKG9iai0+cGFja2FnZS5jb3VudCAqIHNpemVvZiAmYnItPmxldmVscywgR0ZQX0tFUk5FTCk7CisJCQltZW1zZXQoYnIsIDAsIHNpemVvZigqYnIpKTsKKwkJCWJyLT5sZXZlbHMgPSBrbWFsbG9jKG9iai0+cGFja2FnZS5jb3VudCAqCisJCQkJCXNpemVvZiAqKGJyLT5sZXZlbHMpLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghYnItPmxldmVscykKIAkJCQlnb3RvIG91dDsKIApAQCAtNTg0LDggKzU4NSw3IEBACiAJCQl9CiBvdXQ6CiAJCQlpZiAoY291bnQgPCAyKSB7Ci0JCQkJaWYgKGJyLT5sZXZlbHMpCi0JCQkJCWtmcmVlKGJyLT5sZXZlbHMpOworCQkJCWtmcmVlKGJyLT5sZXZlbHMpOwogCQkJCWtmcmVlKGJyKTsKIAkJCX0gZWxzZSB7CiAJCQkJYnItPmNvdW50ID0gY291bnQ7CkBAIC01OTUsOCArNTk1LDcgQEAKIAkJfQogCX0KIAotCWlmIChvYmopCi0JCWtmcmVlKG9iaik7CisJa2ZyZWUob2JqKTsKIAogCXJldHVybl9WT0lEOwogfQpAQCAtMTU4NSw3ICsxNTg0LDcgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX3N3aXRjaF9vdXRwdXQiKTsKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmdmlkZW8tPnZpZGVvX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqIGRldiA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKKwkJZGV2ID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwogCQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUoZGV2LCAmc3RhdGUpOwogCQlpZiAoc3RhdGUgJiAweDIpewogCQkJZGV2X25leHQgPSBjb250YWluZXJfb2Yobm9kZS0+bmV4dCwgc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlLCBlbnRyeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvc3lzLmMgYi9kcml2ZXJzL2Jhc2Uvc3lzLmMKaW5kZXggZjM3YTEzZC4uMjE0Yjk2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3N5cy5jCisrKyBiL2RyaXZlcnMvYmFzZS9zeXMuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKLQogZXh0ZXJuIHN0cnVjdCBzdWJzeXN0ZW0gZGV2aWNlc19zdWJzeXM7CiAKICNkZWZpbmUgdG9fc3lzZGV2KGspIGNvbnRhaW5lcl9vZihrLCBzdHJ1Y3Qgc3lzX2RldmljZSwga29iaikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCmluZGV4IDVlZjlhZGIuLmJkMmVjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC04OTUsMTEgKzg5NCw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZibHVlY2FyZF9ldmVudDsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIApAQCAtMTEwMyw2ICsxMDk3LDcgQEAKIAkJLm5hbWUJPSAiYmx1ZWNhcmRfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBibHVlY2FyZF9hdHRhY2gsCisJLmV2ZW50CQk9IGJsdWVjYXJkX2V2ZW50LAogCS5kZXRhY2gJCT0gYmx1ZWNhcmRfZGV0YWNoLAogCS5pZF90YWJsZQk9IGJsdWVjYXJkX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKaW5kZXggOTAxM2NkNy4uYWRmMTc1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTY5NiwxMSArNjk1LDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCSAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmJ0M2NfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTk0Nyw2ICs5NDEsNyBAQAogCQkubmFtZQk9ICJidDNjX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gYnQzY19hdHRhY2gsCisJLmV2ZW50CQk9IGJ0M2NfZXZlbnQsCiAJLmRldGFjaAkJPSBidDNjX2RldGFjaCwKIAkuaWRfdGFibGUJPSBidDNjX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCmluZGV4IGM0Nzk0ODQuLmU0YzU5ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02MTUsMTEgKzYxNCw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZidHVhcnRfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTg2Nyw2ICs4NjEsNyBAQAogCQkubmFtZQk9ICJidHVhcnRfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBidHVhcnRfYXR0YWNoLAorCS5ldmVudAkJPSBidHVhcnRfZXZlbnQsCiAJLmRldGFjaAkJPSBidHVhcnRfZGV0YWNoLAogCS5pZF90YWJsZQk9IGJ0dWFydF9pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCmluZGV4IGJiMTJmN2QuLmUzOTg2OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTU5NCwxMSArNTkzLDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmR0bDFfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTgyMCw2ICs4MTQsNyBAQAogCQkubmFtZQk9ICJkdGwxX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gZHRsMV9hdHRhY2gsCisJLmV2ZW50CQk9IGR0bDFfZXZlbnQsCiAJLmRldGFjaAkJPSBkdGwxX2RldGFjaCwKIAkuaWRfdGFibGUJPSBkdGwxX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYwppbmRleCAzMjU2MTkyLi5mOWI5NTZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogCXBvbGxfd2FpdChmaWxlLCAmaGNpX3ZoY2ktPnJlYWRfd2FpdCwgd2FpdCk7CiAgCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJmhjaV92aGNpLT5yZWFkcSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmhjaV92aGNpLT5yZWFkcSkpCiAJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwogCiAJcmV0dXJuIFBPTExPVVQgfCBQT0xMV1JOT1JNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDFhZmY4MTkuLjA4ZjY5MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTQwLDcgKzQwLDcgQEAKIG9iai0kKENPTkZJR19BTUlHQV9CVUlMVElOX1NFUklBTCkgKz0gYW1pc2VyaWFsLm8KIG9iai0kKENPTkZJR19TWCkJCSs9IHN4Lm8gZ2VuZXJpY19zZXJpYWwubwogb2JqLSQoQ09ORklHX1JJTykJCSs9IHJpby8gZ2VuZXJpY19zZXJpYWwubwotb2JqLSQoQ09ORklHX0hWQ19DT05TT0xFKQkrPSBodmNfY29uc29sZS5vIGh2c2kubworb2JqLSQoQ09ORklHX0hWQ19DT05TT0xFKQkrPSBodmNfY29uc29sZS5vIGh2Y192aW8ubyBodnNpLm8KIG9iai0kKENPTkZJR19SQVdfRFJJVkVSKQkrPSByYXcubwogb2JqLSQoQ09ORklHX1NHSV9TTlNDKQkJKz0gc25zYy5vIHNuc2NfZXZlbnQubwogb2JqLSQoQ09ORklHX01NVElNRVIpCQkrPSBtbXRpbWVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZwppbmRleCBjMmIxMmVhLi4xMjM0MTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL2RybS9LY29uZmlnCkBAIC05NiwzICs5NiwxMCBAQAogICAgICAgICAgIGNoaXBzZXQuIElmIE0gaXMgc2VsZWN0ZWQgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzaXMuIEFHUAogICAgICAgICAgIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZHJpdmVyIHRvIHdvcmsuCiAKK2NvbmZpZyBEUk1fVklBCisJdHJpc3RhdGUgIlZpYSB1bmljaHJvbWUgdmlkZW8gY2FyZHMiCisJZGVwZW5kcyBvbiBEUk0KKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBWaWEgdW5pY2hyb21lIG9yIGNvbXBhdGlibGUgdmlkZW8KKwkgIGNoaXBzZXQuIElmIE0gaXMgc2VsZWN0ZWQgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2aWEuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZHJtL01ha2VmaWxlCmluZGV4IDc0NDRkZWMuLmRkZDk0MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZQpAQCAtMTgsMTAgKzE4LDE0IEBACiByYWRlb24tb2JqcyA6PSByYWRlb25fZHJ2Lm8gcmFkZW9uX2NwLm8gcmFkZW9uX3N0YXRlLm8gcmFkZW9uX21lbS5vIHJhZGVvbl9pcnEubwogZmZiLW9ianMgICAgOj0gZmZiX2Rydi5vIGZmYl9jb250ZXh0Lm8KIHNpcy1vYmpzICAgIDo9IHNpc19kcnYubyBzaXNfZHMubyBzaXNfbW0ubwordmlhLW9ianMgICAgOj0gdmlhX2lycS5vIHZpYV9kcnYubyB2aWFfZHMubyB2aWFfbWFwLm8gdmlhX21tLm8gdmlhX2RtYS5vIHZpYV92ZXJpZmllci5vIHZpYV92aWRlby5vCiAKIGlmZXEgKCQoQ09ORklHX0NPTVBBVCkseSkKIGRybS1vYmpzICAgICs9IGRybV9pb2MzMi5vCiByYWRlb24tb2JqcyArPSByYWRlb25faW9jMzIubworbWdhLW9ianMgICAgKz0gbWdhX2lvYzMyLm8KK3IxMjgtb2JqcyAgICs9IHIxMjhfaW9jMzIubworaTkxNS1vYmpzICAgKz0gaTkxNV9pb2MzMi5vCiBlbmRpZgogCiBvYmotJChDT05GSUdfRFJNKQkrPSBkcm0ubwpAQCAtMzUsNCArMzksNSBAQAogb2JqLSQoQ09ORklHX0RSTV9JOTE1KSAgKz0gaTkxNS5vCiBvYmotJChDT05GSUdfRFJNX0ZGQikgICArPSBmZmIubwogb2JqLSQoQ09ORklHX0RSTV9TSVMpICAgKz0gc2lzLm8KK29iai0kKENPTkZJR19EUk1fVklBKQkrPXZpYS5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYyBiL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYwppbmRleCBmZGNhMTg3Li4wYWVjNWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCkBAIC01Miw3ICs1Miw3IEBACiAjIGRlZmluZSBBVElfTUFYX1BDSUdBUlRfUEFHRVMJCTgxOTIJLyoqPCAzMiBNQiBhcGVydHVyZSwgNEsgcGFnZXMgKi8KICMgZGVmaW5lIEFUSV9QQ0lHQVJUX1BBR0VfU0laRQkJNDA5NgkvKio8IFBDSSBHQVJUIHBhZ2Ugc2l6ZSAqLwogCi11bnNpZ25lZCBsb25nIGRybV9hdGlfYWxsb2NfcGNpZ2FydF90YWJsZSggdm9pZCApCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkcm1fYXRpX2FsbG9jX3BjaWdhcnRfdGFibGUoIHZvaWQgKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCmluZGV4IDU4NzMwNTIuLmU4MzcxZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm0uaApAQCAtMzgsNyArMzgsOSBAQAogI2RlZmluZSBfRFJNX0hfCiAKICNpZiBkZWZpbmVkKF9fbGludXhfXykKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjZW5kaWYKICNpbmNsdWRlIDxhc20vaW9jdGwuaD4JCS8qIEZvciBfSU8qIG1hY3JvcyAqLwogI2RlZmluZSBEUk1fSU9DVExfTlIobikJCV9JT0NfTlIobikKICNkZWZpbmUgRFJNX0lPQ19WT0lECQlfSU9DX05PTkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKaW5kZXggYjA0ZGRmMS4uNWRmMDljYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKQEAgLTc3NCw4ICs3NzQsNiBAQAogCQkJCS8qIERyaXZlciBzdXBwb3J0IChkcm1fZHJ2LmgpICovCiBleHRlcm4gaW50ICAgICAgICAgICBkcm1faW5pdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKIGV4dGVybiB2b2lkICAgICAgICAgIGRybV9leGl0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOwotZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3ZlcnNpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50ICAgICAgICAgICBkcm1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGxvbmcJICAgICBkcm1fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLApAQCAtNzg1LDI4ICs3ODMsMTkgQEAKIAkJCQkvKiBEZXZpY2Ugc3VwcG9ydCAoZHJtX2ZvcHMuaCkgKi8KIGV4dGVybiBpbnQgICAgICAgICAgIGRybV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgICAgICAgICAgIGRybV9zdHViX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIGludAkgICAgIGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQkgICAgICBkcm1fZGV2aWNlX3QgKmRldik7CiBleHRlcm4gaW50CSAgICAgZHJtX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQJICAgICBkcm1fZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbik7CiBleHRlcm4gaW50ICAgICAgICAgICBkcm1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKIAkJCQkvKiBNYXBwaW5nIHN1cHBvcnQgKGRybV92bS5oKSAqLwotZXh0ZXJuIHZvaWQJICAgICBkcm1fdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci1leHRlcm4gdm9pZAkgICAgIGRybV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci1leHRlcm4gdm9pZAkgICAgIGRybV92bV9zaG1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotZXh0ZXJuIGludAkgICAgIGRybV9tbWFwX2RtYShzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQkgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBleHRlcm4gaW50CSAgICAgZHJtX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgIGRybV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOwotZXh0ZXJuIHNzaXplX3QgICAgICAgZHJtX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOwogCiAJCQkJLyogTWVtb3J5IG1hbmFnZW1lbnQgc3VwcG9ydCAoZHJtX21lbW9yeS5oKSAqLwogI2luY2x1ZGUgImRybV9tZW1vcnkuaCIKIGV4dGVybiB2b2lkCSAgICAgZHJtX21lbV9pbml0KHZvaWQpOwogZXh0ZXJuIGludAkgICAgIGRybV9tZW1faW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogCQkJCSAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci1leHRlcm4gdm9pZAkgICAgICpkcm1fY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsIGludCBhcmVhKTsKIGV4dGVybiB2b2lkCSAgICAgKmRybV9yZWFsbG9jKHZvaWQgKm9sZHB0LCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IHNpemUsCiAJCQkJICAgaW50IGFyZWEpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2FsbG9jX3BhZ2VzKGludCBvcmRlciwgaW50IGFyZWEpOwpAQCAtODU0LDkgKzg0Myw2IEBACiBleHRlcm4gaW50CSAgICAgZHJtX3JtY3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKIAotZXh0ZXJuIGludAkgICAgIGRybV9jb250ZXh0X3N3aXRjaChkcm1fZGV2aWNlX3QgKmRldiwgaW50IG9sZCwgaW50IG5ldyk7Ci1leHRlcm4gaW50CSAgICAgZHJtX2NvbnRleHRfc3dpdGNoX2NvbXBsZXRlKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbmV3KTsKLQogZXh0ZXJuIGludAkgICAgIGRybV9jdHhiaXRtYXBfaW5pdCggZHJtX2RldmljZV90ICpkZXYgKTsKIGV4dGVybiB2b2lkCSAgICAgZHJtX2N0eGJpdG1hcF9jbGVhbnVwKCBkcm1fZGV2aWNlX3QgKmRldiApOwogZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtX2N0eGJpdG1hcF9mcmVlKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGN0eF9oYW5kbGUgKTsKQEAgLTg3NCw5ICs4NjAsNiBAQAogCiAKIAkJCQkvKiBBdXRoZW50aWNhdGlvbiBJT0NUTCBzdXBwb3J0IChkcm1fYXV0aC5oKSAqLwotZXh0ZXJuIGludAkgICAgIGRybV9hZGRfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKnByaXYsCi0JCQkJICAgIGRybV9tYWdpY190IG1hZ2ljKTsKLWV4dGVybiBpbnQJICAgICBkcm1fcmVtb3ZlX21hZ2ljKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWFnaWNfdCBtYWdpYyk7CiBleHRlcm4gaW50CSAgICAgZHJtX2dldG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQJICAgICBkcm1fYXV0aG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtODkzLDEzICs4NzYsOSBAQAogCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50CSAgICAgZHJtX2xvY2tfdGFrZShfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY29udGV4dCk7Ci1leHRlcm4gaW50CSAgICAgZHJtX2xvY2tfdHJhbnNmZXIoZHJtX2RldmljZV90ICpkZXYsCi0JCQkJCV9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssCi0JCQkJCXVuc2lnbmVkIGludCBjb250ZXh0KTsKIGV4dGVybiBpbnQJICAgICBkcm1fbG9ja19mcmVlKGRybV9kZXZpY2VfdCAqZGV2LAogCQkJCSAgICBfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY29udGV4dCk7Ci1leHRlcm4gaW50ICAgICAgICAgICBkcm1fbm90aWZpZXIodm9pZCAqcHJpdik7CiAKIAkJCQkvKiBCdWZmZXIgbWFuYWdlbWVudCBzdXBwb3J0IChkcm1fYnVmcy5oKSAqLwogZXh0ZXJuIGludAkgICAgIGRybV9vcmRlciggdW5zaWduZWQgbG9uZyBzaXplICk7CkBAIC05MjcsNyArOTA2LDYgQEAKIAkJCQkvKiBJUlEgc3VwcG9ydCAoZHJtX2lycS5oKSAqLwogZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2NvbnRyb2woIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7Ci1leHRlcm4gaW50ICAgICAgICAgICBkcm1faXJxX2luc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CiBleHRlcm4gaW50ICAgICAgICAgICBkcm1faXJxX3VuaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKIGV4dGVybiBpcnFyZXR1cm5fdCAgIGRybV9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICk7CiBleHRlcm4gdm9pZCAgICAgICAgICBkcm1fZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOwpAQCAtOTY3LDcgKzk0NSw2IEBACiBleHRlcm4gaW50IGRybV9nZXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAogCQkgICAgIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOwogZXh0ZXJuIGludCBkcm1fcHV0X2Rldihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCBkcm1fZ2V0X2hlYWQoZHJtX2RldmljZV90ICogZGV2LCBkcm1faGVhZF90ICpoZWFkKTsKIGV4dGVybiBpbnQgZHJtX3B1dF9oZWFkKGRybV9oZWFkX3QgKiBoZWFkKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgICBkcm1fZGVidWc7CiBleHRlcm4gdW5zaWduZWQgaW50ICAgZHJtX2NhcmRzX2xpbWl0OwpAQCAtMTA2NCw5ICsxMDQxLDE2IEBACiB7CiAJa2ZyZWUocHQpOwogfQorCisvKiogV3JhcHBlciBhcm91bmQga2NhbGxvYygpICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkICpkcm1fY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCXJldHVybiBrY2FsbG9jKG5tZW1iLCBzaXplLCBHRlBfS0VSTkVMKTsKK30KICNlbHNlCiBleHRlcm4gdm9pZCAqZHJtX2FsbG9jKHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CiBleHRlcm4gdm9pZCBkcm1fZnJlZSh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKTsKK2V4dGVybiB2b2lkICpkcm1fY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsIGludCBhcmVhKTsKICNlbmRpZgogCiAvKkB9Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYwppbmRleCBiNDI4NzYxLi5kZDE0MGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAgKiBhc3NvY2lhdGVkIHRoZSBtYWdpYyBudW1iZXIgaGFzaCBrZXkgaW4gZHJtX2RldmljZTo6bWFnaWNsaXN0LCB3aGlsZSBob2xkaW5nCiAgKiB0aGUgZHJtX2RldmljZTo6c3RydWN0X3NlbSBsb2NrLgogICovCi1pbnQgZHJtX2FkZF9tYWdpYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZpbGVfdCAqcHJpdiwgZHJtX21hZ2ljX3QgbWFnaWMpCitzdGF0aWMgaW50IGRybV9hZGRfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKnByaXYsIGRybV9tYWdpY190IG1hZ2ljKQogewogCWludAkJICBoYXNoOwogCWRybV9tYWdpY19lbnRyeV90ICplbnRyeTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogICogU2VhcmNoZXMgYW5kIHVubGlua3MgdGhlIGVudHJ5IGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCB3aXRoIHRoZSBtYWdpYwogICogbnVtYmVyIGhhc2gga2V5LCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3Rfc2VtIGxvY2suCiAgKi8KLWludCBkcm1fcmVtb3ZlX21hZ2ljKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKK3N0YXRpYyBpbnQgZHJtX3JlbW92ZV9tYWdpYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCiB7CiAJZHJtX21hZ2ljX2VudHJ5X3QgKnByZXYgPSBOVUxMOwogCWRybV9tYWdpY19lbnRyeV90ICpwdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwppbmRleCAzNDA3MzgwLi40YzYxOTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCkBAIC0zNTYsOCArMzU2LDggQEAKICAqIHJlYWxsb2NhdGVzIHRoZSBidWZmZXIgbGlzdCBvZiB0aGUgc2FtZSBzaXplIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcKICAqIGJ1ZmZlcnMuCiAgKi8KLWludCBkcm1fYWRkYnVmc19hZ3AoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCitzdGF0aWMgaW50IGRybV9hZGRidWZzX2FncCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQogewogCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CkBAIC01MjEsOCArNTIxLDggQEAKIH0KICNlbmRpZiAvKiBfX09TX0hBU19BR1AgKi8KIAotaW50IGRybV9hZGRidWZzX3BjaSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfcGNpKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCiB7CiAgICAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKQEAgLTc1MSw4ICs3NTEsOCBAQAogCiB9CiAKLWludCBkcm1fYWRkYnVmc19zZyggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCitzdGF0aWMgaW50IGRybV9hZGRidWZzX3NnKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKIHsKIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCmluZGV4IGZkZjY2MWYuLmE3Y2ZhYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKQEAgLTg0LDcgKzg0LDcgQEAKICAqIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgZW50cnkgd2hpbGUgaG9sZGluZyB0aGUKICAqIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KICAqLwotaW50IGRybV9jdHhiaXRtYXBfbmV4dCggZHJtX2RldmljZV90ICpkZXYgKQorc3RhdGljIGludCBkcm1fY3R4Yml0bWFwX25leHQoIGRybV9kZXZpY2VfdCAqZGV2ICkKIHsKIAlpbnQgYml0OwogCkBAIC0zMjYsNyArMzI2LDcgQEAKICAqIGhhcmR3YXJlIGxvY2sgaXMgaGVsZCwgY2xlYXJzIHRoZSBkcm1fZGV2aWNlOjpjb250ZXh0X2ZsYWcgYW5kIHdha2VzIHVwCiAgKiBkcm1fZGV2aWNlOjpjb250ZXh0X3dhaXQuCiAgKi8KLWludCBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbmV3ICkKK3N0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoX2NvbXBsZXRlKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IG5ldyApCiB7CiAgICAgICAgIGRldi0+bGFzdF9jb250ZXh0ID0gbmV3OyAgLyogUFJFL1BPU1Q6IFRoaXMgaXMgdGhlIF9vbmx5XyB3cml0ZXIuICovCiAgICAgICAgIGRldi0+bGFzdF9zd2l0Y2ggID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKaW5kZXggMWUzN2VkMC4uMzMzM2MyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKQEAgLTUxLDggKzUxLDExIEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jb3JlLmgiCiAKK3N0YXRpYyBpbnQgZHJtX3ZlcnNpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKIC8qKiBJb2N0bCB0YWJsZSAqLwotZHJtX2lvY3RsX2Rlc2NfdAkJICBkcm1faW9jdGxzW10gPSB7CitzdGF0aWMgZHJtX2lvY3RsX2Rlc2NfdAkJICBkcm1faW9jdGxzW10gPSB7CiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVkVSU0lPTildICAgICAgID0geyBkcm1fdmVyc2lvbiwgICAgIDAsIDAgfSwKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfVU5JUVVFKV0gICAgPSB7IGRybV9nZXR1bmlxdWUsICAgMCwgMCB9LAogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9NQUdJQyldICAgICA9IHsgZHJtX2dldG1hZ2ljLCAgICAwLCAwIH0sCkBAIC00NDcsOCArNDUwLDggQEAKICAqCiAgKiBGaWxscyBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBccCBhcmcuCiAgKi8KLWludCBkcm1fdmVyc2lvbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQorc3RhdGljIGludCBkcm1fdmVyc2lvbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCiB7CiAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYwppbmRleCA5MDY3OTQyLi4xMGU2NGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCkBAIC0zNyw2ICszNyw4IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAorc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIGRybV9kZXZpY2VfdCAqZGV2KTsKKwogc3RhdGljIGludCBkcm1fc2V0dXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKIHsKIAlpbnQgaTsKQEAgLTI1MSw3ICsyNTMsNyBAQAogCQl9CiAJfQogCQotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkgJiYgIWRldi0+ZHJpdmVyLT5yZWxlYXNlKQogCXsKIAkJZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOwogCX0KQEAgLTI1OSw3ICsyNjEsNyBAQAogCWRybV9mYXN5bmMoIC0xLCBmaWxwLCAwICk7CiAKIAlkb3duKCAmZGV2LT5jdHhsaXN0X3NlbSApOwotCWlmICggIWxpc3RfZW1wdHkoICZkZXYtPmN0eGxpc3QtPmhlYWQgKSApIHsKKwlpZiAoIGRldi0+Y3R4bGlzdCAmJiAoIWxpc3RfZW1wdHkoJmRldi0+Y3R4bGlzdC0+aGVhZCkpKSB7CiAJCWRybV9jdHhfbGlzdF90ICpwb3MsICpuOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSggcG9zLCBuLCAmZGV2LT5jdHhsaXN0LT5oZWFkLCBoZWFkICkgewpAQCAtMzQxLDcgKzM0Myw3IEBACiAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGRybV9maWxlIHN0cnVjdHVyZSBmb3IgdGhlIGZpbGUgcHJpdmF0ZSBkYXRhIGluIFxwCiAgKiBmaWxwIGFuZCBhZGQgaXQgaW50byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IGluIFxwIGRldi4KICAqLwotaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RldmljZV90ICpkZXYpCiB7CiAJaW50CSAgICAgbWlub3IgPSBpbWlub3IoaW5vZGUpOwogCWRybV9maWxlX3QgICAqcHJpdjsKQEAgLTQ0Myw5ICs0NDUsMyBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fcG9sbCk7CiAKLQotLyoqIE5vLW9wLiAqLwotc3NpemVfdCBkcm1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKLXsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKaW5kZXggMmUyMzZlYi4uY2RkNGFlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKQEAgLTg5LDcgKzg5LDcgQEAKICAqIFxjIGRybV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoKSBhbmQgXGMgZHJtX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoKSBmdW5jdGlvbnMKICAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbi4KICAqLwotaW50IGRybV9pcnFfaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKQorc3RhdGljIGludCBkcm1faXJxX2luc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgc2hfZmxhZ3M9MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYwppbmRleCBkMGQ2ZmM2Li40NzAyZDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCkBAIC0zNSw2ICszNSwxMSBAQAogCiAjaW5jbHVkZSAiZHJtUC5oIgogCitzdGF0aWMgaW50IGRybV9sb2NrX3RyYW5zZmVyKGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICAgICBfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY29udGV4dCk7CitzdGF0aWMgaW50IGRybV9ub3RpZmllcih2b2lkICpwcml2KTsKKwogLyoqIAogICogTG9jayBpb2N0bC4KICAqCkBAIC0yMjUsOCArMjMwLDkgQEAKICAqIFJlc2V0cyB0aGUgbG9jayBmaWxlIHBvaW50ZXIuCiAgKiBNYXJrcyB0aGUgbG9jayBhcyBoZWxkIGJ5IHRoZSBnaXZlbiBjb250ZXh0LCB2aWEgdGhlIFxwIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uCiAgKi8KLWludCBkcm1fbG9ja190cmFuc2Zlcihkcm1fZGV2aWNlX3QgKmRldiwKLQkJICAgICAgIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssIHVuc2lnbmVkIGludCBjb250ZXh0KQorc3RhdGljIGludCBkcm1fbG9ja190cmFuc2Zlcihkcm1fZGV2aWNlX3QgKmRldiwKKwkJCSAgICAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvbnRleHQpCiB7CiAJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OwogCkBAIC0yODIsNyArMjg4LDcgQEAKICAqIFxyZXR1cm4gb25lIGlmIHRoZSBzaWduYWwgc2hvdWxkIGJlIGRlbGl2ZXJlZCBub3JtYWxseSwgb3IgemVybyBpZiB0aGUKICAqIHNpZ25hbCBzaG91bGQgYmUgYmxvY2tlZC4KICAqLwotaW50IGRybV9ub3RpZmllcih2b2lkICpwcml2KQorc3RhdGljIGludCBkcm1fbm90aWZpZXIodm9pZCAqcHJpdikKIHsKIAlkcm1fc2lnZGF0YV90ICpzID0gKGRybV9zaWdkYXRhX3QgKilwcml2OwogCXVuc2lnbmVkIGludCAgb2xkLCBuZXcsIHByZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jCmluZGV4IDdmNTNmNzUuLmFjZTNkNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jCkBAIC02NSwxOSArNjUsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiogV3JhcHBlciBhcm91bmQga21hbGxvYygpICovCi12b2lkICpkcm1fY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsIGludCBhcmVhKQotewotCXZvaWQgKmFkZHI7Ci0KLQlhZGRyID0ga21hbGxvYyhzaXplICogbm1lbWIsIEdGUF9LRVJORUwpOwotCWlmIChhZGRyICE9IE5VTEwpCi0JCW1lbXNldCgodm9pZCAqKWFkZHIsIDAsIHNpemUgKiBubWVtYik7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX2NhbGxvYyk7Ci0KIC8qKiBXcmFwcGVyIGFyb3VuZCBrbWFsbG9jKCkgYW5kIGtmcmVlKCkgKi8KIHZvaWQgKmRybV9yZWFsbG9jKHZvaWQgKm9sZHB0LCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IHNpemUsIGludCBhcmVhKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2lpZHMuaAppbmRleCAxMWM2OTUwLi43MGNhNGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2lpZHMuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2lpZHMuaApAQCAtMjIzLDMgKzIyMywxMCBAQAogCXsweDgwODYsIDB4Mjc3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKIAl7MCwgMCwgMH0KIAorI2RlZmluZSB2aWFkcnZfUENJX0lEUyBcCisJezB4MTEwNiwgMHgzMDIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDExMDYsIDB4MzEyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMTA2LCAweDcyMDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTEwNiwgMHg3MjA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXswLCAwLCAwfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKaW5kZXggNmUwNmU4Yy4uNDc3NDA4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYwpAQCAtNTcsNyArNTcsNyBAQAogLyoqCiAgKiBQcm9jIGZpbGUgbGlzdC4KICAqLwotc3RydWN0IGRybV9wcm9jX2xpc3Qgeworc3RhdGljIHN0cnVjdCBkcm1fcHJvY19saXN0IHsKIAljb25zdCBjaGFyICpuYW1lOwkvKio8IGZpbGUgbmFtZSAqLwogCWludAkgICAoKmYpKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CS8qKjwgcHJvYyBjYWxsYmFjayovCiB9IGRybV9wcm9jX2xpc3RbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYwppbmRleCA4Y2NiZGVmLi40ODgyOWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCkBAIC0xNTcsNTIgKzE1Nyw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotCi0vKioKLSAqIFJlZ2lzdGVyLgotICoKLSAqIFxwYXJhbSBwZGV2IC0gUENJIGRldmljZSBzdHJ1Y3R1cmUKLSAqIFxwYXJhbSBlbnQgZW50cnkgZnJvbSB0aGUgUENJIElEIHRhYmxlIHdpdGggZGV2aWNlIHR5cGUgZmxhZ3MKLSAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCi0gKgotICogQXR0ZW1wdCB0byBnZXRzIGludGVyIG1vZHVsZSAiZHJtIiBpbmZvcm1hdGlvbi4gSWYgd2UgYXJlIGZpcnN0Ci0gKiB0aGVuIHJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBpbnRlciBtb2R1bGUgaW5mb3JtYXRpb24uCi0gKiBUcnkgYW5kIHJlZ2lzdGVyLCBpZiB3ZSBmYWlsIHRvIHJlZ2lzdGVyLCBiYWNrb3V0IHByZXZpb3VzIHdvcmsuCi0gKi8KLWludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKLQkgICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQotewotCWRybV9kZXZpY2VfdCAqZGV2OwotCWludCByZXQ7Ci0KLQlEUk1fREVCVUcoIlxuIik7Ci0KLQlkZXYgPSBkcm1fY2FsbG9jKDEsIHNpemVvZigqZGV2KSwgRFJNX01FTV9TVFVCKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQotCWlmICgocmV0ID0gZHJtX2ZpbGxfaW5fZGV2KGRldiwgcGRldiwgZW50LCBkcml2ZXIpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkRSTTogRmlsbF9pbl9kZXYgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZXJyX2cxOwotCX0KLQlpZiAoKHJldCA9IGRybV9nZXRfaGVhZChkZXYsICZkZXYtPnByaW1hcnkpKSkKLQkJZ290byBlcnJfZzE7Ci0KLQkvKiBwb3N0aW5pdCBpcyBhIHJlcXVpcmVkIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHNpZ25vbiBiYW5uZXIgKi8KLQkvKiBkcml2ZXJzIGFkZCBzZWNvbmRhcnkgaGVhZHMgaGVyZSBpZiBuZWVkZWQgKi8KLQlpZiAoKHJldCA9IGRldi0+ZHJpdmVyLT5wb3N0aW5pdChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKLQkJZ290byBlcnJfZzE7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2cxOgotCWRybV9mcmVlKGRldiwgc2l6ZW9mKCpkZXYpLCBEUk1fTUVNX1NUVUIpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV9nZXRfZGV2KTsKLQogLyoqCiAgKiBHZXQgYSBzZWNvbmRhcnkgbWlub3IgbnVtYmVyLgogICoKQEAgLTIxNCw3ICsxNjgsNyBAQAogICogY3JlYXRlIHRoZSBwcm9jIGluaXQgZW50cnkgdmlhIHByb2NfaW5pdCgpLiBUaGlzIHJvdXRpbmVzIGFzc2lnbnMKICAqIG1pbm9yIG51bWJlcnMgdG8gc2Vjb25kYXJ5IGhlYWRzIG9mIG11bHRpLWhlYWRlZCBjYXJkcwogICovCi1pbnQgZHJtX2dldF9oZWFkKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faGVhZF90ICpoZWFkKQorc3RhdGljIGludCBkcm1fZ2V0X2hlYWQoZHJtX2RldmljZV90ICpkZXYsIGRybV9oZWFkX3QgKmhlYWQpCiB7CiAJZHJtX2hlYWRfdCAqKmhlYWRzID0gZHJtX2hlYWRzOwogCWludCByZXQ7CkBAIC0yNjIsNiArMjE2LDUwIEBACiAJcmV0dXJuIHJldDsKIH0KIAkJCisvKioKKyAqIFJlZ2lzdGVyLgorICoKKyAqIFxwYXJhbSBwZGV2IC0gUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbSBlbnQgZW50cnkgZnJvbSB0aGUgUENJIElEIHRhYmxlIHdpdGggZGV2aWNlIHR5cGUgZmxhZ3MKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQXR0ZW1wdCB0byBnZXRzIGludGVyIG1vZHVsZSAiZHJtIiBpbmZvcm1hdGlvbi4gSWYgd2UgYXJlIGZpcnN0CisgKiB0aGVuIHJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBpbnRlciBtb2R1bGUgaW5mb3JtYXRpb24uCisgKiBUcnkgYW5kIHJlZ2lzdGVyLCBpZiB3ZSBmYWlsIHRvIHJlZ2lzdGVyLCBiYWNrb3V0IHByZXZpb3VzIHdvcmsuCisgKi8KK2ludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKKwkgICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQoreworCWRybV9kZXZpY2VfdCAqZGV2OworCWludCByZXQ7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlkZXYgPSBkcm1fY2FsbG9jKDEsIHNpemVvZigqZGV2KSwgRFJNX01FTV9TVFVCKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmICgocmV0ID0gZHJtX2ZpbGxfaW5fZGV2KGRldiwgcGRldiwgZW50LCBkcml2ZXIpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRSTTogRmlsbF9pbl9kZXYgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX2cxOworCX0KKwlpZiAoKHJldCA9IGRybV9nZXRfaGVhZChkZXYsICZkZXYtPnByaW1hcnkpKSkKKwkJZ290byBlcnJfZzE7CisKKwkvKiBwb3N0aW5pdCBpcyBhIHJlcXVpcmVkIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHNpZ25vbiBiYW5uZXIgKi8KKwkvKiBkcml2ZXJzIGFkZCBzZWNvbmRhcnkgaGVhZHMgaGVyZSBpZiBuZWVkZWQgKi8KKwlpZiAoKHJldCA9IGRldi0+ZHJpdmVyLT5wb3N0aW5pdChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKKwkJZ290byBlcnJfZzE7CisKKwlyZXR1cm4gMDsKKworZXJyX2cxOgorCWRybV9mcmVlKGRldiwgc2l6ZW9mKCpkZXYpLCBEUk1fTUVNX1NUVUIpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZXRfZGV2KTsKIAogLyoqCiAgKiBQdXQgYSBkZXZpY2UgbWlub3IgbnVtYmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKaW5kZXggZmM3MmYzMC4uNjIxMjIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCkBAIC0zOCw2ICszOCw4IEBACiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjZW5kaWYKIAorc3RhdGljIHZvaWQgZHJtX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworc3RhdGljIHZvaWQgZHJtX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIAogLyoqCiAgKiBcYyBub3BhZ2UgbWV0aG9kIGZvciBBR1AgdmlydHVhbCBtZW1vcnkuCkBAIC0xNjMsNyArMTY1LDcgQEAKICAqIERlbGV0ZXMgbWFwIGluZm9ybWF0aW9uIGlmIHdlIGFyZSB0aGUgbGFzdAogICogcGVyc29uIHRvIGNsb3NlIGEgbWFwcGluZyBhbmQgaXQncyBub3QgaW4gdGhlIGdsb2JhbCBtYXBsaXN0LgogICovCi12b2lkIGRybV92bV9zaG1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgdm9pZCBkcm1fdm1fc2htX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWRybV9maWxlX3QJKnByaXYJPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKQEAgLTM5OSw3ICs0MDEsNyBAQAogICogQ3JlYXRlIGEgbmV3IGRybV92bWFfZW50cnkgc3RydWN0dXJlIGFzIHRoZSBccCB2bWEgcHJpdmF0ZSBkYXRhIGVudHJ5IGFuZAogICogYWRkIGl0IHRvIGRybV9kZXZpY2U6OnZtYWxpc3QuCiAgKi8KLXZvaWQgZHJtX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgdm9pZCBkcm1fdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlkcm1fZmlsZV90CSpwcml2CT0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXY7CkBAIC00MjgsNyArNDMwLDcgQEAKICAqIFNlYXJjaCB0aGUgXHAgdm1hIHByaXZhdGUgZGF0YSBlbnRyeSBpbiBkcm1fZGV2aWNlOjp2bWFsaXN0LCB1bmxpbmsgaXQsIGFuZAogICogZnJlZSBpdC4KICAqLwotdm9pZCBkcm1fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgdm9pZCBkcm1fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJZHJtX2ZpbGVfdAkqcHJpdgk9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2OwpAQCAtNDYzLDcgKzQ2NSw3IEBACiAgKiBTZXRzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhcmVhIG9wZXJhdGlvbnMgc3RydWN0dXJlIHRvIHZtX2RtYV9vcHMsIHRoZSBmaWxlCiAgKiBwb2ludGVyLCBhbmQgY2FsbHMgdm1fb3BlbigpLgogICovCi1pbnQgZHJtX21tYXBfZG1hKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgZHJtX21tYXBfZG1hKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlkcm1fZmlsZV90CSAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90CSAqZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCmluZGV4IDI0ODU3Y2MuLjE4ZTBiNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKQEAgLTkwLDE2ICs5MCw3IEBACiAgICAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4MTBfYnVmZmVyX2ZvcHMgPSB7Ci0JLm9wZW4JID0gZHJtX29wZW4sCi0JLmZsdXNoCSA9IGRybV9mbHVzaCwKLQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAotCS5pb2N0bAkgPSBkcm1faW9jdGwsCi0JLm1tYXAJID0gaTgxMF9tbWFwX2J1ZmZlcnMsCi0JLmZhc3luYyAgPSBkcm1fZmFzeW5jLAotfTsKLQotaW50IGk4MTBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgaTgxMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWRybV9maWxlX3QJICAgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90CSAgICAqZGV2OwpAQCAtMTI2LDYgKzExNywxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODEwX2J1ZmZlcl9mb3BzID0geworCS5vcGVuCSA9IGRybV9vcGVuLAorCS5mbHVzaAkgPSBkcm1fZmx1c2gsCisJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkuaW9jdGwJID0gZHJtX2lvY3RsLAorCS5tbWFwCSA9IGk4MTBfbW1hcF9idWZmZXJzLAorCS5mYXN5bmMgID0gZHJtX2Zhc3luYywKK307CisKIHN0YXRpYyBpbnQgaTgxMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKQEAgLTEwMDMsOCArMTAwMyw4IEBACiAJfQogfQogCi1pbnQgaTgxMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgaTgxMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKICAgIAlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKICAgIAlkcm1fZGV2aWNlX3QJICAqZGV2CSAgPSBwcml2LT5oZWFkLT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKaW5kZXggZmEyM2NhNC4uMWI0MDUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaApAQCAtMTE1LDcgKzExNSw2IEBACiAKIAkJCQkvKiBpODEwX2RtYS5jICovCiBleHRlcm4gdm9pZCBpODEwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIGludCBpODEwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiBleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpOwogZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCmluZGV4IDk4YWRjY2YuLmRjNzczMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKQEAgLTkyLDE2ICs5Miw3IEBACiAgICAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4MzBfYnVmZmVyX2ZvcHMgPSB7Ci0JLm9wZW4JID0gZHJtX29wZW4sCi0JLmZsdXNoCSA9IGRybV9mbHVzaCwKLQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAotCS5pb2N0bAkgPSBkcm1faW9jdGwsCi0JLm1tYXAJID0gaTgzMF9tbWFwX2J1ZmZlcnMsCi0JLmZhc3luYyAgPSBkcm1fZmFzeW5jLAotfTsKLQotaW50IGk4MzBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgaTgzMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWRybV9maWxlX3QJICAgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90CSAgICAqZGV2OwpAQCAtMTI4LDYgKzExOSwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODMwX2J1ZmZlcl9mb3BzID0geworCS5vcGVuCSA9IGRybV9vcGVuLAorCS5mbHVzaAkgPSBkcm1fZmx1c2gsCisJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkuaW9jdGwJID0gZHJtX2lvY3RsLAorCS5tbWFwCSA9IGk4MzBfbW1hcF9idWZmZXJzLAorCS5mYXN5bmMgID0gZHJtX2Zhc3luYywKK307CisKIHN0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYwppbmRleCBhYTgwYWQ2Li5iYzM2YmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCkBAIC00MCw3ICs0MCw3IEBACiAKICNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCiAKLWludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCitzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKIHsKIAlkZXYtPmNvdW50ZXJzICs9IDQ7CiAJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKaW5kZXggZDRiMmQwOS4uZGY3NzQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApAQCAtMTIzLDggKzEyMyw2IEBACiAvKiBpODMwX2RtYS5jICovCiBleHRlcm4gdm9pZCBpODMwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOwogCi1leHRlcm4gaW50IGk4MzBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci0KIC8qIGk4MzBfaXJxLmMgKi8KIGV4dGVybiBpbnQgaTgzMF9pcnFfZW1pdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCmluZGV4IDZkNzcyOWYuLmE1OTIzZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKQEAgLTU0LDggKzU0LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLQotaW50IGk4MzBfZW1pdF9pcnEoZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgaW50IGk4MzBfZW1pdF9pcnEoZHJtX2RldmljZV90ICpkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC03Myw3ICs3Miw3IEBACiB9CiAKIAotaW50IGk4MzBfd2FpdF9pcnEoZHJtX2RldmljZV90ICpkZXYsIGludCBpcnFfbnIpCitzdGF0aWMgaW50IGk4MzBfd2FpdF9pcnEoZHJtX2RldmljZV90ICpkZXYsIGludCBpcnFfbnIpCiB7CiAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gCiAJICAgKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKaW5kZXggYjU5MDNmOS4uYWNmOWU1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwpAQCAtMzIsMjMgKzMyLDYgQEAKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAKLWRybV9pb2N0bF9kZXNjX3QgaTkxNV9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVQpXSA9IHtpOTE1X2RtYV9pbml0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMVVNIKV0gPSB7aTkxNV9mbHVzaF9pb2N0bCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTElQKV0gPSB7aTkxNV9mbGlwX2J1ZnMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQkFUQ0hCVUZGRVIpXSA9IHtpOTE1X2JhdGNoYnVmZmVyLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9FTUlUKV0gPSB7aTkxNV9pcnFfZW1pdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfV0FJVCldID0ge2k5MTVfaXJxX3dhaXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfR0VUUEFSQU0pXSA9IHtpOTE1X2dldHBhcmFtLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X1NFVFBBUkFNKV0gPSB7aTkxNV9zZXRwYXJhbSwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9BTExPQyldID0ge2k5MTVfbWVtX2FsbG9jLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZSRUUpXSA9IHtpOTE1X21lbV9mcmVlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVRfSEVBUCldID0ge2k5MTVfbWVtX2luaXRfaGVhcCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9DTURCVUZGRVIpXSA9IHtpOTE1X2NtZGJ1ZmZlciwgMSwgMH0KLX07Ci0KLWludCBpOTE1X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk5MTVfaW9jdGxzKTsKLQogLyogUmVhbGx5IHdhbnQgYW4gT1MtaW5kZXBlbmRlbnQgcmVzZXR0YWJsZSB0aW1lci4gIFdvdWxkIGxpa2UgdG8gaGF2ZQogICogdGhpcyBsb29wIHJ1biBmb3IgKGVnKSAzIHNlYywgYnV0IGhhdmUgdGhlIHRpbWVyIHJlc2V0IGV2ZXJ5IHRpbWUKICAqIHRoZSBoZWFkIHBvaW50ZXIgY2hhbmdlcywgc28gdGhhdCBFQlVTWSBvbmx5IGhhcHBlbnMgaWYgdGhlIHJpbmcKQEAgLTk1LDcgKzc4LDcgQEAKIAkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfUklOR19FTVBUWTsKIH0KIAotaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKIAkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCkBAIC0yNDcsNyArMjMwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk5MTVfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpCitzdGF0aWMgaW50IGk5MTVfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2OwpAQCAtNTU4LDcgKzU0MSw3IEBACiAJcmV0dXJuIGk5MTVfd2FpdF9yaW5nKGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLWludCBpOTE1X2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKQorc3RhdGljIGludCBpOTE1X2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAKQEAgLTU2Nyw3ICs1NTAsNyBAQAogCXJldHVybiBpOTE1X3F1aWVzY2VudChkZXYpOwogfQogCi1pbnQgaTkxNV9iYXRjaGJ1ZmZlcihEUk1fSU9DVExfQVJHUykKK3N0YXRpYyBpbnQgaTkxNV9iYXRjaGJ1ZmZlcihEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC02MDEsNyArNTg0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaTkxNV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpCitzdGF0aWMgaW50IGk5MTVfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTYzNywxOCArNjIwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk5MTVfZG9fY2xlYW51cF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlICE9IDApCi0JCWk5MTVfZGlzcGF0Y2hfZmxpcChkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpOTE1X2ZsaXBfYnVmcyhEUk1fSU9DVExfQVJHUykKK3N0YXRpYyBpbnQgaTkxNV9mbGlwX2J1ZnMoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIApAQCAtNjU5LDcgKzYzMSw3IEBACiAJcmV0dXJuIGk5MTVfZGlzcGF0Y2hfZmxpcChkZXYpOwogfQogCi1pbnQgaTkxNV9nZXRwYXJhbShEUk1fSU9DVExfQVJHUykKK3N0YXRpYyBpbnQgaTkxNV9nZXRwYXJhbShEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNjk0LDcgKzY2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKQorc3RhdGljIGludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC03NDMsMyArNzE1LDE5IEBACiAJfQogfQogCitkcm1faW9jdGxfZGVzY190IGk5MTVfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JTklUKV0gPSB7aTkxNV9kbWFfaW5pdCwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTFVTSCldID0ge2k5MTVfZmx1c2hfaW9jdGwsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRkxJUCldID0ge2k5MTVfZmxpcF9idWZzLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0JBVENIQlVGRkVSKV0gPSB7aTkxNV9iYXRjaGJ1ZmZlciwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfRU1JVCldID0ge2k5MTVfaXJxX2VtaXQsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSVJRX1dBSVQpXSA9IHtpOTE1X2lycV93YWl0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0dFVFBBUkFNKV0gPSB7aTkxNV9nZXRwYXJhbSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9TRVRQQVJBTSldID0ge2k5MTVfc2V0cGFyYW0sIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQUxMT0MpXSA9IHtpOTE1X21lbV9hbGxvYywgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GUkVFKV0gPSB7aTkxNV9tZW1fZnJlZSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JTklUX0hFQVApXSA9IHtpOTE1X21lbV9pbml0X2hlYXAsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQ01EQlVGRkVSKV0gPSB7aTkxNV9jbWRidWZmZXIsIDEsIDB9Cit9OworCitpbnQgaTkxNV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpOTE1X2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKaW5kZXggZTZhOWUxZC4uMWY1OWQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYwpAQCAtMzQsNyArMzQsNyBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1pbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQorc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCiB7CiAJZGV2LT5jb3VudGVycyArPSA0OwogCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROwpAQCAtOTcsNiArOTcsOSBAQAogCQkubW1hcCA9IGRybV9tbWFwLAogCQkucG9sbCA9IGRybV9wb2xsLAogCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJCS5jb21wYXRfaW9jdGwgPSBpOTE1X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogCX0sCiAJLnBjaV9kcml2ZXIgPSB7CiAJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKaW5kZXggZmE5NDBkNi4uOWMzN2QyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaApAQCAtOTksMTQgKzk5LDYgQEAKIH0gZHJtX2k5MTVfcHJpdmF0ZV90OwogCiAJCQkJLyogaTkxNV9kbWEuYyAqLwotZXh0ZXJuIGludCBpOTE1X2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKTsKLWV4dGVybiBpbnQgaTkxNV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCBpOTE1X2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKTsKLWV4dGVybiBpbnQgaTkxNV9iYXRjaGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7Ci1leHRlcm4gaW50IGk5MTVfZmxpcF9idWZzKERSTV9JT0NUTF9BUkdTKTsKLWV4dGVybiBpbnQgaTkxNV9nZXRwYXJhbShEUk1fSU9DVExfQVJHUyk7Ci1leHRlcm4gaW50IGk5MTVfc2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBpOTE1X2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gdm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KTsKIGV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCk7CkBAIC0xMTQsOCArMTA2LDYgQEAKIC8qIGk5MTVfaXJxLmMgKi8KIGV4dGVybiBpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfaXJxX3dhaXQoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBpOTE1X3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucik7Ci1leHRlcm4gaW50IGk5MTVfZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KTsKIAogZXh0ZXJuIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CiBleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKmRldik7CkBAIC0xMzAsNiArMTIwLDEwIEBACiBleHRlcm4gdm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwKIAkJCSAgICAgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKTsKIAorZXh0ZXJuIGxvbmcgaTkxNV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CisKKwogI2RlZmluZSBJOTE1X1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQogI2RlZmluZSBJOTE1X1dSSVRFKHJlZyx2YWwpICAgICBEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQogI2RlZmluZSBJOTE1X1JFQUQxNihyZWcpIAlEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lvYzMyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaW9jMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTAwOWUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lvYzMyLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qKgorICogXGZpbGUgaTkxNV9pb2MzMi5jCisgKgorICogMzItYml0IGlvY3RsIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIHRoZSBpOTE1IERSTS4KKyAqCisgKiBcYXV0aG9yIEFsYW4gSG91cmloYW5lIDxhbGFuaEBmYWlybGl0ZS5kZW1vbi5jby51az4gCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMjAwNQorICogQ29weXJpZ2h0IChDKSBBbGFuIEhvdXJpaGFuZSAyMDA1CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9iYXRjaGJ1ZmZlcjMyIHsKKwlpbnQgc3RhcnQ7CQkvKiBhZ3Agb2Zmc2V0ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwl1MzIgY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KK30gZHJtX2k5MTVfYmF0Y2hidWZmZXIzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9pOTE1X2JhdGNoYnVmZmVyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2k5MTVfYmF0Y2hidWZmZXIzMl90IGJhdGNoYnVmZmVyMzI7CisJZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCBfX3VzZXIgKmJhdGNoYnVmZmVyOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmYmF0Y2hidWZmZXIzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoYmF0Y2hidWZmZXIzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwliYXRjaGJ1ZmZlciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqYmF0Y2hidWZmZXIpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJhdGNoYnVmZmVyLCBzaXplb2YoKmJhdGNoYnVmZmVyKSkKKwkgICAgfHwgX19wdXRfdXNlcihiYXRjaGJ1ZmZlcjMyLnN0YXJ0LCAmYmF0Y2hidWZmZXItPnN0YXJ0KQorCSAgICB8fCBfX3B1dF91c2VyKGJhdGNoYnVmZmVyMzIudXNlZCwgJmJhdGNoYnVmZmVyLT51c2VkKQorCSAgICB8fCBfX3B1dF91c2VyKGJhdGNoYnVmZmVyMzIuRFIxLCAmYmF0Y2hidWZmZXItPkRSMSkKKwkgICAgfHwgX19wdXRfdXNlcihiYXRjaGJ1ZmZlcjMyLkRSNCwgJmJhdGNoYnVmZmVyLT5EUjQpCisJICAgIHx8IF9fcHV0X3VzZXIoYmF0Y2hidWZmZXIzMi5udW1fY2xpcHJlY3RzLCAmYmF0Y2hidWZmZXItPm51bV9jbGlwcmVjdHMpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyliYXRjaGJ1ZmZlcjMyLmNsaXByZWN0cywKKwkJCSAgJmJhdGNoYnVmZmVyLT5jbGlwcmVjdHMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9JOTE1X0JBVENIQlVGRkVSLCAodW5zaWduZWQgbG9uZykgYmF0Y2hidWZmZXIpOworfQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfY21kYnVmZmVyMzIgeworCXUzMiBidWY7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNvbW1hbmQgYnVmZmVyICovCisJaW50IHN6OwkJCS8qIG5yIGJ5dGVzIGluIGJ1ZiAqLworCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLworCXUzMiBjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9jbWRidWZmZXIzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9pOTE1X2NtZGJ1ZmZlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9pOTE1X2NtZGJ1ZmZlcjMyX3QgY21kYnVmZmVyMzI7CisJZHJtX2k5MTVfY21kYnVmZmVyX3QgX191c2VyICpjbWRidWZmZXI7CisJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWRidWZmZXIzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY21kYnVmZmVyMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJY21kYnVmZmVyID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjbWRidWZmZXIpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGNtZGJ1ZmZlciwgc2l6ZW9mKCpjbWRidWZmZXIpKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY21kYnVmZmVyMzIuYnVmLAorCQkJICAmY21kYnVmZmVyLT5idWYpCisJICAgIHx8IF9fcHV0X3VzZXIoY21kYnVmZmVyMzIuc3osICZjbWRidWZmZXItPnN6KQorCSAgICB8fCBfX3B1dF91c2VyKGNtZGJ1ZmZlcjMyLkRSMSwgJmNtZGJ1ZmZlci0+RFIxKQorCSAgICB8fCBfX3B1dF91c2VyKGNtZGJ1ZmZlcjMyLkRSNCwgJmNtZGJ1ZmZlci0+RFI0KQorCSAgICB8fCBfX3B1dF91c2VyKGNtZGJ1ZmZlcjMyLm51bV9jbGlwcmVjdHMsICZjbWRidWZmZXItPm51bV9jbGlwcmVjdHMpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljbWRidWZmZXIzMi5jbGlwcmVjdHMsCisJCQkgICZjbWRidWZmZXItPmNsaXByZWN0cykpCisJCXJldHVybiAtRUZBVUxUOworCQorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0k5MTVfQ01EQlVGRkVSLCAodW5zaWduZWQgbG9uZykgY21kYnVmZmVyKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX2VtaXQzMiB7CisJdTMyIGlycV9zZXE7Cit9IGRybV9pOTE1X2lycV9lbWl0MzJfdDsKKworc3RhdGljIGludCBjb21wYXRfaTkxNV9pcnFfZW1pdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9pOTE1X2lycV9lbWl0MzJfdCByZXEzMjsKKwlkcm1faTkxNV9pcnFfZW1pdF90IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5pcnFfc2VxLAorCQkJICAmcmVxdWVzdC0+aXJxX3NlcSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfSTkxNV9JUlFfRU1JVCwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0zMiB7CisJaW50IHBhcmFtOworCXUzMiB2YWx1ZTsKK30gZHJtX2k5MTVfZ2V0cGFyYW0zMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9pOTE1X2dldHBhcmFtKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2k5MTVfZ2V0cGFyYW0zMl90IHJlcTMyOworCWRybV9pOTE1X2dldHBhcmFtX3QgX191c2VyICpyZXF1ZXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5wYXJhbSwgJnJlcXVlc3QtPnBhcmFtKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLnZhbHVlLAorCQkJICAmcmVxdWVzdC0+dmFsdWUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2FsbG9jMzIgeworCWludCByZWdpb247CisJaW50IGFsaWdubWVudDsKKwlpbnQgc2l6ZTsKKwl1MzIgcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgYWdwICovCit9IGRybV9pOTE1X21lbV9hbGxvYzMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2k5MTVfYWxsb2Moc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1faTkxNV9tZW1fYWxsb2MzMl90IHJlcTMyOworCWRybV9pOTE1X21lbV9hbGxvY190IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIucmVnaW9uLCAmcmVxdWVzdC0+cmVnaW9uKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLmFsaWdubWVudCwgJnJlcXVlc3QtPmFsaWdubWVudCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5zaXplLCAmcmVxdWVzdC0+c2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5yZWdpb25fb2Zmc2V0LAorCQkJICAmcmVxdWVzdC0+cmVnaW9uX29mZnNldCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfSTkxNV9BTExPQywgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCisKK2RybV9pb2N0bF9jb21wYXRfdCAqaTkxNV9jb21wYXRfaW9jdGxzW10gPSB7CisJW0RSTV9JOTE1X0JBVENIQlVGRkVSXSA9IGNvbXBhdF9pOTE1X2JhdGNoYnVmZmVyLAorCVtEUk1fSTkxNV9DTURCVUZGRVJdID0gY29tcGF0X2k5MTVfY21kYnVmZmVyLAorCVtEUk1fSTkxNV9HRVRQQVJBTV0gPSBjb21wYXRfaTkxNV9nZXRwYXJhbSwKKwlbRFJNX0k5MTVfSVJRX0VNSVRdID0gY29tcGF0X2k5MTVfaXJxX2VtaXQsCisJW0RSTV9JOTE1X0FMTE9DXSA9IGNvbXBhdF9pOTE1X2FsbG9jCit9OworCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIDMyLWJpdCBwcm9jZXNzIHJ1bm5pbmcgdW5kZXIgYSA2NC1iaXQga2VybmVsCisgKiBwZXJmb3JtcyBhbiBpb2N0bCBvbiAvZGV2L2RyaS9jYXJkPG4+LgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitsb25nIGk5MTVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOworCWRybV9pb2N0bF9jb21wYXRfdCAqZm4gPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFKQorCQlyZXR1cm4gZHJtX2NvbXBhdF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKGk5MTVfY29tcGF0X2lvY3RscykpCisJCWZuID0gaTkxNV9jb21wYXRfaW9jdGxzW25yIC0gRFJNX0NPTU1BTkRfQkFTRV07CisKKwlsb2NrX2tlcm5lbCgpOwkJLyogWFhYIGZvciBub3cgKi8KKwlpZiAoZm4gIT0gTlVMTCkKKwkJcmV0ID0gKCpmbikoZmlscCwgY21kLCBhcmcpOworCWVsc2UKKwkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwppbmRleCBhMTAxY2M5Li40ZmE0NDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCkBAIC01Niw3ICs1Niw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1pbnQgaTkxNV9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiByZXQ7CkBAIC03Niw3ICs3Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGk5MTVfd2FpdF9pcnEoZHJtX2RldmljZV90ICogZGV2LCBpbnQgaXJxX25yKQorc3RhdGljIGludCBpOTE1X3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwppbmRleCAyMmRhYjNlLi44NDRjY2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwpAQCAtMTAxLDYgKzEwMSw5IEBACiAJCS5tbWFwID0gZHJtX21tYXAsCiAJCS5wb2xsID0gZHJtX3BvbGwsCiAJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkJLmNvbXBhdF9pb2N0bCA9IG1nYV9jb21wYXRfaW9jdGwsCisjZW5kaWYKIAl9LAogCS5wY2lfZHJpdmVyID0gewogCQkubmFtZSA9IERSSVZFUl9OQU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAppbmRleCAxZDg0YTFlLi45NDEyZTI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKQEAgLTEzNyw2ICsxMzcsOCBAQAogZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKIGV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOwogZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIGxvbmcgbWdhX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpOwogCiAjZGVmaW5lIG1nYV9mbHVzaF93cml0ZV9jb21iaW5lKCkJRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lvYzMyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pb2MzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzQ1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pb2MzMi5jCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyAqIFxmaWxlIG1nYV9pb2MzMi5jCisgKgorICogMzItYml0IGlvY3RsIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIHRoZSBNR0EgRFJNLgorICoKKyAqIFxhdXRob3IgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+IHdpdGggY29kZSBmcm9tIHBhdGNoZXMgYnkgRWdiZXJ0IEVpY2gKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIEVnYmVydCBFaWNoIDIwMDMsMjAwNAorICogQ29weXJpZ2h0IChDKSBEYXZlIEFpcmxpZSAyMDA1CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1nYV9kcm0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtMzJfbWdhX2luaXQgeworCWludCBmdW5jOworICAgCXUzMiBzYXJlYV9wcml2X29mZnNldDsKKwlpbnQgY2hpcHNldDsKKyAgIAlpbnQgc2dyYW07CisJdW5zaWduZWQgaW50IG1hY2Nlc3M7CisgICAJdW5zaWduZWQgaW50IGZiX2NwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKyAgIAl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisgICAJdW5zaWduZWQgaW50IGRlcHRoX2NwcDsKKyAgIAl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKyAgIAl1bnNpZ25lZCBpbnQgdGV4dHVyZV9vZmZzZXRbTUdBX05SX1RFWF9IRUFQU107CisgICAJdW5zaWduZWQgaW50IHRleHR1cmVfc2l6ZVtNR0FfTlJfVEVYX0hFQVBTXTsKKwl1MzIgZmJfb2Zmc2V0OworCXUzMiBtbWlvX29mZnNldDsKKwl1MzIgc3RhdHVzX29mZnNldDsKKwl1MzIgd2FycF9vZmZzZXQ7CisJdTMyIHByaW1hcnlfb2Zmc2V0OworCXUzMiBidWZmZXJzX29mZnNldDsKK30gZHJtX21nYV9pbml0MzJfdDsKKworc3RhdGljIGludCBjb21wYXRfbWdhX2luaXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fbWdhX2luaXQzMl90IGluaXQzMjsKKwlkcm1fbWdhX2luaXRfdCBfX3VzZXIgKmluaXQ7CisJaW50IGVyciA9IDAsIGk7CisJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbml0MzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGluaXQzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlpbml0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCppbml0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBpbml0LCBzaXplb2YoKmluaXQpKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mdW5jLCAmaW5pdC0+ZnVuYykKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuc2FyZWFfcHJpdl9vZmZzZXQsICZpbml0LT5zYXJlYV9wcml2X29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuY2hpcHNldCwgJmluaXQtPmNoaXBzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnNncmFtLCAmaW5pdC0+c2dyYW0pCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLm1hY2Nlc3MsICZpbml0LT5tYWNjZXNzKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mYl9jcHAsICZpbml0LT5mYl9jcHApCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZyb250X29mZnNldCwgJmluaXQtPmZyb250X29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnJvbnRfcGl0Y2gsICZpbml0LT5mcm9udF9waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYmFja19vZmZzZXQsICZpbml0LT5iYWNrX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYmFja19waXRjaCwgJmluaXQtPmJhY2tfcGl0Y2gpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmRlcHRoX2NwcCwgJmluaXQtPmRlcHRoX2NwcCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZGVwdGhfb2Zmc2V0LCAmaW5pdC0+ZGVwdGhfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5kZXB0aF9waXRjaCwgJmluaXQtPmRlcHRoX3BpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mYl9vZmZzZXQsICZpbml0LT5mYl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLm1taW9fb2Zmc2V0LCAmaW5pdC0+bW1pb19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnN0YXR1c19vZmZzZXQsICZpbml0LT5zdGF0dXNfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi53YXJwX29mZnNldCwgJmluaXQtPndhcnBfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5wcmltYXJ5X29mZnNldCwgJmluaXQtPnByaW1hcnlfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5idWZmZXJzX29mZnNldCwgJmluaXQtPmJ1ZmZlcnNfb2Zmc2V0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJZm9yIChpPTA7IGk8TUdBX05SX1RFWF9IRUFQUzsgaSsrKQorCXsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoaW5pdDMyLnRleHR1cmVfb2Zmc2V0W2ldLCAmaW5pdC0+dGV4dHVyZV9vZmZzZXRbaV0pOworCQllcnIgfD0gX19wdXRfdXNlcihpbml0MzIudGV4dHVyZV9zaXplW2ldLCAmaW5pdC0+dGV4dHVyZV9zaXplW2ldKTsKKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfTUdBX0lOSVQsICh1bnNpZ25lZCBsb25nKSBpbml0KTsKK30KKworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2dldHBhcmFtMzIgeworCWludCBwYXJhbTsKKwl1MzIgdmFsdWU7Cit9IGRybV9tZ2FfZ2V0cGFyYW0zMl90OworCisKK3N0YXRpYyBpbnQgY29tcGF0X21nYV9nZXRwYXJhbShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fbWdhX2dldHBhcmFtMzJfdCBnZXRwYXJhbTMyOworCWRybV9tZ2FfZ2V0cGFyYW1fdCBfX3VzZXIgKmdldHBhcmFtOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0cGFyYW0zMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZ2V0cGFyYW0zMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWdldHBhcmFtID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpnZXRwYXJhbSkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZ2V0cGFyYW0sIHNpemVvZigqZ2V0cGFyYW0pKQorCSAgICB8fCBfX3B1dF91c2VyKGdldHBhcmFtMzIucGFyYW0sICZnZXRwYXJhbS0+cGFyYW0pCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpZ2V0cGFyYW0zMi52YWx1ZSwgJmdldHBhcmFtLT52YWx1ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwgCisJCQkgRFJNX0lPQ1RMX01HQV9HRVRQQVJBTSwgKHVuc2lnbmVkIGxvbmcpZ2V0cGFyYW0pOworfQorCitkcm1faW9jdGxfY29tcGF0X3QgKm1nYV9jb21wYXRfaW9jdGxzW10gPSB7CisJW0RSTV9NR0FfSU5JVF0gPSBjb21wYXRfbWdhX2luaXQsCisJW0RSTV9NR0FfR0VUUEFSQU1dID0gY29tcGF0X21nYV9nZXRwYXJhbSwKK307CisKKy8qKgorICogQ2FsbGVkIHdoZW5ldmVyIGEgMzItYml0IHByb2Nlc3MgcnVubmluZyB1bmRlciBhIDY0LWJpdCBrZXJuZWwKKyAqIHBlcmZvcm1zIGFuIGlvY3RsIG9uIC9kZXYvZHJpL2NhcmQ8bj4uCisgKgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2xvbmcgbWdhX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbnIgPSBEUk1fSU9DVExfTlIoY21kKTsKKwlkcm1faW9jdGxfY29tcGF0X3QgKmZuID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSkKKwkJcmV0dXJuIGRybV9jb21wYXRfaW9jdGwoZmlscCwgY21kLCBhcmcpOworCQorCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UgKyBEUk1fQVJSQVlfU0laRShtZ2FfY29tcGF0X2lvY3RscykpCisJCWZuID0gbWdhX2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKKworCWxvY2tfa2VybmVsKCk7CQkvKiBYWFggZm9yIG5vdyAqLworCWlmIChmbiAhPSBOVUxMKQorCQlyZXQgPSAoKmZuKShmaWxwLCBjbWQsIGFyZyk7CisJZWxzZQorCQlyZXQgPSBkcm1faW9jdGwoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbHAsIGNtZCwgYXJnKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jCmluZGV4IGNlZDYzODEuLmJjNDQ2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmMKQEAgLTk2LDYgKzk2LDkgQEAKIAkJLm1tYXAgPSBkcm1fbW1hcCwKIAkJLnBvbGwgPSBkcm1fcG9sbCwKIAkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCQkuY29tcGF0X2lvY3RsID0gcjEyOF9jb21wYXRfaW9jdGwsCisjZW5kaWYKIAl9LAogCS5wY2lfZHJpdmVyID0gewogCQkubmFtZSAgICAgICAgICA9IERSSVZFUl9OQU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCmluZGV4IGNmMWFhNWQuLjBmYjY4N2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCkBAIC0xNTYsNiArMTU2LDkgQEAKIGV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KTsKIGV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCk7CiAKK2V4dGVybiBsb25nIHIxMjhfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOworCiAvKiBSZWdpc3RlciBkZWZpbml0aW9ucywgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyBhbmQgZHJtQWRkTWFwIGNvbnN0YW50cwogICogZm9yIFJhZ2UgMTI4IGtlcm5lbCBkcml2ZXIuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1OThlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pb2MzMi5jCkBAIC0wLDAgKzEsMjE5IEBACisvKioKKyAqIFxmaWxlIHIxMjhfaW9jMzIuYworICoKKyAqIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciB0aGUgUjEyOCBEUk0uCisgKgorICogXGF1dGhvciBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4gd2l0aCBjb2RlIGZyb20gcGF0Y2hlcyBieSBFZ2JlcnQgRWljaAorICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMjAwNQorICogQ29weXJpZ2h0IChDKSBFZ2JlcnQgRWljaCAyMDAzLDIwMDQKKyAqIENvcHlyaWdodCAoQykgRGF2ZSBBaXJsaWUgMjAwNQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyMTI4X2RybS5oIgorCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9pbml0MzIgeworCWludCBmdW5jOworCXVuc2lnbmVkIGludCBzYXJlYV9wcml2X29mZnNldDsKKwlpbnQgaXNfcGNpOworCWludCBjY2VfbW9kZTsKKwlpbnQgY2NlX3NlY3VyZTsKKwlpbnQgcmluZ19zaXplOworCWludCB1c2VjX3RpbWVvdXQ7CisKKwl1bnNpZ25lZCBpbnQgZmJfYnBwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfYnBwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBzcGFuX29mZnNldDsKKworCXVuc2lnbmVkIGludCBmYl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGludCByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19ycHRyX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGFncF90ZXh0dXJlc19vZmZzZXQ7Cit9IGRybV9yMTI4X2luaXQzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yMTI4X2luaXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3IxMjhfaW5pdDMyX3QgaW5pdDMyOworCWRybV9yMTI4X2luaXRfdCBfX3VzZXIgKmluaXQ7CisJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbml0MzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGluaXQzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlpbml0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCppbml0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBpbml0LCBzaXplb2YoKmluaXQpKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mdW5jLCAmaW5pdC0+ZnVuYykKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuc2FyZWFfcHJpdl9vZmZzZXQsICZpbml0LT5zYXJlYV9wcml2X29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuaXNfcGNpLCAmaW5pdC0+aXNfcGNpKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5jY2VfbW9kZSwgJmluaXQtPmNjZV9tb2RlKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5jY2Vfc2VjdXJlLCAmaW5pdC0+Y2NlX3NlY3VyZSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIucmluZ19zaXplLCAmaW5pdC0+cmluZ19zaXplKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi51c2VjX3RpbWVvdXQsICZpbml0LT51c2VjX3RpbWVvdXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZiX2JwcCwgJmluaXQtPmZiX2JwcCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnJvbnRfb2Zmc2V0LCAmaW5pdC0+ZnJvbnRfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mcm9udF9waXRjaCwgJmluaXQtPmZyb250X3BpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5iYWNrX29mZnNldCwgJmluaXQtPmJhY2tfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5iYWNrX3BpdGNoLCAmaW5pdC0+YmFja19waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZGVwdGhfYnBwLCAmaW5pdC0+ZGVwdGhfYnBwKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5kZXB0aF9vZmZzZXQsICZpbml0LT5kZXB0aF9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmRlcHRoX3BpdGNoLCAmaW5pdC0+ZGVwdGhfcGl0Y2gpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnNwYW5fb2Zmc2V0LCAmaW5pdC0+c3Bhbl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZiX29mZnNldCwgJmluaXQtPmZiX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIubW1pb19vZmZzZXQsICZpbml0LT5tbWlvX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIucmluZ19vZmZzZXQsICZpbml0LT5yaW5nX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIucmluZ19ycHRyX29mZnNldCwgJmluaXQtPnJpbmdfcnB0cl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmJ1ZmZlcnNfb2Zmc2V0LCAmaW5pdC0+YnVmZmVyc19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmFncF90ZXh0dXJlc19vZmZzZXQsICZpbml0LT5hZ3BfdGV4dHVyZXNfb2Zmc2V0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUjEyOF9JTklULCAodW5zaWduZWQgbG9uZylpbml0KTsKK30KKworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9kZXB0aDMyIHsKKwlpbnQgZnVuYzsKKwlpbnQgbjsKKwl1MzIgeDsKKwl1MzIgeTsKKwl1MzIgYnVmZmVyOworCXUzMiBtYXNrOworfSBkcm1fcjEyOF9kZXB0aDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3IxMjhfZGVwdGgoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yMTI4X2RlcHRoMzJfdCBkZXB0aDMyOworCWRybV9yMTI4X2RlcHRoX3QgX191c2VyICpkZXB0aDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZGVwdGgzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZGVwdGgzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRlcHRoID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpkZXB0aCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGVwdGgsIHNpemVvZigqZGVwdGgpKQorCSAgICB8fCBfX3B1dF91c2VyKGRlcHRoMzIuZnVuYywgJmRlcHRoLT5mdW5jKQorCSAgICB8fCBfX3B1dF91c2VyKGRlcHRoMzIubiwgJmRlcHRoLT5uKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpZGVwdGgzMi54LCAmZGVwdGgtPngpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylkZXB0aDMyLnksICZkZXB0aC0+eSkKKwkgICAgfHwgX19wdXRfdXNlcigodW5zaWduZWQgaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWRlcHRoMzIuYnVmZmVyLCAmZGVwdGgtPmJ1ZmZlcikKKwkgICAgfHwgX19wdXRfdXNlcigodW5zaWduZWQgY2hhciBfX3VzZXIgKikodW5zaWduZWQgbG9uZylkZXB0aDMyLm1hc2ssICZkZXB0aC0+bWFzaykpCisJCXJldHVybiAtRUZBVUxUOworCQorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1IxMjhfREVQVEgsICh1bnNpZ25lZCBsb25nKWRlcHRoKTsJCisJCit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3N0aXBwbGUzMiB7CisJdTMyIG1hc2s7Cit9IGRybV9yMTI4X3N0aXBwbGUzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yMTI4X3N0aXBwbGUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3IxMjhfc3RpcHBsZTMyX3Qgc3RpcHBsZTMyOworCWRybV9yMTI4X3N0aXBwbGVfdCBfX3VzZXIgKnN0aXBwbGU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0aXBwbGUzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RpcHBsZTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3RpcHBsZSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqc3RpcHBsZSkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgc3RpcHBsZSwgc2l6ZW9mKCpzdGlwcGxlKSkKKwkgICAgfHwgX19wdXRfdXNlcigodW5zaWduZWQgaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXN0aXBwbGUzMi5tYXNrLCAmc3RpcHBsZS0+bWFzaykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUjEyOF9TVElQUExFLCAodW5zaWduZWQgbG9uZylzdGlwcGxlKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZ2V0cGFyYW0zMiB7CisJaW50IHBhcmFtOworCXUzMiB2YWx1ZTsKK30gZHJtX3IxMjhfZ2V0cGFyYW0zMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yMTI4X2dldHBhcmFtKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yMTI4X2dldHBhcmFtMzJfdCBnZXRwYXJhbTMyOworCWRybV9yMTI4X2dldHBhcmFtX3QgX191c2VyICpnZXRwYXJhbTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0cGFyYW0zMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZ2V0cGFyYW0zMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWdldHBhcmFtID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpnZXRwYXJhbSkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZ2V0cGFyYW0sIHNpemVvZigqZ2V0cGFyYW0pKQorCSAgICB8fCBfX3B1dF91c2VyKGdldHBhcmFtMzIucGFyYW0sICZnZXRwYXJhbS0+cGFyYW0pCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpZ2V0cGFyYW0zMi52YWx1ZSwgJmdldHBhcmFtLT52YWx1ZSkpCisJCXJldHVybiAtRUZBVUxUOworCQorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1IxMjhfR0VUUEFSQU0sICh1bnNpZ25lZCBsb25nKWdldHBhcmFtKTsKK30KKworZHJtX2lvY3RsX2NvbXBhdF90ICpyMTI4X2NvbXBhdF9pb2N0bHNbXSA9IHsKKwlbRFJNX1IxMjhfSU5JVF0gPSBjb21wYXRfcjEyOF9pbml0LAorCVtEUk1fUjEyOF9ERVBUSF0gPSBjb21wYXRfcjEyOF9kZXB0aCwKKwlbRFJNX1IxMjhfU1RJUFBMRV0gPSBjb21wYXRfcjEyOF9zdGlwcGxlLAorCVtEUk1fUjEyOF9HRVRQQVJBTV0gPSBjb21wYXRfcjEyOF9nZXRwYXJhbSwKK307CisKKy8qKgorICogQ2FsbGVkIHdoZW5ldmVyIGEgMzItYml0IHByb2Nlc3MgcnVubmluZyB1bmRlciBhIDY0LWJpdCBrZXJuZWwKKyAqIHBlcmZvcm1zIGFuIGlvY3RsIG9uIC9kZXYvZHJpL2NhcmQ8bj4uCisgKgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2xvbmcgcjEyOF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IG5yID0gRFJNX0lPQ1RMX05SKGNtZCk7CisJZHJtX2lvY3RsX2NvbXBhdF90ICpmbiA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UpCisJCXJldHVybiBkcm1fY29tcGF0X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKworCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UgKyBEUk1fQVJSQVlfU0laRShyMTI4X2NvbXBhdF9pb2N0bHMpKQorCQlmbiA9IHIxMjhfY29tcGF0X2lvY3Rsc1tuciAtIERSTV9DT01NQU5EX0JBU0VdOworCisJbG9ja19rZXJuZWwoKTsJCS8qIFhYWCBmb3Igbm93ICovCisJaWYgKGZuICE9IE5VTEwpCisJCXJldCA9ICgqZm4pKGZpbHAsIGNtZCwgYXJnKTsKKwllbHNlCisJCXJldCA9IGRybV9pb2N0bChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlscCwgY21kLCBhcmcpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCmluZGV4IDUzYWY2OTEuLjQyNmE3MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCkBAIC0xMzA3LDcgKzEzMDcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCitzdGF0aWMgaW50IHIxMjhfZG9fY2xlYW51cF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCURSTV9ERUJVRyggIlxuIiApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfM2RfcmVnLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV8zZF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjYxYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfM2RfcmVnLmgKQEAgLTAsMCArMSwxNjUxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFZJQV8zRF9SRUdfSAorI2RlZmluZSBWSUFfM0RfUkVHX0gKKyNkZWZpbmUgSENfUkVHX0JBU0UgICAgICAgICAgICAgMHgwNDAwCisKKyNkZWZpbmUgSENfUkVHX1RSQU5TX1NQQUNFICAgICAgMHgwMDQwCisKKyNkZWZpbmUgSENfUGFyYU5fTUFTSyAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBIQ19QYXJhX01BU0sgICAgICAgICAgICAweDAwZmZmZmZmCisjZGVmaW5lIEhDX1N1YkFfTUFTSyAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSENfU3ViQV9TSElGVCAgICAgICAgICAgMjQKKy8qIFRyYW5zbWlzc2lvbiBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfUkVHX1RSQU5TX1NFVCAgICAgICAgMHgwMDNjCisjZGVmaW5lIEhDX1BhcmFTdWJUeXBlX01BU0sgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSENfUGFyYVR5cGVfTUFTSyAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19QYXJhT1NfTUFTSyAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX1BhcmFBZHJfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfUGFyYVN1YlR5cGVfU0hJRlQgICAgMjQKKyNkZWZpbmUgSENfUGFyYVR5cGVfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfUGFyYU9TX1NISUZUICAgICAgICAgOAorI2RlZmluZSBIQ19QYXJhQWRyX1NISUZUICAgICAgICAwCisKKyNkZWZpbmUgSENfUGFyYVR5cGVfQ21kVmRhdGEgICAgMHgwMDAwCisjZGVmaW5lIEhDX1BhcmFUeXBlX05vdFRleCAgICAgIDB4MDAwMQorI2RlZmluZSBIQ19QYXJhVHlwZV9UZXggICAgICAgICAweDAwMDIKKyNkZWZpbmUgSENfUGFyYVR5cGVfUGFsZXR0ZSAgICAgMHgwMDAzCisjZGVmaW5lIEhDX1BhcmFUeXBlX1ByZUNSICAgICAgIDB4MDAxMAorI2RlZmluZSBIQ19QYXJhVHlwZV9BdXRvICAgICAgICAweDAwZmUKKworLyogVHJhbnNtaXNzaW9uIFNwYWNlCisgKi8KKyNkZWZpbmUgSENfUkVHX0hwYXJhMCAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEhDX1JFR19IcGF0YUFGICAgICAgICAgIDB4MDJmYworCisvKiBSZWFkCisgKi8KKyNkZWZpbmUgSENfUkVHX0hSRW5nU3QgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhDX1JFR19IUkZJRk9lbXB0eSAgICAgIDB4MDAwNAorI2RlZmluZSBIQ19SRUdfSFJGSUZPZnVsbCAgICAgICAweDAwMDgKKyNkZWZpbmUgSENfUkVHX0hSRXJyICAgICAgICAgICAgMHgwMDBjCisjZGVmaW5lIEhDX1JFR19GSUZPc3RhdHVzICAgICAgIDB4MDAxMAorLyogSENfUkVHX0hSRW5nU3QgICAgICAgICAgMHgwMDAwCisgKi8KKyNkZWZpbmUgSENfSERBU1pDX01BU0sgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IU0dFTUlfTUFTSyAgICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hMR0VNSVN0X01BU0sgICAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSENSU3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IU0UwU3RfTUFTSyAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0hTRTFTdF9NQVNLICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFBFU3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IWEVTdF9NQVNLICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hCRVN0X01BU0sgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfSEUyU3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IRTNTdF9NQVNLICAgICAgICAgICAweDAwMDAwMDAxCisvKiBIQ19SRUdfSFJGSUZPZW1wdHkgICAgICAweDAwMDQKKyAqLworI2RlZmluZSBIQ19IUlpEZW1wdHlfTUFTSyAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hSVFhBZW1wdHlfTUFTSyAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFJUWERlbXB0eV9NQVNLICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IV1pEZW1wdHlfTUFTSyAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hXQ0RlbXB0eV9NQVNLICAgICAgIDB4MDAwMDAwMDEKKy8qIEhDX1JFR19IUkZJRk9mdWxsICAgICAgIDB4MDAwOAorICovCisjZGVmaW5lIEhDX0hSWkRmdWxsX01BU0sgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfSFJUWEFmdWxsX01BU0sgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IUlRYRGZ1bGxfTUFTSyAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX0hXWkRmdWxsX01BU0sgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSFdDRGZ1bGxfTUFTSyAgICAgICAgMHgwMDAwMDAwMQorLyogSENfUkVHX0hSRXJyICAgICAgICAgICAgMHgwMDBjCisgKi8KKyNkZWZpbmUgSENfSEFHUENNRXJyX01BU0sgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBIQ19IQUdQQ01FcnJDX01BU0sgICAgICAweDcwMDAwMDAwCisvKiBIQ19SRUdfRklGT3N0YXR1cyAgICAgICAweDAwMTAKKyAqLworI2RlZmluZSBIQ19IUkZJRk9BVGFsbF9NQVNLICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEhDX0hSRklGT0FUYnVzeV9NQVNLICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSENfSFJBVEZHTURvX01BU0sgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IUkFURkdNRGlfTUFTSyAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hSQVRGUlpEX01BU0sgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFJBVEZSVFhBX01BU0sgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IUkFURlJUWERfTUFTSyAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hSQVRGV1pEX01BU0sgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFJBVEZXQ0RfTUFTSyAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IUkFUVFhUQUdfTUFTSyAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hSQVRUWENIX01BU0sgICAgICAgIDB4MDAwMDAwMDEKKworLyogQUdQIENvbW1hbmQgU2V0dGluZworICovCisjZGVmaW5lIEhDX1N1YkFfSEFHUEJzdEwgICAgICAgIDB4MDA2MAorI2RlZmluZSBIQ19TdWJBX0hBR1BCZW5kTCAgICAgICAweDAwNjEKKyNkZWZpbmUgSENfU3ViQV9IQUdQQ01OVCAgICAgICAgMHgwMDYyCisjZGVmaW5lIEhDX1N1YkFfSEFHUEJwTCAgICAgICAgIDB4MDA2MworI2RlZmluZSBIQ19TdWJBX0hBR1BCcEggICAgICAgICAweDAwNjQKKy8qIEhDX1N1YkFfSEFHUENNTlQgICAgICAgIDB4MDA2MgorICovCisjZGVmaW5lIEhDX0hBR1BDTU5UX01BU0sgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSENfSENtZEVyckNscl9NQVNLICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBIQ19IQUdQQmVuZEhfTUFTSyAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hBR1BCc3RIX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEFHUEJlbmRIX1NISUZUICAgICAgOAorI2RlZmluZSBIQ19IQUdQQnN0SF9TSElGVCAgICAgICAwCisvKiBIQ19TdWJBX0hBR1BCcEwgICAgICAgICAweDAwNjMKKyAqLworI2RlZmluZSBIQ19IQUdQQnBMX01BU0sgICAgICAgICAweDAwZmZmZmZjCisjZGVmaW5lIEhDX0hBR1BCcElEX01BU0sgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSEFHUEJwSURfUEFVU0UgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IQUdQQnBJRF9KVU1QICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hBR1BCcElEX1NUT1AgICAgICAgIDB4MDAwMDAwMDIKKy8qIEhDX1N1YkFfSEFHUEJwSCAgICAgICAgIDB4MDA2NAorICovCisjZGVmaW5lIEhDX0hBR1BCcEhfTUFTSyAgICAgICAgIDB4MDBmZmZmZmYKKworLyogTWlzY2VsbGFuZW91cyBTZXR0aW5ncworICovCisjZGVmaW5lIEhDX1N1YkFfSENsaXBUQiAgICAgICAgIDB4MDA3MAorI2RlZmluZSBIQ19TdWJBX0hDbGlwTFIgICAgICAgICAweDAwNzEKKyNkZWZpbmUgSENfU3ViQV9IRlBDbGlwVEwgICAgICAgMHgwMDcyCisjZGVmaW5lIEhDX1N1YkFfSEZQQ2xpcEJMICAgICAgIDB4MDA3MworI2RlZmluZSBIQ19TdWJBX0hGUENsaXBMTCAgICAgICAweDAwNzQKKyNkZWZpbmUgSENfU3ViQV9IRlBDbGlwUkwgICAgICAgMHgwMDc1CisjZGVmaW5lIEhDX1N1YkFfSEZQQ2xpcFRCSCAgICAgIDB4MDA3NgorI2RlZmluZSBIQ19TdWJBX0hGUENsaXBMUkggICAgICAweDAwNzcKKyNkZWZpbmUgSENfU3ViQV9ITFAgICAgICAgICAgICAgMHgwMDc4CisjZGVmaW5lIEhDX1N1YkFfSExQUkYgICAgICAgICAgIDB4MDA3OQorI2RlZmluZSBIQ19TdWJBX0hTb2xpZENMICAgICAgICAweDAwN2EKKyNkZWZpbmUgSENfU3ViQV9IUGl4R0MgICAgICAgICAgMHgwMDdiCisjZGVmaW5lIEhDX1N1YkFfSFNQWFlPUyAgICAgICAgIDB4MDA3YworI2RlZmluZSBIQ19TdWJBX0hWZXJ0ZXhDTlQgICAgICAweDAwN2QKKworI2RlZmluZSBIQ19IQ2xpcFRfTUFTSyAgICAgICAgICAweDAwZmZmMDAwCisjZGVmaW5lIEhDX0hDbGlwVF9TSElGVCAgICAgICAgIDEyCisjZGVmaW5lIEhDX0hDbGlwQl9NQVNLICAgICAgICAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgSENfSENsaXBCX1NISUZUICAgICAgICAgMAorI2RlZmluZSBIQ19IQ2xpcExfTUFTSyAgICAgICAgICAweDAwZmZmMDAwCisjZGVmaW5lIEhDX0hDbGlwTF9TSElGVCAgICAgICAgIDEyCisjZGVmaW5lIEhDX0hDbGlwUl9NQVNLICAgICAgICAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgSENfSENsaXBSX1NISUZUICAgICAgICAgMAorI2RlZmluZSBIQ19IRlBDbGlwQkhfTUFTSyAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hGUENsaXBCSF9TSElGVCAgICAgIDgKKyNkZWZpbmUgSENfSEZQQ2xpcFRIX01BU0sgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IRlBDbGlwVEhfU0hJRlQgICAgICAwCisjZGVmaW5lIEhDX0hGUENsaXBSSF9NQVNLICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSENfSEZQQ2xpcFJIX1NISUZUICAgICAgOAorI2RlZmluZSBIQ19IRlBDbGlwTEhfTUFTSyAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hGUENsaXBMSF9TSElGVCAgICAgIDAKKyNkZWZpbmUgSENfSFNvbGlkQ0hfTUFTSyAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IUGl4R0NfTUFTSyAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEhDX0hTUFhPU19NQVNLICAgICAgICAgIDB4MDBmZmYwMDAKKyNkZWZpbmUgSENfSFNQWE9TX1NISUZUICAgICAgICAgMTIKKyNkZWZpbmUgSENfSFNQWU9TX01BU0sgICAgICAgICAgMHgwMDAwMGZmZgorCisvKiBDb21tYW5kCisgKiBDb21tYW5kIEEKKyAqLworI2RlZmluZSBIQ19IQ21kSGVhZGVyX01BU0sgICAgICAweGZlMDAwMDAwCS8qMHhmZmUwMDAwMCAqLworI2RlZmluZSBIQ19IRTNGaXJlX01BU0sgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEhDX0hQTVR5cGVfTUFTSyAgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSEVGbGFnX01BU0sgICAgICAgICAgMHgwMDAwZTAwMAorI2RlZmluZSBIQ19IU2hhZGluZ19NQVNLICAgICAgICAweDAwMDAxYzAwCisjZGVmaW5lIEhDX0hQTVZhbGlkTl9NQVNLICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSFBMRU5EX01BU0sgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IVkN5Y2xlX01BU0sgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hWQ3ljbGVfU3R5bGVfTUFTSyAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgSENfSFZDeWNsZV9DaGdBX01BU0sgICAgMHgwMDAwMDAzMAorI2RlZmluZSBIQ19IVkN5Y2xlX0NoZ0JfTUFTSyAgICAweDAwMDAwMDBjCisjZGVmaW5lIEhDX0hWQ3ljbGVfQ2hnQ19NQVNLICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSFBNVHlwZV9Qb2ludCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IUE1UeXBlX0xpbmUgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hQTVR5cGVfVHJpICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFBNVHlwZV9UcmlXRiAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBIQ19IRUZsYWdfTm9BQSAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hFRmxhZ19hYiAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgSENfSEVGbGFnX2JjICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IRUZsYWdfY2EgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhDX0hTaGFkaW5nX1NvbGlkICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFNoYWRpbmdfRmxhdEEgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IU2hhZGluZ19GbGF0QiAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEhDX0hTaGFkaW5nX0ZsYXRDICAgICAgIDB4MDAwMDBjMDAKKyNkZWZpbmUgSENfSFNoYWRpbmdfR291cmF1ZCAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBIQ19IVkN5Y2xlX0Z1bGwgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hWQ3ljbGVfQUZQICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFZDeWNsZV9PbmUgICAgICAgICAgMHgwMDAwMDBjMAorI2RlZmluZSBIQ19IVkN5Y2xlX05ld0EgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hWQ3ljbGVfQUEgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfSFZDeWNsZV9BQiAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IVkN5Y2xlX0FDICAgICAgICAgICAweDAwMDAwMDMwCisjZGVmaW5lIEhDX0hWQ3ljbGVfTmV3QiAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFZDeWNsZV9CQSAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IVkN5Y2xlX0JCICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hWQ3ljbGVfQkMgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgSENfSFZDeWNsZV9OZXdDICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVkN5Y2xlX0NBICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hWQ3ljbGVfQ0IgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSFZDeWNsZV9DQyAgICAgICAgICAgMHgwMDAwMDAwMworCisvKiBDb21tYW5kIEIKKyAqLworI2RlZmluZSBIQ19ITFByc3RfTUFTSyAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hMTGFzdFBfTUFTSyAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgSENfSFZQTVNLX01BU0sgICAgICAgICAgMHgwMDAwN2Y4MAorI2RlZmluZSBIQ19IQkZhY2VfTUFTSyAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0gybmQxVlRfTUFTSyAgICAgICAgIDB4MDAwMDAwM2YKKyNkZWZpbmUgSENfSFZQTVNLX1ggICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IVlBNU0tfWSAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhDX0hWUE1TS19aICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSENfSFZQTVNLX1cgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBIQ19IVlBNU0tfQ2QgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhDX0hWUE1TS19DcyAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSFZQTVNLX1MgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IVlBNU0tfVCAgICAgICAgICAgICAweDAwMDAwMDgwCisKKy8qIEVuYWJsZSBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IRW5hYmxlICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhDX0hlblRYRW52TWFwX01BU0sgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSENfSGVuVmVydGV4Q05UX01BU0sgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IZW5DUFVEQVpfTUFTSyAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhDX0hlbkRBU1pXQ19NQVNLICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgSENfSGVuRkJDdWxsX01BU0sgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBIQ19IZW5DV19NQVNLICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hlbkFBX01BU0sgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgSENfSGVuU1RfTUFTSyAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IZW5aVF9NQVNLICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhDX0hlblpXX01BU0sgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSENfSGVuQVRfTUFTSyAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBIQ19IZW5BV19NQVNLICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhDX0hlblNQX01BU0sgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSGVuTFBfTUFTSyAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IZW5UWENIX01BU0sgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hlblRYTVBfTUFTSyAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSGVuVFhQUF9NQVNLICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IZW5UWFRSX01BU0sgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hlbkNTX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSGVuRk9HX01BU0sgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IZW5BQkxfTUFTSyAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hlbkRUX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogWiBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IWldCQmFzTCAgICAgICAgMHgwMDEwCisjZGVmaW5lIEhDX1N1YkFfSFpXQkJhc0ggICAgICAgIDB4MDAxMQorI2RlZmluZSBIQ19TdWJBX0haV0JUeXBlICAgICAgICAweDAwMTIKKyNkZWZpbmUgSENfU3ViQV9IWkJpYXNMICAgICAgICAgMHgwMDEzCisjZGVmaW5lIEhDX1N1YkFfSFpXQmVuZCAgICAgICAgIDB4MDAxNAorI2RlZmluZSBIQ19TdWJBX0haV1RNRCAgICAgICAgICAweDAwMTUKKyNkZWZpbmUgSENfU3ViQV9IWldDREwgICAgICAgICAgMHgwMDE2CisjZGVmaW5lIEhDX1N1YkFfSFpXQ1RBR251bSAgICAgIDB4MDAxNworI2RlZmluZSBIQ19TdWJBX0haQ1lOdW0gICAgICAgICAweDAwMTgKKyNkZWZpbmUgSENfU3ViQV9IWldDRmlyZSAgICAgICAgMHgwMDE5CisvKiBIQ19TdWJBX0haV0JUeXBlCisgKi8KKyNkZWZpbmUgSENfSFpXQlR5cGVfTUFTSyAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IWkJpYXNlZFdCX01BU0sgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEhDX0haT05FYXNGRl9NQVNLICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSENfSFpPT05FYXNGRl9NQVNLICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IWldCRk1fTUFTSyAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIEhDX0haV0JMb2NfTUFTSyAgICAgICAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgSENfSFpXQlBpdF9NQVNLICAgICAgICAgMHgwMDAwM2ZmZgorI2RlZmluZSBIQ19IWldCRk1fMTYgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0haV0JGTV8zMiAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFpXQkZNXzI0ICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IWldCTG9jX0xvY2FsICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0haV0JMb2NfU3lTICAgICAgICAgIDB4MDAwMDQwMDAKKy8qIEhDX1N1YkFfSFpXQmVuZAorICovCisjZGVmaW5lIEhDX0haV0JlbmRfTUFTSyAgICAgICAgIDB4MDBmZmUwMDAKKyNkZWZpbmUgSENfSFpCaWFzSF9NQVNLICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IWldCZW5kX1NISUZUICAgICAgICAxMAorLyogSENfU3ViQV9IWldUTUQKKyAqLworI2RlZmluZSBIQ19IWldUTURfTUFTSyAgICAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEhDX0hFQkVCaWFzX01BU0sgICAgICAgIDB4MDAwMDdmMDAKKyNkZWZpbmUgSENfSFpORl9NQVNLICAgICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IWldUTURfTmV2ZXJQYXNzICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0haV1RNRF9MVCAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSENfSFpXVE1EX0VRICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBIQ19IWldUTURfTEUgICAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIEhDX0haV1RNRF9HVCAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgSENfSFpXVE1EX05FICAgICAgICAgICAgMHgwMDA1MDAwMAorI2RlZmluZSBIQ19IWldUTURfR0UgICAgICAgICAgICAweDAwMDYwMDAwCisjZGVmaW5lIEhDX0haV1RNRF9BbGxQYXNzICAgICAgIDB4MDAwNzAwMDAKKyNkZWZpbmUgSENfSEVCRUJpYXNfU0hJRlQgICAgICAgOAorLyogSENfU3ViQV9IWldDREwgICAgICAgICAgMHgwMDE2CisgKi8KKyNkZWZpbmUgSENfSFpXQ0RMX01BU0sgICAgICAgICAgMHgwMGZmZmZmZgorLyogSENfU3ViQV9IWldDVEFHbnVtICAgICAgMHgwMDE3CisgKi8KKyNkZWZpbmUgSENfSFpXQ1RBR251bV9NQVNLICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IWldDVEFHbnVtX1NISUZUICAgICAxNgorI2RlZmluZSBIQ19IWldDREhfTUFTSyAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0haV0NESF9TSElGVCAgICAgICAgIDAKKy8qIEhDX1N1YkFfSFpDWU51bSAgICAgICAgIDB4MDAxOAorICovCisjZGVmaW5lIEhDX0haQ1lOdW1fTUFTSyAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSFpDWU51bV9TSElGVCAgICAgICAgMTYKKyNkZWZpbmUgSENfSFpXQ1FXbnVtX01BU0sgICAgICAgMHgwMDAwM2ZmZgorI2RlZmluZSBIQ19IWldDUVdudW1fU0hJRlQgICAgICAwCisvKiBIQ19TdWJBX0haV0NGaXJlICAgICAgICAweDAwMTkKKyAqLworI2RlZmluZSBIQ19aV0NGaXJlX01BU0sgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0haV0NRV251bUxhc3RfTUFTSyAgIDB4MDAwMDNmZmYKKyNkZWZpbmUgSENfSFpXQ1FXbnVtTGFzdF9TSElGVCAgMAorCisvKiBTdGVuY2lsIFNldHRpbmcKKyAqLworI2RlZmluZSBIQ19TdWJBX0hTVFJFRiAgICAgICAgICAweDAwMjMKKyNkZWZpbmUgSENfU3ViQV9IU1RNRCAgICAgICAgICAgMHgwMDI0CisvKiBIQ19TdWJBX0hTQkZNCisgKi8KKyNkZWZpbmUgSENfSFNCRk1fTUFTSyAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IU0JMb2NfTUFTSyAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEhDX0hTQlBpdF9NQVNLICAgICAgICAgIDB4MDAwMDNmZmYKKy8qIEhDX1N1YkFfSFNUUkVGCisgKi8KKyNkZWZpbmUgSENfSFNUUkVGX01BU0sgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IU1RPUE1TS19NQVNLICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hTVEJNU0tfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFNUUkVGX1NISUZUICAgICAgICAgMTYKKyNkZWZpbmUgSENfSFNUT1BNU0tfU0hJRlQgICAgICAgOAorLyogSENfU3ViQV9IU1RNRAorICovCisjZGVmaW5lIEhDX0hTVE1EX01BU0sgICAgICAgICAgIDB4MDAwNzAwMDAKKyNkZWZpbmUgSENfSFNUT1BTRl9NQVNLICAgICAgICAgMHgwMDAwMDFjMAorI2RlZmluZSBIQ19IU1RPUFNQWkZfTUFTSyAgICAgICAweDAwMDAwMDM4CisjZGVmaW5lIEhDX0hTVE9QU1BaUF9NQVNLICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgSENfSFNUTURfTmV2ZXJQYXNzICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IU1RNRF9MVCAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hTVE1EX0VRICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFNUTURfTEUgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IU1RNRF9HVCAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhDX0hTVE1EX05FICAgICAgICAgICAgIDB4MDAwNTAwMDAKKyNkZWZpbmUgSENfSFNUTURfR0UgICAgICAgICAgICAgMHgwMDA2MDAwMAorI2RlZmluZSBIQ19IU1RNRF9BbGxQYXNzICAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEhDX0hTVE9QU0ZfS0VFUCAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFNUT1BTRl9aRVJPICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBIQ19IU1RPUFNGX1JFUExBQ0UgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hTVE9QU0ZfSU5DUlNBVCAgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgSENfSFNUT1BTRl9ERUNSU0FUICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IU1RPUFNGX0lOVkVSVCAgICAgICAweDAwMDAwMTQwCisjZGVmaW5lIEhDX0hTVE9QU0ZfSU5DUiAgICAgICAgIDB4MDAwMDAxODAKKyNkZWZpbmUgSENfSFNUT1BTRl9ERUNSICAgICAgICAgMHgwMDAwMDFjMAorI2RlZmluZSBIQ19IU1RPUFNQWkZfS0VFUCAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hTVE9QU1BaRl9aRVJPICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFNUT1BTUFpGX1JFUExBQ0UgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IU1RPUFNQWkZfSU5DUlNBVCAgICAweDAwMDAwMDE4CisjZGVmaW5lIEhDX0hTVE9QU1BaRl9ERUNSU0FUICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFNUT1BTUFpGX0lOVkVSVCAgICAgMHgwMDAwMDAyOAorI2RlZmluZSBIQ19IU1RPUFNQWkZfSU5DUiAgICAgICAweDAwMDAwMDMwCisjZGVmaW5lIEhDX0hTVE9QU1BaRl9ERUNSICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgSENfSFNUT1BTUFpQX0tFRVAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IU1RPUFNQWlBfWkVSTyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hTVE9QU1BaUF9SRVBMQUNFICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSFNUT1BTUFpQX0lOQ1JTQVQgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IU1RPUFNQWlBfREVDUlNBVCAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX0hTVE9QU1BaUF9JTlZFUlQgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgSENfSFNUT1BTUFpQX0lOQ1IgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBIQ19IU1RPUFNQWlBfREVDUiAgICAgICAweDAwMDAwMDA3CisKKy8qIEFscGhhIFNldHRpbmcKKyAqLworI2RlZmluZSBIQ19TdWJBX0hBQkJhc0wgICAgICAgICAweDAwMzAKKyNkZWZpbmUgSENfU3ViQV9IQUJCYXNIICAgICAgICAgMHgwMDMxCisjZGVmaW5lIEhDX1N1YkFfSEFCRk0gICAgICAgICAgIDB4MDAzMgorI2RlZmluZSBIQ19TdWJBX0hBVE1EICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgSENfU3ViQV9IQUJMQ3NhdCAgICAgICAgMHgwMDM0CisjZGVmaW5lIEhDX1N1YkFfSEFCTENvcCAgICAgICAgIDB4MDAzNQorI2RlZmluZSBIQ19TdWJBX0hBQkxBc2F0ICAgICAgICAweDAwMzYKKyNkZWZpbmUgSENfU3ViQV9IQUJMQW9wICAgICAgICAgMHgwMDM3CisjZGVmaW5lIEhDX1N1YkFfSEFCTFJDYSAgICAgICAgIDB4MDAzOAorI2RlZmluZSBIQ19TdWJBX0hBQkxSRkNhICAgICAgICAweDAwMzkKKyNkZWZpbmUgSENfU3ViQV9IQUJMUkNiaWFzICAgICAgMHgwMDNhCisjZGVmaW5lIEhDX1N1YkFfSEFCTFJDYiAgICAgICAgIDB4MDAzYgorI2RlZmluZSBIQ19TdWJBX0hBQkxSRkNiICAgICAgICAweDAwM2MKKyNkZWZpbmUgSENfU3ViQV9IQUJMUkFhICAgICAgICAgMHgwMDNkCisjZGVmaW5lIEhDX1N1YkFfSEFCTFJBYiAgICAgICAgIDB4MDAzZQorLyogSENfU3ViQV9IQUJGTQorICovCisjZGVmaW5lIEhDX0hBQkZNX01BU0sgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSEFCTG9jX01BU0sgICAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IQUJQaXRfTUFTSyAgICAgICAgICAweDAwMDAwN2ZmCisvKiBIQ19TdWJBX0hBVE1ECisgKi8KKyNkZWZpbmUgSENfSEFUTURfTUFTSyAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBIQ19IQVRSRUZfTUFTSyAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hBVE1EX05ldmVyUGFzcyAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSEFUTURfTFQgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IQVRNRF9FUSAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhDX0hBVE1EX0xFICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgSENfSEFUTURfR1QgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IQVRNRF9ORSAgICAgICAgICAgICAweDAwMDAwNTAwCisjZGVmaW5lIEhDX0hBVE1EX0dFICAgICAgICAgICAgIDB4MDAwMDA2MDAKKyNkZWZpbmUgSENfSEFUTURfQWxsUGFzcyAgICAgICAgMHgwMDAwMDcwMAorLyogSENfU3ViQV9IQUJMQ3NhdAorICovCisjZGVmaW5lIEhDX0hBQkxDc2F0X01BU0sgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSENfSEFCTENhX01BU0sgICAgICAgICAgMHgwMDAwZmMwMAorI2RlZmluZSBIQ19IQUJMQ2FfQ19NQVNLICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEhDX0hBQkxDYV9PUENfTUFTSyAgICAgIDB4MDAwMDNjMDAKKyNkZWZpbmUgSENfSEFCTEZDYV9NQVNLICAgICAgICAgMHgwMDAwMDNmMAorI2RlZmluZSBIQ19IQUJMRkNhX0NfTUFTSyAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIEhDX0hBQkxGQ2FfT1BDX01BU0sgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSEFCTENiaWFzX01BU0sgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBIQ19IQUJMQ2JpYXNfQ19NQVNLICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hBQkxDYmlhc19PUENfTUFTSyAgIDB4MDAwMDAwMDcKKy8qLS0gRGVmaW5lIHRoZSBpbnB1dCBjb2xvci4KKyAqLworI2RlZmluZSBIQ19YQ19Dc3JjICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1hDX0Nkc3QgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfWENfQXNyYyAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19YQ19BZHN0ICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX1hDX0ZvZyAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfWENfSEFCTFJDICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBIQ19YQ19taW5TcmNEc3QgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIEhDX1hDX21heFNyY0RzdCAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgSENfWENfbWltQXNyY0ludkFkc3QgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19YQ19PUEMgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1hDX0ludk9QQyAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfWENfT1BDcDUgICAgICAgICAgICAgMHgwMDAwMDAyMAorLyotLSBEZWZpbmUgdGhlIGlucHV0IEFscGhhCisgKi8KKyNkZWZpbmUgSENfWEFfT1BBICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YQV9JbnZPUEEgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX1hBX09QQXA1ICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfWEFfMCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YQV9Bc3JjICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1hBX0Fkc3QgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfWEFfRm9nICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19YQV9taW5Bc3JjRm9nICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX1hBX21pbkFzcmNBZHN0ICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgSENfWEFfbWF4QXNyY0ZvZyAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBIQ19YQV9tYXhBc3JjQWRzdCAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX1hBX0hBQkxSQSAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfWEFfbWluQXNyY0ludkFkc3QgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19YQV9IQUJMRlJBICAgICAgICAgICAweDAwMDAwMDA5CisvKi0tCisgKi8KKyNkZWZpbmUgSENfSEFCTENhX09QQyAgICAgICAgICAgKEhDX1hDX09QQyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0ludk9QQyAgICAgICAgKEhDX1hDX0ludk9QQyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX09QQ3A1ICAgICAgICAgKEhDX1hDX09QQ3A1IDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQ2FfQ3NyYyAgICAgICAgICAoSENfWENfQ3NyYyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0Nkc3QgICAgICAgICAgKEhDX1hDX0Nkc3QgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9Bc3JjICAgICAgICAgIChIQ19YQ19Bc3JjIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQ2FfQWRzdCAgICAgICAgICAoSENfWENfQWRzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0ZvZyAgICAgICAgICAgKEhDX1hDX0ZvZyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0hBQkxSQ2EgICAgICAgKEhDX1hDX0hBQkxSQyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX21pblNyY0RzdCAgICAgKEhDX1hDX21pblNyY0RzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX21heFNyY0RzdCAgICAgKEhDX1hDX21heFNyY0RzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEZDYV9PUEMgICAgICAgICAgICAgIChIQ19YQ19PUEMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9JbnZPUEMgICAgICAgICAgIChIQ19YQ19JbnZPUEMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9PUENwNSAgICAgICAgICAgIChIQ19YQ19PUENwNSA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkNhX0NzcmMgICAgICAgICAgICAgKEhDX1hDX0NzcmMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9DZHN0ICAgICAgICAgICAgIChIQ19YQ19DZHN0IDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfQXNyYyAgICAgICAgICAgICAoSENfWENfQXNyYyA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkNhX0Fkc3QgICAgICAgICAgICAgKEhDX1hDX0Fkc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9Gb2cgICAgICAgICAgICAgIChIQ19YQ19Gb2cgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9IQUJMUkNhICAgICAgICAgIChIQ19YQ19IQUJMUkMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9taW5TcmNEc3QgICAgICAgIChIQ19YQ19taW5TcmNEc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9tYXhTcmNEc3QgICAgICAgIChIQ19YQ19tYXhTcmNEc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9taW1Bc3JjSW52QWRzdCAgIChIQ19YQ19taW1Bc3JjSW52QWRzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMQ2JpYXNfSEFCTFJDYmlhcyAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hBQkxDYmlhc19Bc3JjICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSEFCTENiaWFzX0Fkc3QgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IQUJMQ2JpYXNfRm9nICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hBQkxDYmlhc19DaW4gICAgICAgIDB4MDAwMDAwMDQKKy8qIEhDX1N1YkFfSEFCTENvcCAgICAgICAgIDB4MDAzNQorICovCisjZGVmaW5lIEhDX0hBQkxkb3RfTUFTSyAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSENfSEFCTENvcF9NQVNLICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IQUJMQ2JfTUFTSyAgICAgICAgICAweDAwMDAzZjAwCisjZGVmaW5lIEhDX0hBQkxDYl9DX01BU0sgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgSENfSEFCTENiX09QQ19NQVNLICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IQUJMRkNiX01BU0sgICAgICAgICAweDAwMDAwMGZjCisjZGVmaW5lIEhDX0hBQkxGQ2JfQ19NQVNLICAgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgSENfSEFCTEZDYl9PUENfTUFTSyAgICAgMHgwMDAwMDAzYworI2RlZmluZSBIQ19IQUJMQ3NoaWZ0X01BU0sgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hBQkxDYl9PUEMgICAgICAgICAgIChIQ19YQ19PUEMgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0ludk9QQyAgICAgICAgKEhDX1hDX0ludk9QQyA8PCA4KQorI2RlZmluZSBIQ19IQUJMQ2JfT1BDcDUgICAgICAgICAoSENfWENfT1BDcDUgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0NzcmMgICAgICAgICAgKEhDX1hDX0NzcmMgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0Nkc3QgICAgICAgICAgKEhDX1hDX0Nkc3QgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0FzcmMgICAgICAgICAgKEhDX1hDX0FzcmMgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0Fkc3QgICAgICAgICAgKEhDX1hDX0Fkc3QgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0ZvZyAgICAgICAgICAgKEhDX1hDX0ZvZyA8PCA4KQorI2RlZmluZSBIQ19IQUJMQ2JfSEFCTFJDYSAgICAgICAoSENfWENfSEFCTFJDIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9taW5TcmNEc3QgICAgIChIQ19YQ19taW5TcmNEc3QgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX21heFNyY0RzdCAgICAgKEhDX1hDX21heFNyY0RzdCA8PCA4KQorI2RlZmluZSBIQ19IQUJMRkNiX09QQyAgICAgICAgICAgICAgKEhDX1hDX09QQyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0ludk9QQyAgICAgICAgICAgKEhDX1hDX0ludk9QQyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX09QQ3A1ICAgICAgICAgICAgKEhDX1hDX09QQ3A1IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQ2JfQ3NyYyAgICAgICAgICAgICAoSENfWENfQ3NyYyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0Nkc3QgICAgICAgICAgICAgKEhDX1hDX0Nkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9Bc3JjICAgICAgICAgICAgIChIQ19YQ19Bc3JjIDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQ2JfQWRzdCAgICAgICAgICAgICAoSENfWENfQWRzdCA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0ZvZyAgICAgICAgICAgICAgKEhDX1hDX0ZvZyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0hBQkxSQ2IgICAgICAgICAgKEhDX1hDX0hBQkxSQyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX21pblNyY0RzdCAgICAgICAgKEhDX1hDX21pblNyY0RzdCA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX21heFNyY0RzdCAgICAgICAgKEhDX1hDX21heFNyY0RzdCA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX21pbUFzcmNJbnZBZHN0ICAgKEhDX1hDX21pbUFzcmNJbnZBZHN0IDw8IDIpCisvKiBIQ19TdWJBX0hBQkxBc2F0ICAgICAgICAweDAwMzYKKyAqLworI2RlZmluZSBIQ19IQUJMQXNhdF9NQVNLICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hBQkxBYV9NQVNLICAgICAgICAgIDB4MDAwMGZjMDAKKyNkZWZpbmUgSENfSEFCTEFhX0FfTUFTSyAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IQUJMQWFfT1BBX01BU0sgICAgICAweDAwMDAzYzAwCisjZGVmaW5lIEhDX0hBQkxGQWFfTUFTSyAgICAgICAgIDB4MDAwMDAzZjAKKyNkZWZpbmUgSENfSEFCTEZBYV9BX01BU0sgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBIQ19IQUJMRkFhX09QQV9NQVNLICAgICAweDAwMDAwMGYwCisjZGVmaW5lIEhDX0hBQkxBYmlhc19NQVNLICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgSENfSEFCTEFiaWFzX0FfTUFTSyAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IQUJMQWJpYXNfT1BBX01BU0sgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX0hBQkxBYV9PUEEgICAgICAgICAgIChIQ19YQV9PUEEgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9JbnZPUEEgICAgICAgIChIQ19YQV9JbnZPUEEgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9PUEFwNSAgICAgICAgIChIQ19YQV9PUEFwNSA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhXzAgICAgICAgICAgICAgKEhDX1hBXzAgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9Bc3JjICAgICAgICAgIChIQ19YQV9Bc3JjIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQWFfQWRzdCAgICAgICAgICAoSENfWEFfQWRzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX0ZvZyAgICAgICAgICAgKEhDX1hBX0ZvZyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX21pbkFzcmNGb2cgICAgKEhDX1hBX21pbkFzcmNGb2cgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9taW5Bc3JjQWRzdCAgIChIQ19YQV9taW5Bc3JjQWRzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX21heEFzcmNGb2cgICAgKEhDX1hBX21heEFzcmNGb2cgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9tYXhBc3JjQWRzdCAgIChIQ19YQV9tYXhBc3JjQWRzdCA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX0hBQkxSQSAgICAgICAgKEhDX1hBX0hBQkxSQSA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEZBYV9PUEEgICAgICAgICAgKEhDX1hBX09QQSA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0ludk9QQSAgICAgICAoSENfWEFfSW52T1BBIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQWFfT1BBcDUgICAgICAgIChIQ19YQV9PUEFwNSA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhXzAgICAgICAgICAgICAoSENfWEFfMCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0FzcmMgICAgICAgICAoSENfWEFfQXNyYyA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0Fkc3QgICAgICAgICAoSENfWEFfQWRzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0ZvZyAgICAgICAgICAoSENfWEFfRm9nIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQWFfbWluQXNyY0ZvZyAgIChIQ19YQV9taW5Bc3JjRm9nIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQWFfbWluQXNyY0Fkc3QgIChIQ19YQV9taW5Bc3JjQWRzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX21heEFzcmNGb2cgICAoSENfWEFfbWF4QXNyY0ZvZyA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX21heEFzcmNBZHN0ICAoSENfWEFfbWF4QXNyY0Fkc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9taW5Bc3JjSW52QWRzdCAgIChIQ19YQV9taW5Bc3JjSW52QWRzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX0hBQkxGUkEgICAgICAgICAgKEhDX1hBX0hBQkxGUkEgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEFiaWFzX0hBQkxSQWJpYXMgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IQUJMQWJpYXNfQXNyYyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hBQkxBYmlhc19BZHN0ICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSEFCTEFiaWFzX0ZvZyAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IQUJMQWJpYXNfQWFhICAgICAgICAweDAwMDAwMDA0CisvKiBIQ19TdWJBX0hBQkxBb3AgICAgICAgICAweDAwMzcKKyAqLworI2RlZmluZSBIQ19IQUJMQW9wX01BU0sgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEhDX0hBQkxBYl9NQVNLICAgICAgICAgIDB4MDAwMDNmMDAKKyNkZWZpbmUgSENfSEFCTEFiX09QQV9NQVNLICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IQUJMRkFiX01BU0sgICAgICAgICAweDAwMDAwMGZjCisjZGVmaW5lIEhDX0hBQkxGQWJfT1BBX01BU0sgICAgIDB4MDAwMDAwM2MKKyNkZWZpbmUgSENfSEFCTEFzaGlmdF9NQVNLICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IQUJMQWJfT1BBICAgICAgICAgICAoSENfWEFfT1BBIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9JbnZPUEEgICAgICAgIChIQ19YQV9JbnZPUEEgPDwgOCkKKyNkZWZpbmUgSENfSEFCTEFiX09QQXA1ICAgICAgICAgKEhDX1hBX09QQXA1IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl8wICAgICAgICAgICAgIChIQ19YQV8wIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9Bc3JjICAgICAgICAgIChIQ19YQV9Bc3JjIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9BZHN0ICAgICAgICAgIChIQ19YQV9BZHN0IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9Gb2cgICAgICAgICAgIChIQ19YQV9Gb2cgPDwgOCkKKyNkZWZpbmUgSENfSEFCTEFiX21pbkFzcmNGb2cgICAgKEhDX1hBX21pbkFzcmNGb2cgPDwgOCkKKyNkZWZpbmUgSENfSEFCTEFiX21pbkFzcmNBZHN0ICAgKEhDX1hBX21pbkFzcmNBZHN0IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9tYXhBc3JjRm9nICAgIChIQ19YQV9tYXhBc3JjRm9nIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9tYXhBc3JjQWRzdCAgIChIQ19YQV9tYXhBc3JjQWRzdCA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfSEFCTFJBICAgICAgICAoSENfWEFfSEFCTFJBIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxGQWJfT1BBICAgICAgICAgIChIQ19YQV9PUEEgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9JbnZPUEEgICAgICAgKEhDX1hBX0ludk9QQSA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkFiX09QQXA1ICAgICAgICAoSENfWEFfT1BBcDUgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl8wICAgICAgICAgICAgKEhDX1hBXzAgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9Bc3JjICAgICAgICAgKEhDX1hBX0FzcmMgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9BZHN0ICAgICAgICAgKEhDX1hBX0Fkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9Gb2cgICAgICAgICAgKEhDX1hBX0ZvZyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkFiX21pbkFzcmNGb2cgICAoSENfWEFfbWluQXNyY0ZvZyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkFiX21pbkFzcmNBZHN0ICAoSENfWEFfbWluQXNyY0Fkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9tYXhBc3JjRm9nICAgKEhDX1hBX21heEFzcmNGb2cgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9tYXhBc3JjQWRzdCAgKEhDX1hBX21heEFzcmNBZHN0IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfbWluQXNyY0ludkFkc3QgICAoSENfWEFfbWluQXNyY0ludkFkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9IQUJMRlJBICAgICAgICAgIChIQ19YQV9IQUJMRlJBIDw8IDIpCisvKiBIQ19TdWJBX0hBQkxSQWEgICAgICAgICAweDAwM2QKKyAqLworI2RlZmluZSBIQ19IQUJMUkFhX01BU0sgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hBQkxSRkFhX01BU0sgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSENfSEFCTFJBYmlhc19NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IQUJMUkFhX1NISUZUICAgICAgICAxNgorI2RlZmluZSBIQ19IQUJMUkZBYV9TSElGVCAgICAgICA4CisvKiBIQ19TdWJBX0hBQkxSQWIgICAgICAgICAweDAwM2UKKyAqLworI2RlZmluZSBIQ19IQUJMUkFiX01BU0sgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hBQkxSRkFiX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEFCTFJBYl9TSElGVCAgICAgICAgOAorCisvKiBEZXN0aW5hdGlvbiBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IREJCYXNMICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEhDX1N1YkFfSERCQmFzSCAgICAgICAgIDB4MDA0MQorI2RlZmluZSBIQ19TdWJBX0hEQkZNICAgICAgICAgICAweDAwNDIKKyNkZWZpbmUgSENfU3ViQV9IRkJCTVNLTCAgICAgICAgMHgwMDQzCisjZGVmaW5lIEhDX1N1YkFfSFJPUCAgICAgICAgICAgIDB4MDA0NAorLyogSENfU3ViQV9IREJGTSAgICAgICAgICAgMHgwMDQyCisgKi8KKyNkZWZpbmUgSENfSERCRk1fTUFTSyAgICAgICAgICAgMHgwMDFmMDAwMAorI2RlZmluZSBIQ19IREJMb2NfTUFTSyAgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEhDX0hEQlBpdF9NQVNLICAgICAgICAgIDB4MDAwMDNmZmYKKyNkZWZpbmUgSENfSERCRk1fUkdCNTU1ICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IREJGTV9SR0I1NjUgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FSR0I0NDQ0ICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSERCRk1fQVJHQjE1NTUgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IREJGTV9CR1I1NTUgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0JHUjU2NSAgICAgICAgIDB4MDAwNTAwMDAKKyNkZWZpbmUgSENfSERCRk1fQUJHUjQ0NDQgICAgICAgMHgwMDA2MDAwMAorI2RlZmluZSBIQ19IREJGTV9BQkdSMTU1NSAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FSR0IwODg4ICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgSENfSERCRk1fQVJHQjg4ODggICAgICAgMHgwMDA5MDAwMAorI2RlZmluZSBIQ19IREJGTV9BQkdSMDg4OCAgICAgICAweDAwMGEwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FCR1I4ODg4ICAgICAgIDB4MDAwYjAwMDAKKyNkZWZpbmUgSENfSERCTG9jX0xvY2FsICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IREJMb2NfU3lzICAgICAgICAgICAweDAwMDA0MDAwCisvKiBIQ19TdWJBX0hST1AgICAgICAgICAgICAweDAwNDQKKyAqLworI2RlZmluZSBIQ19IUk9QX01BU0sgICAgICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEhDX0hGQkJNU0tIX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFJPUF9CTEFDSyAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IUk9QX0RQb24gICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhDX0hST1BfRFBuYSAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSFJPUF9QbiAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBIQ19IUk9QX1BEbmEgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhDX0hST1BfRG4gICAgICAgICAgICAgIDB4MDAwMDA1MDAKKyNkZWZpbmUgSENfSFJPUF9EUHggICAgICAgICAgICAgMHgwMDAwMDYwMAorI2RlZmluZSBIQ19IUk9QX0RQYW4gICAgICAgICAgICAweDAwMDAwNzAwCisjZGVmaW5lIEhDX0hST1BfRFBhICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSFJPUF9EUHhuICAgICAgICAgICAgMHgwMDAwMDkwMAorI2RlZmluZSBIQ19IUk9QX0QgICAgICAgICAgICAgICAweDAwMDAwYTAwCisjZGVmaW5lIEhDX0hST1BfRFBubyAgICAgICAgICAgIDB4MDAwMDBiMDAKKyNkZWZpbmUgSENfSFJPUF9QICAgICAgICAgICAgICAgMHgwMDAwMGMwMAorI2RlZmluZSBIQ19IUk9QX1BEbm8gICAgICAgICAgICAweDAwMDAwZDAwCisjZGVmaW5lIEhDX0hST1BfRFBvICAgICAgICAgICAgIDB4MDAwMDBlMDAKKyNkZWZpbmUgSENfSFJPUF9XSElURSAgICAgICAgICAgMHgwMDAwMGYwMAorCisvKiBGb2cgU2V0dGluZworICovCisjZGVmaW5lIEhDX1N1YkFfSEZvZ0xGICAgICAgICAgIDB4MDA1MAorI2RlZmluZSBIQ19TdWJBX0hGb2dDTCAgICAgICAgICAweDAwNTEKKyNkZWZpbmUgSENfU3ViQV9IRm9nQ0ggICAgICAgICAgMHgwMDUyCisjZGVmaW5lIEhDX1N1YkFfSEZvZ1N0TCAgICAgICAgIDB4MDA1MworI2RlZmluZSBIQ19TdWJBX0hGb2dTdEggICAgICAgICAweDAwNTQKKyNkZWZpbmUgSENfU3ViQV9IRm9nT09kTUYgICAgICAgMHgwMDU1CisjZGVmaW5lIEhDX1N1YkFfSEZvZ09PZEVGICAgICAgIDB4MDA1NgorI2RlZmluZSBIQ19TdWJBX0hGb2dFbmRMICAgICAgICAweDAwNTcKKyNkZWZpbmUgSENfU3ViQV9IRm9nRGVuc3QgICAgICAgMHgwMDU4CisvKiBIQ19TdWJBX0ZvZ0xGICAgICAgICAgICAweDAwNTAKKyAqLworI2RlZmluZSBIQ19Gb2dMRl9NQVNLICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0ZvZ0VxX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfRm9nTURfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBIQ19Gb2dNRF9Mb2NhbEZvZyAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19Gb2dNRF9MaW5lYXJGb2cgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19Gb2dNRF9FeHBvbmVudGlhbEZvZyAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19Gb2dNRF9FeHBvbmVudGlhbDJGb2cgMHgwMDAwMDAwNQorLyogI2RlZmluZSBIQ19Gb2dNRF9Gb2dUYWJsZSAgICAgICAweDAwMDAwMDAzICovCisKKy8qIEhDX1N1YkFfSEZvZ0RlbnN0ICAgICAgICAweDAwNTgKKyAqLworI2RlZmluZSBIQ19Gb2dEZW5zdF9NQVNLICAgICAgICAweDAwMWZmZjAwCisjZGVmaW5lIEhDX0ZvZ0VuZExfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKworLyogVGV4dHVyZSBzdWJ0eXBlIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgSENfU3ViVHlwZV9UZXgwICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19TdWJUeXBlX1RleDEgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1N1YlR5cGVfVGV4R2VuZXJhbCAgIDB4MDAwMDAwZmUKKworLyogQXR0cmlidXRlIG9mIHRleHR1cmUgbgorICovCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwQmFzTCAgICAgIDB4MDAwMAorI2RlZmluZSBIQ19TdWJBX0hUWG5MMUJhc0wgICAgICAweDAwMDEKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDJCYXNMICAgICAgMHgwMDAyCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwzQmFzTCAgICAgIDB4MDAwMworI2RlZmluZSBIQ19TdWJBX0hUWG5MNEJhc0wgICAgICAweDAwMDQKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDVCYXNMICAgICAgMHgwMDA1CisjZGVmaW5lIEhDX1N1YkFfSFRYbkw2QmFzTCAgICAgIDB4MDAwNgorI2RlZmluZSBIQ19TdWJBX0hUWG5MN0Jhc0wgICAgICAweDAwMDcKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDhCYXNMICAgICAgMHgwMDA4CisjZGVmaW5lIEhDX1N1YkFfSFRYbkw5QmFzTCAgICAgIDB4MDAwOQorI2RlZmluZSBIQ19TdWJBX0hUWG5MYUJhc0wgICAgICAweDAwMGEKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGJCYXNMICAgICAgMHgwMDBiCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxjQmFzTCAgICAgIDB4MDAwYworI2RlZmluZSBIQ19TdWJBX0hUWG5MZEJhc0wgICAgICAweDAwMGQKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGVCYXNMICAgICAgMHgwMDBlCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxmQmFzTCAgICAgIDB4MDAwZgorI2RlZmluZSBIQ19TdWJBX0hUWG5MMTBCYXNMICAgICAweDAwMTAKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDExQmFzTCAgICAgMHgwMDExCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwMTJCYXNIICAgIDB4MDAyMAorI2RlZmluZSBIQ19TdWJBX0hUWG5MMzQ1QmFzSCAgICAweDAwMjEKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDY3OEJhc0ggICAgMHgwMDIyCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw5YWJCYXNIICAgIDB4MDAyMworI2RlZmluZSBIQ19TdWJBX0hUWG5MY2RlQmFzSCAgICAweDAwMjQKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGYxMDExQmFzSCAgMHgwMDI1CisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwUGl0ICAgICAgIDB4MDAyYgorI2RlZmluZSBIQ19TdWJBX0hUWG5MMVBpdCAgICAgICAweDAwMmMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDJQaXQgICAgICAgMHgwMDJkCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwzUGl0ICAgICAgIDB4MDAyZQorI2RlZmluZSBIQ19TdWJBX0hUWG5MNFBpdCAgICAgICAweDAwMmYKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDVQaXQgICAgICAgMHgwMDMwCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw2UGl0ICAgICAgIDB4MDAzMQorI2RlZmluZSBIQ19TdWJBX0hUWG5MN1BpdCAgICAgICAweDAwMzIKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDhQaXQgICAgICAgMHgwMDMzCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw5UGl0ICAgICAgIDB4MDAzNAorI2RlZmluZSBIQ19TdWJBX0hUWG5MYVBpdCAgICAgICAweDAwMzUKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGJQaXQgICAgICAgMHgwMDM2CisjZGVmaW5lIEhDX1N1YkFfSFRYbkxjUGl0ICAgICAgIDB4MDAzNworI2RlZmluZSBIQ19TdWJBX0hUWG5MZFBpdCAgICAgICAweDAwMzgKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGVQaXQgICAgICAgMHgwMDM5CisjZGVmaW5lIEhDX1N1YkFfSFRYbkxmUGl0ICAgICAgIDB4MDAzYQorI2RlZmluZSBIQ19TdWJBX0hUWG5MMTBQaXQgICAgICAweDAwM2IKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDExUGl0ICAgICAgMHgwMDNjCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwXzVXRSAgICAgIDB4MDA0YgorI2RlZmluZSBIQ19TdWJBX0hUWG5MNl9iV0UgICAgICAweDAwNGMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGNfMTFXRSAgICAgMHgwMDRkCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwXzVIRSAgICAgIDB4MDA1MQorI2RlZmluZSBIQ19TdWJBX0hUWG5MNl9iSEUgICAgICAweDAwNTIKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGNfMTFIRSAgICAgMHgwMDUzCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwwT1MgICAgICAgIDB4MDA3NworI2RlZmluZSBIQ19TdWJBX0hUWG5UQiAgICAgICAgICAweDAwNzgKKyNkZWZpbmUgSENfU3ViQV9IVFhuTVBNRCAgICAgICAgMHgwMDc5CisjZGVmaW5lIEhDX1N1YkFfSFRYbkNMT0R1ICAgICAgIDB4MDA3YQorI2RlZmluZSBIQ19TdWJBX0hUWG5GTSAgICAgICAgICAweDAwN2IKKyNkZWZpbmUgSENfU3ViQV9IVFhuVFJDSCAgICAgICAgMHgwMDdjCisjZGVmaW5lIEhDX1N1YkFfSFRYblRSQ0wgICAgICAgIDB4MDA3ZAorI2RlZmluZSBIQ19TdWJBX0hUWG5UQkMgICAgICAgICAweDAwN2UKKyNkZWZpbmUgSENfU3ViQV9IVFhuVFJBSCAgICAgICAgMHgwMDdmCisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTENzYXQgICAgIDB4MDA4MAorI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxDb3AgICAgICAweDAwODEKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMTVBmb2cgICAgMHgwMDgyCisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTEFzYXQgICAgIDB4MDA4MworI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxSQ2EgICAgICAweDAwODUKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMUkNiICAgICAgMHgwMDg2CisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTFJDYyAgICAgIDB4MDA4NworI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxSQ2JpYXMgICAweDAwODgKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMUkFhICAgICAgMHgwMDg5CisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTFJGb2cgICAgIDB4MDA4YQorI2RlZmluZSBIQ19TdWJBX0hUWG5CdW1wTTAwICAgICAweDAwOTAKKyNkZWZpbmUgSENfU3ViQV9IVFhuQnVtcE0wMSAgICAgMHgwMDkxCisjZGVmaW5lIEhDX1N1YkFfSFRYbkJ1bXBNMTAgICAgIDB4MDA5MgorI2RlZmluZSBIQ19TdWJBX0hUWG5CdW1wTTExICAgICAweDAwOTMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTFNjYWxlICAgICAgMHgwMDk0CisjZGVmaW5lIEhDX1N1YkFfSFRYU01EICAgICAgICAgIDB4MDAwMAorLyogSENfU3ViQV9IVFhuTDAxMkJhc0ggICAgMHgwMDIwCisgKi8KKyNkZWZpbmUgSENfSFRYbkwwQmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTDFCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MMkJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkwxQmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTDJCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTDM0NUJhc0ggICAgMHgwMDIxCisgKi8KKyNkZWZpbmUgSENfSFRYbkwzQmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTDRCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MNUJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkw0QmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTDVCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTDY3OEJhc0ggICAgMHgwMDIyCisgKi8KKyNkZWZpbmUgSENfSFRYbkw2QmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTDdCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MOEJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkw3QmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTDhCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTDlhYkJhc0ggICAgMHgwMDIzCisgKi8KKyNkZWZpbmUgSENfSFRYbkw5QmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTGFCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MYkJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxhQmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTGJCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTGNkZUJhc0ggICAgMHgwMDI0CisgKi8KKyNkZWZpbmUgSENfSFRYbkxjQmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTGRCYXNIX01BU0sgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5MZUJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxkQmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTGVCYXNIX1NISUZUICAgICAxNgorLyogSENfU3ViQV9IVFhuTGNkZUJhc0ggICAgMHgwMDI1CisgKi8KKyNkZWZpbmUgSENfSFRYbkxmQmFzSF9NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuTDEwQmFzSF9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuTDExQmFzSF9NQVNLICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IVFhuTDEwQmFzSF9TSElGVCAgICAgOAorI2RlZmluZSBIQ19IVFhuTDExQmFzSF9TSElGVCAgICAgMTYKKy8qIEhDX1N1YkFfSFRYbkwwUGl0ICAgICAgIDB4MDAyYgorICovCisjZGVmaW5lIEhDX0hUWG5MblBpdF9NQVNLICAgICAgIDB4MDAwMDNmZmYKKyNkZWZpbmUgSENfSFRYbkVuUGl0X01BU0sgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBIQ19IVFhuTG5QaXRFX01BU0sgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIEhDX0hUWG5MblBpdEVfU0hJRlQgICAgIDIwCisvKiBIQ19TdWJBX0hUWG5MMF81V0UgICAgICAweDAwNGIKKyAqLworI2RlZmluZSBIQ19IVFhuTDBXRV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5MMVdFX01BU0sgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSFRYbkwyV0VfTUFTSyAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IVFhuTDNXRV9NQVNLICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hUWG5MNFdFX01BU0sgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSFRYbkw1V0VfTUFTSyAgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTDFXRV9TSElGVCAgICAgICA0CisjZGVmaW5lIEhDX0hUWG5MMldFX1NISUZUICAgICAgIDgKKyNkZWZpbmUgSENfSFRYbkwzV0VfU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgSENfSFRYbkw0V0VfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfSFRYbkw1V0VfU0hJRlQgICAgICAgMjAKKy8qIEhDX1N1YkFfSFRYbkw2X2JXRSAgICAgIDB4MDA0YworICovCisjZGVmaW5lIEhDX0hUWG5MNldFX01BU0sgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgSENfSFRYbkw3V0VfTUFTSyAgICAgICAgMHgwMDAwMDBmMAorI2RlZmluZSBIQ19IVFhuTDhXRV9NQVNLICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEhDX0hUWG5MOVdFX01BU0sgICAgICAgIDB4MDAwMGYwMDAKKyNkZWZpbmUgSENfSFRYbkxhV0VfTUFTSyAgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBIQ19IVFhuTGJXRV9NQVNLICAgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIEhDX0hUWG5MN1dFX1NISUZUICAgICAgIDQKKyNkZWZpbmUgSENfSFRYbkw4V0VfU0hJRlQgICAgICAgOAorI2RlZmluZSBIQ19IVFhuTDlXRV9TSElGVCAgICAgICAxMgorI2RlZmluZSBIQ19IVFhuTGFXRV9TSElGVCAgICAgICAxNgorI2RlZmluZSBIQ19IVFhuTGJXRV9TSElGVCAgICAgICAyMAorLyogSENfU3ViQV9IVFhuTGNfMTFXRSAgICAgIDB4MDA0ZAorICovCisjZGVmaW5lIEhDX0hUWG5MY1dFX01BU0sgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgSENfSFRYbkxkV0VfTUFTSyAgICAgICAgMHgwMDAwMDBmMAorI2RlZmluZSBIQ19IVFhuTGVXRV9NQVNLICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEhDX0hUWG5MZldFX01BU0sgICAgICAgIDB4MDAwMGYwMDAKKyNkZWZpbmUgSENfSFRYbkwxMFdFX01BU0sgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBIQ19IVFhuTDExV0VfTUFTSyAgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIEhDX0hUWG5MZFdFX1NISUZUICAgICAgIDQKKyNkZWZpbmUgSENfSFRYbkxlV0VfU0hJRlQgICAgICAgOAorI2RlZmluZSBIQ19IVFhuTGZXRV9TSElGVCAgICAgICAxMgorI2RlZmluZSBIQ19IVFhuTDEwV0VfU0hJRlQgICAgICAxNgorI2RlZmluZSBIQ19IVFhuTDExV0VfU0hJRlQgICAgICAyMAorLyogSENfU3ViQV9IVFhuTDBfNUhFICAgICAgMHgwMDUxCisgKi8KKyNkZWZpbmUgSENfSFRYbkwwSEVfTUFTSyAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBIQ19IVFhuTDFIRV9NQVNLICAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIEhDX0hUWG5MMkhFX01BU0sgICAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSFRYbkwzSEVfTUFTSyAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBIQ19IVFhuTDRIRV9NQVNLICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhDX0hUWG5MNUhFX01BU0sgICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgSENfSFRYbkwxSEVfU0hJRlQgICAgICAgNAorI2RlZmluZSBIQ19IVFhuTDJIRV9TSElGVCAgICAgICA4CisjZGVmaW5lIEhDX0hUWG5MM0hFX1NISUZUICAgICAgIDEyCisjZGVmaW5lIEhDX0hUWG5MNEhFX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEhDX0hUWG5MNUhFX1NISUZUICAgICAgIDIwCisvKiBIQ19TdWJBX0hUWG5MNl9iSEUgICAgICAweDAwNTIKKyAqLworI2RlZmluZSBIQ19IVFhuTDZIRV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5MN0hFX01BU0sgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSFRYbkw4SEVfTUFTSyAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IVFhuTDlIRV9NQVNLICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hUWG5MYUhFX01BU0sgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxiSEVfTUFTSyAgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTDdIRV9TSElGVCAgICAgICA0CisjZGVmaW5lIEhDX0hUWG5MOEhFX1NISUZUICAgICAgIDgKKyNkZWZpbmUgSENfSFRYbkw5SEVfU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgSENfSFRYbkxhSEVfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfSFRYbkxiSEVfU0hJRlQgICAgICAgMjAKKy8qIEhDX1N1YkFfSFRYbkxjXzExSEUgICAgICAweDAwNTMKKyAqLworI2RlZmluZSBIQ19IVFhuTGNIRV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5MZEhFX01BU0sgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSFRYbkxlSEVfTUFTSyAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IVFhuTGZIRV9NQVNLICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hUWG5MMTBIRV9NQVNLICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSFRYbkwxMUhFX01BU0sgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTGRIRV9TSElGVCAgICAgICA0CisjZGVmaW5lIEhDX0hUWG5MZUhFX1NISUZUICAgICAgIDgKKyNkZWZpbmUgSENfSFRYbkxmSEVfU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgSENfSFRYbkwxMEhFX1NISUZUICAgICAgMTYKKyNkZWZpbmUgSENfSFRYbkwxMUhFX1NISUZUICAgICAgMjAKKy8qIEhDX1N1YkFfSFRYbkwwT1MgICAgICAgIDB4MDA3NworICovCisjZGVmaW5lIEhDX0hUWG5MME9TX01BU0sgICAgICAgIDB4MDAzZmYwMDAKKyNkZWZpbmUgSENfSFRYbkxWbWF4X01BU0sgICAgICAgMHgwMDAwMGZjMAorI2RlZmluZSBIQ19IVFhuTFZtaW5fTUFTSyAgICAgICAweDAwMDAwMDNmCisjZGVmaW5lIEhDX0hUWG5MME9TX1NISUZUICAgICAgIDEyCisjZGVmaW5lIEhDX0hUWG5MVm1heF9TSElGVCAgICAgIDYKKy8qIEhDX1N1YkFfSFRYblRCICAgICAgICAgIDB4MDA3OAorICovCisjZGVmaW5lIEhDX0hUWG5UQl9NQVNLICAgICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgSENfSFRYbkZMU2VfTUFTSyAgICAgICAgMHgwMDAwZTAwMAorI2RlZmluZSBIQ19IVFhuRkxTc19NQVNLICAgICAgICAweDAwMDAxYzAwCisjZGVmaW5lIEhDX0hUWG5GTFRlX01BU0sgICAgICAgIDB4MDAwMDAzODAKKyNkZWZpbmUgSENfSFRYbkZMVHNfTUFTSyAgICAgICAgMHgwMDAwMDA3MAorI2RlZmluZSBIQ19IVFhuRkxEc19NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5UQl9Ob1RCICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCX1RCQ19TICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJfVEJDX1QgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQl9UQl9TICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgSENfSFRYblRCX1RCX1QgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IVFhuRkxTZV9OZWFyZXN0ICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5GTFNlX0xpbmVhciAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgSENfSFRYbkZMU2VfTm9uTGluZWFyICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IVFhuRkxTZV9TaGFycCAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhDX0hUWG5GTFNlX0ZsYXRfR2F1c3NpYW5fQ3ViaWMgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IVFhuRkxTc19OZWFyZXN0ICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5GTFNzX0xpbmVhciAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSENfSFRYbkZMU3NfTm9uTGluZWFyICAgMHgwMDAwMDgwMAorI2RlZmluZSBIQ19IVFhuRkxTc19GbGF0X0dhdXNzaWFuX0N1YmljIDB4MDAwMDE4MDAKKyNkZWZpbmUgSENfSFRYbkZMVGVfTmVhcmVzdCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuRkxUZV9MaW5lYXIgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hUWG5GTFRlX05vbkxpbmVhciAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSFRYbkZMVGVfU2hhcnAgICAgICAgMHgwMDAwMDE4MAorI2RlZmluZSBIQ19IVFhuRkxUZV9GbGF0X0dhdXNzaWFuX0N1YmljIDB4MDAwMDAzMDAKKyNkZWZpbmUgSENfSFRYbkZMVHNfTmVhcmVzdCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuRkxUc19MaW5lYXIgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hUWG5GTFRzX05vbkxpbmVhciAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFRYbkZMVHNfRmxhdF9HYXVzc2lhbl9DdWJpYyAweDAwMDAwMDYwCisjZGVmaW5lIEhDX0hUWG5GTERzX1RleDAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYbkZMRHNfTmVhcmVzdCAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19IVFhuRkxEc19MaW5lYXIgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hUWG5GTERzX05vbkxpbmVhciAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSFRYbkZMRHNfRGl0aGVyICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IVFhuRkxEc19Db25zdExPRCAgICAweDAwMDAwMDA1CisjZGVmaW5lIEhDX0hUWG5GTERzX0FuaSAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgSENfSFRYbkZMRHNfQW5pRGl0aGVyICAgMHgwMDAwMDAwNworLyogSENfU3ViQV9IVFhuTVBNRCAgICAgICAgMHgwMDc5CisgKi8KKyNkZWZpbmUgSENfSFRYbk1QTURfU01BU0sgICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9UTUFTSyAgICAgICAweDAwMzgwMDAwCisjZGVmaW5lIEhDX0hUWG5MT0REVGZfTUFTSyAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgSENfSFRYblhZMlNUX01BU0sgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IVFhuTVBNRF9Uc2luZ2xlICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1RjbGFtcCAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfVHJlcGVhdCAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9UbWlycm9yICAgICAweDAwMTgwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1R3cmFwICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfU3NpbmdsZSAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9TY2xhbXAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1NyZXBlYXQgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfU21pcnJvciAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9Td3JhcCAgICAgICAweDAwMDQwMDAwCisvKiBIQ19TdWJBX0hUWG5DTE9EdSAgICAgICAweDAwN2EKKyAqLworI2RlZmluZSBIQ19IVFhuQ0xPRHVfTUFTSyAgICAgICAweDAwMGZmYzAwCisjZGVmaW5lIEhDX0hUWG5DTE9EZF9NQVNLICAgICAgIDB4MDAwMDAzZmYKKyNkZWZpbmUgSENfSFRYbkNMT0R1X1NISUZUICAgICAgMTAKKy8qIEhDX1N1YkFfSFRYbkZNICAgICAgICAgIDB4MDA3YgorICovCisjZGVmaW5lIEhDX0hUWG5GTV9NQVNLICAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxvY19NQVNLICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IVFhuRk1fSU5ERVggICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9JbnRlbnNpdHkgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0x1bSAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IVFhuRk1fQWxwaGEgICAgICAgICAweDAwMTgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9EWCAgICAgICAgICAgIDB4MDAyODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0FSR0IxNiAgICAgICAgMHgwMDg4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fQVJHQjMyICAgICAgICAweDAwOTgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9BQkdSMTYgICAgICAgIDB4MDBhODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0FCR1IzMiAgICAgICAgMHgwMGI4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fUkdCQTE2ICAgICAgICAweDAwYzgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9SR0JBMzIgICAgICAgIDB4MDBkODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0JHUkExNiAgICAgICAgMHgwMGU4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fQkdSQTMyICAgICAgICAweDAwZjgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9CVU1QTUFQICAgICAgIDB4MDAzODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0luZGV4MSAgICAgICAgKEhDX0hUWG5GTV9JTkRFWCAgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fSW5kZXgyICAgICAgICAoSENfSFRYbkZNX0lOREVYICAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9JbmRleDQgICAgICAgIChIQ19IVFhuRk1fSU5ERVggICAgIHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0luZGV4OCAgICAgICAgKEhDX0hUWG5GTV9JTkRFWCAgICAgfCAweDAwMDMwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fVDEgICAgICAgICAgICAoSENfSFRYbkZNX0ludGVuc2l0eSB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9UMiAgICAgICAgICAgIChIQ19IVFhuRk1fSW50ZW5zaXR5IHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1Q0ICAgICAgICAgICAgKEhDX0hUWG5GTV9JbnRlbnNpdHkgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fVDggICAgICAgICAgICAoSENfSFRYbkZNX0ludGVuc2l0eSB8IDB4MDAwMzAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9MMSAgICAgICAgICAgIChIQ19IVFhuRk1fTHVtICAgICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0wyICAgICAgICAgICAgKEhDX0hUWG5GTV9MdW0gICAgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fTDQgICAgICAgICAgICAoSENfSFRYbkZNX0x1bSAgICAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9MOCAgICAgICAgICAgIChIQ19IVFhuRk1fTHVtICAgICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FMNDQgICAgICAgICAgKEhDX0hUWG5GTV9MdW0gICAgICAgfCAweDAwMDQwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQUw4OCAgICAgICAgICAoSENfSFRYbkZNX0x1bSAgICAgICB8IDB4MDAwNTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BMSAgICAgICAgICAgIChIQ19IVFhuRk1fQWxwaGEgICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0EyICAgICAgICAgICAgKEhDX0hUWG5GTV9BbHBoYSAgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQTQgICAgICAgICAgICAoSENfSFRYbkZNX0FscGhhICAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BOCAgICAgICAgICAgIChIQ19IVFhuRk1fQWxwaGEgICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0RYMSAgICAgICAgICAgKEhDX0hUWG5GTV9EWCAgICAgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fRFgyMyAgICAgICAgICAoSENfSFRYbkZNX0RYICAgICAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9EWDQ1ICAgICAgICAgIChIQ19IVFhuRk1fRFggICAgICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQjU1NSAgICAgICAgKEhDX0hUWG5GTV9BUkdCMTYgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fUkdCNTY1ICAgICAgICAoSENfSFRYbkZNX0FSR0IxNiAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BUkdCMTU1NSAgICAgIChIQ19IVFhuRk1fQVJHQjE2ICAgIHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FSR0I0NDQ0ICAgICAgKEhDX0hUWG5GTV9BUkdCMTYgICAgfCAweDAwMDMwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQVJHQjA4ODggICAgICAoSENfSFRYbkZNX0FSR0IzMiAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BUkdCODg4OCAgICAgIChIQ19IVFhuRk1fQVJHQjMyICAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0JHUjU1NSAgICAgICAgKEhDX0hUWG5GTV9BQkdSMTYgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQkdSNTY1ICAgICAgICAoSENfSFRYbkZNX0FCR1IxNiAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BQkdSMTU1NSAgICAgIChIQ19IVFhuRk1fQUJHUjE2ICAgIHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FCR1I0NDQ0ICAgICAgKEhDX0hUWG5GTV9BQkdSMTYgICAgfCAweDAwMDMwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQUJHUjA4ODggICAgICAoSENfSFRYbkZNX0FCR1IzMiAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BQkdSODg4OCAgICAgIChIQ19IVFhuRk1fQUJHUjMyICAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQkE1NTUwICAgICAgKEhDX0hUWG5GTV9SR0JBMTYgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fUkdCQTU1NTEgICAgICAoSENfSFRYbkZNX1JHQkExNiAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9SR0JBNDQ0NCAgICAgIChIQ19IVFhuRk1fUkdCQTE2ICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQkE4ODgwICAgICAgKEhDX0hUWG5GTV9SR0JBMzIgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fUkdCQTg4ODggICAgICAoSENfSFRYbkZNX1JHQkEzMiAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9CR1JBNTU1MCAgICAgIChIQ19IVFhuRk1fQkdSQTE2ICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0JHUkE1NTUxICAgICAgKEhDX0hUWG5GTV9CR1JBMTYgICAgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQkdSQTQ0NDQgICAgICAoSENfSFRYbkZNX0JHUkExNiAgICB8IDB4MDAwMzAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9CR1JBODg4MCAgICAgIChIQ19IVFhuRk1fQkdSQTMyICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0JHUkE4ODg4ICAgICAgKEhDX0hUWG5GTV9CR1JBMzIgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fVlU4OCAgICAgICAgICAoSENfSFRYbkZNX0JVTVBNQVAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9MVlU2NTUgICAgICAgIChIQ19IVFhuRk1fQlVNUE1BUCAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0xWVTg4OCAgICAgICAgKEhDX0hUWG5GTV9CVU1QTUFQICAgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuTG9jX0xvY2FsICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5Mb2NfU3lzICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSFRYbkxvY19BR1AgICAgICAgICAgMHgwMDAwMDAwMworLyogSENfU3ViQV9IVFhuVFJBSCAgICAgICAgMHgwMDdmCisgKi8KKyNkZWZpbmUgSENfSFRYblRSQUhfTUFTSyAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IVFhuVFJBTF9NQVNLICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUWG5UQkFfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFRYblRSQUhfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfSFRYblRSQUxfU0hJRlQgICAgICAgOAorLyogSENfU3ViQV9IVFhuVEJMQ3NhdCAgICAgMHgwMDgwCisgKi0tIERlZmluZSB0aGUgaW5wdXQgdGV4dHVyZS4KKyAqLworI2RlZmluZSBIQ19YVENfVE9QQyAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1hUQ19JbnZUT1BDICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfWFRDX1RPUENwNSAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19YVENfQ2JpYXMgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1hUQ19JbnZDYmlhcyAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfWFRDXzAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YVENfRGlmICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1hUQ19TcGVjICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfWFRDX1RleCAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19YVENfQ3VyICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX1hUQ19BZGlmICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgSENfWFRDX0ZvZyAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBIQ19YVENfQXRleCAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX1hUQ19BY3VyICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfWFRDX0hUWG5UQkxSQyAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSBIQ19YVENfQ3RleG5leHQgICAgICAgICAweDAwMDAwMDBhCisvKi0tCisgKi8KKyNkZWZpbmUgSENfSFRYblRCTENzYXRfTUFTSyAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ2FfTUFTSyAgICAgICAweDAwMGZjMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9NQVNLICAgICAgIDB4MDAwMDFmODAKKyNkZWZpbmUgSENfSFRYblRCTENjX01BU0sgICAgICAgMHgwMDAwMDAzZgorI2RlZmluZSBIQ19IVFhuVEJMQ2FfVE9QQyAgICAgICAoSENfWFRDX1RPUEMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9JbnZUT1BDICAgIChIQ19YVENfSW52VE9QQyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX1RPUENwNSAgICAgKEhDX1hUQ19UT1BDcDUgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV8wICAgICAgICAgIChIQ19YVENfMCA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX0RpZiAgICAgICAgKEhDX1hUQ19EaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9TcGVjICAgICAgIChIQ19YVENfU3BlYyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX1RleCAgICAgICAgKEhDX1hUQ19UZXggPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9DdXIgICAgICAgIChIQ19YVENfQ3VyIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfQWRpZiAgICAgICAoSENfWFRDX0FkaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9Gb2cgICAgICAgIChIQ19YVENfRm9nIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfQXRleCAgICAgICAoSENfWFRDX0F0ZXggPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9BY3VyICAgICAgIChIQ19YVENfQWN1ciA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX0hUWG5UQkxSQyAgKEhDX1hUQ19IVFhuVEJMUkMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9DdGV4bmV4dCAgIChIQ19YVENfQ3RleG5leHQgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9UT1BDICAgICAgIChIQ19YVENfVE9QQyA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfSW52VE9QQyAgICAoSENfWFRDX0ludlRPUEMgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX1RPUENwNSAgICAgKEhDX1hUQ19UT1BDcDUgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiXzAgICAgICAgICAgKEhDX1hUQ18wIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9EaWYgICAgICAgIChIQ19YVENfRGlmIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9TcGVjICAgICAgIChIQ19YVENfU3BlYyA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfVGV4ICAgICAgICAoSENfWFRDX1RleCA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfQ3VyICAgICAgICAoSENfWFRDX0N1ciA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfQWRpZiAgICAgICAoSENfWFRDX0FkaWYgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0ZvZyAgICAgICAgKEhDX1hUQ19Gb2cgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0F0ZXggICAgICAgKEhDX1hUQ19BdGV4IDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9BY3VyICAgICAgIChIQ19YVENfQWN1ciA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfSFRYblRCTFJDICAoSENfWFRDX0hUWG5UQkxSQyA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfQ3RleG5leHQgICAoSENfWFRDX0N0ZXhuZXh0IDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDY19UT1BDICAgICAgIChIQ19YVENfVE9QQyA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfSW52VE9QQyAgICAoSENfWFRDX0ludlRPUEMgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX1RPUENwNSAgICAgKEhDX1hUQ19UT1BDcDUgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjXzAgICAgICAgICAgKEhDX1hUQ18wIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19EaWYgICAgICAgIChIQ19YVENfRGlmIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19TcGVjICAgICAgIChIQ19YVENfU3BlYyA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfVGV4ICAgICAgICAoSENfWFRDX1RleCA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfQ3VyICAgICAgICAoSENfWFRDX0N1ciA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfQWRpZiAgICAgICAoSENfWFRDX0FkaWYgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0ZvZyAgICAgICAgKEhDX1hUQ19Gb2cgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0F0ZXggICAgICAgKEhDX1hUQ19BdGV4IDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19BY3VyICAgICAgIChIQ19YVENfQWN1ciA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfSFRYblRCTFJDICAoSENfWFRDX0hUWG5UQkxSQyA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfQ3RleG5leHQgICAoSENfWFRDX0N0ZXhuZXh0IDw8IDApCisvKiBIQ19TdWJBX0hUWG5UQkxDb3AgICAgICAweDAwODEKKyAqLworI2RlZmluZSBIQ19IVFhuVEJMZG90X01BU0sgICAgICAweDAwYzAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDb3BfTUFTSyAgICAgIDB4MDAzODAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX01BU0sgICAgMHgwMDA3YzAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ3NoaWZ0X01BU0sgICAweDAwMDAxODAwCisjZGVmaW5lIEhDX0hUWG5UQkxBb3BfTUFTSyAgICAgIDB4MDAwMDAzODAKKyNkZWZpbmUgSENfSFRYblRCTEFiaWFzX01BU0sgICAgMHgwMDAwMDA3OAorI2RlZmluZSBIQ19IVFhuVEJMQXNoaWZ0X01BU0sgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hUWG5UQkxDb3BfQWRkICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENvcF9TdWIgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ29wX01pbiAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDb3BfTWF4ICAgICAgIDB4MDAxODAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENvcF9NYXNrICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfQ2JpYXMgICAgICAgICAgIChIQ19YVENfQ2JpYXMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19JbnZDYmlhcyAgICAgICAgKEhDX1hUQ19JbnZDYmlhcyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzXzAgICAgICAgICAgICAgICAoSENfWFRDXzAgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19EaWYgICAgICAgICAgICAgKEhDX1hUQ19EaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19TcGVjICAgICAgICAgICAgKEhDX1hUQ19TcGVjIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfVGV4ICAgICAgICAgICAgIChIQ19YVENfVGV4IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfQ3VyICAgICAgICAgICAgIChIQ19YVENfQ3VyIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfQWRpZiAgICAgICAgICAgIChIQ19YVENfQWRpZiA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX0ZvZyAgICAgICAgICAgICAoSENfWFRDX0ZvZyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX0F0ZXggICAgICAgICAgICAoSENfWFRDX0F0ZXggPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19BY3VyICAgICAgICAgICAgKEhDX1hUQ19BY3VyIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfSFRYblRCTFJDICAgICAgIChIQ19YVENfSFRYblRCTFJDIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ3NoaWZ0XzEgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDc2hpZnRfMiAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSFRYblRCTENzaGlmdF9ObyAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ3NoaWZ0X0RvdFAgICAweDAwMDAxODAwCisvKj0qIEpvaG4gU2hlbmcgWzIwMDMuNy4xOF0gdGV4dHVyZSBjb21iaW5lICo9Ki8KKyNkZWZpbmUgSENfSFRYblRCTERPVDMgICAweDAwMDgwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxET1Q0ICAgMHgwMDBDMDAwMAorCisjZGVmaW5lIEhDX0hUWG5UQkxBb3BfQWRkICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTEFvcF9TdWIgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IVFhuVEJMQW9wX01pbiAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhDX0hUWG5UQkxBb3BfTWF4ICAgICAgIDB4MDAwMDAxODAKKyNkZWZpbmUgSENfSFRYblRCTEFvcF9NYXNrICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBIQ19IVFhuVEJMQWJpYXNfSW52ICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFRYblRCTEFiaWFzX0FkaWYgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxBYmlhc19Gb2cgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IVFhuVEJMQWJpYXNfQWN1ciAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfSFRYblRCTEFiaWFzX0hUWG5UQkxSQWJpYXMgICAweDAwMDAwMDE4CisjZGVmaW5lIEhDX0hUWG5UQkxBYmlhc19BdGV4ICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IVFhuVEJMQXNoaWZ0XzEgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxBc2hpZnRfMiAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSFRYblRCTEFzaGlmdF9ObyAgICAgMHgwMDAwMDAwMgorLyogI2RlZmluZSBIQ19IVFhuVEJMQXNoaWZ0X0RvdFAgICAweDAwMDAwMDAzICovCisvKiBIQ19TdWJBX0hUWG5UQkxNUEZvZyAgICAweDAwODIKKyAqLworI2RlZmluZSBIQ19IVFhuVEJMTVBmb2dfTUFTSyAgICAweDAwZTAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxNUGZvZ18wICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTE1QZm9nX0FkaWYgICAgMHgwMDIwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMTVBmb2dfRm9nICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxNUGZvZ19BdGV4ICAgIDB4MDA2MDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTE1QZm9nX0FjdXIgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMTVBmb2dfR0hUWG5UQkxSRm9nICAgIDB4MDBhMDAwMDAKKy8qIEhDX1N1YkFfSFRYblRCTEFzYXQgICAgIDB4MDA4MworICotLSBEZWZpbmUgdGhlIHRleHR1cmUgYWxwaGEgaW5wdXQuCisgKi8KKyNkZWZpbmUgSENfWFRBX1RPUEEgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YVEFfSW52VE9QQSAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX1hUQV9UT1BBcDUgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfWFRBX0FkaWYgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YVEFfRm9nICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1hUQV9BY3VyICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfWFRBX0hUWG5UQkxSQSAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19YVEFfQXRleCAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX1hUQV9BdGV4bmV4dCAgICAgICAgIDB4MDAwMDAwMDUKKy8qLS0KKyAqLworI2RlZmluZSBIQ19IVFhuVEJMQXNhdF9NQVNLICAgICAweDAwODAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxBTUJfTUFTSyAgICAgIDB4MDA3MDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTEFhX01BU0sgICAgICAgMHgwMDA3YzAwMAorI2RlZmluZSBIQ19IVFhuVEJMQWJfTUFTSyAgICAgICAweDAwMDAwZjgwCisjZGVmaW5lIEhDX0hUWG5UQkxBY19NQVNLICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgSENfSFRYblRCTEFNQl9TSElGVCAgICAgMjAKKyNkZWZpbmUgSENfSFRYblRCTEFhX1RPUEEgICAgICAgKEhDX1hUQV9UT1BBIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfSW52VE9QQSAgICAoSENfWFRBX0ludlRPUEEgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9UT1BBcDUgICAgIChIQ19YVEFfVE9QQXA1IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfQWRpZiAgICAgICAoSENfWFRBX0FkaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9Gb2cgICAgICAgIChIQ19YVEFfRm9nIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfQWN1ciAgICAgICAoSENfWFRBX0FjdXIgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9IVFhuVEJMUkEgIChIQ19YVEFfSFRYblRCTFJBIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfQXRleCAgICAgICAoSENfWFRBX0F0ZXggPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9BdGV4bmV4dCAgIChIQ19YVEFfQXRleG5leHQgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9UT1BBICAgICAgIChIQ19YVEFfVE9QQSA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfSW52VE9QQSAgICAoSENfWFRBX0ludlRPUEEgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX1RPUEFwNSAgICAgKEhDX1hUQV9UT1BBcDUgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX0FkaWYgICAgICAgKEhDX1hUQV9BZGlmIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9Gb2cgICAgICAgIChIQ19YVEFfRm9nIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9BY3VyICAgICAgIChIQ19YVEFfQWN1ciA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfSFRYblRCTFJBICAoSENfWFRBX0hUWG5UQkxSQSA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfQXRleCAgICAgICAoSENfWFRBX0F0ZXggPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX0F0ZXhuZXh0ICAgKEhDX1hUQV9BdGV4bmV4dCA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWNfVE9QQSAgICAgICAoSENfWFRBX1RPUEEgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTEFjX0ludlRPUEEgICAgKEhDX1hUQV9JbnZUT1BBIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19UT1BBcDUgICAgIChIQ19YVEFfVE9QQXA1IDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19BZGlmICAgICAgIChIQ19YVEFfQWRpZiA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQWNfRm9nICAgICAgICAoSENfWFRBX0ZvZyA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQWNfQWN1ciAgICAgICAoSENfWFRBX0FjdXIgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTEFjX0hUWG5UQkxSQSAgKEhDX1hUQV9IVFhuVEJMUkEgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTEFjX0F0ZXggICAgICAgKEhDX1hUQV9BdGV4IDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19BdGV4bmV4dCAgIChIQ19YVEFfQXRleG5leHQgPDwgMCkKKy8qIEhDX1N1YkFfSFRYblRCTFJBYSAgICAgIDB4MDA4OQorICovCisjZGVmaW5lIEhDX0hUWG5UQkxSQWFfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYblRCTFJBYl9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuVEJMUkFjX01BU0sgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hUWG5UQkxSQWFfU0hJRlQgICAgIDE2CisjZGVmaW5lIEhDX0hUWG5UQkxSQWJfU0hJRlQgICAgIDgKKyNkZWZpbmUgSENfSFRYblRCTFJBY19TSElGVCAgICAgMAorLyogSENfU3ViQV9IVFhuVEJMUkZvZyAgICAgMHgwMDhhCisgKi8KKyNkZWZpbmUgSENfSFRYblRCTFJGb2dfTUFTSyAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuVEJMUkFiaWFzX01BU0sgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hUWG5UQkxSRm9nX1NISUZUICAgIDgKKyNkZWZpbmUgSENfSFRYblRCTFJBYmlhc19TSElGVCAgMAorLyogSENfU3ViQV9IVFhuTFNjYWxlICAgICAgMHgwMDk0CisgKi8KKyNkZWZpbmUgSENfSFRYbkxTY2FsZV9NQVNLICAgICAgMHgwMDA3ZmMwMAorI2RlZmluZSBIQ19IVFhuTE9mZl9NQVNLICAgICAgICAweDAwMDAwMWZmCisjZGVmaW5lIEhDX0hUWG5MU2NhbGVfU0hJRlQgICAgIDEwCisvKiBIQ19TdWJBX0hUWFNNRCAgICAgICAgICAweDAwMDAKKyAqLworI2RlZmluZSBIQ19IVFhTTURfTUFTSyAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhDX0hUWFRNRF9NQVNLICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFRYTnVtX01BU0sgICAgICAgICAgMHgwMDAwMDAzOAorI2RlZmluZSBIQ19IVFhUUk1EX01BU0sgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIEhDX0hUWENIQ0xSX01BU0sgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSFRYTnVtX1NISUZUICAgICAgICAgMworCisvKiBUZXh0dXJlIFBhbGV0dGUgbgorICovCisjZGVmaW5lIEhDX1N1YlR5cGVfVGV4UGFsZXR0ZTAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfU3ViVHlwZV9UZXhQYWxldHRlMSAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19TdWJUeXBlX0ZvZ1RhYmxlICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX1N1YlR5cGVfU3RpcHBsZSAgICAgIDB4MDAwMDAwMTQKKy8qIEhDX1N1YkFfVGV4UGFsZXR0ZTAgICAgIDB4MDAwMAorICovCisjZGVmaW5lIEhDX0hUUG5BX01BU0sgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSENfSFRQblJfTUFTSyAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IVFBuR19NQVNLICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hUUG5CX01BU0sgICAgICAgICAgIDB4MDAwMDAwZmYKKy8qIEhDX1N1YkFfRm9nVGFibGUgICAgICAgIDB4MDAxMAorICovCisjZGVmaW5lIEhDX0hGUG4zX01BU0sgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSENfSEZQbjJfTUFTSyAgICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IRlBuMV9NQVNLICAgICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hGUG5fTUFTSyAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEZQbjNfU0hJRlQgICAgICAgICAgMjQKKyNkZWZpbmUgSENfSEZQbjJfU0hJRlQgICAgICAgICAgMTYKKyNkZWZpbmUgSENfSEZQbjFfU0hJRlQgICAgICAgICAgOAorCisvKiBBdXRvIFRlc3RpbmcgJiBTZWN1cml0eQorICovCisjZGVmaW5lIEhDX1N1YkFfSGVuRklGT0FUICAgICAgIDB4MDAwMAorI2RlZmluZSBIQ19TdWJBX0hGQkRyYXdGaXJzdCAgICAweDAwMDQKKyNkZWZpbmUgSENfU3ViQV9IRkJCYXNMICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEhDX1N1YkFfSEZCRHN0ICAgICAgICAgIDB4MDAwNgorLyogSENfU3ViQV9IZW5GSUZPQVQgICAgICAgMHgwMDAwCisgKi8KKyNkZWZpbmUgSENfSGVuRklGT0FUX01BU0sgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBIQ19IZW5HRU1JTG9ja19NQVNLICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hlbkZCQVN3YXBfTUFTSyAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSGVuT1RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IZW5DTURRX01BU0sgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hlblRYQ1RTVV9NQVNLICAgICAgIDB4MDAwMDAwMDEKKy8qIEhDX1N1YkFfSEZCRHJhd0ZpcnN0ICAgIDB4MDAwNAorICovCisjZGVmaW5lIEhDX0hGQkRyYXdGaXJzdF9NQVNLICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSEZCUXVldWVfTUFTSyAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IRkJMb2NrX01BU0sgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhDX0hFT0ZfTUFTSyAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSEZCQmFzSF9NQVNLICAgICAgICAgMHgwMDAwMDBmZgorCisvKiBHRU1JIFNldHRpbmcKKyAqLworI2RlZmluZSBIQ19TdWJBX0hUQXJiUkNNICAgICAgICAweDAwMDgKKyNkZWZpbmUgSENfU3ViQV9IVEFyYlJaICAgICAgICAgMHgwMDBhCisjZGVmaW5lIEhDX1N1YkFfSFRBcmJXWiAgICAgICAgIDB4MDAwYgorI2RlZmluZSBIQ19TdWJBX0hUQXJiUlRYICAgICAgICAweDAwMGMKKyNkZWZpbmUgSENfU3ViQV9IVEFyYlJDVyAgICAgICAgMHgwMDBkCisjZGVmaW5lIEhDX1N1YkFfSFRBcmJFMiAgICAgICAgIDB4MDAwZQorI2RlZmluZSBIQ19TdWJBX0hBcmJSUUNNICAgICAgICAweDAwMTAKKyNkZWZpbmUgSENfU3ViQV9IQXJiV1FDTSAgICAgICAgMHgwMDExCisjZGVmaW5lIEhDX1N1YkFfSEdFTUlUb3V0ICAgICAgIDB4MDAyMAorI2RlZmluZSBIQ19TdWJBX0hGdGhSVFhEICAgICAgICAweDAwNDAKKyNkZWZpbmUgSENfU3ViQV9IRnRoUlRYQSAgICAgICAgMHgwMDQ0CisjZGVmaW5lIEhDX1N1YkFfSENNRFFzdEwgICAgICAgIDB4MDA1MAorI2RlZmluZSBIQ19TdWJBX0hDTURRZW5kTCAgICAgICAweDAwNTEKKyNkZWZpbmUgSENfU3ViQV9IQ01EUUxlbiAgICAgICAgMHgwMDUyCisvKiBIQ19TdWJBX0hUQXJiUkNNICAgICAgICAweDAwMDgKKyAqLworI2RlZmluZSBIQ19IVEFyYlJDTV9NQVNLICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiUlogICAgICAgICAweDAwMGEKKyAqLworI2RlZmluZSBIQ19IVEFyYlJaX01BU0sgICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiV1ogICAgICAgICAweDAwMGIKKyAqLworI2RlZmluZSBIQ19IVEFyYldaX01BU0sgICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiUlRYICAgICAgICAweDAwMGMKKyAqLworI2RlZmluZSBIQ19IVEFyYlJUWF9NQVNLICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiUkNXICAgICAgICAweDAwMGQKKyAqLworI2RlZmluZSBIQ19IVEFyYlJDV19NQVNLICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hUQXJiRTIgICAgICAgICAweDAwMGUKKyAqLworI2RlZmluZSBIQ19IVEFyYkUyX01BU0sgICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hBcmJSUUNNICAgICAgICAweDAwMTAKKyAqLworI2RlZmluZSBIQ19IVEFyYlJRQ01fTUFTSyAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hBcmJXUUNNICAgICAgICAweDAwMTEKKyAqLworI2RlZmluZSBIQ19IQXJiV1FDTV9NQVNLICAgICAgICAweDAwMDBmZmZmCisvKiBIQ19TdWJBX0hHRU1JVG91dCAgICAgICAweDAwMjAKKyAqLworI2RlZmluZSBIQ19IR0VNSVRvdXRfTUFTSyAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhDX0hOUEFyYlpDX01BU0sgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSENfSEdFTUlUb3V0X1NISUZUICAgICAgMTYKKy8qIEhDX1N1YkFfSEZ0aFJUWEQgICAgICAgIDB4MDA0MAorICovCisjZGVmaW5lIEhDX0hGdGhSVFhEX01BU0sgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSEZ0aFJaRF9NQVNLICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IRnRoV1pEX01BU0sgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hGdGhSVFhEX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEhDX0hGdGhSWkRfU0hJRlQgICAgICAgIDgKKy8qIEhDX1N1YkFfSEZ0aFJUWEEgICAgICAgIDB4MDA0NAorICovCisjZGVmaW5lIEhDX0hGdGhSVFhBX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRGVmaW5lIHRoZSBIYWxjeW9uIEludGVybmFsIHJlZ2lzdGVyIGFjY2VzcyBjb25zdGFudHMuIEZvciBzaW11bGF0b3Igb25seS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENfU0lNQV9IQUdQQnN0TCAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhDX1NJTUFfSEFHUEJlbmRMICAgICAgIDB4MDAwMQorI2RlZmluZSBIQ19TSU1BX0hBR1BDTU5UICAgICAgICAweDAwMDIKKyNkZWZpbmUgSENfU0lNQV9IQUdQQnBMICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEhDX1NJTUFfSEFHUEJwSCAgICAgICAgIDB4MDAwNAorI2RlZmluZSBIQ19TSU1BX0hDbGlwVEIgICAgICAgICAweDAwMDUKKyNkZWZpbmUgSENfU0lNQV9IQ2xpcExSICAgICAgICAgMHgwMDA2CisjZGVmaW5lIEhDX1NJTUFfSEZQQ2xpcFRMICAgICAgIDB4MDAwNworI2RlZmluZSBIQ19TSU1BX0hGUENsaXBCTCAgICAgICAweDAwMDgKKyNkZWZpbmUgSENfU0lNQV9IRlBDbGlwTEwgICAgICAgMHgwMDA5CisjZGVmaW5lIEhDX1NJTUFfSEZQQ2xpcFJMICAgICAgIDB4MDAwYQorI2RlZmluZSBIQ19TSU1BX0hGUENsaXBUQkggICAgICAweDAwMGIKKyNkZWZpbmUgSENfU0lNQV9IRlBDbGlwTFJIICAgICAgMHgwMDBjCisjZGVmaW5lIEhDX1NJTUFfSExQICAgICAgICAgICAgIDB4MDAwZAorI2RlZmluZSBIQ19TSU1BX0hMUFJGICAgICAgICAgICAweDAwMGUKKyNkZWZpbmUgSENfU0lNQV9IU29saWRDTCAgICAgICAgMHgwMDBmCisjZGVmaW5lIEhDX1NJTUFfSFBpeEdDICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBIQ19TSU1BX0hTUFhZT1MgICAgICAgICAweDAwMTEKKyNkZWZpbmUgSENfU0lNQV9IQ21kQSAgICAgICAgICAgMHgwMDEyCisjZGVmaW5lIEhDX1NJTUFfSENtZEIgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBIQ19TSU1BX0hFbmFibGUgICAgICAgICAweDAwMTQKKyNkZWZpbmUgSENfU0lNQV9IWldCQmFzTCAgICAgICAgMHgwMDE1CisjZGVmaW5lIEhDX1NJTUFfSFpXQkJhc0ggICAgICAgIDB4MDAxNgorI2RlZmluZSBIQ19TSU1BX0haV0JUeXBlICAgICAgICAweDAwMTcKKyNkZWZpbmUgSENfU0lNQV9IWkJpYXNMICAgICAgICAgMHgwMDE4CisjZGVmaW5lIEhDX1NJTUFfSFpXQmVuZCAgICAgICAgIDB4MDAxOQorI2RlZmluZSBIQ19TSU1BX0haV1RNRCAgICAgICAgICAweDAwMWEKKyNkZWZpbmUgSENfU0lNQV9IWldDREwgICAgICAgICAgMHgwMDFiCisjZGVmaW5lIEhDX1NJTUFfSFpXQ1RBR251bSAgICAgIDB4MDAxYworI2RlZmluZSBIQ19TSU1BX0haQ1lOdW0gICAgICAgICAweDAwMWQKKyNkZWZpbmUgSENfU0lNQV9IWldDRmlyZSAgICAgICAgMHgwMDFlCisvKiAjZGVmaW5lIEhDX1NJTUFfSFNCQmFzTCAgICAgICAgIDB4MDAxZCAqLworLyogI2RlZmluZSBIQ19TSU1BX0hTQkJhc0ggICAgICAgICAweDAwMWUgKi8KKy8qICNkZWZpbmUgSENfU0lNQV9IU0JGTSAgICAgICAgICAgMHgwMDFmICovCisjZGVmaW5lIEhDX1NJTUFfSFNUUkVGICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBIQ19TSU1BX0hTVE1EICAgICAgICAgICAweDAwMjEKKyNkZWZpbmUgSENfU0lNQV9IQUJCYXNMICAgICAgICAgMHgwMDIyCisjZGVmaW5lIEhDX1NJTUFfSEFCQmFzSCAgICAgICAgIDB4MDAyMworI2RlZmluZSBIQ19TSU1BX0hBQkZNICAgICAgICAgICAweDAwMjQKKyNkZWZpbmUgSENfU0lNQV9IQVRNRCAgICAgICAgICAgMHgwMDI1CisjZGVmaW5lIEhDX1NJTUFfSEFCTENzYXQgICAgICAgIDB4MDAyNgorI2RlZmluZSBIQ19TSU1BX0hBQkxDb3AgICAgICAgICAweDAwMjcKKyNkZWZpbmUgSENfU0lNQV9IQUJMQXNhdCAgICAgICAgMHgwMDI4CisjZGVmaW5lIEhDX1NJTUFfSEFCTEFvcCAgICAgICAgIDB4MDAyOQorI2RlZmluZSBIQ19TSU1BX0hBQkxSQ2EgICAgICAgICAweDAwMmEKKyNkZWZpbmUgSENfU0lNQV9IQUJMUkZDYSAgICAgICAgMHgwMDJiCisjZGVmaW5lIEhDX1NJTUFfSEFCTFJDYmlhcyAgICAgIDB4MDAyYworI2RlZmluZSBIQ19TSU1BX0hBQkxSQ2IgICAgICAgICAweDAwMmQKKyNkZWZpbmUgSENfU0lNQV9IQUJMUkZDYiAgICAgICAgMHgwMDJlCisjZGVmaW5lIEhDX1NJTUFfSEFCTFJBYSAgICAgICAgIDB4MDAyZgorI2RlZmluZSBIQ19TSU1BX0hBQkxSQWIgICAgICAgICAweDAwMzAKKyNkZWZpbmUgSENfU0lNQV9IREJCYXNMICAgICAgICAgMHgwMDMxCisjZGVmaW5lIEhDX1NJTUFfSERCQmFzSCAgICAgICAgIDB4MDAzMgorI2RlZmluZSBIQ19TSU1BX0hEQkZNICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgSENfU0lNQV9IRkJCTVNLTCAgICAgICAgMHgwMDM0CisjZGVmaW5lIEhDX1NJTUFfSFJPUCAgICAgICAgICAgIDB4MDAzNQorI2RlZmluZSBIQ19TSU1BX0hGb2dMRiAgICAgICAgICAweDAwMzYKKyNkZWZpbmUgSENfU0lNQV9IRm9nQ0wgICAgICAgICAgMHgwMDM3CisjZGVmaW5lIEhDX1NJTUFfSEZvZ0NIICAgICAgICAgIDB4MDAzOAorI2RlZmluZSBIQ19TSU1BX0hGb2dTdEwgICAgICAgICAweDAwMzkKKyNkZWZpbmUgSENfU0lNQV9IRm9nU3RIICAgICAgICAgMHgwMDNhCisjZGVmaW5lIEhDX1NJTUFfSEZvZ09PZE1GICAgICAgIDB4MDAzYgorI2RlZmluZSBIQ19TSU1BX0hGb2dPT2RFRiAgICAgICAweDAwM2MKKyNkZWZpbmUgSENfU0lNQV9IRm9nRW5kTCAgICAgICAgMHgwMDNkCisjZGVmaW5lIEhDX1NJTUFfSEZvZ0RlbnN0ICAgICAgIDB4MDAzZQorLyotLS0tIHN0YXJ0IG9mIHRleHR1cmUgMCBzZXR0aW5nIC0tLS0KKyAqLworI2RlZmluZSBIQ19TSU1BX0hUWDBMMEJhc0wgICAgICAweDAwNDAKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDFCYXNMICAgICAgMHgwMDQxCisjZGVmaW5lIEhDX1NJTUFfSFRYMEwyQmFzTCAgICAgIDB4MDA0MgorI2RlZmluZSBIQ19TSU1BX0hUWDBMM0Jhc0wgICAgICAweDAwNDMKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDRCYXNMICAgICAgMHgwMDQ0CisjZGVmaW5lIEhDX1NJTUFfSFRYMEw1QmFzTCAgICAgIDB4MDA0NQorI2RlZmluZSBIQ19TSU1BX0hUWDBMNkJhc0wgICAgICAweDAwNDYKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDdCYXNMICAgICAgMHgwMDQ3CisjZGVmaW5lIEhDX1NJTUFfSFRYMEw4QmFzTCAgICAgIDB4MDA0OAorI2RlZmluZSBIQ19TSU1BX0hUWDBMOUJhc0wgICAgICAweDAwNDkKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGFCYXNMICAgICAgMHgwMDRhCisjZGVmaW5lIEhDX1NJTUFfSFRYMExiQmFzTCAgICAgIDB4MDA0YgorI2RlZmluZSBIQ19TSU1BX0hUWDBMY0Jhc0wgICAgICAweDAwNGMKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGRCYXNMICAgICAgMHgwMDRkCisjZGVmaW5lIEhDX1NJTUFfSFRYMExlQmFzTCAgICAgIDB4MDA0ZQorI2RlZmluZSBIQ19TSU1BX0hUWDBMZkJhc0wgICAgICAweDAwNGYKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDEwQmFzTCAgICAgMHgwMDUwCisjZGVmaW5lIEhDX1NJTUFfSFRYMEwxMUJhc0wgICAgIDB4MDA1MQorI2RlZmluZSBIQ19TSU1BX0hUWDBMMDEyQmFzSCAgICAweDAwNTIKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDM0NUJhc0ggICAgMHgwMDUzCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw2NzhCYXNIICAgIDB4MDA1NAorI2RlZmluZSBIQ19TSU1BX0hUWDBMOWFiQmFzSCAgICAweDAwNTUKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGNkZUJhc0ggICAgMHgwMDU2CisjZGVmaW5lIEhDX1NJTUFfSFRYMExmMTAxMUJhc0ggIDB4MDA1NworI2RlZmluZSBIQ19TSU1BX0hUWDBMMFBpdCAgICAgICAweDAwNTgKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDFQaXQgICAgICAgMHgwMDU5CisjZGVmaW5lIEhDX1NJTUFfSFRYMEwyUGl0ICAgICAgIDB4MDA1YQorI2RlZmluZSBIQ19TSU1BX0hUWDBMM1BpdCAgICAgICAweDAwNWIKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDRQaXQgICAgICAgMHgwMDVjCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw1UGl0ICAgICAgIDB4MDA1ZAorI2RlZmluZSBIQ19TSU1BX0hUWDBMNlBpdCAgICAgICAweDAwNWUKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDdQaXQgICAgICAgMHgwMDVmCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw4UGl0ICAgICAgIDB4MDA2MAorI2RlZmluZSBIQ19TSU1BX0hUWDBMOVBpdCAgICAgICAweDAwNjEKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGFQaXQgICAgICAgMHgwMDYyCisjZGVmaW5lIEhDX1NJTUFfSFRYMExiUGl0ICAgICAgIDB4MDA2MworI2RlZmluZSBIQ19TSU1BX0hUWDBMY1BpdCAgICAgICAweDAwNjQKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGRQaXQgICAgICAgMHgwMDY1CisjZGVmaW5lIEhDX1NJTUFfSFRYMExlUGl0ICAgICAgIDB4MDA2NgorI2RlZmluZSBIQ19TSU1BX0hUWDBMZlBpdCAgICAgICAweDAwNjcKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDEwUGl0ICAgICAgMHgwMDY4CisjZGVmaW5lIEhDX1NJTUFfSFRYMEwxMVBpdCAgICAgIDB4MDA2OQorI2RlZmluZSBIQ19TSU1BX0hUWDBMMF81V0UgICAgICAweDAwNmEKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDZfYldFICAgICAgMHgwMDZiCisjZGVmaW5lIEhDX1NJTUFfSFRYMExjXzExV0UgICAgIDB4MDA2YworI2RlZmluZSBIQ19TSU1BX0hUWDBMMF81SEUgICAgICAweDAwNmQKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDZfYkhFICAgICAgMHgwMDZlCisjZGVmaW5lIEhDX1NJTUFfSFRYMExjXzExSEUgICAgIDB4MDA2ZgorI2RlZmluZSBIQ19TSU1BX0hUWDBMME9TICAgICAgICAweDAwNzAKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEIgICAgICAgICAgMHgwMDcxCisjZGVmaW5lIEhDX1NJTUFfSFRYME1QTUQgICAgICAgIDB4MDA3MgorI2RlZmluZSBIQ19TSU1BX0hUWDBDTE9EdSAgICAgICAweDAwNzMKKyNkZWZpbmUgSENfU0lNQV9IVFgwRk0gICAgICAgICAgMHgwMDc0CisjZGVmaW5lIEhDX1NJTUFfSFRYMFRSQ0ggICAgICAgIDB4MDA3NQorI2RlZmluZSBIQ19TSU1BX0hUWDBUUkNMICAgICAgICAweDAwNzYKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJDICAgICAgICAgMHgwMDc3CisjZGVmaW5lIEhDX1NJTUFfSFRYMFRSQUggICAgICAgIDB4MDA3OAorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxDc2F0ICAgICAweDAwNzkKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMQ29wICAgICAgMHgwMDdhCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTE1QZm9nICAgIDB4MDA3YgorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxBc2F0ICAgICAweDAwN2MKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMUkNhICAgICAgMHgwMDdkCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTFJDYiAgICAgIDB4MDA3ZQorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxSQ2MgICAgICAweDAwN2YKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMUkNiaWFzICAgMHgwMDgwCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTFJBYSAgICAgIDB4MDA4MQorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxSRm9nICAgICAweDAwODIKKyNkZWZpbmUgSENfU0lNQV9IVFgwQnVtcE0wMCAgICAgMHgwMDgzCisjZGVmaW5lIEhDX1NJTUFfSFRYMEJ1bXBNMDEgICAgIDB4MDA4NAorI2RlZmluZSBIQ19TSU1BX0hUWDBCdW1wTTEwICAgICAweDAwODUKKyNkZWZpbmUgSENfU0lNQV9IVFgwQnVtcE0xMSAgICAgMHgwMDg2CisjZGVmaW5lIEhDX1NJTUFfSFRYMExTY2FsZSAgICAgIDB4MDA4NworLyotLS0tIGVuZCBvZiB0ZXh0dXJlIDAgc2V0dGluZyAtLS0tICAgICAgMHgwMDhmCisgKi8KKyNkZWZpbmUgSENfU0lNQV9UWDBUWDFfT0ZGICAgICAgMHgwMDUwCisvKi0tLS0gc3RhcnQgb2YgdGV4dHVyZSAxIHNldHRpbmcgLS0tLQorICovCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwwQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMMEJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMMUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwyQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMMkJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwzQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMM0Jhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw0QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMNEJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw1QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMNUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw2QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMNkJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw3QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMN0Jhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw4QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMOEJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw5QmFzTCAgICAgIChIQ19TSU1BX0hUWDBMOUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxhQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMYUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxiQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMYkJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxjQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMY0Jhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxkQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMZEJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxlQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMZUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxmQmFzTCAgICAgIChIQ19TSU1BX0hUWDBMZkJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxMEJhc0wgICAgIChIQ19TSU1BX0hUWDBMMTBCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMTFCYXNMICAgICAoSENfU0lNQV9IVFgwTDExQmFzTCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDAxMkJhc0ggICAgKEhDX1NJTUFfSFRYMEwwMTJCYXNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMzQ1QmFzSCAgICAoSENfU0lNQV9IVFgwTDM0NUJhc0ggKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw2NzhCYXNIICAgIChIQ19TSU1BX0hUWDBMNjc4QmFzSCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDlhYkJhc0ggICAgKEhDX1NJTUFfSFRYMEw5YWJCYXNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMY2RlQmFzSCAgICAoSENfU0lNQV9IVFgwTGNkZUJhc0ggKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxmMTAxMUJhc0ggIChIQ19TSU1BX0hUWDBMZjEwMTFCYXNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMFBpdCAgICAgICAoSENfU0lNQV9IVFgwTDBQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMMVBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDJQaXQgICAgICAgKEhDX1NJTUFfSFRYMEwyUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMM1BpdCAgICAgICAoSENfU0lNQV9IVFgwTDNQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw0UGl0ICAgICAgIChIQ19TSU1BX0hUWDBMNFBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDVQaXQgICAgICAgKEhDX1NJTUFfSFRYMEw1UGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNlBpdCAgICAgICAoSENfU0lNQV9IVFgwTDZQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw3UGl0ICAgICAgIChIQ19TSU1BX0hUWDBMN1BpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDhQaXQgICAgICAgKEhDX1NJTUFfSFRYMEw4UGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMOVBpdCAgICAgICAoSENfU0lNQV9IVFgwTDlQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxhUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMYVBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTGJQaXQgICAgICAgKEhDX1NJTUFfSFRYMExiUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMY1BpdCAgICAgICAoSENfU0lNQV9IVFgwTGNQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxkUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMZFBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTGVQaXQgICAgICAgKEhDX1NJTUFfSFRYMExlUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMZlBpdCAgICAgICAoSENfU0lNQV9IVFgwTGZQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxMFBpdCAgICAgIChIQ19TSU1BX0hUWDBMMTBQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwxMVBpdCAgICAgIChIQ19TSU1BX0hUWDBMMTFQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwwXzVXRSAgICAgIChIQ19TSU1BX0hUWDBMMF81V0UgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw2X2JXRSAgICAgIChIQ19TSU1BX0hUWDBMNl9iV0UgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxjXzExV0UgICAgIChIQ19TSU1BX0hUWDBMY18xMVdFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMF81SEUgICAgICAoSENfU0lNQV9IVFgwTDBfNUhFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNl9iSEUgICAgICAoSENfU0lNQV9IVFgwTDZfYkhFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMY18xMUhFICAgICAgKEhDX1NJTUFfSFRYMExjXzExSEUgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwwT1MgICAgICAgIChIQ19TSU1BX0hUWDBMME9TICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQiAgICAgICAgICAoSENfU0lNQV9IVFgwVEIgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMU1QTUQgICAgICAgIChIQ19TSU1BX0hUWDBNUE1EICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFDTE9EdSAgICAgICAoSENfU0lNQV9IVFgwQ0xPRHUgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUZNICAgICAgICAgIChIQ19TSU1BX0hUWDBGTSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVFJDSCAgICAgICAgKEhDX1NJTUFfSFRYMFRSQ0ggKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRSQ0wgICAgICAgIChIQ19TSU1BX0hUWDBUUkNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkMgICAgICAgICAoSENfU0lNQV9IVFgwVEJDICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUUkFIICAgICAgICAoSENfU0lNQV9IVFgwVFJBSCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTFRDICAgICAgICAgKEhDX1NJTUFfSFRYMExUQyArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTFRBICAgICAgICAgKEhDX1NJTUFfSFRYMExUQSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVEJMQ3NhdCAgICAgKEhDX1NJTUFfSFRYMFRCTENzYXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTENvcCAgICAgIChIQ19TSU1BX0hUWDBUQkxDb3AgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTE1QZm9nICAgIChIQ19TSU1BX0hUWDBUQkxNUGZvZyArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVEJMQXNhdCAgICAgKEhDX1NJTUFfSFRYMFRCTEFzYXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJDYSAgICAgIChIQ19TSU1BX0hUWDBUQkxSQ2EgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJDYiAgICAgIChIQ19TSU1BX0hUWDBUQkxSQ2IgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJDYyAgICAgIChIQ19TSU1BX0hUWDBUQkxSQ2MgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJDYmlhcyAgIChIQ19TSU1BX0hUWDBUQkxSQ2JpYXMgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJBYSAgICAgIChIQ19TSU1BX0hUWDBUQkxSQWEgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTFJGb2cgICAgIChIQ19TSU1BX0hUWDBUQkxSRm9nICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFCdW1wTTAwICAgICAoSENfU0lNQV9IVFgwQnVtcE0wMCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxQnVtcE0wMSAgICAgKEhDX1NJTUFfSFRYMEJ1bXBNMDEgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUJ1bXBNMTAgICAgIChIQ19TSU1BX0hUWDBCdW1wTTEwICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFCdW1wTTExICAgICAoSENfU0lNQV9IVFgwQnVtcE0xMSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTFNjYWxlICAgICAgKEhDX1NJTUFfSFRYMExTY2FsZSArIEhDX1NJTUFfVFgwVFgxX09GRikKKy8qLS0tLSBlbmQgb2YgdGV4dHVyZSAxIHNldHRpbmcgLS0tLSAweGFmCisgKi8KKyNkZWZpbmUgSENfU0lNQV9IVFhTTUQgICAgICAgICAgMHgwMGIwCisjZGVmaW5lIEhDX1NJTUFfSGVuRklGT0FUICAgICAgIDB4MDBiMQorI2RlZmluZSBIQ19TSU1BX0hGQkRyYXdGaXJzdCAgICAweDAwYjIKKyNkZWZpbmUgSENfU0lNQV9IRkJCYXNMICAgICAgICAgMHgwMGIzCisjZGVmaW5lIEhDX1NJTUFfSFRBcmJSQ00gICAgICAgIDB4MDBiNAorI2RlZmluZSBIQ19TSU1BX0hUQXJiUlogICAgICAgICAweDAwYjUKKyNkZWZpbmUgSENfU0lNQV9IVEFyYldaICAgICAgICAgMHgwMGI2CisjZGVmaW5lIEhDX1NJTUFfSFRBcmJSVFggICAgICAgIDB4MDBiNworI2RlZmluZSBIQ19TSU1BX0hUQXJiUkNXICAgICAgICAweDAwYjgKKyNkZWZpbmUgSENfU0lNQV9IVEFyYkUyICAgICAgICAgMHgwMGI5CisjZGVmaW5lIEhDX1NJTUFfSEdFTUlUb3V0ICAgICAgIDB4MDBiYQorI2RlZmluZSBIQ19TSU1BX0hGdGhSVFhEICAgICAgICAweDAwYmIKKyNkZWZpbmUgSENfU0lNQV9IRnRoUlRYQSAgICAgICAgMHgwMGJjCisvKiBEZWZpbmUgdGhlIHRleHR1cmUgcGFsZXR0ZSAwCisgKi8KKyNkZWZpbmUgSENfU0lNQV9IVFAwICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEhDX1NJTUFfSFRQMSAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBIQ19TSU1BX0ZPR1RBQkxFICAgICAgICAweDAzMDAKKyNkZWZpbmUgSENfU0lNQV9TVElQUExFICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEhDX1NJTUFfSEUzRmlyZSAgICAgICAgIDB4MDQ0MAorI2RlZmluZSBIQ19TSU1BX1RSQU5TX1NFVCAgICAgICAweDA0NDEKKyNkZWZpbmUgSENfU0lNQV9IUkVuZ1N0ICAgICAgICAgMHgwNDQyCisjZGVmaW5lIEhDX1NJTUFfSFJGSUZPZW1wdHkgICAgIDB4MDQ0MworI2RlZmluZSBIQ19TSU1BX0hSRklGT2Z1bGwgICAgICAweDA0NDQKKyNkZWZpbmUgSENfU0lNQV9IUkVyciAgICAgICAgICAgMHgwNDQ1CisjZGVmaW5lIEhDX1NJTUFfRklGT3N0YXR1cyAgICAgIDB4MDQ0NgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBEZWZpbmUgdGhlIEFHUCBjb21tYW5kIGhlYWRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENfQUNNRF9NQVNLICAgICAgICAgICAgMHhmZTAwMDAwMAorI2RlZmluZSBIQ19BQ01EX1NVQl9NQVNLICAgICAgICAweDBjMDAwMDAwCisjZGVmaW5lIEhDX0FDTURfSENtZEEgICAgICAgICAgIDB4ZWUwMDAwMDAKKyNkZWZpbmUgSENfQUNNRF9IQ21kQiAgICAgICAgICAgMHhlYzAwMDAwMAorI2RlZmluZSBIQ19BQ01EX0hDbWRDICAgICAgICAgICAweGVhMDAwMDAwCisjZGVmaW5lIEhDX0FDTURfSDEgICAgICAgICAgICAgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgSENfQUNNRF9IMiAgICAgICAgICAgICAgMHhmMjAwMDAwMAorI2RlZmluZSBIQ19BQ01EX0gzICAgICAgICAgICAgICAweGY0MDAwMDAwCisjZGVmaW5lIEhDX0FDTURfSDQgICAgICAgICAgICAgIDB4ZjYwMDAwMDAKKworI2RlZmluZSBIQ19BQ01EX0gxSU9fTUFTSyAgICAgICAweDAwMDAwMWZmCisjZGVmaW5lIEhDX0FDTURfSDJJTzFfTUFTSyAgICAgIDB4MDAxZmYwMDAKKyNkZWZpbmUgSENfQUNNRF9IMklPMl9NQVNLICAgICAgMHgwMDAwMDFmZgorI2RlZmluZSBIQ19BQ01EX0gySU8xX1NISUZUICAgICAxMgorI2RlZmluZSBIQ19BQ01EX0gySU8yX1NISUZUICAgICAwCisjZGVmaW5lIEhDX0FDTURfSDNJT19NQVNLICAgICAgIDB4MDAwMDAxZmYKKyNkZWZpbmUgSENfQUNNRF9IM0NPVU5UX01BU0sgICAgMHgwMWZmZjAwMAorI2RlZmluZSBIQ19BQ01EX0gzQ09VTlRfU0hJRlQgICAxMgorI2RlZmluZSBIQ19BQ01EX0g0SURfTUFTSyAgICAgICAweDAwMDAwMWZmCisjZGVmaW5lIEhDX0FDTURfSDRDT1VOVF9NQVNLICAgIDB4MDFmZmZlMDAKKyNkZWZpbmUgSENfQUNNRF9INENPVU5UX1NISUZUICAgOQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIERlZmluZSBIZWFkZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ19IRUFERVIyCQkweEYyMTBGMTEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRGVmaW5lIER1bW15IFZhbHVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENfRFVNTVkJCTB4Q0NDQ0NDQ0MKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRGVmaW5lIGZvciBETUEgdXNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSEFMQ1lPTl9IRUFERVIyICAgICAwWEYyMTBGMTEwCisjZGVmaW5lIEhBTENZT05fRklSRUNNRCAgICAgMFhFRTEwMDAwMAorI2RlZmluZSBIQUxDWU9OX0ZJUkVNQVNLICAgIDBYRkZGMDAwMDAKKyNkZWZpbmUgSEFMQ1lPTl9DTURCICAgICAgICAwWEVDMDAwMDAwCisjZGVmaW5lIEhBTENZT05fQ01EQk1BU0sgICAgMFhGRkZFMDAwMAorI2RlZmluZSBIQUxDWU9OX1NVQl9BRERSMCAgIDBYMDAwMDAwMDAKKyNkZWZpbmUgSEFMQ1lPTl9IRUFERVIxTUFTSyAwWEZGRkZGQzAwCisjZGVmaW5lIEhBTENZT05fSEVBREVSMSAgICAgMFhGMDAwMDAwMAorI2RlZmluZSBIQ19TdWJBX0hBR1BCc3RMICAgICAgICAweDAwNjAKKyNkZWZpbmUgSENfU3ViQV9IQUdQQmVuZEwgICAgICAgMHgwMDYxCisjZGVmaW5lIEhDX1N1YkFfSEFHUENNTlQgICAgICAgIDB4MDA2MgorI2RlZmluZSBIQ19TdWJBX0hBR1BCcEwgICAgICAgICAweDAwNjMKKyNkZWZpbmUgSENfU3ViQV9IQUdQQnBIICAgICAgICAgMHgwMDY0CisjZGVmaW5lIEhDX0hBR1BDTU5UX01BU0sgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSENfSENtZEVyckNscl9NQVNLICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBIQ19IQUdQQmVuZEhfTUFTSyAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hBR1BCc3RIX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEFHUEJlbmRIX1NISUZUICAgICAgOAorI2RlZmluZSBIQ19IQUdQQnN0SF9TSElGVCAgICAgICAwCisjZGVmaW5lIEhDX0hBR1BCcExfTUFTSyAgICAgICAgIDB4MDBmZmZmZmMKKyNkZWZpbmUgSENfSEFHUEJwSURfTUFTSyAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IQUdQQnBJRF9QQVVTRSAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hBR1BCcElEX0pVTVAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSEFHUEJwSURfU1RPUCAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IQUdQQnBIX01BU0sgICAgICAgICAweDAwZmZmZmZmCisKKworI2RlZmluZSBWSUFfVklERU9fSEVBREVSNSAgICAgICAweEZFMDQwMDAwCisjZGVmaW5lIFZJQV9WSURFT19IRUFERVI2ICAgICAgIDB4RkUwNTAwMDAKKyNkZWZpbmUgVklBX1ZJREVPX0hFQURFUjcgICAgICAgMHhGRTA2MDAwMAorI2RlZmluZSBWSUFfVklERU9NQVNLICAgICAgICAgICAweEZGRkYwMDAwCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmODM5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jCkBAIC0wLDAgKzEsNzQxIEBACisvKiB2aWFfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBWSUEgVW5pY2hyb21lL1BybworICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIENvcHlyaWdodCAyMDA0IERpZ2VvLCBJbmMuLCBQYWxvIEFsdG8sIENBLCBVLlMuQS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIENvcHlyaWdodCAyMDA0IFRoZSBVbmljaHJvbWUgcHJvamVjdC4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSAKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogCisgKiAgICBUdW5nc3RlbiBHcmFwaGljcywgCisgKiAgICBFcmRpIENoZW4sIAorICogICAgVGhvbWFzIEhlbGxzdHJvbS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInZpYV9kcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJ2LmgiCisjaW5jbHVkZSAidmlhXzNkX3JlZy5oIgorCisjZGVmaW5lIENNREJVRl9BTElHTk1FTlRfU0laRSAgICgweDEwMCkKKyNkZWZpbmUgQ01EQlVGX0FMSUdOTUVOVF9NQVNLICAgKDB4MGZmKQorCisvKiBkZWZpbmVzIGZvciBWSUEgM0QgcmVnaXN0ZXJzICovCisjZGVmaW5lIFZJQV9SRUdfU1RBVFVTICAgICAgICAgIDB4NDAwCisjZGVmaW5lIFZJQV9SRUdfVFJBTlNFVCAgICAgICAgIDB4NDNDCisjZGVmaW5lIFZJQV9SRUdfVFJBTlNQQUNFICAgICAgIDB4NDQwCisKKy8qIFZJQV9SRUdfU1RBVFVTKDB4NDAwKTogRW5naW5lIFN0YXR1cyAqLworI2RlZmluZSBWSUFfQ01EX1JHVFJfQlVTWSAgICAgICAweDAwMDAwMDgwCS8qIENvbW1hbmQgUmVndWxhdG9yIGlzIGJ1c3kgKi8KKyNkZWZpbmUgVklBXzJEX0VOR19CVVNZICAgICAgICAgMHgwMDAwMDAwMQkvKiAyRCBFbmdpbmUgaXMgYnVzeSAqLworI2RlZmluZSBWSUFfM0RfRU5HX0JVU1kgICAgICAgICAweDAwMDAwMDAyCS8qIDNEIEVuZ2luZSBpcyBidXN5ICovCisjZGVmaW5lIFZJQV9WUl9RVUVVRV9CVVNZICAgICAgIDB4MDAwMjAwMDAJLyogVmlydHVhbCBRdWV1ZSBpcyBidXN5ICovCisKKyNkZWZpbmUgU2V0UmVnMkRBR1AoblJlZywgbkRhdGEpIHsJCQkJXAorCSooKHVpbnQzMl90ICopKHZiKSkgPSAoKG5SZWcpID4+IDIpIHwgSEFMQ1lPTl9IRUFERVIxOwlcCisJKigodWludDMyX3QgKikodmIpICsgMSkgPSAobkRhdGEpOwkJCVwKKwl2YiA9ICgodWludDMyX3QgKil2YikgKyAyOwkJCQlcCisJZGV2X3ByaXYtPmRtYV9sb3cgKz04OwkJCQkJXAorfQorCisjZGVmaW5lIHZpYV9mbHVzaF93cml0ZV9jb21iaW5lKCkgRFJNX01FTU9SWUJBUlJJRVIoKSAKKworI2RlZmluZSBWSUFfT1VUX1JJTkdfUVcodzEsdzIpCQkJXAorCSp2YisrID0gKHcxKTsJCQkJXAorCSp2YisrID0gKHcyKTsJCQkJXAorCWRldl9wcml2LT5kbWFfbG93ICs9IDg7IAorCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3N0YXJ0KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpOworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9wYXVzZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfcmVzZXQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3Jld2luZChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKK3N0YXRpYyBpbnQgdmlhX3dhaXRfaWRsZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKK3N0YXRpYyB2b2lkIHZpYV9wYWRfY2FjaGUoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgcXdvcmRzKTsKKworCisvKgorICogRnJlZSBzcGFjZSBpbiBjb21tYW5kIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgdWludDMyX3QKK3ZpYV9jbWRidWZfc3BhY2UoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQoreworCXVpbnQzMl90IGFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAKKwkJKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkcjsKKwl1aW50MzJfdCBod19hZGRyID0gKihkZXZfcHJpdi0+aHdfYWRkcl9wdHIpIC0gYWdwX2Jhc2U7CisJCisJcmV0dXJuICgoaHdfYWRkciA8PSBkZXZfcHJpdi0+ZG1hX2xvdykgPyAKKwkJKGRldl9wcml2LT5kbWFfaGlnaCArIGh3X2FkZHIgLSBkZXZfcHJpdi0+ZG1hX2xvdykgOiAKKwkJKGh3X2FkZHIgLSBkZXZfcHJpdi0+ZG1hX2xvdykpOworfQorCisvKgorICogSG93IG11Y2ggZG9lcyB0aGUgY29tbWFuZCByZWd1bGF0b3IgbGFnIGJlaGluZD8KKyAqLworCitzdGF0aWMgdWludDMyX3QKK3ZpYV9jbWRidWZfbGFnKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1aW50MzJfdCBhZ3BfYmFzZSA9IGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgCisJCSh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHI7CisJdWludDMyX3QgaHdfYWRkciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKSAtIGFncF9iYXNlOworCQorCXJldHVybiAoKGh3X2FkZHIgPD0gZGV2X3ByaXYtPmRtYV9sb3cpID8gCisJCShkZXZfcHJpdi0+ZG1hX2xvdyAtIGh3X2FkZHIpIDogCisJCShkZXZfcHJpdi0+ZG1hX3dyYXAgKyBkZXZfcHJpdi0+ZG1hX2xvdyAtIGh3X2FkZHIpKTsKK30KKworLyoKKyAqIENoZWNrIHRoYXQgdGhlIGdpdmVuIHNpemUgZml0cyBpbiB0aGUgYnVmZmVyLCBvdGhlcndpc2Ugd2FpdC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludAordmlhX2NtZGJ1Zl93YWl0KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVpbnQzMl90IGFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyOworCXVpbnQzMl90IGN1cl9hZGRyLCBod19hZGRyLCBuZXh0X2FkZHI7CisJdm9sYXRpbGUgdWludDMyX3QgKmh3X2FkZHJfcHRyOworCXVpbnQzMl90IGNvdW50OworCWh3X2FkZHJfcHRyID0gZGV2X3ByaXYtPmh3X2FkZHJfcHRyOworCWN1cl9hZGRyID0gZGV2X3ByaXYtPmRtYV9sb3c7CisJbmV4dF9hZGRyID0gY3VyX2FkZHIgKyBzaXplICsgNTEyKjEwMjQ7CisJY291bnQgPSAxMDAwMDAwOworCWRvIHsKKwkgICAgICAgIGh3X2FkZHIgPSAqaHdfYWRkcl9wdHIgLSBhZ3BfYmFzZTsKKwkJaWYgKGNvdW50LS0gPT0gMCkgeworCQkJRFJNX0VSUk9SKCJ2aWFfY21kYnVmX3dhaXQgdGltZWQgb3V0IGh3ICV4IGN1cl9hZGRyICV4IG5leHRfYWRkciAleFxuIiwKKwkJCQkgIGh3X2FkZHIsIGN1cl9hZGRyLCBuZXh0X2FkZHIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSB3aGlsZSAoKGN1cl9hZGRyIDwgaHdfYWRkcikgJiYgKG5leHRfYWRkciA+PSBod19hZGRyKSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENoZWNrcyB3aGV0aGVyIGJ1ZmZlciBoZWFkIGhhcyByZWFjaCB0aGUgZW5kLiBSZXdpbmQgdGhlIHJpbmcgYnVmZmVyCisgKiB3aGVuIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm5zIHZpcnR1YWwgcG9pbnRlciB0byByaW5nIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90ICp2aWFfY2hlY2tfZG1hKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKChkZXZfcHJpdi0+ZG1hX2xvdyArIHNpemUgKyA0KkNNREJVRl9BTElHTk1FTlRfU0laRSkgPiBkZXZfcHJpdi0+ZG1hX2hpZ2gpIHsKKwkJdmlhX2NtZGJ1Zl9yZXdpbmQoZGV2X3ByaXYpOworCX0KKwlpZiAodmlhX2NtZGJ1Zl93YWl0KGRldl9wcml2LCBzaXplKSAhPSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAodWludDMyX3QgKikgKGRldl9wcml2LT5kbWFfcHRyICsgZGV2X3ByaXYtPmRtYV9sb3cpOworfQorCitpbnQgdmlhX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwkJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQpIHsKKwkJCXZpYV9jbWRidWZfcmVzZXQoZGV2X3ByaXYpOworCisJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSgmZGV2X3ByaXYtPnJpbmcubWFwLCBkZXYpOworCQkJZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9IE5VTEw7CisJCX0KKworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpYV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCSAgZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKKwkJCSAgZHJtX3ZpYV9kbWFfaW5pdF90ICogaW5pdCkKK3sKKwlpZiAoIWRldl9wcml2IHx8ICFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoInZpYV9kbWFfaW5pdCBjYWxsZWQgYmVmb3JlIHZpYV9tYXBfaW5pdFxuIik7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgIT0gTlVMTCkgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCBhZ2FpbiB3aXRob3V0IGNhbGxpbmcgY2xlYW51cFxuIiwKKwkJCSAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+YmFzZSkgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGFncCBtZW1vcnkgYXZhaWxhYmxlXG4iLCAKKwkJCSAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlkZXZfcHJpdi0+cmluZy5tYXAub2Zmc2V0ID0gZGV2LT5hZ3AtPmJhc2UgKyBpbml0LT5vZmZzZXQ7CisJZGV2X3ByaXYtPnJpbmcubWFwLnNpemUgPSBpbml0LT5zaXplOworCWRldl9wcml2LT5yaW5nLm1hcC50eXBlID0gMDsKKwlkZXZfcHJpdi0+cmluZy5tYXAuZmxhZ3MgPSAwOworCWRldl9wcml2LT5yaW5nLm1hcC5tdHJyID0gMDsKKworCWRybV9jb3JlX2lvcmVtYXAoJmRldl9wcml2LT5yaW5nLm1hcCwgZGV2KTsKKworCWlmIChkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlID09IE5VTEwpIHsKKwkJdmlhX2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiY2FuIG5vdCBpb3JlbWFwIHZpcnR1YWwgYWRkcmVzcyBmb3IiCisJCQkgICIgcmluZyBidWZmZXJcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCWRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPSBkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlOworCisJZGV2X3ByaXYtPmRtYV9wdHIgPSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0OworCWRldl9wcml2LT5kbWFfbG93ID0gMDsKKwlkZXZfcHJpdi0+ZG1hX2hpZ2ggPSBpbml0LT5zaXplOworCWRldl9wcml2LT5kbWFfd3JhcCA9IGluaXQtPnNpemU7CisJZGV2X3ByaXYtPmRtYV9vZmZzZXQgPSBpbml0LT5vZmZzZXQ7CisJZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyID0gTlVMTDsKKwlkZXZfcHJpdi0+aHdfYWRkcl9wdHIgPSBkZXZfcHJpdi0+bW1pby0+aGFuZGxlICsgaW5pdC0+cmVnX3BhdXNlX2FkZHI7CisKKwl2aWFfY21kYnVmX3N0YXJ0KGRldl9wcml2KTsKKworCXJldHVybiAwOworfQorCitpbnQgdmlhX2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3ZpYV9kbWFfaW5pdF90IGluaXQ7CisJaW50IHJldGNvZGUgPSAwOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGluaXQsIChkcm1fdmlhX2RtYV9pbml0X3QgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGluaXQpKTsKKworCXN3aXRjaCAoaW5pdC5mdW5jKSB7CisJY2FzZSBWSUFfSU5JVF9ETUE6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldGNvZGUgPSBEUk1fRVJSKEVQRVJNKTsKKwkJZWxzZQorCQkJcmV0Y29kZSA9IHZpYV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKKwkJYnJlYWs7CisJY2FzZSBWSUFfQ0xFQU5VUF9ETUE6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldGNvZGUgPSBEUk1fRVJSKEVQRVJNKTsKKwkJZWxzZQorCQkJcmV0Y29kZSA9IHZpYV9kbWFfY2xlYW51cChkZXYpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBWSUFfRE1BX0lOSVRJQUxJWkVEOgorCQlyZXRjb2RlID0gKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgIT0gTlVMTCkgPyAKKwkJCTA6IERSTV9FUlIoIEVGQVVMVCApOworCSAgICAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0Y29kZSA9IERSTV9FUlIoRUlOVkFMKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldGNvZGU7Cit9CisKKworCitzdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwl1aW50MzJfdCAqdmI7CisJaW50IHJldDsKKworCWRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGhvdXQgaW5pdGlhbGl6aW5nIEFHUCByaW5nIGJ1ZmZlci5cbiIsCisJCQkgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJaWYgKGNtZC0+c2l6ZSA+IFZJQV9QQ0lfQlVGX1NJWkUpIHsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9IAorCisKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGRldl9wcml2LT5wY2lfYnVmLCBjbWQtPmJ1ZiwgY21kLT5zaXplKSkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCS8qCisJICogUnVubmluZyB0aGlzIGZ1bmN0aW9uIG9uIEFHUCBtZW1vcnkgaXMgZGVhZCBzbG93LiBUaGVyZWZvcmUKKwkgKiB3ZSBydW4gaXQgb24gYSB0ZW1wb3JhcnkgY2FjaGVhYmxlIHN5c3RlbSBtZW1vcnkgYnVmZmVyIGFuZAorCSAqIGNvcHkgaXQgdG8gQUdQIG1lbW9yeSB3aGVuIHJlYWR5LgorCSAqLworCisJCQorCWlmICgocmV0ID0gdmlhX3ZlcmlmeV9jb21tYW5kX3N0cmVhbSgodWludDMyX3QgKilkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5zaXplLCBkZXYsIDEpKSkgeworCQlyZXR1cm4gcmV0OworCX0KKyAgICAgICAJCisJCisJdmIgPSB2aWFfY2hlY2tfZG1hKGRldl9wcml2LCAoY21kLT5zaXplIDwgMHgxMDApID8gMHgxMDIgOiBjbWQtPnNpemUpOworCWlmICh2YiA9PSBOVUxMKSB7CisJCXJldHVybiBEUk1fRVJSKEVBR0FJTik7CisJfQorCisJbWVtY3B5KHZiLCBkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5zaXplKTsKKwkKKwlkZXZfcHJpdi0+ZG1hX2xvdyArPSBjbWQtPnNpemU7CisKKwkvKgorCSAqIFNtYWxsIHN1Ym1pc3Npb25zIHNvbWVob3cgc3RhbGxzIHRoZSBDUFUuIChBR1AgY2FjaGUgZWZmZWN0cz8pCisJICogcGFkIHRvIGdyZWF0ZXIgc2l6ZS4KKwkgKi8KKworCWlmIChjbWQtPnNpemUgPCAweDEwMCkKKwkgIHZpYV9wYWRfY2FjaGUoZGV2X3ByaXYsKDB4MTAwIC0gY21kLT5zaXplKSA+PiAzKTsKKwl2aWFfY21kYnVmX3BhdXNlKGRldl9wcml2KTsKKworCXJldHVybiAwOworfQorCitpbnQgdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKCF2aWFfd2FpdF9pZGxlKGRldl9wcml2KSkgeworCQlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgdmlhX2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJcmV0dXJuIHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkZXYpOworfQorCitpbnQgdmlhX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV92aWFfY21kYnVmZmVyX3QgY21kYnVmOworCWludCByZXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGNtZGJ1ZiwgKGRybV92aWFfY21kYnVmZmVyX3QgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGNtZGJ1ZikpOworCisJRFJNX0RFQlVHKCJ2aWEgY21kYnVmZmVyLCBidWYgJXAgc2l6ZSAlbHVcbiIsIGNtZGJ1Zi5idWYsIGNtZGJ1Zi5zaXplKTsKKworCXJldCA9IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoZGV2LCAmY21kYnVmKTsKKwlpZiAocmV0KSB7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgCit2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oZHJtX2RldmljZV90ICpkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9wY2lfY21kYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgICBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKKworCWlmIChjbWQtPnNpemUgPiBWSUFfUENJX0JVRl9TSVpFKSB7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfSAKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGRldl9wcml2LT5wY2lfYnVmLCBjbWQtPmJ1ZiwgY21kLT5zaXplKSkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkKKwlpZiAoKHJldCA9IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oKHVpbnQzMl90ICopZGV2X3ByaXYtPnBjaV9idWYsIGNtZC0+c2l6ZSwgZGV2LCAwKSkpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJcmV0ID0gdmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRldiwgKGNvbnN0IHVpbnQzMl90ICopZGV2X3ByaXYtPnBjaV9idWYsIGNtZC0+c2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHZpYV9wY2lfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3ZpYV9jbWRidWZmZXJfdCBjbWRidWY7CisJaW50IHJldDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoY21kYnVmLCAoZHJtX3ZpYV9jbWRidWZmZXJfdCAqKSBkYXRhLAorCQkJCSBzaXplb2YoY21kYnVmKSk7CisKKwlEUk1fREVCVUcoInZpYV9wY2lfY21kYnVmZmVyLCBidWYgJXAgc2l6ZSAlbHVcbiIsIGNtZGJ1Zi5idWYsCisJCSAgY21kYnVmLnNpemUpOworCisJcmV0ID0gdmlhX2Rpc3BhdGNoX3BjaV9jbWRidWZmZXIoZGV2LCAmY21kYnVmKTsKKwlpZiAocmV0KSB7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB1aW50MzJfdCAqdmlhX2FsaWduX2J1ZmZlcihkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LAorCQkJCQkgdWludDMyX3QgKiB2YiwgaW50IHF3X2NvdW50KQoreworICAgICAgICBmb3IgKDsgcXdfY291bnQgPiAwOyAtLXF3X2NvdW50KSB7CisJCVZJQV9PVVRfUklOR19RVyhIQ19EVU1NWSwgSENfRFVNTVkpOworCX0KKwlyZXR1cm4gdmI7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHJpbmcgYnVmZmVyIG1hbmdlbWVudCBjb2RlLgorICoKKyAqIFJldHVybnMgdmlydHVhbCBwb2ludGVyIHRvIHJpbmcgYnVmZmVyLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90ICp2aWFfZ2V0X2RtYShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXJldHVybiAodWludDMyX3QgKikgKGRldl9wcml2LT5kbWFfcHRyICsgZGV2X3ByaXYtPmRtYV9sb3cpOworfQorCisvKgorICogSG9va3MgYSBzZWdtZW50IG9mIGRhdGEgaW50byB0aGUgdGFpbCBvZiB0aGUgcmluZy1idWZmZXIgYnkKKyAqIG1vZGlmeWluZyB0aGUgcGF1c2UgYWRkcmVzcyBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBpdHNlbGYuIElmCisgKiB0aGUgcmVndWxhdG9yIGhhcyBhbHJlYWR5IHBhdXNlZCwgcmVzdGFydCBpdC4KKyAqLworc3RhdGljIGludCB2aWFfaG9va19zZWdtZW50KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICB1aW50MzJfdCBwYXVzZV9hZGRyX2hpLCB1aW50MzJfdCBwYXVzZV9hZGRyX2xvLAorCQkJICAgIGludCBub19wY2lfZmlyZSkKK3sKKwlpbnQgcGF1c2VkLCBjb3VudDsKKwl2b2xhdGlsZSB1aW50MzJfdCAqcGF1c2VkX2F0ID0gZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyOworCisJdmlhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKTsKKwl3aGlsZSghICoodmlhX2dldF9kbWEoZGV2X3ByaXYpLTEpKTsKKwkqZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyID0gcGF1c2VfYWRkcl9sbzsKKwl2aWFfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCisJLyoKKwkgKiBUaGUgYmVsb3cgc3RhdGVtZW50IGlzIGluc2VydGVkIHRvIHJlYWxseSBmb3JjZSB0aGUgZmx1c2guCisJICogTm90IHN1cmUgaXQgaXMgbmVlZGVkLgorCSAqLworCisJd2hpbGUoISAqZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyKTsKKwlkZXZfcHJpdi0+bGFzdF9wYXVzZV9wdHIgPSB2aWFfZ2V0X2RtYShkZXZfcHJpdikgLSAxOworCXdoaWxlKCEgKmRldl9wcml2LT5sYXN0X3BhdXNlX3B0cik7CisKKworCXBhdXNlZCA9IDA7CisJY291bnQgPSAyMDsgCisKKwl3aGlsZSAoIShwYXVzZWQgPSAoVklBX1JFQUQoMHg0MWMpICYgMHg4MDAwMDAwMCkpICYmIGNvdW50LS0pOworCWlmICgoY291bnQgPD0gOCkgJiYgKGNvdW50ID49IDApKSB7CisJCXVpbnQzMl90IHJndHIsIHB0cjsKKwkJcmd0ciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKTsKKwkJcHRyID0gKChjaGFyICopZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyIC0gZGV2X3ByaXYtPmRtYV9wdHIpICsgCisJCQlkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHIgKyA0IC0gCisJCQlDTURCVUZfQUxJR05NRU5UX1NJWkU7CisJCWlmIChyZ3RyIDw9IHB0cikgeworCQkJRFJNX0VSUk9SKCJDb21tYW5kIHJlZ3VsYXRvclxucGF1c2VkIGF0IGNvdW50ICVkLCBhZGRyZXNzICV4LCAiCisJCQkJICAid2hpbGUgY3VycmVudCBwYXVzZSBhZGRyZXNzIGlzICV4LlxuIgorCQkJCSAgIlBsZWFzZSBtYWlsIHRoaXMgbWVzc2FnZSB0byAiCisJCQkJICAiPHVuaWNocm9tZS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iLAorCQkJCSAgY291bnQsIHJndHIsIHB0cik7CisJCX0KKwl9CisJCQorCWlmIChwYXVzZWQgJiYgIW5vX3BjaV9maXJlKSB7CisJICAgICAgICB1aW50MzJfdCByZ3RyLHB0cjsKKwkJdWludDMyX3QgcHRyX2xvdzsKKworCQljb3VudCA9IDEwMDAwMDA7CisJCXdoaWxlICgoVklBX1JFQUQoVklBX1JFR19TVEFUVVMpICYgVklBX0NNRF9SR1RSX0JVU1kpICYmIGNvdW50LS0pOworCQkKKwkJcmd0ciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKTsKKwkJcHRyID0gKChjaGFyICopcGF1c2VkX2F0IC0gZGV2X3ByaXYtPmRtYV9wdHIpICsgCisJCQlkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHIgKyA0OworCQkKKworCQlwdHJfbG93ID0gKHB0ciA+IDMqQ01EQlVGX0FMSUdOTUVOVF9TSVpFKSA/IAorCQkJcHRyIC0gMypDTURCVUZfQUxJR05NRU5UX1NJWkUgOiAwOworCQlpZiAocmd0ciA8PSBwdHIgJiYgcmd0ciA+PSBwdHJfbG93KSB7CisJCQlWSUFfV1JJVEUoVklBX1JFR19UUkFOU0VULCAoSENfUGFyYVR5cGVfUHJlQ1IgPDwgMTYpKTsKKwkJCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgcGF1c2VfYWRkcl9oaSk7CisJCQlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIHBhdXNlX2FkZHJfbG8pOworCQl9IAorCX0KKwlyZXR1cm4gcGF1c2VkOworfQorCisKKworc3RhdGljIGludCB2aWFfd2FpdF9pZGxlKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpCit7CisJaW50IGNvdW50ID0gMTAwMDAwMDA7CisJd2hpbGUgKGNvdW50LS0gJiYgKFZJQV9SRUFEKFZJQV9SRUdfU1RBVFVTKSAmCisJCQkgICAoVklBX0NNRF9SR1RSX0JVU1kgfCBWSUFfMkRfRU5HX0JVU1kgfAorCQkJICAgIFZJQV8zRF9FTkdfQlVTWSkpKSA7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdWludDMyX3QgKnZpYV9hbGlnbl9jbWQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdWludDMyX3QgY21kX3R5cGUsCisJCQkgICAgICAgdWludDMyX3QgYWRkciwgdWludDMyX3QgKmNtZF9hZGRyX2hpLCAKKwkJCSAgICAgICB1aW50MzJfdCAqY21kX2FkZHJfbG8sCisJCQkgICAgICAgaW50IHNraXBfd2FpdCkKK3sKKwl1aW50MzJfdCBhZ3BfYmFzZTsKKwl1aW50MzJfdCBjbWRfYWRkciwgYWRkcl9sbywgYWRkcl9oaTsKKwl1aW50MzJfdCAqdmI7CisJdWludDMyX3QgcXdfcGFkX2NvdW50OworCisJaWYgKCFza2lwX3dhaXQpCisJCXZpYV9jbWRidWZfd2FpdChkZXZfcHJpdiwgMipDTURCVUZfQUxJR05NRU5UX1NJWkUpOworCisJdmIgPSB2aWFfZ2V0X2RtYShkZXZfcHJpdik7CisJVklBX09VVF9SSU5HX1FXKCBIQ19IRUFERVIyIHwgKChWSUFfUkVHX1RSQU5TRVQgPj4gMikgPDwgMTIpIHwKKwkJCSAoVklBX1JFR19UUkFOU1BBQ0UgPj4gMiksIEhDX1BhcmFUeXBlX1ByZUNSIDw8IDE2KTsgCisJYWdwX2Jhc2UgPSBkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHI7CisJcXdfcGFkX2NvdW50ID0gKENNREJVRl9BTElHTk1FTlRfU0laRSA+PiAzKSAtCisJCSgoZGV2X3ByaXYtPmRtYV9sb3cgJiBDTURCVUZfQUxJR05NRU5UX01BU0spID4+IDMpOworCisJCisJY21kX2FkZHIgPSAoYWRkcikgPyBhZGRyIDogCisJCWFncF9iYXNlICsgZGV2X3ByaXYtPmRtYV9sb3cgLSA4ICsgKHF3X3BhZF9jb3VudCA8PCAzKTsKKwlhZGRyX2xvID0gKChIQ19TdWJBX0hBR1BCcEwgPDwgMjQpIHwgKGNtZF90eXBlICYgSENfSEFHUEJwSURfTUFTSykgfAorCQkgICAoY21kX2FkZHIgJiBIQ19IQUdQQnBMX01BU0spKTsKKwlhZGRyX2hpID0gKChIQ19TdWJBX0hBR1BCcEggPDwgMjQpIHwgKGNtZF9hZGRyID4+IDI0KSk7CisKKwl2YiA9IHZpYV9hbGlnbl9idWZmZXIoZGV2X3ByaXYsIHZiLCBxd19wYWRfY291bnQgLSAxKTsKKwlWSUFfT1VUX1JJTkdfUVcoKmNtZF9hZGRyX2hpID0gYWRkcl9oaSwgCisJCQkqY21kX2FkZHJfbG8gPSBhZGRyX2xvKTsKKwlyZXR1cm4gdmI7Cit9CisKKworCisKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfc3RhcnQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwl1aW50MzJfdCBwYXVzZV9hZGRyX2xvLCBwYXVzZV9hZGRyX2hpOworCXVpbnQzMl90IHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHJfbG87CisJdWludDMyX3QgZW5kX2FkZHIsIGVuZF9hZGRyX2xvOworCXVpbnQzMl90IGNvbW1hbmQ7CisJdWludDMyX3QgYWdwX2Jhc2U7CisKKworCWRldl9wcml2LT5kbWFfbG93ID0gMDsKKworCWFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyOworCXN0YXJ0X2FkZHIgPSBhZ3BfYmFzZTsKKwllbmRfYWRkciA9IGFncF9iYXNlICsgZGV2X3ByaXYtPmRtYV9oaWdoOworCisJc3RhcnRfYWRkcl9sbyA9ICgoSENfU3ViQV9IQUdQQnN0TCA8PCAyNCkgfCAoc3RhcnRfYWRkciAmIDB4RkZGRkZGKSk7CisJZW5kX2FkZHJfbG8gPSAoKEhDX1N1YkFfSEFHUEJlbmRMIDw8IDI0KSB8IChlbmRfYWRkciAmIDB4RkZGRkZGKSk7CisJY29tbWFuZCA9ICgoSENfU3ViQV9IQUdQQ01OVCA8PCAyNCkgfCAoc3RhcnRfYWRkciA+PiAyNCkgfAorCQkgICAoKGVuZF9hZGRyICYgMHhmZjAwMDAwMCkgPj4gMTYpKTsKKworCWRldl9wcml2LT5sYXN0X3BhdXNlX3B0ciA9IAorCQl2aWFfYWxpZ25fY21kKGRldl9wcml2LCBIQ19IQUdQQnBJRF9QQVVTRSwgMCwgCisJCQkgICAgICAmcGF1c2VfYWRkcl9oaSwgJiBwYXVzZV9hZGRyX2xvLCAxKSAtIDE7CisKKwl2aWFfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCXdoaWxlKCEgKmRldl9wcml2LT5sYXN0X3BhdXNlX3B0cik7CisKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU0VULCAoSENfUGFyYVR5cGVfUHJlQ1IgPDwgMTYpKTsKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIGNvbW1hbmQpOworCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgc3RhcnRfYWRkcl9sbyk7CisJVklBX1dSSVRFKFZJQV9SRUdfVFJBTlNQQUNFLCBlbmRfYWRkcl9sbyk7CisKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIHBhdXNlX2FkZHJfaGkpOworCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgcGF1c2VfYWRkcl9sbyk7CisKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIGNvbW1hbmQgfCBIQ19IQUdQQ01OVF9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgdmlhX3BhZF9jYWNoZShkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBxd29yZHMpCit7CisJdWludDMyX3QgKnZiOworCisJdmlhX2NtZGJ1Zl93YWl0KGRldl9wcml2LCBxd29yZHMgKyAyKTsKKwl2YiA9IHZpYV9nZXRfZG1hKGRldl9wcml2KTsKKwlWSUFfT1VUX1JJTkdfUVcoIEhDX0hFQURFUjIsIEhDX1BhcmFUeXBlX05vdFRleCA8PCAxNik7CisJdmlhX2FsaWduX2J1ZmZlcihkZXZfcHJpdix2Yixxd29yZHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmlhX2R1bW15X2JpdGJsdChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXVpbnQzMl90ICp2YiA9IHZpYV9nZXRfZG1hKGRldl9wcml2KTsKKwlTZXRSZWcyREFHUCgweDBDLCAoMCB8ICgwIDw8IDE2KSkpOworCVNldFJlZzJEQUdQKDB4MTAsIDAgfCAoMCA8PCAxNikpOworCVNldFJlZzJEQUdQKDB4MCwgMHgxIHwgMHgyMDAwIHwgMHhBQTAwMDAwMCk7IAorfQorCisKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfanVtcChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXVpbnQzMl90IGFncF9iYXNlOworCXVpbnQzMl90IHBhdXNlX2FkZHJfbG8sIHBhdXNlX2FkZHJfaGk7CisJdWludDMyX3QganVtcF9hZGRyX2xvLCBqdW1wX2FkZHJfaGk7CisJdm9sYXRpbGUgdWludDMyX3QgKmxhc3RfcGF1c2VfcHRyOworCXVpbnQzMl90IGRtYV9sb3dfc2F2ZTEsIGRtYV9sb3dfc2F2ZTI7CisKKwlhZ3BfYmFzZSA9IGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkcjsKKwl2aWFfYWxpZ25fY21kKGRldl9wcml2LCAgSENfSEFHUEJwSURfSlVNUCwgMCwgJmp1bXBfYWRkcl9oaSwgCisJCSAgICAgICZqdW1wX2FkZHJfbG8sIDApOworCQorCWRldl9wcml2LT5kbWFfd3JhcCA9IGRldl9wcml2LT5kbWFfbG93OworCisKKwkvKgorCSAqIFdyYXAgY29tbWFuZCBidWZmZXIgdG8gdGhlIGJlZ2lubmluZy4KKwkgKi8KKworCWRldl9wcml2LT5kbWFfbG93ID0gMDsKKwlpZiAodmlhX2NtZGJ1Zl93YWl0KGRldl9wcml2LCBDTURCVUZfQUxJR05NRU5UX1NJWkUpICE9IDApIHsKKwkJRFJNX0VSUk9SKCJ2aWFfY21kYnVmX2p1bXAgZmFpbGVkXG4iKTsKKwl9CisKKwl2aWFfZHVtbXlfYml0Ymx0KGRldl9wcml2KTsKKwl2aWFfZHVtbXlfYml0Ymx0KGRldl9wcml2KTsgCisKKwlsYXN0X3BhdXNlX3B0ciA9IHZpYV9hbGlnbl9jbWQoZGV2X3ByaXYsICBIQ19IQUdQQnBJRF9QQVVTRSwgMCwgJnBhdXNlX2FkZHJfaGksIAorCQkJCSAgICAgICAmcGF1c2VfYWRkcl9sbywgMCkgLTE7CisJdmlhX2FsaWduX2NtZChkZXZfcHJpdiwgIEhDX0hBR1BCcElEX1BBVVNFLCAwLCAmcGF1c2VfYWRkcl9oaSwgCisJCSAgICAgICZwYXVzZV9hZGRyX2xvLCAwKTsKKworCSpsYXN0X3BhdXNlX3B0ciA9IHBhdXNlX2FkZHJfbG87CisJZG1hX2xvd19zYXZlMSA9IGRldl9wcml2LT5kbWFfbG93OworCisJLyoKKwkgKiBOb3csIHNldCBhIHRyYXAgdGhhdCB3aWxsIHBhdXNlIHRoZSByZWd1bGF0b3IgaWYgaXQgdHJpZXMgdG8gcmVydW4gdGhlIG9sZAorCSAqIGNvbW1hbmQgYnVmZmVyLiAoV2hpY2ggbWF5IGhhcHBlbiBpZiB2aWFfaG9va19zZWdtZW50IGRldGVjcyBhIGNvbW1hbmQgcmVndWxhdG9yIHBhdXNlCisJICogYW5kIHJlaXNzdWVzIHRoZSBqdW1wIGNvbW1hbmQgb3ZlciBQQ0ksIHdoaWxlIHRoZSByZWd1bGF0b3IgaGFzIGFscmVhZHkgdGFrZW4gdGhlIGp1bXAKKwkgKiBhbmQgYWN0dWFsbHkgcGF1c2VkIGF0IHRoZSBjdXJyZW50IGJ1ZmZlciBlbmQpLgorCSAqIFRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gb3RoZXIgd2F5IHRvIGRldGVjdCB0aGlzIGNvbmRpdGlvbiwgc2luY2UgdGhlIGh3X2FkZHJfcG9pbnRlcgorCSAqIGRvZXMgbm90IHNlZW0gdG8gZ2V0IHVwZGF0ZWQgaW1tZWRpYXRlbHkgd2hlbiBhIGp1bXAgb2NjdXJzLgorCSAqLworCisJbGFzdF9wYXVzZV9wdHIgPSB2aWFfYWxpZ25fY21kKGRldl9wcml2LCAgSENfSEFHUEJwSURfUEFVU0UsIDAsICZwYXVzZV9hZGRyX2hpLCAKKwkJCQkgICAgICAgJnBhdXNlX2FkZHJfbG8sIDApIC0xOworCXZpYV9hbGlnbl9jbWQoZGV2X3ByaXYsICBIQ19IQUdQQnBJRF9QQVVTRSwgMCwgJnBhdXNlX2FkZHJfaGksIAorCQkgICAgICAmcGF1c2VfYWRkcl9sbywgMCk7CisJKmxhc3RfcGF1c2VfcHRyID0gcGF1c2VfYWRkcl9sbzsKKworCWRtYV9sb3dfc2F2ZTIgPSBkZXZfcHJpdi0+ZG1hX2xvdzsKKwlkZXZfcHJpdi0+ZG1hX2xvdyA9IGRtYV9sb3dfc2F2ZTE7CQorCXZpYV9ob29rX3NlZ21lbnQoIGRldl9wcml2LCBqdW1wX2FkZHJfaGksIGp1bXBfYWRkcl9sbywgMCk7CisJZGV2X3ByaXYtPmRtYV9sb3cgPSBkbWFfbG93X3NhdmUyOworCXZpYV9ob29rX3NlZ21lbnQoIGRldl9wcml2LCBwYXVzZV9hZGRyX2hpLCBwYXVzZV9hZGRyX2xvLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3Jld2luZChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXZpYV9jbWRidWZfanVtcChkZXZfcHJpdik7IAorfQorCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX2ZsdXNoKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVpbnQzMl90IGNtZF90eXBlKQoreworCXVpbnQzMl90IHBhdXNlX2FkZHJfbG8sIHBhdXNlX2FkZHJfaGk7CisKKwl2aWFfYWxpZ25fY21kKGRldl9wcml2LCBjbWRfdHlwZSwgMCwgJnBhdXNlX2FkZHJfaGksICZwYXVzZV9hZGRyX2xvLCAwKTsKKwl2aWFfaG9va19zZWdtZW50KCBkZXZfcHJpdiwgcGF1c2VfYWRkcl9oaSwgcGF1c2VfYWRkcl9sbywgMCk7Cit9CisKKworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9wYXVzZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXZpYV9jbWRidWZfZmx1c2goZGV2X3ByaXYsIEhDX0hBR1BCcElEX1BBVVNFKTsKK30KKworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9yZXNldChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXZpYV9jbWRidWZfZmx1c2goZGV2X3ByaXYsIEhDX0hBR1BCcElEX1NUT1ApOworCXZpYV93YWl0X2lkbGUoZGV2X3ByaXYpOworfQorCisvKgorICogVXNlciBpbnRlcmZhY2UgdG8gdGhlIHNwYWNlIGFuZCBsYWcgZnVuY3Rpb25zLgorICovCisKK2ludCAKK3ZpYV9jbWRidWZfc2l6ZShEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV92aWFfY21kYnVmX3NpemVfdCBkX3NpejsKKwlpbnQgcmV0ID0gMDsKKwl1aW50MzJfdCB0bXBfc2l6ZSwgY291bnQ7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2OworCisJRFJNX0RFQlVHKCJ2aWEgY21kYnVmX3NpemVcbiIpOworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRob3V0IGluaXRpYWxpemluZyBBR1AgcmluZyBidWZmZXIuXG4iLAorCQkJICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChkX3NpeiwgKGRybV92aWFfY21kYnVmX3NpemVfdCAqKSBkYXRhLAorCQkJCSBzaXplb2YoZF9zaXopKTsKKworCisJY291bnQgPSAxMDAwMDAwOworCXRtcF9zaXplID0gZF9zaXouc2l6ZTsKKwlzd2l0Y2goZF9zaXouZnVuYykgeworCWNhc2UgVklBX0NNREJVRl9TUEFDRToKKwkJd2hpbGUgKCgodG1wX3NpemUgPSB2aWFfY21kYnVmX3NwYWNlKGRldl9wcml2KSkgPCBkX3Npei5zaXplKSAmJiBjb3VudC0tKSB7CisJCQlpZiAoIWRfc2l6LndhaXQpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWNvdW50KSB7CisJCQlEUk1fRVJST1IoIlZJQV9DTURCVUZfU1BBQ0UgdGltZWQgb3V0LlxuIik7CisJCQlyZXQgPSBEUk1fRVJSKEVBR0FJTik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWSUFfQ01EQlVGX0xBRzoKKwkJd2hpbGUgKCgodG1wX3NpemUgPSB2aWFfY21kYnVmX2xhZyhkZXZfcHJpdikpID4gZF9zaXouc2l6ZSkgJiYgY291bnQtLSkgeworCQkJaWYgKCFkX3Npei53YWl0KSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFjb3VudCkgeworCQkJRFJNX0VSUk9SKCJWSUFfQ01EQlVGX0xBRyB0aW1lZCBvdXQuXG4iKTsKKwkJCXJldCA9IERSTV9FUlIoRUFHQUlOKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBEUk1fRVJSKEVGQVVMVCk7CisJfQorCWRfc2l6LnNpemUgPSB0bXBfc2l6ZTsKKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV92aWFfY21kYnVmX3NpemVfdCAqKSBkYXRhLCBkX3NpeiwKKwkJCSAgICAgICBzaXplb2YoZF9zaXopKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTg4YzliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDMgUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9WSUFfRFJNX0hfCisjZGVmaW5lIF9WSUFfRFJNX0hfCisKKy8qIFdBUk5JTkc6IFRoZXNlIGRlZmluZXMgbXVzdCBiZSB0aGUgc2FtZSBhcyB3aGF0IHRoZSBYc2VydmVyIHVzZXMuCisgKiBpZiB5b3UgY2hhbmdlIHRoZW0sIHlvdSBtdXN0IGNoYW5nZSB0aGUgZGVmaW5lcyBpbiB0aGUgWHNlcnZlci4KKyAqLworCisjaWZuZGVmIF9WSUFfREVGSU5FU18KKyNkZWZpbmUgX1ZJQV9ERUZJTkVTXworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlICJ2aWFfZHJtY2xpZW50LmgiCisjZW5kaWYKKworI2RlZmluZSBWSUFfTlJfU0FSRUFfQ0xJUFJFQ1RTIAkJOAorI2RlZmluZSBWSUFfTlJfWFZNQ19QT1JUUyAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFZJQV9OUl9YVk1DX0xPQ0tTICAgICAgICAgICAgICAgNQorI2RlZmluZSBWSUFfTUFYX0NBQ0hFTElORV9TSVpFICAgICAgICAgIDY0CisjZGVmaW5lIFhWTUNMT0NLUFRSKHNhUHJpdixsb2NrTm8pCQkJCQlcCisJKCh2b2xhdGlsZSBkcm1faHdfbG9ja190ICopKCgoKCh1bnNpZ25lZCBsb25nKSAoc2FQcml2KS0+WHZNQ0xvY2tBcmVhKSArIFwKKwkJCQkgICAgICAoVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSAmCVwKKwkJCQkgICAgIH4oVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSArCVwKKwkJCQkgICAgVklBX01BWF9DQUNIRUxJTkVfU0laRSoobG9ja05vKSkpCisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtLgorICovCisjZGVmaW5lIFZJQV9OUl9URVhfUkVHSU9OUyA2NAorI2RlZmluZSBWSUFfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKyNlbmRpZgorCisjZGVmaW5lIFZJQV9VUExPQURfVEVYMElNQUdFICAweDEJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIFZJQV9VUExPQURfVEVYMUlNQUdFICAweDIJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIFZJQV9VUExPQURfQ1RYICAgICAgICAweDQKKyNkZWZpbmUgVklBX1VQTE9BRF9CVUZGRVJTICAgIDB4OAorI2RlZmluZSBWSUFfVVBMT0FEX1RFWDAgICAgICAgMHgxMAorI2RlZmluZSBWSUFfVVBMT0FEX1RFWDEgICAgICAgMHgyMAorI2RlZmluZSBWSUFfVVBMT0FEX0NMSVBSRUNUUyAgMHg0MAorI2RlZmluZSBWSUFfVVBMT0FEX0FMTCAgICAgICAgMHhmZgorCisvKiBWSUEgc3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIERSTV9WSUFfQUxMT0NNRU0JMHgwMAorI2RlZmluZSBEUk1fVklBX0ZSRUVNRU0JICAgICAgICAweDAxCisjZGVmaW5lIERSTV9WSUFfQUdQX0lOSVQJMHgwMgorI2RlZmluZSBEUk1fVklBX0ZCX0lOSVQJICAgICAgICAweDAzCisjZGVmaW5lIERSTV9WSUFfTUFQX0lOSVQJMHgwNAorI2RlZmluZSBEUk1fVklBX0RFQ19GVVRFWCAgICAgICAweDA1CisjZGVmaW5lIE5PVF9VU0VECisjZGVmaW5lIERSTV9WSUFfRE1BX0lOSVQJMHgwNworI2RlZmluZSBEUk1fVklBX0NNREJVRkZFUgkweDA4CisjZGVmaW5lIERSTV9WSUFfRkxVU0gJICAgICAgICAweDA5CisjZGVmaW5lIERSTV9WSUFfUENJQ01ECSAgICAgICAgMHgwYQorI2RlZmluZSBEUk1fVklBX0NNREJVRl9TSVpFCTB4MGIKKyNkZWZpbmUgTk9UX1VTRUQKKyNkZWZpbmUgRFJNX1ZJQV9XQUlUX0lSUSAgICAgICAgMHgwZAorCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQUxMT0NNRU0JICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9BTExPQ01FTSwgZHJtX3ZpYV9tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9GUkVFTUVNCSAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRlJFRU1FTSwgZHJtX3ZpYV9tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9BR1BfSU5JVAkgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0FHUF9JTklULCBkcm1fdmlhX2FncF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0ZCX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9GQl9JTklULCBkcm1fdmlhX2ZiX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfTUFQX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9NQVBfSU5JVCwgZHJtX3ZpYV9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfREVDX0ZVVEVYICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfREVDX0ZVVEVYLCBkcm1fdmlhX2Z1dGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRE1BX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9ETUFfSU5JVCwgZHJtX3ZpYV9kbWFfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0NNREJVRkZFUgkgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0NNREJVRkZFUiwgZHJtX3ZpYV9jbWRidWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9GTFVTSAkgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0ZMVVNIKQorI2RlZmluZSBEUk1fSU9DVExfVklBX1BDSUNNRAkgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX1BDSUNNRCwgZHJtX3ZpYV9jbWRidWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9DTURCVUZfU0laRSBEUk1fSU9XUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQ01EQlVGX1NJWkUsIFwKKwkJCQkJICAgIGRybV92aWFfY21kYnVmX3NpemVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9XQUlUX0lSUSAgICBEUk1fSU9XUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfV0FJVF9JUlEsIGRybV92aWFfaXJxd2FpdF90KQorCisvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCisgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKKyAqIG9yIGluIGEgcGllY2V3aXNlIGZhc2hpb24gYXMgcmVxdWlyZWQuCisgKi8KKworI2RlZmluZSBWSUFfVEVYX1NFVFVQX1NJWkUgOAorCisvKiBGbGFncyBmb3IgY2xlYXIgaW9jdGwKKyAqLworI2RlZmluZSBWSUFfRlJPTlQgICAweDEKKyNkZWZpbmUgVklBX0JBQ0sgICAgMHgyCisjZGVmaW5lIFZJQV9ERVBUSCAgIDB4NAorI2RlZmluZSBWSUFfU1RFTkNJTCAweDgKKyNkZWZpbmUgVklERU8gMAorI2RlZmluZSBBR1AgMQordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBzaXplOworfSBkcm1fdmlhX2FncF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IHNpemU7Cit9IGRybV92aWFfZmJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGNvbnRleHQ7CisJdWludDMyX3QgdHlwZTsKKwl1aW50MzJfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit9IGRybV92aWFfbWVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2luaXQgeworCWVudW0geworCQlWSUFfSU5JVF9NQVAgPSAweDAxLAorCQlWSUFfQ0xFQU5VUF9NQVAgPSAweDAyCisJfSBmdW5jOworCisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYWdwQWRkcjsKK30gZHJtX3ZpYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2Z1dGV4IHsKKwllbnVtIHsKKwkJVklBX0ZVVEVYX1dBSVQgPSAweDAwLAorCQlWSUFfRlVURVhfV0FLRSA9IDBYMDEKKwl9IGZ1bmM7CisJdWludDMyX3QgbXM7CisJdWludDMyX3QgbG9jazsKKwl1aW50MzJfdCB2YWw7Cit9IGRybV92aWFfZnV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfZG1hX2luaXQgeworCWVudW0geworCQlWSUFfSU5JVF9ETUEgPSAweDAxLAorCQlWSUFfQ0xFQU5VUF9ETUEgPSAweDAyLAorICAgICAgICAgICAgICAgIFZJQV9ETUFfSU5JVElBTElaRUQgPSAweDAzCisJfSBmdW5jOworCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgcmVnX3BhdXNlX2FkZHI7Cit9IGRybV92aWFfZG1hX2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfY21kYnVmZmVyIHsKKwljaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworfSBkcm1fdmlhX2NtZGJ1ZmZlcl90OworCisvKiBXYXJuaW5nOiBJZiB5b3UgY2hhbmdlIHRoZSBTQVJFQSBzdHJ1Y3R1cmUgeW91IG11c3QgY2hhbmdlIHRoZSBYc2VydmVyCisgKiBzdHJ1Y3R1cmUgYXMgd2VsbCAqLworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV90ZXhfcmVnaW9uIHsKKwl1bnNpZ25lZCBjaGFyIG5leHQsIHByZXY7CS8qIGluZGljZXMgdG8gZm9ybSBhIGNpcmN1bGFyIExSVSAgKi8KKwl1bnNpZ25lZCBjaGFyIGluVXNlOwkvKiBvd25lZCBieSBhIGNsaWVudCwgb3IgZnJlZT8gKi8KKwlpbnQgYWdlOwkJLyogdHJhY2tlZCBieSBjbGllbnRzIHRvIHVwZGF0ZSBsb2NhbCBMUlUncyAqLworfSBkcm1fdmlhX3RleF9yZWdpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfc2FyZWEgeworCXVuc2lnbmVkIGludCBkaXJ0eTsKKwl1bnNpZ25lZCBpbnQgbmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbVklBX05SX1NBUkVBX0NMSVBSRUNUU107CisJZHJtX3ZpYV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtWSUFfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlpbnQgdGV4QWdlOwkJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCisJaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLworCWludCB2ZXJ0ZXhQcmltOworCisJLyoKKwkgKiBCZWxvdyBpcyBmb3IgWHZNQy4KKwkgKiBXZSB3YW50IHRoZSBsb2NrIGludGVnZXJzIGFsb25lIG9uLCBhbmQgYWxpZ25lZCB0bywgYSBjYWNoZSBsaW5lLgorCSAqIFRoZXJlZm9yZSB0aGlzIHNvbWV3aGF0IHN0cmFuZ2UgY29uc3RydWN0LgorCSAqLworCisJY2hhciBYdk1DTG9ja0FyZWFbVklBX01BWF9DQUNIRUxJTkVfU0laRSAqIChWSUFfTlJfWFZNQ19MT0NLUyArIDEpXTsKKworCXVuc2lnbmVkIGludCBYdk1DRGlzcGxheWluZ1tWSUFfTlJfWFZNQ19QT1JUU107CisJdW5zaWduZWQgaW50IFh2TUNTdWJQaWNPbltWSUFfTlJfWFZNQ19QT1JUU107CisJdW5zaWduZWQgaW50IFh2TUNDdHhOb0dyYWJiZWQ7CS8qIExhc3QgY29udGV4dCB0byBob2xkIGRlY29kZXIgKi8KKworfSBkcm1fdmlhX3NhcmVhX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2NtZGJ1Zl9zaXplIHsKKwllbnVtIHsKKwkJVklBX0NNREJVRl9TUEFDRSA9IDB4MDEsCisJCVZJQV9DTURCVUZfTEFHID0gMHgwMgorCX0gZnVuYzsKKwlpbnQgd2FpdDsKKwl1aW50MzJfdCBzaXplOworfSBkcm1fdmlhX2NtZGJ1Zl9zaXplX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJVklBX0lSUV9BQlNPTFVURSA9IDB4MCwKKwlWSUFfSVJRX1JFTEFUSVZFID0gMHgxLAorCVZJQV9JUlFfU0lHTkFMID0gMHgxMDAwMDAwMCwKKwlWSUFfSVJRX0ZPUkNFX1NFUVVFTkNFID0gMHgyMDAwMDAwMAorfSB2aWFfaXJxX3NlcV90eXBlX3Q7CisKKyNkZWZpbmUgVklBX0lSUV9GTEFHU19NQVNLIDB4RjAwMDAwMDAKKworc3RydWN0IGRybV92aWFfd2FpdF9pcnFfcmVxdWVzdHsKKwl1bnNpZ25lZCBpcnE7CisJdmlhX2lycV9zZXFfdHlwZV90IHR5cGU7CisJdWludDMyX3Qgc2VxdWVuY2U7CisJdWludDMyX3Qgc2lnbmFsOworfTsKKwordHlwZWRlZiB1bmlvbiBkcm1fdmlhX2lycXdhaXQgeworCXN0cnVjdCBkcm1fdmlhX3dhaXRfaXJxX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OworfSBkcm1fdmlhX2lycXdhaXRfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKworaW50IHZpYV9mYl9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfbWVtX2FsbG9jKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfbWVtX2ZyZWUoRFJNX0lPQ1RMX0FSR1MpOworaW50IHZpYV9hZ3BfaW5pdChEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX21hcF9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfZGVjb2Rlcl9mdXRleChEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfZmx1c2hfaW9jdGwoRFJNX0lPQ1RMX0FSR1MpOworaW50IHZpYV9wY2lfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfY21kYnVmX3NpemUoRFJNX0lPQ1RMX0FSR1MpOworaW50IHZpYV93YWl0X2lycShEUk1fSU9DVExfQVJHUyk7CisKKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9WSUFfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWVlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitzdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJIERSSVZFUl9OQU1FLAorCQkgRFJJVkVSX01BSk9SLAorCQkgRFJJVkVSX01JTk9SLAorCQkgRFJJVkVSX1BBVENITEVWRUwsCisJCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQorCSAgICApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7CisJRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOworCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXZpYWRydl9QQ0lfSURTCit9OworCitzdGF0aWMgZHJtX2lvY3RsX2Rlc2NfdCBpb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQUxMT0NNRU0pXSA9IHt2aWFfbWVtX2FsbG9jLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRlJFRU1FTSldID0ge3ZpYV9tZW1fZnJlZSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0FHUF9JTklUKV0gPSB7dmlhX2FncF9pbml0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRkJfSU5JVCldID0ge3ZpYV9mYl9pbml0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfTUFQX0lOSVQpXSA9IHt2aWFfbWFwX2luaXQsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9ERUNfRlVURVgpXSA9IHt2aWFfZGVjb2Rlcl9mdXRleCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0RNQV9JTklUKV0gPSB7dmlhX2RtYV9pbml0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQ01EQlVGRkVSKV0gPSB7dmlhX2NtZGJ1ZmZlciwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZMVVNIKV0gPSB7dmlhX2ZsdXNoX2lvY3RsLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfUENJQ01EKV0gPSB7dmlhX3BjaV9jbWRidWZmZXIsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9DTURCVUZfU0laRSldID0ge3ZpYV9jbWRidWZfc2l6ZSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX1dBSVRfSVJRKV0gPSB7dmlhX3dhaXRfaXJxLCAxLCAwfQorfTsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0KKwkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfSEFWRV9JUlEgfAorCSAgICBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5jb250ZXh0X2N0b3IgPSB2aWFfaW5pdF9jb250ZXh0LAorCS5jb250ZXh0X2R0b3IgPSB2aWFfZmluYWxfY29udGV4dCwKKwkudmJsYW5rX3dhaXQgPSB2aWFfZHJpdmVyX3ZibGFua193YWl0LAorCS5pcnFfcHJlaW5zdGFsbCA9IHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCisJLmlycV9wb3N0aW5zdGFsbCA9IHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAorCS5pcnFfdW5pbnN0YWxsID0gdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsLAorCS5pcnFfaGFuZGxlciA9IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIsCisJLmRtYV9xdWllc2NlbnQgPSB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQsCisJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmlvY3RscyA9IGlvY3RscywKKwkubnVtX2lvY3RscyA9IERSTV9BUlJBWV9TSVpFKGlvY3RscyksCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCQl9LAorCS5wY2lfZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorCQkuaWRfdGFibGUgPSBwY2lpZGxpc3QsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgdmlhX2luaXQodm9pZCkKK3sKKwl2aWFfaW5pdF9jb21tYW5kX3ZlcmlmaWVyKCk7CisJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlhX2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodmlhX2luaXQpOworbW9kdWxlX2V4aXQodmlhX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWE4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX1ZJQV9EUlZfSF8KKyNkZWZpbmUgX1ZJQV9EUlZfSF8KKworI2RlZmluZSBEUklWRVJfQVVUSE9SCSJWSUEiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJ2aWEiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiVklBIFVuaWNocm9tZSAvIFBybyIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA1MDUyMyIKKworI2RlZmluZSBEUklWRVJfTUFKT1IJCTIKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQk2CisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTMKKworI2luY2x1ZGUgInZpYV92ZXJpZmllci5oIgorCisjZGVmaW5lIFZJQV9QQ0lfQlVGX1NJWkUgNjAwMDAKKyNkZWZpbmUgVklBX0ZJUkVfQlVGX1NJWkUgIDEwMjQKKyNkZWZpbmUgVklBX05VTV9JUlFTIDIKKworCisKK3R5cGVkZWYgc3RydWN0IGRybV92aWFfcmluZ19idWZmZXIgeworCWRybV9tYXBfdCBtYXA7CisJY2hhciAqdmlydHVhbF9zdGFydDsKK30gZHJtX3ZpYV9yaW5nX2J1ZmZlcl90OworCit0eXBlZGVmIHVpbnQzMl90IG1hc2thcnJheV90WzVdOworCit0eXBlZGVmIHN0cnVjdCBkcm1fdmlhX2lycSB7CisJYXRvbWljX3QgaXJxX3JlY2VpdmVkOworCXVpbnQzMl90IHBlbmRpbmdfbWFzazsKKwl1aW50MzJfdCBlbmFibGVfbWFzazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfcXVldWU7Cit9IGRybV92aWFfaXJxX3Q7CisJCit0eXBlZGVmIHN0cnVjdCBkcm1fdmlhX3ByaXZhdGUgeworCWRybV92aWFfc2FyZWFfdCAqc2FyZWFfcHJpdjsKKwlkcm1fbWFwX3QgKnNhcmVhOworCWRybV9tYXBfdCAqZmI7CisJZHJtX21hcF90ICptbWlvOworCXVuc2lnbmVkIGxvbmcgYWdwQWRkcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBkZWNvZGVyX3F1ZXVlW1ZJQV9OUl9YVk1DX0xPQ0tTXTsKKwljaGFyICpkbWFfcHRyOworCXVuc2lnbmVkIGludCBkbWFfbG93OworCXVuc2lnbmVkIGludCBkbWFfaGlnaDsKKwl1bnNpZ25lZCBpbnQgZG1hX29mZnNldDsKKwl1aW50MzJfdCBkbWFfd3JhcDsKKwl2b2xhdGlsZSB1aW50MzJfdCAqbGFzdF9wYXVzZV9wdHI7CisJdm9sYXRpbGUgdWludDMyX3QgKmh3X2FkZHJfcHRyOworCWRybV92aWFfcmluZ19idWZmZXJfdCByaW5nOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCBsYXN0X3ZibGFuazsKKyAgICAgICAgaW50IGxhc3RfdmJsYW5rX3ZhbGlkOworICAgICAgICB1bnNpZ25lZCB1c2VjX3Blcl92Ymxhbms7CisJZHJtX3ZpYV9zdGF0ZV90IGhjX3N0YXRlOworCWNoYXIgcGNpX2J1ZltWSUFfUENJX0JVRl9TSVpFXTsKKwljb25zdCB1aW50MzJfdCAqZmlyZV9vZmZzZXRzW1ZJQV9GSVJFX0JVRl9TSVpFXTsKKwl1aW50MzJfdCBudW1fZmlyZV9vZmZzZXRzOworCWludCBwcm9fZ3JvdXBfYTsKKwlkcm1fdmlhX2lycV90IHZpYV9pcnFzW1ZJQV9OVU1fSVJRU107CisJdW5zaWduZWQgbnVtX2lycXM7CisJbWFza2FycmF5X3QgKmlycV9tYXNrczsKKwl1aW50MzJfdCBpcnFfZW5hYmxlX21hc2s7IAorCXVpbnQzMl90IGlycV9wZW5kaW5nX21hc2s7CQorfSBkcm1fdmlhX3ByaXZhdGVfdDsKKworLyogVklBIE1NSU8gcmVnaXN0ZXIgYWNjZXNzICovCisjZGVmaW5lIFZJQV9CQVNFICgoZGV2X3ByaXYtPm1taW8pKQorCisjZGVmaW5lIFZJQV9SRUFEKHJlZykJCURSTV9SRUFEMzIoVklBX0JBU0UsIHJlZykKKyNkZWZpbmUgVklBX1dSSVRFKHJlZyx2YWwpCURSTV9XUklURTMyKFZJQV9CQVNFLCByZWcsIHZhbCkKKyNkZWZpbmUgVklBX1JFQUQ4KHJlZykJCURSTV9SRUFEOChWSUFfQkFTRSwgcmVnKQorI2RlZmluZSBWSUFfV1JJVEU4KHJlZyx2YWwpCURSTV9XUklURTgoVklBX0JBU0UsIHJlZywgdmFsKQorCitleHRlcm4gaW50IHZpYV9pbml0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2LCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50IHZpYV9maW5hbF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGNvbnRleHQpOworCitleHRlcm4gaW50IHZpYV9kb19jbGVhbnVwX21hcChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCB2aWFfbWFwX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKworZXh0ZXJuIGlycXJldHVybl90IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKKworZXh0ZXJuIGludCB2aWFfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9pbml0X2NvbW1hbmRfdmVyaWZpZXIodm9pZCk7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgdmlhX2luaXRfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KTsKK2V4dGVybiB2b2lkIHZpYV9jbGVhbnVwX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCB2aWFfcmVsZWFzZV9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBjb250ZXh0KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjNkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMCBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLCBJbmMuLCBIc2luQ2h1LCBUYWl3YW4uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAidmlhX2RzLmgiCitleHRlcm4gdW5zaWduZWQgaW50IFZJQV9ERUJVRzsKKworc2V0X3QgKnZpYV9zZXRJbml0KHZvaWQpCit7CisJaW50IGk7CisJc2V0X3QgKnNldDsKKwlzZXQgPSAoc2V0X3QgKikgZHJtX2FsbG9jKHNpemVvZihzZXRfdCksIERSTV9NRU1fRFJJVkVSKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0VUX1NJWkU7IGkrKykgeworCQlzZXQtPmxpc3RbaV0uZnJlZV9uZXh0ID0gaSArIDE7CisJCXNldC0+bGlzdFtpXS5hbGxvY19uZXh0ID0gLTE7CisJfQorCXNldC0+bGlzdFtTRVRfU0laRSAtIDFdLmZyZWVfbmV4dCA9IC0xOworCXNldC0+ZnJlZSA9IDA7CisJc2V0LT5hbGxvYyA9IC0xOworCXNldC0+dHJhY2UgPSAtMTsKKwlyZXR1cm4gc2V0OworfQorCitpbnQgdmlhX3NldEFkZChzZXRfdCAqIHNldCwgSVRFTV9UWVBFIGl0ZW0pCit7CisJaW50IGZyZWUgPSBzZXQtPmZyZWU7CisJaWYgKGZyZWUgIT0gLTEpIHsKKwkJc2V0LT5saXN0W2ZyZWVdLnZhbCA9IGl0ZW07CisJCXNldC0+ZnJlZSA9IHNldC0+bGlzdFtmcmVlXS5mcmVlX25leHQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCXNldC0+bGlzdFtmcmVlXS5hbGxvY19uZXh0ID0gc2V0LT5hbGxvYzsKKwlzZXQtPmFsbG9jID0gZnJlZTsKKwlzZXQtPmxpc3RbZnJlZV0uZnJlZV9uZXh0ID0gLTE7CisJcmV0dXJuIDE7Cit9CisKK2ludCB2aWFfc2V0RGVsKHNldF90ICogc2V0LCBJVEVNX1RZUEUgaXRlbSkKK3sKKwlpbnQgYWxsb2MgPSBzZXQtPmFsbG9jOworCWludCBwcmV2ID0gLTE7CisKKwl3aGlsZSAoYWxsb2MgIT0gLTEpIHsKKwkJaWYgKHNldC0+bGlzdFthbGxvY10udmFsID09IGl0ZW0pIHsKKwkJCWlmIChwcmV2ICE9IC0xKQorCQkJCXNldC0+bGlzdFtwcmV2XS5hbGxvY19uZXh0ID0KKwkJCQkgICAgc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCQkJZWxzZQorCQkJCXNldC0+YWxsb2MgPSBzZXQtPmxpc3RbYWxsb2NdLmFsbG9jX25leHQ7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gYWxsb2M7CisJCWFsbG9jID0gc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCX0KKworCWlmIChhbGxvYyA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlzZXQtPmxpc3RbYWxsb2NdLmZyZWVfbmV4dCA9IHNldC0+ZnJlZTsKKwlzZXQtPmZyZWUgPSBhbGxvYzsKKwlzZXQtPmxpc3RbYWxsb2NdLmFsbG9jX25leHQgPSAtMTsKKworCXJldHVybiAxOworfQorCisvKiBzZXRGaXJzdCAtPiBzZXRBZGQgLT4gc2V0TmV4dCBpcyB3cm9uZyAqLworCitpbnQgdmlhX3NldEZpcnN0KHNldF90ICogc2V0LCBJVEVNX1RZUEUgKiBpdGVtKQoreworCWlmIChzZXQtPmFsbG9jID09IC0xKQorCQlyZXR1cm4gMDsKKworCSppdGVtID0gc2V0LT5saXN0W3NldC0+YWxsb2NdLnZhbDsKKwlzZXQtPnRyYWNlID0gc2V0LT5saXN0W3NldC0+YWxsb2NdLmFsbG9jX25leHQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZpYV9zZXROZXh0KHNldF90ICogc2V0LCBJVEVNX1RZUEUgKiBpdGVtKQoreworCWlmIChzZXQtPnRyYWNlID09IC0xKQorCQlyZXR1cm4gMDsKKworCSppdGVtID0gc2V0LT5saXN0W3NldC0+dHJhY2VdLnZhbDsKKwlzZXQtPnRyYWNlID0gc2V0LT5saXN0W3NldC0+dHJhY2VdLmFsbG9jX25leHQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZpYV9zZXREZXN0cm95KHNldF90ICogc2V0KQoreworCWRybV9mcmVlKHNldCwgc2l6ZW9mKHNldF90KSwgRFJNX01FTV9EUklWRVIpOworCisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgSVNGUkVFKGJwdHIpICgoYnB0ciktPmZyZWUpCisKKyNkZWZpbmUgZnByaW50ZihmbXQsIGFyZy4uLikgZG97fXdoaWxlKDApCisKK21lbUhlYXBfdCAqdmlhX21tSW5pdChpbnQgb2ZzLCBpbnQgc2l6ZSkKK3sKKwlQTWVtQmxvY2sgYmxvY2tzOworCisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlibG9ja3MgPSAoVE1lbUJsb2NrICopIGRybV9jYWxsb2MoMSwgc2l6ZW9mKFRNZW1CbG9jayksIERSTV9NRU1fRFJJVkVSKTsKKworCWlmIChibG9ja3MpIHsKKwkJYmxvY2tzLT5vZnMgPSBvZnM7CisJCWJsb2Nrcy0+c2l6ZSA9IHNpemU7CisJCWJsb2Nrcy0+ZnJlZSA9IDE7CisJCXJldHVybiAobWVtSGVhcF90ICopIGJsb2NrczsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBUTWVtQmxvY2sgKlNsaWNlQmxvY2soVE1lbUJsb2NrICogcCwKKwkJCSAgICAgaW50IHN0YXJ0b2ZzLCBpbnQgc2l6ZSwKKwkJCSAgICAgaW50IHJlc2VydmVkLCBpbnQgYWxpZ25tZW50KQoreworCVRNZW1CbG9jayAqbmV3YmxvY2s7CisKKwkvKiBicmVhayBsZWZ0ICovCisJaWYgKHN0YXJ0b2ZzID4gcC0+b2ZzKSB7CisJCW5ld2Jsb2NrID0KKwkJICAgIChUTWVtQmxvY2sgKikgZHJtX2NhbGxvYygxLCBzaXplb2YoVE1lbUJsb2NrKSwKKwkJCQkJICAgICBEUk1fTUVNX0RSSVZFUik7CisJCW5ld2Jsb2NrLT5vZnMgPSBzdGFydG9mczsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gKHN0YXJ0b2ZzIC0gcC0+b2ZzKTsKKwkJbmV3YmxvY2stPmZyZWUgPSAxOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCXAtPnNpemUgLT0gbmV3YmxvY2stPnNpemU7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwkJcCA9IG5ld2Jsb2NrOworCX0KKworCS8qIGJyZWFrIHJpZ2h0ICovCisJaWYgKHNpemUgPCBwLT5zaXplKSB7CisJCW5ld2Jsb2NrID0KKwkJICAgIChUTWVtQmxvY2sgKikgZHJtX2NhbGxvYygxLCBzaXplb2YoVE1lbUJsb2NrKSwKKwkJCQkJICAgICBEUk1fTUVNX0RSSVZFUik7CisJCW5ld2Jsb2NrLT5vZnMgPSBzdGFydG9mcyArIHNpemU7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIHNpemU7CisJCW5ld2Jsb2NrLT5mcmVlID0gMTsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQlwLT5zaXplID0gc2l6ZTsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCX0KKworCS8qIHAgPSBtaWRkbGUgYmxvY2sgKi8KKwlwLT5hbGlnbiA9IGFsaWdubWVudDsKKwlwLT5mcmVlID0gMDsKKwlwLT5yZXNlcnZlZCA9IHJlc2VydmVkOworCXJldHVybiBwOworfQorCitQTWVtQmxvY2sgdmlhX21tQWxsb2NNZW0obWVtSGVhcF90ICogaGVhcCwgaW50IHNpemUsIGludCBhbGlnbjIsCisJCQkgaW50IHN0YXJ0U2VhcmNoKQoreworCWludCBtYXNrLCBzdGFydG9mcywgZW5kb2ZzOworCVRNZW1CbG9jayAqcDsKKworCWlmICghaGVhcCB8fCBhbGlnbjIgPCAwIHx8IHNpemUgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwltYXNrID0gKDEgPDwgYWxpZ24yKSAtIDE7CisJc3RhcnRvZnMgPSAwOworCXAgPSAoVE1lbUJsb2NrICopIGhlYXA7CisKKwl3aGlsZSAocCkgeworCQlpZiAoSVNGUkVFKHApKSB7CisJCQlzdGFydG9mcyA9IChwLT5vZnMgKyBtYXNrKSAmIH5tYXNrOworCisJCQlpZiAoc3RhcnRvZnMgPCBzdGFydFNlYXJjaCkKKwkJCQlzdGFydG9mcyA9IHN0YXJ0U2VhcmNoOworCisJCQllbmRvZnMgPSBzdGFydG9mcyArIHNpemU7CisKKwkJCWlmIChlbmRvZnMgPD0gKHAtPm9mcyArIHAtPnNpemUpKQorCQkJCWJyZWFrOworCQl9CisKKwkJcCA9IHAtPm5leHQ7CisJfQorCisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKworCXAgPSBTbGljZUJsb2NrKHAsIHN0YXJ0b2ZzLCBzaXplLCAwLCBtYXNrICsgMSk7CisJcC0+aGVhcCA9IGhlYXA7CisKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IEpvaW4yQmxvY2tzKFRNZW1CbG9jayAqIHApCit7CisJaWYgKHAtPmZyZWUgJiYgcC0+bmV4dCAmJiBwLT5uZXh0LT5mcmVlKSB7CisJCVRNZW1CbG9jayAqcSA9IHAtPm5leHQ7CisJCXAtPnNpemUgKz0gcS0+c2l6ZTsKKwkJcC0+bmV4dCA9IHEtPm5leHQ7CisJCWRybV9mcmVlKHEsIHNpemVvZihUTWVtQmxvY2spLCBEUk1fTUVNX0RSSVZFUik7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWFfbW1GcmVlTWVtKFBNZW1CbG9jayBiKQoreworCVRNZW1CbG9jayAqcCwgKnByZXY7CisKKwlpZiAoIWIpCisJCXJldHVybiAwOworCisJaWYgKCFiLT5oZWFwKSB7CisJCWZwcmludGYoc3RkZXJyLCAibm8gaGVhcFxuIik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXAgPSBiLT5oZWFwOworCXByZXYgPSBOVUxMOworCisJd2hpbGUgKHAgJiYgcCAhPSBiKSB7CisJCXByZXYgPSBwOworCQlwID0gcC0+bmV4dDsKKwl9CisKKwlpZiAoIXAgfHwgcC0+ZnJlZSB8fCBwLT5yZXNlcnZlZCkgeworCQlpZiAoIXApCisJCQlmcHJpbnRmKHN0ZGVyciwgImJsb2NrIG5vdCBmb3VuZCBpbiBoZWFwXG4iKTsKKwkJZWxzZSBpZiAocC0+ZnJlZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiYmxvY2sgYWxyZWFkeSBmcmVlXG4iKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJibG9jayBpcyByZXNlcnZlZFxuIik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXAtPmZyZWUgPSAxOworCUpvaW4yQmxvY2tzKHApOworCisJaWYgKHByZXYpCisJCUpvaW4yQmxvY2tzKHByZXYpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTljN2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycCwgSW5jLiwgSHNpbkNodSwgVGFpd2FuLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF92aWFfZHNfaF8KKyNkZWZpbmUgX3ZpYV9kc19oXworCisjaW5jbHVkZSAiZHJtUC5oIgorCisvKiBTZXQgRGF0YSBTdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgU0VUX1NJWkUgNTAwMAordHlwZWRlZiB1bnNpZ25lZCBsb25nIElURU1fVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUlURU1fVFlQRSB2YWw7CisJaW50IGFsbG9jX25leHQsIGZyZWVfbmV4dDsKK30gbGlzdF9pdGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgYWxsb2M7CisJaW50IGZyZWU7CisJaW50IHRyYWNlOworCWxpc3RfaXRlbV90IGxpc3RbU0VUX1NJWkVdOworfSBzZXRfdDsKKworc2V0X3QgKnZpYV9zZXRJbml0KHZvaWQpOworaW50IHZpYV9zZXRBZGQoc2V0X3QgKiBzZXQsIElURU1fVFlQRSBpdGVtKTsKK2ludCB2aWFfc2V0RGVsKHNldF90ICogc2V0LCBJVEVNX1RZUEUgaXRlbSk7CitpbnQgdmlhX3NldEZpcnN0KHNldF90ICogc2V0LCBJVEVNX1RZUEUgKiBpdGVtKTsKK2ludCB2aWFfc2V0TmV4dChzZXRfdCAqIHNldCwgSVRFTV9UWVBFICogaXRlbSk7CitpbnQgdmlhX3NldERlc3Ryb3koc2V0X3QgKiBzZXQpOworCisjZW5kaWYKKworI2lmbmRlZiBNTV9JTkMKKyNkZWZpbmUgTU1fSU5DCisKK3N0cnVjdCBtZW1fYmxvY2tfdCB7CisJc3RydWN0IG1lbV9ibG9ja190ICpuZXh0OworCXN0cnVjdCBtZW1fYmxvY2tfdCAqaGVhcDsKKwlpbnQgb2ZzLCBzaXplOworCWludCBhbGlnbjsKKwlpbnQgZnJlZToxOworCWludCByZXNlcnZlZDoxOworfTsKK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190IFRNZW1CbG9jazsKK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190ICpQTWVtQmxvY2s7CisKKy8qIGEgaGVhcCBpcyBqdXN0IHRoZSBmaXJzdCBibG9jayBpbiBhIGNoYWluICovCit0eXBlZGVmIHN0cnVjdCBtZW1fYmxvY2tfdCBtZW1IZWFwX3Q7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBtbUJsb2NrU2l6ZShQTWVtQmxvY2sgYikKK3sKKwlyZXR1cm4gYi0+c2l6ZTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IG1tT2Zmc2V0KFBNZW1CbG9jayBiKQoreworCXJldHVybiBiLT5vZnM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbW1NYXJrUmVzZXJ2ZWQoUE1lbUJsb2NrIGIpCit7CisJYi0+cmVzZXJ2ZWQgPSAxOworfQorCisvKgorICogaW5wdXQ6IHRvdGFsIHNpemUgaW4gYnl0ZXMKKyAqIHJldHVybjogYSBoZWFwIHBvaW50ZXIgaWYgT0ssIE5VTEwgaWYgZXJyb3IKKyAqLworbWVtSGVhcF90ICp2aWFfbW1Jbml0KGludCBvZnMsIGludCBzaXplKTsKKworUE1lbUJsb2NrIHZpYV9tbUFsbG9jTWVtKG1lbUhlYXBfdCAqIGhlYXAsIGludCBzaXplLCBpbnQgYWxpZ24yLAorCQkJIGludCBzdGFydFNlYXJjaCk7CisKKy8qCisgKiBGcmVlIGJsb2NrIHN0YXJ0cyBhdCBvZmZzZXQKKyAqIGlucHV0OiBwb2ludGVyIHRvIGEgYmxvY2sKKyAqIHJldHVybjogMCBpZiBPSywgLTEgaWYgZXJyb3IKKyAqLworaW50IHZpYV9tbUZyZWVNZW0oUE1lbUJsb2NrIGIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwMjdmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jCkBAIC0wLDAgKzEsMzM5IEBACisvKiB2aWFfaXJxLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBCRUFNIEx0ZC4KKyAqIENvcHlyaWdodCAyMDAyIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNSBUaG9tYXMgSGVsbHN0cm9tLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogQkVBTSBMVEQsIFRVTkdTVEVOIEdSQVBISUNTICBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFRlcnJ5IEJhcm5hYnkgPHRlcnJ5MUBiZWFtLmx0ZC51az4KKyAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqICAgIFRob21hcyBIZWxsc3Ryb20gPHVuaWNocm9tZUBzaGlwbWFpbC5vcmc+CisgKgorICogVGhpcyBjb2RlIHByb3ZpZGVzIHN0YW5kYXJkIERSTSBhY2Nlc3MgdG8gdGhlIFZpYSBVbmljaHJvbWUgLyBQcm8gVmVydGljYWwgYmxhbmsKKyAqIGludGVycnVwdCwgYXMgd2VsbCBhcyBhbiBpbmZyYXN0cnVjdHVyZSB0byBoYW5kbGUgb3RoZXIgaW50ZXJydXB0cyBvZiB0aGUgY2hpcC4KKyAqIFRoZSByZWZyZXNoIHJhdGUgaXMgYWxzbyBjYWxjdWxhdGVkIGZvciB2aWRlbyBwbGF5YmFjayBzeW5jIHB1cnBvc2VzLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAidmlhX2RybS5oIgorI2luY2x1ZGUgInZpYV9kcnYuaCIKKworI2RlZmluZSBWSUFfUkVHX0lOVEVSUlVQVCAgICAgICAweDIwMAorCisvKiBWSUFfUkVHX0lOVEVSUlVQVCAqLworI2RlZmluZSBWSUFfSVJRX0dMT0JBTCAgICAgICAgICAoMSA8PCAzMSkKKyNkZWZpbmUgVklBX0lSUV9WQkxBTktfRU5BQkxFICAgKDEgPDwgMTkpCisjZGVmaW5lIFZJQV9JUlFfVkJMQU5LX1BFTkRJTkcgICgxIDw8IDMpCisjZGVmaW5lIFZJQV9JUlFfSFFWMF9FTkFCTEUgICAgICgxIDw8IDExKQorI2RlZmluZSBWSUFfSVJRX0hRVjFfRU5BQkxFICAgICAoMSA8PCAyNSkKKyNkZWZpbmUgVklBX0lSUV9IUVYwX1BFTkRJTkcgICAgKDEgPDwgOSkKKyNkZWZpbmUgVklBX0lSUV9IUVYxX1BFTkRJTkcgICAgKDEgPDwgMTApCisKKy8qCisgKiBEZXZpY2Utc3BlY2lmaWMgSVJRcyBnbyBoZXJlLiBUaGlzIHR5cGUgbWlnaHQgbmVlZCB0byBiZSBleHRlbmRlZCB3aXRoCisgKiB0aGUgcmVnaXN0ZXIgaWYgdGhlcmUgYXJlIG11bHRpcGxlIElSUSBjb250cm9sIHJlZ2lzdGVycy4KKyAqIEN1cnJlbnRseSB3ZSBhY3RpdmF0ZSB0aGUgSFFWIGludGVycnVwdHMgb2YgIFVuaWNocm9tZSBQcm8gZ3JvdXAgQS4gCisgKi8KKworc3RhdGljIG1hc2thcnJheV90IHZpYV9wcm9fZ3JvdXBfYV9pcnFzW10gPSB7CisJe1ZJQV9JUlFfSFFWMF9FTkFCTEUsIFZJQV9JUlFfSFFWMF9QRU5ESU5HLCAweDAwMDAwM0QwLCAweDAwMDA4MDEwLCAweDAwMDAwMDAwIH0sCisJe1ZJQV9JUlFfSFFWMV9FTkFCTEUsIFZJQV9JUlFfSFFWMV9QRU5ESU5HLCAweDAwMDAxM0QwLCAweDAwMDA4MDEwLCAweDAwMDAwMDAwIH19Oworc3RhdGljIGludCB2aWFfbnVtX3Byb19ncm91cF9hID0gc2l6ZW9mKHZpYV9wcm9fZ3JvdXBfYV9pcnFzKS9zaXplb2YobWFza2FycmF5X3QpOworCitzdGF0aWMgbWFza2FycmF5X3QgdmlhX3VuaWNocm9tZV9pcnFzW10gPSB7fTsKK3N0YXRpYyBpbnQgdmlhX251bV91bmljaHJvbWUgPSBzaXplb2YodmlhX3VuaWNocm9tZV9pcnFzKS9zaXplb2YobWFza2FycmF5X3QpOworCisKK3N0YXRpYyB1bnNpZ25lZCB0aW1lX2RpZmYoc3RydWN0IHRpbWV2YWwgKm5vdyxzdHJ1Y3QgdGltZXZhbCAqdGhlbikgCit7CisgICAgcmV0dXJuIChub3ctPnR2X3VzZWMgPj0gdGhlbi0+dHZfdXNlYykgPworICAgICAgICBub3ctPnR2X3VzZWMgLSB0aGVuLT50dl91c2VjIDoKKyAgICAgICAgMTAwMDAwMCAtICh0aGVuLT50dl91c2VjIC0gbm93LT50dl91c2VjKTsKK30KKworaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKwlzdHJ1Y3QgdGltZXZhbCBjdXJfdmJsYW5rOworCWRybV92aWFfaXJxX3QgKmN1cl9pcnEgPSBkZXZfcHJpdi0+dmlhX2lycXM7CisJaW50IGk7CisKKwlzdGF0dXMgPSBWSUFfUkVBRChWSUFfUkVHX0lOVEVSUlVQVCk7CisJaWYgKHN0YXR1cyAmIFZJQV9JUlFfVkJMQU5LX1BFTkRJTkcpIHsKKwkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworICAgICAgICAgICAgICAgIGlmICghKGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCkgJiAweDBGKSkgeworCQkJZG9fZ2V0dGltZW9mZGF5KCZjdXJfdmJsYW5rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZfcHJpdi0+bGFzdF92YmxhbmtfdmFsaWQpIHsKKwkJCQlkZXZfcHJpdi0+dXNlY19wZXJfdmJsYW5rID0gCisJCQkJCXRpbWVfZGlmZiggJmN1cl92YmxhbmssJmRldl9wcml2LT5sYXN0X3ZibGFuaykgPj4gNDsKKwkJCX0KKwkJCWRldl9wcml2LT5sYXN0X3ZibGFuayA9IGN1cl92Ymxhbms7CisJCQlkZXZfcHJpdi0+bGFzdF92YmxhbmtfdmFsaWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIShhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQpICYgMHhGRikpIHsKKwkJCURSTV9ERUJVRygiVVMgcGVyIHZibGFuayBpczogJXVcbiIsCisJCQkJZGV2X3ByaXYtPnVzZWNfcGVyX3ZibGFuayk7CisJCX0KKwkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOworCQlkcm1fdmJsX3NlbmRfc2lnbmFscyhkZXYpOworCQloYW5kbGVkID0gMTsKKwl9CisJCisKKwlmb3IgKGk9MDsgaTxkZXZfcHJpdi0+bnVtX2lycXM7ICsraSkgeworCQlpZiAoc3RhdHVzICYgY3VyX2lycS0+cGVuZGluZ19tYXNrKSB7CisJCQlhdG9taWNfaW5jKCAmY3VyX2lycS0+aXJxX3JlY2VpdmVkICk7CisJCQlEUk1fV0FLRVVQKCAmY3VyX2lycS0+aXJxX3F1ZXVlICk7CisJCQloYW5kbGVkID0gMTsKKwkJfQorCQljdXJfaXJxKys7CisJfQorCQorCS8qIEFja25vd2xlZ2UgaW50ZXJydXB0cyAqLworCVZJQV9XUklURShWSUFfUkVHX0lOVEVSUlVQVCwgc3RhdHVzKTsKKworCisJaWYgKGhhbmRsZWQpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwllbHNlCisJCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCB2aWFkcnZfYWNrbm93bGVkZ2VfaXJxcyhkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCXUzMiBzdGF0dXM7CisKKwlpZiAoZGV2X3ByaXYpIHsKKwkJLyogQWNrbm93bGVnZSBpbnRlcnJ1cHRzICovCisJCXN0YXR1cyA9IFZJQV9SRUFEKFZJQV9SRUdfSU5URVJSVVBUKTsKKwkJVklBX1dSSVRFKFZJQV9SRUdfSU5URVJSVVBULCBzdGF0dXMgfCAKKwkJCSAgZGV2X3ByaXYtPmlycV9wZW5kaW5nX21hc2spOworCX0KK30KKworaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOworCWludCByZXQgPSAwOworCisJRFJNX0RFQlVHKCJ2aWFkcnZfdmJsYW5rX3dhaXRcbiIpOworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmlhZHJ2X2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYpOworCisJLyogQXNzdW1lIHRoYXQgdGhlIHVzZXIgaGFzIG1pc3NlZCB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIKKwkgKiBieSBhYm91dCBhIGRheSByYXRoZXIgdGhhbiBzaGUgd2FudHMgdG8gd2FpdCBmb3IgeWVhcnMKKwkgKiB1c2luZyB2ZXJ0aWNhbCBibGFua3MuLi4KKwkgKi8KKworCURSTV9XQUlUX09OKHJldCwgZGV2LT52YmxfcXVldWUsIDMgKiBEUk1fSFosCisJCSAgICAoKChjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKSkgLQorCQkgICAgICAqc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkpOworCQorCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCAKK3ZpYV9kcml2ZXJfaXJxX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgaXJxLCBpbnQgZm9yY2Vfc2VxdWVuY2UsCisJCSAgICB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGludCBjdXJfaXJxX3NlcXVlbmNlOworCWRybV92aWFfaXJxX3QgKmN1cl9pcnEgPSBkZXZfcHJpdi0+dmlhX2lycXM7CisJaW50IHJldCA9IDA7CisJbWFza2FycmF5X3QgKm1hc2tzID0gZGV2X3ByaXYtPmlycV9tYXNrczsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKGlycSA+PSBkZXZfcHJpdi0+bnVtX2lycXMgKSB7CisJCURSTV9FUlJPUigiJXMgVHJ5aW5nIHRvIHdhaXQgb24gdW5rbm93biBpcnEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJCQorCWN1cl9pcnEgKz0gaXJxOworCisJaWYgKG1hc2tzW2lycV1bMl0gJiYgIWZvcmNlX3NlcXVlbmNlKSB7CisJCURSTV9XQUlUX09OKHJldCwgY3VyX2lycS0+aXJxX3F1ZXVlLCAzICogRFJNX0haLAorCQkJICAgICgoVklBX1JFQUQobWFza3NbaXJxXVsyXSkgJiBtYXNrc1tpcnFdWzNdKSA9PSBtYXNrc1tpcnFdWzRdKSk7CisJCWN1cl9pcnFfc2VxdWVuY2UgPSBhdG9taWNfcmVhZCgmY3VyX2lycS0+aXJxX3JlY2VpdmVkKTsKKwl9IGVsc2UgeworCQlEUk1fV0FJVF9PTihyZXQsIGN1cl9pcnEtPmlycV9xdWV1ZSwgMyAqIERSTV9IWiwKKwkJCSAgICAoKChjdXJfaXJxX3NlcXVlbmNlID0gYXRvbWljX3JlYWQoJmN1cl9pcnEtPmlycV9yZWNlaXZlZCkpIC0KKwkJCSAgICAgICpzZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSk7CQkKKwl9CisJKnNlcXVlbmNlID0gY3VyX2lycV9zZXF1ZW5jZTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBkcm1fZG1hLmggaG9va3MKKyAqLworCit2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBzdGF0dXM7CisJZHJtX3ZpYV9pcnFfdCAqY3VyX2lycSA9IGRldl9wcml2LT52aWFfaXJxczsKKwlpbnQgaTsKKworCURSTV9ERUJVRygiZHJpdmVyX2lycV9wcmVpbnN0YWxsOiBkZXZfcHJpdjogJXBcbiIsIGRldl9wcml2KTsKKwlpZiAoZGV2X3ByaXYpIHsKKworCQlkZXZfcHJpdi0+aXJxX2VuYWJsZV9tYXNrID0gVklBX0lSUV9WQkxBTktfRU5BQkxFOworCQlkZXZfcHJpdi0+aXJxX3BlbmRpbmdfbWFzayA9IFZJQV9JUlFfVkJMQU5LX1BFTkRJTkc7CisKKwkJZGV2X3ByaXYtPmlycV9tYXNrcyA9IChkZXZfcHJpdi0+cHJvX2dyb3VwX2EpID8KKwkJCXZpYV9wcm9fZ3JvdXBfYV9pcnFzIDogdmlhX3VuaWNocm9tZV9pcnFzOworCQlkZXZfcHJpdi0+bnVtX2lycXMgPSAoZGV2X3ByaXYtPnByb19ncm91cF9hKSA/CisJCQl2aWFfbnVtX3Byb19ncm91cF9hIDogdmlhX251bV91bmljaHJvbWU7CisJCQorCQlmb3IoaT0wOyBpIDwgZGV2X3ByaXYtPm51bV9pcnFzOyArK2kpIHsKKwkJCWF0b21pY19zZXQoJmN1cl9pcnEtPmlycV9yZWNlaXZlZCwgMCk7CisJCQljdXJfaXJxLT5lbmFibGVfbWFzayA9IGRldl9wcml2LT5pcnFfbWFza3NbaV1bMF07IAorCQkJY3VyX2lycS0+cGVuZGluZ19tYXNrID0gZGV2X3ByaXYtPmlycV9tYXNrc1tpXVsxXTsKKwkJCURSTV9JTklUX1dBSVRRVUVVRSggJmN1cl9pcnEtPmlycV9xdWV1ZSApOworCQkJZGV2X3ByaXYtPmlycV9lbmFibGVfbWFzayB8PSBjdXJfaXJxLT5lbmFibGVfbWFzazsKKwkJCWRldl9wcml2LT5pcnFfcGVuZGluZ19tYXNrIHw9IGN1cl9pcnEtPnBlbmRpbmdfbWFzazsKKwkJCWN1cl9pcnErKzsKKwkJCQorCQkJRFJNX0RFQlVHKCJJbml0aWFsaXppbmcgSVJRICVkXG4iLCBpKTsKKwkJfQorCQkJCisJICAgICAgICBkZXZfcHJpdi0+bGFzdF92YmxhbmtfdmFsaWQgPSAwOworCisJCS8vIENsZWFyIFZTeW5jIGludGVycnVwdCByZWdzCisJCXN0YXR1cyA9IFZJQV9SRUFEKFZJQV9SRUdfSU5URVJSVVBUKTsKKwkJVklBX1dSSVRFKFZJQV9SRUdfSU5URVJSVVBULCBzdGF0dXMgJiAKKwkJCSAgfihkZXZfcHJpdi0+aXJxX2VuYWJsZV9tYXNrKSk7CisJCQorCQkvKiBDbGVhciBiaXRzIGlmIHRoZXkncmUgYWxyZWFkeSBoaWdoICovCisJCXZpYWRydl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2KTsKKwl9Cit9CisKK3ZvaWQgdmlhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBzdGF0dXM7CisKKwlEUk1fREVCVUcoInZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsXG4iKTsKKwlpZiAoZGV2X3ByaXYpIHsKKwkJc3RhdHVzID0gVklBX1JFQUQoVklBX1JFR19JTlRFUlJVUFQpOworCQlWSUFfV1JJVEUoVklBX1JFR19JTlRFUlJVUFQsIHN0YXR1cyB8IFZJQV9JUlFfR0xPQkFMCisJCQkgIHwgZGV2X3ByaXYtPmlycV9lbmFibGVfbWFzayk7CisKKwkJLyogU29tZSBtYWdpYywgb2ggZm9yIHNvbWUgZGF0YSBzaGVldHMgISAqLworCisJCVZJQV9XUklURTgoMHg4M2Q0LCAweDExKTsKKwkJVklBX1dSSVRFOCgweDgzZDUsIFZJQV9SRUFEOCgweDgzZDUpIHwgMHgzMCk7CisJCQorCX0KK30KKwordm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBzdGF0dXM7CisKKwlEUk1fREVCVUcoImRyaXZlcl9pcnFfdW5pbnN0YWxsKVxuIik7CisJaWYgKGRldl9wcml2KSB7CisKKwkJLyogU29tZSBtb3JlIG1hZ2ljLCBvaCBmb3Igc29tZSBkYXRhIHNoZWV0cyAhICovCisKKwkJVklBX1dSSVRFOCgweDgzZDQsIDB4MTEpOworCQlWSUFfV1JJVEU4KDB4ODNkNSwgVklBX1JFQUQ4KDB4ODNkNSkgJiB+MHgzMCk7CisKKwkJc3RhdHVzID0gVklBX1JFQUQoVklBX1JFR19JTlRFUlJVUFQpOworCQlWSUFfV1JJVEUoVklBX1JFR19JTlRFUlJVUFQsIHN0YXR1cyAmIAorCQkJICB+KFZJQV9JUlFfVkJMQU5LX0VOQUJMRSB8IGRldl9wcml2LT5pcnFfZW5hYmxlX21hc2spKTsKKwl9Cit9CisKK2ludCB2aWFfd2FpdF9pcnEoRFJNX0lPQ1RMX0FSR1MpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fdmlhX2lycXdhaXRfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV92aWFfaXJxd2FpdF90IGlycXdhaXQ7CisJc3RydWN0IHRpbWV2YWwgbm93OworCWludCByZXQgPSAwOworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWRybV92aWFfaXJxX3QgKmN1cl9pcnEgPSBkZXZfcHJpdi0+dmlhX2lycXM7CisJaW50IGZvcmNlX3NlcXVlbmNlOworCisJaWYgKCFkZXYtPmlycSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpcnF3YWl0LCBhcmdwLCBzaXplb2YoaXJxd2FpdCkpOworCWlmIChpcnF3YWl0LnJlcXVlc3QuaXJxID49IGRldl9wcml2LT5udW1faXJxcykgeworCQlEUk1fRVJST1IoIiVzIFRyeWluZyB0byB3YWl0IG9uIHVua25vd24gaXJxICVkXG4iLCBfX0ZVTkNUSU9OX18sIAorCQkJICBpcnF3YWl0LnJlcXVlc3QuaXJxKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwljdXJfaXJxICs9IGlycXdhaXQucmVxdWVzdC5pcnE7CisKKwlzd2l0Y2ggKGlycXdhaXQucmVxdWVzdC50eXBlICYgflZJQV9JUlFfRkxBR1NfTUFTSykgeworCWNhc2UgVklBX0lSUV9SRUxBVElWRToKKwkJaXJxd2FpdC5yZXF1ZXN0LnNlcXVlbmNlICs9IGF0b21pY19yZWFkKCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQpOworCQlpcnF3YWl0LnJlcXVlc3QudHlwZSAmPSB+X0RSTV9WQkxBTktfUkVMQVRJVkU7CisJY2FzZSBWSUFfSVJRX0FCU09MVVRFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmIChpcnF3YWl0LnJlcXVlc3QudHlwZSAmIFZJQV9JUlFfU0lHTkFMKSB7CisJCURSTV9FUlJPUigiJXMgU2lnbmFscyBvbiBWaWEgSVJRcyBub3QgaW1wbGVtZW50ZWQgeWV0LlxuIiwgCisJCQkgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZm9yY2Vfc2VxdWVuY2UgPSAoaXJxd2FpdC5yZXF1ZXN0LnR5cGUgJiBWSUFfSVJRX0ZPUkNFX1NFUVVFTkNFKTsKKworCXJldCA9IHZpYV9kcml2ZXJfaXJxX3dhaXQoZGV2LCBpcnF3YWl0LnJlcXVlc3QuaXJxLCBmb3JjZV9zZXF1ZW5jZSwKKwkJCQkgICZpcnF3YWl0LnJlcXVlc3Quc2VxdWVuY2UpOworCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwlpcnF3YWl0LnJlcGx5LnR2YWxfc2VjID0gbm93LnR2X3NlYzsKKwlpcnF3YWl0LnJlcGx5LnR2YWxfdXNlYyA9IG5vdy50dl91c2VjOworCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmdwLCBpcnF3YWl0LCBzaXplb2YoaXJxd2FpdCkpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlODI5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorCitzdGF0aWMgaW50IHZpYV9kb19pbml0X21hcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV92aWFfaW5pdF90ICogaW5pdCkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZGV2X3ByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKGRybV92aWFfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOworCWlmIChkZXZfcHJpdiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV92aWFfcHJpdmF0ZV90KSk7CisKKwlEUk1fR0VUU0FSRUEoKTsKKwlpZiAoIWRldl9wcml2LT5zYXJlYSkgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQl2aWFfZG9fY2xlYW51cF9tYXAoZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X3ByaXYtPmZiID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmZiX29mZnNldCk7CisJaWYgKCFkZXZfcHJpdi0+ZmIpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBmcmFtZWJ1ZmZlciFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJdmlhX2RvX2NsZWFudXBfbWFwKGRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfcHJpdi0+bW1pbyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvX29mZnNldCk7CisJaWYgKCFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIG1taW8gcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQl2aWFfZG9fY2xlYW51cF9tYXAoZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPQorCSAgICAoZHJtX3ZpYV9zYXJlYV90ICopICgodTggKikgZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGUgKworCQkJCSBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKwlkZXZfcHJpdi0+YWdwQWRkciA9IGluaXQtPmFncEFkZHI7CisKKwl2aWFfaW5pdF9mdXRleCggZGV2X3ByaXYgKTsKKwlkZXZfcHJpdi0+cHJvX2dyb3VwX2EgPSAoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHgzMTE4KTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCXJldHVybiAwOworfQorCitpbnQgdmlhX2RvX2NsZWFudXBfbWFwKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCisJCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkJdmlhX2RtYV9jbGVhbnVwKGRldik7CisKKwkJZHJtX2ZyZWUoZGV2X3ByaXYsIHNpemVvZihkcm1fdmlhX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWFfbWFwX2luaXQoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fdmlhX2luaXRfdCBpbml0OworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpbml0LCAoZHJtX3ZpYV9pbml0X3QgKikgZGF0YSwgc2l6ZW9mKGluaXQpKTsKKworCXN3aXRjaCAoaW5pdC5mdW5jKSB7CisJY2FzZSBWSUFfSU5JVF9NQVA6CisJCXJldHVybiB2aWFfZG9faW5pdF9tYXAoZGV2LCAmaW5pdCk7CisJY2FzZSBWSUFfQ0xFQU5VUF9NQVA6CisJCXJldHVybiB2aWFfZG9fY2xlYW51cF9tYXAoZGV2KTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI3MTJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAidmlhX2RybS5oIgorI2luY2x1ZGUgInZpYV9kcnYuaCIKKyNpbmNsdWRlICJ2aWFfZHMuaCIKKyNpbmNsdWRlICJ2aWFfbW0uaCIKKworI2RlZmluZSBNQVhfQ09OVEVYVCAxMDAKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB1c2VkOworCWludCBjb250ZXh0OworCXNldF90ICpzZXRzWzJdOwkJLyogMCBmb3IgZnJhbWUgYnVmZmVyLCAxIGZvciBBR1AgLCAyIGZvciBTeXN0ZW0gKi8KK30gdmlhX2NvbnRleHRfdDsKKworc3RhdGljIHZpYV9jb250ZXh0X3QgZ2xvYmFsX3Bwcml2W01BWF9DT05URVhUXTsKKworc3RhdGljIGludCB2aWFfYWdwX2FsbG9jKGRybV92aWFfbWVtX3QgKiBtZW0pOworc3RhdGljIGludCB2aWFfYWdwX2ZyZWUoZHJtX3ZpYV9tZW1fdCAqIG1lbSk7CitzdGF0aWMgaW50IHZpYV9mYl9hbGxvYyhkcm1fdmlhX21lbV90ICogbWVtKTsKK3N0YXRpYyBpbnQgdmlhX2ZiX2ZyZWUoZHJtX3ZpYV9tZW1fdCAqIG1lbSk7CisKK3N0YXRpYyBpbnQgYWRkX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGksIHJldHZhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlRFWFQ7IGkrKykgeworCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYgZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkgeworCQkJcmV0dmFsID0gdmlhX3NldEFkZChnbG9iYWxfcHByaXZbaV0uc2V0c1t0eXBlXSwgdmFsKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkZWxfYWxsb2Nfc2V0KGludCBjb250ZXh0LCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpbnQgaSwgcmV0dmFsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVDsgaSsrKQorCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYgZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkgeworCQkJcmV0dmFsID0gdmlhX3NldERlbChnbG9iYWxfcHByaXZbaV0uc2V0c1t0eXBlXSwgdmFsKTsKKwkJCWJyZWFrOworCQl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBhZ3AgbWVtb3J5IG1hbmFnZW1lbnQgKi8KK3N0YXRpYyBtZW1IZWFwX3QgKkFncEhlYXAgPSBOVUxMOworCitpbnQgdmlhX2FncF9pbml0KERSTV9JT0NUTF9BUkdTKQoreworCWRybV92aWFfYWdwX3QgYWdwOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFncCwgKGRybV92aWFfYWdwX3QgKikgZGF0YSwgc2l6ZW9mKGFncCkpOworCisJQWdwSGVhcCA9IHZpYV9tbUluaXQoYWdwLm9mZnNldCwgYWdwLnNpemUpOworCisJRFJNX0RFQlVHKCJvZmZzZXQgPSAlbHUsIHNpemUgPSAlbHUiLCAodW5zaWduZWQgbG9uZylhZ3Aub2Zmc2V0LCAodW5zaWduZWQgbG9uZylhZ3Auc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZmIgbWVtb3J5IG1hbmFnZW1lbnQgKi8KK3N0YXRpYyBtZW1IZWFwX3QgKkZCSGVhcCA9IE5VTEw7CisKK2ludCB2aWFfZmJfaW5pdChEUk1fSU9DVExfQVJHUykKK3sKKwlkcm1fdmlhX2ZiX3QgZmI7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZmIsIChkcm1fdmlhX2ZiX3QgKikgZGF0YSwgc2l6ZW9mKGZiKSk7CisKKwlGQkhlYXAgPSB2aWFfbW1Jbml0KGZiLm9mZnNldCwgZmIuc2l6ZSk7CisKKwlEUk1fREVCVUcoIm9mZnNldCA9ICVsdSwgc2l6ZSA9ICVsdSIsICh1bnNpZ25lZCBsb25nKWZiLm9mZnNldCwgKHVuc2lnbmVkIGxvbmcpZmIuc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZpYV9pbml0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNvbnRleHQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlRFWFQ7IGkrKykKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmCisJCSAgICAoZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkpCisJCQlicmVhazsKKworCWlmIChpID49IE1BWF9DT05URVhUKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVDsgaSsrKSB7CisJCQlpZiAoIWdsb2JhbF9wcHJpdltpXS51c2VkKSB7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPSBjb250ZXh0OworCQkJCWdsb2JhbF9wcHJpdltpXS51c2VkID0gMTsKKwkJCQlnbG9iYWxfcHByaXZbaV0uc2V0c1swXSA9IHZpYV9zZXRJbml0KCk7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLnNldHNbMV0gPSB2aWFfc2V0SW5pdCgpOworCQkJCURSTV9ERUJVRygiaW5pdCBhbGxvY2F0aW9uIHNldCwgc29ja2V0PSVkLCIKKwkJCQkJICAiIGNvbnRleHQgPSAlZFxuIiwgaSwgY29udGV4dCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoKGkgPj0gTUFYX0NPTlRFWFQpIHx8IChnbG9iYWxfcHByaXZbaV0uc2V0c1swXSA9PSBOVUxMKSB8fAorCQkgICAgKGdsb2JhbF9wcHJpdltpXS5zZXRzWzFdID09IE5VTEwpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitpbnQgdmlhX2ZpbmFsX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNvbnRleHQpCit7CQorICAgICAgICBpbnQgaTsKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVDsgaSsrKQorCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYKKwkJICAgIChnbG9iYWxfcHByaXZbaV0uY29udGV4dCA9PSBjb250ZXh0KSkKKwkJCWJyZWFrOworCisJaWYgKGkgPCBNQVhfQ09OVEVYVCkgeworCQlzZXRfdCAqc2V0OworCQlJVEVNX1RZUEUgaXRlbTsKKwkJaW50IHJldHZhbDsKKworCQlEUk1fREVCVUcoImZpbmQgc29ja2V0ICVkLCBjb250ZXh0ID0gJWRcbiIsIGksIGNvbnRleHQpOworCisJCS8qIFZpZGVvIE1lbW9yeSAqLworCQlzZXQgPSBnbG9iYWxfcHByaXZbaV0uc2V0c1swXTsKKwkJcmV0dmFsID0gdmlhX3NldEZpcnN0KHNldCwgJml0ZW0pOworCQl3aGlsZSAocmV0dmFsKSB7CisJCQlEUk1fREVCVUcoImZyZWUgdmlkZW8gbWVtb3J5IDB4JWx4XG4iLCBpdGVtKTsKKwkJCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgaXRlbSk7CisJCQlyZXR2YWwgPSB2aWFfc2V0TmV4dChzZXQsICZpdGVtKTsKKwkJfQorCQl2aWFfc2V0RGVzdHJveShzZXQpOworCisJCS8qIEFHUCBNZW1vcnkgKi8KKwkJc2V0ID0gZ2xvYmFsX3Bwcml2W2ldLnNldHNbMV07CisJCXJldHZhbCA9IHZpYV9zZXRGaXJzdChzZXQsICZpdGVtKTsKKwkJd2hpbGUgKHJldHZhbCkgeworCQkJRFJNX0RFQlVHKCJmcmVlIGFncCBtZW1vcnkgMHglbHhcbiIsIGl0ZW0pOworCQkJdmlhX21tRnJlZU1lbSgoUE1lbUJsb2NrKSBpdGVtKTsKKwkJCXJldHZhbCA9IHZpYV9zZXROZXh0KHNldCwgJml0ZW0pOworCQl9CisJCXZpYV9zZXREZXN0cm95KHNldCk7CisJCWdsb2JhbF9wcHJpdltpXS51c2VkID0gMDsKKwl9CisJdmlhX3JlbGVhc2VfZnV0ZXgoZGV2X3ByaXYsIGNvbnRleHQpOyAKKwkKKwkJCQorI2lmIGRlZmluZWQoX19saW51eF9fKQorCS8qIExpbnV4IHNwZWNpZmljIHVudGlsIGNvbnRleHQgdHJhY2tpbmcgY29kZSBnZXRzIHBvcnRlZCB0byBCU0QgKi8KKwkvKiBMYXN0IGNvbnRleHQsIHBlcmZvcm0gY2xlYW51cCAqLworCWlmIChkZXYtPmN0eF9jb3VudCA9PSAxICYmIGRldi0+ZGV2X3ByaXZhdGUpIHsKKwkgICAgICAgIERSTV9ERUJVRygiTGFzdCBDb250ZXh0XG4iKTsKKwkJaWYgKGRldi0+aXJxKQorCQkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCQl2aWFfY2xlYW51cF9mdXRleChkZXZfcHJpdik7CisJCXZpYV9kb19jbGVhbnVwX21hcChkZXYpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKK2ludCB2aWFfbWVtX2FsbG9jKERSTV9JT0NUTF9BUkdTKQoreworCWRybV92aWFfbWVtX3QgbWVtOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbSwgKGRybV92aWFfbWVtX3QgKikgZGF0YSwgc2l6ZW9mKG1lbSkpOworCisJc3dpdGNoIChtZW0udHlwZSkgeworCWNhc2UgVklERU86CisJCWlmICh2aWFfZmJfYWxsb2MoJm1lbSkgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV92aWFfbWVtX3QgKikgZGF0YSwgbWVtLAorCQkJCSAgICAgICBzaXplb2YobWVtKSk7CisJCXJldHVybiAwOworCWNhc2UgQUdQOgorCQlpZiAodmlhX2FncF9hbGxvYygmbWVtKSA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgoZHJtX3ZpYV9tZW1fdCAqKSBkYXRhLCBtZW0sCisJCQkJICAgICAgIHNpemVvZihtZW0pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2ZiX2FsbG9jKGRybV92aWFfbWVtX3QgKiBtZW0pCit7CisJZHJtX3ZpYV9tbV90IGZiOworCVBNZW1CbG9jayBibG9jazsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICghRkJIZWFwKQorCQlyZXR1cm4gLTE7CisKKwlmYi5zaXplID0gbWVtLT5zaXplOworCWZiLmNvbnRleHQgPSBtZW0tPmNvbnRleHQ7CisKKwlibG9jayA9IHZpYV9tbUFsbG9jTWVtKEZCSGVhcCwgZmIuc2l6ZSwgNSwgMCk7CisJaWYgKGJsb2NrKSB7CisJCWZiLm9mZnNldCA9IGJsb2NrLT5vZnM7CisJCWZiLmZyZWUgPSAodW5zaWduZWQgbG9uZylibG9jazsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJREVPLCBmYi5mcmVlKSkgeworCQkJRFJNX0RFQlVHKCJhZGRpbmcgdG8gYWxsb2NhdGlvbiBzZXQgZmFpbHNcbiIpOworCQkJdmlhX21tRnJlZU1lbSgoUE1lbUJsb2NrKSBmYi5mcmVlKTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJZmIub2Zmc2V0ID0gMDsKKwkJZmIuc2l6ZSA9IDA7CisJCWZiLmZyZWUgPSAwOworCQlyZXR2YWwgPSAtMTsKKwl9CisKKwltZW0tPm9mZnNldCA9IGZiLm9mZnNldDsKKwltZW0tPmluZGV4ID0gZmIuZnJlZTsKKworCURSTV9ERUJVRygiYWxsb2MgZmIsIHNpemUgPSAlZCwgb2Zmc2V0ID0gJWRcbiIsIGZiLnNpemUsCisJCSAgKGludClmYi5vZmZzZXQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWFfYWdwX2FsbG9jKGRybV92aWFfbWVtX3QgKiBtZW0pCit7CisJZHJtX3ZpYV9tbV90IGFncDsKKwlQTWVtQmxvY2sgYmxvY2s7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoIUFncEhlYXApCisJCXJldHVybiAtMTsKKworCWFncC5zaXplID0gbWVtLT5zaXplOworCWFncC5jb250ZXh0ID0gbWVtLT5jb250ZXh0OworCisJYmxvY2sgPSB2aWFfbW1BbGxvY01lbShBZ3BIZWFwLCBhZ3Auc2l6ZSwgNSwgMCk7CisJaWYgKGJsb2NrKSB7CisJCWFncC5vZmZzZXQgPSBibG9jay0+b2ZzOworCQlhZ3AuZnJlZSA9ICh1bnNpZ25lZCBsb25nKWJsb2NrOworCQlpZiAoIWFkZF9hbGxvY19zZXQoYWdwLmNvbnRleHQsIEFHUCwgYWdwLmZyZWUpKSB7CisJCQlEUk1fREVCVUcoImFkZGluZyB0byBhbGxvY2F0aW9uIHNldCBmYWlsc1xuIik7CisJCQl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGFncC5mcmVlKTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJYWdwLm9mZnNldCA9IDA7CisJCWFncC5zaXplID0gMDsKKwkJYWdwLmZyZWUgPSAwOworCX0KKworCW1lbS0+b2Zmc2V0ID0gYWdwLm9mZnNldDsKKwltZW0tPmluZGV4ID0gYWdwLmZyZWU7CisKKwlEUk1fREVCVUcoImFsbG9jIGFncCwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZFxuIiwgYWdwLnNpemUsCisJCSAgKHVuc2lnbmVkIGludClhZ3Aub2Zmc2V0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgdmlhX21lbV9mcmVlKERSTV9JT0NUTF9BUkdTKQoreworCWRybV92aWFfbWVtX3QgbWVtOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbSwgKGRybV92aWFfbWVtX3QgKikgZGF0YSwgc2l6ZW9mKG1lbSkpOworCisJc3dpdGNoIChtZW0udHlwZSkgeworCisJY2FzZSBWSURFTzoKKwkJaWYgKHZpYV9mYl9mcmVlKCZtZW0pID09IDApCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBBR1A6CisJCWlmICh2aWFfYWdwX2ZyZWUoJm1lbSkgPT0gMCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIGludCB2aWFfZmJfZnJlZShkcm1fdmlhX21lbV90ICogbWVtKQoreworCWRybV92aWFfbW1fdCBmYjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICghRkJIZWFwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlmYi5mcmVlID0gbWVtLT5pbmRleDsKKwlmYi5jb250ZXh0ID0gbWVtLT5jb250ZXh0OworCisJaWYgKCFmYi5mcmVlKSB7CisJCXJldHVybiAtMTsKKworCX0KKworCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgZmIuZnJlZSk7CisKKwlpZiAoIWRlbF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU8sIGZiLmZyZWUpKSB7CisJCXJldHZhbCA9IC0xOworCX0KKworCURSTV9ERUJVRygiZnJlZSBmYiwgZnJlZSA9ICVsZFxuIiwgZmIuZnJlZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHZpYV9hZ3BfZnJlZShkcm1fdmlhX21lbV90ICogbWVtKQoreworCWRybV92aWFfbW1fdCBhZ3A7CisKKwlpbnQgcmV0dmFsID0gMDsKKworCWFncC5mcmVlID0gbWVtLT5pbmRleDsKKwlhZ3AuY29udGV4dCA9IG1lbS0+Y29udGV4dDsKKworCWlmICghYWdwLmZyZWUpCisJCXJldHVybiAtMTsKKworCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgYWdwLmZyZWUpOworCisJaWYgKCFkZWxfYWxsb2Nfc2V0KGFncC5jb250ZXh0LCBBR1AsIGFncC5mcmVlKSkgeworCQlyZXR2YWwgPSAtMTsKKwl9CisKKwlEUk1fREVCVUcoImZyZWUgYWdwLCBmcmVlID0gJWxkXG4iLCBhZ3AuZnJlZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3ZWZkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX3ZpYV9kcm1fbW1faF8KKyNkZWZpbmUgX3ZpYV9kcm1fbW1faF8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBjb250ZXh0OworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZnJlZTsKK30gZHJtX3ZpYV9tbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CisJdm9pZCAqdmlydHVhbDsKK30gZHJtX3ZpYV9kbWFfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzkyM2IwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYwpAQCAtMCwwICsxLDEwNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCBUaGUgVW5pY2hyb21lIFByb2plY3QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNSBUaG9tYXMgSGVsbHN0cm9tLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUihTKSwgQU5EL09SIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogVGhvbWFzIEhlbGxzdHJvbSAyMDA0LCAyMDA1LgorICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIHVzaW5nIGRvY3Mgb2J0YWluZWQgdW5kZXIgTkRBIGZyb20gVklBIEluYy4KKyAqCisgKiBEb24ndCBydW4gdGhpcyBjb2RlIGRpcmVjdGx5IG9uIGFuIEFHUCBidWZmZXIuIER1ZSB0byBjYWNoZSBwcm9ibGVtcyBpdCB3aWxsCisgKiBiZSB2ZXJ5IHNsb3cuCisgKi8KKworCisjaW5jbHVkZSAidmlhXzNkX3JlZy5oIgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX3ZlcmlmaWVyLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorCit0eXBlZGVmIGVudW17CisJc3RhdGVfY29tbWFuZCwKKwlzdGF0ZV9oZWFkZXIyLAorCXN0YXRlX2hlYWRlcjEsCisJc3RhdGVfdmhlYWRlcjUsCisJc3RhdGVfdmhlYWRlcjYsCisJc3RhdGVfZXJyb3IKK30gdmVyaWZpZXJfc3RhdGVfdDsKKworCit0eXBlZGVmIGVudW17CisJbm9fY2hlY2sgPSAwLAorCWNoZWNrX2Zvcl9oZWFkZXIyLAorCWNoZWNrX2Zvcl9oZWFkZXIxLAorCWNoZWNrX2Zvcl9oZWFkZXIyX2VyciwKKwljaGVja19mb3JfaGVhZGVyMV9lcnIsCisJY2hlY2tfZm9yX2ZpcmUsCisJY2hlY2tfel9idWZmZXJfYWRkcjAsCisJY2hlY2tfel9idWZmZXJfYWRkcjEsCisJY2hlY2tfel9idWZmZXJfYWRkcl9tb2RlLAorCWNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIwLAorCWNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIxLAorCWNoZWNrX2Rlc3RpbmF0aW9uX2FkZHJfbW9kZSwKKwljaGVja19mb3JfZHVtbXksCisJY2hlY2tfZm9yX2RkLAorCWNoZWNrX3RleHR1cmVfYWRkcjAsCisJY2hlY2tfdGV4dHVyZV9hZGRyMSwKKwljaGVja190ZXh0dXJlX2FkZHIyLAorCWNoZWNrX3RleHR1cmVfYWRkcjMsCisJY2hlY2tfdGV4dHVyZV9hZGRyNCwKKwljaGVja190ZXh0dXJlX2FkZHI1LAorCWNoZWNrX3RleHR1cmVfYWRkcjYsCisJY2hlY2tfdGV4dHVyZV9hZGRyNywKKwljaGVja190ZXh0dXJlX2FkZHI4LAorCWNoZWNrX3RleHR1cmVfYWRkcl9tb2RlLAorCWNoZWNrX2Zvcl92ZXJ0ZXhfY291bnQsCisJY2hlY2tfbnVtYmVyX3RleHVuaXRzLAorCWZvcmJpZGRlbl9jb21tYW5kCit9aGF6YXJkX3Q7CisKKy8qCisgKiBBc3NvY2lhdGVzIGVhY2ggaGF6YXJkIGFib3ZlIHdpdGggYSBwb3NzaWJsZSBtdWx0aS1jb21tYW5kCisgKiBzZXF1ZW5jZS4gRm9yIGV4YW1wbGUgYW4gYWRkcmVzcyB0aGF0IGlzIHNwbGl0IG92ZXIgbXVsdGlwbGUKKyAqIGNvbW1hbmRzIGFuZCB0aGF0IG5lZWRzIHRvIGJlIGNoZWNrZWQgYXQgdGhlIGZpcnN0IGNvbW1hbmQgCisgKiB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYW55IHBhcnQgb2YgdGhlIGFkZHJlc3MuCisgKi8KKworc3RhdGljIGRybV92aWFfc2VxdWVuY2VfdCBzZXFzW10gPSB7IAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCXpfYWRkcmVzcywKKwl6X2FkZHJlc3MsCisJel9hZGRyZXNzLAorCWRlc3RfYWRkcmVzcywKKwlkZXN0X2FkZHJlc3MsCisJZGVzdF9hZGRyZXNzLAorCW5vX3NlcXVlbmNlLAorCW5vX3NlcXVlbmNlLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCXRleF9hZGRyZXNzLAorCW5vX3NlcXVlbmNlCit9OworICAgIAordHlwZWRlZiBzdHJ1Y3R7CisJdW5zaWduZWQgaW50IGNvZGU7CisJaGF6YXJkX3QgaHo7Cit9IGh6X2luaXRfdDsKKworCisKK3N0YXRpYyBoel9pbml0X3QgaW5pdF90YWJsZTFbXSA9IHsKKwl7MHhmMiwgY2hlY2tfZm9yX2hlYWRlcjJfZXJyfSwKKwl7MHhmMCwgY2hlY2tfZm9yX2hlYWRlcjFfZXJyfSwKKwl7MHhlZSwgY2hlY2tfZm9yX2ZpcmV9LAorCXsweGNjLCBjaGVja19mb3JfZHVtbXl9LAorCXsweGRkLCBjaGVja19mb3JfZGR9LAorCXsweDAwLCBub19jaGVja30sCisJezB4MTAsIGNoZWNrX3pfYnVmZmVyX2FkZHIwfSwKKwl7MHgxMSwgY2hlY2tfel9idWZmZXJfYWRkcjF9LAorCXsweDEyLCBjaGVja196X2J1ZmZlcl9hZGRyX21vZGV9LAorCXsweDEzLCBub19jaGVja30sCisJezB4MTQsIG5vX2NoZWNrfSwKKwl7MHgxNSwgbm9fY2hlY2t9LAorCXsweDIzLCBub19jaGVja30sCisJezB4MjQsIG5vX2NoZWNrfSwKKwl7MHgzMywgbm9fY2hlY2t9LAorCXsweDM0LCBub19jaGVja30sCisJezB4MzUsIG5vX2NoZWNrfSwKKwl7MHgzNiwgbm9fY2hlY2t9LAorCXsweDM3LCBub19jaGVja30sCisJezB4MzgsIG5vX2NoZWNrfSwKKwl7MHgzOSwgbm9fY2hlY2t9LAorCXsweDNBLCBub19jaGVja30sCisJezB4M0IsIG5vX2NoZWNrfSwKKwl7MHgzQywgbm9fY2hlY2t9LAorCXsweDNELCBub19jaGVja30sCisJezB4M0UsIG5vX2NoZWNrfSwKKwl7MHg0MCwgY2hlY2tfZGVzdGluYXRpb25fYWRkcjB9LAorCXsweDQxLCBjaGVja19kZXN0aW5hdGlvbl9hZGRyMX0sCisJezB4NDIsIGNoZWNrX2Rlc3RpbmF0aW9uX2FkZHJfbW9kZX0sCisJezB4NDMsIG5vX2NoZWNrfSwKKwl7MHg0NCwgbm9fY2hlY2t9LAorCXsweDUwLCBub19jaGVja30sCisJezB4NTEsIG5vX2NoZWNrfSwKKwl7MHg1Miwgbm9fY2hlY2t9LAorCXsweDUzLCBub19jaGVja30sCisJezB4NTQsIG5vX2NoZWNrfSwKKwl7MHg1NSwgbm9fY2hlY2t9LAorCXsweDU2LCBub19jaGVja30sCisJezB4NTcsIG5vX2NoZWNrfSwKKwl7MHg1OCwgbm9fY2hlY2t9LAorCXsweDcwLCBub19jaGVja30sCisJezB4NzEsIG5vX2NoZWNrfSwKKwl7MHg3OCwgbm9fY2hlY2t9LAorCXsweDc5LCBub19jaGVja30sCisJezB4N0EsIG5vX2NoZWNrfSwKKwl7MHg3Qiwgbm9fY2hlY2t9LAorCXsweDdDLCBub19jaGVja30sCisJezB4N0QsIGNoZWNrX2Zvcl92ZXJ0ZXhfY291bnR9Cit9OworCisgICAKKwkJICAgICAgIAorc3RhdGljIGh6X2luaXRfdCBpbml0X3RhYmxlMltdID0geworCXsweGYyLCBjaGVja19mb3JfaGVhZGVyMl9lcnJ9LAorCXsweGYwLCBjaGVja19mb3JfaGVhZGVyMV9lcnJ9LAorCXsweGVlLCBjaGVja19mb3JfZmlyZX0sCisJezB4Y2MsIGNoZWNrX2Zvcl9kdW1teX0sCisJezB4MDAsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDAxLCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwMiwgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDMsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDA0LCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwNSwgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDYsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDA3LCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwOCwgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDksIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDIwLCBjaGVja190ZXh0dXJlX2FkZHIxfSwKKwl7MHgyMSwgY2hlY2tfdGV4dHVyZV9hZGRyMX0sCisJezB4MjIsIGNoZWNrX3RleHR1cmVfYWRkcjF9LAorCXsweDIzLCBjaGVja190ZXh0dXJlX2FkZHI0fSwKKwl7MHgyQiwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MkMsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDJELCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgyRSwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MkYsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDMwLCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgzMSwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MzIsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDMzLCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgzNCwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4NEIsIGNoZWNrX3RleHR1cmVfYWRkcjV9LAorCXsweDRDLCBjaGVja190ZXh0dXJlX2FkZHI2fSwKKwl7MHg1MSwgY2hlY2tfdGV4dHVyZV9hZGRyN30sCisJezB4NTIsIGNoZWNrX3RleHR1cmVfYWRkcjh9LAorCXsweDc3LCBjaGVja190ZXh0dXJlX2FkZHIyfSwKKwl7MHg3OCwgbm9fY2hlY2t9LAorCXsweDc5LCBub19jaGVja30sCisJezB4N0EsIG5vX2NoZWNrfSwKKwl7MHg3QiwgY2hlY2tfdGV4dHVyZV9hZGRyX21vZGV9LAorCXsweDdDLCBub19jaGVja30sCisJezB4N0QsIG5vX2NoZWNrfSwKKwl7MHg3RSwgbm9fY2hlY2t9LAorCXsweDdGLCBub19jaGVja30sCisJezB4ODAsIG5vX2NoZWNrfSwKKwl7MHg4MSwgbm9fY2hlY2t9LAorCXsweDgyLCBub19jaGVja30sCisJezB4ODMsIG5vX2NoZWNrfSwKKwl7MHg4NSwgbm9fY2hlY2t9LAorCXsweDg2LCBub19jaGVja30sCisJezB4ODcsIG5vX2NoZWNrfSwKKwl7MHg4OCwgbm9fY2hlY2t9LAorCXsweDg5LCBub19jaGVja30sCisJezB4OEEsIG5vX2NoZWNrfSwKKwl7MHg5MCwgbm9fY2hlY2t9LAorCXsweDkxLCBub19jaGVja30sCisJezB4OTIsIG5vX2NoZWNrfSwKKwl7MHg5Mywgbm9fY2hlY2t9Cit9OworCitzdGF0aWMgaHpfaW5pdF90IGluaXRfdGFibGUzW10gPSB7CisJezB4ZjIsIGNoZWNrX2Zvcl9oZWFkZXIyX2Vycn0sCisJezB4ZjAsIGNoZWNrX2Zvcl9oZWFkZXIxX2Vycn0sCisJezB4Y2MsIGNoZWNrX2Zvcl9kdW1teX0sCisJezB4MDAsIGNoZWNrX251bWJlcl90ZXh1bml0c30KK307CisgICAKKwkJICAgICAgIAorc3RhdGljIGhhemFyZF90IHRhYmxlMVsyNTZdOyAKK3N0YXRpYyBoYXphcmRfdCB0YWJsZTJbMjU2XTsgCitzdGF0aWMgaGF6YXJkX3QgdGFibGUzWzI1Nl07IAorCisKKworc3RhdGljIF9faW5saW5lX18gaW50CitlYXRfd29yZHMoY29uc3QgdWludDMyX3QgKipidWYsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kLCB1bnNpZ25lZCBudW1fd29yZHMpCit7CisJaWYgKCgqYnVmIC0gYnVmX2VuZCkgPj0gbnVtX3dvcmRzKSB7CisJCSpidWYgKz0gbnVtX3dvcmRzOworCQlyZXR1cm4gMDsKKwl9IAorCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiBETUEgY29tbWFuZCBidWZmZXJcbiIpOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBQYXJ0aWFsbHkgc3RvbGVuIGZyb20gZHJtX21lbW9yeS5oCisgKi8KKworc3RhdGljIF9faW5saW5lX18gZHJtX21hcF90ICoKK3ZpYV9kcm1fbG9va3VwX2FncF9tYXAgKGRybV92aWFfc3RhdGVfdCAqc2VxLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCAKKwkJCWRybV9kZXZpY2VfdCAqZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKKwlkcm1fbWFwX3QgKm1hcCA9IHNlcS0+bWFwX2NhY2hlOworCisJaWYgKG1hcCAmJiBtYXAtPm9mZnNldCA8PSBvZmZzZXQgJiYgKG9mZnNldCArIHNpemUpIDw9IChtYXAtPm9mZnNldCArIG1hcC0+c2l6ZSkpIHsKKwkJcmV0dXJuIG1hcDsKKwl9CisJCQorCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQlyX2xpc3QgPSAoZHJtX21hcF9saXN0X3QgKikgbGlzdDsKKwkJbWFwID0gcl9saXN0LT5tYXA7CisJCWlmICghbWFwKQorCQkJY29udGludWU7CisJCWlmIChtYXAtPm9mZnNldCA8PSBvZmZzZXQgJiYgKG9mZnNldCArIHNpemUpIDw9IChtYXAtPm9mZnNldCArIG1hcC0+c2l6ZSkgJiYgCisJCSAgICAhKG1hcC0+ZmxhZ3MgJiBfRFJNX1JFU1RSSUNURUQpICYmIChtYXAtPnR5cGUgPT0gX0RSTV9BR1ApKSB7CisJCQlzZXEtPm1hcF9jYWNoZSA9IG1hcDsKKwkJCXJldHVybiBtYXA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIFJlcXVpcmUgdGhhdCBhbGwgQUdQIHRleHR1cmUgbGV2ZWxzIHJlc2lkZSBpbiB0aGUgc2FtZSBBR1AgbWFwIHdoaWNoIHNob3VsZCAKKyAqIGJlIG1hcHBhYmxlIGJ5IHRoZSBjbGllbnQuIFRoaXMgaXMgbm90IGEgYmlnIHJlc3RyaWN0aW9uLgorICogRklYTUU6IFRvIGFjdHVhbGx5IGVuZm9yY2UgdGhpcyBzZWN1cml0eSBwb2xpY3kgc3RyaWN0bHksIGRybV9ybW1hcCAKKyAqIHdvdWxkIGhhdmUgdG8gd2FpdCBmb3IgZG1hIHF1aWVzY2VudCBiZWZvcmUgcmVtb3ZpbmcgYW4gQUdQIG1hcC4gCisgKiBUaGUgdmlhX2RybV9sb29rdXBfYWdwX21hcCBjYWxsIGluIHJlYWxpdHkgc2VlbXMgdG8gdGFrZQorICogdmVyeSBsaXR0bGUgQ1BVIHRpbWUuCisgKi8KKworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2ZpbmlzaF9jdXJyZW50X3NlcXVlbmNlKGRybV92aWFfc3RhdGVfdCAqY3VyX3NlcSkgCit7CisJc3dpdGNoKGN1cl9zZXEtPnVuZmluaXNoZWQpIHsKKwljYXNlIHpfYWRkcmVzczoKKwkJRFJNX0RFQlVHKCJaIEJ1ZmZlciBzdGFydCBhZGRyZXNzIGlzIDB4JXhcbiIsIGN1cl9zZXEtPnpfYWRkcik7CisJCWJyZWFrOworCWNhc2UgZGVzdF9hZGRyZXNzOgorCQlEUk1fREVCVUcoIkRlc3RpbmF0aW9uIHN0YXJ0IGFkZHJlc3MgaXMgMHgleFxuIiwgY3VyX3NlcS0+ZF9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSB0ZXhfYWRkcmVzczoKKwkJaWYgKGN1cl9zZXEtPmFncF90ZXh0dXJlKSB7CQkJIAorCQkJdW5zaWduZWQgc3RhcnQgPSBjdXJfc2VxLT50ZXhfbGV2ZWxfbG9bY3VyX3NlcS0+dGV4dHVyZV07CisJCQl1bnNpZ25lZCBlbmQgPSBjdXJfc2VxLT50ZXhfbGV2ZWxfaGlbY3VyX3NlcS0+dGV4dHVyZV07CisJCQl1bnNpZ25lZCBsb25nIGxvPX4wLCBoaT0wLCB0bXA7CisJCQl1aW50MzJfdCAqYWRkciwgKnBpdGNoLCAqaGVpZ2h0LCB0ZXg7CisJCQl1bnNpZ25lZCBpOworCisJCQlpZiAoZW5kID4gOSkgZW5kID0gOTsKKwkJCWlmIChzdGFydCA+IDkpIHN0YXJ0ID0gOTsKKworCQkJYWRkciA9JihjdXJfc2VxLT50X2FkZHJbdGV4ID0gY3VyX3NlcS0+dGV4dHVyZV1bc3RhcnRdKTsKKwkJCXBpdGNoID0gJihjdXJfc2VxLT5waXRjaFt0ZXhdW3N0YXJ0XSk7CisJCQloZWlnaHQgPSAmKGN1cl9zZXEtPmhlaWdodFt0ZXhdW3N0YXJ0XSk7CisKKwkJCWZvciAoaT1zdGFydDsgaTw9IGVuZDsgKytpKSB7CisJCQkJdG1wID0gKmFkZHIrKzsKKwkJCQlpZiAodG1wIDwgbG8pIGxvID0gdG1wOworCQkJCXRtcCArPSAoKmhlaWdodCsrIDw8ICpwaXRjaCsrKTsKKwkJCQlpZiAodG1wID4gaGkpIGhpID0gdG1wOworCQkJfQorCisJCQlpZiAoISB2aWFfZHJtX2xvb2t1cF9hZ3BfbWFwIChjdXJfc2VxLCBsbywgaGkgLSBsbywgY3VyX3NlcS0+ZGV2KSkgeworCQkJCURSTV9FUlJPUigiQUdQIHRleHR1cmUgaXMgbm90IGluIGFsbG93ZWQgbWFwXG4iKTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJfQkKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWN1cl9zZXEtPnVuZmluaXNoZWQgPSBub19zZXF1ZW5jZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IAoraW52ZXN0aWdhdGVfaGF6YXJkKCB1aW50MzJfdCBjbWQsIGhhemFyZF90IGh6LCBkcm1fdmlhX3N0YXRlX3QgKmN1cl9zZXEpCit7CisJcmVnaXN0ZXIgdWludDMyX3QgdG1wLCAqdG1wX2FkZHI7CisKKwlpZiAoY3VyX3NlcS0+dW5maW5pc2hlZCAmJiAoY3VyX3NlcS0+dW5maW5pc2hlZCAhPSBzZXFzW2h6XSkpIHsKKwkJaW50IHJldDsKKwkJaWYgKChyZXQgPSBmaW5pc2hfY3VycmVudF9zZXF1ZW5jZShjdXJfc2VxKSkpIHJldHVybiByZXQ7CisJfQorCisJc3dpdGNoKGh6KSB7CisJY2FzZSBjaGVja19mb3JfaGVhZGVyMjoKKwkJaWYgKGNtZCA9PSBIQUxDWU9OX0hFQURFUjIpIHJldHVybiAxOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX2Zvcl9oZWFkZXIxOgorCQlpZiAoKGNtZCAmIEhBTENZT05fSEVBREVSMU1BU0spID09IEhBTENZT05fSEVBREVSMSkgcmV0dXJuIDE7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfZm9yX2hlYWRlcjJfZXJyOgorCQlpZiAoY21kID09IEhBTENZT05fSEVBREVSMikgcmV0dXJuIDE7CisJCURSTV9FUlJPUigiSWxsZWdhbCBETUEgSEFMQ1lPTl9IRUFERVIyIGNvbW1hbmRcbiIpOworCQlicmVhazsKKwljYXNlIGNoZWNrX2Zvcl9oZWFkZXIxX2VycjoKKwkJaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSA9PSBIQUxDWU9OX0hFQURFUjEpIHJldHVybiAxOworCQlEUk1fRVJST1IoIklsbGVnYWwgRE1BIEhBTENZT05fSEVBREVSMSBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBjaGVja19mb3JfZmlyZToKKwkJaWYgKChjbWQgJiBIQUxDWU9OX0ZJUkVNQVNLKSA9PSBIQUxDWU9OX0ZJUkVDTUQpIHJldHVybiAxOyAKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIERNQSBIQUxDWU9OX0ZJUkVDTUQgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWNhc2UgY2hlY2tfZm9yX2R1bW15OgorCQlpZiAoSENfRFVNTVkgPT0gY21kKSByZXR1cm4gMDsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIERNQSBIQ19EVU1NWSBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBjaGVja19mb3JfZGQ6CisJCWlmICgweGRkZGRkZGRkID09IGNtZCkgcmV0dXJuIDA7CisJCURSTV9FUlJPUigiSWxsZWdhbCBETUEgMHhkZGRkZGRkZCBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBjaGVja196X2J1ZmZlcl9hZGRyMDoKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHpfYWRkcmVzczsKKwkJY3VyX3NlcS0+el9hZGRyID0gKGN1cl9zZXEtPnpfYWRkciAmIDB4RkYwMDAwMDApIHwKKwkJCShjbWQgJiAweDAwRkZGRkZGKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja196X2J1ZmZlcl9hZGRyMToKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHpfYWRkcmVzczsKKwkJY3VyX3NlcS0+el9hZGRyID0gKGN1cl9zZXEtPnpfYWRkciAmIDB4MDBGRkZGRkYpIHwKKwkJCSgoY21kICYgMHhGRikgPDwgMjQpOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3pfYnVmZmVyX2FkZHJfbW9kZToKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHpfYWRkcmVzczsKKwkJaWYgKChjbWQgJiAweDAwMDBDMDAwKSA9PSAwKSByZXR1cm4gMDsKKwkJRFJNX0VSUk9SKCJBdHRlbXB0IHRvIHBsYWNlIFogYnVmZmVyIGluIHN5c3RlbSBtZW1vcnlcbiIpOworCQlyZXR1cm4gMjsKKwljYXNlIGNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIwOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gZGVzdF9hZGRyZXNzOworCQljdXJfc2VxLT5kX2FkZHIgPSAoY3VyX3NlcS0+ZF9hZGRyICYgMHhGRjAwMDAwMCkgfAorCQkJKGNtZCAmIDB4MDBGRkZGRkYpOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIxOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gZGVzdF9hZGRyZXNzOworCQljdXJfc2VxLT5kX2FkZHIgPSAoY3VyX3NlcS0+ZF9hZGRyICYgMHgwMEZGRkZGRikgfAorCQkJKChjbWQgJiAweEZGKSA8PCAyNCk7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfZGVzdGluYXRpb25fYWRkcl9tb2RlOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gZGVzdF9hZGRyZXNzOworCQlpZiAoKGNtZCAmIDB4MDAwMEMwMDApID09IDApIHJldHVybiAwOworCQlEUk1fRVJST1IoIkF0dGVtcHQgdG8gcGxhY2UgM0QgZHJhd2luZyBidWZmZXIgaW4gc3lzdGVtIG1lbW9yeVxuIik7CisJCXJldHVybiAyOwkgICAgCisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHIwOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCXRtcCA9IChjbWQgPj4gMjQpOworCQl0bXBfYWRkciA9ICZjdXJfc2VxLT50X2FkZHJbY3VyX3NlcS0+dGV4dHVyZV1bdG1wXTsKKwkJKnRtcF9hZGRyID0gKCp0bXBfYWRkciAmIDB4RkYwMDAwMDApIHwgKGNtZCAmIDB4MDBGRkZGRkYpOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjE6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJdG1wID0gKChjbWQgPj4gMjQpIC0gMHgyMCk7CisJCXRtcCArPSB0bXAgPDwgMTsKKwkJdG1wX2FkZHIgPSAmY3VyX3NlcS0+dF9hZGRyW2N1cl9zZXEtPnRleHR1cmVdW3RtcF07CisJCSp0bXBfYWRkciA9ICgqdG1wX2FkZHIgJiAweDAwRkZGRkZGKSB8ICgoY21kICYgMHhGRikgPDwgMjQpOworCQl0bXBfYWRkcisrOworCQkqdG1wX2FkZHIgPSAoKnRtcF9hZGRyICYgMHgwMEZGRkZGRikgfCAoKGNtZCAmIDB4RkYwMCkgPDwgMTYpOworCQl0bXBfYWRkcisrOworCQkqdG1wX2FkZHIgPSAoKnRtcF9hZGRyICYgMHgwMEZGRkZGRikgfCAoKGNtZCAmIDB4RkYwMDAwKSA8PCA4KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHIyOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCWN1cl9zZXEtPnRleF9sZXZlbF9sb1t0bXAgPSBjdXJfc2VxLT50ZXh0dXJlXSA9IGNtZCAmIDB4M0Y7CisJCWN1cl9zZXEtPnRleF9sZXZlbF9oaVt0bXBdID0gKGNtZCAmIDB4RkMwKSA+PiA2OworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjM6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJdG1wID0gKChjbWQgPj4gMjQpIC0gMHgyQik7CisJCWN1cl9zZXEtPnBpdGNoW2N1cl9zZXEtPnRleHR1cmVdW3RtcF0gPSAoY21kICYgMHgwMEYwMDAwMCkgPj4gMjA7CisJCWlmICghdG1wICYmIChjbWQgJiAweDAwMEZGRkZGKSkgeworCQkJRFJNX0VSUk9SKCJVbmltcGxlbWVudGVkIHRleHR1cmUgbGV2ZWwgMCBwaXRjaCBtb2RlLlxuIik7CisJCQlyZXR1cm4gMjsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjQ6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJdG1wX2FkZHIgPSAmY3VyX3NlcS0+dF9hZGRyW2N1cl9zZXEtPnRleHR1cmVdWzldOworCQkqdG1wX2FkZHIgPSAoKnRtcF9hZGRyICYgMHgwMEZGRkZGRikgfCAoKGNtZCAmIDB4RkYpIDw8IDI0KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHI1OgorCWNhc2UgY2hlY2tfdGV4dHVyZV9hZGRyNjoKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHRleF9hZGRyZXNzOworCQkvKgorCQkgKiBUZXh0dXJlIHdpZHRoLiBXZSBkb24ndCBjYXJlIHNpbmNlIHdlIGhhdmUgdGhlIHBpdGNoLgorCQkgKi8gIAorCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjc6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJdG1wX2FkZHIgPSAmKGN1cl9zZXEtPmhlaWdodFtjdXJfc2VxLT50ZXh0dXJlXVswXSk7CisJCXRtcF9hZGRyWzVdID0gMSA8PCAoKGNtZCAmIDB4MDBGMDAwMDApID4+IDIwKTsKKwkJdG1wX2FkZHJbNF0gPSAxIDw8ICgoY21kICYgMHgwMDBGMDAwMCkgPj4gMTYpOworCQl0bXBfYWRkclszXSA9IDEgPDwgKChjbWQgJiAweDAwMDBGMDAwKSA+PiAxMik7CisJCXRtcF9hZGRyWzJdID0gMSA8PCAoKGNtZCAmIDB4MDAwMDBGMDApID4+IDgpOworCQl0bXBfYWRkclsxXSA9IDEgPDwgKChjbWQgJiAweDAwMDAwMEYwKSA+PiA0KTsKKwkJdG1wX2FkZHJbMF0gPSAxIDw8IChjbWQgJiAweDAwMDAwMDBGKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHI4OgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCXRtcF9hZGRyID0gJihjdXJfc2VxLT5oZWlnaHRbY3VyX3NlcS0+dGV4dHVyZV1bMF0pOworCQl0bXBfYWRkcls5XSA9IDEgPDwgKChjbWQgJiAweDAwMDBGMDAwKSA+PiAxMik7CisJICAgICAgICB0bXBfYWRkcls4XSA9IDEgPDwgKChjbWQgJiAweDAwMDAwRjAwKSA+PiA4KTsKKwkJdG1wX2FkZHJbN10gPSAxIDw8ICgoY21kICYgMHgwMDAwMDBGMCkgPj4gNCk7CisJCXRtcF9hZGRyWzZdID0gMSA8PCAoY21kICYgMHgwMDAwMDAwRik7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfdGV4dHVyZV9hZGRyX21vZGU6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJaWYgKCAyID09ICh0bXAgPSBjbWQgJiAweDAwMDAwMDAzKSkgeworCQkJRFJNX0VSUk9SKCJBdHRlbXB0IHRvIGZldGNoIHRleHR1cmUgZnJvbSBzeXN0ZW0gbWVtb3J5LlxuIik7IAorCQkJcmV0dXJuIDI7CisJCX0KKwkJY3VyX3NlcS0+YWdwX3RleHR1cmUgPSAodG1wID09IDMpOworCQljdXJfc2VxLT50ZXhfcGFsZXR0ZV9zaXplW2N1cl9zZXEtPnRleHR1cmVdID0gCisJCQkoY21kID4+IDE2KSAmIDB4MDAwMDAwMDA3OworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX2Zvcl92ZXJ0ZXhfY291bnQ6CisJCWN1cl9zZXEtPnZlcnRleF9jb3VudCA9IGNtZCAmIDB4MDAwMEZGRkY7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfbnVtYmVyX3RleHVuaXRzOgorCSAgICAgICAgY3VyX3NlcS0+bXVsdGl0ZXggPSAoY21kID4+IDMpICYgMTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIERNQSBkYXRhOiAweCV4XG4iLCBjbWQpOworCQlyZXR1cm4gMjsKKwl9CisJcmV0dXJuIDI7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gaW50Cit2aWFfY2hlY2tfcHJpbV9saXN0KHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCwKKwkJICAgIGRybV92aWFfc3RhdGVfdCAqY3VyX3NlcSkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgY3VyX3NlcS0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBhX2ZpcmUsIGJjbWQgLCBkd19jb3VudDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaGF2ZV9maXJlOworCWNvbnN0IHVpbnQzMl90ICpidWYgPSAqYnVmZmVyOworCisJd2hpbGUoYnVmIDwgYnVmX2VuZCkgeworCSAgICAgICAgaGF2ZV9maXJlID0gMDsKKwkJaWYgKChidWZfZW5kIC0gYnVmKSA8IDIpIHsKKwkJCURSTV9FUlJPUigiVW5leHBlY3RlZCB0ZXJtaW5hdGlvbiBvZiBwcmltaXRpdmUgbGlzdC5cbiIpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoKmJ1ZiAmIEhDX0FDTURfTUFTSykgIT0gSENfQUNNRF9IQ21kQikgYnJlYWs7CisJCWJjbWQgPSAqYnVmKys7CisJCWlmICgoKmJ1ZiAmIEhDX0FDTURfTUFTSykgIT0gSENfQUNNRF9IQ21kQSkgeworCQkJRFJNX0VSUk9SKCJFeHBlY3RlZCBWZXJ0ZXggTGlzdCBBIGNvbW1hbmQsIGdvdCAweCV4XG4iLAorCQkJCSAgKmJ1Zik7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJYV9maXJlID0gKmJ1ZisrIHwgSENfSFBMRU5EX01BU0sgfCBIQ19IUE1WYWxpZE5fTUFTSyB8IEhDX0hFM0ZpcmVfTUFTSzsJCisJCisJCS8qCisJCSAqIEhvdyBtYW55IGR3b3JkcyBwZXIgdmVydGV4ID8KKwkJICovIAorCQkKKwkJaWYgKGN1cl9zZXEtPmFncCAmJiAoKGJjbWQgJiAoMHhGIDw8IDExKSkgPT0gMCkpIHsKKwkJCURSTV9FUlJPUigiSWxsZWdhbCBCIGNvbW1hbmQgdmVydGV4IGRhdGEgZm9yIEFHUC5cbiIpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9IAorCisJCWR3X2NvdW50ID0gMDsKKwkJaWYgKGJjbWQgJiAoMSA8PCA3KSkgZHdfY291bnQgKz0gKGN1cl9zZXEtPm11bHRpdGV4KSA/IDI6MTsKKwkJaWYgKGJjbWQgJiAoMSA8PCA4KSkgZHdfY291bnQgKz0gKGN1cl9zZXEtPm11bHRpdGV4KSA/IDI6MTsKKwkJaWYgKGJjbWQgJiAoMSA8PCA5KSkgZHdfY291bnQrKzsKKwkJaWYgKGJjbWQgJiAoMSA8PCAxMCkpIGR3X2NvdW50Kys7CisJCWlmIChiY21kICYgKDEgPDwgMTEpKSBkd19jb3VudCsrOworCQlpZiAoYmNtZCAmICgxIDw8IDEyKSkgZHdfY291bnQrKzsKKwkJaWYgKGJjbWQgJiAoMSA8PCAxMykpIGR3X2NvdW50Kys7CisJCWlmIChiY21kICYgKDEgPDwgMTQpKSBkd19jb3VudCsrOworCisJCXdoaWxlKGJ1ZiA8IGJ1Zl9lbmQpIHsKKwkJCWlmICgqYnVmID09IGFfZmlyZSkgeworCQkJCWlmIChkZXZfcHJpdi0+bnVtX2ZpcmVfb2Zmc2V0cyA+PSBWSUFfRklSRV9CVUZfU0laRSkgeworCQkJCQlEUk1fRVJST1IoIkZpcmUgb2Zmc2V0IGJ1ZmZlciBmdWxsLlxuIik7CisJCQkJCXJldCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZXZfcHJpdi0+ZmlyZV9vZmZzZXRzW2Rldl9wcml2LT5udW1fZmlyZV9vZmZzZXRzKytdID0gYnVmOworCQkJICAgICAgICBoYXZlX2ZpcmUgPSAxOworCQkJCWJ1ZisrOworCQkJCWlmIChidWYgPCBidWZfZW5kICYmICpidWYgPT0gYV9maXJlKSAKKwkJCQkJYnVmKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKCpidWYgPT0gSEFMQ1lPTl9IRUFERVIyKSB8fCAKKwkJCSAgICAoKCpidWYgJiBIQUxDWU9OX0ZJUkVNQVNLKSA9PSBIQUxDWU9OX0ZJUkVDTUQpKSB7CisJCQkJRFJNX0VSUk9SKCJNaXNzaW5nIFZlcnRleCBGaXJlIGNvbW1hbmQsICIKKwkJCQkJICAiU3RyYXkgVmVydGV4IEZpcmUgY29tbWFuZCAgb3IgdmVyaWZpZXIgIgorCQkJCQkgICJsb3N0IHN5bmMuXG4iKTsKKwkJCQlyZXQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKChyZXQgPSBlYXRfd29yZHMoJmJ1ZiwgYnVmX2VuZCwgZHdfY291bnQpKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoYnVmID49IGJ1Zl9lbmQgJiYgIWhhdmVfZmlyZSkgeworCQkJRFJNX0VSUk9SKCJNaXNzaW5nIFZlcnRleCBGaXJlIGNvbW1hbmQgb3IgdmVyaWZpZXIgIgorCQkJCSAgImxvc3Qgc3luYy5cbiIpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjdXJfc2VxLT5hZ3AgJiYgKChidWYgLSBjdXJfc2VxLT5idWZfc3RhcnQpICYgMHgwMSkpIHsKKwkJCURSTV9FUlJPUigiQUdQIFByaW1pdGl2ZSBsaXN0IGVuZCBtaXNhbGlnbmVkLlxuIik7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9IAorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHJldDsKK30KKworCisJCSAgICAgICAKKworCitzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Cit2aWFfY2hlY2tfaGVhZGVyMiggdWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kLCAKKwkJICAgZHJtX3ZpYV9zdGF0ZV90ICpoY19zdGF0ZSkKK3sKKwl1aW50MzJfdCBjbWQ7CisJaW50IGh6X21vZGU7CisJaGF6YXJkX3QgaHo7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisJY29uc3QgaGF6YXJkX3QgKmh6X3RhYmxlOworCisKKwlpZiAoKGJ1Zl9lbmQgLSBidWYpIDwgMikgeworCQlEUk1fRVJST1IoIklsbGVnYWwgdGVybWluYXRpb24gb2YgRE1BIEhBTENZT05fSEVBREVSMiBzZXF1ZW5jZS5cbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWJ1ZisrOworCWNtZCA9ICgqYnVmKysgJiAweEZGRkYwMDAwKSA+PiAxNjsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIEhDX1BhcmFUeXBlX0NtZFZkYXRhOgorCQlpZiAodmlhX2NoZWNrX3ByaW1fbGlzdCgmYnVmLCBidWZfZW5kLCBoY19zdGF0ZSApKSAKKwkJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkJKmJ1ZmZlciA9IGJ1ZjsKKwkJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7CisJY2FzZSBIQ19QYXJhVHlwZV9Ob3RUZXg6CisJCWh6X3RhYmxlID0gdGFibGUxOworCQlicmVhazsKKwljYXNlIEhDX1BhcmFUeXBlX1RleDoKKwkJaGNfc3RhdGUtPnRleHR1cmUgPSAwOworCQloel90YWJsZSA9IHRhYmxlMjsKKwkJYnJlYWs7CisJY2FzZSAoSENfUGFyYVR5cGVfVGV4IHwgKEhDX1N1YlR5cGVfVGV4MSA8PCA4KSk6CisJCWhjX3N0YXRlLT50ZXh0dXJlID0gMTsKKwkJaHpfdGFibGUgPSB0YWJsZTI7CisJCWJyZWFrOworCWNhc2UgKEhDX1BhcmFUeXBlX1RleCB8IChIQ19TdWJUeXBlX1RleEdlbmVyYWwgPDwgOCkpOgorCQloel90YWJsZSA9IHRhYmxlMzsKKwkJYnJlYWs7CisJY2FzZSBIQ19QYXJhVHlwZV9BdXRvOgorCQlpZiAoZWF0X3dvcmRzKCZidWYsIGJ1Zl9lbmQsIDIpKQorCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQkqYnVmZmVyID0gYnVmOworCQlyZXR1cm4gc3RhdGVfY29tbWFuZDsKKwljYXNlIChIQ19QYXJhVHlwZV9QYWxldHRlIHwgKEhDX1N1YlR5cGVfU3RpcHBsZSA8PCA4KSk6CisJCWlmIChlYXRfd29yZHMoJmJ1ZiwgYnVmX2VuZCwgMzIpKQorCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQkqYnVmZmVyID0gYnVmOworCQlyZXR1cm4gc3RhdGVfY29tbWFuZDsKKwljYXNlIChIQ19QYXJhVHlwZV9QYWxldHRlIHwgKEhDX1N1YlR5cGVfVGV4UGFsZXR0ZTAgPDwgOCkpOgorCWNhc2UgKEhDX1BhcmFUeXBlX1BhbGV0dGUgfCAoSENfU3ViVHlwZV9UZXhQYWxldHRlMSA8PCA4KSk6CisJCURSTV9FUlJPUigiVGV4dHVyZSBwYWxldHRlcyBhcmUgcmVqZWN0ZWQgYmVjYXVzZSBvZiAiCisJCQkgICJsYWNrIG9mIGluZm8gaG93IHRvIGRldGVybWluZSB0aGVpciBzaXplLlxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwljYXNlIChIQ19QYXJhVHlwZV9QYWxldHRlIHwgKEhDX1N1YlR5cGVfRm9nVGFibGUgPDwgOCkpOgorCQlEUk1fRVJST1IoIkZvZyBmYWN0b3IgcGFsZXR0ZXMgYXJlIHJlamVjdGVkIGJlY2F1c2Ugb2YgIgorCQkJICAibGFjayBvZiBpbmZvIGhvdyB0byBkZXRlcm1pbmUgdGhlaXIgc2l6ZS5cbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJZGVmYXVsdDoKKworCQkvKgorCQkgKiBUaGVyZSBhcmUgc29tZSB1bmltcGxlbWVudGVkIEhDX1BhcmFUeXBlcyBoZXJlLCB0aGF0CisJCSAqIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgaWYgdGhlIE1lc2EgZHJpdmVyIGlzIGV4dGVuZGVkLgorCQkgKi8KKworCQlEUk1fRVJST1IoIkludmFsaWQgb3IgdW5pbXBsZW1lbnRlZCBIQUxDWU9OX0hFQURFUjIgIgorCQkJICAiRE1BIHN1YmNvbW1hbmQ6IDB4JXguIFByZXZpb3VzIGR3b3JkOiAweCV4XG4iLCAKKwkJCSAgY21kLCAqKGJ1ZiAtMikpOworCQkqYnVmZmVyID0gYnVmOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCisJd2hpbGUoYnVmIDwgYnVmX2VuZCkgeworCQljbWQgPSAqYnVmKys7CisJCWlmICgoaHogPSBoel90YWJsZVtjbWQgPj4gMjRdKSkgeworCQkJaWYgKChoel9tb2RlID0gaW52ZXN0aWdhdGVfaGF6YXJkKGNtZCwgaHosIGhjX3N0YXRlKSkpIHsKKwkJCQlpZiAoaHpfbW9kZSA9PSAxKSB7CisJCQkJCWJ1Zi0tOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQkJfQorCQl9IGVsc2UgaWYgKGhjX3N0YXRlLT51bmZpbmlzaGVkICYmIAorCQkJICAgZmluaXNoX2N1cnJlbnRfc2VxdWVuY2UoaGNfc3RhdGUpKSB7CisJCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJCX0KKwl9CisJaWYgKGhjX3N0YXRlLT51bmZpbmlzaGVkICYmIGZpbmlzaF9jdXJyZW50X3NlcXVlbmNlKGhjX3N0YXRlKSkgeworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9wYXJzZV9oZWFkZXIyKCBkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCwKKwkJICAgaW50ICpmaXJlX2NvdW50KQoreworCXVpbnQzMl90IGNtZDsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKwljb25zdCB1aW50MzJfdCAqbmV4dF9maXJlOyAKKwlpbnQgYnVyc3QgPSAwOworCisJbmV4dF9maXJlID0gZGV2X3ByaXYtPmZpcmVfb2Zmc2V0c1sqZmlyZV9jb3VudF07CisJYnVmKys7CisJY21kID0gKCpidWYgJiAweEZGRkYwMDAwKSA+PiAxNjsKKwlWSUFfV1JJVEUoSENfUkVHX1RSQU5TX1NFVCArIEhDX1JFR19CQVNFLCAqYnVmKyspOworCXN3aXRjaChjbWQpIHsKKwljYXNlIEhDX1BhcmFUeXBlX0NtZFZkYXRhOgorCQl3aGlsZSAoKGJ1ZiA8IGJ1Zl9lbmQpICYmCisJCSAgICAgICAoKmZpcmVfY291bnQgPCBkZXZfcHJpdi0+bnVtX2ZpcmVfb2Zmc2V0cykgJiYgCisJCSAgICAgICAoKmJ1ZiAmIEhDX0FDTURfTUFTSykgPT0gSENfQUNNRF9IQ21kQiApIHsKKwkJCXdoaWxlKGJ1ZiA8PSBuZXh0X2ZpcmUpIHsKKwkJCQlWSUFfV1JJVEUoSENfUkVHX1RSQU5TX1NQQUNFICsgSENfUkVHX0JBU0UgKyAoYnVyc3QgJiA2MyksICpidWYrKyk7CisJCQkJYnVyc3QgKz0gNDsKKwkJCX0KKwkJCWlmICggKCBidWYgPCBidWZfZW5kICkgJiYgKCgqYnVmICYgSEFMQ1lPTl9GSVJFTUFTSykgPT0gSEFMQ1lPTl9GSVJFQ01EKSkKKwkJCQlidWYrKzsKKworCQkJaWYgKCsrKCpmaXJlX2NvdW50KSA8IGRldl9wcml2LT5udW1fZmlyZV9vZmZzZXRzKSAKKwkJCQluZXh0X2ZpcmUgPSBkZXZfcHJpdi0+ZmlyZV9vZmZzZXRzWypmaXJlX2NvdW50XTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQl3aGlsZShidWYgPCBidWZfZW5kKSB7CisJCQkKKwkJCWlmICggKmJ1ZiA9PSBIQ19IRUFERVIyIHx8CisJCQkgICAgICgqYnVmICYgSEFMQ1lPTl9IRUFERVIxTUFTSykgPT0gSEFMQ1lPTl9IRUFERVIxICB8fAorCQkJICAgICAoKmJ1ZiAmIFZJQV9WSURFT01BU0spID09IFZJQV9WSURFT19IRUFERVI1IHx8CisJCQkgICAgICgqYnVmICYgVklBX1ZJREVPTUFTSykgPT0gVklBX1ZJREVPX0hFQURFUjYgKSBicmVhazsKKwkJCQorCQkJVklBX1dSSVRFKEhDX1JFR19UUkFOU19TUEFDRSArIEhDX1JFR19CQVNFICsgKGJ1cnN0ICYgNjMpLCAqYnVmKyspOworCQkJYnVyc3QgKz00OworCQl9CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7Cit9CisKKworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK3ZlcmlmeV9tbWlvX2FkZHJlc3MoIHVpbnQzMl90IGFkZHJlc3MpCit7CisJaWYgKChhZGRyZXNzID4gMHgzRkYpICYmIChhZGRyZXNzIDwgMHhDMDAgKSkgeworCQlEUk1fRVJST1IoIkludmFsaWQgVklERU8gRE1BIGNvbW1hbmQuICIKKwkJCSAgIkF0dGVtcHQgdG8gYWNjZXNzIDNELSBvciBjb21tYW5kIGJ1cnN0IGFyZWEuXG4iKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmICgoYWRkcmVzcyA+IDB4Q0ZGKSAmJiAoYWRkcmVzcyA8IDB4MTMwMCkpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIFZJREVPIERNQSBjb21tYW5kLiAiCisJCQkgICJBdHRlbXB0IHRvIGFjY2VzcyBQQ0kgRE1BIGFyZWEuXG4iKTsKKwkJcmV0dXJuIDE7CQkKKwl9IGVsc2UgaWYgKGFkZHJlc3MgPiAweDEzRkYgKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBWSURFTyBETUEgY29tbWFuZC4gIgorCQkJICAiQXR0ZW1wdCB0byBhY2Nlc3MgVkdBIHJlZ2lzdGVycy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAordmVyaWZ5X3ZpZGVvX3RhaWwoIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCwgdWludDMyX3QgZHdvcmRzKSAKK3sKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKworCWlmIChidWZfZW5kIC0gYnVmIDwgZHdvcmRzKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiB2aWRlbyBjb21tYW5kLlxuIik7CisJCXJldHVybiAxOworCX0KKwl3aGlsZSAoZHdvcmRzLS0pIHsKKwkJaWYgKCpidWYrKykgeworCQkJRFJNX0VSUk9SKCJJbGxlZ2FsIHZpZGVvIGNvbW1hbmQgdGFpbC5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJKmJ1ZmZlciA9IGJ1ZjsKKwlyZXR1cm4gMDsKK30KKwkJCisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9jaGVja19oZWFkZXIxKCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQgKQoreworCXVpbnQzMl90IGNtZDsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKwl2ZXJpZmllcl9zdGF0ZV90IHJldCA9IHN0YXRlX2NvbW1hbmQ7CisKKwl3aGlsZSAoYnVmIDwgYnVmX2VuZCkgeworCQljbWQgPSAqYnVmOworCQlpZiAoKGNtZCA+ICgoMHgzRkYgPj4gMikgfCBIQUxDWU9OX0hFQURFUjEpKSAmJgorCQkgICAgKGNtZCA8ICgoMHhDMDAgPj4gMikgfCBIQUxDWU9OX0hFQURFUjEpKSkgewkJCQorCQkJaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSAhPSBIQUxDWU9OX0hFQURFUjEpIAorCQkJCWJyZWFrOworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIEhBTENZT05fSEVBREVSMSBjb21tYW5kLiAiCisJCQkJICAiQXR0ZW1wdCB0byBhY2Nlc3MgM0QtIG9yIGNvbW1hbmQgYnVyc3QgYXJlYS5cbiIpOworCQkJcmV0ID0gc3RhdGVfZXJyb3I7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChjbWQgPiAoKDB4Q0ZGID4+IDIpIHwgSEFMQ1lPTl9IRUFERVIxKSkgeworCQkJaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSAhPSBIQUxDWU9OX0hFQURFUjEpIAorCQkJCWJyZWFrOworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIEhBTENZT05fSEVBREVSMSBjb21tYW5kLiAiCisJCQkJICAiQXR0ZW1wdCB0byBhY2Nlc3MgVkdBIHJlZ2lzdGVycy5cbiIpOworCQkJcmV0ID0gc3RhdGVfZXJyb3I7CisJCQlicmVhazsJCQkKKwkJfSBlbHNlIHsJCQkKKwkJCWJ1ZiArPSAyOworCQl9CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAordmlhX3BhcnNlX2hlYWRlcjEoIGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kICkKK3sKKwlyZWdpc3RlciB1aW50MzJfdCBjbWQ7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisKKwl3aGlsZSAoYnVmIDwgYnVmX2VuZCkgeworCQljbWQgPSAqYnVmOworCQlpZiAoKGNtZCAmIEhBTENZT05fSEVBREVSMU1BU0spICE9IEhBTENZT05fSEVBREVSMSkgYnJlYWs7CisJCVZJQV9XUklURSggKGNtZCAmIH5IQUxDWU9OX0hFQURFUjFNQVNLKSA8PCAyLCAqKytidWYpOyAKKwkJYnVmKys7CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9jaGVja192aGVhZGVyNSggdWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kICkKK3sKKwl1aW50MzJfdCBkYXRhOworCWNvbnN0IHVpbnQzMl90ICpidWYgPSAqYnVmZmVyOworCisJaWYgKGJ1Zl9lbmQgLSBidWYgPCA0KSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiB2aWRlbyBoZWFkZXI1IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCisJZGF0YSA9ICpidWYrKyAmIH5WSUFfVklERU9NQVNLOworCWlmICh2ZXJpZnlfbW1pb19hZGRyZXNzKGRhdGEpKQorCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisKKwlkYXRhID0gKmJ1ZisrOworCWlmICgqYnVmKysgIT0gMHgwMEY1MDAwMCkgeworCQlEUk1fRVJST1IoIklsbGVnYWwgaGVhZGVyNSBoZWFkZXIgZGF0YVxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwl9CisJaWYgKCpidWYrKyAhPSAweDAwMDAwMDAwKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCBoZWFkZXI1IGhlYWRlciBkYXRhXG4iKTsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCX0KKwlpZiAoZWF0X3dvcmRzKCZidWYsIGJ1Zl9lbmQsIGRhdGEpKSAKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCWlmICgoZGF0YSAmIDMpICYmIHZlcmlmeV92aWRlb190YWlsKCZidWYsIGJ1Zl9lbmQsIDQgLSAoZGF0YSAmIDMpKSkgCisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkqYnVmZmVyID0gYnVmOworCXJldHVybiBzdGF0ZV9jb21tYW5kOworCSAgICAgICAKK30gCisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9wYXJzZV92aGVhZGVyNSggZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQgKQoreworICB1aW50MzJfdCBhZGRyLCBjb3VudCwgaTsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKwkKKwlhZGRyID0gKmJ1ZisrICYgflZJQV9WSURFT01BU0s7CisJaSA9IGNvdW50ID0gKmJ1ZjsKKwlidWYgKz0gMzsKKwl3aGlsZShpLS0pIHsKKwkJVklBX1dSSVRFKGFkZHIsICpidWYrKyk7CisJfQorCWlmIChjb3VudCAmIDMpIGJ1ZiArPSA0IC0gKGNvdW50ICYgMyk7CisJKmJ1ZmZlciA9IGJ1ZjsKKwlyZXR1cm4gc3RhdGVfY29tbWFuZDsJICAgICAgIAorfSAKKworCitzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Cit2aWFfY2hlY2tfdmhlYWRlcjYoIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCApCit7CisJdWludDMyX3QgZGF0YTsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKwl1aW50MzJfdCBpOworCisKKwlpZiAoYnVmX2VuZCAtIGJ1ZiA8IDQpIHsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIHRlcm1pbmF0aW9uIG9mIHZpZGVvIGhlYWRlcjYgY29tbWFuZFxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwl9CisJYnVmKys7CisJZGF0YSA9ICpidWYrKzsKKwlpZiAoKmJ1ZisrICE9IDB4MDBGNjAwMDApIHsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIGhlYWRlcjYgaGVhZGVyIGRhdGFcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWlmICgqYnVmKysgIT0gMHgwMDAwMDAwMCkgeworCQlEUk1fRVJST1IoIklsbGVnYWwgaGVhZGVyNiBoZWFkZXIgZGF0YVxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwl9CisJaWYgKChidWZfZW5kIC0gYnVmKSA8IChkYXRhIDw8IDEpKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiB2aWRlbyBoZWFkZXI2IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWZvciAoaT0wOyBpPGRhdGE7ICsraSkgeworCQlpZiAodmVyaWZ5X21taW9fYWRkcmVzcygqYnVmKyspKQorCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQlidWYrKzsKKwl9CisJZGF0YSA8PD0gMTsKKwlpZiAoKGRhdGEgJiAzKSAmJiB2ZXJpZnlfdmlkZW9fdGFpbCgmYnVmLCBidWZfZW5kLCA0IC0gKGRhdGEgJiAzKSkpCisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkqYnVmZmVyID0gYnVmOworCXJldHVybiBzdGF0ZV9jb21tYW5kOworfSAKKworc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAordmlhX3BhcnNlX3ZoZWFkZXI2KCBkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCApCit7CisKKyAgdWludDMyX3QgYWRkciwgY291bnQsIGk7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisKKwlpID0gY291bnQgPSAqKytidWY7CisJYnVmICs9IDM7CisJd2hpbGUoaS0tKSB7CisJCWFkZHIgPSAqYnVmKys7CisJCVZJQV9XUklURShhZGRyLCAqYnVmKyspOworCX0KKwljb3VudCA8PD0gMTsKKwlpZiAoY291bnQgJiAzKSBidWYgKz0gNCAtIChjb3VudCAmIDMpOworCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7Cit9IAorCisKKworaW50IAordmlhX3ZlcmlmeV9jb21tYW5kX3N0cmVhbShjb25zdCB1aW50MzJfdCAqIGJ1ZiwgdW5zaWduZWQgaW50IHNpemUsIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICBpbnQgYWdwKQoreworCisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3ZpYV9zdGF0ZV90ICpoY19zdGF0ZSA9ICZkZXZfcHJpdi0+aGNfc3RhdGU7CisJZHJtX3ZpYV9zdGF0ZV90IHNhdmVkX3N0YXRlID0gKmhjX3N0YXRlOworCXVpbnQzMl90IGNtZDsKKwljb25zdCB1aW50MzJfdCAqYnVmX2VuZCA9IGJ1ZiArICggc2l6ZSA+PiAyICk7CisJdmVyaWZpZXJfc3RhdGVfdCBzdGF0ZSA9IHN0YXRlX2NvbW1hbmQ7CisJaW50IHByb19ncm91cF9hID0gZGV2X3ByaXYtPnByb19ncm91cF9hOworCQorCWhjX3N0YXRlLT5kZXYgPSBkZXY7CisJaGNfc3RhdGUtPnVuZmluaXNoZWQgPSBub19zZXF1ZW5jZTsKKwloY19zdGF0ZS0+bWFwX2NhY2hlID0gTlVMTDsKKwloY19zdGF0ZS0+YWdwID0gYWdwOworCWhjX3N0YXRlLT5idWZfc3RhcnQgPSBidWY7CisJZGV2X3ByaXYtPm51bV9maXJlX29mZnNldHMgPSAwOworCisJd2hpbGUgKGJ1ZiA8IGJ1Zl9lbmQpIHsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2Ugc3RhdGVfaGVhZGVyMjoKKwkJICBzdGF0ZSA9IHZpYV9jaGVja19oZWFkZXIyKCAmYnVmLCBidWZfZW5kLCBoY19zdGF0ZSApOworCQkJYnJlYWs7CisJCWNhc2Ugc3RhdGVfaGVhZGVyMToKKwkJCXN0YXRlID0gdmlhX2NoZWNrX2hlYWRlcjEoICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX3ZoZWFkZXI1OgorCQkJc3RhdGUgPSB2aWFfY2hlY2tfdmhlYWRlcjUoICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX3ZoZWFkZXI2OgorCQkJc3RhdGUgPSB2aWFfY2hlY2tfdmhlYWRlcjYoICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX2NvbW1hbmQ6CisJCQlpZiAoSEFMQ1lPTl9IRUFERVIyID09IChjbWQgPSAqYnVmKSkgCisJCQkJc3RhdGUgPSBzdGF0ZV9oZWFkZXIyOworCQkJZWxzZSBpZiAoKGNtZCAmIEhBTENZT05fSEVBREVSMU1BU0spID09IEhBTENZT05fSEVBREVSMSkgCisJCQkJc3RhdGUgPSBzdGF0ZV9oZWFkZXIxOworCQkJZWxzZSBpZiAocHJvX2dyb3VwX2EgJiYgKGNtZCAmIFZJQV9WSURFT01BU0spID09IFZJQV9WSURFT19IRUFERVI1KQorCQkJCXN0YXRlID0gc3RhdGVfdmhlYWRlcjU7CisJCQllbHNlIGlmIChwcm9fZ3JvdXBfYSAmJiAoY21kICYgVklBX1ZJREVPTUFTSykgPT0gVklBX1ZJREVPX0hFQURFUjYpCisJCQkJc3RhdGUgPSBzdGF0ZV92aGVhZGVyNjsKKwkJCWVsc2UgeworCQkJCURSTV9FUlJPUigiSW52YWxpZCAvIFVuaW1wbGVtZW50ZWQgRE1BIEhFQURFUiBjb21tYW5kLiAweCV4XG4iLAorCQkJCQkgIGNtZCk7CisJCQkJc3RhdGUgPSBzdGF0ZV9lcnJvcjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX2Vycm9yOgorCQlkZWZhdWx0OgorCQkJKmhjX3N0YXRlID0gc2F2ZWRfc3RhdGU7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwkJCQorCQl9CisJfQkKKwlpZiAoc3RhdGUgPT0gc3RhdGVfZXJyb3IpIHsKKwkJKmhjX3N0YXRlID0gc2F2ZWRfc3RhdGU7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgCit2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oZHJtX2RldmljZV90ICpkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGNtZDsKKwljb25zdCB1aW50MzJfdCAqYnVmX2VuZCA9IGJ1ZiArICggc2l6ZSA+PiAyICk7CisJdmVyaWZpZXJfc3RhdGVfdCBzdGF0ZSA9IHN0YXRlX2NvbW1hbmQ7CisJaW50IGZpcmVfY291bnQgPSAwOworCQorCXdoaWxlIChidWYgPCBidWZfZW5kKSB7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIHN0YXRlX2hlYWRlcjI6CisJCSAgc3RhdGUgPSB2aWFfcGFyc2VfaGVhZGVyMiggZGV2X3ByaXYsICZidWYsIGJ1Zl9lbmQsICZmaXJlX2NvdW50ICk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV9oZWFkZXIxOgorCQkJc3RhdGUgPSB2aWFfcGFyc2VfaGVhZGVyMSggZGV2X3ByaXYsICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX3ZoZWFkZXI1OgorCQkJc3RhdGUgPSB2aWFfcGFyc2VfdmhlYWRlcjUoIGRldl9wcml2LCAmYnVmLCBidWZfZW5kICk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV92aGVhZGVyNjoKKwkJCXN0YXRlID0gdmlhX3BhcnNlX3ZoZWFkZXI2KCBkZXZfcHJpdiwgJmJ1ZiwgYnVmX2VuZCApOworCQkJYnJlYWs7CisJCWNhc2Ugc3RhdGVfY29tbWFuZDoKKwkJCWlmIChIQUxDWU9OX0hFQURFUjIgPT0gKGNtZCA9ICpidWYpKSAKKwkJCQlzdGF0ZSA9IHN0YXRlX2hlYWRlcjI7CisJCQllbHNlIGlmICgoY21kICYgSEFMQ1lPTl9IRUFERVIxTUFTSykgPT0gSEFMQ1lPTl9IRUFERVIxKSAKKwkJCQlzdGF0ZSA9IHN0YXRlX2hlYWRlcjE7CisJCQllbHNlIGlmICgoY21kICYgVklBX1ZJREVPTUFTSykgPT0gVklBX1ZJREVPX0hFQURFUjUpCisJCQkJc3RhdGUgPSBzdGF0ZV92aGVhZGVyNTsKKwkJCWVsc2UgaWYgKChjbWQgJiBWSUFfVklERU9NQVNLKSA9PSBWSUFfVklERU9fSEVBREVSNikKKwkJCQlzdGF0ZSA9IHN0YXRlX3ZoZWFkZXI2OworCQkJZWxzZSB7CisJCQkJRFJNX0VSUk9SKCJJbnZhbGlkIC8gVW5pbXBsZW1lbnRlZCBETUEgSEVBREVSIGNvbW1hbmQuIDB4JXhcbiIsCisJCQkJCSAgY21kKTsKKwkJCQlzdGF0ZSA9IHN0YXRlX2Vycm9yOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugc3RhdGVfZXJyb3I6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwkJCQorCQl9CisJfQkKKwlpZiAoc3RhdGUgPT0gc3RhdGVfZXJyb3IpIHsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZCAKK3NldHVwX2hhemFyZF90YWJsZShoel9pbml0X3QgaW5pdF90YWJsZVtdLCBoYXphcmRfdCB0YWJsZVtdLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8MjU2OyArK2kpIHsKKwkJdGFibGVbaV0gPSBmb3JiaWRkZW5fY29tbWFuZDsKKwl9CisKKwlmb3IoaT0wOyBpPHNpemU7ICsraSkgeworCQl0YWJsZVtpbml0X3RhYmxlW2ldLmNvZGVdID0gaW5pdF90YWJsZVtpXS5oejsKKwl9Cit9CisKK3ZvaWQgCit2aWFfaW5pdF9jb21tYW5kX3ZlcmlmaWVyKCB2b2lkICkKK3sKKwlzZXR1cF9oYXphcmRfdGFibGUoaW5pdF90YWJsZTEsIHRhYmxlMSwgc2l6ZW9mKGluaXRfdGFibGUxKSAvIHNpemVvZihoel9pbml0X3QpKTsKKwlzZXR1cF9oYXphcmRfdGFibGUoaW5pdF90YWJsZTIsIHRhYmxlMiwgc2l6ZW9mKGluaXRfdGFibGUyKSAvIHNpemVvZihoel9pbml0X3QpKTsKKwlzZXR1cF9oYXphcmRfdGFibGUoaW5pdF90YWJsZTMsIHRhYmxlMywgc2l6ZW9mKGluaXRfdGFibGUzKSAvIHNpemVvZihoel9pbml0X3QpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTEzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCBUaGUgVW5pY2hyb21lIFByb2plY3QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgVU5JQ0hST01FIFBST0pFQ1QsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogVGhvbWFzIEhlbGxzdHL2bSAyMDA0LgorICovCisKKyNpZm5kZWYgX1ZJQV9WRVJJRklFUl9IXworI2RlZmluZSBfVklBX1ZFUklGSUVSX0hfCisKK3R5cGVkZWYgZW51bXsKKwlub19zZXF1ZW5jZSA9IDAsIAorCXpfYWRkcmVzcywKKwlkZXN0X2FkZHJlc3MsCisJdGV4X2FkZHJlc3MKK31kcm1fdmlhX3NlcXVlbmNlX3Q7CisKKworCit0eXBlZGVmIHN0cnVjdHsKKwl1bnNpZ25lZCB0ZXh0dXJlOworCXVpbnQzMl90IHpfYWRkcjsgCisJdWludDMyX3QgZF9hZGRyOyAKKyAgICAgICAgdWludDMyX3QgdF9hZGRyWzJdWzEwXTsKKwl1aW50MzJfdCBwaXRjaFsyXVsxMF07CisJdWludDMyX3QgaGVpZ2h0WzJdWzEwXTsKKwl1aW50MzJfdCB0ZXhfbGV2ZWxfbG9bMl07IAorCXVpbnQzMl90IHRleF9sZXZlbF9oaVsyXTsKKwl1aW50MzJfdCB0ZXhfcGFsZXR0ZV9zaXplWzJdOworCWRybV92aWFfc2VxdWVuY2VfdCB1bmZpbmlzaGVkOworCWludCBhZ3BfdGV4dHVyZTsKKwlpbnQgbXVsdGl0ZXg7CisJZHJtX2RldmljZV90ICpkZXY7CisJZHJtX21hcF90ICptYXBfY2FjaGU7CisJdWludDMyX3QgdmVydGV4X2NvdW50OworCWludCBhZ3A7CisJY29uc3QgdWludDMyX3QgKmJ1Zl9zdGFydDsKK30gZHJtX3ZpYV9zdGF0ZV90OworCitleHRlcm4gaW50IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oY29uc3QgdWludDMyX3QgKiBidWYsIHVuc2lnbmVkIGludCBzaXplLCAKKwkJCQkgICAgIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgYWdwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92aWRlby5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E2MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgVGhvbWFzIEhlbGxzdHJvbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1IoUyksIEFORC9PUiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IFRob21hcyBIZWxsc3Ryb20gMjAwNS4KKyAqCisgKiBWaWRlbyBhbmQgWHZNQyByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInZpYV9kcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJ2LmgiCisKK3ZvaWQKK3ZpYV9pbml0X2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVklBX05SX1hWTUNfTE9DS1M7ICsraSkgeworCQlEUk1fSU5JVF9XQUlUUVVFVUUoJihkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtpXSkpOworCQlYVk1DTE9DS1BUUihkZXZfcHJpdi0+c2FyZWFfcHJpdiwgaSktPmxvY2sgPSAwOworCX0KK30KKwordm9pZAordmlhX2NsZWFudXBfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQoreworfQkKKwordm9pZAordmlhX3JlbGVhc2VfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2b2xhdGlsZSBpbnQgKmxvY2s7CisKKwlmb3IgKGk9MDsgaSA8IFZJQV9OUl9YVk1DX0xPQ0tTOyArK2kpIHsKKwkgICAgICAgIGxvY2sgPSAoaW50ICopIFhWTUNMT0NLUFRSKGRldl9wcml2LT5zYXJlYV9wcml2LCBpKTsKKwkJaWYgKCAoX0RSTV9MT0NLSU5HX0NPTlRFWFQoICpsb2NrICkgPT0gY29udGV4dCkpIHsKKwkJCWlmIChfRFJNX0xPQ0tfSVNfSEVMRCggKmxvY2sgKSAmJiAoKmxvY2sgJiBfRFJNX0xPQ0tfQ09OVCkpIHsKKwkJCQlEUk1fV0FLRVVQKCAmKGRldl9wcml2LT5kZWNvZGVyX3F1ZXVlW2ldKSk7CisJCQl9CisJCQkqbG9jayA9IDA7CisJCX0KKwl9CQorfQkKKworaW50IAordmlhX2RlY29kZXJfZnV0ZXgoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fdmlhX2Z1dGV4X3QgZng7CisJdm9sYXRpbGUgaW50ICpsb2NrOworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWRybV92aWFfc2FyZWFfdCAqc0FQcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IHJldCA9IDA7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZ4LCAoZHJtX3ZpYV9mdXRleF90ICopIGRhdGEsIHNpemVvZihmeCkpOworCisJaWYgKGZ4LmxvY2sgPiBWSUFfTlJfWFZNQ19MT0NLUykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsb2NrID0gKGludCAqKVhWTUNMT0NLUFRSKHNBUHJpdiwgZngubG9jayk7CisKKwlzd2l0Y2ggKGZ4LmZ1bmMpIHsKKwljYXNlIFZJQV9GVVRFWF9XQUlUOgorCQlEUk1fV0FJVF9PTihyZXQsIGRldl9wcml2LT5kZWNvZGVyX3F1ZXVlW2Z4LmxvY2tdLAorCQkJICAgIChmeC5tcyAvIDEwKSAqIChEUk1fSFogLyAxMDApLCAqbG9jayAhPSBmeC52YWwpOworCQlyZXR1cm4gcmV0OworCWNhc2UgVklBX0ZVVEVYX1dBS0U6CisJCURSTV9XQUtFVVAoJihkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtmeC5sb2NrXSkpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKaW5kZXggODhjZDg1OC4uY2RkYjc4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTQwLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgotI2luY2x1ZGUgPGFzbS92aW8uaD4KIAogI2RlZmluZSBIVkNfTUFKT1IJMjI5CiAjZGVmaW5lIEhWQ19NSU5PUgkwCkBAIC02MSwxNiArNjEsMjEgQEAKICAqLwogI2RlZmluZSBIVkNfQUxMT0NfVFRZX0FEQVBURVJTCTgKIAotc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodmNfZHJpdmVyOwotI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQotc3RhdGljIGludCBzeXNycV9wcmVzc2VkOwotI2VuZGlmCi0KICNkZWZpbmUgTl9PVVRCVUYJMTYKICNkZWZpbmUgTl9JTkJVRgkJMTYKIAogI2RlZmluZSBfX0FMSUdORURfXwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpCiAKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaHZjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmh2Y190YXNrOworCisvKiBQaWNrcyB1cCBsYXRlIGtpY2tzIGFmdGVyIGxpc3Qgd2FsayBidXQgYmVmb3JlIHNjaGVkdWxlKCkgKi8KK3N0YXRpYyBpbnQgaHZjX2tpY2tlZDsKKworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorc3RhdGljIGludCBzeXNycV9wcmVzc2VkOworI2VuZGlmCisKIHN0cnVjdCBodmNfc3RydWN0IHsKIAlzcGlubG9ja190IGxvY2s7CiAJaW50IGluZGV4OwpAQCAtODAsMTEgKzg1LDExIEBACiAJY2hhciBvdXRidWZbTl9PVVRCVUZdIF9fQUxJR05FRF9fOwogCWludCBuX291dGJ1ZjsKIAl1aW50MzJfdCB2dGVybW5vOworCXN0cnVjdCBodl9vcHMgKm9wczsKIAlpbnQgaXJxX3JlcXVlc3RlZDsKIAlpbnQgaXJxOwogCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOyAvKiByZWYgY291bnQgJiBodmNfc3RydWN0IGxpZmV0aW1lICovCi0Jc3RydWN0IHZpb19kZXYgKnZkZXY7CiB9OwogCiAvKiBkeW5hbWljIGxpc3Qgb2YgaHZjX3N0cnVjdCBpbnN0YW5jZXMgKi8KQEAgLTk3LDQ4ICsxMDIsMTEgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHZjX3N0cnVjdHNfbG9jayk7CiAKIC8qCi0gKiBJbml0aWFsIGNvbnNvbGUgdnRlcm1ub3MgZm9yIGNvbnNvbGUgQVBJIHVzYWdlIHByaW9yIHRvIGZ1bGwgY29uc29sZQotICogaW5pdGlhbGl6YXRpb24uICBBbnkgdnR5IGFkYXB0ZXIgb3V0c2lkZSB0aGlzIHJhbmdlIHdpbGwgbm90IGhhdmUgdXNhYmxlCi0gKiBjb25zb2xlIGludGVyZmFjZXMgYnV0IGNhbiBzdGlsbCBiZSB1c2VkIGFzIGEgdHR5IGRldmljZS4gIFRoaXMgaGFzIHRvIGJlCi0gKiBzdGF0aWMgYmVjYXVzZSBrbWFsbG9jIHdpbGwgbm90IHdvcmsgZHVyaW5nIGVhcmx5IGNvbnNvbGUgaW5pdC4KKyAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhc3NpZ24gYSB0dHktPmluZGV4IHZhbHVlIHRvIGEgaHZjX3N0cnVjdCBiYXNlZAorICogdXBvbiBvcmRlciBvZiBleHBvc3VyZSB2aWEgaHZjX3Byb2JlKCksIHdoZW4gd2UgY2FuIG5vdCBtYXRjaCBpdCB0bworICogYSBjb25zb2xlIGNhbmlkYXRlIHJlZ2lzdGVyZWQgd2l0aCBodmNfaW5zdGFudGlhdGUoKS4KICAqLwotc3RhdGljIHVpbnQzMl90IHZ0ZXJtbm9zW01BWF9OUl9IVkNfQ09OU09MRVNdOwotCi0vKiBVc2VkIGZvciBhY2NvdW50aW5nIHB1cnBvc2VzICovCi1zdGF0aWMgaW50IG51bV92dGVybXMgPSAwOwotCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpodmNfdGFzazsKLQotLyoKLSAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSB0dHktPmluZGV4IHZhbHVlIHRvIGEgaHZjX3N0cnVjdCBiYXNlZAotICogdXBvbiBvcmRlciBvZiBleHBvc3VyZSB2aWEgaHZjX3Byb2JlKCkuCi0gKi8KLXN0YXRpYyBpbnQgaHZjX2NvdW50ID0gLTE7Ci0KLS8qIFBpY2tzIHVwIGxhdGUga2lja3MgYWZ0ZXIgbGlzdCB3YWxrIGJ1dCBiZWZvcmUgc2NoZWR1bGUoKSAqLwotc3RhdGljIGludCBodmNfa2lja2VkOwotCi0vKiBXYWtlIHRoZSBzbGVlcGluZyBraHZjZCAqLwotc3RhdGljIHZvaWQgaHZjX2tpY2sodm9pZCkKLXsKLQlodmNfa2lja2VkID0gMTsKLQl3YWtlX3VwX3Byb2Nlc3MoaHZjX3Rhc2spOwotfQotCi0vKgotICogTk9URTogVGhpcyBBUEkgaXNuJ3QgdXNlZCBpZiB0aGUgY29uc29sZSBhZGFwdGVyIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcnJ1cHRzLgotICogSW4gdGhpcyBjYXNlIHRoZSBjb25zb2xlIGlzIHBvbGwgZHJpdmVuLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaHZjX2hhbmRsZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlodmNfa2ljaygpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgaHZjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlodmNfa2ljaygpOwotfQorc3RhdGljIGludCBsYXN0X2h2YyA9IC0xOwogCiAvKgogICogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGVpdGhlciB0aGUgaHZjX3N0cnVjc3RfbG9jayBvciB0aGUgaHZjX3N0cnVjdApAQCAtMTY4LDYgKzEzNiwxNzggQEAKIAlyZXR1cm4gaHA7CiB9CiAKKworLyoKKyAqIEluaXRpYWwgY29uc29sZSB2dGVybW5vcyBmb3IgY29uc29sZSBBUEkgdXNhZ2UgcHJpb3IgdG8gZnVsbCBjb25zb2xlCisgKiBpbml0aWFsaXphdGlvbi4gIEFueSB2dHkgYWRhcHRlciBvdXRzaWRlIHRoaXMgcmFuZ2Ugd2lsbCBub3QgaGF2ZSB1c2FibGUKKyAqIGNvbnNvbGUgaW50ZXJmYWNlcyBidXQgY2FuIHN0aWxsIGJlIHVzZWQgYXMgYSB0dHkgZGV2aWNlLiAgVGhpcyBoYXMgdG8gYmUKKyAqIHN0YXRpYyBiZWNhdXNlIGttYWxsb2Mgd2lsbCBub3Qgd29yayBkdXJpbmcgZWFybHkgY29uc29sZSBpbml0LgorICovCitzdGF0aWMgc3RydWN0IGh2X29wcyAqY29uc19vcHNbTUFYX05SX0hWQ19DT05TT0xFU107CitzdGF0aWMgdWludDMyX3QgdnRlcm1ub3NbTUFYX05SX0hWQ19DT05TT0xFU10gPQorCXtbMCAuLi4gTUFYX05SX0hWQ19DT05TT0xFUyAtIDFdID0gLTF9OworCisvKgorICogQ29uc29sZSBBUElzLCBOT1QgVFRZLiAgVGhlc2UgQVBJcyBhcmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IHdoZW4KKyAqIGh2Y19jb25zb2xlX3NldHVwKCkgZmluZHMgYWRhcHRlcnMuCisgKi8KKwordm9pZCBodmNfY29uc29sZV9wcmludChzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKmIsIHVuc2lnbmVkIGNvdW50KQoreworCWNoYXIgY1sxNl0gX19BTElHTkVEX187CisJdW5zaWduZWQgaSA9IDAsIG4gPSAwOworCWludCByLCBkb25lY3IgPSAwLCBpbmRleCA9IGNvLT5pbmRleDsKKworCS8qIENvbnNvbGUgYWNjZXNzIGF0dGVtcHQgb3V0c2lkZSBvZiBhY2NlcHRhYmxlIGNvbnNvbGUgcmFuZ2UuICovCisJaWYgKGluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCXJldHVybjsKKworCS8qIFRoaXMgY29uc29sZSBhZGFwdGVyIHdhcyByZW1vdmVkIHNvIGl0IGlzIG5vdCB1c2VhYmxlLiAqLworCWlmICh2dGVybW5vc1tpbmRleF0gPCAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoY291bnQgPiAwIHx8IGkgPiAwKSB7CisJCWlmIChjb3VudCA+IDAgJiYgaSA8IHNpemVvZihjKSkgeworCQkJaWYgKGJbbl0gPT0gJ1xuJyAmJiAhZG9uZWNyKSB7CisJCQkJY1tpKytdID0gJ1xyJzsKKwkJCQlkb25lY3IgPSAxOworCQkJfSBlbHNlIHsKKwkJCQljW2krK10gPSBiW24rK107CisJCQkJZG9uZWNyID0gMDsKKwkJCQktLWNvdW50OworCQkJfQorCQl9IGVsc2UgeworCQkJciA9IGNvbnNfb3BzW2luZGV4XS0+cHV0X2NoYXJzKHZ0ZXJtbm9zW2luZGV4XSwgYywgaSk7CisJCQlpZiAociA8IDApIHsKKwkJCQkvKiB0aHJvdyBhd2F5IGNoYXJzIG9uIGVycm9yICovCisJCQkJaSA9IDA7CisJCQl9IGVsc2UgaWYgKHIgPiAwKSB7CisJCQkJaSAtPSByOworCQkJCWlmIChpID4gMCkKKwkJCQkJbWVtbW92ZShjLCBjK3IsIGkpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2Y19jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKK3sKKwlpZiAodnRlcm1ub3NbYy0+aW5kZXhdID09IC0xKQorCQlyZXR1cm4gTlVMTDsKKworCSppbmRleCA9IGMtPmluZGV4OworCXJldHVybiBodmNfZHJpdmVyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBodmNfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJaWYgKGNvLT5pbmRleCA8IDAgfHwgY28tPmluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHZ0ZXJtbm9zW2NvLT5pbmRleF0gPT0gLTEpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb25zb2xlIGh2Y19jb25fZHJpdmVyID0geworCS5uYW1lCQk9ICJodmMiLAorCS53cml0ZQkJPSBodmNfY29uc29sZV9wcmludCwKKwkuZGV2aWNlCQk9IGh2Y19jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gaHZjX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCit9OworCisvKgorICogRWFybHkgY29uc29sZSBpbml0aWFsaXphdGlvbi4gIFByZWNlZWRzIGRyaXZlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAoMSkgd2UgYXJlIGZpcnN0LCBhbmQgdGhlIHVzZXIgc3BlY2lmaWVkIGFub3RoZXIgZHJpdmVyCisgKiAtLSBpbmRleCB3aWxsIHJlbWFpbiAtMQorICogKDIpIHdlIGFyZSBmaXJzdCBhbmQgdGhlIHVzZXIgc3BlY2lmaWVkIG5vIGRyaXZlcgorICogLS0gaW5kZXggd2lsbCBiZSBzZXQgdG8gMCwgdGhlbiB3ZSB3aWxsIGZhaWwgc2V0dXAuCisgKiAoMykgIHdlIGFyZSBmaXJzdCBhbmQgdGhlIHVzZXIgc3BlY2lmaWVkIG91ciBkcml2ZXIKKyAqIC0tIGluZGV4IHdpbGwgYmUgc2V0IHRvIHVzZXIgc3BlY2lmaWVkIGRyaXZlciwgYW5kIHdlIHdpbGwgZmFpbAorICogKDQpIHdlIGFyZSBhZnRlciBkcml2ZXIsIGFuZCB0aGlzIGluaXRjYWxsIHdpbGwgcmVnaXN0ZXIgdXMKKyAqIC0tIGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgZHJpdmVyIHRoZW4gdGhlIGNvbnNvbGUgd2lsbCBtYXRjaAorICoKKyAqIE5vdGUgdGhhdCBmb3IgY2FzZXMgMiBhbmQgMywgd2Ugd2lsbCBtYXRjaCBsYXRlciB3aGVuIHRoZSBpbyBkcml2ZXIKKyAqIGNhbGxzIGh2Y19pbnN0YW50aWF0ZSgpIGFuZCBjYWxsIHJlZ2lzdGVyIGFnYWluLgorICovCitzdGF0aWMgaW50IF9faW5pdCBodmNfY29uc29sZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfY29uc29sZSgmaHZjX2Nvbl9kcml2ZXIpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChodmNfY29uc29sZV9pbml0KTsKKworLyoKKyAqIGh2Y19pbnN0YW50aWF0ZSgpIGlzIGFuIGVhcmx5IGNvbnNvbGUgZGlzY292ZXJ5IG1ldGhvZCB3aGljaCBsb2NhdGVzCisgKiBjb25zb2xlcyAqIHByaW9yIHRvIHRoZSB2aW8gc3Vic3lzdGVtIGRpc2NvdmVyaW5nIHRoZW0uICBIb3RwbHVnZ2VkCisgKiB2dHkgYWRhcHRlcnMgZG8gTk9UIGdldCBhbiBodmNfaW5zdGFudGlhdGUoKSBjYWxsYmFjayBzaW5jZSB0aGV5CisgKiBhcHBlYXIgYWZ0ZXIgZWFybHkgY29uc29sZSBpbml0LgorICovCitpbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCwgc3RydWN0IGh2X29wcyAqb3BzKQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJcmV0dXJuIC0xOworCisJaWYgKHZ0ZXJtbm9zW2luZGV4XSAhPSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogbWFrZSBzdXJlIG5vIG5vIHR0eSBoYXMgYmVlbiByZWdpc3RlcmQgaW4gdGhpcyBpbmRleCAqLworCWhwID0gaHZjX2dldF9ieV9pbmRleChpbmRleCk7CisJaWYgKGhwKSB7CisJCWtvYmplY3RfcHV0KCZocC0+a29iaik7CisJCXJldHVybiAtMTsKKwl9CisKKwl2dGVybW5vc1tpbmRleF0gPSB2dGVybW5vOworCWNvbnNfb3BzW2luZGV4XSA9IG9wczsKKworCS8qIHJlc2VydmUgYWxsIGluZGljZXMgdXB0byBhbmQgaW5jbHVkaW5nIHRoaXMgaW5kZXggKi8KKwlpZiAobGFzdF9odmMgPCBpbmRleCkKKwkJbGFzdF9odmMgPSBpbmRleDsKKworCS8qIGlmIHRoaXMgaW5kZXggaXMgd2hhdCB0aGUgdXNlciByZXF1ZXN0ZWQsIHRoZW4gcmVnaXN0ZXIKKwkgKiBub3cgKHNldHVwIHdvbid0IGZhaWwgYXQgdGhpcyBwb2ludCkuICBJdCdzIG9rIHRvIGp1c3QKKwkgKiBjYWxsIHJlZ2lzdGVyIGFnYWluIGlmIHByZXZpb3VzbHkgLnNldHVwIGZhaWxlZC4KKwkgKi8KKwlpZiAoaW5kZXggPT0gaHZjX2Nvbl9kcml2ZXIuaW5kZXgpCisJCXJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25fZHJpdmVyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChodmNfaW5zdGFudGlhdGUpOworCisvKiBXYWtlIHRoZSBzbGVlcGluZyBraHZjZCAqLworc3RhdGljIHZvaWQgaHZjX2tpY2sodm9pZCkKK3sKKwlodmNfa2lja2VkID0gMTsKKwl3YWtlX3VwX3Byb2Nlc3MoaHZjX3Rhc2spOworfQorCitzdGF0aWMgaW50IGh2Y19wb2xsKHN0cnVjdCBodmNfc3RydWN0ICpocCk7CisKKy8qCisgKiBOT1RFOiBUaGlzIEFQSSBpc24ndCB1c2VkIGlmIHRoZSBjb25zb2xlIGFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IGludGVycnVwdHMuCisgKiBJbiB0aGlzIGNhc2UgdGhlIGNvbnNvbGUgaXMgcG9sbCBkcml2ZW4uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBodmNfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIGlmIGh2Y19wb2xsIHJlcXVlc3QgYSByZXBvbGwsIHRoZW4ga2ljayB0aGUgaHZjZCB0aHJlYWQgKi8KKwlpZiAoaHZjX3BvbGwoZGV2X2luc3RhbmNlKSkKKwkJaHZjX2tpY2soKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaHZjX2tpY2soKTsKK30KKwogLyoKICAqIFRoZSBUVFkgaW50ZXJmYWNlIHdvbid0IGJlIHVzZWQgdW50aWwgYWZ0ZXIgdGhlIHZpbyBsYXllciBoYXMgZXhwb3NlZCB0aGUgdnR5CiAgKiBhZGFwdGVyIHRvIHRoZSBrZXJuZWwuCkBAIC0zMjksNyArNDY5LDcgQEAKIHsKIAlpbnQgbjsKIAotCW4gPSBodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCBocC0+b3V0YnVmLCBocC0+bl9vdXRidWYpOworCW4gPSBocC0+b3BzLT5wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGhwLT5vdXRidWYsIGhwLT5uX291dGJ1Zik7CiAJaWYgKG4gPD0gMCkgewogCQlpZiAobiA9PSAwKQogCQkJcmV0dXJuOwpAQCAtNDY3LDcgKzYwNyw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCW4gPSBodmNfZ2V0X2NoYXJzKGhwLT52dGVybW5vLCBidWYsIGNvdW50KTsKKwkJbiA9IGhwLT5vcHMtPmdldF9jaGFycyhocC0+dnRlcm1ubywgYnVmLCBjb3VudCk7CiAJCWlmIChuIDw9IDApIHsKIAkJCS8qIEhhbmd1cCB0aGUgdHR5IHdoZW4gZGlzY29ubmVjdGVkIGZyb20gaG9zdCAqLwogCQkJaWYgKG4gPT0gLUVQSVBFKSB7CkBAIC00NzksMTQgKzYxOSwxNyBAQAogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKLQkJCS8qIEhhbmRsZSB0aGUgU3lzUnEgSGFjayAqLwotCQkJaWYgKGJ1ZltpXSA9PSAnXHgwZicpIHsJLyogXk8gLS0gc2hvdWxkIHN1cHBvcnQgYSBzZXF1ZW5jZSAqLwotCQkJCXN5c3JxX3ByZXNzZWQgPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChzeXNycV9wcmVzc2VkKSB7Ci0JCQkJaGFuZGxlX3N5c3JxKGJ1ZltpXSwgTlVMTCwgdHR5KTsKLQkJCQlzeXNycV9wcmVzc2VkID0gMDsKLQkJCQljb250aW51ZTsKKwkJCWlmIChocC0+aW5kZXggPT0gaHZjX2Nvbl9kcml2ZXIuaW5kZXgpIHsKKwkJCQkvKiBIYW5kbGUgdGhlIFN5c1JxIEhhY2sgKi8KKwkJCQkvKiBYWFggc2hvdWxkIHN1cHBvcnQgYSBzZXF1ZW5jZSAqLworCQkJCWlmIChidWZbaV0gPT0gJ1x4MGYnKSB7CS8qIF5PICovCisJCQkJCXN5c3JxX3ByZXNzZWQgPSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgaWYgKHN5c3JxX3ByZXNzZWQpIHsKKwkJCQkJaGFuZGxlX3N5c3JxKGJ1ZltpXSwgTlVMTCwgdHR5KTsKKwkJCQkJc3lzcnFfcHJlc3NlZCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KIAkJCX0KICNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYnVmW2ldLCAwKTsKQEAgLTQ5Nyw4ICs2NDAsOCBAQAogCiAJCS8qCiAJCSAqIEFjY291bnQgZm9yIHRoZSB0b3RhbCBhbW91bnQgcmVhZCBpbiBvbmUgbG9vcCwgYW5kIGlmIGFib3ZlCi0JCSAqIDY0IGJ5dGVzLCB3ZSBkbyBhIHF1aWNrIHNjaGVkdWxlIGxvb3AgdG8gbGV0IHRoZSB0dHkgZ3JvayB0aGUKLQkJICogZGF0YSBhbmQgZXZlbnR1YWxseSB0aHJvdHRsZSB1cy4KKwkJICogNjQgYnl0ZXMsIHdlIGRvIGEgcXVpY2sgc2NoZWR1bGUgbG9vcCB0byBsZXQgdGhlIHR0eSBncm9rCisJCSAqIHRoZSBkYXRhIGFuZCBldmVudHVhbGx5IHRocm90dGxlIHVzLgogCQkgKi8KIAkJcmVhZF90b3RhbCArPSBuOwogCQlpZiAocmVhZF90b3RhbCA+PSA2NCkgewpAQCAtNTQyLDcgKzY4NSw2IEBACiAJCWlmIChjcHVzX2VtcHR5KGNwdXNfaW5feG1vbikpIHsKIAkJCXNwaW5fbG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhwLCAmaHZjX3N0cnVjdHMsIG5leHQpIHsKLQkJCQkvKmhwID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgaHZjX3N0cnVjdCwgKiBuZXh0KTsgKi8KIAkJCQlwb2xsX21hc2sgfD0gaHZjX3BvbGwoaHApOwogCQkJfQogCQkJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOwpAQCAtNTc3LDE0ICs3MTksNiBAQAogCS5jaGFyc19pbl9idWZmZXIgPSBodmNfY2hhcnNfaW5fYnVmZmVyLAogfTsKIAotY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBodmNfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YT0gewotCXsic2VyaWFsIiwgImh2dGVybTEifSwKLQl7IE5VTEwsIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaHZjX2RyaXZlcl90YWJsZSk7Ci0KIC8qIGNhbGxiYWNrIHdoZW4gdGhlIGtib2plY3QgcmVmIGNvdW50IHJlYWNoZXMgemVyby4gKi8KIHN0YXRpYyB2b2lkIGRlc3Ryb3lfaHZjX3N0cnVjdChzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKQEAgLTYwNiw0MSArNzQwLDUxIEBACiAJLnJlbGVhc2UgPSBkZXN0cm95X2h2Y19zdHJ1Y3QsCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBodmNfcHJvYmUoCi0JCXN0cnVjdCB2aW9fZGV2ICpkZXYsCi0JCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3N0cnVjdCBodmNfc3RydWN0IF9fZGV2aW5pdCAqaHZjX2FsbG9jKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpcnEsCisJCQkJCXN0cnVjdCBodl9vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7Ci0KLQkvKiBwcm9iZWQgd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMuICovCi0JaWYgKCFkZXYgfHwgIWlkKQotCQlyZXR1cm4gLUVQRVJNOworCWludCBpOwogCiAJaHAgPSBrbWFsbG9jKHNpemVvZigqaHApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhwKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAltZW1zZXQoaHAsIDB4MDAsIHNpemVvZigqaHApKTsKLQlocC0+dnRlcm1ubyA9IGRldi0+dW5pdF9hZGRyZXNzOwotCWhwLT52ZGV2ID0gZGV2OwotCWhwLT52ZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBocDsKLQlocC0+aXJxID0gZGV2LT5pcnE7CisKKwlocC0+dnRlcm1ubyA9IHZ0ZXJtbm87CisJaHAtPmlycSA9IGlycTsKKwlocC0+b3BzID0gb3BzOwogCiAJa29iamVjdF9pbml0KCZocC0+a29iaik7CiAJaHAtPmtvYmoua3R5cGUgPSAmaHZjX2tvYmpfdHlwZTsKIAogCXNwaW5fbG9ja19pbml0KCZocC0+bG9jayk7CiAJc3Bpbl9sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKLQlocC0+aW5kZXggPSArK2h2Y19jb3VudDsKKworCS8qCisJICogZmluZCBpbmRleCB0byB1c2U6CisJICogc2VlIGlmIHRoaXMgdnRlcm0gaWQgbWF0Y2hlcyBvbmUgcmVnaXN0ZXJlZCBmb3IgY29uc29sZS4KKwkgKi8KKwlmb3IgKGk9MDsgaSA8IE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKKwkJaWYgKHZ0ZXJtbm9zW2ldID09IGhwLT52dGVybW5vKQorCQkJYnJlYWs7CisKKwkvKiBubyBtYXRjaGluZyBzbG90LCBqdXN0IHVzZSBhIGNvdW50ZXIgKi8KKwlpZiAoaSA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQorCQlpID0gKytsYXN0X2h2YzsKKworCWhwLT5pbmRleCA9IGk7CisKIAlsaXN0X2FkZF90YWlsKCYoaHAtPm5leHQpLCAmaHZjX3N0cnVjdHMpOwogCXNwaW5fdW5sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKIAotCXJldHVybiAwOworCXJldHVybiBocDsKIH0KK0VYUE9SVF9TWU1CT0woaHZjX2FsbG9jKTsKIAotc3RhdGljIGludCBfX2RldmV4aXQgaHZjX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KQoraW50IF9fZGV2ZXhpdCBodmNfcmVtb3ZlKHN0cnVjdCBodmNfc3RydWN0ICpocCkKIHsKLQlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSBkZXYtPmRldi5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwpAQCAtNjczLDIzICs4MTcsMTQgQEAKIAkJdHR5X2hhbmd1cCh0dHkpOwogCXJldHVybiAwOwogfQotCi1zdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgaHZjX3Zpb19kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gaHZjX2RyaXZlcl9uYW1lLAotCS5pZF90YWJsZQk9IGh2Y19kcml2ZXJfdGFibGUsCi0JLnByb2JlCQk9IGh2Y19wcm9iZSwKLQkucmVtb3ZlCQk9IGh2Y19yZW1vdmUsCi19OworRVhQT1JUX1NZTUJPTChodmNfcmVtb3ZlKTsKIAogLyogRHJpdmVyIGluaXRpYWxpemF0aW9uLiAgRm9sbG93IGNvbnNvbGUgaW5pdGlhbGl6YXRpb24uICBUaGlzIGlzIHdoZXJlIHRoZSBUVFkKICAqIGludGVyZmFjZXMgc3RhcnQgdG8gYmVjb21lIGF2YWlsYWJsZS4gKi8KIGludCBfX2luaXQgaHZjX2luaXQodm9pZCkKIHsKLQlpbnQgcmM7Ci0KLQkvKiBXZSBuZWVkIG1vcmUgdGhhbiBudW1fdnRlcm1zIGFkYXB0ZXJzIGR1ZSB0byBob3RwbHVnIGFkZGl0aW9ucy4gKi8KKwkvKiBXZSBuZWVkIG1vcmUgdGhhbiBodmNfY291bnQgYWRhcHRlcnMgZHVlIHRvIGhvdHBsdWcgYWRkaXRpb25zLiAqLwogCWh2Y19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKEhWQ19BTExPQ19UVFlfQURBUFRFUlMpOwotCS8qIGh2Y19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKG51bV92dGVybXMpOyAqLwogCWlmICghaHZjX2RyaXZlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTcxNiwxMTYgKzg1MSwyMCBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvKiBSZWdpc3RlciBhcyBhIHZpbyBkZXZpY2UgdG8gcmVjZWl2ZSBjYWxsYmFja3MgKi8KLQlyYyA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJmh2Y192aW9fZHJpdmVyKTsKLQotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KK21vZHVsZV9pbml0KGh2Y19pbml0KTsKIAotLyogVGhpcyBpc24ndCBwYXJ0aWN1bGFyaWx5IG5lY2Vzc2FyeSBkdWUgdG8gdGhpcyBiZWluZyBhIGNvbnNvbGUgZHJpdmVyIGJ1dCBpdAotICogaXMgbmljZSB0byBiZSB0aG9yb3VnaCAqLworLyogVGhpcyBpc24ndCBwYXJ0aWN1bGFyaWx5IG5lY2Vzc2FyeSBkdWUgdG8gdGhpcyBiZWluZyBhIGNvbnNvbGUgZHJpdmVyCisgKiBidXQgaXQgaXMgbmljZSB0byBiZSB0aG9yb3VnaC4KKyAqLwogc3RhdGljIHZvaWQgX19leGl0IGh2Y19leGl0KHZvaWQpCiB7CiAJa3RocmVhZF9zdG9wKGh2Y190YXNrKTsKIAotCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmaHZjX3Zpb19kcml2ZXIpOwogCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNfZHJpdmVyKTsKIAkvKiByZXR1cm4gdHR5X3N0cnVjdCBpbnN0YW5jZXMgYWxsb2NhdGVkIGluIGh2Y19pbml0KCkuICovCiAJcHV0X3R0eV9kcml2ZXIoaHZjX2RyaXZlcik7CisJdW5yZWdpc3Rlcl9jb25zb2xlKCZodmNfY29uX2RyaXZlcik7CiB9Ci0KLS8qCi0gKiBDb25zb2xlIEFQSXMsIE5PVCBUVFkuICBUaGVzZSBBUElzIGFyZSBhdmFpbGFibGUgaW1tZWRpYXRlbHkgd2hlbgotICogaHZjX2NvbnNvbGVfc2V0dXAoKSBmaW5kcyBhZGFwdGVycy4KLSAqLwotCi0vKgotICogaHZjX2luc3RhbnRpYXRlKCkgaXMgYW4gZWFybHkgY29uc29sZSBkaXNjb3ZlcnkgbWV0aG9kIHdoaWNoIGxvY2F0ZXMgY29uc29sZXMKLSAqIHByaW9yIHRvIHRoZSB2aW8gc3Vic3lzdGVtIGRpc2NvdmVyaW5nIHRoZW0uICBIb3RwbHVnZ2VkIHZ0eSBhZGFwdGVycyBkbyBOT1QKLSAqIGdldCBhbiBodmNfaW5zdGFudGlhdGUoKSBjYWxsYmFjayBzaW5jZSB0aGUgYXBwZWFyIGFmdGVyIGVhcmx5IGNvbnNvbGUgaW5pdC4KLSAqLwotaW50IGh2Y19pbnN0YW50aWF0ZSh1aW50MzJfdCB2dGVybW5vLCBpbnQgaW5kZXgpCi17Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAodnRlcm1ub3NbaW5kZXhdICE9IC0xKQotCQlyZXR1cm4gLTE7Ci0KLQl2dGVybW5vc1tpbmRleF0gPSB2dGVybW5vOwotCXJldHVybiAwOwotfQotCi12b2lkIGh2Y19jb25zb2xlX3ByaW50KHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYiwgdW5zaWduZWQgY291bnQpCi17Ci0JY2hhciBjWzE2XSBfX0FMSUdORURfXzsKLQl1bnNpZ25lZCBpID0gMCwgbiA9IDA7Ci0JaW50IHIsIGRvbmVjciA9IDA7Ci0KLQkvKiBDb25zb2xlIGFjY2VzcyBhdHRlbXB0IG91dHNpZGUgb2YgYWNjZXB0YWJsZSBjb25zb2xlIHJhbmdlLiAqLwotCWlmIChjby0+aW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKLQkJcmV0dXJuOwotCi0JLyogVGhpcyBjb25zb2xlIGFkYXB0ZXIgd2FzIHJlbW92ZWQgc28gaXQgaXMgbm90IHVzZWFibGUuICovCi0JaWYgKHZ0ZXJtbm9zW2NvLT5pbmRleF0gPCAwKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoY291bnQgPiAwIHx8IGkgPiAwKSB7Ci0JCWlmIChjb3VudCA+IDAgJiYgaSA8IHNpemVvZihjKSkgewotCQkJaWYgKGJbbl0gPT0gJ1xuJyAmJiAhZG9uZWNyKSB7Ci0JCQkJY1tpKytdID0gJ1xyJzsKLQkJCQlkb25lY3IgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQljW2krK10gPSBiW24rK107Ci0JCQkJZG9uZWNyID0gMDsKLQkJCQktLWNvdW50OwotCQkJfQotCQl9IGVsc2UgewotCQkJciA9IGh2Y19wdXRfY2hhcnModnRlcm1ub3NbY28tPmluZGV4XSwgYywgaSk7Ci0JCQlpZiAociA8IDApIHsKLQkJCQkvKiB0aHJvdyBhd2F5IGNoYXJzIG9uIGVycm9yICovCi0JCQkJaSA9IDA7Ci0JCQl9IGVsc2UgaWYgKHIgPiAwKSB7Ci0JCQkJaSAtPSByOwotCQkJCWlmIChpID4gMCkKLQkJCQkJbWVtbW92ZShjLCBjK3IsIGkpOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2Y19jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKLXsKLQkqaW5kZXggPSBjLT5pbmRleDsKLQlyZXR1cm4gaHZjX2RyaXZlcjsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaHZjX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQotewotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgY29uc29sZSBodmNfY29uX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiaHZjIiwKLQkud3JpdGUJCT0gaHZjX2NvbnNvbGVfcHJpbnQsCi0JLmRldmljZQkJPSBodmNfY29uc29sZV9kZXZpY2UsCi0JLnNldHVwCQk9IGh2Y19jb25zb2xlX3NldHVwLAotCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCi0JLmluZGV4CQk9IC0xLAotfTsKLQotLyogRWFybHkgY29uc29sZSBpbml0aWFsaXphdGlvbi4gIFByZWNlZWRzIGRyaXZlciBpbml0aWFsaXphdGlvbi4gKi8KLXN0YXRpYyBpbnQgX19pbml0IGh2Y19jb25zb2xlX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaT0wOyBpPE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKLQkJdnRlcm1ub3NbaV0gPSAtMTsKLQludW1fdnRlcm1zID0gaHZjX2ZpbmRfdnR5cygpOwotCXJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25fZHJpdmVyKTsKLQlyZXR1cm4gMDsKLX0KLWNvbnNvbGVfaW5pdGNhbGwoaHZjX2NvbnNvbGVfaW5pdCk7Ci0KLW1vZHVsZV9pbml0KGh2Y19pbml0KTsKIG1vZHVsZV9leGl0KGh2Y19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfdmlvLmMgYi9kcml2ZXJzL2NoYXIvaHZjX3Zpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmI5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaHZjX3Zpby5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogdmlvIGRyaXZlciBpbnRlcmZhY2UgdG8gaHZjX2NvbnNvbGUuYworICoKKyAqIFRoaXMgY29kZSB3YXMgbW92ZWQgaGVyZSB0byBhbGxvdyB0aGUgcmVtYWluZyBjb2RlIHRvIGJlIHJldXNlZCBhcyBhCisgKiBnZW5lcmljIHBvbGxpbmcgbW9kZSB3aXRoIHNlbWktcmVsaWFibGUgdHJhbnNwb3J0IGRyaXZlciBjb3JlIHRvIHRoZQorICogY29uc29sZSBhbmQgdHR5IHN1YnN5c3RlbXMuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KKyAqIENvcHlyaWdodCAoQykgMjAwMSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQGF1LmlibS5jb20+LCBJQk0KKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBBZGRpdGlvbmFsIEF1dGhvcihzKToKKyAqICBSeWFuIFMuIEFybm9sZCA8cnNhQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9odmNvbnNvbGUuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBodmNfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7InNlcmlhbCIsICJodnRlcm0xIn0sCisJeyBOVUxMLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIGh2Y19kcml2ZXJfdGFibGUpOworCitzdGF0aWMgaW50IGZpbHRlcmVkX2dldF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGdvdDsKKwlpbnQgaTsKKworCWdvdCA9IGh2Y19nZXRfY2hhcnModnRlcm1ubywgYnVmLCBjb3VudCk7CisKKwkvKgorCSAqIFdvcmsgYXJvdW5kIGEgSFYgYnVnIHdoZXJlIGl0IGdpdmVzIHVzIGEgbnVsbAorCSAqIGFmdGVyIGV2ZXJ5IFxyLiAgLS0gcGF1bHVzCisJICovCisJZm9yIChpID0gMTsgaSA8IGdvdDsgKytpKSB7CisJCWlmIChidWZbaV0gPT0gMCAmJiBidWZbaS0xXSA9PSAnXHInKSB7CisJCQktLWdvdDsKKwkJCWlmIChpIDwgZ290KQorCQkJCW1lbW1vdmUoJmJ1ZltpXSwgJmJ1ZltpKzFdLAorCQkJCQlnb3QgLSBpKTsKKwkJfQorCX0KKwlyZXR1cm4gZ290OworfQorCitzdGF0aWMgc3RydWN0IGh2X29wcyBodmNfZ2V0X3B1dF9vcHMgPSB7CisJLmdldF9jaGFycyA9IGZpbHRlcmVkX2dldF9jaGFycywKKwkucHV0X2NoYXJzID0gaHZjX3B1dF9jaGFycywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh2Y192aW9fcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKworCS8qIHByb2JlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVycy4gKi8KKwlpZiAoIXZkZXYgfHwgIWlkKQorCQlyZXR1cm4gLUVQRVJNOworCisJaHAgPSBodmNfYWxsb2ModmRldi0+dW5pdF9hZGRyZXNzLCB2ZGV2LT5pcnEsICZodmNfZ2V0X3B1dF9vcHMpOworCWlmIChJU19FUlIoaHApKQorCQlyZXR1cm4gUFRSX0VSUihocCk7CisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIGhwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBodmNfdmlvX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSBkZXZfZ2V0X2RydmRhdGEoJnZkZXYtPmRldik7CisKKwlyZXR1cm4gaHZjX3JlbW92ZShocCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBodmNfdmlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSBodmNfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gaHZjX2RyaXZlcl90YWJsZSwKKwkucHJvYmUJCT0gaHZjX3Zpb19wcm9iZSwKKwkucmVtb3ZlCQk9IGh2Y192aW9fcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IGh2Y192aW9faW5pdCh2b2lkKQoreworCWludCByYzsKKworCS8qIFJlZ2lzdGVyIGFzIGEgdmlvIGRldmljZSB0byByZWNlaXZlIGNhbGxiYWNrcyAqLworCXJjID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaHZjX3Zpb19kcml2ZXIpOworCisJcmV0dXJuIHJjOworfQorbW9kdWxlX2luaXQoaHZjX3Zpb19pbml0KTsgLyogYWZ0ZXIgZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgKi8KKworc3RhdGljIHZvaWQgaHZjX3Zpb19leGl0KHZvaWQpCit7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZodmNfdmlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChodmNfdmlvX2V4aXQpOworCisvKiB0aGUgZGV2aWNlIHRyZWUgb3JkZXIgZGVmaW5lcyBvdXIgbnVtYmVyaW5nICovCitzdGF0aWMgaW50IGh2Y19maW5kX3Z0eXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnZ0eTsKKwlpbnQgbnVtX2ZvdW5kID0gMDsKKworCWZvciAodnR5ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZ0eSIpOyB2dHkgIT0gTlVMTDsKKwkJCXZ0eSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHZ0eSwgInZ0eSIpKSB7CisJCXVpbnQzMl90ICp2dGVybW5vOworCisJCS8qIFdlIGhhdmUgc3RhdGljYWxseSBkZWZpbmVkIHNwYWNlIGZvciBvbmx5IGEgY2VydGFpbiBudW1iZXIKKwkJICogb2YgY29uc29sZSBhZGFwdGVycy4KKwkJICovCisJCWlmIChudW1fZm91bmQgPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJCWJyZWFrOworCisJCXZ0ZXJtbm8gPSAodWludDMyX3QgKilnZXRfcHJvcGVydHkodnR5LCAicmVnIiwgTlVMTCk7CisJCWlmICghdnRlcm1ubykKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZSh2dHksICJodnRlcm0xIikpIHsKKwkJCWh2Y19pbnN0YW50aWF0ZSgqdnRlcm1ubywgbnVtX2ZvdW5kLCAmaHZjX2dldF9wdXRfb3BzKTsKKwkJCSsrbnVtX2ZvdW5kOworCQl9CisJfQorCisJcmV0dXJuIG51bV9mb3VuZDsKK30KK2NvbnNvbGVfaW5pdGNhbGwoaHZjX2ZpbmRfdnR5cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZzaS5jIGIvZHJpdmVycy9jaGFyL2h2c2kuYwppbmRleCBmMWYxMTkyLi5hMjJhYTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZzaS5jCisrKyBiL2RyaXZlcnMvY2hhci9odnNpLmMKQEAgLTI5MSwxNSArMjkxLDEzIEBACiAJZHVtcF9oZXgocGFja2V0LCBoZWFkZXItPmxlbik7CiB9CiAKLS8qIGNhbid0IHVzZSBodmNfZ2V0X2NoYXJzIGJlY2F1c2UgdGhhdCBzdHJpcHMgQ1JzICovCiBzdGF0aWMgaW50IGh2c2lfcmVhZChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIGdvdDsKIAotCWlmIChwbHBhcl9oY2FsbChIX0dFVF9URVJNX0NIQVIsIGhwLT52dGVybW5vLCAwLCAwLCAwLCAmZ290LAotCQkJKHVuc2lnbmVkIGxvbmcgKilidWYsICh1bnNpZ25lZCBsb25nICopYnVmKzEpID09IEhfU3VjY2VzcykKLQkJcmV0dXJuIGdvdDsKLQlyZXR1cm4gMDsKKwlnb3QgPSBodmNfZ2V0X2NoYXJzKGhwLT52dGVybW5vLCBidWYsIGNvdW50KTsKKworCXJldHVybiBnb3Q7CiB9CiAKIHN0YXRpYyB2b2lkIGh2c2lfcmVjdl9jb250cm9sKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnBhY2tldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20uYwppbmRleCA3ZTZhYzE0Li4zNDgwNTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jCkBAIC01NzksNyArNTc5LDcgQEAKIAogCS8qIFByb2JlIGZvciBJbnRlbCwgQU1EIFJOR3MgKi8KIAlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZW50ID0gcGNpX21hdGNoX2RldmljZSAocm5nX3BjaV90YmwsIHBkZXYpOworCQllbnQgPSBwY2lfbWF0Y2hfaWQocm5nX3BjaV90YmwsIHBkZXYpOwogCQlpZiAoZW50KSB7CiAJCQlybmdfb3BzID0gJnJuZ192ZW5kb3Jfb3BzW2VudC0+ZHJpdmVyX2RhdGFdOwogCQkJZ290byBtYXRjaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3R0eS5jIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKaW5kZXggZWRiYTVhMy4uMDkxMDNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25fdHR5LmMKKysrIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKQEAgLTc3MCwxMCArNzcwLDggQEAKIAkJfQogCQlpZiAoYyA9PSAnXG4nKSB7CiAJCQlpZiAoTF9FQ0hPKHR0eSkgfHwgTF9FQ0hPTkwodHR5KSkgewotCQkJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpIHsKKwkJCQlpZiAodHR5LT5yZWFkX2NudCA+PSBOX1RUWV9CVUZfU0laRS0xKQogCQkJCQlwdXRfY2hhcignXGEnLCB0dHkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQogCQkJCW9wb3N0KCdcbicsIHR0eSk7CiAJCQl9CiAJCQlnb3RvIGhhbmRsZV9uZXdsaW5lOwpAQCAtNzkwLDEwICs3ODgsOCBAQAogCQkJICogWFhYIGFyZSBFT0xfQ0hBUiBhbmQgRU9MMl9DSEFSIGVjaG9lZD8hPwogCQkJICovCiAJCQlpZiAoTF9FQ0hPKHR0eSkpIHsKLQkJCQlpZiAodHR5LT5yZWFkX2NudCA+PSBOX1RUWV9CVUZfU0laRS0xKSB7CisJCQkJaWYgKHR0eS0+cmVhZF9jbnQgPj0gTl9UVFlfQlVGX1NJWkUtMSkKIAkJCQkJcHV0X2NoYXIoJ1xhJywgdHR5KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KIAkJCQkvKiBSZWNvcmQgdGhlIGNvbHVtbiBvZiBmaXJzdCBjYW5vbiBjaGFyLiAqLwogCQkJCWlmICh0dHktPmNhbm9uX2hlYWQgPT0gdHR5LT5yZWFkX2hlYWQpCiAJCQkJCXR0eS0+Y2Fub25fY29sdW1uID0gdHR5LT5jb2x1bW47CkBAIC04NjIsMTIgKzg1OCw5IEBACiAJICogdGhhdCBlcmFzZSBjaGFyYWN0ZXJzIHdpbGwgYmUgaGFuZGxlZC4gIE90aGVyIGV4Y2VzcwogCSAqIGNoYXJhY3RlcnMgd2lsbCBiZSBiZWVwZWQuCiAJICovCi0JaWYgKHR0eS0+aWNhbm9uICYmICF0dHktPmNhbm9uX2RhdGEpCi0JCXJldHVybiBOX1RUWV9CVUZfU0laRTsKLQotCWlmIChsZWZ0ID4gMCkKLQkJcmV0dXJuIGxlZnQ7Ci0JcmV0dXJuIDA7CisJaWYgKGxlZnQgPD0gMCkKKwkJbGVmdCA9IHR0eS0+aWNhbm9uICYmICF0dHktPmNhbm9uX2RhdGE7CisJcmV0dXJuIGxlZnQ7CiB9CiAKIC8qKgpAQCAtMTQ3MywxMyArMTQ2NiwxNyBAQAogCQkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9jaGFycykKIAkJCQl0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnModHR5KTsKIAkJfSBlbHNlIHsKLQkJCWMgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBiLCBucik7Ci0JCQlpZiAoYyA8IDApIHsKLQkJCQlyZXR2YWwgPSBjOwotCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJd2hpbGUgKG5yID4gMCkgeworCQkJCWMgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBiLCBucik7CisJCQkJaWYgKGMgPCAwKSB7CisJCQkJCXJldHZhbCA9IGM7CisJCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJCX0KKwkJCQlpZiAoIWMpCisJCQkJCWJyZWFrOworCQkJCWIgKz0gYzsKKwkJCQluciAtPSBjOwogCQkJfQotCQkJYiArPSBjOwotCQkJbnIgLT0gYzsKIAkJfQogCQlpZiAoIW5yKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKaW5kZXggOGYzNmIxNy4uN2EwYzc0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKQEAgLTcxLDcgKzcxLDYgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTU5MywxMSArNTkyLDYgQEAKICAgICBkZXZfbGlzdCA9IGxpbms7CiAKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCSAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCSAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZtZ3NscGNfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTMwOTMsNiArMzA4Nyw3IEBACiAJCS5uYW1lCT0gInN5bmNsaW5rX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gbWdzbHBjX2F0dGFjaCwKKwkuZXZlbnQJCT0gbWdzbHBjX2V2ZW50LAogCS5kZXRhY2gJCT0gbWdzbHBjX2RldGFjaCwKIAkuaWRfdGFibGUJPSBtZ3NscGNfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCA0NjBiNWQ0Li42YjExZDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC0yNzEsNyArMjcxLDcgQEAKICAqIHNhbXBsZXMgdG8gYXZvaWQgd2FzdGluZyBDUFUgdGltZSBhbmQgcmVkdWNlIGxvY2sgY29udGVudGlvbi4KICAqLwogCi1zdGF0aWMgaW50IHRyaWNrbGVfdGhyZXNoID0gSU5QVVRfUE9PTF9XT1JEUyAqIDI4Oworc3RhdGljIGludCB0cmlja2xlX3RocmVzaCBfX3JlYWRfbW9zdGx5ID0gSU5QVVRfUE9PTF9XT1JEUyAqIDI4OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCB0cmlja2xlX2NvdW50KSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeXNycS5jIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKaW5kZXggYWY3OTgwNS4uMTJkNTYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5c3JxLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogCiBzdGF0aWMgdm9pZCBtb29tX2NhbGxiYWNrKHZvaWQgKmlnbm9yZWQpCiB7Ci0Jb3V0X29mX21lbW9yeShHRlBfS0VSTkVMKTsKKwlvdXRfb2ZfbWVtb3J5KEdGUF9LRVJORUwsIDApOwogfQogCiBzdGF0aWMgREVDTEFSRV9XT1JLKG1vb21fd29yaywgbW9vbV9jYWxsYmFjaywgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGIwMjE5LmMgYi9kcml2ZXJzL2NoYXIvdGIwMjE5LmMKaW5kZXggNTQxM2YyOS4uZWI3MDU4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RiMDIxOS5jCisrKyBiL2RyaXZlcnMvY2hhci90YjAyMTkuYwpAQCAtMjQsNiArMjQsOCBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS92cjQxeHgvZ2l1Lmg+CisjaW5jbHVkZSA8YXNtL3ZyNDF4eC90YjAyMTkuaD4KIAogTU9EVUxFX0FVVEhPUigiWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVEFOQkFDIFRCMDIxOSBiYXNlIGJvYXJkIGRyaXZlciIpOwpAQCAtMjY2LDYgKzI2OCwyMSBAQAogCXRiMDIxOV93cml0ZShUQjAyMTlfUkVTRVQsIDApOwogfQogCitzdGF0aWMgdm9pZCB0YjAyMTlfcGNpX2lycV9pbml0KHZvaWQpCit7CisJLyogUENJIFNsb3QgMSAqLworCXZyNDF4eF9zZXRfaXJxX3RyaWdnZXIoVEIwMjE5X1BDSV9TTE9UMV9QSU4sIElSUV9UUklHR0VSX0xFVkVMLCBJUlFfU0lHTkFMX1RIUk9VR0gpOworCXZyNDF4eF9zZXRfaXJxX2xldmVsKFRCMDIxOV9QQ0lfU0xPVDFfUElOLCBJUlFfTEVWRUxfTE9XKTsKKworCS8qIFBDSSBTbG90IDIgKi8KKwl2cjQxeHhfc2V0X2lycV90cmlnZ2VyKFRCMDIxOV9QQ0lfU0xPVDJfUElOLCBJUlFfVFJJR0dFUl9MRVZFTCwgSVJRX1NJR05BTF9USFJPVUdIKTsKKwl2cjQxeHhfc2V0X2lycV9sZXZlbChUQjAyMTlfUENJX1NMT1QyX1BJTiwgSVJRX0xFVkVMX0xPVyk7CisKKwkvKiBQQ0kgU2xvdCAzICovCisJdnI0MXh4X3NldF9pcnFfdHJpZ2dlcihUQjAyMTlfUENJX1NMT1QzX1BJTiwgSVJRX1RSSUdHRVJfTEVWRUwsIElSUV9TSUdOQUxfVEhST1VHSCk7CisJdnI0MXh4X3NldF9pcnFfbGV2ZWwoVEIwMjE5X1BDSV9TTE9UM19QSU4sIElSUV9MRVZFTF9MT1cpOworfQorCiBzdGF0aWMgaW50IHRiMDIxOV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldHZhbDsKQEAgLTI5Miw2ICszMDksOCBAQAogCW9sZF9tYWNoaW5lX3Jlc3RhcnQgPSBfbWFjaGluZV9yZXN0YXJ0OwogCV9tYWNoaW5lX3Jlc3RhcnQgPSB0YjAyMTlfcmVzdGFydDsKIAorCXRiMDIxOV9wY2lfaXJxX2luaXQoKTsKKwogCWlmIChtYWpvciA9PSAwKSB7CiAJCW1ham9yID0gcmV0dmFsOwogCQlwcmludGsoS0VSTl9JTkZPICJUQjAyMTk6IG1ham9yIG51bWJlciAlZFxuIiwgbWFqb3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uYwppbmRleCBiMTRkNjQyLi41ZDA3ZWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uYwpAQCAtNDAxLDcgKzQwMSw3IEBACiAJICovCiAKIAl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7Ci0JCWlmIChwY2lfbWF0Y2hfZGV2aWNlKGk4eHhfdGNvX3BjaV90YmwsIGRldikpIHsKKwkJaWYgKHBjaV9tYXRjaF9pZChpOHh4X3Rjb19wY2lfdGJsLCBkZXYpKSB7CiAJCQlpOHh4X3Rjb19wY2kgPSBkZXY7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggYmY2MmRmZS4uN2E3ODU5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC04NjksNyArODY5LDcgQEAKICAqCWNwdWZyZXFfc3VzcGVuZCAtIGxldCB0aGUgbG93IGxldmVsIGRyaXZlciBwcmVwYXJlIGZvciBzdXNwZW5kCiAgKi8KIAotc3RhdGljIGludCBjcHVmcmVxX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNkZXYsIHUzMiBzdGF0ZSkKK3N0YXRpYyBpbnQgY3B1ZnJlcV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzZGV2LCBwbV9tZXNzYWdlX3QgcG1zZykKIHsKIAlpbnQgY3B1ID0gc3lzZGV2LT5pZDsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKQEAgLTg5Nyw3ICs4OTcsNyBAQAogCX0KIAogCWlmIChjcHVmcmVxX2RyaXZlci0+c3VzcGVuZCkgewotCQlyZXQgPSBjcHVmcmVxX2RyaXZlci0+c3VzcGVuZChjcHVfcG9saWN5LCBzdGF0ZSk7CisJCXJldCA9IGNwdWZyZXFfZHJpdmVyLT5zdXNwZW5kKGNwdV9wb2xpY3ksIHBtc2cpOwogCQlpZiAocmV0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IHN1c3BlbmQgZmFpbGVkIGluIC0+c3VzcGVuZCAiCiAJCQkJCSJzdGVwIG9uIENQVSAldVxuIiwgY3B1X3BvbGljeS0+Y3B1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCmluZGV4IGVkNzA4YjQuLjcxNDA3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgInBhZGxvY2suaCIKIApAQCAtNTksOCArNjAsMTIgQEAKICNkZWZpbmUgQUVTX0VYVEVOREVEX0tFWV9TSVpFX0IJKEFFU19FWFRFTkRFRF9LRVlfU0laRSAqIHNpemVvZih1aW50MzJfdCkpCiAKIHN0cnVjdCBhZXNfY3R4IHsKLQl1aW50MzJfdCBlX2RhdGFbQUVTX0VYVEVOREVEX0tFWV9TSVpFKzRdOwotCXVpbnQzMl90IGRfZGF0YVtBRVNfRVhURU5ERURfS0VZX1NJWkUrNF07CisJdWludDMyX3QgZV9kYXRhW0FFU19FWFRFTkRFRF9LRVlfU0laRV07CisJdWludDMyX3QgZF9kYXRhW0FFU19FWFRFTkRFRF9LRVlfU0laRV07CisJc3RydWN0IHsKKwkJc3RydWN0IGN3b3JkIGVuY3J5cHQ7CisJCXN0cnVjdCBjd29yZCBkZWNyeXB0OworCX0gY3dvcmQ7CiAJdWludDMyX3QgKkU7CiAJdWludDMyX3QgKkQ7CiAJaW50IGtleV9sZW5ndGg7CkBAIC0yODAsMTAgKzI4NSwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhZXNfY3R4ICphZXNfY3R4KHZvaWQgKmN0eCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBhZXNfY3R4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpY3R4LCBQQURMT0NLX0FMSUdOTUVOVCk7Cit9CisKIHN0YXRpYyBpbnQKIGFlc19zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHVpbnQ4X3QgKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHVpbnQzMl90ICpmbGFncykKIHsKLQlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjdHhfYXJnKTsKIAl1aW50MzJfdCBpLCB0LCB1LCB2LCB3OwogCXVpbnQzMl90IFBbQUVTX0VYVEVOREVEX0tFWV9TSVpFXTsKIAl1aW50MzJfdCByb3VuZHM7CkBAIC0yOTUsMjUgKzMwNSwzNiBAQAogCiAJY3R4LT5rZXlfbGVuZ3RoID0ga2V5X2xlbjsKIAorCS8qCisJICogSWYgdGhlIGhhcmR3YXJlIGlzIGNhcGFibGUgb2YgZ2VuZXJhdGluZyB0aGUgZXh0ZW5kZWQga2V5CisJICogaXRzZWxmIHdlIG11c3Qgc3VwcGx5IHRoZSBwbGFpbiBrZXkgZm9yIGJvdGggZW5jcnlwdGlvbgorCSAqIGFuZCBkZWNyeXB0aW9uLgorCSAqLwogCWN0eC0+RSA9IGN0eC0+ZV9kYXRhOwotCWN0eC0+RCA9IGN0eC0+ZF9kYXRhOwotCi0JLyogRW5zdXJlIDE2LUJ5dGVzIGFsaWdubWVudGF0aW9uIG9mIGtleXMgZm9yIFZJQSBQYWRMb2NrLiAqLwotCWlmICgoaW50KShjdHgtPmVfZGF0YSkgJiAweDBGKQotCQljdHgtPkUgKz0gNCAtICgoKGludCkoY3R4LT5lX2RhdGEpICYgMHgwRikgLyBzaXplb2YgKGN0eC0+ZV9kYXRhWzBdKSk7Ci0KLQlpZiAoKGludCkoY3R4LT5kX2RhdGEpICYgMHgwRikKLQkJY3R4LT5EICs9IDQgLSAoKChpbnQpKGN0eC0+ZF9kYXRhKSAmIDB4MEYpIC8gc2l6ZW9mIChjdHgtPmRfZGF0YVswXSkpOworCWN0eC0+RCA9IGN0eC0+ZV9kYXRhOwogCiAJRV9LRVlbMF0gPSB1aW50MzJfdF9pbiAoaW5fa2V5KTsKIAlFX0tFWVsxXSA9IHVpbnQzMl90X2luIChpbl9rZXkgKyA0KTsKIAlFX0tFWVsyXSA9IHVpbnQzMl90X2luIChpbl9rZXkgKyA4KTsKIAlFX0tFWVszXSA9IHVpbnQzMl90X2luIChpbl9rZXkgKyAxMik7CiAKKwkvKiBQcmVwYXJlIGNvbnRyb2wgd29yZHMuICovCisJbWVtc2V0KCZjdHgtPmN3b3JkLCAwLCBzaXplb2YoY3R4LT5jd29yZCkpOworCisJY3R4LT5jd29yZC5kZWNyeXB0LmVuY2RlYyA9IDE7CisJY3R4LT5jd29yZC5lbmNyeXB0LnJvdW5kcyA9IDEwICsgKGtleV9sZW4gLSAxNikgLyA0OworCWN0eC0+Y3dvcmQuZGVjcnlwdC5yb3VuZHMgPSBjdHgtPmN3b3JkLmVuY3J5cHQucm91bmRzOworCWN0eC0+Y3dvcmQuZW5jcnlwdC5rc2l6ZSA9IChrZXlfbGVuIC0gMTYpIC8gODsKKwljdHgtPmN3b3JkLmRlY3J5cHQua3NpemUgPSBjdHgtPmN3b3JkLmVuY3J5cHQua3NpemU7CisKIAkvKiBEb24ndCBnZW5lcmF0ZSBleHRlbmRlZCBrZXlzIGlmIHRoZSBoYXJkd2FyZSBjYW4gZG8gaXQuICovCiAJaWYgKGFlc19od19leHRrZXlfYXZhaWxhYmxlKGtleV9sZW4pKQogCQlyZXR1cm4gMDsKIAorCWN0eC0+RCA9IGN0eC0+ZF9kYXRhOworCWN0eC0+Y3dvcmQuZW5jcnlwdC5rZXlnZW4gPSAxOworCWN0eC0+Y3dvcmQuZGVjcnlwdC5rZXlnZW4gPSAxOworCiAJc3dpdGNoIChrZXlfbGVuKSB7CiAJY2FzZSAxNjoKIAkJdCA9IEVfS0VZWzNdOwpAQCAtMzY5LDEwICszOTAsOSBAQAogCiAvKiA9PT09PT0gRW5jcnlwdGlvbi9kZWNyeXB0aW9uIHJvdXRpbmVzID09PT09PSAqLwogCi0vKiBUaGlzIGlzIHRoZSByZWFsIGNhbGwgdG8gUGFkTG9jay4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotcGFkbG9ja194Y3J5cHRfZWNiKHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHVpbnQ4X3QgKmtleSwKLQkJICAgdm9pZCAqY29udHJvbF93b3JkLCB1aW50MzJfdCBjb3VudCkKKy8qIFRoZXNlIGFyZSB0aGUgcmVhbCBjYWxsIHRvIFBhZExvY2suICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGFkbG9ja194Y3J5cHRfZWNiKGNvbnN0IHU4ICppbnB1dCwgdTggKm91dHB1dCwgdm9pZCAqa2V5LAorCQkJCSAgICAgIHZvaWQgKmNvbnRyb2xfd29yZCwgdTMyIGNvdW50KQogewogCWFzbSB2b2xhdGlsZSAoInB1c2hmbDsgcG9wZmwiKTsJCS8qIGVuZm9yY2Uga2V5IHJlbG9hZC4gKi8KIAlhc20gdm9sYXRpbGUgKCIuYnl0ZSAweGYzLDB4MGYsMHhhNywweGM4IgkvKiByZXAgeGNyeXB0ZWNiICovCkBAIC0zODAsNjAgKzQwMCw3MCBAQAogCQkgICAgICA6ICJkIihjb250cm9sX3dvcmQpLCAiYiIoa2V5KSwgImMiKGNvdW50KSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1hZXNfcGFkbG9jayh2b2lkICpjdHhfYXJnLCB1aW50OF90ICpvdXRfYXJnLCBjb25zdCB1aW50OF90ICppbl9hcmcsIGludCBlbmNkZWMpCitzdGF0aWMgaW5saW5lIHU4ICpwYWRsb2NrX3hjcnlwdF9jYmMoY29uc3QgdTggKmlucHV0LCB1OCAqb3V0cHV0LCB2b2lkICprZXksCisJCQkJICAgICB1OCAqaXYsIHZvaWQgKmNvbnRyb2xfd29yZCwgdTMyIGNvdW50KQogewotCS8qIERvbid0IGJsaW5kbHkgbW9kaWZ5IHRoaXMgc3RydWN0dXJlIC0gdGhlIGl0ZW1zIG11c3QgCi0JICAgZml0IG9uIDE2LUJ5dGVzIGJvdW5kYXJpZXMhICovCi0Jc3RydWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEgewotCQl1aW50OF90IGJ1ZltBRVNfQkxPQ0tfU0laRV07Ci0JCXVuaW9uIGN3b3JkIGN3b3JkOwotCX07Ci0KLQlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKLQljaGFyIGJpZ2J1ZltzaXplb2Yoc3RydWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEpICsgMTZdOwotCXN0cnVjdCBwYWRsb2NrX3hjcnlwdF9kYXRhICpkYXRhOwotCXZvaWQgKmtleTsKLQotCS8qIFBsYWNlICdkYXRhJyBhdCB0aGUgZmlyc3QgMTYtQnl0ZXMgYWxpZ25lZCBhZGRyZXNzIGluICdiaWdidWYnLiAqLwotCWlmICgoKGxvbmcpYmlnYnVmKSAmIDB4MEYpCi0JCWRhdGEgPSAodm9pZCopKGJpZ2J1ZiArIDE2IC0gKChsb25nKWJpZ2J1ZiAmIDB4MEYpKTsKLQllbHNlCi0JCWRhdGEgPSAodm9pZCopYmlnYnVmOwotCi0JLyogUHJlcGFyZSBDb250cm9sIHdvcmQuICovCi0JbWVtc2V0IChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEpKTsKLQlkYXRhLT5jd29yZC5iLmVuY2RlYyA9ICFlbmNkZWM7CS8qIGluIHRoZSByZXN0IG9mIGNyeXB0b2FwaSBFTkM9MS9ERUM9MCAqLwotCWRhdGEtPmN3b3JkLmIucm91bmRzID0gMTAgKyAoY3R4LT5rZXlfbGVuZ3RoIC0gMTYpIC8gNDsKLQlkYXRhLT5jd29yZC5iLmtzaXplID0gKGN0eC0+a2V5X2xlbmd0aCAtIDE2KSAvIDg7Ci0KLQkvKiBJcyB0aGUgaGFyZHdhcmUgY2FwYWJsZSB0byBnZW5lcmF0ZSB0aGUgZXh0ZW5kZWQga2V5PyAqLwotCWlmICghYWVzX2h3X2V4dGtleV9hdmFpbGFibGUoY3R4LT5rZXlfbGVuZ3RoKSkKLQkJZGF0YS0+Y3dvcmQuYi5rZXlnZW4gPSAxOwotCi0JLyogY3R4LT5FIHN0YXJ0cyB3aXRoIGEgcGxhaW4ga2V5IC0gaWYgdGhlIGhhcmR3YXJlIGlzIGNhcGFibGUKLQkgICB0byBnZW5lcmF0ZSB0aGUgZXh0ZW5kZWQga2V5IGl0c2VsZiB3ZSBtdXN0IHN1cHBseQotCSAgIHRoZSBwbGFpbiBrZXkgZm9yIGJvdGggRW5jcnlwdGlvbiBhbmQgRGVjcnlwdGlvbi4gKi8KLQlpZiAoZW5jZGVjID09IENSWVBUT19ESVJfRU5DUllQVCB8fCBkYXRhLT5jd29yZC5iLmtleWdlbiA9PSAwKQotCQlrZXkgPSBjdHgtPkU7Ci0JZWxzZQotCQlrZXkgPSBjdHgtPkQ7Ci0JCi0JbWVtY3B5KGRhdGEtPmJ1ZiwgaW5fYXJnLCBBRVNfQkxPQ0tfU0laRSk7Ci0JcGFkbG9ja194Y3J5cHRfZWNiKGRhdGEtPmJ1ZiwgZGF0YS0+YnVmLCBrZXksICZkYXRhLT5jd29yZCwgMSk7Ci0JbWVtY3B5KG91dF9hcmcsIGRhdGEtPmJ1ZiwgQUVTX0JMT0NLX1NJWkUpOworCS8qIEVuZm9yY2Uga2V5IHJlbG9hZC4gKi8KKwlhc20gdm9sYXRpbGUgKCJwdXNoZmw7IHBvcGZsIik7CisJLyogcmVwIHhjcnlwdGNiYyAqLworCWFzbSB2b2xhdGlsZSAoIi5ieXRlIDB4ZjMsMHgwZiwweGE3LDB4ZDAiCisJCSAgICAgIDogIitTIiAoaW5wdXQpLCAiK0QiIChvdXRwdXQpLCAiK2EiIChpdikKKwkJICAgICAgOiAiZCIgKGNvbnRyb2xfd29yZCksICJiIiAoa2V5KSwgImMiIChjb3VudCkpOworCXJldHVybiBpdjsKIH0KIAogc3RhdGljIHZvaWQKIGFlc19lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHVpbnQ4X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4pCiB7Ci0JYWVzX3BhZGxvY2soY3R4X2FyZywgb3V0LCBpbiwgQ1JZUFRPX0RJUl9FTkNSWVBUKTsKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjdHhfYXJnKTsKKwlwYWRsb2NrX3hjcnlwdF9lY2IoaW4sIG91dCwgY3R4LT5FLCAmY3R4LT5jd29yZC5lbmNyeXB0LCAxKTsKIH0KIAogc3RhdGljIHZvaWQKIGFlc19kZWNyeXB0KHZvaWQgKmN0eF9hcmcsIHVpbnQ4X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4pCiB7Ci0JYWVzX3BhZGxvY2soY3R4X2FyZywgb3V0LCBpbiwgQ1JZUFRPX0RJUl9ERUNSWVBUKTsKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjdHhfYXJnKTsKKwlwYWRsb2NrX3hjcnlwdF9lY2IoaW4sIG91dCwgY3R4LT5ELCAmY3R4LT5jd29yZC5kZWNyeXB0LCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhZXNfZW5jcnlwdF9lY2IoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAorCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKSk7CisJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGN0eC0+RSwgJmN0eC0+Y3dvcmQuZW5jcnlwdCwKKwkJCSAgIG5ieXRlcyAvIEFFU19CTE9DS19TSVpFKTsKKwlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFlc19kZWNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCisJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pKTsKKwlwYWRsb2NrX3hjcnlwdF9lY2IoaW4sIG91dCwgY3R4LT5ELCAmY3R4LT5jd29yZC5kZWNyeXB0LAorCQkJICAgbmJ5dGVzIC8gQUVTX0JMT0NLX1NJWkUpOworCXJldHVybiBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWVzX2VuY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKKwkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSkpOworCXU4ICppdjsKKworCWl2ID0gcGFkbG9ja194Y3J5cHRfY2JjKGluLCBvdXQsIGN0eC0+RSwgZGVzYy0+aW5mbywKKwkJCQkmY3R4LT5jd29yZC5lbmNyeXB0LCBuYnl0ZXMgLyBBRVNfQkxPQ0tfU0laRSk7CisJbWVtY3B5KGRlc2MtPmluZm8sIGl2LCBBRVNfQkxPQ0tfU0laRSk7CisKKwlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFlc19kZWNyeXB0X2NiYyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCisJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pKTsKKwlwYWRsb2NrX3hjcnlwdF9jYmMoaW4sIG91dCwgY3R4LT5ELCBkZXNjLT5pbmZvLCAmY3R4LT5jd29yZC5kZWNyeXB0LAorCQkJICAgbmJ5dGVzIC8gQUVTX0JMT0NLX1NJWkUpOworCXJldHVybiBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0gewpAQCAtNDQxLDYgKzQ3MSw3IEBACiAJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCS5jcmFfYmxvY2tzaXplCQk9CUFFU19CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGFlc19jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9CVBBRExPQ0tfQUxJR05NRU5UIC0gMSwKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKIAkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYWVzX2FsZy5jcmFfbGlzdCksCiAJLmNyYV91CQkJPQl7CkBAIC00NDksNyArNDgwLDExIEBACiAJCQkuY2lhX21heF9rZXlzaXplCT0JQUVTX01BWF9LRVlfU0laRSwKIAkJCS5jaWFfc2V0a2V5CSAgIAk9IAlhZXNfc2V0X2tleSwKIAkJCS5jaWFfZW5jcnlwdAkgCT0JYWVzX2VuY3J5cHQsCi0JCQkuY2lhX2RlY3J5cHQJICAJPQlhZXNfZGVjcnlwdAorCQkJLmNpYV9kZWNyeXB0CSAgCT0JYWVzX2RlY3J5cHQsCisJCQkuY2lhX2VuY3J5cHRfZWNiIAk9CWFlc19lbmNyeXB0X2VjYiwKKwkJCS5jaWFfZGVjcnlwdF9lY2IgIAk9CWFlc19kZWNyeXB0X2VjYiwKKwkJCS5jaWFfZW5jcnlwdF9jYmMgCT0JYWVzX2VuY3J5cHRfY2JjLAorCQkJLmNpYV9kZWNyeXB0X2NiYyAgCT0JYWVzX2RlY3J5cHRfY2JjLAogCQl9CiAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2suaCBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2suaAppbmRleCA3YTUwMDYwLi4zY2YyYjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLmgKKysrIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay5oCkBAIC0xMywxOCArMTMsMTggQEAKICNpZm5kZWYgX0NSWVBUT19QQURMT0NLX0gKICNkZWZpbmUgX0NSWVBUT19QQURMT0NLX0gKIAorI2RlZmluZSBQQURMT0NLX0FMSUdOTUVOVCAxNgorCiAvKiBDb250cm9sIHdvcmQuICovCi11bmlvbiBjd29yZCB7Ci0JdWludDMyX3QgY3dvcmRbNF07Ci0Jc3RydWN0IHsKLQkJaW50IHJvdW5kczo0OwotCQlpbnQgYWxnbzozOwotCQlpbnQga2V5Z2VuOjE7Ci0JCWludCBpbnRlcm06MTsKLQkJaW50IGVuY2RlYzoxOwotCQlpbnQga3NpemU6MjsKLQl9IGI7Ci19Oworc3RydWN0IGN3b3JkIHsKKwlpbnQgX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorCQlyb3VuZHM6NCwKKwkJYWxnbzozLAorCQlrZXlnZW46MSwKKwkJaW50ZXJtOjEsCisJCWVuY2RlYzoxLAorCQlrc2l6ZToyOworfSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oUEFETE9DS19BTElHTk1FTlQpKSk7CiAKICNkZWZpbmUgUEZYCSJwYWRsb2NrOiAiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDBkNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0wLDAgKzEsNDIwIEBACisjCisjIEkyQyBTZW5zb3IgY2hpcCBkcml2ZXJzIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0IgorCitjb25maWcgSFdNT04KKwl0cmlzdGF0ZSAiSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlcyBsZXQgeW91IG1vbml0b3IgdGhlIGhhcmR3YXJlIGhlYWx0aAorCSAgb2YgYSBzeXN0ZW0uIE1vc3QgbW9kZXJuIG1vdGhlcmJvYXJkcyBpbmNsdWRlIHN1Y2ggYSBkZXZpY2UuIEl0CisJICBjYW4gaW5jbHVkZSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCB2b2x0YWdlIHNlbnNvcnMsIGZhbiBzcGVlZAorCSAgc2Vuc29ycyBhbmQgdmFyaW91cyBhZGRpdGlvbmFsIGZlYXR1cmVzIHN1Y2ggYXMgdGhlIGFiaWxpdHkgdG8KKwkgIGNvbnRyb2wgdGhlIHNwZWVkIG9mIHRoZSBmYW5zLgorCitjb25maWcgU0VOU09SU19BRE0xMDIxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjEgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyMQorCSAgYW5kIEFETTEwMjMgc2Vuc29yIGNoaXBzIGFuZCBjbG9uZXM6IE1heGltIE1BWDE2MTcgYW5kIE1BWDE2MTdBLAorCSAgR2VuZXN5cyBMb2dpYyBHTDUyM1NNLCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODQsIFRJIFRITUMxMCwKKwkgIGFuZCB0aGUgWEVPTiBwcm9jZXNzb3IgYnVpbHQtaW4gc2Vuc29yLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZG0xMDIxLgorCitjb25maWcgU0VOU09SU19BRE0xMDI1CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjUgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjUKKwkgIGFuZCBQaGlsaXBzIE5FMTYxOSBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjUuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEwMjYKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyNiBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyNgorCSAgc2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjYuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEwMzEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAzMSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAzMQorCSAgYW5kIEFETTEwMzAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZG0xMDMxLgorCitjb25maWcgU0VOU09SU19BRE05MjQwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTkyNDAgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTkyNDAsCisJICBEYWxsYXMgRFMxNzgwLCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODEgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZG05MjQwLgorCitjb25maWcgU0VOU09SU19BU0IxMDAKKwl0cmlzdGF0ZSAiQXN1cyBBU0IxMDAgQmFjaCIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQVNCMTAwIEJhY2ggc2Vuc29yCisJICBjaGlwIGZvdW5kIG9uIHNvbWUgQXN1cyBtYWluYm9hcmRzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhc2IxMDAuCisKK2NvbmZpZyBTRU5TT1JTX0FUWFAxCisJdHJpc3RhdGUgIkF0dGFuc2ljIEFUWFAxIFZJRCBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBBdHRhbnNpYyBBVFhQMSBWSUQKKwkgIGNvbnRyb2xsZXIuCisKKwkgIElmIHlvdXIgYm9hcmQgaGF2ZSBzdWNoIGEgY2hpcCwgeW91IGFyZSBhYmxlIHRvIGNvbnRyb2wgeW91ciBDUFUKKwkgIGNvcmUgYW5kIG90aGVyIHZvbHRhZ2VzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhdHhwMS4KKworY29uZmlnIFNFTlNPUlNfRFMxNjIxCisJdHJpc3RhdGUgIkRhbGxhcyBTZW1pY29uZHVjdG9yIERTMTYyMSBhbmQgRFMxNjI1IgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yCisJICBEUzE2MjEgYW5kIERTMTYyNSBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRzMTYyMS4KKworY29uZmlnIFNFTlNPUlNfRlNDSEVSCisJdHJpc3RhdGUgIkZTQyBIZXJtZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCisJICBDb21wdXRlcnMgSGVybWVzIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZnNjaGVyLgorCitjb25maWcgU0VOU09SU19GU0NQT1MKKwl0cmlzdGF0ZSAiRlNDIFBvc2VpZG9uIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEZ1aml0c3UgU2llbWVucworCSAgQ29tcHV0ZXJzIFBvc2VpZG9uIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZnNjcG9zLgorCitjb25maWcgU0VOU09SU19HTDUxOFNNCisJdHJpc3RhdGUgIkdlbmVzeXMgTG9naWMgR0w1MThTTSIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdlbmVzeXMgTG9naWMgR0w1MThTTQorCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnbDUxOHNtLgorCitjb25maWcgU0VOU09SU19HTDUyMFNNCisJdHJpc3RhdGUgIkdlbmVzeXMgTG9naWMgR0w1MjBTTSIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBHZW5lc3lzIExvZ2ljIEdMNTIwU00KKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2w1MjBzbS4KKworY29uZmlnIFNFTlNPUlNfSVQ4NworCXRyaXN0YXRlICJJVEUgSVQ4N3h4IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIElURSBJVDg3eHggc2Vuc29yIGNoaXBzCisJICBhbmQgY2xvbmVzOiBTaVM5NjAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGl0ODcuCisKK2NvbmZpZyBTRU5TT1JTX0xNNjMKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTYzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisJICBMTTYzIHJlbW90ZSBkaW9kZSBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciB3aXRoIGludGVncmF0ZWQgZmFuCisJICBjb250cm9sLiAgU3VjaCBjaGlwcyBhcmUgZm91bmQgb24gdGhlIFR5YW4gUzQ4ODIgKFRodW5kZXIgSzhRUyBQcm8pCisJICBtb3RoZXJib2FyZCwgYW1vbmcgb3RoZXJzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTYzLgorCitjb25maWcgU0VOU09SU19MTTc1CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzUKKwkgIHNlbnNvciBjaGlwcyBhbmQgY2xvbmVzOiBEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzc1IGFuZCBEUzE3NzUgKGluCisJICA5LWJpdCBwcmVjaXNpb24gbW9kZSksIGFuZCBUZWxDb20gKG5vdyBNaWNyb2NoaXApIFRDTjc1LgorCisJICBUaGUgRFM3NSBhbmQgRFMxNzc1IGluIDEwLSB0byAxMi1iaXQgcHJlY2lzaW9uIG1vZGVzIHdpbGwgcmVxdWlyZQorCSAgYSBmb3JjZSBtb2R1bGUgcGFyYW1ldGVyLiBUaGUgZHJpdmVyIHdpbGwgbm90IGhhbmRsZSB0aGUgZXh0cmEKKwkgIHByZWNpc2lvbiBhbnlob3cuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtNzUuCisKK2NvbmZpZyBTRU5TT1JTX0xNNzcKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc3IgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NworCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTc3LgorCitjb25maWcgU0VOU09SU19MTTc4CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03OCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc4LAorCSAgTE03OC1KIGFuZCBMTTc5LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTc4LgorCitjb25maWcgU0VOU09SU19MTTgwCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MCIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisJICBMTTgwIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG04MC4KKworY29uZmlnIFNFTlNPUlNfTE04MworCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisJICBMTTgzIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG04My4KKworY29uZmlnIFNFTlNPUlNfTE04NQorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODUgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NQorCSAgc2Vuc29yIGNoaXBzIGFuZCBjbG9uZXM6IEFEVDc0NjMsIEVNQzZEMTAwLCBFTUM2RDEwMiBhbmQgQURNMTAyNy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG04NS4KKworY29uZmlnIFNFTlNPUlNfTE04NworCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODciCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg3CisJICBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtODcuCisKK2NvbmZpZyBTRU5TT1JTX0xNOTAKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkwIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MCwKKwkgIExNODYsIExNODkgYW5kIExNOTksIEFuYWxvZyBEZXZpY2VzIEFETTEwMzIgYW5kIE1heGltIE1BWDY2NTcgYW5kCisJICBNQVg2NjU4IHNlbnNvciBjaGlwcy4KKworCSAgVGhlIEFuYWxvZyBEZXZpY2VzIEFEVDc0NjEgc2Vuc29yIGNoaXAgaXMgYWxzbyBzdXBwb3J0ZWQsIGJ1dCBvbmx5CisJICBpZiBmb3VuZCBpbiBBRE0xMDMyIGNvbXBhdGliaWxpdHkgbW9kZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG05MC4KKworY29uZmlnIFNFTlNPUlNfTE05MgorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTIgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MgorCSAgYW5kIE1heGltIE1BWDY2MzUgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTkyLgorCitjb25maWcgU0VOU09SU19NQVgxNjE5CisJdHJpc3RhdGUgIk1heGltIE1BWDE2MTkgc2Vuc29yIGNoaXAiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTYxOSBzZW5zb3IgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTYxOS4KKworY29uZmlnIFNFTlNPUlNfUEM4NzM2MAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczNjAgZmFtaWx5IgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCisJICBmdW5jdGlvbnMgb2YgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2eCBTdXBlci1JL08gY2hpcHMuCisJICBUaGUgUEM4NzM2MCwgUEM4NzM2MyBhbmQgUEM4NzM2NCBvbmx5IGhhdmUgZmFuIG1vbml0b3JpbmcgYW5kCisJICBjb250cm9sLiAgVGhlIFBDODczNjUgYW5kIFBDODczNjYgYWRkaXRpb25hbGx5IGhhdmUgdm9sdGFnZSBhbmQKKwkgIHRlbXBlcmF0dXJlIG1vbml0b3JpbmcuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHBjODczNjAuCisKK2NvbmZpZyBTRU5TT1JTX1NJUzU1OTUKKwl0cmlzdGF0ZSAiU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycC4gU2lTNTU5NSIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCisJICBTaVM1NTk1IFNvdXRoIEJyaWRnZXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNpczU1OTUuCisKK2NvbmZpZyBTRU5TT1JTX1NNU0M0N00xCisJdHJpc3RhdGUgIlNNU0MgTFBDNDdNMTB4IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgorCSAgbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlIFNNU0MgTFBDNDdCMjd4LAorCSAgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4IGFuZCBMUEM0N00xOTIgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N20xLgorCitjb25maWcgU0VOU09SU19TTVNDNDdCMzk3CisJdHJpc3RhdGUgIlNNU0MgTFBDNDdCMzk3LU5DIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFNNU0MgTFBDNDdCMzk3LU5DCisJICBzZW5zb3IgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc21zYzQ3YjM5Ny4KKworY29uZmlnIFNFTlNPUlNfVklBNjg2QQorCXRyaXN0YXRlICJWSUE2ODZBIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIFBDSQorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQgc2Vuc29ycyBpbgorCSAgVmlhIDY4NkEvQiBTb3V0aCBCcmlkZ2VzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB2aWE2ODZhLgorCitjb25maWcgU0VOU09SU19XODM3ODFECisJdHJpc3RhdGUgIldpbmJvbmQgVzgzNzgxRCwgVzgzNzgyRCwgVzgzNzgzUywgVzgzNjI3SEYsIEFzdXMgQVM5OTEyN0YiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM3OHggc2VyaWVzCisJICBvZiBzZW5zb3IgY2hpcHM6IHRoZSBXODM3ODFELCBXODM3ODJELCBXODM3ODNTIGFuZCBXODM2MjdIRiwKKwkgIGFuZCB0aGUgc2ltaWxhciBBc3VzIEFTOTkxMjdGLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ODM3ODFkLgorCitjb25maWcgU0VOU09SU19XODNMNzg1VFMKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODNMNzg1VFMtUyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODNMNzg1VFMtUworCSAgc2Vuc29yIGNoaXAsIHdoaWNoIGlzIHVzZWQgb24gdGhlIEFzdXMgQTdOOFgsIGFtb25nIG90aGVyCisJICBtb3RoZXJib2FyZHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHc4M2w3ODV0cy4KKworY29uZmlnIFNFTlNPUlNfVzgzNjI3SEYKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODM2MjdIRiwgVzgzNjI3VEhGLCBXODM2MzdIRiwgVzgzNjk3SEYiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM2WDcgc2VyaWVzCisJICBvZiBzZW5zb3IgY2hpcHM6IHRoZSBXODM2MjdIRiwgVzgzNjI3VEhGLCBXODM2MzdIRiwgYW5kIHRoZSBXODM2OTdIRgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ODM2MjdoZi4KKworY29uZmlnIFNFTlNPUlNfVzgzNjI3RUhGCisJdHJpc3RhdGUgIldpbmJvbmQgVzgzNjI3RUhGIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgdGhlIGhhcmR3YXJlCisJICBtb25pdG9yaW5nIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIFdpbmJvbmQgVzgzNjI3RUhGIFN1cGVyLUkvTyBjaGlwLgorCSAgT25seSBmYW4gYW5kIHRlbXBlcmF0dXJlIGlucHV0cyBhcmUgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQsIHdoaWxlCisJICB0aGUgY2hpcCBkb2VzIG11Y2ggbW9yZSB0aGFuIHRoYXQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHc4MzYyN2VoZi4KKworY29uZmlnIEhXTU9OX0RFQlVHX0NISVAKKwlib29sICJIYXJkd2FyZSBNb25pdG9yaW5nIENoaXAgZGVidWdnaW5nIG1lc3NhZ2VzIgorCWRlcGVuZHMgb24gSFdNT04KKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBJMkMgY2hpcCBkcml2ZXJzIHRvIHByb2R1Y2UgYSBidW5jaCBvZgorCSAgZGVidWcgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2cuICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIGhhdmluZworCSAgYSBwcm9ibGVtIHdpdGggSTJDIHN1cHBvcnQgYW5kIHdhbnQgdG8gc2VlIG1vcmUgb2Ygd2hhdCBpcyBnb2luZworCSAgb24uCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ODE0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHNlbnNvciBjaGlwIGRyaXZlcnMuCisjCisKKyMgYXNiMTAwLCB0aGVuIHc4Mzc4MWQgZ28gZmlyc3QsIGFzIHRoZXkgY2FuIG92ZXJyaWRlIG90aGVyIGRyaXZlcnMnIGFkZHJlc3Nlcy4KK29iai0kKENPTkZJR19TRU5TT1JTX0FTQjEwMCkJKz0gYXNiMTAwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1c4MzYyN0hGKQkrPSB3ODM2MjdoZi5vCitvYmotJChDT05GSUdfU0VOU09SU19XODM3ODFEKQkrPSB3ODM3ODFkLm8KKworb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyMSkJKz0gYWRtMTAyMS5vCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDI1KQkrPSBhZG0xMDI1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjYpCSs9IGFkbTEwMjYubworb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAzMSkJKz0gYWRtMTAzMS5vCitvYmotJChDT05GSUdfU0VOU09SU19BRE05MjQwKQkrPSBhZG05MjQwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FUWFAxKQkrPSBhdHhwMS5vCitvYmotJChDT05GSUdfU0VOU09SU19EUzE2MjEpCSs9IGRzMTYyMS5vCitvYmotJChDT05GSUdfU0VOU09SU19GU0NIRVIpCSs9IGZzY2hlci5vCitvYmotJChDT05GSUdfU0VOU09SU19GU0NQT1MpCSs9IGZzY3Bvcy5vCitvYmotJChDT05GSUdfU0VOU09SU19HTDUxOFNNKQkrPSBnbDUxOHNtLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0dMNTIwU00pCSs9IGdsNTIwc20ubworb2JqLSQoQ09ORklHX1NFTlNPUlNfSVQ4NykJKz0gaXQ4Ny5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTYzKQkrPSBsbTYzLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNNzUpCSs9IGxtNzUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03NykJKz0gbG03Ny5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTc4KQkrPSBsbTc4Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNODApCSs9IGxtODAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04MykJKz0gbG04My5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTg1KQkrPSBsbTg1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNODcpCSs9IGxtODcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05MCkJKz0gbG05MC5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTkyKQkrPSBsbTkyLm8KK29iai0kKENPTkZJR19TRU5TT1JTX01BWDE2MTkpCSs9IG1heDE2MTkubworb2JqLSQoQ09ORklHX1NFTlNPUlNfUEM4NzM2MCkJKz0gcGM4NzM2MC5vCitvYmotJChDT05GSUdfU0VOU09SU19TSVM1NTk1KQkrPSBzaXM1NTk1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcpKz0gc21zYzQ3YjM5Ny5vCitvYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdNMSkJKz0gc21zYzQ3bTEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVklBNjg2QSkJKz0gdmlhNjg2YS5vCitvYmotJChDT05GSUdfU0VOU09SU19XODM2MjdFSEYpCSs9IHc4MzYyN2VoZi5vCitvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4M2w3ODV0cy5vCisKK2lmZXEgKCQoQ09ORklHX0hXTU9OX0RFQlVHX0NISVApLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyMS5jIGIvZHJpdmVycy9od21vbi9hZG0xMDIxLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjEuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9hZG0xMDIxLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjUuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyNS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDI1LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vYWRtMTAyNS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDI2LmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjYuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNi5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2FkbTEwMjYuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAzMS5jIGIvZHJpdmVycy9od21vbi9hZG0xMDMxLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMzEuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9hZG0xMDMxLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTkyNDAuYyBiL2RyaXZlcnMvaHdtb24vYWRtOTI0MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9hZG05MjQwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vYWRtOTI0MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9hc2IxMDAuYyBiL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2FzYjEwMC5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2FzYjEwMC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9hdHhwMS5jIGIvZHJpdmVycy9od21vbi9hdHhwMS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9hdHhwMS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2F0eHAxLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTYyMS5jIGIvZHJpdmVycy9od21vbi9kczE2MjEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZHMxNjIxLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZHMxNjIxLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY2hlci5jIGIvZHJpdmVycy9od21vbi9mc2NoZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZnNjaGVyLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZnNjaGVyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY3Bvcy5jIGIvZHJpdmVycy9od21vbi9mc2Nwb3MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZnNjcG9zLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZnNjcG9zLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTE4c20uYyBiL2RyaXZlcnMvaHdtb24vZ2w1MThzbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9nbDUxOHNtLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZ2w1MThzbS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9nbDUyMHNtLmMgYi9kcml2ZXJzL2h3bW9uL2dsNTIwc20uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZ2w1MjBzbS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2dsNTIwc20uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2l0ODcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9pdDg3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNjMuYyBiL2RyaXZlcnMvaHdtb24vbG02My5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTYzLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG02My5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc1LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG03NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtNzUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG03NS5oIGIvZHJpdmVycy9od21vbi9sbTc1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtNzUuaApyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTc1LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzcuYyBiL2RyaXZlcnMvaHdtb24vbG03Ny5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTc3LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG03Ny5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc4LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG03OC5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtNzguYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG04MC5jIGIvZHJpdmVycy9od21vbi9sbTgwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtODAuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTgwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtODMuYyBiL2RyaXZlcnMvaHdtb24vbG04My5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTgzLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG04My5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTg1LmMgYi9kcml2ZXJzL2h3bW9uL2xtODUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG04NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtODUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG04Ny5jIGIvZHJpdmVycy9od21vbi9sbTg3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtODcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTg3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTkwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG05MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTkyLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG05Mi5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtOTIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbWF4MTYxOS5jIGIvZHJpdmVycy9od21vbi9tYXgxNjE5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL21heDE2MTkuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9tYXgxNjE5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjODczNjAuYyBiL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9wYzg3MzYwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcGM4NzM2MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvc2lzNTU5NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvc21zYzQ3YjM5Ny5jIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N2IzOTcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N20xLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdmlhNjg2YS5jIGIvZHJpdmVycy9od21vbi92aWE2ODZhLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvdmlhNjg2YS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwppbmRleCAxMzdkOWI3Li4xNjRkNDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy92aWE2ODZhLmMKKysrIGIvZHJpdmVycy9od21vbi92aWE2ODZhLmMKQEAgLTEsOSArMSw5IEBACiAvKgogICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKLSAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZworCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwogCiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKKwkJCUt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKIAkJCU1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4sCiAJCQlhbmQgQm9iIERvdWdoZXJ0eSA8Ym9iZEBzdGFuZm9yZC5lZHU+CiAgICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwpAQCAtMTcxLDE4ICsxNzEsMTggQEAKIC8qKioqKioqKiBURU1QIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKiovCiAvKiBsaW5lYXIgZml0cyBmcm9tIEhXTW9uLmNwcCAoQ29weXJpZ2h0IDE5OTgtMjAwMCBKb25hdGhhbiBUZWggU29vbiBZZXcpCiAgICAgICBpZih0ZW1wPDE2OSkKLSAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjQyNy0zMi4wODsKKwkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNDI3LTMyLjA4OwogICAgICAgZWxzZSBpZih0ZW1wPj0xNjkgJiYgdGVtcDw9MjAyKQotICAgICAgICAgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNTgyLTU4LjE2OworCSAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC41ODItNTguMTY7CiAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC45MjQtMTI3LjMzOworCSAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC45MjQtMTI3LjMzOwogCiAgQSBmaWZ0aC1vcmRlciBwb2x5bm9taWFsIGZpdHMgdGhlIHVub2ZmaWNpYWwgZGF0YSAocHJvdmlkZWQgYnkgQWxleCB2YW4KICBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+KSBhIGJpdCBiZXR0ZXIuICBJdCBhbHNvIGdpdmUgbW9yZSByZWFzb25hYmxlCiAgbnVtYmVycyBvbiBteSBtYWNoaW5lIChpZS4gdGhleSBhZ3JlZSB3aXRoIHdoYXQgbXkgQklPUyB0ZWxscyBtZSkuCiAgSGVyZSdzIHRoZSBmaWZ0aC1vcmRlciBmaXQgdG8gdGhlIDgtYml0IGRhdGE6CiAgdGVtcCA9IDEuNjI1MDkzZS0xMCp2YWxeNSAtIDEuMDAxNjMyZS0wNyp2YWxeNCArIDIuNDU3NjUzZS0wNSp2YWxeMyAtCi0gICAgICAgIDIuOTY3NjE5ZS0wMyp2YWxeMiArIDIuMTc1MTQ0ZS0wMSp2YWwgLSA3LjA5MDA2N2UrMC4KKwkyLjk2NzYxOWUtMDMqdmFsXjIgKyAyLjE3NTE0NGUtMDEqdmFsIC0gNy4wOTAwNjdlKzAuCiAKICAoMjAwMC0xMC0yNS0gUkZEOiB0aGFua3MgdG8gVXdlIEFuZGVyc2VuIDx1YW5kZXJzZW5AbWF5YWguY29tPiBmb3IKICBmaW5kaW5nIG15IHR5cG9zIGluIHRoaXMgZm9ybXVsYSEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdlaGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3c4MzYyN2VoZi5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdoZi5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy93ODM3ODFkLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODNsNzg1dHMuYyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4NXRzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3c4M2w3ODV0cy5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1pdGUuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCmluZGV4IDY4ZTllNjguLmU2Y2FlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAkJZ290byBiYWlsb3V0OwogCX0KIAlzZGFsbyhhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjEgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAorCXByaW50aygidGVzdF9idXM6MSBzY2w6ICVkICBzZGE6ICVkXG4iLCBnZXRzY2woYWRhcCksCiAJICAgICAgIGdldHNkYShhZGFwKSk7CiAJaWYgKCAwICE9IGdldHNkYShhZGFwKSApIHsKIAkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0RBIHN0dWNrIGhpZ2ghXG4iLG5hbWUpOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJCWdvdG8gYmFpbG91dDsKIAl9CQkKIAlzZGFoaShhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjIgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAorCXByaW50aygidGVzdF9idXM6MiBzY2w6ICVkICBzZGE6ICVkXG4iLCBnZXRzY2woYWRhcCksCiAJICAgICAgIGdldHNkYShhZGFwKSk7CiAJaWYgKCAwID09IGdldHNkYShhZGFwKSApIHsKIAkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0RBIHN0dWNrIGxvdyFcbiIsbmFtZSk7CkBAIC0yMzQsNyArMjM0LDcgQEAKIAlnb3RvIGJhaWxvdXQ7CiAJfQogCXNjbGxvKGFkYXApOwotCXByaW50aygidGVzdF9idXM6MyBzY2w6ICVkICBzZGE6ICVkIFxuIixnZXRzY2woYWRhcCksCisJcHJpbnRrKCJ0ZXN0X2J1czozIHNjbDogJWQgIHNkYTogJWRcbiIsIGdldHNjbChhZGFwKSwKIAkgICAgICAgZ2V0c2RhKGFkYXApKTsKIAlpZiAoIDAgIT0gZ2V0c2NsKGFkYXApICkgewogCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJZ290byBiYWlsb3V0OwogCX0KIAlzY2xoaShhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjQgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAorCXByaW50aygidGVzdF9idXM6NCBzY2w6ICVkICBzZGE6ICVkXG4iLCBnZXRzY2woYWRhcCksCiAJICAgICAgIGdldHNkYShhZGFwKSk7CiAJaWYgKCAwID09IGdldHNjbChhZGFwKSApIHsKIAkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0NMIHN0dWNrIGxvdyFcbiIsbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IDQ1ZTZlZmIxLi4wYWI3ZTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBTTUJ1cyBob3N0IGlzIHJlYWR5IHRvIHN0YXJ0IHRyYW5zbWl0dGluZyAqLwogCS8qIDB4MWYgPSBGYWlsZWQsIEJ1c19FcnIsIERldl9FcnIsIEludHIsIEhvc3RfQnVzeSAqLwogCWlmICgodGVtcCA9ICgweDFmICYgaW5iX3AoU01CSFNUU1RTKSkpICE9IDB4MDApIHsKLQkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwgIlNNQnVzIGJ1c3kgKCUwMngpLiBSZXNldHRpbmcuLi4gXG4iLAorCQlkZXZfZGJnKCZJODAxX2Rldi0+ZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuIFJlc2V0dGluZy4uLlxuIiwKIAkJCXRlbXApOwogCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKIAkJaWYgKCh0ZW1wID0gKDB4MWYgJiBpbmJfcChTTUJIU1RTVFMpKSkgIT0gMHgwMCkgewpAQCAtMzE1LDcgKzMxNSw3IEBACiAJCX0KIAkJaWYgKHRlbXAgJiBlcnJtYXNrKSB7CiAJCQlkZXZfZGJnKCZJODAxX2Rldi0+ZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuICIKLQkJCQkiUmVzZXR0aW5nLi4uIFxuIiwgdGVtcCk7CisJCQkJIlJlc2V0dGluZy4uLlxuIiwgdGVtcCk7CiAJCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKIAkJCWlmICgoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAmIGVycm1hc2spICE9IDB4MDApIHsKIAkJCQlkZXZfZXJyKCZJODAxX2Rldi0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYwppbmRleCAzNjNlNTQ1Li45NGFlODA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYwpAQCAtNjk4LDcgKzY5OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNyZWF0ZV9pZmFjZV9tYWNpbyhzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitjcmVhdGVfaWZhY2VfbWFjaW8oc3RydWN0IG1hY2lvX2RldiogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlyZXR1cm4gY3JlYXRlX2lmYWNlKGRldi0+b2ZkZXYubm9kZSwgJmRldi0+b2ZkZXYuZGV2KTsKIH0KQEAgLTcxMCw3ICs3MTAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1jcmVhdGVfaWZhY2Vfb2ZfcGxhdGZvcm0oc3RydWN0IG9mX2RldmljZSogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorY3JlYXRlX2lmYWNlX29mX3BsYXRmb3JtKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJcmV0dXJuIGNyZWF0ZV9pZmFjZShkZXYtPm5vZGUsICZkZXYtPmRldik7CiB9CkBAIC03MjEsMTAgKzcyMSw5IEBACiAJcmV0dXJuIGRpc3Bvc2VfaWZhY2UoJmRldi0+ZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBpMmNfa2V5d2VzdF9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBpMmNfa2V5d2VzdF9tYXRjaFtdID0gCiB7CiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gImkyYyIsCiAJLmNvbXBhdGlibGUJPSAia2V5d2VzdCIKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCmluZGV4IDFmODBiYTkuLjZkMzRlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KIAlpZiAoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAhPSAweDAwKSB7CiAJCWRldl9kYmcoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuICIKLQkJCSJSZXNldHRpbmcuLi4gXG4iLCB0ZW1wKTsKKwkJCSJSZXNldHRpbmcuLi5cbiIsIHRlbXApOwogCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKIAkJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgIT0gMHgwMCkgewogCQkJZGV2X2VycigmcGlpeDRfYWRhcHRlci5kZXYsICJGYWlsZWQhICglMDJ4KVxuIiwgdGVtcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczU1OTUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCmluZGV4IDJiNTkxMWMuLmJiZDVlNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCkBAIC0yMjgsNyArMjI4LDcgQEAKIAkvKiBNYWtlIHN1cmUgdGhlIFNNQnVzIGhvc3QgaXMgcmVhZHkgdG8gc3RhcnQgdHJhbnNtaXR0aW5nICovCiAJdGVtcCA9IHNpczU1OTVfcmVhZChTTUJfU1RTX0xPKSArIChzaXM1NTk1X3JlYWQoU01CX1NUU19ISSkgPDwgOCk7CiAJaWYgKHRlbXAgIT0gMHgwMCkgewotCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJTTUJ1cyBidXN5ICglMDR4KS4gUmVzZXR0aW5nLi4uIFxuIiwgdGVtcCk7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIGJ1c3kgKCUwNHgpLiBSZXNldHRpbmcuLi5cbiIsIHRlbXApOwogCQlzaXM1NTk1X3dyaXRlKFNNQl9TVFNfTE8sIHRlbXAgJiAweGZmKTsKIAkJc2lzNTU5NV93cml0ZShTTUJfU1RTX0hJLCB0ZW1wID4+IDgpOwogCQlpZiAoKHRlbXAgPSBzaXM1NTk1X3JlYWQoU01CX1NUU19MTykgKyAoc2lzNTU5NV9yZWFkKFNNQl9TVFNfSEkpIDw8IDgpKSAhPSAweDAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwppbmRleCBhMDk4MmRhLi40M2Y3MGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKQEAgLTEsNDA5ICsxLDEyIEBACiAjCi0jIEkyQyBTZW5zb3IgYW5kICJvdGhlciIgY2hpcCBjb25maWd1cmF0aW9uCisjIE1pc2NlbGxhbmVvdXMgSTJDIGNoaXAgZHJpdmVycyBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIkhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDCi0KIGNvbmZpZyBJMkNfU0VOU09SCiAJdHJpc3RhdGUKIAlkZWZhdWx0IG4KIAotY29uZmlnIFNFTlNPUlNfQURNMTAyMQotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDIxIGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjEgCi0JICBhbmQgQURNMTAyMyBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogTWF4aW0gTUFYMTYxNyBhbmQgTUFYMTYxN0EsCi0JICBHZW5lc3lzIExvZ2ljIEdMNTIzU00sIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NCwgVEkgVEhNQzEwLAotCSAgYW5kIHRoZSBYRU9OIHByb2Nlc3NvciBidWlsdC1pbiBzZW5zb3IuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjEuCi0KLWNvbmZpZyBTRU5TT1JTX0FETTEwMjUKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyNSBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyNQotCSAgYW5kIFBoaWxpcHMgTkUxNjE5IHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNS4KLQotY29uZmlnIFNFTlNPUlNfQURNMTAyNgotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDI2IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDI2Ci0JICBzZW5zb3IgY2hpcC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNi4KLQotY29uZmlnIFNFTlNPUlNfQURNMTAzMQotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIAotCSAgYW5kIEFETTEwMzAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhZG0xMDMxLgotCi1jb25maWcgU0VOU09SU19BRE05MjQwCi0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTkyNDAgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTkyNDAsCi0JICBEYWxsYXMgRFMxNzgwLCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODEgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhZG05MjQwLgotCi1jb25maWcgU0VOU09SU19BU0IxMDAKLQl0cmlzdGF0ZSAiQXN1cyBBU0IxMDAgQmFjaCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQVNCMTAwIEJhY2ggc2Vuc29yCi0JICBjaGlwIGZvdW5kIG9uIHNvbWUgQXN1cyBtYWluYm9hcmRzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhc2IxMDAuCi0KLWNvbmZpZyBTRU5TT1JTX0FUWFAxCi0JdHJpc3RhdGUgIkF0dGFuc2ljIEFUWFAxIFZJRCBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQXR0YW5zaWMgQVRYUDEgVklECi0JICBjb250cm9sbGVyLgotCi0JICBJZiB5b3VyIGJvYXJkIGhhdmUgc3VjaCBhIGNoaXAsIHlvdSBhcmUgYWJsZSB0byBjb250cm9sIHlvdXIgQ1BVCi0JICBjb3JlIGFuZCBvdGhlciB2b2x0YWdlcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYXR4cDEuCi0KLWNvbmZpZyBTRU5TT1JTX0RTMTYyMQotCXRyaXN0YXRlICJEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzE2MjEgYW5kIERTMTYyNSIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgotCSAgRFMxNjIxIGFuZCBEUzE2MjUgc2Vuc29yIGNoaXBzLiAKLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgZHMxNjIxLgotCi1jb25maWcgU0VOU09SU19GU0NIRVIKLQl0cmlzdGF0ZSAiRlNDIEhlcm1lcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKLQkgIENvbXB1dGVycyBIZXJtZXMgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBmc2NoZXIuCi0KLWNvbmZpZyBTRU5TT1JTX0ZTQ1BPUwotCXRyaXN0YXRlICJGU0MgUG9zZWlkb24iCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCi0JICBDb21wdXRlcnMgUG9zZWlkb24gc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBmc2Nwb3MuCi0KLWNvbmZpZyBTRU5TT1JTX0dMNTE4U00KLQl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUxOFNNIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2VuZXN5cyBMb2dpYyBHTDUxOFNNCi0JICBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGdsNTE4c20uCi0KLWNvbmZpZyBTRU5TT1JTX0dMNTIwU00KLQl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUyMFNNIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdlbmVzeXMgTG9naWMgR0w1MjBTTQotCSAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBnbDUyMHNtLgotCi1jb25maWcgU0VOU09SU19JVDg3Ci0JdHJpc3RhdGUgIklURSBJVDg3eHggYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgSVRFIElUODd4eCBzZW5zb3IgY2hpcHMKLQkgIGFuZCBjbG9uZXM6IFNpUzk2MC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KLQotY29uZmlnIFNFTlNPUlNfTE02MwotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNjMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNNjMgcmVtb3RlIGRpb2RlIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIHdpdGggaW50ZWdyYXRlZCBmYW4KLQkgIGNvbnRyb2wuICBTdWNoIGNoaXBzIGFyZSBmb3VuZCBvbiB0aGUgVHlhbiBTNDg4MiAoVGh1bmRlciBLOFFTIFBybykKLQkgIG1vdGhlcmJvYXJkLCBhbW9uZyBvdGhlcnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNjMuCi0KLWNvbmZpZyBTRU5TT1JTX0xNNzUKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NQotCSAgc2Vuc29yIGNoaXBzIGFuZCBjbG9uZXM6IERhbGxhcyBTZW1pY29uZHVjdG9yIERTNzUgYW5kIERTMTc3NSAoaW4KLQkgIDktYml0IHByZWNpc2lvbiBtb2RlKSwgYW5kIFRlbENvbSAobm93IE1pY3JvY2hpcCkgVENONzUuCi0KLQkgIFRoZSBEUzc1IGFuZCBEUzE3NzUgaW4gMTAtIHRvIDEyLWJpdCBwcmVjaXNpb24gbW9kZXMgd2lsbCByZXF1aXJlCi0JICBhIGZvcmNlIG1vZHVsZSBwYXJhbWV0ZXIuIFRoZSBkcml2ZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleHRyYQotCSAgcHJlY2lzaW9uIGFueWhvdy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbG03NS4KLQotY29uZmlnIFNFTlNPUlNfTE03NwotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzciCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc3Ci0JICBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNzcuCi0KLWNvbmZpZyBTRU5TT1JTX0xNNzgKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc4IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzgsCi0JICBMTTc4LUogYW5kIExNNzkuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNzguCi0KLWNvbmZpZyBTRU5TT1JTX0xNODAKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgwIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNODAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTgwLgotCi1jb25maWcgU0VOU09SU19MTTgzCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNODMgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTgzLgotCi1jb25maWcgU0VOU09SU19MTTg1Ci0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NSBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg1Ci0JICBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogQURUNzQ2MywgRU1DNkQxMDAsIEVNQzZEMTAyIGFuZCBBRE0xMDI3LgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTg1LgotCi1jb25maWcgU0VOU09SU19MTTg3Ci0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKLQkgIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbG04Ny4KLQotY29uZmlnIFNFTlNPUlNfTE05MAotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTAgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkwLAotCSAgTE04NiwgTE04OSBhbmQgTE05OSwgQW5hbG9nIERldmljZXMgQURNMTAzMiBhbmQgTWF4aW0gTUFYNjY1NyBhbmQKLQkgIE1BWDY2NTggc2Vuc29yIGNoaXBzLgotCi0JICBUaGUgQW5hbG9nIERldmljZXMgQURUNzQ2MSBzZW5zb3IgY2hpcCBpcyBhbHNvIHN1cHBvcnRlZCwgYnV0IG9ubHkKLQkgIGlmIGZvdW5kIGluIEFETTEwMzIgY29tcGF0aWJpbGl0eSBtb2RlLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTkwLgotCi1jb25maWcgU0VOU09SU19MTTkyCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MiBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkyCi0JICBhbmQgTWF4aW0gTUFYNjYzNSBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtOTIuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE2MTkKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYxOSBzZW5zb3IgY2hpcCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjE5IHNlbnNvciBjaGlwLgotCSAgCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxNjE5LgotCi1jb25maWcgU0VOU09SU19QQzg3MzYwCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2MCBmYW1pbHkiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGZ1bmN0aW9ucyBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzZ4IFN1cGVyLUkvTyBjaGlwcy4KLQkgIFRoZSBQQzg3MzYwLCBQQzg3MzYzIGFuZCBQQzg3MzY0IG9ubHkgaGF2ZSBmYW4gbW9uaXRvcmluZyBhbmQKLQkgIGNvbnRyb2wuICBUaGUgUEM4NzM2NSBhbmQgUEM4NzM2NiBhZGRpdGlvbmFsbHkgaGF2ZSB2b2x0YWdlIGFuZAotCSAgdGVtcGVyYXR1cmUgbW9uaXRvcmluZy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcGM4NzM2MC4KLQotY29uZmlnIFNFTlNPUlNfU01TQzQ3QjM5NwotCXRyaXN0YXRlICJTTVNDIExQQzQ3QjM5Ny1OQyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTTVNDIExQQzQ3QjM5Ny1OQwotCSAgc2Vuc29yIGNoaXAuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N2IzOTcuCi0KLWNvbmZpZyBTRU5TT1JTX1NJUzU1OTUKLQl0cmlzdGF0ZSAiU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycC4gU2lTNTU5NSIKLQlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCi0JICBTaVM1NTk1IFNvdXRoIEJyaWRnZXMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNpczU1OTUuCi0KLWNvbmZpZyBTRU5TT1JTX1NNU0M0N00xCi0JdHJpc3RhdGUgIlNNU0MgTFBDNDdNMTB4IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgotCSAgbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlIFNNU0MgTFBDNDdCMjd4LAotCSAgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4IGFuZCBMUEM0N00xOTIgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N20xLgotCi1jb25maWcgU0VOU09SU19WSUE2ODZBCi0JdHJpc3RhdGUgIlZJQTY4NkEiCi0JZGVwZW5kcyBvbiBJMkMgJiYgUENJCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCi0JICBWaWEgNjg2QS9CIFNvdXRoIEJyaWRnZXMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHZpYTY4NmEuCi0KLWNvbmZpZyBTRU5TT1JTX1c4Mzc4MUQKLQl0cmlzdGF0ZSAiV2luYm9uZCBXODM3ODFELCBXODM3ODJELCBXODM3ODNTLCBXODM2MjdIRiwgQXN1cyBBUzk5MTI3RiIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc4eCBzZXJpZXMKLQkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MgYW5kIFc4MzYyN0hGLAotCSAgYW5kIHRoZSBzaW1pbGFyIEFzdXMgQVM5OTEyN0YuCi0JICAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHc4Mzc4MWQuCi0KLWNvbmZpZyBTRU5TT1JTX1c4M0w3ODVUUwotCXRyaXN0YXRlICJXaW5ib25kIFc4M0w3ODVUUy1TIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4M0w3ODVUUy1TCi0JICBzZW5zb3IgY2hpcCwgd2hpY2ggaXMgdXNlZCBvbiB0aGUgQXN1cyBBN044WCwgYW1vbmcgb3RoZXIKLQkgIG1vdGhlcmJvYXJkcy4KLQkgIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgdzgzbDc4NXRzLgotCi1jb25maWcgU0VOU09SU19XODM2MjdIRgotCXRyaXN0YXRlICJXaW5ib25kIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBXODM2OTdIRiIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4MzZYNyBzZXJpZXMKLQkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBhbmQgdGhlIFc4MzY5N0hGCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHc4MzYyN2hmLgotCi1jb25maWcgU0VOU09SU19XODM2MjdFSEYKLQl0cmlzdGF0ZSAiV2luYm9uZCBXODM2MjdFSEYiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUKLQkgIG1vbml0b3JpbmcgZnVuY3Rpb25hbGl0eSBvZiB0aGUgV2luYm9uZCBXODM2MjdFSEYgU3VwZXItSS9PIGNoaXAuCi0JICBPbmx5IGZhbiBhbmQgdGVtcGVyYXR1cmUgaW5wdXRzIGFyZSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudCwgd2hpbGUKLQkgIHRoZSBjaGlwIGRvZXMgbXVjaCBtb3JlIHRoYW4gdGhhdC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgdzgzNjI3ZWhmLgotCi1lbmRtZW51Ci0KLW1lbnUgIk90aGVyIEkyQyBDaGlwIHN1cHBvcnQiCittZW51ICJNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNFTlNPUlNfRFMxMzM3CkBAIC01MDksNyArMTEyLDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRwczY1MDEwLgogCi0KIGNvbmZpZyBTRU5TT1JTX000MVQwMAogCXRyaXN0YXRlICJTVCBNNDFUMDAgUlRDIGNoaXAiCiAJZGVwZW5kcyBvbiBJMkMgJiYgUFBDMzIKQEAgLTUyMCwxMyArMTIyLDE2IEBACiAJICB3aWxsIGJlIGNhbGxlZCBtNDF0MDAuCiAKIGNvbmZpZyBTRU5TT1JTX01BWDY4NzUKLQl0cmlzdGF0ZSAiTUFYSU0gTUFYNjg3NSBQb3dlciBzdXBwbHkgc3VwZXJ2aXNvciIKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjg3NSBQb3dlciBzdXBwbHkgc3VwZXJ2aXNvciIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1BWDY4NzUKLQkgIEVFUFJPTS1Qcm9ncmFtbWFibGUsIEhleC9RdWFkLCBQb3dlci1TdXBweSBTZXF1ZW5jZXJzL1N1cGVydmlzb3JzLgorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVg2ODc1CisJICBFRVBST00tcHJvZ3JhbW1hYmxlLCBxdWFkIHBvd2VyLXN1cHBseSBzZXF1ZW5jZXIvc3VwZXJ2aXNvci4KIAotICAgICAgICAgIFRoaXMgcHJvdmlkZXMgYSBpbnRlcmZhY2UgdG8gcHJvZ3JhbSB0aGUgRUVQUk9NIGFuZCByZXNldCB0aGUgY2hpcC4KKwkgIFRoaXMgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHByb2dyYW0gdGhlIEVFUFJPTSBhbmQgcmVzZXQgdGhlIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIE1heGltIE1BWDY4NzQgaGV4IHBvd2VyLXN1cHBseQorCSAgc2VxdWVuY2VyL3N1cGVydmlzb3IgaWYgZm91bmQgYXQgYSBjb21wYXRpYmxlIGFkZHJlc3MuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIG1heDY4NzUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCmluZGV4IGI1ZTZkMmYuLmE4NzZkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCkBAIC0xLDUyICsxLDE2IEBACiAjCi0jIE1ha2VmaWxlIGZvciBzZW5zb3IgYW5kICJvdGhlciIgSTJDIGNoaXAgZHJpdmVycy4KKyMgTWFrZWZpbGUgZm9yIG1pc2NlbGxhbmVvdXMgSTJDIGNoaXAgZHJpdmVycy4KICMKIAotIyBhc2IxMDAsIHRoZW4gdzgzNzgxZCBnbyBmaXJzdCwgYXMgdGhleSBjYW4gb3ZlcnJpZGUgb3RoZXIgZHJpdmVycycgYWRkcmVzc2VzLgotb2JqLSQoQ09ORklHX1NFTlNPUlNfQVNCMTAwKQkrPSBhc2IxMDAubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYpCSs9IHc4MzYyN2hmLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1c4Mzc4MUQpCSs9IHc4Mzc4MWQubwotCi1vYmotJChDT05GSUdfU0VOU09SU19BRE0xMDIxKQkrPSBhZG0xMDIxLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjUpCSs9IGFkbTEwMjUubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNikJKz0gYWRtMTAyNi5vCi1vYmotJChDT05GSUdfU0VOU09SU19BRE0xMDMxKQkrPSBhZG0xMDMxLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0FETTkyNDApCSs9IGFkbTkyNDAubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQVRYUDEpCSs9IGF0eHAxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTMzNykJKz0gZHMxMzM3Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTM3NCkJKz0gZHMxMzc0Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0VFUFJPTSkJKz0gZWVwcm9tLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ0hFUikJKz0gZnNjaGVyLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ1BPUykJKz0gZnNjcG9zLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0dMNTE4U00pCSs9IGdsNTE4c20ubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfR0w1MjBTTSkJKz0gZ2w1MjBzbS5vCi1vYmotJChDT05GSUdfU0VOU09SU19JVDg3KQkrPSBpdDg3Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNNjMpCSs9IGxtNjMubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03NSkJKz0gbG03NS5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTc3KQkrPSBsbTc3Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNNzgpCSs9IGxtNzgubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04MCkJKz0gbG04MC5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTgzKQkrPSBsbTgzLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNODUpCSs9IGxtODUubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04NykJKz0gbG04Ny5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTkwKQkrPSBsbTkwLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNOTIpCSs9IGxtOTIubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVg2ODc1KQkrPSBtYXg2ODc1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX000MVQwMCkJKz0gbTQxdDAwLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1BDODczNjApCSs9IHBjODczNjAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENBOTUzOSkJKz0gcGNhOTUzOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTc0KQkrPSBwY2Y4NTc0Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1BDRjg1OTEpCSs9IHBjZjg1OTEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUlRDODU2NCkJKz0gcnRjODU2NC5vCi1vYmotJChDT05GSUdfU0VOU09SU19TSVM1NTk1KQkrPSBzaXM1NTk1Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcpKz0gc21zYzQ3YjM5Ny5vCi1vYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdNMSkJKz0gc21zYzQ3bTEubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVklBNjg2QSkJKz0gdmlhNjg2YS5vCi1vYmotJChDT05GSUdfU0VOU09SU19XODM2MjdFSEYpCSs9IHc4MzYyN2VoZi5vCi1vYmotJChDT05GSUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4M2w3ODV0cy5vCi0KIG9iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCiBvYmotJChDT05GSUdfVFBTNjUwMTApCQkrPSB0cHM2NTAxMC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2VlcHJvbS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMKaW5kZXggYWRkZjBhZC4uNmVhNDEzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMKQEAgLTE3Myw5ICsxNzMsNiBAQAogCQkJCQkgICAgfCBJMkNfRlVOQ19TTUJVU19CWVRFKSkKIAkJZ290byBleGl0OwogCi0JLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKLQkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KLQkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBlZXByb21fe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLwogCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWVwcm9tX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYwppbmRleCA1ZTQ2M2M0Ny4uNzc4ZDdlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCWludAlyYzsKIAogCWlmICgocmMgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSA9PSAwKSB7Ci0JCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwkJa2ZyZWUoY2xpZW50KTsKIAkJdGFza2xldF9raWxsKCZtNDF0MDBfdGFza2xldCk7CiAJfQogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL21heDY4NzUuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL21heDY4NzUuYwppbmRleCBmZTZiMTUwLi5jNGYxNGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9tYXg2ODc1LmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbWF4Njg3NS5jCkBAIC0zNyw3ICszNyw4IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsweDUwLCAweDUyLCBJMkNfQ0xJRU5UX0VORH07CisvKiBObyBhZGRyZXNzIHNjYW5uZWQgYnkgZGVmYXVsdCwgYXMgdGhpcyBjb3VsZCBjb3JydXB0IHN0YW5kYXJkIEVFUFJPTVMuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0ge0kyQ19DTElFTlRfRU5EfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0ge0kyQ19DTElFTlRfSVNBX0VORH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCkBAIC0zNjksNiArMzcwLDkgQEAKIAluZXdfY2xpZW50LT5kcml2ZXIgPSAmbWF4Njg3NV9kcml2ZXI7CiAJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwogCisJLyogUHJldmVudCAyNFJGMDggY29ycnVwdGlvbiAqLworCWkyY19zbWJ1c193cml0ZV9xdWljayhuZXdfY2xpZW50LCAwKTsKKwogCS8qIFNldHVwIHRoZSB1c2VyIHNlY3Rpb24gKi8KIAlkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fdXNlcl0udHlwZSAgICA9IG1heDY4NzVfZWVwcm9tX3VzZXI7CiAJZGF0YS0+YmxvY2tzW21heDY4NzVfZWVwcm9tX3VzZXJdLnNsaWNlcyAgPSBVU0VSX0VFUFJPTV9TTElDRVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYwppbmRleCBjMGFjMDFiLi4yODBlOTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKQEAgLTE4LDcgKzE4LDYgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwotI3VuZGVmCURFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTQ5LDExICs0OCw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1MDF4IFBvd2VyIE1hbmFnZW1lbnQgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLS8qIG9ubHkgdHdvIGFkZHJlc3NlcyBwb3NzaWJsZSAqLwotI2RlZmluZQlUUFNfQkFTRQkweDQ4Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gewotCVRQU19CQVNFLAotCUkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCAvKiAweDQ5LCAqLyBJMkNfQ0xJRU5UX0VORCB9Owogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNfcmFuZ2VbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKIAogSTJDX0NMSUVOVF9JTlNNT0Q7CkBAIC0xMDIsNyArOTcsNyBAQAogCXU4CQkJY2hnc3RhdHVzLCByZWdzdGF0dXMsIGNoZ2NvbmY7CiAJdTgJCQlubWFzazEsIG5tYXNrMjsKIAotCS8qIHBsdXMgZm91ciBHUElPcywgcHJvYmFibHkgdXNlZCB0byBzd2l0Y2ggcG93ZXIgKi8KKwkvKiBub3QgY3VycmVudGx5IHRyYWNraW5nIEdQSU8gc3RhdGUgKi8KIH07CiAKICNkZWZpbmUJUE9XRVJfUE9MTF9ERUxBWQltc2Vjc190b19qaWZmaWVzKDgwMCkKQEAgLTEzNSw3ICsxMzAsNyBAQAogCQkocmVnc3RhdHVzICYgVFBTX1JFR19DT1ZFUikgPyAiIHVuY292ZXIiIDogIiIsCiAJCShyZWdzdGF0dXMgJiBUUFNfUkVHX1VWTE8pID8gIiBVVkxPIiA6ICIiLAogCQkocmVnc3RhdHVzICYgVFBTX1JFR19OT19DSEcpID8gIiBOT19DSEciIDogIiIsCi0JCShyZWdzdGF0dXMgJiBUUFNfUkVHX1BHX0xEMDIpID8gIiBsZDAxX2JhZCIgOiAiIiwKKwkJKHJlZ3N0YXR1cyAmIFRQU19SRUdfUEdfTEQwMikgPyAiIGxkMDJfYmFkIiA6ICIiLAogCQkocmVnc3RhdHVzICYgVFBTX1JFR19QR19MRDAxKSA/ICIgbGQwMV9iYWQiIDogIiIsCiAJCShyZWdzdGF0dXMgJiBUUFNfUkVHX1BHX01BSU4pID8gIiBtYWluX2JhZCIgOiAiIiwKIAkJKHJlZ3N0YXR1cyAmIFRQU19SRUdfUEdfQ09SRSkgPyAiIGNvcmVfYmFkIiA6ICIiKTsKQEAgLTE0Myw3ICsxMzgsNyBAQAogCiBzdGF0aWMgdm9pZCBkYmdfY2hnY29uZihpbnQgcG9yLCBjaGFyICpidWYsIHNpemVfdCBsZW4sIHU4IGNoZ2NvbmZpZykKIHsKLQljaGFyICpoaWJpdDsKKwljb25zdCBjaGFyICpoaWJpdDsKIAogCWlmIChwb3IpCiAJCWhpYml0ID0gKGNoZ2NvbmZpZyAmIFRQU19DSEFSR0VfUE9SKQpAQCAtMjk1LDcgKzI5MCw3IEBACiAJc2VxX3ByaW50ZihzLCAiZGVmZ3BpbyAlMDJ4IG1hc2szICUwMnhcbiIsIHZhbHVlLCB2Mik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmICh2YWx1ZSAmICgxIDw8ICg0ICtpKSkpCisJCWlmICh2YWx1ZSAmICgxIDw8ICg0ICsgaSkpKQogCQkJc2VxX3ByaW50ZihzLCAiICBncGlvJWQtb3V0ICVzXG4iLCBpICsgMSwKIAkJCQkodmFsdWUgJiAoMSA8PCBpKSkgPyAibG93IiA6ICJoaSAiKTsKIAkJZWxzZQpAQCAtNDgxLDcgKzQ3Niw3IEBACiAJZGVidWdmc19yZW1vdmUodHBzLT5maWxlKTsKIAlpZiAoaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSA9PSAwKQogCQlrZnJlZSh0cHMpOwotCXRoZV90cHMgPSAwOworCXRoZV90cHMgPSBOVUxMOwogCXJldHVybiAwOwogfQogCkBAIC01MTQsNyArNTA5LDYgQEAKIAlJTklUX1dPUksoJnRwcy0+d29yaywgdHBzNjUwMTBfd29yaywgdHBzKTsKIAl0cHMtPmlycSA9IC0xOwogCXRwcy0+Y2xpZW50LmFkZHIgPSBhZGRyZXNzOwotCWkyY19zZXRfY2xpZW50ZGF0YSgmdHBzLT5jbGllbnQsIHRwcyk7CiAJdHBzLT5jbGllbnQuYWRhcHRlciA9IGJ1czsKIAl0cHMtPmNsaWVudC5kcml2ZXIgPSAmdHBzNjUwMTBfZHJpdmVyOwogCXN0cmxjcHkodHBzLT5jbGllbnQubmFtZSwgRFJJVkVSX05BTUUsIEkyQ19OQU1FX1NJWkUpOwpAQCAtNTIzLDkgKzUxNyw3IEBACiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGV2X2RiZygmYnVzLT5kZXYsICJjYW4ndCBhdHRhY2ggJXMgdG8gZGV2aWNlICVkLCBlcnIgJWRcbiIsCiAJCQkJRFJJVkVSX05BTUUsIGFkZHJlc3MsIHN0YXR1cyk7Ci1mYWlsMToKLQkJa2ZyZWUodHBzKTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gZmFpbDE7CiAJfQogCiAjaWZkZWYJQ09ORklHX0FSTQpAQCAtNTM1LDcgKzUyNyw3IEBACiAJCXRwcy0+aXJxID0gT01BUF9HUElPX0lSUSg1OCk7CiAJCW9tYXBfcmVxdWVzdF9ncGlvKDU4KTsKIAkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNTgsIDEpOwotCQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg1OCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CisJCXNldF9pcnFfdHlwZSh0cHMtPmlycSwgSVJRVF9GQUxMSU5HKTsKIAl9CiAJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkgewogCQl0cHMtPm1vZGVsID0gVFBTNjUwMTA7CkBAIC01NDMsNyArNTM1LDcgQEAKIAkJdHBzLT5pcnEgPSBPTUFQX0dQSU9fSVJRKE9NQVBfTVBVSU8oMSkpOwogCQlvbWFwX3JlcXVlc3RfZ3BpbyhPTUFQX01QVUlPKDEpKTsKIAkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oT01BUF9NUFVJTygxKSwgMSk7Ci0JCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKE9NQVBfTVBVSU8oMSksIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOworCQlzZXRfaXJxX3R5cGUodHBzLT5pcnEsIElSUVRfRkFMTElORyk7CiAJfQogCWlmIChtYWNoaW5lX2lzX29tYXBfaDMoKSkgewogCQl0cHMtPm1vZGVsID0gVFBTNjUwMTM7CkBAIC02MzMsNiArNjI1LDkgQEAKIAl0cHMtPmZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKERSSVZFUl9OQU1FLCBTX0lSVUdPLCBOVUxMLAogCQkJCXRwcywgREVCVUdfRk9QUyk7CiAJcmV0dXJuIDA7CitmYWlsMToKKwlrZnJlZSh0cHMpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB0cHM2NTAxMF9zY2FuX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmJ1cykKQEAgLTY0NSw3ICs2NDAsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRwczY1MDEwX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInRwczY1MDEwIiwKLQkuaWQJCT0gODg4LAkJLyogRklYTUUgYXNzaWduICJvZmZpY2lhbCIgdmFsdWUgKi8KIAkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSB0cHM2NTAxMF9zY2FuX2J1cywKIAkuZGV0YWNoX2NsaWVudAk9IF9fZXhpdF9wKHRwczY1MDEwX2RldGFjaF9jbGllbnQpLApAQCAtNzQ0LDcgKzczOCw3IEBACiAJaWYgKCF0aGVfdHBzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmKGxlZCA9PSBMRUQxKQorCWlmIChsZWQgPT0gTEVEMSkKIAkJb2ZmcyA9IDA7CiAJZWxzZSB7CiAJCW9mZnMgPSAyOwpAQCAtNzUzLDExICs3NDcsMTMgQEAKIAogCWRvd24oJnRoZV90cHMtPmxvY2spOwogCi0JZGV2X2RiZyAoJnRoZV90cHMtPmNsaWVudC5kZXYsICJsZWQlaV9vbiAgIDB4JTAyeFxuIiwgbGVkLAotCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwgVFBTX0xFRDFfT04gKyBvZmZzKSk7CisJcHJfZGVidWcoIiVzOiBsZWQlaV9vbiAgIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsIGxlZCwKKwkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCisJCQkJVFBTX0xFRDFfT04gKyBvZmZzKSk7CiAKLQlkZXZfZGJnICgmdGhlX3Rwcy0+Y2xpZW50LmRldiwgImxlZCVpX3BlciAgMHglMDJ4XG4iLCBsZWQsCi0JCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfTEVEMV9QRVIgKyBvZmZzKSk7CisJcHJfZGVidWcoIiVzOiBsZWQlaV9wZXIgIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsIGxlZCwKKwkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCisJCQkJVFBTX0xFRDFfUEVSICsgb2ZmcykpOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBPRkY6CkBAIC03NzMsNyArNzY5LDcgQEAKIAkJbGVkX3BlciA9IDB4MDggfCAoMSA8PCA3KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JvbmcgbW9kZSBwYXJhbWV0ZXIgZm9yIHRwczY1MDEwX3NldF9sZWQoKVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JvbmcgbW9kZSBwYXJhbWV0ZXIgZm9yIHNldF9sZWQoKVxuIiwKIAkJICAgICAgIERSSVZFUl9OQU1FKTsKIAkJdXAoJnRoZV90cHMtPmxvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc4OSw3ICs3ODUsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCWRldl9kYmcgKCZ0aGVfdHBzLT5jbGllbnQuZGV2LCAibGVkJWlfb24gICAweCUwMnhcbiIsIGxlZCwKKwlwcl9kZWJ1ZygiJXM6IGxlZCVpX29uICAgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwgbGVkLAogCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwgVFBTX0xFRDFfT04gKyBvZmZzKSk7CiAKIAlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCkBAIC04MDIsOCArNzk4LDkgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKLQlkZXZfZGJnICgmdGhlX3Rwcy0+Y2xpZW50LmRldiwgImxlZCVpX3BlciAgMHglMDJ4XG4iLCBsZWQsCi0JCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfTEVEMV9QRVIgKyBvZmZzKSk7CisJcHJfZGVidWcoIiVzOiBsZWQlaV9wZXIgIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsIGxlZCwKKwkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCisJCQkJVFBTX0xFRDFfUEVSICsgb2ZmcykpOwogCiAJdXAoJnRoZV90cHMtPmxvY2spOwogCkBAIC04NzQsNyArODcxLDcgQEAKIAogCWlmIChzdGF0dXMgIT0gMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIHdyaXRlIHZkY2RjMSByZWdpc3RlclxuIiwKLQkJICAgICAgIERSSVZFUl9OQU1FKTsKKwkJCURSSVZFUl9OQU1FKTsKIAllbHNlCiAJCXByX2RlYnVnKCIlczogdmRjZGMxIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsCiAJCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwgVFBTX1ZEQ0RDMSkpOwpAQCAtOTAwLDE0ICs4OTcsMTQgQEAKIAlkb3duKCZ0aGVfdHBzLT5sb2NrKTsKIAogCXByX2RlYnVnKCIlczogdnJlZ3MxIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsCi0JCSAgICAgICAgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsIFRQU19WUkVHUzEpKTsKKwkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfVlJFR1MxKSk7CiAKIAlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsCiAJCQlUUFNfVlJFR1MxLCB2YWx1ZSk7CiAKIAlpZiAoc3RhdHVzICE9IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byB3cml0ZSB2cmVnczEgcmVnaXN0ZXJcbiIsCi0JCSAgICAgICAgRFJJVkVSX05BTUUpOworCQkJRFJJVkVSX05BTUUpOwogCWVsc2UKIAkJcHJfZGVidWcoIiVzOiB2cmVnczEgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwKIAkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfVlJFR1MxKSk7CkBAIC0xMDA5LDcgKzEwMDYsNyBAQAogCQltc2xlZXAoMTApOwogCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTSkKKyNpZmRlZglDT05GSUdfQVJNCiAJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkgewogCiAJCS8vIEZJWE1FOiBNb3JlIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCmluZGV4IDUxY2UyNjguLjRmZDRmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlyZXMgPSBpZHJfZ2V0X25ldygmaTJjX2FkYXB0ZXJfaWRyLCBOVUxMLCAmaWQpOworCXJlcyA9IGlkcl9nZXRfbmV3KCZpMmNfYWRhcHRlcl9pZHIsIGFkYXAsICZpZCk7CiAJaWYgKHJlcyA8IDApIHsKIAkJaWYgKHJlcyA9PSAtRUFHQUlOKQogCQkJcmVzID0gLUVOT01FTTsKQEAgLTc2NSwyMCArNzY1LDE1IEBACiAKIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjX2dldF9hZGFwdGVyKGludCBpZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgKml0ZW07CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOwogCQogCWRvd24oJmNvcmVfbGlzdHMpOwotCWxpc3RfZm9yX2VhY2goaXRlbSwmYWRhcHRlcnMpIHsKLQkJYWRhcHRlciA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19hZGFwdGVyLCBsaXN0KTsKLQkJaWYgKGlkID09IGFkYXB0ZXItPm5yICYmCi0JCSAgICB0cnlfbW9kdWxlX2dldChhZGFwdGVyLT5vd25lcikpIHsKLQkJCXVwKCZjb3JlX2xpc3RzKTsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0JfQorCWFkYXB0ZXIgPSAoc3RydWN0IGkyY19hZGFwdGVyICopaWRyX2ZpbmQoJmkyY19hZGFwdGVyX2lkciwgaWQpOworCWlmIChhZGFwdGVyICYmICF0cnlfbW9kdWxlX2dldChhZGFwdGVyLT5vd25lcikpCisJCWFkYXB0ZXIgPSBOVUxMOworCiAJdXAoJmNvcmVfbGlzdHMpOwotCXJldHVybiBOVUxMOworCXJldHVybiBhZGFwdGVyOwogfQogCiB2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCmluZGV4IDBhMzFjZmQuLjc0YWY3ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCkBAIC00MzEsNyArNDMxLDcgQEAKICNpZiBWRVJCT1NFX0lERV9DRF9FUlJPUlMKIAl7CiAJCWludCBpOwotCQljb25zdCBjaGFyICpzOworCQljb25zdCBjaGFyICpzID0gImJhZCBzZW5zZSBrZXkhIjsKIAkJY2hhciBidWZbODBdOwogCiAJCXByaW50ayAoIkFUQVBJIGRldmljZSAlczpcbiIsIGRyaXZlLT5uYW1lKTsKQEAgLTQ0Niw4ICs0NDYsNiBAQAogCiAJCWlmIChzZW5zZS0+c2Vuc2Vfa2V5IDwgQVJZX0xFTihzZW5zZV9rZXlfdGV4dHMpKQogCQkJcyA9IHNlbnNlX2tleV90ZXh0c1tzZW5zZS0+c2Vuc2Vfa2V5XTsKLQkJZWxzZQotCQkJcyA9ICJiYWQgc2Vuc2Uga2V5ISI7CiAKIAkJcHJpbnRrKCIlcyAtLSAoU2Vuc2Uga2V5PTB4JTAyeClcbiIsIHMsIHNlbnNlLT5zZW5zZV9rZXkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKaW5kZXggOTc4ZDI3ZC4uYWFjNTk3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTM0LDExICsxMzMsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmaWRlX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDk3LDYgKzQ5MSw3IEBACiAJCS5uYW1lCT0gImlkZS1jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGlkZV9hdHRhY2gsCisJLmV2ZW50CQk9IGlkZV9ldmVudCwKIAkuZGV0YWNoCQk9IGlkZV9kZXRhY2gsCiAJLmlkX3RhYmxlICAgICAgID0gaWRlX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jIGIvZHJpdmVycy9pZGUvcHBjL3BtYWMuYwppbmRleCA4MTgzODBiLi5iZTBmY2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jCisrKyBiL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMKQEAgLTE0MTksNyArMTQxOSw3IEBACiAgKiBBdHRhY2ggdG8gYSBtYWNpbyBwcm9iZWQgaW50ZXJmYWNlCiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0Ci1wbWFjX2lkZV9tYWNpb19hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3BtYWNfaWRlX21hY2lvX2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJdW5zaWduZWQgbG9uZyByZWdiYXNlOwpAQCAtMTYzNywyNyArMTYzNywxOSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBwbWFjX2lkZV9tYWNpb19tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwbWFjX2lkZV9tYWNpb19tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAiSURFIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXsKIAkubmFtZSAJCT0gIkFUQSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7Ci0JLm5hbWUgCQk9IE9GX0FOWV9NQVRDSCwKIAkudHlwZQkJPSAiaWRlIiwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gImF0YSIsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKaW5kZXggZTUwMTY3NS4uNzdkYTgyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKKysrIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCQlkID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgcGNpX2RyaXZlciwgbm9kZSk7CiAJCWlmKGQtPmlkX3RhYmxlKQogCQl7Ci0JCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgPSBwY2lfbWF0Y2hfZGV2aWNlKGQtPmlkX3RhYmxlLCBkZXYpOworCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkID0gcGNpX21hdGNoX2lkKGQtPmlkX3RhYmxlLCBkZXYpOwogCQkJaWYoaWQgIT0gTlVMTCkKIAkJCXsKIAkJCQlpZihkLT5wcm9iZShkZXYsIGlkKSA+PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnIGIvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnCmluZGV4IDdkNThhZjEuLjI1MTAzYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZworKysgYi9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcKQEAgLTY2LDYgKzY2LDE4IEBACiAJICB3aXRoIE1hY09TWCBhbmQgV2luWFAgSVAtb3Zlci0xMzk0KSwgZW5hYmxlIHRoaXMgb3B0aW9uIGFuZCB0aGUKIAkgIGV0aDEzOTQgb3B0aW9uIGJlbG93LgogCitjb25maWcgSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJCisJYm9vbCAiRXhwb3J0IGFsbCBzeW1ib2xzIG9mIGllZWUxMzk0J3MgQVBJIgorCWRlcGVuZHMgb24gSUVFRTEzOTQKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFeHBvcnQgYWxsIHN5bWJvbHMgb2YgaWVlZTEzOTQncyBkcml2ZXIgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLCBldmVuCisJICB0aG9zZSB0aGF0IGFyZSBub3QgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0YW5kYXJkIElFRUUgMTM5NCBkcml2ZXJzLgorCisJICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIGludGVyZmFjZSB0byB1c2Vyc3BhY2UgYXBwbGljYXRpb25zLgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb21waWxlIGV4dGVybmFsbHkgZGV2ZWxvcGVkIGRyaXZlcnMgdGhhdAorCSAgbWFrZSBleHRlbmRlZCB1c2Ugb2YgaWVlZTEzOTQncyBBUEkuIEl0IGlzIG90aGVyd2lzZSBzYWZlIHRvIHNheSBOLgorCiBjb21tZW50ICJEZXZpY2UgRHJpdmVycyIKIAlkZXBlbmRzIG9uIElFRUUxMzk0CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMgYi9kcml2ZXJzL2llZWUxMzk0L2Nzci5jCmluZGV4IDFiOTg2ODQuLjE0OTU3M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImhvc3RzLmgiCiAjaW5jbHVkZSAiaWVlZTEzOTQuaCIKICNpbmNsdWRlICJoaWdobGV2ZWwuaCIKKyNpbmNsdWRlICJpZWVlMTM5NF9jb3JlLmgiCiAKIC8qIE1vZHVsZSBQYXJhbWV0ZXJzICovCiAvKiB0aGlzIG1vZHVsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBtYXBwaW5nIG9mIHRoZSBGQ1AgcmVnaXN0ZXJzICovCkBAIC0yMzIsNyArMjMzLDcgQEAKIAlob3N0LT5jc3IuZ2VuZXJhdGlvbiA9IDI7CiAKIAlidXNfaW5mb1sxXSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCk7Ci0JYnVzX2luZm9bMl0gPSBjcHVfdG9fYmUzMigoMSA8PCBDU1JfSVJNQ19TSElGVCkgfAorCWJ1c19pbmZvWzJdID0gY3B1X3RvX2JlMzIoKGhwc2JfZGlzYWJsZV9pcm0gPyAwIDogMSA8PCBDU1JfSVJNQ19TSElGVCkgfAogCQkJCSAgKDEgPDwgQ1NSX0NNQ19TSElGVCkgfAogCQkJCSAgKDEgPDwgQ1NSX0lTQ19TSElGVCkgfAogCQkJCSAgKDAgPDwgQ1NSX0JNQ19TSElGVCkgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMgYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYwppbmRleCA3YzQzMzBlLi42MWRkZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYwpAQCAtMjA5LDcgKzIwOSwxNSBAQAogewogCXN0YXRpYyBjb25zdCBpbnQgbXJfbWFwW10gPSB7IDQsIDY0LCAxMDI0LCAwIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisJQlVHX09OKG1heF9yb20gJiB+MHgzKTsKIAljc3ItPm1heF9yb20gPSBtcl9tYXBbbWF4X3JvbV07CisjZWxzZQorCWlmIChtYXhfcm9tICYgfjB4MykgLyogY2FsbGVyIHN1cHBsaWVkIGludmFsaWQgYXJndW1lbnQgKi8KKwkJY3NyLT5tYXhfcm9tID0gMDsKKwllbHNlCisJCWNzci0+bWF4X3JvbSA9IG1yX21hcFttYXhfcm9tXTsKKyNlbmRpZgogCW1lbWNweShjc3ItPmJ1c19pbmZvX2RhdGEsIGJ1c19pbmZvX2RhdGEsIGNzci0+YnVzX2luZm9fbGVuKTsKIH0KIApAQCAtNTMzLDEyICs1NDEsMTUgQEAKIAlzdGF0aWMgY29uc3QgaW50IHBkWzRdID0geyAwLCA0LCAxNiwgMjU2IH07CiAJc3RhdGljIGNvbnN0IGludCBjc1sxNl0gPSB7IDQsIDIgfTsKIAlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OwotCWludCBwYWxldHRlX3NpemUgPSBwZFtwYWxldHRlX2RlcHRoXSAqIGNzW2NvbG9yX3NwYWNlXTsKKwlpbnQgcGFsZXR0ZV9zaXplOwogCWludCBwaXhlbF9zaXplID0gKGhzY2FuICogdnNjYW4gKyAzKSAmIH4weDM7CiAKLQlpZiAoKHBhbGV0dGVfZGVwdGggJiYgIXBhbGV0dGUpIHx8ICFwaXhlbHMpCisJaWYgKCFwaXhlbHMgfHwgKCFwYWxldHRlICYmIHBhbGV0dGVfZGVwdGgpIHx8CisJICAgIChwYWxldHRlX2RlcHRoICYgfjB4MykgfHwgKGNvbG9yX3NwYWNlICYgfjB4ZikpCiAJCXJldHVybiBOVUxMOwogCisJcGFsZXR0ZV9zaXplID0gcGRbcGFsZXR0ZV9kZXB0aF0gKiBjc1tjb2xvcl9zcGFjZV07CisKIAlrdiA9IGNzcjEyMTJfbmV3X2Rlc2NyaXB0b3JfbGVhZigxLCAwLCBOVUxMLAogCQkJCQkgcGFsZXR0ZV9zaXplICsgcGl4ZWxfc2l6ZSArCiAJCQkJCSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX09WRVJIRUFEKTsKQEAgLTc2MCw5ICs3NzEsOSBAQAogCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlOwogCXVfaW50NjRfdCBjc3JfYWRkcjsKIAotCWlmICghY3NyIHx8ICFjc3ItPm9wcy0+YWxsb2NhdGVfYWRkcl9yYW5nZSB8fAotCSAgICAhY3NyLT5vcHMtPnJlbGVhc2VfYWRkcikKLQkJcmV0dXJuIENTUjEyMTJfRU5PTUVNOworCWlmICghY3NyIHx8ICFjc3ItPm9wcyB8fCAhY3NyLT5vcHMtPmFsbG9jYXRlX2FkZHJfcmFuZ2UgfHwKKwkgICAgIWNzci0+b3BzLT5yZWxlYXNlX2FkZHIgfHwgY3NyLT5tYXhfcm9tIDwgMSkKKwkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOwogCiAJLyogUk9NIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGNzci0+bWF4X3JvbSAqLwogCXJvbXNpemUgPSAocm9tc2l6ZSArIChjc3ItPm1heF9yb20gLSAxKSkgJiB+KGNzci0+bWF4X3JvbSAtIDEpOwpAQCAtMTE0NSw2ICsxMTU2LDggQEAKIAogCQkJLyogTWFrZSBzdXJlIHRoZSBFeHRlbmRlZCBST00gbGVhZiBpcyBhIG11bHRpcGxlIG9mCiAJCQkgKiBtYXhfcm9tIGluIHNpemUuICovCisJCQlpZiAoY3NyLT5tYXhfcm9tIDwgMSkKKwkJCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CiAJCQlsZWFmX3NpemUgPSAoY2FjaGUtPmxlbiArIChjc3ItPm1heF9yb20gLSAxKSkgJgogCQkJCX4oY3NyLT5tYXhfcm9tIC0gMSk7CiAKQEAgLTE0MDksNyArMTQyMiw3IEBACiAJdV9pbnQzMl90ICpjYWNoZV9wdHI7CiAJdV9pbnQxNl90IGt2X2xlbiA9IDA7CiAKLQlpZiAoIWNzciB8fCAha3YpCisJaWYgKCFjc3IgfHwgIWt2IHx8IGNzci0+bWF4X3JvbSA8IDEpCiAJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKIAogCS8qIEZpcnN0IGZpbmQgd2hpY2ggY2FjaGUgdGhlIGRhdGEgc2hvdWxkIGJlIGluIChvciBnbyBpbiBpZiBub3QgcmVhZApAQCAtMTU3Miw3ICsxNTg1LDcgQEAKIAlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmRlbnRyeTsKIAlpbnQgcmV0OwogCi0JaWYgKCFjc3IgfHwgIWNzci0+b3BzLT5idXNfcmVhZCkKKwlpZiAoIWNzciB8fCAhY3NyLT5vcHMgfHwgIWNzci0+b3BzLT5idXNfcmVhZCkKIAkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOwogCiAJcmV0ID0gY3NyMTIxMl9wYXJzZV9idXNfaW5mb19ibG9jayhjc3IpOwpAQCAtMTU4MSw5ICsxNTk0LDEzIEBACiAKIAlpZiAoIWNzci0+b3BzLT5nZXRfbWF4X3JvbSkKIAkJY3NyLT5tYXhfcm9tID0gbXJfbWFwWzBdOwkvKiBkZWZhdWx0IHZhbHVlICovCi0JZWxzZQotCQljc3ItPm1heF9yb20gPSBtcl9tYXBbY3NyLT5vcHMtPmdldF9tYXhfcm9tKGNzci0+YnVzX2luZm9fZGF0YSwKLQkJCQkJCQkgICAgY3NyLT5wcml2YXRlKV07CisJZWxzZSB7CisJCWludCBpID0gY3NyLT5vcHMtPmdldF9tYXhfcm9tKGNzci0+YnVzX2luZm9fZGF0YSwKKwkJCQkJICAgICAgY3NyLT5wcml2YXRlKTsKKwkJaWYgKGkgJiB+MHgzKQorCQkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCQljc3ItPm1heF9yb20gPSBtcl9tYXBbaV07CisJfQogCiAJY3NyLT5jYWNoZV9oZWFkLT5sYXlvdXRfaGVhZCA9IGNzci0+cm9vdF9rdjsKIAljc3ItPmNhY2hlX2hlYWQtPmxheW91dF90YWlsID0gY3NyLT5yb290X2t2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kbWEuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMKaW5kZXggNzU4ODE5ZC4uYjc5ZGRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9kbWEuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2RtYS5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIAogZG1hX2FkZHJfdCBkbWFfcmVnaW9uX29mZnNldF90b19idXMoc3RydWN0IGRtYV9yZWdpb24gKmRtYSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7Ci0JdW5zaWduZWQgbG9uZyByZW07CisJdW5zaWduZWQgbG9uZyByZW0gPSAwOwogCiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZkbWEtPnNnbGlzdFtkbWFfcmVnaW9uX2ZpbmQoZG1hLCBvZmZzZXQsICZyZW0pXTsKIAlyZXR1cm4gc2dfZG1hX2FkZHJlc3Moc2cpICsgcmVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwppbmRleCA2NTRkYTc2Li5jZDUzYzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwpAQCAtODksNyArODksNyBAQAogI2RlZmluZSBUUkFDRSgpIHByaW50ayhLRVJOX0VSUiAiJXM6JXNbJWRdIC0tLS0gVFJBQ0VcbiIsIGRyaXZlcl9uYW1lLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9Ci0JIiRSZXY6IDEyNDcgJCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iOworCSIkUmV2OiAxMjY0ICQgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGRlYmlhbi5vcmc+IjsKIAogc3RydWN0IGZyYWdtZW50X2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTcwNiw3ICs3MDYsNyBAQAogCQlyZXR1cm47CiAKIAlkZXYgPSBoaS0+ZGV2OwotCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYgPSAoc3RydWN0IGV0aDEzOTRfcHJpdiAqKW5ldGRldl9wcml2KGRldik7CiAKIAkvKiBSZXNldCBvdXIgcHJpdmF0ZSBob3N0IGRhdGEsIGJ1dCBub3Qgb3VyIG10dSAqLwogCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CkBAIC0xNzcwLDcgKzE3NzAsNyBAQAogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RyY3B5IChpbmZvLT5kcml2ZXIsIGRyaXZlcl9uYW1lKTsKLQlzdHJjcHkgKGluZm8tPnZlcnNpb24sICIkUmV2OiAxMjQ3ICQiKTsKKwlzdHJjcHkgKGluZm8tPnZlcnNpb24sICIkUmV2OiAxMjY0ICQiKTsKIAkvKiBGSVhNRSBYWFggcHJvdmlkZSBzYW5lIGJ1c2luZm8gKi8KIAlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCAiaWVlZTEzOTQiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKaW5kZXggNjI5MDcwYi4uYjI0OGQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKQEAgLTUyLDcgKzUyLDcgQEAKIC8qCiAgKiBEaXNhYmxlIHRoZSBub2RlbWdyIGRldGVjdGlvbiBhbmQgY29uZmlnIHJvbSByZWFkaW5nIGZ1bmN0aW9uYWxpdHkuCiAgKi8KLXN0YXRpYyBpbnQgZGlzYWJsZV9ub2RlbWdyID0gMDsKK3N0YXRpYyBpbnQgZGlzYWJsZV9ub2RlbWdyOwogbW9kdWxlX3BhcmFtKGRpc2FibGVfbm9kZW1nciwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9ub2RlbWdyLCAiRGlzYWJsZSBub2RlbWdyIGZ1bmN0aW9uYWxpdHkuIik7CiAKQEAgLTUyMCw2ICs1MjAsOSBAQAogCiAJaWYgKCFwYWNrZXQtPm5vX3dhaXRlciB8fCBwYWNrZXQtPmV4cGVjdF9yZXNwb25zZSkgewogCQlhdG9taWNfaW5jKCZwYWNrZXQtPnJlZmNudCk7CisJCS8qIFNldCB0aGUgaW5pdGlhbCAic2VuZHRpbWUiIHRvIDEwIHNlY29uZHMgZnJvbSBub3csIHRvCisJCSAgIHByZXZlbnQgcHJlbWF0dXJlIGV4cGlyeS4gIElmIGEgcGFja2V0IHRha2VzIG1vcmUgdGhhbgorCQkgICAxMCBzZWNvbmRzIHRvIGhpdCB0aGUgd2lyZSwgd2UgaGF2ZSBiaWdnZXIgcHJvYmxlbXMgOikgKi8KIAkJcGFja2V0LT5zZW5kdGltZSA9IGppZmZpZXMgKyAxMCAqIEhaOwogCQlza2JfcXVldWVfdGFpbCgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUsIHBhY2tldC0+c2tiKTsKIAl9CkBAIC0xMjIzLDkgKzEyMjYsNyBAQAogRVhQT1JUX1NZTUJPTChocHNiX3NldF9wYWNrZXRfY29tcGxldGVfdGFzayk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfYWxsb2NfcGFja2V0KTsKIEVYUE9SVF9TWU1CT0woaHBzYl9mcmVlX3BhY2tldCk7Ci1FWFBPUlRfU1lNQk9MKGhwc2Jfc2VuZF9waHlfY29uZmlnKTsKIEVYUE9SVF9TWU1CT0woaHBzYl9zZW5kX3BhY2tldCk7Ci1FWFBPUlRfU1lNQk9MKGhwc2Jfc2VuZF9wYWNrZXRfYW5kX3dhaXQpOwogRVhQT1JUX1NZTUJPTChocHNiX3Jlc2V0X2J1cyk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfYnVzX3Jlc2V0KTsKIEVYUE9SVF9TWU1CT0woaHBzYl9zZWxmaWRfcmVjZWl2ZWQpOwpAQCAtMTIzMyw2ICsxMjM0LDEwIEBACiBFWFBPUlRfU1lNQk9MKGhwc2JfcGFja2V0X3NlbnQpOwogRVhQT1JUX1NZTUJPTChocHNiX3BhY2tldF9yZWNlaXZlZCk7CiBFWFBPUlRfU1lNQk9MX0dQTChocHNiX2Rpc2FibGVfaXJtKTsKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJCitFWFBPUlRfU1lNQk9MKGhwc2Jfc2VuZF9waHlfY29uZmlnKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9zZW5kX3BhY2tldF9hbmRfd2FpdCk7CisjZW5kaWYKIAogLyoqIGllZWUxMzk0X3RyYW5zYWN0aW9ucy5jICoqLwogRVhQT1JUX1NZTUJPTChocHNiX2dldF90bGFiZWwpOwpAQCAtMTI2Miw5ICsxMjY3LDExIEBACiBFWFBPUlRfU1lNQk9MKGhwc2Jfc2V0X2hvc3RpbmZvX2tleSk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfZ2V0X2hvc3RpbmZvX2J5a2V5KTsKIEVYUE9SVF9TWU1CT0woaHBzYl9zZXRfaG9zdGluZm8pOworRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfaG9zdF9yZXNldCk7CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSQogRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfYWRkX2hvc3QpOwogRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfcmVtb3ZlX2hvc3QpOwotRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfaG9zdF9yZXNldCk7CisjZW5kaWYKIAogLyoqIG5vZGVtZ3IuYyAqKi8KIEVYUE9SVF9TWU1CT0woaHBzYl9ub2RlX2ZpbGxfcGFja2V0KTsKQEAgLTEyNzIsNyArMTI3OSw5IEBACiBFWFBPUlRfU1lNQk9MKGhwc2JfcmVnaXN0ZXJfcHJvdG9jb2wpOwogRVhQT1JUX1NZTUJPTChocHNiX3VucmVnaXN0ZXJfcHJvdG9jb2wpOwogRVhQT1JUX1NZTUJPTChpZWVlMTM5NF9idXNfdHlwZSk7CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSQogRVhQT1JUX1NZTUJPTChub2RlbWdyX2Zvcl9lYWNoX2hvc3QpOworI2VuZGlmCiAKIC8qKiBjc3IuYyAqKi8KIEVYUE9SVF9TWU1CT0woaHBzYl91cGRhdGVfY29uZmlnX3JvbSk7CkBAIC0xMzA5LDE5ICsxMzE4LDIxIEBACiBFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3JlY3ZfZmx1c2gpOwogCiAvKiogY3NyMTIxMi5jICoqLworRVhQT1JUX1NZTUJPTChjc3IxMjEyX25ld19kaXJlY3RvcnkpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9yZWxlYXNlX2tleXZhbCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVhZCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcGFyc2Vfa2V5dmFsKTsKK0VYUE9SVF9TWU1CT0woX2NzcjEyMTJfcmVhZF9rZXl2YWwpOworRVhQT1JUX1NZTUJPTChfY3NyMTIxMl9kZXN0cm95X2tleXZhbCk7CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSQogRVhQT1JUX1NZTUJPTChjc3IxMjEyX2NyZWF0ZV9jc3IpOwogRVhQT1JUX1NZTUJPTChjc3IxMjEyX2luaXRfbG9jYWxfY3NyKTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9uZXdfaW1tZWRpYXRlKTsKLUVYUE9SVF9TWU1CT0woY3NyMTIxMl9uZXdfZGlyZWN0b3J5KTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKTsKLUVYUE9SVF9TWU1CT0woY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeSk7CiBFWFBPUlRfU1lNQk9MKGNzcjEyMTJfbmV3X3N0cmluZ19kZXNjcmlwdG9yX2xlYWYpOwotRVhQT1JUX1NZTUJPTChjc3IxMjEyX2RldGFjaF9rZXl2YWxfZnJvbV9kaXJlY3RvcnkpOwotRVhQT1JUX1NZTUJPTChjc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9kZXN0cm95X2Nzcik7Ci1FWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVhZCk7CiBFWFBPUlRfU1lNQk9MKGNzcjEyMTJfZ2VuZXJhdGVfY3NyX2ltYWdlKTsKLUVYUE9SVF9TWU1CT0woY3NyMTIxMl9wYXJzZV9rZXl2YWwpOwogRVhQT1JUX1NZTUJPTChjc3IxMjEyX3BhcnNlX2Nzcik7Ci1FWFBPUlRfU1lNQk9MKF9jc3IxMjEyX3JlYWRfa2V5dmFsKTsKLUVYUE9SVF9TWU1CT0woX2NzcjEyMTJfZGVzdHJveV9rZXl2YWwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaCBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oCmluZGV4IDczYmQ4ZWYuLjBiMzE0MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oCkBAIC0zOCw4ICszOCw4IEBACiAKICAgICAgICAgLyogVGhlc2UgYXJlIGNvcmUgaW50ZXJuYWwuICovCiAgICAgICAgIHNpZ25lZCBjaGFyIHRsYWJlbDsKLSAgICAgICAgY2hhciBhY2tfY29kZTsKLSAgICAgICAgY2hhciB0Y29kZTsKKwlzaWduZWQgY2hhciBhY2tfY29kZTsKKwl1bnNpZ25lZCBjaGFyIHRjb2RlOwogCiAgICAgICAgIHVuc2lnbmVkIGV4cGVjdF9yZXNwb25zZToxOwogICAgICAgICB1bnNpZ25lZCBub193YWl0ZXI6MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmMgYi9kcml2ZXJzL2llZWUxMzk0L2lzby5jCmluZGV4IGYwNTc1OTEuLjYxNTU0MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uYwpAQCAtNjIsMTAgKzYyLDEwIEBACiAJaWYgKChkbWFfbW9kZSA8IEhQU0JfSVNPX0RNQV9ERUZBVUxUKSB8fCAoZG1hX21vZGUgPiBIUFNCX0lTT19ETUFfUEFDS0VUX1BFUl9CVUZGRVIpKQogCQlkbWFfbW9kZT1IUFNCX0lTT19ETUFfREVGQVVMVDsKIAorCWlmICgoaXJxX2ludGVydmFsIDwgMCkgfHwgKGlycV9pbnRlcnZhbCA+IGJ1Zl9wYWNrZXRzIC8gNCkpCisgCQlpcnFfaW50ZXJ2YWwgPSBidWZfcGFja2V0cyAvIDQ7CiAJaWYgKGlycV9pbnRlcnZhbCA9PSAwKSAgICAgLyogcmVhbGx5IGludGVycnVwdCBmb3IgZWFjaCBwYWNrZXQqLwogCQlpcnFfaW50ZXJ2YWwgPSAxOwotCWVsc2UgaWYgKChpcnFfaW50ZXJ2YWwgPCAwKSB8fCAoaXJxX2ludGVydmFsID4gYnVmX3BhY2tldHMgLyA0KSkKLSAJCWlycV9pbnRlcnZhbCA9IGJ1Zl9wYWNrZXRzIC8gNDsKIAogCWlmIChjaGFubmVsIDwgLTEgfHwgY2hhbm5lbCA+PSA2NCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMDYsNiArMTA2LDcgQEAKIAl9CiAKIAlhdG9taWNfc2V0KCZpc28tPm92ZXJmbG93cywgMCk7CisJaXNvLT5ieXRlc19kaXNjYXJkZWQgPSAwOwogCWlzby0+ZmxhZ3MgPSAwOwogCWlzby0+cHJlYnVmZmVyID0gMDsKIApAQCAtMjQxLDEyICsyNDIsMTIgQEAKIAlpc28tPnhtaXRfY3ljbGUgPSBjeWNsZTsKIAogCWlmIChwcmVidWZmZXIgPCAwKQotCQlwcmVidWZmZXIgPSBpc28tPmJ1Zl9wYWNrZXRzOworCQlwcmVidWZmZXIgPSBpc28tPmJ1Zl9wYWNrZXRzIC0gMTsKIAllbHNlIGlmIChwcmVidWZmZXIgPT0gMCkKIAkJcHJlYnVmZmVyID0gMTsKIAotCWlmIChwcmVidWZmZXIgPiBpc28tPmJ1Zl9wYWNrZXRzKQotCQlwcmVidWZmZXIgPSBpc28tPmJ1Zl9wYWNrZXRzOworCWlmIChwcmVidWZmZXIgPj0gaXNvLT5idWZfcGFja2V0cykKKwkJcHJlYnVmZmVyID0gaXNvLT5idWZfcGFja2V0cyAtIDE7CiAKIAlpc28tPnByZWJ1ZmZlciA9IHByZWJ1ZmZlcjsKIApAQCAtMzk1LDcgKzM5Niw3IEBACiB9CiAKIHZvaWQgaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1MzIgb2Zmc2V0LCB1MTYgbGVuLAotCQkJICAgICAgdTE2IGN5Y2xlLCB1OCBjaGFubmVsLCB1OCB0YWcsIHU4IHN5KQorCQkJICAgICAgdTE2IHRvdGFsX2xlbiwgdTE2IGN5Y2xlLCB1OCBjaGFubmVsLCB1OCB0YWcsIHU4IHN5KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlzby0+bG9jaywgZmxhZ3MpOwpAQCAtNDAzLDEwICs0MDQsMTMgQEAKIAlpZiAoaXNvLT5uX3JlYWR5X3BhY2tldHMgPT0gaXNvLT5idWZfcGFja2V0cykgewogCQkvKiBvdmVyZmxvdyEgKi8KIAkJYXRvbWljX2luYygmaXNvLT5vdmVyZmxvd3MpOworCQkvKiBSZWNvcmQgc2l6ZSBvZiB0aGlzIGRpc2NhcmRlZCBwYWNrZXQgKi8KKwkJaXNvLT5ieXRlc19kaXNjYXJkZWQgKz0gdG90YWxfbGVuOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBocHNiX2lzb19wYWNrZXRfaW5mbyAqaW5mbyA9ICZpc28tPmluZm9zW2lzby0+cGt0X2RtYV07CiAJCWluZm8tPm9mZnNldCA9IG9mZnNldDsKIAkJaW5mby0+bGVuID0gbGVuOworCQlpbmZvLT50b3RhbF9sZW4gPSB0b3RhbF9sZW47CiAJCWluZm8tPmN5Y2xlID0gY3ljbGU7CiAJCWluZm8tPmNoYW5uZWwgPSBjaGFubmVsOwogCQlpbmZvLT50YWcgPSB0YWc7CkBAIC00MzcsNiArNDQxLDE3IEBACiAKIAkJaXNvLT5maXJzdF9wYWNrZXQgPSAoaXNvLT5maXJzdF9wYWNrZXQrMSkgJSBpc28tPmJ1Zl9wYWNrZXRzOwogCQlpc28tPm5fcmVhZHlfcGFja2V0cy0tOworCisJCS8qIHJlbGVhc2UgbWVtb3J5IGZyb20gcGFja2V0cyBkaXNjYXJkZWQgd2hlbiBxdWV1ZSB3YXMgZnVsbCAgKi8KKwkJaWYgKGlzby0+bl9yZWFkeV9wYWNrZXRzID09IDApIHsgLyogUmVsZWFzZSBvbmx5IGFmdGVyIGFsbCBwcmlvciBwYWNrZXRzIGhhbmRsZWQgKi8KKwkJCWlmIChpc28tPmJ5dGVzX2Rpc2NhcmRlZCAhPSAwKSB7CisJCQkJc3RydWN0IGhwc2JfaXNvX3BhY2tldF9pbmZvIGluZjsKKwkJCQlpbmYudG90YWxfbGVuID0gaXNvLT5ieXRlc19kaXNjYXJkZWQ7CisJCQkJaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIFJFQ1ZfUkVMRUFTRSwKKwkJCQkJCQkodW5zaWduZWQgbG9uZykgJmluZik7CisJCQkJaXNvLT5ieXRlc19kaXNjYXJkZWQgPSAwOworCQkJfQorCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzby0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBydjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmggYi9kcml2ZXJzL2llZWUxMzk0L2lzby5oCmluZGV4IGZiNjU0ZDkuLjNlZmM2MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uaApAQCAtNDcsNiArNDcsMTQgQEAKIAkvKiAyLWJpdCAndGFnJyBhbmQgNC1iaXQgJ3N5JyBmaWVsZHMgb2YgdGhlIGlzb2Nocm9ub3VzIGhlYWRlciAqLwogCV9fdTggdGFnOwogCV9fdTggc3k7CisKKwkvKgorCSAqIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcGFja2V0IGluY2x1ZGluZyBoZWFkZXIvdHJhaWxlci4KKwkgKiBNVVNUIGJlIGF0IHN0cnVjdHVyZSBlbmQsIHNpbmNlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgc3RydWN0dXJlIGlzIGFsc28gCisJICogZGVmaW5lZCBpbiByYXcxMzk0LmggKGkuZS4gc3RydWN0IHJhdzEzOTRfaXNvX3BhY2tldF9pbmZvKSwgaXMgY29waWVkIHRvIAorCSAqIHVzZXJzcGFjZSBhbmQgaXMgYWNjZXNzZWQgdGhlcmUgdGhyb3VnaCBsaWJyYXcxMzk0LiAKKwkgKi8KKwlfX3UxNiB0b3RhbF9sZW47CiB9OwogCiBlbnVtIGhwc2JfaXNvX3R5cGUgeyBIUFNCX0lTT19SRUNWID0gMCwgSFBTQl9JU09fWE1JVCA9IDEgfTsKQEAgLTExMSw2ICsxMTksOSBAQAogCS8qIGhvdyBtYW55IHRpbWVzIHRoZSBidWZmZXIgaGFzIG92ZXJmbG93ZWQgb3IgdW5kZXJmbG93ZWQgKi8KIAlhdG9taWNfdCBvdmVyZmxvd3M7CiAKKwkvKiBDdXJyZW50IG51bWJlciBvZiBieXRlcyBsb3N0IGluIGRpc2NhcmRlZCBwYWNrZXRzICovCisJaW50IGJ5dGVzX2Rpc2NhcmRlZDsKKwogCS8qIHByaXZhdGUgZmxhZ3MgdG8gdHJhY2sgaW5pdGlhbGl6YXRpb24gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgSFBTQl9JU09fRFJJVkVSX0lOSVQgICAgICgxPDwwKQogI2RlZmluZSBIUFNCX0lTT19EUklWRVJfU1RBUlRFRCAgKDE8PDEpCkBAIC0xOTMsNyArMjA0LDcgQEAKIAogLyogY2FsbCBhZnRlciBhIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCAoaW50ZXJydXB0IGNvbnRleHQgT0spICovCiB2b2lkIGhwc2JfaXNvX3BhY2tldF9yZWNlaXZlZChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdTMyIG9mZnNldCwgdTE2IGxlbiwKLQkJCSAgICAgIHUxNiBjeWNsZSwgdTggY2hhbm5lbCwgdTggdGFnLCB1OCBzeSk7CisJCQkgICAgICB1MTYgdG90YWxfbGVuLCB1MTYgY3ljbGUsIHU4IGNoYW5uZWwsIHU4IHRhZywgdTggc3kpOwogCiAvKiBjYWxsIHRvIHdha2Ugd2FpdGluZyBwcm9jZXNzZXMgYWZ0ZXIgYnVmZmVyIHNwYWNlIGhhcyBvcGVuZWQgdXAuICovCiB2b2lkIGhwc2JfaXNvX3dha2Uoc3RydWN0IGhwc2JfaXNvICppc28pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwppbmRleCA5YTQ2YzNiLi5iZWJjYzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgImNzci5oIgogI2luY2x1ZGUgIm5vZGVtZ3IuaCIKIAotc3RhdGljIGludCBpZ25vcmVfZHJpdmVycyA9IDA7CitzdGF0aWMgaW50IGlnbm9yZV9kcml2ZXJzOwogbW9kdWxlX3BhcmFtKGlnbm9yZV9kcml2ZXJzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfZHJpdmVycywgIkRpc2FibGUgYXV0b21hdGljIHByb2JpbmcgZm9yIGRyaXZlcnMuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwppbmRleCBiM2QzZDIyLi5hNDg1ZjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIHByaW50ayhsZXZlbCAiJXM6IGZ3LWhvc3QlZDogIiBmbXQgIlxuIiAsIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBvaGNpLT5ob3N0LT5pZCAsICMjIGFyZ3MpCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KLQkiJFJldjogMTI1MCAkIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPiI7CisJIiRSZXY6IDEyOTkgJCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iOwogCiAvKiBNb2R1bGUgUGFyYW1ldGVycyAqLwogc3RhdGljIGludCBwaHlzX2RtYSA9IDE7CkBAIC00ODMsNyArNDgzLDkgQEAKIAkvKiBQdXQgc29tZSBkZWZhdWx0cyB0byB0aGVzZSB1bmRlZmluZWQgYnVzIG9wdGlvbnMgKi8KIAlidWYgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zKTsKIAlidWYgfD0gIDB4NjAwMDAwMDA7IC8qIEVuYWJsZSBDTUMgYW5kIElTQyAqLwotCWlmICghaHBzYl9kaXNhYmxlX2lybSkKKwlpZiAoaHBzYl9kaXNhYmxlX2lybSkKKwkJYnVmICY9IH4weDgwMDAwMDAwOworCWVsc2UKIAkJYnVmIHw9ICAweDgwMDAwMDAwOyAvKiBFbmFibGUgSVJNQyAqLwogCWJ1ZiAmPSB+MHgwMGZmMDAwMDsgLyogWFhYOiBTZXQgY3ljX2Nsa19hY2MgdG8gemVybyBmb3Igbm93ICovCiAJYnVmICY9IH4weDE4MDAwMDAwOyAvKiBEaXNhYmxlIFBNQyBhbmQgQk1DICovCkBAIC01MDMsOCArNTA1LDEyIEBACiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0xpbmtDb250cm9sU2V0LAogCQkgIE9IQ0kxMzk0X0xpbmtDb250cm9sX0N5Y2xlVGltZXJFbmFibGUgfAogCQkgIE9IQ0kxMzk0X0xpbmtDb250cm9sX0N5Y2xlTWFzdGVyKTsKLQlzZXRfcGh5X3JlZ19tYXNrKG9oY2ksIDQsIFBIWV8wNF9MQ1RSTCB8Ci0JCQkgKGhwc2JfZGlzYWJsZV9pcm0gPyAwIDogUEhZXzA0X0NPTlRFTkRFUikpOworCWkgPSBnZXRfcGh5X3JlZyhvaGNpLCA0KSB8IFBIWV8wNF9MQ1RSTDsKKwlpZiAoaHBzYl9kaXNhYmxlX2lybSkKKwkJaSAmPSB+UEhZXzA0X0NPTlRFTkRFUjsKKwllbHNlCisJCWkgfD0gUEhZXzA0X0NPTlRFTkRFUjsKKwlzZXRfcGh5X3JlZyhvaGNpLCA0LCBpKTsKIAogCS8qIFNldCB1cCBzZWxmLWlkIGRtYSBidWZmZXIgKi8KIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfU2VsZklEQnVmZmVyLCBvaGNpLT5zZWxmaWRfYnVmX2J1cyk7CkBAIC0xNTY2LDYgKzE1NzIsMTAgQEAKIAogCXN0cnVjdCBkbWFfY21kICpuZXh0ID0gJnJlY3YtPmJsb2NrW25leHRfaV07CiAJc3RydWN0IGRtYV9jbWQgKnByZXYgPSAmcmVjdi0+YmxvY2tbcHJldl9pXTsKKwkKKwkvKiBpZ25vcmUgb3V0LW9mLXJhbmdlIHJlcXVlc3RzICovCisJaWYgKChibG9jayA8IDApIHx8IChibG9jayA+IHJlY3YtPm5ibG9ja3MpKQorCQlyZXR1cm47CiAKIAkvKiAnbmV4dCcgYmVjb21lcyB0aGUgbmV3IGVuZCBvZiB0aGUgRE1BIGNoYWluLAogCSAgIHNvIGRpc2FibGUgYnJhbmNoIGFuZCBlbmFibGUgaW50ZXJydXB0ICovCkBAIC0xNTkzLDE5ICsxNjAzLDggQEAKIHN0YXRpYyB2b2lkIG9oY2lfaXNvX3JlY3ZfYnVmZmVyZmlsbF9yZWxlYXNlKHN0cnVjdCBvaGNpX2lzb19yZWN2ICpyZWN2LAogCQkJCQkgICAgIHN0cnVjdCBocHNiX2lzb19wYWNrZXRfaW5mbyAqaW5mbykKIHsKLQlpbnQgbGVuOwotCiAJLyogcmVsZWFzZSB0aGUgbWVtb3J5IHdoZXJlIHRoZSBwYWNrZXQgd2FzICovCi0JbGVuID0gaW5mby0+bGVuOwotCi0JLyogYWRkIHRoZSB3YXN0ZWQgc3BhY2UgZm9yIHBhZGRpbmcgdG8gNCBieXRlcyAqLwotCWlmIChsZW4gJSA0KQotCQlsZW4gKz0gNCAtIChsZW4gJSA0KTsKLQotCS8qIGFkZCA4IGJ5dGVzIGZvciB0aGUgT0hDSSBETUEgZGF0YSBmb3JtYXQgb3ZlcmhlYWQgKi8KLQlsZW4gKz0gODsKLQotCXJlY3YtPnJlbGVhc2VkX2J5dGVzICs9IGxlbjsKKwlyZWN2LT5yZWxlYXNlZF9ieXRlcyArPSBpbmZvLT50b3RhbF9sZW47CiAKIAkvKiBoYXZlIHdlIHJlbGVhc2VkIGVub3VnaCBtZW1vcnkgZm9yIG9uZSBibG9jaz8gKi8KIAl3aGlsZSAocmVjdi0+cmVsZWFzZWRfYnl0ZXMgPiByZWN2LT5idWZfc3RyaWRlKSB7CkBAIC0xNjM3LDcgKzE2MzYsNyBAQAogCQkvKiBub3RlOiBwYWNrZXQgbGF5b3V0IGlzIGFzIHNob3duIGluIHNlY3Rpb24gMTAuNi4xLjEgb2YgdGhlIE9IQ0kgc3BlYyAqLwogCiAJCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0JCXVuc2lnbmVkIHNob3J0IGxlbiwgY3ljbGU7CisJCXVuc2lnbmVkIHNob3J0IGxlbiwgY3ljbGUsIHRvdGFsX2xlbjsKIAkJdW5zaWduZWQgY2hhciBjaGFubmVsLCB0YWcsIHN5OwogCiAJCXVuc2lnbmVkIGNoYXIgKnAgPSBpc28tPmRhdGFfYnVmLmt2aXJ0OwpAQCAtMTY4OCw5ICsxNjg3LDExIEBACiAJCS8qIGFkdmFuY2UgdG8geGZlclN0YXR1cy90aW1lU3RhbXAgKi8KIAkJcmVjdi0+ZG1hX29mZnNldCArPSBsZW47CiAKKwkJdG90YWxfbGVuID0gbGVuICsgODsgLyogOCBieXRlcyBoZWFkZXIrdHJhaWxlciBpbiBPSENJIHBhY2tldCAqLwogCQkvKiBwYXlsb2FkIGlzIHBhZGRlZCB0byA0IGJ5dGVzICovCiAJCWlmIChsZW4gJSA0KSB7CiAJCQlyZWN2LT5kbWFfb2Zmc2V0ICs9IDQgLSAobGVuJTQpOworCQkJdG90YWxfbGVuICs9IDQgLSAobGVuJTQpOwogCQl9CiAKIAkJLyogY2hlY2sgZm9yIHdyYXAtYXJvdW5kICovCkBAIC0xNzI0LDcgKzE3MjUsNyBAQAogCQkJcmVjdi0+ZG1hX29mZnNldCAtPSByZWN2LT5idWZfc3RyaWRlKnJlY3YtPm5ibG9ja3M7CiAJCX0KIAotCQlocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoaXNvLCBvZmZzZXQsIGxlbiwgY3ljbGUsIGNoYW5uZWwsIHRhZywgc3kpOworCQlocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoaXNvLCBvZmZzZXQsIGxlbiwgdG90YWxfbGVuLCBjeWNsZSwgY2hhbm5lbCwgdGFnLCBzeSk7CiAJfQogCiAJaWYgKHdha2UpCkBAIC0xODUwLDcgKzE4NTEsOCBAQAogCQkJdGFnID0gaGRyWzVdID4+IDY7CiAJCQlzeSA9IGhkcls0XSAmIDB4RjsKIAotCQkJaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKGlzbywgb2Zmc2V0LCBwYWNrZXRfbGVuLCBjeWNsZSwgY2hhbm5lbCwgdGFnLCBzeSk7CisJCQlocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoaXNvLCBvZmZzZXQsIHBhY2tldF9sZW4sCisJCQkJCXJlY3YtPmJ1Zl9zdHJpZGUsIGN5Y2xlLCBjaGFubmVsLCB0YWcsIHN5KTsKIAkJfQogCiAJCS8qIHJlc2V0IHRoZSBETUEgZGVzY3JpcHRvciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYwppbmRleCBiZGIzYTg1Li4zNjA3NGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYwpAQCAtNzYsNyArNzYsNyBAQAogCiAKIC8qIE1vZHVsZSBQYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IHNraXBfZWVwcm9tID0gMDsKK3N0YXRpYyBpbnQgc2tpcF9lZXByb207CiBtb2R1bGVfcGFyYW0oc2tpcF9lZXByb20sIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNraXBfZWVwcm9tLCAiVXNlIGdlbmVyaWMgYnVzIGluZm8gYmxvY2sgaW5zdGVhZCBvZiBzZXJpYWwgZWVwcm9tIChkZWZhdWx0ID0gMCkuIik7CiAKQEAgLTE0MjIsNyArMTQyMiw3IEBACiAJCWkgPSBnZXRfcGh5X3JlZyhseW54LCA0KTsKIAkJaSB8PSBQSFlfMDRfTENUUkw7CiAJCWlmIChocHNiX2Rpc2FibGVfaXJtKQotCQkJaSAmPSAhUEhZXzA0X0NPTlRFTkRFUjsKKwkJCWkgJj0gflBIWV8wNF9DT05URU5ERVI7CiAJCWVsc2UKIAkJCWkgfD0gUEhZXzA0X0NPTlRFTkRFUjsKIAkJaWYgKGkgIT0gLTEpIHNldF9waHlfcmVnKGx5bngsIDQsIGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYwppbmRleCA3NDE5YWY0Li5iNGZhMTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYwpAQCAtOTgsNyArOTgsNyBAQAogCiBzdGF0aWMgdm9pZCBxdWV1ZV9jb21wbGV0ZV9jYihzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEpOwogCi1zdGF0aWMgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKl9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKIHsKIAlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXE7CiAKQEAgLTI1MDYsOSArMjUwNiwxMiBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmdXBhY2tldHMsIHVhZGRyLCBzaXplb2YodXBhY2tldHMpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAodXBhY2tldHMubl9wYWNrZXRzID4gaHBzYl9pc29fbl9yZWFkeShmaS0+aXNvX2hhbmRsZSkpCisJaWYgKHVwYWNrZXRzLm5fcGFja2V0cyA+PSBmaS0+aXNvX2hhbmRsZS0+YnVmX3BhY2tldHMpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHVwYWNrZXRzLm5fcGFja2V0cyA+PSBocHNiX2lzb19uX3JlYWR5KGZpLT5pc29faGFuZGxlKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKIAkvKiBlbnN1cmUgdXNlci1zdXBwbGllZCBidWZmZXIgaXMgYWNjZXNzaWJsZSBhbmQgYmlnIGVub3VnaCAqLwogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cGFja2V0cy5pbmZvcywKIAkJCXVwYWNrZXRzLm5fcGFja2V0cyAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3NicDIuYyBiL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCmluZGV4IDMyMzY4ZjMuLmZlM2UxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCkBAIC04MSw3ICs4MSw3IEBACiAjaW5jbHVkZSAic2JwMi5oIgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9Ci0JIiRSZXY6IDEyMTkgJCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iOworCSIkUmV2OiAxMzA2ICQgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGRlYmlhbi5vcmc+IjsKIAogLyoKICAqIE1vZHVsZSBsb2FkIHBhcmFtZXRlciBkZWZpbml0aW9ucwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgKiBkb3duIHRvIHVzIGF0IGEgdGltZSAoZGVidWdnaW5nKS4gVGhpcyBtaWdodCBiZSBuZWNlc3NhcnkgZm9yIHZlcnkKICAqIGJhZGx5IGJlaGF2ZWQgc2JwMiBkZXZpY2VzLgogICovCi1zdGF0aWMgaW50IHNlcmlhbGl6ZV9pbyA9IDA7CitzdGF0aWMgaW50IHNlcmlhbGl6ZV9pbzsKIG1vZHVsZV9wYXJhbShzZXJpYWxpemVfaW8sIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNlcmlhbGl6ZV9pbywgIlNlcmlhbGl6ZSBhbGwgSS9PIGNvbWluZyBkb3duIGZyb20gdGhlIHNjc2kgZHJpdmVycyAoZGVmYXVsdCA9IDApIik7CiAKQEAgLTE0NSw3ICsxNDUsNyBAQAogICogcGxlYXNlIHN1Ym1pdCB0aGUgbG9nZ2VkIHNicDJfZmlybXdhcmVfcmV2aXNpb24gdmFsdWUgb2YgdGhpcyBkZXZpY2UgdG8KICAqIHRoZSBsaW51eDEzOTQtZGV2ZWwgbWFpbGluZyBsaXN0LgogICovCi1zdGF0aWMgaW50IGZvcmNlX2lucXVpcnlfaGFjayA9IDA7CitzdGF0aWMgaW50IGZvcmNlX2lucXVpcnlfaGFjazsKIG1vZHVsZV9wYXJhbShmb3JjZV9pbnF1aXJ5X2hhY2ssIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2lucXVpcnlfaGFjaywgIkZvcmNlIFNDU0kgaW5xdWlyeSBoYWNrIChkZWZhdWx0ID0gMCkiKTsKIApAQCAtMjExMiw2ICsyMTEyLDEwMiBAQAogICovCiBzdGF0aWMgdm9pZCBzYnAyX2NoZWNrX3NicDJfY29tbWFuZChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLCB1bmNoYXIgKmNtZCkKIHsKKwl1bmNoYXIgbmV3X2NtZFsxNl07CisJdTggZGV2aWNlX3R5cGUgPSBTQlAyX0RFVklDRV9UWVBFIChzY3NpX2lkLT5zYnAyX2RldmljZV90eXBlX2FuZF9sdW4pOworCisJU0JQMl9ERUJVRygic2JwMl9jaGVja19zYnAyX2NvbW1hbmQiKTsKKworCXN3aXRjaCAoKmNtZCkgeworCisJCWNhc2UgUkVBRF82OgorCisJCQlpZiAoc2JwMl9jb21tYW5kX2NvbnZlcnNpb25fZGV2aWNlX3R5cGUoZGV2aWNlX3R5cGUpKSB7CisKKwkJCQlTQlAyX0RFQlVHKCJDb252ZXJ0IFJFQURfNiB0byBSRUFEXzEwIik7CisKKwkJCQkvKgorCQkJCSAqIE5lZWQgdG8gdHVybiByZWFkXzYgaW50byByZWFkXzEwCisJCQkJICovCisJCQkJbmV3X2NtZFswXSA9IDB4Mjg7CisJCQkJbmV3X2NtZFsxXSA9IChjbWRbMV0gJiAweGUwKTsKKwkJCQluZXdfY21kWzJdID0gMHgwOworCQkJCW5ld19jbWRbM10gPSAoY21kWzFdICYgMHgxZik7CisJCQkJbmV3X2NtZFs0XSA9IGNtZFsyXTsKKwkJCQluZXdfY21kWzVdID0gY21kWzNdOworCQkJCW5ld19jbWRbNl0gPSAweDA7CisJCQkJbmV3X2NtZFs3XSA9IDB4MDsKKwkJCQluZXdfY21kWzhdID0gY21kWzRdOworCQkJCW5ld19jbWRbOV0gPSBjbWRbNV07CisKKwkJCQltZW1jcHkoY21kLCBuZXdfY21kLCAxMCk7CisKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBXUklURV82OgorCisJCQlpZiAoc2JwMl9jb21tYW5kX2NvbnZlcnNpb25fZGV2aWNlX3R5cGUoZGV2aWNlX3R5cGUpKSB7CisKKwkJCQlTQlAyX0RFQlVHKCJDb252ZXJ0IFdSSVRFXzYgdG8gV1JJVEVfMTAiKTsKKworCQkJCS8qCisJCQkJICogTmVlZCB0byB0dXJuIHdyaXRlXzYgaW50byB3cml0ZV8xMAorCQkJCSAqLworCQkJCW5ld19jbWRbMF0gPSAweDJhOworCQkJCW5ld19jbWRbMV0gPSAoY21kWzFdICYgMHhlMCk7CisJCQkJbmV3X2NtZFsyXSA9IDB4MDsKKwkJCQluZXdfY21kWzNdID0gKGNtZFsxXSAmIDB4MWYpOworCQkJCW5ld19jbWRbNF0gPSBjbWRbMl07CisJCQkJbmV3X2NtZFs1XSA9IGNtZFszXTsKKwkJCQluZXdfY21kWzZdID0gMHgwOworCQkJCW5ld19jbWRbN10gPSAweDA7CisJCQkJbmV3X2NtZFs4XSA9IGNtZFs0XTsKKwkJCQluZXdfY21kWzldID0gY21kWzVdOworCisJCQkJbWVtY3B5KGNtZCwgbmV3X2NtZCwgMTApOworCisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERV9TRU5TRToKKworCQkJaWYgKHNicDJfY29tbWFuZF9jb252ZXJzaW9uX2RldmljZV90eXBlKGRldmljZV90eXBlKSkgeworCisJCQkJU0JQMl9ERUJVRygiQ29udmVydCBNT0RFX1NFTlNFXzYgdG8gTU9ERV9TRU5TRV8xMCIpOworCisJCQkJLyoKKwkJCQkgKiBOZWVkIHRvIHR1cm4gbW9kZV9zZW5zZV82IGludG8gbW9kZV9zZW5zZV8xMAorCQkJCSAqLworCQkJCW5ld19jbWRbMF0gPSAweDVhOworCQkJCW5ld19jbWRbMV0gPSBjbWRbMV07CisJCQkJbmV3X2NtZFsyXSA9IGNtZFsyXTsKKwkJCQluZXdfY21kWzNdID0gMHgwOworCQkJCW5ld19jbWRbNF0gPSAweDA7CisJCQkJbmV3X2NtZFs1XSA9IDB4MDsKKwkJCQluZXdfY21kWzZdID0gMHgwOworCQkJCW5ld19jbWRbN10gPSAweDA7CisJCQkJbmV3X2NtZFs4XSA9IGNtZFs0XTsKKwkJCQluZXdfY21kWzldID0gY21kWzVdOworCisJCQkJbWVtY3B5KGNtZCwgbmV3X2NtZCwgMTApOworCisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERV9TRUxFQ1Q6CisKKwkJCS8qCisJCQkgKiBUT0RPLiBQcm9iYWJseSBuZWVkIHRvIGNoYW5nZSBtb2RlIHNlbGVjdCB0byAxMCBieXRlIHZlcnNpb24KKwkJCSAqLworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm47CiB9CiAKIC8qCkBAIC0yMTUyLDYgKzIyNDgsNyBAQAogCQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJdTggKnNjc2lfYnVmID0gU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCXU4IGRldmljZV90eXBlID0gU0JQMl9ERVZJQ0VfVFlQRSAoc2NzaV9pZC0+c2JwMl9kZXZpY2VfdHlwZV9hbmRfbHVuKTsKIAogCVNCUDJfREVCVUcoInNicDJfY2hlY2tfc2JwMl9yZXNwb25zZSIpOwogCkBAIC0yMTc2LDYgKzIyNzMsMTQgQEAKIAkJCX0KIAogCQkJLyoKKwkJCSAqIENoZWNrIGZvciBTaW1wbGUgRGlyZWN0IEFjY2VzcyBEZXZpY2UgYW5kIGNoYW5nZSBpdCB0byBUWVBFX0RJU0sKKwkJCSAqLworCQkJaWYgKChzY3NpX2J1ZlswXSAmIDB4MWYpID09IFRZUEVfUkJDKSB7CisJCQkJU0JQMl9ERUJVRygiQ2hhbmdpbmcgVFlQRV9SQkMgdG8gVFlQRV9ESVNLIik7CisJCQkJc2NzaV9idWZbMF0gJj0gMHhlMDsKKwkJCX0KKworCQkJLyoKIAkJCSAqIEZpeCBhbnNpIHJldmlzaW9uIGFuZCByZXNwb25zZSBkYXRhIGZvcm1hdAogCQkJICovCiAJCQlzY3NpX2J1ZlsyXSB8PSAyOwpAQCAtMjE4Myw2ICsyMjg4LDI3IEBACiAKIAkJCWJyZWFrOwogCisJCWNhc2UgTU9ERV9TRU5TRToKKworCQkJaWYgKHNicDJfY29tbWFuZF9jb252ZXJzaW9uX2RldmljZV90eXBlKGRldmljZV90eXBlKSkgeworCisJCQkJU0JQMl9ERUJVRygiTW9kaWZ5IG1vZGUgc2Vuc2UgcmVzcG9uc2UgKDEwIGJ5dGUgdmVyc2lvbikiKTsKKworCQkJCXNjc2lfYnVmWzBdID0gc2NzaV9idWZbMV07CS8qIE1vZGUgZGF0YSBsZW5ndGggKi8KKwkJCQlzY3NpX2J1ZlsxXSA9IHNjc2lfYnVmWzJdOwkvKiBNZWRpdW0gdHlwZSAqLworCQkJCXNjc2lfYnVmWzJdID0gc2NzaV9idWZbM107CS8qIERldmljZSBzcGVjaWZpYyBwYXJhbWV0ZXIgKi8KKwkJCQlzY3NpX2J1ZlszXSA9IHNjc2lfYnVmWzddOwkvKiBCbG9jayBkZXNjcmlwdG9yIGxlbmd0aCAqLworCQkJCW1lbWNweShzY3NpX2J1ZiArIDQsIHNjc2lfYnVmICsgOCwgc2NzaV9idWZbMF0pOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIE1PREVfU0VMRUNUOgorCisJCQkvKgorCQkJICogVE9ETy4gUHJvYmFibHkgbmVlZCB0byBjaGFuZ2UgbW9kZSBzZWxlY3QgdG8gMTAgYnl0ZSB2ZXJzaW9uCisJCQkgKi8KKwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJfQpAQCAtMjU1OSw4ICsyNjg1LDcgQEAKIHN0YXRpYyBpbnQgc2JwMnNjc2lfc2xhdmVfY29uZmlndXJlIChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CiAJYmxrX3F1ZXVlX2RtYV9hbGlnbm1lbnQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgKDUxMiAtIDEpKTsKLQlzZGV2LT51c2VfMTBfZm9yX3J3ID0gMTsKLQlzZGV2LT51c2VfMTBfZm9yX21zID0gMTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCmluZGV4IDNjYzNmZjAuLjc5YzhlMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCkBAIC03LDYgKzcsMTYgQEAKIAkgIGFueSBwcm90b2NvbHMgeW91IHdpc2ggdG8gdXNlIGFzIHdlbGwgYXMgZHJpdmVycyBmb3IgeW91cgogCSAgSW5maW5pQmFuZCBoYXJkd2FyZS4KIAorY29uZmlnIElORklOSUJBTkRfVVNFUl9WRVJCUworCXRyaXN0YXRlICJJbmZpbmlCYW5kIHVzZXJzcGFjZSB2ZXJicyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSU5GSU5JQkFORAorCS0tLWhlbHAtLS0KKwkgIFVzZXJzcGFjZSBJbmZpbmlCYW5kIHZlcmJzIHN1cHBvcnQuICBUaGlzIGlzIHRoZSBrZXJuZWwgc2lkZQorCSAgb2YgdXNlcnNwYWNlIHZlcmJzLCB3aGljaCBhbGxvd3MgdXNlcnNwYWNlIHByb2Nlc3NlcyB0bworCSAgZGlyZWN0bHkgYWNjZXNzIEluZmluaUJhbmQgaGFyZHdhcmUgZm9yIGZhc3QtcGF0aAorCSAgb3BlcmF0aW9ucy4gIFlvdSB3aWxsIGFsc28gbmVlZCBsaWJpYnZlcmJzIGFuZCBhIGhhcmR3YXJlCisJICBkcml2ZXIgbGlicmFyeSBmcm9tIDxodHRwOi8vd3d3Lm9wZW5pYi5vcmc+LgorCiBzb3VyY2UgImRyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL01ha2VmaWxlIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvTWFrZWZpbGUKaW5kZXggZDJkYmZiNS4uZTFhN2NmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZQogCi1vYmotJChDT05GSUdfSU5GSU5JQkFORCkgKz0JaWJfY29yZS5vIGliX21hZC5vIGliX3NhLm8gaWJfdW1hZC5vCitvYmotJChDT05GSUdfSU5GSU5JQkFORCkgKz0JCWliX2NvcmUubyBpYl9tYWQubyBpYl9zYS5vIGliX3VtYWQubworb2JqLSQoQ09ORklHX0lORklOSUJBTkRfVVNFUl9WRVJCUykgKz0JaWJfdXZlcmJzLm8KIAogaWJfY29yZS15IDo9CQkJcGFja2VyLm8gdWRfaGVhZGVyLm8gdmVyYnMubyBzeXNmcy5vIFwKIAkJCQlkZXZpY2UubyBmbXJfcG9vbC5vIGNhY2hlLm8KQEAgLTEwLDMgKzExLDUgQEAKIGliX3NhLXkgOj0JCQlzYV9xdWVyeS5vCiAKIGliX3VtYWQteSA6PQkJCXVzZXJfbWFkLm8KKworaWJfdXZlcmJzLXkgOj0JCQl1dmVyYnNfbWFpbi5vIHV2ZXJic19jbWQubyB1dmVyYnNfbWVtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczNDdmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogJElkOiB1dmVyYnMuaCAyNTU5IDIwMDUtMDYtMDYgMTk6NDM6MTZaIHJvbGFuZCAkCisgKi8KKworI2lmbmRlZiBVVkVSQlNfSAorI2RlZmluZSBVVkVSQlNfSAorCisvKiBJbmNsdWRlIGRldmljZS5oIGFuZCBmcy5oIHVudGlsIGNkZXYuaCBpcyBzZWxmLXN1ZmZpY2llbnQgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlIDxpYl92ZXJicy5oPgorI2luY2x1ZGUgPGliX3VzZXJfdmVyYnMuaD4KKworc3RydWN0IGliX3V2ZXJic19kZXZpY2UgeworCWludAkJCQkJZGV2bnVtOworCXN0cnVjdCBjZGV2CQkJCWRldjsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlCQkJY2xhc3NfZGV2OworCXN0cnVjdCBpYl9kZXZpY2UJCSAgICAgICAqaWJfZGV2OworCWludAkJCQkJbnVtX2NvbXA7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgeworCXN0cnVjdCBrcmVmCQkJCXJlZjsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUJCSAgICAgICAqdXZlcmJzX2ZpbGU7CisJc3BpbmxvY2tfdAkJCQlsb2NrOworCWludAkJCQkJZmQ7CisJaW50CQkJCQlpc19hc3luYzsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJCXBvbGxfd2FpdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkJZXZlbnRfbGlzdDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZmlsZSB7CisJc3RydWN0IGtyZWYJCQkJcmVmOworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlCQkgICAgICAgKmRldmljZTsKKwlzdHJ1Y3QgaWJfdWNvbnRleHQJCSAgICAgICAqdWNvbnRleHQ7CisJc3RydWN0IGliX2V2ZW50X2hhbmRsZXIJCQlldmVudF9oYW5kbGVyOworCXN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZQkgICAgICAgIGFzeW5jX2ZpbGU7CisJc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlCSAgICAgICAgY29tcF9maWxlWzFdOworfTsKKworc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudCB7CisJc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudF9kZXNjCWRlc2M7CisJc3RydWN0IGxpc3RfaGVhZAkJCWxpc3Q7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NvbXBfZXZlbnQgeworCXN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudF9kZXNjCWRlc2M7CisJc3RydWN0IGxpc3RfaGVhZAkJCWxpc3Q7Cit9OworCitzdHJ1Y3QgaWJfdW9iamVjdF9tciB7CisJc3RydWN0IGliX3VvYmplY3QJCQl1b2JqOworCXN0cnVjdCBwYWdlCQkJICAgICAgICpwYWdlX2xpc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0CQkgICAgICAgKnNnX2xpc3Q7Cit9OworCitleHRlcm4gc3RydWN0IHNlbWFwaG9yZSBpYl91dmVyYnNfaWRyX211dGV4OworZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX3BkX2lkcjsKK2V4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19tcl9pZHI7CitleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfbXdfaWRyOworZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX2FoX2lkcjsKK2V4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19jcV9pZHI7CitleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfcXBfaWRyOworCit2b2lkIGliX3V2ZXJic19jb21wX2hhbmRsZXIoc3RydWN0IGliX2NxICpjcSwgdm9pZCAqY3FfY29udGV4dCk7Cit2b2lkIGliX3V2ZXJic19jcV9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKTsKK3ZvaWQgaWJfdXZlcmJzX3FwX2V2ZW50X2hhbmRsZXIoc3RydWN0IGliX2V2ZW50ICpldmVudCwgdm9pZCAqY29udGV4dF9wdHIpOworCitpbnQgaWJfdW1lbV9nZXQoc3RydWN0IGliX2RldmljZSAqZGV2LCBzdHJ1Y3QgaWJfdW1lbSAqbWVtLAorCQl2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHdyaXRlKTsKK3ZvaWQgaWJfdW1lbV9yZWxlYXNlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKnVtZW0pOwordm9pZCBpYl91bWVtX3JlbGVhc2Vfb25fY2xvc2Uoc3RydWN0IGliX2RldmljZSAqZGV2LCBzdHJ1Y3QgaWJfdW1lbSAqdW1lbSk7CisKKyNkZWZpbmUgSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKG5hbWUpCQkJCQlcCisJc3NpemVfdCBpYl91dmVyYnNfIyNuYW1lKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwJCVwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwJXAorCQkJCSBpbnQgb3V0X2xlbikKKworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHF1ZXJ5X3BhcmFtcyk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZ2V0X2NvbnRleHQpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHF1ZXJ5X2RldmljZSk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQocXVlcnlfcG9ydCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQocXVlcnlfZ2lkKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChxdWVyeV9wa2V5KTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChhbGxvY19wZCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVhbGxvY19wZCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQocmVnX21yKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChkZXJlZ19tcik7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoY3JlYXRlX2NxKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChkZXN0cm95X2NxKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChjcmVhdGVfcXApOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKG1vZGlmeV9xcCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVzdHJveV9xcCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoYXR0YWNoX21jYXN0KTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChkZXRhY2hfbWNhc3QpOworCisjZW5kaWYgLyogVVZFUkJTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJiYmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCkBAIC0wLDAgKzEsMTAwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogdXZlcmJzX2NtZC5jIDI3MDggMjAwNS0wNi0yNCAxNzoyNzoyMVogcm9sYW5kICQKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInV2ZXJicy5oIgorCisjZGVmaW5lIElOSVRfVURBVEEodWRhdGEsIGlidWYsIG9idWYsIGlsZW4sIG9sZW4pCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJKHVkYXRhKS0+aW5idWYgID0gKHZvaWQgX191c2VyICopIChpYnVmKTsJCVwKKwkJKHVkYXRhKS0+b3V0YnVmID0gKHZvaWQgX191c2VyICopIChvYnVmKTsJCVwKKwkJKHVkYXRhKS0+aW5sZW4gID0gKGlsZW4pOwkJCQlcCisJCSh1ZGF0YSktPm91dGxlbiA9IChvbGVuKTsJCQkJXAorCX0gd2hpbGUgKDApCisKK3NzaXplX3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtcyhzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtcyAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtc19yZXNwIHJlc3A7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCisJcmVzcC5udW1fY3FfZXZlbnRzID0gZmlsZS0+ZGV2aWNlLT5udW1fY29tcDsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsICZyZXNwLCBzaXplb2YgcmVzcCkpCisJICAgIHJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfZ2V0X2NvbnRleHQoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfZ2V0X2NvbnRleHQgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19nZXRfY29udGV4dF9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICAgIHVkYXRhOworCXN0cnVjdCBpYl9kZXZpY2UgICAgICAgICAgICAgICAgICppYmRldiA9IGZpbGUtPmRldmljZS0+aWJfZGV2OworCWludCBpOworCWludCByZXQgPSBpbl9sZW47CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLAorCQkgICAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlICsgc2l6ZW9mIHJlc3AsCisJCSAgIGluX2xlbiAtIHNpemVvZiBjbWQsIG91dF9sZW4gLSBzaXplb2YgcmVzcCk7CisKKwlmaWxlLT51Y29udGV4dCA9IGliZGV2LT5hbGxvY191Y29udGV4dChpYmRldiwgJnVkYXRhKTsKKwlpZiAoSVNfRVJSKGZpbGUtPnVjb250ZXh0KSkgeworCQlyZXQgPSBQVFJfRVJSKGZpbGUtPnVjb250ZXh0KTsKKwkJZmlsZS0+dWNvbnRleHQgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCWZpbGUtPnVjb250ZXh0LT5kZXZpY2UgPSBpYmRldjsKKwlJTklUX0xJU1RfSEVBRCgmZmlsZS0+dWNvbnRleHQtPnBkX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT51Y29udGV4dC0+bXJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmZpbGUtPnVjb250ZXh0LT5td19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZmlsZS0+dWNvbnRleHQtPmNxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT51Y29udGV4dC0+cXBfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmZpbGUtPnVjb250ZXh0LT5zcnFfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmZpbGUtPnVjb250ZXh0LT5haF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCisJcmVzcC5hc3luY19mZCA9IGZpbGUtPmFzeW5jX2ZpbGUuZmQ7CisJZm9yIChpID0gMDsgaSA8IGZpbGUtPmRldmljZS0+bnVtX2NvbXA7ICsraSkKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5jcV9mZF90YWIgKworCQkJCSBpICogc2l6ZW9mIChfX3UzMiksCisJCQkJICZmaWxlLT5jb21wX2ZpbGVbaV0uZmQsIHNpemVvZiAoX191MzIpKSkKKwkJCWdvdG8gZXJyOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKQorCQlnb3RvIGVycjsKKworCXJldHVybiBpbl9sZW47CisKK2VycjoKKwlpYmRldi0+ZGVhbGxvY191Y29udGV4dChmaWxlLT51Y29udGV4dCk7CisJZmlsZS0+dWNvbnRleHQgPSBOVUxMOworCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX3F1ZXJ5X2RldmljZShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X2RldmljZSAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X2RldmljZV9yZXNwIHJlc3A7CisJc3RydWN0IGliX2RldmljZV9hdHRyICAgICAgICAgICAgICBhdHRyOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBpYl9xdWVyeV9kZXZpY2UoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsICZhdHRyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKKwlyZXNwLmZ3X3ZlciAJCSAgICAgICA9IGF0dHIuZndfdmVyOworCXJlc3Aubm9kZV9ndWlkIAkJICAgICAgID0gYXR0ci5ub2RlX2d1aWQ7CisJcmVzcC5zeXNfaW1hZ2VfZ3VpZCAJICAgICAgID0gYXR0ci5zeXNfaW1hZ2VfZ3VpZDsKKwlyZXNwLm1heF9tcl9zaXplIAkgICAgICAgPSBhdHRyLm1heF9tcl9zaXplOworCXJlc3AucGFnZV9zaXplX2NhcCAJICAgICAgID0gYXR0ci5wYWdlX3NpemVfY2FwOworCXJlc3AudmVuZG9yX2lkIAkJICAgICAgID0gYXR0ci52ZW5kb3JfaWQ7CisJcmVzcC52ZW5kb3JfcGFydF9pZCAJICAgICAgID0gYXR0ci52ZW5kb3JfcGFydF9pZDsKKwlyZXNwLmh3X3ZlciAJCSAgICAgICA9IGF0dHIuaHdfdmVyOworCXJlc3AubWF4X3FwIAkJICAgICAgID0gYXR0ci5tYXhfcXA7CisJcmVzcC5tYXhfcXBfd3IgCQkgICAgICAgPSBhdHRyLm1heF9xcF93cjsKKwlyZXNwLmRldmljZV9jYXBfZmxhZ3MgCSAgICAgICA9IGF0dHIuZGV2aWNlX2NhcF9mbGFnczsKKwlyZXNwLm1heF9zZ2UgCQkgICAgICAgPSBhdHRyLm1heF9zZ2U7CisJcmVzcC5tYXhfc2dlX3JkIAkgICAgICAgPSBhdHRyLm1heF9zZ2VfcmQ7CisJcmVzcC5tYXhfY3EgCQkgICAgICAgPSBhdHRyLm1heF9jcTsKKwlyZXNwLm1heF9jcWUgCQkgICAgICAgPSBhdHRyLm1heF9jcWU7CisJcmVzcC5tYXhfbXIgCQkgICAgICAgPSBhdHRyLm1heF9tcjsKKwlyZXNwLm1heF9wZCAJCSAgICAgICA9IGF0dHIubWF4X3BkOworCXJlc3AubWF4X3FwX3JkX2F0b20gCSAgICAgICA9IGF0dHIubWF4X3FwX3JkX2F0b207CisJcmVzcC5tYXhfZWVfcmRfYXRvbSAJICAgICAgID0gYXR0ci5tYXhfZWVfcmRfYXRvbTsKKwlyZXNwLm1heF9yZXNfcmRfYXRvbSAJICAgICAgID0gYXR0ci5tYXhfcmVzX3JkX2F0b207CisJcmVzcC5tYXhfcXBfaW5pdF9yZF9hdG9tICAgICAgID0gYXR0ci5tYXhfcXBfaW5pdF9yZF9hdG9tOworCXJlc3AubWF4X2VlX2luaXRfcmRfYXRvbSAgICAgICA9IGF0dHIubWF4X2VlX2luaXRfcmRfYXRvbTsKKwlyZXNwLmF0b21pY19jYXAgCSAgICAgICA9IGF0dHIuYXRvbWljX2NhcDsKKwlyZXNwLm1heF9lZSAJCSAgICAgICA9IGF0dHIubWF4X2VlOworCXJlc3AubWF4X3JkZCAJCSAgICAgICA9IGF0dHIubWF4X3JkZDsKKwlyZXNwLm1heF9tdyAJCSAgICAgICA9IGF0dHIubWF4X213OworCXJlc3AubWF4X3Jhd19pcHY2X3FwIAkgICAgICAgPSBhdHRyLm1heF9yYXdfaXB2Nl9xcDsKKwlyZXNwLm1heF9yYXdfZXRoeV9xcCAJICAgICAgID0gYXR0ci5tYXhfcmF3X2V0aHlfcXA7CisJcmVzcC5tYXhfbWNhc3RfZ3JwIAkgICAgICAgPSBhdHRyLm1heF9tY2FzdF9ncnA7CisJcmVzcC5tYXhfbWNhc3RfcXBfYXR0YWNoICAgICAgID0gYXR0ci5tYXhfbWNhc3RfcXBfYXR0YWNoOworCXJlc3AubWF4X3RvdGFsX21jYXN0X3FwX2F0dGFjaCA9IGF0dHIubWF4X3RvdGFsX21jYXN0X3FwX2F0dGFjaDsKKwlyZXNwLm1heF9haCAJCSAgICAgICA9IGF0dHIubWF4X2FoOworCXJlc3AubWF4X2ZtciAJCSAgICAgICA9IGF0dHIubWF4X2ZtcjsKKwlyZXNwLm1heF9tYXBfcGVyX2ZtciAJICAgICAgID0gYXR0ci5tYXhfbWFwX3Blcl9mbXI7CisJcmVzcC5tYXhfc3JxIAkJICAgICAgID0gYXR0ci5tYXhfc3JxOworCXJlc3AubWF4X3NycV93ciAJICAgICAgID0gYXR0ci5tYXhfc3JxX3dyOworCXJlc3AubWF4X3NycV9zZ2UgCSAgICAgICA9IGF0dHIubWF4X3NycV9zZ2U7CisJcmVzcC5tYXhfcGtleXMgCQkgICAgICAgPSBhdHRyLm1heF9wa2V5czsKKwlyZXNwLmxvY2FsX2NhX2Fja19kZWxheSAgICAgICAgPSBhdHRyLmxvY2FsX2NhX2Fja19kZWxheTsKKwlyZXNwLnBoeXNfcG9ydF9jbnQJICAgICAgID0gZmlsZS0+ZGV2aWNlLT5pYl9kZXYtPnBoeXNfcG9ydF9jbnQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfcXVlcnlfcG9ydChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfcG9ydCAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BvcnRfcmVzcCByZXNwOworCXN0cnVjdCBpYl9wb3J0X2F0dHIgICAgICAgICAgICAgIGF0dHI7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBpYl9xdWVyeV9wb3J0KGZpbGUtPmRldmljZS0+aWJfZGV2LCBjbWQucG9ydF9udW0sICZhdHRyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKKwlyZXNwLnN0YXRlIAkgICAgID0gYXR0ci5zdGF0ZTsKKwlyZXNwLm1heF9tdHUgCSAgICAgPSBhdHRyLm1heF9tdHU7CisJcmVzcC5hY3RpdmVfbXR1ICAgICAgPSBhdHRyLmFjdGl2ZV9tdHU7CisJcmVzcC5naWRfdGJsX2xlbiAgICAgPSBhdHRyLmdpZF90YmxfbGVuOworCXJlc3AucG9ydF9jYXBfZmxhZ3MgID0gYXR0ci5wb3J0X2NhcF9mbGFnczsKKwlyZXNwLm1heF9tc2dfc3ogICAgICA9IGF0dHIubWF4X21zZ19zejsKKwlyZXNwLmJhZF9wa2V5X2NudHIgICA9IGF0dHIuYmFkX3BrZXlfY250cjsKKwlyZXNwLnFrZXlfdmlvbF9jbnRyICA9IGF0dHIucWtleV92aW9sX2NudHI7CisJcmVzcC5wa2V5X3RibF9sZW4gICAgPSBhdHRyLnBrZXlfdGJsX2xlbjsKKwlyZXNwLmxpZCAJICAgICA9IGF0dHIubGlkOworCXJlc3Auc21fbGlkIAkgICAgID0gYXR0ci5zbV9saWQ7CisJcmVzcC5sbWMgCSAgICAgPSBhdHRyLmxtYzsKKwlyZXNwLm1heF92bF9udW0gICAgICA9IGF0dHIubWF4X3ZsX251bTsKKwlyZXNwLnNtX3NsIAkgICAgID0gYXR0ci5zbV9zbDsKKwlyZXNwLnN1Ym5ldF90aW1lb3V0ICA9IGF0dHIuc3VibmV0X3RpbWVvdXQ7CisJcmVzcC5pbml0X3R5cGVfcmVwbHkgPSBhdHRyLmluaXRfdHlwZV9yZXBseTsKKwlyZXNwLmFjdGl2ZV93aWR0aCAgICA9IGF0dHIuYWN0aXZlX3dpZHRoOworCXJlc3AuYWN0aXZlX3NwZWVkICAgID0gYXR0ci5hY3RpdmVfc3BlZWQ7CisJcmVzcC5waHlzX3N0YXRlICAgICAgPSBhdHRyLnBoeXNfc3RhdGU7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfcXVlcnlfZ2lkKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfZ2lkICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfZ2lkX3Jlc3AgcmVzcDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKKwlyZXQgPSBpYl9xdWVyeV9naWQoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsIGNtZC5wb3J0X251bSwgY21kLmluZGV4LAorCQkJICAgKHVuaW9uIGliX2dpZCAqKSByZXNwLmdpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gaW5fbGVuOworfQorCitzc2l6ZV90IGliX3V2ZXJic19xdWVyeV9wa2V5KHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19xdWVyeV9wa2V5ICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfcGtleV9yZXNwIHJlc3A7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKKworCXJldCA9IGliX3F1ZXJ5X3BrZXkoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsIGNtZC5wb3J0X251bSwgY21kLmluZGV4LAorCQkJICAgICZyZXNwLnBrZXkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfYWxsb2NfcGQoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfYWxsb2NfcGQgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19hbGxvY19wZF9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgIHVkYXRhOworCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICAgICp1b2JqOworCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAgICpwZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlJTklUX1VEQVRBKCZ1ZGF0YSwgYnVmICsgc2l6ZW9mIGNtZCwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSArIHNpemVvZiByZXNwLAorCQkgICBpbl9sZW4gLSBzaXplb2YgY21kLCBvdXRfbGVuIC0gc2l6ZW9mIHJlc3ApOworCisJdW9iaiA9IGttYWxsb2Moc2l6ZW9mICp1b2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVvYmopCisJCXJldHVybiAtRU5PTUVNOworCisJdW9iai0+Y29udGV4dCA9IGZpbGUtPnVjb250ZXh0OworCisJcGQgPSBmaWxlLT5kZXZpY2UtPmliX2Rldi0+YWxsb2NfcGQoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsCisJCQkJCSAgICBmaWxlLT51Y29udGV4dCwgJnVkYXRhKTsKKwlpZiAoSVNfRVJSKHBkKSkgeworCQlyZXQgPSBQVFJfRVJSKHBkKTsKKwkJZ290byBlcnI7CisJfQorCisJcGQtPmRldmljZSAgPSBmaWxlLT5kZXZpY2UtPmliX2RldjsKKwlwZC0+dW9iamVjdCA9IHVvYmo7CisJYXRvbWljX3NldCgmcGQtPnVzZWNudCwgMCk7CisKK3JldHJ5OgorCWlmICghaWRyX3ByZV9nZXQoJmliX3V2ZXJic19wZF9pZHIsIEdGUF9LRVJORUwpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3BkOworCX0KKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfcGRfaWRyLCBwZCwgJnVvYmotPmlkKTsKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcGQ7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdW9iai0+bGlzdCwgJmZpbGUtPnVjb250ZXh0LT5wZF9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCXJlc3AucGRfaGFuZGxlID0gdW9iai0+aWQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfbGlzdDsKKwl9CisKKwlyZXR1cm4gaW5fbGVuOworCitlcnJfbGlzdDoKKyAJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19wZF9pZHIsIHVvYmotPmlkKTsKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKK2Vycl9wZDoKKwlpYl9kZWFsbG9jX3BkKHBkKTsKKworZXJyOgorCWtmcmVlKHVvYmopOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2RlYWxsb2NfcGQoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2RlYWxsb2NfcGQgY21kOworCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICpwZDsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAqdW9iajsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcGQgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CisJaWYgKCFwZCB8fCBwZC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKKwkJZ290byBvdXQ7CisKKwl1b2JqID0gcGQtPnVvYmplY3Q7CisKKwlyZXQgPSBpYl9kZWFsbG9jX3BkKHBkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19wZF9pZHIsIGNtZC5wZF9oYW5kbGUpOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWtmcmVlKHVvYmopOworCitvdXQ6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfcmVnX21yKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfcmVnX21yICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfcmVnX21yX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfdWRhdGEgICAgICAgICAgICAgIHVkYXRhOworCXN0cnVjdCBpYl91bWVtX29iamVjdCAgICAgICAqb2JqOworCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAqcGQ7CisJc3RydWN0IGliX21yICAgICAgICAgICAgICAgICptcjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJSU5JVF9VREFUQSgmdWRhdGEsIGJ1ZiArIHNpemVvZiBjbWQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKKwkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiByZXNwKTsKKworCWlmICgoY21kLnN0YXJ0ICYgflBBR0VfTUFTSykgIT0gKGNtZC5oY2FfdmEgJiB+UEFHRV9NQVNLKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvYmogPSBrbWFsbG9jKHNpemVvZiAqb2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvYmotPnVvYmplY3QuY29udGV4dCA9IGZpbGUtPnVjb250ZXh0OworCisJLyoKKwkgKiBXZSBhc2sgZm9yIHdyaXRhYmxlIG1lbW9yeSBpZiBhbnkgYWNjZXNzIGZsYWdzIG90aGVyIHRoYW4KKwkgKiAicmVtb3RlIHJlYWQiIGFyZSBzZXQuICAiTG9jYWwgd3JpdGUiIGFuZCAicmVtb3RlIHdyaXRlIgorCSAqIG9idmlvdXNseSByZXF1aXJlIHdyaXRlIGFjY2Vzcy4gICJSZW1vdGUgYXRvbWljIiBjYW4gZG8KKwkgKiB0aGluZ3MgbGlrZSBmZXRjaCBhbmQgYWRkLCB3aGljaCB3aWxsIG1vZGlmeSBtZW1vcnksIGFuZAorCSAqICJNVyBiaW5kIiBjYW4gY2hhbmdlIHBlcm1pc3Npb25zIGJ5IGJpbmRpbmcgYSB3aW5kb3cuCisJICovCisJcmV0ID0gaWJfdW1lbV9nZXQoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsICZvYmotPnVtZW0sCisJCQkgICh2b2lkICopICh1bnNpZ25lZCBsb25nKSBjbWQuc3RhcnQsIGNtZC5sZW5ndGgsCisJCQkgICEhKGNtZC5hY2Nlc3NfZmxhZ3MgJiB+SUJfQUNDRVNTX1JFTU9URV9SRUFEKSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZTsKKworCW9iai0+dW1lbS52aXJ0X2Jhc2UgPSBjbWQuaGNhX3ZhOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlwZCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKKwlpZiAoIXBkIHx8IHBkLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3VwOworCX0KKworCWlmICghcGQtPmRldmljZS0+cmVnX3VzZXJfbXIpIHsKKwkJcmV0ID0gLUVOT1NZUzsKKwkJZ290byBlcnJfdXA7CisJfQorCisJbXIgPSBwZC0+ZGV2aWNlLT5yZWdfdXNlcl9tcihwZCwgJm9iai0+dW1lbSwgY21kLmFjY2Vzc19mbGFncywgJnVkYXRhKTsKKwlpZiAoSVNfRVJSKG1yKSkgeworCQlyZXQgPSBQVFJfRVJSKG1yKTsKKwkJZ290byBlcnJfdXA7CisJfQorCisJbXItPmRldmljZSAgPSBwZC0+ZGV2aWNlOworCW1yLT5wZCAgICAgID0gcGQ7CisJbXItPnVvYmplY3QgPSAmb2JqLT51b2JqZWN0OworCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOworCWF0b21pY19zZXQoJm1yLT51c2VjbnQsIDApOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisJcmVzcC5sa2V5ID0gbXItPmxrZXk7CisJcmVzcC5ya2V5ID0gbXItPnJrZXk7CisKK3JldHJ5OgorCWlmICghaWRyX3ByZV9nZXQoJmliX3V2ZXJic19tcl9pZHIsIEdGUF9LRVJORUwpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VucmVnOworCX0KKworCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfbXJfaWRyLCBtciwgJm9iai0+dW9iamVjdC5pZCk7CisKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdW5yZWc7CisKKwlyZXNwLm1yX2hhbmRsZSA9IG9iai0+dW9iamVjdC5pZDsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZvYmotPnVvYmplY3QubGlzdCwgJmZpbGUtPnVjb250ZXh0LT5tcl9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycl9saXN0OworCX0KKworCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiBpbl9sZW47CisKK2Vycl9saXN0OgorCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2RlbCgmb2JqLT51b2JqZWN0Lmxpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCitlcnJfdW5yZWc6CisJaWJfZGVyZWdfbXIobXIpOworCitlcnJfdXA6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJaWJfdW1lbV9yZWxlYXNlKGZpbGUtPmRldmljZS0+aWJfZGV2LCAmb2JqLT51bWVtKTsKKworZXJyX2ZyZWU6CisJa2ZyZWUob2JqKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90IGliX3V2ZXJic19kZXJlZ19tcihzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19kZXJlZ19tciBjbWQ7CisJc3RydWN0IGliX21yICAgICAgICAgICAgICptcjsKKwlzdHJ1Y3QgaWJfdW1lbV9vYmplY3QgICAgKm1lbW9iajsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCW1yID0gaWRyX2ZpbmQoJmliX3V2ZXJic19tcl9pZHIsIGNtZC5tcl9oYW5kbGUpOworCWlmICghbXIgfHwgbXItPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCisJCWdvdG8gb3V0OworCisJbWVtb2JqID0gY29udGFpbmVyX29mKG1yLT51b2JqZWN0LCBzdHJ1Y3QgaWJfdW1lbV9vYmplY3QsIHVvYmplY3QpOworCisJcmV0ID0gaWJfZGVyZWdfbXIobXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX21yX2lkciwgY21kLm1yX2hhbmRsZSk7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9kZWwoJm1lbW9iai0+dW9iamVjdC5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWliX3VtZW1fcmVsZWFzZShmaWxlLT5kZXZpY2UtPmliX2RldiwgJm1lbW9iai0+dW1lbSk7CisJa2ZyZWUobWVtb2JqKTsKKworb3V0OgorCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2NyZWF0ZV9jcShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCSAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9jcSAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9jcV9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICB1ZGF0YTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAgICAgKnVvYmo7CisJc3RydWN0IGliX2NxICAgICAgICAgICAgICAgICAgICpjcTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJSU5JVF9VREFUQSgmdWRhdGEsIGJ1ZiArIHNpemVvZiBjbWQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKKwkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiByZXNwKTsKKworCWlmIChjbWQuZXZlbnRfaGFuZGxlciA+PSBmaWxlLT5kZXZpY2UtPm51bV9jb21wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXVvYmogPSBrbWFsbG9jKHNpemVvZiAqdW9iaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1b2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVvYmotPnVzZXJfaGFuZGxlID0gY21kLnVzZXJfaGFuZGxlOworCXVvYmotPmNvbnRleHQgICAgID0gZmlsZS0+dWNvbnRleHQ7CisKKwljcSA9IGZpbGUtPmRldmljZS0+aWJfZGV2LT5jcmVhdGVfY3EoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsIGNtZC5jcWUsCisJCQkJCSAgICAgZmlsZS0+dWNvbnRleHQsICZ1ZGF0YSk7CisJaWYgKElTX0VSUihjcSkpIHsKKwkJcmV0ID0gUFRSX0VSUihjcSk7CisJCWdvdG8gZXJyOworCX0KKworCWNxLT5kZXZpY2UgICAgICAgID0gZmlsZS0+ZGV2aWNlLT5pYl9kZXY7CisJY3EtPnVvYmplY3QgICAgICAgPSB1b2JqOworCWNxLT5jb21wX2hhbmRsZXIgID0gaWJfdXZlcmJzX2NvbXBfaGFuZGxlcjsKKwljcS0+ZXZlbnRfaGFuZGxlciA9IGliX3V2ZXJic19jcV9ldmVudF9oYW5kbGVyOworCWNxLT5jcV9jb250ZXh0ICAgID0gZmlsZTsKKwlhdG9taWNfc2V0KCZjcS0+dXNlY250LCAwKTsKKworcmV0cnk6CisJaWYgKCFpZHJfcHJlX2dldCgmaWJfdXZlcmJzX2NxX2lkciwgR0ZQX0tFUk5FTCkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfY3E7CisJfQorCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJcmV0ID0gaWRyX2dldF9uZXcoJmliX3V2ZXJic19jcV9pZHIsIGNxLCAmdW9iai0+aWQpOworCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJZ290byByZXRyeTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jcTsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ1b2JqLT5saXN0LCAmZmlsZS0+dWNvbnRleHQtPmNxX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisJcmVzcC5jcV9oYW5kbGUgPSB1b2JqLT5pZDsKKwlyZXNwLmNxZSAgICAgICA9IGNxLT5jcWU7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfbGlzdDsKKwl9CisKKwlyZXR1cm4gaW5fbGVuOworCitlcnJfbGlzdDoKKyAJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIHVvYmotPmlkKTsKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKK2Vycl9jcToKKwlpYl9kZXN0cm95X2NxKGNxKTsKKworZXJyOgorCWtmcmVlKHVvYmopOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3Eoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3EgY21kOworCXN0cnVjdCBpYl9jcSAgICAgICAgICAgICAgICpjcTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAqdW9iajsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLmNxX2hhbmRsZSk7CisJaWYgKCFjcSB8fCBjcS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKKwkJZ290byBvdXQ7CisKKwl1b2JqID0gY3EtPnVvYmplY3Q7CisKKwlyZXQgPSBpYl9kZXN0cm95X2NxKGNxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5jcV9oYW5kbGUpOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWtmcmVlKHVvYmopOworCitvdXQ6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfY3JlYXRlX3FwKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfdWRhdGEgICAgICAgICAgICAgICAgIHVkYXRhOworCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICAgICAqdW9iajsKKwlzdHJ1Y3QgaWJfcGQgICAgICAgICAgICAgICAgICAgKnBkOworCXN0cnVjdCBpYl9jcSAgICAgICAgICAgICAgICAgICAqc2NxLCAqcmNxOworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgICAgICAgICAqcXA7CisJc3RydWN0IGliX3FwX2luaXRfYXR0ciAgICAgICAgICBhdHRyOworCWludCByZXQ7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLAorCQkgICAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlICsgc2l6ZW9mIHJlc3AsCisJCSAgIGluX2xlbiAtIHNpemVvZiBjbWQsIG91dF9sZW4gLSBzaXplb2YgcmVzcCk7CisKKwl1b2JqID0ga21hbGxvYyhzaXplb2YgKnVvYmosIEdGUF9LRVJORUwpOworCWlmICghdW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXBkICA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKKwlzY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLnNlbmRfY3FfaGFuZGxlKTsKKwlyY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLnJlY3ZfY3FfaGFuZGxlKTsKKworCWlmICghcGQgIHx8IHBkLT51b2JqZWN0LT5jb250ZXh0ICAhPSBmaWxlLT51Y29udGV4dCB8fAorCSAgICAhc2NxIHx8IHNjcS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCB8fAorCSAgICAhcmNxIHx8IHJjcS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl91cDsKKwl9CisKKwlhdHRyLmV2ZW50X2hhbmRsZXIgPSBpYl91dmVyYnNfcXBfZXZlbnRfaGFuZGxlcjsKKwlhdHRyLnFwX2NvbnRleHQgICAgPSBmaWxlOworCWF0dHIuc2VuZF9jcSAgICAgICA9IHNjcTsKKwlhdHRyLnJlY3ZfY3EgICAgICAgPSByY3E7CisJYXR0ci5zcnEgICAgICAgICAgID0gTlVMTDsKKwlhdHRyLnNxX3NpZ190eXBlICAgPSBjbWQuc3Ffc2lnX2FsbCA/IElCX1NJR05BTF9BTExfV1IgOiBJQl9TSUdOQUxfUkVRX1dSOworCWF0dHIucXBfdHlwZSAgICAgICA9IGNtZC5xcF90eXBlOworCisJYXR0ci5jYXAubWF4X3NlbmRfd3IgICAgID0gY21kLm1heF9zZW5kX3dyOworCWF0dHIuY2FwLm1heF9yZWN2X3dyICAgICA9IGNtZC5tYXhfcmVjdl93cjsKKwlhdHRyLmNhcC5tYXhfc2VuZF9zZ2UgICAgPSBjbWQubWF4X3NlbmRfc2dlOworCWF0dHIuY2FwLm1heF9yZWN2X3NnZSAgICA9IGNtZC5tYXhfcmVjdl9zZ2U7CisJYXR0ci5jYXAubWF4X2lubGluZV9kYXRhID0gY21kLm1heF9pbmxpbmVfZGF0YTsKKworCXVvYmotPnVzZXJfaGFuZGxlID0gY21kLnVzZXJfaGFuZGxlOworCXVvYmotPmNvbnRleHQgICAgID0gZmlsZS0+dWNvbnRleHQ7CisKKwlxcCA9IHBkLT5kZXZpY2UtPmNyZWF0ZV9xcChwZCwgJmF0dHIsICZ1ZGF0YSk7CisJaWYgKElTX0VSUihxcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihxcCk7CisJCWdvdG8gZXJyX3VwOworCX0KKworCXFwLT5kZXZpY2UgICAgIAkgID0gcGQtPmRldmljZTsKKwlxcC0+cGQgICAgICAgICAJICA9IHBkOworCXFwLT5zZW5kX2NxICAgIAkgID0gYXR0ci5zZW5kX2NxOworCXFwLT5yZWN2X2NxICAgIAkgID0gYXR0ci5yZWN2X2NxOworCXFwLT5zcnEJICAgICAgIAkgID0gYXR0ci5zcnE7CisJcXAtPnVvYmplY3QgICAgICAgPSB1b2JqOworCXFwLT5ldmVudF9oYW5kbGVyID0gYXR0ci5ldmVudF9oYW5kbGVyOworCXFwLT5xcF9jb250ZXh0ICAgID0gYXR0ci5xcF9jb250ZXh0OworCXFwLT5xcF90eXBlCSAgPSBhdHRyLnFwX3R5cGU7CisJYXRvbWljX2luYygmcGQtPnVzZWNudCk7CisJYXRvbWljX2luYygmYXR0ci5zZW5kX2NxLT51c2VjbnQpOworCWF0b21pY19pbmMoJmF0dHIucmVjdl9jcS0+dXNlY250KTsKKwlpZiAoYXR0ci5zcnEpCisJCWF0b21pY19pbmMoJmF0dHIuc3JxLT51c2VjbnQpOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisJcmVzcC5xcG4gPSBxcC0+cXBfbnVtOworCityZXRyeToKKwlpZiAoIWlkcl9wcmVfZ2V0KCZpYl91dmVyYnNfcXBfaWRyLCBHRlBfS0VSTkVMKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZXN0cm95OworCX0KKworCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfcXBfaWRyLCBxcCwgJnVvYmotPmlkKTsKKworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJZ290byByZXRyeTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZXN0cm95OworCisJcmVzcC5xcF9oYW5kbGUgPSB1b2JqLT5pZDsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ1b2JqLT5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnFwX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2xpc3Q7CisJfQorCisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIGluX2xlbjsKKworZXJyX2xpc3Q6CisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworZXJyX2Rlc3Ryb3k6CisJaWJfZGVzdHJveV9xcChxcCk7CisKK2Vycl91cDoKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlrZnJlZSh1b2JqKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90IGliX3V2ZXJic19tb2RpZnlfcXAoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19tb2RpZnlfcXAgY21kOworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgICAgKnFwOworCXN0cnVjdCBpYl9xcF9hdHRyICAgICAgICAgKmF0dHI7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJYXR0ciA9IGttYWxsb2Moc2l6ZW9mICphdHRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF0dHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKKwlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWF0dHItPnFwX3N0YXRlIAkJICA9IGNtZC5xcF9zdGF0ZTsKKwlhdHRyLT5jdXJfcXBfc3RhdGUgCSAgPSBjbWQuY3VyX3FwX3N0YXRlOworCWF0dHItPnBhdGhfbXR1IAkJICA9IGNtZC5wYXRoX210dTsKKwlhdHRyLT5wYXRoX21pZ19zdGF0ZSAJICA9IGNtZC5wYXRoX21pZ19zdGF0ZTsKKwlhdHRyLT5xa2V5IAkJICA9IGNtZC5xa2V5OworCWF0dHItPnJxX3BzbiAJCSAgPSBjbWQucnFfcHNuOworCWF0dHItPnNxX3BzbiAJCSAgPSBjbWQuc3FfcHNuOworCWF0dHItPmRlc3RfcXBfbnVtIAkgID0gY21kLmRlc3RfcXBfbnVtOworCWF0dHItPnFwX2FjY2Vzc19mbGFncyAJICA9IGNtZC5xcF9hY2Nlc3NfZmxhZ3M7CisJYXR0ci0+cGtleV9pbmRleCAJICA9IGNtZC5wa2V5X2luZGV4OworCWF0dHItPmFsdF9wa2V5X2luZGV4IAkgID0gY21kLnBrZXlfaW5kZXg7CisJYXR0ci0+ZW5fc3FkX2FzeW5jX25vdGlmeSA9IGNtZC5lbl9zcWRfYXN5bmNfbm90aWZ5OworCWF0dHItPm1heF9yZF9hdG9taWMgCSAgPSBjbWQubWF4X3JkX2F0b21pYzsKKwlhdHRyLT5tYXhfZGVzdF9yZF9hdG9taWMgID0gY21kLm1heF9kZXN0X3JkX2F0b21pYzsKKwlhdHRyLT5taW5fcm5yX3RpbWVyIAkgID0gY21kLm1pbl9ybnJfdGltZXI7CisJYXR0ci0+cG9ydF9udW0gCQkgID0gY21kLnBvcnRfbnVtOworCWF0dHItPnRpbWVvdXQgCQkgID0gY21kLnRpbWVvdXQ7CisJYXR0ci0+cmV0cnlfY250IAkgID0gY21kLnJldHJ5X2NudDsKKwlhdHRyLT5ybnJfcmV0cnkgCSAgPSBjbWQucm5yX3JldHJ5OworCWF0dHItPmFsdF9wb3J0X251bSAJICA9IGNtZC5hbHRfcG9ydF9udW07CisJYXR0ci0+YWx0X3RpbWVvdXQgCSAgPSBjbWQuYWx0X3RpbWVvdXQ7CisKKwltZW1jcHkoYXR0ci0+YWhfYXR0ci5ncmguZGdpZC5yYXcsIGNtZC5kZXN0LmRnaWQsIDE2KTsKKwlhdHRyLT5haF9hdHRyLmdyaC5mbG93X2xhYmVsICAgICAgICA9IGNtZC5kZXN0LmZsb3dfbGFiZWw7CisJYXR0ci0+YWhfYXR0ci5ncmguc2dpZF9pbmRleCAgICAgICAgPSBjbWQuZGVzdC5zZ2lkX2luZGV4OworCWF0dHItPmFoX2F0dHIuZ3JoLmhvcF9saW1pdCAgICAgICAgID0gY21kLmRlc3QuaG9wX2xpbWl0OworCWF0dHItPmFoX2F0dHIuZ3JoLnRyYWZmaWNfY2xhc3MgICAgID0gY21kLmRlc3QudHJhZmZpY19jbGFzczsKKwlhdHRyLT5haF9hdHRyLmRsaWQgCSAgICAJICAgID0gY21kLmRlc3QuZGxpZDsKKwlhdHRyLT5haF9hdHRyLnNsICAgCSAgICAJICAgID0gY21kLmRlc3Quc2w7CisJYXR0ci0+YWhfYXR0ci5zcmNfcGF0aF9iaXRzIAkgICAgPSBjbWQuZGVzdC5zcmNfcGF0aF9iaXRzOworCWF0dHItPmFoX2F0dHIuc3RhdGljX3JhdGUgICAJICAgID0gY21kLmRlc3Quc3RhdGljX3JhdGU7CisJYXR0ci0+YWhfYXR0ci5haF9mbGFncyAJICAgIAkgICAgPSBjbWQuZGVzdC5pc19nbG9iYWwgPyBJQl9BSF9HUkggOiAwOworCWF0dHItPmFoX2F0dHIucG9ydF9udW0gCSAgICAJICAgID0gY21kLmRlc3QucG9ydF9udW07CisKKwltZW1jcHkoYXR0ci0+YWx0X2FoX2F0dHIuZ3JoLmRnaWQucmF3LCBjbWQuYWx0X2Rlc3QuZGdpZCwgMTYpOworCWF0dHItPmFsdF9haF9hdHRyLmdyaC5mbG93X2xhYmVsICAgID0gY21kLmFsdF9kZXN0LmZsb3dfbGFiZWw7CisJYXR0ci0+YWx0X2FoX2F0dHIuZ3JoLnNnaWRfaW5kZXggICAgPSBjbWQuYWx0X2Rlc3Quc2dpZF9pbmRleDsKKwlhdHRyLT5hbHRfYWhfYXR0ci5ncmguaG9wX2xpbWl0ICAgICA9IGNtZC5hbHRfZGVzdC5ob3BfbGltaXQ7CisJYXR0ci0+YWx0X2FoX2F0dHIuZ3JoLnRyYWZmaWNfY2xhc3MgPSBjbWQuYWx0X2Rlc3QudHJhZmZpY19jbGFzczsKKwlhdHRyLT5hbHRfYWhfYXR0ci5kbGlkIAkgICAgCSAgICA9IGNtZC5hbHRfZGVzdC5kbGlkOworCWF0dHItPmFsdF9haF9hdHRyLnNsICAgCSAgICAJICAgID0gY21kLmFsdF9kZXN0LnNsOworCWF0dHItPmFsdF9haF9hdHRyLnNyY19wYXRoX2JpdHMgICAgID0gY21kLmFsdF9kZXN0LnNyY19wYXRoX2JpdHM7CisJYXR0ci0+YWx0X2FoX2F0dHIuc3RhdGljX3JhdGUgICAgICAgPSBjbWQuYWx0X2Rlc3Quc3RhdGljX3JhdGU7CisJYXR0ci0+YWx0X2FoX2F0dHIuYWhfZmxhZ3MgCSAgICA9IGNtZC5hbHRfZGVzdC5pc19nbG9iYWwgPyBJQl9BSF9HUkggOiAwOworCWF0dHItPmFsdF9haF9hdHRyLnBvcnRfbnVtIAkgICAgPSBjbWQuYWx0X2Rlc3QucG9ydF9udW07CisKKwlyZXQgPSBpYl9tb2RpZnlfcXAocXAsIGF0dHIsIGNtZC5hdHRyX21hc2spOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaW5fbGVuOworCitvdXQ6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCWtmcmVlKGF0dHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBpYl91dmVyYnNfZGVzdHJveV9xcChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9xcCBjbWQ7CisJc3RydWN0IGliX3FwICAgICAgICAgICAgICAgKnFwOworCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICp1b2JqOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKKwlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQorCQlnb3RvIG91dDsKKworCXVvYmogPSBxcC0+dW9iamVjdDsKKworCXJldCA9IGliX2Rlc3Ryb3lfcXAocXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9kZWwoJnVvYmotPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCisJa2ZyZWUodW9iaik7CisKK291dDoKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOworfQorCitzc2l6ZV90IGliX3V2ZXJic19hdHRhY2hfbWNhc3Qoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19hdHRhY2hfbWNhc3QgY21kOworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgICAgICAgKnFwOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOworCWlmIChxcCAmJiBxcC0+dW9iamVjdC0+Y29udGV4dCA9PSBmaWxlLT51Y29udGV4dCkKKwkJcmV0ID0gaWJfYXR0YWNoX21jYXN0KHFwLCAodW5pb24gaWJfZ2lkICopIGNtZC5naWQsIGNtZC5tbGlkKTsKKworCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2RldGFjaF9tY2FzdChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCSAgICAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2RldGFjaF9tY2FzdCBjbWQ7CisJc3RydWN0IGliX3FwICAgICAgICAgICAgICAgICAqcXA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CisJaWYgKHFwICYmIHFwLT51b2JqZWN0LT5jb250ZXh0ID09IGZpbGUtPnVjb250ZXh0KQorCQlyZXQgPSBpYl9kZXRhY2hfbWNhc3QocXAsICh1bmlvbiBpYl9naWQgKikgY21kLmdpZCwgY21kLm1saWQpOworCisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYmUwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogJElkOiB1dmVyYnNfbWFpbi5jIDI3MzMgMjAwNS0wNi0yOCAxOToxNDozNFogcm9sYW5kICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInV2ZXJicy5oIgorCitNT0RVTEVfQVVUSE9SKCJSb2xhbmQgRHJlaWVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkluZmluaUJhbmQgdXNlcnNwYWNlIHZlcmJzIGFjY2VzcyIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCisjZGVmaW5lIElORklOSUJBTkRFVkVOVEZTX01BR0lDCTB4NDk0MjY1NzYJLyogIklCZXYiICovCisKK2VudW0geworCUlCX1VWRVJCU19NQUpPUiAgICAgICA9IDIzMSwKKwlJQl9VVkVSQlNfQkFTRV9NSU5PUiAgPSAxOTIsCisJSUJfVVZFUkJTX01BWF9ERVZJQ0VTID0gMzIKK307CisKKyNkZWZpbmUgSUJfVVZFUkJTX0JBU0VfREVWCU1LREVWKElCX1VWRVJCU19NQUpPUiwgSUJfVVZFUkJTX0JBU0VfTUlOT1IpCisKK0RFQ0xBUkVfTVVURVgoaWJfdXZlcmJzX2lkcl9tdXRleCk7CitERUZJTkVfSURSKGliX3V2ZXJic19wZF9pZHIpOworREVGSU5FX0lEUihpYl91dmVyYnNfbXJfaWRyKTsKK0RFRklORV9JRFIoaWJfdXZlcmJzX213X2lkcik7CitERUZJTkVfSURSKGliX3V2ZXJic19haF9pZHIpOworREVGSU5FX0lEUihpYl91dmVyYnNfY3FfaWRyKTsKK0RFRklORV9JRFIoaWJfdXZlcmJzX3FwX2lkcik7CisKK3N0YXRpYyBzcGlubG9ja190IG1hcF9sb2NrOworc3RhdGljIERFQ0xBUkVfQklUTUFQKGRldl9tYXAsIElCX1VWRVJCU19NQVhfREVWSUNFUyk7CisKK3N0YXRpYyBzc2l6ZV90ICgqdXZlcmJzX2NtZF90YWJsZVtdKShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJCSAgICAgaW50IG91dF9sZW4pID0geworCVtJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9QQVJBTVNdICA9IGliX3V2ZXJic19xdWVyeV9wYXJhbXMsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0dFVF9DT05URVhUXSAgID0gaWJfdXZlcmJzX2dldF9jb250ZXh0LAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9ERVZJQ0VdICA9IGliX3V2ZXJic19xdWVyeV9kZXZpY2UsCisJW0lCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1BPUlRdICAgID0gaWJfdXZlcmJzX3F1ZXJ5X3BvcnQsCisJW0lCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX0dJRF0gICAgID0gaWJfdXZlcmJzX3F1ZXJ5X2dpZCwKKwlbSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUEtFWV0gICAgPSBpYl91dmVyYnNfcXVlcnlfcGtleSwKKwlbSUJfVVNFUl9WRVJCU19DTURfQUxMT0NfUERdICAgICAgPSBpYl91dmVyYnNfYWxsb2NfcGQsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0RFQUxMT0NfUERdICAgID0gaWJfdXZlcmJzX2RlYWxsb2NfcGQsCisJW0lCX1VTRVJfVkVSQlNfQ01EX1JFR19NUl0gICAgICAgID0gaWJfdXZlcmJzX3JlZ19tciwKKwlbSUJfVVNFUl9WRVJCU19DTURfREVSRUdfTVJdICAgICAgPSBpYl91dmVyYnNfZGVyZWdfbXIsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9DUV0gICAgID0gaWJfdXZlcmJzX2NyZWF0ZV9jcSwKKwlbSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9DUV0gICAgPSBpYl91dmVyYnNfZGVzdHJveV9jcSwKKwlbSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX1FQXSAgICAgPSBpYl91dmVyYnNfY3JlYXRlX3FwLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9NT0RJRllfUVBdICAgICA9IGliX3V2ZXJic19tb2RpZnlfcXAsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfUVBdICAgID0gaWJfdXZlcmJzX2Rlc3Ryb3lfcXAsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0FUVEFDSF9NQ0FTVF0gID0gaWJfdXZlcmJzX2F0dGFjaF9tY2FzdCwKKwlbSUJfVVNFUl9WRVJCU19DTURfREVUQUNIX01DQVNUXSAgPSBpYl91dmVyYnNfZGV0YWNoX21jYXN0LAorfTsKKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqdXZlcmJzX2V2ZW50X21udDsKKworc3RhdGljIHZvaWQgaWJfdXZlcmJzX2FkZF9vbmUoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyB2b2lkIGliX3V2ZXJic19yZW1vdmVfb25lKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSk7CisKK3N0YXRpYyBpbnQgaWJfZGVhbGxvY191Y29udGV4dChzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQpCit7CisJc3RydWN0IGliX3VvYmplY3QgKnVvYmosICp0bXA7CisKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAwOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwkvKiBYWFggRnJlZSBBSHMgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1b2JqLCB0bXAsICZjb250ZXh0LT5xcF9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpYl9xcCAqcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgdW9iai0+aWQpOworCQlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfcXBfaWRyLCB1b2JqLT5pZCk7CisJCWliX2Rlc3Ryb3lfcXAocXApOworCQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJCWtmcmVlKHVvYmopOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1b2JqLCB0bXAsICZjb250ZXh0LT5jcV9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpYl9jcSAqY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgdW9iai0+aWQpOworCQlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfY3FfaWRyLCB1b2JqLT5pZCk7CisJCWliX2Rlc3Ryb3lfY3EoY3EpOworCQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJCWtmcmVlKHVvYmopOworCX0KKworCS8qIFhYWCBGcmVlIFNSUXMgKi8KKwkvKiBYWFggRnJlZSBNV3MgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1b2JqLCB0bXAsICZjb250ZXh0LT5tcl9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpYl9tciAqbXIgPSBpZHJfZmluZCgmaWJfdXZlcmJzX21yX2lkciwgdW9iai0+aWQpOworCQlzdHJ1Y3QgaWJfdW1lbV9vYmplY3QgKm1lbW9iajsKKworCQlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfbXJfaWRyLCB1b2JqLT5pZCk7CisJCWliX2RlcmVnX21yKG1yKTsKKworCQltZW1vYmogPSBjb250YWluZXJfb2YodW9iaiwgc3RydWN0IGliX3VtZW1fb2JqZWN0LCB1b2JqZWN0KTsKKwkJaWJfdW1lbV9yZWxlYXNlX29uX2Nsb3NlKG1yLT5kZXZpY2UsICZtZW1vYmotPnVtZW0pOworCisJCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwkJa2ZyZWUobWVtb2JqKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+cGRfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgaWJfcGQgKnBkID0gaWRyX2ZpbmQoJmliX3V2ZXJic19wZF9pZHIsIHVvYmotPmlkKTsKKwkJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3BkX2lkciwgdW9iai0+aWQpOworCQlpYl9kZWFsbG9jX3BkKHBkKTsKKwkJbGlzdF9kZWwoJnVvYmotPmxpc3QpOworCQlrZnJlZSh1b2JqKTsKKwl9CisKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlyZXR1cm4gY29udGV4dC0+ZGV2aWNlLT5kZWFsbG9jX3Vjb250ZXh0KGNvbnRleHQpOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfcmVsZWFzZV9maWxlKHN0cnVjdCBrcmVmICpyZWYpCit7CisJc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlID0KKwkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IGliX3V2ZXJic19maWxlLCByZWYpOworCisJbW9kdWxlX3B1dChmaWxlLT5kZXZpY2UtPmliX2Rldi0+b3duZXIpOworCWtmcmVlKGZpbGUpOworfQorCitzdGF0aWMgc3NpemVfdCBpYl91dmVyYnNfZXZlbnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdm9pZCAqZXZlbnQ7CisJaW50IGV2ZW50c3o7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT5sb2NrKTsKKworCXdoaWxlIChsaXN0X2VtcHR5KCZmaWxlLT5ldmVudF9saXN0KSAmJiBmaWxlLT5mZCA+PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+bG9jayk7CisKKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShmaWxlLT5wb2xsX3dhaXQsCisJCQkJCSAgICAgIWxpc3RfZW1wdHkoJmZpbGUtPmV2ZW50X2xpc3QpIHx8CisJCQkJCSAgICAgZmlsZS0+ZmQgPCAwKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJc3Bpbl9sb2NrX2lycSgmZmlsZS0+bG9jayk7CisJfQorCisJaWYgKGZpbGUtPmZkIDwgMCkgeworCQlzcGluX3VubG9ja19pcnEoJmZpbGUtPmxvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoZmlsZS0+aXNfYXN5bmMpIHsKKwkJZXZlbnQgICA9IGxpc3RfZW50cnkoZmlsZS0+ZXZlbnRfbGlzdC5uZXh0LAorCQkJCSAgICAgc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudCwgbGlzdCk7CisJCWV2ZW50c3ogPSBzaXplb2YgKHN0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnRfZGVzYyk7CisJfSBlbHNlIHsKKwkJZXZlbnQgICA9IGxpc3RfZW50cnkoZmlsZS0+ZXZlbnRfbGlzdC5uZXh0LAorCQkJCSAgICAgc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50LCBsaXN0KTsKKwkJZXZlbnRzeiA9IHNpemVvZiAoc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50X2Rlc2MpOworCX0KKworCWlmIChldmVudHN6ID4gY291bnQpIHsKKwkJcmV0ICAgPSAtRUlOVkFMOworCQlldmVudCA9IE5VTEw7CisJfSBlbHNlCisJCWxpc3RfZGVsKGZpbGUtPmV2ZW50X2xpc3QubmV4dCk7CisKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPmxvY2spOworCisJaWYgKGV2ZW50KSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBldmVudCwgZXZlbnRzeikpCisJCQlyZXQgPSAtRUZBVUxUOworCQllbHNlCisJCQlyZXQgPSBldmVudHN6OworCX0KKworCWtmcmVlKGV2ZW50KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWJfdXZlcmJzX2V2ZW50X3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJCSBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJdW5zaWduZWQgaW50IHBvbGxmbGFncyA9IDA7CisJc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbHAsICZmaWxlLT5wb2xsX3dhaXQsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+bG9jayk7CisJaWYgKGZpbGUtPmZkIDwgMCkKKwkJcG9sbGZsYWdzID0gUE9MTEVSUjsKKwllbHNlIGlmICghbGlzdF9lbXB0eSgmZmlsZS0+ZXZlbnRfbGlzdCkpCisJCXBvbGxmbGFncyA9IFBPTExJTiB8IFBPTExSRE5PUk07CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT5sb2NrKTsKKworCXJldHVybiBwb2xsZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkIGliX3V2ZXJic19ldmVudF9yZWxlYXNlKHN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPmxvY2spOworCWlmIChmaWxlLT5mZCAhPSAtMSkgeworCQlmaWxlLT5mZCA9IC0xOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmZpbGUtPmV2ZW50X2xpc3QpCisJCQlpZiAoZmlsZS0+aXNfYXN5bmMpCisJCQkJa2ZyZWUobGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudCwgbGlzdCkpOworCQkJZWxzZQorCQkJCWtmcmVlKGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudCwgbGlzdCkpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPmxvY2spOworfQorCitzdGF0aWMgaW50IGliX3V2ZXJic19ldmVudF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlpYl91dmVyYnNfZXZlbnRfcmVsZWFzZShmaWxlKTsKKwlrcmVmX3B1dCgmZmlsZS0+dXZlcmJzX2ZpbGUtPnJlZiwgaWJfdXZlcmJzX3JlbGVhc2VfZmlsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXZlcmJzX2V2ZW50X2ZvcHMgPSB7CisJLyoKKwkgKiBObyAub3duZXIgZmllbGQgc2luY2Ugd2UgYXJ0aWZpY2lhbGx5IGNyZWF0ZSBldmVudCBmaWxlcywKKwkgKiBzbyB0aGVyZSBpcyBubyBpbmNyZW1lbnQgdG8gdGhlIG1vZHVsZSByZWZlcmVuY2UgY291bnQgaW4KKwkgKiB0aGUgb3BlbiBwYXRoLiAgQWxsIGV2ZW50IGZpbGVzIGNvbWUgZnJvbSBhIHV2ZXJicyBjb21tYW5kCisJICogZmlsZSwgd2hpY2ggYWxyZWFkeSB0YWtlcyBhIG1vZHVsZSByZWZlcmVuY2UsIHNvIHRoaXMgaXMgT0suCisJICovCisJLnJlYWQgCSA9IGliX3V2ZXJic19ldmVudF9yZWFkLAorCS5wb2xsICAgID0gaWJfdXZlcmJzX2V2ZW50X3BvbGwsCisJLnJlbGVhc2UgPSBpYl91dmVyYnNfZXZlbnRfY2xvc2UKK307CisKK3ZvaWQgaWJfdXZlcmJzX2NvbXBfaGFuZGxlcihzdHJ1Y3QgaWJfY3EgKmNxLCB2b2lkICpjcV9jb250ZXh0KQoreworCXN0cnVjdCBpYl91dmVyYnNfZmlsZSAgICAgICAqZmlsZSA9IGNxX2NvbnRleHQ7CisJc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGZsYWdzOworCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZiAqZW50cnksIEdGUF9BVE9NSUMpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWVudHJ5LT5kZXNjLmNxX2hhbmRsZSA9IGNxLT51b2JqZWN0LT51c2VyX2hhbmRsZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmaWxlLT5jb21wX2ZpbGVbMF0ubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmZmlsZS0+Y29tcF9maWxlWzBdLmV2ZW50X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbGUtPmNvbXBfZmlsZVswXS5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZpbGUtPmNvbXBfZmlsZVswXS5wb2xsX3dhaXQpOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfYXN5bmNfaGFuZGxlcihzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkJICAgIF9fdTY0IGVsZW1lbnQsIF9fdTY0IGV2ZW50KQoreworCXN0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnQgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbnRyeSA9IGttYWxsb2Moc2l6ZW9mICplbnRyeSwgR0ZQX0FUT01JQyk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuOworCisJZW50cnktPmRlc2MuZWxlbWVudCAgICA9IGVsZW1lbnQ7CisJZW50cnktPmRlc2MuZXZlbnRfdHlwZSA9IGV2ZW50OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbGUtPmFzeW5jX2ZpbGUubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmZmlsZS0+YXN5bmNfZmlsZS5ldmVudF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWxlLT5hc3luY19maWxlLmxvY2ssIGZsYWdzKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZmlsZS0+YXN5bmNfZmlsZS5wb2xsX3dhaXQpOworfQorCit2b2lkIGliX3V2ZXJic19jcV9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKQoreworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGNvbnRleHRfcHRyLAorCQkJCWV2ZW50LT5lbGVtZW50LmNxLT51b2JqZWN0LT51c2VyX2hhbmRsZSwKKwkJCQlldmVudC0+ZXZlbnQpOworfQorCit2b2lkIGliX3V2ZXJic19xcF9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKQoreworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGNvbnRleHRfcHRyLAorCQkJCWV2ZW50LT5lbGVtZW50LnFwLT51b2JqZWN0LT51c2VyX2hhbmRsZSwKKwkJCQlldmVudC0+ZXZlbnQpOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKwkJCQkgICAgc3RydWN0IGliX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUgPQorCQljb250YWluZXJfb2YoaGFuZGxlciwgc3RydWN0IGliX3V2ZXJic19maWxlLCBldmVudF9oYW5kbGVyKTsKKworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGZpbGUsIGV2ZW50LT5lbGVtZW50LnBvcnRfbnVtLCBldmVudC0+ZXZlbnQpOworfQorCitzdGF0aWMgaW50IGliX3V2ZXJic19ldmVudF9pbml0KHN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKnV2ZXJic19maWxlKQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCisJc3Bpbl9sb2NrX2luaXQoJmZpbGUtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT5ldmVudF9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmaWxlLT5wb2xsX3dhaXQpOworCWZpbGUtPnV2ZXJic19maWxlID0gdXZlcmJzX2ZpbGU7CisKKwlmaWxlLT5mZCA9IGdldF91bnVzZWRfZmQoKTsKKwlpZiAoZmlsZS0+ZmQgPCAwKQorCQlyZXR1cm4gZmlsZS0+ZmQ7CisKKwlmaWxwID0gZ2V0X2VtcHR5X2ZpbHAoKTsKKwlpZiAoIWZpbHApIHsKKwkJcHV0X3VudXNlZF9mZChmaWxlLT5mZCk7CisJCXJldHVybiAtRU5GSUxFOworCX0KKworCWZpbHAtPmZfb3AgCSAgID0gJnV2ZXJic19ldmVudF9mb3BzOworCWZpbHAtPmZfdmZzbW50IAkgICA9IG1udGdldCh1dmVyYnNfZXZlbnRfbW50KTsKKwlmaWxwLT5mX2RlbnRyeSAJICAgPSBkZ2V0KHV2ZXJic19ldmVudF9tbnQtPm1udF9yb290KTsKKwlmaWxwLT5mX21hcHBpbmcgICAgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWZpbHAtPmZfZmxhZ3MgICAgICA9IE9fUkRPTkxZOworCWZpbHAtPmZfbW9kZSAgICAgICA9IEZNT0RFX1JFQUQ7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZmlsZTsKKworCWZkX2luc3RhbGwoZmlsZS0+ZmQsIGZpbHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGliX3V2ZXJic193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGliX3V2ZXJic19jbWRfaGRyIGhkcjsKKworCWlmIChjb3VudCA8IHNpemVvZiBoZHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsIGJ1Ziwgc2l6ZW9mIGhkcikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGhkci5pbl93b3JkcyAqIDQgIT0gY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhkci5jb21tYW5kIDwgMCB8fCBoZHIuY29tbWFuZCA+PSBBUlJBWV9TSVpFKHV2ZXJic19jbWRfdGFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZmlsZS0+dWNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKwkgICAgaGRyLmNvbW1hbmQgIT0gSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUEFSQU1TICYmCisJICAgIGhkci5jb21tYW5kICE9IElCX1VTRVJfVkVSQlNfQ01EX0dFVF9DT05URVhUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB1dmVyYnNfY21kX3RhYmxlW2hkci5jb21tYW5kXShmaWxlLCBidWYgKyBzaXplb2YgaGRyLAorCQkJCQkgICAgIGhkci5pbl93b3JkcyAqIDQsIGhkci5vdXRfd29yZHMgKiA0KTsKK30KKworc3RhdGljIGludCBpYl91dmVyYnNfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFmaWxlLT51Y29udGV4dCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZQorCQlyZXR1cm4gZmlsZS0+ZGV2aWNlLT5pYl9kZXYtPm1tYXAoZmlsZS0+dWNvbnRleHQsIHZtYSk7Cit9CisKK3N0YXRpYyBpbnQgaWJfdXZlcmJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKmRldiA9CisJCWNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LCBzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSwgZGV2KTsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGU7CisJaW50IGkgPSAwOworCWludCByZXQ7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+aWJfZGV2LT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJZmlsZSA9IGttYWxsb2Moc2l6ZW9mICpmaWxlICsKKwkJICAgICAgIChkZXYtPm51bV9jb21wIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSksCisJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiAtRU5PTUVNOworCisJZmlsZS0+ZGV2aWNlID0gZGV2OworCWtyZWZfaW5pdCgmZmlsZS0+cmVmKTsKKworCWZpbGUtPnVjb250ZXh0ID0gTlVMTDsKKworCXJldCA9IGliX3V2ZXJic19ldmVudF9pbml0KCZmaWxlLT5hc3luY19maWxlLCBmaWxlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWZpbGUtPmFzeW5jX2ZpbGUuaXNfYXN5bmMgPSAxOworCisJa3JlZl9nZXQoJmZpbGUtPnJlZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fY29tcDsgKytpKSB7CisJCXJldCA9IGliX3V2ZXJic19ldmVudF9pbml0KCZmaWxlLT5jb21wX2ZpbGVbaV0sIGZpbGUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfYXN5bmM7CisJCWtyZWZfZ2V0KCZmaWxlLT5yZWYpOworCQlmaWxlLT5jb21wX2ZpbGVbaV0uaXNfYXN5bmMgPSAwOworCX0KKworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZmlsZTsKKworCUlOSVRfSUJfRVZFTlRfSEFORExFUigmZmlsZS0+ZXZlbnRfaGFuZGxlciwgZGV2LT5pYl9kZXYsCisJCQkgICAgICBpYl91dmVyYnNfZXZlbnRfaGFuZGxlcik7CisJaWYgKGliX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIoJmZpbGUtPmV2ZW50X2hhbmRsZXIpKQorCQlnb3RvIGVycl9hc3luYzsKKworCXJldHVybiAwOworCitlcnJfYXN5bmM6CisJd2hpbGUgKGktLSkKKwkJaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2UoJmZpbGUtPmNvbXBfZmlsZVtpXSk7CisKKwlpYl91dmVyYnNfZXZlbnRfcmVsZWFzZSgmZmlsZS0+YXN5bmNfZmlsZSk7CisKK2VycjoKKwlrcmVmX3B1dCgmZmlsZS0+cmVmLCBpYl91dmVyYnNfcmVsZWFzZV9maWxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaWJfdXZlcmJzX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworCWliX3VucmVnaXN0ZXJfZXZlbnRfaGFuZGxlcigmZmlsZS0+ZXZlbnRfaGFuZGxlcik7CisJaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2UoJmZpbGUtPmFzeW5jX2ZpbGUpOworCWliX2RlYWxsb2NfdWNvbnRleHQoZmlsZS0+dWNvbnRleHQpOworCisJZm9yIChpID0gMDsgaSA8IGZpbGUtPmRldmljZS0+bnVtX2NvbXA7ICsraSkKKwkJaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2UoJmZpbGUtPmNvbXBfZmlsZVtpXSk7CisKKwlrcmVmX3B1dCgmZmlsZS0+cmVmLCBpYl91dmVyYnNfcmVsZWFzZV9maWxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1dmVyYnNfZm9wcyA9IHsKKwkub3duZXIgCSA9IFRISVNfTU9EVUxFLAorCS53cml0ZSAJID0gaWJfdXZlcmJzX3dyaXRlLAorCS5vcGVuIAkgPSBpYl91dmVyYnNfb3BlbiwKKwkucmVsZWFzZSA9IGliX3V2ZXJic19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXZlcmJzX21tYXBfZm9wcyA9IHsKKwkub3duZXIgCSA9IFRISVNfTU9EVUxFLAorCS53cml0ZSAJID0gaWJfdXZlcmJzX3dyaXRlLAorCS5tbWFwICAgID0gaWJfdXZlcmJzX21tYXAsCisJLm9wZW4gCSA9IGliX3V2ZXJic19vcGVuLAorCS5yZWxlYXNlID0gaWJfdXZlcmJzX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGliX2NsaWVudCB1dmVyYnNfY2xpZW50ID0geworCS5uYW1lICAgPSAidXZlcmJzIiwKKwkuYWRkICAgID0gaWJfdXZlcmJzX2FkZF9vbmUsCisJLnJlbW92ZSA9IGliX3V2ZXJic19yZW1vdmVfb25lCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X2liZGV2KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICpkZXYgPQorCQljb250YWluZXJfb2YoY2xhc3NfZGV2LCBzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSwgY2xhc3NfZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBkZXYtPmliX2Rldi0+bmFtZSk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoaWJkZXYsIFNfSVJVR08sIHNob3dfaWJkZXYsIE5VTEwpOworCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfcmVsZWFzZV9jbGFzc19kZXYoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICpkZXYgPQorCQljb250YWluZXJfb2YoY2xhc3NfZGV2LCBzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSwgY2xhc3NfZGV2KTsKKworCWNkZXZfZGVsKCZkZXYtPmRldik7CisJY2xlYXJfYml0KGRldi0+ZGV2bnVtLCBkZXZfbWFwKTsKKwlrZnJlZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIHV2ZXJic19jbGFzcyA9IHsKKwkubmFtZSAgICA9ICJpbmZpbmliYW5kX3ZlcmJzIiwKKwkucmVsZWFzZSA9IGliX3V2ZXJic19yZWxlYXNlX2NsYXNzX2RldgorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hYmlfdmVyc2lvbihzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElCX1VTRVJfVkVSQlNfQUJJX1ZFUlNJT04pOworfQorc3RhdGljIENMQVNTX0FUVFIoYWJpX3ZlcnNpb24sIFNfSVJVR08sIHNob3dfYWJpX3ZlcnNpb24sIE5VTEwpOworCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfYWRkX29uZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKnV2ZXJic19kZXY7CisKKwlpZiAoIWRldmljZS0+YWxsb2NfdWNvbnRleHQpCisJCXJldHVybjsKKworCXV2ZXJic19kZXYgPSBrbWFsbG9jKHNpemVvZiAqdXZlcmJzX2RldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1dmVyYnNfZGV2KQorCQlyZXR1cm47CisKKwltZW1zZXQodXZlcmJzX2RldiwgMCwgc2l6ZW9mICp1dmVyYnNfZGV2KTsKKworCXNwaW5fbG9jaygmbWFwX2xvY2spOworCXV2ZXJic19kZXYtPmRldm51bSA9IGZpbmRfZmlyc3RfemVyb19iaXQoZGV2X21hcCwgSUJfVVZFUkJTX01BWF9ERVZJQ0VTKTsKKwlpZiAodXZlcmJzX2Rldi0+ZGV2bnVtID49IElCX1VWRVJCU19NQVhfREVWSUNFUykgeworCQlzcGluX3VubG9jaygmbWFwX2xvY2spOworCQlnb3RvIGVycjsKKwl9CisJc2V0X2JpdCh1dmVyYnNfZGV2LT5kZXZudW0sIGRldl9tYXApOworCXNwaW5fdW5sb2NrKCZtYXBfbG9jayk7CisKKwl1dmVyYnNfZGV2LT5pYl9kZXYgICA9IGRldmljZTsKKwl1dmVyYnNfZGV2LT5udW1fY29tcCA9IDE7CisKKwlpZiAoZGV2aWNlLT5tbWFwKQorCQljZGV2X2luaXQoJnV2ZXJic19kZXYtPmRldiwgJnV2ZXJic19tbWFwX2ZvcHMpOworCWVsc2UKKwkJY2Rldl9pbml0KCZ1dmVyYnNfZGV2LT5kZXYsICZ1dmVyYnNfZm9wcyk7CisJdXZlcmJzX2Rldi0+ZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CisJa29iamVjdF9zZXRfbmFtZSgmdXZlcmJzX2Rldi0+ZGV2LmtvYmosICJ1dmVyYnMlZCIsIHV2ZXJic19kZXYtPmRldm51bSk7CisJaWYgKGNkZXZfYWRkKCZ1dmVyYnNfZGV2LT5kZXYsIElCX1VWRVJCU19CQVNFX0RFViArIHV2ZXJic19kZXYtPmRldm51bSwgMSkpCisJCWdvdG8gZXJyOworCisJdXZlcmJzX2Rldi0+Y2xhc3NfZGV2LmNsYXNzID0gJnV2ZXJic19jbGFzczsKKwl1dmVyYnNfZGV2LT5jbGFzc19kZXYuZGV2ICAgPSBkZXZpY2UtPmRtYV9kZXZpY2U7CisJdXZlcmJzX2Rldi0+Y2xhc3NfZGV2LmRldnQgID0gdXZlcmJzX2Rldi0+ZGV2LmRldjsKKwlzbnByaW50Zih1dmVyYnNfZGV2LT5jbGFzc19kZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLCAidXZlcmJzJWQiLCB1dmVyYnNfZGV2LT5kZXZudW0pOworCWlmIChjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJnV2ZXJic19kZXYtPmNsYXNzX2RldikpCisJCWdvdG8gZXJyX2NkZXY7CisKKwlpZiAoY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZ1dmVyYnNfZGV2LT5jbGFzc19kZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pYmRldikpCisJCWdvdG8gZXJyX2NsYXNzOworCisJaWJfc2V0X2NsaWVudF9kYXRhKGRldmljZSwgJnV2ZXJic19jbGllbnQsIHV2ZXJic19kZXYpOworCisJcmV0dXJuOworCitlcnJfY2xhc3M6CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnV2ZXJic19kZXYtPmNsYXNzX2Rldik7CisKK2Vycl9jZGV2OgorCWNkZXZfZGVsKCZ1dmVyYnNfZGV2LT5kZXYpOworCWNsZWFyX2JpdCh1dmVyYnNfZGV2LT5kZXZudW0sIGRldl9tYXApOworCitlcnI6CisJa2ZyZWUodXZlcmJzX2Rldik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfcmVtb3ZlX29uZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKnV2ZXJic19kZXYgPSBpYl9nZXRfY2xpZW50X2RhdGEoZGV2aWNlLCAmdXZlcmJzX2NsaWVudCk7CisKKwlpZiAoIXV2ZXJic19kZXYpCisJCXJldHVybjsKKworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZ1dmVyYnNfZGV2LT5jbGFzc19kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICp1dmVyYnNfZXZlbnRfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiaW5maW5pYmFuZGV2ZW50OiIsIE5VTEwsCisJCQkgICAgIElORklOSUJBTkRFVkVOVEZTX01BR0lDKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHV2ZXJic19ldmVudF9mcyA9IHsKKwkvKiBObyBvd25lciBmaWVsZCBzbyBtb2R1bGUgY2FuIGJlIHVubG9hZGVkICovCisJLm5hbWUgICAgPSAiaW5maW5pYmFuZGV2ZW50ZnMiLAorCS5nZXRfc2IgID0gdXZlcmJzX2V2ZW50X2dldF9zYiwKKwkua2lsbF9zYiA9IGtpbGxfbGl0dGVyX3N1cGVyCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpYl91dmVyYnNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmbWFwX2xvY2spOworCisJcmV0ID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihJQl9VVkVSQlNfQkFTRV9ERVYsIElCX1VWRVJCU19NQVhfREVWSUNFUywKKwkJCQkgICAgICJpbmZpbmliYW5kX3ZlcmJzIik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgInVzZXJfdmVyYnM6IGNvdWxkbid0IHJlZ2lzdGVyIGRldmljZSBudW1iZXJcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBjbGFzc19yZWdpc3RlcigmdXZlcmJzX2NsYXNzKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNlcl92ZXJiczogY291bGRuJ3QgY3JlYXRlIGNsYXNzIGluZmluaWJhbmRfdmVyYnNcbiIpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCisJcmV0ID0gY2xhc3NfY3JlYXRlX2ZpbGUoJnV2ZXJic19jbGFzcywgJmNsYXNzX2F0dHJfYWJpX3ZlcnNpb24pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1c2VyX3ZlcmJzOiBjb3VsZG4ndCBjcmVhdGUgYWJpX3ZlcnNpb24gYXR0cmlidXRlXG4iKTsKKwkJZ290byBvdXRfY2xhc3M7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdXZlcmJzX2V2ZW50X2ZzKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNlcl92ZXJiczogY291bGRuJ3QgcmVnaXN0ZXIgaW5maW5pYmFuZGV2ZW50ZnNcbiIpOworCQlnb3RvIG91dF9jbGFzczsKKwl9CisKKwl1dmVyYnNfZXZlbnRfbW50ID0ga2Vybl9tb3VudCgmdXZlcmJzX2V2ZW50X2ZzKTsKKwlpZiAoSVNfRVJSKHV2ZXJic19ldmVudF9tbnQpKSB7CisJCXJldCA9IFBUUl9FUlIodXZlcmJzX2V2ZW50X21udCk7CisJCXByaW50ayhLRVJOX0VSUiAidXNlcl92ZXJiczogY291bGRuJ3QgbW91bnQgaW5maW5pYmFuZGV2ZW50ZnNcbiIpOworCQlnb3RvIG91dF9mczsKKwl9CisKKwlyZXQgPSBpYl9yZWdpc3Rlcl9jbGllbnQoJnV2ZXJic19jbGllbnQpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1c2VyX3ZlcmJzOiBjb3VsZG4ndCByZWdpc3RlciBjbGllbnRcbiIpOworCQlnb3RvIG91dF9tbnQ7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9tbnQ6CisJbW50cHV0KHV2ZXJic19ldmVudF9tbnQpOworCitvdXRfZnM6CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ1dmVyYnNfZXZlbnRfZnMpOworCitvdXRfY2xhc3M6CisJY2xhc3NfdW5yZWdpc3RlcigmdXZlcmJzX2NsYXNzKTsKKworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oSUJfVVZFUkJTX0JBU0VfREVWLCBJQl9VVkVSQlNfTUFYX0RFVklDRVMpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGliX3V2ZXJic19jbGVhbnVwKHZvaWQpCit7CisJaWJfdW5yZWdpc3Rlcl9jbGllbnQoJnV2ZXJic19jbGllbnQpOworCW1udHB1dCh1dmVyYnNfZXZlbnRfbW50KTsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnV2ZXJic19ldmVudF9mcyk7CisJY2xhc3NfdW5yZWdpc3RlcigmdXZlcmJzX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oSUJfVVZFUkJTX0JBU0VfREVWLCBJQl9VVkVSQlNfTUFYX0RFVklDRVMpOworfQorCittb2R1bGVfaW5pdChpYl91dmVyYnNfaW5pdCk7Cittb2R1bGVfZXhpdChpYl91dmVyYnNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWVtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1NTBmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tZW0uYwpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogdXZlcmJzX21lbS5jIDI3NDMgMjAwNS0wNi0yOCAyMjoyNzo1OVogcm9sYW5kICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidXZlcmJzLmgiCisKK3N0cnVjdCBpYl91bWVtX2FjY291bnRfd29yayB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IG1tX3N0cnVjdCAgKm1tOworCXVuc2lnbmVkIGxvbmcgICAgICBkaWZmOworfTsKKworCitzdGF0aWMgdm9pZCBfX2liX3VtZW1fcmVsZWFzZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsIHN0cnVjdCBpYl91bWVtICp1bWVtLCBpbnQgZGlydHkpCit7CisJc3RydWN0IGliX3VtZW1fY2h1bmsgKmNodW5rLCAqdG1wOworCWludCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZ1bWVtLT5jaHVua19saXN0LCBsaXN0KSB7CisJCWRtYV91bm1hcF9zZyhkZXYtPmRtYV9kZXZpY2UsIGNodW5rLT5wYWdlX2xpc3QsCisJCQkgICAgIGNodW5rLT5uZW50cywgRE1BX0JJRElSRUNUSU9OQUwpOworCQlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5lbnRzOyArK2kpIHsKKwkJCWlmICh1bWVtLT53cml0YWJsZSAmJiBkaXJ0eSkKKwkJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKGNodW5rLT5wYWdlX2xpc3RbaV0ucGFnZSk7CisJCQlwdXRfcGFnZShjaHVuay0+cGFnZV9saXN0W2ldLnBhZ2UpOworCQl9CisKKwkJa2ZyZWUoY2h1bmspOworCX0KK30KKworaW50IGliX3VtZW1fZ2V0KHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKm1lbSwKKwkJdm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIGludCB3cml0ZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VfbGlzdDsKKwlzdHJ1Y3QgaWJfdW1lbV9jaHVuayAqY2h1bms7CisJdW5zaWduZWQgbG9uZyBsb2NrZWQ7CisJdW5zaWduZWQgbG9uZyBsb2NrX2xpbWl0OworCXVuc2lnbmVkIGxvbmcgY3VyX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBucGFnZXM7CisJaW50IHJldCA9IDA7CisJaW50IG9mZjsKKwlpbnQgaTsKKworCWlmICghY2FuX2RvX21sb2NrKCkpCisJCXJldHVybiAtRVBFUk07CisKKwlwYWdlX2xpc3QgPSAoc3RydWN0IHBhZ2UgKiopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2VfbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW0tPnVzZXJfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOworCW1lbS0+bGVuZ3RoICAgID0gc2l6ZTsKKwltZW0tPm9mZnNldCAgICA9ICh1bnNpZ25lZCBsb25nKSBhZGRyICYgflBBR0VfTUFTSzsKKwltZW0tPnBhZ2Vfc2l6ZSA9IFBBR0VfU0laRTsKKwltZW0tPndyaXRhYmxlICA9IHdyaXRlOworCisJSU5JVF9MSVNUX0hFQUQoJm1lbS0+Y2h1bmtfbGlzdCk7CisKKwlucGFnZXMgPSBQQUdFX0FMSUdOKHNpemUgKyBtZW0tPm9mZnNldCkgPj4gUEFHRV9TSElGVDsKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwlsb2NrZWQgICAgID0gbnBhZ2VzICsgY3VycmVudC0+bW0tPmxvY2tlZF92bTsKKwlsb2NrX2xpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1ciA+PiBQQUdFX1NISUZUOworCisJaWYgKChsb2NrZWQgPiBsb2NrX2xpbWl0KSAmJiAhY2FwYWJsZShDQVBfSVBDX0xPQ0spKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWN1cl9iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGFkZHIgJiBQQUdFX01BU0s7CisKKwl3aGlsZSAobnBhZ2VzKSB7CisJCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCBjdXJfYmFzZSwKKwkJCQkgICAgIG1pbl90KGludCwgbnBhZ2VzLAorCQkJCQkgICBQQUdFX1NJWkUgLyBzaXplb2YgKHN0cnVjdCBwYWdlICopKSwKKwkJCQkgICAgIDEsICF3cml0ZSwgcGFnZV9saXN0LCBOVUxMKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWN1cl9iYXNlICs9IHJldCAqIFBBR0VfU0laRTsKKwkJbnBhZ2VzICAgLT0gcmV0OworCisJCW9mZiA9IDA7CisKKwkJd2hpbGUgKHJldCkgeworCQkJY2h1bmsgPSBrbWFsbG9jKHNpemVvZiAqY2h1bmsgKyBzaXplb2YgKHN0cnVjdCBzY2F0dGVybGlzdCkgKgorCQkJCQltaW5fdChpbnQsIHJldCwgSUJfVU1FTV9NQVhfUEFHRV9DSFVOSyksCisJCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKCFjaHVuaykgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWNodW5rLT5uZW50cyA9IG1pbl90KGludCwgcmV0LCBJQl9VTUVNX01BWF9QQUdFX0NIVU5LKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bmVudHM7ICsraSkgeworCQkJCWNodW5rLT5wYWdlX2xpc3RbaV0ucGFnZSAgID0gcGFnZV9saXN0W2kgKyBvZmZdOworCQkJCWNodW5rLT5wYWdlX2xpc3RbaV0ub2Zmc2V0ID0gMDsKKwkJCQljaHVuay0+cGFnZV9saXN0W2ldLmxlbmd0aCA9IFBBR0VfU0laRTsKKwkJCX0KKworCQkJY2h1bmstPm5tYXAgPSBkbWFfbWFwX3NnKGRldi0+ZG1hX2RldmljZSwKKwkJCQkJCSAmY2h1bmstPnBhZ2VfbGlzdFswXSwKKwkJCQkJCSBjaHVuay0+bmVudHMsCisJCQkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCQkJaWYgKGNodW5rLT5ubWFwIDw9IDApIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5lbnRzOyArK2kpCisJCQkJCXB1dF9wYWdlKGNodW5rLT5wYWdlX2xpc3RbaV0ucGFnZSk7CisJCQkJa2ZyZWUoY2h1bmspOworCisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcmV0IC09IGNodW5rLT5uZW50czsKKwkJCW9mZiArPSBjaHVuay0+bmVudHM7CisJCQlsaXN0X2FkZF90YWlsKCZjaHVuay0+bGlzdCwgJm1lbS0+Y2h1bmtfbGlzdCk7CisJCX0KKworCQlyZXQgPSAwOworCX0KKworb3V0OgorCWlmIChyZXQgPCAwKQorCQlfX2liX3VtZW1fcmVsZWFzZShkZXYsIG1lbSwgMCk7CisJZWxzZQorCQljdXJyZW50LT5tbS0+bG9ja2VkX3ZtID0gbG9ja2VkOworCisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX2xpc3QpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpYl91bWVtX3JlbGVhc2Uoc3RydWN0IGliX2RldmljZSAqZGV2LCBzdHJ1Y3QgaWJfdW1lbSAqdW1lbSkKK3sKKwlfX2liX3VtZW1fcmVsZWFzZShkZXYsIHVtZW0sIDEpOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwljdXJyZW50LT5tbS0+bG9ja2VkX3ZtIC09CisJCVBBR0VfQUxJR04odW1lbS0+bGVuZ3RoICsgdW1lbS0+b2Zmc2V0KSA+PiBQQUdFX1NISUZUOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworfQorCitzdGF0aWMgdm9pZCBpYl91bWVtX2FjY291bnQodm9pZCAqd29ya19wdHIpCit7CisJc3RydWN0IGliX3VtZW1fYWNjb3VudF93b3JrICp3b3JrID0gd29ya19wdHI7CisKKwlkb3duX3dyaXRlKCZ3b3JrLT5tbS0+bW1hcF9zZW0pOworCXdvcmstPm1tLT5sb2NrZWRfdm0gLT0gd29yay0+ZGlmZjsKKwl1cF93cml0ZSgmd29yay0+bW0tPm1tYXBfc2VtKTsKKwltbXB1dCh3b3JrLT5tbSk7CisJa2ZyZWUod29yayk7Cit9CisKK3ZvaWQgaWJfdW1lbV9yZWxlYXNlX29uX2Nsb3NlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKnVtZW0pCit7CisJc3RydWN0IGliX3VtZW1fYWNjb3VudF93b3JrICp3b3JrOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJX19pYl91bWVtX3JlbGVhc2UoZGV2LCB1bWVtLCAxKTsKKworCW1tID0gZ2V0X3Rhc2tfbW0oY3VycmVudCk7CisJaWYgKCFtbSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIG1tJ3MgbW1hcF9zZW0gYWxyZWFkeSBoZWxkLiAgVGhpcworCSAqIGNhbiBoYXBwZW4gd2hlbiBhIHVzZXJzcGFjZSBtdW5tYXAoKSBpcyB0aGUgY2FsbCB0aGF0IGRyb3BzCisJICogdGhlIGxhc3QgcmVmZXJlbmNlIHRvIG91ciBmaWxlIGFuZCBjYWxscyBvdXIgcmVsZWFzZQorCSAqIG1ldGhvZC4gIElmIHRoZXJlIGFyZSBtZW1vcnkgcmVnaW9ucyB0byBkZXN0cm95LCB3ZSdsbCBlbmQKKwkgKiB1cCBoZXJlIGFuZCBub3QgYmUgYWJsZSB0byB0YWtlIHRoZSBtbWFwX3NlbS4gIFRoZXJlZm9yZSB3ZQorCSAqIGRlZmVyIHRoZSB2bV9sb2NrZWQgYWNjb3VudGluZyB0byB0aGUgc3lzdGVtIHdvcmtxdWV1ZS4KKwkgKi8KKworCXdvcmsgPSBrbWFsbG9jKHNpemVvZiAqd29yaywgR0ZQX0tFUk5FTCk7CisJaWYgKCF3b3JrKQorCQlyZXR1cm47CisKKwlJTklUX1dPUksoJndvcmstPndvcmssIGliX3VtZW1fYWNjb3VudCwgd29yayk7CisJd29yay0+bW0gICA9IG1tOworCXdvcmstPmRpZmYgPSBQQUdFX0FMSUdOKHVtZW0tPmxlbmd0aCArIHVtZW0tPm9mZnNldCkgPj4gUEFHRV9TSElGVDsKKworCXNjaGVkdWxlX3dvcmsoJndvcmstPndvcmspOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3ZlcmJzLmMKaW5kZXggN2MwOGVkMC4uMjUxNmY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS92ZXJicy5jCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBWb2x0YWlyZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQ3LDEwICs0OCwxMSBAQAogewogCXN0cnVjdCBpYl9wZCAqcGQ7CiAKLQlwZCA9IGRldmljZS0+YWxsb2NfcGQoZGV2aWNlKTsKKwlwZCA9IGRldmljZS0+YWxsb2NfcGQoZGV2aWNlLCBOVUxMLCBOVUxMKTsKIAogCWlmICghSVNfRVJSKHBkKSkgewotCQlwZC0+ZGV2aWNlID0gZGV2aWNlOworCQlwZC0+ZGV2aWNlICA9IGRldmljZTsKKwkJcGQtPnVvYmplY3QgPSBOVUxMOwogCQlhdG9taWNfc2V0KCZwZC0+dXNlY250LCAwKTsKIAl9CiAKQEAgLTc2LDggKzc4LDkgQEAKIAlhaCA9IHBkLT5kZXZpY2UtPmNyZWF0ZV9haChwZCwgYWhfYXR0cik7CiAKIAlpZiAoIUlTX0VSUihhaCkpIHsKLQkJYWgtPmRldmljZSA9IHBkLT5kZXZpY2U7Ci0JCWFoLT5wZCAgICAgPSBwZDsKKwkJYWgtPmRldmljZSAgPSBwZC0+ZGV2aWNlOworCQlhaC0+cGQgICAgICA9IHBkOworCQlhaC0+dW9iamVjdCA9IE5VTEw7CiAJCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOwogCX0KIApAQCAtMTIyLDcgKzEyNSw3IEBACiB7CiAJc3RydWN0IGliX3FwICpxcDsKIAotCXFwID0gcGQtPmRldmljZS0+Y3JlYXRlX3FwKHBkLCBxcF9pbml0X2F0dHIpOworCXFwID0gcGQtPmRldmljZS0+Y3JlYXRlX3FwKHBkLCBxcF9pbml0X2F0dHIsIE5VTEwpOwogCiAJaWYgKCFJU19FUlIocXApKSB7CiAJCXFwLT5kZXZpY2UgICAgIAkgID0gcGQtPmRldmljZTsKQEAgLTEzMCw2ICsxMzMsNyBAQAogCQlxcC0+c2VuZF9jcSAgICAJICA9IHFwX2luaXRfYXR0ci0+c2VuZF9jcTsKIAkJcXAtPnJlY3ZfY3EgICAgCSAgPSBxcF9pbml0X2F0dHItPnJlY3ZfY3E7CiAJCXFwLT5zcnEJICAgICAgIAkgID0gcXBfaW5pdF9hdHRyLT5zcnE7CisJCXFwLT51b2JqZWN0ICAgICAgID0gTlVMTDsKIAkJcXAtPmV2ZW50X2hhbmRsZXIgPSBxcF9pbml0X2F0dHItPmV2ZW50X2hhbmRsZXI7CiAJCXFwLT5xcF9jb250ZXh0ICAgID0gcXBfaW5pdF9hdHRyLT5xcF9jb250ZXh0OwogCQlxcC0+cXBfdHlwZQkgID0gcXBfaW5pdF9hdHRyLT5xcF90eXBlOwpAQCAtMTk3LDEwICsyMDEsMTEgQEAKIHsKIAlzdHJ1Y3QgaWJfY3EgKmNxOwogCi0JY3EgPSBkZXZpY2UtPmNyZWF0ZV9jcShkZXZpY2UsIGNxZSk7CisJY3EgPSBkZXZpY2UtPmNyZWF0ZV9jcShkZXZpY2UsIGNxZSwgTlVMTCwgTlVMTCk7CiAKIAlpZiAoIUlTX0VSUihjcSkpIHsKIAkJY3EtPmRldmljZSAgICAgICAgPSBkZXZpY2U7CisJCWNxLT51b2JqZWN0ICAgICAgID0gTlVMTDsKIAkJY3EtPmNvbXBfaGFuZGxlciAgPSBjb21wX2hhbmRsZXI7CiAJCWNxLT5ldmVudF9oYW5kbGVyID0gZXZlbnRfaGFuZGxlcjsKIAkJY3EtPmNxX2NvbnRleHQgICAgPSBjcV9jb250ZXh0OwpAQCAtMjQ1LDggKzI1MCw5IEBACiAJbXIgPSBwZC0+ZGV2aWNlLT5nZXRfZG1hX21yKHBkLCBtcl9hY2Nlc3NfZmxhZ3MpOwogCiAJaWYgKCFJU19FUlIobXIpKSB7Ci0JCW1yLT5kZXZpY2UgPSBwZC0+ZGV2aWNlOwotCQltci0+cGQgICAgID0gcGQ7CisJCW1yLT5kZXZpY2UgID0gcGQtPmRldmljZTsKKwkJbXItPnBkICAgICAgPSBwZDsKKwkJbXItPnVvYmplY3QgPSBOVUxMOwogCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKIAkJYXRvbWljX3NldCgmbXItPnVzZWNudCwgMCk7CiAJfQpAQCAtMjY3LDggKzI3Myw5IEBACiAJCQkJICAgICBtcl9hY2Nlc3NfZmxhZ3MsIGlvdmFfc3RhcnQpOwogCiAJaWYgKCFJU19FUlIobXIpKSB7Ci0JCW1yLT5kZXZpY2UgPSBwZC0+ZGV2aWNlOwotCQltci0+cGQgICAgID0gcGQ7CisJCW1yLT5kZXZpY2UgID0gcGQtPmRldmljZTsKKwkJbXItPnBkICAgICAgPSBwZDsKKwkJbXItPnVvYmplY3QgPSBOVUxMOwogCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKIAkJYXRvbWljX3NldCgmbXItPnVzZWNudCwgMCk7CiAJfQpAQCAtMzQ0LDggKzM1MSw5IEBACiAKIAltdyA9IHBkLT5kZXZpY2UtPmFsbG9jX213KHBkKTsKIAlpZiAoIUlTX0VSUihtdykpIHsKLQkJbXctPmRldmljZSA9IHBkLT5kZXZpY2U7Ci0JCW13LT5wZCAgICAgPSBwZDsKKwkJbXctPmRldmljZSAgPSBwZC0+ZGV2aWNlOworCQltdy0+cGQgICAgICA9IHBkOworCQltdy0+dW9iamVjdCA9IE5VTEw7CiAJCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwppbmRleCA3NjZlOTAzMS4uYjVhZWE3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTc0Miw2ICs3NDMsNyBAQAogfQogCiBpbnQgbXRoY2FfaW5pdF9jcShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBuZW50LAorCQkgIHN0cnVjdCBtdGhjYV91Y29udGV4dCAqY3R4LCB1MzIgcGRuLAogCQkgIHN0cnVjdCBtdGhjYV9jcSAqY3EpCiB7CiAJaW50IHNpemUgPSBuZW50ICogTVRIQ0FfQ1FfRU5UUllfU0laRTsKQEAgLTc1MywzMCArNzU1LDMzIEBACiAKIAltaWdodF9zbGVlcCgpOwogCi0JY3EtPmliY3EuY3FlID0gbmVudCAtIDE7CisJY3EtPmliY3EuY3FlICA9IG5lbnQgLSAxOworCWNxLT5pc19rZXJuZWwgPSAhY3R4OwogCiAJY3EtPmNxbiA9IG10aGNhX2FsbG9jKCZkZXYtPmNxX3RhYmxlLmFsbG9jKTsKIAlpZiAoY3EtPmNxbiA9PSAtMSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7Ci0JCWNxLT5hcm1fc24gPSAxOwotCiAJCWVyciA9IG10aGNhX3RhYmxlX2dldChkZXYsIGRldi0+Y3FfdGFibGUudGFibGUsIGNxLT5jcW4pOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnJfb3V0OwogCi0JCWVyciA9IC1FTk9NRU07CisJCWlmIChjcS0+aXNfa2VybmVsKSB7CisJCQljcS0+YXJtX3NuID0gMTsKIAotCQljcS0+c2V0X2NpX2RiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX1NFVF9DSSwKLQkJCQkJCSAgICAgY3EtPmNxbiwgJmNxLT5zZXRfY2lfZGIpOwotCQlpZiAoY3EtPnNldF9jaV9kYl9pbmRleCA8IDApCi0JCQlnb3RvIGVycl9vdXRfaWNtOworCQkJZXJyID0gLUVOT01FTTsKIAotCQljcS0+YXJtX2RiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX0FSTSwKLQkJCQkJCSAgY3EtPmNxbiwgJmNxLT5hcm1fZGIpOwotCQlpZiAoY3EtPmFybV9kYl9pbmRleCA8IDApCi0JCQlnb3RvIGVycl9vdXRfY2k7CisJCQljcS0+c2V0X2NpX2RiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX1NFVF9DSSwKKwkJCQkJCQkgICAgIGNxLT5jcW4sICZjcS0+c2V0X2NpX2RiKTsKKwkJCWlmIChjcS0+c2V0X2NpX2RiX2luZGV4IDwgMCkKKwkJCQlnb3RvIGVycl9vdXRfaWNtOworCisJCQljcS0+YXJtX2RiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX0FSTSwKKwkJCQkJCQkgIGNxLT5jcW4sICZjcS0+YXJtX2RiKTsKKwkJCWlmIChjcS0+YXJtX2RiX2luZGV4IDwgMCkKKwkJCQlnb3RvIGVycl9vdXRfY2k7CisJCX0KIAl9CiAKIAltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOwpAQCAtNzg1LDEyICs3OTAsMTQgQEAKIAogCWNxX2NvbnRleHQgPSBtYWlsYm94LT5idWY7CiAKLQllcnIgPSBtdGhjYV9hbGxvY19jcV9idWYoZGV2LCBzaXplLCBjcSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X21haWxib3g7CisJaWYgKGNxLT5pc19rZXJuZWwpIHsKKwkJZXJyID0gbXRoY2FfYWxsb2NfY3FfYnVmKGRldiwgc2l6ZSwgY3EpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0X21haWxib3g7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbmVudDsgKytpKQotCQlzZXRfY3FlX2h3KGdldF9jcWUoY3EsIGkpKTsKKwkJZm9yIChpID0gMDsgaSA8IG5lbnQ7ICsraSkKKwkJCXNldF9jcWVfaHcoZ2V0X2NxZShjcSwgaSkpOworCX0KIAogCXNwaW5fbG9ja19pbml0KCZjcS0+bG9jayk7CiAJYXRvbWljX3NldCgmY3EtPnJlZmNvdW50LCAxKTsKQEAgLTgwMSwxMSArODA4LDE0IEBACiAJCQkJCQkgIE1USENBX0NRX1NUQVRFX0RJU0FSTUVEIHwKIAkJCQkJCSAgTVRIQ0FfQ1FfRkxBR19UUik7CiAJY3FfY29udGV4dC0+c3RhcnQgICAgICAgICAgID0gY3B1X3RvX2JlNjQoMCk7Ci0JY3FfY29udGV4dC0+bG9nc2l6ZV91c3JwYWdlID0gY3B1X3RvX2JlMzIoKGZmcyhuZW50KSAtIDEpIDw8IDI0IHwKLQkJCQkJCSAgZGV2LT5kcml2ZXJfdWFyLmluZGV4KTsKKwljcV9jb250ZXh0LT5sb2dzaXplX3VzcnBhZ2UgPSBjcHVfdG9fYmUzMigoZmZzKG5lbnQpIC0gMSkgPDwgMjQpOworCWlmIChjdHgpCisJCWNxX2NvbnRleHQtPmxvZ3NpemVfdXNycGFnZSB8PSBjcHVfdG9fYmUzMihjdHgtPnVhci5pbmRleCk7CisJZWxzZQorCQljcV9jb250ZXh0LT5sb2dzaXplX3VzcnBhZ2UgfD0gY3B1X3RvX2JlMzIoZGV2LT5kcml2ZXJfdWFyLmluZGV4KTsKIAljcV9jb250ZXh0LT5lcnJvcl9lcW4gICAgICAgPSBjcHVfdG9fYmUzMihkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0FTWU5DXS5lcW4pOwogCWNxX2NvbnRleHQtPmNvbXBfZXFuICAgICAgICA9IGNwdV90b19iZTMyKGRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQ09NUF0uZXFuKTsKLQljcV9jb250ZXh0LT5wZCAgICAgICAgICAgICAgPSBjcHVfdG9fYmUzMihkZXYtPmRyaXZlcl9wZC5wZF9udW0pOworCWNxX2NvbnRleHQtPnBkICAgICAgICAgICAgICA9IGNwdV90b19iZTMyKHBkbik7CiAJY3FfY29udGV4dC0+bGtleSAgICAgICAgICAgID0gY3B1X3RvX2JlMzIoY3EtPm1yLmlibXIubGtleSk7CiAJY3FfY29udGV4dC0+Y3FuICAgICAgICAgICAgID0gY3B1X3RvX2JlMzIoY3EtPmNxbik7CiAKQEAgLTg0MywxOCArODUzLDIwIEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfZnJlZV9tcjoKLQltdGhjYV9mcmVlX21yKGRldiwgJmNxLT5tcik7Ci0JbXRoY2FfZnJlZV9jcV9idWYoZGV2LCBjcSk7CisJaWYgKGNxLT5pc19rZXJuZWwpIHsKKwkJbXRoY2FfZnJlZV9tcihkZXYsICZjcS0+bXIpOworCQltdGhjYV9mcmVlX2NxX2J1ZihkZXYsIGNxKTsKKwl9CiAKIGVycl9vdXRfbWFpbGJveDoKIAltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAogZXJyX291dF9hcm06Ci0JaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkKKwlpZiAoY3EtPmlzX2tlcm5lbCAmJiBtdGhjYV9pc19tZW1mcmVlKGRldikpCiAJCW10aGNhX2ZyZWVfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX0FSTSwgY3EtPmFybV9kYl9pbmRleCk7CiAKIGVycl9vdXRfY2k6Ci0JaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkKKwlpZiAoY3EtPmlzX2tlcm5lbCAmJiBtdGhjYV9pc19tZW1mcmVlKGRldikpCiAJCW10aGNhX2ZyZWVfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX1NFVF9DSSwgY3EtPnNldF9jaV9kYl9pbmRleCk7CiAKIGVycl9vdXRfaWNtOgpAQCAtODkyLDcgKzkwNCw4IEBACiAJCWludCBqOwogCiAJCXByaW50ayhLRVJOX0VSUiAiY29udGV4dCBmb3IgQ1FOICV4IChjb25zIGluZGV4ICV4LCBuZXh0IHN3ICVkKVxuIiwKLQkJICAgICAgIGNxLT5jcW4sIGNxLT5jb25zX2luZGV4LCAhIW5leHRfY3FlX3N3KGNxKSk7CisJCSAgICAgICBjcS0+Y3FuLCBjcS0+Y29uc19pbmRleCwKKwkJICAgICAgIGNxLT5pc19rZXJuZWwgPyAhIW5leHRfY3FlX3N3KGNxKSA6IDApOwogCQlmb3IgKGogPSAwOyBqIDwgMTY7ICsraikKIAkJCXByaW50ayhLRVJOX0VSUiAiWyUyeF0gJTA4eFxuIiwgaiAqIDQsIGJlMzJfdG9fY3B1KGN0eFtqXSkpOwogCX0KQEAgLTkxMCwxMiArOTIzLDEzIEBACiAJYXRvbWljX2RlYygmY3EtPnJlZmNvdW50KTsKIAl3YWl0X2V2ZW50KGNxLT53YWl0LCAhYXRvbWljX3JlYWQoJmNxLT5yZWZjb3VudCkpOwogCi0JbXRoY2FfZnJlZV9tcihkZXYsICZjcS0+bXIpOwotCW10aGNhX2ZyZWVfY3FfYnVmKGRldiwgY3EpOwotCi0JaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewotCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9BUk0sICAgIGNxLT5hcm1fZGJfaW5kZXgpOwotCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0ksIGNxLT5zZXRfY2lfZGJfaW5kZXgpOworCWlmIChjcS0+aXNfa2VybmVsKSB7CisJCW10aGNhX2ZyZWVfbXIoZGV2LCAmY3EtPm1yKTsKKwkJbXRoY2FfZnJlZV9jcV9idWYoZGV2LCBjcSk7CisJCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKKwkJCW10aGNhX2ZyZWVfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX0FSTSwgICAgY3EtPmFybV9kYl9pbmRleCk7CisJCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0ksIGNxLT5zZXRfY2lfZGJfaW5kZXgpOworCQl9CiAJfQogCiAJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5jcV90YWJsZS50YWJsZSwgY3EtPmNxbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmgKaW5kZXggNDEyN2YwOS4uNWVjZGQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rldi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kZXYuaApAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0zNzgsNyArMzc5LDcgQEAKIGludCBtdGhjYV91YXJfYWxsb2Moc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIpOwogdm9pZCBtdGhjYV91YXJfZnJlZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV91YXIgKnVhcik7CiAKLWludCBtdGhjYV9wZF9hbGxvYyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9wZCAqcGQpOworaW50IG10aGNhX3BkX2FsbG9jKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHByaXZpbGVnZWQsIHN0cnVjdCBtdGhjYV9wZCAqcGQpOwogdm9pZCBtdGhjYV9wZF9mcmVlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3BkICpwZCk7CiAKIHN0cnVjdCBtdGhjYV9tdHQgKm10aGNhX2FsbG9jX210dChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBzaXplKTsKQEAgLTQxMyw2ICs0MTQsNyBAQAogaW50IG10aGNhX3Rhdm9yX2FybV9jcShzdHJ1Y3QgaWJfY3EgKmNxLCBlbnVtIGliX2NxX25vdGlmeSBub3RpZnkpOwogaW50IG10aGNhX2FyYmVsX2FybV9jcShzdHJ1Y3QgaWJfY3EgKmNxLCBlbnVtIGliX2NxX25vdGlmeSBub3RpZnkpOwogaW50IG10aGNhX2luaXRfY3Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgbmVudCwKKwkJICBzdHJ1Y3QgbXRoY2FfdWNvbnRleHQgKmN0eCwgdTMyIHBkbiwKIAkJICBzdHJ1Y3QgbXRoY2FfY3EgKmNxKTsKIHZvaWQgbXRoY2FfZnJlZV9jcShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCiAJCSAgIHN0cnVjdCBtdGhjYV9jcSAqY3EpOwpAQCAtNDM4LDEyICs0NDAsMTQgQEAKIAkJICAgc3RydWN0IG10aGNhX2NxICpyZWN2X2NxLAogCQkgICBlbnVtIGliX3FwX3R5cGUgdHlwZSwKIAkJICAgZW51bSBpYl9zaWdfdHlwZSBzZW5kX3BvbGljeSwKKwkJICAgc3RydWN0IGliX3FwX2NhcCAqY2FwLAogCQkgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKTsKIGludCBtdGhjYV9hbGxvY19zcXAoc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkgICAgc3RydWN0IG10aGNhX3BkICpwZCwKIAkJICAgIHN0cnVjdCBtdGhjYV9jcSAqc2VuZF9jcSwKIAkJICAgIHN0cnVjdCBtdGhjYV9jcSAqcmVjdl9jcSwKIAkJICAgIGVudW0gaWJfc2lnX3R5cGUgc2VuZF9wb2xpY3ksCisJCSAgICBzdHJ1Y3QgaWJfcXBfY2FwICpjYXAsCiAJCSAgICBpbnQgcXBuLAogCQkgICAgaW50IHBvcnQsCiAJCSAgICBzdHJ1Y3QgbXRoY2Ffc3FwICpzcXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKaW5kZXggMDk1MTliNi4uMmVmOTE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCkBAIC02NjUsNyArNjY1LDcgQEAKIAkJZ290byBlcnJfcGRfdGFibGVfZnJlZTsKIAl9CiAKLQllcnIgPSBtdGhjYV9wZF9hbGxvYyhkZXYsICZkZXYtPmRyaXZlcl9wZCk7CisJZXJyID0gbXRoY2FfcGRfYWxsb2MoZGV2LCAxLCAmZGV2LT5kcml2ZXJfcGQpOwogCWlmIChlcnIpIHsKIAkJbXRoY2FfZXJyKGRldiwgIkZhaWxlZCB0byBjcmVhdGUgZHJpdmVyIFBELCAiCiAJCQkgICJhYm9ydGluZy5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmMKaW5kZXggNmQzYjA1ZC4uMmE4NjQ2MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQ3LDYgKzQ4LDE1IEBACiAJTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSA9IDEgPDwgMTgKIH07CiAKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG11dGV4OworCXN0cnVjdCB7CisJCXU2NCAgICAgICAgICAgICAgICB1dmlydDsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0IG1lbTsKKwkJaW50ICAgICAgICAgICAgICAgIHJlZmNvdW50OworCX0gICAgICAgICAgICAgICAgcGFnZVswXTsKK307CisKIHZvaWQgbXRoY2FfZnJlZV9pY20oc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfaWNtICppY20pCiB7CiAJc3RydWN0IG10aGNhX2ljbV9jaHVuayAqY2h1bmssICp0bXA7CkBAIC0zNDQsMTMgKzM1NCwxMzMgQEAKIAlrZnJlZSh0YWJsZSk7CiB9CiAKLXN0YXRpYyB1NjQgbXRoY2FfdWFyY192aXJ0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHBhZ2UpCitzdGF0aWMgdTY0IG10aGNhX3VhcmNfdmlydChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV91YXIgKnVhciwgaW50IHBhZ2UpCiB7CiAJcmV0dXJuIGRldi0+dWFyX3RhYmxlLnVhcmNfYmFzZSArCi0JCWRldi0+ZHJpdmVyX3Vhci5pbmRleCAqIGRldi0+dWFyX3RhYmxlLnVhcmNfc2l6ZSArCisJCXVhci0+aW5kZXggKiBkZXYtPnVhcl90YWJsZS51YXJjX3NpemUgKwogCQlwYWdlICogNDA5NjsKIH0KIAoraW50IG10aGNhX21hcF91c2VyX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkgICAgICBzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqZGJfdGFiLCBpbnQgaW5kZXgsIHU2NCB1YWRkcikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCBzdGF0dXM7CisJaW50IGk7CisKKwlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gZGV2LT51YXJfdGFibGUudWFyY19zaXplIC8gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZkYl90YWItPm11dGV4KTsKKworCWkgPSBpbmRleCAvIE1USENBX0RCX1JFQ19QRVJfUEFHRTsKKworCWlmICgoZGJfdGFiLT5wYWdlW2ldLnJlZmNvdW50ID49IE1USENBX0RCX1JFQ19QRVJfUEFHRSkgICAgICAgfHwKKwkgICAgKGRiX3RhYi0+cGFnZVtpXS51dmlydCAmJiBkYl90YWItPnBhZ2VbaV0udXZpcnQgIT0gdWFkZHIpIHx8CisJICAgICh1YWRkciAmIDQwOTUpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkYl90YWItPnBhZ2VbaV0ucmVmY291bnQpIHsKKwkJKytkYl90YWItPnBhZ2VbaV0ucmVmY291bnQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1YWRkciAmIFBBR0VfTUFTSywgMSwgMSwgMCwKKwkJCSAgICAgJmRiX3RhYi0+cGFnZVtpXS5tZW0ucGFnZSwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZGJfdGFiLT5wYWdlW2ldLm1lbS5sZW5ndGggPSA0MDk2OworCWRiX3RhYi0+cGFnZVtpXS5tZW0ub2Zmc2V0ID0gdWFkZHIgJiB+UEFHRV9NQVNLOworCisJcmV0ID0gcGNpX21hcF9zZyhkZXYtPnBkZXYsICZkYl90YWItPnBhZ2VbaV0ubWVtLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAocmV0IDwgMCkgeworCQlwdXRfcGFnZShkYl90YWItPnBhZ2VbaV0ubWVtLnBhZ2UpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBtdGhjYV9NQVBfSUNNX3BhZ2UoZGV2LCBzZ19kbWFfYWRkcmVzcygmZGJfdGFiLT5wYWdlW2ldLm1lbSksCisJCQkJIG10aGNhX3VhcmNfdmlydChkZXYsIHVhciwgaSksICZzdGF0dXMpOworCWlmICghcmV0ICYmIHN0YXR1cykKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocmV0KSB7CisJCXBjaV91bm1hcF9zZyhkZXYtPnBkZXYsICZkYl90YWItPnBhZ2VbaV0ubWVtLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJcHV0X3BhZ2UoZGJfdGFiLT5wYWdlW2ldLm1lbS5wYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGJfdGFiLT5wYWdlW2ldLnV2aXJ0ICAgID0gdWFkZHI7CisJZGJfdGFiLT5wYWdlW2ldLnJlZmNvdW50ID0gMTsKKworb3V0OgorCXVwKCZkYl90YWItPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG10aGNhX3VubWFwX3VzZXJfZGIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIsCisJCQkgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYiwgaW50IGluZGV4KQoreworCWlmICghbXRoY2FfaXNfbWVtZnJlZShkZXYpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRvIG1ha2Ugb3VyIGJvb2trZWVwaW5nIHNpbXBsZXIsIHdlIGRvbid0IHVubWFwIERCCisJICogcGFnZXMgdW50aWwgd2UgY2xlYW4gdXAgdGhlIHdob2xlIGRiIHRhYmxlLgorCSAqLworCisJZG93bigmZGJfdGFiLT5tdXRleCk7CisKKwktLWRiX3RhYi0+cGFnZVtpbmRleCAvIE1USENBX0RCX1JFQ19QRVJfUEFHRV0ucmVmY291bnQ7CisKKwl1cCgmZGJfdGFiLT5tdXRleCk7Cit9CisKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICptdGhjYV9pbml0X3VzZXJfZGJfdGFiKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqZGJfdGFiOworCWludCBucGFnZXM7CisJaW50IGk7CisKKwlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlucGFnZXMgPSBkZXYtPnVhcl90YWJsZS51YXJjX3NpemUgLyA0MDk2OworCWRiX3RhYiA9IGttYWxsb2Moc2l6ZW9mICpkYl90YWIgKyBucGFnZXMgKiBzaXplb2YgKmRiX3RhYi0+cGFnZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYl90YWIpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdF9NVVRFWCgmZGJfdGFiLT5tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKSB7CisJCWRiX3RhYi0+cGFnZVtpXS5yZWZjb3VudCA9IDA7CisJCWRiX3RhYi0+cGFnZVtpXS51dmlydCAgICA9IDA7CisJfQorCisJcmV0dXJuIGRiX3RhYjsKK30KKwordm9pZCBtdGhjYV9jbGVhbnVwX3VzZXJfZGJfdGFiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkJICAgICAgIHN0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICpkYl90YWIpCit7CisJaW50IGk7CisJdTggc3RhdHVzOworCisJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnVhcl90YWJsZS51YXJjX3NpemUgLyA0MDk2OyArK2kpIHsKKwkJaWYgKGRiX3RhYi0+cGFnZVtpXS51dmlydCkgeworCQkJbXRoY2FfVU5NQVBfSUNNKGRldiwgbXRoY2FfdWFyY192aXJ0KGRldiwgdWFyLCBpKSwgMSwgJnN0YXR1cyk7CisJCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAmZGJfdGFiLT5wYWdlW2ldLm1lbSwgMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlwdXRfcGFnZShkYl90YWItPnBhZ2VbaV0ubWVtLnBhZ2UpOworCQl9CisJfQorfQorCiBpbnQgbXRoY2FfYWxsb2NfZGIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgdHlwZSwgdTMyIHFuLCB1MzIgKipkYikKIHsKIAlpbnQgZ3JvdXA7CkBAIC00MDcsNyArNTM3LDggQEAKIAl9CiAJbWVtc2V0KHBhZ2UtPmRiX3JlYywgMCwgNDA5Nik7CiAKLQlyZXQgPSBtdGhjYV9NQVBfSUNNX3BhZ2UoZGV2LCBwYWdlLT5tYXBwaW5nLCBtdGhjYV91YXJjX3ZpcnQoZGV2LCBpKSwgJnN0YXR1cyk7CisJcmV0ID0gbXRoY2FfTUFQX0lDTV9wYWdlKGRldiwgcGFnZS0+bWFwcGluZywKKwkJCQkgbXRoY2FfdWFyY192aXJ0KGRldiwgJmRldi0+ZHJpdmVyX3VhciwgaSksICZzdGF0dXMpOwogCWlmICghcmV0ICYmIHN0YXR1cykKIAkJcmV0ID0gLUVJTlZBTDsKIAlpZiAocmV0KSB7CkBAIC00NjEsNyArNTkyLDcgQEAKIAogCWlmIChiaXRtYXBfZW1wdHkocGFnZS0+dXNlZCwgTVRIQ0FfREJfUkVDX1BFUl9QQUdFKSAmJgogCSAgICBpID49IGRldi0+ZGJfdGFiLT5tYXhfZ3JvdXAxIC0gMSkgewotCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCBpKSwgMSwgJnN0YXR1cyk7CisJCW10aGNhX1VOTUFQX0lDTShkZXYsIG10aGNhX3VhcmNfdmlydChkZXYsICZkZXYtPmRyaXZlcl91YXIsIGkpLCAxLCAmc3RhdHVzKTsKIAogCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIDQwOTYsCiAJCQkJICBwYWdlLT5kYl9yZWMsIHBhZ2UtPm1hcHBpbmcpOwpAQCAtNTMwLDcgKzY2MSw3IEBACiAJCWlmICghYml0bWFwX2VtcHR5KGRldi0+ZGJfdGFiLT5wYWdlW2ldLnVzZWQsIE1USENBX0RCX1JFQ19QRVJfUEFHRSkpCiAJCQltdGhjYV93YXJuKGRldiwgIktlcm5lbCBVQVJDIHBhZ2UgJWQgbm90IGVtcHR5XG4iLCBpKTsKIAotCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCBpKSwgMSwgJnN0YXR1cyk7CisJCW10aGNhX1VOTUFQX0lDTShkZXYsIG10aGNhX3VhcmNfdmlydChkZXYsICZkZXYtPmRyaXZlcl91YXIsIGkpLCAxLCAmc3RhdHVzKTsKIAogCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIDQwOTYsCiAJCQkJICBkZXYtPmRiX3RhYi0+cGFnZVtpXS5kYl9yZWMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuaAppbmRleCBmZTdiZTJhLi40NzYxZDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmgKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0xNDgsNyArMTQ5LDcgQEAKIAlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgbXV0ZXg7CiB9OwogCi1lbnVtIHsKK2VudW0gbXRoY2FfZGJfdHlwZSB7CiAJTVRIQ0FfREJfVFlQRV9JTlZBTElEICAgPSAweDAsCiAJTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0kgPSAweDEsCiAJTVRIQ0FfREJfVFlQRV9DUV9BUk0gICAgPSAweDIsCkBAIC0xNTgsNiArMTU5LDE3IEBACiAJTVRIQ0FfREJfVFlQRV9HUk9VUF9TRVAgPSAweDcKIH07CiAKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlOworc3RydWN0IG10aGNhX3VhcjsKKworaW50IG10aGNhX21hcF91c2VyX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkgICAgICBzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqZGJfdGFiLCBpbnQgaW5kZXgsIHU2NCB1YWRkcik7Cit2b2lkIG10aGNhX3VubWFwX3VzZXJfZGIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIsCisJCQkgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYiwgaW50IGluZGV4KTsKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICptdGhjYV9pbml0X3VzZXJfZGJfdGFiKHN0cnVjdCBtdGhjYV9kZXYgKmRldik7Cit2b2lkIG10aGNhX2NsZWFudXBfdXNlcl9kYl90YWIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIsCisJCQkgICAgICAgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYik7CisKIGludCBtdGhjYV9pbml0X2RiX3RhYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogdm9pZCBtdGhjYV9jbGVhbnVwX2RiX3RhYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogaW50IG10aGNhX2FsbG9jX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxbiwgdTMyICoqZGIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcGQuYwppbmRleCBlYTY2ODQ3Li5jMmM4OTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcGQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcGQuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTM3LDIzICszOCwyNyBAQAogCiAjaW5jbHVkZSAibXRoY2FfZGV2LmgiCiAKLWludCBtdGhjYV9wZF9hbGxvYyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9wZCAqcGQpCitpbnQgbXRoY2FfcGRfYWxsb2Moc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgcHJpdmlsZWdlZCwgc3RydWN0IG10aGNhX3BkICpwZCkKIHsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCiAJbWlnaHRfc2xlZXAoKTsKIAorCXBkLT5wcml2aWxlZ2VkID0gcHJpdmlsZWdlZDsKKwogCWF0b21pY19zZXQoJnBkLT5zcXBfY291bnQsIDApOwogCXBkLT5wZF9udW0gPSBtdGhjYV9hbGxvYygmZGV2LT5wZF90YWJsZS5hbGxvYyk7CiAJaWYgKHBkLT5wZF9udW0gPT0gLTEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZXJyID0gbXRoY2FfbXJfYWxsb2Nfbm90cmFucyhkZXYsIHBkLT5wZF9udW0sCi0JCQkJICAgICBNVEhDQV9NUFRfRkxBR19MT0NBTF9SRUFEIHwKLQkJCQkgICAgIE1USENBX01QVF9GTEFHX0xPQ0FMX1dSSVRFLAotCQkJCSAgICAgJnBkLT5udG1yKTsKLQlpZiAoZXJyKQotCQltdGhjYV9mcmVlKCZkZXYtPnBkX3RhYmxlLmFsbG9jLCBwZC0+cGRfbnVtKTsKKwlpZiAocHJpdmlsZWdlZCkgeworCQllcnIgPSBtdGhjYV9tcl9hbGxvY19ub3RyYW5zKGRldiwgcGQtPnBkX251bSwKKwkJCQkJICAgICBNVEhDQV9NUFRfRkxBR19MT0NBTF9SRUFEIHwKKwkJCQkJICAgICBNVEhDQV9NUFRfRkxBR19MT0NBTF9XUklURSwKKwkJCQkJICAgICAmcGQtPm50bXIpOworCQlpZiAoZXJyKQorCQkJbXRoY2FfZnJlZSgmZGV2LT5wZF90YWJsZS5hbGxvYywgcGQtPnBkX251bSk7CisJfQogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTYxLDcgKzY2LDggQEAKIHZvaWQgbXRoY2FfcGRfZnJlZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9wZCAqcGQpCiB7CiAJbWlnaHRfc2xlZXAoKTsKLQltdGhjYV9mcmVlX21yKGRldiwgJnBkLT5udG1yKTsKKwlpZiAocGQtPnByaXZpbGVnZWQpCisJCW10aGNhX2ZyZWVfbXIoZGV2LCAmcGQtPm50bXIpOwogCW10aGNhX2ZyZWUoJmRldi0+cGRfdGFibGUuYWxsb2MsIHBkLT5wZF9udW0pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCmluZGV4IDBiNWFkZmQuLjdhNThjZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMzQsOSArMzUsMTIgQEAKICAqLwogCiAjaW5jbHVkZSA8aWJfc21pLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgIm10aGNhX2Rldi5oIgogI2luY2x1ZGUgIm10aGNhX2NtZC5oIgorI2luY2x1ZGUgIm10aGNhX3VzZXIuaCIKKyNpbmNsdWRlICJtdGhjYV9tZW1mcmVlLmgiCiAKIHN0YXRpYyBpbnQgbXRoY2FfcXVlcnlfZGV2aWNlKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAogCQkJICAgICAgc3RydWN0IGliX2RldmljZV9hdHRyICpwcm9wcykKQEAgLTI4NCw3ICsyODgsNzggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0IGliX3BkICptdGhjYV9hbGxvY19wZChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldikKK3N0YXRpYyBzdHJ1Y3QgaWJfdWNvbnRleHQgKm10aGNhX2FsbG9jX3Vjb250ZXh0KHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQkJc3RydWN0IGliX3VkYXRhICp1ZGF0YSkKK3sKKwlzdHJ1Y3QgbXRoY2FfYWxsb2NfdWNvbnRleHRfcmVzcCB1cmVzcDsKKwlzdHJ1Y3QgbXRoY2FfdWNvbnRleHQgICAgICAgICAgICpjb250ZXh0OworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKworCW1lbXNldCgmdXJlc3AsIDAsIHNpemVvZiB1cmVzcCk7CisKKwl1cmVzcC5xcF90YWJfc2l6ZSA9IHRvX21kZXYoaWJkZXYpLT5saW1pdHMubnVtX3FwczsKKwlpZiAobXRoY2FfaXNfbWVtZnJlZSh0b19tZGV2KGliZGV2KSkpCisJCXVyZXNwLnVhcmNfc2l6ZSA9IHRvX21kZXYoaWJkZXYpLT51YXJfdGFibGUudWFyY19zaXplOworCWVsc2UKKwkJdXJlc3AudWFyY19zaXplID0gMDsKKworCWNvbnRleHQgPSBrbWFsbG9jKHNpemVvZiAqY29udGV4dCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWVyciA9IG10aGNhX3Vhcl9hbGxvYyh0b19tZGV2KGliZGV2KSwgJmNvbnRleHQtPnVhcik7CisJaWYgKGVycikgeworCQlrZnJlZShjb250ZXh0KTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwljb250ZXh0LT5kYl90YWIgPSBtdGhjYV9pbml0X3VzZXJfZGJfdGFiKHRvX21kZXYoaWJkZXYpKTsKKwlpZiAoSVNfRVJSKGNvbnRleHQtPmRiX3RhYikpIHsKKwkJZXJyID0gUFRSX0VSUihjb250ZXh0LT5kYl90YWIpOworCQltdGhjYV91YXJfZnJlZSh0b19tZGV2KGliZGV2KSwgJmNvbnRleHQtPnVhcik7CisJCWtmcmVlKGNvbnRleHQpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCWlmIChpYl9jb3B5X3RvX3VkYXRhKHVkYXRhLCAmdXJlc3AsIHNpemVvZiB1cmVzcCkpIHsKKwkJbXRoY2FfY2xlYW51cF91c2VyX2RiX3RhYih0b19tZGV2KGliZGV2KSwgJmNvbnRleHQtPnVhciwgY29udGV4dC0+ZGJfdGFiKTsKKwkJbXRoY2FfdWFyX2ZyZWUodG9fbWRldihpYmRldiksICZjb250ZXh0LT51YXIpOworCQlrZnJlZShjb250ZXh0KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJfQorCisJcmV0dXJuICZjb250ZXh0LT5pYnVjb250ZXh0OworfQorCitzdGF0aWMgaW50IG10aGNhX2RlYWxsb2NfdWNvbnRleHQoc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0KQoreworCW10aGNhX2NsZWFudXBfdXNlcl9kYl90YWIodG9fbWRldihjb250ZXh0LT5kZXZpY2UpLCAmdG9fbXVjb250ZXh0KGNvbnRleHQpLT51YXIsCisJCQkJICB0b19tdWNvbnRleHQoY29udGV4dCktPmRiX3RhYik7CisJbXRoY2FfdWFyX2ZyZWUodG9fbWRldihjb250ZXh0LT5kZXZpY2UpLCAmdG9fbXVjb250ZXh0KGNvbnRleHQpLT51YXIpOworCWtmcmVlKHRvX211Y29udGV4dChjb250ZXh0KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGhjYV9tbWFwX3VhcihzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQsCisJCQkgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWlmICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQgIT0gUEFHRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCSAgICB0b19tdWNvbnRleHQoY29udGV4dCktPnVhci5wZm4sCisJCQkgICAgUEFHRV9TSVpFLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJfcGQgKm10aGNhX2FsbG9jX3BkKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgICBzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQsCisJCQkJICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCiB7CiAJc3RydWN0IG10aGNhX3BkICpwZDsKIAlpbnQgZXJyOwpAQCAtMjkzLDEyICszNjgsMjAgQEAKIAlpZiAoIXBkKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWVyciA9IG10aGNhX3BkX2FsbG9jKHRvX21kZXYoaWJkZXYpLCBwZCk7CisJZXJyID0gbXRoY2FfcGRfYWxsb2ModG9fbWRldihpYmRldiksICFjb250ZXh0LCBwZCk7CiAJaWYgKGVycikgewogCQlrZnJlZShwZCk7CiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJfQogCisJaWYgKGNvbnRleHQpIHsKKwkJaWYgKGliX2NvcHlfdG9fdWRhdGEodWRhdGEsICZwZC0+cGRfbnVtLCBzaXplb2YgKF9fdTMyKSkpIHsKKwkJCW10aGNhX3BkX2ZyZWUodG9fbWRldihpYmRldiksIHBkKTsKKwkJCWtmcmVlKHBkKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCQl9CisJfQorCiAJcmV0dXJuICZwZC0+aWJwZDsKIH0KIApAQCAtMzM4LDggKzQyMSwxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGliX3FwICptdGhjYV9jcmVhdGVfcXAoc3RydWN0IGliX3BkICpwZCwKLQkJCQkgICAgIHN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKmluaXRfYXR0cikKKwkJCQkgICAgIHN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKmluaXRfYXR0ciwKKwkJCQkgICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCiB7CisJc3RydWN0IG10aGNhX2NyZWF0ZV9xcCB1Y21kOwogCXN0cnVjdCBtdGhjYV9xcCAqcXA7CiAJaW50IGVycjsKIApAQCAtMzQ4LDQxICs0MzMsODIgQEAKIAljYXNlIElCX1FQVF9VQzoKIAljYXNlIElCX1FQVF9VRDoKIAl7CisJCXN0cnVjdCBtdGhjYV91Y29udGV4dCAqY29udGV4dDsKKwogCQlxcCA9IGttYWxsb2Moc2l6ZW9mICpxcCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcXApCiAJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCQlxcC0+c3EubWF4ICAgID0gaW5pdF9hdHRyLT5jYXAubWF4X3NlbmRfd3I7Ci0JCXFwLT5ycS5tYXggICAgPSBpbml0X2F0dHItPmNhcC5tYXhfcmVjdl93cjsKLQkJcXAtPnNxLm1heF9ncyA9IGluaXRfYXR0ci0+Y2FwLm1heF9zZW5kX3NnZTsKLQkJcXAtPnJxLm1heF9ncyA9IGluaXRfYXR0ci0+Y2FwLm1heF9yZWN2X3NnZTsKKwkJaWYgKHBkLT51b2JqZWN0KSB7CisJCQljb250ZXh0ID0gdG9fbXVjb250ZXh0KHBkLT51b2JqZWN0LT5jb250ZXh0KTsKKworCQkJaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmdWNtZCwgdWRhdGEsIHNpemVvZiB1Y21kKSkKKwkJCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKworCQkJZXJyID0gbXRoY2FfbWFwX3VzZXJfZGIodG9fbWRldihwZC0+ZGV2aWNlKSwgJmNvbnRleHQtPnVhciwKKwkJCQkJCWNvbnRleHQtPmRiX3RhYiwKKwkJCQkJCXVjbWQuc3FfZGJfaW5kZXgsIHVjbWQuc3FfZGJfcGFnZSk7CisJCQlpZiAoZXJyKSB7CisJCQkJa2ZyZWUocXApOworCQkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCQl9CisKKwkJCWVyciA9IG10aGNhX21hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksICZjb250ZXh0LT51YXIsCisJCQkJCQljb250ZXh0LT5kYl90YWIsCisJCQkJCQl1Y21kLnJxX2RiX2luZGV4LCB1Y21kLnJxX2RiX3BhZ2UpOworCQkJaWYgKGVycikgeworCQkJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihwZC0+ZGV2aWNlKSwKKwkJCQkJCSAgICAmY29udGV4dC0+dWFyLAorCQkJCQkJICAgIGNvbnRleHQtPmRiX3RhYiwKKwkJCQkJCSAgICB1Y21kLnNxX2RiX2luZGV4KTsKKwkJCQlrZnJlZShxcCk7CisJCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJCX0KKworCQkJcXAtPm1yLmlibXIubGtleSA9IHVjbWQubGtleTsKKwkJCXFwLT5zcS5kYl9pbmRleCAgPSB1Y21kLnNxX2RiX2luZGV4OworCQkJcXAtPnJxLmRiX2luZGV4ICA9IHVjbWQucnFfZGJfaW5kZXg7CisJCX0KIAogCQllcnIgPSBtdGhjYV9hbGxvY19xcCh0b19tZGV2KHBkLT5kZXZpY2UpLCB0b19tcGQocGQpLAogCQkJCSAgICAgdG9fbWNxKGluaXRfYXR0ci0+c2VuZF9jcSksCiAJCQkJICAgICB0b19tY3EoaW5pdF9hdHRyLT5yZWN2X2NxKSwKIAkJCQkgICAgIGluaXRfYXR0ci0+cXBfdHlwZSwgaW5pdF9hdHRyLT5zcV9zaWdfdHlwZSwKLQkJCQkgICAgIHFwKTsKKwkJCQkgICAgICZpbml0X2F0dHItPmNhcCwgcXApOworCisJCWlmIChlcnIgJiYgcGQtPnVvYmplY3QpIHsKKwkJCWNvbnRleHQgPSB0b19tdWNvbnRleHQocGQtPnVvYmplY3QtPmNvbnRleHQpOworCisJCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksCisJCQkJCSAgICAmY29udGV4dC0+dWFyLAorCQkJCQkgICAgY29udGV4dC0+ZGJfdGFiLAorCQkJCQkgICAgdWNtZC5zcV9kYl9pbmRleCk7CisJCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksCisJCQkJCSAgICAmY29udGV4dC0+dWFyLAorCQkJCQkgICAgY29udGV4dC0+ZGJfdGFiLAorCQkJCQkgICAgdWNtZC5ycV9kYl9pbmRleCk7CisJCX0KKwogCQlxcC0+aWJxcC5xcF9udW0gPSBxcC0+cXBuOwogCQlicmVhazsKIAl9CiAJY2FzZSBJQl9RUFRfU01JOgogCWNhc2UgSUJfUVBUX0dTSToKIAl7CisJCS8qIERvbid0IGFsbG93IHVzZXJzcGFjZSB0byBjcmVhdGUgc3BlY2lhbCBRUHMgKi8KKwkJaWYgKHBkLT51b2JqZWN0KQorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKIAkJcXAgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IG10aGNhX3NxcCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXFwKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQkJcXAtPnNxLm1heCAgICA9IGluaXRfYXR0ci0+Y2FwLm1heF9zZW5kX3dyOwotCQlxcC0+cnEubWF4ICAgID0gaW5pdF9hdHRyLT5jYXAubWF4X3JlY3Zfd3I7Ci0JCXFwLT5zcS5tYXhfZ3MgPSBpbml0X2F0dHItPmNhcC5tYXhfc2VuZF9zZ2U7Ci0JCXFwLT5ycS5tYXhfZ3MgPSBpbml0X2F0dHItPmNhcC5tYXhfcmVjdl9zZ2U7Ci0KIAkJcXAtPmlicXAucXBfbnVtID0gaW5pdF9hdHRyLT5xcF90eXBlID09IElCX1FQVF9TTUkgPyAwIDogMTsKIAogCQllcnIgPSBtdGhjYV9hbGxvY19zcXAodG9fbWRldihwZC0+ZGV2aWNlKSwgdG9fbXBkKHBkKSwKIAkJCQkgICAgICB0b19tY3EoaW5pdF9hdHRyLT5zZW5kX2NxKSwKIAkJCQkgICAgICB0b19tY3EoaW5pdF9hdHRyLT5yZWN2X2NxKSwKLQkJCQkgICAgICBpbml0X2F0dHItPnNxX3NpZ190eXBlLAorCQkJCSAgICAgIGluaXRfYXR0ci0+c3Ffc2lnX3R5cGUsICZpbml0X2F0dHItPmNhcCwKIAkJCQkgICAgICBxcC0+aWJxcC5xcF9udW0sIGluaXRfYXR0ci0+cG9ydF9udW0sCiAJCQkJICAgICAgdG9fbXNxcChxcCkpOwogCQlicmVhazsKQEAgLTM5Nyw0MiArNTIzLDExNSBAQAogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCX0KIAotICAgICAgICBpbml0X2F0dHItPmNhcC5tYXhfaW5saW5lX2RhdGEgPSAwOworCWluaXRfYXR0ci0+Y2FwLm1heF9pbmxpbmVfZGF0YSA9IDA7CisJaW5pdF9hdHRyLT5jYXAubWF4X3NlbmRfd3IgICAgID0gcXAtPnNxLm1heDsKKwlpbml0X2F0dHItPmNhcC5tYXhfcmVjdl93ciAgICAgPSBxcC0+cnEubWF4OworCWluaXRfYXR0ci0+Y2FwLm1heF9zZW5kX3NnZSAgICA9IHFwLT5zcS5tYXhfZ3M7CisJaW5pdF9hdHRyLT5jYXAubWF4X3JlY3Zfc2dlICAgID0gcXAtPnJxLm1heF9nczsKIAogCXJldHVybiAmcXAtPmlicXA7CiB9CiAKIHN0YXRpYyBpbnQgbXRoY2FfZGVzdHJveV9xcChzdHJ1Y3QgaWJfcXAgKnFwKQogeworCWlmIChxcC0+dW9iamVjdCkgeworCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYocXAtPmRldmljZSksCisJCQkJICAgICZ0b19tdWNvbnRleHQocXAtPnVvYmplY3QtPmNvbnRleHQpLT51YXIsCisJCQkJICAgIHRvX211Y29udGV4dChxcC0+dW9iamVjdC0+Y29udGV4dCktPmRiX3RhYiwKKwkJCQkgICAgdG9fbXFwKHFwKS0+c3EuZGJfaW5kZXgpOworCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYocXAtPmRldmljZSksCisJCQkJICAgICZ0b19tdWNvbnRleHQocXAtPnVvYmplY3QtPmNvbnRleHQpLT51YXIsCisJCQkJICAgIHRvX211Y29udGV4dChxcC0+dW9iamVjdC0+Y29udGV4dCktPmRiX3RhYiwKKwkJCQkgICAgdG9fbXFwKHFwKS0+cnEuZGJfaW5kZXgpOworCX0KIAltdGhjYV9mcmVlX3FwKHRvX21kZXYocXAtPmRldmljZSksIHRvX21xcChxcCkpOwogCWtmcmVlKHFwKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpYl9jcSAqbXRoY2FfY3JlYXRlX2NxKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBpbnQgZW50cmllcykKK3N0YXRpYyBzdHJ1Y3QgaWJfY3EgKm10aGNhX2NyZWF0ZV9jcShzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgaW50IGVudHJpZXMsCisJCQkJICAgICBzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQsCisJCQkJICAgICBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKQogeworCXN0cnVjdCBtdGhjYV9jcmVhdGVfY3EgdWNtZDsKIAlzdHJ1Y3QgbXRoY2FfY3EgKmNxOwogCWludCBuZW50OwogCWludCBlcnI7CiAKKwlpZiAoY29udGV4dCkgeworCQlpZiAoaWJfY29weV9mcm9tX3VkYXRhKCZ1Y21kLCB1ZGF0YSwgc2l6ZW9mIHVjbWQpKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisKKwkJZXJyID0gbXRoY2FfbWFwX3VzZXJfZGIodG9fbWRldihpYmRldiksICZ0b19tdWNvbnRleHQoY29udGV4dCktPnVhciwKKwkJCQkJdG9fbXVjb250ZXh0KGNvbnRleHQpLT5kYl90YWIsCisJCQkJCXVjbWQuc2V0X2RiX2luZGV4LCB1Y21kLnNldF9kYl9wYWdlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwkJZXJyID0gbXRoY2FfbWFwX3VzZXJfZGIodG9fbWRldihpYmRldiksICZ0b19tdWNvbnRleHQoY29udGV4dCktPnVhciwKKwkJCQkJdG9fbXVjb250ZXh0KGNvbnRleHQpLT5kYl90YWIsCisJCQkJCXVjbWQuYXJtX2RiX2luZGV4LCB1Y21kLmFybV9kYl9wYWdlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3VubWFwX3NldDsKKwl9CisKIAljcSA9IGttYWxsb2Moc2l6ZW9mICpjcSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjcSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCFjcSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bm1hcF9hcm07CisJfQorCisJaWYgKGNvbnRleHQpIHsKKwkJY3EtPm1yLmlibXIubGtleSAgICA9IHVjbWQubGtleTsKKwkJY3EtPnNldF9jaV9kYl9pbmRleCA9IHVjbWQuc2V0X2RiX2luZGV4OworCQljcS0+YXJtX2RiX2luZGV4ICAgID0gdWNtZC5hcm1fZGJfaW5kZXg7CisJfQogCiAJZm9yIChuZW50ID0gMTsgbmVudCA8PSBlbnRyaWVzOyBuZW50IDw8PSAxKQogCQk7IC8qIG5vdGhpbmcgKi8KIAotCWVyciA9IG10aGNhX2luaXRfY3EodG9fbWRldihpYmRldiksIG5lbnQsIGNxKTsKLQlpZiAoZXJyKSB7Ci0JCWtmcmVlKGNxKTsKLQkJY3EgPSBFUlJfUFRSKGVycik7CisJZXJyID0gbXRoY2FfaW5pdF9jcSh0b19tZGV2KGliZGV2KSwgbmVudCwKKwkJCSAgICBjb250ZXh0ID8gdG9fbXVjb250ZXh0KGNvbnRleHQpIDogTlVMTCwKKwkJCSAgICBjb250ZXh0ID8gdWNtZC5wZG4gOiB0b19tZGV2KGliZGV2KS0+ZHJpdmVyX3BkLnBkX251bSwKKwkJCSAgICBjcSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZTsKKworCWlmIChjb250ZXh0ICYmIGliX2NvcHlfdG9fdWRhdGEodWRhdGEsICZjcS0+Y3FuLCBzaXplb2YgKF9fdTMyKSkpIHsKKwkJbXRoY2FfZnJlZV9jcSh0b19tZGV2KGliZGV2KSwgY3EpOworCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldHVybiAmY3EtPmliY3E7CisKK2Vycl9mcmVlOgorCWtmcmVlKGNxKTsKKworZXJyX3VubWFwX2FybToKKwlpZiAoY29udGV4dCkKKwkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KGliZGV2KSwgJnRvX211Y29udGV4dChjb250ZXh0KS0+dWFyLAorCQkJCSAgICB0b19tdWNvbnRleHQoY29udGV4dCktPmRiX3RhYiwgdWNtZC5hcm1fZGJfaW5kZXgpOworCitlcnJfdW5tYXBfc2V0OgorCWlmIChjb250ZXh0KQorCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYoaWJkZXYpLCAmdG9fbXVjb250ZXh0KGNvbnRleHQpLT51YXIsCisJCQkJICAgIHRvX211Y29udGV4dChjb250ZXh0KS0+ZGJfdGFiLCB1Y21kLnNldF9kYl9pbmRleCk7CisKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCiBzdGF0aWMgaW50IG10aGNhX2Rlc3Ryb3lfY3Eoc3RydWN0IGliX2NxICpjcSkKIHsKKwlpZiAoY3EtPnVvYmplY3QpIHsKKwkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KGNxLT5kZXZpY2UpLAorCQkJCSAgICAmdG9fbXVjb250ZXh0KGNxLT51b2JqZWN0LT5jb250ZXh0KS0+dWFyLAorCQkJCSAgICB0b19tdWNvbnRleHQoY3EtPnVvYmplY3QtPmNvbnRleHQpLT5kYl90YWIsCisJCQkJICAgIHRvX21jcShjcSktPmFybV9kYl9pbmRleCk7CisJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihjcS0+ZGV2aWNlKSwKKwkJCQkgICAgJnRvX211Y29udGV4dChjcS0+dW9iamVjdC0+Y29udGV4dCktPnVhciwKKwkJCQkgICAgdG9fbXVjb250ZXh0KGNxLT51b2JqZWN0LT5jb250ZXh0KS0+ZGJfdGFiLAorCQkJCSAgICB0b19tY3EoY3EpLT5zZXRfY2lfZGJfaW5kZXgpOworCX0KIAltdGhjYV9mcmVlX2NxKHRvX21kZXYoY3EtPmRldmljZSksIHRvX21jcShjcSkpOwogCWtmcmVlKGNxKTsKIApAQCAtNTY4LDYgKzc2Nyw4NyBAQAogCXJldHVybiAmbXItPmlibXI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaWJfbXIgKm10aGNhX3JlZ191c2VyX21yKHN0cnVjdCBpYl9wZCAqcGQsIHN0cnVjdCBpYl91bWVtICpyZWdpb24sCisJCQkJICAgICAgIGludCBhY2MsIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCit7CisJc3RydWN0IG10aGNhX2RldiAqZGV2ID0gdG9fbWRldihwZC0+ZGV2aWNlKTsKKwlzdHJ1Y3QgaWJfdW1lbV9jaHVuayAqY2h1bms7CisJc3RydWN0IG10aGNhX21yICptcjsKKwl1NjQgKnBhZ2VzOworCWludCBzaGlmdCwgbiwgbGVuOworCWludCBpLCBqLCBrOworCWludCBlcnIgPSAwOworCisJc2hpZnQgPSBmZnMocmVnaW9uLT5wYWdlX3NpemUpIC0gMTsKKworCW1yID0ga21hbGxvYyhzaXplb2YgKm1yLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1yKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCW4gPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZyZWdpb24tPmNodW5rX2xpc3QsIGxpc3QpCisJCW4gKz0gY2h1bmstPm5lbnRzOworCisJbXItPm10dCA9IG10aGNhX2FsbG9jX210dChkZXYsIG4pOworCWlmIChJU19FUlIobXItPm10dCkpIHsKKwkJZXJyID0gUFRSX0VSUihtci0+bXR0KTsKKwkJZ290byBlcnI7CisJfQorCisJcGFnZXMgPSAodTY0ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2VzKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX210dDsKKwl9CisKKwlpID0gbiA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNodW5rLCAmcmVnaW9uLT5jaHVua19saXN0LCBsaXN0KQorCQlmb3IgKGogPSAwOyBqIDwgY2h1bmstPm5tYXA7ICsraikgeworCQkJbGVuID0gc2dfZG1hX2xlbigmY2h1bmstPnBhZ2VfbGlzdFtqXSkgPj4gc2hpZnQ7CisJCQlmb3IgKGsgPSAwOyBrIDwgbGVuOyArK2spIHsKKwkJCQlwYWdlc1tpKytdID0gc2dfZG1hX2FkZHJlc3MoJmNodW5rLT5wYWdlX2xpc3Rbal0pICsKKwkJCQkJcmVnaW9uLT5wYWdlX3NpemUgKiBrOworCQkJCS8qCisJCQkJICogQmUgZnJpZW5kbHkgdG8gV1JJVEVfTVRUIGNvbW1hbmQKKwkJCQkgKiBhbmQgbGVhdmUgdHdvIGVtcHR5IHNsb3RzIGZvciB0aGUKKwkJCQkgKiBpbmRleCBhbmQgcmVzZXJ2ZWQgZmllbGRzIG9mIHRoZQorCQkJCSAqIG1haWxib3guCisJCQkJICovCisJCQkJaWYgKGkgPT0gUEFHRV9TSVpFIC8gc2l6ZW9mICh1NjQpIC0gMikgeworCQkJCQllcnIgPSBtdGhjYV93cml0ZV9tdHQoZGV2LCBtci0+bXR0LAorCQkJCQkJCSAgICAgIG4sIHBhZ2VzLCBpKTsKKwkJCQkJaWYgKGVycikKKwkJCQkJCWdvdG8gbXR0X2RvbmU7CisJCQkJCW4gKz0gaTsKKwkJCQkJaSA9IDA7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAoaSkKKwkJZXJyID0gbXRoY2Ffd3JpdGVfbXR0KGRldiwgbXItPm10dCwgbiwgcGFnZXMsIGkpOworbXR0X2RvbmU6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlcyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfbXR0OworCisJZXJyID0gbXRoY2FfbXJfYWxsb2MoZGV2LCB0b19tcGQocGQpLT5wZF9udW0sIHNoaWZ0LCByZWdpb24tPnZpcnRfYmFzZSwKKwkJCSAgICAgcmVnaW9uLT5sZW5ndGgsIGNvbnZlcnRfYWNjZXNzKGFjYyksIG1yKTsKKworCWlmIChlcnIpCisJCWdvdG8gZXJyX210dDsKKworCXJldHVybiAmbXItPmlibXI7CisKK2Vycl9tdHQ6CisJbXRoY2FfZnJlZV9tdHQoZGV2LCBtci0+bXR0KTsKKworZXJyOgorCWtmcmVlKG1yKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCiBzdGF0aWMgaW50IG10aGNhX2RlcmVnX21yKHN0cnVjdCBpYl9tciAqbXIpCiB7CiAJc3RydWN0IG10aGNhX21yICptbXIgPSB0b19tbXIobXIpOwpAQCAtNjkyLDYgKzk3Miw4IEBACiAJaW50IGk7CiAKIAlzdHJsY3B5KGRldi0+aWJfZGV2Lm5hbWUsICJtdGhjYSVkIiwgSUJfREVWSUNFX05BTUVfTUFYKTsKKwlkZXYtPmliX2Rldi5vd25lciAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFOworCiAJZGV2LT5pYl9kZXYubm9kZV90eXBlICAgICAgICAgICAgPSBJQl9OT0RFX0NBOwogCWRldi0+aWJfZGV2LnBoeXNfcG9ydF9jbnQgICAgICAgID0gZGV2LT5saW1pdHMubnVtX3BvcnRzOwogCWRldi0+aWJfZGV2LmRtYV9kZXZpY2UgICAgICAgICAgID0gJmRldi0+cGRldi0+ZGV2OwpAQCAtNzAxLDYgKzk4Myw5IEBACiAJZGV2LT5pYl9kZXYubW9kaWZ5X3BvcnQgICAgICAgICAgPSBtdGhjYV9tb2RpZnlfcG9ydDsKIAlkZXYtPmliX2Rldi5xdWVyeV9wa2V5ICAgICAgICAgICA9IG10aGNhX3F1ZXJ5X3BrZXk7CiAJZGV2LT5pYl9kZXYucXVlcnlfZ2lkICAgICAgICAgICAgPSBtdGhjYV9xdWVyeV9naWQ7CisJZGV2LT5pYl9kZXYuYWxsb2NfdWNvbnRleHQgICAgICAgPSBtdGhjYV9hbGxvY191Y29udGV4dDsKKwlkZXYtPmliX2Rldi5kZWFsbG9jX3Vjb250ZXh0ICAgICA9IG10aGNhX2RlYWxsb2NfdWNvbnRleHQ7CisJZGV2LT5pYl9kZXYubW1hcCAgICAgICAgICAgICAgICAgPSBtdGhjYV9tbWFwX3VhcjsKIAlkZXYtPmliX2Rldi5hbGxvY19wZCAgICAgICAgICAgICA9IG10aGNhX2FsbG9jX3BkOwogCWRldi0+aWJfZGV2LmRlYWxsb2NfcGQgICAgICAgICAgID0gbXRoY2FfZGVhbGxvY19wZDsKIAlkZXYtPmliX2Rldi5jcmVhdGVfYWggICAgICAgICAgICA9IG10aGNhX2FoX2NyZWF0ZTsKQEAgLTcxMyw2ICs5OTgsNyBAQAogCWRldi0+aWJfZGV2LnBvbGxfY3EgICAgICAgICAgICAgID0gbXRoY2FfcG9sbF9jcTsKIAlkZXYtPmliX2Rldi5nZXRfZG1hX21yICAgICAgICAgICA9IG10aGNhX2dldF9kbWFfbXI7CiAJZGV2LT5pYl9kZXYucmVnX3BoeXNfbXIgICAgICAgICAgPSBtdGhjYV9yZWdfcGh5c19tcjsKKwlkZXYtPmliX2Rldi5yZWdfdXNlcl9tciAgICAgICAgICA9IG10aGNhX3JlZ191c2VyX21yOwogCWRldi0+aWJfZGV2LmRlcmVnX21yICAgICAgICAgICAgID0gbXRoY2FfZGVyZWdfbXI7CiAKIAlpZiAoZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfRk1SKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5oCmluZGV4IDRkOTc2Y2MuLjFkMDMyNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5oCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNTQsNiArNTUsMTQgQEAKIAlpbnQgICAgICAgICAgIGluZGV4OwogfTsKIAorc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGU7CisKK3N0cnVjdCBtdGhjYV91Y29udGV4dCB7CisJc3RydWN0IGliX3Vjb250ZXh0ICAgICAgICAgIGlidWNvbnRleHQ7CisJc3RydWN0IG10aGNhX3VhciAgICAgICAgICAgIHVhcjsKKwlzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqZGJfdGFiOworfTsKKwogc3RydWN0IG10aGNhX210dDsKIAogc3RydWN0IG10aGNhX21yIHsKQEAgLTgzLDYgKzkyLDcgQEAKIAl1MzIgICAgICAgICAgICAgcGRfbnVtOwogCWF0b21pY190ICAgICAgICBzcXBfY291bnQ7CiAJc3RydWN0IG10aGNhX21yIG50bXI7CisJaW50ICAgICAgICAgICAgIHByaXZpbGVnZWQ7CiB9OwogCiBzdHJ1Y3QgbXRoY2FfZXEgewpAQCAtMTY3LDYgKzE3Nyw3IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICBjcW47CiAJdTMyICAgICAgICAgICAgICAgICAgICBjb25zX2luZGV4OwogCWludCAgICAgICAgICAgICAgICAgICAgaXNfZGlyZWN0OworCWludCAgICAgICAgICAgICAgICAgICAgaXNfa2VybmVsOwogCiAJLyogTmV4dCBmaWVsZHMgYXJlIEFyYmVsIG9ubHkgKi8KIAlpbnQgICAgICAgICAgICAgICAgICAgIHNldF9jaV9kYl9pbmRleDsKQEAgLTIzNiw2ICsyNDcsMTEgQEAKIAlkbWFfYWRkcl90ICAgICAgaGVhZGVyX2RtYTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG10aGNhX3Vjb250ZXh0ICp0b19tdWNvbnRleHQoc3RydWN0IGliX3Vjb250ZXh0ICppYnVjb250ZXh0KQoreworCXJldHVybiBjb250YWluZXJfb2YoaWJ1Y29udGV4dCwgc3RydWN0IG10aGNhX3Vjb250ZXh0LCBpYnVjb250ZXh0KTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRoY2FfZm1yICp0b19tZm1yKHN0cnVjdCBpYl9mbXIgKmlibXIpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihpYm1yLCBzdHJ1Y3QgbXRoY2FfZm1yLCBpYm1yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKaW5kZXggMTYzYThlZi4uZjcxMjZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQ2LDcgKzQ3LDkgQEAKIAlNVEhDQV9NQVhfRElSRUNUX1FQX1NJWkUgPSA0ICogUEFHRV9TSVpFLAogCU1USENBX0FDS19SRVFfRlJFUSAgICAgICA9IDEwLAogCU1USENBX0ZMSUdIVF9MSU1JVCAgICAgICA9IDksCi0JTVRIQ0FfVURfSEVBREVSX1NJWkUgICAgID0gNzIgLyogbGFyZ2VzdCBVRCBoZWFkZXIgcG9zc2libGUgKi8KKwlNVEhDQV9VRF9IRUFERVJfU0laRSAgICAgPSA3MiwgLyogbGFyZ2VzdCBVRCBoZWFkZXIgcG9zc2libGUgKi8KKwlNVEhDQV9JTkxJTkVfSEVBREVSX1NJWkUgPSA0LCAgLyogZGF0YSBzZWdtZW50IG92ZXJoZWFkIGZvciBpbmxpbmUgKi8KKwlNVEhDQV9JTkxJTkVfQ0hVTktfU0laRSAgPSAxNiAgLyogaW5saW5lIGRhdGEgc2VnbWVudCBjaHVuayAqLwogfTsKIAogZW51bSB7CkBAIC02ODksNyArNjkyLDExIEBACiAKIAkvKiBsZWF2ZSBhcmJlbF9zY2hlZF9xdWV1ZSBhcyAwICovCiAKLQlxcF9jb250ZXh0LT51c3JfcGFnZSAgID0gY3B1X3RvX2JlMzIoZGV2LT5kcml2ZXJfdWFyLmluZGV4KTsKKwlpZiAocXAtPmlicXAudW9iamVjdCkKKwkJcXBfY29udGV4dC0+dXNyX3BhZ2UgPQorCQkJY3B1X3RvX2JlMzIodG9fbXVjb250ZXh0KHFwLT5pYnFwLnVvYmplY3QtPmNvbnRleHQpLT51YXIuaW5kZXgpOworCWVsc2UKKwkJcXBfY29udGV4dC0+dXNyX3BhZ2UgPSBjcHVfdG9fYmUzMihkZXYtPmRyaXZlcl91YXIuaW5kZXgpOwogCXFwX2NvbnRleHQtPmxvY2FsX3FwbiAgPSBjcHVfdG9fYmUzMihxcC0+cXBuKTsKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfREVTVF9RUE4pIHsKIAkJcXBfY29udGV4dC0+cmVtb3RlX3FwbiA9IGNwdV90b19iZTMyKGF0dHItPmRlc3RfcXBfbnVtKTsKQEAgLTk1NCw2ICs5NjEsMTUgQEAKIAogCXFwLT5zZW5kX3dxZV9vZmZzZXQgPSBBTElHTihxcC0+cnEubWF4IDw8IHFwLT5ycS53cWVfc2hpZnQsCiAJCQkJICAgIDEgPDwgcXAtPnNxLndxZV9zaGlmdCk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSB1c2Vyc3BhY2UgUVAsIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgdG8KKwkgKiBhbGxvY2F0ZSBhbnl0aGluZy4gIEFsbCB3ZSBuZWVkIGlzIHRvIGNhbGN1bGF0ZSB0aGUgV1FFCisJICogc2l6ZXMgYW5kIHRoZSBzZW5kX3dxZV9vZmZzZXQsIHNvIHdlJ3JlIGRvbmUgbm93LgorCSAqLworCWlmIChwZC0+aWJwZC51b2JqZWN0KQorCQlyZXR1cm4gMDsKKwogCXNpemUgPSBQQUdFX0FMSUdOKHFwLT5zZW5kX3dxZV9vZmZzZXQgKwogCQkJICAocXAtPnNxLm1heCA8PCBxcC0+c3Eud3FlX3NoaWZ0KSk7CiAKQEAgLTEwNTMsMTAgKzEwNjksMzIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG10aGNhX2FsbG9jX21lbWZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LAorc3RhdGljIHZvaWQgbXRoY2FfZnJlZV93cWVfYnVmKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQogewotCWludCByZXQgPSAwOworCWludCBpOworCWludCBzaXplID0gUEFHRV9BTElHTihxcC0+c2VuZF93cWVfb2Zmc2V0ICsKKwkJCSAgICAgIChxcC0+c3EubWF4IDw8IHFwLT5zcS53cWVfc2hpZnQpKTsKKworCWlmIChxcC0+aXNfZGlyZWN0KSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgc2l6ZSwgcXAtPnF1ZXVlLmRpcmVjdC5idWYsCisJCQkJICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLmRpcmVjdCwgbWFwcGluZykpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gUEFHRV9TSVpFOyArK2kpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgUEFHRV9TSVpFLAorCQkJCQkgIHFwLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmLAorCQkJCQkgIHBjaV91bm1hcF9hZGRyKCZxcC0+cXVldWUucGFnZV9saXN0W2ldLAorCQkJCQkJCSBtYXBwaW5nKSk7CisJCX0KKwl9CisKKwlrZnJlZShxcC0+d3JpZCk7Cit9CisKK3N0YXRpYyBpbnQgbXRoY2FfbWFwX21lbWZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LAorCQkJICAgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQoreworCWludCByZXQ7CiAKIAlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7CiAJCXJldCA9IG10aGNhX3RhYmxlX2dldChkZXYsIGRldi0+cXBfdGFibGUucXBfdGFibGUsIHFwLT5xcG4pOwpAQCAtMTA2NywzNSArMTEwNSwxNSBAQAogCQlpZiAocmV0KQogCQkJZ290byBlcnJfcXBjOwogCi0JCXJldCA9IG10aGNhX3RhYmxlX2dldChkZXYsIGRldi0+cXBfdGFibGUucmRiX3RhYmxlLAotCQkJCSAgICAgIHFwLT5xcG4gPDwgZGV2LT5xcF90YWJsZS5yZGJfc2hpZnQpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJfZXFwYzsKKyAJCXJldCA9IG10aGNhX3RhYmxlX2dldChkZXYsIGRldi0+cXBfdGFibGUucmRiX3RhYmxlLAorIAkJCQkgICAgICBxcC0+cXBuIDw8IGRldi0+cXBfdGFibGUucmRiX3NoaWZ0KTsKKyAJCWlmIChyZXQpCisgCQkJZ290byBlcnJfZXFwYzsKIAotCQlxcC0+cnEuZGJfaW5kZXggPSBtdGhjYV9hbGxvY19kYihkZXYsIE1USENBX0RCX1RZUEVfUlEsCi0JCQkJCQkgcXAtPnFwbiwgJnFwLT5ycS5kYik7Ci0JCWlmIChxcC0+cnEuZGJfaW5kZXggPCAwKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfcmRiOwotCQl9Ci0KLQkJcXAtPnNxLmRiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX1NRLAotCQkJCQkJIHFwLT5xcG4sICZxcC0+c3EuZGIpOwotCQlpZiAocXAtPnNxLmRiX2luZGV4IDwgMCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX3JxX2RiOwotCQl9CiAJfQogCiAJcmV0dXJuIDA7CiAKLWVycl9ycV9kYjoKLQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9SUSwgcXAtPnJxLmRiX2luZGV4KTsKLQotZXJyX3JkYjoKLQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLnJkYl90YWJsZSwKLQkJCXFwLT5xcG4gPDwgZGV2LT5xcF90YWJsZS5yZGJfc2hpZnQpOwotCiBlcnJfZXFwYzoKIAltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLmVxcF90YWJsZSwgcXAtPnFwbik7CiAKQEAgLTExMDUsNiArMTEyMywzNSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIG10aGNhX3VubWFwX21lbWZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LAorCQkJCXN0cnVjdCBtdGhjYV9xcCAqcXApCit7CisJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5xcF90YWJsZS5yZGJfdGFibGUsCisJCQlxcC0+cXBuIDw8IGRldi0+cXBfdGFibGUucmRiX3NoaWZ0KTsKKwltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLmVxcF90YWJsZSwgcXAtPnFwbik7CisJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5xcF90YWJsZS5xcF90YWJsZSwgcXAtPnFwbik7Cit9CisKK3N0YXRpYyBpbnQgbXRoY2FfYWxsb2NfbWVtZnJlZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCisJCQkgICAgICAgc3RydWN0IG10aGNhX3FwICpxcCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKKwkJcXAtPnJxLmRiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX1JRLAorCQkJCQkJIHFwLT5xcG4sICZxcC0+cnEuZGIpOworCQlpZiAocXAtPnJxLmRiX2luZGV4IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcXAtPnNxLmRiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX1NRLAorCQkJCQkJIHFwLT5xcG4sICZxcC0+c3EuZGIpOworCQlpZiAocXAtPnNxLmRiX2luZGV4IDwgMCkKKwkJCW10aGNhX2ZyZWVfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX1JRLCBxcC0+cnEuZGJfaW5kZXgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIG10aGNhX2ZyZWVfbWVtZnJlZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCiAJCQkgICAgICAgc3RydWN0IG10aGNhX3FwICpxcCkKIHsKQEAgLTExMTIsMTEgKzExNTksNiBAQAogCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9TUSwgcXAtPnNxLmRiX2luZGV4KTsKIAkJbXRoY2FfZnJlZV9kYihkZXYsIE1USENBX0RCX1RZUEVfUlEsIHFwLT5ycS5kYl9pbmRleCk7CiAJfQotCi0JbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5xcF90YWJsZS5yZGJfdGFibGUsCi0JCQlxcC0+cXBuIDw8IGRldi0+cXBfdGFibGUucmRiX3NoaWZ0KTsKLQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLmVxcF90YWJsZSwgcXAtPnFwbik7Ci0JbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5xcF90YWJsZS5xcF90YWJsZSwgcXAtPnFwbik7CiB9CiAKIHN0YXRpYyB2b2lkIG10aGNhX3dxX2luaXQoc3RydWN0IG10aGNhX3dxKiB3cSkKQEAgLTExNDcsMTMgKzExODksMjggQEAKIAltdGhjYV93cV9pbml0KCZxcC0+c3EpOwogCW10aGNhX3dxX2luaXQoJnFwLT5ycSk7CiAKLQlyZXQgPSBtdGhjYV9hbGxvY19tZW1mcmVlKGRldiwgcXApOworCXJldCA9IG10aGNhX21hcF9tZW1mcmVlKGRldiwgcXApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBtdGhjYV9hbGxvY193cWVfYnVmKGRldiwgcGQsIHFwKTsKIAlpZiAocmV0KSB7Ci0JCW10aGNhX2ZyZWVfbWVtZnJlZShkZXYsIHFwKTsKKwkJbXRoY2FfdW5tYXBfbWVtZnJlZShkZXYsIHFwKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSB1c2Vyc3BhY2UgUVAsIHdlJ3JlIGRvbmUgbm93LiAgVGhlIGRvb3JiZWxscworCSAqIHdpbGwgYmUgYWxsb2NhdGVkIGFuZCBidWZmZXJzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4KKwkgKiB1c2Vyc3BhY2UuCisJICovCisJaWYgKHBkLT5pYnBkLnVvYmplY3QpCisJCXJldHVybiAwOworCisJcmV0ID0gbXRoY2FfYWxsb2NfbWVtZnJlZShkZXYsIHFwKTsKKwlpZiAocmV0KSB7CisJCW10aGNhX2ZyZWVfd3FlX2J1ZihkZXYsIHFwKTsKKwkJbXRoY2FfdW5tYXBfbWVtZnJlZShkZXYsIHFwKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTExODYsMjIgKzEyNDMsMzkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbXRoY2FfYWxpZ25fcXBfc2l6ZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9xcCAqcXApCitzdGF0aWMgaW50IG10aGNhX3NldF9xcF9zaXplKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IGliX3FwX2NhcCAqY2FwLAorCQkJICAgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQogewotCWludCBpOworCS8qIFNhbml0eSBjaGVjayBRUCBzaXplIGJlZm9yZSBwcm9jZWVkaW5nICovCisJaWYgKGNhcC0+bWF4X3NlbmRfd3IgID4gNjU1MzYgfHwgY2FwLT5tYXhfcmVjdl93ciAgPiA2NTUzNiB8fAorCSAgICBjYXAtPm1heF9zZW5kX3NnZSA+IDY0ICAgIHx8IGNhcC0+bWF4X3JlY3Zfc2dlID4gNjQpCisJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCi0JCXJldHVybjsKKwlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7CisJCXFwLT5ycS5tYXggPSBjYXAtPm1heF9yZWN2X3dyID8KKwkJCXJvdW5kdXBfcG93X29mX3R3byhjYXAtPm1heF9yZWN2X3dyKSA6IDA7CisJCXFwLT5zcS5tYXggPSBjYXAtPm1heF9zZW5kX3dyID8KKwkJCXJvdW5kdXBfcG93X29mX3R3byhjYXAtPm1heF9zZW5kX3dyKSA6IDA7CisJfSBlbHNlIHsKKwkJcXAtPnJxLm1heCA9IGNhcC0+bWF4X3JlY3Zfd3I7CisJCXFwLT5zcS5tYXggPSBjYXAtPm1heF9zZW5kX3dyOworCX0KIAotCWZvciAoaSA9IDA7IDEgPDwgaSA8IHFwLT5ycS5tYXg7ICsraSkKLQkJOyAvKiBub3RoaW5nICovCisJcXAtPnJxLm1heF9ncyA9IGNhcC0+bWF4X3JlY3Zfc2dlOworCXFwLT5zcS5tYXhfZ3MgPSBtYXhfdChpbnQsIGNhcC0+bWF4X3NlbmRfc2dlLAorCQkJICAgICAgQUxJR04oY2FwLT5tYXhfaW5saW5lX2RhdGEgKyBNVEhDQV9JTkxJTkVfSEVBREVSX1NJWkUsCisJCQkJICAgIE1USENBX0lOTElORV9DSFVOS19TSVpFKSAvCisJCQkgICAgICBzaXplb2YgKHN0cnVjdCBtdGhjYV9kYXRhX3NlZykpOwogCi0JcXAtPnJxLm1heCA9IDEgPDwgaTsKKwkvKgorCSAqIEZvciBNTFggdHJhbnNwb3J0IHdlIG5lZWQgMiBleHRyYSBTL0cgZW50cmllczoKKwkgKiBvbmUgZm9yIHRoZSBoZWFkZXIgYW5kIG9uZSBmb3IgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQKKwkgKi8KKwlpZiAoKHFwLT50cmFuc3BvcnQgPT0gTUxYICYmIHFwLT5zcS5tYXhfZ3MgKyAyID4gZGV2LT5saW1pdHMubWF4X3NnKSB8fAorCSAgICBxcC0+c3EubWF4X2dzID4gZGV2LT5saW1pdHMubWF4X3NnIHx8IHFwLT5ycS5tYXhfZ3MgPiBkZXYtPmxpbWl0cy5tYXhfc2cpCisJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yIChpID0gMDsgMSA8PCBpIDwgcXAtPnNxLm1heDsgKytpKQotCQk7IC8qIG5vdGhpbmcgKi8KLQotCXFwLT5zcS5tYXggPSAxIDw8IGk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBtdGhjYV9hbGxvY19xcChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCkBAIC0xMjEwLDExICsxMjg0LDE0IEBACiAJCSAgIHN0cnVjdCBtdGhjYV9jcSAqcmVjdl9jcSwKIAkJICAgZW51bSBpYl9xcF90eXBlIHR5cGUsCiAJCSAgIGVudW0gaWJfc2lnX3R5cGUgc2VuZF9wb2xpY3ksCisJCSAgIHN0cnVjdCBpYl9xcF9jYXAgKmNhcCwKIAkJICAgc3RydWN0IG10aGNhX3FwICpxcCkKIHsKIAlpbnQgZXJyOwogCi0JbXRoY2FfYWxpZ25fcXBfc2l6ZShkZXYsIHFwKTsKKwllcnIgPSBtdGhjYV9zZXRfcXBfc2l6ZShkZXYsIGNhcCwgcXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIElCX1FQVF9SQzogcXAtPnRyYW5zcG9ydCA9IFJDOyBicmVhazsKQEAgLTEyNDcsMTQgKzEzMjQsMTcgQEAKIAkJICAgIHN0cnVjdCBtdGhjYV9jcSAqc2VuZF9jcSwKIAkJICAgIHN0cnVjdCBtdGhjYV9jcSAqcmVjdl9jcSwKIAkJICAgIGVudW0gaWJfc2lnX3R5cGUgc2VuZF9wb2xpY3ksCisJCSAgICBzdHJ1Y3QgaWJfcXBfY2FwICpjYXAsCiAJCSAgICBpbnQgcXBuLAogCQkgICAgaW50IHBvcnQsCiAJCSAgICBzdHJ1Y3QgbXRoY2Ffc3FwICpzcXApCiB7Ci0JaW50IGVyciA9IDA7CiAJdTMyIG1xcG4gPSBxcG4gKiAyICsgZGV2LT5xcF90YWJsZS5zcXBfc3RhcnQgKyBwb3J0IC0gMTsKKwlpbnQgZXJyOwogCi0JbXRoY2FfYWxpZ25fcXBfc2l6ZShkZXYsICZzcXAtPnFwKTsKKwllcnIgPSBtdGhjYV9zZXRfcXBfc2l6ZShkZXYsIGNhcCwgJnNxcC0+cXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlzcXAtPmhlYWRlcl9idWZfc2l6ZSA9IHNxcC0+cXAuc3EubWF4ICogTVRIQ0FfVURfSEVBREVSX1NJWkU7CiAJc3FwLT5oZWFkZXJfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgc3FwLT5oZWFkZXJfYnVmX3NpemUsCkBAIC0xMzEzLDggKzEzOTMsNiBAQAogCQkgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQogewogCXU4IHN0YXR1czsKLQlpbnQgc2l6ZTsKLQlpbnQgaTsKIAlzdHJ1Y3QgbXRoY2FfY3EgKnNlbmRfY3E7CiAJc3RydWN0IG10aGNhX2NxICpyZWN2X2NxOwogCkBAIC0xMzQ0LDMxICsxNDIyLDIyIEBACiAJaWYgKHFwLT5zdGF0ZSAhPSBJQl9RUFNfUkVTRVQpCiAJCW10aGNhX01PRElGWV9RUChkZXYsIE1USENBX1RSQU5TX0FOWTJSU1QsIHFwLT5xcG4sIDAsIE5VTEwsIDAsICZzdGF0dXMpOwogCi0JbXRoY2FfY3FfY2xlYW4oZGV2LCB0b19tY3EocXAtPmlicXAuc2VuZF9jcSktPmNxbiwgcXAtPnFwbik7Ci0JaWYgKHFwLT5pYnFwLnNlbmRfY3EgIT0gcXAtPmlicXAucmVjdl9jcSkKLQkJbXRoY2FfY3FfY2xlYW4oZGV2LCB0b19tY3EocXAtPmlicXAucmVjdl9jcSktPmNxbiwgcXAtPnFwbik7CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgdXNlcnNwYWNlIFFQLCB0aGUgYnVmZmVycywgTVIsIENRcyBhbmQgc28gb24KKwkgKiB3aWxsIGJlIGNsZWFuZWQgdXAgaW4gdXNlcnNwYWNlLCBzbyBhbGwgd2UgaGF2ZSB0byBkbyBpcworCSAqIHVucmVmIHRoZSBtZW0tZnJlZSB0YWJsZXMgYW5kIGZyZWUgdGhlIFFQTiBpbiBvdXIgdGFibGUuCisJICovCisJaWYgKCFxcC0+aWJxcC51b2JqZWN0KSB7CisJCW10aGNhX2NxX2NsZWFuKGRldiwgdG9fbWNxKHFwLT5pYnFwLnNlbmRfY3EpLT5jcW4sIHFwLT5xcG4pOworCQlpZiAocXAtPmlicXAuc2VuZF9jcSAhPSBxcC0+aWJxcC5yZWN2X2NxKQorCQkJbXRoY2FfY3FfY2xlYW4oZGV2LCB0b19tY3EocXAtPmlicXAucmVjdl9jcSktPmNxbiwgcXAtPnFwbik7CiAKLQltdGhjYV9mcmVlX21yKGRldiwgJnFwLT5tcik7Ci0KLQlzaXplID0gUEFHRV9BTElHTihxcC0+c2VuZF93cWVfb2Zmc2V0ICsKLQkJCSAgKHFwLT5zcS5tYXggPDwgcXAtPnNxLndxZV9zaGlmdCkpOwotCi0JaWYgKHFwLT5pc19kaXJlY3QpIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsCi0JCQkJICAgIHFwLT5xdWV1ZS5kaXJlY3QuYnVmLAotCQkJCSAgICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLmRpcmVjdCwgbWFwcGluZykpOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gUEFHRV9TSVpFOyArK2kpIHsKLQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCi0JCQkJCSAgICBxcC0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZiwKLQkJCQkJICAgIHBjaV91bm1hcF9hZGRyKCZxcC0+cXVldWUucGFnZV9saXN0W2ldLAotCQkJCQkJCSAgIG1hcHBpbmcpKTsKLQkJfQorCQltdGhjYV9mcmVlX21yKGRldiwgJnFwLT5tcik7CisJCW10aGNhX2ZyZWVfbWVtZnJlZShkZXYsIHFwKTsKKwkJbXRoY2FfZnJlZV93cWVfYnVmKGRldiwgcXApOwogCX0KIAotCWtmcmVlKHFwLT53cmlkKTsKLQotCW10aGNhX2ZyZWVfbWVtZnJlZShkZXYsIHFwKTsKKwltdGhjYV91bm1hcF9tZW1mcmVlKGRldiwgcXApOwogCiAJaWYgKGlzX3NxcChkZXYsIHFwKSkgewogCQlhdG9taWNfZGVjKCYodG9fbXBkKHFwLT5pYnFwLnBkKS0+c3FwX2NvdW50KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfdXNlci5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDI0YzFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3VzZXIuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgTVRIQ0FfVVNFUl9ICisjZGVmaW5lIE1USENBX1VTRVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBzdHJ1Y3RzIGRlZmluZWQgaW4gdGhpcyBmaWxlIHJlbWFpbiBsYWlkIG91dCBzbworICogdGhhdCB0aGV5IHBhY2sgdGhlIHNhbWUgd2F5IG9uIDMyLWJpdCBhbmQgNjQtYml0IGFyY2hpdGVjdHVyZXMgKHRvCisgKiBhdm9pZCBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiAzMi1iaXQgdXNlcnNwYWNlIGFuZCA2NC1iaXQga2VybmVscykuCisgKiBJbiBwYXJ0aWN1bGFyIGRvIG5vdCB1c2UgcG9pbnRlciB0eXBlcyAtLSBwYXNzIHBvaW50ZXJzIGluIF9fdTY0CisgKiBpbnN0ZWFkLgorICovCisKK3N0cnVjdCBtdGhjYV9hbGxvY191Y29udGV4dF9yZXNwIHsKKwlfX3UzMiBxcF90YWJfc2l6ZTsKKwlfX3UzMiB1YXJjX3NpemU7Cit9OworCitzdHJ1Y3QgbXRoY2FfYWxsb2NfcGRfcmVzcCB7CisJX191MzIgcGRuOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IG10aGNhX2NyZWF0ZV9jcSB7CisJX191MzIgbGtleTsKKwlfX3UzMiBwZG47CisJX191NjQgYXJtX2RiX3BhZ2U7CisJX191NjQgc2V0X2RiX3BhZ2U7CisJX191MzIgYXJtX2RiX2luZGV4OworCV9fdTMyIHNldF9kYl9pbmRleDsKK307CisKK3N0cnVjdCBtdGhjYV9jcmVhdGVfY3FfcmVzcCB7CisJX191MzIgY3FuOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IG10aGNhX2NyZWF0ZV9xcCB7CisJX191MzIgbGtleTsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCBzcV9kYl9wYWdlOworCV9fdTY0IHJxX2RiX3BhZ2U7CisJX191MzIgc3FfZGJfaW5kZXg7CisJX191MzIgcnFfZGJfaW5kZXg7Cit9OworCisjZW5kaWYgLyogTVRIQ0FfVVNFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl91c2VyX3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl91c2VyX3ZlcmJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MTM3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3VzZXJfdmVyYnMuaApAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogaWJfdXNlcl92ZXJicy5oIDI3MDggMjAwNS0wNi0yNCAxNzoyNzoyMVogcm9sYW5kICQKKyAqLworCisjaWZuZGVmIElCX1VTRVJfVkVSQlNfSAorI2RlZmluZSBJQl9VU0VSX1ZFUkJTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBJbmNyZW1lbnQgdGhpcyB2YWx1ZSBpZiBhbnkgY2hhbmdlcyB0aGF0IGJyZWFrIHVzZXJzcGFjZSBBQkkKKyAqIGNvbXBhdGliaWxpdHkgYXJlIG1hZGUuCisgKi8KKyNkZWZpbmUgSUJfVVNFUl9WRVJCU19BQklfVkVSU0lPTgkxCisKK2VudW0geworCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1BBUkFNUywKKwlJQl9VU0VSX1ZFUkJTX0NNRF9HRVRfQ09OVEVYVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9ERVZJQ0UsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUE9SVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9HSUQsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUEtFWSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9BTExPQ19QRCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERUFMTE9DX1BELAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9NT0RJRllfQUgsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfQUgsCisJSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRUdfTVIsCisJSUJfVVNFUl9WRVJCU19DTURfUkVHX1NNUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRVJFR19NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVJFR19NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9BTExPQ19NVywKKwlJQl9VU0VSX1ZFUkJTX0NNRF9CSU5EX01XLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFQUxMT0NfTVcsCisJSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX1JFU0laRV9DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVNUUk9ZX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX1BPTExfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfUEVFS19DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRVFfTk9USUZZX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9RUCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9RUCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9NT0RJRllfUVAsCisJSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9RUCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QT1NUX1NFTkQsCisJSUJfVVNFUl9WRVJCU19DTURfUE9TVF9SRUNWLAorCUlCX1VTRVJfVkVSQlNfQ01EX0FUVEFDSF9NQ0FTVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVRBQ0hfTUNBU1QKK307CisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCBhbGwgc3RydWN0cyBkZWZpbmVkIGluIHRoaXMgZmlsZSByZW1haW4gbGFpZCBvdXQgc28KKyAqIHRoYXQgdGhleSBwYWNrIHRoZSBzYW1lIHdheSBvbiAzMi1iaXQgYW5kIDY0LWJpdCBhcmNoaXRlY3R1cmVzICh0bworICogYXZvaWQgaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gMzItYml0IHVzZXJzcGFjZSBhbmQgNjQtYml0IGtlcm5lbHMpLgorICogSW4gcGFydGljdWxhciBkbyBub3QgdXNlIHBvaW50ZXIgdHlwZXMgLS0gcGFzcyBwb2ludGVycyBpbiBfX3U2NAorICogaW5zdGVhZC4KKyAqLworCitzdHJ1Y3QgaWJfdXZlcmJzX2FzeW5jX2V2ZW50X2Rlc2MgeworCV9fdTY0IGVsZW1lbnQ7CisJX191MzIgZXZlbnRfdHlwZTsJLyogZW51bSBpYl9ldmVudF90eXBlICovCisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NvbXBfZXZlbnRfZGVzYyB7CisJX191NjQgY3FfaGFuZGxlOworfTsKKworLyoKKyAqIEFsbCBjb21tYW5kcyBmcm9tIHVzZXJzcGFjZSBzaG91bGQgc3RhcnQgd2l0aCBhIF9fdTMyIGNvbW1hbmQgZmllbGQKKyAqIGZvbGxvd2VkIGJ5IF9fdTE2IGluX3dvcmRzIGFuZCBvdXRfd29yZHMgZmllbGRzICh3aGljaCBnaXZlIHRoZQorICogbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGJsb2NrIGFuZCByZXNwb25zZSBidWZmZXIgaWYgYW55IGluIDMyLWJpdAorICogd29yZHMpLiAgVGhlIGtlcm5lbCBkcml2ZXIgd2lsbCByZWFkIHRoZXNlIGZpZWxkcyBmaXJzdCBhbmQgcmVhZAorICogdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgc3RydWN0IGJhc2VkIG9uIHRoZXNlIHZhbHVlLgorICovCisKK3N0cnVjdCBpYl91dmVyYnNfY21kX2hkciB7CisJX191MzIgY29tbWFuZDsKKwlfX3UxNiBpbl93b3JkczsKKwlfX3UxNiBvdXRfd29yZHM7Cit9OworCisvKgorICogTm8gZHJpdmVyX2RhdGEgZm9yICJxdWVyeSBwYXJhbXMiIGNvbW1hbmQsIHNpbmNlIHRoaXMgaXMgaW50ZW5kZWQKKyAqIHRvIGJlIGEgY29yZSBmdW5jdGlvbiB3aXRoIG5vIHBvc3NpYmxlIGRldmljZSBkZXBlbmRlbmNlLgorICovCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtcyB7CisJX191NjQgcmVzcG9uc2U7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtc19yZXNwIHsKKwlfX3UzMiBudW1fY3FfZXZlbnRzOworfTsKKworc3RydWN0IGliX3V2ZXJic19nZXRfY29udGV4dCB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgY3FfZmRfdGFiOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19nZXRfY29udGV4dF9yZXNwIHsKKwlfX3UzMiBhc3luY19mZDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfZGV2aWNlIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfZGV2aWNlX3Jlc3AgeworCV9fdTY0IGZ3X3ZlcjsKKwlfX3U2NCBub2RlX2d1aWQ7CisJX191NjQgc3lzX2ltYWdlX2d1aWQ7CisJX191NjQgbWF4X21yX3NpemU7CisJX191NjQgcGFnZV9zaXplX2NhcDsKKwlfX3UzMiB2ZW5kb3JfaWQ7CisJX191MzIgdmVuZG9yX3BhcnRfaWQ7CisJX191MzIgaHdfdmVyOworCV9fdTMyIG1heF9xcDsKKwlfX3UzMiBtYXhfcXBfd3I7CisJX191MzIgZGV2aWNlX2NhcF9mbGFnczsKKwlfX3UzMiBtYXhfc2dlOworCV9fdTMyIG1heF9zZ2VfcmQ7CisJX191MzIgbWF4X2NxOworCV9fdTMyIG1heF9jcWU7CisJX191MzIgbWF4X21yOworCV9fdTMyIG1heF9wZDsKKwlfX3UzMiBtYXhfcXBfcmRfYXRvbTsKKwlfX3UzMiBtYXhfZWVfcmRfYXRvbTsKKwlfX3UzMiBtYXhfcmVzX3JkX2F0b207CisJX191MzIgbWF4X3FwX2luaXRfcmRfYXRvbTsKKwlfX3UzMiBtYXhfZWVfaW5pdF9yZF9hdG9tOworCV9fdTMyIGF0b21pY19jYXA7CisJX191MzIgbWF4X2VlOworCV9fdTMyIG1heF9yZGQ7CisJX191MzIgbWF4X213OworCV9fdTMyIG1heF9yYXdfaXB2Nl9xcDsKKwlfX3UzMiBtYXhfcmF3X2V0aHlfcXA7CisJX191MzIgbWF4X21jYXN0X2dycDsKKwlfX3UzMiBtYXhfbWNhc3RfcXBfYXR0YWNoOworCV9fdTMyIG1heF90b3RhbF9tY2FzdF9xcF9hdHRhY2g7CisJX191MzIgbWF4X2FoOworCV9fdTMyIG1heF9mbXI7CisJX191MzIgbWF4X21hcF9wZXJfZm1yOworCV9fdTMyIG1heF9zcnE7CisJX191MzIgbWF4X3NycV93cjsKKwlfX3UzMiBtYXhfc3JxX3NnZTsKKwlfX3UxNiBtYXhfcGtleXM7CisJX191OCAgbG9jYWxfY2FfYWNrX2RlbGF5OworCV9fdTggIHBoeXNfcG9ydF9jbnQ7CisJX191OCAgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BvcnQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIHJlc2VydmVkWzddOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9wb3J0X3Jlc3AgeworCV9fdTMyIHBvcnRfY2FwX2ZsYWdzOworCV9fdTMyIG1heF9tc2dfc3o7CisJX191MzIgYmFkX3BrZXlfY250cjsKKwlfX3UzMiBxa2V5X3Zpb2xfY250cjsKKwlfX3UzMiBnaWRfdGJsX2xlbjsKKwlfX3UxNiBwa2V5X3RibF9sZW47CisJX191MTYgbGlkOworCV9fdTE2IHNtX2xpZDsKKwlfX3U4ICBzdGF0ZTsKKwlfX3U4ICBtYXhfbXR1OworCV9fdTggIGFjdGl2ZV9tdHU7CisJX191OCAgbG1jOworCV9fdTggIG1heF92bF9udW07CisJX191OCAgc21fc2w7CisJX191OCAgc3VibmV0X3RpbWVvdXQ7CisJX191OCAgaW5pdF90eXBlX3JlcGx5OworCV9fdTggIGFjdGl2ZV93aWR0aDsKKwlfX3U4ICBhY3RpdmVfc3BlZWQ7CisJX191OCAgcGh5c19zdGF0ZTsKKwlfX3U4ICByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfZ2lkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U4ICBwb3J0X251bTsKKwlfX3U4ICBpbmRleDsKKwlfX3U4ICByZXNlcnZlZFs2XTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfZ2lkX3Jlc3AgeworCV9fdTggIGdpZFsxNl07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BrZXkgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIGluZGV4OworCV9fdTggIHJlc2VydmVkWzZdOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9wa2V5X3Jlc3AgeworCV9fdTE2IHBrZXk7CisJX191MTYgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2FsbG9jX3BkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfYWxsb2NfcGRfcmVzcCB7CisJX191MzIgcGRfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19kZWFsbG9jX3BkIHsKKwlfX3UzMiBwZF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3JlZ19tciB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgc3RhcnQ7CisJX191NjQgbGVuZ3RoOworCV9fdTY0IGhjYV92YTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgYWNjZXNzX2ZsYWdzOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19yZWdfbXJfcmVzcCB7CisJX191MzIgbXJfaGFuZGxlOworCV9fdTMyIGxrZXk7CisJX191MzIgcmtleTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVyZWdfbXIgeworCV9fdTMyIG1yX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2NxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBjcWU7CisJX191MzIgZXZlbnRfaGFuZGxlcjsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2NxX3Jlc3AgeworCV9fdTMyIGNxX2hhbmRsZTsKKwlfX3UzMiBjcWU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3EgeworCV9fdTMyIGNxX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgc2VuZF9jcV9oYW5kbGU7CisJX191MzIgcmVjdl9jcV9oYW5kbGU7CisJX191MzIgc3JxX2hhbmRsZTsKKwlfX3UzMiBtYXhfc2VuZF93cjsKKwlfX3UzMiBtYXhfcmVjdl93cjsKKwlfX3UzMiBtYXhfc2VuZF9zZ2U7CisJX191MzIgbWF4X3JlY3Zfc2dlOworCV9fdTMyIG1heF9pbmxpbmVfZGF0YTsKKwlfX3U4ICBzcV9zaWdfYWxsOworCV9fdTggIHFwX3R5cGU7CisJX191OCAgaXNfc3JxOworCV9fdTggIHJlc2VydmVkOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXBfcmVzcCB7CisJX191MzIgcXBfaGFuZGxlOworCV9fdTMyIHFwbjsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdCBuZWVkcyB0byByZW1haW4gYSBtdWx0aXBsZSBvZiA4IGJ5dGVzIHRvIGtlZXAgdGhlCisgKiBhbGlnbm1lbnQgb2YgdGhlIG1vZGlmeSBRUCBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgaWJfdXZlcmJzX3FwX2Rlc3QgeworCV9fdTggIGRnaWRbMTZdOworCV9fdTMyIGZsb3dfbGFiZWw7CisJX191MTYgZGxpZDsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3U4ICBzZ2lkX2luZGV4OworCV9fdTggIGhvcF9saW1pdDsKKwlfX3U4ICB0cmFmZmljX2NsYXNzOworCV9fdTggIHNsOworCV9fdTggIHNyY19wYXRoX2JpdHM7CisJX191OCAgc3RhdGljX3JhdGU7CisJX191OCAgaXNfZ2xvYmFsOworCV9fdTggIHBvcnRfbnVtOworfTsKKworc3RydWN0IGliX3V2ZXJic19tb2RpZnlfcXAgeworCXN0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCBkZXN0OworCXN0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCBhbHRfZGVzdDsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MzIgYXR0cl9tYXNrOworCV9fdTMyIHFrZXk7CisJX191MzIgcnFfcHNuOworCV9fdTMyIHNxX3BzbjsKKwlfX3UzMiBkZXN0X3FwX251bTsKKwlfX3UzMiBxcF9hY2Nlc3NfZmxhZ3M7CisJX191MTYgcGtleV9pbmRleDsKKwlfX3UxNiBhbHRfcGtleV9pbmRleDsKKwlfX3U4ICBxcF9zdGF0ZTsKKwlfX3U4ICBjdXJfcXBfc3RhdGU7CisJX191OCAgcGF0aF9tdHU7CisJX191OCAgcGF0aF9taWdfc3RhdGU7CisJX191OCAgZW5fc3FkX2FzeW5jX25vdGlmeTsKKwlfX3U4ICBtYXhfcmRfYXRvbWljOworCV9fdTggIG1heF9kZXN0X3JkX2F0b21pYzsKKwlfX3U4ICBtaW5fcm5yX3RpbWVyOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIHRpbWVvdXQ7CisJX191OCAgcmV0cnlfY250OworCV9fdTggIHJucl9yZXRyeTsKKwlfX3U4ICBhbHRfcG9ydF9udW07CisJX191OCAgYWx0X3RpbWVvdXQ7CisJX191OCAgcmVzZXJ2ZWRbMl07CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX21vZGlmeV9xcF9yZXNwIHsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9xcCB7CisJX191MzIgcXBfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19hdHRhY2hfbWNhc3QgeworCV9fdTggIGdpZFsxNl07CisJX191MzIgcXBfaGFuZGxlOworCV9fdTE2IG1saWQ7CisJX191MTYgcmVzZXJ2ZWQ7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2RldGFjaF9tY2FzdCB7CisJX191OCAgZ2lkWzE2XTsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MTYgbWxpZDsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKKyNlbmRpZiAvKiBJQl9VU0VSX1ZFUkJTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl92ZXJicy5oCmluZGV4IGNmMDFmMDQuLmU1YmQ5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2luY2x1ZGUvaWJfdmVyYnMuaApAQCAtNCw2ICs0LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVm9sdGFpcmUgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC00MSw3ICs0MiwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKwogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiB1bmlvbiBpYl9naWQgewogCXU4CXJhd1sxNl07CkBAIC01NDQsNyArNTQ4LDcgQEAKIAlpbnQJCQludW1fc2dlOwogCWVudW0gaWJfd3Jfb3Bjb2RlCW9wY29kZTsKIAlpbnQJCQlzZW5kX2ZsYWdzOwotCXUzMgkJCWltbV9kYXRhOworCV9fYmUzMgkJCWltbV9kYXRhOwogCXVuaW9uIHsKIAkJc3RydWN0IHsKIAkJCXU2NAlyZW1vdGVfYWRkcjsKQEAgLTYxOCwyOSArNjIyLDg2IEBACiAJdTgJcGFnZV9zaXplOwogfTsKIAorc3RydWN0IGliX3Vjb250ZXh0IHsKKwlzdHJ1Y3QgaWJfZGV2aWNlICAgICAgICpkZXZpY2U7CisJc3RydWN0IGxpc3RfaGVhZAlwZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJbXJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW13X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAljcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJcXBfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXNycV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJYWhfbGlzdDsKKwlzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOworfTsKKworc3RydWN0IGliX3VvYmplY3QgeworCXU2NAkJCXVzZXJfaGFuZGxlOwkvKiBoYW5kbGUgZ2l2ZW4gdG8gdXMgYnkgdXNlcnNwYWNlICovCisJc3RydWN0IGliX3Vjb250ZXh0ICAgICAqY29udGV4dDsJLyogYXNzb2NpYXRlZCB1c2VyIGNvbnRleHQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CQkvKiBsaW5rIHRvIGNvbnRleHQncyBsaXN0ICovCisJdTMyCQkJaWQ7CQkvKiBpbmRleCBpbnRvIGtlcm5lbCBpZHIgKi8KK307CisKK3N0cnVjdCBpYl91bWVtIHsKKwl1bnNpZ25lZCBsb25nCQl1c2VyX2Jhc2U7CisJdW5zaWduZWQgbG9uZwkJdmlydF9iYXNlOworCXNpemVfdAkJCWxlbmd0aDsKKwlpbnQJCQlvZmZzZXQ7CisJaW50CQkJcGFnZV9zaXplOworCWludCAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOworCXN0cnVjdCBsaXN0X2hlYWQJY2h1bmtfbGlzdDsKK307CisKK3N0cnVjdCBpYl91bWVtX2NodW5rIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbmVudHM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbm1hcDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgICBwYWdlX2xpc3RbMF07Cit9OworCitzdHJ1Y3QgaWJfdWRhdGEgeworCXZvaWQgX191c2VyICppbmJ1ZjsKKwl2b2lkIF9fdXNlciAqb3V0YnVmOworCXNpemVfdCAgICAgICBpbmxlbjsKKwlzaXplX3QgICAgICAgb3V0bGVuOworfTsKKworI2RlZmluZSBJQl9VTUVNX01BWF9QQUdFX0NIVU5LCQkJCQkJXAorCSgoUEFHRV9TSVpFIC0gb2Zmc2V0b2Yoc3RydWN0IGliX3VtZW1fY2h1bmssIHBhZ2VfbGlzdCkpIC8JXAorCSAoKHZvaWQgKikgJigoc3RydWN0IGliX3VtZW1fY2h1bmsgKikgMCktPnBhZ2VfbGlzdFsxXSAtCVwKKwkgICh2b2lkICopICYoKHN0cnVjdCBpYl91bWVtX2NodW5rICopIDApLT5wYWdlX2xpc3RbMF0pKQorCitzdHJ1Y3QgaWJfdW1lbV9vYmplY3QgeworCXN0cnVjdCBpYl91b2JqZWN0CXVvYmplY3Q7CisJc3RydWN0IGliX3VtZW0JCXVtZW07Cit9OworCiBzdHJ1Y3QgaWJfcGQgewotCXN0cnVjdCBpYl9kZXZpY2UgKmRldmljZTsKLQlhdG9taWNfdCAgICAgICAgICB1c2VjbnQ7IC8qIGNvdW50IGFsbCByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgaWJfZGV2aWNlICAgICAgICpkZXZpY2U7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAqdW9iamVjdDsKKwlhdG9taWNfdCAgICAgICAgICAJdXNlY250OyAvKiBjb3VudCBhbGwgcmVzb3VyY2VzICovCiB9OwogCiBzdHJ1Y3QgaWJfYWggewogCXN0cnVjdCBpYl9kZXZpY2UJKmRldmljZTsKIAlzdHJ1Y3QgaWJfcGQJCSpwZDsKKwlzdHJ1Y3QgaWJfdW9iamVjdAkqdW9iamVjdDsKIH07CiAKIHR5cGVkZWYgdm9pZCAoKmliX2NvbXBfaGFuZGxlcikoc3RydWN0IGliX2NxICpjcSwgdm9pZCAqY3FfY29udGV4dCk7CiAKIHN0cnVjdCBpYl9jcSB7Ci0Jc3RydWN0IGliX2RldmljZSAqZGV2aWNlOwotCWliX2NvbXBfaGFuZGxlciAgIGNvbXBfaGFuZGxlcjsKLQl2b2lkICAgICAgICAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7Ci0Jdm9pZCAqICAgICAgICAgICAgY3FfY29udGV4dDsKLQlpbnQgICAgICAgICAgICAgICBjcWU7Ci0JYXRvbWljX3QgICAgICAgICAgdXNlY250OyAvKiBjb3VudCBudW1iZXIgb2Ygd29yayBxdWV1ZXMgKi8KKwlzdHJ1Y3QgaWJfZGV2aWNlICAgICAgICpkZXZpY2U7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAqdW9iamVjdDsKKwlpYl9jb21wX2hhbmRsZXIgICAJY29tcF9oYW5kbGVyOworCXZvaWQgICAgICAgICAgICAgICAgICAoKmV2ZW50X2hhbmRsZXIpKHN0cnVjdCBpYl9ldmVudCAqLCB2b2lkICopOworCXZvaWQgKiAgICAgICAgICAgIAljcV9jb250ZXh0OworCWludCAgICAgICAgICAgICAgIAljcWU7CisJYXRvbWljX3QgICAgICAgICAgCXVzZWNudDsgLyogY291bnQgbnVtYmVyIG9mIHdvcmsgcXVldWVzICovCiB9OwogCiBzdHJ1Y3QgaWJfc3JxIHsKIAlzdHJ1Y3QgaWJfZGV2aWNlCSpkZXZpY2U7CisJc3RydWN0IGliX3VvYmplY3QJKnVvYmplY3Q7CiAJc3RydWN0IGliX3BkCQkqcGQ7CiAJdm9pZAkJCSpzcnFfY29udGV4dDsKIAlhdG9taWNfdAkJdXNlY250OwpAQCAtNjUyLDYgKzcxMyw3IEBACiAJc3RydWN0IGliX2NxCSAgICAgICAqc2VuZF9jcTsKIAlzdHJ1Y3QgaWJfY3EJICAgICAgICpyZWN2X2NxOwogCXN0cnVjdCBpYl9zcnEJICAgICAgICpzcnE7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAqdW9iamVjdDsKIAl2b2lkICAgICAgICAgICAgICAgICAgKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgaWJfZXZlbnQgKiwgdm9pZCAqKTsKIAl2b2lkCQkgICAgICAgKnFwX2NvbnRleHQ7CiAJdTMyCQkJcXBfbnVtOwpAQCAtNjU5LDE2ICs3MjEsMTggQEAKIH07CiAKIHN0cnVjdCBpYl9tciB7Ci0Jc3RydWN0IGliX2RldmljZSAqZGV2aWNlOwotCXN0cnVjdCBpYl9wZCAgICAgKnBkOwotCXUzMgkJICBsa2V5OwotCXUzMgkJICBya2V5OwotCWF0b21pY190ICAgICAgICAgIHVzZWNudDsgLyogY291bnQgbnVtYmVyIG9mIE1XcyAqLworCXN0cnVjdCBpYl9kZXZpY2UgICpkZXZpY2U7CisJc3RydWN0IGliX3BkCSAgKnBkOworCXN0cnVjdCBpYl91b2JqZWN0ICp1b2JqZWN0OworCXUzMgkJICAgbGtleTsKKwl1MzIJCSAgIHJrZXk7CisJYXRvbWljX3QJICAgdXNlY250OyAvKiBjb3VudCBudW1iZXIgb2YgTVdzICovCiB9OwogCiBzdHJ1Y3QgaWJfbXcgewogCXN0cnVjdCBpYl9kZXZpY2UJKmRldmljZTsKIAlzdHJ1Y3QgaWJfcGQJCSpwZDsKKwlzdHJ1Y3QgaWJfdW9iamVjdAkqdW9iamVjdDsKIAl1MzIJCQlya2V5OwogfTsKIApAQCAtNzM3LDcgKzgwMSwxNCBAQAogCWludAkJICAgICAgICAgICAoKm1vZGlmeV9wb3J0KShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UsCiAJCQkJCQkgIHU4IHBvcnRfbnVtLCBpbnQgcG9ydF9tb2RpZnlfbWFzaywKIAkJCQkJCSAgc3RydWN0IGliX3BvcnRfbW9kaWZ5ICpwb3J0X21vZGlmeSk7Ci0Jc3RydWN0IGliX3BkICogICAgICAgICAgICAgKCphbGxvY19wZCkoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKTsKKwlzdHJ1Y3QgaWJfdWNvbnRleHQgKiAgICAgICAoKmFsbG9jX3Vjb250ZXh0KShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UsCisJCQkJCQkgICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVhbGxvY191Y29udGV4dCkoc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0KTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKm1tYXApKHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCXN0cnVjdCBpYl9wZCAqICAgICAgICAgICAgICgqYWxsb2NfcGQpKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICAgIHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkJICAgICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVhbGxvY19wZCkoc3RydWN0IGliX3BkICpwZCk7CiAJc3RydWN0IGliX2FoICogICAgICAgICAgICAgKCpjcmVhdGVfYWgpKHN0cnVjdCBpYl9wZCAqcGQsCiAJCQkJCQlzdHJ1Y3QgaWJfYWhfYXR0ciAqYWhfYXR0cik7CkBAIC03NDcsNyArODE4LDggQEAKIAkJCQkJICAgICAgIHN0cnVjdCBpYl9haF9hdHRyICphaF9hdHRyKTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3Ryb3lfYWgpKHN0cnVjdCBpYl9haCAqYWgpOwogCXN0cnVjdCBpYl9xcCAqICAgICAgICAgICAgICgqY3JlYXRlX3FwKShzdHJ1Y3QgaWJfcGQgKnBkLAotCQkJCQkJc3RydWN0IGliX3FwX2luaXRfYXR0ciAqcXBfaW5pdF9hdHRyKTsKKwkJCQkJCXN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKnFwX2luaXRfYXR0ciwKKwkJCQkJCXN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqbW9kaWZ5X3FwKShzdHJ1Y3QgaWJfcXAgKnFwLAogCQkJCQkJc3RydWN0IGliX3FwX2F0dHIgKnFwX2F0dHIsCiAJCQkJCQlpbnQgcXBfYXR0cl9tYXNrKTsKQEAgLTc2Miw4ICs4MzQsOSBAQAogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqcG9zdF9yZWN2KShzdHJ1Y3QgaWJfcXAgKnFwLAogCQkJCQkJc3RydWN0IGliX3JlY3Zfd3IgKnJlY3Zfd3IsCiAJCQkJCQlzdHJ1Y3QgaWJfcmVjdl93ciAqKmJhZF9yZWN2X3dyKTsKLQlzdHJ1Y3QgaWJfY3EgKiAgICAgICAgICAgICAoKmNyZWF0ZV9jcSkoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLAotCQkJCQkJaW50IGNxZSk7CisJc3RydWN0IGliX2NxICogICAgICAgICAgICAgKCpjcmVhdGVfY3EpKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwgaW50IGNxZSwKKwkJCQkJCXN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkJCXN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdHJveV9jcSkoc3RydWN0IGliX2NxICpjcSk7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXNpemVfY3EpKHN0cnVjdCBpYl9jcSAqY3EsIGludCAqY3FlKTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKnBvbGxfY3EpKHN0cnVjdCBpYl9jcSAqY3EsIGludCBudW1fZW50cmllcywKQEAgLTc4MCw2ICs4NTMsMTAgQEAKIAkJCQkJCSAgaW50IG51bV9waHlzX2J1ZiwKIAkJCQkJCSAgaW50IG1yX2FjY2Vzc19mbGFncywKIAkJCQkJCSAgdTY0ICppb3ZhX3N0YXJ0KTsKKwlzdHJ1Y3QgaWJfbXIgKiAgICAgICAgICAgICAoKnJlZ191c2VyX21yKShzdHJ1Y3QgaWJfcGQgKnBkLAorCQkJCQkJICBzdHJ1Y3QgaWJfdW1lbSAqcmVnaW9uLAorCQkJCQkJICBpbnQgbXJfYWNjZXNzX2ZsYWdzLAorCQkJCQkJICBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKnF1ZXJ5X21yKShzdHJ1Y3QgaWJfbXIgKm1yLAogCQkJCQkgICAgICAgc3RydWN0IGliX21yX2F0dHIgKm1yX2F0dHIpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVyZWdfbXIpKHN0cnVjdCBpYl9tciAqbXIpOwpAQCAtODE3LDYgKzg5NCw3IEBACiAJCQkJCQkgIHN0cnVjdCBpYl9tYWQgKmluX21hZCwKIAkJCQkJCSAgc3RydWN0IGliX21hZCAqb3V0X21hZCk7CiAKKwlzdHJ1Y3QgbW9kdWxlICAgICAgICAgICAgICAgKm93bmVyOwogCXN0cnVjdCBjbGFzc19kZXZpY2UgICAgICAgICAgY2xhc3NfZGV2OwogCXN0cnVjdCBrb2JqZWN0ICAgICAgICAgICAgICAgcG9ydHNfcGFyZW50OwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgcG9ydF9saXN0OwpAQCAtODUyLDYgKzkzMCwxNiBAQAogdm9pZCAgaWJfc2V0X2NsaWVudF9kYXRhKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwgc3RydWN0IGliX2NsaWVudCAqY2xpZW50LAogCQkJIHZvaWQgKmRhdGEpOwogCitzdGF0aWMgaW5saW5lIGludCBpYl9jb3B5X2Zyb21fdWRhdGEodm9pZCAqZGVzdCwgc3RydWN0IGliX3VkYXRhICp1ZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gY29weV9mcm9tX3VzZXIoZGVzdCwgdWRhdGEtPmluYnVmLCBsZW4pID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGliX2NvcHlfdG9fdWRhdGEoc3RydWN0IGliX3VkYXRhICp1ZGF0YSwgdm9pZCAqc3JjLCBzaXplX3QgbGVuKQoreworCXJldHVybiBjb3B5X3RvX3VzZXIodWRhdGEtPm91dGJ1Ziwgc3JjLCBsZW4pID8gLUVGQVVMVCA6IDA7Cit9CisKIGludCBpYl9yZWdpc3Rlcl9ldmVudF9oYW5kbGVyICAoc3RydWN0IGliX2V2ZW50X2hhbmRsZXIgKmV2ZW50X2hhbmRsZXIpOwogaW50IGliX3VucmVnaXN0ZXJfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnRfaGFuZGxlciAqZXZlbnRfaGFuZGxlcik7CiB2b2lkIGliX2Rpc3BhdGNoX2V2ZW50KHN0cnVjdCBpYl9ldmVudCAqZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMKaW5kZXggMDMzNDU2Yi4uZTk5NjE4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FtaWpveS5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogc3RhdGljIHZvaWQgYW1pam95X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlkb3duKCZhbWlqb3lzZW0pOworCWRvd24oJmFtaWpveV9zZW0pOwogCWlmICghLS1hbWlqb3lfdXNlZCkKIAkJZnJlZV9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBhbWlqb3lfaW50ZXJydXB0KTsKIAl1cCgmYW1pam95X3NlbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYwppbmRleCBlZTc1MGU5Li5kYjliYWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE2MSwxMSArMTYwLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF2bWNzX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNTAwLDYgKzQ5NCw3IEBACiAJCS5uYW1lCT0gImF2bV9jcyIsCiAJfSwKIAkuYXR0YWNoCT0gYXZtY3NfYXR0YWNoLAorCS5ldmVudAk9IGF2bWNzX2V2ZW50LAogCS5kZXRhY2gJPSBhdm1jc19kZXRhY2gsCiAJLmlkX3RhYmxlID0gYXZtY3NfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKaW5kZXggNjdjNjBlMC4uMGUyMjk5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE4MywxMSArMTgyLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF2bWExY3NfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC01MTQsNiArNTA4LDcgQEAKIAkJLm5hbWUJPSAiYXZtYTFfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBhdm1hMWNzX2F0dGFjaCwKKwkuZXZlbnQJCT0gYXZtYTFjc19ldmVudCwKIAkuZGV0YWNoCQk9IGF2bWExY3NfZGV0YWNoLAogCS5pZF90YWJsZQk9IGF2bWExY3NfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jCmluZGV4IDkxNDZiZTUuLjZmYzY4NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2FfY3MuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjEyLDExICsyMTEsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0gICAgICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLSAgICAgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLSAgICAgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmZWxzYV9jc19ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTUyMSw2ICs1MTUsNyBAQAogCQkubmFtZQk9ICJlbHNhX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gZWxzYV9jc19hdHRhY2gsCisJLmV2ZW50CQk9IGVsc2FfY3NfZXZlbnQsCiAJLmRldGFjaAkJPSBlbHNhX2NzX2RldGFjaCwKIAkuaWRfdGFibGUJPSBlbHNhX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwxLmMKaW5kZXggYWM4OTk1MC4uYmFiMzU2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDEuYwpAQCAtMjc5LDcgKzI3OSw4IEBACiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDFfUFVMTF9SRVEsICZzdC0+bDEuRmxhZ3MpKQogCQlzdC0+bDEubDFsMihzdCwgUEhfUFVMTCB8IENPTkZJUk0sIE5VTEwpOwogCWlmICghdGVzdF9iaXQoQkNfRkxHX0FDVElWLCAmYmNzLT5GbGFnKSkgewotCQlpZiAoIXRlc3RfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKSAmJiAoIXNrYl9xdWV1ZV9sZW4oJmJjcy0+c3F1ZXVlKSkpIHsKKwkJaWYgKCF0ZXN0X2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZykgJiYKKwkJICAgIHNrYl9xdWV1ZV9lbXB0eSgmYmNzLT5zcXVldWUpKSB7CiAJCQlzdC0+bDIubDJsMShzdCwgUEhfREVBQ1RJVkFURSB8IENPTkZJUk0sIE5VTEwpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jCmluZGV4IDkwMjI1ODMuLjE2MTVjMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMKQEAgLTEwOCw3ICsxMDgsOCBAQAogc3RhdGljIHZvaWQKIHNldF9wZWVyX2J1c3koc3RydWN0IExheWVyMiAqbDIpIHsKIAl0ZXN0X2FuZF9zZXRfYml0KEZMR19QRUVSX0JVU1ksICZsMi0+ZmxhZyk7Ci0JaWYgKHNrYl9xdWV1ZV9sZW4oJmwyLT5pX3F1ZXVlKSB8fCBza2JfcXVldWVfbGVuKCZsMi0+dWlfcXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZsMi0+aV9xdWV1ZSkgfHwKKwkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmbDItPnVpX3F1ZXVlKSkKIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTDJCTE9DSywgJmwyLT5mbGFnKTsKIH0KIApAQCAtNzU0LDcgKzc1NSw3IEBACiAJCXN0LT5sMi5sMmwzKHN0LCBETF9FU1RBQkxJU0ggfCBJTkRJQ0FUSU9OLCBOVUxMKTsKIAogCWlmICgoU1RfTDJfNz09c3RhdGUpIHx8IChTVF9MMl84ID09IHN0YXRlKSkKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnN0LT5sMi5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnN0LT5sMi5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKIAkJCXN0LT5sMi5sMmwxKHN0LCBQSF9QVUxMIHwgUkVRVUVTVCwgTlVMTCk7CiB9CiAKQEAgLTgxMCw3ICs4MTEsNyBAQAogCWlmIChwciAhPSAtMSkKIAkJc3QtPmwyLmwybDMoc3QsIHByLCBOVUxMKTsKIAotCWlmIChza2JfcXVldWVfbGVuKCZzdC0+bDIuaV9xdWV1ZSkgJiYgY2Fuc2VuZChzdCkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnN0LT5sMi5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKIAkJc3QtPmwyLmwybDEoc3QsIFBIX1BVTEwgfCBSRVFVRVNULCBOVUxMKTsKIH0KIApAQCAtMTAxNCw3ICsxMDE1LDcgQEAKIAkJCWlmKHR5cCAhPSBSUikgRnNtRGVsVGltZXIoJnN0LT5sMi50MjAzLCA5KTsKIAkJCXJlc3RhcnRfdDIwMChzdCwgMTIpOwogCQl9Ci0JCWlmIChza2JfcXVldWVfbGVuKCZzdC0+bDIuaV9xdWV1ZSkgJiYgKHR5cCA9PSBSUikpCisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzdC0+bDIuaV9xdWV1ZSkgJiYgKHR5cCA9PSBSUikpCiAJCQlzdC0+bDIubDJsMShzdCwgUEhfUFVMTCB8IFJFUVVFU1QsIE5VTEwpOwogCX0gZWxzZQogCQlucmVycm9ycmVjb3ZlcnkoZmkpOwpAQCAtMTEyMCw3ICsxMTIxLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChza2JfcXVldWVfbGVuKCZzdC0+bDIuaV9xdWV1ZSkgJiYgKGZpLT5zdGF0ZSA9PSBTVF9MMl83KSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3QtPmwyLmlfcXVldWUpICYmIChmaS0+c3RhdGUgPT0gU1RfTDJfNykpCiAJCXN0LT5sMi5sMmwxKHN0LCBQSF9QVUxMIHwgUkVRVUVTVCwgTlVMTCk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfQUNLX1BFTkQsICZzdC0+bDIuZmxhZykpCiAJCWVucXVpcnlfY3Ioc3QsIFJSLCBSU1AsIDApOwpAQCAtMTEzOCw3ICsxMTM5LDcgQEAKIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTDNfSU5JVCwgJnN0LT5sMi5mbGFnKTsKIAl9IGVsc2UKIAkJRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzQpOwotCWlmIChza2JfcXVldWVfbGVuKCZzdC0+bDIudWlfcXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzdC0+bDIudWlfcXVldWUpKQogCQl0eF91aShzdCk7CiB9CiAKQEAgLTEzMDEsNyArMTMwMiw3IEBACiAJCUZzbURlbFRpbWVyKCZzdC0+bDIudDIwMywgMTMpOwogCQlGc21BZGRUaW1lcigmc3QtPmwyLnQyMDAsIHN0LT5sMi5UMjAwLCBFVl9MMl9UMjAwLCBOVUxMLCAxMSk7CiAJfQotCWlmIChza2JfcXVldWVfbGVuKCZsMi0+aV9xdWV1ZSkgJiYgY2Fuc2VuZChzdCkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmwyLT5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKIAkJc3QtPmwyLmwybDEoc3QsIFBIX1BVTEwgfCBSRVFVRVNULCBOVUxMKTsKIH0KIApAQCAtMTM0Nyw3ICsxMzQ4LDcgQEAKIAkJCX0KIAkJCWludm9rZV9yZXRyYW5zbWlzc2lvbihzdCwgbnIpOwogCQkJRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzcpOwotCQkJaWYgKHNrYl9xdWV1ZV9sZW4oJmwyLT5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZsMi0+aV9xdWV1ZSkgJiYgY2Fuc2VuZChzdCkpCiAJCQkJc3QtPmwyLmwybDEoc3QsIFBIX1BVTEwgfCBSRVFVRVNULCBOVUxMKTsKIAkJfSBlbHNlCiAJCQlucmVycm9ycmVjb3ZlcnkoZmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMy5jCmluZGV4IGFiY2M5NTMuLmM5OTE3Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDMuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwzLmMKQEAgLTMwMiw3ICszMDIsNyBAQAogCQkJCSF0ZXN0X2JpdChGTEdfUFRQLCAmcC0+c3QtPmwyLmZsYWcpKSB7CiAJCQkJaWYgKHAtPmRlYnVnKQogCQkJCQlsM19kZWJ1ZyhwLT5zdCwgInJlbGVhc2VfbDNfcHJvY2VzczogbGFzdCBwcm9jZXNzIik7Ci0JCQkJaWYgKCFza2JfcXVldWVfbGVuKCZwLT5zdC0+bDMuc3F1ZXVlKSkgeworCQkJCWlmIChza2JfcXVldWVfZW1wdHkoJnAtPnN0LT5sMy5zcXVldWUpKSB7CiAJCQkJCWlmIChwLT5kZWJ1ZykKIAkJCQkJCWwzX2RlYnVnKHAtPnN0LCAicmVsZWFzZV9sM19wcm9jZXNzOiByZWxlYXNlIGxpbmsiKTsKIAkJCQkJaWYgKHAtPnN0LT5wcm90b2NvbCAhPSBJU0ROX1BUWVBFX05JMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYwppbmRleCAwNTgxNDdhLi5jNmI1YmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yMjYsMTEgKzIyNSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZzZWRsYmF1ZXJfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC02MzQsNiArNjI4LDcgQEAKIAkJLm5hbWUJPSAic2VkbGJhdWVyX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gc2VkbGJhdWVyX2F0dGFjaCwKKwkuZXZlbnQJCT0gc2VkbGJhdWVyX2V2ZW50LAogCS5kZXRhY2gJCT0gc2VkbGJhdWVyX2RldGFjaCwKIAkuaWRfdGFibGUJPSBzZWRsYmF1ZXJfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlc19jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKaW5kZXggMTA3Mzc2Zi4uMGRkZWYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE5MywxMSArMTkyLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0gICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0gICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnRlbGVzX2NzX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNTAxLDYgKzQ5NSw3IEBACiAJCS5uYW1lCT0gInRlbGVzX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gdGVsZXNfYXR0YWNoLAorCS5ldmVudAkJPSB0ZWxlc19jc19ldmVudCwKIAkuZGV0YWNoCQk9IHRlbGVzX2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSB0ZWxlc19pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jCmluZGV4IGFkNWFhMzguLmIzN2VmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMKQEAgLTEyMjMsNyArMTIyMyw3IEBACiAJCXRvdGFsICs9IGM7CiAJfQogCWF0b21pY19kZWMoJmluZm8tPnhtaXRfbG9jayk7Ci0JaWYgKChpbmZvLT54bWl0X2NvdW50KSB8fCAoc2tiX3F1ZXVlX2xlbigmaW5mby0+eG1pdF9xdWV1ZSkpKSB7CisJaWYgKChpbmZvLT54bWl0X2NvdW50KSB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZpbmZvLT54bWl0X3F1ZXVlKSkgewogCQlpZiAobS0+bWRtcmVnW1JFR19EWE1UXSAmIEJJVF9EWE1UKSB7CiAJCQlpc2RuX3R0eV9zZW5kZG93bihpbmZvKTsKIAkJCWlzZG5fdHR5X3RpbnQoaW5mbyk7CkBAIC0xMjg0LDcgKzEyODQsNyBAQAogCiAJaWYgKGlzZG5fdHR5X3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImlzZG5fdHR5X2ZsdXNoX2NoYXJzIikpCiAJCXJldHVybjsKLQlpZiAoKGluZm8tPnhtaXRfY291bnQpIHx8IChza2JfcXVldWVfbGVuKCZpbmZvLT54bWl0X3F1ZXVlKSkpCisJaWYgKChpbmZvLT54bWl0X2NvdW50KSB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZpbmZvLT54bWl0X3F1ZXVlKSkKIAkJaXNkbl90aW1lcl9jdHJsKElTRE5fVElNRVJfTU9ERU1YTUlULCAxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2ljbi9pY24uYyBiL2RyaXZlcnMvaXNkbi9pY24vaWNuLmMKaW5kZXggOWZjMGMxZS4uZTBkMWIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2ljbi9pY24uYworKysgYi9kcml2ZXJzL2lzZG4vaWNuL2ljbi5jCkBAIC0zMDQsMTIgKzMwNCwxMiBAQAogCWlzZG5fY3RybCBjbWQ7CiAKIAlpZiAoIShjYXJkLT5zbmRjb3VudFtjaGFubmVsXSB8fCBjYXJkLT54c2tiW2NoYW5uZWxdIHx8Ci0JICAgICAgc2tiX3F1ZXVlX2xlbigmY2FyZC0+c3BxdWV1ZVtjaGFubmVsXSkpKQorCSAgICAgICFza2JfcXVldWVfZW1wdHkoJmNhcmQtPnNwcXVldWVbY2hhbm5lbF0pKSkKIAkJcmV0dXJuOwogCWlmIChpY25fdHJ5bWFwbG9ja19jaGFubmVsKGNhcmQsIG1jaCkpIHsKIAkJd2hpbGUgKHNiZnJlZSAmJiAKIAkJICAgICAgIChjYXJkLT5zbmRjb3VudFtjaGFubmVsXSB8fAotCQkJc2tiX3F1ZXVlX2xlbigmY2FyZC0+c3BxdWV1ZVtjaGFubmVsXSkgfHwKKwkJCSFza2JfcXVldWVfZW1wdHkoJmNhcmQtPnNwcXVldWVbY2hhbm5lbF0pIHx8CiAJCQljYXJkLT54c2tiW2NoYW5uZWxdKSkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJCWlmIChjYXJkLT54bWl0X2xvY2tbY2hhbm5lbF0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlIGIvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKaW5kZXggZjVhZTE3MS4uMjM2MjkxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKICMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KIAotb2JqLSQoQ09ORklHX1BQQ19QTUFDKQkJKz0gbWFjaW9fYXNpYy5vCitvYmotJChDT05GSUdfUFBDX1BNQUMpCQkrPSBtYWNpb19hc2ljLm8gbWFjaW9fc3lzZnMubwogCiBvYmotJChDT05GSUdfUE1BQ19NRURJQUJBWSkJKz0gbWVkaWFiYXkubwogb2JqLSQoQ09ORklHX01BQ19FTVVNT1VTRUJUTikJKz0gbWFjX2hpZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKaW5kZXggZDBiZGE3ZS4uMWVlMDAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwpAQCAtMzMsNyArMzMsNyBAQAogewogCXN0cnVjdCBtYWNpb19kZXYgKiBtYWNpb19kZXYgPSB0b19tYWNpb19kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgbWFjaW9fZHJpdmVyICogbWFjaW9fZHJ2ID0gdG9fbWFjaW9fZHJpdmVyKGRydik7Ci0JY29uc3Qgc3RydWN0IG9mX21hdGNoICogbWF0Y2hlcyA9IG1hY2lvX2Rydi0+bWF0Y2hfdGFibGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG1hdGNoZXMgPSBtYWNpb19kcnYtPm1hdGNoX3RhYmxlOwogCiAJaWYgKCFtYXRjaGVzKSAKIAkJcmV0dXJuIDA7CkBAIC02Niw3ICs2Niw3IEBACiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAlzdHJ1Y3QgbWFjaW9fZHJpdmVyICpkcnY7CiAJc3RydWN0IG1hY2lvX2RldiAqbWFjaW9fZGV2OwotCWNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2g7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAKIAlkcnYgPSB0b19tYWNpb19kcml2ZXIoZGV2LT5kcml2ZXIpOwogCW1hY2lvX2RldiA9IHRvX21hY2lvX2RldmljZShkZXYpOwpAQCAtMTI2LDExICsxMjYsODUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtYWNpb19ob3RwbHVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBtYWNpb19kZXYgKiBtYWNpb19kZXY7CisJc3RydWN0IG9mX2RldmljZSAqIG9mOworCWNoYXIgKnNjcmF0Y2gsICpjb21wYXQ7CisJaW50IGkgPSAwOworCWludCBsZW5ndGggPSAwOworCWludCBjcGxlbiwgc2VlbiA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltYWNpb19kZXYgPSB0b19tYWNpb19kZXZpY2UoZGV2KTsKKwlpZiAoIW1hY2lvX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvZiA9ICZtYWNpb19kZXYtPm9mZGV2OworCXNjcmF0Y2ggPSBidWZmZXI7CisKKwkvKiBzdHVmZiB3ZSB3YW50IHRvIHBhc3MgdG8gL3NiaW4vaG90cGx1ZyAqLworCWVudnBbaSsrXSA9IHNjcmF0Y2g7CisJbGVuZ3RoICs9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUgLSBsZW5ndGgsICJPRl9OQU1FPSVzIiwKKwkgICAgICAgICAgICAgICAgICAgICBvZi0+bm9kZS0+bmFtZSk7CisJaWYgKChidWZmZXJfc2l6ZSAtIGxlbmd0aCA8PSAwKSB8fCAoaSA+PSBudW1fZW52cCkpCisJCXJldHVybiAtRU5PTUVNOworCSsrbGVuZ3RoOworCXNjcmF0Y2ggKz0gbGVuZ3RoOworCisJZW52cFtpKytdID0gc2NyYXRjaDsKKwlsZW5ndGggKz0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSAtIGxlbmd0aCwgIk9GX1RZUEU9JXMiLAorCSAgICAgICAgICAgICAgICAgICAgIG9mLT5ub2RlLT50eXBlKTsKKwlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJKytsZW5ndGg7CisJc2NyYXRjaCArPSBsZW5ndGg7CisKKyAgICAgICAgLyogU2luY2UgdGhlIGNvbXBhdGlibGUgZmllbGQgY2FuIGNvbnRhaW4gcHJldHR5IG11Y2ggYW55dGhpbmcKKyAgICAgICAgICogaXQncyBub3QgcmVhbGx5IGxlZ2FsIHRvIHNwbGl0IGl0IG91dCB3aXRoIGNvbW1hcy4gV2Ugc3BsaXQgaXQKKyAgICAgICAgICogdXAgdXNpbmcgYSBudW1iZXIgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluc3RlYWQuICovCisKKwljb21wYXQgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkob2YtPm5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwl3aGlsZSAoY29tcGF0ICYmIGNwbGVuID4gMCkgeworCQlpbnQgbDsKKyAgICAgICAgICAgICAgICBlbnZwW2krK10gPSBzY3JhdGNoOworCQlsZW5ndGggKz0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSAtIGxlbmd0aCwKKwkJICAgICAgICAgICAgICAgICAgICAgIk9GX0NPTVBBVElCTEVfJWQ9JXMiLCBzZWVuLCBjb21wYXQpOworCQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlsZW5ndGgrKzsKKwkJc2NyYXRjaCArPSBsZW5ndGg7CisJCWwgPSBzdHJsZW4gKGNvbXBhdCkgKyAxOworCQljb21wYXQgKz0gbDsKKwkJY3BsZW4gLT0gbDsKKwkJc2VlbisrOworCX0KKworCWVudnBbaSsrXSA9IHNjcmF0Y2g7CisJbGVuZ3RoICs9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUgLSBsZW5ndGgsCisJICAgICAgICAgICAgICAgICAgICAgIk9GX0NPTVBBVElCTEVfTj0lZCIsIHNlZW4pOworCWlmICgoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQorCQlyZXR1cm4gLUVOT01FTTsKKwkrK2xlbmd0aDsKKwlzY3JhdGNoICs9IGxlbmd0aDsKKworCWVudnBbaV0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBtYWNpb19kZXZfYXR0cnNbXTsKKwogc3RydWN0IGJ1c190eXBlIG1hY2lvX2J1c190eXBlID0gewogICAgICAgIC5uYW1lCT0gIm1hY2lvIiwKICAgICAgICAubWF0Y2gJPSBtYWNpb19idXNfbWF0Y2gsCisgICAgICAgLmhvdHBsdWcgPSBtYWNpb19ob3RwbHVnLAogICAgICAgIC5zdXNwZW5kCT0gbWFjaW9fZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG1hY2lvX2RldmljZV9yZXN1bWUsCisgICAgICAgLmRldl9hdHRycyA9IG1hY2lvX2Rldl9hdHRycywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG1hY2lvX2J1c19kcml2ZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fc3lzZnMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMjJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMKQEAgLTAsMCArMSw1MCBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKworCisjZGVmaW5lIG1hY2lvX2NvbmZpZ19vZl9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitmaWVsZCMjX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKyAgICAgICAgICAgICAgY2hhciAqYnVmKQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1hY2lvX2RldiAqbWRldiA9IHRvX21hY2lvX2RldmljZSAoZGV2KTsJCQlcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgZm9ybWF0X3N0cmluZywgbWRldi0+b2ZkZXYubm9kZS0+ZmllbGQpOwlcCit9CisKK3N0YXRpYyBzc2l6ZV90Citjb21wYXRpYmxlX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZjsKKwljaGFyICpjb21wYXQ7CisJaW50IGNwbGVuOworCWludCBsZW5ndGggPSAwOworCisJb2YgPSAmdG9fbWFjaW9fZGV2aWNlIChkZXYpLT5vZmRldjsKKwljb21wYXQgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkob2YtPm5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwlpZiAoIWNvbXBhdCkgeworCQkqYnVmID0gJ1wwJzsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlIChjcGxlbiA+IDApIHsKKwkJaW50IGw7CisJCWxlbmd0aCArPSBzcHJpbnRmIChidWYsICIlc1xuIiwgY29tcGF0KTsKKwkJYnVmICs9IGxlbmd0aDsKKwkJbCA9IHN0cmxlbiAoY29tcGF0KSArIDE7CisJCWNvbXBhdCArPSBsOworCQljcGxlbiAtPSBsOworCX0KKworCXJldHVybiBsZW5ndGg7Cit9CisKK21hY2lvX2NvbmZpZ19vZl9hdHRyIChuYW1lLCAiJXNcbiIpOworbWFjaW9fY29uZmlnX29mX2F0dHIgKHR5cGUsICIlc1xuIik7CisKK3N0cnVjdCBkZXZpY2VfYXR0cmlidXRlIG1hY2lvX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhuYW1lKSwKKwlfX0FUVFJfUk8odHlwZSksCisJX19BVFRSX1JPKGNvbXBhdGlibGUpLAorCV9fQVRUUl9OVUxMCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWVkaWFiYXkuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21lZGlhYmF5LmMKaW5kZXggNGJlNzA5ZS4uN2MxNmMyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWVkaWFiYXkuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jCkBAIC02NDIsNyArNjQyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG1lZGlhX2JheV9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1lZGlhX2JheV9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IG1lZGlhX2JheV9pbmZvKiBiYXk7CiAJdTMyIF9faW9tZW0gKnJlZ2Jhc2U7CkBAIC03OTcsMjMgKzc5NywyMCBAQAogICogVGhlcmVmb3JlIHdlIGRvIGl0IGFsbCBieSBwb2xsaW5nIHRoZSBtZWRpYSBiYXkgb25jZSBlYWNoIHRpY2suCiAgKi8KIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBtZWRpYV9iYXlfbWF0Y2hbXSA9CitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtZWRpYV9iYXlfbWF0Y2hbXSA9CiB7CiAJewogCS5uYW1lCQk9ICJtZWRpYS1iYXkiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKIAkuY29tcGF0aWJsZQk9ICJrZXlsYXJnby1tZWRpYS1iYXkiLAogCS5kYXRhCQk9ICZrZXlsYXJnb19tYl9vcHMsCiAJfSwKIAl7CiAJLm5hbWUJCT0gIm1lZGlhLWJheSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAogCS5jb21wYXRpYmxlCT0gImhlYXRocm93LW1lZGlhLWJheSIsCiAJLmRhdGEJCT0gJmhlYXRocm93X21iX29wcywKIAl9LAogCXsKIAkubmFtZQkJPSAibWVkaWEtYmF5IiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCiAJLmNvbXBhdGlibGUJPSAib2hhcmUtbWVkaWEtYmF5IiwKIAkuZGF0YQkJPSAmb2hhcmVfbWJfb3BzLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKaW5kZXggZmViNGUyNC4uNzAzZTMxOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKQEAgLTEyMCw2ICsxMjAsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL21hY2lvLmg+CiAKICNpbmNsdWRlICJ0aGVybV9wbTcyLmgiCiAKQEAgLTE5ODYsNyArMTk4Nyw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGZjdV9vZl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitzdGF0aWMgaW50IGZjdV9vZl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCWludCByYzsKIApAQCAtMjAwOSwxMiArMjAxMCwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIGZjdV9vZl9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBmY3VfbWF0Y2hbXSA9IAogewogCXsKLQkubmFtZSAJCT0gT0ZfQU5ZX01BVENILAogCS50eXBlCQk9ICJmY3UiLAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7fSwKIH07CkBAIC0yMDIyLDcgKzIwMjEsNyBAQAogc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZmN1X29mX3BsYXRmb3JtX2RyaXZlciA9IAogewogCS5uYW1lIAkJPSAidGVtcGVyYXR1cmUiLAotCS5tYXRjaF90YWJsZQk9IGZjdV9vZl9tYXRjaCwKKwkubWF0Y2hfdGFibGUJPSBmY3VfbWF0Y2gsCiAJLnByb2JlCQk9IGZjdV9vZl9wcm9iZSwKIAkucmVtb3ZlCQk9IGZjdV9vZl9yZW1vdmUKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV93aW5kdHVubmVsLmMgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV93aW5kdHVubmVsLmMKaW5kZXggNjE0MDBmMC4uY2JiNzJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL21hY2lvLmg+CiAKICNkZWZpbmUgTE9HX1RFTVAJCTAJCQkvKiBjb250aW5vdXNseSBsb2cgdGVtcGVyYXR1cmUgKi8KIApAQCAtNDUwLDcgKzQ1MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW50Ci10aGVybV9vZl9wcm9iZSggc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoICkKK3RoZXJtX29mX3Byb2JlKCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoICkKIHsKIAlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoICZnNGZhbl9kcml2ZXIgKTsKIH0KQEAgLTQ2MSw5ICs0NjIsOCBAQAogCXJldHVybiBpMmNfZGVsX2RyaXZlciggJmc0ZmFuX2RyaXZlciApOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIHRoZXJtX29mX21hdGNoW10gPSB7eworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGhlcm1fb2ZfbWF0Y2hbXSA9IHt7CiAJLm5hbWUJCT0gImZhbiIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAogCS5jb21wYXRpYmxlCT0gImFkbTEwMzAiCiAgICAgfSwge30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKaW5kZXggMGMxYjg1Mi4uNzg1ODA2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwpAQCAtNjMsNiArNjMsNyBAQAogCXVuc2lnbmVkIG5yX3ByaW9yaXR5X2dyb3VwczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHByaW9yaXR5X2dyb3VwczsKIAl1bnNpZ25lZCBwZ19pbml0X3JlcXVpcmVkOwkvKiBwZ19pbml0IG5lZWRzIGNhbGxpbmc/ICovCisJdW5zaWduZWQgcGdfaW5pdF9pbl9wcm9ncmVzczsJLyogT25seSBvbmUgcGdfaW5pdCBhbGxvd2VkIGF0IG9uY2UgKi8KIAogCXVuc2lnbmVkIG5yX3ZhbGlkX3BhdGhzOwkvKiBUb3RhbCBudW1iZXIgb2YgdXNhYmxlIHBhdGhzICovCiAJc3RydWN0IHBncGF0aCAqY3VycmVudF9wZ3BhdGg7CkBAIC03Miw3ICs3Myw3IEBACiAKIAl1bnNpZ25lZCBxdWV1ZV9pbzsJCS8qIE11c3Qgd2UgcXVldWUgYWxsIEkvTz8gKi8KIAl1bnNpZ25lZCBxdWV1ZV9pZl9ub19wYXRoOwkvKiBRdWV1ZSBJL08gaWYgbGFzdCBwYXRoIGZhaWxzPyAqLwotCXVuc2lnbmVkIHN1c3BlbmRlZDsJCS8qIEhhcyBkbSBjb3JlIHN1c3BlbmRlZCBvdXIgSS9PPyAqLworCXVuc2lnbmVkIHNhdmVkX3F1ZXVlX2lmX25vX3BhdGg7LyogU2F2ZWQgc3RhdGUgZHVyaW5nIHN1c3BlbnNpb24gKi8KIAogCXN0cnVjdCB3b3JrX3N0cnVjdCBwcm9jZXNzX3F1ZXVlZF9pb3M7CiAJc3RydWN0IGJpb19saXN0IHF1ZXVlZF9pb3M7CkBAIC0zMDQsMTEgKzMwNSwxMiBAQAogCQltLT5xdWV1ZV9zaXplLS07CiAKIAlpZiAoKHBncGF0aCAmJiBtLT5xdWV1ZV9pbykgfHwKLQkgICAgKCFwZ3BhdGggJiYgbS0+cXVldWVfaWZfbm9fcGF0aCAmJiAhbS0+c3VzcGVuZGVkKSkgeworCSAgICAoIXBncGF0aCAmJiBtLT5xdWV1ZV9pZl9ub19wYXRoKSkgewogCQkvKiBRdWV1ZSBmb3IgdGhlIGRhZW1vbiB0byByZXN1Ym1pdCAqLwogCQliaW9fbGlzdF9hZGQoJm0tPnF1ZXVlZF9pb3MsIGJpbyk7CiAJCW0tPnF1ZXVlX3NpemUrKzsKLQkJaWYgKG0tPnBnX2luaXRfcmVxdWlyZWQgfHwgIW0tPnF1ZXVlX2lvKQorCQlpZiAoKG0tPnBnX2luaXRfcmVxdWlyZWQgJiYgIW0tPnBnX2luaXRfaW5fcHJvZ3Jlc3MpIHx8CisJCSAgICAhbS0+cXVldWVfaW8pCiAJCQlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+cHJvY2Vzc19xdWV1ZWRfaW9zKTsKIAkJcGdwYXRoID0gTlVMTDsKIAkJciA9IDA7CkBAIC0zMzMsOCArMzM1LDkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtLT5sb2NrLCBmbGFncyk7CiAKKwltLT5zYXZlZF9xdWV1ZV9pZl9ub19wYXRoID0gbS0+cXVldWVfaWZfbm9fcGF0aDsKIAltLT5xdWV1ZV9pZl9ub19wYXRoID0gcXVldWVfaWZfbm9fcGF0aDsKLQlpZiAoIW0tPnF1ZXVlX2lmX25vX3BhdGgpCisJaWYgKCFtLT5xdWV1ZV9pZl9ub19wYXRoICYmIG0tPnF1ZXVlX3NpemUpCiAJCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT5wcm9jZXNzX3F1ZXVlZF9pb3MpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOwpAQCAtMzc5LDI1ICszODIsMzEgQEAKIHsKIAlzdHJ1Y3QgbXVsdGlwYXRoICptID0gKHN0cnVjdCBtdWx0aXBhdGggKikgZGF0YTsKIAlzdHJ1Y3QgaHdfaGFuZGxlciAqaHdoID0gJm0tPmh3X2hhbmRsZXI7Ci0Jc3RydWN0IHBncGF0aCAqcGdwYXRoOwotCXVuc2lnbmVkIGluaXRfcmVxdWlyZWQsIG11c3RfcXVldWUgPSAwOworCXN0cnVjdCBwZ3BhdGggKnBncGF0aCA9IE5VTEw7CisJdW5zaWduZWQgaW5pdF9yZXF1aXJlZCA9IDAsIG11c3RfcXVldWUgPSAxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOwogCisJaWYgKCFtLT5xdWV1ZV9zaXplKQorCQlnb3RvIG91dDsKKwogCWlmICghbS0+Y3VycmVudF9wZ3BhdGgpCiAJCV9fY2hvb3NlX3BncGF0aChtKTsKIAogCXBncGF0aCA9IG0tPmN1cnJlbnRfcGdwYXRoOwogCi0JaWYgKChwZ3BhdGggJiYgbS0+cXVldWVfaW8pIHx8Ci0JICAgICghcGdwYXRoICYmIG0tPnF1ZXVlX2lmX25vX3BhdGggJiYgIW0tPnN1c3BlbmRlZCkpCi0JCW11c3RfcXVldWUgPSAxOworCWlmICgocGdwYXRoICYmICFtLT5xdWV1ZV9pbykgfHwKKwkgICAgKCFwZ3BhdGggJiYgIW0tPnF1ZXVlX2lmX25vX3BhdGgpKQorCQltdXN0X3F1ZXVlID0gMDsKIAotCWluaXRfcmVxdWlyZWQgPSBtLT5wZ19pbml0X3JlcXVpcmVkOwotCWlmIChpbml0X3JlcXVpcmVkKQorCWlmIChtLT5wZ19pbml0X3JlcXVpcmVkICYmICFtLT5wZ19pbml0X2luX3Byb2dyZXNzKSB7CiAJCW0tPnBnX2luaXRfcmVxdWlyZWQgPSAwOworCQltLT5wZ19pbml0X2luX3Byb2dyZXNzID0gMTsKKwkJaW5pdF9yZXF1aXJlZCA9IDE7CisJfQogCitvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGluaXRfcmVxdWlyZWQpCkBAIC03NTIsNiArNzYxLDggQEAKIHN0YXRpYyB2b2lkIG11bHRpcGF0aF9kdHIoc3RydWN0IGRtX3RhcmdldCAqdGkpCiB7CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9IChzdHJ1Y3QgbXVsdGlwYXRoICopIHRpLT5wcml2YXRlOworCisJZmx1c2hfd29ya3F1ZXVlKGttdWx0aXBhdGhkKTsKIAlmcmVlX211bHRpcGF0aChtKTsKIH0KIApAQCAtNzY1LDYgKzc3Niw5IEBACiAJc3RydWN0IG1wYXRoX2lvICptcGlvOwogCXN0cnVjdCBtdWx0aXBhdGggKm0gPSAoc3RydWN0IG11bHRpcGF0aCAqKSB0aS0+cHJpdmF0ZTsKIAorCWlmIChiaW9fYmFycmllcihiaW8pKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAltcGlvID0gbWVtcG9vbF9hbGxvYyhtLT5tcGlvX3Bvb2wsIEdGUF9OT0lPKTsKIAlkbV9iaW9fcmVjb3JkKCZtcGlvLT5kZXRhaWxzLCBiaW8pOwogCkBAIC04MzcsNyArODUxLDcgQEAKIAlwZ3BhdGgtPnBhdGguaXNfYWN0aXZlID0gMTsKIAogCW0tPmN1cnJlbnRfcGdwYXRoID0gTlVMTDsKLQlpZiAoIW0tPm5yX3ZhbGlkX3BhdGhzKyspCisJaWYgKCFtLT5ucl92YWxpZF9wYXRocysrICYmIG0tPnF1ZXVlX3NpemUpCiAJCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT5wcm9jZXNzX3F1ZXVlZF9pb3MpOwogCiAJcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnRyaWdnZXJfZXZlbnQpOwpAQCAtOTYzLDEyICs5NzcsMTMgQEAKIAkJYnlwYXNzX3BnKG0sIHBnLCAxKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCFlcnJfZmxhZ3MpCi0JCW0tPnF1ZXVlX2lvID0gMDsKLQllbHNlIHsKKwlpZiAoZXJyX2ZsYWdzKSB7CiAJCW0tPmN1cnJlbnRfcGdwYXRoID0gTlVMTDsKIAkJbS0+Y3VycmVudF9wZyA9IE5VTEw7Ci0JfQorCX0gZWxzZSBpZiAoIW0tPnBnX2luaXRfcmVxdWlyZWQpCisJCW0tPnF1ZXVlX2lvID0gMDsKKworCW0tPnBnX2luaXRfaW5fcHJvZ3Jlc3MgPSAwOwogCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT5wcm9jZXNzX3F1ZXVlZF9pb3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKIH0KQEAgLTk4OCw5ICsxMDAzLDEyIEBACiAJaWYgKChlcnJvciA9PSAtRVdPVUxEQkxPQ0spICYmIGJpb19yd19haGVhZChiaW8pKQogCQlyZXR1cm4gZXJyb3I7CiAKKwlpZiAoZXJyb3IgPT0gLUVPUE5PVFNVUFApCisJCXJldHVybiBlcnJvcjsKKwogCXNwaW5fbG9jaygmbS0+bG9jayk7CiAJaWYgKCFtLT5ucl92YWxpZF9wYXRocykgewotCQlpZiAoIW0tPnF1ZXVlX2lmX25vX3BhdGggfHwgbS0+c3VzcGVuZGVkKSB7CisJCWlmICghbS0+cXVldWVfaWZfbm9fcGF0aCkgewogCQkJc3Bpbl91bmxvY2soJm0tPmxvY2spOwogCQkJcmV0dXJuIC1FSU87CiAJCX0gZWxzZSB7CkBAIC0xMDUxLDI3ICsxMDY5LDI3IEBACiAKIC8qCiAgKiBTdXNwZW5kIGNhbid0IGNvbXBsZXRlIHVudGlsIGFsbCB0aGUgSS9PIGlzIHByb2Nlc3NlZCBzbyBpZgotICogdGhlIGxhc3QgcGF0aCBmYWlsZWQgd2Ugd2lsbCBub3cgZXJyb3IgYW55IHF1ZXVlZCBJL08uCisgKiB0aGUgbGFzdCBwYXRoIGZhaWxzIHdlIG11c3QgZXJyb3IgYW55IHJlbWFpbmluZyBJL08uCisgKiBOb3RlIHRoYXQgaWYgdGhlIGZyZWV6ZV9iZGV2IGZhaWxzIHdoaWxlIHN1c3BlbmRpbmcsIHRoZQorICogcXVldWVfaWZfbm9fcGF0aCBzdGF0ZSBpcyBsb3N0IC0gdXNlcnNwYWNlIHNob3VsZCByZXNldCBpdC4KICAqLwogc3RhdGljIHZvaWQgbXVsdGlwYXRoX3ByZXN1c3BlbmQoc3RydWN0IGRtX3RhcmdldCAqdGkpCiB7CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9IChzdHJ1Y3QgbXVsdGlwYXRoICopIHRpLT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOwotCW0tPnN1c3BlbmRlZCA9IDE7Ci0JaWYgKG0tPnF1ZXVlX2lmX25vX3BhdGgpCi0JCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT5wcm9jZXNzX3F1ZXVlZF9pb3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKKwlxdWV1ZV9pZl9ub19wYXRoKG0sIDApOwogfQogCisvKgorICogUmVzdG9yZSB0aGUgcXVldWVfaWZfbm9fcGF0aCBzZXR0aW5nLgorICovCiBzdGF0aWMgdm9pZCBtdWx0aXBhdGhfcmVzdW1lKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCXN0cnVjdCBtdWx0aXBhdGggKm0gPSAoc3RydWN0IG11bHRpcGF0aCAqKSB0aS0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm0tPmxvY2ssIGZsYWdzKTsKLQltLT5zdXNwZW5kZWQgPSAwOworCW0tPnF1ZXVlX2lmX25vX3BhdGggPSBtLT5zYXZlZF9xdWV1ZV9pZl9ub19wYXRoOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1yYWlkMS5jIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCmluZGV4IDZlM2NmN2UuLjEyMDMxYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYworKysgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKQEAgLTEwNjAsNiArMTA2MCw3IEBACiAJfQogCiAJdGktPnByaXZhdGUgPSBtczsKKyAJdGktPnNwbGl0X2lvID0gbXMtPnJoLnJlZ2lvbl9zaXplOwogCiAJciA9IGtjb3B5ZF9jbGllbnRfY3JlYXRlKERNX0lPX1BBR0VTLCAmbXMtPmtjb3B5ZF9jbGllbnQpOwogCWlmIChyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCmluZGV4IDdlNjkxYWIuLmFiNTRmOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCkBAIC03NzcsNyArNzc3LDcgQEAKIAogCS8qIEZ1bGwgc25hcHNob3RzIGFyZSBub3QgdXNhYmxlICovCiAJaWYgKCFzLT52YWxpZCkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTzsKIAogCS8qCiAJICogV3JpdGUgdG8gc25hcHNob3QgLSBoaWdoZXIgbGV2ZWwgdGFrZXMgY2FyZSBvZiBSVy9STwpAQCAtOTMxLDYgKzkzMSwxMCBAQAogCQlpZiAoIXNuYXAtPnZhbGlkKQogCQkJY29udGludWU7CiAKKwkJLyogTm90aGluZyB0byBkbyBpZiB3cml0aW5nIGJleW9uZCBlbmQgb2Ygc25hcHNob3QgKi8KKwkJaWYgKGJpby0+Ymlfc2VjdG9yID49IGRtX3RhYmxlX2dldF9zaXplKHNuYXAtPnRhYmxlKSkKKwkJCWNvbnRpbnVlOworCiAJCWRvd25fd3JpdGUoJnNuYXAtPmxvY2spOwogCiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKaW5kZXggMThlOWI5OS4uYTVhNGMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS10YWJsZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpAQCAtOTQzLDYgKzk0Myw3IEBACiBFWFBPUlRfU1lNQk9MKGRtX2dldF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChkbV9wdXRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0woZG1fdGFibGVfZXZlbnQpOworRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXRfc2l6ZSk7CiBFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldF9tb2RlKTsKIEVYUE9SVF9TWU1CT0woZG1fdGFibGVfcHV0KTsKIEVYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCBmNmIwMzk1Li41NGZhYmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC0zODQsNyArMzg0LDcgQEAKIAkJLyogZXJyb3IgdGhlIGlvIGFuZCBiYWlsIG91dCAqLwogCQlzdHJ1Y3QgZG1faW8gKmlvID0gdGlvLT5pbzsKIAkJZnJlZV90aW8odGlvLT5pby0+bWQsIHRpbyk7Ci0JCWRlY19wZW5kaW5nKGlvLCAtRUlPKTsKKwkJZGVjX3BlbmRpbmcoaW8sIHIpOwogCQliaW9fcHV0KGNsb25lKTsKIAl9CiB9CkBAIC05NjYsMjMgKzk2NiwyMCBAQAogICovCiBpbnQgZG1fc3dhcF90YWJsZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBkbV90YWJsZSAqdGFibGUpCiB7Ci0JaW50IHI7CisJaW50IHIgPSAtRUlOVkFMOwogCiAJZG93bl93cml0ZSgmbWQtPmxvY2spOwogCiAJLyogZGV2aWNlIG11c3QgYmUgc3VzcGVuZGVkICovCi0JaWYgKCF0ZXN0X2JpdChETUZfU1VTUEVOREVELCAmbWQtPmZsYWdzKSkgewotCQl1cF93cml0ZSgmbWQtPmxvY2spOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KKwlpZiAoIXRlc3RfYml0KERNRl9TVVNQRU5ERUQsICZtZC0+ZmxhZ3MpKQorCQlnb3RvIG91dDsKIAogCV9fdW5iaW5kKG1kKTsKIAlyID0gX19iaW5kKG1kLCB0YWJsZSk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwogCitvdXQ6CiAJdXBfd3JpdGUoJm1kLT5sb2NrKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcjsKIH0KIAogLyoKQEAgLTEwNTUsMTQgKzEwNTIsMTcgQEAKIAlpZiAodGVzdF9iaXQoRE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKSkKIAkJZ290byBvdXRfcmVhZF91bmxvY2s7CiAKLQllcnJvciA9IF9fbG9ja19mcyhtZCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9yZWFkX3VubG9jazsKLQogCW1hcCA9IGRtX2dldF90YWJsZShtZCk7CiAJaWYgKG1hcCkKKwkJLyogVGhpcyBkb2VzIG5vdCBnZXQgcmV2ZXJ0ZWQgaWYgdGhlcmUncyBhbiBlcnJvciBsYXRlci4gKi8KIAkJZG1fdGFibGVfcHJlc3VzcGVuZF90YXJnZXRzKG1hcCk7CiAKKwllcnJvciA9IF9fbG9ja19mcyhtZCk7CisJaWYgKGVycm9yKSB7CisJCWRtX3RhYmxlX3B1dChtYXApOworCQlnb3RvIG91dF9yZWFkX3VubG9jazsKKwl9CisKIAl1cF9yZWFkKCZtZC0+bG9jayk7CiAKIAkvKgpAQCAtMTEyMSw3ICsxMTIxLDYgQEAKIAlyZXR1cm4gMDsKIAogb3V0X3VuZnJlZXplOgotCS8qIEZJWE1FIFVuZG8gZG1fdGFibGVfcHJlc3VzcGVuZF90YXJnZXRzICovCiAJX191bmxvY2tfZnMobWQpOwogCWNsZWFyX2JpdChETUZfQkxPQ0tfSU8sICZtZC0+ZmxhZ3MpOwogb3V0X3dyaXRlX3VubG9jazoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKaW5kZXggNGFkYjI4NC4uYWI3YTFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBpci1jb21tb24uYyx2IDEuMTAgMjAwNS8wNS8yMiAxOToyMzozOSBuc2ggRXhwICQKKyAqICRJZDogaXItY29tbW9uLmMsdiAxLjExIDIwMDUvMDcvMDcgMTQ6NDQ6NDMgbWNoZWhhYiBFeHAgJAogICoKICAqIHNvbWUgY29tbW9uIHN0cnVjdHMgYW5kIGZ1bmN0aW9ucyB0byBoYW5kbGUgaW5mcmFyZWQgcmVtb3RlcyB2aWEKICAqIGlucHV0IGxheWVyIC4uLgpAQCAtNDYsNzkgKzQ2LDQ5IEBACiAvKiBzZWUgaHR0cDovL3VzZXJzLnBhbmRvcmEuYmUvbmVueWEvZWxlY3Ryb25pY3MvcmM1L2NvZGVzMDAuaHRtICovCiAvKiB1c2VkIGJ5IG9sZCAoYmxhY2spIEhhdXBwYXVnZSByZW1vdGVzICAgICAgICAgICAgICAgICAgICAgICAgICovCiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19yYzVfdHZbSVJfS0VZVEFCX1NJWkVdID0gewotCVsgMHgwMCBdID0gS0VZX0tQMCwgICAgICAgICAgICAgLy8gMAotCVsgMHgwMSBdID0gS0VZX0tQMSwgICAgICAgICAgICAgLy8gMQotCVsgMHgwMiBdID0gS0VZX0tQMiwgICAgICAgICAgICAgLy8gMgotCVsgMHgwMyBdID0gS0VZX0tQMywgICAgICAgICAgICAgLy8gMwotCVsgMHgwNCBdID0gS0VZX0tQNCwgICAgICAgICAgICAgLy8gNAotCVsgMHgwNSBdID0gS0VZX0tQNSwgICAgICAgICAgICAgLy8gNQotCVsgMHgwNiBdID0gS0VZX0tQNiwgICAgICAgICAgICAgLy8gNgotCVsgMHgwNyBdID0gS0VZX0tQNywgICAgICAgICAgICAgLy8gNwotCVsgMHgwOCBdID0gS0VZX0tQOCwgICAgICAgICAgICAgLy8gOAotCVsgMHgwOSBdID0gS0VZX0tQOSwgICAgICAgICAgICAgLy8gOQorCS8qIEtleXMgMCB0byA5ICovCisJWyAweDAwIF0gPSBLRVlfS1AwLAorCVsgMHgwMSBdID0gS0VZX0tQMSwKKwlbIDB4MDIgXSA9IEtFWV9LUDIsCisJWyAweDAzIF0gPSBLRVlfS1AzLAorCVsgMHgwNCBdID0gS0VZX0tQNCwKKwlbIDB4MDUgXSA9IEtFWV9LUDUsCisJWyAweDA2IF0gPSBLRVlfS1A2LAorCVsgMHgwNyBdID0gS0VZX0tQNywKKwlbIDB4MDggXSA9IEtFWV9LUDgsCisJWyAweDA5IF0gPSBLRVlfS1A5LAogCi0JWyAweDBiIF0gPSBLRVlfQ0hBTk5FTCwgICAgICAgICAvLyBjaGFubmVsIC8gcHJvZ3JhbSAoamFwYW46IDExKQotCVsgMHgwYyBdID0gS0VZX1BPV0VSLCAgICAgICAgICAgLy8gc3RhbmRieQotCVsgMHgwZCBdID0gS0VZX01VVEUsICAgICAgICAgICAgLy8gbXV0ZSAvIGRlbXV0ZQotCVsgMHgwZiBdID0gS0VZX1RWLCAgICAgICAgICAgICAgLy8gZGlzcGxheQotCVsgMHgxMCBdID0gS0VZX1ZPTFVNRVVQLCAgICAgICAgLy8gdm9sdW1lICsKLQlbIDB4MTEgXSA9IEtFWV9WT0xVTUVET1dOLCAgICAgIC8vIHZvbHVtZSAtCi0JWyAweDEyIF0gPSBLRVlfQlJJR0hUTkVTU1VQLCAgICAvLyBicmlnaHRuZXNzICsKLQlbIDB4MTMgXSA9IEtFWV9CUklHSFRORVNTRE9XTiwgIC8vIGJyaWdodG5lc3MgLQotCVsgMHgxZSBdID0gS0VZX1NFQVJDSCwgICAgICAgICAgLy8gc2VhcmNoICsKLQlbIDB4MjAgXSA9IEtFWV9DSEFOTkVMVVAsICAgICAgIC8vIGNoYW5uZWwgLyBwcm9ncmFtICsKLQlbIDB4MjEgXSA9IEtFWV9DSEFOTkVMRE9XTiwgICAgIC8vIGNoYW5uZWwgLyBwcm9ncmFtIC0KLQlbIDB4MjIgXSA9IEtFWV9DSEFOTkVMLCAgICAgICAgIC8vIGFsdCAvIGNoYW5uZWwKLQlbIDB4MjMgXSA9IEtFWV9MQU5HVUFHRSwgICAgICAgIC8vIDFzdCAvIDJuZCBsYW5ndWFnZQotCVsgMHgyNiBdID0gS0VZX1NMRUVQLCAgICAgICAgICAgLy8gc2xlZXB0aW1lcgotCVsgMHgyZSBdID0gS0VZX01FTlUsICAgICAgICAgICAgLy8gMm5kIGNvbnRyb2xzIChVU0E6IG1lbnUpCi0JWyAweDMwIF0gPSBLRVlfUEFVU0UsICAgICAgICAgICAvLyBwYXVzZQotCVsgMHgzMiBdID0gS0VZX1JFV0lORCwgICAgICAgICAgLy8gcmV3aW5kCi0JWyAweDMzIF0gPSBLRVlfR09UTywgICAgICAgICAgICAvLyBnbyB0bwotCVsgMHgzNSBdID0gS0VZX1BMQVksICAgICAgICAgICAgLy8gcGxheQotCVsgMHgzNiBdID0gS0VZX1NUT1AsICAgICAgICAgICAgLy8gc3RvcAotCVsgMHgzNyBdID0gS0VZX1JFQ09SRCwgICAgICAgICAgLy8gcmVjb3JkaW5nCi0JWyAweDNjIF0gPSBLRVlfVEVYVCwgICAgICAgICAgICAvLyB0ZWxldGV4dCBzdWJtb2RlIChKYXBhbjogMTIpCi0JWyAweDNkIF0gPSBLRVlfU1VTUEVORCwgICAgICAgICAvLyBzeXN0ZW0gc3RhbmRieQorCVsgMHgwYiBdID0gS0VZX0NIQU5ORUwsCQkvKiBjaGFubmVsIC8gcHJvZ3JhbSAoamFwYW46IDExKSAqLworCVsgMHgwYyBdID0gS0VZX1BPV0VSLAkJLyogc3RhbmRieSAqLworCVsgMHgwZCBdID0gS0VZX01VVEUsCQkvKiBtdXRlIC8gZGVtdXRlICovCisJWyAweDBmIF0gPSBLRVlfVFYsCQkvKiBkaXNwbGF5ICovCisJWyAweDEwIF0gPSBLRVlfVk9MVU1FVVAsCisJWyAweDExIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbIDB4MTIgXSA9IEtFWV9CUklHSFRORVNTVVAsCisJWyAweDEzIF0gPSBLRVlfQlJJR0hUTkVTU0RPV04sCisJWyAweDFlIF0gPSBLRVlfU0VBUkNILAkJLyogc2VhcmNoICsgKi8KKwlbIDB4MjAgXSA9IEtFWV9DSEFOTkVMVVAsCS8qIGNoYW5uZWwgLyBwcm9ncmFtICsgKi8KKwlbIDB4MjEgXSA9IEtFWV9DSEFOTkVMRE9XTiwJLyogY2hhbm5lbCAvIHByb2dyYW0gLSAqLworCVsgMHgyMiBdID0gS0VZX0NIQU5ORUwsCQkvKiBhbHQgLyBjaGFubmVsICovCisJWyAweDIzIF0gPSBLRVlfTEFOR1VBR0UsCS8qIDFzdCAvIDJuZCBsYW5ndWFnZSAqLworCVsgMHgyNiBdID0gS0VZX1NMRUVQLAkJLyogc2xlZXB0aW1lciAqLworCVsgMHgyZSBdID0gS0VZX01FTlUsCQkvKiAybmQgY29udHJvbHMgKFVTQTogbWVudSkgKi8KKwlbIDB4MzAgXSA9IEtFWV9QQVVTRSwKKwlbIDB4MzIgXSA9IEtFWV9SRVdJTkQsCisJWyAweDMzIF0gPSBLRVlfR09UTywKKwlbIDB4MzUgXSA9IEtFWV9QTEFZLAorCVsgMHgzNiBdID0gS0VZX1NUT1AsCisJWyAweDM3IF0gPSBLRVlfUkVDT1JELAkJLyogcmVjb3JkaW5nICovCisJWyAweDNjIF0gPSBLRVlfVEVYVCwgICAgCS8qIHRlbGV0ZXh0IHN1Ym1vZGUgKEphcGFuOiAxMikgKi8KKwlbIDB4M2QgXSA9IEtFWV9TVVNQRU5ELAkJLyogc3lzdGVtIHN0YW5kYnkgKi8KIAotI2lmIDAgLyogRklYTUUgKi8KLQlbIDB4MGEgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIDEvMi8zIGRpZ2l0cyAoamFwYW46IDEwKQotCVsgMHgwZSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gUC5QLiAocGVyc29uYWwgcHJlZmVyZW5jZSkKLQlbIDB4MTQgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGNvbG91ciBzYXR1cmF0aW9uICsKLQlbIDB4MTUgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGNvbG91ciBzYXR1cmF0aW9uIC0KLQlbIDB4MTYgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGJhc3MgKwotCVsgMHgxNyBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gYmFzcyAtCi0JWyAweDE4IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB0cmVibGUgKwotCVsgMHgxOSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdHJlYmxlIC0KLQlbIDB4MWEgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGJhbGFuY2UgcmlnaHQKLQlbIDB4MWIgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGJhbGFuY2UgbGVmdAotCVsgMHgxYyBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gY29udHJhc3QgKwotCVsgMHgxZCBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gY29udHJhc3QgLQotCVsgMHgxZiBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdGludC9odWUgKwotCVsgMHgyNCBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gc3BhY2lhbCBzdGVyZW8gb24vb2ZmCi0JWyAweDI1IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBtb25vIC8gc3RlcmVvIChVU0EpCi0JWyAweDI3IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB0aW50IC8gaHVlIC0KLQlbIDB4MjggXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIFJGIHN3aXRjaC9QSVAgc2VsZWN0Ci0JWyAweDI5IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB2b3RlCi0JWyAweDJhIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB0aW1lZCBwYWdlL2NoYW5uZWwgY2xjawotCVsgMHgyYiBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gaW5jcmVtZW50IChVU0EpCi0JWyAweDJjIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBkZWNyZW1lbnQgKFVTQSkKLQlbIDB4MmQgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vCi0JWyAweDJmIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBQSVAgc2hpZnQKLQlbIDB4MzEgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGVyYXNlCi0JWyAweDM0IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB3aW5kCi0JWyAweDM4IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBleHRlcm5hbCAxCi0JWyAweDM5IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBleHRlcm5hbCAyCi0JWyAweDNhIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBQSVAgZGlzcGxheSBtb2RlCi0JWyAweDNiIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyB2aWV3IGRhdGEgbW9kZSAvIGFkdmFuY2UKLQlbIDB4M2UgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGNyaXNwZW5lciBvbi9vZmYKLQlbIDB4M2YgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIHN5c3RlbSBzZWxlY3QKLSNlbmRpZgogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3JjNV90dik7CiAKIC8qIFRhYmxlIGZvciBMZWFkdGVrIFdpbmZhc3QgUmVtb3RlIENvbnRyb2xzIC0gdXNlZCBieSBib3RoIGJ0dHYgYW5kIGN4ODggKi8KIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3dpbmZhc3RbSVJfS0VZVEFCX1NJWkVdID0geworCS8qIEtleXMgMCB0byA5ICovCisJWyAxOCBdID0gS0VZX0tQMCwKIAlbICA1IF0gPSBLRVlfS1AxLAogCVsgIDYgXSA9IEtFWV9LUDIsCiAJWyAgNyBdID0gS0VZX0tQMywKQEAgLTEyOCwzOSArOTgsMzEgQEAKIAlbIDEzIF0gPSBLRVlfS1A3LAogCVsgMTQgXSA9IEtFWV9LUDgsCiAJWyAxNSBdID0gS0VZX0tQOSwKLQlbIDE4IF0gPSBLRVlfS1AwLAogCiAJWyAgMCBdID0gS0VZX1BPV0VSLAotLy8gICAgICBbIDI3IF0gPSBNVFMgYnV0dG9uCi0JWyAgMiBdID0gS0VZX1RVTkVSLCAgICAgLy8gVFYvRk0KKwlbICAyIF0gPSBLRVlfVFVORVIsCQkvKiBUVi9GTSAqLwogCVsgMzAgXSA9IEtFWV9WSURFTywKLS8vICAgICAgWyAyMiBdID0gZGlzcGxheSBidXR0b24KIAlbICA0IF0gPSBLRVlfVk9MVU1FVVAsCiAJWyAgOCBdID0gS0VZX1ZPTFVNRURPV04sCiAJWyAxMiBdID0gS0VZX0NIQU5ORUxVUCwKIAlbIDE2IF0gPSBLRVlfQ0hBTk5FTERPV04sCi0JWyAgMyBdID0gS0VZX1pPT00sICAgICAgLy8gZnVsbHNjcmVlbgotCVsgMzEgXSA9IEtFWV9TVUJUSVRMRSwgIC8vIGNsb3NlZCBjYXB0aW9uL3RlbGV0ZXh0CisJWyAgMyBdID0gS0VZX1pPT00sCQkvKiBmdWxsc2NyZWVuICovCisJWyAzMSBdID0gS0VZX1NVQlRJVExFLAkJLyogY2xvc2VkIGNhcHRpb24vdGVsZXRleHQgKi8KIAlbIDMyIF0gPSBLRVlfU0xFRVAsCi0vLyAgICAgIFsgNDEgXSA9IGJvc3Mga2V5CiAJWyAyMCBdID0gS0VZX01VVEUsCiAJWyA0MyBdID0gS0VZX1JFRCwKIAlbIDQ0IF0gPSBLRVlfR1JFRU4sCiAJWyA0NSBdID0gS0VZX1lFTExPVywKIAlbIDQ2IF0gPSBLRVlfQkxVRSwKLQlbIDI0IF0gPSBLRVlfS1BQTFVTLCAgICAvL2ZpbmUgdHVuZSArCi0JWyAyNSBdID0gS0VZX0tQTUlOVVMsICAgLy9maW5lIHR1bmUgLQotLy8gICAgICBbIDQyIF0gPSBwaWN0dXJlIGluIHBpY3R1cmUKKwlbIDI0IF0gPSBLRVlfS1BQTFVTLAkJLyogZmluZSB0dW5lICsgKi8KKwlbIDI1IF0gPSBLRVlfS1BNSU5VUywJCS8qIGZpbmUgdHVuZSAtICovCiAgICAgICAgIFsgMzMgXSA9IEtFWV9LUERPVCwKIAlbIDE5IF0gPSBLRVlfS1BFTlRFUiwKLS8vICAgICAgWyAxNyBdID0gcmVjYWxsCiAJWyAzNCBdID0gS0VZX0JBQ0ssCiAJWyAzNSBdID0gS0VZX1BMQVlQQVVTRSwKIAlbIDM2IF0gPSBLRVlfTkVYVCwKLS8vICAgICAgWyAzNyBdID0gdGltZSBzaGlmdGluZwogCVsgMzggXSA9IEtFWV9TVE9QLAogCVsgMzkgXSA9IEtFWV9SRUNPUkQKLS8vICAgICAgWyA0MCBdID0gc25hcHNob3QKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc193aW5mYXN0KTsKIApAQCAtMTc0LDU0ICsxMzYsNjEgQEAKICAqIHNsaWdodGx5IGRpZmZlcmVudCB2ZXJzaW9ucyksIHNoaXBwZWQgd2l0aCBjeDg4K2l2dHYgY2FyZHMuCiAgKiBhbG1vc3QgcmM1IGNvZGluZywgYnV0IHNvbWUgbm9uLXN0YW5kYXJkIGtleXMgKi8KIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2hhdXBwYXVnZV9uZXdbSVJfS0VZVEFCX1NJWkVdID0gewotCVsgMHgwMCBdID0gS0VZX0tQMCwgICAgICAgICAgICAgLy8gMAotCVsgMHgwMSBdID0gS0VZX0tQMSwgICAgICAgICAgICAgLy8gMQotCVsgMHgwMiBdID0gS0VZX0tQMiwgICAgICAgICAgICAgLy8gMgotCVsgMHgwMyBdID0gS0VZX0tQMywgICAgICAgICAgICAgLy8gMwotCVsgMHgwNCBdID0gS0VZX0tQNCwgICAgICAgICAgICAgLy8gNAotCVsgMHgwNSBdID0gS0VZX0tQNSwgICAgICAgICAgICAgLy8gNQotCVsgMHgwNiBdID0gS0VZX0tQNiwgICAgICAgICAgICAgLy8gNgotCVsgMHgwNyBdID0gS0VZX0tQNywgICAgICAgICAgICAgLy8gNwotCVsgMHgwOCBdID0gS0VZX0tQOCwgICAgICAgICAgICAgLy8gOAotCVsgMHgwOSBdID0gS0VZX0tQOSwgICAgICAgICAgICAgLy8gOQotCVsgMHgwYSBdID0gS0VZX1RFWFQsICAgICAgCS8vIGtleXBhZCBhc3RlcmlzayBhcyB3ZWxsCi0JWyAweDBiIF0gPSBLRVlfUkVELCAgICAgICAgICAgICAvLyByZWQgYnV0dG9uCi0JWyAweDBjIF0gPSBLRVlfUkFESU8sICAgICAgICAgICAvLyByYWRpbwotCVsgMHgwZCBdID0gS0VZX01FTlUsICAgICAgICAgICAgLy8gbWVudQotCVsgMHgwZSBdID0gS0VZX1NVQlRJVExFLAkvLyBhbHNvIHRoZSAjIGtleQotCVsgMHgwZiBdID0gS0VZX01VVEUsICAgICAgICAgICAgLy8gbXV0ZQotCVsgMHgxMCBdID0gS0VZX1ZPTFVNRVVQLCAgICAgICAgLy8gdm9sdW1lICsKLQlbIDB4MTEgXSA9IEtFWV9WT0xVTUVET1dOLCAgICAgIC8vIHZvbHVtZSAtCi0JWyAweDEyIF0gPSBLRVlfUFJFVklPVVMsICAgICAgICAvLyBwcmV2aW91cyBjaGFubmVsCi0JWyAweDE0IF0gPSBLRVlfVVAsICAgICAgICAgICAgICAvLyB1cAotCVsgMHgxNSBdID0gS0VZX0RPV04sCQkvLyBkb3duCi0JWyAweDE2IF0gPSBLRVlfTEVGVCwJCS8vIGxlZnQKLQlbIDB4MTcgXSA9IEtFWV9SSUdIVCwJCS8vIHJpZ2h0Ci0JWyAweDE4IF0gPSBLRVlfVklERU8sCQkvLyBWaWRlb3MKLQlbIDB4MTkgXSA9IEtFWV9BVURJTywJCS8vIE11c2ljCi0JWyAweDFhIF0gPSBLRVlfTUhQLAkJLy8gUGljdHVyZXMgLSBwcmVzdW1lIHRoaXMgbWVhbnMgIk11bHRpbWVkaWEgSG9tZSBQbGF0Zm9ybSItIG5vICJQSUNUVVJFUyIga2V5IGluIGlucHV0LmgKLQlbIDB4MWIgXSA9IEtFWV9FUEcsCQkvLyBHdWlkZQotCVsgMHgxYyBdID0gS0VZX1RWLAkJLy8gVFYKLQlbIDB4MWUgXSA9IEtFWV9ORVhUU09ORywgICAgICAgIC8vIHNraXAgPnwKLQlbIDB4MWYgXSA9IEtFWV9FWElULCAgICAgICAgICAgIC8vIGJhY2svZXhpdAotCVsgMHgyMCBdID0gS0VZX0NIQU5ORUxVUCwgICAgICAgLy8gY2hhbm5lbCAvIHByb2dyYW0gKwotCVsgMHgyMSBdID0gS0VZX0NIQU5ORUxET1dOLCAgICAgLy8gY2hhbm5lbCAvIHByb2dyYW0gLQotCVsgMHgyMiBdID0gS0VZX0NIQU5ORUwsICAgICAgICAgLy8gc291cmNlIChvbGQgYmxhY2sgcmVtb3RlKQotCVsgMHgyNCBdID0gS0VZX1BSRVZJT1VTU09ORywgICAgLy8gcmVwbGF5IHw8Ci0JWyAweDI1IF0gPSBLRVlfRU5URVIsICAgICAgICAgICAvLyBPSwotCVsgMHgyNiBdID0gS0VZX1NMRUVQLCAgICAgICAgICAgLy8gbWluaW1pemUgKG9sZCBibGFjayByZW1vdGUpCi0JWyAweDI5IF0gPSBLRVlfQkxVRSwgICAgICAgICAgICAvLyBibHVlIGtleQotCVsgMHgyZSBdID0gS0VZX0dSRUVOLCAgICAgICAgICAgLy8gZ3JlZW4gYnV0dG9uCi0JWyAweDMwIF0gPSBLRVlfUEFVU0UsICAgICAgICAgICAvLyBwYXVzZQotCVsgMHgzMiBdID0gS0VZX1JFV0lORCwgICAgICAgICAgLy8gYmFja3dhcmQgPDwKLQlbIDB4MzQgXSA9IEtFWV9GQVNURk9SV0FSRCwgICAgIC8vIGZvcndhcmQgPj4KLQlbIDB4MzUgXSA9IEtFWV9QTEFZLCAgICAgICAgICAgIC8vIHBsYXkKLQlbIDB4MzYgXSA9IEtFWV9TVE9QLCAgICAgICAgICAgIC8vIHN0b3AKLQlbIDB4MzcgXSA9IEtFWV9SRUNPUkQsICAgICAgICAgIC8vIHJlY29yZGluZwotCVsgMHgzOCBdID0gS0VZX1lFTExPVywgICAgICAgICAgLy8geWVsbG93IGtleQotCVsgMHgzYiBdID0gS0VZX1NFTEVDVCwgICAgICAgICAgLy8gdG9wIHJpZ2h0IGJ1dHRvbgotCVsgMHgzYyBdID0gS0VZX1pPT00sICAgICAgICAgICAgLy8gZnVsbAotCVsgMHgzZCBdID0gS0VZX1BPV0VSLCAgICAgICAgICAgLy8gc3lzdGVtIHBvd2VyIChncmVlbiBidXR0b24pCisJLyogS2V5cyAwIHRvIDkgKi8KKwlbIDB4MDAgXSA9IEtFWV9LUDAsCisJWyAweDAxIF0gPSBLRVlfS1AxLAorCVsgMHgwMiBdID0gS0VZX0tQMiwKKwlbIDB4MDMgXSA9IEtFWV9LUDMsCisJWyAweDA0IF0gPSBLRVlfS1A0LAorCVsgMHgwNSBdID0gS0VZX0tQNSwKKwlbIDB4MDYgXSA9IEtFWV9LUDYsCisJWyAweDA3IF0gPSBLRVlfS1A3LAorCVsgMHgwOCBdID0gS0VZX0tQOCwKKwlbIDB4MDkgXSA9IEtFWV9LUDksCisKKwlbIDB4MGEgXSA9IEtFWV9URVhULCAgICAgIAkvKiBrZXlwYWQgYXN0ZXJpc2sgYXMgd2VsbCAqLworCVsgMHgwYiBdID0gS0VZX1JFRCwJCS8qIHJlZCBidXR0b24gKi8KKwlbIDB4MGMgXSA9IEtFWV9SQURJTywKKwlbIDB4MGQgXSA9IEtFWV9NRU5VLAorCVsgMHgwZSBdID0gS0VZX1NVQlRJVExFLAkvKiBhbHNvIHRoZSAjIGtleSAqLworCVsgMHgwZiBdID0gS0VZX01VVEUsCisJWyAweDEwIF0gPSBLRVlfVk9MVU1FVVAsCisJWyAweDExIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbIDB4MTIgXSA9IEtFWV9QUkVWSU9VUywJLyogcHJldmlvdXMgY2hhbm5lbCAqLworCVsgMHgxNCBdID0gS0VZX1VQLAorCVsgMHgxNSBdID0gS0VZX0RPV04sCisJWyAweDE2IF0gPSBLRVlfTEVGVCwKKwlbIDB4MTcgXSA9IEtFWV9SSUdIVCwKKwlbIDB4MTggXSA9IEtFWV9WSURFTywJCS8qIFZpZGVvcyAqLworCVsgMHgxOSBdID0gS0VZX0FVRElPLAkJLyogTXVzaWMgKi8KKwkvKiAweDFhOiBQaWN0dXJlcyAtIHByZXN1bWUgdGhpcyBtZWFucworCSAgICJNdWx0aW1lZGlhIEhvbWUgUGxhdGZvcm0iIC0KKwkgICBubyAiUElDVFVSRVMiIGtleSBpbiBpbnB1dC5oCisJICovCisJWyAweDFhIF0gPSBLRVlfTUhQLAorCisJWyAweDFiIF0gPSBLRVlfRVBHLAkJLyogR3VpZGUgKi8KKwlbIDB4MWMgXSA9IEtFWV9UViwKKwlbIDB4MWUgXSA9IEtFWV9ORVhUU09ORywJLyogc2tpcCA+fCAqLworCVsgMHgxZiBdID0gS0VZX0VYSVQsCQkvKiBiYWNrL2V4aXQgKi8KKwlbIDB4MjAgXSA9IEtFWV9DSEFOTkVMVVAsCS8qIGNoYW5uZWwgLyBwcm9ncmFtICsgKi8KKwlbIDB4MjEgXSA9IEtFWV9DSEFOTkVMRE9XTiwJLyogY2hhbm5lbCAvIHByb2dyYW0gLSAqLworCVsgMHgyMiBdID0gS0VZX0NIQU5ORUwsCQkvKiBzb3VyY2UgKG9sZCBibGFjayByZW1vdGUpICovCisJWyAweDI0IF0gPSBLRVlfUFJFVklPVVNTT05HLAkvKiByZXBsYXkgfDwgKi8KKwlbIDB4MjUgXSA9IEtFWV9FTlRFUiwJCS8qIE9LICovCisJWyAweDI2IF0gPSBLRVlfU0xFRVAsCQkvKiBtaW5pbWl6ZSAob2xkIGJsYWNrIHJlbW90ZSkgKi8KKwlbIDB4MjkgXSA9IEtFWV9CTFVFLAkJLyogYmx1ZSBrZXkgKi8KKwlbIDB4MmUgXSA9IEtFWV9HUkVFTiwJCS8qIGdyZWVuIGJ1dHRvbiAqLworCVsgMHgzMCBdID0gS0VZX1BBVVNFLAkJLyogcGF1c2UgKi8KKwlbIDB4MzIgXSA9IEtFWV9SRVdJTkQsCQkvKiBiYWNrd2FyZCA8PCAqLworCVsgMHgzNCBdID0gS0VZX0ZBU1RGT1JXQVJELAkvKiBmb3J3YXJkID4+ICovCisJWyAweDM1IF0gPSBLRVlfUExBWSwKKwlbIDB4MzYgXSA9IEtFWV9TVE9QLAorCVsgMHgzNyBdID0gS0VZX1JFQ09SRCwJCS8qIHJlY29yZGluZyAqLworCVsgMHgzOCBdID0gS0VZX1lFTExPVywJCS8qIHllbGxvdyBrZXkgKi8KKwlbIDB4M2IgXSA9IEtFWV9TRUxFQ1QsCQkvKiB0b3AgcmlnaHQgYnV0dG9uICovCisJWyAweDNjIF0gPSBLRVlfWk9PTSwJCS8qIGZ1bGwgKi8KKwlbIDB4M2QgXSA9IEtFWV9QT1dFUiwJCS8qIHN5c3RlbSBwb3dlciAoZ3JlZW4gYnV0dG9uKSAqLwogfTsKIEVYUE9SVF9TWU1CT0woaXJfY29kZXNfaGF1cHBhdWdlX25ldyk7CiAKQEAgLTIzNyw5ICsyMDYsOSBAQAogCVsgMTAgXSA9IEtFWV9LUDgsCiAJWyAxOCBdID0gS0VZX0tQOSwKIAotCVsgIDMgXSA9IEtFWV9UVU5FUiwgICAgICAgLy8gVFYvRk0KLQlbICA3IF0gPSBLRVlfU0VBUkNILCAgICAgIC8vIHNjYW4KLQlbIDI4IF0gPSBLRVlfWk9PTSwgICAgICAgIC8vIGZ1bGwgc2NyZWVuCisJWyAgMyBdID0gS0VZX1RVTkVSLAkJLyogVFYvRk0gKi8KKwlbICA3IF0gPSBLRVlfU0VBUkNILAkJLyogc2NhbiAqLworCVsgMjggXSA9IEtFWV9aT09NLAkJLyogZnVsbCBzY3JlZW4gKi8KIAlbIDMwIF0gPSBLRVlfUE9XRVIsCiAJWyAyMyBdID0gS0VZX1ZPTFVNRURPV04sCiAJWyAzMSBdID0gS0VZX1ZPTFVNRVVQLApAQCAtMjQ3LDE0ICsyMTYsMTQgQEAKIAlbIDIyIF0gPSBLRVlfQ0hBTk5FTFVQLAogCVsgMjQgXSA9IEtFWV9NVVRFLAogCi0JWyAgMCBdID0gS0VZX0xJU1QsICAgICAgICAvLyBzb3VyY2UKLQlbIDE5IF0gPSBLRVlfSU5GTywgICAgICAgIC8vIGxvb3AKLQlbIDE2IF0gPSBLRVlfTEFTVCwgICAgICAgIC8vICsxMDAKLQlbIDEzIF0gPSBLRVlfQ0xFQVIsICAgICAgIC8vIHJlc2V0Ci0JWyAxMiBdID0gQlROX1JJR0hULCAgICAgICAvLyBmdW4rKwotCVsgIDQgXSA9IEJUTl9MRUZULCAgICAgICAgLy8gZnVuLS0KLQlbIDE0IF0gPSBLRVlfR09UTywgICAgICAgIC8vIGZ1bmN0aW9uCi0JWyAxNSBdID0gS0VZX1NUT1AsICAgICAgICAgLy8gZnJlZXplCisJWyAgMCBdID0gS0VZX0xJU1QsCQkvKiBzb3VyY2UgKi8KKwlbIDE5IF0gPSBLRVlfSU5GTywJCS8qIGxvb3AgKi8KKwlbIDE2IF0gPSBLRVlfTEFTVCwJCS8qICsxMDAgKi8KKwlbIDEzIF0gPSBLRVlfQ0xFQVIsCQkvKiByZXNldCAqLworCVsgMTIgXSA9IEJUTl9SSUdIVCwJCS8qIGZ1bisrICovCisJWyAgNCBdID0gQlROX0xFRlQsCQkvKiBmdW4tLSAqLworCVsgMTQgXSA9IEtFWV9HT1RPLAkJLyogZnVuY3Rpb24gKi8KKwlbIDE1IF0gPSBLRVlfU1RPUCwJCS8qIGZyZWV6ZSAqLwogfTsKIEVYUE9SVF9TWU1CT0woaXJfY29kZXNfcGl4ZWx2aWV3KTsKIApAQCAtMzIxLDEwICsyOTAsNiBAQAogCQlpci0+a2V5cHJlc3NlZCA9IDE7CiAJCWlyX2lucHV0X2tleV9ldmVudChkZXYsaXIpOwogCX0KLSNpZiAwCi0JLyogbWF5YmUgZG8gc29tZXRoaW5nIGxpa2UgdGhpcyA/Pz8gKi8KLQlpbnB1dF9ldmVudChhLCBFVl9JUiwgaXItPmlyX3R5cGUsIGlyLT5pcl9yYXcpOwotI2VuZGlmCiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCmluZGV4IDUwZThiODYuLmNkNTgyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCkBAIC02MiwxMyArNjIsMTUgQEAKIGludCBzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgaW50IG5vYnVzeWxvb3ApCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgZXJyOwogCiAJLyogd2FpdCBmb3IgcmVnaXN0ZXJzIHRvIGJlIHByb2dyYW1tZWQgKi8KIAlzdGFydCA9IGppZmZpZXM7CiAJd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2FhNzE0Nl9yZWFkKGRldiwgTUMyKSAmIDIpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBIWi8yMCkpIHsKKwkJZXJyID0gdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEhaLzIwKTsKKwkJaWYgKHNhYTcxNDZfcmVhZChkZXYsIE1DMikgJiAyKQorCQkJYnJlYWs7CisJCWlmIChlcnIpIHsKIAkJCURFQl9TKCgidGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHJlZ2lzdGVycyBnZXR0aW5nIHByb2dyYW1tZWRcbiIpKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CkBAIC03OSwxMCArODEsMTEgQEAKIAkvKiB3YWl0IGZvciB0cmFuc2ZlciB0byBjb21wbGV0ZSAqLwogCXN0YXJ0ID0gamlmZmllczsKIAl3aGlsZSAoMSkgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgSFovNCk7CiAJCWlmICghKHNhYTcxNDZfcmVhZChkZXYsIFBTUikgJiBTUENJX0RFQklfUykpCiAJCQlicmVhazsKIAkJc2FhNzE0Nl9yZWFkKGRldiwgTUMyKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBIWi80KSkgeworCQlpZiAoZXJyKSB7CiAJCQlERUJfUygoInRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0cmFuc2ZlciBjb21wbGV0aW9uXG4iKSk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQpAQCAtNTEyLDcgKzUxNSw3IEBACiAJZXh0LT5kcml2ZXIucmVtb3ZlID0gc2FhNzE0Nl9yZW1vdmVfb25lOwogCiAJcHJpbnRrKCJzYWE3MTQ2OiByZWdpc3RlciBleHRlbnNpb24gJyVzJy5cbiIsZXh0LT5uYW1lKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZleHQtPmRyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmV4dC0+ZHJpdmVyKTsKIH0KIAogaW50IHNhYTcxNDZfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uKiBleHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZwppbmRleCAwMTM4N2Y4Li4zZjBlYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKQEAgLTQwLDYgKzQwLDEwIEBACiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZyIKIAorY29tbWVudCAiU3VwcG9ydGVkIFBsdXRvMiBBZGFwdGVycyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQorc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvS2NvbmZpZyIKKwogY29tbWVudCAiU3VwcG9ydGVkIERWQiBGcm9udGVuZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKaW5kZXggM2M2ZmYxNi4uYTdhZDA4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKQEAgLTIsNCArMiw0IEBACiAjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIG11bHRpbWVkaWEgZGV2aWNlIGRyaXZlcnMuCiAjCiAKLW9iai15ICAgICAgICA6PSBkdmItY29yZS8gZnJvbnRlbmRzLyB0dHBjaS8gdHR1c2ItZGVjLyB0dHVzYi1idWRnZXQvIGIyYzIvIGJ0OHh4LyBjaW5lcmd5VDIvIGR2Yi11c2IvCitvYmoteSAgICAgICAgOj0gZHZiLWNvcmUvIGZyb250ZW5kcy8gdHRwY2kvIHR0dXNiLWRlYy8gdHR1c2ItYnVkZ2V0LyBiMmMyLyBidDh4eC8gY2luZXJneVQyLyBkdmItdXNiLyBwbHV0bzIvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcKaW5kZXggZmFmZDBhYi4uZDc0MTdlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZwpAQCAtMzUsMTcgKzM1LDMgQEAKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIG1vZHVsZSBvcHRpb24gdG8gY29udHJvbCBkZWJ1ZyBtZXNzYWdlcwogCSAgb2YgYWxsIEIyQzIgRmxleENvcCBkcml2ZXJzLgotCi1jb25maWcgRFZCX0IyQzJfU0tZU1RBUgotCXRyaXN0YXRlICJCMkMyL1RlY2huaXNhdCBBaXIvU2t5L0NhYmxlU3RhciAyIFBDSSIKLQlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQotCXNlbGVjdCBEVkJfU1RWMDI5OQotCXNlbGVjdCBEVkJfTVQzNTIKLQlzZWxlY3QgRFZCX01UMzEyCi0Jc2VsZWN0IERWQl9OWFQyMDAyCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgdGhlIFNreXN0YXIyIFBDSSBEVkIgY2FyZCBieSBUZWNobmlzYXQsIHdoaWNoCi0JICBpcyBlcXVpcHBlZCB3aXRoIHRoZSBGbGV4Q29wSUkgY2hpcHNldCBieSBCMkMyLCBhbmQKLQkgIGZvciB0aGUgQjJDMi9CQlRJIEFpcjJQQy1BVFNDIGNhcmQuCi0KLQkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9NYWtlZmlsZQppbmRleCA3NzAzODEyLi4xYTFjM2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvTWFrZWZpbGUKQEAgLTksNiArOSw0IEBACiBiMmMyLWZsZXhjb3AtdXNiLW9ianMgPSBmbGV4Y29wLXVzYi5vCiBvYmotJChDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9VU0IpICs9IGIyYzItZmxleGNvcC11c2IubwogCi1vYmotJChDT05GSUdfRFZCX0IyQzJfU0tZU1RBUikgKz0gc2t5c3RhcjIubwotCiBFWFRSQV9DRkxBR1MgPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1jb21tb24uaAppbmRleCA3NzNkMTU4Li5hOTQ5MTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWNvbW1vbi5oCkBAIC0xMDgsNiArMTA4LDggQEAKIGludCAgZmxleGNvcF9kZXZpY2VfaW5pdGlhbGl6ZShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UqKTsKIHZvaWQgZmxleGNvcF9kZXZpY2VfZXhpdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKIAordm9pZCBmbGV4Y29wX3Jlc2V0X2Jsb2NrXzMwMChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKKwogLyogZnJvbSBmbGV4Y29wLWRtYS5jICovCiBpbnQgZmxleGNvcF9kbWFfYWxsb2NhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hLCB1MzIgc2l6ZSk7CiB2b2lkIGZsZXhjb3BfZG1hX2ZyZWUoc3RydWN0IGZsZXhjb3BfZG1hICpkbWEpOwpAQCAtMTE1LDcgKzExNyw4IEBACiBpbnQgZmxleGNvcF9kbWFfY29udHJvbF90aW1lcl9pcnEoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9kbWFfaW5kZXhfdCBubywgaW50IG9ub2ZmKTsKIGludCBmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZik7CiBpbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZik7Ci1pbnQgZmxleGNvcF9kbWFfY29uZmlnKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsZmxleGNvcF9kbWFfYWRkcl9pbmRleF90IGluZGV4KTsKK2ludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCk7CitpbnQgZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwgZmxleGNvcF9kbWFfYWRkcl9pbmRleF90IGluZGV4LCBpbnQgb25vZmYpOwogaW50IGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IGN5Y2xlcyk7CiBpbnQgZmxleGNvcF9kbWFfY29uZmlnX3BhY2tldF9jb3VudChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IHBhY2tldHMpOwogCkBAIC0xNTEsNiArMTU0LDcgQEAKIC8qIGZyb20gZmxleGNvcC1taXNjLmMgKi8KIHZvaWQgZmxleGNvcF9kZXRlcm1pbmVfcmV2aXNpb24oc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyk7CiB2b2lkIGZsZXhjb3BfZGV2aWNlX25hbWUoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyxjb25zdCBjaGFyICpwcmVmaXgsY29uc3QgY2hhciAqc3VmZml4KTsKK3ZvaWQgZmxleGNvcF9kdW1wX3JlZyhzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2liaV9yZWdpc3RlciByZWcsIGludCBudW0pOwogCiAvKiBmcm9tIGZsZXhjb3AtaHctZmlsdGVyLmMgKi8KIGludCBmbGV4Y29wX3BpZF9mZWVkX2NvbnRyb2woc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkLCBpbnQgb25vZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWRtYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWRtYS5jCmluZGV4IDhkMjcwNjAuLmNmNGVkMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1kbWEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZG1hLmMKQEAgLTM3LDIyICszNyw5MCBAQAogfQogRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9mcmVlKTsKIAotaW50IGZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKK2ludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywKKwkJc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCkKIHsKLQlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCk7CisJZmxleGNvcF9pYmlfdmFsdWUgdjB4MCx2MHg0LHYweGM7CisJdjB4MC5yYXcgPSB2MHg0LnJhdyA9IHYweGMucmF3ID0gMDsKIAotCWlmIChubyAmIEZDX0RNQV8xKQotCQl2LmN0cmxfMjA4LkRNQTFfVGltZXJfRW5hYmxlX3NpZyA9IG9ub2ZmOworCXYweDAuZG1hXzB4MC5kbWFfYWRkcmVzczAgICAgICAgID0gZG1hLT5kbWFfYWRkcjAgPj4gMjsKKwl2MHhjLmRtYV8weGMuZG1hX2FkZHJlc3MxICAgICAgICA9IGRtYS0+ZG1hX2FkZHIxID4+IDI7CisJdjB4NC5kbWFfMHg0X3dyaXRlLmRtYV9hZGRyX3NpemUgPSBkbWEtPnNpemUgLyA0OwogCi0JaWYgKG5vICYgRkNfRE1BXzIpCi0JCXYuY3RybF8yMDguRE1BMl9UaW1lcl9FbmFibGVfc2lnID0gb25vZmY7CisJaWYgKChkbWFfaWR4ICYgRkNfRE1BXzEpID09IGRtYV9pZHgpIHsKKwkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMV8wMDAsdjB4MCk7CisJCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTFfMDA0LHYweDQpOworCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWExXzAwYyx2MHhjKTsKKwl9IGVsc2UgaWYgKChkbWFfaWR4ICYgRkNfRE1BXzIpID09IGRtYV9pZHgpIHsKKwkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMl8wMTAsdjB4MCk7CisJCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTJfMDE0LHYweDQpOworCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWEyXzAxYyx2MHhjKTsKKwl9IGVsc2UgeworCQllcnIoImVpdGhlciBETUExIG9yIERNQTIgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgdGhlIHdpdGhpbiBvbmUgZmxleGNvcF9kbWFfY29uZmlnIGNhbGwuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycSk7CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZyk7CiAKLWludCBmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKKy8qIHN0YXJ0IHRoZSBETUEgdHJhbnNmZXJzLCBidXQgbm90IHRoZSBETUEgSVJRcyAqLworaW50IGZsZXhjb3BfZG1hX3hmZXJfY29udHJvbChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsCisJCWZsZXhjb3BfZG1hX2FkZHJfaW5kZXhfdCBpbmRleCwKKwkJaW50IG9ub2ZmKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHYweDAsdjB4YzsKKwlmbGV4Y29wX2liaV9yZWdpc3RlciByMHgwLHIweGM7CisKKwlpZiAoKGRtYV9pZHggJiBGQ19ETUFfMSkgPT0gZG1hX2lkeCkgeworCQlyMHgwID0gZG1hMV8wMDA7CisJCXIweGMgPSBkbWExXzAwYzsKKwl9IGVsc2UgaWYgKChkbWFfaWR4ICYgRkNfRE1BXzIpID09IGRtYV9pZHgpIHsKKwkJcjB4MCA9IGRtYTJfMDEwOworCQlyMHhjID0gZG1hMl8wMWM7CisJfSBlbHNlIHsKKwkJZXJyKCJlaXRoZXIgdHJhbnNmZXIgRE1BMSBvciBETUEyIGNhbiBiZSBzdGFydGVkIHdpdGhpbiBvbmUgZmxleGNvcF9kbWFfeGZlcl9jb250cm9sIGNhbGwuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXYweDAgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIweDApOworCXYweGMgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIweGMpOworCisJZGViX3JkdW1wKCJyZWc6ICUwM3g6ICV4XG4iLHIweDAsdjB4MC5yYXcpOworCWRlYl9yZHVtcCgicmVnOiAlMDN4OiAleFxuIixyMHhjLHYweGMucmF3KTsKKworCWlmIChpbmRleCAmIEZDX0RNQV9TVUJBRERSXzApCisJCXYweDAuZG1hXzB4MC5kbWFfMHN0YXJ0ID0gb25vZmY7CisKKwlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8xKQorCQl2MHhjLmRtYV8weGMuZG1hXzFzdGFydCA9IG9ub2ZmOworCisJZmMtPndyaXRlX2liaV9yZWcoZmMscjB4MCx2MHgwKTsKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyMHhjLHYweGMpOworCisJZGViX3JkdW1wKCJyZWc6ICUwM3g6ICV4XG4iLHIweDAsdjB4MC5yYXcpOworCWRlYl9yZHVtcCgicmVnOiAlMDN4OiAleFxuIixyMHhjLHYweGMucmF3KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKTsKKworc3RhdGljIGludCBmbGV4Y29wX2RtYV9yZW1hcChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsCisJCWludCBvbm9mZikKK3sKKwlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwYyA6IGRtYTJfMDFjOworCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOworCWRlYl9pbmZvKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCXYuZG1hXzB4Yy5yZW1hcF9lbmFibGUgPSBvbm9mZjsKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyLHYpOworCXJldHVybiAwOworfQorCitpbnQgZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IG5vLAorCQlpbnQgb25vZmYpCiB7CiAJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsY3RybF8yMDgpOwogCkBAIC02Nyw3NSArMTM1LDY0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbnRyb2xfc2l6ZV9pcnEpOwogCi1pbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKK2ludCBmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IG5vLAorCQlpbnQgb25vZmYpCiB7CiAJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsY3RybF8yMDgpOwogCiAJaWYgKG5vICYgRkNfRE1BXzEpCisJCXYuY3RybF8yMDguRE1BMV9UaW1lcl9FbmFibGVfc2lnID0gb25vZmY7CisKKwlpZiAobm8gJiBGQ19ETUFfMikKKwkJdi5jdHJsXzIwOC5ETUEyX1RpbWVyX0VuYWJsZV9zaWcgPSBvbm9mZjsKKworCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycSk7CisKKy8qIDEgY3ljbGVzID0gMS45NyBtc2VjICovCitpbnQgZmxleGNvcF9kbWFfY29uZmlnX3RpbWVyKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwKKwkJdTggY3ljbGVzKQoreworCWZsZXhjb3BfaWJpX3JlZ2lzdGVyIHIgPSAoZG1hX2lkeCAmIEZDX0RNQV8xKSA/IGRtYTFfMDA0IDogZG1hMl8wMTQ7CisJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMscik7CisKKwlmbGV4Y29wX2RtYV9yZW1hcChmYyxkbWFfaWR4LDApOworCisJZGViX2luZm8oIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisJdi5kbWFfMHg0X3dyaXRlLmRtYXRpbWVyID0gY3ljbGVzOworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHIsdik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcik7CisKKy8qIHBhY2tldCBJUlEgZG9lcyBub3QgZXhpc3QgaW4gRkNJSSBvciBGQ0lJYiAtIGFjY29yZGluZyB0byBkYXRhIGJvb2sgYW5kIHRlc3RzICovCitpbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sCisJCWludCBvbm9mZikKK3sKKwlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCk7CisKKwlkZWJfcmR1bXAoInJlZzogJTAzeDogJXhcbiIsY3RybF8yMDgsdi5yYXcpOworCWlmIChubyAmIEZDX0RNQV8xKQogCQl2LmN0cmxfMjA4LkRNQTFfU2l6ZV9JUlFfRW5hYmxlX3NpZyA9IG9ub2ZmOwogCiAJaWYgKG5vICYgRkNfRE1BXzIpCiAJCXYuY3RybF8yMDguRE1BMl9TaXplX0lSUV9FbmFibGVfc2lnID0gb25vZmY7CiAKIAlmYy0+d3JpdGVfaWJpX3JlZyhmYyxjdHJsXzIwOCx2KTsKKwlkZWJfcmR1bXAoInJlZzogJTAzeDogJXhcbiIsY3RybF8yMDgsdi5yYXcpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycSk7CiAKLWludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCxmbGV4Y29wX2RtYV9hZGRyX2luZGV4X3QgaW5kZXgpCi17Ci0KLQlmbGV4Y29wX2liaV92YWx1ZSB2MHgwLHYweDQsdjB4YzsKLQl2MHgwLnJhdyA9IHYweDQucmF3ID0gdjB4Yy5yYXcgPSAwOwotCi0JdjB4MC5kbWFfMHgwLmRtYV9hZGRyZXNzMCAgICAgICAgPSBkbWEtPmRtYV9hZGRyMCA+PiAyOwotCXYweGMuZG1hXzB4Yy5kbWFfYWRkcmVzczEgICAgICAgID0gZG1hLT5kbWFfYWRkcjEgPj4gMjsKLQl2MHg0LmRtYV8weDRfd3JpdGUuZG1hX2FkZHJfc2l6ZSA9IGRtYS0+c2l6ZSAvIDQ7Ci0KLQlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8wKQotCQl2MHgwLmRtYV8weDAuZG1hXzBzdGFydCA9IDE7Ci0KLQlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8xKQotCQl2MHhjLmRtYV8weGMuZG1hXzFzdGFydCA9IDE7Ci0KLQlpZiAoZG1hX2lkeCAmIEZDX0RNQV8xKSB7Ci0JCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTFfMDAwLHYweDApOwotCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWExXzAwNCx2MHg0KTsKLQkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMV8wMGMsdjB4Yyk7Ci0JfSBlbHNlIHsgLyogKGRtYV9pZHggJiBGQ19ETUFfMikgKi8KLQkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMl8wMTAsdjB4MCk7Ci0JCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTJfMDE0LHYweDQpOwotCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWEyXzAxYyx2MHhjKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZmxleGNvcF9kbWFfY29uZmlnKTsKLQotc3RhdGljIGludCBmbGV4Y29wX2RtYV9yZW1hcChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIGludCBvbm9mZikKLXsKLQlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwYyA6IGRtYTJfMDFjOwotCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwotCXYuZG1hXzB4Yy5yZW1hcF9lbmFibGUgPSBvbm9mZjsKLQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyLHYpOwotCXJldHVybiAwOwotfQotCi0vKiAxIGN5Y2xlcyA9IDEuOTcgbXNlYyAqLwotaW50IGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IGN5Y2xlcykKLXsKLQlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwNCA6IGRtYTJfMDE0OwotCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwotCi0JZmxleGNvcF9kbWFfcmVtYXAoZmMsZG1hX2lkeCwwKTsKLQotCXYuZG1hXzB4NF93cml0ZS5kbWF0aW1lciA9IGN5Y2xlcyA+PiAxOwotCWZjLT53cml0ZV9pYmlfcmVnKGZjLHIsdik7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcik7Ci0KLWludCBmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwgdTggcGFja2V0cykKK2ludCBmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwKKwkJdTggcGFja2V0cykKIHsKIAlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwNCA6IGRtYTJfMDE0OwogCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWh3LWZpbHRlci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWh3LWZpbHRlci5jCmluZGV4IDJiYWY0M2QuLjc1Y2YyMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1ody1maWx0ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtaHctZmlsdGVyLmMKQEAgLTEwLDYgKzEwLDggQEAKIHN0YXRpYyB2b2lkIGZsZXhjb3BfcmN2X2RhdGFfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBpbnQgb25vZmYpCiB7CiAJZmxleGNvcF9zZXRfaWJpX3ZhbHVlKGN0cmxfMjA4LFJjdl9EYXRhX3NpZyxvbm9mZik7CisKKwlkZWJfdHMoInJjdl9kYXRhIGlzIG5vdzogJyVzJ1xuIixvbm9mZiA/ICJvbiIgOiAib2ZmIik7CiB9CiAKIHZvaWQgZmxleGNvcF9zbWNfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBpbnQgb25vZmYpCkBAIC0xNTEsNyArMTUzLDcgQEAKIHsKIAlpbnQgbWF4X3BpZF9maWx0ZXIgPSA2ICsgZmMtPmhhc18zMl9od19waWRfZmlsdGVyKjMyOwogCi0JZmMtPmZlZWRjb3VudCArPSBvbm9mZiA/IDEgOiAtMTsKKwlmYy0+ZmVlZGNvdW50ICs9IG9ub2ZmID8gMSA6IC0xOyAvKiB0aGUgbnVtYmVyIG9mIFBJRHMvRmVlZCBjdXJyZW50bHkgcmVxdWVzdGVkICovCiAJaWYgKGR2YmRteGZlZWQtPmluZGV4ID49IG1heF9waWRfZmlsdGVyKQogCQlmYy0+ZXh0cmFfZmVlZGNvdW50ICs9IG9ub2ZmID8gMSA6IC0xOwogCkBAIC0xNzgsOCArMTgwLDE0IEBACiAJLyogaWYgaXQgd2FzIHRoZSBmaXJzdCBvciBsYXN0IGZlZWQgcmVxdWVzdCBjaGFuZ2UgdGhlIHN0cmVhbS1zdGF0dXMgKi8KIAlpZiAoZmMtPmZlZWRjb3VudCA9PSBvbm9mZikgewogCQlmbGV4Y29wX3Jjdl9kYXRhX2N0cmwoZmMsb25vZmYpOwotCQlpZiAoZmMtPnN0cmVhbV9jb250cm9sKQorCQlpZiAoZmMtPnN0cmVhbV9jb250cm9sKSAvKiBkZXZpY2Ugc3BlY2lmaWMgc3RyZWFtIGNvbnRyb2wgKi8KIAkJCWZjLT5zdHJlYW1fY29udHJvbChmYyxvbm9mZik7CisKKwkJLyogZmVlZGluZyBzdG9wcGVkIC0+IHJlc2V0IHRoZSBmbGV4Y29wIGZpbHRlciovCisJCWlmIChvbm9mZiA9PSAwKSB7CisJCQlmbGV4Y29wX3Jlc2V0X2Jsb2NrXzMwMChmYyk7CisJCQlmbGV4Y29wX2h3X2ZpbHRlcl9pbml0KGZjKTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLW1pc2MuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1taXNjLmMKaW5kZXggMjMwODI1NC4uM2EwOGQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLW1pc2MuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtbWlzYy5jCkBAIC02NSwzICs2NSwxNSBAQAogCQkJZmxleGNvcF9kZXZpY2VfbmFtZXNbZmMtPmRldl90eXBlXSxmbGV4Y29wX2J1c19uYW1lc1tmYy0+YnVzX3R5cGVdLAogCQkJZmxleGNvcF9yZXZpc2lvbl9uYW1lc1tmYy0+cmV2XSxzdWZmaXgpOwogfQorCit2b2lkIGZsZXhjb3BfZHVtcF9yZWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9pYmlfcmVnaXN0ZXIgcmVnLCBpbnQgbnVtKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHY7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHJlZys0KmkpOworCQlkZWJfcmR1bXAoIjB4JTAzeDogJTA4eCwgIixyZWcrNCppLCB2LnJhdyk7CisJfQorCWRlYl9yZHVtcCgiXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9kdW1wX3JlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKaW5kZXggZWQ3MTdjMC4uMmY3NmViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXBjaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1wY2kuYwpAQCAtMTMsNiArMTMsMTAgQEAKIG1vZHVsZV9wYXJhbShlbmFibGVfcGlkX2ZpbHRlcmluZywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX3BpZF9maWx0ZXJpbmcsICJlbmFibGUgaGFyZHdhcmUgcGlkIGZpbHRlcmluZzogc3VwcG9ydGVkIHZhbHVlczogMCAoZnVsbHRzKSwgMSIpOwogCitzdGF0aWMgaW50IGlycV9jaGtfaW50djsKK21vZHVsZV9wYXJhbShpcnFfY2hrX2ludHYsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycV9jaGtfaW50diwgInNldCB0aGUgaW50ZXJ2YWwgZm9yIElSUSB3YXRjaGRvZyAoY3VycmVudGx5IGp1c3QgZGVidWdnaW5nKS4iKTsKKwogI2lmZGVmIENPTkZJR19EVkJfQjJDMl9GTEVYQ09QX0RFQlVHCiAjZGVmaW5lIGRwcmludGsobGV2ZWwsYXJncy4uLikgXAogCWRvIHsgaWYgKChkZWJ1ZyAmIGxldmVsKSkgcHJpbnRrKGFyZ3MpOyB9IHdoaWxlICgwKQpAQCAtMjYsNiArMzAsNyBAQAogI2RlZmluZSBkZWJfcmVnKGFyZ3MuLi4pICAgZHByaW50aygweDAyLGFyZ3MpCiAjZGVmaW5lIGRlYl90cyhhcmdzLi4uKSAgICBkcHJpbnRrKDB4MDQsYXJncykKICNkZWZpbmUgZGViX2lycShhcmdzLi4uKSAgIGRwcmludGsoMHgwOCxhcmdzKQorI2RlZmluZSBkZWJfY2hrKGFyZ3MuLi4pICAgZHByaW50aygweDEwLGFyZ3MpCiAKIHN0YXRpYyBpbnQgZGVidWcgPSAwOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpAQCAtNTYsNiArNjEsMTAgQEAKIAogCXNwaW5sb2NrX3QgaXJxX2xvY2s7CiAKKwl1bnNpZ25lZCBsb25nIGxhc3RfaXJxOworCisJc3RydWN0IHdvcmtfc3RydWN0IGlycV9jaGVja193b3JrOworCiAJc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmY19kZXY7CiB9OwogCkBAIC04OCwxOCArOTcsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZmxleGNvcF9wY2lfaXJxX2NoZWNrX3dvcmsodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSA9IGRhdGE7CisJc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyA9IGZjX3BjaS0+ZmNfZGV2OworCisJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsc3JhbV9kZXN0X3JlZ183MTQpOworCisJZmxleGNvcF9kdW1wX3JlZyhmY19wY2ktPmZjX2RldixkbWExXzAwMCw0KTsKKworCWlmICh2LnNyYW1fZGVzdF9yZWdfNzE0Lm5ldF9vdmZsb3dfZXJyb3IpCisJCWRlYl9jaGsoInNyYW0gbmV0X292Zmxvd19lcnJvclxuIik7CisJaWYgKHYuc3JhbV9kZXN0X3JlZ183MTQubWVkaWFfb3ZmbG93X2Vycm9yKQorCQlkZWJfY2hrKCJzcmFtIG1lZGlhX292Zmxvd19lcnJvclxuIik7CisJaWYgKHYuc3JhbV9kZXN0X3JlZ183MTQuY2FpX292Zmxvd19lcnJvcikKKwkJZGViX2Noaygic3JhbSBjYWlfb3ZmbG93X2Vycm9yXG4iKTsKKwlpZiAodi5zcmFtX2Rlc3RfcmVnXzcxNC5jYWlfb3ZmbG93X2Vycm9yKQorCQlkZWJfY2hrKCJzcmFtIGNhaV9vdmZsb3dfZXJyb3JcbiIpOworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmY19wY2ktPmlycV9jaGVja193b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyhpcnFfY2hrX2ludHYgPCAxMDAgPyAxMDAgOiBpcnFfY2hrX2ludHYpKTsKK30KKwogLyogV2hlbiBQSUQgZmlsdGVyaW5nIGlzIHR1cm5lZCBvbiwgd2UgdXNlIHRoZSB0aW1lciBJUlEsIGJlY2F1c2Ugc21hbGwgYW1vdW50cwogICogb2YgZGF0YSBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUgdXNlciBzcGFjZSBpbnN0YW50bHkgYXMgd2VsbC4gV2hlbiBQSUQKICAqIGZpbHRlcmluZyBpcyB0dXJuZWQgb2ZmLCB3ZSB1c2UgdGhlIHBhZ2UtY2hhbmdlLUlSUSAqLwotc3RhdGljIGlycXJldHVybl90IGZsZXhjb3BfcGNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IGZsZXhjb3BfcGNpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBmbGV4Y29wX3BjaSAqZmNfcGNpID0gZGV2X2lkOwogCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBmY19wY2ktPmZjX2RldjsKLQlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxpcnFfMjBjKTsKKwlmbGV4Y29wX2liaV92YWx1ZSB2OwogCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOwogCiAJc3Bpbl9sb2NrX2lycSgmZmNfcGNpLT5pcnFfbG9jayk7CiAKKwl2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxpcnFfMjBjKTsKKworICAgLyogZXJyb3JzICovCisJaWYgKHYuaXJxXzIwYy5EYXRhX3JlY2VpdmVyX2Vycm9yKQorCQlkZWJfY2hrKCJkYXRhIHJlY2VpdmVyIGVycm9yXG4iKTsKKwlpZiAodi5pcnFfMjBjLkNvbnRpbnVpdHlfZXJyb3JfZmxhZykKKwkJZGViX2NoaygiQ29udHVudWl0eSBlcnJvciBmbGFnIGlzIHNldFxuIik7CisJaWYgKHYuaXJxXzIwYy5MTENfU05BUF9GTEFHX3NldCkKKwkJZGViX2NoaygiTExDX1NOQVBfRkxBR19zZXQgaXMgc2V0XG4iKTsKKwlpZiAodi5pcnFfMjBjLlRyYW5zcG9ydF9FcnJvcikKKwkJZGViX2NoaygiVHJhbnNwb3J0IGVycm9yXG4iKTsKKworCWlmICgoZmNfcGNpLT5jb3VudCAlIDEwMDApID09IDApCisJCWRlYl9jaGsoIiVkIHZhbGlkIGlycSB0b29rIHBsYWNlIHNvIGZhclxuIixmY19wY2ktPmNvdW50KTsKKwogCWlmICh2LmlycV8yMGMuRE1BMV9JUlFfU3RhdHVzID09IDEpIHsKIAkJaWYgKGZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkciA9PSAwKQogCQkJZmxleGNvcF9wYXNzX2RteF9wYWNrZXRzKGZjX3BjaS0+ZmNfZGV2LGZjX3BjaS0+ZG1hWzBdLmNwdV9hZGRyMCxmY19wY2ktPmRtYVswXS5zaXplIC8gMTg4KTsKQEAgLTExNSw4ICsxNjEsOSBAQAogCQkJZmMtPnJlYWRfaWJpX3JlZyhmYyxkbWExXzAwOCkuZG1hXzB4OC5kbWFfY3VyX2FkZHIgPDwgMjsKIAkJdTMyIGN1cl9wb3MgPSBjdXJfYWRkciAtIGZjX3BjaS0+ZG1hWzBdLmRtYV9hZGRyMDsKIAotCQlkZWJfaXJxKCJpcnE6ICUwOHggY3VyX2FkZHI6ICUwOHg6IGN1cl9wb3M6ICUwOHgsIGxhc3RfY3VyX3BvczogJTA4eCAiLAotCQkJCXYucmF3LGN1cl9hZGRyLGN1cl9wb3MsZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3Bvcyk7CisJCWRlYl9pcnEoIiV1IGlycTogJTA4eCBjdXJfYWRkcjogJTA4eDogY3VyX3BvczogJTA4eCwgbGFzdF9jdXJfcG9zOiAlMDh4ICIsCisJCQkJamlmZmllc190b191c2VjcyhqaWZmaWVzIC0gZmNfcGNpLT5sYXN0X2lycSksdi5yYXcsY3VyX2FkZHIsY3VyX3BvcyxmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zKTsKKwkJZmNfcGNpLT5sYXN0X2lycSA9IGppZmZpZXM7CiAKIAkJLyogYnVmZmVyIGVuZCB3YXMgcmVhY2hlZCwgcmVzdGFydGVkIGZyb20gdGhlIGJlZ2lubmluZwogCQkgKiBwYXNzIHRoZSBkYXRhIGZyb20gbGFzdF9jdXJfcG9zIHRvIHRoZSBidWZmZXIgZW5kIHRvIHRoZSBkZW11eApAQCAtMTI3LDcgKzE3NCw2IEBACiAJCQkJCWZjX3BjaS0+ZG1hWzBdLmNwdV9hZGRyMCArIGZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MsCiAJCQkJCShmY19wY2ktPmRtYVswXS5zaXplKjIpIC0gZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3Bvcyk7CiAJCQlmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zID0gMDsKLQkJCWZjX3BjaS0+Y291bnQgPSAwOwogCQl9CiAKIAkJaWYgKGN1cl9wb3MgPiBmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zKSB7CkBAIC0xMzksMTYgKzE4NSwxNCBAQAogCQlkZWJfaXJxKCJcbiIpOwogCiAJCWZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MgPSBjdXJfcG9zOwotCX0gZWxzZQorCQlmY19wY2ktPmNvdW50Kys7CisJfSBlbHNlIHsKKwkJZGViX2lycSgiaXNyIGZvciBmbGV4Y29wIGNhbGxlZCwgYXBwYXJlbnRseSB3aXRob3V0IHJlYXNvbiAoJTA4eClcbiIsdi5yYXcpOwogCQlyZXQgPSBJUlFfTk9ORTsKKwl9CiAKIAlzcGluX3VubG9ja19pcnEoJmZjX3BjaS0+aXJxX2xvY2spOwogCi0vKiBwYWNrZXQgY291bnQgd291bGQgYmUgaWRlYWwgZm9yIGh3IGZpbHRlcmluZywgYnV0IGl0IGlzbid0IHdvcmtpbmcuIEVpdGhlcgotICogdGhlIGRhdGEgYm9vayBpcyB3cm9uZywgb3IgSSdtIHVuYWJsZSB0byByZWFkIGl0IGNvcnJlY3RseSAqLwotCi0vKglpZiAodi5pcnFfMjBjLkRNQTFfU2l6ZV9JUlFfU3RhdHVzID09IDEpIHsgcGFja2V0IGNvdW50ZXIgKi8KLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE1NiwzMCArMjAwLDM1IEBACiB7CiAJc3RydWN0IGZsZXhjb3BfcGNpICpmY19wY2kgPSBmYy0+YnVzX3NwZWNpZmljOwogCWlmIChvbm9mZikgewotCQlmbGV4Y29wX2RtYV9jb25maWcoZmMsJmZjX3BjaS0+ZG1hWzBdLEZDX0RNQV8xLEZDX0RNQV9TVUJBRERSXzAgfCBGQ19ETUFfU1VCQUREUl8xKTsKLQkJZmxleGNvcF9kbWFfY29uZmlnKGZjLCZmY19wY2ktPmRtYVsxXSxGQ19ETUFfMixGQ19ETUFfU1VCQUREUl8wIHwgRkNfRE1BX1NVQkFERFJfMSk7Ci0JCWZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihmYyxGQ19ETUFfMSwxKTsKKwkJZmxleGNvcF9kbWFfY29uZmlnKGZjLCZmY19wY2ktPmRtYVswXSxGQ19ETUFfMSk7CisJCWZsZXhjb3BfZG1hX2NvbmZpZyhmYywmZmNfcGNpLT5kbWFbMV0sRkNfRE1BXzIpOwogCi0JCWlmIChmY19wY2ktPmZjX2Rldi0+cGlkX2ZpbHRlcmluZykgewotCQkJZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3BvcyA9IDA7Ci0JCQlmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShmYyxGQ19ETUFfMSwxKTsKLQkJfSBlbHNlIHsKLQkJCWZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkciA9IDA7Ci0JCQlmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKGZjLEZDX0RNQV8xLDEpOwotCQl9CisJCWZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihmYyxGQ19ETUFfMSwwKTsKIAotLyoJCWZsZXhjb3BfZG1hX2NvbmZpZ19wYWNrZXRfY291bnQoZmMsRkNfRE1BXzEsMHhjMCk7Ci0JCWZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycShmYyxGQ19ETUFfMSwxKTsgKi8KKwkJZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKGZjLEZDX0RNQV8xLEZDX0RNQV9TVUJBRERSXzAgfCBGQ19ETUFfU1VCQUREUl8xLDEpOworCQlkZWJfaXJxKCJETUEgeGZlciBlbmFibGVkXG4iKTsKIAotCQlkZWJfaXJxKCJpcnFzIGVuYWJsZWRcbiIpOworCQlmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zID0gMDsKKwkJZmxleGNvcF9kbWFfY29udHJvbF90aW1lcl9pcnEoZmMsRkNfRE1BXzEsMSk7CisJCWRlYl9pcnEoIklSUSBlbmFibGVkXG4iKTsKKworLy8JCWZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkciA9IDA7CisvLwkJZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShmYyxGQ19ETUFfMSwxKTsKKworCQlpZiAoaXJxX2Noa19pbnR2ID4gMCkKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZmNfcGNpLT5pcnFfY2hlY2tfd29yaywKKwkJCQkJbXNlY3NfdG9famlmZmllcyhpcnFfY2hrX2ludHYgPCAxMDAgPyAxMDAgOiBpcnFfY2hrX2ludHYpKTsKIAl9IGVsc2UgewotCQlpZiAoZmNfcGNpLT5mY19kZXYtPnBpZF9maWx0ZXJpbmcpCi0JCQlmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShmYyxGQ19ETUFfMSwwKTsKLQkJZWxzZQotCQkJZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShmYyxGQ19ETUFfMSwwKTsKKwkJaWYgKGlycV9jaGtfaW50diA+IDApCisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZmY19wY2ktPmlycV9jaGVja193b3JrKTsKIAotLy8JCWZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycShmYyxGQ19ETUFfMSwwKTsKLQkJZGViX2lycSgiaXJxcyBkaXNhYmxlZFxuIik7CisJCWZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKGZjLEZDX0RNQV8xLDApOworCQlkZWJfaXJxKCJJUlEgZGlzYWJsZWRcbiIpOworCisvLwkJZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShmYyxGQ19ETUFfMSwwKTsKKworCQlmbGV4Y29wX2RtYV94ZmVyX2NvbnRyb2woZmMsRkNfRE1BXzEsRkNfRE1BX1NVQkFERFJfMCB8IEZDX0RNQV9TVUJBRERSXzEsMCk7CisJCWRlYl9pcnEoIkRNQSB4ZmVyIGRpc2FibGVkXG4iKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE5OCw2ICsyNDcsNyBAQAogCWZsZXhjb3Bfc3JhbV9zZXRfZGVzdChmY19wY2ktPmZjX2RldixGQ19TUkFNX0RFU1RfQ0FPICAgfCBGQ19TUkFNX0RFU1RfQ0FJLCBGQ19TUkFNX0RFU1RfVEFSR0VUX0RNQTIpOwogCiAJZmNfcGNpLT5pbml0X3N0YXRlIHw9IEZDX1BDSV9ETUFfSU5JVDsKKwogCWdvdG8gc3VjY2VzczsKIGRtYTFfZnJlZToKIAlmbGV4Y29wX2RtYV9mcmVlKCZmY19wY2ktPmRtYVswXSk7CkBAIC0yNDQsNyArMjk0LDcgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShmY19wY2ktPnBkZXYsIGZjX3BjaSk7CiAKLQlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKGZjX3BjaS0+cGRldi0+aXJxLCBmbGV4Y29wX3BjaV9pcnEsCisJaWYgKChyZXQgPSByZXF1ZXN0X2lycShmY19wY2ktPnBkZXYtPmlycSwgZmxleGNvcF9wY2lfaXNyLAogCQkJCQlTQV9TSElSUSwgRFJJVkVSX05BTUUsIGZjX3BjaSkpICE9IDApCiAJCWdvdG8gZXJyX3BjaV9pb3VubWFwOwogCkBAIC0zMjQsNiArMzc0LDggQEAKIAlpZiAoKHJldCA9IGZsZXhjb3BfcGNpX2RtYV9pbml0KGZjX3BjaSkpICE9IDApCiAJCWdvdG8gZXJyX2ZjX2V4aXQ7CiAKKwlJTklUX1dPUksoJmZjX3BjaS0+aXJxX2NoZWNrX3dvcmssIGZsZXhjb3BfcGNpX2lycV9jaGVja193b3JrLCBmY19wY2kpOworCiAJZ290byBzdWNjZXNzOwogZXJyX2ZjX2V4aXQ6CiAJZmxleGNvcF9kZXZpY2VfZXhpdChmYyk7CkBAIC0zNTAsMTcgKzQwMiwxNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZmxleGNvcF9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfREVWSUNFKDB4MTNkMCwgMHgyMTAzKSB9LAotLyoJeyBQQ0lfREVWSUNFKDB4MTNkMCwgMHgyMjAwKSB9LCBQQ0kgRmxleENvcElJSSA/ICovCisvKgl7IFBDSV9ERVZJQ0UoMHgxM2QwLCAweDIyMDApIH0sID8gKi8KIAl7IH0sCiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZmxleGNvcF9wY2lfdGJsKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGZsZXhjb3BfcGNpX2RyaXZlciA9IHsKLQkubmFtZSA9ICJUZWNobmlzYXQvQjJDMiBGbGV4Q29wIElJL0lJYi9JSUkgUENJIiwKKwkubmFtZSAgICAgPSAiYjJjMl9mbGV4Y29wX3BjaSIsCiAJLmlkX3RhYmxlID0gZmxleGNvcF9wY2lfdGJsLAotCS5wcm9iZSA9IGZsZXhjb3BfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBmbGV4Y29wX3BjaV9yZW1vdmUsCisJLnByb2JlICAgID0gZmxleGNvcF9wY2lfcHJvYmUsCisJLnJlbW92ZSAgID0gZmxleGNvcF9wY2lfcmVtb3ZlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZmxleGNvcF9wY2lfbW9kdWxlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1yZWcuaAppbmRleCA3NWI1MGYyLi40YWUxZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXJlZy5oCkBAIC0zNiw1NTUgKzM2LDIxIEBACiBleHRlcm4gY29uc3QgY2hhciAqZmxleGNvcF9kZXZpY2VfbmFtZXNbXTsKIAogLyogRmxleENvcCBJQkkgUmVnaXN0ZXJzICovCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJI2luY2x1ZGUgImZsZXhjb3BfaWJpX3ZhbHVlX2xlLmgiCisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwkjaW5jbHVkZSAiZmxleGNvcF9pYmlfdmFsdWVfYmUuaCIKKyNlbHNlCisJI2Vycm9yIG5vIGVuZGlhbiBkZWZpbmVkCisjZW5kaWYKIAotLyogZmxleGNvcF9pYmlfcmVnIC0gYSBodWdlIHVuaW9uIHJlcHJlc2VudGluZyB0aGUgcmVnaXN0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHVuaW9uIHsKLQl1MzIgcmF3OwotCi0vKiBETUEgMHgwMDAgdG8gMHgwMWMKLSAqIERNQTEgMHgwMDAgdG8gMHgwMGMKLSAqIERNQTIgMHgwMTAgdG8gMHgwMWMKLSAqLwotCXN0cnVjdCB7Ci0JCXUzMiBkbWFfMHN0YXJ0ICAgICAgICA6IDE7ICAgLyogc2V0OiBkYXRhIHdpbGwgYmUgZGVsaXZlcmVkIHRvIGRtYTFfYWRkcmVzczAgKi8KLSAgICAgICAgdTMyIGRtYV8wTm9fdXBkYXRlICAgIDogMTsgICAvKiBzZXQ6IGRtYTFfY3VyX2FkZHJlc3Mgd2lsbCBiZSB1cGRhdGVkLCB1bnNldDogbm8gdXBkYXRlICovCi0gICAgICAgIHUzMiBkbWFfYWRkcmVzczAgICAgICA6MzA7ICAgLyogcGh5c2ljYWwvdmlydHVhbCBob3N0IG1lbW9yeSBhZGRyZXNzMCBETUEgKi8KLQl9IGRtYV8weDA7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgRE1BX21heHBhY2tldHMgICAgOiA4OyAgIC8qIChyZW1hcHBlZCkgUENJIERNQTEgUGFja2V0IENvdW50IEludGVycnVwdC4gVGhpcyB2YXJpYWJsZQotCQkJCQkJCQkJCWlzIGFibGUgdG8gYmUgcmVhZCBhbmQgd3JpdHRlbiB3aGlsZSBiaXQoMSkgb2YgcmVnaXN0ZXIKLQkJCQkJCQkJCQkweDAwYyAocmVtYXBfZW5hYmxlKSBpcyBzZXQuIFRoaXMgdmFyaWFibGUgcmVwcmVzZW50cwotCQkJCQkJCQkJCXRoZSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIFBDSQotCQkJCQkJCQkJCWhvc3QgdXNpbmcgUENJIERNQTEgYmVmb3JlIGFuIGludGVycnVwdCB0byB0aGUgUENJIGlzCi0JCQkJCQkJCQkJYXNzZXJ0ZWQuIFRoaXMgZnVuY3Rpb25hbGl0eSBtYXkgYmUgZW5hYmxlZCB1c2luZyBiaXQoMjApCi0JCQkJCQkJCQkJb2YgcmVnaXN0ZXIgMHgyMDguIE49MCBkaXNhYmxlcyB0aGUgSVJRLiAqLwotCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgOjI0OyAgIC8qIHNpemUgb2YgbWVtb3J5IGJ1ZmZlciBpbiBEV09SRHMgKGJ5dGVzaXplIC8gNCkgZm9yIERNQSAqLwotCX0gZG1hXzB4NF9yZW1hcDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBkbWExdGltZXIgICAgICAgICA6IDc7ICAgLyogcmVhZGluZyBQQ0kgRE1BMSB0aW1lciAuLi4gd2hlbiByZW1hcF9lbmFibGUgaXMgMCAqLwotCQl1MzIgdW51c2VkICAgICAgICAgICAgOiAxOwotCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgOjI0OwotCX0gZG1hXzB4NF9yZWFkOwotCi0Jc3RydWN0IHsKLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogMTsKLQkJdTMyIGRtYXRpbWVyICAgICAgICAgIDogNzsgICAvKiB3cml0aW5nIFBDSSBETUExIHRpbWVyIC4uLiB3aGVuIHJlbWFwX2VuYWJsZSBpcyAwICovCi0JCXUzMiBkbWFfYWRkcl9zaXplICAgICA6MjQ7Ci0JfSBkbWFfMHg0X3dyaXRlOwotCi0Jc3RydWN0IHsKLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogMjsKLQkJdTMyIGRtYV9jdXJfYWRkciAgICAgIDozMDsgICAvKiBjdXJyZW50IHBoeXNpY2FsIGhvc3QgbWVtb3J5IGFkZHJlc3MgcG9pbnRlciBmb3IgRE1BICovCi0JfSBkbWFfMHg4OwotCi0Jc3RydWN0IHsKLQkJdTMyIGRtYV8xc3RhcnQgICAgICAgIDogMTsgICAvKiBzZXQ6IGRhdGEgd2lsbCBiZSBkZWxpdmVyZWQgdG8gZG1hX2FkZHJlc3MxLCB3aGVuIGRtYV9hZGRyZXNzMCBpcyBmdWxsICovCi0JCXUzMiByZW1hcF9lbmFibGUgICAgICA6IDE7ICAgLyogcmVtYXAgZW5hYmxlIGZvciAweDB4NCg3OjApICovCi0JCXUzMiBkbWFfYWRkcmVzczEgICAgICA6MzA7ICAgLyogUGh5c2ljYWwvdmlydHVhbCBhZGRyZXNzIDEgb24gRE1BICovCi0JfSBkbWFfMHhjOwotCi0vKiBUd28td2lyZSBTZXJpYWwgTWFzdGVyIGFuZCBDbG9jayAweDEwMC0weDExMCAqLwotCXN0cnVjdCB7Ci0vLwkJdTMyIHNsYXZlX3RyYW5zbWl0dGVyIDogMTsgICAvKiA/Pz8qLwotCQl1MzIgY2hpcGFkZHIgICAgICAgICAgOiA3OyAgIC8qIHR3by1saW5lIHNlcmlhbCBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgc2xhdmUgKi8KLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogMTsKLQkJdTMyIGJhc2VhZGRyICAgICAgICAgIDogODsgICAvKiBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVhZC93cml0ZSBvcGVyYXRpb24gKi8KLQkJdTMyIGRhdGExX3JlZyAgICAgICAgIDogODsgICAvKiBmaXJzdCBieXRlIGluIHR3by1saW5lIHNlcmlhbCByZWFkL3dyaXRlIG9wZXJhdGlvbiAqLwotCQl1MzIgd29ya2luZ19zdGFydCAgICAgOiAxOyAgLyogd2hlbiBkb2luZyBhIHdyaXRlIG9wZXJhdGlvbiB0aGlzIGluZGljYXRvciBpcyAwIHdoZW4gcmVhZHkKLQkJCQkJCQkJCSAgKiBzZXQgdG8gMSB3aGVuIGRvaW5nIGEgd3JpdGUgb3BlcmF0aW9uICovCi0JCXUzMiB0d29XU19ydyAgICAgICAgICA6IDE7ICAgLyogcmVhZC93cml0ZSBpbmRpY2F0b3IgKDEgPSByZWFkLCAwIHdyaXRlKSAqLwotCQl1MzIgdG90YWxfYnl0ZXMgICAgICAgOiAyOyAgIC8qIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGVhY2ggdHdvLWxpbmUgc2VyaWFsIHRyYW5zYWN0aW9uICgwID0gMSBieXRlLCAxMSA9IDRieXRlKSovCi0JCXUzMiB0d29XU19wb3J0X3JlZyAgICA6IDI7ICAgLyogcG9ydCBzZWxlY3Rpb246IDAxIC0gRnJvbnQgRW5kL0RlbW9kLCAxMCAtIEVFUFJPTSwgMTEgLSBUdW5lciAqLwotCQl1MzIgbm9fYmFzZV9hZGRyX2Fja19lcnJvciA6IDE7ICAgLyogd3JpdGluZzogd3JpdGUtcmVxOiBmcmFtZSBpcyBwcm9kdWNlZCB3L28gYmFzZWFkZHIsIHJlYWQtcmVxOiByZWFkLWN5Y2xlcyB3L28KLQkJCQkJCQkJCSAgKiBwcmVjZWRpbmcgYWRkcmVzcyBhc3NpZ25tZW50IHdyaXRlIGZyYW1lCi0JCQkJCQkJCQkgICogQUNLX0VSUk9SID0gMSB3aGVuIG5vIEFDSyBmcm9tIHNsYXZlIGluIHRoZSBsYXN0IHRyYW5zYWN0aW9uICovCi0JCXUzMiBzdF9kb25lICAgICAgICAgICA6IDE7ICAgLyogaW5kaWNhdG9yIGZvciB0cmFuc2FjdGlvbiBpcyBkb25lICovCi0JfSB0d19zbV9jXzEwMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBkYXRhMl9yZWcgICAgICAgICA6IDg7ICAgLyogMm5kIGRhdGEgYnl0ZSAqLwotCQl1MzIgZGF0YTNfcmVnICAgICAgICAgOiA4OyAgIC8qIDNyZCBkYXRhIGJ5dGUgKi8KLQkJdTMyIGRhdGE0X3JlZyAgICAgICAgIDogODsgICAvKiA0dGggZGF0YSBieXRlICovCi0JCXUzMiBleGxpY2l0X3N0b3BzICAgICA6IDE7ICAgLyogd2hlbiBzZXQsIHRyYW5zYWN0aW9ucyBhcmUgcHJvZHVjZWQgdy9vIHRyYWlsaW5nIFNUT1AgZmxhZywgdGhlbiBzZW5kIGlzb2xhdGVkIFNUT1AgZmxhZ3MgKi8KLQkJdTMyIGZvcmNlX3N0b3AgICAgICAgIDogMTsgICAvKiBpc29sYXRlZCBzdG9wIGZsYWcgKi8KLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogNjsKLQl9IHR3X3NtX2NfMTA0OwotCi0vKiBDbG9jay4gVGhlIHJlZ2lzdGVyIGFsbG93cyB0aGUgRkNJSUkgdG8gY29udmVydCBhbiBpbmNvbWluZyBNYXN0ZXIgY2xvY2sKLSAqIChNQ0xLKSBzaWduYWwgaW50byBhIGxvd2VyIGZyZXF1ZW5jeSBjbG9jayB0aHJvdWdoIHRoZSB1c2Ugb2YgYSBMb3dDb3VudGVyCi0gKiAoVExPKSBhbmQgYSBIaWdoLSBDb3VudGVyIChUSEkpLiBUaGUgdGltZSBjb3VudHMgZm9yIFRISSBhbmQgVExPIGFyZQotICogbWVhc3VyZWQgaW4gTUNMSzsgZWFjaCBjb3VudCByZXByZXNlbnRzIDQgTUNMSyBpbnB1dCBjbG9jayBjeWNsZXMuCi0gKgotICogVGhlIGRlZmF1bHQgb3V0cHV0IGZvciBwb3J0ICMxIGlzIHNldCBmb3IgRnJvbnQgRW5kIERlbW9kIGNvbW11bmljYXRpb24uICgweDEwOCkKLSAqIFRoZSBkZWZhdWx0IG91dHB1dCBmb3IgcG9ydCAjMiBpcyBzZXQgZm9yIEVFUFJPTSBjb21tdW5pY2F0aW9uLiAoMHgxMGMpCi0gKiBUaGUgZGVmYXVsdCBvdXRwdXQgZm9yIHBvcnQgIzMgaXMgc2V0IGZvciBUdW5lciBjb21tdW5pY2F0aW9uLiAoMHgxMTApCi0gKi8KLQlzdHJ1Y3QgewotCQl1MzIgdGhpMSAgICAgICAgICAgICAgOiA2OyAgIC8qIFRoaSBmb3IgcG9ydCAjMSAoZGVmOiAxMDAxMTBiOyAzOCkgKi8KLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogMjsKLQkJdTMyIHRsbzEgICAgICAgICAgICAgIDogNTsgICAvKiBUbG8gZm9yIHBvcnQgIzEgKGRlZjogMTExMDBiOyAyOCkgKi8KLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDoxOTsKLQl9IHR3X3NtX2NfMTA4OwotCi0Jc3RydWN0IHsKLQkJdTMyIHRoaTEgICAgICAgICAgICAgIDogNjsgICAvKiBUaGkgZm9yIHBvcnQgIzIgKGRlZjogMTExMDAxYjsgNTcpICovCi0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDI7Ci0JCXUzMiB0bG8xICAgICAgICAgICAgICA6IDU7ICAgLyogVGxvIGZvciBwb3J0ICMyIChkZWY6IDExMTAwYjsgMjgpICovCi0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6MTk7Ci0JfSB0d19zbV9jXzEwYzsKLQotCXN0cnVjdCB7Ci0JCXUzMiB0aGkxICAgICAgICAgICAgICA6IDY7ICAgLyogVGhpIGZvciBwb3J0ICMzIChkZWY6IDExMTAwMWI7IDU3KSAqLwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiAyOwotCQl1MzIgdGxvMSAgICAgICAgICAgICAgOiA1OyAgIC8qIFRsbyBmb3IgcG9ydCAjMyAoZGVmOiAxMTEwMGI7IDI4KSAqLwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOjE5OwotCX0gdHdfc21fY18xMTA7Ci0KLS8qIExOQiBTd2l0Y2ggRnJlcXVlbmN5IDB4MjAwCi0gKiBDbG9jayB0aGF0IGNyZWF0ZXMgdGhlIExOQiBzd2l0Y2ggdG9uZS4gVGhlIGRlZmF1bHQgaXMgc2V0IHRvIGhhdmUgYSBmaXhlZAotICogbG93IG91dHB1dCAobm90IG9zY2lsbGF0aW5nKSB0byB0aGUgTE5CX0NUTCBsaW5lLgotICovCi0Jc3RydWN0IHsKLQkJdTMyIExOQl9DVExIaWdoQ291bnRfc2lnIDoxNTsgLyogSXQgaXMgdGhlIG51bWJlciBvZiBwcmUtc2NhbGVkIGNsb2NrIGN5Y2xlcyB0aGF0IHdpbGwgYmUgbG93LiAqLwotCQl1MzIgTE5CX0NUTExvd0NvdW50X3NpZyAgOjE1OyAvKiBGb3IgZXhhbXBsZSwgdG8gb2J0YWluIGEgMjJLSHogb3V0cHV0IGdpdmVuIGEgNDUgTWh6IE1hc3RlcgotCQkJCQkJCQkJCUNsb2NrIHNpZ25hbCAoTUNMSyksIHNldCBQcmVTY2FsYXI9MDEgYW5kIExvd0NvdW50ZXIgdmFsdWUgdG8gMHgxZmYuICovCi0JCXUzMiBMTkJfQ1RMUHJlc2NhbGVyX3NpZyA6IDI7IC8qIHByZS1zY2FsZXIgZGl2aWRlcyBNQ0xLOiAwMCAobm8gZGl2aXNpb24pLCAwMSBieSAyLCAxMCBieSA0LCAxMSBieSAxMiAqLwotCX0gbG5iX3N3aXRjaF9mcmVxXzIwMDsKLQotLyogQUNQSSwgUGVyaXBoZXJhbCBSZXNldCwgTE5CIFBvbGFyaXR5Ci0gKiBBQ1BJIHBvd2VyIGNvbnNlcnZhdGlvbiBtb2RlLCBMTkIgcG9sYXJpdHkgc2VsZWN0aW9uIChsb3cgb3IgaGlnaCB2b2x0YWdlKSwKLSAqIGFuZCBwZXJpcGhlcmFsIHJlc2V0LgotICovCi0Jc3RydWN0IHsKLQkJdTMyIEFDUEkxX3NpZyAgICAgICAgIDogMTsgICAvKiB0dXJuIG9mIHRoZSBwb3dlciBvZiB0dW5lciBhbmQgTE5CLCBub3QgaW1wbGVtZW50ZWQgaW4gRkNJSUkgKi8KLQkJdTMyIEFDUEkzX3NpZyAgICAgICAgIDogMTsgICAvKiB0dXJuIG9mIHBvd2VyIG9mIHRoZSBjb21wbGV0ZSBzYXRlbGl0ZSByZWNlaXZlciBib2FyZCAoZXhjZXB0IEZDSUlJKSAqLwotCQl1MzIgTE5CX0xfSF9zaWcgICAgICAgOiAxOyAgIC8qIGxvdyBvciBoaWdoIHZvbHRhZ2UgZm9yIExOQi4gKDAgPSBsb3csIDEgPSBoaWdoKSAqLwotCQl1MzIgUGVyX3Jlc2V0X3NpZyAgICAgOiAxOyAgIC8qIG1pc2MuIGluaXQgcmVzZXQgKGRlZmF1bHQ6IDEpLCB0byByZXNldCBzZXQgdG8gbG93IGFuZCBiYWNrIHRvIGhpZ2ggKi8KLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDoyMDsKLQkJdTMyIFJldl9OX3NpZ19yZXZpc2lvbl9oaSA6IDQ7LyogMHhjIGluIGNhc2Ugb2YgRkNJSUkgKi8KLQkJdTMyIFJldl9OX3NpZ19yZXNlcnZlZDEgOiAyOwotCQl1MzIgUmV2X05fc2lnX2NhcHMgICAgOiAxOyAgIC8qIGlmIDEsIEZDSUlJIGhhcyAzMiBQSUQtIGFuZCBNQUMtZmlsdGVycyBhbmQgaXMgY2FwYWJsZSBvZiBJUCBtdWx0aWNhc3QgKi8KLQkJdTMyIFJldl9OX3NpZ19yZXNlcnZlZDIgOiAxOwotCX0gbWlzY18yMDQ7Ci0KLS8qIENvbnRyb2wgYW5kIFN0YXR1cyAweDIwOCB0byAweDIxYyAqLwotLyogR3Jvc3MgZW5hYmxlIGFuZCBkaXNhYmxlIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgewotCQl1MzIgU3RyZWFtMV9maWx0ZXJfc2lnIDogMTsgIC8qIFN0cmVhbTEgUElEIGZpbHRlcmluZyAqLwotCQl1MzIgU3RyZWFtMl9maWx0ZXJfc2lnIDogMTsgIC8qIFN0cmVhbTIgUElEIGZpbHRlcmluZyAqLwotCQl1MzIgUENSX2ZpbHRlcl9zaWcgICAgOiAxOyAgIC8qIFBDUiBQSUQgZmlsdGVyICovCi0JCXUzMiBQTVRfZmlsdGVyX3NpZyAgICA6IDE7ICAgLyogUE1UIFBJRCBmaWx0ZXIgKi8KLQotCQl1MzIgRU1NX2ZpbHRlcl9zaWcgICAgOiAxOyAgIC8qIEVNTSBQSUQgZmlsdGVyICovCi0JCXUzMiBFQ01fZmlsdGVyX3NpZyAgICA6IDE7ICAgLyogRUNNIFBJRCBmaWx0ZXIgKi8KLQkJdTMyIE51bGxfZmlsdGVyX3NpZyAgIDogMTsgICAvKiBGaWx0ZXJzIG51bGwgcGFja2V0cywgUElEPTB4MWZmZi4gKi8KLQkJdTMyIE1hc2tfZmlsdGVyX3NpZyAgIDogMTsgICAvKiBtYXNrIFBJRCBmaWx0ZXIgKi8KLQotCQl1MzIgV0FOX0VuYWJsZV9zaWcgICAgOiAxOyAgIC8qIFdBTiBvdXRwdXQgbGluZSB0aHJvdWdoIFY4IG1lbW9yeSBzcGFjZSBpcyBhY3RpdmF0ZWQuICovCi0JCXUzMiBXQU5fQ0FfRW5hYmxlX3NpZyA6IDE7ICAgLyogbm90IGluIEZDSUlJICovCi0JCXUzMiBDQV9FbmFibGVfc2lnICAgICA6IDE7ICAgLyogbm90IGluIEZDSUlJICovCi0JCXUzMiBTTUNfRW5hYmxlX3NpZyAgICA6IDE7ICAgLyogQ0kgc3RyZWFtIGRhdGEgKENBSSkgZ29lcyBkaXJlY3RseSB0byB0aGUgc21hcnQgY2FyZCBpbnRmIChvcHBvc2VkIElCSSAweDYwMCBvciBTQy1jbWQgYnVmKS4gKi8KLQotCQl1MzIgUGVyX0NBX0VuYWJsZV9zaWcgOiAxOyAgIC8qIG5vdCBpbiBGQ0lJSSAqLwotCQl1MzIgTXVsdGkyX0VuYWJsZV9zaWcgOiAxOyAgIC8qID8gKi8KLQkJdTMyIE1BQ19maWx0ZXJfTW9kZV9zaWcgOiAxOyAvKiAoTUFDX2ZpbHRlcl9lbmFibGUpIEdsb2JhbGx5IGVuYWJsZXMgTUFDIGZpbHRlcnMgZm9yIE5ldCBQSUQgZmlsdGVyZXMuICovCi0JCXUzMiBSY3ZfRGF0YV9zaWcgICAgICA6IDE7ICAgLyogUElEIGZpbHRlcmluZyBtb2R1bGUgZW5hYmxlLiBXaGVuIHRoaXMgYml0IGlzIGEgb25lLCB0aGUgUElEIGZpbHRlciB3aWxsCi0JCQkJCQkJCQkJZXhhbWluZSBhbmQgcHJvY2VzcyBwYWNrZXRzIGFjY29yZGluZyB0byBhbGwgb3RoZXIgKGluZGl2aWR1YWwpIFBJRAotCQkJCQkJCQkJCWZpbHRlcmluZyBjb250cm9scy4gSWYgaXQgYSB6ZXJvLCBubyBwYWNrZXQgcHJvY2Vzc2luZyBvZiBhbnkga2luZCB3aWxsCi0JCQkJCQkJCQkJdGFrZSBwbGFjZS4gQWxsIGRhdGEgZnJvbSB0aGUgdHVuZXIgd2lsbCBiZSB0aHJvd24gYXdheS4gKi8KLQotCQl1MzIgRE1BMV9JUlFfRW5hYmxlX3NpZyA6IDE7IC8qIFdoZW4gc2V0LCBhIERXT1JEIGNvdW50ZXIgaXMgZW5hYmxlZCBvbiBQQ0kgRE1BMSB0aGF0IGFzc2VydHMgdGhlIFBDSQotCQkJCQkJCQkJICAqIGludGVycnVwdCBhZnRlciB0aGUgc3BlY2lmaWVkIGNvdW50IGZvciBmaWxsaW5nIHRoZSBidWZmZXIuICovCi0JCXUzMiBETUExX1RpbWVyX0VuYWJsZV9zaWcgOiAxOyAvKiBXaGVuIHNldCwgYSB0aW1lciBpcyBlbmFibGVkIG9uIFBDSSBETUExIHRoYXQgYXNzZXJ0cyB0aGUgUENJIGludGVycnVwdAotCQkJCQkJCQkJCQlhZnRlciBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZS4gKi8KLQkJdTMyIERNQTJfSVJRX0VuYWJsZV9zaWcgOiAxOyAgIC8qIHNhbWUgYXMgRE1BMV9JUlFfRW5hYmxlX3NpZyBidXQgZm9yIERNQTIgKi8KLQkJdTMyIERNQTJfVGltZXJfRW5hYmxlX3NpZyA6IDE7ICAgLyogc2FtZSBhcyBETUExX1RpbWVyX0VuYWJsZV9zaWcgYnV0IGZvciBETUEyICovCi0KLQkJdTMyIERNQTFfU2l6ZV9JUlFfRW5hYmxlX3NpZyA6IDE7IC8qIFdoZW4gc2V0LCBhIHBhY2tldCBjb3VudCBkZXRlY3RvciBpcyBlbmFibGVkIG9uIFBDSSBETUExIHRoYXQgYXNzZXJ0cyB0aGUgUENJIGludGVycnVwdC4gKi8KLQkJdTMyIERNQTJfU2l6ZV9JUlFfRW5hYmxlX3NpZyA6IDE7IC8qIFdoZW4gc2V0LCBhIHBhY2tldAljb3VudCBkZXRlY3RvciBpcyBlbmFibGVkIG9uIFBDSSBETUEyIHRoYXQgYXNzZXJ0cyB0aGUgUENJIGludGVycnVwdC4gKi8KLQkJdTMyIE1haWxib3hfZnJvbV9WOF9FbmFibGVfc2lnOiAxOyAvKiBXaGVuIHNldCwgd3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHByb2R1Y2UgYW4gaW50ZXJydXB0IHRvIHRoZQotCQkJCQkJCQkJCQlQQ0kgaG9zdCB0byBpbmRpY2F0ZSB0aGF0IG1haWxib3ggZGF0YSBpcyBhdmFpbGFibGUuICovCi0KLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogOTsKLQl9IGN0cmxfMjA4OwotCi0vKiBHZW5lcmFsIHN0YXR1cy4gV2hlbiBhIFBDSSBpbnRlcnJ1cHQgb2NjdXJzLCB0aGlzIHJlZ2lzdGVyIGlzIHJlYWQgdG8KLSAqIGRpc2NvdmVyIHRoZSByZWFzb24gZm9yIHRoZSBpbnRlcnJ1cHQuCi0gKi8KLQlzdHJ1Y3QgewotCQl1MzIgRE1BMV9JUlFfU3RhdHVzICAgOiAxOyAgIC8qIFdoZW4gc2V0KDEpIHRoZSBETUExIGNvdW50ZXIgaGFkIGdlbmVyYXRlZCBhbiBJUlEuIFJlYWQgT25seS4gKi8KLQkJdTMyIERNQTFfVGltZXJfU3RhdHVzIDogMTsgICAvKiBXaGVuIHNldCgxKSB0aGUgRE1BMSB0aW1lciBoYWQgZ2VuZXJhdGVkIGFuIElSUS4gUmVhZCBPbmx5LiAqLwotCQl1MzIgRE1BMl9JUlFfU3RhdHVzICAgOiAxOyAgIC8qIFdoZW4gc2V0KDEpIHRoZSBETUEyIGNvdW50ZXIgaGFkIGdlbmVyYXRlZCBhbiBJUlEuIFJlYWQgT25seS4gKi8KLQkJdTMyIERNQTJfVGltZXJfU3RhdHVzIDogMTsgICAvKiBXaGVuIHNldCgxKSB0aGUgRE1BMiB0aW1lciBoYWQgZ2VuZXJhdGVkIGFuIElSUS4gUmVhZCBPbmx5LiAqLwotCQl1MzIgRE1BMV9TaXplX0lSUV9TdGF0dXMgOiAxOyAvKiAoUmVhZCBvbmx5KS4gVGhpcyByZWdpc3RlciBpcyByZWFkIGFmdGVyIGFuIGludGVycnVwdCB0byAqLwotCQl1MzIgRE1BMl9TaXplX0lSUV9TdGF0dXMgOiAxOyAvKiBmaW5kIG91dCB3aHkgd2UgaGFkIGFuIElSUS4gUmVhZGluZyB0aGlzIHJlZ2lzdGVyIHdpbGwgY2xlYXIgdGhpcyBiaXQuIFBhY2tldCBjb3VudCovCi0JCXUzMiBNYWlsYm94X2Zyb21fVjhfU3RhdHVzX3NpZzogMTsgLyogU2FtZSBhcyBhYm92ZS4gUmVhZGluZyB0aGlzIHJlZ2lzdGVyIHdpbGwgY2xlYXIgdGhpcyBiaXQuICovCi0JCXUzMiBEYXRhX3JlY2VpdmVyX2Vycm9yIDogMTsgLyogMSBpbmRpY2F0ZSBhbiBlcnJvciBpbiB0aGUgcmVjZWl2ZXIgRnJvbnQgRW5kIChUdW5lciBtb2R1bGUpICovCi0JCXUzMiBDb250aW51aXR5X2Vycm9yX2ZsYWcgOiAxOyAgIC8qIDEgaW5kaWNhdGVzIGEgY29udGludWl0eSBlcnJvciBpbiB0aGUgVFMgc3RyZWFtLiAqLwotCQl1MzIgTExDX1NOQVBfRkxBR19zZXQgOiAxOyAgIC8qIDEgaW5kaWNhdGVzIHRoYXQgdGhlIExDQ19TTkFQX0ZMQUcgd2FzIHNldC4gKi8KLQkJdTMyIFRyYW5zcG9ydF9FcnJvciAgIDogMTsgICAvKiAgV2hlbiBzZXQgaW5kaWNhdGVzIHRoYXQgYW4gdW5leHBlY3RlZCBwYWNrZXQgd2FzIHJlY2VpdmVkLiAqLwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjIxOwotCX0gaXJxXzIwYzsKLQotCi0vKiBTb2Z0d2FyZSByZXNldCByZWdpc3RlciAqLwotCXN0cnVjdCB7Ci0JCXUzMiByZXNldF9ibG9ja3MgICAgICA6IDg7ICAgLyogRW5hYmxlZCB3aGVuIEJsb2NrX3Jlc2V0X2VuYWJsZSA9IDB4QjIgYW5kIDB4MjA4IGJpdHMgMTU6OCA9IDB4MDAuCi0JCQkJCQkJCQkJRWFjaCBiaXQgbG9jYXRpb24gcmVwcmVzZW50cyBhIDB4MTAwIGJsb2NrIG9mIHJlZ2lzdGVycy4gV3JpdGluZwotCQkJCQkJCQkJCWEgb25lIGluIGEgYml0IGxvY2F0aW9uIHJlc2V0cyB0aGF0IGJsb2NrIG9mIHJlZ2lzdGVycyBhbmQgdGhlIGxvZ2ljCi0JCQkJCQkJCQkJdGhhdCBpdCBjb250cm9scy4gKi8KLQkJdTMyIEJsb2NrX3Jlc2V0X2VuYWJsZSA6IDg7ICAvKiBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byAweEIyIHdoZW4gdGhlIHJlZ2lzdGVyIGlzIHdyaXR0ZW4uICovCi0JCXUzMiBTcGVjaWFsX2NvbnRyb2xzICA6MTY7ICAgLyogQXNzZXJ0cyBSZXNldF9WOCA9PiAweEMyNTg7IFR1cm5zIG9uIHBjaSBlbmNyeXB0aW9uID0+IDB4QzI1QTsKLQkJCQkJCQkJCQlUdXJucyBvZmYgcGNpIGVuY3J5cHRpb24gPT4gMHhDMjU5IE5vdGU6IHBjaV9lbmNyeXB0aW9uIGRlZmF1bHQKLQkJCQkJCQkJCQlhdCBwb3dlci11cCBpcyBPTi4gKi8KLQl9IHN3X3Jlc2V0XzIxMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiB2dWFydF9vZV9zaWcgICAgICA6IDE7ICAgLyogV2hlbiBjbGVhciwgdGhlIFY4IHByb2Nlc3NvciBoYXMgc29sZSBjb250cm9sIG9mIHRoZSBzZXJpYWwgVUFSVAotCQkJCQkJCQkJCShSUy0yMzIgU21hcnQgQ2FyZCBpbnRlcmZhY2UpLiBXaGVuIHNldCwgdGhlIElCSSBpbnRlcmZhY2UKLQkJCQkJCQkJCQlkZWZpbmVkIGJ5IHJlZ2lzdGVyIDB4NjAwIGNvbnRyb2xzIHRoZSBzZXJpYWwgVUFSVC4gKi8KLQkJdTMyIHYyV1Nfb2Vfc2lnICAgICAgIDogMTsgICAvKiBXaGVuIGNsZWFyLCB0aGUgVjggcHJvY2Vzc29yIGhhcyBkaXJlY3QgY29udHJvbCBvZiB0aGUgVHdvLWxpbmUKLQkJCQkJCQkJCQlTZXJpYWwgTWFzdGVyIEVFUFJPTSB0YXJnZXQuIFdoZW4gc2V0LCB0aGUgVHdvLWxpbmUgU2VyaWFsIE1hc3RlcgotCQkJCQkJCQkJCUVFUFJPTSB0YXJnZXQgaW50ZXJmYWNlIGlzIGNvbnRyb2xsZWQgYnkgSUJJIHJlZ2lzdGVyIDB4MTAwLiAqLwotCQl1MzIgaGFsdF9WOF9zaWcgICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBjb250aWd1b3VzIHdhaXQgc3RhdGVzIGFyZSBhcHBsaWVkIHRvIHRoZSBWOC1zcGFjZQotCQkJCQkJCQkJCWJ1cyBtYXN0ZXJzLiBPbmNlIHRoaXMgc2lnbmFsIGlzIGNsZWFyZWQsIG5vcm1hbCBWOC1zcGFjZQotCQkJCQkJCQkJCW9wZXJhdGlvbnMgcmVzdW1lLiAqLwotCQl1MzIgc2VjdGlvbl9wa2dfZW5hYmxlX3NpZzogMTsgLyogV2hlbiBzZXQsIHRoaXMgc2lnbmFsIGVuYWJsZXMgdGhlIGZyb250IGVuZCB0cmFuc2xhdGlvbiBjaXJjdWl0cnkKLQkJCQkJCQkJCQkgIHRvIHByb2Nlc3Mgc2VjdGlvbiBwYWNrZWQgdHJhbnNwb3J0IHN0cmVhbXMuICovCi0JCXUzMiBzMnBfc2VsX3NpZyAgICAgICA6IDE7ICAgLyogU2VyaWFsIHRvIHBhcmFsbGVsIGNvbnZlcnNpb24uIFdoZW4gc2V0LCBwb2xhcml6ZWQgdHJhbnNwb3J0IGRhdGEKLQkJCQkJCQkJCQl3aXRoaW4gdGhlIEZsZXhDb3AzIGZyb250IGVuZCBjaXJjdWl0cnkgaXMgY29udmVydGVkIGZyb20gYSBzZXJpYWwKLQkJCQkJCQkJCQlzdHJlYW0gaW50byBwYXJhbGxlbCBkYXRhIGJlZm9yZSBkb3duc3RyZWFtIHByb2Nlc3Npbmcgb3RoZXJ3aXNlCi0JCQkJCQkJCQkJaW50ZXJwcmV0cyB0aGUgZGF0YS4gKi8KLQkJdTMyIHVudXNlZDEgICAgICAgICAgIDogMzsKLQkJdTMyIHBvbGFyaXR5X1BTX0NMS19zaWc6IDE7ICAvKiBUaGlzIHNpZ25hbCBpcyB1c2VkIHRvIGludmVydCB0aGUgaW5wdXQgcG9sYXJpdHkgb2YgdGhlIHRyYW5wb3J0Ci0JCQkJCQkJCQkJc3RyZWFtIENMT0NLIHNpZ25hbCBiZWZvcmUgYW55IHByb2Nlc3Npbmcgb2NjdXJzIG9uIHRoZSB0cmFuc3BvcnQKLQkJCQkJCQkJCQlzdHJlYW0gd2l0aGluIEZsZXhDb3AzLiAqLwotCQl1MzIgcG9sYXJpdHlfUFNfVkFMSURfc2lnOiAxOyAvKiBUaGlzIHNpZ25hbCBpcyB1c2VkIHRvIGludmVydCB0aGUgaW5wdXQgcG9sYXJpdHkgb2YgdGhlIHRyYW5wb3J0Ci0JCQkJCQkJCQkJc3RyZWFtIFZBTElEIHNpZ25hbCBiZWZvcmUgYW55IHByb2Nlc3Npbmcgb2NjdXJzIG9uIHRoZSB0cmFuc3BvcnQKLQkJCQkJCQkJCQlzdHJlYW0gd2l0aGluIEZsZXhDb3AzLiAqLwotCQl1MzIgcG9sYXJpdHlfUFNfU1lOQ19zaWc6IDE7IC8qIFRoaXMgc2lnbmFsIGlzIHVzZWQgdG8gaW52ZXJ0IHRoZSBpbnB1dCBwb2xhcml0eSBvZiB0aGUgdHJhbnBvcnQKLQkJCQkJCQkJCQlzdHJlYW0gU1lOQyBzaWduYWwgYmVmb3JlIGFueSBwcm9jZXNzaW5nIG9jY3VycyBvbiB0aGUgdHJhbnNwb3J0Ci0JCQkJCQkJCQkJc3RyZWFtIHdpdGhpbiBGbGV4Q29wMy4gKi8KLQkJdTMyIHBvbGFyaXR5X1BTX0VSUl9zaWc6IDE7ICAvKiBUaGlzIHNpZ25hbCBpcyB1c2VkIHRvIGludmVydCB0aGUgaW5wdXQgcG9sYXJpdHkgb2YgdGhlIHRyYW5wb3J0Ci0JCQkJCQkJCQkJc3RyZWFtIEVSUk9SIHNpZ25hbCBiZWZvcmUgYW55IHByb2Nlc3Npbmcgb2NjdXJzIG9uIHRoZSB0cmFuc3BvcnQKLQkJCQkJCQkJCQlzdHJlYW0gd2l0aGluIEZsZXhDb3AzLiAqLwotCQl1MzIgdW51c2VkMiAgICAgICAgICAgOjIwOwotCX0gbWlzY18yMTQ7Ci0KLS8qIE1haWxib3ggZnJvbSBWOCB0byBob3N0ICovCi0Jc3RydWN0IHsKLQkJdTMyIE1haWxib3hfZnJvbV9WOCAgIDozMjsgICAvKiBXaGVuIHRoaXMgcmVnaXN0ZXIgaXMgd3JpdHRlbiBieSBlaXRoZXIgdGhlIFY4IHByb2Nlc3NvciBvciBieSBhbgotCQkJCQkJCQkJCWVuZCBob3N0LCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHRvIHRoZSBQQ0kgaG9zdCB0byBpbmRpY2F0ZQotCQkJCQkJCQkJCXRoYXQgbWFpbGJveCBkYXRhIGlzIGF2YWlsYWJsZS4gUmVhZGluZyByZWdpc3RlciAyMGMgd2lsbCBjbGVhcgotCQkJCQkJCQkJCXRoZSBJUlEuICovCi0JfSBtYm94X3Y4X3RvX2hvc3RfMjE4OwotCi0vKiBNYWlsYm94IGZyb20gaG9zdCB0byB2OCBNYWlsYm94X3RvX1Y4Ci0gKiBNYWlsYm94X3RvX1Y4IG1haWxib3ggc3RvcmFnZSByZWdpc3RlcgotICogdXNlZCB0byBzZW5kIG1lc3NhZ2VzIGZyb20gUENJIHRvIFY4LiBXcml0aW5nIHRvIHRoaXMgcmVnaXN0ZXIgd2lsbCBzZW5kIGFuCi0gKiBJUlEgdG8gdGhlIFY4LiBUaGVuIGl0IGNhbiByZWFkIHRoZSBkYXRhIGZyb20gaGVyZS4gUmVhZGluZyB0aGlzIHJlZ2lzdGVyCi0gKiB3aWxsIGNsZWFyIHRoZSBJUlEuIElmIHRoZSBWOCBpcyBoYWx0ZWQgYW5kIGJpdCAzMSBvZiB0aGlzIHJlZ2lzdGVyIGlzIHNldCwKLSAqIHRoZW4gdGhpcyByZWdpc3RlciBpcyB1c2VkIGluc3RlYWQgYXMgYSBkaXJlY3QgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGUKLSAqIFY4c3BhY2UgbWVtb3J5LgotICovCi0Jc3RydWN0IHsKLQkJdTMyIHN5c3JhbWFjY2Vzc19kYXRhIDogODsgICAvKiBEYXRhIGJ5dGUgd3JpdHRlbiBvciByZWFkIGZyb20gdGhlIHNwZWNpZmllZCBhZGRyZXNzIGluIFY4IFN5c1JBTS4gKi8KLQkJdTMyIHN5c3JhbWFjY2Vzc19hZGRyIDoxNTsgICAvKiAxNSBiaXQgYWRkcmVzcyB1c2VkIHRvIGFjY2VzcyBWOCBTeXMtUkFNLiAqLwotCQl1MzIgdW51c2VkICAgICAgICAgICAgOiA3OwotCQl1MzIgc3lzcmFtYWNjZXNzX3dyaXRlOiAxOyAgIC8qIFdyaXRlIGZsYWcgdXNlZCB0byBsYXRjaCBkYXRhIGludG8gdGhlIFY4IFN5c1JBTS4gKi8KLQkJdTMyIHN5c3JhbWFjY2Vzc19idXNtdXN0ZXI6IDE7IC8qIFNldHRpbmcgdGhpcyBiaXQgd2hlbiB0aGUgVjggaXMgaGFsdGVkIGF0IDB4MjE0IEJpdCgyKSBhbGxvd3MKLQkJCQkJCQkJCQkgIHRoaXMgSUJJIHJlZ2lzdGVyIGludGVyZmFjZSB0byBkaXJlY3RseSBkcml2ZSB0aGUgVjgtc3BhY2UgbWVtb3J5LiAqLwotCX0gbWJveF9ob3N0X3RvX3Y4XzIxYzsKLQotCi0vKiBQSURzLCBUcmFuc2xhdGlvbiBCaXQsIFNNQyBGaWx0ZXIgU2VsZWN0IDB4MzAwIHRvIDB4MzFjICovCi0Jc3RydWN0IHsKLQkJdTMyIFN0cmVhbTFfUElEICAgICAgIDoxMzsgICAvKiBQcmltYXJ5IHVzZSBpcyByZWNlaXZpbmcgTmV0IGRhdGEsIHNvIHRoZXNlIDEzIGJpdHMgbm9ybWFsbHkKLQkJCQkJCQkJCQlob2xkIHRoZSBQSUQgdmFsdWUgZm9yIHRoZSBkZXNpcmVkIG5ldHdvcmsgc3RyZWFtLiAqLwotCQl1MzIgU3RyZWFtMV90cmFucyAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBOZXQgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciBOZXQgZGF0YSBmZXJyaWVkIGluIFRTIHBhY2tldHMuICovCi0JCXUzMiBNQUNfTXVsdGljYXN0X2ZpbHRlciA6IDE7ICAgLyogV2hlbiBjbGVhciwgbXVsdGljYXN0IE1BQyBmaWx0ZXJpbmcgaXMgbm90IGFsbG93ZWQgZm9yIFN0cmVhbTEgYW5kIFBJRF9uIGZpbHRlcnMuICovCi0JCXUzMiBkZWJ1Z19mbGFnX3BpZF9zYXZlZCA6IDE7Ci0JCXUzMiBTdHJlYW0yX1BJRCAgICAgICA6MTM7ICAgLyogMTMgYml0cyBmb3IgU3RyZWFtIDIgUElEIGZpbHRlciB2YWx1ZS4gR2VuZXJhbCB1c2UuICovCi0JCXUzMiBTdHJlYW0yX3RyYW5zICAgICA6IDE7ICAgLyogV2hlbiBzZXQgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZSBkYXRhIGZlcnJpZWQgaW4KLQkJCQkJCQkJCQlTdHJlYW0yX1BJRCBUUyBwYWNrZXRzLiAqLwotCQl1MzIgZGVidWdfZmxhZ193cml0ZV9zdGF0dXMwMCA6IDE7Ci0JCXUzMiBkZWJ1Z19maWZvX3Byb2JsZW0gOiAxOwotCX0gcGlkX2ZpbHRlcl8zMDA7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgUENSX1BJRCAgICAgICAgICAgOjEzOyAgIC8qIFBDUiBzdHJlYW0gUElEIGZpbHRlciB2YWx1ZS4gUHJpbWFyeSB1c2UgaXMgUHJvZ3JhbSBDbG9jayBSZWZlcmVuY2Ugc3RyZWFtIGZpbHRlcmluZy4gKi8KLQkJdTMyIFBDUl90cmFucyAgICAgICAgIDogMTsgICAvKiBXaGVuIHNldCwgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZXNlIHBhY2tldHMuICovCi0JCXUzMiBkZWJ1Z19vdmVycnVuMyAgICA6IDE7Ci0JCXUzMiBkZWJ1Z19vdmVycnVuMiAgICA6IDE7Ci0JCXUzMiBQTVRfUElEICAgICAgICAgICA6MTM7ICAgLyogc3RyZWFtIFBJRCBmaWx0ZXIgdmFsdWUuIFByaW1hcnkgdXNlIGlzIFByb2dyYW0gTWFuYWdlbWVudCBUYWJsZSBzZWdtZW50IGZpbHRlcmluZy4gKi8KLQkJdTMyIFBNVF90cmFucyAgICAgICAgIDogMTsgICAvKiBXaGVuIHNldCwgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZXNlIHBhY2tldHMuICovCi0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDI7Ci0JfSBwaWRfZmlsdGVyXzMwNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBFTU1fUElEICAgICAgICAgICA6MTM7ICAgLyogRU1NIFBJRCBmaWx0ZXIgdmFsdWUuIFByaW1hcnkgdXNlIGlzIEVudGl0bGVtZW50IE1hbmFnZW1lbnQgTWVzc2FnaW5nIGZvcgotCQkJCQkJCQkJCWNvbmRpdGlvbmFsIGFjY2Vzcy1yZWxhdGVkIGRhdGEuICovCi0JCXUzMiBFTU1fdHJhbnMgICAgICAgICA6IDE7ICAgLyogV2hlbiBzZXQsIFRhYmxlcy9DQUkgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciB0aGVzZSBwYWNrZXRzLiAqLwotCQl1MzIgRU1NX2ZpbHRlcl80ICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0IHdpbGwgcGFzcyBvbmx5IEVNTSBkYXRhIHBvc3Nlc3NpbmcgdGhlIHNhbWUgSUQgY29kZSBhcyB0aGUKLQkJCQkJCQkJCQlmaXJzdCBmb3VyIGJ5dGVzICgzMiBiaXRzKSBvZiB0aGUgZW5kLXVzZXIgcyA2LWJ5dGUgU21hcnQgQ2FyZCBJRCBudW1iZXIgU2VsZWN0ICovCi0JCXUzMiBFTU1fZmlsdGVyXzYgICAgICA6IDE7ICAgLyogV2hlbiBzZXQgd2lsbCBwYXNzIG9ubHkgRU1NIGRhdGEgcG9zc2Vzc2luZyB0aGUgc2FtZSA2LWJ5dGUgY29kZSBhcyB0aGUgZW5kLXVzZXJzCi0JCQkJCQkJCQkJY29tcGxldGUgNi1ieXRlIFNtYXJ0IENhcmQgSUQgbnVtYmVyLiAqLwotCQl1MzIgRUNNX1BJRCAgICAgICAgICAgOjEzOyAgIC8qIEVDTSBQSUQgZmlsdGVyIHZhbHVlLiBQcmltYXJ5IHVzZSBpcyBFbnRpdGxlbWVudCBDb250cm9sIE1lc3NhZ2luZyBmb3IgY29uZGl0aW9uYWwKLQkJCQkJCQkJCQlhY2Nlc3MtcmVsYXRlZCBkYXRhLiAqLwotCQl1MzIgRUNNX3RyYW5zICAgICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBUYWJsZXMvQ0FJIHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgdGhlc2UgcGFja2V0cy4gKi8KLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDogMjsKLQl9IHBpZF9maWx0ZXJfMzA4OwotCi0Jc3RydWN0IHsKLQkJdTMyIEdyb3VwX1BJRCAgICAgOjEzOyAgIC8qIFBJRCB2YWx1ZSBmb3IgZ3JvdXAgZmlsdGVyaW5nLiAqLwotCQl1MzIgR3JvdXBfdHJhbnMgICA6IDE7ICAgLyogV2hlbiBzZXQsIFRhYmxlcy9DQUkgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciB0aGVzZSBwYWNrZXRzLiAqLwotCQl1MzIgdW51c2VkMSAgICAgICA6IDI7Ci0JCXUzMiBHcm91cF9tYXNrICAgIDoxMzsgICAvKiBNYXNrIHZhbHVlIHVzZWQgaW4gbG9naWNhbCAiYW5kIiBlcXVhdGlvbiB0aGF0IGRlZmluZXMgZ3JvdXAgZmlsdGVyaW5nICovCi0JCXUzMiB1bnVzZWQyICAgICAgIDogMzsKLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMF83OwotCi0Jc3RydWN0IHsKLQkJdTMyIG5ldF9tYXN0ZXJfcmVhZCA6MTc7Ci0JCXUzMiB1bnVzZWQgICAgICAgIDoxNTsKLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMTsKLQotCXN0cnVjdCB7Ci0JCXUzMiBuZXRfbWFzdGVyX3dyaXRlIDoxNzsKLQkJdTMyIHVudXNlZCAgICAgICAgOjE1OwotCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8yOwotCi0Jc3RydWN0IHsKLQkJdTMyIG5leHRfbmV0X21hc3Rlcl93cml0ZSA6MTc7Ci0JCXUzMiB1bnVzZWQgICAgICAgIDoxNTsKLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMzsKLQotCXN0cnVjdCB7Ci0JCXUzMiB1bnVzZWQxICAgICAgIDogMTsKLQkJdTMyIHN0YXRlX3dyaXRlICAgOjEwOwotCQl1MzIgcmVzZXJ2ZWQxICAgICA6IDY7ICAgLyogZGVmYXVsdDogMDAwMTAwICovCi0JCXUzMiBzdGFja19yZWFkICAgIDoxMDsKLQkJdTMyIHJlc2VydmVkMiAgICAgOiA1OyAgIC8qIGRlZmF1bHQ6IDAwMTAwICovCi0JfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzQ7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgc3RhY2tfY250ICAgICA6MTA7Ci0JCXUzMiB1bnVzZWQgICAgICAgIDoyMjsKLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNTsKLQotCXN0cnVjdCB7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMCA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMSA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMiA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMyA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnNCA6IDI7Ci0JCXUzMiBwaWRfZnNtX3NhdmVfcmVnMzAwIDogMjsKLQkJdTMyIHdyaXRlX3N0YXR1czEgOiAyOwotCQl1MzIgd3JpdGVfc3RhdHVzNCA6IDI7Ci0JCXUzMiBkYXRhX3NpemVfcmVnIDoxMjsKLQkJdTMyIHVudXNlZCAgICAgICAgOiA0OwotCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF82OwotCi0Jc3RydWN0IHsKLQkJdTMyIGluZGV4X3JlZyAgICAgICAgIDogNTsgICAvKiAoSW5kZXggcG9pbnRlcikgUG9pbnRzIGF0IGFuIGludGVybmFsIFBJRG4gcmVnaXN0ZXIuIEEgYmluYXJ5IGNvZGUKLQkJCQkJCQkJCQlyZXByZXNlbnRpbmcgb25lIG9mIDMyIGludGVybmFsIFBJRG4gcmVnaXN0ZXJzIGFzIHdlbGwgYXMgaXRzCi0JCQkJCQkJCQkJY29ycmVzcG9uZGluZyBpbnRlcm5hbCBNQUNfbG93biByZWdpc3Rlci4gKi8KLQkJdTMyIGV4dHJhX2luZGV4X3JlZyAgIDogMzsgICAvKiBUaGlzIHZlY3RvciBpcyB1c2VkIHRvIHNlbGVjdCBiZXR3ZWVuIHNldHMgb2YgZGVidWcgc2lnbmFscyByb3V0ZWQgdG8gcmVnaXN0ZXIgMHgzMGMuICovCi0JCXUzMiBBQl9zZWxlY3QgICAgICAgICA6IDE7ICAgLyogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIDB4MzFjLiByZWFkL3dyaXRlIHRvIHRoZSBNQUNfaGlnaEEgb3IgTUFDX2hpZ2hCIHJlZ2lzdGVyCi0JCQkJCQkJCQkJMD1NQUNfaGlnaEIgcmVnaXN0ZXIsIDE9TUFDX2hpZ2hBICovCi0JCXUzMiBwYXNzX2FsbHRhYmxlcyAgICA6IDE7ICAgLyogMT1OZXQgcGFja2V0cyBhcmUgbm90IGZpbHRlcmVkIGFnYWluc3QgdGhlIE5ldHdvcmsgVGFibGUgSUQgZm91bmQgaW4gcmVnaXN0ZXIgMHg0MDAuCi0JCQkJCQkJCQkJQWxsIHR5cGVzIG9mIG5ldHdvcmtzIChEVkIsIEFUU0MsIElTREIpIGFyZSBwYXNzZWQuICovCi0JCXUzMiB1bnVzZWQgICAgICAgICAgICA6MjI7Ci0JfSBpbmRleF9yZWdfMzEwOwotCi0Jc3RydWN0IHsKLQkJdTMyIFBJRCAgICAgICAgICAgICAgIDoxMzsgICAvKiBQSUQgdmFsdWUgKi8KLQkJdTMyIFBJRF90cmFucyAgICAgICAgIDogMTsgICAvKiB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHBhY2tldHMgZmlsdGVyZWQgKi8KLQkJdTMyIFBJRF9lbmFibGVfYml0ICAgIDogMTsgICAvKiBXaGVuIHNldCB0aGlzIFBJRCBmaWx0ZXIgaXMgZW5hYmxlZCAqLwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjE3OwotCX0gcGlkX25fcmVnXzMxNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBBNF9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBBNV9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBBNl9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBFbmFibGVfYml0ICAgICAgICA6IDE7ICAgLyogZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDEpICovCi0JCXUzMiBIaWdoQUJfYml0ICAgICAgICA6IDE7ICAgLyogdXNlIE1BQ19oaWdoQSAoMSkgb3IgTUFDX2hpZ2hCICgwKSBhcyBNU0IgKi8KLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDogNjsKLQl9IG1hY19sb3dfcmVnXzMxODsKLQotCXN0cnVjdCB7Ci0JCXUzMiBBMV9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBBMl9ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiBBM19ieXRlICAgICAgICAgICA6IDg7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDg7Ci0JfSBtYWNfaGlnaF9yZWdfMzFjOwotCi0vKiBUYWJsZSwgU01DSUQsTUFDRGVzdGluYXRpb24gRmlsdGVycyAweDQwMCB0byAweDQxYyAqLwotCXN0cnVjdCB7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6MTY7CiAjZGVmaW5lIGZjX2RhdGFfVGFnX0lEX0RWQiAgMHgzZQogI2RlZmluZSBmY19kYXRhX1RhZ19JRF9BVFNDIDB4M2YKICNkZWZpbmUgZmNfZGF0YV9UYWdfSURfSURTQiAweDhiCi0JCXUzMiBkYXRhX1RhZ19JRCAgICAgICA6MTY7Ci0JfSBkYXRhX3RhZ180MDA7CiAKLQlzdHJ1Y3QgewotCQl1MzIgQ2FyZF9JRGJ5dGU2ICAgICAgOiA4OwotCQl1MzIgQ2FyZF9JRGJ5dGU1ICAgICAgOiA4OwotCQl1MzIgQ2FyZF9JRGJ5dGU0ICAgICAgOiA4OwotCQl1MzIgQ2FyZF9JRGJ5dGUzICAgICAgOiA4OwotCX0gY2FyZF9pZF80MDg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgQ2FyZF9JRGJ5dGUyICAgICAgOiA4OwotCQl1MzIgQ2FyZF9JRGJ5dGUxICAgICAgOiA4OwotCX0gY2FyZF9pZF80MGM7Ci0KLQkvKiBob2xkaW5nIHRoZSB1bmlxdWUgbWFjIGFkZHJlc3Mgb2YgdGhlIHJlY2VpdmVyIHdoaWNoIGhvdXNlcyB0aGUgRmxleENvcElJSSAqLwotCXN0cnVjdCB7Ci0JCXUzMiBNQUMxICAgICAgICAgICAgICA6IDg7Ci0JCXUzMiBNQUMyICAgICAgICAgICAgICA6IDg7Ci0JCXUzMiBNQUMzICAgICAgICAgICAgICA6IDg7Ci0JCXUzMiBNQUM2ICAgICAgICAgICAgICA6IDg7Ci0JfSBtYWNfYWRkcmVzc180MTg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgTUFDNyAgICAgICAgICAgICAgOiA4OwotCQl1MzIgTUFDOCAgICAgICAgICAgICAgOiA4OwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiAxNjsKLQl9IG1hY19hZGRyZXNzXzQxYzsKLQotCXN0cnVjdCB7Ci0JCXUzMiB0cmFuc21pdHRlcl9kYXRhX2J5dGUgOiA4OwotCQl1MzIgUmVjZWl2ZURhdGFSZWFkeSAgOiAxOwotCQl1MzIgUmVjZWl2ZUJ5dGVGcmFtZUVycm9yOiAxOwotCQl1MzIgdHhidWZmZW1wdHkgICAgICAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjIxOwotCX0gY2lfNjAwOwotCi0Jc3RydWN0IHsKLQkJdTMyIHBpX2QgICAgICAgICAgICAgIDogODsKLQkJdTMyIHBpX2hhICAgICAgICAgICAgIDoyMDsKLQkJdTMyIHBpX3J3ICAgICAgICAgICAgIDogMTsKLQkJdTMyIHBpX2NvbXBvbmVudF9yZWcgIDogMzsKLQl9IHBpXzYwNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBzZXJpYWxSZXNldCAgICAgICA6IDE7Ci0JCXUzMiBvbmNlY3ljbGVfcmVhZCAgICA6IDE7Ci0JCXUzMiBUaW1lcl9SZWFkX3JlcSAgICA6IDE7Ci0JCXUzMiBUaW1lcl9Mb2FkX3JlcSAgICA6IDE7Ci0JCXUzMiB0aW1lcl9kYXRhICAgICAgICA6IDc7Ci0JCXUzMiB1bnVzZWQgICAgICAgICAgICA6IDE7IC8qID8/PyBub3QgbWVudGlvbmVkIGluIGRhdGEgYm9vayAqLwotCQl1MzIgVGltZXJfYWRkciAgICAgICAgOiA1OwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiAzOwotCQl1MzIgcGNtY2lhX2FfbW9kX3B3cl9uIDogMTsKLQkJdTMyIHBjbWNpYV9iX21vZF9wd3JfbiA6IDE7Ci0JCXUzMiBjb25maWdfRG9uZV9zdGF0ICA6IDE7Ci0JCXUzMiBjb25maWdfSW5pdF9zdGF0ICA6IDE7Ci0JCXUzMiBjb25maWdfUHJvZ19uICAgICA6IDE7Ci0JCXUzMiBjb25maWdfd3JfbiAgICAgICA6IDE7Ci0JCXUzMiBjb25maWdfY3NfbiAgICAgICA6IDE7Ci0JCXUzMiBjb25maWdfY2NsayAgICAgICA6IDE7Ci0JCXUzMiBwaV9DaU1heF9JUlFfbiAgICA6IDE7Ci0JCXUzMiBwaV90aW1lb3V0X3N0YXR1cyA6IDE7Ci0JCXUzMiBwaV93YWl0X24gICAgICAgICA6IDE7Ci0JCXUzMiBwaV9idXN5X24gICAgICAgICA6IDE7Ci0JfSBwaV82MDg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgUElEICAgICAgICAgICAgICAgOjEzOwotCQl1MzIga2V5X2VuYWJsZSAgICAgICAgOiAxOwogI2RlZmluZSBmY19rZXlfY29kZV9kZWZhdWx0IDB4MQogI2RlZmluZSBmY19rZXlfY29kZV9ldmVuICAgIDB4MgogI2RlZmluZSBmY19rZXlfY29kZV9vZGQgICAgIDB4MwotCQl1MzIga2V5X2NvZGUgICAgICAgICAgOiAyOwotCQl1MzIga2V5X2FycmF5X2NvbCAgICAgOiAzOwotCQl1MzIga2V5X2FycmF5X3JvdyAgICAgOiA1OwotCQl1MzIgZHZiX2VuICAgICAgICAgICAgOiAxOyAvKiAwPVRTIGJ5cGFzc2VzIHRoZSBEZXNjcmFtYmxlciAqLwotCQl1MzIgcndfZmxhZyAgICAgICAgICAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiA2OwotCX0gZHZiX3JlZ182MGM7Ci0KLS8qIFNSQU0gYW5kIE91dHB1dCBEZXN0aW5hdGlvbiAweDcwMCB0byAweDcxNCAqLwotCXN0cnVjdCB7Ci0JCXUzMiBzcmFtX2FkZHIgICAgICAgICA6MTU7Ci0JCXUzMiBzcmFtX3J3ICAgICAgICAgICA6IDE7ICAgLyogMD13cml0ZSwgMT1yZWFkICovCi0JCXUzMiBzcmFtX2RhdGEgICAgICAgICA6IDg7Ci0JCXUzMiBzY194ZmVyX2JpdCAgICAgICA6IDE7Ci0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDM7Ci0JCXUzMiBvZV9waW5fcmVnICAgICAgICA6IDE7Ci0JCXUzMiBjZV9waW5fcmVnICAgICAgICA6IDE7Ci0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6IDE7Ci0JCXUzMiBzdGFydF9zcmFtX2liaSAgICA6IDE7Ci0JfSBzcmFtX2N0cmxfcmVnXzcwMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBuZXRfYWRkcl9yZWFkICAgICA6MTY7Ci0JCXUzMiBuZXRfYWRkcl93cml0ZSAgICA6MTY7Ci0JfSBuZXRfYnVmX3JlZ183MDQ7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgY2FpX3JlYWQgICAgICAgICAgOjExOwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiA1OwotCQl1MzIgY2FpX3dyaXRlICAgICAgICAgOjExOwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOiA2OwotCQl1MzIgY2FpX2NudCAgICAgICAgICAgOiA0OwotCX0gY2FpX2J1Zl9yZWdfNzA4OwotCi0Jc3RydWN0IHsKLQkJdTMyIGNhb19yZWFkICAgICAgICAgIDoxMTsKLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogNTsKLQkJdTMyIGNhcF93cml0ZSAgICAgICAgIDoxMTsKLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDogNjsKLQkJdTMyIGNhb19jbnQgICAgICAgICAgIDogNDsKLQl9IGNhb19idWZfcmVnXzcwYzsKLQotCXN0cnVjdCB7Ci0JCXUzMiBtZWRpYV9yZWFkICAgICAgICA6MTE7Ci0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDU7Ci0JCXUzMiBtZWRpYV93cml0ZSAgICAgICA6MTE7Ci0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6IDY7Ci0JCXUzMiBtZWRpYV9jbnQgICAgICAgICA6IDQ7Ci0JfSBtZWRpYV9idWZfcmVnXzcxMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBORVRfRGVzdCAgICAgICAgICA6IDI7Ci0JCXUzMiBDQUlfRGVzdCAgICAgICAgICA6IDI7Ci0JCXUzMiBDQU9fRGVzdCAgICAgICAgICA6IDI7Ci0JCXUzMiBNRURJQV9EZXN0ICAgICAgICA6IDI7Ci0JCXUzMiBuZXRfb3ZmbG93X2Vycm9yICA6IDE7Ci0JCXUzMiBtZWRpYV9vdmZsb3dfZXJyb3IgOiAxOwotCQl1MzIgY2FpX292Zmxvd19lcnJvciAgOiAxOwotCQl1MzIgY2FvX292Zmxvd19lcnJvciAgOiAxOwotCQl1MzIgY3RybF91c2Jfd2FuICAgICAgOiAxOwotCQl1MzIgY3RybF9zcmFtZG1hICAgICAgOiAxOwotCQl1MzIgY3RybF9tYXhpbXVtZmlsbCAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjE3OwotCX0gc3JhbV9kZXN0X3JlZ183MTQ7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgbmV0X2NudCAgICAgICAgICAgOjEyOwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiA0OwotCQl1MzIgbmV0X2FkZHJfcmVhZCAgICAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOiAzOwotCQl1MzIgbmV0X2FkZHJfd3JpdGUgICAgOiAxOwotCQl1MzIgcmVzZXJ2ZWQzICAgICAgICAgOjExOwotCX0gbmV0X2J1Zl9yZWdfNzE4OwotCi0Jc3RydWN0IHsKLQkJdTMyIHdhbl9zcGVlZF9zaWcgICAgIDogMjsKLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogNjsKLQkJdTMyIHdhbl93YWl0X3N0YXRlICAgIDogODsKLQkJdTMyIHNyYW1fY2hpcCAgICAgICAgIDogMjsKLQkJdTMyIHNyYW1fbWVtbWFwICAgICAgIDogMjsKLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDogNDsKLQkJdTMyIHdhbl9wa3RfZnJhbWUgICAgIDogNDsKLQkJdTMyIHJlc2VydmVkMyAgICAgICAgIDogNDsKLQl9IHdhbl9jdHJsX3JlZ183MWM7Ci19IGZsZXhjb3BfaWJpX3ZhbHVlOwogCiBleHRlcm4gZmxleGNvcF9pYmlfdmFsdWUgaWJpX3plcm87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwppbmRleCAwMTEzNDQ5Li4wYTc4YmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5jCkBAIC01NDUsNyArNTQ1LDcgQEAKIC8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBmbGV4Y29wX3VzYl9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJUZWNobmlzYXQvQjJDMiBGbGV4Q29wIElJL0lJYi9JSUkgVVNCIiwKKwkubmFtZQkJPSAiYjJjMl9mbGV4Y29wX3VzYiIsCiAJLnByb2JlCQk9IGZsZXhjb3BfdXNiX3Byb2JlLAogCS5kaXNjb25uZWN0ID0gZmxleGNvcF91c2JfZGlzY29ubmVjdCwKIAkuaWRfdGFibGUJPSBmbGV4Y29wX3VzYl90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMKaW5kZXggOGI1ZDE0ZC4uMTI4NzNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogaW50IGIyYzJfZmxleGNvcF9kZWJ1ZzsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgYjJjMl9mbGV4Y29wX2RlYnVnLCAgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWcgbGV2ZWwgKDE9aW5mbywyPXR1bmVyLDQ9aTJjLDg9dHMsMTY9c3JhbSAofC1hYmxlKSkuIiBERUJTVEFUVVMpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1ZyBsZXZlbCAoMT1pbmZvLDI9dHVuZXIsND1pMmMsOD10cywxNj1zcmFtLDMyPXJlZyAofC1hYmxlKSkuIiBERUJTVEFUVVMpOwogI3VuZGVmIERFQlNUQVRVUwogCiAvKiBnbG9iYWwgemVybyBmb3IgaWJpIHZhbHVlcyAqLwpAQCAtMTczLDkgKzE3MywyMCBAQAogCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LGliaV96ZXJvKTsKIAogCXYyMTAucmF3ID0gMDsKLQl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja3MgPSAweGZmOworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzAwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfMTAwID0gMTsKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja18yMDAgPSAxOworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzMwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfNDAwID0gMTsKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja181MDAgPSAxOworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzYwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfNzAwID0gMTsKIAl2MjEwLnN3X3Jlc2V0XzIxMC5CbG9ja19yZXNldF9lbmFibGUgPSAweGIyOworCisJdjIxMC5zd19yZXNldF8yMTAuU3BlY2lhbF9jb250cm9scyA9IDB4YzI1OTsKKwogCWZjLT53cml0ZV9pYmlfcmVnKGZjLHN3X3Jlc2V0XzIxMCx2MjEwKTsKKwltc2xlZXAoMSk7CiAKIC8qIHJlc2V0IHRoZSBwZXJpcGhpY2FsIGRldmljZXMgKi8KIApAQCAtMTg2LDYgKzE5NywyNSBAQAogCWZjLT53cml0ZV9pYmlfcmVnKGZjLG1pc2NfMjA0LHYyMDQpOwogfQogCit2b2lkIGZsZXhjb3BfcmVzZXRfYmxvY2tfMzAwKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJZmxleGNvcF9pYmlfdmFsdWUgdjIwOF9zYXZlID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCksCisJCQkJCSAgdjIxMCA9IGZjLT5yZWFkX2liaV9yZWcoZmMsc3dfcmVzZXRfMjEwKTsKKworCWRlYl9yZHVtcCgiMjA4OiAlMDh4LCAyMTA6ICUwOHhcbiIsdjIwOF9zYXZlLnJhdyx2MjEwLnJhdyk7CisKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxjdHJsXzIwOCxpYmlfemVybyk7CisKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja18zMDAgPSAxOworCXYyMTAuc3dfcmVzZXRfMjEwLkJsb2NrX3Jlc2V0X2VuYWJsZSA9IDB4YjI7CisKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxzd19yZXNldF8yMTAsdjIxMCk7CisJbXNsZWVwKDEpOworCisJZmMtPndyaXRlX2liaV9yZWcoZmMsY3RybF8yMDgsdjIwOF9zYXZlKTsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9yZXNldF9ibG9ja18zMDApOworCiBzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZsZXhjb3BfZGV2aWNlX2ttYWxsb2Moc2l6ZV90IGJ1c19zcGVjaWZpY19sZW4pCiB7CiAJdm9pZCAqYnVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuaAppbmRleCBjYWEzNDNhLi4wY2ViZTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuaApAQCAtMjYsNSArMjYsNiBAQAogI2RlZmluZSBkZWJfaTJjKGFyZ3MuLi4pICAgZHByaW50aygweDA0LGFyZ3MpCiAjZGVmaW5lIGRlYl90cyhhcmdzLi4uKSAgICBkcHJpbnRrKDB4MDgsYXJncykKICNkZWZpbmUgZGViX3NyYW0oYXJncy4uLikgIGRwcmludGsoMHgxMCxhcmdzKQorI2RlZmluZSBkZWJfcmR1bXAoYXJncy4uLikgIGRwcmludGsoMHgyMCxhcmdzKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcF9pYmlfdmFsdWVfYmUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcF9pYmlfdmFsdWVfYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDlhNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wX2liaV92YWx1ZV9iZS5oCkBAIC0wLDAgKzEsNDU4IEBACisvKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgZm9yIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIHJlZ2lzdGVyIGRlc2NyaXB0aW9ucworICoKKyAqIHNlZSBmbGV4Y29wLmMgZm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IHRoaW5ncyBoZXJlLiAqLworI2lmbmRlZiBfX0ZMRVhDT1BfSUJJX1ZBTFVFX0lOQ0xVREVEX18KKyNkZWZpbmUgX19GTEVYQ09QX0lCSV9WQUxVRV9JTkNMVURFRF9fCisKK3R5cGVkZWYgdW5pb24geworCXUzMiByYXc7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hX2FkZHJlc3MwICAgICAgICAgICAgICAgICAgIDozMDsKKwkJdTMyIGRtYV8wTm9fdXBkYXRlICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWFfMHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gZG1hXzB4MDsKKworCXN0cnVjdCB7CisJCXUzMiBkbWFfYWRkcl9zaXplICAgICAgICAgICAgICAgICAgOjI0OworCQl1MzIgRE1BX21heHBhY2tldHMgICAgICAgICAgICAgICAgIDogODsKKwl9IGRtYV8weDRfcmVtYXA7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgICAgICAgICAgICAgIDoyNDsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWExdGltZXIgICAgICAgICAgICAgICAgICAgICAgOiA3OworCX0gZG1hXzB4NF9yZWFkOworCisJc3RydWN0IHsKKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgICAgICAgICAgICAgICA6MjQ7CisJCXUzMiBkbWF0aW1lciAgICAgICAgICAgICAgICAgICAgICAgOiA3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwl9IGRtYV8weDRfd3JpdGU7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hX2N1cl9hZGRyICAgICAgICAgICAgICAgICAgIDozMDsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJfSBkbWFfMHg4OworCisJc3RydWN0IHsKKwkJdTMyIGRtYV9hZGRyZXNzMSAgICAgICAgICAgICAgICAgICA6MzA7CisJCXUzMiByZW1hcF9lbmFibGUgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hXzFzdGFydCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwl9IGRtYV8weGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgc3RfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIG5vX2Jhc2VfYWRkcl9hY2tfZXJyb3IgICAgICAgICA6IDE7CisJCXUzMiB0d29XU19wb3J0X3JlZyAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdG90YWxfYnl0ZXMgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHR3b1dTX3J3ICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB3b3JraW5nX3N0YXJ0ICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZGF0YTFfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGJhc2VhZGRyICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY2hpcGFkZHIgICAgICAgICAgICAgICAgICAgICAgIDogNzsKKwl9IHR3X3NtX2NfMTAwOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBmb3JjZV9zdG9wICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZXhsaWNpdF9zdG9wcyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRhdGE0X3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBkYXRhM19yZWcgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgZGF0YTJfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IHR3X3NtX2NfMTA0OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6MTk7CisJCXUzMiB0bG8xICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHRoaTEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJfSB0d19zbV9jXzEwODsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOjE5OworCQl1MzIgdGxvMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0aGkxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA2OworCX0gdHdfc21fY18xMGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDoxOTsKKwkJdTMyIHRsbzEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdGhpMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwl9IHR3X3NtX2NfMTEwOworCisJc3RydWN0IHsKKwkJdTMyIExOQl9DVExQcmVzY2FsZXJfc2lnICAgICAgICAgICA6IDI7CisJCXUzMiBMTkJfQ1RMTG93Q291bnRfc2lnICAgICAgICAgICAgOjE1OworCQl1MzIgTE5CX0NUTEhpZ2hDb3VudF9zaWcgICAgICAgICAgIDoxNTsKKwl9IGxuYl9zd2l0Y2hfZnJlcV8yMDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgUmV2X05fc2lnX3Jlc2VydmVkMiAgICAgICAgICAgIDogMTsKKwkJdTMyIFJldl9OX3NpZ19jYXBzICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBSZXZfTl9zaWdfcmVzZXJ2ZWQxICAgICAgICAgICAgOiAyOworCQl1MzIgUmV2X05fc2lnX3JldmlzaW9uX2hpICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBQZXJfcmVzZXRfc2lnICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTE5CX0xfSF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEFDUEkzX3NpZyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBBQ1BJMV9zaWcgICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gbWlzY18yMDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogOTsKKwkJdTMyIE1haWxib3hfZnJvbV9WOF9FbmFibGVfc2lnICAgICA6IDE7CisJCXUzMiBETUEyX1NpemVfSVJRX0VuYWJsZV9zaWcgICAgICAgOiAxOworCQl1MzIgRE1BMV9TaXplX0lSUV9FbmFibGVfc2lnICAgICAgIDogMTsKKwkJdTMyIERNQTJfVGltZXJfRW5hYmxlX3NpZyAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX0lSUV9FbmFibGVfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9UaW1lcl9FbmFibGVfc2lnICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfSVJRX0VuYWJsZV9zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiBSY3ZfRGF0YV9zaWcgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTUFDX2ZpbHRlcl9Nb2RlX3NpZyAgICAgICAgICAgIDogMTsKKwkJdTMyIE11bHRpMl9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQZXJfQ0FfRW5hYmxlX3NpZyAgICAgICAgICAgICAgOiAxOworCQl1MzIgU01DX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIENBX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBXQU5fQ0FfRW5hYmxlX3NpZyAgICAgICAgICAgICAgOiAxOworCQl1MzIgV0FOX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE1hc2tfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBOdWxsX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRUNNX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9maWx0ZXJfc2lnICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQTVRfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUENSX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTJfZmlsdGVyX3NpZyAgICAgICAgICAgICA6IDE7CisJCXUzMiBTdHJlYW0xX2ZpbHRlcl9zaWcgICAgICAgICAgICAgOiAxOworCX0gY3RybF8yMDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoyMTsKKwkJdTMyIFRyYW5zcG9ydF9FcnJvciAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBMTENfU05BUF9GTEFHX3NldCAgICAgICAgICAgICAgOiAxOworCQl1MzIgQ29udGludWl0eV9lcnJvcl9mbGFnICAgICAgICAgIDogMTsKKwkJdTMyIERhdGFfcmVjZWl2ZXJfZXJyb3IgICAgICAgICAgICA6IDE7CisJCXUzMiBNYWlsYm94X2Zyb21fVjhfU3RhdHVzX3NpZyAgICAgOiAxOworCQl1MzIgRE1BMl9TaXplX0lSUV9TdGF0dXMgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfU2l6ZV9JUlFfU3RhdHVzICAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX1RpbWVyX1N0YXR1cyAgICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMl9JUlFfU3RhdHVzICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfVGltZXJfU3RhdHVzICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX0lSUV9TdGF0dXMgICAgICAgICAgICAgICAgOiAxOworCX0gaXJxXzIwYzsKKworCXN0cnVjdCB7CisJCXUzMiBTcGVjaWFsX2NvbnRyb2xzICAgICAgICAgICAgICAgOjE2OworCQl1MzIgQmxvY2tfcmVzZXRfZW5hYmxlICAgICAgICAgICAgIDogODsKKwkJdTMyIHJlc2V0X2Jsb2NrXzcwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja182MDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfNTAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzQwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja18zMDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfMjAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzEwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja18wMDAgICAgICAgICAgICAgICAgOiAxOworCX0gc3dfcmVzZXRfMjEwOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZDIgICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBwb2xhcml0eV9QU19FUlJfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgcG9sYXJpdHlfUFNfU1lOQ19zaWcgICAgICAgICAgIDogMTsKKwkJdTMyIHBvbGFyaXR5X1BTX1ZBTElEX3NpZyAgICAgICAgICA6IDE7CisJCXUzMiBwb2xhcml0eV9QU19DTEtfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgdW51c2VkMSAgICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIHMycF9zZWxfc2lnICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzZWN0aW9uX3BrZ19lbmFibGVfc2lnICAgICAgICAgOiAxOworCQl1MzIgaGFsdF9WOF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHYyV1Nfb2Vfc2lnICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB2dWFydF9vZV9zaWcgICAgICAgICAgICAgICAgICAgOiAxOworCX0gbWlzY18yMTQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgTWFpbGJveF9mcm9tX1Y4ICAgICAgICAgICAgICAgIDozMjsKKwl9IG1ib3hfdjhfdG9faG9zdF8yMTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgc3lzcmFtYWNjZXNzX2J1c211c3RlciAgICAgICAgIDogMTsKKwkJdTMyIHN5c3JhbWFjY2Vzc193cml0ZSAgICAgICAgICAgICA6IDE7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiA3OworCQl1MzIgc3lzcmFtYWNjZXNzX2FkZHIgICAgICAgICAgICAgIDoxNTsKKwkJdTMyIHN5c3JhbWFjY2Vzc19kYXRhICAgICAgICAgICAgICA6IDg7CisJfSBtYm94X2hvc3RfdG9fdjhfMjFjOworCisJc3RydWN0IHsKKwkJdTMyIGRlYnVnX2ZpZm9fcHJvYmxlbSAgICAgICAgICAgICA6IDE7CisJCXUzMiBkZWJ1Z19mbGFnX3dyaXRlX3N0YXR1czAwICAgICAgOiAxOworCQl1MzIgU3RyZWFtMl90cmFucyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTJfUElEICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBkZWJ1Z19mbGFnX3BpZF9zYXZlZCAgICAgICAgICAgOiAxOworCQl1MzIgTUFDX011bHRpY2FzdF9maWx0ZXIgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTFfdHJhbnMgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBTdHJlYW0xX1BJRCAgICAgICAgICAgICAgICAgICAgOjEzOworCX0gcGlkX2ZpbHRlcl8zMDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIFBNVF90cmFucyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQTVRfUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgZGVidWdfb3ZlcnJ1bjIgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRlYnVnX292ZXJydW4zICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQQ1JfdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUENSX1BJRCAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwl9IHBpZF9maWx0ZXJfMzA0OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBFQ01fdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRUNNX1BJRCAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIEVNTV9maWx0ZXJfNiAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFTU1fZmlsdGVyXzQgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRU1NX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9QSUQgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJfSBwaWRfZmlsdGVyXzMwODsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQyICAgICAgICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgR3JvdXBfbWFzayAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIHVudXNlZDEgICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBHcm91cF90cmFucyAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgR3JvdXBfUElEICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMF83OworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJCXUzMiBuZXRfbWFzdGVyX3JlYWQgICAgICAgICAgICAgICAgOjE3OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8xOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJCXUzMiBuZXRfbWFzdGVyX3dyaXRlICAgICAgICAgICAgICAgOjE3OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8yOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJCXUzMiBuZXh0X25ldF9tYXN0ZXJfd3JpdGUgICAgICAgICAgOjE3OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8zOworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBzdGFja19yZWFkICAgICAgICAgICAgICAgICAgICAgOjEwOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHN0YXRlX3dyaXRlICAgICAgICAgICAgICAgICAgICA6MTA7CisJCXUzMiB1bnVzZWQxICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF80OworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MjI7CisJCXUzMiBzdGFja19jbnQgICAgICAgICAgICAgICAgICAgICAgOjEwOworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF81OworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiBkYXRhX3NpemVfcmVnICAgICAgICAgICAgICAgICAgOjEyOworCQl1MzIgd3JpdGVfc3RhdHVzNCAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHdyaXRlX3N0YXR1czEgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMzAwICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzQgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWczICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMiAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzEgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWcwICAgICAgICAgICAgICA6IDI7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzY7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoyMjsKKwkJdTMyIHBhc3NfYWxsdGFibGVzICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBBQl9zZWxlY3QgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZXh0cmFfaW5kZXhfcmVnICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIGluZGV4X3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJfSBpbmRleF9yZWdfMzEwOworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTc7CisJCXUzMiBQSURfZW5hYmxlX2JpdCAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUElEX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJfSBwaWRfbl9yZWdfMzE0OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBIaWdoQUJfYml0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRW5hYmxlX2JpdCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEE2X2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBNV9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTRfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IG1hY19sb3dfcmVnXzMxODsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTNfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEEyX2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBMV9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2hpZ2hfcmVnXzMxYzsKKworCXN0cnVjdCB7CisJCXUzMiBkYXRhX1RhZ19JRCAgICAgICAgICAgICAgICAgICAgOjE2OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoxNjsKKwl9IGRhdGFfdGFnXzQwMDsKKworCXN0cnVjdCB7CisJCXUzMiBDYXJkX0lEYnl0ZTMgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQ2FyZF9JRGJ5dGU0ICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlNSAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBDYXJkX0lEYnl0ZTYgICAgICAgICAgICAgICAgICAgOiA4OworCX0gY2FyZF9pZF80MDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgQ2FyZF9JRGJ5dGUxICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlMiAgICAgICAgICAgICAgICAgICA6IDg7CisJfSBjYXJkX2lkXzQwYzsKKworCXN0cnVjdCB7CisJCXUzMiBNQUM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIE1BQzIgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBNQUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2FkZHJlc3NfNDE4OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTY7CisJCXUzMiBNQUM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IG1hY19hZGRyZXNzXzQxYzsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjIxOworCQl1MzIgdHhidWZmZW1wdHkgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFJlY2VpdmVCeXRlRnJhbWVFcnJvciAgICAgICAgICA6IDE7CisJCXUzMiBSZWNlaXZlRGF0YVJlYWR5ICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdHJhbnNtaXR0ZXJfZGF0YV9ieXRlICAgICAgICAgIDogODsKKwl9IGNpXzYwMDsKKworCXN0cnVjdCB7CisJCXUzMiBwaV9jb21wb25lbnRfcmVnICAgICAgICAgICAgICAgOiAzOworCQl1MzIgcGlfcncgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBpX2hhICAgICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBwaV9kICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gcGlfNjA0OworCisJc3RydWN0IHsKKwkJdTMyIHBpX2J1c3lfbiAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV93YWl0X24gICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfdGltZW91dF9zdGF0dXMgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBpX0NpTWF4X0lSUV9uICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfY2NsayAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX2NzX24gICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ193cl9uICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfUHJvZ19uICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX0luaXRfc3RhdCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19Eb25lX3N0YXQgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwY21jaWFfYl9tb2RfcHdyX24gICAgICAgICAgICAgOiAxOworCQl1MzIgcGNtY2lhX2FfbW9kX3B3cl9uICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBUaW1lcl9hZGRyICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHRpbWVyX2RhdGEgICAgICAgICAgICAgICAgICAgICA6IDc7CisJCXUzMiBUaW1lcl9Mb2FkX3JlcSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgVGltZXJfUmVhZF9yZXEgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIG9uY2VjeWNsZV9yZWFkICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzZXJpYWxSZXNldCAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gcGlfNjA4OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiByd19mbGFnICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZHZiX2VuICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGtleV9hcnJheV9yb3cgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBrZXlfYXJyYXlfY29sICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIga2V5X2NvZGUgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIGtleV9lbmFibGUgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCX0gZHZiX3JlZ182MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgc3RhcnRfc3JhbV9pYmkgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjZV9waW5fcmVnICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgb2VfcGluX3JlZyAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBzY194ZmVyX2JpdCAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgc3JhbV9kYXRhICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHNyYW1fcncgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzcmFtX2FkZHIgICAgICAgICAgICAgICAgICAgICAgOjE1OworCX0gc3JhbV9jdHJsX3JlZ183MDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgbmV0X2FkZHJfd3JpdGUgICAgICAgICAgICAgICAgIDoxNjsKKwkJdTMyIG5ldF9hZGRyX3JlYWQgICAgICAgICAgICAgICAgICA6MTY7CisJfSBuZXRfYnVmX3JlZ183MDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgY2FpX2NudCAgICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBjYWlfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIGNhaV9yZWFkICAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJfSBjYWlfYnVmX3JlZ183MDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgY2FvX2NudCAgICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBjYXBfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIGNhb19yZWFkICAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJfSBjYW9fYnVmX3JlZ183MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgbWVkaWFfY250ICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBtZWRpYV93cml0ZSAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIG1lZGlhX3JlYWQgICAgICAgICAgICAgICAgICAgICA6MTE7CisJfSBtZWRpYV9idWZfcmVnXzcxMDsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjE3OworCQl1MzIgY3RybF9tYXhpbXVtZmlsbCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGN0cmxfc3JhbWRtYSAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjdHJsX3VzYl93YW4gICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY2FvX292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNhaV9vdmZsb3dfZXJyb3IgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBtZWRpYV9vdmZsb3dfZXJyb3IgICAgICAgICAgICAgOiAxOworCQl1MzIgbmV0X292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE1FRElBX0Rlc3QgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBDQU9fRGVzdCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgQ0FJX0Rlc3QgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIE5FVF9EZXN0ICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJfSBzcmFtX2Rlc3RfcmVnXzcxNDsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZDMgICAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgbmV0X2FkZHJfd3JpdGUgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBuZXRfYWRkcl9yZWFkICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIG5ldF9jbnQgICAgICAgICAgICAgICAgICAgICAgICA6MTI7CisJfSBuZXRfYnVmX3JlZ183MTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQzICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHdhbl9wa3RfZnJhbWUgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOiA0OworCQl1MzIgc3JhbV9tZW1tYXAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHNyYW1fY2hpcCAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB3YW5fd2FpdF9zdGF0ZSAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHdhbl9zcGVlZF9zaWcgICAgICAgICAgICAgICAgICA6IDI7CisJfSB3YW5fY3RybF9yZWdfNzFjOworfSBmbGV4Y29wX2liaV92YWx1ZTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3BfaWJpX3ZhbHVlX2xlLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3BfaWJpX3ZhbHVlX2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmMjMxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcF9pYmlfdmFsdWVfbGUuaApAQCAtMCwwICsxLDQ1OCBAQAorLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGludXggZHJpdmVyIGZvciBkaWdpdGFsIFRWIGRldmljZXMgZXF1aXBwZWQgd2l0aCBCMkMyIEZsZXhjb3BJSShiKS9JSUkKKyAqCisgKiByZWdpc3RlciBkZXNjcmlwdGlvbnMKKyAqCisgKiBzZWUgZmxleGNvcC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKworLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCB0aGluZ3MgaGVyZS4gKi8KKyNpZm5kZWYgX19GTEVYQ09QX0lCSV9WQUxVRV9JTkNMVURFRF9fCisjZGVmaW5lIF9fRkxFWENPUF9JQklfVkFMVUVfSU5DTFVERURfXworCit0eXBlZGVmIHVuaW9uIHsKKwl1MzIgcmF3OworCisJc3RydWN0IHsKKwkJdTMyIGRtYV8wc3RhcnQgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWFfME5vX3VwZGF0ZSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hX2FkZHJlc3MwICAgICAgICAgICAgICAgICAgIDozMDsKKwl9IGRtYV8weDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgRE1BX21heHBhY2tldHMgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgICAgICAgICAgICAgICA6MjQ7CisJfSBkbWFfMHg0X3JlbWFwOworCisJc3RydWN0IHsKKwkJdTMyIGRtYTF0aW1lciAgICAgICAgICAgICAgICAgICAgICA6IDc7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgICAgICAgICAgICAgIDoyNDsKKwl9IGRtYV8weDRfcmVhZDsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hdGltZXIgICAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgICAgICAgICAgICAgICA6MjQ7CisJfSBkbWFfMHg0X3dyaXRlOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBkbWFfY3VyX2FkZHIgICAgICAgICAgICAgICAgICAgOjMwOworCX0gZG1hXzB4ODsKKworCXN0cnVjdCB7CisJCXUzMiBkbWFfMXN0YXJ0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVtYXBfZW5hYmxlICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRtYV9hZGRyZXNzMSAgICAgICAgICAgICAgICAgICA6MzA7CisJfSBkbWFfMHhjOworCisJc3RydWN0IHsKKwkJdTMyIGNoaXBhZGRyICAgICAgICAgICAgICAgICAgICAgICA6IDc7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgYmFzZWFkZHIgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGRhdGExX3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiB3b3JraW5nX3N0YXJ0ICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdHdvV1NfcncgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHRvdGFsX2J5dGVzICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0d29XU19wb3J0X3JlZyAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgbm9fYmFzZV9hZGRyX2Fja19lcnJvciAgICAgICAgIDogMTsKKwkJdTMyIHN0X2RvbmUgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJfSB0d19zbV9jXzEwMDsKKworCXN0cnVjdCB7CisJCXUzMiBkYXRhMl9yZWcgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgZGF0YTNfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGRhdGE0X3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBleGxpY2l0X3N0b3BzICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZm9yY2Vfc3RvcCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJfSB0d19zbV9jXzEwNDsKKworCXN0cnVjdCB7CisJCXUzMiB0aGkxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA2OworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHRsbzEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOjE5OworCX0gdHdfc21fY18xMDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgdGhpMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0bG8xICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDoxOTsKKwl9IHR3X3NtX2NfMTBjOworCisJc3RydWN0IHsKKwkJdTMyIHRoaTEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdGxvMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6MTk7CisJfSB0d19zbV9jXzExMDsKKworCXN0cnVjdCB7CisJCXUzMiBMTkJfQ1RMSGlnaENvdW50X3NpZyAgICAgICAgICAgOjE1OworCQl1MzIgTE5CX0NUTExvd0NvdW50X3NpZyAgICAgICAgICAgIDoxNTsKKwkJdTMyIExOQl9DVExQcmVzY2FsZXJfc2lnICAgICAgICAgICA6IDI7CisJfSBsbmJfc3dpdGNoX2ZyZXFfMjAwOworCisJc3RydWN0IHsKKwkJdTMyIEFDUEkxX3NpZyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBBQ1BJM19zaWcgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTE5CX0xfSF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBlcl9yZXNldF9zaWcgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjIwOworCQl1MzIgUmV2X05fc2lnX3JldmlzaW9uX2hpICAgICAgICAgIDogNDsKKwkJdTMyIFJldl9OX3NpZ19yZXNlcnZlZDEgICAgICAgICAgICA6IDI7CisJCXUzMiBSZXZfTl9zaWdfY2FwcyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUmV2X05fc2lnX3Jlc2VydmVkMiAgICAgICAgICAgIDogMTsKKwl9IG1pc2NfMjA0OworCisJc3RydWN0IHsKKwkJdTMyIFN0cmVhbTFfZmlsdGVyX3NpZyAgICAgICAgICAgICA6IDE7CisJCXUzMiBTdHJlYW0yX2ZpbHRlcl9zaWcgICAgICAgICAgICAgOiAxOworCQl1MzIgUENSX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBNVF9maWx0ZXJfc2lnICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFTU1fZmlsdGVyX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRUNNX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE51bGxfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBNYXNrX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgV0FOX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFdBTl9DQV9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBDQV9FbmFibGVfc2lnICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgU01DX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBlcl9DQV9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBNdWx0aTJfRW5hYmxlX3NpZyAgICAgICAgICAgICAgOiAxOworCQl1MzIgTUFDX2ZpbHRlcl9Nb2RlX3NpZyAgICAgICAgICAgIDogMTsKKwkJdTMyIFJjdl9EYXRhX3NpZyAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX0lSUV9FbmFibGVfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9UaW1lcl9FbmFibGVfc2lnICAgICAgICAgIDogMTsKKwkJdTMyIERNQTJfSVJRX0VuYWJsZV9zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX1RpbWVyX0VuYWJsZV9zaWcgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9TaXplX0lSUV9FbmFibGVfc2lnICAgICAgIDogMTsKKwkJdTMyIERNQTJfU2l6ZV9JUlFfRW5hYmxlX3NpZyAgICAgICA6IDE7CisJCXUzMiBNYWlsYm94X2Zyb21fVjhfRW5hYmxlX3NpZyAgICAgOiAxOworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogOTsKKwl9IGN0cmxfMjA4OworCisJc3RydWN0IHsKKwkJdTMyIERNQTFfSVJRX1N0YXR1cyAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX1RpbWVyX1N0YXR1cyAgICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMl9JUlFfU3RhdHVzICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTJfVGltZXJfU3RhdHVzICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX1NpemVfSVJRX1N0YXR1cyAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMl9TaXplX0lSUV9TdGF0dXMgICAgICAgICAgIDogMTsKKwkJdTMyIE1haWxib3hfZnJvbV9WOF9TdGF0dXNfc2lnICAgICA6IDE7CisJCXUzMiBEYXRhX3JlY2VpdmVyX2Vycm9yICAgICAgICAgICAgOiAxOworCQl1MzIgQ29udGludWl0eV9lcnJvcl9mbGFnICAgICAgICAgIDogMTsKKwkJdTMyIExMQ19TTkFQX0ZMQUdfc2V0ICAgICAgICAgICAgICA6IDE7CisJCXUzMiBUcmFuc3BvcnRfRXJyb3IgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoyMTsKKwl9IGlycV8yMGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXRfYmxvY2tfMDAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzEwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja18yMDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfMzAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzQwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja181MDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfNjAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzcwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBCbG9ja19yZXNldF9lbmFibGUgICAgICAgICAgICAgOiA4OworCQl1MzIgU3BlY2lhbF9jb250cm9scyAgICAgICAgICAgICAgIDoxNjsKKwl9IHN3X3Jlc2V0XzIxMDsKKworCXN0cnVjdCB7CisJCXUzMiB2dWFydF9vZV9zaWcgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdjJXU19vZV9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGhhbHRfVjhfc2lnICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzZWN0aW9uX3BrZ19lbmFibGVfc2lnICAgICAgICAgOiAxOworCQl1MzIgczJwX3NlbF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHVudXNlZDEgICAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBwb2xhcml0eV9QU19DTEtfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgcG9sYXJpdHlfUFNfVkFMSURfc2lnICAgICAgICAgIDogMTsKKwkJdTMyIHBvbGFyaXR5X1BTX1NZTkNfc2lnICAgICAgICAgICA6IDE7CisJCXUzMiBwb2xhcml0eV9QU19FUlJfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgdW51c2VkMiAgICAgICAgICAgICAgICAgICAgICAgIDoyMDsKKwl9IG1pc2NfMjE0OworCisJc3RydWN0IHsKKwkJdTMyIE1haWxib3hfZnJvbV9WOCAgICAgICAgICAgICAgICA6MzI7CisJfSBtYm94X3Y4X3RvX2hvc3RfMjE4OworCisJc3RydWN0IHsKKwkJdTMyIHN5c3JhbWFjY2Vzc19kYXRhICAgICAgICAgICAgICA6IDg7CisJCXUzMiBzeXNyYW1hY2Nlc3NfYWRkciAgICAgICAgICAgICAgOjE1OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIHN5c3JhbWFjY2Vzc193cml0ZSAgICAgICAgICAgICA6IDE7CisJCXUzMiBzeXNyYW1hY2Nlc3NfYnVzbXVzdGVyICAgICAgICAgOiAxOworCX0gbWJveF9ob3N0X3RvX3Y4XzIxYzsKKworCXN0cnVjdCB7CisJCXUzMiBTdHJlYW0xX1BJRCAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgU3RyZWFtMV90cmFucyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE1BQ19NdWx0aWNhc3RfZmlsdGVyICAgICAgICAgICA6IDE7CisJCXUzMiBkZWJ1Z19mbGFnX3BpZF9zYXZlZCAgICAgICAgICAgOiAxOworCQl1MzIgU3RyZWFtMl9QSUQgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIFN0cmVhbTJfdHJhbnMgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkZWJ1Z19mbGFnX3dyaXRlX3N0YXR1czAwICAgICAgOiAxOworCQl1MzIgZGVidWdfZmlmb19wcm9ibGVtICAgICAgICAgICAgIDogMTsKKwl9IHBpZF9maWx0ZXJfMzAwOworCisJc3RydWN0IHsKKwkJdTMyIFBDUl9QSUQgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBQQ1JfdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZGVidWdfb3ZlcnJ1bjMgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRlYnVnX292ZXJydW4yICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQTVRfUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgUE1UX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJfSBwaWRfZmlsdGVyXzMwNDsKKworCXN0cnVjdCB7CisJCXUzMiBFTU1fUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgRU1NX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9maWx0ZXJfNCAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFTU1fZmlsdGVyXzYgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRUNNX1BJRCAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIEVDTV90cmFucyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCX0gcGlkX2ZpbHRlcl8zMDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgR3JvdXBfUElEICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIEdyb3VwX3RyYW5zICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB1bnVzZWQxICAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgR3JvdXBfbWFzayAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIHVudXNlZDIgICAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzBfNzsKKworCXN0cnVjdCB7CisJCXUzMiBuZXRfbWFzdGVyX3JlYWQgICAgICAgICAgICAgICAgOjE3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMTsKKworCXN0cnVjdCB7CisJCXUzMiBuZXRfbWFzdGVyX3dyaXRlICAgICAgICAgICAgICAgOjE3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMjsKKworCXN0cnVjdCB7CisJCXUzMiBuZXh0X25ldF9tYXN0ZXJfd3JpdGUgICAgICAgICAgOjE3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMzsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQxICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgc3RhdGVfd3JpdGUgICAgICAgICAgICAgICAgICAgIDoxMDsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBzdGFja19yZWFkICAgICAgICAgICAgICAgICAgICAgOjEwOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNDsKKworCXN0cnVjdCB7CisJCXUzMiBzdGFja19jbnQgICAgICAgICAgICAgICAgICAgICAgOjEwOworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoyMjsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNTsKKworCXN0cnVjdCB7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMCAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzEgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWcyICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMyAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzQgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWczMDAgICAgICAgICAgICA6IDI7CisJCXUzMiB3cml0ZV9zdGF0dXMxICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgd3JpdGVfc3RhdHVzNCAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIGRhdGFfc2l6ZV9yZWcgICAgICAgICAgICAgICAgICA6MTI7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF82OworCisJc3RydWN0IHsKKwkJdTMyIGluZGV4X3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBleHRyYV9pbmRleF9yZWcgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgQUJfc2VsZWN0ICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBhc3NfYWxsdGFibGVzICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOjIyOworCX0gaW5kZXhfcmVnXzMxMDsKKworCXN0cnVjdCB7CisJCXUzMiBQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgUElEX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBJRF9lbmFibGVfYml0ICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjE3OworCX0gcGlkX25fcmVnXzMxNDsKKworCXN0cnVjdCB7CisJCXUzMiBBNF9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTVfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEE2X2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBFbmFibGVfYml0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgSGlnaEFCX2JpdCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJfSBtYWNfbG93X3JlZ18zMTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgQTFfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEEyX2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBM19ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IG1hY19oaWdoX3JlZ18zMWM7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoxNjsKKwkJdTMyIGRhdGFfVGFnX0lEICAgICAgICAgICAgICAgICAgICA6MTY7CisJfSBkYXRhX3RhZ180MDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgQ2FyZF9JRGJ5dGU2ICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlNSAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBDYXJkX0lEYnl0ZTQgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQ2FyZF9JRGJ5dGUzICAgICAgICAgICAgICAgICAgIDogODsKKwl9IGNhcmRfaWRfNDA4OworCisJc3RydWN0IHsKKwkJdTMyIENhcmRfSURieXRlMiAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBDYXJkX0lEYnl0ZTEgICAgICAgICAgICAgICAgICAgOiA4OworCX0gY2FyZF9pZF80MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgTUFDMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIE1BQzIgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBNQUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwl9IG1hY19hZGRyZXNzXzQxODsKKworCXN0cnVjdCB7CisJCXUzMiBNQUM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTY7CisJfSBtYWNfYWRkcmVzc180MWM7CisKKwlzdHJ1Y3QgeworCQl1MzIgdHJhbnNtaXR0ZXJfZGF0YV9ieXRlICAgICAgICAgIDogODsKKwkJdTMyIFJlY2VpdmVEYXRhUmVhZHkgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBSZWNlaXZlQnl0ZUZyYW1lRXJyb3IgICAgICAgICAgOiAxOworCQl1MzIgdHhidWZmZW1wdHkgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MjE7CisJfSBjaV82MDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgcGlfZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHBpX2hhICAgICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBwaV9ydyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfY29tcG9uZW50X3JlZyAgICAgICAgICAgICAgIDogMzsKKwl9IHBpXzYwNDsKKworCXN0cnVjdCB7CisJCXUzMiBzZXJpYWxSZXNldCAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgb25jZWN5Y2xlX3JlYWQgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFRpbWVyX1JlYWRfcmVxICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBUaW1lcl9Mb2FkX3JlcSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdGltZXJfZGF0YSAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBUaW1lcl9hZGRyICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIHBjbWNpYV9hX21vZF9wd3JfbiAgICAgICAgICAgICA6IDE7CisJCXUzMiBwY21jaWFfYl9tb2RfcHdyX24gICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX0RvbmVfc3RhdCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19Jbml0X3N0YXQgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfUHJvZ19uICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX3dyX24gICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19jc19uICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfY2NsayAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfQ2lNYXhfSVJRX24gICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBpX3RpbWVvdXRfc3RhdHVzICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV93YWl0X24gICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfYnVzeV9uICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwl9IHBpXzYwODsKKworCXN0cnVjdCB7CisJCXUzMiBQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIga2V5X2VuYWJsZSAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGtleV9jb2RlICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBrZXlfYXJyYXlfY29sICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIga2V5X2FycmF5X3JvdyAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIGR2Yl9lbiAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByd19mbGFnICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwl9IGR2Yl9yZWdfNjBjOworCisJc3RydWN0IHsKKwkJdTMyIHNyYW1fYWRkciAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJCXUzMiBzcmFtX3J3ICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgc3JhbV9kYXRhICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHNjX3hmZXJfYml0ICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgb2VfcGluX3JlZyAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNlX3Bpbl9yZWcgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgc3RhcnRfc3JhbV9pYmkgICAgICAgICAgICAgICAgIDogMTsKKwl9IHNyYW1fY3RybF9yZWdfNzAwOworCisJc3RydWN0IHsKKwkJdTMyIG5ldF9hZGRyX3JlYWQgICAgICAgICAgICAgICAgICA6MTY7CisJCXUzMiBuZXRfYWRkcl93cml0ZSAgICAgICAgICAgICAgICAgOjE2OworCX0gbmV0X2J1Zl9yZWdfNzA0OworCisJc3RydWN0IHsKKwkJdTMyIGNhaV9yZWFkICAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgY2FpX3dyaXRlICAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBjYWlfY250ICAgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gY2FpX2J1Zl9yZWdfNzA4OworCisJc3RydWN0IHsKKwkJdTMyIGNhb19yZWFkICAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgY2FwX3dyaXRlICAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBjYW9fY250ICAgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gY2FvX2J1Zl9yZWdfNzBjOworCisJc3RydWN0IHsKKwkJdTMyIG1lZGlhX3JlYWQgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgbWVkaWFfd3JpdGUgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiBtZWRpYV9jbnQgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gbWVkaWFfYnVmX3JlZ183MTA7CisKKwlzdHJ1Y3QgeworCQl1MzIgTkVUX0Rlc3QgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIENBSV9EZXN0ICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBDQU9fRGVzdCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgTUVESUFfRGVzdCAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIG5ldF9vdmZsb3dfZXJyb3IgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBtZWRpYV9vdmZsb3dfZXJyb3IgICAgICAgICAgICAgOiAxOworCQl1MzIgY2FpX292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNhb19vdmZsb3dfZXJyb3IgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjdHJsX3VzYl93YW4gICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY3RybF9zcmFtZG1hICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGN0cmxfbWF4aW11bWZpbGwgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjE3OworCX0gc3JhbV9kZXN0X3JlZ183MTQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgbmV0X2NudCAgICAgICAgICAgICAgICAgICAgICAgIDoxMjsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiBuZXRfYWRkcl9yZWFkICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIG5ldF9hZGRyX3dyaXRlICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZDMgICAgICAgICAgICAgICAgICAgICAgOjExOworCX0gbmV0X2J1Zl9yZWdfNzE4OworCisJc3RydWN0IHsKKwkJdTMyIHdhbl9zcGVlZF9zaWcgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA2OworCQl1MzIgd2FuX3dhaXRfc3RhdGUgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHNyYW1fY2hpcCAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBzcmFtX21lbW1hcCAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHdhbl9wa3RfZnJhbWUgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiByZXNlcnZlZDMgICAgICAgICAgICAgICAgICAgICAgOiA0OworCX0gd2FuX2N0cmxfcmVnXzcxYzsKK30gZmxleGNvcF9pYmlfdmFsdWU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9za3lzdGFyMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9za3lzdGFyMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2JjNGMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvc2t5c3RhcjIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NDQgKzAsMCBAQAotLyoKLSAqIHNreXN0YXIyLmMgLSBkcml2ZXIgZm9yIHRoZSBUZWNobmlzYXQgU2t5U3RhcjIgUENJIERWQiBjYXJkCi0gKiAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIEZsZXhDb3BJSSBieSBCMkMyLEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFZhZGltIENhdGFuYSwgc2t5c3RhckBtb2xkb3ZhLmNjCi0gKgotICogRklYOiBESVNFUUMgVG9uZSBCdXJzdCBpbiBmbGV4Y29wX2Rpc2VxY19pb2N0bCgpCi0gKiBGSVg6IEZVTEwgc29mdCBEaVNFcUMgZm9yIHNreXN0YXIyIChGbGV4Q29wSUkgcmV2IDEzMCkgVlAzMTAgZXF1aXBwZWQKLSAqICAgICBWaW5jZW56byBEaSBNYXNzYSwgaGF3ay5pdCBhdCB0aXNjYWxpbmV0Lml0Ci0gKgotICogQ29udmVydGVkIHRvIExpbnV4IGNvZGluZyBzdHlsZQotICogTWlzYyByZW9yZ2FuaXphdGlvbiwgcG9saXNoaW5nLCByZXN0eWxpbmcKLSAqICAgICBSb2JlcnRvIFJhZ3VzYSwgc2t5c3RhcjItYzViOCBhdCByb2JlcnRvcmFndXNhIGRvdCBpdAotICoKLSAqIEFkZGVkIGhhcmR3YXJlIGZpbHRlcmluZyBzdXBwb3J0LAotICogICAgIE5pa2xhcyBQZWluZWNrZSwgcGVpbmVja2UgYXQgZ2R2LnVuaS1oYW5ub3Zlci5kZQotICoKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L2R2Yi9kbXguaD4KLSNpbmNsdWRlICJkdmJfZGVtdXguaCIKLSNpbmNsdWRlICJkbXhkZXYuaCIKLSNpbmNsdWRlICJkdmJfZmlsdGVyLmgiCi0jaW5jbHVkZSAiZHZiZGV2LmgiCi0jaW5jbHVkZSAiZGVtdXguaCIKLSNpbmNsdWRlICJkdmJfbmV0LmgiCi0jaW5jbHVkZSAic3R2MDI5OS5oIgotI2luY2x1ZGUgIm10MzUyLmgiCi0jaW5jbHVkZSAibXQzMTIuaCIKLSNpbmNsdWRlICJueHQyMDAyLmgiCi0KLXN0YXRpYyBpbnQgZGVidWc7Ci1zdGF0aWMgaW50IGVuYWJsZV9od19maWx0ZXJzID0gMjsKLQotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDAgPSBkZWZhdWx0LCAxID0gbW9zdCBtZXNzYWdlcywgMiA9IGFsbCBtZXNzYWdlcykuIik7Ci1tb2R1bGVfcGFyYW0oZW5hYmxlX2h3X2ZpbHRlcnMsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9od19maWx0ZXJzLCAiZW5hYmxlIGhhcmR3YXJlIGZpbHRlcnM6IHN1cHBvcnRlZCB2YWx1ZXM6IDAgKG5vbmUpLCAxLCAyIik7Ci0KLSNkZWZpbmUgZHByaW50ayh4Li4uKQlkbyB7IGlmIChkZWJ1Zz49MSkgcHJpbnRrKHgpOyB9IHdoaWxlICgwKQotI2RlZmluZSBkZHByaW50ayh4Li4uKQlkbyB7IGlmIChkZWJ1Zz49MikgcHJpbnRrKHgpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFNJWkVfT0ZfQlVGX0RNQTEJMHgzYWMwMAotI2RlZmluZSBTSVpFX09GX0JVRl9ETUEyCTB4NzU4Ci0KLSNkZWZpbmUgTUFYX05fSFdfRklMVEVSUwkoNiszMikKLSNkZWZpbmUgTl9QSURfU0xPVFMJCTI1NgotCi1zdHJ1Y3QgZG1hcSB7Ci0JdTMyIGJ1c19hZGRyOwotCXUzMiBoZWFkOwotCXUzMiB0YWlsOwotCXUzMiBidWZmZXJfc2l6ZTsKLQl1OCAqYnVmZmVyOwotfTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw5KQotI2RlZmluZSBfX2lvbWVtCi0jZW5kaWYKLQotc3RydWN0IGFkYXB0ZXIgewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCi0JdTggY2FyZF9yZXZpc2lvbjsKLQl1MzIgYjJjMl9yZXZpc2lvbjsKLQl1MzIgcGlkX2ZpbHRlcl9tYXg7Ci0JdTMyIG1hY19maWx0ZXJfbWF4OwotCXUzMiBpcnE7Ci0Jdm9pZCBfX2lvbWVtICppb19tZW07Ci0JdW5zaWduZWQgbG9uZyBpb19wb3J0OwotCXU4IG1hY19hZGRyWzhdOwotCXUzMiBkd19zcmFtX3R5cGU7Ci0KLQlzdHJ1Y3QgZHZiX2FkYXB0ZXIgZHZiX2FkYXB0ZXI7Ci0Jc3RydWN0IGR2Yl9kZW11eCBkZW11eDsKLQlzdHJ1Y3QgZG14ZGV2IGRteGRldjsKLQlzdHJ1Y3QgZG14X2Zyb250ZW5kIGh3X2Zyb250ZW5kOwotCXN0cnVjdCBkbXhfZnJvbnRlbmQgbWVtX2Zyb250ZW5kOwotCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcDsKLQlzdHJ1Y3QgZHZiX25ldCBkdmJuZXQ7Ci0KLQlzdHJ1Y3Qgc2VtYXBob3JlIGkyY19zZW07Ci0KLQlzdHJ1Y3QgZG1hcSBkbWFxMTsKLQlzdHJ1Y3QgZG1hcSBkbWFxMjsKLQotCXUzMiBkbWFfY3RybDsKLQl1MzIgZG1hX3N0YXR1czsKLQotCWludCBjYXB0dXJpbmc7Ci0KLQlzcGlubG9ja190IGxvY2s7Ci0KLQlpbnQgdXNlYWJsZV9od19maWx0ZXJzOwotCXUxNiBod19waWRzW01BWF9OX0hXX0ZJTFRFUlNdOwotCXUxNiBwaWRfbGlzdFtOX1BJRF9TTE9UU107Ci0JaW50IHBpZF9yY1tOX1BJRF9TTE9UU107CS8vIHJlZiBjb3VudGVycyBmb3IgdGhlIHBpZHMKLQlpbnQgcGlkX2NvdW50OwotCWludCB3aG9sZV9iYW5kd2lkdGhfY291bnQ7Ci0JdTMyIG1hY19maWx0ZXI7Ci0KLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZTsKLQlpbnQgKCpmZV9zbGVlcCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotfTsKLQotI2RlZmluZSB3cml0ZV9yZWdfZHcoYWRhcHRlcixyZWcsdmFsdWUpIHdyaXRlbCh2YWx1ZSwgYWRhcHRlci0+aW9fbWVtICsgcmVnKQotI2RlZmluZSByZWFkX3JlZ19kdyhhZGFwdGVyLHJlZykgcmVhZGwoYWRhcHRlci0+aW9fbWVtICsgcmVnKQotCi1zdGF0aWMgdm9pZCB3cml0ZV9yZWdfYml0ZmllbGQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiByZWcsIHUzMiB6ZXJvbWFzaywgdTMyIG9ydmFsdWUpCi17Ci0JdTMyIHRtcDsKLQotCXRtcCA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIHJlZyk7Ci0JdG1wID0gKHRtcCAmIH56ZXJvbWFzaykgfCBvcnZhbHVlOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCByZWcsIHRtcCk7Ci19Ci0KLS8qIGkyYyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgaTJjX21haW5fd3JpdGVfZm9yX2ZsZXgyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgY29tbWFuZCwgdTggKmJ1ZiwgaW50IHJldHJpZXMpCi17Ci0JaW50IGk7Ci0JdTMyIHZhbHVlOwotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MTAwLCAwKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgxMDAsIGNvbW1hbmQpOwotCi0JZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykgewotCQl2YWx1ZSA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MTAwKTsKLQotCQlpZiAoKHZhbHVlICYgMHg0MDAwMDAwMCkgPT0gMCkgewotCQkJaWYgKCh2YWx1ZSAmIDB4ODEwMDAwMDApID09IDB4ODAwMDAwMDApIHsKLQkJCQlpZiAoYnVmICE9IDApCi0JCQkJCSpidWYgPSAodmFsdWUgPj4gMHgxMCkgJiAweGZmOwotCi0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgxMDAsIDApOwotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MTAwLCBjb21tYW5kKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBkZXZpY2UgPSAweDEwMDAwMDAwIGZvciB0dW5lciwgMHgyMDAwMDAwMCBmb3IgZWVwcm9tICovCi1zdGF0aWMgdm9pZCBpMmNfbWFpbl9zZXR1cCh1MzIgZGV2aWNlLCB1MzIgY2hpcF9hZGRyLCB1OCBvcCwgdTggYWRkciwgdTMyIHZhbHVlLCB1MzIgbGVuLCB1MzIgKmNvbW1hbmQpCi17Ci0JKmNvbW1hbmQgPSBkZXZpY2UgfCAoKGxlbiAtIDEpIDw8IDI2KSB8ICh2YWx1ZSA8PCAxNikgfCAoYWRkciA8PCA4KSB8IGNoaXBfYWRkcjsKLQotCWlmIChvcCAhPSAwKQotCQkqY29tbWFuZCA9ICpjb21tYW5kIHwgMHgwMzAwMDAwMDsKLQllbHNlCi0JCSpjb21tYW5kID0gKmNvbW1hbmQgfCAweDAxMDAwMDAwOwotfQotCi1zdGF0aWMgaW50IGZsZXhfaTJjX3JlYWQ0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZGV2aWNlLCB1MzIgY2hpcF9hZGRyLCB1MTYgYWRkciwgdTggKmJ1ZiwgdTggbGVuKQotewotCXUzMiBjb21tYW5kOwotCXUzMiB2YWx1ZTsKLQotCWludCByZXN1bHQsIGk7Ci0KLQlpMmNfbWFpbl9zZXR1cChkZXZpY2UsIGNoaXBfYWRkciwgMSwgYWRkciwgMCwgbGVuLCAmY29tbWFuZCk7Ci0KLQlyZXN1bHQgPSBpMmNfbWFpbl93cml0ZV9mb3JfZmxleDIoYWRhcHRlciwgY29tbWFuZCwgYnVmLCAxMDAwMDApOwotCi0JaWYgKChyZXN1bHQgJiAweGZmKSAhPSAwKSB7Ci0JCWlmIChsZW4gPiAxKSB7Ci0JCQl2YWx1ZSA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MTA0KTsKLQotCQkJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJYnVmW2ldID0gdmFsdWUgJiAweGZmOwotCQkJCXZhbHVlID0gdmFsdWUgPj4gODsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgZmxleF9pMmNfd3JpdGU0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZGV2aWNlLCB1MzIgY2hpcF9hZGRyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTggbGVuKQotewotCXUzMiBjb21tYW5kOwotCXUzMiB2YWx1ZTsKLQlpbnQgaTsKLQotCWlmIChsZW4gPiAxKSB7Ci0JCXZhbHVlID0gMDsKLQotCQlmb3IgKGkgPSBsZW47IGkgPiAxOyBpLS0pIHsKLQkJCXZhbHVlID0gdmFsdWUgPDwgODsKLQkJCXZhbHVlID0gdmFsdWUgfCBidWZbaSAtIDFdOwotCQl9Ci0KLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MTA0LCB2YWx1ZSk7Ci0JfQotCi0JaTJjX21haW5fc2V0dXAoZGV2aWNlLCBjaGlwX2FkZHIsIDAsIGFkZHIsIGJ1ZlswXSwgbGVuLCAmY29tbWFuZCk7Ci0KLQlyZXR1cm4gaTJjX21haW5fd3JpdGVfZm9yX2ZsZXgyKGFkYXB0ZXIsIGNvbW1hbmQsIE5VTEwsIDEwMDAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpeGNoaXBhZGRyKHUzMiBkZXZpY2UsIHUzMiBidXMsIHUzMiBhZGRyLCB1MzIgKnJldCkKLXsKLQlpZiAoZGV2aWNlID09IDB4MjAwMDAwMDApCi0JCSpyZXQgPSBidXMgfCAoKGFkZHIgPj4gOCkgJiAzKTsKLQllbHNlCi0JCSpyZXQgPSBidXM7Ci19Ci0KLXN0YXRpYyB1MzIgZmxleF9pMmNfcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGRldmljZSwgdTMyIGJ1cywgdTMyIGFkZHIsIHU4ICpidWYsIHUzMiBsZW4pCi17Ci0JdTMyIGNoaXBhZGRyOwotCXUzMiBieXRlc190b190cmFuc2ZlcjsKLQl1OCAqc3RhcnQ7Ci0KLQlkZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0Jc3RhcnQgPSBidWY7Ci0KLQl3aGlsZSAobGVuICE9IDApIHsKLQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBsZW47Ci0KLQkJaWYgKGJ5dGVzX3RvX3RyYW5zZmVyID4gNCkKLQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gNDsKLQotCQlmaXhjaGlwYWRkcihkZXZpY2UsIGJ1cywgYWRkciwgJmNoaXBhZGRyKTsKLQotCQlpZiAoZmxleF9pMmNfcmVhZDQoYWRhcHRlciwgZGV2aWNlLCBjaGlwYWRkciwgYWRkciwgYnVmLCBieXRlc190b190cmFuc2ZlcikgPT0gMCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQotCQlidWYgPSBidWYgKyBieXRlc190b190cmFuc2ZlcjsKLQkJYWRkciA9IGFkZHIgKyBieXRlc190b190cmFuc2ZlcjsKLQkJbGVuID0gbGVuIC0gYnl0ZXNfdG9fdHJhbnNmZXI7Ci0JfTsKLQotCXJldHVybiBidWYgLSBzdGFydDsKLX0KLQotc3RhdGljIHUzMiBmbGV4X2kyY193cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGRldmljZSwgdTMyIGJ1cywgdTMyIGFkZHIsIHU4ICpidWYsIHUzMiBsZW4pCi17Ci0JdTMyIGNoaXBhZGRyOwotCXUzMiBieXRlc190b190cmFuc2ZlcjsKLQl1OCAqc3RhcnQ7Ci0KLQlkZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0Jc3RhcnQgPSBidWY7Ci0KLQl3aGlsZSAobGVuICE9IDApIHsKLQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBsZW47Ci0KLQkJaWYgKGJ5dGVzX3RvX3RyYW5zZmVyID4gNCkKLQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gNDsKLQotCQlmaXhjaGlwYWRkcihkZXZpY2UsIGJ1cywgYWRkciwgJmNoaXBhZGRyKTsKLQotCQlpZiAoZmxleF9pMmNfd3JpdGU0KGFkYXB0ZXIsIGRldmljZSwgY2hpcGFkZHIsIGFkZHIsIGJ1ZiwgYnl0ZXNfdG9fdHJhbnNmZXIpID09IDApCi0JCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0KLQkJYnVmID0gYnVmICsgYnl0ZXNfdG9fdHJhbnNmZXI7Ci0JCWFkZHIgPSBhZGRyICsgYnl0ZXNfdG9fdHJhbnNmZXI7Ci0JCWxlbiA9IGxlbiAtIGJ5dGVzX3RvX3RyYW5zZmVyOwotCX0KLQotCXJldHVybiBidWYgLSBzdGFydDsKLX0KLQotc3RhdGljIGludCBtYXN0ZXJfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGFkYXB0ZXIsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQotewotCXN0cnVjdCBhZGFwdGVyICp0bXAgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOwotCWludCBpLCByZXQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdG1wLT5pMmNfc2VtKSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCWRkcHJpbnRrKCIlczogJWQgbWVzc2FnZXMgdG8gdHJhbnNmZXJcbiIsIF9fRlVOQ1RJT05fXywgbnVtKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJZGRwcmludGsoIm1lc3NhZ2UgJWQ6IGZsYWdzPTB4JXgsIGFkZHI9MHgleCwgYnVmPTB4JXgsIGxlbj0lZCBcbiIsIGksCi0JCQkgbXNnc1tpXS5mbGFncywgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmJ1ZlswXSwgbXNnc1tpXS5sZW4pOwotCX0KLQotCS8vIHJlYWQgY29tbWFuZAotCWlmICgobnVtID09IDIpICYmIChtc2dzWzBdLmZsYWdzID09IDApICYmIChtc2dzWzFdLmZsYWdzID09IEkyQ19NX1JEKSAmJiAobXNnc1swXS5idWYgIT0gTlVMTCkgJiYgKG1zZ3NbMV0uYnVmICE9IE5VTEwpKSB7Ci0KLQkJcmV0ID0gZmxleF9pMmNfcmVhZCh0bXAsIDB4MTAwMDAwMDAsIG1zZ3NbMF0uYWRkciwgbXNnc1swXS5idWZbMF0sIG1zZ3NbMV0uYnVmLCBtc2dzWzFdLmxlbik7Ci0KLQkJdXAoJnRtcC0+aTJjX3NlbSk7Ci0KLQkJaWYgKHJldCAhPSBtc2dzWzFdLmxlbikgewotCQkJZHByaW50aygiJXM6IHJlYWQgZXJyb3IgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJCWRwcmludGsoIm1lc3NhZ2UgJWQ6IGZsYWdzPTB4JXgsIGFkZHI9MHgleCwgYnVmPTB4JXgsIGxlbj0lZCBcbiIsIGksCi0JCQkJICAgICAgIG1zZ3NbaV0uZmxhZ3MsIG1zZ3NbaV0uYWRkciwgbXNnc1tpXS5idWZbMF0sIG1zZ3NbaV0ubGVuKTsKLQkJfQotCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQkJfQotCi0JCXJldHVybiBudW07Ci0JfQotCS8vIHdyaXRlIGNvbW1hbmQKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQotCQlpZiAoKG1zZ3NbaV0uZmxhZ3MgIT0gMCkgfHwgKG1zZ3NbaV0uYnVmID09IE5VTEwpIHx8IChtc2dzW2ldLmxlbiA8IDIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcmV0ID0gZmxleF9pMmNfd3JpdGUodG1wLCAweDEwMDAwMDAwLCBtc2dzW2ldLmFkZHIsIG1zZ3NbaV0uYnVmWzBdLCAmbXNnc1tpXS5idWZbMV0sIG1zZ3NbaV0ubGVuIC0gMSk7Ci0KLQkJdXAoJnRtcC0+aTJjX3NlbSk7Ci0KLQkJaWYgKHJldCAhPSBtc2dzWzBdLmxlbiAtIDEpIHsKLQkJCWRwcmludGsoIiVzOiB3cml0ZSBlcnJvciAlaSAhXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0KLQkJCWRwcmludGsoIm1lc3NhZ2UgJWQ6IGZsYWdzPTB4JXgsIGFkZHI9MHgleCwgYnVmWzBdPTB4JXgsIGxlbj0lZCBcbiIsIGksCi0JCQkgICAgICAgbXNnc1tpXS5mbGFncywgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmJ1ZlswXSwgbXNnc1tpXS5sZW4pOwotCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQkJfQotCi0JCXJldHVybiBudW07Ci0JfQotCi0JcHJpbnRrKCIlczogdW5rbm93biBjb21tYW5kIGZvcm1hdCAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qIFNSQU0gKFNreXN0YXIyIHJldjIuMyBoYXMgb25lICJJU1NJIElTNjFMVjI1NiIgY2hpcCBvbiBib2FyZCwKLSAgIGJ1dCBpdCBzZWVtcyB0aGF0IEZsZXhDb3BJSSBjYW4gd29yayB3aXRoIG1vcmUgdGhhbiBvbmUgY2hpcCkgKi8KLXN0YXRpYyB2b2lkIHNyYW1fc2V0X25ldF9kZXN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBkZXN0KQotewotCXUzMiB0bXA7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQl0bXAgPSAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MTQpICYgMHhmZmZmZmZmYykgfCAoZGVzdCAmIDMpOwotCi0JdWRlbGF5KDEwMDApOwotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0LCB0bXApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxNCwgdG1wKTsKLQotCXVkZWxheSgxMDAwKTsKLQotCS8qIHJldHVybiB2YWx1ZSBpcyBuZXZlciB1c2VkPyAqLwotLyoJcmV0dXJuIHRtcDsgKi8KLX0KLQotc3RhdGljIHZvaWQgc3JhbV9zZXRfY2FpX2Rlc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4IGRlc3QpCi17Ci0JdTMyIHRtcDsKLQotCXVkZWxheSgxMDAwKTsKLQotCXRtcCA9IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxNCkgJiAweGZmZmZmZmYzKSB8ICgoZGVzdCAmIDMpIDw8IDIpOwotCi0JdWRlbGF5KDEwMDApOwotCXVkZWxheSgxMDAwKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxNCwgdG1wKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiByZXR1cm4gdmFsdWUgaXMgbmV2ZXIgdXNlZD8gKi8KLS8qCXJldHVybiB0bXA7ICovCi19Ci0KLXN0YXRpYyB2b2lkIHNyYW1fc2V0X2Nhb19kZXN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBkZXN0KQotewotCXUzMiB0bXA7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQl0bXAgPSAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MTQpICYgMHhmZmZmZmZjZikgfCAoKGRlc3QgJiAzKSA8PCA0KTsKLQotCXVkZWxheSgxMDAwKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0LCB0bXApOwotCi0JdWRlbGF5KDEwMDApOwotCi0JLyogcmV0dXJuIHZhbHVlIGlzIG5ldmVyIHVzZWQ/ICovCi0vKglyZXR1cm4gdG1wOyAqLwotfQotCi1zdGF0aWMgdm9pZCBzcmFtX3NldF9tZWRpYV9kZXN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBkZXN0KQotewotCXUzMiB0bXA7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQl0bXAgPSAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MTQpICYgMHhmZmZmZmYzZikgfCAoKGRlc3QgJiAzKSA8PCA2KTsKLQotCXVkZWxheSgxMDAwKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0LCB0bXApOwotCi0JdWRlbGF5KDEwMDApOwotCi0JLyogcmV0dXJuIHZhbHVlIGlzIG5ldmVyIHVzZWQ/ICovCi0vKglyZXR1cm4gdG1wOyAqLwotfQotCi0vKiBTUkFNIG1lbW9yeSBpcyBhY2Nlc3NlZCB0aHJvdWdoIGEgYnVmZmVyIHJlZ2lzdGVyIGluIHRoZSBGbGV4Q29wCi0gICBjaGlwICgweDcwMCkuIFRoaXMgcmVnaXN0ZXIgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgIGJpdHMgMC0xNCAgOiBhZGRyZXNzCi0gICAgYml0ICAxNSAgICA6IHJlYWQvd3JpdGUgZmxhZwotICAgIGJpdHMgMTYtMjMgOiA4LWJpdCB3b3JkIHRvIHdyaXRlCi0gICAgYml0cyAyNC0yNyA6ID0gNAotICAgIGJpdHMgMjgtMjkgOiBtZW1vcnkgYmFuayBzZWxlY3RvcgotICAgIGJpdCAgMzEgICAgOiBidXN5IGZsYWcKLSovCi1zdGF0aWMgdm9pZCBmbGV4X3NyYW1fd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBiYW5rLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQlpbnQgaSwgcmV0cmllczsKLQl1MzIgY29tbWFuZDsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQljb21tYW5kID0gYmFuayB8IGFkZHIgfCAweDA0MDAwMDAwIHwgKCpidWYgPDwgMHgxMCk7Ci0KLQkJcmV0cmllcyA9IDI7Ci0KLQkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgewotCQkJbWRlbGF5KDEpOwotCQkJcmV0cmllcy0tOwotCQl9OwotCi0JCWlmIChyZXRyaWVzID09IDApCi0JCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzAwLCBjb21tYW5kKTsKLQotCQlidWYrKzsKLQkJYWRkcisrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZmxleF9zcmFtX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBiYW5rLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQlpbnQgaSwgcmV0cmllczsKLQl1MzIgY29tbWFuZCwgdmFsdWU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJY29tbWFuZCA9IGJhbmsgfCBhZGRyIHwgMHgwNDAwODAwMDsKLQotCQlyZXRyaWVzID0gMTAwMDA7Ci0KLQkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgewotCQkJbWRlbGF5KDEpOwotCQkJcmV0cmllcy0tOwotCQl9OwotCi0JCWlmIChyZXRyaWVzID09IDApCi0JCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzAwLCBjb21tYW5kKTsKLQotCQlyZXRyaWVzID0gMTAwMDA7Ci0KLQkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgewotCQkJbWRlbGF5KDEpOwotCQkJcmV0cmllcy0tOwotCQl9OwotCi0JCWlmIChyZXRyaWVzID09IDApCi0JCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJdmFsdWUgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcwMCkgPj4gMHgxMDsKLQotCQkqYnVmID0gKHZhbHVlICYgMHhmZik7Ci0KLQkJYWRkcisrOwotCQlidWYrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNyYW1fd3JpdGVfY2h1bmsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1OCAqYnVmLCB1MTYgbGVuKQotewotCXUzMiBiYW5rOwotCi0JYmFuayA9IDA7Ci0KLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MjAwMDApIHsKLQkJYmFuayA9IChhZGRyICYgMHgxODAwMCkgPDwgMHgwZDsKLQl9Ci0KLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MDAwMDApIHsKLQkJaWYgKChhZGRyID4+IDB4MGYpID09IDApCi0JCQliYW5rID0gMHgyMDAwMDAwMDsKLQkJZWxzZQotCQkJYmFuayA9IDB4MTAwMDAwMDA7Ci0JfQotCi0JZmxleF9zcmFtX3dyaXRlKGFkYXB0ZXIsIGJhbmssIGFkZHIgJiAweDdmZmYsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgc3JhbV9yZWFkX2NodW5rKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbikKLXsKLQl1MzIgYmFuazsKLQotCWJhbmsgPSAwOwotCi0JaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDIwMDAwKSB7Ci0JCWJhbmsgPSAoYWRkciAmIDB4MTgwMDApIDw8IDB4MGQ7Ci0JfQotCi0JaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDAwMDAwKSB7Ci0JCWlmICgoYWRkciA+PiAweDBmKSA9PSAwKQotCQkJYmFuayA9IDB4MjAwMDAwMDA7Ci0JCWVsc2UKLQkJCWJhbmsgPSAweDEwMDAwMDAwOwotCX0KLQotCWZsZXhfc3JhbV9yZWFkKGFkYXB0ZXIsIGJhbmssIGFkZHIgJiAweDdmZmYsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgc3JhbV9yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQl1MzIgbGVuZ3RoOwotCi0Jd2hpbGUgKGxlbiAhPSAwKSB7Ci0JCWxlbmd0aCA9IGxlbjsKLQotCQkvLyBjaGVjayBpZiB0aGUgYWRkcmVzcyByYW5nZSBiZWxvbmdzIHRvIHRoZSBzYW1lIAotCQkvLyAzMksgbWVtb3J5IGNoaXAuIElmIG5vdCwgdGhlIGRhdGEgaXMgcmVhZCBmcm9tIAotCQkvLyBvbmUgY2hpcCBhdCBhIHRpbWUuCi0JCWlmICgoYWRkciA+PiAweDBmKSAhPSAoKGFkZHIgKyBsZW4gLSAxKSA+PiAweDBmKSkgewotCQkJbGVuZ3RoID0gKCgoYWRkciA+PiAweDBmKSArIDEpIDw8IDB4MGYpIC0gYWRkcjsKLQkJfQotCi0JCXNyYW1fcmVhZF9jaHVuayhhZGFwdGVyLCBhZGRyLCBidWYsIGxlbmd0aCk7Ci0KLQkJYWRkciA9IGFkZHIgKyBsZW5ndGg7Ci0JCWJ1ZiA9IGJ1ZiArIGxlbmd0aDsKLQkJbGVuID0gbGVuIC0gbGVuZ3RoOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3JhbV93cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHU4ICpidWYsIHUzMiBsZW4pCi17Ci0JdTMyIGxlbmd0aDsKLQotCXdoaWxlIChsZW4gIT0gMCkgewotCQlsZW5ndGggPSBsZW47Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGFkZHJlc3MgcmFuZ2UgYmVsb25ncyB0byB0aGUgc2FtZSAKLQkJLy8gMzJLIG1lbW9yeSBjaGlwLiBJZiBub3QsIHRoZSBkYXRhIGlzIHdyaXR0ZW4gdG8KLQkJLy8gb25lIGNoaXAgYXQgYSB0aW1lLgotCQlpZiAoKGFkZHIgPj4gMHgwZikgIT0gKChhZGRyICsgbGVuIC0gMSkgPj4gMHgwZikpIHsKLQkJCWxlbmd0aCA9ICgoKGFkZHIgPj4gMHgwZikgKyAxKSA8PCAweDBmKSAtIGFkZHI7Ci0JCX0KLQotCQlzcmFtX3dyaXRlX2NodW5rKGFkYXB0ZXIsIGFkZHIsIGJ1ZiwgbGVuZ3RoKTsKLQotCQlhZGRyID0gYWRkciArIGxlbmd0aDsKLQkJYnVmID0gYnVmICsgbGVuZ3RoOwotCQlsZW4gPSBsZW4gLSBsZW5ndGg7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzcmFtX3NldF9zaXplKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzaykKLXsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MWMsIChtYXNrIHwgKH4weDMwMDAwICYgcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpKSkpOwotfQotCi1zdGF0aWMgdm9pZCBzcmFtX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdTMyIHRtcDsKLQotCXRtcCA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgMSk7Ci0KLQlpZiAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpICE9IDApIHsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjLCB0bXApOwotCi0JCWFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9IHRtcCAmIDB4MzAwMDA7Ci0KLQkJZGRwcmludGsoIiVzOiBkd19zcmFtX3R5cGUgPSAleFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kd19zcmFtX3R5cGUpOwotCi0JfSBlbHNlIHsKLQotCQlhZGFwdGVyLT5kd19zcmFtX3R5cGUgPSAweDEwMDAwOwotCi0JCWRkcHJpbnRrKCIlczogZHdfc3JhbV90eXBlID0gJXhcbiIsIF9fRlVOQ1RJT05fXywgYWRhcHRlci0+ZHdfc3JhbV90eXBlKTsKLQl9Ci0KLQkvKiByZXR1cm4gdmFsdWUgaXMgbmV2ZXIgdXNlZD8gKi8KLS8qCXJldHVybiBhZGFwdGVyLT5kd19zcmFtX3R5cGU7ICovCi19Ci0KLXN0YXRpYyBpbnQgc3JhbV90ZXN0X2xvY2F0aW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzaywgdTMyIGFkZHIpCi17Ci0JdTggdG1wMSwgdG1wMjsKLQotCWRwcmludGsoIiVzOiBtYXNrID0gJXgsIGFkZHIgPSAleFxuIiwgX19GVU5DVElPTl9fLCBtYXNrLCBhZGRyKTsKLQotCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgbWFzayk7Ci0Jc3JhbV9pbml0KGFkYXB0ZXIpOwotCi0JdG1wMiA9IDB4YTU7Ci0JdG1wMSA9IDB4NGY7Ci0KLQlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIsICZ0bXAyLCAxKTsKLQlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIgKyA0LCAmdG1wMSwgMSk7Ci0KLQl0bXAyID0gMDsKLQotCW1kZWxheSgyMCk7Ci0KLQlzcmFtX3JlYWQoYWRhcHRlciwgYWRkciwgJnRtcDIsIDEpOwotCXNyYW1fcmVhZChhZGFwdGVyLCBhZGRyLCAmdG1wMiwgMSk7Ci0KLQlkcHJpbnRrKCIlczogd3JvdGUgMHhhNSwgcmVhZCAweCUyeFxuIiwgX19GVU5DVElPTl9fLCB0bXAyKTsKLQotCWlmICh0bXAyICE9IDB4YTUpCi0JCXJldHVybiAwOwotCi0JdG1wMiA9IDB4NWE7Ci0JdG1wMSA9IDB4ZjQ7Ci0KLQlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIsICZ0bXAyLCAxKTsKLQlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIgKyA0LCAmdG1wMSwgMSk7Ci0KLQl0bXAyID0gMDsKLQotCW1kZWxheSgyMCk7Ci0KLQlzcmFtX3JlYWQoYWRhcHRlciwgYWRkciwgJnRtcDIsIDEpOwotCXNyYW1fcmVhZChhZGFwdGVyLCBhZGRyLCAmdG1wMiwgMSk7Ci0KLQlkcHJpbnRrKCIlczogd3JvdGUgMHg1YSwgcmVhZCAweCUyeFxuIiwgX19GVU5DVElPTl9fLCB0bXAyKTsKLQotCWlmICh0bXAyICE9IDB4NWEpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1MzIgc3JhbV9sZW5ndGgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDEwMDAwKQotCQlyZXR1cm4gMzI3Njg7CS8vICAzMksKLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MDAwMDApCi0JCXJldHVybiA2NTUzNjsJLy8gIDY0SyAgICAgICAgCi0JaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDIwMDAwKQotCQlyZXR1cm4gMTMxMDcyOwkvLyAxMjhLCi0KLQlyZXR1cm4gMzI3Njg7CQkvLyAzMksKLX0KLQotLyogRmxleGNvcElJIGNhbiB3b3JrIHdpdGggMzJLLCA2NEsgb3IgMTI4SyBvZiBleHRlcm5hbCBTUkFNIG1lbW9yeS4KLSAgICAtIGZvciAxMjhLIHRoZXJlIGFyZSA0eDMySyBjaGlwcyBhdCBiYW5rIDAsMSwyLDMuCi0gICAgLSBmb3IgIDY0SyB0aGVyZSBhcmUgMngzMksgY2hpcHMgYXQgYmFuayAxLDIuCi0gICAgLSBmb3IgIDMySyB0aGVyZSBpcyBvbmUgMzJLIGNoaXAgYXQgYmFuayAwLgotCi0gICBGbGV4Q29wIHdvcmtzIG9ubHkgd2l0aCBvbmUgYmFuayBhdCBhIHRpbWUuIFRoZSBiYW5rIGlzIHNlbGVjdGVkCi0gICBieSBiaXRzIDI4LTI5IG9mIHRoZSAweDcwMCByZWdpc3Rlci4KLSAgCi0gICBiYW5rIDAgY292ZXJzIGFkZHJlc3NlcyAweDAwMDAwLTB4MDdmZmYKLSAgIGJhbmsgMSBjb3ZlcnMgYWRkcmVzc2VzIDB4MDgwMDAtMHgwZmZmZgotICAgYmFuayAyIGNvdmVycyBhZGRyZXNzZXMgMHgxMDAwMC0weDE3ZmZmCi0gICBiYW5rIDMgY292ZXJzIGFkZHJlc3NlcyAweDE4MDAwLTB4MWZmZmYKLSovCi1zdGF0aWMgaW50IHNyYW1fZGV0ZWN0X2Zvcl9mbGV4MihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1MzIgdG1wLCB0bXAyLCB0bXAzOwotCi0JZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JdG1wID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgyMDgpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgMCk7Ci0KLQl0bXAyID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpOwotCi0JZHByaW50aygiJXM6IHRtcDIgPSAleFxuIiwgX19GVU5DVElPTl9fLCB0bXAyKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgMSk7Ci0KLQl0bXAzID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpOwotCi0JZHByaW50aygiJXM6IHRtcDMgPSAleFxuIiwgX19GVU5DVElPTl9fLCB0bXAzKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgdG1wMik7Ci0KLQkvLyBjaGVjayBmb3IgaW50ZXJuYWwgU1JBTSA/Pz8KLQl0bXAzLS07Ci0JaWYgKHRtcDMgIT0gMCkgewotCQlzcmFtX3NldF9zaXplKGFkYXB0ZXIsIDB4MTAwMDApOwotCQlzcmFtX2luaXQoYWRhcHRlcik7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdG1wKTsKLQotCQlkcHJpbnRrKCIlczogc3JhbSBzaXplID0gMzJLXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCXJldHVybiAzMjsKLQl9Ci0KLQlpZiAoc3JhbV90ZXN0X2xvY2F0aW9uKGFkYXB0ZXIsIDB4MjAwMDAsIDB4MTgwMDApICE9IDApIHsKLQkJc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCAweDIwMDAwKTsKLQkJc3JhbV9pbml0KGFkYXB0ZXIpOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHRtcCk7Ci0KLQkJZHByaW50aygiJXM6IHNyYW0gc2l6ZSA9IDEyOEtcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJcmV0dXJuIDEyODsKLQl9Ci0KLQlpZiAoc3JhbV90ZXN0X2xvY2F0aW9uKGFkYXB0ZXIsIDB4MDAwMDAsIDB4MTAwMDApICE9IDApIHsKLQkJc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCAweDAwMDAwKTsKLQkJc3JhbV9pbml0KGFkYXB0ZXIpOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHRtcCk7Ci0KLQkJZHByaW50aygiJXM6IHNyYW0gc2l6ZSA9IDY0S1xuIiwgX19GVU5DVElPTl9fKTsKLQotCQlyZXR1cm4gNjQ7Ci0JfQotCi0JaWYgKHNyYW1fdGVzdF9sb2NhdGlvbihhZGFwdGVyLCAweDEwMDAwLCAweDAwMDAwKSAhPSAwKSB7Ci0JCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgMHgxMDAwMCk7Ci0JCXNyYW1faW5pdChhZGFwdGVyKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjA4LCB0bXApOwotCi0JCWRwcmludGsoIiVzOiBzcmFtIHNpemUgPSAzMktcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJcmV0dXJuIDMyOwotCX0KLQotCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgMHgxMDAwMCk7Ci0Jc3JhbV9pbml0KGFkYXB0ZXIpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdG1wKTsKLQotCWRwcmludGsoIiVzOiBTUkFNIGRldGVjdGlvbiBmYWlsZWQuIFNldCB0byAzMksgXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNsbF9kZXRlY3Rfc3JhbV9zaXplKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXNyYW1fZGV0ZWN0X2Zvcl9mbGV4MihhZGFwdGVyKTsKLX0KLQotLyogRUVQUk9NIChTa3lzdGFyMiBoYXMgb25lICIyNExDMDhCIiBjaGlwIG9uIGJvYXJkKSAqLwotLyoKLXN0YXRpYyBpbnQgZWVwcm9tX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbikKLXsKLQlyZXR1cm4gZmxleF9pMmNfd3JpdGUoYWRhcHRlciwgMHgyMDAwMDAwMCwgMHg1MCwgYWRkciwgYnVmLCBsZW4pOwotfQotKi8KLQotc3RhdGljIGludCBlZXByb21fcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IGFkZHIsIHU4ICpidWYsIHUxNiBsZW4pCi17Ci0JcmV0dXJuIGZsZXhfaTJjX3JlYWQoYWRhcHRlciwgMHgyMDAwMDAwMCwgMHg1MCwgYWRkciwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgdTggY2FsY19scmModTggKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQl1OCBzdW07Ci0KLQlzdW0gPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlzdW0gPSBzdW0gXiBidWZbaV07Ci0KLQlyZXR1cm4gc3VtOwotfQotCi1zdGF0aWMgaW50IGVlcHJvbV9scmNfcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBsZW4sIHU4ICpidWYsIGludCByZXRyaWVzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykgewotCQlpZiAoZWVwcm9tX3JlYWQoYWRhcHRlciwgYWRkciwgYnVmLCBsZW4pID09IGxlbikgewotCQkJaWYgKGNhbGNfbHJjKGJ1ZiwgbGVuIC0gMSkgPT0gYnVmW2xlbiAtIDFdKQotCQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi1zdGF0aWMgaW50IGVlcHJvbV9scmNfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgbGVuLCB1OCAqd2J1ZiwgdTggKnJidWYsIGludCByZXRyaWVzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykgewotCQlpZiAoZWVwcm9tX3dyaXRlKGFkYXB0ZXIsIGFkZHIsIHdidWYsIGxlbikgPT0gbGVuKSB7Ci0JCQlpZiAoZWVwcm9tX2xyY19yZWFkKGFkYXB0ZXIsIGFkZHIsIGxlbiwgcmJ1ZiwgcmV0cmllcykgPT0gMSkKLQkJCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotKi8KLQotCi0vKiBUaGVzZSBmdW5jdGlvbnMgY291bGQgYmUgdXNlZCB0byB1bmxvY2sgU2t5U3RhcjIgY2FyZHMuICovCi0KLS8qCi1zdGF0aWMgaW50IGVlcHJvbV93cml0ZUtleShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKmtleSwgdTMyIGxlbikKLXsKLQl1OCByYnVmWzIwXTsKLQl1OCB3YnVmWzIwXTsKLQotCWlmIChsZW4gIT0gMTYpCi0JCXJldHVybiAwOwotCi0JbWVtY3B5KHdidWYsIGtleSwgbGVuKTsKLQotCXdidWZbMTZdID0gMDsKLQl3YnVmWzE3XSA9IDA7Ci0Jd2J1ZlsxOF0gPSAwOwotCXdidWZbMTldID0gY2FsY19scmMod2J1ZiwgMTkpOwotCi0JcmV0dXJuIGVlcHJvbV9scmNfd3JpdGUoYWRhcHRlciwgMHgzZTQsIDIwLCB3YnVmLCByYnVmLCA0KTsKLX0KLQotc3RhdGljIGludCBlZXByb21fcmVhZEtleShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKmtleSwgdTMyIGxlbikKLXsKLQl1OCBidWZbMjBdOwotCi0JaWYgKGxlbiAhPSAxNikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZWVwcm9tX2xyY19yZWFkKGFkYXB0ZXIsIDB4M2U0LCAyMCwgYnVmLCA0KSA9PSAwKQotCQlyZXR1cm4gMDsKLQotCW1lbWNweShrZXksIGJ1ZiwgbGVuKTsKLQotCXJldHVybiAxOwotfQotKi8KLQotc3RhdGljIGludCBlZXByb21fZ2V0X21hY19hZGRyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjaGFyIHR5cGUsIHU4ICptYWMpCi17Ci0JdTggdG1wWzhdOwotCi0JaWYgKGVlcHJvbV9scmNfcmVhZChhZGFwdGVyLCAweDNmOCwgOCwgdG1wLCA0KSAhPSAwKSB7Ci0JCWlmICh0eXBlICE9IDApIHsKLQkJCW1hY1swXSA9IHRtcFswXTsKLQkJCW1hY1sxXSA9IHRtcFsxXTsKLQkJCW1hY1syXSA9IHRtcFsyXTsKLQkJCW1hY1szXSA9IDB4ZmU7Ci0JCQltYWNbNF0gPSAweGZmOwotCQkJbWFjWzVdID0gdG1wWzNdOwotCQkJbWFjWzZdID0gdG1wWzRdOwotCQkJbWFjWzddID0gdG1wWzVdOwotCi0JCX0gZWxzZSB7Ci0KLQkJCW1hY1swXSA9IHRtcFswXTsKLQkJCW1hY1sxXSA9IHRtcFsxXTsKLQkJCW1hY1syXSA9IHRtcFsyXTsKLQkJCW1hY1szXSA9IHRtcFszXTsKLQkJCW1hY1s0XSA9IHRtcFs0XTsKLQkJCW1hY1s1XSA9IHRtcFs1XTsKLQkJfQotCi0JCXJldHVybiAxOwotCi0JfSBlbHNlIHsKLQotCQlpZiAodHlwZSA9PSAwKSB7Ci0JCQltZW1zZXQobWFjLCAwLCA2KTsKLQotCQl9IGVsc2UgewotCi0JCQltZW1zZXQobWFjLCAwLCA4KTsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLX0KLQotLyoKLXN0YXRpYyBjaGFyIGVlcHJvbV9zZXRfbWFjX2FkZHIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNoYXIgdHlwZSwgdTggKm1hYykKLXsKLQl1OCB0bXBbOF07Ci0KLQlpZiAodHlwZSAhPSAwKSB7Ci0JCXRtcFswXSA9IG1hY1swXTsKLQkJdG1wWzFdID0gbWFjWzFdOwotCQl0bXBbMl0gPSBtYWNbMl07Ci0JCXRtcFszXSA9IG1hY1s1XTsKLQkJdG1wWzRdID0gbWFjWzZdOwotCQl0bXBbNV0gPSBtYWNbN107Ci0KLQl9IGVsc2UgewotCi0JCXRtcFswXSA9IG1hY1swXTsKLQkJdG1wWzFdID0gbWFjWzFdOwotCQl0bXBbMl0gPSBtYWNbMl07Ci0JCXRtcFszXSA9IG1hY1szXTsKLQkJdG1wWzRdID0gbWFjWzRdOwotCQl0bXBbNV0gPSBtYWNbNV07Ci0JfQotCi0JdG1wWzZdID0gMDsKLQl0bXBbN10gPSBjYWxjX2xyYyh0bXAsIDcpOwotCi0JaWYgKGVlcHJvbV93cml0ZShhZGFwdGVyLCAweDNmOCwgdG1wLCA4KSA9PSA4KQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotKi8KLQotLyogUElEIGZpbHRlciAqLwotCi0vKiBldmVyeSBmbGV4Y29wIGhhcyA2ICJsb3dlciIgaHcgUElEIGZpbHRlcnMgICAgICovCi0vKiB0aGVzZSBhcmUgZW5hYmxlZCBieSBzZXR0aW5nIGJpdHMgMC01IG9mIDB4MjA4ICovCi0vKiBmb3IgdGhlIDMyIGFkZGl0aW9uYWwgZmlsdGVycyB3ZSBoYXZlIHRvIHNlbGVjdCBvbmUgKi8KLS8qIG9mIHRoZW0gdGhyb3VnaCAweDMxMCBhbmQgbW9kaWZ5IHRocm91Z2ggMHgzMTQgKi8KLS8qIG9wOiAwPWRpc2FibGUsIDE9ZW5hYmxlICovCi1zdGF0aWMgdm9pZCBmaWx0ZXJfZW5hYmxlX2h3X2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGlkLCB1OCBvcCkKLXsKLQlkcHJpbnRrKCIlczogaWQ9JWQgb3A9JWRcbiIsIF9fRlVOQ1RJT05fXywgaWQsIG9wKTsKLQlpZiAoaWQgPD0gNSkgewotCQl1MzIgbWFzayA9ICgweDAwMDAwMDAxIDw8IGlkKTsKLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCBtYXNrLCBvcCA/IG1hc2sgOiAwKTsKLQl9IGVsc2UgewotCQkvKiBzZWxlY3QgKi8KLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MzEwLCAweDFmLCAoaWQgLSA2KSAmIDB4MWYpOwotCQkvKiBtb2RpZnkgKi8KLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MzE0LCAweDAwMDA2MDAwLCBvcCA/IDB4MDAwMDQwMDAgOiAwKTsKLQl9Ci19Ci0KLS8qIHRoaXMgc2V0cyB0aGUgUElEIHRoYXQgc2hvdWxkIHBhc3MgdGhlIHNwZWNpZmllZCBmaWx0ZXIgKi8KLXN0YXRpYyB2b2lkIHBpZF9zZXRfaHdfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgaWQsIHUxNiBwaWQpCi17Ci0JZHByaW50aygiJXM6IGlkPSVkICBwaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgaWQsIHBpZCk7Ci0JaWYgKGlkIDw9IDUpIHsKLQkJdTMyIGFkciA9IDB4MzAwICsgKChpZCAmIDYpIDw8IDEpOwotCQlpbnQgc2hpZnQgPSAoaWQgJiAxKSA/IDE2IDogMDsKLQkJZHByaW50aygiJXM6IGlkPSVkICBhZGRyPSV4ICVjICBwaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgaWQsIGFkciwgKGlkICYgMSkgPyAnaCcgOiAnbCcsIHBpZCk7Ci0JCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCBhZHIsICgweDdmZmYpIDw8IHNoaWZ0LCAocGlkICYgMHgxZmZmKSA8PCBzaGlmdCk7Ci0JfSBlbHNlIHsKLQkJLyogc2VsZWN0ICovCi0JCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDMxMCwgMHgxZiwgKGlkIC0gNikgJiAweDFmKTsKLQkJLyogbW9kaWZ5ICovCi0JCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDMxNCwgMHgxZmZmLCBwaWQgJiAweDFmZmYpOwotCX0KLX0KLQotCi0vKgotc3RhdGljIHZvaWQgZmlsdGVyX2VuYWJsZV9udWxsX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIG9wKQotewotCWRwcmludGsoIiVzOiBvcD0leFxuIiwgX19GVU5DVElPTl9fLCBvcCk7Ci0KLQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDAwNDAsIG9wPzB4MDAwMDAwNDA6MCk7Ci19Ci0qLwotCi1zdGF0aWMgdm9pZCBmaWx0ZXJfZW5hYmxlX21hc2tfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0JZHByaW50aygiJXM6IG9wPSV4XG4iLCBfX0ZVTkNUSU9OX18sIG9wKTsKLQotCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDIwOCwgMHgwMDAwMDA4MCwgb3AgPyAweDAwMDAwMDgwIDogMCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgY3RybF9lbmFibGVfbWFjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0Jd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDA0MDAwLCBvcCA/IDB4MDAwMDQwMDAgOiAwKTsKLX0KLQotc3RhdGljIGludCBjYV9zZXRfbWFjX2RzdF9hZGRyX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKm1hYykKLXsKLQl1MzIgdG1wMSwgdG1wMjsKLQotCXRtcDEgPSAobWFjWzNdIDw8IDB4MTgpIHwgKG1hY1syXSA8PCAweDEwKSB8IChtYWNbMV0gPDwgMHgwOCkgfCBtYWNbMF07Ci0JdG1wMiA9IChtYWNbNV0gPDwgMHgwOCkgfCBtYWNbNF07Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg0MTgsIHRtcDEpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDQxYywgdG1wMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLXN0YXRpYyB2b2lkIHNldF9pZ25vcmVfbWFjX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggb3ApCi17Ci0JaWYgKG9wICE9IDApIHsKLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDA0MDAwLCAwKTsKLQkJYWRhcHRlci0+bWFjX2ZpbHRlciA9IDE7Ci0JfSBlbHNlIHsKLQkJaWYgKGFkYXB0ZXItPm1hY19maWx0ZXIgIT0gMCkgewotCQkJYWRhcHRlci0+bWFjX2ZpbHRlciA9IDA7Ci0JCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDQwMDAsIDB4MDAwMDQwMDApOwotCQl9Ci0JfQotfQotKi8KLQotLyoKLXN0YXRpYyB2b2lkIGNoZWNrX251bGxfZmlsdGVyX2VuYWJsZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlmaWx0ZXJfZW5hYmxlX251bGxfZmlsdGVyKGFkYXB0ZXIsIDEpOwotCWZpbHRlcl9lbmFibGVfbWFza19maWx0ZXIoYWRhcHRlciwgMSk7Ci19Ci0qLwotCi1zdGF0aWMgdm9pZCBwaWRfc2V0X2dyb3VwX3BpZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IHBpZCkKLXsKLQl1MzIgdmFsdWU7Ci0KLQlkcHJpbnRrKCIlczogcGlkPSV4XG4iLCBfX0ZVTkNUSU9OX18sIHBpZCk7Ci0JdmFsdWUgPSAocGlkICYgMHgzZmZmKSB8IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDMwYykgJiAweGZmZmYwMDAwKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgzMGMsIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgcGlkX3NldF9ncm91cF9tYXNrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCXUzMiB2YWx1ZTsKLQotCWRwcmludGsoIiVzOiBwaWQ9JXhcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQl2YWx1ZSA9ICgocGlkICYgMHgzZmZmKSA8PCAweDEwKSB8IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDMwYykgJiAweGZmZmYpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDMwYywgdmFsdWUpOwotfQotCi0vKgotc3RhdGljIGludCBwaWRfZ2V0X2dyb3VwX3BpZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgzMGMpICYgMHgwMDAwMWZmZjsKLX0KLQotc3RhdGljIGludCBwaWRfZ2V0X2dyb3VwX21hc2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDMwYykgPj4gMHgxMCkmIDB4MDAwMDFmZmY7Ci19Ci0qLwotCi0vKgotc3RhdGljIHZvaWQgcmVzZXRfaGFyZHdhcmVfcGlkX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlwaWRfc2V0X3N0cmVhbTFfcGlkKGFkYXB0ZXIsIDB4MWZmZik7Ci0KLQlwaWRfc2V0X3N0cmVhbTJfcGlkKGFkYXB0ZXIsIDB4MWZmZik7Ci0JZmlsdGVyX2VuYWJsZV9zdHJlYW0yX2ZpbHRlcihhZGFwdGVyLCAwKTsKLQotCXBpZF9zZXRfcGNyX3BpZChhZGFwdGVyLCAweDFmZmYpOwotCWZpbHRlcl9lbmFibGVfcGNyX2ZpbHRlcihhZGFwdGVyLCAwKTsKLQotCXBpZF9zZXRfcG10X3BpZChhZGFwdGVyLCAweDFmZmYpOwotCWZpbHRlcl9lbmFibGVfcG10X2ZpbHRlcihhZGFwdGVyLCAwKTsKLQotCXBpZF9zZXRfZWNtX3BpZChhZGFwdGVyLCAweDFmZmYpOwotCWZpbHRlcl9lbmFibGVfZWNtX2ZpbHRlcihhZGFwdGVyLCAwKTsKLQotCXBpZF9zZXRfZW1tX3BpZChhZGFwdGVyLCAweDFmZmYpOwotCWZpbHRlcl9lbmFibGVfZW1tX2ZpbHRlcihhZGFwdGVyLCAwKTsKLX0KLSovCi0KLXN0YXRpYyB2b2lkIGluaXRfcGlkcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgaTsKLQotCWFkYXB0ZXItPnBpZF9jb3VudCA9IDA7Ci0JYWRhcHRlci0+d2hvbGVfYmFuZHdpZHRoX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dXNlYWJsZV9od19maWx0ZXJzOyBpKyspIHsKLQkJZHByaW50aygiJXM6IHNldHRpbmcgZmlsdGVyICVkIHRvIDB4MWZmZlxuIiwgX19GVU5DVElPTl9fLCBpKTsKLQkJYWRhcHRlci0+aHdfcGlkc1tpXSA9IDB4MWZmZjsKLQkJcGlkX3NldF9od19waWQoYWRhcHRlciwgaSwgMHgxZmZmKTsKLX0KLQotCXBpZF9zZXRfZ3JvdXBfcGlkKGFkYXB0ZXIsIDApOwotCXBpZF9zZXRfZ3JvdXBfbWFzayhhZGFwdGVyLCAweDFmZTApOwotfQotCi1zdGF0aWMgdm9pZCBvcGVuX3dob2xlX2JhbmR3aWR0aChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JcGlkX3NldF9ncm91cF9waWQoYWRhcHRlciwgMCk7Ci0JcGlkX3NldF9ncm91cF9tYXNrKGFkYXB0ZXIsIDApOwotLyoKLQlmaWx0ZXJfZW5hYmxlX21hc2tfZmlsdGVyKGFkYXB0ZXIsIDEpOwotKi8KLX0KLQotc3RhdGljIHZvaWQgY2xvc2Vfd2hvbGVfYmFuZHdpZHRoKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWRwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKLQlwaWRfc2V0X2dyb3VwX3BpZChhZGFwdGVyLCAwKTsKLQlwaWRfc2V0X2dyb3VwX21hc2soYWRhcHRlciwgMHgxZmUwKTsKLS8qCi0JZmlsdGVyX2VuYWJsZV9tYXNrX2ZpbHRlcihhZGFwdGVyLCAxKTsKLSovCi19Ci0KLXN0YXRpYyB2b2lkIHdob2xlX2JhbmR3aWR0aF9pbmMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGFkYXB0ZXItPndob2xlX2JhbmR3aWR0aF9jb3VudCsrID09IDApCi0JCW9wZW5fd2hvbGVfYmFuZHdpZHRoKGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCB3aG9sZV9iYW5kd2lkdGhfZGVjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWlmICgtLWFkYXB0ZXItPndob2xlX2JhbmR3aWR0aF9jb3VudCA8PSAwKQotCQljbG9zZV93aG9sZV9iYW5kd2lkdGgoYWRhcHRlcik7Ci19Ci0KLS8qIFRoZSBzcGVjaWZpZWQgUElEIGhhcyB0byBiZSBsZXQgdGhyb3VnaCB0aGUKLSAgIGh3IGZpbHRlcnMuCi0gICBXZSB0cnkgdG8gYWxsb2NhdGUgYW4gaGFyZHdhcmUgZmlsdGVyIGFuZCBvcGVuIHdob2xlCi0gICBiYW5kd2lkdGggd2hlbiBhbGxvY2F0aW9uIGlzIGltcG9zc2libGUuCi0gICBBbGwgcGlkczw9MHgxZiBwYXNzIHRocm91Z2ggdGhlIGdyb3VwIGZpbHRlci4KLSAgIFJldHVybnMgMSBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLwotc3RhdGljIGludCBhZGRfaHdfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCWludCBpOwotCi0JZHByaW50aygiJXM6IHBpZD0lZFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCi0JaWYgKHBpZCA8PSAweDFmKQotCQlyZXR1cm4gMTsKLQotCS8qIHdlIGNhbid0IHVzZSBhIGZpbHRlciBmb3IgMHgyMDAwLCBzbyBubyBzZWFyY2ggKi8KLQlpZiAocGlkICE9IDB4MjAwMCkgewotCQkvKiBmaW5kIGFuIHVudXNlZCBoYXJkd2FyZSBmaWx0ZXIgKi8KLQkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnVzZWFibGVfaHdfZmlsdGVyczsgaSsrKSB7Ci0JCQlkcHJpbnRrKCIlczogcGlkPSVkIHNlYXJjaGluZyBzbG90PSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBpZCwgaSk7Ci0JCQlpZiAoYWRhcHRlci0+aHdfcGlkc1tpXSA9PSAweDFmZmYpIHsKLQkJCQlkcHJpbnRrKCIlczogcGlkPSVkIHNsb3Q9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkLCBpKTsKLQkJCQlhZGFwdGVyLT5od19waWRzW2ldID0gcGlkOwotCQkJCXBpZF9zZXRfaHdfcGlkKGFkYXB0ZXIsIGksIHBpZCk7Ci0JCQkJZmlsdGVyX2VuYWJsZV9od19maWx0ZXIoYWRhcHRlciwgaSwgMSk7Ci0JCXJldHVybiAxOwotCX0KLQl9Ci0JfQotCS8qIGlmIHdlIGhhdmUgbm90IHVzZWQgYSBmaWx0ZXIsIHRoaXMgcGlkIGRlcGVuZHMgb24gd2hvbGUgYmFuZHdpZHRoICovCi0JZHByaW50aygiJXM6IHBpZD0lZCB3aG9sZV9iYW5kd2lkdGhcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQl3aG9sZV9iYW5kd2lkdGhfaW5jKGFkYXB0ZXIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLS8qIHJldHVybnMgLTEgaWYgdGhlIHBpZCB3YXMgbm90IHByZXNlbnQgaW4gdGhlIGZpbHRlcnMgKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX2h3X3BpZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IHBpZCkKLXsKLQlpbnQgaTsKLQotCWRwcmludGsoIiVzOiBwaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQotCWlmIChwaWQgPD0gMHgxZikKLQkJcmV0dXJuIDE7Ci0KLQkvKiB3ZSBjYW4ndCB1c2UgYSBmaWx0ZXIgZm9yIDB4MjAwMCwgc28gbm8gc2VhcmNoICovCi0JaWYgKHBpZCAhPSAweDIwMDApIHsKLQkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnVzZWFibGVfaHdfZmlsdGVyczsgaSsrKSB7Ci0JCQlkcHJpbnRrKCIlczogcGlkPSVkIHNlYXJjaGluZyBzbG90PSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBpZCwgaSk7Ci0JCQlpZiAoYWRhcHRlci0+aHdfcGlkc1tpXSA9PSBwaWQpIHsJLy8gZmluZCB0aGUgcGlkIHNsb3QKLQkJCQlkcHJpbnRrKCIlczogcGlkPSVkIHNsb3Q9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkLCBpKTsKLQkJCQlhZGFwdGVyLT5od19waWRzW2ldID0gMHgxZmZmOwotCQkJCXBpZF9zZXRfaHdfcGlkKGFkYXB0ZXIsIGksIDB4MWZmZik7Ci0JCQkJZmlsdGVyX2VuYWJsZV9od19maWx0ZXIoYWRhcHRlciwgaSwgMCk7Ci0JCXJldHVybiAxOwotCX0KLQl9Ci0JfQotCS8qIGlmIHdlIGhhdmUgbm90IHVzZWQgYSBmaWx0ZXIsIHRoaXMgcGlkIGRlcGVuZGVkIG9uIHdob2xlIGJhbmR3aXRoICovCi0JZHByaW50aygiJXM6IHBpZD0lZCB3aG9sZV9iYW5kd2lkdGhcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQl3aG9sZV9iYW5kd2lkdGhfZGVjKGFkYXB0ZXIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLS8qIEFkZHMgYSBQSUQgdG8gdGhlIGZpbHRlcnMuCi0gICBBZGRpbmcgYSBwaWQgbW9yZSB0aGFuIG9uY2UgaXMgcG9zc2libGUsIHdlIGtlZXAgcmVmZXJlbmNlIGNvdW50cy4KLSAgIFdob2xlIHN0cmVhbSBhdmFpbGFibGUgdGhyb3VnaCBwaWQ9PTB4MjAwMC4KLSAgIFJldHVybnMgMSBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLwotc3RhdGljIGludCBhZGRfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCWludCBpOwotCi0JZHByaW50aygiJXM6IHBpZD0lZFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCi0JaWYgKHBpZCA+IDB4MWZmZSAmJiBwaWQgIT0gMHgyMDAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvLyBjaGVjayBpZiB0aGUgcGlkIGlzIGFscmVhZHkgcHJlc2VudAotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5waWRfY291bnQ7IGkrKykKLQkJaWYgKGFkYXB0ZXItPnBpZF9saXN0W2ldID09IHBpZCkgewotCQkJYWRhcHRlci0+cGlkX3JjW2ldKys7CS8vIGluY3JlbWVudCByZWYgY291bnRlcgotCQlyZXR1cm4gMTsKLQkJfQotCi0JaWYgKGFkYXB0ZXItPnBpZF9jb3VudCA9PSBOX1BJRF9TTE9UUykKLQkJcmV0dXJuIC0xOwkvLyBubyBtb3JlIHBpZHMgY2FuIGJlIGFkZGVkCi0JYWRhcHRlci0+cGlkX2xpc3RbYWRhcHRlci0+cGlkX2NvdW50XSA9IHBpZDsJLy8gcmVnaXN0ZXIgcGlkCi0JYWRhcHRlci0+cGlkX3JjW2FkYXB0ZXItPnBpZF9jb3VudF0gPSAxOwotCWFkYXB0ZXItPnBpZF9jb3VudCsrOwotCS8vIGhhcmR3YXJlIHNldHRpbmcKLQlhZGRfaHdfcGlkKGFkYXB0ZXIsIHBpZCk7Ci0KLQkJCXJldHVybiAxOwotCQl9Ci0KLS8qIFJlbW92ZXMgYSBQSUQgZnJvbSB0aGUgZmlsdGVycy4gKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX3BpZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IHBpZCkKLXsKLQlpbnQgaTsKLQotCWRwcmludGsoIiVzOiBwaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQotCWlmIChwaWQgPiAweDFmZmUgJiYgcGlkICE9IDB4MjAwMCkKLQkJcmV0dXJuIC0xOwotCi0JLy8gY2hlY2sgaWYgdGhlIHBpZCBpcyBwcmVzZW50IChpdCBtdXN0IGJlISkKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cGlkX2NvdW50OyBpKyspIHsKLQkJaWYgKGFkYXB0ZXItPnBpZF9saXN0W2ldID09IHBpZCkgewotCQkJYWRhcHRlci0+cGlkX3JjW2ldLS07Ci0JCQlpZiAoYWRhcHRlci0+cGlkX3JjW2ldIDw9IDApIHsKLQkJCQkvLyByZW1vdmUgZnJvbSB0aGUgbGlzdAotCQkJCWFkYXB0ZXItPnBpZF9jb3VudC0tOwotCQkJCWFkYXB0ZXItPnBpZF9saXN0W2ldPWFkYXB0ZXItPnBpZF9saXN0W2FkYXB0ZXItPnBpZF9jb3VudF07Ci0JCQkJYWRhcHRlci0+cGlkX3JjW2ldID0gYWRhcHRlci0+cGlkX3JjW2FkYXB0ZXItPnBpZF9jb3VudF07Ci0JCQkJLy8gaGFyZHdhcmUgc2V0dGluZwotCQkJCXJlbW92ZV9od19waWQoYWRhcHRlciwgcGlkKTsKLQkJCX0KLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotCi0KLS8qIGRtYSAmIGlycSAqLwotc3RhdGljIHZvaWQgY3RybF9lbmFibGVfc21jKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0Jd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDAwODAwLCBvcCA/IDB4MDAwMDA4MDAgOiAwKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2VuYWJsZV9kaXNhYmxlX2lycShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGZsYWcxLCB1MzIgZmxhZzIsIHUzMiBmbGFnMykKLXsKLQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsICYgMHgwMDBmMDAwMDsKLQotCWlmIChmbGFnMSA9PSAwKSB7Ci0JCWlmIChmbGFnMiA9PSAwKQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCAmIH4weDAwMDEwMDAwOwotCQllbHNlCi0JCQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsIHwgMHgwMDAxMDAwMDsKLQotCQlpZiAoZmxhZzMgPT0gMCkKLQkJCWFkYXB0ZXItPmRtYV9jdHJsID0gYWRhcHRlci0+ZG1hX2N0cmwgJiB+MHgwMDAyMDAwMDsKLQkJZWxzZQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCB8IDB4MDAwMjAwMDA7Ci0KLQl9IGVsc2UgewotCi0JCWlmIChmbGFnMiA9PSAwKQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCAmIH4weDAwMDQwMDAwOwotCQllbHNlCi0JCQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsIHwgMHgwMDA0MDAwMDsKLQotCQlpZiAoZmxhZzMgPT0gMCkKLQkJCWFkYXB0ZXItPmRtYV9jdHJsID0gYWRhcHRlci0+ZG1hX2N0cmwgJiB+MHgwMDA4MDAwMDsKLQkJZWxzZQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCB8IDB4MDAwODAwMDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpcnFfZG1hX2VuYWJsZV9kaXNhYmxlX2lycShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIG9wKQotewotCXUzMiB2YWx1ZTsKLQotCXZhbHVlID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgyMDgpICYgMHhmZmYwZmZmZjsKLQotCWlmIChvcCAhPSAwKQotCQl2YWx1ZSA9IHZhbHVlIHwgKGFkYXB0ZXItPmRtYV9jdHJsICYgMHgwMDBmMDAwMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHZhbHVlKTsKLX0KLQotLyogRmxleENvcElJIGhhcyAyIGRtYSBjaGFubmVscy4gRE1BMSBpcyB1c2VkIHRvIHRyYW5zZmVyIFRTIGRhdGEgdG8KLSAgIHN5c3RlbSBtZW1vcnkuCi0KLSAgIFRoZSBETUExIGJ1ZmZlciBpcyBkaXZpZGVkIGluIDIgc3ViYnVmZmVycyBvZiBlcXVhbCBzaXplLgotICAgRmxleENvcElJIHdpbGwgdHJhbnNmZXIgVFMgZGF0YSB0byBvbmUgc3ViYnVmZmVyLCBzaWduYWwgYW4gaW50ZXJydXB0Ci0gICB3aGVuIHRoZSBzdWJidWZmZXIgaXMgZnVsbCBhbmQgY29udGludWUgZmlsbGlnIHRoZSBzZWNvbmQgc3ViYnVmZmVyLgotCi0gICBGb3IgRE1BMToKLSAgICAgICBzdWJidWZmZXIgc2l6ZSBpbiAzMi1iaXQgd29yZHMgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCAyNCBiaXRzIG9mCi0gICAgICAgcmVnaXN0ZXIgMHgwMDQuIFRoZSBsYXN0IDggYml0cyBvZiByZWdpc3RlciAweDAwNCBjb250YWluIHRoZSBudW1iZXIKLSAgICAgICBvZiBzdWJidWZmZXJzLgotICAgICAgIAotICAgICAgIHRoZSBmaXJzdCAzMCBiaXRzIG9mIHJlZ2lzdGVyIDB4MDAwIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0Ci0gICAgICAgc3ViYnVmZmVyLiBUaGUgbGFzdCAyIGJpdHMgY29udGFpbiAwLCB3aGVuIGRtYTEgaXMgZGlzYWJsZWQgYW5kIDEsCi0gICAgICAgd2hlbiBkbWExIGlzIGVuYWJsZWQuCi0KLSAgICAgICB0aGUgZmlyc3QgMzAgYml0cyBvZiByZWdpc3RlciAweDAwYyBjb250YWluIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWNvbmQKLSAgICAgICBzdWJidWZmZXIuIHRoZSBsYXN0IDIgYml0cyBjb250YWluIDEuCi0KLSAgICAgICByZWdpc3RlciAweDAwOCB3aWxsIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN1YmJ1ZmZlciB0aGF0IHdhcyBmaWxsZWQKLSAgICAgICB3aXRoIFRTIGRhdGEsIHdoZW4gRmxleENvcElJIHdpbGwgZ2VuZXJhdGUgYW4gaW50ZXJydXB0LgotCi0gICBGb3IgRE1BMjoKLSAgICAgICBzdWJidWZmZXIgc2l6ZSBpbiAzMi1iaXQgd29yZHMgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCAyNCBiaXRzIG9mCi0gICAgICAgcmVnaXN0ZXIgMHgwMTQuIFRoZSBsYXN0IDggYml0cyBvZiByZWdpc3RlciAweDAxNCBjb250YWluIHRoZSBudW1iZXIKLSAgICAgICBvZiBzdWJidWZmZXJzLgotICAgICAgIAotICAgICAgIHRoZSBmaXJzdCAzMCBiaXRzIG9mIHJlZ2lzdGVyIDB4MDEwIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0Ci0gICAgICAgc3ViYnVmZmVyLiAgVGhlIGxhc3QgMiBiaXRzIGNvbnRhaW4gMCwgd2hlbiBkbWExIGlzIGRpc2FibGVkIGFuZCAxLAotICAgICAgIHdoZW4gZG1hMSBpcyBlbmFibGVkLgotCi0gICAgICAgdGhlIGZpcnN0IDMwIGJpdHMgb2YgcmVnaXN0ZXIgMHgwMWMgY29udGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgc2Vjb25kCi0gICAgICAgc3ViYnVmZmVyLiB0aGUgbGFzdCAyIGJpdHMgY29udGFpbiAxLgotCi0gICAgICAgcmVnaXN0ZXIgMHgwMTggY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN1YmJ1ZmZlciB0aGF0IHdhcyBmaWxsZWQKLSAgICAgICB3aXRoIFRTIGRhdGEsIHdoZW4gRmxleENvcElJIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuCi0qLwotc3RhdGljIGludCBkbWFfaW5pdF9kbWEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBkbWFfY2hhbm5lbCkKLXsKLQl1MzIgc3ViYnVmZmVycywgc3ViYnVmc2l6ZSwgc3ViYnVmMCwgc3ViYnVmMTsKLQotCWlmIChkbWFfY2hhbm5lbCA9PSAwKSB7Ci0JCWRwcmludGsoIiVzOiBJbml0aWFsaXppbmcgRE1BMSBjaGFubmVsXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCXN1YmJ1ZmZlcnMgPSAyOwotCi0JCXN1YmJ1ZnNpemUgPSAoKChhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAvIDIpIC8gNCkgPDwgOCkgfCBzdWJidWZmZXJzOwotCi0JCXN1YmJ1ZjAgPSBhZGFwdGVyLT5kbWFxMS5idXNfYWRkciAmIDB4ZmZmZmZmZmM7Ci0KLQkJc3ViYnVmMSA9ICgoYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgKyBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAvIDIpICYgMHhmZmZmZmZmYykgfCAxOwotCi0JCWRwcmludGsoIiVzOiBmaXJzdCBzdWJidWZmZXIgYWRkcmVzcyA9IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgc3ViYnVmMCk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDAwLCBzdWJidWYwKTsKLQotCQlkcHJpbnRrKCIlczogc3ViYnVmZmVyIHNpemUgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIChzdWJidWZzaXplID4+IDgpICogNCk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDA0LCBzdWJidWZzaXplKTsKLQotCQlkcHJpbnRrKCIlczogc2Vjb25kIHN1YmJ1ZmZlciBhZGRyZXNzID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCBzdWJidWYxKTsKLQkJdWRlbGF5KDEwMDApOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMGMsIHN1YmJ1ZjEpOwotCi0JCWRwcmludGsoIiVzOiBjb3VudGVyID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kbWFxMS5idXNfYWRkciAmIDB4ZmZmZmZmZmMpOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMDgsIGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICYgMHhmZmZmZmZmYyk7Ci0JCXVkZWxheSgxMDAwKTsKLQotCQlkbWFfZW5hYmxlX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIDAsIDEsIHN1YmJ1ZmZlcnMgPyAxIDogMCk7Ci0KLQkJaXJxX2RtYV9lbmFibGVfZGlzYWJsZV9pcnEoYWRhcHRlciwgMSk7Ci0KLQkJc3JhbV9zZXRfbWVkaWFfZGVzdChhZGFwdGVyLCAxKTsKLQkJc3JhbV9zZXRfbmV0X2Rlc3QoYWRhcHRlciwgMSk7Ci0JCXNyYW1fc2V0X2NhaV9kZXN0KGFkYXB0ZXIsIDIpOwotCQlzcmFtX3NldF9jYW9fZGVzdChhZGFwdGVyLCAyKTsKLQl9Ci0KLQlpZiAoZG1hX2NoYW5uZWwgPT0gMSkgewotCQlkcHJpbnRrKCIlczogSW5pdGlhbGl6aW5nIERNQTIgY2hhbm5lbFxuIiwgX19GVU5DVElPTl9fKTsKLQotCQlzdWJidWZmZXJzID0gMjsKLQotCQlzdWJidWZzaXplID0gKCgoYWRhcHRlci0+ZG1hcTIuYnVmZmVyX3NpemUgLyAyKSAvIDQpIDw8IDgpIHwgc3ViYnVmZmVyczsKLQotCQlzdWJidWYwID0gYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIgJiAweGZmZmZmZmZjOwotCi0JCXN1YmJ1ZjEgPSAoKGFkYXB0ZXItPmRtYXEyLmJ1c19hZGRyICsgYWRhcHRlci0+ZG1hcTIuYnVmZmVyX3NpemUgLyAyKSAmIDB4ZmZmZmZmZmMpIHwgMTsKLQotCQlkcHJpbnRrKCIlczogZmlyc3Qgc3ViYnVmZmVyIGFkZHJlc3MgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIHN1YmJ1ZjApOwotCQl1ZGVsYXkoMTAwMCk7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAxMCwgc3ViYnVmMCk7Ci0KLQkJZHByaW50aygiJXM6IHN1YmJ1ZmZlciBzaXplID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCAoc3ViYnVmc2l6ZSA+PiA4KSAqIDQpOwotCQl1ZGVsYXkoMTAwMCk7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAxNCwgc3ViYnVmc2l6ZSk7Ci0KLQkJZHByaW50aygiJXM6IHNlY29uZCBidWZmZXIgYWRkcmVzcyA9IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgc3ViYnVmMSk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDFjLCBzdWJidWYxKTsKLQotCQlzcmFtX3NldF9jYWlfZGVzdChhZGFwdGVyLCAyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0JaWYgKG9wID09IDApIHsKLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDA4MDAwLCAwKTsKLQkJYWRhcHRlci0+ZG1hX3N0YXR1cyA9IGFkYXB0ZXItPmRtYV9zdGF0dXMgJiB+MHgwMDAwMDAwNDsKLQl9IGVsc2UgewotCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDApOwotCQlhZGFwdGVyLT5kbWFfc3RhdHVzID0gYWRhcHRlci0+ZG1hX3N0YXR1cyB8IDB4MDAwMDAwMDQ7Ci0JfQotfQotCi0vKiBiaXQgMCBvZiBkbWFfbWFzayBpcyBzZXQgdG8gMSBpZiBkbWExIGNoYW5uZWwgaGFzIHRvIGJlIGVuYWJsZWQvZGlzYWJsZWQKLSAgIGJpdCAxIG9mIGRtYV9tYXNrIGlzIHNldCB0byAxIGlmIGRtYTIgY2hhbm5lbCBoYXMgdG8gYmUgZW5hYmxlZC9kaXNhYmxlZAotKi8KLXN0YXRpYyB2b2lkIGRtYV9zdGFydF9zdG9wKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZG1hX21hc2ssIGludCBzdGFydF9zdG9wKQotewotCXUzMiBkbWFfZW5hYmxlLCBkbWExX2VuYWJsZSwgZG1hMl9lbmFibGU7Ci0KLQlkcHJpbnRrKCIlczogZG1hX21hc2s9JXhcbiIsIF9fRlVOQ1RJT05fXywgZG1hX21hc2spOwotCi0JaWYgKHN0YXJ0X3N0b3AgPT0gMSkgewotCQlkcHJpbnRrKCIlczogc3RhcnRpbmcgZG1hXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCWRtYTFfZW5hYmxlID0gMDsKLQkJZG1hMl9lbmFibGUgPSAwOwotCi0JCWlmICgoKGRtYV9tYXNrICYgMSkgIT0gMCkgJiYgKChhZGFwdGVyLT5kbWFfc3RhdHVzICYgMSkgPT0gMCkgJiYgKGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICE9IDApKSB7Ci0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzID0gYWRhcHRlci0+ZG1hX3N0YXR1cyB8IDE7Ci0JCQlkbWExX2VuYWJsZSA9IDE7Ci0JCX0KLQotCQlpZiAoKChkbWFfbWFzayAmIDIpICE9IDApICYmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDIpID09IDApICYmIChhZGFwdGVyLT5kbWFxMi5idXNfYWRkciAhPSAwKSkgewotCQkJYWRhcHRlci0+ZG1hX3N0YXR1cyA9IGFkYXB0ZXItPmRtYV9zdGF0dXMgfCAyOwotCQkJZG1hMl9lbmFibGUgPSAxOwotCQl9Ci0JCS8vIGVuYWJsZSBkbWExIGFuZCBkbWEyCi0JCWlmICgoZG1hMV9lbmFibGUgPT0gMSkgJiYgKGRtYTJfZW5hYmxlID09IDEpKSB7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMDAsIGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyIHwgMSk7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMGMsIChhZGFwdGVyLT5kbWFxMS5idXNfYWRkciArIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplIC8gMikgfCAxKTsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAxMCwgYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIgfCAxKTsKLQotCQkJY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKGFkYXB0ZXIsIDEpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZW5hYmxlIGRtYTEKLQkJaWYgKChkbWExX2VuYWJsZSA9PSAxKSAmJiAoZG1hMl9lbmFibGUgPT0gMCkpIHsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwMCwgYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgfCAxKTsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwYywgKGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICsgYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgLyAyKSB8IDEpOwotCi0JCQljdHJsX2VuYWJsZV9yZWNlaXZlX2RhdGEoYWRhcHRlciwgMSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBlbmFibGUgZG1hMgotCQlpZiAoKGRtYTFfZW5hYmxlID09IDApICYmIChkbWEyX2VuYWJsZSA9PSAxKSkgewotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDEwLCBhZGFwdGVyLT5kbWFxMi5idXNfYWRkciB8IDEpOwotCi0JCQljdHJsX2VuYWJsZV9yZWNlaXZlX2RhdGEoYWRhcHRlciwgMSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBzdGFydCBkbWEKLQkJaWYgKChkbWExX2VuYWJsZSA9PSAwKSAmJiAoZG1hMl9lbmFibGUgPT0gMCkpIHsKLQkJCWN0cmxfZW5hYmxlX3JlY2VpdmVfZGF0YShhZGFwdGVyLCAxKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQl9IGVsc2UgewotCi0JCWRwcmludGsoIiVzOiBzdG9wcGluZyBkbWFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJZG1hX2VuYWJsZSA9IGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAweDAwMDAwMDAzOwotCi0JCWlmICgoKGRtYV9tYXNrICYgMSkgIT0gMCkgJiYgKChhZGFwdGVyLT5kbWFfc3RhdHVzICYgMSkgIT0gMCkpIHsKLQkJCWRtYV9lbmFibGUgPSBkbWFfZW5hYmxlICYgMHhmZmZmZmZmZTsKLQkJfQotCi0JCWlmICgoKGRtYV9tYXNrICYgMikgIT0gMCkgJiYgKChhZGFwdGVyLT5kbWFfc3RhdHVzICYgMikgIT0gMCkpIHsKLQkJCWRtYV9lbmFibGUgPSBkbWFfZW5hYmxlICYgMHhmZmZmZmZmZDsKLQkJfQotCQkvL3N0b3AgZG1hCi0JCWlmICgoZG1hX2VuYWJsZSA9PSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiA0KSAhPSAwKSkgewotCQkJY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKGFkYXB0ZXIsIDApOwotCi0JCQl1ZGVsYXkoMzAwMCk7Ci0JCX0KLQkJLy9kaXNhYmxlIGRtYTEKLQkJaWYgKCgoZG1hX21hc2sgJiAxKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAxKSAhPSAwKSAmJiAoYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgIT0gMCkpIHsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwMCwgYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIpOwotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDBjLCAoYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgKyBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAvIDIpIHwgMSk7Ci0KLQkJCWFkYXB0ZXItPmRtYV9zdGF0dXMgPSBhZGFwdGVyLT5kbWFfc3RhdHVzICYgfjB4MDAwMDAwMDE7Ci0JCX0KLQkJLy9kaXNhYmxlIGRtYTIKLQkJaWYgKCgoZG1hX21hc2sgJiAyKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAyKSAhPSAwKSAmJiAoYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIgIT0gMCkpIHsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAxMCwgYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIpOwotCi0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzID0gYWRhcHRlci0+ZG1hX3N0YXR1cyAmIH4weDAwMDAwMDAyOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBvcGVuX3N0cmVhbShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTE2IHBpZCkKLXsKLQl1MzIgZG1hX21hc2s7Ci0KLQkrK2FkYXB0ZXItPmNhcHR1cmluZzsKLQotCWZpbHRlcl9lbmFibGVfbWFza19maWx0ZXIoYWRhcHRlciwgMSk7Ci0KLQlhZGRfcGlkKGFkYXB0ZXIsIHBpZCk7Ci0KLQlkcHJpbnRrKCIlczogYWRhcHRlci0+ZG1hX3N0YXR1cz0leFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kbWFfc3RhdHVzKTsKLQotCWlmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDcpICE9IDcpIHsKLQkJZG1hX21hc2sgPSAwOwotCi0JCWlmICgoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAweDEwMDAwMDAwKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAxKSA9PSAwKSkgewotCQkJZG1hX21hc2sgPSBkbWFfbWFzayB8IDE7Ci0KLQkJCWFkYXB0ZXItPmRtYXExLmhlYWQgPSAwOwotCQkJYWRhcHRlci0+ZG1hcTEudGFpbCA9IDA7Ci0KLQkJCW1lbXNldChhZGFwdGVyLT5kbWFxMS5idWZmZXIsIDAsIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplKTsKLQkJfQotCi0JCWlmICgoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAweDIwMDAwMDAwKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAyKSA9PSAwKSkgewotCQkJZG1hX21hc2sgPSBkbWFfbWFzayB8IDI7Ci0KLQkJCWFkYXB0ZXItPmRtYXEyLmhlYWQgPSAwOwotCQkJYWRhcHRlci0+ZG1hcTIudGFpbCA9IDA7Ci0JCX0KLQotCQlpZiAoZG1hX21hc2sgIT0gMCkgewotCQkJaXJxX2RtYV9lbmFibGVfZGlzYWJsZV9pcnEoYWRhcHRlciwgMSk7Ci0KLQkJCWRtYV9zdGFydF9zdG9wKGFkYXB0ZXIsIGRtYV9tYXNrLCAxKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgY2xvc2Vfc3RyZWFtKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCWlmIChhZGFwdGVyLT5jYXB0dXJpbmcgPiAwKQotCQktLWFkYXB0ZXItPmNhcHR1cmluZzsKLQotCWRwcmludGsoIiVzOiBkbWFfc3RhdHVzPSV4XG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPmRtYV9zdGF0dXMpOwotCi0JaWYgKGFkYXB0ZXItPmNhcHR1cmluZyA9PSAwKSB7Ci0JCXUzMiBkbWFfbWFzayA9IDA7Ci0KLQlpZiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAxKSAhPSAwKQotCQlkbWFfbWFzayA9IGRtYV9tYXNrIHwgMHgwMDAwMDAwMTsKLQlpZiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAyKSAhPSAwKQotCQlkbWFfbWFzayA9IGRtYV9tYXNrIHwgMHgwMDAwMDAwMjsKLQotCWlmIChkbWFfbWFzayAhPSAwKSB7Ci0JCQlkbWFfc3RhcnRfc3RvcChhZGFwdGVyLCBkbWFfbWFzaywgMCk7Ci0JfQotCX0KLQlyZW1vdmVfcGlkKGFkYXB0ZXIsIHBpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVycnVwdF9zZXJ2aWNlX2RtYTEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gJmFkYXB0ZXItPmRlbXV4OwotCi0JaW50IG5fY3VyX2RtYV9jb3VudGVyOwotCXUzMiBuX251bV9ieXRlc19wYXJzZWQ7Ci0JdTMyIG5fbnVtX25ld19ieXRlc190cmFuc2ZlcnJlZDsKLQl1MzIgZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZSA9IDE4ODsKLQl1OCBnYl90bXBfYnVmZmVyWzE4OF07Ci0JdTggKnBiX2RtYV9idWZfY3VyX3BvczsKLQotCW5fY3VyX2RtYV9jb3VudGVyID0gcmVhZGwoYWRhcHRlci0+aW9fbWVtICsgMHgwMDgpIC0gYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHI7Ci0Jbl9jdXJfZG1hX2NvdW50ZXIgPSAobl9jdXJfZG1hX2NvdW50ZXIgLyBkd19kZWZhdWx0X3BhY2tldF9zaXplKSAqIGR3X2RlZmF1bHRfcGFja2V0X3NpemU7Ci0KLQlpZiAoKG5fY3VyX2RtYV9jb3VudGVyIDwgMCkgfHwgKG5fY3VyX2RtYV9jb3VudGVyID4gYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUpKSB7Ci0JCWRwcmludGsoIiVzOiBkbWEgY291bnRlciBvdXRzaWRlIGRtYSBidWZmZXJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlhZGFwdGVyLT5kbWFxMS5oZWFkID0gbl9jdXJfZG1hX2NvdW50ZXI7Ci0KLQlpZiAoYWRhcHRlci0+ZG1hcTEudGFpbCA8PSBuX2N1cl9kbWFfY291bnRlcikgewotCQluX251bV9uZXdfYnl0ZXNfdHJhbnNmZXJyZWQgPSBuX2N1cl9kbWFfY291bnRlciAtIGFkYXB0ZXItPmRtYXExLnRhaWw7Ci0KLQl9IGVsc2UgewotCi0JCW5fbnVtX25ld19ieXRlc190cmFuc2ZlcnJlZCA9IChhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAtIGFkYXB0ZXItPmRtYXExLnRhaWwpICsgbl9jdXJfZG1hX2NvdW50ZXI7Ci0JfQotCi0JZGRwcmludGsoIiVzOiBuX2N1cl9kbWFfY291bnRlciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIG5fY3VyX2RtYV9jb3VudGVyKTsKLQlkZHByaW50aygiJXM6IGRtYXExLnRhaWwgICAgICAgID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgYWRhcHRlci0+ZG1hcTEudGFpbCk7Ci0JZGRwcmludGsoIiVzOiBieXRlc190cmFuc2ZlcnJlZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIG5fbnVtX25ld19ieXRlc190cmFuc2ZlcnJlZCk7Ci0KLQlpZiAobl9udW1fbmV3X2J5dGVzX3RyYW5zZmVycmVkIDwgZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZSkKLQkJcmV0dXJuOwotCi0Jbl9udW1fYnl0ZXNfcGFyc2VkID0gMDsKLQotCXdoaWxlIChuX251bV9ieXRlc19wYXJzZWQgPCBuX251bV9uZXdfYnl0ZXNfdHJhbnNmZXJyZWQpIHsKLQkJcGJfZG1hX2J1Zl9jdXJfcG9zID0gYWRhcHRlci0+ZG1hcTEuYnVmZmVyICsgYWRhcHRlci0+ZG1hcTEudGFpbDsKLQotCQlpZiAoYWRhcHRlci0+ZG1hcTEuYnVmZmVyICsgYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgPCBhZGFwdGVyLT5kbWFxMS5idWZmZXIgKyBhZGFwdGVyLT5kbWFxMS50YWlsICsgMTg4KSB7Ci0JCQltZW1jcHkoZ2JfdG1wX2J1ZmZlciwgYWRhcHRlci0+ZG1hcTEuYnVmZmVyICsgYWRhcHRlci0+ZG1hcTEudGFpbCwKLQkJCSAgICAgICBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAtIGFkYXB0ZXItPmRtYXExLnRhaWwpOwotCQkJbWVtY3B5KGdiX3RtcF9idWZmZXIgKyAoYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgLSBhZGFwdGVyLT5kbWFxMS50YWlsKSwgYWRhcHRlci0+ZG1hcTEuYnVmZmVyLAotCQkJICAgICAgICgxODggLSAoYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgLSBhZGFwdGVyLT5kbWFxMS50YWlsKSkpOwotCi0JCQlwYl9kbWFfYnVmX2N1cl9wb3MgPSBnYl90bXBfYnVmZmVyOwotCQl9Ci0KLQkJaWYgKGFkYXB0ZXItPmNhcHR1cmluZyAhPSAwKSB7Ci0JCQlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoZHZiZG14LCBwYl9kbWFfYnVmX2N1cl9wb3MsIGR3X2RlZmF1bHRfcGFja2V0X3NpemUgLyAxODgpOwotCQl9Ci0KLQkJbl9udW1fYnl0ZXNfcGFyc2VkID0gbl9udW1fYnl0ZXNfcGFyc2VkICsgZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZTsKLQotCQlhZGFwdGVyLT5kbWFxMS50YWlsID0gYWRhcHRlci0+ZG1hcTEudGFpbCArIGR3X2RlZmF1bHRfcGFja2V0X3NpemU7Ci0KLQkJaWYgKGFkYXB0ZXItPmRtYXExLnRhaWwgPj0gYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUpCi0JCQlhZGFwdGVyLT5kbWFxMS50YWlsID0gYWRhcHRlci0+ZG1hcTEudGFpbCAtIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplOwotCX07Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVycnVwdF9zZXJ2aWNlX2RtYTIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBpc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqdG1wID0gZGV2X2lkOwotCi0JdTMyIHZhbHVlOwotCi0JZGRwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKLQotCXNwaW5fbG9ja19pcnEoJnRtcC0+bG9jayk7Ci0KLQlpZiAoMCA9PSAoKHZhbHVlID0gcmVhZF9yZWdfZHcodG1wLCAweDIwYykpICYgMHgwZikpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ0bXAtPmxvY2spOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCQotCXdoaWxlICh2YWx1ZSAhPSAwKSB7Ci0JCWlmICgodmFsdWUgJiAweDAzKSAhPSAwKQotCQkJaW50ZXJydXB0X3NlcnZpY2VfZG1hMSh0bXApOwotCQlpZiAoKHZhbHVlICYgMHgwYykgIT0gMCkKLQkJCWludGVycnVwdF9zZXJ2aWNlX2RtYTIodG1wKTsKLQkJdmFsdWUgPSByZWFkX3JlZ19kdyh0bXAsIDB4MjBjKSAmIDB4MGY7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxKCZ0bXAtPmxvY2spOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBpbml0X2RtYV9xdWV1ZV9vbmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBkbWFxICpkbWFxLAotCQkJICAgICAgaW50IHNpemUsIGludCBkbWFxX29mZnNldCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JZG1hX2FkZHJfdCBkbWFfYWRkcjsKLQotCWRtYXEtPmhlYWQgPSAwOwotCWRtYXEtPnRhaWwgPSAwOwotCi0JZG1hcS0+YnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZSArIDB4ODAsICZkbWFfYWRkcik7Ci0JaWYgKCFkbWFxLT5idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZG1hcS0+YnVzX2FkZHIgPSBkbWFfYWRkcjsKLQlkbWFxLT5idWZmZXJfc2l6ZSA9IHNpemU7Ci0KLQlkbWFfaW5pdF9kbWEoYWRhcHRlciwgZG1hcV9vZmZzZXQpOwotCi0JZGRwcmludGsoIiVzOiBhbGxvY2F0ZWQgZG1hIGJ1ZmZlciBhdCAweCVwLCBsZW5ndGg9JWRcbiIsCi0JCSBfX0ZVTkNUSU9OX18sIGRtYXEtPmJ1ZmZlciwgc2l6ZSk7Ci0KLQlyZXR1cm4gMDsKLQl9Ci0KLXN0YXRpYyBpbnQgaW5pdF9kbWFfcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IHsKLQkJc3RydWN0IGRtYXEgKmRtYXE7Ci0JCXUzMiBkbWFfc3RhdHVzOwotCQlpbnQgc2l6ZTsKLQl9IGRtYXFfZGVzY1tdID0gewotCQl7ICZhZGFwdGVyLT5kbWFxMSwgMHgxMDAwMDAwMCwgU0laRV9PRl9CVUZfRE1BMSB9LAotCQl7ICZhZGFwdGVyLT5kbWFxMiwgMHgyMDAwMDAwMCwgU0laRV9PRl9CVUZfRE1BMiB9Ci0JfSwgKnAgPSBkbWFxX2Rlc2M7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrLCBwKyspIHsKLQkJaWYgKGluaXRfZG1hX3F1ZXVlX29uZShhZGFwdGVyLCBwLT5kbWFxLCBwLT5zaXplLCBpKSA8IDApCi0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzICY9IH5wLT5kbWFfc3RhdHVzOwotCQllbHNlCi0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzIHw9IHAtPmRtYV9zdGF0dXM7Ci0JfQotCXJldHVybiAoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDB4MzAwMDAwMDApID8gMCA6IC1FTk9NRU07Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfZG1hX3F1ZXVlX29uZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGRtYXEgKmRtYXEpCi17Ci0JaWYgKGRtYXEtPmJ1ZmZlcikgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGRtYXEtPmJ1ZmZlcl9zaXplICsgMHg4MCwKLQkJCQkgICAgZG1hcS0+YnVmZmVyLCBkbWFxLT5idXNfYWRkcik7Ci0JCW1lbXNldChkbWFxLCAwLCBzaXplb2YoKmRtYXEpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfZG1hX3F1ZXVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBkbWFxICpkbWFxW10gPSB7Ci0JCSZhZGFwdGVyLT5kbWFxMSwKLQkJJmFkYXB0ZXItPmRtYXEyLAotCQlOVUxMCi0JfSwgKipwOwotCi0JZm9yIChwID0gZG1hcTsgKnA7IHArKykKLQkJZnJlZV9kbWFfcXVldWVfb25lKGFkYXB0ZXIsICpwKTsKLQl9Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0KLQlpb3VubWFwKGFkYXB0ZXItPmlvX21lbSk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfYWRhcHRlcl9vYmplY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JY2xvc2Vfc3RyZWFtKGFkYXB0ZXIsIDApOwotCQlmcmVlX2lycShhZGFwdGVyLT5pcnEsIGFkYXB0ZXIpOwotCWZyZWVfZG1hX3F1ZXVlKGFkYXB0ZXIpOwotCXJlbGVhc2VfYWRhcHRlcihhZGFwdGVyKTsKLQlrZnJlZShhZGFwdGVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNreXN0YXIyX3BjaV9kcml2ZXI7Ci0KLXN0YXRpYyBpbnQgY2xhaW1fYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JdTE2IHZhcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDEsIHNreXN0YXIyX3BjaV9kcml2ZXIubmFtZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDAsIHNreXN0YXIyX3BjaV9kcml2ZXIubmFtZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3BjaV9yZWxlYXNlXzE7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZhZGFwdGVyLT5jYXJkX3JldmlzaW9uKTsKLQotCWRwcmludGsoIiVzOiBjYXJkIHJldmlzaW9uICV4IFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5jYXJkX3JldmlzaW9uKTsKLQotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9wY2lfcmVsZWFzZV8wOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgNCwgJnZhcik7Ci0KLQlpZiAoKHZhciAmIDQpID09IDApCi0JCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCi0JYWRhcHRlci0+aW9fcG9ydCA9IHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0OwotCi0JYWRhcHRlci0+aW9fbWVtID0gaW9yZW1hcChwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgMHg4MDApOwotCi0JaWYgKCFhZGFwdGVyLT5pb19tZW0pIHsKLQkJZHByaW50aygiJXM6IGNhbiBub3QgbWFwIGlvIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBlcnJfcGNpX2Rpc2FibGU7Ci0JfQotCi0JZHByaW50aygiJXM6IGlvIG1lbW9yeSBtYXBlZCBhdCAlcFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5pb19tZW0pOwotCi0JcmV0ID0gMTsKLW91dDoKLQlyZXR1cm4gcmV0OwotCi1lcnJfcGNpX2Rpc2FibGU6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotZXJyX3BjaV9yZWxlYXNlXzA6Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOwotZXJyX3BjaV9yZWxlYXNlXzE6Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDEpOwotCWdvdG8gb3V0OwotfQotCi0vKgotc3RhdGljIGludCBzbGxfcmVzZXRfZmxleGNvcChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIDApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIxMCwgMHhiMmZmKTsKLQotCXJldHVybiAwOwotfQotKi8KLQotc3RhdGljIHZvaWQgZGVjaWRlX2hvd19tYW55X2h3X2ZpbHRlcnMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IGh3X2ZpbHRlcnM7Ci0JaW50IG1vZF9vcHRpb25faHdfZmlsdGVyczsKLQotCS8vIEZsZXhDb3AgSUliICYgSUlJIGhhdmUgNiszMiBodyBmaWx0ZXJzICAgIAotCS8vIEZsZXhDb3AgSUkgaGFzIDYgaHcgZmlsdGVycywgZXZlcnkgb3RoZXIgc2hvdWxkIGhhdmUgYXQgbGVhc3QgNgotCXN3aXRjaCAoYWRhcHRlci0+YjJjMl9yZXZpc2lvbikgewotCWNhc2UgMHg4MjoJCS8qIElJICovCi0JCWh3X2ZpbHRlcnMgPSA2OwotCQlicmVhazsKLQljYXNlIDB4YzM6CQkvKiBJSUIgKi8KLQkJaHdfZmlsdGVycyA9IDYgKyAzMjsKLQkJYnJlYWs7Ci0JY2FzZSAweGMwOgkJLyogSUlJICovCi0JCWh3X2ZpbHRlcnMgPSA2ICsgMzI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWh3X2ZpbHRlcnMgPSA2OwotCQlicmVhazsKLQl9Ci0JcHJpbnRrKCIlczogdGhlIGNoaXAgaGFzICVpIGhhcmR3YXJlIGZpbHRlcnMiLCBfX0ZJTEVfXywgaHdfZmlsdGVycyk7Ci0KLQltb2Rfb3B0aW9uX2h3X2ZpbHRlcnMgPSAwOwotCWlmIChlbmFibGVfaHdfZmlsdGVycyA+PSAxKQotCQltb2Rfb3B0aW9uX2h3X2ZpbHRlcnMgKz0gNjsKLQlpZiAoZW5hYmxlX2h3X2ZpbHRlcnMgPj0gMikKLQkJbW9kX29wdGlvbl9od19maWx0ZXJzICs9IDMyOwotCi0JaWYgKG1vZF9vcHRpb25faHdfZmlsdGVycyA+PSBod19maWx0ZXJzKSB7Ci0JCWFkYXB0ZXItPnVzZWFibGVfaHdfZmlsdGVycyA9IGh3X2ZpbHRlcnM7Ci0JfSBlbHNlIHsKLQkJYWRhcHRlci0+dXNlYWJsZV9od19maWx0ZXJzID0gbW9kX29wdGlvbl9od19maWx0ZXJzOwotCQlwcmludGsoIiwgYnV0IG9ubHkgJWQgd2lsbCBiZSB1c2VkIGJlY2F1c2Ugb2YgbW9kdWxlIG9wdGlvbiIsIG1vZF9vcHRpb25faHdfZmlsdGVycyk7Ci0JfQotCXByaW50aygiXG4iKTsKLQlkcHJpbnRrKCIlczogdXNlYWJsZV9oYXJkd2FyZV9maWx0ZXJzIHNldCB0byAlaVxuIiwgX19GSUxFX18sIGFkYXB0ZXItPnVzZWFibGVfaHdfZmlsdGVycyk7Ci19Ci0KLXN0YXRpYyBpbnQgZHJpdmVyX2luaXRpYWxpemUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7Ci0JdTMyIHRtcDsKLQlpbnQgcmV0ID0gLUVOT01FTTsKLQotCWFkYXB0ZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRhcHRlciksIEdGUF9LRVJORUwpOwotCWlmICghYWRhcHRlcikgewotCQlkcHJpbnRrKCIlczogb3V0IG9mIG1lbW9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCW1lbXNldChhZGFwdGVyLCAwLCBzaXplb2Yoc3RydWN0IGFkYXB0ZXIpKTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LGFkYXB0ZXIpOwotCi0JYWRhcHRlci0+cGRldiA9IHBkZXY7Ci0JYWRhcHRlci0+aXJxID0gcGRldi0+aXJxOwotCi0JcmV0ID0gY2xhaW1fYWRhcHRlcihhZGFwdGVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfa2ZyZWU7Ci0KLQlpcnFfZG1hX2VuYWJsZV9kaXNhYmxlX2lycShhZGFwdGVyLCAwKTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaXNyLCAweDQwMDAwMDAsICJTa3lzdGFyMiIsIGFkYXB0ZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkICFcbiIsIF9fRlVOQ1RJT05fXywgcGRldi0+aXJxKTsKLQkJZ290byBlcnJfcmVsZWFzZV9hZGFwdGVyOwotCX0KLQotCXJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MjA4KTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIDApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIxMCwgMHhiMmZmKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIDB4NDApOwotCi0JcmV0ID0gaW5pdF9kbWFfcXVldWUoYWRhcHRlcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2ZyZWVfaXJxOwotCi0JYWRhcHRlci0+YjJjMl9yZXZpc2lvbiA9IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDIwNCkgPj4gMHgxOCk7Ci0KLQlzd2l0Y2ggKGFkYXB0ZXItPmIyYzJfcmV2aXNpb24pIHsKLQljYXNlIDB4ODI6Ci0JCXByaW50aygiJXM6IEZsZXhDb3BJSShyZXYuMTMwKSBjaGlwIGZvdW5kXG4iLCBfX0ZJTEVfXyk7Ci0JCWJyZWFrOwotCWNhc2UgMHhjMzoKLQkJcHJpbnRrKCIlczogRmxleENvcElJQihyZXYuMTk1KSBjaGlwIGZvdW5kXG4iLCBfX0ZJTEVfXyk7Ci0JCWJyZWFrOwotCWNhc2UgMHhjMDoKLQkJcHJpbnRrKCIlczogRmxleENvcElJSShyZXYuMTkyKSBjaGlwIGZvdW5kXG4iLCBfX0ZJTEVfXyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50aygiJXM6IFRoZSByZXZpc2lvbiBvZiB0aGUgRmxleENvcCBjaGlwIG9uIHlvdXIgY2FyZCBpcyAlZFxuIiwgX19GSUxFX18sIGFkYXB0ZXItPmIyYzJfcmV2aXNpb24pOwotCQlwcmludGsoIiVzOiBUaGlzIGRyaXZlciB3b3JrcyBvbmx5IHdpdGggRmxleENvcElJKHJldi4xMzApLCBGbGV4Q29wSUlCKHJldi4xOTUpIGFuZCBGbGV4Q29wSUlJKHJldi4xOTIpLlxuIiwgX19GSUxFX18pOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycl9mcmVlX2RtYV9xdWV1ZTsKLQkJfQotCi0JZGVjaWRlX2hvd19tYW55X2h3X2ZpbHRlcnMoYWRhcHRlcik7Ci0KLQlpbml0X3BpZHMoYWRhcHRlcik7Ci0KLQl0bXAgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDIwNCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDQsIDApOwotCW1kZWxheSgyMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDQsIHRtcCk7Ci0JbWRlbGF5KDEwKTsKLQotCXRtcCA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MzA4KTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgzMDgsIDB4NDAwMCB8IHRtcCk7Ci0KLQlhZGFwdGVyLT5kd19zcmFtX3R5cGUgPSAweDEwMDAwOwotCi0Jc2xsX2RldGVjdF9zcmFtX3NpemUoYWRhcHRlcik7Ci0KLQlkcHJpbnRrKCIlcyBzcmFtIGxlbmd0aCA9ICVkLCBzcmFtIHR5cGU9ICV4XG4iLCBfX0ZVTkNUSU9OX18sIHNyYW1fbGVuZ3RoKGFkYXB0ZXIpLCBhZGFwdGVyLT5kd19zcmFtX3R5cGUpOwotCi0Jc3JhbV9zZXRfbWVkaWFfZGVzdChhZGFwdGVyLCAxKTsKLQlzcmFtX3NldF9uZXRfZGVzdChhZGFwdGVyLCAxKTsKLQotCWN0cmxfZW5hYmxlX3NtYyhhZGFwdGVyLCAwKTsKLQotCXNyYW1fc2V0X2NhaV9kZXN0KGFkYXB0ZXIsIDIpOwotCXNyYW1fc2V0X2Nhb19kZXN0KGFkYXB0ZXIsIDIpOwotCi0JZG1hX2VuYWJsZV9kaXNhYmxlX2lycShhZGFwdGVyLCAxLCAwLCAwKTsKLQotCWlmIChlZXByb21fZ2V0X21hY19hZGRyKGFkYXB0ZXIsIDAsIGFkYXB0ZXItPm1hY19hZGRyKSAhPSAwKSB7Ci0JCXByaW50aygiJXMgTUFDIGFkZHJlc3MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPm1hY19hZGRyWzBdLAotCQkgICAgICAgYWRhcHRlci0+bWFjX2FkZHJbMV0sIGFkYXB0ZXItPm1hY19hZGRyWzJdLCBhZGFwdGVyLT5tYWNfYWRkclszXSwgYWRhcHRlci0+bWFjX2FkZHJbNF0sIGFkYXB0ZXItPm1hY19hZGRyWzVdLAotCQkgICAgICAgYWRhcHRlci0+bWFjX2FkZHJbNl0sIGFkYXB0ZXItPm1hY19hZGRyWzddCi0JCSAgICApOwotCi0JCWNhX3NldF9tYWNfZHN0X2FkZHJfZmlsdGVyKGFkYXB0ZXIsIGFkYXB0ZXItPm1hY19hZGRyKTsKLQkJY3RybF9lbmFibGVfbWFjKGFkYXB0ZXIsIDEpOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5sb2NrKTsKLQotb3V0OgotCXJldHVybiByZXQ7Ci0KLWVycl9mcmVlX2RtYV9xdWV1ZToKLQlmcmVlX2RtYV9xdWV1ZShhZGFwdGVyKTsKLWVycl9mcmVlX2lycToKLQlmcmVlX2lycShwZGV2LT5pcnEsIGFkYXB0ZXIpOwotZXJyX3JlbGVhc2VfYWRhcHRlcjoKLQlyZWxlYXNlX2FkYXB0ZXIoYWRhcHRlcik7Ci1lcnJfa2ZyZWU6Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWtmcmVlKGFkYXB0ZXIpOwotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBkcml2ZXJfaGFsdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlycV9kbWFfZW5hYmxlX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIDApOwotCi0JY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKGFkYXB0ZXIsIDApOwotCi0JZnJlZV9hZGFwdGVyX29iamVjdChhZGFwdGVyKTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBkdmJfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCi17Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikgZHZiZG14LT5wcml2OwotCi0JZHByaW50aygiJXM6IFBJRD0lZCwgdHlwZT0lZFxuIiwgX19GVU5DVElPTl9fLCBkdmJkbXhmZWVkLT5waWQsIGR2YmRteGZlZWQtPnR5cGUpOwotCi0Jb3Blbl9zdHJlYW0oYWRhcHRlciwgZHZiZG14ZmVlZC0+cGlkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGR2Yl9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQotewotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OwotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopIGR2YmRteC0+cHJpdjsKLQotCWRwcmludGsoIiVzOiBQSUQ9JWQsIHR5cGU9JWRcbiIsIF9fRlVOQ1RJT05fXywgZHZiZG14ZmVlZC0+cGlkLCBkdmJkbXhmZWVkLT50eXBlKTsKLQotCWNsb3NlX3N0cmVhbShhZGFwdGVyLCBkdmJkbXhmZWVkLT5waWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGxuYiBjb250cm9sICovCi1zdGF0aWMgdm9pZCBzZXRfdHVuZXJfdG9uZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggdG9uZSkKLXsKLQl1MTYgd3pfaGFsZl9wZXJpb2RfZm9yXzQ1X21oeltdID0geyAweDAxZmYsIDB4MDE1NCwgMHgwMGZmLCAweDAwY2MgfTsKLQl1MTYgYXg7Ci0KLQlkcHJpbnRrKCIlczogJXVcbiIsIF9fRlVOQ1RJT05fXywgdG9uZSk7Ci0KLQlzd2l0Y2ggKHRvbmUpIHsKLQljYXNlIDE6Ci0JCWF4ID0gd3pfaGFsZl9wZXJpb2RfZm9yXzQ1X21oelswXTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlheCA9IHd6X2hhbGZfcGVyaW9kX2Zvcl80NV9taHpbMV07Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJYXggPSB3el9oYWxmX3BlcmlvZF9mb3JfNDVfbWh6WzJdOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWF4ID0gd3pfaGFsZl9wZXJpb2RfZm9yXzQ1X21oelszXTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlheCA9IDA7Ci0JfQotCi0JaWYgKGF4ICE9IDApIHsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjAwLCAoKGF4IDw8IDB4MGYpICsgKGF4ICYgMHg3ZmZmKSkgfCAweDQwMDAwMDAwKTsKLQotCX0gZWxzZSB7Ci0KLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjAwLCAweDQwZmY4MDAwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF90dW5lcl9wb2xhcml0eShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggcG9sYXJpdHkpCi17Ci0JdTMyIHZhcjsKLQotCWRwcmludGsoIiVzIDogcG9sYXJpdHkgPSAldSBcbiIsIF9fRlVOQ1RJT05fXywgcG9sYXJpdHkpOwotCi0JdmFyID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgyMDQpOwotCi0JaWYgKHBvbGFyaXR5ID09IDApIHsKLQkJZHByaW50aygiJXM6IExOQiBwb3dlciBvZmZcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXZhciA9IHZhciB8IDE7Ci0JfTsKLQotCWlmIChwb2xhcml0eSA9PSAxKSB7Ci0JCXZhciA9IHZhciAmIH4xOwotCQl2YXIgPSB2YXIgJiB+NDsKLQl9OwotCi0JaWYgKHBvbGFyaXR5ID09IDIpIHsKLQkJdmFyID0gdmFyICYgfjE7Ci0JCXZhciA9IHZhciB8IDQ7Ci0JfQotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjA0LCB2YXIpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNlcWNfc2VuZF9iaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBkYXRhKQotewotCXNldF90dW5lcl90b25lKGFkYXB0ZXIsIDEpOwotCXVkZWxheShkYXRhID8gNTAwIDogMTAwMCk7Ci0Jc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMCk7Ci0JdWRlbGF5KGRhdGEgPyAxMDAwIDogNTAwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkaXNlcWNfc2VuZF9ieXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgZGF0YSkKLQkJewotCWludCBpLCBwYXIgPSAxLCBkOwotCi0JZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKLQkJZCA9IChkYXRhID4+IGkpICYgMTsKLQkJcGFyIF49IGQ7Ci0JCWRpc2VxY19zZW5kX2JpdChhZGFwdGVyLCBkKTsKLQl9Ci0KLQlkaXNlcWNfc2VuZF9iaXQoYWRhcHRlciwgcGFyKTsKLQkJfQotCi0KLXN0YXRpYyBpbnQgc2VuZF9kaXNlcWNfbXNnKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgbGVuLCB1OCAqbXNnLCB1bnNpZ25lZCBsb25nIGJ1cnN0KQotewotCWludCBpOwotCi0Jc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMCk7Ci0JbWRlbGF5KDE2KTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJZGlzZXFjX3NlbmRfYnl0ZShhZGFwdGVyLCBtc2dbaV0pOwotCi0JbWRlbGF5KDE2KTsKLQotCWlmIChidXJzdCAhPSAtMSkgewotCQlpZiAoYnVyc3QpCi0JCQlkaXNlcWNfc2VuZF9ieXRlKGFkYXB0ZXIsIDB4ZmYpOwotCQllbHNlIHsKLQkJCXNldF90dW5lcl90b25lKGFkYXB0ZXIsIDEpOwotCQkJdWRlbGF5KDEyNTAwKTsKLQkJCXNldF90dW5lcl90b25lKGFkYXB0ZXIsIDApOwotCQl9Ci0JCW1zbGVlcCgyMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmxleGNvcF9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCi17Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0Jc3dpdGNoKHRvbmUpIHsKLQkJY2FzZSBTRUNfVE9ORV9PTjoKLQkJCXNldF90dW5lcl90b25lKGFkYXB0ZXIsIDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0VDX1RPTkVfT0ZGOgotCQkJc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZsZXhjb3BfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCogY21kKQotCQl7Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0JCQlzZW5kX2Rpc2VxY19tc2coYWRhcHRlciwgY21kLT5tc2dfbGVuLCBjbWQtPm1zZywgMCk7Ci0KLQlyZXR1cm4gMDsKLQkJfQotCi1zdGF0aWMgaW50IGZsZXhjb3BfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IG1pbmljbWQpCi17Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0Jc2VuZF9kaXNlcWNfbXNnKGFkYXB0ZXIsIDAsIE5VTEwsIG1pbmljbWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmxleGNvcF9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQotCQl7Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0JZHByaW50aygiJXM6IEZFX1NFVF9WT0xUQUdFXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0Jc3dpdGNoICh2b2x0YWdlKSB7Ci0JY2FzZSBTRUNfVk9MVEFHRV8xMzoKLQkJZHByaW50aygiJXM6IFNFQ19WT0xUQUdFXzEzLCAleFxuIiwgX19GVU5DVElPTl9fLCBTRUNfVk9MVEFHRV8xMyk7Ci0JCXNldF90dW5lcl9wb2xhcml0eShhZGFwdGVyLCAxKTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNFQ19WT0xUQUdFXzE4OgotCQlkcHJpbnRrKCIlczogU0VDX1ZPTFRBR0VfMTgsICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNFQ19WT0xUQUdFXzE4KTsKLQkJc2V0X3R1bmVyX3BvbGFyaXR5KGFkYXB0ZXIsIDIpOwotCQkJcmV0dXJuIDA7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JfQotCi1zdGF0aWMgaW50IGZsZXhjb3Bfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCi0JCXsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlkcHJpbnRrKCIlczogRkVfU0xFRVBcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlzZXRfdHVuZXJfcG9sYXJpdHkoYWRhcHRlciwgMCk7Ci0KLQlpZiAoYWRhcHRlci0+ZmVfc2xlZXApIHJldHVybiBhZGFwdGVyLT5mZV9zbGVlcChmZSk7Ci0JcmV0dXJuIDA7Ci0JCX0KLQotc3RhdGljIHUzMiBmbGV4Y29wX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLQkJewotCXByaW50aygiZmxleGNvcF9pMmNfZnVuY1xuIik7Ci0KLQlyZXR1cm4gSTJDX0ZVTkNfSTJDOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gICAgZmxleGNvcF9hbGdvID0gewotCS5uYW1lCQk9ICJmbGV4Y29wIGkyYyBhbGdvcml0aG0iLAotCS5pZAkJPSBJMkNfQUxHT19CSVQsCi0JLm1hc3Rlcl94ZmVyCT0gbWFzdGVyX3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkJPSBmbGV4Y29wX2kyY19mdW5jLAotfTsKLQotCi0KLQotc3RhdGljIGludCBzYW1zdW5nX3RibXUyNDExMl9zZXRfc3ltYm9sX3JhdGUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiBzcmF0ZSwgdTMyIHJhdGlvKQotewotCXU4IGFjbGsgPSAwOwotCXU4IGJjbGsgPSAwOwotCi0JaWYgKHNyYXRlIDwgMTUwMDAwMCkgeyBhY2xrID0gMHhiNzsgYmNsayA9IDB4NDc7IH0KLQllbHNlIGlmIChzcmF0ZSA8IDMwMDAwMDApIHsgYWNsayA9IDB4Yjc7IGJjbGsgPSAweDRiOyB9Ci0JZWxzZSBpZiAoc3JhdGUgPCA3MDAwMDAwKSB7IGFjbGsgPSAweGI3OyBiY2xrID0gMHg0ZjsgfQotCWVsc2UgaWYgKHNyYXRlIDwgMTQwMDAwMDApIHsgYWNsayA9IDB4Yjc7IGJjbGsgPSAweDUzOyB9Ci0JZWxzZSBpZiAoc3JhdGUgPCAzMDAwMDAwMCkgeyBhY2xrID0gMHhiNjsgYmNsayA9IDB4NTM7IH0KLQllbHNlIGlmIChzcmF0ZSA8IDQ1MDAwMDAwKSB7IGFjbGsgPSAweGI0OyBiY2xrID0gMHg1MTsgfQotCi0Jc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MTMsIGFjbGspOwotCXN0djAyOTlfd3JpdGVyZWcgKGZlLCAweDE0LCBiY2xrKTsKLQlzdHYwMjk5X3dyaXRlcmVnIChmZSwgMHgxZiwgKHJhdGlvID4+IDE2KSAmIDB4ZmYpOwotCXN0djAyOTlfd3JpdGVyZWcgKGZlLCAweDIwLCAocmF0aW8gPj4gIDgpICYgMHhmZik7Ci0Jc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MjEsIChyYXRpbyAgICAgICkgJiAweGYwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQotewotCXU4IGJ1Zls0XTsKLQl1MzIgZGl2OwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlkaXYgPSBwYXJhbXMtPmZyZXF1ZW5jeSAvIDEyNTsKLQotCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwotCWJ1ZlsxXSA9IGRpdiAmIDB4ZmY7Ci0JYnVmWzJdID0gMHg4NDsgIC8vIDB4QzQKLQlidWZbM10gPSAweDA4OwotCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMCkgYnVmWzNdIHw9IDB4MTA7Ci0KLQlpZiAoaTJjX3RyYW5zZmVyICgmYWRhcHRlci0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTggc2Ftc3VuZ190Ym11MjQxMTJfaW5pdHRhYltdID0gewotCSAgICAgMHgwMSwgMHgxNSwKLQkgICAgIDB4MDIsIDB4MzAsCi0JICAgICAweDAzLCAweDAwLAotCSAgICAgMHgwNCwgMHg3RCwKLQkgICAgIDB4MDUsIDB4MzUsCi0JICAgICAweDA2LCAweDAyLAotCSAgICAgMHgwNywgMHgwMCwKLQkgICAgIDB4MDgsIDB4QzMsCi0JICAgICAweDBDLCAweDAwLAotCSAgICAgMHgwRCwgMHg4MSwKLQkgICAgIDB4MEUsIDB4MjMsCi0JICAgICAweDBGLCAweDEyLAotCSAgICAgMHgxMCwgMHg3RSwKLQkgICAgIDB4MTEsIDB4ODQsCi0JICAgICAweDEyLCAweEI5LAotCSAgICAgMHgxMywgMHg4OCwKLQkgICAgIDB4MTQsIDB4ODksCi0JICAgICAweDE1LCAweEM5LAotCSAgICAgMHgxNiwgMHgwMCwKLQkgICAgIDB4MTcsIDB4NUMsCi0JICAgICAweDE4LCAweDAwLAotCSAgICAgMHgxOSwgMHgwMCwKLQkgICAgIDB4MUEsIDB4MDAsCi0JICAgICAweDFDLCAweDAwLAotCSAgICAgMHgxRCwgMHgwMCwKLQkgICAgIDB4MUUsIDB4MDAsCi0JICAgICAweDFGLCAweDNBLAotCSAgICAgMHgyMCwgMHgyRSwKLQkgICAgIDB4MjEsIDB4ODAsCi0JICAgICAweDIyLCAweEZGLAotCSAgICAgMHgyMywgMHhDMSwKLQkgICAgIDB4MjgsIDB4MDAsCi0JICAgICAweDI5LCAweDFFLAotCSAgICAgMHgyQSwgMHgxNCwKLQkgICAgIDB4MkIsIDB4MEYsCi0JICAgICAweDJDLCAweDA5LAotCSAgICAgMHgyRCwgMHgwNSwKLQkgICAgIDB4MzEsIDB4MUYsCi0JICAgICAweDMyLCAweDE5LAotCSAgICAgMHgzMywgMHhGRSwKLQkgICAgIDB4MzQsIDB4OTMsCi0JICAgICAweGZmLCAweGZmLAotCQkJfTsKLQotc3RhdGljIHN0cnVjdCBzdHYwMjk5X2NvbmZpZyBzYW1zdW5nX3RibXUyNDExMl9jb25maWcgPSB7Ci0JLmRlbW9kX2FkZHJlc3MgPSAweDY4LAotCS5pbml0dGFiID0gc2Ftc3VuZ190Ym11MjQxMTJfaW5pdHRhYiwKLQkubWNsayA9IDg4MDAwMDAwVUwsCi0JLmludmVydCA9IDAsCi0JLmVuaGFuY2VkX3R1bmluZyA9IDAsCi0JLnNraXBfcmVpbml0ID0gMCwKLQkubG9ja19vdXRwdXQgPSBTVFYwMjI5X0xPQ0tPVVRQVVRfTEssCi0JLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AxLAotCS5taW5fZGVsYXlfbXMgPSAxMDAsCi0JLnNldF9zeW1ib2xfcmF0ZSA9IHNhbXN1bmdfdGJtdTI0MTEyX3NldF9zeW1ib2xfcmF0ZSwKLSAgIAkucGxsX3NldCA9IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQsCi19OwotCi0KLQotc3RhdGljIGludCBueHQyMDAyX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQotewotCXN0cnVjdCBhZGFwdGVyKiBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyKikgZmUtPmR2Yi0+cHJpdjsKLQotCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlKGZ3LCBuYW1lLCAmYWRhcHRlci0+cGRldi0+ZGV2KTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IG54dDIwMDJfY29uZmlnIHNhbXN1bmdfdGJtdl9jb25maWcgPSB7Ci0JLmRlbW9kX2FkZHJlc3MgPSAweDBBLAotCS5yZXF1ZXN0X2Zpcm13YXJlID0gbnh0MjAwMl9yZXF1ZXN0X2Zpcm13YXJlLAotfTsKLQotc3RhdGljIGludCBzYW1zdW5nX3RkdGM5MjUxZGgwX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCi17Ci0Jc3RhdGljIHU4IG10MzUyX2Nsb2NrX2NvbmZpZyBbXSA9IHsgMHg4OSwgMHgxOCwgMHgyZCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9yZXNldCBbXSA9IHsgMHg1MCwgMHg4MCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9hZGNfY3RsXzFfY2ZnIFtdID0geyAweDhFLCAweDQwIH07Ci0Jc3RhdGljIHU4IG10MzUyX2FnY19jZmcgW10gPSB7IDB4NjcsIDB4MjgsIDB4YTEgfTsKLQlzdGF0aWMgdTggbXQzNTJfY2FwdF9yYW5nZV9jZmdbXSA9IHsgMHg3NSwgMHgzMiB9OwotCi0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2Nsb2NrX2NvbmZpZywgc2l6ZW9mKG10MzUyX2Nsb2NrX2NvbmZpZykpOwotCXVkZWxheSgyMDAwKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfcmVzZXQsIHNpemVvZihtdDM1Ml9yZXNldCkpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZGNfY3RsXzFfY2ZnLCBzaXplb2YobXQzNTJfYWRjX2N0bF8xX2NmZykpOwotCi0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FnY19jZmcsIHNpemVvZihtdDM1Ml9hZ2NfY2ZnKSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2NhcHRfcmFuZ2VfY2ZnLCBzaXplb2YobXQzNTJfY2FwdF9yYW5nZV9jZmcpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhbXN1bmdfdGR0YzkyNTFkaDBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHU4KiBwbGxidWYpCi17Ci0JdTMyIGRpdjsKLQl1bnNpZ25lZCBjaGFyIGJzID0gMDsKLQotCSNkZWZpbmUgSUZfRlJFUVVFTkNZeDYgMjE3ICAgIC8qIDYgKiAzNi4xNjY2NjY2NjY2N01IeiAqLwotCWRpdiA9ICgoKHBhcmFtcy0+ZnJlcXVlbmN5ICsgODMzMzMpICogMykgLyA1MDAwMDApICsgSUZfRlJFUVVFTkNZeDY7Ci0KLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPj0gNDgwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gMTU0MDAwMDAwKSBicyA9IDB4MDk7Ci0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID49IDE2MTAwMDAwMCAmJiBwYXJhbXMtPmZyZXF1ZW5jeSA8PSA0MzkwMDAwMDApIGJzID0gMHgwYTsKLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPj0gNDQ3MDAwMDAwICYmIHBhcmFtcy0+ZnJlcXVlbmN5IDw9IDg2MzAwMDAwMCkgYnMgPSAweDA4OwotCi0JcGxsYnVmWzBdID0gMHhjMjsgLy8gTm90ZTogbm9uLWxpbnV4IHN0YW5kYXJkIFBMTCBpMmMgYWRkcmVzcwotCXBsbGJ1ZlsxXSA9IGRpdiA+PiA4OwotICAgCXBsbGJ1ZlsyXSA9IGRpdiAmIDB4ZmY7Ci0gICAJcGxsYnVmWzNdID0gMHhjYzsKLSAgIAlwbGxidWZbNF0gPSBiczsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBzYW1zdW5nX3RkdGM5MjUxZGgwX2NvbmZpZyA9IHsKLQotCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKLQkuZGVtb2RfaW5pdCA9IHNhbXN1bmdfdGR0YzkyNTFkaDBfZGVtb2RfaW5pdCwKLSAgIAkucGxsX3NldCA9IHNhbXN1bmdfdGR0YzkyNTFkaDBfcGxsX3NldCwKLX07Ci0KLXN0YXRpYyBpbnQgc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQotewotCXU4IGJ1Zls0XTsKLQl1MzIgZGl2OwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlkaXYgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyAoMTI1LzIpKSAvIDEyNTsKLQotCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwotCWJ1ZlsxXSA9IChkaXYgPj4gMCkgJiAweGZmOwotCWJ1ZlsyXSA9IDB4ODQgfCAoKGRpdiA+PiAxMCkgJiAweDYwKTsKLQlidWZbM10gPSAweDgwOwotCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTU1MDAwMCkKLQkJYnVmWzNdIHw9IDB4MDI7Ci0KLQlpZiAoaTJjX3RyYW5zZmVyICgmYWRhcHRlci0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG10MzEyX2NvbmZpZyBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfY29uZmlnID0gewotCi0JLmRlbW9kX2FkZHJlc3MgPSAweDBlLAotICAgCS5wbGxfc2V0ID0gc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3BsbF9zZXQsCi19OwotCi0KLQotCi1zdGF0aWMgdm9pZCBmcm9udGVuZF9pbml0KHN0cnVjdCBhZGFwdGVyICpza3lzdGFyMikKLXsKLQlzd2l0Y2goc2t5c3RhcjItPnBkZXYtPmRldmljZSkgewotCWNhc2UgMHgyMTAzOiAvLyBUZWNobmlzYXQgU2t5c3RhcjIgT1IgVGVjaG5pc2F0IEFpcnN0YXIyIChEVkItVCBvciBBVFNDKQotCi0JCS8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgTmV4dHdhdmUgbnh0MjAwMiBmb3IgQVRTQyBzdXBwb3J0IAotCQlza3lzdGFyMi0+ZmUgPSBueHQyMDAyX2F0dGFjaCgmc2Ftc3VuZ190Ym12X2NvbmZpZywgJnNreXN0YXIyLT5pMmNfYWRhcCk7Ci0JCWlmIChza3lzdGFyMi0+ZmUgIT0gTlVMTCkgewotCQkJc2t5c3RhcjItPmZlX3NsZWVwID0gc2t5c3RhcjItPmZlLT5vcHMtPnNsZWVwOwotCQkJc2t5c3RhcjItPmZlLT5vcHMtPnNsZWVwID0gZmxleGNvcF9zbGVlcDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gdHJ5IHRoZSBza3lzdGFyMiB2Mi42IGZpcnN0IChzdHYwMjk5L1NhbXN1bmcgdGJtdTI0MTEyKHNsMTkzNSkpCi0JCXNreXN0YXIyLT5mZSA9IHN0djAyOTlfYXR0YWNoKCZzYW1zdW5nX3RibXUyNDExMl9jb25maWcsICZza3lzdGFyMi0+aTJjX2FkYXApOwotCQlpZiAoc2t5c3RhcjItPmZlICE9IE5VTEwpIHsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSA9IGZsZXhjb3Bfc2V0X3ZvbHRhZ2U7Ci0JCQlza3lzdGFyMi0+ZmVfc2xlZXAgPSBza3lzdGFyMi0+ZmUtPm9wcy0+c2xlZXA7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+c2xlZXAgPSBmbGV4Y29wX3NsZWVwOwotCQkJYnJlYWs7Ci19Ci0KLQkJLy8gdHJ5IHRoZSBhaXJzdGFyMiAobXQzNTIvU2Ftc3VuZyB0ZHRjOTI1MWRoMCg/PykpCi0JCXNreXN0YXIyLT5mZSA9IG10MzUyX2F0dGFjaCgmc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcsICZza3lzdGFyMi0+aTJjX2FkYXApOwotCQlpZiAoc2t5c3RhcjItPmZlICE9IE5VTEwpIHsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9taW4gPSA0NzQwMDAwMDA7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWF4ID0gODU4MDAwMDAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyB0cnkgdGhlIHNreXN0YXIyIHYyLjMgKHZwMzEwL1NhbXN1bmcgdGJkdTE4MTMyKHRzYTUwNTkpKQotCQlza3lzdGFyMi0+ZmUgPSB2cDMxMF9hdHRhY2goJnNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcsICZza3lzdGFyMi0+aTJjX2FkYXApOwotCQlpZiAoc2t5c3RhcjItPmZlICE9IE5VTEwpIHsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZmxleGNvcF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJc2t5c3RhcjItPmZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gZmxleGNvcF9kaXNlcWNfc2VuZF9idXJzdDsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5zZXRfdG9uZSA9IGZsZXhjb3Bfc2V0X3RvbmU7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBmbGV4Y29wX3NldF92b2x0YWdlOwotCQkJc2t5c3RhcjItPmZlX3NsZWVwID0gc2t5c3RhcjItPmZlLT5vcHMtPnNsZWVwOwotCQkJc2t5c3RhcjItPmZlLT5vcHMtPnNsZWVwID0gZmxleGNvcF9zbGVlcDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWlmIChza3lzdGFyMi0+ZmUgPT0gTlVMTCkgewotCQlwcmludGsoInNreXN0YXIyOiBBIGZyb250ZW5kIGRyaXZlciB3YXMgbm90IGZvdW5kIGZvciBkZXZpY2UgJTA0eC8lMDR4IHN1YnN5c3RlbSAlMDR4LyUwNHhcbiIsCi0JCSAgICAgICBza3lzdGFyMi0+cGRldi0+dmVuZG9yLAotCQkgICAgICAgc2t5c3RhcjItPnBkZXYtPmRldmljZSwKLQkJICAgICAgIHNreXN0YXIyLT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAotCQkgICAgICAgc2t5c3RhcjItPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwotCX0gZWxzZSB7Ci0JCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJnNreXN0YXIyLT5kdmJfYWRhcHRlciwgc2t5c3RhcjItPmZlKSkgewotCQkJcHJpbnRrKCJza3lzdGFyMjogRnJvbnRlbmQgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIpOwotCQkJaWYgKHNreXN0YXIyLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJCXNreXN0YXIyLT5mZS0+b3BzLT5yZWxlYXNlKHNreXN0YXIyLT5mZSk7Ci0JCQlza3lzdGFyMi0+ZmUgPSBOVUxMOwotCQl9Ci0JfQotfQotCi0KLXN0YXRpYyBpbnQgc2t5c3RhcjJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7Ci0Jc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcjsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eDsKLQlzdHJ1Y3QgZG14X2RlbXV4ICpkbXg7Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0KLQlpZiAoIXBkZXYpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gZHJpdmVyX2luaXRpYWxpemUocGRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlkdmJfYWRhcHRlciA9ICZhZGFwdGVyLT5kdmJfYWRhcHRlcjsKLQotCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKGR2Yl9hZGFwdGVyLCBza3lzdGFyMl9wY2lfZHJpdmVyLm5hbWUsCi0JCQkJICAgVEhJU19NT0RVTEUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiJXM6IEVycm9yIHJlZ2lzdGVyaW5nIERWQiBhZGFwdGVyXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlnb3RvIGVycl9oYWx0OwotCX0KLQotCWR2Yl9hZGFwdGVyLT5wcml2ID0gYWRhcHRlcjsKLQotCi0JaW5pdF9NVVRFWCgmYWRhcHRlci0+aTJjX3NlbSk7Ci0KLQotCW1lbXNldCgmYWRhcHRlci0+aTJjX2FkYXAsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpKTsKLQlzdHJjcHkoYWRhcHRlci0+aTJjX2FkYXAubmFtZSwgIlNreVN0YXIyIik7Ci0KLQlpMmNfc2V0X2FkYXBkYXRhKCZhZGFwdGVyLT5pMmNfYWRhcCwgYWRhcHRlcik7Ci0KLSNpZmRlZiBJMkNfQURBUF9DTEFTU19UVl9ESUdJVEFMCi0JYWRhcHRlci0+aTJjX2FkYXAuY2xhc3MgCSAgICA9IEkyQ19BREFQX0NMQVNTX1RWX0RJR0lUQUw7Ci0jZWxzZQotCWFkYXB0ZXItPmkyY19hZGFwLmNsYXNzIAkgICAgPSBJMkNfQ0xBU1NfVFZfRElHSVRBTDsKLSNlbmRpZgotCWFkYXB0ZXItPmkyY19hZGFwLmFsZ28gICAgICAgICAgICAgID0gJmZsZXhjb3BfYWxnbzsKLQlhZGFwdGVyLT5pMmNfYWRhcC5hbGdvX2RhdGEgICAgICAgICA9IE5VTEw7Ci0JYWRhcHRlci0+aTJjX2FkYXAuaWQgICAgICAgICAgICAgICAgPSBJMkNfQUxHT19CSVQ7Ci0KLQlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmFkYXB0ZXItPmkyY19hZGFwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZHZiX3VucmVnaXN0ZXI7Ci0KLQlkdmJkZW11eCA9ICZhZGFwdGVyLT5kZW11eDsKLQotCWR2YmRlbXV4LT5wcml2ID0gYWRhcHRlcjsKLQlkdmJkZW11eC0+ZmlsdGVybnVtID0gTl9QSURfU0xPVFM7Ci0JZHZiZGVtdXgtPmZlZWRudW0gPSBOX1BJRF9TTE9UUzsKLQlkdmJkZW11eC0+c3RhcnRfZmVlZCA9IGR2Yl9zdGFydF9mZWVkOwotCWR2YmRlbXV4LT5zdG9wX2ZlZWQgPSBkdmJfc3RvcF9mZWVkOwotCWR2YmRlbXV4LT53cml0ZV90b19kZWNvZGVyID0gTlVMTDsKLQlkdmJkZW11eC0+ZG14LmNhcGFiaWxpdGllcyA9IChETVhfVFNfRklMVEVSSU5HIHwgRE1YX1NFQ1RJT05fRklMVEVSSU5HIHwgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkcpOwotCi0JcmV0ID0gZHZiX2RteF9pbml0KCZhZGFwdGVyLT5kZW11eCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2kyY19kZWw7Ci0KLQlkbXggPSAmZHZiZGVtdXgtPmRteDsKLQotCWFkYXB0ZXItPmh3X2Zyb250ZW5kLnNvdXJjZSA9IERNWF9GUk9OVEVORF8wOwotCWFkYXB0ZXItPmRteGRldi5maWx0ZXJudW0gPSBOX1BJRF9TTE9UUzsKLQlhZGFwdGVyLT5kbXhkZXYuZGVtdXggPSBkbXg7Ci0JYWRhcHRlci0+ZG14ZGV2LmNhcGFiaWxpdGllcyA9IDA7Ci0KLQlyZXQgPSBkdmJfZG14ZGV2X2luaXQoJmFkYXB0ZXItPmRteGRldiwgJmFkYXB0ZXItPmR2Yl9hZGFwdGVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZG14X3JlbGVhc2U7Ci0KLQlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZhZGFwdGVyLT5od19mcm9udGVuZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2RteGRldl9yZWxlYXNlOwotCi0JYWRhcHRlci0+bWVtX2Zyb250ZW5kLnNvdXJjZSA9IERNWF9NRU1PUllfRkU7Ci0KLQlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZhZGFwdGVyLT5tZW1fZnJvbnRlbmQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9yZW1vdmVfaHdfZnJvbnRlbmQ7Ci0KLQlyZXQgPSBkbXgtPmNvbm5lY3RfZnJvbnRlbmQoZG14LCAmYWRhcHRlci0+aHdfZnJvbnRlbmQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9yZW1vdmVfbWVtX2Zyb250ZW5kOwotCi0JZHZiX25ldF9pbml0KCZhZGFwdGVyLT5kdmJfYWRhcHRlciwgJmFkYXB0ZXItPmR2Ym5ldCwgJmR2YmRlbXV4LT5kbXgpOwotCi0JZnJvbnRlbmRfaW5pdChhZGFwdGVyKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotCi1lcnJfcmVtb3ZlX21lbV9mcm9udGVuZDoKLQlkdmJkZW11eC0+ZG14LnJlbW92ZV9mcm9udGVuZCgmZHZiZGVtdXgtPmRteCwgJmFkYXB0ZXItPm1lbV9mcm9udGVuZCk7Ci1lcnJfcmVtb3ZlX2h3X2Zyb250ZW5kOgotCWR2YmRlbXV4LT5kbXgucmVtb3ZlX2Zyb250ZW5kKCZkdmJkZW11eC0+ZG14LCAmYWRhcHRlci0+aHdfZnJvbnRlbmQpOwotZXJyX2RteGRldl9yZWxlYXNlOgotCWR2Yl9kbXhkZXZfcmVsZWFzZSgmYWRhcHRlci0+ZG14ZGV2KTsKLWVycl9kbXhfcmVsZWFzZToKLQlkdmJfZG14X3JlbGVhc2UoJmFkYXB0ZXItPmRlbXV4KTsKLWVycl9pMmNfZGVsOgotCWkyY19kZWxfYWRhcHRlcigmYWRhcHRlci0+aTJjX2FkYXApOwotZXJyX2R2Yl91bnJlZ2lzdGVyOgotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmFkYXB0ZXItPmR2Yl9hZGFwdGVyKTsKLWVycl9oYWx0OgotCWRyaXZlcl9oYWx0KHBkZXYpOwotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBza3lzdGFyMl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXg7Ci0Jc3RydWN0IGRteF9kZW11eCAqZG14OwotCi0JaWYgKCFhZGFwdGVyKQotCQlyZXR1cm47Ci0KLQkJZHZiX25ldF9yZWxlYXNlKCZhZGFwdGVyLT5kdmJuZXQpOwotCQlkdmJkZW11eCA9ICZhZGFwdGVyLT5kZW11eDsKLQlkbXggPSAmZHZiZGVtdXgtPmRteDsKLQotCWRteC0+Y2xvc2UoZG14KTsKLQlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZhZGFwdGVyLT5od19mcm9udGVuZCk7Ci0JZG14LT5yZW1vdmVfZnJvbnRlbmQoZG14LCAmYWRhcHRlci0+bWVtX2Zyb250ZW5kKTsKLQotCQlkdmJfZG14ZGV2X3JlbGVhc2UoJmFkYXB0ZXItPmRteGRldik7Ci0JZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKLQotCWlmIChhZGFwdGVyLT5mZSAhPSBOVUxMKQotCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChhZGFwdGVyLT5mZSk7Ci0KLQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZhZGFwdGVyLT5kdmJfYWRhcHRlcik7Ci0KLQkJCWkyY19kZWxfYWRhcHRlcigmYWRhcHRlci0+aTJjX2FkYXApOwotCi0JCWRyaXZlcl9oYWx0KHBkZXYpOwotCX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNreXN0YXIyX3BjaV90YmxbXSA9IHsKLQl7MHgwMDAwMTNkMCwgMHgwMDAwMjEwMywgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCi0vKgl7MHgwMDAwMTNkMCwgMHgwMDAwMjIwMCwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sIFVOREVGSU5FRCBIQVJEV0FSRSAtIG1haWwgbGludXh0di5vcmcgbGlzdCAqLwkvL0ZDSUlJCi0JezAsfSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBza3lzdGFyMl9wY2lfdGJsKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNreXN0YXIyX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiU2t5U3RhcjIiLAotCS5pZF90YWJsZSA9IHNreXN0YXIyX3BjaV90YmwsCi0JLnByb2JlID0gc2t5c3RhcjJfcHJvYmUsCi0JLnJlbW92ZSA9IHNreXN0YXIyX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgc2t5c3RhcjJfaW5pdCh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZza3lzdGFyMl9wY2lfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgc2t5c3RhcjJfY2xlYW51cCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2t5c3RhcjJfcGNpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHNreXN0YXIyX2luaXQpOwotbW9kdWxlX2V4aXQoc2t5c3RhcjJfY2xlYW51cCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVGVjaG5pc2F0IFNreVN0YXIyIERWQiBQQ0kgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCmluZGV4IDEzMzk5MTIuLjA3YTBiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCkBAIC0yNTgsMTAgKzI1OCwxMCBAQAogCWlmIChkZWJ1ZyAmJiAodmVyYm9zZSA+IDQpKSB7CiAJCXU4IGk7CiAJCWlmICh2ZXJib3NlID4gNCkgewotCQkJZHByaW50aygiJXMgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHJpbnRrKCIlcyB3cml0aW5nIFsgIiwgX19GVU5DVElPTl9fKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCQlkcHJpbnRrKCIgJTAyeCIsIGRhdGFbaV0pOwotCQkJZHByaW50aygiXG4iKTsKKwkJCQlkcHJpbnRrKCIlMDJ4ICIsIGRhdGFbaV0pOworCQkJZHByaW50aygiXVxuIik7CiAJCX0KIAl9CiAJZm9yIChjbnQgPSAwOyBjbnQgPCAyOyBjbnQrKykgewpAQCAtMzIwLDEwICszMjAsMjkgQEAKIH0KIEVYUE9SVF9TWU1CT0wocmVhZF9kc3QpOwogCitzdGF0aWMgaW50IGRzdF9zZXRfcG9sYXJpemF0aW9uKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUtPnZvbHRhZ2UpIHsKKwkJY2FzZSBTRUNfVk9MVEFHRV8xMzoJLy8gdmVydGljYWwKKwkJCXByaW50aygiJXM6IFBvbGFyaXphdGlvbj1bVmVydGljYWxdXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJc3RhdGUtPnR4X3R1bmFbOF0gJj0gfjB4NDA7ICAvLzEKKwkJCWJyZWFrOworCisJCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CS8vIGhvcml6b250YWwKKwkJCXByaW50aygiJXM6IFBvbGFyaXphdGlvbj1bSG9yaXpvbnRhbF1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDQwOyAgLy8gMAorCQkJYnJlYWs7CisKKwkJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRzdF9zZXRfZnJlcShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgdTMyIGZyZXEpCiB7Ci0JdTggKnZhbDsKLQogCXN0YXRlLT5mcmVxdWVuY3kgPSBmcmVxOwogCWlmIChkZWJ1ZyA+IDQpCiAJCWRwcmludGsoIiVzOiBzZXQgRnJlcXVlbmN5ICV1XG4iLCBfX0ZVTkNUSU9OX18sIGZyZXEpOwpAQCAtMzMyLDQ2ICszNTEsMzAgQEAKIAkJZnJlcSA9IGZyZXEgLyAxMDAwOwogCQlpZiAoZnJlcSA8IDk1MCB8fCBmcmVxID4gMjE1MCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgPSAmc3RhdGUtPnR4X3R1bmFbMF07Ci0JCXZhbFsyXSA9IChmcmVxID4+IDgpICYgMHg3ZjsKLQkJdmFsWzNdID0gKHU4KSBmcmVxOwotCQl2YWxbNF0gPSAxOwotCQl2YWxbOF0gJj0gfjQ7Ci0JCWlmIChmcmVxIDwgMTUzMSkKLQkJCXZhbFs4XSB8PSA0OworCisJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gOCk7CisJCXN0YXRlLT50eF90dW5hWzNdID0gKHU4KSBmcmVxOworCQlzdGF0ZS0+dHhfdHVuYVs0XSA9IDB4MDE7CisJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDA0OworCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpIHsKKwkJCWlmIChmcmVxIDwgMTUzMSkKKwkJCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDA0OworCQl9CisKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKSB7CiAJCWZyZXEgPSBmcmVxIC8gMTAwMDsKIAkJaWYgKGZyZXEgPCAxMzcwMDAgfHwgZnJlcSA+IDg1ODAwMCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgPSAmc3RhdGUtPnR4X3R1bmFbMF07Ci0JCXZhbFsyXSA9IChmcmVxID4+IDE2KSAmIDB4ZmY7Ci0JCXZhbFszXSA9IChmcmVxID4+IDgpICYgMHhmZjsKLQkJdmFsWzRdID0gKHU4KSBmcmVxOwotCQl2YWxbNV0gPSAwOwotCQlzd2l0Y2ggKHN0YXRlLT5iYW5kd2lkdGgpIHsKLQkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6Ci0JCQl2YWxbNl0gPSA2OwotCQkJYnJlYWs7CiAKLQkJY2FzZSBCQU5EV0lEVEhfN19NSFo6Ci0JCWNhc2UgQkFORFdJRFRIX0FVVE86Ci0JCQl2YWxbNl0gPSA3OwotCQkJYnJlYWs7CisJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKKwkJc3RhdGUtPnR4X3R1bmFbM10gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7CisJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOwogCi0JCWNhc2UgQkFORFdJRFRIXzhfTUhaOgotCQkJdmFsWzZdID0gODsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJdmFsWzddID0gMDsKLQkJdmFsWzhdID0gMDsKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgewotCQkvKiBndWVzcyB0aWxsIHdpbGwgZ2V0IG9uZSAqLwotCQlmcmVxID0gZnJlcSAvIDEwMDA7Ci0JCXZhbCA9ICZzdGF0ZS0+dHhfdHVuYVswXTsKLQkJdmFsWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKLQkJdmFsWzNdID0gKGZyZXEgPj4gOCkgJiAweGZmOwotCQl2YWxbNF0gPSAodTgpIGZyZXE7CisJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKKwkJc3RhdGUtPnR4X3R1bmFbM10gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7CisJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOworCiAJfSBlbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwpAQCAtMzc5LDUxICszODIsNTggQEAKIAogc3RhdGljIGludCBkc3Rfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSwgZmVfYmFuZHdpZHRoX3QgYmFuZHdpZHRoKQogewotCXU4ICp2YWw7Ci0KIAlzdGF0ZS0+YmFuZHdpZHRoID0gYmFuZHdpZHRoOwogCiAJaWYgKHN0YXRlLT5kc3RfdHlwZSAhPSBEU1RfVFlQRV9JU19URVJSKQogCQlyZXR1cm4gMDsKIAotCXZhbCA9ICZzdGF0ZS0+dHhfdHVuYVswXTsKIAlzd2l0Y2ggKGJhbmR3aWR0aCkgewotCWNhc2UgQkFORFdJRFRIXzZfTUhaOgotCQl2YWxbNl0gPSA2OwotCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCisJCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDA2OworCQkJZWxzZSB7CisJCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAweDA2OworCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsKKwkJCX0KKwkJCWJyZWFrOwogCi0JY2FzZSBCQU5EV0lEVEhfN19NSFo6Ci0JCXZhbFs2XSA9IDc7Ci0JCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19DQSkKKwkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDc7CisJCQllbHNlIHsKKwkJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9IDB4MDc7CisJCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOworCQkJfQorCQkJYnJlYWs7CiAKLQljYXNlIEJBTkRXSURUSF84X01IWjoKLQkJdmFsWzZdID0gODsKLQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQorCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwODsKKwkJCWVsc2UgeworCQkJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwODsKKwkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDA7CisJCQl9CisJCQlicmVhazsKIAotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRzdF9zZXRfaW52ZXJzaW9uKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb24pCiB7Ci0JdTggKnZhbDsKLQogCXN0YXRlLT5pbnZlcnNpb24gPSBpbnZlcnNpb247Ci0KLQl2YWwgPSAmc3RhdGUtPnR4X3R1bmFbMF07Ci0KLQl2YWxbOF0gJj0gfjB4ODA7Ci0KIAlzd2l0Y2ggKGludmVyc2lvbikgewotCWNhc2UgSU5WRVJTSU9OX09GRjoKLQkJYnJlYWs7Ci0JY2FzZSBJTlZFUlNJT05fT046Ci0JCXZhbFs4XSB8PSAweDgwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBJTlZFUlNJT05fT0ZGOgkvLyBJbnZlcnNpb24gPSBOb3JtYWwKKwkJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDgwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTlZFUlNJT05fT046CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00NzgsNiArNDg4LDUyIEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIGludCBkc3Rfc2V0X21vZHVsYXRpb24oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uKQoreworCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfQ0FCTEUpCisJCXJldHVybiAwOworCisJc3RhdGUtPm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uOworCXN3aXRjaCAobW9kdWxhdGlvbikgeworCQljYXNlIFFBTV8xNjoKKwkJCXN0YXRlLT50eF90dW5hWzhdID0gMHgxMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUUFNXzMyOgorCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDIwOworCQkJYnJlYWs7CisKKwkJY2FzZSBRQU1fNjQ6CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4NDA7CisJCQlicmVhazsKKworCQljYXNlIFFBTV8xMjg6CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4ODA7CisJCQlicmVhazsKKworCQljYXNlIFFBTV8yNTY6CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MDA7CisJCQlicmVhazsKKworCQljYXNlIFFQU0s6CisJCWNhc2UgUUFNX0FVVE86CisJCWNhc2UgVlNCXzg6CisJCWNhc2UgVlNCXzE2OgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGZlX21vZHVsYXRpb25fdCBkc3RfZ2V0X21vZHVsYXRpb24oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLT5tb2R1bGF0aW9uOworfQorCisKIHU4IGRzdF9jaGVja19zdW0odTggKiBidWYsIHUzMiBsZW4pCiB7CiAJdTMyIGk7CkBAIC01NzcsNyArNjMzLDcgQEAKIAkJLmRldmljZV9pZCA9ICIyMDAxMDNBIiwKIAkJLm9mZnNldCA9IDAsCiAJCS5kc3RfdHlwZSA9ICBEU1RfVFlQRV9JU19TQVQsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19TWU1ESVYgfCBEU1RfVFlQRV9IQVNfRldfMSB8IERTVF9UWVBFX0hBU19PQlNfUkVHUywKIAkJLmRzdF9mZWF0dXJlID0gMAogCX0sCS8qCW9ic29sZXRlCSovCiAKQEAgLTYyNiw3ICs2ODIsNyBAQAogCQkuZGV2aWNlX2lkID0gIkRTVE1DSSIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18yIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEIHwgRFNUX1RZUEVfSEFTX0lOQ19DT1VOVCwKIAkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBIHwgRFNUX1RZUEVfSEFTX0RJU0VRQzMgfCBEU1RfVFlQRV9IQVNfRElTRVFDNAogCQkJCQkJCXwgRFNUX1RZUEVfSEFTX01PVE8gfCBEU1RfVFlQRV9IQVNfTUFDCiAJfSwKQEAgLTg3Miw3ICs5MjgsNyBAQAogewogCWludCByZXR2YWw7CiAJdTggZ2V0X3NpZ25hbFtdID0geyAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZiIH07Ci0KKwlkcHJpbnRrKCIlczogR2V0dGluZyBTaWduYWwgc3RyZW5ndGggYW5kIG90aGVyIHBhcmFtZXRlcnNcbiIsIF9fRlVOQ1RJT05fXyk7CiAJaWYgKChzdGF0ZS0+ZGlzZXFfZmxhZ3MgJiBBVFRFTVBUX1RVTkUpID09IDApIHsKIAkJc3RhdGUtPmRlY29kZV9sb2NrID0gc3RhdGUtPmRlY29kZV9zdHJlbmd0aCA9IHN0YXRlLT5kZWNvZGVfc25yID0gMDsKIAkJcmV0dXJuIDA7CkBAIC05NTQsMTUgKzEwMTAsOCBAQAogCXN0YXRlLT5kZWNvZGVfZnJlcSA9ICgoc3RhdGUtPnJ4X3R1bmFbMl0gJiAweDdmKSA8PCA4KSArIHN0YXRlLT5yeF90dW5hWzNdOwogCiAJc3RhdGUtPmRlY29kZV9sb2NrID0gMTsKLQkvKgotCSAgIGRzdC0+ZGVjb2RlX24xID0gKGRzdC0+cnhfdHVuYVs0XSA8PCA4KSArCi0JICAgKGRzdC0+cnhfdHVuYVs1XSk7Ci0KLQkgICBkc3QtPmRlY29kZV9uMiA9IChkc3QtPnJ4X3R1bmFbOF0gPDwgOCkgKwotCSAgIChkc3QtPnJ4X3R1bmFbN10pOwotCSAqLwogCXN0YXRlLT5kaXNlcV9mbGFncyB8PSBIQVNfTE9DSzsKLQkvKiBkc3QtPmN1cl9qaWZmID0gamlmZmllczsgKi8KKwogCXJldHVybiAxOwogfQogCkBAIC0xMDk4LDcgKzExNDcsMTEgQEAKIAogCXN3aXRjaCAodG9uZSkgewogCQljYXNlIFNFQ19UT05FX09GRjoKLQkJCXN0YXRlLT50eF90dW5hWzJdID0gMHhmZjsKKwkJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19PQlNfUkVHUykKKwkJCSAgICBzdGF0ZS0+dHhfdHVuYVsyXSA9IDB4MDA7CisJCQllbHNlCisJCQkgICAgc3RhdGUtPnR4X3R1bmFbMl0gPSAweGZmOworCiAJCQlicmVhazsKIAogCQljYXNlIFNFQ19UT05FX09OOgpAQCAtMTE0NSw3ICsxMTk4LDggQEAKIAlzdGF0aWMgdTggaW5pX3R2Y2lfdHVuYVtdID0geyA5LCAwLCAzLCAweGI2LCAxLCA3LCAweDAsIDB4MCwgMCwgMCB9OwogCXN0YXRpYyB1OCBpbmlfY2FiZnRhX3R1bmFbXSA9IHsgMCwgMCwgMywgMHhiNiwgMSwgNywgMHgwLCAweDAsIDAsIDAgfTsKIAlzdGF0aWMgdTggaW5pX2NhYmNpX3R1bmFbXSA9IHsgOSwgMCwgMywgMHhiNiwgMSwgNywgMHgwLCAweDAsIDAsIDAgfTsKLQlzdGF0ZS0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09OOworLy8Jc3RhdGUtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PTjsKKwlzdGF0ZS0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09GRjsKIAlzdGF0ZS0+dm9sdGFnZSA9IFNFQ19WT0xUQUdFXzEzOwogCXN0YXRlLT50b25lID0gU0VDX1RPTkVfT0ZGOwogCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IDI5NDczMDAwOwpAQCAtMTE3NCw3ICsxMjI4LDcgQEAKIAogCSpzdGF0dXMgPSAwOwogCWlmIChzdGF0ZS0+ZGlzZXFfZmxhZ3MgJiBIQVNfTE9DSykgewotCQlkc3RfZ2V0X3NpZ25hbChzdGF0ZSk7CisvLwkJZHN0X2dldF9zaWduYWwoc3RhdGUpOwkvLyBkb24ndCByZXF1aXJlKD8pIHRvIGFzayBNQ1UKIAkJaWYgKHN0YXRlLT5kZWNvZGVfbG9jaykKIAkJCSpzdGF0dXMgfD0gRkVfSEFTX0xPQ0sgfCBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfU1lOQyB8IEZFX0hBU19WSVRFUkJJOwogCX0KQEAgLTEyMDgsMjAgKzEyNjIsMjUgQEAKIAogCWRzdF9zZXRfZnJlcShzdGF0ZSwgcC0+ZnJlcXVlbmN5KTsKIAlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIlNldCBGcmVxdWVuY3kgPSBbJWRdXG4iLCBwLT5mcmVxdWVuY3kpOworCQlkcHJpbnRrKCJTZXQgRnJlcXVlbmN5PVslZF1cbiIsIHAtPmZyZXF1ZW5jeSk7CiAKLQlkc3Rfc2V0X2ludmVyc2lvbihzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKKy8vCWRzdF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwLT5pbnZlcnNpb24pOwogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7CisJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19PQlNfUkVHUykKKwkJCWRzdF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwLT5pbnZlcnNpb24pOworCiAJCWRzdF9zZXRfZmVjKHN0YXRlLCBwLT51LnFwc2suZmVjX2lubmVyKTsKIAkJZHN0X3NldF9zeW1ib2xyYXRlKHN0YXRlLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOworCQlkc3Rfc2V0X3BvbGFyaXphdGlvbihzdGF0ZSk7CiAJCWlmICh2ZXJib3NlID4gNCkKLQkJCWRwcmludGsoIlNldCBTeW1ib2xyYXRlID0gWyVkXVxuIiwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKKwkJCWRwcmludGsoIlNldCBTeW1ib2xyYXRlPVslZF1cbiIsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CiAKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKSB7CiAJCWRzdF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBwLT51Lm9mZG0uYmFuZHdpZHRoKTsKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgewogCQlkc3Rfc2V0X2ZlYyhzdGF0ZSwgcC0+dS5xYW0uZmVjX2lubmVyKTsKIAkJZHN0X3NldF9zeW1ib2xyYXRlKHN0YXRlLCBwLT51LnFhbS5zeW1ib2xfcmF0ZSk7CisJCWRzdF9zZXRfbW9kdWxhdGlvbihzdGF0ZSwgcC0+dS5xYW0ubW9kdWxhdGlvbik7CiAJfQogCWRzdF93cml0ZV90dW5hKGZlKTsKIApAQCAtMTIzMyw4ICsxMjkyLDExIEBACiAJc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXAtPmZyZXF1ZW5jeSA9IHN0YXRlLT5kZWNvZGVfZnJlcTsKLQlwLT5pbnZlcnNpb24gPSBzdGF0ZS0+aW52ZXJzaW9uOworLy8JcC0+aW52ZXJzaW9uID0gc3RhdGUtPmludmVyc2lvbjsKIAlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1NBVCkgeworCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpCisJCQlwLT5pbnZlcnNpb24gPSBzdGF0ZS0+aW52ZXJzaW9uOworCiAJCXAtPnUucXBzay5zeW1ib2xfcmF0ZSA9IHN0YXRlLT5zeW1ib2xfcmF0ZTsKIAkJcC0+dS5xcHNrLmZlY19pbm5lciA9IGRzdF9nZXRfZmVjKHN0YXRlKTsKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKSB7CkBAIC0xMjQyLDcgKzEzMDQsOCBAQAogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7CiAJCXAtPnUucWFtLnN5bWJvbF9yYXRlID0gc3RhdGUtPnN5bWJvbF9yYXRlOwogCQlwLT51LnFhbS5mZWNfaW5uZXIgPSBkc3RfZ2V0X2ZlYyhzdGF0ZSk7Ci0JCXAtPnUucWFtLm1vZHVsYXRpb24gPSBRQU1fQVVUTzsKKy8vCQlwLT51LnFhbS5tb2R1bGF0aW9uID0gUUFNX0FVVE87CisJCXAtPnUucWFtLm1vZHVsYXRpb24gPSBkc3RfZ2V0X21vZHVsYXRpb24oc3RhdGUpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYwppbmRleCBkNzgxNTA0Li5iZmFhY2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgImRzdF9jYS5oIgogI2luY2x1ZGUgImRzdF9jb21tb24uaCIKIAotc3RhdGljIHVuc2lnbmVkIGludCB2ZXJib3NlID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZSA9IDU7CiBtb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgInZlcmJvc2Ugc3RhcnR1cCBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7CiAKQEAgLTI5NSwzNCArMjk1LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGFuZGxlX2VuNTAyMjFfdGFnKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlcikKK3N0YXRpYyBpbnQgaGFuZGxlX2RzdF90YWcoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1MzIgbGVuZ3RoKQogewogCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19TRVNTSU9OKSB7CiAJCWh3X2J1ZmZlci0+bXNnWzJdID0gcF9jYV9tZXNzYWdlLT5tc2dbMV07CQkvKgkJTVNCCQkJKi8KIAkJaHdfYnVmZmVyLT5tc2dbM10gPSBwX2NhX21lc3NhZ2UtPm1zZ1syXTsJCS8qCQlMU0IJCQkqLwogCX0KIAllbHNlIHsKKwkJaHdfYnVmZmVyLT5tc2dbMF0gPSAobGVuZ3RoICYgMHhmZikgKyA3OworCQlod19idWZmZXItPm1zZ1sxXSA9IDB4NDA7CiAJCWh3X2J1ZmZlci0+bXNnWzJdID0gMHgwMzsKIAkJaHdfYnVmZmVyLT5tc2dbM10gPSAweDAwOworCQlod19idWZmZXItPm1zZ1s0XSA9IDB4MDM7CisJCWh3X2J1ZmZlci0+bXNnWzVdID0gbGVuZ3RoICYgMHhmZjsKKwkJaHdfYnVmZmVyLT5tc2dbNl0gPSAweDAwOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWJ1Z184ODIwX2J1ZmZlcihzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIpCisKK3N0YXRpYyBpbnQgd3JpdGVfdG9fODgyMChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCBsZW5ndGgsIHU4IHJlcGx5KQogewotCXVuc2lnbmVkIGludCBpOwotCi0JZHByaW50aygiJXM6RGVidWc9WyIsIF9fRlVOQ1RJT05fXyk7Ci0JZm9yIChpID0gMDsgaSA8IChod19idWZmZXItPm1zZ1swXSArIDEpOyBpKyspCi0JCWRwcmludGsoIiAlMDJ4IiwgaHdfYnVmZmVyLT5tc2dbaV0pOwotCWRwcmludGsoIl1cbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfdG9fODgyMChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCByZXBseSkKLXsKLQlpZiAoKGRzdF9wdXRfY2koc3RhdGUsIGh3X2J1ZmZlci0+bXNnLCAoaHdfYnVmZmVyLT5sZW5ndGggKyAxKSwgaHdfYnVmZmVyLT5tc2csIHJlcGx5KSkgPCAwKSB7CisJaWYgKChkc3RfcHV0X2NpKHN0YXRlLCBod19idWZmZXItPm1zZywgbGVuZ3RoLCBod19idWZmZXItPm1zZywgcmVwbHkpKSA8IDApIHsKIAkJZHByaW50aygiJXM6IERTVC1DSSBDb21tYW5kIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWRwcmludGsoIiVzOiBSZXNldHRpbmcgRFNULlxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmRjX3Jlc2V0X3N0YXRlKHN0YXRlKTsKQEAgLTMzNCwyMzQgKzMyOCwxNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGNhX3NldF9wbXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCByZXBseSwgdTggcXVlcnkpCit1MzIgYXNuXzFfZGVjb2RlKHU4ICphc25fMV9hcnJheSkKIHsKLQl1MzIgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0LCBpLCBrOwotCXUzMiBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMCwgZXNfaW5mb19sZW5ndGggPSAwLCBsZW5ndGggPSAwLCB3b3JkcyA9IDA7Ci0JdTggZm91bmRfcHJvZ19jYV9kZXNjID0gMCwgZm91bmRfc3RyZWFtX2NhX2Rlc2MgPSAwLCBlcnJvcl9jb25kaXRpb24gPSAwLCBod19idWZmZXJfbGVuZ3RoID0gMDsKKwl1OCBsZW5ndGhfZmllbGQgPSAwLCB3b3JkX2NvdW50ID0gMCwgY291bnQgPSAwOworCXUzMiBsZW5ndGggPSAwOwogCi0JaWYgKHZlcmJvc2UgPiAzKQotCQlkcHJpbnRrKCIlcywgcF9jYV9tZXNzYWdlIGxlbmd0aCAlZCAoMHgleClcbiIsIF9fRlVOQ1RJT05fXyxwX2NhX21lc3NhZ2UtPmxlbmd0aCxwX2NhX21lc3NhZ2UtPmxlbmd0aCApOwotCi0JaGFuZGxlX2VuNTAyMjFfdGFnKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlcik7CQkJLyoJRU41MDIyMSB0YWcJCSovCi0KLQkvKglIYW5kbGUgdGhlIGxlbmd0aCBmaWVsZCAodmFyaWFibGUpCSovCi0JaWYgKCEocF9jYV9tZXNzYWdlLT5tc2dbM10gJiAweDgwKSkgewkJCQkvKglMZW5ndGggPSAxCQkqLwotCQlsZW5ndGggPSBwX2NhX21lc3NhZ2UtPm1zZ1szXSAmIDB4N2Y7Ci0JCXdvcmRzID0gMDsJCQkJCQkvKglkb21pJ3Mgc3VnZ2VzdGlvbgkqLwotCX0KLQllbHNlIHsJCQkJCQkJCS8qCUxlbmd0aCA9IHdvcmRzCQkqLwotCQl3b3JkcyA9IHBfY2FfbWVzc2FnZS0+bXNnWzNdICYgMHg3ZjsKLQkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKLQkJCWxlbmd0aCA9IGxlbmd0aCA8PCA4OwotCQkJbGVuZ3RoID0gbGVuZ3RoIHwgcF9jYV9tZXNzYWdlLT5tc2dbNCArIGldOworCWxlbmd0aF9maWVsZCA9IGFzbl8xX2FycmF5WzBdOworCWRwcmludGsoIiVzOiBMZW5ndGggZmllbGQ9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aF9maWVsZCk7CisJaWYgKGxlbmd0aF9maWVsZCA8IDB4ODApIHsKKwkJbGVuZ3RoID0gbGVuZ3RoX2ZpZWxkICYgMHg3ZjsKKwkJZHByaW50aygiJXM6IExlbmd0aD1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwl9IGVsc2UgeworCQl3b3JkX2NvdW50ID0gbGVuZ3RoX2ZpZWxkICYgMHg3ZjsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgd29yZF9jb3VudDsgY291bnQrKykgeworCQkJbGVuZ3RoID0gKGxlbmd0aCB8IGFzbl8xX2FycmF5W2NvdW50ICsgMV0pIDw8IDg7CisJCQlkcHJpbnRrKCIlczogTGVuZ3RoPVslMDR4XVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOwogCQl9CiAJfQotCWlmICh2ZXJib3NlID4gNCkgewotCQlkcHJpbnRrKCIlczpMZW5ndGg9WyVkICgweCV4KV0sIFdvcmRzPVslZF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoLGxlbmd0aCwgd29yZHMpOworCXJldHVybiBsZW5ndGg7Cit9CiAKLQkJLyoJRGVidWcgSW5wdXQgc3RyaW5nCQkqLwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlkcHJpbnRrKCIgJTAyeCIsIHBfY2FfbWVzc2FnZS0+bXNnW2ldKTsKLQkJZHByaW50aygiXVxuIik7Ci0JfQotCi0JaHdfb2Zmc2V0ID0gNzsKLQlidWZfb2Zmc2V0ID0gd29yZHMgKyA0OwotCi0JLyoJCVByb2dyYW0gSGVhZGVyCQkJKi8KLQlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIlxuJXM6UHJvZ3JhbSBIZWFkZXI9WyIsIF9fRlVOQ1RJT05fXyk7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewotCQlod19idWZmZXItPm1zZ1tod19vZmZzZXRdID0gcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF07Ci0JCWlmICh2ZXJib3NlID4gNCkKLQkJCWRwcmludGsoIiAlMDJ4IiwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF0pOwotCQlod19vZmZzZXQrKywgYnVmX29mZnNldCsrLCBod19idWZmZXJfbGVuZ3RoKys7Ci0JfQotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiXVxuIik7Ci0KLQlwcm9ncmFtX2luZm9fbGVuZ3RoID0gMDsKLQlwcm9ncmFtX2luZm9fbGVuZ3RoID0gKCgocHJvZ3JhbV9pbmZvX2xlbmd0aCB8IHBfY2FfbWVzc2FnZS0+bXNnW3dvcmRzICsgOF0pICYgMHgwZikgPDwgOCkgfCBwX2NhX21lc3NhZ2UtPm1zZ1t3b3JkcyArIDldOwotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiJXM6UHJvZ3JhbSBpbmZvIExlbmd0aD1bJWRdWyUwMnhdLCBod19vZmZzZXQ9WyVkXSwgYnVmX29mZnNldD1bJWRdIFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcHJvZ3JhbV9pbmZvX2xlbmd0aCwgcHJvZ3JhbV9pbmZvX2xlbmd0aCwgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0KTsKLQotCWlmIChwcm9ncmFtX2luZm9fbGVuZ3RoICYmIChwcm9ncmFtX2luZm9fbGVuZ3RoIDwgMjU2KSkgewkvKglJZiBwcm9ncmFtX2luZm9fbGVuZ3RoCQkqLwotCQlod19idWZmZXItPm1zZ1sxMV0gPSBod19idWZmZXItPm1zZ1sxMV0gJiAweDBmOwkJLyoJcmVxIG9ubHkgNCBiaXRzCQkJKi8KLQkJaHdfYnVmZmVyLT5tc2dbMTJdID0gaHdfYnVmZmVyLT5tc2dbMTJdICsgMTsJCS8qCWluY3JlbWVudCEgQVNJQyBidWchCQkqLwotCi0JCWlmIChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgMV0gPT0gMHgwOSkgewkvKglDaGVjayBDQSBkZXNjcmlwdG9yCQkqLwotCQkJZm91bmRfcHJvZ19jYV9kZXNjID0gMTsKLQkJCWlmICh2ZXJib3NlID4gNCkKLQkJCQlkcHJpbnRrKCIlczogRm91bmQgQ0EgZGVzY3JpcHRvciBAIFByb2dyYW0gbGV2ZWxcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCX0KLQotCQlpZiAoZm91bmRfcHJvZ19jYV9kZXNjKSB7CQkJCS8qCUNvbW1hbmQgb25seSBpZiBDQSBkZXNjcmlwdG9yCSovCi0JCQlod19idWZmZXItPm1zZ1sxM10gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsJLyoJQ0EgUE1UIGNvbW1hbmQgSUQJKi8KLQkJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKzsKLQkJfQotCi0JCS8qCQkJUHJvZ3JhbSBkZXNjcmlwdG9ycwkJCQkqLwotCQlpZiAodmVyYm9zZSA+IDQpIHsKLQkJCWRwcmludGsoIiVzOioqKioqKioqKio+YnVmX29mZnNldD1bJWRdLCBod19vZmZzZXQ9WyVkXVxuIiwgX19GVU5DVElPTl9fLCBidWZfb2Zmc2V0LCBod19vZmZzZXQpOwotCQkJZHByaW50aygiJXM6UHJvZ3JhbSBkZXNjcmlwdG9ycz1bIiwgX19GVU5DVElPTl9fKTsKLQkJfQotCQl3aGlsZSAocHJvZ3JhbV9pbmZvX2xlbmd0aCAmJiAhZXJyb3JfY29uZGl0aW9uKSB7CQkvKglDb3B5IHByb2cgZGVzY3JpcHRvcnMJKi8KLQkJCWlmIChwcm9ncmFtX2luZm9fbGVuZ3RoID4gcF9jYV9tZXNzYWdlLT5sZW5ndGgpIHsJLyoJRXJyb3Igc2l0dWF0aW9uCQkqLwotCQkJCWRwcmludGsgKCIlczpcIldBUk5JTkdcIiBMZW5ndGggZXJyb3IsIGxpbmU9WyVkXSwgcHJvZ19pbmZvX2xlbmd0aD1bJWRdXG4iLAotCQkJCQkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBwcm9ncmFtX2luZm9fbGVuZ3RoKTsKLQkJCQlkcHJpbnRrKCIlczpcIldBUk5JTkdcIiBCYWlsaW5nIG91dCBvZiBwb3NzaWJsZSBsb29wXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCWVycm9yX2NvbmRpdGlvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKLQkJCWRwcmludGsoIiAlMDJ4IiwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF0pOwotCQkJaHdfb2Zmc2V0KyssIGJ1Zl9vZmZzZXQrKywgaHdfYnVmZmVyX2xlbmd0aCsrLCBwcm9ncmFtX2luZm9fbGVuZ3RoLS07Ci0JCX0KLQkJaWYgKHZlcmJvc2UgPiA0KSB7Ci0JCQlkcHJpbnRrKCJdXG4iKTsKLQkJCWRwcmludGsoIiVzOioqKioqKioqKio+YnVmX29mZnNldD1bJWRdLCBod19vZmZzZXQ9WyVkXVxuIiwgX19GVU5DVElPTl9fLCBidWZfb2Zmc2V0LCBod19vZmZzZXQpOwotCQl9Ci0JCWlmIChmb3VuZF9wcm9nX2NhX2Rlc2MpIHsKLQkJCWlmICghcmVwbHkpIHsKLQkJCQlod19idWZmZXItPm1zZ1sxM10gPSAweDAxOwkJLyoJT0sgZGVzY3JhbWJsaW5nCQkJKi8KLQkJCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJCWRwcmludGsoIkNBIFBNVCBDb21tYW5kID0gT0sgRGVzY3JhbWJsaW5nXG4iKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWh3X2J1ZmZlci0+bXNnWzEzXSA9IDB4MDI7CQkvKglPayBNTUkJCQkJKi8KLQkJCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJCWRwcmludGsoIkNBIFBNVCBDb21tYW5kID0gT2sgTU1JXG4iKTsKLQkJCX0KLQkJCWlmIChxdWVyeSkgewotCQkJCWh3X2J1ZmZlci0+bXNnWzEzXSA9IDB4MDM7CQkvKglRdWVyeQkJCQkqLwotCQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQkJZHByaW50aygiQ0EgUE1UIENvbW1hbmQgPSBDQSBQTVQgcXVlcnlcbiIpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlod19idWZmZXItPm1zZ1sxMV0gPSBod19idWZmZXItPm1zZ1sxMV0gJiAweGYwOwkJLyoJRG9uJ3Qgd3JpdGUgdG8gQVNJQwkJKi8KLQkJaHdfYnVmZmVyLT5tc2dbMTJdID0gaHdfYnVmZmVyLT5tc2dbMTJdID0gMHgwMDsKLQl9Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCIlczoqKioqKioqKioqPnBfY2FfbWVzc2FnZS0+bGVuZ3RoPVslZF0sIGJ1Zl9vZmZzZXQ9WyVkXSwgaHdfb2Zmc2V0PVslZF1cbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcF9jYV9tZXNzYWdlLT5sZW5ndGgsIGJ1Zl9vZmZzZXQsIGh3X29mZnNldCk7Ci0KLQl3aGlsZSAoKGJ1Zl9vZmZzZXQgIDwgcF9jYV9tZXNzYWdlLT5sZW5ndGgpICAmJiAhZXJyb3JfY29uZGl0aW9uKSB7Ci0JCS8qCUJhaWwgb3V0IGluIGNhc2Ugb2YgYW4gaW5kZWZpbml0ZSBsb29wCQkqLwotCQlpZiAoKGVzX2luZm9fbGVuZ3RoID4gcF9jYV9tZXNzYWdlLT5sZW5ndGgpIHx8IChidWZfb2Zmc2V0ID4gcF9jYV9tZXNzYWdlLT5sZW5ndGgpKSB7Ci0JCQlkcHJpbnRrKCIlczpcIldBUk5JTkdcIiBMZW5ndGggZXJyb3IsIGxpbmU9WyVkXSwgcHJvZ19pbmZvX2xlbmd0aD1bJWRdLCBidWZfb2Zmc2V0PVslZF1cbiIsCi0JCQkJCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcHJvZ3JhbV9pbmZvX2xlbmd0aCwgYnVmX29mZnNldCk7Ci0KLQkJCWRwcmludGsoIiVzOlwiV0FSTklOR1wiIEJhaWxpbmcgb3V0IG9mIHBvc3NpYmxlIGxvb3BcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQllcnJvcl9jb25kaXRpb24gPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgkJU3RyZWFtIEhlYWRlcgkJCQkqLwotCi0JCWZvciAoayA9IDA7IGsgPCA1OyBrKyspIHsKLQkJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldCArIGtdID0gcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIGtdOwotCQl9Ci0KLQkJZXNfaW5mb19sZW5ndGggPSAwOwotCQllc19pbmZvX2xlbmd0aCA9IChlc19pbmZvX2xlbmd0aCB8IChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgM10gJiAweDBmKSkgPDwgOCB8IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyA0XTsKLQotCQlpZiAodmVyYm9zZSA+IDQpIHsKLQkJCWRwcmludGsoIlxuJXM6LS0tLS0+U3RyZWFtIGhlYWRlcj1bJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XVxuIiwgX19GVU5DVElPTl9fLAotCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAwXSwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDFdLAotCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAyXSwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDNdLAotCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyA0XSk7Ci0KLQkJCWRwcmludGsoIiVzOi0tLS0tPlN0cmVhbSB0eXBlPVslMDJ4XSwgZXMgbGVuZ3RoPVslZCAoMHgleCldLCBDaGFycz1bJTAyeF0gWyUwMnhdLCBidWZfb2Zmc2V0PVslZF1cbiIsIF9fRlVOQ1RJT05fXywKLQkJCQlwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgMF0sIGVzX2luZm9fbGVuZ3RoLCBlc19pbmZvX2xlbmd0aCwKLQkJCQlwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgM10sIHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyA0XSwgYnVmX29mZnNldCk7Ci0JCX0KLQotCQlod19idWZmZXItPm1zZ1tod19vZmZzZXQgKyAzXSAmPSAweDBmOwkJCS8qCXJlcSBvbmx5IDQgYml0cwkJCSovCi0KLQkJaWYgKGZvdW5kX3Byb2dfY2FfZGVzYykgewotCQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0ICsgM10gPSAweDAwOwotCQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0ICsgNF0gPSAweDAwOwotCQl9Ci0KLQkJaHdfb2Zmc2V0ICs9IDUsIGJ1Zl9vZmZzZXQgKz0gNSwgaHdfYnVmZmVyX2xlbmd0aCArPSA1OwotCi0JCS8qCQlDaGVjayBmb3IgQ0EgZGVzY3JpcHRvcgkJCSovCi0JCWlmIChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgMV0gPT0gMHgwOSkgewotCQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJCWRwcmludGsoIiVzOkZvdW5kIENBIGRlc2NyaXB0b3IgQCBTdHJlYW0gbGV2ZWxcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlmb3VuZF9zdHJlYW1fY2FfZGVzYyA9IDE7Ci0JCX0KLQotCQkvKgkJRVMgZGVzY3JpcHRvcnMJCQkJKi8KLQotCQlpZiAoZXNfaW5mb19sZW5ndGggJiYgIWVycm9yX2NvbmRpdGlvbiAmJiAhZm91bmRfcHJvZ19jYV9kZXNjICYmIGZvdW5kX3N0cmVhbV9jYV9kZXNjKSB7Ci0vLwkJCWlmICghY2FfcG10X2RvbmUpIHsKLQkJCQlod19idWZmZXItPm1zZ1tod19vZmZzZXRdID0gcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF07CS8qCUNBIFBNVCBjbWQoZXMpCSovCi0JCQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJCQlwcmludGsoIiVzOi0tLS0tPkNBIFBNVCBDb21tYW5kIElEPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XSk7Ci0vLwkJCQlod19vZmZzZXQrKywgYnVmX29mZnNldCsrLCBod19idWZmZXJfbGVuZ3RoKyssIGVzX2luZm9fbGVuZ3RoLS0sIGNhX3BtdF9kb25lID0gMTsKLQkJCQlod19vZmZzZXQrKywgYnVmX29mZnNldCsrLCBod19idWZmZXJfbGVuZ3RoKyssIGVzX2luZm9fbGVuZ3RoLS07Ci0vLwkJCX0KLQkJCWlmICh2ZXJib3NlID4gNCkKLQkJCQlkcHJpbnRrKCIlczotLS0tLT5FUyBkZXNjcmlwdG9ycz1bIiwgX19GVU5DVElPTl9fKTsKLQotCQkJd2hpbGUgKGVzX2luZm9fbGVuZ3RoICYmICFlcnJvcl9jb25kaXRpb24pIHsJLyoJRVMgZGVzY3JpcHRvcnMJCQkqLwotCQkJCWlmICgoZXNfaW5mb19sZW5ndGggPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkgfHwgKGJ1Zl9vZmZzZXQgPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkpIHsKLQkJCQkJaWYgKHZlcmJvc2UgPiA0KSB7Ci0JCQkJCQlkcHJpbnRrKCIlczpcIldBUk5JTkdcIiBFUyBMZW5ndGggZXJyb3IsIGxpbmU9WyVkXSwgZXNfaW5mb19sZW5ndGg9WyVkXSwgYnVmX29mZnNldD1bJWRdXG4iLAotCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIGVzX2luZm9fbGVuZ3RoLCBidWZfb2Zmc2V0KTsKLQotCQkJCQkJZHByaW50aygiJXM6XCJXQVJOSU5HXCIgQmFpbGluZyBvdXQgb2YgcG9zc2libGUgbG9vcFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQkJfQotCQkJCQllcnJvcl9jb25kaXRpb24gPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlod19idWZmZXItPm1zZ1tod19vZmZzZXRdID0gcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF07Ci0JCQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJCQlkcHJpbnRrKCIlMDJ4ICIsIGh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0pOwotCQkJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKywgZXNfaW5mb19sZW5ndGgtLTsKLQkJCX0KLQkJCWZvdW5kX3N0cmVhbV9jYV9kZXNjID0gMDsJCQkvKgl1bnNldCBmb3IgbmV3IHN0cmVhbXMJCSovCi0JCQlkcHJpbnRrKCJdXG4iKTsKLQkJfQotCX0KLQotCS8qCQlNQ1UgTWFnaWMgd29yZHMJCQkJCSovCi0KLQlod19idWZmZXJfbGVuZ3RoICs9IDc7Ci0JaHdfYnVmZmVyLT5tc2dbMF0gPSBod19idWZmZXJfbGVuZ3RoOwotCWh3X2J1ZmZlci0+bXNnWzFdID0gNjQ7Ci0JaHdfYnVmZmVyLT5tc2dbNF0gPSAzOwotCWh3X2J1ZmZlci0+bXNnWzVdID0gaHdfYnVmZmVyLT5tc2dbMF0gLSA3OwotCWh3X2J1ZmZlci0+bXNnWzZdID0gMDsKLQotCi0JLyogICAgICBGaXggbGVuZ3RoICAgICAgKi8KLQlod19idWZmZXItPmxlbmd0aCA9IGh3X2J1ZmZlci0+bXNnWzBdOwotCi0JcHV0X2NoZWNrc3VtKCZod19idWZmZXItPm1zZ1swXSwgaHdfYnVmZmVyLT5tc2dbMF0pOwotCS8qICAgICAgRG8gdGhlIGFjdHVhbCB3cml0ZSAgICAgKi8KLQlpZiAodmVyYm9zZSA+IDQpIHsKLQkJZHByaW50aygiJXM6PT09PT09PT09PT09PT09PT09PT09PURFQlVHR0lORz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBfX0ZVTkNUSU9OX18pOwotCQlkcHJpbnRrKCIlczogQWN0dWFsIExlbmd0aD1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGh3X2J1ZmZlcl9sZW5ndGgpOwotCX0KLQkvKiAgICAgIE9ubHkgZm9yIGRlYnVnZ2luZyEgICAgICovCi0JaWYgKHZlcmJvc2UgPiAyKQotCQlkZWJ1Z184ODIwX2J1ZmZlcihod19idWZmZXIpOwotCWlmICh2ZXJib3NlID4gMykKLQkJZHByaW50aygiJXM6IFJlcGx5ID0gWyVkXVxuIiwgX19GVU5DVElPTl9fLCByZXBseSk7Ci0Jd3JpdGVfdG9fODgyMChzdGF0ZSwgaHdfYnVmZmVyLCByZXBseSk7CitzdGF0aWMgaW50IGluaXRfYnVmZmVyKHU4ICpidWZmZXIsIHUzMiBsZW5ndGgpCit7CisJdTMyIGk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlidWZmZXJbaV0gPSAwOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZGVidWdfc3RyaW5nKHU4ICptc2csIHUzMiBsZW5ndGgsIHUzMiBvZmZzZXQpCit7CisJdTMyIGk7CisKKwlkcHJpbnRrKCIgU3RyaW5nPVsgIik7CisJZm9yIChpID0gb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspCisJCWRwcmludGsoIiUwMnggIiwgbXNnW2ldKTsKKwlkcHJpbnRrKCJdXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcHlfc3RyaW5nKHU4ICpkZXN0aW5hdGlvbiwgdTggKnNvdXJjZSwgdTMyIGRlc3Rfb2Zmc2V0LCB1MzIgc291cmNlX29mZnNldCwgdTMyIGxlbmd0aCkKK3sKKwl1MzIgaTsKKwlkcHJpbnRrKCIlczogQ29weWluZyBbIiwgX19GVU5DVElPTl9fKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJZGVzdGluYXRpb25baSArIGRlc3Rfb2Zmc2V0XSA9IHNvdXJjZVtpICsgc291cmNlX29mZnNldF07CisJCWRwcmludGsoIiAlMDJ4Iiwgc291cmNlW2kgKyBzb3VyY2Vfb2Zmc2V0XSk7CisJfQorCWRwcmludGsoIl1cbiIpOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgbW9kaWZ5XzRfYml0cyh1OCAqbWVzc2FnZSwgdTMyIHBvcykKK3sKKwltZXNzYWdlW3Bvc10gJj0gMHgwZjsKKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBjYV9zZXRfcG10KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlciwgdTggcmVwbHksIHU4IHF1ZXJ5KQoreworCXUzMiBsZW5ndGggPSAwLCBjb3VudCA9IDA7CisJdTggYXNuXzFfd29yZHMsIHByb2dyYW1faGVhZGVyX2xlbmd0aDsKKwl1MTYgcHJvZ3JhbV9pbmZvX2xlbmd0aCA9IDAsIGVzX2luZm9fbGVuZ3RoID0gMDsKKwl1MzIgaHdfb2Zmc2V0ID0gMCwgYnVmX29mZnNldCA9IDAsIGk7CisJdTggZHN0X3RhZ19sZW5ndGg7CisKKwlsZW5ndGggPSBhc25fMV9kZWNvZGUoJnBfY2FfbWVzc2FnZS0+bXNnWzNdKTsKKwlkcHJpbnRrKCIlczogQ0EgTWVzc2FnZSBsZW5ndGg9WyVkXVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOworCWRwcmludGsoIiVzOiBBU04uMSAiLCBfX0ZVTkNUSU9OX18pOworCWRlYnVnX3N0cmluZygmcF9jYV9tZXNzYWdlLT5tc2dbNF0sIGxlbmd0aCwgMCk7IC8vIGxlbmd0aCBkb2VzIG5vdCBpbmNsdWRlIHRhZyBhbmQgbGVuZ3RoCisKKwlpbml0X2J1ZmZlcihod19idWZmZXItPm1zZywgbGVuZ3RoKTsKKwloYW5kbGVfZHN0X3RhZyhzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIGxlbmd0aCk7CisKKwlod19vZmZzZXQgPSA3OworCWFzbl8xX3dvcmRzID0gMTsgLy8ganVzdCBhIGhhY2sgdG8gdGVzdCwgc2hvdWxkIGNvbXB1dGUgdGhpcyBvbmUKKwlidWZfb2Zmc2V0ID0gMzsKKwlwcm9ncmFtX2hlYWRlcl9sZW5ndGggPSA2OworCWRzdF90YWdfbGVuZ3RoID0gNzsKKworLy8JZGVidWdfdHdpbmhhbl9jYV9wYXJhbXMoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCByZXBseSwgcXVlcnksIGxlbmd0aCwgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0KTsKKy8vCWRwcmludGsoIiVzOiBQcm9ncmFtIEhlYWRlcihCVUYpIiwgX19GVU5DVElPTl9fKTsKKy8vCWRlYnVnX3N0cmluZygmcF9jYV9tZXNzYWdlLT5tc2dbNF0sIHByb2dyYW1faGVhZGVyX2xlbmd0aCwgMCk7CisvLwlkcHJpbnRrKCIlczogQ29weWluZyBQcm9ncmFtIGhlYWRlclxuIiwgX19GVU5DVElPTl9fKTsKKwljb3B5X3N0cmluZyhod19idWZmZXItPm1zZywgcF9jYV9tZXNzYWdlLT5tc2csIGh3X29mZnNldCwgKGJ1Zl9vZmZzZXQgKyBhc25fMV93b3JkcyksIHByb2dyYW1faGVhZGVyX2xlbmd0aCk7CisJYnVmX29mZnNldCArPSBwcm9ncmFtX2hlYWRlcl9sZW5ndGgsIGh3X29mZnNldCArPSBwcm9ncmFtX2hlYWRlcl9sZW5ndGg7CisJbW9kaWZ5XzRfYml0cyhod19idWZmZXItPm1zZywgKGh3X29mZnNldCAtIDIpKTsKKwlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfSU5DX0NPVU5UKSB7CS8vIHdvcmthcm91bmQKKwkJZHByaW50aygiJXM6IFByb2JhYmx5IGFuIEFTSUMgYnVnICEhIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCAoaHdfb2Zmc2V0ICsgcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoKSwgMCk7CisJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldCAtIDFdICs9IDE7CisJfQorCisvLwlkcHJpbnRrKCIlczogUHJvZ3JhbSBIZWFkZXIoSFcpLCBDb3VudD1bJWRdIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisvLwlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIGh3X29mZnNldCwgMCk7CisKKwlwcm9ncmFtX2luZm9fbGVuZ3RoID0gICgocHJvZ3JhbV9pbmZvX2xlbmd0aCB8IChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0IC0gMV0gJiAweDBmKSkgPDwgOCkgfCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKKwlkcHJpbnRrKCIlczogUHJvZ3JhbSBpbmZvIGxlbmd0aD1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgcHJvZ3JhbV9pbmZvX2xlbmd0aCk7CisJaWYgKHByb2dyYW1faW5mb19sZW5ndGgpIHsKKwkJY291bnQgPSBjb3B5X3N0cmluZyhod19idWZmZXItPm1zZywgcF9jYV9tZXNzYWdlLT5tc2csIGh3X29mZnNldCwgKGJ1Zl9vZmZzZXQgKyAxKSwgKHByb2dyYW1faW5mb19sZW5ndGggKyAxKSApOyAvLyBjb3B5IG5leHQgZWxlbSwgbm90IGN1cnJlbnQKKwkJYnVmX29mZnNldCArPSBjb3VudCwgaHdfb2Zmc2V0ICs9IGNvdW50OworLy8JCWRwcmludGsoIiVzOiBQcm9ncmFtIGxldmVsICIsIF9fRlVOQ1RJT05fXyk7CisvLwkJZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBod19vZmZzZXQsIDApOworCX0KKworCWJ1Zl9vZmZzZXQgKz0gMTsvLyBod19vZmZzZXQgKz0gMTsKKwlmb3IgKGkgPSBidWZfb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspIHsKKy8vCQlkcHJpbnRrKCIlczogU3RyZWFtIEhlYWRlciAiLCBfX0ZVTkNUSU9OX18pOworCQljb3VudCA9IGNvcHlfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBwX2NhX21lc3NhZ2UtPm1zZywgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0LCA1KTsKKwkJbW9kaWZ5XzRfYml0cyhod19idWZmZXItPm1zZywgKGh3X29mZnNldCArIDMpKTsKKworCQlod19vZmZzZXQgKz0gNSwgYnVmX29mZnNldCArPSA1LCBpICs9IDQ7CisvLwkJZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBod19vZmZzZXQsIChod19vZmZzZXQgLSA1KSk7CisJCWVzX2luZm9fbGVuZ3RoID0gKChlc19pbmZvX2xlbmd0aCB8IChwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0IC0gMV0gJiAweDBmKSkgPDwgOCkgfCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKKwkJZHByaW50aygiJXM6IEVTIGluZm8gbGVuZ3RoPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBlc19pbmZvX2xlbmd0aCk7CisJCWlmIChlc19pbmZvX2xlbmd0aCkgeworCQkJLy8gY29weSBkZXNjcmlwdG9ycyBAIFNUUkVBTSBsZXZlbAorCQkJZHByaW50aygiJXM6IERlc2NyaXB0b3JzIEAgU1RSRUFNIGxldmVsLi4uISEhIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCisJfQorCWh3X2J1ZmZlci0+bXNnW2xlbmd0aCArIGRzdF90YWdfbGVuZ3RoXSA9IGRzdF9jaGVja19zdW0oaHdfYnVmZmVyLT5tc2csIChsZW5ndGggKyBkc3RfdGFnX2xlbmd0aCkpOworLy8JZHByaW50aygiJXM6IFRvdGFsIGxlbmd0aD1bJWRdLCBDaGVja3N1bT1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgKGxlbmd0aCArIGRzdF90YWdfbGVuZ3RoKSwgaHdfYnVmZmVyLT5tc2dbbGVuZ3RoICsgZHN0X3RhZ19sZW5ndGhdKTsKKwlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIChsZW5ndGggKyBkc3RfdGFnX2xlbmd0aCArIDEpLCAwKTsJLy8gZHN0IHRhZ3MgYWxzbworCXdyaXRlX3RvXzg4MjAoc3RhdGUsIGh3X2J1ZmZlciwgKGxlbmd0aCArIGRzdF90YWdfbGVuZ3RoICsgMSksIHJlcGx5KTsJLy8gY2hlY2tzdW0KKworCXJldHVybiAwOworfQorCisKIC8qCUJvYXJkIHN1cHBvcnRzIENBIFBNVCByZXBseSA/CQkqLwogc3RhdGljIGludCBkc3RfY2hlY2tfY2FfcG10KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlcikKIHsKQEAgLTYwNSw3ICs1MDYsNyBAQAogCXN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlcjsKIAogCWlmICgoaHdfYnVmZmVyID0gKHN0cnVjdCBjYV9tc2cgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9tc2cpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlmICh2ZXJib3NlID4gMykKQEAgLTYzMCw4ICs1MzEsMTAgQEAKIAkJc3dpdGNoIChjb21tYW5kKSB7CiAJCQljYXNlIENBX1BNVDoKIAkJCQlpZiAodmVyYm9zZSA+IDMpCisvLwkJCQkJZHByaW50aygiQ29tbWFuZCA9IFNFTkRfQ0FfUE1UXG4iKTsKIAkJCQkJZHByaW50aygiQ29tbWFuZCA9IFNFTkRfQ0FfUE1UXG4iKTsKLQkJCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCAwKSkgPCAwKSB7CisvLwkJCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCAwKSkgPCAwKSB7CisJCQkJaWYgKChjYV9zZXRfcG10KHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgMCwgMCkpIDwgMCkgewkvLyBjb2RlIHNpbXBsaWZpY2F0aW9uIHN0YXJ0ZWQKIAkJCQkJZHByaW50aygiJXM6IC0tPkNBX1BNVCBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KQEAgLTY2NCw3ICs1NjcsNyBAQAogCQkJCQlyZXR1cm4gLTE7CiAJCQkJfQogCQkJCWlmICh2ZXJib3NlID4gMykKLQkJCQkJcHJpbnRrKCIlczogLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCWRwcmludGsoIiVzOiAtLT5DQV9BUFBfSU5GT19FTlFVSVJZIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKIAogCQkJCWJyZWFrOwogCQl9CkBAIC02ODEsMTcgKzU4NCwxNyBAQAogCXN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZTsKIAogCWlmICgocF9jYV9tZXNzYWdlID0gKHN0cnVjdCBjYV9tc2cgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9tc2cpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJaWYgKChwX2NhX3Nsb3RfaW5mbyA9IChzdHJ1Y3QgY2Ffc2xvdF9pbmZvICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2Ffc2xvdF9pbmZvKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWlmICgocF9jYV9jYXBzID0gKHN0cnVjdCBjYV9jYXBzICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaAppbmRleCAwYjNkYTI5Li5lZjUzMmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oCkBAIC00Nyw2ICs0Nyw4IEBACiAjZGVmaW5lIERTVF9UWVBFX0hBU19GV18yCTE2CiAjZGVmaW5lIERTVF9UWVBFX0hBU19GV18zCTMyCiAjZGVmaW5lIERTVF9UWVBFX0hBU19GV19CVUlMRAk2NAorI2RlZmluZSBEU1RfVFlQRV9IQVNfT0JTX1JFR1MJMTI4CisjZGVmaW5lIERTVF9UWVBFX0hBU19JTkNfQ09VTlQJMjU2CiAKIC8qCUNhcmQgY2FwYWJpbGl0eSBsaXN0CSovCiAKQEAgLTExMCw2ICsxMTIsNyBAQAogCXUzMiBkc3RfaHdfY2FwOwogCXU4IGRzdF9md192ZXJzaW9uOwogCWZlX3NlY19taW5pX2NtZF90IG1pbmljbWQ7CisJZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb247CiAJdTggbWVzc2FnZXNbMjU2XTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYwppbmRleCA5NmM1N2ZkLi43ZDhiM2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCkBAIC02OTksNiArNjk5LDggQEAKIAlmb3IgKG49MDsgbGVuPjAgJiYgbjwobGVuL3NpemVvZihyY19ldmVudHNbMF0pKTsgbisrKSB7CiAJCWludCBpOwogCisvKgkJZHByaW50aygxLCJyY19ldmVudHNbJWRdLnZhbHVlID0gJXgsIHR5cGU9JXhcbiIsbixsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpLHJjX2V2ZW50c1tuXS50eXBlKTsqLworCiAJCWlmIChyY19ldmVudHNbbl0udHlwZSA9PSBDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMgJiYKIAkJICAgIHJjX2V2ZW50c1tuXS52YWx1ZSA9PSB+MCkKIAkJewpAQCAtNzE0LDcgKzcxNiw3IEBACiAJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gS0VZX01BWDsKIAkJCWZvciAoaT0wOyBpPHNpemVvZihyY19rZXlzKS9zaXplb2YocmNfa2V5c1swXSk7IGkrPTMpIHsKIAkJCQlpZiAocmNfa2V5c1tpKzBdID09IHJjX2V2ZW50c1tuXS50eXBlICYmCi0JCQkJICAgIHJjX2tleXNbaSsxXSA9PSByY19ldmVudHNbbl0udmFsdWUpCisJCQkJICAgIHJjX2tleXNbaSsxXSA9PSBsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpKQogCQkJCXsKIAkJCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IHJjX2tleXNbaSsyXTsKIAkJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCmluZGV4IGMyMjVkZTcuLjY4MDUwY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCkBAIC00MiwxMiArNDIsNiBAQAogCiAjZGVmaW5lIGRwcmludGsJaWYgKGRlYnVnKSBwcmludGsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqCi1kdmJfZG14ZGV2X2ZpbGVfdG9fZmlsdGVyKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiAoc3RydWN0IGRteGRldl9maWx0ZXIgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZHZiX2RteGRldl9idWZmZXJfaW5pdChzdHJ1Y3QgZG14ZGV2X2J1ZmZlciAqYnVmZmVyKQogewogCWJ1ZmZlci0+ZGF0YT1OVUxMOwpAQCAtNjY5LDggKzY2MywxMCBAQAogCiAJCXJldCA9IGZpbHRlci0+ZmVlZC50cy0+c3RhcnRfZmlsdGVyaW5nKGZpbHRlci0+ZmVlZC50cyk7CiAKLQkJaWYgKHJldCA8IDApCisJCWlmIChyZXQgPCAwKSB7CisJCQlkbXhkZXYtPmRlbXV4LT5yZWxlYXNlX3RzX2ZlZWQoZG14ZGV2LT5kZW11eCwgKnRzZmVlZCk7CiAJCQlyZXR1cm4gcmV0OworCQl9CiAKIAkJYnJlYWs7CiAJfQpAQCAtODQyLDcgKzgzOCw3IEBACiBzdGF0aWMgc3NpemVfdAogZHZiX2RlbXV4X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXI9ZHZiX2RteGRldl9maWxlX3RvX2ZpbHRlcihmaWxlKTsKKwlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldD0wOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZG14ZGV2ZmlsdGVyLT5tdXRleCkpCkBAIC04NjMsNyArODU5LDcgQEAKIHN0YXRpYyBpbnQgZHZiX2RlbXV4X2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGFyZykKIHsKLQlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyPWR2Yl9kbXhkZXZfZmlsZV90b19maWx0ZXIoZmlsZSk7CisJc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZG14ZGV2ICpkbXhkZXY9ZG14ZGV2ZmlsdGVyLT5kZXY7CiAJdW5zaWduZWQgbG9uZyBhcmc9KHVuc2lnbmVkIGxvbmcpIHBhcmc7CiAJaW50IHJldD0wOwpAQCAtOTYwLDcgKzk1Niw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZHZiX2RlbXV4X3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewotCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXIgPSBkdmJfZG14ZGV2X2ZpbGVfdG9fZmlsdGVyKGZpbGUpOworCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCiAJaWYgKCFkbXhkZXZmaWx0ZXIpCkBAIC05ODUsNyArOTgxLDcgQEAKIAogc3RhdGljIGludCBkdmJfZGVtdXhfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyID0gZHZiX2RteGRldl9maWxlX3RvX2ZpbHRlcihmaWxlKTsKKwlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBkbXhkZXYgKmRteGRldiA9IGRteGRldmZpbHRlci0+ZGV2OwogCiAJcmV0dXJuIGR2Yl9kbXhkZXZfZmlsdGVyX2ZyZWUoZG14ZGV2LCBkbXhkZXZmaWx0ZXIpOwpAQCAtMTEwOSw3ICsxMTA1LDYgQEAKIAkJZHZiX2RteGRldl9maWx0ZXJfc3RhdGVfc2V0KCZkbXhkZXYtPmZpbHRlcltpXSwgRE1YREVWX1NUQVRFX0ZSRUUpOwogCQlkbXhkZXYtPmR2cltpXS5kZXY9ZG14ZGV2OwogCQlkbXhkZXYtPmR2cltpXS5idWZmZXIuZGF0YT1OVUxMOwotCQlkdmJfZG14ZGV2X2ZpbHRlcl9zdGF0ZV9zZXQoJmRteGRldi0+ZmlsdGVyW2ldLCBETVhERVZfU1RBVEVfRlJFRSk7CiAJCWR2Yl9kbXhkZXZfZHZyX3N0YXRlX3NldCgmZG14ZGV2LT5kdnJbaV0sIERNWERFVl9TVEFURV9GUkVFKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggZjExZGFhZS4uYThiYzg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKICNpbmNsdWRlICJkdmJkZXYuaCIKIAorLy8gI2RlZmluZSBERUJVR19MT0NLTE9TUyAxCisKIHN0YXRpYyBpbnQgZHZiX2Zyb250ZW5kX2RlYnVnOwogc3RhdGljIGludCBkdmJfc2h1dGRvd25fdGltZW91dCA9IDU7CiBzdGF0aWMgaW50IGR2Yl9mb3JjZV9hdXRvX2ludmVyc2lvbjsKQEAgLTExMyw2ICsxMTUsNyBAQAogCWludCBleGl0OwogCWludCB3YWtldXA7CiAJZmVfc3RhdHVzX3Qgc3RhdHVzOworCWZlX3NlY190b25lX21vZGVfdCB0b25lOwogfTsKIAogCkBAIC00MzQsOSArNDM3LDI2IEBACiAJCQkvKiB3ZSdyZSB0dW5lZCwgYW5kIHRoZSBsb2NrIGlzIHN0aWxsIGdvb2QuLi4gKi8KIAkJCWlmIChzICYgRkVfSEFTX0xPQ0spCiAJCQkJY29udGludWU7Ci0JCQllbHNlIHsKLQkJCQkvKiBpZiB3ZSBfV0VSRV8gdHVuZWQsIGJ1dCBub3cgZG9uJ3QgaGF2ZSBhIGxvY2ssCi0JCQkJICogbmVlZCB0byB6aWd6YWcgKi8KKwkJCWVsc2UgeyAvKiBpZiB3ZSBfV0VSRV8gdHVuZWQsIGJ1dCBub3cgZG9uJ3QgaGF2ZSBhIGxvY2sgKi8KKyNpZmRlZiBERUJVR19MT0NLTE9TUworCQkJCS8qIGZpcnN0IG9mIGFsbCB0cnkgc2V0dGluZyB0aGUgdG9uZSBhZ2FpbiBpZiBpdCB3YXMgb24gLSB0aGlzCisJCQkJICogc29tZXRpbWVzIHdvcmtzIGFyb3VuZCBwcm9ibGVtcyB3aXRoIG5vaXN5IHBvd2VyIHN1cHBsaWVzICovCisJCQkJaWYgKGZlLT5vcHMtPnNldF90b25lICYmIChmZXByaXYtPnRvbmUgPT0gU0VDX1RPTkVfT04pKSB7CisJCQkJCWZlLT5vcHMtPnNldF90b25lKGZlLCBmZXByaXYtPnRvbmUpOworCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJcyA9IDA7CisJCQkJCWZlLT5vcHMtPnJlYWRfc3RhdHVzKGZlLCAmcyk7CisJCQkJCWlmIChzICYgRkVfSEFTX0xPQ0spIHsKKwkJCQkJCXByaW50aygiRFZCJWk6IExvY2sgd2FzIGxvc3QsIGJ1dCByZWdhaW5lZCBieSBzZXR0aW5nICIKKwkJCQkJCSAgICAgICAidGhlIHRvbmUuIFRoaXMgbWF5IGluZGljYXRlIHlvdXIgcG93ZXIgc3VwcGx5ICIKKwkJCQkJCSAgICAgICAiaXMgbm9pc3kvc2xpZ2h0bHkgaW5jb21wYXRhYmxlIHdpdGggdGhpcyBEVkItUyAiCisJCQkJCQkgICAgICAgImFkYXB0ZXJcbiIsIGZlLT5kdmItPm51bSk7CisJCQkJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9UVU5FRDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJLyogc29tZSBvdGhlciByZWFzb24gZm9yIGxvc2luZyB0aGUgbG9jayAtIHN0YXJ0IHppZ3phZ2dpbmcgKi8KIAkJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9aSUdaQUdfRkFTVDsKIAkJCQlmZXByaXYtPnN0YXJ0ZWRfYXV0b19zdGVwID0gZmVwcml2LT5hdXRvX3N0ZXA7CiAJCQkJY2hlY2tfd3JhcHBlZCA9IDA7CkBAIC02MjYsMTEgKzY0NiwyMSBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIEZFX1JFQURfU1RBVFVTOgotCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCi0JCQllcnIgPSBmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgKGZlX3N0YXR1c190KikgcGFyZyk7Ci0JCWJyZWFrOworCWNhc2UgRkVfUkVBRF9TVEFUVVM6IHsKKwkJZmVfc3RhdHVzX3QqIHN0YXR1cyA9IHBhcmc7CiAKKwkJLyogaWYgcmV0dW5lIHdhcyByZXF1ZXN0ZWQgYnV0IGhhc24ndCBvY2N1cmVkIHlldCwgcHJldmVudAorCQkgKiB0aGF0IHVzZXIgZ2V0IHNpZ25hbCBzdGF0ZSBmcm9tIHByZXZpb3VzIHR1bmluZyAqLworCQlpZihmZXByaXYtPnN0YXRlID09IEZFU1RBVEVfUkVUVU5FKSB7CisJCQllcnI9MDsKKwkJCSpzdGF0dXMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCisJCQllcnIgPSBmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgRkVfUkVBRF9CRVI6CiAJCWlmIChmZS0+b3BzLT5yZWFkX2JlcikKIAkJCWVyciA9IGZlLT5vcHMtPnJlYWRfYmVyKGZlLCAoX191MzIqKSBwYXJnKTsKQEAgLTY4MSw2ICs3MTEsNyBAQAogCQkJZXJyID0gZmUtPm9wcy0+c2V0X3RvbmUoZmUsIChmZV9zZWNfdG9uZV9tb2RlX3QpIHBhcmcpOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOworCQkJZmVwcml2LT50b25lID0gKGZlX3NlY190b25lX21vZGVfdCkgcGFyZzsKIAkJfQogCQlicmVhazsKIApAQCAtODgzLDYgKzkxNCw3IEBACiAJaW5pdF9NVVRFWCAoJmZlcHJpdi0+ZXZlbnRzLnNlbSk7CiAJZmUtPmR2YiA9IGR2YjsKIAlmZXByaXYtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PRkY7CisJZmVwcml2LT50b25lID0gU0VDX1RPTkVfT0ZGOwogCiAJcHJpbnRrICgiRFZCOiByZWdpc3RlcmluZyBmcm9udGVuZCAlaSAoJXMpLi4uXG4iLAogCQlmZS0+ZHZiLT5udW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCmluZGV4IGQyYjAyMTcuLjljMmMxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCkBAIC00MCwyOCArNDAsNiBAQAogCiAjaW5jbHVkZSAiZHZiZGV2LmgiCiAKLS8qIEZJWE1FOiBNb3ZlIHRvIGkyYy1pZC5oICovCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9TUDg4NzAJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0NYMjI3MDAJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0FUNzZDNjUxCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9DWDI0MTEwCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9DWDIyNzAyCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9ESUIzMDAwTUIJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0RTVAkJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0RVTU1ZCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9MNjQ3ODEJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX01UMzEyCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9NVDM1MglJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfTlhUNjAwMAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfU1A4ODdYCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9TVFYwMjk5CUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9UREExMDA0WAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVERBODA4MwlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVkVTMTgyMAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVkVTMVg5MwlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVERBODBYWAlJMkNfRFJJVkVSSURfRVhQMgotCi0KIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyB7CiAgICAgICAgIGludCBtaW5fZGVsYXlfbXM7CiAgICAgICAgIGludCBzdGVwX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKaW5kZXggOGFhMzJmNi4uNjEyZTViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwpAQCAtMywzMCArMywzNSBAQAogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgVVNCCiAJc2VsZWN0IEZXX0xPQURFUgogCWhlbHAKLQkgIEJ5IGVuYWJsaW5nIHRoaXMgeW91IHdpbGwgYmUgYWJsZSB0byBjaG9vc2UgdGhlIHZhcmlvdXMgVVNCIDEuMSBhbmQKLQkgIFVTQjIuMCBEVkIgZGV2aWNlcy4KKwkgIEJ5IGVuYWJsaW5nIHRoaXMgeW91IHdpbGwgYmUgYWJsZSB0byBjaG9vc2UgdGhlIHZhcmlvdXMgc3VwcG9ydGVkCisJICBVU0IxLjEgYW5kIFVTQjIuMCBEVkIgZGV2aWNlcy4KIAogCSAgQWxtb3N0IGV2ZXJ5IFVTQiBkZXZpY2UgbmVlZHMgYSBmaXJtd2FyZSwgcGxlYXNlIGxvb2sgaW50bwotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2I+CisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYj4uCiAKLQkgIFNheSBZIGlmIHlvdSBvd24gYW4gVVNCIERWQiBkZXZpY2UuCisJICBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBVU0IgZGV2aWNlcyBzZWUgdGhlIExpbnV4VFYgRFZCIFdpa2k6CisJICA8aHR0cDovL3d3dy5saW51eHR2Lm9yZy93aWtpL2luZGV4LnBocC9EVkJfVVNCPgorCisJICBTYXkgWSBpZiB5b3Ugb3duIGEgVVNCIERWQiBkZXZpY2UuCiAKIGNvbmZpZyBEVkJfVVNCX0RFQlVHCiAJYm9vbCAiRW5hYmxlIGV4dGVuZGVkIGRlYnVnIHN1cHBvcnQgZm9yIGFsbCBEVkItVVNCIGRldmljZXMiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCiAJaGVscAotCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGRlYnVnaW5nLiBTZWUgbW9kaW5mbyBkdmItdXNiIChhbmQgdGhlCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgZGVidWdnaW5nLiBTZWUgbW9kaW5mbyBkdmItdXNiIChhbmQgdGhlCiAJICBhcHByb3ByaWF0ZSBkcml2ZXJzKSBmb3IgZGVidWcgbGV2ZWxzLgogCiBjb25maWcgRFZCX1VTQl9BODAwCiAJdHJpc3RhdGUgIkFWZXJNZWRpYSBBdmVyVFYgRFZCLVQgVVNCIDIuMCAoQTgwMCkiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9ESUIzMDAwTUMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEFWZXJNZWRpYSBBdmVyVFYgRFZCLVQgVVNCIDIuMCAoQTgwMCkgcmVjZWl2ZXIuCiAKIGNvbmZpZyBEVkJfVVNCX0RJQlVTQl9NQgogCXRyaXN0YXRlICJEaUJjb20gVVNCIERWQi1UIGRldmljZXMgKGJhc2VkIG9uIHRoZSBEaUIzMDAwTS1CKSAoc2VlIGhlbHAgZm9yIGRldmljZSBsaXN0KSIKIAlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0RJQjMwMDBNQgogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFVTQiAxLjEgYW5kIDIuMCBEVkItVCByZWNlaXZlcnMgYmFzZWQgb24gcmVmZXJlbmNlIGRlc2lnbnMgbWFkZSBieQogCSAgRGlCY29tICg8aHR0cDovL3d3dy5kaWJjb20uZnI+KSBlcXVpcHBlZCB3aXRoIGEgRGlCMzAwME0tQiBkZW1vZHVsYXRvci4KQEAgLTUyLDYgKzU3LDcgQEAKIGNvbmZpZyBEVkJfVVNCX0RJQlVTQl9NQwogCXRyaXN0YXRlICJEaUJjb20gVVNCIERWQi1UIGRldmljZXMgKGJhc2VkIG9uIHRoZSBEaUIzMDAwTS1DL1ApIChzZWUgaGVscCBmb3IgZGV2aWNlIGxpc3QpIgogCWRlcGVuZHMgb24gRFZCX1VTQgorCXNlbGVjdCBEVkJfRElCMzAwME1DCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgMi4wIERWQi1UIHJlY2VpdmVycyBiYXNlZCBvbiByZWZlcmVuY2UgZGVzaWducyBtYWRlIGJ5CiAJICBEaUJjb20gKDxodHRwOi8vd3d3LmRpYmNvbS5mcj4pIGVxdWlwcGVkIHdpdGggYSBEaUIzMDAwTS1DL1AgZGVtb2R1bGF0b3IuCkBAIC02NiwxMiArNzIsMjMgQEAKIGNvbmZpZyBEVkJfVVNCX1VNVF8wMTAKIAl0cmlzdGF0ZSAiSGFuZlRlayBVTVQtMDEwIERWQi1UIFVTQjIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gRFZCX1VTQgorCXNlbGVjdCBEVkJfRElCMzAwME1DCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBIYW5mVGVrIFVNVC0wMTAgVVNCMi4wIHN0aWNrLXNpemVkIERWQi1UIHJlY2VpdmVyLgogCitjb25maWcgRFZCX1VTQl9DWFVTQgorCXRyaXN0YXRlICJNZWRpb24gTUQ5NTcwMCBoeWJyaWQgVVNCMi4wIChDb25leGFudCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0NYMjI3MDIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIE1lZGlvbiBNRDk1NzAwIGh5YnJpZCBVU0IyLjAgZGV2aWNlLiBDdXJyZW50bHkKKwkgIG9ubHkgdGhlIERWQi1UIHBhcnQgaXMgc3VwcG9ydGVkLgorCiBjb25maWcgRFZCX1VTQl9ESUdJVFYKIAl0cmlzdGF0ZSAiTmVidWxhIEVsZWN0cm9uaWNzIHVEaWdpVFYgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9OWFQ2MDAwCisJc2VsZWN0IERWQl9NVDM1MgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgTmVidWxhIEVsZWN0cm9uaWNzIHVEaWdpdFYgVVNCMi4wIERWQi1UIHJlY2VpdmVyLgogCkBAIC04NywxMyArMTA0LDE2IEBACiBjb25maWcgRFZCX1VTQl9OT1ZBX1RfVVNCMgogCXRyaXN0YXRlICJIYXVwcGF1Z2UgV2luVFYtTk9WQS1UIHVzYjIgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9ESUIzMDAwTUMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLVQgdXNiMiBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCiAKIGNvbmZpZyBEVkJfVVNCX0RUVDIwMFUKLQl0cmlzdGF0ZSAiWWFrdW1vL0hhbWEvVHlwaG9vbi9ZdWFuIERWQi1UIFVTQjIuMCBzdXBwb3J0IgorCXRyaXN0YXRlICJXaWRlVmlldyBXVC0yMDBVIGFuZCBXVC0yMjBVIChwZW4pIERWQi1UIFVTQjIuMCBzdXBwb3J0IChZYWt1bW8vSGFtYS9UeXBob29uL1l1YW4pIgogCWRlcGVuZHMgb24gRFZCX1VTQgogCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgWWFrdW1vL0hhbWEvVHlwaG9vbi9ZdWFuIERWQi1UIFVTQjIuMCByZWNlaXZlci4KKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgV2lkZVZpZXcvWWFrdW1vL0hhbWEvVHlwaG9vbi9ZdWFuIERWQi1UIFVTQjIuMCByZWNlaXZlci4KIAogCSAgVGhlIHJlY2VpdmVycyBhcmUgYWxzbyBrbm93biBhcyBEVFQyMDBVIChZYWt1bW8pIGFuZCBVQjMwMCAoWXVhbikuCisKKwkgIFRoZSBXVC0yMjBVIGFuZCBpdHMgY2xvbmVzIGFyZSBwZW4tc2l6ZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQppbmRleCBkNjViNTBmLi43NDZkODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKQEAgLTI3LDQgKzI3LDcgQEAKIGR2Yi11c2ItZGlnaXR2LW9ianMgPSBkaWdpdHYubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfRElHSVRWKSArPSBkdmItdXNiLWRpZ2l0di5vCiAKK2R2Yi11c2ItY3h1c2Itb2JqcyA9IGN4dXNiLm8KK29iai0kKENPTkZJR19EVkJfVVNCX0NYVVNCKSArPSBkdmItdXNiLWN4dXNiLm8KKwogRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2E4MDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCmluZGV4IGEzNTQyOTMuLmYyZmNjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCkBAIC02MSw2ICs2MSwxMiBAQAogCXsgMHgwMiwgMHgwMCwgS0VZX0xBU1QgfSwgICAgICAgIC8qID4+fCAvIEJMVUUgKi8KIAl7IDB4MDIsIDB4MDQsIEtFWV9FUEcgfSwgICAgICAgICAvKiBFUEcgKi8KIAl7IDB4MDIsIDB4MTUsIEtFWV9NRU5VIH0sICAgICAgICAvKiBNRU5VICovCisKKwl7IDB4MDMsIDB4MDMsIEtFWV9DSEFOTkVMVVAgfSwgICAvKiBDSCBVUCAqLworCXsgMHgwMywgMHgwMiwgS0VZX0NIQU5ORUxET1dOIH0sIC8qIENIIERPV04gKi8KKwl7IDB4MDMsIDB4MDEsIEtFWV9GSVJTVCB9LCAgICAgICAvKiB8PDwgLyBHUkVFTiAqLworCXsgMHgwMywgMHgwMCwgS0VZX0xBU1QgfSwgICAgICAgIC8qID4+fCAvIEJMVUUgKi8KKwogfTsKIAogaW50IGE4MDBfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQpAQCAtNjgsNyArNzQsNyBAQAogCXU4IGtleVs1XTsKIAlpZiAodXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsdXNiX3JjdmN0cmxwaXBlKGQtPnVkZXYsMCksCiAJCQkJMHgwNCwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiwgMCwgMCwga2V5LCA1LAotCQkJCTIqSFopICE9IDUpCisJCQkJMjAwMCkgIT0gNSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBjYWxsIHRoZSB1bml2ZXJzYWwgTkVDIHJlbW90ZSBwcm9jZXNzb3IsIHRvIGZpbmQgb3V0IHRoZSBrZXkncyBzdGF0ZSBhbmQgZXZlbnQgKi8KQEAgLTE0Myw3ICsxNDksNyBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgYTgwMF9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJBVmVyTWVkaWEgQXZlclRWIERWQi1UIFVTQiAyLjAgKEE4MDApIiwKKwkubmFtZQkJPSAiZHZiX3VzYl9hODAwIiwKIAkucHJvYmUJCT0gYTgwMF9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCiAJLmlkX3RhYmxlCT0gYTgwMF90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2UxYjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC0wLDAgKzEsMjk1IEBACisvKiBEVkIgVVNCIGNvbXBsaWFudCBsaW51eCBkcml2ZXIgZm9yIENvbmV4YW50IFVTQiByZWZlcmVuY2UgZGVzaWduLgorICoKKyAqIFRoZSBDb25leGFudCByZWZlcmVuY2UgZGVzaWduIEkgc2F3IG9uIHRoZWlyIHdlYnNpdGUgd2FzIG9ubHkgZm9yIGFuYWxvZ3VlCisgKiBjYXB0dXJpbmcgKHVzaW5nIHRoZSBjeDI1ODQyKS4gVGhlIGJveCBJIHRvb2sgdG8gd3JpdGUgdGhpcyBkcml2ZXIgKHJldmVyc2UKKyAqIGVuZ2luZWVyZWQpIGlzIHRoZSBvbmUgbGFiZWxlZCBNZWRpb24gTUQ5NTcwMC4gSW4gYWRkaXRpb24gdG8gdGhlIGN4MjU4NDIKKyAqIGZvciBhbmFsb2d1ZSBjYXB0dXJpbmcgaXQgYWxzbyBoYXMgYSBjeDIyNzAyIERWQi1UIGRlbW9kdWxhdG9yIG9uIHRoZSBtYWluCisgKiBib2FyZC4gQmVzaWRlcyBpdCBoYXMgYSBhdGlyZW1vdGUgKFgxMCkgYW5kIGEgVVNCMi4wIGh1YiBvbmJvYXJkLgorICoKKyAqIE1heWJlIGl0IGlzIGEgbGl0dGxlIGJpdCBwcmVtYXR1cmUgdG8gY2FsbCB0aGlzIGRyaXZlciBjeHVzYiwgYnV0IEkgYXNzdW1lCisgKiB0aGUgVVNCIHByb3RvY29sIGlzIGlkZW50aWNhbCBvciBhdCBsZWFzdCBpbmhlcml0ZWQgZnJvbSB0aGUgcmVmZXJlbmNlCisgKiBkZXNpZ24sIHNvIGl0IGNhbiBiZSByZXVzZWQgZm9yIHRoZSAiYW5hbG9ndWUtb25seSIgZGV2aWNlIChpZiBpdCB3aWxsCisgKiBhcHBlYXIgYXQgYWxsKS4KKyAqCisgKiBUT0RPOiBjaGVjayBpZiB0aGUgY3gyNTg0MC1kcml2ZXIgKGZyb20gaXZ0dikgY2FuIGJlIHVzZWQgZm9yIHRoZSBhbmFsb2d1ZQorICogcGFydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqCVNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqLworI2luY2x1ZGUgImN4dXNiLmgiCisKKyNpbmNsdWRlICJjeDIyNzAyLmgiCisKKy8qIGRlYnVnICovCitpbnQgZHZiX3VzYl9jeHVzYl9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX2N4dXNiX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9cmMgKG9yLWFibGUpKS4iIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKKworc3RhdGljIGludCBjeHVzYl9jdHJsX21zZyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsCisJCXU4IGNtZCwgdTggKndidWYsIGludCB3bGVuLCB1OCAqcmJ1ZiwgaW50IHJsZW4pCit7CisJaW50IHdvID0gKHJidWYgPT0gTlVMTCB8fCBybGVuID09IDApOyAvKiB3cml0ZS1vbmx5ICovCisJdTggc25kYnVmWzErd2xlbl07CisJbWVtc2V0KHNuZGJ1ZiwwLDErd2xlbik7CisKKwlzbmRidWZbMF0gPSBjbWQ7CisJbWVtY3B5KCZzbmRidWZbMV0sd2J1Zix3bGVuKTsKKwlpZiAod28pCisJCWR2Yl91c2JfZ2VuZXJpY193cml0ZShkLHNuZGJ1ZiwxK3dsZW4pOworCWVsc2UKKwkJZHZiX3VzYl9nZW5lcmljX3J3KGQsc25kYnVmLDErd2xlbixyYnVmLHJsZW4sMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogSTJDICovCitzdGF0aWMgdm9pZCBjeHVzYl9zZXRfaTJjX3BhdGgoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBlbnVtIGN4dXNiX2kyY19wYXRoZXMgcGF0aCkKK3sKKwlzdHJ1Y3QgY3h1c2Jfc3RhdGUgKnN0ID0gZC0+cHJpdjsKKwl1OCBvWzJdLGk7CisKKwlpZiAocGF0aCA9PSBzdC0+Y3VyX2kyY19wYXRoKQorCQlyZXR1cm47CisKKwlvWzBdID0gSU9DVExfU0VUX0kyQ19QQVRIOworCXN3aXRjaCAocGF0aCkgeworCQljYXNlIFBBVEhfQ1gyMjcwMjoKKwkJCW9bMV0gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgUEFUSF9UVU5FUl9PVEhFUjoKKwkJCW9bMV0gPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIoInVua293biBpMmMgcGF0aCIpOworCQkJcmV0dXJuOworCX0KKwljeHVzYl9jdHJsX21zZyhkLENNRF9JT0NUTCxvLDIsJmksMSk7CisKKwlpZiAoaSAhPSAweDAxKQorCQlkZWJfaW5mbygiaTJjX3BhdGggc2V0dGluZyBmYWlsZWQuXG4iKTsKKworCXN0LT5jdXJfaTJjX3BhdGggPSBwYXRoOworfQorCitzdGF0aWMgaW50IGN4dXNiX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCxzdHJ1Y3QgaTJjX21zZyBtc2dbXSxpbnQgbnVtKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IGk7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfc2VtKSA8IDApCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKG51bSA+IDIpCisJCXdhcm4oIm1vcmUgdGhhbiAyIGkyYyBtZXNzYWdlcyBhdCBhIHRpbWUgaXMgbm90IGhhbmRsZWQgeWV0LiBUT0RPLiIpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisKKwkJc3dpdGNoIChtc2dbaV0uYWRkcikgeworCQkJY2FzZSAweDYzOgorCQkJCWN4dXNiX3NldF9pMmNfcGF0aChkLFBBVEhfQ1gyMjcwMik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWN4dXNiX3NldF9pMmNfcGF0aChkLFBBVEhfVFVORVJfT1RIRVIpOworCQkJCWJyZWFrOworCQl9CisKKwkJLyogcmVhZCByZXF1ZXN0ICovCisJCWlmIChpKzEgPCBudW0gJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCQl1OCBvYnVmWzMrbXNnW2ldLmxlbl0sIGlidWZbMSttc2dbaSsxXS5sZW5dOworCQkJb2J1ZlswXSA9IG1zZ1tpXS5sZW47CisJCQlvYnVmWzFdID0gbXNnW2krMV0ubGVuOworCQkJb2J1ZlsyXSA9IG1zZ1tpXS5hZGRyOworCQkJbWVtY3B5KCZvYnVmWzNdLG1zZ1tpXS5idWYsbXNnW2ldLmxlbik7CisKKwkJCWlmIChjeHVzYl9jdHJsX21zZyhkLCBDTURfSTJDX1JFQUQsCisJCQkJCQlvYnVmLCAzK21zZ1tpXS5sZW4sCisJCQkJCQlpYnVmLCAxK21zZ1tpKzFdLmxlbikgPCAwKQorCQkJCWJyZWFrOworCisJCQlpZiAoaWJ1ZlswXSAhPSAweDA4KQorCQkJCWRlYl9pbmZvKCJpMmMgcmVhZCBjb3VsZCBoYXZlIGJlZW4gZmFpbGVkXG4iKTsKKworCQkJbWVtY3B5KG1zZ1tpKzFdLmJ1ZiwmaWJ1ZlsxXSxtc2dbaSsxXS5sZW4pOworCisJCQlpKys7CisJCX0gZWxzZSB7IC8qIHdyaXRlICovCisJCQl1OCBvYnVmWzIrbXNnW2ldLmxlbl0sIGlidWY7CisJCQlvYnVmWzBdID0gbXNnW2ldLmFkZHI7CisJCQlvYnVmWzFdID0gbXNnW2ldLmxlbjsKKwkJCW1lbWNweSgmb2J1ZlsyXSxtc2dbaV0uYnVmLG1zZ1tpXS5sZW4pOworCisJCQlpZiAoY3h1c2JfY3RybF9tc2coZCxDTURfSTJDX1dSSVRFLCBvYnVmLCAyK21zZ1tpXS5sZW4sICZpYnVmLDEpIDwgMCkKKwkJCQlicmVhazsKKwkJCWlmIChpYnVmICE9IDB4MDgpCisJCQkJZGViX2luZm8oImkyYyB3cml0ZSBjb3VsZCBoYXZlIGJlZW4gZmFpbGVkXG4iKTsKKwkJfQorCX0KKworCXVwKCZkLT5pMmNfc2VtKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHUzMiBjeHVzYl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGN4dXNiX2kyY19hbGdvID0geworCS5uYW1lICAgICAgICAgID0gIkNvbmV4YW50IFVTQiBJMkMgYWxnb3JpdGhtIiwKKwkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX0JJVCwKKwkubWFzdGVyX3hmZXIgICA9IGN4dXNiX2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gY3h1c2JfaTJjX2Z1bmMsCit9OworCitzdGF0aWMgaW50IGN4dXNiX3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3h1c2Jfc3RyZWFtaW5nX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJdTggYnVmWzJdID0geyAweDAzLCAweDAwIH07CisJaWYgKG9ub2ZmKQorCQljeHVzYl9jdHJsX21zZyhkLDB4MzYsIGJ1ZiwgMiwgTlVMTCwgMCk7CisJZWxzZQorCQljeHVzYl9jdHJsX21zZyhkLDB4MzcsIE5VTEwsIDAsIE5VTEwsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjeDIyNzAyX2NvbmZpZyBjeHVzYl9jeDIyNzAyX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4NjMsCisKKwkub3V0cHV0X21vZGUgPSBDWDIyNzAyX1BBUkFMTEVMX09VVFBVVCwKKworCS5wbGxfaW5pdCA9IGR2Yl91c2JfcGxsX2luaXRfaTJjLAorCS5wbGxfc2V0ICA9IGR2Yl91c2JfcGxsX3NldF9pMmMsCit9OworCisvKiBDYWxsYmFja3MgZm9yIERWQiBVU0IgKi8KK3N0YXRpYyBpbnQgY3h1c2JfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwl1OCBicGxsWzRdID0geyAweDBiLCAweGRjLCAweDljLCAweGEwIH07CisJZC0+cGxsX2FkZHIgPSAweDYxOworCW1lbWNweShkLT5wbGxfaW5pdCxicGxsLDQpOworCWQtPnBsbF9kZXNjID0gJmR2Yl9wbGxfZm1kMTIxNm1lOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4dXNiX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJdTggYnVmWzJdID0geyAweDAzLCAweDAwIH07CisJdTggYiA9IDA7CisKKwlpZiAodXNiX3NldF9pbnRlcmZhY2UoZC0+dWRldiwwLDApIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIHRvIGFsdHM9MCBmYWlsZWQiKTsKKworCWN4dXNiX2N0cmxfbXNnKGQsMHhkZSwmYiwwLE5VTEwsMCk7CisJY3h1c2Jfc2V0X2kyY19wYXRoKGQsUEFUSF9UVU5FUl9PVEhFUik7CisJY3h1c2JfY3RybF9tc2coZCxDTURfUE9XRVJfT0ZGLCBOVUxMLCAwLCAmYiwgMSk7CisKKwlpZiAodXNiX3NldF9pbnRlcmZhY2UoZC0+dWRldiwwLDYpIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIGZhaWxlZCIpOworCisJY3h1c2JfY3RybF9tc2coZCwweDM2LCBidWYsIDIsIE5VTEwsIDApOworCWN4dXNiX3NldF9pMmNfcGF0aChkLFBBVEhfQ1gyMjcwMik7CisJY3h1c2JfY3RybF9tc2coZCxDTURfUE9XRVJfT04sIE5VTEwsIDAsICZiLCAxKTsKKworCWlmICgoZC0+ZmUgPSBjeDIyNzAyX2F0dGFjaCgmY3h1c2JfY3gyMjcwMl9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU87Cit9CisKKy8qIERWQiBVU0IgRHJpdmVyIHN0dWZmICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBjeHVzYl9wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IGN4dXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmY3h1c2JfcHJvcGVydGllcyxUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBjeHVzYl90YWJsZSBbXSA9IHsKKwkJeyBVU0JfREVWSUNFKFVTQl9WSURfTUVESU9OLCBVU0JfUElEX01FRElPTl9NRDk1NzAwKSB9LAorCQl7fQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGN4dXNiX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgY3h1c2JfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisKKwkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBjeHVzYl9zdGF0ZSksCisKKwkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAorCS5wb3dlcl9jdHJsICAgICAgID0gY3h1c2JfcG93ZXJfY3RybCwKKwkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2Zyb250ZW5kX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX3R1bmVyX2F0dGFjaCwKKworCS5pMmNfYWxnbyAgICAgICAgID0gJmN4dXNiX2kyY19hbGdvLAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0lTT0MsCisJCS5jb3VudCA9IDUsCisJCS5lbmRwb2ludCA9IDB4MDIsCisJCS51ID0geworCQkJLmlzb2MgPSB7CisJCQkJLmZyYW1lc3BlcnVyYiA9IDMyLAorCQkJCS5mcmFtZXNpemUgPSA5NDAsCisJCQkJLmludGVydmFsID0gNSwKKwkJCX0KKwkJfQorCX0sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsgICAiTWVkaW9uIE1EOTU3MDAgKE1EVVNCVFYtSFlCUklEKSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJmN4dXNiX3RhYmxlWzBdLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGN4dXNiX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImR2Yl91c2JfY3h1c2IiLAorCS5wcm9iZQkJPSBjeHVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmlkX3RhYmxlCT0gY3h1c2JfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IGN4dXNiX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpZiAoKHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmY3h1c2JfZHJpdmVyKSkpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjeHVzYl9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZjeHVzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCAoY3h1c2JfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQgKGN4dXNiX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQ29uZXhhbnQgVVNCMi4wIGh5YnJpZCByZWZlcmVuY2UgZGVzaWduIik7CitNT0RVTEVfVkVSU0lPTigiMS4wLWFscGhhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3OTAxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9EVkJfVVNCX0NYVVNCX0hfCisjZGVmaW5lIF9EVkJfVVNCX0NYVVNCX0hfCisKKyNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJkaWdpdHYiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorCitleHRlcm4gaW50IGR2Yl91c2JfY3h1c2JfZGVidWc7CisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2N4dXNiX2RlYnVnLDB4MDEsYXJncykKKworLyogdXNiIGNvbW1hbmRzIC0gc29tZSBvZiBpdCBhcmUgZ3Vlc3NlcywgZG9uJ3QgaGF2ZSBhIHJlZmVyZW5jZSB5ZXQgKi8KKyNkZWZpbmUgQ01EX0kyQ19XUklURSAgICAweDA4CisjZGVmaW5lIENNRF9JMkNfUkVBRCAgICAgMHgwOQorCisjZGVmaW5lIENNRF9JT0NUTCAgICAgICAgMHgwZQorI2RlZmluZSAgICBJT0NUTF9TRVRfSTJDX1BBVEggMHgwMgorCisjZGVmaW5lIENNRF9QT1dFUl9PRkYgICAgMHg1MAorI2RlZmluZSBDTURfUE9XRVJfT04gICAgIDB4NTEKKworZW51bSBjeHVzYl9pMmNfcGF0aGVzIHsKKwlQQVRIX1VOREVGICAgICAgID0gMHgwMCwKKwlQQVRIX0NYMjI3MDIgICAgID0gMHgwMSwKKwlQQVRIX1RVTkVSX09USEVSID0gMHgwMiwKK307CisKK3N0cnVjdCBjeHVzYl9zdGF0ZSB7CisJZW51bSBjeHVzYl9pMmNfcGF0aGVzIGN1cl9pMmNfcGF0aDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKaW5kZXggYTBmZmJiNS4uODI4YjUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCkBAIC0zMSwxMCArMzEsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogc29tZSBvZiB0aGUgZGlidXNiIDEuMSBkZXZpY2UgYXJlbid0IGVxdWlwcGVkIHdpdGggdGhlIGRlZmF1bHQgdHVuZXIKK3N0YXRpYyBpbnQgZGlidXNiX3Rob21zb25fdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5wbGxfYWRkciA9IDB4NjE7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90dWE2MDEweHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNvbWUgb2YgdGhlIEFydGVjIDEuMSBkZXZpY2UgYXJlbid0IGVxdWlwcGVkIHdpdGggdGhlIGRlZmF1bHQgdHVuZXIKICAqIChUaG9tc29uIENhYmxlKSwgYnV0IHdpdGggYSBQYW5hc29uaWMgRU5WNzdIMTFENS4gIFRoaXMgZnVuY3Rpb24gZmlndXJlcwogICogdGhpcyBvdXQuICovCi1zdGF0aWMgaW50IGRpYnVzYl9kaWIzMDAwbWJfdHVuZXJfYXR0YWNoIChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCitzdGF0aWMgaW50IGRpYnVzYl90dW5lcl9wcm9iZV9hbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKIAl1OCBiWzJdID0geyAwLDAgfSwgYjJbMV07CiAJaW50IHJldCA9IDA7CkBAIC01OSw4ICs2Niw3IEBACiAKIAlpZiAoYjJbMF0gPT0gMHhmZSkgewogCQlpbmZvKCJ0aGlzIGRldmljZSBoYXMgdGhlIFRob21zb24gQ2FibGUgb25ib2FyZC4gV2hpY2ggaXMgZGVmYXVsdC4iKTsKLQkJZC0+cGxsX2FkZHIgPSAweDYxOwotCQlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3R1YTYwMTB4czsKKwkJZGlidXNiX3Rob21zb25fdHVuZXJfYXR0YWNoKGQpOwogCX0gZWxzZSB7CiAJCXU4IGJwbGxbNF0gPSB7IDB4MGIsIDB4ZjUsIDB4ODUsIDB4YWIgfTsKIAkJaW5mbygidGhpcyBkZXZpY2UgaGFzIHRoZSBQYW5hc29uaWMgRU5WNzdIMTFENSBvbmJvYXJkLiIpOwpAQCAtOTAsOCArOTYsOCBAQAogCiAvKiBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgSUQgdGFibGUgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkaWJ1c2JfZGliMzAwMG1iX3RhYmxlIFtdID0gewotLyogMDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBX1VOSywJVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfQ09MRCl9LAotLyogMDEgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBX1VOSywJVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfV0FSTSl9LAorLyogMDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsCQlVU0JfUElEX0FWRVJNRURJQV9EVkJUX1VTQl9DT0xEKX0sCisvKiAwMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywJCVVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCX1dBUk0pfSwKIC8qIDAyICovCXsgVVNCX0RFVklDRShVU0JfVklEX0NPTVBSTywJCVVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX0NPTEQpIH0sCiAvKiAwMyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9DT01QUk8sCQlVU0JfUElEX0NPTVBST19EVkJVMjAwMF9XQVJNKSB9LAogLyogMDQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQ09NUFJPX1VOSywJVVNCX1BJRF9DT01QUk9fRFZCVTIwMDBfVU5LX0NPTEQpIH0sCkBAIC0xMTQsNyArMTIwLDE3IEBACiAvKiAyMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X0NPTEQpIH0sCiAvKiAyMiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X1dBUk0pIH0sCiAvKiAyMyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BRFNURUNILAkJVVNCX1BJRF9BRFNURUNIX1VTQjJfQ09MRCkgfSwKKworLyogZGV2aWNlIElEIHdpdGggZGVmYXVsdCBESUJVU0IyXzAtZmlybXdhcmUgYW5kIHdpdGggdGhlIGhhY2tlZCBmaXJtd2FyZSAqLwogLyogMjQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQURTVEVDSCwJCVVTQl9QSURfQURTVEVDSF9VU0IyX1dBUk0pIH0sCisvKiAyNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9LWUUsCQkJVVNCX1BJRF9LWUVfRFZCX1RfQ09MRCkgfSwKKy8qIDI2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0tZRSwJCQlVU0JfUElEX0tZRV9EVkJfVF9XQVJNKSB9LAorCisvLyAjZGVmaW5lIERWQl9VU0JfRElCVVNCX01CX0ZBVUxUWV9VU0JfSURzCisKKyNpZmRlZiBEVkJfVVNCX0RJQlVTQl9NQl9GQVVMVFlfVVNCX0lEcworLyogMjcgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQU5DSE9SLAkJVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU5DSE9SX0NPTEQpIH0sCisjZW5kaWYKIAkJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRpYnVzYl9kaWIzMDAwbWJfdGFibGUpOwpAQCAtMTM0LDcgKzE1MCw3IEBACiAJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAogCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiX3Bvd2VyX2N0cmwsCiAJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKLQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWJfdHVuZXJfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3R1bmVyX3Byb2JlX2FuZF9hdHRhY2gsCiAKIAkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCiAJLnJjX2tleV9tYXAgICAgICAgPSBkaWJ1c2JfcmNfa2V5cywKQEAgLTE1Niw3ICsxNzIsNyBAQAogCQl9CiAJfSwKIAotCS5udW1fZGV2aWNlX2Rlc2NzID0gOCwKKwkubnVtX2RldmljZV9kZXNjcyA9IDksCiAJLmRldmljZXMgPSB7CiAJCXsJIkFWZXJNZWRpYSBBdmVyVFYgRFZCVCBVU0IxLjEiLAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVswXSwgIE5VTEwgfSwKQEAgLTE5MCwxMSArMjA2LDE3IEBACiAJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzE5XSwgTlVMTCB9LAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyMF0sIE5VTEwgfSwKIAkJfSwKKwkJewkiVmlkZW9XYWxrZXIgRFZCLVQgVVNCIiwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjVdLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI2XSwgTlVMTCB9LAorCQl9LAogCX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGRpYnVzYjFfMV9hbjIyMzVfcHJvcGVydGllcyA9IHsKIAkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgfCBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS5waWRfZmlsdGVyX2NvdW50ID0gMTYsCisKIAkudXNiX2N0cmwgPSBDWVBSRVNTX0FOMjIzNSwKIAogCS5maXJtd2FyZSA9ICJkdmItdXNiLWRpYnVzYi1hbjIyMzUtMDEuZnciLApAQCAtMjA2LDcgKzIyOCw3IEBACiAJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAogCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiX3Bvd2VyX2N0cmwsCiAJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKLQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWJfdHVuZXJfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3R1bmVyX3Byb2JlX2FuZF9hdHRhY2gsCiAKIAkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCiAJLnJjX2tleV9tYXAgICAgICAgPSBkaWJ1c2JfcmNfa2V5cywKQEAgLTIyOCwyMCArMjUwLDMyIEBACiAJCX0KIAl9LAogCisjaWZkZWYgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZX1VTQl9JRHMKKwkubnVtX2RldmljZV9kZXNjcyA9IDIsCisjZWxzZQogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKyNlbmRpZgogCS5kZXZpY2VzID0gewogCQl7CSJBcnRlYyBUMSBVU0IxLjEgVFZCT1ggd2l0aCBBTjIyMzUiLAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyMF0sIE5VTEwgfSwKIAkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjFdLCBOVUxMIH0sCiAJCX0sCisjaWZkZWYgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZX1VTQl9JRHMKKwkJewkiQXJ0ZWMgVDEgVVNCMS4xIFRWQk9YIHdpdGggQU4yMjM1IChmYXVsdHkgVVNCIElEcykiLAorCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyN10sIE5VTEwgfSwKKwkJCXsgTlVMTCB9LAorCQl9LAorI2VuZGlmCiAJfQogfTsKIAogc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgZGlidXNiMl8wYl9wcm9wZXJ0aWVzID0gewogCS5jYXBzID0gRFZCX1VTQl9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiB8IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwogCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAogCi0JLmZpcm13YXJlID0gImR2Yi11c2ItYWRzdGVjaC11c2IyLTAxLmZ3IiwKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1hZHN0ZWNoLXVzYjItMDIuZnciLAogCiAJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAKQEAgLTI1MCw3ICsyODQsNyBAQAogCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKIAkucG93ZXJfY3RybCAgICAgICA9IGRpYnVzYjJfMF9wb3dlcl9jdHJsLAogCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtYl9mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBkaWJ1c2JfZGliMzAwMG1iX3R1bmVyX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl90aG9tc29uX3R1bmVyX2F0dGFjaCwKIAogCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKIAkucmNfa2V5X21hcCAgICAgICA9IGRpYnVzYl9yY19rZXlzLApAQCAtMjcyLDE4ICszMDYsMTggQEAKIAkJfQogCX0sCiAKLQkubnVtX2RldmljZV9kZXNjcyA9IDIsCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAogCS5kZXZpY2VzID0gewogCQl7CSJLV29ybGQvQURTVGVjaCBJbnN0YW50IERWQi1UIFVTQiAyLjAiLAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyM10sIE5VTEwgfSwKLQkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjRdLCBOVUxMIH0sIC8qIGRldmljZSBJRCB3aXRoIGRlZmF1bHQgRElCVVNCMl8wLWZpcm13YXJlICovCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI0XSwgTlVMTCB9LAogCQl9LAogCX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkaWJ1c2JfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiRGlCY29tIGJhc2VkIFVTQiBEVkItVCBkZXZpY2VzIChEaUIzMDAwTS1CIGJhc2VkKSIsCisJLm5hbWUJCT0gImR2Yl91c2JfZGlidXNiX21iIiwKIAkucHJvYmUJCT0gZGlidXNiX3Byb2JlLAogCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKIAkuaWRfdGFibGUJPSBkaWJ1c2JfZGliMzAwMG1iX3RhYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKaW5kZXggYWFkOGVkMy4uZTlkYWM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jCkBAIC04Myw3ICs4Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkaWJ1c2JfbWNfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiRGlCY29tIGJhc2VkIFVTQjIuMCBEVkItVCAoRGlCMzAwME0tQy9QIGJhc2VkKSBkZXZpY2VzIiwKKwkubmFtZQkJPSAiZHZiX3VzYl9kaWJ1c2JfbWMiLAogCS5wcm9iZQkJPSBkaWJ1c2JfbWNfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAogCS5pZF90YWJsZQk9IGRpYnVzYl9kaWIzMDAwbWNfdGFibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYwppbmRleCA1YWNmM2ZkLi45YTY3NmFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCkBAIC0xLDEwICsxLDkgQEAKIC8qIERWQiBVU0IgY29tcGxpYW50IGxpbnV4IGRyaXZlciBmb3IgTmVidWxhIEVsZWN0cm9uaWNzIHVEaWdpVFYgRFZCLVQgVVNCMi4wCiAgKiByZWNlaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsYW4gVGhpcmQgKGFsbGFuLnRoaXJkQGNzLm1hbi5hYy51aykKKyAqIENvcHlyaWdodCAoQykgMjAwNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKICAqCi0gKiBwYXJ0bHkgYmFzZWQgb24gdGhlIFNESyBwdWJsaXNoZWQgYnkgTmVidWxhIEVsZWN0cm9uaWNzIChUT0RPIGRvIHdlIHdhbnQgdGhpcyBsaW5lID8pCisgKiBwYXJ0bHkgYmFzZWQgb24gdGhlIFNESyBwdWJsaXNoZWQgYnkgTmVidWxhIEVsZWN0cm9uaWNzCiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCkBAIC0zOCw3ICszNyw3IEBACiAJCWR2Yl91c2JfZ2VuZXJpY193cml0ZShkLHNuZGJ1Ziw3KTsKIAl9IGVsc2UgewogCQlkdmJfdXNiX2dlbmVyaWNfcncoZCxzbmRidWYsNyxyY3ZidWYsNywxMCk7Ci0JCW1lbWNweSgmcmJ1ZiwmcmN2YnVmWzNdLHJsZW4pOworCQltZW1jcHkocmJ1ZiwmcmN2YnVmWzNdLHJsZW4pOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTk1LDQxICs5NCwyMCBAQAogCiBzdGF0aWMgaW50IGRpZ2l0dl9tdDM1Ml9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewotCXN0YXRpYyB1OCBtdDM1Ml9jbG9ja19jb25maWdbXSA9IHsgMHg4OSwgMHgzOCwgMHgyZCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9yZXNldFtdID0geyAweDUwLCAweDgwIH07Ci0Jc3RhdGljIHU4IG10MzUyX21jbGtfcmF0aW9bXSA9IHsgMHg4YiwgMHgwMCB9OworCXN0YXRpYyB1OCByZXNldF9idWZbXSA9IHsgMHg4OSwgMHgzOCwgIDB4OGEsIDB4MmQsIDB4NTAsIDB4ODAgfTsKKwlzdGF0aWMgdTggaW5pdF9idWZbXSA9IHsgMHg2OCwgMHhhMCwgIDB4OGUsIDB4NDAsICAweDUzLCAweDUwLAorCQkJMHg2NywgMHgyMCwgIDB4N2QsIDB4MDEsICAweDdjLCAweDAwLCAgMHg3YSwgMHgwMCwKKwkJCTB4NzksIDB4MjAsICAweDU3LCAweDA1LCAgMHg1NiwgMHgzMSwgIDB4ODgsIDB4MGYsCisJCQkweDc1LCAweDMyIH07CisJaW50IGk7CiAKLQlzdGF0aWMgdTggbXQzNTJfYWdjX2NmZ1tdID0geyAweDY4LCAweGEwIH07Ci0Jc3RhdGljIHU4IG10MzUyX2FkY19jdGxfMV9jZmdbXSA9IHsgMHg4RSwgMHhhMCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9hY3FfY3RsW10gPSB7IDB4NTMsIDB4NTAgfTsKLQlzdGF0aWMgdTggbXQzNTJfYWdjX3RhcmdldFtdID0geyAweDY3LCAweDIwIH07CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVzZXRfYnVmKTsgaSArPSAyKQorCQltdDM1Ml93cml0ZShmZSwgJnJlc2V0X2J1ZltpXSwgMik7CiAKLQlzdGF0aWMgdTggbXQzNTJfcnNfZXJyX3BlcltdID0geyAweDdjLCAweDAwLCAweDAxIH07Ci0Jc3RhdGljIHU4IG10MzUyX3Nucl9zZWxlY3RbXSA9IHsgMHg3OSwgMHgwMCwgMHgyMCB9OwotCi0Jc3RhdGljIHU4IG10MzUyX2lucHV0X2ZyZXFfMVtdID0geyAweDU2LCAweDMxLCAweDA1IH07Ci0KLQlzdGF0aWMgdTggbXQzNTJfc2Nhbl9jdGxbXSA9IHsgMHg4OCwgMHgwZiB9OwotCXN0YXRpYyB1OCBtdDM1Ml9jYXB0X3JhbmdlW10gPSB7IDB4NzUsIDB4MzIgfTsKLQotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9jbG9ja19jb25maWcsIHNpemVvZihtdDM1Ml9jbG9ja19jb25maWcpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfcmVzZXQsIHNpemVvZihtdDM1Ml9yZXNldCkpOwogCW1zbGVlcCgxKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfbWNsa19yYXRpbywgc2l6ZW9mKG10MzUyX21jbGtfcmF0aW8pKTsKIAotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZ2NfY2ZnLCBzaXplb2YobXQzNTJfYWdjX2NmZykpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZGNfY3RsXzFfY2ZnLCBzaXplb2YobXQzNTJfYWRjX2N0bF8xX2NmZykpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hY3FfY3RsLCBzaXplb2YobXQzNTJfYWNxX2N0bCkpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZ2NfdGFyZ2V0LCBzaXplb2YobXQzNTJfYWdjX3RhcmdldCkpOwotCi0KLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfcnNfZXJyX3Blciwgc2l6ZW9mKG10MzUyX3JzX2Vycl9wZXIpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfc25yX3NlbGVjdCwgc2l6ZW9mKG10MzUyX3Nucl9zZWxlY3QpKTsKLQotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9pbnB1dF9mcmVxXzEsIHNpemVvZihtdDM1Ml9pbnB1dF9mcmVxXzEpKTsKLQotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9zY2FuX2N0bCwgc2l6ZW9mKG10MzUyX3NjYW5fY3RsKSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2NhcHRfcmFuZ2UsIHNpemVvZihtdDM1Ml9jYXB0X3JhbmdlKSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF9idWYpOyBpICs9IDIpCisJCW10MzUyX3dyaXRlKGZlLCAmaW5pdF9idWZbaV0sIDIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzcsNyArMTE1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGRpZ2l0dl9tdDM1Ml9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDAsIC8qIGlnbm9yZWQgYnkgdGhlIGRpZ2l0diBhbnl3YXkgKi8KIAkuZGVtb2RfaW5pdCA9IGRpZ2l0dl9tdDM1Ml9kZW1vZF9pbml0LAotCS5wbGxfc2V0ID0gTlVMTCwgLyogVE9ETyAqLworCS5wbGxfc2V0ID0gZHZiX3VzYl9wbGxfc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBueHQ2MDAwX2NvbmZpZyBkaWdpdHZfbnh0NjAwMF9jb25maWcgPSB7CkBAIC0xNTAsOSArMTI4LDkgQEAKIAogc3RhdGljIGludCBkaWdpdHZfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKLQlpZiAoKGQtPmZlID0gbXQzNTJfYXR0YWNoKCZkaWdpdHZfbXQzNTJfY29uZmlnLCAmZC0+aTJjX2FkYXApKSA9PSBOVUxMKQorCWlmICgoZC0+ZmUgPSBtdDM1Ml9hdHRhY2goJmRpZ2l0dl9tdDM1Ml9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpCiAJCXJldHVybiAwOwotCWlmICgoZC0+ZmUgPSBueHQ2MDAwX2F0dGFjaCgmZGlnaXR2X254dDYwMDBfY29uZmlnLCAmZC0+aTJjX2FkYXApKSA9PSBOVUxMKSB7CisJaWYgKChkLT5mZSA9IG54dDYwMDBfYXR0YWNoKCZkaWdpdHZfbnh0NjAwMF9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKIAogCQl3YXJuKCJueHQ2MDAwIHN1cHBvcnQgaXMgbm90IGRvbmUgeWV0LCBpbiBmYWN0IHlvdSBhcmUgb25lIG9mIHRoZSBmaXJzdCAiCiAJCQkJInBlcnNvbiB3aG8gd2FudHMgdG8gdXNlIHRoaXMgZGV2aWNlIGluIExpbnV4LiBQbGVhc2UgcmVwb3J0IHRvICIKQEAgLTE2Myw2ICsxNDEsMTMgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAorc3RhdGljIGludCBkaWdpdHZfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5wbGxfYWRkciA9IDB4NjA7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90ZGVkNDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBkaWdpdHZfcmNfa2V5c1tdID0gewogCXsgMHgwMCwgMHgxNiwgS0VZX1BPV0VSIH0sIC8qIGR1bW15IGtleSAqLwogfTsKQEAgLTE4NCw3ICsxNjksNiBAQAogCXJldHVybiAwOwogfQogCi0KIC8qIERWQiBVU0IgRHJpdmVyIHN0dWZmICovCiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkaWdpdHZfcHJvcGVydGllczsKIApAQCAtMjA4LDEzICsxOTIsOCBAQAogCiAJLnNpemVfb2ZfcHJpdiAgICAgPSAwLAogCi0JLnN0cmVhbWluZ19jdHJsICAgPSBOVUxMLAotCS5waWRfZmlsdGVyICAgICAgID0gTlVMTCwKLQkucGlkX2ZpbHRlcl9jdHJsICA9IE5VTEwsCi0JLnBvd2VyX2N0cmwgICAgICAgPSBOVUxMLAogCS5mcm9udGVuZF9hdHRhY2ggID0gZGlnaXR2X2Zyb250ZW5kX2F0dGFjaCwKLQkudHVuZXJfYXR0YWNoICAgICA9IE5VTEwsIC8vIGRpZ2l0dl90dW5lcl9hdHRhY2gsCi0JLnJlYWRfbWFjX2FkZHJlc3MgPSBOVUxMLAorCS50dW5lcl9hdHRhY2ggICAgID0gZGlnaXR2X3R1bmVyX2F0dGFjaCwKIAogCS5yY19pbnRlcnZhbCAgICAgID0gMTAwMCwKIAkucmNfa2V5X21hcCAgICAgICA9IGRpZ2l0dl9yY19rZXlzLApAQCAtMjM4LDcgKzIxNyw3IEBACiAJCX0KIAl9LAogCi0JLm51bV9kZXZpY2VfZGVzY3MgPSAyLAorCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKIAkuZGV2aWNlcyA9IHsKIAkJeyAgICJOZWJ1bGEgRWxlY3Ryb25pY3MgdURpZ2lUViBEVkItVCBVU0IyLjApIiwKIAkJCXsgJmRpZ2l0dl90YWJsZVswXSwgTlVMTCB9LApAQCAtMjQ5LDcgKzIyOCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkaWdpdHZfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiTmVidWxhIEVsZWN0cm9uaWNzIHVEaWdpVFYgRFZCLVQgVVNCMi4wIGRldmljZSIsCisJLm5hbWUJCT0gImR2Yl91c2JfZGlnaXR2IiwKIAkucHJvYmUJCT0gZGlnaXR2X3Byb2JlLAogCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKIAkuaWRfdGFibGUJPSBkaWdpdHZfdGFibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCmluZGV4IGQxN2Q3NjguLmIwMzI1MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCkBAIC0xLDUgKzEsNSBAQAotLyogRnJvbnRlbmQgcGFydCBvZiB0aGUgTGludXggZHJpdmVyIGZvciB0aGUgWWFrdW1vL0hhbWEvVHlwaG9vbiBEVkItVAotICogVVNCMi4wIHJlY2VpdmVyLgorLyogRnJvbnRlbmQgcGFydCBvZiB0aGUgTGludXggZHJpdmVyIGZvciB0aGUgV2lkZVZpZXcvIFlha3Vtby8gSGFtYS8KKyAqIFR5cGhvb24vIFl1YW4gRFZCLVQgVVNCMi4wIHJlY2VpdmVyLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNSBQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4KICAqCkBAIC0xNCw2MSArMTQsNTggQEAKIHN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQ7CiAKKwlmZV9zdGF0dXNfdCBzdGF0OworCiAJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIGZlcDsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogfTsKIAotI2RlZmluZSBtb2FuKHdoaWNoLHdoYXQpIGluZm8oInVuZXhwZWN0ZWQgdmFsdWUgaW4gJyVzJyBmb3IgY21kICclMDJ4JyAtIHBsZWFzZSByZXBvcnQgdG8gbGludXgtZHZiQGxpbnV4dHYub3JnIix3aGljaCx3aGF0KQotCiBzdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190ICpzdGF0KQogewogCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJ3ID0gR0VUX1RVTkVfU1RBVDsKLQl1OCBiclszXSA9IHsgMCB9OwotLy8JdTggYmRlYls1XSA9IHsgMCB9OworCXU4IHN0ID0gR0VUX1RVTkVfU1RBVFVTLCBiWzNdOwogCi0JZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZidywxLGJyLDMsMCk7Ci0Jc3dpdGNoIChiclswXSkgeworCWR2Yl91c2JfZ2VuZXJpY19ydyhzdGF0ZS0+ZCwmc3QsMSxiLDMsMCk7CisKKwlzd2l0Y2ggKGJbMF0pIHsKIAkJY2FzZSAweDAxOgotCQkJKnN0YXQgPSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfVklURVJCSSB8IEZFX0hBU19TWU5DIHwgRkVfSEFTX0xPQ0s7CisJCQkqc3RhdCA9IEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfQ0FSUklFUiB8CisJCQkJRkVfSEFTX1ZJVEVSQkkgfCBGRV9IQVNfU1lOQyB8IEZFX0hBU19MT0NLOwogCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMDoKLQkJCSpzdGF0ID0gMDsKKwkJY2FzZSAweDAwOiAvKiBwZW5kaW5nICovCisJCQkqc3RhdCA9IEZFX1RJTUVET1VUOyAvKiBkdXJpbmcgc2V0X2Zyb250ZW5kICovCiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCW1vYW4oImJyWzBdIixHRVRfVFVORV9TVEFUKTsKKwkJY2FzZSAweDAyOiAvKiBmYWlsZWQgKi8KKwkJCSpzdGF0ID0gMDsKIAkJCWJyZWFrOwogCX0KLQotLy8JYndbMF0gPSAweDg4OwotLy8JZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLGJ3LDEsYmRlYiw1LDApOwotCi0vLwlkZWJfaW5mbygiJTAyeDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLGJ3WzBdLGJkZWJbMF0sYmRlYlsxXSxiZGViWzJdLGJkZWJbM10sYmRlYls0XSk7Ci0KIAlyZXR1cm4gMDsKIH0KKwogc3RhdGljIGludCBkdHQyMDB1X2ZlX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKmJlcikKIHsKIAlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1OCBidyA9IEdFVF9CRVI7Ci0JKmJlciA9IDA7Ci0JZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZidywxLCh1OCopIGJlciwzLDApOworCXU4IGJ3ID0gR0VUX1ZJVF9FUlJfQ05ULGJbM107CisJZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZidywxLGIsMywwKTsKKwkqYmVyID0gKGJbMF0gPDwgMTYpIHwgKGJbMV0gPDwgOCkgfCBiWzJdOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF91bmNfYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKnVuYykKIHsKIAlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1OCBidyA9IEdFVF9VTks7Ci0JKnVuYyA9IDA7Ci0JZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZidywxLCh1OCopIHVuYywzLDApOworCXU4IGJ3ID0gR0VUX1JTX1VOQ09SX0JMS19DTlQsYlsyXTsKKworCWR2Yl91c2JfZ2VuZXJpY19ydyhzdGF0ZS0+ZCwmYncsMSxiLDIsMCk7CisJKnVuYyA9IChiWzBdIDw8IDgpIHwgYlsxXTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkdHQyMDB1X2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYgKnN0cmVuZ3RoKQogewogCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJ3ID0gR0VUX1NJR19TVFJFTkdUSCwgYjsKKwl1OCBidyA9IEdFVF9BR0MsIGI7CiAJZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZidywxLCZiLDEsMCk7CiAJKnN0cmVuZ3RoID0gKGIgPDwgOCkgfCBiOwogCXJldHVybiAwOwpAQCAtODYsNyArODMsNyBAQAogc3RhdGljIGludCBkdHQyMDB1X2ZlX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdTggYiA9IFJFU0VUX0RFTU9EOworCXU4IGIgPSBTRVRfSU5JVDsKIAlyZXR1cm4gZHZiX3VzYl9nZW5lcmljX3dyaXRlKHN0YXRlLT5kLCZiLDEpOwogfQogCkBAIC05OCw4ICs5NSw4IEBACiBzdGF0aWMgaW50IGR0dDIwMHVfZmVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqdHVuZSkKIHsKIAl0dW5lLT5taW5fZGVsYXlfbXMgPSAxNTAwOwotCXR1bmUtPnN0ZXBfc2l6ZSA9IDE2NjY2NzsKLQl0dW5lLT5tYXhfZHJpZnQgPSAxNjY2NjcgKiAyOworCXR1bmUtPnN0ZXBfc2l6ZSA9IDA7CisJdHVuZS0+bWF4X2RyaWZ0ID0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA3LDI3ICsxMDQsMzIgQEAKIAkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQogewogCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCBpOworCWZlX3N0YXR1c190IHN0OwogCXUxNiBmcmVxID0gZmVwLT5mcmVxdWVuY3kgLyAyNTAwMDA7Ci0JdTggYncsYndidWZbMl0gPSB7IFNFVF9CQU5EV0lEVEgsIDAgfSwgZnJlcWJ1ZlszXSA9IHsgU0VUX0ZSRVFVRU5DWSwgMCwgMCB9OworCXU4IGJ3YnVmWzJdID0geyBTRVRfQkFORFdJRFRILCAwIH0sZnJlcWJ1ZlszXSA9IHsgU0VUX1JGX0ZSRVEsIDAsIDAgfTsKIAogCXN3aXRjaCAoZmVwLT51Lm9mZG0uYmFuZHdpZHRoKSB7Ci0JCWNhc2UgQkFORFdJRFRIXzhfTUhaOiBidyA9IDg7IGJyZWFrOwotCQljYXNlIEJBTkRXSURUSF83X01IWjogYncgPSA3OyBicmVhazsKLQkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6IGJ3ID0gNjsgYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzhfTUhaOiBid2J1ZlsxXSA9IDg7IGJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjogYndidWZbMV0gPSA3OyBicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6IGJ3YnVmWzFdID0gNjsgYnJlYWs7CiAJCWNhc2UgQkFORFdJRFRIX0FVVE86IHJldHVybiAtRU9QTk9UU1VQUDsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KLQlkZWJfaW5mbygic2V0X2Zyb250ZW5kXG4iKTsKIAotCWJ3YnVmWzFdID0gYnc7CiAJZHZiX3VzYl9nZW5lcmljX3dyaXRlKHN0YXRlLT5kLGJ3YnVmLDIpOwogCiAJZnJlcWJ1ZlsxXSA9IGZyZXEgJiAweGZmOwogCWZyZXFidWZbMl0gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7CiAJZHZiX3VzYl9nZW5lcmljX3dyaXRlKHN0YXRlLT5kLGZyZXFidWYsMyk7CiAKLQltZW1jcHkoJnN0YXRlLT5mZXAsZmVwLHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykgeworCQltc2xlZXAoMjApOworCQlkdHQyMDB1X2ZlX3JlYWRfc3RhdHVzKGZlLCAmc3QpOworCQlpZiAoc3QgJiBGRV9USU1FRE9VVCkKKwkJCWNvbnRpbnVlOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTc0LDcgKzE3Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkdHQyMDB1X2ZlX29wcyA9IHsKIAkuaW5mbyA9IHsKLQkJLm5hbWUJCQk9ICJEVFQyMDBVIChZYWt1bW8vVHlwaG9vbi9IYW1hKSBEVkItVCIsCisJCS5uYW1lCQkJPSAiV2lkZVZpZXcgVVNCIERWQi1UIiwKIAkJLnR5cGUJCQk9IEZFX09GRE0sCiAJCS5mcmVxdWVuY3lfbWluCQk9IDQ0MjUwMDAwLAogCQkuZnJlcXVlbmN5X21heAkJPSA4NjcyNTAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jCmluZGV4IGZiMmI1YTIuLjQ3ZGJhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jCkBAIC0xLDggKzEsMTAgQEAKLS8qIERWQiBVU0IgbGlicmFyeSBjb21wbGlhbnQgTGludXggZHJpdmVyIGZvciB0aGUgWWFrdW1vL0hhbWEvVHlwaG9vbiBEVkItVAotICogVVNCMi4wIHJlY2VpdmVyLgorLyogRFZCIFVTQiBsaWJyYXJ5IGNvbXBsaWFudCBMaW51eCBkcml2ZXIgZm9yIHRoZSBXaWRlVmlldy8gWWFrdW1vLyBIYW1hLworICogVHlwaG9vbi8gWXVhbiBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCiAgKgorICogVGhhbmtzIHRvIFN0ZXZlIENoYW5nIGZyb20gV2lkZVZpZXcgZm9yIHByb3ZpZGluZyBzdXBwb3J0IGZvciB0aGUgV1QtMjIwVS4KKyAqCiAgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICAqCVNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KQEAgLTE2LDE0ICsxOCwyNCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGR2Yl91c2JfZHR0MjAwdV9kZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8seGZlcj0yIChvci1hYmxlKSkuIiBEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CiAKK3N0YXRpYyBpbnQgZHR0MjAwdV9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCXU4IGIgPSBTRVRfSU5JVDsKKworCWlmIChvbm9mZikKKwkJZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsJmIsMik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBkdHQyMDB1X3N0cmVhbWluZ19jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQogewotCXU4IGJfc3RyZWFtaW5nWzJdID0geyBTRVRfVFNfQ1RSTCwgb25vZmYgfTsKKwl1OCBiX3N0cmVhbWluZ1syXSA9IHsgU0VUX1NUUkVBTUlORywgb25vZmYgfTsKIAl1OCBiX3JzdF9waWQgPSBSRVNFVF9QSURfRklMVEVSOwogCiAJZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsYl9zdHJlYW1pbmcsMik7CiAKLQlpZiAoIW9ub2ZmKQorCWlmIChvbm9mZiA9PSAwKQogCQlkdmJfdXNiX2dlbmVyaWNfd3JpdGUoZCwmYl9yc3RfcGlkLDEpOwogCXJldHVybiAwOwogfQpAQCAtMzYsNyArNDgsNyBAQAogCWJfcGlkWzBdID0gU0VUX1BJRF9GSUxURVI7CiAJYl9waWRbMV0gPSBpbmRleDsKIAliX3BpZFsyXSA9IHBpZCAmIDB4ZmY7Ci0JYl9waWRbM10gPSAocGlkID4+IDgpICYgMHhmZjsKKwliX3BpZFszXSA9IChwaWQgPj4gOCkgJiAweDFmOwogCiAJcmV0dXJuIGR2Yl91c2JfZ2VuZXJpY193cml0ZShkLGJfcGlkLDQpOwogfQpAQCAtNTQsOSArNjYsOSBAQAogCXsgMHg4MCwgMHgwOCwgS0VZXzUgfSwKIAl7IDB4ODAsIDB4MDksIEtFWV82IH0sCiAJeyAweDgwLCAweDBhLCBLRVlfNyB9LAotCXsgMHgwMCwgMHgwYywgS0VZX1pPT00gfSwKKwl7IDB4ODAsIDB4MGMsIEtFWV9aT09NIH0sCiAJeyAweDgwLCAweDBkLCBLRVlfMCB9LAotCXsgMHgwMCwgMHgwZSwgS0VZX1NFTEVDVCB9LAorCXsgMHg4MCwgMHgwZSwgS0VZX1NFTEVDVCB9LAogCXsgMHg4MCwgMHgxMiwgS0VZX1BPV0VSIH0sCiAJeyAweDgwLCAweDFhLCBLRVlfQ0hBTk5FTFVQIH0sCiAJeyAweDgwLCAweDFiLCBLRVlfOCB9LApAQCAtNjYsNyArNzgsNyBAQAogCiBzdGF0aWMgaW50IGR0dDIwMHVfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQogewotCXU4IGtleVs1XSxjbWQgPSBHRVRfUkNfS0VZOworCXU4IGtleVs1XSxjbWQgPSBHRVRfUkNfQ09ERTsKIAlkdmJfdXNiX2dlbmVyaWNfcncoZCwmY21kLDEsa2V5LDUsMCk7CiAJZHZiX3VzYl9uZWNfcmNfa2V5X3RvX2V2ZW50KGQsa2V5LGV2ZW50LHN0YXRlKTsKIAlpZiAoa2V5WzBdICE9IDApCkBAIC04MSwzMiArOTMsNDEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgZHR0MjAwdV9wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgd3QyMjB1X3Byb3BlcnRpZXM7CiAKIHN0YXRpYyBpbnQgZHR0MjAwdV91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkdHQyMDB1X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpOworCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmR0dDIwMHVfcHJvcGVydGllcyxUSElTX01PRFVMRSkgPT0gMCB8fAorCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnd0MjIwdV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZHR0MjAwdV91c2JfdGFibGUgW10gPSB7Ci0JICAgIHsgVVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQV9VTkssIFVTQl9QSURfRFRUMjAwVV9DT0xEKSB9LAotCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BVkVSTUVESUFfVU5LLCBVU0JfUElEX0RUVDIwMFVfV0FSTSkgfSwKKy8vCQl7IFVTQl9ERVZJQ0UoMHgwNGI0LDB4ODYxMykgfSwKKwkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfRFRUMjAwVV9DT0xEKSB9LAorCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9EVFQyMDBVX1dBUk0pIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX1dUMjIwVV9DT0xEKSAgfSwKKwkJeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfV1QyMjBVX1dBUk0pICB9LAogCSAgICB7IDAgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZHR0MjAwdV91c2JfdGFibGUpOwogCiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkdHQyMDB1X3Byb3BlcnRpZXMgPSB7CiAJLmNhcHMgPSBEVkJfVVNCX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9ORUVEX1BJRF9GSUxURVJJTkcsCi0JLnBpZF9maWx0ZXJfY291bnQgPSAyNTUsIC8qIEl0IGlzIGEgZ3Vlc3MsIGJ1dCB0aGVyZSBhcmUgYXQgbGVhc3QgMTAgKi8KKwkucGlkX2ZpbHRlcl9jb3VudCA9IDE1LAogCiAJLnVzYl9jdHJsID0gQ1lQUkVTU19GWDIsCiAJLmZpcm13YXJlID0gImR2Yi11c2ItZHR0MjAwdS0wMS5mdyIsCiAKKwkucG93ZXJfY3RybCAgICAgID0gZHR0MjAwdV9wb3dlcl9jdHJsLAogCS5zdHJlYW1pbmdfY3RybCAgPSBkdHQyMDB1X3N0cmVhbWluZ19jdHJsLAogCS5waWRfZmlsdGVyICAgICAgPSBkdHQyMDB1X3BpZF9maWx0ZXIsCiAJLmZyb250ZW5kX2F0dGFjaCA9IGR0dDIwMHVfZnJvbnRlbmRfYXR0YWNoLAogCi0JLnJjX2ludGVydmFsICAgICA9IDIwMCwKKwkucmNfaW50ZXJ2YWwgICAgID0gMzAwLAogCS5yY19rZXlfbWFwICAgICAgPSBkdHQyMDB1X3JjX2tleXMsCiAJLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoZHR0MjAwdV9yY19rZXlzKSwKIAkucmNfcXVlcnkgICAgICAgID0gZHR0MjAwdV9yY19xdWVyeSwKQEAgLTEyNywxOCArMTQ4LDU5IEBACiAKIAkubnVtX2RldmljZV9kZXNjcyA9IDEsCiAJLmRldmljZXMgPSB7Ci0JCXsgLm5hbWUgPSAiWWFrdW1vL0hhbWEvVHlwaG9vbiBEVkItVCBVU0IyLjApIiwKLQkJICAuY29sZF9pZHMgPSB7ICZkdHQyMDB1X3VzYl90YWJsZVswXSwgJmR0dDIwMHVfdXNiX3RhYmxlWzJdIH0sCisJCXsgLm5hbWUgPSAiV2lkZVZpZXcvWXVhbi9ZYWt1bW8vSGFtYS9UeXBob29uIERWQi1UIFVTQjIuMCAoV1QtMjAwVSkiLAorCQkgIC5jb2xkX2lkcyA9IHsgJmR0dDIwMHVfdXNiX3RhYmxlWzBdLCBOVUxMIH0sCiAJCSAgLndhcm1faWRzID0geyAmZHR0MjAwdV91c2JfdGFibGVbMV0sIE5VTEwgfSwKIAkJfSwKIAkJeyAwIH0sCiAJfQogfTsKIAorc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgd3QyMjB1X3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9ORUVEX1BJRF9GSUxURVJJTkcsCisJLnBpZF9maWx0ZXJfY291bnQgPSAxNSwKKworCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAorCS5maXJtd2FyZSA9ICJkdmItdXNiLXd0MjIwdS0wMS5mdyIsCisKKwkucG93ZXJfY3RybCAgICAgID0gZHR0MjAwdV9wb3dlcl9jdHJsLAorCS5zdHJlYW1pbmdfY3RybCAgPSBkdHQyMDB1X3N0cmVhbWluZ19jdHJsLAorCS5waWRfZmlsdGVyICAgICAgPSBkdHQyMDB1X3BpZF9maWx0ZXIsCisJLmZyb250ZW5kX2F0dGFjaCA9IGR0dDIwMHVfZnJvbnRlbmRfYXR0YWNoLAorCisJLnJjX2ludGVydmFsICAgICA9IDMwMCwKKwkucmNfa2V5X21hcCAgICAgID0gZHR0MjAwdV9yY19rZXlzLAorCS5yY19rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGR0dDIwMHVfcmNfa2V5cyksCisJLnJjX3F1ZXJ5ICAgICAgICA9IGR0dDIwMHVfcmNfcXVlcnksCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAorCisJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCS51cmIgPSB7CisJCS50eXBlID0gRFZCX1VTQl9CVUxLLAorCQkuY291bnQgPSA3LAorCQkuZW5kcG9pbnQgPSAweDAyLAorCQkudSA9IHsKKwkJCS5idWxrID0geworCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCX0KKwkJfQorCX0sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsgLm5hbWUgPSAiV2lkZVZpZXcgV1QtMjIwVSBQZW5UeXBlIFJlY2VpdmVyIChhbmQgY2xvbmVzKSIsCisJCSAgLmNvbGRfaWRzID0geyAmZHR0MjAwdV91c2JfdGFibGVbMl0sIE5VTEwgfSwKKwkJICAud2FybV9pZHMgPSB7ICZkdHQyMDB1X3VzYl90YWJsZVszXSwgTlVMTCB9LAorCQl9LAorCQl7IDAgfSwKKwl9Cit9OworCiAvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZHR0MjAwdV91c2JfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiWWFrdW1vL0hhbWEvVHlwaG9vbiBEVkItVCBVU0IyLjAiLAorCS5uYW1lCQk9ICJkdmJfdXNiX2R0dDIwMHUiLAogCS5wcm9iZSAJCT0gZHR0MjAwdV91c2JfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAogCS5pZF90YWJsZSAJPSBkdHQyMDB1X3VzYl90YWJsZSwKQEAgLTE2Niw2ICsyMjgsNiBAQAogbW9kdWxlX2V4aXQoZHR0MjAwdV91c2JfbW9kdWxlX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgWWFrdW1vL0hhbWEvVHlwaG9vbiBEVkItVCBVU0IyLjAgZGV2aWNlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIFdpZGVWaWV3L1lha3Vtby9IYW1hL1R5cGhvb24gRFZCLVQgVVNCMi4wIGRldmljZXMiKTsKIE1PRFVMRV9WRVJTSU9OKCIxLjAiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmgKaW5kZXggZWQ0MTQyMC4uNmYxZjMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmgKQEAgLTEsNSArMSw1IEBACi0vKiBDb21tb24gaGVhZGVyIGZpbGUgb2YgTGludXggZHJpdmVyIGZvciB0aGUgWWFrdW1vL0hhbWEvVHlwaG9vbiBEVkItVAotICogVVNCMi4wIHJlY2VpdmVyLgorLyogQ29tbW9uIGhlYWRlciBmaWxlIG9mIExpbnV4IGRyaXZlciBmb3IgdGhlIFdpZGVWaWV3LyBZYWt1bW8vIEhhbWEvCisgKiBUeXBob29uLyBZdWFuIERWQi1UIFVTQjIuMCByZWNlaXZlci4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKICAqCkBAIC0yMiw0NCArMjIsMzQgQEAKIC8qIGd1ZXNzZWQgcHJvdG9jb2wgZGVzY3JpcHRpb24gKHJldmVyc2UgZW5naW5lZXJlZCk6CiAgKiByZWFkCiAgKiAgMDAgLSBVU0IgdHlwZSAweDAyIGZvciB1c2IyLjAsIDB4MDEgZm9yIHVzYjEuMQotICogIDgxIC0gPFRTX0xPQ0s+IDxjdXJyZW50IGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDI1MDAwMD4KLSAqICA4MiAtIGNyYXNoIC0gZG8gbm90IHRvdWNoCi0gKiAgODMgLSBjcmFzaCAtIGRvIG5vdCB0b3VjaAotICogIDg0IC0gcmVtb3RlIGNvbnRyb2wKLSAqICA4NSAtIGNyYXNoIC0gZG8gbm90IHRvdWNoIChPSywgc3RvcCB0ZXN0aW5nIGhlcmUpCiAgKiAgODggLSBsb2NraW5nIDIgYnl0ZXMgKDB4ODAgMHg0MCA9PSBubyBzaWduYWwsIDB4ODkgMHgyMCA9PSBuaWNlIHNpZ25hbCkKLSAqICA4OSAtIG5vaXNlLXRvLXNpZ25hbAotICoJOGEgLSB1bmtvd24gMSBieXRlIC0gc2lnbmFsX3N0cmVuZ3RoCi0gKiAgOGMgLSBiZXIgPz8/Ci0gKiAgOGQgLSBiZXIKLSAqICA4ZSAtIHVuYwogICovCiAKLSNkZWZpbmUgR0VUX1NQRUVEICAgICAgICAweDAwCi0jZGVmaW5lIEdFVF9UVU5FX1NUQVQgICAgMHg4MQotI2RlZmluZSBHRVRfUkNfS0VZICAgICAgIDB4ODQKLSNkZWZpbmUgR0VUX1NUQVRVUyAgICAgICAweDg4Ci0jZGVmaW5lIEdFVF9TTlIgICAgICAgICAgMHg4OQotI2RlZmluZSBHRVRfU0lHX1NUUkVOR1RIIDB4OGEKLSNkZWZpbmUgR0VUX1VOSyAgICAgICAgICAweDhjCi0jZGVmaW5lIEdFVF9CRVIgICAgICAgICAgMHg4ZAotI2RlZmluZSBHRVRfVU5DICAgICAgICAgIDB4OGUKKyNkZWZpbmUgR0VUX1NQRUVEICAgICAgICAgICAgMHgwMAorI2RlZmluZSBHRVRfVFVORV9TVEFUVVMgICAgICAweDgxCisjZGVmaW5lIEdFVF9SQ19DT0RFICAgICAgICAgIDB4ODQKKyNkZWZpbmUgR0VUX0NPTkZJR1VSQVRJT04gICAgMHg4OAorI2RlZmluZSBHRVRfQUdDICAgICAgICAgICAgICAweDg5CisjZGVmaW5lIEdFVF9TTlIgICAgICAgICAgICAgIDB4OGEKKyNkZWZpbmUgR0VUX1ZJVF9FUlJfQ05UICAgICAgMHg4YworI2RlZmluZSBHRVRfUlNfRVJSX0NOVCAgICAgICAweDhkCisjZGVmaW5lIEdFVF9SU19VTkNPUl9CTEtfQ05UIDB4OGUKIAogLyogd3JpdGUKLSAqICAwMSAtIHJlc2V0IHRoZSBkZW1vZAorICogIDAxIC0gaW5pdAogICogIDAyIC0gZnJlcXVlbmN5IChkaXZpZGVkIGJ5IDI1MDAwMCkKICAqICAwMyAtIGJhbmR3aWR0aAogICogIDA0IC0gcGlkIHRhYmxlIChpbmRleCBwaWQoNzowKSBwaWQoMTI6OCkpCiAgKiAgMDUgLSByZXNldCB0aGUgcGlkIHRhYmxlCi0gKiAgMDggLSBkZW1vZCB0cmFuc2ZlciBlbmFibGVkIG9yIG5vdCAoRlgyIHRyYW5zZmVyIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCkKKyAqICAwOCAtIHRyYW5zZmVyIHN3aXRjaAogICovCiAKLSNkZWZpbmUgUkVTRVRfREVNT0QgICAgICAweDAxCi0jZGVmaW5lIFNFVF9GUkVRVUVOQ1kgICAgMHgwMgorI2RlZmluZSBTRVRfSU5JVCAgICAgICAgIDB4MDEKKyNkZWZpbmUgU0VUX1JGX0ZSRVEgICAgICAweDAyCiAjZGVmaW5lIFNFVF9CQU5EV0lEVEggICAgMHgwMwogI2RlZmluZSBTRVRfUElEX0ZJTFRFUiAgIDB4MDQKICNkZWZpbmUgUkVTRVRfUElEX0ZJTFRFUiAweDA1Ci0jZGVmaW5lIFNFVF9UU19DVFJMICAgICAgMHgwOAorI2RlZmluZSBTRVRfU1RSRUFNSU5HICAgIDB4MDgKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKiBkdHQyMDB1X2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItY29tbW9uLmgKaW5kZXggNjdlMGQ3My4uNzMwMDQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWNvbW1vbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1jb21tb24uaApAQCAtMTIsMTQgKzEyLDE2IEBACiAjaW5jbHVkZSAiZHZiLXVzYi5oIgogCiBleHRlcm4gaW50IGR2Yl91c2JfZGVidWc7CitleHRlcm4gaW50IGR2Yl91c2JfZGlzYWJsZV9yY19wb2xsaW5nOwogCiAjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pIGRwcmludGsoZHZiX3VzYl9kZWJ1ZywweDAxLGFyZ3MpCiAjZGVmaW5lIGRlYl94ZmVyKGFyZ3MuLi4pIGRwcmludGsoZHZiX3VzYl9kZWJ1ZywweDAyLGFyZ3MpCi0jZGVmaW5lIGRlYl9wbGwoYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDQsYXJncykKKyNkZWZpbmUgZGViX3BsbChhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDQsYXJncykKICNkZWZpbmUgZGViX3RzKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDgsYXJncykKICNkZWZpbmUgZGViX2VycihhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MTAsYXJncykKICNkZWZpbmUgZGViX3JjKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MjAsYXJncykKICNkZWZpbmUgZGViX2Z3KGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4NDAsYXJncykKKyNkZWZpbmUgZGViX21lbShhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4ODAsYXJncykKIAogLyogY29tbW9ubHkgdXNlZCAgbWV0aG9kcyAqLwogZXh0ZXJuIGludCB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1kdmIuYwppbmRleCBiZGQ3MmY3Li4zNDkxZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIGludCBkdmJfdXNiX2ZlX2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlKiBkKQogewogCWlmIChkLT5wcm9wcy5mcm9udGVuZF9hdHRhY2ggPT0gTlVMTCkgewotCQllcnIoInN0cmFuZ2UgJyVzJyBkb24ndCB3YW50IHRvIGF0dGFjaCBhIGZyb250ZW5kLiIsZC0+ZGVzYy0+bmFtZSk7CisJCWVycigic3RyYW5nZSAnJXMnIGRvZXNuJ3Qgd2FudCB0byBhdHRhY2ggYSBmcm9udGVuZC4iLGQtPmRlc2MtPm5hbWUpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCBiY2IzNDE5Li43OTRkNTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCkBAIC0xMiw3ICsxMiw3IEBACiAvKiBWZW5kb3IgSURzICovCiAjZGVmaW5lIFVTQl9WSURfQURTVEVDSAkJCQkJCTB4MDZlMQogI2RlZmluZSBVU0JfVklEX0FOQ0hPUgkJCQkJCTB4MDU0NwotI2RlZmluZSBVU0JfVklEX0FWRVJNRURJQV9VTksJCQkJMHgxNGFhCisjZGVmaW5lIFVTQl9WSURfV0lERVZJRVcJCQkJCTB4MTRhYQogI2RlZmluZSBVU0JfVklEX0FWRVJNRURJQQkJCQkJMHgwN2NhCiAjZGVmaW5lIFVTQl9WSURfQ09NUFJPCQkJCQkJMHgxODViCiAjZGVmaW5lIFVTQl9WSURfQ09NUFJPX1VOSwkJCQkJMHgxNDVmCkBAIC0yNCw2ICsyNCw4IEBACiAjZGVmaW5lIFVTQl9WSURfSEFORlRFSwkJCQkJCTB4MTVmNAogI2RlZmluZSBVU0JfVklEX0hBVVBQQVVHRQkJCQkJMHgyMDQwCiAjZGVmaW5lIFVTQl9WSURfSFlQRVJfUEFMVEVLCQkJCTB4MTAyNQorI2RlZmluZSBVU0JfVklEX0tZRQkJCQkJCQkweDA0NTgKKyNkZWZpbmUgVVNCX1ZJRF9NRURJT04JCQkJCQkweDE2NjAKICNkZWZpbmUgVVNCX1ZJRF9WSVNJT05QTFVTCQkJCQkweDEzZDMKICNkZWZpbmUgVVNCX1ZJRF9UV0lOSEFOCQkJCQkJMHgxODIyCiAjZGVmaW5lIFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMJCQkweDA1ZDgKQEAgLTcwLDYgKzcyLDggQEAKICNkZWZpbmUgVVNCX1BJRF9IQU5GVEVLX1VNVF8wMTBfV0FSTQkJMHgwMDE1CiAjZGVmaW5lIFVTQl9QSURfRFRUMjAwVV9DT0xECQkJCTB4MDIwMQogI2RlZmluZSBVU0JfUElEX0RUVDIwMFVfV0FSTQkJCQkweDAzMDEKKyNkZWZpbmUgVVNCX1BJRF9XVDIyMFVfQ09MRAkJCQkJMHgwMjIyCisjZGVmaW5lIFVTQl9QSURfV1QyMjBVX1dBUk0JCQkJCTB4MDIyMQogI2RlZmluZSBVU0JfUElEX1dJTlRWX05PVkFfVF9VU0IyX0NPTEQJCTB4OTMwMAogI2RlZmluZSBVU0JfUElEX1dJTlRWX05PVkFfVF9VU0IyX1dBUk0JCTB4OTMwMQogI2RlZmluZSBVU0JfUElEX05FQlVMQV9ESUdJVFYJCQkJMHgwMjAxCkBAIC03OCw2ICs4Miw4IEBACiAjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEdEVAkJCTB4ZDgyMAogI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHWjIwMV8xCQkweGRiMDEKICNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9USDc1NzlfMgkJMHhkYjExCi0KKyNkZWZpbmUgVVNCX1BJRF9NRURJT05fTUQ5NTcwMAkJCQkweDA5MzIKKyNkZWZpbmUgVVNCX1BJRF9LWUVfRFZCX1RfQ09MRAkJCQkweDcwMWUKKyNkZWZpbmUgVVNCX1BJRF9LWUVfRFZCX1RfV0FSTQkJCQkweDcwMWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYwppbmRleCAzYWFkZWM5Li42NWYwYzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKQEAgLTE4LDYgKzE4LDEwIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsZHZiX3VzYl9kZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8seGZlcj0yLHBsbD00LHRzPTgsZXJyPTE2LHJjPTMyLGZ3PTY0IChvci1hYmxlKSkuIiBEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CiAKK2ludCBkdmJfdXNiX2Rpc2FibGVfcmNfcG9sbGluZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX3JjX3BvbGxpbmcsIGR2Yl91c2JfZGlzYWJsZV9yY19wb2xsaW5nLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX3JjX3BvbGxpbmcsICJkaXNhYmxlIHJlbW90ZSBjb250cm9sIHBvbGxpbmcgKGRlZmF1bHQ6IDApLiIpOworCiAvKiBnZW5lcmFsIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLwogaW50IGR2Yl91c2JfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCiB7CkBAIC00NywxNyArNTEsMTcgQEAKIAogLyogc3BlZWQgLSB3aGVuIHJ1bm5pbmcgYXQgRlVMTCBzcGVlZCB3ZSBuZWVkIGEgSFcgUElEIGZpbHRlciAqLwogCWlmIChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiAhKGQtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0hBU19QSURfRklMVEVSKSkgewotCQllcnIoIlRoaXMgVVNCMi4wIGRldmljZSBjYW5ub3QgYmUgcnVuIG9uIGEgVVNCMS4xIHBvcnQuIChpdCBsYWNrcyBhIEhXIFBJRCBmaWx0ZXIpIik7CisJCWVycigiVGhpcyBVU0IyLjAgZGV2aWNlIGNhbm5vdCBiZSBydW4gb24gYSBVU0IxLjEgcG9ydC4gKGl0IGxhY2tzIGEgaGFyZHdhcmUgUElEIGZpbHRlcikiKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiBkLT5wcm9wcy5jYXBzICYgRFZCX1VTQl9IQVNfUElEX0ZJTFRFUikgfHwKIAkJKGQtPnByb3BzLmNhcHMgJiBEVkJfVVNCX05FRURfUElEX0ZJTFRFUklORykpIHsKLQkJaW5mbygid2lsbCB1c2UgdGhlIGRldmljZSdzIGh3IFBJRCBmaWx0ZXIuIik7CisJCWluZm8oIndpbGwgdXNlIHRoZSBkZXZpY2UncyBoYXJkd2FyZSBQSUQgZmlsdGVyICh0YWJsZSBjb3VudDogJWQpLiIsZC0+cHJvcHMucGlkX2ZpbHRlcl9jb3VudCk7CiAJCWQtPnBpZF9maWx0ZXJpbmcgPSAxOwogCQlkLT5tYXhfZmVlZF9jb3VudCA9IGQtPnByb3BzLnBpZF9maWx0ZXJfY291bnQ7CiAJfSBlbHNlIHsKLQkJaW5mbygid2lsbCBwYXNzIHRoZSBjb21wbGV0ZSBNUEVHMiB0cmFuc3BvcnQgc3RyZWFtIHRvIHRoZSBkZW11eGVyLiIpOworCQlpbmZvKCJ3aWxsIHBhc3MgdGhlIGNvbXBsZXRlIE1QRUcyIHRyYW5zcG9ydCBzdHJlYW0gdG8gdGhlIHNvZnR3YXJlIGRlbXV4ZXIuIik7CiAJCWQtPnBpZF9maWx0ZXJpbmcgPSAwOwogCQlkLT5tYXhfZmVlZF9jb3VudCA9IDI1NTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMKaW5kZXggOWYxZTIzZi4uZmM3ODAwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXJlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1yZW1vdGUuYwpAQCAtMjEsNiArMjEsMTAgQEAKIAkvKiBUT0RPOiBuZWVkIGEgbG9jayBoZXJlLiAgV2UgY2FuIHNpbXBseSBza2lwIGNoZWNraW5nIGZvciB0aGUgcmVtb3RlIGNvbnRyb2wKIAkgICBpZiB3ZSdyZSBidXN5LiAqLwogCisJLyogd2hlbiB0aGUgcGFyYW1ldGVyIGhhcyBiZWVuIHNldCB0byAxIHZpYSBzeXNmcyB3aGlsZSB0aGUgZHJpdmVyIHdhcyBydW5uaW5nICovCisJaWYgKGR2Yl91c2JfZGlzYWJsZV9yY19wb2xsaW5nKQorCQlyZXR1cm47CisKIAlpZiAoZC0+cHJvcHMucmNfcXVlcnkoZCwmZXZlbnQsJnN0YXRlKSkgewogCQllcnIoImVycm9yIHdoaWxlIHF1ZXJ5aW5nIGZvciBhbiByZW1vdGUgY29udHJvbCBldmVudC4iKTsKIAkJZ290byBzY2hlZHVsZTsKQEAgLTM1LDcgKzM5LDcgQEAKIAkJCWQtPmxhc3RfZXZlbnQgPSBldmVudDsKIAkJY2FzZSBSRU1PVEVfS0VZX1JFUEVBVDoKIAkJCWRlYl9yYygia2V5IHJlcGVhdGVkXG4iKTsKLQkJCWlucHV0X2V2ZW50KCZkLT5yY19pbnB1dF9kZXYsIEVWX0tFWSwgZXZlbnQsIDEpOworCQkJaW5wdXRfZXZlbnQoJmQtPnJjX2lucHV0X2RldiwgRVZfS0VZLCBkLT5sYXN0X2V2ZW50LCAxKTsKIAkJCWlucHV0X2V2ZW50KCZkLT5yY19pbnB1dF9kZXYsIEVWX0tFWSwgZC0+bGFzdF9ldmVudCwgMCk7CiAJCQlpbnB1dF9zeW5jKCZkLT5yY19pbnB1dF9kZXYpOwogCQkJYnJlYWs7CkBAIC04NSw3ICs4OSw5IEBACiBpbnQgZHZiX3VzYl9yZW1vdGVfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCiB7CiAJaW50IGk7Ci0JaWYgKGQtPnByb3BzLnJjX2tleV9tYXAgPT0gTlVMTCkKKwlpZiAoZC0+cHJvcHMucmNfa2V5X21hcCA9PSBOVUxMIHx8CisJCWQtPnByb3BzLnJjX3F1ZXJ5ID09IE5VTEwgfHwKKwkJZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmcpCiAJCXJldHVybiAwOwogCiAJLyogSW5pdGlhbGlzZSB0aGUgcmVtb3RlLWNvbnRyb2wgc3RydWN0dXJlcy4qLwpAQCAtMTU0LDEyICsxNjAsMTIgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCS8qIFNlZSBpZiB3ZSBjYW4gbWF0Y2ggdGhlIHJhdyBrZXkgY29kZS4gKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoa2V5bWFwKS9zaXplb2Yoc3RydWN0IGR2Yl91c2JfcmNfa2V5KTsgaSsrKQorCQkJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKQogCQkJCWlmIChrZXltYXBbaV0uY3VzdG9tID09IGtleWJ1ZlsxXSAmJgogCQkJCQlrZXltYXBbaV0uZGF0YSA9PSBrZXlidWZbM10pIHsKIAkJCQkJKmV2ZW50ID0ga2V5bWFwW2ldLmV2ZW50OwogCQkJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7Ci0JCQkJCWJyZWFrOworCQkJCQlyZXR1cm4gMDsKIAkJCQl9CiAJCQlkZWJfZXJyKCJrZXkgbWFwcGluZyBmYWlsZWQgLSBubyBhcHByb3ByaWF0ZSBrZXkgZm91bmQgaW4ga2V5bWFwcGluZ1xuIik7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYwppbmRleCA4M2Q0NzZmLi5mNTc5OWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItdXJiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jCkBAIC0yNCwxMSArMjQsMTIgQEAKIAlpZiAoKHJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmZC0+dXNiX3NlbSkpKQogCQlyZXR1cm4gcmV0OwogCisJZGViX3hmZXIoIj4+PiAiKTsKIAlkZWJ1Z19kdW1wKHdidWYsd2xlbixkZWJfeGZlcik7CiAKIAlyZXQgPSB1c2JfYnVsa19tc2coZC0+dWRldix1c2Jfc25kYnVsa3BpcGUoZC0+dWRldiwKIAkJCWQtPnByb3BzLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50KSwgd2J1Zix3bGVuLCZhY3RsZW4sCi0JCQkyKkhaKTsKKwkJCTIwMDApOwogCiAJaWYgKHJldCkKIAkJZXJyKCJidWxrIG1lc3NhZ2UgZmFpbGVkOiAlZCAoJWQvJWQpIixyZXQsd2xlbixhY3RsZW4pOwpAQCAtNDIsMTIgKzQzLDE0IEBACiAKIAkJcmV0ID0gdXNiX2J1bGtfbXNnKGQtPnVkZXYsdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsCiAJCQkJZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpLHJidWYscmxlbiwmYWN0bGVuLAotCQkJCTIqSFopOworCQkJCTIwMDApOwogCiAJCWlmIChyZXQpCiAJCQllcnIoInJlY3YgYnVsayBtZXNzYWdlIGZhaWxlZDogJWQiLHJldCk7Ci0JCWVsc2UKKwkJZWxzZSB7CisJCQlkZWJfeGZlcigiPDw8ICIpOwogCQkJZGVidWdfZHVtcChyYnVmLGFjdGxlbixkZWJfeGZlcik7CisJCX0KIAl9CiAKIAl1cCgmZC0+dXNiX3NlbSk7CkBAIC02MSwxMiArNjQsMTkgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHZiX3VzYl9nZW5lcmljX3dyaXRlKTsKIAotc3RhdGljIHZvaWQgZHZiX3VzYl9idWxrX3VyYl9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCisKKy8qIFVSQiBzdHVmZiBmb3Igc3RyZWFtaW5nICovCitzdGF0aWMgdm9pZCBkdmJfdXNiX3VyYl9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gdXJiLT5jb250ZXh0OworCWludCBwdHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOworCWludCBpOworCXU4ICpiOwogCi0JZGViX3RzKCJidWxrIHVyYiBjb21wbGV0ZWQuIGZlZWRjb3VudDogJWQsIHN0YXR1czogJWQsIGxlbmd0aDogJWRcbiIsZC0+ZmVlZGNvdW50LHVyYi0+c3RhdHVzLAotCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlkZWJfdHMoIiclcycgdXJiIGNvbXBsZXRlZC4gZmVlZGNvdW50OiAlZCwgc3RhdHVzOiAlZCwgbGVuZ3RoOiAlZC8lZCwgcGFja19udW06ICVkLCBlcnJvcnM6ICVkXG4iLAorCQkJcHR5cGUgPT0gUElQRV9JU09DSFJPTk9VUyA/ICJpc29jIiA6ICJidWxrIiwgZC0+ZmVlZGNvdW50LAorCQkJdXJiLT5zdGF0dXMsdXJiLT5hY3R1YWxfbGVuZ3RoLHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMsdXJiLT5lcnJvcl9jb3VudCk7CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJCWNhc2UgMDogICAgICAgICAvKiBzdWNjZXNzICovCkBAIC04MSwxMSArOTEsMzMgQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmIChkLT5mZWVkY291bnQgPiAwICYmIHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKLQkJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9EVkIpCi0JCQlkdmJfZG14X3N3ZmlsdGVyKCZkLT5kZW11eCwgKHU4KikgdXJiLT50cmFuc2Zlcl9idWZmZXIsdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQl9IGVsc2UKLQkJZGViX3RzKCJVUkIgZHJvcHBlZCBiZWNhdXNlIG9mIGZlZWRjb3VudC5cbiIpOworCWlmIChkLT5mZWVkY291bnQgPiAwKSB7CisJCWlmIChkLT5zdGF0ZSAmIERWQl9VU0JfU1RBVEVfRFZCKSB7CisJCQlzd2l0Y2ggKHB0eXBlKSB7CisJCQkJY2FzZSBQSVBFX0lTT0NIUk9OT1VTOgorCQkJCQliID0gKHU4ICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCQkJCQlpZiAodXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgIT0gMCkKKwkJCQkJCQlkZWJfdHMoImlzbyBmcmFtZSBkZXNjcmlwdG9yIGhhcyBhbiBlcnJvcjogJWRcbiIsdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpOworCQkJCQkJZWxzZSBpZiAodXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID4gMCkgeworCQkJCQkJCQlkdmJfZG14X3N3ZmlsdGVyKCZkLT5kZW11eCxiICsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQsCisJCQkJCQkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoKTsKKwkJCQkJCQl9CisJCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyA9IDA7CisJCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPSAwOworCQkJCQl9CisJCQkJCWRlYnVnX2R1bXAoYiwyMCxkZWJfdHMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBJUEVfQlVMSzoKKwkJCQkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApCisJCQkJCQlkdmJfZG14X3N3ZmlsdGVyKCZkLT5kZW11eCwgKHU4ICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyLHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWVycigidW5rb3duIGVuZHBvaW50IHR5cGUgaW4gY29tcGxldGl0aW9uIGhhbmRsZXIuIik7CisJCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KIAogCXVzYl9zdWJtaXRfdXJiKHVyYixHRlBfQVRPTUlDKTsKIH0KQEAgLTk0LDcgKzEyNiw3IEBACiB7CiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IGQtPnVyYnNfc3VibWl0dGVkOyBpKyspIHsKLQkJZGViX2luZm8oImtpbGxpbmcgVVJCIG5vLiAlZC5cbiIsaSk7CisJCWRlYl90cygia2lsbGluZyBVUkIgbm8uICVkLlxuIixpKTsKIAogCQkvKiBzdG9wIHRoZSBVUkIgKi8KIAkJdXNiX2tpbGxfdXJiKGQtPnVyYl9saXN0W2ldKTsKQEAgLTEwNyw5ICsxMzksOSBAQAogewogCWludCBpLHJldDsKIAlmb3IgKGkgPSAwOyBpIDwgZC0+dXJic19pbml0aWFsaXplZDsgaSsrKSB7Ci0JCWRlYl9pbmZvKCJzdWJtaXR0aW5nIFVSQiBuby4gJWRcbiIsaSk7CisJCWRlYl90cygic3VibWl0dGluZyBVUkIgbm8uICVkXG4iLGkpOwogCQlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKGQtPnVyYl9saXN0W2ldLEdGUF9BVE9NSUMpKSkgewotCQkJZXJyKCJjb3VsZCBub3Qgc3VibWl0IFVSQiBuby4gJWQgLSBnZXQgdGhlbSBhbGwgYmFja1xuIixpKTsKKwkJCWVycigiY291bGQgbm90IHN1Ym1pdCBVUkIgbm8uICVkIC0gZ2V0IHRoZW0gYWxsIGJhY2siLGkpOwogCQkJZHZiX3VzYl91cmJfa2lsbChkKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KQEAgLTExOCwzMiArMTUwLDc4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHZiX3VzYl9idWxrX3VyYl9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3N0YXRpYyBpbnQgZHZiX3VzYl9mcmVlX3N0cmVhbV9idWZmZXJzKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKLQlpbnQgaSxidWZzaXplID0gZC0+cHJvcHMudXJiLmNvdW50ICogZC0+cHJvcHMudXJiLnUuYnVsay5idWZmZXJzaXplOworCWlmIChkLT5zdGF0ZSAmIERWQl9VU0JfU1RBVEVfVVJCX0JVRikgeworCQl3aGlsZSAoZC0+YnVmX251bSkgeworCQkJZC0+YnVmX251bS0tOworCQkJZGViX21lbSgiZnJlZWluZyBidWZmZXIgJWRcbiIsZC0+YnVmX251bSk7CisJCQl1c2JfYnVmZmVyX2ZyZWUoZC0+dWRldiwgZC0+YnVmX3NpemUsCisJCQkJCWQtPmJ1Zl9saXN0W2QtPmJ1Zl9udW1dLCBkLT5kbWFfYWRkcltkLT5idWZfbnVtXSk7CisJCX0KKwkJa2ZyZWUoZC0+YnVmX2xpc3QpOworCQlrZnJlZShkLT5kbWFfYWRkcik7CisJfQogCi0JZGViX2luZm8oImFsbG9jYXRlICVkIGJ5dGVzIGFzIGJ1ZmZlcnNpemUgZm9yIGFsbCBVUkJzXG4iLGJ1ZnNpemUpOwotCS8qIGFsbG9jYXRlIHRoZSBhY3R1YWwgYnVmZmVyIGZvciB0aGUgVVJCcyAqLwotCWlmICgoZC0+YnVmZmVyID0gIHVzYl9idWZmZXJfYWxsb2MoZC0+dWRldiwgYnVmc2l6ZSwgU0xBQl9BVE9NSUMsICZkLT5kbWFfaGFuZGxlKSkgPT0gTlVMTCkgewotCQlkZWJfaW5mbygibm90IGVub3VnaCBtZW1vcnkgZm9yIHVyYi1idWZmZXIgYWxsb2NhdGlvbi5cbiIpOworCWQtPnN0YXRlICY9IH5EVkJfVVNCX1NUQVRFX1VSQl9CVUY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJfdXNiX2FsbG9jYXRlX3N0cmVhbV9idWZmZXJzKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG51bSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWQtPmJ1Zl9udW0gPSAwOworCWQtPmJ1Zl9zaXplID0gc2l6ZTsKKworCWRlYl9tZW0oImFsbCBpbiBhbGwgSSB3aWxsIHVzZSAlbHUgYnl0ZXMgZm9yIHN0cmVhbWluZ1xuIixudW0qc2l6ZSk7CisKKwlpZiAoKGQtPmJ1Zl9saXN0ID0ga21hbGxvYyhudW0qc2l6ZW9mKHU4ICopLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKGQtPmRtYV9hZGRyID0ga21hbGxvYyhudW0qc2l6ZW9mKGRtYV9hZGRyX3QpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlrZnJlZShkLT5idWZfbGlzdCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlkZWJfaW5mbygiYWxsb2NhdGlvbiBzdWNjZXNzZnVsXG4iKTsKLQltZW1zZXQoZC0+YnVmZmVyLDAsYnVmc2l6ZSk7CisJbWVtc2V0KGQtPmJ1Zl9saXN0LDAsbnVtKnNpemVvZih1OCAqKSk7CisJbWVtc2V0KGQtPmRtYV9hZGRyLDAsbnVtKnNpemVvZihkbWFfYWRkcl90KSk7CiAKIAlkLT5zdGF0ZSB8PSBEVkJfVVNCX1NUQVRFX1VSQl9CVUY7CiAKLQkvKiBhbGxvY2F0ZSB0aGUgVVJCcyAqLwotCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy51cmIuY291bnQ7IGkrKykgewotCQlpZiAoIShkLT51cmJfbGlzdFtpXSA9IHVzYl9hbGxvY191cmIoMCxHRlBfQVRPTUlDKSkpIHsKKwlmb3IgKGQtPmJ1Zl9udW0gPSAwOyBkLT5idWZfbnVtIDwgbnVtOyBkLT5idWZfbnVtKyspIHsKKwkJZGViX21lbSgiYWxsb2NhdGluZyBidWZmZXIgJWRcbiIsZC0+YnVmX251bSk7CisJCWlmICgoIGQtPmJ1Zl9saXN0W2QtPmJ1Zl9udW1dID0KKwkJCQkJdXNiX2J1ZmZlcl9hbGxvYyhkLT51ZGV2LCBzaXplLCBTTEFCX0FUT01JQywKKwkJCQkJJmQtPmRtYV9hZGRyW2QtPmJ1Zl9udW1dKSApID09IE5VTEwpIHsKKwkJCWRlYl9tZW0oIm5vdCBlbm91Z2ggbWVtb3J5IGZvciB1cmItYnVmZmVyIGFsbG9jYXRpb24uXG4iKTsKKwkJCWR2Yl91c2JfZnJlZV9zdHJlYW1fYnVmZmVycyhkKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CisJCWRlYl9tZW0oImJ1ZmZlciAlZDogJXAgKGRtYTogJWQpXG4iLGQtPmJ1Zl9udW0sZC0+YnVmX2xpc3RbZC0+YnVmX251bV0sZC0+ZG1hX2FkZHJbZC0+YnVmX251bV0pOworCQltZW1zZXQoZC0+YnVmX2xpc3RbZC0+YnVmX251bV0sMCxzaXplKTsKKwl9CisJZGViX21lbSgiYWxsb2NhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl91c2JfYnVsa191cmJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaW50IGk7CisKKwlpZiAoKGkgPSBkdmJfdXNiX2FsbG9jYXRlX3N0cmVhbV9idWZmZXJzKGQsZC0+cHJvcHMudXJiLmNvdW50LAorCQkJCQlkLT5wcm9wcy51cmIudS5idWxrLmJ1ZmZlcnNpemUpKSA8IDApCisJCXJldHVybiBpOworCisJLyogYWxsb2NhdGUgdGhlIFVSQnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMudXJiLmNvdW50OyBpKyspIHsKKwkJaWYgKChkLT51cmJfbGlzdFtpXSA9IHVzYl9hbGxvY191cmIoMCxHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOwogCiAJCXVzYl9maWxsX2J1bGtfdXJiKCBkLT51cmJfbGlzdFtpXSwgZC0+dWRldiwKIAkJCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldixkLT5wcm9wcy51cmIuZW5kcG9pbnQpLAotCQkJCSZkLT5idWZmZXJbaSpkLT5wcm9wcy51cmIudS5idWxrLmJ1ZmZlcnNpemVdLAorCQkJCWQtPmJ1Zl9saXN0W2ldLAogCQkJCWQtPnByb3BzLnVyYi51LmJ1bGsuYnVmZmVyc2l6ZSwKLQkJCQlkdmJfdXNiX2J1bGtfdXJiX2NvbXBsZXRlLCBkKTsKKwkJCQlkdmJfdXNiX3VyYl9jb21wbGV0ZSwgZCk7CiAKIAkJZC0+dXJiX2xpc3RbaV0tPnRyYW5zZmVyX2ZsYWdzID0gMDsKIAkJZC0+dXJic19pbml0aWFsaXplZCsrOwpAQCAtMTUxLDYgKzIyOSw0NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGR2Yl91c2JfaXNvY191cmJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaW50IGksajsKKworCWlmICgoaSA9IGR2Yl91c2JfYWxsb2NhdGVfc3RyZWFtX2J1ZmZlcnMoZCxkLT5wcm9wcy51cmIuY291bnQsCisJCQkJCWQtPnByb3BzLnVyYi51Lmlzb2MuZnJhbWVzaXplKmQtPnByb3BzLnVyYi51Lmlzb2MuZnJhbWVzcGVydXJiKSkgPCAwKQorCQlyZXR1cm4gaTsKKworCS8qIGFsbG9jYXRlIHRoZSBVUkJzICovCisJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnVyYi5jb3VudDsgaSsrKSB7CisJCXN0cnVjdCB1cmIgKnVyYjsKKwkJaW50IGZyYW1lX29mZnNldCA9IDA7CisJCWlmICgoZC0+dXJiX2xpc3RbaV0gPQorCQkJCQl1c2JfYWxsb2NfdXJiKGQtPnByb3BzLnVyYi51Lmlzb2MuZnJhbWVzcGVydXJiLEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdXJiID0gZC0+dXJiX2xpc3RbaV07CisKKwkJdXJiLT5kZXYgPSBkLT51ZGV2OworCQl1cmItPmNvbnRleHQgPSBkOworCQl1cmItPmNvbXBsZXRlID0gZHZiX3VzYl91cmJfY29tcGxldGU7CisJCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShkLT51ZGV2LGQtPnByb3BzLnVyYi5lbmRwb2ludCk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJdXJiLT5pbnRlcnZhbCA9IGQtPnByb3BzLnVyYi51Lmlzb2MuaW50ZXJ2YWw7CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBkLT5wcm9wcy51cmIudS5pc29jLmZyYW1lc3BlcnVyYjsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gZC0+YnVmX3NpemU7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gZC0+YnVmX2xpc3RbaV07CisJCXVyYi0+dHJhbnNmZXJfZG1hID0gZC0+ZG1hX2FkZHJbaV07CisKKwkJZm9yIChqID0gMDsgaiA8IGQtPnByb3BzLnVyYi51Lmlzb2MuZnJhbWVzcGVydXJiOyBqKyspIHsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gZnJhbWVfb2Zmc2V0OworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBkLT5wcm9wcy51cmIudS5pc29jLmZyYW1lc2l6ZTsKKwkJCWZyYW1lX29mZnNldCArPSBkLT5wcm9wcy51cmIudS5pc29jLmZyYW1lc2l6ZTsKKwkJfQorCisJCWQtPnVyYnNfaW5pdGlhbGl6ZWQrKzsKKwl9CisJcmV0dXJuIDA7CisKK30KKwogaW50IGR2Yl91c2JfdXJiX2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewogCS8qCkBAIC0xNzQsOCArMjkzLDcgQEAKIAkJY2FzZSBEVkJfVVNCX0JVTEs6CiAJCQlyZXR1cm4gZHZiX3VzYl9idWxrX3VyYl9pbml0KGQpOwogCQljYXNlIERWQl9VU0JfSVNPQzoKLQkJCWVycigiaXNvY2hyb25vdXMgdHJhbnNmZXIgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBkdmItdXNiLiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gZHZiX3VzYl9pc29jX3VyYl9pbml0KGQpOwogCQlkZWZhdWx0OgogCQkJZXJyKCJ1bmtvd24gVVJCLXR5cGUgZm9yIGRhdGEgdHJhbnNmZXIuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE5MSw3ICszMDksNyBAQAogCWlmIChkLT5zdGF0ZSAmIERWQl9VU0JfU1RBVEVfVVJCX0xJU1QpIHsKIAkJZm9yIChpID0gMDsgaSA8IGQtPnVyYnNfaW5pdGlhbGl6ZWQ7IGkrKykgewogCQkJaWYgKGQtPnVyYl9saXN0W2ldICE9IE5VTEwpIHsKLQkJCQlkZWJfaW5mbygiZnJlZWluZyBVUkIgbm8uICVkLlxuIixpKTsKKwkJCQlkZWJfbWVtKCJmcmVlaW5nIFVSQiBuby4gJWQuXG4iLGkpOwogCQkJCS8qIGZyZWUgdGhlIFVSQnMgKi8KIAkJCQl1c2JfZnJlZV91cmIoZC0+dXJiX2xpc3RbaV0pOwogCQkJfQpAQCAtMjAyLDEwICszMjAsNiBAQAogCQlkLT5zdGF0ZSAmPSB+RFZCX1VTQl9TVEFURV9VUkJfTElTVDsKIAl9CiAKLQlpZiAoZC0+c3RhdGUgJiBEVkJfVVNCX1NUQVRFX1VSQl9CVUYpCi0JCXVzYl9idWZmZXJfZnJlZShkLT51ZGV2LCBkLT5wcm9wcy51cmIudS5idWxrLmJ1ZmZlcnNpemUgKiBkLT5wcm9wcy51cmIuY291bnQsCi0JCQkJZC0+YnVmZmVyLCBkLT5kbWFfaGFuZGxlKTsKLQotCWQtPnN0YXRlICY9IH5EVkJfVVNCX1NUQVRFX1VSQl9CVUY7CisJZHZiX3VzYl9mcmVlX3N0cmVhbV9idWZmZXJzKGQpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaAppbmRleCBhYmNlZTE5Li5hODA1NjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaApAQCAtMTg5LDEyICsxODksMTMgQEAKIAkJCXN0cnVjdCB7CiAJCQkJaW50IGZyYW1lc3BlcnVyYjsKIAkJCQlpbnQgZnJhbWVzaXplOworCQkJCWludCBpbnRlcnZhbDsKIAkJCX0gaXNvYzsKIAkJfSB1OwogCX0gdXJiOwogCiAJaW50IG51bV9kZXZpY2VfZGVzY3M7Ci0Jc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uIGRldmljZXNbOF07CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uIGRldmljZXNbOV07CiB9OwogCiAKQEAgLTIwNywxOSArMjA4LDI4IEBACiAgKiBAdWRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgc3RydWN0IHVzYl9kZXZpY2UuCiAgKiBAdXJiX2xpc3Q6IGFycmF5IG9mIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJ1Y3QgdXJiIGZvciB0aGUgTVBFRzItVFMtCiAgKiAgc3RyZWFtaW5nLgotICogQGJ1ZmZlcjogYnVmZmVyIHVzZWQgdG8gc3RyZWFtaW5nLgotICogQGRtYV9oYW5kbGU6IGRtYV9hZGRyX3QgZm9yIGJ1ZmZlci4KKyAqCisgKiBAYnVmX251bTogbnVtYmVyIG9mIGJ1ZmZlciBhbGxvY2F0ZWQuCisgKiBAYnVmX3NpemU6IHNpemUgb2YgZWFjaCBidWZmZXIgaW4gYnVmX2xpc3QuCisgKiBAYnVmX2xpc3Q6IGFycmF5IGNvbnRhaW5pbmcgYWxsIGFsbG9jYXRlIGJ1ZmZlcnMgZm9yIHN0cmVhbWluZy4KKyAqIEBkbWFfYWRkcjogbGlzdCBvZiBkbWFfYWRkcl90IGZvciBlYWNoIGJ1ZmZlciBpbiBidWZfbGlzdC4KKyAqCiAgKiBAdXJic19pbml0aWFsaXplZDogbnVtYmVyIG9mIFVSQnMgaW5pdGlhbGl6ZWQuCiAgKiBAdXJic19zdWJtaXR0ZWQ6IG51bWJlciBvZiBVUkJzIHN1Ym1pdHRlZC4KKyAqCiAgKiBAZmVlZGNvdW50OiBudW1iZXIgb2YgcmVxZXN0ZWQgZmVlZHMgKHVzZWQgZm9yIHN0cmVhbWluZy1hY3RpdmF0aW9uKQogICogQHBpZF9maWx0ZXJpbmc6IGlzIGhhcmR3YXJlIHBpZF9maWx0ZXJpbmcgdXNlZCBvciBub3QuCisgKgogICogQHVzYl9zZW06IHNlbWFwaG9yZSBvZiBVU0IgY29udHJvbCBtZXNzYWdlcyAocmVhZGluZyBuZWVkcyB0d28gbWVzc2FnZXMpCiAgKiBAaTJjX3NlbTogc2VtYXBob3JlIGZvciBpMmMtdHJhbnNmZXJzCisgKgogICogQGkyY19hZGFwOiBkZXZpY2UncyBpMmNfYWRhcHRlciBpZiBpdCB1c2VzIEkyQ292ZXJVU0IKICAqIEBwbGxfYWRkcjogSTJDIGFkZHJlc3Mgb2YgdGhlIHR1bmVyIGZvciBwcm9ncmFtbWluZwogICogQHBsbF9pbml0OiBhcnJheSBjb250YWluaW5nIHRoZSBpbml0aWFsaXphdGlvbiBidWZmZXIKICAqIEBwbGxfZGVzYzogcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgc3RydWN0IGR2Yl9wbGxfZGVzYwotICogQHR1bmVyX3Bhc3NfY3RybDogY2FsbGVkIHRvIChkZSlhY3RpdmF0ZSB0dW5lciBwYXNzdGhydSBvZiB0aGUgZGVtb2QKKyAqCisgKiBAdHVuZXJfcGFzc19jdHJsOiBjYWxsZWQgdG8gKGRlKWFjdGl2YXRlIHR1bmVyIHBhc3N0aHJ1IG9mIHRoZSBkZW1vZCBvciB0aGUgYm9hcmQKKyAqCiAgKiBAZHZiX2FkYXA6IGRldmljZSdzIGR2Yl9hZGFwdGVyLgogICogQGRteGRldjogZGV2aWNlJ3MgZG14ZGV2LgogICogQGRlbXV4OiBkZXZpY2UncyBzb2Z0d2FyZSBkZW11eGVyLgpAQCAtMjUzLDggKzI2MywxMiBAQAogCS8qIHVzYiAqLwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCXN0cnVjdCB1cmIgKip1cmJfbGlzdDsKLQl1OCAqYnVmZmVyOwotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKworCWludCBidWZfbnVtOworCXVuc2lnbmVkIGxvbmcgYnVmX3NpemU7CisJdTggKipidWZfbGlzdDsKKwlkbWFfYWRkcl90ICpkbWFfYWRkcjsKKwogCWludCB1cmJzX2luaXRpYWxpemVkOwogCWludCB1cmJzX3N1Ym1pdHRlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCmluZGV4IDlkODM3ODEuLjI1OGE5MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgbm92YV90X2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gIkhhdXBwYXVnZSBXaW5UVi1OT1ZBLVQgdXNiMiIsCisJLm5hbWUJCT0gImR2Yl91c2Jfbm92YV90X3VzYjIiLAogCS5wcm9iZQkJPSBub3ZhX3RfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAogCS5pZF90YWJsZQk9IG5vdmFfdF90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdW10LTAxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKaW5kZXggYWE1NjA0Mi4uMjExMmFjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdW10X2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gIkhhbmZUZWsgVU1ULTAxMCBVU0IyLjAgRFZCLVQgZGV2aWNlcyIsCisJLm5hbWUJCT0gImR2Yl91c2JfdW10XzAxMCIsCiAJLnByb2JlCQk9IHVtdF9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCiAJLmlkX3RhYmxlCT0gdW10X3RhYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKaW5kZXggMDJlY2M5YS4uOWFjOTVmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCkBAIC00NCw3ICs0NCw3IEBACiAJaWYgKHVzYl9jb250cm9sX21zZyhkLT51ZGV2LAogCQkJdXNiX3NuZGN0cmxwaXBlKGQtPnVkZXYsMCksCiAJCQlUSF9DT01NQU5EX09VVCwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQsIDAsIDAsCi0JCQlvdXRidWYsIDIwLCAyKkhaKSAhPSAyMCkgeworCQkJb3V0YnVmLCAyMCwgMjAwMCkgIT0gMjApIHsKIAkJZXJyKCJVU0IgY29udHJvbCBtZXNzYWdlICdvdXQnIHdlbnQgd3JvbmcuIik7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gdW5sb2NrOwpAQCAtNTUsNyArNTUsNyBAQAogCWlmICh1c2JfY29udHJvbF9tc2coZC0+dWRldiwKIAkJCXVzYl9yY3ZjdHJscGlwZShkLT51ZGV2LDApLAogCQkJVEhfQ09NTUFORF9JTiwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiwgMCwgMCwKLQkJCWluYnVmLCAxMiwgMipIWikgIT0gMTIpIHsKKwkJCWluYnVmLCAxMiwgMjAwMCkgIT0gMTIpIHsKIAkJZXJyKCJVU0IgY29udHJvbCBtZXNzYWdlICdpbicgd2VudCB3cm9uZy4iKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byB1bmxvY2s7CkBAIC05NCwxNiArOTQsNDEgQEAKIC8qIFRoZSBrZXltYXBwaW5nIHN0cnVjdC4gU29tZWhvdyB0aGlzIHNob3VsZCBiZSBsb2FkZWQgdG8gdGhlIGRyaXZlciwgYnV0CiAgKiBjdXJyZW50bHkgaXQgaXMgaGFyZGNvZGVkLiAqLwogc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSB2cDcwNDVfcmNfa2V5c1tdID0gewotCS8qIGluc2VydCB0aGUga2V5cyBsaWtlIHRoaXMuIHRvIG1ha2UgdGhlIHJhdyBrZXlzIHZpc2libGUsIGVuYWJsZQotCSAqIGRlYnVnPTB4MDQgd2hlbiBsb2FkaW5nIGR2Yi11c2ItdnA3MDQ1LiAqLwotCi0JLyogdGhlc2Uga2V5cyBhcmUgcHJvYmFibHkgd3JvbmcuIEkgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgSVItcmVjZWl2ZXIgb24gbXkKLQkgKiB2cDcwNDUsIHNvIEkgY2FuJ3QgdGVzdCBpdC4gIFBhdGNoZXMgYXJlIHdlbGNvbWUuICovCi0JeyAweDAwLCAweDAxLCBLRVlfMSB9LAotCXsgMHgwMCwgMHgwMiwgS0VZXzIgfSwKKwl7IDB4MDAsIDB4MTYsIEtFWV9QT1dFUiB9LAorCXsgMHgwMCwgMHgxMCwgS0VZX01VVEUgfSwKKwl7IDB4MDAsIDB4MDMsIEtFWV8xIH0sCisJeyAweDAwLCAweDAxLCBLRVlfMiB9LAorCXsgMHgwMCwgMHgwNiwgS0VZXzMgfSwKKwl7IDB4MDAsIDB4MDksIEtFWV80IH0sCisJeyAweDAwLCAweDFkLCBLRVlfNSB9LAorCXsgMHgwMCwgMHgxZiwgS0VZXzYgfSwKKwl7IDB4MDAsIDB4MGQsIEtFWV83IH0sCisJeyAweDAwLCAweDE5LCBLRVlfOCB9LAorCXsgMHgwMCwgMHgxYiwgS0VZXzkgfSwKKwl7IDB4MDAsIDB4MTUsIEtFWV8wIH0sCisJeyAweDAwLCAweDA1LCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDAwLCAweDAyLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4MDAsIDB4MWUsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwMCwgMHgwYSwgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4MDAsIDB4MTEsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MDAsIDB4MTcsIEtFWV9GQVZPUklURVMgfSwgLyogSGVhcnQgc3ltYm9sIC0gQ2hhbm5lbCBsaXN0LiAqLworCXsgMHgwMCwgMHgxNCwgS0VZX1BMQVkgfSwKKwl7IDB4MDAsIDB4MWEsIEtFWV9TVE9QIH0sCisJeyAweDAwLCAweDQwLCBLRVlfUkVXSU5EIH0sCisJeyAweDAwLCAweDEyLCBLRVlfRkFTVEZPUldBUkQgfSwKKwl7IDB4MDAsIDB4MGUsIEtFWV9QUkVWSU9VUyB9LCAvKiBSZWNhbGwgLSBQcmV2aW91cyBjaGFubmVsLiAqLworCXsgMHgwMCwgMHg0YywgS0VZX1BBVVNFIH0sCisJeyAweDAwLCAweDRkLCBLRVlfU0NSRUVOIH0sIC8qIEZ1bGwgc2NyZWVuIG1vZGUuICovCisJeyAweDAwLCAweDU0LCBLRVlfQVVESU8gfSwgLyogTVRTIC0gU3dpdGNoIHRvIHNlY29uZGFyeSBhdWRpby4gKi8KKwl7IDB4MDAsIDB4MGMsIEtFWV9DQU5DRUwgfSwgLyogQ2FuY2VsICovCisJeyAweDAwLCAweDFjLCBLRVlfRVBHIH0sIC8qIEVQRyAqLworCXsgMHgwMCwgMHgwMCwgS0VZX1RBQiB9LCAvKiBUYWIgKi8KKwl7IDB4MDAsIDB4NDgsIEtFWV9JTkZPIH0sIC8qIFByZXZpZXcgKi8KKwl7IDB4MDAsIDB4MDQsIEtFWV9MSVNUIH0sIC8qIFJlY29yZExpc3QgKi8KKwl7IDB4MDAsIDB4MGYsIEtFWV9URVhUIH0gLyogVGVsZXRleHQgKi8KIH07CiAKLXN0YXRpYyBpbnQgdnA3MDQ1X3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTMyICprZXlfYnVmLCBpbnQgKnN0YXRlKQorc3RhdGljIGludCB2cDcwNDVfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQogewogCXU4IGtleTsKIAlpbnQgaTsKQEAgLTExOSw3ICsxNDQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodnA3MDQ1X3JjX2tleXMpL3NpemVvZihzdHJ1Y3QgZHZiX3VzYl9yY19rZXkpOyBpKyspCiAJCWlmICh2cDcwNDVfcmNfa2V5c1tpXS5kYXRhID09IGtleSkgewogCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOwotCQkJKmtleV9idWYgPSB2cDcwNDVfcmNfa2V5c1tpXS5ldmVudDsKKwkJCSpldmVudCA9IHZwNzA0NV9yY19rZXlzW2ldLmV2ZW50OwogCQkJYnJlYWs7CiAJCX0KIAlyZXR1cm4gMDsKQEAgLTIzMCw3ICsyNTUsNyBAQAogLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHZwNzA0NV91c2JfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiZHZiLXVzYi12cDcwNDUiLAorCS5uYW1lCQk9ICJkdmJfdXNiX3ZwNzA0NSIsCiAJLnByb2JlIAkJPSB2cDcwNDVfdXNiX3Byb2JlLAogCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKIAkuaWRfdGFibGUgCT0gdnA3MDQ1X3VzYl90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKaW5kZXggYjRmZGRmNS4uZDg0N2M2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTQwLDYgKzQwLDEyIEBACiAJaGVscAogCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX1M1SDE0MjAKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBTNUgxNDIwIGJhc2VkIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKwloZWxwCisJICBBIERWQi1TIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbW1lbnQgIkRWQi1UICh0ZXJyZXN0cmlhbCkgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApAQCAtMTgxLDQgKzE4NywxMSBAQAogCSAgQW4gQVRTQyA4VlNCLzE2VlNCIGFuZCBRQU02NC8yNTYgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvCiAJICBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKK2NvbmZpZyBEVkJfTEdEVDMzMDIKKwl0cmlzdGF0ZSAiTEdEVDMzMDIgYmFzZWQgKERWaUNPIEZ1c2lvbkhEVFYzIEdvbGQpIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKwloZWxwCisJICBBbiBBVFNDIDhWU0IgYW5kIFFBTTY0LzI1NiB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQKKwkgIHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCmluZGV4IDkxZDZkMzUuLmRlNWUyNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKQEAgLTI5LDMgKzI5LDUgQEAKIG9iai0kKENPTkZJR19EVkJfT1I1MTIxMSkgKz0gb3I1MTIxMS5vCiBvYmotJChDT05GSUdfRFZCX09SNTExMzIpICs9IG9yNTExMzIubwogb2JqLSQoQ09ORklHX0RWQl9CQ00zNTEwKSArPSBiY20zNTEwLm8KK29iai0kKENPTkZJR19EVkJfUzVIMTQyMCkgKz0gczVoMTQyMC5vCitvYmotJChDT05GSUdfRFZCX0xHRFQzMzAyKSArPSBsZ2R0MzMwMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuYwppbmRleCBmNGFhNDQxLi45ZjYzOTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMKQEAgLTc2LDcgKzc2LDYgQEAKIAkweDQ5LCAweDU2LAogCTB4NmIsIDB4MWUsCiAJMHhjOCwgMHgwMiwKLQkweGY4LCAweDAyLAogCTB4ZjksIDB4MDAsCiAJMHhmYSwgMHgwMCwKIAkweGZiLCAweDAwLApAQCAtMjAzLDcgKzIwMiw3IEBACiAJc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkvKiBzZXQgUExMICovCi0gICAgICAgIGN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgJjB4ZmUpOworCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgJjB4ZmUpOwogCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KSB7CiAJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwogCX0gZWxzZSBpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2Rlc2MpIHsKQEAgLTIxNyw3ICsyMTYsNyBAQAogCX0gZWxzZSB7CiAJCUJVRygpOwogCX0KLSAgICAgICAgY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSB8IDEpOworCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgfCAxKTsKIAogCS8qIHNldCBpbnZlcnNpb24gKi8KIAljeDIyNzAyX3NldF9pbnZlcnNpb24gKHN0YXRlLCBwLT5pbnZlcnNpb24pOwpAQCAtMjU2LDcgKzI1NSw3IEBACiAJCWN4MjI3MDJfd3JpdGVyZWcoc3RhdGUsIDB4MEIsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwgMHgwQikgJiAweGZjICk7CiAJCWN4MjI3MDJfd3JpdGVyZWcoc3RhdGUsIDB4MEMsIChjeDIyNzAyX3JlYWRyZWcoc3RhdGUsIDB4MEMpICYgMHhCRikgfCAweDQwICk7CiAJCWN4MjI3MDJfd3JpdGVyZWcoc3RhdGUsIDB4MDAsIDB4MDEpOyAvKiBCZWdpbiBhcXVpc2l0aW9uICovCi0JCXByaW50aygiJXM6IEF1dG9kZXRlY3RpbmdcbiIsX19GVU5DVElPTl9fKTsKKwkJZHByaW50aygiJXM6IEF1dG9kZXRlY3RpbmdcbiIsX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNDcsMTAgKzM0NiwxMSBAQAogCWZvciAoaT0wOyBpPHNpemVvZihpbml0X3RhYik7IGkrPTIpCiAJCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCBpbml0X3RhYltpXSwgaW5pdF90YWJbaSsxXSk7CiAKKwljeDIyNzAyX3dyaXRlcmVnIChzdGF0ZSwgMHhmOCwgKHN0YXRlLT5jb25maWctPm91dHB1dF9tb2RlIDw8IDEpICYgMHgwMik7CiAKIAkvKiBpbml0IFBMTCAqLwogCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCSAgICAgICAgY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSAmMHhmZSk7CisJCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgJiAweGZlKTsKIAkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwogCQljeDIyNzAyX3dyaXRlcmVnIChzdGF0ZSwgMHgwRCwgY3gyMjcwMl9yZWFkcmVnKHN0YXRlLDB4MEQpIHwgMSk7CiAJfQpAQCAtNDQwLDggKzQ0MCwxMCBAQAogCiAJLyogUlMgVW5jb3JyZWN0YWJsZSBQYWNrZXQgQ291bnQgdGhlbiByZXNldCAqLwogCV91Y2Jsb2NrcyA9IGN4MjI3MDJfcmVhZHJlZyAoc3RhdGUsIDB4RTMpOwotCWlmIChzdGF0ZS0+cHJldlVDQmxvY2tzIDwgX3VjYmxvY2tzKSAqdWNibG9ja3MgPSAoX3VjYmxvY2tzIC0gc3RhdGUtPnByZXZVQ0Jsb2Nrcyk7Ci0JZWxzZSAqdWNibG9ja3MgPSBzdGF0ZS0+cHJldlVDQmxvY2tzIC0gX3VjYmxvY2tzOworCWlmIChzdGF0ZS0+cHJldlVDQmxvY2tzIDwgX3VjYmxvY2tzKQorCQkqdWNibG9ja3MgPSAoX3VjYmxvY2tzIC0gc3RhdGUtPnByZXZVQ0Jsb2Nrcyk7CisJZWxzZQorCQkqdWNibG9ja3MgPSBzdGF0ZS0+cHJldlVDQmxvY2tzIC0gX3VjYmxvY2tzOwogCXN0YXRlLT5wcmV2VUNCbG9ja3MgPSBfdWNibG9ja3M7CiAKIAlyZXR1cm4gMDsKQEAgLTQ1Nyw2ICs0NTksMTIgQEAKIAlyZXR1cm4gY3gyMjcwMl9nZXRfdHBzIChzdGF0ZSwgJnAtPnUub2ZkbSk7CiB9CiAKK3N0YXRpYyBpbnQgY3gyMjcwMl9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICp0dW5lKQoreworCXR1bmUtPm1pbl9kZWxheV9tcyA9IDEwMDA7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGN4MjI3MDJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTQ3Miw3ICs0ODAsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDIyNzAyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwpAQCAtNDgxLDcgKzQ5MCw4IEBACiAJc3RhdGUtPnByZXZVQ0Jsb2NrcyA9IDA7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KLQlpZiAoY3gyMjcwMl9yZWFkcmVnKHN0YXRlLCAweDFmKSAhPSAweDMpIGdvdG8gZXJyb3I7CisJaWYgKGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwgMHgxZikgIT0gMHgzKQorCQlnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwogCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKQEAgLTUxNCw2ICs1MjQsNyBAQAogCiAJLnNldF9mcm9udGVuZCA9IGN4MjI3MDJfc2V0X3RwcywKIAkuZ2V0X2Zyb250ZW5kID0gY3gyMjcwMl9nZXRfZnJvbnRlbmQsCisJLmdldF90dW5lX3NldHRpbmdzID0gY3gyMjcwMl9nZXRfdHVuZV9zZXR0aW5ncywKIAogCS5yZWFkX3N0YXR1cyA9IGN4MjI3MDJfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYmVyID0gY3gyMjcwMl9yZWFkX2JlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5oCmluZGV4IDU1OWZkYjkuLjExZjg2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaApAQCAtMzUsNiArMzUsMTEgQEAKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKKwkvKiBzZXJpYWwvcGFyYWxsZWwgb3V0cHV0ICovCisjZGVmaW5lIENYMjI3MDJfUEFSQUxMRUxfT1VUUFVUIDAKKyNkZWZpbmUgQ1gyMjcwMl9TRVJJQUxfT1VUUFVUICAgMQorCXU4IG91dHB1dF9tb2RlOworCiAJLyogUExMIG1haW50ZW5hbmNlICovCiAJdTggcGxsX2FkZHJlc3M7CiAJc3RydWN0IGR2Yl9wbGxfZGVzYyAqcGxsX2Rlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYwppbmRleCBmNzNiNWY0Li41YWZlYWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKQEAgLTU1LDcgKzU1LDcgQEAKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjEwKTsKIAotc3RhdGljIHZvaWQgdGhvbXNvbl9kdHQ3NTl4X2J3KHU4ICpidWYsIGludCBiYW5kd2lkdGgpCitzdGF0aWMgdm9pZCB0aG9tc29uX2R0dDc1OXhfYncodTggKmJ1ZiwgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpCiB7CiAJaWYgKEJBTkRXSURUSF83X01IWiA9PSBiYW5kd2lkdGgpCiAJCWJ1ZlszXSB8PSAweDEwOwpAQCAtOTMsNiArOTMsMzIgQEAKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfbGdfejIwMSk7CiAKK3N0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9taWNyb3R1bmVfNDA0MiA9IHsKKwkubmFtZSAgPSAiTWljcm90dW5lIDQwNDIgRkk1IiwKKwkubWluICAgPSAgNTcwMDAwMDAsCisJLm1heCAgID0gODU4MDAwMDAwLAorCS5jb3VudCA9IDMsCisJLmVudHJpZXMgPSB7CisJCXsgMTYyMDAwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4YTEgfSwKKwkJeyA0NTcwMDAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHg5MSB9LAorCQl7IDk5OTk5OTk5OSwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDMxIH0sCisJfSwKK307CitFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfbWljcm90dW5lXzQwNDIpOworCitzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjExID0geworCS5uYW1lICA9ICJUaG9tc29uIGR0dDc2MTEiLAorCS5taW4gICA9ICA0NDAwMDAwMCwKKwkubWF4ICAgPSA5NTgwMDAwMDAsCisJLmNvdW50ID0gMywKKwkuZW50cmllcyA9IHsKKwkJeyAxNTcyNTAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzOSB9LAorCQl7IDQ1NDAwMDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDNhIH0sCisJCXsgOTk5OTk5OTk5LCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4M2MgfSwKKwl9LAorfTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF90aG9tc29uX2R0dDc2MTEpOworCiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdW5rbm93bl8xID0gewogCS5uYW1lICA9ICJ1bmtub3duIDEiLCAvKiB1c2VkIGJ5IGRudHYgbGl2ZSBkdmItdCAqLwogCS5taW4gICA9IDE3NDAwMDAwMCwKQEAgLTE0Niw3ICsxNzIsNyBAQAogLyogUGhpbGlwcyBUREE2NjUwL1REQTY2NTEKICAqIHVzZWQgaW4gUGFuYXNvbmljIEVOVjc3SDExRDUKICAqLwotc3RhdGljIHZvaWQgdGRhNjY1eF9idyh1OCAqYnVmLCBpbnQgYmFuZHdpZHRoKQorc3RhdGljIHZvaWQgdGRhNjY1eF9idyh1OCAqYnVmLCB1MzIgZnJlcSwgaW50IGJhbmR3aWR0aCkKIHsKIAlpZiAoYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikKIAkJYnVmWzNdIHw9IDB4MDg7CkBAIC0xNzgsNyArMjA0LDcgQEAKIC8qIEluZmluZW9uIFRVQTYwMzQKICAqIHVzZWQgaW4gTEcgVERUUCBFMTAyUAogICovCi1zdGF0aWMgdm9pZCB0dWE2MDM0X2J3KHU4ICpidWYsIGludCBiYW5kd2lkdGgpCitzdGF0aWMgdm9pZCB0dWE2MDM0X2J3KHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKQogewogCWlmIChCQU5EV0lEVEhfN19NSFogIT0gYmFuZHdpZHRoKQogCQlidWZbM10gfD0gMHgwODsKQEAgLTE5OCw2ICsyMjQsNTcgQEAKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdHVhNjAzNCk7CiAKKy8qIFBoaWxpcHMgRk1EMTIxNk1FCisgKiB1c2VkIGluIE1lZGlvbiBIeWJyaWQgUENNQ0lBIGNhcmQgYW5kIFVTQiBCb3gKKyAqLworc3RhdGljIHZvaWQgZm1kMTIxNm1lX2J3KHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKQoreworCWlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaICYmIGZyZXEgPj0gMTU4ODcwMDAwKQorCQlidWZbM10gfD0gMHgwODsKK30KKworc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX2ZtZDEyMTZtZSA9IHsKKwkubmFtZSA9ICJQaGlsaXBzIEZNRDEyMTZNRSIsCisJLm1pbiA9IDUwODcwMDAwLAorCS5tYXggPSA4NTgwMDAwMDAsCisJLnNldGJ3ID0gZm1kMTIxNm1lX2J3LAorCS5jb3VudCA9IDcsCisJLmVudHJpZXMgPSB7CisJCXsgMTQzODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQxIH0sCisJCXsgMTU4ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQxIH0sCisJCXsgMzI5ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQyIH0sCisJCXsgNDQxODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQyIH0sCisJCXsgNjI1ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQ0IH0sCisJCXsgODAzODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQ0IH0sCisJCXsgOTk5OTk5OTk5LCAzNjIxMzMzMywgMTY2NjY3LCAweGZjLCAweDQ0IH0sCisJfQorfTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF9mbWQxMjE2bWUpOworCisvKiBBTFBTIFRERUQ0CisgKiB1c2VkIGluIE5lYnVsYS1DYXJkcyBhbmQgVVNCIGJveGVzCisgKi8KK3N0YXRpYyB2b2lkIHRkZWQ0X2J3KHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKQoreworCWlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKQorCQlidWZbM10gfD0gMHgwNDsKK30KKworc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3RkZWQ0ID0geworCS5uYW1lID0gIkFMUFMgVERFRDQiLAorCS5taW4gPSA0NzAwMDAwMCwKKwkubWF4ID0gODYzMDAwMDAwLAorCS5zZXRidyA9IHRkZWQ0X2J3LAorCS5jb3VudCA9IDQsCisJLmVudHJpZXMgPSB7CisJCXsgMTUzMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDAxIH0sCisJCXsgNDcwMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDAyIH0sCisJCXsgODIzMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDA4IH0sCisJCXsgOTk5OTk5OTk5LCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDg4IH0sCisJfQorfTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF90ZGVkNCk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCkBAIC0yMzEsNyArMzA4LDcgQEAKIAlidWZbM10gPSBkZXNjLT5lbnRyaWVzW2ldLmNiMjsKIAogCWlmIChkZXNjLT5zZXRidykKLQkJZGVzYy0+c2V0YncoYnVmLCBiYW5kd2lkdGgpOworCQlkZXNjLT5zZXRidyhidWYsIGZyZXEsIGJhbmR3aWR0aCk7CiAKIAlpZiAoZGVidWcpCiAJCXByaW50aygicGxsOiAlczogZGl2PSVkIHwgYnVmPTB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCmluZGV4IGI3OTY3NzguLmNiNzk0NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaApAQCAtOSw3ICs5LDcgQEAKIAljaGFyICpuYW1lOwogCXUzMiAgbWluOwogCXUzMiAgbWF4OwotCXZvaWQgKCpzZXRidykodTggKmJ1ZiwgaW50IGJhbmR3aWR0aCk7CisJdm9pZCAoKnNldGJ3KSh1OCAqYnVmLCB1MzIgZnJlcSwgaW50IGJhbmR3aWR0aCk7CiAJaW50ICBjb3VudDsKIAlzdHJ1Y3QgewogCQl1MzIgbGltaXQ7CkBAIC0yNCwxMiArMjQsMTYgQEAKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTl4OwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2R0dDc2MTA7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX2xnX3oyMDE7CitleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX21pY3JvdHVuZV80MDQyOworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2R0dDc2MTE7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Vua25vd25fMTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90dWE2MDEweHM7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX2VudjU3aDF4ZDU7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3R1YTYwMzQ7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3RkYTY2NXg7CitleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX2ZtZDEyMTZtZTsKK2V4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGRlZDQ7CiAKIGludCBkdmJfcGxsX2NvbmZpZ3VyZShzdHJ1Y3QgZHZiX3BsbF9kZXNjICpkZXNjLCB1OCAqYnVmLAogCQkgICAgICB1MzIgZnJlcSwgaW50IGJhbmR3aWR0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMKaW5kZXggMDMxYTFkZC4uZmFhYWQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYwpAQCAtNDc0LDExICs0NzQsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsNjQ3ODFfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncykKK3N0YXRpYyBpbnQgbDY0NzgxX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCiB7Ci0gICAgICAgIGZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDIwMDsKLSAgICAgICAgZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMTY2NjY3OwotICAgICAgICBmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAxNjY2NjcqMjsKKyAgICAgICAgZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gNDAwMDsKKyAgICAgICAgZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMDsKKyAgICAgICAgZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMDsKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlYTAzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwMi5jCkBAIC0wLDAgKzEsNjA5IEBACisvKgorICogICAgU3VwcG9ydCBmb3IgTEdEVDMzMDIgKERWaUNPIEZ1c3Rpb25IRFRWIDMgR29sZCkgLSBWU0IvUUFNCisgKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA1IFdpbHNvbiBNaWNoYWVscyA8d2lsc29ubWljaGFlbHNAZWFydGhsaW5rLm5ldD4KKyAqCisgKiAgICBCYXNlZCBvbiBjb2RlIGZyb20gIEtpcmsgTGFwcmF5IDxraXJrX2xhcHJheUBiaWdmb290LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA1CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICBOT1RFUyBBQk9VVCBUSElTIERSSVZFUgorICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkIHVuZGVyIExpbnV4LgorICoKKyAqIFRPRE86CisgKiBCRVIgYW5kIHNpZ25hbCBzdHJlbmd0aCBhbHdheXMgcmV0dXJuIDAuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImR2Yi1wbGwuaCIKKyNpbmNsdWRlICJsZ2R0MzMwMl9wcml2LmgiCisjaW5jbHVkZSAibGdkdDMzMDIuaCIKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCJUdXJuIG9uL29mZiBsZ2R0MzMwMiBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKyNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCitkbyB7IFwKK2lmIChkZWJ1ZykgcHJpbnRrKEtFUk5fREVCVUcgImxnZHQzMzAyOiAiIGFyZ3MpOyBcCit9IHdoaWxlICgwKQorCitzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CisKKwkvKiBDb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJY29uc3Qgc3RydWN0IGxnZHQzMzAyX2NvbmZpZyogY29uZmlnOworCisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKworCS8qIERlbW9kdWxhdG9yIHByaXZhdGUgZGF0YSAqLworCWZlX21vZHVsYXRpb25fdCBjdXJyZW50X21vZHVsYXRpb247CisKKwkvKiBUdW5lciBwcml2YXRlIGRhdGEgKi8KKwl1MzIgY3VycmVudF9mcmVxdWVuY3k7Cit9OworCitzdGF0aWMgaW50IGkyY193cml0ZWJ5dGVzIChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlLAorCQkJICAgdTggYWRkciwgLyogZGVtb2RfYWRkcmVzcyBvciBwbGxfYWRkcmVzcyAqLworCQkJICAgdTggKmJ1ZiwgLyogZGF0YSBieXRlcyB0byBzZW5kICovCisJCQkgICBpbnQgbGVuICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCAqLyApCit7CisJaWYgKGFkZHIgPT0gc3RhdGUtPmNvbmZpZy0+cGxsX2FkZHJlc3MpIHsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJCXsgLmFkZHIgPSBhZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAgLmxlbiA9IGxlbiB9OworCQlpbnQgZXJyOworCisJCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMjogJXMgZXJyb3IgKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIGFkZHIsIGJ1ZlswXSwgZXJyKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwl9IGVsc2UgeworCQl1OCB0bXBbXSA9IHsgYnVmWzBdLCBidWZbMV0gfTsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJCXsgLmFkZHIgPSBhZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gdG1wLCAgLmxlbiA9IDIgfTsKKwkJaW50IGVycjsKKwkJaW50IGk7CisKKwkJZm9yIChpPTE7IGk8bGVuOyBpKyspIHsKKwkJCXRtcFsxXSA9IGJ1ZltpXTsKKwkJCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibGdkdDMzMDI6ICVzIGVycm9yIChhZGRyICUwMnggPC0gJTAyeCwgZXJyID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCBhZGRyLCBidWZbMF0sIGVycik7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCX0KKwkJCXRtcFswXSsrOworCQl9CisJfQorCXJldHVybiAwOworfQorc3RhdGljIGludCBpMmNfcmVhZGJ5dGVzIChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlLAorCQkJICB1OCBhZGRyLCAvKiBkZW1vZF9hZGRyZXNzIG9yIHBsbF9hZGRyZXNzICovCisJCQkgIHU4ICpidWYsIC8qIGhvbGRzIGRhdGEgYnl0ZXMgcmVhZCAqLworCQkJICBpbnQgbGVuICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAqLyApCit7CisJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJeyAuYWRkciA9IGFkZHIsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYnVmLCAgLmxlbiA9IGxlbiB9OworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMjogJXMgZXJyb3IgKGFkZHIgJTAyeCwgZXJyID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCBhZGRyLCBlcnIpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgd3JpdGVzIHRoZSByZWdpc3RlciAocmVnKSB0byB0aGUgZGVtb2QgYnVzCisgKiB0aGVuIHJlYWRzIHRoZSBkYXRhIHJldHVybmVkIGZvciAobGVuKSBieXRlcy4KKyAqLworCitzdGF0aWMgdTggaTJjX3NlbGVjdHJlYWRieXRlcyAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKiBzdGF0ZSwKKwkJCSAgICAgICBlbnVtIEkyQ19SRUcgcmVnLCB1OCogYnVmLCBpbnQgbGVuKQoreworCXU4IHdyIFtdID0geyByZWcgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgW10gPSB7CisJCXsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkgIC5mbGFncyA9IDAsIC5idWYgPSB3ciwgIC5sZW4gPSAxIH0sCisJCXsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkgIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYnVmLCAubGVuID0gbGVuIH0sCisJfTsKKwlpbnQgcmV0OworCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpOworCWlmIChyZXQgIT0gMikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMjogJXM6IGFkZHIgMHglMDJ4IHNlbGVjdCAweCUwMnggZXJyb3IgKHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgcmVnLCByZXQpOworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIFNvZnR3YXJlIHJlc2V0ICovCitpbnQgbGdkdDMzMDJfU3dSZXNldChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlKQoreworCXU4IHJldDsKKwl1OCByZXNldFtdID0geworCQlJUlFfTUFTSywKKwkJMHgwMCAvKiBiaXQgNiBpcyBhY3RpdmUgbG93IHNvZnR3YXJlIHJlc2V0CisJCSAgICAgICoJYml0cyA1LTAgYXJlIDEgdG8gbWFzayBpbnRlcnJ1cHRzICovCisJfTsKKworCXJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLAorCQkJICAgICBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJICAgICByZXNldCwgc2l6ZW9mKHJlc2V0KSk7CisJaWYgKHJldCA9PSAwKSB7CisJCS8qIHNwZWMgc2F5cyByZXNldCB0YWtlcyAxMDAgbnMgd2h5IHdhaXQgKi8KKwkJLyogbWRlbGF5KDEwMCk7ICAgICovIC8qIGtlZXAgbG93IGZvciAxMDBtUyAqLworCQlyZXNldFsxXSA9IDB4N2Y7ICAgICAgLyogZm9yY2UgcmVzZXQgaGlnaCAoaW5hY3RpdmUpCisJCQkJICAgICAgICogYW5kIHVubWFzayBpbnRlcnJ1cHRzICovCisJCXJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLAorCQkJCSAgICAgc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCQkgICAgIHJlc2V0LCBzaXplb2YocmVzZXQpKTsKKwl9CisJLyogU3BlYyBkb2VzIG5vdCBpbmRpY2F0ZSBhIG5lZWQgZm9yIHRoaXMgZWl0aGVyICovCisJLyptZGVsYXkoNSk7ICovICAgICAgICAgICAgICAgLyogd2FpdCA1IG1zZWMgYmVmb3JlIGRvaW5nIG1vcmUgKi8KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJLyogSGFyZHdhcmUgcmVzZXQgaXMgZG9uZSB1c2luZyBncGlvWzBdIG9mIGN4MjM4ODB4IGNoaXAuCisJICogSSdkIGxpa2UgdG8gZG8gaXQgaGVyZSwgYnV0IGRvbid0IGtub3cgaG93IHRvIGZpbmQgY2hpcCBhZGRyZXNzLgorCSAqIGN4ODgtY2FyZHMuYyBhcnJhbmdlcyBmb3IgdGhlIHJlc2V0IGJpdCB0byBiZSBpbmFjdGl2ZSAoaGlnaCkuCisJICogTWF5YmUgdGhlcmUgbmVlZHMgdG8gYmUgYSBjYWxsYWJsZSBmdW5jdGlvbiBpbiBjeDg4LWNvcmUgb3IKKwkgKiB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gZG8gaXQuICovCisKKwlkcHJpbnRrKCIlcyBlbnRlcmVkXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBsZ2R0MzMwMl9Td1Jlc2V0KChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdik7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogYmVyKQoreworCSpiZXIgPSAwOyAvKiBEdW1teSBvdXQgZm9yIG5vdyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogdWNibG9ja3MpCit7CisJc3RydWN0IGxnZHQzMzAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBidWZbMl07CisKKwlpMmNfc2VsZWN0cmVhZGJ5dGVzKHN0YXRlLCBQQUNLRVRfRVJSX0NPVU5URVIxLCBidWYsIHNpemVvZihidWYpKTsKKworCSp1Y2Jsb2NrcyA9IChidWZbMF0gPDwgOCkgfCBidWZbMV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfc2V0X3BhcmFtZXRlcnMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbSkKK3sKKwl1OCBidWZbNF07CisJc3RydWN0IGxnZHQzMzAyX3N0YXRlKiBzdGF0ZSA9CisJCShzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCS8qIFVzZSA1ME1IeiBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gc3BlYyBzaGVldCBzaW5jZSB4dGFsIGlzIDUwICovCisJc3RhdGljIHU4IHRvcF9jdHJsX2NmZ1tdICAgPSB7IFRPUF9DT05UUk9MLCAweDAzIH07CisJc3RhdGljIHU4IHZzYl9mcmVxX2NmZ1tdICAgPSB7IFZTQl9DQVJSSUVSX0ZSRVEwLCAweDAwLCAweDg3LCAweDhlLCAweDAxIH07CisJc3RhdGljIHU4IGRlbXV4X2N0cmxfY2ZnW10gPSB7IERFTVVYX0NPTlRST0wsIDB4ZmIgfTsKKwlzdGF0aWMgdTggYWdjX3JmX2NmZ1tdICAgICA9IHsgQUdDX1JGX0JBTkRXSURUSDAsIDB4NDAsIDB4OTMsIDB4MDAgfTsKKwlzdGF0aWMgdTggYWdjX2N0cmxfY2ZnW10gICA9IHsgQUdDX0ZVTkNfQ1RSTDIsIDB4YzYsIDB4NDAgfTsKKwlzdGF0aWMgdTggYWdjX2RlbGF5X2NmZ1tdICA9IHsgQUdDX0RFTEFZMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBhZ2NfbG9vcF9jZmdbXSAgID0geyBBR0NfTE9PUF9CQU5EV0lEVEgwLCAweDA4LCAweDlhIH07CisKKwkvKiBDaGFuZ2Ugb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIG1vZHVsYXRpb24gKi8KKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiAhPSBwYXJhbS0+dS52c2IubW9kdWxhdGlvbikgeworCQlpbnQgdmFsdWU7CisKKwkJc3dpdGNoKHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSB7CisJCWNhc2UgVlNCXzg6CisJCQlkcHJpbnRrKCIlczogVlNCXzggTU9ERVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJLyogU2VsZWN0IFZTQiBtb2RlIGFuZCBzZXJpYWwgTVBFRyBpbnRlcmZhY2UgKi8KKwkJCXRvcF9jdHJsX2NmZ1sxXSA9IDB4MDc7CisJCQlicmVhazsKKworCQljYXNlIFFBTV82NDoKKwkJCWRwcmludGsoIiVzOiBRQU1fNjQgTU9ERVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJLyogU2VsZWN0IFFBTV82NCBtb2RlIGFuZCBzZXJpYWwgTVBFRyBpbnRlcmZhY2UgKi8KKwkJCXRvcF9jdHJsX2NmZ1sxXSA9IDB4MDQ7CisJCQlicmVhazsKKworCQljYXNlIFFBTV8yNTY6CisJCQlkcHJpbnRrKCIlczogUUFNXzI1NiBNT0RFXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCQkvKiBTZWxlY3QgUUFNXzI1NiBtb2RlIGFuZCBzZXJpYWwgTVBFRyBpbnRlcmZhY2UgKi8KKwkJCXRvcF9jdHJsX2NmZ1sxXSA9IDB4MDU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxnZHQzMzAyOiAlczogTW9kdWxhdGlvbiB0eXBlKCVkKSBVTlNVUFBPUlRFRFxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dS52c2IubW9kdWxhdGlvbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogSW5pdGlhbGl6YXRpb25zIGNvbW1vbiB0byBhbGwgbW9kZXMgKi8KKworCQkvKiBTZWxlY3QgdGhlIHJlcXVlc3RlZCBtb2RlICovCisJCWkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJICAgICAgIHRvcF9jdHJsX2NmZywgc2l6ZW9mKHRvcF9jdHJsX2NmZykpOworCisJCS8qIENoYW5nZSB0aGUgdmFsdWUgb2YgSUZCV1sxMTowXQorCQkgICBvZiBBR0MgSUYvUkYgbG9vcCBmaWx0ZXIgYmFuZHdpZHRoIHJlZ2lzdGVyICovCisJCWkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJICAgICAgIGFnY19yZl9jZmcsIHNpemVvZihhZ2NfcmZfY2ZnKSk7CisKKwkJLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBiaXQgNiwgJ25JTkFHQ0JZJyBhbmQKKwkJICAgJ05TU0VMWzE6MF0gb2YgQUNHIGZ1bmN0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgMiAqLworCQkvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIGJpdCA2ICdSRkZJWCcKKwkJICAgb2YgQUdDIGZ1bmN0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgMyAqLworCQlpMmNfd3JpdGVieXRlcyhzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCSAgICAgICBhZ2NfY3RybF9jZmcsIHNpemVvZihhZ2NfY3RybF9jZmcpKTsKKworCQkvKiBDaGFuZ2UgdGhlIFRQQ0xLIHBpbiBwb2xhcml0eQorCQkgICBkYXRhIGlzIHZhbGlkIG9uIGZhbGxpbmcgY2xvY2sgKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgZGVtdXhfY3RybF9jZmcsIHNpemVvZihkZW11eF9jdHJsX2NmZykpOworCisJCS8qIENoYW5nZSB0aGUgdmFsdWUgb2YgTkNPQ1RGVlsyNTowXSBvZiBjYXJyaWVyCisJCSAgIHJlY292ZXJ5IGNlbnRlciBmcmVxdWVuY3kgcmVnaXN0ZXIgKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkJICAgICAgIHZzYl9mcmVxX2NmZywgc2l6ZW9mKHZzYl9mcmVxX2NmZykpOworCQkvKiBTZXQgdGhlIHZhbHVlIG9mICdJTkxWVEhEJyByZWdpc3RlciAweDJhLzB4MmMKKwkJICAgdG8gdmFsdWUgZnJvbSAnSUZBQ0MnIHJlZ2lzdGVyIDB4MzkvMHgzYiAtMSAqLworCQlpMmNfc2VsZWN0cmVhZGJ5dGVzKHN0YXRlLCBBR0NfUkZJRl9BQ0MwLAorCQkJCSAgICAmYWdjX2RlbGF5X2NmZ1sxXSwgMyk7CisJCXZhbHVlID0gKChhZ2NfZGVsYXlfY2ZnWzFdICYgMHgwZikgPDwgOCkgfCBhZ2NfZGVsYXlfY2ZnWzNdOworCQl2YWx1ZSA9IHZhbHVlIC0xOworCQlkcHJpbnRrKCIlcyBJRkFDQyAtMSA9IDB4JTAzeFxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZSk7CisJCWFnY19kZWxheV9jZmdbMV0gPSAodmFsdWUgPj4gOCkgJiAweDBmOworCQlhZ2NfZGVsYXlfY2ZnWzJdID0gMHgwMDsKKwkJYWdjX2RlbGF5X2NmZ1szXSA9IHZhbHVlICYgMHhmZjsKKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgYWdjX2RlbGF5X2NmZywgc2l6ZW9mKGFnY19kZWxheV9jZmcpKTsKKworCQkvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIElBR0NCV1sxNTo4XQorCQkgICBvZiBpbm5lciBBR0MgbG9vcCBmaWx0ZXIgYmFuZHdpdGggKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgYWdjX2xvb3BfY2ZnLCBzaXplb2YoYWdjX2xvb3BfY2ZnKSk7CisKKwkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CisJCXN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPSBwYXJhbS0+dS52c2IubW9kdWxhdGlvbjsKKwl9CisKKwkvKiBDaGFuZ2Ugb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIGNoYW5uZWwgKi8KKwlpZiAoc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ICE9IHBhcmFtLT5mcmVxdWVuY3kpIHsKKwkJZHZiX3BsbF9jb25maWd1cmUoc3RhdGUtPmNvbmZpZy0+cGxsX2Rlc2MsIGJ1ZiwKKwkJCQkgIHBhcmFtLT5mcmVxdWVuY3ksIDApOworCQlkcHJpbnRrKCIlczogdHVuZXIgYnl0ZXM6IDB4JTAyeCAweCUwMnggIgorCQkJIjB4JTAyeCAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzICxidWYsIDQpOworCisJCS8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHR1bmVyIHBsbCAqLworCQlpMmNfcmVhZGJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcywgYnVmLCAxKTsKKwkJZHByaW50aygiJXM6IHR1bmVyIHN0YXR1cyBieXRlID0gMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGJ1ZlswXSk7CisKKwkJLyogVXBkYXRlIGN1cnJlbnQgZnJlcXVlbmN5ICovCisJCXN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IHBhcmFtLT5mcmVxdWVuY3k7CisJfQorCWxnZHQzMzAyX1N3UmVzZXQoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbSkKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJcGFyYW0tPmZyZXF1ZW5jeSA9IHN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwMl9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGJ1ZlszXTsKKworCSpzdGF0dXMgPSAwOyAvKiBSZXNldCBzdGF0dXMgcmVzdWx0ICovCisKKwkvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSB0dW5lciBwbGwgKi8KKwlpMmNfcmVhZGJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcywgYnVmLCAxKTsKKwlkcHJpbnRrKCIlczogdHVuZXIgc3RhdHVzIGJ5dGUgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdKTsKKwlpZiAoKGJ1ZlswXSAmIDB4YzApICE9IDB4NDApCisJCXJldHVybiAwOyAvKiBUdW5lciBQTEwgbm90IGxvY2tlZCBvciBub3QgcG93ZXJlZCBvbiAqLworCisJLyoKKwkgKiBZb3UgbXVzdCBzZXQgdGhlIE1hc2sgYml0cyB0byAxIGluIHRoZSBJUlFfTUFTSyBpbiBvcmRlcgorCSAqIHRvIHNlZSB0aGF0IHN0YXR1cyBiaXQgaW4gdGhlIElSUV9TVEFUVVMgcmVnaXN0ZXIuCisJICogVGhpcyBpcyBkb25lIGluIFN3UmVzZXQoKTsKKwkgKi8KKworCS8qIEFHQyBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlpMmNfc2VsZWN0cmVhZGJ5dGVzKHN0YXRlLCBBR0NfU1RBVFVTLCBidWYsIDEpOworCWRwcmludGsoIiVzOiBBR0NfU1RBVFVTID0gMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGJ1ZlswXSk7CisJaWYgKChidWZbMF0gJiAweDBjKSA9PSAweDgpeworCQkvKiBUZXN0IHNpZ25hbCBkb2VzIG5vdCBleGlzdCBmbGFnICovCisJCS8qIGFzIHdlbGwgYXMgdGhlIEFHQyBsb2NrIGZsYWcuICAgKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCX0gZWxzZSB7CisJCS8qIFdpdGhvdXQgYSBzaWduYWwgYWxsIG90aGVyIHN0YXR1cyBiaXRzIGFyZSBtZWFuaW5nbGVzcyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzaWduYWwgc3RhdHVzICovCisJaTJjX3NlbGVjdHJlYWRieXRlcyhzdGF0ZSwgVE9QX0NPTlRST0wsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWRwcmludGsoIiVzOiBUT1BfQ09OVFJPTCA9IDB4JTAyeCwgSVJPX01BU0sgPSAweCUwMngsIElSUV9TVEFUVVMgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisKKyNpZiAwCisJLyogQWx0ZXJuYXRpdmUgbWV0aG9kIHRvIGNoZWNrIGZvciBhIHNpZ25hbCAqLworCS8qIHVzaW5nIHRoZSBTTlIgZ29vZC9iYWQgaW50ZXJydXB0cy4gICAqLworCWlmICgoYnVmWzJdICYgMHgzMCkgPT0gMHgxMCkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworI2VuZGlmCisKKwkvKiBzeW5jIHN0YXR1cyAqLworCWlmICgoYnVmWzJdICYgMHgwMykgPT0gMHgwMSkgeworCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCX0KKworCS8qIEZFQyBlcnJvciBzdGF0dXMgKi8KKwlpZiAoKGJ1ZlsyXSAmIDB4MGMpID09IDB4MDgpIHsKKwkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKKwl9CisKKwkvKiBDYXJyaWVyIFJlY292ZXJ5IExvY2sgU3RhdHVzIFJlZ2lzdGVyICovCisJaTJjX3NlbGVjdHJlYWRieXRlcyhzdGF0ZSwgQ0FSUklFUl9MT0NLLCBidWYsIDEpOworCWRwcmludGsoIiVzOiBDQVJSSUVSX0xPQ0sgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdKTsKKwlzd2l0Y2ggKHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24pIHsKKwljYXNlIFFBTV8yNTY6CisJY2FzZSBRQU1fNjQ6CisJCS8qIE5lZWQgdG8gdW5kZXN0YW5kIHdoeSB0aGVyZSBhcmUgMyBsb2NrIGxldmVscyBoZXJlICovCisJCWlmICgoYnVmWzBdICYgMHgwNykgPT0gMHgwNykKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJCWJyZWFrOworCWNhc2UgVlNCXzg6CisJCWlmICgoYnVmWzBdICYgMHg4MCkgPT0gMHg4MCkKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiS0VSTl9XQVJOSU5HIGxnZHQzMzAyOiAlczogTW9kdWxhdGlvbiBzZXQgdG8gdW5zdXBwb3J0ZWQgdmFsdWVcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCit7CisJLyogbm90IGRpcmVjdGx5IGF2YWlsYWJsZS4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwMl9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzbnIpCit7CisjaWZkZWYgU05SX0lOX0RCCisJLyoKKwkgKiBTcGVjIHNoZWV0IHNob3dzIGZvcm11bGEgZm9yIFNOUl9FUSA9IDEwIGxvZzEwKDI1ICogMjQqKjIgLyBub2lzZSkKKwkgKiBhbmQgU05SX1BIID0gMTAgbG9nMTAoMjUgKiAzMioqMiAvIG5vaXNlKSBmb3IgZXF1YWxpemVyIGFuZCBwaGFzZSB0cmFja2VyCisJICogcmVzcGVjdGl2ZWx5LiBUaGUgZm9sbG93aW5nIHRhYmxlcyBhcmUgYnVpbHQgb24gdGhlc2UgZm9ybXVsYXMuCisJICogVGhlIHVzdWFsIGRlZmluaXRpb24gaXMgU05SID0gMjAgbG9nMTAoc2lnbmFsL25vaXNlKQorCSAqIElmIHRoZSBzcGVjaWZpY2F0aW9uIGlzIHdyb25nIHRoZSB2YWx1ZSByZXR1bmVkIGlzIDEvMiB0aGUgYWN0dWFsIFNOUiBpbiBkYi4KKwkgKgorCSAqIFRoaXMgdGFibGUgaXMgYSBhbiBvcmRlcmVkIGxpc3Qgb2Ygbm9pc2UgdmFsdWVzIGNvbXB1dGVkIGJ5IHRoZQorCSAqIGZvcm11bGEgZnJvbSB0aGUgc3BlYyBzaGVldCBzdWNoIHRoYXQgdGhlIGluZGV4IGludG8gdGhlIHRhYmxlCisJICogc3RhcnRpbmcgYXQgNDMgb3IgNDUgaXMgdGhlIFNOUiB2YWx1ZSBpbiBkYi4gVGhlcmUgYXJlIGR1cGxpY2F0ZSBub2lzZQorCSAqIHZhbHVlIGVudHJpZXMgYXQgdGhlIGJlZ2lubmluZyBiZWNhdXNlIHRoZSBTTlIgdmFyaWVzIG1vcmUgdGhhbgorCSAqIDEgZGIgZm9yIGEgY2hhbmdlIG9mIDEgZGlnaXQgaW4gbm9pc2UgYXQgdmVyeSBzbWFsbCB2YWx1ZXMgb2Ygbm9pc2UuCisJICoKKwkgKiBFeGFtcGxlcyBmcm9tIFNOUl9FUSB0YWJsZToKKwkgKiBub2lzZSBTTlIKKwkgKiAgIDAgICAgNDMKKwkgKiAgIDEgICAgNDIKKwkgKiAgIDIgICAgMzkKKwkgKiAgIDMgICAgMzcKKwkgKiAgIDQgICAgMzYKKwkgKiAgIDUgICAgMzUKKwkgKiAgIDYgICAgMzQKKwkgKiAgIDcgICAgMzMKKwkgKiAgIDggICAgMzMKKwkgKiAgIDkgICAgMzIKKwkgKiAgIDEwICAgMzIKKwkgKiAgIDExICAgMzEKKwkgKiAgIDEyICAgMzEKKwkgKiAgIDEzICAgMzAKKwkgKi8KKworCXN0YXRpYyBjb25zdCB1MzIgU05SX0VRW10gPQorCQl7IDEsICAgICAyLCAgICAgIDIsICAgICAgMiwgMywgICAgICAzLCAgICAgIDQsICAgICA0LCAgICAgNSwgICAgIDcsCisJCSAgOSwgICAgIDExLCAgICAgMTMsICAgICAxNywgMjEsICAgICAyNiwgICAgIDMzLCAgICA0MSwgICAgNTIsICAgIDY1LAorCQkgIDgxLCAgICAxMDIsICAgIDEyOSwgICAgMTYyLCAyMDQsICAgIDI1NywgICAgMzIzLCAgIDQwNiwgICA1MTEsICAgNjQ0LAorCQkgIDgxMCwgICAxMDIwLCAgIDEyODQsICAgMTYxNiwgMjAzNSwgICAyNTYxLCAgIDMyMjQsICA0MDU5LCAgNTExMCwgIDY0MzMsCisJCSAgODA5OCwgIDEwMTk1LCAgMTI4MzUsICAxNjE1OCwgMjAzNDEsICAyNTYwOCwgIDMyMjM4LCA0MDU4NSwgNTEwOTQsIDY0MzIzLAorCQkgIDgwOTc4LCAxMDE5NDUsIDEyODM0MSwgMTYxNTcxLCAyMDM0MDYsIDI1NjA3MywgMHg0MDAwMAorCQl9OworCisJc3RhdGljIGNvbnN0IHUzMiBTTlJfUEhbXSA9CisJCXsgMSwgICAgIDIsICAgICAgMiwgICAgICAyLCAgICAgIDMsICAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDgsCisJCSAgMTAsICAgIDEyLCAgICAgMTUsICAgICAxOSwgICAgIDIzLCAgICAgMjksIDM3LCAgICA0NiwgICAgNTgsICAgIDczLAorCQkgIDkxLCAgICAxMTUsICAgIDE0NCwgICAgMTgyLCAgICAyMjksICAgIDI4OCwgMzYyLCAgIDQ1NiwgICA1NzQsICAgNzIyLAorCQkgIDkwOSwgICAxMTQ0LCAgIDE0NDAsICAgMTgxMywgICAyMjgyLCAgIDI4NzMsIDM2MTcsICA0NTUzLCAgNTczMiwgIDcyMTYsCisJCSAgOTA4NCwgIDExNDM2LCAgMTQzOTYsICAxODEyNCwgIDIyODE3LCAgMjg3MjQsICAzNjE2MSwgNDU1MjQsIDU3MzEyLCA3MjE1MSwKKwkJICA5MDgzMywgMTE0MzUxLCAxNDM5NjAsIDE4MTIzNSwgMjI4MTYxLCAweDA0MDAwMAorCQl9OworCisJc3RhdGljIHU4IGJ1Zls1XTsvKiByZWFkIGRhdGEgYnVmZmVyICovCisJc3RhdGljIHUzMiBub2lzZTsgICAvKiBub2lzZSB2YWx1ZSAqLworCXN0YXRpYyB1MzIgc25yX2RiOyAgLyogaW5kZXggaW50byBTTlJfRVFbXSAqLworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwkvKiByZWFkIGJvdGggZXF1YWxpemVyIGFuZCBwYXNlIHRyYWNrZXIgbm9pc2UgZGF0YSAqLworCWkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIEVRUEhfRVJSMCwgYnVmLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBWU0JfOCkgeworCQkvKiBFcXVhbGl6ZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNykgPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKKworCQkvKgorCQkgKiBMb29rIHVwIG5vaXNlIHZhbHVlIGluIHRhYmxlLgorCQkgKiBBIGJldHRlciBzZWFyY2ggYWxnb3JpdGhtIGNvdWxkIGJlIHVzZWQuLi4KKwkJICogd2F0Y2ggb3V0IHRoZXJlIGFyZSBkdXBsaWNhdGUgZW50cmllcy4KKwkJICovCisJCWZvciAoc25yX2RiID0gMDsgc25yX2RiIDwgc2l6ZW9mKFNOUl9FUSk7IHNucl9kYisrKSB7CisJCQlpZiAobm9pc2UgPCBTTlJfRVFbc25yX2RiXSkgeworCQkJCSpzbnIgPSA0MyAtIHNucl9kYjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIFBoYXNlIFRyYWNrZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFFBTSAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNzw8MykgPDwgMTMpIHwgKGJ1ZlszXSA8PCA4KSB8IGJ1Zls0XTsKKworCQkvKiBMb29rIHVwIG5vaXNlIHZhbHVlIGluIHRhYmxlLiAqLworCQlmb3IgKHNucl9kYiA9IDA7IHNucl9kYiA8IHNpemVvZihTTlJfUEgpOyBzbnJfZGIrKykgeworCQkJaWYgKG5vaXNlIDwgU05SX1BIW3Nucl9kYl0pIHsKKwkJCQkqc25yID0gNDUgLSBzbnJfZGI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjZWxzZQorCS8qIFJldHVybiB0aGUgcmF3IG5vaXNlIHZhbHVlICovCisJc3RhdGljIHU4IGJ1Zls1XTsvKiByZWFkIGRhdGEgYnVmZmVyICovCisJc3RhdGljIHUzMiBub2lzZTsgICAvKiBub2lzZSB2YWx1ZSAqLworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwkvKiByZWFkIGJvdGggZXF1YWxpemVyIGFuZCBwYXNlIHRyYWNrZXIgbm9pc2UgZGF0YSAqLworCWkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIEVRUEhfRVJSMCwgYnVmLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBWU0JfOCkgeworCQkvKiBFcXVhbGl6ZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNykgPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKKwl9IGVsc2UgeworCQkvKiBQaGFzZSBUcmFja2VyIE1lYW4tU3F1YXJlIEVycm9yIFJlZ2lzdGVyIGZvciBRQU0gKi8KKwkJbm9pc2UgPSAoKGJ1ZlswXSAmIDc8PDMpIDw8IDEzKSB8IChidWZbM10gPDwgOCkgfCBidWZbNF07CisJfQorCisJLyogU21hbGwgdmFsdWVzIGZvciBub2lzZSBtZWFuIHNpZ25hbCBpcyBiZXR0ZXIgc28gaW52ZXJ0IG5vaXNlICovCisJLyogTm9pc2UgaXMgMTkgYml0IHZhbHVlIHNvIGRpc2NhcmQgMyBMU0IqLworCSpzbnIgPSB+bm9pc2U+PjM7CisjZW5kaWYKKworCWRwcmludGsoIiVzOiBub2lzZSA9IDB4JTA1eCwgc25yID0gJWlkYlxuIixfX0ZVTkNUSU9OX18sIG5vaXNlLCAqc25yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlX3R1bmVfc2V0dGluZ3MpCit7CisJLyogSSBoYXZlIG5vIGlkZWEgYWJvdXQgdGhpcyAtIGl0IG1heSBub3QgYmUgbmVlZGVkICovCisJZmVfdHVuZV9zZXR0aW5ncy0+bWluX2RlbGF5X21zID0gNTAwOworCWZlX3R1bmVfc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDA7CisJZmVfdHVuZV9zZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGdkdDMzMDJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGxnZHQzMzAyX29wczsKKworc3RydWN0IGR2Yl9mcm9udGVuZCogbGdkdDMzMDJfYXR0YWNoKGNvbnN0IHN0cnVjdCBsZ2R0MzMwMl9jb25maWcqIGNvbmZpZywKKwkJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKQoreworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSBOVUxMOworCXU4IGJ1ZlsxXTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCisJc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGxnZHQzMzAyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisJbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKCpzdGF0ZSkpOworCisJLyogU2V0dXAgdGhlIHN0YXRlICovCisJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKKwlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmc3RhdGUtPm9wcywgJmxnZHQzMzAyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJLyogVmVyaWZ5IGNvbW11bmljYXRpb24gd2l0aCBkZW1vZCBjaGlwICovCisJaWYgKGkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIDIsIGJ1ZiwgMSkpCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSAtMTsKKwlzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID0gLTE7CisKKwkvKiBDcmVhdGUgZHZiX2Zyb250ZW5kICovCisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CisKK2Vycm9yOgorCWlmIChzdGF0ZSkKKwkJa2ZyZWUoc3RhdGUpOworCWRwcmludGsoIiVzOiBFUlJPUlxuIixfX0ZVTkNUSU9OX18pOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbGdkdDMzMDJfb3BzID0geworCS5pbmZvID0geworCQkubmFtZT0gIkxHIEVsZWN0cm9uaWNzIExHRFQzMzAyIFZTQi9RQU0gRnJvbnRlbmQiLAorCQkudHlwZSA9IEZFX0FUU0MsCisJCS5mcmVxdWVuY3lfbWluPSA1NDAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXg9IDg1ODAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZT0gNjI1MDAsCisJCS8qIFN5bWJvbCByYXRlIGlzIGZvciBhbGwgVlNCIG1vZGVzIG5lZWQgdG8gY2hlY2sgUUFNICovCisJCS5zeW1ib2xfcmF0ZV9taW4gICAgPSAxMDc2MjAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCAgICA9IDEwNzYyMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNXzI1NiB8IEZFX0NBTl84VlNCCisJfSwKKwkuaW5pdCAgICAgICAgICAgICAgICAgPSBsZ2R0MzMwMl9pbml0LAorCS5zZXRfZnJvbnRlbmQgICAgICAgICA9IGxnZHQzMzAyX3NldF9wYXJhbWV0ZXJzLAorCS5nZXRfZnJvbnRlbmQgICAgICAgICA9IGxnZHQzMzAyX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgICAgPSBsZ2R0MzMwMl9nZXRfdHVuZV9zZXR0aW5ncywKKwkucmVhZF9zdGF0dXMgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgICAgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBsZ2R0MzMwMl9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgICAgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3VjYmxvY2tzLAorCS5yZWxlYXNlICAgICAgICAgICAgICA9IGxnZHQzMzAyX3JlbGVhc2UsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIkxHRFQzMzAyIFtEVmlDTyBGdXNpb25IRFRWIDMgR29sZF0gKEFUU0MgOFZTQiAmIElUVS1UIEouODMgQW5uZXhCIDY0LzI1NiBRQU0pIERlbW9kdWxhdG9yIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiV2lsc29uIE1pY2hhZWxzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0VYUE9SVF9TWU1CT0wobGdkdDMzMDJfYXR0YWNoKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBjb21waWxlLWNvbW1hbmQ6ICJtYWtlIERWQj0xIgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTg3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDIuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogJElkOiBsZ2R0MzMwMi5oLHYgMS4yIDIwMDUvMDYvMjggMjM6NTA6NDggbWtydWZreSBFeHAgJAorICoKKyAqICAgIFN1cHBvcnQgZm9yIExHRFQzMzAyIChEVmlDTyBGdXN0aW9uSERUViAzIEdvbGQpIC0gVlNCL1FBTQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwNSBXaWxzb24gTWljaGFlbHMgPHdpbHNvbm1pY2hhZWxzQGVhcnRobGluay5uZXQ+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgTEdEVDMzMDJfSAorI2RlZmluZSBMR0RUMzMwMl9ICisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKworc3RydWN0IGxnZHQzMzAyX2NvbmZpZworeworCS8qIFRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCisJdTggZGVtb2RfYWRkcmVzczsKKwl1OCBwbGxfYWRkcmVzczsKKwlzdHJ1Y3QgZHZiX3BsbF9kZXNjICpwbGxfZGVzYzsKKworCS8qIE5lZWQgdG8gc2V0IGRldmljZSBwYXJhbSBmb3Igc3RhcnRfZG1hICovCisJaW50ICgqc2V0X3RzX3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpOworfTsKKworZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGxnZHQzMzAyX2F0dGFjaChjb25zdCBzdHJ1Y3QgbGdkdDMzMDJfY29uZmlnKiBjb25maWcsCisJCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisKKyNlbmRpZiAvKiBMR0RUMzMwMl9IICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkzZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyX3ByaXYuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogJElkOiBsZ2R0MzMwMl9wcml2LmgsdiAxLjIgMjAwNS8wNi8yOCAyMzo1MDo0OCBta3J1Zmt5IEV4cCAkCisgKgorICogICAgU3VwcG9ydCBmb3IgTEdEVDMzMDIgKERWaUNPIEZ1c3Rpb25IRFRWIDMgR29sZCkgLSBWU0IvUUFNCisgKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA1IFdpbHNvbiBNaWNoYWVscyA8d2lsc29ubWljaGFlbHNAZWFydGhsaW5rLm5ldD4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTEdEVDMzMDJfUFJJVl8KKyNkZWZpbmUgX0xHRFQzMzAyX1BSSVZfCisKKy8qIGkyYyBjb250cm9sIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworZW51bSBJMkNfUkVHIHsKKwlUT1BfQ09OVFJPTD0gMHgwMCwKKwlJUlFfTUFTSz0gMHgwMSwKKwlJUlFfU1RBVFVTPSAweDAyLAorCVZTQl9DQVJSSUVSX0ZSRVEwPSAweDE2LAorCVZTQl9DQVJSSUVSX0ZSRVExPSAweDE3LAorCVZTQl9DQVJSSUVSX0ZSRVEyPSAweDE4LAorCVZTQl9DQVJSSUVSX0ZSRVEzPSAweDE5LAorCUNBUlJJRVJfTVNFUUFNMT0gMHgxYSwKKwlDQVJSSUVSX01TRVFBTTI9IDB4MWIsCisJQ0FSUklFUl9MT0NLPSAweDFjLAorCVRJTUlOR19SRUNPVkVSWT0gMHgxZCwKKwlBR0NfREVMQVkwPSAweDJhLAorCUFHQ19ERUxBWTE9IDB4MmIsCisJQUdDX0RFTEFZMj0gMHgyYywKKwlBR0NfUkZfQkFORFdJRFRIMD0gMHgyZCwKKwlBR0NfUkZfQkFORFdJRFRIMT0gMHgyZSwKKwlBR0NfUkZfQkFORFdJRFRIMj0gMHgyZiwKKwlBR0NfTE9PUF9CQU5EV0lEVEgwPSAweDMwLAorCUFHQ19MT09QX0JBTkRXSURUSDE9IDB4MzEsCisJQUdDX0ZVTkNfQ1RSTDE9IDB4MzIsCisJQUdDX0ZVTkNfQ1RSTDI9IDB4MzMsCisJQUdDX0ZVTkNfQ1RSTDM9IDB4MzQsCisJQUdDX1JGSUZfQUNDMD0gMHgzOSwKKwlBR0NfUkZJRl9BQ0MxPSAweDNhLAorCUFHQ19SRklGX0FDQzI9IDB4M2IsCisJQUdDX1NUQVRVUz0gMHgzZiwKKwlTWU5DX1NUQVRVU19WU0I9IDB4NDMsCisJRVFQSF9FUlIwPSAweDQ3LAorCUVRX0VSUjE9IDB4NDgsCisJRVFfRVJSMj0gMHg0OSwKKwlQSF9FUlIxPSAweDRhLAorCVBIX0VSUjI9IDB4NGIsCisJREVNVVhfQ09OVFJPTD0gMHg2NiwKKwlQQUNLRVRfRVJSX0NPVU5URVIxPSAweDZhLAorCVBBQ0tFVF9FUlJfQ09VTlRFUjI9IDB4NmIsCit9OworCisjZW5kaWYgLyogX0xHRFQzMzAyX1BSSVZfICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM5NmFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwpAQCAtMCwwICsxLDgwMCBAQAorLyoKK0RyaXZlciBmb3IgU2Ftc3VuZyBTNUgxNDIwIFFQU0sgRGVtb2R1bGF0b3IKKworQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJldyBkZSBRdWluY2V5IDxhZHFfZHZiQGxpZHNraWFsZi5uZXQ+CisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKworR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgInM1aDE0MjAuaCIKKworCisKKyNkZWZpbmUgVE9ORV9GUkVRIDIyMDAwCisKK3N0cnVjdCBzNWgxNDIwX3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CisJY29uc3Qgc3RydWN0IHM1aDE0MjBfY29uZmlnKiBjb25maWc7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKworCXU4IHBvc3Rsb2NrZWQ6MTsKKwl1MzIgZmNsazsKKwl1MzIgdHVuZWRmcmVxOworCWZlX2NvZGVfcmF0ZV90IGZlY19pbm5lcjsKKwl1MzIgc3ltYm9sX3JhdGU7Cit9OworCitzdGF0aWMgdTMyIHM1aDE0MjBfZ2V0c3ltYm9scmF0ZShzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpOworc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpOworCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworI2RlZmluZSBkcHJpbnRrIGlmIChkZWJ1ZykgcHJpbnRrCisKK3N0YXRpYyBpbnQgczVoMTQyMF93cml0ZXJlZyAoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCB1OCByZWcsIHU4IGRhdGEpCit7CisJdTggYnVmIFtdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCWRwcmludGsgKCIlczogd3JpdGVyZWcgZXJyb3IgKGVyciA9PSAlaSwgcmVnID09IDB4JTAyeCwgZGF0YSA9PSAweCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgcmVnLCBkYXRhKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBzNWgxNDIwX3JlYWRyZWcgKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgdTggcmVnKQoreworCWludCByZXQ7CisJdTggYjAgW10gPSB7IHJlZyB9OworCXU4IGIxIFtdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnMSA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gYjAsIC5sZW4gPSAxIH07CisJc3RydWN0IGkyY19tc2cgbXNnMiA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGIxLCAubGVuID0gMSB9OworCisJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2cxLCAxKSkgIT0gMSkKKwkJcmV0dXJuIHJldDsKKworCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyIChzdGF0ZS0+aTJjLCAmbXNnMiwgMSkpICE9IDEpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYjFbMF07Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9zZXRfdm9sdGFnZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXN3aXRjaCh2b2x0YWdlKSB7CisJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYykgJiAweGZlKSB8IDB4MDIpOworCQlicmVhazsKKworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2MsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYykgfCAweDAzKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNjKSAmIDB4ZmQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NldF90b25lIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlzd2l0Y2godG9uZSkgeworCWNhc2UgU0VDX1RPTkVfT046CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3NCkgfCAweDA4KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDc0KSB8IDB4MDEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NlbmRfbWFzdGVyX2NtZCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQqIGNtZCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCB2YWw7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXN1bHQgPSAwOworCisJLyogc2V0dXAgZm9yIERJU0VRQyAqLworCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgMHgwMik7CisJbXNsZWVwKDE1KTsKKworCS8qIHdyaXRlIHRoZSBESVNFUUMgY29tbWFuZCBieXRlcyAqLworCWZvcihpPTA7IGk8IGNtZC0+bXNnX2xlbjsgaSsrKSB7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2MgKyBpLCBjbWQtPm1zZ1tpXSk7CisJfQorCisJLyoga2ljayBvZmYgdHJhbnNtaXNzaW9uICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSB8ICgoY21kLT5tc2dfbGVuLTEpIDw8IDQpIHwgMHgwOCk7CisKKwkvKiB3YWl0IGZvciB0cmFuc21pc3Npb24gdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArICgoMTAwKkhaKSAvIDEwMDApOworCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHgwOCkKKwkJCWJyZWFrOworCisJCW1zbGVlcCg1KTsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgdmFsKTsKKwltc2xlZXAoMTUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9yZWN2X3NsYXZlX3JlcGx5IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkqIHJlcGx5KQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IHZhbDsKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qIHNldHVwIGZvciBESVNFUUMgcmVjaWV2ZSAqLworCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgMHg4Mik7IC8qIEZJWE1FOiBndWVzcyAtIGRvIHdlIG5lZWQgdG8gc2V0IERJU19SRFkoMHgwOCkgaW4gcmVjZWl2ZSBtb2RlPyAqLworCW1zbGVlcCgxNSk7CisKKwkvKiB3YWl0IGZvciByZWNlcHRpb24gdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArICgocmVwbHktPnRpbWVvdXQqSFopIC8gMTAwMCk7CisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYgKCEoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4ODApKSAvKiBGSVhNRTogZG8gd2UgdGVzdCBESVNfUkRZKDB4MDgpIG9yIFJDVl9FTigweDgwKT8gKi8KKwkJCWJyZWFrOworCisJCW1zbGVlcCg1KTsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBleGl0OworCX0KKworCS8qIGNoZWNrIGVycm9yIGZsYWcgLSBGSVhNRTogbm90IHN1cmUgd2hhdCB0aGlzIGRvZXMgLSBkb2NzIGRvIG5vdCBkZXNjcmliZQorCSAqIGJleW9uZCAiZXJyb3IgZmxhZyBmb3IgZGlzZXFjIHJlY2VpdmUgZGF0YSA6KCAqLworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDkpKSB7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBjaGVjayBsZW5ndGggKi8KKwlsZW5ndGggPSAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4NzApID4+IDQ7CisJaWYgKGxlbmd0aCA+IHNpemVvZihyZXBseS0+bXNnKSkgeworCQlyZXN1bHQgPSAtRU9WRVJGTE9XOworCQlnb3RvIGV4aXQ7CisJfQorCXJlcGx5LT5tc2dfbGVuID0gbGVuZ3RoOworCisJLyogZXh0cmFjdCBkYXRhICovCisJZm9yKGk9MDsgaTwgbGVuZ3RoOyBpKyspIHsKKwkJcmVwbHktPm1zZ1tpXSA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYyArIGkpOworCX0KKworZXhpdDoKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgdmFsKTsKKwltc2xlZXAoMTUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9zZW5kX2J1cnN0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgbWluaWNtZCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCB2YWw7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2V0dXAgZm9yIHRvbmUgYnVyc3QgKi8KKwl2YWwgPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3MCkgfCAweDAxKTsKKworCS8qIHNldCB2YWx1ZSBmb3IgQiBwb3NpdGlvbiBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAobWluaWNtZCA9PSBTRUNfTUlOSV9CKSB7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgfCAweDA0KTsKKwl9CisJbXNsZWVwKDE1KTsKKworCS8qIHN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgfCAweDA4KTsKKworCS8qIHdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgKCgyMCpIWikgLyAxMDAwKTsKKwl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoIShzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHgwOCkpCisJCQlicmVhazsKKworCQltc2xlZXAoNSk7CisJfQorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCisJLyogcmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncyAqLworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHZhbCk7CisJbXNsZWVwKDE1KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZmVfc3RhdHVzX3QgczVoMTQyMF9nZXRfc3RhdHVzX2JpdHMoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCXU4IHZhbDsKKwlmZV9zdGF0dXNfdCBzdGF0dXMgPSAwOworCisJdmFsID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDE0KTsKKwlpZiAodmFsICYgMHgwMikKKwkJc3RhdHVzIHw9ICBGRV9IQVNfU0lHTkFMOyAvLyBGSVhNRTogbm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAorCWlmICh2YWwgJiAweDAxKQorCQlzdGF0dXMgfD0gIEZFX0hBU19DQVJSSUVSOyAvLyBGSVhNRTogbm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAorCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzNik7CisJaWYgKHZhbCAmIDB4MDEpCisJCXN0YXR1cyB8PSAgRkVfSEFTX1ZJVEVSQkk7CisJaWYgKHZhbCAmIDB4MjApCisJCXN0YXR1cyB8PSAgRkVfSEFTX1NZTkM7CisJaWYgKHN0YXR1cyA9PSAoRkVfSEFTX1NJR05BTHxGRV9IQVNfQ0FSUklFUnxGRV9IQVNfVklURVJCSXxGRV9IQVNfU1lOQykpCisJCXN0YXR1cyB8PSAgRkVfSEFTX0xPQ0s7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggdmFsOworCisJaWYgKHN0YXR1cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRldGVybWluZSBsb2NrIHN0YXRlICovCisJKnN0YXR1cyA9IHM1aDE0MjBfZ2V0X3N0YXR1c19iaXRzKHN0YXRlKTsKKworCS8qIGZpeCBmb3IgRkVDIDUvNiBpbnZlcnNpb24gaXNzdWUgLSBpZiBpdCBkb2Vzbid0IHF1aXRlIGxvY2ssIGludmVydCB0aGUgaW52ZXJzaW9uLAorCXdhaXQgYSBiaXQgYW5kIGNoZWNrIGFnYWluICovCisJaWYgKCpzdGF0dXMgPT0gKEZFX0hBU19TSUdOQUx8RkVfSEFTX0NBUlJJRVJ8RkVfSEFTX1ZJVEVSQkkpKSB7CisJCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzMik7CisJCWlmICgodmFsICYgMHgwNykgPT0gMHgwMykgeworCQkJaWYgKHZhbCAmIDB4MDgpCisJCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMyk7CisJCQllbHNlCisJCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxYik7CisKKwkJCS8qIHdhaXQgYSBiaXQgdGhlbiB1cGRhdGUgbG9jayBzdGF0dXMgKi8KKwkJCW1kZWxheSgyMDApOworCQkJKnN0YXR1cyA9IHM1aDE0MjBfZ2V0X3N0YXR1c19iaXRzKHN0YXRlKTsKKwkJfQorCX0KKworCS8qIHBlcmZvcm0gcG9zdCBsb2NrIHNldHVwICovCisJaWYgKCgqc3RhdHVzICYgRkVfSEFTX0xPQ0spICYmICghc3RhdGUtPnBvc3Rsb2NrZWQpKSB7CisKKwkJLyogY2FsY3VsYXRlIHRoZSBkYXRhIHJhdGUgKi8KKwkJdTMyIHRtcCA9IHM1aDE0MjBfZ2V0c3ltYm9scmF0ZShzdGF0ZSk7CisJCXN3aXRjaChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzIpICYgMHgwNykgeworCQljYXNlIDA6CisJCQl0bXAgPSAodG1wICogMiAqIDEpIC8gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCXRtcCA9ICh0bXAgKiAyICogMikgLyAzOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJdG1wID0gKHRtcCAqIDIgKiAzKSAvIDQ7CisJCQlicmVhazsKKworCQljYXNlIDM6CisJCQl0bXAgPSAodG1wICogMiAqIDUpIC8gNjsKKwkJCWJyZWFrOworCisJCWNhc2UgNDoKKwkJCXRtcCA9ICh0bXAgKiAyICogNikgLyA3OworCQkJYnJlYWs7CisKKwkJY2FzZSA1OgorCQkJdG1wID0gKHRtcCAqIDIgKiA3KSAvIDg7CisJCQlicmVhazsKKwkJfQorCQl0bXAgPSBzdGF0ZS0+ZmNsayAvIHRtcDsKKworCQkvKiBzZXQgdGhlIE1QRUdfQ0xLX0lOVEwgZm9yIHRoZSBjYWxjdWxhdGVkIGRhdGEgcmF0ZSAqLworCQlpZiAodG1wIDwgNCkKKwkJCXZhbCA9IDB4MDA7CisJCWVsc2UgaWYgKHRtcCA8IDgpCisJCQl2YWwgPSAweDAxOworCQllbHNlIGlmICh0bXAgPCAxMikKKwkJCXZhbCA9IDB4MDI7CisJCWVsc2UgaWYgKHRtcCA8IDE2KQorCQkJdmFsID0gMHgwMzsKKwkJZWxzZSBpZiAodG1wIDwgMjQpCisJCQl2YWwgPSAweDA0OworCQllbHNlIGlmICh0bXAgPCAzMikKKwkJCXZhbCA9IDB4MDU7CisJCWVsc2UKKwkJCXZhbCA9IDB4MDY7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MjIsIHZhbCk7CisKKwkJLyogREMgZnJlZXplICovCisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MWYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxZikgfCAweDAxKTsKKworCQkvKiBraWNrZXIgZGlzYWJsZSArIHJlbW92ZSBEQyBvZmZzZXQgKi8KKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA1KSAmIDB4NmYpOworCisJCS8qIHBvc3QtbG9jayBwcm9jZXNzaW5nIGhhcyBiZWVuIGRvbmUhICovCisJCXN0YXRlLT5wb3N0bG9ja2VkID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIGJlcikKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4NDYsIDB4MWQpOworCW1kZWxheSgyNSk7CisJcmV0dXJuIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDgpIDw8IDgpIHwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ3KTsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJdTggdmFsID0gMHhmZiAtIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxNSk7CisKKwlyZXR1cm4gKGludCkgKCh2YWwgPDwgOCkgfCB2YWwpOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4NDYsIDB4MWYpOworCW1kZWxheSgyNSk7CisJcmV0dXJuIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDgpIDw8IDgpIHwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ3KTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9yZXNldChzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDEsIDB4MDgpOworCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAxLCAweDAwKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCBzNWgxNDIwX3NldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJdTY0IHZhbDsKKworCXZhbCA9IChwLT51LnFwc2suc3ltYm9sX3JhdGUgLyAxMDAwKSAqICgxPDwyNCk7CisJaWYgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA8PSAyMTAwMDAwMCkgeworCQl2YWwgKj0gMjsKKwl9CisJZG9fZGl2KHZhbCwgKHN0YXRlLT5mY2xrIC8gMTAwMCkpOworCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwOSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA5KSAmIDB4N2YpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MTEsIHZhbCA+PiAxNik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgxMiwgdmFsID4+IDgpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MTMsIHZhbCAmIDB4ZmYpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDksIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwOSkgfCAweDgwKTsKK30KKworc3RhdGljIHUzMiBzNWgxNDIwX2dldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCXU2NCB2YWw7CisJaW50IHNhbXBsaW5nID0gMjsKKworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDUpICYgMHgyKQorCQlzYW1wbGluZyA9IDE7CisKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA2LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDYpIHwgMHgwOCk7CisJdmFsICA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxMSkgPDwgMTY7CisJdmFsIHw9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxMikgPDwgODsKKwl2YWwgfD0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDEzKTsKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA2LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDYpICYgMHhmNyk7CisKKwl2YWwgKj0gKHN0YXRlLT5mY2xrIC8gMTAwMCk7CisJZG9fZGl2KHZhbCwgKCgxPDwyNCkgKiBzYW1wbGluZykpOworCisJcmV0dXJuICh1MzIpICh2YWwgKiAxMDAwKTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgaW50IGZyZXFvZmZzZXQpCit7CisJaW50IHZhbDsKKworCS8qIHJlbWVtYmVyIGZyZXFvZmZzZXQgaXMgaW4ga0h6LCBidXQgdGhlIGNoaXAgd2FudHMgdGhlIG9mZnNldCBpbiBIeiwgc28KKwkgKiBkaXZpZGUgZmNsayBieSAxMDAwMDAwIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS4gKi8KKwl2YWwgPSAtKGludCkgKChmcmVxb2Zmc2V0ICogKDE8PDI0KSkgLyAoc3RhdGUtPmZjbGsgLyAxMDAwMDAwKSk7CisKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA5LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDkpICYgMHhiZik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwZSwgdmFsID4+IDE2KTsKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDBmLCB2YWwgPj4gOCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgxMCwgdmFsICYgMHhmZik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwOSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA5KSB8IDB4NDApOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfZ2V0ZnJlcW9mZnNldChzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJaW50IHZhbDsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwNikgfCAweDA4KTsKKwl2YWwgID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDBlKSA8PCAxNjsKKwl2YWwgfD0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDBmKSA8PCA4OworCXZhbCB8PSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MTApOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwNikgJiAweGY3KTsKKworCWlmICh2YWwgJiAweDgwMDAwMCkKKwkJdmFsIHw9IDB4ZmYwMDAwMDA7CisKKwkvKiByZW1lbWJlciBmcmVxb2Zmc2V0IGlzIGluIGtIeiwgYnV0IHRoZSBjaGlwIHdhbnRzIHRoZSBvZmZzZXQgaW4gSHosIHNvCisJICogZGl2aWRlIGZjbGsgYnkgMTAwMDAwMCB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuICovCisJdmFsID0gLSAoKHZhbCAqIChzdGF0ZS0+ZmNsay8xMDAwMDAwKSkgLyAoMTw8MjQpKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHM1aDE0MjBfc2V0ZmVjKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCWlmICgocC0+dS5xcHNrLmZlY19pbm5lciA9PSBGRUNfQVVUTykgfHwgKHAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fQVVUTykpIHsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgwMCk7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4M2YpOworCX0gZWxzZSB7CisJCXN3aXRjaChwLT51LnFwc2suZmVjX2lubmVyKSB7CisJCWNhc2UgRkVDXzFfMjoKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTApOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwMSk7CisJCQlicmVhazsKKworCQljYXNlIEZFQ18yXzM6CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDExKTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MDIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRUNfM180OgorCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMik7CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDA0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRkVDXzVfNjoKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTMpOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwOCk7CisJCQlicmVhazsKKworCQljYXNlIEZFQ182Xzc6CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDE0KTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MTApOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRUNfN184OgorCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxNSk7CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDIwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBmZV9jb2RlX3JhdGVfdCBzNWgxNDIwX2dldGZlYyhzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJc3dpdGNoKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzMikgJiAweDA3KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gRkVDXzFfMjsKKworCWNhc2UgMToKKwkJcmV0dXJuIEZFQ18yXzM7CisKKwljYXNlIDI6CisJCXJldHVybiBGRUNfM180OworCisJY2FzZSAzOgorCQlyZXR1cm4gRkVDXzVfNjsKKworCWNhc2UgNDoKKwkJcmV0dXJuIEZFQ182Xzc7CisKKwljYXNlIDU6CisJCXJldHVybiBGRUNfN184OworCX0KKworCXJldHVybiBGRUNfTk9ORTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9zZXRpbnZlcnNpb24oc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJaWYgKChwLT51LnFwc2suZmVjX2lubmVyID09IEZFQ19BVVRPKSB8fCAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9BVVRPKSkgeworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDAwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgzZik7CisJfSBlbHNlIHsKKwkJdTggdG1wID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDMxKSAmIDB4Zjc7CisJCQl0bXAgfD0gMHgxMDsKKworCQlpZiAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9PTikKKwkJCXRtcCB8PSAweDgwOworCisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIHRtcCk7CisJfQorfQorCitzdGF0aWMgZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgczVoMTQyMF9nZXRpbnZlcnNpb24oc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzIpICYgMHgwOCkKKwkJcmV0dXJuIElOVkVSU0lPTl9PTjsKKworCXJldHVybiBJTlZFUlNJT05fT0ZGOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTMyIGZyZXF1ZW5jeV9kZWx0YTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgZmVzZXR0aW5nczsKKworCS8qIGNoZWNrIGlmIHdlIHNob3VsZCBkbyBhIGZhc3QtdHVuZSAqLworCW1lbWNweSgmZmVzZXR0aW5ncy5wYXJhbWV0ZXJzLCBwLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7CisJczVoMTQyMF9nZXRfdHVuZV9zZXR0aW5ncyhmZSwgJmZlc2V0dGluZ3MpOworCWZyZXF1ZW5jeV9kZWx0YSA9IHAtPmZyZXF1ZW5jeSAtIHN0YXRlLT50dW5lZGZyZXE7CisJaWYgKChmcmVxdWVuY3lfZGVsdGEgPiAtZmVzZXR0aW5ncy5tYXhfZHJpZnQpICYmIChmcmVxdWVuY3lfZGVsdGEgPCBmZXNldHRpbmdzLm1heF9kcmlmdCkgJiYKKwkgICAgKGZyZXF1ZW5jeV9kZWx0YSAhPSAwKSAmJgorCSAgICAoc3RhdGUtPmZlY19pbm5lciA9PSBwLT51LnFwc2suZmVjX2lubmVyKSAmJgorCSAgICAoc3RhdGUtPnN5bWJvbF9yYXRlID09IHAtPnUucXBzay5zeW1ib2xfcmF0ZSkpIHsKKworCQlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIGZyZXF1ZW5jeV9kZWx0YSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGZpcnN0IG9mIGFsbCwgc29mdHdhcmUgcmVzZXQgKi8KKwlzNWgxNDIwX3Jlc2V0KHN0YXRlKTsKKworCS8qIHNldCB0dW5lciBQTEwgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkgeworCQlzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpIHwgMSk7CisJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHAsICZzdGF0ZS0+dHVuZWRmcmVxKTsKKwkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSAmIDB4ZmUpOworCX0KKworCS8qIHNldCBzNWgxNDIwIGZjbGsgUExMIGFjY29yZGluZyB0byBkZXNpcmVkIHN5bWJvbCByYXRlICovCisJaWYgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA+IDI4MDAwMDAwKSB7CisJCXN0YXRlLT5mY2xrID0gODgwMDAwMDA7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDMsIDB4NTApOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA0LCAweDQwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgMHhhZSk7CisJfSBlbHNlIGlmIChwLT51LnFwc2suc3ltYm9sX3JhdGUgPiAyMTAwMDAwMCkgeworCQlzdGF0ZS0+ZmNsayA9IDU5MDAwMDAwOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDAzLCAweDMzKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNCwgMHg0MCk7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDUsIDB4YWUpOworCX0gZWxzZSB7CisJCXN0YXRlLT5mY2xrID0gODgwMDAwMDA7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDMsIDB4NTApOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA0LCAweDQwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgMHhhYyk7CisJfQorCisJLyogc2V0IG1pc2MgcmVnaXN0ZXJzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwMiwgMHgwMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNywgMHhiMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYSwgMHg2Nyk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYiwgMHg3OCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYywgMHg0OCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwZCwgMHg2Yik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgyZSwgMHg4ZSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzNSwgMHgzMyk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzOCwgMHgwMSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzOSwgMHg3ZCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYSwgKHN0YXRlLT5mY2xrICsgKFRPTkVfRlJFUSAqIDMyKSAtIDEpIC8gKFRPTkVfRlJFUSAqIDMyKSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgMHgwMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHg0NSwgMHg2MSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHg0NiwgMHgxZCk7CisKKwkvKiBzdGFydCBRUFNLICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA1KSB8IDEpOworCisJLyogc2V0IHRoZSBmcmVxdWVuY3kgb2Zmc2V0IHRvIGFkanVzdCBmb3IgUExMIGluYWNjdXJhY3kgKi8KKwlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIHAtPmZyZXF1ZW5jeSAtIHN0YXRlLT50dW5lZGZyZXEpOworCisJLyogc2V0IHRoZSByZXNldCBvZiB0aGUgcGFyYW1ldGVycyAqLworCXM1aDE0MjBfc2V0c3ltYm9scmF0ZShzdGF0ZSwgcCk7CisJczVoMTQyMF9zZXRpbnZlcnNpb24oc3RhdGUsIHApOworCXM1aDE0MjBfc2V0ZmVjKHN0YXRlLCBwKTsKKworCXN0YXRlLT5mZWNfaW5uZXIgPSBwLT51LnFwc2suZmVjX2lubmVyOworCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKKwlzdGF0ZS0+cG9zdGxvY2tlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXAtPmZyZXF1ZW5jeSA9IHN0YXRlLT50dW5lZGZyZXEgKyBzNWgxNDIwX2dldGZyZXFvZmZzZXQoc3RhdGUpOworCXAtPmludmVyc2lvbiA9IHM1aDE0MjBfZ2V0aW52ZXJzaW9uKHN0YXRlKTsKKwlwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBzNWgxNDIwX2dldHN5bWJvbHJhdGUoc3RhdGUpOworCXAtPnUucXBzay5mZWNfaW5uZXIgPSBzNWgxNDIwX2dldGZlYyhzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCit7CisJaWYgKGZlc2V0dGluZ3MtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlID4gMjAwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gNTA7CisJCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDIwMDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDgwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDEyMDAwMDAwKSB7CisJCWZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDEwMDsKKwkJZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMTUwMDsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gOTAwMDsKKwl9IGVsc2UgaWYgKGZlc2V0dGluZ3MtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlID4gODAwMDAwMCkgeworCQlmZXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSAxMDA7CisJCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDEwMDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDgwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDQwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMTAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSA1MDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDcwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDIwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMjAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAoZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyA4MDAwKTsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMTQgKiBmZXNldHRpbmdzLT5zdGVwX3NpemU7CisJfSBlbHNlIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMjAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAoZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyA4MDAwKTsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMTggKiBmZXNldHRpbmdzLT5zdGVwX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9pbml0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCS8qIGRpc2FibGUgcG93ZXIgZG93biBhbmQgZG8gcmVzZXQgKi8KKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDAyLCAweDEwKTsKKwltc2xlZXAoMTApOworCXM1aDE0MjBfcmVzZXQoc3RhdGUpOworCisJLyogaW5pdCBQTEwgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKKwkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSB8IDEpOworCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7CisJCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgJiAweGZlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJcmV0dXJuIHM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDIsIDB4MTIpOworfQorCitzdGF0aWMgdm9pZCBzNWgxNDIwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgczVoMTQyMF9vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIHM1aDE0MjBfYXR0YWNoKGNvbnN0IHN0cnVjdCBzNWgxNDIwX2NvbmZpZyogY29uZmlnLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBOVUxMOworCXU4IGlkZW50aXR5OworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzNWgxNDIwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKwlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOworCXN0YXRlLT5pMmMgPSBpMmM7CisJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmczVoMTQyMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5wb3N0bG9ja2VkID0gMDsKKwlzdGF0ZS0+ZmNsayA9IDg4MDAwMDAwOworCXN0YXRlLT50dW5lZGZyZXEgPSAwOworCXN0YXRlLT5mZWNfaW5uZXIgPSBGRUNfTk9ORTsKKwlzdGF0ZS0+c3ltYm9sX3JhdGUgPSAwOworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICsgaWRlbnRpZnkgaXQgKi8KKwlpZGVudGl0eSA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwMCk7CisJaWYgKGlkZW50aXR5ICE9IDB4MDMpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CisKK2Vycm9yOgorCWtmcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHM1aDE0MjBfb3BzID0geworCisJLmluZm8gPSB7CisJCS5uYW1lICAgICA9ICJTYW1zdW5nIFM1SDE0MjAgRFZCLVMiLAorCQkudHlwZSAgICAgPSBGRV9RUFNLLAorCQkuZnJlcXVlbmN5X21pbiAgICA9IDk1MDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggICAgPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplID0gMTI1LCAgICAgLyoga0h6IGZvciBRUFNLIGZyb250ZW5kcyAqLworCQkuZnJlcXVlbmN5X3RvbGVyYW5jZSAgPSAyOTUwMCwKKwkJLnN5bWJvbF9yYXRlX21pbiAgPSAxMDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWF4ICA9IDQ1MDAwMDAwLAorCQkvKiAgLnN5bWJvbF9yYXRlX3RvbGVyYW5jZSAgPSA/Pz8sKi8KKwkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfAorCQlGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQlGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfNl83IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQlGRV9DQU5fUVBTSworCX0sCisKKwkucmVsZWFzZSA9IHM1aDE0MjBfcmVsZWFzZSwKKworCS5pbml0ID0gczVoMTQyMF9pbml0LAorCS5zbGVlcCA9IHM1aDE0MjBfc2xlZXAsCisKKwkuc2V0X2Zyb250ZW5kID0gczVoMTQyMF9zZXRfZnJvbnRlbmQsCisJLmdldF9mcm9udGVuZCA9IHM1aDE0MjBfZ2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IHM1aDE0MjBfZ2V0X3R1bmVfc2V0dGluZ3MsCisKKwkucmVhZF9zdGF0dXMgPSBzNWgxNDIwX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IHM1aDE0MjBfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gczVoMTQyMF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF91Y2Jsb2NrcyA9IHM1aDE0MjBfcmVhZF91Y2Jsb2NrcywKKworCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gczVoMTQyMF9zZW5kX21hc3Rlcl9jbWQsCisJLmRpc2VxY19yZWN2X3NsYXZlX3JlcGx5ID0gczVoMTQyMF9yZWN2X3NsYXZlX3JlcGx5LAorCS5kaXNlcWNfc2VuZF9idXJzdCA9IHM1aDE0MjBfc2VuZF9idXJzdCwKKwkuc2V0X3RvbmUgPSBzNWgxNDIwX3NldF90b25lLAorCS5zZXRfdm9sdGFnZSA9IHM1aDE0MjBfc2V0X3ZvbHRhZ2UsCit9OworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTNUgxNDIwIERWQi1TIERlbW9kdWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV3IGRlIFF1aW5jZXkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChzNWgxNDIwX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjg3ZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApAQCAtMCwwICsxLDQxIEBACisvKgorICAgIERyaXZlciBmb3IgUzVIMTQyMCBRUFNLIERlbW9kdWxhdG9ycworCisgICAgQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJldyBkZSBRdWluY2V5IDxhZHFfZHZiQGxpZHNraWFsZi5uZXQ+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIFM1SDE0MjBfSAorI2RlZmluZSBTNUgxNDIwX0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCitzdHJ1Y3QgczVoMTQyMF9jb25maWcKK3sKKwkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLworCXU4IGRlbW9kX2FkZHJlc3M7CisKKwkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KKwlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOworCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTMyKiBmcmVxb3V0KTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzNWgxNDIwX2F0dGFjaChjb25zdCBzdHJ1Y3QgczVoMTQyMF9jb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisKKyNlbmRpZiAvLyBTNUgxNDIwX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jCmluZGV4IGU2ODEyNjMuLjkyOGFjYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYwpAQCAtNjE3LDcgKzYxNyw3IEBACiAKIAkvKiB3YWl0IGZvciBXR0FHQyBsb2NrICovCiAJc3RhcnR0aW1lID0gamlmZmllczsKLQl0aW1lb3V0ID0gamlmZmllcyArICgyMDAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKIAkJbXNsZWVwKDEwKTsKIAkJaWYgKHN0djAyOTdfcmVhZHJlZyhzdGF0ZSwgMHg0MykgJiAweDA4KQpAQCAtNjI5LDcgKzYyOSw3IEBACiAJbXNsZWVwKDIwKTsKIAogCS8qIHdhaXQgZm9yIGVxdWFsaXNlciBwYXJ0aWFsIGNvbnZlcmdlbmNlICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAoNTAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoMTApOwogCkBAIC02NDIsNyArNjQyLDcgQEAKIAl9CiAKIAkvKiB3YWl0IGZvciBlcXVhbGlzZXIgZnVsbCBjb252ZXJnZW5jZSAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgKGRlbGF5ICogSFopIC8gMTAwMDsKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoMTApOwogCkBAIC02NTksNyArNjU5LDcgQEAKIAlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODgsIDgsIDApOwogCiAJLyogd2FpdCBmb3IgbWFpbiBsb2NrICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAoMjAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CiAJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCW1zbGVlcCgxMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKaW5kZXggMGJlYjM3MC4uYWIwYzAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKQEAgLTQ5LDEwICs0OSw4IEBACiAJLyogcHJpdmF0ZSBkZW1vZCBkYXRhICovCiAJdTggaW5pdGlhbGlzZWQ7CiAJZW51bSB0ZGExMDA0eF9kZW1vZCBkZW1vZF90eXBlOwotCXU4IGZ3X3ZlcnNpb247CiB9OwogCi0KIHN0YXRpYyBpbnQgZGVidWc7CiAjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAogCWRvIHsgXApAQCAtMTIyLDYgKzEyMCw4IEBACiAjZGVmaW5lIFREQTEwMDQ2SF9HUElPX09VVF9TRUwJIDB4NDEKICNkZWZpbmUgVERBMTAwNDZIX0dQSU9fU0VMRUNUCSAweDQyCiAjZGVmaW5lIFREQTEwMDQ2SF9BR0NfQ09ORgkgMHg0MworI2RlZmluZSBUREExMDA0NkhfQUdDX1RIUgkgMHg0NAorI2RlZmluZSBUREExMDA0NkhfQUdDX1JFTk9STQkgMHg0NQogI2RlZmluZSBUREExMDA0NkhfQUdDX0dBSU5TCSAweDQ2CiAjZGVmaW5lIFREQTEwMDQ2SF9BR0NfVFVOX01JTgkgMHg0NwogI2RlZmluZSBUREExMDA0NkhfQUdDX1RVTl9NQVgJIDB4NDgKQEAgLTI3NCwxNCArMjc0LDI2IEBACiAJc3dpdGNoIChiYW5kd2lkdGgpIHsKIAljYXNlIEJBTkRXSURUSF82X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzZtaHosIHNpemVvZihiYW5kd2lkdGhfNm1oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDA5KTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHg0Zik7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJBTkRXSURUSF83X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzdtaHosIHNpemVvZihiYW5kd2lkdGhfN21oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBhKTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHg3OSk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJBTkRXSURUSF84X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzhtaHosIHNpemVvZihiYW5kd2lkdGhfOG1oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBiKTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHhhMyk7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzE1LDIwICszMjcsMzUgQEAKIAkJbWVtY3B5KGJ1ZiArIDEsIG1lbSArIHBvcywgdHhfc2l6ZSk7CiAJCWZ3X21zZy5sZW4gPSB0eF9zaXplICsgMTsKIAkJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmZndfbXNnLCAxKSAhPSAxKSB7Ci0JCQlwcmludGsoInRkYTEwMDR4OiBFcnJvciBkdXJpbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAidGRhMTAwNHg6IEVycm9yIGR1cmluZyBmaXJtd2FyZSB1cGxvYWRcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJcG9zICs9IHR4X3NpemU7CiAKIAkJZHByaW50aygiJXM6IGZ3X3Bvcz0weCV4XG4iLCBfX0ZVTkNUSU9OX18sIHBvcyk7CiAJfQorCS8vIGdpdmUgdGhlIERTUCBhIGNoYW5jZSB0byBzZXR0bGUgMDMvMTAvMDUgSGFjCisJbXNsZWVwKDEwMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RydWN0IHRkYTEwMDR4X3N0YXRlICpzdGF0ZSwgdTggZHNwVmVyc2lvbikKK3N0YXRpYyBpbnQgdGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUpCiB7CiAJdTggZGF0YTEsIGRhdGEyOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWlmIChzdGF0ZS0+ZGVtb2RfdHlwZSA9PSBUREExMDA0WF9ERU1PRF9UREExMDA0NikgeworCQl0aW1lb3V0ID0gamlmZmllcyArIDIgKiBIWjsKKwkJd2hpbGUoISh0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX1NUQVRVU19DRCkgJiAweDIwKSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiB0aW1lb3V0IHdhaXRpbmcgZm9yIERTUCByZWFkeVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltc2xlZXAoMSk7CisJCX0KKwl9IGVsc2UKKwkJbXNsZWVwKDEwMCk7CiAKIAkvLyBjaGVjayB1cGxvYWQgd2FzIE9LCiAJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCAweDEwLCAwKTsgLy8gd2Ugd2FudCB0byByZWFkIGZyb20gdGhlIERTUApAQCAtMzM2LDkgKzM2MywxMSBAQAogCiAJZGF0YTEgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0RTUF9EQVRBMSk7CiAJZGF0YTIgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0RTUF9EQVRBMik7Ci0JaWYgKChkYXRhMSAhPSAweDY3KSB8fCAoZGF0YTIgIT0gZHNwVmVyc2lvbikpCisJaWYgKGRhdGExICE9IDB4NjcgfHwgZGF0YTIgPCAweDIwIHx8IGRhdGEyID4gMHgyZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogZm91bmQgZmlybXdhcmUgcmV2aXNpb24gJXggLS0gaW52YWxpZFxuIiwgZGF0YTIpOwogCQlyZXR1cm4gLUVJTzsKLQorCX0KKwlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogZm91bmQgZmlybXdhcmUgcmV2aXNpb24gJXggLS0gb2tcbiIsIGRhdGEyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ5LDE0ICszNzgsMTQgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCiAJLyogZG9uJ3QgcmUtdXBsb2FkIHVubGVzcyBuZWNlc3NhcnkgKi8KLQlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlLCAweDJjKSA9PSAwKQorCWlmICh0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayB1bnRpbCBzb21lb25lIHVwbG9hZHMgaXQgKi8KLQlwcmludGsoInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQgKCVzKS4uLlxuIiwgVERBMTAwNDVfREVGQVVMVF9GSVJNV0FSRSk7CisJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IHdhaXRpbmcgZm9yIGZpcm13YXJlIHVwbG9hZCAoJXMpLi4uXG4iLCBUREExMDA0NV9ERUZBVUxUX0ZJUk1XQVJFKTsKIAlyZXQgPSBzdGF0ZS0+Y29uZmlnLT5yZXF1ZXN0X2Zpcm13YXJlKGZlLCAmZncsIFREQTEwMDQ1X0RFRkFVTFRfRklSTVdBUkUpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKCJ0ZGExMDA0eDogbm8gZmlybXdhcmUgdXBsb2FkICh0aW1lb3V0IG9yIGZpbGUgbm90IGZvdW5kPylcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zNzAsOTUgKzM5OSw5MyBAQAogCXRkYTEwMDQ1aF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBCQU5EV0lEVEhfOF9NSFopOwogCiAJcmV0ID0gdGRhMTAwNHhfZG9fdXBsb2FkKHN0YXRlLCBmdy0+ZGF0YSwgZnctPnNpemUsIFREQTEwMDQ1SF9GV1BBR0UsIFREQTEwMDQ1SF9DT0RFX0lOKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIHVwbG9hZCBjb21wbGV0ZVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IGZpcm13YXJlIHVwbG9hZCBjb21wbGV0ZVxuIik7CiAKIAkvKiB3YWl0IGZvciBEU1AgdG8gaW5pdGlhbGlzZSAqLwogCS8qIERTUFJFQURZIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIG9uIHRoZSBUREExMDA0NUggKi8KIAltc2xlZXAoMTAwKTsKIAotCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIDB4MmMpOworCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUpOwogfQogCi1zdGF0aWMgaW50IHRkYTEwMDQ2X2dldF9md192ZXJzaW9uKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUsCi0JCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3N0YXRpYyB2b2lkIHRkYTEwMDQ2X2luaXRfcGxscyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQljb25zdCB1bnNpZ25lZCBjaGFyIHBhdHRlcm5bXSA9IHsgMHg2NywgMHgwMCwgMHg1MCwgMHg2MiwgMHg1ZSwgMHgxOCwgMHg2NyB9OwotCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCS8qIGFyZWEgZ3Vlc3NlZCBmcm9tIGZpcm13YXJlIHYyMCwgdjIxIGFuZCB2MjUgKi8KLQlmb3IgKGkgPSAweDY2MDsgaSA8IDB4NzAwOyBpKyspIHsKLQkJaWYgKCFtZW1jbXAoJmZ3LT5kYXRhW2ldLCBwYXR0ZXJuLCBzaXplb2YocGF0dGVybikpKSB7Ci0JCQlzdGF0ZS0+ZndfdmVyc2lvbiA9IGZ3LT5kYXRhW2kgKyBzaXplb2YocGF0dGVybildOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IHVzaW5nIGZpcm13YXJlIHYlMDJ4XG4iLAotCQkJCQlzdGF0ZS0+ZndfdmVyc2lvbik7Ci0JCQlyZXR1cm4gMDsKLQkJfQorCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDEsIDB4ZjApOworCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsgLy8gUExMIE0gPSAxMAorCWlmIChzdGF0ZS0+Y29uZmlnLT54dGFsX2ZyZXEgPT0gVERBMTAwNDZfWFRBTF80TSApIHsKKwkJZHByaW50aygiJXM6IHNldHRpbmcgdXAgUExMcyBmb3IgYSA0IE1IeiBYdGFsXG4iLCBfX0ZVTkNUSU9OX18pOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZQTEwzLCAwKTsgLy8gUExMIFAgPSBOID0gMAorCX0gZWxzZSB7CisJCWRwcmludGsoIiVzOiBzZXR0aW5nIHVwIFBMTHMgZm9yIGEgMTYgTUh6IFh0YWxcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDMsIDMpOyAvLyBQTEwgUCA9IDAsIE4gPSAzCiAJfQotCi0JcmV0dXJuIC1FSU5WQUw7CisJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgOTkpOworCXN3aXRjaCAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSkgeworCWNhc2UgVERBMTAwNDZfRlJFUV8zNjE3OgorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4ZDQpOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4MmMpOworCQlicmVhazsKKwljYXNlIFREQTEwMDQ2X0ZSRVFfMzYxMzoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweGQ0KTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDEzKTsKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9GUkVRXzA0NToKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBiKTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweGEzKTsKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9GUkVRXzA1MjoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBjKTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDA2KTsKKwkJYnJlYWs7CisJfQorCXRkYTEwMDQ2aF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBCQU5EV0lEVEhfOF9NSFopOyAvLyBkZWZhdWx0IGJhbmR3aWR0aCA4IE1IegogfQogCiBzdGF0aWMgaW50IHRkYTEwMDQ2X2Z3dXBsb2FkKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJaW50IHJldDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCiAJLyogcmVzZXQgKyB3YWtlIHVwIGNoaXAgKi8KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDEsIDApOworCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDApOwogCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9DT05GX1RSSVNUQVRFMSwgMSwgMCk7Ci0JbXNsZWVwKDEwMCk7CisJLyogbGV0IHRoZSBjbG9ja3MgcmVjb3ZlciBmcm9tIHNsZWVwICovCisJbXNsZWVwKDUpOwogCiAJLyogZG9uJ3QgcmUtdXBsb2FkIHVubGVzcyBuZWNlc3NhcnkgKi8KLQlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlLCBzdGF0ZS0+ZndfdmVyc2lvbikgPT0gMCkKKwlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCS8qIHJlcXVlc3QgdGhlIGZpcm13YXJlLCB0aGlzIHdpbGwgYmxvY2sgdW50aWwgc29tZW9uZSB1cGxvYWRzIGl0ICovCi0JcHJpbnRrKCJ0ZGExMDA0eDogd2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkICglcykuLi5cbiIsIFREQTEwMDQ2X0RFRkFVTFRfRklSTVdBUkUpOwotCXJldCA9IHN0YXRlLT5jb25maWctPnJlcXVlc3RfZmlybXdhcmUoZmUsICZmdywgVERBMTAwNDZfREVGQVVMVF9GSVJNV0FSRSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKGZ3LT5zaXplIDwgMjQ0NzgpIHsgLyogc2l6ZSBvZiBmaXJtd2FyZSB2MjAsIHdoaWNoIGlzIHRoZSBzbWFsbGVzdCBvZiB2MjAsIHYyMSBhbmQgdjI1ICovCi0JCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIGZpbGUgc2VlbXMgdG8gYmUgdG9vIHNtYWxsICglZCBieXRlcylcbiIsIGZ3LT5zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gdGRhMTAwNDZfZ2V0X2Z3X3ZlcnNpb24oc3RhdGUsIGZ3KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoInRkYTEwMDR4OiB1bmFibGUgdG8gZmluZCBmaXJtd2FyZSB2ZXJzaW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBzZXQgcGFyYW1ldGVycyAqLwotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsKLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZQTEwzLCBzdGF0ZS0+Y29uZmlnLT5uX2kyYyk7Ci0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgOTkpOwotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNCk7Ci0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDJjKTsKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDgsIDgpOyAvLyBnb2luZyB0byBib290IGZyb20gSE9TVAorCXRkYTEwMDQ2X2luaXRfcGxscyhmZSk7CiAKLQlyZXQgPSB0ZGExMDA0eF9kb191cGxvYWQoc3RhdGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSwgVERBMTAwNDZIX0NPREVfQ1BULCBUREExMDA0NkhfQ09ERV9JTik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlwcmludGsoInRkYTEwMDR4OiBmaXJtd2FyZSB1cGxvYWQgY29tcGxldGVcbiIpOwotCi0JLyogd2FpdCBmb3IgRFNQIHRvIGluaXRpYWxpc2UgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIEhaOwotCXdoaWxlICghKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfU1RBVFVTX0NEKSAmIDB4MjApKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcmludGsoInRkYTEwMDR4OiBEU1AgZmFpbGVkIHRvIGluaXRpYWxpc2VkLlxuIik7Ci0JCQlyZXR1cm4gLUVJTzsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+cmVxdWVzdF9maXJtd2FyZSAhPSBOVUxMKSB7CisJCS8qIHJlcXVlc3QgdGhlIGZpcm13YXJlLCB0aGlzIHdpbGwgYmxvY2sgdW50aWwgc29tZW9uZSB1cGxvYWRzIGl0ICovCisJCXByaW50ayhLRVJOX0lORk8gInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQuLi5cbiIpOworCQlyZXQgPSBzdGF0ZS0+Y29uZmlnLT5yZXF1ZXN0X2Zpcm13YXJlKGZlLCAmZncsIFREQTEwMDQ2X0RFRkFVTFRfRklSTVdBUkUpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7CisgICAJICAgCQlyZXR1cm4gcmV0OwogCQl9Ci0JCW1zbGVlcCgxKTsKKwkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCA4LCA4KTsgLy8gZ29pbmcgdG8gYm9vdCBmcm9tIEhPU1QKKwkJcmV0ID0gdGRhMTAwNHhfZG9fdXBsb2FkKHN0YXRlLCBmdy0+ZGF0YSwgZnctPnNpemUsIFREQTEwMDQ2SF9DT0RFX0NQVCwgVERBMTAwNDZIX0NPREVfSU4pOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJLyogYm9vdCBmcm9tIGZpcm13YXJlIGVlcHJvbSAqLworCQkvKiBIYWMgTm90ZTogd2UgbWlnaHQgbmVlZCB0byBkbyBzb21lIEdQSU8gTWFnaWMgaGVyZSAqLworCQlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogYm9vdGluZyBmcm9tIGVlcHJvbVxuIik7CisJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgNCwgNCk7CisJCW1zbGVlcCgzMDApOwogCX0KLQotCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIHN0YXRlLT5md192ZXJzaW9uKTsKKwlyZXR1cm4gdGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlKTsKIH0KIAogc3RhdGljIGludCB0ZGExMDA0eF9lbmNvZGVfZmVjKGludCBmZWMpCkBAIC01NjAsMTIgKzU4NywxMCBAQAogCiAJaWYgKHRkYTEwMDQ2X2Z3dXBsb2FkKGZlKSkgewogCQlwcmludGsoInRkYTEwMDR4OiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDEsIDApOyAvLyB3YWtlIHVwIHRoZSBjaGlwCi0KLQkvLyBJbml0IHRoZSBQTEwKKwkvLyBJbml0IHRoZSB0dW5lciBQTEwKIAlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKIAkJdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CiAJCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKQEAgLTU3NCwzMiArNTk5LDQ0IEBACiAKIAkvLyB0ZGEgc2V0dXAKIAl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDB4MjAsIDApOyAvLyBkaXNhYmxlIERTUCB3YXRjaGRvZyB0aW1lcgotCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDMSwgMHg0MCwgMHg0MCk7Ci0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQVVUTywgOCwgMCk7IC8vIHNlbGVjdCBIUCBzdHJlYW0KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzEsIDB4ODAsIDApOyAvLyBkaXNhYmxlIHB1bHNlIGtpbGxlcgotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsgLy8gUExMIE0gPSAxMAotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDMsIHN0YXRlLT5jb25maWctPm5faTJjKTsgLy8gUExMIFAgPSBOID0gMAotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9PRkZTRVQsIDk5KTsgLy8gRlJFUU9GRlMgPSA5OQotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNCk7IC8vIH0gUEhZMiA9IC0xMTIyMQotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHgyYyk7IC8vIH0KLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAwKTsgLy8gQUdDIHNldHVwCi0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4NjAsIDB4NjApOyAvLyBzZXQgQUdDIHBvbGFyaXRpZXMKKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQVVUTywgNyk7IC8vIHNlbGVjdCBIUCBzdHJlYW0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORkMxLCA4KTsgLy8gZGlzYWJsZSBwdWxzZSBraWxsZXIKKworCXRkYTEwMDQ2X2luaXRfcGxscyhmZSk7CisJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLT5hZ2NfY29uZmlnKSB7CisJY2FzZSBUREExMDA0Nl9BR0NfREVGQVVMVDoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfQ09ORiwgMHgwMCk7IC8vIEFHQyBzZXR1cAorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4NjApOyAvLyBzZXQgQUdDIHBvbGFyaXRpZXMKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9BR0NfSUZPX0FVVE9fTkVHOgorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAweDBhKTsgLy8gQUdDIHNldHVwCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORl9QT0xBUklUWSwgMHg2MCk7IC8vIHNldCBBR0MgcG9sYXJpdGllcworCQlicmVhazsKKwljYXNlIFREQTEwMDQ2X0FHQ19JRk9fQVVUT19QT1M6CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MGEpOyAvLyBBR0Mgc2V0dXAKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDAwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCWJyZWFrOworCWNhc2UgVERBMTAwNDZfQUdDX1REQTgyN1g6CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MDIpOyAgIC8vIEFHQyBzZXR1cAorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19USFIsIDB4NzApOyAgICAvLyBBR0MgVGhyZXNob2xkCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1JFTk9STSwgMHgwRSk7IC8vIEdhaW4gUmVub3JtYWxpemUKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDYwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCWJyZWFrOworCX0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUxLCAweDYxKTsgLy8gVHVybiBib3RoIEFHQyBvdXRwdXRzIG9uCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfVFVOX01JTiwgMCk7CSAgLy8gfQogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1RVTl9NQVgsIDB4ZmYpOyAvLyB9IEFHQyBtaW4vbWF4IHZhbHVlcwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0lGX01JTiwgMCk7CSAgLy8gfQogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0lGX01BWCwgMHhmZik7ICAvLyB9Ci0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0NWQkVSX0NUUkwsIDB4MzAsIDB4MTApOyAvLyAxMF42IFZCRVIgbWVhc3VyZW1lbnQgYml0cwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0dBSU5TLCAxKTsgLy8gSUYgZ2FpbiAyLCBUVU4gZ2FpbiAxCi0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQVVUTywgMHg4MCwgMCk7IC8vIGNyeXN0YWwgaXMgNTBwcG0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NWQkVSX0NUUkwsIDB4MWEpOyAvLyAxMF42IFZCRVIgbWVhc3VyZW1lbnQgYml0cwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9DT05GX1RTMSwgNyk7IC8vIE1QRUcyIGludGVyZmFjZSBjb25maWcKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GX1RTMiwgMHgzMSwgMCk7IC8vIE1QRUcyIGludGVyZmFjZSBjb25maWcKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0NkhfQ09ORl9UUklTVEFURTEsIDB4OWUsIDApOyAvLyBkaXNhYmxlIEFHQ19UVU4KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORl9UUzIsIDB4YzApOyAvLyBNUEVHMiBpbnRlcmZhY2UgY29uZmlnCisJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgMHgzYSwgMHg4MCwgc3RhdGUtPmNvbmZpZy0+aW52ZXJ0X29jbGsgPDwgNyk7CisKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUyLCAweGUxKTsgLy8gdHJpc3RhdGUgc2V0dXAKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0dQSU9fT1VUX1NFTCwgMHhjYyk7IC8vIEdQSU8gb3V0cHV0IGNvbmZpZwotCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9HUElPX1NFTEVDVCwgOCwgOCk7IC8vIEdQSU8gc2VsZWN0Ci0JdGRhMTAwNDZoX3NldF9iYW5kd2lkdGgoc3RhdGUsIEJBTkRXSURUSF84X01IWik7IC8vIGRlZmF1bHQgYmFuZHdpZHRoIDggTUh6Ci0KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCAweDNhLCAweDgwLCBzdGF0ZS0+Y29uZmlnLT5pbnZlcnRfb2NsayA8PCA3KTsKKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0dQSU9fU0VMRUNULCA4KTsgLy8gR1BJTyBzZWxlY3QKIAogCXN0YXRlLT5pbml0aWFsaXNlZCA9IDE7CiAJcmV0dXJuIDA7CkBAIC02MjksOSArNjY2LDYgQEAKIAlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBmZV9wYXJhbXMpOwogCXRkYTEwMDR4X2Rpc2FibGVfdHVuZXJfaTJjKHN0YXRlKTsKIAotCWlmIChzdGF0ZS0+ZGVtb2RfdHlwZSA9PSBUREExMDA0WF9ERU1PRF9UREExMDA0NikKLQkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCA0LCA0KTsKLQogCS8vIEhhcmRjb2RlZCB0byB1c2UgYXV0byBhcyBtdWNoIGFzIHBvc3NpYmxlIG9uIHRoZSBUREExMDA0NSBhcyBpdAogCS8vIGlzIHZlcnkgdW5yZWxpYWJsZSBpZiBBVVRPIG1vZGUgaXMgX25vdF8gdXNlZC4KIAlpZiAoc3RhdGUtPmRlbW9kX3R5cGUgPT0gVERBMTAwNFhfREVNT0RfVERBMTAwNDUpIHsKQEAgLTEwODksNiArMTEyMywxMSBAQAogCQlicmVhazsKIAogCWNhc2UgVERBMTAwNFhfREVNT0RfVERBMTAwNDY6CisJCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXAgIT0gTlVMTCkgeworCQkJdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CisJCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXAoZmUpOworCQkJdGRhMTAwNHhfZGlzYWJsZV90dW5lcl9pMmMoc3RhdGUpOworCQl9CiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgMSwgMSk7CiAJCWJyZWFrOwogCX0KQEAgLTExMDAsOCArMTEzOSw5IEBACiBzdGF0aWMgaW50IHRkYTEwMDR4X2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCiB7CiAJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gODAwOwotCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDE2NjY2NzsKLQlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAxNjY2NjcqMjsKKwkvKiBEcmlmdCBjb21wZW5zYXRpb24gbWFrZXMgbm8gc2Vuc2UgZm9yIERWQi1UICovCisJZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMDsKKwlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC0xMjE2LDcgKzEyNTYsNiBAQAogCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDQ2X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKIAlzdGF0ZS0+ZGVtb2RfdHlwZSA9IFREQTEwMDRYX0RFTU9EX1REQTEwMDQ2OwotCXN0YXRlLT5md192ZXJzaW9uID0gMHgyMDsJLyogZHVtbXkgZGVmYXVsdCB2YWx1ZSAqLwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0hJUElEKSAhPSAweDQ2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCmluZGV4IGM4ZTFkNTQuLjg2NTljNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCkBAIC0yNiw2ICsyNiwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKK2VudW0gdGRhMTAwNDZfeHRhbCB7CisJVERBMTAwNDZfWFRBTF80TSwKKwlUREExMDA0Nl9YVEFMXzE2TSwKK307CisKK2VudW0gdGRhMTAwNDZfYWdjIHsKKwlUREExMDA0Nl9BR0NfREVGQVVMVCwJCS8qIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gKi8KKwlUREExMDA0Nl9BR0NfSUZPX0FVVE9fTkVHLAkvKiBJRiBBR0Mgb25seSwgYXV0b21hdGljLCBuZWd0aXZlICovCisJVERBMTAwNDZfQUdDX0lGT19BVVRPX1BPUywJLyogSUYgQUdDIG9ubHksIGF1dG9tYXRpYywgcG9zaXRpdmUgKi8KKwlUREExMDA0Nl9BR0NfVERBODI3WCwJICAgIC8qIElGIEFHQyBvbmx5LCBzcGVjaWFsIHNldHVwIGZvciB0ZGE4Mjd4ICovCit9OworCitlbnVtIHRkYTEwMDQ2X2lmIHsKKwlUREExMDA0Nl9GUkVRXzM2MTcsCQkvKiBvcmlnaW5hbCBjb25maWcsIDM2LDE2NiBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzM2MTMsCQkvKiAzNiwxMyBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzA0NSwJCS8qIGxvdyBJRiwgNC4wLCA0LjUsIG9yIDUuMCBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzA1MiwJCS8qIGxvdyBJRiwgNS4xNjY3IE1IWiBmb3IgdGRhOTg4OSAqLworfTsKKwogc3RydWN0IHRkYTEwMDR4X2NvbmZpZwogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCkBAIC0zNywxNCArNTYsMjIgQEAKIAkvKiBEb2VzIHRoZSBPQ0xLIHNpZ25hbCBuZWVkIGludmVydGVkPyAqLwogCXU4IGludmVydF9vY2xrOwogCi0JLyogdmFsdWUgb2YgTl9JMkMgb2YgdGhlIENPTkZfUExMMyByZWdpc3RlciAqLwotCXU4IG5faTJjOworCS8qIFh0YWwgZnJlcXVlbmN5LCA0IG9yIDE2TUh6Ki8KKwllbnVtIHRkYTEwMDQ2X3h0YWwgeHRhbF9mcmVxOworCisJLyogSUYgZnJlcXVlbmN5ICovCisJZW51bSB0ZGExMDA0Nl9pZiBpZl9mcmVxOworCisJLyogQUdDIGNvbmZpZ3VyYXRpb24gKi8KKwllbnVtIHRkYTEwMDQ2X2FnYyBhZ2NfY29uZmlnOwogCiAJLyogUExMIG1haW50ZW5hbmNlICovCiAJaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKKwl2b2lkICgqcGxsX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiAJaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIAogCS8qIHJlcXVlc3QgZmlybXdhcmUgZm9yIGRldmljZSAqLworCS8qIHNldCB0aGlzIHRvIE5VTEwgaWYgdGhlIGNhcmQgaGFzIGEgZmlybXdhcmUgRUVQUk9NICovCiAJaW50ICgqcmVxdWVzdF9maXJtd2FyZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MHh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODB4eC5jCmluZGV4IDAzMmQzNDguLjg4ZTEyNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgweHguYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyODQyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnCkBAIC0wLDAgKzEsMTYgQEAKK2NvbmZpZyBEVkJfUExVVE8yCisJdHJpc3RhdGUgIlBsdXRvMiBjYXJkcyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQorCXNlbGVjdCBJMkMKKwlzZWxlY3QgSTJDX0FMR09CSVQKKwlzZWxlY3QgRFZCX1REQTEwMDRYCisJaGVscAorCSAgU3VwcG9ydCBmb3IgUENJIGNhcmRzIGJhc2VkIG9uIHRoZSBQbHV0bzIgRlBHQSBsaWtlIHRoZSBTYXRlbGNvCisJICBFYXN5d2F0Y2ggTW9iaWxlIFRlcnJlc3RyaWFsIERWQi1UIFJlY2VpdmVyLgorCisgICAgICAgICAgU2luY2UgdGhlc2UgY2FyZHMgaGF2ZSBubyBNUEVHIGRlY29kZXIgb25ib2FyZCwgdGhleSB0cmFuc21pdAorCSAgb25seSBjb21wcmVzc2VkIE1QRUcgZGF0YSBvdmVyIHRoZSBQQ0kgYnVzLCBzbyB5b3UgbmVlZAorCSAgYW4gZXh0ZXJuYWwgc29mdHdhcmUgZGVjb2RlciB0byB3YXRjaCBUViBvbiB5b3VyIGNvbXB1dGVyLgorCisJICBTYXkgWSBvciBNIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNhODRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX0RWQl9QTFVUTzIpID0gcGx1dG8yLm8KKworRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZTBiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYwpAQCAtMCwwICsxLDgwOSBAQAorLyoKKyAqIHBsdXRvMi5jIC0gU2F0ZWxjbyBFYXN5d2F0Y2ggTW9iaWxlIFRlcnJlc3RyaWFsIFJlY2VpdmVyIFtEVkItVF0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW5kcmVhcyBPYmVycml0dGVyIDxvYmlAbGludXh0di5vcmc+CisgKgorICogYmFzZWQgb24gcGx1dG8yLmMgMS4xMCAtIGh0dHA6Ly9pbnN0aW5jdC13cDgubm8taXAub3JnL3BsdXRvLworICogCWJ5IERhbnkgU2FsbWFuIDxzYWxtYW5kYW55QHlhaG9vLmZyPgorICoJQ29weXJpZ2h0IChjKSAyMDA0IFRERgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJkZW11eC5oIgorI2luY2x1ZGUgImRteGRldi5oIgorI2luY2x1ZGUgImR2Yl9kZW11eC5oIgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImR2Yl9uZXQuaCIKKyNpbmNsdWRlICJkdmJkZXYuaCIKKyNpbmNsdWRlICJ0ZGExMDA0eC5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkicGx1dG8yIgorCisjZGVmaW5lIFJFR19QSURuKG4pCQkoKG4pIDw8IDIpCS8qIFBJRCBuIHBhdHRlcm4gcmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR19QQ0FSCQkweDAwMjAJCS8qIFBDIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1RTQ1IJCTB4MDAyNAkJLyogVFMgY3RybCAmIHN0YXR1cyAqLworI2RlZmluZSBSRUdfTUlTQwkJMHgwMDI4CQkvKiBtaXNjZWxsYW5lb3VzICovCisjZGVmaW5lIFJFR19NTUFDCQkweDAwMmMJCS8qIE1TQiBNQUMgYWRkcmVzcyAqLworI2RlZmluZSBSRUdfSU1BQwkJMHgwMDMwCQkvKiBJU0IgTUFDIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkVHX0xNQUMJCTB4MDAzNAkJLyogTFNCIE1BQyBhZGRyZXNzICovCisjZGVmaW5lIFJFR19TUElECQkweDAwMzgJCS8qIFNQSSBkYXRhICovCisjZGVmaW5lIFJFR19TTENTCQkweDAwM2MJCS8qIHNlcmlhbCBsaW5rcyBjdHJsL3N0YXR1cyAqLworCisjZGVmaW5lIFBJRDBfTk9GSUwJCSgweDAwMDEgPDwgMTYpCisjZGVmaW5lIFBJRG5fRU5QCQkoMHgwMDAxIDw8IDE1KQorI2RlZmluZSBQSUQwX0VORAkJKDB4MDAwMSA8PCAxNCkKKyNkZWZpbmUgUElEMF9BRklMCQkoMHgwMDAxIDw8IDEzKQorI2RlZmluZSBQSURuX1BJRAkJKDB4MWZmZiA8PCAgMCkKKworI2RlZmluZSBUU0NSX05CUEFDS0VUUwkJKDB4MDBmZiA8PCAyNCkKKyNkZWZpbmUgVFNDUl9ERU0JCSgweDAwMDEgPDwgMTcpCisjZGVmaW5lIFRTQ1JfREUJCQkoMHgwMDAxIDw8IDE2KQorI2RlZmluZSBUU0NSX1JTVE4JCSgweDAwMDEgPDwgMTUpCisjZGVmaW5lIFRTQ1JfTVNLTwkJKDB4MDAwMSA8PCAxNCkKKyNkZWZpbmUgVFNDUl9NU0tBCQkoMHgwMDAxIDw8IDEzKQorI2RlZmluZSBUU0NSX01TS0wJCSgweDAwMDEgPDwgMTIpCisjZGVmaW5lIFRTQ1JfT1ZSCQkoMHgwMDAxIDw8IDExKQorI2RlZmluZSBUU0NSX0FGVUwJCSgweDAwMDEgPDwgMTApCisjZGVmaW5lIFRTQ1JfTE9DSwkJKDB4MDAwMSA8PCAgOSkKKyNkZWZpbmUgVFNDUl9JQUNLCQkoMHgwMDAxIDw8ICA4KQorI2RlZmluZSBUU0NSX0FERUYJCSgweDAwN2YgPDwgIDApCisKKyNkZWZpbmUgTUlTQ19EVlIJCSgweDBmZmYgPDwgIDQpCisjZGVmaW5lIE1JU0NfQUxFRAkJKDB4MDAwMSA8PCAgMykKKyNkZWZpbmUgTUlTQ19GUlNUCQkoMHgwMDAxIDw8ICAyKQorI2RlZmluZSBNSVNDX0xFRDEJCSgweDAwMDEgPDwgIDEpCisjZGVmaW5lIE1JU0NfTEVEMAkJKDB4MDAwMSA8PCAgMCkKKworI2RlZmluZSBTUElEX1NQSURSCQkoMHgwMGZmIDw8ICAwKQorCisjZGVmaW5lIFNMQ1NfU0NMCQkoMHgwMDAxIDw8ICA3KQorI2RlZmluZSBTTENTX1NEQQkJKDB4MDAwMSA8PCAgNikKKyNkZWZpbmUgU0xDU19DU04JCSgweDAwMDEgPDwgIDIpCisjZGVmaW5lIFNMQ1NfT1ZSCQkoMHgwMDAxIDw8ICAxKQorI2RlZmluZSBTTENTX1NXQwkJKDB4MDAwMSA8PCAgMCkKKworI2RlZmluZSBUU19ETUFfUEFDS0VUUwkJKDgpCisjZGVmaW5lIFRTX0RNQV9CWVRFUwkJKDE4OCAqIFRTX0RNQV9QQUNLRVRTKQorCisjZGVmaW5lIEkyQ19BRERSX1REQTEwMDQ2CTB4MTAKKyNkZWZpbmUgSTJDX0FERFJfVFVBNjAzNAkweGMyCisjZGVmaW5lIE5IV0ZJTFRFUlMJCTgKKworc3RydWN0IHBsdXRvIHsKKwkvKiBwY2kgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1OCBfX2lvbWVtICppb19tZW07CisKKwkvKiBkdmIgKi8KKwlzdHJ1Y3QgZG14X2Zyb250ZW5kIGh3X2Zyb250ZW5kOworCXN0cnVjdCBkbXhfZnJvbnRlbmQgbWVtX2Zyb250ZW5kOworCXN0cnVjdCBkbXhkZXYgZG14ZGV2OworCXN0cnVjdCBkdmJfYWRhcHRlciBkdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2RlbXV4IGRlbXV4OworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCXN0cnVjdCBkdmJfbmV0IGR2Ym5ldDsKKwl1bnNpZ25lZCBpbnQgZnVsbF90c191c2VyczsKKwl1bnNpZ25lZCBpbnQgdXNlcnM7CisKKwkvKiBpMmMgKi8KKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgaTJjX2JpdDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXA7CisJdW5zaWduZWQgaW50IGkyY2J1ZzsKKworCS8qIGlycSAqLworCXVuc2lnbmVkIGludCBvdmVyZmxvdzsKKworCS8qIGRtYSAqLworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTggZG1hX2J1ZltUU19ETUFfQllURVNdOworCXU4IGR1bW15WzQwOTZdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGx1dG8gKmZlZWRfdG9fcGx1dG8oc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQoreworCXJldHVybiBjb250YWluZXJfb2YoZmVlZC0+ZGVtdXgsIHN0cnVjdCBwbHV0bywgZGVtdXgpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbHV0byAqZnJvbnRlbmRfdG9fcGx1dG8oc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmZS0+ZHZiLCBzdHJ1Y3QgcGx1dG8sIGR2Yl9hZGFwdGVyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcGx1dG9fcmVhZHJlZyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1MzIgcmVnKQoreworCXJldHVybiByZWFkbCgmcGx1dG8tPmlvX21lbVtyZWddKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBsdXRvX3dyaXRlcmVnKHN0cnVjdCBwbHV0byAqcGx1dG8sIHUzMiByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgJnBsdXRvLT5pb19tZW1bcmVnXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbHV0b19ydyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1MzIgcmVnLCB1MzIgbWFzaywgdTMyIGJpdHMpCit7CisJdTMyIHZhbCA9IHJlYWRsKCZwbHV0by0+aW9fbWVtW3JlZ10pOworCXZhbCAmPSB+bWFzazsKKwl2YWwgfD0gYml0czsKKwl3cml0ZWwodmFsLCAmcGx1dG8tPmlvX21lbVtyZWddKTsKK30KKworc3RhdGljIHZvaWQgcGx1dG9fc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZGF0YTsKKworCWlmIChzdGF0ZSkKKwkJcGx1dG9fcncocGx1dG8sIFJFR19TTENTLCBTTENTX1NEQSwgU0xDU19TREEpOworCWVsc2UKKwkJcGx1dG9fcncocGx1dG8sIFJFR19TTENTLCBTTENTX1NEQSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlpZiAoc3RhdGUpCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfU0xDUywgU0xDU19TQ0wsIFNMQ1NfU0NMKTsKKwllbHNlCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfU0xDUywgU0xDU19TQ0wsIDApOworCisJLyogdHJ5IHRvIGRldGVjdCBpMmNfaW5iKCkgdG8gd29ya2Fyb3VuZCBoYXJkd2FyZSBidWc6CisJICogcmVzZXQgU0RBIHRvIGhpZ2ggYWZ0ZXIgU0NMIGhhcyBiZWVuIHNldCB0byBsb3cgKi8KKwlpZiAoKHN0YXRlKSAmJiAocGx1dG8tPmkyY2J1ZyA9PSAwKSkgeworCQlwbHV0by0+aTJjYnVnID0gMTsKKwl9IGVsc2UgeworCQlpZiAoKCFzdGF0ZSkgJiYgKHBsdXRvLT5pMmNidWcgPT0gMSkpCisJCQlwbHV0b19zZXRzZGEocGx1dG8sIDEpOworCQlwbHV0by0+aTJjYnVnID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlyZXR1cm4gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1NMQ1MpICYgU0xDU19TREE7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlyZXR1cm4gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1NMQ1MpICYgU0xDU19TQ0w7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX3Jlc2V0X2Zyb250ZW5kKHN0cnVjdCBwbHV0byAqcGx1dG8sIGludCByZWVuYWJsZSkKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX01JU0MpOworCisJaWYgKHZhbCAmIE1JU0NfRlJTVCkgeworCQl2YWwgJj0gfk1JU0NfRlJTVDsKKwkJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19NSVNDLCB2YWwpOworCX0KKwlpZiAocmVlbmFibGUpIHsKKwkJdmFsIHw9IE1JU0NfRlJTVDsKKwkJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19NSVNDLCB2YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgcGx1dG9fcmVzZXRfdHMoc3RydWN0IHBsdXRvICpwbHV0bywgaW50IHJlZW5hYmxlKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfVFNDUik7CisKKwlpZiAodmFsICYgVFNDUl9SU1ROKSB7CisJCXZhbCAmPSB+VFNDUl9SU1ROOworCQlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7CisJfQorCWlmIChyZWVuYWJsZSkgeworCQl2YWwgfD0gVFNDUl9SU1ROOworCQlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbHV0b19zZXRfZG1hX2FkZHIoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1BDQVIsIGNwdV90b19sZTMyKHBsdXRvLT5kbWFfYWRkcikpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbHV0b19kbWFfbWFwKHN0cnVjdCBwbHV0byAqcGx1dG8pCit7CisJcGx1dG8tPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUocGx1dG8tPnBkZXYsIHBsdXRvLT5kbWFfYnVmLAorCQkJVFNfRE1BX0JZVEVTLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJcmV0dXJuIHBjaV9kbWFfbWFwcGluZ19lcnJvcihwbHV0by0+ZG1hX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBwbHV0b19kbWFfdW5tYXAoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwY2lfdW5tYXBfc2luZ2xlKHBsdXRvLT5wZGV2LCBwbHV0by0+ZG1hX2FkZHIsCisJCQlUU19ETUFfQllURVMsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmYpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGZlZWRfdG9fcGx1dG8oZik7CisKKwkvKiBlbmFibGUgUElEIGZpbHRlcmluZyAqLworCWlmIChwbHV0by0+dXNlcnMrKyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfQUZJTCB8IFBJRDBfTk9GSUwsIDApOworCisJaWYgKChmLT5waWQgPCAweDIwMDApICYmIChmLT5pbmRleCA8IE5IV0ZJTFRFUlMpKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oZi0+aW5kZXgpLCBQSURuX0VOUCB8IFBJRG5fUElELCBQSURuX0VOUCB8IGYtPnBpZCk7CisJZWxzZSBpZiAocGx1dG8tPmZ1bGxfdHNfdXNlcnMrKyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfTk9GSUwsIFBJRDBfTk9GSUwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZikKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZmVlZF90b19wbHV0byhmKTsKKworCS8qIGRpc2FibGUgUElEIGZpbHRlcmluZyAqLworCWlmICgtLXBsdXRvLT51c2VycyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfQUZJTCwgUElEMF9BRklMKTsKKworCWlmICgoZi0+cGlkIDwgMHgyMDAwKSAmJiAoZi0+aW5kZXggPCBOSFdGSUxURVJTKSkKKwkJcGx1dG9fcncocGx1dG8sIFJFR19QSURuKGYtPmluZGV4KSwgUElEbl9FTlAgfCBQSURuX1BJRCwgMHgxZmZmKTsKKwllbHNlIGlmICgtLXBsdXRvLT5mdWxsX3RzX3VzZXJzID09IDApCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfUElEbigwKSwgUElEMF9OT0ZJTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGx1dG9fZG1hX2VuZChzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1bnNpZ25lZCBpbnQgbmJwYWNrZXRzKQoreworCS8qIHN5bmNocm9uaXplIHRoZSBETUEgdHJhbnNmZXIgd2l0aCB0aGUgQ1BVCisJICogZmlyc3Qgc28gdGhhdCB3ZSBzZWUgdXBkYXRlZCBjb250ZW50cy4gKi8KKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocGx1dG8tPnBkZXYsIHBsdXRvLT5kbWFfYWRkciwKKwkJCVRTX0RNQV9CWVRFUywgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qIFdvcmthcm91bmQgZm9yIGJyb2tlbiBoYXJkd2FyZToKKwkgKiBbMV0gT24gc3RhcnR1cCBOQlBBQ0tFVFMgc2VlbXMgdG8gY29udGFpbiBhbiB1bmluaXRpYWxpemVkIHZhbHVlLAorCSAqICAgICBidXQgbm8gcGFja2V0cyBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KKwkgKiBbMl0gU29tZXRpbWVzIChhY3R1YWxseSB2ZXJ5IG9mdGVuKSBOQlBBQ0tFVFMgc3RheXMgYXQgemVybworCSAqICAgICBhbHRob3VnaCBvbmUgcGFja2V0IGhhcyBiZWVuIHRyYW5zZmVyZWQuCisJICovCisJaWYgKChuYnBhY2tldHMgPT0gMCkgfHwgKG5icGFja2V0cyA+IFRTX0RNQV9QQUNLRVRTKSkgeworCQl1bnNpZ25lZCBpbnQgaSA9IDAsIHZhbGlkOworCQl3aGlsZSAocGx1dG8tPmRtYV9idWZbaV0gPT0gMHg0NykKKwkJCWkgKz0gMTg4OworCQl2YWxpZCA9IGkgLyAxODg7CisJCWlmIChuYnBhY2tldHMgIT0gdmFsaWQpIHsKKwkJCWRldl9lcnIoJnBsdXRvLT5wZGV2LT5kZXYsICJuYnBhY2tldHM9JXUgdmFsaWQ9JXVcbiIsCisJCQkJCW5icGFja2V0cywgdmFsaWQpOworCQkJbmJwYWNrZXRzID0gdmFsaWQ7CisJCX0KKwl9CisKKwlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoJnBsdXRvLT5kZW11eCwgcGx1dG8tPmRtYV9idWYsIG5icGFja2V0cyk7CisKKwkvKiBjbGVhciB0aGUgZG1hIGJ1ZmZlci4gdGhpcyBpcyBuZWVkZWQgdG8gYmUgYWJsZSB0byBpZGVudGlmeQorCSAqIG5ldyB2YWxpZCB0cyBwYWNrZXRzIGFib3ZlICovCisJbWVtc2V0KHBsdXRvLT5kbWFfYnVmLCAwLCBuYnBhY2tldHMgKiAxODgpOworCisJLyogcmVzZXQgdGhlIGRtYSBhZGRyZXNzICovCisJcGx1dG9fc2V0X2RtYV9hZGRyKHBsdXRvKTsKKworCS8qIHN5bmMgdGhlIGJ1ZmZlciBhbmQgZ2l2ZSBpdCBiYWNrIHRvIHRoZSBjYXJkICovCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBsdXRvLT5wZGV2LCBwbHV0by0+ZG1hX2FkZHIsCisJCQlUU19ETUFfQllURVMsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwbHV0b19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZGV2X2lkOworCXUzMiB0c2NyOworCisJLyogY2hlY2sgd2hldGhlciBhbiBpbnRlcnJ1cHQgb2NjdXJlZCBvbiB0aGlzIGRldmljZSAqLworCXRzY3IgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfVFNDUik7CisJaWYgKCEodHNjciAmIChUU0NSX0RFIHwgVFNDUl9PVlIpKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKHRzY3IgPT0gMHhmZmZmZmZmZikgeworCQkvLyBGSVhNRTogbWF5YmUgcmVjb3ZlciBzb21laG93CisJCWRldl9lcnIoJnBsdXRvLT5wZGV2LT5kZXYsICJjYXJkIGh1bmcgdXAgOihcbiIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogZG1hIGVuZCBpbnRlcnJ1cHQgKi8KKwlpZiAodHNjciAmIFRTQ1JfREUpIHsKKwkJcGx1dG9fZG1hX2VuZChwbHV0bywgKHRzY3IgJiBUU0NSX05CUEFDS0VUUykgPj4gMjQpOworCQkvKiBvdmVyZmxvdyBpbnRlcnJ1cHQgKi8KKwkJaWYgKHRzY3IgJiBUU0NSX09WUikKKwkJCXBsdXRvLT5vdmVyZmxvdysrOworCQlpZiAocGx1dG8tPm92ZXJmbG93KSB7CisJCQlkZXZfZXJyKCZwbHV0by0+cGRldi0+ZGV2LCAib3ZlcmZsb3cgaXJxICglZClcbiIsCisJCQkJCXBsdXRvLT5vdmVyZmxvdyk7CisJCQlwbHV0b19yZXNldF90cyhwbHV0bywgMSk7CisJCQlwbHV0by0+b3ZlcmZsb3cgPSAwOworCQl9CisJfSBlbHNlIGlmICh0c2NyICYgVFNDUl9PVlIpIHsKKwkJcGx1dG8tPm92ZXJmbG93Kys7CisJfQorCisJLyogQUNLIHRoZSBpbnRlcnJ1cHQgKi8KKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHRzY3IgfCBUU0NSX0lBQ0spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGx1dG9fZW5hYmxlX2lycXMoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1RTQ1IpOworCisJLyogc2V0IHRoZSBudW1iZXIgb2YgcGFja2V0cyAqLworCXZhbCAmPSB+VFNDUl9BREVGOworCXZhbCB8PSBUU19ETUFfUEFDS0VUUyAvIDI7CisJLyogZGlzYWJsZSBBRlVMIGFuZCBMT0NLIGludGVycnVwdHMgKi8KKwl2YWwgfD0gKFRTQ1JfTVNLQSB8IFRTQ1JfTVNLTCk7CisJLyogZW5hYmxlIERNQSBhbmQgT1ZFUkZMT1cgaW50ZXJydXB0cyAqLworCXZhbCAmPSB+KFRTQ1JfREVNIHwgVFNDUl9NU0tPKTsKKwkvKiBjbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwl2YWwgfD0gVFNDUl9JQUNLOworCisJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19UU0NSLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBwbHV0b19kaXNhYmxlX2lycXMoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1RTQ1IpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCXZhbCB8PSAoVFNDUl9ERU0gfCBUU0NSX01TS08gfCBUU0NSX01TS0EgfCBUU0NSX01TS0wpOworCS8qIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXZhbCB8PSBUU0NSX0lBQ0s7CisKKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBsdXRvX2h3X2luaXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwbHV0b19yZXNldF9mcm9udGVuZChwbHV0bywgMSk7CisKKwkvKiBzZXQgYXV0b21hdGljIExFRCBjb250cm9sIGJ5IEZQR0EgKi8KKwlwbHV0b19ydyhwbHV0bywgUkVHX01JU0MsIE1JU0NfQUxFRCwgTUlTQ19BTEVEKTsKKworCS8qIHNldCBkYXRhIGVuZGlhbmVzcyAqLworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXBsdXRvX3J3KHBsdXRvLCBSRUdfUElEbigwKSwgUElEMF9FTkQsIFBJRDBfRU5EKTsKKyNlbHNlCisJcGx1dG9fcncocGx1dG8sIFJFR19QSURuKDApLCBQSUQwX0VORCwgMCk7CisjZW5kaWYKKwkvKiBtYXAgRE1BIGFuZCBzZXQgYWRkcmVzcyAqLworCXBsdXRvX2RtYV9tYXAocGx1dG8pOworCXBsdXRvX3NldF9kbWFfYWRkcihwbHV0byk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXBsdXRvX2VuYWJsZV9pcnFzKHBsdXRvKTsKKworCS8qIHJlc2V0IFRTIGxvZ2ljICovCisJcGx1dG9fcmVzZXRfdHMocGx1dG8sIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX2h3X2V4aXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlwbHV0b19kaXNhYmxlX2lycXMocGx1dG8pOworCisJcGx1dG9fcmVzZXRfdHMocGx1dG8sIDApOworCisJLyogTEVEOiBkaXNhYmxlIGF1dG9tYXRpYyBjb250cm9sLCBlbmFibGUgeWVsbG93LCBkaXNhYmxlIGdyZWVuICovCisJcGx1dG9fcncocGx1dG8sIFJFR19NSVNDLCBNSVNDX0FMRUQgfCBNSVNDX0xFRDEgfCBNSVNDX0xFRDAsIE1JU0NfTEVEMSk7CisKKwkvKiB1bm1hcCBETUEgKi8KKwlwbHV0b19kbWFfdW5tYXAocGx1dG8pOworCisJcGx1dG9fcmVzZXRfZnJvbnRlbmQocGx1dG8sIDApOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBkaXZpZGUodTMyIG51bWVyYXRvciwgdTMyIGRlbm9taW5hdG9yKQoreworCWlmIChkZW5vbWluYXRvciA9PSAwKQorCQlyZXR1cm4gfjA7CisKKwlyZXR1cm4gKG51bWVyYXRvciArIGRlbm9taW5hdG9yIC8gMikgLyBkZW5vbWluYXRvcjsKK30KKworLyogTEcgSW5ub3RlayBURFRFLUUwMDFQIChJbmZpbmVvbiBUVUE2MDM0KSAqLworc3RhdGljIGludCBsZ190ZHRwZTAwMXBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGZyb250ZW5kX3RvX3BsdXRvKGZlKTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJaW50IHJldDsKKwl1OCBidWZbNF07CisJdTMyIGRpdjsKKworCS8vIEZyZWYgPSAxNjYuNjY3IEh6CisJLy8gRnJlZiAqIDMgPSA1MDAuMDAwIEh6CisJLy8gSUYgPSAzNjE2NjY2NworCS8vIElGIC8gRnJlZiA9IDIxNworCS8vZGl2ID0gZGl2aWRlKHAtPmZyZXF1ZW5jeSArIDM2MTY2NjY3LCAxNjY2NjcpOworCWRpdiA9IGRpdmlkZShwLT5mcmVxdWVuY3kgKiAzLCA1MDAwMDApICsgMjE3OworCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOworCWJ1ZlsxXSA9IChkaXYgPj4gMCkgJiAweGZmOworCisJaWYgKHAtPmZyZXF1ZW5jeSA8IDYxMTAwMDAwMCkKKwkJYnVmWzJdID0gMHhiNDsKKwllbHNlIGlmIChwLT5mcmVxdWVuY3kgPCA4MTEwMDAwMDApCisJCWJ1ZlsyXSA9IDB4YmM7CisJZWxzZQorCQlidWZbMl0gPSAweGY0OworCisJLy8gVkhGOiAxNzQtMjMwIE1IegorCS8vIGNlbnRlcjogMzUwIE1IegorCS8vIFVIRjogNDcwLTg2MiBNSHoKKwlpZiAocC0+ZnJlcXVlbmN5IDwgMzUwMDAwMDAwKQorCQlidWZbM10gPSAweDAyOworCWVsc2UKKwkJYnVmWzNdID0gMHgwNDsKKworCWlmIChwLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikKKwkJYnVmWzNdIHw9IDB4MDg7CisKKwlpZiAoc2l6ZW9mKGJ1ZikgPT0gNikgeworCQlidWZbNF0gPSBidWZbMl07CisJCWJ1Zls0XSAmPSB+MHgxYzsKKwkJYnVmWzRdIHw9ICAweDE4OworCisJCWJ1Zls1XSA9ICgwIDw8IDcpIHwgKDIgPDwgNCk7CisJfQorCisJbXNnLmFkZHIgPSBJMkNfQUREUl9UVUE2MDM0ID4+IDE7CisJbXNnLmZsYWdzID0gMDsKKwltc2cuYnVmID0gYnVmOworCW1zZy5sZW4gPSBzaXplb2YoYnVmKTsKKworCXJldCA9IGkyY190cmFuc2ZlcigmcGx1dG8tPmkyY19hZGFwLCAmbXNnLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlIGlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbHV0bzJfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZnJvbnRlbmRfdG9fcGx1dG8oZmUpOworCisJcmV0dXJuIHJlcXVlc3RfZmlybXdhcmUoZncsIG5hbWUsICZwbHV0by0+cGRldi0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGx1dG8yX2ZlX2NvbmZpZyBfX2RldmluaXRkYXRhID0geworCS5kZW1vZF9hZGRyZXNzID0gSTJDX0FERFJfVERBMTAwNDYgPj4gMSwKKwkuaW52ZXJ0ID0gMSwKKwkuaW52ZXJ0X29jbGsgPSAwLAorCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAorCS5pZl9mcmVxID0gVERBMTAwNDZfRlJFUV8zNjE3LAorCS5wbGxfc2V0ID0gbGdfdGR0cGUwMDFwX3BsbF9zZXQsCisJLnBsbF9zbGVlcCA9IE5VTEwsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwbHV0bzJfcmVxdWVzdF9maXJtd2FyZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZyb250ZW5kX2luaXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlpbnQgcmV0OworCisJcGx1dG8tPmZlID0gdGRhMTAwNDZfYXR0YWNoKCZwbHV0bzJfZmVfY29uZmlnLCAmcGx1dG8tPmkyY19hZGFwKTsKKwlpZiAoIXBsdXRvLT5mZSkgeworCQlkZXZfZXJyKCZwbHV0by0+cGRldi0+ZGV2LCAiY291bGQgbm90IGF0dGFjaCBmcm9udGVuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmcGx1dG8tPmR2Yl9hZGFwdGVyLCBwbHV0by0+ZmUpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChwbHV0by0+ZmUtPm9wcy0+cmVsZWFzZSkKKwkJCXBsdXRvLT5mZS0+b3BzLT5yZWxlYXNlKHBsdXRvLT5mZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbHV0b19yZWFkX3JldihzdHJ1Y3QgcGx1dG8gKnBsdXRvKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTUlTQykgJiBNSVNDX0RWUjsKKwlkZXZfaW5mbygmcGx1dG8tPnBkZXYtPmRldiwgImJvYXJkIHJldmlzaW9uICVkLiVkXG4iLAorCQkJKHZhbCA+PiAxMikgJiAweDBmLCAodmFsID4+IDQpICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbHV0b19yZWFkX21hYyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1OCAqbWFjKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTU1BQyk7CisJbWFjWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzFdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwl2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfSU1BQyk7CisJbWFjWzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzNdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwl2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTE1BQyk7CisJbWFjWzRdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzVdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwlkZXZfaW5mbygmcGx1dG8tPnBkZXYtPmRldiwgIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbHV0b19yZWFkX3NlcmlhbChzdHJ1Y3QgcGx1dG8gKnBsdXRvKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGx1dG8tPnBkZXY7CisJdW5zaWduZWQgaW50IGksIGo7CisJdTggX19pb21lbSAqY2lzOworCisJY2lzID0gcGNpX2lvbWFwKHBkZXYsIDEsIDApOworCWlmICghY2lzKQorCQlyZXR1cm4gLUVJTzsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJTL04gIik7CisKKwlmb3IgKGkgPSAweGUwOyBpIDwgMHgxMDA7IGkgKz0gNCkgeworCQl1MzIgdmFsID0gcmVhZGwoJmNpc1tpXSk7CisJCWZvciAoaiA9IDA7IGogPCAzMjsgaiArPSA4KSB7CisJCQlpZiAoKHZhbCAmIDB4ZmYpID09IDB4ZmYpCisJCQkJZ290byBvdXQ7CisJCQlwcmludGsoIiVjIiwgdmFsICYgMHhmZik7CisJCQl2YWwgPj49IDg7CisJCX0KKwl9CitvdXQ6CisJcHJpbnRrKCJcbiIpOworCXBjaV9pb3VubWFwKHBkZXYsIGNpcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGx1dG8yX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXI7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXg7CisJc3RydWN0IGRteF9kZW11eCAqZG14OworCWludCByZXQgPSAtRU5PTUVNOworCisJcGx1dG8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGx1dG8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBsdXRvKQorCQlnb3RvIG91dDsKKworCW1lbXNldChwbHV0bywgMCwgc2l6ZW9mKHN0cnVjdCBwbHV0bykpOworCXBsdXRvLT5wZGV2ID0gcGRldjsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9rZnJlZTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDZjLCAweDgwMDApOworCisJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BjaV9kaXNhYmxlX2RldmljZTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BjaV9kaXNhYmxlX2RldmljZTsKKworCXBsdXRvLT5pb19tZW0gPSBwY2lfaW9tYXAocGRldiwgMCwgMHg0MCk7CisJaWYgKCFwbHV0by0+aW9fbWVtKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHBsdXRvKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcGx1dG9faXJxLCBTQV9TSElSUSwgRFJJVkVSX05BTUUsIHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGNpX2lvdW5tYXA7CisKKwlyZXQgPSBwbHV0b19od19pbml0KHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwkvKiBpMmMgKi8KKwlpMmNfc2V0X2FkYXBkYXRhKCZwbHV0by0+aTJjX2FkYXAsIHBsdXRvKTsKKwlzdHJjcHkocGx1dG8tPmkyY19hZGFwLm5hbWUsIERSSVZFUl9OQU1FKTsKKwlwbHV0by0+aTJjX2FkYXAub3duZXIgPSBUSElTX01PRFVMRTsKKwlwbHV0by0+aTJjX2FkYXAuaWQgPSBJMkNfQUxHT19CSVQ7CisJcGx1dG8tPmkyY19hZGFwLmNsYXNzID0gSTJDX0NMQVNTX1RWX0RJR0lUQUw7CisJcGx1dG8tPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXBsdXRvLT5pMmNfYWRhcC5hbGdvX2RhdGEgPSAmcGx1dG8tPmkyY19iaXQ7CisJcGx1dG8tPmkyY19iaXQuZGF0YSA9IHBsdXRvOworCXBsdXRvLT5pMmNfYml0LnNldHNkYSA9IHBsdXRvX3NldHNkYTsKKwlwbHV0by0+aTJjX2JpdC5zZXRzY2wgPSBwbHV0b19zZXRzY2w7CisJcGx1dG8tPmkyY19iaXQuZ2V0c2RhID0gcGx1dG9fZ2V0c2RhOworCXBsdXRvLT5pMmNfYml0LmdldHNjbCA9IHBsdXRvX2dldHNjbDsKKwlwbHV0by0+aTJjX2JpdC51ZGVsYXkgPSAxMDsKKwlwbHV0by0+aTJjX2JpdC50aW1lb3V0ID0gMTA7CisKKwkvKiBSYWlzZSBTQ0wgYW5kIFNEQSAqLworCXBsdXRvX3NldHNkYShwbHV0bywgMSk7CisJcGx1dG9fc2V0c2NsKHBsdXRvLCAxKTsKKworCXJldCA9IGkyY19iaXRfYWRkX2J1cygmcGx1dG8tPmkyY19hZGFwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGx1dG9faHdfZXhpdDsKKworCS8qIGR2YiAqLworCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZwbHV0by0+ZHZiX2FkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2kyY19iaXRfZGVsX2J1czsKKworCWR2Yl9hZGFwdGVyID0gJnBsdXRvLT5kdmJfYWRhcHRlcjsKKworCXBsdXRvX3JlYWRfcmV2KHBsdXRvKTsKKwlwbHV0b19yZWFkX3NlcmlhbChwbHV0byk7CisJcGx1dG9fcmVhZF9tYWMocGx1dG8sIGR2Yl9hZGFwdGVyLT5wcm9wb3NlZF9tYWMpOworCisJZHZiZGVtdXggPSAmcGx1dG8tPmRlbXV4OworCWR2YmRlbXV4LT5maWx0ZXJudW0gPSAyNTY7CisJZHZiZGVtdXgtPmZlZWRudW0gPSAyNTY7CisJZHZiZGVtdXgtPnN0YXJ0X2ZlZWQgPSBwbHV0b19zdGFydF9mZWVkOworCWR2YmRlbXV4LT5zdG9wX2ZlZWQgPSBwbHV0b19zdG9wX2ZlZWQ7CisJZHZiZGVtdXgtPmRteC5jYXBhYmlsaXRpZXMgPSAoRE1YX1RTX0ZJTFRFUklORyB8CisJCQlETVhfU0VDVElPTl9GSUxURVJJTkcgfCBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyk7CisJcmV0ID0gZHZiX2RteF9pbml0KGR2YmRlbXV4KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZHZiX3VucmVnaXN0ZXJfYWRhcHRlcjsKKworCWRteCA9ICZkdmJkZW11eC0+ZG14OworCisJcGx1dG8tPmh3X2Zyb250ZW5kLnNvdXJjZSA9IERNWF9GUk9OVEVORF8wOworCXBsdXRvLT5tZW1fZnJvbnRlbmQuc291cmNlID0gRE1YX01FTU9SWV9GRTsKKwlwbHV0by0+ZG14ZGV2LmZpbHRlcm51bSA9IE5IV0ZJTFRFUlM7CisJcGx1dG8tPmRteGRldi5kZW11eCA9IGRteDsKKworCXJldCA9IGR2Yl9kbXhkZXZfaW5pdCgmcGx1dG8tPmRteGRldiwgZHZiX2FkYXB0ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kdmJfZG14X3JlbGVhc2U7CisKKwlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZwbHV0by0+aHdfZnJvbnRlbmQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kdmJfZG14ZGV2X3JlbGVhc2U7CisKKwlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcmVtb3ZlX2h3X2Zyb250ZW5kOworCisJcmV0ID0gZG14LT5jb25uZWN0X2Zyb250ZW5kKGRteCwgJnBsdXRvLT5od19mcm9udGVuZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3JlbW92ZV9tZW1fZnJvbnRlbmQ7CisKKwlyZXQgPSBmcm9udGVuZF9pbml0KHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZGlzY29ubmVjdF9mcm9udGVuZDsKKworCWR2Yl9uZXRfaW5pdChkdmJfYWRhcHRlciwgJnBsdXRvLT5kdmJuZXQsIGRteCk7CitvdXQ6CisJcmV0dXJuIHJldDsKKworZXJyX2Rpc2Nvbm5lY3RfZnJvbnRlbmQ6CisJZG14LT5kaXNjb25uZWN0X2Zyb250ZW5kKGRteCk7CitlcnJfcmVtb3ZlX21lbV9mcm9udGVuZDoKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKK2Vycl9yZW1vdmVfaHdfZnJvbnRlbmQ6CisJZG14LT5yZW1vdmVfZnJvbnRlbmQoZG14LCAmcGx1dG8tPmh3X2Zyb250ZW5kKTsKK2Vycl9kdmJfZG14ZGV2X3JlbGVhc2U6CisJZHZiX2RteGRldl9yZWxlYXNlKCZwbHV0by0+ZG14ZGV2KTsKK2Vycl9kdmJfZG14X3JlbGVhc2U6CisJZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKK2Vycl9kdmJfdW5yZWdpc3Rlcl9hZGFwdGVyOgorCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoZHZiX2FkYXB0ZXIpOworZXJyX2kyY19iaXRfZGVsX2J1czoKKwlpMmNfYml0X2RlbF9idXMoJnBsdXRvLT5pMmNfYWRhcCk7CitlcnJfcGx1dG9faHdfZXhpdDoKKwlwbHV0b19od19leGl0KHBsdXRvKTsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIHBsdXRvKTsKK2Vycl9wY2lfaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBwbHV0by0+aW9fbWVtKTsKK2Vycl9wY2lfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9rZnJlZToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUocGx1dG8pOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcGx1dG8yX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIgPSAmcGx1dG8tPmR2Yl9hZGFwdGVyOworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gJnBsdXRvLT5kZW11eDsKKwlzdHJ1Y3QgZG14X2RlbXV4ICpkbXggPSAmZHZiZGVtdXgtPmRteDsKKworCWRteC0+Y2xvc2UoZG14KTsKKwlkdmJfbmV0X3JlbGVhc2UoJnBsdXRvLT5kdmJuZXQpOworCWlmIChwbHV0by0+ZmUpCisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKHBsdXRvLT5mZSk7CisKKwlkbXgtPmRpc2Nvbm5lY3RfZnJvbnRlbmQoZG14KTsKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+aHdfZnJvbnRlbmQpOworCWR2Yl9kbXhkZXZfcmVsZWFzZSgmcGx1dG8tPmRteGRldik7CisJZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGR2Yl9hZGFwdGVyKTsKKwlpMmNfYml0X2RlbF9idXMoJnBsdXRvLT5pMmNfYWRhcCk7CisJcGx1dG9faHdfZXhpdChwbHV0byk7CisJZnJlZV9pcnEocGRldi0+aXJxLCBwbHV0byk7CisJcGNpX2lvdW5tYXAocGRldiwgcGx1dG8tPmlvX21lbSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHBsdXRvKTsKK30KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1NDTQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NDTQkweDA0MzIKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1BMVVRPMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMVVRPMgkweDAwMDEKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGx1dG8yX2lkX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NDTSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfUExVVE8yLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJfSwgeworCQkvKiBlbXB0eSAqLworCX0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGx1dG8yX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBsdXRvMl9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuaWRfdGFibGUgPSBwbHV0bzJfaWRfdGFibGUsCisJLnByb2JlID0gcGx1dG8yX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwbHV0bzJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBsdXRvMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBsdXRvMl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGx1dG8yX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBsdXRvMl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwbHV0bzJfaW5pdCk7Cittb2R1bGVfZXhpdChwbHV0bzJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgT2JlcnJpdHRlciA8b2JpQGxpbnV4dHYub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbHV0bzIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZwppbmRleCA3ZmZhMmM3Li5iZjNjMDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKQEAgLTEyLDcgKzEyLDcgQEAKIAlzZWxlY3QgRFZCX1NUVjAyOTcKIAlzZWxlY3QgRFZCX0w2NDc4MQogCWhlbHAKLQkgIFN1cHBvcnQgZm9yIFNBQTcxNDYgYW5kIEFWNzExMCBiYXNlZCBEVkIgY2FyZHMgYXMgcHJvZHVjZWQgCisJICBTdXBwb3J0IGZvciBTQUE3MTQ2IGFuZCBBVjcxMTAgYmFzZWQgRFZCIGNhcmRzIGFzIHByb2R1Y2VkCiAJICBieSBGdWppdHN1LVNpZW1lbnMsIFRlY2hub3RyZW5kLCBIYXVwcGF1Z2UgYW5kIG90aGVycy4KIAogCSAgVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyB0aGUgZnVsbGZlYXR1cmVkIGNhcmRzIHdpdGgKQEAgLTMzLDcgKzMzLDcgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIGZpcm13YXJlIGludG8gdGhlIGRyaXZlciB5b3UgbmVlZCB0byBzYXkKIAkgIFkgaGVyZSBhbmQgcHJvdmlkZSB0aGUgY29ycmVjdCBwYXRoIG9mIHRoZSBmaXJtd2FyZS4gWW91IG5lZWQgdGhpcwogCSAgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIHdob2xlIGRyaXZlciBzdGF0aWNhbGx5IGludG8gdGhlCi0JICBrZXJuZWwuIAorCSAga2VybmVsLgogCiAJICBBbGwgb3RoZXIgcGVvcGxlIHNheSBOLgogCkBAIC02Niw2ICs2Niw3IEBACiAJc2VsZWN0IERWQl9MNjQ3ODEKIAlzZWxlY3QgRFZCX1REQTgwODMKIAlzZWxlY3QgRFZCX1REQTEwMDIxCisJc2VsZWN0IERWQl9TNUgxNDIwCiAJaGVscAogCSAgU3VwcG9ydCBmb3Igc2ltcGxlIFNBQTcxNDYgYmFzZWQgRFZCIGNhcmRzCiAJICAoc28gY2FsbGVkIEJ1ZGdldC0gb3IgTm92YS1QQ0kgY2FyZHMpIHdpdGhvdXQgb25ib2FyZApAQCAtMTE5LDkgKzEyMCw5IEBACiAJc2VsZWN0IERWQl9WRVMxWDkzCiAJc2VsZWN0IERWQl9UREE4MDgzCiAJaGVscAotCSAgU3VwcG9ydCBmb3IgQnVkZ2V0IFBhdGNoIChmdWxsIFRTKSBtb2RpZmljYXRpb24gb24gCisJICBTdXBwb3J0IGZvciBCdWRnZXQgUGF0Y2ggKGZ1bGwgVFMpIG1vZGlmaWNhdGlvbiBvbgogCSAgU0FBNzE0NitBVjcxMTAgYmFzZWQgY2FyZHMgKERWQi1TIGNhcmRzKS4gVGhpcwotCSAgZHJpdmVyIGRvZXNuJ3QgdXNlIG9uYm9hcmQgTVBFRzIgZGVjb2Rlci4gVGhlIAorCSAgZHJpdmVyIGRvZXNuJ3QgdXNlIG9uYm9hcmQgTVBFRzIgZGVjb2Rlci4gVGhlCiAJICBjYXJkIGlzIGRyaXZlbiBpbiBCdWRnZXQtb25seSBtb2RlLiBDYXJkIGlzCiAJICByZXF1aXJlZCB0byBoYXZlIGxvYWRlZCBmaXJtd2FyZSB0byB0dW5lIHByb3Blcmx5LgogCSAgRmlybXdhcmUgY2FuIGJlIGxvYWRlZCBieSBpbnNlcnRpb24gYW5kIHJlbW92YWwgb2YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKaW5kZXggOGUzM2E4NS4uZTRjNmU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKQEAgLTExNiwxMyArMTE2LDE4IEBACiAKIHN0YXRpYyB2b2lkIGluaXRfYXY3MTEwX2F2KHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gYXY3MTEwLT5kZXY7CiAKIAkvKiBzZXQgaW50ZXJuYWwgdm9sdW1lIGNvbnRyb2wgdG8gbWF4aW11bSAqLwogCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfVEk7Ci0JYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXQgaW50ZXJuYWwgdm9sdW1lIHRvIG1heGltdW06JWRcbiIscmV0KTsKIAotCWF2NzcxMF9zZXRfdmlkZW9fbW9kZShhdjcxMTAsIHZpZG1vZGUpOworCXJldCA9IGF2NzcxMF9zZXRfdmlkZW9fbW9kZShhdjcxMTAsIHZpZG1vZGUpOworCWlmIChyZXQgPCAwKQorCQlwcmludGsoImR2Yi10dHBjaTpjYW5ub3Qgc2V0IHZpZGVvIG1vZGU6JWRcbiIscmV0KTsKIAogCS8qIGhhbmRsZSBkaWZmZXJlbnQgY2FyZCB0eXBlcyAqLwogCS8qIHJlbWFpbmluZyBpbml0cyBhY2NvcmRpbmcgdG8gY2FyZCBhbmQgZnJvbnRlbmQgdHlwZSAqLwpAQCAtMTU2LDggKzE2MSwxMiBAQAogCiAJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX05PTkUgfHwgYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfTVNQKSB7CiAJCS8vIHN3aXRjaCBEVkIgU0NBUlQgb24KLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfQVVESU9EQUMsIE1haW5Td2l0Y2gsIDEsIDApOwotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgQURTd2l0Y2gsIDEsIDEpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgTWFpblN3aXRjaCwgMSwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJpbnRrKCJkdmItdHRwY2k6Y2Fubm90IHN3aXRjaCBvbiBTQ0FSVChNYWluKTolZFxuIixyZXQpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgQURTd2l0Y2gsIDEsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzd2l0Y2ggb24gU0NBUlQoQUQpOiVkXG4iLHJldCk7CiAJCWlmIChyZ2Jfb24gJiYKIAkJICAgIChhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTEwYSkgJiYgKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMDAwKSkgewogCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMSwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLy8gUkdCIG9uLCBTQ0FSVCBwaW4gMTYKQEAgLTE2NSw4ICsxNzQsMTIgQEAKIAkJfQogCX0KIAotCWF2NzExMF9zZXRfdm9sdW1lKGF2NzExMCwgYXY3MTEwLT5taXhlci52b2x1bWVfbGVmdCwgYXY3MTEwLT5taXhlci52b2x1bWVfcmlnaHQpOwotCWF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2NzExMCwgMCk7CisJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXQgdm9sdW1lIDolZFxuIixyZXQpOworCXJldCA9IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2NzExMCwgMCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXR1cCBpcmMgY29uZmlnIDolZFxuIixyZXQpOwogfQogCiBzdGF0aWMgdm9pZCByZWNvdmVyX2FybShzdHJ1Y3QgYXY3MTEwICphdjcxMTApCkBAIC0yNTgsOCArMjcxLDkgQEAKICAqCiAgKiAgSWYgd2Ugd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbnRyb2xzIHdlIHdvdWxkIGhhdmUgdG8gZG8gbXVjaCBtb3JlLi4uCiAgKi8KLXZvaWQgYXY3MTEwX3NldHVwX2lyY19jb25maWcoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgaXJfY29uZmlnKQoraW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZykKIHsKKwlpbnQgcmV0ID0gMDsKIAlzdGF0aWMgc3RydWN0IGF2NzExMCAqbGFzdDsKIAogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwpAQCAtMjcwLDkgKzI4NCwxMCBAQAogCQlsYXN0ID0gYXY3MTEwOwogCiAJaWYgKGF2NzExMCkgewotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOwogCQlhdjcxMTAtPmlyX2NvbmZpZyA9IGlyX2NvbmZpZzsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgKCppcmNfaGFuZGxlcikodTMyKTsKQEAgLTc2NSwxMyArNzgwLDE0IEBACiAJCQkgICAgIHBjcnBpZCwgdnBpZCwgYXBpZCwgdHRwaWQsIHN1YnBpZCk7CiB9CiAKLXZvaWQgQ2hhbmdlUElEcyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiB2cGlkLCB1MTYgYXBpZCwgdTE2IHR0cGlkLAoraW50IENoYW5nZVBJRHMoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdnBpZCwgdTE2IGFwaWQsIHUxNiB0dHBpZCwKIAkJdTE2IHN1YnBpZCwgdTE2IHBjcnBpZCkKIHsKKwlpbnQgcmV0ID0gMDsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+cGlkX211dGV4KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKCEodnBpZCAmIDB4ODAwMCkpCiAJCWF2NzExMC0+cGlkc1tETVhfUEVTX1ZJREVPXSA9IHZwaWQ7CkBAIC03ODYsMTAgKzgwMiwxMSBAQAogCiAJaWYgKGF2NzExMC0+ZmVfc3luY2VkKSB7CiAJCXBjcnBpZCA9IGF2NzExMC0+cGlkc1tETVhfUEVTX1BDUl07Ci0JCVNldFBJRHMoYXY3MTEwLCB2cGlkLCBhcGlkLCB0dHBpZCwgc3VicGlkLCBwY3JwaWQpOworCQlyZXQgPSBTZXRQSURzKGF2NzExMCwgdnBpZCwgYXBpZCwgdHRwaWQsIHN1YnBpZCwgcGNycGlkKTsKIAl9CiAKIAl1cCgmYXY3MTEwLT5waWRfbXV0ZXgpOworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtODMyLDExICs4NDksMTMgQEAKIAlyZXQgPSBhdjcxMTBfZndfcmVxdWVzdChhdjcxMTAsIGJ1ZiwgMjAsICZoYW5kbGUsIDEpOwogCWlmIChyZXQgIT0gMCB8fCBoYW5kbGUgPj0gMzIpIHsKIAkJcHJpbnRrKCJkdmItdHRwY2k6ICVzIGVycm9yICBidWYgJTA0eCAlMDR4ICUwNHggJTA0eCAgIgotCQkJCSJyZXQgJXggIGhhbmRsZSAlMDR4XG4iLAorCQkJCSJyZXQgJWQgIGhhbmRsZSAlMDR4XG4iLAogCQkJCV9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAogCQkJCXJldCwgaGFuZGxlKTsKIAkJZHZiZG14ZmlsdGVyLT5od19oYW5kbGUgPSAweGZmZmY7Ci0JCXJldHVybiAtMTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSAtMTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlhdjcxMTAtPmhhbmRsZTJmaWx0ZXJbaGFuZGxlXSA9IGR2YmRteGZpbHRlcjsKQEAgLTg1OSw3ICs4NzgsNyBAQAogCWlmIChoYW5kbGUgPj0gMzIpIHsKIAkJcHJpbnRrKCIlcyB0cmllZCB0byBzdG9wIGludmFsaWQgZmlsdGVyICUwNHgsIGZpbHRlciB0eXBlID0gJXhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBoYW5kbGUsIGR2YmRteGZpbHRlci0+dHlwZSk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlhdjcxMTAtPmhhbmRsZTJmaWx0ZXJbaGFuZGxlXSA9IE5VTEw7CkBAIC04NzMsMTggKzg5MiwyMCBAQAogCQkJCSJyZXNwICUwNHggJTA0eCAgcGlkICVkXG4iLAogCQkJCV9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgcmV0LAogCQkJCWFuc3dbMF0sIGFuc3dbMV0sIGR2YmRteGZpbHRlci0+ZmVlZC0+cGlkKTsKLQkJcmV0ID0gLTE7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLTE7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKIAotc3RhdGljIHZvaWQgZHZiX2ZlZWRfc3RhcnRfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3N0YXRpYyBpbnQgZHZiX2ZlZWRfc3RhcnRfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKIHsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSBkdmJkbXhmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSAoc3RydWN0IGF2NzExMCAqKSBkdmJkbXgtPnByaXY7CiAJdTE2ICpwaWQgPSBkdmJkbXgtPnBpZHMsIG5waWRzWzVdOwogCWludCBpOworCWludCByZXQgPSAwOwogCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKQEAgLTg5MywzNiArOTE0LDQ5IEBACiAJbnBpZHNbaV0gPSAocGlkW2ldJjB4ODAwMCkgPyAwIDogcGlkW2ldOwogCWlmICgoaSA9PSAyKSAmJiBucGlkc1tpXSAmJiAoZHZiZG14ZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkpIHsKIAkJbnBpZHNbaV0gPSAwOwotCQlDaGFuZ2VQSURzKGF2NzExMCwgbnBpZHNbMV0sIG5waWRzWzBdLCBucGlkc1syXSwgbnBpZHNbM10sIG5waWRzWzRdKTsKLQkJU3RhcnRIV0ZpbHRlcihkdmJkbXhmZWVkLT5maWx0ZXIpOwotCQlyZXR1cm47CisJCXJldCA9IENoYW5nZVBJRHMoYXY3MTEwLCBucGlkc1sxXSwgbnBpZHNbMF0sIG5waWRzWzJdLCBucGlkc1szXSwgbnBpZHNbNF0pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IFN0YXJ0SFdGaWx0ZXIoZHZiZG14ZmVlZC0+ZmlsdGVyKTsKKwkJcmV0dXJuIHJldDsKIAl9Ci0JaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDIgfHwgZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gNCkKLQkJQ2hhbmdlUElEcyhhdjcxMTAsIG5waWRzWzFdLCBucGlkc1swXSwgbnBpZHNbMl0sIG5waWRzWzNdLCBucGlkc1s0XSk7CisJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDIgfHwgZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gNCkgeworCQlyZXQgPSBDaGFuZ2VQSURzKGF2NzExMCwgbnBpZHNbMV0sIG5waWRzWzBdLCBucGlkc1syXSwgbnBpZHNbM10sIG5waWRzWzRdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDwgMiAmJiBucGlkc1swXSkKIAkJaWYgKGF2NzExMC0+ZmVfc3luY2VkKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJeworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQogCiAJaWYgKChkdmJkbXhmZWVkLT50c190eXBlICYgVFNfUEFDS0VUKSkgewogCQlpZiAoZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gMCAmJiAhKGR2YmRteC0+cGlkc1swXSAmIDB4ODAwMCkpCi0JCQlhdjcxMTBfYXZfc3RhcnRfcmVjb3JkKGF2NzExMCwgUlBfQVVESU8sIGR2YmRteGZlZWQpOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0YXJ0X3JlY29yZChhdjcxMTAsIFJQX0FVRElPLCBkdmJkbXhmZWVkKTsKIAkJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlID09IDEgJiYgIShkdmJkbXgtPnBpZHNbMV0gJiAweDgwMDApKQotCQkJYXY3MTEwX2F2X3N0YXJ0X3JlY29yZChhdjcxMTAsIFJQX1ZJREVPLCBkdmJkbXhmZWVkKTsKKwkJCXJldCA9IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoYXY3MTEwLCBSUF9WSURFTywgZHZiZG14ZmVlZCk7CiAJfQorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGR2Yl9mZWVkX3N0b3BfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3N0YXRpYyBpbnQgZHZiX2ZlZWRfc3RvcF9waWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OwogCXN0cnVjdCBhdjcxMTAgKmF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwICopIGR2YmRteC0+cHJpdjsKIAl1MTYgKnBpZCA9IGR2YmRteC0+cGlkcywgbnBpZHNbNV07CiAJaW50IGk7CiAKKwlpbnQgcmV0ID0gMDsKKwogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwogCiAJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDEpIHsKLQkJYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBkdmJkbXhmZWVkLT5wZXNfdHlwZSA/ICBSUF9WSURFTyA6IFJQX0FVRElPKTsKKwkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBkdmJkbXhmZWVkLT5wZXNfdHlwZSA/ICBSUF9WSURFTyA6IFJQX0FVRElPKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCWlmICghYXY3MTEwLT5yZWNfbW9kZSkKIAkJCWR2YmRteC0+cmVjb3JkaW5nID0gMDsKIAkJaWYgKCFhdjcxMTAtPnBsYXlpbmcpCkBAIC05MzMsMjQgKzk2NywyNyBAQAogCXN3aXRjaCAoaSkgewogCWNhc2UgMjogLy90ZWxldGV4dAogCQlpZiAoZHZiZG14ZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkKLQkJCVN0b3BIV0ZpbHRlcihkdmJkbXhmZWVkLT5maWx0ZXIpOworCQkJcmV0ID0gU3RvcEhXRmlsdGVyKGR2YmRteGZlZWQtPmZpbHRlcik7CiAJCW5waWRzWzJdID0gMDsKIAkJYnJlYWs7CiAJY2FzZSAwOgogCWNhc2UgMToKIAljYXNlIDQ6CiAJCWlmICghcGlkc19vZmYpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJbnBpZHNbaV0gPSAocGlkW2ldJjB4ODAwMCkgPyAwIDogcGlkW2ldOwogCQlicmVhazsKIAl9Ci0JQ2hhbmdlUElEcyhhdjcxMTAsIG5waWRzWzFdLCBucGlkc1swXSwgbnBpZHNbMl0sIG5waWRzWzNdLCBucGlkc1s0XSk7CisJaWYgKCFyZXQpCisJCXJldCA9IENoYW5nZVBJRHMoYXY3MTEwLCBucGlkc1sxXSwgbnBpZHNbMF0sIG5waWRzWzJdLCBucGlkc1szXSwgbnBpZHNbNF0pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGF2NzExMCAqYXY3MTEwID0gZGVtdXgtPnByaXY7CisJaW50IHJldCA9IDA7CiAKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIApAQCAtOTcxLDIxICsxMDA4LDIyIEBACiAJCQkJCSAgICEoZGVtdXgtPnBpZHNbMV0gJiAweDgwMDApKSB7CiAJCQkJCSAgICAgICBkdmJfcmluZ2J1ZmZlcl9mbHVzaF9zcGlubG9ja193YWtldXAoJmF2NzExMC0+YXZvdXQpOwogCQkJCQkgICAgICAgZHZiX3JpbmdidWZmZXJfZmx1c2hfc3BpbmxvY2tfd2FrZXVwKCZhdjcxMTAtPmFvdXQpOwotCQkJCQkgICAgICAgYXY3MTEwX2F2X3N0YXJ0X3BsYXkoYXY3MTEwLFJQX0FWKTsKLQkJCQkJICAgICAgIGRlbXV4LT5wbGF5aW5nID0gMTsKKwkJCQkJICAgICAgIHJldCA9IGF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCxSUF9BVik7CisJCQkJCSAgICAgICBpZiAoIXJldCkKKwkJCQkJCSAgICAgICBkZW11eC0+cGxheWluZyA9IDE7CiAJCQkJCX0KIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJZHZiX2ZlZWRfc3RhcnRfcGlkKGZlZWQpOworCQkJCXJldCA9IGR2Yl9mZWVkX3N0YXJ0X3BpZChmZWVkKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIGlmICgoZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkgJiYKIAkJCSAgIChkZW11eC0+ZG14LmZyb250ZW5kLT5zb3VyY2UgIT0gRE1YX01FTU9SWV9GRSkpIHsKLQkJCVN0YXJ0SFdGaWx0ZXIoZmVlZC0+ZmlsdGVyKTsKKwkJCXJldCA9IFN0YXJ0SFdGaWx0ZXIoZmVlZC0+ZmlsdGVyKTsKIAkJfQogCX0KIAotCWlmIChmZWVkLT50eXBlID09IERNWF9UWVBFX1NFQykgeworCWVsc2UgaWYgKGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7CiAJCWludCBpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkZW11eC0+ZmlsdGVybnVtOyBpKyspIHsKQEAgLTk5NiwxMiArMTAzNCwxNSBAQAogCQkJaWYgKGRlbXV4LT5maWx0ZXJbaV0uZmlsdGVyLnBhcmVudCAhPSAmZmVlZC0+ZmVlZC5zZWMpCiAJCQkJY29udGludWU7CiAJCQlkZW11eC0+ZmlsdGVyW2ldLnN0YXRlID0gRE1YX1NUQVRFX0dPOwotCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKQotCQkJCVN0YXJ0SFdGaWx0ZXIoJmRlbXV4LT5maWx0ZXJbaV0pOworCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKSB7CisJCQkJcmV0ID0gU3RhcnRIV0ZpbHRlcigmZGVtdXgtPmZpbHRlcltpXSk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTEwMDksNyArMTA1MCw3IEBACiB7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSBkZW11eC0+cHJpdjsKLQorCWludCBpLCByYywgcmV0ID0gMDsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAogCWlmIChmZWVkLT50eXBlID09IERNWF9UWVBFX1RTKSB7CkBAIC0xMDIyLDI2ICsxMDYzLDI5IEBACiAJCX0KIAkJaWYgKGZlZWQtPnRzX3R5cGUgJiBUU19ERUNPREVSICYmCiAJCSAgICBmZWVkLT5wZXNfdHlwZSA8IERNWF9UU19QRVNfT1RIRVIpIHsKLQkJCWR2Yl9mZWVkX3N0b3BfcGlkKGZlZWQpOworCQkJcmV0ID0gZHZiX2ZlZWRfc3RvcF9waWQoZmVlZCk7CiAJCX0gZWxzZQogCQkJaWYgKChmZWVkLT50c190eXBlICYgVFNfUEFDS0VUKSAmJgogCQkJICAgIChkZW11eC0+ZG14LmZyb250ZW5kLT5zb3VyY2UgIT0gRE1YX01FTU9SWV9GRSkpCi0JCQkJU3RvcEhXRmlsdGVyKGZlZWQtPmZpbHRlcik7CisJCQkJcmV0ID0gU3RvcEhXRmlsdGVyKGZlZWQtPmZpbHRlcik7CiAJfQogCi0JaWYgKGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGk8ZGVtdXgtPmZpbHRlcm51bTsgaSsrKQorCWlmICghcmV0ICYmIGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7CisJCWZvciAoaSA9IDA7IGk8ZGVtdXgtPmZpbHRlcm51bTsgaSsrKSB7CiAJCQlpZiAoZGVtdXgtPmZpbHRlcltpXS5zdGF0ZSA9PSBETVhfU1RBVEVfR08gJiYKIAkJCSAgICBkZW11eC0+ZmlsdGVyW2ldLmZpbHRlci5wYXJlbnQgPT0gJmZlZWQtPmZlZWQuc2VjKSB7CiAJCQkJZGVtdXgtPmZpbHRlcltpXS5zdGF0ZSA9IERNWF9TVEFURV9SRUFEWTsKLQkJCQlpZiAoZGVtdXgtPmRteC5mcm9udGVuZC0+c291cmNlICE9IERNWF9NRU1PUllfRkUpCi0JCQkJCVN0b3BIV0ZpbHRlcigmZGVtdXgtPmZpbHRlcltpXSk7CisJCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKSB7CisJCQkJCXJjID0gU3RvcEhXRmlsdGVyKCZkZW11eC0+ZmlsdGVyW2ldKTsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSByYzsKKwkJCQkJLyoga2VlcCBnb2luZywgc3RvcCBhcyBtYW55IGZpbHRlcnMgYXMgcG9zc2libGUgKi8KKwkJCQl9CisJCQl9CiAJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTEwOTMsNyArMTEzNyw3IEBACiAJcmV0ID0gYXY3MTEwX2Z3X3JlcXVlc3QoYXY3MTEwLCAmdGFnLCAwLCBmd3N0YywgNCk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdjcxMTBfZndfcmVxdWVzdCBlcnJvclxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiByZXQ7CiAJfQogCWRwcmludGsoMiwgImZ3c3RjID0gJTA0aHggJTA0aHggJTA0aHggJTA0aHhcbiIsCiAJCWZ3c3RjWzBdLCBmd3N0Y1sxXSwgZndzdGNbMl0sIGZ3c3RjWzNdKTsKQEAgLTExMTksMTggKzExNjMsMTQgQEAKIAogCXN3aXRjaCAodG9uZSkgewogCWNhc2UgU0VDX1RPTkVfT046Ci0JCVNldDIySyhhdjcxMTAsIDEpOwotCQlicmVhazsKKwkJcmV0dXJuIFNldDIySyhhdjcxMTAsIDEpOwogCiAJY2FzZSBTRUNfVE9ORV9PRkY6Ci0JCVNldDIySyhhdjcxMTAsIDApOwotCQlicmVhazsKKwkJcmV0dXJuIFNldDIySyhhdjcxMTAsIDApOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCkBAIC0xMTM4LDkgKzExNzgsNyBAQAogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKLQlhdjcxMTBfZGlzZXFjX3NlbmQoYXY3MTEwLCBjbWQtPm1zZ19sZW4sIGNtZC0+bXNnLCAtMSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXY3MTEwX2Rpc2VxY19zZW5kKGF2NzExMCwgY21kLT5tc2dfbGVuLCBjbWQtPm1zZywgLTEpOwogfQogCiBzdGF0aWMgaW50IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKQEAgLTExNDgsOSArMTE4Niw3IEBACiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9kaXNlcWNfc2VuZChhdjcxMTAsIDAsIE5VTEwsIG1pbmljbWQpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF2NzExMF9kaXNlcWNfc2VuZChhdjcxMTAsIDAsIE5VTEwsIG1pbmljbWQpOwogfQogCiAvKiBzaW1wbGlmaWVkIGNvZGUgZnJvbSBidWRnZXQtY29yZS5jICovCkBAIC0xOTkyLDc2ICsyMDI4LDg1IEBACiAKIAogCi1zdGF0aWMgdm9pZCBhdjcxMTBfZmVfbG9ja19maXgoc3RydWN0IGF2NzExMCogYXY3MTEwLCBmZV9zdGF0dXNfdCBzdGF0dXMpCitzdGF0aWMgaW50IGF2NzExMF9mZV9sb2NrX2ZpeChzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAsIGZlX3N0YXR1c190IHN0YXR1cykKIHsKKwlpbnQgcmV0ID0gMDsKIAlpbnQgc3luY2VkID0gKHN0YXR1cyAmIEZFX0hBU19MT0NLKSA/IDEgOiAwOwogCiAJYXY3MTEwLT5mZV9zdGF0dXMgPSBzdGF0dXM7CiAKIAlpZiAoYXY3MTEwLT5mZV9zeW5jZWQgPT0gc3luY2VkKQotCQlyZXR1cm47Ci0KLQlhdjcxMTAtPmZlX3N5bmNlZCA9IHN5bmNlZDsKKwkJcmV0dXJuIDA7CiAKIAlpZiAoYXY3MTEwLT5wbGF5aW5nKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXY3MTEwLT5waWRfbXV0ZXgpKQotCQlyZXR1cm47CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlpZiAoYXY3MTEwLT5mZV9zeW5jZWQpIHsKLQkJU2V0UElEcyhhdjcxMTAsIGF2NzExMC0+cGlkc1tETVhfUEVTX1ZJREVPXSwKKwlpZiAoc3luY2VkKSB7CisJCXJldCA9IFNldFBJRHMoYXY3MTEwLCBhdjcxMTAtPnBpZHNbRE1YX1BFU19WSURFT10sCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19BVURJT10sCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19URUxFVEVYVF0sIDAsCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19QQ1JdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNjYW4sIDApOwogCX0gZWxzZSB7Ci0JCVNldFBJRHMoYXY3MTEwLCAwLCAwLCAwLCAwLCAwKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElEX0ZJTFRFUiwgRmx1c2hUU1F1ZXVlLCAwKTsKLQkJYXY3MTEwX3dhaXRfbXNnc3RhdGUoYXY3MTEwLCBHUE1RQnVzeSk7CisJCXJldCA9IFNldFBJRHMoYXY3MTEwLCAwLCAwLCAwLCAwLCAwKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1BJRF9GSUxURVIsIEZsdXNoVFNRdWV1ZSwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBhdjcxMTBfd2FpdF9tc2dzdGF0ZShhdjcxMTAsIEdQTVFCdXN5KTsKKwkJfQogCX0KIAorCWlmICghcmV0KQorCQlhdjcxMTAtPmZlX3N5bmNlZCA9IHN5bmNlZDsKKwogCXVwKCZhdjcxMTAtPnBpZF9tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX3NldF9mcm9udGVuZChmZSwgcGFyYW1zKTsKKworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfZnJvbnRlbmQoZmUsIHBhcmFtcyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfaW5pdChmZSk7CisJaW50IHJldCA9IGF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOworCWlmICghcmV0KQorCQlyZXQgPSBhdjcxMTAtPmZlX2luaXQoZmUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7Ci0JaW50IHJldDsKIAogCS8qIGNhbGwgdGhlIHJlYWwgaW1wbGVtZW50YXRpb24gKi8KLQlyZXQgPSBhdjcxMTAtPmZlX3JlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoKCgqc3RhdHVzIF4gYXY3MTEwLT5mZV9zdGF0dXMpICYgRkVfSEFTX0xPQ0spICYmICgqc3RhdHVzICYgRkVfSEFTX0xPQ0spKSB7Ci0JCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsICpzdGF0dXMpOwotCX0KLQotCXJldHVybiAwOworCWludCByZXQgPSBhdjcxMTAtPmZlX3JlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOworCWlmICghcmV0KQorCQlpZiAoKCgqc3RhdHVzIF4gYXY3MTEwLT5mZV9zdGF0dXMpICYgRkVfSEFTX0xPQ0spICYmICgqc3RhdHVzICYgRkVfSEFTX0xPQ0spKQorCQkJcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgKnN0YXR1cyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzZXFjX3Jlc2V0X292ZXJsb2FkKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKLQlhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKLQlyZXR1cm4gYXY3MTEwLT5mZV9kaXNlcWNfcmVzZXRfb3ZlcmxvYWQoZmUpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9kaXNlcWNfcmVzZXRfb3ZlcmxvYWQoZmUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCkBAIC0yMDY5LDQwICsyMTE0LDUwIEBACiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoZmUsIGNtZCk7CisJaW50IHJldCA9IGF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOworCWlmICghcmV0KQorCQlyZXQgPSBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoZmUsIGNtZCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IG1pbmljbWQpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX2J1cnN0KGZlLCBtaW5pY21kKTsKKwlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+ZmVfZGlzZXFjX3NlbmRfYnVyc3QoZmUsIG1pbmljbWQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfc2V0X3RvbmUoZmUsIHRvbmUpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfdG9uZShmZSwgdG9uZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfc2V0X3ZvbHRhZ2UoZmUsIHZvbHRhZ2UpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfdm9sdGFnZShmZSwgdm9sdGFnZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdW5zaWduZWQgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChmZSwgY21kKTsKKwlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+ZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChmZSwgY21kKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTggcmVhZF9wd20oc3RydWN0IGF2NzExMCogYXY3MTEwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaAppbmRleCA0ZjY5YjRkLi41MDhiNzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaApAQCAtMTE5LDggKzExOSw3IEBACiAJdm9sYXRpbGUgaW50CQlibXBfc3RhdGU7CiAjZGVmaW5lIEJNUF9OT05FICAgICAwCiAjZGVmaW5lIEJNUF9MT0FESU5HICAxCi0jZGVmaW5lIEJNUF9MT0FESU5HUyAyCi0jZGVmaW5lIEJNUF9MT0FERUQgICAzCisjZGVmaW5lIEJNUF9MT0FERUQgICAyCiAJd2FpdF9xdWV1ZV9oZWFkX3QJYm1wcTsKIAogCkBAIC0yNTUsMTIgKzI1NCwxMiBAQAogfTsKIAogCi1leHRlcm4gdm9pZCBDaGFuZ2VQSURzKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTE2IHZwaWQsIHUxNiBhcGlkLCB1MTYgdHRwaWQsCitleHRlcm4gaW50IENoYW5nZVBJRHMoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdnBpZCwgdTE2IGFwaWQsIHUxNiB0dHBpZCwKIAkJICAgICAgIHUxNiBzdWJwaWQsIHUxNiBwY3JwaWQpOwogCiBleHRlcm4gdm9pZCBhdjcxMTBfcmVnaXN0ZXJfaXJjX2hhbmRsZXIodm9pZCAoKmZ1bmMpKHUzMikpOwogZXh0ZXJuIHZvaWQgYXY3MTEwX3VucmVnaXN0ZXJfaXJjX2hhbmRsZXIodm9pZCAoKmZ1bmMpKHUzMikpOwotZXh0ZXJuIHZvaWQgYXY3MTEwX3NldHVwX2lyY19jb25maWcgKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZyk7CitleHRlcm4gaW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnIChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcl9jb25maWcpOwogCiBleHRlcm4gaW50IGF2NzExMF9pcl9pbml0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGF2NzExMF9pcl9leGl0ICh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKaW5kZXggY2NmOTQ2MS4uMDY5NmE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKQEAgLTEyMSw2ICsxMjEsNyBAQAogaW50IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYsCiAJCQkgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCiB7CisJaW50IHJldCA9IDA7CiAJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CiAKIAlkcHJpbnRrKDIsICJhdjcxMTA6JXAsICwgZHZiX2RlbXV4X2ZlZWQ6JXBcbiIsIGF2NzExMCwgZHZiZG14ZmVlZCk7CkBAIC0xMzcsNyArMTM4LDcgQEAKIAkJCQkgICAgICAgZHZiZG14LT5wZXNmaWx0ZXJbMF0tPnBpZCwKIAkJCQkgICAgICAgZHZiX2ZpbHRlcl9wZXMydHNfY2IsCiAJCQkJICAgICAgICh2b2lkICopIGR2YmRteC0+cGVzZmlsdGVyWzBdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUmVjb3JkLCAyLCBBdWRpb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQXVkaW9QRVMsIDApOwogCQlicmVhazsKIAogCWNhc2UgUlBfVklERU86CkBAIC0xNDUsNyArMTQ2LDcgQEAKIAkJCQkgICAgICAgZHZiZG14LT5wZXNmaWx0ZXJbMV0tPnBpZCwKIAkJCQkgICAgICAgZHZiX2ZpbHRlcl9wZXMydHNfY2IsCiAJCQkJICAgICAgICh2b2lkICopIGR2YmRteC0+cGVzZmlsdGVyWzFdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUmVjb3JkLCAyLCBWaWRlb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgVmlkZW9QRVMsIDApOwogCQlicmVhazsKIAogCWNhc2UgUlBfQVY6CkBAIC0xNTcsMTQgKzE1OCwxNSBAQAogCQkJCSAgICAgICBkdmJkbXgtPnBlc2ZpbHRlclsxXS0+cGlkLAogCQkJCSAgICAgICBkdmJfZmlsdGVyX3BlczJ0c19jYiwKIAkJCQkgICAgICAgKHZvaWQgKikgZHZiZG14LT5wZXNmaWx0ZXJbMV0pOwotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIEFWX1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQVZfUEVTLCAwKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIGludCBhdjcxMTBfYXZfc3RhcnRfcGxheShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBhdikKIHsKKwlpbnQgcmV0ID0gMDsKIAlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKIAogCWlmIChhdjcxMTAtPnJlY19tb2RlKQpAQCAtMTgyLDU0ICsxODQsNTcgQEAKIAlhdjcxMTAtPnBsYXlpbmcgfD0gYXY7CiAJc3dpdGNoIChhdjcxMTAtPnBsYXlpbmcpIHsKIAljYXNlIFJQX0FVRElPOgotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19QbGF5LCAyLCBBdWRpb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBSUF9WSURFTzoKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19QbGF5LCAyLCBWaWRlb1BFUywgMCk7CiAJCWF2NzExMC0+c2luZm8gPSAwOwogCQlicmVhazsKIAljYXNlIFJQX0FWOgogCQlhdjcxMTAtPnNpbmZvID0gMDsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKKwkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiBhdjcxMTAtPnBsYXlpbmc7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+cGxheWluZzsKKwlyZXR1cm4gcmV0OwogfQogCi12b2lkIGF2NzExMF9hdl9zdG9wKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KQoraW50IGF2NzExMF9hdl9zdG9wKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KQogeworCWludCByZXQgPSAwOwogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCiAJaWYgKCEoYXY3MTEwLT5wbGF5aW5nICYgYXYpICYmICEoYXY3MTEwLT5yZWNfbW9kZSAmIGF2KSkKLQkJcmV0dXJuOwotCisJCXJldHVybiAwOwogCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1N0b3AsIDApOwogCWlmIChhdjcxMTAtPnBsYXlpbmcpIHsKIAkJYXY3MTEwLT5wbGF5aW5nICY9IH5hdjsKIAkJc3dpdGNoIChhdjcxMTAtPnBsYXlpbmcpIHsKIAkJY2FzZSBSUF9BVURJTzoKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIFJQX1ZJREVPOgotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfTk9ORToKLQkJCWF2NzExMF9zZXRfdmlkbW9kZShhdjcxMTAsIGF2NzExMC0+dmlkbW9kZSk7CisJCQlyZXQgPSBhdjcxMTBfc2V0X3ZpZG1vZGUoYXY3MTEwLCBhdjcxMTAtPnZpZG1vZGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgewogCQlhdjcxMTAtPnJlY19tb2RlICY9IH5hdjsKIAkJc3dpdGNoIChhdjcxMTAtPnJlY19tb2RlKSB7CiAJCWNhc2UgUlBfQVVESU86Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIEF1ZGlvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQXVkaW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfVklERU86Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIFZpZGVvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgVmlkZW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfTk9ORToKIAkJCWJyZWFrOwogCQl9CiAJfQorCXJldHVybiByZXQ7CiB9CiAKIApAQCAtMzE3LDE5ICszMjIsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBhdjcxMTBfc2V0X3ZpZG1vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKK2ludCBhdjcxMTBfc2V0X3ZpZG1vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKIHsKKwlpbnQgcmV0OwogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCi0JYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfRU5DT0RFUiwgTG9hZFZpZENvZGUsIDEsIG1vZGUpOworCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0VOQ09ERVIsIExvYWRWaWRDb2RlLCAxLCBtb2RlKTsKIAotCWlmICghYXY3MTEwLT5wbGF5aW5nKSB7Ci0JCUNoYW5nZVBJRHMoYXY3MTEwLCBhdjcxMTAtPnBpZHNbRE1YX1BFU19WSURFT10sCisJaWYgKCFyZXQgJiYgIWF2NzExMC0+cGxheWluZykgeworCQlyZXQgPSBDaGFuZ2VQSURzKGF2NzExMCwgYXY3MTEwLT5waWRzW0RNWF9QRVNfVklERU9dLAogCQkJICAgYXY3MTEwLT5waWRzW0RNWF9QRVNfQVVESU9dLAogCQkJICAgYXY3MTEwLT5waWRzW0RNWF9QRVNfVEVMRVRFWFRdLAogCQkJICAgMCwgYXY3MTEwLT5waWRzW0RNWF9QRVNfUENSXSk7Ci0JCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1BJREZJTFRFUiwgU2NhbiwgMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC0zNDAsMTcgKzM0OCwxOCBAQAogCVZJREVPX01PREVfUEFMLCBWSURFT19NT0RFX1BBTCwgVklERU9fTU9ERV9QQUwsIFZJREVPX01PREVfUEFMLAogfTsKIAotc3RhdGljIHZvaWQgZ2V0X3ZpZGVvX2Zvcm1hdChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4ICpidWYsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgZ2V0X3ZpZGVvX2Zvcm1hdChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4ICpidWYsIGludCBjb3VudCkKIHsKIAlpbnQgaTsKIAlpbnQgaHNpemUsIHZzaXplOwogCWludCBzdzsKIAl1OCAqcDsKKwlpbnQgcmV0ID0gMDsKIAogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCiAJaWYgKGF2NzExMC0+c2luZm8pCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJZm9yIChpID0gNzsgaSA8IGNvdW50IC0gMTA7IGkrKykgewogCQlwID0gYnVmICsgaTsKIAkJaWYgKHBbMF0gfHwgcFsxXSB8fCBwWzJdICE9IDB4MDEgfHwgcFszXSAhPSAweGIzKQpAQCAtMzU5LDExICszNjgsMTQgQEAKIAkJaHNpemUgPSAoKHBbMV0gJjB4RjApID4+IDQpIHwgKHBbMF0gPDwgNCk7CiAJCXZzaXplID0gKChwWzFdICYweDBGKSA8PCA4KSB8IChwWzJdKTsKIAkJc3cgPSAocFszXSAmIDB4MEYpOwotCQlhdjcxMTBfc2V0X3ZpZG1vZGUoYXY3MTEwLCBzdzJtb2RlW3N3XSk7Ci0JCWRwcmludGsoMiwgInBsYXliYWNrICVkeCVkIGZyPSVkXG4iLCBoc2l6ZSwgdnNpemUsIHN3KTsKLQkJYXY3MTEwLT5zaW5mbyA9IDE7CisJCXJldCA9IGF2NzExMF9zZXRfdmlkbW9kZShhdjcxMTAsIHN3Mm1vZGVbc3ddKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWRwcmludGsoMiwgInBsYXliYWNrICVkeCVkIGZyPSVkXG4iLCBoc2l6ZSwgdnNpemUsIHN3KTsKKwkJCWF2NzExMC0+c2luZm8gPSAxOworCQl9CiAJCWJyZWFrOwogCX0KKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTk3NCw3ICs5ODYsNyBAQAogCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpIHBhcmc7CiAJaW50IHJldCA9IDA7CiAKLQlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKKwlkcHJpbnRrKDEsICJhdjcxMTA6JXAsIGNtZD0lMDR4XG4iLCBhdjcxMTAsY21kKTsKIAogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRE9OTFkpIHsKIAkJaWYgKCBjbWQgIT0gVklERU9fR0VUX1NUQVRVUyAmJiBjbWQgIT0gVklERU9fR0VUX0VWRU5UICYmCkBAIC05ODcsNDkgKzk5OSw1NyBAQAogCWNhc2UgVklERU9fU1RPUDoKIAkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19TVE9QUEVEOwogCQlpZiAoYXY3MTEwLT52aWRlb3N0YXRlLnN0cmVhbV9zb3VyY2UgPT0gVklERU9fU09VUkNFX01FTU9SWSkKLQkJCWF2NzExMF9hdl9zdG9wKGF2NzExMCwgUlBfVklERU8pOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBSUF9WSURFTyk7CiAJCWVsc2UKLQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TVE9QLAorCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsCiAJCQkgICAgICAgYXY3MTEwLT52aWRlb3N0YXRlLnZpZGVvX2JsYW5rID8gMCA6IDEpOwotCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX05PTkU7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOwogCQlicmVhazsKIAogCWNhc2UgVklERU9fUExBWToKIAkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOwogCQlpZiAoYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPT0gVklERU9fRlJFRVpFRCkgewogCQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKIAkJfQogCiAJCWlmIChhdjcxMTAtPnZpZGVvc3RhdGUuc3RyZWFtX3NvdXJjZSA9PSBWSURFT19TT1VSQ0VfTUVNT1JZKSB7CiAJCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKSB7Ci0JCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fU3RvcCwgMCk7CisJCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fU3RvcCwgMCk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CiAJCQkJYXY3MTEwLT5wbGF5aW5nICY9IH5SUF9WSURFTzsKIAkJCX0KLQkJCWF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCwgUlBfVklERU8pOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOwotCQl9IGVsc2UgewotCQkJLy9hdjcxMTBfYXZfc3RvcChhdjcxMTAsIFJQX1ZJREVPKTsKLQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9QTEFZLCAwKTsKKwkJCXJldCA9IGF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCwgUlBfVklERU8pOwogCQl9Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOwogCQlicmVhazsKIAogCWNhc2UgVklERU9fRlJFRVpFOgogCQlhdjcxMTAtPnZpZGVvc3RhdGUucGxheV9zdGF0ZSA9IFZJREVPX0ZSRUVaRUQ7CiAJCWlmIChhdjcxMTAtPnBsYXlpbmcgJiBSUF9WSURFTykKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BhdXNlLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BhdXNlLCAwKTsKIAkJZWxzZQotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZSRUVaRSwgMSk7Ci0JCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfRlJFRVpFOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZSRUVaRSwgMSk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19GUkVFWkU7CiAJCWJyZWFrOwogCiAJY2FzZSBWSURFT19DT05USU5VRToKIAkJaWYgKGF2NzExMC0+cGxheWluZyAmIFJQX1ZJREVPKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fQ29udGludWUsIDApOwotCQl2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKLQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fQ29udGludWUsIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9QTEFZLCAwKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfTk9ORTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgVklERU9fU0VMRUNUX1NPVVJDRToKQEAgLTEwNDUsNyArMTA2NSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBWSURFT19HRVRfRVZFTlQ6Ci0JCXJldD1kdmJfdmlkZW9fZ2V0X2V2ZW50KGF2NzExMCwgcGFyZywgZmlsZS0+Zl9mbGFncyk7CisJCXJldCA9IGR2Yl92aWRlb19nZXRfZXZlbnQoYXY3MTEwLCBwYXJnLCBmaWxlLT5mX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIFZJREVPX0dFVF9TSVpFOgpAQCAtMTEwNSwyNSArMTEyNSwzMiBAQAogCWNhc2UgVklERU9fRkFTVF9GT1JXQVJEOgogCQkvL25vdGU6IGFyZyBpcyBpZ25vcmVkIGJ5IGZpcm13YXJlCiAJCWlmIChhdjcxMTAtPnBsYXlpbmcgJiBSUF9WSURFTykKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAotCQkJCSAgICAgIF9fU2Nhbl9JLCAyLCBBVl9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCSAgICBfX1NjYW5fSSwgMiwgQVZfUEVTLCAwKTsKIAkJZWxzZQotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZGV0QsIGFyZyk7Ci0JCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfRkFTVDsKLQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZGV0QsIGFyZyk7CisJCWlmICghcmV0KSB7CisJCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX0ZBU1Q7CisJCQlhdjcxMTAtPnZpZGVvc3RhdGUucGxheV9zdGF0ZSA9IFZJREVPX1BMQVlJTkc7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIFZJREVPX1NMT1dNT1RJT046CiAJCWlmIChhdjcxMTAtPnBsYXlpbmcmUlBfVklERU8pIHsKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1Nsb3csIDIsIDAsIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NMT1csIGFyZyk7CisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19TbG93LCAyLCAwLCAwKTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQl9IGVsc2UgewotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NMT1csIGFyZyk7CisJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU1RPUCwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU0xPVywgYXJnKTsKIAkJfQotCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX1NMT1c7Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJaWYgKCFyZXQpIHsKKwkJCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfU0xPVzsKKwkJCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgVklERU9fR0VUX0NBUEFCSUxJVElFUzoKQEAgLTExMzYsMTggKzExNjMsMjEgQEAKIAkJYXY3MTEwX2lwYWNrX3Jlc2V0KCZhdjcxMTAtPmlwYWNrWzFdKTsKIAogCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKSB7Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKLQkJCQkgICAgICBfX1BsYXksIDIsIEFWX1BFUywgMCk7CisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKKwkJCQkJICAgIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CiAJCQlpZiAoYXY3MTEwLT50cmlja21vZGUgPT0gVFJJQ0tfRkFTVCkKLQkJCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKLQkJCQkJICAgICAgX19TY2FuX0ksIDIsIEFWX1BFUywgMCk7CisJCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCQkgICAgX19TY2FuX0ksIDIsIEFWX1BFUywgMCk7CiAJCQlpZiAoYXY3MTEwLT50cmlja21vZGUgPT0gVFJJQ0tfU0xPVykgewotCQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAotCQkJCQkgICAgICBfX1Nsb3csIDIsIDAsIDApOwotCQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOworCQkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAorCQkJCQkJICAgIF9fU2xvdywgMiwgMCwgMCk7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQkJfQogCQkJaWYgKGF2NzExMC0+dHJpY2ttb2RlID09IFRSSUNLX0ZSRUVaRSkKLQkJCQl2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU1RPUCwgMSk7CisJCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsIDEpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMTcwLDcgKzEyMDAsNyBAQAogCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpIHBhcmc7CiAJaW50IHJldCA9IDA7CiAKLQlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKKwlkcHJpbnRrKDEsICJhdjcxMTA6JXAsIGNtZD0lMDR4XG4iLCBhdjcxMTAsY21kKTsKIAogCWlmICgoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKSAmJgogCSAgICAoY21kICE9IEFVRElPX0dFVF9TVEFUVVMpKQpAQCAtMTE3OSwyOCArMTIwOSwzMiBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBBVURJT19TVE9QOgogCQlpZiAoYXY3MTEwLT5hdWRpb3N0YXRlLnN0cmVhbV9zb3VyY2UgPT0gQVVESU9fU09VUkNFX01FTU9SWSkKLQkJCWF2NzExMF9hdl9zdG9wKGF2NzExMCwgUlBfQVVESU8pOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBSUF9BVURJTyk7CiAJCWVsc2UKLQkJCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9NVVRFKTsKLQkJYXY3MTEwLT5hdWRpb3N0YXRlLnBsYXlfc3RhdGUgPSBBVURJT19TVE9QUEVEOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOworCQlpZiAoIXJldCkKKwkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fU1RPUFBFRDsKIAkJYnJlYWs7CiAKIAljYXNlIEFVRElPX1BMQVk6CiAJCWlmIChhdjcxMTAtPmF1ZGlvc3RhdGUuc3RyZWFtX3NvdXJjZSA9PSBBVURJT19TT1VSQ0VfTUVNT1JZKQotCQkJYXY3MTEwX2F2X3N0YXJ0X3BsYXkoYXY3MTEwLCBSUF9BVURJTyk7Ci0JCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9VTk1VVEUpOwotCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BMQVlJTkc7CisJCQlyZXQgPSBhdjcxMTBfYXZfc3RhcnRfcGxheShhdjcxMTAsIFJQX0FVRElPKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBhdWRjb20oYXY3MTEwLCBBVURJT19DTURfVU5NVVRFKTsKKwkJaWYgKCFyZXQpCisJCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BMQVlJTkc7CiAJCWJyZWFrOwogCiAJY2FzZSBBVURJT19QQVVTRToKLQkJYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOwotCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BBVVNFRDsKKwkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOworCQlpZiAoIXJldCkKKwkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fUEFVU0VEOwogCQlicmVhazsKIAogCWNhc2UgQVVESU9fQ09OVElOVUU6CiAJCWlmIChhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9PSBBVURJT19QQVVTRUQpIHsKIAkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fUExBWUlORzsKLQkJCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9NVVRFIHwgQVVESU9fQ01EX1BDTTE2KTsKKwkJCXJldCA9IGF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9VTk1VVEUgfCBBVURJT19DTURfUENNMTYpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMjEwLDE0ICsxMjQ0LDE1IEBACiAKIAljYXNlIEFVRElPX1NFVF9NVVRFOgogCXsKLQkJYXVkY29tKGF2NzExMCwgYXJnID8gQVVESU9fQ01EX01VVEUgOiBBVURJT19DTURfVU5NVVRFKTsKLQkJYXY3MTEwLT5hdWRpb3N0YXRlLm11dGVfc3RhdGUgPSAoaW50KSBhcmc7CisJCXJldCA9IGF1ZGNvbShhdjcxMTAsIGFyZyA/IEFVRElPX0NNRF9NVVRFIDogQVVESU9fQ01EX1VOTVVURSk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT5hdWRpb3N0YXRlLm11dGVfc3RhdGUgPSAoaW50KSBhcmc7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgQVVESU9fU0VUX0FWX1NZTkM6CiAJCWF2NzExMC0+YXVkaW9zdGF0ZS5BVl9zeW5jX3N0YXRlID0gKGludCkgYXJnOwotCQlhdWRjb20oYXY3MTEwLCBhcmcgPyBBVURJT19DTURfU1lOQ19PTiA6IEFVRElPX0NNRF9TWU5DX09GRik7CisJCXJldCA9IGF1ZGNvbShhdjcxMTAsIGFyZyA/IEFVRElPX0NNRF9TWU5DX09OIDogQVVESU9fQ01EX1NZTkNfT0ZGKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFVRElPX1NFVF9CWVBBU1NfTU9ERToKQEAgLTEyMjksMjEgKzEyNjQsMjQgQEAKIAogCQlzd2l0Y2goYXY3MTEwLT5hdWRpb3N0YXRlLmNoYW5uZWxfc2VsZWN0KSB7CiAJCWNhc2UgQVVESU9fU1RFUkVPOgotCQkJYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX1NURVJFTyk7Ci0JCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKLQkJCQlpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDIwLCAweDAyLCAweDQ5KTsKKwkJCXJldCA9IGF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9TVEVSRU8pOworCQkJaWYgKCFyZXQpCisJCQkJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX0NSWVNUQUwpCisJCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDkpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBVURJT19NT05PX0xFRlQ6Ci0JCQlhdWRjb20oYXY3MTEwLCBBVURJT19DTURfTU9OT19MKTsKLQkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQotCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NGEpOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01PTk9fTCk7CisJCQlpZiAoIXJldCkKKwkJCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKKwkJCQkJaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwMiwgMHg0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFVRElPX01PTk9fUklHSFQ6Ci0JCQlhdWRjb20oYXY3MTEwLCBBVURJT19DTURfTU9OT19SKTsKLQkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQotCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDUpOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01PTk9fUik7CisJCQlpZiAoIXJldCkKKwkJCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKKwkJCQkJaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwMiwgMHg0NSk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMTI2NCw4ICsxMzAyLDggQEAKIAkJZHZiX3JpbmdidWZmZXJfZmx1c2hfc3BpbmxvY2tfd2FrZXVwKCZhdjcxMTAtPmFvdXQpOwogCQlhdjcxMTBfaXBhY2tfcmVzZXQoJmF2NzExMC0+aXBhY2tbMF0pOwogCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCi0JCQkgICAgICAgX19QbGF5LCAyLCBBVl9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCSAgICBfX1BsYXksIDIsIEFWX1BFUywgMCk7CiAJCWJyZWFrOwogCWNhc2UgQVVESU9fU0VUX0lEOgogCkBAIC0xMjc0LDcgKzEzMTIsNyBAQAogCXsKIAkJc3RydWN0IGF1ZGlvX21peGVyICphbWl4ID0gKHN0cnVjdCBhdWRpb19taXhlciAqKXBhcmc7CiAKLQkJYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhbWl4LT52b2x1bWVfbGVmdCwgYW1peC0+dm9sdW1lX3JpZ2h0KTsKKwkJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhbWl4LT52b2x1bWVfbGVmdCwgYW1peC0+dm9sdW1lX3JpZ2h0KTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgQVVESU9fU0VUX1NUUkVBTVRZUEU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfYXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCmluZGV4IGNjNWU3YTcuLjQ1ZGMxNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCkBAIC0zLDE0ICszLDE0IEBACiAKIHN0cnVjdCBhdjcxMTA7CiAKLWV4dGVybiB2b2lkIGF2NzExMF9zZXRfdmlkbW9kZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBtb2RlKTsKK2V4dGVybiBpbnQgYXY3MTEwX3NldF92aWRtb2RlKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IG1vZGUpOwogCiBleHRlcm4gaW50IGF2NzExMF9yZWNvcmRfY2Ioc3RydWN0IGR2Yl9maWx0ZXJfcGVzMnRzICpwMnQsIHU4ICpidWYsIHNpemVfdCBsZW4pOwogZXh0ZXJuIGludCBhdjcxMTBfcGVzX3BsYXkodm9pZCAqZGVzdCwgc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpidWYsIGludCBkbGVuKTsKIGV4dGVybiBpbnQgYXY3MTEwX3dyaXRlX3RvX2RlY29kZXIoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKIAogZXh0ZXJuIGludCBhdjcxMTBfc2V0X3ZvbHVtZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCB2b2xsZWZ0LCBpbnQgdm9scmlnaHQpOwotZXh0ZXJuIHZvaWQgYXY3MTEwX2F2X3N0b3Aoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYpOworZXh0ZXJuIGludCBhdjcxMTBfYXZfc3RvcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBhdik7CiBleHRlcm4gaW50IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYsCiAJCQkgIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCk7CiBleHRlcm4gaW50IGF2NzExMF9hdl9zdGFydF9wbGF5KHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKaW5kZXggN2ZhNGEwZS4uMTIyMDgyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogCQkJcmV0dXJuIDA7CiAJCXVkZWxheSg1KTsKIAl9Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRVRJTUVET1VUOwogfQogCiBzdGF0aWMgaW50IGxvYWRfZHJhbShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiAqZGF0YSwgaW50IGxlbikKQEAgLTE1NSw3ICsxNTUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBibG9ja3M7IGkrKykgewogCQlpZiAod2FpdGRlYmkoYXY3MTEwLCBCT09UX1NUQVRFLCBCT09UU1RBVEVfQlVGRkVSX0VNUFRZKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBsb2FkX2RyYW0oKTogdGltZW91dCBhdCBibG9jayAlZFxuIiwgaSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQlkcHJpbnRrKDQsICJ3cml0aW5nIERSQU0gYmxvY2sgJWRcbiIsIGkpOwogCQltd2RlYmkoYXY3MTEwLCBERUJJU1dBQiwgYm9vdGJsb2NrLApAQCAtMTcwLDcgKzE3MCw3IEBACiAJaWYgKHJlc3QgPiAwKSB7CiAJCWlmICh3YWl0ZGViaShhdjcxMTAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGxvYWRfZHJhbSgpOiB0aW1lb3V0IGF0IGxhc3QgYmxvY2tcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJaWYgKHJlc3QgPiA0KQogCQkJbXdkZWJpKGF2NzExMCwgREVCSVNXQUIsIGJvb3RibG9jaywKQEAgLTE4NSwxMyArMTg1LDEzIEBACiAJfQogCWlmICh3YWl0ZGViaShhdjcxMTAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogbG9hZF9kcmFtKCk6IHRpbWVvdXQgYWZ0ZXIgbGFzdCBibG9ja1xuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJPT1RfU0laRSwgMCwgMik7CiAJaXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JVRkZFUl9GVUxMLCAyKTsKIAlpZiAod2FpdGRlYmkoYXY3MTEwLCBCT09UX1NUQVRFLCBCT09UU1RBVEVfQk9PVF9DT01QTEVURSkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBsb2FkX2RyYW0oKTogZmluYWwgaGFuZHNoYWtlIHRpbWVvdXRcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI2Myw3ICsyNjMsNyBAQAogCWlmIChzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZShhdjcxMTAtPmRldiwgMSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGF2NzExMF9ib290YXJtKCk6ICIKIAkJICAgICAgICJzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZSgpIHRpbWVkIG91dFxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIFJFU0VUX0xJTkUsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJbWRlbGF5KDEpOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJaWYgKHNhYTcxNDZfd2FpdF9mb3JfZGViaV9kb25lKGF2NzExMC0+ZGV2LCAxKSkgewogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogYXY3MTEwX2Jvb3Rhcm0oKTogIgogCQkgICAgICAgInNhYTcxNDZfd2FpdF9mb3JfZGViaV9kb25lKCkgdGltZWQgb3V0IGFmdGVyIGxvYWRpbmcgRFJBTVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIFJFU0VUX0xJTkUsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJbXNsZWVwKDMwKTsJLyogdGhlIGZpcm13YXJlIG5lZWRzIHNvbWUgdGltZSB0byBpbml0aWFsaXplICovCkBAIC0zMDgsNiArMzA4LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXUzMiBzdGF0OworCWludCBlcnI7CiAKIAlpZiAoRldfVkVSU0lPTihhdjcxMTAtPmFybV9hcHApIDw9IDB4MjYxYykgewogCQkvKiBub3Qgc3VwcG9ydGVkIGJ5IG9sZCBmaXJtd2FyZSAqLwpAQCAtMzE4LDE3ICszMTksMTcgQEAKIAkvKiBuZXcgZmlybXdhcmUgKi8KIAlzdGFydCA9IGppZmZpZXM7CiAJZm9yICg7OykgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfRlJFRSk7CiAJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+ZGNvbWxvY2spKQogCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAkJc3RhdCA9IHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgTVNHU1RBVEUsIDAsIDIpOwogCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCWlmICgoc3RhdCAmIGZsYWdzKSA9PSAwKSB7CisJCWlmICgoc3RhdCAmIGZsYWdzKSA9PSAwKQogCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgeworCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIE1TR1NUQVRFICUwNHhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBzdGF0ICYgZmxhZ3MpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJbXNsZWVwKDEpOwogCX0KQEAgLTM0Miw2ICszNDMsNyBAQAogCWNoYXIgKnR5cGUgPSBOVUxMOwogCXUxNiBmbGFnc1syXSA9IHswLCAwfTsKIAl1MzIgc3RhdDsKKwlpbnQgZXJyOwogCiAvLwlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIApAQCAtMzUxLDI0ICszNTMsMzAgQEAKIAl9CiAKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXMoKTogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EIGlkbGVcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogCiAJd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01fSUZfTE9DSywgMHhmZmZmLCAyKTsKIAogI2lmbmRlZiBfTk9IQU5EU0hBS0UKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgSEFORFNIQUtFX1JFRywgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSkpIHsKKwl3aGlsZSAoMSkgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfU0hBS0UpOworCQlpZiAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBIQU5EU0hBS0VfUkVHLCAwLCAyKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiAlcygpOiB0aW1lb3V0IHdhaXRpbmcgZm9yIEhBTkRTSEFLRV9SRUdcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogI2VuZGlmCiAKQEAgLTQwMSw2ICs0MDksNyBAQAogCQkvKiBub24taW1tZWRpYXRlIENPTU1BTkQgdHlwZSAqLwogCQlzdGFydCA9IGppZmZpZXM7CiAJCWZvciAoOzspIHsKKwkJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKIAkJCXN0YXQgPSByZGViaShhdjcxMTAsIERFQklOT1NXQVAsIE1TR1NUQVRFLCAwLCAyKTsKIAkJCWlmIChzdGF0ICYgZmxhZ3NbMF0pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBRVUVVRSBvdmVyZmxvd1xuIiwKQEAgLTQwOSwxMCArNDE4LDEwIEBACiAJCQl9CiAJCQlpZiAoKHN0YXQgJiBmbGFnc1sxXSkgPT0gMCkKIAkJCQlicmVhazsKLQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfRlJFRSkpIHsKKwkJCWlmIChlcnIpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgb24gYnVzeSAlcyBRVUVVRVxuIiwKIAkJCQkJX19GVU5DVElPTl9fLCB0eXBlKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCQl9CiAJCQltc2xlZXAoMSk7CiAJCX0KQEAgLTQzMiwxMyArNDQxLDE2IEBACiAKICNpZmRlZiBDT01fREVCVUcKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IHRpbWVvdXQgd2FpdGluZyBmb3IgQ09NTUFORCB0byBjb21wbGV0ZVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXMoKTogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EICVkIHRvIGNvbXBsZXRlXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgKGJ1ZlswXSA+PiA4KSAmIDB4ZmYpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KKwkJbXNsZWVwKDEpOwogCX0KIAogCXN0YXQgPSByZGViaShhdjcxMTAsIERFQklOT1NXQVAsIE1TR1NUQVRFLCAwLCAyKTsKQEAgLTQ3MCw3ICs0ODIsNyBAQAogCiAJcmV0ID0gX19hdjcxMTBfc2VuZF9md19jbWQoYXY3MTEwLCBidWYsIGxlbmd0aCk7CiAJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCWlmIChyZXQpCisJaWYgKHJldCAmJiByZXQhPS1FUkVTVEFSVFNZUykKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IGF2NzExMF9zZW5kX2Z3X2NtZCBlcnJvciAlZFxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtNDk1LDcgKzUwNyw3IEBACiAJfQogCiAJcmV0ID0gYXY3MTEwX3NlbmRfZndfY21kKGF2NzExMCwgYnVmLCBudW0gKyAyKTsKLQlpZiAocmV0KQorCWlmIChyZXQgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGF2NzExMF9md19jbWQgZXJyb3IgJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUxOCw3ICs1MzAsNyBAQAogCX0KIAogCXJldCA9IGF2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGNtZCwgMTgpOwotCWlmIChyZXQpCisJaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogYXY3MTEwX3NlbmRfY2lfY21kIGVycm9yICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CkBAIC01NTEsMjYgKzU2MywzMiBAQAogCX0KIAogCXN0YXJ0ID0gamlmZmllczsKLQl3aGlsZSAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01NQU5ELCAwLCAyKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIENPTU1BTkQgdG8gY29tcGxldGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQogI2lmZGVmIF9OT0hBTkRTSEFLRQogCQltc2xlZXAoMSk7CiAjZW5kaWYKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EIHRvIGNvbXBsZXRlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCQkJcmV0dXJuIC0xOwotCQl9CiAJfQogCiAjaWZuZGVmIF9OT0hBTkRTSEFLRQogCXN0YXJ0ID0gamlmZmllczsKLQl3aGlsZSAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBIQU5EU0hBS0VfUkVHLCAwLCAyICkpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX1NIQUtFKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEhBTkRTSEFLRV9SRUcsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBIQU5EU0hBS0VfUkVHXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KKwkJbXNsZWVwKDEpOwogCX0KICNlbmRpZgogCkBAIC02NjcsMTAgKzY4NSwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJYnVmW2kgKyA0XSA9IG1zZ1tpXTsKIAotCWlmICgocmV0ID0gYXY3MTEwX3NlbmRfZndfY21kKGF2NzExMCwgYnVmLCAxOCkpKQorCXJldCA9IGF2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGJ1ZiwgMTgpOworCWlmIChyZXQgJiYgcmV0IT0tRVJFU1RBUlRTWVMpCiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBhdjcxMTBfZGlzZXFjX3NlbmQgZXJyb3IgJWRcbiIsIHJldCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTcwNSwxOCArNzIzLDIyIEBACiBzdGF0aWMgaW50IEZsdXNoVGV4dChzdHJ1Y3QgYXY3MTEwICphdjcxMTApCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgZXJyOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXY3MTEwLT5kY29tbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJc3RhcnQgPSBqaWZmaWVzOwotCXdoaWxlIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJVRkYxX0JBU0UsIDAsIDIpKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9PU0QpKSB7CisJd2hpbGUgKDEpIHsKKwkJZXJyID0gdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX09TRCk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJVRkYxX0JBU0UsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IHRpbWVvdXQgd2FpdGluZyBmb3IgQlVGRjFfQkFTRSA9PSAwXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKIAlyZXR1cm4gMDsKQEAgLTczMywyNSArNzU1LDMxIEBACiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSwgMCwgMikpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX09TRCkpIHsKKwl3aGlsZSAoMSkgeworCQlyZXQgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfT1NEKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAocmV0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgQlVGRjFfQkFTRSA9PSAwXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogI2lmbmRlZiBfTk9IQU5EU0hBS0UKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgSEFORFNIQUtFX1JFRywgMCwgMikpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX1NIQUtFKSkgeworCXdoaWxlICgxKSB7CisJCXJldCA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEhBTkRTSEFLRV9SRUcsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIEhBTkRTSEFLRV9SRUdcbiIsCiAJCQkgICAgICAgX19GVU5DVElPTl9fKTsKIAkJCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CisJCW1zbGVlcCgxKTsKIAl9CiAjZW5kaWYKIAlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIC8gMjsgaSsrKQpAQCAtNzYxLDcgKzc4OSw3IEBACiAJCXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSArIGkgKiAyLCAwLCAyKTsKIAlyZXQgPSBfX2F2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGNidWYsIDUpOwogCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKLQlpZiAocmV0KQorCWlmIChyZXQgJiYgcmV0IT0tRVJFU1RBUlRTWVMpCiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBXcml0ZVRleHQgZXJyb3IgJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgxNiw5ICs4NDQsMjUgQEAKIAlPU0RfQklUTUFQMSwgT1NEX0JJVE1BUDIsIDAsIE9TRF9CSVRNQVA0LCAwLCAwLCAwLCBPU0RfQklUTUFQOAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgTG9hZEJpdG1hcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiBmb3JtYXQsCitzdGF0aWMgaW5saW5lIGludCBXYWl0VW50aWxCbXBMb2FkZWQoc3RydWN0IGF2NzExMCAqYXY3MTEwKQoreworCWludCByZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdjcxMTAtPmJtcHEsCisJCQkJYXY3MTEwLT5ibXBfc3RhdGUgIT0gQk1QX0xPQURJTkcsIDEwKkhaKTsKKwlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApIHsKKwkJcHJpbnRrKCJkdmItdHRwY2k6IHdhcm5pbmc6IHRpbWVvdXQgd2FpdGluZyBpbiBMb2FkQml0bWFwOiAlZCwgJWRcbiIsCisJCSAgICAgICByZXQsIGF2NzExMC0+Ym1wX3N0YXRlKTsKKwkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBMb2FkQml0bWFwKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwKIAkJCSAgICAgdTE2IGR4LCB1MTYgZHksIGludCBpbmMsIHU4IF9fdXNlciAqIGRhdGEpCiB7CisJdTE2IGZvcm1hdDsKIAlpbnQgYnBwOwogCWludCBpOwogCWludCBkLCBkZWx0YTsKQEAgLTgyNywxNCArODcxLDcgQEAKIAogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwogCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXY3MTEwLT5ibXBxLCBhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BRElORywgSFopOwotCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTIHx8IHJldCA9PSAwKSB7Ci0JCXByaW50aygiZHZiLXR0cGNpOiB3YXJuaW5nOiB0aW1lb3V0IHdhaXRpbmcgaW4gTG9hZEJpdG1hcDogJWQsICVkXG4iLAotCQkgICAgICAgcmV0LCBhdjcxMTAtPmJtcF9zdGF0ZSk7Ci0JCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAtMTsKLQl9Ci0JQlVHX09OIChhdjcxMTAtPmJtcF9zdGF0ZSA9PSBCTVBfTE9BRElORyk7CisJZm9ybWF0ID0gYnBwMmJpdFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dOwogCiAJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTE9BRElORzsKIAlpZgkoZm9ybWF0ID09IE9TRF9CSVRNQVA4KSB7CkBAIC04NDcsMTggKzg4NCwxOCBAQAogCQlicHA9MTsgZGVsdGEgPSA4OwogCX0gZWxzZSB7CiAJCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWF2NzExMC0+Ym1wbGVuID0gKChkeCAqIGR5ICogYnBwICsgNykgJiB+NykgLyA4OwogCWF2NzExMC0+Ym1wcCA9IDA7CiAJaWYgKGF2NzExMC0+Ym1wbGVuID4gMzI3NjgpIHsKIAkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGR5OyBpKyspIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGF2NzExMC0+Ym1wYnVmICsgMTAyNCArIGkgKiBkeCwgZGF0YSArIGkgKiBpbmMsIGR4KSkgewogCQkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCWlmIChmb3JtYXQgIT0gT1NEX0JJVE1BUDgpIHsKQEAgLTg3MywzNyArOTEwLDI3IEBACiAJfQogCWF2NzExMC0+Ym1wbGVuICs9IDEwMjQ7CiAJZHByaW50ayg0LCAiYXY3MTEwX2Z3X2NtZDogTG9hZEJtcCBzaXplICVkXG4iLCBhdjcxMTAtPmJtcGxlbik7Ci0JcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgTG9hZEJtcCwgMywgZm9ybWF0LCBkeCwgZHkpOworCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgTG9hZEJtcCwgMywgZm9ybWF0LCBkeCwgZHkpOworCWlmICghcmV0KQorCQlyZXQgPSBXYWl0VW50aWxCbXBMb2FkZWQoYXY3MTEwKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IEJsaXRCaXRtYXAoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgd2luLCB1MTYgeCwgdTE2IHksIHUxNiB0cmFucykKK3N0YXRpYyBpbnQgQmxpdEJpdG1hcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiB4LCB1MTYgeSkKIHsKLQlpbnQgcmV0OwotCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKLQlCVUdfT04gKGF2NzExMC0+Ym1wX3N0YXRlID09IEJNUF9OT05FKTsKLQotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF2NzExMC0+Ym1wcSwKLQkJCQlhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BRElORywgMTAqSFopOwotCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTIHx8IHJldCA9PSAwKSB7Ci0JCXByaW50aygiZHZiLXR0cGNpOiB3YXJuaW5nOiB0aW1lb3V0IHdhaXRpbmcgaW4gQmxpdEJpdG1hcDogJWQsICVkXG4iLAotCQkgICAgICAgcmV0LCBhdjcxMTAtPmJtcF9zdGF0ZSk7Ci0JCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAocmV0ID09IDApID8gLUVUSU1FRE9VVCA6IHJldDsKLQl9Ci0KLQlCVUdfT04gKGF2NzExMC0+Ym1wX3N0YXRlICE9IEJNUF9MT0FERUQpOwotCi0JcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgQmxpdEJtcCwgNCwgd2luLCB4LCB5LCB0cmFucyk7CisJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgQmxpdEJtcCwgNCwgYXY3MTEwLT5vc2R3aW4sIHgsIHksIDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBSZWxlYXNlQml0bWFwKHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAotCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BREVEKQorCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BREVEICYmIEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA8IDB4MjYxZSkKIAkJcmV0dXJuIC0xOworCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSA9PSBCTVBfTE9BRElORykKKwkJZHByaW50aygxLCJSZWxlYXNlQml0bWFwIGNhbGxlZCB3aGlsZSBCTVBfTE9BRElOR1xuIik7CiAJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKIAlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfT1NELCBSZWxlYXNlQm1wLCAwKTsKIH0KQEAgLTkyNCwxOCArOTUxLDIyIEBACiAJcmV0dXJuIENyIHwgKENiIDw8IDE2KSB8IChZIDw8IDgpOwogfQogCi1zdGF0aWMgdm9pZCBPU0RTZXRDb2xvcihzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4IGNvbG9yLCB1OCByLCB1OCBnLCB1OCBiLCB1OCBibGVuZCkKK3N0YXRpYyBpbnQgT1NEU2V0Q29sb3Ioc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1OCBjb2xvciwgdTggciwgdTggZywgdTggYiwgdTggYmxlbmQpCiB7CisJaW50IHJldDsKKwogCXUxNiBjaCwgY2w7CiAJdTMyIHl1djsKIAogCXl1diA9IGJsZW5kID8gUkdCMllVVihyLGcsYikgOiAwOwogCWNsID0gKHl1diAmIDB4ZmZmZik7CiAJY2ggPSAoKHl1diA+PiAxNikgJiAweGZmZmYpOwotCVNldENvbG9yXyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBicHAycGFsW2F2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXV0sCi0JCSAgY29sb3IsIGNoLCBjbCk7Ci0JU2V0QmxlbmRfKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGJwcDJwYWxbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKLQkJICBjb2xvciwgKChibGVuZCA+PiA0KSAmIDB4MGYpKTsKKwlyZXQgPSBTZXRDb2xvcl8oYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgYnBwMnBhbFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dLAorCQkJY29sb3IsIGNoLCBjbCk7CisJaWYgKCFyZXQpCisJCXJldCA9IFNldEJsZW5kXyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBicHAycGFsW2F2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXV0sCisJCQkJY29sb3IsICgoYmxlbmQgPj4gNCkgJiAweDBmKSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBPU0RTZXRQYWxldHRlKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIF9fdXNlciAqIGNvbG9ycywgdTggZmlyc3QsIHU4IGxhc3QpCkBAIC05NjgsMTQgKzk5OSwxNCBAQAogewogCXVpbnQgdywgaCwgYnBwLCBicGwsIHNpemUsIGxwYiwgYm51bSwgYnJlc3Q7CiAJaW50IGk7Ci0JaW50IHJjOworCWludCByYyxyZWxlYXNlX3JjOwogCiAJdyA9IHgxIC0geDAgKyAxOwogCWggPSB5MSAtIHkwICsgMTsKIAlpZiAoaW5jIDw9IDApCiAJCWluYyA9IHc7CiAJaWYgKHcgPD0gMCB8fCB3ID4gNzIwIHx8IGggPD0gMCB8fCBoID4gNTc2KQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCWJwcCA9IGF2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXSArIDE7CiAJYnBsID0gKCh3ICogYnBwICsgNykgJiB+NykgLyA4OwogCXNpemUgPSBoICogYnBsOwpAQCAtOTgzLDE3NiArMTAxNCwxODYgQEAKIAlibnVtID0gc2l6ZSAvIChscGIgKiBicGwpOwogCWJyZXN0ID0gc2l6ZSAtIGJudW0gKiBscGIgKiBicGw7CiAKKwlpZiAoYXY3MTEwLT5ibXBfc3RhdGUgPT0gQk1QX0xPQURJTkcpIHsKKwkJLyogcG9zc2libGUgaWYgc3lzY2FsbCBpcyByZXBlYXRlZCBieSAtRVJFU1RBUlRTWVMgYW5kIGlmIGZpcm13YXJlIGNhbm5vdCBhYm9ydCAqLworCQlCVUdfT04gKEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA+PSAweDI2MWUpOworCQlyYyA9IFdhaXRVbnRpbEJtcExvYWRlZChhdjcxMTApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCS8qIGp1c3QgY29udGludWUuIFRoaXMgc2hvdWxkIHdvcmsgZm9yIGFsbCBmdyB2ZXJzaW9ucworCQkgKiBpZiBibnVtPT0xICYmICFicmVzdCAmJiBMb2FkQml0bWFwIHdhcyBzdWNjZXNzZnVsCisJCSAqLworCX0KKworCXJjID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgYm51bTsgaSsrKSB7Ci0JCXJjID0gTG9hZEJpdG1hcChhdjcxMTAsIGJwcDJiaXRbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKLQkJCSAgIHcsIGxwYiwgaW5jLCBkYXRhKTsKKwkJcmMgPSBMb2FkQml0bWFwKGF2NzExMCwgdywgbHBiLCBpbmMsIGRhdGEpOwogCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JCXJjID0gQmxpdEJpdG1hcChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCB4MCwgeTAgKyBpICogbHBiLCAwKTsKKwkJCWJyZWFrOworCQlyYyA9IEJsaXRCaXRtYXAoYXY3MTEwLCB4MCwgeTAgKyBpICogbHBiKTsKIAkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOworCQkJYnJlYWs7CiAJCWRhdGEgKz0gbHBiICogaW5jOwogCX0KLQlpZiAoYnJlc3QpIHsKLQkJcmMgPSBMb2FkQml0bWFwKGF2NzExMCwgYnBwMmJpdFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dLAotCQkJICAgdywgYnJlc3QgLyBicGwsIGluYywgZGF0YSk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQkJcmMgPSBCbGl0Qml0bWFwKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIHgwLCB5MCArIGJudW0gKiBscGIsIDApOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7CisJaWYgKCFyYyAmJiBicmVzdCkgeworCQlyYyA9IExvYWRCaXRtYXAoYXY3MTEwLCB3LCBicmVzdCAvIGJwbCwgaW5jLCBkYXRhKTsKKwkJaWYgKCFyYykKKwkJCXJjID0gQmxpdEJpdG1hcChhdjcxMTAsIHgwLCB5MCArIGJudW0gKiBscGIpOwogCX0KLQlSZWxlYXNlQml0bWFwKGF2NzExMCk7Ci0JcmV0dXJuIDA7CisJcmVsZWFzZV9yYyA9IFJlbGVhc2VCaXRtYXAoYXY3MTEwKTsKKwlpZiAoIXJjKQorCQlyYyA9IHJlbGVhc2VfcmM7CisJaWYgKHJjKQorCQlkcHJpbnRrKDEsInJldHVybnMgJWRcbiIscmMpOworCXJldHVybiByYzsKIH0KIAogaW50IGF2NzExMF9vc2RfY21kKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgb3NkX2NtZF90ICpkYykKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhdjcxMTAtPm9zZF9zZW1hKTsKLQlpZiAocmV0KQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+b3NkX3NlbWEpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JLyogc3R1cGlkLCBidXQgT1NEIGZ1bmN0aW9ucyBkb24ndCBwcm92aWRlIGEgcmV0dXJuIGNvZGUgYW55d2F5ICovCi0JcmV0ID0gMDsKLQogCXN3aXRjaCAoZGMtPmNtZCkgewogCWNhc2UgT1NEX0Nsb3NlOgotCQlEZXN0cm95T1NEV2luZG93KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRGVzdHJveU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfT3BlbjoKIAkJYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dID0gKGRjLT5jb2xvciAtIDEpICYgNzsKLQkJQ3JlYXRlT1NEV2luZG93KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sCisJCXJldCA9IENyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAogCQkJCWJwcDJiaXRbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKIAkJCQlkYy0+eDEgLSBkYy0+eDAgKyAxLCBkYy0+eTEgLSBkYy0+eTAgKyAxKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOwogCQlpZiAoIWRjLT5kYXRhKSB7Ci0JCQlNb3ZlV2luZG93QWJzKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwKTsKLQkJCVNldENvbG9yQmxlbmQoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbik7CisJCQlyZXQgPSBNb3ZlV2luZG93QWJzKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlyZXQgPSBTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwogCQl9Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TaG93OgotCQlNb3ZlV2luZG93UmVsKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDApOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gTW92ZVdpbmRvd1JlbChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAwLCAwKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfSGlkZToKLQkJSGlkZVdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKLQkJZ290byBvdXQ7CisJCXJldCA9IEhpZGVXaW5kb3coYXY3MTEwLCBhdjcxMTAtPm9zZHdpbik7CisJCWJyZWFrOwogCWNhc2UgT1NEX0NsZWFyOgotCQlEcmF3QmxvY2soYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgMCwgMCwgNzIwLCA1NzYsIDApOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCAwKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfRmlsbDoKLQkJRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCBkYy0+Y29sb3IpOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCBkYy0+Y29sb3IpOworCQlicmVhazsKIAljYXNlIE9TRF9TZXRDb2xvcjoKLQkJT1NEU2V0Q29sb3IoYXY3MTEwLCBkYy0+Y29sb3IsIGRjLT54MCwgZGMtPnkwLCBkYy0+eDEsIGRjLT55MSk7Ci0JCWdvdG8gb3V0OworCQlyZXQgPSBPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciwgZGMtPngwLCBkYy0+eTAsIGRjLT54MSwgZGMtPnkxKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfU2V0UGFsZXR0ZToKLQl7Ci0JCWlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPj0gMHgyNjE4KSB7CisJCWlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPj0gMHgyNjE4KQogCQkJcmV0ID0gT1NEU2V0UGFsZXR0ZShhdjcxMTAsIGRjLT5kYXRhLCBkYy0+Y29sb3IsIGRjLT54MCk7Ci0JCQlnb3RvIG91dDsKLQkJfSBlbHNlIHsKKwkJZWxzZSB7CiAJCQlpbnQgaSwgbGVuID0gZGMtPngwLWRjLT5jb2xvcisxOwogCQkJdTggX191c2VyICpjb2xvcnMgPSAodTggX191c2VyICopZGMtPmRhdGE7CiAJCQl1OCByLCBnLCBiLCBibGVuZDsKLQorCQkJcmV0ID0gMDsKIAkJCWZvciAoaSA9IDA7IGk8bGVuOyBpKyspIHsKIAkJCQlpZiAoZ2V0X3VzZXIociwgY29sb3JzICsgaSAqIDQpIHx8CiAJCQkJICAgIGdldF91c2VyKGcsIGNvbG9ycyArIGkgKiA0ICsgMSkgfHwKIAkJCQkgICAgZ2V0X3VzZXIoYiwgY29sb3JzICsgaSAqIDQgKyAyKSB8fAogCQkJCSAgICBnZXRfdXNlcihibGVuZCwgY29sb3JzICsgaSAqIDQgKyAzKSkgewogCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCQlnb3RvIG91dDsKKwkJCQkJYnJlYWs7CiAJCQkJICAgIH0KLQkJCQlPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciArIGksIHIsIGcsIGIsIGJsZW5kKTsKKwkJCQlyZXQgPSBPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciArIGksIHIsIGcsIGIsIGJsZW5kKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKIAkJCX0KIAkJfQotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0JY2FzZSBPU0RfU2V0VHJhbnM6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TZXRQaXhlbDoKLQkJRHJhd0xpbmUoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwKKwkJcmV0ID0gRHJhd0xpbmUoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwKIAkJCSBkYy0+eDAsIGRjLT55MCwgMCwgMCwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7Ci0JY2FzZSBPU0RfR2V0UGl4ZWw6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TZXRSb3c6CiAJCWRjLT55MSA9IGRjLT55MDsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBPU0RfU2V0QmxvY2s6CiAJCXJldCA9IE9TRFNldEJsb2NrKGF2NzExMCwgZGMtPngwLCBkYy0+eTAsIGRjLT54MSwgZGMtPnkxLCBkYy0+Y29sb3IsIGRjLT5kYXRhKTsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX0ZpbGxSb3c6Ci0JCURyYXdCbG9jayhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCwKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLAogCQkJICBkYy0+eDEtZGMtPngwKzEsIGRjLT55MSwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX0ZpbGxCbG9jazoKLQkJRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLAorCQlyZXQgPSBEcmF3QmxvY2soYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgZGMtPngwLCBkYy0+eTAsCiAJCQkgIGRjLT54MSAtIGRjLT54MCArIDEsIGRjLT55MSAtIGRjLT55MCArIDEsIGRjLT5jb2xvcik7Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9MaW5lOgotCQlEcmF3TGluZShhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAorCQlyZXQgPSBEcmF3TGluZShhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAogCQkJIGRjLT54MCwgZGMtPnkwLCBkYy0+eDEgLSBkYy0+eDAsIGRjLT55MSAtIGRjLT55MCwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7Ci0JY2FzZSBPU0RfUXVlcnk6Ci0JCWdvdG8gb3V0OwotCWNhc2UgT1NEX1Rlc3Q6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9UZXh0OgogCXsKIAkJY2hhciB0ZXh0YnVmWzI0MF07CiAKIAkJaWYgKHN0cm5jcHlfZnJvbV91c2VyKHRleHRidWYsIGRjLT5kYXRhLCAyNDApIDwgMCkgewogCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCX0KIAkJdGV4dGJ1ZlsyMzldID0gMDsKIAkJaWYgKGRjLT54MSA+IDMpCiAJCQlkYy0+eDEgPSAzOwotCQlTZXRGb250KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MSwKKwkJcmV0ID0gU2V0Rm9udChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDEsCiAJCQkodTE2KSAoZGMtPmNvbG9yICYgMHhmZmZmKSwgKHUxNikgKGRjLT5jb2xvciA+PiAxNikpOwotCQlGbHVzaFRleHQoYXY3MTEwKTsKLQkJV3JpdGVUZXh0KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLCB0ZXh0YnVmKTsKLQkJZ290byBvdXQ7CisJCWlmICghcmV0KQorCQkJcmV0ID0gRmx1c2hUZXh0KGF2NzExMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gV3JpdGVUZXh0KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLCB0ZXh0YnVmKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgT1NEX1NldFdpbmRvdzoKLQkJaWYgKGRjLT54MCA8IDEgfHwgZGMtPngwID4gNykgeworCQlpZiAoZGMtPngwIDwgMSB8fCBkYy0+eDAgPiA3KQogCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OworCQllbHNlIHsKKwkJCWF2NzExMC0+b3Nkd2luID0gZGMtPngwOworCQkJcmV0ID0gMDsKIAkJfQotCQlhdjcxMTAtPm9zZHdpbiA9IGRjLT54MDsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX01vdmVXaW5kb3c6Ci0JCU1vdmVXaW5kb3dBYnMoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgZGMtPngwLCBkYy0+eTApOwotCQlTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gU2V0Q29sb3JCbGVuZChhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfT3BlblJhdzoKIAkJaWYgKGRjLT5jb2xvciA8IE9TRF9CSVRNQVAxIHx8IGRjLT5jb2xvciA+IE9TRF9DVVJTT1IpIHsKIAkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmIChkYy0+Y29sb3IgPj0gT1NEX0JJVE1BUDEgJiYgZGMtPmNvbG9yIDw9IE9TRF9CSVRNQVA4SFIpIHsKKwkJaWYgKGRjLT5jb2xvciA+PSBPU0RfQklUTUFQMSAmJiBkYy0+Y29sb3IgPD0gT1NEX0JJVE1BUDhIUikKIAkJCWF2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXSA9ICgxIDw8IChkYy0+Y29sb3IgJiAzKSkgLSAxOwotCQl9Ci0JCWVsc2UgeworCQllbHNlCiAJCQlhdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl0gPSAwOwotCQl9Ci0JCUNyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAob3NkX3Jhd193aW5kb3dfdClkYy0+Y29sb3IsCisJCXJldCA9IENyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAob3NkX3Jhd193aW5kb3dfdClkYy0+Y29sb3IsCiAJCQkJZGMtPngxIC0gZGMtPngwICsgMSwgZGMtPnkxIC0gZGMtPnkwICsgMSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKIAkJaWYgKCFkYy0+ZGF0YSkgewotCQkJTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7Ci0JCQlTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOworCQkJcmV0ID0gTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwogCQl9Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKKwkJYnJlYWs7CiAJfQogCi1vdXQ6CiAJdXAoJmF2NzExMC0+b3NkX3NlbWEpOworCWlmIChyZXQ9PS1FUkVTVEFSVFNZUykKKwkJZHByaW50aygxLCAiYXY3MTEwX29zZF9jbWQoJWQpIHJldHVybnMgd2l0aCAtRVJFU1RBUlRTWVNcbiIsZGMtPmNtZCk7CisJZWxzZSBpZiAocmV0KQorCQlkcHJpbnRrKDEsICJhdjcxMTBfb3NkX2NtZCglZCkgcmV0dXJucyB3aXRoICVkXG4iLGRjLT5jbWQscmV0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKaW5kZXggNTIwNjFlMS4uZmVkZDIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKQEAgLTQ1OCwyNyArNDU4LDI3IEBACiAJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0FVRElPREFDLCBBdWRpb0RBQywgMiwgYWRkciwgZGF0YSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdjc3MTBfc2V0X3ZpZGVvX21vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKK3N0YXRpYyBpbmxpbmUgaW50IGF2NzcxMF9zZXRfdmlkZW9fbW9kZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBtb2RlKQogewotCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0VOQ09ERVIsIFNldFZpZE1vZGUsIDEsIG1vZGUpOworCXJldHVybiBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9FTkNPREVSLCBTZXRWaWRNb2RlLCAxLCBtb2RlKTsKIH0KIAotc3RhdGljIGludCBpbmxpbmUgdmlkY29tKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGNvbSwgdTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgaW50IHZpZGNvbShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBjb20sIHUzMiBhcmcpCiB7CiAJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX01JU0MsIEFWNzExMF9GV19WSURFT19DT01NQU5ELCA0LAogCQkJICAgICAoY29tPj4xNiksIChjb20mMHhmZmZmKSwKIAkJCSAgICAgKGFyZz4+MTYpLCAoYXJnJjB4ZmZmZikpOwogfQogCi1zdGF0aWMgaW50IGlubGluZSBhdWRjb20oc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgY29tKQorc3RhdGljIGlubGluZSBpbnQgYXVkY29tKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGNvbSkKIHsKIAlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfTUlTQywgQVY3MTEwX0ZXX0FVRElPX0NPTU1BTkQsIDIsCiAJCQkgICAgIChjb20+PjE2KSwgKGNvbSYweGZmZmYpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIFNldDIySyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBzdGF0ZSkKK3N0YXRpYyBpbmxpbmUgaW50IFNldDIySyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBzdGF0ZSkKIHsKLQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgKHN0YXRlID8gT04yMksgOiBPRkYyMkspLCAwKTsKKwlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfQVVESU9EQUMsIChzdGF0ZSA/IE9OMjJLIDogT0ZGMjJLKSwgMCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lwYWNrLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYwppbmRleCAyNDY2NDA3Li42OTllZjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYwpAQCAtMjQsNyArMjQsNyBAQAogCQkgICAgICB2b2lkICgqZnVuYykodTggKmJ1ZiwgaW50IHNpemUsIHZvaWQgKnByaXYpKQogewogCWlmICghKHAtPmJ1ZiA9IHZtYWxsb2Moc2l6ZSpzaXplb2YodTgpKSkpIHsKLQkJcHJpbnRrICgiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpcGFja1xuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgaXBhY2tcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcC0+c2l6ZSA9IHNpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCmluZGV4IDZlMGY1ZDMuLjk3NDZkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCkBAIC01NzAsOSArNTcwLDkgQEAKIAogCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwogCWJ1ZlsxXSA9IGRpdiAmIDB4ZmY7Ci0JYnVmWzJdID0gMHg4ZTsKLQlidWZbM10gPSAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzQ1MDAwMDAgPyAweGExIDoKLQkJICBwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ1NDAwMDAwMCA/IDB4OTIgOiAweDM0KTsKKwlidWZbMl0gPSAweDg2OworCWJ1ZlszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE1MDAwMDAwMCA/IDB4MDEgOgorCQkgIHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDQ1MDAwMDAwID8gMHgwMiA6IDB4MDQpOwogCiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CkBAIC02OTUsOCArNjk1LDEyIEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDgsCiAJLmludmVydCA9IDEsCiAJLmludmVydF9vY2xrID0gMSwKKwkueHRhbF9mcmVxID0gVERBMTAwNDZfWFRBTF80TSwKKwkuYWdjX2NvbmZpZyA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAorCS5pZl9mcmVxID0gVERBMTAwNDZfRlJFUV8zNjE3LAogCS5wbGxfaW5pdCA9IHBoaWxpcHNfdHUxMjE2X3BsbF9pbml0LAogCS5wbGxfc2V0ID0gcGhpbGlwc190dTEyMTZfcGxsX3NldCwKKwkucGxsX3NsZWVwID0gTlVMTCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdHUxMjE2X3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCkBAIC0xMDE4LDcgKzEwMjIsNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV90YmwpOwogCiBzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uIGJ1ZGdldF9leHRlbnNpb24gPSB7Ci0JLm5hbWUgPSAiYnVkZ2V0IGR2YiAvdyB2aWRlbyBpblwwIiwKKwkubmFtZSA9ICJidWRnZXRfYXYiLAogCS5wY2lfdGJsID0gcGNpX3RibCwKIAogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKaW5kZXggZGNlMTE2MS4uYTEyNjcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAlpbnQgc2xvdF9zdGF0dXM7CiAJc3RydWN0IGR2Yl9jYV9lbjUwMjIxIGNhOwogCWNoYXIgaXJfZGV2X25hbWVbNTBdOworCXU4IHR1bmVyX3BsbF9hZGRyZXNzOyAvKiB1c2VkIGZvciBwaGlsaXBzX3RkbTEzMTZsIGNvbmZpZ3MgKi8KIH07CiAKIC8qIGZyb20gcmVhZGluZyB0aGUgZm9sbG93aW5nIHJlbW90ZXM6CkBAIC03MjMsNyArNzI0LDcgQEAKIAlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBmZS0+ZHZiLT5wcml2OwogCXN0YXRpYyB1OCB0ZDEzMTZfaW5pdFtdID0geyAweDBiLCAweGY1LCAweDg1LCAweGFiIH07CiAJc3RhdGljIHU4IGRpc2FibGVfbWM0NEJDMzc0Y1tdID0geyAweDFkLCAweDc0LCAweGEwLCAweDY4IH07Ci0Jc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MywuZmxhZ3MgPSAwLC5idWYgPSB0ZDEzMTZfaW5pdCwubGVuID0KKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSBidWRnZXRfY2ktPnR1bmVyX3BsbF9hZGRyZXNzLC5mbGFncyA9IDAsLmJ1ZiA9IHRkMTMxNl9pbml0LC5sZW4gPQogCQkJc2l6ZW9mKHRkMTMxNl9pbml0KSB9OwogCiAJLy8gc2V0dXAgUExMIGNvbmZpZ3VyYXRpb24KQEAgLTc0Niw3ICs3NDcsNyBAQAogewogCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IChzdHJ1Y3QgYnVkZ2V0X2NpICopIGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwotCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjMsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLC5sZW4gPSBzaXplb2YodHVuZXJfYnVmKSB9OworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLC5sZW4gPSBzaXplb2YodHVuZXJfYnVmKSB9OwogCWludCB0dW5lcl9mcmVxdWVuY3kgPSAwOwogCXU4IGJhbmQsIGNwLCBmaWx0ZXI7CiAKQEAgLTgzOCw4ICs4MzksMTIgQEAKIAkuZGVtb2RfYWRkcmVzcyA9IDB4OCwKIAkuaW52ZXJ0ID0gMCwKIAkuaW52ZXJ0X29jbGsgPSAwLAorCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzRNLAorCS5hZ2NfY29uZmlnID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCisJLmlmX2ZyZXEgPSBUREExMDA0Nl9GUkVRXzM2MTcsCiAJLnBsbF9pbml0ID0gcGhpbGlwc190ZG0xMzE2bF9wbGxfaW5pdCwKIAkucGxsX3NldCA9IHBoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCwKKwkucGxsX3NsZWVwID0gTlVMTCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRtMTMxNmxfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTg2NSwxMiArODcwLDIyIEBACiAJCWJyZWFrOwogCiAJY2FzZSAweDEwMTE6CQkvLyBIYXVwcGF1Z2UvVFQgTm92YS1UIGJ1ZGdldCAodGRhMTAwNDUvUGhpbGlwcyB0ZG0xMzE2bCh0ZGE2NjUxdHQpICsgVERBOTg4OSkKKwkJYnVkZ2V0X2NpLT50dW5lcl9wbGxfYWRkcmVzcyA9IDB4NjM7CiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CiAJCQl0ZGExMDA0NV9hdHRhY2goJnBoaWxpcHNfdGRtMTMxNmxfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKKworCWNhc2UgMHgxMDEyOgkJLy8gSGF1cHBhdWdlL1RUIE5vdmEtVCBDSSBidWRnZXQgKHRkYTEwMDQ1L1BoaWxpcHMgdGRtMTMxNmwodGRhNjY1MXR0KSArIFREQTk4ODkpCisJCWJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MgPSAweDYwOworCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQorCQkJdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9PSBOVUxMKSB7CkBAIC05NTAsMTEgKzk2NSwxMyBAQAogCiBNQUtFX0JVREdFVF9JTkZPKHR0YmNpLCAiVFQtQnVkZ2V0L1dpblRWLU5PVkEtQ0kgUENJIiwgQlVER0VUX1RUX0hXX0RJU0VRQyk7CiBNQUtFX0JVREdFVF9JTkZPKHR0YnQyLCAiVFQtQnVkZ2V0L1dpblRWLU5PVkEtVAkgUENJIiwgQlVER0VUX1RUKTsKK01BS0VfQlVER0VUX0lORk8odHRidGNpLCAiVFQtQnVkZ2V0LVQtQ0kgUENJIiwgQlVER0VUX1RUKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBjKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBmKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRidDIsIDB4MTNjMiwgMHgxMDExKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0kodHRidGNpLCAweDEzYzIsIDB4MTAxMiksCiAJewogCSAudmVuZG9yID0gMCwKIAkgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwppbmRleCAwODNmZDQ0Li45OTYxOTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgInZlczE4MjAuaCIKICNpbmNsdWRlICJsNjQ3ODEuaCIKICNpbmNsdWRlICJ0ZGE4MDgzLmgiCisjaW5jbHVkZSAiczVoMTQyMC5oIgogCiBzdGF0aWMgdm9pZCBTZXQyMksgKHN0cnVjdCBidWRnZXQgKmJ1ZGdldCwgaW50IHN0YXRlKQogewpAQCAtMTc3LDYgKzE3OCw2MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxuYnAyMV9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXN0cnVjdCBidWRnZXQqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0KikgZmUtPmR2Yi0+cHJpdjsKKwl1OCBidWY7CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4MDgsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gJmJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisKKwlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CisKKwlzd2l0Y2godm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCWJ1ZiA9IChidWYgJiAweGY3KSB8IDB4MDQ7CisJCWJyZWFrOworCisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJYnVmID0gKGJ1ZiAmIDB4ZjcpIHwgMHgwYzsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJYnVmID0gYnVmICYgMHhmMDsKKwkJYnJlYWs7CisJfQorCisJbXNnLmZsYWdzID0gMDsKKwlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbmJwMjFfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBhcmcpCit7CisJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OworCXU4IGJ1ZjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHgwOCwgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSAmYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKworCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKKworCWlmIChhcmcpIHsKKwkJYnVmID0gYnVmIHwgMHgxMDsKKwl9IGVsc2UgeworCQlidWYgPSBidWYgJiAweGVmOworCX0KKworCW1zZy5mbGFncyA9IDA7CisJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxuYnAyMV9pbml0KHN0cnVjdCBidWRnZXQqIGJ1ZGdldCkKK3sKKwl1OCBidWYgPSAweDAwOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDA4LCAuZmxhZ3MgPSAwLCAuYnVmID0gJmJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisKKwlpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKTsKK30KKwogc3RhdGljIGludCBhbHBzX2JzcnYyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXQqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0KikgZmUtPmR2Yi0+cHJpdjsKQEAgLTM5NSw2ICs0NTIsMzggQEAKIAkucGxsX3NldCA9IGdydW5kaWdfMjk1MDRfNDUxX3BsbF9zZXQsCiB9OwogCitzdGF0aWMgaW50IHM1aDE0MjBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHUzMiogZnJlcW91dCkKK3sKKwlzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldCopIGZlLT5kdmItPnByaXY7CisJdTMyIGRpdjsKKwl1OCBkYXRhWzRdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKSB9OworCisJZGl2ID0gcGFyYW1zLT5mcmVxdWVuY3kgLyAxMDAwOworCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKKwlkYXRhWzFdID0gZGl2ICYgMHhmZjsKKwlkYXRhWzJdID0gMHhjMjsKKworCWlmIChkaXYgPCAxNDUwKQorCQlkYXRhWzNdID0gMHgwMDsKKwllbHNlIGlmIChkaXYgPCAxODUwKQorCQlkYXRhWzNdID0gMHg0MDsKKwllbHNlIGlmIChkaXYgPCAyMDAwKQorCQlkYXRhWzNdID0gMHg4MDsKKwllbHNlCisJCWRhdGFbM10gPSAweGMwOworCisJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCisJKmZyZXFvdXQgPSBkaXYgKiAxMDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHM1aDE0MjBfY29uZmlnIHM1aDE0MjBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg1MywKKwkucGxsX3NldCA9IHM1aDE0MjBfcGxsX3NldCwKK307CisKIHN0YXRpYyB1OCByZWFkX3B3bShzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQpCiB7CiAJdTggYiA9IDB4ZmY7CkBAIC00NTksNiArNTQ4LDE1IEBACiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKKworCWNhc2UgMHgxMDE2OiAvLyBIYXVwcGF1Z2UvVFQgTm92YS1TIFNFIChzYW1zdW5nIHM1aDE0MjAvPz8/Pyh0ZGE4MjYwKSkKKwkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSBzNWgxNDIwX2F0dGFjaCgmczVoMTQyMF9jb25maWcsICZidWRnZXQtPmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5zZXRfdm9sdGFnZSA9IGxuYnAyMV9zZXRfdm9sdGFnZTsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlID0gbG5icDIxX2VuYWJsZV9oaWdoX2xuYl92b2x0YWdlOworCQkJbG5icDIxX2luaXQoYnVkZ2V0KTsKKwkJCWJyZWFrOworCQl9CiAJfQogCiAJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kID09IE5VTEwpIHsKQEAgLTUzMiw2ICs2MzAsNyBAQAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJjLCAgMHgxM2MyLCAweDEwMDQpLAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJ0LCAgMHgxM2MyLCAweDEwMDUpLAogCU1BS0VfRVhURU5TSU9OX1BDSShzYXRlbCwgMHgxM2MyLCAweDEwMTMpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJzLCAgMHgxM2MyLCAweDEwMTYpLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjczEsMHgxMTMxLCAweDRmNjApLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjczAsMHgxMTMxLCAweDRmNjEpLAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKaW5kZXggNGFhNzE0YS4uYzZjMWQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKQEAgLTMsNiArMyw3IEBACiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBVU0IKIAlzZWxlY3QgRFZCX0NYMjI3MDAKIAlzZWxlY3QgRFZCX1REQTEwMDRYCisJc2VsZWN0IERWQl9WRVMxODIwCiAJc2VsZWN0IERWQl9UREE4MDgzCiAJc2VsZWN0IERWQl9TVFYwMjk5CiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKaW5kZXggYWZhMGU3YS4uYWE0M2I1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiZG14ZGV2LmgiCiAjaW5jbHVkZSAiZHZiX2RlbXV4LmgiCiAjaW5jbHVkZSAiZHZiX25ldC5oIgorI2luY2x1ZGUgInZlczE4MjAuaCIKICNpbmNsdWRlICJjeDIyNzAwLmgiCiAjaW5jbHVkZSAidGRhMTAwNHguaCIKICNpbmNsdWRlICJzdHYwMjk5LmgiCkBAIC0xMzY3LDYgKzEzNjgsNDcgQEAKIAkucGxsX3NldCA9IHR0dXNiX25vdmFzX2dydW5kaWdfMjk1MDRfNDkxX3BsbF9zZXQsCiB9OwogCitzdGF0aWMgaW50IGFscHNfdGRiZTJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCit7CisJc3RydWN0IHR0dXNiKiB0dHVzYiA9IGZlLT5kdmItPnByaXY7CisJdTMyIGRpdjsKKwl1OCBkYXRhWzRdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYyLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKSB9OworCisJZGl2ID0gKHBhcmFtcy0+ZnJlcXVlbmN5ICsgMzU5Mzc1MDAgKyAzMTI1MCkgLyA2MjUwMDsKKworCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKKwlkYXRhWzFdID0gZGl2ICYgMHhmZjsKKwlkYXRhWzJdID0gMHg4NSB8ICgoZGl2ID4+IDEwKSAmIDB4NjApOworCWRhdGFbM10gPSAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzQwMDAwMDAgPyAweDg4IDogcGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDAgPyAweDg0IDogMHg4MSk7CisKKwlpZiAoaTJjX3RyYW5zZmVyICgmdHR1c2ItPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdmVzMTgyMF9jb25maWcgYWxwc190ZGJlMl9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA5LAorCS54aW4gPSA1Nzg0MDAwMFVMLAorCS5pbnZlcnQgPSAxLAorCS5zZWxhZ2MgPSBWRVMxODIwX1NFTEFHQ19TSUdOQU1QRVJSLAorCS5wbGxfc2V0ID0gYWxwc190ZGJlMl9wbGxfc2V0LAorfTsKKworc3RhdGljIHU4IHJlYWRfcHdtKHN0cnVjdCB0dHVzYiogdHR1c2IpCit7CisJdTggYiA9IDB4ZmY7CisJdTggcHdtOworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geyB7IC5hZGRyID0gMHg1MCwuZmxhZ3MgPSAwLC5idWYgPSAmYiwubGVuID0gMSB9LAorCQkJCXsgLmFkZHIgPSAweDUwLC5mbGFncyA9IEkyQ19NX1JELC5idWYgPSAmcHdtLC5sZW4gPSAxfSB9OworCisJaWYgKChpMmNfdHJhbnNmZXIoJnR0dXNiLT5pMmNfYWRhcCwgbXNnLCAyKSAhPSAyKSB8fCAocHdtID09IDB4ZmYpKQorCQlwd20gPSAweDQ4OworCisJcmV0dXJuIHB3bTsKK30KIAogCiBzdGF0aWMgdm9pZCBmcm9udGVuZF9pbml0KHN0cnVjdCB0dHVzYiogdHR1c2IpCkBAIC0xMzk0LDYgKzE0MzYsMTIgQEAKIAogCQlicmVhazsKIAorCWNhc2UgMHgxMDA0OiAvLyBIYXVwcGF1Z2UvVFQgRFZCLUMgYnVkZ2V0ICh2ZXMxODIwL0FMUFMgVERCRTIoc3A1NjU5KSkKKwkJdHR1c2ItPmZlID0gdmVzMTgyMF9hdHRhY2goJmFscHNfdGRiZTJfY29uZmlnLCAmdHR1c2ItPmkyY19hZGFwLCByZWFkX3B3bSh0dHVzYikpOworCQlpZiAodHR1c2ItPmZlICE9IE5VTEwpCisJCQlicmVhazsKKwkJYnJlYWs7CisKIAljYXNlIDB4MTAwNTogLy8gSGF1cHBhdWdlL1RUIE5vdmEtVVNCLXQgYnVkZ2V0ICh0ZGExMDA0Ni9QaGlsaXBzIHRkMTMxNih0ZGE2NjUxdHQpIE9SIGN4MjI3MDAvQUxQUyBURE1CNyg/PykpCiAJCS8vIHRyeSB0aGUgQUxQUyBURE1CNyBmaXJzdAogCQl0dHVzYi0+ZmUgPSBjeDIyNzAwX2F0dGFjaCgmYWxwc190ZG1iN19jb25maWcsICZ0dHVzYi0+aTJjX2FkYXApOwpAQCAtMTU3MCw3ICsxNjE4LDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHR0dXNiX3RhYmxlW10gPSB7CiAJe1VTQl9ERVZJQ0UoMHhiNDgsIDB4MTAwMyl9LAotLyoJe1VTQl9ERVZJQ0UoMHhiNDgsIDB4MTAwNCl9LFVOREVGSU5FRCBIQVJEV0FSRSAtIG1haWwgbGludXh0di5vcmcgbGlzdCovCS8qIHRvIGJlIGNvbmZpcm1lZCA/Pz8/ICAqLworCXtVU0JfREVWSUNFKDB4YjQ4LCAweDEwMDQpfSwKIAl7VVNCX0RFVklDRSgweGI0OCwgMHgxMDA1KX0sCiAJe30KIH07CkBAIC0xNTc4LDcgKzE2MjYsNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHR0dXNiX3RhYmxlKTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHR0dXNiX2RyaXZlciA9IHsKLSAgICAgIC5uYW1lCQk9ICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgVVNCLU5vdmEiLAorICAgICAgLm5hbWUJCT0gInR0dXNiIiwKICAgICAgIC5wcm9iZQkJPSB0dHVzYl9wcm9iZSwKICAgICAgIC5kaXNjb25uZWN0CT0gdHR1c2JfZGlzY29ubmVjdCwKICAgICAgIC5pZF90YWJsZQkJPSB0dHVzYl90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwppbmRleCA1MDViZGFmLi40NWM5YTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCkBAIC0xMjgxLDYgKzEyODEsNyBAQAogCWlmIChmaXJtd2FyZV9zaXplIDwgNjApIHsKIAkJcHJpbnRrKCIlczogZmlybXdhcmUgc2l6ZSB0b28gc21hbGwgZm9yIERTUCBjb2RlICglenUgPCA2MCkuXG4iLAogCQkJX19GVU5DVElPTl9fLCBmaXJtd2FyZV9zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTEyOTQsNiArMTI5NSw3IEBACiAJCXByaW50aygiJXM6IGNyYzMyIGNoZWNrIG9mIERTUCBjb2RlIGZhaWxlZCAoY2FsY3VsYXRlZCAiCiAJCSAgICAgICAiMHglMDh4ICE9IDB4JTA4eCBpbiBmaWxlKSwgZmlsZSBpbnZhbGlkLlxuIiwKIAkJCV9fRlVOQ1RJT05fXywgY3JjMzJfY3N1bSwgY3JjMzJfY2hlY2spOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAkJcmV0dXJuIC0xOwogCX0KIAltZW1jcHkoaWRzdHJpbmcsICZmaXJtd2FyZVszNl0sIDIwKTsKQEAgLTEzMDgsMTUgKzEzMTAsMTkgQEAKIAogCXJlc3VsdCA9IHR0dXNiX2RlY19zZW5kX2NvbW1hbmQoZGVjLCAweDQxLCBzaXplb2YoYjApLCBiMCwgTlVMTCwgTlVMTCk7CiAKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiByZXN1bHQ7CisJfQogCiAJdHJhbnNfY291bnQgPSAwOwogCWogPSAwOwogCiAJYiA9IGttYWxsb2MoQVJNX1BBQ0tFVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoYiA9PSBOVUxMKQorCWlmIChiID09IE5VTEwpIHsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBmaXJtd2FyZV9zaXplOyBpICs9IENPTU1BTkRfUEFDS0VUX1NJWkUpIHsKIAkJc2l6ZSA9IGZpcm13YXJlX3NpemUgLSBpOwpAQCAtMTM0NSw2ICsxMzUxLDcgQEAKIAogCXJlc3VsdCA9IHR0dXNiX2RlY19zZW5kX2NvbW1hbmQoZGVjLCAweDQzLCBzaXplb2YoYjEpLCBiMSwgTlVMTCwgTlVMTCk7CiAKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAlrZnJlZShiKTsKIAogCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYwppbmRleCAxNjk5Y2M5Li43MjVhZjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMKQEAgLTE1Nyw3ICsxNTcsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IChzdHJ1Y3QgdHR1c2JkZWNmZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKQEAgLTE2NywxMCArMTY4LDYgQEAKIAlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKLQotZXJyb3I6Ci0Ja2ZyZWUoc3RhdGUpOwotCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdHR1c2JkZWNmZV9kdmJzX29wczsKQEAgLTE4MSw3ICsxNzgsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IChzdHJ1Y3QgdHR1c2JkZWNmZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKQEAgLTE5MywxMCArMTkxLDYgQEAKIAlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKLQotZXJyb3I6Ci0Ja2ZyZWUoc3RhdGUpOwotCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdHR1c2JkZWNmZV9kdmJ0X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCAxYjcwZjhiLi5mNDYxNzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC03LDE5ICs3LDYgQEAKIAogY29tbWVudCAiVmlkZW8gQWRhcHRlcnMiCiAKLWNvbmZpZyBUVU5FUl9NVUxUSV9JMkMKLQlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgSTJDIGRldmljZXMgb24gVmlkZW8gQWRhcHRlcnMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgRVhQRVJJTUVOVEFMCi0JLS0taGVscC0tLQotCSAgU29tZSB2aWRlbyBhZGFwdGVycyBoYXZlIG1vcmUgdGhhbiBvbmUgdHVuZXIgaW5zaWRlLiBUaGlzIHBhdGNoCi0JICBlbmFibGVzIHN1cHBvcnQgZm9yIHVzaW5nIG1vcmUgdGhhbiBvbmUgdHVuZXIuIFRoaXMgaXMgcmVxdWlyZWQKLQkgIGZvciBzb21lIGNhcmRzIHRvIGFsbG93IHR1bm5pbmcgIGJvdGggdmlkZW8gYW5kIHJhZGlvLgotCSAgSXQgYWxzbyBpbXByb3ZlcyBJMkMgYXV0b2RldGVjdGlvbiBmb3IgdGhlc2UgY2FyZHMuCi0KLQkgIE9ubHkgZmV3IHR1bmVycyBjdXJyZW50bHkgaXMgc3VwcG9ydGluZyB0aGlzLiBNb3JlIHRvIGNvbWUuCi0KLQkgIEl0IGlzIHNhZmUgdG8gc2F5ICdZJyBoZXJlIGV2ZW4gaWYgeW91ciBjYXJkIGhhcyBvbmx5IG9uZSBJMkMgdHVuZXIuCi0KIGNvbmZpZyBWSURFT19CVDg0OAogCXRyaXN0YXRlICJCVDg0OCBWaWRlbyBGb3IgTGludXgiCiAJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgUENJICYmIEkyQwpAQCAtMzQ0LDYgKzMzMSw3IEBACiAJc2VsZWN0IERWQl9NVDM1MgogCXNlbGVjdCBEVkJfT1I1MTEzMgogCXNlbGVjdCBEVkJfQ1gyMjcwMgorCXNlbGVjdCBEVkJfTEdEVDMzMDIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgRFZCL0FUU0MgY2FyZHMgYmFzZWQgb24gdGhlCiAJICBDb25uZXhhbnQgMjM4OHggY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MzIuYwppbmRleCA5YTY0MmM3ZC4uYTA3MDQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MzIuYwpAQCAtMTM4LDI1ICsxMzgsMTMgQEAKIAogICAgICAgICBidDgzMl9oZXhkdW1wKGkyY19jbGllbnRfcyxidWYpOwogCi0jaWYgMAotCS8vIEZ1bGwgMzAvMjUgRnJhbWUgcmF0ZQotCXByaW50aygiRnVsbCAzMC8yNSBGcmFtZSByYXRlXG4iKTsKLQlidWZbMF09QlQ4MzJfVlBfQ09OVFJPTDA7IC8vIFJlZy4zOQotICAgICAgICBidWZbMV09IDB4MDA7Ci0gICAgICAgIGlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKLSAgICAgICAgICAgICAgICBwcmludGsoImJ0ODMyOiBpMmMgaS9vIGVycm9yIEZGUjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyYyk7CiAKLSAgICAgICAgYnQ4MzJfaGV4ZHVtcChpMmNfY2xpZW50X3MsYnVmKTsKLSNlbmRpZgotCi0jaWYgMQogCS8vIGZvciB0ZXN0aW5nIChldmVuIHdvcmtzIHdoZW4gbm8gY2FtZXJhIGF0dGFjaGVkKQogCXByaW50aygiYnQ4MzI6ICoqKiBHZW5lcmF0ZSBOVFNDIE0gQmFycyAqKioqKlxuIik7CiAJYnVmWzBdPUJUODMyX1ZQX1RFU1RDT05UUk9MMDsgLy8gUmVnLiA0MgogCWJ1ZlsxXT0zOyAvLyBHZW5lcmF0ZSBOVFNDIFN5c3RlbSBNIGJhcnMsIEdlbmVyYXRlIEZyYW1lIHRpbWluZyBpbnRlcm5hbGx5CiAgICAgICAgIGlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKICAgICAgICAgICAgICAgICBwcmludGsoImJ0ODMyOiBpMmMgaS9vIGVycm9yIE1CQVI6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOwotI2VuZGlmCiAKIAlwcmludGsoIkJ0ODMyOiBDYW1lcmEgUHJlc2VudDogJXNcbiIsCiAJCShidWZbMStCVDgzMl9DQU1fU1RBVFVTXSAmIEJUODMyXzU2X0NBTUVSQV9QUkVTRU5UKSA/ICJ5ZXMiOiJubyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtY2FyZHMuYwppbmRleCAyNTEwOTJlNy4uMmRiZjVlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICAgICRJZDogYnR0di1jYXJkcy5jLHYgMS40OSAyMDA1LzA2LzEwIDE3OjIwOjI0IG1jaGVoYWIgRXhwICQKKyAgICAkSWQ6IGJ0dHYtY2FyZHMuYyx2IDEuNTMgMjAwNS8wNy8wNSAxNzozNzozNSBuc2ggRXhwICQKIAogICAgIGJ0dHYtY2FyZHMuYwogCkBAIC0zOSw5ICszOSw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlICJidHR2cC5oIgotI2lmIDAgLyogbm90IHdvcmtpbmcgeWV0ICovCi0jaW5jbHVkZSAiYnQ4MzIuaCIKLSNlbmRpZgogCiAvKiBmd2QgZGVjbCAqLwogc3RhdGljIHZvaWQgYm9vdF9tc3AzNHh4KHN0cnVjdCBidHR2ICpidHYsIGludCBwaW4pOwpAQCAtNTEzLDEzICs1MTAsOCBAQAogCS5zdmhzCQk9IDIsCiAJLmdwaW9tYXNrCT0gMHgwMWZlMDAsCiAJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAotI2lmIDAKLQkvLyBvbGQKLQkuYXVkaW9tdXgJPSB7IDB4MDFjMDAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAsIDB4MDAyMDAwLCAwIH0sCi0jZWxzZQogCS8vIDIwMDMtMTAtMjAgYnkgIkFudG9uIEEuIEFyYXBvdiIgPGFyYXBvdkBtYWlsLnJ1PgogCS5hdWRpb211eCAgICAgICA9IHsgMHgwMDFlMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAsIDAgfSwKLSNlbmRpZgogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLApAQCAtNzY2LDE0ICs3NTgsOSBAQAogCS50dW5lcgkJPSAwLAogCS5zdmhzCQk9IDIsCiAJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsIDB9LCAvLyBUViwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yCi0jaWYgMAotCS5ncGlvbWFzawk9IDB4YzMzMDAwLAotCS5hdWRpb211eAk9IHsgMHg0MjIwMDAsMHgxMDAwLDB4MDAwMCwweDYyMDAwMCwweDgwMDAwMCB9LAotI2Vsc2UKIAkvKiBBbGV4YW5kZXIgVmFyYWtpbiA8YXZhcmFraW5AaG90bWFpbC5jb20+IFtzdGVyZW8gdmVyc2lvbl0gKi8KIAkuZ3Bpb21hc2sJPSAweGIzMzAwMCwKIAkuYXVkaW9tdXgJPSB7IDB4MTIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKLSNlbmRpZgogCS8qIEF1ZGlvIFJvdXRpbmcgZm9yICJXaW5GYXN0IDIwMDAgWFAiIChubyB0diBzdGVyZW8gISkKIAkJZ3BpbzIzIC0tIGhlZjQwNTI6bkVuYWJsZSAoMHg4MDAwMDApCiAJCWdwaW8xMiAtLSBoZWY0MDUyOkExCkBAIC0xNjAzLDIwICsxNTkwLDExIEBACiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAotI2lmIDAgLyogVE9ETyAuLi4gKi8KLSAgICAgICAuc3ZocyAgICAgICAgICAgPSBPU1BSRVk1NDBfU1ZJRF9BTkFMT0csCi0gICAgICAgLm11eHNlbCAgICAgICAgID0geyAgICAgICBbT1NQUkVZNTQwX0NPTVBfQU5BTE9HXSA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW09TUFJFWTU0MF9TVklEX0FOQUxPR10gPSAzLCB9LAotI2VuZGlmCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAotI2lmIDAgLyogVE9ETyAuLi4gKi8KLSAgICAgICAubXV4c2VsX2hvb2sgICAgPSBvc3ByZXlfNTQwX211eHNlbCwKLSAgICAgICAucGljdHVyZV9ob29rICAgPSBvc3ByZXlfNTQwX3NldF9waWN0dXJlLAotI2VuZGlmCiB9LHsKIAogCS8qIC0tLS0gY2FyZCAweDVDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI1NDYsMjEgKzI1MjQsMTIgQEAKIAlidGFvcigoMik8PDUsIH4oMzw8NSksIEJUODQ4X0lGT1JNKTsKIAlncGlvX2JpdHMoMyxidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbFtpbnB1dCY3XSk7CiAKLSNpZiAwCi0gICAgICAgLyogc3ZocyAqLwotICAgICAgIC8qIHdha2UgY2hyb21hIEFEQyAqLwotICAgICAgIGJ0YW5kKH5CVDg0OF9BRENfQ19TTEVFUCwgQlQ4NDhfQURDKTsKLSAgICAgICAvKiBzZXQgdG8gWUMgdmlkZW8gKi8KLSAgICAgICBidG9yKEJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfRV9DT05UUk9MKTsKLSAgICAgICBidG9yKEJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfT19DT05UUk9MKTsKLSNlbHNlCiAgICAgICAgLyogY29tcG9zaXRlICovCiAgICAgICAgLyogc2V0IGNocm9tYSBBREMgdG8gc2xlZXAgKi8KICAgICAgICBidG9yKEJUODQ4X0FEQ19DX1NMRUVQLCBCVDg0OF9BREMpOwogICAgICAgIC8qIHNldCB0byBjb21wb3NpdGUgdmlkZW8gKi8KICAgICAgICBidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOwogICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7Ci0jZW5kaWYKIAogICAgICAgIC8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwogICAgICAgIGdwaW9fYml0cyhMTTE4ODJfU1lOQ19EUklWRSxMTTE4ODJfU1lOQ19EUklWRSk7CkBAIC0yODEzLDEwICsyNzgyLDE4IEBACiAJCWJ0di0+dHVuZXJfdHlwZSA9IHR1bmVyW2J0di0+Yy5ucl07CiAJcHJpbnRrKCJidHR2JWQ6IHVzaW5nIHR1bmVyPSVkXG4iLGJ0di0+Yy5ucixidHYtPnR1bmVyX3R5cGUpOwogCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKQotCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LEFVRENfQ09ORklHX1BJTk5BQ0xFLAorCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBBVURDX0NPTkZJR19QSU5OQUNMRSwKIAkJCQkgICAgICAmYnR2LT5waW5uYWNsZV9pZCk7Ci0JaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKLQkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixUVU5FUl9TRVRfVFlQRSwmYnR2LT50dW5lcl90eXBlKTsKKwlpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKSB7CisJICAgICAgICBzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOworCisJICAgICAgICB0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTyB8IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOworCQl0dW5fc2V0dXAudHlwZSA9IGJ0di0+dHVuZXJfdHlwZTsKKwkJdHVuX3NldHVwLmFkZHIgPSBBRERSX1VOU0VUOworCisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCX0KKwogCWJ0di0+c3ZocyA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uc3ZoczsKIAlpZiAoc3Zoc1tidHYtPmMubnJdICE9IFVOU0VUKQogCQlidHYtPnN2aHMgPSBzdmhzW2J0di0+Yy5ucl07CkBAIC0zMTI1LDE0ICszMTAyLDYgQEAKICAgICAgICAgVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19TRUNBTSwKICAgICAgICAgVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19QQUwsCiAJVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMgfTsKLSNpZiAwCi1pbnQgdHVuZXJfMF9mbV90YWJsZVtdID0gewotICAgICAgICBQSElMSVBTX0ZSMTIzNl9OVFNDLCAgUEhJTElQU19GUjEyMTZfUEFMLAotICAgICAgICBQSElMSVBTX0ZSMTIxNl9QQUwsICAgUEhJTElQU19GUjEyMTZfUEFMLAotICAgICAgICBQSElMSVBTX0ZSMTIxNl9QQUwsICAgUEhJTElQU19GUjEyMTZfUEFMLAotICAgICAgICBQSElMSVBTX0ZSMTIzNl9TRUNBTSwgUEhJTElQU19GUjEyMzZfU0VDQU0sCi0gICAgICAgIFBISUxJUFNfRlIxMjM2X1NFQ0FNLCBQSElMSVBTX0ZSMTIxNl9QQUx9OwotI2VuZGlmCiAKIHN0YXRpYyBpbnQgdHVuZXJfMV90YWJsZVtdID0gewogICAgICAgICBUVU5FUl9URU1JQ19OVFNDLCAgVFVORVJfVEVNSUNfUEFMLApAQCAtMzIxOCwzNiArMzE4Nyw2IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpCiB7Ci0jaWYgMCAvKiBub3Qgd29ya2luZyB5ZXQgKi8KLQlpbnQgcmVzZXRiaXQ9MDsKLQotCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKLQljYXNlIEJUVFZfUFhFTFZXUExUVlBBSzoKLQkJcmVzZXRiaXQgPSAweDQwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBCVFRWX01PRFRFQ18yMDU6Ci0JCXJlc2V0Yml0ID0gMTw8OTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JcmVxdWVzdF9tb2R1bGUoImJ0ODMyIik7Ci0JYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgQlQ4MzJfSEVYRFVNUCwgTlVMTCk7Ci0KLQlwcmludGsoImJ0dHYlZDogUmVzZXQgQnQ4MzIgW2xpbmU9MHgleF1cbiIsYnR2LT5jLm5yLHJlc2V0Yml0KTsKLQlncGlvX3dyaXRlKDApOwotCWdwaW9faW5vdXQocmVzZXRiaXQsIHJlc2V0Yml0KTsKLQl1ZGVsYXkoNSk7Ci0JZ3Bpb19iaXRzKHJlc2V0Yml0LCByZXNldGJpdCk7Ci0JdWRlbGF5KDUpOwotCWdwaW9fYml0cyhyZXNldGJpdCwgMCk7Ci0JdWRlbGF5KDUpOwotCi0JLy8gYnQ4MzIgb24gcGl4ZWx2aWV3IGNoYW5nZXMgZnJvbSBpMmMgMHg4YSB0byAweDg4IGFmdGVyCi0JLy8gYmVpbmcgcmVzZXQgYXMgYWJvdmUuIFNvIHdlIG11c3QgZm9sbG93IGJ5IHRoaXM6Ci0JYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgQlQ4MzJfUkVBVFRBQ0gsIE5VTEwpOwotI2VuZGlmCiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zNTcyLDExICszNTExLDYgQEAKIHsKIAlkcHJpbnRrKCJ0ZWE1NzU3X3NldF9mcmVxICVkXG4iLGZyZXEpOwogCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogYWRkIDEwLjdNSHogKHNlZSBkb2NzKSAqLwotI2lmIDAKLQkvKiBicmVha3MgTWlybyBQQ1RWICovCi0JdmFsdWUgPSB0ZWE1NzU3X3JlYWQoYnR2KTsKLQlkcHJpbnRrKCJidHR2JWQ6IHRlYTU3NTcgcmVhZGJhY2s9MHgleFxuIixidHYtPmMubnIsdmFsdWUpOwotI2VuZGlmCiB9CiAKIApAQCAtMzY1NiwxMyArMzU5MCw4IEBACiB7CiAJdW5zaWduZWQgaW50IHZhbCwgY29uOwogCi0jaWYgQlRUVl9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigwLDgsMCkKIAlpZiAoYnR2LT5yYWRpb191c2VyKQogCQlyZXR1cm47Ci0jZWxzZQotCWlmIChidHYtPnJhZGlvKQotCQlyZXR1cm47Ci0jZW5kaWYKIAogCXZhbCA9IGdwaW9fcmVhZCgpOwogCWlmIChzZXQpIHsKQEAgLTM4NTEsMTMgKzM3ODAsOCBAQAogewogCXVuc2lnbmVkIGludCB2YWwgPSAwOwogCi0jaWYgQlRUVl9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigwLDgsMCkKIAlpZiAoYnR2LT5yYWRpb191c2VyKQogCQlyZXR1cm47Ci0jZWxzZQotCWlmIChidHYtPnJhZGlvKQotCQlyZXR1cm47Ci0jZW5kaWYKIAogCWlmIChzZXQpIHsKIAkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CkBAIC0zODg4LDEzICszODEyLDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsID0gMHhmZmZmOwogCi0jaWYgQlRUVl9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigwLDgsMCkKIAlpZiAoYnR2LT5yYWRpb191c2VyKQogCQlyZXR1cm47Ci0jZWxzZQotCWlmIChidHYtPnJhZGlvKQotCQlyZXR1cm47Ci0jZW5kaWYKIAlpZiAoc2V0KSB7CiAJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewogCQkJdmFsID0gMHgwMDAwOwpAQCAtNDM3MSwxMSArNDI5MCw2IEBACiAJCWxhdGVuY3kgPSAweDBBOwogI2VuZGlmCiAKLSNpZiAwCi0JLyogcHJpbnQgd2hpY2ggY2hpcHNldCB3ZSBoYXZlICovCi0Jd2hpbGUgKChkZXYgPSBwY2lfZmluZF9jbGFzcyhQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCxkZXYpKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgaXMgJXNcbiIscGNpX25hbWUoZGV2KSk7Ci0jZW5kaWYKIAogCS8qIHByaW50IHdhcm5pbmdzIGFib3V0IGFueSBxdWlya3MgZm91bmQgKi8KIAlpZiAodHJpdG9uMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYwppbmRleCA3ZDYyYjM5Li41MWEwZjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWRyaXZlci5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAgICAkSWQ6IGJ0dHYtZHJpdmVyLmMsdiAxLjQwIDIwMDUvMDYvMTYgMjE6Mzg6NDUgbnNoIEV4cCAkCisgICAgJElkOiBidHR2LWRyaXZlci5jLHYgMS40MiAyMDA1LzA3LzA1IDE3OjM3OjM1IG5zaCBFeHAgJAogCiAgICAgYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCiAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CkBAIC02OTgsMTIgKzY5OSwxMCBAQAogc3RhdGljCiB2b2lkIGZyZWVfYnRyZXMoc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfZmggKmZoLCBpbnQgYml0cykKIHsKLSNpZiAxIC8qIERFQlVHICovCiAJaWYgKChmaC0+cmVzb3VyY2VzICYgYml0cykgIT0gYml0cykgewogCQkvKiB0cnlpbmcgdG8gZnJlZSByZXNzb3VyY2VzIG5vdCBhbGxvY2F0ZWQgYnkgdXMgLi4uICovCiAJCXByaW50aygiYnR0djogQlVHISAoYnRyZXMpXG4iKTsKIAl9Ci0jZW5kaWYKIAlkb3duKCZidHYtPnJlc2xvY2spOwogCWZoLT5yZXNvdXJjZXMgICY9IH5iaXRzOwogCWJ0di0+cmVzb3VyY2VzICY9IH5iaXRzOwpAQCAtOTQzLDExICs5NDIsNiBAQAogCWkyY19tdXggPSBtdXggPSAoYnR2LT5hdWRpbyAmIEFVRElPX01VVEUpID8gQVVESU9fT0ZGIDogYnR2LT5hdWRpbzsKIAlpZiAoYnR2LT5vcHRfYXV0b211dGUgJiYgIXNpZ25hbCAmJiAhYnR2LT5yYWRpb191c2VyKQogCQltdXggPSBBVURJT19PRkY7Ci0jaWYgMAotCXByaW50aygiYnR0diVkOiBhbXV4OiBtb2RlPSVkIGF1ZGlvPSVkIHNpZ25hbD0lcyBtdXg9JWQvJWQgaXJxPSVzXG4iLAotCSAgICAgICBidHYtPmMubnIsIG1vZGUsIGJ0di0+YXVkaW8sIHNpZ25hbCA/ICJ5ZXMiIDogIm5vIiwKLQkgICAgICAgbXV4LCBpMmNfbXV4LCBpbl9pbnRlcnJ1cHQoKSA/ICJ5ZXMiIDogIm5vIik7Ci0jZW5kaWYKIAogCXZhbCA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbbXV4XTsKIAlncGlvX2JpdHMoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayx2YWwpOwpAQCAtOTk0LDExICs5ODgsNiBAQAogCWNhc2UgQlRUVl9WT09ET09UVl9GTToKIAkJYnR0dl90ZGE5ODgwX3NldG5vcm0oYnR2LG5vcm0pOwogCQlicmVhazsKLSNpZiAwCi0JY2FzZSBCVFRWX09TUFJFWTU0MDoKLQkJb3NwcmV5XzU0MF9zZXRfbm9ybShidHYsbm9ybSk7Ci0JCWJyZWFrOwotI2VuZGlmCiAJfQogCXJldHVybiAwOwogfQpAQCAtMTg0OSw3ICsxODM4LDcgQEAKIAogCQlpZiAodW5saWtlbHkoZi0+dHVuZXIgIT0gMCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHVubGlrZWx5KGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpKQorCQlpZiAodW5saWtlbHkgKGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWRvd24oJmJ0di0+bG9jayk7CiAJCWJ0di0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKQEAgLTM4NjUsNyArMzg1NCw3IEBACiAJCSAgICAgICBidHYtPmMubnIpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0gICAgICAgIGlmIChwY2lfc2V0X2RtYV9tYXNrKGRldiwgMHhmZmZmZmZmZikpIHsKKyAgICAgICAgaWYgKHBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iLAogCQkgICAgICAgYnR2LT5jLm5yKTsKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMKaW5kZXggZGE0NDhhNS4uMjM0YTg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgJElkOiBidHR2LWkyYy5jLHYgMS4yMSAyMDA1LzA2LzEwIDE3OjIwOjI0IG1jaGVoYWIgRXhwICQKKyAgICAkSWQ6IGJ0dHYtaTJjLmMsdiAxLjI1IDIwMDUvMDcvMDUgMTc6Mzc6MzUgbnNoIEV4cCAkCiAKICAgICBidHR2LWkyYy5jICAtLSAgYWxsIHRoZSBpMmMgY29kZSBpcyBoZXJlCiAKQEAgLTI5NSwxNCArMjk1LDI2IEBACiB7CiAgICAgICAgIHN0cnVjdCBidHR2ICpidHYgPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CiAKLQlpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKQotCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LFRVTkVSX1NFVF9UWVBFLCZidHYtPnR1bmVyX3R5cGUpOworCWlmIChidHR2X2RlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiAlcyBpMmMgYXR0YWNoIFthZGRyPTB4JXgsY2xpZW50PSVzXVxuIiwKKwkJCWJ0di0+Yy5ucixjbGllbnQtPmRyaXZlci0+bmFtZSxjbGllbnQtPmFkZHIsCisJCQlpMmNfY2xpZW50bmFtZShjbGllbnQpKTsKKwlpZiAoIWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKQorCQlyZXR1cm4gMDsKKworCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpIHsKKwkgICAgICAgIHN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CisKKwkgICAgICAgIHR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX1JBRElPIHwgVF9BTkFMT0dfVFYgfCBUX0RJR0lUQUxfVFY7CisJCXR1bl9zZXR1cC50eXBlID0gYnR2LT50dW5lcl90eXBlOworCQl0dW5fc2V0dXAuYWRkciA9IEFERFJfVU5TRVQ7CisKKwkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQgKGNsaWVudCwgVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CisJfQorCiAJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCi0JCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsQVVEQ19DT05GSUdfUElOTkFDTEUsCisJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCxBVURDX0NPTkZJR19QSU5OQUNMRSwKIAkJCQkgICAgICAmYnR2LT5waW5uYWNsZV9pZCk7Ci0gICAgICAgIGlmIChidHR2X2RlYnVnKQotCQlwcmludGsoImJ0dHYlZDogaTJjIGF0dGFjaCBbY2xpZW50PSVzXVxuIiwKLQkJICAgICAgIGJ0di0+Yy5uciwgaTJjX2NsaWVudG5hbWUoY2xpZW50KSk7CiAgICAgICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtcmlzYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXJpc2MuYwppbmRleCBiZGM1Y2U2Li45ZWQyMWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtcmlzYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1yaXNjLmMKQEAgLTMzNCwxMCArMzM0LDYgQEAKIAl9CiAKIAl2ZGVsYXkgPSB0dm5vcm0tPnZkZWxheTsKLSNpZiAwIC8qIEZJWE1FICovCi0JaWYgKHZkZWxheSA8IGJ0di0+dmJpLmxpbmVzKjIpCi0JCXZkZWxheSA9IGJ0di0+dmJpLmxpbmVzKjI7Ci0jZW5kaWYKIAogICAgICAgICB4c2YgPSAod2lkdGgqc2NhbGVkdHdpZHRoKS9zd2lkdGg7CiAgICAgICAgIGdlby0+aHNjYWxlID0gICgodG90YWx3aWR0aCo0MDk2VUwpL3hzZi00MDk2KTsKQEAgLTc3NiwxMyArNzcyLDggQEAKIAkJYnR0dl9yaXNjX292ZXJsYXkoYnR2LCAmYnVmLT5ib3R0b20sIGZtdCwgb3YsIDAsIDApOwogCQlicmVhazsKIAljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKLSNpZiAwCi0JCWJ0dHZfcmlzY19vdmVybGF5KGJ0diwgJmJ1Zi0+dG9wLCAgICBmbXQsIG92LCAxLCAwKTsKLQkJYnR0dl9yaXNjX292ZXJsYXkoYnR2LCAmYnVmLT5ib3R0b20sIGZtdCwgb3YsIDAsIDEpOwotI2Vsc2UKIAkJYnR0dl9yaXNjX292ZXJsYXkoYnR2LCAmYnVmLT50b3AsICAgIGZtdCwgb3YsIDAsIDEpOwogCQlidHR2X3Jpc2Nfb3ZlcmxheShidHYsICZidWYtPmJvdHRvbSwgZm10LCBvdiwgMSwgMCk7Ci0jZW5kaWYKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jCmluZGV4IDkxZjhhZmUuLjRmMzk2ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jCkBAIC02OTAsMTEgKzY5MCw5IEBACiAJaW50IGJpdHJhdGVfbW9kZSA9IDE7CiAJaW50IGJpdHJhdGUgPSA3NTAwMDAwOwogCWludCBiaXRyYXRlX3BlYWsgPSA3NTAwMDAwOwotI2lmIDEKIAliaXRyYXRlX21vZGUgPSBCTEFDS0JJUkRfVklERU9fQ0JSOwogCWJpdHJhdGUgPSA0MDAwKjEwMjQ7CiAJYml0cmF0ZV9wZWFrID0gNDAwMCoxMDI0OwotI2VuZGlmCiAKIAkvKiBhc3NpZ24gc3RyZWFtIHR5cGUgKi8KIAlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX1NUUkVBTV9UWVBFLCAxLCAwLCBCTEFDS0JJUkRfU1RSRUFNX1BST0dSQU0pOwpAQCAtODEwLDkgKzgwOCw2IEBACiAJY3hfd3JpdGUoTU9fVkJPU19DT05UUk9MLCAweDg0QTAwKTsgLyogbm8gNjU2IG1vZGUsIDgtYml0IHBpeGVscywgZGlzYWJsZSBWQkkgKi8KIAljeF9jbGVhcihNT19PVVRQVVRfRk9STUFULCAweDAwMDgpOyAvKiBOb3JtYWwgWS1saW1pdHMgdG8gbGV0IHRoZSBtcGVnIGVuY29kZXIgc3luYyAqLwogCi0jaWYgMCAvKiBGSVhNRSAqLwotCXNldF9zY2FsZShkZXYsIDcyMCwgNDgwLCBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpOwotI2VuZGlmCiAJYmxhY2tiaXJkX2NvZGVjX3NldHRpbmdzKGRldik7CiAJbXNsZWVwKDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCBiM2ZiMDQzLi5iMGI0N2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjeDg4LWNhcmRzLmMsdiAxLjc2IDIwMDUvMDYvMDggMDE6Mjg6MDkgbWNoZWhhYiBFeHAgJAorICogJElkOiBjeDg4LWNhcmRzLmMsdiAxLjg1IDIwMDUvMDcvMDQgMTk6MzU6MDUgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIENvbmV4YW50IDIzODh4IGJhc2VkIFRWIGNhcmRzCiAgKiBjYXJkLXNwZWNpZmljIHN0dWZmLgpAQCAtNDAxLDcgKzQwMSw3IEBACiAJCS5kdmIgICAgICAgICAgICA9IDEsCiAJfSwKIAlbQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UMV0gPSB7Ci0JCS5uYW1lICAgICAgICAgICA9ICJEVklDTyBGdXNpb25IRFRWIERWQi1UMSIsCisJCS5uYW1lICAgICAgICAgICA9ICJEVmlDTyBGdXNpb25IRFRWIERWQi1UMSIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwgLyogTm8gYW5hbG9nIHR1bmVyICovCiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCkBAIC00NDUsOCArNDQ1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDAwMDAwN2Y4LAogICAgICAgICAgICAgICAgIH0sCiAJfSwKLQlbQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF0gPSB7Ci0JCS5uYW1lCQk9ICJEVmlDTyAtIEZ1c2lvbkhEVFYgMyBHb2xkIiwKKwlbQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9RXSA9IHsKKwkJLm5hbWUJCT0gIkRWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEiLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NSUNST1RVTkVfNDA0MkZJNSwKIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTQ2NCw2ICs0NjQsOSBAQAogCQkgICBHUElPWzNdIHNlbGVjdHMgUkYgaW5wdXQgY29ubmVjdG9yIG9uIHR1bmVyIG1vZHVsZQogCQkgICAgMCAtIFJGIGNvbm5lY3RvciBsYWJlbGVkIENBQkxFCiAJCSAgICAxIC0gUkYgY29ubmVjdG9yIGxhYmVsZWQgQU5UCisJCSAgIEdQSU9bNF0gc2VsZWN0cyBoaWdoIFJGIGZvciBRQU0yNTYgbW9kZQorCQkgICAgMCAtIG5vcm1hbCBSRgorCQkgICAgMSAtIGhpZ2ggUkYKIAkJKi8KIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKQEAgLTQ4Miw2ICs0ODUsNyBAQAogCQkJLnZtdXggICA9IDIsCiAJCQkuZ3BpbzAJPSAweDBmMDAsCiAJCX19LAorCQkuZHZiICAgICAgICAgICAgPSAxLAogCX0sCiAgICAgICAgIFtDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDFdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiSGF1cHBhdWdlIE5vdmEtVCBEVkItVCIsCkBAIC01MjAsNyArNTI0LDcgQEAKIAkJLmJsYWNrYmlyZCA9IDEsCiAJfSwKIAlbQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVNdID0gewotCQkubmFtZSAgICAgICAgICAgPSAiRFZJQ08gRnVzaW9uSERUViBEVkItVCBQbHVzIiwKKwkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgUGx1cyIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwgLyogTm8gYW5hbG9nIHR1bmVyICovCiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCkBAIC03MDAsMjEgKzcwNCwxNyBAQAogCQkgfSwKIAl9LAogICAgICAgICBbQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9UXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRFZpQ08gLSBGdXNpb25IRFRWIDMgR29sZC1UIiwKKwkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVQiLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9USE9NU09OX0RUVDc2MTEsCiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKLQkJLyogIFNlZSBEVmlDTyBGdXNpb25IRFRWIDMgR29sZCBmb3IgR1BJTyBkb2N1bWVudGF0aW9uLiAgKi8KLSAgICAgICAgICAgICAgICAuaW5wdXQgICAgICAgICAgPSB7eworCQkvKiAgU2VlIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgZm9yIEdQSU8gZG9jdW1lbnRhdGlvbi4gICovCisJCS5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDBmMGQsCiAgICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0NBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjA1LAotICAgICAgICAgICAgICAgIH0sewogICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLApAQCAtNzIzLDcgKzcyMywzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAogICAgICAgICAgICAgICAgIH19LAorCQkuZHZiICAgICAgICAgICAgPSAxLAogICAgICAgICB9LAorICAgICAgICBbQ1g4OF9CT0FSRF9BRFNURUNIX0RWQl9UX1BDSV0gPSB7CisgICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFEUyBUZWNoIEluc3RhbnQgVFYgRFZCLVQgUENJIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKKwkJCS5ncGlvMCAgPSAweDA3MDAsCisJCQkuZ3BpbzIgID0gMHgwMTAxLAorICAgICAgICAgICAgICAgIH0seworICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDA3MDAsCisJCQkuZ3BpbzIgID0gMHgwMTAxLAorICAgICAgICAgICAgICAgIH19LAorCQkuZHZiICAgICAgICAgICAgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYVRlYyBDaW5lcmd5IDE0MDAgRFZCLVQiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKKwkJCS52bXV4ICAgPSAwLAorCQl9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9ib2FyZHMpOwogCkBAIC03OTQsNyArODIzLDcgQEAKIAl9LHsKIAkJLnN1YnZlbmRvciA9IDB4MThhYywKIAkJLnN1YmRldmljZSA9IDB4ZDgxMCwKLQkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTEQsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1EsCiAJfSx7CiAJCS5zdWJ2ZW5kb3IgPSAweDE4YWMsCiAJCS5zdWJkZXZpY2UgPSAweGQ4MjAsCkBAIC04NDMsNyArODcyLDE1IEBACiAJCS5zdWJ2ZW5kb3IgPSAweDEwZmMsCiAJCS5zdWJkZXZpY2UgPSAweGQwMzUsCiAJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0lPREFUQV9HVkJDVFY3RSwKLQl9CisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE0MjEsCisJCS5zdWJkZXZpY2UgPSAweDAzMzQsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0FEU1RFQ0hfRFZCX1RfUENJLAorIAl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MTUzYiwKKwkJLnN1YmRldmljZSA9IDB4MTE2NiwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMSwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2lkY291bnQgPSBBUlJBWV9TSVpFKGN4ODhfc3ViaWRzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCmluZGV4IGMwNDZhMjMuLjVlODY4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjeDg4LWNvcmUuYyx2IDEuMjggMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IGN4ODgtY29yZS5jLHYgMS4zMyAyMDA1LzA3LzA3IDE0OjE3OjQ3IG1jaGVoYWIgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBDb25leGFudCAyMzg4eCBiYXNlZCBUViBjYXJkcwogICogZHJpdmVyIGNvcmUKQEAgLTQ3MCwyNSArNDcwLDYgQEAKIAlyZXR1cm4gaW5jcltyaXNjID4+IDI4XSA/IGluY3JbcmlzYyA+PiAyOF0gOiAxOwogfQogCi0jaWYgMCAvKiBjdXJyZW50bHkgdW51c2VkLCBidXQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgKi8KLXZvaWQgY3g4OF9yaXNjX2Rpc2FzbShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAotCQkgICAgICBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjKQotewotCXVuc2lnbmVkIGludCBpLGosbjsKLQotCXByaW50aygiJXM6IHJpc2MgZGlzYXNtOiAlcCBbZG1hPTB4JTA4bHhdXG4iLAotCSAgICAgICBjb3JlLT5uYW1lLCByaXNjLT5jcHUsICh1bnNpZ25lZCBsb25nKXJpc2MtPmRtYSk7Ci0JZm9yIChpID0gMDsgaSA8IChyaXNjLT5zaXplID4+IDIpOyBpICs9IG4pIHsKLQkJcHJpbnRrKCIlczogICAlMDRkOiAiLCBjb3JlLT5uYW1lLCBpKTsKLQkJbiA9IGN4ODhfcmlzY19kZWNvZGUocmlzYy0+Y3B1W2ldKTsKLQkJZm9yIChqID0gMTsgaiA8IG47IGorKykKLQkJCXByaW50aygiJXM6ICAgJTA0ZDogMHglMDh4IFsgYXJnICMlZCBdXG4iLAotCQkJICAgICAgIGNvcmUtPm5hbWUsIGkraiwgcmlzYy0+Y3B1W2kral0sIGopOwotCQlpZiAocmlzYy0+Y3B1W2ldID09IFJJU0NfSlVNUCkKLQkJCWJyZWFrOwotCX0KLX0KLSNlbmRpZgogCiB2b2lkIGN4ODhfc3JhbV9jaGFubmVsX2R1bXAoc3RydWN0IGN4ODhfY29yZSAqY29yZSwKIAkJCSAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCkKQEAgLTU1MSwyMSArNTMyLDYgQEAKIAkiYnJkZ19lcnIiLCAic3JjX2RtYV9lcnIiLCAiZHN0X2RtYV9lcnIiLCAiaXBiX2RtYV9lcnIiLAogCSJpMmMiLCAiaTJjX3JhY2siLCAiaXJfc21wIiwgImdwaW8wIiwgImdwaW8xIgogfTsKLWNoYXIgKmN4ODhfdmlkX2lycXNbMzJdID0gewotCSJ5X3Jpc2NpMSIsICJ1X3Jpc2NpMSIsICJ2X3Jpc2NpMSIsICJ2YmlfcmlzYzEiLAotCSJ5X3Jpc2NpMiIsICJ1X3Jpc2NpMiIsICJ2X3Jpc2NpMiIsICJ2YmlfcmlzYzIiLAotCSJ5X29mbG93IiwgICJ1X29mbG93IiwgICJ2X29mbG93IiwgICJ2Ymlfb2Zsb3ciLAotCSJ5X3N5bmMiLCAgICJ1X3N5bmMiLCAgICJ2X3N5bmMiLCAgICJ2Ymlfc3luYyIsCi0JIm9wY19lcnIiLCAgInBhcl9lcnIiLCAgInJpcF9lcnIiLCAgInBjaV9hYm9ydCIsCi19OwotY2hhciAqY3g4OF9tcGVnX2lycXNbMzJdID0gewotCSJ0c19yaXNjaTEiLCBOVUxMLCBOVUxMLCBOVUxMLAotCSJ0c19yaXNjaTIiLCBOVUxMLCBOVUxMLCBOVUxMLAotCSJ0c19vZmxvdyIsICBOVUxMLCBOVUxMLCBOVUxMLAotCSJ0c19zeW5jIiwgICBOVUxMLCBOVUxMLCBOVUxMLAotCSJvcGNfZXJyIiwgInBhcl9lcnIiLCAicmlwX2VyciIsICJwY2lfYWJvcnQiLAotCSJ0c19lcnI/IiwKLX07CiAKIHZvaWQgY3g4OF9wcmludF9pcnFiaXRzKGNoYXIgKm5hbWUsIGNoYXIgKnRhZywgY2hhciAqKnN0cmluZ3MsCiAJCQl1MzIgYml0cywgdTMyIG1hc2spCkBAIC02MTUsMTYgKzU4MSwxMSBAQAogCQkJYnJlYWs7CiAJCWJ1ZiA9IGxpc3RfZW50cnkocS0+YWN0aXZlLm5leHQsCiAJCQkJIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOwotI2lmIDAKLQkJaWYgKGJ1Zi0+Y291bnQgPiBjb3VudCkKLQkJCWJyZWFrOwotI2Vsc2UKIAkJLyogY291bnQgY29tZXMgZnJvbSB0aGUgaHcgYW5kIGlzIGlzIDE2Yml0IHdpZGUgLS0KIAkJICogdGhpcyB0cmljayBoYW5kbGVzIHdyYXAtYXJvdW5kcyBjb3JyZWN0bHkgZm9yCiAJCSAqIHVwIHRvIDMyNzY3IGJ1ZmZlcnMgaW4gZmxpZ2h0Li4uICovCiAJCWlmICgoczE2KSAoY291bnQgLSBidWYtPmNvdW50KSA8IDApCiAJCQlicmVhazsKLSNlbmRpZgogCQlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOwogCQlkcHJpbnRrKDIsIlslcC8lZF0gd2FrZXVwIHJlZz0lZCBidWY9JWRcbiIsYnVmLGJ1Zi0+dmIuaSwKIAkJCWNvdW50LCBidWYtPmNvdW50KTsKQEAgLTk1MiwxMiArOTEzLDEwIEBACiAJCW5vcm0tPmN4aWZvcm1hdCwgY3hfcmVhZChNT19JTlBVVF9GT1JNQVQpICYgMHgwZik7CiAJY3hfYW5kb3IoTU9fSU5QVVRfRk9STUFULCAweGYsIG5vcm0tPmN4aWZvcm1hdCk7CiAKLSNpZiAxCiAJLy8gRklYTUU6IGFzLWlzIGZyb20gRFNjYWxlcgogCWRwcmludGsoMSwic2V0X3R2bm9ybTogTU9fT1VUUFVUX0ZPUk1BVCAweCUwOHggW29sZD0weCUwOHhdXG4iLAogCQlub3JtLT5jeG9mb3JtYXQsIGN4X3JlYWQoTU9fT1VUUFVUX0ZPUk1BVCkpOwogCWN4X3dyaXRlKE1PX09VVFBVVF9GT1JNQVQsIG5vcm0tPmN4b2Zvcm1hdCk7Ci0jZW5kaWYKIAogCS8vIE1PX1NDT05WX1JFRyA9IGFkYyBjbG9jayAvIHZpZGVvIGRlYyBjbG9jayAqIDJeMTcKIAl0bXA2NCAgPSBhZGNfY2xvY2sgKiAodTY0KSgxIDw8IDE3KTsKQEAgLTEwMDYsMjEgKzk2NSw3IEBACiAJc2V0X3R2YXVkaW8oY29yZSk7CiAKIAkvLyB0ZWxsIGkyYyBjaGlwcwotI2lmZGVmIFY0TDJfSTJDX0NMSUVOVFMKIAljeDg4X2NhbGxfaTJjX2NsaWVudHMoY29yZSxWSURJT0NfU19TVEQsJm5vcm0tPmlkKTsKLSNlbHNlCi0JewotCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCBjOwotCQltZW1zZXQoJmMsMCxzaXplb2YoYykpOwotCQljLmNoYW5uZWwgPSBjb3JlLT5pbnB1dDsKLQkJYy5ub3JtID0gVklERU9fTU9ERV9QQUw7Ci0JCWlmICgobm9ybS0+aWQgJiAoVjRMMl9TVERfTlRTQ19NfFY0TDJfU1REX05UU0NfTV9KUCkpKQotCQkJYy5ub3JtID0gVklERU9fTU9ERV9OVFNDOwotCQlpZiAobm9ybS0+aWQgJiBWNEwyX1NURF9TRUNBTSkKLQkJCWMubm9ybSA9IFZJREVPX01PREVfU0VDQU07Ci0JCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhjb3JlLFZJRElPQ1NDSEFOLCZjKTsKLQl9Ci0jZW5kaWYKIAogCS8vIGRvbmUKIAlyZXR1cm4gMDsKQEAgLTEyMzAsOCArMTE3NSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogRVhQT1JUX1NZTUJPTChjeDg4X3ByaW50X2lvY3RsKTsKLUVYUE9SVF9TWU1CT0woY3g4OF92aWRfaXJxcyk7Ci1FWFBPUlRfU1lNQk9MKGN4ODhfbXBlZ19pcnFzKTsKIEVYUE9SVF9TWU1CT0woY3g4OF9wcmludF9pcnFiaXRzKTsKIAogRVhQT1JUX1NZTUJPTChjeDg4X2NvcmVfaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKaW5kZXggMWEyNTljMy4uOGRiNjhmMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogY3g4OC1kdmIuYyx2IDEuMzMgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IGN4ODgtZHZiLmMsdiAxLjQxIDIwMDUvMDcvMDQgMTk6MzU6MDUgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIENvbmV4YW50IDIzODh4IGJhc2VkIFRWIGNhcmRzCiAgKiBNUEVHIFRyYW5zcG9ydCBTdHJlYW0gKERWQikgcm91dGluZXMKQEAgLTMwLDIwICszMCwyNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKLS8qIHRob3NlIHR3byBmcm9udGVuZHMgbmVlZCBtZXJnaW5nIHZpYSBsaW51eHR2IGN2cyAuLi4gKi8KLSNkZWZpbmUgSEFWRV9DWDIyNzAyIDEKLSNkZWZpbmUgSEFWRV9PUjUxMTMyIDEKKyNkZWZpbmUgQ09ORklHX0RWQl9NVDM1MiAxCisjZGVmaW5lIENPTkZJR19EVkJfQ1gyMjcwMiAxCisjZGVmaW5lIENPTkZJR19EVkJfT1I1MTEzMiAxCisjZGVmaW5lIENPTkZJR19EVkJfTEdEVDMzMDIgMQogCiAjaW5jbHVkZSAiY3g4OC5oIgogI2luY2x1ZGUgImR2Yi1wbGwuaCIKLSNpbmNsdWRlICJtdDM1Mi5oIgotI2luY2x1ZGUgIm10MzUyX3ByaXYuaCIKLSNpZiBIQVZFX0NYMjI3MDIKKworI2lmIENPTkZJR19EVkJfTVQzNTIKKyMgaW5jbHVkZSAibXQzNTIuaCIKKyMgaW5jbHVkZSAibXQzNTJfcHJpdi5oIgorI2VuZGlmCisjaWYgQ09ORklHX0RWQl9DWDIyNzAyCiAjIGluY2x1ZGUgImN4MjI3MDIuaCIKICNlbmRpZgotI2lmIEhBVkVfT1I1MTEzMgorI2lmIENPTkZJR19EVkJfT1I1MTEzMgogIyBpbmNsdWRlICJvcjUxMTMyLmgiCiAjZW5kaWYKKyNpZiBDT05GSUdfRFZCX0xHRFQzMzAyCisjIGluY2x1ZGUgImxnZHQzMzAyLmgiCisjZW5kaWYKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgRFZCIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiIpOwpAQCAtMTAwLDYgKzEwNyw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisjaWYgQ09ORklHX0RWQl9NVDM1Mgogc3RhdGljIGludCBkdmljb19mdXNpb25oZHR2X2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RhdGljIHU4IGNsb2NrX2NvbmZpZyBbXSAgPSB7IENMT0NLX0NUTCwgIDB4MzgsIDB4MzkgfTsKQEAgLTE2Nyw4ICsxNzUsOSBAQAogCS5kZW1vZF9pbml0ICAgID0gZG50dl9saXZlX2R2YnRfZGVtb2RfaW5pdCwKIAkucGxsX3NldCAgICAgICA9IG10MzUyX3BsbF9zZXQsCiB9OworI2VuZGlmCiAKLSNpZiBIQVZFX0NYMjI3MDIKKyNpZiBDT05GSUdfRFZCX0NYMjI3MDIKIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgY29ubmV4YW50X3JlZmJvYXJkX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NDMsCiAJLnBsbF9hZGRyZXNzICAgPSAweDYwLApAQCAtMTgyLDcgKzE5MSw3IEBACiB9OwogI2VuZGlmCiAKLSNpZiBIQVZFX09SNTExMzIKKyNpZiBDT05GSUdfRFZCX09SNTExMzIKIHN0YXRpYyBpbnQgb3I1MTEzMl9zZXRfdHNfcGFyYW0oc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCiAJCQkJaW50IGlzX3B1bmN0dXJlZCkKIHsKQEAgLTE5OSw2ICsyMDgsMzIgQEAKIH07CiAjZW5kaWYKIAorI2lmIENPTkZJR19EVkJfTEdEVDMzMDIKK3N0YXRpYyBpbnQgbGdkdDMzMDJfc2V0X3RzX3BhcmFtKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgaXNfcHVuY3R1cmVkKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY9IGZlLT5kdmItPnByaXY7CisJaWYgKGlzX3B1bmN0dXJlZCkKKwkJZGV2LT50c19nZW5fY250cmwgfD0gMHgwNDsKKwllbHNlCisJCWRldi0+dHNfZ2VuX2NudHJsICY9IH4weDA0OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxnZHQzMzAyX2NvbmZpZyBmdXNpb25oZHR2XzNfZ29sZF9xID0geworCS5kZW1vZF9hZGRyZXNzICAgID0gMHgwZSwKKwkucGxsX2FkZHJlc3MgICAgICA9IDB4NjEsCisJLnBsbF9kZXNjICAgICAgICAgPSAmZHZiX3BsbF9taWNyb3R1bmVfNDA0MiwKKwkuc2V0X3RzX3BhcmFtcyAgICA9IGxnZHQzMzAyX3NldF90c19wYXJhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGdkdDMzMDJfY29uZmlnIGZ1c2lvbmhkdHZfM19nb2xkX3QgPSB7CisJLmRlbW9kX2FkZHJlc3MgICAgPSAweDBlLAorCS5wbGxfYWRkcmVzcyAgICAgID0gMHg2MSwKKwkucGxsX2Rlc2MgICAgICAgICA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzYxMSwKKwkuc2V0X3RzX3BhcmFtcyAgICA9IGxnZHQzMzAyX3NldF90c19wYXJhbSwKK307CisjZW5kaWYKKwogc3RhdGljIGludCBkdmJfcmVnaXN0ZXIoc3RydWN0IGN4ODgwMl9kZXYgKmRldikKIHsKIAkvKiBpbml0IHN0cnVjdCB2aWRlb2J1Zl9kdmIgKi8KQEAgLTIwNywxNiArMjQyLDE4IEBACiAKIAkvKiBpbml0IGZyb250ZW5kICovCiAJc3dpdGNoIChkZXYtPmNvcmUtPmJvYXJkKSB7Ci0jaWYgSEFWRV9DWDIyNzAyCisjaWYgQ09ORklHX0RWQl9DWDIyNzAyCiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gY3gyMjcwMl9hdHRhY2goJmhhdXBwYXVnZV9ub3ZhdF9jb25maWcsCiAJCQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZXzE0MDBfRFZCX1QxOgogCWNhc2UgQ1g4OF9CT0FSRF9DT05FWEFOVF9EVkJfVDE6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gY3gyMjcwMl9hdHRhY2goJmNvbm5leGFudF9yZWZib2FyZF9jb25maWcsCiAJCQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWJyZWFrOwogI2VuZGlmCisjaWYgQ09ORklHX0RWQl9NVDM1MgogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UMToKIAkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7CiAJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9sZ196MjAxOwpAQCAtMjMxLDE3ICsyNjgsNDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJfVDoKIAljYXNlIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UOgorCWNhc2UgQ1g4OF9CT0FSRF9BRFNURUNIX0RWQl9UX1BDSToKIAkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7CiAJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF91bmtub3duXzE7CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkbnR2X2xpdmVfZHZidF9jb25maWcsCiAJCQkJCQkgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlicmVhazsKLSNpZiBIQVZFX09SNTExMzIKKyNlbmRpZgorI2lmIENPTkZJR19EVkJfT1I1MTEzMgogCWNhc2UgQ1g4OF9CT0FSRF9QQ0hEVFZfSEQzMDAwOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG9yNTExMzJfYXR0YWNoKCZwY2hkdHZfaGQzMDAwLAogCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKIAkJYnJlYWs7CiAjZW5kaWYKKyNpZiBDT05GSUdfRFZCX0xHRFQzMzAyCisJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1E6CisJCWRldi0+dHNfZ2VuX2NudHJsID0gMHgwODsKKwkJeworCQkvKiBEbyBhIGhhcmR3YXJlIHJlc2V0IG9mIGNoaXAgYmVmb3JlIHVzaW5nIGl0LiAqLworCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJCWN4X2NsZWFyKE1PX0dQMF9JTywgMSk7CisJCW1kZWxheSgxMDApOworCQljeF9zZXQoTU9fR1AwX0lPLCA5KTsgLy8gQU5UIGNvbm5lY3RvciB0b28gRklYTUUKKwkJbWRlbGF5KDIwMCk7CisJCWRldi0+ZHZiLmZyb250ZW5kID0gbGdkdDMzMDJfYXR0YWNoKCZmdXNpb25oZHR2XzNfZ29sZF9xLAorCQkJCQkJICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfVDoKKwkJZGV2LT50c19nZW5fY250cmwgPSAweDA4OworCQl7CisJCS8qIERvIGEgaGFyZHdhcmUgcmVzZXQgb2YgY2hpcCBiZWZvcmUgdXNpbmcgaXQuICovCisJCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwkJY3hfY2xlYXIoTU9fR1AwX0lPLCAxKTsKKwkJbWRlbGF5KDEwMCk7CisJCWN4X3NldChNT19HUDBfSU8sIDkpOyAvKiBBTlQgY29ubmVjdG9yIHRvbyBGSVhNRSAqLworCQltZGVsYXkoMjAwKTsKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSBsZ2R0MzMwMl9hdHRhY2goJmZ1c2lvbmhkdHZfM19nb2xkX3QsCisJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQl9CisJCWJyZWFrOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJcHJpbnRrKCIlczogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iLAogCQkgICAgICAgZGV2LT5jb3JlLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKaW5kZXggZTIwYWRlZi4uODQwM2M0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICAgICRJZDogY3g4OC1pMmMuYyx2IDEuMjMgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgICAgJElkOiBjeDg4LWkyYy5jLHYgMS4yOCAyMDA1LzA3LzA1IDE3OjM3OjM1IG5zaCBFeHAgJAogCiAgICAgY3g4OC1pMmMuYyAgLS0gIGFsbCB0aGUgaTJjIGNvZGUgaXMgaGVyZQogCkBAIC05MSwyNSArOTEsMzIgQEAKIAogc3RhdGljIGludCBhdHRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0gICAgICAgIHN0cnVjdCB0dW5lcl9hZGRyIHR1bl9hZGRyOworICAgICAgICBzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOwogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CiAKLQlkcHJpbnRrKDEsICJpMmMgYXR0YWNoIFthZGRyPTB4JXgsY2xpZW50PSVzXVxuIiwKLQkJY2xpZW50LT5hZGRyLCBpMmNfY2xpZW50bmFtZShjbGllbnQpKTsKKwlkcHJpbnRrKDEsICIlcyBpMmMgYXR0YWNoIFthZGRyPTB4JXgsY2xpZW50PSVzXVxuIiwKKwkJY2xpZW50LT5kcml2ZXItPm5hbWUsY2xpZW50LT5hZGRyLGkyY19jbGllbnRuYW1lKGNsaWVudCkpOwogCWlmICghY2xpZW50LT5kcml2ZXItPmNvbW1hbmQpCiAJCXJldHVybiAwOwogCiAgICAgICAgIGlmIChjb3JlLT5yYWRpb190eXBlICE9IFVOU0VUKSB7Ci0gICAgICAgICAgICAgICAgdHVuX2FkZHIudjRsMl90dW5lciA9IFY0TDJfVFVORVJfUkFESU87Ci0gICAgICAgICAgICAgICAgdHVuX2FkZHIudHlwZSA9IGNvcmUtPnJhZGlvX3R5cGU7Ci0gICAgICAgICAgICAgICAgdHVuX2FkZHIuYWRkciA9IGNvcmUtPnJhZGlvX2FkZHI7Ci0gICAgICAgICAgICAgICAgY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fYWRkcik7CisJCWlmICgoY29yZS0+cmFkaW9fYWRkcj09QUREUl9VTlNFVCl8fChjb3JlLT5yYWRpb19hZGRyPT1jbGllbnQtPmFkZHIpKSB7CisJCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTzsKKwkJCXR1bl9zZXR1cC50eXBlID0gY29yZS0+cmFkaW9fdHlwZTsKKwkJCXR1bl9zZXR1cC5hZGRyID0gY29yZS0+cmFkaW9fYWRkcjsKKworCQkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQgKGNsaWVudCwgVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CisJCX0KICAgICAgICAgfQogICAgICAgICBpZiAoY29yZS0+dHVuZXJfdHlwZSAhPSBVTlNFVCkgewotICAgICAgICAgICAgICAgIHR1bl9hZGRyLnY0bDJfdHVuZXIgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLSAgICAgICAgICAgICAgICB0dW5fYWRkci50eXBlID0gY29yZS0+dHVuZXJfdHlwZTsKLSAgICAgICAgICAgICAgICB0dW5fYWRkci5hZGRyID0gY29yZS0+dHVuZXJfYWRkcjsKLSAgICAgICAgICAgICAgICBjbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9hZGRyKTsKKwkJaWYgKChjb3JlLT50dW5lcl9hZGRyPT1BRERSX1VOU0VUKXx8KGNvcmUtPnR1bmVyX2FkZHI9PWNsaWVudC0+YWRkcikpIHsKKworCQkJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfQU5BTE9HX1RWOworCQkJdHVuX3NldHVwLnR5cGUgPSBjb3JlLT50dW5lcl90eXBlOworCQkJdHVuX3NldHVwLmFkZHIgPSBjb3JlLT50dW5lcl9hZGRyOworCisJCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZCAoY2xpZW50LFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQl9CiAgICAgICAgIH0KIAogCWlmIChjb3JlLT50ZGE5ODg3X2NvbmYpCkBAIC0xNTcsNiArMTY0LDcgQEAKIH07CiAKIHN0YXRpYyBjaGFyICppMmNfZGV2c1sxMjhdID0geworCVsgMHgxYyA+PiAxIF0gPSAibGdkdDMzMDIiLAogCVsgMHg4NiA+PiAxIF0gPSAidGRhOTg4Ny9jeDIyNzAyIiwKIAlbIDB4YTAgPj4gMSBdID0gImVlcHJvbSIsCiAJWyAweGMwID4+IDEgXSA9ICJ0dW5lciAoYW5hbG9nKSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwppbmRleCBkYzBkY2YyLi4yMTQ4ODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjeDg4LWlucHV0LmMsdiAxLjExIDIwMDUvMDUvMjIgMjA6NTc6NTYgbnNoIEV4cCAkCisgKiAkSWQ6IGN4ODgtaW5wdXQuYyx2IDEuMTUgMjAwNS8wNy8wNyAxMzo1ODozOCBtY2hlaGFiIEV4cCAkCiAgKgogICogRGV2aWNlIGRyaXZlciBmb3IgR1BJTyBhdHRhY2hlZCByZW1vdGUgY29udHJvbCBpbnRlcmZhY2VzCiAgKiBvbiBDb25leGFudCAyMzg4eCBiYXNlZCBUVi9EVkIgY2FyZHMuCkBAIC0zOCwxMTkgKzM4LDIwNiBAQAogCiAvKiBEaWdpdGFsTm93IEROVFYgTGl2ZSBEVkItVCBSZW1vdGUgKi8KIHN0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19kbnR2X2xpdmVfZHZiX3RbSVJfS0VZVEFCX1NJWkVdID0gewotCVsgMHgwMCBdID0gS0VZX0VTQywgICAgICAgICAvLyAnZ28gdXAgYSBsZXZlbD8nCi0JWyAweDAxIF0gPSBLRVlfS1AxLCAgICAgICAgIC8vICcxJwotCVsgMHgwMiBdID0gS0VZX0tQMiwgICAgICAgICAvLyAnMicKLQlbIDB4MDMgXSA9IEtFWV9LUDMsICAgICAgICAgLy8gJzMnCi0JWyAweDA0IF0gPSBLRVlfS1A0LCAgICAgICAgIC8vICc0JwotCVsgMHgwNSBdID0gS0VZX0tQNSwgICAgICAgICAvLyAnNScKLQlbIDB4MDYgXSA9IEtFWV9LUDYsICAgICAgICAgLy8gJzYnCi0JWyAweDA3IF0gPSBLRVlfS1A3LCAgICAgICAgIC8vICc3JwotCVsgMHgwOCBdID0gS0VZX0tQOCwgICAgICAgICAvLyAnOCcKLQlbIDB4MDkgXSA9IEtFWV9LUDksICAgICAgICAgLy8gJzknCi0JWyAweDBhIF0gPSBLRVlfS1AwLCAgICAgICAgIC8vICcwJwotCVsgMHgwYiBdID0gS0VZX1RVTkVSLCAgICAgICAvLyAndHYvZm0nCi0JWyAweDBjIF0gPSBLRVlfU0VBUkNILCAgICAgIC8vICdzY2FuJwotCVsgMHgwZCBdID0gS0VZX1NUT1AsICAgICAgICAvLyAnc3RvcCcKLQlbIDB4MGUgXSA9IEtFWV9QQVVTRSwgICAgICAgLy8gJ3BhdXNlJwotCVsgMHgwZiBdID0gS0VZX0xJU1QsICAgICAgICAvLyAnc291cmNlJworCVsweDAwXSA9IEtFWV9FU0MsCQkvKiAnZ28gdXAgYSBsZXZlbD8nICovCisJLyogS2V5cyAwIHRvIDkgKi8KKwlbMHgwYV0gPSBLRVlfS1AwLAorCVsweDAxXSA9IEtFWV9LUDEsCisJWzB4MDJdID0gS0VZX0tQMiwKKwlbMHgwM10gPSBLRVlfS1AzLAorCVsweDA0XSA9IEtFWV9LUDQsCisJWzB4MDVdID0gS0VZX0tQNSwKKwlbMHgwNl0gPSBLRVlfS1A2LAorCVsweDA3XSA9IEtFWV9LUDcsCisJWzB4MDhdID0gS0VZX0tQOCwKKwlbMHgwOV0gPSBLRVlfS1A5LAogCi0JWyAweDEwIF0gPSBLRVlfTVVURSwgICAgICAgIC8vICdtdXRlJwotCVsgMHgxMSBdID0gS0VZX1JFV0lORCwgICAgICAvLyAnYmFja3dhcmQgPDwnCi0JWyAweDEyIF0gPSBLRVlfUE9XRVIsICAgICAgIC8vICdwb3dlcicKLQlbIDB4MTMgXSA9IEtFWV9TLCAgICAgICAgICAgLy8gJ3NuYXAnCi0JWyAweDE0IF0gPSBLRVlfQVVESU8sICAgICAgIC8vICdzdGVyZW8nCi0JWyAweDE1IF0gPSBLRVlfQ0xFQVIsICAgICAgIC8vICdyZXNldCcKLQlbIDB4MTYgXSA9IEtFWV9QTEFZLCAgICAgICAgLy8gJ3BsYXknCi0JWyAweDE3IF0gPSBLRVlfRU5URVIsICAgICAgIC8vICdlbnRlcicKLQlbIDB4MTggXSA9IEtFWV9aT09NLCAgICAgICAgLy8gJ2Z1bGwgc2NyZWVuJwotCVsgMHgxOSBdID0gS0VZX0ZBU1RGT1JXQVJELCAvLyAnZm9yd2FyZCA+PicKLQlbIDB4MWEgXSA9IEtFWV9DSEFOTkVMVVAsICAgLy8gJ2NoYW5uZWwgKycKLQlbIDB4MWIgXSA9IEtFWV9WT0xVTUVVUCwgICAgLy8gJ3ZvbHVtZSArJwotCVsgMHgxYyBdID0gS0VZX0lORk8sICAgICAgICAvLyAncHJldmlldycKLQlbIDB4MWQgXSA9IEtFWV9SRUNPUkQsICAgICAgLy8gJ3JlY29yZCcKLQlbIDB4MWUgXSA9IEtFWV9DSEFOTkVMRE9XTiwgLy8gJ2NoYW5uZWwgLScKLQlbIDB4MWYgXSA9IEtFWV9WT0xVTUVET1dOLCAgLy8gJ3ZvbHVtZSAtJworCVsweDBiXSA9IEtFWV9UVU5FUiwJCS8qIHR2L2ZtICovCisJWzB4MGNdID0gS0VZX1NFQVJDSCwJCS8qIHNjYW4gKi8KKwlbMHgwZF0gPSBLRVlfU1RPUCwKKwlbMHgwZV0gPSBLRVlfUEFVU0UsCisJWzB4MGZdID0gS0VZX0xJU1QsCQkvKiBzb3VyY2UgKi8KKworCVsweDEwXSA9IEtFWV9NVVRFLAorCVsweDExXSA9IEtFWV9SRVdJTkQsCQkvKiBiYWNrd2FyZCA8PCAqLworCVsweDEyXSA9IEtFWV9QT1dFUiwKKwlbMHgxM10gPSBLRVlfUywJCQkvKiBzbmFwICovCisJWzB4MTRdID0gS0VZX0FVRElPLAkJLyogc3RlcmVvICovCisJWzB4MTVdID0gS0VZX0NMRUFSLAkJLyogcmVzZXQgKi8KKwlbMHgxNl0gPSBLRVlfUExBWSwKKwlbMHgxN10gPSBLRVlfRU5URVIsCisJWzB4MThdID0gS0VZX1pPT00sCQkvKiBmdWxsIHNjcmVlbiAqLworCVsweDE5XSA9IEtFWV9GQVNURk9SV0FSRCwJLyogZm9yd2FyZCA+PiAqLworCVsweDFhXSA9IEtFWV9DSEFOTkVMVVAsCisJWzB4MWJdID0gS0VZX1ZPTFVNRVVQLAorCVsweDFjXSA9IEtFWV9JTkZPLAkJLyogcHJldmlldyAqLworCVsweDFkXSA9IEtFWV9SRUNPUkQsCQkvKiByZWNvcmQgKi8KKwlbMHgxZV0gPSBLRVlfQ0hBTk5FTERPV04sCisJWzB4MWZdID0gS0VZX1ZPTFVNRURPV04sCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIElPLURBVEEgQkNUVjdFIFJlbW90ZSAqLwogc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2lvZGF0YV9iY3R2N2VbSVJfS0VZVEFCX1NJWkVdID0gewotCVsgMHg0MCBdID0gS0VZX1RWLCAgICAgICAgICAgICAgLy8gVFYKLQlbIDB4MjAgXSA9IEtFWV9SQURJTywgICAgICAgICAgIC8vIEZNCi0JWyAweDYwIF0gPSBLRVlfRVBHLCAgICAgICAgICAgICAvLyBFUEcKLQlbIDB4MDAgXSA9IEtFWV9QT1dFUiwgICAgICAgICAgIC8vIHBvd2VyCisJWzB4NDBdID0gS0VZX1RWLAorCVsweDIwXSA9IEtFWV9SQURJTywJCS8qIEZNICovCisJWzB4NjBdID0gS0VZX0VQRywKKwlbMHgwMF0gPSBLRVlfUE9XRVIsCiAKLQlbIDB4NTAgXSA9IEtFWV9LUDEsICAgICAgICAgICAgIC8vIDEKLQlbIDB4MzAgXSA9IEtFWV9LUDIsICAgICAgICAgICAgIC8vIDIKLQlbIDB4NzAgXSA9IEtFWV9LUDMsICAgICAgICAgICAgIC8vIDMKLQlbIDB4MTAgXSA9IEtFWV9MLCAgICAgICAgICAgICAgIC8vIExpdmUKKwkvKiBLZXlzIDAgdG8gOSAqLworCVsweDQ0XSA9IEtFWV9LUDAsCQkvKiAxMCAqLworCVsweDUwXSA9IEtFWV9LUDEsCisJWzB4MzBdID0gS0VZX0tQMiwKKwlbMHg3MF0gPSBLRVlfS1AzLAorCVsweDQ4XSA9IEtFWV9LUDQsCisJWzB4MjhdID0gS0VZX0tQNSwKKwlbMHg2OF0gPSBLRVlfS1A2LAorCVsweDU4XSA9IEtFWV9LUDcsCisJWzB4MzhdID0gS0VZX0tQOCwKKwlbMHg3OF0gPSBLRVlfS1A5LAogCi0JWyAweDQ4IF0gPSBLRVlfS1A0LCAgICAgICAgICAgICAvLyA0Ci0JWyAweDI4IF0gPSBLRVlfS1A1LCAgICAgICAgICAgICAvLyA1Ci0JWyAweDY4IF0gPSBLRVlfS1A2LCAgICAgICAgICAgICAvLyA2Ci0JWyAweDA4IF0gPSBLRVlfVCwgICAgICAgICAgICAgICAvLyBUaW1lIFNoaWZ0CisJWzB4MTBdID0gS0VZX0wsCQkJLyogTGl2ZSAqLworCVsweDA4XSA9IEtFWV9ULAkJCS8qIFRpbWUgU2hpZnQgKi8KIAotCVsgMHg1OCBdID0gS0VZX0tQNywgICAgICAgICAgICAgLy8gNwotCVsgMHgzOCBdID0gS0VZX0tQOCwgICAgICAgICAgICAgLy8gOAotCVsgMHg3OCBdID0gS0VZX0tQOSwgICAgICAgICAgICAgLy8gOQotCVsgMHgxOCBdID0gS0VZX1BMQVlQQVVTRSwgICAgICAgLy8gUGxheQorCVsweDE4XSA9IEtFWV9QTEFZUEFVU0UsCQkvKiBQbGF5ICovCiAKLQlbIDB4NDQgXSA9IEtFWV9LUDAsICAgICAgICAgICAgIC8vIDEwCi0JWyAweDI0IF0gPSBLRVlfRU5URVIsICAgICAgICAgICAvLyAxMQotCVsgMHg2NCBdID0gS0VZX0VTQywgICAgICAgICAgICAgLy8gMTIKLQlbIDB4MDQgXSA9IEtFWV9NLCAgICAgICAgICAgICAgIC8vIE11bHRpCisJWzB4MjRdID0gS0VZX0VOVEVSLAkJLyogMTEgKi8KKwlbMHg2NF0gPSBLRVlfRVNDLAkJLyogMTIgKi8KKwlbMHgwNF0gPSBLRVlfTSwJCQkvKiBNdWx0aSAqLwogCi0JWyAweDU0IF0gPSBLRVlfVklERU8sICAgICAgICAgICAvLyBWSURFTwotCVsgMHgzNCBdID0gS0VZX0NIQU5ORUxVUCwgICAgICAgLy8gY2hhbm5lbCArCi0JWyAweDc0IF0gPSBLRVlfVk9MVU1FVVAsICAgICAgICAvLyB2b2x1bWUgKwotCVsgMHgxNCBdID0gS0VZX01VVEUsICAgICAgICAgICAgLy8gTXV0ZQorCVsweDU0XSA9IEtFWV9WSURFTywKKwlbMHgzNF0gPSBLRVlfQ0hBTk5FTFVQLAorCVsweDc0XSA9IEtFWV9WT0xVTUVVUCwKKwlbMHgxNF0gPSBLRVlfTVVURSwKIAotCVsgMHg0YyBdID0gS0VZX1MsICAgICAgICAgICAgICAgLy8gU1ZJREVPCi0JWyAweDJjIF0gPSBLRVlfQ0hBTk5FTERPV04sICAgICAvLyBjaGFubmVsIC0KLQlbIDB4NmMgXSA9IEtFWV9WT0xVTUVET1dOLCAgICAgIC8vIHZvbHVtZSAtCi0JWyAweDBjIF0gPSBLRVlfWk9PTSwgICAgICAgICAgICAvLyBab29tCisJWzB4NGNdID0gS0VZX1MsCQkJLyogU1ZJREVPICovCisJWzB4MmNdID0gS0VZX0NIQU5ORUxET1dOLAorCVsweDZjXSA9IEtFWV9WT0xVTUVET1dOLAorCVsweDBjXSA9IEtFWV9aT09NLAogCi0JWyAweDVjIF0gPSBLRVlfUEFVU0UsICAgICAgICAgICAvLyBwYXVzZQotCVsgMHgzYyBdID0gS0VZX0MsICAgICAgICAgICAgICAgLy8gfHwgKHJlZCkKLQlbIDB4N2MgXSA9IEtFWV9SRUNPUkQsICAgICAgICAgIC8vIHJlY29yZGluZwotCVsgMHgxYyBdID0gS0VZX1NUT1AsICAgICAgICAgICAgLy8gc3RvcAorCVsweDVjXSA9IEtFWV9QQVVTRSwKKwlbMHgzY10gPSBLRVlfQywJCQkvKiB8fCAocmVkKSAqLworCVsweDdjXSA9IEtFWV9SRUNPUkQsCQkvKiByZWNvcmRpbmcgKi8KKwlbMHgxY10gPSBLRVlfU1RPUCwKIAotCVsgMHg0MSBdID0gS0VZX1JFV0lORCwgICAgICAgICAgLy8gYmFja3dhcmQgPDwKLQlbIDB4MjEgXSA9IEtFWV9QTEFZLCAgICAgICAgICAgIC8vIHBsYXkKLQlbIDB4NjEgXSA9IEtFWV9GQVNURk9SV0FSRCwgICAgIC8vIGZvcndhcmQgPj4KLQlbIDB4MDEgXSA9IEtFWV9ORVhULCAgICAgICAgICAgIC8vIHNraXAgPnwKKwlbMHg0MV0gPSBLRVlfUkVXSU5ELAkJLyogYmFja3dhcmQgPDwgKi8KKwlbMHgyMV0gPSBLRVlfUExBWSwKKwlbMHg2MV0gPSBLRVlfRkFTVEZPUldBUkQsCS8qIGZvcndhcmQgPj4gKi8KKwlbMHgwMV0gPSBLRVlfTkVYVCwJCS8qIHNraXAgPnwgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQURTIFRlY2ggSW5zdGFudCBUViBEVkItVCBQQ0kgUmVtb3RlICovCitzdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfYWRzdGVjaF9kdmJfdF9wY2lbSVJfS0VZVEFCX1NJWkVdID0geworCS8qIEtleXMgMCB0byA5ICovCisJWzB4NGRdID0gS0VZXzAsCisJWzB4NTddID0gS0VZXzEsCisJWzB4NGZdID0gS0VZXzIsCisJWzB4NTNdID0gS0VZXzMsCisJWzB4NTZdID0gS0VZXzQsCisJWzB4NGVdID0gS0VZXzUsCisJWzB4NWVdID0gS0VZXzYsCisJWzB4NTRdID0gS0VZXzcsCisJWzB4NGNdID0gS0VZXzgsCisJWzB4NWNdID0gS0VZXzksCisKKwlbMHg1Yl0gPSBLRVlfUE9XRVIsCisJWzB4NWZdID0gS0VZX01VVEUsCisJWzB4NTVdID0gS0VZX0dPVE8sCisJWzB4NWRdID0gS0VZX1NFQVJDSCwKKwlbMHgxN10gPSBLRVlfRVBHLAkJLyogR3VpZGUgKi8KKwlbMHgxZl0gPSBLRVlfTUVOVSwKKwlbMHgwZl0gPSBLRVlfVVAsCisJWzB4NDZdID0gS0VZX0RPV04sCisJWzB4MTZdID0gS0VZX0xFRlQsCisJWzB4MWVdID0gS0VZX1JJR0hULAorCVsweDBlXSA9IEtFWV9TRUxFQ1QsCQkvKiBFbnRlciAqLworCVsweDVhXSA9IEtFWV9JTkZPLAorCVsweDUyXSA9IEtFWV9FWElULAorCVsweDU5XSA9IEtFWV9QUkVWSU9VUywKKwlbMHg1MV0gPSBLRVlfTkVYVCwKKwlbMHg1OF0gPSBLRVlfUkVXSU5ELAorCVsweDUwXSA9IEtFWV9GT1JXQVJELAorCVsweDQ0XSA9IEtFWV9QTEFZUEFVU0UsCisJWzB4MDddID0gS0VZX1NUT1AsCisJWzB4MWJdID0gS0VZX1JFQ09SRCwKKwlbMHgxM10gPSBLRVlfVFVORVIsCQkvKiBMaXZlICovCisJWzB4MGFdID0gS0VZX0EsCisJWzB4MTJdID0gS0VZX0IsCisJWzB4MDNdID0gS0VZX1BST0cxLAkJLyogMSAqLworCVsweDAxXSA9IEtFWV9QUk9HMiwJCS8qIDIgKi8KKwlbMHgwMF0gPSBLRVlfUFJPRzMsCQkvKiAzICovCisJWzB4MDZdID0gS0VZX0RWRCwKKwlbMHg0OF0gPSBLRVlfQVVYLAkJLyogUGhvdG8gKi8KKwlbMHg0MF0gPSBLRVlfVklERU8sCisJWzB4MTldID0gS0VZX0FVRElPLAkJLyogTXVzaWMgKi8KKwlbMHgwYl0gPSBLRVlfQ0hBTk5FTFVQLAorCVsweDA4XSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbMHgxNV0gPSBLRVlfVk9MVU1FVVAsCisJWzB4MWNdID0gS0VZX1ZPTFVNRURPV04sCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE1TSSBUVkBueXdoZXJlIHJlbW90ZSAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX21zaV90dmFueXdoZXJlW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwkvKiBLZXlzIDAgdG8gOSAqLworCVsweDAwXSA9IEtFWV8wLAorCVsweDAxXSA9IEtFWV8xLAorCVsweDAyXSA9IEtFWV8yLAorCVsweDAzXSA9IEtFWV8zLAorCVsweDA0XSA9IEtFWV80LAorCVsweDA1XSA9IEtFWV81LAorCVsweDA2XSA9IEtFWV82LAorCVsweDA3XSA9IEtFWV83LAorCVsweDA4XSA9IEtFWV84LAorCVsweDA5XSA9IEtFWV85LAorCisJWzB4MGNdID0gS0VZX01VVEUsCisJWzB4MGZdID0gS0VZX1NDUkVFTiwJCS8qIEZ1bGwgU2NyZWVuICovCisJWzB4MTBdID0gS0VZX0YsCQkJLyogRnVudGlvbiAqLworCVsweDExXSA9IEtFWV9ULAkJCS8qIFRpbWUgc2hpZnQgKi8KKwlbMHgxMl0gPSBLRVlfUE9XRVIsCisJWzB4MTNdID0gS0VZX01FRElBLAkJLyogTVRTICovCisJWzB4MTRdID0gS0VZX1NMT1csCisJWzB4MTZdID0gS0VZX1JFV0lORCwJCS8qIGJhY2t3YXJkIDw8ICovCisJWzB4MTddID0gS0VZX0VOVEVSLAkJLyogUmV0dXJuICovCisJWzB4MThdID0gS0VZX0ZBU1RGT1JXQVJELAkvKiBmb3J3YXJkID4+ICovCisJWzB4MWFdID0gS0VZX0NIQU5ORUxVUCwKKwlbMHgxYl0gPSBLRVlfVk9MVU1FVVAsCisJWzB4MWVdID0gS0VZX0NIQU5ORUxET1dOLAorCVsweDFmXSA9IEtFWV9WT0xVTUVET1dOLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdHJ1Y3QgY3g4OF9JUiB7Ci0Jc3RydWN0IGN4ODhfY29yZQkqY29yZTsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICAgICAgICBpbnB1dDsKLQlzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgICBpcjsKLQljaGFyICAgICAgICAgICAgICAgICAgICBuYW1lWzMyXTsKLQljaGFyICAgICAgICAgICAgICAgICAgICBwaHlzWzMyXTsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlOworCXN0cnVjdCBpbnB1dF9kZXYgaW5wdXQ7CisJc3RydWN0IGlyX2lucHV0X3N0YXRlIGlyOworCWNoYXIgbmFtZVszMl07CisJY2hhciBwaHlzWzMyXTsKIAogCS8qIHNhbXBsZSBmcm9tIGdwaW8gcGluIDE2ICovCi0JaW50ICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmc7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1sxNl07Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgc2NvdW50OwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHJlbGVhc2U7CisJaW50IHNhbXBsaW5nOworCXUzMiBzYW1wbGVzWzE2XTsKKwlpbnQgc2NvdW50OworCXVuc2lnbmVkIGxvbmcgcmVsZWFzZTsKIAogCS8qIHBvbGwgZXh0ZXJuYWwgZGVjb2RlciAqLwotCWludCAgICAgICAgICAgICAgICAgICAgIHBvbGxpbmc7Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgd29yazsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICB0aW1lcjsKLQl1MzIJCQlncGlvX2FkZHI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgbGFzdF9ncGlvOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5Y29kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBtYXNrX2tleWRvd247Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgbWFza19rZXl1cDsKKwlpbnQgcG9sbGluZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1MzIgZ3Bpb19hZGRyOworCXUzMiBsYXN0X2dwaW87CisJdTMyIG1hc2tfa2V5Y29kZTsKKwl1MzIgbWFza19rZXlkb3duOworCXUzMiBtYXNrX2tleXVwOwogfTsKIAogc3RhdGljIGludCBpcl9kZWJ1ZyA9IDA7Ci1tb2R1bGVfcGFyYW0oaXJfZGVidWcsIGludCwgMDY0NCk7ICAgIC8qIGRlYnVnIGxldmVsIFtJUl0gKi8KK21vZHVsZV9wYXJhbShpcl9kZWJ1ZywgaW50LCAwNjQ0KTsJLyogZGVidWcgbGV2ZWwgW0lSXSAqLwogTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbSVJdIik7CiAKICNkZWZpbmUgaXJfZHByaW50ayhmbXQsIGFyZy4uLikJaWYgKGlyX2RlYnVnKSBcCkBAIC0xNzQsMzcgKzI2MSwzNyBAQAogCS8qIGV4dHJhY3QgZGF0YSAqLwogCWRhdGEgPSBpcl9leHRyYWN0X2JpdHMoZ3BpbywgaXItPm1hc2tfa2V5Y29kZSk7CiAJaXJfZHByaW50aygiaXJxIGdwaW89MHgleCBjb2RlPSVkIHwgJXMlcyVzXG4iLAotCQlncGlvLCBkYXRhLAotCQlpci0+cG9sbGluZyAgICAgICAgICAgICAgID8gInBvbGwiICA6ICJpcnEiLAotCQkoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pID8gIiBkb3duIiA6ICIiLAotCQkoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSAgID8gIiB1cCIgICA6ICIiKTsKKwkJICAgZ3BpbywgZGF0YSwKKwkJICAgaXItPnBvbGxpbmcgPyAicG9sbCIgOiAiaXJxIiwKKwkJICAgKGdwaW8gJiBpci0+bWFza19rZXlkb3duKSA/ICIgZG93biIgOiAiIiwKKwkJICAgKGdwaW8gJiBpci0+bWFza19rZXl1cCkgPyAiIHVwIiA6ICIiKTsKIAogCWlmIChpci0+bWFza19rZXlkb3duKSB7CiAJCS8qIGJpdCBzZXQgb24ga2V5ZG93biAqLwogCQlpZiAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pIHsKLQkJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwmaXItPmlyLGRhdGEsZGF0YSk7CisJCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsICZpci0+aXIsIGRhdGEsIGRhdGEpOwogCQl9IGVsc2UgewotCQkJaXJfaW5wdXRfbm9rZXkoJmlyLT5pbnB1dCwmaXItPmlyKTsKKwkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsICZpci0+aXIpOwogCQl9CiAKIAl9IGVsc2UgaWYgKGlyLT5tYXNrX2tleXVwKSB7CiAJCS8qIGJpdCBjbGVhcmVkIG9uIGtleWRvd24gKi8KIAkJaWYgKDAgPT0gKGdwaW8gJiBpci0+bWFza19rZXl1cCkpIHsKLQkJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwmaXItPmlyLGRhdGEsZGF0YSk7CisJCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsICZpci0+aXIsIGRhdGEsIGRhdGEpOwogCQl9IGVsc2UgewotCQkJaXJfaW5wdXRfbm9rZXkoJmlyLT5pbnB1dCwmaXItPmlyKTsKKwkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsICZpci0+aXIpOwogCQl9CiAKIAl9IGVsc2UgewogCQkvKiBjYW4ndCBkaXN0aW5ndWlzaCBrZXlkb3duL3VwIDotLyAqLwotCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsJmlyLT5pcixkYXRhLGRhdGEpOwotCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCZpci0+aXIpOworCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsICZpci0+aXIsIGRhdGEsIGRhdGEpOworCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCAmaXItPmlyKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGlyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgY3g4OF9JUiAqaXIgPSAoc3RydWN0IGN4ODhfSVIqKWRhdGE7CisJc3RydWN0IGN4ODhfSVIgKmlyID0gKHN0cnVjdCBjeDg4X0lSICopZGF0YTsKIAogCXNjaGVkdWxlX3dvcmsoJmlyLT53b3JrKTsKIH0KQEAgLTIyNyw0NyArMzE0LDYxIEBACiAJSVJfS0VZVEFCX1RZUEUgKmlyX2NvZGVzID0gTlVMTDsKIAlpbnQgaXJfdHlwZSA9IElSX1RZUEVfT1RIRVI7CiAKLQlpciA9IGttYWxsb2Moc2l6ZW9mKCppciksR0ZQX0tFUk5FTCk7CisJaXIgPSBrbWFsbG9jKHNpemVvZigqaXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBpcikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGlyLDAsc2l6ZW9mKCppcikpOworCW1lbXNldChpciwgMCwgc2l6ZW9mKCppcikpOwogCiAJLyogZGV0ZWN0ICYgY29uZmlndXJlICovCiAJc3dpdGNoIChjb3JlLT5ib2FyZCkgewogCWNhc2UgQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1Q6CiAJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJfVDoKLQkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX2RudHZfbGl2ZV9kdmJfdDsKLQkJaXItPmdwaW9fYWRkciAgICA9IE1PX0dQMV9JTzsKKwkJaXJfY29kZXMgPSBpcl9jb2Rlc19kbnR2X2xpdmVfZHZiX3Q7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDFfSU87CiAJCWlyLT5tYXNrX2tleWNvZGUgPSAweDFmOwotCQlpci0+bWFza19rZXl1cCAgID0gMHg2MDsKLQkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvLyBtcworCQlpci0+bWFza19rZXl1cCA9IDB4NjA7CisJCWlyLT5wb2xsaW5nID0gNTA7IC8qIG1zICovCiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3OwotCQlpcl90eXBlICAgICAgICAgID0gSVJfVFlQRV9SQzU7Ci0JCWlyLT5zYW1wbGluZyAgICAgPSAxOworCQlpcl9jb2RlcyA9IGlyX2NvZGVzX2hhdXBwYXVnZV9uZXc7CisJCWlyX3R5cGUgPSBJUl9UWVBFX1JDNTsKKwkJaXItPnNhbXBsaW5nID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1QyMDAwWFBfRVhQRVJUOgotCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfd2luZmFzdDsKLQkJaXItPmdwaW9fYWRkciAgICA9IE1PX0dQMF9JTzsKKwkJaXJfY29kZXMgPSBpcl9jb2Rlc193aW5mYXN0OworCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7Ci0JCWlyLT5tYXNrX2tleXVwICAgPSAweDEwMDsKLQkJaXItPnBvbGxpbmcgICAgICA9IDE7IC8vIG1zCisJCWlyLT5tYXNrX2tleXVwID0gMHgxMDA7CisJCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0lPREFUQV9HVkJDVFY3RToKLQkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX2lvZGF0YV9iY3R2N2U7Ci0JCWlyLT5ncGlvX2FkZHIgICAgPSBNT19HUDBfSU87CisJCWlyX2NvZGVzID0gaXJfY29kZXNfaW9kYXRhX2JjdHY3ZTsKKwkJaXItPmdwaW9fYWRkciA9IE1PX0dQMF9JTzsKIAkJaXItPm1hc2tfa2V5Y29kZSA9IDB4ZmQ7CiAJCWlyLT5tYXNrX2tleWRvd24gPSAweDAyOwotCQlpci0+cG9sbGluZyAgICAgID0gNTsgLy8gbXMKKwkJaXItPnBvbGxpbmcgPSA1OyAvKiBtcyAqLwogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfUElYRUxWSUVXX1BMQVlUVl9VTFRSQV9QUk86Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19waXhlbHZpZXc7Ci0JCWlyLT5ncGlvX2FkZHIgICAgPSBNT19HUDFfSU87CisJCWlyX2NvZGVzID0gaXJfY29kZXNfcGl4ZWx2aWV3OworCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AxX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHgxZjsKLQkJaXItPm1hc2tfa2V5dXAgICA9IDB4ODA7Ci0JCWlyLT5wb2xsaW5nICAgICAgPSAxOyAvLyBtcworCQlpci0+bWFza19rZXl1cCA9IDB4ODA7CisJCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0FEU1RFQ0hfRFZCX1RfUENJOgorCQlpcl9jb2RlcyA9IGlyX2NvZGVzX2Fkc3RlY2hfZHZiX3RfcGNpOworCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AxX0lPOworCQlpci0+bWFza19rZXljb2RlID0gMHhiZjsKKwkJaXItPm1hc2tfa2V5dXAgPSAweDQwOworCQlpci0+cG9sbGluZyA9IDUwOyAvKiBtcyAqLworCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfTVNJX1RWQU5ZV0hFUkVfTUFTVEVSOgorCQlpcl9jb2RlcyA9IGlyX2NvZGVzX21zaV90dmFueXdoZXJlOworCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AxX0lPOworCQlpci0+bWFza19rZXljb2RlID0gMHgxZjsKKwkJaXItPm1hc2tfa2V5dXAgPSAweDQwOworCQlpci0+cG9sbGluZyA9IDE7IC8qIG1zICovCiAJCWJyZWFrOwogCX0KIApAQCAtMjc5LDggKzM4MCw3IEBACiAJLyogaW5pdCBpbnB1dCBkZXZpY2UgKi8KIAlzbnByaW50Zihpci0+bmFtZSwgc2l6ZW9mKGlyLT5uYW1lKSwgImN4ODggSVIgKCVzKSIsCiAJCSBjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubmFtZSk7Ci0Jc25wcmludGYoaXItPnBoeXMsIHNpemVvZihpci0+cGh5cyksICJwY2ktJXMvaXIwIiwKLQkJIHBjaV9uYW1lKHBjaSkpOworCXNucHJpbnRmKGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpLCAicGNpLSVzL2lyMCIsIHBjaV9uYW1lKHBjaSkpOwogCiAJaXJfaW5wdXRfaW5pdCgmaXItPmlucHV0LCAmaXItPmlyLCBpcl90eXBlLCBpcl9jb2Rlcyk7CiAJaXItPmlucHV0Lm5hbWUgPSBpci0+bmFtZTsKQEAgLTI4OCwxMCArMzg4LDEwIEBACiAJaXItPmlucHV0LmlkLmJ1c3R5cGUgPSBCVVNfUENJOwogCWlyLT5pbnB1dC5pZC52ZXJzaW9uID0gMTsKIAlpZiAocGNpLT5zdWJzeXN0ZW1fdmVuZG9yKSB7Ci0JCWlyLT5pbnB1dC5pZC52ZW5kb3IgID0gcGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpci0+aW5wdXQuaWQudmVuZG9yID0gcGNpLT5zdWJzeXN0ZW1fdmVuZG9yOwogCQlpci0+aW5wdXQuaWQucHJvZHVjdCA9IHBjaS0+c3Vic3lzdGVtX2RldmljZTsKIAl9IGVsc2UgewotCQlpci0+aW5wdXQuaWQudmVuZG9yICA9IHBjaS0+dmVuZG9yOworCQlpci0+aW5wdXQuaWQudmVuZG9yID0gcGNpLT52ZW5kb3I7CiAJCWlyLT5pbnB1dC5pZC5wcm9kdWN0ID0gcGNpLT5kZXZpY2U7CiAJfQogCkBAIC0zMDMsMTMgKzQwMywxMyBAQAogCQlJTklUX1dPUksoJmlyLT53b3JrLCBjeDg4X2lyX3dvcmssIGlyKTsKIAkJaW5pdF90aW1lcigmaXItPnRpbWVyKTsKIAkJaXItPnRpbWVyLmZ1bmN0aW9uID0gaXJfdGltZXI7Ci0JCWlyLT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWlyOworCQlpci0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWlyOwogCQlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7CiAJfQogCWlmIChpci0+c2FtcGxpbmcpIHsKLQkJY29yZS0+cGNpX2lycW1hc2sgfD0gKDE8PDE4KTsgICAvLyBJUl9TTVBfSU5UCi0JCWN4X3dyaXRlKE1PX0REU19JTywgMHhhODBhODApOyAgLy8gNCBrSHogc2FtcGxlIHJhdGUKLQkJY3hfd3JpdGUoTU9fRERTQ0ZHX0lPLCAgIDB4NSk7ICAvLyBlbmFibGUKKwkJY29yZS0+cGNpX2lycW1hc2sgfD0gKDEgPDwgMTgpOwkvKiBJUl9TTVBfSU5UICovCisJCWN4X3dyaXRlKE1PX0REU19JTywgMHhhODBhODApOwkvKiA0IGtIeiBzYW1wbGUgcmF0ZSAqLworCQljeF93cml0ZShNT19ERFNDRkdfSU8sIDB4NSk7CS8qIGVuYWJsZSAqLwogCX0KIAogCS8qIGFsbCBkb25lICovCkBAIC0zNDUsNyArNDQ1LDcgQEAKIHZvaWQgY3g4OF9pcl9pcnEoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKIHsKIAlzdHJ1Y3QgY3g4OF9JUiAqaXIgPSBjb3JlLT5pcjsKLQl1MzIgc2FtcGxlcyxyYzU7CisJdTMyIHNhbXBsZXMsIHJjNTsKIAlpbnQgaTsKIAogCWlmIChOVUxMID09IGlyKQpAQCAtMzU0LDcgKzQ1NCw3IEBACiAJCXJldHVybjsKIAogCXNhbXBsZXMgPSBjeF9yZWFkKE1PX1NBTVBMRV9JTyk7Ci0JaWYgKDAgIT0gc2FtcGxlcyAgJiYgIDB4ZmZmZmZmZmYgIT0gc2FtcGxlcykgeworCWlmICgwICE9IHNhbXBsZXMgJiYgMHhmZmZmZmZmZiAhPSBzYW1wbGVzKSB7CiAJCS8qIHJlY29yZCBzYW1wbGUgZGF0YSAqLwogCQlpZiAoaXItPnNjb3VudCA8IEFSUkFZX1NJWkUoaXItPnNhbXBsZXMpKQogCQkJaXItPnNhbXBsZXNbaXItPnNjb3VudCsrXSA9IHNhbXBsZXM7CkBAIC0zNjIsOCArNDYyLDggQEAKIAl9CiAJaWYgKCFpci0+c2NvdW50KSB7CiAJCS8qIG5vdGhpbmcgdG8gc2FtcGxlICovCi0JCWlmIChpci0+aXIua2V5cHJlc3NlZCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsaXItPnJlbGVhc2UpKQotCQkJaXJfaW5wdXRfbm9rZXkoJmlyLT5pbnB1dCwmaXItPmlyKTsKKwkJaWYgKGlyLT5pci5rZXlwcmVzc2VkICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgaXItPnJlbGVhc2UpKQorCQkJaXJfaW5wdXRfbm9rZXkoJmlyLT5pbnB1dCwgJmlyLT5pcik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM3MywxNCArNDczLDE0IEBACiAJZm9yIChpID0gMDsgaSA8IGlyLT5zY291bnQ7IGkrKykKIAkJaXItPnNhbXBsZXNbaV0gPSB+aXItPnNhbXBsZXNbaV07CiAJaWYgKGlyX2RlYnVnKQotCQlpcl9kdW1wX3NhbXBsZXMoaXItPnNhbXBsZXMsaXItPnNjb3VudCk7CisJCWlyX2R1bXBfc2FtcGxlcyhpci0+c2FtcGxlcywgaXItPnNjb3VudCk7CiAKIAkvKiBkZWNvZGUgaXQgKi8KIAlzd2l0Y2ggKGNvcmUtPmJvYXJkKSB7CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRToKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMToKLQkJcmM1ID0gaXJfZGVjb2RlX2JpcGhhc2UoaXItPnNhbXBsZXMsaXItPnNjb3VudCw1LDcpOwotCQlpcl9kcHJpbnRrKCJiaXBoYXNlIGRlY29kZWQ6ICV4XG4iLHJjNSk7CisJCXJjNSA9IGlyX2RlY29kZV9iaXBoYXNlKGlyLT5zYW1wbGVzLCBpci0+c2NvdW50LCA1LCA3KTsKKwkJaXJfZHByaW50aygiYmlwaGFzZSBkZWNvZGVkOiAleFxuIiwgcmM1KTsKIAkJaWYgKChyYzUgJiAweGZmZmZmMDAwKSAhPSAweDMwMDApCiAJCQlicmVhazsKIAkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCAmaXItPmlyLCByYzUgJiAweDNmLCByYzUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCmluZGV4IDlhZGUyYWUuLmZlMjc2N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjeDg4LW1wZWcuYyx2IDEuMjYgMjAwNS8wNi8wMyAxMzozMTo1MSBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IGN4ODgtbXBlZy5jLHYgMS4zMSAyMDA1LzA3LzA3IDE0OjE3OjQ3IG1jaGVoYWIgRXhwICQKICAqCiAgKiAgU3VwcG9ydCBmb3IgdGhlIG1wZWcgdHJhbnNwb3J0IHN0cmVhbSB0cmFuc2ZlcnMKICAqICBQQ0kgZnVuY3Rpb24gIzIgb2YgdGhlIGN4MjM4OHguCkBAIC02NCwxNyArNjQsMjEgQEAKIAkvKiB3cml0ZSBUUyBsZW5ndGggdG8gY2hpcCAqLwogCWN4X3dyaXRlKE1PX1RTX0xOR1RILCBidWYtPnZiLndpZHRoKTsKIAotI2lmIDEKIAkvKiBGSVhNRTogdGhpcyBuZWVkcyBhIHJldmlldy4KIAkgKiBhbHNvOiBtb3ZlIHRvIGN4ODgtYmxhY2tiaXJkICsgY3g4OC1kdmIgc291cmNlIGZpbGVzPyAqLwogCiAJaWYgKGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5kdmIpIHsKIAkJLyogbmVnZWRnZSBkcml2ZW4gJiBzb2Z0d2FyZSByZXNldCAqLwotCQljeF93cml0ZShUU19HRU5fQ05UUkwsIDB4NDApOworCQljeF93cml0ZShUU19HRU5fQ05UUkwsIDB4MDA0MCB8IGRldi0+dHNfZ2VuX2NudHJsKTsKIAkJdWRlbGF5KDEwMCk7CiAJCWN4X3dyaXRlKE1PX1BJTk1VWF9JTywgMHgwMCk7Ci0JCWN4X3dyaXRlKFRTX0hXX1NPUF9DTlRSTCw0Nzw8MTZ8MTg4PDw0fDB4MDApOwotCQljeF93cml0ZShUU19TT1BfU1RBVCwweDAwKTsKKwkJY3hfd3JpdGUoVFNfSFdfU09QX0NOVFJMLDB4NDc8PDE2fDE4ODw8NHwweDAxKTsKKwkJaWYgKChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1EpIHx8CisJCSAgICAoY29yZS0+Ym9hcmQgPT0gQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9UKSkgeworCQkJY3hfd3JpdGUoVFNfU09QX1NUQVQsIDE8PDEzKTsKKwkJfSBlbHNlIHsKKwkJCWN4X3dyaXRlKFRTX1NPUF9TVEFULCAweDAwKTsKKwkJfQogCQljeF93cml0ZShUU19HRU5fQ05UUkwsIGRldi0+dHNfZ2VuX2NudHJsKTsKIAkJdWRlbGF5KDEwMCk7CiAJfQpAQCAtOTMsNyArOTcsNiBAQAogCQljeF93cml0ZShUU19HRU5fQ05UUkwsIDB4MDYpOyAvKiBwdW5jdHVyZWQgY2xvY2sgVFMgJiBwb3NlZGdlIGRyaXZlbiAqLwogCQl1ZGVsYXkoMTAwKTsKIAl9Ci0jZW5kaWYKIAogCS8qIHJlc2V0IGNvdW50ZXIgKi8KIAljeF93cml0ZShNT19UU19HUENOVFJMLCBHUF9DT1VOVF9DT05UUk9MX1JFU0VUKTsKQEAgLTI2NSw2ICsyNjgsMTUgQEAKIAlkb19jYW5jZWxfYnVmZmVycyhkZXYsInRpbWVvdXQiLDEpOwogfQogCitzdGF0aWMgY2hhciAqY3g4OF9tcGVnX2lycXNbMzJdID0geworCSJ0c19yaXNjaTEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCSJ0c19yaXNjaTIiLCBOVUxMLCBOVUxMLCBOVUxMLAorCSJ0c19vZmxvdyIsICBOVUxMLCBOVUxMLCBOVUxMLAorCSJ0c19zeW5jIiwgICBOVUxMLCBOVUxMLCBOVUxMLAorCSJvcGNfZXJyIiwgInBhcl9lcnIiLCAicmlwX2VyciIsICJwY2lfYWJvcnQiLAorCSJ0c19lcnI/IiwKK307CisKIHN0YXRpYyB2b2lkIGN4ODgwMl9tcGVnX2lycShzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CkBAIC0yNzcsMTAgKzI4OSw3IEBACiAJCXJldHVybjsKIAogCWN4X3dyaXRlKE1PX1RTX0lOVFNUQVQsIHN0YXR1cyk7Ci0jaWYgMAotCWN4ODhfcHJpbnRfaXJxYml0cyhjb3JlLT5uYW1lLCAiaXJxIG1wZWcgIiwKLQkJCWN4ODhfbXBlZ19pcnFzLCBzdGF0dXMsIG1hc2spOwotI2VuZGlmCisKIAlpZiAoZGVidWcgfHwgKHN0YXR1cyAmIG1hc2sgJiB+MHhmZikpCiAJCWN4ODhfcHJpbnRfaXJxYml0cyhjb3JlLT5uYW1lLCAiaXJxIG1wZWcgIiwKIAkJCQkgICBjeDg4X21wZWdfaXJxcywgc3RhdHVzLCBtYXNrKTsKQEAgLTQzNiwxMCArNDQ1LDggQEAKIAl9CiAJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOwogCi0jaWYgMQogCS8qIEZJWE1FIC0tIHNodXRkb3duIGRldmljZSAqLwogCWN4ODhfc2h1dGRvd24oZGV2LT5jb3JlKTsKLSNlbmRpZgogCiAJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CiAJaWYgKDAgIT0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSkpIHsKQEAgLTQ2MSwxMCArNDY4LDggQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAKLSNpZiAxCiAJLyogRklYTUU6IHJlLWluaXRpYWxpemUgaGFyZHdhcmUgKi8KIAljeDg4X3Jlc2V0KGRldi0+Y29yZSk7Ci0jZW5kaWYKIAogCS8qIHJlc3RhcnQgdmlkZW8rdmJpIGNhcHR1cmUgKi8KIAlzcGluX2xvY2soJmRldi0+c2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1yZWcuaAppbmRleCA2M2FkMzNmLi4zN2Y4MjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1yZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1yZWcuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgJElkOiBjeDg4LXJlZy5oLHYgMS43IDIwMDUvMDYvMDMgMTM6MzE6NTEgbWNoZWhhYiBFeHAgJAorICAgICRJZDogY3g4OC1yZWcuaCx2IDEuOCAyMDA1LzA3LzA3IDEzOjU4OjM4IG1jaGVoYWIgRXhwICQKIAogICAgIGN4ODh4LWh3LmggLSBDWDIzODh4IHJlZ2lzdGVyIG9mZnNldHMKIApAQCAtNjA0LDIwICs2MDQsMTEgQEAKICNkZWZpbmUgRU5fSTJTSU5fU1RSMkRBQyAgICAgICAgMHgwMDAwNDAwMAogI2RlZmluZSBFTl9JMlNJTl9FTkFCTEUgICAgICAgICAweDAwMDA4MDAwCiAKLSNpZiAwCi0vKiBvbGQgKi8KLSNkZWZpbmUgRU5fRE1UUlhfU1VNRElGRiAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBFTl9ETVRSWF9TVU1SICAgICAgICAgICAweDAwMDAwODgwCi0jZGVmaW5lIEVOX0RNVFJYX0xSICAgICAgICAgICAgIDB4MDAwMDA5MDAKLSNkZWZpbmUgRU5fRE1UUlhfTU9OTyAgICAgICAgICAgMHgwMDAwMDk4MAotI2Vsc2UKLS8qIGRzY2FsZXIgY3ZzICovCiAjZGVmaW5lIEVOX0RNVFJYX1NVTURJRkYgICAgICAgICgwIDw8IDcpCiAjZGVmaW5lIEVOX0RNVFJYX1NVTVIgICAgICAgICAgICgxIDw8IDcpCiAjZGVmaW5lIEVOX0RNVFJYX0xSICAgICAgICAgICAgICgyIDw8IDcpCiAjZGVmaW5lIEVOX0RNVFJYX01PTk8gICAgICAgICAgICgzIDw8IDcpCiAjZGVmaW5lIEVOX0RNVFJYX0JZUEFTUyAgICAgICAgICgxIDw8IDExKQotI2VuZGlmCiAKIC8vIFZpZGVvCiAjZGVmaW5lIFZJRF9DQVBUVVJFX0NPTlRST0wJCTB4MzEwMTgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKaW5kZXggNDZkNzhiMS4uOTEyMDdmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgJElkOiBjeDg4LXR2YXVkaW8uYyx2IDEuMzYgMjAwNS8wNi8wNSAwNTo1Mzo0NSBtY2hlaGFiIEV4cCAkCisgICAgJElkOiBjeDg4LXR2YXVkaW8uYyx2IDEuMzcgMjAwNS8wNy8wNyAxMzo1ODozOCBtY2hlaGFiIEV4cCAkCiAKICAgICBjeDg4eC1hdWRpby5jIC0gQ29uZXhhbnQgQ1gyMzg4MC8yMzg4MSBhdWRpbyBkb3duc3RyZWFtIGRyaXZlciBkcml2ZXIKIApAQCAtMjc4LDgwICsyNzgsNiBAQAogCXNldF9hdWRpb19maW5pc2goY29yZSk7CiB9CiAKLSNpZiAwCi1zdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU0oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IG5pY2FtX2NvbW1vbltdID0gewotCQkvKiBmcm9tIGRzY2FsZXIgKi8KLSAgICAJCXsgQVVEX1JBVEVfQURKMSwgICAgICAgICAgIDB4MDAwMDAwMTAgfSwKLSAgICAJCXsgQVVEX1JBVEVfQURKMiwgICAgICAgICAgIDB4MDAwMDAwNDAgfSwKLSAgICAJCXsgQVVEX1JBVEVfQURKMywgICAgICAgICAgIDB4MDAwMDAxMDAgfSwKLSAgICAJCXsgQVVEX1JBVEVfQURKNCwgICAgICAgICAgIDB4MDAwMDA0MDAgfSwKLSAgICAJCXsgQVVEX1JBVEVfQURKNSwgICAgICAgICAgIDB4MDAwMDEwMDAgfSwKLSAgICAvLwkJeyBBVURfRE1EX1JBX0REUywgICAgICAgICAgMHgwMGMwZDVjZSB9LAotCi0JCS8vIERlZW1waGFzaXMgMToKLQkJeyBBVURfREVFTVBIR0FJTl9SLCAgICAgICAgMHgwMDAwMjNjMiB9LAotCQl7IEFVRF9ERUVNUEhOVU1FUjFfUiwgICAgICAweDAwMDJhN2JjIH0sCi0JCXsgQVVEX0RFRU1QSE5VTUVSMl9SLCAgICAgIDB4MDAwMzAyM2UgfSwKLQkJeyBBVURfREVFTVBIREVOT00xX1IsICAgICAgMHgwMDAwZjNkMCB9LAotCQl7IEFVRF9ERUVNUEhERU5PTTJfUiwgICAgICAweDAwMDAwMDAwIH0sCi0KLSNpZiAwCi0JCS8vIERlZW1waGFzaXMgMjogKG90aGVyIHR2IG5vcm0/KQotCQl7IEFVRF9ERUVNUEhHQUlOX1IsICAgICAgICAweDAwMDBjNjAwIH0sCi0JCXsgQVVEX0RFRU1QSE5VTUVSMV9SLCAgICAgIDB4MDAwNjY3MzggfSwKLQkJeyBBVURfREVFTVBITlVNRVIyX1IsICAgICAgMHgwMDA2NjczOSB9LAotCQl7IEFVRF9ERUVNUEhERU5PTTFfUiwgICAgICAweDAwMDFlODhjIH0sCi0JCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMWU4OGMgfSwKLSNlbmRpZgotCi0JCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMDAwMDAgfSwKLQkJeyBBVURfRVJSTE9HUEVSSU9EX1IsICAgICAgMHgwMDAwMGZmZiB9LAotCQl7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsICAweDAwMDAwM2ZmIH0sCi0JCXsgQVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgIDB4MDAwMDAwZmYgfSwKLQkJeyBBVURfRVJSSU5UUlBUVEhTSExEM19SLCAgMHgwMDAwMDAzZiB9LAotCQl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAweDAwMDAwMDAzIH0sCi0KLQkJLy8gc2V0dXAgUUFNIHJlZ2lzdGVycwotCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTIsICAweDA2IH0sCi0JCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgIDB4ODIgfSwKLQkJeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAgMHgxNiB9LAotCQl7IEFVRF9RQU1fTU9ERSwgICAgICAgICAgICAweDA1IH0sCi0KLSAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCi0gICAgICAgIH07Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9wYWxfaVtdID0gewotCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAweDEyIH0sCi0JCXsgQVVEX1BIQUNDX0ZSRVFfOE1TQiwgICAgIDB4M2EgfSwKLQkJeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAgMHg5MyB9LAotCi0gICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAotCX07Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9kZWZhdWx0W10gPSB7Ci0JCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgIDB4MTYgfSwKLQkJeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAgMHgzNCB9LAotCQl7IEFVRF9QSEFDQ19GUkVRXzhMU0IsICAgICAweDRjIH0sCi0KLSAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCi0JfTsKLQotICAgICAgICBzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDEwLAotCQkJRU5fRE1UUlhfTFIgfCBFTl9ETVRSWF9CWVBBU1MgfCBFTl9OSUNBTV9BVVRPX1NURVJFTyk7Ci0gICAgICAgIHNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fY29tbW9uKTsKLQlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKLQljYXNlIFdXX05JQ0FNX0k6Ci0JCWRwcmludGsoIiVzIFBBTC1JIE5JQ0FNIChzdGF0dXM6IHVua25vd24pXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fcGFsX2kpOwotCQlicmVhazsKLQljYXNlIFdXX05JQ0FNX0JHREtMOgotCQlkcHJpbnRrKCIlcyBQQUwtQkdESyBOSUNBTSAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOwotCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIG5pY2FtX2RlZmF1bHQpOwotCQlicmVhazsKLQl9OwotICAgICAgICBzZXRfYXVkaW9fZmluaXNoKGNvcmUpOwotfQotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9OSUNBTV9MKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIGludCBzdGVyZW8pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCBlNGNhNzM1Li5jNDRhMDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjeDg4LXZpZGVvLmMsdiAxLjYzIDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAorICogJElkOiBjeDg4LXZpZGVvLmMsdiAxLjc5IDIwMDUvMDcvMDcgMTQ6MTc6NDcgbWNoZWhhYiBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIENvbmV4YW50IDIzODh4IGJhc2VkIFRWIGNhcmRzCiAgKiB2aWRlbzRsaW51eCB2aWRlbyBpbnRlcmZhY2UKQEAgLTg2LDEzICs4Niw2IEBACiAJCS5pZCAgICAgICAgPSBWNEwyX1NURF9OVFNDX01fSlAsCiAJCS5jeGlmb3JtYXQgPSBWaWRlb0Zvcm1hdE5UU0NKYXBhbiwKIAkJLmN4b2Zvcm1hdCA9IDB4MTgxZjAwMDgsCi0jaWYgMAotCX0sewotCQkubmFtZSAgICAgID0gIk5UU0MtNC40MyIsCi0JCS5pZCAgICAgICAgPSBGSVhNRSwKLQkJLmN4aWZvcm1hdCA9IFZpZGVvRm9ybWF0TlRTQzQ0MywKLQkJLmN4b2Zvcm1hdCA9IDB4MTgxZjAwMDgsCi0jZW5kaWYKIAl9LHsKIAkJLm5hbWUgICAgICA9ICJQQUwtQkciLAogCQkuaWQgICAgICAgID0gVjRMMl9TVERfUEFMX0JHLApAQCAtMjQ4LDYgKzI0MSw3IEBACiAJCQkuZGVmYXVsdF92YWx1ZSA9IDAsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCX0sCisJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAwLAogCQkucmVnICAgICAgICAgICAgICAgICAgID0gTU9fQ09OVFJfQlJJR0hULAogCQkubWFzayAgICAgICAgICAgICAgICAgID0gMHhmZjAwLAogCQkuc2hpZnQgICAgICAgICAgICAgICAgID0gOCwKQEAgLTI2MSw3ICsyNTUsNyBAQAogCQkJLmRlZmF1bHRfdmFsdWUgPSAwLAogCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQl9LAotCQkub2ZmICAgICAgICAgICAgICAgICAgID0gMCwKKwkJLm9mZiAgICAgICAgICAgICAgICAgICA9IDEyOCwKIAkJLnJlZyAgICAgICAgICAgICAgICAgICA9IE1PX0hVRSwKIAkJLm1hc2sgICAgICAgICAgICAgICAgICA9IDB4MDBmZiwKIAkJLnNoaWZ0ICAgICAgICAgICAgICAgICA9IDAsCkBAIC02NzQsMjMxICs2NjgsNiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIDAgLyogb3ZlcmxheSBzdXBwb3J0IG5vdCBmaW5pc2hlZCB5ZXQgKi8KLXN0YXRpYyB1MzIqIG92X3Jpc2NfZmllbGQoc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IGN4ODgwMF9maCAqZmgsCi0JCQkgIHUzMiAqcnAsIHN0cnVjdCBidGN4X3NraXBsaXN0ICpza2lwcywKLQkJCSAgdTMyIHN5bmNfbGluZSwgaW50IHNraXBfZXZlbiwgaW50IHNraXBfb2RkKQotewotCWludCBsaW5lLG1heHksc3RhcnQsZW5kLHNraXAsbnNraXBzOwotCXUzMiByaSxyYTsKLQl1MzIgYWRkcjsKLQotCS8qIHN5bmMgaW5zdHJ1Y3Rpb24gKi8KLQkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19SRVNZTkMgfCBzeW5jX2xpbmUpOwotCi0JYWRkciAgPSAodW5zaWduZWQgbG9uZylkZXYtPmZidWYuYmFzZTsKLQlhZGRyICs9IGRldi0+ZmJ1Zi5mbXQuYnl0ZXNwZXJsaW5lICogZmgtPndpbi53LnRvcDsKLQlhZGRyICs9IChmaC0+Zm10LT5kZXB0aCA+PiAzKSAgICAgICogZmgtPndpbi53LmxlZnQ7Ci0KLQkvKiBzY2FuIGxpbmVzICovCi0JZm9yIChtYXh5ID0gLTEsIGxpbmUgPSAwOyBsaW5lIDwgZmgtPndpbi53LmhlaWdodDsKLQkgICAgIGxpbmUrKywgYWRkciArPSBkZXYtPmZidWYuZm10LmJ5dGVzcGVybGluZSkgewotCQlpZiAoKGxpbmUlMikgPT0gMCAgJiYgIHNraXBfZXZlbikKLQkJCWNvbnRpbnVlOwotCQlpZiAoKGxpbmUlMikgPT0gMSAgJiYgIHNraXBfb2RkKQotCQkJY29udGludWU7Ci0KLQkJLyogY2FsY3VsYXRlIGNsaXBwaW5nICovCi0JCWlmIChsaW5lID4gbWF4eSkKLQkJCWJ0Y3hfY2FsY19za2lwcyhsaW5lLCBmaC0+d2luLncud2lkdGgsICZtYXh5LAotCQkJCQlza2lwcywgJm5za2lwcywgZmgtPmNsaXBzLCBmaC0+bmNsaXBzKTsKLQotCQkvKiB3cml0ZSBvdXQgcmlzYyBjb2RlICovCi0JCWZvciAoc3RhcnQgPSAwLCBza2lwID0gMDsgc3RhcnQgPCBmaC0+d2luLncud2lkdGg7IHN0YXJ0ID0gZW5kKSB7Ci0JCQlpZiAoc2tpcCA+PSBuc2tpcHMpIHsKLQkJCQlyaSAgPSBSSVNDX1dSSVRFOwotCQkJCWVuZCA9IGZoLT53aW4udy53aWR0aDsKLQkJCX0gZWxzZSBpZiAoc3RhcnQgPCBza2lwc1tza2lwXS5zdGFydCkgewotCQkJCXJpICA9IFJJU0NfV1JJVEU7Ci0JCQkJZW5kID0gc2tpcHNbc2tpcF0uc3RhcnQ7Ci0JCQl9IGVsc2UgewotCQkJCXJpICA9IFJJU0NfU0tJUDsKLQkJCQllbmQgPSBza2lwc1tza2lwXS5lbmQ7Ci0JCQkJc2tpcCsrOwotCQkJfQotCQkJaWYgKFJJU0NfV1JJVEUgPT0gcmkpCi0JCQkJcmEgPSBhZGRyICsgKGZoLT5mbXQtPmRlcHRoPj4zKSpzdGFydDsKLQkJCWVsc2UKLQkJCQlyYSA9IDA7Ci0KLQkJCWlmICgwID09IHN0YXJ0KQotCQkJCXJpIHw9IFJJU0NfU09MOwotCQkJaWYgKGZoLT53aW4udy53aWR0aCA9PSBlbmQpCi0JCQkJcmkgfD0gUklTQ19FT0w7Ci0JCQlyaSB8PSAoZmgtPmZtdC0+ZGVwdGg+PjMpICogKGVuZC1zdGFydCk7Ci0KLQkJCSoocnArKyk9Y3B1X3RvX2xlMzIocmkpOwotCQkJaWYgKDAgIT0gcmEpCi0JCQkJKihycCsrKT1jcHVfdG9fbGUzMihyYSk7Ci0JCX0KLQl9Ci0Ja2ZyZWUoc2tpcHMpOwotCXJldHVybiBycDsKLX0KLQotc3RhdGljIGludCBvdl9yaXNjX2ZyYW1lKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCBjeDg4MDBfZmggKmZoLAotCQkJIHN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBidGN4X3NraXBsaXN0ICpza2lwczsKLQl1MzIgaW5zdHJ1Y3Rpb25zLGZpZWxkczsKLQl1MzIgKnJwOwotCWludCByYzsKLQotCS8qIHNraXAgbGlzdCBmb3Igd2luZG93IGNsaXBwaW5nICovCi0JaWYgKE5VTEwgPT0gKHNraXBzID0ga21hbGxvYyhzaXplb2YoKnNraXBzKSAqIGZoLT5uY2xpcHMsR0ZQX0tFUk5FTCkpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZpZWxkcyA9IDA7Ci0JaWYgKFY0TDJfRklFTERfSEFTX1RPUChmaC0+d2luLmZpZWxkKSkKLQkJZmllbGRzKys7Ci0JaWYgKFY0TDJfRklFTERfSEFTX0JPVFRPTShmaC0+d2luLmZpZWxkKSkKLQkJZmllbGRzKys7Ci0KLSAgICAgICAgLyogZXN0aW1hdGUgcmlzYyBtZW06IHdvcnN0IGNhc2UgaXMgKGNsaXArMSkgKiBsaW5lcyBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgKyBzeW5jcyArIGp1bXAgKGFsbCAyIGR3b3JkcykgKi8KLQlpbnN0cnVjdGlvbnMgID0gKGZoLT5uY2xpcHMrMSkgKiBmaC0+d2luLncuaGVpZ2h0OwotCWluc3RydWN0aW9ucyArPSAzICsgNDsKLQlpZiAoKHJjID0gYnRjeF9yaXNjbWVtX2FsbG9jKGRldi0+cGNpLCZidWYtPnJpc2MsaW5zdHJ1Y3Rpb25zKjgpKSA8IDApIHsKLQkJa2ZyZWUoc2tpcHMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogd3JpdGUgcmlzYyBpbnN0cnVjdGlvbnMgKi8KLQlycCA9IGJ1Zi0+cmlzYy5jcHU7Ci0Jc3dpdGNoIChmaC0+d2luLmZpZWxkKSB7Ci0JY2FzZSBWNEwyX0ZJRUxEX1RPUDoKLQkJcnAgPSBvdl9yaXNjX2ZpZWxkKGRldiwgZmgsIHJwLCBza2lwcywgMCwgICAgIDAsIDApOwotCQlicmVhazsKLQljYXNlIFY0TDJfRklFTERfQk9UVE9NOgotCQlycCA9IG92X3Jpc2NfZmllbGQoZGV2LCBmaCwgcnAsIHNraXBzLCAweDIwMCwgMCwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgotCQlycCA9IG92X3Jpc2NfZmllbGQoZGV2LCBmaCwgcnAsIHNraXBzLCAwLCAgICAgMCwgMSk7Ci0JCXJwID0gb3ZfcmlzY19maWVsZChkZXYsIGZoLCBycCwgc2tpcHMsIDB4MjAwLCAxLCAwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JLyogc2F2ZSBwb2ludGVyIHRvIGptcCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCi0JYnVmLT5yaXNjLmptcCA9IHJwOwotCWtmcmVlKHNraXBzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJpZnlfd2luZG93KHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX3dpbmRvdyAqd2luKQotewotCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKLQlpbnQgbWF4dywgbWF4aDsKLQotCWlmIChOVUxMID09IGRldi0+ZmJ1Zi5iYXNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAod2luLT53LndpZHRoIDwgNDggfHwgd2luLT53LmhlaWdodCA8ICAzMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHdpbi0+Y2xpcGNvdW50ID4gMjA0OCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmaWVsZCA9IHdpbi0+ZmllbGQ7Ci0JbWF4dyAgPSBub3JtX21heHcoY29yZS0+dHZub3JtKTsKLQltYXhoICA9IG5vcm1fbWF4aChjb3JlLT50dm5vcm0pOwotCi0JaWYgKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgZmllbGQgPSAod2luLT53LmhlaWdodCA+IG1heGgvMikKLSAgICAgICAgICAgICAgICAgICAgICAgID8gVjRMMl9GSUVMRF9JTlRFUkxBQ0VECi0gICAgICAgICAgICAgICAgICAgICAgICA6IFY0TDJfRklFTERfVE9QOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoZmllbGQpIHsKLSAgICAgICAgY2FzZSBWNEwyX0ZJRUxEX1RPUDoKLSAgICAgICAgY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKLSAgICAgICAgICAgICAgICBtYXhoID0gbWF4aCAvIDI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLQl3aW4tPmZpZWxkID0gZmllbGQ7Ci0JaWYgKHdpbi0+dy53aWR0aCA+IG1heHcpCi0JCXdpbi0+dy53aWR0aCA9IG1heHc7Ci0JaWYgKHdpbi0+dy5oZWlnaHQgPiBtYXhoKQotCQl3aW4tPncuaGVpZ2h0ID0gbWF4aDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZXR1cF93aW5kb3coc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IGN4ODgwMF9maCAqZmgsCi0JCQlzdHJ1Y3QgdjRsMl93aW5kb3cgKndpbikKLXsKLQlzdHJ1Y3QgdjRsMl9jbGlwICpjbGlwcyA9IE5VTEw7Ci0JaW50IG4sc2l6ZSxyZXR2YWwgPSAwOwotCi0JaWYgKE5VTEwgPT0gZmgtPmZtdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dmFsID0gdmVyaWZ5X3dpbmRvdyhkZXYsd2luKTsKLQlpZiAoMCAhPSByZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0KLQkvKiBjb3B5IGNsaXBzICAtLSAgbHVja2lseSB2NGwxICsgdjRsMiBhcmUgYmluYXJ5Ci0JICAgY29tcGF0aWJsZSBoZXJlIC4uLiovCi0JbiA9IHdpbi0+Y2xpcGNvdW50OwotCXNpemUgPSBzaXplb2YoKmNsaXBzKSoobis0KTsKLQljbGlwcyA9IGttYWxsb2Moc2l6ZSxHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBjbGlwcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKG4gPiAwKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbGlwcyx3aW4tPmNsaXBzLHNpemVvZihzdHJ1Y3QgdjRsMl9jbGlwKSpuKSkgewotCQkJa2ZyZWUoY2xpcHMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0KLQkvKiBjbGlwIGFnYWluc3Qgc2NyZWVuICovCi0JaWYgKE5VTEwgIT0gZGV2LT5mYnVmLmJhc2UpCi0JCW4gPSBidGN4X3NjcmVlbl9jbGlwcyhkZXYtPmZidWYuZm10LndpZHRoLCBkZXYtPmZidWYuZm10LmhlaWdodCwKLQkJCQkgICAgICAmd2luLT53LCBjbGlwcywgbik7Ci0JYnRjeF9zb3J0X2NsaXBzKGNsaXBzLG4pOwotCi0JLyogNC1ieXRlIGFsaWdubWVudHMgKi8KLQlzd2l0Y2ggKGZoLT5mbXQtPmRlcHRoKSB7Ci0JY2FzZSA4OgotCWNhc2UgMjQ6Ci0JCWJ0Y3hfYWxpZ24oJndpbi0+dywgY2xpcHMsIG4sIDMpOwotCQlicmVhazsKLQljYXNlIDE2OgotCQlidGN4X2FsaWduKCZ3aW4tPncsIGNsaXBzLCBuLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJLyogbm8gYWxpZ25tZW50IGZpeHVwcyBuZWVkZWQgKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JZG93bigmZmgtPnZpZHEubG9jayk7Ci0JaWYgKGZoLT5jbGlwcykKLQkJa2ZyZWUoZmgtPmNsaXBzKTsKLQlmaC0+Y2xpcHMgICAgPSBjbGlwczsKLQlmaC0+bmNsaXBzICAgPSBuOwotCWZoLT53aW4gICAgICA9ICp3aW47Ci0jaWYgMAotCWZoLT5vdi5zZXR1cF9vayA9IDE7Ci0jZW5kaWYKLQotCS8qIHVwZGF0ZSBvdmVybGF5IGlmIG5lZWRlZCAqLwotCXJldHZhbCA9IDA7Ci0jaWYgMAotCWlmIChjaGVja19idHJlcyhmaCwgUkVTT1VSQ0VfT1ZFUkxBWSkpIHsKLQkJc3RydWN0IGJ0dHZfYnVmZmVyICpuZXc7Ci0KLQkJbmV3ID0gdmlkZW9idWZfYWxsb2Moc2l6ZW9mKCpuZXcpKTsKLQkJYnR0dl9vdmVybGF5X3Jpc2MoYnR2LCAmZmgtPm92LCBmaC0+b3ZmbXQsIG5ldyk7Ci0JCXJldHZhbCA9IGJ0dHZfc3dpdGNoX292ZXJsYXkoYnR2LGZoLG5ldyk7Ci0JfQotI2VuZGlmCi0JdXAoJmZoLT52aWRxLmxvY2spOwotCXJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTEzMjcsOSArMTA5Niw2IEBACiAJc3RydWN0IGN4ODgwMF9maCAgKmZoICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGN4ODgwMF9kZXYgKmRldiAgPSBmaC0+ZGV2OwogCXN0cnVjdCBjeDg4X2NvcmUgICpjb3JlID0gZGV2LT5jb3JlOwotI2lmIDAKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2VuZGlmCiAJaW50IGVycjsKIAogCWlmICh2aWRlb19kZWJ1ZyA+IDEpCkBAIC0xMzUwLDEyICsxMTE2LDYgQEAKIAkJCVY0TDJfQ0FQX1JFQURXUklURSAgICAgfAogCQkJVjRMMl9DQVBfU1RSRUFNSU5HICAgICB8CiAJCQlWNEwyX0NBUF9WQklfQ0FQVFVSRSAgIHwKLSNpZiAwCi0JCQlWNEwyX1RVTkVSX0NBUF9MT1cgICAgIHwKLSNlbmRpZgotI2lmIDAKLQkJCVY0TDJfQ0FQX1ZJREVPX09WRVJMQVkgfAotI2VuZGlmCiAJCQkwOwogCQlpZiAoVU5TRVQgIT0gY29yZS0+dHVuZXJfdHlwZSkKIAkJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOwpAQCAtMTQ1NiwzNiArMTIxNiw2IEBACiAJfQogCiAKLSNpZiAwCi0JLyogbmVlZHMgcmV2aWV3ICovCi0JY2FzZSBWSURJT0NfR19BVURJTzoKLQl7Ci0JCXN0cnVjdCB2NGwyX2F1ZGlvICphID0gYXJnOwotCQl1bnNpZ25lZCBpbnQgbiA9IGEtPmluZGV4OwotCi0JCW1lbXNldChhLDAsc2l6ZW9mKCphKSk7Ci0JCWEtPmluZGV4ID0gbjsKLQkJc3dpdGNoIChuKSB7Ci0JCWNhc2UgMDoKLQkJCWlmICgoQ1g4OF9WTVVYX1RFTEVWSVNJT04gPT0gSU5QVVQobiktPnR5cGUpCi0JCQkgICAgfHwgKENYODhfVk1VWF9DQUJMRSA9PSBJTlBVVChuKS0+dHlwZSkpIHsKLQkJCQlzdHJjcHkoYS0+bmFtZSwiVGVsZXZpc2lvbiIpOwotCQkJCS8vIEZJWE1FIGZpZ3VyZSBvdXQgaWYgc3RlcmVvIHJlY2VpdmVkIGFuZCBzZXQgVjRMMl9BVURDQVBfU1RFUkVPLgotCQkJCXJldHVybiAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWlmIChDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEID09IGNvcmUtPmJvYXJkKSB7Ci0JCQkJc3RyY3B5KGEtPm5hbWUsIkxpbmUgSW4iKTsKLQkJCQlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJLy8gQXVkaW8gaW5wdXQgbm90IGF2YWlsYWJsZS4KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotI2VuZGlmCiAKIAkvKiAtLS0gY2FwdHVyZSBpb2N0bHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWNhc2UgVklESU9DX0VOVU1fRk1UOgpAQCAtMTU4OCwxMyArMTMxOCwxNiBAQAogCXsKIAkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwogCisJCW1lbXNldChmLDAsc2l6ZW9mKCpmKSk7CisKIAkJaWYgKFVOU0VUID09IGNvcmUtPnR1bmVyX3R5cGUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGYtPnR1bmVyICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwogCQlmLT50eXBlID0gZmgtPnJhZGlvID8gVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQlmLT5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7CisKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NfR19GUkVRVUVOQ1ksZik7CisKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgpAQCAtMTYxMiwxMSArMTM0NSw3IEBACiAJCWRvd24oJmRldi0+bG9jayk7CiAJCWRldi0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKIAkJY3g4OF9uZXdzdGF0aW9uKGNvcmUpOwotI2lmZGVmIFY0TDJfSTJDX0NMSUVOVFMKIAkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NfU19GUkVRVUVOQ1ksZik7Ci0jZWxzZQotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ1NGUkVRLCZkZXYtPmZyZXEpOwotI2VuZGlmCiAJCXVwKCZkZXYtPmxvY2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNzE0LDExICsxNDQzLDcgQEAKIAkJCXNpemVvZihjYXAtPmNhcmQpKTsKIAkJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOwogCQljYXAtPnZlcnNpb24gPSBDWDg4X1ZFUlNJT05fQ09ERTsKLQkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUgotI2lmIDAKLQkJCQkgICAgfCBWNEwyX1RVTkVSX0NBUF9MT1cKLSNlbmRpZgotCQkJCSAgICA7CisJCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19HX1RVTkVSOgpAQCAtMTczMCwxOSArMTQ1NSw4IEBACiAKIAkJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKIAkJc3RyY3B5KHQtPm5hbWUsICJSYWRpbyIpOwotICAgICAgICAgICAgICAgIHQtPnJhbmdlbG93ICA9IChpbnQpKDY1KjE2KTsKLSAgICAgICAgICAgICAgICB0LT5yYW5nZWhpZ2ggPSAoaW50KSgxMDgqMTYpOwogCi0jaWZkZWYgVjRMMl9JMkNfQ0xJRU5UUwogCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ19HX1RVTkVSLHQpOwotI2Vsc2UKLQkJewotCQkJc3RydWN0IHZpZGVvX3R1bmVyIHZ0OwotCQkJbWVtc2V0KCZ2dCwwLHNpemVvZih2dCkpOwotCQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldixWSURJT0NHVFVORVIsJnZ0KTsKLQkJCXQtPnNpZ25hbCA9IHZ0LnNpZ25hbDsKLQkJfQotI2VuZGlmCiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CkBAIC0xNzc1LDggKzE0ODksMjkgQEAKIAkJKmlkID0gMDsKIAkJcmV0dXJuIDA7CiAJfQotCWNhc2UgVklESU9DX1NfQVVESU86CisJY2FzZSBWSURJT0NTVFVORVI6CisJeworCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisKKwkJaWYgKHYtPnR1bmVyKSAvKiBPbmx5IHR1bmVyIDAgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVklESU9DU1RVTkVSLHYpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCX0KIAljYXNlIFZJRElPQ19TX1RVTkVSOgorCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7CisKKwkJaWYgKDAgIT0gdC0+aW5kZXgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ19TX1RVTkVSLHQpOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1NfQVVESU86CiAJY2FzZSBWSURJT0NfU19JTlBVVDoKIAljYXNlIFZJRElPQ19TX1NURDoKIAkJcmV0dXJuIDA7CkBAIC0xODQ3LDYgKzE1ODIsMTQgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLGZsYWdzKTsKIH0KIAorc3RhdGljIGNoYXIgKmN4ODhfdmlkX2lycXNbMzJdID0geworCSJ5X3Jpc2NpMSIsICJ1X3Jpc2NpMSIsICJ2X3Jpc2NpMSIsICJ2YmlfcmlzYzEiLAorCSJ5X3Jpc2NpMiIsICJ1X3Jpc2NpMiIsICJ2X3Jpc2NpMiIsICJ2YmlfcmlzYzIiLAorCSJ5X29mbG93IiwgICJ1X29mbG93IiwgICJ2X29mbG93IiwgICJ2Ymlfb2Zsb3ciLAorCSJ5X3N5bmMiLCAgICJ1X3N5bmMiLCAgICJ2X3N5bmMiLCAgICJ2Ymlfc3luYyIsCisJIm9wY19lcnIiLCAgInBhcl9lcnIiLCAgInJpcF9lcnIiLCAgInBjaV9hYm9ydCIsCit9OworCiBzdGF0aWMgdm9pZCBjeDg4MDBfdmlkX2lycShzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2KQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CkBAIC0yMDE0LDcgKzE3NTcsNiBAQAogewogCXN0cnVjdCBjeDg4MDBfZGV2ICpkZXY7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZTsKLQlzdHJ1Y3QgdHVuZXJfYWRkciB0dW5fYWRkcjsKIAlpbnQgZXJyOwogCiAJZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksR0ZQX0tFUk5FTCk7CkBAIC0yMDg4LDIyICsxODMwLDYgQEAKIAkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7CiAJaWYgKGNvcmUtPnRkYTk4ODdfY29uZikKIAkJcmVxdWVzdF9tb2R1bGUoInRkYTk4ODciKTsKLQlpZiAoY29yZS0+cmFkaW9fdHlwZSAhPSBVTlNFVCkgewotCSAgICAgICAgdHVuX2FkZHIudjRsMl90dW5lciA9IFY0TDJfVFVORVJfUkFESU87Ci0JCXR1bl9hZGRyLnR5cGUgPSBjb3JlLT5yYWRpb190eXBlOwotCQl0dW5fYWRkci5hZGRyID0gY29yZS0+cmFkaW9fYWRkcjsKLQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX2FkZHIpOwotCX0KLQlpZiAoY29yZS0+dHVuZXJfdHlwZSAhPSBVTlNFVCkgewotCSAgICAgICAgdHVuX2FkZHIudjRsMl90dW5lciA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCQl0dW5fYWRkci50eXBlID0gY29yZS0+dHVuZXJfdHlwZTsKLQkJdHVuX2FkZHIuYWRkciA9IGNvcmUtPnR1bmVyX2FkZHI7Ci0JCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9hZGRyKTsKLQl9Ci0KLQlpZiAoY29yZS0+dGRhOTg4N19jb25mKQotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFREQTk4ODdfU0VUX0NPTkZJRywmY29yZS0+dGRhOTg4N19jb25mKTsKLQogCS8qIHJlZ2lzdGVyIHY0bCBkZXZpY2VzICovCiAJZGV2LT52aWRlb19kZXYgPSBjeDg4X3ZkZXZfaW5pdChjb3JlLGRldi0+cGNpLAogCQkJCQkmY3g4ODAwX3ZpZGVvX3RlbXBsYXRlLCJ2aWRlbyIpOwpAQCAtMjIxMywxMCArMTkzOSw4IEBACiAJfQogCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAotI2lmIDEKIAkvKiBGSVhNRSAtLSBzaHV0ZG93biBkZXZpY2UgKi8KIAljeDg4X3NodXRkb3duKGRldi0+Y29yZSk7Ci0jZW5kaWYKIAogCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOwogCWlmICgwICE9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgcGNpX2Nob29zZV9zdGF0ZShwY2lfZGV2LCBzdGF0ZSkpKSB7CkBAIC0yMjM4LDEwICsxOTYyLDggQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAKLSNpZiAxCiAJLyogRklYTUU6IHJlLWluaXRpYWxpemUgaGFyZHdhcmUgKi8KIAljeDg4X3Jlc2V0KGRldi0+Y29yZSk7Ci0jZW5kaWYKIAogCS8qIHJlc3RhcnQgdmlkZW8rdmJpIGNhcHR1cmUgKi8KIAlzcGluX2xvY2soJmRldi0+c2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKaW5kZXggODY3ZTk4OC4uMzA3YmVhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogY3g4OC5oLHYgMS42MiAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKKyAqICRJZDogY3g4OC5oLHYgMS42OCAyMDA1LzA3LzA3IDE0OjE3OjQ3IG1jaGVoYWIgRXhwICQKICAqCiAgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgVFYgY2FyZHMKICAqCkBAIC01MSw4ICs1MSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogZGVmaW5lcyBhbmQgZW51bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotI2RlZmluZSBWNEwyX0kyQ19DTElFTlRTIDEKLQogI2RlZmluZSBGT1JNQVRfRkxBR1NfUEFDS0VEICAgICAgIDB4MDEKICNkZWZpbmUgRk9STUFUX0ZMQUdTX1BMQU5BUiAgICAgICAweDAyCiAKQEAgLTg0LDkgKzgyLDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIG5vcm1fbWF4dyhzdHJ1Y3QgY3g4OF90dm5vcm0gKm5vcm0pCiB7CiAJcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyA3NjggOiA2NDA7Ci0vLwlyZXR1cm4gKG5vcm0tPmlkICYgVjRMMl9TVERfNjI1XzUwKSA/IDcyMCA6IDY0MDsKIH0KIAorCiBzdGF0aWMgdW5zaWduZWQgaW50IGlubGluZSBub3JtX21heGgoc3RydWN0IGN4ODhfdHZub3JtICpub3JtKQogewogCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gNTc2IDogNDgwOwpAQCAtMTU5LDcgKzE1Nyw3IEBACiAjZGVmaW5lIENYODhfQk9BUkRfS1dPUkxEX0RWQl9UICAgICAgICAgICAgMTQKICNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UMSAxNQogI2RlZmluZSBDWDg4X0JPQVJEX0tXT1JMRF9MVFY4ODMgICAgICAgICAgIDE2Ci0jZGVmaW5lIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTEQgMTcKKyNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9RICAxNwogI2RlZmluZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDEgICAgICAgIDE4CiAjZGVmaW5lIENYODhfQk9BUkRfQ09ORVhBTlRfRFZCX1QxICAgICAgICAgMTkKICNkZWZpbmUgQ1g4OF9CT0FSRF9QUk9WSURFT19QVjI1OSAgICAgICAgICAyMApAQCAtMTY3LDEwICsxNjUsMTIgQEAKICNkZWZpbmUgQ1g4OF9CT0FSRF9QQ0hEVFZfSEQzMDAwICAgICAgICAgICAyMgogI2RlZmluZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVCAgICAgICAgIDIzCiAjZGVmaW5lIENYODhfQk9BUkRfSEFVUFBBVUdFX1JPU0xZTiAgICAgICAgMjQKLSNkZWZpbmUgQ1g4OF9CT0FSRF9ESUdJVEFMTE9HSUNfTUVDCSAgICAgICAyNQorI2RlZmluZSBDWDg4X0JPQVJEX0RJR0lUQUxMT0dJQ19NRUMgICAgICAgIDI1CiAjZGVmaW5lIENYODhfQk9BUkRfSU9EQVRBX0dWQkNUVjdFICAgICAgICAgMjYKICNkZWZpbmUgQ1g4OF9CT0FSRF9QSVhFTFZJRVdfUExBWVRWX1VMVFJBX1BSTyAyNwogI2RlZmluZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1QgIDI4CisjZGVmaW5lIENYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0kgICAgICAgICAgMjkKKyNkZWZpbmUgQ1g4OF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZXzE0MDBfRFZCX1QxICAzMAogCiBlbnVtIGN4ODhfaXR5cGUgewogCUNYODhfVk1VWF9DT01QT1NJVEUxID0gMSwKQEAgLTIyMCw3ICsyMjAsNiBAQAogI2RlZmluZSBSRVNPVVJDRV9WQkkgICAgICAgICAgIDQKIAogI2RlZmluZSBCVUZGRVJfVElNRU9VVCAgICAgKEhaLzIpICAvKiAwLjUgc2Vjb25kcyAqLwotLy8jZGVmaW5lIEJVRkZFUl9USU1FT1VUICAgICAoSFoqMikKIAogLyogYnVmZmVyIGZvciBvbmUgdmlkZW8gZnJhbWUgKi8KIHN0cnVjdCBjeDg4X2J1ZmZlciB7CkBAIC0zMzYsMTEgKzMzNSw2IEBACiAJc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgKnBjaTsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICBwY2lfcmV2LHBjaV9sYXQ7CiAKLSNpZiAwCi0JLyogdmlkZW8gb3ZlcmxheSAqLwotCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICAgIGZidWY7Ci0Jc3RydWN0IGN4ODhfYnVmZmVyICAgICAgICAgKnNjcmVlbjsKLSNlbmRpZgogCiAJLyogY2FwdHVyZSBxdWV1ZXMgKi8KIAlzdHJ1Y3QgY3g4OF9kbWFxdWV1ZSAgICAgICB2aWRxOwpAQCAtNDM1LDggKzQyOSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogY3g4OC1jb3JlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotZXh0ZXJuIGNoYXIgKmN4ODhfdmlkX2lycXNbMzJdOwotZXh0ZXJuIGNoYXIgKmN4ODhfbXBlZ19pcnFzWzMyXTsKIGV4dGVybiB2b2lkIGN4ODhfcHJpbnRfaXJxYml0cyhjaGFyICpuYW1lLCBjaGFyICp0YWcsIGNoYXIgKipzdHJpbmdzLAogCQkJICAgICAgIHUzMiBiaXRzLCB1MzIgbWFzayk7CiBleHRlcm4gdm9pZCBjeDg4X3ByaW50X2lvY3RsKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBjbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwppbmRleCA5MjY2NGY3Li45ZmM1MDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGlyLWtiZC1pMmMuYyx2IDEuMTAgMjAwNC8xMi8wOSAxMjo1MTozNSBrcmF4ZWwgRXhwICQKKyAqICRJZDogaXIta2JkLWkyYy5jLHYgMS4xMSAyMDA1LzA3LzA3IDE2OjQyOjExIG1jaGVoYWIgRXhwICQKICAqCiAgKiBrZXlib2FyZCBpbnB1dCBkcml2ZXIgZm9yIGkyYyBJUiByZW1vdGUgY29udHJvbHMKICAqCkBAIC02NiwyNiArNjYsMjYgQEAKIAlbIDI5IF0gPSBLRVlfUEFHRURPV04sCiAJWyAxOSBdID0gS0VZX1NPVU5ELAogCi0JWyAyNCBdID0gS0VZX0tQUExVU01JTlVTLAkvLyBDSCArLy0KLQlbIDIyIF0gPSBLRVlfU1VCVElUTEUsCQkvLyBDQwotCVsgMTMgXSA9IEtFWV9URVhULAkJLy8gVFRYCi0JWyAxMSBdID0gS0VZX1RWLAkJLy8gQUlSL0NCTAotCVsgMTcgXSA9IEtFWV9QQywJCS8vIFBDL1RWCi0JWyAyMyBdID0gS0VZX09LLAkJLy8gQ0ggUlROCi0JWyAyNSBdID0gS0VZX01PREUsIAkJLy8gRlVOQwotCVsgMTIgXSA9IEtFWV9TRUFSQ0gsIAkJLy8gQVVUT1NDQU4KKwlbIDI0IF0gPSBLRVlfS1BQTFVTTUlOVVMsCS8qIENIICsvLSAqLworCVsgMjIgXSA9IEtFWV9TVUJUSVRMRSwJCS8qIENDICovCisJWyAxMyBdID0gS0VZX1RFWFQsCQkvKiBUVFggKi8KKwlbIDExIF0gPSBLRVlfVFYsCQkvKiBBSVIvQ0JMICovCisJWyAxNyBdID0gS0VZX1BDLAkJLyogUEMvVFYgKi8KKwlbIDIzIF0gPSBLRVlfT0ssCQkvKiBDSCBSVE4gKi8KKwlbIDI1IF0gPSBLRVlfTU9ERSwgCQkvKiBGVU5DICovCisJWyAxMiBdID0gS0VZX1NFQVJDSCwgCQkvKiBBVVRPU0NBTiAqLwogCiAJLyogTm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoZXNlIG9uZXMhICovCi0JWyAxNSBdID0gS0VZX1NFTEVDVCwgCQkvLyBTT1VSQ0UKLQlbIDEwIF0gPSBLRVlfS1BQTFVTLAkJLy8gKzEwMAotCVsgMjAgXSA9IEtFWV9LUEVRVUFMLAkJLy8gU1lOQwotCVsgMjggXSA9IEtFWV9NRURJQSwgICAgICAgICAgICAgLy8gUEMvVFYKKwlbIDE1IF0gPSBLRVlfU0VMRUNULCAJCS8qIFNPVVJDRSAqLworCVsgMTAgXSA9IEtFWV9LUFBMVVMsCQkvKiArMTAwICovCisJWyAyMCBdID0gS0VZX0tQRVFVQUwsCQkvKiBTWU5DICovCisJWyAyOCBdID0gS0VZX01FRElBLCAgICAgICAgICAgICAvKiBQQy9UViAqLwogfTsKIAogc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3B1cnBsZXR2W0lSX0tFWVRBQl9TSVpFXSA9IHsKIAlbIDB4MyAgXSA9IEtFWV9QT1dFUiwKIAlbIDB4NmYgXSA9IEtFWV9NVVRFLAotCVsgMHgxMCBdID0gS0VZX0JBQ0tTUEFDRSwJLy8gUmVjYWxsCisJWyAweDEwIF0gPSBLRVlfQkFDS1NQQUNFLAkvKiBSZWNhbGwgKi8KIAogCVsgMHgxMSBdID0gS0VZX0tQMCwKIAlbIDB4NCAgXSA9IEtFWV9LUDEsCkBAIC05Nyw3ICs5Nyw3IEBACiAJWyAweGMgIF0gPSBLRVlfS1A3LAogCVsgMHhkICBdID0gS0VZX0tQOCwKIAlbIDB4ZSAgXSA9IEtFWV9LUDksCi0JWyAweDEyIF0gPSBLRVlfS1BET1QsCQkvLyAxMDArCisJWyAweDEyIF0gPSBLRVlfS1BET1QsCQkvKiAxMDArICovCiAKIAlbIDB4NyAgXSA9IEtFWV9WT0xVTUVVUCwKIAlbIDB4YiAgXSA9IEtFWV9WT0xVTUVET1dOLApAQCAtMTA5LDI1ICsxMDksMTYgQEAKIAlbIDB4MTMgXSA9IEtFWV9DSEFOTkVMRE9XTiwKIAlbIDB4NDggXSA9IEtFWV9aT09NLAogCi0JWyAweDFiIF0gPSBLRVlfVklERU8sCQkvLyBWaWRlbyBzb3VyY2UKLSNpZiAwCi0JWyAweDFmIF0gPSBLRVlfUywgICAgICAgCS8vIFNuYXBzaG90Ci0jZW5kaWYKLQlbIDB4NDkgXSA9IEtFWV9MQU5HVUFHRSwJLy8gTVRTIFNlbGVjdAotCVsgMHgxOSBdID0gS0VZX1NFQVJDSCwJCS8vIEF1dG8gU2NhbgorCVsgMHgxYiBdID0gS0VZX1ZJREVPLAkJLyogVmlkZW8gc291cmNlICovCisJWyAweDQ5IF0gPSBLRVlfTEFOR1VBR0UsCS8qIE1UUyBTZWxlY3QgKi8KKwlbIDB4MTkgXSA9IEtFWV9TRUFSQ0gsCQkvKiBBdXRvIFNjYW4gKi8KIAogCVsgMHg0YiBdID0gS0VZX1JFQ09SRCwKIAlbIDB4NDYgXSA9IEtFWV9QTEFZLAotCVsgMHg0NSBdID0gS0VZX1BBVVNFLCAgIAkvLyBQYXVzZQorCVsgMHg0NSBdID0gS0VZX1BBVVNFLCAgIAkvKiBQYXVzZSAqLwogCVsgMHg0NCBdID0gS0VZX1NUT1AsCi0jaWYgMAotCVsgMHg0MyBdID0gS0VZX1QsICAgIAkJLy8gVGltZSBTaGlmdAotCVsgMHg0NyBdID0gS0VZX1ksICAgIAkJLy8gVGltZSBTaGlmdCBPRkYKLQlbIDB4NGEgXSA9IEtFWV9PLCAgICAJCS8vIFRPUAotCVsgMHgxNyBdID0gS0VZX0YsICAgIAkJLy8gU1VSRiBDSAotI2VuZGlmCi0JWyAweDQwIF0gPSBLRVlfRk9SV0FSRCwgICAJLy8gRm9yd2FyZCA/Ci0JWyAweDQyIF0gPSBLRVlfUkVXSU5ELCAgIAkvLyBCYWNrd2FyZCA/CisJWyAweDQwIF0gPSBLRVlfRk9SV0FSRCwgICAJLyogRm9yd2FyZCA/ICovCisJWyAweDQyIF0gPSBLRVlfUkVXSU5ELCAgIAkvKiBCYWNrd2FyZCA/ICovCiAKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmMKaW5kZXggYjRlZTlkZi4uNjIzOTI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmMKQEAgLTU2NywxMCArNTY3LDYgQEAKIAlzd2l0Y2ggKGF1ZG1vZGUpIHsKIAljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86CiAJCXNyYyA9IDB4MDAyMCB8IG5pY2FtOwotI2lmIDAKLQkJLyogc3BhdGlhbCBlZmZlY3QgKi8KLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwNSwweDQwMDApOwotI2VuZGlmCiAJCWJyZWFrOwogCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CiAJCWlmIChtc3AtPm1vZGUgPT0gTVNQX01PREVfQU1fTklDQU0pIHsKQEAgLTc0MSwxNiArNzM3LDE0IEBACiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJc2NoZWR1bGUoKTsKIAkJfSBlbHNlIHsKLSNpZiAwCi0JCQkvKiBobW0sIHRoYXQgb25lIGRvZXNuJ3QgcmV0dXJuIG9uIHdha2V1cCAuLi4gKi8KLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOwotI2Vsc2UKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotI2VuZGlmCiAJCX0KIAl9Ci0JdHJ5X3RvX2ZyZWV6ZSgpOworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkgeworCQlyZWZyaWdlcmF0b3IgKCk7CisJfQorCiAJcmVtb3ZlX3dhaXRfcXVldWUoJm1zcC0+d3EsICZ3YWl0KTsKIAlyZXR1cm4gbXNwLT5yZXN0YXJ0OwogfQpAQCAtMTE1NCwxNyArMTE0OCwxMCBAQAogCQkJCQkgICAgTVNQX0NBUlJJRVIoMTAuNykpOwogCQkJLyogc2NhcnQgcm91dGluZyAqLwogCQkJbXNwMzQwMGNfc2V0X3NjYXJ0KGNsaWVudCxTQ0FSVF9JTjIsMCk7Ci0jaWYgMAotCQkJLyogcmFkaW8gZnJvbSBTQ0FSVF9JTjIgKi8KLQkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDA4LCAweDAyMjApOwotCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDksIDB4MDIyMCk7Ci0JCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwYiwgMHgwMjIwKTsKLSNlbHNlCiAJCQkvKiBtc3AzNHh4IGRvZXMgcmFkaW8gZGVjb2RpbmcgKi8KIAkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDA4LCAweDAwMjApOwogCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDksIDB4MDAyMCk7CiAJCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwYiwgMHgwMDIwKTsKLSNlbmRpZgogCQkJYnJlYWs7CiAJCWNhc2UgMHgwMDAzOgogCQljYXNlIDB4MDAwNDoKQEAgLTE1MDcsMTAgKzE0OTQsNiBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0jaWYgMAotCS8qIHRoaXMgd2lsbCB0dXJuIG9uIGEgMWtIeiBiZWVwIC0gbWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuLi4gKi8KLQltc3AzNDAwY193cml0ZShjLEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAxNCwgMHgxMDQwKTsKLSNlbmRpZgogCW1zcDM0MDBjX3NldHZvbHVtZShjLCBtc3AtPm11dGVkLCBtc3AtPnZvbHVtZSwgbXNwLT5iYWxhbmNlKTsKIAogCXNucHJpbnRmKGMtPm5hbWUsIHNpemVvZihjLT5uYW1lKSwgIk1TUDM0JTAyZCVjLSVjJWQiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQyMHh4LmMKaW5kZXggOWMwMDVjYi4uMmZiN2MyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jCkBAIC01MTEsMjIgKzUxMSw2IEBACiAJdHVuZXJfaW5mbygibWljcm90dW5lOiBjb21wYW55Y29kZT0lMDR4IHBhcnQ9JTAyeCByZXY9JTAyeFxuIiwKIAkJICAgY29tcGFueV9jb2RlLGJ1ZlsweDEzXSxidWZbMHgxNF0pOwogCi0jaWYgMAotCS8qIHNlZW1zIHRvIGNhdXNlIG1vcmUgcHJvYmxlbXMgdGhhbiBpdCBzb2x2ZXMgLi4uICovCi0Jc3dpdGNoIChjb21wYW55X2NvZGUpIHsKLQljYXNlIDB4MzBiZjoKLQljYXNlIDB4M2NiZjoKLQljYXNlIDB4M2RiZjoKLQljYXNlIDB4NGQ1NDoKLQljYXNlIDB4OGU4MToKLQljYXNlIDB4OGU5MToKLQkJLyogb2sgKD8pICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXR1bmVyX3dhcm4oInR1bmVyOiBtaWNyb3R1bmU6IHVua25vd24gY29tcGFueWNvZGVcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKIAogCWlmIChidWZbMHgxM10gPCBBUlJBWV9TSVpFKG1pY3JvdHVuZV9wYXJ0KSAmJgogCSAgICBOVUxMICE9IG1pY3JvdHVuZV9wYXJ0W2J1ZlsweDEzXV0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYwppbmRleCA3MGJmMWYxLi40ODYyMzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKQEAgLTMyNiw2ICszMjYsNyBAQAogCXN0cnVjdCBteGIqIG14YiA9IChzdHJ1Y3QgbXhiKilkZXYtPmV4dF9wcml2OwogCXN0cnVjdCB2aWRlb19kZWNvZGVyX2luaXQgaW5pdDsKIAlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKIAogCWludCBpID0gMCwgZXJyID0gMDsKIAlzdHJ1Y3QJdGVhNjQxNWNfbXVsdGlwbGV4IHZtOwkKQEAgLTM0OSw4ICszNTAsMTAgQEAKIAlteGItPnNhYTcxMTFhLT5kcml2ZXItPmNvbW1hbmQobXhiLT5zYWE3MTExYSxERUNPREVSX1NFVF9WQklfQllQQVNTLCAmaSk7CiAKIAkvKiBzZWxlY3QgYSB0dW5lciB0eXBlICovCi0JaSA9IDU7IAotCW14Yi0+dHVuZXItPmRyaXZlci0+Y29tbWFuZChteGItPnR1bmVyLFRVTkVSX1NFVF9UWVBFLCAmaSk7CisJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfQU5BTE9HX1RWOworCXR1bl9zZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKKwl0dW5fc2V0dXAudHlwZSA9IDU7CisJbXhiLT50dW5lci0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dHVuZXIsVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CiAJCiAJLyogbXV0ZSBhdWRpbyBvbiB0ZWE2NDIwcyAqLwogCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2xpbmVbNl1bMF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCmluZGV4IGU2ZDBhMTguLjc5ZDA1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKQEAgLTE1NSwxMCArMTU1LDYgQEAKIAkJLnRhcmdldCAgPSAyNTYsCiAJfSwKIAotI2lmIDAKLQkvKiBGSVhNRTogc2l6ZT8gdmlhIFNfRk1UPyAqLwotCS52aWRlb19mb3JtYXQgPSBNUEVHX1ZJREVPX0ZPUk1BVF9EMSwKLSNlbmRpZgogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKaW5kZXggMGM3ODFlMi4uODhiNzFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCkBAIC0xLDYgKzEsNSBAQAotCiAvKgotICogJElkOiBzYWE3MTM0LWNhcmRzLmMsdiAxLjU4IDIwMDUvMDYvMDcgMTg6MDU6MDAgbnNoIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtY2FyZHMuYyx2IDEuODAgMjAwNS8wNy8wNyAwMTo0OTozMCBta3J1Zmt5IEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiBjYXJkLXNwZWNpZmljIHN0dWZmLgpAQCAtNDcsNiArNDYsMTAgQEAKIAkJLm5hbWUJCT0gIlVOS05PV04vR0VORVJJQyIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfQUJTRU5ULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gImRlZmF1bHQiLAogCQkJLnZtdXggPSAwLApAQCAtNTgsNiArNjEsMTAgQEAKIAkJLm5hbWUJCT0gIlByb3RldXMgUHJvIFtwaGlsaXBzIHJlZmVyZW5jZSBkZXNpZ25dIiwKIAkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCiAJCQkudm11eCA9IDAsCkBAIC04Myw2ICs5MCwxMCBAQAogCQkubmFtZQkJPSAiTGlmZVZpZXcgRmx5VklERU8zMDAwIiwKIAkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCiAJCS5ncGlvbWFzayAgICAgICA9IDB4ZTAwMCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKQEAgLTkwLDcgKzEwMSw3IEBACiAJCQkuYW11eCA9IFRWLAogCQkJLmdwaW8gPSAweDgwMDAsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7CisJCX0sewogCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCiAJCQkudm11eCA9IDEsCiAJCQkuYW11eCA9IExJTkUyLApAQCAtMTE3LDEyICsxMjgsMjEgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4MjAwMCwKIAkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4ODAwMCwKKwkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMjAwMF0gPSB7CiAJCS8qICJUQyBXYW4iIDx0Y3dhbkBjcy51c20ubXk+ICovCiAJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlWSURFTzIwMDAiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwogCQkuZ3Bpb21hc2sgICAgICAgPSAweGUwMDAsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC0xNDYsMTQgKzE2NiwxNCBAQAogCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHg0MDAwLAogCQl9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDIwMDAsCi0gICAgICAgICAgICAgICAgfSwKKwkJfSwKIAkJLm11dGUgPSB7CiAJCQkubmFtZSA9IG5hbWVfbXV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDgwMDAsCiAJCX0sCiAJfSwKQEAgLTE2Miw2ICsxODIsMTAgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkxpZmVWaWV3IEZseVRWIFBsYXRpbnVtIE1pbmkiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAxLApAQCAtMTgzLDYgKzIwNywxMCBAQAogCQkubmFtZSAgICAgICAgICAgPSAiTGlmZVZpZXcgRmx5VFYgUGxhdGludW0gRk0iLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwogCQkuZ3Bpb21hc2sgICAgICAgPSAweDFFMDAwLAkvKiBTZXQgR1AxNiBhbmQgdW51c2VkIDE1LDE0LDEzIHRvIE91dHB1dCAqLwogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LApAQCAtMTkwLDcgKzIxOCw3IEBACiAJCQkuYW11eCA9IFRWLAogCQkJLmdwaW8gPSAweDEwMDAwLAkvKiBHUDE2PTEgc2VsZWN0cyBUViBpbnB1dCAqLwogCQkJLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0seworCQl9LHsKIC8qCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCiAJCQkudm11eCA9IDEsCiAJCQkuYW11eCA9IExJTkUyLApAQCAtMjAwLDI5ICsyMjgsMzggQEAKICovCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAkvKiBDb21wb3NpdGUgc2lnbmFsIG9uIFMtVmlkZW8gaW5wdXQgKi8KIAkJCS52bXV4ID0gMCwKIAkJCS5hbXV4ID0gTElORTIsCi0vLwkJCS5ncGlvID0gMHg0MDAwLAorLyoJCQkuZ3BpbyA9IDB4NDAwMCwgICAgICAgICAqLwogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9jb21wMiwJLyogQ29tcG9zaXRlIGlucHV0ICovCiAJCQkudm11eCA9IDMsCiAJCQkuYW11eCA9IExJTkUyLAotLy8JCQkuZ3BpbyA9IDB4NDAwMCwKKy8qCQkJLmdwaW8gPSAweDQwMDAsICAgICAgICAgKi8KIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAkvKiBTLVZpZGVvIHNpZ25hbCBvbiBTLVZpZGVvIGlucHV0ICovCiAJCQkudm11eCA9IDgsCiAJCQkuYW11eCA9IExJTkUyLAotLy8JCQkuZ3BpbyA9IDB4NDAwMCwKKy8qCQkJLmdwaW8gPSAweDQwMDAsICAgICAgICAgKi8KIAkJfX0sCiAJCS5yYWRpbyA9IHsKIAkJCS5uYW1lID0gbmFtZV9yYWRpbywKIAkJCS5hbXV4ID0gVFYsCiAJCQkuZ3BpbyA9IDB4MDAwMDAsCS8qIEdQMTY9MCBzZWxlY3RzIEZNIHJhZGlvIGFudGVubmEgKi8KIAkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MTAwMDAsCisJCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9FTVBSRVNTXSA9IHsKIAkJLyogIkdlcnQgVmVydm9vcnQiIDxnZXJ0LnZlcnZvb3J0QHBoaWxpcHMuY29tPiAqLwogCQkubmFtZQkJPSAiRU1QUkVTUyIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAwLApAQCAtMjQ1LDMzICsyODIsNDAgQEAKIAkJLnZpZGVvX291dCA9IENDSVI2NTYsCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9NT05TVEVSVFZdID0gewotICAgICAgICAgICAgICAgLyogIksuT2h0YSIgPGFscGhhMjkyQGJyZW1lbi5vci5qcD4gKi8KLSAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTS05ldCBNb25zdGVyIFRWIiwKLSAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0gICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKLSAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgfX0sCi0gICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgIH0sCisJCS8qICJLLk9odGEiIDxhbHBoYTI5MkBicmVtZW4ub3IuanA+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJTS05ldCBNb25zdGVyIFRWIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKworCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX01EOTcxN10gPSB7CiAJCS5uYW1lCQk9ICJUZXZpb24gTUQgOTcxNyIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKQEAgLTMwMiwxMCArMzQ2LDEzIEBACiAJCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9UVlNUQVRJT05fUkRTXSA9IHsKLSAgICAgICAgICAgICAgICAvKiBUeXBob29uIFRWIFR1bmVyIFJEUzogQXJ0Lk5yLiA1MDY5NCAqLworCQkvKiBUeXBob29uIFRWIFR1bmVyIFJEUzogQXJ0Lk5yLiA1MDY5NCAqLwogCQkubmFtZQkJPSAiS05DIE9uZSBUVi1TdGF0aW9uIFJEUyAvIFR5cGhvb24gVFYgVHVuZXIgUkRTIiwKIAkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC0zMTQsMTAgKzM2MSwxMCBAQAogCQkJLnR2ICAgPSAxLAogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV90dl9tb25vLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IExJTkUyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0seworCQkJLnZtdXggPSAxLAorCQkJLmFtdXggICA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKIAogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKIAkJCS52bXV4ID0gOCwKQEAgLTMyOCwxMCArMzc1LDEwIEBACiAJCQkuYW11eCA9IExJTkUxLAogCQl9LHsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSAiQ1ZpZCBvdmVyIFNWaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9fSwKKwkJCS5uYW1lID0gIkNWaWQgb3ZlciBTVmlkIiwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX19LAogCQkucmFkaW8gPSB7CiAJCQkubmFtZSA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCA9IExJTkUyLApAQCAtMzQxLDYgKzM4OCw5IEBACiAJCS5uYW1lCQk9ICJLTkMgT25lIFRWLVN0YXRpb24gRFZSIiwKIAkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mCT0gVERBOTg4N19QUkVTRU5ULAogCQkuZ3Bpb21hc2sJPSAweDgyMDAwMCwKIAkJLmlucHV0cwkJPSB7ewpAQCAtMzY5LDMyICs0MTksMzggQEAKIAkJLnZpZGVvX291dAk9IENDSVI2NTYsCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9DSU5FUkdZNDAwXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSA0MDAgVFYiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDIsIC8vIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfX0KLSAgICAgICAgfSwKKwkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNDAwIFRWIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSA0LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsIC8qIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IgKi8KKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX19CisJfSwKIAlbU0FBNzEzNF9CT0FSRF9NRDUwNDRdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiTWVkaW9uIDUwNDQiLAotCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LCAvLyB3YXM6IDB4MDAyMDAwMDAsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsIC8qIHdhczogMHgwMDIwMDAwMCwgKi8KIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LApAQCAtNDI2LDU3ICs0ODIsNjUgQEAKIAkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0tXT1JMRF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkt3b3JsZC9LdXJvdXRvU2hpa291IFNBQTcxMzAtVFZQQ0kiLAorCQkubmFtZSAgICAgICAgICAgPSAiS3dvcmxkL0t1cm91dG9TaGlrb3UgU0FBNzEzMC1UVlBDSSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX19LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNjAwIFRWIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSA2MDAgVFYiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDIsIC8vIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfX0sCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gNCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLCAvKiBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yICovCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQl9fSwKIAkJLnJhZGlvID0gewogCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAogCQkJLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCisJfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX01ENzEzNF0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJNZWRpb24gNzEzNCIsCi0JCS8vLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLQkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCiAJCS5pbnB1dHMgPSB7ewpAQCAtNTA0LDYgKzU2OCw5IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJUeXBob29uIFRWK1JhZGlvIDkwMDMxIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgICA9IG5hbWVfdHYsCkBAIC01MjMsMTEgKzU5MCwxNCBAQAogCQkJLm5hbWUgICA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCAgID0gTElORTIsCiAJCX0sCi0gICAgICAgIH0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9FTFNBXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkVMU0EgRVgtVklTSU9OIDMwMFRWIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfSElUQUNISV9OVFNDLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA4LApAQCAtNTQyLDExICs2MTIsMTQgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkudHYgICA9IDEsCiAJCX19LAotICAgICAgICB9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfRUxTQV81MDBUVl0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJFTFNBIEVYLVZJU0lPTiA1MDBUViIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0hJVEFDSElfTlRTQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKIAkJCS52bXV4ID0gNywKQEAgLTU2Miw4MyArNjM1LDEwMCBAQAogCQkJLmFtdXggPSBMSU5FMiwKIAkJCS50diAgID0gMSwKIAkJfX0sCi0gICAgICAgIH0sCi0JW1NBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFTVVMgVFYtRk0gNzEzNCIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKLSAgICAgICAgICAgICAgICAudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3JhZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LAogCX0sCi0JW1NBQTcxMzVfQk9BUkRfQVNVU1RlS19UVkZNNzEzNV0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFTVVMgVFYtRk0gNzEzNSIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJW1NBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJBU1VTIFRWLUZNIDcxMzQiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gNCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gNiwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUxLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJBU1VTIFRWLUZNIDcxMzUiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmdwaW9tYXNrICAgICAgID0gMHgyMDAwMDAsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAogCQkJLmdwaW8gPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gNCwKKwkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDYsCisJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3JhZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gVFYsCiAJCQkuZ3BpbyA9IDB4MjAwMDAwLAotICAgICAgICAgICAgICAgIH0sCisJCX0sCisJCS5tdXRlICA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmdwaW8gPSAweDAwMDAsCisJCX0sCisKIAl9LAogCVtTQUE3MTM0X0JPQVJEX1ZBMTAwMFBPV0VSXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQU9QRU4gVkExMDAwIFBPV0VSIiwKKwkJLm5hbWUgICAgICAgICAgID0gIkFPUEVOIFZBMTAwMCBQT1dFUiIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9fSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEXzEwTU9PTlNUVk1BU1RFUl0gPSB7CiAJCS8qICJsaWxpY2hlbmciIDxsbGNAbGludXhmYW5zLm9yZz4gKi8KIAkJLm5hbWUgICAgICAgICAgID0gIjEwTU9PTlMgUENJIFRWIENBUFRVUkUgQ0FSRCIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuZ3Bpb21hc2sgICAgICAgPSAweGUwMDAsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC02NjIsMTQgKzc1MiwxNCBAQAogCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHg0MDAwLAogCQl9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDIwMDAsCi0gICAgICAgICAgICAgICAgfSwKKwkJfSwKIAkJLm11dGUgPSB7CiAJCQkubmFtZSA9IG5hbWVfbXV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDgwMDAsCiAJCX0sCiAJfSwKQEAgLTY3OCw2ICs3NjgsOSBAQAogCQkubmFtZQkJPSAiQk1LIE1QRVggTm8gVHVuZXIiLAogCQkuYXVkaW9fY2xvY2sJPSAweDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9BQlNFTlQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9jb21wMSwKIAkJCS52bXV4ID0gNCwKQEAgLTcwNiw4MCArNzk5LDk0IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJDb21wcm8gVmlkZW9NYXRlIFRWIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgIH0sCi0gICAgW1NBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX0dPTERfUExVU10gPSB7CisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfR09MRF9QTFVTXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkNvbXBybyBWaWRlb01hdGUgVFYgR29sZCsiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKIAkJLmdwaW9tYXNrICAgICAgID0gMHg4MDBjMDAwMCwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbyA9IDB4MDZjMDAwMTIsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8gPSAweDBhYzIwMDEyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvID0gMHgwOGMyMDAxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgfSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MDZjMDAwMTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHgwYWMyMDAxMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDA4YzIwMDEyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwJCQkJLyogcmFkaW8gYW5kIHByb2JhYmx5IG11dGUgaXMgbWlzc2luZyAqLworCX0sCiAJW1NBQTcxMzRfQk9BUkRfQ1JPTk9TX1BMVVNdID0gewotCQkvKiBncGlvIHBpbnM6Ci0JCSAgIDAgIC4uIDMgICBCQVNFX0lECi0JCSAgIDQgIC4uIDcgICBQUk9URUNUX0lECi0JCSAgIDggIC4uIDExICBVU0VSX09VVAotCQkgICAxMiAuLiAxMyAgVVNFUl9JTgotCQkgICAxNCAuLiAxNSAgVklESU5fU0VMICovCisJCS8qCisJCWdwaW8gcGluczoKKwkJCTAgIC4uIDMgICBCQVNFX0lECisJCQk0ICAuLiA3ICAgUFJPVEVDVF9JRAorCQkJOCAgLi4gMTEgIFVTRVJfT1VUCisJCQkxMiAuLiAxMyAgVVNFUl9JTgorCQkJMTQgLi4gMTUgIFZJRElOX1NFTAorCQkqLwogCQkubmFtZSAgICAgICAgICAgPSAiTWF0cm94IENyb25vc1BsdXMiLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmdwaW9tYXNrICAgICAgID0gMHhjZjAwLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCiAJCQkuZ3BpbyA9IDIgPDwgMTQsCiAJCX0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAwLAogCQkJLmdwaW8gPSAxIDw8IDE0LAogCQl9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKKwkJCS5uYW1lID0gbmFtZV9jb21wMywKKwkJCS52bXV4ID0gMCwKIAkJCS5ncGlvID0gMCA8PCAxNCwKIAkJfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisJCQkubmFtZSA9IG5hbWVfY29tcDQsCisJCQkudm11eCA9IDAsCiAJCQkuZ3BpbyA9IDMgPDwgMTQsCiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKIAkJCS52bXV4ID0gOCwKIAkJCS5ncGlvID0gMiA8PCAxNCwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgfSwKKwkJfX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9NRDI4MTldID0gewogCQkubmFtZSAgICAgICAgICAgPSAiQXZlck1lZGlhIE0xNTYgLyBNZWRpb24gMjgxOSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKQEAgLTgwOSw2ICs5MTYsOSBAQAogCQkubmFtZSAgICAgICAgICAgPSAiQk1LIE1QRVggVHVuZXIiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9jb21wMSwKIAkJCS52bXV4ID0gMSwKQEAgLTgyNSw2MiArOTM1LDcyIEBACiAJCX19LAogCQkubXBlZyAgICAgID0gU0FBNzEzNF9NUEVHX0VNUFJFU1MsCiAJCS52aWRlb19vdXQgPSBDQ0lSNjU2LAotICAgICAgICB9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9BU1VTVEVLX1RWRk03MTMzXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQVNVUyBUVi1GTSA3MTMzIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotCQkvLyBwcm9iYWJseSB3cm9uZywgdGhlIDcxMzMgb25lIGlzIHRoZSBOVFNDIHZlcnNpb24gLi4uCi0JCS8vIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMwotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEMsCi0gICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQVNVU1RFS19UVkZNNzEzM10gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJBU1VTIFRWLUZNIDcxMzMiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkvKiBwcm9iYWJseSB3cm9uZywgdGhlIDcxMzMgb25lIGlzIHRoZSBOVFNDIHZlcnNpb24gLi4uCisJCSogLnR1bmVyX3R5cGUgID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszICovCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwogCQl9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA2LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDYsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfU1RFUkVPXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTdGVyZW8gKHNhYTcxMzQpIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKLSAgICAgICAgICAgICAgICAudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X0lOVEVSQ0FSUklFUiwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgIH0sCisJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0ZXJlbyAoc2FhNzEzNCkiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDJdID0gewogCQkvKiBPZ25qZW4gTmFzdGljIDxvZ25qZW5AbG9nb3NvZnQuYmE+ICovCiAJCS5uYW1lICAgICAgICAgICA9ICJNYW5saSBNdWNoVFYgTS1UVjAwMi9CZWhvbGQgVFYgNDAzIEZNIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCiAJCQkudm11eCA9IDgsCkBAIC05MDUsNiArMTAyNSw5IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJNYW5saSBNdWNoVFYgTS1UVjAwMS9CZWhvbGQgVFYgNDAxIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCiAJCQkudm11eCA9IDgsCkBAIC05MjEsMTQgKzEwNDQsMTcgQEAKIAkJfX0sCiAJCS5tdXRlID0gewogCQkJLm5hbWUgPSBuYW1lX211dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorCQkJLmFtdXggPSBMSU5FMSwKIAkJfSwKLSAgICAgICAgfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX1RHMzAwMFRWXSA9IHsKIAkJLyogVHJhbnNHZWFyIDMwMDBUViAqLwogCQkubmFtZSAgICAgICAgICAgPSAiTmFnYXNlIFNhbmd5byBUcmFuc0dlYXIgMzAwMFRWIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKQEAgLTk0NCw4MSArMTA3MCw5MCBAQAogCQkJLmFtdXggPSBMSU5FMiwKIAkJfX0sCiAJfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkVsaXRlZ3JvdXAgRUNTIFRWUDNYUCBGTTEyMTYgVHVuZXIgQ2FyZChQQUwtQkcsRk0pICIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsICAvLyB4dGFsIDMyLjEgTUh6Ci0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3R2X21vbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IExJTkUxLAorCVtTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBdID0geworCQkubmFtZSAgICAgICAgICAgPSAiRWxpdGVncm91cCBFQ1MgVFZQM1hQIEZNMTIxNiBUdW5lciBDYXJkKFBBTC1CRyxGTSkgIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsICAvKiB4dGFsIDMyLjEgTUh6ICovCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSAgID0gbmFtZV90diwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmFtdXggICA9IFRWLAorCQkJLnR2ICAgICA9IDEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfdHZfbW9ubywKKwkJCS52bXV4ICAgPSAxLAorCQkJLmFtdXggICA9IExJTkUyLAorCQkJLnR2ICAgICA9IDEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfY29tcDEsCisJCQkudm11eCAgID0gMywKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gOCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKIAkJfSx7CiAJCQkubmFtZSAgID0gIkNWaWQgb3ZlciBTVmlkIiwKIAkJCS52bXV4ICAgPSAwLAogCQkJLmFtdXggICA9IExJTkUxLAogCQl9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjVdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJFbGl0ZWdyb3VwIEVDUyBUVlAzWFAgRk0xMjM2IFR1bmVyIENhcmQgKE5UU0MsRk0pIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3R2X21vbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9ICJDVmlkIG92ZXIgU1ZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICB9LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJFbGl0ZWdyb3VwIEVDUyBUVlAzWFAgRk0xMjM2IFR1bmVyIENhcmQgKE5UU0MsRk0pIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDMsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDgsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9ICJDVmlkIG92ZXIgU1ZpZCIsCisJCQkudm11eCAgID0gMCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggICA9IExJTkUyLAorCQl9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfQVZBQ1NTTUFSVFRWXSA9IHsKIAkJLyogUm9tYW4gUHN6b25jemVua28gPHJvbWthQGtvbG9zLm1hdGgudW5pLmxvZHoucGw+ICovCiAJCS5uYW1lICAgICAgICAgICA9ICJBVkFDUyBTbWFydFRWIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gVFYsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7CisJCX0sewogCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCiAJCQkudm11eCA9IDEsCiAJCQkuYW11eCA9IExJTkUyLApAQCAtMTA0Nyw2ICsxMTgyLDkgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBEVkQgRVpNYWtlciIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAzLApAQCAtMTA1NSwyOCArMTE5MywzNCBAQAogCQkJLnZtdXggPSA4LAogCQl9fSwKIAl9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9OT1ZBQ19QUklNRVRWNzEzM10gPSB7Ci0gICAgICAgICAgICAgICAgLyogdG9zaGlpQG5ldGJzZC5vcmcgKi8KLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiTm92YWwgUHJpbWUgVFYgNzEzMyIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkgxX05UU0MsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAorCVtTQUE3MTM0X0JPQVJEX05PVkFDX1BSSU1FVFY3MTMzXSA9IHsKKwkJLyogdG9zaGlpQG5ldGJzZC5vcmcgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIk5vdmFsIFByaW1lIFRWIDcxMzMiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkgxX05UU0MsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCX19LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDVdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiQXZlck1lZGlhIEF2ZXJUViBTdHVkaW8gMzA1IiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyNTZfSUgzLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKQEAgLTEwOTcsMzUgKzEyNDEsNDEgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCX19LAogCQkucmFkaW8gPSB7Ci0JCQkgLm5hbWUgPSBuYW1lX3JhZGlvLAotCQkJIC5hbXV4ID0gTElORTIsCi0JCSB9LAorCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSwKIAkJLm11dGUgPSB7Ci0JCQkgLm5hbWUgPSBuYW1lX211dGUsCi0JCQkgLmFtdXggPSBMSU5FMSwKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBMSU5FMSwKIAkJfSwKIAl9LAotICAJW1NBQTcxMzNfQk9BUkRfVVBNT1NUX1BVUlBMRV9UVl0gPSB7Ci0gIAkJLm5hbWUgICAgICAgICAgID0gIlVQTU9TVCBQVVJQTEUgVFYiLAotICAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0gIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszLAotICAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKLSAgCQkuaW5wdXRzICAgICAgICAgPSB7ewotICAJCQkubmFtZSA9IG5hbWVfdHYsCi0gIAkJCS52bXV4ID0gNywKLSAgCQkJLmFtdXggPSBUViwKLSAgCQkJLnR2ICAgPSAxLAotICAJCX0sewotICAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAJCQkudm11eCA9IDcsCi0gIAkJCS5hbXV4ID0gTElORTEsCi0gIAkJfX0sCisJW1NBQTcxMzRfQk9BUkRfVVBNT1NUX1BVUlBMRV9UVl0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJVUE1PU1QgUFVSUExFIFRWIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gNywKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gNywKKwkJCS5hbXV4ID0gTElORTEsCisJCX19LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfSVRFTVNfTVRWMDA1XSA9IHsKIAkJLyogTm9ybWFuIEpvbmFzIDxub3JtYW5qb25hc0BhcmNvci5kZT4gKi8KIAkJLm5hbWUgICAgICAgICAgID0gIkl0ZW1zIE11Y2hUViBQbHVzIC8gSVQtMDA1IiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMywKQEAgLTExNDksMjcgKzEyOTksMzAgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgMjAwIFRWIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCiAJCQkuYW11eCA9IExJTkUyLAogCQkJLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLCAvLyBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gNCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLCAvKiBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yICovCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAogCQl9fSwKIAkJLm11dGUgPSB7Ci0JCQkgLm5hbWUgPSBuYW1lX211dGUsCi0JCQkgLmFtdXggPSBMSU5FMiwKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBMSU5FMiwKIAkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlJdID0gewpAQCAtMTE3Nyw4NCArMTMzMCw5NiBAQAogCQkubmFtZSAgICAgICAgICAgPSAiQ29tcHJvIFZpZGVvTWF0ZSBUViBQVlIvRk0iLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuZ3Bpb21hc2sJPSAweDgwOGMwMDgwLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAogCQkJLmdwaW8gPSAweDAwMDgwLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAogCQkJLmdwaW8gPSAweDAwMDgwLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMl9MRUZULAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTJfTEVGVCwKKwkJCS50diAgID0gMSwKIAkJCS5ncGlvID0gMHgwMDA4MCwKLSAgICAgICAgICAgICAgICB9fSwKKwkJfX0sCiAJCS5yYWRpbyA9IHsKIAkJCS5uYW1lID0gbmFtZV9yYWRpbywKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4ODAwMDAsCi0JCSB9LAorCQl9LAogCQkubXV0ZSA9IHsKIAkJCS5uYW1lID0gbmFtZV9tdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4NDAwMDAsCiAJCX0sCi0gICAgICAgIH0sCi0gICAgICAgIFtTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTV0gPSB7CisJfSwKKwlbU0FBNzEzNF9CT0FSRF9TQUJSRU5UX1NCVFRWRk1dID0gewogCQkvKiBNaWNoYWVsIFJvZHJpZ3Vlei1Ub3JyZW50IDxtcnRvcnJlbnRAYXN1LmVkdT4gKi8KLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU2FicmVudCBTQlQtVFZGTSAoc2FhNzEzMCkiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKKwkJLm5hbWUgICAgICAgICAgID0gIlNhYnJlbnQgU0JULVRWRk0gKHNhYTcxMzApIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9jb21wMSwKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gTElORTIsCiAJCX0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3JhZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgICA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCAgID0gTElORTIsCisJCX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9aT0xJRF9YUEVSVF9UVjcxMzRdID0gewogCQkvKiBIZWxnZSBKZW5zZW4gPGhlbGdlLmplbnNlbkBzbG9nLmRrPiAqLwotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICI6Wm9saWQgWHBlcnQgVFY3MTM0IiwKKwkJLm5hbWUgICAgICAgICAgID0gIjpab2xpZCBYcGVydCBUVjcxMzQiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9fSwKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0VNUElSRV9QQ0lfVFZfUkFESU9fTEVdID0gewogCQkvKiAiTWF0dGVvIEF6IiA8bWF0dGUuYXpAbm9zcGFtLmxpYmVyby5pdD4gOy0pICovCiAJCS5uYW1lICAgICAgICAgICA9ICJFbXBpcmUgUENJIFRWLVJhZGlvIExFIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmdwaW9tYXNrICAgICAgID0gMHg0MDAwLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCkBAIC0xMjczLDE4ICsxNDM4LDE4IEBACiAJCQkuYW11eCA9IExJTkUxLAogCQkJLmdwaW8gPSAweDgwMDAsCiAJCX19LAotICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKLQkJCSAubmFtZSA9IG5hbWVfcmFkaW8sCi0JCQkgLmFtdXggPSBMSU5FMSwKLQkJCSAuZ3BpbyA9IDB4ODAwMCwKLQkJIH0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4ODAwMCwKKwkJfSwKIAkJLm11dGUgPSB7Ci0JCQkgLm5hbWUgPSBuYW1lX211dGUsCi0JCQkgLmFtdXggPSBUViwKLQkJCSAuZ3BpbyA9MHg4MDAwLAotCQkgfQorCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPTB4ODAwMCwKKwkJfQogCX0sCi0gICAgICAgIFtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA3XSA9IHsKKwlbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwN10gPSB7CiAJCS8qCiAJCU5pY2tvbGF5IFYuIFNobXlyZXYgPG5zaG15cmV2QHlhbmRleC5ydT4KIAkJTG90cyBvZiB0aGFua3MgdG8gQW5kcmV5IFpvbG90YXJldiA8em9sb3RhcmV2X2FuZHJleUBtYWlsLnJ1PgpAQCAtMTI5Miw2ICsxNDU3LDkgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJtZWRpYSBBVmVyVFYgU3R1ZGlvIDMwNyIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4MDMsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CkBAIC0xMzIxLDEzICsxNDg5LDIxIEBACiAJCQkuYW11eCA9IExJTkUxLAogCQkJLmdwaW8gPSAweDAxLAogCQl9LAotICAgICAgICB9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfR09fMDA3X0ZNXSA9IHsKKwkJLm11dGUgID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDAwLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTV0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJBdmVybWVkaWEgQVZlclRWIEdPIDAwNyBGTSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwMzAwMDAzLAotLy8JCS5ncGlvbWFzayAgICAgICA9IDB4OGMyNDAwMDMsCisJCS8qIC5ncGlvbWFzayAgICAgICA9IDB4OGMyNDAwMDMsICovCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCkBAIC0xMzUwLDE2ICsxNTI2LDI0IEBACiAJCQkuYW11eCA9IExJTkUxLAogCQkJLmdwaW8gPSAweDAwMzAwMDAxLAogCQl9LAotICAgICAgICB9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgwMSwKKwkJfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9DQVJEQlVTXSA9IHsKLQkJLyogSm9uIFdlc3RnYXRlIDxvcnluQG9yeW4uZnNjay50dj4gKi8KLQkJLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBDYXJkYnVzIFRWL1JhZGlvIiwKLQkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKLQkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS8qIEtlZXMuQmxvbUBjd2kubmwgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBDYXJkYnVzIFRWL1JhZGlvIChFNTAwKSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKLQkJCS5hbXV4ID0gTElORTIsCisJCQkuYW11eCA9IFRWLAogCQkJLnR2ICAgPSAxLAogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9jb21wMSwKQEAgLTEzNjgsMTAgKzE1NTIsMTAgQEAKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA4LAotCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5hbXV4ID0gTElORTEsCiAJCX19LAogCQkucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKIAkJCS5hbXV4ID0gTElORTEsCiAJCX0sCiAJfSwKQEAgLTEzNzksMTE5ICsxNTYzLDEzNCBAQAogCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSA0MDAgbW9iaWxlIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FMUFNfVFNCRTVfUEFMLAotICAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBUViwKIAkJCS50diAgID0gMSwKLSAgICAgICAgICAgICAgIH0seworCQl9LHsKIAkJCS5uYW1lID0gbmFtZV90dl9tb25vLAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBMSU5FMiwKIAkJCS50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAogCQl9fSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0NJTkVSR1k2MDBfTUszXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSA2MDAgVFYgTUszIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSA2MDAgVFYgTUszIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKLSAgCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDIsIC8vIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfX0sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwgLyogQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvciAqLworCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCiAJCS5yYWRpbyA9IHsKIAkJCS5uYW1lID0gbmFtZV9yYWRpbywKIAkJCS5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICB9LAotICAgICAgICB9LAotIAlbU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfR09MRF9QTFVTXSA9IHsKLSAJCS8qIER5bGFuIFdhbGtkZW4gPGR5bGFuX3dhbGtkZW5AaG90bWFpbC5jb20+ICovCi0gCQkubmFtZQkJPSAiQ29tcHJvIFZpZGVvTWF0ZSBHb2xkKyBQYWwiLAotIAkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDE4N2RlNywKLSAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCi0gCQkuZ3Bpb21hc2sJPSAweDFjZTc4MCwKLSAJCS5pbnB1dHMJCT0ge3sKLSAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAotIAkJCS52bXV4ID0gMCwJCS8vIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IgLSBvaz8KLSAJCQkuYW11eCA9IExJTkUxLAotIAkJCS5ncGlvID0gMHgwMDgwODAsCi0gCQl9LHsKLSAJCQkubmFtZSA9IG5hbWVfY29tcDEsCi0gCQkJLnZtdXggPSAzLAotIAkJCS5hbXV4ID0gTElORTEsCi0gCQkJLmdwaW8gPSAweDAwODA4MCwKLSAJCX0sewotIAkJCS5uYW1lID0gbmFtZV90diwKLSAJCQkudm11eCA9IDEsCi0gCQkJLmFtdXggPSBUViwKLSAJCQkudHYgICA9IDEsCi0gCQkJLmdwaW8gPSAweDAwODA4MCwKLSAJCX19LAotIAkJLnJhZGlvID0gewotIAkJCS5uYW1lID0gbmFtZV9yYWRpbywKLSAJCQkuYW11eCA9IExJTkUyLAotIAkJCS5ncGlvID0gMHg4MDAwMCwKLSAJCX0sCi0gCQkubXV0ZSA9IHsKLSAJCQkubmFtZSA9IG5hbWVfbXV0ZSwKLSAJCQkuYW11eCA9IExJTkUyLAotIAkJCS5ncGlvID0gMHgwYzgwMDAsCi0gCQl9LAotIAl9LAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfVklERU9NQVRFX0dPTERfUExVU10gPSB7CisJCS8qIER5bGFuIFdhbGtkZW4gPGR5bGFuX3dhbGtkZW5AaG90bWFpbC5jb20+ICovCisJCS5uYW1lCQk9ICJDb21wcm8gVmlkZW9NYXRlIEdvbGQrIFBhbCIsCisJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5ncGlvbWFzawk9IDB4MWNlNzgwLAorCQkuaW5wdXRzCQk9IHt7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSAwLAkJLyogQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvciAtIG9rPyAqLworCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHgwMDgwODAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHgwMDgwODAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJCS5ncGlvID0gMHgwMDgwODAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDgwMDAwLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwYzgwMDAsCisJCX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViAzMDBpIERWQi1UICsgUEFMIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKLSAgICAgICAgICAgICAgICAudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X0lOVEVSQ0FSUklFUiwKKwkJLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgMzAwaSBEVkItVCArIFBBTCIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X0lOVEVSQ0FSUklFUiwKIAkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgIH0sCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9QUk9WSURFT19QVjk1Ml0gPSB7CiAJCS8qIGFuZHJlYXMua3JldHNjaG1lckB3ZWIuZGUgKi8KIAkJLm5hbWUJCT0gIlByb1ZpZGVvIFBWOTUyIiwKIAkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCkBAIC0xNTE1LDEwICsxNzE0LDEzIEBACiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA1XSA9IHsKIAkJLyogbXVjaCBsaWtlIHRoZSAic3R1ZGlvIiB2ZXJzaW9uIGJ1dCB3aXRob3V0IHJhZGlvCi0JCSAqIGFuZCBhbm90aGVyIHR1bmVyIChzaXJzcGlyaXR1c0B5YW5kZXgucnUpICovCisJCSogYW5kIGFub3RoZXIgdHVuZXIgKHNpcnNwaXJpdHVzQHlhbmRleC5ydSkgKi8KIAkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBBdmVyVFYvMzA1IiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GUTEyMTZNRSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC0xNTM5LDExNSArMTc0MSwyNjggQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCX19LAogCQkubXV0ZSA9IHsKLQkJCSAubmFtZSA9IG5hbWVfbXV0ZSwKLQkJCSAuYW11eCA9IExJTkUxLAorCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IExJTkUxLAogCQl9LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfRkxZRFZCVERVT10gPSB7CiAJCS8qIExpZmVWaWV3IEZseURWQi1UIERVTyAqLwotCQkvKiAiTmljbyBTYWJiaSA8bnNhYmJpQHRpc2NhbGkuaXQ+ICovCisJCS8qICJOaWNvIFNhYmJpIDxuc2FiYmlAdGlzY2FsaS5pdD4gIEhhcnRtdXQgSGFja21hbm4gaGFydG11dC5oYWNrbWFubkB0LW9ubGluZS5kZSovCiAJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlEVkItVCBEVU8iLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCi0vLwkJLmdwaW9tYXNrICAgICAgID0gMHhlMDAwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCiAJCQkuYW11eCA9IFRWLAotLy8JCQkuZ3BpbyA9IDB4MDAwMCwKIAkJCS50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKKwkJfSx7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCS8qIENvbXBvc2l0ZSBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLwogCQkJLnZtdXggPSAwLAogCQkJLmFtdXggPSBMSU5FMiwKLS8vCQkJLmdwaW8gPSAweDQwMDAsCiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAkvKiBDb21wb3NpdGUgaW5wdXQgKi8KIAkJCS52bXV4ID0gMywKIAkJCS5hbXV4ID0gTElORTIsCi0vLwkJCS5ncGlvID0gMHg0MDAwLAogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCS8qIFMtVmlkZW8gc2lnbmFsIG9uIFMtVmlkZW8gaW5wdXQgKi8KIAkJCS52bXV4ID0gOCwKIAkJCS5hbXV4ID0gTElORTIsCi0vLwkJCS5ncGlvID0gMHg0MDAwLAogCQl9fSwKIAl9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3XSA9IHsKLSAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgIERhdnlkb3YgVmxhZGltaXIgPHZsYWRpbWlyQGlxbWVkaWEuY29tPgotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBdmVybWVkaWEgQVZlclRWIDMwNyIsCi0gICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GUTEyMTZNRSwKLSAgICAgICAgICAgICAgIC50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKLSAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLAotICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgfX0sCi0gICAgICAgIH0sCi0JW1NBQTcxMzRfQk9BUkRfQURTX0lOU1RBTlRfVFZdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBRFMgVGVjaCBJbnN0YW50IFRWIChzYWE3MTM1KSIsCisJW1NBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJQaGlsaXBzIFRPVUdIIERWQi1UIHJlZmVyZW5jZSBkZXNpZ24iLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FCU0VOVCwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfX0sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKKwkJLmlucHV0cyA9IHt7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ICAgPSA4LAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9fSwKIAl9LAotIAlbU0FBNzEzNF9CT0FSRF9LV09STERfVlNUUkVBTV9YUEVSVF0gPSB7Ci0gCQkubmFtZSAgICAgICAgICAgPSAiS3dvcmxkL1RldmlvbiBWLVN0cmVhbSBYcGVydCBUViBQVlI3MTM0IiwKLSAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0gCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTF9JLAotIAkJLmdwaW9tYXNrCT0gMHgwNzAwLAotIAkJLmlucHV0cyA9IHt7Ci0gCQkJLm5hbWUgICA9IG5hbWVfdHYsCi0gCQkJLnZtdXggICA9IDEsCi0gCQkJLmFtdXggICA9IFRWLAotIAkJCS50diAgICAgPSAxLAotIAkJCS5ncGlvICAgPSAweDAwMCwKLSAJCX0sewotIAkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAotIAkJCS52bXV4ICAgPSAzLAotIAkJCS5hbXV4ICAgPSBMSU5FMSwKLSAJCQkuZ3BpbyAgID0gMHgyMDAsCQkvL2dwaW8gYnkgRFNjYWxlcgotIAkJfSx7Ci0gCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAotIAkJCS52bXV4ICAgPSAwLAotIAkJCS5hbXV4ICAgPSBMSU5FMSwKLSAJCQkuZ3BpbyAgID0gMHgyMDAsCi0gCQl9fSwKLSAJCS5yYWRpbyA9IHsKLSAJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKLSAJCQkuYW11eCAgID0gTElORTEsCi0gCQkJLmdwaW8gICA9IDB4MTAwLAotIAkJfSwKLSAJfSwKLSB9OworCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDddID0geworCQkvKgorCQlEYXZ5ZG92IFZsYWRpbWlyIDx2bGFkaW1pckBpcW1lZGlhLmNvbT4KKwkJKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJtZWRpYSBBVmVyVFYgMzA3IiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GUTEyMTZNRSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9BRFNfSU5TVEFOVF9UVl0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJBRFMgVGVjaCBJbnN0YW50IFRWIChzYWE3MTM1KSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0tXT1JMRF9WU1RSRUFNX1hQRVJUXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkt3b3JsZC9UZXZpb24gVi1TdHJlYW0gWHBlcnQgVFYgUFZSNzEzNCIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMX0ksCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmdwaW9tYXNrCT0gMHgwNzAwLAorCQkuaW5wdXRzID0ge3sKKwkJCS5uYW1lICAgPSBuYW1lX3R2LAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gVFYsCisJCQkudHYgICAgID0gMSwKKwkJCS5ncGlvICAgPSAweDAwMCwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4MjAwLAkJLyogZ3BpbyBieSBEU2NhbGVyICovCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDAsCisJCQkuYW11eCAgID0gTElORTEsCisJCQkuZ3BpbyAgID0gMHgyMDAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJCS5ncGlvICAgPSAweDEwMCwKKwkJfSwKKwkJLm11dGUgID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDAwMCwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1RIWVBIT09OX0RWQlRfRFVPX0NBUkRCVVNdID0geworCQkubmFtZQkJPSAiVHlwaG9vbiBEVkItVCBEdW8gRGlnaXRhbC9BbmFsb2cgQ2FyZGJ1cyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAorCQkvKiAuZ3Bpb21hc2sgICAgICAgPSAweGUwMDAsICovCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkvKgkuZ3BpbyA9IDB4MDAwMCwgICAgICAqLworCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwJLyogQ29tcG9zaXRlIHNpZ25hbCBvbiBTLVZpZGVvIGlucHV0ICovCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQkvKgkuZ3BpbyA9IDB4NDAwMCwgICAgICAqLworCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwJLyogQ29tcG9zaXRlIGlucHV0ICovCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkvKgkuZ3BpbyA9IDB4NDAwMCwgICAgICAqLworCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCS8qIFMtVmlkZW8gc2lnbmFsIG9uIFMtVmlkZW8gaW5wdXQgKi8KKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCS8qCS5ncGlvID0gMHg0MDAwLCAgICAgICovCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJDb21wcm8gVmlkZW9NYXRlIFRWIEdvbGQrSUkiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfUEFMX05FV19UQVBDLAorCQkucmFkaW9fdHlwZSAgICAgPSBUVU5FUl9URUE1NzY3LAorCQkudHVuZXJfYWRkciAgICAgPSAweDYzLAorCQkucmFkaW9fYWRkciAgICAgPSAweDYwLAorCQkuZ3Bpb21hc2sgICAgICAgPSAweDhjMTg4MCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDgwMDgwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDgwMTAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQkJLmdwaW8gPSAweDgwMDAwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4ODgwMDAwLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHg4NDAwMDAsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9LV09STERfWFBFUlRdID0geworCQkvKgorCQlGSVhNRToKKwkJLSBSZW1vdGUgY29udHJvbCBkb2Vzbid0IGluaXRpYWxpemUgcHJvcGVybHkuCisJCS0gQXVkaW8gdm9sdW1lIHN0YXJ0cyBtdXRlZCwKKwkJdGhlbiBncmFkdWFsbHkgaW5jcmVhc2VzIGFmdGVyIGNoYW5uZWwgY2hhbmdlLgorCQktIE92ZXJsYXkgc2NhbGluZyBwcm9ibGVtcyAoYXBwbGljYXRpb24gZXJyb3I/KQorCQktIENvbXBvc2l0ZSBTLVZpZGVvIHVudGVzdGVkLgorCQlGcm9tOiBLb25yYWQgUnplcGVja2kgPGhhbm5pYmFsQG1lZ2Fwb2xpcy5wbD4KKwkJKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkt3b3JsZCBYcGVydCBUViBQVlI3MTM0IiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVOQV85NTMzX0RJLAorCQkucmFkaW9fdHlwZSAgICAgPSBUVU5FUl9URUE1NzY3LAorCQkudHVuZXJfYWRkcgk9IDB4NjEsCisJCS5yYWRpb19hZGRyCT0gMHg2MCwKKwkJLmdwaW9tYXNrCT0gMHgwNzAwLAorCQkuaW5wdXRzID0ge3sKKwkJCS5uYW1lICAgPSBuYW1lX3R2LAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gVFYsCisJCQkudHYgICAgID0gMSwKKwkJCS5ncGlvICAgPSAweDAwMCwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4MjAwLAkJLyogZ3BpbyBieSBEU2NhbGVyICovCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDAsCisJCQkuYW11eCAgID0gTElORTEsCisJCQkuZ3BpbyAgID0gMHgyMDAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJCS5ncGlvICAgPSAweDEwMCwKKwkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDAwLAorCQl9LAorCX0sCit9OworCiAKIGNvbnN0IHVuc2lnbmVkIGludCBzYWE3MTM0X2Jjb3VudCA9IEFSUkFZX1NJWkUoc2FhNzEzNF9ib2FyZHMpOwogCkBAIC0xNjYxLDEzICsyMDE2LDEzIEBACiAJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5zdWJkZXZpY2UgICAgPSAweDIwMDEsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1BST1RFVVNfUFJPLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuc3ViZGV2aWNlICAgID0gMHgyMDAxLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QUk9URVVTX1BSTywKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKIAkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKQEAgLTE2NzYsNzAgKzIwMzEsNzAgQEAKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDExMzEsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4NGU4NSwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKKwkJLnN1YmRldmljZSAgICA9IDB4NGU4NSwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfTU9OU1RFUlRWLAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNTNCLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDExNDIsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMCwKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgxMTQzLAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k2MDAsCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDE1M0IsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MTE1OCwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwX01LMywKLSAgICAgICAgfSx7CisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKKwkJLnN1YmRldmljZSAgICA9IDB4MTE0MiwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMCwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxNTNCLAorCQkuc3ViZGV2aWNlICAgID0gMHgxMTQzLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE1M0IsCisJCS5zdWJkZXZpY2UgICAgPSAweDExNTgsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k2MDBfTUszLAorCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDE1M2IsCiAJCS5zdWJkZXZpY2UgICAgPSAweDExNjIsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDBfQ0FSREJVUywKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKIAkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKIAkJLnN1YmRldmljZSAgICA9IDB4MDEzOCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4NGU0MiwJCQkJLy8iVHlwaG9vbiBQQ0kgQ2FwdHVyZSBUViBDYXJkIiBBcnQuTm8uIDUwNjczCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MDEzOCwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlWSURFTzMwMDAsCi0gICAgICAgIH0seworCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDRlNDIsCQkJCS8qICJUeXBob29uIFBDSSBDYXB0dXJlIFRWIENhcmQiIEFydC5Oby4gNTA2NzMgKi8KKwkJLnN1YmRldmljZSAgICA9IDB4MDEzOCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwLAorCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDUxNjgsCiAJCS5zdWJkZXZpY2UgICAgPSAweDAxMzgsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMjAwMCwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0JCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNSwKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAogCQkuc3ViZGV2aWNlICAgID0gMHgwMjEyLCAvKiBtaW5pcGNpLCBMUjIxMiAqLwogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlUVlBMQVRJTlVNX01JTkksCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDUxNjgsCS8qIEFuaW1hdGlvbiBUZWNobm9sb2dpZXMgKExpZmVWaWV3KSAqLwogCQkuc3ViZGV2aWNlICAgID0gMHgwMjE0LCAvKiBTdGFuZGFyZCBQQ0ksIExSMjE0V0YgKi8KIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4MTQ4OSwgLyogS1lFICovCiAJCS5zdWJkZXZpY2UgICAgPSAweDAyMTQsIC8qIEdlbml1cyBWaWRlb1dvbmRlciBQcm9UViAqLwogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlUVlBMQVRJTlVNX0ZNLCAvKiBpcyBhbiBMUjIxNFdGIGFjdHVhbGx5ICovCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDE2YmUsCkBAIC0xNzU4LDM2ICsyMTEzLDM2IEBACiAJCS5zdWJkZXZpY2UgICAgPSAweDIyNmIsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VMU0FfNTAwVFYsCiAJfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0ODQyLAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzQsCisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKwkJLnN1YmRldmljZSAgICA9IDB4NDg0MiwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKIAl9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNSwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4NDUsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzVfQk9BUkRfQVNVU1RlS19UVkZNNzEzNSwKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAorCQkuc3ViZGV2aWNlICAgID0gMHg0ODQ1LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM1LAogCX0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX0FTVVNURUssCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4NDgzMCwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0LAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4NDMsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RFS19UVkZNNzEzMywKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAorCQkuc3ViZGV2aWNlICAgID0gMHg0ODMwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0LAogCX0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX0FTVVNURUssCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4NDg0MCwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0LAotICAgICAgICB9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAorCQkuc3ViZGV2aWNlICAgID0gMHg0ODQzLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVEVLX1RWRk03MTMzLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX0FTVVNURUssCisJCS5zdWJkZXZpY2UgICAgPSAweDQ4NDAsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzQsCisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKIAkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKQEAgLTE4MDgsMTE4ICsyMTYzLDExOCBAQAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxMTMxLAorCQkuc3ViZGV2aWNlICAgID0gMHg3MTMzLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WQTEwMDBQT1dFUiwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDIwMDEsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5zdWJkZXZpY2UgICAgPSAweDIwMDEsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEXzEwTU9PTlNUVk1BU1RFUiwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxODViLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweGMxMDAsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE4NWIsCisJCS5zdWJkZXZpY2UgICAgPSAweGMxMDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UViwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxODViLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweGMxMDAsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE4NWIsCisJCS5zdWJkZXZpY2UgICAgPSAweGMxMDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVMsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfTUFUUk9YLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4ZDAsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX01BVFJPWCwKKwkJLnN1YmRldmljZSAgICA9IDB4NDhkMCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ1JPTk9TX1BMVVMsCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweGE3MGIsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweGE3MGIsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX01EMjgxOSwKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MjExNSwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KKwkJLnN1YmRldmljZSAgICA9IDB4MjExNSwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDUsCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDIxMDgsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweDIxMDgsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDUsCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDEwZmYsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweDEwZmYsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9EVkRfRVpNQUtFUiwKLSAgICAgICAgfSx7CisJfSx7CiAJCS8qIEFWZXJNZWRpYSBDYXJkQnVzICovCiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweGQ2ZWUsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweGQ2ZWUsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9DQVJEQlVTLAogCX0sewogCQkvKiBUcmFuc0dlYXIgMzAwMFRWICovCiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDA1MGMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweDA1MGMsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1RHMzAwMFRWLAogCX0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDExYmQsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MDAyYiwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWX1NURVJFTywKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTFiZCwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgwMDJkLAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFXzMwMElfRFZCVF9QQUwsCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDEwMTksCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4NGNiNCwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQLAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMDE5LAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDRjYjUsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1LAotICAgICAgICB9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMmFiLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDA4MDAsCi0gCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzM19CT0FSRF9VUE1PU1RfUFVSUExFX1RWLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDExYmQsCisJCS5zdWJkZXZpY2UgICAgPSAweDAwMmIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfU1RFUkVPLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDExYmQsCisJCS5zdWJkZXZpY2UgICAgPSAweDAwMmQsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFXzMwMElfRFZCVF9QQUwsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTAxOSwKKwkJLnN1YmRldmljZSAgICA9IDB4NGNiNCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUCwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxMDE5LAorCQkuc3ViZGV2aWNlICAgID0gMHg0Y2I1LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjUsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTJhYiwKKwkJLnN1YmRldmljZSAgICA9IDB4MDgwMCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVVBNT1NUX1BVUlBMRV9UViwKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAogCQkuc3VidmVuZG9yICAgID0gMHgxNTNCLAogCQkuc3ViZGV2aWNlICAgID0gMHgxMTUyLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZMjAwLAotIAl9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDE4NWIsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4YzEwMCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTg1YiwKKwkJLnN1YmRldmljZSAgICA9IDB4YzEwMCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUiwKLSAJfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMTMxLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAwLAorCQkuc3VidmVuZG9yICAgID0gMHgxMTMxLAorCQkuc3ViZGV2aWNlICAgID0gMCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfU0FCUkVOVF9TQlRUVkZNLAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLApAQCAtMTkzOSwxOCArMjI5NCwyNCBAQAogCQkuc3VidmVuZG9yICAgID0gMHgxODViLAogCQkuc3ViZGV2aWNlICAgID0gMHhjMjAwLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfR09MRF9QTFVTLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAogCQkuc3VidmVuZG9yICAgID0gMHgxNTQwLAogCQkuc3ViZGV2aWNlICAgID0gMHg5NTI0LAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QUk9WSURFT19QVjk1MiwKIAotIAl9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAotCQkuc3ViZGV2aWNlICAgID0gMHgwMzA2LAorCQkuc3ViZGV2aWNlICAgID0gMHgwNTAyLCAgICAgICAgICAgICAgICAvKiBDYXJkYnVzIHZlcnNpb24gKi8KKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAorCQkuc3ViZGV2aWNlICAgID0gMHgwMzA2LCAgICAgICAgICAgICAgICAvKiBQQ0kgdmVyc2lvbiAqLwogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlEVkJURFVPLAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLApAQCAtMTk1OSwzMSArMjMyMCw0NCBAQAogCQkuc3ViZGV2aWNlICAgID0gMHhmMzFmLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfR09fMDA3X0ZNLAogCi0gCX0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzUsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLnN1YmRldmljZSAgICA9IDB4MjAwNCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSCwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHgxNDIxLAogCQkuc3ViZGV2aWNlICAgID0gMHgwMzUwLAkJLyogUENJIHZlcnNpb24gKi8KIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQURTX0lOU1RBTlRfVFYsCiAKLSAJfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0JCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNSwKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHgxNDIxLAogCQkuc3ViZGV2aWNlICAgID0gMHgwMzcwLAkJLyogY2FyZGJ1cyB2ZXJzaW9uICovCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX1RWLAogCi0gCX0seworCX0seyAgICAgLyogVHlwaG9vbiBEVkItVCBEdW8gRGlnaXRhbC9BbmFsb2cgQ2FyZGJ1cyAqLworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDRlNDIsCisJCS5zdWJkZXZpY2UgICAgPSAweDA1MDIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1RIWVBIT09OX0RWQlRfRFVPX0NBUkRCVVMsCisKKwl9LHsKIAkJLyogLS0tIGJvYXJkcyB3aXRob3V0IGVlcHJvbSArIHN1YnN5c3RlbSBJRCAtLS0gKi8KLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5zdWJkZXZpY2UgICAgPSAwLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9OT0FVVE8sCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLnN1YmRldmljZSAgICA9IDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX05PQVVUTywKIAl9LHsKQEAgLTE5OTEsMjYgKzIzNjUsMjYgQEAKIAkJLyogLS0tIGRlZmF1bHQgY2F0Y2ggLS0tICovCiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9VTktOT1dOLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1VOS05PV04sCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVU5LTk9XTiwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNSwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9VTktOT1dOLAogCX0sewogCQkvKiAtLS0gZW5kIG9mIGxpc3QgLS0tICovCkBAIC0yMDIxLDQ2ICsyMzk1LDkgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBmbHl2aWRlbyB0d2Vha3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0jaWYgMAotc3RhdGljIHN0cnVjdCB7Ci0JY2hhciAgKm1vZGVsOwotCWludCAgIHR1bmVyX3R5cGU7Ci19IGZseV9saXN0WzB4MjBdID0gewotCS8qIGRlZmF1bHQgY2F0Y2ggLi4uICovCi0JWyAwIC4uLiAweDFmIF0gPSB7Ci0JCS5tb2RlbCAgICAgID0gIlVOS05PV04iLAotCQkudHVuZXJfdHlwZSA9IFRVTkVSX0FCU0VOVCwKLQl9LAotCS8qIC4uLiB0aGUgb25lcyBrbm93biBzbyBmYXIgKi8KLQlbIDB4MDUgXSA9IHsKLQkJLm1vZGVsICAgICAgPSAiUEFMLUJHIiwKLQkJLnR1bmVyX3R5cGUgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCi0JfSwKLQlbIDB4MTAgXSA9IHsKLQkJLm1vZGVsICAgICAgPSAiUEFMLUJHIC8gUEFMLURLIiwKLQkJLnR1bmVyX3R5cGUgPSBUVU5FUl9QSElMSVBTX1BBTCwKLQl9LAotCVsgMHgxNSBdID0gewotCQkubW9kZWwgICAgICA9ICJOVFNDIiwKLQkJLnR1bmVyX3R5cGUgPSBUVU5FUl9BQlNFTlQgLyogRklYTUUgKi8sCi0JfSwKLX07Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQgYm9hcmRfZmx5dmlkZW8oc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7Ci0jaWYgMAotCS8qIG5vbi13b3JraW5nIGF0dGVtcHQgdG8gZGV0ZWN0IHRoZSBjb3JyZWN0IHR1bmVyIHR5cGUgLi4uICovCi0JdTMyIHZhbHVlOwotCWludCBpbmRleDsKLQotCXZhbHVlID0gZGV2LT5ncGlvX3ZhbHVlOwotCWluZGV4ID0gKHZhbHVlICYgMHgxZjAwKSA+PiA4OwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBmbHl2aWRlbzogZ3BpbyBpcyAweCV4IFttb2RlbD0lcyx0dW5lcj0lZF1cbiIsCi0JICAgICAgIGRldi0+bmFtZSwgdmFsdWUsIGZseV9saXN0W2luZGV4XS5tb2RlbCwKLQkgICAgICAgZmx5X2xpc3RbaW5kZXhdLnR1bmVyX3R5cGUpOwotCWRldi0+dHVuZXJfdHlwZSA9IGZseV9saXN0W2luZGV4XS50dW5lcl90eXBlOwotI2VuZGlmCiAJcHJpbnRrKCIlczogdGhlcmUgYXJlIGRpZmZlcmVudCBmbHl2aWRlbyBjYXJkcyB3aXRoIGRpZmZlcmVudCB0dW5lcnNcbiIKIAkgICAgICAgIiVzOiBvdXQgdGhlcmUsIHlvdSBtaWdodCBoYXZlIHRvIHVzZSB0aGUgdHVuZXI9PG5yPiBpbnNtb2RcbiIKIAkgICAgICAgIiVzOiBvcHRpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWUuXG4iLApAQCAtMjA3MSw3ICsyNDA4LDcgQEAKIAogaW50IHNhYTcxMzRfYm9hcmRfaW5pdDEoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7Ci0JLy8gQWx3YXlzIHByaW50IGdwaW8sIG9mdGVuIG1hbnVmYWN0dXJlcnMgZW5jb2RlIHR1bmVyIHR5cGUgYW5kIG90aGVyIGluZm8uCisJLyogQWx3YXlzIHByaW50IGdwaW8sIG9mdGVuIG1hbnVmYWN0dXJlcnMgZW5jb2RlIHR1bmVyIHR5cGUgYW5kIG90aGVyIGluZm8uICovCiAJc2FhX3dyaXRlbChTQUE3MTM0X0dQSU9fR1BNT0RFMCA+PiAyLCAwKTsKIAlkZXYtPmdwaW9fdmFsdWUgPSBzYWFfcmVhZGwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyKTsKIAlwcmludGsoS0VSTl9JTkZPICIlczogYm9hcmQgaW5pdDogZ3BpbyBpcyAleFxuIiwgZGV2LT5uYW1lLCBkZXYtPmdwaW9fdmFsdWUpOwpAQCAtMjA4Miw3ICsyNDE5LDcgQEAKIAkJZGV2LT5oYXNfcmVtb3RlID0gMTsKIAkJYm9hcmRfZmx5dmlkZW8oZGV2KTsKIAkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU0FBNzEzNF9CT0FSRF9GTFlUVlBMQVRJTlVNX0ZNOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlUVlBMQVRJTlVNX0ZNOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNDAwOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwX01LMzoKQEAgLTIwOTAsMjMgKzI0MjcsMjUgQEAKIAljYXNlIFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9NRDI4MTk6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9WU1RSRUFNX1hQRVJUOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfWFBFUlQ6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA1OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA1OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwNzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTToKLS8vCWNhc2UgU0FBNzEzNF9CT0FSRF9TQUJSRU5UX1NCVFRWRk06ICAvKiBub3QgZmluaXNoZWQgeWV0ICovCisvKiAgICAgIGNhc2UgU0FBNzEzNF9CT0FSRF9TQUJSRU5UX1NCVFRWRk06ICAqLyAvKiBub3QgZmluaXNoZWQgeWV0ICovCiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlI6Ci0gCWNhc2UgU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDE6Ci0gCWNhc2UgU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDI6CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSToKKwljYXNlIFNBQTcxMzRfQk9BUkRfTUFOTElfTVRWMDAxOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDI6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWQUNTU01BUlRUVjoKIAkJZGV2LT5oYXNfcmVtb3RlID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX01ENTA0NDoKIAkJcHJpbnRrKCIlczogc2VlbXMgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIE1ENTA0NFxuIgotCQkgICAgICAgIiVzOiAod2l0aCB0aGUgc2FtZSBJRCkgb3V0IHRoZXJlLiAgSWYgc291bmQgZG9lc24ndCB3b3JrIGZvclxuIgotCQkgICAgICAgIiVzOiB5b3UgdHJ5IHRoZSBhdWRpb19jbG9ja19vdmVycmlkZT0weDIwMDAwMCBpbnNtb2Qgb3B0aW9uLlxuIiwKLQkJICAgICAgIGRldi0+bmFtZSxkZXYtPm5hbWUsZGV2LT5uYW1lKTsKKwkJIiVzOiAod2l0aCB0aGUgc2FtZSBJRCkgb3V0IHRoZXJlLiAgSWYgc291bmQgZG9lc24ndCB3b3JrIGZvclxuIgorCQkiJXM6IHlvdSB0cnkgdGhlIGF1ZGlvX2Nsb2NrX292ZXJyaWRlPTB4MjAwMDAwIGluc21vZCBvcHRpb24uXG4iLAorCQlkZXYtPm5hbWUsZGV2LT5uYW1lLGRldi0+bmFtZSk7CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNDAwX0NBUkRCVVM6CiAJCS8qIHBvd2VyLXVwIHR1bmVyIGNoaXAgKi8KQEAgLTIxMTQsMTEgKzI0NTMsMTkgQEAKIAkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIDB4MDAwNDAwMDAsIDB4MDAwMDAwMDApOwogCQltc2xlZXAoMSk7CiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJURFVPOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9USFlQSE9PTl9EVkJUX0RVT19DQVJEQlVTOgorCS8qIHR1cm4gdGhlIGZhbiBvbiBIYWM6IHN0YXRpYyBmb3IgdGhlIHRpbWUgYmVpbmcgKi8KKwkJc2FhX3dyaXRlYihTQUE3MTM0X0dQSU9fR1BNT0RFMywgMHgwOCk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9HUElPX0dQU1RBVFVTMywgMHgwNik7CisJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVUzoKKwkJLyogcG93ZXItdXAgdHVuZXIgY2hpcCAqLworCQlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CisJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKwkJbXNsZWVwKDEpOworCQlicmVhazsKIAl9Ci0JaWYgKGRldi0+aGFzX3JlbW90ZSkKLQkJZGV2LT5pcnEyX21hc2sgfD0gKFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOCAgfAotCQkJCSAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOEEgfAotCQkJCSAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xNiAgKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjEzOSwxMCArMjQ4Niw4NSBAQAogCQkJYnJlYWs7CiAJCWRldi0+Ym9hcmQgPSBib2FyZDsKIAkJcHJpbnRrKCIlczogYm9hcmQgdHlwZSBmaXh1cDogJXNcbiIsIGRldi0+bmFtZSwKLQkJICAgICAgIHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUpOworCQlzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKIAkJZGV2LT50dW5lcl90eXBlID0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0udHVuZXJfdHlwZTsKLQkJaWYgKFRVTkVSX0FCU0VOVCAhPSBkZXYtPnR1bmVyX3R5cGUpCi0JCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFRVTkVSX1NFVF9UWVBFLCZkZXYtPnR1bmVyX3R5cGUpOworCisJCWlmIChUVU5FUl9BQlNFTlQgIT0gZGV2LT50dW5lcl90eXBlKSB7CisJCQkJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKKworCQkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX1JBRElPIHwgVF9BTkFMT0dfVFYgfCBUX0RJR0lUQUxfVFY7CisJCQkJdHVuX3NldHVwLnR5cGUgPSBkZXYtPnR1bmVyX3R5cGU7CisJCQkJdHVuX3NldHVwLmFkZHIgPSBBRERSX1VOU0VUOworCisJCQkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzIChkZXYsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQl9CisJCWJyZWFrOworY2FzZSBTQUE3MTM0X0JPQVJEX01ENzEzNDoKKwkJeworCQlzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOworCQl1OCBzdWJhZGRyOworCQl1OCBkYXRhWzNdOworCQlpbnQgcmV0LCB0dW5lcl90OworCisJCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0ge3suYWRkcj0weDUwLCAuZmxhZ3M9MCwgLmJ1Zj0mc3ViYWRkciwgLmxlbiA9IDF9LAorCQkJCQl7LmFkZHI9MHg1MCwgLmZsYWdzPUkyQ19NX1JELCAuYnVmPWRhdGEsIC5sZW4gPSAzfX07CisJCXN1YmFkZHI9IDB4MTQ7CisJCXR1bmVyX3QgPSAwOworCQlyZXQgPSBpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsIG1zZywgMik7CisJCWlmIChyZXQgIT0gMikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFRVBST00gcmVhZCBmYWlsdXJlXG4iKTsKKwkJfSBlbHNlIGlmICgoZGF0YVswXSAhPSAwKSAmJiAoZGF0YVswXSAhPSAweGZmKSkgeworCQkJLyogb2xkIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKwkJCXN1YmFkZHIgPSBkYXRhWzBdICsgMjsKKwkJCW1zZ1sxXS5sZW4gPSAyOworCQkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCBtc2csIDIpOworCQkJdHVuZXJfdCA9IChkYXRhWzBdIDw8IDgpICsgZGF0YVsxXTsKKwkJCXN3aXRjaCAodHVuZXJfdCl7CisJCQljYXNlIDB4MDEwMzoKKwkJCQlkZXYtPnR1bmVyX3R5cGUgPSBUVU5FUl9QSElMSVBTX1BBTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMTBDOgorCQkJCWRldi0+dHVuZXJfdHlwZSA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzIENhbnQgZGV0ZXJtaW5lIHR1bmVyIHR5cGUgJXggZnJvbSBFRVBST01cbiIsIGRldi0+bmFtZSwgdHVuZXJfdCk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGRhdGFbMV0gIT0gMCkgJiYgKGRhdGFbMV0gIT0gMHhmZikpIHsKKwkJCS8qIG5ldyBjb25maWcgc3RydWN0dXJlICovCisJCQlzdWJhZGRyID0gZGF0YVsxXSArIDE7CisJCQltc2dbMV0ubGVuID0gMTsKKwkJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgbXNnLCAyKTsKKwkJCXN1YmFkZHIgPSBkYXRhWzBdICsgMTsKKwkJCW1zZ1sxXS5sZW4gPSAyOworCQkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCBtc2csIDIpOworCQkJdHVuZXJfdCA9IChkYXRhWzFdIDw8IDgpICsgZGF0YVswXTsKKwkJCXN3aXRjaCAodHVuZXJfdCkgeworCQkJY2FzZSAweDAwMDU6CisJCQkJZGV2LT50dW5lcl90eXBlID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzM7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDAxZDoKKwkJCQlkZXYtPnR1bmVyX3R5cGUgPSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzM7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzIEJvYXJkIGhhcyBEVkItVFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBDYW50IGRldGVybWluZSB0dW5lciB0eXBlICV4IGZyb20gRUVQUk9NXG4iLCBkZXYtPm5hbWUsIHR1bmVyX3QpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlcyB1bmV4cGVjdGVkIGNvbmZpZyBzdHJ1Y3R1cmVcbiIsIGRldi0+bmFtZSk7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlcyBUdW5lciB0eXBlIGlzICVkXG4iLCBkZXYtPm5hbWUsIGRldi0+dHVuZXJfdHlwZSk7CisJCWlmIChkZXYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszKSB7CisJCQlkZXYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUFJFU0VOVCB8IFREQTk4ODdfUE9SVDFfQUNUSVZFIHwgVERBOTg4N19QT1JUMl9BQ1RJVkU7CisJCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFREQTk4ODdfU0VUX0NPTkZJRywgJmRldi0+dGRhOTg4N19jb25mKTsKKwkJfQorCisJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX1JBRElPIHwgVF9BTkFMT0dfVFYgfCBUX0RJR0lUQUxfVFY7CisJCXR1bl9zZXR1cC50eXBlID0gZGV2LT50dW5lcl90eXBlOworCQl0dW5fc2V0dXAuYWRkciA9IEFERFJfVU5TRVQ7CisKKwkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzIChkZXYsIFRVTkVSX1NFVF9UWVBFX0FERFIsJnR1bl9zZXR1cCk7CisJCX0KIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCmluZGV4IGY2MWVkMTguLjFkYmU2MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzYWE3MTM0LWNvcmUuYyx2IDEuMzAgMjAwNS8wNS8yMiAxOToyMzozOSBuc2ggRXhwICQKKyAqICRJZDogc2FhNzEzNC1jb3JlLmMsdiAxLjM5IDIwMDUvMDcvMDUgMTc6Mzc6MzUgbnNoIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiBkcml2ZXIgY29yZQpAQCAtMTgzLDQ2ICsxODMsNiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIDAKLXN0YXRpYyBjaGFyICpkZWMxX2JpdHNbOF0gPSB7Ci0JIkRDU1REMCIsICJEQ1NDVDEiLCAiV0lQQSIsICJHTElNQiIsCi0JIkdMSU1UIiwgIlNMVENBIiwgIkhMQ0siCi19Owotc3RhdGljIGNoYXIgKmRlYzJfYml0c1s4XSA9IHsKLQkiUkRDQVAiLCAiQ09QUk8iLCAiQ09MU1RSIiwgIlRZUEUzIiwKLQlOVUxMLCAiRklEVCIsICJITFZMTiIsICJJTlRMIgotfTsKLXN0YXRpYyBjaGFyICpzY2FsZTFfYml0c1s4XSA9IHsKLQkiVklEX0EiLCAiVkJJX0EiLCBOVUxMLCBOVUxMLCAiVklEX0IiLCAiVkJJX0IiCi19Owotc3RhdGljIGNoYXIgKnNjYWxlMl9iaXRzWzhdID0gewotCSJUUkVSUiIsICJDRkVSUiIsICJMREVSUiIsICJXQVNSU1QiLAotCSJGSURTQ0kiLCAiRklEU0NPIiwgIkQ2XkQ1IiwgIlRBU0siCi19OwotCi1zdGF0aWMgdm9pZCBkdW1wX3N0YXR1c3JlZyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHJlZywKLQkJCSAgIGNoYXIgKnJlZ25hbWUsIGNoYXIgKipiaXRzKQotewotCWludCB2YWx1ZSxpOwotCi0JdmFsdWUgPSBzYWFfcmVhZGIocmVnKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiIsIGRldi0+bmFtZSwgcmVnbmFtZSk7Ci0JZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKE5VTEwgPT0gYml0c1tpXSkKLQkJCWNvbnRpbnVlOwotCQlwcmludGsoIiAlcz0lZCIsIGJpdHNbaV0sICh2YWx1ZSAmICgxIDw8IGkpKSA/IDEgOiAwKTsKLQl9Ci0JcHJpbnRrKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBkdW1wX3N0YXR1c3JlZ3Moc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCi17Ci0JZHVtcF9zdGF0dXNyZWcoZGV2LFNBQTcxMzRfU1RBVFVTX1ZJREVPMSwiZGVjMSIsZGVjMV9iaXRzKTsKLQlkdW1wX3N0YXR1c3JlZyhkZXYsU0FBNzEzNF9TVEFUVVNfVklERU8yLCJkZWMyIixkZWMyX2JpdHMpOwotCWR1bXBfc3RhdHVzcmVnKGRldixTQUE3MTM0X1NDQUxFUl9TVEFUVVMwLCJzY2FsZTAiLHNjYWxlMV9iaXRzKTsKLQlkdW1wX3N0YXR1c3JlZyhkZXYsU0FBNzEzNF9TQ0FMRVJfU1RBVFVTMSwic2NhbGUxIixzY2FsZTJfYml0cyk7Ci19Ci0jZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGRlbGF5ZWQgcmVxdWVzdF9tb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02MTYsMTAgKzU3Niw2IEBACiAJCWlmIChpcnFfZGVidWcpCiAJCQlwcmludF9pcnFzdGF0dXMoZGV2LGxvb3AscmVwb3J0LHN0YXR1cyk7CiAKLSNpZiAwCi0JCWlmIChyZXBvcnQgJiBTQUE3MTM0X0lSUV9SRVBPUlRfQ09ORl9FUlIpCi0JCQlkdW1wX3N0YXR1c3JlZ3MoZGV2KTsKLSNlbmRpZgogCiAJCWlmIChyZXBvcnQgJiBTQUE3MTM0X0lSUV9SRVBPUlRfUkRDQVAgLyogX0lOVEwgKi8pCiAJCQlzYWE3MTM0X2lycV92aWRlb19pbnRsKGRldik7CkBAIC03MTEsNyArNjY3LDYgQEAKIAkJICAgU0FBNzEzNF9NQUlOX0NUUkxfRVZGRTEgfAogCQkgICBTQUE3MTM0X01BSU5fQ1RSTF9FVkZFMiB8CiAJCSAgIFNBQTcxMzRfTUFJTl9DVFJMX0VTRkUgIHwKLQkJICAgU0FBNzEzNF9NQUlOX0NUUkxfRUJBREMgfAogCQkgICBTQUE3MTM0X01BSU5fQ1RSTF9FQkRBQyk7CiAKIAkvKiBlbmFibGUgcGVyaXBoZXJhbCBkZXZpY2VzICovCkBAIC03MjYsMTQgKzY4MSwyOCBAQAogLyogbGF0ZSBpbml0ICh3aXRoIGkyYyArIGlycSkgKi8KIHN0YXRpYyBpbnQgc2FhNzEzNF9od2luaXQyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogeworCXVuc2lnbmVkIGludCBpcnEyX21hc2s7CiAJZHByaW50aygiaHdpbml0MlxuIik7CiAKIAlzYWE3MTM0X3ZpZGVvX2luaXQyKGRldik7CiAJc2FhNzEzNF90dmF1ZGlvX2luaXQyKGRldik7CiAKIAkvKiBlbmFibGUgSVJRJ3MgKi8KKyAgIAlpcnEyX21hc2sgPQorCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMzICAgIHwKKwkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMiAgICB8CisJCVNBQTcxMzRfSVJRMl9JTlRFX0RFQzEgICAgfAorCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMwICAgIHwKKwkJU0FBNzEzNF9JUlEyX0lOVEVfUEUgICAgICB8CisJCVNBQTcxMzRfSVJRMl9JTlRFX0FSOworCisJaWYgKGRldi0+aGFzX3JlbW90ZSkKKwkJaXJxMl9tYXNrIHw9IChTQUE3MTM0X0lSUTJfSU5URV9HUElPMTggIHwKKwkJCSAgICAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOEEgfAorCQkJICAgICAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE2ICApOworCiAJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTEsIDApOwotCXNhYV93cml0ZWwoU0FBNzEzNF9JUlEyLCBkZXYtPmlycTJfbWFzayk7CisJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTIsIGlycTJfbWFzayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk1NCwxMyArOTIzLDYgQEAKIAl9CiAKIAkvKiBpbml0aWFsaXplIGhhcmR3YXJlICMxICovCi0gICAJZGV2LT5pcnEyX21hc2sgPQotCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMzICAgIHwKLQkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMiAgICB8Ci0JCVNBQTcxMzRfSVJRMl9JTlRFX0RFQzEgICAgfAotCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMwICAgIHwKLQkJU0FBNzEzNF9JUlEyX0lOVEVfUEUgICAgICB8Ci0JCVNBQTcxMzRfSVJRMl9JTlRFX0FSOwogCXNhYTcxMzRfYm9hcmRfaW5pdDEoZGV2KTsKIAlzYWE3MTM0X2h3aW5pdDEoZGV2KTsKIApAQCAtOTkwLDYgKzk1Miw3IEBACiAJCXJlcXVlc3RfbW9kdWxlKCJzYWE2NzUyaHMiKTsKIAkJcmVxdWVzdF9tb2R1bGVfZGVwZW5kKCJzYWE3MTM0LWVtcHJlc3MiLCZuZWVkX2VtcHJlc3MpOwogCX0KKwogICAJaWYgKGNhcmRfaXNfZHZiKGRldikpCiAJCXJlcXVlc3RfbW9kdWxlX2RlcGVuZCgic2FhNzEzNC1kdmIiLCZuZWVkX2R2Yik7CiAKQEAgLTExNDQsOSArMTEwNyw2IEBACiAJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LDApLAogCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LDApKTsKIAotI2lmIDAgIC8qIGNhdXNlcyBzb21lIHRyb3VibGUgd2hlbiByZWluc2VydGluZyB0aGUgZHJpdmVyIC4uLiAqLwotCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLSNlbmRpZgogCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKIAogCS8qIGZyZWUgbWVtb3J5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IGFhOGUyY2YuLjMzNGJjMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC0xLDggKzEsMTEgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtZHZiLmMsdiAxLjEzIDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAorICogJElkOiBzYWE3MTM0LWR2Yi5jLHYgMS4xOCAyMDA1LzA3LzA0IDE2OjA1OjUwIG1rcnVma3kgRXhwICQKICAqCiAgKiAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCiAgKgorICogIEV4dGVuZGVkIDMgLyAyMDA1IGJ5IEhhcnRtdXQgSGFja21hbm4gdG8gc3VwcG9ydCB2YXJpb3VzCisgKiAgY2FyZHMgd2l0aCB0aGUgdGRhMTAwNDYgRFZCLVQgY2hhbm5lbCBkZWNvZGVyCisgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMjcsMjMgKzMwLDMxIEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KIAorI2RlZmluZSBDT05GSUdfRFZCX01UMzUyIDEKKyNkZWZpbmUgQ09ORklHX0RWQl9UREExMDA0WCAxCisKICNpbmNsdWRlICJzYWE3MTM0LXJlZy5oIgogI2luY2x1ZGUgInNhYTcxMzQuaCIKIAotI2luY2x1ZGUgImR2Yi1wbGwuaCIKLSNpbmNsdWRlICJtdDM1Mi5oIgotI2luY2x1ZGUgIm10MzUyX3ByaXYuaCIgLyogRklYTUUgKi8KLSNpbmNsdWRlICJ0ZGExMDA0eC5oIgorI2lmIENPTkZJR19EVkJfTVQzNTIKKyMgaW5jbHVkZSAibXQzNTIuaCIKKyMgaW5jbHVkZSAibXQzNTJfcHJpdi5oIiAvKiBGSVhNRSAqLworI2VuZGlmCisjaWYgQ09ORklHX0RWQl9UREExMDA0WAorIyBpbmNsdWRlICJ0ZGExMDA0eC5oIgorI2VuZGlmCiAKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBhbnRlbm5hX3B3ciA9IDA7CisKIG1vZHVsZV9wYXJhbShhbnRlbm5hX3B3ciwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYW50ZW5uYV9wd3IsImVuYWJsZSBhbnRlbm5hIHBvd2VyIChQaW5uYWNsZSAzMDBpKSIpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorI2lmIENPTkZJR19EVkJfTVQzNTIKIHN0YXRpYyBpbnQgcGlubmFjbGVfYW50ZW5uYV9wd3Ioc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBvbikKIHsKIAl1MzIgb2s7CkBAIC0xMzgsNTEgKzE0OSwzOTAgQEAKIAkuZGVtb2RfaW5pdCAgICA9IG10MzUyX3Bpbm5hY2xlX2luaXQsCiAJLnBsbF9zZXQgICAgICAgPSBtdDM1Ml9waW5uYWNsZV9wbGxfc2V0LAogfTsKKyNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBtZWRpb25fY2FyZGJ1c19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQotewotCS8qIGFueXRoaW5nIHRvIGRvIGhlcmUgPz8/ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWVkaW9uX2NhcmRidXNfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorI2lmIENPTkZJR19EVkJfVERBMTAwNFgKK3N0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcGxsX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwotCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSBmOworCXN0YXRpYyB1OCB0dTEyMTZfaW5pdFtdID0geyAweDBiLCAweGY1LCAweDg1LCAweGFiIH07CisJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSB0dTEyMTZfaW5pdCwubGVuID0gc2l6ZW9mKHR1MTIxNl9pbml0KSB9OwogCi0JLyoKLQkgKiB0aGlzIGluc3RydWN0cyB0dW5lci5vIHRvIHNldCB0aGUgZnJlcXVlbmN5LCB0aGUgY2FsbCB3aWxsCi0JICogZW5kIHVwIGluIHR1bmVyX2NvbW1hbmQoKSwgVklESU9DX1NfRlJFUVVFTkNZIHN3aXRjaC4KLQkgKiB0ZGE5ODg3Lm8gd2lsbCBzZWUgdGhhdCBhcyB3ZWxsLgotCSAqLwotCWYudHVuZXIgICAgID0gMDsKLQlmLnR5cGUgICAgICA9IFY0TDJfVFVORVJfRElHSVRBTF9UVjsKLQlmLmZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTAwMCAqIDE2IC8gMTAwMDsKLQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFZJRElPQ19TX0ZSRVFVRU5DWSwmZik7CisJLyogc2V0dXAgUExMIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKwltc2xlZXAoMSk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmZV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQorc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJdTggdHVuZXJfYnVmWzRdOworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLC5sZW4gPQorCQkJc2l6ZW9mKHR1bmVyX2J1ZikgfTsKKwlpbnQgdHVuZXJfZnJlcXVlbmN5ID0gMDsKKwl1OCBiYW5kLCBjcCwgZmlsdGVyOworCisJLyogZGV0ZXJtaW5lIGNoYXJnZSBwdW1wICovCisJdHVuZXJfZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3kgKyAzNjE2NjAwMDsKKwlpZiAodHVuZXJfZnJlcXVlbmN5IDwgODcwMDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDEzMDAwMDAwMCkKKwkJY3AgPSAzOworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDE2MDAwMDAwMCkKKwkJY3AgPSA1OworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDIwMDAwMDAwMCkKKwkJY3AgPSA2OworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDI5MDAwMDAwMCkKKwkJY3AgPSAzOworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDQyMDAwMDAwMCkKKwkJY3AgPSA1OworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDQ4MDAwMDAwMCkKKwkJY3AgPSA2OworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDYyMDAwMDAwMCkKKwkJY3AgPSAzOworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDgzMDAwMDAwMCkKKwkJY3AgPSA1OworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDg5NTAwMDAwMCkKKwkJY3AgPSA3OworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBkZXRlcm1pbmUgYmFuZCAqLworCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ5MDAwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE2MTAwMDAwMCkKKwkJYmFuZCA9IDE7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0NDQwMDAwMDApCisJCWJhbmQgPSAyOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgODYxMDAwMDAwKQorCQliYW5kID0gNDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc2V0dXAgUExMIGZpbHRlciAqLworCXN3aXRjaCAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCWZpbHRlciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCWZpbHRlciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBCQU5EV0lEVEhfOF9NSFo6CisJCWZpbHRlciA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2FsY3VsYXRlIGRpdmlzb3IKKwkgKiAoKDM2MTY2MDAwKygoMTAwMDAwMC82KS8yKSkgKyBGaW5wdXQpLygxMDAwMDAwLzYpCisJICovCisJdHVuZXJfZnJlcXVlbmN5ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgLyAxMDAwKSAqIDYpICsgMjE3NDk2KSAvIDEwMDA7CisKKwkvKiBzZXR1cCB0dW5lciBidWZmZXIgKi8KKwl0dW5lcl9idWZbMF0gPSAodHVuZXJfZnJlcXVlbmN5ID4+IDgpICYgMHg3ZjsKKwl0dW5lcl9idWZbMV0gPSB0dW5lcl9mcmVxdWVuY3kgJiAweGZmOworCXR1bmVyX2J1ZlsyXSA9IDB4Y2E7CisJdHVuZXJfYnVmWzNdID0gKGNwIDw8IDUpIHwgKGZpbHRlciA8PCAzKSB8IGJhbmQ7CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCW1zbGVlcCgxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJcmV0dXJuIHJlcXVlc3RfZmlybXdhcmUoZncsIG5hbWUsICZkZXYtPnBjaS0+ZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgbWVkaW9uX2NhcmRidXMgPSB7Ci0JLmRlbW9kX2FkZHJlc3MgPSAweDA4LCAgLyogbm90IHN1cmUgdGhpcyBpcyBjb3JyZWN0ICovCi0JLmludmVydCAgICAgICAgPSAwLAotICAgICAgICAuaW52ZXJ0X29jbGsgICA9IDAsCi0gICAgICAgIC5wbGxfaW5pdCAgICAgID0gbWVkaW9uX2NhcmRidXNfaW5pdCwKLSAgICAgICAgLnBsbF9zZXQgICAgICAgPSBtZWRpb25fY2FyZGJ1c19wbGxfc2V0LAotICAgICAgICAucmVxdWVzdF9maXJtd2FyZSA9IGZlX3JlcXVlc3RfZmlybXdhcmUsCitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBwaGlsaXBzX3R1MTIxNl9jb25maWcgPSB7CisKKwkuZGVtb2RfYWRkcmVzcyA9IDB4OCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAxLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF80TSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAorCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8zNjE3LAorCS5wbGxfaW5pdCAgICAgID0gcGhpbGlwc190dTEyMTZfcGxsX2luaXQsCisJLnBsbF9zZXQgICAgICAgPSBwaGlsaXBzX3R1MTIxNl9wbGxfc2V0LAorCS5wbGxfc2xlZXAgICAgID0gTlVMTCwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdHUxMjE2X3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorCitzdGF0aWMgaW50IHBoaWxpcHNfZm1kMTIxNl9wbGxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJLyogdGhpcyBtZXNzYWdlIGlzIHRvIHNldCB1cCBBVEMgYW5kIEFMQyAqLworCXN0YXRpYyB1OCBmbWQxMjE2X2luaXRbXSA9IHsgMHgwYiwgMHhkYywgMHg5YywgMHhhMCB9OworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gZm1kMTIxNl9pbml0LC5sZW4gPSBzaXplb2YoZm1kMTIxNl9pbml0KSB9OworCisJaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisJbXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBoaWxpcHNfZm1kMTIxNl9hbmFsb2coc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCS8qIHRoaXMgbWVzc2FnZSBhY3R1YWxseSB0dXJucyB0aGUgdHVuZXIgYmFjayB0byBhbmFsb2cgbW9kZSAqLworCXN0YXRpYyB1OCBmbWQxMjE2X2luaXRbXSA9IHsgMHgwYiwgMHhkYywgMHg5YywgMHg2MCB9OworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gZm1kMTIxNl9pbml0LC5sZW4gPSBzaXplb2YoZm1kMTIxNl9pbml0KSB9OworCisJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKTsKKwltc2xlZXAoMSk7CisJZm1kMTIxNl9pbml0WzJdID0gMHg4NjsKKwlmbWQxMjE2X2luaXRbM10gPSAweDU0OworCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSk7CisJbXNsZWVwKDEpOworfQorCitzdGF0aWMgaW50IHBoaWxpcHNfZm1kMTIxNl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJdTggdHVuZXJfYnVmWzRdOworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLC5sZW4gPQorCQkJc2l6ZW9mKHR1bmVyX2J1ZikgfTsKKwlpbnQgdHVuZXJfZnJlcXVlbmN5ID0gMDsKKwlpbnQgZGl2aWRlciA9IDA7CisJdTggYmFuZCwgbW9kZSwgY3A7CisKKwkvKiBkZXRlcm1pbmUgY2hhcmdlIHB1bXAgKi8KKwl0dW5lcl9mcmVxdWVuY3kgPSBwYXJhbXMtPmZyZXF1ZW5jeSArIDM2MTMwMDAwOworCWlmICh0dW5lcl9mcmVxdWVuY3kgPCA4NzAwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogbG93IGJhbmQgKi8KKwllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAxODAwMDAwMDApIHsKKwkJYmFuZCA9IDE7CisJCW1vZGUgPSA3OworCQljcCAgID0gMDsKKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDE5NTAwMDAwMCkgeworCQliYW5kID0gMTsKKwkJbW9kZSA9IDY7CisJCWNwICAgPSAxOworCS8qIG1pZCBiYW5kCSovCisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAzNjYwMDAwMDApIHsKKwkJaWYgKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopIHsKKwkJCWJhbmQgPSAxMDsKKwkJfSBlbHNlIHsKKwkJCWJhbmQgPSAyOworCQl9CisJCW1vZGUgPSA3OworCQljcCAgID0gMDsKKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDQ3ODAwMDAwMCkgeworCQlpZiAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikgeworCQkJYmFuZCA9IDEwOworCQl9IGVsc2UgeworCQkJYmFuZCA9IDI7CisJCX0KKwkJbW9kZSA9IDY7CisJCWNwICAgPSAxOworCS8qIGhpZ2ggYmFuZCAqLworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgNjYyMDAwMDAwKSB7CisJCWlmIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKSB7CisJCQliYW5kID0gMTI7CisJCX0gZWxzZSB7CisJCQliYW5kID0gNDsKKwkJfQorCQltb2RlID0gNzsKKwkJY3AgICA9IDA7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA4NDAwMDAwMDApIHsKKwkJaWYgKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopIHsKKwkJCWJhbmQgPSAxMjsKKwkJfSBlbHNlIHsKKwkJCWJhbmQgPSA0OworCQl9CisJCW1vZGUgPSA2OworCQljcCAgID0gMTsKKwl9IGVsc2UgeworCQlpZiAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikgeworCQkJYmFuZCA9IDEyOworCQl9IGVsc2UgeworCQkJYmFuZCA9IDQ7CisJCX0KKwkJbW9kZSA9IDc7CisJCWNwICAgPSAxOworCisJfQorCS8qIGNhbGN1bGF0ZSBkaXZpc29yICovCisJLyogKCgzNjE2NjAwMCArIEZpbnB1dCkgLyAxNjY2NjYpIHJvdW5kZWQhICovCisJZGl2aWRlciA9ICh0dW5lcl9mcmVxdWVuY3kgKyA4MzMzMykgLyAxNjY2Njc7CisKKwkvKiBzZXR1cCB0dW5lciBidWZmZXIgKi8KKwl0dW5lcl9idWZbMF0gPSAoZGl2aWRlciA+PiA4KSAmIDB4N2Y7CisJdHVuZXJfYnVmWzFdID0gZGl2aWRlciAmIDB4ZmY7CisJdHVuZXJfYnVmWzJdID0gMHg4MCB8IChjcCA8PCA2KSB8IChtb2RlICA8PCAzKSB8IDQ7CisJdHVuZXJfYnVmWzNdID0gMHg0MCB8IGJhbmQ7CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBtZWRpb25fY2FyZGJ1cyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCisJLmludmVydCAgICAgICAgPSAxLAorCS5pbnZlcnRfb2NsayAgID0gMCwKKwkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAorCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX0lGT19BVVRPX05FRywKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMzYxMywKKwkucGxsX2luaXQgICAgICA9IHBoaWxpcHNfZm1kMTIxNl9wbGxfaW5pdCwKKwkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfZm1kMTIxNl9wbGxfc2V0LAorCS5wbGxfc2xlZXAJICAgPSBwaGlsaXBzX2ZtZDEyMTZfYW5hbG9nLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgdGRhODI3eF9kYXRhIHsKKwl1MzIgbG9tYXg7CisJdTggIHNwZDsKKwl1OCAgYnM7CisJdTggIGJwOworCXU4ICBjcDsKKwl1OCAgZ2MzOworCXU4IGRpdjFwNTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGRhODI3eF9kYXRhIHRkYTgyN3hfZHZidFtdID0geworCXsgLmxvbWF4ID0gIDYyMDAwMDAwLCAuc3BkID0gMywgLmJzID0gMiwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDMsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9ICA2NjAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDMsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAzLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSAgNzYwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAxLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMywgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gIDg0MDAwMDAwLCAuc3BkID0gMywgLmJzID0gMiwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDMsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9ICA5MzAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDIsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAgOTgwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAzLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMTA5MDAwMDAwLCAuc3BkID0gMywgLmJzID0gMywgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDEyMzAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDIsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSAxMzMwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAzLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gMTUxMDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMSwgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDE1NDAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDIsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAxODEwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAyLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMTg1MDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMiwgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDIxNzAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDMsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAyNDQwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAyLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gMjY1MDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMywgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9IDMwMjAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDEsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAzMjQwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAyLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMzcwMDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMiwgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDQ1NDAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDMsIC5icCA9IDMsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA0OTMwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAyLCAuYnAgPSAzLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gNTMwMDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMywgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9IDU1NDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDEsIC5icCA9IDMsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA2MDQwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAxLCAuYnAgPSA0LCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gNjk2MDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMiwgLmJwID0gNCwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDc0MDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDIsIC5icCA9IDQsIC5jcCA9IDEsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA4MjAwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAzLCAuYnAgPSA0LCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gODY1MDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMywgLmJwID0gNCwgLmNwID0gMSwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9ICAgICAgICAgMCwgLnNwZCA9IDAsIC5icyA9IDAsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0KK307CisKK3N0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJdTggdHVuZXJfYnVmWzE0XTsKKworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAubGVuID0gc2l6ZW9mKHR1bmVyX2J1ZikgfTsKKwlpbnQgaSwgdHVuZXJfZnJlcSwgaWZfZnJlcTsKKwl1MzIgTjsKKwlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgeworCWNhc2UgQkFORFdJRFRIXzZfTUhaOgorCQlpZl9mcmVxID0gNDAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCWlmX2ZyZXEgPSA0NTAwMDAwOworCQlicmVhazsKKwlkZWZhdWx0OgkJICAgLyogOCBNSHogb3IgQXV0byAqLworCQlpZl9mcmVxID0gNTAwMDAwMDsKKwkJYnJlYWs7CisJfQorCXR1bmVyX2ZyZXEgPSBwYXJhbXMtPmZyZXF1ZW5jeSArIGlmX2ZyZXE7CisKKwlpID0gMDsKKwl3aGlsZSAodGRhODI3eF9kdmJ0W2ldLmxvbWF4IDwgdHVuZXJfZnJlcSkgeworCQlpZih0ZGE4Mjd4X2R2YnRbaSArIDFdLmxvbWF4ID09IDApCisJCQlicmVhazsKKwkJaSsrOworCX0KKworCU4gPSAoKHR1bmVyX2ZyZXEgKyAxMjUwMDApIC8gMjUwMDAwKSA8PCAodGRhODI3eF9kdmJ0W2ldLnNwZCArIDIpOworCXR1bmVyX2J1ZlswXSA9IDA7CisJdHVuZXJfYnVmWzFdID0gKE4+PjgpIHwgMHg0MDsKKwl0dW5lcl9idWZbMl0gPSBOICYgMHhmZjsKKwl0dW5lcl9idWZbM10gPSAwOworCXR1bmVyX2J1Zls0XSA9IDB4NTI7CisJdHVuZXJfYnVmWzVdID0gKHRkYTgyN3hfZHZidFtpXS5zcGQgPDwgNikgKyAodGRhODI3eF9kdmJ0W2ldLmRpdjFwNSA8PCA1KSArCisJCQkJICAgKHRkYTgyN3hfZHZidFtpXS5icyA8PCAzKSArIHRkYTgyN3hfZHZidFtpXS5icDsKKwl0dW5lcl9idWZbNl0gPSAodGRhODI3eF9kdmJ0W2ldLmdjMyA8PCA0KSArIDB4OGY7CisJdHVuZXJfYnVmWzddID0gMHhiZjsKKwl0dW5lcl9idWZbOF0gPSAweDJhOworCXR1bmVyX2J1Zls5XSA9IDB4MDU7CisJdHVuZXJfYnVmWzEwXSA9IDB4ZmY7CisJdHVuZXJfYnVmWzExXSA9IDB4MDA7CisJdHVuZXJfYnVmWzEyXSA9IDB4MDA7CisJdHVuZXJfYnVmWzEzXSA9IDB4NDA7CisKKwl0dW5lcl9tc2cubGVuID0gMTQ7CisJaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisKKwltc2xlZXAoNTAwKTsKKwkvKiBjb3JyZWN0IENQIHZhbHVlICovCisJdHVuZXJfYnVmWzBdID0gMHgzMDsKKwl0dW5lcl9idWZbMV0gPSAweDUwICsgdGRhODI3eF9kdmJ0W2ldLmNwOworCXR1bmVyX21zZy5sZW4gPSAyOworCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGhpbGlwc190ZGE4Mjd4X3BsbF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJc3RhdGljIHU4IHRkYTgyN3hfc2xlZXBbXSA9IHsgMHgzMCwgMHhkMH07CisJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSB0ZGE4Mjd4X3NsZWVwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuID0gc2l6ZW9mKHRkYTgyN3hfc2xlZXApIH07CisJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgdGRhODI3eF9saWZldmlld19jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAorCS5pbnZlcnQgICAgICAgID0gMSwKKwkuaW52ZXJ0X29jbGsgICA9IDAsCisJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAorCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCisJLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX3RkYTgyN3hfcGxsX2luaXQsCisJLnBsbF9zZXQgICAgICAgPSBwaGlsaXBzX3RkYTgyN3hfcGxsX3NldCwKKwkucGxsX3NsZWVwCSAgID0gcGhpbGlwc190ZGE4Mjd4X3BsbF9zbGVlcCwKKwkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCit9OworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiBzdGF0aWMgaW50IGR2Yl9pbml0KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewogCS8qIGluaXQgc3RydWN0IHZpZGVvYnVmX2R2YiAqLwpAQCAtMTk3LDE4ICs1NDcsMzEgQEAKIAkJCSAgICBkZXYpOwogCiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisjaWYgQ09ORklHX0RWQl9NVDM1MgogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMOgogCQlwcmludGsoIiVzOiBwaW5uYWNsZSAzMDBpIGR2YiBzZXR1cFxuIixkZXYtPm5hbWUpOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmcGlubmFjbGVfMzAwaSwKIAkJCQkJCSAmZGV2LT5pMmNfYWRhcCk7CiAJCWJyZWFrOworI2VuZGlmCisjaWYgQ09ORklHX0RWQl9UREExMDA0WAogCWNhc2UgU0FBNzEzNF9CT0FSRF9NRDcxMzQ6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gdGRhMTAwNDZfYXR0YWNoKCZtZWRpb25fY2FyZGJ1cywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChOVUxMID09IGRldi0+ZHZiLmZyb250ZW5kKQotCQkJcHJpbnRrKCIlczogSG1tLCBsb29rcyBsaWtlIHRoaXMgaXMgdGhlIG9sZCBNRDcxMzQgIgotCQkJICAgICAgICJ2ZXJzaW9uIHdpdGhvdXQgRFZCLVQgc3VwcG9ydFxuIixkZXYtPm5hbWUpOwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSDoKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdHUxMjE2X2NvbmZpZywKKwkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJURFVPOgorCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmdGRhODI3eF9saWZldmlld19jb25maWcsCisJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfVEhZUEhPT05fRFZCVF9EVU9fQ0FSREJVUzoKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnRkYTgyN3hfbGlmZXZpZXdfY29uZmlnLAorCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJYnJlYWs7CisjZW5kaWYKIAlkZWZhdWx0OgogCQlwcmludGsoIiVzOiBIdWg/IHVua25vd24gRFZCIGNhcmQ/XG4iLGRldi0+bmFtZSk7CiAJCWJyZWFrOwpAQCAtMjI3LDggKzU5MCw2IEBACiB7CiAJc3RhdGljIGludCBvbiAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X1BPUlQyX0lOQUNUSVZFOwogCi0JcHJpbnRrKCIlczogJXNcbiIsZGV2LT5uYW1lLF9fRlVOQ1RJT05fXyk7Ci0KIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfMzAwSV9EVkJUX1BBTDoKIAkJLyogb3RoZXJ3aXNlIHdlIGRvbid0IGRldGVjdCB0aGUgdHVuZXIgb24gbmV4dCBpbnNtb2QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMKaW5kZXggYjZmMDAyZS4uOTNkZDYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzYWE3MTM0LWkyYy5jLHYgMS4xMSAyMDA1LzA2LzEyIDAxOjM2OjE0IG1jaGVoYWIgRXhwICQKKyAqICRJZDogc2FhNzEzNC1pMmMuYyx2IDEuMTkgMjAwNS8wNy8wNyAwMTo0OTozMCBta3J1Zmt5IEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiBpMmMgaW50ZXJmYWNlIHN1cHBvcnQKQEAgLTE5NywxMCArMTk3LDYgQEAKIAllbnVtIGkyY19zdGF0dXMgc3RhdHVzOwogCV9fdTMyIGR3b3JkOwogCi0jaWYgMAotCWkyY19zZXRfYXR0cihkZXYsYXR0cik7Ci0Jc2FhX3dyaXRlYihTQUE3MTM0X0kyQ19EQVRBLCBkYXRhKTsKLSNlbHNlCiAJLyogaGF2ZSB0byB3cml0ZSBib3RoIGF0dHIgKyBkYXRhIGluIG9uZSAzMmJpdCB3b3JkICovCiAJZHdvcmQgID0gc2FhX3JlYWRsKFNBQTcxMzRfSTJDX0FUVFJfU1RBVFVTID4+IDIpOwogCWR3b3JkICY9IDB4MGY7CkBAIC0yMTAsNyArMjA2LDYgQEAKIC8vCWR3b3JkIHw9IDB4NDAgPDwgMTY7ICAvKiA0MDAga0h6ICovCiAJZHdvcmQgfD0gMHhmMCA8PCAyNDsKIAlzYWFfd3JpdGVsKFNBQTcxMzRfSTJDX0FUVFJfU1RBVFVTID4+IDIsIGR3b3JkKTsKLSNlbmRpZgogCWQycHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpMmMgZGF0YSA9PiAweCV4XG4iLGRldi0+bmFtZSxkYXRhKTsKIAogCWlmICghaTJjX2lzX2J1c3lfd2FpdChkZXYpKQpAQCAtMzMxLDEyICszMjYsNDQgQEAKIAogc3RhdGljIGludCBhdHRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0gICAgICAgIHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gY2xpZW50LT5hZGFwdGVyLT5hbGdvX2RhdGE7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBjbGllbnQtPmFkYXB0ZXItPmFsZ29fZGF0YTsKIAlpbnQgdHVuZXIgPSBkZXYtPnR1bmVyX3R5cGU7CiAJaW50IGNvbmYgID0gZGV2LT50ZGE5ODg3X2NvbmY7CisJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKIAotCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVFVORVJfU0VUX1RZUEUsJnR1bmVyKTsKLQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFREQTk4ODdfU0VUX0NPTkZJRywmY29uZik7CisJZDFwcmludGsoICIlcyBpMmMgYXR0YWNoIFthZGRyPTB4JXgsY2xpZW50PSVzXVxuIiwKKwkJY2xpZW50LT5kcml2ZXItPm5hbWUsY2xpZW50LT5hZGRyLGkyY19jbGllbnRuYW1lKGNsaWVudCkpOworCisJaWYgKCFjbGllbnQtPmRyaXZlci0+Y29tbWFuZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ucmFkaW9fdHlwZSAhPSBVTlNFVCkgeworCisJCXR1bl9zZXR1cC50eXBlID0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ucmFkaW9fdHlwZTsKKwkJdHVuX3NldHVwLmFkZHIgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5yYWRpb19hZGRyOworCisJCWlmICgodHVuX3NldHVwLmFkZHIgPT0gQUREUl9VTlNFVCkgfHwgKHR1bl9zZXR1cC5hZGRyID09IGNsaWVudC0+YWRkcikpIHsKKwkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX1JBRElPOworCisJCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQl9CisgICAgICAgIH0KKworCWlmICh0dW5lciAhPSBVTlNFVCkgeworCisJICAgICAgICB0dW5fc2V0dXAudHlwZSA9IHR1bmVyOworCSAgICAgICAgdHVuX3NldHVwLmFkZHIgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50dW5lcl9hZGRyOworCisJCWlmICgodHVuX3NldHVwLmFkZHIgPT0gQUREUl9VTlNFVCl8fCh0dW5fc2V0dXAuYWRkciA9PSBjbGllbnQtPmFkZHIpKSB7CisKKwkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UVjsKKworCQkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQl9CisgICAgICAgIH0KKworCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCwgVERBOTg4N19TRVRfQ09ORklHLCAmY29uZik7CisKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCmluZGV4IGFiYTJiOWQuLjIxMzc0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtaW5wdXQuYyx2IDEuMTkgMjAwNS8wNi8wNyAxODowMjoyNiBuc2ggRXhwICQKKyAqICRJZDogc2FhNzEzNC1pbnB1dC5jLHYgMS4yMSAyMDA1LzA2LzIyIDIzOjM3OjM0IG5zaCBFeHAgJAogICoKICAqIGhhbmRsZSBzYWE3MTM0IElSIHJlbW90ZXMgdmlhIGxpbnV4IGtlcm5lbCBpbnB1dCBsYXllci4KICAqCkBAIC02OCwxMCArNjgsOCBAQAogCVsgICAgNiBdID0gS0VZX0FHQUlOLCAgICAgICAgLy8gUmVjYWwKIAlbICAgMTYgXSA9IEtFWV9LUEVOVEVSLCAgICAgIC8vIEVudGVyCiAKLSNpZiAxIC8qIEZJWE1FICovCiAJWyAgIDI2IF0gPSBLRVlfRjIyLCAgICAgICAgICAvLyBTdGVyZW8KIAlbICAgMjQgXSA9IEtFWV9FRElULCAgICAgICAgIC8vIEFWIFNvdXJjZQotI2VuZGlmCiB9OwogCiBzdGF0aWMgSVJfS0VZVEFCX1RZUEUgY2luZXJneV9jb2Rlc1tJUl9LRVlUQUJfU0laRV0gPSB7CkBAIC0xNzIsNDUgKzE3MCw0NSBAQAogfTsKIAogc3RhdGljIElSX0tFWVRBQl9UWVBFIGF2YWNzc21hcnRfY29kZXNbSVJfS0VZVEFCX1NJWkVdID0gewotICAgICAgICBbIDMwIF0gPSBLRVlfUE9XRVIsCQkvLyBwb3dlcgorCVsgMzAgXSA9IEtFWV9QT1dFUiwJCS8vIHBvd2VyCiAJWyAyOCBdID0gS0VZX1NFQVJDSCwJCS8vIHNjYW4KLSAgICAgICAgWyAgNyBdID0gS0VZX1NFTEVDVCwJCS8vIHNvdXJjZQorCVsgIDcgXSA9IEtFWV9TRUxFQ1QsCQkvLyBzb3VyY2UKIAogCVsgMjIgXSA9IEtFWV9WT0xVTUVVUCwKIAlbIDIwIF0gPSBLRVlfVk9MVU1FRE9XTiwKLSAgICAgICAgWyAzMSBdID0gS0VZX0NIQU5ORUxVUCwKKwlbIDMxIF0gPSBLRVlfQ0hBTk5FTFVQLAogCVsgMjMgXSA9IEtFWV9DSEFOTkVMRE9XTiwKIAlbIDI0IF0gPSBLRVlfTVVURSwKIAogCVsgIDIgXSA9IEtFWV9LUDAsCi0gICAgICAgIFsgIDEgXSA9IEtFWV9LUDEsCi0gICAgICAgIFsgMTEgXSA9IEtFWV9LUDIsCi0gICAgICAgIFsgMjcgXSA9IEtFWV9LUDMsCi0gICAgICAgIFsgIDUgXSA9IEtFWV9LUDQsCi0gICAgICAgIFsgIDkgXSA9IEtFWV9LUDUsCi0gICAgICAgIFsgMjEgXSA9IEtFWV9LUDYsCisJWyAgMSBdID0gS0VZX0tQMSwKKwlbIDExIF0gPSBLRVlfS1AyLAorCVsgMjcgXSA9IEtFWV9LUDMsCisJWyAgNSBdID0gS0VZX0tQNCwKKwlbICA5IF0gPSBLRVlfS1A1LAorCVsgMjEgXSA9IEtFWV9LUDYsCiAJWyAgNiBdID0gS0VZX0tQNywKLSAgICAgICAgWyAxMCBdID0gS0VZX0tQOCwKKwlbIDEwIF0gPSBLRVlfS1A4LAogCVsgMTggXSA9IEtFWV9LUDksCiAJWyAxNiBdID0gS0VZX0tQRE9ULAogCiAJWyAgMyBdID0gS0VZX1RVTkVSLAkJLy8gdHYvZm0KLSAgICAgICAgWyAgNCBdID0gS0VZX1JFV0lORCwJCS8vIGZtIHR1bmluZyBsZWZ0IG9yIGZ1bmN0aW9uIGxlZnQKLSAgICAgICAgWyAxMiBdID0gS0VZX0ZPUldBUkQsCQkvLyBmbSB0dW5pbmcgcmlnaHQgb3IgZnVuY3Rpb24gcmlnaHQKKwlbICA0IF0gPSBLRVlfUkVXSU5ELAkJLy8gZm0gdHVuaW5nIGxlZnQgb3IgZnVuY3Rpb24gbGVmdAorCVsgMTIgXSA9IEtFWV9GT1JXQVJELAkJLy8gZm0gdHVuaW5nIHJpZ2h0IG9yIGZ1bmN0aW9uIHJpZ2h0CiAKIAlbICAwIF0gPSBLRVlfUkVDT1JELAotICAgICAgICBbICA4IF0gPSBLRVlfU1RPUCwKLSAgICAgICAgWyAxNyBdID0gS0VZX1BMQVksCisJWyAgOCBdID0gS0VZX1NUT1AsCisJWyAxNyBdID0gS0VZX1BMQVksCiAKIAlbIDI1IF0gPSBLRVlfWk9PTSwKIAlbIDE0IF0gPSBLRVlfTUVOVSwJCS8vIGZ1bmN0aW9uCiAJWyAxOSBdID0gS0VZX0FHQUlOLAkJLy8gcmVjYWxsCiAJWyAyOSBdID0gS0VZX1JFU1RBUlQsCQkvLyByZXNldAorCVsgMjYgXSA9IEtFWV9TSFVGRkxFLAkJLy8gc25hcHNob3Qvc2h1ZmZsZQogCiAvLyBGSVhNRQogCVsgMTMgXSA9IEtFWV9GMjEsCQkvLyBtdHMKLSAgICAgICAgWyAxNSBdID0gS0VZX0YyMiwJCS8vIG1pbgotCVsgMjYgXSA9IEtFWV9GMjMsCQkvLyBmcmVlemUKKwlbIDE1IF0gPSBLRVlfRjIyLAkJLy8gbWluCiB9OwogCiAvKiBBbGV4IEhlcm1hbm4gPGdhYWZAZ214Lm5ldD4gKi8KQEAgLTQ4OSwxMyArNDg3LDE0IEBACiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjU6Ci0gICAgICAgICAgICAgICAgaXJfY29kZXMgICAgID0gZXp0dl9jb2RlczsKLSAgICAgICAgICAgICAgICBtYXNrX2tleWNvZGUgPSAweDAwMDE3YzsKLSAgICAgICAgICAgICAgICBtYXNrX2tleXVwICAgPSAweDAwMDAwMjsKKwkJaXJfY29kZXMgICAgID0gZXp0dl9jb2RlczsKKwkJbWFza19rZXljb2RlID0gMHgwMDAxN2M7CisJCW1hc2tfa2V5dXAgICA9IDB4MDAwMDAyOwogCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9YUEVSVDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZBQ1NTTUFSVFRWOgotCSAgICAgICAgaXJfY29kZXMgICAgID0gYXZhY3NzbWFydF9jb2RlczsKKwkJaXJfY29kZXMgICAgID0gYXZhY3NzbWFydF9jb2RlczsKIAkJbWFza19rZXljb2RlID0gMHgwMDAwMUY7CiAJCW1hc2tfa2V5dXAgICA9IDB4MDAwMDIwOwogCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKQEAgLTUyNCw2ICs1MjMsNyBAQAogCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlI6CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSToKIAkJaXJfY29kZXMgICAgID0gdmlkZW9tYXRlX3R2X3B2cl9jb2RlczsKIAkJbWFza19rZXljb2RlID0gMHgwMDAwM0Y7CiAJCW1hc2tfa2V5dXAgICA9IDB4NDAwMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYwppbmRleCA4MTczMjkwLi5iNWJlZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtb3NzLmMsdiAxLjE0IDIwMDUvMDUvMTggMjI6NDU6MTYgaGhhY2ttYW5uIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtb3NzLmMsdiAxLjE3IDIwMDUvMDYvMjggMjM6NDE6NDcgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogb3NzIGRzcCBpbnRlcmZhY2UKQEAgLTU1NiwyMSArNTU2LDI4IEBACiBzdGF0aWMgaW50CiBtaXhlcl9yZWNzcmNfNzEzMyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKLQl1MzIgdmFsdWUgPSAweGJiYmJiYjsKKwl1MzIgYW5hYmFyLCB4YmFyaW47CiAKKwl4YmFyaW4gPSAweDAzOyAvLyBhZGMKKyAgICBhbmFiYXIgPSAwOwogCXN3aXRjaCAoZGV2LT5vc3MuaW5wdXQpIHsKIAljYXNlIFRWOgotCQl2YWx1ZSA9IDB4YmJiYjEwOyAgLyogTUFJTiAqLworCQl4YmFyaW4gPSAwOyAvLyBEZW1vZHVsYXRvcgorICAgICAgICBhbmFiYXIgPSAyOyAvLyBEQUNzCiAJCWJyZWFrOwogCWNhc2UgTElORTE6Ci0JCXZhbHVlID0gMHhiYmJiMzI7ICAvKiBBVVgxICovCisJCWFuYWJhciA9IDA7ICAvLyBhdXgxLCBhdXgxCiAJCWJyZWFrOwogCWNhc2UgTElORTI6CiAJY2FzZSBMSU5FMl9MRUZUOgotCQl2YWx1ZSA9IDB4YmJiYjU0OyAgLyogQVVYMiAqLworCQlhbmFiYXIgPSA5OyAgLy8gYXV4MiwgYXV4MgogCQlicmVhazsKIAl9Ci0Jc2FhX2RzcF93cml0ZWwoZGV2LCAweDQ2YyA+PiAyLCB2YWx1ZSk7CisgICAgLyogb3V0cHV0IHhiYXIgYWx3YXlzIG1haW4gY2hhbm5lbCAqLworCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NmMgPj4gMiwgMHhiYmJiMTApOworCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NjQgPj4gMiwgeGJhcmluKTsKKwlzYWFfd3JpdGVsKDB4NTk0ID4+IDIsIGFuYWJhcik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXRzLmMKaW5kZXggMzQ1ZWIyYS4uNGRkOWYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogc2FhNzEzNC10cy5jLHYgMS4xNCAyMDA1LzAyLzAzIDEwOjI0OjMzIGtyYXhlbCBFeHAgJAorICogJElkOiBzYWE3MTM0LXRzLmMsdiAxLjE1IDIwMDUvMDYvMTQgMjI6NDg6MTggaGhhY2ttYW5uIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiB2aWRlbzRsaW51eCB2aWRlbyBpbnRlcmZhY2UKQEAgLTIyMSwxMCArMjIxLDEwIEBACiAJaWYgKGRldi0+dHNfcS5jdXJyKSB7CiAJCWZpZWxkID0gZGV2LT50c19xLmN1cnItPnZiLmZpZWxkOwogCQlpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9UT1ApIHsKLQkJCWlmICgoc3RhdHVzICYgMHgxMDAwMDApICE9IDB4MDAwMDAwKQorCQkJaWYgKChzdGF0dXMgJiAweDEwMDAwMCkgIT0gMHgxMDAwMDApCiAJCQkJZ290byBkb25lOwogCQl9IGVsc2UgewotCQkJaWYgKChzdGF0dXMgJiAweDEwMDAwMCkgIT0gMHgxMDAwMDApCisJCQlpZiAoKHN0YXR1cyAmIDB4MTAwMDAwKSAhPSAweDAwMDAwMCkKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJc2FhNzEzNF9idWZmZXJfZmluaXNoKGRldiwmZGV2LT50c19xLFNUQVRFX0RPTkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jCmluZGV4IDM2MTdlN2Y3Li5lZWFmYTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogc2FhNzEzNC10dmF1ZGlvLmMsdiAxLjI1IDIwMDUvMDYvMDcgMTk6MDA6MzggbnNoIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtdHZhdWRpby5jLHYgMS4zMCAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIHR2IGF1ZGlvIGRlY29kZXIgKGZtIHN0ZXJlbywgbmljYW0sIC4uLikKQEAgLTE2OSw3ICsxNjksNyBAQAogCWludCBjbG9jayA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLmF1ZGlvX2Nsb2NrOwogCiAJaWYgKFVOU0VUICE9IGF1ZGlvX2Nsb2NrX292ZXJyaWRlKQotCSAgICAgICAgY2xvY2sgPSBhdWRpb19jbG9ja19vdmVycmlkZTsKKwkJY2xvY2sgPSBhdWRpb19jbG9ja19vdmVycmlkZTsKIAogCS8qIGluaXQgYWxsIGF1ZGlvIHJlZ2lzdGVycyAqLwogCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19QTExfQ1RSTCwgICAweDAwKTsKQEAgLTIxOSwxNCArMjE5LDE3IEBACiAJaW4gICA9IGRldi0+aW5wdXQ7CiAJbXV0ZSA9IChkZXYtPmN0bF9tdXRlIHx8CiAJCShkZXYtPmF1dG9tdXRlICAmJiAgKCZjYXJkKGRldikucmFkaW8pICE9IGluKSk7Ci0JaWYgKFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwID09IGRldi0+cGNpLT5kZXZpY2UgJiYKLQkgICAgY2FyZChkZXYpLm11dGUubmFtZSkgewotCQkvKiA3MTMwIC0gd2UnbGwgbXV0ZSB1c2luZyBzb21lIHVuY29ubmVjdGVkIGF1ZGlvIGlucHV0ICovCisJaWYgKGNhcmQoZGV2KS5tdXRlLm5hbWUpIHsKKwkJLyoKKwkJICogNzEzMCAtIHdlJ2xsIG11dGUgdXNpbmcgc29tZSB1bmNvbm5lY3RlZCBhdWRpbyBpbnB1dAorCQkgKiA3MTM0IC0gd2UnbGwgcHJvYmFibHkgc2hvdWxkIHN3aXRjaCBleHRlcm5hbCBtdXggd2l0aCBncGlvCisJCSAqLwogCQlpZiAobXV0ZSkKIAkJCWluID0gJmNhcmQoZGV2KS5tdXRlOwogCX0KKwogCWlmIChkZXYtPmh3X211dGUgID09IG11dGUgJiYKLQkgICAgZGV2LT5od19pbnB1dCA9PSBpbikgeworCQlkZXYtPmh3X2lucHV0ID09IGluKSB7CiAJCWRwcmludGsoIm11dGUvaW5wdXQ6IG5vdGhpbmcgdG8gZG8gW211dGU9JWQsaW5wdXQ9JXNdXG4iLAogCQkJbXV0ZSxpbi0+bmFtZSk7CiAJCXJldHVybjsKQEAgLTI2MCw2ICsyNjMsNyBAQAogCS8qIHN3aXRjaCBncGlvLWNvbm5lY3RlZCBleHRlcm5hbCBhdWRpbyBtdXggKi8KIAlpZiAoMCA9PSBjYXJkKGRldikuZ3Bpb21hc2spCiAJCXJldHVybjsKKwogCW1hc2sgPSBjYXJkKGRldikuZ3Bpb21hc2s7CiAJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BNT0RFMCA+PiAyLCAgIG1hc2ssIG1hc2spOwogCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCBtYXNrLCBpbi0+Z3Bpbyk7CkBAIC0zMzksMTMgKzM0Myw4IEBACiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJc2NoZWR1bGUoKTsKIAkJfSBlbHNlIHsKLSNpZiAwCi0JCQkvKiBobW0sIHRoYXQgb25lIGRvZXNuJ3QgcmV0dXJuIG9uIHdha2V1cCAuLi4gKi8KLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOwotI2Vsc2UKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotI2VuZGlmCiAJCX0KIAl9CiAJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+dGhyZWFkLndxLCAmd2FpdCk7CkBAIC00MDAsMjcgKzM5OSwxMCBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAotI2lmIDAKLXN0YXRpYyB2b2lkIHNpZmRlYnVnX2R1bXBfcmVncyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKLXsKLQlwcmludF9yZWdiKEFVRElPX1NUQVRVUyk7Ci0JcHJpbnRfcmVnYihJREVOVF9TSUYpOwotCXByaW50X3JlZ2IoTEVWRUxfUkVBRE9VVDEpOwotCXByaW50X3JlZ2IoTEVWRUxfUkVBRE9VVDIpOwotCXByaW50X3JlZ2IoRENYT19JREVOVF9DVFJMKTsKLQlwcmludF9yZWdiKERFTU9EVUxBVE9SKTsKLQlwcmludF9yZWdiKEFHQ19HQUlOX1NFTEVDVCk7Ci0JcHJpbnRfcmVnYihNT05JVE9SX1NFTEVDVCk7Ci0JcHJpbnRfcmVnYihGTV9ERUVNUEhBU0lTKTsKLQlwcmludF9yZWdiKEZNX0RFTUFUUklYKTsKLQlwcmludF9yZWdiKFNJRl9TQU1QTEVfRlJFUSk7Ci0JcHJpbnRfcmVnYihBTkFMT0dfSU9fU0VMRUNUKTsKLX0KLSNlbmRpZgogCiBzdGF0aWMgaW50IHR2YXVkaW9fZ2V0c3RlcmVvKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF90dmF1ZGlvICphdWRpbykKIHsKLQlfX3UzMiBpZHAsbmljYW07CisJX191MzIgaWRwLCBuaWNhbSwgbmljYW1fc3RhdHVzOwogCWludCByZXR2YWwgPSAtMTsKIAogCXN3aXRjaCAoYXVkaW8tPm1vZGUpIHsKQEAgLTQ0MiwxOCArNDI0LDI0IEBACiAJCWJyZWFrOwogCWNhc2UgVFZBVURJT19OSUNBTV9GTToKIAljYXNlIFRWQVVESU9fTklDQU1fQU06Ci0JCW5pY2FtID0gc2FhX3JlYWRiKFNBQTcxMzRfTklDQU1fU1RBVFVTKTsKKwkJbmljYW0gPSBzYWFfcmVhZGIoU0FBNzEzNF9BVURJT19TVEFUVVMpOwogCQlkcHJpbnRrKCJnZXRzdGVyZW86IG5pY2FtPTB4JXhcbiIsbmljYW0pOwotCQlzd2l0Y2ggKG5pY2FtICYgMHgwYikgewotCQljYXNlIDB4MDg6Ci0JCQlyZXR2YWwgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwOToKLQkJCXJldHZhbCA9IFY0TDJfVFVORVJfU1VCX0xBTkcxIHwgVjRMMl9UVU5FUl9TVUJfTEFORzI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDBhOgotCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQkJCWJyZWFrOworCQlpZiAobmljYW0gJiAweDEpIHsKKwkJCW5pY2FtX3N0YXR1cyA9IHNhYV9yZWFkYihTQUE3MTM0X05JQ0FNX1NUQVRVUyk7CisJCQlkcHJpbnRrKCJnZXRzdGVyZW86IG5pY2FtX3N0YXR1cz0weCV4XG4iLCBuaWNhbV9zdGF0dXMpOworCisJCQlzd2l0Y2ggKG5pY2FtX3N0YXR1cyAmIDB4MDMpIHsKKwkJCSAgICBjYXNlIDB4MDE6CisJCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDB4MDI6CisJCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCQlicmVhazsKKwkJCSAgICBkZWZhdWx0OgorCQkJCXJldHZhbCA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBObyBuaWNhbSBkZXRlY3RlZCAqLwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTQ4OSwxNSArNDc3LDE1IEBACiAJCWJyZWFrOwogCWNhc2UgVFZBVURJT19GTV9LX1NURVJFTzoKIAljYXNlIFRWQVVESU9fRk1fQkdfU1RFUkVPOgorCWNhc2UgVFZBVURJT19OSUNBTV9BTToKKwljYXNlIFRWQVVESU9fTklDQU1fRk06CiAJCWRwcmludGsoInNldHN0ZXJlbyBbZm1dID0+ICVzXG4iLAogCQkJbmFtZVsgbW9kZSAlIEFSUkFZX1NJWkUobmFtZSkgXSk7CiAJCXJlZyA9IGZtWyBtb2RlICUgQVJSQVlfU0laRShmbSkgXTsKIAkJc2FhX3dyaXRlYihTQUE3MTM0X0ZNX0RFTUFUUklYLCByZWcpOwogCQlicmVhazsKIAljYXNlIFRWQVVESU9fRk1fU0FUX1NURVJFTzoKLQljYXNlIFRWQVVESU9fTklDQU1fQU06Ci0JY2FzZSBUVkFVRElPX05JQ0FNX0ZNOgotCQkvKiBGSVhNRSAqLworCQkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtNTk2LDcgKzU4NCw3IEBACiAJCS8qIGZpbmQgdGhlIGV4YWN0IHR2IGF1ZGlvIG5vcm0gKi8KIAkJZm9yIChhdWRpbyA9IFVOU0VULCBpID0gMDsgaSA8IFRWQVVESU87IGkrKykgewogCQkJaWYgKGRldi0+dHZub3JtLT5pZCAhPSBVTlNFVCAmJgotCQkJICAgICEoZGV2LT50dm5vcm0tPmlkICYgdHZhdWRpb1tpXS5zdGQpKQorCQkJCSEoZGV2LT50dm5vcm0tPmlkICYgdHZhdWRpb1tpXS5zdGQpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHR2YXVkaW9baV0uY2FycjEgIT0gY2FycmllcikKIAkJCQljb250aW51ZTsKQEAgLTcwMywyNCArNjkxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIDAKLXN0YXRpYyBpbnQgc2FhX2RzcF9yZWFkbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHJlZywgdTMyICp2YWx1ZSkKLXsKLQlpbnQgZXJyOwotCi0JZDJwcmludGsoImRzcCByZWFkIHJlZyAweCV4XG4iLCByZWc8PDIpOwotCXNhYV9yZWFkbChyZWcpOwotCWVyciA9IHNhYV9kc3Bfd2FpdF9iaXQoZGV2LFNBQTcxMzVfRFNQX1JXU1RBVEVfUkRCKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQkqdmFsdWUgPSBzYWFfcmVhZGwocmVnKTsKLQlkMnByaW50aygiZHNwIHJlYWQgICA9PiAweCUwNnhcbiIsICp2YWx1ZSAmIDB4ZmZmZmZmKTsKLQllcnIgPSBzYWFfZHNwX3dhaXRfYml0KGRldixTQUE3MTM1X0RTUF9SV1NUQVRFX0lEQSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKIAogaW50IHNhYV9kc3Bfd3JpdGVsKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgcmVnLCB1MzIgdmFsdWUpCiB7CkBAIC03NTMsMzEgKzcyMyw1MCBAQAogc3RhdGljIGludCBtdXRlX2lucHV0XzcxMzMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7CiAJdTMyIHJlZyA9IDA7CisJdTMyIHhiYXJpbiwgeGJhcm91dDsKIAlpbnQgbWFzazsKKwlzdHJ1Y3Qgc2FhNzEzNF9pbnB1dCAqaW47CiAKKwkvKiBIYWMgMDUwNiByb3V0ZSBPU1Mgc291bmQgc2ltdWx0YW5vdXNseSAgKi8KKwl4YmFyaW4gPSAweDAzOwogCXN3aXRjaCAoZGV2LT5pbnB1dC0+YW11eCkgewogCWNhc2UgVFY6CiAJCXJlZyA9IDB4MDI7CisJCXhiYXJpbiA9IDA7CiAJCWJyZWFrOwogCWNhc2UgTElORTE6CiAJCXJlZyA9IDB4MDA7CiAJCWJyZWFrOwogCWNhc2UgTElORTI6CiAJY2FzZSBMSU5FMl9MRUZUOgotCQlyZWcgPSAweDAxOworCQlyZWcgPSAweDA5OwogCQlicmVhazsKIAl9Ci0JaWYgKGRldi0+Y3RsX211dGUpCisJc2FhX2RzcF93cml0ZWwoZGV2LCAweDQ2NCA+PiAyLCB4YmFyaW4pOworCWlmIChkZXYtPmN0bF9tdXRlKSB7CiAJCXJlZyA9IDB4MDc7CisJCXhiYXJvdXQgPSAweGJiYmJiYjsKKwl9IGVsc2UKKwkJeGJhcm91dCA9IDB4YmJiYjEwOworCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NmMgPj4gMiwgeGJhcm91dCk7CisKIAlzYWFfd3JpdGVsKDB4NTk0ID4+IDIsIHJlZyk7CiAKKwogCS8qIHN3aXRjaCBncGlvLWNvbm5lY3RlZCBleHRlcm5hbCBhdWRpbyBtdXggKi8KICAgICAgICAgaWYgKDAgIT0gY2FyZChkZXYpLmdwaW9tYXNrKSB7CiAgICAgICAgIAltYXNrID0gY2FyZChkZXYpLmdwaW9tYXNrOworCisJCWlmIChjYXJkKGRldikubXV0ZS5uYW1lICYmIGRldi0+Y3RsX211dGUpCisJCQlpbiA9ICZjYXJkKGRldikubXV0ZTsKKwkJZWxzZQorCQkJaW4gPSBkZXYtPmlucHV0OworCiAgICAgICAgIAlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgbWFzaywgbWFzayk7Ci0gICAgICAgIAlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMiwgbWFzaywgZGV2LT5pbnB1dC0+Z3Bpbyk7Ci0gICAgICAgIAlzYWE3MTM0X3RyYWNrX2dwaW8oZGV2LGRldi0+aW5wdXQtPm5hbWUpOworICAgICAgICAJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIG1hc2ssIGluLT5ncGlvKTsKKyAgICAgICAgCXNhYTcxMzRfdHJhY2tfZ3BpbyhkZXYsaW4tPm5hbWUpOwogCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZiaS5jCmluZGV4IDNjMzNjNTkuLjI5ZTUxY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZiaS5jCkBAIC0xMzAsMTMgKzEzMCw3IEBACiAJbGluZXMgICA9IG5vcm0tPnZiaV92X3N0b3BfMCAtIG5vcm0tPnZiaV92X3N0YXJ0XzAgKzE7CiAJaWYgKGxpbmVzID4gVkJJX0xJTkVfQ09VTlQpCiAJCWxpbmVzID0gVkJJX0xJTkVfQ09VTlQ7Ci0jaWYgMQogCWxsZW5ndGggPSBWQklfTElORV9MRU5HVEg7Ci0jZWxzZQotCWxsZW5ndGggPSAobm9ybS0+aF9zdG9wIC0gbm9ybS0+aF9zdGFydCArMSkgKiAyOwotCWlmIChsbGVuZ3RoID4gVkJJX0xJTkVfTEVOR1RIKQotCQlsbGVuZ3RoID0gVkJJX0xJTkVfTEVOR1RIOwotI2VuZGlmCiAJc2l6ZSA9IGxpbmVzICogbGxlbmd0aCAqIDI7CiAJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3OCwxMyArMTcyLDcgQEAKIAlpbnQgbGxlbmd0aCxsaW5lczsKIAogCWxpbmVzICAgPSBkZXYtPnR2bm9ybS0+dmJpX3Zfc3RvcF8wIC0gZGV2LT50dm5vcm0tPnZiaV92X3N0YXJ0XzAgKzE7Ci0jaWYgMQogCWxsZW5ndGggPSBWQklfTElORV9MRU5HVEg7Ci0jZWxzZQotCWxsZW5ndGggPSAobm9ybS0+aF9zdG9wIC0gbm9ybS0+aF9zdGFydCArMSkgKiAyOwotCWlmIChsbGVuZ3RoID4gVkJJX0xJTkVfTEVOR1RIKQotCQlsbGVuZ3RoID0gVkJJX0xJTkVfTEVOR1RIOwotI2VuZGlmCiAJKnNpemUgPSBsaW5lcyAqIGxsZW5ndGggKiAyOwogCWlmICgwID09ICpjb3VudCkKIAkJKmNvdW50ID0gdmJpYnVmczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCmluZGV4IGMwYTJlZTUuLmE0YzJmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtdmlkZW8uYyx2IDEuMzAgMjAwNS8wNi8wNyAxOTowMDozOCBuc2ggRXhwICQKKyAqICRJZDogc2FhNzEzNC12aWRlby5jLHYgMS4zNiAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIHZpZGVvNGxpbnV4IHZpZGVvIGludGVyZmFjZQpAQCAtMjc0LDcgKzI3NCw3IEBACiAKIAkJLmhfc3RhcnQgICAgICAgPSAwLAogCQkuaF9zdG9wICAgICAgICA9IDcxOSwKLQkJLnZpZGVvX3Zfc3RhcnQgPSAyMywKKyAgCQkudmlkZW9fdl9zdGFydCA9IDIzLAogICAJCS52aWRlb192X3N0b3AgID0gMjYyLAogICAJCS52Ymlfdl9zdGFydF8wID0gMTAsCiAgIAkJLnZiaV92X3N0b3BfMCAgPSAyMSwKQEAgLTEyMDQsNyArMTIwNCw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAlpbnQgcmFkaW8gPSAwOwotCiAJbGlzdF9mb3JfZWFjaChsaXN0LCZzYWE3MTM0X2Rldmxpc3QpIHsKIAkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNhYTcxMzRfZGV2LCBkZXZsaXN0KTsKIAkJaWYgKGgtPnZpZGVvX2RldiAmJiAoaC0+dmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikpCkBAIC0xMjU2LDEyICsxMjU1LDEyIEBACiAJaWYgKGZoLT5yYWRpbykgewogCQkvKiBzd2l0Y2ggdG8gcmFkaW8gbW9kZSAqLwogCQlzYWE3MTM0X3R2YXVkaW9fc2V0aW5wdXQoZGV2LCZjYXJkKGRldikucmFkaW8pOwotCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LEFVRENfU0VUX1JBRElPLE5VTEwpOworCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LEFVRENfU0VUX1JBRElPLCBOVUxMKTsKIAl9IGVsc2UgewogCQkvKiBzd2l0Y2ggdG8gdmlkZW8vdmJpIG1vZGUgKi8KIAkJdmlkZW9fbXV4KGRldixkZXYtPmN0bF9pbnB1dCk7CiAJfQotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTEzMDQsMTAgKzEzMDMsMTAgQEAKIAl9IGVsc2UgewogCQlkb3duKCZmaC0+Y2FwLmxvY2spOwogCQlpZiAoVU5TRVQgPT0gZmgtPmNhcC5yZWFkX29mZikgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byBjYXB0dXJlIGEgbmV3IGZyYW1lICovCisJCQkvKiBuZWVkIHRvIGNhcHR1cmUgYSBuZXcgZnJhbWUgKi8KIAkJCWlmIChyZXNfbG9ja2VkKGZoLT5kZXYsUkVTT1VSQ0VfVklERU8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmaC0+Y2FwLmxvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9MTEVSUjsKKwkJCQl1cCgmZmgtPmNhcC5sb2NrKTsKKwkJCQlyZXR1cm4gUE9MTEVSUjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9IGZoLT5jYXAub3BzLT5idWZfcHJlcGFyZSgmZmgtPmNhcCxmaC0+Y2FwLnJlYWRfYnVmLGZoLT5jYXAuZmllbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmaC0+Y2FwLmxvY2spOwpAQCAtMTM2Myw2ICsxMzYyLDM2IEBACiAJCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9WQkkpOwogCX0KIAorCS8qIHRzLWNhcHR1cmUgd2lsbCBub3Qgd29yayBpbiBwbGFuYXIgbW9kZSwgc28gdHVybiBpdCBvZmYgSGFjOiAwNC4wNSovCisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfVklERU9fQSwgMHgxZiwgMCk7CisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfVklERU9fQiwgMHgxZiwgMCk7CisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfREFUQV9BLCAweDFmLCAwKTsKKwlzYWFfYW5kb3JiKFNBQTcxMzRfT0ZNVF9EQVRBX0IsIDB4MWYsIDApOworCisJaWYgKGRldi0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX1REQTgyOTApIHsKKwkJdTggZGF0YVsyXTsKKwkJaW50IHJldDsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPUkyQ19BRERSX1REQTgyOTAsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSAyfTsKKwkJZGF0YVswXSA9IDB4MjE7CisJCWRhdGFbMV0gPSAweGMwOworCQlyZXQgPSBpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOworCQlpZiAocmV0ICE9IDEpCisJCQlwcmludGsoS0VSTl9FUlIgIlREQTgyOTAgYWNjZXNzIGZhaWx1cmVcbiIpOworCQltc2cuYWRkciA9IEkyQ19BRERSX1REQTgyNzU7CisJCWRhdGFbMF0gPSAweDMwOworCQlkYXRhWzFdID0gMHhkMDsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJcHJpbnRrKEtFUk5fRVJSICJUREE4Mjc1IGFjY2VzcyBmYWlsdXJlXG4iKTsKKwkJbXNnLmFkZHIgPSBJMkNfQUREUl9UREE4MjkwOworCQlkYXRhWzBdID0gMHgyMTsKKwkJZGF0YVsxXSA9IDB4ODA7CisJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CisJCWRhdGFbMF0gPSAweDAwOworCQlkYXRhWzFdID0gMHgwMjsKKwkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwl9CisKIAkvKiBmcmVlIHN0dWZmICovCiAJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+Y2FwKTsKIAl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52YmkpOwpAQCAtMTM5OSwxMyArMTQyOCw2IEBACiAJZi0+Zm10LnZiaS5jb3VudFsxXSA9IGYtPmZtdC52YmkuY291bnRbMF07CiAJZi0+Zm10LnZiaS5mbGFncyA9IDA7IC8qIFZCSV9VTlNZTkMgVkJJX0lOVEVSTEFDRUQgKi8KIAotI2lmIDAKLQlpZiAoVjRMMl9TVERfUEFMID09IG5vcm0tPmlkKSB7Ci0JCS8qIEZJWE1FICovCi0JCWYtPmZtdC52Ymkuc3RhcnRbMF0gKz0gMzsKLQkJZi0+Zm10LnZiaS5zdGFydFsxXSArPSAzKjI7Ci0JfQotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbnQgc2FhNzEzNF9nX2ZtdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHNhYTcxMzRfZmggKmZoLApAQCAtMjEyMCw4ICsyMTQyLDYgQEAKIAogCQltZW1zZXQodCwwLHNpemVvZigqdCkpOwogCQlzdHJjcHkodC0+bmFtZSwgIlJhZGlvIik7Ci0gICAgICAgICAgICAgICAgdC0+cmFuZ2Vsb3cgID0gKGludCkoNjUqMTYpOwotICAgICAgICAgICAgICAgIHQtPnJhbmdlaGlnaCA9IChpbnQpKDEwOCoxNik7CiAKIAkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX0dfVFVORVIsIHQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAppbmRleCBkNmIxYzBkLi42ODM2YzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzYWE3MTM0LmgsdiAxLjQxIDIwMDUvMDYvMDcgMTg6MDI6MjYgbnNoIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQuaCx2IDEuNDggMjAwNS8wNy8wMSAwODoyMjoyNCBuc2ggRXhwICQKICAqCiAgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICoKQEAgLTQ2LDggKzQ2LDYgQEAKICNlbmRpZgogI2RlZmluZSBVTlNFVCAoLTFVKQogCi0vKiAyLjQgLyAyLjUgZHJpdmVyIGNvbXBhdGliaWxpdHkgc3R1ZmYgKi8KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGVudW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTE1OSw3ICsxNTcsNyBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9EVkRfRVpNQUtFUiAzMwogI2RlZmluZSBTQUE3MTM0X0JPQVJEX05PVkFDX1BSSU1FVFY3MTMzIDM0CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDUgMzUKLSNkZWZpbmUgU0FBNzEzM19CT0FSRF9VUE1PU1RfUFVSUExFX1RWIDM2CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfVVBNT1NUX1BVUlBMRV9UViAzNgogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0lURU1TX01UVjAwNSAgICAgMzcKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9DSU5FUkdZMjAwICAgICAgIDM4CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9NSU5JIDM5CkBAIC0xNzYsMTMgKzE3NCwxNyBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFXzMwMElfRFZCVF9QQUwgNTAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9QUk9WSURFT19QVjk1MiAgIDUxCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNSAgICA1MgotI2RlZmluZSBTQUE3MTM1X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzUgNTMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM1IDUzCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSA1NAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU8gNTUKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3ICAgIDU2CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTSA1NwogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX1RWIDU4CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1ZTVFJFQU1fWFBFUlQgNTkKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9USFlQSE9PTl9EVkJUX0RVT19DQVJEQlVTIDYwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSCA2MQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSSA2MgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9YUEVSVCA2MwogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDgKICNkZWZpbmUgU0FBNzEzNF9JTlBVVF9NQVggOApAQCAtMjEzLDYgKzIxNSwxMCBAQAogCiAJLyogaTJjIGNoaXAgaW5mbyAqLwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR1bmVyX3R5cGU7CisJdW5zaWduZWQgaW50CQlyYWRpb190eXBlOworCXVuc2lnbmVkIGNoYXIJCXR1bmVyX2FkZHI7CisJdW5zaWduZWQgY2hhcgkJcmFkaW9fYWRkcjsKKwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKIAogCS8qIHBlcmlwaGVyYWwgSS9PICovCkBAIC00MDMsOSArNDA5LDEyIEBACiAJLyogY29uZmlnIGluZm8gKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBib2FyZDsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCAJCSAgIHJhZGlvX3R5cGU7CisJdW5zaWduZWQgY2hhcgkJICAgdHVuZXJfYWRkcjsKKwl1bnNpZ25lZCBjaGFyCQkgICByYWRpb19hZGRyOworCiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgdGRhOTg4N19jb25mOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGdwaW9fdmFsdWU7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaXJxMl9tYXNrOwogCiAJLyogaTJjIGkvbyAqLwogCXN0cnVjdCBpMmNfYWRhcHRlciAgICAgICAgIGkyY19hZGFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYwppbmRleCAwN2JhNmQzLi43Y2IxZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYwpAQCAtMjQzLDE5ICsyNDMsNiBAQAogfQogCiAvKiBJIGRvbid0IHRoaW5rIHdlIGV2ZXIgYWN0dWFsbHkgX3JlYWRfIHRoZSBjaGlwLi4uICovCi0jaWYgMAotc3RhdGljIGludCB0ZGE3NDMyX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZlcjsKLQlkMnByaW50aygidGRhNzQzMjogSW4gdGRhNzQzMl9yZWFkXG4iKTsKLQlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCZidWZmZXIsMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGRhNzQzMjogSS9PIGVycm9yLCB0cnlpbmcgKHJlYWQpXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlkcHJpbnRrKCJ0ZGE3NDMyOiBSZWFkIDB4JTAyeFxuIiwgYnVmZmVyKTsKLQlyZXR1cm4gYnVmZmVyOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgdGRhNzQzMl9zZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKaW5kZXggZjU5ZDQ2MC4uYThiNmE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiB0ZGE4MjkwLmMsdiAxLjExIDIwMDUvMDYvMTggMDY6MDk6MDYgbnNoIEV4cCAkCisgKiAkSWQ6IHRkYTgyOTAuYyx2IDEuMTUgMjAwNS8wNy8wOCAyMDoyMTozMyBtY2hlaGFiIEV4cCAkCiAgKgogICogaTJjIHR2IHR1bmVyIGNoaXAgZGV2aWNlIGRyaXZlcgogICogY29udHJvbHMgdGhlIHBoaWxpcHMgdGRhODI5MCs3NSB0dW5lciBjaGlwIGNvbWJvLgpAQCAtMTM2LDE1ICsxMzYsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgdHVuZXIgKnQsIHUxNiBpZmMpCitzdGF0aWMgdm9pZCBzZXRfZnJlcXVlbmN5KHN0cnVjdCB0dW5lciAqdCwgdTE2IGlmYywgdW5zaWduZWQgaW50IGZyZXEpCiB7Ci0JdTMyIGZyZXE7CiAJdTMyIE47CiAKIAlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKQotCQlmcmVxID0gdC0+ZnJlcSAvIDEwMDA7Ci0JZWxzZQotCQlmcmVxID0gdC0+ZnJlcTsKKwkJZnJlcSA9IGZyZXEgLyAxMDAwOwogCiAJTiA9ICgoKGZyZXE8PDMpK2lmYykmMHgzZmZmYyk7CiAKQEAgLTE4NywxNCArMTg0LDE0IEBACiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCiAJc2V0X2F1ZGlvKHQpOwotCXNldF9mcmVxdWVuY3kodCwgODY0KTsKKwlzZXRfZnJlcXVlbmN5KHQsIDg2NCwgZnJlcSk7CiAJdGRhODI5MF90dW5lKGMpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfcmFkaW9fZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCXNldF9mcmVxdWVuY3kodCwgNzA0KTsKKwlzZXRfZnJlcXVlbmN5KHQsIDcwNCwgZnJlcSk7CiAJdGRhODI5MF90dW5lKGMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCmluZGV4IDk3YjExM2UuLjU2NmUxYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCkBAIC0xMjMsMTkgKzEyMyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAwCi1zdGF0aWMgaW50IHRkYTk4NzVfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXVuc2lnbmVkIGNoYXIgYnVmZmVyOwotCWRwcmludGsoIkluIHRkYTk4NzVfcmVhZFxuIik7Ci0JaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwmYnVmZmVyLDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInRkYTk4NzU6IEkvTyBlcnJvciwgdHJ5aW5nIChyZWFkKVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZHByaW50aygiUmVhZCAweCUwMnhcbiIsIGJ1ZmZlcik7Ci0JcmV0dXJuIGJ1ZmZlcjsKLX0KLSNlbmRpZgogCiBzdGF0aWMgaW50IGkyY19yZWFkX3JlZ2lzdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCByZWcpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCmluZGV4IGVlMzU1NjIuLjEwOGMzYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCkBAIC01NjksMTUgKzU2OSw2IEBACiAJdGRhOTg4N19zZXRfY29uZmlnKHQsYnVmKTsKIAl0ZGE5ODg3X3NldF9pbnNtb2QodCxidWYpOwogCi0jaWYgMAotCS8qIFRoaXMgYXMtaXMgYnJlYWtzIHNvbWUgY2FyZHMsIG11c3QgYmUgZml4ZWQgaW4gYQotCSAqIGNhcmQtc3BlY2lmaWMgd2F5LCBwcm9iYWJseSB1c2luZyBUREE5ODg3X1NFVF9DT05GSUcgdG8KLQkgKiB0dXJuIG9uL29mZiBwb3J0MiAqLwotCWlmICh0LT5zdGQgJiBWNEwyX1NURF9TRUNBTV9MKSB7Ci0JCS8qIHNlY2FtIGZpeHVwIChGSVhNRTogbW92ZSB0aGlzIHRvIHR2bm9ybXMgYXJyYXk/KSAqLwotCQlidWZbMV0gJj0gfmNPdXRwdXRQb3J0MkluYWN0aXZlOwotCX0KLSNlbmRpZgogCiAJZHByaW50ayhQUkVGSVggIndyaXRpbmc6IGI9MHglMDJ4IGM9MHglMDJ4IGU9MHglMDJ4XG4iLAogCQlidWZbMV0sYnVmWzJdLGJ1ZlszXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNTc2Ny5jCmluZGV4IGEyOWYwOGYuLmI1M2M3NDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYwpAQCAtMiw3ICsyLDcgQEAKICAqIEZvciBQaGlsaXBzIFRFQTU3NjcgRk0gQ2hpcCB1c2VkIG9uIHNvbWUgVFYgQ2FyZHMgbGlrZSBQcm9saW5rIFBpeGVsdmlldwogICogSTJDIGFkZHJlc3MgaXMgYWxsd2F5cyAweEMwLgogICoKLSAqICRJZDogdGVhNTc2Ny5jLHYgMS4xMSAyMDA1LzA2LzIxIDE1OjQwOjMzIG1jaGVoYWIgRXhwICQKKyAqICRJZDogdGVhNTc2Ny5jLHYgMS4xOCAyMDA1LzA3LzA3IDAzOjAyOjU1IG1jaGVoYWIgRXhwICQKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIChtY2hlaGFiQGJydHVyYm8uY29tLmJyKQogICogVGhpcyBjb2RlIGlzIHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0xMSwyMyArMTEsMTEgQEAKICAqIGZyb20gdGhlaXIgY29udHJpYnV0aW9ucyBvbiBEU2NhbGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgotCi0vKiBEZWNsYXJlZCBhdCB0dW5lci1jb3JlLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgdHVuZXJfZGVidWc7CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KIAogI2RlZmluZSBQUkVGSVggIlRFQTU3NjcgIgogCkBAIC0zOCw4ICsyNiw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBGaXJzdCByZWdpc3RlciAqLwotI2RlZmluZSBURUE1NzY3X01VVEUJCTB4ODAgLyogTXV0ZXMgb3V0cHV0ICovCi0jZGVmaW5lIFRFQTU3NjdfU0VBUkNICQkweDQwIC8qIEFjdGl2YXRlcyBzdGF0aW9uIHNlYXJjaCAqLworI2RlZmluZSBURUE1NzY3X01VVEUJCTB4ODAJLyogTXV0ZXMgb3V0cHV0ICovCisjZGVmaW5lIFRFQTU3NjdfU0VBUkNICQkweDQwCS8qIEFjdGl2YXRlcyBzdGF0aW9uIHNlYXJjaCAqLwogLyogQml0cyAwLTUgZm9yIGRpdmlkZXIgTVNCICovCiAKIC8qIFNlY29uZCByZWdpc3RlciAqLwpAQCAtMTMwLDYgKzExOCwxNCBAQAogLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCiAjZGVmaW5lIFRFQTU3NjdfUkVTRVJWRURfTUFTSwkweGZmCiAKK2VudW0gdGVhNTc2N194dGFsX2ZyZXEgeworICAgICAgICBURUE1NzY3X0xPV19MT18zMjc2OCAgICA9IDAsCisgICAgICAgIFRFQTU3NjdfSElHSF9MT18zMjc2OCAgID0gMSwKKyAgICAgICAgVEVBNTc2N19MT1dfTE9fMTNNSHogICAgPSAyLAorICAgICAgICBURUE1NzY3X0hJR0hfTE9fMTNNSHogICA9IDMsCit9OworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQgc2V0X3R2X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKQpAQCAtMTUzLDEwMyArMTQ5LDExMiBAQAogCWVsc2UKIAkJcHJpbnRrKFBSRUZJWCAiVHVuZXIgbm90IGF0IGJhbmQgbGltaXRcbiIpOwogCi0JZGl2PSgoYnVmZmVyWzBdJjB4M2YpPDw4KSB8IGJ1ZmZlclsxXTsKKwlkaXYgPSAoKGJ1ZmZlclswXSAmIDB4M2YpIDw8IDgpIHwgYnVmZmVyWzFdOwogCiAJc3dpdGNoIChURUE1NzY3X0hJR0hfTE9fMzI3NjgpIHsKIAljYXNlIFRFQTU3NjdfSElHSF9MT18xM01IejoKLQkJZnJxID0gMTAwMCooZGl2KjUwLTcwMC0yMjUpLzQ7IC8qIEZyZXEgaW4gS0h6ICovCisJCWZycSA9IDEwMDAgKiAoZGl2ICogNTAgLSA3MDAgLSAyMjUpIC8gNDsJLyogRnJlcSBpbiBLSHogKi8KIAkJYnJlYWs7CiAJY2FzZSBURUE1NzY3X0xPV19MT18xM01IejoKLQkJZnJxID0gMTAwMCooZGl2KjUwKzcwMCsyMjUpLzQ7IC8qIEZyZXEgaW4gS0h6ICovCisJCWZycSA9IDEwMDAgKiAoZGl2ICogNTAgKyA3MDAgKyAyMjUpIC8gNDsJLyogRnJlcSBpbiBLSHogKi8KIAkJYnJlYWs7CiAJY2FzZSBURUE1NzY3X0xPV19MT18zMjc2ODoKLQkJZnJxID0gMTAwMCooZGl2KjMyNzY4LzEwMDArNzAwKzIyNSkvNDsgLyogRnJlcSBpbiBLSHogKi8KKwkJZnJxID0gMTAwMCAqIChkaXYgKiAzMjc2OCAvIDEwMDAgKyA3MDAgKyAyMjUpIC8gNDsJLyogRnJlcSBpbiBLSHogKi8KIAkJYnJlYWs7CiAJY2FzZSBURUE1NzY3X0hJR0hfTE9fMzI3Njg6CiAJZGVmYXVsdDoKLQkJZnJxID0gMTAwMCooZGl2KjMyNzY4LzEwMDAtNzAwLTIyNSkvNDsgLyogRnJlcSBpbiBLSHogKi8KKwkJZnJxID0gMTAwMCAqIChkaXYgKiAzMjc2OCAvIDEwMDAgLSA3MDAgLSAyMjUpIC8gNDsJLyogRnJlcSBpbiBLSHogKi8KIAkJYnJlYWs7CiAJfQotICAgICAgICBidWZmZXJbMF0gPSAoZGl2Pj44KSAmIDB4M2Y7Ci0gICAgICAgIGJ1ZmZlclsxXSA9IGRpdiAgICAgICYgMHhmZjsKKwlidWZmZXJbMF0gPSAoZGl2ID4+IDgpICYgMHgzZjsKKwlidWZmZXJbMV0gPSBkaXYgJiAweGZmOwogCiAJcHJpbnRrKFBSRUZJWCAiRnJlcXVlbmN5ICVkLiUwM2QgS0h6IChkaXZpZGVyID0gMHglMDR4KVxuIiwKLQkJCQkJCWZycS8xMDAwLGZycSUxMDAwLGRpdik7CisJICAgICAgIGZycSAvIDEwMDAsIGZycSAlIDEwMDAsIGRpdik7CiAKIAlpZiAoVEVBNTc2N19TVEVSRU9fTUFTSyAmIGJ1ZmZlclsyXSkKIAkJcHJpbnRrKFBSRUZJWCAiU3RlcmVvXG4iKTsKIAllbHNlCiAJCXByaW50ayhQUkVGSVggIk1vbm9cbiIpOwogCi0JcHJpbnRrKFBSRUZJWCAiSUYgQ291bnRlciA9ICVkXG4iLGJ1ZmZlclsyXSAmIFRFQTU3NjdfSUZfQ05UUl9NQVNLKTsKKwlwcmludGsoUFJFRklYICJJRiBDb3VudGVyID0gJWRcbiIsIGJ1ZmZlclsyXSAmIFRFQTU3NjdfSUZfQ05UUl9NQVNLKTsKIAotCXByaW50ayhQUkVGSVggIkFEQyBMZXZlbCA9ICVkXG4iLChidWZmZXJbM10gJiBURUE1NzY3X0FEQ19MRVZFTF9NQVNLKT4+NCk7CisJcHJpbnRrKFBSRUZJWCAiQURDIExldmVsID0gJWRcbiIsCisJICAgICAgIChidWZmZXJbM10gJiBURUE1NzY3X0FEQ19MRVZFTF9NQVNLKSA+PiA0KTsKIAotCXByaW50ayhQUkVGSVggIkNoaXAgSUQgPSAlZFxuIiwoYnVmZmVyWzNdICYgVEVBNTc2N19DSElQX0lEX01BU0spKTsKKwlwcmludGsoUFJFRklYICJDaGlwIElEID0gJWRcbiIsIChidWZmZXJbM10gJiBURUE1NzY3X0NISVBfSURfTUFTSykpOwogCi0JcHJpbnRrKFBSRUZJWCAiUmVzZXJ2ZWQgPSAweCUwMnhcbiIsKGJ1ZmZlcls0XSAmIFRFQTU3NjdfUkVTRVJWRURfTUFTSykpOworCXByaW50ayhQUkVGSVggIlJlc2VydmVkID0gMHglMDJ4XG4iLAorCSAgICAgICAoYnVmZmVyWzRdICYgVEVBNTc2N19SRVNFUlZFRF9NQVNLKSk7CiB9CiAKIC8qIEZyZXEgc2hvdWxkIGJlIHNwZWNpZnllZCBhdCA2Mi41IEh6ICovCiBzdGF0aWMgdm9pZCBzZXRfcmFkaW9fZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZycSkKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzVdOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzVdOwogCXVuc2lnbmVkIGRpdjsKIAlpbnQgcmM7CiAKLQlpZiAoIHR1bmVyX2RlYnVnICkKLQkJcHJpbnRrKFBSRUZJWCAicmFkaW8gZnJlcSBjb3VudGVyICVkXG4iLGZycSk7CisJdHVuZXJfZGJnIChQUkVGSVggInJhZGlvIGZyZXEgY291bnRlciAlZFxuIiwgZnJxKTsKIAogCS8qIFJvdW5kcyBmcmVxIHRvIG5leHQgZGVjaW1hbCB2YWx1ZSAtIGZvciA2Mi41IEtIeiBzdGVwICovCiAJLyogZnJxID0gMjAqKGZycS8xNikrcmFkaW9fZnJxW2ZycSUxNl07ICovCiAKIAlidWZmZXJbMl0gPSBURUE1NzY3X1BPUlQxX0hJR0g7Ci0JYnVmZmVyWzNdID0gVEVBNTc2N19QT1JUMl9ISUdIIHwgVEVBNTc2N19ISUdIX0NVVF9DVFJMIHwgVEVBNTc2N19TVF9OT0lTRV9DVEwgfCBURUE1NzY3X0pBUEFOX0JBTkQ7Ci0JYnVmZmVyWzRdPTA7CisJYnVmZmVyWzNdID0gVEVBNTc2N19QT1JUMl9ISUdIIHwgVEVBNTc2N19ISUdIX0NVVF9DVFJMIHwKKwkJICAgIFRFQTU3NjdfU1RfTk9JU0VfQ1RMIHwgVEVBNTc2N19KQVBBTl9CQU5EOworCWJ1ZmZlcls0XSA9IDA7CisKKwlpZiAodC0+bW9kZSA9PSBUX1NUQU5EQlkpIHsKKwkJdHVuZXJfZGJnKCJURUE1NzY3IHNldCB0byBzdGFuZGJ5IG1vZGVcbiIpOworCQlidWZmZXJbM10gfD0gVEVBNTc2N19TVERCWTsKKwl9CiAKIAlpZiAodC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTykgewogCQl0dW5lcl9kYmcoIlRFQTU3Njcgc2V0IHRvIG1vbm9cbiIpOwogCQlidWZmZXJbMl0gfD0gVEVBNTc2N19NT05POwotCX0gZWxzZQotIAkJdHVuZXJfZGJnKCJURUE1NzY3IHNldCB0byBzdGVyZW9cbiIpOworCX0gZWxzZSB7CisJCXR1bmVyX2RiZygiVEVBNTc2NyBzZXQgdG8gc3RlcmVvXG4iKTsKKwl9CiAKLQlzd2l0Y2ggKHQtPnR5cGUpIHsKKwkvKiBTaG91bGQgYmUgcmVwbGFjZWQgKi8KKwlzd2l0Y2ggKFRFQTU3NjdfSElHSF9MT18zMjc2OCkgewogCWNhc2UgVEVBNTc2N19ISUdIX0xPXzEzTUh6OgotCQl0dW5lcl9kYmcoIlRFQTU3NjcgcmFkaW8gSElHSCBMTyBpbmplY3QgeHRhbCBAIDEzIE1IelxuIik7CisJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gSElHSCBMTyBpbmplY3QgeHRhbCBAIDEzIE1IelxuIik7CiAJCWJ1ZmZlclsyXSB8PSBURUE1NzY3X0hJR0hfTE9fSU5KRUNUOwogCQlidWZmZXJbNF0gfD0gVEVBNTc2N19QTExSRUZfRU5BQkxFOwotCQlkaXYgPSAoZnJxKjQvMTYrNzAwKzIyNSsyNSkvNTA7CisJCWRpdiA9IChmcnEgKiA0IC8gMTYgKyA3MDAgKyAyMjUgKyAyNSkgLyA1MDsKIAkJYnJlYWs7CiAJY2FzZSBURUE1NzY3X0xPV19MT18xM01IejoKLQkJdHVuZXJfZGJnKCJURUE1NzY3IHJhZGlvIExPVyBMTyBpbmplY3QgeHRhbCBAIDEzIE1IelxuIik7CisJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gTE9XIExPIGluamVjdCB4dGFsIEAgMTMgTUh6XG4iKTsKIAogCQlidWZmZXJbNF0gfD0gVEVBNTc2N19QTExSRUZfRU5BQkxFOwotCQlkaXYgPSAoZnJxKjQvMTYtNzAwLTIyNSsyNSkvNTA7CisJCWRpdiA9IChmcnEgKiA0IC8gMTYgLSA3MDAgLSAyMjUgKyAyNSkgLyA1MDsKIAkJYnJlYWs7CiAJY2FzZSBURUE1NzY3X0xPV19MT18zMjc2ODoKLQkJdHVuZXJfZGJnKCJURUE1NzY3IHJhZGlvIExPVyBMTyBpbmplY3QgeHRhbCBAIDMyLDc2OCBNSHpcbiIpOworCQl0dW5lcl9kYmcgKCJURUE1NzY3IHJhZGlvIExPVyBMTyBpbmplY3QgeHRhbCBAIDMyLDc2OCBNSHpcbiIpOwogCQlidWZmZXJbM10gfD0gVEVBNTc2N19YVEFMXzMyNzY4OwogCQkvKiBjb25zdCA3MDA9NDAwMCoxNzUgS2h6IC0gdG8gYWRqdXN0IGZyZXEgdG8gcmlnaHQgdmFsdWUgKi8KLQkJZGl2ID0gKDEwMDAqKGZycSo0LzE2LTcwMC0yMjUpKzE2Mzg0KT4+MTU7CisJCWRpdiA9ICgxMDAwICogKGZycSAqIDQgLyAxNiAtIDcwMCAtIDIyNSkgKyAxNjM4NCkgPj4gMTU7CiAJCWJyZWFrOwogCWNhc2UgVEVBNTc2N19ISUdIX0xPXzMyNzY4OgogCWRlZmF1bHQ6Ci0JCXR1bmVyX2RiZygiVEVBNTc2NyByYWRpbyBISUdIIExPIGluamVjdCB4dGFsIEAgMzIsNzY4IE1IelxuIik7CisJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gSElHSCBMTyBpbmplY3QgeHRhbCBAIDMyLDc2OCBNSHpcbiIpOwogCiAJCWJ1ZmZlclsyXSB8PSBURUE1NzY3X0hJR0hfTE9fSU5KRUNUOwogCQlidWZmZXJbM10gfD0gVEVBNTc2N19YVEFMXzMyNzY4OwotCQlkaXYgPSAoMTAwMCooZnJxKjQvMTYrNzAwKzIyNSkrMTYzODQpPj4xNTsKKwkJZGl2ID0gKDEwMDAgKiAoZnJxICogNCAvIDE2ICsgNzAwICsgMjI1KSArIDE2Mzg0KSA+PiAxNTsKIAkJYnJlYWs7CiAJfQotICAgICAgICBidWZmZXJbMF0gPSAoZGl2Pj44KSAmIDB4M2Y7Ci0gICAgICAgIGJ1ZmZlclsxXSA9IGRpdiAgICAgICYgMHhmZjsKKwlidWZmZXJbMF0gPSAoZGl2ID4+IDgpICYgMHgzZjsKKwlidWZmZXJbMV0gPSBkaXYgJiAweGZmOwogCi0JaWYgKCB0dW5lcl9kZWJ1ZyApCisJaWYgKHR1bmVyX2RlYnVnKQogCQl0ZWE1NzY3X3N0YXR1c19kdW1wKGJ1ZmZlcik7CiAKLSAgICAgICAgaWYgKDUgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGMsYnVmZmVyLDUpKSkKLQkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSA1KVxuIixyYyk7CisJaWYgKDUgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgNSkpKQorCQl0dW5lcl93YXJuKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDUpXG4iLCByYyk7CiB9CiAKIHN0YXRpYyBpbnQgdGVhNTc2N19zaWduYWwoc3RydWN0IGkyY19jbGllbnQgKmMpCkBAIC0yNTgsMTEgKzI2MywxMSBAQAogCWludCByYzsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKLQltZW1zZXQoYnVmZmVyLDAsc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBpZiAoNSAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoYyxidWZmZXIsNSkpKQotICAgICAgICAgICAgICAgIHR1bmVyX3dhcm4gKCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSA1KVxuIixyYyk7CisJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworCWlmICg1ICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCBidWZmZXIsIDUpKSkKKwkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSA1KVxuIiwgcmMpOwogCi0JcmV0dXJuICgoYnVmZmVyWzNdICYgVEVBNTc2N19BRENfTEVWRUxfTUFTSykgPDwoMTMtNCkpOworCXJldHVybiAoKGJ1ZmZlclszXSAmIFRFQTU3NjdfQURDX0xFVkVMX01BU0spIDw8ICgxMyAtIDQpKTsKIH0KIAogc3RhdGljIGludCB0ZWE1NzY3X3N0ZXJlbyhzdHJ1Y3QgaTJjX2NsaWVudCAqYykKQEAgLTI3MSw0NyArMjc2LDQ2IEBACiAJaW50IHJjOwogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAotCW1lbXNldChidWZmZXIsMCxzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIGlmICg1ICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdihjLGJ1ZmZlciw1KSkpCi0gICAgICAgICAgICAgICAgdHVuZXJfd2FybiAoICJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDUpXG4iLHJjKTsKKwltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisJaWYgKDUgIT0gKHJjID0gaTJjX21hc3Rlcl9yZWN2KGMsIGJ1ZmZlciwgNSkpKQorCQl0dW5lcl93YXJuKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDUpXG4iLCByYyk7CiAKIAlyYyA9IGJ1ZmZlclsyXSAmIFRFQTU3NjdfU1RFUkVPX01BU0s7CiAKLQlpZiAoIHR1bmVyX2RlYnVnICkKLQkJdHVuZXJfZGJnKCJURUE1NzY3IHJhZGlvIFNUIEdFVCA9ICUwMnhcbiIsIHJjKTsKKwl0dW5lcl9kYmcoIlRFQTU3NjcgcmFkaW8gU1QgR0VUID0gJTAyeFxuIiwgcmMpOwogCi0JcmV0dXJuICggKGJ1ZmZlclsyXSAmIFRFQTU3NjdfU1RFUkVPX01BU0spID8gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOiAwKTsKKwlyZXR1cm4gKChidWZmZXJbMl0gJiBURUE1NzY3X1NURVJFT19NQVNLKSA/IFY0TDJfVFVORVJfU1VCX1NURVJFTyA6IDApOwogfQogCi1pbnQgdGVhX2RldGVjdGlvbihzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK2ludCB0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmMpCiB7Ci0JdW5zaWduZWQgY2hhciBidWZmZXJbNV09IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzVdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CiAJaW50IHJjOwogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAotICAgICAgICBpZiAoNSAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoYyxidWZmZXIsNSkpKSB7Ci0gICAgICAgICAgICAgICAgdHVuZXJfd2FybiAoICJpdCBpcyBub3QgYSBURUE1NzY3LiBSZWNlaXZlZCAlaSBjaGFycy5cbiIscmMgKTsKKwlpZiAoNSAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoYywgYnVmZmVyLCA1KSkpIHsKKwkJdHVuZXJfd2FybigiaXQgaXMgbm90IGEgVEVBNTc2Ny4gUmVjZWl2ZWQgJWkgY2hhcnMuXG4iLCByYyk7CiAJCXJldHVybiBFSU5WQUw7CiAJfQogCiAJLyogSWYgYWxsIGJ5dGVzIGFyZSB0aGUgc2FtZSB0aGVuIGl0J3MgYSBUViB0dW5lciBhbmQgbm90IGEgdGVhNTc2NyBjaGlwLiAqLwotCWlmIChidWZmZXJbMF0gPT0gYnVmZmVyWzFdICYmICBidWZmZXJbMF0gPT0gYnVmZmVyWzJdICYmCi0JICAgIGJ1ZmZlclswXSA9PSBidWZmZXJbM10gJiYgIGJ1ZmZlclswXSA9PSBidWZmZXJbNF0pIHsKLSAgICAgICAgICAgICAgICB0dW5lcl93YXJuICggIkFsbCBieXRlcyBhcmUgZXF1YWwuIEl0IGlzIG5vdCBhIFRFQTU3NjdcbiIgKTsKKwlpZiAoYnVmZmVyWzBdID09IGJ1ZmZlclsxXSAmJiBidWZmZXJbMF0gPT0gYnVmZmVyWzJdICYmCisJICAgIGJ1ZmZlclswXSA9PSBidWZmZXJbM10gJiYgYnVmZmVyWzBdID09IGJ1ZmZlcls0XSkgeworCQl0dW5lcl93YXJuKCJBbGwgYnl0ZXMgYXJlIGVxdWFsLiBJdCBpcyBub3QgYSBURUE1NzY3XG4iKTsKIAkJcmV0dXJuIEVJTlZBTDsKIAl9CiAKIAkvKiAgU3RhdHVzIGJ5dGVzOgogCSAqICBCeXRlIDQ6IGJpdCAzOjEgOiBDSSAoQ2hpcCBJZGVudGlmaWNhdGlvbikgPT0gMAotCSAqCSAgICBiaXQgMCAgIDogaW50ZXJuYWxseSBzZXQgdG8gMAorCSAqICAgICAgICAgIGJpdCAwICAgOiBpbnRlcm5hbGx5IHNldCB0byAwCiAJICogIEJ5dGUgNTogYml0IDc6MCA6ID09IDAKIAkgKi8KIAogCWlmICghKChidWZmZXJbM10gJiAweDBmKSA9PSAweDAwKSAmJiAoYnVmZmVyWzRdID09IDB4MDApKSB7Ci0gICAgICAgICAgICAgICAgdHVuZXJfd2FybiAoICJDaGlwIElEIGlzIG5vdCB6ZXJvLiBJdCBpcyBub3QgYSBURUE1NzY3XG4iICk7CisJCXR1bmVyX3dhcm4oIkNoaXAgSUQgaXMgbm90IHplcm8uIEl0IGlzIG5vdCBhIFRFQTU3NjdcbiIpOwogCQlyZXR1cm4gRUlOVkFMOwogCX0KLQl0dW5lcl93YXJuICggIlRFQTU3NjcgZGV0ZWN0ZWQuXG4iICk7CisJdHVuZXJfd2FybigiVEVBNTc2NyBkZXRlY3RlZC5cbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTksMTYgKzMyMywxNiBAQAogewogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAotCWlmICh0ZWFfZGV0ZWN0aW9uKGMpPT1FSU5WQUwpIHJldHVybiBFSU5WQUw7CisJaWYgKHRlYTU3NjdfYXV0b2RldGVjdGlvbihjKSA9PSBFSU5WQUwpCisJCXJldHVybiBFSU5WQUw7CiAKLSAgICAgICAgdHVuZXJfaW5mbygidHlwZSBzZXQgdG8gJWQgKCVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICB0LT50eXBlLCBURUE1NzY3X1RVTkVSX05BTUUpOwotICAgICAgICBzdHJsY3B5KGMtPm5hbWUsIFRFQTU3NjdfVFVORVJfTkFNRSwgc2l6ZW9mKGMtPm5hbWUpKTsKKwl0dW5lcl9pbmZvKCJ0eXBlIHNldCB0byAlZCAoJXMpXG4iLCB0LT50eXBlLCAiUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8iKTsKKwlzdHJsY3B5KGMtPm5hbWUsICJ0ZWE1NzY3Iiwgc2l6ZW9mKGMtPm5hbWUpKTsKIAotCXQtPnR2X2ZyZXEgICAgPSBzZXRfdHZfZnJlcTsKKwl0LT50dl9mcmVxID0gc2V0X3R2X2ZyZXE7CiAJdC0+cmFkaW9fZnJlcSA9IHNldF9yYWRpb19mcmVxOwogCXQtPmhhc19zaWduYWwgPSB0ZWE1NzY3X3NpZ25hbDsKLQl0LT5pc19zdGVyZW8gID0gdGVhNTc2N19zdGVyZW87CisJdC0+aXNfc3RlcmVvID0gdGVhNTc2N19zdGVyZW87CiAKIAlyZXR1cm4gKDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci0zMDM2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYwppbmRleCA1MTc0OGM2Li43ZDgyNWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAKIAlzd2l0Y2ggKGNtZCkgCiAJewotCQljYXNlIFRVTkVSX1NFVF9UVkZSRVE6CisJCWNhc2UgVklESU9DU0ZSRVE6CiAJCQlzZXRfdHZfZnJlcShjbGllbnQsICppYXJnKTsKIAkJCWJyZWFrOwogCSAgICAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKaW5kZXggNmY2YmY0YS4uZGUxOTA2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiB0dW5lci1jb3JlLmMsdiAxLjI5IDIwMDUvMDYvMjEgMTU6NDA6MzMgbWNoZWhhYiBFeHAgJAorICogJElkOiB0dW5lci1jb3JlLmMsdiAxLjU1IDIwMDUvMDcvMDggMTM6MjA6MzMgbWNoZWhhYiBFeHAgJAogICoKICAqIGkyYyB0diB0dW5lciBjaGlwIGRldmljZSBkcml2ZXIKICAqIGNvcmUgY29yZSwgaS5lLiBrZXJuZWwgaW50ZXJmYWNlcywgcmVnaXN0ZXJpbmcgYW5kIHNvIG9uCkBAIC0yMyw0MiArMjMsMzYgQEAKICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgogCi0vKgotICogY29tbWVudCBsaW5lIGJlbGxvdyB0byByZXR1cm4gdG8gb2xkIGJlaGF2b3IsIHdoZXJlIG9ubHkgb25lIEkyQyBkZXZpY2UgaXMgc3VwcG9ydGVkCi0gKi8KLQogI2RlZmluZSBVTlNFVCAoLTFVKQogCiAvKiBzdGFuZGFyZCBpMmMgaW5zbW9kIG9wdGlvbnMgKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7Ci0JMHg0YiwgLyogdGRhODI5MCAqLworCTB4NGIsCQkJLyogdGRhODI5MCAqLwogCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCiAJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwKIAlJMkNfQ0xJRU5UX0VORAogfTsKKwogSTJDX0NMSUVOVF9JTlNNT0Q7CiAKIC8qIGluc21vZCBvcHRpb25zIHVzZWQgYXQgaW5pdCB0aW1lID0+IHJlYWQvb25seSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhZGRyICA9ICAwOworc3RhdGljIHVuc2lnbmVkIGludCBhZGRyID0gMDsKIG1vZHVsZV9wYXJhbShhZGRyLCBpbnQsIDA0NDQpOwogCiAvKiBpbnNtb2Qgb3B0aW9ucyB1c2VkIGF0IHJ1bnRpbWUgPT4gcmVhZC93cml0ZSAqLwotdW5zaWduZWQgaW50IHR1bmVyX2RlYnVnICAgPSAwOwotbW9kdWxlX3BhcmFtKHR1bmVyX2RlYnVnLCAgICAgICBpbnQsIDA2NDQpOwordW5zaWduZWQgaW50IHR1bmVyX2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbSh0dW5lcl9kZWJ1ZywgaW50LCAwNjQ0KTsKIAotc3RhdGljIHVuc2lnbmVkIGludCB0dl9yYW5nZVsyXSAgICA9IHsgNDQsIDk1OCB9Oworc3RhdGljIHVuc2lnbmVkIGludCB0dl9yYW5nZVsyXSA9IHsgNDQsIDk1OCB9Owogc3RhdGljIHVuc2lnbmVkIGludCByYWRpb19yYW5nZVsyXSA9IHsgNjUsIDEwOCB9OwogCi1tb2R1bGVfcGFyYW1fYXJyYXkodHZfcmFuZ2UsICAgIGludCwgTlVMTCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodHZfcmFuZ2UsIGludCwgTlVMTCwgMDY0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkocmFkaW9fcmFuZ2UsIGludCwgTlVMTCwgMDY0NCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiZGV2aWNlIGRyaXZlciBmb3IgdmFyaW91cyBUViBhbmQgVFYrRk0gcmFkaW8gdHVuZXJzIik7CiBNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyLCBHZXJkIEtub3JyLCBHdW50aGVyIE1heWVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgdGhpc19hZGFwOwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGZpcnN0X3R1bmVyLCB0dl90dW5lciwgcmFkaW9fdHVuZXI7Ci0KIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7CiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOwogCkBAIC03MCwxOCArNjQsMTkgQEAKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKIAlpZiAodC0+dHlwZSA9PSBVTlNFVCkgewotCQl0dW5lcl9pbmZvKCJ0dW5lciB0eXBlIG5vdCBzZXRcbiIpOworCQl0dW5lcl93YXJuICgidHVuZXIgdHlwZSBub3Qgc2V0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoTlVMTCA9PSB0LT50dl9mcmVxKSB7Ci0JCXR1bmVyX2luZm8oIkh1aD8gdHZfc2V0IGlzIE5VTEw/XG4iKTsKKwkJdHVuZXJfd2FybiAoIlR1bmVyIGhhcyBubyB3YXkgdG8gc2V0IHR2IGZyZXFcbiIpOwogCQlyZXR1cm47CiAJfQotCWlmIChmcmVxIDwgdHZfcmFuZ2VbMF0qMTYgfHwgZnJlcSA+IHR2X3JhbmdlWzFdKjE2KSB7Ci0JCQl0dW5lcl9pbmZvKCJUViBmcmVxICglZC4lMDJkKSBvdXQgb2YgcmFuZ2UgKCVkLSVkKVxuIiwKLQkJCQkgICBmcmVxLzE2LGZyZXElMTYqMTAwLzE2LHR2X3JhbmdlWzBdLHR2X3JhbmdlWzFdKTsKKwlpZiAoZnJlcSA8IHR2X3JhbmdlWzBdICogMTYgfHwgZnJlcSA+IHR2X3JhbmdlWzFdICogMTYpIHsKKwkJdHVuZXJfZGJnICgiVFYgZnJlcSAoJWQuJTAyZCkgb3V0IG9mIHJhbmdlICglZC0lZClcbiIsCisJCQkgICBmcmVxIC8gMTYsIGZyZXEgJSAxNiAqIDEwMCAvIDE2LCB0dl9yYW5nZVswXSwKKwkJCSAgIHR2X3JhbmdlWzFdKTsKIAl9Ci0JdC0+dHZfZnJlcShjLGZyZXEpOworCXQtPnR2X2ZyZXEoYywgZnJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9yYWRpb19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKQEAgLTg5LDI0ICs4NCwyMCBAQAogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAogCWlmICh0LT50eXBlID09IFVOU0VUKSB7Ci0JCXR1bmVyX2luZm8oInR1bmVyIHR5cGUgbm90IHNldFxuIik7CisJCXR1bmVyX3dhcm4gKCJ0dW5lciB0eXBlIG5vdCBzZXRcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChOVUxMID09IHQtPnJhZGlvX2ZyZXEpIHsKLQkJdHVuZXJfaW5mbygibm8gcmFkaW8gdHVuaW5nIGZvciB0aGlzIG9uZSwgc29ycnkuXG4iKTsKKwkJdHVuZXJfd2FybiAoInR1bmVyIGhhcyBubyB3YXkgdG8gc2V0IHJhZGlvIGZyZXF1ZW5jeVxuIik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKGZyZXEgPj0gcmFkaW9fcmFuZ2VbMF0qMTYwMDAgJiYgZnJlcSA8PSByYWRpb19yYW5nZVsxXSoxNjAwMCkgewotCQlpZiAodHVuZXJfZGVidWcpCi0JCQl0dW5lcl9pbmZvKCJyYWRpbyBmcmVxIHN0ZXAgNjIuNUh6ICglZC4lMDZkKVxuIiwKLQkJCSAJCSAgICBmcmVxLzE2MDAwLGZyZXElMTYwMDAqMTAwMC8xNik7Ci0JCXQtPnJhZGlvX2ZyZXEoYyxmcmVxKTsKLSAgICAgICAgfSBlbHNlIHsKLQkJdHVuZXJfaW5mbygicmFkaW8gZnJlcSAoJWQuJTAyZCkgb3V0IG9mIHJhbmdlICglZC0lZClcbiIsCi0JCQkgICAgZnJlcS8xNixmcmVxJTE2KjEwMC8xNiwKLQkJCSAgICByYWRpb19yYW5nZVswXSxyYWRpb19yYW5nZVsxXSk7CisJaWYgKGZyZXEgPD0gcmFkaW9fcmFuZ2VbMF0gKiAxNjAwMCB8fCBmcmVxID49IHJhZGlvX3JhbmdlWzFdICogMTYwMDApIHsKKwkJdHVuZXJfZGJnICgicmFkaW8gZnJlcSAoJWQuJTAyZCkgb3V0IG9mIHJhbmdlICglZC0lZClcbiIsCisJCQkgICBmcmVxIC8gMTYwMDAsIGZyZXEgJSAxNjAwMCAqIDEwMCAvIDE2MDAwLAorCQkJICAgcmFkaW9fcmFuZ2VbMF0sIHJhZGlvX3JhbmdlWzFdKTsKIAl9CiAKKwl0LT5yYWRpb19mcmVxKGMsIGZyZXEpOwogCXJldHVybjsKIH0KIApAQCAtMTE3LDQyICsxMDgsNDUgQEAKIAlzd2l0Y2ggKHQtPm1vZGUpIHsKIAljYXNlIFY0TDJfVFVORVJfUkFESU86CiAJCXR1bmVyX2RiZygicmFkaW8gZnJlcSBzZXQgdG8gJWx1LiUwMmx1XG4iLAotCQkJICBmcmVxLzE2LGZyZXElMTYqMTAwLzE2KTsKLQkJc2V0X3JhZGlvX2ZyZXEoYyxmcmVxKTsKKwkJCSAgZnJlcSAvIDE2MDAwLCBmcmVxICUgMTYwMDAgKiAxMDAgLyAxNjAwMCk7CisJCXNldF9yYWRpb19mcmVxKGMsIGZyZXEpOwogCQlicmVhazsKIAljYXNlIFY0TDJfVFVORVJfQU5BTE9HX1RWOgogCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgogCQl0dW5lcl9kYmcoInR2IGZyZXEgc2V0IHRvICVsdS4lMDJsdVxuIiwKLQkJCSAgZnJlcS8xNixmcmVxJTE2KjEwMC8xNik7CisJCQkgIGZyZXEgLyAxNiwgZnJlcSAlIDE2ICogMTAwIC8gMTYpOwogCQlzZXRfdHZfZnJlcShjLCBmcmVxKTsKIAkJYnJlYWs7CiAJfQogCXQtPmZyZXEgPSBmcmVxOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfdHlwZShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IHR5cGUpCitzdGF0aWMgdm9pZCBzZXRfdHlwZShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IHR5cGUsCisJCSAgICAgdW5zaWduZWQgaW50IG5ld19tb2RlX21hc2spCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzRdOwogCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKHR5cGUgPT0gVU5TRVQgfHwgdHlwZSA9PSBUVU5FUl9BQlNFTlQpCi0JCXJldHVybjsKLQlpZiAodHlwZSA+PSB0dW5lcl9jb3VudCkKLQkJcmV0dXJuOwotCi0JaWYgKE5VTEwgPT0gdC0+aTJjLmRldi5kcml2ZXIpIHsKLQkJLyogbm90IHJlZ2lzdGVyZWQgeWV0ICovCi0JCXQtPnR5cGUgPSB0eXBlOworCWlmICh0eXBlID09IFVOU0VUIHx8IHR5cGUgPT0gVFVORVJfQUJTRU5UKSB7CisJCXR1bmVyX2RiZyAoInR1bmVyIDB4JTAyeDogVHVuZXIgdHlwZSBhYnNlbnRcbiIsYy0+YWRkcik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKCh0LT5pbml0aWFsaXplZCkgJiYgKHQtPnR5cGUgPT0gdHlwZSkpCi0JCS8qIHJ1biBvbmx5IG9uY2UgZXhjZXB0IHR5cGUgY2hhbmdlICBIYWMgMDQvMDUqLwotCQlyZXR1cm47CiAKLQl0LT5pbml0aWFsaXplZCA9IDE7CisJaWYgKHR5cGUgPj0gdHVuZXJfY291bnQpIHsKKwkJdHVuZXJfd2FybiAoInR1bmVyIDB4JTAyeDogVHVuZXIgY291bnQgZ3JlYXRlciB0aGFuICVkXG4iLGMtPmFkZHIsdHVuZXJfY291bnQpOworCQlyZXR1cm47CisJfQorCisJLyogVGhpcyBjb2RlIGRldGVjdHMgY2FsbHMgYnkgY2FyZCBhdHRhY2hfaW5mb3JtICovCisJaWYgKE5VTEwgPT0gdC0+aTJjLmRldi5kcml2ZXIpIHsKKwkJdHVuZXJfZGJnICgidHVuZXIgMHglMDJ4OiBjYWxsZWQgZHVyaW5nIGkyY19jbGllbnQgcmVnaXN0ZXIgYnkgYWRhcHRlcidzIGF0dGFjaF9pbmZvcm1cbiIsIGMtPmFkZHIpOworCisJCXQtPnR5cGU9dHlwZTsKKwkJcmV0dXJuOworCX0KIAogCXQtPnR5cGUgPSB0eXBlOworCiAJc3dpdGNoICh0LT50eXBlKSB7CiAJY2FzZSBUVU5FUl9NVDIwMzI6CiAJCW1pY3JvdHVuZV9pbml0KGMpOwpAQCAtMTYxLDEzNiArMTU1LDE5NCBAQAogCQl0ZGE4MjkwX2luaXQoYyk7CiAJCWJyZWFrOwogCWNhc2UgVFVORVJfVEVBNTc2NzoKLQkJaWYgKHRlYTU3NjdfdHVuZXJfaW5pdChjKT09RUlOVkFMKSB0LT50eXBlPVRVTkVSX0FCU0VOVDsKKwkJaWYgKHRlYTU3NjdfdHVuZXJfaW5pdChjKSA9PSBFSU5WQUwpIHsKKwkJCXQtPnR5cGUgPSBUVU5FUl9BQlNFTlQ7CisJCQl0LT5tb2RlX21hc2sgPSBUX1VOSU5JVElBTElaRUQ7CisJCQlyZXR1cm47CisJCX0KKwkJdC0+bW9kZV9tYXNrID0gVF9SQURJTzsKIAkJYnJlYWs7CiAJY2FzZSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzM6CiAJCWJ1ZmZlclswXSA9IDB4MGI7CiAJCWJ1ZmZlclsxXSA9IDB4ZGM7CiAJCWJ1ZmZlclsyXSA9IDB4OWM7CiAJCWJ1ZmZlclszXSA9IDB4NjA7Ci0gICAgCQlpMmNfbWFzdGVyX3NlbmQoYyxidWZmZXIsNCk7CisJCWkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDQpOwogCQltZGVsYXkoMSk7CiAJCWJ1ZmZlclsyXSA9IDB4ODY7CiAJCWJ1ZmZlclszXSA9IDB4NTQ7Ci0gICAgCQlpMmNfbWFzdGVyX3NlbmQoYyxidWZmZXIsNCk7CisJCWkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDQpOwogCQlkZWZhdWx0X3R1bmVyX2luaXQoYyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCS8qIFRFQTU3NjcgYXV0b2RldGVjdGlvbiBjb2RlICovCi0JCQlpZiAodGVhNTc2N190dW5lcl9pbml0KGMpIT1FSU5WQUwpIHsKLQkJCQl0LT50eXBlID0gVFVORVJfVEVBNTc2NzsKLQkJCQlpZiAoZmlyc3RfdHVuZXIgPT0gMHg2MCkKLQkJCQkJZmlyc3RfdHVuZXIrKzsKLQkJCQlicmVhazsKLQkJCX0KLQogCQlkZWZhdWx0X3R1bmVyX2luaXQoYyk7CiAJCWJyZWFrOwogCX0KLQl0dW5lcl9kYmcgKCJJMkMgYWRkciAweCUwMnggd2l0aCB0eXBlICVkXG4iLGMtPmFkZHI8PDEsdHlwZSk7CisKKwlpZiAodC0+bW9kZV9tYXNrID09IFRfVU5JTklUSUFMSVpFRCkKKwkJdC0+bW9kZV9tYXNrID0gbmV3X21vZGVfbWFzazsKKworCXNldF9mcmVxKGMsIHQtPmZyZXEpOworCXR1bmVyX2RiZygiJXMgJXMgSTJDIGFkZHIgMHglMDJ4IHdpdGggdHlwZSAlZCB1c2VkIGZvciAweCUwMnhcbiIsCisJCSAgYy0+YWRhcHRlci0+bmFtZSwgYy0+ZHJpdmVyLT5uYW1lLCBjLT5hZGRyIDw8IDEsIHR5cGUsCisJCSAgdC0+bW9kZV9tYXNrKTsKIH0KIAotI2RlZmluZSBDSEVDS19BRERSKHRwLGNtZCx0dW4pCWlmIChjbGllbnQtPmFkZHIhPXRwKSB7IFwKLQkJCSAgcmV0dXJuIDA7IH0gZWxzZSBpZiAodHVuZXJfZGVidWcpIFwKLQkJCSAgdHVuZXJfaW5mbyAoIkNtZCAlcyBhY2NlcHRlZCB0byAidHVuIlxuIixjbWQpOwotI2RlZmluZSBDSEVDS19NT0RFKGNtZCkJaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgeyBcCi0JCSAJQ0hFQ0tfQUREUihyYWRpb190dW5lcixjbWQsInJhZGlvIikgfSBlbHNlIFwKLQkJCXsgQ0hFQ0tfQUREUih0dl90dW5lcixjbWQsIlRWIik7IH0KKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFwcGx5IHR1bmVyIGNvbmZpZyB0byB0dW5lciBzcGVjaWZpZWQKKyAqIGJ5IHR1bl9zZXR1cCBzdHJ1Y3R1cmUuIEkgYWRkciBpcyB1bnNldCwgdGhlbiBhZG1pbiBzdGF0dXMKKyAqIGFuZCB0dW4gYWRkciBzdGF0dXMgaXMgbW9yZSBwcmVjaXNlIHRoZW4gY3VycmVudCBzdGF0dXMsCisgKiBpdCdzIGFwcGxpZWQuIE90aGVyd2lzZSBzdGF0dXMgYW5kIHR5cGUgYXJlIGFwcGxpZWQgb25seSB0bworICogdHVuZXIgd2l0aCBleGFjdGx5IHRoZSBzYW1lIGFkZHIuCisqLwogCi1zdGF0aWMgdm9pZCBzZXRfYWRkcihzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHR1bmVyX2FkZHIgKnR1bl9hZGRyKQorc3RhdGljIHZvaWQgc2V0X2FkZHIoc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCB0dW5lcl9zZXR1cCAqdHVuX3NldHVwKQogewotCS8qIEFERFJfVU5TRVQgZGVmYXVsdHMgdG8gZmlyc3QgYXZhaWxhYmxlIHR1bmVyICovCi0JaWYgKCB0dW5fYWRkci0+YWRkciA9PSBBRERSX1VOU0VUICkgewotCQlpZiAoZmlyc3RfdHVuZXIgIT0gYy0+YWRkcikKLQkJCXJldHVybjsKLQkJc3dpdGNoICh0dW5fYWRkci0+djRsMl90dW5lcikgewotCQljYXNlIFY0TDJfVFVORVJfUkFESU86Ci0JIAkJcmFkaW9fdHVuZXI9Yy0+YWRkcjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdHZfdHVuZXI9Yy0+YWRkcjsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogU2V0cyB0dW5lciB0byBpdHMgY29uZmlndXJlZCB2YWx1ZSAqLwotCQlzd2l0Y2ggKHR1bl9hZGRyLT52NGwyX3R1bmVyKSB7Ci0JCWNhc2UgVjRMMl9UVU5FUl9SQURJTzoKLSAJCQlyYWRpb190dW5lcj10dW5fYWRkci0+YWRkcjsKLQkJCWlmICggdHVuX2FkZHItPmFkZHIgPT0gYy0+YWRkciApIHNldF90eXBlKGMsdHVuX2FkZHItPnR5cGUpOwotCQkJcmV0dXJuOwotCQlkZWZhdWx0OgotCQkJdHZfdHVuZXI9dHVuX2FkZHItPmFkZHI7Ci0JCQlpZiAoIHR1bl9hZGRyLT5hZGRyID09IGMtPmFkZHIgKSBzZXRfdHlwZShjLHR1bl9hZGRyLT50eXBlKTsKLQkJCXJldHVybjsKLQkJfQorCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCWlmICh0dW5fc2V0dXAtPmFkZHIgPT0gQUREUl9VTlNFVCkgeworCQlpZiAodC0+bW9kZV9tYXNrICYgdHVuX3NldHVwLT5tb2RlX21hc2spCisJCQlzZXRfdHlwZShjLCB0dW5fc2V0dXAtPnR5cGUsIHR1bl9zZXR1cC0+bW9kZV9tYXNrKTsKKwl9IGVsc2UgaWYgKHR1bl9zZXR1cC0+YWRkciA9PSBjLT5hZGRyKSB7CisJCXNldF90eXBlKGMsIHR1bl9zZXR1cC0+dHlwZSwgdHVuX3NldHVwLT5tb2RlX21hc2spOwogCX0KLQlzZXRfdHlwZShjLHR1bl9hZGRyLT50eXBlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbW9kZShzdHJ1Y3QgdHVuZXIgKnQsIGNoYXIgKmNtZCkKK3sKKwlpZiAoMSA8PCB0LT5tb2RlICYgdC0+bW9kZV9tYXNrKSB7CisJCXN3aXRjaCAodC0+bW9kZSkgeworCQljYXNlIFY0TDJfVFVORVJfUkFESU86CisJCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgcmFkaW9cbiIsIGNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX0FOQUxPR19UVjoKKwkJCXR1bmVyX2RiZygiQ21kICVzIGFjY2VwdGVkIGZvciBhbmFsb2cgVFZcbiIsIGNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX0RJR0lUQUxfVFY6CisJCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgZGlnaXRhbCBUVlxuIiwgY21kKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gRUlOVkFMOwogfQogCiBzdGF0aWMgY2hhciBwYWxbXSA9ICItIjsKIG1vZHVsZV9wYXJhbV9zdHJpbmcocGFsLCBwYWwsIHNpemVvZihwYWwpLCAwNjQ0KTsKK3N0YXRpYyBjaGFyIHNlY2FtW10gPSAiLSI7Cittb2R1bGVfcGFyYW1fc3RyaW5nKHNlY2FtLCBzZWNhbSwgc2l6ZW9mKHNlY2FtKSwgMDY0NCk7CiAKKy8qIGdldCBtb3JlIHByZWNpc2Ugbm9ybSBpbmZvIGZyb20gaW5zbW9kIG9wdGlvbiAqLwogc3RhdGljIGludCB0dW5lcl9maXh1cF9zdGQoc3RydWN0IHR1bmVyICp0KQogewogCWlmICgodC0+c3RkICYgVjRMMl9TVERfUEFMKSA9PSBWNEwyX1NURF9QQUwpIHsKLQkJLyogZ2V0IG1vcmUgcHJlY2lzZSBub3JtIGluZm8gZnJvbSBpbnNtb2Qgb3B0aW9uICovCiAJCXN3aXRjaCAocGFsWzBdKSB7CiAJCWNhc2UgJ2InOgogCQljYXNlICdCJzoKIAkJY2FzZSAnZyc6CiAJCWNhc2UgJ0cnOgotCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtQkdcbiIpOworCQkJdHVuZXJfZGJnICgiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLUJHXG4iKTsKIAkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9CRzsKIAkJCWJyZWFrOwogCQljYXNlICdpJzoKIAkJY2FzZSAnSSc6Ci0JCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1JXG4iKTsKKwkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1JXG4iKTsKIAkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9JOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2QnOgogCQljYXNlICdEJzoKIAkJY2FzZSAnayc6CiAJCWNhc2UgJ0snOgotCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtREtcbiIpOworCQkJdHVuZXJfZGJnICgiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLURLXG4iKTsKIAkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9ESzsKIAkJCWJyZWFrOworCQljYXNlICdNJzoKKwkJY2FzZSAnbSc6CisJCQl0dW5lcl9kYmcgKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtTVxuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfTTsKKwkJCWJyZWFrOworCQljYXNlICdOJzoKKwkJY2FzZSAnbic6CisJCQl0dW5lcl9kYmcgKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtTlxuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfTjsKKwkJCWJyZWFrOwogCQl9CiAJfQorCWlmICgodC0+c3RkICYgVjRMMl9TVERfU0VDQU0pID09IFY0TDJfU1REX1NFQ0FNKSB7CisJCXN3aXRjaCAoc2VjYW1bMF0pIHsKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ0QnOgorCQljYXNlICdrJzoKKwkJY2FzZSAnSyc6CisJCQl0dW5lcl9kYmcgKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLURLXG4iKTsKKwkJCXQtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0RLOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQljYXNlICdMJzoKKwkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tTFxuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MOworCQkJYnJlYWs7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKiBzdGF0aWMgdmFyIFVzZWQgb25seSBpbiB0dW5lcl9hdHRhY2ggYW5kIHR1bmVyX3Byb2JlICovCitzdGF0aWMgdW5zaWduZWQgZGVmYXVsdF9tb2RlX21hc2s7CisKKy8qIER1cmluZyBjbGllbnQgYXR0YWNoLCBzZXRfdHlwZSBpcyBjYWxsZWQgYnkgYWRhcHRlcidzIGF0dGFjaF9pbmZvcm0gY2FsbGJhY2suCisgICBzZXRfdHlwZSBtdXN0IHRoZW4gYmUgY29tcGxldGVkIGJ5IHR1bmVyX2F0dGFjaC4KKyAqLwogc3RhdGljIGludCB0dW5lcl9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCiB7CiAJc3RydWN0IHR1bmVyICp0OwogCi0JLyogYnkgZGVmYXVsdCwgZmlyc3QgSTJDIGNhcmQgaXMgYm90aCB0diBhbmQgcmFkaW8gdHVuZXIgKi8KLQlpZiAodGhpc19hZGFwID09IDApIHsKLQkJZmlyc3RfdHVuZXIgPSBhZGRyOwotCQl0dl90dW5lciA9IGFkZHI7Ci0JCXJhZGlvX3R1bmVyID0gYWRkcjsKLQl9Ci0JdGhpc19hZGFwKys7CisJY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOworCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKIAotICAgICAgICBjbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0gICAgICAgIGNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKLQotICAgICAgICB0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR1bmVyKSxHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKE5VTEwgPT0gdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgbWVtc2V0KHQsMCxzaXplb2Yoc3RydWN0IHR1bmVyKSk7Ci0gICAgICAgIG1lbWNweSgmdC0+aTJjLCZjbGllbnRfdGVtcGxhdGUsc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dW5lciksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHQpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldCh0LCAwLCBzaXplb2Yoc3RydWN0IHR1bmVyKSk7CisJbWVtY3B5KCZ0LT5pMmMsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwogCWkyY19zZXRfY2xpZW50ZGF0YSgmdC0+aTJjLCB0KTsKLQl0LT50eXBlICAgICAgID0gVU5TRVQ7Ci0JdC0+cmFkaW9faWYyICA9IDEwNzAwKjEwMDA7IC8qIDEwLjdNSHogLSBGTSByYWRpbyAqLwotCXQtPmF1ZG1vZGUgICAgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCXQtPnR5cGUgPSBVTlNFVDsKKwl0LT5yYWRpb19pZjIgPSAxMDcwMCAqIDEwMDA7CS8qIDEwLjdNSHogLSBGTSByYWRpbyAqLworCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCXQtPm1vZGVfbWFzayA9IFRfVU5JTklUSUFMSVpFRDsKIAotICAgICAgICBpMmNfYXR0YWNoX2NsaWVudCgmdC0+aTJjKTsKLQl0dW5lcl9pbmZvKCJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLAotCQkgICBhZGRyIDw8IDEsIGFkYXAtPm5hbWUpOwogCi0Jc2V0X3R5cGUoJnQtPmkyYywgdC0+dHlwZSk7CisJdHVuZXJfaW5mbygiY2hpcCBmb3VuZCBAIDB4JXggKCVzKVxuIiwgYWRkciA8PCAxLCBhZGFwLT5uYW1lKTsKKworCS8qIFRFQTU3NjcgYXV0b2RldGVjdGlvbiBjb2RlIC0gb25seSBmb3IgYWRkciA9IDB4YzAgKi8KKwlpZiAoYWRkciA9PSAweDYwKSB7CisJCWlmICh0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oJnQtPmkyYykgIT0gRUlOVkFMKSB7CisJCQl0LT50eXBlID0gVFVORVJfVEVBNTc2NzsKKwkJCXQtPm1vZGVfbWFzayA9IFRfUkFESU87CisJCQl0LT5tb2RlID0gVF9TVEFOREJZOworCQkJdC0+ZnJlcSA9IDg3LjUgKiAxNjsgLyogU2V0cyBmcmVxIHRvIEZNIHJhbmdlICovCisJCQlkZWZhdWx0X21vZGVfbWFzayAmPSB+VF9SQURJTzsKKworCQkJaTJjX2F0dGFjaF9jbGllbnQgKCZ0LT5pMmMpOworCQkJc2V0X3R5cGUoJnQtPmkyYyx0LT50eXBlLCB0LT5tb2RlX21hc2spOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplcyBvbmx5IHRoZSBmaXJzdCBhZGFwdGVyIGZvdW5kICovCisJaWYgKGRlZmF1bHRfbW9kZV9tYXNrICE9IFRfVU5JTklUSUFMSVpFRCkgeworCQl0dW5lcl9kYmcgKCJTZXR0aW5nIG1vZGVfbWFzayB0byAweCUwMnhcbiIsIGRlZmF1bHRfbW9kZV9tYXNrKTsKKwkJdC0+bW9kZV9tYXNrID0gZGVmYXVsdF9tb2RlX21hc2s7CisJCXQtPmZyZXEgPSA0MDAgKiAxNjsgLyogU2V0cyBmcmVxIHRvIFZIRiBIaWdoICovCisJCWRlZmF1bHRfbW9kZV9tYXNrID0gVF9VTklOSVRJQUxJWkVEOworCX0KKworCS8qIFNob3VsZCBiZSBqdXN0IGJlZm9yZSByZXR1cm4gKi8KKwlpMmNfYXR0YWNoX2NsaWVudCAoJnQtPmkyYyk7CisJc2V0X3R5cGUgKCZ0LT5pMmMsdC0+dHlwZSwgdC0+bW9kZV9tYXNrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzAwLDExICszNTIsOCBAQAogCQlub3JtYWxfaTJjWzBdID0gYWRkcjsKIAkJbm9ybWFsX2kyY1sxXSA9IEkyQ19DTElFTlRfRU5EOwogCX0KLQl0aGlzX2FkYXAgPSAwOwogCi0JZmlyc3RfdHVuZXIgPSAwOwotCXR2X3R1bmVyID0gMDsKLQlyYWRpb190dW5lciA9IDA7CisJZGVmYXVsdF9tb2RlX21hc2sgPSBUX1JBRElPIHwgVF9BTkFMT0dfVFYgfCBUX0RJR0lUQUxfVFY7CiAKIAlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHR1bmVyX2F0dGFjaCk7CkBAIC0zMTYsOSArMzY1LDEwIEBACiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWVycj1pMmNfZGV0YWNoX2NsaWVudCgmdC0+aTJjKTsKKwllcnIgPSBpMmNfZGV0YWNoX2NsaWVudCgmdC0+aTJjKTsKIAlpZiAoZXJyKSB7Ci0JCXR1bmVyX3dhcm4gKCJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJCXR1bmVyX3dhcm4KKwkJICAgICgiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMzI2LDM3ICszNzYsNjUgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBTV0lUQ0hfVjRMMglpZiAoIXQtPnVzaW5nX3Y0bDIgJiYgdHVuZXJfZGVidWcpIFwKLQkJICAgICAgICAgIHR1bmVyX2luZm8oInN3aXRjaGluZyB0byB2NGwyXG4iKTsgXAotCSAgICAgICAgICAgICAgICAgIHQtPnVzaW5nX3Y0bDIgPSAxOwotI2RlZmluZSBDSEVDS19WNEwyCWlmICh0LT51c2luZ192NGwyKSB7IGlmICh0dW5lcl9kZWJ1ZykgXAotCQkJICB0dW5lcl9pbmZvKCJpZ25vcmUgdjRsMSBjYWxsXG4iKTsgXAotCQkgICAgICAgICAgcmV0dXJuIDA7IH0KKy8qCisgKiBTd2l0Y2ggdHVuZXIgdG8gb3RoZXIgbW9kZS4gSWYgdHVuZXIgc3VwcG9ydCBib3RoIHR2IGFuZCByYWRpbywKKyAqIHNldCBhbm90aGVyIGZyZXF1ZW5jeSB0byBzb21lIHZhbHVlIChUaGlzIGlzIG5lZWRlZCBmb3Igc29tZSBwYWwKKyAqIHR1bmVycyB0byBhdm9pZCBsb2NraW5nKS4gT3RoZXJ3aXNlLCBqdXN0IHB1dCBzZWNvbmQgdHVuZXIgaW4KKyAqIHN0YW5kYnkgbW9kZS4KKyAqLwogCi1zdGF0aWMgaW50Ci10dW5lcl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9tb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB0dW5lciAqdCwgaW50IG1vZGUsIGNoYXIgKmNtZCkKK3sKKwlpZiAobW9kZSAhPSB0LT5tb2RlKSB7CisKKwkJdC0+bW9kZSA9IG1vZGU7CisJCWlmIChjaGVja19tb2RlKHQsIGNtZCkgPT0gRUlOVkFMKSB7CisJCQl0LT5tb2RlID0gVF9TVEFOREJZOworCQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gbW9kZSkgeworCQkJCXNldF90dl9mcmVxKGNsaWVudCwgNDAwICogMTYpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRfcmFkaW9fZnJlcShjbGllbnQsIDg3LjUgKiAxNjAwMCk7CisJCQl9CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIHN3aXRjaF92NGwyKCkJaWYgKCF0LT51c2luZ192NGwyKSBcCisJCSAgICAgICAgICAgIHR1bmVyX2RiZygic3dpdGNoaW5nIHRvIHY0bDJcbiIpOyBcCisJICAgICAgICAgICAgICAgIHQtPnVzaW5nX3Y0bDIgPSAxOworCitzdGF0aWMgaW5saW5lIGludCBjaGVja192NGwyKHN0cnVjdCB0dW5lciAqdCkKK3sKKwlpZiAodC0+dXNpbmdfdjRsMikgeworCQl0dW5lcl9kYmcgKCJpZ25vcmUgdjRsMSBjYWxsXG4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVuZXJfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0gICAgICAgIHVuc2lnbmVkIGludCAqaWFyZyA9IChpbnQqKWFyZzsKKwl1bnNpZ25lZCBpbnQgKmlhcmcgPSAoaW50ICopYXJnOwogCi0gICAgICAgIHN3aXRjaCAoY21kKSB7CisJc3dpdGNoIChjbWQpIHsKIAkvKiAtLS0gY29uZmlndXJhdGlvbiAtLS0gKi8KLQljYXNlIFRVTkVSX1NFVF9UWVBFOgotCQlzZXRfdHlwZShjbGllbnQsKmlhcmcpOwotCQlicmVhazsKIAljYXNlIFRVTkVSX1NFVF9UWVBFX0FERFI6Ci0JCXNldF9hZGRyKGNsaWVudCwoc3RydWN0IHR1bmVyX2FkZHIgKilhcmcpOworCQl0dW5lcl9kYmcgKCJDYWxsaW5nIHNldF90eXBlX2FkZHIgZm9yIHR5cGU9JWQsIGFkZHI9MHglMDJ4LCBtb2RlPTB4JTAyeFxuIiwKKwkJCQkoKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyktPnR5cGUsCisJCQkJKChzdHJ1Y3QgdHVuZXJfc2V0dXAgKilhcmcpLT5hZGRyLAorCQkJCSgoc3RydWN0IHR1bmVyX3NldHVwICopYXJnKS0+bW9kZV9tYXNrKTsKKworCQlzZXRfYWRkcihjbGllbnQsIChzdHJ1Y3QgdHVuZXJfc2V0dXAgKilhcmcpOwogCQlicmVhazsKIAljYXNlIEFVRENfU0VUX1JBRElPOgotCQl0LT5tb2RlID0gVjRMMl9UVU5FUl9SQURJTzsKLQkJQ0hFQ0tfQUREUih0dl90dW5lciwiQVVEQ19TRVRfUkFESU8iLCJUViIpOwotCi0JCWlmIChWNEwyX1RVTkVSX1JBRElPICE9IHQtPm1vZGUpIHsKLQkJCXNldF90dl9mcmVxKGNsaWVudCw0MDAgKiAxNik7Ci0JCX0KKwkJc2V0X21vZGUoY2xpZW50LHQsVjRMMl9UVU5FUl9SQURJTywgIkFVRENfU0VUX1JBRElPIik7CiAJCWJyZWFrOwogCWNhc2UgQVVEQ19DT05GSUdfUElOTkFDTEU6Ci0JCUNIRUNLX0FERFIodHZfdHVuZXIsIkFVRENfQ09ORklHX1BJTk5BQ0xFIiwiVFYiKTsKKwkJaWYgKGNoZWNrX21vZGUodCwgIkFVRENfQ09ORklHX1BJTk5BQ0xFIikgPT0gRUlOVkFMKQorCQkJcmV0dXJuIDA7CiAJCXN3aXRjaCAoKmlhcmcpIHsKIAkJY2FzZSAyOgogCQkJdHVuZXJfZGJnKCJwaW5uYWNsZSBwYWxcbiIpOwpAQCAtMzY4LDIxOSArNDQ2LDIzOCBAQAogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBUREE5ODg3X1NFVF9DT05GSUc6CisJCWJyZWFrOwogCS8qIC0tLSB2NGwgaW9jdGxzIC0tLSAqLwogCS8qIHRha2UgY2FyZTogYnR0diBkb2VzIHVzZXJzcGFjZSBjb3B5aW5nLCB3ZSdsbCBnZXQgYQogCSAgIGtlcm5lbCBwb2ludGVyIGhlcmUuLi4gKi8KIAljYXNlIFZJRElPQ1NDSEFOOgotCXsKLQkJc3RhdGljIGNvbnN0IHY0bDJfc3RkX2lkIG1hcFtdID0gewotCQkJWyBWSURFT19NT0RFX1BBTCAgIF0gPSBWNEwyX1NURF9QQUwsCi0JCQlbIFZJREVPX01PREVfTlRTQyAgXSA9IFY0TDJfU1REX05UU0NfTSwKLQkJCVsgVklERU9fTU9ERV9TRUNBTSBdID0gVjRMMl9TVERfU0VDQU0sCi0JCQlbIDQgLyogYnR0diAqLyAgICAgXSA9IFY0TDJfU1REX1BBTF9NLAotCQkJWyA1IC8qIGJ0dHYgKi8gICAgIF0gPSBWNEwyX1NURF9QQUxfTiwKLQkJCVsgNiAvKiBidHR2ICovICAgICBdID0gVjRMMl9TVERfTlRTQ19NX0pQLAotCQl9OwotCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdmMgPSBhcmc7CisJCXsKKwkJCXN0YXRpYyBjb25zdCB2NGwyX3N0ZF9pZCBtYXBbXSA9IHsKKwkJCQlbVklERU9fTU9ERV9QQUxdID0gVjRMMl9TVERfUEFMLAorCQkJCVtWSURFT19NT0RFX05UU0NdID0gVjRMMl9TVERfTlRTQ19NLAorCQkJCVtWSURFT19NT0RFX1NFQ0FNXSA9IFY0TDJfU1REX1NFQ0FNLAorCQkJCVs0IC8qIGJ0dHYgKi8gXSA9IFY0TDJfU1REX1BBTF9NLAorCQkJCVs1IC8qIGJ0dHYgKi8gXSA9IFY0TDJfU1REX1BBTF9OLAorCQkJCVs2IC8qIGJ0dHYgKi8gXSA9IFY0TDJfU1REX05UU0NfTV9KUCwKKwkJCX07CisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdmMgPSBhcmc7CiAKLQkJQ0hFQ0tfVjRMMjsKLQkJdC0+bW9kZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCQlDSEVDS19BRERSKHR2X3R1bmVyLCJWSURJT0NTQ0hBTiIsIlRWIik7CisJCQlpZiAoY2hlY2tfdjRsMih0KSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CiAKLQkJaWYgKHZjLT5ub3JtIDwgQVJSQVlfU0laRShtYXApKQotCQkJdC0+c3RkID0gbWFwW3ZjLT5ub3JtXTsKLQkJdHVuZXJfZml4dXBfc3RkKHQpOwotCQlpZiAodC0+ZnJlcSkKLQkJCXNldF90dl9mcmVxKGNsaWVudCx0LT5mcmVxKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DU0ZSRVE6Ci0JewotCQl1bnNpZ25lZCBsb25nICp2ID0gYXJnOworCQkJaWYgKHNldF9tb2RlKGNsaWVudCx0LFY0TDJfVFVORVJfQU5BTE9HX1RWLCAiVklESU9DU0NIQU4iKT09RUlOVkFMKQorCQkJCXJldHVybiAwOwogCi0JCUNIRUNLX01PREUoIlZJRElPQ1NGUkVRIik7Ci0JCUNIRUNLX1Y0TDI7Ci0JCXNldF9mcmVxKGNsaWVudCwqdik7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ0dUVU5FUjoKLQl7Ci0JCXN0cnVjdCB2aWRlb190dW5lciAqdnQgPSBhcmc7Ci0KLQkJQ0hFQ0tfQUREUihyYWRpb190dW5lciwiVklESU9DR1RVTkVSIiwicmFkaW8iKTsKLQkJQ0hFQ0tfVjRMMjsKLQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gdC0+bW9kZSkgewotCQkJaWYgKHQtPmhhc19zaWduYWwpCi0JCQkJdnQtPnNpZ25hbCA9IHQtPmhhc19zaWduYWwoY2xpZW50KTsKLQkJCWlmICh0LT5pc19zdGVyZW8pIHsKLQkJCQlpZiAodC0+aXNfc3RlcmVvKGNsaWVudCkpCi0JCQkJCXZ0LT5mbGFncyB8PSBWSURFT19UVU5FUl9TVEVSRU9fT047Ci0JCQkJZWxzZQotCQkJCQl2dC0+ZmxhZ3MgJj0gflZJREVPX1RVTkVSX1NURVJFT19PTjsKLQkJCX0KLQkJCXZ0LT5mbGFncyB8PSBWNEwyX1RVTkVSX0NBUF9MT1c7IC8qIEFsbG93IGZyZXFzIGF0IDYyLjUgSHogKi8KLQotCQkJdnQtPnJhbmdlbG93ID0gcmFkaW9fcmFuZ2VbMF0gKiAxNjAwMDsKLQkJCXZ0LT5yYW5nZWhpZ2ggPSByYWRpb19yYW5nZVsxXSAqIDE2MDAwOwotCi0JCX0gZWxzZSB7Ci0JCQl2dC0+cmFuZ2Vsb3cgPSB0dl9yYW5nZVswXSAqIDE2OwotCQkJdnQtPnJhbmdlaGlnaCA9IHR2X3JhbmdlWzFdICogMTY7CisJCQlpZiAodmMtPm5vcm0gPCBBUlJBWV9TSVpFKG1hcCkpCisJCQkJdC0+c3RkID0gbWFwW3ZjLT5ub3JtXTsKKwkJCXR1bmVyX2ZpeHVwX3N0ZCh0KTsKKwkJCWlmICh0LT5mcmVxKQorCQkJCXNldF90dl9mcmVxKGNsaWVudCwgdC0+ZnJlcSk7CisJCQlyZXR1cm4gMDsKIAkJfQorCWNhc2UgVklESU9DU0ZSRVE6CisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgKnYgPSBhcmc7CiAKLQkJcmV0dXJuIDA7Ci0JfQorCQkJaWYgKGNoZWNrX21vZGUodCwgIlZJRElPQ1NGUkVRIikgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCQkJaWYgKGNoZWNrX3Y0bDIodCkgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCisJCQlzZXRfZnJlcShjbGllbnQsICp2KTsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NHVFVORVI6CisJCXsKKwkJCXN0cnVjdCB2aWRlb190dW5lciAqdnQgPSBhcmc7CisKKwkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NHVFVORVIiKSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoY2hlY2tfdjRsMih0KSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisKKwkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpIHsKKwkJCQlpZiAodC0+aGFzX3NpZ25hbCkKKwkJCQkJdnQtPnNpZ25hbCA9IHQtPmhhc19zaWduYWwoY2xpZW50KTsKKwkJCQlpZiAodC0+aXNfc3RlcmVvKSB7CisJCQkJCWlmICh0LT5pc19zdGVyZW8oY2xpZW50KSkKKwkJCQkJCXZ0LT5mbGFncyB8PQorCQkJCQkJICAgIFZJREVPX1RVTkVSX1NURVJFT19PTjsKKwkJCQkJZWxzZQorCQkJCQkJdnQtPmZsYWdzICY9CisJCQkJCQkgICAgflZJREVPX1RVTkVSX1NURVJFT19PTjsKKwkJCQl9CisJCQkJdnQtPmZsYWdzIHw9IFZJREVPX1RVTkVSX0xPVzsJLyogQWxsb3cgZnJlcXMgYXQgNjIuNSBIeiAqLworCisJCQkJdnQtPnJhbmdlbG93ID0gcmFkaW9fcmFuZ2VbMF0gKiAxNjAwMDsKKwkJCQl2dC0+cmFuZ2VoaWdoID0gcmFkaW9fcmFuZ2VbMV0gKiAxNjAwMDsKKworCQkJfSBlbHNlIHsKKwkJCQl2dC0+cmFuZ2Vsb3cgPSB0dl9yYW5nZVswXSAqIDE2OworCQkJCXZ0LT5yYW5nZWhpZ2ggPSB0dl9yYW5nZVsxXSAqIDE2OworCQkJfQorCisJCQlyZXR1cm4gMDsKKwkJfQogCWNhc2UgVklESU9DR0FVRElPOgotCXsKLQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKwkJeworCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKIAotCQlDSEVDS19BRERSKHJhZGlvX3R1bmVyLCJWSURJT0NHQVVESU8iLCJyYWRpbyIpOwotCQlDSEVDS19WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlICAmJiAgdC0+aXNfc3RlcmVvKQotCQkJdmEtPm1vZGUgPSB0LT5pc19zdGVyZW8oY2xpZW50KQotCQkJCT8gVklERU9fU09VTkRfU1RFUkVPCi0JCQkJOiBWSURFT19TT1VORF9NT05POwotCQlyZXR1cm4gMDsKLQl9CisJCQlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DR0FVRElPIikgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCQkJaWYgKGNoZWNrX3Y0bDIodCkgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCisJCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlICYmIHQtPmlzX3N0ZXJlbykKKwkJCQl2YS0+bW9kZSA9IHQtPmlzX3N0ZXJlbyhjbGllbnQpCisJCQkJICAgID8gVklERU9fU09VTkRfU1RFUkVPIDogVklERU9fU09VTkRfTU9OTzsKKwkJCXJldHVybiAwOworCQl9CiAKIAljYXNlIFZJRElPQ19TX1NURDoKLQl7Ci0JCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKKwkJeworCQkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOwogCi0JCVNXSVRDSF9WNEwyOwotCQl0LT5tb2RlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JCUNIRUNLX0FERFIodHZfdHVuZXIsIlZJRElPQ19TX1NURCIsIlRWIik7CisJCQlpZiAoc2V0X21vZGUgKGNsaWVudCwgdCwgVjRMMl9UVU5FUl9BTkFMT0dfVFYsICJWSURJT0NfU19TVEQiKQorCQkJCQk9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CiAKLQkJdC0+c3RkID0gKmlkOwotCQl0dW5lcl9maXh1cF9zdGQodCk7Ci0JCWlmICh0LT5mcmVxKQotCQkJc2V0X2ZyZXEoY2xpZW50LHQtPmZyZXEpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisJCQlzd2l0Y2hfdjRsMigpOwogCi0JCUNIRUNLX01PREUoIlZJRElPQ19TX0ZSRVFVRU5DWSIpOwotCQlTV0lUQ0hfVjRMMjsKLQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gZi0+dHlwZSAmJgotCQkgICAgVjRMMl9UVU5FUl9SQURJTyAhPSB0LT5tb2RlKQotCQkJc2V0X3R2X2ZyZXEoY2xpZW50LDQwMCoxNik7Ci0JCXQtPm1vZGUgID0gZi0+dHlwZTsKLQkJc2V0X2ZyZXEoY2xpZW50LGYtPmZyZXF1ZW5jeSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKLQl7Ci0JCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQotCQlDSEVDS19NT0RFKCJWSURJT0NfR19GUkVRVUVOQ1kiKTsKLQkJU1dJVENIX1Y0TDI7Ci0JCWYtPnR5cGUgPSB0LT5tb2RlOwotCQlmLT5mcmVxdWVuY3kgPSB0LT5mcmVxOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19UVU5FUjoKLQl7Ci0JCXN0cnVjdCB2NGwyX3R1bmVyICp0dW5lciA9IGFyZzsKLQotCQlDSEVDS19NT0RFKCJWSURJT0NfR19UVU5FUiIpOwotCQlTV0lUQ0hfVjRMMjsKLQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gdC0+bW9kZSkgewotCQkJaWYgKHQtPmhhc19zaWduYWwpCi0JCQkJdHVuZXIgLT4gc2lnbmFsID0gdC0+aGFzX3NpZ25hbChjbGllbnQpOwotCQkJaWYgKHQtPmlzX3N0ZXJlbykgewotCQkJCWlmICh0LT5pc19zdGVyZW8oY2xpZW50KSkgewotCQkJCQl0dW5lciAtPiByeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPIHwgVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCQl9IGVsc2UgewotCQkJCQl0dW5lciAtPiByeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCQl9Ci0JCQl9Ci0JCQl0dW5lci0+Y2FwYWJpbGl0eSB8PSBWNEwyX1RVTkVSX0NBUF9MT1cgfCBWNEwyX1RVTkVSX0NBUF9TVEVSRU87Ci0JCQl0dW5lci0+YXVkbW9kZSA9IHQtPmF1ZG1vZGU7Ci0KLQkJCXR1bmVyLT5yYW5nZWxvdyA9IHJhZGlvX3JhbmdlWzBdICogMTYwMDA7Ci0JCQl0dW5lci0+cmFuZ2VoaWdoID0gcmFkaW9fcmFuZ2VbMV0gKiAxNjAwMDsKLQkJfSBlbHNlIHsKLQkJCXR1bmVyLT5yYW5nZWxvdyA9IHR2X3JhbmdlWzBdICogMTY7Ci0JCQl0dW5lci0+cmFuZ2VoaWdoID0gdHZfcmFuZ2VbMV0gKiAxNjsKKwkJCXQtPnN0ZCA9ICppZDsKKwkJCXR1bmVyX2ZpeHVwX3N0ZCh0KTsKKwkJCWlmICh0LT5mcmVxKQorCQkJCXNldF9mcmVxKGNsaWVudCwgdC0+ZnJlcSk7CisJCQlicmVhazsKIAkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19UVU5FUjogLyogQWxsb3cgY2hhbmdpbmcgcmFkaW8gcmFuZ2UgYW5kIGF1ZGlvIG1vZGUgKi8KLQl7Ci0JCXN0cnVjdCB2NGwyX3R1bmVyICp0dW5lciA9IGFyZzsKKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwkJeworCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwogCi0JCUNIRUNLX0FERFIocmFkaW9fdHVuZXIsIlZJRElPQ19TX1RVTkVSIiwicmFkaW8iKTsKLQkJU1dJVENIX1Y0TDI7CisJCQl0LT5mcmVxID0gZi0+ZnJlcXVlbmN5OworCQkJc3dpdGNoX3Y0bDIoKTsKKwkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IGYtPnR5cGUgJiYKKwkJCSAgICBWNEwyX1RVTkVSX1JBRElPICE9IHQtPm1vZGUpIHsKKwkJCSAgICAgICAgaWYgKHNldF9tb2RlIChjbGllbnQsIHQsIGYtPnR5cGUsICJWSURJT0NfU19GUkVRVUVOQ1kiKQorCQkJCQkgICAgPT0gRUlOVkFMKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNldF9mcmVxKGNsaWVudCx0LT5mcmVxKTsKIAotCQkvKiBUbyBzd2l0Y2ggdGhlIGF1ZGlvIG1vZGUsIGFwcGxpY2F0aW9ucyBpbml0aWFsaXplIHRoZQotCQkgICBpbmRleCBhbmQgYXVkbW9kZSBmaWVsZHMgYW5kIHRoZSByZXNlcnZlZCBhcnJheSBhbmQKLQkJICAgY2FsbCB0aGUgVklESU9DX1NfVFVORVIgaW9jdGwuICovCi0JCS8qIHJ4c3ViY2hhbm5lbHM6IFY0TDJfVFVORVJfTU9ERV9NT05PLCBWNEwyX1RVTkVSX01PREVfU1RFUkVPLAotCQkgICBWNEwyX1RVTkVSX01PREVfTEFORzEsIFY0TDJfVFVORVJfTU9ERV9MQU5HMiwKLQkJICAgVjRMMl9UVU5FUl9NT0RFX1NBUCAqLworCQkJYnJlYWs7CisJCX0KKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwkJeworCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwogCi0JCWlmICh0dW5lci0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTykKLQkJCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQkJZWxzZQotCQkJdC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJCQlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DX0dfRlJFUVVFTkNZIikgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCQkJc3dpdGNoX3Y0bDIoKTsKKwkJCWYtPnR5cGUgPSB0LT5tb2RlOworCQkJZi0+ZnJlcXVlbmN5ID0gdC0+ZnJlcTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwkJeworCQkJc3RydWN0IHY0bDJfdHVuZXIgKnR1bmVyID0gYXJnOwogCi0JCXNldF9yYWRpb19mcmVxKGNsaWVudCwgdC0+ZnJlcSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFREQTk4ODdfU0VUX0NPTkZJRzogLyogTm90aGluZyB0byBkbyBvbiB0dW5lci1jb3JlICovCi0JCWJyZWFrOworCQkJaWYgKGNoZWNrX21vZGUodCwgIlZJRElPQ19HX1RVTkVSIikgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCQkJc3dpdGNoX3Y0bDIoKTsKKworCQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gdC0+bW9kZSkgeworCisJCQkJaWYgKHQtPmhhc19zaWduYWwpCisJCQkJCXR1bmVyLT5zaWduYWwgPSB0LT5oYXNfc2lnbmFsKGNsaWVudCk7CisKKwkJCQlpZiAodC0+aXNfc3RlcmVvKSB7CisJCQkJCWlmICh0LT5pc19zdGVyZW8oY2xpZW50KSkgeworCQkJCQkJdHVuZXItPnJ4c3ViY2hhbnMgPQorCQkJCQkJICAgIFY0TDJfVFVORVJfU1VCX1NURVJFTyB8CisJCQkJCQkgICAgVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXR1bmVyLT5yeHN1YmNoYW5zID0KKwkJCQkJCSAgICBWNEwyX1RVTkVSX1NVQl9NT05POworCQkJCQl9CisJCQkJfQorCisJCQkJdHVuZXItPmNhcGFiaWxpdHkgfD0KKwkJCQkgICAgVjRMMl9UVU5FUl9DQVBfTE9XIHwgVjRMMl9UVU5FUl9DQVBfU1RFUkVPOworCisJCQkJdHVuZXItPmF1ZG1vZGUgPSB0LT5hdWRtb2RlOworCisJCQkJdHVuZXItPnJhbmdlbG93ID0gcmFkaW9fcmFuZ2VbMF0gKiAxNjAwMDsKKwkJCQl0dW5lci0+cmFuZ2VoaWdoID0gcmFkaW9fcmFuZ2VbMV0gKiAxNjAwMDsKKwkJCX0gZWxzZSB7CisJCQkJdHVuZXItPnJhbmdlbG93ID0gdHZfcmFuZ2VbMF0gKiAxNjsKKwkJCQl0dW5lci0+cmFuZ2VoaWdoID0gdHZfcmFuZ2VbMV0gKiAxNjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSBWSURJT0NfU19UVU5FUjoKKwkJeworCQkJc3RydWN0IHY0bDJfdHVuZXIgKnR1bmVyID0gYXJnOworCisJCQlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DX1NfVFVORVIiKSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisKKwkJCXN3aXRjaF92NGwyKCk7CisKKwkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpIHsKKwkJCQl0LT5hdWRtb2RlID0gdHVuZXItPmF1ZG1vZGU7CisJCQkJc2V0X3JhZGlvX2ZyZXEoY2xpZW50LCB0LT5mcmVxKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CiAJZGVmYXVsdDoKLQkJdHVuZXJfZGJnICgiVW5pbXBsZW1lbnRlZCBJT0NUTCAweCUwOHggY2FsbGVkIHRvIHR1bmVyLlxuIiwgY21kKTsKLQkJLyogbm90aGluZyAqLworCQl0dW5lcl9kYmcoIlVuaW1wbGVtZW50ZWQgSU9DVEwgMHglMDh4IGNhbGxlZCB0byB0dW5lci5cbiIsIGNtZCk7CiAJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHR1bmVyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCitzdGF0aWMgaW50IHR1bmVyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOwotCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IGNvbnRhaW5lcl9vZiAoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEgKGMpOwogCi0JdHVuZXJfZGJnKCJzdXNwZW5kXG4iKTsKKwl0dW5lcl9kYmcgKCJzdXNwZW5kXG4iKTsKIAkvKiBGSVhNRTogcG93ZXIgZG93biA/Pz8gKi8KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0dW5lcl9yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIGxldmVsKQorc3RhdGljIGludCB0dW5lcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKLQlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YgKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhIChjKTsKIAotCXR1bmVyX2RiZygicmVzdW1lXG4iKTsKKwl0dW5lcl9kYmcgKCJyZXN1bWVcbiIpOwogCWlmICh0LT5mcmVxKQotCQlzZXRfZnJlcShjLHQtPmZyZXEpOworCQlzZXRfZnJlcShjLCB0LT5mcmVxKTsKIAlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gInR1bmVyIiwKLSAgICAgICAgLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RVTkVSLAotICAgICAgICAuZmxhZ3MgICAgICAgICAgPSBJMkNfREZfTk9USUZZLAotICAgICAgICAuYXR0YWNoX2FkYXB0ZXIgPSB0dW5lcl9wcm9iZSwKLSAgICAgICAgLmRldGFjaF9jbGllbnQgID0gdHVuZXJfZGV0YWNoLAotICAgICAgICAuY29tbWFuZCAgICAgICAgPSB0dW5lcl9jb21tYW5kLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gInR1bmVyIiwKKwkuaWQgPSBJMkNfRFJJVkVSSURfVFVORVIsCisJLmZsYWdzID0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSB0dW5lcl9wcm9iZSwKKwkuZGV0YWNoX2NsaWVudCA9IHR1bmVyX2RldGFjaCwKKwkuY29tbWFuZCA9IHR1bmVyX2NvbW1hbmQsCiAJLmRyaXZlciA9IHsKLQkJLnN1c3BlbmQgPSB0dW5lcl9zdXNwZW5kLAotCQkucmVzdW1lICA9IHR1bmVyX3Jlc3VtZSwKLQl9LAorCQkgICAuc3VzcGVuZCA9IHR1bmVyX3N1c3BlbmQsCisJCSAgIC5yZXN1bWUgPSB0dW5lcl9yZXN1bWUsCisJCSAgIH0sCiB9Owotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9Ci17CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0gewogCUkyQ19ERVZOQU1FKCIodHVuZXIgdW5zZXQpIiksCi0JLmZsYWdzICAgICAgPSBJMkNfQ0xJRU5UX0FMTE9XX1VTRSwKLSAgICAgICAgLmRyaXZlciAgICAgPSAmZHJpdmVyLAorCS5mbGFncyA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAorCS5kcml2ZXIgPSAmZHJpdmVyLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdHVuZXJfaW5pdF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCmluZGV4IGMzOWVkNjIuLmEzZjhlODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHR1bmVyLXNpbXBsZS5jLHYgMS4zMSAyMDA1LzA2LzIxIDE2OjAyOjI1IG1rcnVma3kgRXhwICQKKyAqICRJZDogdHVuZXItc2ltcGxlLmMsdiAxLjM5IDIwMDUvMDcvMDcgMDE6NDk6MzAgbWtydWZreSBFeHAgJAogICoKICAqIGkyYyB0diB0dW5lciBjaGlwIGRldmljZSBkcml2ZXIKICAqIGNvbnRyb2xzIGFsbCB0aG9zZSBzaW1wbGUgNC1jb250cm9sLWJ5dGVzIHN0eWxlIHR1bmVycy4KQEAgLTU0LDYgKzU0LDI3IEBACiAjZGVmaW5lIFBISUxJUFNfTUZfU0VUX1BBTF9MCTB4MDMgLy8gRnJhbmNlCiAjZGVmaW5lIFBISUxJUFNfTUZfU0VUX1BBTF9MMgkweDAyIC8vIEwnCiAKKy8qIENvbnRyb2wgYnl0ZSAqLworCisjZGVmaW5lIFRVTkVSX1JBVElPX01BU0sgICAgICAgIDB4MDYgLyogQml0IGNiMTpjYjIgKi8KKyNkZWZpbmUgVFVORVJfUkFUSU9fU0VMRUNUXzUwICAgMHgwMAorI2RlZmluZSBUVU5FUl9SQVRJT19TRUxFQ1RfMzIgICAweDAyCisjZGVmaW5lIFRVTkVSX1JBVElPX1NFTEVDVF8xNjYgIDB4MDQKKyNkZWZpbmUgVFVORVJfUkFUSU9fU0VMRUNUXzYyICAgMHgwNgorCisjZGVmaW5lIFRVTkVSX0NIQVJHRV9QVU1QICAgICAgIDB4NDAgIC8qIEJpdCBjYjYgKi8KKworLyogU3RhdHVzIGJ5dGUgKi8KKworI2RlZmluZSBUVU5FUl9QT1IJICAweDgwCisjZGVmaW5lIFRVTkVSX0ZMICAgICAgICAgIDB4NDAKKyNkZWZpbmUgVFVORVJfTU9ERSAgICAgICAgMHgzOAorI2RlZmluZSBUVU5FUl9BRkMgICAgICAgICAweDA3CisjZGVmaW5lIFRVTkVSX1NJR05BTCAgICAgIDB4MDcKKyNkZWZpbmUgVFVORVJfU1RFUkVPICAgICAgMHgxMAorCisjZGVmaW5lIFRVTkVSX1BMTF9MT0NLRUQgICAweDQwCisjZGVmaW5lIFRVTkVSX1NURVJFT19NSzMgICAweDA0CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMjExLDIxICsyMzIsMTcgQEAKIAkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHhjZSw2MjMgfSwKIAl7ICJQaGlsaXBzIEZRMTIzNkEgTUs0IiwgUGhpbGlwcywgTlRTQywKIAkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzIgfSwKLQotCS8qIFNob3VsZCB3b3JrIGZvciBUVkY4NTMxTUYsIFRWRjg4MzFNRiwgVFZGODczMU1GICovCi0JeyAiWW1lYyBUVmlzaW9uIFRWRi04NTMxTUYiLCBQaGlsaXBzLCBOVFNDLAorCXsgIlltZWMgVFZpc2lvbiBUVkYtODUzMU1GLzg4MzFNRi84NzMxTUYiLCBQaGlsaXBzLCBOVFNDLAogCSAgMTYqMTYwLjAwLDE2KjQ1NC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCiAJeyAiWW1lYyBUVmlzaW9uIFRWRi01NTMzTUYiLCBQaGlsaXBzLCBOVFNDLAogCSAgMTYqMTYwLjAwLDE2KjQ1NC4wMCwweDAxLDB4MDIsMHgwNCwweDhlLDczMn0sCisKIAl7ICJUaG9tc29uIEREVCA3NjExIChBVFNDL05UU0MpIiwgVEhPTVNPTiwgQVRTQywKIAkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHgzOSwweDNhLDB4M2MsMHg4ZSw3MzJ9LAotCS8qIFNob3VsZCB3b3JrIGZvciBUTkY5NTMzLUQvSUYsIFRORjk1MzMtQi9ERiAqLwotCXsgIlRlbmEgVE5GOTUzMy1EL0lGIiwgUGhpbGlwcywgUEFMLAorCXsgIlRlbmEgVE5GOTUzMy1EL0lGL1RORjk1MzMtQi9ERiIsIFBoaWxpcHMsIFBBTCwKICAgICAgICAgICAxNioxNjAuMjUsMTYqNDY0LjI1LDB4MDEsMHgwMiwweDA0LDB4OGUsNjIzfSwKLQotCS8qIFRoaXMgZW50cnkgaXMgZm9yIFRFQTU3NjcgRk0gcmFkaW8gb25seSBjaGlwIHVzZWQgb24gc2V2ZXJhbCBib2FyZHMgdy9UViB0dW5lciAqLwotCXsgVEVBNTc2N19UVU5FUl9OQU1FLCBQaGlsaXBzLCBSQURJTywKLSAgICAgICAgICAtMSwgLTEsIDAsIDAsIDAsIFRFQTU3NjdfTE9XX0xPXzMyNzY4LDB9LAorCXsgIlBoaWxpcHMgVEVBNTc2N0hOIEZNIFJhZGlvIiwgUGhpbGlwcywgUkFESU8sCisgICAgICAgICAgLyogc2VlIHRlYTU3NjcuYyBmb3IgZGV0YWlscyAqL30sCiAJeyAiUGhpbGlwcyBGTUQxMjE2TUUgTUszIEh5YnJpZCBUdW5lciIsIFBoaWxpcHMsIFBBTCwKIAkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHg1MSwweDUyLDB4NTQsMHg4Niw2MjMgfSwKIH07CkBAIC0yNDQsMTUgKzI2MSw2IEBACiAJcmV0dXJuIGJ5dGU7CiB9CiAKLSNkZWZpbmUgVFVORVJfUE9SICAgICAgIDB4ODAKLSNkZWZpbmUgVFVORVJfRkwgICAgICAgIDB4NDAKLSNkZWZpbmUgVFVORVJfTU9ERSAgICAgIDB4MzgKLSNkZWZpbmUgVFVORVJfQUZDICAgICAgIDB4MDcKLQotI2RlZmluZSBUVU5FUl9TVEVSRU8gICAgICAgMHgxMCAvKiByYWRpbyBtb2RlICovCi0jZGVmaW5lIFRVTkVSX1NURVJFT19NSzMgICAweDA0IC8qIHJhZGlvIG1vZGUgKi8KLSNkZWZpbmUgVFVORVJfU0lHTkFMICAgICAgIDB4MDcgLyogcmFkaW8gbW9kZSAqLwotCiBzdGF0aWMgaW50IHR1bmVyX3NpZ25hbChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKIHsKIAlyZXR1cm4gKHR1bmVyX2dldHN0YXR1cyhjKSAmIFRVTkVSX1NJR05BTCkgPDwgMTM7CkBAIC0yNzgsMjIgKzI4Niw2IEBACiAJcmV0dXJuIHN0ZXJlbzsKIH0KIAotI2lmIDAgLyogdW51c2VkICovCi1zdGF0aWMgaW50IHR1bmVyX2lzbG9ja2VkIChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLSAgICAgICAgcmV0dXJuICh0dW5lcl9nZXRzdGF0dXMgKGMpICYgVFVORVJfRkwpOwotfQotCi1zdGF0aWMgaW50IHR1bmVyX2FmY3N0YXR1cyAoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0gICAgICAgIHJldHVybiAodHVuZXJfZ2V0c3RhdHVzIChjKSAmIFRVTkVSX0FGQykgLSAyOwotfQotCi1zdGF0aWMgaW50IHR1bmVyX21vZGUgKHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotICAgICAgICByZXR1cm4gKHR1bmVyX2dldHN0YXR1cyAoYykgJiBUVU5FUl9NT0RFKSA+PiAzOwotfQotI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMzc2LDcgKzM2OCw3IEBACiAKIAljYXNlIFRVTkVSX01JQ1JPVFVORV80MDQyRkk1OgogCQkvKiBTZXQgdGhlIGNoYXJnZSBwdW1wIGZvciBmYXN0IHR1bmluZyAqLwotCQl0dW4tPmNvbmZpZyB8PSAweDQwOworCQl0dW4tPmNvbmZpZyB8PSBUVU5FUl9DSEFSR0VfUFVNUDsKIAkJYnJlYWs7CiAJfQogCkBAIC00MjUsMTQgKzQxNywxMyBAQAogCQkJCXR1bmVyX3dhcm4oImkyYyBpL28gcmVhZCBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQkvKiBiaXQgNiBpcyBQTEwgbG9ja2VkIGluZGljYXRvciAqLwotCQkJaWYgKHN0YXR1c19ieXRlICYgMHg0MCkKKwkJCWlmIChzdGF0dXNfYnl0ZSAmIFRVTkVSX1BMTF9MT0NLRUQpCiAJCQkJYnJlYWs7CiAJCQl1ZGVsYXkoMTApOwogCQl9CiAKIAkJLyogU2V0IHRoZSBjaGFyZ2UgcHVtcCBmb3Igb3B0aW1pemVkIHBoYXNlIG5vaXNlIGZpZ3VyZSAqLwotCQl0dW4tPmNvbmZpZyAmPSB+MHg0MDsKKwkJdHVuLT5jb25maWcgJj0gflRVTkVSX0NIQVJHRV9QVU1QOwogCQlidWZmZXJbMF0gPSAoZGl2Pj44KSAmIDB4N2Y7CiAJCWJ1ZmZlclsxXSA9IGRpdiAgICAgICYgMHhmZjsKIAkJYnVmZmVyWzJdID0gdHVuLT5jb25maWc7CkBAIC00NTMsMjYgKzQ0NCwyMiBAQAogCXVuc2lnbmVkIGRpdjsKIAlpbnQgcmM7CiAKLQl0dW49JnR1bmVyc1t0LT50eXBlXTsKLQlkaXYgPSAoZnJlcSAvIDEwMDApICsgKGludCkoMTYqMTAuNyk7Ci0JYnVmZmVyWzJdID0gdHVuLT5jb25maWc7CisJdHVuID0gJnR1bmVyc1t0LT50eXBlXTsKKwlkaXYgPSAoMjAgKiBmcmVxIC8gMTYwMDApICsgKGludCkoMjAqMTAuNyk7IC8qIElGIDEwLjcgTUh6ICovCisJYnVmZmVyWzJdID0gKHR1bi0+Y29uZmlnICYgflRVTkVSX1JBVElPX01BU0spIHwgVFVORVJfUkFUSU9fU0VMRUNUXzUwOyAvKiA1MCBrSHogc3RlcCAqLwogCiAJc3dpdGNoICh0LT50eXBlKSB7CiAJY2FzZSBUVU5FUl9URU5BXzk1MzNfREk6CiAJY2FzZSBUVU5FUl9ZTUVDX1RWRl81NTMzTUY6Ci0JCS8qVGhlc2UgdmFsdWVzIGFyZSBlbXBpcmljYWxseSBkZXRlcm1pbmF0ZWQgKi8KLQkJZGl2ID0gKGZyZXEgKiAxMjIpIC8gMTYwMDAgLSAyMDsKLQkJYnVmZmVyWzJdID0gMHg4ODsgLyogY291bGQgYmUgYWxzbyAweDgwICovCi0JCWJ1ZmZlclszXSA9IDB4MTk7IC8qIGNvdWxkIGJlIGFsc28gMHgxMCwgMHgxOCwgMHg5OSAqLwotCQlicmVhazsKKwkJdHVuZXJfZGJnICgiVGhpcyB0dW5lciBkb2Vzbid0IGhhdmUgRk0uIE1vc3QgY2FyZHMgaGFzIGEgVEVBNTc2NyBmb3IgRk1cbiIpOworCQlyZXR1cm47CiAJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMzoKIAljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMzoKIAljYXNlIFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMzoKIAkJYnVmZmVyWzNdID0gMHgxOTsKIAkJYnJlYWs7CiAJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDM6Ci0JCWRpdiA9ICgyMCAqIGZyZXEpIC8gMTYwMDAgKyAzMzMgKiAyOwotCSAgICAgICAgYnVmZmVyWzJdID0gMHg4MDsKKwkJZGl2ID0gKDIwICogZnJlcSkgLyAxNjAwMCArIChpbnQpKDMzLjMgKiAyMCk7ICAvKiBJRiAzMy4zIE1IeiAqLwogCQlidWZmZXJbM10gPSAweDE5OwogCQlicmVhazsKIAljYXNlIFRVTkVSX0xHX1BBTF9GTToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKaW5kZXggOWE0OTNiZS4uZDhiNzhmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKQEAgLTg2NCwxMyArODY0LDggQEAKIAkJICogQnV0IGNoYW5naW5nIHRoZSBtb2RlIHRvIFZJREVPX1NPVU5EX01PTk8gd291bGQgc3dpdGNoCiAJCSAqIGV4dGVybmFsIDQwNTIgbXVsdGlwbGV4ZXIgaW4gYXVkaW9faG9vaygpLgogCQkgKi8KLSNpZiAwCi0JCWlmKChuc3IgJiAweDAyKSAmJiAhKGRzciAmIDB4MTApKSAvKiBOU1IuUy9NQj0xIGFuZCBEU1IuQU1TVEFUPTAgKi8KLQkJCW1vZGUgfD0gVklERU9fU09VTkRfU1RFUkVPOwotI2Vsc2UKIAkJaWYobnNyICYgMHgwMikgLyogTlNSLlMvTUI9MSAqLwogCQkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87Ci0jZW5kaWYKIAkJaWYobnNyICYgMHgwMSkgLyogTlNSLkQvU0I9MSAqLwogCQkJbW9kZSB8PSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKaW5kZXggMGYwM2MyNS4uZThkOTQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwpAQCAtNDAwLDE0ICs0MDAsNiBAQAogCQl9CiAJfQogCi0jaWYgMAotCWlmICh0X2Zvcm1hdCA8IHNpemVvZihoYXVwcGF1Z2VfdHVuZXJfZm10KS9zaXplb2Yoc3RydWN0IEhBVVBQQVVHRV9UVU5FUl9GTVQpKSB7Ci0JCXR2ZWUtPnR1bmVyX2Zvcm1hdHMgPSBoYXVwcGF1Z2VfdHVuZXJfZm10W3RfZm9ybWF0XS5pZDsKLQkJdF9mbXRfbmFtZSA9IGhhdXBwYXVnZV90dW5lcl9mbXRbdF9mb3JtYXRdLm5hbWU7Ci0JfSBlbHNlIHsKLQkJdF9mbXRfbmFtZSA9ICI8dW5rbm93bj4iOwotCX0KLSNlbmRpZgogCiAJVFZFRVBST01fS0VSTl9JTkZPKCJIYXVwcGF1Z2U6IG1vZGVsID0gJWQsIHJldiA9ICVzLCBzZXJpYWwjID0gJWRcbiIsCiAJCSAgIHR2ZWUtPm1vZGVsLApAQCAtNDgyLDYgKzQ3NCw3IEBACiAJMHhhMCA+PiAxLAogCUkyQ19DTElFTlRfRU5ELAogfTsKKwogSTJDX0NMSUVOVF9JTlNNT0Q7CiAKIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfdHZlZXByb207CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCmluZGV4IDhiNjIzMjcuLmZmYmU2ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCkBAIC0xMzYzLDE5ICsxMzYzLDcgQEAKIAl1MzIgZGV2aWNlX3N0YXRlOwogCU1QVF9BREFQVEVSICppb2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlzd2l0Y2goc3RhdGUpCi0JewotCQljYXNlIDE6IC8qIFMxICovCi0JCQlkZXZpY2Vfc3RhdGU9MTsgLyogRDEgKi87Ci0JCQlicmVhazsKLQkJY2FzZSAzOiAvKiBTMyAqLwotCQljYXNlIDQ6IC8qIFM0ICovCi0JCQlkZXZpY2Vfc3RhdGU9MzsgLyogRDMgKi87Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUFHQUlOIC8qRklYTUUqLzsKLQkJCWJyZWFrOwotCX0KKwlkZXZpY2Vfc3RhdGU9cGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSk7CiAKIAlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVAogCSJwY2ktc3VzcGVuZDogcGRldj0weCVwLCBzbG90PSVzLCBFbnRlcmluZyBvcGVyYXRpbmcgc3RhdGUgW0QlZF1cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmgKaW5kZXggNWVhODliZi4uZGViYjhhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguaApAQCAtODQsNyArODQsNyBAQAogZXh0ZXJuIHZvaWQgbXB0c2NzaWhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICopOwogZXh0ZXJuIHZvaWQgbXB0c2NzaWhfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKik7CiAjaWZkZWYgQ09ORklHX1BNCi1leHRlcm4gaW50IG1wdHNjc2loX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSk7CitleHRlcm4gaW50IG1wdHNjc2loX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gaW50IG1wdHNjc2loX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiAjZW5kaWYKIGV4dGVybiBpbnQgbXB0c2NzaWhfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBmdW5jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vY29uZmlnLW9zbS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9jb25maWctb3NtLmMKaW5kZXggZDAyNjc2MC4uZmUyZTdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9jb25maWctb3NtLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9jb25maWctb3NtLmMKQEAgLTE1LDcgKzE1LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyby5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggNGNlY2RhZi4uN2ZjNjkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTYsOCArNiw3IEBACiAKIGNvbmZpZyBJQk1fQVNNCiAJdHJpc3RhdGUgIkRldmljZSBkcml2ZXIgZm9yIElCTSBSU0Egc2VydmljZSBwcm9jZXNzb3IiCi0JZGVwZW5kcyBvbiBYODYgJiYgRVhQRVJJTUVOVEFMCi0JZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBYODYgJiYgUENJICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGV2aWNlIGRyaXZlciBzdXBwb3J0IGZvciBpbi1iYW5kIGFjY2VzcyB0byB0aGUKIAkgIElCTSBSU0EgKENvbmRvcikgc2VydmljZSBwcm9jZXNzb3IgaW4gZVNlcnZlciB4U2VyaWVzIHN5c3RlbXMuCkBAIC0yMiw3ICsyMSw3IEBACiAJICAKIAkgIFdBUk5JTkc6IFRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgb3IgZnVuY3Rpb24KIAkgIGNvcnJlY3RseSBvbiB5b3VyIElCTSBzZXJ2ZXIuIFBsZWFzZSBjb25zdWx0IHRoZSBJQk0gU2VydmVyUHJvdmVuCi0JICB3ZWJzaXRlIDxodHRwOi8vd3d3LnBjLmlibS93dy9lc2VydmVyL3hzZXJpZXMvc2VydmVycHJvdmVuPiBmb3IKKwkgIHdlYnNpdGUgPGh0dHA6Ly93d3cucGMuaWJtLmNvbS93dy9lc2VydmVyL3hzZXJpZXMvc2VydmVycHJvdmVuPiBmb3IKIAkgIGluZm9ybWF0aW9uIG9uIHRoZSBzcGVjaWZpYyBkcml2ZXIgbGV2ZWwgYW5kIHN1cHBvcnQgc3RhdGVtZW50CiAJICBmb3IgeW91ciBJQk0gc2VydmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZwppbmRleCBkNjgyZGJjLi5kZjk1ZDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKQEAgLTEsNSArMSw1IEBACiAjIGRyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKLSMgJElkOiBLY29uZmlnLHYgMS4xMyAyMDA0LzEyLzAxIDE1OjQ5OjEwIG5pY28gRXhwICQKKyMgJElkOiBLY29uZmlnLHYgMS4xNSAyMDA1LzA2LzA2IDIzOjA0OjM1IHRwb3lub3IgRXhwICQKIAogbWVudSAiUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBNVEQhPW4KQEAgLTE1NSw2ICsxNTUsMzEgQEAKIAkgIElmIHlvdXIgZmxhc2ggY2hpcHMgYXJlIGludGVybGVhdmVkIGluIGVpZ2h0cyAtIGkuZS4geW91IGhhdmUgZWlnaHQKIAkgIGZsYXNoIGNoaXBzIGFkZHJlc3NlZCBieSBlYWNoIGJ1cyBjeWNsZSwgdGhlbiBzYXkgJ1knLgogCitjb25maWcgTVREX09UUAorCWJvb2wgIlByb3RlY3Rpb24gUmVnaXN0ZXJzIGFrYSBvbmUtdGltZSBwcm9ncmFtbWFibGUgKE9UUCkgYml0cyIKKwlkZXBlbmRzIG9uIE1URF9DRklfQURWX09QVElPTlMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgcmVhZGluZywgd3JpdGluZyBhbmQgbG9ja2luZyBzbyBjYWxsZWQKKwkgICJQcm90ZWN0aW9uIFJlZ2lzdGVycyIgcHJlc2VudCBvbiBzb21lIGZsYXNoIGNoaXBzLgorCSAgQSBzdWJzZXQgb2YgdGhlbSBhcmUgcHJlLXByb2dyYW1tZWQgYXQgdGhlIGZhY3Rvcnkgd2l0aCBhCisJICB1bmlxdWUgc2V0IG9mIHZhbHVlcy4gVGhlIHJlc3QgaXMgdXNlci1wcm9ncmFtbWFibGUuCisKKwkgIFRoZSB1c2VyLXByb2dyYW1tYWJsZSBQcm90ZWN0aW9uIFJlZ2lzdGVycyBjb250YWluIG9uZS10aW1lCisJICBwcm9ncmFtbWFibGUgKE9UUCkgYml0czsgd2hlbiBwcm9ncmFtbWVkLCByZWdpc3RlciBiaXRzIGNhbm5vdCBiZQorCSAgZXJhc2VkLiBFYWNoIFByb3RlY3Rpb24gUmVnaXN0ZXIgY2FuIGJlIGFjY2Vzc2VkIG11bHRpcGxlIHRpbWVzIHRvCisJICBwcm9ncmFtIGluZGl2aWR1YWwgYml0cywgYXMgbG9uZyBhcyB0aGUgcmVnaXN0ZXIgcmVtYWlucyB1bmxvY2tlZC4KKworCSAgRWFjaCBQcm90ZWN0aW9uIFJlZ2lzdGVyIGhhcyBhbiBhc3NvY2lhdGVkIExvY2sgUmVnaXN0ZXIgYml0LiBXaGVuIGEKKwkgIExvY2sgUmVnaXN0ZXIgYml0IGlzIHByb2dyYW1tZWQsIHRoZSBhc3NvY2lhdGVkIFByb3RlY3Rpb24gUmVnaXN0ZXIKKwkgIGNhbiBvbmx5IGJlIHJlYWQ7IGl0IGNhbiBubyBsb25nZXIgYmUgcHJvZ3JhbW1lZC4gQWRkaXRpb25hbGx5LAorCSAgYmVjYXVzZSB0aGUgTG9jayBSZWdpc3RlciBiaXRzIHRoZW1zZWx2ZXMgYXJlIE9UUCwgd2hlbiBwcm9ncmFtbWVkLAorCSAgTG9jayBSZWdpc3RlciBiaXRzIGNhbm5vdCBiZSBlcmFzZWQuIFRoZXJlZm9yZSwgd2hlbiBhIFByb3RlY3Rpb24KKwkgIFJlZ2lzdGVyIGlzIGxvY2tlZCwgaXQgY2Fubm90IGJlIHVubG9ja2VkLgorCisJICBUaGlzIGZlYXR1cmUgc2hvdWxkIHRoZXJlZm9yZSBiZSB1c2VkIHdpdGggZXh0cmVtZSBjYXJlLiBBbnkgbWlzdGFrZQorCSAgaW4gdGhlIHByb2dyYW1taW5nIG9mIE9UUCBiaXRzIHdpbGwgd2FzdGUgdGhlbS4KKwogY29uZmlnIE1URF9DRklfSU5URUxFWFQKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgSW50ZWwvU2hhcnAgZmxhc2ggY2hpcHMiCiAJZGVwZW5kcyBvbiBNVERfR0VOX1BST0JFCkBAIC0yNzUsNyArMzAwLDcgQEAKIAogY29uZmlnIE1URF9YSVAKIAlib29sICJYSVAgYXdhcmUgTVREIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhU01QICYmIE1URF9DRklfSU5URUxFWFQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiAhU01QICYmIChNVERfQ0ZJX0lOVEVMRVhUIHx8IE1URF9DRklfQU1EU1REKSAmJiBFWFBFUklNRU5UQUwgJiYgQVJNCiAJZGVmYXVsdCB5IGlmIFhJUF9LRVJORUwKIAloZWxwCiAJICBUaGlzIGFsbG93cyBNVEQgc3VwcG9ydCB0byB3b3JrIHdpdGggZmxhc2ggbWVtb3J5IHdoaWNoIGlzIGFsc28KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2FtZF9mbGFzaC5jIGIvZHJpdmVycy9tdGQvY2hpcHMvYW1kX2ZsYXNoLmMKaW5kZXggNDFlMmUzZS4uMmRhZmViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvYW1kX2ZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvYW1kX2ZsYXNoLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQXV0aG9yOiBKb25hcyBIb2xtYmVyZyA8am9uYXMuaG9sbWJlcmdAYXhpcy5jb20+CiAgKgotICogJElkOiBhbWRfZmxhc2guYyx2IDEuMjYgMjAwNC8xMS8yMCAxMjo0OTowNCBkd213MiBFeHAgJAorICogJElkOiBhbWRfZmxhc2guYyx2IDEuMjcgMjAwNS8wMi8wNCAwNzo0MzowOSBqb25hc2hnIEV4cCAkCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAxIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqCkBAIC02Nyw3ICs2Nyw2IEBACiAjZGVmaW5lIEFNMjlMVjE2MERUCTB4MjJDNAogI2RlZmluZSBBTTI5TFYxNjBEQgkweDIyNDkKICNkZWZpbmUgQU0yOUJEUzMyM0QgICAgIDB4MjJEMQotI2RlZmluZSBBTTI5QkRTNjQzRAkweDIyN0UKIAogLyogQXRtZWwgKi8KICNkZWZpbmUgQVQ0OXhWMTZ4CTB4MDBDMApAQCAtNjE4LDE3ICs2MTcsNiBAQAogCQkJeyAub2Zmc2V0ID0gMHgzZjAwMDAsIC5lcmFzZXNpemUgPSAweDAyMDAwLCAubnVtYmxvY2tzID0gIDggfSwKIAkJfQogCX0sIHsKLQkJLm1mcl9pZCA9IE1BTlVGQUNUVVJFUl9BTUQsCi0JCS5kZXZfaWQgPSBBTTI5QkRTNjQzRCwKLQkJLm5hbWUgPSAiQU1EIEFNMjlCRFM2NDNEIiwKLQkJLnNpemUgPSAweDAwODAwMDAwLAotCQkubnVtZXJhc2VyZWdpb25zID0gMywKLQkJLnJlZ2lvbnMgPSB7Ci0JCQl7IC5vZmZzZXQgPSAweDAwMDAwMCwgLmVyYXNlc2l6ZSA9IDB4MTAwMDAsIC5udW1ibG9ja3MgPSA5NiB9LAotCQkJeyAub2Zmc2V0ID0gMHg2MDAwMDAsIC5lcmFzZXNpemUgPSAweDEwMDAwLCAubnVtYmxvY2tzID0gMzEgfSwKLQkJCXsgLm9mZnNldCA9IDB4N2YwMDAwLCAuZXJhc2VzaXplID0gMHgwMjAwMCwgLm51bWJsb2NrcyA9ICA4IH0sCi0JCX0KLQl9LCB7CiAJCS5tZnJfaWQgPSBNQU5VRkFDVFVSRVJfQVRNRUwsCiAJCS5kZXZfaWQgPSBBVDQ5eFYxNngsCiAJCS5uYW1lID0gIkF0bWVsIEFUNDl4VjE2eCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCmluZGV4IGMyNjhiY2QuLjBjZmNkODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCkBAIC00LDcgKzQsNyBAQAogICoKICAqIChDKSAyMDAwIFJlZCBIYXQuIEdQTCdkCiAgKgotICogJElkOiBjZmlfY21kc2V0XzAwMDEuYyx2IDEuMTY0IDIwMDQvMTEvMTYgMTg6Mjk6MDAgZHdtdzIgRXhwICQKKyAqICRJZDogY2ZpX2NtZHNldF8wMDAxLmMsdiAxLjE3OCAyMDA1LzA1LzE5IDE3OjA1OjQzIG5pY28gRXhwICQKICAqCiAgKiAKICAqIDEwLzEwLzIwMDAJTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC94aXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgpAQCAtNDgsMTYgKzQ5LDI1IEBACiAjZGVmaW5lIE01MExQVzA4MCAgICAgICAweDAwMkYKIAogc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOwotLy9zdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX3VzZXJfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKLS8vc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF9mYWN0X3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QsIHNpemVfdCAqLCB1X2NoYXIgKik7CiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF93cml0ZV93b3JkcyhzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QsIHNpemVfdCAqLCBjb25zdCB1X2NoYXIgKik7CiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF93cml0ZV9idWZmZXJzKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIGNvbnN0IHVfY2hhciAqKTsKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2VyYXNlX3ZhcnNpemUoc3RydWN0IG10ZF9pbmZvICosIHN0cnVjdCBlcmFzZV9pbmZvICopOwogc3RhdGljIHZvaWQgY2ZpX2ludGVsZXh0X3N5bmMgKHN0cnVjdCBtdGRfaW5mbyAqKTsKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOwogc3RhdGljIGludCBjZmlfaW50ZWxleHRfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKTsKKyNpZmRlZiBDT05GSUdfTVREX09UUAorc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF9mYWN0X3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QsIHNpemVfdCAqLCB1X2NoYXIgKik7CitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX3VzZXJfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3dyaXRlX3VzZXJfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2xvY2tfdXNlcl9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2dldF9mYWN0X3Byb3RfaW5mbyAoc3RydWN0IG10ZF9pbmZvICosCisJCQkJCSAgICBzdHJ1Y3Qgb3RwX2luZm8gKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2dldF91c2VyX3Byb3RfaW5mbyAoc3RydWN0IG10ZF9pbmZvICosCisJCQkJCSAgICBzdHJ1Y3Qgb3RwX2luZm8gKiwgc2l6ZV90KTsKKyNlbmRpZgogc3RhdGljIGludCBjZmlfaW50ZWxleHRfc3VzcGVuZCAoc3RydWN0IG10ZF9pbmZvICopOwogc3RhdGljIHZvaWQgY2ZpX2ludGVsZXh0X3Jlc3VtZSAoc3RydWN0IG10ZF9pbmZvICopOworc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVib290IChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKIAogc3RhdGljIHZvaWQgY2ZpX2ludGVsZXh0X2Rlc3Ryb3koc3RydWN0IG10ZF9pbmZvICopOwogCkBAIC0yNTIsNyArMjYyLDggQEAKIAkJaW50IG5iX3BhcnRzLCBpOwogCiAJCS8qIFByb3RlY3Rpb24gUmVnaXN0ZXIgaW5mbyAqLwotCQlleHRyYV9zaXplICs9IChleHRwLT5OdW1Qcm90ZWN0aW9uRmllbGRzIC0gMSkgKiAoNCArIDYpOworCQlleHRyYV9zaXplICs9IChleHRwLT5OdW1Qcm90ZWN0aW9uRmllbGRzIC0gMSkgKgorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjZmlfaW50ZWxleHRfb3RwaW5mbyk7CiAKIAkJLyogQnVyc3QgUmVhZCBpbmZvICovCiAJCWV4dHJhX3NpemUgKz0gNjsKQEAgLTMyNCw3ICszMzUsOSBAQAogCW10ZC0+cmVzdW1lICA9IGNmaV9pbnRlbGV4dF9yZXN1bWU7CiAJbXRkLT5mbGFncyAgID0gTVREX0NBUF9OT1JGTEFTSDsKIAltdGQtPm5hbWUgICAgPSBtYXAtPm5hbWU7Ci0JCisKKwltdGQtPnJlYm9vdF9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gY2ZpX2ludGVsZXh0X3JlYm9vdDsKKwogCWlmIChjZmktPmNmaV9tb2RlID09IENGSV9NT0RFX0NGSSkgewogCQkvKiAKIAkJICogSXQncyBhIHJlYWwgQ0ZJIGNoaXAsIG5vdCBvbmUgZm9yIHdoaWNoIHRoZSBwcm9iZQpAQCAtNDIyLDkgKzQzNSwxMyBAQAogCQkgICAgICAgbXRkLT5lcmFzZXJlZ2lvbnNbaV0ubnVtYmxvY2tzKTsKIAl9CiAKLSNpZiAwCi0JbXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcgPSBjZmlfaW50ZWxleHRfcmVhZF91c2VyX3Byb3RfcmVnOworI2lmZGVmIENPTkZJR19NVERfT1RQCiAJbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcgPSBjZmlfaW50ZWxleHRfcmVhZF9mYWN0X3Byb3RfcmVnOworCW10ZC0+cmVhZF91c2VyX3Byb3RfcmVnID0gY2ZpX2ludGVsZXh0X3JlYWRfdXNlcl9wcm90X3JlZzsKKwltdGQtPndyaXRlX3VzZXJfcHJvdF9yZWcgPSBjZmlfaW50ZWxleHRfd3JpdGVfdXNlcl9wcm90X3JlZzsKKwltdGQtPmxvY2tfdXNlcl9wcm90X3JlZyA9IGNmaV9pbnRlbGV4dF9sb2NrX3VzZXJfcHJvdF9yZWc7CisJbXRkLT5nZXRfZmFjdF9wcm90X2luZm8gPSBjZmlfaW50ZWxleHRfZ2V0X2ZhY3RfcHJvdF9pbmZvOworCW10ZC0+Z2V0X3VzZXJfcHJvdF9pbmZvID0gY2ZpX2ludGVsZXh0X2dldF91c2VyX3Byb3RfaW5mbzsKICNlbmRpZgogCiAJLyogVGhpcyBmdW5jdGlvbiBoYXMgdGhlIHBvdGVudGlhbCB0byBkaXN0b3J0IHRoZSByZWFsaXR5CkBAIC00MzMsNiArNDUwLDcgQEAKIAkJZ290byBzZXR1cF9lcnI7CiAKIAlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmbXRkLT5yZWJvb3Rfbm90aWZpZXIpOwogCXJldHVybiBtdGQ7CiAKICBzZXR1cF9lcnI6CkBAIC00NzEsNyArNDg5LDggQEAKIAkJaW50IG9mZnMsIG51bXJlZ2lvbnMsIG51bXBhcnRzLCBwYXJ0c2hpZnQsIG51bXZpcnRjaGlwcywgaSwgajsKIAogCQkvKiBQcm90ZWN0aW9uIFJlZ2lzdGVyIGluZm8gKi8KLQkJb2ZmcyA9IChleHRwLT5OdW1Qcm90ZWN0aW9uRmllbGRzIC0gMSkgKiAoNCArIDYpOworCQlvZmZzID0gKGV4dHAtPk51bVByb3RlY3Rpb25GaWVsZHMgLSAxKSAqCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGNmaV9pbnRlbGV4dF9vdHBpbmZvKTsKIAogCQkvKiBCdXJzdCBSZWFkIGluZm8gKi8KIAkJb2ZmcyArPSA2OwpAQCAtNTYzLDcgKzU4Miw3IEBACiAgcmVzZXR0aW1lOgogCXRpbWVvID0gamlmZmllcyArIEhaOwogIHJldHJ5OgotCWlmIChjaGlwLT5wcml2ICYmIChtb2RlID09IEZMX1dSSVRJTkcgfHwgbW9kZSA9PSBGTF9FUkFTSU5HKSkgeworCWlmIChjaGlwLT5wcml2ICYmIChtb2RlID09IEZMX1dSSVRJTkcgfHwgbW9kZSA9PSBGTF9FUkFTSU5HIHx8IG1vZGUgPT0gRkxfT1RQX1dSSVRFKSkgewogCQkvKgogCQkgKiBPSy4gV2UgaGF2ZSBwb3NzaWJpbGl0eSBmb3IgY29udGVuc2lvbiBvbiB0aGUgd3JpdGUvZXJhc2UKIAkJICogb3BlcmF0aW9ucyB3aGljaCBhcmUgZ2xvYmFsIHRvIHRoZSByZWFsIGNoaXAgYW5kIG5vdCBwZXIKQEAgLTgwNywxMCArODI2LDYgQEAKICAqIGFzc2VtYmx5IHRvIG1ha2Ugc3VyZSBpbmxpbmUgZnVuY3Rpb25zIHdlcmUgYWN0dWFsbHkgaW5saW5lZCBhbmQgdGhhdCBnY2MKICAqIGRpZG4ndCBlbWl0IGNhbGxzIHRvIGl0cyBvd24gc3VwcG9ydCBmdW5jdGlvbnMpLiBBbHNvIGNvbmZpZ3VyaW5nIE1URCBDRkkKICAqIHN1cHBvcnQgdG8gYSBzaW5nbGUgYnVzd2lkdGggYW5kIGEgc2luZ2xlIGludGVybGVhdmUgaXMgYWxzbyByZWNvbW1lbmRlZC4KLSAqIE5vdGUgdGhhdCBub3Qgb25seSBJUlFzIGFyZSBkaXNhYmxlZCBidXQgdGhlIHByZWVtcHRpb24gY291bnQgaXMgYWxzbwotICogaW5jcmVhc2VkIHRvIHByZXZlbnQgb3RoZXIgbG9ja2luZyBwcmltaXRpdmVzIChuYW1lbHkgc3Bpbl91bmxvY2spIGZyb20KLSAqIGRlY3JlbWVudGluZyB0aGUgcHJlZW1wdCBjb3VudCB0byB6ZXJvIGFuZCBzY2hlZHVsaW5nIHRoZSBDUFUgYXdheSB3aGlsZQotICogbm90IGluIGFycmF5IG1vZGUuCiAgKi8KIAogc3RhdGljIHZvaWQgeGlwX2Rpc2FibGUoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsCkBAIC04MTgsNyArODMzLDYgQEAKIHsKIAkvKiBUT0RPOiBjaGlwcyB3aXRoIG5vIFhJUCB1c2Ugc2hvdWxkIGlnbm9yZSBhbmQgcmV0dXJuICovCiAJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYWRyKTsgLyogZW5zdXJlIG1tdSBtYXBwaW5nIGlzIHVwIHRvIGRhdGUgKi8KLQlwcmVlbXB0X2Rpc2FibGUoKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogfQogCkBAIC04MzEsOSArODQ1LDggQEAKIAkJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKIAl9CiAJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYWRyKTsKLQlhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsgLyogZmlsbCBpbnN0cnVjdGlvbiBwcmVmZXRjaCAqLworCXhpcF9pcHJlZmV0Y2goKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKIH0KIAogLyoKQEAgLTkwOSw3ICs5MjIsNyBAQAogCQkJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYWRyKTsKIAkJCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOwogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOwogCQkJY29uZF9yZXNjaGVkKCk7CiAKQEAgLTkxOSwxNSArOTMyLDE1IEBACiAJCQkgKiBhIHN1c3BlbmRlZCBlcmFzZSBzdGF0ZS4gIElmIHNvIGxldCdzIHdhaXQKIAkJCSAqIHVudGlsIGl0J3MgZG9uZS4KIAkJCSAqLwotCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkJd2hpbGUgKGNoaXAtPnN0YXRlICE9IG5ld3N0YXRlKSB7CiAJCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQkJCXByZWVtcHRfZW5hYmxlKCk7CisJCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJCXNjaGVkdWxlKCk7CiAJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCX0KIAkJCS8qIERpc2FsbG93IFhJUCBhZ2FpbiAqLwogCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKQEAgLTk1NiwxMiArOTY5LDE0IEBACiAgKiBUaGUgSU5WQUxJREFURV9DQUNIRURfUkFOR0UoKSBtYWNybyBpcyBub3JtYWxseSB1c2VkIGluIHBhcmFsbGVsIHdoaWxlCiAgKiB0aGUgZmxhc2ggaXMgYWN0aXZlbHkgcHJvZ3JhbW1pbmcgb3IgZXJhc2luZyBzaW5jZSB3ZSBoYXZlIHRvIHBvbGwgZm9yCiAgKiB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGFueXdheS4gIFdlIGNhbid0IGRvIHRoYXQgaW4gYSBnZW5lcmljIHdheSB3aXRoCi0gKiBhIFhJUCBzZXR1cCBzbyBkbyBpdCBiZWZvcmUgdGhlIGFjdHVhbCBmbGFzaCBvcGVyYXRpb24gaW4gdGhpcyBjYXNlLgorICogYSBYSVAgc2V0dXAgc28gZG8gaXQgYmVmb3JlIHRoZSBhY3R1YWwgZmxhc2ggb3BlcmF0aW9uIGluIHRoaXMgY2FzZQorICogYW5kIHN0dWIgaXQgb3V0IGZyb20gSU5WQUxJREFURV9DQUNIRV9VREVMQVkuCiAgKi8KLSN1bmRlZiBJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRQotI2RlZmluZSBJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRSh4Li4uKQotI2RlZmluZSBYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKG1hcCwgZnJvbSwgc2l6ZSkgXAotCWRvIHsgaWYobWFwLT5pbnZhbF9jYWNoZSkgbWFwLT5pbnZhbF9jYWNoZShtYXAsIGZyb20sIHNpemUpOyB9IHdoaWxlKDApCisjZGVmaW5lIFhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBmcm9tLCBzaXplKSAgXAorCUlOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgZnJvbSwgc2l6ZSkKKworI2RlZmluZSBJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsIGFkciwgbGVuLCB1c2VjKSAgXAorCVVERUxBWShtYXAsIGNoaXAsIGFkciwgdXNlYykKIAogLyoKICAqIEV4dHJhIG5vdGVzOgpAQCAtOTg0LDExICs5OTksMjMgQEAKIAogI2RlZmluZSB4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcikKICNkZWZpbmUgeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcikKLQotI2RlZmluZSBVREVMQVkobWFwLCBjaGlwLCBhZHIsIHVzZWMpICBjZmlfdWRlbGF5KHVzZWMpCi0KICNkZWZpbmUgWElQX0lOVkFMX0NBQ0hFRF9SQU5HRSh4Li4uKQogCisjZGVmaW5lIFVERUxBWShtYXAsIGNoaXAsIGFkciwgdXNlYykgIFwKK2RvIHsgIFwKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7ICBcCisJY2ZpX3VkZWxheSh1c2VjKTsgIFwKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsIGFkciwgbGVuLCB1c2VjKSAgXAorZG8geyAgXAorCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsgIFwKKwlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsgIFwKKwljZmlfdWRlbGF5KHVzZWMpOyAgXAorCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7ICBcCit9IHdoaWxlICgwKQorCiAjZW5kaWYKIAogc3RhdGljIGludCBkb19wb2ludF9vbmVjaGlwIChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgbG9mZl90IGFkciwgc2l6ZV90IGxlbikKQEAgLTExNzYsMTExICsxMjAzLDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmIDAKLXN0YXRpYyBpbnQgX194aXByYW0gY2ZpX2ludGVsZXh0X3JlYWRfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAotCQkJCQkJbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCi0JCQkJCQlzaXplX3QgKnJldGxlbiwKLQkJCQkJCXVfY2hhciAqYnVmLAotCQkJCQkJaW50IGJhc2Vfb2Zmc3QsIGludCByZWdfc3opCi17Ci0Jc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7Ci0Jc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7Ci0Jc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OwotCXN0cnVjdCBmbGNoaXAgKmNoaXA7Ci0JaW50IG9mc19mYWN0b3IgPSBjZmktPmludGVybGVhdmUgKiBjZmktPmRldmljZV90eXBlOwotCWludCBjb3VudCA9IGxlbjsKLQlpbnQgY2hpcF9udW0sIG9mZnN0OwotCWludCByZXQ7Ci0KLQljaGlwX251bSA9ICgodW5zaWduZWQgaW50KWZyb20vcmVnX3N6KTsKLQlvZmZzdCA9IGZyb20gLSAocmVnX3N6KmNoaXBfbnVtKStiYXNlX29mZnN0OwotCi0Jd2hpbGUgKGNvdW50KSB7Ci0JLyogQ2FsY3VsYXRlIHdoaWNoIGNoaXAgJiBwcm90ZWN0aW9uIHJlZ2lzdGVyIG9mZnNldCB3ZSBuZWVkICovCi0KLQkJaWYgKGNoaXBfbnVtID49IGNmaS0+bnVtY2hpcHMpCi0JCQlnb3RvIG91dDsKLQotCQljaGlwID0gJmNmaS0+Y2hpcHNbY2hpcF9udW1dOwotCQkKLQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKLQkJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBjaGlwLT5zdGFydCwgRkxfSkVERUNfUVVFUlkpOwotCQlpZiAocmV0KSB7Ci0JCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCQlyZXR1cm4gKGxlbi1jb3VudCk/OnJldDsKLQkJfQotCi0JCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQpOwotCi0JCWlmIChjaGlwLT5zdGF0ZSAhPSBGTF9KRURFQ19RVUVSWSkgewotCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4OTApLCBjaGlwLT5zdGFydCk7Ci0JCQljaGlwLT5zdGF0ZSA9IEZMX0pFREVDX1FVRVJZOwotCQl9Ci0KLQkJd2hpbGUgKGNvdW50ICYmICgob2Zmc3QtYmFzZV9vZmZzdCkgPCByZWdfc3opKSB7Ci0JCQkqYnVmID0gbWFwX3JlYWQ4KG1hcCwoY2hpcC0+c3RhcnQrKChleHRwLT5Qcm90UmVnQWRkcisxKSpvZnNfZmFjdG9yKStvZmZzdCkpOwotCQkJYnVmKys7Ci0JCQlvZmZzdCsrOwotCQkJY291bnQtLTsKLQkJfQotCi0JCXhpcF9lbmFibGUobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7Ci0JCXB1dF9jaGlwKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQpOwotCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0KLQkJLyogTW92ZSBvbiB0byB0aGUgbmV4dCBjaGlwICovCi0JCWNoaXBfbnVtKys7Ci0JCW9mZnN0ID0gYmFzZV9vZmZzdDsKLQl9Ci0JCi0gb3V0OgkKLQlyZXR1cm4gbGVuLWNvdW50OwotfQotCQotc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF91c2VyX3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKLQlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKLQlzdHJ1Y3QgY2ZpX3ByaV9pbnRlbGV4dCAqZXh0cD1jZmktPmNtZHNldF9wcml2OwotCWludCBiYXNlX29mZnN0LHJlZ19zejsKLQkKLQkvKiBDaGVjayB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBwcm90ZWN0aW9uIHJlZ2lzdGVycyAqLwotCWlmKCFleHRwIHx8ICEoZXh0cC0+RmVhdHVyZVN1cHBvcnQmNjQpKXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRoaXMgZmxhc2ggZGV2aWNlIGhhcyBubyBwcm90ZWN0aW9uIGRhdGEgdG8gcmVhZCFcbiIsbWFwLT5uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYmFzZV9vZmZzdD0oMTw8ZXh0cC0+RmFjdFByb3RSZWdTaXplKTsKLQlyZWdfc3o9KDE8PGV4dHAtPlVzZXJQcm90UmVnU2l6ZSk7Ci0KLQlyZXR1cm4gY2ZpX2ludGVsZXh0X3JlYWRfcHJvdF9yZWcobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBiYXNlX29mZnN0LCByZWdfc3opOwotfQotCi1zdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX2ZhY3RfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQotewotCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OwotCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwotCXN0cnVjdCBjZmlfcHJpX2ludGVsZXh0ICpleHRwPWNmaS0+Y21kc2V0X3ByaXY7Ci0JaW50IGJhc2Vfb2Zmc3QscmVnX3N6OwotCQotCS8qIENoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIHByb3RlY3Rpb24gcmVnaXN0ZXJzICovCi0JaWYoIWV4dHAgfHwgIShleHRwLT5GZWF0dXJlU3VwcG9ydCY2NCkpewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhpcyBmbGFzaCBkZXZpY2UgaGFzIG5vIHByb3RlY3Rpb24gZGF0YSB0byByZWFkIVxuIixtYXAtPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQliYXNlX29mZnN0PTA7Ci0JcmVnX3N6PSgxPDxleHRwLT5GYWN0UHJvdFJlZ1NpemUpOwotCi0JcmV0dXJuIGNmaV9pbnRlbGV4dF9yZWFkX3Byb3RfcmVnKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sIGJ1ZiwgYmFzZV9vZmZzdCwgcmVnX3N6KTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IF9feGlwcmFtIGRvX3dyaXRlX29uZXdvcmQoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGFkciwgbWFwX3dvcmQgZGF0dW0pCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkciwgbWFwX3dvcmQgZGF0dW0sIGludCBtb2RlKQogewogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwotCW1hcF93b3JkIHN0YXR1cywgc3RhdHVzX09LOworCW1hcF93b3JkIHN0YXR1cywgc3RhdHVzX09LLCB3cml0ZV9jbWQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lbzsKIAlpbnQgeiwgcmV0PTA7CiAKQEAgLTEyODgsOSArMTIxNSwxNCBAQAogCiAJLyogTGV0J3MgZGV0ZXJtaW5lIHRoaXMgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcmxlYXZlIG9ubHkgb25jZSAqLwogCXN0YXR1c19PSyA9IENNRCgweDgwKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEZMX1dSSVRJTkc6ICAgd3JpdGVfY21kID0gQ01EKDB4NDApOyBicmVhazsKKwljYXNlIEZMX09UUF9XUklURTogd3JpdGVfY21kID0gQ01EKDB4YzApOyBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwotCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9XUklUSU5HKTsKKwlyZXQgPSBnZXRfY2hpcChtYXAsIGNoaXAsIGFkciwgbW9kZSk7CiAJaWYgKHJldCkgewogCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCXJldHVybiByZXQ7CkBAIC0xMjk5LDE5ICsxMjMxLDE4IEBACiAJWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbWFwX2Jhbmt3aWR0aChtYXApKTsKIAlFTkFCTEVfVlBQKG1hcCk7CiAJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBhZHIpOwotCW1hcF93cml0ZShtYXAsIENNRCgweDQwKSwgYWRyKTsKKwltYXBfd3JpdGUobWFwLCB3cml0ZV9jbWQsIGFkcik7CiAJbWFwX3dyaXRlKG1hcCwgZGF0dW0sIGFkcik7Ci0JY2hpcC0+c3RhdGUgPSBGTF9XUklUSU5HOworCWNoaXAtPnN0YXRlID0gbW9kZTsKIAotCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbWFwX2Jhbmt3aWR0aChtYXApKTsKLQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIGNoaXAtPndvcmRfd3JpdGVfdGltZSk7Ci0Jc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBtYXBfYmFua3dpZHRoKG1hcCksCisJCQkJY2hpcC0+d29yZF93cml0ZV90aW1lKTsKIAogCXRpbWVvID0gamlmZmllcyArIChIWi8yKTsKIAl6ID0gMDsKIAlmb3IgKDs7KSB7Ci0JCWlmIChjaGlwLT5zdGF0ZSAhPSBGTF9XUklUSU5HKSB7CisJCWlmIChjaGlwLT5zdGF0ZSAhPSBtb2RlKSB7CiAJCQkvKiBTb21lb25lJ3Mgc3VzcGVuZGVkIHRoZSB3cml0ZS4gU2xlZXAgKi8KIAkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCkBAIC0xMzM5LDEwICsxMjcwLDggQEAKIAkJfQogCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJeisrOwogCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEpOwotCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCX0KIAlpZiAoIXopIHsKIAkJY2hpcC0+d29yZF93cml0ZV90aW1lLS07CkBAIC0xMzk5LDcgKzEzMjgsNyBAQAogCQlkYXR1bSA9IG1hcF93b3JkX2xvYWRfcGFydGlhbChtYXAsIGRhdHVtLCBidWYsIGdhcCwgbik7CiAKIAkJcmV0ID0gZG9fd3JpdGVfb25ld29yZChtYXAsICZjZmktPmNoaXBzW2NoaXBudW1dLAotCQkJCQkgICAgICAgYnVzX29mcywgZGF0dW0pOworCQkJCQkgICAgICAgYnVzX29mcywgZGF0dW0sIEZMX1dSSVRJTkcpOwogCQlpZiAocmV0KSAKIAkJCXJldHVybiByZXQ7CiAKQEAgLTE0MjAsNyArMTM0OSw3IEBACiAJCW1hcF93b3JkIGRhdHVtID0gbWFwX3dvcmRfbG9hZChtYXAsIGJ1Zik7CiAKIAkJcmV0ID0gZG9fd3JpdGVfb25ld29yZChtYXAsICZjZmktPmNoaXBzW2NoaXBudW1dLAotCQkJCW9mcywgZGF0dW0pOworCQkJCSAgICAgICBvZnMsIGRhdHVtLCBGTF9XUklUSU5HKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTE0NDQsNyArMTM3Myw3IEBACiAJCWRhdHVtID0gbWFwX3dvcmRfbG9hZF9wYXJ0aWFsKG1hcCwgZGF0dW0sIGJ1ZiwgMCwgbGVuKTsKIAogCQlyZXQgPSBkb193cml0ZV9vbmV3b3JkKG1hcCwgJmNmaS0+Y2hpcHNbY2hpcG51bV0sCi0JCQkJCSAgICAgICBvZnMsIGRhdHVtKTsKKwkJCQkgICAgICAgb2ZzLCBkYXR1bSwgRkxfV1JJVElORyk7CiAJCWlmIChyZXQpIAogCQkJcmV0dXJuIHJldDsKIAkJCkBAIC0xNTA2LDkgKzE0MzUsNyBAQAogCQlpZiAobWFwX3dvcmRfYW5kZXF1YWwobWFwLCBzdGF0dXMsIHN0YXR1c19PSywgc3RhdHVzX09LKSkKIAkJCWJyZWFrOwogCi0JCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJVURFTEFZKG1hcCwgY2hpcCwgY21kX2FkciwgMSk7Ci0JCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAKIAkJaWYgKCsreiA+IDIwKSB7CiAJCQkvKiBBcmdoLiBOb3QgcmVhZHkgZm9yIHdyaXRlIHRvIGJ1ZmZlciAqLwpAQCAtMTU1NCwxMCArMTQ4MSw5IEBACiAJbWFwX3dyaXRlKG1hcCwgQ01EKDB4ZDApLCBjbWRfYWRyKTsKIAljaGlwLT5zdGF0ZSA9IEZMX1dSSVRJTkc7CiAKLQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JSU5WQUxJREFURV9DQUNIRURfUkFOR0UobWFwLCBhZHIsIGxlbik7Ci0JVURFTEFZKG1hcCwgY2hpcCwgY21kX2FkciwgY2hpcC0+YnVmZmVyX3dyaXRlX3RpbWUpOwotCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJSU5WQUxJREFURV9DQUNIRV9VREVMQVkobWFwLCBjaGlwLCAKKwkJCQljbWRfYWRyLCBsZW4sCisJCQkJY2hpcC0+YnVmZmVyX3dyaXRlX3RpbWUpOwogCiAJdGltZW8gPSBqaWZmaWVzICsgKEhaLzIpOwogCXogPSAwOwpAQCAtMTU4OSwxMCArMTUxNSw4IEBACiAJCX0KIAkJCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQkJVURFTEFZKG1hcCwgY2hpcCwgY21kX2FkciwgMSk7CiAJCXorKzsKLQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJVURFTEFZKG1hcCwgY2hpcCwgY21kX2FkciwgMSk7CiAJfQogCWlmICgheikgewogCQljaGlwLT5idWZmZXJfd3JpdGVfdGltZS0tOwpAQCAtMTcyMCwxMCArMTY0NCw5IEBACiAJY2hpcC0+c3RhdGUgPSBGTF9FUkFTSU5HOwogCWNoaXAtPmVyYXNlX3N1c3BlbmRlZCA9IDA7CiAKLQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JSU5WQUxJREFURV9DQUNIRURfUkFOR0UobWFwLCBhZHIsIGxlbik7Ci0JVURFTEFZKG1hcCwgY2hpcCwgYWRyLCBjaGlwLT5lcmFzZV90aW1lKjEwMDAvMik7Ci0Jc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBsZW4sCisJCQkJY2hpcC0+ZXJhc2VfdGltZSoxMDAwLzIpOwogCiAJLyogRklYTUUuIFVzZSBhIHRpbWVyIHRvIGNoZWNrIHRoaXMsIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuICovCiAJLyogT25jZSB0aGUgc3RhdGUgbWFjaGluZSdzIGtub3duIHRvIGJlIHdvcmtpbmcgSSdsbCBkbyB0aGF0ICovCkBAIC0xNzY4LDkgKzE2OTEsNyBAQAogCQl9CiAJCQogCQkvKiBMYXRlbmN5IGlzc3Vlcy4gRHJvcCB0aGUgbG9jaywgd2FpdCBhIHdoaWxlIGFuZCByZXRyeSAqLwotCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMTAwMDAwMC9IWik7Ci0JCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJfQogCiAJLyogV2UndmUgYnJva2VuIHRoaXMgYmVmb3JlLiBJdCBkb2Vzbid0IGh1cnQgdG8gYmUgc2FmZSAqLwpAQCAtMTc4MCw0NCArMTcwMSwzNCBAQAogCiAJLyogY2hlY2sgZm9yIGxvY2sgYml0ICovCiAJaWYgKG1hcF93b3JkX2JpdHNzZXQobWFwLCBzdGF0dXMsIENNRCgweDNhKSkpIHsKLQkJdW5zaWduZWQgY2hhciBjaGlwc3RhdHVzOworCQl1bnNpZ25lZCBsb25nIGNoaXBzdGF0dXM7CiAKIAkJLyogUmVzZXQgdGhlIGVycm9yIGJpdHMgKi8KIAkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4NTApLCBhZHIpOwogCQltYXBfd3JpdGUobWFwLCBDTUQoMHg3MCksIGFkcik7CiAJCXhpcF9lbmFibGUobWFwLCBjaGlwLCBhZHIpOwogCi0JCWNoaXBzdGF0dXMgPSBzdGF0dXMueFswXTsKLQkJaWYgKCFtYXBfd29yZF9lcXVhbChtYXAsIHN0YXR1cywgQ01EKGNoaXBzdGF0dXMpKSkgewotCQkJaW50IGksIHc7Ci0JCQlmb3IgKHc9MDsgdzxtYXBfd29yZHMobWFwKTsgdysrKSB7Ci0JCQkJZm9yIChpID0gMDsgaTxjZmlfaW50ZXJsZWF2ZShjZmkpOyBpKyspIHsKLQkJCQkJY2hpcHN0YXR1cyB8PSBzdGF0dXMueFt3XSA+PiAoY2ZpLT5kZXZpY2VfdHlwZSAqIDgpOwotCQkJCX0KLQkJCX0KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlN0YXR1cyBpcyBub3QgaWRlbnRpY2FsIGZvciBhbGwgY2hpcHM6IDB4JWx4LiBNZXJnaW5nIHRvIGdpdmUgMHglMDJ4XG4iLAotCQkJICAgICAgIHN0YXR1cy54WzBdLCBjaGlwc3RhdHVzKTsKLQkJfQorCQljaGlwc3RhdHVzID0gTUVSR0VTVEFUVVMoc3RhdHVzKTsKIAogCQlpZiAoKGNoaXBzdGF0dXMgJiAweDMwKSA9PSAweDMwKSB7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNoaXAgcmVwb3J0cyBpbXByb3BlciBjb21tYW5kIHNlcXVlbmNlOiBzdGF0dXMgMHgleFxuIiwgY2hpcHN0YXR1cyk7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNoaXAgcmVwb3J0cyBpbXByb3BlciBjb21tYW5kIHNlcXVlbmNlOiBzdGF0dXMgMHglbHhcbiIsIGNoaXBzdGF0dXMpOwogCQkJcmV0ID0gLUVJTzsKIAkJfSBlbHNlIGlmIChjaGlwc3RhdHVzICYgMHgwMikgewogCQkJLyogUHJvdGVjdGlvbiBiaXQgc2V0ICovCiAJCQlyZXQgPSAtRVJPRlM7CiAJCX0gZWxzZSBpZiAoY2hpcHN0YXR1cyAmIDB4OCkgewogCQkJLyogVm9sdGFnZSAqLwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2hpcCByZXBvcnRzIHZvbHRhZ2UgbG93IG9uIGVyYXNlOiBzdGF0dXMgMHgleFxuIiwgY2hpcHN0YXR1cyk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDaGlwIHJlcG9ydHMgdm9sdGFnZSBsb3cgb24gZXJhc2U6IHN0YXR1cyAweCVseFxuIiwgY2hpcHN0YXR1cyk7CiAJCQlyZXQgPSAtRUlPOwogCQl9IGVsc2UgaWYgKGNoaXBzdGF0dXMgJiAweDIwKSB7CiAJCQlpZiAocmV0cmllcy0tKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNoaXAgZXJhc2UgZmFpbGVkIGF0IDB4JTA4bHg6IHN0YXR1cyAweCV4LiBSZXRyeWluZy4uLlxuIiwgYWRyLCBjaGlwc3RhdHVzKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hpcCBlcmFzZSBmYWlsZWQgYXQgMHglMDhseDogc3RhdHVzIDB4JWx4LiBSZXRyeWluZy4uLlxuIiwgYWRyLCBjaGlwc3RhdHVzKTsKIAkJCQl0aW1lbyA9IGppZmZpZXMgKyBIWjsKIAkJCQlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7CiAJCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJCWdvdG8gcmV0cnk7CiAJCQl9Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hpcCBlcmFzZSBmYWlsZWQgYXQgMHglMDhseDogc3RhdHVzIDB4JXhcbiIsIGFkciwgY2hpcHN0YXR1cyk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hpcCBlcmFzZSBmYWlsZWQgYXQgMHglMDhseDogc3RhdHVzIDB4JWx4XG4iLCBhZHIsIGNoaXBzdGF0dXMpOwogCQkJcmV0ID0gLUVJTzsKIAkJfQogCX0gZWxzZSB7CkBAIC0xODgyLDYgKzE3OTMsNyBAQAogCQkKIAkJaWYgKGNoaXAtPnN0YXRlID09IEZMX1NZTkNJTkcpIHsKIAkJCWNoaXAtPnN0YXRlID0gY2hpcC0+b2xkc3RhdGU7CisJCQljaGlwLT5vbGRzdGF0ZSA9IEZMX1JFQURZOwogCQkJd2FrZV91cCgmY2hpcC0+d3EpOwogCQl9CiAJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKQEAgLTE4OTcsOCArMTgwOSw5IEBACiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CiAJaW50IHN0YXR1cywgb2ZzX2ZhY3RvciA9IGNmaS0+aW50ZXJsZWF2ZSAqIGNmaS0+ZGV2aWNlX3R5cGU7CiAKKwlhZHIgKz0gY2hpcC0+c3RhcnQ7CiAJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBhZHIrKDIqb2ZzX2ZhY3RvcikpOwotCWNmaV9zZW5kX2dlbl9jbWQoMHg5MCwgMHg1NSwgMCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOworCW1hcF93cml0ZShtYXAsIENNRCgweDkwKSwgYWRyKygyKm9mc19mYWN0b3IpKTsKIAljaGlwLT5zdGF0ZSA9IEZMX0pFREVDX1FVRVJZOwogCXN0YXR1cyA9IGNmaV9yZWFkX3F1ZXJ5KG1hcCwgYWRyKygyKm9mc19mYWN0b3IpKTsKIAl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgMCk7CkBAIC0xOTE1LDYgKzE4MjgsNyBAQAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkciwgaW50IGxlbiwgdm9pZCAqdGh1bmspCiB7CiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OwogCW1hcF93b3JkIHN0YXR1cywgc3RhdHVzX09LOwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgSFo7CiAJaW50IHJldDsKQEAgLTE5NDQsOSArMTg1OCwxMyBAQAogCX0gZWxzZQogCQlCVUcoKTsKIAotCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEwMDAwMDAvSFopOwotCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJLyoKKwkgKiBJZiBJbnN0YW50IEluZGl2aWR1YWwgQmxvY2sgTG9ja2luZyBzdXBwb3J0ZWQgdGhlbiBubyBuZWVkCisJICogdG8gZGVsYXkuCisJICovCisKKwlpZiAoIWV4dHAgfHwgIShleHRwLT5GZWF0dXJlU3VwcG9ydCAmICgxIDw8IDUpKSkKKwkJVURFTEFZKG1hcCwgY2hpcCwgYWRyLCAxMDAwMDAwL0haKTsKIAogCS8qIEZJWE1FLiBVc2UgYSB0aW1lciB0byBjaGVjayB0aGlzLCBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LiAqLwogCS8qIE9uY2UgdGhlIHN0YXRlIG1hY2hpbmUncyBrbm93biB0byBiZSB3b3JraW5nIEknbGwgZG8gdGhhdCAqLwpAQCAtMTk3Myw5ICsxODkxLDcgQEAKIAkJfQogCQkKIAkJLyogTGF0ZW5jeSBpc3N1ZXMuIERyb3AgdGhlIGxvY2ssIHdhaXQgYSB3aGlsZSBhbmQgcmV0cnkgKi8KLQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEpOwotCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCX0KIAkKIAkvKiBEb25lIGFuZCBoYXBweS4gKi8KQEAgLTIwMzQsNiArMTk1MCwyNzQgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX01URF9PVFAKKwordHlwZWRlZiBpbnQgKCpvdHBfb3BfdCkoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIAorCQkJdV9sb25nIGRhdGFfb2Zmc2V0LCB1X2NoYXIgKmJ1ZiwgdV9pbnQgc2l6ZSwKKwkJCXVfbG9uZyBwcm90X29mZnNldCwgdV9pbnQgZ3JvdXBubywgdV9pbnQgZ3JvdXBzaXplKTsKKworc3RhdGljIGludCBfX3hpcHJhbQorZG9fb3RwX3JlYWQoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIHVfbG9uZyBvZmZzZXQsCisJICAgIHVfY2hhciAqYnVmLCB1X2ludCBzaXplLCB1X2xvbmcgcHJvdCwgdV9pbnQgZ3Jwbm8sIHVfaW50IGdycHN6KQoreworCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OworCWludCByZXQ7CisKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQsIEZMX0pFREVDX1FVRVJZKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBsZXQncyBlbnN1cmUgd2UncmUgbm90IHJlYWRpbmcgYmFjayBjYWNoZWQgZGF0YSBmcm9tIGFycmF5IG1vZGUgKi8KKwlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGNoaXAtPnN0YXJ0ICsgb2Zmc2V0LCBzaXplKTsKKworCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQpOworCWlmIChjaGlwLT5zdGF0ZSAhPSBGTF9KRURFQ19RVUVSWSkgeworCQltYXBfd3JpdGUobWFwLCBDTUQoMHg5MCksIGNoaXAtPnN0YXJ0KTsKKwkJY2hpcC0+c3RhdGUgPSBGTF9KRURFQ19RVUVSWTsKKwl9CisJbWFwX2NvcHlfZnJvbShtYXAsIGJ1ZiwgY2hpcC0+c3RhcnQgKyBvZmZzZXQsIHNpemUpOworCXhpcF9lbmFibGUobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7CisKKwkvKiB0aGVuIGVuc3VyZSB3ZSBkb24ndCBrZWVwIE9UUCBkYXRhIGluIHRoZSBjYWNoZSAqLworCUlOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgY2hpcC0+c3RhcnQgKyBvZmZzZXQsIHNpemUpOworCisJcHV0X2NoaXAobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19vdHBfd3JpdGUoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIHVfbG9uZyBvZmZzZXQsCisJICAgICB1X2NoYXIgKmJ1ZiwgdV9pbnQgc2l6ZSwgdV9sb25nIHByb3QsIHVfaW50IGdycG5vLCB1X2ludCBncnBzeikKK3sKKwlpbnQgcmV0OworCisJd2hpbGUgKHNpemUpIHsKKwkJdW5zaWduZWQgbG9uZyBidXNfb2ZzID0gb2Zmc2V0ICYgfihtYXBfYmFua3dpZHRoKG1hcCktMSk7CisJCWludCBnYXAgPSBvZmZzZXQgLSBidXNfb2ZzOworCQlpbnQgbiA9IG1pbl90KGludCwgc2l6ZSwgbWFwX2Jhbmt3aWR0aChtYXApLWdhcCk7CisJCW1hcF93b3JkIGRhdHVtID0gbWFwX3dvcmRfZmYobWFwKTsKKworCQlkYXR1bSA9IG1hcF93b3JkX2xvYWRfcGFydGlhbChtYXAsIGRhdHVtLCBidWYsIGdhcCwgbik7CisJCXJldCA9IGRvX3dyaXRlX29uZXdvcmQobWFwLCBjaGlwLCBidXNfb2ZzLCBkYXR1bSwgRkxfT1RQX1dSSVRFKTsKKwkJaWYgKHJldCkgCisJCQlyZXR1cm4gcmV0OworCisJCW9mZnNldCArPSBuOworCQlidWYgKz0gbjsKKwkJc2l6ZSAtPSBuOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19vdHBfbG9jayhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdV9sb25nIG9mZnNldCwKKwkgICAgdV9jaGFyICpidWYsIHVfaW50IHNpemUsIHVfbG9uZyBwcm90LCB1X2ludCBncnBubywgdV9pbnQgZ3Jwc3opCit7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJbWFwX3dvcmQgZGF0dW07CisKKwkvKiBtYWtlIHN1cmUgYXJlYSBtYXRjaGVzIGdyb3VwIGJvdW5kYXJpZXMgKi8KKwlpZiAoc2l6ZSAhPSBncnBzeikKKwkJcmV0dXJuIC1FWERFVjsKKworCWRhdHVtID0gbWFwX3dvcmRfZmYobWFwKTsKKwlkYXR1bSA9IG1hcF93b3JkX2NscihtYXAsIGRhdHVtLCBDTUQoMSA8PCBncnBubykpOworCXJldHVybiBkb193cml0ZV9vbmV3b3JkKG1hcCwgY2hpcCwgcHJvdCwgZGF0dW0sIEZMX09UUF9XUklURSk7Cit9CisKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X290cF93YWxrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkJCQkgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmLAorCQkJCSBvdHBfb3BfdCBhY3Rpb24sIGludCB1c2VyX3JlZ3MpCit7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OworCXN0cnVjdCBmbGNoaXAgKmNoaXA7CisJc3RydWN0IGNmaV9pbnRlbGV4dF9vdHBpbmZvICpvdHA7CisJdV9sb25nIGRldnNpemUsIHJlZ19wcm90X29mZnNldCwgZGF0YV9vZmZzZXQ7CisJdV9pbnQgY2hpcF9udW0sIGNoaXBfc3RlcCwgZmllbGQsIHJlZ19mYWN0X3NpemUsIHJlZ191c2VyX3NpemU7CisJdV9pbnQgZ3JvdXBzLCBncm91cG5vLCBncm91cHNpemUsIHJlZ19mYWN0X2dyb3VwcywgcmVnX3VzZXJfZ3JvdXBzOworCWludCByZXQ7CisKKwkqcmV0bGVuID0gMDsKKworCS8qIENoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIE9UUCByZWdpc3RlcnMgKi8KKwlpZiAoIWV4dHAgfHwgIShleHRwLT5GZWF0dXJlU3VwcG9ydCAmIDY0KSB8fCAhZXh0cC0+TnVtUHJvdGVjdGlvbkZpZWxkcykKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJLyogd2UgbmVlZCByZWFsIGNoaXBzIGhlcmUgbm90IHZpcnR1YWwgb25lcyAqLworCWRldnNpemUgPSAoMSA8PCBjZmktPmNmaXEtPkRldlNpemUpICogY2ZpLT5pbnRlcmxlYXZlOworCWNoaXBfc3RlcCA9IGRldnNpemUgPj4gY2ZpLT5jaGlwc2hpZnQ7CisJY2hpcF9udW0gPSAwOworCisJLyogU29tZSBjaGlwcyBoYXZlIE9UUCBsb2NhdGVkIGluIHRoZSBfdG9wXyBwYXJ0aXRpb24gb25seS4KKwkgICBGb3IgZXhhbXBsZTogSW50ZWwgMjhGMjU2TDE4VCAoVCBtZWFucyB0b3AtcGFyYW1ldGVyIGRldmljZSkgKi8KKwlpZiAoY2ZpLT5tZnIgPT0gTUFOVUZBQ1RVUkVSX0lOVEVMKSB7CisJCXN3aXRjaCAoY2ZpLT5pZCkgeworCQljYXNlIDB4ODgwYjoKKwkJY2FzZSAweDg4MGM6CisJCWNhc2UgMHg4ODBkOgorCQkJY2hpcF9udW0gPSBjaGlwX3N0ZXAgLSAxOworCQl9CisJfQorCisJZm9yICggOyBjaGlwX251bSA8IGNmaS0+bnVtY2hpcHM7IGNoaXBfbnVtICs9IGNoaXBfc3RlcCkgeworCQljaGlwID0gJmNmaS0+Y2hpcHNbY2hpcF9udW1dOworCQlvdHAgPSAoc3RydWN0IGNmaV9pbnRlbGV4dF9vdHBpbmZvICopJmV4dHAtPmV4dHJhWzBdOworCisJCS8qIGZpcnN0IE9UUCByZWdpb24gKi8KKwkJZmllbGQgPSAwOworCQlyZWdfcHJvdF9vZmZzZXQgPSBleHRwLT5Qcm90UmVnQWRkcjsKKwkJcmVnX2ZhY3RfZ3JvdXBzID0gMTsKKwkJcmVnX2ZhY3Rfc2l6ZSA9IDEgPDwgZXh0cC0+RmFjdFByb3RSZWdTaXplOworCQlyZWdfdXNlcl9ncm91cHMgPSAxOworCQlyZWdfdXNlcl9zaXplID0gMSA8PCBleHRwLT5Vc2VyUHJvdFJlZ1NpemU7CisKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCS8qIGZsYXNoIGdlb21ldHJ5IGZpeHVwICovCisJCQlkYXRhX29mZnNldCA9IHJlZ19wcm90X29mZnNldCArIDE7CisJCQlkYXRhX29mZnNldCAqPSBjZmktPmludGVybGVhdmUgKiBjZmktPmRldmljZV90eXBlOworCQkJcmVnX3Byb3Rfb2Zmc2V0ICo9IGNmaS0+aW50ZXJsZWF2ZSAqIGNmaS0+ZGV2aWNlX3R5cGU7CisJCQlyZWdfZmFjdF9zaXplICo9IGNmaS0+aW50ZXJsZWF2ZTsKKwkJCXJlZ191c2VyX3NpemUgKj0gY2ZpLT5pbnRlcmxlYXZlOworCisJCQlpZiAodXNlcl9yZWdzKSB7CisJCQkJZ3JvdXBzID0gcmVnX3VzZXJfZ3JvdXBzOworCQkJCWdyb3Vwc2l6ZSA9IHJlZ191c2VyX3NpemU7CisJCQkJLyogc2tpcCBvdmVyIGZhY3RvcnkgcmVnIGFyZWEgKi8KKwkJCQlncm91cG5vID0gcmVnX2ZhY3RfZ3JvdXBzOworCQkJCWRhdGFfb2Zmc2V0ICs9IHJlZ19mYWN0X2dyb3VwcyAqIHJlZ19mYWN0X3NpemU7CisJCQl9IGVsc2UgeworCQkJCWdyb3VwcyA9IHJlZ19mYWN0X2dyb3VwczsKKwkJCQlncm91cHNpemUgPSByZWdfZmFjdF9zaXplOworCQkJCWdyb3Vwbm8gPSAwOworCQkJfQorCisJCQl3aGlsZSAobGVuID4gMCAmJiBncm91cHMgPiAwKSB7CisJCQkJaWYgKCFhY3Rpb24pIHsKKwkJCQkJLyoKKwkJCQkJICogU3BlY2lhbCBjYXNlOiBpZiBhY3Rpb24gaXMgTlVMTAorCQkJCQkgKiB3ZSBmaWxsIGJ1ZiB3aXRoIG90cF9pbmZvIHJlY29yZHMuCisJCQkJCSAqLworCQkJCQlzdHJ1Y3Qgb3RwX2luZm8gKm90cGluZm87CisJCQkJCW1hcF93b3JkIGxvY2t3b3JkOworCQkJCQlsZW4gLT0gc2l6ZW9mKHN0cnVjdCBvdHBfaW5mbyk7CisJCQkJCWlmIChsZW4gPD0gMCkKKwkJCQkJCXJldHVybiAtRU5PU1BDOworCQkJCQlyZXQgPSBkb19vdHBfcmVhZChtYXAsIGNoaXAsCisJCQkJCQkJICByZWdfcHJvdF9vZmZzZXQsCisJCQkJCQkJICAodV9jaGFyICopJmxvY2t3b3JkLAorCQkJCQkJCSAgbWFwX2Jhbmt3aWR0aChtYXApLAorCQkJCQkJCSAgMCwgMCwgIDApOworCQkJCQlpZiAocmV0KQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJb3RwaW5mbyA9IChzdHJ1Y3Qgb3RwX2luZm8gKilidWY7CisJCQkJCW90cGluZm8tPnN0YXJ0ID0gZnJvbTsKKwkJCQkJb3RwaW5mby0+bGVuZ3RoID0gZ3JvdXBzaXplOworCQkJCQlvdHBpbmZvLT5sb2NrZWQgPQorCQkJCQkgICAhbWFwX3dvcmRfYml0c3NldChtYXAsIGxvY2t3b3JkLAorCQkJCQkJCSAgICAgQ01EKDEgPDwgZ3JvdXBubykpOworCQkJCQlmcm9tICs9IGdyb3Vwc2l6ZTsKKwkJCQkJYnVmICs9IHNpemVvZigqb3RwaW5mbyk7CisJCQkJCSpyZXRsZW4gKz0gc2l6ZW9mKCpvdHBpbmZvKTsKKwkJCQl9IGVsc2UgaWYgKGZyb20gPj0gZ3JvdXBzaXplKSB7CisJCQkJCWZyb20gLT0gZ3JvdXBzaXplOworCQkJCQlkYXRhX29mZnNldCArPSBncm91cHNpemU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IHNpemUgPSBncm91cHNpemU7CisJCQkJCWRhdGFfb2Zmc2V0ICs9IGZyb207CisJCQkJCXNpemUgLT0gZnJvbTsKKwkJCQkJZnJvbSA9IDA7CisJCQkJCWlmIChzaXplID4gbGVuKQorCQkJCQkJc2l6ZSA9IGxlbjsKKwkJCQkJcmV0ID0gYWN0aW9uKG1hcCwgY2hpcCwgZGF0YV9vZmZzZXQsCisJCQkJCQkgICAgIGJ1Ziwgc2l6ZSwgcmVnX3Byb3Rfb2Zmc2V0LAorCQkJCQkJICAgICBncm91cG5vLCBncm91cHNpemUpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJCWJ1ZiArPSBzaXplOworCQkJCQlsZW4gLT0gc2l6ZTsKKwkJCQkJKnJldGxlbiArPSBzaXplOworCQkJCQlkYXRhX29mZnNldCArPSBzaXplOworCQkJCX0KKwkJCQlncm91cG5vKys7CisJCQkJZ3JvdXBzLS07CisJCQl9CisKKwkJCS8qIG5leHQgT1RQIHJlZ2lvbiAqLworCQkJaWYgKCsrZmllbGQgPT0gZXh0cC0+TnVtUHJvdGVjdGlvbkZpZWxkcykKKwkJCQlicmVhazsKKwkJCXJlZ19wcm90X29mZnNldCA9IG90cC0+UHJvdFJlZ0FkZHI7CisJCQlyZWdfZmFjdF9ncm91cHMgPSBvdHAtPkZhY3RHcm91cHM7CisJCQlyZWdfZmFjdF9zaXplID0gMSA8PCBvdHAtPkZhY3RQcm90UmVnU2l6ZTsKKwkJCXJlZ191c2VyX2dyb3VwcyA9IG90cC0+VXNlckdyb3VwczsKKwkJCXJlZ191c2VyX3NpemUgPSAxIDw8IG90cC0+VXNlclByb3RSZWdTaXplOworCQkJb3RwKys7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF9mYWN0X3Byb3RfcmVnKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKKwkJCQkJICAgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sCisJCQkJCSAgICB1X2NoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gY2ZpX2ludGVsZXh0X290cF93YWxrKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sCisJCQkJICAgICBidWYsIGRvX290cF9yZWFkLCAwKTsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF91c2VyX3Byb3RfcmVnKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKKwkJCQkJICAgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sCisJCQkJCSAgICB1X2NoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gY2ZpX2ludGVsZXh0X290cF93YWxrKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sCisJCQkJICAgICBidWYsIGRvX290cF9yZWFkLCAxKTsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfd3JpdGVfdXNlcl9wcm90X3JlZyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sCisJCQkJCSAgICBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwKKwkJCQkJICAgICB1X2NoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gY2ZpX2ludGVsZXh0X290cF93YWxrKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sCisJCQkJICAgICBidWYsIGRvX290cF93cml0ZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2xvY2tfdXNlcl9wcm90X3JlZyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCQkJICAgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IHJldGxlbjsKKwlyZXR1cm4gY2ZpX2ludGVsZXh0X290cF93YWxrKG10ZCwgZnJvbSwgbGVuLCAmcmV0bGVuLAorCQkJCSAgICAgTlVMTCwgZG9fb3RwX2xvY2ssIDEpOworfQorCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9nZXRfZmFjdF9wcm90X2luZm8oc3RydWN0IG10ZF9pbmZvICptdGQsIAorCQkJCQkgICBzdHJ1Y3Qgb3RwX2luZm8gKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgcmV0bGVuOworCWludCByZXQ7CisKKwlyZXQgPSBjZmlfaW50ZWxleHRfb3RwX3dhbGsobXRkLCAwLCBsZW4sICZyZXRsZW4sICh1X2NoYXIgKilidWYsIE5VTEwsIDApOworCXJldHVybiByZXQgPyA6IHJldGxlbjsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfZ2V0X3VzZXJfcHJvdF9pbmZvKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJCQkgICBzdHJ1Y3Qgb3RwX2luZm8gKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgcmV0bGVuOworCWludCByZXQ7CisKKwlyZXQgPSBjZmlfaW50ZWxleHRfb3RwX3dhbGsobXRkLCAwLCBsZW4sICZyZXRsZW4sICh1X2NoYXIgKilidWYsIE5VTEwsIDEpOworCXJldHVybiByZXQgPyA6IHJldGxlbjsKK30KKworI2VuZGlmCisKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3N1c3BlbmQoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CiAJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CkBAIC0yMTI1LDEwICsyMzA5LDQ2IEBACiAJfQogfQogCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZXNldChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwlpbnQgaSwgcmV0OworCisJZm9yIChpPTA7IGkgPCBjZmktPm51bWNoaXBzOyBpKyspIHsKKwkJc3RydWN0IGZsY2hpcCAqY2hpcCA9ICZjZmktPmNoaXBzW2ldOworCisJCS8qIGZvcmNlIHRoZSBjb21wbGV0aW9uIG9mIGFueSBvbmdvaW5nIG9wZXJhdGlvbgorCQkgICBhbmQgc3dpdGNoIHRvIGFycmF5IG1vZGUgc28gYW55IGJvb3Rsb2FkZXIgaW4gCisJCSAgIGZsYXNoIGlzIGFjY2Vzc2libGUgZm9yIHNvZnQgcmVib290LiAqLworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlyZXQgPSBnZXRfY2hpcChtYXAsIGNoaXAsIGNoaXAtPnN0YXJ0LCBGTF9TWU5DSU5HKTsKKwkJaWYgKCFyZXQpIHsKKwkJCW1hcF93cml0ZShtYXAsIENNRCgweGZmKSwgY2hpcC0+c3RhcnQpOworCQkJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKKwkJfQorCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCSAgICAgICB2b2lkICp2KQoreworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCisJbXRkID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgbXRkX2luZm8sIHJlYm9vdF9ub3RpZmllcik7CisJY2ZpX2ludGVsZXh0X3Jlc2V0KG10ZCk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCiBzdGF0aWMgdm9pZCBjZmlfaW50ZWxleHRfZGVzdHJveShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwljZmlfaW50ZWxleHRfcmVzZXQobXRkKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmbXRkLT5yZWJvb3Rfbm90aWZpZXIpOwogCWtmcmVlKGNmaS0+Y21kc2V0X3ByaXYpOwogCWtmcmVlKGNmaS0+Y2ZpcSk7CiAJa2ZyZWUoY2ZpLT5jaGlwc1swXS5wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMi5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKaW5kZXggZmNhOGZmNi4uODUwNWYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKQEAgLTQsMTYgKzQsMjAgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQ3Jvc3NuZXQgQ28uIDxpbmZvQGNyb3NzbmV0LmNvLmpwPgogICogQ29weXJpZ2h0IChDKSAyMDA0IEFyY29tIENvbnRyb2wgU3lzdGVtcyBMdGQgPGxpbnV4QGFyY29tLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgogICoKICAqIDJfYnlfOCByb3V0aW5lcyBhZGRlZCBieSBTaW1vbiBNdW50b24KICAqCiAgKiA0X2J5XzE2IHdvcmsgYnkgQ2Fyb2x5biBKLiBTbWl0aAogICoKKyAqIFhJUCBzdXBwb3J0IGhvb2tzIGJ5IFZpdGFseSBXb29sIChiYXNlZCBvbiBjb2RlIGZvciBJbnRlbCBmbGFzaCAKKyAqIGJ5IE5pY29sYXMgUGl0cmUpCisgKiAKICAqIE9jY2FzaW9uYWxseSBtYWludGFpbmVkIGJ5IFRoYXluZSBIYXJiYXVnaCB0aGFyYmF1Z2ggYXQgbG54aSBkb3QgY29tCiAgKgogICogVGhpcyBjb2RlIGlzIEdQTAogICoKLSAqICRJZDogY2ZpX2NtZHNldF8wMDAyLmMsdiAxLjExNCAyMDA0LzEyLzExIDE1OjQzOjUzIGRlZGVraW5kIEV4cCAkCisgKiAkSWQ6IGNmaV9jbWRzZXRfMDAwMi5jLHYgMS4xMTggMjAwNS8wNy8wNCAyMjozNDoyOSBnbGVpeG5lciBFeHAgJAogICoKICAqLwogCkBAIC0zNCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvY2ZpLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3hpcC5oPgogCiAjZGVmaW5lIEFNRF9CT09UTE9DX0JVRwogI2RlZmluZSBGT1JDRV9XT1JEX1dSSVRFIDAKQEAgLTQzLDYgKzQ4LDcgQEAKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX0FNRAkweDAwMDEKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX1NTVAkweDAwQkYKICNkZWZpbmUgU1NUNDlMRjAwNEIJICAgICAgICAweDAwNjAKKyNkZWZpbmUgU1NUNDlMRjAwOEEJCTB4MDA1YQogCiBzdGF0aWMgaW50IGNmaV9hbWRzdGRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOwogc3RhdGljIGludCBjZmlfYW1kc3RkX3dyaXRlX3dvcmRzKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIGNvbnN0IHVfY2hhciAqKTsKQEAgLTE5MSw2ICsxOTcsNyBAQAogfTsKIHN0YXRpYyBzdHJ1Y3QgY2ZpX2ZpeHVwIGplZGVjX2ZpeHVwX3RhYmxlW10gPSB7CiAJeyBNQU5VRkFDVFVSRVJfU1NULCBTU1Q0OUxGMDA0QiwgZml4dXBfdXNlX2Z3aF9sb2NrLCBOVUxMLCB9LAorCXsgTUFOVUZBQ1RVUkVSX1NTVCwgU1NUNDlMRjAwOEEsIGZpeHVwX3VzZV9md2hfbG9jaywgTlVMTCwgfSwKIAl7IDAsIDAsIE5VTEwsIE5VTEwgfQogfTsKIApAQCAtMzkxLDcgKzM5OCw3IEBACiAgKiBjb3JyZWN0bHkgYW5kIGlzIHRoZXJlZm9yZSBub3QgZG9uZQkocGFydGljdWxhcnkgd2l0aCBpbnRlcmxlYXZlZCBjaGlwcwogICogYXMgZWFjaCBjaGlwIG11c3QgYmUgY2hlY2tlZCBpbmRlcGVuZGFudGx5IG9mIHRoZSBvdGhlcnMpLgogICovCi1zdGF0aWMgaW50IGNoaXBfcmVhZHkoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBpbnQgX194aXByYW0gY2hpcF9yZWFkeShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCW1hcF93b3JkIGQsIHQ7CiAKQEAgLTQwMSw2ICs0MDgsMzIgQEAKIAlyZXR1cm4gbWFwX3dvcmRfZXF1YWwobWFwLCBkLCB0KTsKIH0KIAorLyoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBjaGlwIGlzIHJlYWR5IGFuZCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUuCisgKgorICogUmVhZHkgaXMgb25lIG9mOiByZWFkIG1vZGUsIHF1ZXJ5IG1vZGUsIGVyYXNlLXN1c3BlbmQtcmVhZCBtb2RlIChpbiBhbnkKKyAqIG5vbi1zdXNwZW5kZWQgc2VjdG9yKSBhbmQgaXQgaXMgaW5kaWNhdGVkIGJ5IG5vIGJpdHMgdG9nZ2xpbmcuCisgKgorICogRXJyb3IgYXJlIGluZGljYXRlZCBieSB0b2dnbGluZyBiaXRzIG9yIGJpdHMgaGVsZCB3aXRoIHRoZSB3cm9uZyB2YWx1ZSwKKyAqIG9yIHdpdGggYml0cyB0b2dnbGluZy4KKyAqCisgKiBOb3RlIHRoYXQgYW55dGhpbmcgbW9yZSBjb21wbGljYXRlZCB0aGFuIGNoZWNraW5nIGlmIG5vIGJpdHMgYXJlIHRvZ2dsaW5nCisgKiAoaW5jbHVkaW5nIGNoZWNraW5nIERRNSBmb3IgYW4gZXJyb3Igc3RhdHVzKSBpcyB0cmlja3kgdG8gZ2V0IHdvcmtpbmcKKyAqIGNvcnJlY3RseSBhbmQgaXMgdGhlcmVmb3JlIG5vdCBkb25lCShwYXJ0aWN1bGFyeSB3aXRoIGludGVybGVhdmVkIGNoaXBzCisgKiBhcyBlYWNoIGNoaXAgbXVzdCBiZSBjaGVja2VkIGluZGVwZW5kYW50bHkgb2YgdGhlIG90aGVycykuCisgKgorICovCitzdGF0aWMgaW50IF9feGlwcmFtIGNoaXBfZ29vZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBhZGRyLCBtYXBfd29yZCBleHBlY3RlZCkKK3sKKwltYXBfd29yZCBvbGRkLCBjdXJkOworCisJb2xkZCA9IG1hcF9yZWFkKG1hcCwgYWRkcik7CisJY3VyZCA9IG1hcF9yZWFkKG1hcCwgYWRkcik7CisKKwlyZXR1cm4JbWFwX3dvcmRfZXF1YWwobWFwLCBvbGRkLCBjdXJkKSAmJiAKKwkJbWFwX3dvcmRfZXF1YWwobWFwLCBjdXJkLCBleHBlY3RlZCk7Cit9CisKIHN0YXRpYyBpbnQgZ2V0X2NoaXAoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIHVuc2lnbmVkIGxvbmcgYWRyLCBpbnQgbW9kZSkKIHsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKQEAgLTQyMCwxMiArNDUzLDEyIEBACiAKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiV2FpdGluZyBmb3IgY2hpcCB0byBiZSByZWFkeSB0aW1lZCBvdXQuXG4iKTsKLQkJCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQljZmlfdWRlbGF5KDEpOwotCQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkJLyogU29tZW9uZSBlbHNlIG1pZ2h0IGhhdmUgYmVlbiBwbGF5aW5nIHdpdGggaXQuICovCiAJCQlnb3RvIHJldHJ5OwogCQl9CkBAIC00NzMsMTUgKzUwNiwyMyBAQAogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQkJCi0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJY2ZpX3VkZWxheSgxKTsKLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCS8qIE5vYm9keSB3aWxsIHRvdWNoIGl0IHdoaWxlIGl0J3MgaW4gc3RhdGUgRkxfRVJBU0VfU1VTUEVORElORy4KIAkJCSAgIFNvIHdlIGNhbiBqdXN0IGxvb3AgaGVyZS4gKi8KIAkJfQogCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOwogCQlyZXR1cm4gMDsKIAorCWNhc2UgRkxfWElQX1dISUxFX0VSQVNJTkc6CisJCWlmIChtb2RlICE9IEZMX1JFQURZICYmIG1vZGUgIT0gRkxfUE9JTlQgJiYKKwkJICAgICghY2ZpcCB8fCAhKGNmaXAtPkVyYXNlU3VzcGVuZCYyKSkpCisJCQlnb3RvIHNsZWVwOworCQljaGlwLT5vbGRzdGF0ZSA9IGNoaXAtPnN0YXRlOworCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOworCQlyZXR1cm4gMDsKKwogCWNhc2UgRkxfUE9JTlQ6CiAJCS8qIE9ubHkgaWYgdGhlcmUncyBubyBvcGVyYXRpb24gc3VzcGVuZGVkLi4uICovCiAJCWlmIChtb2RlID09IEZMX1JFQURZICYmIGNoaXAtPm9sZHN0YXRlID09IEZMX1JFQURZKQpAQCAtNDkxLDEwICs1MzIsMTAgQEAKIAlzbGVlcDoKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlzY2hlZHVsZSgpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCWdvdG8gcmVzZXR0aW1lOwogCX0KIH0KQEAgLTUxMiw2ICs1NTMsMTEgQEAKIAkJY2hpcC0+c3RhdGUgPSBGTF9FUkFTSU5HOwogCQlicmVhazsKIAorCWNhc2UgRkxfWElQX1dISUxFX0VSQVNJTkc6CisJCWNoaXAtPnN0YXRlID0gY2hpcC0+b2xkc3RhdGU7CisJCWNoaXAtPm9sZHN0YXRlID0gRkxfUkVBRFk7CisJCWJyZWFrOworCiAJY2FzZSBGTF9SRUFEWToKIAljYXNlIEZMX1NUQVRVUzoKIAkJLyogV2Ugc2hvdWxkIHJlYWxseSBtYWtlIHNldF92cHAoKSBjb3VudCwgcmF0aGVyIHRoYW4gZG9pbmcgdGhpcyAqLwpAQCAtNTIzLDYgKzU2OSwxOTggQEAKIAl3YWtlX3VwKCZjaGlwLT53cSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTVREX1hJUAorCisvKgorICogTm8gaW50ZXJydXB0IHdoYXQgc28gZXZlciBjYW4gYmUgc2VydmljZWQgd2hpbGUgdGhlIGZsYXNoIGlzbid0IGluIGFycmF5CisgKiBtb2RlLiAgVGhpcyBpcyBlbnN1cmVkIGJ5IHRoZSB4aXBfZGlzYWJsZSgpIGFuZCB4aXBfZW5hYmxlKCkgZnVuY3Rpb25zCisgKiBlbmNsb3NpbmcgYW55IGNvZGUgcGF0aCB3aGVyZSB0aGUgZmxhc2ggaXMga25vd24gbm90IHRvIGJlIGluIGFycmF5IG1vZGUuCisgKiBBbmQgd2l0aGluIGEgWElQIGRpc2FibGVkIGNvZGUgcGF0aCwgb25seSBmdW5jdGlvbnMgbWFya2VkIHdpdGggX194aXByYW0KKyAqIG1heSBiZSBjYWxsZWQgYW5kIG5vdGhpbmcgZWxzZSAoaXQncyBhIGdvb2QgdGhpbmcgdG8gaW5zcGVjdCBnZW5lcmF0ZWQKKyAqIGFzc2VtYmx5IHRvIG1ha2Ugc3VyZSBpbmxpbmUgZnVuY3Rpb25zIHdlcmUgYWN0dWFsbHkgaW5saW5lZCBhbmQgdGhhdCBnY2MKKyAqIGRpZG4ndCBlbWl0IGNhbGxzIHRvIGl0cyBvd24gc3VwcG9ydCBmdW5jdGlvbnMpLiBBbHNvIGNvbmZpZ3VyaW5nIE1URCBDRkkKKyAqIHN1cHBvcnQgdG8gYSBzaW5nbGUgYnVzd2lkdGggYW5kIGEgc2luZ2xlIGludGVybGVhdmUgaXMgYWxzbyByZWNvbW1lbmRlZC4KKyAqLworCitzdGF0aWMgdm9pZCB4aXBfZGlzYWJsZShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKKwkJCXVuc2lnbmVkIGxvbmcgYWRyKQoreworCS8qIFRPRE86IGNoaXBzIHdpdGggbm8gWElQIHVzZSBzaG91bGQgaWdub3JlIGFuZCByZXR1cm4gKi8KKwkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOyAvKiBlbnN1cmUgbW11IG1hcHBpbmcgaXMgdXAgdG8gZGF0ZSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9feGlwcmFtIHhpcF9lbmFibGUoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsCisJCQkJdW5zaWduZWQgbG9uZyBhZHIpCit7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisKKwlpZiAoY2hpcC0+c3RhdGUgIT0gRkxfUE9JTlQgJiYgY2hpcC0+c3RhdGUgIT0gRkxfUkVBRFkpIHsKKwkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4ZjApLCBhZHIpOworCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOworCX0KKwkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOworCXhpcF9pcHJlZmV0Y2goKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qCisgKiBXaGVuIGEgZGVsYXkgaXMgcmVxdWlyZWQgZm9yIHRoZSBmbGFzaCBvcGVyYXRpb24gdG8gY29tcGxldGUsIHRoZQorICogeGlwX3VkZWxheSgpIGZ1bmN0aW9uIGlzIHBvbGxpbmcgZm9yIGJvdGggdGhlIGdpdmVuIHRpbWVvdXQgYW5kIHBlbmRpbmcKKyAqIChidXQgc3RpbGwgbWFza2VkKSBoYXJkd2FyZSBpbnRlcnJ1cHRzLiAgV2hlbmV2ZXIgdGhlcmUgaXMgYW4gaW50ZXJydXB0CisgKiBwZW5kaW5nIHRoZW4gdGhlIGZsYXNoIGVyYXNlIG9wZXJhdGlvbiBpcyBzdXNwZW5kZWQsIGFycmF5IG1vZGUgcmVzdG9yZWQgCisgKiBhbmQgaW50ZXJydXB0cyB1bm1hc2tlZC4gIFRhc2sgc2NoZWR1bGluZyBtaWdodCBhbHNvIGhhcHBlbiBhdCB0aGF0CisgKiBwb2ludC4gIFRoZSBDUFUgZXZlbnR1YWxseSByZXR1cm5zIGZyb20gdGhlIGludGVycnVwdCBvciB0aGUgY2FsbCB0bworICogc2NoZWR1bGUoKSBhbmQgdGhlIHN1c3BlbmRlZCBmbGFzaCBvcGVyYXRpb24gaXMgcmVzdW1lZCBmb3IgdGhlIHJlbWFpbmluZworICogb2YgdGhlIGRlbGF5IHBlcmlvZC4KKyAqCisgKiBXYXJuaW5nOiB0aGlzIGZ1bmN0aW9uIF93aWxsXyBmb29sIGludGVycnVwdCBsYXRlbmN5IHRyYWNpbmcgdG9vbHMuCisgKi8KKworc3RhdGljIHZvaWQgX194aXByYW0geGlwX3VkZWxheShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBsb25nIGFkciwgaW50IHVzZWMpCit7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJc3RydWN0IGNmaV9wcmlfYW1kc3RkICpleHRwID0gY2ZpLT5jbWRzZXRfcHJpdjsKKwltYXBfd29yZCBzdGF0dXMsIE9LID0gQ01EKDB4ODApOworCXVuc2lnbmVkIGxvbmcgc3VzcGVuZGVkLCBzdGFydCA9IHhpcF9jdXJydGltZSgpOworCWZsc3RhdGVfdCBvbGRzdGF0ZTsKKworCWRvIHsKKwkJY3B1X3JlbGF4KCk7CisJCWlmICh4aXBfaXJxcGVuZGluZygpICYmIGV4dHAgJiYKKwkJICAgICgoY2hpcC0+c3RhdGUgPT0gRkxfRVJBU0lORyAmJiAoZXh0cC0+RXJhc2VTdXNwZW5kICYgMikpKSAmJgorCQkgICAgKGNmaV9pbnRlcmxlYXZlX2lzXzEoY2ZpKSB8fCBjaGlwLT5vbGRzdGF0ZSA9PSBGTF9SRUFEWSkpIHsKKwkJCS8qCisJCQkgKiBMZXQncyBzdXNwZW5kIHRoZSBlcmFzZSBvcGVyYXRpb24gd2hlbiBzdXBwb3J0ZWQuICAKKwkJCSAqIE5vdGUgdGhhdCB3ZSBjdXJyZW50bHkgZG9uJ3QgdHJ5IHRvIHN1c3BlbmQgCisJCQkgKiBpbnRlcmxlYXZlZCBjaGlwcyBpZiB0aGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgCisJCQkgKiBvcGVyYXRpb24gc3VzcGVuZGVkIChpbWFnaW5lIHdoYXQgaGFwcGVucworCQkJICogd2hlbiBvbmUgY2hpcCB3YXMgYWxyZWFkeSBkb25lIHdpdGggdGhlIGN1cnJlbnQKKwkJCSAqIG9wZXJhdGlvbiB3aGlsZSBhbm90aGVyIGNoaXAgc3VzcGVuZGVkIGl0LCB0aGVuCisJCQkgKiB3ZSByZXN1bWUgdGhlIHdob2xlIHRoaW5nIGF0IG9uY2UpLiAgWWVzLCBpdAorCQkJICogY2FuIGhhcHBlbiEKKwkJCSAqLworCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4YjApLCBhZHIpOworCQkJdXNlYyAtPSB4aXBfZWxhcHNlZF9zaW5jZShzdGFydCk7CisJCQlzdXNwZW5kZWQgPSB4aXBfY3VycnRpbWUoKTsKKwkJCWRvIHsKKwkJCQlpZiAoeGlwX2VsYXBzZWRfc2luY2Uoc3VzcGVuZGVkKSA+IDEwMDAwMCkgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgY2hpcCBkb2Vzbid0IHdhbnQgdG8gc3VzcGVuZAorCQkJCQkgKiBhZnRlciB3YWl0aW5nIGZvciAxMDAgbXNlY3MuCisJCQkJCSAqIFRoaXMgaXMgYSBjcml0aWNhbCBlcnJvciBidXQgdGhlcmUKKwkJCQkJICogaXMgbm90IG11Y2ggd2UgY2FuIGRvIGhlcmUuCisJCQkJCSAqLworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXN0YXR1cyA9IG1hcF9yZWFkKG1hcCwgYWRyKTsKKwkJCX0gd2hpbGUgKCFtYXBfd29yZF9hbmRlcXVhbChtYXAsIHN0YXR1cywgT0ssIE9LKSk7CisKKwkJCS8qIFN1c3BlbmQgc3VjY2VlZGVkICovCisJCQlvbGRzdGF0ZSA9IGNoaXAtPnN0YXRlOworCQkJaWYgKCFtYXBfd29yZF9iaXRzc2V0KG1hcCwgc3RhdHVzLCBDTUQoMHg0MCkpKQorCQkJCWJyZWFrOworCQkJY2hpcC0+c3RhdGUgPSBGTF9YSVBfV0hJTEVfRVJBU0lORzsKKwkJCWNoaXAtPmVyYXNlX3N1c3BlbmRlZCA9IDE7CisJCQltYXBfd3JpdGUobWFwLCBDTUQoMHhmMCksIGFkcik7CisJCQkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOworCQkJYXNtIHZvbGF0aWxlICgiLnJlcCA4OyBub3A7IC5lbmRyIik7CisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQkvKgorCQkJICogV2UncmUgYmFjay4gIEhvd2V2ZXIgc29tZW9uZSBlbHNlIG1pZ2h0IGhhdmUKKwkJCSAqIGRlY2lkZWQgdG8gZ28gd3JpdGUgdG8gdGhlIGNoaXAgaWYgd2UgYXJlIGluCisJCQkgKiBhIHN1c3BlbmRlZCBlcmFzZSBzdGF0ZS4gIElmIHNvIGxldCdzIHdhaXQKKwkJCSAqIHVudGlsIGl0J3MgZG9uZS4KKwkJCSAqLworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXdoaWxlIChjaGlwLT5zdGF0ZSAhPSBGTF9YSVBfV0hJTEVfRVJBU0lORykgeworCQkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJfQorCQkJLyogRGlzYWxsb3cgWElQIGFnYWluICovCisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJCQkvKiBSZXN1bWUgdGhlIHdyaXRlIG9yIGVyYXNlIG9wZXJhdGlvbiAqLworCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4MzApLCBhZHIpOworCQkJY2hpcC0+c3RhdGUgPSBvbGRzdGF0ZTsKKwkJCXN0YXJ0ID0geGlwX2N1cnJ0aW1lKCk7CisJCX0gZWxzZSBpZiAodXNlYyA+PSAxMDAwMDAwL0haKSB7CisJCQkvKgorCQkJICogVHJ5IHRvIHNhdmUgb24gQ1BVIHBvd2VyIHdoZW4gd2FpdGluZyBkZWxheQorCQkJICogaXMgYXQgbGVhc3QgYSBzeXN0ZW0gdGltZXIgdGljayBwZXJpb2QuCisJCQkgKiBObyBuZWVkIHRvIGJlIGV4dHJlbWVseSBhY2N1cmF0ZSBoZXJlLgorCQkJICovCisJCQl4aXBfY3B1X2lkbGUoKTsKKwkJfQorCQlzdGF0dXMgPSBtYXBfcmVhZChtYXAsIGFkcik7CisJfSB3aGlsZSAoIW1hcF93b3JkX2FuZGVxdWFsKG1hcCwgc3RhdHVzLCBPSywgT0spCisJCSAmJiB4aXBfZWxhcHNlZF9zaW5jZShzdGFydCkgPCB1c2VjKTsKK30KKworI2RlZmluZSBVREVMQVkobWFwLCBjaGlwLCBhZHIsIHVzZWMpICB4aXBfdWRlbGF5KG1hcCwgY2hpcCwgYWRyLCB1c2VjKQorCisvKgorICogVGhlIElOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKCkgbWFjcm8gaXMgbm9ybWFsbHkgdXNlZCBpbiBwYXJhbGxlbCB3aGlsZQorICogdGhlIGZsYXNoIGlzIGFjdGl2ZWx5IHByb2dyYW1taW5nIG9yIGVyYXNpbmcgc2luY2Ugd2UgaGF2ZSB0byBwb2xsIGZvcgorICogdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBhbnl3YXkuICBXZSBjYW4ndCBkbyB0aGF0IGluIGEgZ2VuZXJpYyB3YXkgd2l0aAorICogYSBYSVAgc2V0dXAgc28gZG8gaXQgYmVmb3JlIHRoZSBhY3R1YWwgZmxhc2ggb3BlcmF0aW9uIGluIHRoaXMgY2FzZQorICogYW5kIHN0dWIgaXQgb3V0IGZyb20gSU5WQUxJREFURV9DQUNIRV9VREVMQVkuCisgKi8KKyNkZWZpbmUgWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGZyb20sIHNpemUpICBcCisJSU5WQUxJREFURV9DQUNIRURfUkFOR0UobWFwLCBmcm9tLCBzaXplKQorCisjZGVmaW5lIElOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwgYWRyLCBsZW4sIHVzZWMpICBcCisJVURFTEFZKG1hcCwgY2hpcCwgYWRyLCB1c2VjKQorCisvKgorICogRXh0cmEgbm90ZXM6CisgKgorICogQWN0aXZhdGluZyB0aGlzIFhJUCBzdXBwb3J0IGNoYW5nZXMgdGhlIHdheSB0aGUgY29kZSB3b3JrcyBhIGJpdC4gIEZvcgorICogZXhhbXBsZSB0aGUgY29kZSB0byBzdXNwZW5kIHRoZSBjdXJyZW50IHByb2Nlc3Mgd2hlbiBjb25jdXJyZW50IGFjY2VzcworICogaGFwcGVucyBpcyBuZXZlciBleGVjdXRlZCBiZWNhdXNlIHhpcF91ZGVsYXkoKSB3aWxsIGFsd2F5cyByZXR1cm4gd2l0aCB0aGUKKyAqIHNhbWUgY2hpcCBzdGF0ZSBhcyBpdCB3YXMgZW50ZXJlZCB3aXRoLiAgVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm8gY2FyZSBmb3IKKyAqIHRoZSBwcmVzZW5jZSBvZiBhZGRfd2FpdF9xdWV1ZSgpIG9yIHNjaGVkdWxlKCkgY2FsbHMgZnJvbSB3aXRoaW4gYSBjb3VwbGUKKyAqIHhpcF9kaXNhYmxlKCknZCAgYXJlYXMgb2YgY29kZSwgbGlrZSBpbiBkb19lcmFzZV9vbmVibG9jayBmb3IgZXhhbXBsZS4KKyAqIFRoZSBxdWV1ZWluZyBhbmQgc2NoZWR1bGluZyBhcmUgYWx3YXlzIGhhcHBlbmluZyB3aXRoaW4geGlwX3VkZWxheSgpLgorICoKKyAqIFNpbWlsYXJseSwgZ2V0X2NoaXAoKSBhbmQgcHV0X2NoaXAoKSBqdXN0IGhhcHBlbiB0byBhbHdheXMgYmUgZXhlY3V0ZWQKKyAqIHdpdGggY2hpcC0+c3RhdGUgc2V0IHRvIEZMX1JFQURZIChvciBGTF9YSVBfV0hJTEVfKikgd2hlcmUgZmxhc2ggc3RhdGUKKyAqIGlzIGluIGFycmF5IG1vZGUsIHRoZXJlZm9yZSBuZXZlciBleGVjdXRpbmcgbWFueSBjYXNlcyB0aGVyZWluIGFuZCBub3QKKyAqIGNhdXNpbmcgYW55IHByb2JsZW0gd2l0aCBYSVAuCisgKi8KKworI2Vsc2UKKworI2RlZmluZSB4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcikKKyNkZWZpbmUgeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcikKKyNkZWZpbmUgWElQX0lOVkFMX0NBQ0hFRF9SQU5HRSh4Li4uKQorCisjZGVmaW5lIFVERUxBWShtYXAsIGNoaXAsIGFkciwgdXNlYykgIFwKK2RvIHsgIFwKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7ICBcCisJY2ZpX3VkZWxheSh1c2VjKTsgIFwKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsIGFkciwgbGVuLCB1c2VjKSAgXAorZG8geyAgXAorCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsgIFwKKwlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsgIFwKKwljZmlfdWRlbGF5KHVzZWMpOyAgXAorCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7ICBcCit9IHdoaWxlICgwKQorCisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgZG9fcmVhZF9vbmVjaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCBsb2ZmX3QgYWRyLCBzaXplX3QgbGVuLCB1X2NoYXIgKmJ1ZikKIHsKQEAgLTUzNSwxMCArNzczLDEwIEBACiAJLyogRW5zdXJlIGNtZCByZWFkL3dyaXRlcyBhcmUgYWxpZ25lZC4gKi8gCiAJY21kX2FkZHIgPSBhZHIgJiB+KG1hcF9iYW5rd2lkdGgobWFwKS0xKTsgCiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgY21kX2FkZHIsIEZMX1JFQURZKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTU1MSw3ICs3ODksNyBAQAogCiAJcHV0X2NoaXAobWFwLCBjaGlwLCBjbWRfYWRkcik7CiAKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjA1LDcgKzg0Myw3IEBACiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CiAKICByZXRyeToKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCiAJaWYgKGNoaXAtPnN0YXRlICE9IEZMX1JFQURZKXsKICNpZiAwCkBAIC02MTQsNyArODUyLDcgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKIAkJCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAogCQlzY2hlZHVsZSgpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKQEAgLTY0Myw3ICs4ODEsNyBAQAogCWNmaV9zZW5kX2dlbl9jbWQoMHgwMCwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJCiAJd2FrZV91cCgmY2hpcC0+d3EpOwotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02OTIsNyArOTMwLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGRvX3dyaXRlX29uZXdvcmQoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIHVuc2lnbmVkIGxvbmcgYWRyLCBtYXBfd29yZCBkYXR1bSkKK3N0YXRpYyBpbnQgX194aXByYW0gZG9fd3JpdGVfb25ld29yZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIsIG1hcF93b3JkIGRhdHVtKQogewogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgSFo7CkBAIC03MTIsMTAgKzk1MCwxMCBAQAogCiAJYWRyICs9IGNoaXAtPnN0YXJ0OwogCi0JY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAlyZXQgPSBnZXRfY2hpcChtYXAsIGNoaXAsIGFkciwgRkxfV1JJVElORyk7CiAJaWYgKHJldCkgewotCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC03MzUsNyArOTczLDkgQEAKIAkJZ290byBvcF9kb25lOwogCX0KIAorCVhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBhZHIsIG1hcF9iYW5rd2lkdGgobWFwKSk7CiAJRU5BQkxFX1ZQUChtYXApOworCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgYWRyKTsKICByZXRyeToKIAljZmlfc2VuZF9nZW5fY21kKDB4QUEsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCWNmaV9zZW5kX2dlbl9jbWQoMHg1NSwgY2ZpLT5hZGRyX3VubG9jazIsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CkBAIC03NDMsOSArOTgzLDkgQEAKIAltYXBfd3JpdGUobWFwLCBkYXR1bSwgYWRyKTsKIAljaGlwLT5zdGF0ZSA9IEZMX1dSSVRJTkc7CiAKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCWNmaV91ZGVsYXkoY2hpcC0+d29yZF93cml0ZV90aW1lKTsKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBtYXBfYmFua3dpZHRoKG1hcCksCisJCQkJY2hpcC0+d29yZF93cml0ZV90aW1lKTsKIAogCS8qIFNlZSBjb21tZW50IGFib3ZlIGZvciB0aW1lb3V0IHZhbHVlLiAqLwogCXRpbWVvID0gamlmZmllcyArIHVXcml0ZVRpbWVvdXQ7IApAQCAtNzU2LDM5ICs5OTYsNDMgQEAKIAogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwogCQkJdGltZW8gPSBqaWZmaWVzICsgKEhaIC8gMik7IC8qIEZJWE1FICovCi0JCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCWlmIChjaGlwX3JlYWR5KG1hcCwgYWRyKSkKLQkJCWdvdG8gb3BfZG9uZTsKKwkJCWJyZWFrOwogCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKSB7CisJCQl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCQl4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJfQogCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCWNmaV91ZGVsYXkoMSk7Ci0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEpOwogCX0KKwkvKiBEaWQgd2Ugc3VjY2VlZD8gKi8KKwlpZiAoIWNoaXBfZ29vZChtYXAsIGFkciwgZGF0dW0pKSB7CisJCS8qIHJlc2V0IG9uIGFsbCBmYWlsdXJlcy4gKi8KKwkJbWFwX3dyaXRlKCBtYXAsIENNRCgweEYwKSwgY2hpcC0+c3RhcnQgKTsKKwkJLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLwogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJaWYgKCsrcmV0cnlfY250IDw9IE1BWF9XT1JEX1JFVFJJRVMpIAorCQkJZ290byByZXRyeTsKIAotCS8qIHJlc2V0IG9uIGFsbCBmYWlsdXJlcy4gKi8KLQltYXBfd3JpdGUoIG1hcCwgQ01EKDB4RjApLCBjaGlwLT5zdGFydCApOwotCS8qIEZJWE1FIC0gc2hvdWxkIGhhdmUgcmVzZXQgZGVsYXkgYmVmb3JlIGNvbnRpbnVpbmcgKi8KLQlpZiAoKytyZXRyeV9jbnQgPD0gTUFYX1dPUkRfUkVUUklFUykgCi0JCWdvdG8gcmV0cnk7Ci0KLQlyZXQgPSAtRUlPOworCQlyZXQgPSAtRUlPOworCX0KKwl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKICBvcF9kb25lOgogCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CiAJcHV0X2NoaXAobWFwLCBjaGlwLCBhZHIpOwotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTgyMCw3ICsxMDY0LDcgQEAKIAkJbWFwX3dvcmQgdG1wX2J1ZjsKIAogIHJldHJ5OgotCQljZmlfc3Bpbl9sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOworCQlzcGluX2xvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CiAKIAkJaWYgKGNmaS0+Y2hpcHNbY2hpcG51bV0uc3RhdGUgIT0gRkxfUkVBRFkpIHsKICNpZiAwCkBAIC04MjksNyArMTA3Myw3IEBACiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmY2ZpLT5jaGlwc1tjaGlwbnVtXS53cSwgJndhaXQpOwogCi0JCQljZmlfc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCQlzcGluX3VubG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKIAogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjZmktPmNoaXBzW2NoaXBudW1dLndxLCAmd2FpdCk7CkBAIC04NDMsNyArMTA4Nyw3IEBACiAJCS8qIExvYWQgJ3RtcF9idWYnIHdpdGggb2xkIGNvbnRlbnRzIG9mIGZsYXNoICovCiAJCXRtcF9idWYgPSBtYXBfcmVhZChtYXAsIGJ1c19vZnMrY2hpcHN0YXJ0KTsKIAotCQljZmlfc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOwogCiAJCS8qIE51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gYnVmZmVyICovCiAJCW4gPSBtaW5fdChpbnQsIGxlbiwgbWFwX2Jhbmt3aWR0aChtYXApLWkpOwpAQCAtODk4LDcgKzExNDIsNyBAQAogCQltYXBfd29yZCB0bXBfYnVmOwogCiAgcmV0cnkxOgotCQljZmlfc3Bpbl9sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOworCQlzcGluX2xvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CiAKIAkJaWYgKGNmaS0+Y2hpcHNbY2hpcG51bV0uc3RhdGUgIT0gRkxfUkVBRFkpIHsKICNpZiAwCkBAIC05MDcsNyArMTE1MSw3IEBACiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmY2ZpLT5jaGlwc1tjaGlwbnVtXS53cSwgJndhaXQpOwogCi0JCQljZmlfc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCQlzcGluX3VubG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKIAogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjZmktPmNoaXBzW2NoaXBudW1dLndxLCAmd2FpdCk7CkBAIC05MjAsNyArMTE2NCw3IEBACiAKIAkJdG1wX2J1ZiA9IG1hcF9yZWFkKG1hcCwgb2ZzICsgY2hpcHN0YXJ0KTsKIAotCQljZmlfc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOwogCiAJCXRtcF9idWYgPSBtYXBfd29yZF9sb2FkX3BhcnRpYWwobWFwLCB0bXBfYnVmLCBidWYsIDAsIGxlbik7CiAJCkBAIC05MzksOCArMTE4Myw5IEBACiAvKgogICogRklYTUU6IGludGVybGVhdmVkIG1vZGUgbm90IHRlc3RlZCwgYW5kIHByb2JhYmx5IG5vdCBzdXBwb3J0ZWQhCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGRvX3dyaXRlX2J1ZmZlcihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgCi0JCQkJICB1bnNpZ25lZCBsb25nIGFkciwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCitzdGF0aWMgaW50IF9feGlwcmFtIGRvX3dyaXRlX2J1ZmZlcihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZHIsIGNvbnN0IHVfY2hhciAqYnVmLCAKKwkJCQkgICAgaW50IGxlbikKIHsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvID0gamlmZmllcyArIEhaOwpAQCAtOTU0LDEwICsxMTk5LDEwIEBACiAJYWRyICs9IGNoaXAtPnN0YXJ0OwogCWNtZF9hZHIgPSBhZHI7CiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9XUklUSU5HKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTk2Niw3ICsxMjExLDEwIEBACiAJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogV1JJVEUgMHglLjhseCgweCUuOGx4KVxuIiwKIAkgICAgICAgX19mdW5jX18sIGFkciwgZGF0dW0ueFswXSApOwogCisJWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsKIAlFTkFCTEVfVlBQKG1hcCk7CisJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBjbWRfYWRyKTsKKwkKIAljZmlfc2VuZF9nZW5fY21kKDB4QUEsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCWNmaV9zZW5kX2dlbl9jbWQoMHg1NSwgY2ZpLT5hZGRyX3VubG9jazIsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJLy9jZmlfc2VuZF9nZW5fY21kKDB4QTAsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpAQCAtOTk2LDkgKzEyNDQsOSBAQAogCW1hcF93cml0ZShtYXAsIENNRCgweDI5KSwgY21kX2Fkcik7CiAJY2hpcC0+c3RhdGUgPSBGTF9XUklUSU5HOwogCi0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQljZmlfdWRlbGF5KGNoaXAtPmJ1ZmZlcl93cml0ZV90aW1lKTsKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBtYXBfYmFua3dpZHRoKG1hcCksCisJCQkJY2hpcC0+d29yZF93cml0ZV90aW1lKTsKIAogCXRpbWVvID0gamlmZmllcyArIHVXcml0ZVRpbWVvdXQ7IAogCQkKQEAgLTEwMDksMzggKzEyNTcsMzkgQEAKIAogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwogCQkJdGltZW8gPSBqaWZmaWVzICsgKEhaIC8gMik7IC8qIEZJWE1FICovCi0JCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChjaGlwX3JlYWR5KG1hcCwgYWRyKSkKKwkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKSB7CisJCQl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKIAkJCWdvdG8gb3BfZG9uZTsKKwkJfQogCQkgICAgCiAJCWlmKCB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkKIAkJCWJyZWFrOwogCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCWNmaV91ZGVsYXkoMSk7Ci0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEpOwogCX0KIAotCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAotCSAgICAgICBfX2Z1bmNfXyApOwotCiAJLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLwogCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7CisJeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcik7CiAJLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLwogCisJcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsCisJICAgICAgIF9fZnVuY19fICk7CisKIAlyZXQgPSAtRUlPOwogIG9wX2RvbmU6CiAJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKIAlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7Ci0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTEzMCw3ICsxMzc5LDcgQEAKICAqIEhhbmRsZSBkZXZpY2VzIHdpdGggb25lIGVyYXNlIHJlZ2lvbiwgdGhhdCBvbmx5IGltcGxlbWVudAogICogdGhlIGNoaXAgZXJhc2UgY29tbWFuZC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZG9fZXJhc2VfY2hpcChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCkKK3N0YXRpYyBpbnQgX194aXByYW0gZG9fZXJhc2VfY2hpcChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvID0gamlmZmllcyArIEhaOwpAQCAtMTE0MCwxNyArMTM4OSwyMCBAQAogCiAJYWRyID0gY2ZpLT5hZGRyX3VubG9jazE7CiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9XUklUSU5HKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBFUkFTRSAweCUuOGx4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgY2hpcC0+c3RhcnQgKTsKIAorCVhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBhZHIsIG1hcC0+c2l6ZSk7CiAJRU5BQkxFX1ZQUChtYXApOworCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgYWRyKTsKKwogCWNmaV9zZW5kX2dlbl9jbWQoMHhBQSwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJY2ZpX3NlbmRfZ2VuX2NtZCgweDU1LCBjZmktPmFkZHJfdW5sb2NrMiwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAljZmlfc2VuZF9nZW5fY21kKDB4ODAsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpAQCAtMTE2Miw5ICsxNDE0LDkgQEAKIAljaGlwLT5lcmFzZV9zdXNwZW5kZWQgPSAwOwogCWNoaXAtPmluX3Byb2dyZXNzX2Jsb2NrX2FkZHIgPSBhZHI7CiAKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCW1zbGVlcChjaGlwLT5lcmFzZV90aW1lLzIpOwotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCUlOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwKKwkJCQlhZHIsIG1hcC0+c2l6ZSwKKwkJCQljaGlwLT5lcmFzZV90aW1lKjUwMCk7CiAKIAl0aW1lbyA9IGppZmZpZXMgKyAoSFoqMjApOwogCkBAIC0xMTczLDEwICsxNDI1LDEwIEBACiAJCQkvKiBTb21lb25lJ3Mgc3VzcGVuZGVkIHRoZSBlcmFzZS4gU2xlZXAgKi8KIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCXNjaGVkdWxlKCk7CiAJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChjaGlwLT5lcmFzZV9zdXNwZW5kZWQpIHsKQEAgLTExODcsMzYgKzE0MzksMzYgQEAKIAkJfQogCiAJCWlmIChjaGlwX3JlYWR5KG1hcCwgYWRyKSkKLQkJCWdvdG8gb3BfZG9uZTsKLQotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lbykpCiAJCQlicmVhazsKIAorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lbykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAorCQkJCV9fZnVuY19fICk7CisJCQlicmVhazsKKwkJfQorCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMTAwMDAwMC9IWik7CisJfQorCS8qIERpZCB3ZSBzdWNjZWVkPyAqLworCWlmICghY2hpcF9nb29kKG1hcCwgYWRyLCBtYXBfd29yZF9mZihtYXApKSkgeworCQkvKiByZXNldCBvbiBhbGwgZmFpbHVyZXMuICovCisJCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7CisJCS8qIEZJWE1FIC0gc2hvdWxkIGhhdmUgcmVzZXQgZGVsYXkgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKworCQlyZXQgPSAtRUlPOwogCX0KIAotCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAotCSAgICAgICBfX2Z1bmNfXyApOwotCi0JLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLwotCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7Ci0JLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLwotCi0JcmV0ID0gLUVJTzsKLSBvcF9kb25lOgogCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CisJeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcik7CiAJcHV0X2NoaXAobWFwLCBjaGlwLCBhZHIpOwotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBkb19lcmFzZV9vbmVibG9jayhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIsIGludCBsZW4sIHZvaWQgKnRodW5rKQorc3RhdGljIGludCBfX3hpcHJhbSBkb19lcmFzZV9vbmVibG9jayhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIsIGludCBsZW4sIHZvaWQgKnRodW5rKQogewogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgSFo7CkBAIC0xMjI1LDE3ICsxNDc3LDIwIEBACiAKIAlhZHIgKz0gY2hpcC0+c3RhcnQ7CiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9FUkFTSU5HKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBFUkFTRSAweCUuOGx4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgYWRyICk7CiAKKwlYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKG1hcCwgYWRyLCBsZW4pOwogCUVOQUJMRV9WUFAobWFwKTsKKwl4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcik7CisKIAljZmlfc2VuZF9nZW5fY21kKDB4QUEsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCWNmaV9zZW5kX2dlbl9jbWQoMHg1NSwgY2ZpLT5hZGRyX3VubG9jazIsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJY2ZpX3NlbmRfZ2VuX2NtZCgweDgwLCBjZmktPmFkZHJfdW5sb2NrMSwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKQEAgLTEyNDYsMTAgKzE1MDEsMTAgQEAKIAljaGlwLT5zdGF0ZSA9IEZMX0VSQVNJTkc7CiAJY2hpcC0+ZXJhc2Vfc3VzcGVuZGVkID0gMDsKIAljaGlwLT5pbl9wcm9ncmVzc19ibG9ja19hZGRyID0gYWRyOwotCQotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JbXNsZWVwKGNoaXAtPmVyYXNlX3RpbWUvMik7Ci0JY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBsZW4sCisJCQkJY2hpcC0+ZXJhc2VfdGltZSo1MDApOwogCiAJdGltZW8gPSBqaWZmaWVzICsgKEhaKjIwKTsKIApAQCAtMTI1OCwxMCArMTUxMywxMCBAQAogCQkJLyogU29tZW9uZSdzIHN1c3BlbmRlZCB0aGUgZXJhc2UuIFNsZWVwICovCiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQlzY2hlZHVsZSgpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoY2hpcC0+ZXJhc2Vfc3VzcGVuZGVkKSB7CkBAIC0xMjcxLDMxICsxNTI2LDMzIEBACiAJCQljaGlwLT5lcmFzZV9zdXNwZW5kZWQgPSAwOwogCQl9CiAKLQkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKQotCQkJZ290byBvcF9kb25lOwotCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkKKwkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKSB7CisJCQl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKIAkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKSB7CisJCQl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAorCQkJCV9fZnVuY19fICk7CisJCQlicmVhazsKKwkJfQogCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMTAwMDAwMC9IWik7CiAJfQotCQotCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAotCSAgICAgICBfX2Z1bmNfXyApOwotCQotCS8qIHJlc2V0IG9uIGFsbCBmYWlsdXJlcy4gKi8KLQltYXBfd3JpdGUoIG1hcCwgQ01EKDB4RjApLCBjaGlwLT5zdGFydCApOwotCS8qIEZJWE1FIC0gc2hvdWxkIGhhdmUgcmVzZXQgZGVsYXkgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKwkvKiBEaWQgd2Ugc3VjY2VlZD8gKi8KKwlpZiAoIWNoaXBfZ29vZChtYXAsIGFkciwgbWFwX3dvcmRfZmYobWFwKSkpIHsKKwkJLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLworCQltYXBfd3JpdGUoIG1hcCwgQ01EKDB4RjApLCBjaGlwLT5zdGFydCApOworCQkvKiBGSVhNRSAtIHNob3VsZCBoYXZlIHJlc2V0IGRlbGF5IGJlZm9yZSBjb250aW51aW5nICovCiAKLQlyZXQgPSAtRUlPOwotIG9wX2RvbmU6CisJCXJldCA9IC1FSU87CisJfQorCiAJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKIAlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7Ci0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM1NSw3ICsxNjEyLDcgQEAKIAkJY2hpcCA9ICZjZmktPmNoaXBzW2ldOwogCiAJcmV0cnk6Ci0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCiAJCXN3aXRjaChjaGlwLT5zdGF0ZSkgewogCQljYXNlIEZMX1JFQURZOgpAQCAtMTM2OSwxNCArMTYyNiwxNCBAQAogCQkJICogd2l0aCB0aGUgY2hpcCBub3cgYW55d2F5LgogCQkJICovCiAJCWNhc2UgRkxfU1lOQ0lORzoKLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgogCQkJLyogTm90IGFuIGlkbGUgc3RhdGUgKi8KIAkJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwogCQkJCi0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJCQlzY2hlZHVsZSgpOwogCkBAIC0xMzkxLDEzICsxNjQ4LDEzIEBACiAJZm9yIChpLS07IGkgPj0wOyBpLS0pIHsKIAkJY2hpcCA9ICZjZmktPmNoaXBzW2ldOwogCi0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkKIAkJaWYgKGNoaXAtPnN0YXRlID09IEZMX1NZTkNJTkcpIHsKIAkJCWNoaXAtPnN0YXRlID0gY2hpcC0+b2xkc3RhdGU7CiAJCQl3YWtlX3VwKCZjaGlwLT53cSk7CiAJCX0KLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCX0KIH0KIApAQCAtMTQxMyw3ICsxNjcwLDcgQEAKIAlmb3IgKGk9MDsgIXJldCAmJiBpPGNmaS0+bnVtY2hpcHM7IGkrKykgewogCQljaGlwID0gJmNmaS0+Y2hpcHNbaV07CiAKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAKIAkJc3dpdGNoKGNoaXAtPnN0YXRlKSB7CiAJCWNhc2UgRkxfUkVBRFk6CkBAIC0xNDMzLDcgKzE2OTAsNyBAQAogCQkJcmV0ID0gLUVBR0FJTjsKIAkJCWJyZWFrOwogCQl9Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAl9CiAKIAkvKiBVbmxvY2sgdGhlIGNoaXBzIGFnYWluICovCkBAIC0xNDQyLDEzICsxNjk5LDEzIEBACiAJCWZvciAoaS0tOyBpID49MDsgaS0tKSB7CiAJCQljaGlwID0gJmNmaS0+Y2hpcHNbaV07CiAKLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCiAJCQlpZiAoY2hpcC0+c3RhdGUgPT0gRkxfUE1fU1VTUEVOREVEKSB7CiAJCQkJY2hpcC0+c3RhdGUgPSBjaGlwLT5vbGRzdGF0ZTsKIAkJCQl3YWtlX3VwKCZjaGlwLT53cSk7CiAJCQl9Ci0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQl9CiAJfQogCQpAQCAtMTQ2Nyw3ICsxNzI0LDcgQEAKIAkKIAkJY2hpcCA9ICZjZmktPmNoaXBzW2ldOwogCi0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkKIAkJaWYgKGNoaXAtPnN0YXRlID09IEZMX1BNX1NVU1BFTkRFRCkgewogCQkJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKQEAgLTE0NzcsNyArMTczNCw3IEBACiAJCWVsc2UKIAkJCXByaW50ayhLRVJOX0VSUiAiQXJnaC4gQ2hpcCBub3QgaW4gUE1fU1VTUEVOREVEIHN0YXRlIHVwb24gcmVzdW1lKClcbiIpOwogCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAyMC5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKaW5kZXggOGMyNGUxOC4uYzg5NGY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKQEAgLTQsNyArNCw3IEBACiAgKgogICogKEMpIDIwMDAgUmVkIEhhdC4gR1BMJ2QKICAqCi0gKiAkSWQ6IGNmaV9jbWRzZXRfMDAyMC5jLHYgMS4xNyAyMDA0LzExLzIwIDEyOjQ5OjA0IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGNmaV9jbWRzZXRfMDAyMC5jLHYgMS4xOSAyMDA1LzA3LzEzIDE1OjUyOjQ1IGR3bXcyIEV4cCAkCiAgKiAKICAqIDEwLzEwLzIwMDAJTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgogICogCS0gY29tcGxldGVseSByZXZhbXBlZCBtZXRob2QgZnVuY3Rpb25zIHNvIHRoZXkgYXJlIGF3YXJlIGFuZApAQCAtMTYsNiArMTYsOCBAQAogICoJLSBtb2RpZmllZCBJbnRlbCBDb21tYW5kIFNldCAweDAwMDEgdG8gc3VwcG9ydCBTVCBBZHZhbmNlZCBBcmNoaXRlY3R1cmUKICAqCSAgKGNvbW1hbmQgc2V0IDB4MDAyMCkKICAqCS0gYWRkZWQgYSB3cml0ZXYgZnVuY3Rpb24KKyAqIDA3LzEzLzIwMDUJSm9lcm4gRW5nZWwgPGpvZXJuQHdoLmZoLXdlZGVsLmRlPgorICogCS0gUGx1Z2dlZCBtZW1vcnkgbGVhayBpbiBjZmlfc3RhYV93cml0ZXYoKS4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgpAQCAtNzE5LDYgKzcyMSw3IEBACiB3cml0ZV9lcnJvcjoKIAlpZiAocmV0bGVuKQogCQkqcmV0bGVuID0gdG90bGVuOworCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaCBiL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmgKaW5kZXggZmJmNDQ3MC4uZTFhNWI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaAorKysgYi9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oCkBAIC01OCwxMCArNTgsMTAgQEAKIAkgKiB0byBmbGFzaCBtZW1vcnkgLSB0aGF0IG1lYW5zIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBzdGF0dXMKIAkgKiBhbmQgdGltZW91dC4KIAkgKi8KLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9MT0NLSU5HKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTcxLDcgKzcxLDcgQEAKIAkvKiBEb25lIGFuZCBoYXBweS4gKi8KIAljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOwogCXB1dF9jaGlwKG1hcCwgY2hpcCwgYWRyKTsKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvZ2VuX3Byb2JlLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9nZW5fcHJvYmUuYwppbmRleCBmYzk4MmM0Li5kYzA2NWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9nZW5fcHJvYmUuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9nZW5fcHJvYmUuYwpAQCAtMiw3ICsyLDcgQEAKICAqIFJvdXRpbmVzIGNvbW1vbiB0byBhbGwgQ0ZJLXR5cGUgcHJvYmVzLgogICogKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCiAgKiBHUEwnZAotICogJElkOiBnZW5fcHJvYmUuYyx2IDEuMjEgMjAwNC8wOC8xNCAxNToxNDowNSBkd213MiBFeHAgJAorICogJElkOiBnZW5fcHJvYmUuYyx2IDEuMjIgMjAwNS8wMS8yNCAyMzo0OTo1MCBybWsgRXhwICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNjIsNyArMTYyLDcgQEAKIAlpbnQgbWF4X2NoaXBzID0gbWFwX2Jhbmt3aWR0aChtYXApOyAvKiBBbmQgbWluaW11bSAxICovCiAJaW50IG5yX2NoaXBzLCB0eXBlOwogCi0JZm9yIChucl9jaGlwcyA9IG1pbl9jaGlwczsgbnJfY2hpcHMgPD0gbWF4X2NoaXBzOyBucl9jaGlwcyA8PD0gMSkgeworCWZvciAobnJfY2hpcHMgPSBtYXhfY2hpcHM7IG5yX2NoaXBzID49IG1pbl9jaGlwczsgbnJfY2hpcHMgPj49IDEpIHsKIAogCQlpZiAoIWNmaV9pbnRlcmxlYXZlX3N1cHBvcnRlZChucl9jaGlwcykpCiAJCSAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2plZGVjX3Byb2JlLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jCmluZGV4IDMwMzI1YTIuLjMwZGE0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2plZGVjX3Byb2JlLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIAogICAgQ29tbW9uIEZsYXNoIEludGVyZmFjZSBwcm9iZSBjb2RlLgogICAgKEMpIDIwMDAgUmVkIEhhdC4gR1BMJ2QuCi0gICAkSWQ6IGplZGVjX3Byb2JlLmMsdiAxLjYxIDIwMDQvMTEvMTkgMjA6NTI6MTYgdGhheW5lIEV4cCAkCisgICAkSWQ6IGplZGVjX3Byb2JlLmMsdiAxLjYzIDIwMDUvMDIvMTQgMTY6MzA6MzIgYmpkIEV4cCAkCiAgICBTZWUgSkVERUMgKGh0dHA6Ly93d3cuamVkZWMub3JnLykgc3RhbmRhcmQgSkVTRDIxQyAoc2VjdGlvbiAzLjUpCiAgICBmb3IgdGhlIHN0YW5kYXJkIHRoaXMgcHJvYmUgZ29lcyBiYWNrIHRvLgogCkBAIC0xNDIsNiArMTQyLDcgQEAKICNkZWZpbmUgU1NUMjlMRTUxMgkweDAwM2QKICNkZWZpbmUgU1NUMzlMRjgwMAkweDI3ODEKICNkZWZpbmUgU1NUMzlMRjE2MAkweDI3ODIKKyNkZWZpbmUgU1NUMzlWRjE2MDEJMHgyMzRiCiAjZGVmaW5lIFNTVDM5TEY1MTIJMHgwMEQ0CiAjZGVmaW5lIFNTVDM5TEYwMTAJMHgwMEQ1CiAjZGVmaW5lIFNTVDM5TEYwMjAJMHgwMEQ2CkBAIC0xNDQ4LDYgKzE0NDksMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgRVJBU0VJTkZPKDB4MTAwMCwyNTYpLAogICAgICAgICAgICAgICAgICAgICAgICBFUkFTRUlORk8oMHgxMDAwLDI1NikKICAgICAgICAgICAgICAgIH0KKwl9LCB7CisgICAgICAgICAgICAgICAubWZyX2lkICAgICAgICAgPSBNQU5VRkFDVFVSRVJfU1NULCAgICAgLyogc2hvdWxkIGJlIENGSSAqLworICAgICAgICAgICAgICAgLmRldl9pZCAgICAgICAgID0gU1NUMzlWRjE2MDEsCisgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU1NUIDM5VkYxNjAxIiwKKyAgICAgICAgICAgICAgIC51YWRkciAgICAgICAgICA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsICAvKiB4OCAqLworICAgICAgICAgICAgICAgICAgICAgICBbMV0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAgIC8qIHgxNiAqLworICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgIC5EZXZTaXplICAgICAgICA9IFNJWkVfMk1pQiwKKyAgICAgICAgICAgICAgIC5DbWRTZXQgICAgICAgICA9IFBfSURfQU1EX1NURCwKKyAgICAgICAgICAgICAgIC5OdW1FcmFzZVJlZ2lvbnM9IDIsCisgICAgICAgICAgICAgICAucmVnaW9ucyAgICAgICAgPSB7CisgICAgICAgICAgICAgICAgICAgICAgIEVSQVNFSU5GTygweDEwMDAsMjU2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVJBU0VJTkZPKDB4MTAwMCwyNTYpCisgICAgICAgICAgICAgICB9CiAKICAgICAgICB9LCB7CiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NULAkvKiBGSVhNRSAtIENGSSBkZXZpY2U/ICovCkBAIC0xODU2LDYgKzE4NzIsMTYgQEAKIAljYXNlIENGSV9ERVZJQ0VUWVBFX1g4OgogCQltZnIgPSAoX191OClmaW5mby0+bWZyX2lkOwogCQlpZCA9IChfX3U4KWZpbmZvLT5kZXZfaWQ7CisKKwkJLyogYmpkOiBpdCBzZWVtcyB0aGF0IGlmIHdlIGRvIHRoaXMsIHdlIGNhbiBlbmQgdXAKKwkJICogZGV0ZWN0aW5nIDE2Yml0IGZsYXNoZXMgYXMgYW4gOGJpdCBkZXZpY2UsIGV2ZW4gdGhvdWdoCisJCSAqIHRoZXJlIGFyZW4ndC4KKwkJICovCisJCWlmIChmaW5mby0+ZGV2X2lkID4gMHhmZikgeworCQkJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsICIlcygpOiBJRCBpcyBub3QgOGJpdFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQlnb3RvIG1hdGNoX2RvbmU7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBDRklfREVWSUNFVFlQRV9YMTY6CiAJCW1mciA9IChfX3UxNilmaW5mby0+bWZyX2lkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYyBiL2RyaXZlcnMvbXRkL2NtZGxpbmVwYXJ0LmMKaW5kZXggNjBhYjRiOC4uZWYyNDgzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYworKysgYi9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogY21kbGluZXBhcnQuYyx2IDEuMTcgMjAwNC8xMS8yNiAxMToxODo0NyBsYXZpbmVuIEV4cCAkCisgKiAkSWQ6IGNtZGxpbmVwYXJ0LmMsdiAxLjE4IDIwMDUvMDYvMDcgMTU6MDQ6MjYgam9lcm4gRXhwICQKICAqCiAgKiBSZWFkIGZsYXNoIHBhcnRpdGlvbiB0YWJsZSBmcm9tIGNvbW1hbmQgbGluZQogICoKQEAgLTIzOSw3ICsyMzksOCBAQAogCQkJCSZudW1fcGFydHMsCS8qIG91dDogbnVtYmVyIG9mIHBhcnRzICovCiAJCQkJMCwJCS8qIGZpcnN0IHBhcnRpdGlvbiAqLwogCQkJCSh1bnNpZ25lZCBjaGFyKiopJnRoaXNfbXRkLCAvKiBvdXQ6IGV4dHJhIG1lbSAqLwotCQkJCW10ZF9pZF9sZW4gKyAxICsgc2l6ZW9mKCp0aGlzX210ZCkpOworCQkJCW10ZF9pZF9sZW4gKyAxICsgc2l6ZW9mKCp0aGlzX210ZCkgKyAKKwkJCQlzaXplb2Yodm9pZCopLTEgLyphbGlnbm1lbnQqLyk7CiAJCWlmKCFwYXJ0cykKIAkJewogCQkJLyoKQEAgLTI1Miw2ICsyNTMsOSBAQAogCQkJIHJldHVybiAwOwogCQkgfQogCisJCS8qIGFsaWduIHRoaXNfbXRkICovCisJCXRoaXNfbXRkID0gKHN0cnVjdCBjbWRsaW5lX210ZF9wYXJ0aXRpb24gKikgCisJCQlBTElHTigodW5zaWduZWQgbG9uZyl0aGlzX210ZCwgc2l6ZW9mKHZvaWQqKSk7CiAJCS8qIGVudGVyIHJlc3VsdHMgKi8JICAgIAogCQl0aGlzX210ZC0+cGFydHMgPSBwYXJ0czsKIAkJdGhpc19tdGQtPm51bV9wYXJ0cyA9IG51bV9wYXJ0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvYmxvY2sybXRkLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2Jsb2NrMm10ZC5jCmluZGV4IGNmZTZjY2YuLjRhN2E4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvYmxvY2sybXRkLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9ibG9jazJtdGQuYwpAQCAtMSwxMCArMSw5IEBACiAvKgotICogJElkOiBibG9jazJtdGQuYyx2IDEuMjMgMjAwNS8wMS8wNSAxNzowNTo0NiBkd213MiBFeHAgJAorICogJElkOiBibG9jazJtdGQuYyx2IDEuMjggMjAwNS8wMy8xOSAyMjo0MDo0NCBnbGVpeG5lciBFeHAgJAogICoKICAqIGJsb2NrMm10ZC5jIC0gY3JlYXRlIGFuIG10ZCBmcm9tIGEgYmxvY2sgZGV2aWNlCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIJU2ltb24gRXZhbnMgPHNwc2VAc2VjcmV0Lm9yZy51az4KLSAqIENvcHlyaWdodCAoQykgMjAwNAkJR2FyZXRoIEJ1bHQgPEdhcmV0aEBFbmNyeXB0ZWMubmV0PgogICogQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUJSvZybiBFbmdlbCA8am9lcm5Ad2guZmgtd2VkZWwuZGU+CiAgKgogICogTGljZW5jZTogR1BMCkBAIC0yMCw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAKLSNkZWZpbmUgVkVSU0lPTiAiJFJldmlzaW9uOiAxLjIzICQiCisjZGVmaW5lIFZFUlNJT04gIiRSZXZpc2lvbjogMS4yOCAkIgogCiAKICNkZWZpbmUgRVJST1IoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgImJsb2NrMm10ZDogIiBmbXQgIlxuIiAsICMjIGFyZ3MpCkBAIC04OSw3ICs4OCw2IEBACiBzdGF0aWMgc3RydWN0IHBhZ2UqIHBhZ2VfcmVhZGFoZWFkKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBpbnQgaW5kZXgpCiB7CiAJZmlsbGVyX3QgKmZpbGxlciA9IChmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOwotCS8vZG9fcGFnZV9jYWNoZV9yZWFkYWhlYWQobWFwcGluZywgaW5kZXgsIFhYWCwgNjQpOwogCWNhY2hlX3JlYWRhaGVhZChtYXBwaW5nLCBpbmRleCk7CiAJcmV0dXJuIHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCwgZmlsbGVyLCBOVUxMKTsKIH0KQEAgLTE1Nyw3ICsxNTUsNyBAQAogCXN0cnVjdCBibG9jazJtdGRfZGV2ICpkZXYgPSBtdGQtPnByaXY7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGluZGV4ID0gZnJvbSA+PiBQQUdFX1NISUZUOwotCWludCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfU0hJRlQtMSk7CisJaW50IG9mZnNldCA9IGZyb20gJiAoUEFHRV9TSVpFLTEpOwogCWludCBjcHlsZW47CiAKIAlpZiAoZnJvbSA+IG10ZC0+c2l6ZSkKQEAgLTM3MCwxNiArMzY4LDE2IEBACiB9CiAKIAotc3RhdGljIGludCBwYXJzZV9udW0zMih1MzIgKm51bTMyLCBjb25zdCBjaGFyICp0b2tlbikKK3N0YXRpYyBpbnQgcGFyc2VfbnVtKHNpemVfdCAqbnVtLCBjb25zdCBjaGFyICp0b2tlbikKIHsKIAljaGFyICplbmRwOwotCXVuc2lnbmVkIGxvbmcgbjsKKwlzaXplX3QgbjsKIAotCW4gPSB1c3RydG91bCh0b2tlbiwgJmVuZHAsIDApOworCW4gPSAoc2l6ZV90KSB1c3RydG91bCh0b2tlbiwgJmVuZHAsIDApOwogCWlmICgqZW5kcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqbnVtMzIgPSBuOworCSpudW0gPSBuOwogCXJldHVybiAwOwogfQogCkBAIC00MjIsNyArNDIwLDcgQEAKIAljaGFyIGJ1Zls4MCsxMl0sICpzdHI9YnVmOyAvKiA4MCBmb3IgZGV2aWNlLCAxMiBmb3IgZXJhc2Ugc2l6ZSAqLwogCWNoYXIgKnRva2VuWzJdOwogCWNoYXIgKm5hbWU7Ci0JdTMyIGVyYXNlX3NpemUgPSBQQUdFX1NJWkU7CisJc2l6ZV90IGVyYXNlX3NpemUgPSBQQUdFX1NJWkU7CiAJaW50IGksIHJldDsKIAogCWlmIChzdHJubGVuKHZhbCwgc2l6ZW9mKGJ1ZikpID49IHNpemVvZihidWYpKQpAQCAtNDQ5LDcgKzQ0Nyw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKHRva2VuWzFdKSB7Ci0JCXJldCA9IHBhcnNlX251bTMyKCZlcmFzZV9zaXplLCB0b2tlblsxXSk7CisJCXJldCA9IHBhcnNlX251bSgmZXJhc2Vfc2l6ZSwgdG9rZW5bMV0pOwogCQlpZiAocmV0KQogCQkJcGFyc2VfZXJyKCJpbGxlZ2FsIGVyYXNlIHNpemUiKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL21zMDItbnYuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXMwMi1udi5jCmluZGV4IDM4MGZmMDguLmY1MDI2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXMwMi1udi5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXMwMi1udi5jCkBAIC02LDcgKzYsNyBAQAogICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKLSAqCSRJZDogbXMwMi1udi5jLHYgMS44IDIwMDUvMDEvMDUgMTg6MDU6MTIgZHdtdzIgRXhwICQKKyAqCSRJZDogbXMwMi1udi5jLHYgMS4xMCAyMDA1LzA2LzIwIDEyOjI0OjQxIG1hY3JvIEV4cCAkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTk5LDggKzk5LDggQEAKIAkgKiBUaGUgZmlybXdhcmUgd3JpdGVzIE1TMDJOVl9JRCBhdCBNUzAyTlZfTUFHSUMgYW5kIGFsc28KIAkgKiBhIGRpYWdub3N0aWMgc3RhdHVzIGF0IE1TMDJOVl9ESUFHLgogCSAqLwotCW1zMDJudl9kaWFncCA9IChtczAybnZfdWludCAqKShLU0VHMUFERFIoYWRkciArIE1TMDJOVl9ESUFHKSk7Ci0JbXMwMm52X21hZ2ljcCA9IChtczAybnZfdWludCAqKShLU0VHMUFERFIoYWRkciArIE1TMDJOVl9NQUdJQykpOworCW1zMDJudl9kaWFncCA9IChtczAybnZfdWludCAqKShDS1NFRzFBRERSKGFkZHIgKyBNUzAyTlZfRElBRykpOworCW1zMDJudl9tYWdpY3AgPSAobXMwMm52X3VpbnQgKikoQ0tTRUcxQUREUihhZGRyICsgTVMwMk5WX01BR0lDKSk7CiAJZXJyID0gZ2V0X2RiZShtczAybnZfbWFnaWMsIG1zMDJudl9tYWdpY3ApOwogCWlmIChlcnIpCiAJCXJldHVybiAwOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCWdvdG8gZXJyX291dF9jc3JfcmVzOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIm10ZCVkOiAlcyBhdCAweCUwOGx4LCBzaXplICV1TWlCLlxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJtdGQlZDogJXMgYXQgMHglMDhseCwgc2l6ZSAlenVNaUIuXG4iLAogCQltdGQtPmluZGV4LCBtczAybnZfbmFtZSwgYWRkciwgc2l6ZSA+PiAyMCk7CiAKIAltcC0+bmV4dCA9IHJvb3RfbXMwMm52X210ZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZHJhbS5jCmluZGV4IGVkYWM0MTUuLmJiNzEzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRyYW0uYwpAQCAtMSw5ICsxLDEwIEBACiAvKgogICogbXRkcmFtIC0gYSB0ZXN0IG10ZCBkZXZpY2UKLSAqICRJZDogbXRkcmFtLmMsdiAxLjM1IDIwMDUvMDEvMDUgMTg6MDU6MTIgZHdtdzIgRXhwICQKKyAqICRJZDogbXRkcmFtLmMsdiAxLjM3IDIwMDUvMDQvMjEgMDM6NDI6MTEgam9lcm4gRXhwICQKICAqIEF1dGhvcjogQWxleGFuZGVyIExhcnNzb24gPGFsZXhAY2VuZGlvLnNlPgogICoKICAqIENvcHlyaWdodCAoYykgMTk5OSBBbGV4YW5kZXIgTGFyc3NvbiA8YWxleEBjZW5kaW8uc2U+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSm9lcm4gRW5nZWwgPGpvZXJuQHdoLmZoLXdlZGVsLmRlPgogICoKICAqIFRoaXMgY29kZSBpcyBHUEwKICAqCkBAIC0xOCwyMTMgKzE5LDE0MCBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9jb21wYXRtYWMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAKLSNpZm5kZWYgQ09ORklHX01URFJBTV9BQlNfUE9TCi0gICNkZWZpbmUgQ09ORklHX01URFJBTV9BQlNfUE9TIDAKLSNlbmRpZgotCi0jaWYgQ09ORklHX01URFJBTV9BQlNfUE9TID4gMAotICAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIE1PRFVMRQogc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZSA9IENPTkZJR19NVERSQU1fVE9UQUxfU0laRTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVyYXNlX3NpemUgPSBDT05GSUdfTVREUkFNX0VSQVNFX1NJWkU7Ci1tb2R1bGVfcGFyYW0odG90YWxfc2l6ZSx1bG9uZywwKTsKLU1PRFVMRV9QQVJNX0RFU0ModG90YWxfc2l6ZSwgIlRvdGFsIGRldmljZSBzaXplIGluIEtpQiIpOwotbW9kdWxlX3BhcmFtKGVyYXNlX3NpemUsdWxvbmcsMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGVyYXNlX3NpemUsICJEZXZpY2UgZXJhc2UgYmxvY2sgc2l6ZSBpbiBLaUIiKTsKICNkZWZpbmUgTVREUkFNX1RPVEFMX1NJWkUgKHRvdGFsX3NpemUgKiAxMDI0KQogI2RlZmluZSBNVERSQU1fRVJBU0VfU0laRSAoZXJhc2Vfc2l6ZSAqIDEwMjQpCi0jZWxzZQotI2RlZmluZSBNVERSQU1fVE9UQUxfU0laRSAoQ09ORklHX01URFJBTV9UT1RBTF9TSVpFICogMTAyNCkKLSNkZWZpbmUgTVREUkFNX0VSQVNFX1NJWkUgKENPTkZJR19NVERSQU1fRVJBU0VfU0laRSAqIDEwMjQpCi0jZW5kaWYKIAorI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtKHRvdGFsX3NpemUsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModG90YWxfc2l6ZSwgIlRvdGFsIGRldmljZSBzaXplIGluIEtpQiIpOworbW9kdWxlX3BhcmFtKGVyYXNlX3NpemUsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZXJhc2Vfc2l6ZSwgIkRldmljZSBlcmFzZSBibG9jayBzaXplIGluIEtpQiIpOworI2VuZGlmCiAKIC8vIFdlIGNvdWxkIHN0b3JlIHRoZXNlIGluIHRoZSBtdGQgc3RydWN0dXJlLCBidXQgd2Ugb25seSBzdXBwb3J0IDEgZGV2aWNlLi4KIHN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm10ZF9pbmZvOwogCi0KLXN0YXRpYyBpbnQKLXJhbV9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQorc3RhdGljIGludCByYW1fZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKIHsKLSAgREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgInJhbV9lcmFzZShwb3M6JWxkLCBsZW46JWxkKVxuIiwgKGxvbmcpaW5zdHItPmFkZHIsIChsb25nKWluc3RyLT5sZW4pOwotICBpZiAoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gbXRkLT5zaXplKSB7Ci0gICAgREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgInJhbV9lcmFzZSgpIG91dCBvZiBib3VuZHMgKCVsZCA+ICVsZClcbiIsIChsb25nKShpbnN0ci0+YWRkciArIGluc3RyLT5sZW4pLCAobG9uZyltdGQtPnNpemUpOwotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0JCi0gIG1lbXNldCgoY2hhciAqKW10ZC0+cHJpdiArIGluc3RyLT5hZGRyLCAweGZmLCBpbnN0ci0+bGVuKTsKLQkKLSAgaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0RPTkU7Ci0gIG10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CisJaWYgKGluc3RyLT5hZGRyICsgaW5zdHItPmxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgcmV0dXJuIDA7CisJbWVtc2V0KChjaGFyICopbXRkLT5wcml2ICsgaW5zdHItPmFkZHIsIDB4ZmYsIGluc3RyLT5sZW4pOworCisJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0RPTkU7CisJbXRkX2VyYXNlX2NhbGxiYWNrKGluc3RyKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhbV9wb2ludCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICoqbXRkYnVmKQorc3RhdGljIGludCByYW1fcG9pbnQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAorCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICoqbXRkYnVmKQogewotICBpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkKLSAgICByZXR1cm4gLUVJTlZBTDsKLQkKLSAgKm10ZGJ1ZiA9IG10ZC0+cHJpdiArIGZyb207Ci0gICpyZXRsZW4gPSBsZW47Ci0gIHJldHVybiAwOworCWlmIChmcm9tICsgbGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSptdGRidWYgPSBtdGQtPnByaXYgKyBmcm9tOworCSpyZXRsZW4gPSBsZW47CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhbV91bnBvaW50IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICphZGRyLCBsb2ZmX3QgZnJvbSwKLQkJCSBzaXplX3QgbGVuKQorc3RhdGljIHZvaWQgcmFtX3VucG9pbnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqIGFkZHIsIGxvZmZfdCBmcm9tLAorCQlzaXplX3QgbGVuKQogewotICBERUJVRyhNVERfREVCVUdfTEVWRUwyLCAicmFtX3VucG9pbnRcbiIpOwogfQogCiBzdGF0aWMgaW50IHJhbV9yZWFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKLQkgICAgIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKKwkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQogewotICBERUJVRyhNVERfREVCVUdfTEVWRUwyLCAicmFtX3JlYWQocG9zOiVsZCwgbGVuOiVsZClcbiIsIChsb25nKWZyb20sIChsb25nKWxlbik7Ci0gIGlmIChmcm9tICsgbGVuID4gbXRkLT5zaXplKSB7Ci0gICAgREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgInJhbV9yZWFkKCkgb3V0IG9mIGJvdW5kcyAoJWxkID4gJWxkKVxuIiwgKGxvbmcpKGZyb20gKyBsZW4pLCAobG9uZyltdGQtPnNpemUpOwotICAgIHJldHVybiAtRUlOVkFMOwotICB9CisJaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOwogCi0gIG1lbWNweShidWYsIG10ZC0+cHJpdiArIGZyb20sIGxlbik7CisJbWVtY3B5KGJ1ZiwgbXRkLT5wcml2ICsgZnJvbSwgbGVuKTsKIAotICAqcmV0bGVuPWxlbjsKLSAgcmV0dXJuIDA7CisJKnJldGxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCByYW1fd3JpdGUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwKLQkgICAgICBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpCisJCXNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZikKIHsKLSAgREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgInJhbV93cml0ZShwb3M6JWxkLCBsZW46JWxkKVxuIiwgKGxvbmcpdG8sIChsb25nKWxlbik7Ci0gIGlmICh0byArIGxlbiA+IG10ZC0+c2l6ZSkgewotICAgIERFQlVHKE1URF9ERUJVR19MRVZFTDEsICJyYW1fd3JpdGUoKSBvdXQgb2YgYm91bmRzICglbGQgPiAlbGQpXG4iLCAobG9uZykodG8gKyBsZW4pLCAobG9uZyltdGQtPnNpemUpOwotICAgIHJldHVybiAtRUlOVkFMOwotICB9CisJaWYgKHRvICsgbGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICBtZW1jcHkgKChjaGFyICopbXRkLT5wcml2ICsgdG8sIGJ1ZiwgbGVuKTsKKwltZW1jcHkoKGNoYXIgKiltdGQtPnByaXYgKyB0bywgYnVmLCBsZW4pOwogCi0gICpyZXRsZW49bGVuOwotICByZXR1cm4gMDsKKwkqcmV0bGVuID0gbGVuOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9tdGRyYW0odm9pZCkKIHsKLSAgaWYgKG10ZF9pbmZvKSB7Ci0gICAgZGVsX210ZF9kZXZpY2UobXRkX2luZm8pOwotI2lmIENPTkZJR19NVERSQU1fVE9UQUxfU0laRSA+IDAKLSAgICBpZiAobXRkX2luZm8tPnByaXYpCi0jaWYgQ09ORklHX01URFJBTV9BQlNfUE9TID4gMAotICAgICAgaW91bm1hcChtdGRfaW5mby0+cHJpdik7Ci0jZWxzZQotICAgICAgdmZyZWUobXRkX2luZm8tPnByaXYpOwotI2VuZGlmCQotI2VuZGlmCi0gICAga2ZyZWUobXRkX2luZm8pOwotICB9CisJaWYgKG10ZF9pbmZvKSB7CisJCWRlbF9tdGRfZGV2aWNlKG10ZF9pbmZvKTsKKwkJaWYgKG10ZF9pbmZvLT5wcml2KQorCQkJdmZyZWUobXRkX2luZm8tPnByaXYpOworCQlrZnJlZShtdGRfaW5mbyk7CisJfQogfQogCi1pbnQgbXRkcmFtX2luaXRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB2b2lkICptYXBwZWRfYWRkcmVzcywgCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqbmFtZSkKK2ludCBtdGRyYW1faW5pdF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHZvaWQgKm1hcHBlZF9hZGRyZXNzLAorCQl1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKm5hbWUpCiB7Ci0gICBtZW1zZXQobXRkLCAwLCBzaXplb2YoKm10ZCkpOworCW1lbXNldChtdGQsIDAsIHNpemVvZigqbXRkKSk7CiAKLSAgIC8qIFNldHVwIHRoZSBNVEQgc3RydWN0dXJlICovCi0gICBtdGQtPm5hbWUgPSBuYW1lOwotICAgbXRkLT50eXBlID0gTVREX1JBTTsKLSAgIG10ZC0+ZmxhZ3MgPSBNVERfQ0FQX1JBTTsKLSAgIG10ZC0+c2l6ZSA9IHNpemU7Ci0gICBtdGQtPmVyYXNlc2l6ZSA9IE1URFJBTV9FUkFTRV9TSVpFOwotICAgbXRkLT5wcml2ID0gbWFwcGVkX2FkZHJlc3M7CisJLyogU2V0dXAgdGhlIE1URCBzdHJ1Y3R1cmUgKi8KKwltdGQtPm5hbWUgPSBuYW1lOworCW10ZC0+dHlwZSA9IE1URF9SQU07CisJbXRkLT5mbGFncyA9IE1URF9DQVBfUkFNOworCW10ZC0+c2l6ZSA9IHNpemU7CisJbXRkLT5lcmFzZXNpemUgPSBNVERSQU1fRVJBU0VfU0laRTsKKwltdGQtPnByaXYgPSBtYXBwZWRfYWRkcmVzczsKIAotICAgbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwotICAgbXRkLT5lcmFzZSA9IHJhbV9lcmFzZTsKLSAgIG10ZC0+cG9pbnQgPSByYW1fcG9pbnQ7Ci0gICBtdGQtPnVucG9pbnQgPSByYW1fdW5wb2ludDsKLSAgIG10ZC0+cmVhZCA9IHJhbV9yZWFkOwotICAgbXRkLT53cml0ZSA9IHJhbV93cml0ZTsKKwltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisJbXRkLT5lcmFzZSA9IHJhbV9lcmFzZTsKKwltdGQtPnBvaW50ID0gcmFtX3BvaW50OworCW10ZC0+dW5wb2ludCA9IHJhbV91bnBvaW50OworCW10ZC0+cmVhZCA9IHJhbV9yZWFkOworCW10ZC0+d3JpdGUgPSByYW1fd3JpdGU7CiAKLSAgIGlmIChhZGRfbXRkX2RldmljZShtdGQpKSB7Ci0gICAgIHJldHVybiAtRUlPOwotICAgfQotICAgCi0gICByZXR1cm4gMDsKKwlpZiAoYWRkX210ZF9kZXZpY2UobXRkKSkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAotI2lmIENPTkZJR19NVERSQU1fVE9UQUxfU0laRSA+IDAKLSNpZiBDT05GSUdfTVREUkFNX0FCU19QT1MgPiAwCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X210ZHJhbSh2b2lkKQotewotICB2b2lkICphZGRyOwotICBpbnQgZXJyOwotICAvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSAqLwotICAgbXRkX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLCBHRlBfS0VSTkVMKTsKLSAgIGlmICghbXRkX2luZm8pCi0gICAgIHJldHVybiAtRU5PTUVNOwotICAgCi0gIGFkZHIgPSBpb3JlbWFwKENPTkZJR19NVERSQU1fQUJTX1BPUywgTVREUkFNX1RPVEFMX1NJWkUpOwotICBpZiAoIWFkZHIpIHsKLSAgICBERUJVRyhNVERfREVCVUdfTEVWRUwxLCAKLSAgICAgICAgICAiRmFpbGVkIHRvIGlvcmVtYXApIG1lbW9yeSByZWdpb24gb2Ygc2l6ZSAlbGQgYXQgQUJTX1BPUzolbGRcbiIsIAotICAgICAgICAgIChsb25nKU1URFJBTV9UT1RBTF9TSVpFLCAobG9uZylDT05GSUdfTVREUkFNX0FCU19QT1MpOwotICAgIGtmcmVlKG10ZF9pbmZvKTsKLSAgICBtdGRfaW5mbyA9IE5VTEw7Ci0gICAgcmV0dXJuIC1FTk9NRU07Ci0gIH0KLSAgZXJyID0gbXRkcmFtX2luaXRfZGV2aWNlKG10ZF9pbmZvLCBhZGRyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1URFJBTV9UT1RBTF9TSVpFLCAibXRkcmFtIHRlc3QgZGV2aWNlIik7Ci0gIGlmIChlcnIpIAotICB7Ci0gICAgaW91bm1hcChhZGRyKTsKLSAgICBrZnJlZShtdGRfaW5mbyk7Ci0gICAgbXRkX2luZm8gPSBOVUxMOwotICAgIHJldHVybiBlcnI7Ci0gIH0KLSAgbWVtc2V0KG10ZF9pbmZvLT5wcml2LCAweGZmLCBNVERSQU1fVE9UQUxfU0laRSk7Ci0gIHJldHVybiBlcnI7Ci19Ci0KLSNlbHNlIC8qIENPTkZJR19NVERSQU1fQUJTX1BPUyA+IDAgKi8KLQogc3RhdGljIGludCBfX2luaXQgaW5pdF9tdGRyYW0odm9pZCkKIHsKLSAgdm9pZCAqYWRkcjsKLSAgaW50IGVycjsKLSAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgKi8KLSAgIG10ZF9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0gICBpZiAoIW10ZF9pbmZvKQotICAgICByZXR1cm4gLUVOT01FTTsKKwl2b2lkICphZGRyOworCWludCBlcnI7CiAKLSAgYWRkciA9IHZtYWxsb2MoTVREUkFNX1RPVEFMX1NJWkUpOwotICBpZiAoIWFkZHIpIHsKLSAgICBERUJVRyhNVERfREVCVUdfTEVWRUwxLCAKLSAgICAgICAgICAiRmFpbGVkIHRvIHZtYWxsb2MgbWVtb3J5IHJlZ2lvbiBvZiBzaXplICVsZFxuIiwgCi0gICAgICAgICAgKGxvbmcpTVREUkFNX1RPVEFMX1NJWkUpOwotICAgIGtmcmVlKG10ZF9pbmZvKTsKLSAgICBtdGRfaW5mbyA9IE5VTEw7Ci0gICAgcmV0dXJuIC1FTk9NRU07Ci0gIH0KLSAgZXJyID0gbXRkcmFtX2luaXRfZGV2aWNlKG10ZF9pbmZvLCBhZGRyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1URFJBTV9UT1RBTF9TSVpFLCAibXRkcmFtIHRlc3QgZGV2aWNlIik7Ci0gIGlmIChlcnIpIAotICB7Ci0gICAgdmZyZWUoYWRkcik7Ci0gICAga2ZyZWUobXRkX2luZm8pOwotICAgIG10ZF9pbmZvID0gTlVMTDsKLSAgICByZXR1cm4gZXJyOwotICB9Ci0gIG1lbXNldChtdGRfaW5mby0+cHJpdiwgMHhmZiwgTVREUkFNX1RPVEFMX1NJWkUpOwotICByZXR1cm4gZXJyOworCWlmICghdG90YWxfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSAqLworCW10ZF9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdGRfaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGRyID0gdm1hbGxvYyhNVERSQU1fVE9UQUxfU0laRSk7CisJaWYgKCFhZGRyKSB7CisJCWtmcmVlKG10ZF9pbmZvKTsKKwkJbXRkX2luZm8gPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZXJyID0gbXRkcmFtX2luaXRfZGV2aWNlKG10ZF9pbmZvLCBhZGRyLCBNVERSQU1fVE9UQUxfU0laRSwgIm10ZHJhbSB0ZXN0IGRldmljZSIpOworCWlmIChlcnIpIHsKKwkJdmZyZWUoYWRkcik7CisJCWtmcmVlKG10ZF9pbmZvKTsKKwkJbXRkX2luZm8gPSBOVUxMOworCQlyZXR1cm4gZXJyOworCX0KKwltZW1zZXQobXRkX2luZm8tPnByaXYsIDB4ZmYsIE1URFJBTV9UT1RBTF9TSVpFKTsKKwlyZXR1cm4gZXJyOwogfQotI2VuZGlmIC8qICEoQ09ORklHX01URFJBTV9BQlNfUE9TID4gMCkgKi8KLQotI2Vsc2UgLyogQ09ORklHX01URFJBTV9UT1RBTF9TSVpFID4gMCAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X210ZHJhbSh2b2lkKQotewotICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiAhKENPTkZJR19NVERSQU1fVE9UQUxfU0laRSA+IDApICovCiAKIG1vZHVsZV9pbml0KGluaXRfbXRkcmFtKTsKIG1vZHVsZV9leGl0KGNsZWFudXBfbXRkcmFtKTsKQEAgLTIzMiw0ICsxNjAsMyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiQWxleGFuZGVyIExhcnNzb24gPGFsZXhsQHJlZGhhdC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXVsYXRlZCBNVEQgZHJpdmVyIGZvciB0ZXN0aW5nIik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvcGhyYW0uYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvcGhyYW0uYwppbmRleCA1ZjhlMTY0Li5hNDIzYTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL3BocmFtLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9waHJhbS5jCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiAkSWQ6IHBocmFtLmMsdiAxLjExIDIwMDUvMDEvMDUgMTg6MDU6MTMgZHdtdzIgRXhwICQKKyAqICRJZDogcGhyYW0uYyx2IDEuMTQgMjAwNS8wMy8wNyAyMTo0MzozOCBqb2VybiBFeHAgJAogICoKICAqIENvcHlyaWdodCAoYykgPz8/PwkJSm9jaGVuIFNjaOR1YmxlIDxwc2lvbmljQHBzaW9uaWMuZGU+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNAlK9nJuIEVuZ2VsIDxqb2VybkB3aC5maC13ZWRlbC5kZT4KQEAgLTE1LDkgKzE1LDcgQEAKICAqCiAgKiBFeGFtcGxlOgogICoJcGhyYW09c3dhcCw2NE1pLDEyOE1pIHBocmFtPXRlc3QsOTAwTWksMU1pCi0gKgogICovCi0KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zNiw3ICszNCw2IEBACiBzdGF0aWMgTElTVF9IRUFEKHBocmFtX2xpc3QpOwogCiAKLQogc3RhdGljIGludCBwaHJhbV9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQogewogCXVfY2hhciAqc3RhcnQgPSBtdGQtPnByaXY7CkBAIC03MSw3ICs2OCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBocmFtX3VucG9pbnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYWRkciwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pCitzdGF0aWMgdm9pZCBwaHJhbV91bnBvaW50KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmFkZHIsIGxvZmZfdCBmcm9tLAorCQlzaXplX3QgbGVuKQogewogfQogCkBAIC04MCw4ICs3OCwxMSBAQAogewogCXVfY2hhciAqc3RhcnQgPSBtdGQtPnByaXY7CiAKLQlpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkKKwlpZiAoZnJvbSA+PSBtdGQtPnNpemUpCiAJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxlbiA+IG10ZC0+c2l6ZSAtIGZyb20pCisJCWxlbiA9IG10ZC0+c2l6ZSAtIGZyb207CiAJCiAJbWVtY3B5KGJ1Ziwgc3RhcnQgKyBmcm9tLCBsZW4pOwogCkBAIC05NCw4ICs5NSwxMSBAQAogewogCXVfY2hhciAqc3RhcnQgPSBtdGQtPnByaXY7CiAKLQlpZiAodG8gKyBsZW4gPiBtdGQtPnNpemUpCisJaWYgKHRvID49IG10ZC0+c2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVuID4gbXRkLT5zaXplIC0gdG8pCisJCWxlbiA9IG10ZC0+c2l6ZSAtIHRvOwogCQogCW1lbWNweShzdGFydCArIHRvLCBidWYsIGxlbik7CiAKQEAgLTEwNyw5ICsxMTEsOSBAQAogCiBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX2RldmljZXModm9pZCkKIHsKLQlzdHJ1Y3QgcGhyYW1fbXRkX2xpc3QgKnRoaXM7CisJc3RydWN0IHBocmFtX210ZF9saXN0ICp0aGlzLCAqc2FmZTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJnBocmFtX2xpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGhpcywgc2FmZSwgJnBocmFtX2xpc3QsIGxpc3QpIHsKIAkJZGVsX210ZF9kZXZpY2UoJnRoaXMtPm10ZCk7CiAJCWlvdW5tYXAodGhpcy0+bXRkLnByaXYpOwogCQlrZnJlZSh0aGlzKTsKQEAgLTE0NSw3ICsxNDksNyBAQAogCW5ldy0+bXRkLndyaXRlID0gcGhyYW1fd3JpdGU7CiAJbmV3LT5tdGQub3duZXIgPSBUSElTX01PRFVMRTsKIAluZXctPm10ZC50eXBlID0gTVREX1JBTTsKLQluZXctPm10ZC5lcmFzZXNpemUgPSAwOworCW5ldy0+bXRkLmVyYXNlc2l6ZSA9IFBBR0VfU0laRTsKIAogCXJldCA9IC1FQUdBSU47CiAJaWYgKGFkZF9tdGRfZGV2aWNlKCZuZXctPm10ZCkpIHsKQEAgLTIxNCw2ICsyMTgsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorCitzdGF0aWMgaW5saW5lIHZvaWQga2lsbF9maW5hbF9uZXdsaW5lKGNoYXIgKnN0cikKK3sKKwljaGFyICpuZXdsaW5lID0gc3RycmNocihzdHIsICdcbicpOworCWlmIChuZXdsaW5lICYmICFuZXdsaW5lWzFdKQorCQkqbmV3bGluZSA9IDA7Cit9CisKKwogI2RlZmluZSBwYXJzZV9lcnIoZm10LCBhcmdzLi4uKSBkbyB7CVwKIAlFUlJPUihmbXQgLCAjIyBhcmdzKTsJXAogCXJldHVybiAwOwkJXApAQCAtMjMyLDYgKzI0NSw3IEBACiAJCXBhcnNlX2VycigicGFyYW1ldGVyIHRvbyBsb25nXG4iKTsKIAogCXN0cmNweShzdHIsIHZhbCk7CisJa2lsbF9maW5hbF9uZXdsaW5lKHN0cik7CiAKIAlmb3IgKGk9MDsgaTwzOyBpKyspCiAJCXRva2VuW2ldID0gc3Ryc2VwKCZzdHIsICIsIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL3NscmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3NscmFtLmMKaW5kZXggNWFiMTVlNi4uODRmYTkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9zbHJhbS5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvc2xyYW0uYwpAQCAtMSw2ICsxLDYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gICRJZDogc2xyYW0uYyx2IDEuMzMgMjAwNS8wMS8wNSAxODowNToxMyBkd213MiBFeHAgJAorICAkSWQ6IHNscmFtLmMsdiAxLjM0IDIwMDUvMDEvMDYgMjE6MTY6NDIgandib3llciBFeHAgJAogCiAgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGEgbWV0aG9kIHRvIGFjY2VzcyBtZW1vcnkgbm90IHVzZWQgYnkgdGhlIGtlcm5lbAogICBpdHNlbGYgKGkuZS4gaWYgdGhlIGtlcm5lbCBjb21tYW5kbGluZSBtZW09eHh4IGlzIHVzZWQpLiBUbyBhY3R1YWxseQpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KIAogI2RlZmluZSBTTFJBTV9NQVhfREVWSUNFU19QQVJBTVMgNgkJLyogMyBwYXJhbWV0ZXJzIC8gZGV2aWNlICovCisjZGVmaW5lIFNMUkFNX0JMS19TWiAweDQwMDAKIAogI2RlZmluZSBUKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm10LCAjIyBhcmdzKQogI2RlZmluZSBFKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fTk9USUNFIGZtdCwgIyMgYXJncykKQEAgLTEwOCw2ICsxMDksOSBAQAogewogCXNscmFtX3ByaXZfdCAqcHJpdiA9IG10ZC0+cHJpdjsKIAorCWlmIChmcm9tICsgbGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCSptdGRidWYgPSBwcml2LT5zdGFydCArIGZyb207CiAJKnJldGxlbiA9IGxlbjsKIAlyZXR1cm4oMCk7CkBAIC0xMjEsNyArMTI1LDEzIEBACiAJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKIHsKIAlzbHJhbV9wcml2X3QgKnByaXYgPSBtdGQtPnByaXY7Ci0JCisKKwlpZiAoZnJvbSA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkKKwkJbGVuID0gbXRkLT5zaXplIC0gZnJvbTsKKwogCW1lbWNweShidWYsIHByaXYtPnN0YXJ0ICsgZnJvbSwgbGVuKTsKIAogCSpyZXRsZW4gPSBsZW47CkBAIC0xMzMsNiArMTQzLDkgQEAKIHsKIAlzbHJhbV9wcml2X3QgKnByaXYgPSBtdGQtPnByaXY7CiAKKwlpZiAodG8gKyBsZW4gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCiAJbWVtY3B5KHByaXYtPnN0YXJ0ICsgdG8sIGJ1ZiwgbGVuKTsKIAogCSpyZXRsZW4gPSBsZW47CkBAIC0xODgsNyArMjAxLDcgQEAKIAkoKmN1cm10ZCktPm10ZGluZm8tPm5hbWUgPSBuYW1lOwogCSgqY3VybXRkKS0+bXRkaW5mby0+c2l6ZSA9IGxlbmd0aDsKIAkoKmN1cm10ZCktPm10ZGluZm8tPmZsYWdzID0gTVREX0NMRUFSX0JJVFMgfCBNVERfU0VUX0JJVFMgfAotCQkJCQlNVERfV1JJVEVCX1dSSVRFQUJMRSB8IE1URF9WT0xBVElMRTsKKwkJCQkJTVREX1dSSVRFQl9XUklURUFCTEUgfCBNVERfVk9MQVRJTEUgfCBNVERfQ0FQX1JBTTsKICAgICAgICAgKCpjdXJtdGQpLT5tdGRpbmZvLT5lcmFzZSA9IHNscmFtX2VyYXNlOwogCSgqY3VybXRkKS0+bXRkaW5mby0+cG9pbnQgPSBzbHJhbV9wb2ludDsKIAkoKmN1cm10ZCktPm10ZGluZm8tPnVucG9pbnQgPSBzbHJhbV91bnBvaW50OwpAQCAtMTk2LDcgKzIwOSw3IEBACiAJKCpjdXJtdGQpLT5tdGRpbmZvLT53cml0ZSA9IHNscmFtX3dyaXRlOwogCSgqY3VybXRkKS0+bXRkaW5mby0+b3duZXIgPSBUSElTX01PRFVMRTsKIAkoKmN1cm10ZCktPm10ZGluZm8tPnR5cGUgPSBNVERfUkFNOwotCSgqY3VybXRkKS0+bXRkaW5mby0+ZXJhc2VzaXplID0gMHgwOworCSgqY3VybXRkKS0+bXRkaW5mby0+ZXJhc2VzaXplID0gU0xSQU1fQkxLX1NaOwogCiAJaWYgKGFkZF9tdGRfZGV2aWNlKCgqY3VybXRkKS0+bXRkaW5mbykpCXsKIAkJRSgic2xyYW06IEZhaWxlZCB0byByZWdpc3RlciBuZXcgZGV2aWNlXG4iKTsKQEAgLTI2MSw3ICsyNzQsNyBAQAogCX0KIAlUKCJzbHJhbTogZGV2bmFtZT0lcywgZGV2c3RhcnQ9MHglbHgsIGRldmxlbmd0aD0weCVseFxuIiwKIAkJCWRldm5hbWUsIGRldnN0YXJ0LCBkZXZsZW5ndGgpOwotCWlmICgoZGV2c3RhcnQgPCAwKSB8fCAoZGV2bGVuZ3RoIDwgMCkpIHsKKwlpZiAoKGRldnN0YXJ0IDwgMCkgfHwgKGRldmxlbmd0aCA8IDApIHx8IChkZXZsZW5ndGggJSBTTFJBTV9CTEtfU1ogIT0gMCkpIHsKIAkJRSgic2xyYW06IElsbGVnYWwgc3RhcnQgLyBsZW5ndGggcGFyYW1ldGVyLlxuIik7CiAJCXJldHVybigtRUlOVkFMKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9mdGwuYyBiL2RyaXZlcnMvbXRkL2Z0bC5jCmluZGV4IDE4Y2M4ODQuLmQ5YWI2MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2Z0bC5jCisrKyBiL2RyaXZlcnMvbXRkL2Z0bC5jCkBAIC0xLDUgKzEsNSBAQAogLyogVGhpcyB2ZXJzaW9uIHBvcnRlZCB0byB0aGUgTGludXgtTVREIHN5c3RlbSBieSBkd213MkBpbmZyYWRlYWQub3JnCi0gKiAkSWQ6IGZ0bC5jLHYgMS41NCAyMDA0LzExLzE2IDE4OjMzOjE1IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGZ0bC5jLHYgMS41NSAyMDA1LzAxLzE3IDEzOjQ3OjIxIGh2ciBFeHAgJAogICoKICAqIEZpeGVzOiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KICAqIC0gZml4ZXMgc29tZSBsZWFrcyBvbiBmYWlsdXJlIGluIGJ1aWxkX21hcHMgYW5kIGZ0bF9ub3RpZnlfYWRkLCBjbGVhbnVwcwpAQCAtMzU3LDYgKzM1Nyw3IEBACiAgICAgaWYgKCFlcmFzZSkgCiAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKIAorICAgIGVyYXNlLT5tdGQgPSBwYXJ0LT5tYmQubXRkOwogICAgIGVyYXNlLT5jYWxsYmFjayA9IGZ0bF9lcmFzZV9jYWxsYmFjazsKICAgICBlcmFzZS0+YWRkciA9IHhmZXItPk9mZnNldDsKICAgICBlcmFzZS0+bGVuID0gMSA8PCBwYXJ0LT5oZWFkZXIuRXJhc2VVbml0U2l6ZTsKQEAgLTEwOTYsNyArMTA5Nyw3IEBACiAKIGludCBpbml0X2Z0bCh2b2lkKQogewotCURFQlVHKDAsICIkSWQ6IGZ0bC5jLHYgMS41NCAyMDA0LzExLzE2IDE4OjMzOjE1IGR3bXcyIEV4cCAkXG4iKTsKKwlERUJVRygwLCAiJElkOiBmdGwuYyx2IDEuNTUgMjAwNS8wMS8xNyAxMzo0NzoyMSBodnIgRXhwICRcbiIpOwogCiAJcmV0dXJuIHJlZ2lzdGVyX210ZF9ibGt0cmFucygmZnRsX3RyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwppbmRleCAyYmVhMmUwLi40NDc4MWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogIyBkcml2ZXJzL210ZC9tYXBzL0tjb25maWcKLSMgJElkOiBLY29uZmlnLHYgMS40MiAyMDA1LzAxLzA1IDE2OjU5OjUwIGR3bXcyIEV4cCAkCisjICRJZDogS2NvbmZpZyx2IDEuNTUgMjAwNS8wNy8wMiAwMTo1MzoyNCB0cG95bm9yIEV4cCAkCiAKIG1lbnUgIk1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MiCiAJZGVwZW5kcyBvbiBNVEQhPW4KQEAgLTEyMiwxNiArMTIyLDYgQEAKIAkgIE1vcmUgaW5mbyBhdAogCSAgPGh0dHA6Ly93d3cuYXJjb21jb250cm9scy5jb20vcHJvZHVjdHMvaWNwL3BjMTA0L3Byb2Nlc3NvcnMvU0JDX0dYMS5odG0+LgogCi1jb25maWcgTVREX0VMQU5fMTA0TkMKLQl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gQXJjb20gRUxBTi0xMDROQyIKLQlkZXBlbmRzIG9uIFg4NiAmJiBNVERfQ0ZJX0lOVEVMRVhUICYmIE1URF9QQVJUSVRJT05TICYmIE1URF9DT01QTEVYX01BUFBJTkdTCi0JaGVscAotCSAgVGhpcyBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIG9uLWJvYXJkIGZsYXNoIG9mIHRoZSBBcmNvbSBDb250cm9sCi0JICBTeXN0ZW0ncyBFTEFOLTEwNE5DIGRldmVsb3BtZW50IGJvYXJkLiBCeSBkZWZhdWx0IHRoZSBmbGFzaAotCSAgaXMgc3BsaXQgaW50byAzIHBhcnRpdGlvbnMgd2hpY2ggYXJlIGFjY2Vzc2VkIGFzIHNlcGFyYXRlIE1URAotCSAgZGV2aWNlcy4gVGhpcyBib2FyZCB1dGlsaXplcyBJbnRlbCBTdHJhdGFGbGFzaC4gTW9yZSBpbmZvIGF0Ci0JICA8aHR0cDovL3d3dy5hcmNvbWNvbnRyb2xzLmNvbS9wcm9kdWN0cy9pY3AvcGMxMDQvcHJvY2Vzc29ycy9FTEFOMTA0TkMuaHRtPi4KLQogY29uZmlnIE1URF9MVUJCT0NLCiAJdHJpc3RhdGUgIkNGSSBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIEludGVsIEx1YmJvY2sgWFNjYWxlIGV2YWwgYm9hcmQiCiAJZGVwZW5kcyBvbiBBUkNIX0xVQkJPQ0sgJiYgTVREX0NGSV9JTlRFTEVYVCAmJiBNVERfUEFSVElUSU9OUwpAQCAtMTM5LDYgKzEyOSwxNCBAQAogCSAgVGhpcyBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIG9uLWJvYXJkIGZsYXNoIG9mIHRoZSBJbnRlbAogCSAgJ0x1YmJvY2snIFhTY2FsZSBldmFsdWF0aW9uIGJvYXJkLgogCitjb25maWcgTVREX01BSU5TVE9ORQorCXRyaXN0YXRlICJDRkkgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBJbnRlbCBNYWluc3RvbmUgWFNjYWxlIGV2YWwgYm9hcmQiCisJZGVwZW5kcyBvbiBNQUNIX01BSU5TVE9ORSAmJiBNVERfQ0ZJX0lOVEVMRVhUCisJc2VsZWN0IE1URF9QQVJUSVRJT05TCisJaGVscAorCSAgVGhpcyBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIG9uLWJvYXJkIGZsYXNoIG9mIHRoZSBJbnRlbAorCSAgJ01haW5zdG9uZSBQWEEyN3ggZXZhbHVhdGlvbiBib2FyZC4KKwogY29uZmlnIE1URF9PQ1RBR09OCiAJdHJpc3RhdGUgIkpFREVDIEZsYXNoIGRldmljZSBtYXBwZWQgb24gT2N0YWdvbiA1MDY2IFNCQyIKIAlkZXBlbmRzIG9uIFg4NiAmJiBNVERfSkVERUMgJiYgTVREX0NPTVBMRVhfTUFQUElOR1MKQEAgLTIxMyw3NCArMjExLDExIEBACiAJaGVscAogCSAgU3VwcG9ydCBmb3IgZmxhc2ggY2hpcHMgb24gTkVUdGVsL1NlY3VyZUVkZ2UvU25hcEdlYXIgYm9hcmRzLgogCi1jb25maWcgTVREX1BCMVhYWAotCXRyaXN0YXRlICJGbGFzaCBkZXZpY2VzIG9uIEFsY2hlbXkgUEIxeHh4IGJvYXJkcyIKLQlkZXBlbmRzIG9uIE1JUFMgJiYgKCBNSVBTX1BCMTAwMCB8fCBNSVBTX1BCMTEwMCB8fCBNSVBTX1BCMTUwMCApCitjb25maWcgTVREX0FMQ0hFTVkKKwl0cmlzdGF0ZSAnICBBTUQgQWxjaGVteSBQYjF4eHgvRGIxeHh4L1JESyBNVEQgc3VwcG9ydCcgCisJZGVwZW5kcyBvbiBNSVBTICYmIFNPQ19BVTFYMDAKIAloZWxwCi0JICBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFsY2hlbXkgUGIxMDAwL1BiMTEwMC9QYjE1MDAgYm9hcmRzCi0KLWNvbmZpZyBNVERfUEIxWFhYX0JPT1QKLQlib29sICJQQjF4MDAgYm9vdCBmbGFzaCBkZXZpY2UiCi0JZGVwZW5kcyBvbiBNVERfUEIxWFhYICYmICggTUlQU19QQjExMDAgfHwgTUlQU19QQjE1MDAgKQotCWhlbHAKLQkgIFVzZSB0aGUgZmlyc3Qgb2YgdGhlIHR3byAzMk1pQiBmbGFzaCBiYW5rcyBvbiBQYjExMDAvUGIxNTAwIGJvYXJkLgotCSAgWW91IGNhbiBzYXkgJ1knIHRvIGJvdGggdGhpcyBhbmQgJ01URF9QQjFYWFhfVVNFUicgYmVsb3csIHRvIHVzZQotCSAgYm90aCBiYW5rcy4KLQotY29uZmlnIE1URF9QQjFYWFhfVVNFUgotCWJvb2wgIlBCMXgwMCB1c2VyIGZsYXNoIGRldmljZSIKLQlkZXBlbmRzIG9uIE1URF9QQjFYWFggJiYgKCBNSVBTX1BCMTEwMCB8fCBNSVBTX1BCMTUwMCApCi0JZGVmYXVsdCB5IGlmIE1URF9QQjFYWF9CT09UID0gbgotCWhlbHAKLQkgIFVzZSB0aGUgc2Vjb25kIG9mIHRoZSB0d28gMzJNaUIgZmxhc2ggYmFua3Mgb24gUGIxMTAwL1BiMTUwMCBib2FyZC4KLQkgIFlvdSBjYW4gc2F5ICdZJyB0byBib3RoIHRoaXMgYW5kICdNVERfUEIxWFhYX0JPT1QnIGFib3ZlLCB0byB1c2UKLQkgIGJvdGggYmFua3MuCi0KLWNvbmZpZyBNVERfUEIxNTUwCi0JdHJpc3RhdGUgIkZsYXNoIGRldmljZXMgb24gQWxjaGVteSBQQjE1NTAgYm9hcmQiCi0JZGVwZW5kcyBvbiBNSVBTICYmIE1JUFNfUEIxNTUwCi0JaGVscAotCSAgRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBBbGNoZW15IFBiMTU1MCBib2FyZAotCi1jb25maWcgTVREX1BCMTU1MF9CT09UCi0JYm9vbCAiUEIxNTUwIGJvb3QgZmxhc2ggZGV2aWNlIgotCWRlcGVuZHMgb24gTVREX1BCMTU1MAotCWhlbHAKLQkgIFVzZSB0aGUgZmlyc3Qgb2YgdGhlIHR3byA2NE1pQiBmbGFzaCBiYW5rcyBvbiBQYjE1NTAgYm9hcmQuCi0JICBZb3UgY2FuIHNheSAnWScgdG8gYm90aCB0aGlzIGFuZCAnTVREX1BCMTU1MF9VU0VSJyBiZWxvdywgdG8gdXNlCi0JICBib3RoIGJhbmtzLgotCi1jb25maWcgTVREX1BCMTU1MF9VU0VSCi0JYm9vbCAiUEIxNTUwIHVzZXIgZmxhc2ggZGV2aWNlIgotCWRlcGVuZHMgb24gTVREX1BCMTU1MAotCWRlZmF1bHQgeSBpZiBNVERfUEIxNTUwX0JPT1QgPSBuCi0JaGVscAotCSAgVXNlIHRoZSBzZWNvbmQgb2YgdGhlIHR3byA2NE1pQiBmbGFzaCBiYW5rcyBvbiBQYjE1NTAgYm9hcmQuCi0JICBZb3UgY2FuIHNheSAnWScgdG8gYm90aCB0aGlzIGFuZCAnTVREX1BCMTU1MF9CT09UJyBhYm92ZSwgdG8gdXNlCi0JICBib3RoIGJhbmtzLgotCi1jb25maWcgTVREX0RCMTU1MAotCXRyaXN0YXRlICJGbGFzaCBkZXZpY2VzIG9uIEFsY2hlbXkgREIxNTUwIGJvYXJkIgotCWRlcGVuZHMgb24gTUlQUyAmJiBNSVBTX0RCMTU1MAotCWhlbHAKLQkgIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQWxjaGVteSBEYjE1NTAgYm9hcmQKLQotY29uZmlnIE1URF9EQjE1NTBfQk9PVAotCWJvb2wgIkRCMTU1MCBib290IGZsYXNoIGRldmljZSIKLQlkZXBlbmRzIG9uIE1URF9EQjE1NTAKLQloZWxwCi0JICBVc2UgdGhlIGZpcnN0IG9mIHRoZSB0d28gNjRNaUIgZmxhc2ggYmFua3Mgb24gRGIxNTUwIGJvYXJkLgotCSAgWW91IGNhbiBzYXkgJ1knIHRvIGJvdGggdGhpcyBhbmQgJ01URF9EQjE1NTBfVVNFUicgYmVsb3csIHRvIHVzZQotCSAgYm90aCBiYW5rcy4KLQotY29uZmlnIE1URF9EQjE1NTBfVVNFUgotCWJvb2wgIkRCMTU1MCB1c2VyIGZsYXNoIGRldmljZSIKLQlkZXBlbmRzIG9uIE1URF9EQjE1NTAKLQlkZWZhdWx0IHkgaWYgTVREX0RCMTU1MF9CT09UID0gbgotCWhlbHAKLQkgIFVzZSB0aGUgc2Vjb25kIG9mIHRoZSB0d28gNjRNaUIgZmxhc2ggYmFua3Mgb24gRGIxNTUwIGJvYXJkLgotCSAgWW91IGNhbiBzYXkgJ1knIHRvIGJvdGggdGhpcyBhbmQgJ01URF9EQjE1NTBfQk9PVCcgYWJvdmUsIHRvIHVzZQotCSAgYm90aCBiYW5rcy4KKwkgIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQU1EIEFsY2hlbXkgUGIvRGIvUkRLIFJlZmVyZW5jZSBCb2FyZHMKIAogY29uZmlnIE1URF9ESUxORVRQQwogCXRyaXN0YXRlICJDRkkgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBESUwvTmV0IFBDIgpAQCAtNTg4LDYgKzUyMywxNSBAQAogCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgZmxhc2ggY2hpcHMgb24gdGhlIEludGVyZmFjZSBNUEMtMTIxMShDVFAvUENJL01QQy1TSDAyKS4KIAkgIElmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZCwgc2F5ICdZJy4KIAorY29uZmlnIE1URF9PTUFQX05PUgorCXRyaXN0YXRlICJUSSBPTUFQIGJvYXJkIG1hcHBpbmdzIgorCWRlcGVuZHMgb24gTVREX0NGSSAmJiBBUkNIX09NQVAKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBOT1IgZmxhc2ggY2hpcHMgb24gVEkgT01BUC1iYXNlZAorCSAgYm9hcmRzIGRlZmluaW5nIGZsYXNoIHBsYXRmb3JtIGRldmljZXMgYW5kIGZsYXNoIHBsYXRmb3JtIGRhdGEuCisJICBUaGVzZSBib2FyZHMgaW5jbHVkZSB0aGUgSW5ub3ZhdG9yLCBIMiwgSDMsIE9TSywgUGVyc2V1czIsIGFuZAorCSAgbW9yZS4gIElmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZCwgc2F5ICdZJy4KKwogIyBUaGlzIG5lZWRzIENGSSBvciBKRURFQywgZGVwZW5kaW5nIG9uIHRoZSBjYXJkcyBmb3VuZC4KIGNvbmZpZyBNVERfUENJCiAJdHJpc3RhdGUgIlBDSSBNVEQgZHJpdmVyIgpAQCAtNjQ3LDEzICs1OTEsMTQgQEAKICAgICAgICAgICBNYXAgZHJpdmVyIGZvciBEeS00IFNWTUUvRE1WLTE4MiBib2FyZC4KIAogY29uZmlnIE1URF9CQVNUCi0JdHJpc3RhdGUgIk1hcCBkcml2ZXIgZm9yIFNpbXRlYyBCQVNUIChFQjI0MTBJVFgpIgotCWRlcGVuZHMgb24gQVJDSF9CQVNUCisJdHJpc3RhdGUgIk1hcCBkcml2ZXIgZm9yIFNpbXRlYyBCQVNUIChFQjI0MTBJVFgpIG9yIFRob3Jjb20gVlIxMDAwIgorCWRlcGVuZHMgb24gQVJDSF9CQVNUIHx8IE1BQ0hfVlIxMDAwCiAJc2VsZWN0IE1URF9QQVJUSVRJT05TCiAJc2VsZWN0IE1URF9NQVBfQkFOS19XSURUSF8xNgogCXNlbGVjdCBNVERfSkVERUNQUk9CRQogCWhlbHAKLQkgIE1hcCBkcml2ZXIgZm9yIE5PUiBmbGFzaCBvbiB0aGUgU2ltdGVjIEJBU1QgKEVCMjQxMElUWCkuCisJICBNYXAgZHJpdmVyIGZvciBOT1IgZmxhc2ggb24gdGhlIFNpbXRlYyBCQVNUIChFQjI0MTBJVFgpLCBvciB0aGUKKwkgIFRob3Jjb20gVlIxMDAwCiAKIAkgIE5vdGUsIHRoaXMgZHJpdmVyICpjYW5ub3QqIG92ZXItcmlkZSB0aGUgV1AgbGluayBvbiB0aGUKIAkgIGJvYXJkLCBvciBjdXJyZW50bHkgZGV0ZWN0IHRoZSBzdGF0ZSBvZiB0aGUgbGluay4KQEAgLTY2OSw1ICs2MTQsMTUgQEAKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBmbGFzaCBjaGlwIG9uIHRoZSBTaGFycCBTTCBTZXJpZXMgb2YgUERBcy4KIAorY29uZmlnIE1URF9QTEFUUkFNCisJdHJpc3RhdGUgIk1hcCBkcml2ZXIgZm9yIHBsYXRmb3JtIGRldmljZSBSQU0gKG10ZC1yYW0pIgorCWRlcGVuZHMgb24gTVRECisJc2VsZWN0IE1URF9SQU0KKwloZWxwCisJICBNYXAgZHJpdmVyIGZvciBSQU0gYXJlYXMgZGVzY3JpYmVkIHZpYSB0aGUgcGxhdGZvcm0gZGV2aWNlCisJICBzeXN0ZW0uCisKKwkgIFRoaXMgc2VsZWN0aW9uIGF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgbWFwX3JhbSBkcml2ZXIuCisKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKaW5kZXggN2ZmZTAyYi4uN2JjYmM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIwogIyBsaW51eC9kcml2ZXJzL21hcHMvTWFrZWZpbGUKICMKLSMgJElkOiBNYWtlZmlsZS5jb21tb24sdiAxLjIzIDIwMDUvMDEvMDUgMTc6MDY6MzYgZHdtdzIgRXhwICQKKyMgJElkOiBNYWtlZmlsZS5jb21tb24sdiAxLjMwIDIwMDUvMDcvMDIgMDE6NTM6MjQgdHBveW5vciBFeHAgJAogCiBpZmVxICgkKENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUykseSkKIG9iai0kKENPTkZJR19NVEQpCQkrPSBtYXBfZnVuY3MubwpAQCAtMTUsNyArMTUsNiBAQAogb2JqLSQoQ09ORklHX01URF9DU1RNX01JUFNfSVhYKQkrPSBjc3RtX21pcHNfaXh4Lm8KIG9iai0kKENPTkZJR19NVERfREMyMTI4NSkJKz0gZGMyMTI4NS5vCiBvYmotJChDT05GSUdfTVREX0RJTE5FVFBDKQkrPSBkaWxuZXRwYy5vCi1vYmotJChDT05GSUdfTVREX0VMQU5fMTA0TkMpCSs9IGVsYW4tMTA0bmMubwogb2JqLSQoQ09ORklHX01URF9FUFhBMTBEQikJKz0gZXB4YTEwZGItZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9JUTgwMzEwKQkrPSBpcTgwMzEwLm8KIG9iai0kKENPTkZJR19NVERfTDQ0MEdYKQkrPSBsNDQwZ3gubwpAQCAtMjMsNiArMjIsNyBAQAogb2JqLSQoQ09ORklHX01URF9JQ0hYUk9NKQkrPSBpY2h4cm9tLm8KIG9iai0kKENPTkZJR19NVERfVFNVTkFNSSkJKz0gdHN1bmFtaV9mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX0xVQkJPQ0spCSs9IGx1YmJvY2stZmxhc2gubworb2JqLSQoQ09ORklHX01URF9NQUlOU1RPTkUpCSs9IG1haW5zdG9uZS1mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX01CWDg2MCkJKz0gbWJ4ODYwLm8KIG9iai0kKENPTkZJR19NVERfQ0VJVkEpCQkrPSBjZWl2YS5vCiBvYmotJChDT05GSUdfTVREX09DVEFHT04pCSs9IG9jdGFnb24tNTA2Ni5vCkBAIC00NCwxMCArNDQsNyBAQAogb2JqLSQoQ09ORklHX01URF9PQ0VMT1QpCSs9IG9jZWxvdC5vCiBvYmotJChDT05GSUdfTVREX1NPTFVUSU9ORU5HSU5FKSs9IHNvbHV0aW9uZW5naW5lLm8KIG9iai0kKENPTkZJR19NVERfUENJKQkJKz0gcGNpLm8KLW9iai0kKENPTkZJR19NVERfUEIxWFhYKQkrPSBwYjF4eHgtZmxhc2gubwotb2JqLSQoQ09ORklHX01URF9EQjFYMDApICAgICAgICArPSBkYjF4MDAtZmxhc2gubwotb2JqLSQoQ09ORklHX01URF9QQjE1NTApICAgICAgICArPSBwYjE1NTAtZmxhc2gubwotb2JqLSQoQ09ORklHX01URF9EQjE1NTApICAgICAgICArPSBkYjE1NTAtZmxhc2gubworb2JqLSQoQ09ORklHX01URF9BTENIRU1ZKSAgICAgICArPSBhbGNoZW15LWZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfTEFTQVQpCQkrPSBsYXNhdC5vCiBvYmotJChDT05GSUdfTVREX0FVVENQVTEyKQkrPSBhdXRjcHUxMi1udnJhbS5vCiBvYmotJChDT05GSUdfTVREX0VEQjczMTIpCSs9IGVkYjczMTIubwpAQCAtNzEsMyArNjgsNSBAQAogb2JqLSQoQ09ORklHX01URF9XUlNCQzgyNjApCSs9IHdyX3NiYzgyeHhfZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9ETVYxODIpCSs9IGRtdjE4Mi5vCiBvYmotJChDT05GSUdfTVREX1NIQVJQX1NMKQkrPSBzaGFycHNsLWZsYXNoLm8KK29iai0kKENPTkZJR19NVERfUExBVFJBTSkJKz0gcGxhdC1yYW0ubworb2JqLSQoQ09ORklHX01URF9PTUFQX05PUikJKz0gb21hcF9ub3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2FsY2hlbXktZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZkMmEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFNRCBBbGNoZW15IGV2YWx1YXRpb24gYm9hcmRzCisgKiAKKyAqICRJZDogYWxjaGVteS1mbGFzaC5jLHYgMS4xIDIwMDUvMDIvMjcgMjE6NTA6MjEgcHBvcG92IEV4cCAkCisgKgorICogKEMpIDIwMDMsIDIwMDQgUGV0ZSBQb3BvdiA8cHBvcG92QGVtYmVkZGVkYWxsZXkuY29tPgorICogCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiAJREVCVUdfUlcKKyNkZWZpbmUJREJHKHguLi4pCXByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUJREJHKHguLi4pCQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19QQjEwMDAKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIlBiMTAwMCBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDAwODAwMDAwIC8qIDhNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCA0IC8qIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfUEIxNTAwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJQYjE1MDAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwNDAwMDAwMCAvKiA2NE1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19QQjExMDAKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIlBiMTEwMCBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDA0MDAwMDAwIC8qIDY0TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX1BCMTU1MAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiUGIxNTUwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDgwMDAwMDAgLyogMTI4TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX1BCMTIwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiUGIxMjAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDgwMDAwMDAgLyogMTI4TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggMiAvKiAxNi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTAwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiRGIxMDAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDIwMDAwMDAgLyogMzJNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCA0IC8qIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfREIxNTAwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJEYjE1MDAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwMjAwMDAwMCAvKiAzMk1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19EQjExMDAKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIkRiMTEwMCBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDAyMDAwMDAwIC8qIDMyTUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTU1MAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiRGIxNTUwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDgwMDAwMDAgLyogMTI4TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTIwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiRGIxMjAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDQwMDAwMDAgLyogNjRNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCAyIC8qIDE2LWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfSFlEUk9HRU4zCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJIeWRyb2dlbjMgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwMjAwMDAwMCAvKiAzMk1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2RlZmluZSBVU0VfTE9DQUxfQUNDRVNTT1JTIC8qIHdoeT8gKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIkJvc3BvcnVzIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDEwMDAwMDAgLyogMTZNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCAyIC8qIDE2LWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfTUlSQUdFCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJNaXJhZ2UgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwNDAwMDAwMCAvKiA2NE1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2RlZmluZSBVU0VfTE9DQUxfQUNDRVNTT1JTIC8qIHdoeT8gKi8KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1hcF9pbmZvIGFsY2hlbXlfbWFwID0geworCS5uYW1lID0JQk9BUkRfTUFQX05BTUUsCit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYWxjaGVteV9wYXJ0aXRpb25zW10gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubmFtZSA9ICJVc2VyIEZTIiwKKyAgICAgICAgICAgICAgICAuc2l6ZSA9IEJPQVJEX0ZMQVNIX1NJWkUgLSAweDAwNDAwMDAwLAorICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKKyAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgLm5hbWUgPSAiWUFNT04iLAorICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAorCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQorICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKKwkJLnNpemUgPSAoMHgzMDAwMDAgLSAweDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyB5YW1vbiBlbnYgKi8KKwkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKyAgICAgICAgfQorfTsKKworI2RlZmluZSBOQl9PRih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm15bXRkOworCitpbnQgX19pbml0IGFsY2hlbXlfbXRkX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CisJaW50IG5iX3BhcnRzID0gMDsKKwl1bnNpZ25lZCBsb25nIHdpbmRvd19hZGRyOworCXVuc2lnbmVkIGxvbmcgd2luZG93X3NpemU7CisJCisJLyogRGVmYXVsdCBmbGFzaCBidXN3aWR0aCAqLworCWFsY2hlbXlfbWFwLmJhbmt3aWR0aCA9IEJPQVJEX0ZMQVNIX1dJRFRIOworCisJd2luZG93X2FkZHIgPSAweDIwMDAwMDAwIC0gQk9BUkRfRkxBU0hfU0laRTsKKwl3aW5kb3dfc2l6ZSA9IEJPQVJEX0ZMQVNIX1NJWkU7CisjaWZkZWYgQ09ORklHX01JUFNfTUlSQUdFX1dIWQorCS8qIEJvb3QgUk9NIGZsYXNoIGJhbmsgb25seTsgbm8gdXNlciBiYW5rICovCisJd2luZG93X2FkZHIgPSAweDFDMDAwMDAwOworCXdpbmRvd19zaXplID0gMHgwNDAwMDAwMDsKKwkvKiBVU0VSRlMgZnJvbSAweDFDMDAgMDAwMCB0byAweDFGQzAwMDAwICovCisJYWxjaGVteV9wYXJ0aXRpb25zWzBdLnNpemUgPSAweDAzQzAwMDAwOworI2VuZGlmCisKKwkvKgorCSAqIFN0YXRpYyBwYXJ0aXRpb24gZGVmaW5pdGlvbiBzZWxlY3Rpb24KKwkgKi8KKwlwYXJ0cyA9IGFsY2hlbXlfcGFydGl0aW9uczsKKwluYl9wYXJ0cyA9IE5CX09GKGFsY2hlbXlfcGFydGl0aW9ucyk7CisJYWxjaGVteV9tYXAuc2l6ZSA9IHdpbmRvd19zaXplOworCisJLyoKKwkgKiBOb3cgbGV0J3MgcHJvYmUgZm9yIHRoZSBhY3R1YWwgZmxhc2guICBEbyBpdCBoZXJlIHNpbmNlCisJICogc3BlY2lmaWMgbWFjaGluZSBzZXR0aW5ncyBtaWdodCBoYXZlIGJlZW4gc2V0IGFib3ZlLgorCSAqLworCXByaW50ayhLRVJOX05PVElDRSBCT0FSRF9NQVBfTkFNRSAiOiBwcm9iaW5nICVkLWJpdCBmbGFzaCBidXNcbiIsIAorCQkJYWxjaGVteV9tYXAuYmFua3dpZHRoKjgpOworCWFsY2hlbXlfbWFwLnZpcnQgPSBpb3JlbWFwKHdpbmRvd19hZGRyLCB3aW5kb3dfc2l6ZSk7CisJbXltdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZhbGNoZW15X21hcCk7CisJaWYgKCFteW10ZCkgeworCQlpb3VubWFwKGFsY2hlbXlfbWFwLnZpcnQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgcGFydHMsIG5iX3BhcnRzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsY2hlbXlfbXRkX2NsZWFudXAodm9pZCkKK3sKKwlpZiAobXltdGQpIHsKKwkJZGVsX210ZF9wYXJ0aXRpb25zKG15bXRkKTsKKwkJbWFwX2Rlc3Ryb3kobXltdGQpOworCQlpb3VubWFwKGFsY2hlbXlfbWFwLnZpcnQpOworCX0KK30KKworbW9kdWxlX2luaXQoYWxjaGVteV9tdGRfaW5pdCk7Cittb2R1bGVfZXhpdChhbGNoZW15X210ZF9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiRW1iZWRkZWQgQWxsZXkgU29sdXRpb25zLCBJbmMiKTsKK01PRFVMRV9ERVNDUklQVElPTihCT0FSRF9NQVBfTkFNRSAiIE1URCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvYW1kNzZ4cm9tLmMgYi9kcml2ZXJzL210ZC9tYXBzL2FtZDc2eHJvbS5jCmluZGV4IDUxZTk3YjAuLmU4YTkwMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvYW1kNzZ4cm9tLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9hbWQ3Nnhyb20uYwpAQCAtMiw3ICsyLDcgQEAKICAqIGFtZDc2eHJvbS5jCiAgKgogICogTm9ybWFsIG1hcHBpbmdzIG9mIGNoaXBzIGluIHBoeXNpY2FsIG1lbW9yeQotICogJElkOiBhbWQ3Nnhyb20uYyx2IDEuMTkgMjAwNC8xMS8yOCAwOTo0MDozOSBkd213MiBFeHAgJAorICogJElkOiBhbWQ3Nnhyb20uYyx2IDEuMjAgMjAwNS8wMy8xOCAxNDowNDozNSBnbGVpeG5lciBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMxNCw3ICszMTQsNyBAQAogCX0KIAlyZXR1cm4gLUVOWElPOwogI2lmIDAKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhbWQ3Nnhyb21fZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYW1kNzZ4cm9tX2RyaXZlcik7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9iYXN0LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2Jhc3QtZmxhc2guYwppbmRleCA0NGRlM2E4Li4wYzQ1NDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2Jhc3QtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2Jhc3QtZmxhc2guYwpAQCAtMSwxNCArMSwxNSBAQAogLyogbGludXgvZHJpdmVycy9tdGQvbWFwcy9iYXN0X2ZsYXNoLmMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KICAqCiAgKiBTaW10ZWMgQmFzdCAoRUIyNDEwSVRYKSBOT1IgTVREIE1hcHBpbmcgZHJpdmVyCiAgKgogICogQ2hhbmdlbG9nOgogICoJMjAtU2VwLTIwMDQgIEJKRCAgSW5pdGlhbCB2ZXJzaW9uCisgKgkxNy1KYW4tMjAwNSAgQkpEICBBZGQgd2hvbGUgZGV2aWNlIGlmIG5vIHBhcnRpdGlvbnMgZm91bmQKICAqCi0gKiAkSWQ6IGJhc3QtZmxhc2guYyx2IDEuMSAyMDA0LzA5LzIxIDE0OjI5OjA0IGJqZCBFeHAgJAorICogJElkOiBiYXN0LWZsYXNoLmMsdiAxLjIgMjAwNS8wMS8xOCAxMToxMzo0NyBiamQgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ2LDkgKzQ3LDkgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9iYXN0LWNwbGQuaD4KIAogI2lmZGVmIENPTkZJR19NVERfQkFTVF9NQVhTSVpFCi0jZGVmaW5lIEFSRUFfTUFYU0laRSAoQ09ORklHX01URF9CQVNUX01BWFNJWkUgKiAoMTAyNCoxMDI0KSkKKyNkZWZpbmUgQVJFQV9NQVhTSVpFIChDT05GSUdfTVREX0JBU1RfTUFYU0laRSAqIFNaXzFNKQogI2Vsc2UKLSNkZWZpbmUgQVJFQV9NQVhTSVpFICgzMioxMDI0KjEwMjQpCisjZGVmaW5lIEFSRUFfTUFYU0laRSAoMzIgKiBTWl8xTSkKICNlbmRpZgogCiAjZGVmaW5lIFBGWCAiYmFzdC1mbGFzaDogIgpAQCAtMTg5LDYgKzE5MCw4IEBACiAJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIGluZm8tPnBhcnRpdGlvbnMsIGVycik7CiAJCWlmIChlcnIpIAogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IGFkZC9wYXJzZSBwYXJ0aXRpb25zXG4iKTsKKwl9IGVsc2UgeworCQllcnIgPSBhZGRfbXRkX2RldmljZShpbmZvLT5tdGQpOwogCX0KIAogCWlmIChlcnIgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvZGIxNTUwLWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2RiMTU1MC1mbGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEzODg4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZGIxNTUwLWZsYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQWxjaGVteSBEYjE1NTAgYm9hcmQKLSAqIAotICogJElkOiBkYjE1NTAtZmxhc2guYyx2IDEuNyAyMDA0LzExLzA0IDEzOjI0OjE0IGdsZWl4bmVyIEV4cCAkCi0gKgotICogKEMpIDIwMDQgRW1iZWRkZWQgRWRnZSwgTExDLCBiYXNlZCBvbiBkYjE1NTAtZmxhc2guYzoKLSAqIChDKSAyMDAzLCAyMDA0IFBldGUgUG9wb3YgPHBwb3BvdkBlbWJlZGRlZGFsbGV5LmNvbT4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaWZkZWYgCURFQlVHX1JXCi0jZGVmaW5lCURCRyh4Li4uKQlwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lCURCRyh4Li4uKQkKLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB3aW5kb3dfYWRkcjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpbmRvd19zaXplOwotCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gZGIxNTUwX21hcCA9IHsKLQkubmFtZSA9CSJEYjE1NTAgZmxhc2giLAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZmxhc2hfYmFua3dpZHRoID0gNDsKLQotLyogCi0gKiBTdXBwb3J0IG9ubHkgNjRNQiBOT1IgRmxhc2ggcGFydHMKLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX0RCMTU1MF9CT09UKSAmJiBkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX1VTRVIpCi0jZGVmaW5lIERCMTU1MF9CT1RIX0JBTktTCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX0JPT1QpICYmICFkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX1VTRVIpCi0jZGVmaW5lIERCMTU1MF9CT09UX09OTFkKLSNlbGlmICFkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9EQjE1NTBfVVNFUikKLSNkZWZpbmUgREIxNTUwX1VTRVJfT05MWQotI2VuZGlmCi0KLSNpZmRlZiBEQjE1NTBfQk9USF9CQU5LUwotLyogYm90aCBiYW5rcyB3aWxsIGJlIHVzZWQuIENvbWJpbmUgdGhlIGZpcnN0IGJhbmsgYW5kIHRoZSBmaXJzdCAKLSAqIHBhcnQgb2YgdGhlIHNlY29uZCBiYW5rIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgamZmcy9qZmZzMgotICogcGFydGl0aW9uLgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZGIxNTUwX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBhc3N1bWUgYm9vdFsyOjBdOnN3YXAgaXMgJzAwMDAnIG9yICcxMDAwJywgd2hpY2ggdHJhbnNsYXRlcyB0bzoKLQkgKiAxQzAwIDAwMDAgMUZGRiBGRkZGIENFMCA2NE1CIEJvb3QgTk9SIEZsYXNoCi0JICogMTgwMCAwMDAwIDFCRkYgRkZGRiBDRTAgNjRNQiBQYXJhbSBOT1IgRmxhc2gKLQkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplID0gICAoMHgxRkMwMDAwMCAtIDB4MTgwMDAwMDApLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSAoMHgzMDAwMDAgLSAweDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyB5YW1vbiBlbnYgKi8KLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoREIxNTUwX0JPT1RfT05MWSkKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYjE1NTBfcGFydGl0aW9uc1tdID0gewotCS8qIGFzc3VtZSBib290WzI6MF06c3dhcCBpcyAnMDAwMCcgb3IgJzEwMDAnLCB3aGljaCB0cmFuc2xhdGVzIHRvOgotCSAqIDFDMDAgMDAwMCAxRkZGIEZGRkYgQ0UwIDY0TUIgQm9vdCBOT1IgRmxhc2gKLQkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplID0gICAweDAzYzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSAoMHgzMDAwMDAtMHg0MDAwMCksIC8qIGxhc3QgMjU2S0IgaXMgeWFtb24gZW52ICovCi0JCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgIH0KLX07Ci0jZWxpZiBkZWZpbmVkKERCMTU1MF9VU0VSX09OTFkpCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZGIxNTUwX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBhc3N1bWUgYm9vdFsyOjBdOnN3YXAgaXMgJzAwMDAnIG9yICcxMDAwJywgd2hpY2ggdHJhbnNsYXRlcyB0bzoKLQkgKiAxODAwIDAwMDAgMUJGRiBGRkZGIENFMCA2NE1CIFBhcmFtIE5PUiBGbGFzaAotCSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAoMHg0MDAwMDAwIC0gMHgyMDAwMDApLCAvKiByZXNlcnZlIDJNQiBmb3IgcmF3IGtlcm5lbCAqLwotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAicmF3IGtlcm5lbCIsCi0JCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbHNlCi0jZXJyb3IgTVREX0RCMTU1MCBkZWZpbmUgY29tYm8gZXJyb3IgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTkJfT0YoeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQotCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKLQotLyoKLSAqIFByb2JlIHRoZSBmbGFzaCBkZW5zaXR5IGFuZCBzZXR1cCB3aW5kb3cgYWRkcmVzcyBhbmQgc2l6ZQotICogYmFzZWQgb24gdXNlciBDT05GSUcgb3B0aW9ucy4gVGhlcmUgYXJlIHRpbWVzIHdoZW4gd2UgZG9uJ3QKLSAqIHdhbnQgdGhlIE1URCBkcml2ZXIgdG8gYmUgcHJvYmluZyB0aGUgYm9vdCBvciB1c2VyIGZsYXNoLAotICogc28gaGF2aW5nIHRoZSBvcHRpb24gdG8gZW5hYmxlIG9ubHkgb25lIGJhbmsgaXMgaW1wb3J0YW50LgotICovCi1pbnQgc2V0dXBfZmxhc2hfcGFyYW1zKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChEQjE1NTBfQk9USF9CQU5LUykKLQkJCXdpbmRvd19hZGRyID0gMHgxODAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg4MDAwMDAwOyAKLSNlbGlmIGRlZmluZWQoREIxNTUwX0JPT1RfT05MWSkKLQkJCXdpbmRvd19hZGRyID0gMHgxQzAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg0MDAwMDAwOyAKLSNlbHNlIC8qIFVTRVIgT05MWSAqLwotCQkJd2luZG93X2FkZHIgPSAweDE4MDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7IAotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX2luaXQgZGIxNTUwX210ZF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWludCBuYl9wYXJ0cyA9IDA7Ci0JCi0JLyogRGVmYXVsdCBmbGFzaCBiYW5rd2lkdGggKi8KLQlkYjE1NTBfbWFwLmJhbmt3aWR0aCA9IGZsYXNoX2Jhbmt3aWR0aDsKLQotCWlmIChzZXR1cF9mbGFzaF9wYXJhbXMoKSkgCi0JCXJldHVybiAtRU5YSU87Ci0KLQkvKgotCSAqIFN0YXRpYyBwYXJ0aXRpb24gZGVmaW5pdGlvbiBzZWxlY3Rpb24KLQkgKi8KLQlwYXJ0cyA9IGRiMTU1MF9wYXJ0aXRpb25zOwotCW5iX3BhcnRzID0gTkJfT0YoZGIxNTUwX3BhcnRpdGlvbnMpOwotCWRiMTU1MF9tYXAuc2l6ZSA9IHdpbmRvd19zaXplOwotCi0JLyoKLQkgKiBOb3cgbGV0J3MgcHJvYmUgZm9yIHRoZSBhY3R1YWwgZmxhc2guICBEbyBpdCBoZXJlIHNpbmNlCi0JICogc3BlY2lmaWMgbWFjaGluZSBzZXR0aW5ncyBtaWdodCBoYXZlIGJlZW4gc2V0IGFib3ZlLgotCSAqLwotCXByaW50ayhLRVJOX05PVElDRSAiRGIxNTUwIGZsYXNoOiBwcm9iaW5nICVkLWJpdCBmbGFzaCBidXNcbiIsIAotCQkJZGIxNTUwX21hcC5iYW5rd2lkdGgqOCk7Ci0JZGIxNTUwX21hcC52aXJ0ID0gaW9yZW1hcCh3aW5kb3dfYWRkciwgd2luZG93X3NpemUpOwotCW15bXRkID0gZG9fbWFwX3Byb2JlKCJjZmlfcHJvYmUiLCAmZGIxNTUwX21hcCk7Ci0JaWYgKCFteW10ZCkgcmV0dXJuIC1FTlhJTzsKLQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgcGFydHMsIG5iX3BhcnRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGRiMTU1MF9tdGRfY2xlYW51cCh2b2lkKQotewotCWlmIChteW10ZCkgewotCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGQpOwotCQltYXBfZGVzdHJveShteW10ZCk7Ci0JCWlvdW5tYXAoKHZvaWQgKikgZGIxNTUwX21hcC52aXJ0KTsKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KGRiMTU1MF9tdGRfaW5pdCk7Ci1tb2R1bGVfZXhpdChkYjE1NTBfbXRkX2NsZWFudXApOwotCi1NT0RVTEVfQVVUSE9SKCJFbWJlZGRlZCBFZGdlLCBMTEMiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRGIxNTUwIG10ZCBtYXAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2RiMXgwMC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9kYjF4MDAtZmxhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhNjhlYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2RiMXgwMC1mbGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFsY2hlbXkgRGIxeHh4IGJvYXJkcwotICogCi0gKiAkSWQ6IGRiMXgwMC1mbGFzaC5jLHYgMS42IDIwMDQvMTEvMDQgMTM6MjQ6MTQgZ2xlaXhuZXIgRXhwICQKLSAqCi0gKiAoQykgMjAwMyBQZXRlIFBvcG92IDxwcG9wb3ZAZW1iZWRkZWRhbGxleS5jb20+Ci0gKiAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2lmZGVmIAlERUJVR19SVwotI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZQlEQkcoeC4uLikJCi0jZW5kaWYKLQotLyogTVREIENPTkZJRyBPUFRJT05TICovCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX0RCMVgwMF9CT09UKSAmJiBkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX1VTRVIpCi0jZGVmaW5lIERCMVgwMF9CT1RIX0JBTktTCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX0JPT1QpICYmICFkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX1VTRVIpCi0jZGVmaW5lIERCMVgwMF9CT09UX09OTFkKLSNlbGlmICFkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9EQjFYMDBfVVNFUikKLSNkZWZpbmUgREIxWDAwX1VTRVJfT05MWQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpbmRvd19hZGRyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgd2luZG93X3NpemU7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBmbGFzaF9zaXplOwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgKmJjc3IgPSAodW5zaWduZWQgc2hvcnQgKikweEFFMDAwMDAwOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgZmxhc2hfYmFua3dpZHRoID0gNDsKLQotLyogCi0gKiBUaGUgRGIxeCBib2FyZHMgc3VwcG9ydCBkaWZmZXJlbnQgZmxhc2ggZGVuc2l0aWVzLiBXZSBzZXR1cAotICogdGhlIG10ZF9wYXJ0aXRpb24gc3RydWN0dXJlcyBiZWxvdyBmb3IgZGVmYXVsdCBvZiA2NE1iaXQgCi0gKiBmbGFzaCBkZW5zaXRpZXMsIGFuZCBvdmVycmlkZSB0aGUgcGFydGl0aW9ucyBzaXplcywgaWYKLSAqIG5lY2Vzc2FyeSwgYWZ0ZXIgd2UgY2hlY2sgdGhlIGJvYXJkIHN0YXR1cyByZWdpc3Rlci4KLSAqLwotCi0jaWZkZWYgREIxWDAwX0JPVEhfQkFOS1MKLS8qIGJvdGggYmFua3Mgd2lsbCBiZSB1c2VkLiBDb21iaW5lIHRoZSBmaXJzdCBiYW5rIGFuZCB0aGUgZmlyc3QgCi0gKiBwYXJ0IG9mIHRoZSBzZWNvbmQgYmFuayB0b2dldGhlciBpbnRvIGEgc2luZ2xlIGpmZnMvamZmczIKLSAqIHBhcnRpdGlvbi4KLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGRiMXgwMF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJVc2VyIEZTIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gIDB4MWMwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gIDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJ5YW1vbiIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAweDAxMDAwMDAsCi0JCS5vZmZzZXQgICAgICAgPSAgTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJyYXcga2VybmVsIiwKLQkJLnNpemUgICAgICAgICA9ICAoMHgzMDAwMDAtMHg0MDAwMCksIC8qIGxhc3QgMjU2S0IgaXMgZW52ICovCi0JCS5vZmZzZXQgICAgICAgPSAgTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICB9Ci19OwotI2VsaWYgZGVmaW5lZChEQjFYMDBfQk9PVF9PTkxZKQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGRiMXgwMF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJVc2VyIEZTIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gIDB4MDBjMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgMHgwMTAwMDAwLAotCQkub2Zmc2V0ICAgICAgID0gIE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgICAgICAgICAubWFza19mbGFncyAgID0gIE1URF9XUklURUFCTEUKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAicmF3IGtlcm5lbCIsCi0JCS5zaXplICAgICAgICAgPSAgKDB4MzAwMDAwLTB4NDAwMDApLCAvKiBsYXN0IDI1NktCIGlzIGVudiAqLwotCQkub2Zmc2V0ICAgICAgID0gIE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoREIxWDAwX1VTRVJfT05MWSkKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYjF4MDBfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAweDBlMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAicmF3IGtlcm5lbCIsCi0JCS5zaXplICAgICAgICAgPSAgTVREUEFSVF9TSVpfRlVMTCwKLQkJLm9mZnNldCAgICAgICA9ICBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgIH0KLX07Ci0jZWxzZQotI2Vycm9yIE1URF9EQjFYMDAgZGVmaW5lIGNvbWJvIGVycm9yIC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLSNlbmRpZgotI2RlZmluZSBOQl9PRih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCi0KLSNkZWZpbmUgTkFNRSAgICAgCSJEYjF4MDAgTGludXggRmxhc2giCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gZGIxeHh4X210ZF9tYXAgPSB7Ci0JLm5hbWUJCT0gTkFNRSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFyc2VkX3BhcnRzOwotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqZGIxeHh4X210ZDsKLQotLyoKLSAqIFByb2JlIHRoZSBmbGFzaCBkZW5zaXR5IGFuZCBzZXR1cCB3aW5kb3cgYWRkcmVzcyBhbmQgc2l6ZQotICogYmFzZWQgb24gdXNlciBDT05GSUcgb3B0aW9ucy4gVGhlcmUgYXJlIHRpbWVzIHdoZW4gd2UgZG9uJ3QKLSAqIHdhbnQgdGhlIE1URCBkcml2ZXIgdG8gYmUgcHJvYmluZyB0aGUgYm9vdCBvciB1c2VyIGZsYXNoLAotICogc28gaGF2aW5nIHRoZSBvcHRpb24gdG8gZW5hYmxlIG9ubHkgb25lIGJhbmsgaXMgaW1wb3J0YW50LgotICovCi1pbnQgc2V0dXBfZmxhc2hfcGFyYW1zKHZvaWQpCi17Ci0Jc3dpdGNoICgoYmNzclsyXSA+PiAxNCkgJiAweDMpIHsKLQkJY2FzZSAwOiAvKiA2NE1iaXQgZGV2aWNlcyAqLwotCQkJZmxhc2hfc2l6ZSA9IDB4ODAwMDAwOyAvKiA4TUIgcGVyIHBhcnQgKi8KLSNpZiBkZWZpbmVkKERCMVgwMF9CT1RIX0JBTktTKQotCQkJd2luZG93X2FkZHIgPSAweDFFMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDIwMDAwMDA7IAotI2VsaWYgZGVmaW5lZChEQjFYMDBfQk9PVF9PTkxZKQotCQkJd2luZG93X2FkZHIgPSAweDFGMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDEwMDAwMDA7IAotI2Vsc2UgLyogVVNFUiBPTkxZICovCi0JCQl3aW5kb3dfYWRkciA9IDB4MUUwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4MTAwMDAwMDsgCi0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQkvKiAxMjggTWJpdCBkZXZpY2VzICovCi0JCQlmbGFzaF9zaXplID0gMHgxMDAwMDAwOyAvKiAxNk1CIHBlciBwYXJ0ICovCi0jaWYgZGVmaW5lZChEQjFYMDBfQk9USF9CQU5LUykKLQkJCXdpbmRvd19hZGRyID0gMHgxQzAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg0MDAwMDAwOwotCQkJLyogVVNFUkZTIGZyb20gMHgxQzAwIDAwMDAgdG8gMHgxRkMwIDAwMDAgKi8KLQkJCWRiMXgwMF9wYXJ0aXRpb25zWzBdLnNpemUgPSAweDNDMDAwMDA7Ci0jZWxpZiBkZWZpbmVkKERCMVgwMF9CT09UX09OTFkpCi0JCQl3aW5kb3dfYWRkciA9IDB4MUUwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4MjAwMDAwMDsKLQkJCS8qIFVTRVJGUyBmcm9tIDB4MUUwMCAwMDAwIHRvIDB4MUZDMCAwMDAwICovCi0JCQlkYjF4MDBfcGFydGl0aW9uc1swXS5zaXplID0gMHgxQzAwMDAwOwotI2Vsc2UgLyogVVNFUiBPTkxZICovCi0JCQl3aW5kb3dfYWRkciA9IDB4MUMwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4MjAwMDAwMDsKLQkJCS8qIFVTRVJGUyBmcm9tIDB4MUMwMCAwMDAwIHRvIDB4MURFMDAwMDAgKi8KLQkJCWRiMXgwMF9wYXJ0aXRpb25zWzBdLnNpemUgPSAweDFERTAwMDA7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQkvKiAyNTYgTWJpdCBkZXZpY2VzICovCi0JCQlmbGFzaF9zaXplID0gMHg0MDAwMDAwOyAvKiA2NE1CIHBlciBwYXJ0ICovCi0jaWYgZGVmaW5lZChEQjFYMDBfQk9USF9CQU5LUykKLQkJCXJldHVybiAxOwotI2VsaWYgZGVmaW5lZChEQjFYMDBfQk9PVF9PTkxZKQotCQkJLyogQm9vdCBST00gZmxhc2ggYmFuayBvbmx5OyBubyB1c2VyIGJhbmsgKi8KLQkJCXdpbmRvd19hZGRyID0gMHgxQzAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg0MDAwMDAwOwotCQkJLyogVVNFUkZTIGZyb20gMHgxQzAwIDAwMDAgdG8gMHgxRkMwMDAwMCAqLwotCQkJZGIxeDAwX3BhcnRpdGlvbnNbMF0uc2l6ZSA9IDB4M0MwMDAwMDsKLSNlbHNlIC8qIFVTRVIgT05MWSAqLwotCQkJcmV0dXJuIDE7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDE7Ci0JfQotCWRiMXh4eF9tdGRfbWFwLnNpemUgPSB3aW5kb3dfc2l6ZTsKLQlkYjF4eHhfbXRkX21hcC5iYW5rd2lkdGggPSBmbGFzaF9iYW5rd2lkdGg7Ci0JZGIxeHh4X210ZF9tYXAucGh5cyA9IHdpbmRvd19hZGRyOwotCWRiMXh4eF9tdGRfbWFwLmJhbmt3aWR0aCA9IGZsYXNoX2Jhbmt3aWR0aDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW5pdCBkYjF4MDBfbXRkX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0JaW50IG5iX3BhcnRzID0gMDsKLQkKLQlpZiAoc2V0dXBfZmxhc2hfcGFyYW1zKCkpIAotCQlyZXR1cm4gLUVOWElPOwotCi0JLyoKLQkgKiBTdGF0aWMgcGFydGl0aW9uIGRlZmluaXRpb24gc2VsZWN0aW9uCi0JICovCi0JcGFydHMgPSBkYjF4MDBfcGFydGl0aW9uczsKLQluYl9wYXJ0cyA9IE5CX09GKGRiMXgwMF9wYXJ0aXRpb25zKTsKLQotCS8qCi0JICogTm93IGxldCdzIHByb2JlIGZvciB0aGUgYWN0dWFsIGZsYXNoLiAgRG8gaXQgaGVyZSBzaW5jZQotCSAqIHNwZWNpZmljIG1hY2hpbmUgc2V0dGluZ3MgbWlnaHQgaGF2ZSBiZWVuIHNldCBhYm92ZS4KLQkgKi8KLQlwcmludGsoS0VSTl9OT1RJQ0UgIkRiMXh4eCBmbGFzaDogcHJvYmluZyAlZC1iaXQgZmxhc2ggYnVzXG4iLCAKLQkJCWRiMXh4eF9tdGRfbWFwLmJhbmt3aWR0aCo4KTsKLQlkYjF4eHhfbXRkX21hcC52aXJ0ID0gaW9yZW1hcCh3aW5kb3dfYWRkciwgd2luZG93X3NpemUpOwotCWRiMXh4eF9tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZkYjF4eHhfbXRkX21hcCk7Ci0JaWYgKCFkYjF4eHhfbXRkKSByZXR1cm4gLUVOWElPOwotCWRiMXh4eF9tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlhZGRfbXRkX3BhcnRpdGlvbnMoZGIxeHh4X210ZCwgcGFydHMsIG5iX3BhcnRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGRiMXgwMF9tdGRfY2xlYW51cCh2b2lkKQotewotCWlmIChkYjF4eHhfbXRkKSB7Ci0JCWRlbF9tdGRfcGFydGl0aW9ucyhkYjF4eHhfbXRkKTsKLQkJbWFwX2Rlc3Ryb3koZGIxeHh4X210ZCk7Ci0JCWlmIChwYXJzZWRfcGFydHMpCi0JCQlrZnJlZShwYXJzZWRfcGFydHMpOwotCX0KLX0KLQotbW9kdWxlX2luaXQoZGIxeDAwX210ZF9pbml0KTsKLW1vZHVsZV9leGl0KGRiMXgwMF9tdGRfY2xlYW51cCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlBldGUgUG9wb3YiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRGIxeDAwIG10ZCBtYXAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2VsYW4tMTA0bmMuYyBiL2RyaXZlcnMvbXRkL21hcHMvZWxhbi0xMDRuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQ2NWY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZWxhbi0xMDRuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qIGVsYW4tMTA0bmMuYyAtLSBNVEQgbWFwIGRyaXZlciBmb3IgQXJjb20gQ29udHJvbCBTeXN0ZW1zIEVMQU4tMTA0TkMKLSAKLSAgIENvcHlyaWdodCAoQykgMjAwMCBBcmNvbSBDb250cm9sIFN5c3RlbSBMdGQKLSAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCi0KLSAgICRJZDogZWxhbi0xMDRuYy5jLHYgMS4yNSAyMDA0LzExLzI4IDA5OjQwOjM5IGR3bXcyIEV4cCAkCi0KLVRoZSBFTEFOLTEwNE5DIGhhcyB1cCB0byA4IE1pYnl0ZSBvZiBJbnRlbCBTdHJhdGFGbGFzaCAoMjhGMzIwLzI4RjY0MCkgaW4geDE2Ci1tb2RlLiAgVGhpcyBkcml2ZXJzIHVzZXMgdGhlIENGSSBwcm9iZSBhbmQgSW50ZWwgRXh0ZW5kZWQgQ29tbWFuZCBTZXQgZHJpdmVycy4KLQotVGhlIGZsYXNoIGlzIGFjY2Vzc2VkIGFzIGZvbGxvd3M6Ci0KLSAgIDMyIGtieXRlIG1lbW9yeSB3aW5kb3cgYXQgMHhiMDAwMC0weGI3ZmZmCi0gICAKLSAgIDE2IGJpdCBJL08gcG9ydCAoMHgyMikgZm9yIHNvbWUgc29ydCBvZiBwYWdpbmcuCi0KLVRoZSBzaW5nbGUgZmxhc2ggZGV2aWNlIGlzIGRpdmlkZWQgaW50byAzIHBhcnRpdGlvbiB3aGljaCBhcHBlYXIgYXMgc2VwYXJhdGUKLU1URCBkZXZpY2VzLgotCi1MaW51eCB0aGlua3MgdGhhdCB0aGUgSS9PIHBvcnQgaXMgdXNlZCBieSB0aGUgUElDIGFuZCBoZW5jZSBjaGVja19yZWdpb24oKSB3aWxsCi1hbHdheXMgZmFpbC4gIFNvIHdlIGRvbid0IGRvIGl0LiAgSSBqdXN0IGhvcGUgaXQgZG9lc24ndCBicmVhayBhbnl0aGluZy4KLSovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2RlZmluZSBXSU5ET1dfU1RBUlQgMHhiMDAwMAotLyogTnVtYmVyIG9mIGJpdHMgaW4gb2Zmc2V0LiAqLwotI2RlZmluZSBXSU5ET1dfU0hJRlQgMTUKLSNkZWZpbmUgV0lORE9XX0xFTkdUSCAoMSA8PCBXSU5ET1dfU0hJRlQpCi0vKiBUaGUgYml0cyBmb3IgdGhlIG9mZnNldCBpbnRvIHRoZSB3aW5kb3cuICovCi0jZGVmaW5lIFdJTkRPV19NQVNLIChXSU5ET1dfTEVOR1RILTEpCi0jZGVmaW5lIFBBR0VfSU8gMHgyMgotI2RlZmluZSBQQUdFX0lPX1NJWkUgMgotCi1zdGF0aWMgdm9sYXRpbGUgaW50IHBhZ2VfaW5fd2luZG93ID0gLTE7IC8vIEN1cnJlbnQgcGFnZSBpbiB3aW5kb3cuCi1zdGF0aWMgdm9pZCBfX2lvbWVtICppb21hcGFkcjsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZWxhbl8xMDRuY19zcGluKTsKLQotLyogcGFydGl0aW9uX2luZm8gZ2l2ZXMgZGV0YWlscyBvbiB0aGUgbG9naWNhbCBwYXJ0aXRpb25zIHRoYXQgdGhlIHNwbGl0IHRoZSAKLSAqIHNpbmdsZSBmbGFzaCBkZXZpY2UgaW50by4gSWYgdGhlIHNpemUgaWYgemVybyB3ZSB1c2UgdXAgdG8gdGhlIGVuZCBvZiB0aGUKLSAqIGRldmljZS4gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mb1tdPXsKLSAgICB7IC5uYW1lID0gIkVMQU4tMTA0TkMgZmxhc2ggYm9vdCBwYXJ0aXRpb24iLCAKLSAgICAgIC5vZmZzZXQgPSAwLCAKLSAgICAgIC5zaXplID0gNjQwKjEwMjQgfSwKLSAgICB7IC5uYW1lID0gIkVMQU4tMTA0TkMgZmxhc2ggcGFydGl0aW9uIDEiLCAKLSAgICAgIC5vZmZzZXQgPSA2NDAqMTAyNCwgCi0gICAgICAuc2l6ZSA9IDg5NioxMDI0IH0sCi0gICAgeyAubmFtZSA9ICJFTEFOLTEwNE5DIGZsYXNoIHBhcnRpdGlvbiAyIiwgCi0gICAgICAub2Zmc2V0ID0gKDY0MCs4OTYpKjEwMjQgfQotfTsKLSNkZWZpbmUgTlVNX1BBUlRJVElPTlMgKHNpemVvZihwYXJ0aXRpb25faW5mbykvc2l6ZW9mKHBhcnRpdGlvbl9pbmZvWzBdKSkKLQotLyoKLSAqIElmIG5vIGlkZWEgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgVGhpcyBpcyB0YWtlbiBmcm9tIHRoZSBGbGFzaEZYIHN0dWZmLgotICovCi0jZGVmaW5lIFJPTUNTIDEKLQotc3RhdGljIGlubGluZSB2b2lkIGVsYW5fMTA0bmNfc2V0dXAodm9pZCkKLXsKLSAgICB1MTYgdDsKLQotICAgIG91dHcoIDB4MDAyMyArIFJPTUNTKjIsIFBBR0VfSU8gKTsKLSAgICB0PWluYiggUEFHRV9JTysxICk7Ci0KLSAgICB0PSh0ICYgMHhmOSkgfCAweDA0OwotCi0gICAgb3V0dyggKCgweDAwMjMgKyBST01DUyoyKSB8ICh0IDw8IDgpKSwgUEFHRV9JTyApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWxhbl8xMDRuY19wYWdlKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIG9mcykKLXsKLQl1bnNpZ25lZCBsb25nIHBhZ2UgPSBvZnMgPj4gV0lORE9XX1NISUZUOwotICAgICAgIAotCWlmKCBwYWdlIT1wYWdlX2luX3dpbmRvdyApIHsKLQkJaW50IGNtZDE7Ci0JCWludCBjbWQyOwotCi0JCWNtZDE9KHBhZ2UgJiAweDcwMCkgKyAweDA4MzMgKyBST01DUyoweDQwMDA7Ci0JCWNtZDI9KChwYWdlICYgMHhmZikgPDwgOCkgKyAweDAwMzI7Ci0KLQkJb3V0dyggY21kMSwgUEFHRV9JTyApOwotCQlvdXR3KCBjbWQyLCBQQUdFX0lPICk7Ci0KLQkJcGFnZV9pbl93aW5kb3cgPSBwYWdlOwotCX0KLX0KLQotCi1zdGF0aWMgbWFwX3dvcmQgZWxhbl8xMDRuY19yZWFkMTYoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgb2ZzKQotewotCW1hcF93b3JkIHJldDsKLQlzcGluX2xvY2soJmVsYW5fMTA0bmNfc3Bpbik7Ci0JZWxhbl8xMDRuY19wYWdlKG1hcCwgb2ZzKTsKLQlyZXQueFswXSA9IHJlYWR3KGlvbWFwYWRyICsgKG9mcyAmIFdJTkRPV19NQVNLKSk7Ci0Jc3Bpbl91bmxvY2soJmVsYW5fMTA0bmNfc3Bpbik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZWxhbl8xMDRuY19jb3B5X2Zyb20oc3RydWN0IG1hcF9pbmZvICptYXAsIHZvaWQgKnRvLCB1bnNpZ25lZCBsb25nIGZyb20sIHNzaXplX3QgbGVuKQotewotCXdoaWxlIChsZW4pIHsKLQkJdW5zaWduZWQgbG9uZyB0aGlzbGVuID0gbGVuOwotCQlpZiAobGVuID4gKFdJTkRPV19MRU5HVEggLSAoZnJvbSAmIFdJTkRPV19NQVNLKSkpCi0JCQl0aGlzbGVuID0gV0lORE9XX0xFTkdUSC0oZnJvbSAmIFdJTkRPV19NQVNLKTsKLQkJCi0JCXNwaW5fbG9jaygmZWxhbl8xMDRuY19zcGluKTsKLQkJZWxhbl8xMDRuY19wYWdlKG1hcCwgZnJvbSk7Ci0JCW1lbWNweV9mcm9taW8odG8sIGlvbWFwYWRyICsgKGZyb20gJiBXSU5ET1dfTUFTSyksIHRoaXNsZW4pOwotCQlzcGluX3VubG9jaygmZWxhbl8xMDRuY19zcGluKTsKLQkJdG8gKz0gdGhpc2xlbjsKLQkJZnJvbSArPSB0aGlzbGVuOwotCQlsZW4gLT0gdGhpc2xlbjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGVsYW5fMTA0bmNfd3JpdGUxNihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgbWFwX3dvcmQgZCwgdW5zaWduZWQgbG9uZyBhZHIpCi17Ci0Jc3Bpbl9sb2NrKCZlbGFuXzEwNG5jX3NwaW4pOwotCWVsYW5fMTA0bmNfcGFnZShtYXAsIGFkcik7Ci0Jd3JpdGV3KGQueFswXSwgaW9tYXBhZHIgKyAoYWRyICYgV0lORE9XX01BU0spKTsKLQlzcGluX3VubG9jaygmZWxhbl8xMDRuY19zcGluKTsKLX0KLQotc3RhdGljIHZvaWQgZWxhbl8xMDRuY19jb3B5X3RvKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIHRvLCBjb25zdCB2b2lkICpmcm9tLCBzc2l6ZV90IGxlbikKLXsJCi0Jd2hpbGUobGVuKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdGhpc2xlbiA9IGxlbjsKLQkJaWYgKGxlbiA+IChXSU5ET1dfTEVOR1RIIC0gKHRvICYgV0lORE9XX01BU0spKSkKLQkJCXRoaXNsZW4gPSBXSU5ET1dfTEVOR1RILSh0byAmIFdJTkRPV19NQVNLKTsKLQkJCi0JCXNwaW5fbG9jaygmZWxhbl8xMDRuY19zcGluKTsKLQkJZWxhbl8xMDRuY19wYWdlKG1hcCwgdG8pOwotCQltZW1jcHlfdG9pbyhpb21hcGFkciArICh0byAmIFdJTkRPV19NQVNLKSwgZnJvbSwgdGhpc2xlbik7Ci0JCXNwaW5fdW5sb2NrKCZlbGFuXzEwNG5jX3NwaW4pOwotCQl0byArPSB0aGlzbGVuOwotCQlmcm9tICs9IHRoaXNsZW47Ci0JCWxlbiAtPSB0aGlzbGVuOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBlbGFuXzEwNG5jX21hcCA9IHsKLQkubmFtZSA9ICJFTEFOLTEwNE5DIGZsYXNoIiwKLQkucGh5cyA9IE5PX1hJUCwKLQkuc2l6ZSA9IDgqMTAyNCoxMDI0LCAvKiB0aGlzIG11c3QgYmUgc2V0IHRvIGEgbWF4aW11bSBwb3NzaWJsZSBhbW91bnQKLQkJCW9mIGZsYXNoIHNvIHRoZSBjZmkgcHJvYmUgcm91dGluZXMgZmluZCBhbGwKLQkJCXRoZSBjaGlwcyAqLwotCS5iYW5rd2lkdGggPSAyLAotCS5yZWFkID0gZWxhbl8xMDRuY19yZWFkMTYsCi0JLmNvcHlfZnJvbSA9IGVsYW5fMTA0bmNfY29weV9mcm9tLAotCS53cml0ZSA9IGVsYW5fMTA0bmNfd3JpdGUxNiwKLQkuY29weV90byA9IGVsYW5fMTA0bmNfY29weV90bwotfTsKLQotLyogTVREIGRldmljZSBmb3IgYWxsIG9mIHRoZSBmbGFzaC4gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKmFsbF9tdGQ7Ci0KLXN0YXRpYyB2b2lkIGNsZWFudXBfZWxhbl8xMDRuYyh2b2lkKQotewotCWlmKCBhbGxfbXRkICkgewotCQlkZWxfbXRkX3BhcnRpdGlvbnMoIGFsbF9tdGQgKTsKLQkJbWFwX2Rlc3Ryb3koIGFsbF9tdGQgKTsKLQl9Ci0KLQlpb3VubWFwKGlvbWFwYWRyKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9lbGFuXzEwNG5jKHZvaWQpCi17Ci0JLyogVXJnISBXZSB1c2UgSS9PIHBvcnQgMHgyMiB3aXRob3V0IHJlcXVlc3RfcmVnaW9uKClpbmcgaXQsCi0JICAgYmVjYXVzZSBpdCdzIGFscmVhZHkgYWxsb2NhdGVkIHRvIHRoZSBQSUMuICovCi0KLSAgCWlvbWFwYWRyID0gaW9yZW1hcChXSU5ET1dfU1RBUlQsIFdJTkRPV19MRU5HVEgpOwotCWlmICghaW9tYXBhZHIpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiIlczogZmFpbGVkIHRvIGlvcmVtYXAgbWVtb3J5IHJlZ2lvblxuIiwKLQkJCWVsYW5fMTA0bmNfbWFwLm5hbWUgKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcHJpbnRrKCBLRVJOX0lORk8iJXM6IElPOjB4JXgtMHgleCBNRU06MHgleC0weCV4XG4iLAotCQllbGFuXzEwNG5jX21hcC5uYW1lLAotCQlQQUdFX0lPLCBQQUdFX0lPK1BBR0VfSU9fU0laRS0xLAotCQlXSU5ET1dfU1RBUlQsIFdJTkRPV19TVEFSVCtXSU5ET1dfTEVOR1RILTEgKTsKLQotCWVsYW5fMTA0bmNfc2V0dXAoKTsKLQotCS8qIFByb2JlIGZvciBjaGlwLiAqLwotCWFsbF9tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICAmZWxhbl8xMDRuY19tYXAgKTsKLQlpZiggIWFsbF9tdGQgKSB7Ci0JCWNsZWFudXBfZWxhbl8xMDRuYygpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQkKLQlhbGxfbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JLyogQ3JlYXRlIE1URCBkZXZpY2VzIGZvciBlYWNoIHBhcnRpdGlvbi4gKi8KLQlhZGRfbXRkX3BhcnRpdGlvbnMoIGFsbF9tdGQsIHBhcnRpdGlvbl9pbmZvLCBOVU1fUEFSVElUSU9OUyApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfZWxhbl8xMDRuYyk7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX2VsYW5fMTA0bmMpOwotCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkFyY29tIENvbnRyb2wgU3lzdGVtcyBMdGQuIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1URCBtYXAgZHJpdmVyIGZvciBBcmNvbSBDb250cm9sIFN5c3RlbXMgRUxBTi0xMDROQyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9pY2h4cm9tLmMgYi9kcml2ZXJzL210ZC9tYXBzL2ljaHhyb20uYwppbmRleCAyOWQxY2MxLi5lNTA1MjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2ljaHhyb20uYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2ljaHhyb20uYwpAQCAtMiw3ICsyLDcgQEAKICAqIGljaHhyb20uYwogICoKICAqIE5vcm1hbCBtYXBwaW5ncyBvZiBjaGlwcyBpbiBwaHlzaWNhbCBtZW1vcnkKLSAqICRJZDogaWNoeHJvbS5jLHYgMS4xNiAyMDA0LzExLzI4IDA5OjQwOjM5IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGljaHhyb20uYyx2IDEuMTggMjAwNS8wNy8wNyAxMDoyNjoyMCBkd213MiBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMzOCw5ICszMzgsOSBAQAogCXsgMCwgfSwKIH07CiAKKyNpZiAwCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWNoeHJvbV9wY2lfdGJsKTsKIAotI2lmIDAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpY2h4cm9tX2RyaXZlciA9IHsKIAkubmFtZSA9CQlNT0RfTkFNRSwKIAkuaWRfdGFibGUgPQlpY2h4cm9tX3BjaV90YmwsCkBAIC0zNjYsNyArMzY2LDcgQEAKIAl9CiAJcmV0dXJuIC1FTlhJTzsKICNpZiAwCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmaWNoeHJvbV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpY2h4cm9tX2RyaXZlcik7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwppbmRleCBjNWI1ZjQ0Li4zZTk0YjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGl4cDIwMDAuYyx2IDEuNSAyMDA0LzExLzE2IDE3OjE1OjQ4IGRzYXhlbmEgRXhwICQKKyAqICRJZDogaXhwMjAwMC5jLHYgMS42IDIwMDUvMDMvMTggMTQ6MDc6NDYgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBkcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwogICoKQEAgLTIxNiwxMSArMjE2LDYgQEAKIAkJZ290byBFcnJvcjsKIAl9CiAKLQkvKgotCSAqIFNldHVwIHJlYWQgbW9kZSBmb3IgRkxBU0gKLQkgKi8KLQkqSVhQMjAwMF9TTE9XUE9SVF9GUk0gPSAxOwotCiAjaWYgZGVmaW5lZChfX0FSTUVCX18pCiAJLyoKIAkgKiBFbmFibGUgZXJyYXR1bSA0NCB3b3JrYXJvdW5kIGZvciBOUFVzIHdpdGggYnJva2VuIHNsb3dwb3J0CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL21haW5zdG9uZS1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9tYWluc3RvbmUtZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U5M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9tYWluc3RvbmUtZmxhc2guYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqICRJZDogICQKKyAqCisgKiBNYXAgZHJpdmVyIGZvciB0aGUgTWFpbnN0b25lIGRldmVsb3BlciBwbGF0Zm9ybS4KKyAqCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENvcHlyaWdodDoJKEMpIDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWFpbnN0b25lLmg+CisKKworI2RlZmluZSBST01fQUREUgkweDAwMDAwMDAwCisjZGVmaW5lIEZMQVNIX0FERFIJMHgwNDAwMDAwMAorCisjZGVmaW5lIFdJTkRPV19TSVpFIAkweDA0MDAwMDAwCisKK3N0YXRpYyB2b2lkIG1haW5zdG9uZV9tYXBfaW52YWxfY2FjaGUoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgZnJvbSwKKwkJCQkgICAgICBzc2l6ZV90IGxlbikKK3sKKwljb25zaXN0ZW50X3N5bmMoKGNoYXIgKiltYXAtPmNhY2hlZCArIGZyb20sIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBtYWluc3RvbmVfbWFwc1syXSA9IHsgeworCS5zaXplID0JCVdJTkRPV19TSVpFLAorCS5waHlzID0JCVBYQV9DUzBfUEhZUywKKwkuaW52YWxfY2FjaGUgPSAJbWFpbnN0b25lX21hcF9pbnZhbF9jYWNoZSwKK30sIHsKKwkuc2l6ZSA9CQlXSU5ET1dfU0laRSwKKwkucGh5cyA9CQlQWEFfQ1MxX1BIWVMsCisJLmludmFsX2NhY2hlID0gCW1haW5zdG9uZV9tYXBfaW52YWxfY2FjaGUsCit9IH07CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBtYWluc3RvbmVfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUgPQkJIkJvb3Rsb2FkZXIiLAorCQkuc2l6ZSA9CQkweDAwMDQwMDAwLAorCQkub2Zmc2V0ID0JMCwKKwkJLm1hc2tfZmxhZ3MgPQlNVERfV1JJVEVBQkxFICAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LHsKKwkJLm5hbWUgPQkJIktlcm5lbCIsCisJCS5zaXplID0JCTB4MDA0MDAwMDAsCisJCS5vZmZzZXQgPQkweDAwMDQwMDAwLAorCX0seworCQkubmFtZSA9CQkiRmlsZXN5c3RlbSIsCisJCS5zaXplID0JCU1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgPQkweDAwNDQwMDAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXltdGRzWzJdOworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJzZWRfcGFydHNbMl07CitzdGF0aWMgaW50IG5yX3BhcnNlZF9wYXJ0c1syXTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnByb2Jlc1tdID0geyAiUmVkQm9vdCIsICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9tYWluc3RvbmUodm9pZCkKK3sKKwlpbnQgU1c3ID0gMDsgIC8qIEZJWE1FOiBnZXQgZnJvbSBTQ1IgKE1zdCBkb2Mgc2VjdGlvbiAzLjIuMS4xKSAqLworCWludCByZXQgPSAwLCBpOworCisJbWFpbnN0b25lX21hcHNbMF0uYmFua3dpZHRoID0gKEJPT1RfREVGICYgMSkgPyAyIDogNDsKKwltYWluc3RvbmVfbWFwc1sxXS5iYW5rd2lkdGggPSA0OworCisJLyogQ29tcGVuc2F0ZSBmb3IgU1c3IHdoaWNoIHN3YXBzIHRoZSBmbGFzaCBiYW5rcyAqLworCW1haW5zdG9uZV9tYXBzW1NXN10ubmFtZSA9ICJwcm9jZXNzb3IgZmxhc2giOworCW1haW5zdG9uZV9tYXBzW1NXNyBeIDFdLm5hbWUgPSAibWFpbiBib2FyZCBmbGFzaCI7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk1haW5zdG9uZSBjb25maWd1cmVkIHRvIGJvb3QgZnJvbSAlc1xuIiwKKwkgICAgICAgbWFpbnN0b25lX21hcHNbMF0ubmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW1haW5zdG9uZV9tYXBzW2ldLnZpcnQgPSBpb3JlbWFwKG1haW5zdG9uZV9tYXBzW2ldLnBoeXMsCisJCQkJCQkgV0lORE9XX1NJWkUpOworCQlpZiAoIW1haW5zdG9uZV9tYXBzW2ldLnZpcnQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBpb3JlbWFwICVzXG4iLCAKKwkJCSAgICAgICBtYWluc3RvbmVfbWFwc1tpXS5uYW1lKTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FTk9NRU07CisJCQljb250aW51ZTsKKwkJfQorCQltYWluc3RvbmVfbWFwc1tpXS5jYWNoZWQgPSAKKwkJCWlvcmVtYXBfY2FjaGVkKG1haW5zdG9uZV9tYXBzW2ldLnBoeXMsIFdJTkRPV19TSVpFKTsKKwkJaWYgKCFtYWluc3RvbmVfbWFwc1tpXS5jYWNoZWQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gaW9yZW1hcCBjYWNoZWQgJXNcbiIsCisJCQkgICAgICAgbWFpbnN0b25lX21hcHNbaV0ubmFtZSk7CisJCXNpbXBsZV9tYXBfaW5pdCgmbWFpbnN0b25lX21hcHNbaV0pOworCisJCXByaW50ayhLRVJOX05PVElDRSAKKwkJICAgICAgICJQcm9iaW5nICVzIGF0IHBoeXNpY2FsIGFkZHJlc3MgMHglMDhseCIKKwkJICAgICAgICIgKCVkLWJpdCBiYW5rd2lkdGgpXG4iLAorCQkgICAgICAgbWFpbnN0b25lX21hcHNbaV0ubmFtZSwgbWFpbnN0b25lX21hcHNbaV0ucGh5cywgCisJCSAgICAgICBtYWluc3RvbmVfbWFwc1tpXS5iYW5rd2lkdGggKiA4KTsKKworCQlteW10ZHNbaV0gPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZtYWluc3RvbmVfbWFwc1tpXSk7CisJCQorCQlpZiAoIW15bXRkc1tpXSkgeworCQkJaW91bm1hcCgodm9pZCAqKW1haW5zdG9uZV9tYXBzW2ldLnZpcnQpOworCQkJaWYgKG1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCkKKwkJCQlpb3VubWFwKG1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUlPOworCQkJY29udGludWU7CisJCX0KKwkJbXltdGRzW2ldLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJCXJldCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG15bXRkc1tpXSwgcHJvYmVzLAorCQkJCQkgICAmcGFyc2VkX3BhcnRzW2ldLCAwKTsKKworCQlpZiAocmV0ID4gMCkKKwkJCW5yX3BhcnNlZF9wYXJ0c1tpXSA9IHJldDsKKwl9CisKKwlpZiAoIW15bXRkc1swXSAmJiAhbXltdGRzWzFdKQorCQlyZXR1cm4gcmV0OworCQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKCFteW10ZHNbaV0pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGlzIGFic2VudC4gU2tpcHBpbmdcbiIsIAorCQkJICAgICAgIG1haW5zdG9uZV9tYXBzW2ldLm5hbWUpOworCQl9IGVsc2UgaWYgKG5yX3BhcnNlZF9wYXJ0c1tpXSkgeworCQkJYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkc1tpXSwgcGFyc2VkX3BhcnRzW2ldLCAKKwkJCQkJICAgbnJfcGFyc2VkX3BhcnRzW2ldKTsKKwkJfSBlbHNlIGlmICghaSkgeworCQkJcHJpbnRrKCJVc2luZyBzdGF0aWMgcGFydGl0aW9ucyBvbiAlc1xuIiwKKwkJCSAgICAgICBtYWluc3RvbmVfbWFwc1tpXS5uYW1lKTsKKwkJCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZHNbaV0sIG1haW5zdG9uZV9wYXJ0aXRpb25zLCAKKwkJCQkJICAgQVJSQVlfU0laRShtYWluc3RvbmVfcGFydGl0aW9ucykpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJSZWdpc3RlcmluZyAlcyBhcyB3aG9sZSBkZXZpY2VcbiIsIAorCQkJICAgICAgIG1haW5zdG9uZV9tYXBzW2ldLm5hbWUpOworCQkJYWRkX210ZF9kZXZpY2UobXltdGRzW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbWFpbnN0b25lKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAoIW15bXRkc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChucl9wYXJzZWRfcGFydHNbaV0gfHwgIWkpCisJCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGRzW2ldKTsKKwkJZWxzZQorCQkJZGVsX210ZF9kZXZpY2UobXltdGRzW2ldKTsKKworCQltYXBfZGVzdHJveShteW10ZHNbaV0pOworCQlpb3VubWFwKCh2b2lkICopbWFpbnN0b25lX21hcHNbaV0udmlydCk7CisJCWlmIChtYWluc3RvbmVfbWFwc1tpXS5jYWNoZWQpCisJCQlpb3VubWFwKG1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCk7CisJCWtmcmVlKHBhcnNlZF9wYXJ0c1tpXSk7CisJfQorfQorCittb2R1bGVfaW5pdChpbml0X21haW5zdG9uZSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX21haW5zdG9uZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVREIG1hcCBkcml2ZXIgZm9yIEludGVsIE1haW5zdG9uZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9tYXBfZnVuY3MuYyBiL2RyaXZlcnMvbXRkL21hcHMvbWFwX2Z1bmNzLmMKaW5kZXggMzhmNmE3YS4uOTEwNWU2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9tYXBfZnVuY3MuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL21hcF9mdW5jcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogbWFwX2Z1bmNzLmMsdiAxLjkgMjAwNC8wNy8xMyAyMjozMzoxNSBkd213MiBFeHAgJAorICogJElkOiBtYXBfZnVuY3MuYyx2IDEuMTAgMjAwNS8wNi8wNiAyMzowNDozNiB0cG95bm9yIEV4cCAkCiAgKgogICogT3V0LW9mLWxpbmUgbWFwIEkvTyBmdW5jdGlvbnMgZm9yIHNpbXBsZSBtYXBzIHdoZW4gQ09ORklHX0NPTVBMRVhfTUFQUElOR1MKICAqIGlzIGVuYWJsZWQuCkBAIC05LDIzICs5LDI0IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3hpcC5oPgogCi1zdGF0aWMgbWFwX3dvcmQgc2ltcGxlX21hcF9yZWFkKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIG9mcykKK3N0YXRpYyBtYXBfd29yZCBfX3hpcHJhbSBzaW1wbGVfbWFwX3JlYWQoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgb2ZzKQogewogCXJldHVybiBpbmxpbmVfbWFwX3JlYWQobWFwLCBvZnMpOwogfQogCi1zdGF0aWMgdm9pZCBzaW1wbGVfbWFwX3dyaXRlKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBjb25zdCBtYXBfd29yZCBkYXR1bSwgdW5zaWduZWQgbG9uZyBvZnMpCitzdGF0aWMgdm9pZCBfX3hpcHJhbSBzaW1wbGVfbWFwX3dyaXRlKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBjb25zdCBtYXBfd29yZCBkYXR1bSwgdW5zaWduZWQgbG9uZyBvZnMpCiB7CiAJaW5saW5lX21hcF93cml0ZShtYXAsIGRhdHVtLCBvZnMpOwogfQogCi1zdGF0aWMgdm9pZCBzaW1wbGVfbWFwX2NvcHlfZnJvbShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgZnJvbSwgc3NpemVfdCBsZW4pCitzdGF0aWMgdm9pZCBfX3hpcHJhbSBzaW1wbGVfbWFwX2NvcHlfZnJvbShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgZnJvbSwgc3NpemVfdCBsZW4pCiB7CiAJaW5saW5lX21hcF9jb3B5X2Zyb20obWFwLCB0bywgZnJvbSwgbGVuKTsKIH0KIAotc3RhdGljIHZvaWQgc2ltcGxlX21hcF9jb3B5X3RvKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIHRvLCBjb25zdCB2b2lkICpmcm9tLCBzc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIF9feGlwcmFtIHNpbXBsZV9tYXBfY29weV90byhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyB0bywgY29uc3Qgdm9pZCAqZnJvbSwgc3NpemVfdCBsZW4pCiB7CiAJaW5saW5lX21hcF9jb3B5X3RvKG1hcCwgdG8sIGZyb20sIGxlbik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMgYi9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjNzE0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIEZsYXNoIG1lbW9yeSBzdXBwb3J0IGZvciB2YXJpb3VzIFRJIE9NQVAgYm9hcmRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uIAorICoKKyAqCUFzc2VtYmxlZCB1c2luZyBkcml2ZXIgY29kZSBjb3B5cmlnaHQgdGhlIGNvbXBhbmllcyBhYm92ZQorICoJYW5kIHdyaXR0ZW4gYnkgRGF2aWQgQnJvd25lbGwsIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+LAorICogCVRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+IGFuZCBvdGhlcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAvKiAiUmVkQm9vdCIsICovICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKyNlbmRpZgorCitzdHJ1Y3Qgb21hcGZsYXNoX2luZm8geworCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKKwlzdHJ1Y3QgbXRkX2luZm8JCSptdGQ7CisJc3RydWN0IG1hcF9pbmZvCQltYXA7Cit9OworCitzdGF0aWMgdm9pZCBvbWFwX3NldF92cHAoc3RydWN0IG1hcF9pbmZvICptYXAsIGludCBlbmFibGUpCit7CisJc3RhdGljIGludAljb3VudDsKKworCWlmIChlbmFibGUpIHsKKwkJaWYgKGNvdW50KysgPT0gMCkKKwkJCU9NQVBfRU1JRlNfQ09ORklHX1JFRyB8PSBPTUFQX0VNSUZTX0NPTkZJR19XUDsKKwl9IGVsc2UgeworCQlpZiAoY291bnQgJiYgKC0tY291bnQgPT0gMCkpCisJCQlPTUFQX0VNSUZTX0NPTkZJR19SRUcgJj0gfk9NQVBfRU1JRlNfQ09ORklHX1dQOworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgb21hcGZsYXNoX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBvbWFwZmxhc2hfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwZGV2LT5yZXNvdXJjZTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwZmxhc2hfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBvbWFwZmxhc2hfaW5mbykpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgc2l6ZSwgImZsYXNoIikpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF9mcmVlX2luZm87CisJfQorCisJaW5mby0+bWFwLnZpcnQJCT0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpZiAoIWluZm8tPm1hcC52aXJ0KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisJaW5mby0+bWFwLm5hbWUJCT0gcGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAucGh5cwkJPSByZXMtPnN0YXJ0OworCWluZm8tPm1hcC5zaXplCQk9IHNpemU7CisJaW5mby0+bWFwLmJhbmt3aWR0aAk9IHBkYXRhLT53aWR0aDsKKwlpbmZvLT5tYXAuc2V0X3ZwcAk9IG9tYXBfc2V0X3ZwcDsKKworCXNpbXBsZV9tYXBfaW5pdCgmaW5mby0+bWFwKTsKKwlpbmZvLT5tdGQgPSBkb19tYXBfcHJvYmUocGRhdGEtPm1hcF9uYW1lLCAmaW5mby0+bWFwKTsKKwlpZiAoIWluZm8tPm10ZCkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKwlpbmZvLT5tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBhcnRfcHJvYmVzLCAmaW5mby0+cGFydHMsIDApOworCWlmIChlcnIgPiAwKQorCQlhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBpbmZvLT5wYXJ0cywgZXJyKTsKKwllbHNlIGlmIChlcnIgPCAwICYmIHBkYXRhLT5wYXJ0cykKKwkJYWRkX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOworCWVsc2UKKyNlbmRpZgorCQlhZGRfbXRkX2RldmljZShpbmZvLT5tdGQpOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGluZm8pOworCisJcmV0dXJuIDA7CisKK291dF9pb3VubWFwOgorCWlvdW5tYXAoaW5mby0+bWFwLnZpcnQpOworb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgc2l6ZSk7CitvdXRfZnJlZV9pbmZvOgorCWtmcmVlKGluZm8pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgb21hcGZsYXNoX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBvbWFwZmxhc2hfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBOVUxMKTsKKworCWlmIChpbmZvKSB7CisJCWlmIChpbmZvLT5wYXJ0cykgeworCQkJZGVsX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCk7CisJCQlrZnJlZShpbmZvLT5wYXJ0cyk7CisJCX0gZWxzZQorCQkJZGVsX210ZF9kZXZpY2UoaW5mby0+bXRkKTsKKwkJbWFwX2Rlc3Ryb3koaW5mby0+bXRkKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPm1hcC5waHlzLCBpbmZvLT5tYXAuc2l6ZSk7CisJCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBpbmZvLT5tYXAudmlydCk7CisJCWtmcmVlKGluZm8pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgb21hcGZsYXNoX2RyaXZlciA9IHsKKwkubmFtZQk9ICJvbWFwZmxhc2giLAorCS5idXMJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCT0gb21hcGZsYXNoX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChvbWFwZmxhc2hfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmbGFzaF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3Rlcigmb21hcGZsYXNoX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwZmxhc2hfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZvbWFwZmxhc2hfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob21hcGZsYXNoX2luaXQpOworbW9kdWxlX2V4aXQob21hcGZsYXNoX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBOT1IgbWFwIGRyaXZlciBmb3IgVEkgT01BUCBib2FyZHMiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wYjE1NTAtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvcGIxNTUwLWZsYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjQ3MjZhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGIxNTUwLWZsYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQWxjaGVteSBQYjE1NTAgYm9hcmQKLSAqIAotICogJElkOiBwYjE1NTAtZmxhc2guYyx2IDEuNiAyMDA0LzExLzA0IDEzOjI0OjE1IGdsZWl4bmVyIEV4cCAkCi0gKgotICogKEMpIDIwMDQgRW1iZWRkZWQgRWRnZSwgTExDLCBiYXNlZCBvbiBwYjE1NTAtZmxhc2guYzoKLSAqIChDKSAyMDAzIFBldGUgUG9wb3YgPHBwb3BvdkBwYWNiZWxsLm5ldD4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9hdTEwMDAuaD4KLSNpbmNsdWRlIDxhc20vcGIxNTUwLmg+Ci0KLSNpZmRlZiAJREVCVUdfUlcKLSNkZWZpbmUJREJHKHguLi4pCXByaW50ayh4KQotI2Vsc2UKLSNkZWZpbmUJREJHKHguLi4pCQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpbmRvd19hZGRyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgd2luZG93X3NpemU7Ci0KLQotc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBwYjE1NTBfbWFwID0gewotCS5uYW1lID0JIlBiMTU1MCBmbGFzaCIsCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBmbGFzaF9iYW5rd2lkdGggPSA0OwotCi0vKiAKLSAqIFN1cHBvcnQgb25seSA2NE1CIE5PUiBGbGFzaCBwYXJ0cwotICovCi0KLSNpZmRlZiBQQjE1NTBfQk9USF9CQU5LUwotLyogYm90aCBiYW5rcyB3aWxsIGJlIHVzZWQuIENvbWJpbmUgdGhlIGZpcnN0IGJhbmsgYW5kIHRoZSBmaXJzdCAKLSAqIHBhcnQgb2YgdGhlIHNlY29uZCBiYW5rIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgamZmcy9qZmZzMgotICogcGFydGl0aW9uLgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGIxNTUwX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBhc3N1bWUgYm9vdFsyOjBdOnN3YXAgaXMgJzAwMDAnIG9yICcxMDAwJywgd2hpY2ggdHJhbnNsYXRlcyB0bzoKLQkgKiAxQzAwIDAwMDAgMUZGRiBGRkZGIENFMCA2NE1CIEJvb3QgTk9SIEZsYXNoCi0JICogMTgwMCAwMDAwIDFCRkYgRkZGRiBDRTAgNjRNQiBQYXJhbSBOT1IgRmxhc2gKLQkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplID0gICAoMHgxRkMwMDAwMCAtIDB4MTgwMDAwMDApLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSAoMHgzMDAwMDAgLSAweDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyB5YW1vbiBlbnYgKi8KLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoUEIxNTUwX0JPT1RfT05MWSkKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjE1NTBfcGFydGl0aW9uc1tdID0gewotCS8qIGFzc3VtZSBib290WzI6MF06c3dhcCBpcyAnMDAwMCcgb3IgJzEwMDAnLCB3aGljaCB0cmFuc2xhdGVzIHRvOgotCSAqIDFDMDAgMDAwMCAxRkZGIEZGRkYgQ0UwIDY0TUIgQm9vdCBOT1IgRmxhc2gKLQkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplID0gICAweDAzYzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplID0gMHgwMTAwMDAwLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSAoMHgzMDAwMDAtMHg0MDAwMCksIC8qIGxhc3QgMjU2S0IgaXMgeWFtb24gZW52ICovCi0JCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgIH0KLX07Ci0jZWxpZiBkZWZpbmVkKFBCMTU1MF9VU0VSX09OTFkpCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGIxNTUwX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBhc3N1bWUgYm9vdFsyOjBdOnN3YXAgaXMgJzAwMDAnIG9yICcxMDAwJywgd2hpY2ggdHJhbnNsYXRlcyB0bzoKLQkgKiAxODAwIDAwMDAgMUJGRiBGRkZGIENFMCA2NE1CIFBhcmFtIE5PUiBGbGFzaAotCSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAoMHg0MDAwMDAwIC0gMHgyMDAwMDApLCAvKiByZXNlcnZlIDJNQiBmb3IgcmF3IGtlcm5lbCAqLwotICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAicmF3IGtlcm5lbCIsCi0JCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbHNlCi0jZXJyb3IgTVREX1BCMTU1MCBkZWZpbmUgY29tYm8gZXJyb3IgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTkJfT0YoeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQotCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKLQotLyoKLSAqIFByb2JlIHRoZSBmbGFzaCBkZW5zaXR5IGFuZCBzZXR1cCB3aW5kb3cgYWRkcmVzcyBhbmQgc2l6ZQotICogYmFzZWQgb24gdXNlciBDT05GSUcgb3B0aW9ucy4gVGhlcmUgYXJlIHRpbWVzIHdoZW4gd2UgZG9uJ3QKLSAqIHdhbnQgdGhlIE1URCBkcml2ZXIgdG8gYmUgcHJvYmluZyB0aGUgYm9vdCBvciB1c2VyIGZsYXNoLAotICogc28gaGF2aW5nIHRoZSBvcHRpb24gdG8gZW5hYmxlIG9ubHkgb25lIGJhbmsgaXMgaW1wb3J0YW50LgotICovCi1pbnQgc2V0dXBfZmxhc2hfcGFyYW1zKHZvaWQpCi17Ci0JdTE2IGJvb3Rfc3dhcGJvb3Q7Ci0JYm9vdF9zd2FwYm9vdCA9IChhdV9yZWFkbChNRU1fU1RTVEFUKSAmICgweDc8PDEpKSB8IAotCQkoKGJjc3ItPnN0YXR1cyA+PiA2KSAgJiAweDEpOwotCXByaW50aygiUGIxNTUwIE1URDogYm9vdDpzd2FwICVkXG4iLCBib290X3N3YXBib290KTsKLQotCXN3aXRjaCAoYm9vdF9zd2FwYm9vdCkgewotCQljYXNlIDA6IC8qIDUxMk1iaXQgZGV2aWNlcywgYm90aCBlbmFibGVkICovCi0JCWNhc2UgMTogCi0JCWNhc2UgODoKLQkJY2FzZSA5OiAKLSNpZiBkZWZpbmVkKFBCMTU1MF9CT1RIX0JBTktTKQotCQkJd2luZG93X2FkZHIgPSAweDE4MDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDgwMDAwMDA7IAotI2VsaWYgZGVmaW5lZChQQjE1NTBfQk9PVF9PTkxZKQotCQkJd2luZG93X2FkZHIgPSAweDFDMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7IAotI2Vsc2UgLyogVVNFUiBPTkxZICovCi0JCQl3aW5kb3dfYWRkciA9IDB4MUUwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4NDAwMDAwMDsgCi0jZW5kaWYKLQkJCWJyZWFrOwotCQljYXNlIDB4QzoKLQkJY2FzZSAweEQ6Ci0JCWNhc2UgMHhFOgotCQljYXNlIDB4RjogCi0JCQkvKiA2NCBNQiBCb290IE5PUiBGbGFzaCBpcyBkaXNhYmxlZCAqLwotCQkJLyogYW5kIHRoZSBzdGFydCBhZGRyZXNzIGlzIG1vdmVkIHRvIDB4MEMwMDAwMCAqLwotCQkJd2luZG93X2FkZHIgPSAweDBDMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7IAotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJQYjE1NTAgTVREOiB1bnN1cHBvcnRlZCBib290OnN3YXAgc2V0dGluZ1xuIik7Ci0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX2luaXQgcGIxNTUwX210ZF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWludCBuYl9wYXJ0cyA9IDA7Ci0JCi0JLyogRGVmYXVsdCBmbGFzaCBiYW5rd2lkdGggKi8KLQlwYjE1NTBfbWFwLmJhbmt3aWR0aCA9IGZsYXNoX2Jhbmt3aWR0aDsKLQotCWlmIChzZXR1cF9mbGFzaF9wYXJhbXMoKSkgCi0JCXJldHVybiAtRU5YSU87Ci0KLQkvKgotCSAqIFN0YXRpYyBwYXJ0aXRpb24gZGVmaW5pdGlvbiBzZWxlY3Rpb24KLQkgKi8KLQlwYXJ0cyA9IHBiMTU1MF9wYXJ0aXRpb25zOwotCW5iX3BhcnRzID0gTkJfT0YocGIxNTUwX3BhcnRpdGlvbnMpOwotCXBiMTU1MF9tYXAuc2l6ZSA9IHdpbmRvd19zaXplOwotCi0JLyoKLQkgKiBOb3cgbGV0J3MgcHJvYmUgZm9yIHRoZSBhY3R1YWwgZmxhc2guICBEbyBpdCBoZXJlIHNpbmNlCi0JICogc3BlY2lmaWMgbWFjaGluZSBzZXR0aW5ncyBtaWdodCBoYXZlIGJlZW4gc2V0IGFib3ZlLgotCSAqLwotCXByaW50ayhLRVJOX05PVElDRSAiUGIxNTUwIGZsYXNoOiBwcm9iaW5nICVkLWJpdCBmbGFzaCBidXNcbiIsIAotCQkJcGIxNTUwX21hcC5iYW5rd2lkdGgqOCk7Ci0JcGIxNTUwX21hcC52aXJ0ID0gaW9yZW1hcCh3aW5kb3dfYWRkciwgd2luZG93X3NpemUpOwotCW15bXRkID0gZG9fbWFwX3Byb2JlKCJjZmlfcHJvYmUiLCAmcGIxNTUwX21hcCk7Ci0JaWYgKCFteW10ZCkgcmV0dXJuIC1FTlhJTzsKLQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgcGFydHMsIG5iX3BhcnRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBiMTU1MF9tdGRfY2xlYW51cCh2b2lkKQotewotCWlmIChteW10ZCkgewotCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGQpOwotCQltYXBfZGVzdHJveShteW10ZCk7Ci0JfQotfQotCi1tb2R1bGVfaW5pdChwYjE1NTBfbXRkX2luaXQpOwotbW9kdWxlX2V4aXQocGIxNTUwX210ZF9jbGVhbnVwKTsKLQotTU9EVUxFX0FVVEhPUigiRW1iZWRkZWQgRWRnZSwgTExDIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBiMTU1MCBtdGQgbWFwIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wYjF4eHgtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvcGIxeHh4LWZsYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTczMTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wYjF4eHgtZmxhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBBbGNoZW15IFBiMXh4eCBib2FyZHMKLSAqIAotICogKEMpIDIwMDEgUGV0ZSBQb3BvdiA8cHBvcG92QG12aXN0YS5jb20+Ci0gKiAKLSAqICRJZDogcGIxeHh4LWZsYXNoLmMsdiAxLjE0IDIwMDQvMTEvMDQgMTM6MjQ6MTUgZ2xlaXhuZXIgRXhwICQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2lmZGVmIAlERUJVR19SVwotI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZQlEQkcoeC4uLikJCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NSVBTX1BCMTAwMAotCi0jZGVmaW5lIFdJTkRPV19BRERSIDB4MUY4MDAwMDAKLSNkZWZpbmUgV0lORE9XX1NJWkUgMHg4MDAwMDAKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBiMXh4eF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJ5YW1vbiBlbnYiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDAwMjAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMCwKLSAgICAgICAgICAgICAgICAubWFza19mbGFncyAgID0gICBNVERfV1JJVEVBQkxFfSwKLQl7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDAzZTAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMHgyMDAwMCx9LAotCXsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAiYm9vdCBjb2RlIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gICAweDEwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDQwMDAwMCwKLSAgICAgICAgICAgICAgICAubWFza19mbGFncyAgID0gICBNVERfV1JJVEVBQkxFfSwKLQl7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInJhdy9rZXJuZWwiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgPSAgIDB4NTAwMDAwfQotfTsKLQotI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQU19QQjE1MDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfUEIxMTAwKQotCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX1BCMTUwMF9CT09UKSAmJiBkZWZpbmVkKENPTkZJR19NVERfUEIxNTAwX1VTRVIpCi0vKiBib3RoIDMyTUIgYmFua3Mgd2lsbCBiZSB1c2VkLiBDb21iaW5lIHRoZSBmaXJzdCAzMk1CIGJhbmsgYW5kIHRoZQotICogZmlyc3QgMjhNQiBvZiB0aGUgc2Vjb25kIGJhbmsgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBqZmZzL2pmZnMyCi0gKiBwYXJ0aXRpb24uCi0gKi8KLSNkZWZpbmUgV0lORE9XX0FERFIgMHgxQzAwMDAwMAotI2RlZmluZSBXSU5ET1dfU0laRSAweDQwMDAwMDAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjF4eHhfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4M2MwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInlhbW9uIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gICAweDAxMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMHgzYzAwMDAwLAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgIE1URF9XUklURUFCTEUKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInJhdyBrZXJuZWwiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDJjMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDNkMDAwMDAKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX01URF9QQjE1MDBfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX01URF9QQjE1MDBfVVNFUikKLSNkZWZpbmUgV0lORE9XX0FERFIgMHgxRTAwMDAwMAotI2RlZmluZSBXSU5ET1dfU0laRSAweDIwMDAwMDAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjF4eHhfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MWMwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDAwMDAwMDAKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInlhbW9uIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gICAweDAxMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMHgxYzAwMDAwLAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgIE1URF9XUklURUFCTEUKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgInJhdyBrZXJuZWwiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDJjMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDFkMDAwMDAKLSAgICAgICAgfQotfTsKLSNlbGlmICFkZWZpbmVkKENPTkZJR19NVERfUEIxNTAwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9QQjE1MDBfVVNFUikKLSNkZWZpbmUgV0lORE9XX0FERFIgMHgxQzAwMDAwMAotI2RlZmluZSBXSU5ET1dfU0laRSAweDIwMDAwMDAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjF4eHhfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICA9ICAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgICAweDFlMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgIDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAgInJhdyBrZXJuZWwiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgICAweDAyMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgIDB4MWUwMDAwMCwKLSAgICAgICAgfQotfTsKLSNlbHNlCi0jZXJyb3IgTVREX1BCMTUwMCBkZWZpbmUgY29tYm8gZXJyb3IgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotI2VuZGlmCi0jZWxzZQotI2Vycm9yIFVuc3VwcG9ydGVkIGJvYXJkCi0jZW5kaWYKLQotI2RlZmluZSBOQU1FICAgICAJIlBiMXgwMCBMaW51eCBGbGFzaCIKLSNkZWZpbmUgUEFERFIgICAgCVdJTkRPV19BRERSCi0jZGVmaW5lIEJVU1dJRFRICTQKLSNkZWZpbmUgU0laRQkJV0lORE9XX1NJWkUKLSNkZWZpbmUgUEFSVElUSU9OUwk0Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gcGIxeHh4X210ZF9tYXAgPSB7Ci0JLm5hbWUJCT0gTkFNRSwKLQkuc2l6ZQkJPSBTSVpFLAotCS5iYW5rd2lkdGgJPSBCVVNXSURUSCwKLQkucGh5cwkJPSBQQUREUiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnBiMXh4eF9tdGQ7Ci0KLWludCBfX2luaXQgcGIxeHh4X210ZF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWludCBuYl9wYXJ0cyA9IDA7Ci0JY2hhciAqcGFydF90eXBlOwotCQotCS8qCi0JICogU3RhdGljIHBhcnRpdGlvbiBkZWZpbml0aW9uIHNlbGVjdGlvbgotCSAqLwotCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCXBhcnRzID0gcGIxeHh4X3BhcnRpdGlvbnM7Ci0JbmJfcGFydHMgPSBBUlJBWV9TSVpFKHBiMXh4eF9wYXJ0aXRpb25zKTsKLQotCS8qCi0JICogTm93IGxldCdzIHByb2JlIGZvciB0aGUgYWN0dWFsIGZsYXNoLiAgRG8gaXQgaGVyZSBzaW5jZQotCSAqIHNwZWNpZmljIG1hY2hpbmUgc2V0dGluZ3MgbWlnaHQgaGF2ZSBiZWVuIHNldCBhYm92ZS4KLQkgKi8KLQlwcmludGsoS0VSTl9OT1RJQ0UgIlBiMXh4eCBmbGFzaDogcHJvYmluZyAlZC1iaXQgZmxhc2ggYnVzXG4iLCAKLQkJCUJVU1dJRFRIKjgpOwotCXBiMXh4eF9tdGRfbWFwLnZpcnQgPSBpb3JlbWFwKFdJTkRPV19BRERSLCBXSU5ET1dfU0laRSk7Ci0KLQlzaW1wbGVfbWFwX2luaXQoJnBiMXh4eF9tdGRfbWFwKTsKLQotCXBiMXh4eF9tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZwYjF4eHhfbXRkX21hcCk7Ci0JaWYgKCFwYjF4eHhfbXRkKSByZXR1cm4gLUVOWElPOwotCXBiMXh4eF9tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlhZGRfbXRkX3BhcnRpdGlvbnMocGIxeHh4X210ZCwgcGFydHMsIG5iX3BhcnRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBiMXh4eF9tdGRfY2xlYW51cCh2b2lkKQotewotCWlmIChwYjF4eHhfbXRkKSB7Ci0JCWRlbF9tdGRfcGFydGl0aW9ucyhwYjF4eHhfbXRkKTsKLQkJbWFwX2Rlc3Ryb3kocGIxeHh4X210ZCk7Ci0JCWlvdW5tYXAoKHZvaWQgKikgcGIxeHh4X210ZF9tYXAudmlydCk7Ci0JfQotfQotCi1tb2R1bGVfaW5pdChwYjF4eHhfbXRkX2luaXQpOwotbW9kdWxlX2V4aXQocGIxeHh4X210ZF9jbGVhbnVwKTsKLQotTU9EVUxFX0FVVEhPUigiUGV0ZSBQb3BvdiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQYjF4eHggQ0ZJIG1hcCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGNpLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BjaS5jCmluZGV4IDA4YjYwYmQuLjE4ZGJkM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGNpLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wY2kuYwpAQCAtNyw3ICs3LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiAgJElkOiBwY2kuYyx2IDEuOSAyMDA0LzExLzI4IDA5OjQwOjQwIGR3bXcyIEV4cCAkCisgKiAgJElkOiBwY2kuYyx2IDEuMTAgMjAwNS8wMy8xOCAxNDowNDozNSBnbGVpeG5lciBFeHAgJAogICogCiAgKiBHZW5lcmljIFBDSSBtZW1vcnkgbWFwIGRyaXZlci4gIFdlIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBib2FyZHM6CiAgKiAgLSBJbnRlbCBJUTgwMzEwIEFUVS4KQEAgLTM3MCw3ICszNzAsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtdGRfcGNpX21hcHNfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm10ZF9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbXRkX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXRkX3BjaV9tYXBzX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jCmluZGV4IGMyNjU1YTguLmZmN2M1MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtODAwLDExICs3OTksNiBAQAogCiAJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcGNtY2lhbXRkX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCURFQlVHKDIsICJDYWxsaW5nIFJlZ2lzdGVyQ2xpZW50Iik7CkBAIC04NTAsNiArODQ0LDcgQEAKIAkJLm5hbWUJPSAicGNtY2lhbXRkIgogCX0sCiAJLmF0dGFjaAkJPSBwY21jaWFtdGRfYXR0YWNoLAorCS5ldmVudAkJPSBwY21jaWFtdGRfZXZlbnQsCiAJLmRldGFjaAkJPSBwY21jaWFtdGRfZGV0YWNoLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuaWRfdGFibGUJPSBwY21jaWFtdGRfaWRzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jIGIvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGIwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMKQEAgLTAsMCArMSwyNzggQEAKKy8qIGRyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYworICoKKyAqIChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEdlbmVyaWMgcGxhdGZyb20gZGV2aWNlIGJhc2VkIFJBTSBtYXAKKyAqCisgKiAkSWQ6IHBsYXQtcmFtLmMsdiAxLjMgMjAwNS8wMy8xOSAyMjo0MToyNyBnbGVpeG5lciBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGxhdC1yYW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBwcml2YXRlIHN0cnVjdHVyZSBmb3IgZWFjaCBtdGQgcGxhdGZvcm0gcmFtIGRldmljZSBjcmVhdGVkICovCisKK3N0cnVjdCBwbGF0cmFtX2luZm8geworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IG10ZF9pbmZvCQkqbXRkOworCXN0cnVjdCBtYXBfaW5mbwkJIG1hcDsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydGl0aW9uczsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSphcmVhOworCXN0cnVjdCBwbGF0ZGF0YV9tdGRfcmFtCSpwZGF0YTsKK307CisKKy8qIHRvX3BsYXRyYW1faW5mbygpCisgKgorICogZGV2aWNlIHByaXZhdGUgZGF0YSB0byBzdHJ1Y3QgcGxhdHJhbV9pbmZvIGNvbnZlcnNpb24KKyovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBsYXRyYW1faW5mbyAqdG9fcGxhdHJhbV9pbmZvKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKHN0cnVjdCBwbGF0cmFtX2luZm8gKilkZXZfZ2V0X2RydmRhdGEoZGV2KTsKK30KKworLyogcGxhdHJhbV9zZXRydworICoKKyAqIGNhbGwgdGhlIHBsYXRmb3JtIGRldmljZSdzIHNldCBydy9ybyBjb250cm9sCisgKgorICogdG8gPSAwID0+IHJlYWQtb25seQorICogICAgPSAxID0+IHJlYWQtd3JpdGUKKyovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF0cmFtX3NldHJ3KHN0cnVjdCBwbGF0cmFtX2luZm8gKmluZm8sIGludCB0bykKK3sKKwlpZiAoaW5mby0+cGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGluZm8tPnBkYXRhLT5zZXRfcncgIT0gTlVMTCkKKwkJKGluZm8tPnBkYXRhLT5zZXRfcncpKGluZm8tPmRldiwgdG8pOworfQorCisvKiBwbGF0cmFtX3JlbW92ZQorICoKKyAqIGNhbGxlZCB0byByZW1vdmUgdGhlIGRldmljZSBmcm9tIHRoZSBkcml2ZXIncyBjb250cm9sCisqLworCitzdGF0aWMgaW50IHBsYXRyYW1fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdHJhbV9pbmZvICppbmZvID0gdG9fcGxhdHJhbV9pbmZvKGRldik7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCWRldl9kYmcoZGV2LCAicmVtb3ZpbmcgZGV2aWNlXG4iKTsKKworCWlmIChpbmZvID09IE5VTEwpIAorCQlyZXR1cm4gMDsKKworCWlmIChpbmZvLT5tdGQpIHsKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwkJaWYgKGluZm8tPnBhcnRpdGlvbnMpIHsKKwkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQpOworCQkJa2ZyZWUoaW5mby0+cGFydGl0aW9ucyk7CisJCX0KKyNlbmRpZgorCQlkZWxfbXRkX2RldmljZShpbmZvLT5tdGQpOworCQltYXBfZGVzdHJveShpbmZvLT5tdGQpOworCX0KKworCS8qIGVuc3VyZSByYW0gaXMgbGVmdCByZWFkLW9ubHkgKi8KKworCXBsYXRyYW1fc2V0cncoaW5mbywgUExBVFJBTV9STyk7CisKKwkvKiByZWxlYXNlIHJlc291cmNlcyAqLworCisJaWYgKGluZm8tPmFyZWEpIHsKKwkJcmVsZWFzZV9yZXNvdXJjZShpbmZvLT5hcmVhKTsKKwkJa2ZyZWUoaW5mby0+YXJlYSk7CisJfQorCisJaWYgKGluZm8tPm1hcC52aXJ0ICE9IE5VTEwpCisJCWlvdW5tYXAoaW5mby0+bWFwLnZpcnQpOworCQorCWtmcmVlKGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHBsYXRyYW1fcHJvYmUKKyAqCisgKiBjYWxsZWQgZnJvbSBkZXZpY2UgZHJpdmUgc3lzdGVtIHdoZW4gYSBkZXZpY2UgbWF0Y2hpbmcgb3VyCisgKiBkcml2ZXIgaXMgZm91bmQuCisqLworCitzdGF0aWMgaW50IHBsYXRyYW1fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHBsYXRkYXRhX210ZF9yYW0JKnBkYXRhOworCXN0cnVjdCBwbGF0cmFtX2luZm8gKmluZm87CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVyciA9IDA7CisKKwlkZXZfZGJnKGRldiwgInByb2JlIGVudGVyZWRcbiIpOworCQorCWlmIChkZXYtPnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGV4aXRfZXJyb3I7CisJfQorCisJcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IGZvciBmbGFzaCBpbmZvXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X2Vycm9yOworCX0KKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKKworCWluZm8tPmRldiA9IGRldjsKKwlpbmZvLT5wZGF0YSA9IHBkYXRhOworCisJLyogZ2V0IHRoZSByZXNvdXJjZSBmb3IgdGhlIG1lbW9yeSBtYXBwaW5nICovCisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGQsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm5vIG1lbW9yeSByZXNvdXJjZSBzcGVjaWZpZWRcbiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwlkZXZfZGJnKGRldiwgImdvdCBwbGF0Zm9ybSByZXNvdXJjZSAlcCAoMHglbHgpXG4iLCByZXMsIHJlcy0+c3RhcnQpOworCisJLyogc2V0dXAgbWFwIHBhcmFtZXRlcnMgKi8KKworCWluZm8tPm1hcC5waHlzID0gcmVzLT5zdGFydDsKKwlpbmZvLT5tYXAuc2l6ZSA9IChyZXMtPmVuZCAtIHJlcy0+c3RhcnQpICsgMTsKKwlpbmZvLT5tYXAubmFtZSA9IHBkYXRhLT5tYXBuYW1lICE9IE5VTEwgPyBwZGF0YS0+bWFwbmFtZSA6IHBkLT5uYW1lOworCWluZm8tPm1hcC5iYW5rd2lkdGggPSBwZGF0YS0+YmFua3dpZHRoOworCisJLyogcmVnaXN0ZXIgb3VyIHVzYWdlIG9mIHRoZSBtZW1vcnkgYXJlYSAqLworCisJaW5mby0+YXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBpbmZvLT5tYXAuc2l6ZSwgcGQtPm5hbWUpOworCWlmIChpbmZvLT5hcmVhID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJLyogcmVtYXAgdGhlIG1lbW9yeSBhcmVhICovCisKKwlpbmZvLT5tYXAudmlydCA9IGlvcmVtYXAocmVzLT5zdGFydCwgaW5mby0+bWFwLnNpemUpOworCWRldl9kYmcoZGV2LCAidmlydCAlcCwgJWx1IGJ5dGVzXG4iLCBpbmZvLT5tYXAudmlydCwgaW5mby0+bWFwLnNpemUpOworCisJaWYgKGluZm8tPm1hcC52aXJ0ID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW9yZW1hcCgpIHJlZ2lvblxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCXNpbXBsZV9tYXBfaW5pdCgmaW5mby0+bWFwKTsKKworCWRldl9kYmcoZGV2LCAiaW5pdGlhbGlzZWQgbWFwLCBwcm9iaW5nIGZvciBtdGRcbiIpOworCisJLyogcHJvYmUgZm9yIHRoZSByaWdodCBtdGQgbWFwIGRyaXZlciAqLworCisJaW5mby0+bXRkID0gZG9fbWFwX3Byb2JlKCJtYXBfcmFtIiAsICZpbmZvLT5tYXApOworCWlmIChpbmZvLT5tdGQgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBwcm9iZSBmb3IgbWFwX3JhbVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCWluZm8tPm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXBsYXRyYW1fc2V0cncoaW5mbywgUExBVFJBTV9SVyk7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBhdmFpbGFibGUgcGFydGl0aW9ucywgb3Igd2V0aGVyCisJICogdG8gYWRkIHRoaXMgZGV2aWNlIHdob2xlICovCisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwlpZiAocGRhdGEtPm5yX3BhcnRpdGlvbnMgPiAwKSB7CisJCWNvbnN0IGNoYXIgKipwcm9iZXMgPSB7IE5VTEwgfTsKKworCQlpZiAocGRhdGEtPnByb2JlcykKKwkJCXByb2JlcyA9IChjb25zdCBjaGFyICoqKXBkYXRhLT5wcm9iZXM7CisKKwkJZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwcm9iZXMsCisJCQkJCSAgICZpbmZvLT5wYXJ0aXRpb25zLCAwKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIGluZm8tPnBhcnRpdGlvbnMsCisJCQkJCQkgZXJyKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfTVREX1BBUlRJVElPTlMgKi8KKworCWlmIChhZGRfbXRkX2RldmljZShpbmZvLT5tdGQpKSB7CisJCWRldl9lcnIoZGV2LCAiYWRkX210ZF9kZXZpY2UoKSBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCX0KKwkKKwlkZXZfaW5mbyhkZXYsICJyZWdpc3RlcmVkIG10ZCBkZXZpY2VcbiIpOworCXJldHVybiBlcnI7CisKKyBleGl0X2ZyZWU6CisJcGxhdHJhbV9yZW1vdmUoZGV2KTsKKyBleGl0X2Vycm9yOgorCXJldHVybiBlcnI7Cit9CisKKy8qIGRldmljZSBkcml2ZXIgaW5mbyAqLworCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgcGxhdHJhbV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIm10ZC1yYW0iLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBwbGF0cmFtX3Byb2JlLAorCS5yZW1vdmUJCT0gcGxhdHJhbV9yZW1vdmUsCit9OworCisvKiBtb2R1bGUgaW5pdC9leGl0ICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBsYXRyYW1faW5pdCh2b2lkKQoreworCXByaW50aygiR2VuZXJpYyBwbGF0Zm9ybSBSQU0gTVRELCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3NcbiIpOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnBsYXRyYW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBsYXRyYW1fZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZwbGF0cmFtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBsYXRyYW1faW5pdCk7Cittb2R1bGVfZXhpdChwbGF0cmFtX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBwbGF0Zm9ybSBSQU0gbWFwIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9zY2IyX2ZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYwppbmRleCA1YmIzYjYwLi45N2E4ZGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBNVEQgbWFwIGRyaXZlciBmb3IgQklPUyBGbGFzaCBvbiBJbnRlbCBTQ0IyIGJvYXJkcwotICogJElkOiBzY2IyX2ZsYXNoLmMsdiAxLjExIDIwMDQvMTEvMjggMDk6NDA6NDAgZHdtdzIgRXhwICQKKyAqICRJZDogc2NiMl9mbGFzaC5jLHYgMS4xMiAyMDA1LzAzLzE4IDE0OjA0OjM1IGdsZWl4bmVyIEV4cCAkCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogVGltIEhvY2tpbiA8dGhvY2tpbkBzdW4uY29tPgogICoKQEAgLTIzOCw3ICsyMzgsNyBAQAogc3RhdGljIGludCBfX2luaXQKIHNjYjJfZmxhc2hfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNjYjJfZmxhc2hfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2NiMl9mbGFzaF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKaW5kZXggYjNiMzljYi4uZDE1ZGE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTGluZW8gSmFwYW4sIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwMiAgU0hBUlAKICAqCi0gKiAkSWQ6IHNoYXJwc2wtZmxhc2guYyx2IDEuMiAyMDA0LzExLzI0IDIwOjM4OjA2IHJwdXJkaWUgRXhwICQKKyAqICRJZDogc2hhcnBzbC1mbGFzaC5jLHYgMS41IDIwMDUvMDMvMjEgMDg6NDI6MTEgcnB1cmRpZSBFeHAgJAogICoKICAqIGJhc2VkIG9uIHJweGxpdGUuYyx2IDEuMTUgMjAwMS8xMC8wMiAxNTowNToxNCBkd213MiBFeHAKICAqICAgICAgICAgIEhhbmRsZSBtYXBwaW5nIG9mIHRoZSBmbGFzaCBvbiB0aGUgUlBYIExpdGUgYW5kIENMTEYgYm9hcmRzCkBAIC0yNCwxMyArMjQsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjZGVmaW5lIFdJTkRPV19BRERSIDB4MDAwMDAwMDAKLSNkZWZpbmUgV0lORE9XX1NJWkUgMHgwMTAwMDAwMAorI2RlZmluZSBXSU5ET1dfU0laRSAweDAwODAwMDAwCiAjZGVmaW5lIEJBTktfV0lEVEggMgogCiBzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKQEAgLTQ0LDkgKzQ1LDcgQEAKIAogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHNoYXJwc2xfcGFydGl0aW9uc1sxXSA9IHsKIAl7Ci0JCW5hbWU6CQkiRmlsZXN5c3RlbSIsCi0JCXNpemU6CQkweDAwNmQwMDAwLAotCQlvZmZzZXQ6CQkweDAwMTIwMDAwCisJCW5hbWU6CQkiQm9vdCBQUk9NIEZpbGVzeXN0ZW0iLAogCX0KIH07CiAKQEAgLTU4LDEyICs1NywxNiBAQAogCWludCBuYl9wYXJ0cyA9IDA7CiAJY2hhciAqcGFydF90eXBlID0gInN0YXRpYyI7CiAKLQlwcmludGsoS0VSTl9OT1RJQ0UgIlNoYXJwIFNMIHNlcmllcyBmbGFzaCBkZXZpY2U6ICV4IGF0ICV4XG4iLCBXSU5ET1dfU0laRSwgV0lORE9XX0FERFIpOworCXByaW50ayhLRVJOX05PVElDRSAiU2hhcnAgU0wgc2VyaWVzIGZsYXNoIGRldmljZTogJXggYXQgJXhcbiIsIAorCQlXSU5ET1dfU0laRSwgV0lORE9XX0FERFIpOwogCXNoYXJwc2xfbWFwLnZpcnQgPSBpb3JlbWFwKFdJTkRPV19BRERSLCBXSU5ET1dfU0laRSk7CiAJaWYgKCFzaGFycHNsX21hcC52aXJ0KSB7CiAJCXByaW50aygiRmFpbGVkIHRvIGlvcmVtYXBcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CisKKwlzaW1wbGVfbWFwX2luaXQoJnNoYXJwc2xfbWFwKTsKKwogCW15bXRkID0gZG9fbWFwX3Byb2JlKCJtYXBfcm9tIiwgJnNoYXJwc2xfbWFwKTsKIAlpZiAoIW15bXRkKSB7CiAJCWlvdW5tYXAoc2hhcnBzbF9tYXAudmlydCk7CkBAIC03Miw2ICs3NSwyMiBAQAogCiAJbXltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKKwlpZiAobWFjaGluZV9pc19jb3JnaSgpIHx8IG1hY2hpbmVfaXNfc2hlcGhlcmQoKSB8fCBtYWNoaW5lX2lzX2h1c2t5KCkgCisJCXx8IG1hY2hpbmVfaXNfcG9vZGxlKCkpIHsKKwkJc2hhcnBzbF9wYXJ0aXRpb25zWzBdLnNpemU9MHgwMDZkMDAwMDsKKwkJc2hhcnBzbF9wYXJ0aXRpb25zWzBdLm9mZnNldD0weDAwMTIwMDAwOworCX0gZWxzZSBpZiAobWFjaGluZV9pc190b3NhKCkpIHsKKwkJc2hhcnBzbF9wYXJ0aXRpb25zWzBdLnNpemU9MHgwMDZhMDAwMDsKKwkJc2hhcnBzbF9wYXJ0aXRpb25zWzBdLm9mZnNldD0weDAwMTYwMDAwOworCX0gZWxzZSBpZiAobWFjaGluZV9pc19zcGl0eigpKSB7CisJCXNoYXJwc2xfcGFydGl0aW9uc1swXS5zaXplPTB4MDA2YjAwMDA7CisJCXNoYXJwc2xfcGFydGl0aW9uc1swXS5vZmZzZXQ9MHgwMDE0MDAwMDsKKwl9IGVsc2UgeworCQltYXBfZGVzdHJveShteW10ZCk7CisJCWlvdW5tYXAoc2hhcnBzbF9tYXAudmlydCk7CQorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCiAJcGFydHMgPSBzaGFycHNsX3BhcnRpdGlvbnM7CiAJbmJfcGFydHMgPSBOQl9PRihzaGFycHNsX3BhcnRpdGlvbnMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMKaW5kZXggNTEwYWQ3OC4uMWVkNjAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY2hhci5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IG10ZGNoYXIuYyx2IDEuNjYgMjAwNS8wMS8wNSAxODowNToxMSBkd213MiBFeHAgJAorICogJElkOiBtdGRjaGFyLmMsdiAxLjczIDIwMDUvMDcvMDQgMTc6MzY6NDEgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBDaGFyYWN0ZXItZGV2aWNlIGFjY2VzcyB0byByYXcgTVREIGRldmljZXMuCiAgKgpAQCAtMTUsMjcgKzE1LDMwIEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaWZkZWYgQ09ORklHX0RFVkZTX0ZTCi0jaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKm10ZF9jbGFzczsKIAogc3RhdGljIHZvaWQgbXRkX25vdGlmeV9hZGQoc3RydWN0IG10ZF9pbmZvKiBtdGQpCiB7CiAJaWYgKCFtdGQpCiAJCXJldHVybjsKIAotCWRldmZzX21rX2NkZXYoTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMiksCi0JCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywgIm10ZC8lZCIsIG10ZC0+aW5kZXgpOwotCQkKLQlkZXZmc19ta19jZGV2KE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIrMSksCi0JCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPLCAibXRkLyVkcm8iLCBtdGQtPmluZGV4KTsKKwljbGFzc19kZXZpY2VfY3JlYXRlKG10ZF9jbGFzcywgTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMiksCisJCQkgICAgTlVMTCwgIm10ZCVkIiwgbXRkLT5pbmRleCk7CisJCisJY2xhc3NfZGV2aWNlX2NyZWF0ZShtdGRfY2xhc3MsIAorCQkJICAgIE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIrMSksCisJCQkgICAgTlVMTCwgIm10ZCVkcm8iLCBtdGQtPmluZGV4KTsKIH0KIAogc3RhdGljIHZvaWQgbXRkX25vdGlmeV9yZW1vdmUoc3RydWN0IG10ZF9pbmZvKiBtdGQpCiB7CiAJaWYgKCFtdGQpCiAJCXJldHVybjsKLQlkZXZmc19yZW1vdmUoIm10ZC8lZCIsIG10ZC0+aW5kZXgpOwotCWRldmZzX3JlbW92ZSgibXRkLyVkcm8iLCBtdGQtPmluZGV4KTsKKworCWNsYXNzX2RldmljZV9kZXN0cm95KG10ZF9jbGFzcywgTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMikpOworCWNsYXNzX2RldmljZV9kZXN0cm95KG10ZF9jbGFzcywgTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMisxKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXRkX25vdGlmaWVyIG5vdGlmaWVyID0gewpAQCAtNDMsMjUgKzQ2LDI1IEBACiAJLnJlbW92ZQk9IG10ZF9ub3RpZnlfcmVtb3ZlLAogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIG10ZGNoYXJfZGV2ZnNfaW5pdCh2b2lkKQotewotCWRldmZzX21rX2RpcigibXRkIik7Ci0JcmVnaXN0ZXJfbXRkX3VzZXIoJm5vdGlmaWVyKTsKLX0KKy8qCisgKiBXZSB1c2UgZmlsZS0+cHJpdmF0ZV9kYXRhIHRvIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgTVREZGV2aWNlLgorICogU2luY2UgYWxpZ2htZW50IGlzIGF0IGxlYXN0IDMyIGJpdHMsIHdlIGhhdmUgMiBiaXRzIGZyZWUgZm9yIE9UUAorICogbW9kZXMgYXMgd2VsbC4KKyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbXRkY2hhcl9kZXZmc19leGl0KHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9tdGRfdXNlcigmbm90aWZpZXIpOwotCWRldmZzX3JlbW92ZSgibXRkIik7Ci19Ci0jZWxzZSAvKiAhREVWRlMgKi8KLSNkZWZpbmUgbXRkY2hhcl9kZXZmc19pbml0KCkgZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIG10ZGNoYXJfZGV2ZnNfZXhpdCgpIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCisjZGVmaW5lIFRPX01URChmaWxlKSAoc3RydWN0IG10ZF9pbmZvICopKChsb25nKSgoZmlsZSktPnByaXZhdGVfZGF0YSkgJiB+M0wpCisKKyNkZWZpbmUgTVREX01PREVfT1RQX0ZBQ1QJMQorI2RlZmluZSBNVERfTU9ERV9PVFBfVVNFUgkyCisjZGVmaW5lIE1URF9NT0RFKGZpbGUpCQkoKGxvbmcpKChmaWxlKS0+cHJpdmF0ZV9kYXRhKSAmIDMpCisKKyNkZWZpbmUgU0VUX01URF9NT0RFKGZpbGUsIG1vZGUpIFwKKwlkbyB7IGxvbmcgX19wID0gKGxvbmcpKChmaWxlKS0+cHJpdmF0ZV9kYXRhKTsgXAorCSAgICAgKGZpbGUpLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSgoX19wICYgfjNMKSB8IG1vZGUpOyB9IHdoaWxlICgwKQogCiBzdGF0aWMgbG9mZl90IG10ZF9sc2VlayAoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQogewotCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gVE9fTVREKGZpbGUpOwogCiAJc3dpdGNoIChvcmlnKSB7CiAJY2FzZSAwOgpAQCAtMTM0LDcgKzEzNyw3IEBACiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiTVREX2Nsb3NlXG4iKTsKIAotCW10ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwltdGQgPSBUT19NVEQoZmlsZSk7CiAJCiAJaWYgKG10ZC0+c3luYykKIAkJbXRkLT5zeW5jKG10ZCk7CkBAIC0xNTEsNyArMTU0LDcgQEAKIAogc3RhdGljIHNzaXplX3QgbXRkX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSBUT19NVEQoZmlsZSk7CiAJc2l6ZV90IHJldGxlbj0wOwogCXNpemVfdCB0b3RhbF9yZXRsZW49MDsKIAlpbnQgcmV0PTA7CkBAIC0xNzgsNyArMTgxLDE2IEBACiAJCWlmICgha2J1ZikKIAkJCXJldHVybiAtRU5PTUVNOwogCQkKLQkJcmV0ID0gTVREX1JFQUQobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJc3dpdGNoIChNVERfTU9ERShmaWxlKSkgeworCQljYXNlIE1URF9NT0RFX09UUF9GQUNUOgorCQkJcmV0ID0gbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIE1URF9NT0RFX09UUF9VU0VSOgorCQkJcmV0ID0gbXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gTVREX1JFQUQobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJfQogCQkvKiBOYW5kIHJldHVybnMgLUVCQURNU0cgb24gZWNjIGVycm9ycywgYnV0IGl0IHJldHVybnMKIAkJICogdGhlIGRhdGEuIEZvciBvdXIgdXNlcnNwYWNlIHRvb2xzIGl0IGlzIGltcG9ydGFudAogCQkgKiB0byBkdW1wIGFyZWFzIHdpdGggZWNjIGVycm9ycyAhIApAQCAtMTk2LDYgKzIwOCw4IEBACiAKIAkJCWNvdW50IC09IHJldGxlbjsKIAkJCWJ1ZiArPSByZXRsZW47CisJCQlpZiAocmV0bGVuID09IDApCisJCQkJY291bnQgPSAwOwogCQl9CiAJCWVsc2UgewogCQkJa2ZyZWUoa2J1Zik7CkBAIC0yMTAsNyArMjI0LDcgQEAKIAogc3RhdGljIHNzaXplX3QgbXRkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gVE9fTVREKGZpbGUpOwogCWNoYXIgKmtidWY7CiAJc2l6ZV90IHJldGxlbjsKIAlzaXplX3QgdG90YWxfcmV0bGVuPTA7CkBAIC0yNDUsNyArMjU5LDIwIEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQkKLQkgICAgICAgIHJldCA9ICgqKG10ZC0+d3JpdGUpKShtdGQsICpwcG9zLCBsZW4sICZyZXRsZW4sIGtidWYpOworCQlzd2l0Y2ggKE1URF9NT0RFKGZpbGUpKSB7CisJCWNhc2UgTVREX01PREVfT1RQX0ZBQ1Q6CisJCQlyZXQgPSAtRVJPRlM7CisJCQlicmVhazsKKwkJY2FzZSBNVERfTU9ERV9PVFBfVVNFUjoKKwkJCWlmICghbXRkLT53cml0ZV91c2VyX3Byb3RfcmVnKSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBtdGQtPndyaXRlX3VzZXJfcHJvdF9yZWcobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gKCoobXRkLT53cml0ZSkpKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CisJCX0KIAkJaWYgKCFyZXQpIHsKIAkJCSpwcG9zICs9IHJldGxlbjsKIAkJCXRvdGFsX3JldGxlbiArPSByZXRsZW47CkBAIC0yNzYsNyArMzAzLDcgQEAKIHN0YXRpYyBpbnQgbXRkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgIHVfaW50IGNtZCwgdV9sb25nIGFyZykKIHsKLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IFRPX01URChmaWxlKTsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgcmV0ID0gMDsKIAl1X2xvbmcgc2l6ZTsKQEAgLTUxOCw2ICs1NDUsODAgQEAKIAkJYnJlYWs7CiAJfQogCisjaWZkZWYgQ09ORklHX01URF9PVFAKKwljYXNlIE9UUFNFTEVDVDoKKwl7CisJCWludCBtb2RlOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm1vZGUsIGFyZ3AsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlTRVRfTVREX01PREUoZmlsZSwgMCk7CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIE1URF9PVFBfRkFDVE9SWToKKwkJCWlmICghbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcpCisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQllbHNlCisJCQkJU0VUX01URF9NT0RFKGZpbGUsIE1URF9NT0RFX09UUF9GQUNUKTsKKwkJCWJyZWFrOworCQljYXNlIE1URF9PVFBfVVNFUjoKKwkJCWlmICghbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcpCisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQllbHNlCisJCQkJU0VUX01URF9NT0RFKGZpbGUsIE1URF9NT0RFX09UUF9VU0VSKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJY2FzZSBNVERfT1RQX09GRjoKKwkJCWJyZWFrOworCQl9CisJCWZpbGUtPmZfcG9zID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBPVFBHRVRSRUdJT05DT1VOVDoKKwljYXNlIE9UUEdFVFJFR0lPTklORk86CisJeworCQlzdHJ1Y3Qgb3RwX2luZm8gKmJ1ZiA9IGttYWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlzd2l0Y2ggKE1URF9NT0RFKGZpbGUpKSB7CisJCWNhc2UgTVREX01PREVfT1RQX0ZBQ1Q6CisJCQlpZiAobXRkLT5nZXRfZmFjdF9wcm90X2luZm8pCisJCQkJcmV0ID0gbXRkLT5nZXRfZmFjdF9wcm90X2luZm8obXRkLCBidWYsIDQwOTYpOworCQkJYnJlYWs7CisJCWNhc2UgTVREX01PREVfT1RQX1VTRVI6CisJCQlpZiAobXRkLT5nZXRfdXNlcl9wcm90X2luZm8pCisJCQkJcmV0ID0gbXRkLT5nZXRfdXNlcl9wcm90X2luZm8obXRkLCBidWYsIDQwOTYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCA+PSAwKSB7CisJCQlpZiAoY21kID09IE9UUEdFVFJFR0lPTkNPVU5UKSB7CisJCQkJaW50IG5iciA9IHJldCAvIHNpemVvZihzdHJ1Y3Qgb3RwX2luZm8pOworCQkJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmbmJyLCBzaXplb2YoaW50KSk7CisJCQl9IGVsc2UKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgYnVmLCByZXQpOworCQkJaWYgKHJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJCWtmcmVlKGJ1Zik7CisJCWJyZWFrOworCX0KKworCWNhc2UgT1RQTE9DSzoKKwl7CisJCXN0cnVjdCBvdHBfaW5mbyBpbmZvOworCisJCWlmIChNVERfTU9ERShmaWxlKSAhPSBNVERfTU9ERV9PVFBfVVNFUikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZ3AsIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKCFtdGQtPmxvY2tfdXNlcl9wcm90X3JlZykKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJcmV0ID0gbXRkLT5sb2NrX3VzZXJfcHJvdF9yZWcobXRkLCBpbmZvLnN0YXJ0LCBpbmZvLmxlbmd0aCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1RUWTsKIAl9CkBAIC01NDMsMTMgKzY0NCwyMiBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKLQltdGRjaGFyX2RldmZzX2luaXQoKTsKKwltdGRfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJtdGQiKTsKKworCWlmIChJU19FUlIobXRkX2NsYXNzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGNyZWF0aW5nIG10ZCBjbGFzcy5cbiIpOworCQl1bnJlZ2lzdGVyX2NocmRldihNVERfQ0hBUl9NQUpPUiwgIm10ZCIpOworCQlyZXR1cm4gUFRSX0VSUihtdGRfY2xhc3MpOworCX0KKworCXJlZ2lzdGVyX210ZF91c2VyKCZub3RpZmllcik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX210ZGNoYXIodm9pZCkKIHsKLQltdGRjaGFyX2RldmZzX2V4aXQoKTsKKwl1bnJlZ2lzdGVyX210ZF91c2VyKCZub3RpZmllcik7CisJY2xhc3NfZGVzdHJveShtdGRfY2xhc3MpOwogCXVucmVnaXN0ZXJfY2hyZGV2KE1URF9DSEFSX01BSk9SLCAibXRkIik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNvcmUuYyBiL2RyaXZlcnMvbXRkL210ZGNvcmUuYwppbmRleCA5YzAzMTVkLi5kYzg2ZGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjb3JlLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogbXRkY29yZS5jLHYgMS40NCAyMDA0LzExLzE2IDE4OjI4OjU5IGR3bXcyIEV4cCAkCisgKiAkSWQ6IG10ZGNvcmUuYyx2IDEuNDUgMjAwNS8wMi8xOCAxNDozNDo1MCBkZWRla2luZCBFeHAgJAogICoKICAqIENvcmUgcmVnaXN0cmF0aW9uIGFuZCBjYWxsYmFjayByb3V0aW5lcyBmb3IgTVRECiAgKiBkcml2ZXJzIGFuZCB1c2Vycy4KQEAgLTE0OSw4ICsxNDksOCBAQAogfQogCiAvKioKLSAqCXJlZ2lzdGVyX210ZF91c2VyIC0gdW5yZWdpc3RlciBhICd1c2VyJyBvZiBNVEQgZGV2aWNlcy4KLSAqCUBuZXc6IHBvaW50ZXIgdG8gbm90aWZpZXIgaW5mbyBzdHJ1Y3R1cmUKKyAqCXVucmVnaXN0ZXJfbXRkX3VzZXIgLSB1bnJlZ2lzdGVyIGEgJ3VzZXInIG9mIE1URCBkZXZpY2VzLgorICoJQG9sZDogcG9pbnRlciB0byBub3RpZmllciBpbmZvIHN0cnVjdHVyZQogICoKICAqCVJlbW92ZXMgYSBjYWxsYmFjayBmdW5jdGlvbiBwYWlyIGZyb20gdGhlIGxpc3Qgb2YgJ3VzZXJzJyB0byBiZQogICoJbm90aWZpZWQgdXBvbiBhZGRpdGlvbiBvciByZW1vdmFsIG9mIE1URCBkZXZpY2VzLiBDYXVzZXMgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRwYXJ0LmMgYi9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKaW5kZXggOTZlYmI1Mi4uYjkyZTZiZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZHBhcnQuYworKysgYi9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKQEAgLTUsNyArNSw3IEBACiAgKgogICogVGhpcyBjb2RlIGlzIEdQTAogICoKLSAqICRJZDogbXRkcGFydC5jLHYgMS41MSAyMDA0LzExLzE2IDE4OjI4OjU5IGR3bXcyIEV4cCAkCisgKiAkSWQ6IG10ZHBhcnQuYyx2IDEuNTMgMjAwNS8wMi8wOCAxNzoxMToxMyBuaWNvIEV4cCAkCiAgKgogICogCTAyLTIxLTIwMDIJVGhvbWFzIEdsZWl4bmVyIDxnbGVpeG5lckBhdXRyb25peC5kZT4KICAqCQkJYWRkZWQgc3VwcG9ydCBmb3IgcmVhZF9vb2IsIHdyaXRlX29vYgpAQCAtMTE2LDYgKzExNiwxMyBAQAogCQkJCQlsZW4sIHJldGxlbiwgYnVmKTsKIH0KIAorc3RhdGljIGludCBwYXJ0X2dldF91c2VyX3Byb3RfaW5mbyAoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJICAgIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBtdGRfcGFydCAqcGFydCA9IFBBUlQobXRkKTsKKwlyZXR1cm4gcGFydC0+bWFzdGVyLT5nZXRfdXNlcl9wcm90X2luZm8gKHBhcnQtPm1hc3RlciwgYnVmLCBsZW4pOworfQorCiBzdGF0aWMgaW50IHBhcnRfcmVhZF9mYWN0X3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIAogCQkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQogewpAQCAtMTI0LDYgKzEzMSwxMyBAQAogCQkJCQlsZW4sIHJldGxlbiwgYnVmKTsKIH0KIAorc3RhdGljIGludCBwYXJ0X2dldF9mYWN0X3Byb3RfaW5mbyAoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJICAgIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBtdGRfcGFydCAqcGFydCA9IFBBUlQobXRkKTsKKwlyZXR1cm4gcGFydC0+bWFzdGVyLT5nZXRfZmFjdF9wcm90X2luZm8gKHBhcnQtPm1hc3RlciwgYnVmLCBsZW4pOworfQorCiBzdGF0aWMgaW50IHBhcnRfd3JpdGUgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCiAJCQlzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpCiB7CkBAIC0xODIsNiArMTk2LDEyIEBACiAJCQkJCWxlbiwgcmV0bGVuLCBidWYpOwogfQogCitzdGF0aWMgaW50IHBhcnRfbG9ja191c2VyX3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pIAoreworCXN0cnVjdCBtdGRfcGFydCAqcGFydCA9IFBBUlQobXRkKTsKKwlyZXR1cm4gcGFydC0+bWFzdGVyLT5sb2NrX3VzZXJfcHJvdF9yZWcgKHBhcnQtPm1hc3RlciwgZnJvbSwgbGVuKTsKK30KKwogc3RhdGljIGludCBwYXJ0X3dyaXRldiAoc3RydWN0IG10ZF9pbmZvICptdGQsICBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKIAkJCSB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuKQogewpAQCAtNDA5LDYgKzQyOSwxMiBAQAogCQkJc2xhdmUtPm10ZC5yZWFkX2ZhY3RfcHJvdF9yZWcgPSBwYXJ0X3JlYWRfZmFjdF9wcm90X3JlZzsKIAkJaWYobWFzdGVyLT53cml0ZV91c2VyX3Byb3RfcmVnKQogCQkJc2xhdmUtPm10ZC53cml0ZV91c2VyX3Byb3RfcmVnID0gcGFydF93cml0ZV91c2VyX3Byb3RfcmVnOworCQlpZihtYXN0ZXItPmxvY2tfdXNlcl9wcm90X3JlZykKKwkJCXNsYXZlLT5tdGQubG9ja191c2VyX3Byb3RfcmVnID0gcGFydF9sb2NrX3VzZXJfcHJvdF9yZWc7CisJCWlmKG1hc3Rlci0+Z2V0X3VzZXJfcHJvdF9pbmZvKQorCQkJc2xhdmUtPm10ZC5nZXRfdXNlcl9wcm90X2luZm8gPSBwYXJ0X2dldF91c2VyX3Byb3RfaW5mbzsKKwkJaWYobWFzdGVyLT5nZXRfZmFjdF9wcm90X2luZm8pCisJCQlzbGF2ZS0+bXRkLmdldF9mYWN0X3Byb3RfaW5mbyA9IHBhcnRfZ2V0X2ZhY3RfcHJvdF9pbmZvOwogCQlpZiAobWFzdGVyLT5zeW5jKQogCQkJc2xhdmUtPm10ZC5zeW5jID0gcGFydF9zeW5jOwogCQlpZiAoIWkgJiYgbWFzdGVyLT5zdXNwZW5kICYmIG1hc3Rlci0+cmVzdW1lKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKaW5kZXggZjc4MDFlYi4uMzZkMzRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKICMgZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCi0jICRJZDogS2NvbmZpZyx2IDEuMjYgMjAwNS8wMS8wNSAxMjo0MjoyNCBkd213MiBFeHAgJAorIyAkSWQ6IEtjb25maWcsdiAxLjMxIDIwMDUvMDYvMjAgMTI6MDM6MjEgYmpkIEV4cCAkCiAKIG1lbnUgIk5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMiCiAJZGVwZW5kcyBvbiBNVEQhPW4KQEAgLTU4LDIwICs1OCw2IEBACiBjb25maWcgTVREX05BTkRfSURTCiAJdHJpc3RhdGUKIAotY29uZmlnIE1URF9OQU5EX1RYNDkyNU5ERk1DCi0JdHJpc3RhdGUgIlNtYXJ0TWVkaWEgQ2FyZCBvbiBUb3NoaWJhIFJCVFg0OTI1IHJlZmVyZW5jZSBib2FyZCIKLQlkZXBlbmRzIG9uIFRPU0hJQkFfUkJUWDQ5MjUgJiYgTVREX05BTkQgJiYgVE9TSElCQV9SQlRYNDkyNV9NUExFWF9OQU5ECi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKLQkgIFRvc2hpYmEgUkJUWDQ5MjUgcmVmZXJlbmNlIGJvYXJkLCB3aGljaCBpcyBhIFNtYXJ0TWVkaWFDYXJkLgotCi1jb25maWcgTVREX05BTkRfVFg0OTM4TkRGTUMKLQl0cmlzdGF0ZSAiTkFORCBGbGFzaCBkZXZpY2Ugb24gVG9zaGliYSBSQlRYNDkzOCByZWZlcmVuY2UgYm9hcmQiCi0JZGVwZW5kcyBvbiBUT1NISUJBX1JCVFg0OTM4ICYmIE1URF9OQU5EICYmIFRPU0hJQkFfUkJUWDQ5MzhfTVBMRVhfTkFORCAKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggZGV2aWNlIGZvdW5kIG9uIHRoZQotCSAgVG9zaGliYSBSQlRYNDkzOCByZWZlcmVuY2UgYm9hcmQuCi0KIGNvbmZpZyBNVERfTkFORF9BVTE1NTAKIAl0cmlzdGF0ZSAiQXUxNTUwIE5BTkQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNPQ19BVTE1NTAgJiYgTVREX05BTkQKQEAgLTk1LDEwICs4MSwxMSBAQAogCSAgVGhpcyBlbmFibGVzIHRoZSBOQU5EIGZsYXNoIGRyaXZlciBvbiB0aGUgUFBDaGFtZWxlb24gRVZCIEJvYXJkLgogCiBjb25maWcgTVREX05BTkRfUzNDMjQxMAotCXRyaXN0YXRlICJOQU5EIEZsYXNoIHN1cHBvcnQgZm9yIFMzQzI0MTAgU29DIgorCXRyaXN0YXRlICJOQU5EIEZsYXNoIHN1cHBvcnQgZm9yIFMzQzI0MTAvUzNDMjQ0MCBTb0MiCiAJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAgJiYgTVREX05BTkQKIAloZWxwCi0JICBUaGlzIGVuYWJsZXMgdGhlIE5BTkQgZmxhc2ggY29udHJvbGxlciBvbiB0aGUgUzNDMjQxMC4KKwkgIFRoaXMgZW5hYmxlcyB0aGUgTkFORCBmbGFzaCBjb250cm9sbGVyIG9uIHRoZSBTM0MyNDEwIGFuZCBTM0MyNDQwCisJICBTb0NzCiAKIAkgIE5vIGJvYXJkIHNwZWNmaWMgc3VwcG9ydCBpcyBkb25lIGJ5IHRoaXMgZHJpdmVyLCBlYWNoIGJvYXJkCiAJICBtdXN0IGFkdmVydGlzZSBhIHBsYXRmb3JtX2RldmljZSBmb3IgdGhlIGRyaXZlciB0byBhdHRhY2guIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKaW5kZXggZDlkYzhjYy4uNDE3NDIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCkBAIC0xMCw4ICsxMCw2IEBACiBvYmotJChDT05GSUdfTVREX05BTkRfVE9UTykJCSs9IHRvdG8ubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0FVVENQVTEyKQkJKz0gYXV0Y3B1MTIubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0VEQjczMTIpCQkrPSBlZGI3MzEyLm8KLW9iai0kKENPTkZJR19NVERfTkFORF9UWDQ5MjVOREZNQykJKz0gdHg0OTI1bmRmbWMubwotb2JqLSQoQ09ORklHX01URF9OQU5EX1RYNDkzOE5ERk1DKQkrPSB0eDQ5MzhuZGZtYy5vCiBvYmotJChDT05GSUdfTVREX05BTkRfQVUxNTUwKQkJKz0gYXUxNTUwbmQubwogb2JqLSQoQ09ORklHX01URF9OQU5EX1BQQ0hBTUVMRU9ORVZCKQkrPSBwcGNoYW1lbGVvbmV2Yi5vCiBvYmotJChDT05GSUdfTVREX05BTkRfUzNDMjQxMCkJCSs9IHMzYzI0MTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9kaXNrb25jaGlwLmMgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwppbmRleCAwMjEzNWMzLi5mZGI1ZDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwpAQCAtMTYsNyArMTYsNyBAQAogICogIAogICogSW50ZXJmYWNlIHRvIGdlbmVyaWMgTkFORCBjb2RlIGZvciBNLVN5c3RlbXMgRGlza09uQ2hpcCBkZXZpY2VzCiAgKgotICogJElkOiBkaXNrb25jaGlwLmMsdiAxLjQ1IDIwMDUvMDEvMDUgMTg6MDU6MTQgZHdtdzIgRXhwICQKKyAqICRJZDogZGlza29uY2hpcC5jLHYgMS41NCAyMDA1LzA0LzA3IDE0OjIyOjU1IGRicm93biBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM1LDEzICszNSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9pbmZ0bC5oPgogCiAvKiBXaGVyZSB0byBsb29rIGZvciB0aGUgZGV2aWNlcz8gKi8KLSNpZm5kZWYgQ09ORklHX01URF9ESVNLT05DSElQX1BST0JFX0FERFJFU1MKLSNkZWZpbmUgQ09ORklHX01URF9ESVNLT05DSElQX1BST0JFX0FERFJFU1MgMAorI2lmbmRlZiBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTCisjZGVmaW5lIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQX1BST0JFX0FERFJFU1MgMAogI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgZG9jX2xvY2F0aW9uc1tdID0gewogI2lmIGRlZmluZWQgKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotI2lmZGVmIENPTkZJR19NVERfRElTS09OQ0hJUF9QUk9CRV9ISUdICisjaWZkZWYgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVBfUFJPQkVfSElHSAogCTB4ZmZmYzgwMDAsIDB4ZmZmY2EwMDAsIDB4ZmZmY2MwMDAsIDB4ZmZmY2UwMDAsIAogCTB4ZmZmZDAwMDAsIDB4ZmZmZDIwMDAsIDB4ZmZmZDQwMDAsIDB4ZmZmZDYwMDAsCiAJMHhmZmZkODAwMCwgMHhmZmZkYTAwMCwgMHhmZmZkYzAwMCwgMHhmZmZkZTAwMCwgCkBAIC04MSwxMSArODEsNiBAQAogCXN0cnVjdCBtdGRfaW5mbyAqbmV4dGRvYzsKIH07CiAKLS8qIE1heCBudW1iZXIgb2YgZXJhc2VibG9ja3MgdG8gc2NhbiAoZnJvbSBzdGFydCBvZiBkZXZpY2UpIGZvciB0aGUgKEkpTkZUTAotICAgTWVkaWFIZWFkZXIuICBUaGUgc3BlYyBzYXlzIHRvIGp1c3Qga2VlcCBnb2luZywgSSB0aGluaywgYnV0IHRoYXQncyBqdXN0Ci0gICBzaWxseS4gKi8KLSNkZWZpbmUgTUFYX01FRElBSEVBREVSX1NDQU4gOAotCiAvKiBUaGlzIGlzIHRoZSBzeW5kcm9tZSBjb21wdXRlZCBieSB0aGUgSFcgZWNjIGdlbmVyYXRvciB1cG9uIHJlYWRpbmcgYW4gZW1wdHkKICAgIHBhZ2UsIG9uZSB3aXRoIGFsbCAweGZmIGZvciBkYXRhIGFuZCBzdG9yZWQgZWNjIGNvZGUuICovCiBzdGF0aWMgdV9jaGFyIGVtcHR5X3JlYWRfc3luZHJvbWVbNl0gPSB7IDB4MjYsIDB4ZmYsIDB4NmQsIDB4NDcsIDB4NzMsIDB4N2EgfTsKQEAgLTExMSwxMCArMTA2LDExIEBACiBzdGF0aWMgaW50IG5vX2VjY19mYWlsdXJlcz0wOwogbW9kdWxlX3BhcmFtKG5vX2VjY19mYWlsdXJlcywgaW50LCAwKTsKIAotI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwogc3RhdGljIGludCBub19hdXRvcGFydD0wOwogbW9kdWxlX3BhcmFtKG5vX2F1dG9wYXJ0LCBpbnQsIDApOwotI2VuZGlmCisKK3N0YXRpYyBpbnQgc2hvd19maXJtd2FyZV9wYXJ0aXRpb249MDsKK21vZHVsZV9wYXJhbShzaG93X2Zpcm13YXJlX3BhcnRpdGlvbiwgaW50LCAwKTsKIAogI2lmZGVmIE1URF9OQU5EX0RJU0tPTkNISVBfQkJUV1JJVEUKIHN0YXRpYyBpbnQgaW5mdGxfYmJ0X3dyaXRlPTE7CkBAIC0xMjMsNyArMTE5LDcgQEAKICNlbmRpZgogbW9kdWxlX3BhcmFtKGluZnRsX2JidF93cml0ZSwgaW50LCAwKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9jX2NvbmZpZ19sb2NhdGlvbiA9IENPTkZJR19NVERfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9jX2NvbmZpZ19sb2NhdGlvbiA9IENPTkZJR19NVERfTkFORF9ESVNLT05DSElQX1BST0JFX0FERFJFU1M7CiBtb2R1bGVfcGFyYW0oZG9jX2NvbmZpZ19sb2NhdGlvbiwgdWxvbmcsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkb2NfY29uZmlnX2xvY2F0aW9uLCAiUGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgYXQgd2hpY2ggdG8gcHJvYmUgZm9yIERpc2tPbkNoaXAiKTsKIApAQCAtNDEwLDcgKzQwNiwxMiBAQAogCWRvYzIwMHhfaHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQUxFKTsKIAl0aGlzLT53cml0ZV9ieXRlKG10ZCwgMCk7CiAJZG9jMjAweF9od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJBTEUpOwotCisJCisJLyogV2UgY2FudCcgdXNlIGRldl9yZWFkeSBoZXJlLCBidXQgYXQgbGVhc3Qgd2Ugd2FpdCBmb3IgdGhlCisJICogY29tbWFuZCB0byBjb21wbGV0ZSAKKwkgKi8KKwl1ZGVsYXkoNTApOworCQogCXJldCA9IHRoaXMtPnJlYWRfYnl0ZShtdGQpIDw8IDg7CiAJcmV0IHw9IHRoaXMtPnJlYWRfYnl0ZShtdGQpOwogCkBAIC00MjksNiArNDMwLDggQEAKIAkJZG9jMjAwMF93cml0ZV9ieXRlKG10ZCwgMCk7CiAJCWRvYzIwMHhfaHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQUxFKTsKIAorCQl1ZGVsYXkoNTApOworCiAJCWlkZW50LmR3b3JkID0gcmVhZGwoZG9jcHRyICsgRG9DXzJrX0NEU05fSU8pOwogCQlpZiAoKChpZGVudC5ieXRlWzBdIDw8IDgpIHwgaWRlbnQuYnl0ZVsxXSkgPT0gcmV0KSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJEaXNrT25DaGlwIDIwMDAgcmVzcG9uZHMgdG8gRFdPUkQgYWNjZXNzXG4iKTsKQEAgLTEwNDYsMTEgKzEwNDksMjEgQEAKIAkJCiAvL3VfY2hhciBteWRhdGFidWZbNTI4XTsKIAorLyogVGhlIHN0cmFuZ2Ugb3V0LW9mLW9yZGVyIC5vb2JmcmVlIGxpc3QgYmVsb3cgaXMgYSAocG9zc2libHkgdW5uZWVkZWQpCisgKiBhdHRlbXB0IHRvIHJldGFpbiBjb21wYXRpYmlsaXR5LiAgSXQgdXNlZCB0byByZWFkOgorICogCS5vb2JmcmVlID0geyB7OCwgOH0gfQorICogU2luY2UgdGhhdCBsZWF2ZXMgdHdvIGJ5dGVzIHVudXNhYmxlLCBpdCB3YXMgY2hhbmdlZC4gIEJ1dCB0aGUgZm9sbG93aW5nCisgKiBzY2hlbWUgbWlnaHQgYWZmZWN0IGV4aXN0aW5nIGpmZnMyIGluc3RhbGxzIGJ5IG1vdmluZyB0aGUgY2xlYW5tYXJrZXI6CisgKiAJLm9vYmZyZWUgPSB7IHs2LCAxMH0gfQorICogamZmczIgc2VlbXMgdG8gaGFuZGxlIHRoZSBhYm92ZSBncmFjZWZ1bGx5LCBidXQgdGhlIGN1cnJlbnQgc2NoZW1lIHNlZW1zCisgKiBzYWZlci4gIFRoZSBvbmx5IHByb2JsZW0gd2l0aCBpdCBpcyB0aGF0IGFueSBjb2RlIHRoYXQgcGFyc2VzIG9vYmZyZWUgbXVzdAorICogYmUgYWJsZSB0byBoYW5kbGUgb3V0LW9mLW9yZGVyIHNlZ21lbnRzLgorICovCiBzdGF0aWMgc3RydWN0IG5hbmRfb29iaW5mbyBkb2MyMDB4X29vYmluZm8gPSB7CiAgICAgICAgIC51c2VlY2MgPSBNVERfTkFOREVDQ19BVVRPUExBQ0UsCiAgICAgICAgIC5lY2NieXRlcyA9IDYsCiAgICAgICAgIC5lY2Nwb3MgPSB7MCwgMSwgMiwgMywgNCwgNX0sCi0gICAgICAgIC5vb2JmcmVlID0geyB7OCwgOH0gfQorICAgICAgICAub29iZnJlZSA9IHsgezgsIDh9LCB7NiwgMn0gfQogfTsKICAKIC8qIEZpbmQgdGhlIChJKU5GVEwgTWVkaWEgSGVhZGVyLCBhbmQgb3B0aW9uYWxseSBhbHNvIHRoZSBtaXJyb3IgbWVkaWEgaGVhZGVyLgpAQCAtMTA2NCwxMiArMTA3NywxMSBAQAogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CiAJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OwotCXVuc2lnbmVkIG9mZnMsIGVuZCA9IChNQVhfTUVESUFIRUFERVJfU0NBTiA8PCB0aGlzLT5waHlzX2VyYXNlX3NoaWZ0KTsKKwl1bnNpZ25lZCBvZmZzOwogCWludCByZXQ7CiAJc2l6ZV90IHJldGxlbjsKIAotCWVuZCA9IG1pbihlbmQsIG10ZC0+c2l6ZSk7IC8vIHBhcmFub2lhCi0JZm9yIChvZmZzID0gMDsgb2ZmcyA8IGVuZDsgb2ZmcyArPSBtdGQtPmVyYXNlc2l6ZSkgeworCWZvciAob2ZmcyA9IDA7IG9mZnMgPCBtdGQtPnNpemU7IG9mZnMgKz0gbXRkLT5lcmFzZXNpemUpIHsKIAkJcmV0ID0gbXRkLT5yZWFkKG10ZCwgb2ZmcywgbXRkLT5vb2JibG9jaywgJnJldGxlbiwgYnVmKTsKIAkJaWYgKHJldGxlbiAhPSBtdGQtPm9vYmJsb2NrKSBjb250aW51ZTsKIAkJaWYgKHJldCkgewpAQCAtMTExMSw2ICsxMTIzLDcgQEAKIAl1X2NoYXIgKmJ1ZjsKIAlzdHJ1Y3QgTkZUTE1lZGlhSGVhZGVyICptaDsKIAljb25zdCB1bnNpZ25lZCBwc2l6ZSA9IDEgPDwgdGhpcy0+cGFnZV9zaGlmdDsKKwlpbnQgbnVtcGFydHMgPSAwOwogCXVuc2lnbmVkIGJsb2NrcywgbWF4YmxvY2tzOwogCWludCBvZmZzLCBudW1oZWFkZXJzOwogCkBAIC0xMTIyLDggKzExMzUsMTAgQEAKIAlpZiAoIShudW1oZWFkZXJzPWZpbmRfbWVkaWFfaGVhZGVycyhtdGQsIGJ1ZiwgIkFOQU5EIiwgMSkpKSBnb3RvIG91dDsKIAltaCA9IChzdHJ1Y3QgTkZUTE1lZGlhSGVhZGVyICopIGJ1ZjsKIAotLy8jaWZkZWYgQ09ORklHX01URF9ERUJVR19WRVJCT1NFCi0vLwlpZiAoQ09ORklHX01URF9ERUJVR19WRVJCT1NFID49IDIpCisJbWgtPk51bUVyYXNlVW5pdHMgPSBsZTE2X3RvX2NwdShtaC0+TnVtRXJhc2VVbml0cyk7CisJbWgtPkZpcnN0UGh5c2ljYWxFVU4gPSBsZTE2X3RvX2NwdShtaC0+Rmlyc3RQaHlzaWNhbEVVTik7CisJbWgtPkZvcm1hdHRlZFNpemUgPSBsZTMyX3RvX2NwdShtaC0+Rm9ybWF0dGVkU2l6ZSk7CisKIAlwcmludGsoS0VSTl9JTkZPICIgICAgRGF0YU9yZ0lEICAgICAgICA9ICVzXG4iCiAJCQkgIiAgICBOdW1FcmFzZVVuaXRzICAgID0gJWRcbiIKIAkJCSAiICAgIEZpcnN0UGh5c2ljYWxFVU4gPSAlZFxuIgpAQCAtMTEzMiw3ICsxMTQ3LDYgQEAKIAkJbWgtPkRhdGFPcmdJRCwgbWgtPk51bUVyYXNlVW5pdHMsCiAJCW1oLT5GaXJzdFBoeXNpY2FsRVVOLCBtaC0+Rm9ybWF0dGVkU2l6ZSwKIAkJbWgtPlVuaXRTaXplRmFjdG9yKTsKLS8vI2VuZGlmCiAKIAlibG9ja3MgPSBtdGQtPnNpemUgPj4gdGhpcy0+cGh5c19lcmFzZV9zaGlmdDsKIAltYXhibG9ja3MgPSBtaW4oMzI3NjhVLCBtdGQtPmVyYXNlc2l6ZSAtIHBzaXplKTsKQEAgLTExNzUsMjMgKzExODksMjggQEAKIAlvZmZzIDw8PSB0aGlzLT5wYWdlX3NoaWZ0OwogCW9mZnMgKz0gbXRkLT5lcmFzZXNpemU7CiAKLQkvL3BhcnRzWzBdLm5hbWUgPSAiIERpc2tPbkNoaXAgQm9vdCAvIE1lZGlhIEhlYWRlciBwYXJ0aXRpb24iOwotCS8vcGFydHNbMF0ub2Zmc2V0ID0gMDsKLQkvL3BhcnRzWzBdLnNpemUgPSBvZmZzOwotCi0JcGFydHNbMF0ubmFtZSA9ICIgRGlza09uQ2hpcCBCRFRMIHBhcnRpdGlvbiI7Ci0JcGFydHNbMF0ub2Zmc2V0ID0gb2ZmczsKLQlwYXJ0c1swXS5zaXplID0gKG1oLT5OdW1FcmFzZVVuaXRzIC0gbnVtaGVhZGVycykgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0OwotCi0Jb2ZmcyArPSBwYXJ0c1swXS5zaXplOwotCWlmIChvZmZzIDwgbXRkLT5zaXplKSB7Ci0JCXBhcnRzWzFdLm5hbWUgPSAiIERpc2tPbkNoaXAgUmVtYWluZGVyIHBhcnRpdGlvbiI7Ci0JCXBhcnRzWzFdLm9mZnNldCA9IG9mZnM7Ci0JCXBhcnRzWzFdLnNpemUgPSBtdGQtPnNpemUgLSBvZmZzOwotCQlyZXQgPSAyOwotCQlnb3RvIG91dDsKKwlpZiAoc2hvd19maXJtd2FyZV9wYXJ0aXRpb24gPT0gMSkgeworCQlwYXJ0c1swXS5uYW1lID0gIiBEaXNrT25DaGlwIEZpcm13YXJlIC8gTWVkaWEgSGVhZGVyIHBhcnRpdGlvbiI7CisJCXBhcnRzWzBdLm9mZnNldCA9IDA7CisJCXBhcnRzWzBdLnNpemUgPSBvZmZzOworCQludW1wYXJ0cyA9IDE7CiAJfQotCXJldCA9IDE7CisKKwlwYXJ0c1tudW1wYXJ0c10ubmFtZSA9ICIgRGlza09uQ2hpcCBCRFRMIHBhcnRpdGlvbiI7CisJcGFydHNbbnVtcGFydHNdLm9mZnNldCA9IG9mZnM7CisJcGFydHNbbnVtcGFydHNdLnNpemUgPSAobWgtPk51bUVyYXNlVW5pdHMgLSBudW1oZWFkZXJzKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7CisKKwlvZmZzICs9IHBhcnRzW251bXBhcnRzXS5zaXplOworCW51bXBhcnRzKys7CisKKwlpZiAob2ZmcyA8IG10ZC0+c2l6ZSkgeworCQlwYXJ0c1tudW1wYXJ0c10ubmFtZSA9ICIgRGlza09uQ2hpcCBSZW1haW5kZXIgcGFydGl0aW9uIjsKKwkJcGFydHNbbnVtcGFydHNdLm9mZnNldCA9IG9mZnM7CisJCXBhcnRzW251bXBhcnRzXS5zaXplID0gbXRkLT5zaXplIC0gb2ZmczsKKwkJbnVtcGFydHMrKzsKKwl9CisKKwlyZXQgPSBudW1wYXJ0czsKIG91dDoKIAlrZnJlZShidWYpOwogCXJldHVybiByZXQ7CkBAIC0xMjMzLDggKzEyNTIsNiBAQAogCW1oLT5Gb3JtYXRGbGFncyA9IGxlMzJfdG9fY3B1KG1oLT5Gb3JtYXRGbGFncyk7CiAJbWgtPlBlcmNlbnRVc2VkID0gbGUzMl90b19jcHUobWgtPlBlcmNlbnRVc2VkKTsKICAKLS8vI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRQotLy8JaWYgKENPTkZJR19NVERfREVCVUdfVkVSQk9TRSA+PSAyKQogCXByaW50ayhLRVJOX0lORk8gIiAgICBib290UmVjb3JkSUQgICAgICAgICAgPSAlc1xuIgogCQkJICIgICAgTm9PZkJvb3RJbWFnZUJsb2NrcyAgID0gJWRcbiIKIAkJCSAiICAgIE5vT2ZCaW5hcnlQYXJ0aXRpb25zICA9ICVkXG4iCkBAIC0xMjUyLDcgKzEyNjksNiBAQAogCQkoKHVuc2lnbmVkIGNoYXIgKikgJm1oLT5Pc2FrVmVyc2lvbilbMl0gJiAweGYsCiAJCSgodW5zaWduZWQgY2hhciAqKSAmbWgtPk9zYWtWZXJzaW9uKVszXSAmIDB4ZiwKIAkJbWgtPlBlcmNlbnRVc2VkKTsKLS8vI2VuZGlmCiAKIAl2c2hpZnQgPSB0aGlzLT5waHlzX2VyYXNlX3NoaWZ0ICsgbWgtPkJsb2NrTXVsdGlwbGllckJpdHM7CiAKQEAgLTEyNzgsOCArMTI5NCw2IEBACiAJCWlwLT5zcGFyZVVuaXRzID0gbGUzMl90b19jcHUoaXAtPnNwYXJlVW5pdHMpOwogCQlpcC0+UmVzZXJ2ZWQwID0gbGUzMl90b19jcHUoaXAtPlJlc2VydmVkMCk7CiAKLS8vI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRQotLy8JCWlmIChDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UgPj0gMikKIAkJcHJpbnRrKEtFUk5fSU5GTwkiICAgIFBBUlRJVElPTlslZF0gLT5cbiIKIAkJCSIgICAgICAgIHZpcnR1YWxVbml0cyAgICA9ICVkXG4iCiAJCQkiICAgICAgICBmaXJzdFVuaXQgICAgICAgPSAlZFxuIgpAQCAtMTI4OSwxNiArMTMwMywxNCBAQAogCQkJaSwgaXAtPnZpcnR1YWxVbml0cywgaXAtPmZpcnN0VW5pdCwKIAkJCWlwLT5sYXN0VW5pdCwgaXAtPmZsYWdzLAogCQkJaXAtPnNwYXJlVW5pdHMpOwotLy8jZW5kaWYKIAotLyoKLQkJaWYgKChpID09IDApICYmIChpcC0+Zmlyc3RVbml0ID4gMCkpIHsKKwkJaWYgKChzaG93X2Zpcm13YXJlX3BhcnRpdGlvbiA9PSAxKSAmJgorCQkgICAgKGkgPT0gMCkgJiYgKGlwLT5maXJzdFVuaXQgPiAwKSkgewogCQkJcGFydHNbMF0ubmFtZSA9ICIgRGlza09uQ2hpcCBJUEwgLyBNZWRpYSBIZWFkZXIgcGFydGl0aW9uIjsKIAkJCXBhcnRzWzBdLm9mZnNldCA9IDA7CiAJCQlwYXJ0c1swXS5zaXplID0gbXRkLT5lcmFzZXNpemUgKiBpcC0+Zmlyc3RVbml0OwogCQkJbnVtcGFydHMgPSAxOwogCQl9Ci0qLwogCiAJCWlmIChpcC0+ZmxhZ3MgJiBJTkZUTF9CSU5BUlkpCiAJCQlwYXJ0c1tudW1wYXJ0c10ubmFtZSA9ICIgRGlza09uQ2hpcCBCREsgcGFydGl0aW9uIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IDQ0ZDViMTIuLjFiZDcxYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtMjgsNiArMjgsMjQgQEAKICAqCQlhbW9uZyBtdWx0aXBsZSBpbmRlcGVuZGVuZCBkZXZpY2VzLiBTdWdnZXN0aW9ucyBhbmQgaW5pdGlhbCBwYXRjaAogICoJCWZyb20gQmVuIERvb2tzIDxiZW4tbXRkQGZsdWZmLm9yZz4KICAqCisgKiAgMTItMDUtMjAwNAlkbWFybGluOiBhZGQgd29ya2Fyb3VuZCBmb3IgUmVuZXNhcyBBRy1BTkQgY2hpcHMgImRpc3R1cmIiIGlzc3VlLgorICoJCUJhc2ljYWxseSwgYW55IGJsb2NrIG5vdCByZXdyaXR0ZW4gbWF5IGxvc2UgZGF0YSB3aGVuIHN1cnJvdW5kaW5nIGJsb2NrcworICoJCWFyZSByZXdyaXR0ZW4gbWFueSB0aW1lcy4gIEpGRlMyIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbiBmb3IgYmxvY2tzIAorICoJCWl0IHVzZXMsIGJ1dCB0aGUgQmFkIEJsb2NrIFRhYmxlKHMpIG1heSBub3QgYmUgcmV3cml0dGVuLiAgVG8gZW5zdXJlIHRoZXkKKyAqCQlkbyBub3QgbG9zZSBkYXRhLCBmb3JjZSB0aGVtIHRvIGJlIHJld3JpdHRlbiB3aGVuIHNvbWUgb2YgdGhlIHN1cnJvdW5kaW5nCisgKgkJYmxvY2tzIGFyZSBlcmFzZWQuICBSYXRoZXIgdGhhbiB0cmFja2luZyBhIHNwZWNpZmljIG5lYXJieSBibG9jayAod2hpY2ggCisgKgkJY291bGQgaXRzZWxmIGdvIGJhZCksIHVzZSBhIHBhZ2UgYWRkcmVzcyAnbWFzaycgdG8gc2VsZWN0IHNldmVyYWwgYmxvY2tzIAorICoJCWluIHRoZSBzYW1lIGFyZWEsIGFuZCByZXdyaXRlIHRoZSBCQlQgd2hlbiBhbnkgb2YgdGhlbSBhcmUgZXJhc2VkLgorICoKKyAqICAwMS0wMy0yMDA1CWRtYXJsaW46IGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBkZXZpY2UgcmVjb3ZlcnkgY29tbWFuZCBzZXF1ZW5jZSBmb3IgUmVuZXNhcyAKKyAqCQlBRy1BTkQgY2hpcHMuICBJZiB0aGVyZSB3YXMgYSBzdWRkZW4gbG9zcyBvZiBwb3dlciBkdXJpbmcgYW4gZXJhc2Ugb3BlcmF0aW9uLAorICogCQlhICJkZXZpY2UgcmVjb3ZlcnkiIG9wZXJhdGlvbiBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHBvd2VyIGlzIHJlc3RvcmVkCisgKiAJCXRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbi4KKyAqCisgKiAgMDEtMjAtMjAwNQlkbWFybGluOiBhZGRlZCBzdXBwb3J0IGZvciBvcHRpb25hbCBoYXJkd2FyZSBzcGVjaWZpYyBjYWxsYmFjayByb3V0aW5lIHRvIAorICoJCXBlcmZvcm0gZXh0cmEgZXJyb3Igc3RhdHVzIGNoZWNrcyBvbiBlcmFzZSBhbmQgd3JpdGUgZmFpbHVyZXMuICBUaGlzIHJlcXVpcmVkCisgKgkJYWRkaW5nIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgbmFuZF9yZWFkX2VjYy4KKyAqCiAgKiBDcmVkaXRzOgogICoJRGF2aWQgV29vZGhvdXNlIGZvciBhZGRpbmcgbXVsdGljaGlwIHN1cHBvcnQgIAogICoJCkBAIC00MSw3ICs1OSw3IEBACiAgKglUaGUgQUctQU5EIGNoaXBzIGhhdmUgbmljZSBmZWF0dXJlcyBmb3Igc3BlZWQgaW1wcm92ZW1lbnQsCiAgKgl3aGljaCBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuIFJlYWQgLyBwcm9ncmFtIDQgcGFnZXMgaW4gb25lIGdvLgogICoKLSAqICRJZDogbmFuZF9iYXNlLmMsdiAxLjEyNiAyMDA0LzEyLzEzIDExOjIyOjI1IGxhdmluZW4gRXhwICQKKyAqICRJZDogbmFuZF9iYXNlLmMsdiAxLjE0NiAyMDA1LzA2LzE3IDE1OjAyOjA2IGdsZWl4bmVyIEV4cCAkCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xNDksMTcgKzE2NywyMSBAQAogCiAJLyogRGUtc2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLwogCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOwotCS8qIERvIHdlIGhhdmUgYSBoYXJkd2FyZSBjb250cm9sbGVyID8gKi8KKwogCWlmICh0aGlzLT5jb250cm9sbGVyKSB7CisJCS8qIFJlbGVhc2UgdGhlIGNvbnRyb2xsZXIgYW5kIHRoZSBjaGlwICovCiAJCXNwaW5fbG9jaygmdGhpcy0+Y29udHJvbGxlci0+bG9jayk7CiAJCXRoaXMtPmNvbnRyb2xsZXItPmFjdGl2ZSA9IE5VTEw7CisJCXRoaXMtPnN0YXRlID0gRkxfUkVBRFk7CisJCXdha2VfdXAoJnRoaXMtPmNvbnRyb2xsZXItPndxKTsKIAkJc3Bpbl91bmxvY2soJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOworCX0gZWxzZSB7CisJCS8qIFJlbGVhc2UgdGhlIGNoaXAgKi8KKwkJc3Bpbl9sb2NrKCZ0aGlzLT5jaGlwX2xvY2spOworCQl0aGlzLT5zdGF0ZSA9IEZMX1JFQURZOworCQl3YWtlX3VwKCZ0aGlzLT53cSk7CisJCXNwaW5fdW5sb2NrKCZ0aGlzLT5jaGlwX2xvY2spOwogCX0KLQkvKiBSZWxlYXNlIHRoZSBjaGlwICovCi0Jc3Bpbl9sb2NrICgmdGhpcy0+Y2hpcF9sb2NrKTsKLQl0aGlzLT5zdGF0ZSA9IEZMX1JFQURZOwotCXdha2VfdXAgKCZ0aGlzLT53cSk7Ci0Jc3Bpbl91bmxvY2sgKCZ0aGlzLT5jaGlwX2xvY2spOwogfQogCiAvKioKQEAgLTQ0Myw3ICs0NjUsOCBAQAogCQogCS8qIEdldCBibG9jayBudW1iZXIgKi8KIAlibG9jayA9ICgoaW50KSBvZnMpID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdDsKLQl0aGlzLT5iYnRbYmxvY2sgPj4gMl0gfD0gMHgwMSA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSk7CisJaWYgKHRoaXMtPmJidCkKKwkJdGhpcy0+YmJ0W2Jsb2NrID4+IDJdIHw9IDB4MDEgPDwgKChibG9jayAmIDB4MDMpIDw8IDEpOwogCiAJLyogRG8gd2UgaGF2ZSBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSA/ICovCiAJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1VTRV9GTEFTSF9CQlQpCkBAIC00NjYsNyArNDg5LDcgQEAKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCS8qIENoZWNrIHRoZSBXUCBiaXQgKi8KIAl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1NUQVRVUywgLTEsIC0xKTsKLQlyZXR1cm4gKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg4MCkgPyAwIDogMTsgCisJcmV0dXJuICh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIE5BTkRfU1RBVFVTX1dQKSA/IDAgOiAxOyAKIH0KIAogLyoqCkBAIC00OTAsNiArNTEzLDIyIEBACiAJcmV0dXJuIG5hbmRfaXNiYWRfYmJ0IChtdGQsIG9mcywgYWxsb3diYnQpOwogfQogCisvKiAKKyAqIFdhaXQgZm9yIHRoZSByZWFkeSBwaW4sIGFmdGVyIGEgY29tbWFuZAorICogVGhlIHRpbWVvdXQgaXMgY2F0Y2hlZCBsYXRlci4KKyAqLworc3RhdGljIHZvaWQgbmFuZF93YWl0X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJdW5zaWduZWQgbG9uZwl0aW1lbyA9IGppZmZpZXMgKyAyOworCisJLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCBvciB0aW1lb3V0IG9jY3VyZXMgKi8KKwlkbyB7CisJCWlmICh0aGlzLT5kZXZfcmVhZHkobXRkKSkKKwkJCXJldHVybjsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lbykpOwkKK30KKwogLyoqCiAgKiBuYW5kX2NvbW1hbmQgLSBbREVGQVVMVF0gU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlCiAgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQpAQCAtNTcxLDcgKzYxMCw3IEBACiAJCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7CiAJCXRoaXMtPndyaXRlX2J5dGUobXRkLCBOQU5EX0NNRF9TVEFUVVMpOwogCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOwotCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiAweDQwKSk7CisJCXdoaWxlICggISh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIE5BTkRfU1RBVFVTX1JFQURZKSk7CiAJCXJldHVybjsKIAogCS8qIFRoaXMgYXBwbGllcyB0byByZWFkIGNvbW1hbmRzICovCQpAQCAtNTg1LDEyICs2MjQsMTEgQEAKIAkJCXJldHVybjsKIAkJfQkKIAl9Ci0JCiAJLyogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KIAkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4gKi8KIAluZGVsYXkgKDEwMCk7Ci0JLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCAqLwotCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworCisJbmFuZF93YWl0X3JlYWR5KG10ZCk7CiB9CiAKIC8qKgpAQCAtNjE5LDcgKzY1Nyw3IEBACiAJLyogQmVnaW4gY29tbWFuZCBsYXRjaCBjeWNsZSAqLwogCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7CiAJLyogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UuICovCi0JdGhpcy0+d3JpdGVfYnl0ZShtdGQsIGNvbW1hbmQpOworCXRoaXMtPndyaXRlX2J5dGUobXRkLCAoY29tbWFuZCAmIDB4ZmYpKTsKIAkvKiBFbmQgY29tbWFuZCBsYXRjaCBjeWNsZSAqLwogCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkNMRSk7CiAKQEAgLTY0Nyw4ICs2ODUsOCBAQAogCQogCS8qIAogCSAqIHByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMgCi0JICogc3RhdHVzIGFuZCBzZXF1ZW50aWFsIGluIG5lZWRzIG5vIGRlbGF5Ci0JKi8KKwkgKiBzdGF0dXMsIHNlcXVlbnRpYWwgaW4sIGFuZCBkZXBsZXRlMSBuZWVkIG5vIGRlbGF5CisJICovCiAJc3dpdGNoIChjb21tYW5kKSB7CiAJCQkKIAljYXNlIE5BTkRfQ01EX0NBQ0hFRFBST0c6CkBAIC02NTcsOCArNjk1LDE5IEBACiAJY2FzZSBOQU5EX0NNRF9FUkFTRTI6CiAJY2FzZSBOQU5EX0NNRF9TRVFJTjoKIAljYXNlIE5BTkRfQ01EX1NUQVRVUzoKKwljYXNlIE5BTkRfQ01EX0RFUExFVEUxOgogCQlyZXR1cm47CiAKKwkvKiAKKwkgKiByZWFkIGVycm9yIHN0YXR1cyBjb21tYW5kcyByZXF1aXJlIG9ubHkgYSBzaG9ydCBkZWxheQorCSAqLworCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SOgorCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SMDoKKwljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjE6CisJY2FzZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IyOgorCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SMzoKKwkJdWRlbGF5KHRoaXMtPmNoaXBfZGVsYXkpOworCQlyZXR1cm47CiAKIAljYXNlIE5BTkRfQ01EX1JFU0VUOgogCQlpZiAodGhpcy0+ZGV2X3JlYWR5KQkKQEAgLTY2Nyw3ICs3MTYsNyBAQAogCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwogCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgTkFORF9DTURfU1RBVFVTKTsKIAkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKLQkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOworCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiBOQU5EX1NUQVRVU19SRUFEWSkpOwogCQlyZXR1cm47CiAKIAljYXNlIE5BTkRfQ01EX1JFQUQwOgpAQCAtNjkwLDEyICs3MzksMTIgQEAKIAkJCXJldHVybjsKIAkJfQkKIAl9Ci0JCisKIAkvKiBBcHBseSB0aGlzIHNob3J0IGRlbGF5IGFsd2F5cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyB3YWl0IHRXQiBpbgogCSAqIGFueSBjYXNlIG9uIGFueSBtYWNoaW5lLiAqLwogCW5kZWxheSAoMTAwKTsKLQkvKiB3YWl0IHVudGlsIGNvbW1hbmQgaXMgcHJvY2Vzc2VkICovCi0Jd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7CisKKwluYW5kX3dhaXRfcmVhZHkobXRkKTsKIH0KIAogLyoqCkBAIC03MDgsMzcgKzc1NywzNCBAQAogICovCiBzdGF0aWMgdm9pZCBuYW5kX2dldF9kZXZpY2UgKHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbmV3X3N0YXRlKQogewotCXN0cnVjdCBuYW5kX2NoaXAgKmFjdGl2ZSA9IHRoaXM7Ci0KKwlzdHJ1Y3QgbmFuZF9jaGlwICphY3RpdmU7CisJc3BpbmxvY2tfdCAqbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CiAJREVDTEFSRV9XQUlUUVVFVUUgKHdhaXQsIGN1cnJlbnQpOwogCi0JLyogCi0JICogR3JhYiB0aGUgbG9jayBhbmQgc2VlIGlmIHRoZSBkZXZpY2UgaXMgYXZhaWxhYmxlIAotCSovCisJbG9jayA9ICh0aGlzLT5jb250cm9sbGVyKSA/ICZ0aGlzLT5jb250cm9sbGVyLT5sb2NrIDogJnRoaXMtPmNoaXBfbG9jazsKKwl3cSA9ICh0aGlzLT5jb250cm9sbGVyKSA/ICZ0aGlzLT5jb250cm9sbGVyLT53cSA6ICZ0aGlzLT53cTsKIHJldHJ5OgorCWFjdGl2ZSA9IHRoaXM7CisJc3Bpbl9sb2NrKGxvY2spOworCiAJLyogSGFyZHdhcmUgY29udHJvbGxlciBzaGFyZWQgYW1vbmcgaW5kZXBlbmRlbmQgZGV2aWNlcyAqLwogCWlmICh0aGlzLT5jb250cm9sbGVyKSB7Ci0JCXNwaW5fbG9jayAoJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOwogCQlpZiAodGhpcy0+Y29udHJvbGxlci0+YWN0aXZlKQogCQkJYWN0aXZlID0gdGhpcy0+Y29udHJvbGxlci0+YWN0aXZlOwogCQllbHNlCiAJCQl0aGlzLT5jb250cm9sbGVyLT5hY3RpdmUgPSB0aGlzOwotCQlzcGluX3VubG9jayAoJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOwogCX0KLQkKLQlpZiAoYWN0aXZlID09IHRoaXMpIHsKLQkJc3Bpbl9sb2NrICgmdGhpcy0+Y2hpcF9sb2NrKTsKLQkJaWYgKHRoaXMtPnN0YXRlID09IEZMX1JFQURZKSB7Ci0JCQl0aGlzLT5zdGF0ZSA9IG5ld19zdGF0ZTsKLQkJCXNwaW5fdW5sb2NrICgmdGhpcy0+Y2hpcF9sb2NrKTsKLQkJCXJldHVybjsKLQkJfQotCX0JCi0Jc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlhZGRfd2FpdF9xdWV1ZSAoJmFjdGl2ZS0+d3EsICZ3YWl0KTsKLQlzcGluX3VubG9jayAoJmFjdGl2ZS0+Y2hpcF9sb2NrKTsKLQlzY2hlZHVsZSAoKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSAoJmFjdGl2ZS0+d3EsICZ3YWl0KTsKKwlpZiAoYWN0aXZlID09IHRoaXMgJiYgdGhpcy0+c3RhdGUgPT0gRkxfUkVBRFkpIHsKKwkJdGhpcy0+c3RhdGUgPSBuZXdfc3RhdGU7CisJCXNwaW5fdW5sb2NrKGxvY2spOworCQlyZXR1cm47CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSh3cSwgJndhaXQpOworCXNwaW5fdW5sb2NrKGxvY2spOworCXNjaGVkdWxlKCk7CisJcmVtb3ZlX3dhaXRfcXVldWUod3EsICZ3YWl0KTsKIAlnb3RvIHJldHJ5OwogfQogCkBAIC03ODUsNyArODMxLDcgQEAKIAkJCWlmICh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIE5BTkRfU1RBVFVTX1JFQURZKQogCQkJCWJyZWFrOwogCQl9Ci0JCXlpZWxkICgpOworCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJc3RhdHVzID0gKGludCkgdGhpcy0+cmVhZF9ieXRlKG10ZCk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTg3MSw4ICs5MTcsMTQgQEAKIAlpZiAoIWNhY2hlZCkgewogCQkvKiBjYWxsIHdhaXQgcmVhZHkgZnVuY3Rpb24gKi8KIAkJc3RhdHVzID0gdGhpcy0+d2FpdGZ1bmMgKG10ZCwgdGhpcywgRkxfV1JJVElORyk7CisKKwkJLyogU2VlIGlmIG9wZXJhdGlvbiBmYWlsZWQgYW5kIGFkZGl0aW9uYWwgc3RhdHVzIGNoZWNrcyBhcmUgYXZhaWxhYmxlICovCisJCWlmICgoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkgJiYgKHRoaXMtPmVycnN0YXQpKSB7CisJCQlzdGF0dXMgPSB0aGlzLT5lcnJzdGF0KG10ZCwgdGhpcywgRkxfV1JJVElORywgc3RhdHVzLCBwYWdlKTsKKwkJfQorCiAJCS8qIFNlZSBpZiBkZXZpY2UgdGhpbmtzIGl0IHN1Y2NlZWRlZCAqLwotCQlpZiAoc3RhdHVzICYgMHgwMSkgeworCQlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkgewogCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICIlczogIiAiRmFpbGVkIHdyaXRlLCBwYWdlIDB4JTA4eCwgIiwgX19GVU5DVElPTl9fLCBwYWdlKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC05NzUsNyArMTAyNyw3IEBACiAJCWlmICghdGhpcy0+ZGV2X3JlYWR5KSAKIAkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CiAJCWVsc2UKLQkJCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOwkKKwkJCW5hbmRfd2FpdF9yZWFkeShtdGQpOwogCiAJCS8qIEFsbCBkb25lLCByZXR1cm4gaGFwcHkgKi8KIAkJaWYgKCFudW1wYWdlcykKQEAgLTk5NywyMyArMTA0OSwyNCBAQAogI2VuZGlmCiAKIC8qKgotICogbmFuZF9yZWFkIC0gW01URCBJbnRlcmZhY2VdIE1URCBjb21wYWJpbGl0eSBmdW5jdGlvbiBmb3IgbmFuZF9yZWFkX2VjYworICogbmFuZF9yZWFkIC0gW01URCBJbnRlcmZhY2VdIE1URCBjb21wYWJpbGl0eSBmdW5jdGlvbiBmb3IgbmFuZF9kb19yZWFkX2VjYwogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBmcm9tOglvZmZzZXQgdG8gcmVhZCBmcm9tCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAogICogQHJldGxlbjoJcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMKICAqIEBidWY6CXRoZSBkYXRhYnVmZmVyIHRvIHB1dCBkYXRhCiAgKgotICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgbmFuZF9yZWFkX2VjYyB3aXRoIG9vYiBidWZmZXIgYW5kIG9vYnNlbCA9IE5VTEwKLSovCisgKiBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBuYW5kX2RvX3JlYWRfZWNjIHdpdGggb29iIGJ1ZmZlciBhbmQgb29ic2VsID0gTlVMTAorICogYW5kIGZsYWdzID0gMHhmZgorICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1ZikKIHsKLQlyZXR1cm4gbmFuZF9yZWFkX2VjYyAobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBOVUxMLCBOVUxMKTsKLX0JCQkgICAKKwlyZXR1cm4gbmFuZF9kb19yZWFkX2VjYyAobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBOVUxMLCAmbXRkLT5vb2JpbmZvLCAweGZmKTsKK30KIAogCiAvKioKLSAqIG5hbmRfcmVhZF9lY2MgLSBbTVREIEludGVyZmFjZV0gUmVhZCBkYXRhIHdpdGggRUNDCisgKiBuYW5kX3JlYWRfZWNjIC0gW01URCBJbnRlcmZhY2VdIE1URCBjb21wYWJpbGl0eSBmdW5jdGlvbiBmb3IgbmFuZF9kb19yZWFkX2VjYwogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBmcm9tOglvZmZzZXQgdG8gcmVhZCBmcm9tCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZApAQCAtMTAyMiwxMSArMTA3NSwzOSBAQAogICogQG9vYl9idWY6CWZpbGVzeXN0ZW0gc3VwcGxpZWQgb29iIGRhdGEgYnVmZmVyCiAgKiBAb29ic2VsOglvb2Igc2VsZWN0aW9uIHN0cnVjdHVyZQogICoKLSAqIE5BTkQgcmVhZCB3aXRoIEVDQworICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgbmFuZF9kb19yZWFkX2VjYyB3aXRoIGZsYWdzID0gMHhmZgogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZF9lY2MgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKIAkJCSAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYsIHVfY2hhciAqIG9vYl9idWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCkKIHsKKwkvKiB1c2UgdXNlcnNwYWNlIHN1cHBsaWVkIG9vYmluZm8sIGlmIHplcm8gKi8KKwlpZiAob29ic2VsID09IE5VTEwpCisJCW9vYnNlbCA9ICZtdGQtPm9vYmluZm87CisJcmV0dXJuIG5hbmRfZG9fcmVhZF9lY2MobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBvb2JfYnVmLCBvb2JzZWwsIDB4ZmYpOworfQorCisKKy8qKgorICogbmFuZF9kb19yZWFkX2VjYyAtIFtNVEQgSW50ZXJmYWNlXSBSZWFkIGRhdGEgd2l0aCBFQ0MKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZnJvbToJb2Zmc2V0IHRvIHJlYWQgZnJvbQorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEByZXRsZW46CXBvaW50ZXIgdG8gdmFyaWFibGUgdG8gc3RvcmUgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzCisgKiBAYnVmOgl0aGUgZGF0YWJ1ZmZlciB0byBwdXQgZGF0YQorICogQG9vYl9idWY6CWZpbGVzeXN0ZW0gc3VwcGxpZWQgb29iIGRhdGEgYnVmZmVyIChjYW4gYmUgTlVMTCkKKyAqIEBvb2JzZWw6CW9vYiBzZWxlY3Rpb24gc3RydWN0dXJlCisgKiBAZmxhZ3M6CWZsYWcgdG8gaW5kaWNhdGUgaWYgbmFuZF9nZXRfZGV2aWNlL25hbmRfcmVsZWFzZV9kZXZpY2Ugc2hvdWxkIGJlIHByZWZvcm1lZAorICoJCWFuZCBob3cgbWFueSBjb3JyZWN0ZWQgZXJyb3IgYml0cyBhcmUgYWNjZXB0YWJsZToKKyAqCQkgIGJpdHMgMC4uNyAtIG51bWJlciBvZiB0b2xlcmFibGUgZXJyb3JzCisgKgkJICBiaXQgIDggICAgLSAwID09IGRvIG5vdCBnZXQvcmVsZWFzZSBjaGlwLCAxID09IGdldC9yZWxlYXNlIGNoaXAKKyAqCisgKiBOQU5EIHJlYWQgd2l0aCBFQ0MKKyAqLworaW50IG5hbmRfZG9fcmVhZF9lY2MgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkJCSAgICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYsIHVfY2hhciAqIG9vYl9idWYsIAorCQkJICAgICBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwsIGludCBmbGFncykKK3sKKwogCWludCBpLCBqLCBjb2wsIHJlYWxwYWdlLCBwYWdlLCBlbmQsIGVjYywgY2hpcG5yLCBzbmRjbWQgPSAxOwogCWludCByZWFkID0gMCwgb29iID0gMCwgZWNjX3N0YXR1cyA9IDAsIGVjY19mYWlsZWQgPSAwOwogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CkBAIC0xMDUxLDEyICsxMTMyLDkgQEAKIAl9CiAKIAkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KLQluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCAsRkxfUkVBRElORyk7CisJaWYgKGZsYWdzICYgTkFORF9HRVRfREVWSUNFKQorCQluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCwgRkxfUkVBRElORyk7CiAKLQkvKiB1c2UgdXNlcnNwYWNlIHN1cHBsaWVkIG9vYmluZm8sIGlmIHplcm8gKi8KLQlpZiAob29ic2VsID09IE5VTEwpCi0JCW9vYnNlbCA9ICZtdGQtPm9vYmluZm87Ci0JCiAJLyogQXV0b3BsYWNlIG9mIG9vYiBkYXRhID8gVXNlIHRoZSBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUgKi8KIAlpZiAob29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMQUNFKQogCQlvb2JzZWwgPSB0aGlzLT5hdXRvb29iOwpAQCAtMTExOCw3ICsxMTk2LDggQEAKIAkJfQkKIAogCQkvKiBnZXQgb29iIGFyZWEsIGlmIHdlIGhhdmUgbm8gb29iIGJ1ZmZlciBmcm9tIGZzLWRyaXZlciAqLwotCQlpZiAoIW9vYl9idWYgfHwgb29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMQUNFKQorCQlpZiAoIW9vYl9idWYgfHwgb29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMQUNFIHx8CisJCQlvb2JzZWwtPnVzZWVjYyA9PSBNVERfTkFOREVDQ19BVVRPUExfVVNSKQogCQkJb29iX2RhdGEgPSAmdGhpcy0+ZGF0YV9idWZbZW5kXTsKIAogCQllY2NzdGVwcyA9IHRoaXMtPmVjY3N0ZXBzOwpAQCAtMTE1NSw3ICsxMjM0LDggQEAKIAkJCQkJLyogV2UgY2FsYyBlcnJvciBjb3JyZWN0aW9uIGRpcmVjdGx5LCBpdCBjaGVja3MgdGhlIGh3CiAJCQkJCSAqIGdlbmVyYXRvciBmb3IgYW4gZXJyb3IsIHJlYWRzIGJhY2sgdGhlIHN5bmRyb21lIGFuZAogCQkJCQkgKiBkb2VzIHRoZSBlcnJvciBjb3JyZWN0aW9uIG9uIHRoZSBmbHkgKi8KLQkJCQkJaWYgKHRoaXMtPmNvcnJlY3RfZGF0YShtdGQsICZkYXRhX3BvaVtkYXRpZHhdLCAmb29iX2RhdGFbaV0sICZlY2NfY29kZVtpXSkgPT0gLTEpIHsKKwkJCQkJZWNjX3N0YXR1cyA9IHRoaXMtPmNvcnJlY3RfZGF0YShtdGQsICZkYXRhX3BvaVtkYXRpZHhdLCAmb29iX2RhdGFbaV0sICZlY2NfY29kZVtpXSk7CisJCQkJCWlmICgoZWNjX3N0YXR1cyA9PSAtMSkgfHwgKGVjY19zdGF0dXMgPiAoZmxhZ3MgJiYgMHhmZikpKSB7CiAJCQkJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfcmVhZF9lY2M6ICIgCiAJCQkJCQkJIkZhaWxlZCBFQ0MgcmVhZCwgcGFnZSAweCUwOHggb24gY2hpcCAlZFxuIiwgcGFnZSwgY2hpcG5yKTsKIAkJCQkJCWVjY19mYWlsZWQrKzsKQEAgLTExOTQsNyArMTI3NCw3IEBACiAJCQkJcFtpXSA9IGVjY19zdGF0dXM7CiAJCQl9CiAJCQkKLQkJCWlmIChlY2Nfc3RhdHVzID09IC0xKSB7CQorCQkJaWYgKChlY2Nfc3RhdHVzID09IC0xKSB8fCAoZWNjX3N0YXR1cyA+IChmbGFncyAmJiAweGZmKSkpIHsJCiAJCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3JlYWRfZWNjOiAiICJGYWlsZWQgRUNDIHJlYWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlKTsKIAkJCQllY2NfZmFpbGVkKys7CiAJCQl9CkBAIC0xMjA2LDE0ICsxMjg2LDE0IEBACiAJCQkvKiB3aXRob3V0IGF1dG9wbGFjZS4gTGVnYWN5IG1vZGUgdXNlZCBieSBZQUZGUzEgKi8KIAkJCXN3aXRjaChvb2JzZWwtPnVzZWVjYykgewogCQkJY2FzZSBNVERfTkFOREVDQ19BVVRPUExBQ0U6CisJCQljYXNlIE1URF9OQU5ERUNDX0FVVE9QTF9VU1I6CiAJCQkJLyogV2FsayB0aHJvdWdoIHRoZSBhdXRvcGxhY2UgY2h1bmtzICovCi0JCQkJZm9yIChpID0gMCwgaiA9IDA7IGogPCBtdGQtPm9vYmF2YWlsOyBpKyspIHsKKwkJCQlmb3IgKGkgPSAwOyBvb2JzZWwtPm9vYmZyZWVbaV1bMV07IGkrKykgewogCQkJCQlpbnQgZnJvbSA9IG9vYnNlbC0+b29iZnJlZVtpXVswXTsKIAkJCQkJaW50IG51bSA9IG9vYnNlbC0+b29iZnJlZVtpXVsxXTsKIAkJCQkJbWVtY3B5KCZvb2JfYnVmW29vYl0sICZvb2JfZGF0YVtmcm9tXSwgbnVtKTsKLQkJCQkJais9IG51bTsKKwkJCQkJb29iICs9IG51bTsKIAkJCQl9Ci0JCQkJb29iICs9IG10ZC0+b29iYXZhaWw7CiAJCQkJYnJlYWs7CiAJCQljYXNlIE1URF9OQU5ERUNDX1BMQUNFOgogCQkJCS8qIFlBRkZTMSBsZWdhY3kgbW9kZSAqLwpAQCAtMTIzOSw3ICsxMzE5LDcgQEAKIAkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIAogCQkJdWRlbGF5ICh0aGlzLT5jaGlwX2RlbGF5KTsKIAkJZWxzZQotCQkJd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7CQorCQkJbmFuZF93YWl0X3JlYWR5KG10ZCk7CiAJCQkKIAkJaWYgKHJlYWQgPT0gbGVuKQogCQkJYnJlYWs7CQpAQCAtMTI2NCw3ICsxMzQ0LDggQEAKIAl9CiAKIAkvKiBEZXNlbGVjdCBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgZGV2aWNlICovCi0JbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOworCWlmIChmbGFncyAmIE5BTkRfR0VUX0RFVklDRSkKKwkJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOwogCiAJLyoKIAkgKiBSZXR1cm4gc3VjY2VzcywgaWYgbm8gRUNDIGZhaWx1cmVzLCBlbHNlIC1FQkFETVNHCkBAIC0xMzM3LDcgKzE0MTgsNyBAQAogCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkgCiAJCQl1ZGVsYXkgKHRoaXMtPmNoaXBfZGVsYXkpOwogCQllbHNlCi0JCQl3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsJCisJCQluYW5kX3dhaXRfcmVhZHkobXRkKTsKIAogCQkvKiBSZWFkIG1vcmUgPyAqLwogCQlpZiAoaSA8IGxlbikgewpAQCAtMTQxNyw3ICsxNDk4LDcgQEAKIAkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIAogCQkJdWRlbGF5ICh0aGlzLT5jaGlwX2RlbGF5KTsKIAkJZWxzZQotCQkJd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7CQorCQkJbmFuZF93YWl0X3JlYWR5KG10ZCk7CiAJCQkKIAkJLyogQ2hlY2ssIGlmIHRoZSBjaGlwIHN1cHBvcnRzIGF1dG8gcGFnZSBpbmNyZW1lbnQgKi8gCiAJCWlmICghTkFORF9DQU5BVVRPSU5DUih0aGlzKSB8fCAhKHBhZ2UgJiBibG9ja2NoZWNrKSkKQEAgLTE1NjcsNiArMTY0OCw4IEBACiAJCW9vYnNlbCA9IHRoaXMtPmF1dG9vb2I7CiAJCWF1dG9wbGFjZSA9IDE7CiAJfQkKKwlpZiAob29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMX1VTUikKKwkJYXV0b3BsYWNlID0gMTsKIAogCS8qIFNldHVwIHZhcmlhYmxlcyBhbmQgb29iIGJ1ZmZlciAqLwogCXRvdGFscGFnZXMgPSBsZW4gPj4gdGhpcy0+cGFnZV9zaGlmdDsKQEAgLTE3MzMsNyArMTgxNiw3IEBACiAJc3RhdHVzID0gdGhpcy0+d2FpdGZ1bmMgKG10ZCwgdGhpcywgRkxfV1JJVElORyk7CiAKIAkvKiBTZWUgaWYgZGV2aWNlIHRoaW5rcyBpdCBzdWNjZWVkZWQgKi8KLQlpZiAoc3RhdHVzICYgMHgwMSkgeworCWlmIChzdGF0dXMgJiBOQU5EX1NUQVRVU19GQUlMKSB7CiAJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAibmFuZF93cml0ZV9vb2I6ICIgIkZhaWxlZCB3cml0ZSwgcGFnZSAweCUwOHhcbiIsIHBhZ2UpOwogCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dDsKQEAgLTE4NDEsNiArMTkyNCw4IEBACiAJCW9vYnNlbCA9IHRoaXMtPmF1dG9vb2I7CiAJCWF1dG9wbGFjZSA9IDE7CiAJfQkKKwlpZiAob29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMX1VTUikKKwkJYXV0b3BsYWNlID0gMTsKIAogCS8qIFNldHVwIHN0YXJ0IHBhZ2UgKi8KIAlwYWdlID0gKGludCkgKHRvID4+IHRoaXMtPnBhZ2Vfc2hpZnQpOwpAQCAtMTk4Nyw2ICsyMDcyLDcgQEAKIAlyZXR1cm4gbmFuZF9lcmFzZV9uYW5kIChtdGQsIGluc3RyLCAwKTsKIH0KICAKKyNkZWZpbmUgQkJUX1BBR0VfTUFTSwkweGZmZmZmZjNmCiAvKioKICAqIG5hbmRfZXJhc2VfaW50ZXJuIC0gW05BTkQgSW50ZXJmYWNlXSBlcmFzZSBibG9jayhzKQogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTE5OTksNiArMjA4NSwxMCBAQAogewogCWludCBwYWdlLCBsZW4sIHN0YXR1cywgcGFnZXNfcGVyX2Jsb2NrLCByZXQsIGNoaXBucjsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCWludCByZXdyaXRlX2JidFtOQU5EX01BWF9DSElQU109ezB9OwkvKiBmbGFncyB0byBpbmRpY2F0ZSB0aGUgcGFnZSwgaWYgYmJ0IG5lZWRzIHRvIGJlIHJld3JpdHRlbi4gKi8KKwl1bnNpZ25lZCBpbnQgYmJ0X21hc2tlZF9wYWdlOwkJLyogYmJ0IG1hc2sgdG8gY29tcGFyZSB0byBwYWdlIGJlaW5nIGVyYXNlZC4gKi8KKwkJCQkJCS8qIEl0IGlzIHVzZWQgdG8gc2VlIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgaW4gdGhlIHNhbWUgKi8KKwkJCQkJCS8qICAgMjU2IGJsb2NrIGdyb3VwIGFuZCB0aGUgc2FtZSBiYW5rIGFzIHRoZSBiYnQuICovCiAKIAlERUJVRyAoTVREX0RFQlVHX0xFVkVMMywKIAkgICAgICAgIm5hbmRfZXJhc2U6IHN0YXJ0ID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgKHVuc2lnbmVkIGludCkgaW5zdHItPmFkZHIsICh1bnNpZ25lZCBpbnQpIGluc3RyLT5sZW4pOwpAQCAtMjA0NCw2ICsyMTM0LDEzIEBACiAJCWdvdG8gZXJhc2VfZXhpdDsKIAl9CiAKKwkvKiBpZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCwgc2V0IHRoZSBCQlQgcGFnZSBtYXNrIHRvIHNlZSBpZiB0aGUgQkJUIHNob3VsZCBiZSByZXdyaXR0ZW4gKi8KKwlpZiAodGhpcy0+b3B0aW9ucyAmIEJCVF9BVVRPX1JFRlJFU0gpIHsKKwkJYmJ0X21hc2tlZF9wYWdlID0gdGhpcy0+YmJ0X3RkLT5wYWdlc1tjaGlwbnJdICYgQkJUX1BBR0VfTUFTSzsKKwl9IGVsc2UgeworCQliYnRfbWFza2VkX3BhZ2UgPSAweGZmZmZmZmZmOwkvKiBzaG91bGQgbm90IG1hdGNoIGFueXRoaW5nICovCisJfQorCiAJLyogTG9vcCB0aHJvdWdoIHRoZSBwYWdlcyAqLwogCWxlbiA9IGluc3RyLT5sZW47CiAKQEAgLTIwNjYsMTMgKzIxNjMsMjYgQEAKIAkJCiAJCXN0YXR1cyA9IHRoaXMtPndhaXRmdW5jIChtdGQsIHRoaXMsIEZMX0VSQVNJTkcpOwogCisJCS8qIFNlZSBpZiBvcGVyYXRpb24gZmFpbGVkIGFuZCBhZGRpdGlvbmFsIHN0YXR1cyBjaGVja3MgYXJlIGF2YWlsYWJsZSAqLworCQlpZiAoKHN0YXR1cyAmIE5BTkRfU1RBVFVTX0ZBSUwpICYmICh0aGlzLT5lcnJzdGF0KSkgeworCQkJc3RhdHVzID0gdGhpcy0+ZXJyc3RhdChtdGQsIHRoaXMsIEZMX0VSQVNJTkcsIHN0YXR1cywgcGFnZSk7CisJCX0KKwogCQkvKiBTZWUgaWYgYmxvY2sgZXJhc2Ugc3VjY2VlZGVkICovCi0JCWlmIChzdGF0dXMgJiAweDAxKSB7CisJCWlmIChzdGF0dXMgJiBOQU5EX1NUQVRVU19GQUlMKSB7CiAJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfZXJhc2U6ICIgIkZhaWxlZCBlcmFzZSwgcGFnZSAweCUwOHhcbiIsIHBhZ2UpOwogCQkJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0ZBSUxFRDsKIAkJCWluc3RyLT5mYWlsX2FkZHIgPSAocGFnZSA8PCB0aGlzLT5wYWdlX3NoaWZ0KTsKIAkJCWdvdG8gZXJhc2VfZXhpdDsKIAkJfQorCisJCS8qIGlmIEJCVCByZXF1aXJlcyByZWZyZXNoLCBzZXQgdGhlIEJCVCByZXdyaXRlIGZsYWcgdG8gdGhlIHBhZ2UgYmVpbmcgZXJhc2VkICovCisJCWlmICh0aGlzLT5vcHRpb25zICYgQkJUX0FVVE9fUkVGUkVTSCkgeworCQkJaWYgKCgocGFnZSAmIEJCVF9QQUdFX01BU0spID09IGJidF9tYXNrZWRfcGFnZSkgJiYgCisJCQkgICAgIChwYWdlICE9IHRoaXMtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSkpIHsKKwkJCQlyZXdyaXRlX2JidFtjaGlwbnJdID0gKHBhZ2UgPDwgdGhpcy0+cGFnZV9zaGlmdCk7CisJCQl9CisJCX0KIAkJCiAJCS8qIEluY3JlbWVudCBwYWdlIGFkZHJlc3MgYW5kIGRlY3JlbWVudCBsZW5ndGggKi8KIAkJbGVuIC09ICgxIDw8IHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQpOwpAQCAtMjA4Myw2ICsyMTkzLDEzIEBACiAJCQljaGlwbnIrKzsKIAkJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOwogCQkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOworCisJCQkvKiBpZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCBhbmQgQkJULVBFUkNISVAsIAorCQkJICogICBzZXQgdGhlIEJCVCBwYWdlIG1hc2sgdG8gc2VlIGlmIHRoaXMgQkJUIHNob3VsZCBiZSByZXdyaXR0ZW4gKi8KKwkJCWlmICgodGhpcy0+b3B0aW9ucyAmIEJCVF9BVVRPX1JFRlJFU0gpICYmICh0aGlzLT5iYnRfdGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKSkgeworCQkJCWJidF9tYXNrZWRfcGFnZSA9IHRoaXMtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSAmIEJCVF9QQUdFX01BU0s7CisJCQl9CisKIAkJfQogCX0KIAlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRE9ORTsKQEAgLTIwOTcsNiArMjIxNCwxOCBAQAogCS8qIERlc2VsZWN0IGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UgKi8KIAluYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7CiAKKwkvKiBpZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCBhbmQgZXJhc2Ugd2FzIHN1Y2Nlc3NmdWwsIHJld3JpdGUgYW55IHNlbGVjdGVkIGJhZCBibG9jayB0YWJsZXMgKi8KKwlpZiAoKHRoaXMtPm9wdGlvbnMgJiBCQlRfQVVUT19SRUZSRVNIKSAmJiAoIXJldCkpIHsKKwkJZm9yIChjaGlwbnIgPSAwOyBjaGlwbnIgPCB0aGlzLT5udW1jaGlwczsgY2hpcG5yKyspIHsKKwkJCWlmIChyZXdyaXRlX2JidFtjaGlwbnJdKSB7CisJCQkJLyogdXBkYXRlIHRoZSBCQlQgZm9yIGNoaXAgKi8KKwkJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfZXJhc2VfbmFuZDogbmFuZF91cGRhdGVfYmJ0ICglZDoweCUweCAweCUweClcbiIsIAorCQkJCQljaGlwbnIsIHJld3JpdGVfYmJ0W2NoaXBucl0sIHRoaXMtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSk7CisJCQkJbmFuZF91cGRhdGVfYmJ0IChtdGQsIHJld3JpdGVfYmJ0W2NoaXBucl0pOworCQkJfQorCQl9CisJfQorCiAJLyogUmV0dXJuIG1vcmUgb3IgbGVzcyBoYXBweSAqLwogCXJldHVybiByZXQ7CiB9CkBAIC0yMTY4LDcgKzIyOTcsNyBAQAogICovCiBpbnQgbmFuZF9zY2FuIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1heGNoaXBzKQogewotCWludCBpLCBqLCBuYW5kX21hZl9pZCwgbmFuZF9kZXZfaWQsIGJ1c3c7CisJaW50IGksIG5hbmRfbWFmX2lkLCBuYW5kX2Rldl9pZCwgYnVzdywgbWFmX2lkOwogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CiAKIAkvKiBHZXQgYnVzd2lkdGggdG8gc2VsZWN0IHRoZSBjb3JyZWN0IGZ1bmN0aW9ucyovCkBAIC0yMjU2LDEyICsyMzg1LDE4IEBACiAJCQlidXN3ID0gbmFuZF9mbGFzaF9pZHNbaV0ub3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTY7CiAJCX0KIAorCQkvKiBUcnkgdG8gaWRlbnRpZnkgbWFudWZhY3R1cmVyICovCisJCWZvciAobWFmX2lkID0gMDsgbmFuZF9tYW51Zl9pZHNbbWFmX2lkXS5pZCAhPSAweDA7IG1hZl9pZCsrKSB7CisJCQlpZiAobmFuZF9tYW51Zl9pZHNbbWFmX2lkXS5pZCA9PSBuYW5kX21hZl9pZCkKKwkJCQlicmVhazsKKwkJfQorCiAJCS8qIENoZWNrLCBpZiBidXN3aWR0aCBpcyBjb3JyZWN0LiBIYXJkd2FyZSBkcml2ZXJzIHNob3VsZCBzZXQKIAkJICogdGhpcyBjb3JyZWN0ICEgKi8KIAkJaWYgKGJ1c3cgIT0gKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSkgewogCQkJcHJpbnRrIChLRVJOX0lORk8gIk5BTkQgZGV2aWNlOiBNYW51ZmFjdHVyZXIgSUQ6IgogCQkJCSIgMHglMDJ4LCBDaGlwIElEOiAweCUwMnggKCVzICVzKVxuIiwgbmFuZF9tYWZfaWQsIG5hbmRfZGV2X2lkLCAKLQkJCQluYW5kX21hbnVmX2lkc1tpXS5uYW1lICwgbXRkLT5uYW1lKTsKKwkJCQluYW5kX21hbnVmX2lkc1ttYWZfaWRdLm5hbWUgLCBtdGQtPm5hbWUpOwogCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgCiAJCQkJIk5BTkQgYnVzIHdpZHRoICVkIGluc3RlYWQgJWQgYml0XG4iLCAKIAkJCQkJKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSA/IDE2IDogOCwKQEAgLTIzMDAsMTQgKzI0MzUsOSBAQAogCQlpZiAobXRkLT5vb2JibG9jayA+IDUxMiAmJiB0aGlzLT5jbWRmdW5jID09IG5hbmRfY29tbWFuZCkKIAkJCXRoaXMtPmNtZGZ1bmMgPSBuYW5kX2NvbW1hbmRfbHA7CiAJCQkJCi0JCS8qIFRyeSB0byBpZGVudGlmeSBtYW51ZmFjdHVyZXIgKi8KLQkJZm9yIChqID0gMDsgbmFuZF9tYW51Zl9pZHNbal0uaWQgIT0gMHgwOyBqKyspIHsKLQkJCWlmIChuYW5kX21hbnVmX2lkc1tqXS5pZCA9PSBuYW5kX21hZl9pZCkKLQkJCQlicmVhazsKLQkJfQogCQlwcmludGsgKEtFUk5fSU5GTyAiTkFORCBkZXZpY2U6IE1hbnVmYWN0dXJlciBJRDoiCiAJCQkiIDB4JTAyeCwgQ2hpcCBJRDogMHglMDJ4ICglcyAlcylcbiIsIG5hbmRfbWFmX2lkLCBuYW5kX2Rldl9pZCwgCi0JCQluYW5kX21hbnVmX2lkc1tqXS5uYW1lICwgbmFuZF9mbGFzaF9pZHNbaV0ubmFtZSk7CisJCQluYW5kX21hbnVmX2lkc1ttYWZfaWRdLm5hbWUgLCBuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yMzg4LDEyICsyNTE4LDkgQEAKIAkKIAkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgdGhlIGZpbGVzeXN0ZW0gdG8gcGxhY2UgZnMgZGVwZW5kZW5kCiAJICogb29iIGRhdGEgKi8KLQlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpIHsKLQkJbXRkLT5vb2JhdmFpbCA9IG10ZC0+b29ic2l6ZSAtICh0aGlzLT5hdXRvb29iLT5lY2NieXRlcyArIDIpOwotCQlpZiAodGhpcy0+YXV0b29vYi0+ZWNjYnl0ZXMgJiAweDAxKQotCQkJbXRkLT5vb2JhdmFpbC0tOwotCX0gZWxzZQotCQltdGQtPm9vYmF2YWlsID0gbXRkLT5vb2JzaXplIC0gKHRoaXMtPmF1dG9vb2ItPmVjY2J5dGVzICsgMSk7CisJbXRkLT5vb2JhdmFpbCA9IDA7CisJZm9yIChpID0gMDsgdGhpcy0+YXV0b29vYi0+b29iZnJlZVtpXVsxXTsgaSsrKQorCQltdGQtPm9vYmF2YWlsICs9IHRoaXMtPmF1dG9vb2ItPm9vYmZyZWVbaV1bMV07CiAKIAkvKiAKIAkgKiBjaGVjayBFQ0MgbW9kZSwgZGVmYXVsdCB0byBzb2Z0d2FyZQpAQCAtMjUyNCw2ICsyNjUxLDEwIEBACiAJbWVtY3B5KCZtdGQtPm9vYmluZm8sIHRoaXMtPmF1dG9vb2IsIHNpemVvZihtdGQtPm9vYmluZm8pKTsKIAogCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkKKwkvKiBDaGVjaywgaWYgd2Ugc2hvdWxkIHNraXAgdGhlIGJhZCBibG9jayB0YWJsZSBzY2FuICovCisJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1NLSVBfQkJUU0NBTikKKwkJcmV0dXJuIDA7CiAKIAkvKiBCdWlsZCBiYWQgYmxvY2sgdGFibGUgKi8KIAlyZXR1cm4gdGhpcy0+c2Nhbl9iYnQgKG10ZCk7CkBAIC0yNTU1LDggKzI2ODYsOCBAQAogCQlrZnJlZSAodGhpcy0+ZGF0YV9idWYpOwogfQogCi1FWFBPUlRfU1lNQk9MIChuYW5kX3NjYW4pOwotRVhQT1JUX1NZTUJPTCAobmFuZF9yZWxlYXNlKTsKK0VYUE9SVF9TWU1CT0xfR1BMIChuYW5kX3NjYW4pOworRVhQT1JUX1NZTUJPTF9HUEwgKG5hbmRfcmVsZWFzZSk7CiAKIE1PRFVMRV9MSUNFTlNFICgiR1BMIik7CiBNT0RVTEVfQVVUSE9SICgiU3RldmVuIEouIEhpbGwgPHNqaGlsbEByZWFsaXR5ZGlsdXRlZC5jb20+LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYwppbmRleCA5YTE5NDk3Li41YWMyZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmJ0LmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCkBAIC02LDcgKzYsNyBAQAogICogICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgVGhvbWFzIEdsZWl4bmVyICh0Z2x4QGxpbnV0cm9uaXguZGUpCiAgKgotICogJElkOiBuYW5kX2JidC5jLHYgMS4yOCAyMDA0LzExLzEzIDEwOjE5OjA5IGdsZWl4bmVyIEV4cCAkCisgKiAkSWQ6IG5hbmRfYmJ0LmMsdiAxLjMzIDIwMDUvMDYvMTQgMTU6NDc6NTYgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTc3LDcgKzc3LDcgQEAKICovCiBzdGF0aWMgaW50IGNoZWNrX3BhdHRlcm4gKHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgaW50IHBhZ2xlbiwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCkKIHsKLQlpbnQgaSwgZW5kOworCWludCBpLCBlbmQgPSAwOwogCXVpbnQ4X3QgKnAgPSBidWY7CiAKIAllbmQgPSBwYWdsZW4gKyB0ZC0+b2ZmczsKQEAgLTk1LDkgKzk1LDkgQEAKIAkJCXJldHVybiAtMTsKIAl9CiAKLQlwICs9IHRkLT5sZW47Ci0JZW5kICs9IHRkLT5sZW47CiAJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkVNUFRZKSB7CisJCXAgKz0gdGQtPmxlbjsKKwkJZW5kICs9IHRkLT5sZW47CiAJCWZvciAoaSA9IGVuZDsgaSA8IGxlbjsgaSsrKSB7CiAJCQlpZiAoKnArKyAhPSAweGZmKQogCQkJCXJldHVybiAtMTsKQEAgLTEwNiw2ICsxMDYsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqIAorICogY2hlY2tfc2hvcnRfcGF0dGVybiAtIFtHRU5FUklDXSBjaGVjayBpZiBhIHBhdHRlcm4gaXMgaW4gdGhlIGJ1ZmZlcgorICogQGJ1ZjoJdGhlIGJ1ZmZlciB0byBzZWFyY2gKKyAqIEBsZW46CXRoZSBsZW5ndGggb2YgYnVmZmVyIHRvIHNlYXJjaAorICogQHBhZ2xlbjoJdGhlIHBhZ2VsZW5ndGgKKyAqIEB0ZDoJCXNlYXJjaCBwYXR0ZXJuIGRlc2NyaXB0b3IKKyAqCisgKiBDaGVjayBmb3IgYSBwYXR0ZXJuIGF0IHRoZSBnaXZlbiBwbGFjZS4gVXNlZCB0byBzZWFyY2ggYmFkIGJsb2NrCisgKiB0YWJsZXMgYW5kIGdvb2QgLyBiYWQgYmxvY2sgaWRlbnRpZmllcnMuIFNhbWUgYXMgY2hlY2tfcGF0dGVybiwgYnV0IAorICogbm8gb3B0aW9uYWwgZW1wdHkgY2hlY2sgYW5kIHRoZSBwYXR0ZXJuIGlzIGV4cGVjdGVkIHRvIHN0YXJ0CisgKiBhdCBvZmZzZXQgMC4KKyAqCisqLworc3RhdGljIGludCBjaGVja19zaG9ydF9wYXR0ZXJuICh1aW50OF90ICpidWYsIGludCBsZW4sIGludCBwYWdsZW4sIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQpCit7CisJaW50IGk7CisJdWludDhfdCAqcCA9IGJ1ZjsKKworCS8qIENvbXBhcmUgdGhlIHBhdHRlcm4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGQtPmxlbjsgaSsrKSB7CisJCWlmIChwW2ldICE9IHRkLT5wYXR0ZXJuW2ldKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiByZWFkX2JidCAtIFtHRU5FUklDXSBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgc3RhcnRpbmcgZnJvbSBwYWdlCiAgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMjUyLDcgKzI3OCw3IEBACiAgKiBDcmVhdGUgYSBiYWQgYmxvY2sgdGFibGUgYnkgc2Nhbm5pbmcgdGhlIGRldmljZQogICogZm9yIHRoZSBnaXZlbiBnb29kL2JhZCBibG9jayBpZGVudGlmeSBwYXR0ZXJuCiAgKi8KLXN0YXRpYyB2b2lkIGNyZWF0ZV9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQsIGludCBjaGlwKQorc3RhdGljIGludCBjcmVhdGVfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkLCBpbnQgY2hpcCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCWludCBpLCBqLCBudW1ibG9ja3MsIGxlbiwgc2NhbmxlbjsKQEAgLTI3MCw5ICsyOTYsMTcgQEAKIAkJZWxzZQkKIAkJCWxlbiA9IDE7CiAJfQotCXNjYW5sZW4JPSBtdGQtPm9vYmJsb2NrICsgbXRkLT5vb2JzaXplOwotCXJlYWRsZW4gPSBsZW4gKiBtdGQtPm9vYmJsb2NrOwotCW9vYmxlbiA9IGxlbiAqIG10ZC0+b29ic2l6ZTsKKworCWlmICghKGJkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkVNUFRZKSkgeworCQkvKiBXZSBuZWVkIG9ubHkgcmVhZCBmZXcgYnl0ZXMgZnJvbSB0aGUgT09CIGFyZWEgKi8KKwkJc2NhbmxlbiA9IG9vYmxlbiA9IDA7CisJCXJlYWRsZW4gPSBiZC0+bGVuOworCX0gZWxzZSB7CisJCS8qIEZ1bGwgcGFnZSBjb250ZW50IHNob3VsZCBiZSByZWFkICovCisJCXNjYW5sZW4JPSBtdGQtPm9vYmJsb2NrICsgbXRkLT5vb2JzaXplOworCQlyZWFkbGVuID0gbGVuICogbXRkLT5vb2JibG9jazsKKwkJb29ibGVuID0gbGVuICogbXRkLT5vb2JzaXplOworCX0KIAogCWlmIChjaGlwID09IC0xKSB7CiAJCS8qIE5vdGUgdGhhdCBudW1ibG9ja3MgaXMgMiAqIChyZWFsIG51bWJsb2NrcykgaGVyZSwgc2VlIGkrPTIgYmVsb3cgYXMgaXQKQEAgLTI4NCw3ICszMTgsNyBAQAogCQlpZiAoY2hpcCA+PSB0aGlzLT5udW1jaGlwcykgewogCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImNyZWF0ZV9iYnQoKTogY2hpcG5yICglZCkgPiBhdmFpbGFibGUgY2hpcHMgKCVkKVxuIiwKIAkJCQljaGlwICsgMSwgdGhpcy0+bnVtY2hpcHMpOwotCQkJcmV0dXJuOwkKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCW51bWJsb2NrcyA9IHRoaXMtPmNoaXBzaXplID4+ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKTsKIAkJc3RhcnRibG9jayA9IGNoaXAgKiBudW1ibG9ja3M7CkBAIC0yOTMsMTggKzMyNyw0MSBAQAogCX0KIAkKIAlmb3IgKGkgPSBzdGFydGJsb2NrOyBpIDwgbnVtYmxvY2tzOykgewotCQluYW5kX3JlYWRfcmF3IChtdGQsIGJ1ZiwgZnJvbSwgcmVhZGxlbiwgb29ibGVuKTsKKwkJaW50IHJldDsKKwkJCisJCWlmIChiZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5FTVBUWSkKKwkJCWlmICgocmV0ID0gbmFuZF9yZWFkX3JhdyAobXRkLCBidWYsIGZyb20sIHJlYWRsZW4sIG9vYmxlbikpKQorCQkJCXJldHVybiByZXQ7CisKIAkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0JCQlpZiAoY2hlY2tfcGF0dGVybiAoJmJ1ZltqICogc2Nhbmxlbl0sIHNjYW5sZW4sIG10ZC0+b29iYmxvY2ssIGJkKSkgewotCQkJCXRoaXMtPmJidFtpID4+IDNdIHw9IDB4MDMgPDwgKGkgJiAweDYpOwotCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCYWQgZXJhc2VibG9jayAlZCBhdCAweCUwOHhcbiIsIAotCQkJCQlpID4+IDEsICh1bnNpZ25lZCBpbnQpIGZyb20pOwotCQkJCWJyZWFrOworCQkJaWYgKCEoYmQtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQ0FORU1QVFkpKSB7CisJCQkJc2l6ZV90IHJldGxlbjsKKwkJCQkKKwkJCQkvKiBObyBuZWVkIHRvIHJlYWQgcGFnZXMgZnVsbHksIGp1c3QgcmVhZCByZXF1aXJlZCBPT0IgYnl0ZXMgKi8KKwkJCQlyZXQgPSBtdGQtPnJlYWRfb29iKG10ZCwgZnJvbSArIGogKiBtdGQtPm9vYmJsb2NrICsgYmQtPm9mZnMsCisJCQkJCQkJcmVhZGxlbiwgJnJldGxlbiwgJmJ1ZlswXSk7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKworCQkJCWlmIChjaGVja19zaG9ydF9wYXR0ZXJuICgmYnVmW2ogKiBzY2FubGVuXSwgc2NhbmxlbiwgbXRkLT5vb2JibG9jaywgYmQpKSB7CisJCQkJCXRoaXMtPmJidFtpID4+IDNdIHw9IDB4MDMgPDwgKGkgJiAweDYpOworCQkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiQmFkIGVyYXNlYmxvY2sgJWQgYXQgMHglMDh4XG4iLCAKKwkJCQkJCWkgPj4gMSwgKHVuc2lnbmVkIGludCkgZnJvbSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNoZWNrX3BhdHRlcm4gKCZidWZbaiAqIHNjYW5sZW5dLCBzY2FubGVuLCBtdGQtPm9vYmJsb2NrLCBiZCkpIHsKKwkJCQkJdGhpcy0+YmJ0W2kgPj4gM10gfD0gMHgwMyA8PCAoaSAmIDB4Nik7CisJCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCYWQgZXJhc2VibG9jayAlZCBhdCAweCUwOHhcbiIsIAorCQkJCQkJaSA+PiAxLCAodW5zaWduZWQgaW50KSBmcm9tKTsKKwkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQogCQl9CiAJCWkgKz0gMjsKIAkJZnJvbSArPSAoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC01ODksMTQgKzY0NiwxMiBAQAogICogVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYSBtZW1vcnkgYmFzZWQgYmJ0IGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2UgCiAgKiBmb3IgbWFudWZhY3R1cmVyIC8gc29mdHdhcmUgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzCiAqLwotc3RhdGljIGludCBuYW5kX21lbW9yeV9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkKQorc3RhdGljIGlubGluZSBpbnQgbmFuZF9tZW1vcnlfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCi0JLyogRW5zdXJlIHRoYXQgd2Ugb25seSBzY2FuIGZvciB0aGUgcGF0dGVybiBhbmQgbm90aGluZyBlbHNlICovCi0JYmQtPm9wdGlvbnMgPSAwOwotCWNyZWF0ZV9iYnQgKG10ZCwgdGhpcy0+ZGF0YV9idWYsIGJkLCAtMSk7Ci0JcmV0dXJuIDA7CisJYmQtPm9wdGlvbnMgJj0gfk5BTkRfQkJUX1NDQU5FTVBUWTsKKwlyZXR1cm4gY3JlYXRlX2JidCAobXRkLCB0aGlzLT5kYXRhX2J1ZiwgYmQsIC0xKTsKIH0KIAogLyoqCkBAIC04MDgsOCArODYzLDE0IEBACiAJLyogSWYgbm8gcHJpbWFyeSB0YWJsZSBkZWNyaXB0b3IgaXMgZ2l2ZW4sIHNjYW4gdGhlIGRldmljZQogCSAqIHRvIGJ1aWxkIGEgbWVtb3J5IGJhc2VkIGJhZCBibG9jayB0YWJsZQogCSAqLwotCWlmICghdGQpCi0JCXJldHVybiBuYW5kX21lbW9yeV9iYnQobXRkLCBiZCk7CisJaWYgKCF0ZCkgeworCQlpZiAoKHJlcyA9IG5hbmRfbWVtb3J5X2JidChtdGQsIGJkKSkpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIm5hbmRfYmJ0OiBDYW4ndCBzY2FuIGZsYXNoIGFuZCBidWlsZCB0aGUgUkFNLWJhc2VkIEJCVFxuIik7CisJCQlrZnJlZSAodGhpcy0+YmJ0KTsKKwkJCXRoaXMtPmJidCA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CiAKIAkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgZm9yIG9uZSBlcmFzZWJsb2NrIGluY2wuIG9vYiAqLwogCWxlbiA9ICgxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CkBAIC05MDQsMTQgKzk2NSwxMSBAQAogfQogCiAvKiBEZWZpbmUgc29tZSBnZW5lcmljIGJhZCAvIGdvb2QgYmxvY2sgc2NhbiBwYXR0ZXJuIHdoaWNoIGFyZSB1c2VkIAotICogd2hpbGUgc2Nhbm5pbmcgYSBkZXZpY2UgZm9yIGZhY3RvcnkgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzCi0gKiAKLSAqIFRoZSBtZW1vcnkgYmFzZWQgcGF0dGVybnMganVzdCAKLSAqLworICogd2hpbGUgc2Nhbm5pbmcgYSBkZXZpY2UgZm9yIGZhY3RvcnkgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzLiAqLwogc3RhdGljIHVpbnQ4X3Qgc2Nhbl9mZl9wYXR0ZXJuW10gPSB7IDB4ZmYsIDB4ZmYgfTsKIAogc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBzbWFsbHBhZ2VfbWVtb3J5YmFzZWQgPSB7Ci0JLm9wdGlvbnMgPSAwLAorCS5vcHRpb25zID0gTkFORF9CQlRfU0NBTjJORFBBR0UsCiAJLm9mZnMgPSA1LAogCS5sZW4gPSAxLAogCS5wYXR0ZXJuID0gc2Nhbl9mZl9wYXR0ZXJuCkBAIC0xMDQyLDcgKzExMDAsNyBAQAogCXJlcyA9ICh0aGlzLT5iYnRbYmxvY2sgPj4gM10gPj4gKGJsb2NrICYgMHgwNikpICYgMHgwMzsKIAogCURFQlVHIChNVERfREVCVUdfTEVWRUwyLCAibmFuZF9pc2JhZF9iYnQoKTogYmJ0IGluZm8gZm9yIG9mZnMgMHglMDh4OiAoYmxvY2sgJWQpIDB4JTAyeFxuIiwgCi0JCSh1bnNpZ25lZCBpbnQpb2ZmcywgcmVzLCBibG9jayA+PiAxKTsKKwkJKHVuc2lnbmVkIGludClvZmZzLCBibG9jayA+PiAxLCByZXMpOwogCiAJc3dpdGNoICgoaW50KXJlcykgewogCWNhc2UgMHgwMDoJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfaWRzLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfaWRzLmMKaW5kZXggMmQ4YzQzMi4uZWZlMjQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2lkcy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9pZHMuYwpAQCAtMiw4ICsyLDggQEAKICAqICBkcml2ZXJzL210ZC9uYW5kaWRzLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFRob21hcyBHbGVpeG5lciAodGdseEBsaW51dHJvbml4LmRlKQotICAqCi0gKiAkSWQ6IG5hbmRfaWRzLmMsdiAxLjEwIDIwMDQvMDUvMjYgMTM6NDA6MTIgZ2xlaXhuZXIgRXhwICQKKyAqCisgKiAkSWQ6IG5hbmRfaWRzLmMsdiAxLjE0IDIwMDUvMDYvMjMgMDk6Mzg6NTAgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTU2LDE3ICs1NiwyNCBAQAogCXsiTkFORCA2NE1pQiAzLDNWIDE2LWJpdCIsIAkweDU2LCA1MTIsIDY0LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAogCQogCXsiTkFORCAxMjhNaUIgMSw4ViA4LWJpdCIsIAkweDc4LCA1MTIsIDEyOCwgMHg0MDAwLCAwfSwKKwl7Ik5BTkQgMTI4TWlCIDEsOFYgOC1iaXQiLCAJMHgzOSwgNTEyLCAxMjgsIDB4NDAwMCwgMH0sCiAJeyJOQU5EIDEyOE1pQiAzLDNWIDgtYml0IiwgCTB4NzksIDUxMiwgMTI4LCAweDQwMDAsIDB9LAogCXsiTkFORCAxMjhNaUIgMSw4ViAxNi1iaXQiLCAJMHg3MiwgNTEyLCAxMjgsIDB4NDAwMCwgTkFORF9CVVNXSURUSF8xNn0sCisJeyJOQU5EIDEyOE1pQiAxLDhWIDE2LWJpdCIsIAkweDQ5LCA1MTIsIDEyOCwgMHg0MDAwLCBOQU5EX0JVU1dJRFRIXzE2fSwKIAl7Ik5BTkQgMTI4TWlCIDMsM1YgMTYtYml0IiwgCTB4NzQsIDUxMiwgMTI4LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCXsiTkFORCAxMjhNaUIgMywzViAxNi1iaXQiLCAJMHg1OSwgNTEyLCAxMjgsIDB4NDAwMCwgTkFORF9CVVNXSURUSF8xNn0sCiAJCiAJeyJOQU5EIDI1Nk1pQiAzLDNWIDgtYml0IiwgCTB4NzEsIDUxMiwgMjU2LCAweDQwMDAsIDB9LAogCi0JeyJOQU5EIDUxMk1pQiAzLDNWIDgtYml0IiwgCTB4REMsIDUxMiwgNTEyLCAweDQwMDAsIDB9LAotCQogCS8qIFRoZXNlIGFyZSB0aGUgbmV3IGNoaXBzIHdpdGggbGFyZ2UgcGFnZSBzaXplLiBUaGUgcGFnZXNpemUKIAkqIGFuZCB0aGUgZXJhc2VzaXplIGlzIGRldGVybWluZWQgZnJvbSB0aGUgZXh0ZW5kZWQgaWQgYnl0ZXMKIAkqLworCS8qNTEyIE1lZ2FiaXQgKi8KKwl7Ik5BTkQgNjRNaUIgMSw4ViA4LWJpdCIsIAkweEEyLCAwLCAgNjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDY0TWlCIDMsM1YgOC1iaXQiLCAJMHhGMiwgMCwgIDY0LCAwLCBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCA2NE1pQiAxLDhWIDE2LWJpdCIsIAkweEIyLCAwLCAgNjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9CVVNXSURUSF8xNiB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCA2NE1pQiAzLDNWIDE2LWJpdCIsIAkweEMyLCAwLCAgNjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9CVVNXSURUSF8xNiB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCQogCS8qIDEgR2lnYWJpdCAqLwogCXsiTkFORCAxMjhNaUIgMSw4ViA4LWJpdCIsIAkweEExLCAwLCAxMjgsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCiAJeyJOQU5EIDEyOE1pQiAzLDNWIDgtYml0IiwgCTB4RjEsIDAsIDEyOCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX05PX0FVVE9JTkNSfSwKQEAgLTEwMyw3ICsxMTAsNyBAQAogCSAqIEFueXdheSBKRkZTMiB3b3VsZCBpbmNyZWFzZSB0aGUgZXJhc2VibG9jayBzaXplIHNvIHdlIGNob3NlIGEgY29tYmluZWQgb25lIHdoaWNoIGNhbiBiZSBlcmFzZWQgaW4gb25lIGdvCiAJICogVGhlcmUgYXJlIG1vcmUgc3BlZWQgaW1wcm92ZW1lbnRzIGZvciByZWFkcyBhbmQgd3JpdGVzIHBvc3NpYmxlLCBidXQgbm90IGltcGxlbWVudGVkIG5vdyAKIAkgKi8KLQl7IkFORCAxMjhNaUIgMywzViA4LWJpdCIsCTB4MDEsIDIwNDgsIDEyOCwgMHg0MDAwLCBOQU5EX0lTX0FORCB8IE5BTkRfTk9fQVVUT0lOQ1IgfCBOQU5EXzRQQUdFX0FSUkFZfSwKKwl7IkFORCAxMjhNaUIgMywzViA4LWJpdCIsCTB4MDEsIDIwNDgsIDEyOCwgMHg0MDAwLCBOQU5EX0lTX0FORCB8IE5BTkRfTk9fQVVUT0lOQ1IgfCBOQU5EXzRQQUdFX0FSUkFZIHwgQkJUX0FVVE9fUkVGUkVTSH0sCiAKIAl7TlVMTCx9CiB9OwpAQCAtMTE4LDYgKzEyNSw3IEBACiAJe05BTkRfTUZSX05BVElPTkFMLCAiTmF0aW9uYWwifSwKIAl7TkFORF9NRlJfUkVORVNBUywgIlJlbmVzYXMifSwKIAl7TkFORF9NRlJfU1RNSUNSTywgIlNUIE1pY3JvIn0sCisgICAgICAgIHtOQU5EX01GUl9IWU5JWCwgIkh5bml4In0sCiAJezB4MCwgIlVua25vd24ifQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYwppbmRleCAxM2ZlZWZkLi43NTRiNmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYwpAQCAtMjIsNyArMjIsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQogICoKLSAqICRJZDogbmFuZHNpbS5jLHYgMS43IDIwMDQvMTIvMDYgMTE6NTM6MDYgZGVkZWtpbmQgRXhwICQKKyAqICRJZDogbmFuZHNpbS5jLHYgMS44IDIwMDUvMDMvMTkgMTU6MzM6NTYgZGVkZWtpbmQgRXhwICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC0xNDg0LDMzICsxNDg0LDYgQEAKIH0KIAogLyoKLSAqIEhhdmluZyBvbmx5IE5BTkQgY2hpcCBJRHMgd2UgY2FsbCBuYW5kX3NjYW4gd2hpY2ggZGV0ZWN0cyBOQU5EIGZsYXNoCi0gKiBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNhbGxzIHNjYW5fYmJ0IGluIG9yZGVyIHRvIHNjYW4vZmluZC9idWlsZCB0aGUKLSAqIE5BTkQgZmxhc2ggYmFkIGJsb2NrIHRhYmxlLiBCdXQgc2luY2UgYXQgdGhhdCBtb21lbnQgdGhlIE5BTkQgZmxhc2gKLSAqIGltYWdlIGlzbid0IGFsbG9jYXRlZCBpbiB0aGUgc2ltdWxhdG9yLCBlcnJvcnMgYXJpc2UuIFRvIGF2b2lkIHRoaXMKLSAqIHdlIHJlZGVmaW5lIHRoZSBzY2FuX2JidCBjYWxsYmFjayBhbmQgaW5pdGlhbGl6ZSB0aGUgbmFuZHNpbSBzdHJ1Y3R1cmUKLSAqIGJlZm9yZSB0aGUgZmxhc2ggbWVkaWEgc2Nhbm5pbmcuCi0gKi8KLWludCBuc19zY2FuX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsgCi0Jc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IChzdHJ1Y3QgbmFuZF9jaGlwICopbXRkLT5wcml2OwotCXN0cnVjdCBuYW5kc2ltICAgKm5zICAgPSAoc3RydWN0IG5hbmRzaW0gKikoY2hpcC0+cHJpdik7Ci0JaW50IHJldHZhbDsKLQotCWlmICghTlNfSVNfSU5JVElBTElaRUQobnMpKQotCQlpZiAoKHJldHZhbCA9IGluaXRfbmFuZHNpbShtdGQpKSAhPSAwKSB7Ci0JCQlOU19FUlIoInNjYW5fYmJ0OiBjYW4ndCBpbml0aWFsaXplIHRoZSBuYW5kc2ltIHN0cnVjdHVyZVxuIik7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JaWYgKChyZXR2YWwgPSBuYW5kX2RlZmF1bHRfYmJ0KG10ZCkpICE9IDApIHsKLQkJZnJlZV9uYW5kc2ltKG5zKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICovCiBpbnQgX19pbml0IG5zX2luaXRfbW9kdWxlKHZvaWQpCkBAIC0xNTQ0LDcgKzE1MTcsNiBAQAogCWNoaXAtPmh3Y29udHJvbCAgPSBuc19od2NvbnRyb2w7CiAJY2hpcC0+cmVhZF9ieXRlICA9IG5zX25hbmRfcmVhZF9ieXRlOwogCWNoaXAtPmRldl9yZWFkeSAgPSBuc19kZXZpY2VfcmVhZHk7Ci0JY2hpcC0+c2Nhbl9iYnQgICA9IG5zX3NjYW5fYmJ0OwogCWNoaXAtPndyaXRlX2J5dGUgPSBuc19uYW5kX3dyaXRlX2J5dGU7CiAJY2hpcC0+d3JpdGVfYnVmICA9IG5zX25hbmRfd3JpdGVfYnVmOwogCWNoaXAtPnJlYWRfYnVmICAgPSBuc19uYW5kX3JlYWRfYnVmOwpAQCAtMTU1Miw2ICsxNTI0LDcgQEAKIAljaGlwLT53cml0ZV93b3JkID0gbnNfbmFuZF93cml0ZV93b3JkOwogCWNoaXAtPnJlYWRfd29yZCAgPSBuc19uYW5kX3JlYWRfd29yZDsKIAljaGlwLT5lY2Ntb2RlICAgID0gTkFORF9FQ0NfU09GVDsKKwljaGlwLT5vcHRpb25zICAgfD0gTkFORF9TS0lQX0JCVFNDQU47CiAKIAkvKiAKIAkgKiBQZXJmb3JtIG1pbmltdW0gbmFuZHNpbSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24gdG8gaGFuZGxlCkBAIC0xNTgwLDYgKzE1NTMsMTYgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKKwlpZiAoKHJldHZhbCA9IGluaXRfbmFuZHNpbShuc210ZCkpICE9IDApIHsKKwkJTlNfRVJSKCJzY2FuX2JidDogY2FuJ3QgaW5pdGlhbGl6ZSB0aGUgbmFuZHNpbSBzdHJ1Y3R1cmVcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwkKKwlpZiAoKHJldHZhbCA9IG5hbmRfZGVmYXVsdF9iYnQobnNtdGQpKSAhPSAwKSB7CisJCWZyZWVfbmFuZHNpbShuYW5kKTsKKwkJZ290byBlcnJvcjsKKwl9CisKIAkvKiBSZWdpc3RlciBOQU5EIGFzIG9uZSBiaWcgcGFydGl0aW9uICovCiAJYWRkX210ZF9wYXJ0aXRpb25zKG5zbXRkLCAmbmFuZC0+cGFydCwgMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMgYi9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jCmluZGV4IDAyMzA1YTIuLjAzMTA1MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYwpAQCAtNiw3ICs2LDcgQEAKICAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9tdGQvbmFuZC9zcGlhLmMKICAqICAgICAgIENvcHlyaWdodCAoQykgMjAwMCBTdGV2ZW4gSi4gSGlsbCAoc2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbSkKICAqCi0gKiAkSWQ6IHJ0Y19mcm9tNC5jLHYgMS43IDIwMDQvMTEvMDQgMTI6NTM6MTAgZ2xlaXhuZXIgRXhwICQKKyAqICRJZDogcnRjX2Zyb200LmMsdiAxLjkgMjAwNS8wMS8yNCAyMDo0MDoxMSBkbWFybGluIEV4cCAkCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC04MywxMyArODMsMTggQEAKICNkZWZpbmUgUlRDX0ZST000X1JTX0VDQ19DSEsJCShSVENfRlJPTTRfTkFORF9BRERSX0ZQR0EgfCAweDAwMDAwMDcwKQogI2RlZmluZSBSVENfRlJPTTRfUlNfRUNDX0NIS19FUlJPUgkoMSA8PCA3KQogCisjZGVmaW5lIEVSUl9TVEFUX0VDQ19BVkFJTEFCTEUJCTB4MjAKKwogLyogVW5kZWZpbmUgZm9yIHNvZnR3YXJlIEVDQyAqLwogI2RlZmluZSBSVENfRlJPTTRfSFdFQ0MJMQogCisvKiBEZWZpbmUgYXMgMSBmb3Igbm8gdmlydHVhbCBlcmFzZSBibG9ja3MgKGluIEpGRlMyKSAqLworI2RlZmluZSBSVENfRlJPTTRfTk9fVklSVEJMT0NLUwkwCisKIC8qCiAgKiBNb2R1bGUgc3R1ZmYKICAqLwotc3RhdGljIHZvaWQgX19pb21lbSAqcnRjX2Zyb200X2Zpb19iYXNlID0gUDJTRUdBRERSKFJUQ19GUk9NNF9GSU9fQkFTRSk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpydGNfZnJvbTRfZmlvX2Jhc2UgPSAodm9pZCAqKVAyU0VHQUREUihSVENfRlJPTTRfRklPX0JBU0UpOwogCiBjb25zdCBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bXSA9IHsKICAgICAgICAgewpAQCAtMjY3LDcgKzI3Miw2IEBACiB9CiAKIAotCiAvKgogICogcnRjX2Zyb200X25hbmRfZGV2aWNlX3JlYWR5IC0gaGFyZHdhcmUgc3BlY2lmaWMgcmVhZHkvYnVzeSBjaGVjawogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTI4Niw2ICsyOTAsNDAgQEAKIAogfQogCisKKy8qCisgKiBkZXBsZXRlIC0gY29kZSB0byBwZXJmb3JtIGRldmljZSByZWNvdmVyeSBpbiBjYXNlIHRoZXJlIHdhcyBhIHBvd2VyIGxvc3MKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAY2hpcDoJQ2hpcCB0byBzZWxlY3QgKDAgPT0gc2xvdCAzLCAxID09IHNsb3QgNCkKKyAqCisgKiBJZiB0aGVyZSB3YXMgYSBzdWRkZW4gbG9zcyBvZiBwb3dlciBkdXJpbmcgYW4gZXJhc2Ugb3BlcmF0aW9uLCBhIAorICogImRldmljZSByZWNvdmVyeSIgb3BlcmF0aW9uIG11c3QgYmUgcGVyZm9ybWVkIHdoZW4gcG93ZXIgaXMgcmVzdG9yZWQKKyAqIHRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbi4gIFRoaXMgcm91dGluZSBwZXJmb3JtcyB0aGUgcmVxdWlyZWQgc3RlcHMKKyAqIGZvciB0aGUgcmVxdWVzdGVkIGNoaXAuCisgKgorICogU2VlIHBhZ2UgODYgb2YgdGhlIGRhdGEgc2hlZXQgZm9yIGRldGFpbHMuCisgKgorICovCitzdGF0aWMgdm9pZCBkZXBsZXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCkKK3sKKyAgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKworICAgICAgICAvKiB3YWl0IHVudGlsIGRldmljZSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsKKworCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJLyogU2VuZCB0aGUgY29tbWFuZHMgZm9yIGRldmljZSByZWNvdmVyeSwgcGhhc2UgMSAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfREVQTEVURTEsIDB4MDAwMCwgMHgwMDAwKTsKKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX0RFUExFVEUyLCAtMSwgLTEpOworCisJLyogU2VuZCB0aGUgY29tbWFuZHMgZm9yIGRldmljZSByZWNvdmVyeSwgcGhhc2UgMiAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfREVQTEVURTEsIDB4MDAwMCwgMHgwMDA0KTsKKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX0RFUExFVEUyLCAtMSwgLTEpOworCit9CisKKwogI2lmZGVmIFJUQ19GUk9NNF9IV0VDQwogLyoKICAqIHJ0Y19mcm9tNF9lbmFibGVfaHdlY2MgLSBoYXJkd2FyZSBzcGVjaWZpYyBoYXJkd2FyZSBFQ0MgZW5hYmxlIGZ1bmN0aW9uCkBAIC0zMjksNiArMzY3LDcgQEAKIAogfQogCisKIC8qCiAgKiBydGNfZnJvbTRfY2FsY3VsYXRlX2VjYyAtIGhhcmR3YXJlIHNwZWNpZmljIGNvZGUgdG8gcmVhZCBFQ0MgY29kZQogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTM1Niw2ICszOTUsNyBAQAogCWVjY19jb2RlWzddIHw9IDB4MGY7CS8qIHNldCB0aGUgbGFzdCBmb3VyIGJpdHMgKG5vdCB1c2VkKSAqLwogfQogCisKIC8qCiAgKiBydGNfZnJvbTRfY29ycmVjdF9kYXRhIC0gaGFyZHdhcmUgc3BlY2lmaWMgY29kZSB0byBjb3JyZWN0IGRhdGEgdXNpbmcgRUNDIGNvZGUKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCkBAIC0zNjUsMTYgKzQwNSwxNCBAQAogICoKICAqIFRoZSBGUEdBIHRlbGxzIHVzIGZhc3QsIGlmIHRoZXJlJ3MgYW4gZXJyb3Igb3Igbm90LiBJZiBubywgd2UgZ28gYmFjayBoYXBweQogICogZWxzZSB3ZSByZWFkIHRoZSBlY2MgcmVzdWx0cyBmcm9tIHRoZSBmcGdhIGFuZCBjYWxsIHRoZSBycyBsaWJyYXJ5IHRvIGRlY29kZQotICogYW5kIGhvcGVmdWxseSBjb3JyZWN0IHRoZSBlcnJvcgorICogYW5kIGhvcGVmdWxseSBjb3JyZWN0IHRoZSBlcnJvci4KICAqCi0gKiBGb3Igbm93IEkgdXNlIHRoZSBjb2RlLCB3aGljaCB3ZSByZWFkIGZyb20gdGhlIEZMQVNIIHRvIHVzZSB0aGUgUlMgbGliLAotICogYXMgdGhlIHN5bmRyb20gY29udmVyc2lvbiBoYXMgYSB1bnJlc29sdmVkIGlzc3VlLgogICovCiBzdGF0aWMgaW50IHJ0Y19mcm9tNF9jb3JyZWN0X2RhdGEoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCB1X2NoYXIgKmVjYzEsIHVfY2hhciAqZWNjMikKIHsKIAlpbnQgaSwgaiwgcmVzOwogCXVuc2lnbmVkIHNob3J0IHN0YXR1czsgCi0JdWludDE2X3QgcGFyWzZdLCBzeW5bNl0sIHRtcDsKKwl1aW50MTZfdCBwYXJbNl0sIHN5bls2XTsKIAl1aW50OF90IGVjY1s4XTsKICAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnJzX2VjYzsKIApAQCAtNDE2LDE1ICs0NTQsODYgQEAKIAl9CiAKIAkvKiBMZXQgdGhlIGxpYnJhcnkgY29kZSBkbyBpdHMgbWFnaWMuKi8KLQlyZXMgPSBkZWNvZGVfcnM4KHJzX2RlY29kZXIsIGJ1ZiwgcGFyLCA1MTIsIHN5biwgMCwgTlVMTCwgMHhmZiwgTlVMTCk7CisJcmVzID0gZGVjb2RlX3JzOChyc19kZWNvZGVyLCAodWludDhfdCAqKWJ1ZiwgcGFyLCA1MTIsIHN5biwgMCwgTlVMTCwgMHhmZiwgTlVMTCk7CiAJaWYgKHJlcyA+IDApIHsKIAkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJydGNfZnJvbTRfY29ycmVjdF9kYXRhOiAiIAogCQkJIkVDQyBjb3JyZWN0ZWQgJWQgZXJyb3JzIG9uIHJlYWRcbiIsIHJlcyk7CiAJfQogCXJldHVybiByZXM7CiB9CisKKworLyoqCisgKiBydGNfZnJvbTRfZXJyc3RhdCAtIHBlcmZvcm0gYWRkaXRpb25hbCBlcnJvciBzdGF0dXMgY2hlY2tzCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHRoaXM6CU5BTkQgY2hpcCBzdHJ1Y3R1cmUKKyAqIEBzdGF0ZToJc3RhdGUgb3IgdGhlIG9wZXJhdGlvbgorICogQHN0YXR1czoJc3RhdHVzIGNvZGUgcmV0dXJuZWQgZnJvbSByZWFkIHN0YXR1cworICogQHBhZ2U6CXN0YXJ0cGFnZSBpbnNpZGUgdGhlIGNoaXAsIG11c3QgYmUgY2FsbGVkIHdpdGggKHBhZ2UgJiB0aGlzLT5wYWdlbWFzaykKKyAqIAorICogUGVyZm9ybSBhZGRpdGlvbmFsIGVycm9yIHN0YXR1cyBjaGVja3Mgb24gZXJhc2UgYW5kIHdyaXRlIGZhaWx1cmVzIAorICogdG8gZGV0ZXJtaW5lIGlmIGVycm9ycyBhcmUgY29ycmVjdGFibGUuICBGb3IgdGhpcyBkZXZpY2UsIGNvcnJlY3RhYmxlIAorICogMS1iaXQgZXJyb3JzIG9uIGVyYXNlIGFuZCB3cml0ZSBhcmUgY29uc2lkZXJlZCBhY2NlcHRhYmxlLgorICoKKyAqIG5vdGU6IHNlZSBwYWdlcyAzNC4uMzcgb2YgZGF0YSBzaGVldCBmb3IgZGV0YWlscy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgcnRjX2Zyb200X2VycnN0YXQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIGludCBzdGF0ZSwgaW50IHN0YXR1cywgaW50IHBhZ2UpCit7CisJaW50CWVyX3N0YXQ9MDsKKwlpbnQJcnRuLCByZXRsZW47CisJc2l6ZV90CWxlbjsKKwl1aW50OF90ICpidWY7CisJaW50CWk7CisKKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1NUQVRVU19DTEVBUiwgLTEsIC0xKTsKKworICAgICAgICBpZiAoc3RhdGUgPT0gRkxfRVJBU0lORykgeworCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCWlmIChzdGF0dXMgJiAxPDwoaSsxKSkgeworCQkJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgKE5BTkRfQ01EX1NUQVRVU19FUlJPUiArIGkgKyAxKSwgLTEsIC0xKTsKKwkJCQlydG4gPSB0aGlzLT5yZWFkX2J5dGUobXRkKTsKKwkJCQl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1NUQVRVU19SRVNFVCwgLTEsIC0xKTsKKwkJCQlpZiAoIShydG4gJiBFUlJfU1RBVF9FQ0NfQVZBSUxBQkxFKSkgeworCQkJCQllcl9zdGF0IHw9IDE8PChpKzEpOwkvKiBlcnJfZWNjX25vdF9hdmFpbCAqLworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoc3RhdGUgPT0gRkxfV1JJVElORykgeworCQkvKiBzaW5nbGUgYmFuayB3cml0ZSBsb2dpYyAqLworCQl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1NUQVRVU19FUlJPUiwgLTEsIC0xKTsKKwkJcnRuID0gdGhpcy0+cmVhZF9ieXRlKG10ZCk7CisJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU1RBVFVTX1JFU0VULCAtMSwgLTEpOworCQlpZiAoIShydG4gJiBFUlJfU1RBVF9FQ0NfQVZBSUxBQkxFKSkgeworCQkJZXJfc3RhdCB8PSAxPDwxOwkvKiBlcnJfZWNjX25vdF9hdmFpbCAqLworCQl9IGVsc2UgeworCQkJbGVuID0gbXRkLT5vb2JibG9jazsKKwkJCWJ1ZiA9IGttYWxsb2MgKGxlbiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWJ1ZikgeworCQkJCXByaW50ayAoS0VSTl9FUlIgInJ0Y19mcm9tNF9lcnJzdGF0OiBPdXQgb2YgbWVtb3J5IVxuIik7CisJCQkJZXJfc3RhdCA9IDE7CQkJLyogaWYgd2UgY2FuJ3QgY2hlY2ssIGFzc3VtZSBmYWlsZWQgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogcmVjb3ZlcnkgcmVhZCAqLworCQkJCS8qIHBhZ2UgcmVhZCAqLworCQkJCXJ0biA9IG5hbmRfZG9fcmVhZF9lY2MgKG10ZCwgcGFnZSwgbGVuLCAmcmV0bGVuLCBidWYsIE5VTEwsIHRoaXMtPmF1dG9vb2IsIDEpOworCQkJCWlmIChydG4pIHsJLyogaWYgcmVhZCBmYWlsZWQgb3IgPiAxLWJpdCBlcnJvciBjb3JyZWN0ZWQgKi8KKwkJCQkJZXJfc3RhdCB8PSAxPDwxOwkvKiBFQ0MgcmVhZCBmYWlsZWQgKi8KKwkJCQl9CisJCQkJa2ZyZWUoYnVmKTsKKwkJCX0KKwkJfQorCX0KKworCXJ0biA9IHN0YXR1czsKKwlpZiAoZXJfc3RhdCA9PSAwKSB7CQkJCS8qIGlmIEVDQyBpcyBhdmFpbGFibGUgICAqLworCQlydG4gPSAoc3RhdHVzICYgfk5BTkRfU1RBVFVTX0ZBSUwpOwkvKiAgIGNsZWFyIHRoZSBlcnJvciBiaXQgKi8KKwl9CisKKwlyZXR1cm4gcnRuOworfQogI2VuZGlmCiAKKwogLyoKICAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQogICovCkBAIC00MzIsNiArNTQxLDcgQEAKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwogCXVuc2lnbmVkIHNob3J0IGJjcjEsIGJjcjIsIHdjcjI7CisJaW50IGk7CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KIAlydGNfZnJvbTRfbXRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZiAoc3RydWN0IG5hbmRfY2hpcCksCkBAIC00ODMsNiArNTkzLDggQEAKIAogICAgICAgICB0aGlzLT5lY2Ntb2RlID0gTkFORF9FQ0NfSFc4XzUxMjsKIAl0aGlzLT5vcHRpb25zIHw9IE5BTkRfSFdFQ0NfU1lORFJPTUU7CisJLyogcmV0dXJuIHRoZSBzdGF0dXMgb2YgZXh0cmEgc3RhdHVzIGFuZCBFQ0MgY2hlY2tzICovCisJdGhpcy0+ZXJyc3RhdCA9IHJ0Y19mcm9tNF9lcnJzdGF0OwogCS8qIHNldCB0aGUgbmFuZF9vb2JpbmZvIHRvIHN1cHBvcnQgRlBHQSBIL1cgZXJyb3IgZGV0ZWN0aW9uICovCiAJdGhpcy0+YXV0b29vYiA9ICZydGNfZnJvbTRfbmFuZF9vb2JpbmZvOwogCXRoaXMtPmVuYWJsZV9od2VjYyA9IHJ0Y19mcm9tNF9lbmFibGVfaHdlY2M7CkBAIC01MDQsNiArNjE2LDE4IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCisJLyogUGVyZm9ybSAnZGV2aWNlIHJlY292ZXJ5JyBmb3IgZWFjaCBjaGlwIGluIGNhc2UgdGhlcmUgd2FzIGEgcG93ZXIgbG9zcy4gKi8KKwlmb3IgKGk9MDsgaSA8IHRoaXMtPm51bWNoaXBzOyBpKyspIHsKKwkJZGVwbGV0ZShydGNfZnJvbTRfbXRkLCBpKTsKKwl9CisKKyNpZiBSVENfRlJPTTRfTk9fVklSVEJMT0NLUworCS8qIHVzZSBhIHNtYWxsZXIgZXJhc2UgYmxvY2sgdG8gbWluaW1pemUgd2FzdGVkIHNwYWNlIHdoZW4gYSBibG9jayBpcyBiYWQgKi8KKwkvKiBub3RlOiB0aGlzIHVzZXMgZWlnaHQgdGltZXMgYXMgbXVjaCBSQU0gYXMgdXNpbmcgdGhlIGRlZmF1bHQgYW5kIG1ha2VzICovCisJLyogICAgICAgbW91bnRzIHRha2UgZm91ciB0aW1lcyBhcyBsb25nLiAqLworCXJ0Y19mcm9tNF9tdGQtPmZsYWdzIHw9IE1URF9OT19WSVJUQkxPQ0tTOworI2VuZGlmCisKIAkvKiBSZWdpc3RlciB0aGUgcGFydGl0aW9ucyAqLwogCWFkZF9tdGRfcGFydGl0aW9ucyhydGNfZnJvbTRfbXRkLCBwYXJ0aXRpb25faW5mbywgTlVNX1BBUlRJVElPTlMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYyBiL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCmluZGV4IGQwNWU5YjkuLjg5MWUzYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCkBAIC0xLDE3ICsxLDI0IEBACiAvKiBsaW51eC9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvU1dMSU5VWC8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KICAqCi0gKiBTYW1zdW5nIFMzQzI0MTAgTkFORCBkcml2ZXIKKyAqIFNhbXN1bmcgUzNDMjQxMC9TM0MyNDAgTkFORCBkcml2ZXIKICAqCiAgKiBDaGFuZ2Vsb2c6CiAgKgkyMS1TZXAtMjAwNCAgQkpEICBJbml0aWFsIHZlcnNpb24KICAqCTIzLVNlcC0yMDA0ICBCSkQgIE11bGl0cGxlIGRldmljZSBzdXBwb3J0CiAgKgkyOC1TZXAtMjAwNCAgQkpEICBGaXhlZCBFQ0MgcGxhY2VtZW50IGZvciBIYXJkd2FyZSBtb2RlCiAgKgkxMi1PY3QtMjAwNCAgQkpEICBGaXhlZCBlcnJvcnMgaW4gdXNlIG9mIHBsYXRmb3JtIGRhdGEKKyAqCTE4LUZlYi0yMDA1ICBCSkQgIEZpeCBzcGFyc2UgZXJyb3JzCisgKgkxNC1NYXItMjAwNSAgQkpEICBBcHBsaWVkIHRnbHgncyBjb2RlIHJlZHVjdGlvbiBwYXRjaAorICoJMDItTWF5LTIwMDUgIEJKRCAgRml4ZWQgczNjMjQ0MCBzdXBwb3J0CisgKgkwMi1NYXktMjAwNSAgQkpEICBSZWR1Y2VkIGh3Y29udHJvbCBkZWNvZGUKKyAqCTIwLUp1bi0yMDA1ICBCSkQgIFVwZGF0ZWQgczNjMjQ0MCBzdXBwb3J0LCBmaXhlZCB0aW1pbmcgYnVnCisgKgkwOC1KdWwtMjAwNSAgQkpEICBGaXggT09QUyB3aGVuIG5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWQKICAqCi0gKiAkSWQ6IHMzYzI0MTAuYyx2IDEuNyAyMDA1LzAxLzA1IDE4OjA1OjE0IGR3bXcyIEV4cCAkCisgKiAkSWQ6IHMzYzI0MTAuYyx2IDEuMTQgMjAwNS8wNy8wNiAyMDowNTowNiBiamQgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTY5LDEwICs3NiwxMCBAQAogICovCiAKIHN0YXRpYyBzdHJ1Y3QgbmFuZF9vb2JpbmZvIG5hbmRfaHdfZWNjb29iID0gewotCS51c2VlY2MgPSBNVERfTkFOREVDQ19BVVRPUExBQ0UsCi0JLmVjY2J5dGVzID0gMywKLQkuZWNjcG9zID0gezAsIDEsIDIgfSwKLQkub29iZnJlZSA9IHsgezgsIDh9IH0KKwkudXNlZWNjCQk9IE1URF9OQU5ERUNDX0FVVE9QTEFDRSwKKwkuZWNjYnl0ZXMJPSAzLAorCS5lY2Nwb3MJCT0gezAsIDEsIDIgfSwKKwkub29iZnJlZQk9IHsgezgsIDh9IH0KIH07CiAKIC8qIGNvbnRyb2xsZXIgYW5kIG10ZCBpbmZvcm1hdGlvbiAqLwpAQCAtOTksOCArMTA2LDEwIEBACiAJc3RydWN0IGRldmljZQkJCSpkZXZpY2U7CiAJc3RydWN0IHJlc291cmNlCQkJKmFyZWE7CiAJc3RydWN0IGNsawkJCSpjbGs7Ci0Jdm9pZAkJCQkqcmVnczsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKIAlpbnQJCQkJbXRkX2NvdW50OworCisJdW5zaWduZWQgY2hhcgkJCWlzX3MzYzI0NDA7CiB9OwogCiAvKiBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwpAQCAtMTY1LDEyICsxNzQsMTIgQEAKIAkvKiBjYWxjdWxhdGUgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbnRyb2xsZXIgKi8KIAogCWlmIChwbGF0ICE9IE5VTEwpIHsKLQkJdGFjbHMgPSBzM2MyNDEwX25hbmRfY2FsY19yYXRlKHBsYXQtPnRhY2xzLCBjbGtyYXRlLCA4KTsKKwkJdGFjbHMgID0gczNjMjQxMF9uYW5kX2NhbGNfcmF0ZShwbGF0LT50YWNscywgY2xrcmF0ZSwgNCk7CiAJCXR3cnBoMCA9IHMzYzI0MTBfbmFuZF9jYWxjX3JhdGUocGxhdC0+dHdycGgwLCBjbGtyYXRlLCA4KTsKIAkJdHdycGgxID0gczNjMjQxMF9uYW5kX2NhbGNfcmF0ZShwbGF0LT50d3JwaDEsIGNsa3JhdGUsIDgpOwogCX0gZWxzZSB7CiAJCS8qIGRlZmF1bHQgdGltaW5ncyAqLwotCQl0YWNscyA9IDg7CisJCXRhY2xzID0gNDsKIAkJdHdycGgwID0gODsKIAkJdHdycGgxID0gODsKIAl9CkBAIC0xODUsMTAgKzE5NCwxNiBAQAogCSAgICAgICB0b19ucyh0d3JwaDAsIGNsa3JhdGUpLAogCSAgICAgICB0b19ucyh0d3JwaDEsIGNsa3JhdGUpKTsKIAotCWNmZyAgPSBTM0MyNDEwX05GQ09ORl9FTjsKLQljZmcgfD0gUzNDMjQxMF9ORkNPTkZfVEFDTFModGFjbHMtMSk7Ci0JY2ZnIHw9IFMzQzI0MTBfTkZDT05GX1RXUlBIMCh0d3JwaDAtMSk7Ci0JY2ZnIHw9IFMzQzI0MTBfTkZDT05GX1RXUlBIMSh0d3JwaDEtMSk7CisJaWYgKCFpbmZvLT5pc19zM2MyNDQwKSB7CisJCWNmZyAgPSBTM0MyNDEwX05GQ09ORl9FTjsKKwkJY2ZnIHw9IFMzQzI0MTBfTkZDT05GX1RBQ0xTKHRhY2xzLTEpOworCQljZmcgfD0gUzNDMjQxMF9ORkNPTkZfVFdSUEgwKHR3cnBoMC0xKTsKKwkJY2ZnIHw9IFMzQzI0MTBfTkZDT05GX1RXUlBIMSh0d3JwaDEtMSk7CisJfSBlbHNlIHsKKwkJY2ZnICAgPSBTM0MyNDQwX05GQ09ORl9UQUNMUyh0YWNscy0xKTsKKwkJY2ZnICB8PSBTM0MyNDQwX05GQ09ORl9UV1JQSDAodHdycGgwLTEpOworCQljZmcgIHw9IFMzQzI0NDBfTkZDT05GX1RXUlBIMSh0d3JwaDEtMSk7CisJfQogCiAJcHJfZGVidWcoUEZYICJORl9DT05GIGlzIDB4JWx4XG4iLCBjZmcpOwogCkBAIC0yMDMsMTcgKzIxOCwyMiBAQAogCXN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgczNjMjQxMF9uYW5kX210ZCAqbm10ZDsgCiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKnJlZzsKIAl1bnNpZ25lZCBsb25nIGN1cjsKKwl1bnNpZ25lZCBsb25nIGJpdDsKIAogCW5tdGQgPSB0aGlzLT5wcml2OwogCWluZm8gPSBubXRkLT5pbmZvOwogCi0JY3VyID0gcmVhZGwoaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKKwliaXQgPSAoaW5mby0+aXNfczNjMjQ0MCkgPyBTM0MyNDQwX05GQ09OVF9uRkNFIDogUzNDMjQxMF9ORkNPTkZfbkZDRTsKKwlyZWcgPSBpbmZvLT5yZWdzKygoaW5mby0+aXNfczNjMjQ0MCkgPyBTM0MyNDQwX05GQ09OVDpTM0MyNDEwX05GQ09ORik7CisKKwljdXIgPSByZWFkbChyZWcpOwogCiAJaWYgKGNoaXAgPT0gLTEpIHsKLQkJY3VyIHw9IFMzQzI0MTBfTkZDT05GX25GQ0U7CisJCWN1ciB8PSBiaXQ7CiAJfSBlbHNlIHsKLQkJaWYgKGNoaXAgPiBubXRkLT5zZXQtPm5yX2NoaXBzKSB7CisJCWlmIChubXRkLT5zZXQgIT0gTlVMTCAmJiBjaGlwID4gbm10ZC0+c2V0LT5ucl9jaGlwcykgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2hpcCAlZCBvdXQgb2YgcmFuZ2VcbiIsIGNoaXApOwogCQkJcmV0dXJuOwogCQl9CkBAIC0yMjMsMTQzICsyNDMsNzYgQEAKIAkJCQkoaW5mby0+cGxhdGZvcm0tPnNlbGVjdF9jaGlwKShubXRkLT5zZXQsIGNoaXApOwogCQl9CiAKLQkJY3VyICY9IH5TM0MyNDEwX05GQ09ORl9uRkNFOworCQljdXIgJj0gfmJpdDsKIAl9CiAKLQl3cml0ZWwoY3VyLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOworCXdyaXRlbChjdXIsIHJlZyk7CiB9CiAKLS8qIGNvbW1hbmQgYW5kIGNvbnRyb2wgZnVuY3Rpb25zICovCisvKiBjb21tYW5kIGFuZCBjb250cm9sIGZ1bmN0aW9ucyAKKyAqCisgKiBOb3RlLCB0aGVzZSBhbGwgdXNlIHRnbHgncyBtZXRob2Qgb2YgY2hhbmdpbmcgdGhlIElPX0FERFJfVyBmaWVsZAorICogdG8gbWFrZSB0aGUgY29kZSBzaW1wbGVyLCBhbmQgdXNlIHRoZSBuYW5kIGxheWVyJ3MgY29kZSB0byBpc3N1ZSB0aGUKKyAqIGNvbW1hbmQgYW5kIGFkZHJlc3Mgc2VxdWVuY2VzIHZpYSB0aGUgcHJvcGVyIElPIHBvcnRzLgorICoKKyovCiAKIHN0YXRpYyB2b2lkIHMzYzI0MTBfbmFuZF9od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCiB7CiAJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gczNjMjQxMF9uYW5kX210ZF90b2luZm8obXRkKTsKLQl1bnNpZ25lZCBsb25nIGN1cjsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE5BTkRfQ1RMX1NFVE5DRToKLQkJY3VyID0gcmVhZGwoaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKLQkJY3VyICY9IH5TM0MyNDEwX05GQ09ORl9uRkNFOwotCQl3cml0ZWwoY3VyLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOwotCQlicmVhazsKLQogCWNhc2UgTkFORF9DVExfQ0xSTkNFOgotCQljdXIgPSByZWFkbChpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOwotCQljdXIgfD0gUzNDMjQxMF9ORkNPTkZfbkZDRTsKLQkJd3JpdGVsKGN1ciwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FsbGVkIGZvciBOQ0VcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWJyZWFrOwogCi0JCS8qIHdlIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IHRoZXNlICovCiAJY2FzZSBOQU5EX0NUTF9TRVRDTEU6Ci0JY2FzZSBOQU5EX0NUTF9DTFJDTEU6CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ01EOworCQlicmVhazsKKwogCWNhc2UgTkFORF9DVExfU0VUQUxFOgotCWNhc2UgTkFORF9DVExfQ0xSQUxFOgotCQlwcl9kZWJ1ZyhQRlggInMzYzI0MTBfbmFuZF9od2NvbnRyb2woJWQpIHVudXNlZG4iLCBjbWQpOworCQljaGlwLT5JT19BRERSX1cgPSBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkFERFI7CisJCWJyZWFrOworCisJCS8qIE5BTkRfQ1RMX0NMUkNMRTogKi8KKwkJLyogTkFORF9DVExfQ0xSQUxFOiAqLworCWRlZmF1bHQ6CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GREFUQTsKIAkJYnJlYWs7CiAJfQogfQogCi0vKiBzM2MyNDEwX25hbmRfY29tbWFuZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzZW5kaW5nIGNvbW1hbmRzIGFuZCB0aGUgcmVsZXZhbnQgYWRkcmVzcwotICogaW5mb3JtYXRpb24gdG8gdGhlIGNoaXAsIHZpYSB0aGUgaGFyZHdhcmUgY29udHJvbGxlci4gU2luY2UgdGhlCi0gKiBTM0MyNDEwIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBBTEUvQ0xFIHNpZ25hbGluZyBhdXRvbWF0aWNhbGx5LCB3ZQotICogZG8gbm90IG5lZWQgdG8gdXNlIGh3Y29udHJvbC4KLSovCisvKiBjb21tYW5kIGFuZCBjb250cm9sIGZ1bmN0aW9ucyAqLwogCi1zdGF0aWMgdm9pZCBzM2MyNDEwX25hbmRfY29tbWFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsCi0JCQkJICBpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyKQorc3RhdGljIHZvaWQgczNjMjQ0MF9uYW5kX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCkKIHsKLQlyZWdpc3RlciBzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBzM2MyNDEwX25hbmRfbXRkX3RvaW5mbyhtdGQpOwotCXJlZ2lzdGVyIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gczNjMjQxMF9uYW5kX210ZF90b2luZm8obXRkKTsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCi0JLyoKLQkgKiBXcml0ZSBvdXQgdGhlIGNvbW1hbmQgdG8gdGhlIGRldmljZS4KLQkgKi8KLQlpZiAoY29tbWFuZCA9PSBOQU5EX0NNRF9TRVFJTikgewotCQlpbnQgcmVhZGNtZDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTkFORF9DVExfU0VUTkNFOgorCWNhc2UgTkFORF9DVExfQ0xSTkNFOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYWxsZWQgZm9yIE5DRVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CiAKLQkJaWYgKGNvbHVtbiA+PSBtdGQtPm9vYmJsb2NrKSB7Ci0JCQkvKiBPT0IgYXJlYSAqLwotCQkJY29sdW1uIC09IG10ZC0+b29iYmxvY2s7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRE9PQjsKLQkJfSBlbHNlIGlmIChjb2x1bW4gPCAyNTYpIHsKLQkJCS8qIEZpcnN0IDI1NiBieXRlcyAtLT4gUkVBRDAgKi8KLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFEMDsKLQkJfSBlbHNlIHsKLQkJCWNvbHVtbiAtPSAyNTY7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDE7Ci0JCX0KLQkJCi0JCXdyaXRlYihyZWFkY21kLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNNRCk7Ci0JfQotCXdyaXRlYihjb21tYW5kLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNNRCk7CisJY2FzZSBOQU5EX0NUTF9TRVRDTEU6CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GQ01EOworCQlicmVhazsKIAotCS8qIFNldCBBTEUgYW5kIGNsZWFyIENMRSB0byBzdGFydCBhZGRyZXNzIGN5Y2xlICovCisJY2FzZSBOQU5EX0NUTF9TRVRBTEU6CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GQUREUjsKKwkJYnJlYWs7CiAKLQlpZiAoY29sdW1uICE9IC0xIHx8IHBhZ2VfYWRkciAhPSAtMSkgewotCi0JCS8qIFNlcmlhbGx5IGlucHV0IGFkZHJlc3MgKi8KLQkJaWYgKGNvbHVtbiAhPSAtMSkgewotCQkJLyogQWRqdXN0IGNvbHVtbnMgZm9yIDE2IGJpdCBidXN3aWR0aCAqLwotCQkJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KQotCQkJCWNvbHVtbiA+Pj0gMTsKLQkJCXdyaXRlYihjb2x1bW4sIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQUREUik7Ci0JCX0KLQkJaWYgKHBhZ2VfYWRkciAhPSAtMSkgewotCQkJd3JpdGViKCh1bnNpZ25lZCBjaGFyKSAocGFnZV9hZGRyKSwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZBRERSKTsKLQkJCXdyaXRlYigodW5zaWduZWQgY2hhcikgKHBhZ2VfYWRkciA+PiA4KSwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZBRERSKTsKLQkJCS8qIE9uZSBtb3JlIGFkZHJlc3MgY3ljbGUgZm9yIGhpZ2hlciBkZW5zaXR5IGRldmljZXMgKi8KLQkJCWlmICh0aGlzLT5jaGlwc2l6ZSAmIDB4MGMwMDAwMDApIAotCQkJCXdyaXRlYigodW5zaWduZWQgY2hhcikgKChwYWdlX2FkZHIgPj4gMTYpICYgMHgwZiksCi0JCQkJICAgICAgIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQUREUik7Ci0JCX0KLQkJLyogTGF0Y2ggaW4gYWRkcmVzcyAqLwotCX0KLQkKLQkvKiAKLQkgKiBwcm9ncmFtIGFuZCBlcmFzZSBoYXZlIHRoZWlyIG93biBidXN5IGhhbmRsZXJzIAotCSAqIHN0YXR1cyBhbmQgc2VxdWVudGlhbCBpbiBuZWVkcyBubyBkZWxheQotCSovCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JCQkKLQljYXNlIE5BTkRfQ01EX1BBR0VQUk9HOgotCWNhc2UgTkFORF9DTURfRVJBU0UxOgotCWNhc2UgTkFORF9DTURfRVJBU0UyOgotCWNhc2UgTkFORF9DTURfU0VRSU46Ci0JY2FzZSBOQU5EX0NNRF9TVEFUVVM6Ci0JCXJldHVybjsKLQotCWNhc2UgTkFORF9DTURfUkVTRVQ6Ci0JCWlmICh0aGlzLT5kZXZfcmVhZHkpCQotCQkJYnJlYWs7Ci0KLQkJdWRlbGF5KHRoaXMtPmNoaXBfZGVsYXkpOwotCQl3cml0ZWIoTkFORF9DTURfU1RBVFVTLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNNRCk7Ci0KLQkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOwotCQlyZXR1cm47Ci0KLQkvKiBUaGlzIGFwcGxpZXMgdG8gcmVhZCBjb21tYW5kcyAqLwkKKwkJLyogTkFORF9DVExfQ0xSQ0xFOiAqLworCQkvKiBOQU5EX0NUTF9DTFJBTEU6ICovCiAJZGVmYXVsdDoKLQkJLyogCi0JCSAqIElmIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBidXN5IHBpbiwgd2UgYXBwbHkgdGhlIGdpdmVuCi0JCSAqIGNvbW1hbmQgZGVsYXkKLQkJKi8KLQkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIHsKLQkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7Ci0JCQlyZXR1cm47Ci0JCX0JCisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GREFUQTsKKwkJYnJlYWs7CiAJfQotCQotCS8qIEFwcGx5IHRoaXMgc2hvcnQgZGVsYXkgYWx3YXlzIHRvIGVuc3VyZSB0aGF0IHdlIGRvIHdhaXQgdFdCIGluCi0JICogYW55IGNhc2Ugb24gYW55IG1hY2hpbmUuICovCi0JbmRlbGF5ICgxMDApOwotCS8qIHdhaXQgdW50aWwgY29tbWFuZCBpcyBwcm9jZXNzZWQgKi8KLQl3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsKIH0KIAotCiAvKiBzM2MyNDEwX25hbmRfZGV2cmVhZHkoKQogICoKICAqIHJldHVybnMgMCBpZiB0aGUgbmFuZCBpcyBidXN5LCAxIGlmIGl0IGlzIHJlYWR5CkBAIC0zNjksOSArMzIyLDEyIEBACiB7CiAJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gczNjMjQxMF9uYW5kX210ZF90b2luZm8obXRkKTsKIAkKKwlpZiAoaW5mby0+aXNfczNjMjQ0MCkKKwkJcmV0dXJuIHJlYWRiKGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GU1RBVCkgJiBTM0MyNDQwX05GU1RBVF9SRUFEWTsKIAlyZXR1cm4gcmVhZGIoaW5mby0+cmVncyArIFMzQzI0MTBfTkZTVEFUKSAmIFMzQzI0MTBfTkZTVEFUX0JVU1k7CiB9CiAKKwogLyogRUNDIGhhbmRsaW5nIGZ1bmN0aW9ucyAqLwogCiBzdGF0aWMgaW50IHMzYzI0MTBfbmFuZF9jb3JyZWN0X2RhdGEoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqZGF0LApAQCAtMzk0LDYgKzM1MCwxMiBAQAogCXJldHVybiAtMTsKIH0KIAorLyogRUNDIGZ1bmN0aW9ucworICoKKyAqIFRoZXNlIGFsbG93IHRoZSBzM2MyNDEwIGFuZCBzM2MyNDQwIHRvIHVzZSB0aGUgY29udHJvbGxlcidzIEVDQworICogZ2VuZXJhdG9yIGJsb2NrIHRvIEVDQyB0aGUgZGF0YSBhcyBpdCBwYXNzZXMgdGhyb3VnaF0KKyovCisKIHN0YXRpYyB2b2lkIHMzYzI0MTBfbmFuZF9lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQogewogCXN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbyA9IHMzYzI0MTBfbmFuZF9tdGRfdG9pbmZvKG10ZCk7CkBAIC00MDQsNiArMzY2LDE1IEBACiAJd3JpdGVsKGN0cmwsIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ09ORik7CiB9CiAKK3N0YXRpYyB2b2lkIHMzYzI0NDBfbmFuZF9lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQoreworCXN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbyA9IHMzYzI0MTBfbmFuZF9tdGRfdG9pbmZvKG10ZCk7CisJdW5zaWduZWQgbG9uZyBjdHJsOworCisJY3RybCA9IHJlYWRsKGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GQ09OVCk7CisJd3JpdGVsKGN0cmwgfCBTM0MyNDQwX05GQ09OVF9JTklURUNDLCBpbmZvLT5yZWdzICsgUzNDMjQ0MF9ORkNPTlQpOworfQorCiBzdGF0aWMgaW50IHMzYzI0MTBfbmFuZF9jYWxjdWxhdGVfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAogCQkJCSAgICAgIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQogewpAQCAtNDIwLDcgKzM5MSwyNiBAQAogfQogCiAKLS8qIG92ZXItcmlkZSB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zIGZvciBhIGxpdHRsZSBtb3JlIHNwZWVkPyAqLworc3RhdGljIGludCBzM2MyNDQwX25hbmRfY2FsY3VsYXRlX2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCQkgICAgICBjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBzM2MyNDEwX25hbmRfbXRkX3RvaW5mbyhtdGQpOworCXVuc2lnbmVkIGxvbmcgZWNjID0gcmVhZGwoaW5mby0+cmVncyArIFMzQzI0NDBfTkZNRUNDMCk7CisKKwllY2NfY29kZVswXSA9IGVjYzsKKwllY2NfY29kZVsxXSA9IGVjYyA+PiA4OworCWVjY19jb2RlWzJdID0gZWNjID4+IDE2OworCisJcHJfZGVidWcoImNhbGN1bGF0ZV9lY2M6IHJldHVybmluZyBlY2MgJTAyeCwlMDJ4LCUwMnhcbiIsCisJCSBlY2NfY29kZVswXSwgZWNjX2NvZGVbMV0sIGVjY19jb2RlWzJdKTsKKworCXJldHVybiAwOworfQorCisKKy8qIG92ZXItcmlkZSB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zIGZvciBhIGxpdHRsZSBtb3JlIHNwZWVkLiBXZSBjYW4KKyAqIHVzZSByZWFkL3dyaXRlIGJsb2NrIHRvIG1vdmUgdGhlIGRhdGEgYnVmZmVycyB0by9mcm9tIHRoZSBjb250cm9sbGVyCisqLwogCiBzdGF0aWMgdm9pZCBzM2MyNDEwX25hbmRfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYnVmLCBpbnQgbGVuKQogewpAQCAtNTIzLDExICs1MTMsMTAgQEAKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJm5tdGQtPmNoaXA7CiAKLQljaGlwLT5JT19BRERSX1IJICAgPSAoY2hhciAqKWluZm8tPnJlZ3MgKyBTM0MyNDEwX05GREFUQTsKLQljaGlwLT5JT19BRERSX1cgICAgPSAoY2hhciAqKWluZm8tPnJlZ3MgKyBTM0MyNDEwX05GREFUQTsKKwljaGlwLT5JT19BRERSX1IJICAgPSBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkRBVEE7CisJY2hpcC0+SU9fQUREUl9XICAgID0gaW5mby0+cmVncyArIFMzQzI0MTBfTkZEQVRBOwogCWNoaXAtPmh3Y29udHJvbCAgICA9IHMzYzI0MTBfbmFuZF9od2NvbnRyb2w7CiAJY2hpcC0+ZGV2X3JlYWR5ICAgID0gczNjMjQxMF9uYW5kX2RldnJlYWR5OwotCWNoaXAtPmNtZGZ1bmMgICAgICA9IHMzYzI0MTBfbmFuZF9jb21tYW5kOwogCWNoaXAtPndyaXRlX2J1ZiAgICA9IHMzYzI0MTBfbmFuZF93cml0ZV9idWY7CiAJY2hpcC0+cmVhZF9idWYgICAgID0gczNjMjQxMF9uYW5kX3JlYWRfYnVmOwogCWNoaXAtPnNlbGVjdF9jaGlwICA9IHMzYzI0MTBfbmFuZF9zZWxlY3RfY2hpcDsKQEAgLTUzNiw2ICs1MjUsMTIgQEAKIAljaGlwLT5vcHRpb25zCSAgID0gMDsKIAljaGlwLT5jb250cm9sbGVyICAgPSAmaW5mby0+Y29udHJvbGxlcjsKIAorCWlmIChpbmZvLT5pc19zM2MyNDQwKSB7CisJCWNoaXAtPklPX0FERFJfUgkgPSBpbmZvLT5yZWdzICsgUzNDMjQ0MF9ORkRBVEE7CisJCWNoaXAtPklPX0FERFJfVyAgPSBpbmZvLT5yZWdzICsgUzNDMjQ0MF9ORkRBVEE7CisJCWNoaXAtPmh3Y29udHJvbCAgPSBzM2MyNDQwX25hbmRfaHdjb250cm9sOworCX0KKwogCW5tdGQtPmluZm8JICAgPSBpbmZvOwogCW5tdGQtPm10ZC5wcml2CSAgID0gY2hpcDsKIAlubXRkLT5zZXQJICAgPSBzZXQ7CkBAIC01NDYsNiArNTQxLDExIEBACiAJCWNoaXAtPmNhbGN1bGF0ZV9lY2MgPSBzM2MyNDEwX25hbmRfY2FsY3VsYXRlX2VjYzsKIAkJY2hpcC0+ZWNjbW9kZQkgICAgPSBOQU5EX0VDQ19IVzNfNTEyOwogCQljaGlwLT5hdXRvb29iICAgICAgID0gJm5hbmRfaHdfZWNjb29iOworCisJCWlmIChpbmZvLT5pc19zM2MyNDQwKSB7CisJCQljaGlwLT5lbmFibGVfaHdlY2MgID0gczNjMjQ0MF9uYW5kX2VuYWJsZV9od2VjYzsKKwkJCWNoaXAtPmNhbGN1bGF0ZV9lY2MgPSBzM2MyNDQwX25hbmRfY2FsY3VsYXRlX2VjYzsKKwkJfQogCX0gZWxzZSB7CiAJCWNoaXAtPmVjY21vZGUJICAgID0gTkFORF9FQ0NfU09GVDsKIAl9CkBAIC01NTksNyArNTU5LDcgQEAKICAqIG5hbmQgbGF5ZXIgdG8gbG9vayBmb3IgZGV2aWNlcwogKi8KIAotc3RhdGljIGludCBzM2MyNDEwX25hbmRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzM2MyNHh4X25hbmRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaXNfczNjMjQ0MCkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1fbmFuZCAqcGxhdCA9IHRvX25hbmRfcGxhdChkZXYpOwpAQCAtNTg1LDYgKzU4NSw3IEBACiAJZGV2X3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaW5mby0+Y29udHJvbGxlci5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jb250cm9sbGVyLndxKTsKIAogCS8qIGdldCB0aGUgY2xvY2sgc291cmNlIGFuZCBlbmFibGUgaXQgKi8KIApAQCAtNjAwLDcgKzYwMSw4IEBACiAKIAkvKiBhbGxvY2F0ZSBhbmQgbWFwIHRoZSByZXNvdXJjZSAqLwogCi0JcmVzID0gcGRldi0+cmVzb3VyY2U7ICAvKiBhc3N1bWUgdGhhdCB0aGUgZmxhc2ggaGFzIG9uZSByZXNvdXJjZSAqLworCS8qIGN1cnJlbnRseSB3ZSBhc3N1bWUgd2UgaGF2ZSB0aGUgb25lIHJlc291cmNlICovCisJcmVzICA9IHBkZXYtPnJlc291cmNlOwogCXNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOwogCiAJaW5mby0+YXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplLCBwZGV2LT5uYW1lKTsKQEAgLTYxMSw5ICs2MTMsMTAgQEAKIAkJZ290byBleGl0X2Vycm9yOwogCX0KIAotCWluZm8tPmRldmljZSA9IGRldjsKLQlpbmZvLT5wbGF0Zm9ybSA9IHBsYXQ7Ci0JaW5mby0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgc2l6ZSk7CisJaW5mby0+ZGV2aWNlICAgICA9IGRldjsKKwlpbmZvLT5wbGF0Zm9ybSAgID0gcGxhdDsKKwlpbmZvLT5yZWdzICAgICAgID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpbmZvLT5pc19zM2MyNDQwID0gaXNfczNjMjQ0MDsKIAogCWlmIChpbmZvLT5yZWdzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlc2VydmUgcmVnaXN0ZXIgcmVnaW9uXG4iKTsKQEAgLTY3OCw2ICs2ODEsMTggQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKiBkcml2ZXIgZGV2aWNlIHJlZ2lzdHJhdGlvbiAqLworCitzdGF0aWMgaW50IHMzYzI0MTBfbmFuZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHMzYzI0eHhfbmFuZF9wcm9iZShkZXYsIDApOworfQorCitzdGF0aWMgaW50IHMzYzI0NDBfbmFuZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHMzYzI0eHhfbmFuZF9wcm9iZShkZXYsIDEpOworfQorCiBzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgczNjMjQxMF9uYW5kX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiczNjMjQxMC1uYW5kIiwKIAkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKQEAgLTY4NSwxNCArNzAwLDI0IEBACiAJLnJlbW92ZQkJPSBzM2MyNDEwX25hbmRfcmVtb3ZlLAogfTsKIAorc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHMzYzI0NDBfbmFuZF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInMzYzI0NDAtbmFuZCIsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IHMzYzI0NDBfbmFuZF9wcm9iZSwKKwkucmVtb3ZlCQk9IHMzYzI0MTBfbmFuZF9yZW1vdmUsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBzM2MyNDEwX25hbmRfaW5pdCh2b2lkKQogewotCXByaW50aygiUzNDMjQxMCBOQU5EIERyaXZlciwgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzXG4iKTsKKwlwcmludGsoIlMzQzI0WFggTkFORCBEcml2ZXIsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIik7CisKKwlkcml2ZXJfcmVnaXN0ZXIoJnMzYzI0NDBfbmFuZF9kcml2ZXIpOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnMzYzI0MTBfbmFuZF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgczNjMjQxMF9uYW5kX2V4aXQodm9pZCkKIHsKKwlkcml2ZXJfdW5yZWdpc3RlcigmczNjMjQ0MF9uYW5kX2RyaXZlcik7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MTBfbmFuZF9kcml2ZXIpOwogfQogCkBAIC03MDEsNCArNzI2LDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNDEwIE1URCBOQU5EIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNFhYIE1URCBOQU5EIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMgYi9kcml2ZXJzL210ZC9uYW5kL3NoYXJwc2wuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDI5NTcyNzkuLjk4NTNiODcKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNCBSaWNoYXJkIFB1cmRpZQogICoKLSAqICAkSWQ6IHNoYXJwc2wuYyx2IDEuMyAyMDA1LzAxLzAzIDE0OjUzOjUwIHJwdXJkaWUgRXhwICQKKyAqICAkSWQ6IHNoYXJwc2wuYyx2IDEuNCAyMDA1LzAxLzIzIDExOjA5OjE5IHJwdXJkaWUgRXhwICQKICAqCiAgKiAgQmFzZWQgb24gU2hhcnAncyBOQU5EIGRyaXZlciBzaGFycF9zbC5jCiAgKgpAQCAtMjE2LDcgKzIxNiw3IEBACiAJCW5yX3BhcnRpdGlvbnMgPSBERUZBVUxUX05VTV9QQVJUSVRJT05TOwogCQlzaGFycHNsX3BhcnRpdGlvbl9pbmZvID0gc2hhcnBzbF9uYW5kX2RlZmF1bHRfcGFydGl0aW9uX2luZm87CiAJCWlmIChtYWNoaW5lX2lzX3Bvb2RsZSgpKSB7Ci0JCQlzaGFycHNsX3BhcnRpdGlvbl9pbmZvWzFdLnNpemU9MjIgKiAxMDI0ICogMTAyNDsKKwkJCXNoYXJwc2xfcGFydGl0aW9uX2luZm9bMV0uc2l6ZT0zMCAqIDEwMjQgKiAxMDI0OwogCQl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfY29yZ2koKSB8fCBtYWNoaW5lX2lzX3NoZXBoZXJkKCkpIHsKIAkJCXNoYXJwc2xfcGFydGl0aW9uX2luZm9bMV0uc2l6ZT0yNSAqIDEwMjQgKiAxMDI0OwogCQl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfaHVza3koKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC90eDQ5MjVuZGZtYy5jIGIvZHJpdmVycy9tdGQvbmFuZC90eDQ5MjVuZGZtYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmE2ODg4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL25hbmQvdHg0OTI1bmRmbWMuYworKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKgotICogIGRyaXZlcnMvbXRkL3R4NDkyNW5kZm1jLmMKLSAqCi0gKiAgT3ZlcnZpZXc6Ci0gKiAgIFRoaXMgaXMgYSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgTkFORCBmbGFzaCBkZXZpY2UgZm91bmQgb24gdGhlCi0gKiAgIFRvc2hpYmEgUkJUWDQ5MjUgcmVmZXJlbmNlIGJvYXJkLCB3aGljaCBpcyBhIFNtYXJ0TWVkaWFDYXJkLiBJdCBzdXBwb3J0cyAKLSAqICAgMTZNaUIsIDMyTWlCIGFuZCA2NE1pQiBjYXJkcy4KLSAqCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogRGVyaXZlZCBmcm9tIGRyaXZlcnMvbXRkL2F1dGNwdTEyLmMKLSAqICAgICAgIENvcHlyaWdodCAoYykgMjAwMSBUaG9tYXMgR2xlaXhuZXIgKGdsZWl4bmVyQGF1dHJvbml4LmRlKQotICoKLSAqICRJZDogdHg0OTI1bmRmbWMuYyx2IDEuNSAyMDA0LzEwLzA1IDEzOjUwOjIwIGdsZWl4bmVyIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24gCi0gKiAKLSAqIDIwMDMgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdHg0OTI1L3R4NDkyNV9uYW5kLmg+Ci0KLWV4dGVybiBzdHJ1Y3QgbmFuZF9vb2JpbmZvIGpmZnMyX29vYmluZm87Ci0KLS8qCi0gKiBNVEQgc3RydWN0dXJlIGZvciBSQlRYNDkyNSBib2FyZAotICovCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICp0eDQ5MjVuZGZtY19tdGQgPSBOVUxMOwotCi0vKgotICogRGVmaW5lIHBhcnRpdGlvbnMgZm9yIGZsYXNoIGRldmljZXMKLSAqLwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm8xNmtbXSA9IHsKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAxIiwKLQkgIC5vZmZzZXQgPSAgMCwKLQkgIC5zaXplID0gICAgOCAqIDB4MDAxMDAwMDAgfSwKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAyIiwKLQkgIC5vZmZzZXQgPSAgOCAqIDB4MDAxMDAwMDAsCi0JICAuc2l6ZSA9ICAgIDggKiAweDAwMTAwMDAwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm8zMmtbXSA9IHsKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAxIiwKLQkgIC5vZmZzZXQgPSAgMCwKLQkgIC5zaXplID0gICAgOCAqIDB4MDAxMDAwMDAgfSwKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAyIiwKLQkgIC5vZmZzZXQgPSA4ICogMHgwMDEwMDAwMCwKLQkgIC5zaXplID0gIDI0ICogMHgwMDEwMDAwMCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvNjRrW10gPSB7Ci0JeyAubmFtZSA9ICJVc2VyIEZTIiwKLQkgIC5vZmZzZXQgPSAgMCwKLQkgIC5zaXplID0gICAxNiAqIDB4MDAxMDAwMDAgfSwKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAyIiwKLQkgIC5vZmZzZXQgPSAxNiAqIDB4MDAxMDAwMDAsCi0JICAuc2l6ZSA9ICAgNDggKiAweDAwMTAwMDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mbzEyOGtbXSA9IHsKLQl7IC5uYW1lID0gIlNraXAgYmFkIHNlY3Rpb24iLAotCSAgLm9mZnNldCA9ICAwLAotCSAgLnNpemUgPSAgIDE2ICogMHgwMDEwMDAwMCB9LAotCXsgLm5hbWUgPSAiVXNlciBGUyIsCi0JICAub2Zmc2V0ID0gMTYgKiAweDAwMTAwMDAwLAotCSAgLnNpemUgPSAgIDExMiAqIDB4MDAxMDAwMDAgfSwKLX07Ci0jZGVmaW5lIE5VTV9QQVJUSVRJT05TMTZLICAyCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TMzJLICAyCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TNjRLICAyCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TMTI4SyAyCi0KLS8qIAotICoJaGFyZHdhcmUgc3BlY2lmaWMgYWNjZXNzIHRvIGNvbnRyb2wtbGluZXMKLSovCi1zdGF0aWMgdm9pZCB0eDQ5MjVuZGZtY19od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCi17Ci0KLQlzd2l0Y2goY21kKXsKLQotCQljYXNlIE5BTkRfQ1RMX1NFVENMRTogCi0JCQl0eDQ5MjVfbmRmbWNwdHItPm1jciB8PSBUWDQ5MjVfTkRGTUNSX0NMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUkNMRToKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MjVfTkRGTUNSX0NMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVEFMRToKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyIHw9IFRYNDkyNV9OREZNQ1JfQUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfQ0xSQUxFOiAKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MjVfTkRGTUNSX0FMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVE5DRToKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyIHw9IFRYNDkyNV9OREZNQ1JfQ0U7Ci0JCQlicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6Ci0JCQl0eDQ5MjVfbmRmbWNwdHItPm1jciAmPSB+VFg0OTI1X05ERk1DUl9DRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVFdQOgotCQkJdHg0OTI1X25kZm1jcHRyLT5tY3IgfD0gVFg0OTI1X05ERk1DUl9XRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUldQOgotCQkJdHg0OTI1X25kZm1jcHRyLT5tY3IgJj0gflRYNDkyNV9OREZNQ1JfV0U7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0qCXJlYWQgZGV2aWNlIHJlYWR5IHBpbgotKi8KLXN0YXRpYyBpbnQgdHg0OTI1bmRmbWNfZGV2aWNlX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCWludCByZWFkeTsKLQlyZWFkeSA9ICh0eDQ5MjVfbmRmbWNwdHItPnNyICYgVFg0OTI1X05EU0ZSX0JVU1kpID8gMCA6IDE7Ci0JcmV0dXJuIHJlYWR5OwotfQotdm9pZCB0eDQ5MjVuZGZtY19lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQotewotCS8qIHJlc2V0IGZpcnN0ICovCi0JdHg0OTI1X25kZm1jcHRyLT5tY3IgfD0gVFg0OTI1X05ERk1DUl9FQ0NfQ05UTF9NQVNLOwotCXR4NDkyNV9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MjVfTkRGTUNSX0VDQ19DTlRMX01BU0s7Ci0JdHg0OTI1X25kZm1jcHRyLT5tY3IgfD0gVFg0OTI1X05ERk1DUl9FQ0NfQ05UTF9FTkFCOwotfQotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfZGlzYWJsZV9lY2Modm9pZCkKLXsKLQl0eDQ5MjVfbmRmbWNwdHItPm1jciAmPSB+VFg0OTI1X05ERk1DUl9FQ0NfQ05UTF9NQVNLOwotfQotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfZW5hYmxlX3JlYWRfZWNjKHZvaWQpCi17Ci0JdHg0OTI1X25kZm1jcHRyLT5tY3IgJj0gflRYNDkyNV9OREZNQ1JfRUNDX0NOVExfTUFTSzsKLQl0eDQ5MjVfbmRmbWNwdHItPm1jciB8PSBUWDQ5MjVfTkRGTUNSX0VDQ19DTlRMX1JFQUQ7Ci19Ci12b2lkIHR4NDkyNW5kZm1jX3JlYWRlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKXsKLQlpbnQgaTsKLQl1X2NoYXIgKmVjYyA9IGVjY19jb2RlOwotICAgICAgICB0eDQ5MjVuZGZtY19lbmFibGVfcmVhZF9lY2MoKTsKLQlmb3IgKGkgPSAwO2kgPCA2O2krKyxlY2MrKykKLQkJKmVjYyA9IHR4NDkyNV9yZWFkX25mbWMoJih0eDQ5MjVfbmRmbWNwdHItPmR0cikpOwotICAgICAgICB0eDQ5MjVuZGZtY19kaXNhYmxlX2VjYygpOwotfQotdm9pZCB0eDQ5MjVuZGZtY19kZXZpY2Vfc2V0dXAodm9pZCkKLXsKLQotCSoodW5zaWduZWQgY2hhciAqKTB4YmIwMDUwMDAgJj0gfjB4MDg7Ci0KLSAgICAgICAgLyogcmVzZXQgTkRGTUMgKi8KLSAgICAgICAgdHg0OTI1X25kZm1jcHRyLT5yc3RyIHw9IFRYNDkyNV9OREZSU1RSX1JTVDsKLQl3aGlsZSAodHg0OTI1X25kZm1jcHRyLT5yc3RyICYgVFg0OTI1X05ERlJTVFJfUlNUKTsgICAgICAgCi0KLQkvKiBzZXR1cCBCdXNTZXBhcmV0ZSwgSG9sZCBUaW1lLCBTdHJvYmUgUHVsc2UgV2lkdGggKi8KLQl0eDQ5MjVfbmRmbWNwdHItPm1jciA9IFRYNDkyNV9CU1BSVCA/IFRYNDkyNV9OREZNQ1JfQlNQUlQgOiAwOwotCXR4NDkyNV9uZGZtY3B0ci0+c3ByID0gVFg0OTI1X0hPTEQgPDwgNCB8IFRYNDkyNV9TUFc7ICAgICAgICAgICAgIAotfQotc3RhdGljIHVfY2hhciB0eDQ5MjVuZGZtY19uYW5kX3JlYWRfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsKLSAgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLSAgICAgICAgcmV0dXJuIHR4NDkyNV9yZWFkX25mbWModGhpcy0+SU9fQUREUl9SKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfbmFuZF93cml0ZV9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgYnl0ZSkKLXsKLSAgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLSAgICAgICAgdHg0OTI1X3dyaXRlX25mbWMoYnl0ZSwgdGhpcy0+SU9fQUREUl9XKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfbmFuZF93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQlmb3IgKGk9MDsgaTxsZW47IGkrKykKLQkJdHg0OTI1X3dyaXRlX25mbWMoYnVmW2ldLCB0aGlzLT5JT19BRERSX1cpOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MjVuZGZtY19uYW5kX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCi0JZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCWJ1ZltpXSA9IHR4NDkyNV9yZWFkX25mbWModGhpcy0+SU9fQUREUl9SKTsKLX0KLQotc3RhdGljIGludCB0eDQ5MjVuZGZtY19uYW5kX3ZlcmlmeV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQlmb3IgKGk9MDsgaTxsZW47IGkrKykKLQkJaWYgKGJ1ZltpXSAhPSB0eDQ5MjVfcmVhZF9uZm1jKHRoaXMtPklPX0FERFJfUikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlCi0gKi8KLXN0YXRpYyB2b2lkIHR4NDkyNW5kZm1jX25hbmRfY29tbWFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCi17Ci0JcmVnaXN0ZXIgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQotCS8qIEJlZ2luIGNvbW1hbmQgbGF0Y2ggY3ljbGUgKi8KLQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwotCS8qCi0JICogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UuCi0JICovCi0JaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfU0VRSU4pIHsKLQkJaW50IHJlYWRjbWQ7Ci0KLQkJaWYgKGNvbHVtbiA+PSBtdGQtPm9vYmJsb2NrKSB7Ci0JCQkvKiBPT0IgYXJlYSAqLwotCQkJY29sdW1uIC09IG10ZC0+b29iYmxvY2s7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRE9PQjsKLQkJfSBlbHNlIGlmIChjb2x1bW4gPCAyNTYpIHsKLQkJCS8qIEZpcnN0IDI1NiBieXRlcyAtLT4gUkVBRDAgKi8KLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFEMDsKLQkJfSBlbHNlIHsKLQkJCWNvbHVtbiAtPSAyNTY7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDE7Ci0JCX0KLQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIHJlYWRjbWQpOwotCX0KLQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgY29tbWFuZCk7Ci0KLQkvKiBTZXQgQUxFIGFuZCBjbGVhciBDTEUgdG8gc3RhcnQgYWRkcmVzcyBjeWNsZSAqLwotCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkNMRSk7Ci0KLQlpZiAoY29sdW1uICE9IC0xIHx8IHBhZ2VfYWRkciAhPSAtMSkgewotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRBTEUpOwotCi0JCS8qIFNlcmlhbGx5IGlucHV0IGFkZHJlc3MgKi8KLQkJaWYgKGNvbHVtbiAhPSAtMSkKLQkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCBjb2x1bW4pOwotCQlpZiAocGFnZV9hZGRyICE9IC0xKSB7Ci0JCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpIChwYWdlX2FkZHIgJiAweGZmKSk7Ci0JCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpICgocGFnZV9hZGRyID4+IDgpICYgMHhmZikpOwotCQkJLyogT25lIG1vcmUgYWRkcmVzcyBjeWNsZSBmb3IgaGlnaGVyIGRlbnNpdHkgZGV2aWNlcyAqLwotCQkJaWYgKG10ZC0+c2l6ZSAmIDB4MGMwMDAwMDApIAotCQkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCAodW5zaWduZWQgY2hhcikgKChwYWdlX2FkZHIgPj4gMTYpICYgMHgwZikpOwotCQl9Ci0JCS8qIExhdGNoIGluIGFkZHJlc3MgKi8KLQkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQUxFKTsKLQl9Ci0JCi0JLyogCi0JICogcHJvZ3JhbSBhbmQgZXJhc2UgaGF2ZSB0aGVpciBvd24gYnVzeSBoYW5kbGVycyAKLQkgKiBzdGF0dXMgYW5kIHNlcXVlbnRpYWwgaW4gbmVlZHMgbm8gZGVsYXkKLQkqLwotCXN3aXRjaCAoY29tbWFuZCkgewotCQkJCi0JY2FzZSBOQU5EX0NNRF9QQUdFUFJPRzoKLQkJLyogVHVybiBvZmYgV0UgKi8KLQkJdGhpcy0+aHdjb250cm9sIChtdGQsIE5BTkRfQ1RMX0NMUldQKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQljYXNlIE5BTkRfQ01EX1NFUUlOOgotCQkvKiBUdXJuIG9uIFdFICovCi0JCXRoaXMtPmh3Y29udHJvbCAobXRkLCBOQU5EX0NUTF9TRVRXUCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JY2FzZSBOQU5EX0NNRF9FUkFTRTE6Ci0JY2FzZSBOQU5EX0NNRF9FUkFTRTI6Ci0JY2FzZSBOQU5EX0NNRF9TVEFUVVM6Ci0JCXJldHVybjsKLQotCWNhc2UgTkFORF9DTURfUkVTRVQ6Ci0JCWlmICh0aGlzLT5kZXZfcmVhZHkpCQotCQkJYnJlYWs7Ci0JCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7Ci0JCXRoaXMtPndyaXRlX2J5dGUobXRkLCBOQU5EX0NNRF9TVEFUVVMpOwotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOwotCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiAweDQwKSk7Ci0JCXJldHVybjsKLQotCS8qIFRoaXMgYXBwbGllcyB0byByZWFkIGNvbW1hbmRzICovCQotCWRlZmF1bHQ6Ci0JCS8qIAotCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYnVzeSBwaW4sIHdlIGFwcGx5IHRoZSBnaXZlbgotCQkgKiBjb21tYW5kIGRlbGF5Ci0JCSovCi0JCWlmICghdGhpcy0+ZGV2X3JlYWR5KSB7Ci0JCQl1ZGVsYXkgKHRoaXMtPmNoaXBfZGVsYXkpOwotCQkJcmV0dXJuOwotCQl9CQotCX0KLQkKLQkvKiB3YWl0IHVudGlsIGNvbW1hbmQgaXMgcHJvY2Vzc2VkICovCi0Jd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLWV4dGVybiBpbnQgcGFyc2VfY21kbGluZV9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLCBzdHJ1Y3QgbXRkX3BhcnRpdGlvCi1uICoqcHBhcnRzLCBjaGFyICopOwotI2VuZGlmCi0KLS8qCi0gKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKLSAqLwotZXh0ZXJuIGludCBuYW5kX2NvcnJlY3RfZGF0YShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpkYXQsIHVfY2hhciAqcmVhZF9lY2MsIHVfY2hhciAqY2FsY19lY2MpOwotaW50IF9faW5pdCB0eDQ5MjVuZGZtY19pbml0ICh2b2lkKQotewotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7Ci0JaW50IGVyciA9IDA7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KLQl0eDQ5MjVuZGZtY19tdGQgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZiAoc3RydWN0IG5hbmRfY2hpcCksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0eDQ5MjVuZGZtY19tdGQpIHsKLQkJcHJpbnRrICgiVW5hYmxlIHRvIGFsbG9jYXRlIFJCVFg0OTI1IE5BTkQgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0gICAgICAgIHR4NDkyNW5kZm1jX2RldmljZV9zZXR1cCgpOwotCi0JLyogaW8gaXMgaW5kaXJlY3QgdmlhIGEgcmVnaXN0ZXIgc28gZG9uJ3QgbmVlZCB0byBpb3JlbWFwIGFkZHJlc3MgKi8KLQotCS8qIEdldCBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLwotCXRoaXMgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSAoJnR4NDkyNW5kZm1jX210ZFsxXSk7Ci0KLQkvKiBJbml0aWFsaXplIHN0cnVjdHVyZXMgKi8KLQltZW1zZXQoKGNoYXIgKikgdHg0OTI1bmRmbWNfbXRkLCAwLCBzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSk7Ci0JbWVtc2V0KChjaGFyICopIHRoaXMsIDAsIHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSk7Ci0KLQkvKiBMaW5rIHRoZSBwcml2YXRlIGRhdGEgd2l0aCB0aGUgTVREIHN0cnVjdHVyZSAqLwotCXR4NDkyNW5kZm1jX210ZC0+cHJpdiA9IHRoaXM7Ci0KLQkvKiBTZXQgYWRkcmVzcyBvZiBOQU5EIElPIGxpbmVzICovCi0JdGhpcy0+SU9fQUREUl9SID0gKHZvaWQgX19pb21lbSAqKSYodHg0OTI1X25kZm1jcHRyLT5kdHIpOwotCXRoaXMtPklPX0FERFJfVyA9ICh2b2lkIF9faW9tZW0gKikmKHR4NDkyNV9uZGZtY3B0ci0+ZHRyKTsKLQl0aGlzLT5od2NvbnRyb2wgPSB0eDQ5MjVuZGZtY19od2NvbnRyb2w7Ci0JdGhpcy0+ZW5hYmxlX2h3ZWNjID0gdHg0OTI1bmRmbWNfZW5hYmxlX2h3ZWNjOwotCXRoaXMtPmNhbGN1bGF0ZV9lY2MgPSB0eDQ5MjVuZGZtY19yZWFkZWNjOwotCXRoaXMtPmNvcnJlY3RfZGF0YSA9IG5hbmRfY29ycmVjdF9kYXRhOwotCXRoaXMtPmVjY21vZGUgPSBOQU5EX0VDQ19IVzZfNTEyOwkKLQl0aGlzLT5kZXZfcmVhZHkgPSB0eDQ5MjVuZGZtY19kZXZpY2VfcmVhZHk7Ci0JLyogMjAgdXMgY29tbWFuZCBkZWxheSB0aW1lICovCi0JdGhpcy0+Y2hpcF9kZWxheSA9IDIwOwkJCi0gICAgICAgIHRoaXMtPnJlYWRfYnl0ZSA9IHR4NDkyNW5kZm1jX25hbmRfcmVhZF9ieXRlOwotICAgICAgICB0aGlzLT53cml0ZV9ieXRlID0gdHg0OTI1bmRmbWNfbmFuZF93cml0ZV9ieXRlOwotCXRoaXMtPmNtZGZ1bmMgPSB0eDQ5MjVuZGZtY19uYW5kX2NvbW1hbmQ7Ci0JdGhpcy0+d3JpdGVfYnVmID0gdHg0OTI1bmRmbWNfbmFuZF93cml0ZV9idWY7Ci0JdGhpcy0+cmVhZF9idWYgPSB0eDQ5MjVuZGZtY19uYW5kX3JlYWRfYnVmOwotCXRoaXMtPnZlcmlmeV9idWYgPSB0eDQ5MjVuZGZtY19uYW5kX3ZlcmlmeV9idWY7Ci0KLQkvKiBTY2FuIHRvIGZpbmQgZXhpc3RhbmNlIG9mIHRoZSBkZXZpY2UgKi8KLQlpZiAobmFuZF9zY2FuICh0eDQ5MjVuZGZtY19tdGQsIDEpKSB7Ci0JCWVyciA9IC1FTlhJTzsKLQkJZ290byBvdXRfaW9yOwotCX0KLQotCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbXRkX3BhcnRzX25iID0gMDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbXRkX3BhcnRzID0gMDsKLSAgICAgICAgICAgICAgICBtdGRfcGFydHNfbmIgPSBwYXJzZV9jbWRsaW5lX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCAmbXRkX3BhcnRzLCAidHg0OTI1bmRmbWMiKTsKLSAgICAgICAgICAgICAgICBpZiAobXRkX3BhcnRzX25iID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MjVuZGZtY19tdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRfbXRkX2RldmljZSh0eDQ5MjVuZGZtY19tdGQpOwotICAgICAgICB9Ci0jZWxzZSAvKiBpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgKi8KLQlzd2l0Y2godHg0OTI1bmRmbWNfbXRkLT5zaXplKXsKLQkJY2FzZSAweDAxMDAwMDAwOiBhZGRfbXRkX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCBwYXJ0aXRpb25faW5mbzE2aywgTlVNX1BBUlRJVElPTlMxNkspOyBicmVhazsKLQkJY2FzZSAweDAyMDAwMDAwOiBhZGRfbXRkX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCBwYXJ0aXRpb25faW5mbzMyaywgTlVNX1BBUlRJVElPTlMzMkspOyBicmVhazsKLQkJY2FzZSAweDA0MDAwMDAwOiBhZGRfbXRkX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCBwYXJ0aXRpb25faW5mbzY0aywgTlVNX1BBUlRJVElPTlM2NEspOyBicmVhazsgCi0JCWNhc2UgMHgwODAwMDAwMDogYWRkX210ZF9wYXJ0aXRpb25zKHR4NDkyNW5kZm1jX210ZCwgcGFydGl0aW9uX2luZm8xMjhrLCBOVU1fUEFSVElUSU9OUzEyOEspOyBicmVhazsgCi0JCWRlZmF1bHQ6IHsKLQkJCXByaW50ayAoIlVuc3VwcG9ydGVkIFNtYXJ0TWVkaWEgZGV2aWNlXG4iKTsgCi0JCQllcnIgPSAtRU5YSU87Ci0JCQlnb3RvIG91dF9pb3I7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTICovCi0JZ290byBvdXQ7Ci0KLW91dF9pb3I6Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotbW9kdWxlX2luaXQodHg0OTI1bmRmbWNfaW5pdCk7Ci0KLS8qCi0gKiBDbGVhbiB1cCByb3V0aW5lCi0gKi8KLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyB2b2lkIF9fZXhpdCB0eDQ5MjVuZGZtY19jbGVhbnVwICh2b2lkKQotewotCS8qIFJlbGVhc2UgcmVzb3VyY2VzLCB1bnJlZ2lzdGVyIGRldmljZSAqLwotCW5hbmRfcmVsZWFzZSAodHg0OTI1bmRmbWNfbXRkKTsKLQotCS8qIEZyZWUgdGhlIE1URCBkZXZpY2Ugc3RydWN0dXJlICovCi0Ja2ZyZWUgKHR4NDkyNW5kZm1jX210ZCk7Ci19Ci1tb2R1bGVfZXhpdCh0eDQ5MjVuZGZtY19jbGVhbnVwKTsKLSNlbmRpZgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJBbGljZSBIZW5uZXNzeSA8YWhlbm5lc3N5QG12aXN0YS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkdsdWUgbGF5ZXIgZm9yIFNtYXJ0TWVkaWFDYXJkIG9uIFRvc2hpYmEgUkJUWDQ5MjUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvdHg0OTM4bmRmbWMuYyBiL2RyaXZlcnMvbXRkL25hbmQvdHg0OTM4bmRmbWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyNmU1OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3R4NDkzOG5kZm1jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoKLSAqIGRyaXZlcnMvbXRkL25hbmQvdHg0OTM4bmRmbWMuYwotICoKLSAqICBPdmVydmlldzoKLSAqICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBjb25uZWN0ZWQgdG8KLSAqICAgVFg0OTM4IGludGVybmFsIE5BTkQgTWVtb3J5IENvbnRyb2xsZXIuCi0gKiAgIFRYNDkzOCBOREZNQyBpcyBhbG1vc3Qgc2FtZSBhcyBUWDQ5MjUgTkRGTUMsIGJ1dCByZWdpc3RlciBzaXplIGFyZSA2NCBiaXQuCi0gKgotICogQXV0aG9yOiBzb3VyY2VAbXZpc3RhLmNvbQotICoKLSAqIEJhc2VkIG9uIHNwaWEuYyBieSBTdGV2ZW4gSi4gSGlsbAotICoKLSAqICRJZDogdHg0OTM4bmRmbWMuYyx2IDEuNCAyMDA0LzEwLzA1IDEzOjUwOjIwIGdsZWl4bmVyIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbiAKLSAqCi0gKiAyMDAzIChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcwotICogbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICovCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL3R4NDkzOC9yYnR4NDkzOC5oPgotCi1leHRlcm4gc3RydWN0IG5hbmRfb29iaW5mbyBqZmZzMl9vb2JpbmZvOwotCi0vKgotICogTVREIHN0cnVjdHVyZSBmb3IgVFg0OTM4IE5ERk1DCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnR4NDkzOG5kZm1jX210ZDsKLQotLyoKLSAqIERlZmluZSBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKLSAqLwotI2RlZmluZSBmbHVzaF93YigpCSh2b2lkKXR4NDkzOF9uZGZtY3B0ci0+bWNyOwotCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TICAJMwotI2RlZmluZSBOVU1CRVJfT0ZfQ0lTX0JMT0NLUwkyNAotI2RlZmluZSBTSVpFX09GX0JMT0NLCQkweDAwMDA0MDAwCi0jZGVmaW5lIE5VTUJFUl9PRl9CTE9DS19QRVJfWk9ORSAxMDI0Ci0jZGVmaW5lIFNJWkVfT0ZfWk9ORQkJKE5VTUJFUl9PRl9CTE9DS19QRVJfWk9ORSAqIFNJWkVfT0ZfQkxPQ0spCi0jaWZuZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwotLyoKLSAqIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgc2FtcGxlIG9mIE1URCBwYXJ0aXRpb25zIAotICogb24gdGhlIE5BTkQgRmxhc2ggTWVtb3J5IDMyTUIgb3IgbW9yZS4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIGZpZ3VyZSBzaG93cyB0aGUgaW1hZ2Ugb2YgdGhlIHNhbXBsZSBwYXJ0aXRpb24gb24KLSAqIHRoZSAzMk1CIE5BTkQgRmxhc2ggTWVtb3J5LiAKLSAqCi0gKiAgIEJsb2NrIE5vLgotICogICAgMCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIC0tLS0tLQotICogICAgICB8ICAgICAgICAgICAgIENJUyAgICAgICAgICAgICB8ICAgXgotICogICAyNCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgfAotICogICAgICB8ICAgICAgICAga2VybmVsIGltYWdlICAgICAgICB8ICAgfCBab25lIDAKLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKLSAqICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgIHwKLSAqIDEwMjMgfCAgICAgICAgIHVudXNlZCBhcmVhICAgICAgICAgfCAgIHYKLSAqICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAtLS0tLS0KLSAqIDEwMjQgfCAgICAgICAgICAgIEpGRlMyICAgICAgICAgICAgfCAgIF4KLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwgWm9uZSAxCi0gKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB2Ci0gKiAyMDQ3ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgLS0tLS0tCi0gKgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bTlVNX1BBUlRJVElPTlNdID0gewotCXsKLQkJLm5hbWUgPSAiUkJUWDQ5MzggQ0lTIEFyZWEiLAotIAkJLm9mZnNldCA9ICAwLAotIAkJLnNpemUgPSAgICAoTlVNQkVSX09GX0NJU19CTE9DS1MgKiBTSVpFX09GX0JMT0NLKSwKLSAJCS5tYXNrX2ZsYWdzICA9IE1URF9XUklURUFCTEUJLyogVGhpcyBwYXJ0aXRpb24gaXMgTk9UIHdyaXRhYmxlICovCi0gCX0sCi0gCXsKLSAJCS5uYW1lID0gIlJCVFg0OTM4IGtlcm5lbCBpbWFnZSIsCi0gCQkub2Zmc2V0ID0gIE1URFBBUlRfT0ZTX0FQUEVORCwKLSAJCS5zaXplID0gICAgOCAqIDB4MDAxMDAwMDAsCS8qIDhNQiAoRGVwZW5kcyBvbiBzaXplIG9mIGtlcm5lbCBpbWFnZSkgKi8KLSAJCS5tYXNrX2ZsYWdzICA9IE1URF9XUklURUFCTEUJLyogVGhpcyBwYXJ0aXRpb24gaXMgTk9UIHdyaXRhYmxlICovCi0gCX0sCi0gCXsKLSAJCS5uYW1lID0gIlJvb3QgRlMgKEpGRlMyKSIsCi0gCQkub2Zmc2V0ID0gICgwICsgU0laRV9PRl9aT05FKSwgICAgLyogc3RhcnQgYWRkcmVzcyBvZiBuZXh0IHpvbmUgKi8KLSAJCS5zaXplID0gICAgTVREUEFSVF9TSVpfRlVMTAotIAl9LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBOQU5EX0NUTF9TRVRDTEU6Ci0JCQl0eDQ5MzhfbmRmbWNwdHItPm1jciB8PSBUWDQ5MzhfTkRGTUNSX0NMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUkNMRToKLQkJCXR4NDkzOF9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MzhfTkRGTUNSX0NMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVEFMRToKLQkJCXR4NDkzOF9uZGZtY3B0ci0+bWNyIHw9IFRYNDkzOF9OREZNQ1JfQUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfQ0xSQUxFOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgJj0gflRYNDkzOF9OREZNQ1JfQUxFOwotCQkJYnJlYWs7Ci0JCS8qIFRYNDkzOF9OREZNQ1JfQ0UgYml0IGlzIDA6aGlnaCAxOmxvdyAqLwotCQljYXNlIE5BTkRfQ1RMX1NFVE5DRToKLQkJCXR4NDkzOF9uZGZtY3B0ci0+bWNyIHw9IFRYNDkzOF9OREZNQ1JfQ0U7Ci0JCQlicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6Ci0JCQl0eDQ5MzhfbmRmbWNwdHItPm1jciAmPSB+VFg0OTM4X05ERk1DUl9DRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVFdQOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgfD0gVFg0OTM4X05ERk1DUl9XRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUldQOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgJj0gflRYNDkzOF9OREZNQ1JfV0U7Ci0JCQlicmVhazsKLQl9Ci19Ci1zdGF0aWMgaW50IHR4NDkzOG5kZm1jX2Rldl9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsKLQlmbHVzaF93YigpOwotCXJldHVybiAhKHR4NDkzOF9uZGZtY3B0ci0+c3IgJiBUWDQ5MzhfTkRGU1JfQlVTWSk7Ci19Ci1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19jYWxjdWxhdGVfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKLXsKLQl1MzIgbWNyID0gdHg0OTM4X25kZm1jcHRyLT5tY3I7Ci0JbWNyICY9IH5UWDQ5MzhfTkRGTUNSX0VDQ19BTEw7Ci0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBtY3IgfCBUWDQ5MzhfTkRGTUNSX0VDQ19PRkY7Ci0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBtY3IgfCBUWDQ5MzhfTkRGTUNSX0VDQ19SRUFEOwotCWVjY19jb2RlWzFdID0gdHg0OTM4X25kZm1jcHRyLT5kdHI7Ci0JZWNjX2NvZGVbMF0gPSB0eDQ5MzhfbmRmbWNwdHItPmR0cjsKLQllY2NfY29kZVsyXSA9IHR4NDkzOF9uZGZtY3B0ci0+ZHRyOwotCXR4NDkzOF9uZGZtY3B0ci0+bWNyID0gbWNyIHwgVFg0OTM4X05ERk1DUl9FQ0NfT0ZGOwotfQotc3RhdGljIHZvaWQgdHg0OTM4bmRmbWNfZW5hYmxlX2h3ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbW9kZSkKLXsKLQl1MzIgbWNyID0gdHg0OTM4X25kZm1jcHRyLT5tY3I7Ci0JbWNyICY9IH5UWDQ5MzhfTkRGTUNSX0VDQ19BTEw7Ci0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBtY3IgfCBUWDQ5MzhfTkRGTUNSX0VDQ19SRVNFVDsKLQl0eDQ5MzhfbmRmbWNwdHItPm1jciA9IG1jciB8IFRYNDkzOF9OREZNQ1JfRUNDX09GRjsKLQl0eDQ5MzhfbmRmbWNwdHItPm1jciA9IG1jciB8IFRYNDkzOF9OREZNQ1JfRUNDX09OOwotfQotCi1zdGF0aWMgdV9jaGFyIHR4NDkzOG5kZm1jX25hbmRfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0JcmV0dXJuIHR4NDkzOF9yZWFkX25mbWModGhpcy0+SU9fQUREUl9SKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTM4bmRmbWNfbmFuZF93cml0ZV9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgYnl0ZSkKLXsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCXR4NDkzOF93cml0ZV9uZm1jKGJ5dGUsIHRoaXMtPklPX0FERFJfVyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR4NDkzOG5kZm1jX25hbmRfd3JpdGVfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCi0JZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCXR4NDkzOF93cml0ZV9uZm1jKGJ1ZltpXSwgdGhpcy0+SU9fQUREUl9XKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTM4bmRmbWNfbmFuZF9yZWFkX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQotCWZvciAoaT0wOyBpPGxlbjsgaSsrKQotCQlidWZbaV0gPSB0eDQ5MzhfcmVhZF9uZm1jKHRoaXMtPklPX0FERFJfUik7Ci19Ci0KLXN0YXRpYyBpbnQgdHg0OTM4bmRmbWNfbmFuZF92ZXJpZnlfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCi0JZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCWlmIChidWZbaV0gIT0gdHg0OTM4X3JlYWRfbmZtYyh0aGlzLT5JT19BRERSX1IpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNlbmQgY29tbWFuZCB0byBOQU5EIGRldmljZQotICovCi1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19uYW5kX2NvbW1hbmQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBjb21tYW5kLCBpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyKQotewotCXJlZ2lzdGVyIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQkvKiBCZWdpbiBjb21tYW5kIGxhdGNoIGN5Y2xlICovCi0JdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQ0xFKTsKLQkvKgotCSAqIFdyaXRlIG91dCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlLgotCSAqLwotCWlmIChjb21tYW5kID09IE5BTkRfQ01EX1NFUUlOKSB7Ci0JCWludCByZWFkY21kOwotCi0JCWlmIChjb2x1bW4gPj0gbXRkLT5vb2JibG9jaykgewotCQkJLyogT09CIGFyZWEgKi8KLQkJCWNvbHVtbiAtPSBtdGQtPm9vYmJsb2NrOwotCQkJcmVhZGNtZCA9IE5BTkRfQ01EX1JFQURPT0I7Ci0JCX0gZWxzZSBpZiAoY29sdW1uIDwgMjU2KSB7Ci0JCQkvKiBGaXJzdCAyNTYgYnl0ZXMgLS0+IFJFQUQwICovCi0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDA7Ci0JCX0gZWxzZSB7Ci0JCQljb2x1bW4gLT0gMjU2OwotCQkJcmVhZGNtZCA9IE5BTkRfQ01EX1JFQUQxOwotCQl9Ci0JCXRoaXMtPndyaXRlX2J5dGUobXRkLCByZWFkY21kKTsKLQl9Ci0JdGhpcy0+d3JpdGVfYnl0ZShtdGQsIGNvbW1hbmQpOwotCi0JLyogU2V0IEFMRSBhbmQgY2xlYXIgQ0xFIHRvIHN0YXJ0IGFkZHJlc3MgY3ljbGUgKi8KLQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOwotCi0JaWYgKGNvbHVtbiAhPSAtMSB8fCBwYWdlX2FkZHIgIT0gLTEpIHsKLQkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQUxFKTsKLQotCQkvKiBTZXJpYWxseSBpbnB1dCBhZGRyZXNzICovCi0JCWlmIChjb2x1bW4gIT0gLTEpCi0JCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgY29sdW1uKTsKLQkJaWYgKHBhZ2VfYWRkciAhPSAtMSkgewotCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsICh1bnNpZ25lZCBjaGFyKSAocGFnZV9hZGRyICYgMHhmZikpOwotCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsICh1bnNpZ25lZCBjaGFyKSAoKHBhZ2VfYWRkciA+PiA4KSAmIDB4ZmYpKTsKLQkJCS8qIE9uZSBtb3JlIGFkZHJlc3MgY3ljbGUgZm9yIGhpZ2hlciBkZW5zaXR5IGRldmljZXMgKi8KLQkJCWlmIChtdGQtPnNpemUgJiAweDBjMDAwMDAwKSAKLQkJCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpICgocGFnZV9hZGRyID4+IDE2KSAmIDB4MGYpKTsKLQkJfQotCQkvKiBMYXRjaCBpbiBhZGRyZXNzICovCi0JCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkFMRSk7Ci0JfQotCQotCS8qIAotCSAqIHByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMgCi0JICogc3RhdHVzIGFuZCBzZXF1ZW50aWFsIGluIG5lZWRzIG5vIGRlbGF5Ci0JKi8KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJCQotCWNhc2UgTkFORF9DTURfUEFHRVBST0c6Ci0JCS8qIFR1cm4gb2ZmIFdFICovCi0JCXRoaXMtPmh3Y29udHJvbCAobXRkLCBOQU5EX0NUTF9DTFJXUCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JY2FzZSBOQU5EX0NNRF9TRVFJTjoKLQkJLyogVHVybiBvbiBXRSAqLwotCQl0aGlzLT5od2NvbnRyb2wgKG10ZCwgTkFORF9DVExfU0VUV1ApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCWNhc2UgTkFORF9DTURfRVJBU0UxOgotCWNhc2UgTkFORF9DTURfRVJBU0UyOgotCWNhc2UgTkFORF9DTURfU1RBVFVTOgotCQlyZXR1cm47Ci0KLQljYXNlIE5BTkRfQ01EX1JFU0VUOgotCQlpZiAodGhpcy0+ZGV2X3JlYWR5KQkKLQkJCWJyZWFrOwotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwotCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgTkFORF9DTURfU1RBVFVTKTsKLQkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKLQkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOwotCQlyZXR1cm47Ci0KLQkvKiBUaGlzIGFwcGxpZXMgdG8gcmVhZCBjb21tYW5kcyAqLwkKLQlkZWZhdWx0OgotCQkvKiAKLQkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGJ1c3kgcGluLCB3ZSBhcHBseSB0aGUgZ2l2ZW4KLQkJICogY29tbWFuZCBkZWxheQotCQkqLwotCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkgewotCQkJdWRlbGF5ICh0aGlzLT5jaGlwX2RlbGF5KTsKLQkJCXJldHVybjsKLQkJfQkKLQl9Ci0JCi0JLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCAqLwotCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOwotfQotCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi1leHRlcm4gaW50IHBhcnNlX2NtZGxpbmVfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3Rlciwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsIGNoYXIgKik7Ci0jZW5kaWYKLS8qCi0gKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKLSAqLwotaW50IF9faW5pdCB0eDQ5MzhuZGZtY19pbml0ICh2b2lkKQotewotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7Ci0JaW50IGJzcHJ0ID0gMCwgaG9sZCA9IDB4Ziwgc3B3ID0gMHhmOwotCWludCBwcm90ZWN0ZWQgPSAwOwotCi0JaWYgKCgqcmJ0eDQ5MzhfcGlvc2VsX3B0ciAmIDB4MGMpICE9IDB4MDgpIHsKLQkJcHJpbnRrKCJUWDQ5MzggTkRGTUM6IGRpc2FibGVkIGJ5IElPQyBQSU9TRUxcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYnNwcnQgPSAxOwotCWhvbGQgPSAyOwotCXNwdyA9IDkgLSAxOwkvKiA4IEdCVVNDTEsgPSA4MG5zIChAIEdCVVNDTEsgMTAwTUh6KSAqLwotCi0JaWYgKCh0eDQ5MzhfY2NmZ3B0ci0+cGNmZyAmCi0JICAgICAoVFg0OTM4X1BDRkdfQVRBX1NFTHxUWDQ5MzhfUENGR19JU0FfU0VMfFRYNDkzOF9QQ0ZHX05ERl9TRUwpKQotCSAgICAhPSBUWDQ5MzhfUENGR19OREZfU0VMKSB7Ci0JCXByaW50aygiVFg0OTM4IE5ERk1DOiBkaXNhYmxlZCBieSBQQ0ZHLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIHJlc2V0IE5ERk1DICovCi0JdHg0OTM4X25kZm1jcHRyLT5yc3RyIHw9IFRYNDkzOF9OREZSU1RSX1JTVDsKLQl3aGlsZSAodHg0OTM4X25kZm1jcHRyLT5yc3RyICYgVFg0OTM4X05ERlJTVFJfUlNUKQotCQk7Ci0JLyogc2V0dXAgQnVzU2VwYXJldGUsIEhvbGQgVGltZSwgU3Ryb2JlIFB1bHNlIFdpZHRoICovCi0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBic3BydCA/IFRYNDkzOF9OREZNQ1JfQlNQUlQgOiAwOwotCXR4NDkzOF9uZGZtY3B0ci0+c3ByID0gaG9sZCA8PCA0IHwgc3B3OwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCi0JdHg0OTM4bmRmbWNfbXRkID0ga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykgKyBzaXplb2YgKHN0cnVjdCBuYW5kX2NoaXApLAotCQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmICghdHg0OTM4bmRmbWNfbXRkKSB7Ci0JCXByaW50ayAoIlVuYWJsZSB0byBhbGxvY2F0ZSBUWDQ5MzggTkRGTUMgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogR2V0IHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhICovCi0JdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopICgmdHg0OTM4bmRmbWNfbXRkWzFdKTsKLQotCS8qIEluaXRpYWxpemUgc3RydWN0dXJlcyAqLwotCW1lbXNldCgoY2hhciAqKSB0eDQ5MzhuZGZtY19tdGQsIDAsIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKLQltZW1zZXQoKGNoYXIgKikgdGhpcywgMCwgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApKTsKLQotCS8qIExpbmsgdGhlIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBNVEQgc3RydWN0dXJlICovCi0JdHg0OTM4bmRmbWNfbXRkLT5wcml2ID0gdGhpczsKLQotCS8qIFNldCBhZGRyZXNzIG9mIE5BTkQgSU8gbGluZXMgKi8KLQl0aGlzLT5JT19BRERSX1IgPSAodW5zaWduZWQgbG9uZykmdHg0OTM4X25kZm1jcHRyLT5kdHI7Ci0JdGhpcy0+SU9fQUREUl9XID0gKHVuc2lnbmVkIGxvbmcpJnR4NDkzOF9uZGZtY3B0ci0+ZHRyOwotCXRoaXMtPmh3Y29udHJvbCA9IHR4NDkzOG5kZm1jX2h3Y29udHJvbDsKLQl0aGlzLT5kZXZfcmVhZHkgPSB0eDQ5MzhuZGZtY19kZXZfcmVhZHk7Ci0JdGhpcy0+Y2FsY3VsYXRlX2VjYyA9IHR4NDkzOG5kZm1jX2NhbGN1bGF0ZV9lY2M7Ci0JdGhpcy0+Y29ycmVjdF9kYXRhID0gbmFuZF9jb3JyZWN0X2RhdGE7Ci0JdGhpcy0+ZW5hYmxlX2h3ZWNjID0gdHg0OTM4bmRmbWNfZW5hYmxlX2h3ZWNjOwotCXRoaXMtPmVjY21vZGUgPSBOQU5EX0VDQ19IVzNfMjU2OwotCXRoaXMtPmNoaXBfZGVsYXkgPSAxMDA7Ci0JdGhpcy0+cmVhZF9ieXRlID0gdHg0OTM4bmRmbWNfbmFuZF9yZWFkX2J5dGU7Ci0JdGhpcy0+d3JpdGVfYnl0ZSA9IHR4NDkzOG5kZm1jX25hbmRfd3JpdGVfYnl0ZTsKLQl0aGlzLT5jbWRmdW5jID0gdHg0OTM4bmRmbWNfbmFuZF9jb21tYW5kOwotCXRoaXMtPndyaXRlX2J1ZiA9IHR4NDkzOG5kZm1jX25hbmRfd3JpdGVfYnVmOwotCXRoaXMtPnJlYWRfYnVmID0gdHg0OTM4bmRmbWNfbmFuZF9yZWFkX2J1ZjsKLQl0aGlzLT52ZXJpZnlfYnVmID0gdHg0OTM4bmRmbWNfbmFuZF92ZXJpZnlfYnVmOwotCi0JLyogU2NhbiB0byBmaW5kIGV4aXN0YW5jZSBvZiB0aGUgZGV2aWNlICovCi0JaWYgKG5hbmRfc2NhbiAodHg0OTM4bmRmbWNfbXRkLCAxKSkgewotCQlrZnJlZSAodHg0OTM4bmRmbWNfbXRkKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlpZiAocHJvdGVjdGVkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlRYNDkzOCBOREZNQzogd3JpdGUgcHJvdGVjdGVkLlxuIik7Ci0JCXR4NDkzOG5kZm1jX210ZC0+ZmxhZ3MgJj0gfihNVERfV1JJVEVBQkxFIHwgTVREX0VSQVNFQUJMRSk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0JewotCQlpbnQgbXRkX3BhcnRzX25iID0gMDsKLQkJc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyA9IDA7Ci0JCW10ZF9wYXJ0c19uYiA9IHBhcnNlX2NtZGxpbmVfcGFydGl0aW9ucyh0eDQ5MzhuZGZtY19tdGQsICZtdGRfcGFydHMsICJ0eDQ5MzhuZGZtYyIpOwotCQlpZiAobXRkX3BhcnRzX25iID4gMCkKLQkJCWFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MzhuZGZtY19tdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKLQkJZWxzZQotCQkJYWRkX210ZF9kZXZpY2UodHg0OTM4bmRmbWNfbXRkKTsKLQl9Ci0jZWxzZQotCWFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MzhuZGZtY19tdGQsIHBhcnRpdGlvbl9pbmZvLCBOVU1fUEFSVElUSU9OUyApOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KHR4NDkzOG5kZm1jX2luaXQpOwotCi0vKgotICogQ2xlYW4gdXAgcm91dGluZQotICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgdHg0OTM4bmRmbWNfY2xlYW51cCAodm9pZCkKLXsKLQkvKiBSZWxlYXNlIHJlc291cmNlcywgdW5yZWdpc3RlciBkZXZpY2UgKi8KLQluYW5kX3JlbGVhc2UgKHR4NDkzOG5kZm1jX210ZCk7Ci0KLQkvKiBGcmVlIHRoZSBNVEQgZGV2aWNlIHN0cnVjdHVyZSAqLwotCWtmcmVlICh0eDQ5MzhuZGZtY19tdGQpOwotfQotbW9kdWxlX2V4aXQodHg0OTM4bmRmbWNfY2xlYW51cCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkFsaWNlIEhlbm5lc3N5IDxhaGVubmVzc3lAbXZpc3RhLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQm9hcmQtc3BlY2lmaWMgZ2x1ZSBsYXllciBmb3IgTkFORCBmbGFzaCBvbiBUWDQ5MzggTkRGTUMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IDJiNTU2ODcuLjlhMDdmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtMyw2ICszLDggQEAKICMgTmV0d29yayBkZXZpY2UgY29uZmlndXJhdGlvbgogIwogCittZW51ICJOZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCiBjb25maWcgTkVUREVWSUNFUwogCWRlcGVuZHMgb24gTkVUCiAJYm9vbCAiTmV0d29yayBkZXZpY2Ugc3VwcG9ydCIKQEAgLTI1NDcsMyArMjU0OSw0IEBACiAJSWYgeW91IHdhbnQgdG8gbG9nIGtlcm5lbCBtZXNzYWdlcyBvdmVyIHRoZSBuZXR3b3JrLCBlbmFibGUgdGhpcy4KIAlTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGNvbnNvbGUudHh0PiBmb3IgZGV0YWlscy4KIAorZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWcgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZwppbmRleCA2OWM0ODhkLi5iMTRlODkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZwpAQCAtMSw2ICsxLDMzIEBACiAjCiAjIEFwcGxldGFsayBkcml2ZXIgY29uZmlndXJhdGlvbgogIworY29uZmlnIEFUQUxLCisJdHJpc3RhdGUgIkFwcGxldGFsayBwcm90b2NvbCBzdXBwb3J0IgorCXNlbGVjdCBMTEMKKwktLS1oZWxwLS0tCisJICBBcHBsZVRhbGsgaXMgdGhlIHByb3RvY29sIHRoYXQgQXBwbGUgY29tcHV0ZXJzIGNhbiB1c2UgdG8gY29tbXVuaWNhdGUKKwkgIG9uIGEgbmV0d29yay4gIElmIHlvdXIgTGludXggYm94IGlzIGNvbm5lY3RlZCB0byBzdWNoIGEgbmV0d29yayBhbmQgeW91CisJICB3aXNoIHRvIGNvbm5lY3QgdG8gaXQsIHNheSBZLiAgWW91IHdpbGwgbmVlZCB0byB1c2UgdGhlIG5ldGF0YWxrIHBhY2thZ2UKKwkgIHNvIHRoYXQgeW91ciBMaW51eCBib3ggY2FuIGFjdCBhcyBhIHByaW50IGFuZCBmaWxlIHNlcnZlciBmb3IgTWFjcyBhcworCSAgd2VsbCBhcyBhY2Nlc3MgQXBwbGVUYWxrIHByaW50ZXJzLiAgQ2hlY2sgb3V0CisJICA8aHR0cDovL3d3dy56ZXR0YWJ5dGUubmV0L25ldGF0YWxrLz4gb24gdGhlIFdXVyBmb3IgZGV0YWlscy4KKwkgIEV0aGVyVGFsayBpcyB0aGUgbmFtZSB1c2VkIGZvciBBcHBsZVRhbGsgb3ZlciBFdGhlcm5ldCBhbmQgdGhlCisJICBjaGVhcGVyIGFuZCBzbG93ZXIgTG9jYWxUYWxrIGlzIEFwcGxlVGFsayBvdmVyIGEgcHJvcHJpZXRhcnkgQXBwbGUKKwkgIG5ldHdvcmsgdXNpbmcgc2VyaWFsIGxpbmtzLiAgRXRoZXJUYWxrIGFuZCBMb2NhbFRhbGsgYXJlIGZ1bGx5CisJICBzdXBwb3J0ZWQgYnkgTGludXguCisKKwkgIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGNvbm5lY3QgTGludXgsIFdpbmRvd3MgbWFjaGluZXMgYW5kCisJICBNYWNzIGlzIG9uIHRoZSBXV1cgYXQgPGh0dHA6Ly93d3cuZWF0cy5jb20vbGludXhfbWFjX3dpbi5odG1sPi4gIFRoZQorCSAgTkVULTMtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBjb250YWlucyB2YWx1YWJsZQorCSAgaW5mb3JtYXRpb24gYXMgd2VsbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYXBwbGV0YWxrLiBZb3UgYWxtb3N0IGNlcnRhaW5seSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlIHNvIHlvdSBjYW4gcmVzdGFydCB5b3VyIEFwcGxlVGFsayBzdGFjayB3aXRob3V0IHJlYm9vdGluZworCSAgeW91ciBtYWNoaW5lLiBJIGhlYXIgdGhhdCB0aGUgR05VIGJveWNvdHQgb2YgQXBwbGUgaXMgb3Zlciwgc28KKwkgIGV2ZW4gcG9saXRpY2FsbHkgY29ycmVjdCBwZW9wbGUgYXJlIGFsbG93ZWQgdG8gc2F5IFkgaGVyZS4KKwogY29uZmlnIERFVl9BUFBMRVRBTEsKIAlib29sICJBcHBsZXRhbGsgaW50ZXJmYWNlcyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVRBTEsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5jIGIvZHJpdmVycy9uZXQvYjQ0LmMKaW5kZXggZjFiZDQ1ZS4uOTQ5MzlmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTE5MzAsNiArMTkzMCw3IEBACiAJYjQ0X2ZyZWVfcmluZ3MoYnApOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xOTM5LDYgKzE5NDAsOCBAQAogCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm1hYy5jIGIvZHJpdmVycy9uZXQvYm1hYy5jCmluZGV4IDAwZTUyNTcuLjhkYzY1N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JtYWMuYworKysgYi9kcml2ZXJzL25ldC9ibWFjLmMKQEAgLTEyNjEsNyArMTI2MSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgYm1hY19wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgYm1hY19wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlpbnQgaiwgcmV2LCByZXQ7CiAJc3RydWN0IGJtYWNfZGF0YSAqYnA7CkBAIC0xNjQ1LDE2ICsxNjQ1LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggYm1hY19tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBibWFjX21hdGNoW10gPSAKIHsKIAl7CiAJLm5hbWUgCQk9ICJibWFjIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gsCiAJLmRhdGEJCT0gKHZvaWQgKikwLAogCX0sCiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gIm5ldHdvcmsiLAogCS5jb21wYXRpYmxlCT0gImJtYWMrIiwKIAkuZGF0YQkJPSAodm9pZCAqKTEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jCmluZGV4IGVjZTFiMWExLi5jMjdlNDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYwpAQCAtMzA0LDcgKzMwNCw3IEBACiAJCXNjYy0+dHhfYnVmZiA9IE5VTEw7CiAJfQogCQotCXdoaWxlIChza2JfcXVldWVfbGVuKCZzY2MtPnR4X3F1ZXVlKSkKKwl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmc2NjLT50eF9xdWV1ZSkpCiAJCWRldl9rZnJlZV9za2Ioc2tiX2RlcXVldWUoJnNjYy0+dHhfcXVldWUpKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOwpAQCAtMTEyNiw4ICsxMTI2LDcgQEAKIAkKIAlpZiAoc2NjLT5zdGF0LnR4X3N0YXRlID09IFRYU19XQUlUKQkvKiBtYXhrZXl1cCBvciBpZGxlIHRpbWVvdXQgKi8KIAl7Ci0JCWlmIChza2JfcXVldWVfbGVuKCZzY2MtPnR4X3F1ZXVlKSA9PSAwKQkvKiBub3RoaW5nIHRvIHNlbmQgKi8KLQkJeworCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzY2MtPnR4X3F1ZXVlKSkgewkvKiBub3RoaW5nIHRvIHNlbmQgKi8KIAkJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19JRExFOwogCQkJbmV0aWZfd2FrZV9xdWV1ZShzY2MtPmRldik7CS8qIHRfbWF4a2V5dXAgbG9ja2VkIGl0LiAqLwogCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjZS5jIGIvZHJpdmVycy9uZXQvbWFjZS5jCmluZGV4IDZlZDJkN2QuLjgxZDBhMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2UuYworKysgYi9kcml2ZXJzL25ldC9tYWNlLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG1hY2VfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1hY2VfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICptYWNlID0gbWFjaW9fZ2V0X29mX25vZGUobWRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTEwMDksMTIgKzEwMDksMTAgQEAKICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggbWFjZV9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtYWNlX21hdGNoW10gPSAKIHsKIAl7CiAJLm5hbWUgCQk9ICJtYWNlIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKaW5kZXggYWFkNTQ5NC4uZjA5OTZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKQEAgLTM2OSw3ICszNjksNyBAQAogICogYXNzdW1lIDgwMi4zIGlmIHRoZSB0eXBlIGZpZWxkIGlzIHNob3J0IGVub3VnaCB0byBiZSBhIGxlbmd0aC4KICAqIFRoaXMgaXMgbm9ybWFsIHByYWN0aWNlIGFuZCB3b3JrcyBmb3IgYW55ICdub3cgaW4gdXNlJyBwcm90b2NvbC4KICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG15cmlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIF9fYmUxNiBteXJpX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRoaGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25lMmstcGNpLmMgYi9kcml2ZXJzL25ldC9uZTJrLXBjaS5jCmluZGV4IGExYTZjMDguLmYxYzAxYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25lMmstcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvbmUyay1wY2kuYwpAQCAtNjYwLDYgKzY2MCw3IEBACiAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CiAJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOwogCiAJcmV0dXJuIDA7CkBAIC02NzEsNiArNjcyLDggQEAKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CiAJTlM4MzkwX2luaXQoZGV2LCAxKTsKIAluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKaW5kZXggZjBmYzA0YmQuLjcxZmQ0MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCkBAIC04Niw3ICs4Niw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0zMTIsMTEgKzMxMSw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ0YzU3NF9ldmVudDsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTEyOTksNiArMTI5Myw3IEBACiAJCS5uYW1lCT0gIjNjNTc0X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gdGM1NzRfYXR0YWNoLAorCS5ldmVudAkJPSB0YzU3NF9ldmVudCwKIAkuZGV0YWNoCQk9IHRjNTc0X2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSB0YzU3NF9pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwppbmRleCA4ZmExYjVmLi5kODNmZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yMjYsMTEgKzIyNSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ0YzU4OV9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTEwNzQsNiArMTA2OCw3IEBACiAJCS5uYW1lCT0gIjNjNTg5X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gdGM1ODlfYXR0YWNoLAorCS5ldmVudAkJPSB0YzU4OV9ldmVudCwKIAkuZGV0YWNoCQk9IHRjNTg5X2RldGFjaCwKICAgICAgICAgLmlkX3RhYmxlICAgICAgID0gdGM1ODlfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKaW5kZXggMjNjZTc3Yi4uOGJiNGU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlICIuLi84MzkwLmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE4MSwxMSArMTgwLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF4bmV0X2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtODg0LDYgKzg3OCw3IEBACiAJCS5uYW1lCT0gImF4bmV0X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gYXhuZXRfYXR0YWNoLAorCS5ldmVudAkJPSBheG5ldF9ldmVudCwKIAkuZGV0YWNoCQk9IGF4bmV0X2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSBheG5ldF9pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwppbmRleCA2OGQ1OGNjLi5iOTM1NWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbTIwMDIwLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIwMCwxMSArMTk5LDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0gICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0gICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmNvbTIwMDIwX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDk1LDYgKzQ4OSw3IEBACiAJCS5uYW1lCT0gImNvbTIwMDIwX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gY29tMjAwMjBfYXR0YWNoLAorCS5ldmVudAkJPSBjb20yMDAyMF9ldmVudCwKIAkuZGV0YWNoCQk9IGNvbTIwMDIwX2RldGFjaCwKIAkuaWRfdGFibGUJPSBjb20yMDAyMF9pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKaW5kZXggOTE3YWRiYi4uOWQ4MTk3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjg4LDExICsyODcsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmZm12ajE4eF9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTc5Nyw2ICs3OTEsNyBAQAogCQkubmFtZQk9ICJmbXZqMTh4X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gZm12ajE4eF9hdHRhY2gsCisJLmV2ZW50CQk9IGZtdmoxOHhfZXZlbnQsCiAJLmRldGFjaAkJPSBmbXZqMTh4X2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSBmbXZqMTh4X2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCmluZGV4IGNmNmQwNzMuLmI2YzE0MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCkBAIC01Nyw3ICs1Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pYm10ci5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xOTAsMTEgKzE4OSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLSAgICAgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotICAgICAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotICAgICAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZpYm10cl9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTUyMSw2ICs1MTUsNyBAQAogCQkubmFtZQk9ICJpYm10cl9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGlibXRyX2F0dGFjaCwKKwkuZXZlbnQJCT0gaWJtdHJfZXZlbnQsCiAJLmRldGFjaAkJPSBpYm10cl9kZXRhY2gsCiAJLmlkX3RhYmxlICAgICAgID0gaWJtdHJfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwppbmRleCBiODZlNzI1Li5kYmI5NDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCkBAIC0xNDYsNyArMTQ2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtNTAyLDExICs1MDEsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbm1jbGFuX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMTY4OCw2ICsxNjgyLDcgQEAKIAkJLm5hbWUJPSAibm1jbGFuX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gbm1jbGFuX2F0dGFjaCwKKwkuZXZlbnQJCT0gbm1jbGFuX2V2ZW50LAogCS5kZXRhY2gJCT0gbm1jbGFuX2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSBubWNsYW5faWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKaW5kZXggODU1YTQ1ZC4uZTE2NjRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDwuLi9kcml2ZXJzL25ldC84MzkwLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTI3NiwxMSArMjc1LDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnBjbmV0X2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMTg0NCw2ICsxODM4LDcgQEAKIAkJLm5hbWUJPSAicGNuZXRfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBwY25ldF9hdHRhY2gsCisJLmV2ZW50CQk9IHBjbmV0X2V2ZW50LAogCS5kZXRhY2gJCT0gcGNuZXRfZGV0YWNoLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuaWRfdGFibGUJPSBwY25ldF9pZHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCmluZGV4IGJjMDFjODguLmZiYzJmNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCkBAIC00Miw3ICs0Miw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0zNzAsMTAgKzM2OSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0gQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmc21jOTFjOTJfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0yMzY1LDYgKzIzNjAsNyBAQAogCQkubmFtZQk9ICJzbWM5MWM5Ml9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHNtYzkxYzkyX2F0dGFjaCwKKwkuZXZlbnQJCT0gc21jOTFjOTJfZXZlbnQsCiAJLmRldGFjaAkJPSBzbWM5MWM5Ml9kZXRhY2gsCiAJLmlkX3RhYmxlICAgICAgID0gc21jOTFjOTJfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCmluZGV4IDBjZDIyNWUuLjlmMzNiYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwpAQCAtODEsNyArODEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02MTksMTEgKzYxOCw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ4aXJjMnBzX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIGlmICgoZXJyID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZykpKSB7CkBAIC0yMDE2LDYgKzIwMTAsNyBAQAogCQkubmFtZQk9ICJ4aXJjMnBzX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0geGlyYzJwc19hdHRhY2gsCisJLmV2ZW50CQk9IHhpcmMycHNfZXZlbnQsCiAJLmRldGFjaAkJPSB4aXJjMnBzX2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSB4aXJjMnBzX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wbGlwLmMgYi9kcml2ZXJzL25ldC9wbGlwLmMKaW5kZXggZjRiNjI0MC4uMjE1MzdlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGxpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3BsaXAuYwpAQCAtNTQwLDcgKzU0MCw3IEBACiAgKglpbiBmYXIgdG9vIG1hbnkgb2xkIHN5c3RlbXMgbm90IGFsbCBldmVuIHJ1bm5pbmcgTGludXguCiAgKi8KICAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwbGlwX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBfX2JlMTYgcGxpcF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV0aGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYyBiL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCmluZGV4IDVlNDhiOWEuLjU5ZTgxODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwogCXBwcF9hc3luY19pbnB1dChhcCwgYnVmLCBjZmxhZ3MsIGNvdW50KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7Ci0JaWYgKHNrYl9xdWV1ZV9sZW4oJmFwLT5ycXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZhcC0+cnF1ZXVlKSkKIAkJdGFza2xldF9zY2hlZHVsZSgmYXAtPnRzayk7CiAJYXBfcHV0KGFwKTsKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKaW5kZXggYWI3MjZhYi4uYTMyNjY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCkBAIC0xMjM3LDggKzEyMzcsOCBAQAogCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CiAJCW5hdmFpbCArPSBwY2gtPmF2YWlsID0gKHBjaC0+Y2hhbiAhPSBOVUxMKTsKIAkJaWYgKHBjaC0+YXZhaWwpIHsKLQkJCWlmIChza2JfcXVldWVfbGVuKCZwY2gtPmZpbGUueHEpID09IDAKLQkJCSAgICB8fCAhcGNoLT5oYWRfZnJhZykgeworCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcGNoLT5maWxlLnhxKSB8fAorCQkJICAgICFwY2gtPmhhZF9mcmFnKSB7CiAJCQkJcGNoLT5hdmFpbCA9IDI7CiAJCQkJKytuZnJlZTsKIAkJCX0KQEAgLTEzNzQsOCArMTM3NCw4IEBACiAKIAkJLyogdHJ5IHRvIHNlbmQgaXQgZG93biB0aGUgY2hhbm5lbCAqLwogCQljaGFuID0gcGNoLT5jaGFuOwotCQlpZiAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKQotCQkgICAgfHwgIWNoYW4tPm9wcy0+c3RhcnRfeG1pdChjaGFuLCBmcmFnKSkKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnBjaC0+ZmlsZS54cSkgfHwKKwkJICAgICFjaGFuLT5vcHMtPnN0YXJ0X3htaXQoY2hhbiwgZnJhZykpCiAJCQlza2JfcXVldWVfdGFpbCgmcGNoLT5maWxlLnhxLCBmcmFnKTsKIAkJcGNoLT5oYWRfZnJhZyA9IDE7CiAJCXAgKz0gZmxlbjsKQEAgLTE0MTIsNyArMTQxMiw3IEBACiAKIAlzcGluX2xvY2tfYmgoJnBjaC0+ZG93bmwpOwogCWlmIChwY2gtPmNoYW4gIT0gMCkgewotCQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKSA+IDApIHsKKwkJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnBjaC0+ZmlsZS54cSkpIHsKIAkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwY2gtPmZpbGUueHEpOwogCQkJaWYgKCFwY2gtPmNoYW4tPm9wcy0+c3RhcnRfeG1pdChwY2gtPmNoYW4sIHNrYikpIHsKIAkJCQkvKiBwdXQgdGhlIHBhY2tldCBiYWNrIGFuZCB0cnkgYWdhaW4gbGF0ZXIgKi8KQEAgLTE0MjYsNyArMTQyNiw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKIAkvKiBzZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgZnJvbSB0aGUgYXR0YWNoZWQgdW5pdCB0byBiZSBzZW50ICovCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnBjaC0+ZmlsZS54cSkgPT0gMCkgeworCWlmIChza2JfcXVldWVfZW1wdHkoJnBjaC0+ZmlsZS54cSkpIHsKIAkJcmVhZF9sb2NrX2JoKCZwY2gtPnVwbCk7CiAJCXBwcCA9IHBjaC0+cHBwOwogCQlpZiAocHBwICE9IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jIGIvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYwppbmRleCBmZDlmNTAxLi40ZDUxYzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKQEAgLTQwNiw3ICs0MDYsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CiAJcHBwX3N5bmNfaW5wdXQoYXAsIGJ1ZiwgY2ZsYWdzLCBjb3VudCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwotCWlmIChza2JfcXVldWVfbGVuKCZhcC0+cnF1ZXVlKSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmYXAtPnJxdWV1ZSkpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJmFwLT50c2spOwogCXNwX3B1dChhcCk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NoYXBlci5jIGIvZHJpdmVycy9uZXQvc2hhcGVyLmMKaW5kZXggMjBlZGViMy4uM2FkMGI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2hhcGVyLmMKKysrIGIvZHJpdmVycy9uZXQvc2hhcGVyLmMKQEAgLTEzNSwxMCArMTM1LDggQEAKIHsKIAlzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIgPSBkZXYtPnByaXY7CiAgCXN0cnVjdCBza19idWZmICpwdHI7Ci0gICAKLQlpZiAoZG93bl90cnlsb2NrKCZzaGFwZXItPnNlbSkpCi0JCXJldHVybiAtMTsKLQorICAKKwlzcGluX2xvY2soJnNoYXBlci0+bG9jayk7CiAgCXB0cj1zaGFwZXItPnNlbmRxLnByZXY7CiAgCQogIAkvKgpAQCAtMjMyLDcgKzIzMCw3IEBACiAgICAgICAgICAgICAgICAgc2hhcGVyLT5zdGF0cy5jb2xsaXNpb25zKys7CiAgCX0KIAlzaGFwZXJfa2ljayhzaGFwZXIpOwotCXVwKCZzaGFwZXItPnNlbSk7CisJc3Bpbl91bmxvY2soJnNoYXBlci0+bG9jayk7CiAgCXJldHVybiAwOwogfQogCkBAIC0yNzEsMTEgKzI2OSw5IEBACiB7CiAJc3RydWN0IHNoYXBlciAqc2hhcGVyID0gKHN0cnVjdCBzaGFwZXIgKilkYXRhOwogCi0JaWYgKCFkb3duX3RyeWxvY2soJnNoYXBlci0+c2VtKSkgewotCQlzaGFwZXJfa2ljayhzaGFwZXIpOwotCQl1cCgmc2hhcGVyLT5zZW0pOwotCX0gZWxzZQotCQltb2RfdGltZXIoJnNoYXBlci0+dGltZXIsIGppZmZpZXMpOworCXNwaW5fbG9jaygmc2hhcGVyLT5sb2NrKTsKKwlzaGFwZXJfa2ljayhzaGFwZXIpOworCXNwaW5fdW5sb2NrKCZzaGFwZXItPmxvY2spOwogfQogCiAvKgpAQCAtMzMyLDIxICszMjgsNiBAQAogCiAKIC8qCi0gKglGbHVzaCB0aGUgc2hhcGVyIHF1ZXVlcyBvbiBhIGNsb3NlZG93bgotICovCi0gCi1zdGF0aWMgdm9pZCBzaGFwZXJfZmx1c2goc3RydWN0IHNoYXBlciAqc2hhcGVyKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlkb3duKCZzaGFwZXItPnNlbSk7Ci0Jd2hpbGUoKHNrYj1za2JfZGVxdWV1ZSgmc2hhcGVyLT5zZW5kcSkpIT1OVUxMKQotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0Jc2hhcGVyX2tpY2soc2hhcGVyKTsKLQl1cCgmc2hhcGVyLT5zZW0pOwotfQotCi0vKgogICoJQnJpbmcgdGhlIGludGVyZmFjZSB1cC4gV2UganVzdCBkaXNhbGxvdyB0aGlzIHVudGlsIGEgCiAgKgliaW5kLgogICovCkBAIC0zNzUsNyArMzU2LDE1IEBACiBzdGF0aWMgaW50IHNoYXBlcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzaGFwZXIgKnNoYXBlcj1kZXYtPnByaXY7Ci0Jc2hhcGVyX2ZsdXNoKHNoYXBlcik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNoYXBlci0+c2VuZHEpKSAhPSBOVUxMKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlzcGluX2xvY2tfYmgoJnNoYXBlci0+bG9jayk7CisJc2hhcGVyX2tpY2soc2hhcGVyKTsKKwlzcGluX3VubG9ja19iaCgmc2hhcGVyLT5sb2NrKTsKKwogCWRlbF90aW1lcl9zeW5jKCZzaGFwZXItPnRpbWVyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU3Niw2ICs1NjUsNyBAQAogCWluaXRfdGltZXIoJnNoLT50aW1lcik7CiAJc2gtPnRpbWVyLmZ1bmN0aW9uPXNoYXBlcl90aW1lcjsKIAlzaC0+dGltZXIuZGF0YT0odW5zaWduZWQgbG9uZylzaDsKKwlzcGluX2xvY2tfaW5pdCgmc2gtPmxvY2spOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tnZS5jIGIvZHJpdmVycy9uZXQvc2tnZS5jCmluZGV4IDNkYmIxY2IuLjVjYWNjN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9za2dlLmMKQEAgLTMyNTksNyArMzI1OSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc2tnZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCitzdGF0aWMgaW50IHNrZ2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBza2dlX2h3ICpodyAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW50IGksIHdvbCA9IDA7CkBAIC0zMjc5LDcgKzMyNzksNyBAQAogCX0KIAogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCXBjaV9lbmFibGVfd2FrZShwZGV2LCBzdGF0ZSwgd29sKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIHdvbCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2dlLmggYi9kcml2ZXJzL25ldC9za2dlLmgKaW5kZXggMTRkMGNjMC4uZmNlZDNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tnZS5oCisrKyBiL2RyaXZlcnMvbmV0L3NrZ2UuaApAQCAtNyw2ICs3LDcgQEAKIC8qIFBDSSBjb25maWcgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFBDSV9ERVZfUkVHMQkweDQwCiAjZGVmaW5lIFBDSV9ERVZfUkVHMgkweDQ0CisjZGVmaW5lICBQQ0lfUkVWX0RFU0MJIDB4NAogCiAjZGVmaW5lIFBDSV9TVEFUVVNfRVJST1JfQklUUyAoUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgfCBcCiAJCQkgICAgICAgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SIHwgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwppbmRleCAxZjU2NTU2Li4yNjA4ZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uYworKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtMzA3OSw3ICszMDc5LDkgQEAKIAlncC0+cGh5X21paS5kZXYgPSBkZXY7CiAJZ3AtPnBoeV9taWkubWRpb19yZWFkID0gX3BoeV9yZWFkOwogCWdwLT5waHlfbWlpLm1kaW9fd3JpdGUgPSBfcGh5X3dyaXRlOwotCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJZ3AtPnBoeV9taWkucGxhdGZvcm1fZGF0YSA9IGdwLT5vZl9ub2RlOworI2VuZGlmCiAJLyogQnkgZGVmYXVsdCwgd2Ugc3RhcnQgd2l0aCBhdXRvbmVnICovCiAJZ3AtPndhbnRfYXV0b25lZyA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuYyBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuYwppbmRleCAwZmNhNDE0Li5kM2RkYjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5jCkBAIC0zMiw2ICszMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNlbmRpZgorCiAjaW5jbHVkZSAic3VuZ2VtX3BoeS5oIgogCiAvKiBMaW5rIG1vZGVzIG9mIHRoZSBCQ001NDAwIFBIWSAqLwpAQCAtMjgxLDEwICsyODUsMTIgQEAKIHN0YXRpYyBpbnQgYmNtNTQyMV9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCiB7CiAJdTE2IGRhdGE7Ci0JaW50IHJldjsKKwl1bnNpZ25lZCBpbnQgaWQ7CiAKLQlyZXYgPSBwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQyKSAmIDB4MDAwZjsKLQlpZiAocmV2ID09IDApIHsKKwlpZCA9IChwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQxKSA8PCAxNiB8IHBoeV9yZWFkKHBoeSwgTUlJX1BIWVNJRDIpKTsKKworCS8qIFJldmlzaW9uIDAgb2YgNTQyMSBuZWVkcyBzb21lIGZpeHVwcyAqLworCWlmIChpZCA9PSAweDAwMjA2MGUwKSB7CiAJCS8qIFRoaXMgaXMgYm9ycm93ZWQgZnJvbSBNYWNPUwogCQkgKi8KIAkJcGh5X3dyaXRlKHBoeSwgMHgxOCwgMHgxMDA3KTsKQEAgLTI5NywyMSArMzAzLDI4IEBACiAJCWRhdGEgPSBwaHlfcmVhZChwaHksIDB4MTUpOwogCQlwaHlfd3JpdGUocGh5LCAweDE1LCBkYXRhIHwgMHgwMjAwKTsKIAl9Ci0jaWYgMAotCS8qIFRoaXMgaGFzIHRvIGJlIHZlcmlmaWVkIGJlZm9yZSBJIGVuYWJsZSBpdCAqLwotCS8qIEVuYWJsZSBhdXRvbWF0aWMgbG93LXBvd2VyICovCi0JcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg5MDAyKTsKLQlwaHlfd3JpdGUocGh5LCAweDFjLCAweGE4MjEpOwotCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OTQxZCk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGludCBiY201NDIxazJfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQotewotCS8qIEluaXQgY29kZSBib3Jyb3dlZCBmcm9tIE9GICovCi0JcGh5X3dyaXRlKHBoeSwgNCwgMHgwMWUxKTsKLQlwaHlfd3JpdGUocGh5LCA5LCAweDAzMDApOworCS8qIFBpY2sgdXAgc29tZSBpbml0IGNvZGUgZnJvbSBPRiBmb3IgSzIgdmVyc2lvbiAqLworCWlmICgoaWQgJiAweGZmZmZmZmYwKSA9PSAweDAwMjA2MmUwKSB7CisJCXBoeV93cml0ZShwaHksIDQsIDB4MDFlMSk7CisJCXBoeV93cml0ZShwaHksIDksIDB4MDMwMCk7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgY2FuIGVuYWJsZSBhdXRvbWF0aWMgbG93IHBvd2VyICovCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJaWYgKHBoeS0+cGxhdGZvcm1fZGF0YSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2ZfZ2V0X3BhcmVudChwaHktPnBsYXRmb3JtX2RhdGEpOworCQlpbnQgY2FuX2xvd19wb3dlciA9IDE7CisJCWlmIChucCA9PSBOVUxMIHx8IGdldF9wcm9wZXJ0eShucCwgIm5vLWF1dG9sb3dwb3dlciIsIE5VTEwpKQorCQkJY2FuX2xvd19wb3dlciA9IDA7CisJCWlmIChjYW5fbG93X3Bvd2VyKSB7CisJCQkvKiBFbmFibGUgYXV0b21hdGljIGxvdy1wb3dlciAqLworCQkJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg5MDAyKTsKKwkJCXBoeV93cml0ZShwaHksIDB4MWMsIDB4YTgyMSk7CisJCQlwaHlfd3JpdGUocGh5LCAweDFjLCAweDk0MWQpOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NjIsNyArNzc1LDcgQEAKIAogLyogQnJvYWRjb20gQkNNIDU0MjEgYnVpbHQtaW4gSzIgKi8KIHN0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQyMWsyX3BoeV9vcHMgPSB7Ci0JLmluaXQJCT0gYmNtNTQyMWsyX2luaXQsCisJLmluaXQJCT0gYmNtNTQyMV9pbml0LAogCS5zdXNwZW5kCT0gYmNtNTQxMV9zdXNwZW5kLAogCS5zZXR1cF9hbmVnCT0gYmNtNTR4eF9zZXR1cF9hbmVnLAogCS5zZXR1cF9mb3JjZWQJPSBiY201NHh4X3NldHVwX2ZvcmNlZCwKQEAgLTc3OSw2ICs3OTIsMjUgQEAKIAkub3BzCQk9ICZiY201NDIxazJfcGh5X29wcwogfTsKIAorLyogQnJvYWRjb20gQkNNIDU0NjIgYnVpbHQtaW4gVmVzdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQ2MlZfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBiY201NDIxX2luaXQsCisJLnN1c3BlbmQJPSBiY201NDExX3N1c3BlbmQsCisJLnNldHVwX2FuZWcJPSBiY201NHh4X3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGJjbTU0eHhfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBiY201NHh4X3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTQ2MlZfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYwZDAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTQ2Mi1WZXN0YSIsCisJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTU0NjJWX3BoeV9vcHMKK307CisKIC8qIE1hcnZlbGwgODhFMTEwMSAoQXBwbGUgc2VlbSB0byBkZWFsIHdpdGggMiBkaWZmZXJlbnQgcmV2cywKICAqIEkgbWFza2VkIG91dCB0aGUgOCBsYXN0IGJpdHMgdG8gZ2V0IGJvdGgsIGJ1dCBzb21lIHNwZWNzCiAgKiB3b3VsZCBiZSB1c2VmdWwgaGVyZSkgLS1CZW5ILgpAQCAtODI0LDYgKzg1Niw3IEBACiAJJmJjbTU0MTFfcGh5X2RlZiwKIAkmYmNtNTQyMV9waHlfZGVmLAogCSZiY201NDIxazJfcGh5X2RlZiwKKwkmYmNtNTQ2MlZfcGh5X2RlZiwKIAkmbWFydmVsbF9waHlfZGVmLAogCSZnZW5taWlfcGh5X2RlZiwKIAlOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmggYi9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmgKaW5kZXggODIyY2I1OC4uNDMwNTQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuaApAQCAtNDMsOSArNDMsMTAgQEAKIAlpbnQJCQlwYXVzZTsKIAogCS8qIFByb3ZpZGVkIGJ5IGhvc3QgY2hpcCAqLwotCXN0cnVjdCBuZXRfZGV2aWNlKglkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKIAlpbnQgKCptZGlvX3JlYWQpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKTsKIAl2b2lkICgqbWRpb193cml0ZSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcsIGludCB2YWwpOworCXZvaWQJCQkqcGxhdGZvcm1fZGF0YTsKIH07CiAKIC8qIFBhc3MgaW4gYSBzdHJ1Y3QgbWlpX3BoeSB3aXRoIGRldiwgbWRpb19yZWFkIGFuZCBtZGlvX3dyaXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCmluZGV4IDdlMzcxYjEuLjU0NjQwNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC02Niw4ICs2Niw4IEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidGczIgogI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIzLjMyIgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bmUgMjQsIDIwMDUiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4zMyIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdWx5IDUsIDIwMDUiCiAKICNkZWZpbmUgVEczX0RFRl9NQUNfTU9ERQkwCiAjZGVmaW5lIFRHM19ERUZfUlhfTU9ERQkJMApAQCAtNTExNyw3ICs1MTE3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX190ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgdm9pZCB0ZzNfc2V0X2NvYWxlc2NlKHN0cnVjdCB0ZzMgKnRwLCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCitzdGF0aWMgdm9pZCBfX3RnM19zZXRfY29hbGVzY2Uoc3RydWN0IHRnMyAqdHAsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKIAl0dzMyKEhPU1RDQ19SWENPTF9USUNLUywgZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKIAl0dzMyKEhPU1RDQ19UWENPTF9USUNLUywgZWMtPnR4X2NvYWxlc2NlX3VzZWNzKTsKQEAgLTU0NjAsNyArNTQ2MCw3IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCi0JdGczX3NldF9jb2FsZXNjZSh0cCwgJnRwLT5jb2FsKTsKKwlfX3RnM19zZXRfY29hbGVzY2UodHAsICZ0cC0+Y29hbCk7CiAKIAkvKiBzZXQgc3RhdHVzIGJsb2NrIERNQSBhZGRyZXNzICovCiAJdHczMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsCkBAIC03ODIxLDYgKzc4MjEsNjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0ZzNfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIG1heF9yeGNvYWxfdGlja19pbnQgPSAwLCBtYXhfdHhjb2FsX3RpY2tfaW50ID0gMDsKKwl1MzIgbWF4X3N0YXRfY29hbF90aWNrcyA9IDAsIG1pbl9zdGF0X2NvYWxfdGlja3MgPSAwOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCW1heF9yeGNvYWxfdGlja19pbnQgPSBNQVhfUlhDT0FMX1RJQ0tfSU5UOworCQltYXhfdHhjb2FsX3RpY2tfaW50ID0gTUFYX1RYQ09BTF9USUNLX0lOVDsKKwkJbWF4X3N0YXRfY29hbF90aWNrcyA9IE1BWF9TVEFUX0NPQUxfVElDS1M7CisJCW1pbl9zdGF0X2NvYWxfdGlja3MgPSBNSU5fU1RBVF9DT0FMX1RJQ0tTOworCX0KKworCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID4gTUFYX1JYQ09MX1RJQ0tTKSB8fAorCSAgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID4gTUFYX1RYQ09MX1RJQ0tTKSB8fAorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID4gTUFYX1JYTUFYX0ZSQU1FUykgfHwKKwkgICAgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA+IE1BWF9UWE1BWF9GUkFNRVMpIHx8CisJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3NfaXJxID4gbWF4X3J4Y29hbF90aWNrX2ludCkgfHwKKwkgICAgKGVjLT50eF9jb2FsZXNjZV91c2Vjc19pcnEgPiBtYXhfdHhjb2FsX3RpY2tfaW50KSB8fAorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA+IE1BWF9SWENPQUxfTUFYRl9JTlQpIHx8CisJICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxID4gTUFYX1RYQ09BTF9NQVhGX0lOVCkgfHwKKwkgICAgKGVjLT5zdGF0c19ibG9ja19jb2FsZXNjZV91c2VjcyA+IG1heF9zdGF0X2NvYWxfdGlja3MpIHx8CisJICAgIChlYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPCBtaW5fc3RhdF9jb2FsX3RpY2tzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBObyByeCBpbnRlcnJ1cHRzIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGJvdGggYXJlIHplcm8gKi8KKwlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA9PSAwKSAmJgorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE5vIHR4IGludGVycnVwdHMgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYm90aCBhcmUgemVybyAqLworCWlmICgoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID09IDApICYmCisJICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT25seSBjb3B5IHJlbGV2YW50IHBhcmFtZXRlcnMsIGlnbm9yZSBhbGwgb3RoZXJzLiAqLworCXRwLT5jb2FsLnJ4X2NvYWxlc2NlX3VzZWNzID0gZWMtPnJ4X2NvYWxlc2NlX3VzZWNzOworCXRwLT5jb2FsLnR4X2NvYWxlc2NlX3VzZWNzID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzOworCXRwLT5jb2FsLnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCXRwLT5jb2FsLnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCXRwLT5jb2FsLnJ4X2NvYWxlc2NlX3VzZWNzX2lycSA9IGVjLT5yeF9jb2FsZXNjZV91c2Vjc19pcnE7CisJdHAtPmNvYWwudHhfY29hbGVzY2VfdXNlY3NfaXJxID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzX2lycTsKKwl0cC0+Y29hbC5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgPSBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOworCXRwLT5jb2FsLnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA9IGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnE7CisJdHAtPmNvYWwuc3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPSBlYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXRnM19mdWxsX2xvY2sodHAsIDApOworCQlfX3RnM19zZXRfY29hbGVzY2UodHAsICZ0cC0+Y29hbCk7CisJCXRnM19mdWxsX3VubG9jayh0cCk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHRnM19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzCQk9IHRnM19nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSB0ZzNfc2V0X3NldHRpbmdzLApAQCAtNzg1Niw2ICs3OTEwLDcgQEAKIAkuZ2V0X3N0YXRzX2NvdW50CT0gdGczX2dldF9zdGF0c19jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSB0ZzNfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9jb2FsZXNjZQkJPSB0ZzNfZ2V0X2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UJCT0gdGczX3NldF9jb2FsZXNjZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfZ2V0X2VlcHJvbV9zaXplKHN0cnVjdCB0ZzMgKnRwKQpAQCAtOTgwMCw2ICs5ODU1LDEyIEBACiAJCWVjLT50eF9jb2FsZXNjZV91c2VjcyA9IExPV19UWENPTF9USUNLU19DTFJUQ0tTOwogCQllYy0+dHhfY29hbGVzY2VfdXNlY3NfaXJxID0gREVGQVVMVF9UWENPQUxfVElDS19JTlRfQ0xSVENLUzsKIAl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2lycSA9IDA7CisJCWVjLT50eF9jb2FsZXNjZV91c2Vjc19pcnEgPSAwOworCQllYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPSAwOworCX0KIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgdGczX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmggYi9kcml2ZXJzL25ldC90ZzMuaAppbmRleCA5OWM1Zjk2Li43MGFkNDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuaAorKysgYi9kcml2ZXJzL25ldC90ZzMuaApAQCAtODc5LDMxICs4NzksNDEgQEAKICNkZWZpbmUgIExPV19SWENPTF9USUNLU19DTFJUQ0tTCSAweDAwMDAwMDE0CiAjZGVmaW5lICBERUZBVUxUX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDA0OAogI2RlZmluZSAgSElHSF9SWENPTF9USUNLUwkJIDB4MDAwMDAwOTYKKyNkZWZpbmUgIE1BWF9SWENPTF9USUNLUwkJIDB4MDAwMDAzZmYKICNkZWZpbmUgSE9TVENDX1RYQ09MX1RJQ0tTCQkweDAwMDAzYzBjCiAjZGVmaW5lICBMT1dfVFhDT0xfVElDS1MJCSAweDAwMDAwMDk2CiAjZGVmaW5lICBMT1dfVFhDT0xfVElDS1NfQ0xSVENLUwkgMHgwMDAwMDA0OAogI2RlZmluZSAgREVGQVVMVF9UWENPTF9USUNLUwkJIDB4MDAwMDAxMmMKICNkZWZpbmUgIEhJR0hfVFhDT0xfVElDS1MJCSAweDAwMDAwMTQ1CisjZGVmaW5lICBNQVhfVFhDT0xfVElDS1MJCSAweDAwMDAwM2ZmCiAjZGVmaW5lIEhPU1RDQ19SWE1BWF9GUkFNRVMJCTB4MDAwMDNjMTAKICNkZWZpbmUgIExPV19SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDA1CiAjZGVmaW5lICBERUZBVUxUX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMDgKICNkZWZpbmUgIEhJR0hfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAxMgorI2RlZmluZSAgTUFYX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwZmYKICNkZWZpbmUgSE9TVENDX1RYTUFYX0ZSQU1FUwkJMHgwMDAwM2MxNAogI2RlZmluZSAgTE9XX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMzUKICNkZWZpbmUgIERFRkFVTFRfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDA0YgogI2RlZmluZSAgSElHSF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDUyCisjZGVmaW5lICBNQVhfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDBmZgogI2RlZmluZSBIT1NUQ0NfUlhDT0FMX1RJQ0tfSU5UCQkweDAwMDAzYzE4CiAjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9USUNLX0lOVAkgMHgwMDAwMDAxOQogI2RlZmluZSAgREVGQVVMVF9SWENPQUxfVElDS19JTlRfQ0xSVENLUyAweDAwMDAwMDE0CisjZGVmaW5lICBNQVhfUlhDT0FMX1RJQ0tfSU5UCQkgMHgwMDAwMDNmZgogI2RlZmluZSBIT1NUQ0NfVFhDT0FMX1RJQ0tfSU5UCQkweDAwMDAzYzFjCiAjZGVmaW5lICBERUZBVUxUX1RYQ09BTF9USUNLX0lOVAkgMHgwMDAwMDAxOQogI2RlZmluZSAgREVGQVVMVF9UWENPQUxfVElDS19JTlRfQ0xSVENLUyAweDAwMDAwMDE0CisjZGVmaW5lICBNQVhfVFhDT0FMX1RJQ0tfSU5UCQkgMHgwMDAwMDNmZgogI2RlZmluZSBIT1NUQ0NfUlhDT0FMX01BWEZfSU5UCQkweDAwMDAzYzIwCiAjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9NQVhGX0lOVAkgMHgwMDAwMDAwNQorI2RlZmluZSAgTUFYX1JYQ09BTF9NQVhGX0lOVAkJIDB4MDAwMDAwZmYKICNkZWZpbmUgSE9TVENDX1RYQ09BTF9NQVhGX0lOVAkJMHgwMDAwM2MyNAogI2RlZmluZSAgREVGQVVMVF9UWENPQUxfTUFYRl9JTlQJIDB4MDAwMDAwMDUKKyNkZWZpbmUgIE1BWF9UWENPQUxfTUFYRl9JTlQJCSAweDAwMDAwMGZmCiAjZGVmaW5lIEhPU1RDQ19TVEFUX0NPQUxfVElDS1MJCTB4MDAwMDNjMjgKICNkZWZpbmUgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTCSAweDAwMGY0MjQwCisjZGVmaW5lICBNQVhfU1RBVF9DT0FMX1RJQ0tTCQkgMHhkNjkzZDQwMAorI2RlZmluZSAgTUlOX1NUQVRfQ09BTF9USUNLUwkJIDB4MDAwMDAwNjQKIC8qIDB4M2MyYyAtLT4gMHgzYzMwIHVudXNlZCAqLwogI2RlZmluZSBIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUgkweDAwMDAzYzMwIC8qIDY0LWJpdCAqLwogI2RlZmluZSBIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIJMHgwMDAwM2MzOCAvKiA2NC1iaXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKaW5kZXggN2JmZWUzNi4uZWZmYWIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVuLmMKKysrIGIvZHJpdmVycy9uZXQvdHVuLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCiAJcG9sbF93YWl0KGZpbGUsICZ0dW4tPnJlYWRfd2FpdCwgd2FpdCk7CiAgCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnR1bi0+cmVhZHEpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0dW4tPnJlYWRxKSkKIAkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCiAJcmV0dXJuIG1hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKaW5kZXggMGI1Y2EyNS4uZWNmYTZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMTkwNiw5ICsxOTA2LDkgQEAKIAkgKi8KIAluZXRpZl9jYXJyaWVyX29mZih0cC0+ZGV2KTsKIAotCXBjaV9lbmFibGVfd2FrZSh0cC0+cGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIDEpOworCXBjaV9lbmFibGVfd2FrZSh0cC0+cGRldiwgc3RhdGUsIDEpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlyZXR1cm4gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgc3RhdGUpOwogfQogCiBzdGF0aWMgaW50CkBAIC0yMjc0LDcgKzIyNzQsNyBAQAogCQlnb3RvIG5lZWRfcmVzdW1lOwogCX0KIAotCWlmKHR5cGhvb25fc2xlZXAodHAsIHN0YXRlLCB0cC0+d29sX2V2ZW50cykgPCAwKSB7CisJaWYodHlwaG9vbl9zbGVlcCh0cCwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIHRwLT53b2xfZXZlbnRzKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHB1dCBjYXJkIHRvIHNsZWVwXG4iLCBkZXYtPm5hbWUpOwogCQlnb3RvIG5lZWRfcmVzdW1lOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCmluZGV4IDcyMTdkNDQuLjJjODNjY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwpAQCAtODYxLDggKzg2MSw3IEBACiAvKgogICogTWFyayBpdCBmb3Igb3VyIG93biByYXcgc29ja2V0cyBpbnRlcmZhY2UKICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGZhcnN5bmNfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBfX2JlMTYgZmFyc3luY190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc2tiLT5kZXYgPSBkZXY7CiAJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKaW5kZXggODc0OTY4NC4uNDhjMDNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jCkBAIC05MSw4ICs5MSw3IEBACiAKIAogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgY2lzY29fdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIF9fYmUxNiBjaXNjb190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaGRsY19oZWFkZXIgKmRhdGEgPSAoaGRsY19oZWFkZXIqKXNrYi0+ZGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfcHBwLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYwppbmRleCA3Y2Q2MTk1Li5iODEyNjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYwpAQCAtNjYsOCArNjYsNyBAQAogCiAKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IHBwcF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIF9fYmUxNiBwcHBfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXJldHVybiBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1dBTl9QUFApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfcmF3LmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYwppbmRleCBjNDFmYjcwLi45NDU2ZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYwpAQCAtMjQsOCArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KIAogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcmF3X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19iZTE2IHJhd190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCmluZGV4IGMxMjY0OGQuLjQ3ZjNjNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTIzNzQsNyArMjM3NCw3IEBACiAJLyoKIAkgKiBDbGVhbiBvdXQgdHggcXVldWUKIAkgKi8KLQlpZiAodGVzdF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpICYmIHNrYl9xdWV1ZV9sZW4gKCZhaS0+dHhxKSA+IDApIHsKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpICYmICFza2JfcXVldWVfZW1wdHkoJmFpLT50eHEpKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCQlmb3IgKDsoc2tiID0gc2tiX2RlcXVldWUoJmFpLT50eHEpKTspCiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0zMjg3LDcgKzMyODcsNyBAQAogCQkJCWlmIChzdGF0dXMgJiBFVl9UWEVYQykKIAkJCQkJZ2V0X3R4X2Vycm9yKGFwcml2LCAtMSk7CiAJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFwcml2LT5hdXhfbG9jaywgZmxhZ3MpOwotCQkJCWlmIChza2JfcXVldWVfbGVuICgmYXByaXYtPnR4cSkpIHsKKwkJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmYXByaXYtPnR4cSkpIHsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXByaXYtPmF1eF9sb2NrLGZsYWdzKTsKIAkJCQkJbXBpX3NlbmRfcGFja2V0IChkZXYpOwogCQkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKaW5kZXggZjEwYTk1Mi4uYmYyNTU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIxMCwxMSArMjA5LDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmFpcm9fZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC01NzQsNiArNTY4LDcgQEAKIAkJLm5hbWUJPSAiYWlyb19jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGFpcm9fYXR0YWNoLAorCS5ldmVudAkJPSBhaXJvX2V2ZW50LAogCS5kZXRhY2gJCT0gYWlyb19kZXRhY2gsCiAJLmlkX3RhYmxlICAgICAgID0gYWlyb19pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jCmluZGV4IGI0ZjRiZDcuLjlkNDk2NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJwb3J0LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1haXJwb3J0X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorYWlycG9ydF9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMjY2LDE2ICsyNjYsMTYgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgQXBwbGUgQWlycG9ydCB3aXJlbGVzcyBjYXJkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOwogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIGFpcnBvcnRfbWF0Y2hbXSA9IAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYWlycG9ydF9tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAicmFkaW8iLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJe30sCiB9OwogCitNT0RVTEVfREVWSUNFX1RBQkxFIChvZiwgYWlycG9ydF9tYXRjaCk7CisKIHN0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIGFpcnBvcnRfZHJpdmVyID0gCiB7CiAJLm5hbWUgCQk9IERSSVZFUl9OQU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKaW5kZXggODYzNzlkNC4uZmYwMzFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjE4LDExICsyMTcsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmYXRtZWxfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC02NjgsMTIgKzY2MiwxMyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGF0bWVsX2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhdG1lbF9kcml2ZXIgPSB7Ci0gICAgICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAotICAgICAgICAuZHJ2ICAgICAgICAgICAgPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICA9ICJhdG1lbF9jcyIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJhdG1lbF9jcyIsCiAgICAgICAgIH0sCi0gICAgICAgIC5hdHRhY2ggICAgICAgICA9IGF0bWVsX2F0dGFjaCwKLSAgICAgICAgLmRldGFjaCAgICAgICAgID0gYXRtZWxfZGV0YWNoLAorCS5hdHRhY2ggICAgICAgICA9IGF0bWVsX2F0dGFjaCwKKwkuZXZlbnQJCT0gYXRtZWxfZXZlbnQsCisJLmRldGFjaAkJPSBhdG1lbF9kZXRhY2gsCiAJLmlkX3RhYmxlCT0gYXRtZWxfaWRzLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCmluZGV4IGUxMmJkNzUuLjVmNTA3YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKQEAgLTYyLDcgKzYyLDYgQEAKICNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiAxMiAqLwogI2VuZGlmCiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTQ5MSwxMSArNDkwLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm5ldHdhdmVfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0xNjgwLDYgKzE2NzQsNyBAQAogCQkubmFtZQk9ICJuZXR3YXZlX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gbmV0d2F2ZV9hdHRhY2gsCisJLmV2ZW50CQk9IG5ldHdhdmVfZXZlbnQsCiAJLmRldGFjaAkJPSBuZXR3YXZlX2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSBuZXR3YXZlX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKaW5kZXggNTk3YzQ1OC4uMzY4ZDJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTg2LDExICsxODUsNiBAQAogCWRldl9saXN0ID0gbGluazsKIAogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm9yaW5vY29fY3NfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOyAvKiBGSVhNRTogd2hhdCBkb2VzIHRoaXMgbWVhbj8gKi8KIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC02NjQsNiArNjU4LDcgQEAKIAkJLm5hbWUJPSBEUklWRVJfTkFNRSwKIAl9LAogCS5hdHRhY2gJCT0gb3Jpbm9jb19jc19hdHRhY2gsCisJLmV2ZW50CQk9IG9yaW5vY29fY3NfZXZlbnQsCiAJLmRldGFjaAkJPSBvcmlub2NvX2NzX2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSBvcmlub2NvX2NzX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCmluZGV4IDMxNjUyYWYuLjBlMGJhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0zOTMsMTEgKzM5Miw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLSAgICAgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotICAgICAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotICAgICAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZyYXlfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTI5MTYsNiArMjkxMCw3IEBACiAJCS5uYW1lCT0gInJheV9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHJheV9hdHRhY2gsCisJLmV2ZW50CQk9IHJheV9ldmVudCwKIAkuZGV0YWNoCQk9IHJheV9kZXRhY2gsCiAJLmlkX3RhYmxlICAgICAgID0gcmF5X2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKaW5kZXggODk1MzJmZC4uZjYxMzBhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwpAQCAtNDY4NCwxMiArNDY4NCw2IEBACiAKICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCiAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gIGNsaWVudF9yZWcuRXZlbnRNYXNrID0gCi0gICAgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFIHwKLSAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0gICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLSAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmd2F2ZWxhbl9ldmVudDsKICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC00OTA0LDYgKzQ4OTgsNyBAQAogCQkubmFtZQk9ICJ3YXZlbGFuX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gd2F2ZWxhbl9hdHRhY2gsCisJLmV2ZW50CQk9IHdhdmVsYW5fZXZlbnQsCiAJLmRldGFjaAkJPSB3YXZlbGFuX2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSB3YXZlbGFuX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MucC5oCmluZGV4IGVhMmVmOGQuLjY3N2ZmNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MucC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MucC5oCkBAIC00NTIsNyArNDUyLDYgQEAKICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAKIC8qIFdhdmVsYW4gZGVjbGFyYXRpb25zICovCiAjaW5jbHVkZSAiaTgyNTkzLmgiCS8qIERlZmluaXRpb25zIGZvciB0aGUgSW50ZWwgY2hpcCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwppbmRleCBlM2E5MDA0Li5kZDkwMjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwpAQCAtNDksNyArNDksNiBAQAogCiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjAwNSwxMyArMjAwNCw2IEBACiAJbGluay0+bmV4dAkJID0gd2wzNTAxX2Rldl9saXN0OwogCXdsMzUwMV9kZXZfbGlzdAkJID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvCSA9ICZ3bDM1MDFfZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sJID0gQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfAotCQkJCSAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwKLQkJCQkgICBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJCQkgICBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQkJCSAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfAotCQkJCSAgIENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSB3bDM1MDFfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uCSA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMjI0NiwxMiArMjIzOCwxMyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHdsMzUwMV9pZHMpOwogCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgd2wzNTAxX2RyaXZlciA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkuZHJ2ICAgICAgICAgICAgPSB7Ci0JCS5uYW1lICAgPSAid2wzNTAxX2NzIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIndsMzUwMV9jcyIsCiAJfSwKLQkuYXR0YWNoICAgICAgICAgPSB3bDM1MDFfYXR0YWNoLAotCS5kZXRhY2ggICAgICAgICA9IHdsMzUwMV9kZXRhY2gsCisJLmF0dGFjaAkJPSB3bDM1MDFfYXR0YWNoLAorCS5ldmVudAkJPSB3bDM1MDFfZXZlbnQsCisJLmRldGFjaAkJPSB3bDM1MDFfZGV0YWNoLAogCS5pZF90YWJsZQk9IHdsMzUwMV9pZHMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYwppbmRleCBmZjQ1NjYyLi4yNGU2YWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2NzLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFycG9ydF9wYy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xMzMsMTEgKzEzMiw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZwYXJwb3J0X2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMzg2LDYgKzM4MCw3IEBACiAJCS5uYW1lCT0gInBhcnBvcnRfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBwYXJwb3J0X2F0dGFjaCwKKwkuZXZlbnQJCT0gcGFycG9ydF9ldmVudCwKIAkuZGV0YWNoCQk9IHBhcnBvcnRfZGV0YWNoLAogCS5pZF90YWJsZQk9IHBhcnBvcnRfaWRzLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYwppbmRleCA4MGVkZmEzLi40NTk4YzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKQEAgLTMwMDgsNyArMzAwOCw3IEBACiAJaW50IHJldCA9IDA7CiAKIAl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGRldikpICE9IE5VTEwpIHsKLQkJaWQgPSBwY2lfbWF0Y2hfZGV2aWNlIChwYXJwb3J0X3BjX3BjaV90YmwsIHBkZXYpOworCQlpZCA9IHBjaV9tYXRjaF9pZChwYXJwb3J0X3BjX3BjaV90YmwsIHBkZXYpOwogCQlpZiAoaWQgPT0gTlVMTCB8fCBpZC0+ZHJpdmVyX2RhdGEgPj0gbGFzdF9zaW8pCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQppbmRleCA3ZGVhNDk0Li4zNjU3ZjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogIwogIyBTb21lIGFyY2hpdGVjdHVyZXMgdXNlIHRoZSBnZW5lcmljIFBDSSBzZXR1cCBmdW5jdGlvbnMKICMKK29iai0kKENPTkZJR19YODYpICs9IHNldHVwLWJ1cy5vCiBvYmotJChDT05GSUdfQUxQSEEpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCiBvYmotJChDT05GSUdfQVJNKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwogb2JqLSQoQ09ORklHX1BBUklTQykgKz0gc2V0dXAtYnVzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcuYwppbmRleCAzOTAzZjhjLi5iODQ0YmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy5jCkBAIC01NCw3ICs1NCw3IEBACiAKIAllbnZwW2krK10gPSBzY3JhdGNoOwogCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLAotCQkJICAgICJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4XG4iLAorCQkJICAgICJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4IiwKIAkJCSAgICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKIAkJCSAgICBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAogCQkJICAgICh1OCkocGRldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBkZXYtPmNsYXNzID4+IDgpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnCmluZGV4IDFhNGQ0Y2EuLjljNGEzOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL0tjb25maWcKQEAgLTE4Nyw5ICsxODcsMTAgQEAKIAogY29uZmlnIEhPVFBMVUdfUENJX1NHSQogCXRyaXN0YXRlICJTR0kgUENJIEhvdHBsdWcgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhPVFBMVUdfUENJICYmIElBNjRfU0dJX1NOMgorCWRlcGVuZHMgb24gSE9UUExVR19QQ0kgJiYgKElBNjRfU0dJX1NOMiB8fCBJQTY0X0dFTkVSSUMpCiAJaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBTR0kgSUE2NCBBbHRpeCBzeXN0ZW0uCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU0dJIEFsdGl4IEhvdHBsdWcKKwkgIERyaXZlciBmb3IgUENJIGRldmljZXMuCiAKIAkgIFdoZW4gaW4gZG91YnQsIHNheSBOLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCAzZTYzMmZmLi4zMWEzMDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDcgQEAKIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9TSFBDKQkJKz0gc2hwY2hwLm8KIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9SUEEpCQkrPSBycGFwaHAubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1JQQV9ETFBBUikJKz0gcnBhZGxwYXJfaW8ubworb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1NHSSkJCSs9IHNnaV9ob3RwbHVnLm8KIAogcGNpX2hvdHBsdWctb2Jqcwk6PQlwY2lfaG90cGx1Z19jb3JlLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzA0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMKQEAgLTAsMCArMSw2MTEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgd29yayB3YXMgYmFzZWQgb24gdGhlIDIuNC8yLjYga2VybmVsIGRldmVsb3BtZW50IGJ5IERpY2sgUmVpZ25lci4KKyAqIFdvcmsgdG8gYWRkIEJJT1MgUFJPTSBzdXBwb3J0IHdhcyBjb21wbGV0ZWQgYnkgTWlrZSBIYWJlY2suCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9sMS5oPgorI2luY2x1ZGUgPGFzbS9zbi9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgorCisjaW5jbHVkZSAiLi4vcGNpLmgiCisjaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiU0dJIChwcmFyaXRAc2dpLmNvbSwgZGlja2llQHNnaS5jb20sIGhhYmVja0BzZ2kuY29tKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTR0kgQWx0aXggSG90IFBsdWcgUENJIENvbnRyb2xsZXIgRHJpdmVyIik7CisKKyNkZWZpbmUgUENJSU9fQVNJQ19UWVBFX1RJT0NBICAgICA0CisjZGVmaW5lIFBDSV9TTE9UX0FMUkVBRFlfVVAgICAgICAgMiAgICAgLyogc2xvdCBhbHJlYWR5IHVwICovCisjZGVmaW5lIFBDSV9TTE9UX0FMUkVBRFlfRE9XTiAgICAgMyAgICAgLyogc2xvdCBhbHJlYWR5IGRvd24gKi8KKyNkZWZpbmUgUENJX0wxX0VSUiAgICAgICAgICAgICAgICA3ICAgICAvKiBMMSBjb25zb2xlIGNvbW1hbmQgZXJyb3IgKi8KKyNkZWZpbmUgUENJX0VNUFRZXzMzTUhaICAgICAgICAgIDE1ICAgICAvKiBlbXB0eSAzMyBNSHogYnVzICovCisjZGVmaW5lIFBDSV9MMV9RU0laRSAgICAgICAgICAgIDEyOCAgICAgLyogb3VyIEwxIG1lc3NhZ2UgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgU05fTUFYX0hQX1NMT1RTCQkgMzIJLyogbWF4IG51bWJlciBvZiBob3RwbHVnIHNsb3RzICovCisjZGVmaW5lIFNHSV9IT1RQTFVHX1BST01fUkVWCTB4MDQyMCAgLyogTWluLiByZXF1aXJlZCBQUk9NIHZlcnNpb24gKi8KKworLyogaW50ZXJuYWwgbGlzdCBoZWFkICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzbl9ocF9saXN0OworCisvKiBob3RwbHVnX3Nsb3Qgc3RydWN0J3MgcHJpdmF0ZSBwb2ludGVyICovCitzdHJ1Y3Qgc2xvdCB7CisJaW50IGRldmljZV9udW07CisJc3RydWN0IHBjaV9idXMgKnBjaV9idXM7CisJLyogdGhpcyBzdHJ1Y3QgZm9yIGdsdWUgaW50ZXJuYWwgb25seSAqLworCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhwX2xpc3Q7Cit9OworCitzdHJ1Y3QgcGNpYnJfc2xvdF9lbmFibGVfcmVzcCB7CisJaW50IHJlc3Bfc3ViX2Vycm5vOworCWNoYXIgcmVzcF9sMV9tc2dbUENJX0wxX1FTSVpFICsgMV07Cit9OworCitzdHJ1Y3QgcGNpYnJfc2xvdF9kaXNhYmxlX3Jlc3AgeworCWludCByZXNwX3N1Yl9lcnJubzsKKwljaGFyIHJlc3BfbDFfbXNnW1BDSV9MMV9RU0laRSArIDFdOworfTsKKworZW51bSBzbl9wY2lfcmVxX2UgeworCVBDSV9SRVFfU0xPVF9FTElHSUJMRSwKKwlQQ0lfUkVRX1NMT1RfRElTQUJMRQorfTsKKworc3RhdGljIGludCBlbmFibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKK3N0YXRpYyBpbnQgZGlzYWJsZV9zbG90KHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QpOworc3RhdGljIGludCBnZXRfcG93ZXJfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHU4ICp2YWx1ZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90X29wcyBzbl9ob3RwbHVnX3Nsb3Rfb3BzID0geworCS5vd25lciAgICAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLmVuYWJsZV9zbG90ICAgICAgICAgICAgPSBlbmFibGVfc2xvdCwKKwkuZGlzYWJsZV9zbG90ICAgICAgICAgICA9IGRpc2FibGVfc2xvdCwKKwkuZ2V0X3Bvd2VyX3N0YXR1cyAgICAgICA9IGdldF9wb3dlcl9zdGF0dXMsCit9OworCitzdGF0aWMgREVDTEFSRV9NVVRFWChzbl9ob3RwbHVnX3NlbSk7CisKK3N0YXRpYyBpbnQgc25fcGNpX3Nsb3RfdmFsaWQoc3RydWN0IHBjaV9idXMgKnBjaV9idXMsIGludCBkZXZpY2UpCit7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKwlpbnQgYnJpY2t0eXBlOworCWludCBidXNfbnVtOworCisJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSB2YWxpZCBzbG90IG9uICdwY2lfYnVzJyAqLworCWlmICghKHBjaWJ1c19pbmZvLT5wYmlfdmFsaWRfZGV2aWNlcyAmICgxIDw8IGRldmljZSkpKQorCQlyZXR1cm4gLUVQRVJNOworCisJYnJpY2t0eXBlID0gTU9EVUxFX0dFVF9CVFlQRShwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKTsKKwlidXNfbnVtID0gcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW0gJiAweGY7CisKKwkvKiBEbyBub3QgYWxsb3cgaG90cGx1ZyBvcGVyYXRpb25zIG9uIGJhc2UgSS9PIGNhcmRzICovCisJaWYgKChicmlja3R5cGUgPT0gTDFfQlJJQ0tUWVBFX0lYIHx8ICBicmlja3R5cGUgPT0gTDFfQlJJQ0tUWVBFX0lBKSAmJgorCSAgICAoYnVzX251bSA9PSAxICYmIGRldmljZSAhPSAxKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNuX3BjaV9idXNfdmFsaWQoc3RydWN0IHBjaV9idXMgKnBjaV9idXMpCit7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKwlpbnQgYXNpY190eXBlOworCWludCBicmlja3R5cGU7CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8ocGNpX2J1cyk7CisKKwkvKiBEb24ndCByZWdpc3RlciBzbG90cyBoYW5naW5nIG9mZiB0aGUgVElPQ0EgYnVzICovCisJYXNpY190eXBlID0gcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfYXNpY190eXBlOworCWlmIChhc2ljX3R5cGUgPT0gUENJSU9fQVNJQ19UWVBFX1RJT0NBKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyogT25seSByZWdpc3RlciBzbG90cyBpbiBJL08gQnJpY2tzIHRoYXQgc3VwcG9ydCBob3RwbHVnICovCisJYnJpY2t0eXBlID0gTU9EVUxFX0dFVF9CVFlQRShwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKTsKKwlzd2l0Y2ggKGJyaWNrdHlwZSkgeworCWNhc2UgTDFfQlJJQ0tUWVBFX0lYOgorCWNhc2UgTDFfQlJJQ0tUWVBFX1BYOgorCWNhc2UgTDFfQlJJQ0tUWVBFX0lBOgorCWNhc2UgTDFfQlJJQ0tUWVBFX1BBOgorCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUEVSTTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgc25faHBfc2xvdF9wcml2YXRlX2FsbG9jKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsCisJCQkJICAgIHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzLCBpbnQgZGV2aWNlKQoreworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisJc3RydWN0IHNsb3QgKnNsb3Q7CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8ocGNpX2J1cyk7CisKKwlic3NfaG90cGx1Z19zbG90LT5wcml2YXRlID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHNsb3QpLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFic3NfaG90cGx1Z19zbG90LT5wcml2YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKworCWJzc19ob3RwbHVnX3Nsb3QtPm5hbWUgPSBrbWFsbG9jKDMzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJzc19ob3RwbHVnX3Nsb3QtPm5hbWUpIHsKKwkJa2ZyZWUoYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNsb3QtPmRldmljZV9udW0gPSBkZXZpY2U7CisJc2xvdC0+cGNpX2J1cyA9IHBjaV9idXM7CisKKwlzcHJpbnRmKGJzc19ob3RwbHVnX3Nsb3QtPm5hbWUsICJtb2R1bGVfJWMlYyVjJWMlLjJkX2JfJWRfc18lZCIsCisJCScwJytSQUNLX0dFVF9DTEFTUyhNT0RVTEVfR0VUX1JBQ0socGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCkpLAorCQknMCcrUkFDS19HRVRfR1JPVVAoTU9EVUxFX0dFVF9SQUNLKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpKSwKKwkJJzAnK1JBQ0tfR0VUX05VTShNT0RVTEVfR0VUX1JBQ0socGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCkpLAorCQlNT0RVTEVfR0VUX0JUQ0hBUihwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSwKKwkJTU9EVUxFX0dFVF9CUE9TKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpLAorCQkoKGludClwY2lidXNfaW5mby0+cGJpX2J1c2NvbW1vbi5ic19wZXJzaXN0X2J1c251bSkgJiAweGYsCisJCWRldmljZSArIDEpOworCisJc2xvdC0+aG90cGx1Z19zbG90ID0gYnNzX2hvdHBsdWdfc2xvdDsKKwlsaXN0X2FkZCgmc2xvdC0+aHBfbGlzdCwgJnNuX2hwX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90ICogc25faHBfZGVzdHJveSh2b2lkKQoreworCXN0cnVjdCBzbG90ICpzbG90OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZzbl9ocF9saXN0KSB7CisJCXNsb3QgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzbG90LCBocF9saXN0KTsKKwkJYnNzX2hvdHBsdWdfc2xvdCA9IHNsb3QtPmhvdHBsdWdfc2xvdDsKKwkJbGlzdF9kZWwoJigoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlKS0+CisJCQkgaHBfbGlzdCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gYnNzX2hvdHBsdWdfc2xvdDsKK30KKworc3RhdGljIHZvaWQgc25fYnVzX2FsbG9jX2RhdGEoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOworCXN0cnVjdCBwY2lfYnVzICpzdWJvcmRpbmF0ZV9idXM7CisJc3RydWN0IHBjaV9kZXYgKmNoaWxkOworCisJc25fcGNpX2ZpeHVwX3Nsb3QoZGV2KTsKKworCS8qIFJlY3Vyc2l2ZWx5IHNldHMgdXAgdGhlIHNuX2lycV9pbmZvIHN0cnVjdHMgKi8KKwlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgeworCQlzdWJvcmRpbmF0ZV9idXMgPSBkZXYtPnN1Ym9yZGluYXRlOworCQlsaXN0X2Zvcl9lYWNoKG5vZGUsICZzdWJvcmRpbmF0ZV9idXMtPmRldmljZXMpIHsKKwkJCWNoaWxkID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgcGNpX2RldiwgYnVzX2xpc3QpOworCQkJc25fYnVzX2FsbG9jX2RhdGEoY2hpbGQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzbl9idXNfZnJlZV9kYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqc3Vib3JkaW5hdGVfYnVzOworCXN0cnVjdCBwY2lfZGV2ICpjaGlsZDsKKworCS8qIFJlY3Vyc2l2ZWx5IGNsZWFuIHVwIHNuX2lycV9pbmZvIHN0cnVjdHMgKi8KKwlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgeworCQlzdWJvcmRpbmF0ZV9idXMgPSBkZXYtPnN1Ym9yZGluYXRlOworCQlsaXN0X2Zvcl9lYWNoKG5vZGUsICZzdWJvcmRpbmF0ZV9idXMtPmRldmljZXMpIHsKKwkJCWNoaWxkID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgcGNpX2RldiwgYnVzX2xpc3QpOworCQkJc25fYnVzX2ZyZWVfZGF0YShjaGlsZCk7CisJCX0KKwl9CisJc25fcGNpX3VuZml4dXBfc2xvdChkZXYpOworfQorCitzdGF0aWMgdTggc25fcG93ZXJfc3RhdHVzX2dldChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQoreworCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOworCXU4IHJldHZhbDsKKworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKKwlyZXR2YWwgPSBwY2lidXNfaW5mby0+cGJpX2VuYWJsZWRfZGV2aWNlcyAmICgxIDw8IHNsb3QtPmRldmljZV9udW0pOworCisJcmV0dXJuIHJldHZhbCA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZCBzbl9zbG90X21hcmtfZW5hYmxlKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsCisJCQkJaW50IGRldmljZV9udW0pCit7CisJc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisJcGNpYnVzX2luZm8tPnBiaV9lbmFibGVkX2RldmljZXMgfD0gKDEgPDwgZGV2aWNlX251bSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuX3Nsb3RfbWFya19kaXNhYmxlKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsCisJCQkJIGludCBkZXZpY2VfbnVtKQoreworCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOworCisJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHNsb3QtPnBjaV9idXMpOworCXBjaWJ1c19pbmZvLT5wYmlfZW5hYmxlZF9kZXZpY2VzICY9IH4oMSA8PCBkZXZpY2VfbnVtKTsKK30KKworc3RhdGljIGludCBzbl9zbG90X2VuYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAorCQkJICBpbnQgZGV2aWNlX251bSkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKwlzdHJ1Y3QgcGNpYnJfc2xvdF9lbmFibGVfcmVzcCByZXNwOworCWludCByYzsKKworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKKworCS8qCisJICogUG93ZXItb24gYW5kIGluaXRpYWxpemUgdGhlIHNsb3QgaW4gdGhlIFNOCisJICogUENJIGluZnJhc3RydWN0dXJlLgorCSAqLworCXJjID0gc2FsX3BjaWJyX3Nsb3RfZW5hYmxlKHBjaWJ1c19pbmZvLCBkZXZpY2VfbnVtLCAmcmVzcCk7CisKKwlpZiAocmMgPT0gUENJX1NMT1RfQUxSRUFEWV9VUCkgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJpcyBhbHJlYWR5IGFjdGl2ZVxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKHJjID09IFBDSV9MMV9FUlIpIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQkJIkwxIGZhaWx1cmUgJWQgd2l0aCBtZXNzYWdlOiAlcyIsCisJCQlyZXNwLnJlc3Bfc3ViX2Vycm5vLCByZXNwLnJlc3BfbDFfbXNnKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAocmMpIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQkJImluc2VydCBmYWlsZWQgd2l0aCBlcnJvciAlZCBzdWItZXJyb3IgJWRcbiIsCisJCQlyYywgcmVzcC5yZXNwX3N1Yl9lcnJubyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXNuX3Nsb3RfbWFya19lbmFibGUoYnNzX2hvdHBsdWdfc2xvdCwgZGV2aWNlX251bSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbl9zbG90X2Rpc2FibGUoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwKKwkJCSAgIGludCBkZXZpY2VfbnVtLCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOworCXN0cnVjdCBwY2licl9zbG90X2Rpc2FibGVfcmVzcCByZXNwOworCWludCByYzsKKworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKKworCXJjID0gc2FsX3BjaWJyX3Nsb3RfZGlzYWJsZShwY2lidXNfaW5mbywgZGV2aWNlX251bSwgYWN0aW9uLCAmcmVzcCk7CisKKwlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSAmJiByYyA9PSBQQ0lfU0xPVF9BTFJFQURZX0RPV04pIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCAiU2xvdCAlcyBhbHJlYWR5IGluYWN0aXZlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMgPT0gUENJX0VNUFRZXzMzTUhaKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKKwkJCSJDYW5ub3QgcmVtb3ZlIGxhc3QgMzNNSHogY2FyZFxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMgPT0gUENJX0wxX0VSUikgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCQkiTDEgZmFpbHVyZSAlZCB3aXRoIG1lc3NhZ2UgXG4lc1xuIiwKKwkJCXJlc3AucmVzcF9zdWJfZXJybm8sIHJlc3AucmVzcF9sMV9tc2cpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFICYmIHJjKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKKwkJCSJyZW1vdmUgZmFpbGVkIHdpdGggZXJyb3IgJWQgc3ViLWVycm9yICVkXG4iLAorCQkJcmMsIHJlc3AucmVzcF9zdWJfZXJybm8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSAmJiAhcmMpCisJCXJldHVybiAwOworCisJaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRElTQUJMRSAmJiAhcmMpIHsKKwkJc25fc2xvdF9tYXJrX2Rpc2FibGUoYnNzX2hvdHBsdWdfc2xvdCwgZGV2aWNlX251bSk7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwgInJlbW92ZSBzdWNjZXNzZnVsXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRElTQUJMRSAmJiByYykgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsInJlbW92ZSBmYWlsZWQgcmMgPSAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYWJsZV9zbG90KHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QpCit7CisJc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBwY2lfYnVzICpuZXdfYnVzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWludCBmdW5jLCBudW1fZnVuY3M7CisJaW50IG5ld19wcGIgPSAwOworCWludCByYzsKKworCS8qIFNlcmlhbGl6ZSB0aGUgTGludXggUENJIGluZnJhc3RydWN0dXJlICovCisJZG93bigmc25faG90cGx1Z19zZW0pOworCisJLyoKKwkgKiBQb3dlci1vbiBhbmQgaW5pdGlhbGl6ZSB0aGUgc2xvdCBpbiB0aGUgU04KKwkgKiBQQ0kgaW5mcmFzdHJ1Y3R1cmUuCisJICovCisJcmMgPSBzbl9zbG90X2VuYWJsZShic3NfaG90cGx1Z19zbG90LCBzbG90LT5kZXZpY2VfbnVtKTsKKwlpZiAocmMpIHsKKwkJdXAoJnNuX2hvdHBsdWdfc2VtKTsKKwkJcmV0dXJuIHJjOworCX0KKworCW51bV9mdW5jcyA9IHBjaV9zY2FuX3Nsb3Qoc2xvdC0+cGNpX2J1cywgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0rMSwKKwkJCQkJCQkgICBQQ0lfRlVOQygwKSkpOworCWlmICghbnVtX2Z1bmNzKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwgIm5vIGRldmljZSBpbiBzbG90XG4iKTsKKwkJdXAoJnNuX2hvdHBsdWdfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc25fcGNpX2NvbnRyb2xsZXJfZml4dXAocGNpX2RvbWFpbl9ucihzbG90LT5wY2lfYnVzKSwKKwkJCQlzbG90LT5wY2lfYnVzLT5udW1iZXIsCisJCQkJc2xvdC0+cGNpX2J1cyk7CisJLyoKKwkgKiBNYXAgU04gcmVzb3VyY2VzIGZvciBhbGwgZnVuY3Rpb25zIG9uIHRoZSBjYXJkCisJICogdG8gdGhlIExpbnV4IFBDSSBpbnRlcmZhY2UgYW5kIHRlbGwgdGhlIGRyaXZlcnMKKwkgKiBhYm91dCB0aGVtLgorCSAqLworCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCBudW1fZnVuY3M7ICBmdW5jKyspIHsKKwkJZGV2ID0gcGNpX2dldF9zbG90KHNsb3QtPnBjaV9idXMsCisJCQkJICAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0gKyAxLAorCQkJCQkgICAgIFBDSV9GVU5DKGZ1bmMpKSk7CisKKworCQlpZiAoZGV2KSB7CisJCQlpZiAoZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7CisJCQkJdW5zaWduZWQgY2hhciBzZWNfYnVzOworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX1NFQ09OREFSWV9CVVMsCisJCQkJCQkgICAgICZzZWNfYnVzKTsKKwkJCQluZXdfYnVzID0gcGNpX2FkZF9uZXdfYnVzKGRldi0+YnVzLCBkZXYsCisJCQkJCQkJICBzZWNfYnVzKTsKKwkJCQlwY2lfc2Nhbl9jaGlsZF9idXMobmV3X2J1cyk7CisJCQkJc25fcGNpX2NvbnRyb2xsZXJfZml4dXAocGNpX2RvbWFpbl9ucihuZXdfYnVzKSwKKwkJCQkJCQluZXdfYnVzLT5udW1iZXIsCisJCQkJCQkJbmV3X2J1cyk7CisJCQkJbmV3X3BwYiA9IDE7CisJCQl9CisJCQlzbl9idXNfYWxsb2NfZGF0YShkZXYpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJfQorCX0KKworCS8qIENhbGwgdGhlIGRyaXZlciBmb3IgdGhlIG5ldyBkZXZpY2UgKi8KKwlwY2lfYnVzX2FkZF9kZXZpY2VzKHNsb3QtPnBjaV9idXMpOworCS8qIENhbGwgdGhlIGRyaXZlcnMgZm9yIHRoZSBuZXcgZGV2aWNlcyBzdWJvcmRpbmF0ZSB0byBQUEIgKi8KKwlpZiAobmV3X3BwYikKKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhuZXdfYnVzKTsKKworCXVwKCZzbl9ob3RwbHVnX3NlbSk7CisKKwlpZiAocmMgPT0gMCkKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQkJImluc2VydCBvcGVyYXRpb24gc3VjY2Vzc2Z1bFxuIik7CisJZWxzZQorCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCQkiaW5zZXJ0IG9wZXJhdGlvbiBmYWlsZWQgcmMgPSAlZFxuIiwgcmMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGRpc2FibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQoreworCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWludCBmdW5jOworCWludCByYzsKKworCS8qIEFjcXVpcmUgdXBkYXRlIGFjY2VzcyB0byB0aGUgYnVzICovCisJZG93bigmc25faG90cGx1Z19zZW0pOworCisJLyogaXMgaXQgb2theSB0byBicmluZyB0aGlzIHNsb3QgZG93bj8gKi8KKwlyYyA9IHNuX3Nsb3RfZGlzYWJsZShic3NfaG90cGx1Z19zbG90LCBzbG90LT5kZXZpY2VfbnVtLAorCQkJICAgICBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUpOworCWlmIChyYykKKwkJZ290byBsZWF2aW5nOworCisJLyogRnJlZSB0aGUgU04gcmVzb3VyY2VzIGFzc2lnbmVkIHRvIHRoZSBMaW51eCBkZXZpY2UuKi8KKwlmb3IgKGZ1bmMgPSAwOyBmdW5jIDwgODsgIGZ1bmMrKykgeworCQlkZXYgPSBwY2lfZ2V0X3Nsb3Qoc2xvdC0+cGNpX2J1cywKKwkJCQkgICBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlX251bSsxLAorCQkJCSAgIAkgICAgIFBDSV9GVU5DKGZ1bmMpKSk7CisJCWlmIChkZXYpIHsKKwkJCS8qCisJCQkgKiBTb21lIGRyaXZlcnMgbWF5IHVzZSBkbWEgYWNjZXNzZXMgZHVyaW5nIHRoZQorCQkJICogZHJpdmVyIHJlbW92ZSBmdW5jdGlvbi4gV2UgcmVsZWFzZSB0aGUgc3lzZGF0YQorCQkJICogYXJlYXMgYWZ0ZXIgdGhlIGRyaXZlciByZW1vdmUgZnVuY3Rpb25zIGhhdmUKKwkJCSAqIGJlZW4gY2FsbGVkLgorCQkJICovCisJCQlzbl9idXNfc3RvcmVfc3lzZGF0YShkZXYpOworCQkJc25fYnVzX2ZyZWVfZGF0YShkZXYpOworCQkJcGNpX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisJCQlwY2lfZGV2X3B1dChkZXYpOworCQl9CisJfQorCisJLyogZnJlZSB0aGUgY29sbGVjdGVkIHN5c2RhdGEgcG9pbnRlcnMgKi8KKwlzbl9idXNfZnJlZV9zeXNkYXRhKCk7CisKKwkvKiBEZWFjdGl2YXRlIHNsb3QgKi8KKwlyYyA9IHNuX3Nsb3RfZGlzYWJsZShic3NfaG90cGx1Z19zbG90LCBzbG90LT5kZXZpY2VfbnVtLAorCQkJICAgICBQQ0lfUkVRX1NMT1RfRElTQUJMRSk7CisgbGVhdmluZzoKKwkvKiBSZWxlYXNlIHRoZSBidXMgbG9jayAqLworCXVwKCZzbl9ob3RwbHVnX3NlbSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LCB1OCAqdmFsdWUpCit7CisJZG93bigmc25faG90cGx1Z19zZW0pOworCSp2YWx1ZSA9IHNuX3Bvd2VyX3N0YXR1c19nZXQoYnNzX2hvdHBsdWdfc2xvdCk7CisJdXAoJnNuX2hvdHBsdWdfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25fcmVsZWFzZV9zbG90KHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QpCit7CisJa2ZyZWUoYnNzX2hvdHBsdWdfc2xvdC0+aW5mbyk7CisJa2ZyZWUoYnNzX2hvdHBsdWdfc2xvdC0+bmFtZSk7CisJa2ZyZWUoYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZSk7CisJa2ZyZWUoYnNzX2hvdHBsdWdfc2xvdCk7Cit9CisKK3N0YXRpYyBpbnQgc25faG90cGx1Z19zbG90X3JlZ2lzdGVyKHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzKQoreworCWludCBkZXZpY2U7CisJc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdDsKKwlpbnQgcmMgPSAwOworCisJLyoKKwkgKiBDdXJyZW50bHkgb25seSBmb3VyIGRldmljZXMgYXJlIHN1cHBvcnRlZCwKKwkgKiBpbiB0aGUgZnV0dXJlIHRoZXJlIG1heWJlIG1vcmUgLS0gdXAgdG8gMzIuCisJICovCisKKwlmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IFNOX01BWF9IUF9TTE9UUyA7IGRldmljZSsrKSB7CisJCWlmIChzbl9wY2lfc2xvdF92YWxpZChwY2lfYnVzLCBkZXZpY2UpICE9IDEpCisJCQljb250aW51ZTsKKworCQlic3NfaG90cGx1Z19zbG90ID0ga2NhbGxvYygxLHNpemVvZihzdHJ1Y3QgaG90cGx1Z19zbG90KSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJCWlmICghYnNzX2hvdHBsdWdfc2xvdCkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBhbGxvY19lcnI7CisJCX0KKworCQlic3NfaG90cGx1Z19zbG90LT5pbmZvID0KKwkJCWtjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFic3NfaG90cGx1Z19zbG90LT5pbmZvKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGFsbG9jX2VycjsKKwkJfQorCisJCWlmIChzbl9ocF9zbG90X3ByaXZhdGVfYWxsb2MoYnNzX2hvdHBsdWdfc2xvdCwKKwkJCQkJICAgICBwY2lfYnVzLCBkZXZpY2UpKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGFsbG9jX2VycjsKKwkJfQorCisJCWJzc19ob3RwbHVnX3Nsb3QtPm9wcyA9ICZzbl9ob3RwbHVnX3Nsb3Rfb3BzOworCQlic3NfaG90cGx1Z19zbG90LT5yZWxlYXNlID0gJnNuX3JlbGVhc2Vfc2xvdDsKKworCQlyYyA9IHBjaV9ocF9yZWdpc3Rlcihic3NfaG90cGx1Z19zbG90KTsKKwkJaWYgKHJjKQorCQkJZ290byByZWdpc3Rlcl9lcnI7CisJfQorCWRldl9kYmcocGNpX2J1cy0+c2VsZiwgIlJlZ2lzdGVyZWQgYnVzIHdpdGggaG90cGx1Z1xuIik7CisJcmV0dXJuIHJjOworCityZWdpc3Rlcl9lcnI6CisJZGV2X2RiZyhwY2lfYnVzLT5zZWxmLCAiYnVzIGZhaWxlZCB0byByZWdpc3RlciB3aXRoIGVyciA9ICVkXG4iLAorCSAgICAgICAgcmMpOworCithbGxvY19lcnI6CisJaWYgKHJjID09IC1FTk9NRU0pCisJCWRldl9kYmcocGNpX2J1cy0+c2VsZiwgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKworCS8qIGRlc3Ryb3kgVEhJUyBlbGVtZW50ICovCisJaWYgKGJzc19ob3RwbHVnX3Nsb3QpCisJCXNuX3JlbGVhc2Vfc2xvdChic3NfaG90cGx1Z19zbG90KTsKKworCS8qIGRlc3Ryb3kgYW55dGhpbmcgZWxzZSBvbiB0aGUgbGlzdCAqLworCXdoaWxlICgoYnNzX2hvdHBsdWdfc2xvdCA9IHNuX2hwX2Rlc3Ryb3koKSkpCisJCXBjaV9ocF9kZXJlZ2lzdGVyKGJzc19ob3RwbHVnX3Nsb3QpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHNuX3BjaV9ob3RwbHVnX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cyA9IE5VTEw7CisJaW50IHJjOworCWludCByZWdpc3RlcmVkID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZzbl9ocF9saXN0KTsKKworCWlmIChzbl9zYWxfcmV2KCkgPCBTR0lfSE9UUExVR19QUk9NX1JFVikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQUk9NIHZlcnNpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gNC4wNVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJd2hpbGUgKChwY2lfYnVzID0gcGNpX2ZpbmRfbmV4dF9idXMocGNpX2J1cykpKSB7CisJCWlmICghcGNpX2J1cy0+c3lzZGF0YSkKKwkJCWNvbnRpbnVlOworCisJCXJjID0gc25fcGNpX2J1c192YWxpZChwY2lfYnVzKTsKKwkJaWYgKHJjICE9IDEpIHsKKwkJCWRldl9kYmcocGNpX2J1cy0+c2VsZiwgIm5vdCBhIHZhbGlkIGhvdHBsdWcgYnVzXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRldl9kYmcocGNpX2J1cy0+c2VsZiwgInZhbGlkIGhvdHBsdWcgYnVzXG4iKTsKKworCQlyYyA9IHNuX2hvdHBsdWdfc2xvdF9yZWdpc3RlcihwY2lfYnVzKTsKKwkJaWYgKCFyYykKKwkJCXJlZ2lzdGVyZWQgPSAxOworCQllbHNlIHsKKwkJCXJlZ2lzdGVyZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVnaXN0ZXJlZCA9PSAxID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIHNuX3BjaV9ob3RwbHVnX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90OworCisJd2hpbGUgKChic3NfaG90cGx1Z19zbG90ID0gc25faHBfZGVzdHJveSgpKSkgeworCQlwY2lfaHBfZGVyZWdpc3Rlcihic3NfaG90cGx1Z19zbG90KTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnNuX2hwX2xpc3QpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnRlcm5hbCBsaXN0IGlzIG5vdCBlbXB0eVxuIiwgX19GSUxFX18pOworfQorCittb2R1bGVfaW5pdChzbl9wY2lfaG90cGx1Z19pbml0KTsKK21vZHVsZV9leGl0KHNuX3BjaV9ob3RwbHVnX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWFjcGkuYyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKaW5kZXggYmMwMWQzNC4uZTllMzdhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWFjcGkuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCkBAIC0xLDkgKzEsMTAgQEAKIC8qCiAgKiBGaWxlOglwY2ktYWNwaS5jCi0gKiBQdXJwb3NlOglQcm92aWRlIFBDSSBzdXBwb3J0cyBpbiBBQ1BJCisgKiBQdXJwb3NlOglQcm92aWRlIFBDSSBzdXBwb3J0IGluIEFDUEkKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwKLSAqIENvcHlyaWdodCAoQykgVG9tIExvbmcgTmd1eWVuICh0b20ubC5uZ3V5ZW5AaW50ZWwuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIFNoYW9odWEgTGkgPHNoYW9odWEubGlAaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRvbSBMb25nIE5ndXllbiA8dG9tLmwubmd1eWVuQGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbCBDb3JwLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTYsNiArMTcsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CisjaW5jbHVkZSAicGNpLmgiCiAKIHN0YXRpYyB1MzIgY3RybHNldF9idWZbM10gPSB7MCwgMCwgMH07CiBzdGF0aWMgdTMyIGdsb2JhbF9jdHJsc2V0cyA9IDA7CkBAIC0yMDcsMyArMjA5LDEwNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9vc2NfY29udHJvbF9zZXQpOworCisvKgorICogX1N4RCByZXR1cm5zIHRoZSBELXN0YXRlIHdpdGggdGhlIGhpZ2hlc3QgcG93ZXIKKyAqIChsb3dlc3QgRC1zdGF0ZSBudW1iZXIpIHN1cHBvcnRlZCBpbiB0aGUgUy1zdGF0ZSAieCIuCisgKgorICogSWYgdGhlIGRldmljZXMgZG9lcyBub3QgaGF2ZSBhIF9QUlcKKyAqIChQb3dlciBSZXNvdXJjZXMgZm9yIFdha2UpIHN1cHBvcnRpbmcgc3lzdGVtIHdha2V1cCBmcm9tICJ4IgorICogdGhlbiB0aGUgT1MgaXMgZnJlZSB0byBjaG9vc2UgYSBsb3dlciBwb3dlciAoaGlnaGVyIG51bWJlcgorICogRC1zdGF0ZSkgdGhhbiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gX1N4RC4KKyAqCisgKiBCdXQgaWYgX1BSVyBpcyBlbmFibGVkIGF0IFMtc3RhdGUgIngiLCB0aGUgT1MKKyAqIG11c3Qgbm90IGNob29zZSBhIHBvd2VyIGxvd2VyIHRoYW4gX1N4RCAtLQorICogdW5sZXNzIHRoZSBkZXZpY2UgaGFzIGFuIF9TeFcgbWV0aG9kIHNwZWNpZnlpbmcKKyAqIHRoZSBsb3dlc3QgcG93ZXIgKGhpZ2hlc3QgRC1zdGF0ZSBudW1iZXIpIHRoZSBkZXZpY2UKKyAqIG1heSBlbnRlciB3aGlsZSBzdGlsbCBhYmxlIHRvIHdha2UgdGhlIHN5c3RlbS4KKyAqCisgKiBpZS4gZGVwZW5kaW5nIG9uIGdsb2JhbCBPUyBwb2xpY3k6CisgKgorICogaWYgKF9QUlcgYXQgUy1zdGF0ZSB4KQorICoJY2hvb3NlIGZyb20gaGlnaGVzdCBwb3dlciBfU3hEIHRvIGxvd2VzdCBwb3dlciBfU3hXCisgKiBlbHNlIC8vIG5vIF9QUlcgYXQgUy1zdGF0ZSB4CisgKiAJY2hvb3NlIGhpZ2hlc3QgcG93ZXIgX1N4RCBvciBhbnkgbG93ZXIgcG93ZXIKKyAqCisgKiBjdXJyZW50bHkgd2Ugc2ltcGx5IHJldHVybiBfU3hELCBpZiBwcmVzZW50LgorICovCisKK3N0YXRpYyBpbnQgYWNwaV9wY2lfY2hvb3NlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJLyogVEJEICovCisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBhY3BpX3BjaV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKCZkZXYtPmRldik7CisJc3RhdGljIGludCBzdGF0ZV9jb252W10gPSB7CisJCVswXSA9IDAsCisJCVsxXSA9IDEsCisJCVsyXSA9IDIsCisJCVszXSA9IDMsCisJCVs0XSA9IDMKKwl9OworCWludCBhY3BpX3N0YXRlID0gc3RhdGVfY29udlsoaW50IF9fZm9yY2UpIHN0YXRlXTsKKworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gYWNwaV9idXNfc2V0X3Bvd2VyKGhhbmRsZSwgYWNwaV9zdGF0ZSk7Cit9CisKKworLyogQUNQSSBidXMgdHlwZSAqLworc3RhdGljIGludCBwY2lfYWNwaV9maW5kX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGFjcGlfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2OworCWFjcGlfaW50ZWdlcglhZGRyOworCisJcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwkvKiBQbGVhc2UgcmVmIHRvIEFDUEkgc3BlYyBmb3IgdGhlIHN5bnRheCBvZiBfQURSICovCisJYWRkciA9IChQQ0lfU0xPVChwY2lfZGV2LT5kZXZmbikgPDwgMTYpIHwgUENJX0ZVTkMocGNpX2Rldi0+ZGV2Zm4pOworCSpoYW5kbGUgPSBhY3BpX2dldF9jaGlsZChERVZJQ0VfQUNQSV9IQU5ETEUoZGV2LT5wYXJlbnQpLCBhZGRyKTsKKwlpZiAoISpoYW5kbGUpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaV9hY3BpX2ZpbmRfcm9vdF9icmlkZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBhY3BpX2hhbmRsZSAqaGFuZGxlKQoreworCWludCBudW07CisJdW5zaWduZWQgaW50IHNlZywgYnVzOworCisJLyoKKwkgKiBUaGUgc3RyaW5nIHNob3VsZCBiZSB0aGUgc2FtZSBhcyByb290IGJyaWRnZSdzIG5hbWUKKwkgKiBQbGVhc2UgbG9vayBhdCAncGNpX3NjYW5fYnVzX3BhcmVudGVkJworCSAqLworCW51bSA9IHNzY2FuZihkZXYtPmJ1c19pZCwgInBjaSUwNHg6JTAyeCIsICZzZWcsICZidXMpOworCWlmIChudW0gIT0gMikKKwkJcmV0dXJuIC1FTk9ERVY7CisJKmhhbmRsZSA9IGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZShzZWcsIGJ1cyk7CisJaWYgKCEqaGFuZGxlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhY3BpX2J1c190eXBlIHBjaV9hY3BpX2J1cyA9IHsKKwkuYnVzID0gJnBjaV9idXNfdHlwZSwKKwkuZmluZF9kZXZpY2UgPSBwY2lfYWNwaV9maW5kX2RldmljZSwKKwkuZmluZF9icmlkZ2UgPSBwY2lfYWNwaV9maW5kX3Jvb3RfYnJpZGdlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNpX2FjcGlfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdpc3Rlcl9hY3BpX2J1c190eXBlKCZwY2lfYWNwaV9idXMpOworCWlmIChyZXQpCisJCXJldHVybiAwOworCXBsYXRmb3JtX3BjaV9jaG9vc2Vfc3RhdGUgPSBhY3BpX3BjaV9jaG9vc2Vfc3RhdGU7CisJcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZSA9IGFjcGlfcGNpX3NldF9wb3dlcl9zdGF0ZTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwocGNpX2FjcGlfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggZTY1YmYyYi4uZTQxMTVhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLWR5bmlkcy5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAvKgpAQCAtMTgsMzYgKzE3LDEyIEBACiAgKiBEeW5hbWljIGRldmljZSBJRHMgYXJlIGRpc2FibGVkIGZvciAhQ09ORklHX0hPVFBMVUcKICAqLwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLS8qKgotICogcGNpX2RldmljZV9wcm9iZV9keW5hbWljKCkKLSAqCi0gKiBXYWxrIHRoZSBkeW5hbWljIElEIGxpc3QgbG9va2luZyBmb3IgYSBtYXRjaC4KLSAqIHJldHVybnMgMCBhbmQgc2V0cyBwY2lfZGV2LT5kcml2ZXIgd2hlbiBkcnYgY2xhaW1zIHBjaV9kZXYsIGVsc2UgZXJyb3IuCi0gKi8KLXN0YXRpYyBpbnQKLXBjaV9kZXZpY2VfcHJvYmVfZHluYW1pYyhzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlpbnQgZXJyb3IgPSAtRU5PREVWOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQlzdHJ1Y3QgZHluaWQgKmR5bmlkOworc3RydWN0IHBjaV9keW5pZCB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBwY2lfZGV2aWNlX2lkIGlkOworfTsKIAotCXNwaW5fbG9jaygmZHJ2LT5keW5pZHMubG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwb3MsICZkcnYtPmR5bmlkcy5saXN0KSB7Ci0JCWR5bmlkID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBkeW5pZCwgbm9kZSk7Ci0JCWlmIChwY2lfbWF0Y2hfb25lX2RldmljZSgmZHluaWQtPmlkLCBwY2lfZGV2KSkgewotCQkJc3Bpbl91bmxvY2soJmRydi0+ZHluaWRzLmxvY2spOwotCQkJZXJyb3IgPSBkcnYtPnByb2JlKHBjaV9kZXYsICZkeW5pZC0+aWQpOwotCQkJaWYgKGVycm9yID49IDApIHsKLQkJCQlwY2lfZGV2LT5kcml2ZXIgPSBkcnY7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2soJmRydi0+ZHluaWRzLmxvY2spOwotCXJldHVybiBlcnJvcjsKLX0KKyNpZmRlZiBDT05GSUdfSE9UUExVRwogCiAvKioKICAqIHN0b3JlX25ld19pZApAQCAtNTgsOCArMzMsNyBAQAogc3RhdGljIGlubGluZSBzc2l6ZV90CiBzdG9yZV9uZXdfaWQoc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGR5bmlkICpkeW5pZDsKLQlzdHJ1Y3QgYnVzX3R5cGUgKiBidXM7CisJc3RydWN0IHBjaV9keW5pZCAqZHluaWQ7CiAJc3RydWN0IHBjaV9kcml2ZXIgKnBkcnYgPSB0b19wY2lfZHJpdmVyKGRyaXZlcik7CiAJX191MzIgdmVuZG9yPVBDSV9BTllfSUQsIGRldmljZT1QQ0lfQU5ZX0lELCBzdWJ2ZW5kb3I9UENJX0FOWV9JRCwKIAkJc3ViZGV2aWNlPVBDSV9BTllfSUQsIGNsYXNzPTAsIGNsYXNzX21hc2s9MDsKQEAgLTkxLDM3ICs2NSwyMiBAQAogCWxpc3RfYWRkX3RhaWwoJnBkcnYtPmR5bmlkcy5saXN0LCAmZHluaWQtPm5vZGUpOwogCXNwaW5fdW5sb2NrKCZwZHJ2LT5keW5pZHMubG9jayk7CiAKLQlidXMgPSBnZXRfYnVzKHBkcnYtPmRyaXZlci5idXMpOwotCWlmIChidXMpIHsKLQkJaWYgKGdldF9kcml2ZXIoJnBkcnYtPmRyaXZlcikpIHsKLQkJCWRvd25fd3JpdGUoJmJ1cy0+c3Vic3lzLnJ3c2VtKTsKLQkJCWRyaXZlcl9hdHRhY2goJnBkcnYtPmRyaXZlcik7Ci0JCQl1cF93cml0ZSgmYnVzLT5zdWJzeXMucndzZW0pOwotCQkJcHV0X2RyaXZlcigmcGRydi0+ZHJpdmVyKTsKLQkJfQotCQlwdXRfYnVzKGJ1cyk7CisJaWYgKGdldF9kcml2ZXIoJnBkcnYtPmRyaXZlcikpIHsKKwkJZHJpdmVyX2F0dGFjaCgmcGRydi0+ZHJpdmVyKTsKKwkJcHV0X2RyaXZlcigmcGRydi0+ZHJpdmVyKTsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CiB9Ci0KIHN0YXRpYyBEUklWRVJfQVRUUihuZXdfaWQsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX25ld19pZCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXBjaV9pbml0X2R5bmlkcyhzdHJ1Y3QgcGNpX2R5bmlkcyAqZHluaWRzKQotewotCXNwaW5fbG9ja19pbml0KCZkeW5pZHMtPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZkeW5pZHMtPmxpc3QpOwotfQogCiBzdGF0aWMgdm9pZAogcGNpX2ZyZWVfZHluaWRzKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbjsKLQlzdHJ1Y3QgZHluaWQgKmR5bmlkOworCXN0cnVjdCBwY2lfZHluaWQgKmR5bmlkLCAqbjsKIAogCXNwaW5fbG9jaygmZHJ2LT5keW5pZHMubG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgJmRydi0+ZHluaWRzLmxpc3QpIHsKLQkJZHluaWQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGR5bmlkLCBub2RlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZHluaWQsIG4sICZkcnYtPmR5bmlkcy5saXN0LCBub2RlKSB7CiAJCWxpc3RfZGVsKCZkeW5pZC0+bm9kZSk7CiAJCWtmcmVlKGR5bmlkKTsKIAl9CkBAIC0xMzgsODMgKzk3LDcwIEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50Ci1wY2lfYnVzX21hdGNoX2R5bmlkcyhjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IHBjaV9kcml2ZXIgKnBjaV9kcnYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCXN0cnVjdCBkeW5pZCAqZHluaWQ7Ci0KLQlzcGluX2xvY2soJnBjaV9kcnYtPmR5bmlkcy5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHBvcywgJnBjaV9kcnYtPmR5bmlkcy5saXN0KSB7Ci0JCWR5bmlkID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBkeW5pZCwgbm9kZSk7Ci0JCWlmIChwY2lfbWF0Y2hfb25lX2RldmljZSgmZHluaWQtPmlkLCBwY2lfZGV2KSkgewotCQkJc3Bpbl91bmxvY2soJnBjaV9kcnYtPmR5bmlkcy5sb2NrKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZwY2lfZHJ2LT5keW5pZHMubG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KICNlbHNlIC8qICFDT05GSUdfSE9UUExVRyAqLwotc3RhdGljIGlubGluZSBpbnQgcGNpX2RldmljZV9wcm9iZV9keW5hbWljKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewotCXJldHVybiAtRU5PREVWOwotfQotc3RhdGljIGlubGluZSB2b2lkIHBjaV9pbml0X2R5bmlkcyhzdHJ1Y3QgcGNpX2R5bmlkcyAqZHluaWRzKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHBjaV9mcmVlX2R5bmlkcyhzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2KSB7fQogc3RhdGljIGlubGluZSBpbnQgcGNpX2NyZWF0ZV9uZXdpZF9maWxlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYpCiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBwY2lfYnVzX21hdGNoX2R5bmlkcyhjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IHBjaV9kcml2ZXIgKnBjaV9kcnYpCi17Ci0JcmV0dXJuIDA7Ci19CiAjZW5kaWYKIAogLyoqCi0gKiBwY2lfbWF0Y2hfZGV2aWNlIC0gVGVsbCBpZiBhIFBDSSBkZXZpY2Ugc3RydWN0dXJlIGhhcyBhIG1hdGNoaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgUENJIGRldmljZSBpZCBzdHJ1Y3R1cmUKKyAqIHBjaV9tYXRjaF9pZCAtIFNlZSBpZiBhIHBjaSBkZXZpY2UgbWF0Y2hlcyBhIGdpdmVuIHBjaV9pZCB0YWJsZQogICogQGlkczogYXJyYXkgb2YgUENJIGRldmljZSBpZCBzdHJ1Y3R1cmVzIHRvIHNlYXJjaCBpbgotICogQGRldjogdGhlIFBDSSBkZXZpY2Ugc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QKLSAqIAorICogQGRldjogdGhlIFBDSSBkZXZpY2Ugc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QuCisgKgogICogVXNlZCBieSBhIGRyaXZlciB0byBjaGVjayB3aGV0aGVyIGEgUENJIGRldmljZSBwcmVzZW50IGluIHRoZQotICogc3lzdGVtIGlzIGluIGl0cyBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzLlJldHVybnMgdGhlIG1hdGNoaW5nCisgKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuICBSZXR1cm5zIHRoZSBtYXRjaGluZwogICogcGNpX2RldmljZV9pZCBzdHJ1Y3R1cmUgb3IgJU5VTEwgaWYgdGhlcmUgaXMgbm8gbWF0Y2guCisgKgorICogRGVwcmVjaWF0ZWQsIGRvbid0IHVzZSB0aGlzIGFzIGl0IHdpbGwgbm90IGNhdGNoIGFueSBkeW5hbWljIGlkcworICogdGhhdCBhIGRyaXZlciBtaWdodCB3YW50IHRvIGNoZWNrIGZvci4KICAqLwotY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKgotcGNpX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRzLCBjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQorY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9tYXRjaF9pZChjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRzLAorCQkJCQkgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQl3aGlsZSAoaWRzLT52ZW5kb3IgfHwgaWRzLT5zdWJ2ZW5kb3IgfHwgaWRzLT5jbGFzc19tYXNrKSB7Ci0JCWlmIChwY2lfbWF0Y2hfb25lX2RldmljZShpZHMsIGRldikpCi0JCQlyZXR1cm4gaWRzOwotCQlpZHMrKzsKKwlpZiAoaWRzKSB7CisJCXdoaWxlIChpZHMtPnZlbmRvciB8fCBpZHMtPnN1YnZlbmRvciB8fCBpZHMtPmNsYXNzX21hc2spIHsKKwkJCWlmIChwY2lfbWF0Y2hfb25lX2RldmljZShpZHMsIGRldikpCisJCQkJcmV0dXJuIGlkczsKKwkJCWlkcysrOworCQl9CiAJfQogCXJldHVybiBOVUxMOwogfQogCiAvKioKLSAqIHBjaV9kZXZpY2VfcHJvYmVfc3RhdGljKCkKLSAqIAotICogcmV0dXJucyAwIGFuZCBzZXRzIHBjaV9kZXYtPmRyaXZlciB3aGVuIGRydiBjbGFpbXMgcGNpX2RldiwgZWxzZSBlcnJvci4KKyAqIHBjaV9tYXRjaF9kZXZpY2UgLSBUZWxsIGlmIGEgUENJIGRldmljZSBzdHJ1Y3R1cmUgaGFzIGEgbWF0Y2hpbmcKKyAqICAgICAgICAgICAgICAgICAgICBQQ0kgZGV2aWNlIGlkIHN0cnVjdHVyZQorICogQGlkczogYXJyYXkgb2YgUENJIGRldmljZSBpZCBzdHJ1Y3R1cmVzIHRvIHNlYXJjaCBpbgorICogQGRldjogdGhlIFBDSSBkZXZpY2Ugc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QKKyAqIEBkcnY6IHRoZSBQQ0kgZHJpdmVyIHRvIG1hdGNoIGFnYWluc3QKKyAqCisgKiBVc2VkIGJ5IGEgZHJpdmVyIHRvIGNoZWNrIHdoZXRoZXIgYSBQQ0kgZGV2aWNlIHByZXNlbnQgaW4gdGhlCisgKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuICBSZXR1cm5zIHRoZSBtYXRjaGluZworICogcGNpX2RldmljZV9pZCBzdHJ1Y3R1cmUgb3IgJU5VTEwgaWYgdGhlcmUgaXMgbm8gbWF0Y2guCiAgKi8KLXN0YXRpYyBpbnQKLXBjaV9kZXZpY2VfcHJvYmVfc3RhdGljKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewkJICAgCi0JaW50IGVycm9yID0gLUVOT0RFVjsKK2NvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfbWF0Y2hfZGV2aWNlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsCisJCQkJCSAgICAgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CisJc3RydWN0IHBjaV9keW5pZCAqZHluaWQ7CiAKLQlpZiAoIWRydi0+aWRfdGFibGUpCi0JCXJldHVybiBlcnJvcjsKLQlpZCA9IHBjaV9tYXRjaF9kZXZpY2UoZHJ2LT5pZF90YWJsZSwgcGNpX2Rldik7CisJaWQgPSBwY2lfbWF0Y2hfaWQoZHJ2LT5pZF90YWJsZSwgZGV2KTsKIAlpZiAoaWQpCi0JCWVycm9yID0gZHJ2LT5wcm9iZShwY2lfZGV2LCBpZCk7Ci0JaWYgKGVycm9yID49IDApIHsKLQkJcGNpX2Rldi0+ZHJpdmVyID0gZHJ2OwotCQllcnJvciA9IDA7CisJCXJldHVybiBpZDsKKworCS8qIHN0YXRpYyBpZHMgZGlkbid0IG1hdGNoLCBsZXRzIGxvb2sgYXQgdGhlIGR5bmFtaWMgb25lcyAqLworCXNwaW5fbG9jaygmZHJ2LT5keW5pZHMubG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkeW5pZCwgJmRydi0+ZHluaWRzLmxpc3QsIG5vZGUpIHsKKwkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKCZkeW5pZC0+aWQsIGRldikpIHsKKwkJCXNwaW5fdW5sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKKwkJCXJldHVybiAmZHluaWQtPmlkOworCQl9CiAJfQotCXJldHVybiBlcnJvcjsKKwlzcGluX3VubG9jaygmZHJ2LT5keW5pZHMubG9jayk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgpAQCAtMjI1LDEzICsxNzEsMjAgQEAKICAqLwogc3RhdGljIGludAogX19wY2lfZGV2aWNlX3Byb2JlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewkJICAgCit7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXBjaV9kZXYtPmRyaXZlciAmJiBkcnYtPnByb2JlKSB7Ci0JCWVycm9yID0gcGNpX2RldmljZV9wcm9iZV9zdGF0aWMoZHJ2LCBwY2lfZGV2KTsKLQkJaWYgKGVycm9yID09IC1FTk9ERVYpCi0JCQllcnJvciA9IHBjaV9kZXZpY2VfcHJvYmVfZHluYW1pYyhkcnYsIHBjaV9kZXYpOworCQllcnJvciA9IC1FTk9ERVY7CisKKwkJaWQgPSBwY2lfbWF0Y2hfZGV2aWNlKGRydiwgcGNpX2Rldik7CisJCWlmIChpZCkKKwkJCWVycm9yID0gZHJ2LT5wcm9iZShwY2lfZGV2LCBpZCk7CisJCWlmIChlcnJvciA+PSAwKSB7CisJCQlwY2lfZGV2LT5kcml2ZXIgPSBkcnY7CisJCQllcnJvciA9IDA7CisJCX0KIAl9CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMzcxLDEyICszMjQsNiBAQAogCS5zeXNmc19vcHMgPSAmcGNpX2RyaXZlcl9zeXNmc19vcHMsCiB9OwogCi1zdGF0aWMgaW50Ci1wY2lfcG9wdWxhdGVfZHJpdmVyX2RpcihzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2KQotewotCXJldHVybiBwY2lfY3JlYXRlX25ld2lkX2ZpbGUoZHJ2KTsKLX0KLQogLyoqCiAgKiBwY2lfcmVnaXN0ZXJfZHJpdmVyIC0gcmVnaXN0ZXIgYSBuZXcgcGNpIGRyaXZlcgogICogQGRydjogdGhlIGRyaXZlciBzdHJ1Y3R1cmUgdG8gcmVnaXN0ZXIKQEAgLTQwMSwxMyArMzQ4LDE1IEBACiAJCWRydi0+ZHJpdmVyLnNodXRkb3duID0gcGNpX2RldmljZV9zaHV0ZG93bjsKIAlkcnYtPmRyaXZlci5vd25lciA9IGRydi0+b3duZXI7CiAJZHJ2LT5kcml2ZXIua29iai5rdHlwZSA9ICZwY2lfZHJpdmVyX2tvYmpfdHlwZTsKLQlwY2lfaW5pdF9keW5pZHMoJmRydi0+ZHluaWRzKTsKKworCXNwaW5fbG9ja19pbml0KCZkcnYtPmR5bmlkcy5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZHJ2LT5keW5pZHMubGlzdCk7CiAKIAkvKiByZWdpc3RlciB3aXRoIGNvcmUgKi8KIAllcnJvciA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwogCiAJaWYgKCFlcnJvcikKLQkJcGNpX3BvcHVsYXRlX2RyaXZlcl9kaXIoZHJ2KTsKKwkJZXJyb3IgPSBwY2lfY3JlYXRlX25ld2lkX2ZpbGUoZHJ2KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTQ2MywyMSArNDEyLDE3IEBACiAgKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuUmV0dXJucyB0aGUgbWF0Y2hpbmcKICAqIHBjaV9kZXZpY2VfaWQgc3RydWN0dXJlIG9yICVOVUxMIGlmIHRoZXJlIGlzIG5vIG1hdGNoLgogICovCi1zdGF0aWMgaW50IHBjaV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpIAorc3RhdGljIGludCBwY2lfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKLQljb25zdCBzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKiBwY2lfZHJ2ID0gdG9fcGNpX2RyaXZlcihkcnYpOwotCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICogaWRzID0gcGNpX2Rydi0+aWRfdGFibGU7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHBjaV9kcml2ZXIgKnBjaV9kcnYgPSB0b19wY2lfZHJpdmVyKGRydik7CiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmZvdW5kX2lkOwogCi0JaWYgKCFpZHMpCi0JCXJldHVybiAwOwotCi0JZm91bmRfaWQgPSBwY2lfbWF0Y2hfZGV2aWNlKGlkcywgcGNpX2Rldik7CisJZm91bmRfaWQgPSBwY2lfbWF0Y2hfZGV2aWNlKHBjaV9kcnYsIHBjaV9kZXYpOwogCWlmIChmb3VuZF9pZCkKIAkJcmV0dXJuIDE7CiAKLQlyZXR1cm4gcGNpX2J1c19tYXRjaF9keW5pZHMocGNpX2RldiwgcGNpX2Rydik7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNTM2LDYgKzQ4MSw3IEBACiAKIHBvc3Rjb3JlX2luaXRjYWxsKHBjaV9kcml2ZXJfaW5pdCk7CiAKK0VYUE9SVF9TWU1CT0wocGNpX21hdGNoX2lkKTsKIEVYUE9SVF9TWU1CT0wocGNpX21hdGNoX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9yZWdpc3Rlcl9kcml2ZXIpOwogRVhQT1JUX1NZTUJPTChwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBmMDRiOWZmLi4xYjM0ZmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAgKiAtRUlPIGlmIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFBDSSBQTS4KICAqIDAgaWYgd2UgY2FuIHN1Y2Nlc3NmdWxseSBjaGFuZ2UgdGhlIHBvd2VyIHN0YXRlLgogICovCi0KK2ludCAoKnBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBjaV9wb3dlcl90IHQpOwogaW50CiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBjaV9wb3dlcl90IHN0YXRlKQogewpAQCAtMjk5LDExICsyOTksMjAgQEAKIAkJbXNsZWVwKDEwKTsKIAllbHNlIGlmIChzdGF0ZSA9PSBQQ0lfRDIgfHwgZGV2LT5jdXJyZW50X3N0YXRlID09IFBDSV9EMikKIAkJdWRlbGF5KDIwMCk7Ci0JZGV2LT5jdXJyZW50X3N0YXRlID0gc3RhdGU7CiAKKwkvKgorCSAqIEdpdmUgZmlybXdhcmUgYSBjaGFuY2UgdG8gYmUgY2FsbGVkLCBzdWNoIGFzIEFDUEkgX1BSeCwgX1BTeAorCSAqIEZpcm13YXJlIG1ldGhvZCBhZnRlciBuYXRpY2UgbWV0aG9kID8KKwkgKi8KKwlpZiAocGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZSkKKwkJcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIHN0YXRlKTsKKworCWRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOwogCXJldHVybiAwOwogfQogCitpbnQgKCpwbGF0Zm9ybV9wY2lfY2hvb3NlX3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworIAogLyoqCiAgKiBwY2lfY2hvb3NlX3N0YXRlIC0gQ2hvb3NlIHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKICAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gYmUgc3VzcGVuZGVkCkBAIC0zMTYsMTAgKzMyNSwxNyBAQAogCiBwY2lfcG93ZXJfdCBwY2lfY2hvb3NlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKKwlpbnQgcmV0OworCiAJaWYgKCFwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QTSkpCiAJCXJldHVybiBQQ0lfRDA7CiAKLQlzd2l0Y2ggKHN0YXRlKSB7CisJaWYgKHBsYXRmb3JtX3BjaV9jaG9vc2Vfc3RhdGUpIHsKKwkJcmV0ID0gcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJc3RhdGUgPSByZXQ7CisJfQorIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSAwOiByZXR1cm4gUENJX0QwOwogCWNhc2UgMzogcmV0dXJuIFBDSV9EM2hvdDsKIAlkZWZhdWx0OgpAQCAtMzM0LDEwICszNTAsNiBAQAogLyoqCiAgKiBwY2lfc2F2ZV9zdGF0ZSAtIHNhdmUgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIG9mIGEgZGV2aWNlIGJlZm9yZSBzdXNwZW5kaW5nCiAgKiBAZGV2OiAtIFBDSSBkZXZpY2UgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgKLSAqIEBidWZmZXI6IC0gYnVmZmVyIHRvIGhvbGQgY29uZmlnIHNwYWNlIGNvbnRleHQKLSAqCi0gKiBAYnVmZmVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZSBQQ0kgMi4yIGNvbmZpZyBzcGFjZSAKLSAqICg+PSA2NCBieXRlcykuCiAgKi8KIGludAogcGNpX3NhdmVfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldikKQEAgLTM1Miw4ICszNjQsNiBAQAogLyoqIAogICogcGNpX3Jlc3RvcmVfc3RhdGUgLSBSZXN0b3JlIHRoZSBzYXZlZCBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKICAqIEBkZXY6IC0gUENJIGRldmljZSB0aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aAotICogQGJ1ZmZlcjogLSBzYXZlZCBQQ0kgY29uZmlnIHNwYWNlCi0gKgogICovCiBpbnQgCiBwY2lfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCA3NDRkYTBkLi5kOTRkN2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMTEsNiArMTEsMTAgQEAKIAkJCQkgIHZvaWQgKCphbGlnbmYpKHZvaWQgKiwgc3RydWN0IHJlc291cmNlICosCiAJCQkJCSAgCSB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSwKIAkJCQkgIHZvaWQgKmFsaWduZl9kYXRhKTsKKy8qIEZpcm13YXJlIGNhbGxiYWNrcyAqLworZXh0ZXJuIGludCAoKnBsYXRmb3JtX3BjaV9jaG9vc2Vfc3RhdGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitleHRlcm4gaW50ICgqcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpOworCiAvKiBQQ0kgL3Byb2MgZnVuY3Rpb25zICovCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIGV4dGVybiBpbnQgcGNpX3Byb2NfYXR0YWNoX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKaW5kZXggNTM3YjM3Mi4uYTYzYmQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKQEAgLTI3LDYgKzI3LDExIEBACiAKICNkZWZpbmUgZ2V0X2Rlc2NyaXB0b3JfaWQodHlwZSwgc2VydmljZSkgKCgodHlwZSAtIDQpIDw8IDQpIHwgc2VydmljZSkKIAorc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0IHsKKwlpbnQgaW50ZXJydXB0X21vZGU7CS8qIFswOklOVHggfCAxOk1TSSB8IDI6TVNJLVhdICovCisJdW5zaWduZWQgaW50IHNhdmVkX21zaV9jb25maWdfc3BhY2VbNV07Cit9OworCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHBjaWVfcG9ydF9idXNfdHlwZTsKIGV4dGVybiBpbnQgcGNpZV9wb3J0X2RldmljZV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgcGNpZV9wb3J0X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCmluZGV4IGY1YzVmMTAuLjM5M2UwY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwpAQCAtMjc1LDEwICsyNzUsMTcgQEAKIAogaW50IHBjaWVfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKKwlzdHJ1Y3QgcGNpZV9wb3J0X2RldmljZV9leHQgKnBfZXh0OwogCWludCBzdGF0dXMsIHR5cGUsIGNhcGFiaWxpdGllcywgaXJxX21vZGUsIGk7CiAJaW50IHZlY3RvcnNbUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFU107CiAJdTE2IHJlZzE2OwogCisJLyogQWxsb2NhdGUgcG9ydCBkZXZpY2UgZXh0ZW5zaW9uICovCisJaWYgKCEocF9leHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpZV9wb3J0X2RldmljZV9leHQpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJcGNpX3NldF9kcnZkYXRhKGRldiwgcF9leHQpOworCiAJLyogR2V0IHBvcnQgdHlwZSAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwKIAkJcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKSArCkBAIC0yODgsNiArMjk1LDcgQEAKIAkvKiBOb3cgZ2V0IHBvcnQgc2VydmljZXMgKi8KIAljYXBhYmlsaXRpZXMgPSBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eShkZXYpOwogCWlycV9tb2RlID0gYXNzaWduX2ludGVycnVwdF9tb2RlKGRldiwgdmVjdG9ycywgY2FwYWJpbGl0aWVzKTsKKwlwX2V4dC0+aW50ZXJydXB0X21vZGUgPSBpcnFfbW9kZTsKIAogCS8qIEFsbG9jYXRlIGNoaWxkIHNlcnZpY2VzIGlmIGFueSAqLwogCWZvciAoaSA9IDA7IGkgPCBQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTOyBpKyspIHsKQEAgLTMxNyw3ICszMjUsNyBAQAogc3RhdGljIGludCBzdXNwZW5kX2l0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKnNlcnZpY2VfZHJpdmVyOwotCXUzMiBzdGF0ZSA9ICh1MzIpZGF0YTsKKwlwbV9tZXNzYWdlX3Qgc3RhdGUgPSAqIChwbV9tZXNzYWdlX3QgKikgZGF0YTsKIAogIAlpZiAoKGRldi0+YnVzID09ICZwY2llX3BvcnRfYnVzX3R5cGUpICYmCiAgCSAgICAoZGV2LT5kcml2ZXIpKSB7CkBAIC0zMjgsOSArMzM2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MzIgc3RhdGUpCitpbnQgcGNpZV9wb3J0X2RldmljZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmRldi0+ZGV2LCAodm9pZCAqKXN0YXRlLCBzdXNwZW5kX2l0ZXIpOworCWRldmljZV9mb3JfZWFjaF9jaGlsZCgmZGV2LT5kZXYsICZzdGF0ZSwgc3VzcGVuZF9pdGVyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCmluZGV4IGU5MDk1ZWUuLjMwYmFjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKQEAgLTI5LDYgKzI5LDc4IEBACiAvKiBnbG9iYWwgZGF0YSAqLwogc3RhdGljIGNvbnN0IGNoYXIgZGV2aWNlX25hbWVbXSA9ICJwY2llcG9ydC1kcml2ZXIiOwogCitzdGF0aWMgdm9pZCBwY2lfc2F2ZV9tc2lfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpZV9wb3J0X2RldmljZV9leHQgKnBfZXh0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJaW50IGkgPSAwLCBwb3M7CisJdTE2IGNvbnRyb2w7CisKKyAgIAlpZiAoKHBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX01TSSkpIDw9IDApCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcywgJnBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10pOworCWNvbnRyb2wgPSBwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVswXSA+PiAxNjsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0FERFJFU1NfTE8sCisJCSZwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwlpZiAoY29udHJvbCAmIFBDSV9NU0lfRkxBR1NfNjRCSVQpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9BRERSRVNTX0hJLAorCQkJJnBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10pOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0RBVEFfNjQsCisJCQkmcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJfSBlbHNlCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfREFUQV8zMiwKKwkJCSZwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwlpZiAoY29udHJvbCAmIFBDSV9NU0lfRkxBR1NfTUFTS0JJVCkKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9NQVNLX0JJVCwKKwkJCSZwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKK30KKworc3RhdGljIHZvaWQgcGNpX3Jlc3RvcmVfbXNpX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0ICpwX2V4dCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpID0gMCwgcG9zOworCXUxNiBjb250cm9sOworCisgICAJaWYgKChwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9NU0kpKSA8PSAwKQorCQlyZXR1cm47CisKKwljb250cm9sID0gcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSA+PiAxNjsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0ZMQUdTLCBjb250cm9sKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9BRERSRVNTX0xPLAorCQlwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwlpZiAoY29udHJvbCAmIFBDSV9NU0lfRkxBR1NfNjRCSVQpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfQUREUkVTU19ISSwKKwkJCXBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10pOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9EQVRBXzY0LAorCQkJcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJfSBlbHNlCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0RBVEFfMzIsCisJCQlwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwlpZiAoY29udHJvbCAmIFBDSV9NU0lfRkxBR1NfTUFTS0JJVCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfTUFTS19CSVQsCisJCQlwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKK30KKworc3RhdGljIHZvaWQgcGNpZV9wb3J0ZHJ2X3NhdmVfY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0ICpwX2V4dCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJcGNpX3NhdmVfc3RhdGUoZGV2KTsKKwlpZiAocF9leHQtPmludGVycnVwdF9tb2RlID09IFBDSUVfUE9SVF9NU0lfTU9ERSkKKwkJcGNpX3NhdmVfbXNpX3N0YXRlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2llX3BvcnRfZGV2aWNlX2V4dCAqcF9leHQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CisJaWYgKHBfZXh0LT5pbnRlcnJ1cHRfbW9kZSA9PSBQQ0lFX1BPUlRfTVNJX01PREUpCisJCXBjaV9yZXN0b3JlX21zaV9zdGF0ZShkZXYpOworCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKK30KKwogLyoKICAqIHBjaWVfcG9ydGRydl9wcm9iZSAtIFByb2JlIFBDSS1FeHByZXNzIHBvcnQgZGV2aWNlcwogICogQGRldjogUENJLUV4cHJlc3MgcG9ydCBkZXZpY2UgYmVpbmcgcHJvYmVkCkBAIC02NCwxNiArMTM2LDIxIEBACiBzdGF0aWMgdm9pZCBwY2llX3BvcnRkcnZfcmVtb3ZlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXBjaWVfcG9ydF9kZXZpY2VfcmVtb3ZlKGRldik7CisJa2ZyZWUocGNpX2dldF9kcnZkYXRhKGRldikpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChkZXYsIHN0YXRlKTsKKwlpbnQgcmV0ID0gcGNpZV9wb3J0X2RldmljZV9zdXNwZW5kKGRldiwgc3RhdGUpOworCisJcGNpZV9wb3J0ZHJ2X3NhdmVfY29uZmlnKGRldik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBwY2llX3BvcnRkcnZfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeworCXBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhkZXYpOwogCXJldHVybiBwY2llX3BvcnRfZGV2aWNlX3Jlc3VtZShkZXYpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCA2YTBhODJmLi5kZjNiZGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTIzOSw5ICsyMzksOCBAQAogCiAJaWYgKGRldi0+dHJhbnNwYXJlbnQpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBUcmFuc3BhcmVudCBicmlkZ2UgLSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7Ci0JCWZvcihpID0gMDsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKQotCQkJY2hpbGQtPnJlc291cmNlW2ldID0gY2hpbGQtPnBhcmVudC0+cmVzb3VyY2VbaV07Ci0JCXJldHVybjsKKwkJZm9yKGkgPSAzOyBpIDwgUENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspCisJCQljaGlsZC0+cmVzb3VyY2VbaV0gPSBjaGlsZC0+cGFyZW50LT5yZXNvdXJjZVtpIC0gM107CiAJfQogCiAJZm9yKGk9MDsgaTwzOyBpKyspCkBAIC0zOTgsNiArMzk3LDE2IEBACiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcnBjYXAgKyBQQ0lfRVhQX1JUQ1RMLCBycGN0bCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfcGFyZW50X3N1Ym9yZGluYXRlX2J1c25yKHN0cnVjdCBwY2lfYnVzICpjaGlsZCwgaW50IG1heCkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50ID0gY2hpbGQtPnBhcmVudDsKKwl3aGlsZSAocGFyZW50LT5wYXJlbnQgJiYgcGFyZW50LT5zdWJvcmRpbmF0ZSA8IG1heCkgeworCQlwYXJlbnQtPnN1Ym9yZGluYXRlID0gbWF4OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGFyZW50LT5zZWxmLCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBtYXgpOworCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwl9Cit9CisKIHVuc2lnbmVkIGludCBfX2RldmluaXQgcGNpX3NjYW5fY2hpbGRfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKgpAQCAtNDk5LDcgKzUwOCwxMyBAQAogCiAJCWlmICghaXNfY2FyZGJ1cykgewogCQkJY2hpbGQtPmJyaWRnZV9jdGwgPSBQQ0lfQlJJREdFX0NUTF9OT19JU0E7Ci0KKwkJCS8qCisJCQkgKiBBZGp1c3Qgc3Vib3JkaW5hdGUgYnVzbnIgaW4gcGFyZW50IGJ1c2VzLgorCQkJICogV2UgZG8gdGhpcyBiZWZvcmUgc2Nhbm5pbmcgZm9yIGNoaWxkcmVuIGJlY2F1c2UKKwkJCSAqIHNvbWUgZGV2aWNlcyBtYXkgbm90IGJlIGRldGVjdGVkIGlmIHRoZSBiaW9zCisJCQkgKiB3YXMgbGF6eS4KKwkJCSAqLworCQkJcGNpX2ZpeHVwX3BhcmVudF9zdWJvcmRpbmF0ZV9idXNucihjaGlsZCwgbWF4KTsKIAkJCS8qIE5vdyB3ZSBjYW4gc2NhbiBhbGwgc3Vib3JkaW5hdGUgYnVzZXMuLi4gKi8KIAkJCW1heCA9IHBjaV9zY2FuX2NoaWxkX2J1cyhjaGlsZCk7CiAJCX0gZWxzZSB7CkBAIC01MTMsNiArNTI4LDcgQEAKIAkJCQkJCQltYXgraSsxKSkKIAkJCQkJYnJlYWs7CiAJCQltYXggKz0gaTsKKwkJCXBjaV9maXh1cF9wYXJlbnRfc3Vib3JkaW5hdGVfYnVzbnIoY2hpbGQsIG1heCk7CiAJCX0KIAkJLyoKIAkJICogU2V0IHRoZSBzdWJvcmRpbmF0ZSBidXMgbnVtYmVyIHRvIGl0cyByZWFsIHZhbHVlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCA5NjgwMzNmLi4xNTIxZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYworKysgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwpAQCAtNzY3LDYgKzc2Nyw3IEBACiAJaWYgKHVubGlrZWx5KGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FTVVNURUspKSB7CiAJCWlmIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1X0hCKQogCQkJc3dpdGNoKGRldi0+c3Vic3lzdGVtX2RldmljZSkgeworCQkJY2FzZSAweDgwMjU6IC8qIFA0Qi1MWCAqLwogCQkJY2FzZSAweDgwNzA6IC8qIFA0QiAqLwogCQkJY2FzZSAweDgwODg6IC8qIFA0QjUzMyAqLwogCQkJY2FzZSAweDE2MjY6IC8qIEwzQyBub3RlYm9vayAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2VhcmNoLmMgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwppbmRleCBhOTBhNTMzLi4wNWZhOTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZWFyY2guYworKysgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwpAQCAtMzc5LDYgKzM3OSw3IEBACiBFWFBPUlRfU1lNQk9MKHBjaV9kZXZfcHJlc2VudCk7CiAKIEVYUE9SVF9TWU1CT0wocGNpX2ZpbmRfYnVzKTsKK0VYUE9SVF9TWU1CT0wocGNpX2ZpbmRfbmV4dF9idXMpOwogRVhQT1JUX1NZTUJPTChwY2lfZmluZF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChwY2lfZmluZF9kZXZpY2VfcmV2ZXJzZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX3Nsb3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCA2YjYyOGRlLi45ZmU0OGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNzQsNiArNzQsNyBAQAogCQlpZHggPSByZXMgLSAmbGlzdC0+ZGV2LT5yZXNvdXJjZVswXTsKIAkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UobGlzdC0+ZGV2LCBpZHgpKSB7CiAJCQlyZXMtPnN0YXJ0ID0gMDsKKwkJCXJlcy0+ZW5kID0gMDsKIAkJCXJlcy0+ZmxhZ3MgPSAwOwogCQl9CiAJCXRtcCA9IGxpc3Q7CkBAIC0yNzMsNiArMjc0LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBQQ0lfQlVTX05VTV9SRVNPVVJDRVM7IGkrKykgewogCQlyID0gYnVzLT5yZXNvdXJjZVtpXTsKKwkJaWYgKHIgPT0gJmlvcG9ydF9yZXNvdXJjZSB8fCByID09ICZpb21lbV9yZXNvdXJjZSkKKwkJCWNvbnRpbnVlOwogCQlpZiAociAmJiAoci0+ZmxhZ3MgJiB0eXBlX21hc2spID09IHR5cGUgJiYgIXItPnBhcmVudCkKIAkJCXJldHVybiByOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcgYi9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCmluZGV4IDUyZWEzNDUuLjY0ODVmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKKysrIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwpAQCAtMSw4ICsxLDUgQEAKICMKLSMgUENNQ0lBIGJ1cyBzdWJzeXN0ZW0gY29uZmlndXJhdGlvbgotIwotIyBSaWdodCBub3cgdGhlIG5vbi1DYXJkQnVzIGNob2ljZXMgYXJlIG5vdCBzdXBwb3J0ZWQKLSMgYnkgdGhlIGludGVncmF0ZWQga2VybmVsIGRyaXZlci4KKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgYnVzIHN1YnN5c3RlbSBjb25maWd1cmF0aW9uCiAjCiAKIG1lbnUgIlBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQiCkBAIC0zMiw3ICsyOSw3IEBACiAKIAkgIFRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlOgogCSAgICBwY21jaWFfY29yZS5wY19kZWJ1Zz1OCi0JICAgIGRzLnBjX2RlYnVnPU4KKwkgICAgcGNtY2lhLnBjX2RlYnVnPU4KIAkgICAgc2ExMXh4X2NvcmUucGNfZGVidWc9TgogCiAJICBUaGUgbW9kdWxlIG9wdGlvbiBpcyBjYWxsZWQgcGNfZGVidWc9TgpAQCAtNzMsNyArNzAsNyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogY29uZmlnIFBDTUNJQV9JT0NUTAotCWJvb2wKKwlib29sICJQQ01DSUEgY29udHJvbCBpb2N0bCAob2Jzb2xldGUpIgogCWRlcGVuZHMgb24gUENNQ0lBCiAJZGVmYXVsdCB5CiAJaGVscApAQCAtODEsOSArNzgsOCBAQAogCSAgc3Vic3lzdGVtIHdpbGwgYmUgYnVpbHQuIEl0IGlzIG5lZWRlZCBieSBjYXJkbWdyIGFuZCBjYXJkY3RsCiAJICAocGNtY2lhLWNzKSB0byBmdW5jdGlvbiBwcm9wZXJseS4KIAotCSAgSWYgeW91IGRvIG5vdCB1c2UgdGhlIG5ldyBwY21jaWF1dGlscyBwYWNrYWdlLCBhbmQgaGF2ZSBhCi0JICB5ZW50YSwgQ2lycnVzIFBENjcyOSwgaTgyMDkyLCBpODIzNjUgb3IgdGNpYyBjb21wYXRpYmxlIGJyaWRnZSwKLQkgIHlvdSBuZWVkIHRvIHNheSBZIGhlcmUgdG8gYmUgYWJsZSB0byB1c2UgMTYtYml0IFBDTUNJQSBjYXJkcy4KKwkgIFlvdSBzaG91bGQgdXNlIHRoZSBuZXcgcGNtY2lhdXRpbHMgcGFja2FnZSBpbnN0ZWFkIChzZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4gZm9yIGxvY2F0aW9uIGFuZCBkZXRhaWxzKS4KIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIApAQCAtMTA2LDcgKzEwMiw4IEBACiAKIGNvbmZpZyBZRU5UQQogCXRyaXN0YXRlICJDYXJkQnVzIHllbnRhLWNvbXBhdGlibGUgYnJpZGdlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVJEQlVTCisJZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgQ0FSREJVUyBpZiAhRU1CRURERUQKIAlzZWxlY3QgUENDQVJEX05PTlNUQVRJQwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgQ2FyZEJ1cyBob3N0IGJyaWRnZXMuICBWaXJ0dWFsbHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmggYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5oCmluZGV4IDQxN2JjMTUuLmQ1MTIyYjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgX19BU01fQVUxMDAwX1BDTUNJQV9ICiAKIC8qIGluY2x1ZGUgdGhlIHdvcmxkICovCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9wYjF4MDAuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9wYjF4MDAuYwppbmRleCBkZjE5Y2UxLi5kNDE0YTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfcGIxeDAwLmMKKysrIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX3BiMXgwMC5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3h4czE1MDAuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF94eHMxNTAwLmMKaW5kZXggMWRmYzc3Ni4uZjExM2I2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3h4czE1MDAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfeHhzMTUwMC5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jIGIvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jCmluZGV4IDNjY2I1MjQuLjFkNzU1ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jYXJkYnVzLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBJTl9DQVJEX1NFUlZJQ0VTCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzLmMgYi9kcml2ZXJzL3BjbWNpYS9jcy5jCmluZGV4IGU4Mjg1OWQuLmUzOTE3OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY3MuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2RlZmluZSBJTl9DQVJEX1NFUlZJQ0VTCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KQEAgLTIxNiw2ICsyMTUsMTMgQEAKIAlsaXN0X2FkZF90YWlsKCZzb2NrZXQtPnNvY2tldF9saXN0LCAmcGNtY2lhX3NvY2tldF9saXN0KTsKIAl1cF93cml0ZSgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKIAorI2lmbmRlZiBDT05GSUdfQ0FSREJVUworCS8qCisJICogSWYgd2UgZG8gbm90IHN1cHBvcnQgQ2FyZGJ1cywgZW5zdXJlIHRoYXQKKwkgKiB0aGUgQ2FyZGJ1cyBzb2NrZXQgY2FwYWJpbGl0eSBpcyBkaXNhYmxlZC4KKwkgKi8KKwlzb2NrZXQtPmZlYXR1cmVzICY9IH5TU19DQVBfQ0FSREJVUzsKKyNlbmRpZgogCiAJLyogc2V0IHByb3BlciB2YWx1ZXMgaW4gc29ja2V0LT5kZXYgKi8KIAlzb2NrZXQtPmRldi5jbGFzc19kYXRhID0gc29ja2V0OwpAQCAtNDQ5LDExICs0NTUsMTEgQEAKIAl9CiAKIAlpZiAoc3RhdHVzICYgU1NfQ0FSREJVUykgeworCQlpZiAoIShza3QtPmZlYXR1cmVzICYgU1NfQ0FQX0NBUkRCVVMpKSB7CisJCQljc19lcnIoc2t0LCAiY2FyZGJ1cyBjYXJkcyBhcmUgbm90IHN1cHBvcnRlZC5cbiIpOworCQkJcmV0dXJuIENTX0JBRF9UWVBFOworCQl9CiAJCXNrdC0+c3RhdGUgfD0gU09DS0VUX0NBUkRCVVM7Ci0jaWZuZGVmIENPTkZJR19DQVJEQlVTCi0JCWNzX2Vycihza3QsICJjYXJkYnVzIGNhcmRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuIik7Ci0JCXJldHVybiBDU19CQURfVFlQRTsKLSNlbmRpZgogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaAppbmRleCAwYjRjMThlLi42YmJmYmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKQEAgLTk5LDIzICs5OSwxMSBAQAogCX0KIH0KIAotI2RlZmluZSBDSEVDS19IQU5ETEUoaCkgXAotICAgICgoKGgpID09IE5VTEwpIHx8ICgoaCktPmNsaWVudF9tYWdpYyAhPSBDTElFTlRfTUFHSUMpKQotCiAjZGVmaW5lIENIRUNLX1NPQ0tFVChzKSBcCiAgICAgKCgocykgPj0gc29ja2V0cykgfHwgKHNvY2tldF90YWJsZVtzXS0+b3BzID09IE5VTEwpKQogCi0jZGVmaW5lIFNPQ0tFVChoKSAoaC0+U29ja2V0KQotI2RlZmluZSBDT05GSUcoaCkgKCZTT0NLRVQoaCktPmNvbmZpZ1soaCktPkZ1bmN0aW9uXSkKLQotI2RlZmluZSBDSEVDS19SRUdJT04ocikgXAotICAgICgoKHIpID09IE5VTEwpIHx8ICgociktPnJlZ2lvbl9tYWdpYyAhPSBSRUdJT05fTUFHSUMpKQotCi0jZGVmaW5lIENIRUNLX0VSQVNFUShxKSBcCi0gICAgKCgocSkgPT0gTlVMTCkgfHwgKChxKS0+ZXJhc2VxX21hZ2ljICE9IEVSQVNFUV9NQUdJQykpCi0KLSNkZWZpbmUgRVZFTlQoaCwgZSwgcCkgXAotICAgICgoaCktPmV2ZW50X2hhbmRsZXIoKGUpLCAocCksICYoaCktPmV2ZW50X2NhbGxiYWNrX2FyZ3MpKQorI2RlZmluZSBTT0NLRVQoaCkgKGgtPnNvY2tldCkKKyNkZWZpbmUgQ09ORklHKGgpICgmU09DS0VUKGgpLT5jb25maWdbKGgpLT5mdW5jXSkKIAogLyogSW4gY2FyZGJ1cy5jICovCiBpbnQgY2JfYWxsb2Moc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvZHMuYyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKaW5kZXggZDVhZmQ1NS4uM2UzYzZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZHMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCkBAIC0xNTgsMTcgKzE1OCwxNSBAQAogfTsKIAogCi1zdGF0aWMgaW50IHBjbWNpYV9yZXBvcnRfZXJyb3IoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgZXJyb3JfaW5mb190ICplcnIpCitzdGF0aWMgaW50IHBjbWNpYV9yZXBvcnRfZXJyb3Ioc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBlcnJvcl9pbmZvX3QgKmVycikKIHsKIAlpbnQgaTsKIAljaGFyICpzZXJ2OwogCi0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQorCWlmICghcF9kZXYpCiAJCXByaW50ayhLRVJOX05PVElDRSk7Ci0JZWxzZSB7Ci0JCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IGhhbmRsZV90b19wZGV2KGhhbmRsZSk7CisJZWxzZQogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiLCBwX2Rldi0+ZGV2LmJ1c19pZCk7Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2VydmljZV90YWJsZSk7IGkrKykKIAkJaWYgKHNlcnZpY2VfdGFibGVbaV0ua2V5ID09IGVyci0+ZnVuYykKQEAgLTE5MywxMCArMTkxLDEwIEBACiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLXZvaWQgY3NfZXJyb3IoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW50IGZ1bmMsIGludCByZXQpCit2b2lkIGNzX2Vycm9yKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaW50IGZ1bmMsIGludCByZXQpCiB7CiAJZXJyb3JfaW5mb190IGVyciA9IHsgZnVuYywgcmV0IH07Ci0JcGNtY2lhX3JlcG9ydF9lcnJvcihoYW5kbGUsICZlcnIpOworCXBjbWNpYV9yZXBvcnRfZXJyb3IocF9kZXYsICZlcnIpOwogfQogRVhQT1JUX1NZTUJPTChjc19lcnJvcik7CiAKQEAgLTIwNyw2ICsyMDUsMTAgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgaGFzaDsKIAorCWlmICghcF9kcnYtPmF0dGFjaCB8fCAhcF9kcnYtPmV2ZW50IHx8ICFwX2Rydi0+ZGV0YWNoKQorCQlwcmludGsoS0VSTl9ERUJVRyAicGNtY2lhOiAlcyBkb2VzIG1pc3NlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIiwKKwkJICAgICAgIHBfZHJ2LT5kcnYubmFtZSk7CisKIAl3aGlsZSAoZGlkICYmIGRpZC0+bWF0Y2hfZmxhZ3MpIHsKIAkJZm9yIChpPTA7IGk8NDsgaSsrKSB7CiAJCQlpZiAoIWRpZC0+cHJvZF9pZFtpXSkKQEAgLTM3Niw3ICszNzgsNyBAQAogCiAJaWYgKHBfZHJ2LT5hdHRhY2gpIHsKIAkJcF9kZXYtPmluc3RhbmNlID0gcF9kcnYtPmF0dGFjaCgpOwotCQlpZiAoKCFwX2Rldi0+aW5zdGFuY2UpIHx8IChwX2Rldi0+Y2xpZW50LnN0YXRlICYgQ0xJRU5UX1VOQk9VTkQpKSB7CisJCWlmICgoIXBfZGV2LT5pbnN0YW5jZSkgfHwgKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9VTkJPVU5EKSkgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJkczogdW5hYmxlIHRvIGNyZWF0ZSBpbnN0YW5jZSAiCiAJCQkgICAgICAgIm9mICclcychXG4iLCBwX2Rydi0+ZHJ2Lm5hbWUpOwogCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTUxNiwxMCArNTE4LDcgQEAKIAlzcHJpbnRmIChwX2Rldi0+ZGV2LmJ1c19pZCwgIiVkLiVkIiwgcF9kZXYtPnNvY2tldC0+c29jaywgcF9kZXYtPmRldmljZV9ubyk7CiAKIAkvKiBjb21wYXQgKi8KLQlwX2Rldi0+Y2xpZW50LmNsaWVudF9tYWdpYyA9IENMSUVOVF9NQUdJQzsKLQlwX2Rldi0+Y2xpZW50LlNvY2tldCA9IHM7Ci0JcF9kZXYtPmNsaWVudC5GdW5jdGlvbiA9IGZ1bmN0aW9uOwotCXBfZGV2LT5jbGllbnQuc3RhdGUgPSBDTElFTlRfVU5CT1VORDsKKwlwX2Rldi0+c3RhdGUgPSBDTElFTlRfVU5CT1VORDsKIAogCS8qIEFkZCB0byB0aGUgbGlzdCBpbiBwY21jaWFfYnVzX3NvY2tldCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwpAQCAtNTczLDggKzU3Miw2IEBACiAJZWxzZQogCQlub19mdW5jcyA9IDE7CiAKLQkvKiB0aGlzIGRvZXNuJ3QgaGFuZGxlIG11bHRpZnVuY3Rpb24gZGV2aWNlcyBvbiBvbmUgcGNtY2lhIGZ1bmN0aW9uCi0JICogeWV0LiAqLwogCWZvciAoaT0wOyBpIDwgbm9fZnVuY3M7IGkrKykKIAkJcGNtY2lhX2RldmljZV9hZGQocywgaSk7CiAKQEAgLTkxNCw2ICs5MTEsNyBAQAogc3RhdGljIGludCBzZW5kX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqIF9kYXRhKQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKwlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnY7CiAJc3RydWN0IHNlbmRfZXZlbnRfZGF0YSAqZGF0YSA9IF9kYXRhOwogCiAJLyogd2UgZ2V0IGNhbGxlZCBmb3IgYWxsIHNvY2tldHMsIGJ1dCBtYXkgb25seSBwYXNzIHRoZSBldmVudApAQCAtOTIxLDExICs5MTksMTYgQEAKIAlpZiAocF9kZXYtPnNvY2tldCAhPSBkYXRhLT5za3QpCiAJCXJldHVybiAwOwogCi0JaWYgKHBfZGV2LT5jbGllbnQuc3RhdGUgJiAoQ0xJRU5UX1VOQk9VTkR8Q0xJRU5UX1NUQUxFKSkKKwlwX2RydiA9IHRvX3BjbWNpYV9kcnYocF9kZXYtPmRldi5kcml2ZXIpOworCWlmICghcF9kcnYpCiAJCXJldHVybiAwOwogCi0JaWYgKHBfZGV2LT5jbGllbnQuRXZlbnRNYXNrICYgZGF0YS0+ZXZlbnQpCi0JCXJldHVybiBFVkVOVCgmcF9kZXYtPmNsaWVudCwgZGF0YS0+ZXZlbnQsIGRhdGEtPnByaW9yaXR5KTsKKwlpZiAocF9kZXYtPnN0YXRlICYgKENMSUVOVF9VTkJPVU5EfENMSUVOVF9TVEFMRSkpCisJCXJldHVybiAwOworCisJaWYgKHBfZHJ2LT5ldmVudCkKKwkJcmV0dXJuIHBfZHJ2LT5ldmVudChkYXRhLT5ldmVudCwgZGF0YS0+cHJpb3JpdHksCisJCQkJICAgICZwX2Rldi0+ZXZlbnRfY2FsbGJhY2tfYXJncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk4NywxMSArOTkwLDExIEBACiAKIAogCi1pbnQgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudChjbGllbnRfaGFuZGxlX3QgKmhhbmRsZSwgY2xpZW50X3JlZ190ICpyZXEpCitpbnQgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqKmhhbmRsZSwgY2xpZW50X3JlZ190ICpyZXEpCiB7Ci0JY2xpZW50X3QgKmNsaWVudCA9IE5VTEw7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBOVUxMOwogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IE5VTEw7CisJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2ID0gTlVMTDsKIAogCS8qIExvb2sgZm9yIHVuYm91bmQgY2xpZW50IHdpdGggbWF0Y2hpbmcgZGV2X2luZm8gKi8KIAlkb3duX3JlYWQoJnBjbWNpYV9zb2NrZXRfbGlzdF9yd3NlbSk7CkBAIC0xMDA2LDE4ICsxMDA5LDE2IEBACiAJCQljb250aW51ZTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkocF9kZXYsICZzLT5kZXZpY2VzX2xpc3QsIHNvY2tldF9kZXZpY2VfbGlzdCkgewotCQkJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2OwogCQkJcF9kZXYgPSBwY21jaWFfZ2V0X2RldihwX2Rldik7CiAJCQlpZiAoIXBfZGV2KQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKCEocF9kZXYtPmNsaWVudC5zdGF0ZSAmIENMSUVOVF9VTkJPVU5EKSB8fAorCQkJaWYgKCEocF9kZXYtPnN0YXRlICYgQ0xJRU5UX1VOQk9VTkQpIHx8CiAJCQkgICAgKCFwX2Rldi0+ZGV2LmRyaXZlcikpIHsKIAkJCQlwY21jaWFfcHV0X2RldihwX2Rldik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlwX2RydiA9IHRvX3BjbWNpYV9kcnYocF9kZXYtPmRldi5kcml2ZXIpOwogCQkJaWYgKCFzdHJuY21wKHBfZHJ2LT5kcnYubmFtZSwgKGNoYXIgKilyZXEtPmRldl9pbmZvLCBERVZfTkFNRV9MRU4pKSB7Ci0JCQkJY2xpZW50ID0gJnBfZGV2LT5jbGllbnQ7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKIAkJCQlnb3RvIGZvdW5kOwogCQkJfQpAQCAtMTAyOCwyNiArMTAyOSwyMCBAQAogCX0KICBmb3VuZDoKIAl1cF9yZWFkKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwotCWlmICghcF9kZXYgfHwgIWNsaWVudCkKKwlpZiAoIXBfZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBjbWNpYV9wdXRfc29ja2V0KHMpOyAvKiBzYWZlLCBhcyB3ZSBhbHJlYWR5IGhvbGQgYSByZWZlcmVuY2UgZnJvbSBiaW5kX2RldmljZSAqLwogCi0JKmhhbmRsZSA9IGNsaWVudDsKLQljbGllbnQtPnN0YXRlICY9IH5DTElFTlRfVU5CT1VORDsKLQljbGllbnQtPlNvY2tldCA9IHM7Ci0JY2xpZW50LT5FdmVudE1hc2sgPSByZXEtPkV2ZW50TWFzazsKLQljbGllbnQtPmV2ZW50X2hhbmRsZXIgPSByZXEtPmV2ZW50X2hhbmRsZXI7Ci0JY2xpZW50LT5ldmVudF9jYWxsYmFja19hcmdzID0gcmVxLT5ldmVudF9jYWxsYmFja19hcmdzOwotCWNsaWVudC0+ZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfaGFuZGxlID0gY2xpZW50OworCSpoYW5kbGUgPSBwX2RldjsKKwlwX2Rldi0+c3RhdGUgJj0gfkNMSUVOVF9VTkJPVU5EOworCXBfZGV2LT5ldmVudF9jYWxsYmFja19hcmdzID0gcmVxLT5ldmVudF9jYWxsYmFja19hcmdzOworCXBfZGV2LT5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9oYW5kbGUgPSBwX2RldjsKIAotCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKQotCQljbGllbnQtPnN0YXRlIHw9IENMSUVOVF9DQVJEQlVTOwogCi0JaWYgKCghKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKSAmJiAocy0+ZnVuY3Rpb25zID09IDApICYmCi0JICAgIChjbGllbnQtPkZ1bmN0aW9uICE9IEJJTkRfRk5fQUxMKSkgeworCWlmICghcy0+ZnVuY3Rpb25zKSB7CiAJCWNpc3RwbF9sb25nbGlua19tZmNfdCBtZmM7Ci0JCWlmIChwY2NhcmRfcmVhZF90dXBsZShzLCBjbGllbnQtPkZ1bmN0aW9uLCBDSVNUUExfTE9OR0xJTktfTUZDLCAmbWZjKQorCQlpZiAocGNjYXJkX3JlYWRfdHVwbGUocywgcF9kZXYtPmZ1bmMsIENJU1RQTF9MT05HTElOS19NRkMsICZtZmMpCiAJCSAgICA9PSBDU19TVUNDRVNTKQogCQkJcy0+ZnVuY3Rpb25zID0gbWZjLm5mbjsKIAkJZWxzZQpAQCAtMTA2MCwxMyArMTA1NSwxMyBAQAogCX0KIAogCWRzX2RiZygxLCAicmVnaXN0ZXJfY2xpZW50KCk6IGNsaWVudCAweCVwLCBkZXYgJXNcbiIsCi0JICAgICAgIGNsaWVudCwgcF9kZXYtPmRldi5idXNfaWQpOwotCWlmIChjbGllbnQtPkV2ZW50TWFzayAmIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURSkKLQkJRVZFTlQoY2xpZW50LCBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEUsIENTX0VWRU5UX1BSSV9MT1cpOworCSAgICAgICBwX2RldiwgcF9kZXYtPmRldi5idXNfaWQpOwogCiAJaWYgKChzLT5zdGF0ZSAmIChTT0NLRVRfUFJFU0VOVHxTT0NLRVRfQ0FSREJVUykpID09IFNPQ0tFVF9QUkVTRU5UKSB7Ci0JCWlmIChjbGllbnQtPkV2ZW50TWFzayAmIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OKQotCQkJRVZFTlQoY2xpZW50LCBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiwgQ1NfRVZFTlRfUFJJX0xPVyk7CisJCWlmIChwX2Rydi0+ZXZlbnQpCisJCQlwX2Rydi0+ZXZlbnQoQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04sIENTX0VWRU5UX1BSSV9MT1csCisJCQkJICAgICAmcF9kZXYtPmV2ZW50X2NhbGxiYWNrX2FyZ3MpOworCiAJfQogCiAJcmV0dXJuIENTX1NVQ0NFU1M7CkBAIC0xMDk5LDcgKzEwOTQsNyBAQAogCQl9CiAJCXBfZGV2ID0gbGlzdF9lbnRyeSgoJnMtPmRldmljZXNfbGlzdCktPm5leHQsIHN0cnVjdCBwY21jaWFfZGV2aWNlLCBzb2NrZXRfZGV2aWNlX2xpc3QpOwogCQlsaXN0X2RlbCgmcF9kZXYtPnNvY2tldF9kZXZpY2VfbGlzdCk7Ci0JCXBfZGV2LT5jbGllbnQuc3RhdGUgfD0gQ0xJRU5UX1NUQUxFOworCQlwX2Rldi0+c3RhdGUgfD0gQ0xJRU5UX1NUQUxFOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJCWRldmljZV91bnJlZ2lzdGVyKCZwX2Rldi0+ZGV2KTsKQEAgLTExMDgsMzEgKzExMDMsMjUgQEAKIAlyZXR1cm4gMDsKIH0gLyogdW5iaW5kX3JlcXVlc3QgKi8KIAotaW50IHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChjbGllbnRfaGFuZGxlX3QgaGFuZGxlKQoraW50IHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CiAJaW50IGk7Ci0Jc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gaGFuZGxlX3RvX3BkZXYoaGFuZGxlKTsKIAotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7CisJcyA9IHBfZGV2LT5zb2NrZXQ7CisJZHNfZGJnKDEsICJkZXJlZ2lzdGVyX2NsaWVudCglcClcbiIsIHBfZGV2KTsKIAotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlkc19kYmcoMSwgImRlcmVnaXN0ZXJfY2xpZW50KCVwKVxuIiwgaGFuZGxlKTsKLQotCWlmIChoYW5kbGUtPnN0YXRlICYgKENMSUVOVF9JUlFfUkVRfENMSUVOVF9JT19SRVF8Q0xJRU5UX0NPTkZJR19MT0NLRUQpKQorCWlmIChwX2Rldi0+c3RhdGUgJiAoQ0xJRU5UX0lSUV9SRVF8Q0xJRU5UX0lPX1JFUXxDTElFTlRfQ09ORklHX0xPQ0tFRCkpCiAJCWdvdG8gd2Fybl9vdXQ7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9XSU47IGkrKykKLQkJaWYgKGhhbmRsZS0+c3RhdGUgJiBDTElFTlRfV0lOX1JFUShpKSkKKwkJaWYgKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9XSU5fUkVRKGkpKQogCQkJZ290byB3YXJuX291dDsKIAotCWlmIChoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSB7Ci0JCWhhbmRsZS0+Y2xpZW50X21hZ2ljID0gMDsKLQkJaGFuZGxlLT5zdGF0ZSAmPSB+Q0xJRU5UX1NUQUxFOworCWlmIChwX2Rldi0+c3RhdGUgJiBDTElFTlRfU1RBTEUpIHsKKwkJcF9kZXYtPnN0YXRlICY9IH5DTElFTlRfU1RBTEU7CiAJCXBjbWNpYV9wdXRfZGV2KHBfZGV2KTsKIAl9IGVsc2UgewotCQloYW5kbGUtPnN0YXRlID0gQ0xJRU5UX1VOQk9VTkQ7Ci0JCWhhbmRsZS0+ZXZlbnRfaGFuZGxlciA9IE5VTEw7CisJCXBfZGV2LT5zdGF0ZSA9IENMSUVOVF9VTkJPVU5EOwogCX0KIAogCXJldHVybiBDU19TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvaGQ2NDQ2NV9zcy5jIGIvZHJpdmVycy9wY21jaWEvaGQ2NDQ2NV9zcy5jCmluZGV4IDVhYjU1YWUuLjMxNmY4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2hkNjQ0NjVfc3MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9oZDY0NDY1X3NzLmMKQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxhc20vaGQ2NDQ2NS9oZDY0NDY1Lmg+CiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjUvaW8uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvaTgyMzY1LmMgYi9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYwppbmRleCBkNzJmOWEzLi5hNzEzMDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYworKysgYi9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYwpAQCAtNTMsNyArNTMsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CkBAIC02OTgsMTQgKzY5Nyw2IEBACiAgICAgc3RydWN0IGk4MjM2NV9zb2NrZXQgKnQgPSAmc29ja2V0W3NvY2tldHMtbnNdOwogCiAgICAgYmFzZSA9IHNvY2tldHMtbnM7Ci0gICAgaWYgKHQtPmlvYWRkciA+IDApIHsKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKHQtPmlvYWRkciwgMiwgImk4MjM2NSIpKSB7Ci0JICAgIHByaW50ayhLRVJOX0VSUiAiaTgyMzY1OiBJTyByZWdpb24gY29uZmxpY3QgYXQgJSNseCwgbm90IGF2YWlsYWJsZVxuIiwKLQkJCXQtPmlvYWRkcik7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotICAgIAogICAgIGlmIChiYXNlID09IDApIHByaW50aygiXG4iKTsKICAgICBwcmludGsoS0VSTl9JTkZPICIgICVzIiwgcGNpY1t0eXBlXS5uYW1lKTsKICAgICBwcmludGsoIiBJU0EtdG8tUENNQ0lBIGF0IHBvcnQgJSNseCBvZnMgMHglMDJ4IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jCmluZGV4IGIxMTExYzYuLjY1ZjNlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMKKysrIGIvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jIGIvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYwppbmRleCBjMDk5N2M0Li43YjE0ZDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9jb21wYXQuYyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9jb21wYXQuYwppbmRleCAxY2M4MzMxLi5lYmIxNjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfY29tcGF0LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2NvbXBhdC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjZGVmaW5lIElOX0NBUkRfU0VSVklDRVMKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9idWxrbWVtLmg+CkBAIC0yOCw2NCArMjcsMzkgQEAKIAogI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCiAKLWludCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlKQoraW50IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCB0dXBsZV90ICp0dXBsZSkKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlyZXR1cm4gcGNjYXJkX2dldF9maXJzdF90dXBsZShzLCBoYW5kbGUtPkZ1bmN0aW9uLCB0dXBsZSk7CisJcmV0dXJuIHBjY2FyZF9nZXRfZmlyc3RfdHVwbGUocF9kZXYtPnNvY2tldCwgcF9kZXYtPmZ1bmMsIHR1cGxlKTsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9maXJzdF90dXBsZSk7CiAKLWludCBwY21jaWFfZ2V0X25leHRfdHVwbGUoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgdHVwbGVfdCAqdHVwbGUpCitpbnQgcGNtY2lhX2dldF9uZXh0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgdHVwbGVfdCAqdHVwbGUpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlzID0gU09DS0VUKGhhbmRsZSk7Ci0JcmV0dXJuIHBjY2FyZF9nZXRfbmV4dF90dXBsZShzLCBoYW5kbGUtPkZ1bmN0aW9uLCB0dXBsZSk7CisJcmV0dXJuIHBjY2FyZF9nZXRfbmV4dF90dXBsZShwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywgdHVwbGUpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X25leHRfdHVwbGUpOwogCi1pbnQgcGNtY2lhX2dldF90dXBsZV9kYXRhKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlKQoraW50IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIHR1cGxlX3QgKnR1cGxlKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOwotCXJldHVybiBwY2NhcmRfZ2V0X3R1cGxlX2RhdGEocywgdHVwbGUpOworCXJldHVybiBwY2NhcmRfZ2V0X3R1cGxlX2RhdGEocF9kZXYtPnNvY2tldCwgdHVwbGUpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X3R1cGxlX2RhdGEpOwogCi1pbnQgcGNtY2lhX3BhcnNlX3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKK2ludCBwY21jaWFfcGFyc2VfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCB0dXBsZV90ICp0dXBsZSwgY2lzcGFyc2VfdCAqcGFyc2UpCiB7CiAJcmV0dXJuIHBjY2FyZF9wYXJzZV90dXBsZSh0dXBsZSwgcGFyc2UpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfcGFyc2VfdHVwbGUpOwogCi1pbnQgcGNtY2lhX3ZhbGlkYXRlX2NpcyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBjaXNpbmZvX3QgKmluZm8pCitpbnQgcGNtY2lhX3ZhbGlkYXRlX2NpcyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNpc2luZm9fdCAqaW5mbykKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlyZXR1cm4gcGNjYXJkX3ZhbGlkYXRlX2NpcyhzLCBoYW5kbGUtPkZ1bmN0aW9uLCBpbmZvKTsKKwlyZXR1cm4gcGNjYXJkX3ZhbGlkYXRlX2NpcyhwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywgaW5mbyk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV92YWxpZGF0ZV9jaXMpOwogCiAKLWludCBwY21jaWFfcmVzZXRfY2FyZChjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBjbGllbnRfcmVxX3QgKnJlcSkKK2ludCBwY21jaWFfcmVzZXRfY2FyZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNsaWVudF9yZXFfdCAqcmVxKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpza3Q7Ci0gICAgCi0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlza3QgPSBTT0NLRVQoaGFuZGxlKTsKLQlpZiAoIXNrdCkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0KLQlyZXR1cm4gcGNjYXJkX3Jlc2V0X2NhcmQoc2t0KTsKKwlyZXR1cm4gcGNjYXJkX3Jlc2V0X2NhcmQocF9kZXYtPnNvY2tldCk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXNldF9jYXJkKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYwppbmRleCBiODgzYmMxLi4zOWJhNjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYworKysgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjZGVmaW5lIElOX0NBUkRfU0VSVklDRVMKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTcxLDI5ICs3MCw2IEBACiAjZGVmaW5lIGRzX2RiZyhsdmwsIGZtdCwgYXJnLi4uKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IGNoYXIgKnJlbGVhc2UgPSAiTGludXggS2VybmVsIENhcmQgU2VydmljZXMiOwotCi0vKiogcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8KLSAqCi0gKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB2ZXJzaW9uIG9mIENhcmQgU2VydmljZXMKLSAqLwotc3RhdGljIGludCBwY21jaWFfZ2V0X2NhcmRfc2VydmljZXNfaW5mbyhzZXJ2aW5mb190ICppbmZvKQotewotCXVuc2lnbmVkIGludCBzb2NrZXRfY291bnQgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLQlpbmZvLT5TaWduYXR1cmVbMF0gPSAnQyc7Ci0JaW5mby0+U2lnbmF0dXJlWzFdID0gJ1MnOwotCWRvd25fcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnBjbWNpYV9zb2NrZXRfbGlzdCkKLQkJc29ja2V0X2NvdW50Kys7Ci0JdXBfcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKLQlpbmZvLT5Db3VudCA9IHNvY2tldF9jb3VudDsKLQlpbmZvLT5SZXZpc2lvbiA9IENTX1JFTEVBU0VfQ09ERTsKLQlpbmZvLT5DU0xldmVsID0gMHgwMjEwOwotCWluZm8tPlZlbmRvclN0cmluZyA9IChjaGFyICopcmVsZWFzZTsKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogZ2V0X2NhcmRfc2VydmljZXNfaW5mbyAqLwotCiAKIC8qIGJhY2t3YXJkcy1jb21wYXRpYmxlIGFjY2Vzc2luZyBvZiBkcml2ZXIgLS0tIGJ5IG5hbWUhICovCiAKQEAgLTU5MSw5ICs1NjcsNiBAQAogICAgIGNhc2UgRFNfQURKVVNUX1JFU09VUkNFX0lORk86CiAJcmV0ID0gcGNtY2lhX2FkanVzdF9yZXNvdXJjZV9pbmZvKCZidWYtPmFkanVzdCk7CiAJYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfQ0FSRF9TRVJWSUNFU19JTkZPOgotCXJldCA9IHBjbWNpYV9nZXRfY2FyZF9zZXJ2aWNlc19pbmZvKCZidWYtPnNlcnZpbmZvKTsKLQlicmVhazsKICAgICBjYXNlIERTX0dFVF9DT05GSUdVUkFUSU9OX0lORk86CiAJaWYgKGJ1Zi0+Y29uZmlnLkZ1bmN0aW9uICYmCiAJICAgKGJ1Zi0+Y29uZmlnLkZ1bmN0aW9uID49IHMtPmZ1bmN0aW9ucykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jCmluZGV4IGMwMWRjNmIuLjE4NGY0ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNkZWZpbmUgSU5fQ0FSRF9TRVJWSUNFUwotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CkBAIC0yMDIsMTQgKzIwMSwxMSBAQAogCXJldHVybiBDU19TVUNDRVNTOwogfSAvKiBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIgKi8KIAotaW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLAoraW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCiAJCQkJCSBjb25mX3JlZ190ICpyZWcpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlzID0gU09DS0VUKGhhbmRsZSk7Ci0JcmV0dXJuIHBjY2FyZF9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzLCBoYW5kbGUtPkZ1bmN0aW9uLCByZWcpOworCXJldHVybiBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIocF9kZXYtPnNvY2tldCwKKwkJCQkJCSAgICBwX2Rldi0+ZnVuYywgcmVnKTsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKTsKIApAQCAtMjcxLDE3ICsyNjcsMTEgQEAKIAlyZXR1cm4gQ1NfU1VDQ0VTUzsKIH0gLyogcGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8gKi8KIAotaW50IHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsCitpbnQgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAogCQkJCSAgY29uZmlnX2luZm9fdCAqY29uZmlnKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCi0JaWYgKChDSEVDS19IQU5ETEUoaGFuZGxlKSkgfHwgIWNvbmZpZykKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOwotCWlmICghcykKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcmV0dXJuIHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHMsIGhhbmRsZS0+RnVuY3Rpb24sIGNvbmZpZyk7CisJcmV0dXJuIHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLAorCQkJCQkgICAgIGNvbmZpZyk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKTsKIApAQCAtMzgyLDEwICszNzIsOCBAQAogaW50IHBjbWNpYV9nZXRfc3RhdHVzKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNzX3N0YXR1c190ICpzdGF0dXMpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKIAlzID0gU09DS0VUKGhhbmRsZSk7Ci0JcmV0dXJuIHBjY2FyZF9nZXRfc3RhdHVzKHMsIGhhbmRsZS0+RnVuY3Rpb24sIHN0YXR1cyk7CisJcmV0dXJuIHBjY2FyZF9nZXRfc3RhdHVzKHMsIGhhbmRsZS0+ZnVuYywgc3RhdHVzKTsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9zdGF0dXMpOwogCkBAIC00MjYsMTYgKzQxNCwxNCBAQAogICoKICAqIE1vZGlmeSBhIGxvY2tlZCBzb2NrZXQgY29uZmlndXJhdGlvbgogICovCi1pbnQgcGNtY2lhX21vZGlmeV9jb25maWd1cmF0aW9uKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsCitpbnQgcGNtY2lhX21vZGlmeV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKIAkJCQltb2Rjb25mX3QgKm1vZCkKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKIAljb25maWdfdCAqYzsKIAotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOwotCWMgPSBDT05GSUcoaGFuZGxlKTsKKwlzID0gcF9kZXYtPnNvY2tldDsKKwljID0gQ09ORklHKHBfZGV2KTsKIAlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKIAkJcmV0dXJuIENTX05PX0NBUkQ7CiAJaWYgKCEoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKSkKQEAgLTQ3MiwyNSArNDU4LDE4IEBACiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9tb2RpZnlfY29uZmlndXJhdGlvbik7CiAKIAotaW50IHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24oY2xpZW50X2hhbmRsZV90IGhhbmRsZSkKK2ludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKIHsKIAlwY2NhcmRfaW9fbWFwIGlvID0geyAwLCAwLCAwLCAwLCAxIH07Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OwogCWludCBpOwogCi0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpIHx8Ci0JICAgICEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DT05GSUdfTE9DS0VEKSkKKwlpZiAoIShwX2Rldi0+c3RhdGUgJiBDTElFTlRfQ09ORklHX0xPQ0tFRCkpCiAJCXJldHVybiBDU19CQURfSEFORExFOwotCWhhbmRsZS0+c3RhdGUgJj0gfkNMSUVOVF9DT05GSUdfTE9DS0VEOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKKwlwX2Rldi0+c3RhdGUgJj0gfkNMSUVOVF9DT05GSUdfTE9DS0VEOwogCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLQlpZiAoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DQVJEQlVTKQotCQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLSNlbmRpZgotCi0JaWYgKCEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9TVEFMRSkpIHsKLQkJY29uZmlnX3QgKmMgPSBDT05GSUcoaGFuZGxlKTsKKwlpZiAoIShwX2Rldi0+c3RhdGUgJiBDTElFTlRfU1RBTEUpKSB7CisJCWNvbmZpZ190ICpjID0gQ09ORklHKHBfZGV2KTsKIAkJaWYgKC0tKHMtPmxvY2tfY291bnQpID09IDApIHsKIAkJCXMtPnNvY2tldC5mbGFncyA9IFNTX09VVFBVVF9FTkE7ICAgLyogSXMgdGhpcyBjb3JyZWN0PyAqLwogCQkJcy0+c29ja2V0LlZwcCA9IDA7CkBAIC01MjMsMjIgKzUwMiwxNiBAQAogICogZG9uJ3QgYm90aGVyIGNoZWNraW5nIHRoZSBwb3J0IHJhbmdlcyBhZ2FpbnN0IHRoZSBjdXJyZW50IHNvY2tldAogICogdmFsdWVzLgogICovCi1pbnQgcGNtY2lhX3JlbGVhc2VfaW8oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW9fcmVxX3QgKnJlcSkKK2ludCBwY21jaWFfcmVsZWFzZV9pbyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGlvX3JlcV90ICpyZXEpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OwogCi0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpIHx8ICEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9JT19SRVEpKQorCWlmICghKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9JT19SRVEpKQogCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQloYW5kbGUtPnN0YXRlICY9IH5DTElFTlRfSU9fUkVROwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKKwlwX2Rldi0+c3RhdGUgJj0gfkNMSUVOVF9JT19SRVE7CiAKLSNpZmRlZiBDT05GSUdfQ0FSREJVUwotCWlmIChoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX0NBUkRCVVMpCi0JCXJldHVybiBDU19TVUNDRVNTOwotI2VuZGlmCi0KLQlpZiAoIShoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSkgewotCQljb25maWdfdCAqYyA9IENPTkZJRyhoYW5kbGUpOworCWlmICghKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9TVEFMRSkpIHsKKwkJY29uZmlnX3QgKmMgPSBDT05GSUcocF9kZXYpOwogCQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQogCQkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOwogCQlpZiAoKGMtPmlvLkJhc2VQb3J0MSAhPSByZXEtPkJhc2VQb3J0MSkgfHwKQEAgLTU1OCwxNiArNTMxLDE1IEBACiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWxlYXNlX2lvKTsKIAogCi1pbnQgcGNtY2lhX3JlbGVhc2VfaXJxKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlycV9yZXFfdCAqcmVxKQoraW50IHBjbWNpYV9yZWxlYXNlX2lycShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGlycV9yZXFfdCAqcmVxKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSB8fCAhKGhhbmRsZS0+c3RhdGUgJiBDTElFTlRfSVJRX1JFUSkpCisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OworCWlmICghKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9JUlFfUkVRKSkKIAkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JaGFuZGxlLT5zdGF0ZSAmPSB+Q0xJRU5UX0lSUV9SRVE7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOworCXBfZGV2LT5zdGF0ZSAmPSB+Q0xJRU5UX0lSUV9SRVE7CiAKLQlpZiAoIShoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSkgewotCQljb25maWdfdCAqYyA9IENPTkZJRyhoYW5kbGUpOworCWlmICghKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9TVEFMRSkpIHsKKwkJY29uZmlnX3QgKmMgPSBDT05GSUcocF9kZXYpOwogCQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQogCQkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOwogCQlpZiAoYy0+aXJxLkF0dHJpYnV0ZXMgIT0gcmVxLT5BdHRyaWJ1dGVzKQpAQCAtNjIzLDI5ICs1OTUsMjEgQEAKIEVYUE9SVF9TWU1CT0wocGNtY2lhX3JlbGVhc2Vfd2luZG93KTsKIAogCi1pbnQgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLAoraW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAogCQkJCSBjb25maWdfcmVxX3QgKnJlcSkKIHsKIAlpbnQgaTsKIAl1X2ludCBiYXNlOwotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcF9kZXYtPnNvY2tldDsKIAljb25maWdfdCAqYzsKIAlwY2NhcmRfaW9fbWFwIGlvbWFwOwogCi0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlzID0gU09DS0VUKGhhbmRsZSk7CiAJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCiAJCXJldHVybiBDU19OT19DQVJEOwogCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLQlpZiAoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DQVJEQlVTKQotCQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfTU9ERTsKLSNlbmRpZgotCiAJaWYgKHJlcS0+SW50VHlwZSAmIElOVF9DQVJEQlVTKQogCQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfTU9ERTsKLQljID0gQ09ORklHKGhhbmRsZSk7CisJYyA9IENPTkZJRyhwX2Rldik7CiAJaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkKIAkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOwogCkBAIC03NDYsNyArNzEwLDcgQEAKIAl9CiAKIAljLT5zdGF0ZSB8PSBDT05GSUdfTE9DS0VEOwotCWhhbmRsZS0+c3RhdGUgfD0gQ0xJRU5UX0NPTkZJR19MT0NLRUQ7CisJcF9kZXYtPnN0YXRlIHw9IENMSUVOVF9DT05GSUdfTE9DS0VEOwogCXJldHVybiBDU19TVUNDRVNTOwogfSAvKiBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uICovCiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24pOwpAQCAtNzU3LDI5ICs3MjEsMTcgQEAKICAqIFJlcXVlc3RfaW8oKSByZXNlcnZlcyByYW5nZXMgb2YgcG9ydCBhZGRyZXNzZXMgZm9yIGEgc29ja2V0LgogICogSSBoYXZlIG5vdCBpbXBsZW1lbnRlZCByYW5nZSBzaGFyaW5nIG9yIGFsaWFzIGFkZHJlc3NpbmcuCiAgKi8KLWludCBwY21jaWFfcmVxdWVzdF9pbyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpb19yZXFfdCAqcmVxKQoraW50IHBjbWNpYV9yZXF1ZXN0X2lvKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaW9fcmVxX3QgKnJlcSkKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHBfZGV2LT5zb2NrZXQ7CiAJY29uZmlnX3QgKmM7CiAKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKIAlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKIAkJcmV0dXJuIENTX05PX0NBUkQ7CiAKLQlpZiAoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DQVJEQlVTKSB7Ci0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLQkJaGFuZGxlLT5zdGF0ZSB8PSBDTElFTlRfSU9fUkVROwotCQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLSNlbHNlCi0JCXJldHVybiBDU19VTlNVUFBPUlRFRF9GVU5DVElPTjsKLSNlbmRpZgotCX0KLQogCWlmICghcmVxKQogCQlyZXR1cm4gQ1NfVU5TVVBQT1JURURfTU9ERTsKLQljID0gQ09ORklHKGhhbmRsZSk7CisJYyA9IENPTkZJRyhwX2Rldik7CiAJaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkKIAkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOwogCWlmIChjLT5zdGF0ZSAmIENPTkZJR19JT19SRVEpCkBAIC04MDQsNyArNzU2LDcgQEAKIAogCWMtPmlvID0gKnJlcTsKIAljLT5zdGF0ZSB8PSBDT05GSUdfSU9fUkVROwotCWhhbmRsZS0+c3RhdGUgfD0gQ0xJRU5UX0lPX1JFUTsKKwlwX2Rldi0+c3RhdGUgfD0gQ0xJRU5UX0lPX1JFUTsKIAlyZXR1cm4gQ1NfU1VDQ0VTUzsKIH0gLyogcGNtY2lhX3JlcXVlc3RfaW8gKi8KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3JlcXVlc3RfaW8pOwpAQCAtODI3LDE5ICs3NzksMTUgQEAKIH0KICNlbmRpZgogCi1pbnQgcGNtY2lhX3JlcXVlc3RfaXJxKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlycV9yZXFfdCAqcmVxKQoraW50IHBjbWNpYV9yZXF1ZXN0X2lycShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGlycV9yZXFfdCAqcmVxKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcF9kZXYtPnNvY2tldDsKIAljb25maWdfdCAqYzsKIAlpbnQgcmV0ID0gQ1NfSU5fVVNFLCBpcnEgPSAwOwotCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IGhhbmRsZV90b19wZGV2KGhhbmRsZSk7CiAKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKIAlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKIAkJcmV0dXJuIENTX05PX0NBUkQ7Ci0JYyA9IENPTkZJRyhoYW5kbGUpOworCWMgPSBDT05GSUcocF9kZXYpOwogCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCiAJCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKIAlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSVJRX1JFUSkKQEAgLTkwMyw3ICs4NTEsNyBAQAogCXMtPmlycS5Db25maWcrKzsKIAogCWMtPnN0YXRlIHw9IENPTkZJR19JUlFfUkVROwotCWhhbmRsZS0+c3RhdGUgfD0gQ0xJRU5UX0lSUV9SRVE7CisJcF9kZXYtPnN0YXRlIHw9IENMSUVOVF9JUlFfUkVROwogCiAjaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQogCXBjbWNpYV91c2VkX2lycVtpcnFdKys7CkBAIC05MTksMTYgKzg2NywxMyBAQAogICogUmVxdWVzdF93aW5kb3coKSBlc3RhYmxpc2hlcyBhIG1hcHBpbmcgYmV0d2VlbiBjYXJkIG1lbW9yeSBzcGFjZQogICogYW5kIHN5c3RlbSBtZW1vcnkgc3BhY2UuCiAgKi8KLWludCBwY21jaWFfcmVxdWVzdF93aW5kb3coY2xpZW50X2hhbmRsZV90ICpoYW5kbGUsIHdpbl9yZXFfdCAqcmVxLCB3aW5kb3dfaGFuZGxlX3QgKndoKQoraW50IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqKnBfZGV2LCB3aW5fcmVxX3QgKnJlcSwgd2luZG93X2hhbmRsZV90ICp3aCkKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9ICgqcF9kZXYpLT5zb2NrZXQ7CiAJd2luZG93X3QgKndpbjsKIAl1X2xvbmcgYWxpZ247CiAJaW50IHc7CiAKLQlpZiAoQ0hFQ0tfSEFORExFKCpoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlzID0gKCpoYW5kbGUpLT5Tb2NrZXQ7CiAJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCiAJCXJldHVybiBDU19OT19DQVJEOwogCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiAoV0lOX1BBR0VEIHwgV0lOX1NIQVJFRCkpCkBAIC05NTcsNyArOTAyLDcgQEAKIAl3aW4gPSAmcy0+d2luW3ddOwogCXdpbi0+bWFnaWMgPSBXSU5ET1dfTUFHSUM7CiAJd2luLT5pbmRleCA9IHc7Ci0Jd2luLT5oYW5kbGUgPSAqaGFuZGxlOworCXdpbi0+aGFuZGxlID0gKnBfZGV2OwogCXdpbi0+c29jayA9IHM7CiAKIAlpZiAoIShzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSkgewpAQCAtOTY2LDcgKzkxMSw3IEBACiAJCWlmICghd2luLT5jdGwucmVzKQogCQkJcmV0dXJuIENTX0lOX1VTRTsKIAl9Ci0JKCpoYW5kbGUpLT5zdGF0ZSB8PSBDTElFTlRfV0lOX1JFUSh3KTsKKwkoKnBfZGV2KS0+c3RhdGUgfD0gQ0xJRU5UX1dJTl9SRVEodyk7CiAKIAkvKiBDb25maWd1cmUgdGhlIHNvY2tldCBjb250cm9sbGVyICovCiAJd2luLT5jdGwubWFwID0gdysxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTEwMF9nZW5lcmljLmMKaW5kZXggZjFiYjc5MS4uZTk4YmIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMDBfZ2VuZXJpYy5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uaCBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uaAppbmRleCA3MDBhMTU1Li42ZjE0MTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmgKKysrIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5oCkBAIC0xMSw3ICsxMSw2IEBACiAKIC8qIGluY2x1ZGUgdGhlIHdvcmxkICovCiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYyBiL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCmluZGV4IGZjZWY1NGMuLjEwNDBhNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjZGVmaW5lIElOX0NBUkRfU0VSVklDRVMKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvdGNpYy5jIGIvZHJpdmVycy9wY21jaWEvdGNpYy5jCmluZGV4IGFhY2JiYjUuLmQ1YTYxZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3RjaWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS90Y2ljLmMKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvdGkxMTN4LmggYi9kcml2ZXJzL3BjbWNpYS90aTExM3guaAppbmRleCBjN2JhOTk4Li5mYmUyMzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS90aTExM3guaAorKysgYi9kcml2ZXJzL3BjbWNpYS90aTExM3guaApAQCAtMTU0LDggKzE1NCw2IEBACiAjZGVmaW5lIEVORV9URVNUX0M5CQkJMHhjOQkvKiA4Yml0ICovCiAjZGVmaW5lIEVORV9URVNUX0M5X1RMVEVOQUJMRQkJMHgwMgogCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLQogLyoKICAqIFRleGFzIEluc3RydW1lbnRzIENhcmRCdXMgY29udHJvbGxlciBvdmVycmlkZXMuCiAgKi8KQEAgLTg0Myw3ICs4NDEsNSBAQAogCXJldHVybiB0aTEyeHhfb3ZlcnJpZGUoc29ja2V0KTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19DQVJEQlVTICovCi0KICNlbmRpZiAvKiBfTElOVVhfVEkxMTNYX0ggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwppbmRleCAwMmIyM2FiLi42ODM3NDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgpAQCAtNTI4LDY0ICs1MjcsMjkgQEAKICAqIFVzZSBhbiBhZGFwdGl2ZSBhbGxvY2F0aW9uIGZvciB0aGUgbWVtb3J5IHJlc291cmNlLAogICogc29tZXRpbWVzIHRoZSBtZW1vcnkgYmVoaW5kIHBjaSBicmlkZ2VzIGlzIGxpbWl0ZWQ6CiAgKiAxLzggb2YgdGhlIHNpemUgb2YgdGhlIGlvIHdpbmRvdyBvZiB0aGUgcGFyZW50LgotICogbWF4IDQgTUIsIG1pbiAxNiBrQi4KKyAqIG1heCA0IE1CLCBtaW4gMTYga0IuIFdlIHRyeSB2ZXJ5IGhhcmQgdG8gbm90IGdldCBiZWxvdworICogdGhlICJBQ0MiIHZhbHVlcywgdGhvdWdoLgogICovCiAjZGVmaW5lIEJSSURHRV9NRU1fTUFYIDQqMTAyNCoxMDI0CisjZGVmaW5lIEJSSURHRV9NRU1fQUNDIDEyOCoxMDI0CiAjZGVmaW5lIEJSSURHRV9NRU1fTUlOIDE2KjEwMjQKIAotI2RlZmluZSBCUklER0VfSU9fTUFYIDI1NgorI2RlZmluZSBCUklER0VfSU9fTUFYIDUxMgorI2RlZmluZSBCUklER0VfSU9fQUNDIDI1NgogI2RlZmluZSBCUklER0VfSU9fTUlOIDMyCiAKICNpZm5kZWYgUENJQklPU19NSU5fQ0FSREJVU19JTwogI2RlZmluZSBQQ0lCSU9TX01JTl9DQVJEQlVTX0lPIFBDSUJJT1NfTUlOX0lPCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgeWVudGFfYWxsb2NhdGVfcmVzKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgaW50IG5yLCB1bnNpZ25lZCB0eXBlKQorc3RhdGljIGludCB5ZW50YV9zZWFyY2hfb25lX3JlcyhzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJCXUzMiBtaW4pCiB7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsICpyZXM7Ci0JdTMyIHN0YXJ0LCBlbmQ7Ci0JdTMyIGFsaWduLCBzaXplLCBtaW47Ci0JdW5zaWduZWQgb2Zmc2V0OwotCXVuc2lnbmVkIG1hc2s7CisJdTMyIGFsaWduLCBzaXplLCBzdGFydCwgZW5kOwogCi0JcmVzID0gc29ja2V0LT5kZXYtPnJlc291cmNlICsgUENJX0JSSURHRV9SRVNPVVJDRVMgKyBucjsKLQkvKiBBbHJlYWR5IGFsbG9jYXRlZD8gKi8KLQlpZiAocmVzLT5wYXJlbnQpCi0JCXJldHVybiAwOwotCi0JLyogVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBtZW1vcnkgbGltaXQgaXMgNGtCLCBvbiBJTyBpdCdzIDQgYnl0ZXMgKi8KLQltYXNrID0gfjB4ZmZmOwotCWlmICh0eXBlICYgSU9SRVNPVVJDRV9JTykKLQkJbWFzayA9IH4zOwotCi0Jb2Zmc2V0ID0gMHgxYyArIDgqbnI7Ci0JYnVzID0gc29ja2V0LT5kZXYtPnN1Ym9yZGluYXRlOwotCXJlcy0+bmFtZSA9IGJ1cy0+bmFtZTsKLQlyZXMtPmZsYWdzID0gdHlwZTsKLQlyZXMtPnN0YXJ0ID0gMDsKLQlyZXMtPmVuZCA9IDA7Ci0Jcm9vdCA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShzb2NrZXQtPmRldiwgcmVzKTsKLQotCWlmICghcm9vdCkKLQkJcmV0dXJuOwotCi0Jc3RhcnQgPSBjb25maWdfcmVhZGwoc29ja2V0LCBvZmZzZXQpICYgbWFzazsKLQllbmQgPSBjb25maWdfcmVhZGwoc29ja2V0LCBvZmZzZXQrNCkgfCB+bWFzazsKLQlpZiAoc3RhcnQgJiYgZW5kID4gc3RhcnQgJiYgIW92ZXJyaWRlX2Jpb3MpIHsKLQkJcmVzLT5zdGFydCA9IHN0YXJ0OwotCQlyZXMtPmVuZCA9IGVuZDsKLQkJaWYgKHJlcXVlc3RfcmVzb3VyY2Uocm9vdCwgcmVzKSA9PSAwKQotCQkJcmV0dXJuOwotCQlwcmludGsoS0VSTl9JTkZPICJ5ZW50YSAlczogUHJlYXNzaWduZWQgcmVzb3VyY2UgJWQgYnVzeSwgcmVjb25maWd1cmluZy4uLlxuIiwKLQkJCQlwY2lfbmFtZShzb2NrZXQtPmRldiksIG5yKTsKLQkJcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gMDsKLQl9Ci0KLQlpZiAodHlwZSAmIElPUkVTT1VSQ0VfSU8pIHsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKIAkJYWxpZ24gPSAxMDI0OwogCQlzaXplID0gQlJJREdFX0lPX01BWDsKLQkJbWluID0gQlJJREdFX0lPX01JTjsKIAkJc3RhcnQgPSBQQ0lCSU9TX01JTl9DQVJEQlVTX0lPOwogCQllbmQgPSB+MFU7CiAJfSBlbHNlIHsKQEAgLTYwMCwyNiArNTY0LDEwNyBAQAogCQkJCWkrKzsKIAkJCXNpemUgPSAxIDw8IGk7CiAJCX0KLQkJaWYgKHNpemUgPCBCUklER0VfTUVNX01JTikKLQkJCXNpemUgPSBCUklER0VfTUVNX01JTjsKLQkJbWluID0gQlJJREdFX01FTV9NSU47CisJCWlmIChzaXplIDwgbWluKQorCQkJc2l6ZSA9IG1pbjsKIAkJYWxpZ24gPSBzaXplOwogCQlzdGFydCA9IFBDSUJJT1NfTUlOX01FTTsKIAkJZW5kID0gfjBVOwogCX0KLQkKKwogCWRvIHsKLQkJaWYgKGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2l6ZSwgc3RhcnQsIGVuZCwgYWxpZ24sIE5VTEwsIE5VTEwpPT0wKSB7Ci0JCQljb25maWdfd3JpdGVsKHNvY2tldCwgb2Zmc2V0LCByZXMtPnN0YXJ0KTsKLQkJCWNvbmZpZ193cml0ZWwoc29ja2V0LCBvZmZzZXQrNCwgcmVzLT5lbmQpOwotCQkJcmV0dXJuOworCQlpZiAoYWxsb2NhdGVfcmVzb3VyY2Uocm9vdCwgcmVzLCBzaXplLCBzdGFydCwgZW5kLCBhbGlnbiwKKwkJCQkgICAgICBOVUxMLCBOVUxMKT09MCkgeworCQkJcmV0dXJuIDE7CiAJCX0KIAkJc2l6ZSA9IHNpemUvMjsKIAkJYWxpZ24gPSBzaXplOwogCX0gd2hpbGUgKHNpemUgPj0gbWluKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgeWVudGFfc2VhcmNoX3JlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJICAgIHUzMiBtaW4pCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8UENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICogcm9vdCA9IHNvY2tldC0+ZGV2LT5idXMtPnJlc291cmNlW2ldOworCQlpZiAoIXJvb3QpCisJCQljb250aW51ZTsKKworCQlpZiAoKHJlcy0+ZmxhZ3MgXiByb290LT5mbGFncykgJgorCQkgICAgKElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfUFJFRkVUQ0gpKQorCQkJY29udGludWU7IC8qIFdyb25nIHR5cGUgKi8KKworCQlpZiAoeWVudGFfc2VhcmNoX29uZV9yZXMocm9vdCwgcmVzLCBtaW4pKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5ZW50YV9hbGxvY2F0ZV9yZXMoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCBpbnQgbnIsIHVuc2lnbmVkIHR5cGUsIGludCBhZGRyX3N0YXJ0LCBpbnQgYWRkcl9lbmQpCit7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsICpyZXM7CisJdTMyIHN0YXJ0LCBlbmQ7CisJdW5zaWduZWQgbWFzazsKKworCXJlcyA9IHNvY2tldC0+ZGV2LT5yZXNvdXJjZSArIFBDSV9CUklER0VfUkVTT1VSQ0VTICsgbnI7CisJLyogQWxyZWFkeSBhbGxvY2F0ZWQ/ICovCisJaWYgKHJlcy0+cGFyZW50KQorCQlyZXR1cm47CisKKwkvKiBUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIG1lbW9yeSBsaW1pdCBpcyA0a0IsIG9uIElPIGl0J3MgNCBieXRlcyAqLworCW1hc2sgPSB+MHhmZmY7CisJaWYgKHR5cGUgJiBJT1JFU09VUkNFX0lPKQorCQltYXNrID0gfjM7CisKKwlidXMgPSBzb2NrZXQtPmRldi0+c3Vib3JkaW5hdGU7CisJcmVzLT5uYW1lID0gYnVzLT5uYW1lOworCXJlcy0+ZmxhZ3MgPSB0eXBlOworCisJc3RhcnQgPSBjb25maWdfcmVhZGwoc29ja2V0LCBhZGRyX3N0YXJ0KSAmIG1hc2s7CisJZW5kID0gY29uZmlnX3JlYWRsKHNvY2tldCwgYWRkcl9lbmQpIHwgfm1hc2s7CisJaWYgKHN0YXJ0ICYmIGVuZCA+IHN0YXJ0ICYmICFvdmVycmlkZV9iaW9zKSB7CisJCXJlcy0+c3RhcnQgPSBzdGFydDsKKwkJcmVzLT5lbmQgPSBlbmQ7CisJCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2Uoc29ja2V0LT5kZXYsIHJlcyk7CisJCWlmIChyb290ICYmIChyZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcykgPT0gMCkpCisJCQlyZXR1cm47CisJCXByaW50ayhLRVJOX0lORk8gInllbnRhICVzOiBQcmVhc3NpZ25lZCByZXNvdXJjZSAlZCBidXN5IG9yIG5vdCBhdmFpbGFibGUsIHJlY29uZmlndXJpbmcuLi5cbiIsCisJCQkJcGNpX25hbWUoc29ja2V0LT5kZXYpLCBucik7CisJfQorCisJaWYgKHR5cGUgJiBJT1JFU09VUkNFX0lPKSB7CisJCWlmICgoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX0lPX01BWCkpIHx8CisJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX0lPX0FDQykpIHx8CisJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX0lPX01JTikpKSB7CisJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9zdGFydCwgcmVzLT5zdGFydCk7CisJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9lbmQsIHJlcy0+ZW5kKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0eXBlICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkgeworCQkJaWYgKCh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX01BWCkpIHx8CisJCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fQUNDKSkgfHwKKwkJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NSU4pKSkgeworCQkJCWNvbmZpZ193cml0ZWwoc29ja2V0LCBhZGRyX3N0YXJ0LCByZXMtPnN0YXJ0KTsKKwkJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9lbmQsIHJlcy0+ZW5kKTsKKwkJCX0KKwkJCS8qIEFwcHJveGltYXRpbmcgcHJlZmV0Y2hhYmxlIGJ5IG5vbi1wcmVmZXRjaGFibGUgKi8KKwkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJfQorCQlpZiAoKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fTUFYKSkgfHwKKwkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX0FDQykpIHx8CisJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NSU4pKSkgeworCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfc3RhcnQsIHJlcy0+c3RhcnQpOworCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfZW5kLCByZXMtPmVuZCk7CisJCX0KKwl9CisKIAlwcmludGsoS0VSTl9JTkZPICJ5ZW50YSAlczogbm8gcmVzb3VyY2Ugb2YgdHlwZSAleCBhdmFpbGFibGUsIHRyeWluZyB0byBjb250aW51ZS4uLlxuIiwKLQkJCXBjaV9uYW1lKHNvY2tldC0+ZGV2KSwgdHlwZSk7Ci0JcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gMDsKKwkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpLCB0eXBlKTsKKwlyZXMtPnN0YXJ0ID0gcmVzLT5lbmQgPSByZXMtPmZsYWdzID0gMDsKIH0KIAogLyoKQEAgLTYyNywxMCArNjcyLDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIHllbnRhX2FsbG9jYXRlX3Jlc291cmNlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQpCiB7Ci0JeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMCwgSU9SRVNPVVJDRV9NRU18SU9SRVNPVVJDRV9QUkVGRVRDSCk7Ci0JeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMSwgSU9SRVNPVVJDRV9NRU0pOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDIsIElPUkVTT1VSQ0VfSU8pOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDMsIElPUkVTT1VSQ0VfSU8pOwkvKiBQQ0kgaXNuJ3QgY2xldmVyIGVub3VnaCB0byB1c2UgdGhpcyBvbmUgeWV0ICovCisJeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMCwgSU9SRVNPVVJDRV9JTywKKwkJCSAgIFBDSV9DQl9JT19CQVNFXzAsIFBDSV9DQl9JT19MSU1JVF8wKTsKKwl5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAxLCBJT1JFU09VUkNFX0lPLAorCQkJICAgUENJX0NCX0lPX0JBU0VfMSwgUENJX0NCX0lPX0xJTUlUXzEpOworCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDIsIElPUkVTT1VSQ0VfTUVNfElPUkVTT1VSQ0VfUFJFRkVUQ0gsCisJCQkgICBQQ0lfQ0JfTUVNT1JZX0JBU0VfMCwgUENJX0NCX01FTU9SWV9MSU1JVF8wKTsKKwl5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAzLCBJT1JFU09VUkNFX01FTSwKKwkJCSAgIFBDSV9DQl9NRU1PUllfQkFTRV8xLCBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzEpOwogfQogCiAKQEAgLTg2OSwxNCArOTE4LDExIEBACiAgKi8KIHN0YXRpYyB2b2lkIHllbnRhX2dldF9zb2NrZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgdTMyIGlzYV9pcnFfbWFzaykKIHsKLQlzb2NrZXQtPnNvY2tldC5mZWF0dXJlcyB8PSBTU19DQVBfUEFHRV9SRUdTIHwgU1NfQ0FQX1BDQ0FSRCB8IFNTX0NBUF9DQVJEQlVTOwotCXNvY2tldC0+c29ja2V0Lm1hcF9zaXplID0gMHgxMDAwOwogCXNvY2tldC0+c29ja2V0LnBjaV9pcnEgPSBzb2NrZXQtPmNiX2lycTsKIAlpZiAoaXNhX3Byb2JlKQogCQlzb2NrZXQtPnNvY2tldC5pcnFfbWFzayA9IHllbnRhX3Byb2JlX2lycShzb2NrZXQsIGlzYV9pcnFfbWFzayk7CiAJZWxzZQogCQlzb2NrZXQtPnNvY2tldC5pcnFfbWFzayA9IDA7Ci0Jc29ja2V0LT5zb2NrZXQuY2JfZGV2ID0gc29ja2V0LT5kZXY7CiAKIAlwcmludGsoS0VSTl9JTkZPICJZZW50YTogSVNBIElSUSBtYXNrIDB4JTA0eCwgUENJIGlycSAlZFxuIiwKIAkgICAgICAgc29ja2V0LT5zb2NrZXQuaXJxX21hc2ssIHNvY2tldC0+Y2JfaXJxKTsKQEAgLTk0Miw2ICs5ODgsOSBAQAogCXNvY2tldC0+c29ja2V0LmRldi5kZXYgPSAmZGV2LT5kZXY7CiAJc29ja2V0LT5zb2NrZXQuZHJpdmVyX2RhdGEgPSBzb2NrZXQ7CiAJc29ja2V0LT5zb2NrZXQub3duZXIgPSBUSElTX01PRFVMRTsKKwlzb2NrZXQtPnNvY2tldC5mZWF0dXJlcyA9IFNTX0NBUF9QQUdFX1JFR1MgfCBTU19DQVBfUENDQVJEOworCXNvY2tldC0+c29ja2V0Lm1hcF9zaXplID0gMHgxMDAwOworCXNvY2tldC0+c29ja2V0LmNiX2RldiA9IGRldjsKIAogCS8qIHByZXBhcmUgc3RydWN0IHllbnRhX3NvY2tldCAqLwogCXNvY2tldC0+ZGV2ID0gZGV2OwpAQCAtMTAxMiw2ICsxMDYxLDEwIEBACiAJCXNvY2tldC0+cG9sbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc29ja2V0OwogCQlzb2NrZXQtPnBvbGxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKIAkJYWRkX3RpbWVyKCZzb2NrZXQtPnBvbGxfdGltZXIpOworCQlwcmludGsoS0VSTl9JTkZPICJZZW50YTogbm8gUENJIElSUSwgQ2FyZEJ1cyBzdXBwb3J0IGRpc2FibGVkIGZvciB0aGlzIHNvY2tldC5cbiIKKwkJICAgICAgIEtFUk5fSU5GTyAiWWVudGE6IGNoZWNrIHlvdXIgQklPUyBDYXJkQnVzLCBCSU9TIElSUSBvciBBQ1BJIHNldHRpbmdzLlxuIik7CisJfSBlbHNlIHsKKwkJc29ja2V0LT5zb2NrZXQuZmVhdHVyZXMgfD0gU1NfQ0FQX0NBUkRCVVM7CiAJfQogCiAJLyogRmlndXJlIG91dCB3aGF0IHRoZSBkYW5nIHRoaW5nIGNhbiBkbyBmb3IgdGhlIFBDTUNJQSBsYXllci4uLiAqLwpAQCAtMTA1Miw2ICsxMTA1LDcgQEAKIAkJcGNpX3NhdmVfc3RhdGUoZGV2KTsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMTYqNCwgJnNvY2tldC0+c2F2ZWRfc3RhdGVbMF0pOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAxNyo0LCAmc29ja2V0LT5zYXZlZF9zdGF0ZVsxXSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCiAJCS8qCiAJCSAqIFNvbWUgbGFwdG9wcyAoSUJNIFQyMikgZG8gbm90IGxpa2UgdXMgcHV0dGluZyB0aGUgQ2FyZGJ1cwpAQCAtMTA3NSw2ICsxMTI5LDggQEAKIAkJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDE2KjQsIHNvY2tldC0+c2F2ZWRfc3RhdGVbMF0pOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMTcqNCwgc29ja2V0LT5zYXZlZF9zdGF0ZVsxXSk7CisJCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJCXBjaV9zZXRfbWFzdGVyKGRldik7CiAKIAkJaWYgKHNvY2tldC0+dHlwZSAmJiBzb2NrZXQtPnR5cGUtPnJlc3RvcmVfc3RhdGUpCiAJCQlzb2NrZXQtPnR5cGUtPnJlc3RvcmVfc3RhdGUoc29ja2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwppbmRleCBkZDYxZTA5Li43NTU3NWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJCQlhY3BpX3JlZ2lzdGVyX2dzaShyZXMtPmRhdGEuaXJxLmludGVycnVwdHNbMF0sCiAJCQkJCXJlcy0+ZGF0YS5pcnEuZWRnZV9sZXZlbCwKIAkJCQkJcmVzLT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cpKTsKLQkJCXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShyZXMtPmRhdGEuaXJxLmludGVycnVwdHNbMF0pOworCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKHJlcy0+ZGF0YS5pcnEuaW50ZXJydXB0c1swXSwgMSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTE3MSw3ICsxNzEsNyBAQAogCQkJCWFjcGlfcmVnaXN0ZXJfZ3NpKHJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSwKIAkJCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsLAogCQkJCQlyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmFjdGl2ZV9oaWdoX2xvdykpOwotCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKHJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSk7CisJCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEocmVzLT5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzWzBdLCAxKTsKIAkJfQogCQlicmVhazsKIAljYXNlIEFDUElfUlNUWVBFX0RNQToKQEAgLTQ0NCw2ICs0NDQsNyBAQAogCiBzdHJ1Y3QgYWNwaXBucF9wYXJzZV9vcHRpb25fcyB7CiAJc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbjsKKwlzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uX2luZGVwZW5kZW50OwogCXN0cnVjdCBwbnBfZGV2ICpkZXY7CiB9OwogCkBAIC01MDcsNyArNTA4LDE0IEBACiAJCQlwYXJzZV9kYXRhLT5vcHRpb24gPSBvcHRpb247CQogCQkJYnJlYWs7CiAJCWNhc2UgQUNQSV9SU1RZUEVfRU5EX0RQRjoKLQkJCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKKwkJCS8qb25seSBvbmUgRW5kRGVwZW5kZW50Rm4gaXMgYWxsb3dlZCovCisJCQlpZiAoIXBhcnNlX2RhdGEtPm9wdGlvbl9pbmRlcGVuZGVudCkgeworCQkJCXBucF93YXJuKCJQblBBQ1BJOiBtb3JlIHRoYW4gb25lIEVuZERlcGVuZGVudEZuIik7CisJCQkJcmV0dXJuIEFFX0VSUk9SOworCQkJfQorCQkJcGFyc2VfZGF0YS0+b3B0aW9uID0gcGFyc2VfZGF0YS0+b3B0aW9uX2luZGVwZW5kZW50OworCQkJcGFyc2VfZGF0YS0+b3B0aW9uX2luZGVwZW5kZW50ID0gTlVMTDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcG5wX3dhcm4oIlBuUEFDUEk6IHVua25vd24gcmVzb3VyY2UgdHlwZSAlZCIsIHJlcy0+aWQpOwogCQkJcmV0dXJuIEFFX0VSUk9SOwpAQCAtNTI1LDYgKzUzMyw3IEBACiAJcGFyc2VfZGF0YS5vcHRpb24gPSBwbnBfcmVnaXN0ZXJfaW5kZXBlbmRlbnRfb3B0aW9uKGRldik7CiAJaWYgKCFwYXJzZV9kYXRhLm9wdGlvbikKIAkJcmV0dXJuIEFFX0VSUk9SOworCXBhcnNlX2RhdGEub3B0aW9uX2luZGVwZW5kZW50ID0gcGFyc2VfZGF0YS5vcHRpb247CiAJcGFyc2VfZGF0YS5kZXYgPSBkZXY7CiAJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlMsIAogCQlwbnBhY3BpX29wdGlvbl9yZXNvdXJjZSwgJnBhcnNlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCmluZGV4IDc5YmNlN2IuLjkwMDFiNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYworKysgYi9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAkJfQogCQlyZXMtPmlycV9yZXNvdXJjZVtpXS5zdGFydCA9CiAJCXJlcy0+aXJxX3Jlc291cmNlW2ldLmVuZCA9ICh1bnNpZ25lZCBsb25nKSBpcnE7Ci0JCXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpcnEpOworCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaXJxLCAxKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMgYi9kcml2ZXJzL3BucC9yZXNvdXJjZS5jCmluZGV4IDJkMTMyMmQuLjg4N2FkODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wbnAvcmVzb3VyY2UuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCQlpZiAodGVzdF9iaXQoaSwgZGF0YS0+bWFwKSkKLQkJCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaSk7CisJCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGksIDApOwogCX0KICNlbmRpZgogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwppbmRleCA2MDQ0MGRiLi4yNGMwYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwpAQCAtNDI4LDcgKzQyOCw3IEBACiAJbmV3X3NrYiA9IE5VTEw7CQkvKiBhc3N1bWUgbm8gZGljZSAqLwogCXBrdF9jbnQgPSAwOwogCUNMQVdfREJGX1RFWFQoNCx0cmFjZSwiUGFja1NLQmUiKTsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmcF9jaC0+Y29sbGVjdF9xdWV1ZSkgPiAwKSB7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnBfY2gtPmNvbGxlY3RfcXVldWUpKSB7CiAJLyogc29tZSBkYXRhICovCiAJCWhlbGRfc2tiID0gc2tiX2RlcXVldWUoJnBfY2gtPmNvbGxlY3RfcXVldWUpOwogCQlpZiAocF9lbnYtPnBhY2tpbmcgIT0gRE9fUEFDS0VEKQpAQCAtMTI1NCw3ICsxMjU0LDcgQEAKIAlwcml2cHRyID0gKHN0cnVjdCBjbGF3X3ByaXZiayAqKSBkZXYtPnByaXY7CiAgICAgICAgIGNsYXdfZnJlZV93cnRfYnVmKCBkZXYgKTsKIAlpZiAoKHByaXZwdHItPndyaXRlX2ZyZWVfY291bnQgPiAwKSAmJgotCSAgICAoc2tiX3F1ZXVlX2xlbigmcF9jaC0+Y29sbGVjdF9xdWV1ZSkgPiAwKSkgeworCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZwX2NoLT5jb2xsZWN0X3F1ZXVlKSkgewogCSAgCXBrX3NrYiA9IGNsYXdfcGFja19za2IocHJpdnB0cik7CiAJCXdoaWxlIChwa19za2IgIT0gTlVMTCkgewogCQkJcmMgPSBjbGF3X2h3X3R4KCBwa19za2IsIGRldiwxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjdHR5LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y3R0eS5jCmluZGV4IDMwODAzOTMuLjk2OGYyYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjdHR5LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGN0dHkuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJCQkJCXNrYl9xdWV1ZV9oZWFkKCZpbmZvLT5yeF9xdWV1ZSwgc2tiKTsKIAkJCQllbHNlIHsKIAkJCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCQkJCXJldCA9IHNrYl9xdWV1ZV9sZW4oJmluZm8tPnJ4X3F1ZXVlKTsKKwkJCQkJcmV0ID0gIXNrYl9xdWV1ZV9lbXB0eSgmaW5mby0+cnhfcXVldWUpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNTMwLDcgKzUzMCw3IEBACiAJCXRvdGFsICs9IGM7CiAJCWNvdW50IC09IGM7CiAJfQotCWlmIChza2JfcXVldWVfbGVuKCZpbmZvLT50eF9xdWV1ZSkpIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmaW5mby0+dHhfcXVldWUpKSB7CiAJCWluZm8tPmxzciAmPSB+VUFSVF9MU1JfVEVNVDsKIAkJdGFza2xldF9zY2hlZHVsZSgmaW5mby0+dGFza2xldCk7CiAJfQpAQCAtNTk0LDcgKzU5NCw3IEBACiAJCXJldHVybjsKIAlpZiAoY3RjX3R0eV9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjdGNfdHR5X2ZsdXNoX2NoYXJzIikpCiAJCXJldHVybjsKLQlpZiAodHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fCAoIXNrYl9xdWV1ZV9sZW4oJmluZm8tPnR4X3F1ZXVlKSkpCisJaWYgKHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwgc2tiX3F1ZXVlX2VtcHR5KCZpbmZvLT50eF9xdWV1ZSkpCiAJCXJldHVybjsKIAl0YXNrbGV0X3NjaGVkdWxlKCZpbmZvLT50YXNrbGV0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCmluZGV4IDNjYjg4YzcuLjhmNGQyOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYwpAQCAtMjIxMCw3ICsyMjEwLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAorc3RhdGljIGlubGluZSBfX2JlMTYKIHFldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9icHAuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JwcC5jCmluZGV4IDhmMGY0NjkuLjg3MzAyZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2JwcC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JwcC5jCkBAIC03OSwxMCArNzksNiBAQAogCiAgICAgICB1bnNpZ25lZCBjaGFyIHJ1bl9sZW5ndGg7CiAgICAgICB1bnNpZ25lZCBjaGFyIHJlcGVhdF9ieXRlOwotCi0gICAgICAvKiBUaGVzZSBtZW1iZXJzIG1hbmFnZSB0aW1lb3V0cyBmb3IgcHJvZ3JhbW1lZCBkZWxheXMgKi8KLSAgICAgIHdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7Ci0gICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl9saXN0OwogfTsKIAogc3RhdGljIHN0cnVjdCBpbnN0IGluc3RhbmNlc1tCUFBfTk9dOwpAQCAtMjk3LDE2ICsyOTMsMTAgQEAKIAogI2VuZGlmIC8qIF9fc3BhcmNfXyAqLwogCi1zdGF0aWMgdm9pZCBicHBfd2FrZV91cCh1bnNpZ25lZCBsb25nIHZhbCkKLXsgd2FrZV91cCgmaW5zdGFuY2VzW3ZhbF0ud2FpdF9xdWV1ZSk7IH0KLQogc3RhdGljIHZvaWQgc25vb3plKHVuc2lnbmVkIGxvbmcgc25vb3plX3RpbWUsIHVuc2lnbmVkIG1pbm9yKQogewotICAgICAgaW5pdF90aW1lcigmaW5zdGFuY2VzW21pbm9yXS50aW1lcl9saXN0KTsKLSAgICAgIGluc3RhbmNlc1ttaW5vcl0udGltZXJfbGlzdC5leHBpcmVzID0gamlmZmllcyArIHNub296ZV90aW1lICsgMTsKLSAgICAgIGluc3RhbmNlc1ttaW5vcl0udGltZXJfbGlzdC5kYXRhICAgID0gbWlub3I7Ci0gICAgICBhZGRfdGltZXIoJmluc3RhbmNlc1ttaW5vcl0udGltZXJfbGlzdCk7Ci0gICAgICBzbGVlcF9vbiAoJmluc3RhbmNlc1ttaW5vcl0ud2FpdF9xdWV1ZSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoc25vb3plX3RpbWUgKyAxKTsKIH0KIAogc3RhdGljIGludCB3YWl0X2Zvcih1bnNpZ25lZCBzaG9ydCBzZXQsIHVuc2lnbmVkIHNob3J0IGNsciwKQEAgLTg4MCwxMSArODcwLDggQEAKICAgICAgIGluc3RhbmNlc1tpZHhdLmVuaGFuY2VkID0gMDsKICAgICAgIGluc3RhbmNlc1tpZHhdLmRpcmVjdGlvbiA9IDA7CiAgICAgICBpbnN0YW5jZXNbaWR4XS5tb2RlID0gQ09NUEFUSUJJTElUWTsKLSAgICAgIGluc3RhbmNlc1tpZHhdLndhaXRfcXVldWUgPSAwOwogICAgICAgaW5zdGFuY2VzW2lkeF0ucnVuX2xlbmd0aCA9IDA7CiAgICAgICBpbnN0YW5jZXNbaWR4XS5ydW5fZmxhZyA9IDA7Ci0gICAgICBpbml0X3RpbWVyKCZpbnN0YW5jZXNbaWR4XS50aW1lcl9saXN0KTsKLSAgICAgIGluc3RhbmNlc1tpZHhdLnRpbWVyX2xpc3QuZnVuY3Rpb24gPSBicHBfd2FrZV91cDsKICAgICAgIGlmICghcmVxdWVzdF9yZWdpb24obHBBZGRyLDMsIGRldl9uYW1lKSkgcmV0dXJuOwogCiAgICAgICAvKgpAQCAtOTc3LDExICs5NjQsOCBAQAogICAgICAgaW5zdGFuY2VzW2lkeF0uZW5oYW5jZWQgPSAwOwogICAgICAgaW5zdGFuY2VzW2lkeF0uZGlyZWN0aW9uID0gMDsKICAgICAgIGluc3RhbmNlc1tpZHhdLm1vZGUgPSBDT01QQVRJQklMSVRZOwotICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5zdGFuY2VzW2lkeF0ud2FpdF9xdWV1ZSk7CiAgICAgICBpbnN0YW5jZXNbaWR4XS5ydW5fbGVuZ3RoID0gMDsKICAgICAgIGluc3RhbmNlc1tpZHhdLnJ1bl9mbGFnID0gMDsKLSAgICAgIGluaXRfdGltZXIoJmluc3RhbmNlc1tpZHhdLnRpbWVyX2xpc3QpOwotICAgICAgaW5zdGFuY2VzW2lkeF0udGltZXJfbGlzdC5mdW5jdGlvbiA9IGJwcF93YWtlX3VwOwogCiAgICAgICBpZiAoIXJwKSByZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCmluZGV4IDFmZWY5MmQuLjM5MGNkNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwpAQCAtNDY5LDcgKzQ2OSw3IEBACiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQl1c2VyX3NyYmNtZCA9IGttYWxsb2MoR0ZQX0tFUk5FTCwgZmlic2l6ZSk7CisJdXNlcl9zcmJjbWQgPSBrbWFsbG9jKGZpYnNpemUsIEdGUF9LRVJORUwpOwogCWlmICghdXNlcl9zcmJjbWQpIHsKIAkJZHByaW50aygoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgbWFrZSBhIGNvcHkgb2YgdGhlIHNyYlxuIikpOwogCQlyY29kZSA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjNTNjOTQuYyBiL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jCmluZGV4IGVkZDQ3ZDEuLjkzMmRjZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jCkBAIC00MjQsNyArNDI0LDcgQEAKIAkudXNlX2NsdXN0ZXJpbmcJPSBESVNBQkxFX0NMVVNURVJJTkcsCiB9OwogCi1zdGF0aWMgaW50IG1hYzUzYzk0X3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitzdGF0aWMgaW50IG1hYzUzYzk0X3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gbWFjaW9fZ2V0X3BjaV9kZXYobWRldik7CkBAIC01NDQsMTUgKzU0NCwxNCBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggbWFjNTNjOTRfbWF0Y2hbXSA9IAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbWFjNTNjOTRfbWF0Y2hbXSA9IAogewogCXsKIAkubmFtZSAJCT0gIjUzYzk0IiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKG9mLCBtYWM1M2M5NF9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIG1hYzUzYzk0X2RyaXZlciA9IAogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lc2guYyBiL2RyaXZlcnMvc2NzaS9tZXNoLmMKaW5kZXggYjA1NzM3YS4uZmYxOTMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lc2guYworKysgYi9kcml2ZXJzL3Njc2kvbWVzaC5jCkBAIC0xODQ3LDcgKzE4NDcsNyBAQAogCS51c2VfY2x1c3RlcmluZwkJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAogfTsKIAotc3RhdGljIGludCBtZXNoX3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitzdGF0aWMgaW50IG1lc2hfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICptZXNoID0gbWFjaW9fZ2V0X29mX25vZGUobWRldik7CiAJc3RydWN0IHBjaV9kZXYqIHBkZXYgPSBtYWNpb19nZXRfcGNpX2RldihtZGV2KTsKQEAgLTIwMTIsMjAgKzIwMTIsMTggQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIG1lc2hfbWF0Y2hbXSA9IAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbWVzaF9tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAibWVzaCIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7Ci0JLm5hbWUgCQk9IE9GX0FOWV9NQVRDSCwKIAkudHlwZQkJPSAic2NzaSIsCiAJLmNvbXBhdGlibGUJPSAiY2hycCxtZXNoMCIKIAl9LAogCXt9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKG9mLCBtZXNoX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBtYWNpb19kcml2ZXIgbWVzaF9kcml2ZXIgPSAKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCmluZGV4IGYxZjZiZjUuLjdjNTMwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSAiYWhhMTUyeC5oIgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xMzQsMTEgKzEzMyw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZhaGExNTJ4X2V2ZW50OwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0zMzQsNiArMzI4LDcgQEAKIAkJLm5hbWUJPSAiYWhhMTUyeF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGFoYTE1MnhfYXR0YWNoLAorCS5ldmVudAkJPSBhaGExNTJ4X2V2ZW50LAogCS5kZXRhY2gJCT0gYWhhMTUyeF9kZXRhY2gsCiAJLmlkX3RhYmxlICAgICAgID0gYWhhMTUyeF9pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKaW5kZXggODUzZTZlZS4uZGI4ZjVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fc3R1Yi5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlICJmZG9tYWluLmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTEyMCwxMSArMTE5LDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmZkb21haW5fZXZlbnQ7Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTMxNCw2ICszMDgsNyBAQAogCQkubmFtZQk9ICJmZG9tYWluX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gZmRvbWFpbl9hdHRhY2gsCisJLmV2ZW50CQk9IGZkb21haW5fZXZlbnQsCiAJLmRldGFjaAkJPSBmZG9tYWluX2RldGFjaCwKIAkuaWRfdGFibGUgICAgICAgPSBmZG9tYWluX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwppbmRleCA5MWIzZjI4Li4zY2QzYjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMKQEAgLTUxLDcgKzUxLDYgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTY0MiwxMSArMTY0MSw2IEBACiAJbGluay0+bmV4dCAgICAgICAgICAgICAgID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgICAgICAgICAgICAgICAgID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvCSA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzawkgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVAl8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQJfCBDU19FVkVOVF9QTV9SRVNVTUUJIDsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbnNwX2NzX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbgkgPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTIxMzgsMTIgKzIxMzIsMTMgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBuc3BfY3NfaWRzKTsKIAogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG5zcF9kcml2ZXIgPSB7Ci0JLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLmRydiAgICAgICAgICAgID0gewotCQkubmFtZSAgID0gIm5zcF9jcyIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJuc3BfY3MiLAogCX0sCi0JLmF0dGFjaCAgICAgICAgID0gbnNwX2NzX2F0dGFjaCwKLQkuZGV0YWNoICAgICAgICAgPSBuc3BfY3NfZGV0YWNoLAorCS5hdHRhY2gJCT0gbnNwX2NzX2F0dGFjaCwKKwkuZXZlbnQJCT0gbnNwX2NzX2V2ZW50LAorCS5kZXRhY2gJCT0gbnNwX2NzX2RldGFjaCwKIAkuaWRfdGFibGUJPSBuc3BfY3NfaWRzLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCmluZGV4IDBkY2Y0MTEuLjdhNTE2ZjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL3Fsb2dpY19zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlICIuLi9xbG9naWNmYXM0MDguaCIKIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTk0LDggKzE5Myw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZxbG9naWNfZXZlbnQ7Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPSBDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTQyMyw2ICs0MjAsNyBAQAogCS5uYW1lCQk9ICJxbG9naWNfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBxbG9naWNfYXR0YWNoLAorCS5ldmVudAkJPSBxbG9naWNfZXZlbnQsCiAJLmRldGFjaAkJPSBxbG9naWNfZGV0YWNoLAogCS5pZF90YWJsZSAgICAgICA9IHFsb2dpY19pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKaW5kZXggN2Q0YjE2Yi4uYjRiM2ExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCkBAIC05NzksMTAgKzk3OSw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZTWU01M0M1MDBfZXZlbnQ7Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPSBDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTEwMTMsNiArMTAwOSw3IEBACiAJCS5uYW1lCT0gInN5bTUzYzUwMF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IFNZTTUzQzUwMF9hdHRhY2gsCisJLmV2ZW50CQk9IFNZTTUzQzUwMF9ldmVudCwKIAkuZGV0YWNoCQk9IFNZTTUzQzUwMF9kZXRhY2gsCiAJLmlkX3RhYmxlICAgICAgID0gc3ltNTNjNTAwX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMKaW5kZXggZGUyNmNmNy4uNzkxMTkxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTEuYwpAQCAtOTQsMTIgKzk0LDQyIEBACiAJCSgoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX2lvcG9ydC5pb3BfcGFvZHIgJj0gfmlvYml0czsKIAl9CiAKKyNpZmRlZiBDT05GSUdfTVBDODg1QURTCisJLyogRW5hYmxlIFNNQzEgdHJhbnNjZWl2ZXJzICovCisJeworCQl2b2xhdGlsZSB1aW50IF9faW9tZW0gKmJjc3IxID0gaW9yZW1hcChCQ1NSMSwgNCk7CisJCXVpbnQgdG1wOworCisJCXRtcCA9IGluX2JlMzIoYmNzcjEpOworCQl0bXAgJj0gfkJDU1IxX1JTMjMyRU5fMTsKKwkJb3V0X2JlMzIoYmNzcjEsIHRtcCk7CisJCWlvdW5tYXAoYmNzcjEpOworCX0KKyNlbmRpZgorCiAJcGluZm8tPmJyZyA9IDE7CiB9CiAKIHZvaWQgc21jMl9saW5laWYoc3RydWN0IHVhcnRfY3BtX3BvcnQgKnBpbmZvKQogewotCS8qIFhYWCBTTUMyOiBpbnNlcnQgcG9ydCBjb25maWd1cmF0aW9uIGhlcmUgKi8KKyNpZmRlZiBDT05GSUdfTVBDODg1QURTCisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gY3BtcDsKKwl2b2xhdGlsZSB1aW50IF9faW9tZW0gKmJjc3IxOworCXVpbnQgdG1wOworCisJY3AtPmNwX3BlcGFyIHw9IDB4MDAwMDBjMDA7CisJY3AtPmNwX3BlZGlyICY9IH4weDAwMDAwYzAwOworCWNwLT5jcF9wZXNvICY9IH4weDAwMDAwNDAwOworCWNwLT5jcF9wZXNvIHw9IDB4MDAwMDA4MDA7CisKKwkvKiBFbmFibGUgU01DMiB0cmFuc2NlaXZlcnMgKi8KKwliY3NyMSA9IGlvcmVtYXAoQkNTUjEsIDQpOworCXRtcCA9IGluX2JlMzIoYmNzcjEpOworCXRtcCAmPSB+QkNTUjFfUlMyMzJFTl8yOworCW91dF9iZTMyKGJjc3IxLCB0bXApOworCWlvdW5tYXAoYmNzcjEpOworI2VuZGlmCisKIAlwaW5mby0+YnJnID0gMjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jIGIvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jCmluZGV4IDFjOWY3MTYuLjdkYjJmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMKQEAgLTE1NDUsNyArMTU0NSw3IEBACiAvKgogICogQ2FsbGVkIHVwb24gbWF0Y2ggd2l0aCBhbiBlc2NjIG5vZGUgaW4gdGhlIGRldml2ZS10cmVlLgogICovCi1zdGF0aWMgaW50IHBtel9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgcG16X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlpbnQgaTsKIAkKQEAgLTE4NTAsMjAgKzE4NTAsMTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggcG16X21hdGNoW10gPSAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtel9tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAiY2gtYSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7CiAJLm5hbWUgCQk9ICJjaC1iIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKG9mLCBwbXpfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBwbXpfZHJpdmVyID0gCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCmluZGV4IDczYTM0YjEuLmRlMDEzNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCkBAIC00NSw3ICs0NSw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yMzIsMTEgKzIzMSw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCSAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCSAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZzZXJpYWxfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC04ODMsNiArODc3LDcgQEAKIAkJLm5hbWUJPSAic2VyaWFsX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gc2VyaWFsX2F0dGFjaCwKKwkuZXZlbnQJCT0gc2VyaWFsX2V2ZW50LAogCS5kZXRhY2gJCT0gc2VyaWFsX2RldGFjaCwKIAkuaWRfdGFibGUJPSBzZXJpYWxfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYyBiL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYwppbmRleCBjZTVlYmZlLi41N2MwYzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGpfcGNtY2lhLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqX3BjbWNpYS5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIGVycm9yIGNvZGVzICovCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02OSwxMSArNjgsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmaXhqX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMzA3LDYgKzMwMSw3IEBACiAJCS5uYW1lCT0gIml4al9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGl4al9hdHRhY2gsCisJLmV2ZW50CQk9IGl4al9ldmVudCwKIAkuZGV0YWNoCQk9IGl4al9kZXRhY2gsCiAJLmlkX3RhYmxlCT0gaXhqX2lkcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCmluZGV4IGQ3OWNkMjEuLmRmMDE0YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCkBAIC02NSwxMiArNjUsMTQgQEAKIG9iai0kKENPTkZJR19VU0JfRU1JNjIpCQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9JRE1PVVNFKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9MQ0QpCQkrPSBtaXNjLworb2JqLSQoQ09ORklHX1VTQl9MRCkJCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0xFRCkJCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0xFR09UT1dFUikJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfUklPNTAwKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9URVNUKQkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfVVNTNzIwKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9QSElER0VUU0VSVk8pCSs9IG1pc2MvCitvYmotJChDT05GSUdfVVNCX1NJU1VTQlZHQSkJKz0gbWlzYy8KIAogb2JqLSQoQ09ORklHX1VTQl9BVE0pCQkrPSBhdG0vCiBvYmotJChDT05GSUdfVVNCX1NQRUVEVE9VQ0gpCSs9IGF0bS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwppbmRleCBjYmQ0YTdkLi44ZTE4NGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKKysrIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCkBAIC00MjcsNyArNDI3LDcgQEAKIAkJYXRtX2Rldi0+bGlua19yYXRlID0gYnVmW0NYSU5GX0RPV05TVFJFQU1fUkFURV0gKiAxMDAwIC8gNDI0OwogCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19GT1VORDsKIAotCQlkZXZfaW5mbyhkZXYsICJBRFNMIGxpbmU6IHVwICglZCBLaWIvcyBkb3duIHwgJWQgS2liL3MgdXApXG4iLAorCQlkZXZfaW5mbyhkZXYsICJBRFNMIGxpbmU6IHVwICglZCBrYi9zIGRvd24gfCAlZCBrYi9zIHVwKVxuIiwKIAkJICAgICBidWZbQ1hJTkZfRE9XTlNUUkVBTV9SQVRFXSwgYnVmW0NYSU5GX1VQU1RSRUFNX1JBVEVdKTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKaW5kZXggNmE2ZWFhMi4uZDBjYmJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKQEAgLTEwMCw2ICsxMDAsOCBAQAogCiAJc3RydWN0IHdvcmtfc3RydWN0IHN0YXR1c19jaGVja2VyOwogCisJdW5zaWduZWQgY2hhciBsYXN0X3N0YXR1czsKKwogCWludCBwb2xsX2RlbGF5OyAvKiBtaWxsaXNlY29uZHMgKi8KIAogCXN0cnVjdCB0aW1lcl9saXN0IHJlc3VibWl0X3RpbWVyOwpAQCAtNDIzLDUyICs0MjUsNDggQEAKIAlzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSA9IGluc3RhbmNlLT51c2JhdG07CiAJc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYgPSB1c2JhdG0tPmF0bV9kZXY7CiAJdW5zaWduZWQgY2hhciAqYnVmID0gaW5zdGFuY2UtPnNjcmF0Y2hfYnVmZmVyOwotCWludCByZXQ7CisJaW50IGRvd25fc3BlZWQsIHVwX3NwZWVkLCByZXQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAKIAlhdG1fZGJnKHVzYmF0bSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKIAogCXJldCA9IHNwZWVkdGNoX3JlYWRfc3RhdHVzKGluc3RhbmNlKTsKIAlpZiAocmV0IDwgMCkgewogCQlhdG1fd2Fybih1c2JhdG0sICJlcnJvciAlZCBmZXRjaGluZyBkZXZpY2Ugc3RhdHVzXG4iLCByZXQpOwotCQlpZiAoaW5zdGFuY2UtPnBvbGxfZGVsYXkgPCBNQVhfUE9MTF9ERUxBWSkKLQkJCWluc3RhbmNlLT5wb2xsX2RlbGF5ICo9IDI7CisJCWluc3RhbmNlLT5wb2xsX2RlbGF5ID0gbWluKDIgKiBpbnN0YW5jZS0+cG9sbF9kZWxheSwgTUFYX1BPTExfREVMQVkpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGluc3RhbmNlLT5wb2xsX2RlbGF5ID4gTUlOX1BPTExfREVMQVkpCi0JCWluc3RhbmNlLT5wb2xsX2RlbGF5IC89IDI7CisJaW5zdGFuY2UtPnBvbGxfZGVsYXkgPSBtYXgoaW5zdGFuY2UtPnBvbGxfZGVsYXkgLyAyLCBNSU5fUE9MTF9ERUxBWSk7CiAKLQlhdG1fZGJnKHVzYmF0bSwgIiVzOiBsaW5lIHN0YXRlICUwMnhcbiIsIF9fZnVuY19fLCBidWZbT0ZGU0VUXzddKTsKKwlzdGF0dXMgPSBidWZbT0ZGU0VUXzddOwogCi0Jc3dpdGNoIChidWZbT0ZGU0VUXzddKSB7Ci0JY2FzZSAwOgotCQlpZiAoYXRtX2Rldi0+c2lnbmFsICE9IEFUTV9QSFlfU0lHX0xPU1QpIHsKKwlhdG1fZGJnKHVzYmF0bSwgIiVzOiBsaW5lIHN0YXRlICUwMnhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCisJaWYgKChzdGF0dXMgIT0gaW5zdGFuY2UtPmxhc3Rfc3RhdHVzKSB8fCAhc3RhdHVzKSB7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgMDoKIAkJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7Ci0JCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmUgaXMgZG93blxuIik7Ci0JCQkvKiBJdCdsbCBuZXZlciByZXN5bmMgYWdhaW4gdW5sZXNzIHdlIGFzayBpdCB0by4uLiAqLworCQkJaWYgKGluc3RhbmNlLT5sYXN0X3N0YXR1cykKKwkJCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmUgaXMgZG93blxuIik7CisJCQkvKiBJdCBtYXkgbmV2ZXIgcmVzeW5jIGFnYWluIHVubGVzcyB3ZSBhc2sgaXQgdG8uLi4gKi8KIAkJCXJldCA9IHNwZWVkdGNoX3N0YXJ0X3N5bmNocm8oaW5zdGFuY2UpOwotCQl9Ci0JCWJyZWFrOworCQkJYnJlYWs7CiAKLQljYXNlIDB4MDg6Ci0JCWlmIChhdG1fZGV2LT5zaWduYWwgIT0gQVRNX1BIWV9TSUdfVU5LTk9XTikgeworCQljYXNlIDB4MDg6CiAJCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19VTktOT1dOOwogCQkJYXRtX2luZm8odXNiYXRtLCAiQURTTCBsaW5lIGlzIGJsb2NrZWQ/XG4iKTsKLQkJfQotCQlicmVhazsKKwkJCWJyZWFrOwogCi0JY2FzZSAweDEwOgotCQlpZiAoYXRtX2Rldi0+c2lnbmFsICE9IEFUTV9QSFlfU0lHX0xPU1QpIHsKKwkJY2FzZSAweDEwOgogCQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKIAkJCWF0bV9pbmZvKHVzYmF0bSwgIkFEU0wgbGluZSBpcyBzeW5jaHJvbmlzaW5nXG4iKTsKLQkJfQotCQlicmVhazsKKwkJCWJyZWFrOwogCi0JY2FzZSAweDIwOgotCQlpZiAoYXRtX2Rldi0+c2lnbmFsICE9IEFUTV9QSFlfU0lHX0ZPVU5EKSB7Ci0JCQlpbnQgZG93bl9zcGVlZCA9IGJ1ZltPRkZTRVRfYl0gfCAoYnVmW09GRlNFVF9iICsgMV0gPDwgOCkKKwkJY2FzZSAweDIwOgorCQkJZG93bl9zcGVlZCA9IGJ1ZltPRkZTRVRfYl0gfCAoYnVmW09GRlNFVF9iICsgMV0gPDwgOCkKIAkJCQl8IChidWZbT0ZGU0VUX2IgKyAyXSA8PCAxNikgfCAoYnVmW09GRlNFVF9iICsgM10gPDwgMjQpOwotCQkJaW50IHVwX3NwZWVkID0gYnVmW09GRlNFVF9iICsgNF0gfCAoYnVmW09GRlNFVF9iICsgNV0gPDwgOCkKKwkJCXVwX3NwZWVkID0gYnVmW09GRlNFVF9iICsgNF0gfCAoYnVmW09GRlNFVF9iICsgNV0gPDwgOCkKIAkJCQl8IChidWZbT0ZGU0VUX2IgKyA2XSA8PCAxNikgfCAoYnVmW09GRlNFVF9iICsgN10gPDwgMjQpOwogCiAJCQlpZiAoIShkb3duX3NwZWVkICYgMHgwMDAwZmZmZikgJiYgISh1cF9zcGVlZCAmIDB4MDAwMGZmZmYpKSB7CkBAIC00ODAsMTcgKzQ3OCwxNyBAQAogCQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfRk9VTkQ7CiAKIAkJCWF0bV9pbmZvKHVzYmF0bSwKLQkJCQkgIkFEU0wgbGluZSBpcyB1cCAoJWQgS2liL3MgZG93biB8ICVkIEtpYi9zIHVwKVxuIiwKKwkJCQkgIkFEU0wgbGluZSBpcyB1cCAoJWQga2IvcyBkb3duIHwgJWQga2IvcyB1cClcbiIsCiAJCQkJIGRvd25fc3BlZWQsIHVwX3NwZWVkKTsKLQkJfQotCQlicmVhazsKKwkJCWJyZWFrOwogCi0JZGVmYXVsdDoKLQkJaWYgKGF0bV9kZXYtPnNpZ25hbCAhPSBBVE1fUEhZX1NJR19VTktOT1dOKSB7CisJCWRlZmF1bHQ6CiAJCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19VTktOT1dOOwotCQkJYXRtX2luZm8odXNiYXRtLCAiVW5rbm93biBsaW5lIHN0YXRlICUwMnhcbiIsIGJ1ZltPRkZTRVRfN10pOworCQkJYXRtX2luZm8odXNiYXRtLCAiVW5rbm93biBsaW5lIHN0YXRlICUwMnhcbiIsIHN0YXR1cyk7CisJCQlicmVhazsKIAkJfQotCQlicmVhazsKKworCQlpbnN0YW5jZS0+bGFzdF9zdGF0dXMgPSBzdGF0dXM7CiAJfQogfQogCkBAIC03MzAsNiArNzI4LDcgQEAKIAogCWluc3RhbmNlLT5zdGF0dXNfY2hlY2tlci50aW1lci5mdW5jdGlvbiA9IHNwZWVkdGNoX3N0YXR1c19wb2xsOwogCWluc3RhbmNlLT5zdGF0dXNfY2hlY2tlci50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2U7CisJaW5zdGFuY2UtPmxhc3Rfc3RhdHVzID0gMHhmZjsKIAlpbnN0YW5jZS0+cG9sbF9kZWxheSA9IE1JTl9QT0xMX0RFTEFZOwogCiAJaW5pdF90aW1lcigmaW5zdGFuY2UtPnJlc3VibWl0X3RpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCA2OWU4NTllLi5hZGZmNWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC00MjIsNiArNDIyLDE3IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKK3N0YXRpYyB2b2lkIGFjbV90dHlfdW5yZWdpc3RlcihzdHJ1Y3QgYWNtICphY20pCit7CisJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBhY20tPm1pbm9yKTsKKwl1c2JfcHV0X2ludGYoYWNtLT5jb250cm9sKTsKKwlhY21fdGFibGVbYWNtLT5taW5vcl0gPSBOVUxMOworCXVzYl9mcmVlX3VyYihhY20tPmN0cmx1cmIpOworCXVzYl9mcmVlX3VyYihhY20tPnJlYWR1cmIpOworCXVzYl9mcmVlX3VyYihhY20tPndyaXRldXJiKTsKKwlrZnJlZShhY20pOworfQorCiBzdGF0aWMgdm9pZCBhY21fdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7CkBAIC00MzYsMTQgKzQ0Nyw4IEBACiAJCQl1c2Jfa2lsbF91cmIoYWNtLT5jdHJsdXJiKTsKIAkJCXVzYl9raWxsX3VyYihhY20tPndyaXRldXJiKTsKIAkJCXVzYl9raWxsX3VyYihhY20tPnJlYWR1cmIpOwotCQl9IGVsc2UgewotCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBhY20tPm1pbm9yKTsKLQkJCWFjbV90YWJsZVthY20tPm1pbm9yXSA9IE5VTEw7Ci0JCQl1c2JfZnJlZV91cmIoYWNtLT5jdHJsdXJiKTsKLQkJCXVzYl9mcmVlX3VyYihhY20tPnJlYWR1cmIpOwotCQkJdXNiX2ZyZWVfdXJiKGFjbS0+d3JpdGV1cmIpOwotCQkJa2ZyZWUoYWNtKTsKLQkJfQorCQl9IGVsc2UKKwkJCWFjbV90dHlfdW5yZWdpc3RlcihhY20pOwogCX0KIAl1cCgmb3Blbl9zZW0pOwogfQpAQCAtOTA1LDcgKzkxMCw4IEBACiAKIAl1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmYWNtX2RyaXZlciwgZGF0YV9pbnRlcmZhY2UsIGFjbSk7CiAKLQl0dHlfcmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBtaW5vciwgJmludGYtPmRldik7CisJdXNiX2dldF9pbnRmKGNvbnRyb2xfaW50ZXJmYWNlKTsKKwl0dHlfcmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBtaW5vciwgJmNvbnRyb2xfaW50ZXJmYWNlLT5kZXYpOwogCiAJYWNtX3RhYmxlW21pbm9yXSA9IGFjbTsKIAl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBhY20pOwpAQCAtOTU0LDEyICs5NjAsNyBAQAogCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoJmFjbV9kcml2ZXIsIGFjbS0+ZGF0YSk7CiAKIAlpZiAoIWFjbS0+dXNlZCkgewotCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoYWNtX3R0eV9kcml2ZXIsIGFjbS0+bWlub3IpOwotCQlhY21fdGFibGVbYWNtLT5taW5vcl0gPSBOVUxMOwotCQl1c2JfZnJlZV91cmIoYWNtLT5jdHJsdXJiKTsKLQkJdXNiX2ZyZWVfdXJiKGFjbS0+cmVhZHVyYik7Ci0JCXVzYl9mcmVlX3VyYihhY20tPndyaXRldXJiKTsKLQkJa2ZyZWUoYWNtKTsKKwkJYWNtX3R0eV91bnJlZ2lzdGVyKGFjbSk7CiAJCXVwKCZvcGVuX3NlbSk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2J1ZmZlci5jIGIvZHJpdmVycy91c2IvY29yZS9idWZmZXIuYwppbmRleCBiNzgyN2RmLi5mYzE1YjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvYnVmZmVyLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogdm9pZCAqaGNkX2J1ZmZlcl9hbGxvYyAoCiAJc3RydWN0IHVzYl9idXMgCQkqYnVzLAogCXNpemVfdAkJCXNpemUsCi0JaW50CQkJbWVtX2ZsYWdzLAorCXVuc2lnbmVkCQltZW1fZmxhZ3MsCiAJZG1hX2FkZHJfdAkJKmRtYQogKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYwppbmRleCA3MWI0YThkLi5mYzA1NjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYwpAQCAtMzgwLDYgKzM4MCw3IEBACiAJCXVzYl9oY19kaWVkIChoY2QpOwogCX0KIAorCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIEVYUE9SVF9TWU1CT0wgKHVzYl9oY2RfcGNpX3Jlc3VtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCA4M2U3MzJhLi44NjE2MzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTExMTIsNyArMTExMiw3IEBACiAgKiBleHBlY3RzIHVzYl9zdWJtaXRfdXJiKCkgdG8gaGF2ZSBzYW5pdHkgY2hlY2tlZCBhbmQgY29uZGl0aW9uZWQgYWxsCiAgKiBpbnB1dHMgaW4gdGhlIHVyYgogICovCi1zdGF0aWMgaW50IGhjZF9zdWJtaXRfdXJiIChzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpCitzdGF0aWMgaW50IGhjZF9zdWJtaXRfdXJiIChzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlpbnQJCQlzdGF0dXM7CiAJc3RydWN0IHVzYl9oY2QJCSpoY2QgPSB1cmItPmRldi0+YnVzLT5oY3ByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oIGIvZHJpdmVycy91c2IvY29yZS9oY2QuaAppbmRleCA4ZGMxM2NkLi42N2RiNGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKQEAgLTE0MiwxMiArMTQyLDEyIEBACiAKIHN0cnVjdCB1c2Jfb3BlcmF0aW9ucyB7CiAJaW50ICgqZ2V0X2ZyYW1lX251bWJlcikgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KTsKLQlpbnQgKCpzdWJtaXRfdXJiKSAoc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKTsKKwlpbnQgKCpzdWJtaXRfdXJiKSAoc3RydWN0IHVyYiAqdXJiLCB1bnNpZ25lZCBtZW1fZmxhZ3MpOwogCWludCAoKnVubGlua191cmIpIChzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpOwogCiAJLyogYWxsb2NhdGUgZG1hLWNvbnNpc3RlbnQgYnVmZmVyIGZvciBVUkJfRE1BX05PTUFQUElORyAqLwogCXZvaWQgKigqYnVmZmVyX2FsbG9jKShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzaXplX3Qgc2l6ZSwKLQkJCWludCBtZW1fZmxhZ3MsCisJCQl1bnNpZ25lZCBtZW1fZmxhZ3MsCiAJCQlkbWFfYWRkcl90ICpkbWEpOwogCXZvaWQgKCpidWZmZXJfZnJlZSkoc3RydWN0IHVzYl9idXMgKmJ1cywgc2l6ZV90IHNpemUsCiAJCQl2b2lkICphZGRyLCBkbWFfYWRkcl90IGRtYSk7CkBAIC0yMDAsNyArMjAwLDcgQEAKIAlpbnQJKCp1cmJfZW5xdWV1ZSkgKHN0cnVjdCB1c2JfaGNkICpoY2QsCiAJCQkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsCiAJCQkJCXN0cnVjdCB1cmIgKnVyYiwKLQkJCQkJaW50IG1lbV9mbGFncyk7CisJCQkJCXVuc2lnbmVkIG1lbV9mbGFncyk7CiAJaW50CSgqdXJiX2RlcXVldWUpIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIpOwogCiAJLyogaHcgc3luY2gsIGZyZWVpbmcgZW5kcG9pbnQgcmVzb3VyY2VzIHRoYXQgdXJiX2RlcXVldWUgY2FuJ3QgKi8KQEAgLTI0Nyw3ICsyNDcsNyBAQAogdm9pZCBoY2RfYnVmZmVyX2Rlc3Ryb3kgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCiB2b2lkICpoY2RfYnVmZmVyX2FsbG9jIChzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzaXplX3Qgc2l6ZSwKLQlpbnQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpOworCXVuc2lnbmVkIG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKTsKIHZvaWQgaGNkX2J1ZmZlcl9mcmVlIChzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzaXplX3Qgc2l6ZSwKIAl2b2lkICphZGRyLCBkbWFfYWRkcl90IGRtYSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDMyZmYzMjEuLmMzZTQ2ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiZGV2aWNlX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00Nyw4ICs0OCw3IEBACiAvKiBXYWtlcyB1cCBraHViZCAqLwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtodWJkX3dhaXQpOwogCi1zdGF0aWMgcGlkX3Qga2h1YmRfcGlkID0gMDsJCQkvKiBQSUQgb2Yga2h1YmQgKi8KLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oa2h1YmRfZXhpdGVkKTsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmtodWJkX3Rhc2s7CiAKIC8qIGN5Y2xlIGxlZHMgb24gaHVicyB0aGF0IGFyZW4ndCBibGlua2luZyBmb3IgYXR0ZW50aW9uICovCiBzdGF0aWMgaW50IGJsaW5rZW5saWdodHMgPSAwOwpAQCAtMjgwNywyMyArMjgwNywxNiBAQAogCiBzdGF0aWMgaW50IGh1Yl90aHJlYWQodm9pZCAqX191bnVzZWQpCiB7Ci0JLyoKLQkgKiBUaGlzIHRocmVhZCBkb2Vzbid0IG5lZWQgYW55IHVzZXItbGV2ZWwgYWNjZXNzLAotCSAqIHNvIGdldCByaWQgb2YgYWxsIG91ciByZXNvdXJjZXMKLQkgKi8KLQotCWRhZW1vbml6ZSgia2h1YmQiKTsKLQlhbGxvd19zaWduYWwoU0lHS0lMTCk7Ci0KLQkvKiBTZW5kIG1lIGEgc2lnbmFsIHRvIGdldCBtZSBkaWUgKGZvciBkZWJ1Z2dpbmcpICovCiAJZG8gewogCQlodWJfZXZlbnRzKCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LCAhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsgCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LAorCQkJCSFsaXN0X2VtcHR5KCZodWJfZXZlbnRfbGlzdCkgfHwKKwkJCQlrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwogCQl0cnlfdG9fZnJlZXplKCk7Ci0JfSB3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8ICFsaXN0X2VtcHR5KCZodWJfZXZlbnRfbGlzdCkpOwogCi0JcHJfZGVidWcgKCIlczoga2h1YmQgZXhpdGluZ1xuIiwgdXNiY29yZV9uYW1lKTsKLQljb21wbGV0ZV9hbmRfZXhpdCgma2h1YmRfZXhpdGVkLCAwKTsKKwlwcl9kZWJ1ZygiJXM6IGtodWJkIGV4aXRpbmdcbiIsIHVzYmNvcmVfbmFtZSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBodWJfaWRfdGFibGUgW10gPSB7CkBAIC0yODQ5LDIwICsyODQyLDE1IEBACiAKIGludCB1c2JfaHViX2luaXQodm9pZCkKIHsKLQlwaWRfdCBwaWQ7Ci0KIAlpZiAodXNiX3JlZ2lzdGVyKCZodWJfZHJpdmVyKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVnaXN0ZXIgaHViIGRyaXZlclxuIiwKIAkJCXVzYmNvcmVfbmFtZSk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlwaWQgPSBrZXJuZWxfdGhyZWFkKGh1Yl90aHJlYWQsIE5VTEwsIENMT05FX0tFUk5FTCk7Ci0JaWYgKHBpZCA+PSAwKSB7Ci0JCWtodWJkX3BpZCA9IHBpZDsKLQorCWtodWJkX3Rhc2sgPSBrdGhyZWFkX3J1bihodWJfdGhyZWFkLCBOVUxMLCAia2h1YmQiKTsKKwlpZiAoIUlTX0VSUihraHViZF90YXNrKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogRmFsbCB0aHJvdWdoIGlmIGtlcm5lbF90aHJlYWQgZmFpbGVkICovCiAJdXNiX2RlcmVnaXN0ZXIoJmh1Yl9kcml2ZXIpOwpAQCAtMjg3MywxMiArMjg2MSw3IEBACiAKIHZvaWQgdXNiX2h1Yl9jbGVhbnVwKHZvaWQpCiB7Ci0JaW50IHJldDsKLQotCS8qIEtpbGwgdGhlIHRocmVhZCAqLwotCXJldCA9IGtpbGxfcHJvYyhraHViZF9waWQsIFNJR0tJTEwsIDEpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigma2h1YmRfZXhpdGVkKTsKKwlrdGhyZWFkX3N0b3Aoa2h1YmRfdGFzayk7CiAKIAkvKgogCSAqIEh1YiByZXNvdXJjZXMgYXJlIGZyZWVkIGZvciB1cyBieSB1c2JfZGVyZWdpc3Rlci4gSXQgY2FsbHMKQEAgLTI4OTAsNyArMjg3Myw2IEBACiAJdXNiX2RlcmVnaXN0ZXIoJmh1Yl9kcml2ZXIpOwogfSAvKiB1c2JfaHViX2NsZWFudXAoKSAqLwogCi0KIHN0YXRpYyBpbnQgY29uZmlnX2Rlc2NyaXB0b3JzX2NoYW5nZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJdW5zaWduZWQJCQlpbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKaW5kZXggZjUwYWFmMi4uYTQyOGVmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKQEAgLTMyMCw3ICszMjAsNyBAQAogCXN0cnVjdCBzY2F0dGVybGlzdAkqc2csCiAJaW50CQkJbmVudHMsCiAJc2l6ZV90CQkJbGVuZ3RoLAotCWludAkJCW1lbV9mbGFncworCXVuc2lnbmVkCQltZW1fZmxhZ3MKICkKIHsKIAlpbnQJCQlpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jIGIvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCmluZGV4IDc0MGNiNGMuLjAwMjk3ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKQEAgLTE5Niw2ICsxOTYsNyBAQAogdXNiX2Rlc2NyaXB0b3JfYXR0ciAoYkRldmljZVN1YkNsYXNzLCAiJTAyeFxuIikKIHVzYl9kZXNjcmlwdG9yX2F0dHIgKGJEZXZpY2VQcm90b2NvbCwgIiUwMnhcbiIpCiB1c2JfZGVzY3JpcHRvcl9hdHRyIChiTnVtQ29uZmlndXJhdGlvbnMsICIlZFxuIikKK3VzYl9kZXNjcmlwdG9yX2F0dHIgKGJNYXhQYWNrZXRTaXplMCwgIiVkXG4iKQogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGV2X2F0dHJzW10gPSB7CiAJLyogY3VycmVudCBjb25maWd1cmF0aW9uJ3MgYXR0cmlidXRlcyAqLwpAQCAtMjExLDYgKzIxMiw3IEBACiAJJmRldl9hdHRyX2JEZXZpY2VTdWJDbGFzcy5hdHRyLAogCSZkZXZfYXR0cl9iRGV2aWNlUHJvdG9jb2wuYXR0ciwKIAkmZGV2X2F0dHJfYk51bUNvbmZpZ3VyYXRpb25zLmF0dHIsCisJJmRldl9hdHRyX2JNYXhQYWNrZXRTaXplMC5hdHRyLAogCSZkZXZfYXR0cl9zcGVlZC5hdHRyLAogCSZkZXZfYXR0cl9kZXZudW0uYXR0ciwKIAkmZGV2X2F0dHJfdmVyc2lvbi5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91cmIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKaW5kZXggMGZhZjE4ZC4uYzBmZWVlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91cmIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCkBAIC02MCw3ICs2MCw3IEBACiAgKgogICogVGhlIGRyaXZlciBtdXN0IGNhbGwgdXNiX2ZyZWVfdXJiKCkgd2hlbiBpdCBpcyBmaW5pc2hlZCB3aXRoIHRoZSB1cmIuCiAgKi8KLXN0cnVjdCB1cmIgKnVzYl9hbGxvY191cmIoaW50IGlzb19wYWNrZXRzLCBpbnQgbWVtX2ZsYWdzKQorc3RydWN0IHVyYiAqdXNiX2FsbG9jX3VyYihpbnQgaXNvX3BhY2tldHMsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAKQEAgLTIyNCw3ICsyMjQsNyBAQAogICogICAgICBHRlBfTk9JTywgdW5sZXNzIGIpIG9yIGMpIGFwcGx5CiAgKgogICovCi1pbnQgdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKQoraW50IHVzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWludAkJCXBpcGUsIHRlbXAsIG1heDsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggYTNjNDIyMC4uOTljODVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC0xMTI5LDcgKzExMjksNyBAQAogdm9pZCAqdXNiX2J1ZmZlcl9hbGxvYyAoCiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKIAlzaXplX3Qgc2l6ZSwKLQlpbnQgbWVtX2ZsYWdzLAorCXVuc2lnbmVkIG1lbV9mbGFncywKIAlkbWFfYWRkcl90ICpkbWEKICkKIHsKQEAgLTE1MzIsNiArMTUzMiw5IEBACiBFWFBPUlRfU1lNQk9MKHVzYl9kZXJlZ2lzdGVyKTsKIEVYUE9SVF9TWU1CT0wodXNiX2Rpc2FibGVkKTsKIAorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2dldF9pbnRmKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9wdXRfaW50Zik7CisKIEVYUE9SVF9TWU1CT0wodXNiX2FsbG9jX2Rldik7CiBFWFBPUlRfU1lNQk9MKHVzYl9wdXRfZGV2KTsKIEVYUE9SVF9TWU1CT0wodXNiX2dldF9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jCmluZGV4IDRkNjkyNjcuLjU4M2RiN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMKQEAgLTQ3MCw3ICs0NzAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLWR1bW15X2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IG1lbV9mbGFncykKK2R1bW15X2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKl9lcCwgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCXN0cnVjdCBkdW1teV9lcAkJKmVwOwogCXN0cnVjdCBkdW1teV9yZXF1ZXN0CSpyZXE7CkBAIC01MDcsNyArNTA3LDcgQEAKIAlzdHJ1Y3QgdXNiX2VwICpfZXAsCiAJdW5zaWduZWQgYnl0ZXMsCiAJZG1hX2FkZHJfdCAqZG1hLAotCWludCBtZW1fZmxhZ3MKKwl1bnNpZ25lZCBtZW1fZmxhZ3MKICkgewogCWNoYXIJCQkqcmV0dmFsOwogCXN0cnVjdCBkdW1teV9lcAkJKmVwOwpAQCAtNTQwLDcgKzU0MCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWR1bW15X3F1ZXVlIChzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgaW50IG1lbV9mbGFncykKK2R1bW15X3F1ZXVlIChzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwKKwkJdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCXN0cnVjdCBkdW1teV9lcAkJKmVwOwogCXN0cnVjdCBkdW1teV9yZXF1ZXN0CSpyZXE7CkBAIC05OTgsNyArOTk5LDcgQEAKIAlzdHJ1Y3QgdXNiX2hjZAkJCSpoY2QsCiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50CSplcCwKIAlzdHJ1Y3QgdXJiCQkJKnVyYiwKLQlpbnQJCQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCQltZW1fZmxhZ3MKICkgewogCXN0cnVjdCBkdW1teQkqZHVtOwogCXN0cnVjdCB1cmJwCSp1cmJwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwppbmRleCA1YmI1M2FlLi44NTA5ZTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwpAQCAtOTQ1LDE1ICs5NDUsMTYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHZvaWQgZXRoX3N0YXJ0IChzdHJ1Y3QgZXRoX2RldiAqZGV2LCBpbnQgZ2ZwX2ZsYWdzKTsKLXN0YXRpYyBpbnQgYWxsb2NfcmVxdWVzdHMgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIG4sIGludCBnZnBfZmxhZ3MpOworc3RhdGljIHZvaWQgZXRoX3N0YXJ0IChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBnZnBfZmxhZ3MpOworc3RhdGljIGludCBhbGxvY19yZXF1ZXN0cyAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgbiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKTsKIAogc3RhdGljIGludAotc2V0X2V0aGVyX2NvbmZpZyAoc3RydWN0IGV0aF9kZXYgKmRldiwgaW50IGdmcF9mbGFncykKK3NldF9ldGhlcl9jb25maWcgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlpbnQJCQkJCXJlc3VsdCA9IDA7CiAJc3RydWN0IHVzYl9nYWRnZXQJCQkqZ2FkZ2V0ID0gZGV2LT5nYWRnZXQ7CiAKKyNpZiBkZWZpbmVkKERFVl9DT05GSUdfQ0RDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRVRIX1JORElTKQogCS8qIHN0YXR1cyBlbmRwb2ludCB1c2VkIGZvciBSTkRJUyBhbmQgKG9wdGlvbmFsbHkpIENEQyAqLwogCWlmICghc3Vic2V0X2FjdGl2ZShkZXYpICYmIGRldi0+c3RhdHVzX2VwKSB7CiAJCWRldi0+c3RhdHVzID0gZXBfZGVzYyAoZ2FkZ2V0LCAmaHNfc3RhdHVzX2Rlc2MsCkBAIC05NjcsNiArOTY4LDcgQEAKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0KKyNlbmRpZgogCiAJZGV2LT5pbiA9IGVwX2Rlc2MgKGRldi0+Z2FkZ2V0LCAmaHNfc291cmNlX2Rlc2MsICZmc19zb3VyY2VfZGVzYyk7CiAJZGV2LT5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBkZXY7CkBAIC0xMDc5LDcgKzEwODEsNyBAQAogICogdGhhdCByZXR1cm5zIGNvbmZpZyBkZXNjcmlwdG9ycywgYW5kIGFsdHNldHRpbmcgY29kZS4KICAqLwogc3RhdGljIGludAotZXRoX3NldF9jb25maWcgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIG51bWJlciwgaW50IGdmcF9mbGFncykKK2V0aF9zZXRfY29uZmlnIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBudW1iZXIsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlpbnQJCQlyZXN1bHQgPSAwOwogCXN0cnVjdCB1c2JfZ2FkZ2V0CSpnYWRnZXQgPSBkZXYtPmdhZGdldDsKQEAgLTE1OTYsNyArMTU5OCw3IEBACiBzdGF0aWMgdm9pZCByeF9jb21wbGV0ZSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKTsKIAogc3RhdGljIGludAotcnhfc3VibWl0IChzdHJ1Y3QgZXRoX2RldiAqZGV2LCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwgaW50IGdmcF9mbGFncykKK3J4X3N1Ym1pdCAoc3RydWN0IGV0aF9kZXYgKmRldiwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKIAlpbnQJCQlyZXR2YWwgPSAtRU5PTUVNOwpAQCAtMTcyMiw3ICsxNzI0LDcgQEAKIH0KIAogc3RhdGljIGludCBwcmVhbGxvYyAoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHVzYl9lcCAqZXAsCi0JCQl1bnNpZ25lZCBuLCBpbnQgZ2ZwX2ZsYWdzKQorCQkJdW5zaWduZWQgbiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXVuc2lnbmVkCQlpOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwpAQCAtMTc2MSw3ICsxNzYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbGxvY19yZXF1ZXN0cyAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgbiwgaW50IGdmcF9mbGFncykKK3N0YXRpYyBpbnQgYWxsb2NfcmVxdWVzdHMgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIG4sIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC0xNzc3LDcgKzE3NzksNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB2b2lkIHJ4X2ZpbGwgKHN0cnVjdCBldGhfZGV2ICpkZXYsIGludCBnZnBfZmxhZ3MpCitzdGF0aWMgdm9pZCByeF9maWxsIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CkBAIC0yMDIyLDcgKzIwMjQsNyBAQAogCiAjZW5kaWYJLyogUk5ESVMgKi8KIAotc3RhdGljIHZvaWQgZXRoX3N0YXJ0IChzdHJ1Y3QgZXRoX2RldiAqZGV2LCBpbnQgZ2ZwX2ZsYWdzKQorc3RhdGljIHZvaWQgZXRoX3N0YXJ0IChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJREVCVUcgKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0yNDI4LDcgKzI0MzAsNyBAQAogCWRldi0+cmVxLT5jb21wbGV0ZSA9IGV0aF9zZXR1cF9jb21wbGV0ZTsKIAogCS8qIC4uLiBhbmQgbWF5YmUgbGlrZXdpc2UgZm9yIHN0YXR1cyB0cmFuc2ZlciAqLwotI2lmZGVmIERFVl9DT05GSUdfQ0RDCisjaWYgZGVmaW5lZChERVZfQ09ORklHX0NEQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VUSF9STkRJUykKIAlpZiAoZGV2LT5zdGF0dXNfZXApIHsKIAkJZGV2LT5zdGF0X3JlcSA9IGV0aF9yZXFfYWxsb2MgKGRldi0+c3RhdHVzX2VwLAogCQkJCQlTVEFUVVNfQllURUNPVU5ULCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMKaW5kZXggZWQ3NzNhOS4uZWFhYjI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMKQEAgLTI2OSw3ICsyNjksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqCi1nb2t1X2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqX2VwLCBpbnQgZ2ZwX2ZsYWdzKQorZ29rdV9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKl9lcCwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBnb2t1X3JlcXVlc3QJKnJlcTsKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICoKIGdva3VfYWxsb2NfYnVmZmVyKHN0cnVjdCB1c2JfZXAgKl9lcCwgdW5zaWduZWQgYnl0ZXMsCi0JCQlkbWFfYWRkcl90ICpkbWEsIGludCAgZ2ZwX2ZsYWdzKQorCQkJZG1hX2FkZHJfdCAqZG1hLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJdm9pZAkJKnJldHZhbDsKIAlzdHJ1Y3QgZ29rdV9lcAkqZXA7CkBAIC03ODksNyArNzg5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBpbnQKLWdva3VfcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsIGludCBnZnBfZmxhZ3MpCitnb2t1X3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IGdva3VfcmVxdWVzdAkqcmVxOwogCXN0cnVjdCBnb2t1X2VwCQkqZXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCmluZGV4IGRmNzVhYjYuLjQ4NDI1NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCkBAIC0xMTA2LDcgKzExMDYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICpsaDdhNDB4X2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsCi0JCQkJCQkgaW50IGdmcF9mbGFncykKKwkJCQkJCSB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IGxoN2E0MHhfcmVxdWVzdCAqcmVxOwogCkBAIC0xMTM0LDcgKzExMzQsNyBAQAogfQogCiBzdGF0aWMgdm9pZCAqbGg3YTQweF9hbGxvY19idWZmZXIoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGJ5dGVzLAotCQkJCSAgZG1hX2FkZHJfdCAqIGRtYSwgaW50IGdmcF9mbGFncykKKwkJCQkgIGRtYV9hZGRyX3QgKiBkbWEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAljaGFyICpyZXR2YWw7CiAKQEAgLTExNTgsNyArMTE1OCw3IEBACiAgKiAgTk9URTogU2V0cyBJTkRFWCByZWdpc3RlcgogICovCiBzdGF0aWMgaW50IGxoN2E0MHhfcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsCi0JCQkgaW50IGdmcF9mbGFncykKKwkJCSB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IGxoN2E0MHhfcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBsaDdhNDB4X2VwICplcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCmluZGV4IDEzYTNkYmMuLjQ3N2ZhYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYwpAQCAtMzc2LDcgKzM3Niw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLW5ldDIyODBfYWxsb2NfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqX2VwLCBpbnQgZ2ZwX2ZsYWdzKQorbmV0MjI4MF9hbGxvY19yZXF1ZXN0IChzdHJ1Y3QgdXNiX2VwICpfZXAsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgbmV0MjI4MF9lcAkqZXA7CiAJc3RydWN0IG5ldDIyODBfcmVxdWVzdAkqcmVxOwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJc3RydWN0IHVzYl9lcAkJKl9lcCwKIAl1bnNpZ25lZAkJYnl0ZXMsCiAJZG1hX2FkZHJfdAkJKmRtYSwKLQlpbnQJCQlnZnBfZmxhZ3MKKwl1bnNpZ25lZAkJZ2ZwX2ZsYWdzCiApCiB7CiAJdm9pZAkJCSpyZXR2YWw7CkBAIC04OTcsNyArODk3LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBpbnQKLW5ldDIyODBfcXVldWUgKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCBpbnQgZ2ZwX2ZsYWdzKQorbmV0MjI4MF9xdWV1ZSAoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgbmV0MjI4MF9yZXF1ZXN0CSpyZXE7CiAJc3RydWN0IG5ldDIyODBfZXAJKmVwOwpAQCAtMTQ5MCw3ICsxNDkwLDcgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlpbnQJCQlpOwogCXUzMgkJCXQxLCB0MjsKLQljaGFyCQkJKnM7CisJY29uc3QgY2hhcgkJKnM7CiAKIAlkZXYgPSBkZXZfZ2V0X2RydmRhdGEgKF9kZXYpOwogCW5leHQgPSBidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCmluZGV4IGEyYjgxMmEuLmZmNTUzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCkBAIC0yNjksNyArMjY5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgotb21hcF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgZ2ZwX2ZsYWdzKQorb21hcF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IG9tYXBfcmVxCSpyZXE7CiAKQEAgLTI5OCw3ICsyOTgsNyBAQAogCXN0cnVjdCB1c2JfZXAJKl9lcCwKIAl1bnNpZ25lZAlieXRlcywKIAlkbWFfYWRkcl90CSpkbWEsCi0JaW50CQlnZnBfZmxhZ3MKKwl1bnNpZ25lZAlnZnBfZmxhZ3MKICkKIHsKIAl2b2lkCQkqcmV0dmFsOwpAQCAtOTM3LDcgKzkzNyw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgaW50Ci1vbWFwX2VwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCBpbnQgZ2ZwX2ZsYWdzKQorb21hcF9lcF9xdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBvbWFwX2VwCSplcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBvbWFwX2VwLCBlcCk7CiAJc3RydWN0IG9tYXBfcmVxCSpyZXEgPSBjb250YWluZXJfb2YoX3JlcSwgc3RydWN0IG9tYXBfcmVxLCByZXEpOwpAQCAtMjkwOCw2ICsyOTA4LDcgQEAKICAqIG1ha2UgaG9zdCByZXN1bWVzIGFuZCBWQlVTIGRldGVjdGlvbiB0cmlnZ2VyIE9NQVAgd2FrZXVwIGV2ZW50czsgdGhhdAogICogbWF5IGludm9sdmUgdGFsa2luZyB0byBhbiBleHRlcm5hbCB0cmFuc2NlaXZlciAoZS5nLiBpc3AxMzAxKS4KICAqLworCiBzdGF0aWMgaW50IG9tYXBfdWRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSwgdTMyIGxldmVsKQogewogCXUzMglkZXZzdGF0OwpAQCAtMjkzNiw4ICsyOTM3LDYgQEAKIAkJcmV0dXJuIDA7CiAKIAlEQkcoInJlc3VtZSArIHdha2V1cC9TUlBcbiIpOwotCXVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1ZGMtPmdhZGdldC5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCW9tYXBfcHVsbHVwKCZ1ZGMtPmdhZGdldCwgMSk7CiAKIAkvKiBtYXliZSB0aGUgaG9zdCB3b3VsZCBlbnVtZXJhdGUgdXMgaWYgd2UgbnVkZ2VkIGl0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYwppbmRleCA2YTBiOTU3Li4xNTA3NzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogICogCXB4YTJ4eF9lcF9hbGxvY19yZXF1ZXN0IC0gYWxsb2NhdGUgYSByZXF1ZXN0IGRhdGEgc3RydWN0dXJlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgotcHhhMnh4X2VwX2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IGdmcF9mbGFncykKK3B4YTJ4eF9lcF9hbGxvY19yZXF1ZXN0IChzdHJ1Y3QgdXNiX2VwICpfZXAsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgcHhhMnh4X3JlcXVlc3QgKnJlcTsKIApAQCAtMzY3LDcgKzM2Nyw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICoKIHB4YTJ4eF9lcF9hbGxvY19idWZmZXIoc3RydWN0IHVzYl9lcCAqX2VwLCB1bnNpZ25lZCBieXRlcywKLQlkbWFfYWRkcl90ICpkbWEsIGludCBnZnBfZmxhZ3MpCisJZG1hX2FkZHJfdCAqZG1hLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJY2hhcgkJCSpyZXR2YWw7CiAKQEAgLTg3NCw3ICs4NzQsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludAotcHhhMnh4X2VwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCBpbnQgZ2ZwX2ZsYWdzKQorcHhhMnh4X2VwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHB4YTJ4eF9yZXF1ZXN0CSpyZXE7CiAJc3RydWN0IHB4YTJ4eF9lcAkqZXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYwppbmRleCBhNmUwMzVlLi5iYjliMmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKQEAgLTYxMiw3ICs2MTIsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLXNvdXJjZV9zaW5rX3N0YXJ0X2VwIChzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGdmcF9mbGFncykKK3NvdXJjZV9zaW5rX3N0YXJ0X2VwIChzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwogCWludAkJCXN0YXR1czsKQEAgLTY0MCw3ICs2NDAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfc291cmNlX3NpbmtfY29uZmlnIChzdHJ1Y3QgemVyb19kZXYgKmRldiwgaW50IGdmcF9mbGFncykKK3NldF9zb3VyY2Vfc2lua19jb25maWcgKHN0cnVjdCB6ZXJvX2RldiAqZGV2LCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgdXNiX2VwCQkqZXA7CkBAIC03NDQsNyArNzQ0LDcgQEAKIH0KIAogc3RhdGljIGludAotc2V0X2xvb3BiYWNrX2NvbmZpZyAoc3RydWN0IHplcm9fZGV2ICpkZXYsIGludCBnZnBfZmxhZ3MpCitzZXRfbG9vcGJhY2tfY29uZmlnIChzdHJ1Y3QgemVyb19kZXYgKmRldiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCWludAkJCXJlc3VsdCA9IDA7CiAJc3RydWN0IHVzYl9lcAkJKmVwOwpAQCAtODQ1LDcgKzg0NSw3IEBACiAgKiBieSBsaW1pdGluZyBjb25maWd1cmF0aW9uIGNob2ljZXMgKGxpa2UgdGhlIHB4YTJ4eCkuCiAgKi8KIHN0YXRpYyBpbnQKLXplcm9fc2V0X2NvbmZpZyAoc3RydWN0IHplcm9fZGV2ICpkZXYsIHVuc2lnbmVkIG51bWJlciwgaW50IGdmcF9mbGFncykKK3plcm9fc2V0X2NvbmZpZyAoc3RydWN0IHplcm9fZGV2ICpkZXYsIHVuc2lnbmVkIG51bWJlciwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCWludAkJCXJlc3VsdCA9IDA7CiAJc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldCA9IGRldi0+Z2FkZ2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCmluZGV4IDM1MjQ4YTMuLjE0OWIxM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKQEAgLTk2MCw3ICs5NjAsNyBAQAogCXN0cnVjdCB1c2JfaGNkCSpoY2QsCiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKIAlzdHJ1Y3QgdXJiCSp1cmIsCi0JaW50CQltZW1fZmxhZ3MKKwl1bnNpZ25lZAltZW1fZmxhZ3MKICkgewogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSBoY2RfdG9fZWhjaSAoaGNkKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXF0ZF9saXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKaW5kZXggNDVkODlhNy4uZDc0YjJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCkBAIC04OTgsNyArODk4LDcgQEAKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLAogCXN0cnVjdCB1cmIJCSp1cmIsCiAJc3RydWN0IGxpc3RfaGVhZAkqcXRkX2xpc3QsCi0JaW50CQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCW1lbV9mbGFncwogKSB7CiAJc3RydWN0IGVoY2lfcXRkCQkqcXRkOwogCWludAkJCWVwbnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYwppbmRleCBjMjEwNGNhLi45YWY0ZjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYwpAQCAtNTg4LDcgKzU4OCw3IEBACiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKIAlzdHJ1Y3QgdXJiCQkqdXJiLAogCXN0cnVjdCBsaXN0X2hlYWQJKnF0ZF9saXN0LAotCWludAkJCW1lbV9mbGFncworCXVuc2lnbmVkCQltZW1fZmxhZ3MKICkgewogCXVuc2lnbmVkCQllcG51bTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKQEAgLTYzMyw3ICs2MzMsNyBAQAogLyogZWhjaV9pc29fc3RyZWFtIG9wcyB3b3JrIHdpdGggYm90aCBJVEQgYW5kIFNJVEQgKi8KIAogc3RhdGljIHN0cnVjdCBlaGNpX2lzb19zdHJlYW0gKgotaXNvX3N0cmVhbV9hbGxvYyAoaW50IG1lbV9mbGFncykKK2lzb19zdHJlYW1fYWxsb2MgKHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlzdHJ1Y3QgZWhjaV9pc29fc3RyZWFtICpzdHJlYW07CiAKQEAgLTg0Niw3ICs4NDYsNyBAQAogLyogZWhjaV9pc29fc2NoZWQgb3BzIGNhbiBiZSBJVEQtb25seSBvciBTSVRELW9ubHkgKi8KIAogc3RhdGljIHN0cnVjdCBlaGNpX2lzb19zY2hlZCAqCi1pc29fc2NoZWRfYWxsb2MgKHVuc2lnbmVkIHBhY2tldHMsIGludCBtZW1fZmxhZ3MpCitpc29fc2NoZWRfYWxsb2MgKHVuc2lnbmVkIHBhY2tldHMsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlzdHJ1Y3QgZWhjaV9pc29fc2NoZWQJKmlzb19zY2hlZDsKIAlpbnQJCQlzaXplID0gc2l6ZW9mICppc29fc2NoZWQ7CkBAIC05MTksNyArOTE5LDcgQEAKIAlzdHJ1Y3QgZWhjaV9pc29fc3RyZWFtCSpzdHJlYW0sCiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSwKIAlzdHJ1Y3QgdXJiCQkqdXJiLAotCWludAkJCW1lbV9mbGFncworCXVuc2lnbmVkCQltZW1fZmxhZ3MKICkKIHsKIAlzdHJ1Y3QgZWhjaV9pdGQJCSppdGQ7CkBAIC0xNDEyLDcgKzE0MTIsOCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IGl0ZF9zdWJtaXQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKQorc3RhdGljIGludCBpdGRfc3VibWl0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHN0cnVjdCB1cmIgKnVyYiwKKwl1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJaW50CQkJc3RhdHVzID0gLUVJTlZBTDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKQEAgLTE1MjMsNyArMTUyNCw3IEBACiAJc3RydWN0IGVoY2lfaXNvX3N0cmVhbQkqc3RyZWFtLAogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2ksCiAJc3RydWN0IHVyYgkJKnVyYiwKLQlpbnQJCQltZW1fZmxhZ3MKKwl1bnNpZ25lZAkJbWVtX2ZsYWdzCiApCiB7CiAJc3RydWN0IGVoY2lfc2l0ZAkqc2l0ZDsKQEAgLTE3NzIsNyArMTc3Myw4IEBACiB9CiAKIAotc3RhdGljIGludCBzaXRkX3N1Ym1pdCAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpCitzdGF0aWMgaW50IHNpdGRfc3VibWl0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHN0cnVjdCB1cmIgKnVyYiwKKwl1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJaW50CQkJc3RhdHVzID0gLUVJTlZBTDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKQEAgLTE4MjIsNyArMTgyNCw4IEBACiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIGludAotc2l0ZF9zdWJtaXQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKQorc2l0ZF9zdWJtaXQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IHVyYiAqdXJiLAorCXVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAllaGNpX2RiZyAoZWhjaSwgInNwbGl0IGlzbyBzdXBwb3J0IGlzIGRpc2FibGVkXG4iKTsKIAlyZXR1cm4gLUVOT1NZUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jIGIvZHJpdmVycy91c2IvaG9zdC9oY19jcmlzdjEwLmMKaW5kZXggZDk4ODNkNy4uODFmOGY2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9oY19jcmlzdjEwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9oY19jcmlzdjEwLmMKQEAgLTQ2Myw3ICs0NjMsOCBAQAogCiBzdGF0aWMgaW50IGV0cmF4X3JlbW92ZV9mcm9tX3NiX2xpc3Qoc3RydWN0IHVyYiAqdXJiKTsKIAotc3RhdGljIHZvaWQqIGV0cmF4X3VzYl9idWZmZXJfYWxsb2Moc3RydWN0IHVzYl9idXMqIGJ1cywgc2l6ZV90IHNpemUsIGludCBtZW1fZmxhZ3MsIGRtYV9hZGRyX3QgKmRtYSk7CitzdGF0aWMgdm9pZCogZXRyYXhfdXNiX2J1ZmZlcl9hbGxvYyhzdHJ1Y3QgdXNiX2J1cyogYnVzLCBzaXplX3Qgc2l6ZSwKKwl1bnNpZ25lZCBtZW1fZmxhZ3MsIGRtYV9hZGRyX3QgKmRtYSk7CiBzdGF0aWMgdm9pZCBldHJheF91c2JfYnVmZmVyX2ZyZWUoc3RydWN0IHVzYl9idXMgKmJ1cywgc2l6ZV90IHNpemUsIHZvaWQgKmFkZHIsIGRtYV9hZGRyX3QgZG1hKTsKIAogc3RhdGljIHZvaWQgZXRyYXhfdXNiX2FkZF90b19idWxrX3NiX2xpc3Qoc3RydWN0IHVyYiAqdXJiLCBpbnQgZXBpZCk7CkBAIC00NzYsNyArNDc3LDcgQEAKIHN0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF9pbnRyX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X2lzb2NfdXJiKHN0cnVjdCB1cmIgKnVyYik7CiAKLXN0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKTsKK3N0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCB1bnNpZ25lZCBtZW1fZmxhZ3MpOwogc3RhdGljIGludCBldHJheF91c2JfdW5saW5rX3VyYihzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpOwogc3RhdGljIGludCBldHJheF91c2JfZ2V0X2ZyYW1lX251bWJlcihzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldik7CiAKQEAgLTEyNjIsNyArMTI2Myw3IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncykKK3N0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCB1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJZXRyYXhfaGNfdCAqaGM7CiAJaW50IHJldCA9IC1FSU5WQUw7CkBAIC00Mjc3LDcgKzQyNzgsOCBAQAogfQogCiBzdGF0aWMgdm9pZCoKLWV0cmF4X3VzYl9idWZmZXJfYWxsb2Moc3RydWN0IHVzYl9idXMqIGJ1cywgc2l6ZV90IHNpemUsIGludCBtZW1fZmxhZ3MsIGRtYV9hZGRyX3QgKmRtYSkKK2V0cmF4X3VzYl9idWZmZXJfYWxsb2Moc3RydWN0IHVzYl9idXMqIGJ1cywgc2l6ZV90IHNpemUsCisJdW5zaWduZWQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpCiB7CiAgIHJldHVybiBrbWFsbG9jKHNpemUsIG1lbV9mbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKaW5kZXggZmYwYTE2OC4uNTBiMTk3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYwpAQCAtMTcsNyArMTcsNyBAQAogICogVGhlIGRyaXZlciBiYXNpY2FsbHkgd29ya3MuIEEgbnVtYmVyIG9mIHBlb3BsZSBoYXZlIHVzZWQgaXQgd2l0aCBhIHJhbmdlCiAgKiBvZiBkZXZpY2VzLgogICoKLSAqVGhlIGRyaXZlciBwYXNzZXMgYWxsIHVzYnRlc3RzIDEtMTQuCisgKiBUaGUgZHJpdmVyIHBhc3NlcyBhbGwgdXNidGVzdHMgMS0xNC4KICAqCiAgKiBTdXNwZW5kaW5nL3Jlc3VtaW5nIG9mIHJvb3QgaHViIHZpYSBzeXNmcyB3b3Jrcy4gUmVtb3RlIHdha2V1cCB3b3JrcyB0b28uCiAgKiBBbmQgc3VzcGVuZGluZy9yZXN1bWluZyBvZiBwbGF0Zm9ybSBkZXZpY2Ugd29ya3MgdG9vLiBTdXNwZW5kL3Jlc3VtZQpAQCAtMjI5LDcgKzIyOSw3IEBACiAJc3RydWN0IGlzcDExNnhfZXAgKmVwOwogCXN0cnVjdCB1cmIgKnVyYjsKIAlzdHJ1Y3QgcHRkICpwdGQ7Ci0JdTE2IHRvZ2dsZSwgZGlyLCBsZW47CisJdTE2IHRvZ2dsZSA9IDAsIGRpciA9IFBURF9ESVJfU0VUVVAsIGxlbjsKIAogCWZvciAoZXAgPSBpc3AxMTZ4LT5hdGxfYWN0aXZlOyBlcDsgZXAgPSBlcC0+YWN0aXZlKSB7CiAJCUJVR19PTihsaXN0X2VtcHR5KCZlcC0+aGVwLT51cmJfbGlzdCkpOwpAQCAtMjUxLDggKzI1MSw2IEBACiAJCQlkaXIgPSBQVERfRElSX09VVDsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QSURfU0VUVVA6Ci0JCQl0b2dnbGUgPSAwOwotCQkJZGlyID0gUFREX0RJUl9TRVRVUDsKIAkJCWxlbiA9IHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKIAkJCWVwLT5kYXRhID0gdXJiLT5zZXR1cF9wYWNrZXQ7CiAJCQlicmVhazsKQEAgLTI2NCwxMSArMjYyLDkgQEAKIAkJCSAgICA/IFBURF9ESVJfT1VUIDogUFREX0RJUl9JTjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJLyogVG8gcGxlYXNlIGdjYyAqLwotCQkJdG9nZ2xlID0gZGlyID0gMDsKIAkJCUVSUigiJXMgJWQ6IGVwLT5uZXh0cGlkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCQkgICAgZXAtPm5leHRwaWQpOwotCQkJQlVHX09OKDEpOworCQkJQlVHKCk7CiAJCX0KIAogCQlwdGQtPmNvdW50ID0gUFREX0NDX01TSyB8IFBURF9BQ1RJVkVfTVNLIHwgUFREX1RPR0dMRSh0b2dnbGUpOwpAQCAtNjk3LDcgKzY5Myw3IEBACiAKIHN0YXRpYyBpbnQgaXNwMTE2eF91cmJfZW5xdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAogCQkJICAgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwLCBzdHJ1Y3QgdXJiICp1cmIsCi0JCQkgICAgICAgaW50IG1lbV9mbGFncykKKwkJCSAgICAgICB1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdXJiLT5kZXY7CkBAIC03MTksNyArNzE1LDcgQEAKIAl9CiAJLyogYXZvaWQgYWxsIGFsbG9jYXRpb25zIHdpdGhpbiBzcGlubG9ja3M6IHJlcXVlc3Qgb3IgZW5kcG9pbnQgKi8KIAlpZiAoIWhlcC0+aGNwcml2KSB7Ci0JCWVwID0ga2NhbGxvYygxLCBzaXplb2YgKmVwLCAoX19mb3JjZSB1bnNpZ25lZCltZW1fZmxhZ3MpOworCQllcCA9IGtjYWxsb2MoMSwgc2l6ZW9mICplcCwgbWVtX2ZsYWdzKTsKIAkJaWYgKCFlcCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTEwNTQsNyArMTA1MCw3IEBACiAJCWJyZWFrOwogCWNhc2UgR2V0SHViU3RhdHVzOgogCQlEQkcoIkdldEh1YlN0YXR1c1xuIik7Ci0JCSooX19sZTMyICopIGJ1ZiA9IGNwdV90b19sZTMyKDApOworCQkqKF9fbGUzMiAqKSBidWYgPSAwOwogCQlicmVhazsKIAljYXNlIEdldFBvcnRTdGF0dXM6CiAJCURCRygiR2V0UG9ydFN0YXR1c1xuIik7CkBAIC0xODEwLDkgKzE4MDYsOSBAQAogCXJldCA9IHVzYl9zdXNwZW5kX2RldmljZShoY2QtPnNlbGYucm9vdF9odWIsIHN0YXRlKTsKIAlpZiAoIXJldCkgewogCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7Ci0JCUlORk8oIiVzIHN1c3BlbmRlZFxuIiwgKGNoYXIgKiloY2RfbmFtZSk7CisJCUlORk8oIiVzIHN1c3BlbmRlZFxuIiwgaGNkX25hbWUpOwogCX0gZWxzZQotCQlFUlIoIiVzIHN1c3BlbmQgZmFpbGVkXG4iLCAoY2hhciAqKWhjZF9uYW1lKTsKKwkJRVJSKCIlcyBzdXNwZW5kIGZhaWxlZFxuIiwgaGNkX25hbWUpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwppbmRleCAxM2NkMjE3Li42OGRlY2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCkBAIC0xODAsNyArMTgwLDcgQEAKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkLAogCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsCiAJc3RydWN0IHVyYgkqdXJiLAotCWludAkJbWVtX2ZsYWdzCisJdW5zaWduZWQJbWVtX2ZsYWdzCiApIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaSAoaGNkKTsKIAlzdHJ1Y3QgZWQJKmVkOwpAQCAtNjczLDggKzY3MywxMCBAQAogCiAJb2hjaV9kdW1wIChvaGNpLCAxKTsKIAotCWlmIChvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1YiA9PSBOVUxMKQorCWlmIChvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1YiA9PSBOVUxMKSB7CisJCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllciAoJm9oY2ktPnJlYm9vdF9ub3RpZmllcik7CiAJCWNyZWF0ZV9kZWJ1Z19maWxlcyAob2hjaSk7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKaW5kZXggZTJmYzQxMi4uODNjYTQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYwpAQCAtNDE5LDEwICs0MTksMTEgQEAKIAogCS8qIHR3byBiaXRtYXBzOiAgcG9ydHMgcmVtb3ZhYmxlLCBhbmQgdXNiIDEuMCBsZWdhY3kgUG9ydFB3ckN0cmxNYXNrICovCiAJcmggPSByb290aHViX2IgKG9oY2kpOworCW1lbXNldChkZXNjLT5iaXRtYXAsIDB4ZmYsIHNpemVvZihkZXNjLT5iaXRtYXApKTsKIAlkZXNjLT5iaXRtYXAgWzBdID0gcmggJiBSSF9CX0RSOwogCWlmIChwb3J0cyA+IDcpIHsKIAkJZGVzYy0+Yml0bWFwIFsxXSA9IChyaCAmIFJIX0JfRFIpID4+IDg7Ci0JCWRlc2MtPmJpdG1hcCBbMl0gPSBkZXNjLT5iaXRtYXAgWzNdID0gMHhmZjsKKwkJZGVzYy0+Yml0bWFwIFsyXSA9IDB4ZmY7CiAJfSBlbHNlCiAJCWRlc2MtPmJpdG1hcCBbMV0gPSAweGZmOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW1lbS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW1lbS5jCmluZGV4IDIzNzM1YTMuLmZkM2M0ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1tZW0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbWVtLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAogLyogVERzIC4uLiAqLwogc3RhdGljIHN0cnVjdCB0ZCAqCi10ZF9hbGxvYyAoc3RydWN0IG9oY2lfaGNkICpoYywgaW50IG1lbV9mbGFncykKK3RkX2FsbG9jIChzdHJ1Y3Qgb2hjaV9oY2QgKmhjLCB1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJZG1hX2FkZHJfdAlkbWE7CiAJc3RydWN0IHRkCSp0ZDsKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAvKiBFRHMgLi4uICovCiBzdGF0aWMgc3RydWN0IGVkICoKLWVkX2FsbG9jIChzdHJ1Y3Qgb2hjaV9oY2QgKmhjLCBpbnQgbWVtX2ZsYWdzKQorZWRfYWxsb2MgKHN0cnVjdCBvaGNpX2hjZCAqaGMsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlkbWFfYWRkcl90CWRtYTsKIAlzdHJ1Y3QgZWQJKmVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKaW5kZXggYjYyZDY5OS4uNWNkZTc2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCkBAIC00NTYsMzQgKzQ1NiwyMiBAQAogCiAjaWZkZWYJQ09ORklHX1BNCiAKLS8qIHN0YXRlcyBtYXRjaCBQQ0kgdXNhZ2UsIGFsd2F5cyBzdXNwZW5kaW5nIHRoZSByb290IGh1YiBleGNlcHQgdGhhdAotICogNCB+PSBEM2NvbGQgKEFDUEkgRDMpIHdpdGggY2xvY2sgb2ZmIChyZXN1bWUgc2VlcyByZXNldCkuCi0gKgotICogRklYTUU6IGFib3ZlIGNvbW1lbnQgaXMgbm90IHJpZ2h0LCBhbmQgY29kZSBpcyB3cm9uZywgdG9vIDotKC4KLSAqLwotCi1zdGF0aWMgaW50IG9oY2lfb21hcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCitzdGF0aWMgaW50IG9oY2lfb21hcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UsIHUzMiBsZXZlbCkKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAJaW50CQlzdGF0dXMgPSAtRUlOVkFMOwogCiAJaWYgKGxldmVsICE9IFNVU1BFTkRfUE9XRVJfRE9XTikKIAkJcmV0dXJuIDA7Ci0JaWYgKHN0YXRlIDw9IGRldi0+cG93ZXIucG93ZXJfc3RhdGUpCi0JCXJldHVybiAwOwogCi0JZGV2X2RiZyhkZXYsICJzdXNwZW5kIHRvICVkXG4iLCBzdGF0ZSk7CiAJZG93bigmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CiAJc3RhdHVzID0gb2hjaV9odWJfc3VzcGVuZChvaGNpX3RvX2hjZChvaGNpKSk7CiAJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChzdGF0ZSA+PSA0KSB7Ci0JCQlvbWFwX29oY2lfY2xvY2tfcG93ZXIoMCk7Ci0JCQlvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+c3RhdGUgPQotCQkJCQlVU0JfU1RBVEVfU1VTUEVOREVEOwotCQkJc3RhdGUgPSA0OwotCQl9CisJCW9tYXBfb2hjaV9jbG9ja19wb3dlcigwKTsKKwkJb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnN0YXRlID0KKwkJCVVTQl9TVEFURV9TVVNQRU5ERUQ7CiAJCW9oY2lfdG9faGNkKG9oY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKLQkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCX0KIAl1cCgmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTQ5NywyOSArNDg1LDIwIEBACiAJaWYgKGxldmVsICE9IFJFU1VNRV9QT1dFUl9PTikKIAkJcmV0dXJuIDA7CiAKLQlzd2l0Y2ggKGRldi0+cG93ZXIucG93ZXJfc3RhdGUpIHsKLQljYXNlIDA6Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQotCQkJbXNsZWVwKDUpOwotCQlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllczsKLQkJb21hcF9vaGNpX2Nsb2NrX3Bvd2VyKDEpOwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWRlZmF1bHQ6Ci0JCWRldl9kYmcoZGV2LCAicmVzdW1lIGZyb20gJWRcbiIsIGRldi0+cG93ZXIucG93ZXJfc3RhdGUpOworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKSkKKwkJbXNsZWVwKDUpOworCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOworCW9tYXBfb2hjaV9jbG9ja19wb3dlcigxKTsKICNpZmRlZglDT05GSUdfVVNCX1NVU1BFTkQKLQkJLyogZ2V0IGV4dHJhIGNsZWFudXAgZXZlbiBpZiByZW1vdGUgd2FrZXVwIGlzbid0IGluIHVzZSAqLwotCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZShvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yik7CisJLyogZ2V0IGV4dHJhIGNsZWFudXAgZXZlbiBpZiByZW1vdGUgd2FrZXVwIGlzbid0IGluIHVzZSAqLworCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKG9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViKTsKICNlbHNlCi0JCWRvd24oJm9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViLT5zZXJpYWxpemUpOwotCQlzdGF0dXMgPSBvaGNpX2h1Yl9yZXN1bWUob2hjaV90b19oY2Qob2hjaSkpOwotCQl1cCgmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CisJZG93bigmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CisJc3RhdHVzID0gb2hjaV9odWJfcmVzdW1lKG9oY2lfdG9faGNkKG9oY2kpKTsKKwl1cCgmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7CiAjZW5kaWYKLQkJaWYgKHN0YXR1cyA9PSAwKQotCQkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IDA7Ci0JCWJyZWFrOwotCX0KKwlpZiAoc3RhdHVzID09IDApCisJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCXJldHVybiBzdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCmluZGV4IDZjM2Y5MTBiLi43YTg5MGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKQEAgLTgxNSw3ICs4MTUsNyBAQAogCXN0cnVjdCB1c2JfaGNkCQkqaGNkLAogCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwLAogCXN0cnVjdCB1cmIJCSp1cmIsCi0JaW50CQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCW1lbV9mbGFncwogKSB7CiAJc3RydWN0IHNsODExCQkqc2w4MTEgPSBoY2RfdG9fc2w4MTEoaGNkKTsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9IHVyYi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jCmluZGV4IDI2OWQ4ZWYuLjM4YWViZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExX2NzLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0zODksMTEgKzM4OCw2IEBACiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAoZGV2X2luZm9fdCAqKSAmZHJpdmVyX25hbWU7CiAJY2xpZW50X3JlZy5BdHRyaWJ1dGVzID0gSU5GT19JT19DTElFTlQgfCBJTkZPX0NBUkRfU0hBUkU7Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnNsODExX2NzX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDE4LDYgKzQxMiw3IEBACiAJCS5uYW1lCT0gKGNoYXIgKilkcml2ZXJfbmFtZSwKIAl9LAogCS5hdHRhY2gJCT0gc2w4MTFfY3NfYXR0YWNoLAorCS5ldmVudAkJPSBzbDgxMV9jc19ldmVudCwKIAkuZGV0YWNoCQk9IHNsODExX2NzX2RldGFjaCwKIAkuaWRfdGFibGUJPSBzbDgxMV9pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMKaW5kZXggNWYxODA4NC4uYmJiMzZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jCkBAIC0xMTY0LDcgKzExNjQsNyBAQAogCiBzdGF0aWMgaW50IHVoY2lfdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwKIAkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKLQkJc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKQorCQlzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnIGIvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZwppbmRleCBmZDU5ZjZiLi4yOThlNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKQEAgLTI1OSwzICsyNTksMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIGF0aV9yZW1vdGUuCiAKK2NvbmZpZyBVU0JfS0VZU1BBTl9SRU1PVEUKKwl0cmlzdGF0ZSAiS2V5c3BhbiBETVIgVVNCIHJlbW90ZSBjb250cm9sIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVVNCICYmIElOUFVUICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgS2V5c3BhbiBETVIgVVNCIHJlbW90ZSBjb250cm9sLgorCSAgQ3VycmVudGx5IG9ubHkgdGhlIFVJQS0xMSB0eXBlIG9mIHJlY2VpdmVyIGhhcyBiZWVuIHRlc3RlZC4gIFRoZSB0YWcKKwkgIG9uIHRoZSByZWNlaXZlciB0aGF0IGNvbm5lY3RzIHRvIHRoZSBVU0IgcG9ydCBzaG91bGQgaGF2ZSBhIFAvTiB0aGF0CisJICB3aWxsIHRlbGwgeW91IHdoYXQgdHlwZSBvZiBETVIgeW91IGhhdmUuICBUaGUgVUlBLTEwIHR5cGUgaXMgbm90CisJICBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLiAgVGhpcyBkcml2ZXIgbWFwcyBhbGwgYnV0dG9ucyB0byBrZXlwcmVzcworCSAgZXZlbnRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBrZXlzcGFuX3JlbW90ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L01ha2VmaWxlIGIvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUKaW5kZXggODMxYjJiMC4uZjE1NDdiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUKQEAgLTMxLDYgKzMxLDcgQEAKIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLm8KIG9iai0kKENPTkZJR19VU0JfS0JEKQkJKz0gdXNia2JkLm8KIG9iai0kKENPTkZJR19VU0JfS0JUQUIpCQkrPSBrYnRhYi5vCitvYmotJChDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFKQkrPSBrZXlzcGFuX3JlbW90ZS5vCiBvYmotJChDT05GSUdfVVNCX01PVVNFKQkJKz0gdXNibW91c2Uubwogb2JqLSQoQ09ORklHX1VTQl9NVE9VQ0gpCSs9IG10b3VjaHVzYi5vCiBvYmotJChDT05GSUdfVVNCX0lUTVRPVUNIKQkrPSBpdG10b3VjaC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwppbmRleCAxMDBiNDliZC4uMjM1MGU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCkBAIC0xNDI4LDYgKzE0MjgsMTkgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX1NLSVAJMHgwMDAzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9DWUNMT1BTCTB4MDAwNAogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTEQJCTB4MGYxMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NBU1NZICAgICAgICAJMHgxMDAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUE9DS0VUQ0FTU1kJMHgxMDEwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTU9CSUxFQ0FTU1kJMHgxMDIwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfSldNCQkweDEwODAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ETU1QCQkweDEwODEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9VTUlQCQkweDEwOTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9WSURFT0NPTQkJMHgxMjAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ09NM0xBQgkJMHgyMDAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVEVMRVBPUlQJCTB4MjAxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX05FVFdPUktBTkFMWVNFUgkweDIwMjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QT1dFUkNPTlRST0wJMHgyMDMwCisKIAogLyoKICAqIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBibGFja2xpc3QgYnkgcXVpcmsgdHlwZS4KQEAgLTE0NjMsNiArMTQ3NiwxNyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9HUklGRklOLCBVU0JfREVWSUNFX0lEX1BPV0VSTUFURSwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9HUklGRklOLCBVU0JfREVWSUNFX0lEX1NPVU5ES05PQiwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9LQkdFQVIsIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTywgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9DQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9QT0NLRVRDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9NT0JJTEVDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9KV00sIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfRE1NUCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9VTUlQLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1ZJREVPQ09NLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0NPTTNMQUIsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfVEVMRVBPUlQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTkVUV09SS0FOQUxZU0VSLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1BPV0VSQ09OVFJPTCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEwMjRMUywgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEyMDhMUywgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUywgSElEX1FVSVJLX0lHTk9SRSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQva2V5c3Bhbl9yZW1vdGUuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkYzkzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMKQEAgLTAsMCArMSw2MzMgQEAKKy8qCisgKiBrZXlzcGFuX3JlbW90ZTogVVNCIGRyaXZlciBmb3IgdGhlIEtleXNwYW4gRE1SCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFp5bWV0YSBDb3Jwb3JhdGlvbiAtIE1pY2hhZWwgRG93bmV5IChkb3duZXlAenltZXRhLmNvbSkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIGRyaXZlciBoYXMgYmVlbiBwdXQgdG9nZXRoZXIgd2l0aCB0aGUgc3VwcG9ydCBvZiBJbm5vc3lzLCBJbmMuCisgKiBhbmQgS2V5c3BhbiwgSW5jIHRoZSBtYW51ZmFjdHVyZXJzIG9mIHRoZSBLZXlzcGFuIFVTQiBETVIgcHJvZHVjdC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2RlZmluZSBEUklWRVJfVkVSU0lPTgkidjAuMSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiTWljaGFlbCBEb3duZXkgPGRvd25leUB6eW1ldGEuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJIkRyaXZlciBmb3IgdGhlIFVTQiBLZXlzcGFuIHJlbW90ZSBjb250cm9sLiIKKyNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UJIkdQTCIKKworLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIGRyaXZlci4gKi8KK3N0YXRpYyBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGV4dHJhIGRlYnVnIG1lc3NhZ2VzIGFuZCBpbmZvcm1hdGlvbiIpOworCisvKiBWZW5kb3IgYW5kIHByb2R1Y3QgaWRzICovCisjZGVmaW5lIFVTQl9LRVlTUEFOX1ZFTkRPUl9JRAkJMHgwNkNECisjZGVmaW5lIFVTQl9LRVlTUEFOX1BST0RVQ1RfVUlBMTEJMHgwMjAyCisKKy8qIERlZmluZXMgZm9yIGNvbnZlcnRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgcmVtb3RlLiAqLworI2RlZmluZSBaRVJPCQkweDE4CisjZGVmaW5lIFpFUk9fTUFTSwkweDFGCS8qIDUgYml0cyBmb3IgYSAwICovCisjZGVmaW5lIE9ORQkJMHgzQworI2RlZmluZSBPTkVfTUFTSwkweDNGCS8qIDYgYml0cyBmb3IgYSAxICovCisjZGVmaW5lIFNZTkMJCTB4M0Y4MAorI2RlZmluZSBTWU5DX01BU0sJMHgzRkZGCS8qIDE0IGJpdHMgZm9yIGEgU1lOQyBzZXF1ZW5jZSAqLworI2RlZmluZSBTVE9QCQkweDAwCisjZGVmaW5lIFNUT1BfTUFTSwkweDFGCS8qIDUgYml0cyBmb3IgdGhlIFNUT1Agc2VxdWVuY2UgKi8KKyNkZWZpbmUgR0FQCQkweEZGCisKKyNkZWZpbmUgUkVDVl9TSVpFCTgJLyogVGhlIFVJQS0xMSB0eXBlIGhhdmUgYSA4IGJ5dGUgbGltaXQuICovCisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBrZXlzcGFuX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKFVTQl9LRVlTUEFOX1ZFTkRPUl9JRCwgVVNCX0tFWVNQQU5fUFJPRFVDVF9VSUExMSkgfSwKKwl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCisvKiBTdHJ1Y3R1cmUgdG8gc3RvcmUgYWxsIHRoZSByZWFsIHN0dWZmIHRoYXQgYSByZW1vdGUgc2VuZHMgdG8gdXMuICovCitzdHJ1Y3Qga2V5c3Bhbl9tZXNzYWdlIHsKKwl1MTYJc3lzdGVtOworCXU4CWJ1dHRvbjsKKwl1OAl0b2dnbGU7Cit9OworCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgYWxsIHRoZSBiaXQgdGVzdGluZyBtYWdpYyBuZWVkZWQgdG8gYmUgZG9uZS4gKi8KK3N0cnVjdCBiaXRfdGVzdGVyIHsKKwl1MzIJdGVzdGVyOworCWludAlsZW47CisJaW50CXBvczsKKwlpbnQJYml0c19sZWZ0OworCXU4CWJ1ZmZlclszMl07Cit9OworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRyaXZlciBzcGVjaWZpYyBzdHVmZiAqLworc3RydWN0IHVzYl9rZXlzcGFuIHsKKwljaGFyCQkJCW5hbWVbMTI4XTsKKwljaGFyCQkJCXBoeXNbNjRdOworCXN0cnVjdCB1c2JfZGV2aWNlKgkJdWRldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2CQlpbnB1dDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSoJCWludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGluX2VuZHBvaW50OworCXN0cnVjdCB1cmIqCQkJaXJxX3VyYjsKKwlpbnQJCQkJb3BlbjsKKwlkbWFfYWRkcl90CQkJaW5fZG1hOworCXVuc2lnbmVkIGNoYXIqCQkJaW5fYnVmZmVyOworCisJLyogdmFyaWFibGVzIHVzZWQgdG8gcGFyc2UgbWVzc2FnZXMgZnJvbSByZW1vdGUuICovCisJc3RydWN0IGJpdF90ZXN0ZXIJCWRhdGE7CisJaW50CQkJCXN0YWdlOworCWludAkJCQl0b2dnbGU7Cit9OworCisvKgorICogVGFibGUgdGhhdCBtYXBzIHRoZSAzMSBwb3NzaWJsZSBrZXljb2RlcyB0byBpbnB1dCBrZXlzLgorICogQ3VycmVudGx5IHRoZXJlIGFyZSAxNSBhbmQgMTcgYnV0dG9uIG1vZGVscyBzbyBSRVNFUlZFRCBjb2RlcworICogYXJlIGJsYW5rIGFyZWFzIGluIHRoZSBtYXBwaW5nLgorICovCitzdGF0aWMgaW50IGtleXNwYW5fa2V5X3RhYmxlW10gPSB7CisJS0VZX1JFU0VSVkVELAkJLyogMCBpcyBqdXN0IGEgcGxhY2UgaG9sZGVyLiAqLworCUtFWV9SRVNFUlZFRCwKKwlLRVlfU1RPUCwKKwlLRVlfUExBWUNELAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfUFJFVklPVVNTT05HLAorCUtFWV9SRVdJTkQsCisJS0VZX0ZPUldBUkQsCisJS0VZX05FWFRTT05HLAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1JFU0VSVkVELAorCUtFWV9QQVVTRSwKKwlLRVlfVk9MVU1FVVAsCisJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1ZPTFVNRURPV04sCisJS0VZX1JFU0VSVkVELAorCUtFWV9VUCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX01VVEUsCisJS0VZX0xFRlQsCisJS0VZX0VOVEVSLAorCUtFWV9SSUdIVCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1JFU0VSVkVELAorCUtFWV9ET1dOLAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfS1BBU1RFUklTSywKKwlLRVlfUkVTRVJWRUQsCisJS0VZX01FTlUKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBrZXlzcGFuX2RyaXZlcjsKKworLyoKKyAqIERlYnVnIHJvdXRpbmUgdGhhdCBwcmludHMgb3V0IHdoYXQgd2UndmUgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlLgorICovCitzdGF0aWMgdm9pZCBrZXlzcGFuX3ByaW50KHN0cnVjdCB1c2Jfa2V5c3BhbiogZGV2KSAvKnVuc2lnbmVkIGNoYXIqIGRhdGEpKi8KK3sKKwljaGFyIGNvZGVzWzQqUkVDVl9TSVpFXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSRUNWX1NJWkU7IGkrKykgeworCQlzbnByaW50Zihjb2RlcytpKjMsIDQsICIlMDJ4ICIsIGRldi0+aW5fYnVmZmVyW2ldKTsKKwl9CisKKwlkZXZfaW5mbygmZGV2LT51ZGV2LT5kZXYsICIlc1xuIiwgY29kZXMpOworfQorCisvKgorICogUm91dGluZSB0aGF0IG1hbmFnZXMgdGhlIGJpdF90ZXN0ZXIgc3RydWN0dXJlLiAgSXQgbWFrZXMgc3VyZSB0aGF0IHRoZXJlIGFyZQorICogYXQgbGVhc3QgYml0c19uZWVkZWQgYml0cyBsb2FkZWQgaW50byB0aGUgdGVzdGVyLgorICovCitzdGF0aWMgaW50IGtleXNwYW5fbG9hZF90ZXN0ZXIoc3RydWN0IHVzYl9rZXlzcGFuKiBkZXYsIGludCBiaXRzX25lZWRlZCkKK3sKKwlpZiAoZGV2LT5kYXRhLmJpdHNfbGVmdCA+PSBiaXRzX25lZWRlZCkKKwkJcmV0dXJuKDApOworCisJLyoKKwkgKiBTb21laG93IHdlJ3ZlIG1pc3NlZCB0aGUgbGFzdCBtZXNzYWdlLiBUaGUgbWVzc2FnZSB3aWxsIGJlIHJlcGVhdGVkCisJICogdGhvdWdoIHNvIGl0J3Mgbm90IHRvbyBiaWcgYSBkZWFsCisJICovCisJaWYgKGRldi0+ZGF0YS5wb3MgPj0gZGV2LT5kYXRhLmxlbikgeworCQlkZXZfZGJnKCZkZXYtPnVkZXYsICIlcyAtIEVycm9yIHJhbiBvdXQgb2YgZGF0YS4gcG9zOiAlZCwgbGVuOiAlZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgZGV2LT5kYXRhLnBvcywgZGV2LT5kYXRhLmxlbik7CisJCXJldHVybigtMSk7CisJfQorCisJLyogTG9hZCBhcyBtdWNoIGFzIHdlIGNhbiBpbnRvIHRoZSB0ZXN0ZXIuICovCisJd2hpbGUgKChkZXYtPmRhdGEuYml0c19sZWZ0ICsgNyA8IChzaXplb2YoZGV2LT5kYXRhLnRlc3RlcikgKiA4KSkgJiYKKwkgICAgICAgKGRldi0+ZGF0YS5wb3MgPCBkZXYtPmRhdGEubGVuKSkgeworCQlkZXYtPmRhdGEudGVzdGVyICs9IChkZXYtPmRhdGEuYnVmZmVyW2Rldi0+ZGF0YS5wb3MrK10gPDwgZGV2LT5kYXRhLmJpdHNfbGVmdCk7CisJCWRldi0+ZGF0YS5iaXRzX2xlZnQgKz0gODsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBSb3V0aW5lIHRoYXQgaGFuZGxlcyBhbGwgdGhlIGxvZ2ljIG5lZWRlZCB0byBwYXJzZSBvdXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgcmVtb3RlLgorICovCitzdGF0aWMgdm9pZCBrZXlzcGFuX2NoZWNrX2RhdGEoc3RydWN0IHVzYl9rZXlzcGFuICpyZW1vdGUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCWludCBmb3VuZCA9IDA7CisJc3RydWN0IGtleXNwYW5fbWVzc2FnZSBtZXNzYWdlOworCisJc3dpdGNoKHJlbW90ZS0+c3RhZ2UpIHsKKwljYXNlIDA6CisJCS8qCisJCSAqIEluIHN0YWdlIDAgd2Ugd2FudCB0byBmaW5kIHRoZSBzdGFydCBvZiBhIG1lc3NhZ2UuICBUaGUgcmVtb3RlIHNlbmRzIGEgMHhGRiBhcyBmaWxsZXIuCisJCSAqIFNvIHRoZSBmaXJzdCBieXRlIHRoYXQgaXNuJ3QgYSBGRiBzaG91bGQgYmUgdGhlIHN0YXJ0IG9mIGEgbmV3IG1lc3NhZ2UuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgUkVDVl9TSVpFICYmIHJlbW90ZS0+aW5fYnVmZmVyW2ldID09IEdBUDsgKytpKTsKKworCQlpZiAoaSA8IFJFQ1ZfU0laRSkgeworCQkJbWVtY3B5KHJlbW90ZS0+ZGF0YS5idWZmZXIsIHJlbW90ZS0+aW5fYnVmZmVyLCBSRUNWX1NJWkUpOworCQkJcmVtb3RlLT5kYXRhLmxlbiA9IFJFQ1ZfU0laRTsKKwkJCXJlbW90ZS0+ZGF0YS5wb3MgPSAwOworCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IDA7CisJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0ID0gMDsKKwkJCXJlbW90ZS0+c3RhZ2UgPSAxOworCQl9CisJCWJyZWFrOworCisJY2FzZSAxOgorCQkvKgorCQkgKiBTdGFnZSAxIHdlIHNob3VsZCBoYXZlIDE2IGJ5dGVzIGFuZCBzaG91bGQgYmUgYWJsZSB0byBkZXRlY3QgYQorCQkgKiBTWU5DLiAgVGhlIFNZTkMgaXMgMTQgYml0cywgNyAwJ3MgYW5kIHRoZW4gNyAxJ3MuCisJCSAqLworCQltZW1jcHkocmVtb3RlLT5kYXRhLmJ1ZmZlciArIHJlbW90ZS0+ZGF0YS5sZW4sIHJlbW90ZS0+aW5fYnVmZmVyLCBSRUNWX1NJWkUpOworCQlyZW1vdGUtPmRhdGEubGVuICs9IFJFQ1ZfU0laRTsKKworCQlmb3VuZCA9IDA7CisJCXdoaWxlICgocmVtb3RlLT5kYXRhLmJpdHNfbGVmdCA+PSAxNCB8fCByZW1vdGUtPmRhdGEucG9zIDwgcmVtb3RlLT5kYXRhLmxlbikgJiYgIWZvdW5kKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisJCQkJaWYgKGtleXNwYW5fbG9hZF90ZXN0ZXIocmVtb3RlLCAxNCkgIT0gMCkgeworCQkJCQlyZW1vdGUtPnN0YWdlID0gMDsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWlmICgocmVtb3RlLT5kYXRhLnRlc3RlciAmIFNZTkNfTUFTSykgPT0gU1lOQykgeworCQkJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiAxNDsKKwkJCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCAtPSAxNDsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiAxOworCQkJCQktLXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQ7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCFmb3VuZCkgeworCQkJcmVtb3RlLT5zdGFnZSA9IDA7CisJCQlyZW1vdGUtPmRhdGEubGVuID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJlbW90ZS0+c3RhZ2UgPSAyOworCQl9CisJCWJyZWFrOworCisJY2FzZSAyOgorCQkvKgorCQkgKiBTdGFnZSAyIHdlIHNob3VsZCBoYXZlIDI0IGJ5dGVzIHdoaWNoIHdpbGwgYmUgZW5vdWdoIGZvciBhIGZ1bGwKKwkJICogbWVzc2FnZS4gIFdlIG5lZWQgdG8gcGFyc2Ugb3V0IHRoZSBzeXN0ZW0gY29kZSwgYnV0dG9uIGNvZGUsCisJCSAqIHRvZ2dsZSBjb2RlLCBhbmQgc3RvcC4KKwkJICovCisJCW1lbWNweShyZW1vdGUtPmRhdGEuYnVmZmVyICsgcmVtb3RlLT5kYXRhLmxlbiwgcmVtb3RlLT5pbl9idWZmZXIsIFJFQ1ZfU0laRSk7CisJCXJlbW90ZS0+ZGF0YS5sZW4gKz0gUkVDVl9TSVpFOworCisJCW1lc3NhZ2Uuc3lzdGVtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworCQkJa2V5c3Bhbl9sb2FkX3Rlc3RlcihyZW1vdGUsIDYpOworCisJCQlpZiAoKHJlbW90ZS0+ZGF0YS50ZXN0ZXIgJiBaRVJPX01BU0spID09IFpFUk8pIHsKKwkJCQltZXNzYWdlLnN5c3RlbSA9IG1lc3NhZ2Uuc3lzdGVtIDw8IDE7CisJCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gNTsKKwkJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0IC09IDU7CisJCQl9IGVsc2UgaWYgKChyZW1vdGUtPmRhdGEudGVzdGVyICYgT05FX01BU0spID09IE9ORSkgeworCQkJCW1lc3NhZ2Uuc3lzdGVtID0gKG1lc3NhZ2Uuc3lzdGVtIDw8IDEpICsgMTsKKwkJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiA2OworCQkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgLT0gNjsKKwkJCX0gZWxzZSB7CisJCQkJZXJyKCIlcyAtIFVua25vd24gc2VxdWVuY2UgZm91bmQgaW4gc3lzdGVtIGRhdGEuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJlbW90ZS0+c3RhZ2UgPSAwOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCW1lc3NhZ2UuYnV0dG9uID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJa2V5c3Bhbl9sb2FkX3Rlc3RlcihyZW1vdGUsIDYpOworCisJCQlpZiAoKHJlbW90ZS0+ZGF0YS50ZXN0ZXIgJiBaRVJPX01BU0spID09IFpFUk8pIHsKKwkJCQltZXNzYWdlLmJ1dHRvbiA9IG1lc3NhZ2UuYnV0dG9uIDw8IDE7CisJCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gNTsKKwkJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0IC09IDU7CisJCQl9IGVsc2UgaWYgKChyZW1vdGUtPmRhdGEudGVzdGVyICYgT05FX01BU0spID09IE9ORSkgeworCQkJCW1lc3NhZ2UuYnV0dG9uID0gKG1lc3NhZ2UuYnV0dG9uIDw8IDEpICsgMTsKKwkJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiA2OworCQkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgLT0gNjsKKwkJCX0gZWxzZSB7CisJCQkJZXJyKCIlcyAtIFVua25vd24gc2VxdWVuY2UgZm91bmQgaW4gYnV0dG9uIGRhdGEuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJlbW90ZS0+c3RhZ2UgPSAwOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCWtleXNwYW5fbG9hZF90ZXN0ZXIocmVtb3RlLCA2KTsKKwkJaWYgKChyZW1vdGUtPmRhdGEudGVzdGVyICYgWkVST19NQVNLKSA9PSBaRVJPKSB7CisJCQltZXNzYWdlLnRvZ2dsZSA9IDA7CisJCQlyZW1vdGUtPmRhdGEudGVzdGVyID0gcmVtb3RlLT5kYXRhLnRlc3RlciA+PiA1OworCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCAtPSA1OworCQl9IGVsc2UgaWYgKChyZW1vdGUtPmRhdGEudGVzdGVyICYgT05FX01BU0spID09IE9ORSkgeworCQkJbWVzc2FnZS50b2dnbGUgPSAxOworCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gNjsKKwkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgLT0gNjsKKwkJfSBlbHNlIHsKKwkJCWVycigiJXMgLSBFcnJvciBpbiBtZXNzYWdlLCBpbnZhbGlkIHRvZ2dsZS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCX0KKworCQlrZXlzcGFuX2xvYWRfdGVzdGVyKHJlbW90ZSwgNSk7CisJCWlmICgocmVtb3RlLT5kYXRhLnRlc3RlciAmIFNUT1BfTUFTSykgPT0gU1RPUCkgeworCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gNTsKKwkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgLT0gNTsKKwkJfSBlbHNlIHsKKwkJCWVycigiQmFkIG1lc3NhZ2UgcmVjaWV2ZWQsIG5vIHN0b3AgYml0IGZvdW5kLlxuIik7CisJCX0KKworCQlkZXZfZGJnKCZyZW1vdGUtPnVkZXYsCisJCQkiJXMgZm91bmQgdmFsaWQgbWVzc2FnZTogc3lzdGVtOiAlZCwgYnV0dG9uOiAlZCwgdG9nZ2xlOiAlZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgbWVzc2FnZS5zeXN0ZW0sIG1lc3NhZ2UuYnV0dG9uLCBtZXNzYWdlLnRvZ2dsZSk7CisKKwkJaWYgKG1lc3NhZ2UudG9nZ2xlICE9IHJlbW90ZS0+dG9nZ2xlKSB7CisJCQlpbnB1dF9yZWdzKCZyZW1vdGUtPmlucHV0LCByZWdzKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoJnJlbW90ZS0+aW5wdXQsIGtleXNwYW5fa2V5X3RhYmxlW21lc3NhZ2UuYnV0dG9uXSwgMSk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KCZyZW1vdGUtPmlucHV0LCBrZXlzcGFuX2tleV90YWJsZVttZXNzYWdlLmJ1dHRvbl0sIDApOworCQkJaW5wdXRfc3luYygmcmVtb3RlLT5pbnB1dCk7CisJCQlyZW1vdGUtPnRvZ2dsZSA9IG1lc3NhZ2UudG9nZ2xlOworCQl9CisKKwkJcmVtb3RlLT5zdGFnZSA9IDA7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFJvdXRpbmUgZm9yIHNlbmRpbmcgYWxsIHRoZSBpbml0aWFsaXphdGlvbiBtZXNzYWdlcyB0byB0aGUgcmVtb3RlLgorICovCitzdGF0aWMgaW50IGtleXNwYW5fc2V0dXAoc3RydWN0IHVzYl9kZXZpY2UqIGRldikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAorCQkJCSAweDExLCAweDQwLCAweDU2MDEsIDB4MCwgTlVMTCwgMCwgMCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHNldCBiaXQgcmF0ZSBkdWUgdG8gZXJyb3I6ICVkXG4iLAorCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQlyZXR1cm4ocmV0dmFsKTsKKwl9CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCQkgMHg0NCwgMHg0MCwgMHgwLCAweDAsIE5VTEwsIDAsIDApOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICIlcyAtIGZhaWxlZCB0byBzZXQgcmVzdW1lIHNlbnNpdGl2aXR5IGR1ZSB0byBlcnJvcjogJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCXJldHVybihyZXR2YWwpOworCX0KKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAorCQkJCSAweDIyLCAweDQwLCAweDAsIDB4MCwgTlVMTCwgMCwgMCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHR1cm4gcmVjZWl2ZSBvbiBkdWUgdG8gZXJyb3I6ICVkXG4iLAorCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQlyZXR1cm4ocmV0dmFsKTsKKwl9CisKKwlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIC0gU2V0dXAgY29tcGxldGUuXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogUm91dGluZSB1c2VkIHRvIGhhbmRsZSBhIG5ldyBtZXNzYWdlIHRoYXQgaGFzIGNvbWUgaW4uCisgKi8KK3N0YXRpYyB2b2lkIGtleXNwYW5faXJxX3JlY3Yoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXNiX2tleXNwYW4gKmRldiA9IHVyYi0+Y29udGV4dDsKKwlpbnQgcmV0dmFsOworCisJLyogQ2hlY2sgb3VyIHN0YXR1cyBpbiBjYXNlIHdlIG5lZWQgdG8gYmFpbCBvdXQgZWFybHkuICovCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisKKwkvKiBEZXZpY2Ugd2VudCBhd2F5IHNvIGRvbid0IGtlZXAgdHJ5aW5nIHRvIHJlYWQgZnJvbSBpdC4gKi8KKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCWdvdG8gcmVzdWJtaXQ7CisJCWJyZWFrOworCX0KKworCWlmIChkZWJ1ZykKKwkJa2V5c3Bhbl9wcmludChkZXYpOworCisJa2V5c3Bhbl9jaGVja19kYXRhKGRldiwgcmVncyk7CisKK3Jlc3VibWl0OgorCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkKKwkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQ6ICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworfQorCitzdGF0aWMgaW50IGtleXNwYW5fb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHVzYl9rZXlzcGFuICpyZW1vdGUgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAocmVtb3RlLT5vcGVuKyspCisJCXJldHVybiAwOworCisJcmVtb3RlLT5pcnFfdXJiLT5kZXYgPSByZW1vdGUtPnVkZXY7CisJaWYgKHVzYl9zdWJtaXRfdXJiKHJlbW90ZS0+aXJxX3VyYiwgR0ZQX0tFUk5FTCkpIHsKKwkJcmVtb3RlLT5vcGVuLS07CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBrZXlzcGFuX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2tleXNwYW4gKnJlbW90ZSA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghLS1yZW1vdGUtPm9wZW4pCisJCXVzYl9raWxsX3VyYihyZW1vdGUtPmlycV91cmIpOworfQorCisvKgorICogUm91dGluZSB0aGF0IHNldHMgdXAgdGhlIGRyaXZlciB0byBoYW5kbGUgYSBzcGVjaWZpYyBVU0IgZGV2aWNlIGRldGVjdGVkIG9uIHRoZSBidXMuCisgKi8KK3N0YXRpYyBpbnQga2V5c3Bhbl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJaW50IGk7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJY2hhciBwYXRoWzY0XTsKKwljaGFyICpidWY7CisJc3RydWN0IHVzYl9rZXlzcGFuICpyZW1vdGUgPSBOVUxMOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisKKwkvKiBTZWUgaWYgdGhlIG9mZmVyZWQgZGV2aWNlIG1hdGNoZXMgd2hhdCB3ZSBjYW4gYWNjZXB0ICovCisJaWYgKCh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yICE9IFVTQl9LRVlTUEFOX1ZFTkRPUl9JRCkgfHwKKwkgICAgKHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICE9IFVTQl9LRVlTUEFOX1BST0RVQ1RfVUlBMTEpICkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KKwlyZW1vdGUgPSBrbWFsbG9jKHNpemVvZigqcmVtb3RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlbW90ZSA9PSBOVUxMKSB7CisJCWVycigiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCW1lbXNldChyZW1vdGUsIDB4MDAsIHNpemVvZigqcmVtb3RlKSk7CisKKwlyZW1vdGUtPnVkZXYgPSB1ZGV2OworCXJlbW90ZS0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCXJlbW90ZS0+dG9nZ2xlID0gLTE7CS8qIFNldCB0byAtMSBzbyB3ZSB3aWxsIGFsd2F5cyBub3QgbWF0Y2ggdGhlIHRvZ2dsZSBmcm9tIHRoZSBmaXJzdCByZW1vdGUgbWVzc2FnZS4gKi8KKworCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwkvKiB1c2Ugb25seSB0aGUgZmlyc3QgaW4gaW50ZXJydXB0IGVuZHBvaW50ICovCisJaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisKKwkJaWYgKCFyZW1vdGUtPmluX2VuZHBvaW50ICYmCisJCSAgICAoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAmJgorCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkpIHsKKwkJCS8qIHdlIGZvdW5kIG91ciBpbnRlcnJ1cHQgaW4gZW5kcG9pbnQgKi8KKwkJCXJlbW90ZS0+aW5fZW5kcG9pbnQgPSBlbmRwb2ludDsKKworCQkJcmVtb3RlLT5pbl9idWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jKHJlbW90ZS0+dWRldiwgUkVDVl9TSVpFLCBTTEFCX0FUT01JQywgJnJlbW90ZS0+aW5fZG1hKTsKKwkJCWlmICghcmVtb3RlLT5pbl9idWZmZXIpIHsKKwkJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXJlbW90ZS0+aW5fZW5kcG9pbnQpIHsKKwkJZXJyKCJDb3VsZCBub3QgZmluZCBpbnRlcnJ1cHQgaW5wdXQgZW5kcG9pbnQuXG4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZW1vdGUtPmlycV91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghcmVtb3RlLT5pcnFfdXJiKSB7CisJCWVycigiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYi5cbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHZhbCA9IGtleXNwYW5fc2V0dXAocmVtb3RlLT51ZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCWVycigiRmFpbGVkIHRvIHNldHVwIGRldmljZS5cbiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworCS8qCisJICogU2V0dXAgdGhlIGlucHV0IHN5c3RlbSB3aXRoIHRoZSBiaXRzIHdlIGFyZSBnb2luZyB0byBiZSByZXBvcnRpbmcKKwkgKi8KKwlyZW1vdGUtPmlucHV0LmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CQkvKiBXZSB3aWxsIG9ubHkgcmVwb3J0IEtFWSBldmVudHMuICovCisJZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKKwkJaWYgKGtleXNwYW5fa2V5X3RhYmxlW2ldICE9IEtFWV9SRVNFUlZFRCkgeworCQkJc2V0X2JpdChrZXlzcGFuX2tleV90YWJsZVtpXSwgcmVtb3RlLT5pbnB1dC5rZXliaXQpOworCQl9CisJfQorCisJcmVtb3RlLT5pbnB1dC5wcml2YXRlID0gcmVtb3RlOworCXJlbW90ZS0+aW5wdXQub3BlbiA9IGtleXNwYW5fb3BlbjsKKwlyZW1vdGUtPmlucHV0LmNsb3NlID0ga2V5c3Bhbl9jbG9zZTsKKworCXVzYl9tYWtlX3BhdGgocmVtb3RlLT51ZGV2LCBwYXRoLCA2NCk7CisJc3ByaW50ZihyZW1vdGUtPnBoeXMsICIlcy9pbnB1dDAiLCBwYXRoKTsKKworCXJlbW90ZS0+aW5wdXQubmFtZSA9IHJlbW90ZS0+bmFtZTsKKwlyZW1vdGUtPmlucHV0LnBoeXMgPSByZW1vdGUtPnBoeXM7CisJcmVtb3RlLT5pbnB1dC5pZC5idXN0eXBlID0gQlVTX1VTQjsKKwlyZW1vdGUtPmlucHV0LmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KHJlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJcmVtb3RlLT5pbnB1dC5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUocmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJcmVtb3RlLT5pbnB1dC5pZC52ZXJzaW9uID0gbGUxNl90b19jcHUocmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisKKwlpZiAoIShidWYgPSBrbWFsbG9jKDYzLCBHRlBfS0VSTkVMKSkpIHsKKwkJdXNiX2J1ZmZlcl9mcmVlKHJlbW90ZS0+dWRldiwgUkVDVl9TSVpFLCByZW1vdGUtPmluX2J1ZmZlciwgcmVtb3RlLT5pbl9kbWEpOworCQlrZnJlZShyZW1vdGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAocmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIgJiYKKwkgICAgdXNiX3N0cmluZyhyZW1vdGUtPnVkZXYsIHJlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pTWFudWZhY3R1cmVyLCBidWYsIDYzKSA+IDApCisJCXN0cmNhdChyZW1vdGUtPm5hbWUsIGJ1Zik7CisKKwlpZiAocmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlQcm9kdWN0ICYmCisJICAgIHVzYl9zdHJpbmcocmVtb3RlLT51ZGV2LCByZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QsIGJ1ZiwgNjMpID4gMCkKKwkJc3ByaW50ZihyZW1vdGUtPm5hbWUsICIlcyAlcyIsIHJlbW90ZS0+bmFtZSwgYnVmKTsKKworCWlmICghc3RybGVuKHJlbW90ZS0+bmFtZSkpCisJCXNwcmludGYocmVtb3RlLT5uYW1lLCAiVVNCIEtleXNwYW4gUmVtb3RlICUwNHg6JTA0eCIsCisJCQlyZW1vdGUtPmlucHV0LmlkLnZlbmRvciwgcmVtb3RlLT5pbnB1dC5pZC5wcm9kdWN0KTsKKworCWtmcmVlKGJ1Zik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIFVSQiB0byBhY2Nlc3MgdGhlIGRldmljZS4gVGhlIHVyYiBnZXRzIHNlbnQgdG8gdGhlIGRldmljZSBpbiBrZXlzcGFuX29wZW4oKQorCSAqLworCXVzYl9maWxsX2ludF91cmIocmVtb3RlLT5pcnFfdXJiLAorCQkJIHJlbW90ZS0+dWRldiwgdXNiX3JjdmludHBpcGUocmVtb3RlLT51ZGV2LCByZW1vdGUtPmluX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSByZW1vdGUtPmluX2J1ZmZlciwgUkVDVl9TSVpFLCBrZXlzcGFuX2lycV9yZWN2LCByZW1vdGUsCisJCQkgcmVtb3RlLT5pbl9lbmRwb2ludC0+YkludGVydmFsKTsKKwlyZW1vdGUtPmlycV91cmItPnRyYW5zZmVyX2RtYSA9IHJlbW90ZS0+aW5fZG1hOworCXJlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZyZW1vdGUtPmlucHV0KTsKKworCS8qIHNhdmUgb3VyIGRhdGEgcG9pbnRlciBpbiB0aGlzIGludGVyZmFjZSBkZXZpY2UgKi8KKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgcmVtb3RlKTsKKworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlpbmZvKCJjb25uZWN0ZWQ6ICVzIG9uICVzIiwgcmVtb3RlLT5uYW1lLCBwYXRoKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJLyoKKwkgKiBJbiBjYXNlIG9mIGVycm9yIHdlIG5lZWQgdG8gY2xlYW4gdXAgYW55IGFsbG9jYXRlZCBidWZmZXJzCisJICovCisJaWYgKHJlbW90ZS0+aXJxX3VyYikKKwkJdXNiX2ZyZWVfdXJiKHJlbW90ZS0+aXJxX3VyYik7CisKKwlpZiAocmVtb3RlLT5pbl9idWZmZXIpCisJCXVzYl9idWZmZXJfZnJlZShyZW1vdGUtPnVkZXYsIFJFQ1ZfU0laRSwgcmVtb3RlLT5pbl9idWZmZXIsIHJlbW90ZS0+aW5fZG1hKTsKKworCWlmIChyZW1vdGUpCisJCWtmcmVlKHJlbW90ZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUm91dGluZSBjYWxsZWQgd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgVVNCLgorICovCitzdGF0aWMgdm9pZCBrZXlzcGFuX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgdXNiX2tleXNwYW4gKnJlbW90ZTsKKworCS8qIHByZXZlbnQga2V5c3Bhbl9vcGVuKCkgZnJvbSByYWNpbmcga2V5c3Bhbl9kaXNjb25uZWN0KCkgKi8KKwlsb2NrX2tlcm5lbCgpOworCisJcmVtb3RlID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKworCWlmIChyZW1vdGUpIHsJLyogV2UgaGF2ZSBhIHZhbGlkIGRyaXZlciBzdHJ1Y3R1cmUgc28gY2xlYW4gdXAgZXZlcnl0aGluZyB3ZSBhbGxvY2F0ZWQuICovCisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZyZW1vdGUtPmlucHV0KTsKKwkJdXNiX2tpbGxfdXJiKHJlbW90ZS0+aXJxX3VyYik7CisJCXVzYl9mcmVlX3VyYihyZW1vdGUtPmlycV91cmIpOworCQl1c2JfYnVmZmVyX2ZyZWUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLCBSRUNWX1NJWkUsIHJlbW90ZS0+aW5fYnVmZmVyLCByZW1vdGUtPmluX2RtYSk7CisJCWtmcmVlKHJlbW90ZSk7CisJfQorCisJdW5sb2NrX2tlcm5lbCgpOworCisJaW5mbygiVVNCIEtleXNwYW4gbm93IGRpc2Nvbm5lY3RlZCIpOworfQorCisvKgorICogU3RhbmRhcmQgZHJpdmVyIHNldCB1cCBzZWN0aW9ucworICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIga2V5c3Bhbl9kcml2ZXIgPQoreworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJrZXlzcGFuX3JlbW90ZSIsCisJLnByb2JlID0Ja2V5c3Bhbl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CWtleXNwYW5fZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQlrZXlzcGFuX3RhYmxlCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1c2Jfa2V5c3Bhbl9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmtleXNwYW5fZHJpdmVyKTsKKwlpZiAocmVzdWx0KQorCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2Jfa2V5c3Bhbl9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmtleXNwYW5fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodXNiX2tleXNwYW5faW5pdCk7Cittb2R1bGVfZXhpdCh1c2Jfa2V5c3Bhbl9leGl0KTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGtleXNwYW5fdGFibGUpOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRShEUklWRVJfTElDRU5TRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21lZGlhL01ha2VmaWxlCmluZGV4IDJiNzZkZjcuLmQ4M2FkZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgVVNCIE1lZGlhIGRyaXZlcnMKICMKIAotc245YzEwMi1vYmpzCTo9IHNuOWMxMDJfY29yZS5vIHNuOWMxMDJfaHY3MTMxZC5vIHNuOWMxMDJfbWkwMzQzLm8gc245YzEwMl9wYXMxMDZiLm8gc245YzEwMl9wYXMyMDJiY2IubyBzbjljMTAyX3RhczUxMTBjMWIubyBzbjljMTAyX3RhczUxMzBkMWIubworc245YzEwMi1vYmpzCTo9IHNuOWMxMDJfY29yZS5vIHNuOWMxMDJfaHY3MTMxZC5vIHNuOWMxMDJfbWkwMzQzLm8gc245YzEwMl9vdjc2MzAubyBzbjljMTAyX3BhczEwNmIubyBzbjljMTAyX3BhczIwMmJjYi5vIHNuOWMxMDJfdGFzNTExMGMxYi5vIHNuOWMxMDJfdGFzNTEzMGQxYi5vCiAKIG9iai0kKENPTkZJR19VU0JfREFCVVNCKQkrPSBkYWJ1c2Iubwogb2JqLSQoQ09ORklHX1VTQl9EU0JSKQkJKz0gZHNicjEwMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyLmgKaW5kZXggOGI4YTRjOC4uZTVjZWEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMi5oCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDIuaApAQCAtNTYsNyArNTYsNyBAQAogI2RlZmluZSBTTjlDMTAyX01PRFVMRV9BVVRIT1IgICAiKEMpIDIwMDQtMjAwNSBMdWNhIFJpc29saWEiCiAjZGVmaW5lIFNOOUMxMDJfQVVUSE9SX0VNQUlMICAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX0xJQ0VOU0UgICJHUEwiCi0jZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuMjQiCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuMjRhIgogI2RlZmluZSBTTjlDMTAyX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDAsIDI0KQogCiBlbnVtIHNuOWMxMDJfYnJpZGdlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfY29yZS5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMKaW5kZXggMzFkNTc0MC4uY2Y4Y2ZiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMKQEAgLTQyOSw3ICs0MjksNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgCitpbnQKIHNuOWMxMDJfaTJjX3RyeV93cml0ZShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggYWRkcmVzcywgdTggdmFsdWUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX292NzYzMC5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9vdjc2MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdjNWFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9vdjc2MzAuYwpAQCAtMCwwICsxLDM5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGx1Zy1pbiBmb3IgT1Y3NjMwIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMHggUEMgQ2FtZXJhICAgICAgKgorICogQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisKKworc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBvdjc2MzA7CisKKworc3RhdGljIGludCBvdjc2MzBfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTQpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NjAsIDB4MTcpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4MTgpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NTAsIDB4MTkpOworCisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMiwgMHg4ZCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMSwgMHgwMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNSwgMHgzNCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNiwgMHgwMyk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNywgMHgxYyk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxOCwgMHhiZCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxOSwgMHgwNik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxYSwgMHhmNik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxYiwgMHgwNCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyMCwgMHg0NCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyMywgMHhlZSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNiwgMHhhMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNywgMHg5YSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyOCwgMHgyMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyOSwgMHgzMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyZiwgMHgzZCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgzMCwgMHgyNCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgzMiwgMHg4Nik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2MCwgMHhhOSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2MSwgMHg0Mik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2NSwgMHgwMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2OSwgMHgzOCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2ZiwgMHg4OCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3MCwgMHgwYik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3MSwgMHgwMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3NCwgMHgyMSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3ZCwgMHhmNyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgb3Y3NjMwX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEwLCBjdHJsLT52YWx1ZSA+PiAyKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3NiwgY3RybC0+dmFsdWUgJiAweDAzKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMiwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMywgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDAsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJZXJyICs9IGN0cmwtPnZhbHVlID8gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA1LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3RybC0+dmFsdWUtMSkgfCAweDIwKQorCQkgICAgICAgICAgICAgICAgICAgOiBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDUsIDB4MDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDYsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAzLCBjdHJsLT52YWx1ZSA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCWVyciArPSBjdHJsLT52YWx1ZSA/IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0cmwtPnZhbHVlLTEpIHwgMHgyMCkKKwkJICAgICAgICAgICAgICAgICAgIDogc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA0LCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBjLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfV0hJVEVORVNTOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBkLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEyLCAoY3RybC0+dmFsdWUgPDwgMikgfCAweDA5KTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMywgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDc1LCAweDBlIHwgKGN0cmwtPnZhbHVlIDw8IDcpKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CTEFDS19MRVZFTDoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNSwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfQlJJR0hUX0xFVkVMOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI0LCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HQU1NQToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNCwgKGN0cmwtPnZhbHVlIDw8IDIpIHwgMHg4MCk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9CQU5EX0ZJTFRFUjoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyZCwgY3RybC0+dmFsdWUgPDwgMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnIgPyAtRUlPIDogMDsKK30KKworCitzdGF0aWMgaW50IG92NzYzMF9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gJm92NzYzMDsKKwlpbnQgZXJyID0gMDsKKwl1OCB2X3N0YXJ0ID0gKHU4KShyZWN0LT50b3AgLSBzLT5jcm9wY2FwLmJvdW5kcy50b3ApICsgMTsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IG92NzYzMF9zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TTjlDMTBYKQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE5KTsKKwllbHNlCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NTAsIDB4MTkpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIG92NzYzMCA9IHsKKwkubmFtZSA9ICJPVjc2MzAiLAorCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAorCS5zeXNmc19vcHMgPSBTTjlDMTAyX0kyQ19XUklURSwKKwkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAorCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18yV0lSRVMsCisJLmkyY19zbGF2ZV9pZCA9IDB4MjEsCisJLmluaXQgPSAmb3Y3NjMwX2luaXQsCisJLnFjdHJsID0geworCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ2xvYmFsIGdhaW4iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDNmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDE0LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfSFVFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiaHVlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgxZisxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gInNhdHVyYXRpb24iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDBmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDA4LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQ09OVFJBU1QsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJjb250cmFzdCIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MWYrMSwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZXhwb3N1cmUiLAorCQkJLm1pbmltdW0gPSAweDAwMCwKKwkJCS5tYXhpbXVtID0gMHgzZmYsCisJCQkuc3RlcCA9IDB4MDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDgzPDwyLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJyZWQgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4ZmYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4M2EsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJibHVlIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGZmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDc3LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJyaWdodG5lc3MiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGZmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweGEwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIndoaXRlIGJhbGFuY2UgYmFja2dyb3VuZDogYmx1ZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4M2YsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MjAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9XSElURU5FU1MsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJ3aGl0ZSBiYWxhbmNlIGJhY2tncm91bmQ6IHJlZCIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4M2YsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MjAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSA9ICJhdXRvIHdoaXRlIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDAxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAxLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQVVUT0dBSU4sCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJnYWluICYgZXhwb3N1cmUgbW9kZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDMsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9WRkxJUCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lID0gInZlcnRpY2FsIGZsaXAiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDAxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAxLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQkxBQ0tfTEVWRUwsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJibGFjayBwaXhlbCByYXRpbyIsCisJCQkubWluaW11bSA9IDB4MDEsCisJCQkubWF4aW11bSA9IDB4OWEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4OGEsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0JSSUdIVF9MRVZFTCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJyaWdodCBwaXhlbCByYXRpbyIsCisJCQkubWluaW11bSA9IDB4MDEsCisJCQkubWF4aW11bSA9IDB4OWEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MTAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0JBTkRfRklMVEVSLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkJLm5hbWUgPSAiYmFuZCBmaWx0ZXIiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDAxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gU045QzEwMl9WNEwyX0NJRF9HQU1NQSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lID0gInJnYiBnYW1tYSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCX0sCisJLnNldF9jdHJsID0gJm92NzYzMF9zZXRfY3RybCwKKwkuY3JvcGNhcCA9IHsKKwkJLmJvdW5kcyA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gNjQwLAorCQkJLmhlaWdodCA9IDQ4MCwKKwkJfSwKKwkJLmRlZnJlY3QgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJfSwKKwkuc2V0X2Nyb3AgPSAmb3Y3NjMwX3NldF9jcm9wLAorCS5waXhfZm9ybWF0ID0geworCQkud2lkdGggPSA2NDAsCisJCS5oZWlnaHQgPSA0ODAsCisJCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5wcml2ID0gOCwKKwl9LAorCS5zZXRfcGl4X2Zvcm1hdCA9ICZvdjc2MzBfc2V0X3BpeF9mb3JtYXQKK307CisKKworaW50IHNuOWMxMDJfcHJvYmVfb3Y3NjMwKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJm92NzYzMCk7CisKKwlpZiAobGUxNl90b19jcHUob3Y3NjMwLnVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpICE9IDB4NjA4ZiAmJgorCSAgICBsZTE2X3RvX2NwdShvdjc2MzAudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gMHg2MDJjKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjgsIDB4MTcpOworCisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBiLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9zZW5zb3IuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfc2Vuc29yLmgKaW5kZXggNmE3YWRlYi4uYTQ1MTY2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9zZW5zb3IuaAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3NlbnNvci5oCkBAIC02NCw2ICs2NCw3IEBACiAqLwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX2h2NzEzMWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX21pMDM0MyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CitleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfb3Y3NjMwKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKIGV4dGVybiBpbnQgc245YzEwMl9wcm9iZV9wYXMxMDZiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKIGV4dGVybiBpbnQgc245YzEwMl9wcm9iZV9wYXMyMDJiY2Ioc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX3RhczUxMTBjMWIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwpAQCAtODAsNiArODEsNyBAQAogCSZzbjljMTAyX3Byb2JlX3BhczEwNmIsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLyAgICBcCiAJJnNuOWMxMDJfcHJvYmVfcGFzMjAyYmNiLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8gIFwKIAkmc245YzEwMl9wcm9iZV9odjcxMzFkLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8gICAgXAorCSZzbjljMTAyX3Byb2JlX292NzYzMCwgLyogZGV0ZWN0aW9uIG1vc3RseSBiYXNlZCBvbiBVU0IgcGlkL3ZpZCAqLyAgICBcCiAJJnNuOWMxMDJfcHJvYmVfdGFzNTExMGMxYiwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovICAgICAgIFwKIAkmc245YzEwMl9wcm9iZV90YXM1MTMwZDFiLCAvKiBkZXRlY3Rpb24gYmFzZWQgb24gVVNCIHBpZC92aWQgKi8gICAgICAgXAogCU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMDMsNyArMTA1LDggQEAKIAl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMjkpLCB9LCAvKiBQQVMxMDZCICovICAgICAgICAgICAgICAgICAgICAgICAgXAogCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYSksIH0sIC8qIEhWNzEzMUQgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJiKSwgfSwgLyogTUktMDM0MyAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmMpLCB9LCAvKiBPVjc2MjAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYyksIH0sIC8qIE9WNzYzMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJkKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMzApLCB9LCAvKiBNSTAzeCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjA4MCksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDgyKSwgfSwgLyogTUkwMzQzIGFuZCBNSTAzNjAgKi8gICAgICAgICAgICAgIFwKQEAgLTE0NSw2ICsxNDgsOCBAQAogKi8KIAogLyogVGhlICJ0cnkiIEkyQyBJL08gdmVyc2lvbnMgYXJlIHVzZWQgd2hlbiBwcm9iaW5nIHRoZSBzZW5zb3IgKi8KK2V4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSosc3RydWN0IHNuOWMxMDJfc2Vuc29yKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MsIHU4IHZhbHVlKTsKIGV4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKixzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBhZGRyZXNzKTsKIApAQCAtMjAxLDYgKzIwNiw4IEBACiAJU045QzEwMl9JMkNfM1dJUkVTLAogfTsKIAorI2RlZmluZSBTTjlDMTAyX01BWF9DVFJMUyBWNEwyX0NJRF9MQVNUUDEtVjRMMl9DSURfQkFTRSsxMAorCiBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgewogCWNoYXIgbmFtZVszMl0sIC8qIHNlbnNvciBuYW1lICovCiAJICAgICBtYWludGFpbmVyWzY0XTsgLyogbmFtZSBvZiB0aGUgbWFudGFpbmVyIDxlbWFpbD4gKi8KQEAgLTI0Myw3ICsyNTAsNyBAQAogCSAgIHNlbnNvciBhY2NvcmRpbmcgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzIGJlbG93LgogCSovCiAKLQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcWN0cmxbVjRMMl9DSURfTEFTVFAxLVY0TDJfQ0lEX0JBU0VdOworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxY3RybFtTTjlDMTAyX01BWF9DVFJMU107CiAJLyoKIAkgICBPcHRpb25hbCBsaXN0IG9mIGRlZmF1bHQgY29udHJvbHMsIGRlZmluZWQgYXMgaW5kaWNhdGVkIGluIHRoZSAKIAkgICBWNEwyIEFQSS4gTWVudSB0eXBlIGNvbnRyb2xzIGFyZSBub3QgaGFuZGxlZCBieSB0aGlzIGludGVyZmFjZS4KQEAgLTM1Niw3ICszNjMsNyBAQAogCSAgIGNvcmUgbW9kdWxlIHRvIHN0b3JlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHZhbHVlcyBvZiB0aGUgYWJvdmUKIAkgICBzZXR0aW5ncywgZm9yIHJvbGxiYWNrcy4uZXRjLi5pbiBjYXNlIG9mIGVycm9ycyBkdXJpbmcgYXRvbWljIEkvTwogCSovCi0Jc3RydWN0IHY0bDJfcXVlcnljdHJsIF9xY3RybFtWNEwyX0NJRF9MQVNUUDEtVjRMMl9DSURfQkFTRV07CisJc3RydWN0IHY0bDJfcXVlcnljdHJsIF9xY3RybFtTTjlDMTAyX01BWF9DVFJMU107CiAJc3RydWN0IHY0bDJfcmVjdCBfcmVjdDsKIH07CiAKQEAgLTM2Nyw1ICszNzQsOCBAQAogI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0UgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMQogI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX1JFU0VUX0xFVkVMIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIKICNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9QSVhFTF9CSUFTX1ZPTFRBR0UgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMworI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX0dBTU1BIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQKKyNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9CQU5EX0ZJTFRFUiBWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1CisjZGVmaW5lIFNOOUMxMDJfVjRMMl9DSURfQlJJR0hUX0xFVkVMIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDYKIAogI2VuZGlmIC8qIF9TTjlDMTAyX1NFTlNPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTEwYzFiLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYwppbmRleCA2OTBkNjIxLi44Nzc1OTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYwpAQCAtMjQsOCArMjQsNiBAQAogCiBzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHRhczUxMTBjMWI7CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIHRhczUxMTBjMWJfZ2FpbjsKLQogCiBzdGF0aWMgaW50IHRhczUxMTBjMWJfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKIHsKQEAgLTQ2LDIxICs0NCw2IEBACiB9CiAKIAotc3RhdGljIGludCB0YXM1MTEwYzFiX2dldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQotewotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWN0cmwtPnZhbHVlID0gdGFzNTExMGMxYl9nYWluLnZhbHVlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCiBzdGF0aWMgaW50IHRhczUxMTBjMWJfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCiB7CkBAIC02OCw4ICs1MSw3IEBACiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpKSkKLQkJCXRhczUxMTBjMWJfZ2Fpbi52YWx1ZSA9IGN0cmwtPnZhbHVlOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0Nyw3ICsxMjksNiBAQAogCQkJLmhlaWdodCA9IDI4OCwKIAkJfSwKIAl9LAotCS5nZXRfY3RybCA9ICZ0YXM1MTEwYzFiX2dldF9jdHJsLAogCS5zZXRfY3JvcCA9ICZ0YXM1MTEwYzFiX3NldF9jcm9wLAogCS5waXhfZm9ybWF0ID0gewogCQkud2lkdGggPSAzNTIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMzBkMWIuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jCmluZGV4IGIzNzhlOTQuLjkyN2VhZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jCkBAIC0yNCw4ICsyNCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgdGFzNTEzMGQxYjsKIAotc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdGFzNTEzMGQxYl9nYWluLCB0YXM1MTMwZDFiX2V4cG9zdXJlOwotCiAKIHN0YXRpYyBpbnQgdGFzNTEzMGQxYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewpAQCAtNDQsMjQgKzQyLDYgQEAKIH0KIAogCi1zdGF0aWMgaW50IHRhczUxMzBkMWJfZ2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCi17Ci0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJY3RybC0+dmFsdWUgPSB0YXM1MTMwZDFiX2dhaW4udmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCWN0cmwtPnZhbHVlID0gdGFzNTEzMGQxYl9leHBvc3VyZS52YWx1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQogc3RhdGljIGludCB0YXM1MTMwZDFiX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQogewpAQCAtNjksMTIgKzQ5LDEwIEBACiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpKSkKLQkJCXRhczUxMzBkMWJfZ2Fpbi52YWx1ZSA9IGN0cmwtPnZhbHVlOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDQwLCAweDQ3IC0gY3RybC0+dmFsdWUpKSkKLQkJCXRhczUxMzBkMWJfZXhwb3N1cmUudmFsdWUgPSBjdHJsLT52YWx1ZTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg0MCwgMHg0NyAtIGN0cmwtPnZhbHVlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDcsNyArMTI1LDYgQEAKIAkJCS5mbGFncyA9IDAsCiAJCX0sCiAJfSwKLQkuZ2V0X2N0cmwgPSAmdGFzNTEzMGQxYl9nZXRfY3RybCwKIAkuc2V0X2N0cmwgPSAmdGFzNTEzMGQxYl9zZXRfY3RybCwKIAkuY3JvcGNhcCA9IHsKIAkJLmJvdW5kcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwppbmRleCAzYTg5Njk1Li42NjQ5NTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCkBAIC0xMzksNiArMTM5LDE2IEBACiAKIHNvdXJjZSAiZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2EvS2NvbmZpZyIKIAorY29uZmlnIFVTQl9MRAorCXRyaXN0YXRlICJVU0IgTEQgZHJpdmVyIgorCWRlcGVuZHMgb24gVVNCICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciBnZW5lcmljIFVTQiBkZXZpY2VzIHRoYXQgdXNlIGludGVycnVwdCB0cmFuc2ZlcnMsCisJICBsaWtlIExEIERpZGFjdGljJ3MgVVNCIGRldmljZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGxkdXNiLgorCiBjb25maWcgVVNCX1RFU1QKIAl0cmlzdGF0ZSAiVVNCIHRlc3RpbmcgZHJpdmVyIChERVZFTE9QTUVOVCkiCiAJZGVwZW5kcyBvbiBVU0IgJiYgVVNCX0RFVklDRUZTICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKaW5kZXggNGEzODE0Yy4uODYyZTQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX1VTQl9FTUk2MikJCSs9IGVtaTYyLm8KIG9iai0kKENPTkZJR19VU0JfSURNT1VTRSkJKz0gaWRtb3VzZS5vCiBvYmotJChDT05GSUdfVVNCX0xDRCkJCSs9IHVzYmxjZC5vCitvYmotJChDT05GSUdfVVNCX0xEKQkJKz0gbGR1c2Iubwogb2JqLSQoQ09ORklHX1VTQl9MRUQpCQkrPSB1c2JsZWQubwogb2JqLSQoQ09ORklHX1VTQl9MRUdPVE9XRVIpCSs9IGxlZ291c2J0b3dlci5vCiBvYmotJChDT05GSUdfVVNCX1BISURHRVRLSVQpCSs9IHBoaWRnZXRraXQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jIGIvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWM4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKQEAgLTAsMCArMSw3OTQgQEAKKy8qKgorICogR2VuZXJpYyBVU0IgZHJpdmVyIGZvciByZXBvcnQgYmFzZWQgaW50ZXJydXB0IGluL291dCBkZXZpY2VzCisgKiBsaWtlIExEIERpZGFjdGljJ3MgVVNCIGRldmljZXMuIExEIERpZGFjdGljJ3MgVVNCIGRldmljZXMgYXJlCisgKiBISUQgZGV2aWNlcyB3aGljaCBkbyBub3QgdXNlIEhJRCByZXBvcnQgZGVmaW5pdG9ucyAodGhleSB1c2UKKyAqIHJhdyBpbnRlcnJ1cHQgaW4gYW5kIG91ciByZXBvcnRzIG9ubHkgZm9yIGNvbW11bmljYXRpb24pLgorICoKKyAqIFRoaXMgZHJpdmVyIHVzZXMgYSByaW5nIGJ1ZmZlciBmb3IgdGltZSBjcml0aWNhbCByZWFkaW5nIG9mCisgKiBpbnRlcnJ1cHQgaW4gcmVwb3J0cyBhbmQgcHJvdmlkZXMgcmVhZCBhbmQgd3JpdGUgbWV0aG9kcyBmb3IKKyAqIHJhdyBpbnRlcnJ1cHQgcmVwb3J0cyAoc2ltaWxhciB0byB0aGUgV2luZG93cyBISUQgZHJpdmVyKS4KKyAqIERldmljZXMgYmFzZWQgb24gdGhlIGJvb2sgVVNCIENPTVBMRVRFIGJ5IEphbiBBeGVsc29uIG1heSBuZWVkCisgKiBzdWNoIGEgY29tcGF0aWJpbGl0eSB0byB0aGUgV2luZG93cyBISUQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNaWNoYWVsIEh1bmQgPG1odW5kQGxkLWRpZGFjdGljLmRlPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRGVyaXZlZCBmcm9tIExlZ28gVVNCIFRvd2VyIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEdsYW5jZSA8YWR2aWRnc2ZAc291cmNlZm9yZ2UubmV0PgorICoJCSAyMDAxLTIwMDQgSnVlcmdlbiBTdHViZXIgPHN0YXJibHVlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBWMC4xICAobWgpIEluaXRpYWwgdmVyc2lvbgorICogVjAuMTEgKG1oKSBBZGRlZCByYXcgc3VwcG9ydCBmb3IgSElEIDEuMCBkZXZpY2VzIChubyBpbnRlcnJ1cHQgb3V0IGVuZHBvaW50KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorCisvKiBEZWZpbmUgdGhlc2UgdmFsdWVzIHRvIG1hdGNoIHlvdXIgZGV2aWNlcyAqLworI2RlZmluZSBVU0JfVkVORE9SX0lEX0xECQkweDBmMTEJLyogVVNCIFZlbmRvciBJRCBvZiBMRCBEaWRhY3RpYyBHbWJIICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0FTU1kJCTB4MTAwMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgYWxsIENBU1NZLVMgbW9kdWxlcyAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPQ0tFVENBU1NZCTB4MTAxMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgUG9ja2V0LUNBU1NZICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTU9CSUxFQ0FTU1kJMHgxMDIwCS8qIFVTQiBQcm9kdWN0IElEIGZvciBNb2JpbGUtQ0FTU1kgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9KV00JCTB4MTA4MAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgSm91bGUgYW5kIFdhdHRtZXRlciAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX0RNTVAJCTB4MTA4MQkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgRGlnaXRhbCBNdWx0aW1ldGVyIFAgKHJlc2VydmVkKSAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX1VNSVAJCTB4MTA5MAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgVU1JIFAgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9WSURFT0NPTQkJMHgxMjAwCS8qIFVTQiBQcm9kdWN0IElEIGZvciBWaWRlb0NvbSAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPTTNMQUIJCTB4MjAwMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgQ09NM0xBQiAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX1RFTEVQT1JUCQkweDIwMTAJLyogVVNCIFByb2R1Y3QgSUQgZm9yIFRlcm1pbmFsIEFkYXB0ZXIgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORVRXT1JLQU5BTFlTRVIJMHgyMDIwCS8qIFVTQiBQcm9kdWN0IElEIGZvciBOZXR3b3JrIEFuYWx5c2VyICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUE9XRVJDT05UUk9MCTB4MjAzMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgQ29udHJvbGxpbmcgZGV2aWNlIGZvciBQb3dlciBFbGVjdHJvbmljcyAqLworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVkVSTklFUgkJMHgwOGY3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8JMHgwMDAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVAJMHgwMDAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9TS0lQCTB4MDAwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUwkweDAwMDQKKworCisjaWZkZWYgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUworI2RlZmluZSBVU0JfTERfTUlOT1JfQkFTRQkwCisjZWxzZQorI2RlZmluZSBVU0JfTERfTUlOT1JfQkFTRQkxNzYKKyNlbmRpZgorCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbGRfdXNiX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0NBU1NZKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1BPQ0tFVENBU1NZKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX01PQklMRUNBU1NZKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0pXTSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9ETU1QKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1VNSVApIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfVklERU9DT00pIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfQ09NM0xBQikgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9URUxFUE9SVCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9ORVRXT1JLQU5BTFlTRVIpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfUE9XRVJDT05UUk9MKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8pIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0dPVEVNUCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfU0tJUCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUykgfSwKKwl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGxkX3VzYl90YWJsZSk7CitNT0RVTEVfVkVSU0lPTigiVjAuMTEiKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSHVuZCA8bWh1bmRAbGQtZGlkYWN0aWMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxEIFVTQiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJMRCBVU0IgRGV2aWNlcyIpOworCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworCXN0YXRpYyBpbnQgZGVidWcgPSAxOworI2Vsc2UKKwlzdGF0aWMgaW50IGRlYnVnID0gMDsKKyNlbmRpZgorCisvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KKyNkZWZpbmUgZGJnX2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIGRldl9pbmZvKGRldiAsIGZvcm1hdCAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKKy8qIEFsbCBpbnRlcnJ1cHQgaW4gdHJhbnNmZXJzIGFyZSBjb2xsZWN0ZWQgaW4gYSByaW5nIGJ1ZmZlciB0bworICogYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMgYW5kIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2Ugb2YgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCByaW5nX2J1ZmZlcl9zaXplID0gMTI4OworbW9kdWxlX3BhcmFtKHJpbmdfYnVmZmVyX3NpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJpbmdfYnVmZmVyX3NpemUsICJSZWFkIHJpbmcgYnVmZmVyIHNpemUgaW4gcmVwb3J0cyIpOworCisvKiBUaGUgd3JpdGVfYnVmZmVyIGNhbiBjb250YWluIG1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IG91dCB0cmFuc2Zlci4KKyAqLworc3RhdGljIGludCB3cml0ZV9idWZmZXJfc2l6ZSA9IDEwOworbW9kdWxlX3BhcmFtKHdyaXRlX2J1ZmZlcl9zaXplLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3cml0ZV9idWZmZXJfc2l6ZSwgIldyaXRlIGJ1ZmZlciBzaXplIGluIHJlcG9ydHMiKTsKKworLyogQXMgb2Yga2VybmVsIHZlcnNpb24gMi42LjQgZWhjaS1oY2QgdXNlcyBhbgorICogIm9ubHkgb25lIGludGVycnVwdCB0cmFuc2ZlciBwZXIgZnJhbWUiIHNob3J0Y3V0CisgKiB0byBzaW1wbGlmeSB0aGUgc2NoZWR1bGluZyBvZiBwZXJpb2RpYyB0cmFuc2ZlcnMuCisgKiBUaGlzIGNvbmZsaWN0cyB3aXRoIG91ciBzdGFuZGFyZCAxbXMgaW50ZXJ2YWxzIGZvciBpbiBhbmQgb3V0IFVSQnMuCisgKiBXZSB1c2UgZGVmYXVsdCBpbnRlcnZhbHMgb2YgMm1zIGZvciBpbiBhbmQgMm1zIGZvciBvdXQgdHJhbnNmZXJzLAorICogd2hpY2ggc2hvdWxkIGJlIGZhc3QgZW5vdWdoLgorICogSW5jcmVhc2UgdGhlIGludGVydmFsIHRvIGFsbG93IG1vcmUgZGV2aWNlcyB0aGF0IGRvIGludGVycnVwdCB0cmFuc2ZlcnMsCisgKiBvciBzZXQgdG8gMSB0byB1c2UgdGhlIHN0YW5kYXJkIGludGVydmFsIGZyb20gdGhlIGVuZHBvaW50IGRlc2NyaXB0b3JzLgorICovCitzdGF0aWMgaW50IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSAyOworbW9kdWxlX3BhcmFtKG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBpbiBpbnRlcnZhbCBpbiBtcyIpOworCitzdGF0aWMgaW50IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gMjsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBvdXQgaW50ZXJ2YWwgaW4gbXMiKTsKKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KK3N0cnVjdCBsZF91c2IgeworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogbG9ja3MgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSoJaW50ZjsJCS8qIHNhdmUgb2ZmIHRoZSB1c2IgaW50ZXJmYWNlIHBvaW50ZXIgKi8KKworCWludAkJCW9wZW5fY291bnQ7CS8qIG51bWJlciBvZiB0aW1lcyB0aGlzIHBvcnQgaGFzIGJlZW4gb3BlbmVkICovCisKKwljaGFyKgkJCXJpbmdfYnVmZmVyOworCXVuc2lnbmVkIGludAkJcmluZ19oZWFkOworCXVuc2lnbmVkIGludAkJcmluZ190YWlsOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJcmVhZF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CXdyaXRlX3dhaXQ7CisKKwljaGFyKgkJCWludGVycnVwdF9pbl9idWZmZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbnRlcnJ1cHRfaW5fZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9pbl91cmI7CisJaW50CQkJaW50ZXJydXB0X2luX2ludGVydmFsOworCXNpemVfdAkJCWludGVycnVwdF9pbl9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9pbl9ydW5uaW5nOworCWludAkJCWludGVycnVwdF9pbl9kb25lOworCisJY2hhcioJCQlpbnRlcnJ1cHRfb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9vdXRfZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9vdXRfdXJiOworCWludAkJCWludGVycnVwdF9vdXRfaW50ZXJ2YWw7CisJc2l6ZV90CQkJaW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9vdXRfYnVzeTsKK307CisKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoZGlzY29ubmVjdF9zZW0pOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgbGRfdXNiX2RyaXZlcjsKKworLyoqCisgKglsZF91c2JfYWJvcnRfdHJhbnNmZXJzCisgKiAgICAgIGFib3J0cyB0cmFuc2ZlcnMgYW5kIGZyZWVzIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyB2b2lkIGxkX3VzYl9hYm9ydF90cmFuc2ZlcnMoc3RydWN0IGxkX3VzYiAqZGV2KQoreworCS8qIHNodXRkb3duIHRyYW5zZmVyICovCisJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcpIHsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWlmIChkZXYtPmludGYpCisJCQl1c2Jfa2lsbF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQlpZiAoZGV2LT5pbnRmKQorCQkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOworfQorCisvKioKKyAqCWxkX3VzYl9kZWxldGUKKyAqLworc3RhdGljIHZvaWQgbGRfdXNiX2RlbGV0ZShzdHJ1Y3QgbGRfdXNiICpkZXYpCit7CisJbGRfdXNiX2Fib3J0X3RyYW5zZmVycyhkZXYpOworCisJLyogZnJlZSBkYXRhIHN0cnVjdHVyZXMgKi8KKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7CisJa2ZyZWUoZGV2LT5yaW5nX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKTsKKwlrZnJlZShkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKTsKKwlrZnJlZShkZXYpOworfQorCisvKioKKyAqCWxkX3VzYl9pbnRlcnJ1cHRfaW5fY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgbGRfdXNiX2ludGVycnVwdF9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBsZF91c2IgKmRldiA9IHVyYi0+Y29udGV4dDsKKwlzaXplX3QgKmFjdHVhbF9idWZmZXI7CisJdW5zaWduZWQgaW50IG5leHRfcmluZ19oZWFkOworCWludCByZXR2YWw7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0gZWxzZSB7CisJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJCSBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCWdvdG8gcmVzdWJtaXQ7IC8qIG1heWJlIHdlIGNhbiByZWNvdmVyICovCisJCX0KKwl9CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkgeworCQluZXh0X3JpbmdfaGVhZCA9IChkZXYtPnJpbmdfaGVhZCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCWlmIChuZXh0X3JpbmdfaGVhZCAhPSBkZXYtPnJpbmdfdGFpbCkgeworCQkJYWN0dWFsX2J1ZmZlciA9IChzaXplX3QqKShkZXYtPnJpbmdfYnVmZmVyICsgZGV2LT5yaW5nX2hlYWQqKHNpemVvZihzaXplX3QpK2Rldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUpKTsKKwkJCS8qIGFjdHVhbF9idWZmZXIgZ2V0cyB1cmItPmFjdHVhbF9sZW5ndGggKyBpbnRlcnJ1cHRfaW5fYnVmZmVyICovCisJCQkqYWN0dWFsX2J1ZmZlciA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJCW1lbWNweShhY3R1YWxfYnVmZmVyKzEsIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCWRldi0+cmluZ19oZWFkID0gbmV4dF9yaW5nX2hlYWQ7CisJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogcmVjZWl2ZWQgJWQgYnl0ZXNcbiIsCisJCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJfSBlbHNlCisJCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCisJCQkJICJSaW5nIGJ1ZmZlciBvdmVyZmxvdywgJWQgYnl0ZXMgZHJvcHBlZFxuIiwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9CisKK3Jlc3VibWl0OgorCS8qIHJlc3VibWl0IGlmIHdlJ3JlIHN0aWxsIHJ1bm5pbmcgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyAmJiBkZXYtPmludGYpIHsKKwkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+aW50Zi0+ZGV2LAorCQkJCSJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKK2V4aXQ6CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJbGRfdXNiX2ludGVycnVwdF9vdXRfY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgbGRfdXNiX2ludGVycnVwdF9vdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbGRfdXNiICpkZXYgPSB1cmItPmNvbnRleHQ7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmICh1cmItPnN0YXR1cyAmJiAhKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpCisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKKwkJCSAiJXMgLSBub256ZXJvIHdyaXRlIGludGVycnVwdCBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKK30KKworLyoqCisgKglsZF91c2Jfb3BlbgorICovCitzdGF0aWMgaW50IGxkX3VzYl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwlpbnQgc3VibWlub3I7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCXN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCWRvd24oJmRpc2Nvbm5lY3Rfc2VtKTsKKworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmbGRfdXNiX2RyaXZlciwgc3VibWlub3IpOworCisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJZXJyKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCSAgICAgX19GVU5DVElPTl9fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlpZiAoIWRldikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJLyogbG9jayB0aGlzIGRldmljZSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBhbGxvdyBvcGVuaW5nIG9ubHkgb25jZSAqLworCWlmIChkZXYtPm9wZW5fY291bnQpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlkZXYtPm9wZW5fY291bnQgPSAxOworCisJLyogaW5pdGlhbGl6ZSBpbiBkaXJlY3Rpb24gKi8KKwlkZXYtPnJpbmdfaGVhZCA9IDA7CisJZGV2LT5yaW5nX3RhaWwgPSAwOworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCSB1c2JfcmN2aW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSksCisJCQkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwKKwkJCSBsZF91c2JfaW50ZXJydXB0X2luX2NhbGxiYWNrLAorCQkJIGRldiwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCk7CisKKwlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMTsKKwlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMDsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IHN1Ym1pdCBpbnRlcnJ1cHRfaW5fdXJiICVkXG4iLCByZXR2YWwpOworCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKKwkJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzYXZlIGRldmljZSBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCit1bmxvY2tfZGlzY29ubmVjdF9leGl0OgorCXVwKCZkaXNjb25uZWN0X3NlbSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCWxkX3VzYl9yZWxlYXNlCisgKi8KK3N0YXRpYyBpbnQgbGRfdXNiX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGxkX3VzYiAqZGV2OworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGRldi0+b3Blbl9jb3VudCAhPSAxKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQkvKiB0aGUgZGV2aWNlIHdhcyB1bnBsdWdnZWQgYmVmb3JlIHRoZSBmaWxlIHdhcyByZWxlYXNlZCAqLworCQl1cCgmZGV2LT5zZW0pOworCQkvKiB1bmxvY2sgaGVyZSBhcyBsZF91c2JfZGVsZXRlIGZyZWVzIGRldiAqLworCQlsZF91c2JfZGVsZXRlKGRldik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHdyaXRlIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndyaXRlX3dhaXQsICFkZXYtPmludGVycnVwdF9vdXRfYnVzeSwgMiAqIEhaKTsKKwlsZF91c2JfYWJvcnRfdHJhbnNmZXJzKGRldik7CisJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwordW5sb2NrX2V4aXQ6CisJdXAoJmRldi0+c2VtKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCWxkX3VzYl9wb2xsCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGRfdXNiX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGxkX3VzYiAqZGV2OworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmaWxlLCAmZGV2LT5yZWFkX3dhaXQsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmZGV2LT53cml0ZV93YWl0LCB3YWl0KTsKKworCWlmIChkZXYtPnJpbmdfaGVhZCAhPSBkZXYtPnJpbmdfdGFpbCkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwlyZXR1cm4gbWFzazsKK30KKworLyoqCisgKglsZF91c2JfcmVhZAorICovCitzdGF0aWMgc3NpemVfdCBsZF91c2JfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwlzaXplX3QgKmFjdHVhbF9idWZmZXI7CisJc2l6ZV90IGJ5dGVzX3RvX3JlYWQ7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgZGF0YSB0byByZWFkICovCisJaWYgKGNvdW50ID09IDApCisJCWdvdG8gZXhpdDsKKworCS8qIGxvY2sgdGhpcyBvYmplY3QgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCisJaWYgKGRldi0+aW50ZiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWVycigiTm8gZGV2aWNlIG9yIGRldmljZSB1bnBsdWdnZWQgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogd2FpdCBmb3IgZGF0YSAqLworCWlmIChkZXYtPnJpbmdfaGVhZCA9PSBkZXYtPnJpbmdfdGFpbCkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIHVubG9ja19leGl0OworCQl9CisJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPnJlYWRfd2FpdCwgZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBhY3R1YWxfYnVmZmVyIGNvbnRhaW5zIGFjdHVhbF9sZW5ndGggKyBpbnRlcnJ1cHRfaW5fYnVmZmVyICovCisJYWN0dWFsX2J1ZmZlciA9IChzaXplX3QqKShkZXYtPnJpbmdfYnVmZmVyICsgZGV2LT5yaW5nX3RhaWwqKHNpemVvZihzaXplX3QpK2Rldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUpKTsKKwlieXRlc190b19yZWFkID0gbWluKGNvdW50LCAqYWN0dWFsX2J1ZmZlcik7CisJaWYgKGJ5dGVzX3RvX3JlYWQgPCAqYWN0dWFsX2J1ZmZlcikKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiUmVhZCBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCisJCQkgKmFjdHVhbF9idWZmZXItYnl0ZXNfdG9fcmVhZCk7CisKKwkvKiBjb3B5IG9uZSBpbnRlcnJ1cHRfaW5fYnVmZmVyIGZyb20gcmluZ19idWZmZXIgaW50byB1c2Vyc3BhY2UgKi8KKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgYWN0dWFsX2J1ZmZlcisxLCBieXRlc190b19yZWFkKSkgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlkZXYtPnJpbmdfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisKKwlyZXR2YWwgPSBieXRlc190b19yZWFkOworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglsZF91c2Jfd3JpdGUKKyAqLworc3RhdGljIHNzaXplX3QgbGRfdXNiX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwlzaXplX3QgYnl0ZXNfdG9fd3JpdGU7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgZGF0YSB0byB3cml0ZSAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCS8qIHdhaXQgdW50aWwgcHJldmlvdXMgdHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCX0KKworCS8qIHdyaXRlIHRoZSBkYXRhIGludG8gaW50ZXJydXB0X291dF9idWZmZXIgZnJvbSB1c2Vyc3BhY2UgKi8KKwlieXRlc190b193cml0ZSA9IG1pbihjb3VudCwgd3JpdGVfYnVmZmVyX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUpOworCWlmIChieXRlc190b193cml0ZSA8IGNvdW50KQorCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsICJXcml0ZSBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsY291bnQtYnl0ZXNfdG9fd3JpdGUpOworCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBjb3VudCA9ICVkLCBieXRlc190b193cml0ZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpIHsKKwkJLyogdHJ5IEhJRF9SRVFfU0VUX1JFUE9SVD05IG9uIGNvbnRyb2xfZW5kcG9pbnQgaW5zdGVhZCBvZiBpbnRlcnJ1cHRfb3V0X2VuZHBvaW50ICovCisJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkJCSB1c2Jfc25kY3RybHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLCAwKSwKKwkJCQkJIDksCisJCQkJCSBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKKwkJCQkJIDEgPDwgOCwgMCwKKwkJCQkJIGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsCisJCQkJCSBieXRlc190b193cml0ZSwKKwkJCQkJIFVTQl9DVFJMX1NFVF9USU1FT1VUICogSFopOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWVycigiQ291bGRuJ3Qgc3VibWl0IEhJRF9SRVFfU0VUX1JFUE9SVCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzZW5kIG9mZiB0aGUgdXJiICovCisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoZGV2LT5pbnRmKSwKKwkJCSB1c2Jfc25kaW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwKKwkJCSBieXRlc190b193cml0ZSwKKwkJCSBsZF91c2JfaW50ZXJydXB0X291dF9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsKTsKKworCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMTsKKwl3bWIoKTsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCQllcnIoIkNvdWxkbid0IHN1Ym1pdCBpbnRlcnJ1cHRfb3V0X3VyYiAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisJcmV0dmFsID0gYnl0ZXNfdG9fd3JpdGU7CisKK3VubG9ja19leGl0OgorCS8qIHVubG9jayB0aGUgZGV2aWNlICovCisJdXAoJmRldi0+c2VtKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBmaWxlIG9wZXJhdGlvbnMgbmVlZGVkIHdoZW4gd2UgcmVnaXN0ZXIgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxkX3VzYl9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkICA9CWxkX3VzYl9yZWFkLAorCS53cml0ZSA9CWxkX3VzYl93cml0ZSwKKwkub3BlbiA9CQlsZF91c2Jfb3BlbiwKKwkucmVsZWFzZSA9CWxkX3VzYl9yZWxlYXNlLAorCS5wb2xsID0JCWxkX3VzYl9wb2xsLAorfTsKKworLyoKKyAqIHVzYiBjbGFzcyBkcml2ZXIgaW5mbyBpbiBvcmRlciB0byBnZXQgYSBtaW5vciBudW1iZXIgZnJvbSB0aGUgdXNiIGNvcmUsCisgKiBhbmQgdG8gaGF2ZSB0aGUgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBkZXZmcyBhbmQgdGhlIGRyaXZlciBjb3JlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBsZF91c2JfY2xhc3MgPSB7CisJLm5hbWUgPQkJImxkdXNiJWQiLAorCS5mb3BzID0JCSZsZF91c2JfZm9wcywKKwkubWlub3JfYmFzZSA9CVVTQl9MRF9NSU5PUl9CQVNFLAorfTsKKworLyoqCisgKglsZF91c2JfcHJvYmUKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0aGF0IGl0IHRoaW5rcworICoJdGhpcyBkcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbi4KKyAqLworc3RhdGljIGludCBsZF91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IGxkX3VzYiAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJY2hhciAqYnVmZmVyOworCWludCBpOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbnRpYWxpemUgaXQgKi8KKworCWRldiA9IGttYWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRldiwgMHgwMCwgc2l6ZW9mKCpkZXYpKTsKKwlpbml0X01VVEVYKCZkZXYtPnNlbSk7CisJZGV2LT5pbnRmID0gaW50ZjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnJlYWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cml0ZV93YWl0KTsKKworCS8qIHdvcmthcm91bmQgZm9yIGVhcmx5IGZpcm13YXJlIHZlcnNpb25zIG9uIGZhc3QgY29tcHV0ZXJzICovCisJaWYgKChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSBVU0JfVkVORE9SX0lEX0xEKSAmJgorCSAgICAoKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWSUNFX0lEX0NBU1NZKSB8fAorCSAgICAgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWSUNFX0lEX0NPTTNMQUIpKSAmJgorCSAgICAobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpIDw9IDB4MTAzKSkgeworCQlidWZmZXIgPSBrbWFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisJCS8qIHVzYl9zdHJpbmcgbWFrZXMgU0VUVVArU1RBTEwgdG8gbGVhdmUgYWx3YXlzIENvbnRyb2xSZWFkTG9vcCAqLworCQl1c2Jfc3RyaW5nKHVkZXYsIDI1NSwgYnVmZmVyLCAyNTYpOworCQlrZnJlZShidWZmZXIpOworCX0KKworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAoKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikgJiYKKwkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7CisJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9IGVuZHBvaW50OworCQl9CisKKwkJaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSAmJgorCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkpIHsKKwkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9IGVuZHBvaW50OworCQl9CisJfQorCWlmIChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkludGVycnVwdCBpbiBlbmRwb2ludCBub3QgZm91bmRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpCisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgb3V0IGVuZHBvaW50IG5vdCBmb3VuZCAodXNpbmcgY29udHJvbCBlbmRwb2ludCBpbnN0ZWFkKVxuIik7CisKKwlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplID0gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwlkZXYtPnJpbmdfYnVmZmVyID0ga21hbGxvYyhyaW5nX2J1ZmZlcl9zaXplKihzaXplb2Yoc2l6ZV90KStkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPnJpbmdfYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHJpbmdfYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyID0ga21hbGxvYyhkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUgPSBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPyBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA6CisJCQkJCQkJCQkgdWRldi0+ZGVzY3JpcHRvci5iTWF4UGFja2V0U2l6ZTA7CisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciA9IGttYWxsb2Mod3JpdGVfYnVmZmVyX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X3VyYlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX2ludGVydmFsID0gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA+IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWwgPyBtaW5faW50ZXJydXB0X2luX2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbDsKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50KQorCQlkZXYtPmludGVycnVwdF9vdXRfaW50ZXJ2YWwgPSBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA+IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbDsKKworCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRldik7CisKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KGludGYsICZsZF91c2JfY2xhc3MpOworCWlmIChyZXR2YWwpIHsKKwkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCisJCWRldl9lcnIoJmludGYtPmRldiwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS5cbiIpOworCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiTEQgVVNCIERldmljZSAjJWQgbm93IGF0dGFjaGVkIHRvIG1ham9yICVkIG1pbm9yICVkXG4iLAorCQkoaW50Zi0+bWlub3IgLSBVU0JfTERfTUlOT1JfQkFTRSksIFVTQl9NQUpPUiwgaW50Zi0+bWlub3IpOworCitleGl0OgorCXJldHVybiByZXR2YWw7CisKK2Vycm9yOgorCWxkX3VzYl9kZWxldGUoZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJbGRfdXNiX2Rpc2Nvbm5lY3QKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgbGRfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGxkX3VzYiAqZGV2OworCWludCBtaW5vcjsKKworCWRvd24oJmRpc2Nvbm5lY3Rfc2VtKTsKKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKworCWRvd24oJmRldi0+c2VtKTsKKworCW1pbm9yID0gaW50Zi0+bWlub3I7CisKKwkvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCisJdXNiX2RlcmVnaXN0ZXJfZGV2KGludGYsICZsZF91c2JfY2xhc3MpOworCisJLyogaWYgdGhlIGRldmljZSBpcyBub3Qgb3BlbmVkLCB0aGVuIHdlIGNsZWFuIHVwIHJpZ2h0IG5vdyAqLworCWlmICghZGV2LT5vcGVuX2NvdW50KSB7CisJCXVwKCZkZXYtPnNlbSk7CisJCWxkX3VzYl9kZWxldGUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXYtPmludGYgPSBOVUxMOworCQl1cCgmZGV2LT5zZW0pOworCX0KKworCXVwKCZkaXNjb25uZWN0X3NlbSk7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiTEQgVVNCIERldmljZSAjJWQgbm93IGRpc2Nvbm5lY3RlZFxuIiwKKwkJIChtaW5vciAtIFVTQl9MRF9NSU5PUl9CQVNFKSk7Cit9CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBsZF91c2JfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJsZHVzYiIsCisJLnByb2JlID0JbGRfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JbGRfdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JbGRfdXNiX3RhYmxlLAorfTsKKworLyoqCisgKglsZF91c2JfaW5pdAorICovCitzdGF0aWMgaW50IF9faW5pdCBsZF91c2JfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZsZF91c2JfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQgZm9yIHRoZSAiX19GSUxFX18iIGRyaXZlci4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglsZF91c2JfZXhpdAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgbGRfdXNiX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmbGRfdXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGxkX3VzYl9pbml0KTsKK21vZHVsZV9leGl0KGxkX3VzYl9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwppbmRleCA3NTVhNDU3Li4yNjI2NmIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKQEAgLTE5LDExICsxOSwxNiBAQAogI2RlZmluZSBEQVRBX01BWCAgMzIKIAogLyoKKyAqIERlZmluZWQgYnkgVVNCIDIuMCBjbGF1c2UgOS4zLCB0YWJsZSA5LjIuCisgKi8KKyNkZWZpbmUgU0VUVVBfTUFYICA4CisKKy8qCiAgKiBUaGlzIGxpbWl0IGV4aXN0cyB0byBwcmV2ZW50IE9PTXMgd2hlbiB0aGUgdXNlciBwcm9jZXNzIHN0b3BzIHJlYWRpbmcuCiAgKi8KICNkZWZpbmUgRVZFTlRfTUFYICAyNQogCi0jZGVmaW5lIFBSSU5URl9ERkwgIDEyMAorI2RlZmluZSBQUklOVEZfREZMICAxMzAKIAogc3RydWN0IG1vbl9ldmVudF90ZXh0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGVfbGluazsKQEAgLTMzLDcgKzM4LDkgQEAKIAl1bnNpZ25lZCBpbnQgdHN0YW1wOwogCWludCBsZW5ndGg7CQkvKiBEZXBlbmRzIG9uIHR5cGU6IHhmZXIgbGVuZ3RoIG9yIGFjdCBsZW5ndGggKi8KIAlpbnQgc3RhdHVzOworCWNoYXIgc2V0dXBfZmxhZzsKIAljaGFyIGRhdGFfZmxhZzsKKwl1bnNpZ25lZCBjaGFyIHNldHVwW1NFVFVQX01BWF07CiAJdW5zaWduZWQgY2hhciBkYXRhW0RBVEFfTUFYXTsKIH07CiAKQEAgLTY0LDYgKzcxLDIyIEBACiAgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSB3aG9sZSBtb25fYnVzIGxvY2tlZCwgc28gbm8gYWRkaXRpb25hbCBsb2NrLgogICovCiAKK3N0YXRpYyBpbmxpbmUgY2hhciBtb25fdGV4dF9nZXRfc2V0dXAoc3RydWN0IG1vbl9ldmVudF90ZXh0ICplcCwKKyAgICBzdHJ1Y3QgdXJiICp1cmIsIGNoYXIgZXZfdHlwZSkKK3sKKworCWlmICghdXNiX3BpcGVjb250cm9sKHVyYi0+cGlwZSkgfHwgZXZfdHlwZSAhPSAnUycpCisJCXJldHVybiAnLSc7CisKKwlpZiAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19TRVRVUF9ETUFfTUFQKQorCQlyZXR1cm4gJ0QnOworCWlmICh1cmItPnNldHVwX3BhY2tldCA9PSBOVUxMKQorCQlyZXR1cm4gJ1onOwkvKiAnMCcgd291bGQgYmUgbm90IGFzIHByZXR0eS4gKi8KKworCW1lbWNweShlcC0+c2V0dXAsIHVyYi0+c2V0dXBfcGFja2V0LCBTRVRVUF9NQVgpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGNoYXIgbW9uX3RleHRfZ2V0X2RhdGEoc3RydWN0IG1vbl9ldmVudF90ZXh0ICplcCwgc3RydWN0IHVyYiAqdXJiLAogICAgIGludCBsZW4sIGNoYXIgZXZfdHlwZSkKIHsKQEAgLTkwLDcgKzExMyw2IEBACiAKIAkvKgogCSAqIEJ1bGsgaXMgZWFzeSB0byBzaG9ydGN1dCByZWxpYWJseS4gCi0JICogWFhYIENvbnRyb2wgbmVlZHMgc2V0dXAgcGFja2V0IHRha2VuLgogCSAqIFhYWCBPdGhlciBwaXBlIHR5cGVzIG5lZWQgY29uc2lkZXJhdGlvbi4gQ3VycmVudGx5LCB3ZSBvdmVyZG8gaXQKIAkgKiBhbmQgY29sbGVjdCBnYXJiYWdlIGZvciB0aGVtOiBiZXR0ZXIgbW9yZSB0aGFuIGxlc3MuCiAJICovCkBAIC0xNDQsNiArMTY2LDcgQEAKIAkvKiBDb2xsZWN0aW5nIHN0YXR1cyBtYWtlcyBkZWJ1Z2dpbmcgc2Vuc2UgZm9yIHN1Ym1pdHMsIHRvbyAqLwogCWVwLT5zdGF0dXMgPSB1cmItPnN0YXR1czsKIAorCWVwLT5zZXR1cF9mbGFnID0gbW9uX3RleHRfZ2V0X3NldHVwKGVwLCB1cmIsIGV2X3R5cGUpOwogCWVwLT5kYXRhX2ZsYWcgPSBtb25fdGV4dF9nZXRfZGF0YShlcCwgdXJiLCBlcC0+bGVuZ3RoLCBldl90eXBlKTsKIAogCXJwLT5uZXZlbnRzKys7CkBAIC0yOTksMTAgKzMyMiwyNSBAQAogCWRlZmF1bHQ6IC8qIFBJUEVfQlVMSyAqLyAgdXR5cGUgPSAnQic7CiAJfQogCWNudCArPSBzbnByaW50ZihwYnVmICsgY250LCBsaW1pdCAtIGNudCwKLQkgICAgIiVseCAldSAlYyAlYyVjOiUwM3U6JTAydSAlZCAlZCIsCisJICAgICIlbHggJXUgJWMgJWMlYzolMDN1OiUwMnUiLAogCSAgICBlcC0+aWQsIGVwLT50c3RhbXAsIGVwLT50eXBlLAotCSAgICB1dHlwZSwgdWRpciwgdXNiX3BpcGVkZXZpY2UoZXAtPnBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KGVwLT5waXBlKSwKLQkgICAgZXAtPnN0YXR1cywgZXAtPmxlbmd0aCk7CisJICAgIHV0eXBlLCB1ZGlyLCB1c2JfcGlwZWRldmljZShlcC0+cGlwZSksIHVzYl9waXBlZW5kcG9pbnQoZXAtPnBpcGUpKTsKKworCWlmIChlcC0+c2V0dXBfZmxhZyA9PSAwKSB7ICAgLyogU2V0dXAgcGFja2V0IGlzIHByZXNlbnQgYW5kIGNhcHR1cmVkICovCisJCWNudCArPSBzbnByaW50ZihwYnVmICsgY250LCBsaW1pdCAtIGNudCwKKwkJICAgICIgcyAlMDJ4ICUwMnggJTA0eCAlMDR4ICUwNHgiLAorCQkgICAgZXAtPnNldHVwWzBdLAorCQkgICAgZXAtPnNldHVwWzFdLAorCQkgICAgKGVwLT5zZXR1cFszXSA8PCA4KSB8IGVwLT5zZXR1cFsyXSwKKwkJICAgIChlcC0+c2V0dXBbNV0gPDwgOCkgfCBlcC0+c2V0dXBbNF0sCisJCSAgICAoZXAtPnNldHVwWzddIDw8IDgpIHwgZXAtPnNldHVwWzZdKTsKKwl9IGVsc2UgaWYgKGVwLT5zZXR1cF9mbGFnICE9ICctJykgeyAvKiBVbmFibGUgdG8gY2FwdHVyZSBzZXR1cCBwYWNrZXQgKi8KKwkJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LAorCQkgICAgIiAlYyBfXyBfXyBfX19fIF9fX18gX19fXyIsIGVwLT5zZXR1cF9mbGFnKTsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHNldHVwIGZvciB0aGlzIGtpbmQgb2YgVVJCICovCisJCWNudCArPSBzbnByaW50ZihwYnVmICsgY250LCBsaW1pdCAtIGNudCwgIiAlZCIsIGVwLT5zdGF0dXMpOworCX0KKwljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsICIgJWQiLCBlcC0+bGVuZ3RoKTsKIAogCWlmICgoZGF0YV9sZW4gPSBlcC0+bGVuZ3RoKSA+IDApIHsKIAkJaWYgKGVwLT5kYXRhX2ZsYWcgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jIGIvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCmluZGV4IGZkNmZmNGMuLjdmZmE5OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYworKysgYi9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBrYXdldGhfdXNiX3JlY2VpdmUoc3RydWN0IHVyYiAqLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1zdGF0aWMgaW50IGthd2V0aF9yZXN1Ym1pdF9yeF91cmIoc3RydWN0IGthd2V0aF9kZXZpY2UgKiwgaW50KTsKK3N0YXRpYyBpbnQga2F3ZXRoX3Jlc3VibWl0X3J4X3VyYihzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqLCB1bnNpZ25lZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJaW50X2NhbGxiYWNrCkBAIC01NTAsNyArNTUwLDcgQEAKICAqICAgICBrYXdldGhfcmVzdWJtaXRfcnhfdXJiCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBpbnQga2F3ZXRoX3Jlc3VibWl0X3J4X3VyYihzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoLAotCQkJCQkJaW50IG1lbV9mbGFncykKKwkJCQkJCXVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlpbnQgcmVzdWx0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKaW5kZXggOGE5NDVmNC4uNTc2ZjNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYwpAQCAtMzIyNyw5ICszMjI3LDkgQEAKIAl0ZW1wID0gdW5saW5rX3VyYnMgKGRldiwgJmRldi0+dHhxKSArIHVubGlua191cmJzIChkZXYsICZkZXYtPnJ4cSk7CiAKIAkvLyBtYXliZSB3YWl0IGZvciBkZWxldGlvbnMgdG8gZmluaXNoLgotCXdoaWxlIChza2JfcXVldWVfbGVuICgmZGV2LT5yeHEpCi0JCQkmJiBza2JfcXVldWVfbGVuICgmZGV2LT50eHEpCi0JCQkmJiBza2JfcXVldWVfbGVuICgmZGV2LT5kb25lKSkgeworCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZkZXYtPnJ4cSkgJiYKKwkgICAgICAgIXNrYl9xdWV1ZV9lbXB0eSgmZGV2LT50eHEpICYmCisJICAgICAgICFza2JfcXVldWVfZW1wdHkoJmRldi0+ZG9uZSkpIHsKIAkJbXNsZWVwKFVOTElOS19USU1FT1VUX01TKTsKIAkJaWYgKG5ldGlmX21zZ19pZmRvd24gKGRldikpCiAJCQlkZXZkYmcgKGRldiwgIndhaXRlZCBmb3IgJWQgdXJiIGNvbXBsZXRpb25zIiwgdGVtcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IGQ4ODJmYTMuLjBiMDNkZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC0yNjQsMTYgKzI2NCwyNiBAQAogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuNC4yIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuNC4zIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiwgQmlsbCBSeWRlciA8YnJ5ZGVyQHNnaS5jb20+LCBLdWJhIE9iZXIgPGt1YmFAbWFyZWltYnJpdW0ub3JnPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBGVERJIFNlcmlhbCBDb252ZXJ0ZXJzIERyaXZlciIKIAogc3RhdGljIGludCBkZWJ1ZzsKIAotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX3NpbyBbXSA9IHsKLQl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfU0lPX1BJRCkgfSwKLQl7IFVTQl9ERVZJQ0UoTU9CSUxJVFlfVklELCBNT0JJTElUWV9VU0JfU0VSSUFMX1BJRCkgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworLyogc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIGlzIHVzZWQgYnkgZGV2aWNlcyByZXF1aXJpbmcgc3BlY2lhbCBhdHRlbnRpb24uICovCitzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgeworCXZvaWQgKCpzZXR1cCkoc3RydWN0IHVzYl9zZXJpYWwgKik7IC8qIFNwZWNpYWwgc2V0dGluZ3MgZHVyaW5nIHN0YXJ0dXAuICovCit9OworCitzdGF0aWMgdm9pZCAgZnRkaV9VU0JfVUlSVF9zZXR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CitzdGF0aWMgdm9pZCAgZnRkaV9IRV9USVJBMV9zZXR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CisKK3N0YXRpYyBzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgZnRkaV9VU0JfVUlSVF9xdWlyayA9IHsKKwkuc2V0dXAgPSBmdGRpX1VTQl9VSVJUX3NldHVwLAorfTsKKworc3RhdGljIHN0cnVjdCBmdGRpX3Npb19xdWlyayBmdGRpX0hFX1RJUkExX3F1aXJrID0geworCS5zZXR1cCA9IGZ0ZGlfSEVfVElSQTFfc2V0dXAsCiB9OwogCiAvKgpAQCAtMjg4LDIzNyArMjk4LDExIEBACiAgKiB0aGUgYmNkRGV2aWNlIHZhbHVlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBGVDIzMkJNIGFuZCBGVDI0NUJNIGZyb20KICAqIHRoZSBlYXJsaWVyIEZUOFUyMzJBTSBhbmQgRlQ4VTIzMkJNLiAgRm9yIG5vdywgaW5jbHVkZSBhbGwga25vd24gVklEL1BJRAogICogY29tYmluYXRpb25zIGluIGJvdGggdGFibGVzLgotICogRklYTUU6IHBlcmhhcHMgYmNkRGV2aWNlIGNhbiBhbHNvIGlkZW50aWZ5IDEyTUh6IGRldmljZXMsIGJ1dCBJIGRvbid0IGtub3cKLSAqIGlmIHRob3NlIGV2ZXIgd2VudCBpbnRvIG1hc3MgcHJvZHVjdGlvbi4gW0lhbiBBYmJvdHRdCisgKiBGSVhNRTogcGVyaGFwcyBiY2REZXZpY2UgY2FuIGFsc28gaWRlbnRpZnkgMTJNSHogRlQ4VTIzMkFNIGRldmljZXMsCisgKiBidXQgSSBkb24ndCBrbm93IGlmIHRob3NlIGV2ZXIgd2VudCBpbnRvIG1hc3MgcHJvZHVjdGlvbi4gW0lhbiBBYmJvdHRdCiAgKi8KIAogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfOFUyMzJBTSBbXSA9IHsKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0lSVFJBTlNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzhVMjMyQU1fUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzhVMjMyQU1fQUxUX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9SRUxBSVNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0UoSU5URVJCSU9NRVRSSUNTX1ZJRCwgSU5URVJCSU9NRVRSSUNTX0lPQk9BUkRfUElEKSB9LAotCXsgVVNCX0RFVklDRShJTlRFUkJJT01FVFJJQ1NfVklELCBJTlRFUkJJT01FVFJJQ1NfTUlOSV9JT0JPQVJEX1BJRCkgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfTkZfUklDX1ZJRCwgRlRESV9ORl9SSUNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjM0X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl81NDdfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjMxX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzVfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzY0MF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjQyX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9WTkhDUENVU0JfRF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRFNTMjBfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAyX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwNF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDJfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwM18xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDNfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl80X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18zX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfNF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV81X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzdfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV84X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8zX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzVfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl82X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfN19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzhfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM180X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzZfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM183X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfOF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoSURURUNIX1ZJRCwgSURURUNIX0lEVDEyMjFVX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihPQ1RfVklELCBPQ1RfVVMxMDFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMSwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19SMlgwLCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMywgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRUxWX1VPMTAwX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9FTFZfVU0xMDBfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBJTlNJREVfQUNDRVNTTywgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihJTlRSRVBJRF9WSUQsIElOVFJFUElEX1ZBTFVFQ0FOX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihJTlRSRVBJRF9WSUQsIElOVFJFUElEX05FT1ZJX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGQUxDT01fVklELCBGQUxDT01fVFdJU1RfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1NVVU5UT19TUE9SVFNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1JNX0NBTlZJRVdfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPVEw0X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTVEw0X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTTzlNTDJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBFVkVSX0VDT19QUk9fQ0RTLCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8wX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElELCAwLCAweDNmZikgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfRlQyMzJCTSBbXSA9IHsKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0lSVFJBTlNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfOFUyMzJBTV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV84VTIzMkFNX0FMVF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9SRUxBSVNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9ORl9SSUNfVklELCBGVERJX05GX1JJQ19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjM0X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzU0N19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjMxX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzNV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82NDBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjQyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1ZOSENQQ1VTQl9EX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0RTUzIwX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8wX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8zX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl80X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl81X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl82X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1BFUkxFX1VMVFJBUE9SVF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9QSUVHUk9VUF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAzXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAzXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzdfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzdfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzdfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoSURURUNIX1ZJRCwgSURURUNIX0lEVDEyMjFVX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKE9DVF9WSUQsIE9DVF9VUzEwMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzEsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19SMlgwLCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8zLCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF80LCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA4X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwOV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBCX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQ19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MERfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBFX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg5X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4QV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4RF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0VMVl9VTzEwMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9FTFZfVU0xMDBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9GVVRVUkVfMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTIwXzBfUElEKSB9LAotCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVNDBfMV9QSUQpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgSU5TSURFX0FDQ0VTU08sIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihJTlRSRVBJRF9WSUQsIElOVFJFUElEX1ZBTFVFQ0FOX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfTkVPVklfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRkFMQ09NX1ZJRCwgRkFMQ09NX1RXSVNUX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1NVVU5UT19TUE9SVFNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUk1fQ0FOVklFV19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTT1RMNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTVEw0X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPOU1MMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRVZFUl9FQ09fUFJPX0NEUywgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8wX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0FDVElWRV9ST0JPVFNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9VU0JfVUlSVCBbXSA9IHsKLQl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVVNCX1VJUlRfUElEKSB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9IRV9USVJBMSBbXSA9IHsKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0hFX1RJUkExX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfRlQyMjMyQ1tdID0gewotCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV84VTIyMzJDX1BJRCkgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfY29tYmluZWQgW10gPSB7CiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lSVFJBTlNfUElEKSB9LApAQCAtNTQwLDE0ICszMjQsMTQgQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRFNTMjBfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX05GX1JJQ19WSUQsIEZURElfTkZfUklDX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVk5IQ1BDVVNCX0RfUElEKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUEVSTEVfVUxUUkFQT1JUX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzBfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfMV9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl8yX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzNfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfNF9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl81X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzZfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QRVJMRV9VTFRSQVBPUlRfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QSUVHUk9VUF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMl9QSUQpIH0sCkBAIC01OTcsMzUgKzM4MSwzNyBAQAogCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfOF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKElEVEVDSF9WSUQsIElEVEVDSF9JRFQxMjIxVV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKE9DVF9WSUQsIE9DVF9VUzEwMV9QSUQpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9IRV9USVJBMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1VTQl9VSVJUX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSEVfVElSQTFfUElEKSwKKwkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmdGRpX0hFX1RJUkExX3F1aXJrIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1VTQl9VSVJUX1BJRCksCisJCS5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmZnRkaV9VU0JfVUlSVF9xdWlyayB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzEpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1IyWDApIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMykgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF80KSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA4X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwOV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBCX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQ19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MERfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBFX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg5X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4QV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4RF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA4X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA5X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBBX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBCX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBDX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBEX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBFX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBGX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg4X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg5X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhBX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhCX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhDX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhEX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhFX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VPMTAwX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VNMTAwX1BJRCkgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9TRE1VU0JRU1NfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX01BU1RFUkRFVkVMMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9GVVRVUkVfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCisgCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9TRE1VU0JRU1NfUElEKSB9LAorIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCkgfSwKKyAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8wX1BJRCkgfSwKKyAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8xX1BJRCkgfSwKKyAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8yX1BJRCkgfSwKICAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFUyMF8wX1BJRCkgfSwKICAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFU0MF8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIElOU0lERV9BQ0NFU1NPKSB9LApAQCAtNjQyLDcgKzQyOCw3IEBACiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElEKSB9LAogCXsgVVNCX0RFVklDRShNT0JJTElUWV9WSUQsIE1PQklMSVRZX1VTQl9TRVJJQUxfUElEKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfQUNUSVZFX1JPQk9UU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FDVElWRV9ST0JPVFNfUElEKSB9LAogCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCkBAIC03MDUsMTIgKzQ5MSw4IEBACiAgQVNZTkNfU1BEX0NVU1QgfCBBU1lOQ19TUERfU0hJIHwgQVNZTkNfU1BEX1dBUlAgKQogCiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBhIEZUREkgc2VyaWFsIGNvbnZlcnRlciAqLwotc3RhdGljIGludCAgZnRkaV9TSU9fc3RhcnR1cAkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV84VTIzMkFNX3N0YXJ0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV9GVDIzMkJNX3N0YXJ0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV9GVDIyMzJDX3N0YXJ0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV9VU0JfVUlSVF9zdGFydHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKLXN0YXRpYyBpbnQgIGZ0ZGlfSEVfVElSQTFfc3RhcnR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CitzdGF0aWMgaW50ICBmdGRpX3Npb19wcm9iZQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyBpbnQgIGZ0ZGlfc2lvX2F0dGFjaAkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIHZvaWQgZnRkaV9zaHV0ZG93bgkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIGludCAgZnRkaV9vcGVuCQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKIHN0YXRpYyB2b2lkIGZ0ZGlfY2xvc2UJCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwpAQCAtNzMzLDE0ICs1MTUsMTYgQEAKIHN0YXRpYyBfX3UzMiBmdGRpXzIzMmJtX2JhdWRfYmFzZV90b19kaXZpc29yIChpbnQgYmF1ZCwgaW50IGJhc2UpOwogc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yIChpbnQgYmF1ZCk7CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpX1NJT19kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZGV2aWNlX3R5cGUgZnRkaV9zaW9fZGV2aWNlID0gewogCS5vd25lciA9CQlUSElTX01PRFVMRSwKLQkubmFtZSA9CQkJIkZUREkgU0lPIiwKLQkuaWRfdGFibGUgPQkJaWRfdGFibGVfc2lvLAorCS5uYW1lID0JCQkiRlRESSBVU0IgU2VyaWFsIERldmljZSIsCisJLnNob3J0X25hbWUgPQkJImZ0ZGlfc2lvIiwKKwkuaWRfdGFibGUgPQkJaWRfdGFibGVfY29tYmluZWQsCiAJLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAogCS5udW1fYnVsa19pbiA9CQkxLAogCS5udW1fYnVsa19vdXQgPQkJMSwKIAkubnVtX3BvcnRzID0JCTEsCisJLnByb2JlID0JCWZ0ZGlfc2lvX3Byb2JlLAogCS5vcGVuID0JCQlmdGRpX29wZW4sCiAJLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCiAJLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCkBAIC03NTUsMTQzICs1MzksMTAgQEAKIAkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKIAkuc2V0X3Rlcm1pb3MgPQkJZnRkaV9zZXRfdGVybWlvcywKIAkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAotCS5hdHRhY2ggPQkJZnRkaV9TSU9fc3RhcnR1cCwKKwkuYXR0YWNoID0JCWZ0ZGlfc2lvX2F0dGFjaCwKIAkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpXzhVMjMyQU1fZGV2aWNlID0gewotCS5vd25lciA9CQlUSElTX01PRFVMRSwKLQkubmFtZSA9CQkJIkZUREkgOFUyMzJBTSBDb21wYXRpYmxlIiwKLQkuaWRfdGFibGUgPQkJaWRfdGFibGVfOFUyMzJBTSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTAsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAotCS5udW1fcG9ydHMgPQkJMSwKLQkub3BlbiA9CQkJZnRkaV9vcGVuLAotCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAotCS50aHJvdHRsZSA9CQlmdGRpX3Rocm90dGxlLAotCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKLQkud3JpdGUgPQkJZnRkaV93cml0ZSwKLQkud3JpdGVfcm9vbSA9CQlmdGRpX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAotCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKLQkud3JpdGVfYnVsa19jYWxsYmFjayA9CWZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywKLQkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCi0JLmlvY3RsID0JCWZ0ZGlfaW9jdGwsCi0JLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCi0JLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKLQkuYXR0YWNoID0JCWZ0ZGlfOFUyMzJBTV9zdGFydHVwLAotCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfRlQyMzJCTV9kZXZpY2UgPSB7Ci0JLm93bmVyID0JCVRISVNfTU9EVUxFLAotCS5uYW1lID0JCQkiRlRESSBGVDIzMkJNIENvbXBhdGlibGUiLAotCS5pZF90YWJsZSA9CQlpZF90YWJsZV9GVDIzMkJNLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCi0JLm51bV9wb3J0cyA9CQkxLAotCS5vcGVuID0JCQlmdGRpX29wZW4sCi0JLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCi0JLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUgPQkJZnRkaV91bnRocm90dGxlLAotCS53cml0ZSA9CQlmdGRpX3dyaXRlLAotCS53cml0ZV9yb29tID0JCWZ0ZGlfd3JpdGVfcm9vbSwKLQkuY2hhcnNfaW5fYnVmZmVyID0JZnRkaV9jaGFyc19pbl9idWZmZXIsCi0JLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAotCS53cml0ZV9idWxrX2NhbGxiYWNrID0JZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrLAotCS50aW9jbWdldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21nZXQsCi0JLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKLQkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKLQkuc2V0X3Rlcm1pb3MgPQkJZnRkaV9zZXRfdGVybWlvcywKLQkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAotCS5hdHRhY2ggPQkJZnRkaV9GVDIzMkJNX3N0YXJ0dXAsCi0JLnNodXRkb3duID0JCWZ0ZGlfc2h1dGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZGV2aWNlX3R5cGUgZnRkaV9GVDIyMzJDX2RldmljZSA9IHsKLQkub3duZXIgPQkJVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJCSJGVERJIEZUMjIzMkMgQ29tcGF0aWJsZSIsCi0JLmlkX3RhYmxlID0JCWlkX3RhYmxlX0ZUMjIzMkMsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKLQkubnVtX3BvcnRzID0JCTEsCi0JLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKLQkuY2xvc2UgPQkJZnRkaV9jbG9zZSwKLQkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKLQkudW50aHJvdHRsZSA9CQlmdGRpX3VudGhyb3R0bGUsCi0JLndyaXRlID0JCWZ0ZGlfd3JpdGUsCi0JLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAotCS5jaGFyc19pbl9idWZmZXIgPQlmdGRpX2NoYXJzX2luX2J1ZmZlciwKLQkucmVhZF9idWxrX2NhbGxiYWNrID0JZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssCi0JLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCi0JLnRpb2NtZ2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbWdldCwKLQkudGlvY21zZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2Ntc2V0LAotCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAotCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAotCS5icmVha19jdGwgPQkJZnRkaV9icmVha19jdGwsCi0JLmF0dGFjaCA9CQlmdGRpX0ZUMjIzMkNfc3RhcnR1cCwKLQkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpX1VTQl9VSVJUX2RldmljZSA9IHsKLQkub3duZXIgPQkJVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJCSJVU0ItVUlSVCBJbmZyYXJlZCBUcmFuY2VpdmVyIiwKLQkuaWRfdGFibGUgPQkJaWRfdGFibGVfVVNCX1VJUlQsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKLQkubnVtX3BvcnRzID0JCTEsCi0JLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKLQkuY2xvc2UgPQkJZnRkaV9jbG9zZSwKLQkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKLQkudW50aHJvdHRsZSA9CQlmdGRpX3VudGhyb3R0bGUsCi0JLndyaXRlID0JCWZ0ZGlfd3JpdGUsCi0JLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAotCS5jaGFyc19pbl9idWZmZXIgPQlmdGRpX2NoYXJzX2luX2J1ZmZlciwKLQkucmVhZF9idWxrX2NhbGxiYWNrID0JZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssCi0JLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCi0JLnRpb2NtZ2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbWdldCwKLQkudGlvY21zZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2Ntc2V0LAotCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAotCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAotCS5icmVha19jdGwgPQkJZnRkaV9icmVha19jdGwsCi0JLmF0dGFjaCA9CQlmdGRpX1VTQl9VSVJUX3N0YXJ0dXAsCi0JLnNodXRkb3duID0JCWZ0ZGlfc2h1dGRvd24sCi19OwotCi0vKiBUaGUgVElSQTEgaXMgYmFzZWQgb24gYSAgRlQyMzJCTSB3aGljaCByZXF1aXJlcyBhIGZpeGVkIGJhdWQgcmF0ZSBvZiAxMDAwMDAKLSAqIGFuZCB3aGljaCByZXF1aXJlcyBSVFMtQ1RTIHRvIGJlIGVuYWJsZWQuICovCi1zdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZGV2aWNlX3R5cGUgZnRkaV9IRV9USVJBMV9kZXZpY2UgPSB7Ci0JLm93bmVyID0JCVRISVNfTU9EVUxFLAotCS5uYW1lID0JCQkiSG9tZS1FbGVjdHJvbmljcyBUSVJBLTEgSVIgVHJhbnNjZWl2ZXIiLAotCS5pZF90YWJsZSA9CQlpZF90YWJsZV9IRV9USVJBMSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTAsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAotCS5udW1fcG9ydHMgPQkJMSwKLQkub3BlbiA9CQkJZnRkaV9vcGVuLAotCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAotCS50aHJvdHRsZSA9CQlmdGRpX3Rocm90dGxlLAotCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKLQkud3JpdGUgPQkJZnRkaV93cml0ZSwKLQkud3JpdGVfcm9vbSA9CQlmdGRpX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAotCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKLQkud3JpdGVfYnVsa19jYWxsYmFjayA9CWZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywKLQkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCi0JLmlvY3RsID0JCWZ0ZGlfaW9jdGwsCi0JLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCi0JLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKLQkuYXR0YWNoID0JCWZ0ZGlfSEVfVElSQTFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKLX07Ci0KLQogCiAjZGVmaW5lIFdEUl9USU1FT1VUIDUwMDAgLyogZGVmYXVsdCB1cmIgdGltZW91dCAqLwogCkBAIC0xMjEyLDYgKzg2Myw1OSBAQAogfSAvKiBzZXRfc2VyaWFsX2luZm8gKi8KIAogCisvKiBEZXRlcm1pbmUgdHlwZSBvZiBGVERJIGNoaXAgYmFzZWQgb24gVVNCIGNvbmZpZyBhbmQgZGVzY3JpcHRvci4gKi8KK3N0YXRpYyB2b2lkIGZ0ZGlfZGV0ZXJtaW5lX3R5cGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZXJpYWwtPmRldjsKKwl1bnNpZ25lZCB2ZXJzaW9uOworCXVuc2lnbmVkIGludGVyZmFjZXM7CisKKwkvKiBBc3N1bWUgaXQgaXMgbm90IHRoZSBvcmlnaW5hbCBTSU8gZGV2aWNlIGZvciBub3cuICovCisJcHJpdi0+YmF1ZF9iYXNlID0gNDgwMDAwMDAgLyAxNjsKKwlwcml2LT53cml0ZV9vZmZzZXQgPSAwOworCisJdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwlpbnRlcmZhY2VzID0gdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOworCWRiZygiJXM6IGJjZERldmljZSA9IDB4JXgsIGJOdW1JbnRlcmZhY2VzID0gJXUiLCBfX0ZVTkNUSU9OX18sCisJCQl2ZXJzaW9uLCBpbnRlcmZhY2VzKTsKKwlpZiAoaW50ZXJmYWNlcyA+IDEpIHsKKwkJaW50IGludGVyOworCisJCS8qIE11bHRpcGxlIGludGVyZmFjZXMuICBBc3N1bWUgRlQyMjMyQy4gKi8KKwkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMjMyQzsKKwkJLyogRGV0ZXJtaW5lIGludGVyZmFjZSBjb2RlLiAqLworCQlpbnRlciA9IHNlcmlhbC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJCWlmIChpbnRlciA9PSAwKSB7CisJCQlwcml2LT5pbnRlcmZhY2UgPSBQSVRfU0lPQTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9COworCQl9CisJCS8qIEJNLXR5cGUgZGV2aWNlcyBoYXZlIGEgYnVnIHdoZXJlIGJjZERldmljZSBnZXRzIHNldAorCQkgKiB0byAweDIwMCB3aGVuIGlTZXJpYWxOdW1iZXIgaXMgMC4gICovCisJCWlmICh2ZXJzaW9uIDwgMHg1MDApIHsKKwkJCWRiZygiJXM6IHNvbWV0aGluZyBmaXNoeSAtIGJjZERldmljZSB0b28gbG93IGZvciBtdWx0aS1pbnRlcmZhY2UgZGV2aWNlIiwKKwkJCQkJX19GVU5DVElPTl9fKTsKKwkJfQorCX0gZWxzZSBpZiAodmVyc2lvbiA8IDB4MjAwKSB7CisJCS8qIE9sZCBkZXZpY2UuICBBc3N1bWUgaXRzIHRoZSBvcmlnaW5hbCBTSU8uICovCisJCXByaXYtPmNoaXBfdHlwZSA9IFNJTzsKKwkJcHJpdi0+YmF1ZF9iYXNlID0gMTIwMDAwMDAgLyAxNjsKKwkJcHJpdi0+d3JpdGVfb2Zmc2V0ID0gMTsKKwl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDQwMCkgeworCQkvKiBBc3N1bWUgaXRzIGFuIEZUOFUyMzJBTSAob3IgRlQ4VTI0NUFNKSAqLworCQkvKiAoSXQgbWlnaHQgYmUgYSBCTSBiZWNhdXNlIG9mIHRoZSBpU2VyaWFsTnVtYmVyIGJ1ZywKKwkJICogYnV0IGl0IHdpbGwgc3RpbGwgd29yayBhcyBhbiBBTSBkZXZpY2UuKSAqLworCQlwcml2LT5jaGlwX3R5cGUgPSBGVDhVMjMyQU07CisJfSBlbHNlIHsKKwkJLyogQXNzdW1lIGl0cyBhbiBGVDIzMkJNIChvciBGVDI0NUJNKSAqLworCQlwcml2LT5jaGlwX3R5cGUgPSBGVDIzMkJNOworCX0KKwlpbmZvKCJEZXRlY3RlZCAlcyIsIGZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOworfQorCisKIC8qCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFN5c2ZzIEF0dHJpYnV0ZQpAQCAtMTM1NSwxMiArMTA1OSwyMCBAQAogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KIAotLyogQ29tbW9uIHN0YXJ0dXAgc3Vicm91dGluZSAqLwotLyogQ2FsbGVkIGZyb20gZnRkaV9TSU9fc3RhcnR1cCwgZXRjLiAqLwotc3RhdGljIGludCBmdGRpX2NvbW1vbl9zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQorLyogUHJvYmUgZnVuY3Rpb24gdG8gY2hlY2sgZm9yIHNwZWNpYWwgZGV2aWNlcyAqLworc3RhdGljIGludCBmdGRpX3Npb19wcm9iZSAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCAodm9pZCAqKWlkLT5kcml2ZXJfaW5mbyk7CisKKwlyZXR1cm4gKDApOworfQorCisvKiBhdHRhY2ggc3Vicm91dGluZSAqLworc3RhdGljIGludCBmdGRpX3Npb19hdHRhY2ggKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OworCXN0cnVjdCBmdGRpX3Npb19xdWlyayAqcXVpcms7CiAJCiAJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKIApAQCAtMTQwMCwxNTAgKzExMTIsNDkgQEAKIAlwb3J0LT5idWxrX291dF9idWZmZXIgPSBOVUxMOwogCiAJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSwgcHJpdik7CisKKwlmdGRpX2RldGVybWluZV90eXBlIChzZXJpYWwtPnBvcnRbMF0pOworCWNyZWF0ZV9zeXNmc19hdHRycyhzZXJpYWwpOworCisJLyogQ2hlY2sgZm9yIGRldmljZSByZXF1aXJpbmcgc3BlY2lhbCBzZXQgdXAuICovCisJcXVpcmsgPSAoc3RydWN0IGZ0ZGlfc2lvX3F1aXJrICopdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOworCWlmIChxdWlyayAmJiBxdWlyay0+c2V0dXApIHsKKwkJcXVpcmstPnNldHVwKHNlcmlhbCk7CisJfQogCQogCXJldHVybiAoMCk7Ci19Cit9IC8qIGZ0ZGlfc2lvX2F0dGFjaCAqLwogCiAKLS8qIFN0YXJ0dXAgZm9yIHRoZSBTSU8gY2hpcCAqLworLyogU2V0dXAgZm9yIHRoZSBVU0ItVUlSVCBkZXZpY2UsIHdoaWNoIHJlcXVpcmVzIGhhcmR3aXJlZAorICogYmF1ZHJhdGUgKDM4NDAwIGdldHMgbWFwcGVkIHRvIDMxMjUwMCkgKi8KIC8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KLXN0YXRpYyBpbnQgZnRkaV9TSU9fc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3N0YXRpYyB2b2lkIGZ0ZGlfVVNCX1VJUlRfc2V0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwogCiAJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKIAotCWVyciA9IGZ0ZGlfY29tbW9uX3N0YXJ0dXAoc2VyaWFsKTsKLQlpZiAoZXJyKXsKLQkJcmV0dXJuIChlcnIpOwotCX0KLQotCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKLQlwcml2LT5jaGlwX3R5cGUgPSBTSU87Ci0JcHJpdi0+YmF1ZF9iYXNlID0gMTIwMDAwMDAgLyAxNjsKLQlwcml2LT53cml0ZV9vZmZzZXQgPSAxOwotCQotCXJldHVybiAoMCk7Ci19Ci0KLS8qIFN0YXJ0dXAgZm9yIHRoZSA4VTIzMkFNIGNoaXAgKi8KLS8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KLXN0YXRpYyBpbnQgZnRkaV84VTIzMkFNX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCi17IC8qIGZ0ZGlfOFUyMzJBTV9zdGFydHVwICovCi0Jc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwotCi0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQllcnIgPSBmdGRpX2NvbW1vbl9zdGFydHVwKHNlcmlhbCk7Ci0JaWYgKGVycil7Ci0JCXJldHVybiAoZXJyKTsKLQl9Ci0KLQlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Ci0JcHJpdi0+Y2hpcF90eXBlID0gRlQ4VTIzMkFNOwotCXByaXYtPmJhdWRfYmFzZSA9IDQ4MDAwMDAwIC8gMjsgLyogV291bGQgYmUgLyAxNiwgYnV0IEZUREkgc3VwcG9ydHMgMC4xMjUsIDAuMjUgYW5kIDAuNSBkaXZpc29yIGZyYWN0aW9ucyEgKi8KLQkKLQljcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKLQkKLQlyZXR1cm4gKDApOwotfSAvKiBmdGRpXzhVMjMyQU1fc3RhcnR1cCAqLwotCi0vKiBTdGFydHVwIGZvciB0aGUgRlQyMzJCTSBjaGlwICovCi0vKiBDYWxsZWQgZnJvbSB1c2JzZXJpYWw6c2VyaWFsX3Byb2JlICovCi1zdGF0aWMgaW50IGZ0ZGlfRlQyMzJCTV9zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoteyAvKiBmdGRpX0ZUMjMyQk1fc3RhcnR1cCAqLwotCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7Ci0JaW50IGVycjsKLQotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7Ci0JZXJyID0gZnRkaV9jb21tb25fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQotCi0JcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwotCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMyQk07Ci0JcHJpdi0+YmF1ZF9iYXNlID0gNDgwMDAwMDAgLyAyOyAvKiBXb3VsZCBiZSAvIDE2LCBidXQgRlQyMzJCTSBzdXBwb3J0cyBtdWx0aXBsZSBvZiAwLjEyNSBkaXZpc29yIGZyYWN0aW9ucyEgKi8KLQkKLQljcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKLQotCXJldHVybiAoMCk7Ci19IC8qIGZ0ZGlfRlQyMzJCTV9zdGFydHVwICovCi0KLS8qIFN0YXJ0dXAgZm9yIHRoZSBGVDIyMzJDIGNoaXAgKi8KLS8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KLXN0YXRpYyBpbnQgZnRkaV9GVDIyMzJDX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCi17IC8qIGZ0ZGlfRlQyMjMyQ19zdGFydHVwICovCi0Jc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwotCWludCBpbnRlcjsKLQotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7Ci0JZXJyID0gZnRkaV9jb21tb25fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQotCi0JcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwotCXByaXYtPmNoaXBfdHlwZSA9IEZUMjIzMkM7Ci0JaW50ZXIgPSBzZXJpYWwtPmludGVyZmFjZS0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwotCi0JaWYgKGludGVyKSB7Ci0JCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9COwotCX0KLQllbHNlICB7Ci0JCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9BOwotCX0KLQlwcml2LT5iYXVkX2Jhc2UgPSA0ODAwMDAwMCAvIDI7IC8qIFdvdWxkIGJlIC8gMTYsIGJ1dCBGVDIyMzJDIHN1cHBvcnRzIG11bHRpcGxlIG9mIDAuMTI1IGRpdmlzb3IgZnJhY3Rpb25zISAqLwotCQotCWNyZWF0ZV9zeXNmc19hdHRycyhzZXJpYWwpOwotCi0JcmV0dXJuICgwKTsKLX0gLyogZnRkaV9GVDIyMzJDX3N0YXJ0dXAgKi8KLQotLyogU3RhcnR1cCBmb3IgdGhlIFVTQi1VSVJUIGRldmljZSwgd2hpY2ggcmVxdWlyZXMgaGFyZHdpcmVkIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAzMTI1MDApICovCi0vKiBDYWxsZWQgZnJvbSB1c2JzZXJpYWw6c2VyaWFsX3Byb2JlICovCi1zdGF0aWMgaW50IGZ0ZGlfVVNCX1VJUlRfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKLXsgLyogZnRkaV9VU0JfVUlSVF9zdGFydHVwICovCi0Jc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwotCi0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQllcnIgPSBmdGRpXzhVMjMyQU1fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQotCiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwogCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwogCXByaXYtPmN1c3RvbV9kaXZpc29yID0gNzc7CiAJcHJpdi0+Zm9yY2VfYmF1ZCA9IEIzODQwMDsKLQkKLQlyZXR1cm4gKDApOwotfSAvKiBmdGRpX1VTQl9VSVJUX3N0YXJ0dXAgKi8KK30gLyogZnRkaV9VU0JfVUlSVF9zZXR1cCAqLwogCi0vKiBTdGFydHVwIGZvciB0aGUgSEUtVElSQTEgZGV2aWNlLCB3aGljaCByZXF1aXJlcyBoYXJkd2lyZWQKLSAqIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAxMDAwMDApICovCi1zdGF0aWMgaW50IGZ0ZGlfSEVfVElSQTFfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKLXsgLyogZnRkaV9IRV9USVJBMV9zdGFydHVwICovCisvKiBTZXR1cCBmb3IgdGhlIEhFLVRJUkExIGRldmljZSwgd2hpY2ggcmVxdWlyZXMgaGFyZHdpcmVkCisgKiBiYXVkcmF0ZSAoMzg0MDAgZ2V0cyBtYXBwZWQgdG8gMTAwMDAwKSBhbmQgUlRTLUNUUyBlbmFibGVkLiAgKi8KK3N0YXRpYyB2b2lkIGZ0ZGlfSEVfVElSQTFfc2V0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwogCiAJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQllcnIgPSBmdGRpX0ZUMjMyQk1fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQogCiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwogCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwogCXByaXYtPmN1c3RvbV9kaXZpc29yID0gMjQwOwogCXByaXYtPmZvcmNlX2JhdWQgPSBCMzg0MDA7CiAJcHJpdi0+Zm9yY2VfcnRzY3RzID0gMTsKLQkKLQlyZXR1cm4gKDApOwotfSAvKiBmdGRpX0hFX1RJUkExX3N0YXJ0dXAgKi8KK30gLyogZnRkaV9IRV9USVJBMV9zZXR1cCAqLwogCiAKIC8qIGZ0ZGlfc2h1dGRvd24gaXMgY2FsbGVkIGZyb20gdXNic2VyaWFsOnVzYl9zZXJpYWxfZGlzY29ubmVjdCAKQEAgLTIzNjcsNjAgKzE5NzgsMTEgQEAKIHsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JaW50ICByZXQsIG1hc2s7Ci0JCiAJZGJnKCIlcyBjbWQgMHglMDR4IiwgX19GVU5DVElPTl9fLCBjbWQpOwogCiAJLyogQmFzZWQgb24gY29kZSBmcm9tIGFjbS5jIGFuZCBvdGhlcnMgKi8KIAlzd2l0Y2ggKGNtZCkgewogCi0JY2FzZSBUSU9DTUJJUzogLyogdHVybnMgb24gKFNldHMpIHRoZSBsaW5lcyBhcyBzcGVjaWZpZWQgYnkgdGhlIG1hc2sgKi8KLQkJZGJnKCIlcyBUSU9DTUJJUyIsIF9fRlVOQ1RJT05fXyk7Ci0gCSAgICAgICAgaWYgKGdldF91c2VyKG1hc2ssICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0gIAkgICAgICAgIGlmIChtYXNrICYgVElPQ01fRFRSKXsKLQkJCWlmICgocmV0ID0gc2V0X2R0cihwb3J0LCBISUdIKSkgPCAwKSB7Ci0JCQkJZXJyKCJVcmIgdG8gc2V0IERUUiBmYWlsZWQiKTsKLQkJCQlyZXR1cm4ocmV0KTsKLQkJCX0KLQkJfQotCQlpZiAobWFzayAmIFRJT0NNX1JUUykgewotCQkJaWYgKChyZXQgPSBzZXRfcnRzKHBvcnQsIEhJR0gpKSA8IDApewotCQkJCWVycigiVXJiIHRvIHNldCBSVFMgZmFpbGVkIik7Ci0JCQkJcmV0dXJuKHJldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuKDApOwotCQlicmVhazsKLQotCWNhc2UgVElPQ01CSUM6IC8qIHR1cm5zIG9mZiAoQ2xlYXJzKSB0aGUgbGluZXMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBtYXNrICovCi0JCWRiZygiJXMgVElPQ01CSUMiLCBfX0ZVTkNUSU9OX18pOwotIAkgICAgICAgIGlmIChnZXRfdXNlcihtYXNrLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotICAJICAgICAgICBpZiAobWFzayAmIFRJT0NNX0RUUil7Ci0JCQlpZiAoKHJldCA9IHNldF9kdHIocG9ydCwgTE9XKSkgPCAwKXsKLQkJCQllcnIoIlVyYiB0byB1bnNldCBEVFIgZmFpbGVkIik7Ci0JCQkJcmV0dXJuKHJldCk7Ci0JCQl9Ci0JCX0JCi0JCWlmIChtYXNrICYgVElPQ01fUlRTKSB7Ci0JCQlpZiAoKHJldCA9IHNldF9ydHMocG9ydCwgTE9XKSkgPCAwKXsKLQkJCQllcnIoIlVyYiB0byB1bnNldCBSVFMgZmFpbGVkIik7Ci0JCQkJcmV0dXJuKHJldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuKDApOwotCQlicmVhazsKLQotCQkvKgotCQkgKiBJIGhhZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIFRDU0VUe0EsU317LEYsV30gYW5kCi0JCSAqIFRDR0VUe0EsU30gaGVyZSBzZXBhcmF0ZWx5LCBob3dldmVyIHdoZW4gdGVzdGluZyBJCi0JCSAqIGZvdW5kIHRoYXQgdGhlIGhpZ2hlciBsYXllcnMgYWN0dWFsbHkgZG8gdGhlIHRlcm1pb3MKLQkJICogY29udmVyc2lvbnMgdGhlbXNlbHZlcyBhbmQgcGFzcyB0aGUgY2FsbCBvbnRvCi0JCSAqIGZ0ZGlfc2lvX3NldF90ZXJtaW9zLiAKLQkJICoKLQkJICovCi0KIAljYXNlIFRJT0NHU0VSSUFMOiAvKiBnZXRzIHNlcmlhbCBwb3J0IGRhdGEgKi8KIAkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhwb3J0LCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7CiAKQEAgLTI1MTYsMjQgKzIwNzgsOSBAQAogCWludCByZXR2YWw7CiAKIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZmdGRpX1NJT19kZXZpY2UpOworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfc2lvX2RldmljZSk7CiAJaWYgKHJldHZhbCkKLQkJZ290byBmYWlsZWRfU0lPX3JlZ2lzdGVyOwotCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfOFUyMzJBTV9kZXZpY2UpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZmFpbGVkXzhVMjMyQU1fcmVnaXN0ZXI7Ci0JcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9GVDIzMkJNX2RldmljZSk7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBmYWlsZWRfRlQyMzJCTV9yZWdpc3RlcjsKLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZmdGRpX0ZUMjIzMkNfZGV2aWNlKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGZhaWxlZF9GVDIyMzJDX3JlZ2lzdGVyOwotCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfVVNCX1VJUlRfZGV2aWNlKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGZhaWxlZF9VU0JfVUlSVF9yZWdpc3RlcjsKLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZmdGRpX0hFX1RJUkExX2RldmljZSk7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBmYWlsZWRfSEVfVElSQTFfcmVnaXN0ZXI7CisJCWdvdG8gZmFpbGVkX3Npb19yZWdpc3RlcjsKIAlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJmZ0ZGlfZHJpdmVyKTsKIAlpZiAocmV0dmFsKSAKIAkJZ290byBmYWlsZWRfdXNiX3JlZ2lzdGVyOwpAQCAtMjU0MSwxOCArMjA4OCw4IEBACiAJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOwogCXJldHVybiAwOwogZmFpbGVkX3VzYl9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfSEVfVElSQTFfZGV2aWNlKTsKLWZhaWxlZF9IRV9USVJBMV9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfVVNCX1VJUlRfZGV2aWNlKTsKLWZhaWxlZF9VU0JfVUlSVF9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfRlQyMjMyQ19kZXZpY2UpOwotZmFpbGVkX0ZUMjIzMkNfcmVnaXN0ZXI6Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZmdGRpX0ZUMjMyQk1fZGV2aWNlKTsKLWZhaWxlZF9GVDIzMkJNX3JlZ2lzdGVyOgotCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV84VTIzMkFNX2RldmljZSk7Ci1mYWlsZWRfOFUyMzJBTV9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfU0lPX2RldmljZSk7Ci1mYWlsZWRfU0lPX3JlZ2lzdGVyOgorCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV9zaW9fZGV2aWNlKTsKK2ZhaWxlZF9zaW9fcmVnaXN0ZXI6CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjU2MywxMiArMjEwMCw3IEBACiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKIAl1c2JfZGVyZWdpc3RlciAoJmZ0ZGlfZHJpdmVyKTsKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIgKCZmdGRpX0hFX1RJUkExX2RldmljZSk7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9VU0JfVUlSVF9kZXZpY2UpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfRlQyMjMyQ19kZXZpY2UpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfRlQyMzJCTV9kZXZpY2UpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfOFUyMzJBTV9kZXZpY2UpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfU0lPX2RldmljZSk7CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9zaW9fZGV2aWNlKTsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCA5ZmNjN2JkLi5iZDBhYjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTY5Nyw3ICs2OTcsNyBAQAogVU5VU1VBTF9ERVYoICAweDA3YWYsIDB4MDAwNSwgMHgwMTAwLCAweDAxMDAsIAogCQkiTWljcm90ZWNoIiwKIAkJIlVTQi1TQ1NJLUhENTAiLAotCQlVU19TQ19TQ1NJLCBVU19QUl9CVUxLLCB1c2Jfc3Rvcl9ldXNjc2lfaW5pdCwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIHVzYl9zdG9yX2V1c2NzaV9pbml0LAogCQlVU19GTF9TQ01fTVVMVF9UQVJHICksIAogCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKaW5kZXggN2RmYmYzOS4uZGRjOTQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwLCBpOwogCiAJaWYgKCFmYl9pbmZvLT5jbWFwLnJlZCB8fCAhZmJfaW5mby0+Y21hcC5ibHVlIHx8Ci0JICAgIGZiX2luZm8tPmNtYXAuZ3JlZW4gfHwgZmJfaW5mby0+Y21hcC50cmFuc3ApCisJICAgICFmYl9pbmZvLT5jbWFwLmdyZWVuIHx8ICFmYl9pbmZvLT5jbWFwLnRyYW5zcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZmJfaW5mby0+Y21hcC5sZW47IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwppbmRleCA2YmExMGUzLi4zZTljY2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwpAQCAtNjMsNSArNjMsMTAgQEAKIAlkZXBlbmRzIG9uIExPR08gJiYgU1VQRVJICiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBMT0dPX00zMlJfQ0xVVDIyNAorCWJvb2wgIjIyNC1jb2xvciBNMzJSIExpbnV4IGxvZ28iCisJZGVwZW5kcyBvbiBMT0dPICYmIE0zMlIKKwlkZWZhdWx0IHkKKwogZW5kbWVudQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKaW5kZXggYjBkOTk1MC4uZDAyNDRjMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKQEAgLTEyLDYgKzEyLDcgQEAKIG9iai0kKENPTkZJR19MT0dPX1NVUEVSSF9NT05PKQkJKz0gbG9nb19zdXBlcmhfbW9uby5vCiBvYmotJChDT05GSUdfTE9HT19TVVBFUkhfVkdBMTYpCQkrPSBsb2dvX3N1cGVyaF92Z2ExNi5vCiBvYmotJChDT05GSUdfTE9HT19TVVBFUkhfQ0xVVDIyNCkJKz0gbG9nb19zdXBlcmhfY2x1dDIyNC5vCitvYmotJChDT05GSUdfTE9HT19NMzJSX0NMVVQyMjQpCQkrPSBsb2dvX20zMnJfY2x1dDIyNC5vCiAKICMgSG93IHRvIGdlbmVyYXRlIGxvZ28ncwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ28uYwppbmRleCA3N2I2MjIwLi43ODhmYTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMKQEAgLTMzLDYgKzMzLDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyBsb2dvX3N1cGVyaF9tb25vOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvIGxvZ29fc3VwZXJoX3ZnYTE2OwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvIGxvZ29fc3VwZXJoX2NsdXQyMjQ7CitleHRlcm4gY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gbG9nb19tMzJyX2NsdXQyMjQ7CiAKIAogY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmZiX2ZpbmRfbG9nbyhpbnQgZGVwdGgpCkBAIC05Nyw2ICs5OCwxMCBAQAogCQkvKiBTdXBlckggTGludXggbG9nbyAqLwogCQlsb2dvID0gJmxvZ29fc3VwZXJoX2NsdXQyMjQ7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfTE9HT19NMzJSX0NMVVQyMjQKKwkJLyogTTMyUiBMaW51eCBsb2dvICovCisJCWxvZ28gPSAmbG9nb19tMzJyX2NsdXQyMjQ7CisjZW5kaWYKIAl9CiAJcmV0dXJuIGxvZ287CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19tMzJyX2NsdXQyMjQucHBtIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ29fbTMycl9jbHV0MjI0LnBwbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI5ODNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ29fbTMycl9jbHV0MjI0LnBwbQpAQCAtMCwwICsxLDEyOTIgQEAKK1AzCisjIENSRUFUT1I6IFRoZSBHSU1QJ3MgUE5NIEZpbHRlciBWZXJzaW9uIDEuMAorIworIyBOb3RlOiBob3cgdG8gY29udmVydCBwcG0gdG8gcG5tKGFzY2lpKS4KKyMgICAkIGNvbnZlcnQgLXBvc3Rlcml6ZSAyMjQgbTMyci5wcG0gLSB8IHBubTJhc2MgLWY1ID5sb2dvX20zMnJfY2x1dDIyNC5wcG0KKyMKKyMgY29udmVydCAtIGltYWdlbWFnaWNrOiAvdXNyL2Jpbi9jb252ZXJ0CisjIHBubTJhc2MgLSBwbm0gdG8gYXNjaWktcG5tIGZvcm1hdCBjb252ZXJ0ZXIKKyMgICBodHRwOi8vd3d3LmlzLmFpc3QuZ28uanAvZXRsY2RiL3V0aWwvcDJhLmh0bSNFbmdsaXNoCisKKzgwIDgwCisyNTUKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNDMgNDMgNDMgIDc1IDc1IDc1ICAyNyAyNyAyNyAgMiAyIDMKKyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNTkgNTkgNTkgIDEyMyAxMjMgMTIzICA2NyA2NyA2NyAgMjcgMjcgMjcKKyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMTAgNiAzICA1OSA1OSA1OSAgODAgODAgODAgIDQzIDQzIDQzICAyNyAyNyAyNworICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDE5IDE5IDE5ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMTAgNiAzICAxMCA2IDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxMCA2IDMgIDExIDExIDExICAxMSAxMSAxMSAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyNyAyNyAyNyAgMTAgNiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxOSAxOSAxOSAgMiAyIDMgIDIgMiAzICA1MSA1MSA1MSAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAxMjMgMTIzIDEyMyAgMTk2IDE5NiAxOTYgIDExNSAxMTUgMTE1ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICA3NSA3NSA3NSAgMTQxIDE0MSAxNDAKKyAgMTcyIDE3MiAxNzIgIDE5NiAxOTYgMTk2ICAxOTAgMTg5IDE4OCAgMiAyIDMgIDExIDExIDExCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyNyAyNyAyNyAgMTY0IDE2NCAxNjQgIDIyOCAyMjggMjI4ICAyMjEgMjIxIDIyMCAgMTAgNiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDE3MiAxNzIgMTcyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIyMSAyMjEgMjIwICAzNSAzNSAzNSAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDE2NCAxNjQgMTY0ICAyMjggMjI4IDIyOCAgMzUgMzUgMzUgIDIzNiAyMzYgMjM2ICAyMzYgMjM2IDIzNgorICAyIDIgMyAgMTEgMTEgMTEgIDIgMiAzICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMiAyIDMgIDc1IDc1IDc1ICAyNDUgMjQ1IDI0NSAgMjQ1IDI0NSAyNDUgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyMTIgMjEyIDIxMiAgMiAyIDMgIDUxIDUxIDUxICAxMSAxMSAxMSAgMjQ1IDI0NSAyNDUKKyAgMjcgMjcgMjcgIDgwIDgwIDgwICAxMCA2IDMgIDI1NCAyNTQgMjUyICAyIDIgMworICAyIDIgMyAgOTEgOTEgOTEgIDE5IDE5IDE5ICAyNTQgMjU0IDI1MiAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDE5NiAxOTYgMTk2ICAxMCA2IDMgIDIgMiAzICAxMSAxMSAxMSAgMTA3IDEwNyAxMDcKKyAgNDkgMzUgNSAgNTcgNDIgMTEgIDMxIDIyIDMgIDIzNiAyMzYgMjM2ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyNTQgMjU0IDI1MiAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDEwNyAxMDcgMTA3ICAyMjEgMjIxIDIyMCAgMiAyIDMgIDY0IDQzIDcgIDE5NCAxNDggMTAKKyAgMjM2IDE4OCAxMCAgMjI1IDE4MCAxMCAgMTcwIDEyNiAxMCAgMjM2IDE4OCAxMCAgOTQgODYgNjcKKyAgMiAyIDMgIDIgMiAzICAyMDQgMjA0IDIwNCAgMjM2IDIzNiAyMzYgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMjI4IDIyOCAyMjggIDE4MiAxMjYgMTAgIDIxOCAxNjQgOSAgMjM2IDE4OCAxMAorICAyMzYgMTg4IDEwICAyMzcgMjA0IDE0ICAyMzYgMjA1IDQwICAyNDYgMjE0IDQ4ICAyNDYgMjE0IDQ4CisgIDI0NSAxODkgMTEgIDIwOSAxNTYgOSAgMTk2IDE5NiAxOTYgIDExIDExIDExICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDE2NSAxMTQgMTAgIDIwNyAxNDggNyAgMjI5IDE3MiA5ICAyMzYgMTgwIDEwCisgIDIzNiAxOTYgMTEgIDIzNyAyMDQgMTQgIDI0MiAyMTggNDMgIDI0NiAyMTggNzUgIDI0NiAyMTggMTkKKyAgMjQ2IDIxMyAxMyAgMjQ2IDIxOCAxOSAgMjQ0IDIwNSAxMSAgMjE4IDE2NCA5ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMTY0IDEwOSA1ICAxOTIgMTMzIDcgIDIyNCAxNjUgOSAgMjM2IDE4MCAxMCAgMjM2IDE4OCAxMAorICAyMzYgMTk2IDExICAyNDEgMjEyIDQyICAyNDYgMjE4IDc1ICAyNDYgMjE4IDE5ICAyNDYgMjE4IDE5CisgIDI0NiAyMTggMTkgIDIzNiAxOTYgMTEgIDE1MCAxMTQgMTAgIDIyOSAxNzIgOSAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDE2NSAxMTQgMTAgIDIwMSAxNDIgNyAgMjI5IDE3MiA5ICAyNDIgMTgyIDExICAyMzYgMTg4IDEwCisgIDIzNyAyMDQgMTQgIDI0NSAyMTMgNjcgIDI0NiAyMTggMTkgIDI0NiAyMTMgMTMgIDI0NiAyMTMgMTMKKyAgMTU0IDExOSAxMCAgMjA3IDE0OCA3ICAyMTggMTY0IDkgIDIxNiAxNTYgOCAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMTIwIDc4IDMgIDIyNSAxODAgMTAgIDI0NSAxODkgMTEgIDIzNiAyMDUgNDAKKyAgMjQxIDIxMiA0MiAgMjQxIDIxMiAxNyAgMjM3IDIwNCAxNCAgMTQ4IDEwNyA5ICAxODIgMTI2IDEwCisgIDIxNiAxNTYgOCAgMjE4IDE2NCA5ICAyMDcgMTQ4IDcgIDgyIDcwIDQzICAyIDIgMworICAyIDIgMyAgMTIzIDEyMyAxMjMgIDM1IDM1IDM1ICAyIDIgMyAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDEwIDYgMyAgMTgwIDE4MCAxODAgIDE1NiAxMDIgNSAgMTM1IDg4IDUgIDE0MiAxMDYgNworICAxMjYgOTggMTEgIDE2NSAxMTQgMTAgIDE4NSAxMzIgOSAgMjA3IDE0OCA3ICAyMTUgMTUwIDEzCisgIDE5OSAxNDAgOCAgMTg4IDE0OCA3MSAgMTk2IDE5NiAxOTYgIDE5MCAxODkgMTg4ICAyIDIgMworICAyIDIgMyAgMTEgMTEgMTEgIDEzMiAxMzIgMTMyICA3NSA3NSA3NSAgMiAyIDMKKyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAxMCA2IDMgIDE5MCAxODkgMTg4ICAxOTAgMTg5IDE4OCAgMTUxIDk3IDUgIDE5MiAxMzMgNworICAyMDcgMTQ4IDcgIDIwNiAxNDIgOCAgMTk5IDE0MCA4ICAxODAgMTIxIDcgIDE4MCAxMzIgMzEKKyAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4ICAyMTIgMjEyIDIxMiAgMjEyIDIxMiAyMTIgIDEwNyAxMDcgMTA3CisgIDIgMiAzICAyIDIgMyAgOTkgOTkgOTkgIDUxIDUxIDUxICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4ICAxMzYgOTUgNworICAxNTEgOTcgNSAgMTUxIDk3IDUgIDE1MSA5NyA1ICAxODMgMTU2IDkxICAxOTAgMTg5IDE4OAorICAxOTAgMTg5IDE4OCAgMjI4IDIyOCAyMjggIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjIxIDIyMSAyMjAKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAxMCA2IDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgNzUgNzUgNzUgIDI0NSAyNDUgMjQ1ICAxOTYgMTk2IDE5NiAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4CisgIDE5MCAxODkgMTg4ICAxOTYgMTk2IDE5NiAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4ICAyMDQgMjA0IDIwNAorICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMzUgMzUgMzUgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyNyAyNyAyNyAgMiAyIDMKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4CisgIDE5MCAxODkgMTg4ICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODggIDIxMiAyMTIgMjEyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDEwIDYgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzICAxMzIgMTMyIDEzMgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMzYgMjM2IDIzNiAgMTk2IDE5NiAxOTYKKyAgMTkwIDE4OSAxODggIDIwNCAyMDQgMjA0ICAyNDUgMjQ1IDI0NSAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgODAgODAgODAgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTIgMjEyIDIxMiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMDQgMjA0IDIwNCAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDIzNiAyMzYgMjM2ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDE2NCAxNjQgMTY0ICAyMTIgMjEyIDIxMgorICAyMzYgMjM2IDIzNiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyMzYgMjM2IDIzNiAgMjIxIDIyMSAyMjAKKyAgMjIxIDIyMSAyMjAgIDIyOCAyMjggMjI4ICAyNDUgMjQ1IDI0NSAgMjQ1IDI0NSAyNDUgIDI0NSAyNDUgMjQ1CisgIDIzNiAyMzYgMjM2ICAyMjEgMjIxIDIyMCAgMjEyIDIxMiAyMTIgIDIwNCAyMDQgMjA0ICAyMDQgMjA0IDIwNAorICAxOTYgMTk2IDE5NiAgMjA0IDIwNCAyMDQgIDU5IDU5IDU5ICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMjcgMjcgMjcgIDE3MiAxNzIgMTcyICAyMTIgMjEyIDIxMgorICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjI4IDIyOCAyMjgKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjIxIDIyMSAyMjAgIDIwNCAyMDQgMjA0ICAxOTYgMTk2IDE5NgorICAxOTYgMTk2IDE5NiAgMTk2IDE5NiAxOTYgIDIyOCAyMjggMjI4ICAxOSAxOSAxOSAgMiAyIDMKKyAgODAgODAgODAgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxMSAxMSAxMSAgMiAyIDMgIDE2NCAxNjQgMTY0ICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjM2IDIzNiAyMzYgIDIxMiAyMTIgMjEyICAxOTYgMTk2IDE5NiAgMjQ1IDI0NSAyNDUgIDIgMiAzCisgIDIgMiAzICAxMSAxMSAxMSAgNTEgNTEgNTEgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDg2IDg2IDgzCisgIDIgMiAzICAyNyAyNyAyNyAgMjM2IDIzNiAyMzYgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIxMiAyMTIgMjEyICAxOTYgMTk2IDE5NiAgOTEgOTEgOTEKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIyMSAyMjEgMjIwICAyNDUgMjQ1IDI0NQorICAyIDIgMyAgMTEgMTEgMTEgIDQzIDQzIDQzICAxOSAxOSAxOSAgMTAgNiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgODAgODAgODAgIDIgMiAzCisgIDIgMiAzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgNDMgNDMgNDMgIDI3IDI3IDI3ICA4MCA4MCA4MCAgMTkgMTkgMTkgIDgwIDgwIDgwCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIzNiAyMzYgMjM2ICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAxMSAxMSAxMSAgMTEgMTEgMTEgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMiAyIDMgIDY3IDY3IDY3ICAyIDIgMyAgMTkgMTkgMTkKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMTcgMTEgMjMzICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjI4IDIyOCAyMjggIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxMSAxMSAxMSAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIgMiAzICAxMCA2IDMgIDExIDExIDExICAyIDIgMyAgMjI4IDIyOCAyMjgKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDI3IDI3IDI3ICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMTEgMTEgMTEgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDE5IDE5IDE5ICAyIDIgMyAgMiAyIDMgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNDUgMjQ1IDI0NSAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMTkgMTkgMTkgIDIgMiAzICAxOSAxOSAxOSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDQzIDQzIDQzICAyIDIgMyAgNDMgNDMgNDMgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNzUgNzUgNzUgIDIgMiAzICA5OSA5OSA5OSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMjggMjI4IDIyOCAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDc1IDc1IDc1CisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAxMSAxMSAxMSAgMTA3IDEwNyAxMDcgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDE5IDE5IDE5CisgIDExIDExIDExICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMTEgMTEgMTEKKyAgMTQwIDEwMiAzICAxMSAxMSAxMSAgMTAgNiAzICA2NyA2NyA2NyAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDIyOCAyMjggMjI4ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMiAyIDMgIDQzIDQzIDQzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDExIDExIDExICA2NyA2NyA2NyAgMTEgMTEgMTEgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMTg1IDEzMiA5ICAyNDIgMTgyIDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDQ5IDM1IDUgIDIgMiAzICAyMjggMjI4IDIyOAorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjI4IDIyOCAyMjggIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDIzOCAyMjIgIDIzMiAxODkgOTQKKyAgMjI2IDE4NiA5OSAgNDMgNDMgNDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgNTkgNTkgNTkgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE2IDE1NiA4ICAyMzYgMTgwIDIyCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDQ5IDM1IDUgIDExIDExIDExCisgIDIxMiAyMTIgMjEyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMjggMjI4IDIyOCAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMjkgMTcyIDkgIDI0NiAyMTggMTkKKyAgMjQ2IDIxOCAxOSAgNDEgMjcgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDE5IDE5IDE5ICAyNyAyNyAyNyAgMTk2IDE1NCAxNAorICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDE5OSAxNDAgOCAgMjI5IDE3MiA5ICAyNDIgMTgyIDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NCAxOTYgMTAgIDIgMiAzCisgIDIgMiAzICAxMTUgMTE1IDExNSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMjggMjI4IDIyOCAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMjQgMTY1IDkgIDI0NSAxODkgMTEKKyAgMjM2IDE5NiAxMSAgMTkgMTkgMTkgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDIzNiAxOTYgMTEKKyAgMjQ0IDIwNSAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMTgyIDEyNiAxMCAgMjA5IDE1NiA5ICAyMTUgMTUwIDEzCisgIDE5MyAxNDAgMTAgIDIwNyAxNDggMjQgIDIxNiAxNTYgOCAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyMDkgMTU2IDkKKyAgMiAyIDMgIDIgMiAzICA0MyA0MyA0MyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjM2IDIzNiAyMzYgIDIxNiAxNTYgOCAgMjQ1IDE4OSAxMQorICAyMjkgMTcyIDkgIDY0IDQzIDcgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjA3IDE0OCA3ICAyMzYgMTg4IDEwCisgIDI0NSAxODkgMTEgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE4MCAxMjEgNyAgMjE2IDE1NiA4ICAyNDIgMTgyIDExICAyMzYgMTgwIDEwCisgIDIyOSAxNzIgOSAgMjQyIDE4MiAxMSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyMzcgMjA0IDE0CisgIDE3MCAxMjYgMTAgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDIzNiAyMzYgMjM2CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyMDQgMjA0IDIwNCAgMTk2IDE5NiAxOTYgIDIxNiAxNTYgOCAgMjM2IDE4MCAxMAorICAyMjQgMTY1IDkgIDE4MiAxMjYgMTAgIDczIDQ4IDYgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNDEgMjcgMyAgMTk5IDE0MCA4ICAyMjkgMTcyIDkgIDIzNiAxODAgMTAKKyAgMjQ1IDE4OSAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTg1IDEzMiA5ICAyMjkgMTcyIDkgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDIyNiAxODggMTEgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDExIDExIDExCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAxOTYgMTk2IDE5NiAgMTk2IDE5NiAxOTYgIDIxNSAxNTAgMTMgIDIzNiAxODAgMTAKKyAgMjI5IDE3MiA5ICAyMDEgMTQyIDcgIDE4NSAxMzIgOSAgMTgwIDEyMSA3ICAxNzMgMTIwIDEwCisgIDE4MCAxMjEgNyAgMTkyIDEzMyA3ICAyMjkgMTcyIDkgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTgwIDEyNiA0NyAgMjI0IDE2NSA5ICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyMzYgMTg4IDEwICAxOTMgMTQwIDEwICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTIgMjEyIDIxMiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyMDQgMjA0IDIwNCAgMTk2IDE5NiAxOTYgIDE5OSAxNDAgOCAgMjI5IDE3MiA5CisgIDIzNiAxODAgMTAgIDIxOCAxNjQgOSAgMjE1IDE1MCAxMyAgMjA3IDE0OCA3ICAyMDcgMTQ4IDcKKyAgMjE2IDE1NiA4ICAyMjkgMTcyIDkgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTg1IDEzMiA5ICAyMTYgMTU2IDggIDI0MiAxODIgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDIzNiAxOTYgMTEgIDE5IDE5IDE5ICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDExIDExIDExICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDIyMSAyMjEgMjIwICAxOTYgMTk2IDE5NiAgMTg1IDEzMiA5ICAyMjkgMTcyIDkKKyAgMjQyIDE4MiAxMSAgMjI5IDE3MiA5ICAyMjQgMTY1IDkgIDIxOCAxNjQgOSAgMjI0IDE2NSA5CisgIDIyOSAxNzIgOSAgMjM2IDE4MCAxMCAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyMzYgMTgwIDIyICAyNDIgMTgyIDExICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMzYgMTgwIDIyICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyMzYgMTg4IDEwICAyMjUgMTgwIDEwICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDExIDExIDExICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIyMSAyMjEgMjIwICAxOSAxOSAxOSAgMTg1IDEzMiA5ICAyMjQgMTY1IDkKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjM2IDE4MCAxMCAgMjM2IDE4MCAxMAorICAyNDIgMTgyIDExICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDE5NiAxNTQgMTQKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIwNyAxNDggNyAgMjM2IDE4MCAyMiAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjM3IDIwNCAxNCAgMTM1IDg4IDUgIDIgMiAzCisgIDI3IDI3IDI3ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICA2NyA2NyA2NyAgMTkgMTMgMyAgMTg1IDEzMiA5ICAyMjkgMTcyIDkKKyAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjM2IDE4MCAyMiAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEKKyAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDIzNiAxODggMTAgIDIyNiAxODggMTEgIDEwNCA4MyA0OAorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyIDIgMyAgMiAyIDMgIDU2IDM4IDUgIDE4NSAxMzIgOSAgMjI5IDE3MiA5CisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExCisgIDIyOSAxNzIgOSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE4MiAxMjYgMTAgIDIxNSAxNTAgMTMgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDIzNiAxOTYgMTEgIDIxNiAxNTYgOAorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDc1IDU0IDMgIDE4MiAxMjYgMTAgIDIyOSAxNzIgOQorICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjI5IDE3MiA5CisgIDIwNyAxNDggMjQgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAxOTIgMTMzIDcgIDIyOSAxNzIgOSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjI1IDE4MCAxMCAgMjI0IDE2NSA5CisgIDEwNyA2OSA1ICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIzNiAyMzYgMjM2ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgOTEgNjcgOSAgMTgyIDEyNiAxMCAgMjI5IDE3MiA5CisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyNDIgMTgyIDExICAyMTYgMTU2IDggIDE4MCAxMjYgNDcKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIwNiAxNDIgOCAgMjI0IDE2NSA5ICAyNDUgMTg5IDExICAyNDIgMTgyIDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyNDIgMTgyIDExICAyMTYgMTU2IDgKKyAgMTU2IDEwMiA1ICAxOSAxMyAzICA0MyA0MyA0MyAgMTk2IDE5NiAxOTYgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIwNCAyMDQgMjA0ICA1MSA1MSA1MQorICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICA5NSA2MiA1ICAxODUgMTMyIDkgIDIyOSAxNzIgOQorICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjM2IDE4MCAyMiAgMjE2IDE1NiA4ICAyMDYgMTQyIDggIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE5MiAxMzMgNyAgMjE1IDE1MCAxMyAgMjI5IDE3MiA5ICAyMjkgMTcyIDkKKyAgMjM2IDE4MCAxMCAgMjM2IDE4MCAyMiAgMjQyIDE4MiAxMSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDIyOSAxNzIgOSAgMjE2IDE1NiA4CisgIDE1NiAxMDIgNSAgODMgNTQgNiAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMTE1IDczIDMgIDE4NSAxMzIgOSAgMjI5IDE3MiA5CisgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjI5IDE3MiA5ICAyMjkgMTcyIDkgIDIxNiAxNTYgOAorICAxODAgMTIxIDcgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE4MCAxMjEgNyAgMTgyIDEyNiAxMCAgMTkyIDEzMyA3ICAxOTkgMTQwIDgKKyAgMjA3IDE0OCA3ICAyMTUgMTUwIDEzICAyMTYgMTU2IDggIDIyNCAxNjUgOSAgMjI5IDE3MiA5CisgIDIzNiAxODAgMjIgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjI5IDE3MiA5ICAxOTkgMTQwIDgKKyAgMTUxIDk3IDUgIDEwMSA2NyA3ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAxMTUgNzMgMyAgMTgwIDEyMSA3ICAyMTYgMTU2IDgKKyAgMjM2IDE4MCAyMiAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMQorICAyMzYgMTgwIDEwICAyMjQgMTY1IDkgIDIxNSAxNTAgMTMgIDIwNiAxNDIgOCAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDE1NiAxMDIgNSAgMTY0IDEwOSA1ICAxNzIgMTE0IDUgIDE4MCAxMjEgNyAgMTgwIDEyMSA3CisgIDE5MiAxMzMgNyAgMjAxIDE0MiA3ICAyMTYgMTU2IDggIDIyNCAxNjUgOSAgMjM2IDE4MCAyMgorICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyMjkgMTcyIDkgIDIwMSAxNDIgNyAgMTcyIDExNCA1CisgIDEyNSA4MyA1ICA4MyA1NCA2ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICA5MSA1OCA1ICAxNTYgMTAyIDUgIDE5MiAxMzMgNworICAyMTYgMTU2IDggIDIyOSAxNzIgOSAgMjM2IDE4MCAxMCAgMjM2IDE4MCAxMCAgMjI5IDE3MiA5CisgIDIxNSAxNTAgMTMgIDE5OSAxNDAgOCAgMTY0IDEwOSA1ICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMTIwIDc4IDMgIDEzMiA4MiAzCisgIDE1MSA5NyA1ICAxNTcgMTA2IDcgIDE4MCAxMjEgNyAgMTg1IDEzMiA5ICAxOTMgMTQwIDEwCisgIDIwNyAxNDggNyAgMjA3IDE0OCA3ICAxOTIgMTMzIDcgIDE3MiAxMTQgNSAgMTMyIDgyIDMKKyAgMTAxIDY3IDcgIDQxIDI3IDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDczIDQ4IDYgIDE0MyA5MCAzICAxODAgMTIxIDcKKyAgMTkyIDEzMyA3ICAyMDcgMTQ4IDcgIDIwNyAxNDggNyAgMjAxIDE0MiA3ICAxODUgMTMyIDkKKyAgMTczIDEyMCAxMCAgMTM2IDk1IDcgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDkxIDU4IDUgIDEyNSA4MyA1ICAxMzUgODggNQorICAxNDQgOTUgNyAgMTUxIDk3IDUgIDEzMiA4MiAzICAxMTUgNzMgMyAgOTUgNjIgNQorICA2NCA0MyA3ICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICA2NCA0MyA3ICA5MSA1OCA1ICAxNTEgOTcgNQorICAxNTcgMTA2IDcgIDE3MiAxMTQgNSAgMTcyIDExNCA1ICAxNjQgMTA5IDUgIDE1MSA5NyA1CisgIDg1IDU5IDYgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDczIDQ4IDYKKyAgOTEgNTggNSAgOTUgNjIgNSAgOTUgNjIgNSAgOTEgNTggNSAgNTYgMzggNQorICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICA4MyA1NCA2CisgIDEwNyA2OSA1ICAxMzIgODIgMyAgMTI1IDgzIDUgIDEwMSA2NyA3ICA3MSA0NyAzMQorICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jIGIvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKaW5kZXggM2RkMWRlMS4uYjAwODg3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKQEAgLTUyMyw3ICs1MjMsNyBAQAogI2RlZmluZSBpbnZhbGlkYXRlX2NhY2hlKGFkZHIpCiAjZW5kaWYKIAotc3RhdGljIGludCBfX2RldmluaXQgcGxhdGludW1mYl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlKiBvZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgcGxhdGludW1mYl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlKiBvZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUJKmRwID0gb2Rldi0+bm9kZTsKIAlzdHJ1Y3QgZmJfaW5mbwkJKmluZm87CkBAIC02NDcsMTIgKzY0NywxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIHBsYXRpbnVtZmJfbWF0Y2hbXSA9IAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcGxhdGludW1mYl9tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAicGxhdGludW0iLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSCwKIAl9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczFkMTN4eHhmYi5jIGIvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMKaW5kZXggNzg5ZGUxMy4uMzg0OGJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMKQEAgLTY3LDEyICs2NywxOCBAQAogc3RhdGljIGlubGluZSB1OAogczFkMTN4eHhmYl9yZWFkcmVnKHN0cnVjdCBzMWQxM3h4eGZiX3BhciAqcGFyLCB1MTYgcmVnbm8pCiB7CisjaWYgZGVmaW5lZChDT05GSUdfUExBVF9NMzI3MDBVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9PUFNQVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkzKQorCXJlZ25vPSgocmVnbm8gJiAxKSA/IChyZWdubyAmIH4xTCkgOiAocmVnbm8gKyAxKSk7CisjZW5kaWYKIAlyZXR1cm4gcmVhZGIocGFyLT5yZWdzICsgcmVnbm8pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHMxZDEzeHh4ZmJfd3JpdGVyZWcoc3RydWN0IHMxZDEzeHh4ZmJfcGFyICpwYXIsIHUxNiByZWdubywgdTggdmFsdWUpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfUExBVF9NMzI3MDBVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9PUFNQVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkzKQorCXJlZ25vPSgocmVnbm8gJiAxKSA/IChyZWdubyAmIH4xTCkgOiAocmVnbm8gKyAxKSk7CisjZW5kaWYKIAl3cml0ZWIodmFsdWUsIHBhci0+cmVncyArIHJlZ25vKTsKIH0KIApAQCAtMjU5LDcgKzI2NSwxMSBAQAogCQkJZGJnKCJzMWQxM3h4eGZiX3NldGNvbHJlZzogcHNldWRvICVkLCB2YWwgJTA4eFxuIiwKIAkJCQkgICAgcmVnbm8sIHBzZXVkb192YWwpOwogCisjaWYgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSSkKKwkJCSgodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9IGNwdV90b19sZTE2KHBzZXVkb192YWwpOworI2Vsc2UKIAkJCSgodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9IHBzZXVkb192YWw7CisjZW5kaWYKIAogCQkJYnJlYWs7CiAJCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfZHJpdmVyLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwppbmRleCA4ZmFkY2RhLi5mNDYzM2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwpAQCAtMjExMyw3ICsyMTEzLDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAic3RhdGU6ICV1XG4iLCBzdGF0ZSk7CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JZmJfc2V0X3N1c3BlbmQoaW5mbywgc3RhdGUpOworCWZiX3NldF9zdXNwZW5kKGluZm8sIHBjaV9jaG9vc2Vfc3RhdGUoZGV2LCBzdGF0ZSkpOwogCXNhdmFnZV9kaXNhYmxlX21taW8ocGFyKTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCAzMTJjZjMyLi44YTljNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmMKKysrIGIvZHJpdmVycy93MS93MS5jCkBAIC01MTYsNiArNTE2LDcgQEAKIAlzdHJ1Y3QgdzFfcmVnX251bSAqdG1wOwogCWludCBmYW1pbHlfZm91bmQgPSAwOwogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKKwl1NjQgcm5fbGUgPSBjcHVfdG9fbGU2NChybik7CiAKIAlkZXYgPSB3MV9zZWFyY2hfbWFzdGVyKGRhdGEpOwogCWlmICghZGV2KSB7CkBAIC01NDQsMTAgKzU0NSw4IEBACiAJCXNsYXZlX2NvdW50Kys7CiAJfQogCi0Jcm4gPSBjcHVfdG9fbGU2NChybik7Ci0KIAlpZiAoc2xhdmVfY291bnQgPT0gZGV2LT5zbGF2ZV9jb3VudCAmJgotCQlybiAmJiAoKGxlNjRfdG9fY3B1KHJuKSA+PiA1NikgJiAweGZmKSA9PSB3MV9jYWxjX2NyYzgoKHU4ICopJnJuLCA3KSkgeworCQlybiAmJiAoKHJuID4+IDU2KSAmIDB4ZmYpID09IHcxX2NhbGNfY3JjOCgodTggKikmcm5fbGUsIDcpKSB7CiAJCXcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCB0bXApOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggMDYyMTc3OS4uNWQwYzRiZSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0yOSw2ICsyOSw3IEBACiBjb25maWcgRVhUMl9GU19QT1NJWF9BQ0wKIAlib29sICJFeHQyIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgogCWRlcGVuZHMgb24gRVhUMl9GU19YQVRUUgorCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAloZWxwCiAJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCiAJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCkBAIC0xMTQsNiArMTE1LDcgQEAKIGNvbmZpZyBFWFQzX0ZTX1BPU0lYX0FDTAogCWJvb2wgIkV4dDMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMiCiAJZGVwZW5kcyBvbiBFWFQzX0ZTX1hBVFRSCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIFBvc2l4IEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKSBzdXBwb3J0IHBlcm1pc3Npb25zIGZvciB1c2VycyBhbmQKIAkgIGdyb3VwcyBiZXlvbmQgdGhlIG93bmVyL2dyb3VwL3dvcmxkIHNjaGVtZS4KQEAgLTI0MSw2ICsyNDMsNyBAQAogY29uZmlnIFJFSVNFUkZTX0ZTX1BPU0lYX0FDTAogCWJvb2wgIlJlaXNlckZTIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgogCWRlcGVuZHMgb24gUkVJU0VSRlNfRlNfWEFUVFIKKwlzZWxlY3QgRlNfUE9TSVhfQUNMCiAJaGVscAogCSAgUG9zaXggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZAogCSAgZ3JvdXBzIGJleW9uZCB0aGUgb3duZXIvZ3JvdXAvd29ybGQgc2NoZW1lLgpAQCAtMjc0LDYgKzI3Nyw3IEBACiBjb25maWcgSkZTX1BPU0lYX0FDTAogCWJvb2wgIkpGUyBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKIAlkZXBlbmRzIG9uIEpGU19GUworCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAloZWxwCiAJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCiAJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCkBAIC0zMTgsOCArMzIyLDcgQEAKICMgCU5ldmVyIHVzZSB0aGlzIHN5bWJvbCBmb3IgaWZkZWZzLgogIwogCWJvb2wKLQlkZXBlbmRzIG9uIEVYVDJfRlNfUE9TSVhfQUNMIHx8IEVYVDNfRlNfUE9TSVhfQUNMIHx8IEpGU19QT1NJWF9BQ0wgfHwgUkVJU0VSRlNfRlNfUE9TSVhfQUNMIHx8IE5GU0RfVjQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0IG4KIAogc291cmNlICJmcy94ZnMvS2NvbmZpZyIKIApAQCAtMzU2LDYgKzM1OSwxOSBAQAogCSAgSWYgeW91IGRvbid0IGtub3cgd2hldGhlciB5b3UgbmVlZCBpdCwgdGhlbiB5b3UgZG9uJ3QgbmVlZCBpdDoKIAkgIGFuc3dlciBOLgogCitjb25maWcgSU5PVElGWQorCWJvb2wgIklub3RpZnkgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgaW5vdGlmeSBzdXBwb3J0IGFuZCB0aGUgL2Rldi9pbm90aWZ5IGNoYXJhY3RlcgorCSAgZGV2aWNlLiAgSW5vdGlmeSBpcyBhIGZpbGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0gYW5kIGEKKwkgIHJlcGxhY2VtZW50IGZvciBkbm90aWZ5LiAgSW5vdGlmeSBmaXhlcyBudW1lcm91cyBzaG9ydGNvbWluZ3MgaW4KKwkgIGRub3RpZnkgYW5kIGludHJvZHVjZXMgc2V2ZXJhbCBuZXcgZmVhdHVyZXMuICBJdCBhbGxvd3MgbW9uaXRvcmluZworCSAgb2YgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdmlhIGEgc2luZ2xlIG9wZW4gZmQuICBNdWx0aXBsZSBmaWxlCisJICBldmVudHMgYXJlIHN1cHBvcnRlZC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIFFVT1RBCiAJYm9vbCAiUXVvdGEgc3VwcG9ydCIKIAloZWxwCkBAIC0xMDM2LDI2ICsxMDUyLDE4IEBACiAJICBJZiByZXBvcnRpbmcgYnVncywgcGxlYXNlIHRyeSB0byBoYXZlIGF2YWlsYWJsZSBhIGZ1bGwgZHVtcCBvZiB0aGUKIAkgIG1lc3NhZ2VzIGF0IGRlYnVnIGxldmVsIDEgd2hpbGUgdGhlIG1pc2JlaGF2aW91ciB3YXMgb2NjdXJyaW5nLgogCi1jb25maWcgSkZGUzJfRlNfTkFORAotCWJvb2wgIkpGRlMyIHN1cHBvcnQgZm9yIE5BTkQgZmxhc2giCitjb25maWcgSkZGUzJfRlNfV1JJVEVCVUZGRVIKKwlib29sICJKRkZTMiB3cml0ZS1idWZmZXJpbmcgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEpGRlMyX0ZTCi0JZGVmYXVsdCBuCisJZGVmYXVsdCB5CiAJaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciBOQU5EIGZsYXNoIGluIEpGRlMyLiBOQU5EIGlzIGEgbmV3ZXIKLQkgIHR5cGUgb2YgZmxhc2ggY2hpcCBkZXNpZ24gdGhhbiB0aGUgdHJhZGl0aW9uYWwgTk9SIGZsYXNoLCB3aXRoCi0JICBoaWdoZXIgZGVuc2l0eSBidXQgYSBoYW5kZnVsIG9mIGNoYXJhY3RlcmlzdGljcyB3aGljaCBtYWtlIGl0IG1vcmUKLQkgIGludGVyZXN0aW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0gdG8gdXNlLgorCSAgVGhpcyBlbmFibGVzIHRoZSB3cml0ZS1idWZmZXJpbmcgc3VwcG9ydCBpbiBKRkZTMi4KIAotCSAgU2F5ICdOJyB1bmxlc3MgeW91IGhhdmUgTkFORCBmbGFzaC4KLQotY29uZmlnIEpGRlMyX0ZTX05PUl9FQ0MKLSAgICAgICAgYm9vbCAiSkZGUzIgc3VwcG9ydCBmb3IgRUNDJ2QgTk9SIGZsYXNoIChFWFBFUklNRU5UQUwpIgotICAgICAgICBkZXBlbmRzIG9uIEpGRlMyX0ZTICYmIEVYUEVSSU1FTlRBTAotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgaGVscAotICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIE5PUiBmbGFzaCB3aXRoIHRyYW5zcGFyZW50Ci0gICAgICAgICAgRUNDIGZvciBKRkZTMi4gVGhpcyB0eXBlIG9mIGZsYXNoIGNoaXAgaXMgbm90IGNvbW1vbiwgaG93ZXZlciBpdCBpcwotICAgICAgICAgIGF2YWlsYWJsZSBmcm9tIFNUIE1pY3JvZWxlY3Ryb25pY3MuCisJICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBKRkZTMiBvbiB0aGUgZm9sbG93aW5nCisJICB0eXBlcyBvZiBmbGFzaCBkZXZpY2VzOgorCSAgICAtIE5BTkQgZmxhc2gKKwkgICAgLSBOT1IgZmxhc2ggd2l0aCB0cmFuc3BhcmVudCBFQ0MKKwkgICAgLSBEYXRhRmxhc2gKIAogY29uZmlnIEpGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMKIAlib29sICJBZHZhbmNlZCBjb21wcmVzc2lvbiBvcHRpb25zIGZvciBKRkZTMiIKQEAgLTE0MzgsNiArMTQ0Niw3IEBACiAJc2VsZWN0IE5GU0RfVENQCiAJc2VsZWN0IENSWVBUT19NRDUKIAlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgdGhlIE5GU3Y0IHNlcnZlciBhcyB3ZWxsIGFzIHRoZSBORlN2MgogCSAgYW5kIE5GU3YzIHNlcnZlcnMsIHNheSBZIGhlcmUuICBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsLCBhbmQKZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggMjBlZGNmMjguLmNmOTVlYjggMTAwNjQ0Ci0tLSBhL2ZzL01ha2VmaWxlCisrKyBiL2ZzL01ha2VmaWxlCkBAIC0xMiw2ICsxMiw3IEBACiAJCXNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIG1wYWdlLm8gZGlyZWN0LWlvLm8gXAogCQlpb3ByaW8ubwogCitvYmotJChDT05GSUdfSU5PVElGWSkJCSs9IGlub3RpZnkubwogb2JqLSQoQ09ORklHX0VQT0xMKQkJKz0gZXZlbnRwb2xsLm8KIG9iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXQubwogCmRpZmYgLS1naXQgYS9mcy9hdHRyLmMgYi9mcy9hdHRyLmMKaW5kZXggYzNjNzZmZS4uYjE3OTZmYiAxMDA2NDQKLS0tIGEvZnMvYXR0ci5jCisrKyBiL2ZzL2F0dHIuYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KQEAgLTEwNywzMSArMTA3LDggQEAKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaW5vZGVfc2V0YXR0cik7CiAKLWludCBzZXRhdHRyX21hc2sodW5zaWduZWQgaW50IGlhX3ZhbGlkKQotewotCXVuc2lnbmVkIGxvbmcgZG5fbWFzayA9IDA7Ci0KLQlpZiAoaWFfdmFsaWQgJiBBVFRSX1VJRCkKLQkJZG5fbWFzayB8PSBETl9BVFRSSUI7Ci0JaWYgKGlhX3ZhbGlkICYgQVRUUl9HSUQpCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkKLQkJZG5fbWFzayB8PSBETl9NT0RJRlk7Ci0JLyogYm90aCB0aW1lcyBpbXBsaWVzIGEgdXRpbWUocykgY2FsbCAqLwotCWlmICgoaWFfdmFsaWQgJiAoQVRUUl9BVElNRXxBVFRSX01USU1FKSkgPT0gKEFUVFJfQVRJTUV8QVRUUl9NVElNRSkpCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCWVsc2UgaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkKLQkJZG5fbWFzayB8PSBETl9BQ0NFU1M7Ci0JZWxzZSBpZiAoaWFfdmFsaWQgJiBBVFRSX01USU1FKQotCQlkbl9tYXNrIHw9IEROX01PRElGWTsKLQlpZiAoaWFfdmFsaWQgJiBBVFRSX01PREUpCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCXJldHVybiBkbl9tYXNrOwotfQotCiBpbnQgbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKiBhdHRyKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CkBAIC0xOTcsMTEgKzE3NCw5IEBACiAJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKQogCQl1cF93cml0ZSgmZGVudHJ5LT5kX2lub2RlLT5pX2FsbG9jX3NlbSk7CiAKLQlpZiAoIWVycm9yKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZG5fbWFzayA9IHNldGF0dHJfbWFzayhpYV92YWxpZCk7Ci0JCWlmIChkbl9tYXNrKQotCQkJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBkbl9tYXNrKTsKLQl9CisJaWYgKCFlcnJvcikKKwkJZnNub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFfdmFsaWQpOworCiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3dhaXRxLmMgYi9mcy9hdXRvZnM0L3dhaXRxLmMKaW5kZXggZmEyMzQ4ZC4uM2RmODYyOCAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC93YWl0cS5jCisrKyBiL2ZzL2F1dG9mczQvd2FpdHEuYwpAQCAtMjMxLDggKzIzMSw4IEBACiAJCWludCB0eXBlID0gKG5vdGlmeSA9PSBORllfTU9VTlQgPwogCQkJYXV0b2ZzX3B0eXBlX21pc3NpbmcgOiBhdXRvZnNfcHR5cGVfZXhwaXJlX211bHRpKTsKIAotCQlEUFJJTlRLKCgibmV3IHdhaXQgaWQgPSAweCUwOGx4LCBuYW1lID0gJS4qcywgbmZ5PSVkXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpIHdxLT53YWl0X3F1ZXVlX3Rva2VuLCB3cS0+bGVuLCB3cS0+bmFtZSwgbm90aWZ5KSk7CisJCURQUklOVEsoIm5ldyB3YWl0IGlkID0gMHglMDhseCwgbmFtZSA9ICUuKnMsIG5meT0lZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKSB3cS0+d2FpdF9xdWV1ZV90b2tlbiwgd3EtPmxlbiwgd3EtPm5hbWUsIG5vdGlmeSk7CiAKIAkJLyogYXV0b2ZzNF9ub3RpZnlfZGFlbW9uKCkgbWF5IGJsb2NrICovCiAJCWF1dG9mczRfbm90aWZ5X2RhZW1vbihzYmksIHdxLCB0eXBlKTsKZGlmZiAtLWdpdCBhL2ZzL2Jpby5jIGIvZnMvYmlvLmMKaW5kZXggM2ExNDcyYS4uY2E4ZjdhOCAxMDA2NDQKLS0tIGEvZnMvYmlvLmMKKysrIGIvZnMvYmlvLmMKQEAgLTUyLDcgKzUyLDcgQEAKICAqLwogCiAjZGVmaW5lIEJWKHgpIHsgLm5yX3ZlY3MgPSB4LCAubmFtZSA9ICJiaW92ZWMtIl9fc3RyaW5naWZ5KHgpIH0KLXN0YXRpYyBzdHJ1Y3QgYmlvdmVjX3NsYWIgYnZlY19zbGFic1tCSU9WRUNfTlJfUE9PTFNdID0geworc3RhdGljIHN0cnVjdCBiaW92ZWNfc2xhYiBidmVjX3NsYWJzW0JJT1ZFQ19OUl9QT09MU10gX19yZWFkX21vc3RseSA9IHsKIAlCVigxKSwgQlYoNCksIEJWKDE2KSwgQlYoNjQpLCBCVigxMjgpLCBCVihCSU9fTUFYX1BBR0VTKSwKIH07CiAjdW5kZWYgQlYKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggNTYxZTYzYS4uNmEyNWQ3ZCAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTUxMyw4ICs1MTMsOCBAQAogICovCiBzdGF0aWMgdm9pZCBlbmRfYnVmZmVyX2FzeW5jX3JlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQogewotCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGFnZV91cHRvZGF0ZV9sb2NrKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZmlyc3Q7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXA7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IHBhZ2VfdXB0b2RhdGUgPSAxOwpAQCAtNTM2LDcgKzUzNiw5IEBACiAJICogdHdvIGJ1ZmZlciBoZWFkcyBlbmQgSU8gYXQgYWxtb3N0IHRoZSBzYW1lIHRpbWUgYW5kIGJvdGgKIAkgKiBkZWNpZGUgdGhhdCB0aGUgcGFnZSBpcyBub3cgY29tcGxldGVseSBkb25lLgogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwlmaXJzdCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYml0X3NwaW5fbG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmZmlyc3QtPmJfc3RhdGUpOwogCWNsZWFyX2J1ZmZlcl9hc3luY19yZWFkKGJoKTsKIAl1bmxvY2tfYnVmZmVyKGJoKTsKIAl0bXAgPSBiaDsKQEAgLTU0OSw3ICs1NTEsOCBAQAogCQl9CiAJCXRtcCA9IHRtcC0+Yl90aGlzX3BhZ2U7CiAJfSB3aGlsZSAodG1wICE9IGJoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwliaXRfc3Bpbl91bmxvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAkvKgogCSAqIElmIG5vbmUgb2YgdGhlIGJ1ZmZlcnMgaGFkIGVycm9ycyBhbmQgdGhleSBhcmUgYWxsCkBAIC01NjEsNyArNTY0LDggQEAKIAlyZXR1cm47CiAKIHN0aWxsX2J1c3k6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJYml0X3NwaW5fdW5sb2NrKEJIX1VwdG9kYXRlX0xvY2ssICZmaXJzdC0+Yl9zdGF0ZSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybjsKIH0KIApAQCAtNTcyLDggKzU3Niw4IEBACiB2b2lkIGVuZF9idWZmZXJfYXN5bmNfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQogewogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCkBAIC01OTQsNyArNTk4LDEwIEBACiAJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJZmlyc3QgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJpdF9zcGluX2xvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwogCWNsZWFyX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CiAJdW5sb2NrX2J1ZmZlcihiaCk7CiAJdG1wID0gYmgtPmJfdGhpc19wYWdlOwpAQCAtNjA1LDEyICs2MTIsMTQgQEAKIAkJfQogCQl0bXAgPSB0bXAtPmJfdGhpc19wYWdlOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwliaXRfc3Bpbl91bmxvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCXJldHVybjsKIAogc3RpbGxfYnVzeToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwliaXRfc3Bpbl91bmxvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9mcy9jaGFyX2Rldi5jIGIvZnMvY2hhcl9kZXYuYwppbmRleCBhNjlhNWQ4Li4zYjFiMWVlIDEwMDY0NAotLS0gYS9mcy9jaGFyX2Rldi5jCisrKyBiL2ZzL2NoYXJfZGV2LmMKQEAgLTI3Nyw4ICsyNzcsOSBAQAogdm9pZCBjZGV2X3B1dChzdHJ1Y3QgY2RldiAqcCkKIHsKIAlpZiAocCkgeworCQlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IHAtPm93bmVyOwogCQlrb2JqZWN0X3B1dCgmcC0+a29iaik7Ci0JCW1vZHVsZV9wdXQocC0+b3duZXIpOworCQltb2R1bGVfcHV0KG93bmVyKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggNzI4Y2Q4My4uNmIwNmI2YiAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RpcmVudC5oPgotI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CkBAIC0xMzA3LDkgKzEzMDcsMTMgQEAKIG91dDoKIAlpZiAoaW92ICE9IGlvdnN0YWNrKQogCQlrZnJlZShpb3YpOwotCWlmICgocmV0ICsgKHR5cGUgPT0gUkVBRCkpID4gMCkKLQkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksCi0JCQkJKHR5cGUgPT0gUkVBRCkgPyBETl9BQ0NFU1MgOiBETl9NT0RJRlkpOworCWlmICgocmV0ICsgKHR5cGUgPT0gUkVBRCkpID4gMCkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwkJaWYgKHR5cGUgPT0gUkVBRCkKKwkJCWZzbm90aWZ5X2FjY2VzcyhkZW50cnkpOworCQllbHNlCisJCQlmc25vdGlmeV9tb2RpZnkoZGVudHJ5KTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZGNvb2tpZXMuYyBiL2ZzL2Rjb29raWVzLmMKaW5kZXggNTgxYWFjOS4uMDJhYTBkZCAxMDA2NDQKLS0tIGEvZnMvZGNvb2tpZXMuYworKysgYi9mcy9kY29va2llcy5jCkBAIC05NCwxMiArOTQsMTAgQEAKIAlpZiAoIWRjcykKIAkJcmV0dXJuIE5VTEw7CiAKLQlhdG9taWNfaW5jKCZkZW50cnktPmRfY291bnQpOwotCWF0b21pY19pbmMoJnZmc21udC0+bW50X2NvdW50KTsKIAlkZW50cnktPmRfY29va2llID0gZGNzOwogCi0JZGNzLT5kZW50cnkgPSBkZW50cnk7Ci0JZGNzLT52ZnNtbnQgPSB2ZnNtbnQ7CisJZGNzLT5kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJZGNzLT52ZnNtbnQgPSBtbnRnZXQodmZzbW50KTsKIAloYXNoX2Rjb29raWUoZGNzKTsKIAogCXJldHVybiBkY3M7CmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggNDg4NzE5MS4uMjIyYWIxYyAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtNjQyLDYgKzY0MiwxOCBAQAogCWNvdW50ID0gMjsKIAlpZiAodGhyZWFkX2dyb3VwX2xlYWRlcihjdXJyZW50KSkKIAkJY291bnQgPSAxOworCWVsc2UgeworCQkvKgorCQkgKiBUaGUgU0lHQUxSTSB0aW1lciBzdXJ2aXZlcyB0aGUgZXhlYywgYnV0IG5lZWRzIHRvIHBvaW50CisJCSAqIGF0IHVzIGFzIHRoZSBuZXcgZ3JvdXAgbGVhZGVyIG5vdy4gIFdlIGhhdmUgYSByYWNlIHdpdGgKKwkJICogYSB0aW1lciBmaXJpbmcgbm93IGdldHRpbmcgdGhlIG9sZCBsZWFkZXIsIHNvIHdlIG5lZWQgdG8KKwkJICogc3luY2hyb25pemUgd2l0aCBhbnkgZmlyaW5nIChieSBjYWxsaW5nIGRlbF90aW1lcl9zeW5jKQorCQkgKiBiZWZvcmUgd2UgY2FuIHNhZmVseSBsZXQgdGhlIG9sZCBncm91cCBsZWFkZXIgZGllLgorCQkgKi8KKwkJc2lnLT5yZWFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljdXJyZW50OworCQlpZiAoZGVsX3RpbWVyX3N5bmMoJnNpZy0+cmVhbF90aW1lcikpCisJCQlhZGRfdGltZXIoJnNpZy0+cmVhbF90aW1lcik7CisJfQogCXdoaWxlIChhdG9taWNfcmVhZCgmc2lnLT5jb3VudCkgPiBjb3VudCkgewogCQlzaWctPmdyb3VwX2V4aXRfdGFzayA9IGN1cnJlbnQ7CiAJCXNpZy0+bm90aWZ5X2NvdW50ID0gY291bnQ7CmRpZmYgLS1naXQgYS9mcy9leHQyL2V4dDIuaCBiL2ZzL2V4dDIvZXh0Mi5oCmluZGV4IGVlZDUyMWQuLmU5NzdmODUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZXh0Mi5oCisrKyBiL2ZzL2V4dDIvZXh0Mi5oCkBAIC0yLDYgKzIsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CiAKIC8qCisgKiBleHQyIG1vdW50IG9wdGlvbnMKKyAqLworc3RydWN0IGV4dDJfbW91bnRfb3B0aW9ucyB7CisJdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsKKwl1aWRfdCBzX3Jlc3VpZDsKKwlnaWRfdCBzX3Jlc2dpZDsKK307CisKKy8qCiAgKiBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0gaW5vZGUgZGF0YSBpbiBtZW1vcnkKICAqLwogc3RydWN0IGV4dDJfaW5vZGVfaW5mbyB7CmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKaW5kZXggODc2ZTM5MS4uZGNmZTMzMSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9zdXBlci5jCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtOTM2LDEyICs5MzYsMjMgQEAKIAlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICogc2JpID0gRVhUMl9TQihzYik7CiAJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBlczsKIAl1bnNpZ25lZCBsb25nIG9sZF9tb3VudF9vcHQgPSBzYmktPnNfbW91bnRfb3B0OworCXN0cnVjdCBleHQyX21vdW50X29wdGlvbnMgb2xkX29wdHM7CisJdW5zaWduZWQgbG9uZyBvbGRfc2JfZmxhZ3M7CisJaW50IGVycjsKKworCS8qIFN0b3JlIHRoZSBvbGQgb3B0aW9ucyAqLworCW9sZF9zYl9mbGFncyA9IHNiLT5zX2ZsYWdzOworCW9sZF9vcHRzLnNfbW91bnRfb3B0ID0gc2JpLT5zX21vdW50X29wdDsKKwlvbGRfb3B0cy5zX3Jlc3VpZCA9IHNiaS0+c19yZXN1aWQ7CisJb2xkX29wdHMuc19yZXNnaWQgPSBzYmktPnNfcmVzZ2lkOwogCiAJLyoKIAkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCiAJICovCi0JaWYgKCFwYXJzZV9vcHRpb25zIChkYXRhLCBzYmkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXBhcnNlX29wdGlvbnMgKGRhdGEsIHNiaSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byByZXN0b3JlX29wdHM7CisJfQogCiAJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpIHwKIAkJKChzYmktPnNfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9QT1NJWF9BQ0wpID8gTVNfUE9TSVhBQ0wgOiAwKTsKQEAgLTk3MSw3ICs5ODIsOCBAQAogCQkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgcmVtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgogCQkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKIAkJCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUocmV0KSk7Ci0JCQlyZXR1cm4gLUVST0ZTOworCQkJZXJyID0gLUVST0ZTOworCQkJZ290byByZXN0b3JlX29wdHM7CiAJCX0KIAkJLyoKIAkJICogTW91bnRpbmcgYSBSRE9OTFkgcGFydGl0aW9uIHJlYWQtd3JpdGUsIHNvIHJlcmVhZCBhbmQKQEAgLTk4NCw2ICs5OTYsMTIgQEAKIAl9CiAJZXh0Ml9zeW5jX3N1cGVyKHNiLCBlcyk7CiAJcmV0dXJuIDA7CityZXN0b3JlX29wdHM6CisJc2JpLT5zX21vdW50X29wdCA9IG9sZF9vcHRzLnNfbW91bnRfb3B0OworCXNiaS0+c19yZXN1aWQgPSBvbGRfb3B0cy5zX3Jlc3VpZDsKKwlzYmktPnNfcmVzZ2lkID0gb2xkX29wdHMuc19yZXNnaWQ7CisJc2ItPnNfZmxhZ3MgPSBvbGRfc2JfZmxhZ3M7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBleHQyX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBrc3RhdGZzICogYnVmKQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDBiMmRiNGYuLjk5ODlmZGMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTI2NjMsNyArMjY2Myw3IEBACiAJfSBlbHNlIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IEVYVDNfTl9CTE9DS1M7IGJsb2NrKyspCiAJCXJhd19pbm9kZS0+aV9ibG9ja1tibG9ja10gPSBlaS0+aV9kYXRhW2Jsb2NrXTsKIAotCWlmIChFWFQzX0lOT0RFX1NJWkUoaW5vZGUtPmlfc2IpID4gRVhUM19HT09EX09MRF9JTk9ERV9TSVpFKQorCWlmIChlaS0+aV9leHRyYV9pc2l6ZSkKIAkJcmF3X2lub2RlLT5pX2V4dHJhX2lzaXplID0gY3B1X3RvX2xlMTYoZWktPmlfZXh0cmFfaXNpemUpOwogCiAJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvc3VwZXIuYyBiL2ZzL2V4dDMvc3VwZXIuYwppbmRleCBhNmQxNzc5Li4zYzNjNmUzIDEwMDY0NAotLS0gYS9mcy9leHQzL3N1cGVyLmMKKysrIGIvZnMvZXh0My9zdXBlci5jCkBAIC04OTAsNyArODkwLDEwIEBACiAJCQkJCSJxdW90YSB0dXJuZWQgb24uXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KLQkJCWtmcmVlKHNiaS0+c19xZl9uYW1lc1txdHlwZV0pOworCQkJLyoKKwkJCSAqIFRoZSBzcGFjZSB3aWxsIGJlIHJlbGVhc2VkIGxhdGVyIHdoZW4gYWxsIG9wdGlvbnMKKwkJCSAqIGFyZSBjb25maXJtZWQgdG8gYmUgY29ycmVjdAorCQkJICovCiAJCQlzYmktPnNfcWZfbmFtZXNbcXR5cGVdID0gTlVMTDsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9qcWZtdF92ZnNvbGQ6CkBAIC05MzksNyArOTQyLDcgQEAKIAkJY2FzZSBPcHRfaWdub3JlOgogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3Jlc2l6ZToKLQkJCWlmICghbl9ibG9ja3NfY291bnQpIHsKKwkJCWlmICghaXNfcmVtb3VudCkgewogCQkJCXByaW50aygiRVhUMy1mczogcmVzaXplIG9wdGlvbiBvbmx5IGF2YWlsYWJsZSAiCiAJCQkJCSJmb3IgcmVtb3VudFxuIik7CiAJCQkJcmV0dXJuIDA7CkBAIC0yMTA5LDE0ICsyMTEyLDMzIEBACiB7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAl1bnNpZ25lZCBsb25nIG5fYmxvY2tzX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIG9sZF9zYl9mbGFnczsKKwlzdHJ1Y3QgZXh0M19tb3VudF9vcHRpb25zIG9sZF9vcHRzOworCWludCBlcnI7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJaW50IGk7CisjZW5kaWYKKworCS8qIFN0b3JlIHRoZSBvcmlnaW5hbCBvcHRpb25zICovCisJb2xkX3NiX2ZsYWdzID0gc2ItPnNfZmxhZ3M7CisJb2xkX29wdHMuc19tb3VudF9vcHQgPSBzYmktPnNfbW91bnRfb3B0OworCW9sZF9vcHRzLnNfcmVzdWlkID0gc2JpLT5zX3Jlc3VpZDsKKwlvbGRfb3B0cy5zX3Jlc2dpZCA9IHNiaS0+c19yZXNnaWQ7CisJb2xkX29wdHMuc19jb21taXRfaW50ZXJ2YWwgPSBzYmktPnNfY29tbWl0X2ludGVydmFsOworI2lmZGVmIENPTkZJR19RVU9UQQorCW9sZF9vcHRzLnNfanF1b3RhX2ZtdCA9IHNiaS0+c19qcXVvdGFfZm10OworCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKKwkJb2xkX29wdHMuc19xZl9uYW1lc1tpXSA9IHNiaS0+c19xZl9uYW1lc1tpXTsKKyNlbmRpZgogCiAJLyoKIAkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCiAJICovCi0JaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCAmdG1wLCAmbl9ibG9ja3NfY291bnQsIDEpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXBhcnNlX29wdGlvbnMoZGF0YSwgc2IsIE5VTEwsICZuX2Jsb2Nrc19jb3VudCwgMSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byByZXN0b3JlX29wdHM7CisJfQogCiAJaWYgKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0FCT1JUKQogCQlleHQzX2Fib3J0KHNiLCBfX0ZVTkNUSU9OX18sICJBYm9ydCBmb3JjZWQgYnkgdXNlciIpOwpAQCAtMjEzMCw4ICsyMTUyLDEwIEBACiAKIAlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgIT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB8fAogCQluX2Jsb2Nrc19jb3VudCA+IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKLQkJaWYgKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0FCT1JUKQotCQkJcmV0dXJuIC1FUk9GUzsKKwkJaWYgKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0FCT1JUKSB7CisJCQllcnIgPSAtRVJPRlM7CisJCQlnb3RvIHJlc3RvcmVfb3B0czsKKwkJfQogCiAJCWlmICgqZmxhZ3MgJiBNU19SRE9OTFkpIHsKIAkJCS8qCkBAIC0yMTU4LDcgKzIxODIsOCBAQAogCQkJCSAgICAgICAicmVtb3VudCBSRFdSIGJlY2F1c2Ugb2YgdW5zdXBwb3J0ZWQgIgogCQkJCSAgICAgICAib3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCiAJCQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShyZXQpKTsKLQkJCQlyZXR1cm4gLUVST0ZTOworCQkJCWVyciA9IC1FUk9GUzsKKwkJCQlnb3RvIHJlc3RvcmVfb3B0czsKIAkJCX0KIAkJCS8qCiAJCQkgKiBNb3VudGluZyBhIFJET05MWSBwYXJ0aXRpb24gcmVhZC13cml0ZSwgc28gcmVyZWFkCkBAIC0yMTY4LDEzICsyMTkzLDM4IEBACiAJCQkgKi8KIAkJCWV4dDNfY2xlYXJfam91cm5hbF9lcnIoc2IsIGVzKTsKIAkJCXNiaS0+c19tb3VudF9zdGF0ZSA9IGxlMTZfdG9fY3B1KGVzLT5zX3N0YXRlKTsKLQkJCWlmICgocmV0ID0gZXh0M19ncm91cF9leHRlbmQoc2IsIGVzLCBuX2Jsb2Nrc19jb3VudCkpKQotCQkJCXJldHVybiByZXQ7CisJCQlpZiAoKHJldCA9IGV4dDNfZ3JvdXBfZXh0ZW5kKHNiLCBlcywgbl9ibG9ja3NfY291bnQpKSkgeworCQkJCWVyciA9IHJldDsKKwkJCQlnb3RvIHJlc3RvcmVfb3B0czsKKwkJCX0KIAkJCWlmICghZXh0M19zZXR1cF9zdXBlciAoc2IsIGVzLCAwKSkKIAkJCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwogCQl9CiAJfQorI2lmZGVmIENPTkZJR19RVU9UQQorCS8qIFJlbGVhc2Ugb2xkIHF1b3RhIGZpbGUgbmFtZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJCWlmIChvbGRfb3B0cy5zX3FmX25hbWVzW2ldICYmCisJCSAgICBvbGRfb3B0cy5zX3FmX25hbWVzW2ldICE9IHNiaS0+c19xZl9uYW1lc1tpXSkKKwkJCWtmcmVlKG9sZF9vcHRzLnNfcWZfbmFtZXNbaV0pOworI2VuZGlmCiAJcmV0dXJuIDA7CityZXN0b3JlX29wdHM6CisJc2ItPnNfZmxhZ3MgPSBvbGRfc2JfZmxhZ3M7CisJc2JpLT5zX21vdW50X29wdCA9IG9sZF9vcHRzLnNfbW91bnRfb3B0OworCXNiaS0+c19yZXN1aWQgPSBvbGRfb3B0cy5zX3Jlc3VpZDsKKwlzYmktPnNfcmVzZ2lkID0gb2xkX29wdHMuc19yZXNnaWQ7CisJc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCA9IG9sZF9vcHRzLnNfY29tbWl0X2ludGVydmFsOworI2lmZGVmIENPTkZJR19RVU9UQQorCXNiaS0+c19qcXVvdGFfZm10ID0gb2xkX29wdHMuc19qcXVvdGFfZm10OworCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgeworCQlpZiAoc2JpLT5zX3FmX25hbWVzW2ldICYmCisJCSAgICBvbGRfb3B0cy5zX3FmX25hbWVzW2ldICE9IHNiaS0+c19xZl9uYW1lc1tpXSkKKwkJCWtmcmVlKHNiaS0+c19xZl9uYW1lc1tpXSk7CisJCXNiaS0+c19xZl9uYW1lc1tpXSA9IG9sZF9vcHRzLnNfcWZfbmFtZXNbaV07CisJfQorI2VuZGlmCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBleHQzX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBrc3RhdGZzICogYnVmKQpkaWZmIC0tZ2l0IGEvZnMvZmlsZV90YWJsZS5jIGIvZnMvZmlsZV90YWJsZS5jCmluZGV4IGZhNzg0OWYuLjFkM2RlNzggMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGVfdGFibGUuYworKysgYi9mcy9maWxlX3RhYmxlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldmVudHBvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogCiAvKiBzeXNjdGwgdHVuYWJsZXMuLi4gKi8KIHN0cnVjdCBmaWxlc19zdGF0X3N0cnVjdCBmaWxlc19zdGF0ID0gewpAQCAtMTI2LDYgKzEyNyw4IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAogCW1pZ2h0X3NsZWVwKCk7CisKKwlmc25vdGlmeV9jbG9zZShmaWxlKTsKIAkvKgogCSAqIFRoZSBmdW5jdGlvbiBldmVudHBvbGxfcmVsZWFzZSgpIHNob3VsZCBiZSB0aGUgZmlyc3QgY2FsbGVkCiAJICogaW4gdGhlIGZpbGUgY2xlYW51cCBjaGFpbi4KZGlmZiAtLWdpdCBhL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYyBiL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYwppbmRleCBmOGUwY2JkLi42ZjU1M2UxIDEwMDY0NAotLS0gYS9mcy9ocHBmcy9ocHBmc19rZXJuLmMKKysrIGIvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCkBAIC00LDYgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDkxLDcgKzQ5Miw3IEBACiAJCWZkID0gb3Blbl9ob3N0X3NvY2soaG9zdF9maWxlLCAmZmlsdGVyKTsKIAkJaWYoZmQgPiAwKXsKIAkJCWRhdGEtPmNvbnRlbnRzID0gaHBwZnNfZ2V0X2RhdGEoZmQsIGZpbHRlciwKLQkJCQkJCQkmZGF0YS0+cHJvY19maWxlLAorCQkJCQkJCWRhdGEtPnByb2NfZmlsZSwKIAkJCQkJCQlmaWxlLCAmZGF0YS0+bGVuKTsKIAkJCWlmKCFJU19FUlIoZGF0YS0+Y29udGVudHMpKQogCQkJCWRhdGEtPmhvc3RfZmQgPSBmZDsKQEAgLTU0Myw3ICs1NDQsNyBAQAogc3RhdGljIGxvZmZfdCBocHBmc19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmYsIGludCB3aGVyZSkKIHsKIAlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gJmRhdGEtPnByb2NfZmlsZTsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gZGF0YS0+cHJvY19maWxlOwogCWxvZmZfdCAoKmxsc2Vlaykoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOwogCWxvZmZfdCByZXQ7CiAKQEAgLTU4Niw3ICs1ODcsNyBAQAogc3RhdGljIGludCBocHBmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICplbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewogCXN0cnVjdCBocHBmc19wcml2YXRlICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBmaWxlICpwcm9jX2ZpbGUgPSAmZGF0YS0+cHJvY19maWxlOworCXN0cnVjdCBmaWxlICpwcm9jX2ZpbGUgPSBkYXRhLT5wcm9jX2ZpbGU7CiAJaW50ICgqcmVhZGRpcikoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOwogCXN0cnVjdCBocHBmc19kaXJlbnQgZGlyZW50ID0gKChzdHJ1Y3QgaHBwZnNfZGlyZW50KQogCQkgICAgICAgICAgICAgICAgICAgICAgeyAudmZzX2RpcmVudCAgCT0gZW50LApkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggMWY5YTNhMi4uZTU3ZjE3MiAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgogCiAvKgogICogVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgpAQCAtMjAyLDYgKzIwMywxMCBAQAogCUlOSVRfTElTVF9IRUFEKCZpbm9kZS0+aV9kYXRhLmlfbW1hcF9ub25saW5lYXIpOwogCXNwaW5fbG9ja19pbml0KCZpbm9kZS0+aV9sb2NrKTsKIAlpX3NpemVfb3JkZXJlZF9pbml0KGlub2RlKTsKKyNpZmRlZiBDT05GSUdfSU5PVElGWQorCUlOSVRfTElTVF9IRUFEKCZpbm9kZS0+aW5vdGlmeV93YXRjaGVzKTsKKwlzZW1hX2luaXQoJmlub2RlLT5pbm90aWZ5X3NlbSwgMSk7CisjZW5kaWYKIH0KIAogRVhQT1JUX1NZTUJPTChpbm9kZV9pbml0X29uY2UpOwpAQCAtMjgyLDYgKzI4NywxMyBAQAogCQlpZiAoaW5vZGUtPmlfZGF0YS5ucnBhZ2VzKQogCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCQljbGVhcl9pbm9kZShpbm9kZSk7CisKKwkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwkJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOworCQlsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9zYl9saXN0KTsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJCXdha2VfdXBfaW5vZGUoaW5vZGUpOwogCQlkZXN0cm95X2lub2RlKGlub2RlKTsKIAkJbnJfZGlzcG9zZWQrKzsKIAl9CkBAIC0zMTcsOCArMzI5LDYgQEAKIAkJaW5vZGUgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGlub2RlLCBpX3NiX2xpc3QpOwogCQlpbnZhbGlkYXRlX2lub2RlX2J1ZmZlcnMoaW5vZGUpOwogCQlpZiAoIWF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkpIHsKLQkJCWhsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9oYXNoKTsKLQkJCWxpc3RfZGVsKCZpbm9kZS0+aV9zYl9saXN0KTsKIAkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgZGlzcG9zZSk7CiAJCQlpbm9kZS0+aV9zdGF0ZSB8PSBJX0ZSRUVJTkc7CiAJCQljb3VudCsrOwpAQCAtMzQ2LDYgKzM1Niw3IEBACiAKIAlkb3duKCZpcHJ1bmVfc2VtKTsKIAlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlub3RpZnlfdW5tb3VudF9pbm9kZXMoJnNiLT5zX2lub2Rlcyk7CiAJYnVzeSA9IGludmFsaWRhdGVfbGlzdCgmc2ItPnNfaW5vZGVzLCAmdGhyb3dfYXdheSk7CiAJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwogCkBAIC00MzksOCArNDUwLDYgQEAKIAkJCWlmICghY2FuX3VudXNlKGlub2RlKSkKIAkJCQljb250aW51ZTsKIAkJfQotCQlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7Ci0JCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOwogCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZmcmVlYWJsZSk7CiAJCWlub2RlLT5pX3N0YXRlIHw9IElfRlJFRUlORzsKIAkJbnJfcHJ1bmVkKys7CkBAIC03NDgsNiArNzU3LDcgQEAKICAqIEBoZWFkOiAgICAgICB0aGUgaGVhZCBvZiB0aGUgbGlzdCB0byBzZWFyY2gKICAqIEB0ZXN0OgljYWxsYmFjayB1c2VkIGZvciBjb21wYXJpc29ucyBiZXR3ZWVuIGlub2RlcwogICogQGRhdGE6CW9wYXF1ZSBkYXRhIHBvaW50ZXIgdG8gcGFzcyB0byBAdGVzdAorICogQHdhaXQ6CWlmIHRydWUgd2FpdCBmb3IgdGhlIGlub2RlIHRvIGJlIHVubG9ja2VkLCBpZiBmYWxzZSBkbyBub3QKICAqCiAgKiBpZmluZCgpIHNlYXJjaGVzIGZvciB0aGUgaW5vZGUgc3BlY2lmaWVkIGJ5IEBkYXRhIGluIHRoZSBpbm9kZQogICogY2FjaGUuIFRoaXMgaXMgYSBnZW5lcmFsaXplZCB2ZXJzaW9uIG9mIGlmaW5kX2Zhc3QoKSBmb3IgZmlsZSBzeXN0ZW1zIHdoZXJlCkBAIC03NjIsNyArNzcyLDcgQEAKICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKmlmaW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKCp0ZXN0KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKSwKLQkJdm9pZCAqZGF0YSkKKwkJdm9pZCAqZGF0YSwgY29uc3QgaW50IHdhaXQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIApAQCAtNzcxLDcgKzc4MSw4IEBACiAJaWYgKGlub2RlKSB7CiAJCV9faWdldChpbm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKLQkJd2FpdF9vbl9pbm9kZShpbm9kZSk7CisJCWlmIChsaWtlbHkod2FpdCkpCisJCQl3YWl0X29uX2lub2RlKGlub2RlKTsKIAkJcmV0dXJuIGlub2RlOwogCX0KIAlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CkBAIC04MTEsNyArODIyLDcgQEAKIH0KIAogLyoqCi0gKiBpbG9va3VwNSAtIHNlYXJjaCBmb3IgYW4gaW5vZGUgaW4gdGhlIGlub2RlIGNhY2hlCisgKiBpbG9va3VwNV9ub3dhaXQgLSBzZWFyY2ggZm9yIGFuIGlub2RlIGluIHRoZSBpbm9kZSBjYWNoZQogICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0gdG8gc2VhcmNoCiAgKiBAaGFzaHZhbDoJaGFzaCB2YWx1ZSAodXN1YWxseSBpbm9kZSBudW1iZXIpIHRvIHNlYXJjaCBmb3IKICAqIEB0ZXN0OgljYWxsYmFjayB1c2VkIGZvciBjb21wYXJpc29ucyBiZXR3ZWVuIGlub2RlcwpAQCAtODIzLDcgKzgzNCwzOCBAQAogICogaWRlbnRpZmljYXRpb24gb2YgYW4gaW5vZGUuCiAgKgogICogSWYgdGhlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgdGhlIGlub2RlIGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVtZW50ZWQKLSAqIHJlZmVyZW5jZSBjb3VudC4KKyAqIHJlZmVyZW5jZSBjb3VudC4gIE5vdGUsIHRoZSBpbm9kZSBsb2NrIGlzIG5vdCB3YWl0ZWQgdXBvbiBzbyB5b3UgaGF2ZSB0byBiZQorICogdmVyeSBjYXJlZnVsIHdoYXQgeW91IGRvIHdpdGggdGhlIHJldHVybmVkIGlub2RlLiAgWW91IHByb2JhYmx5IHNob3VsZCBiZQorICogdXNpbmcgaWxvb2t1cDUoKSBpbnN0ZWFkLgorICoKKyAqIE90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIE5vdGUsIEB0ZXN0IGlzIGNhbGxlZCB3aXRoIHRoZSBpbm9kZV9sb2NrIGhlbGQsIHNvIGNhbid0IHNsZWVwLgorICovCitzdHJ1Y3QgaW5vZGUgKmlsb29rdXA1X25vd2FpdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGhhc2h2YWwsCisJCWludCAoKnRlc3QpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gaW5vZGVfaGFzaHRhYmxlICsgaGFzaChzYiwgaGFzaHZhbCk7CisKKwlyZXR1cm4gaWZpbmQoc2IsIGhlYWQsIHRlc3QsIGRhdGEsIDApOworfQorCitFWFBPUlRfU1lNQk9MKGlsb29rdXA1X25vd2FpdCk7CisKKy8qKgorICogaWxvb2t1cDUgLSBzZWFyY2ggZm9yIGFuIGlub2RlIGluIHRoZSBpbm9kZSBjYWNoZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0gdG8gc2VhcmNoCisgKiBAaGFzaHZhbDoJaGFzaCB2YWx1ZSAodXN1YWxseSBpbm9kZSBudW1iZXIpIHRvIHNlYXJjaCBmb3IKKyAqIEB0ZXN0OgljYWxsYmFjayB1c2VkIGZvciBjb21wYXJpc29ucyBiZXR3ZWVuIGlub2RlcworICogQGRhdGE6CW9wYXF1ZSBkYXRhIHBvaW50ZXIgdG8gcGFzcyB0byBAdGVzdAorICoKKyAqIGlsb29rdXA1KCkgdXNlcyBpZmluZCgpIHRvIHNlYXJjaCBmb3IgdGhlIGlub2RlIHNwZWNpZmllZCBieSBAaGFzaHZhbCBhbmQKKyAqIEBkYXRhIGluIHRoZSBpbm9kZSBjYWNoZS4gVGhpcyBpcyBhIGdlbmVyYWxpemVkIHZlcnNpb24gb2YgaWxvb2t1cCgpIGZvcgorICogZmlsZSBzeXN0ZW1zIHdoZXJlIHRoZSBpbm9kZSBudW1iZXIgaXMgbm90IHN1ZmZpY2llbnQgZm9yIHVuaXF1ZQorICogaWRlbnRpZmljYXRpb24gb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgdGhlIGlub2RlIGxvY2sgaXMgd2FpdGVkIHVwb24gYW5kIHRoZSBpbm9kZSBpcworICogcmV0dXJuZWQgd2l0aCBhbiBpbmNyZW1lbnRlZCByZWZlcmVuY2UgY291bnQuCiAgKgogICogT3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuCiAgKgpAQCAtODM0LDcgKzg3Niw3IEBACiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKHNiLCBoYXNodmFsKTsKIAotCXJldHVybiBpZmluZChzYiwgaGVhZCwgdGVzdCwgZGF0YSk7CisJcmV0dXJuIGlmaW5kKHNiLCBoZWFkLCB0ZXN0LCBkYXRhLCAxKTsKIH0KIAogRVhQT1JUX1NZTUJPTChpbG9va3VwNSk7CkBAIC04OTEsNyArOTMzLDcgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9IGlub2RlX2hhc2h0YWJsZSArIGhhc2goc2IsIGhhc2h2YWwpOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKLQlpbm9kZSA9IGlmaW5kKHNiLCBoZWFkLCB0ZXN0LCBkYXRhKTsKKwlpbm9kZSA9IGlmaW5kKHNiLCBoZWFkLCB0ZXN0LCBkYXRhLCAxKTsKIAlpZiAoaW5vZGUpCiAJCXJldHVybiBpbm9kZTsKIAkvKgpAQCAtMTA1Miw3ICsxMDk0LDcgQEAKICAqIGlub2RlIHdoZW4gdGhlIHVzYWdlIGNvdW50IGRyb3BzIHRvIHplcm8sIGFuZAogICogaV9ubGluayBpcyB6ZXJvLgogICovCi1zdGF0aWMgdm9pZCBnZW5lcmljX2Ryb3BfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgZ2VuZXJpY19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaWYgKCFpbm9kZS0+aV9ubGluaykKIAkJZ2VuZXJpY19kZWxldGVfaW5vZGUoaW5vZGUpOwpAQCAtMTA2MCw2ICsxMTAyLDggQEAKIAkJZ2VuZXJpY19mb3JnZXRfaW5vZGUoaW5vZGUpOwogfQogCitFWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX2Ryb3BfaW5vZGUpOworCiAvKgogICogQ2FsbGVkIHdoZW4gd2UncmUgZHJvcHBpbmcgdGhlIGxhc3QgcmVmZXJlbmNlCiAgKiB0byBhbiBpbm9kZS4gCkBAIC0xMjQyLDI5ICsxMjg2LDIxIEBACiB9CiAKIC8qCi0gKiBJZiB3ZSB0cnkgdG8gZmluZCBhbiBpbm9kZSBpbiB0aGUgaW5vZGUgaGFzaCB3aGlsZSBpdCBpcyBiZWluZyBkZWxldGVkLCB3ZQotICogaGF2ZSB0byB3YWl0IHVudGlsIHRoZSBmaWxlc3lzdGVtIGNvbXBsZXRlcyBpdHMgZGVsZXRpb24gYmVmb3JlIHJlcG9ydGluZwotICogdGhhdCBpdCBpc24ndCBmb3VuZC4gIFRoaXMgaXMgYmVjYXVzZSBpZ2V0IHdpbGwgaW1tZWRpYXRlbHkgY2FsbAotICogLT5yZWFkX2lub2RlLCBhbmQgd2Ugd2FudCB0byBiZSBzdXJlIHRoYXQgZXZpZGVuY2Ugb2YgdGhlIGRlbGV0aW9uIGlzIGZvdW5kCi0gKiBieSAtPnJlYWRfaW5vZGUuCisgKiBJZiB3ZSB0cnkgdG8gZmluZCBhbiBpbm9kZSBpbiB0aGUgaW5vZGUgaGFzaCB3aGlsZSBpdCBpcyBiZWluZworICogZGVsZXRlZCwgd2UgaGF2ZSB0byB3YWl0IHVudGlsIHRoZSBmaWxlc3lzdGVtIGNvbXBsZXRlcyBpdHMKKyAqIGRlbGV0aW9uIGJlZm9yZSByZXBvcnRpbmcgdGhhdCBpdCBpc24ndCBmb3VuZC4gIFRoaXMgZnVuY3Rpb24gd2FpdHMKKyAqIHVudGlsIHRoZSBkZWxldGlvbiBfbWlnaHRfIGhhdmUgY29tcGxldGVkLiAgQ2FsbGVycyBhcmUgcmVzcG9uc2libGUKKyAqIHRvIHJlY2hlY2sgaW5vZGUgc3RhdGUuCisgKgorICogSXQgZG9lc24ndCBtYXR0ZXIgaWYgSV9MT0NLIGlzIG5vdCBzZXQgaW5pdGlhbGx5LCBhIGNhbGwgdG8KKyAqIHdha2VfdXBfaW5vZGUoKSBhZnRlciByZW1vdmluZyBmcm9tIHRoZSBoYXNoIGxpc3Qgd2lsbCBEVFJULgorICoKICAqIFRoaXMgaXMgY2FsbGVkIHdpdGggaW5vZGVfbG9jayBoZWxkLgogICovCiBzdGF0aWMgdm9pZCBfX3dhaXRfb25fZnJlZWluZ19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXdhaXRfcXVldWVfaGVhZF90ICp3cTsKIAlERUZJTkVfV0FJVF9CSVQod2FpdCwgJmlub2RlLT5pX3N0YXRlLCBfX0lfTE9DSyk7Ci0KLQkvKgotCSAqIElfRlJFRUlORyBhbmQgSV9DTEVBUiBhcmUgY2xlYXJlZCBpbiBwcm9jZXNzIGNvbnRleHQgdW5kZXIKLQkgKiBpbm9kZV9sb2NrLCBzbyB3ZSBoYXZlIHRvIGdpdmUgdGhlIHRhc2tzIHdobyB3b3VsZCBjbGVhciB0aGVtCi0JICogYSBjaGFuY2UgdG8gcnVuIGFuZCBhY3F1aXJlIGlub2RlX2xvY2suCi0JICovCi0JaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spKSB7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKLQkJeWllbGQoKTsKLQkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKLQkJcmV0dXJuOwotCX0KIAl3cSA9IGJpdF93YWl0cXVldWUoJmlub2RlLT5pX3N0YXRlLCBfX0lfTE9DSyk7CiAJcHJlcGFyZV90b193YWl0KHdxLCAmd2FpdC53YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvaW5vdGlmeS5jIGIvZnMvaW5vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzU3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pbm90aWZ5LmMKQEAgLTAsMCArMSwxMDM3IEBACisvKgorICogZnMvaW5vdGlmeS5jIC0gaW5vZGUtYmFzZWQgZmlsZSBldmVudCBub3RpZmljYXRpb25zCisgKgorICogQXV0aG9yczoKKyAqCUpvaG4gTWNDdXRjaGFuCTx0dGJAdGVudGFjbGUuZGhzLm9yZz4KKyAqCVJvYmVydCBMb3ZlCTxybWxAbm92ZWxsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSm9obiBNY0N1dGNoYW4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KKworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworc3RhdGljIGF0b21pY190IGlub3RpZnlfY29va2llOworCitzdGF0aWMga21lbV9jYWNoZV90ICp3YXRjaF9jYWNoZXA7CitzdGF0aWMga21lbV9jYWNoZV90ICpldmVudF9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmlub3RpZnlfbW50OworCisvKiB0aGVzZSBhcmUgY29uZmlndXJhYmxlIHZpYSAvcHJvYy9zeXMvZnMvaW5vdGlmeS8gKi8KK2ludCBpbm90aWZ5X21heF91c2VyX2luc3RhbmNlczsKK2ludCBpbm90aWZ5X21heF91c2VyX3dhdGNoZXM7CitpbnQgaW5vdGlmeV9tYXhfcXVldWVkX2V2ZW50czsKKworLyoKKyAqIExvY2sgb3JkZXJpbmc6CisgKgorICogZGVudHJ5LT5kX2xvY2sgKHVzZWQgdG8ga2VlcCBkX21vdmUoKSBhd2F5IGZyb20gZGVudHJ5LT5kX3BhcmVudCkKKyAqIGlwcnVuZV9zZW0gKHN5bmNocm9uaXplIHNocmlua19pY2FjaGVfbWVtb3J5KCkpCisgKiAJaW5vZGVfbG9jayAocHJvdGVjdHMgdGhlIHN1cGVyX2Jsb2NrLT5zX2lub2RlcyBsaXN0KQorICogCWlub2RlLT5pbm90aWZ5X3NlbSAocHJvdGVjdHMgaW5vZGUtPmlub3RpZnlfd2F0Y2hlcyBhbmQgd2F0Y2hlcy0+aV9saXN0KQorICogCQlpbm90aWZ5X2Rldi0+c2VtIChwcm90ZWN0cyBpbm90aWZ5X2RldmljZSBhbmQgd2F0Y2hlcy0+ZF9saXN0KQorICovCisKKy8qCisgKiBMaWZldGltZXMgb2YgdGhlIHRocmVlIG1haW4gZGF0YSBzdHJ1Y3R1cmVzLS1pbm90aWZ5X2RldmljZSwgaW5vZGUsIGFuZAorICogaW5vdGlmeV93YXRjaC0tYXJlIG1hbmFnZWQgYnkgcmVmZXJlbmNlIGNvdW50LgorICoKKyAqIGlub3RpZnlfZGV2aWNlOiBMaWZldGltZSBpcyBmcm9tIG9wZW4gdW50aWwgcmVsZWFzZS4gIEFkZGl0aW9uYWwgcmVmZXJlbmNlcworICogY2FuIGJ1bXAgdGhlIGNvdW50IHZpYSBnZXRfaW5vdGlmeV9kZXYoKSBhbmQgZHJvcCB0aGUgY291bnQgdmlhCisgKiBwdXRfaW5vdGlmeV9kZXYoKS4KKyAqCisgKiBpbm90aWZ5X3dhdGNoOiBMaWZldGltZSBpcyBmcm9tIGNyZWF0ZV93YXRjaCgpIHRvIGRlc3Rvcnlfd2F0Y2goKS4KKyAqIEFkZGl0aW9uYWwgcmVmZXJlbmNlcyBjYW4gYnVtcCB0aGUgY291bnQgdmlhIGdldF9pbm90aWZ5X3dhdGNoKCkgYW5kIGRyb3AKKyAqIHRoZSBjb3VudCB2aWEgcHV0X2lub3RpZnlfd2F0Y2goKS4KKyAqCisgKiBpbm9kZTogUGlubmVkIHNvIGxvbmcgYXMgdGhlIGlub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHdhdGNoLCBmcm9tCisgKiBjcmVhdGVfd2F0Y2goKSB0byBwdXRfaW5vdGlmeV93YXRjaCgpLgorICovCisKKy8qCisgKiBzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgLSByZXByZXNlbnRzIGFuIG9wZW4gaW5zdGFuY2Ugb2YgYW4gaW5vdGlmeSBkZXZpY2UKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgdGhlIHNlbWFwaG9yZSAnc2VtJy4KKyAqLworc3RydWN0IGlub3RpZnlfZGV2aWNlIHsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAJd3E7CQkvKiB3YWl0IHF1ZXVlIGZvciBpL28gKi8KKwlzdHJ1Y3QgaWRyCQlpZHI7CQkvKiBpZHIgbWFwcGluZyB3ZCAtPiB3YXRjaCAqLworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogcHJvdGVjdHMgdGhpcyBiYWQgYm95ICovCisJc3RydWN0IGxpc3RfaGVhZCAJZXZlbnRzOwkJLyogbGlzdCBvZiBxdWV1ZWQgZXZlbnRzICovCisJc3RydWN0IGxpc3RfaGVhZAl3YXRjaGVzOwkvKiBsaXN0IG9mIHdhdGNoZXMgKi8KKwlhdG9taWNfdAkJY291bnQ7CQkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlzdHJ1Y3QgdXNlcl9zdHJ1Y3QJKnVzZXI7CQkvKiB1c2VyIHdobyBvcGVuZWQgdGhpcyBkZXYgKi8KKwl1bnNpZ25lZCBpbnQJCXF1ZXVlX3NpemU7CS8qIHNpemUgb2YgdGhlIHF1ZXVlIChieXRlcykgKi8KKwl1bnNpZ25lZCBpbnQJCWV2ZW50X2NvdW50OwkvKiBudW1iZXIgb2YgcGVuZGluZyBldmVudHMgKi8KKwl1bnNpZ25lZCBpbnQJCW1heF9ldmVudHM7CS8qIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyAqLworfTsKKworLyoKKyAqIHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAtIEFuIGlub3RpZnkgZXZlbnQsIG9yaWdpbmF0aW5nIGZyb20gYSB3YXRjaCBhbmQKKyAqIHF1ZXVlZCBmb3IgdXNlci1zcGFjZS4gIEEgbGlzdCBvZiB0aGVzZSBpcyBhdHRhY2hlZCB0byBlYWNoIGluc3RhbmNlIG9mIHRoZQorICogZGV2aWNlLiAgSW4gcmVhZCgpLCB0aGlzIGxpc3QgaXMgd2Fsa2VkIGFuZCBhbGwgZXZlbnRzIHRoYXQgY2FuIGZpdCBpbiB0aGUKKyAqIGJ1ZmZlciBhcmUgcmV0dXJuZWQuCisgKgorICogUHJvdGVjdGVkIGJ5IGRldi0+c2VtIG9mIHRoZSBkZXZpY2UgaW4gd2hpY2ggd2UgYXJlIHF1ZXVlZC4KKyAqLworc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50IHsKKwlzdHJ1Y3QgaW5vdGlmeV9ldmVudAlldmVudDsJLyogdGhlIHVzZXItc3BhY2UgZXZlbnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0OwkvKiBlbnRyeSBpbiBpbm90aWZ5X2RldmljZSdzIGxpc3QgKi8KKwljaGFyCQkJKm5hbWU7CS8qIGZpbGVuYW1lLCBpZiBhbnkgKi8KK307CisKKy8qCisgKiBzdHJ1Y3QgaW5vdGlmeV93YXRjaCAtIHJlcHJlc2VudHMgYSB3YXRjaCByZXF1ZXN0IG9uIGEgc3BlY2lmaWMgaW5vZGUKKyAqCisgKiBkX2xpc3QgaXMgcHJvdGVjdGVkIGJ5IGRldi0+c2VtIG9mIHRoZSBhc3NvY2lhdGVkIHdhdGNoLT5kZXYuCisgKiBpX2xpc3QgYW5kIG1hc2sgYXJlIHByb3RlY3RlZCBieSBpbm9kZS0+aW5vdGlmeV9zZW0gb2YgdGhlIGFzc29jaWF0ZWQgaW5vZGUuCisgKiBkZXYsIGlub2RlLCBhbmQgd2QgYXJlIG5ldmVyIHdyaXR0ZW4gdG8gb25jZSB0aGUgd2F0Y2ggaXMgY3JlYXRlZC4KKyAqLworc3RydWN0IGlub3RpZnlfd2F0Y2ggeworCXN0cnVjdCBsaXN0X2hlYWQJZF9saXN0OwkvKiBlbnRyeSBpbiBpbm90aWZ5X2RldmljZSdzIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWlfbGlzdDsJLyogZW50cnkgaW4gaW5vZGUncyBsaXN0ICovCisJYXRvbWljX3QJCWNvdW50OwkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UJKmRldjsJLyogYXNzb2NpYXRlZCBkZXZpY2UgKi8KKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsJLyogYXNzb2NpYXRlZCBpbm9kZSAqLworCXMzMiAJCQl3ZDsJLyogd2F0Y2ggZGVzY3JpcHRvciAqLworCXUzMgkJCW1hc2s7CS8qIGV2ZW50IG1hc2sgZm9yIHRoaXMgd2F0Y2ggKi8KK307CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworc3RhdGljIGludCB6ZXJvOworCitjdGxfdGFibGUgaW5vdGlmeV90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gSU5PVElGWV9NQVhfVVNFUl9JTlNUQU5DRVMsCisJCS5wcm9jbmFtZQk9ICJtYXhfdXNlcl9pbnN0YW5jZXMiLAorCQkuZGF0YQkJPSAmaW5vdGlmeV9tYXhfdXNlcl9pbnN0YW5jZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZ6ZXJvLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBJTk9USUZZX01BWF9VU0VSX1dBVENIRVMsCisJCS5wcm9jbmFtZQk9ICJtYXhfdXNlcl93YXRjaGVzIiwKKwkJLmRhdGEJCT0gJmlub3RpZnlfbWF4X3VzZXJfd2F0Y2hlcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJnplcm8sIAorCX0sCisJeworCQkuY3RsX25hbWUJPSBJTk9USUZZX01BWF9RVUVVRURfRVZFTlRTLAorCQkucHJvY25hbWUJPSAibWF4X3F1ZXVlZF9ldmVudHMiLAorCQkuZGF0YQkJPSAmaW5vdGlmeV9tYXhfcXVldWVkX2V2ZW50cywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwgCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLCAKKwkJLmV4dHJhMQkJPSAmemVybworCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2lub3RpZnlfZGV2KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQoreworCWF0b21pY19pbmMoJmRldi0+Y291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2lub3RpZnlfZGV2KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPmNvdW50KSkgeworCQlhdG9taWNfZGVjKCZkZXYtPnVzZXItPmlub3RpZnlfZGV2cyk7CisJCWZyZWVfdWlkKGRldi0+dXNlcik7CisJCWtmcmVlKGRldik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2lub3RpZnlfd2F0Y2goc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoKQoreworCWF0b21pY19pbmMoJndhdGNoLT5jb3VudCk7Cit9CisKKy8qCisgKiBwdXRfaW5vdGlmeV93YXRjaCAtIGRlY3JlbWVudHMgdGhlIHJlZiBjb3VudCBvbiBhIGdpdmVuIHdhdGNoLiAgY2xlYW5zIHVwCisgKiB0aGUgd2F0Y2ggYW5kIGl0cyByZWZlcmVuY2VzIGlmIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaW5vdGlmeV93YXRjaChzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJndhdGNoLT5jb3VudCkpIHsKKwkJcHV0X2lub3RpZnlfZGV2KHdhdGNoLT5kZXYpOworCQlpcHV0KHdhdGNoLT5pbm9kZSk7CisJCWttZW1fY2FjaGVfZnJlZSh3YXRjaF9jYWNoZXAsIHdhdGNoKTsKKwl9Cit9CisKKy8qCisgKiBrZXJuZWxfZXZlbnQgLSBjcmVhdGUgYSBuZXcga2VybmVsIGV2ZW50IHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4KKyAqLworc3RhdGljIHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqIGtlcm5lbF9ldmVudChzMzIgd2QsIHUzMiBtYXNrLCB1MzIgY29va2llLAorCQkJCQkJICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50OworCisJa2V2ZW50ID0ga21lbV9jYWNoZV9hbGxvYyhldmVudF9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSgha2V2ZW50KSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiB3ZSBoYW5kIHRoaXMgb3V0IHRvIHVzZXItc3BhY2UsIHNvIHplcm8gaXQganVzdCBpbiBjYXNlICovCisJbWVtc2V0KCZrZXZlbnQtPmV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpKTsKKworCWtldmVudC0+ZXZlbnQud2QgPSB3ZDsKKwlrZXZlbnQtPmV2ZW50Lm1hc2sgPSBtYXNrOworCWtldmVudC0+ZXZlbnQuY29va2llID0gY29va2llOworCisJSU5JVF9MSVNUX0hFQUQoJmtldmVudC0+bGlzdCk7CisKKwlpZiAobmFtZSkgeworCQlzaXplX3QgbGVuLCByZW0sIGV2ZW50X3NpemUgPSBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gcGFkIHRoZSBmaWxlbmFtZSBzbyBhcyB0byBwcm9wZXJseSBhbGlnbiBhbgorCQkgKiBhcnJheSBvZiBpbm90aWZ5X2V2ZW50IHN0cnVjdHVyZXMuICBCZWNhdXNlIHRoZSBzdHJ1Y3R1cmUgaXMKKwkJICogc21hbGwgYW5kIHRoZSBjb21tb24gY2FzZSBpcyBhIHNtYWxsIGZpbGVuYW1lLCB3ZSBqdXN0IHJvdW5kCisJCSAqIHVwIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIHRoZSBzdHJ1Y3R1cmUncyBzaXplb2YuICBUaGlzIGlzCisJCSAqIHNpbXBsZSBhbmQgc2FmZSBmb3IgYWxsIGFyY2hpdGVjdHVyZXMuCisJCSAqLworCQlsZW4gPSBzdHJsZW4obmFtZSkgKyAxOworCQlyZW0gPSBldmVudF9zaXplIC0gbGVuOworCQlpZiAobGVuID4gZXZlbnRfc2l6ZSkgeworCQkJcmVtID0gZXZlbnRfc2l6ZSAtIChsZW4gJSBldmVudF9zaXplKTsKKwkJCWlmIChsZW4gJSBldmVudF9zaXplID09IDApCisJCQkJcmVtID0gMDsKKwkJfQorCisJCWtldmVudC0+bmFtZSA9IGttYWxsb2MobGVuICsgcmVtLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KCFrZXZlbnQtPm5hbWUpKSB7CisJCQlrbWVtX2NhY2hlX2ZyZWUoZXZlbnRfY2FjaGVwLCBrZXZlbnQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbWVtY3B5KGtldmVudC0+bmFtZSwgbmFtZSwgbGVuKTsKKwkJaWYgKHJlbSkKKwkJCW1lbXNldChrZXZlbnQtPm5hbWUgKyBsZW4sIDAsIHJlbSk7CQkKKwkJa2V2ZW50LT5ldmVudC5sZW4gPSBsZW4gKyByZW07CisJfSBlbHNlIHsKKwkJa2V2ZW50LT5ldmVudC5sZW4gPSAwOworCQlrZXZlbnQtPm5hbWUgPSBOVUxMOworCX0KKworCXJldHVybiBrZXZlbnQ7Cit9CisKKy8qCisgKiBpbm90aWZ5X2Rldl9nZXRfZXZlbnQgLSByZXR1cm4gdGhlIG5leHQgZXZlbnQgaW4gdGhlIGdpdmVuIGRldidzIHF1ZXVlCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPnNlbS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKgoraW5vdGlmeV9kZXZfZ2V0X2V2ZW50KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQoreworCXJldHVybiBsaXN0X2VudHJ5KGRldi0+ZXZlbnRzLm5leHQsIHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCwgbGlzdCk7Cit9CisKKy8qCisgKiBpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudCAtIGFkZCBhIG5ldyBldmVudCB0byB0aGUgZ2l2ZW4gZGV2aWNlCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPnNlbS4gIENhbiBzbGVlcCAoY2FsbHMga2VybmVsX2V2ZW50KCkpLgorICovCitzdGF0aWMgdm9pZCBpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLCB1MzIgbWFzaywKKwkJCQkgICAgdTMyIGNvb2tpZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudCwgKmxhc3Q7CisKKwkvKiBjb2FsZXNjaW5nOiBkcm9wIHRoaXMgZXZlbnQgaWYgaXQgaXMgYSBkdXBlIG9mIHRoZSBwcmV2aW91cyAqLworCWxhc3QgPSBpbm90aWZ5X2Rldl9nZXRfZXZlbnQoZGV2KTsKKwlpZiAobGFzdCAmJiBsYXN0LT5ldmVudC5tYXNrID09IG1hc2sgJiYgbGFzdC0+ZXZlbnQud2QgPT0gd2F0Y2gtPndkICYmCisJCQlsYXN0LT5ldmVudC5jb29raWUgPT0gY29va2llKSB7CisJCWNvbnN0IGNoYXIgKmxhc3RuYW1lID0gbGFzdC0+bmFtZTsKKworCQlpZiAoIW5hbWUgJiYgIWxhc3RuYW1lKQorCQkJcmV0dXJuOworCQlpZiAobmFtZSAmJiBsYXN0bmFtZSAmJiAhc3RyY21wKGxhc3RuYW1lLCBuYW1lKSkKKwkJCXJldHVybjsKKwl9CisKKwkvKiB0aGUgcXVldWUgb3ZlcmZsb3dlZCBhbmQgd2UgYWxyZWFkeSBzZW50IHRoZSBRX09WRVJGTE9XIGV2ZW50ICovCisJaWYgKHVubGlrZWx5KGRldi0+ZXZlbnRfY291bnQgPiBkZXYtPm1heF9ldmVudHMpKQorCQlyZXR1cm47CisKKwkvKiBpZiB0aGUgcXVldWUgb3ZlcmZsb3dzLCB3ZSBuZWVkIHRvIG5vdGlmeSB1c2VyIHNwYWNlICovCisJaWYgKHVubGlrZWx5KGRldi0+ZXZlbnRfY291bnQgPT0gZGV2LT5tYXhfZXZlbnRzKSkKKwkJa2V2ZW50ID0ga2VybmVsX2V2ZW50KC0xLCBJTl9RX09WRVJGTE9XLCBjb29raWUsIE5VTEwpOworCWVsc2UKKwkJa2V2ZW50ID0ga2VybmVsX2V2ZW50KHdhdGNoLT53ZCwgbWFzaywgY29va2llLCBuYW1lKTsKKworCWlmICh1bmxpa2VseSgha2V2ZW50KSkKKwkJcmV0dXJuOworCisJLyogcXVldWUgdGhlIGV2ZW50IGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nICovCisJZGV2LT5ldmVudF9jb3VudCsrOworCWRldi0+cXVldWVfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpICsga2V2ZW50LT5ldmVudC5sZW47CisJbGlzdF9hZGRfdGFpbCgma2V2ZW50LT5saXN0LCAmZGV2LT5ldmVudHMpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cSk7Cit9CisKKy8qCisgKiByZW1vdmVfa2V2ZW50IC0gY2xlYW5zIHVwIGFuZCB1bHRpbWF0ZWx5IGZyZWVzIHRoZSBnaXZlbiBrZXZlbnQKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGRldi0+c2VtLgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfa2V2ZW50KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudCkKK3sKKwlsaXN0X2RlbCgma2V2ZW50LT5saXN0KTsKKworCWRldi0+ZXZlbnRfY291bnQtLTsKKwlkZXYtPnF1ZXVlX3NpemUgLT0gc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KSArIGtldmVudC0+ZXZlbnQubGVuOworCisJa2ZyZWUoa2V2ZW50LT5uYW1lKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZXZlbnRfY2FjaGVwLCBrZXZlbnQpOworfQorCisvKgorICogaW5vdGlmeV9kZXZfZXZlbnRfZGVxdWV1ZSAtIGRlc3Ryb3kgYW4gZXZlbnQgb24gdGhlIGdpdmVuIGRldmljZQorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5zZW0uCisgKi8KK3N0YXRpYyB2b2lkIGlub3RpZnlfZGV2X2V2ZW50X2RlcXVldWUoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpCit7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cykpIHsKKwkJc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQ7CisJCWtldmVudCA9IGlub3RpZnlfZGV2X2dldF9ldmVudChkZXYpOworCQlyZW1vdmVfa2V2ZW50KGRldiwga2V2ZW50KTsKKwl9Cit9CisKKy8qCisgKiBpbm90aWZ5X2Rldl9nZXRfd2QgLSByZXR1cm5zIHRoZSBuZXh0IFdEIGZvciB1c2UgYnkgdGhlIGdpdmVuIGRldgorICoKKyAqIENhbGxlcnMgbXVzdCBob2xkIGRldi0+c2VtLiAgVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbnQgaW5vdGlmeV9kZXZfZ2V0X3dkKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoKQoreworCWludCByZXQ7CisKKwlkbyB7CisJCWlmICh1bmxpa2VseSghaWRyX3ByZV9nZXQoJmRldi0+aWRyLCBHRlBfS0VSTkVMKSkpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJcmV0ID0gaWRyX2dldF9uZXcoJmRldi0+aWRyLCB3YXRjaCwgJndhdGNoLT53ZCk7CisJfSB3aGlsZSAocmV0ID09IC1FQUdBSU4pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGZpbmRfaW5vZGUgLSByZXNvbHZlIGEgdXNlci1naXZlbiBwYXRoIHRvIGEgc3BlY2lmaWMgaW5vZGUgYW5kIHJldHVybiBhIG5kCisgKi8KK3N0YXRpYyBpbnQgZmluZF9pbm9kZShjb25zdCBjaGFyIF9fdXNlciAqZGlybmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBfX3VzZXJfd2FsayhkaXJuYW1lLCBMT09LVVBfRk9MTE9XLCBuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJLyogeW91IGNhbiBvbmx5IHdhdGNoIGFuIGlub2RlIGlmIHlvdSBoYXZlIHJlYWQgcGVybWlzc2lvbnMgb24gaXQgKi8KKwllcnJvciA9IHBlcm1pc3Npb24obmQtPmRlbnRyeS0+ZF9pbm9kZSwgTUFZX1JFQUQsIE5VTEwpOworCWlmIChlcnJvcikgCisJCXBhdGhfcmVsZWFzZSAobmQpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGNyZWF0ZV93YXRjaCAtIGNyZWF0ZXMgYSB3YXRjaCBvbiB0aGUgZ2l2ZW4gZGV2aWNlLgorICoKKyAqIENhbGxlcnMgbXVzdCBob2xkIGRldi0+c2VtLiAgQ2FsbHMgaW5vdGlmeV9kZXZfZ2V0X3dkKCkgc28gbWF5IHNsZWVwLgorICogQm90aCAnZGV2JyBhbmQgJ2lub2RlJyAoYnkgd2F5IG9mIG5hbWVpZGF0YSkgbmVlZCB0byBiZSBwaW5uZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqY3JlYXRlX3dhdGNoKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LAorCQkJCQkgIHUzMiBtYXNrLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaDsKKwlpbnQgcmV0OworCisJaWYgKGF0b21pY19yZWFkKCZkZXYtPnVzZXItPmlub3RpZnlfd2F0Y2hlcykgPj0gaW5vdGlmeV9tYXhfdXNlcl93YXRjaGVzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKKworCXdhdGNoID0ga21lbV9jYWNoZV9hbGxvYyh3YXRjaF9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghd2F0Y2gpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXJldCA9IGlub3RpZnlfZGV2X2dldF93ZChkZXYsIHdhdGNoKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlrbWVtX2NhY2hlX2ZyZWUod2F0Y2hfY2FjaGVwLCB3YXRjaCk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJd2F0Y2gtPm1hc2sgPSBtYXNrOworCWF0b21pY19zZXQoJndhdGNoLT5jb3VudCwgMCk7CisJSU5JVF9MSVNUX0hFQUQoJndhdGNoLT5kX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZ3YXRjaC0+aV9saXN0KTsKKworCS8qIHNhdmUgYSByZWZlcmVuY2UgdG8gZGV2aWNlIGFuZCBidW1wIHRoZSBjb3VudCB0byBtYWtlIGl0IG9mZmljaWFsICovCisJZ2V0X2lub3RpZnlfZGV2KGRldik7CisJd2F0Y2gtPmRldiA9IGRldjsKKworCS8qCisJICogU2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgYW5kIGJ1bXAgdGhlIHJlZiBjb3VudCB0byBtYWtlIGl0CisJICogb2ZmaWNpYWwuICBXZSBob2xkIGEgcmVmZXJlbmNlIHRvIG5hbWVpZGF0YSwgd2hpY2ggbWFrZXMgdGhpcyBzYWZlLgorCSAqLworCXdhdGNoLT5pbm9kZSA9IGlncmFiKGlub2RlKTsKKworCS8qIGJ1bXAgb3VyIG93biBjb3VudCwgY29ycmVzcG9uZGluZyB0byBvdXIgZW50cnkgaW4gZGV2LT53YXRjaGVzICovCisJZ2V0X2lub3RpZnlfd2F0Y2god2F0Y2gpOworCisJYXRvbWljX2luYygmZGV2LT51c2VyLT5pbm90aWZ5X3dhdGNoZXMpOworCisJcmV0dXJuIHdhdGNoOworfQorCisvKgorICogaW5vdGlmeV9maW5kX2RldiAtIGZpbmQgdGhlIHdhdGNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW5vZGUgYW5kIGRldgorICoKKyAqIENhbGxlcnMgbXVzdCBob2xkIGlub2RlLT5pbm90aWZ5X3NlbS4KKyAqLworc3RhdGljIHN0cnVjdCBpbm90aWZ5X3dhdGNoICppbm9kZV9maW5kX2RldihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YXRjaCwgJmlub2RlLT5pbm90aWZ5X3dhdGNoZXMsIGlfbGlzdCkgeworCQlpZiAod2F0Y2gtPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gd2F0Y2g7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiByZW1vdmVfd2F0Y2hfbm9fZXZlbnQgLSByZW1vdmVfd2F0Y2goKSB3aXRob3V0IHRoZSBJTl9JR05PUkVEIGV2ZW50LgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfd2F0Y2hfbm9fZXZlbnQoc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLAorCQkJCSAgc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpCit7CisJbGlzdF9kZWwoJndhdGNoLT5pX2xpc3QpOworCWxpc3RfZGVsKCZ3YXRjaC0+ZF9saXN0KTsKKworCWF0b21pY19kZWMoJmRldi0+dXNlci0+aW5vdGlmeV93YXRjaGVzKTsKKwlpZHJfcmVtb3ZlKCZkZXYtPmlkciwgd2F0Y2gtPndkKTsKKwlwdXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7Cit9CisKKy8qCisgKiByZW1vdmVfd2F0Y2ggLSBSZW1vdmUgYSB3YXRjaCBmcm9tIGJvdGggdGhlIGRldmljZSBhbmQgdGhlIGlub2RlLiAgU2VuZHMKKyAqIHRoZSBJTl9JR05PUkVEIGV2ZW50IHRvIHRoZSBnaXZlbiBkZXZpY2Ugc2lnbmlmeWluZyB0aGF0IHRoZSBpbm9kZSBpcyBubworICogbG9uZ2VyIHdhdGNoZWQuCisgKgorICogQ2FsbGVycyBtdXN0IGhvbGQgYm90aCBpbm9kZS0+aW5vdGlmeV9zZW0gYW5kIGRldi0+c2VtLiAgV2UgZHJvcCBhCisgKiByZWZlcmVuY2UgdG8gdGhlIGlub2RlIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICogVGhlIGlub2RlIGlzIG5vdCBpcHV0KCkgc28gYXMgdG8gcmVtYWluIGF0b21pYy4gIElmIHRoZSBpbm9kZSBuZWVkcyB0byBiZQorICogaXB1dCgpLCB0aGUgY2FsbCByZXR1cm5zIG9uZS4gIE90aGVyd2lzZSwgaXQgcmV0dXJucyB6ZXJvLgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfd2F0Y2goc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQoreworCWlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50KGRldiwgd2F0Y2gsIElOX0lHTk9SRUQsIDAsIE5VTEwpOworCXJlbW92ZV93YXRjaF9ub19ldmVudCh3YXRjaCwgZGV2KTsKK30KKworLyoKKyAqIGlub3RpZnlfaW5vZGVfd2F0Y2hlZCAtIHJldHVybnMgbm9uemVybyBpZiB0aGVyZSBhcmUgd2F0Y2hlcyBvbiB0aGlzIGlub2RlCisgKiBhbmQgemVybyBvdGhlcndpc2UuICBXZSBjYWxsIHRoaXMgbG9ja2xlc3MsIHdlIGRvIG5vdCBjYXJlIGlmIHdlIHJhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlub3RpZnlfaW5vZGVfd2F0Y2hlZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmaW5vZGUtPmlub3RpZnlfd2F0Y2hlcyk7Cit9CisKKy8qIEtlcm5lbCBBUEkgKi8KKworLyoqCisgKiBpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50IC0gcXVldWUgYW4gZXZlbnQgdG8gYWxsIHdhdGNoZXMgb24gdGhpcyBpbm9kZQorICogQGlub2RlOiBpbm9kZSBldmVudCBpcyBvcmlnaW5hdGluZyBmcm9tCisgKiBAbWFzazogZXZlbnQgbWFzayBkZXNjcmliaW5nIHRoaXMgZXZlbnQKKyAqIEBjb29raWU6IGNvb2tpZSBmb3Igc3luY2hyb25pemF0aW9uLCBvciB6ZXJvCisgKiBAbmFtZTogZmlsZW5hbWUsIGlmIGFueQorICovCit2b2lkIGlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIG1hc2ssIHUzMiBjb29raWUsCisJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gsICpuZXh0OworCisJaWYgKCFpbm90aWZ5X2lub2RlX3dhdGNoZWQoaW5vZGUpKQorCQlyZXR1cm47CisKKwlkb3duKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YXRjaCwgbmV4dCwgJmlub2RlLT5pbm90aWZ5X3dhdGNoZXMsIGlfbGlzdCkgeworCQl1MzIgd2F0Y2hfbWFzayA9IHdhdGNoLT5tYXNrOworCQlpZiAod2F0Y2hfbWFzayAmIG1hc2spIHsKKwkJCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2ID0gd2F0Y2gtPmRldjsKKwkJCWdldF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKKwkJCWRvd24oJmRldi0+c2VtKTsKKwkJCWlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50KGRldiwgd2F0Y2gsIG1hc2ssIGNvb2tpZSwgbmFtZSk7CisJCQlpZiAod2F0Y2hfbWFzayAmIElOX09ORVNIT1QpCisJCQkJcmVtb3ZlX3dhdGNoX25vX2V2ZW50KHdhdGNoLCBkZXYpOworCQkJdXAoJmRldi0+c2VtKTsKKwkJCXB1dF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKKwkJfQorCX0KKwl1cCgmaW5vZGUtPmlub3RpZnlfc2VtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQpOworCisvKioKKyAqIGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudCAtIHF1ZXVlIGFuIGV2ZW50IHRvIGEgZGVudHJ5J3MgcGFyZW50CisgKiBAZGVudHJ5OiB0aGUgZGVudHJ5IGluIHF1ZXN0aW9uLCB3ZSBxdWV1ZSBhZ2FpbnN0IHRoaXMgZGVudHJ5J3MgcGFyZW50CisgKiBAbWFzazogZXZlbnQgbWFzayBkZXNjcmliaW5nIHRoaXMgZXZlbnQKKyAqIEBjb29raWU6IGNvb2tpZSBmb3Igc3luY2hyb25pemF0aW9uLCBvciB6ZXJvCisgKiBAbmFtZTogZmlsZW5hbWUsIGlmIGFueQorICovCit2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHUzMiBtYXNrLAorCQkJCSAgICAgICB1MzIgY29va2llLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwlpbm9kZSA9IHBhcmVudC0+ZF9pbm9kZTsKKworCWlmIChpbm90aWZ5X2lub2RlX3dhdGNoZWQoaW5vZGUpKSB7CisJCWRnZXQocGFyZW50KTsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgbWFzaywgY29va2llLCBuYW1lKTsKKwkJZHB1dChwYXJlbnQpOworCX0gZWxzZQorCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KTsKKworLyoqCisgKiBpbm90aWZ5X2dldF9jb29raWUgLSByZXR1cm4gYSB1bmlxdWUgY29va2llIGZvciB1c2UgaW4gc3luY2hyb25pemluZyBldmVudHMuCisgKi8KK3UzMiBpbm90aWZ5X2dldF9jb29raWUodm9pZCkKK3sKKwlyZXR1cm4gYXRvbWljX2luY19yZXR1cm4oJmlub3RpZnlfY29va2llKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfZ2V0X2Nvb2tpZSk7CisKKy8qKgorICogaW5vdGlmeV91bm1vdW50X2lub2RlcyAtIGFuIHNiIGlzIHVubW91bnRpbmcuICBoYW5kbGUgYW55IHdhdGNoZWQgaW5vZGVzLgorICogQGxpc3Q6IGxpc3Qgb2YgaW5vZGVzIGJlaW5nIHVubW91bnRlZCAoc2ItPnNfaW5vZGVzKQorICoKKyAqIENhbGxlZCB3aXRoIGlub2RlX2xvY2sgaGVsZCwgcHJvdGVjdGluZyB0aGUgdW5tb3VudGluZyBzdXBlciBibG9jaydzIGxpc3QKKyAqIG9mIGlub2RlcywgYW5kIHdpdGggaXBydW5lX3NlbSBoZWxkLCBrZWVwaW5nIHNocmlua19pY2FjaGVfbWVtb3J5KCkgYXQgYmF5LgorICogV2UgdGVtcG9yYXJpbHkgZHJvcCBpbm9kZV9sb2NrLCBob3dldmVyLCBhbmQgQ0FOIGJsb2NrLgorICovCit2b2lkIGlub3RpZnlfdW5tb3VudF9pbm9kZXMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqbmV4dF9pLCAqbmVlZF9pcHV0ID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbm9kZSwgbmV4dF9pLCBsaXN0LCBpX3NiX2xpc3QpIHsKKwkJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLCAqbmV4dF93OworCQlzdHJ1Y3QgaW5vZGUgKm5lZWRfaXB1dF90bXA7CisJCXN0cnVjdCBsaXN0X2hlYWQgKndhdGNoZXM7CisKKwkJLyoKKwkJICogSWYgaV9jb3VudCBpcyB6ZXJvLCB0aGUgaW5vZGUgY2Fubm90IGhhdmUgYW55IHdhdGNoZXMgYW5kCisJCSAqIGRvaW5nIGFuIF9faWdldC9pcHV0IHdpdGggTVNfQUNUSVZFIGNsZWFyIHdvdWxkIGFjdHVhbGx5CisJCSAqIGV2aWN0IGFsbCBpbm9kZXMgd2l0aCB6ZXJvIGlfY291bnQgZnJvbSBpY2FjaGUgd2hpY2ggaXMKKwkJICogdW5uZWNlc3NhcmlseSB2aW9sZW50IGFuZCBtYXkgaW4gZmFjdCBiZSBpbGxlZ2FsIHRvIGRvLgorCQkgKi8KKwkJaWYgKCFhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogV2UgY2Fubm90IF9faWdldCgpIGFuIGlub2RlIGluIHN0YXRlIElfQ0xFQVIsIElfRlJFRUlORywgb3IKKwkJICogSV9XSUxMX0ZSRUUgd2hpY2ggaXMgZmluZSBiZWNhdXNlIGJ5IHRoYXQgcG9pbnQgdGhlIGlub2RlCisJCSAqIGNhbm5vdCBoYXZlIGFueSBhc3NvY2lhdGVkIHdhdGNoZXMuCisJCSAqLworCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9DTEVBUiB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkKKwkJCWNvbnRpbnVlOworCisJCW5lZWRfaXB1dF90bXAgPSBuZWVkX2lwdXQ7CisJCW5lZWRfaXB1dCA9IE5VTEw7CisJCS8qIEluIGNhc2UgdGhlIHJlbW92ZV93YXRjaCgpIGRyb3BzIGEgcmVmZXJlbmNlLiAqLworCQlpZiAoaW5vZGUgIT0gbmVlZF9pcHV0X3RtcCkKKwkJCV9faWdldChpbm9kZSk7CisJCWVsc2UKKwkJCW5lZWRfaXB1dF90bXAgPSBOVUxMOworCQkvKiBJbiBjYXNlIHRoZSBkcm9wcGluZyBvZiBhIHJlZmVyZW5jZSB3b3VsZCBudWtlIG5leHRfaS4gKi8KKwkJaWYgKCgmbmV4dF9pLT5pX3NiX2xpc3QgIT0gbGlzdCkgJiYKKwkJCQlhdG9taWNfcmVhZCgmbmV4dF9pLT5pX2NvdW50KSAmJgorCQkJCSEobmV4dF9pLT5pX3N0YXRlICYgKElfQ0xFQVIgfCBJX0ZSRUVJTkcgfAorCQkJCQlJX1dJTExfRlJFRSkpKSB7CisJCQlfX2lnZXQobmV4dF9pKTsKKwkJCW5lZWRfaXB1dCA9IG5leHRfaTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGNhbiBzYWZlbHkgZHJvcCBpbm9kZV9sb2NrIGhlcmUgYmVjYXVzZSB3ZSBob2xkCisJCSAqIHJlZmVyZW5jZXMgb24gYm90aCBpbm9kZSBhbmQgbmV4dF9pLiAgQWxzbyBubyBuZXcgaW5vZGVzCisJCSAqIHdpbGwgYmUgYWRkZWQgc2luY2UgdGhlIHVtb3VudCBoYXMgYmVndW4uICBGaW5hbGx5LAorCQkgKiBpcHJ1bmVfc2VtIGtlZXBzIHNocmlua19pY2FjaGVfbWVtb3J5KCkgYXdheS4KKwkJICovCisJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCQlpZiAobmVlZF9pcHV0X3RtcCkKKwkJCWlwdXQobmVlZF9pcHV0X3RtcCk7CisKKwkJLyogZm9yIGVhY2ggd2F0Y2gsIHNlbmQgSU5fVU5NT1VOVCBhbmQgdGhlbiByZW1vdmUgaXQgKi8KKwkJZG93bigmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwkJd2F0Y2hlcyA9ICZpbm9kZS0+aW5vdGlmeV93YXRjaGVzOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIG5leHRfdywgd2F0Y2hlcywgaV9saXN0KSB7CisJCQlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiA9IHdhdGNoLT5kZXY7CisJCQlkb3duKCZkZXYtPnNlbSk7CisJCQlpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudChkZXYsIHdhdGNoLCBJTl9VTk1PVU5ULDAsTlVMTCk7CisJCQlyZW1vdmVfd2F0Y2god2F0Y2gsIGRldik7CisJCQl1cCgmZGV2LT5zZW0pOworCQl9CisJCXVwKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCQlpcHV0KGlub2RlKTsJCQorCisJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV91bm1vdW50X2lub2Rlcyk7CisKKy8qKgorICogaW5vdGlmeV9pbm9kZV9pc19kZWFkIC0gYW4gaW5vZGUgaGFzIGJlZW4gZGVsZXRlZCwgY2xlYW51cCBhbnkgd2F0Y2hlcworICogQGlub2RlOiBpbm9kZSB0aGF0IGlzIGFib3V0IHRvIGJlIHJlbW92ZWQKKyAqLwordm9pZCBpbm90aWZ5X2lub2RlX2lzX2RlYWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gsICpuZXh0OworCisJZG93bigmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIG5leHQsICZpbm9kZS0+aW5vdGlmeV93YXRjaGVzLCBpX2xpc3QpIHsKKwkJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYgPSB3YXRjaC0+ZGV2OworCQlkb3duKCZkZXYtPnNlbSk7CisJCXJlbW92ZV93YXRjaCh3YXRjaCwgZGV2KTsKKwkJdXAoJmRldi0+c2VtKTsKKwl9CisJdXAoJmlub2RlLT5pbm90aWZ5X3NlbSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbm90aWZ5X2lub2RlX2lzX2RlYWQpOworCisvKiBEZXZpY2UgSW50ZXJmYWNlICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5vdGlmeV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQgPSAwOworCisJcG9sbF93YWl0KGZpbGUsICZkZXYtPndxLCB3YWl0KTsKKwlkb3duKCZkZXYtPnNlbSk7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cykpCisJCXJldCA9IFBPTExJTiB8IFBPTExSRE5PUk07CisJdXAoJmRldi0+c2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlub3RpZnlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXNpemVfdCBldmVudF9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgaW5vdGlmeV9ldmVudCk7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJY2hhciBfX3VzZXIgKnN0YXJ0OworCWludCByZXQ7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlzdGFydCA9IGJ1ZjsKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgZXZlbnRzOworCisJCXByZXBhcmVfdG9fd2FpdCgmZGV2LT53cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJZG93bigmZGV2LT5zZW0pOworCQlldmVudHMgPSAhbGlzdF9lbXB0eSgmZGV2LT5ldmVudHMpOworCQl1cCgmZGV2LT5zZW0pOworCQlpZiAoZXZlbnRzKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0ID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKworCQlzY2hlZHVsZSgpOworCX0KKworCWZpbmlzaF93YWl0KCZkZXYtPndxLCAmd2FpdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRvd24oJmRldi0+c2VtKTsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudDsKKworCQlyZXQgPSBidWYgLSBzdGFydDsKKwkJaWYgKGxpc3RfZW1wdHkoJmRldi0+ZXZlbnRzKSkKKwkJCWJyZWFrOworCisJCWtldmVudCA9IGlub3RpZnlfZGV2X2dldF9ldmVudChkZXYpOworCQlpZiAoZXZlbnRfc2l6ZSArIGtldmVudC0+ZXZlbnQubGVuID4gY291bnQpCisJCQlicmVhazsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmtldmVudC0+ZXZlbnQsIGV2ZW50X3NpemUpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnVmICs9IGV2ZW50X3NpemU7CisJCWNvdW50IC09IGV2ZW50X3NpemU7CisKKwkJaWYgKGtldmVudC0+bmFtZSkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGtldmVudC0+bmFtZSwga2V2ZW50LT5ldmVudC5sZW4pKXsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJYnVmICs9IGtldmVudC0+ZXZlbnQubGVuOworCQkJY291bnQgLT0ga2V2ZW50LT5ldmVudC5sZW47CisJCX0KKworCQlyZW1vdmVfa2V2ZW50KGRldiwga2V2ZW50KTsKKwl9CisJdXAoJmRldi0+c2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW5vdGlmeV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaWdub3JlZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKgorCSAqIERlc3Ryb3kgYWxsIG9mIHRoZSB3YXRjaGVzIG9uIHRoaXMgZGV2aWNlLiAgVW5mb3J0dW5hdGVseSwgbm90IHZlcnkKKwkgKiBwcmV0dHkuICBXZSBjYW5ub3QgZG8gYSBzaW1wbGUgaXRlcmF0aW9uIG92ZXIgdGhlIGxpc3QsIGJlY2F1c2Ugd2UKKwkgKiBkbyBub3Qga25vdyB0aGUgaW5vZGUgdW50aWwgd2UgaXRlcmF0ZSB0byB0aGUgd2F0Y2guICBCdXQgd2UgbmVlZCB0bworCSAqIGhvbGQgaW5vZGUtPmlub3RpZnlfc2VtIGJlZm9yZSBkZXYtPnNlbS4gIFRoZSBmb2xsb3dpbmcgd29ya3MuCisJICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoOworCQlzdHJ1Y3QgbGlzdF9oZWFkICp3YXRjaGVzOworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJCWRvd24oJmRldi0+c2VtKTsKKwkJd2F0Y2hlcyA9ICZkZXYtPndhdGNoZXM7CisJCWlmIChsaXN0X2VtcHR5KHdhdGNoZXMpKSB7CisJCQl1cCgmZGV2LT5zZW0pOworCQkJYnJlYWs7CisJCX0KKwkJd2F0Y2ggPSBsaXN0X2VudHJ5KHdhdGNoZXMtPm5leHQsIHN0cnVjdCBpbm90aWZ5X3dhdGNoLCBkX2xpc3QpOworCQlnZXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7CisJCXVwKCZkZXYtPnNlbSk7CisKKwkJaW5vZGUgPSB3YXRjaC0+aW5vZGU7CisJCWRvd24oJmlub2RlLT5pbm90aWZ5X3NlbSk7CisJCWRvd24oJmRldi0+c2VtKTsKKwkJcmVtb3ZlX3dhdGNoX25vX2V2ZW50KHdhdGNoLCBkZXYpOworCQl1cCgmZGV2LT5zZW0pOworCQl1cCgmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwkJcHV0X2lub3RpZnlfd2F0Y2god2F0Y2gpOworCX0KKworCS8qIGRlc3Ryb3kgYWxsIG9mIHRoZSBldmVudHMgb24gdGhpcyBkZXZpY2UgKi8KKwlkb3duKCZkZXYtPnNlbSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cykpCisJCWlub3RpZnlfZGV2X2V2ZW50X2RlcXVldWUoZGV2KTsKKwl1cCgmZGV2LT5zZW0pOworCisJLyogZnJlZSB0aGlzIGRldmljZTogdGhlIHB1dCBtYXRjaGluZyB0aGUgZ2V0IGluIGlub3RpZnlfb3BlbigpICovCisJcHV0X2lub3RpZnlfZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGlub3RpZnlfaWdub3JlIC0gaGFuZGxlIHRoZSBJTk9USUZZX0lHTk9SRSBpb2N0bCwgYXNraW5nIHRoYXQgYSBnaXZlbiB3ZCBiZQorICogcmVtb3ZlZCBmcm9tIHRoZSBkZXZpY2UuCisgKgorICogQ2FuIHNsZWVwLgorICovCitzdGF0aWMgaW50IGlub3RpZnlfaWdub3JlKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LCBzMzIgd2QpCit7CisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlkb3duKCZkZXYtPnNlbSk7CisJd2F0Y2ggPSBpZHJfZmluZCgmZGV2LT5pZHIsIHdkKTsKKwlpZiAodW5saWtlbHkoIXdhdGNoKSkgeworCQl1cCgmZGV2LT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZ2V0X2lub3RpZnlfd2F0Y2god2F0Y2gpOworCWlub2RlID0gd2F0Y2gtPmlub2RlOworCXVwKCZkZXYtPnNlbSk7CisKKwlkb3duKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCWRvd24oJmRldi0+c2VtKTsKKworCS8qIG1ha2Ugc3VyZSB0aGF0IHdlIGRpZCBub3QgcmFjZSAqLworCXdhdGNoID0gaWRyX2ZpbmQoJmRldi0+aWRyLCB3ZCk7CisJaWYgKGxpa2VseSh3YXRjaCkpCisJCXJlbW92ZV93YXRjaCh3YXRjaCwgZGV2KTsKKworCXVwKCZkZXYtPnNlbSk7CisJdXAoJmlub2RlLT5pbm90aWZ5X3NlbSk7CisJcHV0X2lub3RpZnlfd2F0Y2god2F0Y2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGlub3RpZnlfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OworCXZvaWQgX191c2VyICpwOworCWludCByZXQgPSAtRU5PVFRZOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXAgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEZJT05SRUFEOgorCQlyZXQgPSBwdXRfdXNlcihkZXYtPnF1ZXVlX3NpemUsIChpbnQgX191c2VyICopIHApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbm90aWZ5X2ZvcHMgPSB7CisJLnBvbGwgICAgICAgICAgID0gaW5vdGlmeV9wb2xsLAorCS5yZWFkICAgICAgICAgICA9IGlub3RpZnlfcmVhZCwKKwkucmVsZWFzZSAgICAgICAgPSBpbm90aWZ5X3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gaW5vdGlmeV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gaW5vdGlmeV9pb2N0bCwKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW5vdGlmeV9pbml0KHZvaWQpCit7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOworCWludCByZXQgPSAtRU5PVFRZOworCWludCBmZDsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKworCWZkID0gZ2V0X3VudXNlZF9mZCgpOworCWlmIChmZCA8IDApIHsKKwkJcmV0ID0gZmQ7CisJCWdvdG8gb3V0OworCX0KKworCWZpbHAgPSBnZXRfZW1wdHlfZmlscCgpOworCWlmICghZmlscCkgeworCQlwdXRfdW51c2VkX2ZkKGZkKTsKKwkJcmV0ID0gLUVORklMRTsKKwkJZ290byBvdXQ7CisJfQorCWZpbHAtPmZfb3AgPSAmaW5vdGlmeV9mb3BzOworCWZpbHAtPmZfdmZzbW50ID0gbW50Z2V0KGlub3RpZnlfbW50KTsKKwlmaWxwLT5mX2RlbnRyeSA9IGRnZXQoaW5vdGlmeV9tbnQtPm1udF9yb290KTsKKwlmaWxwLT5mX21hcHBpbmcgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWZpbHAtPmZfbW9kZSA9IEZNT0RFX1JFQUQ7CisJZmlscC0+Zl9mbGFncyA9IE9fUkRPTkxZOworCisJdXNlciA9IGdldF91aWQoY3VycmVudC0+dXNlcik7CisKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnVzZXItPmlub3RpZnlfZGV2cykgPj0gaW5vdGlmeV9tYXhfdXNlcl9pbnN0YW5jZXMpKSB7CisJCXJldCA9IC1FTUZJTEU7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWRldikpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlkcl9pbml0KCZkZXYtPmlkcik7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZXZlbnRzKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT53YXRjaGVzKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndxKTsKKwlzZW1hX2luaXQoJmRldi0+c2VtLCAxKTsKKwlkZXYtPmV2ZW50X2NvdW50ID0gMDsKKwlkZXYtPnF1ZXVlX3NpemUgPSAwOworCWRldi0+bWF4X2V2ZW50cyA9IGlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHM7CisJZGV2LT51c2VyID0gdXNlcjsKKwlhdG9taWNfc2V0KCZkZXYtPmNvdW50LCAwKTsKKworCWdldF9pbm90aWZ5X2RldihkZXYpOworCWF0b21pY19pbmMoJnVzZXItPmlub3RpZnlfZGV2cyk7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBkZXY7CisJZmRfaW5zdGFsbCAoZmQsIGZpbHApOworCXJldHVybiBmZDsKK291dF9lcnI6CisJcHV0X3VudXNlZF9mZCAoZmQpOworCXB1dF9maWxwIChmaWxwKTsKKwlmcmVlX3VpZCh1c2VyKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfYWRkX3dhdGNoKGludCBmZCwgY29uc3QgY2hhciAqcGF0aCwgdTMyIG1hc2spCit7CisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLCAqb2xkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlpbnQgcmV0OworCisJZmlscCA9IGZnZXQoZmQpOworCWlmICghZmlscCkKKwkJcmV0dXJuIC1FQkFERjsKKworCWRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCXJldCA9IGZpbmRfaW5vZGUoKGNvbnN0IGNoYXIgX191c2VyKikgcGF0aCwgJm5kKTsKKwlpZiAocmV0KQorCQlnb3RvIGZwdXRfYW5kX291dDsKKworCS8qIEhlbGQgaW4gcGxhY2UgYnkgcmVmZXJlbmNlIGluIG5kICovCisJaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7CisKKwlkb3duKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCWRvd24oJmRldi0+c2VtKTsKKworCS8qIGRvbid0IGxldCB1c2VyLXNwYWNlIHNldCBpbnZhbGlkIGJpdHM6IHdlIGRvbid0IHdhbnQgZmxhZ3Mgc2V0ICovCisJbWFzayAmPSBJTl9BTExfRVZFTlRTOworCWlmICghbWFzaykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgY2FzZSBvZiByZS1hZGRpbmcgYSB3YXRjaCBvbiBhbiAoaW5vZGUsZGV2KSBwYWlyIHRoYXQgd2UKKwkgKiBhcmUgYWxyZWFkeSB3YXRjaGluZy4gIFdlIGp1c3QgdXBkYXRlIHRoZSBtYXNrIGFuZCByZXR1cm4gaXRzIHdkLgorCSAqLworCW9sZCA9IGlub2RlX2ZpbmRfZGV2KGlub2RlLCBkZXYpOworCWlmICh1bmxpa2VseShvbGQpKSB7CisJCW9sZC0+bWFzayA9IG1hc2s7CisJCXJldCA9IG9sZC0+d2Q7CisJCWdvdG8gb3V0OworCX0KKworCXdhdGNoID0gY3JlYXRlX3dhdGNoKGRldiwgbWFzaywgaW5vZGUpOworCWlmICh1bmxpa2VseShJU19FUlIod2F0Y2gpKSkgeworCQlyZXQgPSBQVFJfRVJSKHdhdGNoKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWRkIHRoZSB3YXRjaCB0byB0aGUgZGV2aWNlJ3MgYW5kIHRoZSBpbm9kZSdzIGxpc3QgKi8KKwlsaXN0X2FkZCgmd2F0Y2gtPmRfbGlzdCwgJmRldi0+d2F0Y2hlcyk7CisJbGlzdF9hZGQoJndhdGNoLT5pX2xpc3QsICZpbm9kZS0+aW5vdGlmeV93YXRjaGVzKTsKKwlyZXQgPSB3YXRjaC0+d2Q7CitvdXQ6CisJcGF0aF9yZWxlYXNlICgmbmQpOworCXVwKCZkZXYtPnNlbSk7CisJdXAoJmlub2RlLT5pbm90aWZ5X3NlbSk7CitmcHV0X2FuZF9vdXQ6CisJZnB1dChmaWxwKTsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfcm1fd2F0Y2goaW50IGZkLCB1MzIgd2QpCit7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJaW50IHJldDsKKworCWZpbHAgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbHApCisJCXJldHVybiAtRUJBREY7CisJZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXJldCA9IGlub3RpZnlfaWdub3JlKGRldiwgd2QpOworCWZwdXQoZmlscCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK2lub3RpZnlfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCisJICAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworICAgIHJldHVybiBnZXRfc2JfcHNldWRvKGZzX3R5cGUsICJpbm90aWZ5IiwgTlVMTCwgMHhCQUQxREVBKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGlub3RpZnlfZnNfdHlwZSA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaW5vdGlmeWZzIiwKKyAgICAuZ2V0X3NiICAgICAgICAgPSBpbm90aWZ5X2dldF9zYiwKKyAgICAua2lsbF9zYiAgICAgICAgPSBraWxsX2Fub25fc3VwZXIsCit9OworCisvKgorICogaW5vdGlmeV9pbml0IC0gT3VyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHdlIGNhbm5ub3QgcmV0dXJuCisgKiBlcnJvciBiZWNhdXNlIHdlIGhhdmUgY29tcGlsZWQtaW4gVkZTIGhvb2tzLiAgU28gYW4gKHVubGlrZWx5KSBmYWlsdXJlIGhlcmUKKyAqIG11c3QgcmVzdWx0IGluIHBhbmljKCkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlub3RpZnlfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmlub3RpZnlfZnNfdHlwZSk7CisJaW5vdGlmeV9tbnQgPSBrZXJuX21vdW50KCZpbm90aWZ5X2ZzX3R5cGUpOworCisJaW5vdGlmeV9tYXhfcXVldWVkX2V2ZW50cyA9IDgxOTI7CisJaW5vdGlmeV9tYXhfdXNlcl9pbnN0YW5jZXMgPSA4OworCWlub3RpZnlfbWF4X3VzZXJfd2F0Y2hlcyA9IDgxOTI7CisKKwlhdG9taWNfc2V0KCZpbm90aWZ5X2Nvb2tpZSwgMCk7CisKKwl3YXRjaF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW5vdGlmeV93YXRjaF9jYWNoZSIsCisJCQkJCSBzaXplb2Yoc3RydWN0IGlub3RpZnlfd2F0Y2gpLAorCQkJCQkgMCwgU0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CisJZXZlbnRfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlub3RpZnlfZXZlbnRfY2FjaGUiLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCksCisJCQkJCSAwLCBTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChpbm90aWZ5X2luaXQpOwpkaWZmIC0tZ2l0IGEvZnMvaW9wcmlvLmMgYi9mcy9pb3ByaW8uYwppbmRleCA2NjNlNDIwLi45N2UxZjA4IDEwMDY0NAotLS0gYS9mcy9pb3ByaW8uYworKysgYi9mcy9pb3ByaW8uYwpAQCAtNDMsNyArNDMsNyBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGludCBzeXNfaW9wcmlvX3NldChpbnQgd2hpY2gsIGludCB3aG8sIGludCBpb3ByaW8pCithc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19zZXQoaW50IHdoaWNoLCBpbnQgd2hvLCBpbnQgaW9wcmlvKQogewogCWludCBjbGFzcyA9IElPUFJJT19QUklPX0NMQVNTKGlvcHJpbyk7CiAJaW50IGRhdGEgPSBJT1BSSU9fUFJJT19EQVRBKGlvcHJpbyk7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGludCBzeXNfaW9wcmlvX2dldChpbnQgd2hpY2gsIGludCB3aG8pCithc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19nZXQoaW50IHdoaWNoLCBpbnQgd2hvKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CiAJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvTWFrZWZpbGUgYi9mcy9qZmZzMi9NYWtlZmlsZQppbmRleCBlM2MzOGNjLi5mMWFmZTY4IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9NYWtlZmlsZQorKysgYi9mcy9qZmZzMi9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSB2MiAoSkZGUzIpCiAjCi0jICRJZDogTWFrZWZpbGUuY29tbW9uLHYgMS43IDIwMDQvMTEvMDMgMTI6NTc6Mzggandib3llciBFeHAgJAorIyAkSWQ6IE1ha2VmaWxlLmNvbW1vbix2IDEuOSAyMDA1LzAyLzA5IDA5OjIzOjUzIHBhdmxvdiBFeHAgJAogIwogCiBvYmotJChDT05GSUdfSkZGUzJfRlMpICs9IGpmZnMyLm8KQEAgLTExLDggKzExLDcgQEAKIGpmZnMyLXkJKz0gc3ltbGluay5vIGJ1aWxkLm8gZXJhc2UubyBiYWNrZ3JvdW5kLm8gZnMubyB3cml0ZXYubwogamZmczIteQkrPSBzdXBlci5vCiAKLWpmZnMyLSQoQ09ORklHX0pGRlMyX0ZTX05BTkQpCSs9IHdidWYubwotamZmczItJChDT05GSUdfSkZGUzJfRlNfTk9SX0VDQykgKz0gd2J1Zi5vCitqZmZzMi0kKENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUikJKz0gd2J1Zi5vCiBqZmZzMi0kKENPTkZJR19KRkZTMl9SVUJJTikJKz0gY29tcHJfcnViaW4ubwogamZmczItJChDT05GSUdfSkZGUzJfUlRJTUUpCSs9IGNvbXByX3J0aW1lLm8KIGpmZnMyLSQoQ09ORklHX0pGRlMyX1pMSUIpCSs9IGNvbXByX3psaWIubwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcgYi9mcy9qZmZzMi9SRUFETUUuTG9ja2luZwppbmRleCA0OTc3MWNmLi5iNzk0MzQzIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9SRUFETUUuTG9ja2luZworKysgYi9mcy9qZmZzMi9SRUFETUUuTG9ja2luZwpAQCAtMSw0ICsxLDQgQEAKLQkkSWQ6IFJFQURNRS5Mb2NraW5nLHYgMS45IDIwMDQvMTEvMjAgMTA6MzU6NDAgZHdtdzIgRXhwICQKKwkkSWQ6IFJFQURNRS5Mb2NraW5nLHYgMS4xMiAyMDA1LzA0LzEzIDEzOjIyOjM1IGR3bXcyIEV4cCAkCiAKIAlKRkZTMiBMT0NLSU5HIERPQ1VNRU5UQVRJT04KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEwOCw2ICsxMDgsMTAgQEAKIGNvcnJlc3BvbmRlbnQgamZmczJfaW5vZGVfY2FjaGUgb2JqZWN0KS4gU28sIHRoZSBpbm9jYWNoZV9sb2NrCiBoYXMgdG8gYmUgbG9ja2VkIHdoaWxlIHdhbGtpbmcgdGhlIGMtPmlub2NhY2hlX2xpc3QgaGFzaCBidWNrZXRzLgogCitUaGlzIHNwaW5sb2NrIGFsc28gY292ZXJzIGFsbG9jYXRpb24gb2YgbmV3IGlub2RlIG51bWJlcnMsIHdoaWNoIGlzCitjdXJyZW50bHkganVzdCAnKystPmhpZ2hlc3RfaW5vKysnLCBidXQgbWlnaHQgb25lIGRheSBnZXQgbW9yZSBjb21wbGljYXRlZAoraWYgd2UgbmVlZCB0byBkZWFsIHdpdGggd3JhcHBpbmcgYWZ0ZXIgNCBtaWxsaWFyZCBpbm9kZSBudW1iZXJzIGFyZSB1c2VkLgorCiBOb3RlLCB0aGUgZi0+c2VtIGd1YXJhbnRlZXMgdGhhdCB0aGUgY29ycmVzcG9uZGVudCBqZmZzMl9pbm9kZV9jYWNoZQogd2lsbCBub3QgYmUgcmVtb3ZlZC4gU28sIGl0IGlzIGFsbG93ZWQgdG8gYWNjZXNzIGl0IHdpdGhvdXQgbG9ja2luZwogdGhlIGlub2NhY2hlX2xvY2sgc3BpbmxvY2suIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvYmFja2dyb3VuZC5jIGIvZnMvamZmczIvYmFja2dyb3VuZC5jCmluZGV4IDYzODgzNmIuLjBmMjI0MzggMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2JhY2tncm91bmQuYworKysgYi9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGJhY2tncm91bmQuYyx2IDEuNTAgMjAwNC8xMS8xNiAyMDozNjoxMCBkd213MiBFeHAgJAorICogJElkOiBiYWNrZ3JvdW5kLmMsdiAxLjU0IDIwMDUvMDUvMjAgMjE6Mzc6MTIgZ2xlaXhuZXIgRXhwICQKICAqCiAgKi8KIApAQCAtMzcsNyArMzcsNyBAQAogCWlmIChjLT5nY190YXNrKQogCQlCVUcoKTsKIAotCWluaXRfTVVURVhfTE9DS0VEKCZjLT5nY190aHJlYWRfc3RhcnQpOworCWluaXRfY29tcGxldGlvbigmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKIAlpbml0X2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9leGl0KTsKIAogCXBpZCA9IGtlcm5lbF90aHJlYWQoamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCwgYywgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOwpAQCAtNDgsNyArNDgsNyBAQAogCX0gZWxzZSB7CiAJCS8qIFdhaXQgZm9yIGl0Li4uICovCiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJKRkZTMjogR2FyYmFnZSBjb2xsZWN0IHRocmVhZCBpcyBwaWQgJWRcbiIsIHBpZCkpOwotCQlkb3duKCZjLT5nY190aHJlYWRfc3RhcnQpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjLT5nY190aHJlYWRfc3RhcnQpOwogCX0KICAKIAlyZXR1cm4gcmV0OwpAQCAtNTYsMTMgKzU2LDE2IEBACiAKIHZvaWQgamZmczJfc3RvcF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQogeworCWludCB3YWl0ID0gMDsKIAlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CiAJaWYgKGMtPmdjX3Rhc2spIHsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyOiBLaWxsaW5nIEdDIHRhc2sgJWRcbiIsIGMtPmdjX3Rhc2stPnBpZCkpOwogCQlzZW5kX3NpZyhTSUdLSUxMLCBjLT5nY190YXNrLCAxKTsKKwkJd2FpdCA9IDE7CiAJfQogCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9leGl0KTsKKwlpZiAod2FpdCkKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmYy0+Z2NfdGhyZWFkX2V4aXQpOwogfQogCiBzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQodm9pZCAqX2MpCkBAIC03NSw3ICs3OCw3IEBACiAJYWxsb3dfc2lnbmFsKFNJR0NPTlQpOwogCiAJYy0+Z2NfdGFzayA9IGN1cnJlbnQ7Ci0JdXAoJmMtPmdjX3RocmVhZF9zdGFydCk7CisJY29tcGxldGUoJmMtPmdjX3RocmVhZF9zdGFydCk7CiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDEwKTsKIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvYnVpbGQuYyBiL2ZzL2pmZnMyL2J1aWxkLmMKaW5kZXggYTAxZGQ1Zi4uOTdkYzM5NyAxMDA2NDQKLS0tIGEvZnMvamZmczIvYnVpbGQuYworKysgYi9mcy9qZmZzMi9idWlsZC5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBidWlsZC5jLHYgMS42OSAyMDA0LzEyLzE2IDIwOjIyOjE4IGRtYXJsaW4gRXhwICQKKyAqICRJZDogYnVpbGQuYyx2IDEuNzEgMjAwNS8wNy8xMiAxNjozNzowOCBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC05NywxNCArOTcsMTYgQEAKIAkvKiBGaXJzdCwgc2NhbiB0aGUgbWVkaXVtIGFuZCBidWlsZCBhbGwgdGhlIGlub2RlIGNhY2hlcyB3aXRoCiAJICAgbGlzdHMgb2YgcGh5c2ljYWwgbm9kZXMgKi8KIAotCWMtPmZsYWdzIHw9IEpGRlMyX1NCX0ZMQUdfTU9VTlRJTkc7CisJYy0+ZmxhZ3MgfD0gSkZGUzJfU0JfRkxBR19TQ0FOTklORzsKIAlyZXQgPSBqZmZzMl9zY2FuX21lZGl1bShjKTsKKwljLT5mbGFncyAmPSB+SkZGUzJfU0JfRkxBR19TQ0FOTklORzsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiU2Nhbm5lZCBmbGFzaCBjb21wbGV0ZWx5XG4iKSk7CiAJRDIoamZmczJfZHVtcF9ibG9ja19saXN0cyhjKSk7CiAKKwljLT5mbGFncyB8PSBKRkZTMl9TQl9GTEFHX0JVSUxESU5HOwogCS8qIE5vdyBzY2FuIHRoZSBkaXJlY3RvcnkgdHJlZSwgaW5jcmVhc2luZyBubGluayBhY2NvcmRpbmcgdG8gZXZlcnkgZGlyZW50IGZvdW5kLiAqLwogCWZvcl9lYWNoX2lub2RlKGksIGMsIGljKSB7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQYXNzIDE6IGlubyAjJXVcbiIsIGljLT5pbm8pKTsKQEAgLTExNiw3ICsxMTgsNiBAQAogCQkJY29uZF9yZXNjaGVkKCk7CiAJCX0KIAl9Ci0JYy0+ZmxhZ3MgJj0gfkpGRlMyX1NCX0ZMQUdfTU9VTlRJTkc7CiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAxIGNvbXBsZXRlXG4iKSk7CiAKQEAgLTE2NCw2ICsxNjUsOCBAQAogCQlpYy0+c2Nhbl9kZW50cyA9IE5VTEw7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KKwljLT5mbGFncyAmPSB+SkZGUzJfU0JfRkxBR19CVUlMRElORzsKKwkKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAzIGNvbXBsZXRlXG4iKSk7CiAJRDIoamZmczJfZHVtcF9ibG9ja19saXN0cyhjKSk7CiAKQEAgLTMzMywxMyArMzM2LDYgQEAKIAkJYy0+YmxvY2tzW2ldLmJhZF9jb3VudCA9IDA7CiAJfQogCi0JaW5pdF9NVVRFWCgmYy0+YWxsb2Nfc2VtKTsKLQlpbml0X01VVEVYKCZjLT5lcmFzZV9mcmVlX3NlbSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+ZXJhc2Vfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+aW5vY2FjaGVfd3EpOwotCXNwaW5fbG9ja19pbml0KCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZjLT5pbm9jYWNoZV9sb2NrKTsKLQogCUlOSVRfTElTVF9IRUFEKCZjLT5jbGVhbl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmYy0+dmVyeV9kaXJ0eV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmYy0+ZGlydHlfbGlzdCk7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl96bGliLmMgYi9mcy9qZmZzMi9jb21wcl96bGliLmMKaW5kZXggMDc4YTMwZS4uODNmN2UwNyAxMDA2NDQKLS0tIGEvZnMvamZmczIvY29tcHJfemxpYi5jCisrKyBiL2ZzL2pmZnMyL2NvbXByX3psaWIuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogY29tcHJfemxpYi5jLHYgMS4yOSAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGNvbXByX3psaWIuYyx2IDEuMzEgMjAwNS8wNS8yMCAxOTozMDowNiBnbGVpeG5lciBFeHAgJAogICoKICAqLwogCkBAIC0xNywxMCArMTcsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KICNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlICJub2RlbGlzdC5oIgogI2luY2x1ZGUgImNvbXByLmgiCiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2Rpci5jIGIvZnMvamZmczIvZGlyLmMKaW5kZXggNzU3MzA2Zi4uM2NhMGQyNSAxMDA2NDQKLS0tIGEvZnMvamZmczIvZGlyLmMKKysrIGIvZnMvamZmczIvZGlyLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGRpci5jLHYgMS44NCAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGRpci5jLHYgMS44NiAyMDA1LzA3LzA2IDEyOjEzOjA5IGR3bXcyIEV4cCAkCiAgKgogICovCiAKQEAgLTIyLDE2ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgIm5vZGVsaXN0LmgiCiAKLS8qIFVyZ2guIFBsZWFzZSB0ZWxsIG1lIHRoZXJlJ3MgYSBuaWNlciB3YXkgb2YgZG9pbmcgdGhlc2UuICovCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw0OCkKLXR5cGVkZWYgaW50IG1rbm9kX2FyZ190OwotI2RlZmluZSBOQU1FSV9DT01QQVQoeCkgKCh2b2lkICopeCkKLSNlbHNlCi10eXBlZGVmIGRldl90IG1rbm9kX2FyZ190OwotI2RlZmluZSBOQU1FSV9DT01QQVQoeCkgKHgpCi0jZW5kaWYKLQogc3RhdGljIGludCBqZmZzMl9yZWFkZGlyIChzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CiAKIHN0YXRpYyBpbnQgamZmczJfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50LApAQCAtNDMsNyArMzMsNyBAQAogc3RhdGljIGludCBqZmZzMl9zeW1saW5rIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosY29uc3QgY2hhciAqKTsKIHN0YXRpYyBpbnQgamZmczJfbWtkaXIgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQpOwogc3RhdGljIGludCBqZmZzMl9ybWRpciAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKLXN0YXRpYyBpbnQgamZmczJfbWtub2QgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsbWtub2RfYXJnX3QpOworc3RhdGljIGludCBqZmZzMl9ta25vZCAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGludCxkZXZfdCk7CiBzdGF0aWMgaW50IGpmZnMyX3JlbmFtZSAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOwogCkBAIC01OCw4ICs0OCw4IEBACiAKIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnMyX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0KIHsKLQkuY3JlYXRlID0JTkFNRUlfQ09NUEFUKGpmZnMyX2NyZWF0ZSksCi0JLmxvb2t1cCA9CU5BTUVJX0NPTVBBVChqZmZzMl9sb29rdXApLAorCS5jcmVhdGUgPQlqZmZzMl9jcmVhdGUsCisJLmxvb2t1cCA9CWpmZnMyX2xvb2t1cCwKIAkubGluayA9CQlqZmZzMl9saW5rLAogCS51bmxpbmsgPQlqZmZzMl91bmxpbmssCiAJLnN5bWxpbmsgPQlqZmZzMl9zeW1saW5rLApAQCAtMjk2LDExICsyODYsMTEgQEAKIAlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOwogCWludCBuYW1lbGVuOwogCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKLQlpbnQgcmV0OworCWludCByZXQsIHRhcmdldGxlbiA9IHN0cmxlbih0YXJnZXQpOwogCiAJLyogRklYTUU6IElmIHlvdSBjYXJlLiBXZSdkIG5lZWQgdG8gdXNlIGZyYWdzIGZvciB0aGUgdGFyZ2V0CiAJICAgaWYgaXQgZ3Jvd3MgbXVjaCBtb3JlIHRoYW4gdGhpcyAqLwotCWlmIChzdHJsZW4odGFyZ2V0KSA+IDI1NCkKKwlpZiAodGFyZ2V0bGVuID4gMjU0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CkBAIC0zMTQsNyArMzA0LDcgQEAKIAkgKiBKdXN0IHRoZSBub2RlIHdpbGwgZG8gZm9yIG5vdywgdGhvdWdoIAogCSAqLwogCW5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47Ci0JcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZShjLCBzaXplb2YoKnJpKSArIHN0cmxlbih0YXJnZXQpLCAmcGh5c19vZnMsICZhbGxvY2xlbiwgQUxMT0NfTk9STUFMKTsKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpICsgdGFyZ2V0bGVuLCAmcGh5c19vZnMsICZhbGxvY2xlbiwgQUxMT0NfTk9STUFMKTsKIAogCWlmIChyZXQpIHsKIAkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOwpAQCAtMzMzLDE2ICszMjMsMTYgQEAKIAogCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKIAotCWlub2RlLT5pX3NpemUgPSBzdHJsZW4odGFyZ2V0KTsKKwlpbm9kZS0+aV9zaXplID0gdGFyZ2V0bGVuOwogCXJpLT5pc2l6ZSA9IHJpLT5kc2l6ZSA9IHJpLT5jc2l6ZSA9IGNwdV90b19qZTMyKGlub2RlLT5pX3NpemUpOwogCXJpLT50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YoKnJpKSArIGlub2RlLT5pX3NpemUpOwogCXJpLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CiAKIAlyaS0+Y29tcHIgPSBKRkZTMl9DT01QUl9OT05FOwotCXJpLT5kYXRhX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHRhcmdldCwgc3RybGVuKHRhcmdldCkpKTsKKwlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCB0YXJnZXQsIHRhcmdldGxlbikpOwogCXJpLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2YoKnJpKS04KSk7CiAJCi0JZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCByaSwgdGFyZ2V0LCBzdHJsZW4odGFyZ2V0KSwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisJZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCByaSwgdGFyZ2V0LCB0YXJnZXRsZW4sIHBoeXNfb2ZzLCBBTExPQ19OT1JNQUwpOwogCiAJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOwogCkBAIC0zNTMsNiArMzQzLDIwIEBACiAJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKIAkJcmV0dXJuIFBUUl9FUlIoZm4pOwogCX0KKworCS8qIFdlIHVzZSBmLT5kZW50cyBmaWVsZCB0byBzdG9yZSB0aGUgdGFyZ2V0IHBhdGguICovCisJZi0+ZGVudHMgPSBrbWFsbG9jKHRhcmdldGxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghZi0+ZGVudHMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgYWxsb2NhdGUgJWQgYnl0ZXMgb2YgbWVtb3J5XG4iLCB0YXJnZXRsZW4gKyAxKTsKKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbWNweShmLT5kZW50cywgdGFyZ2V0LCB0YXJnZXRsZW4gKyAxKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc3ltbGluazogc3ltbGluaydzIHRhcmdldCAnJXMnIGNhY2hlZFxuIiwgKGNoYXIgKilmLT5kZW50cykpOworCiAJLyogTm8gZGF0YSBoZXJlLiBPbmx5IGEgbWV0YWRhdGEgbm9kZSwgd2hpY2ggd2lsbCBiZSAKIAkgICBvYnNvbGV0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgd3JpdGUKIAkqLwpAQCAtNTY0LDcgKzU2OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBqZmZzMl9ta25vZCAoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgbWtub2RfYXJnX3QgcmRldikKK3N0YXRpYyBpbnQgamZmczJfbWtub2QgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCiB7CiAJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsICpkaXJfZjsKIAlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2VyYXNlLmMgYi9mcy9qZmZzMi9lcmFzZS5jCmluZGV4IDQxNDUxZTguLjZhNGMwYTMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2VyYXNlLmMKKysrIGIvZnMvamZmczIvZXJhc2UuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogZXJhc2UuYyx2IDEuNjYgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICogJElkOiBlcmFzZS5jLHYgMS43NiAyMDA1LzA1LzAzIDE1OjExOjQwIGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAKQEAgLTQ4LDYgKzQ4LDcgQEAKICNlbHNlIC8qIExpbnV4ICovCiAJc3RydWN0IGVyYXNlX2luZm8gKmluc3RyOwogCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2VyYXNlX2Jsb2NrKCk6IGVyYXNlIGJsb2NrICUjeCAocmFuZ2UgJSN4LSUjeClcbiIsIGplYi0+b2Zmc2V0LCBqZWItPm9mZnNldCwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSkpOwogCWluc3RyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVyYXNlX2luZm8pICsgc2l6ZW9mKHN0cnVjdCBlcmFzZV9wcml2X3N0cnVjdCksIEdGUF9LRVJORUwpOwogCWlmICghaW5zdHIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAia21hbGxvYyBmb3Igc3RydWN0IGVyYXNlX2luZm8gaW4gamZmczJfZXJhc2VfYmxvY2sgZmFpbGVkLiBSZWZpbGluZyBibG9jayBmb3IgbGF0ZXJcbiIpOwpAQCAtMjMzLDcgKzIzNCw3IEBACiAJCQljb250aW51ZTsKIAkJfSAKIAotCQlpZiAoKCgqcHJldiktPmZsYXNoX29mZnNldCAmIH4oYy0+c2VjdG9yX3NpemUgLTEpKSA9PSBqZWItPm9mZnNldCkgeworCQlpZiAoU0VDVE9SX0FERFIoKCpwcmV2KS0+Zmxhc2hfb2Zmc2V0KSA9PSBqZWItPm9mZnNldCkgewogCQkJLyogSXQncyBpbiB0aGUgYmxvY2sgd2UncmUgZXJhc2luZyAqLwogCQkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqdGhpczsKIApAQCAtMjc3LDExICsyNzgsOCBAQAogCQlwcmludGsoIlxuIik7CiAJfSk7CiAKLQlpZiAoaWMtPm5vZGVzID09ICh2b2lkICopaWMpIHsKLQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImlub2NhY2hlIGZvciBpbm8gIyV1IGlzIGFsbCBnb25lIG5vdy4gRnJlZWluZ1xuIiwgaWMtPmlubykpOworCWlmIChpYy0+bm9kZXMgPT0gKHZvaWQgKilpYyAmJiBpYy0+bmxpbmsgPT0gMCkKIAkJamZmczJfZGVsX2lub19jYWNoZShjLCBpYyk7Ci0JCWpmZnMyX2ZyZWVfaW5vZGVfY2FjaGUoaWMpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgamZmczJfZnJlZV9hbGxfbm9kZV9yZWZzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKQpAQCAtMzEwLDcgKzMwOCw3IEBACiAJaW50IHJldDsKIAl1aW50MzJfdCBiYWRfb2Zmc2V0OwogCi0JaWYgKCFqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwlpZiAoKCFqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpICYmIChjLT5jbGVhbm1hcmtlcl9zaXplID4gMCkpIHsKIAkJbWFya2VyX3JlZiA9IGpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZigpOwogCQlpZiAoIW1hcmtlcl9yZWYpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBhbGxvY2F0ZSByYXcgbm9kZSByZWYgZm9yIGNsZWFuIG1hcmtlclxuIik7CkBAIC0zMzUsNyArMzMzLDggQEAKIAogCQkJYmFkX29mZnNldCA9IG9mczsKIAotCQkJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCBvZnMsIHJlYWRsZW4sICZyZXRsZW4sIGVidWYpOworCQkJcmV0ID0gYy0+bXRkLT5yZWFkKGMtPm10ZCwgb2ZzLCByZWFkbGVuLCAmcmV0bGVuLCBlYnVmKTsKKwogCQkJaWYgKHJldCkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlYWQgb2YgbmV3bHktZXJhc2VkIGJsb2NrIGF0IDB4JTA4eCBmYWlsZWQ6ICVkLiBQdXR0aW5nIG9uIGJhZF9saXN0XG4iLCBvZnMsIHJldCk7CiAJCQkJZ290byBiYWQ7CkBAIC0zNTEsNyArMzUwLDcgQEAKIAkJCQkJYmFkX29mZnNldCArPSBpOwogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJOZXdseS1lcmFzZWQgYmxvY2sgY29udGFpbmVkIHdvcmQgMHglbHggYXQgb2Zmc2V0IDB4JTA4eFxuIiwgZGF0dW0sIGJhZF9vZmZzZXQpOwogCQkJCWJhZDogCi0JCQkJCWlmICghamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKQorCQkJCQlpZiAoKCFqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpICYmIChjLT5jbGVhbm1hcmtlcl9zaXplID4gMCkpCiAJCQkJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihtYXJrZXJfcmVmKTsKIAkJCQkJa2ZyZWUoZWJ1Zik7CiAJCQkJYmFkMjoKQEAgLTM4Nyw2ICszODYsMTMgQEAKIAkJamViLT51c2VkX3NpemUgPSAwOwogCQlqZWItPmRpcnR5X3NpemUgPSAwOwogCQlqZWItPndhc3RlZF9zaXplID0gMDsKKwl9IGVsc2UgaWYgKGMtPmNsZWFubWFya2VyX3NpemUgPT0gMCkgeworCQlqZWItPmZpcnN0X25vZGUgPSBqZWItPmxhc3Rfbm9kZSA9IE5VTEw7CisKKwkJamViLT5mcmVlX3NpemUgPSBjLT5zZWN0b3Jfc2l6ZTsKKwkJamViLT51c2VkX3NpemUgPSAwOworCQlqZWItPmRpcnR5X3NpemUgPSAwOworCQlqZWItPndhc3RlZF9zaXplID0gMDsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qga3ZlYyB2ZWNzWzFdOwogCQlzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlIG1hcmtlciA9IHsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZpbGUuYyBiL2ZzL2pmZnMyL2ZpbGUuYwppbmRleCA3NzFhNTU0Li5iZDllZDliIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9maWxlLmMKKysrIGIvZnMvamZmczIvZmlsZS5jCkBAIC03LDExICs3LDEwIEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGZpbGUuYyx2IDEuOTkgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICogJElkOiBmaWxlLmMsdiAxLjEwMiAyMDA1LzA3LzA2IDEyOjEzOjA5IGR3bXcyIEV4cCAkCiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC01MSw5ICs1MCw3IEBACiAJLmlvY3RsID0JamZmczJfaW9jdGwsCiAJLm1tYXAgPQkJZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCiAJLmZzeW5jID0JamZmczJfZnN5bmMsCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwyOSkKIAkuc2VuZGZpbGUgPQlnZW5lcmljX2ZpbGVfc2VuZGZpbGUKLSNlbmRpZgogfTsKIAogLyogamZmczJfZmlsZV9pbm9kZV9vcGVyYXRpb25zICovCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9mcy5jIGIvZnMvamZmczIvZnMuYwppbmRleCAzMGFiMjMzLi41Njg3YzNmIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9mcy5jCisrKyBiL2ZzL2pmZnMyL2ZzLmMKQEAgLTcsMTEgKzcsMTAgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogZnMuYyx2IDEuNTEgMjAwNC8xMS8yOCAxMjoxOTozNyBkZWRla2luZCBFeHAgJAorICogJElkOiBmcy5jLHYgMS41NiAyMDA1LzA3LzA2IDEyOjEzOjA5IGR3bXcyIEV4cCAkCiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTQ1MCwxMSArNDQ5LDE1IEBACiAKIAljID0gSkZGUzJfU0JfSU5GTyhzYik7CiAKLSNpZm5kZWYgQ09ORklHX0pGRlMyX0ZTX05BTkQKKyNpZm5kZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAJaWYgKGMtPm10ZC0+dHlwZSA9PSBNVERfTkFOREZMQVNIKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiamZmczI6IENhbm5vdCBvcGVyYXRlIG9uIE5BTkQgZmxhc2ggdW5sZXNzIGpmZnMyIE5BTkQgc3VwcG9ydCBpcyBjb21waWxlZCBpbi5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKGMtPm10ZC0+dHlwZSA9PSBNVERfREFUQUZMQVNIKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmczI6IENhbm5vdCBvcGVyYXRlIG9uIERhdGFGbGFzaCB1bmxlc3MgamZmczIgRGF0YUZsYXNoIHN1cHBvcnQgaXMgY29tcGlsZWQgaW4uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogI2VuZGlmCiAKIAljLT5mbGFzaF9zaXplID0gYy0+bXRkLT5zaXplOwpAQCAtNTIyLDkgKzUyNSw3IEBACiAJaWYgKCFzYi0+c19yb290KQogCQlnb3RvIG91dF9yb290X2k7CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gMHgyMDQwMwogCXNiLT5zX21heGJ5dGVzID0gMHhGRkZGRkZGRjsKLSNlbmRpZgogCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc2ItPnNfbWFnaWMgPSBKRkZTMl9TVVBFUl9NQUdJQzsKQEAgLTY2MSw2ICs2NjIsMTQgQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQorCQorCS8qIGFuZCBEYXRhZmxhc2ggKi8KKwlpZiAoamZmczJfZGF0YWZsYXNoKGMpKSB7CisJCXJldCA9IGpmZnMyX2RhdGFmbGFzaF9zZXR1cChjKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY3NCw0ICs2ODMsOSBAQAogCWlmIChqZmZzMl9ub3JfZWNjKGMpKSB7CiAJCWpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChjKTsKIAl9CisJCisJLyogYW5kIERhdGFGbGFzaCAqLworCWlmIChqZmZzMl9kYXRhZmxhc2goYykpIHsKKwkJamZmczJfZGF0YWZsYXNoX2NsZWFudXAoYyk7CisJfQogfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZ2MuYyBiL2ZzL2pmZnMyL2djLmMKaW5kZXggODdlYzc0Zi4uNzA4NmNkNiAxMDA2NDQKLS0tIGEvZnMvamZmczIvZ2MuYworKysgYi9mcy9qZmZzMi9nYy5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBnYy5jLHYgMS4xNDQgMjAwNC8xMi8yMSAxMToxODo1MCBkd213MiBFeHAgJAorICogJElkOiBnYy5jLHYgMS4xNDggMjAwNS8wNC8wOSAxMDo0NzowMCBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC01MCw2ICs1MCw3IEBACiAJICAgcHV0IHRoZSBjbGV2ZXIgd2Vhci1sZXZlbGxpbmcgYWxnb3JpdGhtcy4gRXZlbnR1YWxseS4gICovCiAJLyogV2UgcG9zc2libHkgd2FudCB0byBmYXZvdXIgdGhlIGRpcnRpZXIgYmxvY2tzIG1vcmUgd2hlbiB0aGUKIAkgICBudW1iZXIgb2YgZnJlZSBibG9ja3MgaXMgbG93LiAqLworYWdhaW46CiAJaWYgKCFsaXN0X2VtcHR5KCZjLT5iYWRfdXNlZF9saXN0KSAmJiBjLT5ucl9mcmVlX2Jsb2NrcyA+IGMtPnJlc3ZfYmxvY2tzX2djYmFkKSB7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gYmFkX3VzZWRfbGlzdCB0byBHQyBuZXh0XG4iKSk7CiAJCW5leHRsaXN0ID0gJmMtPmJhZF91c2VkX2xpc3Q7CkBAIC03OSw2ICs4MCwxMyBAQAogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIGVyYXNhYmxlX2xpc3QgdG8gR0MgbmV4dCAoY2xlYW5fbGlzdCBhbmQge3ZlcnlfLH1kaXJ0eV9saXN0IHdlcmUgZW1wdHkpXG4iKSk7CiAKIAkJbmV4dGxpc3QgPSAmYy0+ZXJhc2FibGVfbGlzdDsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZjLT5lcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdCkpIHsKKwkJLyogVGhlcmUgYXJlIGJsb2NrcyBhcmUgd2F0aW5nIGZvciB0aGUgd2J1ZiBzeW5jICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJTeW5jaGluZyB3YnVmIGluIG9yZGVyIHRvIHJldXNlIGVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0IGJsb2Nrc1xuIikpOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJamZmczJfZmx1c2hfd2J1Zl9wYWQoYyk7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJZ290byBhZ2FpbjsKIAl9IGVsc2UgewogCQkvKiBFZXAuIEFsbCB3ZXJlIGVtcHR5ICovCiAJCUQxKHByaW50ayhLRVJOX05PVElDRSAiamZmczI6IE5vIGNsZWFuLCBkaXJ0eSBfb3JfIGVyYXNhYmxlIGJsb2NrcyB0byBHQyBmcm9tISBXaGVyZSBhcmUgdGhleSBhbGw/XG4iKSk7CkBAIC02NjEsOSArNjY5LDEwIEBACiB7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKm5ld19mbjsKIAlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIHJpOworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmxhc3RfZnJhZzsKIAlqaW50MTZfdCBkZXY7CiAJY2hhciAqbWRhdGEgPSBOVUxMLCBtZGF0YWxlbiA9IDA7Ci0JdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mcywgaWxlbjsKIAlpbnQgcmV0OwogCiAJaWYgKFNfSVNCTEsoSkZGUzJfRl9JX01PREUoZikpIHx8CkBAIC02OTksNiArNzA4LDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAkKKwlsYXN0X2ZyYWcgPSBmcmFnX2xhc3QoJmYtPmZyYWd0cmVlKTsKKwlpZiAobGFzdF9mcmFnKQorCQkvKiBGZXRjaCB0aGUgaW5vZGUgbGVuZ3RoIGZyb20gdGhlIGZyYWd0cmVlIHJhdGhlciB0aGVuCisJCSAqIGZyb20gaV9zaXplIHNpbmNlIGlfc2l6ZSBtYXkgaGF2ZSBub3QgYmVlbiB1cGRhdGVkIHlldCAqLworCQlpbGVuID0gbGFzdF9mcmFnLT5vZnMgKyBsYXN0X2ZyYWctPnNpemU7CisJZWxzZQorCQlpbGVuID0gSkZGUzJfRl9JX1NJWkUoZik7CisJCiAJbWVtc2V0KCZyaSwgMCwgc2l6ZW9mKHJpKSk7CiAJcmkubWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKIAlyaS5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKQEAgLTcxMCw3ICs3MjcsNyBAQAogCXJpLm1vZGUgPSBjcHVfdG9famVtb2RlKEpGRlMyX0ZfSV9NT0RFKGYpKTsKIAlyaS51aWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfVUlEKGYpKTsKIAlyaS5naWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfR0lEKGYpKTsKLQlyaS5pc2l6ZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9TSVpFKGYpKTsKKwlyaS5pc2l6ZSA9IGNwdV90b19qZTMyKGlsZW4pOwogCXJpLmF0aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX0FUSU1FKGYpKTsKIAlyaS5jdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9DVElNRShmKSk7CiAJcmkubXRpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfTVRJTUUoZikpOwpAQCAtODE2LDggKzgzMyw3IEBACiAKIAkJCS8qIERvZXNuJ3QgbWF0dGVyIGlmIHRoZXJlJ3Mgb25lIGluIHRoZSBzYW1lIGVyYXNlIGJsb2NrLiBXZSdyZSBnb2luZyB0byAKIAkJCSAgIGRlbGV0ZSBpdCB0b28gYXQgdGhlIHNhbWUgdGltZS4gKi8KLQkJCWlmICgocmF3LT5mbGFzaF9vZmZzZXQgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSA9PQotCQkJICAgIChmZC0+cmF3LT5mbGFzaF9vZmZzZXQgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSkKKwkJCWlmIChTRUNUT1JfQUREUihyYXctPmZsYXNoX29mZnNldCkgPT0gU0VDVE9SX0FERFIoZmQtPnJhdy0+Zmxhc2hfb2Zmc2V0KSkKIAkJCQljb250aW51ZTsKIAogCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkNoZWNrIHBvdGVudGlhbCBkZWxldGlvbiBkaXJlbnQgYXQgJTA4eFxuIiwgcmVmX29mZnNldChyYXcpKSk7CkBAIC04OTEsNyArOTA3LDcgQEAKIAlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIHJpOwogCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWc7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKm5ld19mbjsKLQl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnM7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzLCBpbGVuOwogCWludCByZXQ7CiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiV3JpdGluZyByZXBsYWNlbWVudCBob2xlIG5vZGUgZm9yIGlubyAjJXUgZnJvbSBvZmZzZXQgMHgleCB0byAweCV4XG4iLApAQCAtOTUxLDEwICs5NjcsMTkgQEAKIAkJcmkuY3NpemUgPSBjcHVfdG9famUzMigwKTsKIAkJcmkuY29tcHIgPSBKRkZTMl9DT01QUl9aRVJPOwogCX0KKwkKKwlmcmFnID0gZnJhZ19sYXN0KCZmLT5mcmFndHJlZSk7CisJaWYgKGZyYWcpCisJCS8qIEZldGNoIHRoZSBpbm9kZSBsZW5ndGggZnJvbSB0aGUgZnJhZ3RyZWUgcmF0aGVyIHRoZW4KKwkJICogZnJvbSBpX3NpemUgc2luY2UgaV9zaXplIG1heSBoYXZlIG5vdCBiZWVuIHVwZGF0ZWQgeWV0ICovCisJCWlsZW4gPSBmcmFnLT5vZnMgKyBmcmFnLT5zaXplOworCWVsc2UKKwkJaWxlbiA9IEpGRlMyX0ZfSV9TSVpFKGYpOworCiAJcmkubW9kZSA9IGNwdV90b19qZW1vZGUoSkZGUzJfRl9JX01PREUoZikpOwogCXJpLnVpZCA9IGNwdV90b19qZTE2KEpGRlMyX0ZfSV9VSUQoZikpOwogCXJpLmdpZCA9IGNwdV90b19qZTE2KEpGRlMyX0ZfSV9HSUQoZikpOwotCXJpLmlzaXplID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX1NJWkUoZikpOworCXJpLmlzaXplID0gY3B1X3RvX2plMzIoaWxlbik7CiAJcmkuYXRpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQVRJTUUoZikpOwogCXJpLmN0aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX0NUSU1FKGYpKTsKIAlyaS5tdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9NVElNRShmKSk7CkBAIC0xMTYxLDcgKzExODYsNyBAQAogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kZWQgZG5vZGUgdG8gd3JpdGUgZnJvbSAoMHgleC0weCV4KSB0byAoMHgleC0weCV4KVxuIiwgCiAJCQkgIG9yaWdfc3RhcnQsIG9yaWdfZW5kLCBzdGFydCwgZW5kKSk7CiAKLQkJQlVHX09OKGVuZCA+IEpGRlMyX0ZfSV9TSVpFKGYpKTsKKwkJRDEoQlVHX09OKGVuZCA+IGZyYWdfbGFzdCgmZi0+ZnJhZ3RyZWUpLT5vZnMgKyBmcmFnX2xhc3QoJmYtPmZyYWd0cmVlKS0+c2l6ZSkpOwogCQlCVUdfT04oZW5kIDwgb3JpZ19lbmQpOwogCQlCVUdfT04oc3RhcnQgPiBvcmlnX3N0YXJ0KTsKIAl9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbGlzdC5jIGIvZnMvamZmczIvbm9kZWxpc3QuYwppbmRleCBjZDZhOGJkLi40OTkxYzM0IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9ub2RlbGlzdC5jCisrKyBiL2ZzL2pmZnMyL25vZGVsaXN0LmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IG5vZGVsaXN0LmMsdiAxLjkwIDIwMDQvMTIvMDggMTc6NTk6MjAgZHdtdzIgRXhwICQKKyAqICRJZDogbm9kZWxpc3QuYyx2IDEuOTggMjAwNS8wNy8xMCAxNToxNTozMiBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC01NSwzMCArNTUsNjMgQEAKIAl9KTsKIH0KIAotLyogUHV0IGEgbmV3IHRtcF9kbm9kZV9pbmZvIGludG8gdGhlIGxpc3QsIGtlZXBpbmcgdGhlIGxpc3QgaW4gCi0gICBvcmRlciBvZiBpbmNyZWFzaW5nIHZlcnNpb24KLSovCi1zdGF0aWMgdm9pZCBqZmZzMl9hZGRfdG5fdG9fbGlzdChzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKipsaXN0KQorLyogCisgKiBQdXQgYSBuZXcgdG1wX2Rub2RlX2luZm8gaW50byB0aGUgdGVtcG9yYXR5IFJCLXRyZWUsIGtlZXBpbmcgdGhlIGxpc3QgaW4gCisgKiBvcmRlciBvZiBpbmNyZWFzaW5nIHZlcnNpb24uCisgKi8KK3N0YXRpYyB2b2lkIGpmZnMyX2FkZF90bl90b190cmVlKHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG4sIHN0cnVjdCByYl9yb290ICpsaXN0KQogewotCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqKnByZXYgPSBsaXN0OwotCQotCXdoaWxlICgoKnByZXYpICYmICgqcHJldiktPnZlcnNpb24gPCB0bi0+dmVyc2lvbikgewotCQlwcmV2ID0gJigoKnByZXYpLT5uZXh0KTsKLQl9Ci0JdG4tPm5leHQgPSAoKnByZXYpOwotICAgICAgICAqcHJldiA9IHRuOworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZsaXN0LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICogcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRoaXM7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXRoaXMgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbywgcmIpOworCisJCS8qIFRoZXJlIG1heSBhY3R1YWxseSBiZSBhIGNvbGxpc2lvbiBoZXJlLCBidXQgaXQgZG9lc24ndAorCQkgICBhY3R1YWxseSBtYXR0ZXIuIEFzIGxvbmcgYXMgdGhlIHR3byBub2RlcyB3aXRoIHRoZSBzYW1lCisJCSAgIHZlcnNpb24gYXJlIHRvZ2V0aGVyLCBpdCdzIGFsbCBmaW5lLiAqLworCQlpZiAodG4tPnZlcnNpb24gPCB0aGlzLT52ZXJzaW9uKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworICAgICAgICB9CisKKwlyYl9saW5rX25vZGUoJnRuLT5yYiwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnRuLT5yYiwgbGlzdCk7CiB9CiAKLXN0YXRpYyB2b2lkIGpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm9fbGlzdChzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuKQorc3RhdGljIHZvaWQgamZmczJfZnJlZV90bXBfZG5vZGVfaW5mb19saXN0KHN0cnVjdCByYl9yb290ICpsaXN0KQogewotCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqbmV4dDsKKwlzdHJ1Y3QgcmJfbm9kZSAqdGhpczsKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuOwogCi0Jd2hpbGUgKHRuKSB7Ci0JCW5leHQgPSB0bjsKLQkJdG4gPSB0bi0+bmV4dDsKLQkJamZmczJfZnJlZV9mdWxsX2Rub2RlKG5leHQtPmZuKTsKLQkJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mbyhuZXh0KTsKKwl0aGlzID0gbGlzdC0+cmJfbm9kZTsKKworCS8qIE5vdyBhdCBib3R0b20gb2YgdHJlZSAqLworCXdoaWxlICh0aGlzKSB7CisJCWlmICh0aGlzLT5yYl9sZWZ0KQorCQkJdGhpcyA9IHRoaXMtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHRoaXMtPnJiX3JpZ2h0KQorCQkJdGhpcyA9IHRoaXMtPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCXRuID0gcmJfZW50cnkodGhpcywgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvLCByYik7CisJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUodG4tPmZuKTsKKwkJCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm8odG4pOworCisJCQl0aGlzID0gdGhpcy0+cmJfcGFyZW50OworCQkJaWYgKCF0aGlzKQorCQkJCWJyZWFrOworCisJCQlpZiAodGhpcy0+cmJfbGVmdCA9PSAmdG4tPnJiKQorCQkJCXRoaXMtPnJiX2xlZnQgPSBOVUxMOworCQkJZWxzZSBpZiAodGhpcy0+cmJfcmlnaHQgPT0gJnRuLT5yYikKKwkJCQl0aGlzLT5yYl9yaWdodCA9IE5VTEw7CisJCQllbHNlIEJVRygpOworCQl9CiAJfQorCWxpc3QtPnJiX25vZGUgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBqZmZzMl9mcmVlX2Z1bGxfZGlyZW50X2xpc3Qoc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZCkKQEAgLTEwOCwxMiArMTQxLDEzIEBACiAgICB3aXRoIHRoaXMgaW5vLCByZXR1cm5pbmcgdGhlIGZvcm1lciBpbiBvcmRlciBvZiB2ZXJzaW9uICovCiAKIGludCBqZmZzMl9nZXRfaW5vZGVfbm9kZXMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAotCQkJICBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKip0bnAsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKmZkcCwKKwkJCSAgc3RydWN0IHJiX3Jvb3QgKnRucCwgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqZmRwLAogCQkJICB1aW50MzJfdCAqaGlnaGVzdF92ZXJzaW9uLCB1aW50MzJfdCAqbGF0ZXN0X21jdGltZSwKIAkJCSAgdWludDMyX3QgKm1jdGltZV92ZXIpCiB7CiAJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmLCAqdmFsaWRfcmVmOwotCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG4sICpyZXRfdG4gPSBOVUxMOworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG47CisJc3RydWN0IHJiX3Jvb3QgcmV0X3RuID0gUkJfUk9PVDsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkLCAqcmV0X2ZkID0gTlVMTDsKIAl1bmlvbiBqZmZzMl9ub2RlX3VuaW9uIG5vZGU7CiAJc2l6ZV90IHJldGxlbjsKQEAgLTEyNyw3ICsxNjEsNyBAQAogCiAJdmFsaWRfcmVmID0gamZmczJfZmlyc3RfdmFsaWRfbm9kZShmLT5pbm9jYWNoZS0+bm9kZXMpOwogCi0JaWYgKCF2YWxpZF9yZWYpCisJaWYgKCF2YWxpZF9yZWYgJiYgKGYtPmlub2NhY2hlLT5pbm8gIT0gMSkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVlcC4gTm8gdmFsaWQgbm9kZXMgZm9yIGlubyAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pOwogCiAJd2hpbGUgKHZhbGlkX3JlZikgewpAQCAtMzg2LDcgKzQyMCw3IEBACiAJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiZG5vZGUgQCUwOHg6IHZlciAldSwgb2Zmc2V0ICUwNHgsIGRzaXplICUwNHhcbiIsCiAJCQkJICByZWZfb2Zmc2V0KHJlZiksIGplMzJfdG9fY3B1KG5vZGUuaS52ZXJzaW9uKSwKIAkJCQkgIGplMzJfdG9fY3B1KG5vZGUuaS5vZmZzZXQpLCBqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpKSk7Ci0JCQlqZmZzMl9hZGRfdG5fdG9fbGlzdCh0biwgJnJldF90bik7CisJCQlqZmZzMl9hZGRfdG5fdG9fdHJlZSh0biwgJnJldF90bik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtNDUwLDcgKzQ4NCw3IEBACiAJcmV0dXJuIDA7CiAKICBmcmVlX291dDoKLQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvX2xpc3QocmV0X3RuKTsKKwlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvX2xpc3QoJnJldF90bik7CiAJamZmczJfZnJlZV9mdWxsX2RpcmVudF9saXN0KHJldF9mZCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTQ4OSw5ICs1MjMsMTMgQEAKIHZvaWQgamZmczJfYWRkX2lub19jYWNoZSAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqbmV3KQogewogCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqKnByZXY7Ci0JRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2FkZF9pbm9fY2FjaGU6IEFkZCAlcCAoaW5vICMldSlcbiIsIG5ldywgbmV3LT5pbm8pKTsKKwogCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7Ci0JCisJaWYgKCFuZXctPmlubykKKwkJbmV3LT5pbm8gPSArK2MtPmhpZ2hlc3RfaW5vOworCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2FkZF9pbm9fY2FjaGU6IEFkZCAlcCAoaW5vICMldSlcbiIsIG5ldywgbmV3LT5pbm8pKTsKKwogCXByZXYgPSAmYy0+aW5vY2FjaGVfbGlzdFtuZXctPmlubyAlIElOT0NBQ0hFX0hBU0hTSVpFXTsKIAogCXdoaWxlICgoKnByZXYpICYmICgqcHJldiktPmlubyA8IG5ldy0+aW5vKSB7CkBAIC01MDYsNyArNTQ0LDcgQEAKIHZvaWQgamZmczJfZGVsX2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICpvbGQpCiB7CiAJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICoqcHJldjsKLQlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZGVsX2lub19jYWNoZTogRGVsICVwIChpbm8gIyV1KVxuIiwgb2xkLCBvbGQtPmlubykpOworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kZWxfaW5vX2NhY2hlOiBEZWwgJXAgKGlubyAjJXUpXG4iLCBvbGQsIG9sZC0+aW5vKSk7CiAJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKIAkKIAlwcmV2ID0gJmMtPmlub2NhY2hlX2xpc3Rbb2xkLT5pbm8gJSBJTk9DQUNIRV9IQVNIU0laRV07CkBAIC01MTgsNiArNTU2LDE0IEBACiAJCSpwcmV2ID0gb2xkLT5uZXh0OwogCX0KIAorCS8qIEZyZWUgaXQgbm93IHVubGVzcyBpdCdzIGluIFJFQURJTkcgb3IgQ0xFQVJJTkcgc3RhdGUsIHdoaWNoCisJICAgYXJlIHRoZSB0cmFuc2l0aW9ucyB1cG9uIHJlYWRfaW5vZGUoKSBhbmQgY2xlYXJfaW5vZGUoKS4gVGhlCisJICAgcmVzdCBvZiB0aGUgdGltZSB3ZSBrbm93IG5vYm9keSBlbHNlIGlzIGxvb2tpbmcgYXQgaXQsIGFuZCAKKwkgICBpZiBpdCdzIGhlbGQgYnkgcmVhZF9pbm9kZSgpIG9yIGNsZWFyX2lub2RlKCkgdGhleSdsbCBmcmVlIGl0CisJICAgZm9yIHRoZW1zZWx2ZXMuICovCisJaWYgKG9sZC0+c3RhdGUgIT0gSU5PX1NUQVRFX1JFQURJTkcgJiYgb2xkLT5zdGF0ZSAhPSBJTk9fU1RBVEVfQ0xFQVJJTkcpCisJCWpmZnMyX2ZyZWVfaW5vZGVfY2FjaGUob2xkKTsKKwogCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKIH0KIApAQCAtNTMwLDcgKzU3Niw2IEBACiAJCXRoaXMgPSBjLT5pbm9jYWNoZV9saXN0W2ldOwogCQl3aGlsZSAodGhpcykgewogCQkJbmV4dCA9IHRoaXMtPm5leHQ7Ci0JCQlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZnJlZV9pbm9fY2FjaGVzOiBGcmVlaW5nIGlubyAjJXUgYXQgJXBcbiIsIHRoaXMtPmlubywgdGhpcykpOwogCQkJamZmczJfZnJlZV9pbm9kZV9jYWNoZSh0aGlzKTsKIAkJCXRoaXMgPSBuZXh0OwogCQl9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbGlzdC5oIGIvZnMvamZmczIvbm9kZWxpc3QuaAppbmRleCBhNDg2NGQwLi5iMzRjMzk3IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9ub2RlbGlzdC5oCisrKyBiL2ZzL2pmZnMyL25vZGVsaXN0LmgKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IG5vZGVsaXN0LmgsdiAxLjEyNiAyMDA0LzExLzE5IDE1OjA2OjI5IGRlZGVraW5kIEV4cCAkCisgKiAkSWQ6IG5vZGVsaXN0LmgsdiAxLjEzMSAyMDA1LzA3LzA1IDIxOjAzOjA3IGR3bXcyIEV4cCAkCiAgKgogICovCiAKQEAgLTEzNSw2ICsxMzUsNyBAQAogI2RlZmluZSBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVAkzCS8qIENoZWNrZWQsIGNsZWFyZWQgYWdhaW4gKi8KICNkZWZpbmUgSU5PX1NUQVRFX0dDCQk0CS8qIEdDaW5nIGEgJ3ByaXN0aW5lJyBub2RlICovCiAjZGVmaW5lIElOT19TVEFURV9SRUFESU5HCTUJLyogSW4gcmVhZF9pbm9kZSgpICovCisjZGVmaW5lIElOT19TVEFURV9DTEVBUklORwk2CS8qIEluIGNsZWFyX2lub2RlKCkgKi8KIAogI2RlZmluZSBJTk9DQUNIRV9IQVNIU0laRSAxMjgKIApAQCAtMTYwLDcgKzE2MSw3IEBACiAqLwogc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvCiB7Ci0Jc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICpuZXh0OworCXN0cnVjdCByYl9ub2RlIHJiOwogCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKIAl1aW50MzJfdCB2ZXJzaW9uOwogfTsgICAgICAgCkBAIC0zNjIsNiArMzYzLDE4IEBACiAJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OwogCXJldHVybiByYl9lbnRyeShub2RlLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYik7CiB9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqZnJhZ19sYXN0KHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICpub2RlID0gcm9vdC0+cmJfbm9kZTsKKworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUobm9kZS0+cmJfcmlnaHQpCisJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKKwlyZXR1cm4gcmJfZW50cnkobm9kZSwgc3RydWN0IGpmZnMyX25vZGVfZnJhZywgcmIpOworfQorCiAjZGVmaW5lIHJiX3BhcmVudChyYikgKChyYiktPnJiX3BhcmVudCkKICNkZWZpbmUgZnJhZ19uZXh0KGZyYWcpIHJiX2VudHJ5KHJiX25leHQoJihmcmFnKS0+cmIpLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikKICNkZWZpbmUgZnJhZ19wcmV2KGZyYWcpIHJiX2VudHJ5KHJiX3ByZXYoJihmcmFnKS0+cmIpLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikKQEAgLTM3NCw3ICszODcsNyBAQAogRDIodm9pZCBqZmZzMl9wcmludF9mcmFnX2xpc3Qoc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYpKTsKIHZvaWQgamZmczJfYWRkX2ZkX3RvX2xpc3Qoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqbmV3LCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipsaXN0KTsKIGludCBqZmZzMl9nZXRfaW5vZGVfbm9kZXMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAotCQkJICBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKip0bnAsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKmZkcCwKKwkJCSAgc3RydWN0IHJiX3Jvb3QgKnRucCwgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqZmRwLAogCQkJICB1aW50MzJfdCAqaGlnaGVzdF92ZXJzaW9uLCB1aW50MzJfdCAqbGF0ZXN0X21jdGltZSwKIAkJCSAgdWludDMyX3QgKm1jdGltZV92ZXIpOwogdm9pZCBqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMsIGludCBzdGF0ZSk7CkBAIC00NjIsNyArNDc1LDcgQEAKIC8qIGVyYXNlLmMgKi8KIHZvaWQgamZmczJfZXJhc2VfcGVuZGluZ19ibG9ja3Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGludCBjb3VudCk7CiAKLSNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgogLyogd2J1Zi5jICovCiBpbnQgamZmczJfZmx1c2hfd2J1Zl9nYyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKTsKIGludCBqZmZzMl9mbHVzaF93YnVmX3BhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbWdtdC5jIGIvZnMvamZmczIvbm9kZW1nbXQuYwppbmRleCAyNjUxMTM1Li5jMWQ4YjVlIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9ub2RlbWdtdC5jCisrKyBiL2ZzL2pmZnMyL25vZGVtZ210LmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IG5vZGVtZ210LmMsdiAxLjExNSAyMDA0LzExLzIyIDExOjA3OjIxIGR3bXcyIEV4cCAkCisgKiAkSWQ6IG5vZGVtZ210LmMsdiAxLjEyMiAyMDA1LzA1LzA2IDA5OjMwOjI3IGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAKQEAgLTc1LDcgKzc1LDcgQEAKIAkJCWRpcnR5ID0gYy0+ZGlydHlfc2l6ZSArIGMtPmVyYXNpbmdfc2l6ZSAtIGMtPm5yX2VyYXNpbmdfYmxvY2tzICogYy0+c2VjdG9yX3NpemUgKyBjLT51bmNoZWNrZWRfc2l6ZTsKIAkJCWlmIChkaXJ0eSA8IGMtPm5vc3BjX2RpcnR5X3NpemUpIHsKIAkJCQlpZiAocHJpbyA9PSBBTExPQ19ERUxFVElPTiAmJiBjLT5ucl9mcmVlX2Jsb2NrcyArIGMtPm5yX2VyYXNpbmdfYmxvY2tzID49IGMtPnJlc3ZfYmxvY2tzX2RlbGV0aW9uKSB7Ci0JCQkJCXByaW50ayhLRVJOX05PVElDRSAiamZmczJfcmVzZXJ2ZV9zcGFjZSgpOiBMb3cgb24gZGlydHkgc3BhY2UgdG8gR0MsIGJ1dCBpdCdzIGEgZGVsZXRpb24uIEFsbG93aW5nLi4uXG4iKTsKKwkJCQkJRDEocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9yZXNlcnZlX3NwYWNlKCk6IExvdyBvbiBkaXJ0eSBzcGFjZSB0byBHQywgYnV0IGl0J3MgYSBkZWxldGlvbi4gQWxsb3dpbmcuLi5cbiIpKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJkaXJ0eSBzaXplIDB4JTA4eCArIHVuY2hlY2tlZF9zaXplIDB4JTA4eCA8IG5vc3BjX2RpcnR5X3NpemUgMHglMDh4LCByZXR1cm5pbmcgLUVOT1NQQ1xuIiwKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCWF2YWlsID0gYy0+ZnJlZV9zaXplICsgYy0+ZGlydHlfc2l6ZSArIGMtPmVyYXNpbmdfc2l6ZSArIGMtPnVuY2hlY2tlZF9zaXplOwogCQkJaWYgKCAoYXZhaWwgLyBjLT5zZWN0b3Jfc2l6ZSkgPD0gYmxvY2tzbmVlZGVkKSB7CiAJCQkJaWYgKHByaW8gPT0gQUxMT0NfREVMRVRJT04gJiYgYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA+PSBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbikgewotCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogTG93IG9uIHBvc3NpYmx5IGF2YWlsYWJsZSBzcGFjZSwgYnV0IGl0J3MgYSBkZWxldGlvbi4gQWxsb3dpbmcuLi5cbiIpOworCQkJCQlEMShwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogTG93IG9uIHBvc3NpYmx5IGF2YWlsYWJsZSBzcGFjZSwgYnV0IGl0J3MgYSBkZWxldGlvbi4gQWxsb3dpbmcuLi5cbiIpKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCkBAIC0zMDgsNyArMzA4LDEwIEBACiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfYWRkX3BoeXNpY2FsX25vZGVfcmVmKCk6IE5vZGUgYXQgMHgleCglZCksIHNpemUgMHgleFxuIiwgcmVmX29mZnNldChuZXcpLCByZWZfZmxhZ3MobmV3KSwgbGVuKSk7CiAjaWYgMQotCWlmIChqZWIgIT0gYy0+bmV4dGJsb2NrIHx8IChyZWZfb2Zmc2V0KG5ldykpICE9IGplYi0+b2Zmc2V0ICsgKGMtPnNlY3Rvcl9zaXplIC0gamViLT5mcmVlX3NpemUpKSB7CisJLyogd2UgY291bGQgZ2V0IHNvbWUgb2Jzb2xldGUgbm9kZXMgYWZ0ZXIgbmV4dGJsb2NrIHdhcyByZWZpbGVkCisJICAgaW4gd2J1Zi5jICovCisJaWYgKChjLT5uZXh0YmxvY2sgfHwgIXJlZl9vYnNvbGV0ZShuZXcpKQorCSAgICAmJihqZWIgIT0gYy0+bmV4dGJsb2NrIHx8IHJlZl9vZmZzZXQobmV3KSAhPSBqZWItPm9mZnNldCArIChjLT5zZWN0b3Jfc2l6ZSAtIGplYi0+ZnJlZV9zaXplKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJnaC4gbm9kZSBhZGRlZCBpbiB3cm9uZyBwbGFjZVxuIik7CiAJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKG5ldyk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzMyLDcgKzMzNSw3IEBACiAJCWMtPnVzZWRfc2l6ZSArPSBsZW47CiAJfQogCi0JaWYgKCFqZWItPmZyZWVfc2l6ZSAmJiAhamViLT5kaXJ0eV9zaXplKSB7CisJaWYgKCFqZWItPmZyZWVfc2l6ZSAmJiAhamViLT5kaXJ0eV9zaXplICYmICFJU0RJUlRZKGplYi0+d2FzdGVkX3NpemUpKSB7CiAJCS8qIElmIGl0IGxpdmVzIG9uIHRoZSBkaXJ0eV9saXN0LCBqZmZzMl9yZXNlcnZlX3NwYWNlIHdpbGwgcHV0IGl0IHRoZXJlICovCiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgZnVsbCBlcmFzZSBibG9jayBhdCAweCUwOHggdG8gY2xlYW5fbGlzdCAoZnJlZSAweCUwOHgsIGRpcnR5IDB4JTA4eCwgdXNlZCAweCUwOHhcbiIsCiAJCQkgIGplYi0+b2Zmc2V0LCBqZWItPmZyZWVfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPnVzZWRfc2l6ZSkpOwpAQCAtNDAwLDcgKzQwMyw3IEBACiAJamViID0gJmMtPmJsb2Nrc1tibG9ja25yXTsKIAogCWlmIChqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSAmJiAhamZmczJfaXNfcmVhZG9ubHkoYykgJiYKLQkgICAgIShjLT5mbGFncyAmIEpGRlMyX1NCX0ZMQUdfTU9VTlRJTkcpKSB7CisJICAgICEoYy0+ZmxhZ3MgJiAoSkZGUzJfU0JfRkxBR19TQ0FOTklORyB8IEpGRlMyX1NCX0ZMQUdfQlVJTERJTkcpKSkgewogCQkvKiBIbS4gVGhpcyBtYXkgY29uZnVzZSBzdGF0aWMgbG9jayBhbmFseXNpcy4gSWYgYW55IG9mIHRoZSBhYm92ZSAKIAkJICAgdGhyZWUgY29uZGl0aW9ucyBpcyBmYWxzZSwgd2UncmUgZ29pbmcgdG8gcmV0dXJuIGZyb20gdGhpcyAKIAkJICAgZnVuY3Rpb24gd2l0aG91dCBhY3R1YWxseSBvYmxpdGVyYXRpbmcgYW55IG5vZGVzIG9yIGZyZWVpbmcKQEAgLTQzNCw3ICs0MzcsNyBAQAogCiAJLy8gVGFrZSBjYXJlLCB0aGF0IHdhc3RlZCBzaXplIGlzIHRha2VuIGludG8gY29uY2VybgogCWlmICgoamViLT5kaXJ0eV9zaXplIHx8IElTRElSVFkoamViLT53YXN0ZWRfc2l6ZSArIHJlZl90b3RsZW4oYywgamViLCByZWYpKSkgJiYgamViICE9IGMtPm5leHRibG9jaykgewotCQlEMShwcmludGsoIkRpcnR5aW5nXG4iKSk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJEaXJ0eWluZ1xuIikpOwogCQlhZGRlZHNpemUgPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKIAkJamViLT5kaXJ0eV9zaXplICs9IHJlZl90b3RsZW4oYywgamViLCByZWYpOwogCQljLT5kaXJ0eV9zaXplICs9IHJlZl90b3RsZW4oYywgamViLCByZWYpOwpAQCAtNDU2LDcgKzQ1OSw3IEBACiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlEMShwcmludGsoIldhc3RpbmdcbiIpKTsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIldhc3RpbmdcbiIpKTsKIAkJYWRkZWRzaXplID0gMDsKIAkJamViLT53YXN0ZWRfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKIAkJYy0+d2FzdGVkX3NpemUgKz0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CQpAQCAtNDY3LDggKzQ3MCw4IEBACiAKIAlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOwogCi0JaWYgKGMtPmZsYWdzICYgSkZGUzJfU0JfRkxBR19NT1VOVElORykgewotCQkvKiBNb3VudCBpbiBwcm9ncmVzcy4gRG9uJ3QgbXVjayBhYm91dCB3aXRoIHRoZSBibG9jaworCWlmIChjLT5mbGFncyAmIEpGRlMyX1NCX0ZMQUdfU0NBTk5JTkcpIHsKKwkJLyogRmxhc2ggc2Nhbm5pbmcgaXMgaW4gcHJvZ3Jlc3MuIERvbid0IG11Y2sgYWJvdXQgd2l0aCB0aGUgYmxvY2sKIAkJICAgbGlzdHMgYmVjYXVzZSB0aGV5J3JlIG5vdCByZWFkeSB5ZXQsIGFuZCBkb24ndCBhY3R1YWxseQogCQkgICBvYmxpdGVyYXRlIG5vZGVzIHRoYXQgbG9vayBvYnNvbGV0ZS4gSWYgdGhleSB3ZXJlbid0IAogCQkgICBtYXJrZWQgb2Jzb2xldGUgb24gdGhlIGZsYXNoIGF0IHRoZSB0aW1lIHRoZXkgX2JlY2FtZV8KQEAgLTUyNyw3ICs1MzAsOCBAQAogCiAJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CiAKLQlpZiAoIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpIHx8IGpmZnMyX2lzX3JlYWRvbmx5KGMpKSB7CisJaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSB8fCBqZmZzMl9pc19yZWFkb25seShjKSB8fAorCQkoYy0+ZmxhZ3MgJiBKRkZTMl9TQl9GTEFHX0JVSUxESU5HKSkgewogCQkvKiBXZSBkaWRuJ3QgbG9jayB0aGUgZXJhc2VfZnJlZV9zZW0gKi8KIAkJcmV0dXJuOwogCX0KQEAgLTU5MCwxMSArNTk0LDggQEAKIAkJKnAgPSByZWYtPm5leHRfaW5faW5vOwogCQlyZWYtPm5leHRfaW5faW5vID0gTlVMTDsKIAotCQlpZiAoaWMtPm5vZGVzID09ICh2b2lkICopaWMpIHsKLQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJpbm9jYWNoZSBmb3IgaW5vICMldSBpcyBhbGwgZ29uZSBub3cuIEZyZWVpbmdcbiIsIGljLT5pbm8pKTsKKwkJaWYgKGljLT5ub2RlcyA9PSAodm9pZCAqKWljICYmIGljLT5ubGluayA9PSAwKQogCQkJamZmczJfZGVsX2lub19jYWNoZShjLCBpYyk7Ci0JCQlqZmZzMl9mcmVlX2lub2RlX2NhY2hlKGljKTsKLQkJfQogCiAJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL29zLWxpbnV4LmggYi9mcy9qZmZzMi9vcy1saW51eC5oCmluZGV4IDAzYjBhY2MuLmQ5MDBjODkgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL29zLWxpbnV4LmgKKysrIGIvZnMvamZmczIvb3MtbGludXguaApAQCAtNyw0MSArNywyNCBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBvcy1saW51eC5oLHYgMS41MSAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKiAkSWQ6IG9zLWxpbnV4LmgsdiAxLjU4IDIwMDUvMDcvMTIgMDI6MzQ6MzUgdHBveW5vciBFeHAgJAogICoKICAqLwogCiAjaWZuZGVmIF9fSkZGUzJfT1NfTElOVVhfSF9fCiAjZGVmaW5lIF9fSkZGUzJfT1NfTElOVVhfSF9fCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAvKiBKRkZTMiB1c2VzIExpbnV4IG1vZGUgYml0cyBuYXRpdmVseSAtLSBubyBuZWVkIGZvciBjb252ZXJzaW9uICovCiAjZGVmaW5lIG9zX3RvX2pmZnMyX21vZGUoeCkgKHgpCiAjZGVmaW5lIGpmZnMyX3RvX29zX21vZGUoeCkgKHgpCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNzMpCi0jZGVmaW5lIGtzdGF0ZnMgc3RhdGZzCi0jZW5kaWYKLQogc3RydWN0IGtzdGF0ZnM7CiBzdHJ1Y3Qga3ZlYzsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwyKQogI2RlZmluZSBKRkZTMl9JTk9ERV9JTkZPKGkpIChsaXN0X2VudHJ5KGksIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpKQogI2RlZmluZSBPRk5JX0VET05JXzJTRkZKKGYpICAoJihmKS0+dmZzX2lub2RlKQogI2RlZmluZSBKRkZTMl9TQl9JTkZPKHNiKSAoc2ItPnNfZnNfaW5mbykKICNkZWZpbmUgT0ZOSV9CU18yU0ZGSihjKSAgKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiljLT5vc19wcml2KQotI2VsaWYgZGVmaW5lZChKRkZTMl9PVVRfT0ZfS0VSTkVMKQotI2RlZmluZSBKRkZTMl9JTk9ERV9JTkZPKGkpICgoc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKikgJihpKS0+dSkKLSNkZWZpbmUgT0ZOSV9FRE9OSV8yU0ZGSihmKSAgKChzdHJ1Y3QgaW5vZGUgKikgKCAoKGNoYXIgKilmKSAtICgoY2hhciAqKSgmKChzdHJ1Y3QgaW5vZGUgKilOVUxMKS0+dSkpICkgKQotI2RlZmluZSBKRkZTMl9TQl9JTkZPKHNiKSAoKHN0cnVjdCBqZmZzMl9zYl9pbmZvICopICYoc2IpLT51KQotI2RlZmluZSBPRk5JX0JTXzJTRkZKKGMpICAoKHN0cnVjdCBzdXBlcl9ibG9jayAqKSAoICgoY2hhciAqKWMpIC0gKChjaGFyICopKCYoKHN0cnVjdCBzdXBlcl9ibG9jayAqKU5VTEwpLT51KSkgKSApCi0jZWxzZQotI2RlZmluZSBKRkZTMl9JTk9ERV9JTkZPKGkpICgmaS0+dS5qZmZzMl9pKQotI2RlZmluZSBPRk5JX0VET05JXzJTRkZKKGYpICAoKHN0cnVjdCBpbm9kZSAqKSAoICgoY2hhciAqKWYpIC0gKChjaGFyICopKCYoKHN0cnVjdCBpbm9kZSAqKU5VTEwpLT51KSkgKSApCi0jZGVmaW5lIEpGRlMyX1NCX0lORk8oc2IpICgmc2ItPnUuamZmczJfc2IpCi0jZGVmaW5lIE9GTklfQlNfMlNGRkooYykgICgoc3RydWN0IHN1cGVyX2Jsb2NrICopICggKChjaGFyICopYykgLSAoKGNoYXIgKikoJigoc3RydWN0IHN1cGVyX2Jsb2NrICopTlVMTCktPnUpKSApICkKLSNlbmRpZgogCiAKICNkZWZpbmUgSkZGUzJfRl9JX1NJWkUoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfc2l6ZSkKQEAgLTQ5LDI4ICszMiwxNCBAQAogI2RlZmluZSBKRkZTMl9GX0lfVUlEKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX3VpZCkKICNkZWZpbmUgSkZGUzJfRl9JX0dJRChmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9naWQpCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMSkKICNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUlOKGYpIChpbWlub3IoT0ZOSV9FRE9OSV8yU0ZGSihmKSkpCiAjZGVmaW5lIEpGRlMyX0ZfSV9SREVWX01BSihmKSAoaW1ham9yKE9GTklfRURPTklfMlNGRkooZikpKQotI2Vsc2UKLSNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUlOKGYpIChNSU5PUih0b19rZGV2X3QoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9yZGV2KSkpCi0jZGVmaW5lIEpGRlMyX0ZfSV9SREVWX01BSihmKSAoTUFKT1IodG9fa2Rldl90KE9GTklfRURPTklfMlNGRkooZiktPmlfcmRldikpKQotI2VuZGlmCiAKLS8qIFVyZ2guIFRoZSB0aGluZ3Mgd2UgZG8gdG8ga2VlcCB0aGUgMi40IGJ1aWxkIHdvcmtpbmcgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNDcpCiAjZGVmaW5lIElUSU1FKHNlYykgKChzdHJ1Y3QgdGltZXNwZWMpe3NlYywgMH0pCiAjZGVmaW5lIElfU0VDKHR2KSAoKHR2KS50dl9zZWMpCiAjZGVmaW5lIEpGRlMyX0ZfSV9DVElNRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9jdGltZS50dl9zZWMpCiAjZGVmaW5lIEpGRlMyX0ZfSV9NVElNRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9tdGltZS50dl9zZWMpCiAjZGVmaW5lIEpGRlMyX0ZfSV9BVElNRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9hdGltZS50dl9zZWMpCi0jZWxzZQotI2RlZmluZSBJVElNRSh4KSAoeCkKLSNkZWZpbmUgSV9TRUMoeCkgKHgpCi0jZGVmaW5lIEpGRlMyX0ZfSV9DVElNRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9jdGltZSkKLSNkZWZpbmUgSkZGUzJfRl9JX01USU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX210aW1lKQotI2RlZmluZSBKRkZTMl9GX0lfQVRJTUUoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfYXRpbWUpCi0jZW5kaWYKIAogI2RlZmluZSBzbGVlcF9vbl9zcGludW5sb2NrKHdxLCBzKQkJCQlcCiAJZG8gewkJCQkJCQlcCkBAIC04NCwyMyArNTMsMjEgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX2luaXRfaW5vZGVfaW5mbyhzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikKIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMikKIAlmLT5oaWdoZXN0X3ZlcnNpb24gPSAwOwogCWYtPmZyYWd0cmVlID0gUkJfUk9PVDsKIAlmLT5tZXRhZGF0YSA9IE5VTEw7CiAJZi0+ZGVudHMgPSBOVUxMOwogCWYtPmZsYWdzID0gMDsKIAlmLT51c2VyY29tcHIgPSAwOwotI2Vsc2UKLQltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7Ci0JaW5pdF9NVVRFWF9MT0NLRUQoJmYtPnNlbSk7Ci0jZW5kaWYKIH0KIAorCiAjZGVmaW5lIGpmZnMyX2lzX3JlYWRvbmx5KGMpIChPRk5JX0JTXzJTRkZKKGMpLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCi0jaWYgKCFkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OQU5EICYmICFkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OT1JfRUNDKQorI2lmbmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKKyNkZWZpbmUgU0VDVE9SX0FERFIoeCkgKCAoKHVuc2lnbmVkIGxvbmcpKHgpICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgKQogI2RlZmluZSBqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSAoMSkKKyNkZWZpbmUgamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSAoMCkKICNkZWZpbmUgamZmczJfY2xlYW5tYXJrZXJfb29iKGMpICgwKQogI2RlZmluZSBqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKGMsamViKSAoLUVJTykKIApAQCAtMTE2LDExICs4MywxNiBAQAogI2RlZmluZSBqZmZzMl93YnVmX3RpbWVvdXQgTlVMTAogI2RlZmluZSBqZmZzMl93YnVmX3Byb2Nlc3MgTlVMTAogI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpICgwKQorI2RlZmluZSBqZmZzMl9kYXRhZmxhc2goYykgKDApCiAjZGVmaW5lIGpmZnMyX25vcl9lY2NfZmxhc2hfc2V0dXAoYykgKDApCiAjZGVmaW5lIGpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChjKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgamZmczJfZGF0YWZsYXNoX3NldHVwKGMpICgwKQorI2RlZmluZSBqZmZzMl9kYXRhZmxhc2hfY2xlYW51cChjKSBkbyB7fSB3aGlsZSAoMCkKIAogI2Vsc2UgLyogTkFORCBhbmQvb3IgRUNDJ2QgTk9SIHN1cHBvcnQgcHJlc2VudCAqLwogCisjZGVmaW5lIGpmZnMyX2lzX3dyaXRlYnVmZmVyZWQoYykgKGMtPndidWYgIT0gTlVMTCkKKyNkZWZpbmUgU0VDVE9SX0FERFIoeCkgKCAoKHVuc2lnbmVkIGxvbmcpKHgpIC8gKHVuc2lnbmVkIGxvbmcpKGMtPnNlY3Rvcl9zaXplKSkgKiBjLT5zZWN0b3Jfc2l6ZSApCiAjZGVmaW5lIGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICgoYy0+bXRkLT50eXBlID09IE1URF9OT1JGTEFTSCAmJiAhKGMtPm10ZC0+ZmxhZ3MgJiBNVERfRUNDKSkgfHwgYy0+bXRkLT50eXBlID09IE1URF9SQU0pCiAjZGVmaW5lIGpmZnMyX2NsZWFubWFya2VyX29vYihjKSAoYy0+bXRkLT50eXBlID09IE1URF9OQU5ERkxBU0gpCiAKQEAgLTE0MiwxNiArMTE0LDE2IEBACiBpbnQgamZmczJfZmx1c2hfd2J1Zl9wYWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwogaW50IGpmZnMyX25hbmRfZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwogdm9pZCBqZmZzMl9uYW5kX2ZsYXNoX2NsZWFudXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwotI2lmZGVmIENPTkZJR19KRkZTMl9GU19OT1JfRUNDCisKICNkZWZpbmUgamZmczJfbm9yX2VjYyhjKSAoYy0+bXRkLT50eXBlID09IE1URF9OT1JGTEFTSCAmJiAoYy0+bXRkLT5mbGFncyAmIE1URF9FQ0MpKQogaW50IGpmZnMyX25vcl9lY2NfZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwogdm9pZCBqZmZzMl9ub3JfZWNjX2ZsYXNoX2NsZWFudXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwotI2Vsc2UKLSNkZWZpbmUgamZmczJfbm9yX2VjYyhjKSAoMCkKLSNkZWZpbmUgamZmczJfbm9yX2VjY19mbGFzaF9zZXR1cChjKSAoMCkKLSNkZWZpbmUgamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKGMpIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmIC8qIE5PUiBFQ0MgKi8KLSNlbmRpZiAvKiBOQU5EICovCisKKyNkZWZpbmUgamZmczJfZGF0YWZsYXNoKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX0RBVEFGTEFTSCkKK2ludCBqZmZzMl9kYXRhZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwordm9pZCBqZmZzMl9kYXRhZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisKKyNlbmRpZiAvKiBXUklURUJVRkZFUiAqLwogCiAvKiBlcmFzZS5jICovCiBzdGF0aWMgaW5saW5lIHZvaWQgamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvcmVhZC5jIGIvZnMvamZmczIvcmVhZC5jCmluZGV4IGViNDkzZGMuLmM3ZjkwNjggMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3JlYWQuYworKysgYi9mcy9qZmZzMi9yZWFkLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHJlYWQuYyx2IDEuMzggMjAwNC8xMS8xNiAyMDozNjoxMiBkd213MiBFeHAgJAorICogJElkOiByZWFkLmMsdiAxLjM5IDIwMDUvMDMvMDEgMTA6MzQ6MDMgZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KIApAQCAtMjE0LDMzICsyMTQsMyBAQAogCXJldHVybiAwOwogfQogCi0vKiBDb3JlIGZ1bmN0aW9uIHRvIHJlYWQgc3ltbGluayB0YXJnZXQuICovCi1jaGFyICpqZmZzMl9nZXRsaW5rKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikKLXsKLQljaGFyICpidWY7Ci0JaW50IHJldDsKLQotCWRvd24oJmYtPnNlbSk7Ci0KLQlpZiAoIWYtPm1ldGFkYXRhKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiTm8gbWV0YWRhdGEgZm9yIHN5bWxpbmsgaW5vZGUgIyV1XG4iLCBmLT5pbm9jYWNoZS0+aW5vKTsKLQkJdXAoJmYtPnNlbSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQlidWYgPSBrbWFsbG9jKGYtPm1ldGFkYXRhLT5zaXplKzEsIEdGUF9VU0VSKTsKLQlpZiAoIWJ1ZikgewotCQl1cCgmZi0+c2VtKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCWJ1ZltmLT5tZXRhZGF0YS0+c2l6ZV09MDsKLQotCXJldCA9IGpmZnMyX3JlYWRfZG5vZGUoYywgZiwgZi0+bWV0YWRhdGEsIGJ1ZiwgMCwgZi0+bWV0YWRhdGEtPnNpemUpOwotCi0JdXAoJmYtPnNlbSk7Ci0KLQlpZiAocmV0KSB7Ci0JCWtmcmVlKGJ1Zik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQotCXJldHVybiBidWY7Ci19CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9yZWFkaW5vZGUuYyBiL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCmluZGV4IGFjYTRhMGIuLjViMmE4MzUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCisrKyBiL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiByZWFkaW5vZGUuYyx2IDEuMTE3IDIwMDQvMTEvMjAgMTg6MDY6NTQgZHdtdzIgRXhwICQKKyAqICRJZDogcmVhZGlub2RlLmMsdiAxLjEyNSAyMDA1LzA3LzEwIDEzOjEzOjU1IGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAKQEAgLTE1MSw2ICsxNTEsOSBAQAogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGlubyAjJXUsIGYgJXAsIGZuICVwKVxuIiwgZi0+aW5vY2FjaGUtPmlubywgZiwgZm4pKTsKIAorCWlmICh1bmxpa2VseSghZm4tPnNpemUpKQorCQlyZXR1cm4gMDsKKwogCW5ld2ZyYWcgPSBqZmZzMl9hbGxvY19ub2RlX2ZyYWcoKTsKIAlpZiAodW5saWtlbHkoIW5ld2ZyYWcpKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE1OCwxMSArMTYxLDYgQEAKIAlEMihwcmludGsoS0VSTl9ERUJVRyAiYWRkaW5nIG5vZGUgJTA0eC0lMDR4IEAweCUwOHggb24gZmxhc2gsIG5ld2ZyYWcgKiVwXG4iLAogCQkgIGZuLT5vZnMsIGZuLT5vZnMrZm4tPnNpemUsIHJlZl9vZmZzZXQoZm4tPnJhdyksIG5ld2ZyYWcpKTsKIAkKLQlpZiAodW5saWtlbHkoIWZuLT5zaXplKSkgewotCQlqZmZzMl9mcmVlX25vZGVfZnJhZyhuZXdmcmFnKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJbmV3ZnJhZy0+b2ZzID0gZm4tPm9mczsKIAluZXdmcmFnLT5zaXplID0gZm4tPnNpemU7CiAJbmV3ZnJhZy0+bm9kZSA9IGZuOwpAQCAtNTAwLDcgKzQ5OCw5IEBACiAJCQkJCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAogCQkJCQlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpsYXRlc3Rfbm9kZSkKIHsKLQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuX2xpc3QsICp0bjsKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuID0gTlVMTDsKKwlzdHJ1Y3QgcmJfcm9vdCB0bl9saXN0OworCXN0cnVjdCByYl9ub2RlICpyYiwgKnJlcGxfcmI7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZF9saXN0OwogCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiA9IE5VTEw7CiAJdWludDMyX3QgY3JjOwpAQCAtNTIyLDkgKzUyMiwxMCBAQAogCX0KIAlmLT5kZW50cyA9IGZkX2xpc3Q7CiAKLQl3aGlsZSAodG5fbGlzdCkgewotCQl0biA9IHRuX2xpc3Q7CisJcmIgPSByYl9maXJzdCgmdG5fbGlzdCk7CiAKKwl3aGlsZSAocmIpIHsKKwkJdG4gPSByYl9lbnRyeShyYiwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvLCByYik7CiAJCWZuID0gdG4tPmZuOwogCiAJCWlmIChmLT5tZXRhZGF0YSkgewpAQCAtNTU2LDcgKzU1NywyOSBAQAogCQkJbWRhdGFfdmVyID0gdG4tPnZlcnNpb247CiAJCX0KIAluZXh0X3RuOgotCQl0bl9saXN0ID0gdG4tPm5leHQ7CisJCUJVR19PTihyYi0+cmJfbGVmdCk7CisJCWlmIChyYi0+cmJfcGFyZW50ICYmIHJiLT5yYl9wYXJlbnQtPnJiX2xlZnQgPT0gcmIpIHsKKwkJCS8qIFdlIHdlcmUgdGhlbiBsZWZ0LWhhbmQgY2hpbGQgb2Ygb3VyIHBhcmVudC4gV2UgbmVlZAorCQkJICAgdG8gbW92ZSBvdXIgb3duIHJpZ2h0LWhhbmQgY2hpbGQgaW50byBvdXIgcGxhY2UuICovCisJCQlyZXBsX3JiID0gcmItPnJiX3JpZ2h0OworCQkJaWYgKHJlcGxfcmIpCisJCQkJcmVwbF9yYi0+cmJfcGFyZW50ID0gcmItPnJiX3BhcmVudDsKKwkJfSBlbHNlCisJCQlyZXBsX3JiID0gTlVMTDsKKworCQlyYiA9IHJiX25leHQocmIpOworCisJCS8qIFJlbW92ZSB0aGUgc3BlbnQgdG4gZnJvbSB0aGUgdHJlZTsgZG9uJ3QgYm90aGVyIHJlYmFsYW5jaW5nCisJCSAgIGJ1dCBwdXQgb3VyIHJpZ2h0LWhhbmQgY2hpbGQgaW4gb3VyIG93biBwbGFjZS4gKi8KKwkJaWYgKHRuLT5yYi5yYl9wYXJlbnQpIHsKKwkJCWlmICh0bi0+cmIucmJfcGFyZW50LT5yYl9sZWZ0ID09ICZ0bi0+cmIpCisJCQkJdG4tPnJiLnJiX3BhcmVudC0+cmJfbGVmdCA9IHJlcGxfcmI7CisJCQllbHNlIGlmICh0bi0+cmIucmJfcGFyZW50LT5yYl9yaWdodCA9PSAmdG4tPnJiKQorCQkJCXRuLT5yYi5yYl9wYXJlbnQtPnJiX3JpZ2h0ID0gcmVwbF9yYjsKKwkJCWVsc2UgQlVHKCk7CisJCX0gZWxzZSBpZiAodG4tPnJiLnJiX3JpZ2h0KQorCQkJdG4tPnJiLnJiX3JpZ2h0LT5yYl9wYXJlbnQgPSBOVUxMOworCiAJCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm8odG4pOwogCX0KIAlEMShqZmZzMl9zYW5pdHljaGVja19mcmFndHJlZShmKSk7CkBAIC02MjMsNiArNjQ2LDQwIEBACiAJCSAgIGNhc2UuICovCiAJCWlmICghamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmlzaXplKSkKIAkJCWxhdGVzdF9ub2RlLT5pc2l6ZSA9IGxhdGVzdF9ub2RlLT5kc2l6ZTsKKworCQlpZiAoZi0+aW5vY2FjaGUtPnN0YXRlICE9IElOT19TVEFURV9DSEVDS0lORykgeworCQkJLyogU3ltbGluaydzIGlub2RlIGRhdGEgaXMgdGhlIHRhcmdldCBwYXRoLiBSZWFkIGl0IGFuZAorCQkJICoga2VlcCBpbiBSQU0gdG8gZmFjaWxpdGF0ZSBxdWljayBmb2xsb3cgc3ltbGluayBvcGVyYXRpb24uCisJCQkgKiBXZSB1c2UgZi0+ZGVudHMgZmllbGQgdG8gc3RvcmUgdGhlIHRhcmdldCBwYXRoLCB3aGljaAorCQkJICogaXMgc29tZXdoYXQgdWdseS4gKi8KKwkJCWYtPmRlbnRzID0ga21hbGxvYyhqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+Y3NpemUpICsgMSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWYtPmRlbnRzKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgYWxsb2NhdGUgJWQgYnl0ZXMgb2YgbWVtb3J5ICIKKwkJCQkJCSJmb3IgdGhlIHN5bWxpbmsgdGFyZ2V0IHBhdGggY2FjaGVcbiIsCisJCQkJCQlqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+Y3NpemUpKTsKKwkJCQl1cCgmZi0+c2VtKTsKKwkJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCQorCQkJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCByZWZfb2Zmc2V0KGZuLT5yYXcpICsgc2l6ZW9mKCpsYXRlc3Rfbm9kZSksCisJCQkJCQlqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+Y3NpemUpLCAmcmV0bGVuLCAoY2hhciAqKWYtPmRlbnRzKTsKKwkJCQorCQkJaWYgKHJldCAgfHwgcmV0bGVuICE9IGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSkpIHsKKwkJCQlpZiAocmV0bGVuICE9IGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSkpCisJCQkJCXJldCA9IC1FSU87CisJCQkJa2ZyZWUoZi0+ZGVudHMpOworCQkJCWYtPmRlbnRzID0gTlVMTDsKKwkJCQl1cCgmZi0+c2VtKTsKKwkJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKKwkJCQlyZXR1cm4gLXJldDsKKwkJCX0KKworCQkJKChjaGFyICopZi0+ZGVudHMpW2plMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSldID0gJ1wwJzsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19yZWFkX2lub2RlKCk6IHN5bWxpbmsncyB0YXJnZXQgJyVzJyBjYWNoZWRcbiIsCisJCQkJCQkoY2hhciAqKWYtPmRlbnRzKSk7CisJCX0KKwkJCiAJCS8qIGZhbGwgdGhyb3VnaC4uLiAqLwogCiAJY2FzZSBTX0lGQkxLOgpAQCAtNjcyLDYgKzcyOSw5IEBACiAJZG93bigmZi0+c2VtKTsKIAlkZWxldGVkID0gZi0+aW5vY2FjaGUgJiYgIWYtPmlub2NhY2hlLT5ubGluazsKIAorCWlmIChmLT5pbm9jYWNoZSAmJiBmLT5pbm9jYWNoZS0+c3RhdGUgIT0gSU5PX1NUQVRFX0NIRUNLSU5HKQorCQlqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoYywgZi0+aW5vY2FjaGUsIElOT19TVEFURV9DTEVBUklORyk7CisKIAlpZiAoZi0+bWV0YWRhdGEpIHsKIAkJaWYgKGRlbGV0ZWQpCiAJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZi0+bWV0YWRhdGEtPnJhdyk7CkBAIC02ODAsMTYgKzc0MCwyNyBAQAogCiAJamZmczJfa2lsbF9mcmFndHJlZSgmZi0+ZnJhZ3RyZWUsIGRlbGV0ZWQ/YzpOVUxMKTsKIAotCWZkcyA9IGYtPmRlbnRzOworCS8qIEZvciBzeW1saW5rIGlub2RlcyB3ZSB1cyBmLT5kZW50cyB0byBzdG9yZSB0aGUgdGFyZ2V0IHBhdGggbmFtZSAqLworCWlmIChTX0lTTE5LKE9GTklfRURPTklfMlNGRkooZiktPmlfbW9kZSkpIHsKKwkJaWYgKGYtPmRlbnRzKSB7CisJCQlrZnJlZShmLT5kZW50cyk7CisJCQlmLT5kZW50cyA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlmZHMgPSBmLT5kZW50czsKIAotCXdoaWxlKGZkcykgewotCQlmZCA9IGZkczsKLQkJZmRzID0gZmQtPm5leHQ7Ci0JCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCQl3aGlsZShmZHMpIHsKKwkJCWZkID0gZmRzOworCQkJZmRzID0gZmQtPm5leHQ7CisJCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKKwkJfQogCX0KIAotCWlmIChmLT5pbm9jYWNoZSAmJiBmLT5pbm9jYWNoZS0+c3RhdGUgIT0gSU5PX1NUQVRFX0NIRUNLSU5HKQorCWlmIChmLT5pbm9jYWNoZSAmJiBmLT5pbm9jYWNoZS0+c3RhdGUgIT0gSU5PX1NUQVRFX0NIRUNLSU5HKSB7CiAJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBmLT5pbm9jYWNoZSwgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQpOworCQlpZiAoZi0+aW5vY2FjaGUtPm5vZGVzID09ICh2b2lkICopZi0+aW5vY2FjaGUpCisJCQlqZmZzMl9kZWxfaW5vX2NhY2hlKGMsIGYtPmlub2NhY2hlKTsKKwl9CiAKIAl1cCgmZi0+c2VtKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3NjYW4uYyBiL2ZzL2pmZnMyL3NjYW4uYwppbmRleCBkZWQ1MzU4Li5iNjMxNjBmIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9zY2FuLmMKKysrIGIvZnMvamZmczIvc2Nhbi5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBzY2FuLmMsdiAxLjExNSAyMDA0LzExLzE3IDEyOjU5OjA4IGRlZGVraW5kIEV4cCAkCisgKiAkSWQ6IHNjYW4uYyx2IDEuMTE5IDIwMDUvMDIvMTcgMTc6NTE6MTMgZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgIm5vZGVsaXN0LmgiCiAKLSNkZWZpbmUgRU1QVFlfU0NBTl9TSVpFIDEwMjQKKyNkZWZpbmUgREVGQVVMVF9FTVBUWV9TQ0FOX1NJWkUgMTAyNAogCiAjZGVmaW5lIERJUlRZX1NQQUNFKHgpIGRvIHsgdHlwZW9mKHgpIF94ID0gKHgpOyBcCiAJCWMtPmZyZWVfc2l6ZSAtPSBfeDsgYy0+ZGlydHlfc2l6ZSArPSBfeDsgXApAQCAtNjgsMTMgKzY4LDIxIEBACiBzdGF0aWMgaW5saW5lIGludCBtaW5fZnJlZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKIHsKIAl1aW50MzJfdCBtaW4gPSAyICogc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpOwotI2lmIGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05BTkQgfHwgZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQworI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgogCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgJiYgbWluIDwgYy0+d2J1Zl9wYWdlc2l6ZSkKIAkJcmV0dXJuIGMtPndidWZfcGFnZXNpemU7CiAjZW5kaWYKIAlyZXR1cm4gbWluOwogCiB9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgRU1QVFlfU0NBTl9TSVpFKHVpbnQzMl90IHNlY3Rvcl9zaXplKSB7CisJaWYgKHNlY3Rvcl9zaXplIDwgREVGQVVMVF9FTVBUWV9TQ0FOX1NJWkUpCisJCXJldHVybiBzZWN0b3Jfc2l6ZTsKKwllbHNlCisJCXJldHVybiBERUZBVUxUX0VNUFRZX1NDQU5fU0laRTsKK30KKwogaW50IGpmZnMyX3NjYW5fbWVkaXVtKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQogewogCWludCBpLCByZXQ7CkBAIC0yMjAsNyArMjI4LDcgQEAKIAkJYy0+ZGlydHlfc2l6ZSAtPSBjLT5uZXh0YmxvY2stPmRpcnR5X3NpemU7CiAJCWMtPm5leHRibG9jay0+ZGlydHlfc2l6ZSA9IDA7CiAJfQotI2lmIGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05BTkQgfHwgZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQworI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgogCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgJiYgYy0+bmV4dGJsb2NrICYmIChjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSAmIChjLT53YnVmX3BhZ2VzaXplLTEpKSkgewogCQkvKiBJZiB3ZSdyZSBnb2luZyB0byBzdGFydCB3cml0aW5nIGludG8gYSBibG9jayB3aGljaCBhbHJlYWR5IAogCQkgICBjb250YWlucyBkYXRhLCBhbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSBpc24ndCBwYWdlLWFsaWduZWQsCkBAIC0yODYsNyArMjk0LDcgQEAKIAl1aW50MzJfdCBoZHJfY3JjLCBidWZfb2ZzLCBidWZfbGVuOwogCWludCBlcnI7CiAJaW50IG5vaXNlID0gMDsKLSNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgogCWludCBjbGVhbm1hcmtlcmZvdW5kID0gMDsKICNlbmRpZgogCkBAIC0yOTUsNyArMzAzLDcgQEAKIAogCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zY2FuX2VyYXNlYmxvY2soKTogU2Nhbm5pbmcgYmxvY2sgYXQgMHgleFxuIiwgb2ZzKSk7CiAKLSNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgogCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKIAkJaW50IHJldCA9IGpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoYywgamViKTsKIAkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIgcmV0dXJuZWQgJWRcbiIscmV0KSk7CkBAIC0zMTYsNyArMzI0LDcgQEAKIAlpZiAoIWJ1Zl9zaXplKSB7CiAJCWJ1Zl9sZW4gPSBjLT5zZWN0b3Jfc2l6ZTsKIAl9IGVsc2UgewotCQlidWZfbGVuID0gRU1QVFlfU0NBTl9TSVpFOworCQlidWZfbGVuID0gRU1QVFlfU0NBTl9TSVpFKGMtPnNlY3Rvcl9zaXplKTsKIAkJZXJyID0gamZmczJfZmlsbF9zY2FuX2J1ZihjLCBidWYsIGJ1Zl9vZnMsIGJ1Zl9sZW4pOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKQEAgLTMyNiwxMSArMzM0LDExIEBACiAJb2ZzID0gMDsKIAogCS8qIFNjYW4gb25seSA0S2lCIG9mIDB4RkYgYmVmb3JlIGRlY2xhcmluZyBpdCdzIGVtcHR5ICovCi0Jd2hpbGUob2ZzIDwgRU1QVFlfU0NBTl9TSVpFICYmICoodWludDMyX3QgKikoJmJ1ZltvZnNdKSA9PSAweEZGRkZGRkZGKQorCXdoaWxlKG9mcyA8IEVNUFRZX1NDQU5fU0laRShjLT5zZWN0b3Jfc2l6ZSkgJiYgKih1aW50MzJfdCAqKSgmYnVmW29mc10pID09IDB4RkZGRkZGRkYpCiAJCW9mcyArPSA0OwogCi0JaWYgKG9mcyA9PSBFTVBUWV9TQ0FOX1NJWkUpIHsKLSNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCWlmIChvZnMgPT0gRU1QVFlfU0NBTl9TSVpFKGMtPnNlY3Rvcl9zaXplKSkgeworI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgogCQlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKSB7CiAJCQkvKiBzY2FuIG9vYiwgdGFrZSBjYXJlIG9mIGNsZWFubWFya2VyICovCiAJCQlpbnQgcmV0ID0gamZmczJfY2hlY2tfb29iX2VtcHR5KGMsIGplYiwgY2xlYW5tYXJrZXJmb3VuZCk7CkBAIC0zNDMsNyArMzUxLDEwIEBACiAJCX0KICNlbmRpZgogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQmxvY2sgYXQgMHglMDh4IGlzIGVtcHR5IChlcmFzZWQpXG4iLCBqZWItPm9mZnNldCkpOwotCQlyZXR1cm4gQkxLX1NUQVRFX0FMTEZGOwkvKiBPSyB0byBlcmFzZSBpZiBhbGwgYmxvY2tzIGFyZSBsaWtlIHRoaXMgKi8KKwkJaWYgKGMtPmNsZWFubWFya2VyX3NpemUgPT0gMCkKKwkJCXJldHVybiBCTEtfU1RBVEVfQ0xFQU5NQVJLRVI7CS8qIGRvbid0IGJvdGhlciB3aXRoIHJlLWVyYXNlICovCisJCWVsc2UKKwkJCXJldHVybiBCTEtfU1RBVEVfQUxMRkY7CS8qIE9LIHRvIGVyYXNlIGlmIGFsbCBibG9ja3MgYXJlIGxpa2UgdGhpcyAqLwogCX0KIAlpZiAob2ZzKSB7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJGcmVlIHNwYWNlIGF0ICUwOHggZW5kcyBhdCAlMDh4XG4iLCBqZWItPm9mZnNldCwKQEAgLTQyMiw4ICs0MzMsOCBAQAogCQkJLyogSWYgd2UncmUgb25seSBjaGVja2luZyB0aGUgYmVnaW5uaW5nIG9mIGEgYmxvY2sgd2l0aCBhIGNsZWFubWFya2VyLAogCQkJICAgYmFpbCBub3cgKi8KIAkJCWlmIChidWZfb2ZzID09IGplYi0+b2Zmc2V0ICYmIGplYi0+dXNlZF9zaXplID09IFBBRChjLT5jbGVhbm1hcmtlcl9zaXplKSAmJiAKLQkJCSAgICBjLT5jbGVhbm1hcmtlcl9zaXplICYmICFqZWItPmRpcnR5X3NpemUgJiYgIWplYi0+Zmlyc3Rfbm9kZS0+bmV4dF9pbl9pbm8pIHsKLQkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiJWQgYnl0ZXMgYXQgc3RhcnQgb2YgYmxvY2sgc2VlbXMgY2xlYW4uLi4gYXNzdW1pbmcgYWxsIGNsZWFuXG4iLCBFTVBUWV9TQ0FOX1NJWkUpKTsKKwkJCSAgICBjLT5jbGVhbm1hcmtlcl9zaXplICYmICFqZWItPmRpcnR5X3NpemUgJiYgIWplYi0+Zmlyc3Rfbm9kZS0+bmV4dF9waHlzKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIiVkIGJ5dGVzIGF0IHN0YXJ0IG9mIGJsb2NrIHNlZW1zIGNsZWFuLi4uIGFzc3VtaW5nIGFsbCBjbGVhblxuIiwgRU1QVFlfU0NBTl9TSVpFKGMtPnNlY3Rvcl9zaXplKSkpOwogCQkJCXJldHVybiBCTEtfU1RBVEVfQ0xFQU5NQVJLRVI7CiAJCQl9CiAKQEAgLTYxOCw3ICs2MjksNyBAQAogCX0KIAogCWlmICgoamViLT51c2VkX3NpemUgKyBqZWItPnVuY2hlY2tlZF9zaXplKSA9PSBQQUQoYy0+Y2xlYW5tYXJrZXJfc2l6ZSkgJiYgIWplYi0+ZGlydHlfc2l6ZSAKLQkJJiYgKCFqZWItPmZpcnN0X25vZGUgfHwgIWplYi0+Zmlyc3Rfbm9kZS0+bmV4dF9pbl9pbm8pICkKKwkJJiYgKCFqZWItPmZpcnN0X25vZGUgfHwgIWplYi0+Zmlyc3Rfbm9kZS0+bmV4dF9waHlzKSApCiAJCXJldHVybiBCTEtfU1RBVEVfQ0xFQU5NQVJLRVI7CiAJCQogCS8qIG1vdmUgYmxvY2tzIHdpdGggbWF4IDQgYnl0ZSBkaXJ0eSBzcGFjZSB0byBjbGVhbmxpc3QgKi8JCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zdXBlci5jIGIvZnMvamZmczIvc3VwZXIuYwppbmRleCA2YjJhNDQxLi5hYWY5NDc1YyAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBzdXBlci5jLHYgMS4xMDQgMjAwNC8xMS8yMyAxNTozNzozMSBnbGVpeG5lciBFeHAgJAorICogJElkOiBzdXBlci5jLHYgMS4xMDcgMjAwNS8wNy8xMiAxNjozNzowOCBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC0xNDAsNiArMTQwLDE1IEBACiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dldF9zYl9tdGQoKTogTmV3IHN1cGVyYmxvY2sgZm9yIGRldmljZSAlZCAoXCIlc1wiKVxuIiwKIAkJICBtdGQtPmluZGV4LCBtdGQtPm5hbWUpKTsKIAorCS8qIEluaXRpYWxpemUgSkZGUzIgc3VwZXJibG9jayBsb2NrcywgdGhlIGZ1cnRoZXIgaW5pdGlhbGl6YXRpb24gd2lsbCBiZQorCSAqIGRvbmUgbGF0ZXIgKi8KKwlpbml0X01VVEVYKCZjLT5hbGxvY19zZW0pOworCWluaXRfTVVURVgoJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT5lcmFzZV93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT5pbm9jYWNoZV93cSk7CisJc3Bpbl9sb2NrX2luaXQoJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmMtPmlub2NhY2hlX2xvY2spOworCiAJc2ItPnNfb3AgPSAmamZmczJfc3VwZXJfb3BlcmF0aW9uczsKIAlzYi0+c19mbGFncyA9IGZsYWdzIHwgTVNfTk9BVElNRTsKIApAQCAtMjcwLDggKzI3OSw2IEBACiAKIAlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczI6IGpmZnMyX3B1dF9zdXBlcigpXG4iKSk7CiAKLQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCi0JCWpmZnMyX3N0b3BfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChjKTsKIAlkb3duKCZjLT5hbGxvY19zZW0pOwogCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOwogCXVwKCZjLT5hbGxvY19zZW0pOwpAQCAtMjkyLDYgKzI5OSw4IEBACiBzdGF0aWMgdm9pZCBqZmZzMl9raWxsX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCWpmZnMyX3N0b3BfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChjKTsKIAlnZW5lcmljX3NodXRkb3duX3N1cGVyKHNiKTsKIAlwdXRfbXRkX2RldmljZShjLT5tdGQpOwogCWtmcmVlKGMpOwpAQCAtMzA5LDcgKzMxOCw3IEBACiAJaW50IHJldDsKIAogCXByaW50ayhLRVJOX0lORk8gIkpGRlMyIHZlcnNpb24gMi4yLiIKLSNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgogCSAgICAgICAiIChOQU5EKSIKICNlbmRpZgogCSAgICAgICAiIChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLlxuIik7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zeW1saW5rLmMgYi9mcy9qZmZzMi9zeW1saW5rLmMKaW5kZXggN2IxODIwZC4uNjVhYjZiMCAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3ltbGluay5jCisrKyBiL2ZzL2pmZnMyL3N5bWxpbmsuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogc3ltbGluay5jLHYgMS4xNCAyMDA0LzExLzE2IDIwOjM2OjEyIGR3bXcyIEV4cCAkCisgKiAkSWQ6IHN5bWxpbmsuYyx2IDEuMTYgMjAwNS8wMy8wMSAxMDo1MDo0OCBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC0xOSwyNyArMTksNDUgQEAKICNpbmNsdWRlICJub2RlbGlzdC5oIgogCiBzdGF0aWMgaW50IGpmZnMyX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwotc3RhdGljIHZvaWQgamZmczJfcHV0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CiAKIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnMyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9CiB7CQogCS5yZWFkbGluayA9CWdlbmVyaWNfcmVhZGxpbmssCiAJLmZvbGxvd19saW5rID0JamZmczJfZm9sbG93X2xpbmssCi0JLnB1dF9saW5rID0JamZmczJfcHV0X2xpbmssCiAJLnNldGF0dHIgPQlqZmZzMl9zZXRhdHRyCiB9OwogCiBzdGF0aWMgaW50IGpmZnMyX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0JdW5zaWduZWQgY2hhciAqYnVmOwotCWJ1ZiA9IGpmZnMyX2dldGxpbmsoSkZGUzJfU0JfSU5GTyhkZW50cnktPmRfaW5vZGUtPmlfc2IpLCBKRkZTMl9JTk9ERV9JTkZPKGRlbnRyeS0+ZF9pbm9kZSkpOwotCW5kX3NldF9saW5rKG5kLCBidWYpOworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0gSkZGUzJfSU5PREVfSU5GTyhkZW50cnktPmRfaW5vZGUpOworCQorCS8qCisJICogV2UgZG9uJ3QgYWNxdWlyZSB0aGUgZi0+c2VtIG11dGV4IGhlcmUgc2luY2UgdGhlIG9ubHkgZGF0YSB3ZQorCSAqIHVzZSBpcyBmLT5kZW50cyB3aGljaCBpbiBjYXNlIG9mIHRoZSBzeW1saW5rIGlub2RlIHBvaW50cyB0byB0aGUKKwkgKiBzeW1saW5rJ3MgdGFyZ2V0IHBhdGguCisJICoKKwkgKiAxLiBJZiB3ZSBhcmUgaGVyZSB0aGUgaW5vZGUgaGFzIGFscmVhZHkgYnVpbHQgYW5kIGYtPmRlbnRzIGhhcworCSAqIHRvIHBvaW50IHRvIHRoZSB0YXJnZXQgcGF0aC4KKwkgKiAyLiBOb2JvZHkgdXNlcyBmLT5kZW50cyAoaWYgdGhlIGlub2RlIGlzIHN5bWxpbmsncyBpbm9kZSkuIFRoZQorCSAqIGV4Y2VwdGlvbiBpcyBpbm9kZSBmcmVlaW5nIGZ1bmN0aW9uIHdoaWNoIGZyZWVzIGYtPmRlbnRzLiBCdXQKKwkgKiBpdCBjYW4ndCBiZSBjYWxsZWQgd2hpbGUgd2UgYXJlIGhlcmUgYW5kIGJlZm9yZSBWRlMgaGFzCisJICogc3RvcHBlZCB1c2luZyBvdXIgZi0+ZGVudHMgc3RyaW5nIHdoaWNoIHdlIHByb3ZpZGUgYnkgbWVhbnMgb2YKKwkgKiBuZF9zZXRfbGluaygpIGNhbGwuCisJICovCisJCisJaWYgKCFmLT5kZW50cykgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnMyX2ZvbGxvd19saW5rKCk6IGNhbid0IGZpbmQgc3ltbGluayB0YWVyZ2V0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mb2xsb3dfbGluaygpOiB0YXJnZXQgcGF0aCBpcyAnJXMnXG4iLCAoY2hhciAqKSBmLT5kZW50cykpOworCisJbmRfc2V0X2xpbmsobmQsIChjaGFyICopZi0+ZGVudHMpOworCQorCS8qCisJICogV2UgdW5sb2NrIHRoZSBmLT5zZW0gbXV0ZXggYnV0IFZGUyB3aWxsIHVzZSB0aGUgZi0+ZGVudHMgc3RyaW5nLiBUaGlzIGlzIHNhZmUKKwkgKiBzaW5jZSB0aGUgb25seSB3YXkgdGhhdCBtYXkgY2F1c2UgZi0+ZGVudHMgdG8gYmUgY2hhbmdlZCBpcyBpcHV0KCkgb3BlcmF0aW9uLgorCSAqIEJ1dCBWRlMgd2lsbCBub3QgdXNlIGYtPmRlbnRzIGFmdGVyIGlwdXQoKSBoYXMgYmVlbiBjYWxsZWQuCisJICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGpmZnMyX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCi17Ci0JY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKLQlpZiAoIUlTX0VSUihzKSkKLQkJa2ZyZWUocyk7Ci19CmRpZmYgLS1naXQgYS9mcy9qZmZzMi93YnVmLmMgYi9mcy9qZmZzMi93YnVmLmMKaW5kZXggYzgxMjgwNi4uOTk2ZDkyMiAxMDA2NDQKLS0tIGEvZnMvamZmczIvd2J1Zi5jCisrKyBiL2ZzL2pmZnMyL3didWYuYwpAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogd2J1Zi5jLHYgMS44MiAyMDA0LzExLzIwIDIyOjA4OjMxIGR3bXcyIEV4cCAkCisgKiAkSWQ6IHdidWYuYyx2IDEuOTIgMjAwNS8wNC8wNSAxMjo1MTo1NCBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC04Myw3ICs4Myw3IEBACiAJc3RydWN0IGpmZnMyX2lub2RpcnR5ICpuZXc7CiAKIAkvKiBNYXJrIHRoZSBzdXBlcmJsb2NrIGRpcnR5IHNvIHRoYXQga3VwZGF0ZWQgd2lsbCBmbHVzaC4uLiAqLwotCU9GTklfQlNfMlNGRkooYyktPnNfZGlydCA9IDE7CisJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOwogCiAJaWYgKGpmZnMyX3didWZfcGVuZGluZ19mb3JfaW5vKGMsIGlubykpCiAJCXJldHVybjsKQEAgLTEzMCw3ICsxMzAsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGpmZnMyX2Jsb2NrX3JlZmlsZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKKyNkZWZpbmUgUkVGSUxFX05PVEVNUFRZIDAKKyNkZWZpbmUgUkVGSUxFX0FOWVdBWSAgIDEKKworc3RhdGljIHZvaWQgamZmczJfYmxvY2tfcmVmaWxlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCBpbnQgYWxsb3dfZW1wdHkpCiB7CiAJRDEocHJpbnRrKCJBYm91dCB0byByZWZpbGUgYmFkIGJsb2NrIGF0ICUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7CiAKQEAgLTE0NCw3ICsxNDcsNyBAQAogCQlEMShwcmludGsoIlJlZmlsaW5nIGJsb2NrIGF0ICUwOHggdG8gYmFkX3VzZWRfbGlzdFxuIiwgamViLT5vZmZzZXQpKTsKIAkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmJhZF91c2VkX2xpc3QpOwogCX0gZWxzZSB7Ci0JCUJVRygpOworCQlCVUdfT04oYWxsb3dfZW1wdHkgPT0gUkVGSUxFX05PVEVNUFRZKTsKIAkJLyogSXQgaGFzIHRvIGhhdmUgaGFkIHNvbWUgbm9kZXMgb3Igd2UgY291bGRuJ3QgYmUgaGVyZSAqLwogCQlEMShwcmludGsoIlJlZmlsaW5nIGJsb2NrIGF0ICUwOHggdG8gZXJhc2VfcGVuZGluZ19saXN0XG4iLCBqZWItPm9mZnNldCkpOwogCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0KTsKQEAgLTE3OSw3ICsxODIsNyBAQAogCiAJamViID0gJmMtPmJsb2Nrc1tjLT53YnVmX29mcyAvIGMtPnNlY3Rvcl9zaXplXTsKIAotCWpmZnMyX2Jsb2NrX3JlZmlsZShjLCBqZWIpOworCWpmZnMyX2Jsb2NrX3JlZmlsZShjLCBqZWIsIFJFRklMRV9OT1RFTVBUWSk7CiAKIAkvKiBGaW5kIHRoZSBmaXJzdCBub2RlIHRvIGJlIHJlY292ZXJlZCwgYnkgc2tpcHBpbmcgb3ZlciBldmVyeQogCSAgIG5vZGUgd2hpY2ggZW5kcyBiZWZvcmUgdGhlIHdidWYgc3RhcnRzLCBvciB3aGljaCBpcyBvYnNvbGV0ZS4gKi8KQEAgLTI2NCwxNyArMjY3LDE2IEBACiAJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyhjLCBlbmQtc3RhcnQsICZvZnMsICZsZW4pOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB3YnVmIHJlY292ZXJ5LiBEYXRhIGxvc3MgZW5zdWVzLlxuIik7Ci0JCWlmIChidWYpCi0JCQlrZnJlZShidWYpOworCQlrZnJlZShidWYpOwogCQlyZXR1cm47CiAJfQogCWlmIChlbmQtc3RhcnQgPj0gYy0+d2J1Zl9wYWdlc2l6ZSkgewotCQkvKiBOZWVkIHRvIGRvIGFub3RoZXIgd3JpdGUgaW1tZWRpYXRlbHkuIFRoaXMsIGJ0dywKLQkJIG1lYW5zIHRoYXQgd2UnbGwgYmUgd3JpdGluZyBmcm9tICdidWYnIGFuZCBub3QgZnJvbQotCQkgdGhlIHdidWYuIFNpbmNlIGlmIHdlJ3JlIHdyaXRpbmcgZnJvbSB0aGUgd2J1ZiB0aGVyZQotCQkgd29uJ3QgYmUgbW9yZSB0aGFuIGEgd2J1ZiBmdWxsIG9mIGRhdGEsIG5vdyB3aWxsCi0JCSB0aGVyZT8gOikgKi8KLQorCQkvKiBOZWVkIHRvIGRvIGFub3RoZXIgd3JpdGUgaW1tZWRpYXRlbHksIGJ1dCBpdCdzIHBvc3NpYmxlCisJCSAgIHRoYXQgdGhpcyBpcyBqdXN0IGJlY2F1c2UgdGhlIHdidWYgaXRzZWxmIGlzIGNvbXBsZXRlbHkKKwkJICAgZnVsbCwgYW5kIHRoZXJlJ3Mgbm90aGluZyBlYXJsaWVyIHJlYWQgYmFjayBmcm9tIHRoZSAKKwkJICAgZmxhc2guIEhlbmNlICdidWYnIGlzbid0IG5lY2Vzc2FyaWx5IHdoYXQgd2UncmUgd3JpdGluZyAKKwkJICAgZnJvbS4gKi8KKwkJdW5zaWduZWQgY2hhciAqcmV3cml0ZV9idWYgPSBidWY/OmMtPndidWY7CiAJCXVpbnQzMl90IHRvd3JpdGUgPSAoZW5kLXN0YXJ0KSAtICgoZW5kLXN0YXJ0KSVjLT53YnVmX3BhZ2VzaXplKTsKIAogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiV3JpdGUgMHgleCBieXRlcyBhdCAweCUwOHggaW4gd2J1ZiByZWNvdmVyXG4iLApAQCAtMjkyLDkgKzI5NCw5IEBACiAjZW5kaWYKIAkJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKIAkJCXJldCA9IGMtPm10ZC0+d3JpdGVfZWNjKGMtPm10ZCwgb2ZzLCB0b3dyaXRlLCAmcmV0bGVuLAotCQkJCQkJYnVmLCBOVUxMLCBjLT5vb2JpbmZvKTsKKwkJCQkJCXJld3JpdGVfYnVmLCBOVUxMLCBjLT5vb2JpbmZvKTsKIAkJZWxzZQotCQkJcmV0ID0gYy0+bXRkLT53cml0ZShjLT5tdGQsIG9mcywgdG93cml0ZSwgJnJldGxlbiwgYnVmKTsKKwkJCXJldCA9IGMtPm10ZC0+d3JpdGUoYy0+bXRkLCBvZnMsIHRvd3JpdGUsICZyZXRsZW4sIHJld3JpdGVfYnVmKTsKIAogCQlpZiAocmV0IHx8IHJldGxlbiAhPSB0b3dyaXRlKSB7CiAJCQkvKiBBcmdoLiBXZSB0cmllZC4gUmVhbGx5IHdlIGRpZC4gKi8KQEAgLTMyMSwxMCArMzIzLDEwIEBACiAKIAkJYy0+d2J1Zl9sZW4gPSAoZW5kIC0gc3RhcnQpIC0gdG93cml0ZTsKIAkJYy0+d2J1Zl9vZnMgPSBvZnMgKyB0b3dyaXRlOwotCQltZW1jcHkoYy0+d2J1ZiwgYnVmICsgdG93cml0ZSwgYy0+d2J1Zl9sZW4pOworCQltZW1tb3ZlKGMtPndidWYsIHJld3JpdGVfYnVmICsgdG93cml0ZSwgYy0+d2J1Zl9sZW4pOwogCQkvKiBEb24ndCBtdWNrIGFib3V0IHdpdGggYy0+d2J1Zl9pbm9kZXMuIEZhbHNlIHBvc2l0aXZlcyBhcmUgaGFybWxlc3MuICovCi0KLQkJa2ZyZWUoYnVmKTsKKwkJaWYgKGJ1ZikKKwkJCWtmcmVlKGJ1Zik7CiAJfSBlbHNlIHsKIAkJLyogT0ssIG5vdyB3ZSdyZSBsZWZ0IHdpdGggdGhlIGRyZWdzIGluIHdoaWNoZXZlciBidWZmZXIgd2UncmUgdXNpbmcgKi8KIAkJaWYgKGJ1ZikgewpAQCAtNDEzLDkgKzQxNSw5IEBACiAJaW50IHJldDsKIAlzaXplX3QgcmV0bGVuOwogCi0JLyogTm90aGluZyB0byBkbyBpZiBub3QgTkFORCBmbGFzaC4gSW4gcGFydGljdWxhciwgd2Ugc2hvdWxkbid0CisJLyogTm90aGluZyB0byBkbyBpZiBub3Qgd3JpdGUtYnVmZmVyaW5nIHRoZSBmbGFzaC4gSW4gcGFydGljdWxhciwgd2Ugc2hvdWxkbid0CiAJICAgZGVsX3RpbWVyKCkgdGhlIHRpbWVyIHdlIG5ldmVyIGluaXRpYWxpc2VkLiAqLwotCWlmIChqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkKKwlpZiAoIWpmZnMyX2lzX3dyaXRlYnVmZmVyZWQoYykpCiAJCXJldHVybiAwOwogCiAJaWYgKCFkb3duX3RyeWxvY2soJmMtPmFsbG9jX3NlbSkpIHsKQEAgLTQyNCw3ICs0MjYsNyBAQAogCQlCVUcoKTsKIAl9CiAKLQlpZighYy0+d2J1ZiB8fCAhYy0+d2J1Zl9sZW4pCisJaWYgKCFjLT53YnVmX2xlbikJLyogYWxyZWFkeSBjaGVja2VkIGMtPndidWYgYWJvdmUgKi8KIAkJcmV0dXJuIDA7CiAKIAkvKiBjbGFpbSByZW1haW5pbmcgc3BhY2Ugb24gdGhlIHBhZ2UKQEAgLTQzMyw3ICs0MzUsNyBAQAogCSAgIGlmIHdlIGhhdmUgYSBzd2l0Y2ggdG8gbmV4dCBwYWdlLCB3ZSB3aWxsIG5vdCBoYXZlCiAJICAgZW5vdWdoIHJlbWFpbmluZyBzcGFjZSBmb3IgdGhpcy4gCiAJKi8KLQlpZiAocGFkKSB7CisJaWYgKHBhZCAmJiAhamZmczJfZGF0YWZsYXNoKGMpKSB7CiAJCWMtPndidWZfbGVuID0gUEFEKGMtPndidWZfbGVuKTsKIAogCQkvKiBQYWQgd2l0aCBKRkZTMl9ESVJUWV9CSVRNQVNLIGluaXRpYWxseS4gIHRoaXMgaGVscHMgb3V0IEVDQydkIE5PUgpAQCAtNDg0LDcgKzQ4Niw3IEBACiAJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCiAJLyogQWRqdXN0IGZyZWUgc2l6ZSBvZiB0aGUgYmxvY2sgaWYgd2UgcGFkZGVkLiAqLwotCWlmIChwYWQpIHsKKwlpZiAocGFkICYmICFqZmZzMl9kYXRhZmxhc2goYykpIHsKIAkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYjsKIAogCQlqZWIgPSAmYy0+YmxvY2tzW2MtPndidWZfb2ZzIC8gYy0+c2VjdG9yX3NpemVdOwpAQCAtNTMyLDYgKzUzNCw5IEBACiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1Zl9nYygpIGNhbGxlZCBmb3IgaW5vICMldS4uLlxuIiwgaW5vKSk7CiAKKwlpZiAoIWMtPndidWYpCisJCXJldHVybiAwOworCiAJZG93bigmYy0+YWxsb2Nfc2VtKTsKIAlpZiAoIWpmZnMyX3didWZfcGVuZGluZ19mb3JfaW5vKGMsIGlubykpIHsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIklubyAjJWQgbm90IHBlbmRpbmcgaW4gd2J1Zi4gUmV0dXJuaW5nXG4iLCBpbm8pKTsKQEAgLTU0Nyw2ICs1NTIsMTAgQEAKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZsdXNoX3didWZfZ2MoKSBwYWRkaW5nLiBOb3QgZmluaXNoZWQgY2hlY2tpbmdcbiIpKTsKIAkJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOwogCQlyZXQgPSBfX2pmZnMyX2ZsdXNoX3didWYoYywgUEFEX0FDQ09VTlRJTkcpOworCQkvKiByZXRyeSBmbHVzaGluZyB3YnVmIGluIGNhc2UgamZmczJfd2J1Zl9yZWNvdmVyCisJCSAgIGxlZnQgc29tZSBkYXRhIGluIHRoZSB3YnVmICovCisJCWlmIChyZXQpCisJCQlyZXQgPSBfX2pmZnMyX2ZsdXNoX3didWYoYywgUEFEX0FDQ09VTlRJTkcpOwogCQl1cF93cml0ZSgmYy0+d2J1Zl9zZW0pOwogCX0gZWxzZSB3aGlsZSAob2xkX3didWZfbGVuICYmCiAJCSAgICAgIG9sZF93YnVmX29mcyA9PSBjLT53YnVmX29mcykgewpAQCAtNTYxLDYgKzU3MCwxMCBAQAogCQkJZG93bigmYy0+YWxsb2Nfc2VtKTsKIAkJCWRvd25fd3JpdGUoJmMtPndidWZfc2VtKTsKIAkJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfQUNDT1VOVElORyk7CisJCQkvKiByZXRyeSBmbHVzaGluZyB3YnVmIGluIGNhc2UgamZmczJfd2J1Zl9yZWNvdmVyCisJCQkgICBsZWZ0IHNvbWUgZGF0YSBpbiB0aGUgd2J1ZiAqLworCQkJaWYgKHJldCkKKwkJCQlyZXQgPSBfX2pmZnMyX2ZsdXNoX3didWYoYywgUEFEX0FDQ09VTlRJTkcpOwogCQkJdXBfd3JpdGUoJmMtPndidWZfc2VtKTsKIAkJCWJyZWFrOwogCQl9CkBAIC01NzgsMTUgKzU5MSwyNyBAQAogewogCWludCByZXQ7CiAKKwlpZiAoIWMtPndidWYpCisJCXJldHVybiAwOworCiAJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOwogCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfTk9BQ0NPVU5UKTsKKwkvKiByZXRyeSAtIG1heWJlIHdidWYgcmVjb3ZlciBsZWZ0IHNvbWUgZGF0YSBpbiB3YnVmLiAqLworCWlmIChyZXQpCisJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfTk9BQ0NPVU5UKTsKIAl1cF93cml0ZSgmYy0+d2J1Zl9zZW0pOwogCiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgorI2RlZmluZSBQQUdFX0RJVih4KSAoICgodW5zaWduZWQgbG9uZykoeCkgLyAodW5zaWduZWQgbG9uZykoYy0+d2J1Zl9wYWdlc2l6ZSkpICogKHVuc2lnbmVkIGxvbmcpKGMtPndidWZfcGFnZXNpemUpICkKKyNkZWZpbmUgUEFHRV9NT0QoeCkgKCAodW5zaWduZWQgbG9uZykoeCkgJSAodW5zaWduZWQgbG9uZykoYy0+d2J1Zl9wYWdlc2l6ZSkgKQorI2Vsc2UKICNkZWZpbmUgUEFHRV9ESVYoeCkgKCAoeCkgJiAofihjLT53YnVmX3BhZ2VzaXplIC0gMSkpICkKICNkZWZpbmUgUEFHRV9NT0QoeCkgKCAoeCkgJiAoYy0+d2J1Zl9wYWdlc2l6ZSAtIDEpICkKKyNlbmRpZgorCiBpbnQgamZmczJfZmxhc2hfd3JpdGV2KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqaW52ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuLCB1aW50MzJfdCBpbm8pCiB7CiAJc3RydWN0IGt2ZWMgb3V0dmVjc1szXTsKQEAgLTYwMSw3ICs2MjYsNyBAQAogCXVpbnQzMl90IG91dHZlY190byA9IHRvOwogCiAJLyogSWYgbm90IE5BTkQgZmxhc2gsIGRvbid0IGJvdGhlciAqLwotCWlmICghYy0+d2J1ZikKKwlpZiAoIWpmZnMyX2lzX3dyaXRlYnVmZmVyZWQoYykpCiAJCXJldHVybiBqZmZzMl9mbGFzaF9kaXJlY3Rfd3JpdGV2KGMsIGludmVjcywgY291bnQsIHRvLCByZXRsZW4pOwogCQogCWRvd25fd3JpdGUoJmMtPndidWZfc2VtKTsKQEAgLTYzMCw3ICs2NTUsNyBAQAogCSAgIGVyYXNlIGJsb2NrLiBBbnl0aGluZyBlbHNlLCBhbmQgeW91IGRpZS4KIAkgICBOZXcgYmxvY2sgc3RhcnRzIGF0IHh4eDAwMGMgKDAtYiA9IGJsb2NrIGhlYWRlcikKIAkqLwotCWlmICggKHRvICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgIT0gKGMtPndidWZfb2ZzICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgKSB7CisJaWYgKFNFQ1RPUl9BRERSKHRvKSAhPSBTRUNUT1JfQUREUihjLT53YnVmX29mcykpIHsKIAkJLyogSXQncyBhIHdyaXRlIHRvIGEgbmV3IGJsb2NrICovCiAJCWlmIChjLT53YnVmX2xlbikgewogCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZsYXNoX3dyaXRldigpIHRvIDB4JWx4IGNhdXNlcyBmbHVzaCBvZiB3YnVmIGF0IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGxvbmcpdG8sIGMtPndidWZfb2ZzKSk7CkBAIC03NjIsOSArNzg3LDE4IEBACiAJCQogCQlpZiAocmV0IDwgMCB8fCB3YnVmX3JldGxlbiAhPSBQQUdFX0RJVih0b3RsZW4pKSB7CiAJCQkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm8gcHJvYmxlbSwKLQkJCSAgIGMtPndidWYgaXMgZW1wdHkuIAorCQkJICAgYy0+d2J1ZiBpcyBlbXB0eS4gSG93ZXZlciByZWZpbGUgbmV4dGJsb2NrIHRvIGF2b2lkCisJCQkgICB3cml0aW5nIGFnYWluIHRvIHNhbWUgYWRkcmVzcy4KIAkJCSovCi0JCQkqcmV0bGVuID0gZG9uZWxlbjsKKwkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisKKwkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCQkJamViID0gJmMtPmJsb2Nrc1tvdXR2ZWNfdG8gLyBjLT5zZWN0b3Jfc2l6ZV07CisJCQlqZmZzMl9ibG9ja19yZWZpbGUoYywgamViLCBSRUZJTEVfQU5ZV0FZKTsKKworCQkJKnJldGxlbiA9IDA7CisJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCQkKQEAgLTgxOSw3ICs4NTMsNyBAQAogewogCXN0cnVjdCBrdmVjIHZlY3NbMV07CiAKLQlpZiAoamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykpCisJaWYgKCFqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKQogCQlyZXR1cm4gYy0+bXRkLT53cml0ZShjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1Zik7CiAKIAl2ZWNzWzBdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOwpAQCAtODM1LDM5ICs4NjksMzggQEAKIAlsb2ZmX3QJb3JiZiA9IDAsIG93YmYgPSAwLCBsd2JmID0gMDsKIAlpbnQJcmV0OwogCi0JLyogUmVhZCBmbGFzaCAqLwotCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykpIHsKLQkJZG93bl9yZWFkKCZjLT53YnVmX3NlbSk7Ci0KLQkJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKLQkJCXJldCA9IGMtPm10ZC0+cmVhZF9lY2MoYy0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYsIE5VTEwsIGMtPm9vYmluZm8pOwotCQllbHNlCi0JCQlyZXQgPSBjLT5tdGQtPnJlYWQoYy0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpOwotCi0JCWlmICggKHJldCA9PSAtRUJBRE1TRykgJiYgKCpyZXRsZW4gPT0gbGVuKSApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10ZC0+cmVhZCgweCV6eCBieXRlcyBmcm9tIDB4JWxseCkgcmV0dXJuZWQgRUNDIGVycm9yXG4iLAotCQkJICAgICAgIGxlbiwgb2ZzKTsKLQkJCS8qIAotCQkJICogV2UgaGF2ZSB0aGUgcmF3IGRhdGEgd2l0aG91dCBFQ0MgY29ycmVjdGlvbiBpbiB0aGUgYnVmZmVyLCBtYXliZSAKLQkJCSAqIHdlIGFyZSBsdWNreSBhbmQgYWxsIGRhdGEgb3IgcGFydHMgYXJlIGNvcnJlY3QuIFdlIGNoZWNrIHRoZSBub2RlLgotCQkJICogSWYgZGF0YSBhcmUgY29ycnVwdGVkIG5vZGUgY2hlY2sgd2lsbCBzb3J0IGl0IG91dC4KLQkJCSAqIFdlIGtlZXAgdGhpcyBibG9jaywgaXQgd2lsbCBmYWlsIG9uIHdyaXRlIG9yIGVyYXNlIGFuZCB0aGUgd2UKLQkJCSAqIG1hcmsgaXQgYmFkLiBPciBzaG91bGQgd2UgZG8gdGhhdCBub3c/IEJ1dCB3ZSBzaG91bGQgZ2l2ZSBoaW0gYSBjaGFuY2UuCi0JCQkgKiBNYXliZSB3ZSBoYWQgYSBzeXN0ZW0gY3Jhc2ggb3IgcG93ZXIgbG9zcyBiZWZvcmUgdGhlIGVjYyB3cml0ZSBvciAgCi0JCQkgKiBhIGVyYXNlIHdhcyBjb21wbGV0ZWQuCi0JCQkgKiBTbyB3ZSByZXR1cm4gc3VjY2Vzcy4gOikKLQkJCSAqLwotCQkgCXJldCA9IDA7Ci0JCSB9CQotCX0gZWxzZQorCWlmICghamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSkKIAkJcmV0dXJuIGMtPm10ZC0+cmVhZChjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1Zik7CiAKKwkvKiBSZWFkIGZsYXNoICovCisJZG93bl9yZWFkKCZjLT53YnVmX3NlbSk7CisJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJcmV0ID0gYy0+bXRkLT5yZWFkX2VjYyhjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJZWxzZQorCQlyZXQgPSBjLT5tdGQtPnJlYWQoYy0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpOworCisJaWYgKCAocmV0ID09IC1FQkFETVNHKSAmJiAoKnJldGxlbiA9PSBsZW4pICkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdGQtPnJlYWQoMHglenggYnl0ZXMgZnJvbSAweCVsbHgpIHJldHVybmVkIEVDQyBlcnJvclxuIiwKKwkJICAgICAgIGxlbiwgb2ZzKTsKKwkJLyogCisJCSAqIFdlIGhhdmUgdGhlIHJhdyBkYXRhIHdpdGhvdXQgRUNDIGNvcnJlY3Rpb24gaW4gdGhlIGJ1ZmZlciwgbWF5YmUgCisJCSAqIHdlIGFyZSBsdWNreSBhbmQgYWxsIGRhdGEgb3IgcGFydHMgYXJlIGNvcnJlY3QuIFdlIGNoZWNrIHRoZSBub2RlLgorCQkgKiBJZiBkYXRhIGFyZSBjb3JydXB0ZWQgbm9kZSBjaGVjayB3aWxsIHNvcnQgaXQgb3V0LgorCQkgKiBXZSBrZWVwIHRoaXMgYmxvY2ssIGl0IHdpbGwgZmFpbCBvbiB3cml0ZSBvciBlcmFzZSBhbmQgdGhlIHdlCisJCSAqIG1hcmsgaXQgYmFkLiBPciBzaG91bGQgd2UgZG8gdGhhdCBub3c/IEJ1dCB3ZSBzaG91bGQgZ2l2ZSBoaW0gYSBjaGFuY2UuCisJCSAqIE1heWJlIHdlIGhhZCBhIHN5c3RlbSBjcmFzaCBvciBwb3dlciBsb3NzIGJlZm9yZSB0aGUgZWNjIHdyaXRlIG9yICAKKwkJICogYSBlcmFzZSB3YXMgY29tcGxldGVkLgorCQkgKiBTbyB3ZSByZXR1cm4gc3VjY2Vzcy4gOikKKwkJICovCisJIAlyZXQgPSAwOworCX0JCisKIAkvKiBpZiBubyB3cml0ZWJ1ZmZlciBhdmFpbGFibGUgb3Igd3JpdGUgYnVmZmVyIGVtcHR5LCByZXR1cm4gKi8KIAlpZiAoIWMtPndidWZfcGFnZXNpemUgfHwgIWMtPndidWZfbGVuKQogCQlnb3RvIGV4aXQ7CiAKIAkvKiBpZiB3ZSByZWFkIGluIGEgZGlmZmVyZW50IGJsb2NrLCByZXR1cm4gKi8KLQlpZiAoIChvZnMgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSAhPSAoYy0+d2J1Zl9vZnMgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSApIAorCWlmIChTRUNUT1JfQUREUihvZnMpICE9IFNFQ1RPUl9BRERSKGMtPndidWZfb2ZzKSkKIAkJZ290byBleGl0OwogCiAJaWYgKG9mcyA+PSBjLT53YnVmX29mcykgewpAQCAtMTE2MSw3ICsxMTk0LDI3IEBACiAJa2ZyZWUoYy0+d2J1Zik7CiB9CiAKLSNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQworaW50IGpmZnMyX2RhdGFmbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykgeworCWMtPmNsZWFubWFya2VyX3NpemUgPSAwOwkJLyogTm8gY2xlYW5tYXJrZXJzIG5lZWRlZCAqLworCQorCS8qIEluaXRpYWxpemUgd3JpdGUgYnVmZmVyICovCisJaW5pdF9yd3NlbSgmYy0+d2J1Zl9zZW0pOworCWMtPndidWZfcGFnZXNpemUgPSBjLT5zZWN0b3Jfc2l6ZTsKKwljLT53YnVmX29mcyA9IDB4RkZGRkZGRkY7CisKKwljLT53YnVmID0ga21hbGxvYyhjLT53YnVmX3BhZ2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMtPndidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSkZGUzIgd3JpdGUtYnVmZmVyaW5nIGVuYWJsZWQgKCVpKVxuIiwgYy0+d2J1Zl9wYWdlc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBqZmZzMl9kYXRhZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykgeworCWtmcmVlKGMtPndidWYpOworfQorCiBpbnQgamZmczJfbm9yX2VjY19mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykgewogCS8qIENsZWFubWFya2VyIGlzIGFjdHVhbGx5IGxhcmdlciBvbiB0aGUgZmxhc2hlcyAqLwogCWMtPmNsZWFubWFya2VyX3NpemUgPSAxNjsKQEAgLTExODEsNCArMTIzNCwzIEBACiB2b2lkIGpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykgewogCWtmcmVlKGMtPndidWYpOwogfQotI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qZmZzMi93cml0ZS5jIGIvZnMvamZmczIvd3JpdGUuYwppbmRleCA4MGE1ZGI1Li42OTEwMDYxIDEwMDY0NAotLS0gYS9mcy9qZmZzMi93cml0ZS5jCisrKyBiL2ZzL2pmZnMyL3dyaXRlLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHdyaXRlLmMsdiAxLjg3IDIwMDQvMTEvMTYgMjA6MzY6MTIgZHdtdzIgRXhwICQKKyAqICRJZDogd3JpdGUuYyx2IDEuOTIgMjAwNS8wNC8xMyAxMzoyMjozNSBkd213MiBFeHAgJAogICoKICAqLwogCkBAIC0zNSwxMyArMzUsMTIgQEAKIAlmLT5pbm9jYWNoZSA9IGljOwogCWYtPmlub2NhY2hlLT5ubGluayA9IDE7CiAJZi0+aW5vY2FjaGUtPm5vZGVzID0gKHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKilmLT5pbm9jYWNoZTsKLQlmLT5pbm9jYWNoZS0+aW5vID0gKytjLT5oaWdoZXN0X2lubzsKIAlmLT5pbm9jYWNoZS0+c3RhdGUgPSBJTk9fU1RBVEVfUFJFU0VOVDsKIAotCXJpLT5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKIAotCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19uZXdfaW5vZGUoKTogQXNzaWduZWQgaW5vIyAlZFxuIiwgZi0+aW5vY2FjaGUtPmlubykpOwogCWpmZnMyX2FkZF9pbm9fY2FjaGUoYywgZi0+aW5vY2FjaGUpOworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19uZXdfaW5vZGUoKTogQXNzaWduZWQgaW5vIyAlZFxuIiwgZi0+aW5vY2FjaGUtPmlubykpOworCXJpLT5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKIAogCXJpLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOwogCXJpLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKQEAgLTEzNiw2ICsxMzUsMTUgQEAKIAlyYXctPl9fdG90bGVuID0gUEFEKHNpemVvZigqcmkpK2RhdGFsZW4pOwogCXJhdy0+bmV4dF9waHlzID0gTlVMTDsKIAorCWlmICgoYWxsb2NfbW9kZSE9QUxMT0NfR0MpICYmIChqZTMyX3RvX2NwdShyaS0+dmVyc2lvbikgPCBmLT5oaWdoZXN0X3ZlcnNpb24pKSB7CisJCUJVR19PTighcmV0cmllZCk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl93cml0ZV9kbm9kZSA6IGRub2RlX3ZlcnNpb24gJWQsICIKKwkJCQkiaGlnaGVzdCB2ZXJzaW9uICVkIC0+IHVwZGF0aW5nIGRub2RlXG4iLCAKKwkJCQlqZTMyX3RvX2NwdShyaS0+dmVyc2lvbiksIGYtPmhpZ2hlc3RfdmVyc2lvbikpOworCQlyaS0+dmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwkJcmktPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpKTsKKwl9CisKIAlyZXQgPSBqZmZzMl9mbGFzaF93cml0ZXYoYywgdmVjcywgY250LCBmbGFzaF9vZnMsICZyZXRsZW4sCiAJCQkJIChhbGxvY19tb2RlPT1BTExPQ19HQyk/MDpmLT5pbm9jYWNoZS0+aW5vKTsKIApAQCAtMjgwLDYgKzI4OCwxNiBAQAogCXJhdy0+X190b3RsZW4gPSBQQUQoc2l6ZW9mKCpyZCkrbmFtZWxlbik7CiAJcmF3LT5uZXh0X3BoeXMgPSBOVUxMOwogCisJaWYgKChhbGxvY19tb2RlIT1BTExPQ19HQykgJiYgKGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKSA8IGYtPmhpZ2hlc3RfdmVyc2lvbikpIHsKKwkJQlVHX09OKCFyZXRyaWVkKTsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX2RpcmVudCA6IGRpcmVudF92ZXJzaW9uICVkLCAiCisJCQkJICAgICAiaGlnaGVzdCB2ZXJzaW9uICVkIC0+IHVwZGF0aW5nIGRpcmVudFxuIiwKKwkJCQkgICAgIGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKSwgZi0+aGlnaGVzdF92ZXJzaW9uKSk7CisJCXJkLT52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytmLT5oaWdoZXN0X3ZlcnNpb24pOworCQlmZC0+dmVyc2lvbiA9IGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKTsKKwkJcmQtPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZigqcmQpLTgpKTsKKwl9CisKIAlyZXQgPSBqZmZzMl9mbGFzaF93cml0ZXYoYywgdmVjcywgMiwgZmxhc2hfb2ZzLCAmcmV0bGVuLAogCQkJCSAoYWxsb2NfbW9kZT09QUxMT0NfR0MpPzA6amUzMl90b19jcHUocmQtPnBpbm8pKTsKIAlpZiAocmV0IHx8IChyZXRsZW4gIT0gc2l6ZW9mKCpyZCkgKyBuYW1lbGVuKSkgewpAQCAtNjI1LDIwICs2NDMsMjMgQEAKIAogCQlkb3duKCZkZWFkX2YtPnNlbSk7CiAKLQkJd2hpbGUgKGRlYWRfZi0+ZGVudHMpIHsKLQkJCS8qIFRoZXJlIGNhbiBiZSBvbmx5IGRlbGV0ZWQgb25lcyAqLwotCQkJZmQgPSBkZWFkX2YtPmRlbnRzOwotCQkJCi0JCQlkZWFkX2YtPmRlbnRzID0gZmQtPm5leHQ7Ci0JCQkKLQkJCWlmIChmZC0+aW5vKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGVsZXRpbmcgaW5vZGUgIyV1IHdpdGggYWN0aXZlIGRlbnRyeSBcIiVzXCItPmlubyAjJXVcbiIsCi0JCQkJICAgICAgIGRlYWRfZi0+aW5vY2FjaGUtPmlubywgZmQtPm5hbWUsIGZkLT5pbm8pOwotCQkJfSBlbHNlIHsKLQkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZGVsZXRpb24gZGlyZW50IGZvciBcIiVzXCIgZnJvbSBkaXIgaW5vICMldVxuIiwgZmQtPm5hbWUsIGRlYWRfZi0+aW5vY2FjaGUtPmlubykpOworCQlpZiAoU19JU0RJUihPRk5JX0VET05JXzJTRkZKKGRlYWRfZiktPmlfbW9kZSkpIHsKKwkJCXdoaWxlIChkZWFkX2YtPmRlbnRzKSB7CisJCQkJLyogVGhlcmUgY2FuIGJlIG9ubHkgZGVsZXRlZCBvbmVzICovCisJCQkJZmQgPSBkZWFkX2YtPmRlbnRzOworCQkJCQorCQkJCWRlYWRfZi0+ZGVudHMgPSBmZC0+bmV4dDsKKwkJCQkKKwkJCQlpZiAoZmQtPmlubykgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZWxldGluZyBpbm9kZSAjJXUgd2l0aCBhY3RpdmUgZGVudHJ5IFwiJXNcIi0+aW5vICMldVxuIiwKKwkJCQkJICAgICAgIGRlYWRfZi0+aW5vY2FjaGUtPmlubywgZmQtPm5hbWUsIGZkLT5pbm8pOworCQkJCX0gZWxzZSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZW1vdmluZyBkZWxldGlvbiBkaXJlbnQgZm9yIFwiJXNcIiBmcm9tIGRpciBpbm8gIyV1XG4iLAorCQkJCQkJZmQtPm5hbWUsIGRlYWRfZi0+aW5vY2FjaGUtPmlubykpOworCQkJCX0KKwkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZmQtPnJhdyk7CisJCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CiAJCQl9Ci0JCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZmQtPnJhdyk7Ci0JCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKIAkJfQogCiAJCWRlYWRfZi0+aW5vY2FjaGUtPm5saW5rLS07CmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2RtYXAuYyBiL2ZzL2pmcy9qZnNfZG1hcC5jCmluZGV4IGNjZWQyZmUuLjA3MzJmMjAgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfZG1hcC5jCisrKyBiL2ZzL2pmcy9qZnNfZG1hcC5jCkBAIC0yNiwzNiArMjYsNiBAQAogI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgogCiAvKgotICoJRGVidWcgY29kZSBmb3IgZG91YmxlLWNoZWNraW5nIGJsb2NrIG1hcAotICovCi0vKiAjZGVmaW5lCV9KRlNfREVCVUdfRE1BUAkxICovCi0KLSNpZmRlZglfSkZTX0RFQlVHX0RNQVAKLSNkZWZpbmUgREJJTklUTUFQKHNpemUsaXBibWFwLHJlc3VsdHMpIFwKLQlEQmluaXRtYXAoc2l6ZSxpcGJtYXAscmVzdWx0cykKLSNkZWZpbmUgREJBTExPQyhkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpIFwKLQlEQkFsbG9jKGRibWFwLG1hcHNpemUsYmxrbm8sbmJsb2NrcykKLSNkZWZpbmUgREJGUkVFKGRibWFwLG1hcHNpemUsYmxrbm8sbmJsb2NrcykgXAotCURCRnJlZShkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpCi0jZGVmaW5lIERCQUxMT0NDSyhkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpIFwKLQlEQkFsbG9jQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKQotI2RlZmluZSBEQkZSRUVDSyhkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpIFwKLQlEQkZyZWVDSyhkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpCi0KLXN0YXRpYyB2b2lkIERCaW5pdG1hcChzNjQsIHN0cnVjdCBpbm9kZSAqLCB1MzIgKiopOwotc3RhdGljIHZvaWQgREJBbGxvYyh1aW50ICosIHM2NCwgczY0LCBzNjQpOwotc3RhdGljIHZvaWQgREJGcmVlKHVpbnQgKiwgczY0LCBzNjQsIHM2NCk7Ci1zdGF0aWMgdm9pZCBEQkFsbG9jQ0sodWludCAqLCBzNjQsIHM2NCwgczY0KTsKLXN0YXRpYyB2b2lkIERCRnJlZUNLKHVpbnQgKiwgczY0LCBzNjQsIHM2NCk7Ci0jZWxzZQotI2RlZmluZSBEQklOSVRNQVAoc2l6ZSxpcGJtYXAscmVzdWx0cykKLSNkZWZpbmUgREJBTExPQyhkYm1hcCwgbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpCi0jZGVmaW5lIERCRlJFRShkYm1hcCwgbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpCi0jZGVmaW5lIERCQUxMT0NDSyhkYm1hcCwgbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpCi0jZGVmaW5lIERCRlJFRUNLKGRibWFwLCBtYXBzaXplLCBibGtubywgbmJsb2NrcykKLSNlbmRpZgkJCQkvKiBfSkZTX0RFQlVHX0RNQVAgKi8KLQotLyoKICAqCVNFUklBTElaQVRJT04gb2YgdGhlIEJsb2NrIEFsbG9jYXRpb24gTWFwLgogICoKICAqCXRoZSB3b3JraW5nIHN0YXRlIG9mIHRoZSBibG9jayBhbGxvY2F0aW9uIG1hcCBpcyBhY2Nlc3NlZCBpbgpAQCAtMjQyLDcgKzIxMiw2IEBACiAJSkZTX1NCSShpcGJtYXAtPmlfc2IpLT5ibWFwID0gYm1wOwogCiAJbWVtc2V0KGJtcC0+ZGJfYWN0aXZlLCAwLCBzaXplb2YoYm1wLT5kYl9hY3RpdmUpKTsKLQlEQklOSVRNQVAoYm1wLT5kYl9tYXBzaXplLCBpcGJtYXAsICZibXAtPmRiX0RCbWFwKTsKIAogCS8qCiAJICogYWxsb2NhdGUvaW5pdGlhbGl6ZSB0aGUgYm1hcCBsb2NrCkBAIC00MDcsMTYgKzM3NiwxMiBAQAogCQkgKi8KIAkJbmIgPSBtaW4ocmVtLCBCUEVSRE1BUCAtIChibGtubyAmIChCUEVSRE1BUCAtIDEpKSk7CiAKLQkJREJBTExPQ0NLKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5iKTsKLQogCQkvKiBmcmVlIHRoZSBibG9ja3MuICovCiAJCWlmICgocmMgPSBkYkZyZWVEbWFwKGJtcCwgZHAsIGJsa25vLCBuYikpKSB7CiAJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKIAkJCUlSRUFEX1VOTE9DSyhpcGJtYXApOwogCQkJcmV0dXJuIChyYyk7CiAJCX0KLQotCQlEQkZSRUUoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCBibGtubywgbmIpOwogCX0KIAogCS8qIHdyaXRlIHRoZSBsYXN0IGJ1ZmZlci4gKi8KQEAgLTc3NSwxMCArNzQwLDYgQEAKIAkJSVdSSVRFX0xPQ0soaXBibWFwKTsKIAogCQlyYyA9IGRiQWxsb2NBbnkoYm1wLCBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCAqcmVzdWx0cywKLQkJCQluYmxvY2tzKTsKLQkJfQogCiAJCWdvdG8gd3JpdGVfdW5sb2NrOwogCX0KQEAgLTgzNiw4ICs3OTcsNiBAQAogCQkgICAgIT0gLUVOT1NQQykgewogCQkJaWYgKHJjID09IDApIHsKIAkJCQkqcmVzdWx0cyA9IGJsa25vOwotCQkJCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLAotCQkJCQkqcmVzdWx0cywgbmJsb2Nrcyk7CiAJCQkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CiAJCQl9CiAKQEAgLTg2MywxMSArODIyLDggQEAKIAkJaWYgKChyYyA9CiAJCSAgICAgZGJBbGxvY05lYXIoYm1wLCBkcCwgYmxrbm8sIChpbnQpIG5ibG9ja3MsIGwybmIsIHJlc3VsdHMpKQogCQkgICAgIT0gLUVOT1NQQykgewotCQkJaWYgKHJjID09IDApIHsKLQkJCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwKLQkJCQkJKnJlc3VsdHMsIG5ibG9ja3MpOworCQkJaWYgKHJjID09IDApCiAJCQkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7Ci0JCQl9CiAKIAkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOwogCQkJZ290byByZWFkX3VubG9jazsKQEAgLTg3OCwxMSArODM0LDggQEAKIAkJICovCiAJCWlmICgocmMgPSBkYkFsbG9jRG1hcExldihibXAsIGRwLCAoaW50KSBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKIAkJICAgICE9IC1FTk9TUEMpIHsKLQkJCWlmIChyYyA9PSAwKSB7Ci0JCQkJREJBTExPQyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsCi0JCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwkJCWlmIChyYyA9PSAwKQogCQkJCW1hcmtfbWV0YXBhZ2VfZGlydHkobXApOwotCQkJfQogCiAJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKIAkJCWdvdG8gcmVhZF91bmxvY2s7CkBAIC04OTYsMTMgKzg0OSw5IEBACiAJICogdGhlIHNhbWUgYWxsb2NhdGlvbiBncm91cCBhcyB0aGUgaGludC4KIAkgKi8KIAlJV1JJVEVfTE9DSyhpcGJtYXApOwotCWlmICgocmMgPSBkYkFsbG9jQUcoYm1wLCBhZ25vLCBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKLQkgICAgIT0gLUVOT1NQQykgewotCQlpZiAocmMgPT0gMCkKLQkJCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLAotCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwlpZiAoKHJjID0gZGJBbGxvY0FHKGJtcCwgYWdubywgbmJsb2NrcywgbDJuYiwgcmVzdWx0cykpICE9IC1FTk9TUEMpCiAJCWdvdG8gd3JpdGVfdW5sb2NrOwotCX0KKwogCUlXUklURV9VTkxPQ0soaXBibWFwKTsKIAogCkBAIC05MTgsOSArODY3LDYgQEAKIAkgKi8KIAlpZiAoKHJjID0gZGJBbGxvY0FHKGJtcCwgYWdubywgbmJsb2NrcywgbDJuYiwgcmVzdWx0cykpID09IC1FTk9TUEMpCiAJCXJjID0gZGJBbGxvY0FueShibXAsIG5ibG9ja3MsIGwybmIsIHJlc3VsdHMpOwotCWlmIChyYyA9PSAwKSB7Ci0JCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCAqcmVzdWx0cywgbmJsb2Nrcyk7Ci0JfQogCiAgICAgICB3cml0ZV91bmxvY2s6CiAJSVdSSVRFX1VOTE9DSyhpcGJtYXApOwpAQCAtOTkyLDEwICs5MzgsOSBAQAogCiAJSVJFQURfVU5MT0NLKGlwYm1hcCk7CiAKLQlpZiAocmMgPT0gMCkgewotCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpOworCWlmIChyYyA9PSAwKQogCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKLQl9CisKIAlyZWxlYXNlX21ldGFwYWdlKG1wKTsKIAogCXJldHVybiAocmMpOwpAQCAtMTE0NCw3ICsxMDg5LDYgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JREJBTExPQ0NLKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpOwogCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOwogCiAJLyogdHJ5IHRvIGFsbG9jYXRlIHRoZSBibG9ja3MgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQpAQCAtMTE1NSwxMSArMTA5OSw5IEBACiAJSVJFQURfVU5MT0NLKGlwYm1hcCk7CiAKIAkvKiB3ZXJlIHdlIHN1Y2Nlc3NmdWwgPyAqLwotCWlmIChyYyA9PSAwKSB7Ci0JCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCBleHRibGtubywKLQkJCWFkZG5ibG9ja3MpOworCWlmIChyYyA9PSAwKQogCQl3cml0ZV9tZXRhcGFnZShtcCk7Ci0JfSBlbHNlCisJZWxzZQogCQkvKiB3ZSB3ZXJlIG5vdCBzdWNjZXNzZnVsICovCiAJCXJlbGVhc2VfbWV0YXBhZ2UobXApOwogCkBAIC0zMTg1LDE2ICszMTI3LDEyIEBACiAJCSAqLwogCQluYiA9IG1pbihyZW0sIEJQRVJETUFQIC0gKGJsa25vICYgKEJQRVJETUFQIC0gMSkpKTsKIAotCQlEQkZSRUVDSyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsIGJsa25vLCBuYik7Ci0KIAkJLyogYWxsb2NhdGUgdGhlIGJsb2Nrcy4gKi8KIAkJaWYgKChyYyA9IGRiQWxsb2NEbWFwQlUoYm1wLCBkcCwgYmxrbm8sIG5iKSkpIHsKIAkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOwogCQkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CiAJCQlyZXR1cm4gKHJjKTsKIAkJfQotCi0JCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCBibGtubywgbmIpOwogCX0KIAogCS8qIHdyaXRlIHRoZSBsYXN0IGJ1ZmZlci4gKi8KQEAgLTQwNDEsMjIzICszOTc5LDMgQEAKIAogCXJldHVybiAobmJsb2Nrcyk7CiB9Ci0KLQotI2lmZGVmCV9KRlNfREVCVUdfRE1BUAotLyoKLSAqCURCaW5pdG1hcCgpCi0gKi8KLXN0YXRpYyB2b2lkIERCaW5pdG1hcChzNjQgc2l6ZSwgc3RydWN0IGlub2RlICppcGJtYXAsIHUzMiAqKiByZXN1bHRzKQotewotCWludCBucGFnZXM7Ci0JdTMyICpkYm1hcCwgKmQ7Ci0JaW50IG47Ci0JczY0IGxibGtubywgY3VyX2Jsb2NrOwotCXN0cnVjdCBkbWFwICpkcDsKLQlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwotCi0JbnBhZ2VzID0gc2l6ZSAvIDMyNzY4OwotCW5wYWdlcyArPSAoc2l6ZSAlIDMyNzY4KSA/IDEgOiAwOwotCi0JZGJtYXAgPSAodTMyICopIHhtYWxsb2MobnBhZ2VzICogNDA5NiwgTDJQU0laRSwga2VybmVsX2hlYXApOwotCWlmIChkYm1hcCA9PSBOVUxMKQotCQlCVUcoKTsJLyogTm90IHJvYnVzdCBzaW5jZSB0aGlzIGlzIG9ubHkgdW51c2VkIGRlYnVnIGNvZGUgKi8KLQotCWZvciAobiA9IDAsIGQgPSBkYm1hcDsgbiA8IG5wYWdlczsgbisrLCBkICs9IDEwMjQpCi0JCWJ6ZXJvKGQsIDQwOTYpOwotCi0JLyogTmVlZCB0byBpbml0aWFsaXplIGZyb20gZGlzayBtYXAgcGFnZXMKLQkgKi8KLQlmb3IgKGQgPSBkYm1hcCwgY3VyX2Jsb2NrID0gMDsgY3VyX2Jsb2NrIDwgc2l6ZTsKLQkgICAgIGN1cl9ibG9jayArPSBCUEVSRE1BUCwgZCArPSBMUEVSRE1BUCkgewotCQlsYmxrbm8gPSBCTEtUT0RNQVAoY3VyX2Jsb2NrLAotCQkJCSAgIEpGU19TQkkoaXBibWFwLT5pX3NiKS0+Ym1hcC0+Ci0JCQkJICAgZGJfbDJuYnBlcnBhZ2UpOwotCQltcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKLQkJaWYgKG1wID09IE5VTEwpIHsKLQkJCWpmc19lcnJvcihpcGJtYXAtPmlfc2IsCi0JCQkJICAiREJpbml0bWFwOiBjb3VsZCBub3QgcmVhZCBkaXNrIG1hcCBwYWdlIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKLQotCQlmb3IgKG4gPSAwOyBuIDwgTFBFUkRNQVA7IG4rKykKLQkJCWRbbl0gPSBsZTMyX3RvX2NwdShkcC0+d21hcFtuXSk7Ci0KLQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7Ci0JfQotCi0JKnJlc3VsdHMgPSBkYm1hcDsKLX0KLQotCi0vKgotICoJREJBbGxvYygpCi0gKi8KLXZvaWQgREJBbGxvYyh1aW50ICogZGJtYXAsIHM2NCBtYXBzaXplLCBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzKQotewotCWludCB3b3JkLCBuYiwgYml0bm87Ci0JdTMyIG1hc2s7Ci0KLQlhc3NlcnQoYmxrbm8gPiAwICYmIGJsa25vIDwgbWFwc2l6ZSk7Ci0JYXNzZXJ0KG5ibG9ja3MgPiAwICYmIG5ibG9ja3MgPD0gbWFwc2l6ZSk7Ci0KLQlhc3NlcnQoYmxrbm8gKyBuYmxvY2tzIDw9IG1hcHNpemUpOwotCi0JZGJtYXAgKz0gKGJsa25vIC8gMzIpOwotCXdoaWxlIChuYmxvY2tzID4gMCkgewotCQliaXRubyA9IGJsa25vICYgKDMyIC0gMSk7Ci0JCW5iID0gbWluKG5ibG9ja3MsIDMyIC0gYml0bm8pOwotCi0JCW1hc2sgPSAoMHhmZmZmZmZmZiA8PCAoMzIgLSBuYikgPj4gYml0bm8pOwotCQlhc3NlcnQoKG1hc2sgJiAqZGJtYXApID09IDApOwotCQkqZGJtYXAgfD0gbWFzazsKLQotCQlkYm1hcCsrOwotCQlibGtubyArPSBuYjsKLQkJbmJsb2NrcyAtPSBuYjsKLQl9Ci19Ci0KLQotLyoKLSAqCURCRnJlZSgpCi0gKi8KLXN0YXRpYyB2b2lkIERCRnJlZSh1aW50ICogZGJtYXAsIHM2NCBtYXBzaXplLCBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzKQotewotCWludCB3b3JkLCBuYiwgYml0bm87Ci0JdTMyIG1hc2s7Ci0KLQlhc3NlcnQoYmxrbm8gPiAwICYmIGJsa25vIDwgbWFwc2l6ZSk7Ci0JYXNzZXJ0KG5ibG9ja3MgPiAwICYmIG5ibG9ja3MgPD0gbWFwc2l6ZSk7Ci0KLQlhc3NlcnQoYmxrbm8gKyBuYmxvY2tzIDw9IG1hcHNpemUpOwotCi0JZGJtYXAgKz0gKGJsa25vIC8gMzIpOwotCXdoaWxlIChuYmxvY2tzID4gMCkgewotCQliaXRubyA9IGJsa25vICYgKDMyIC0gMSk7Ci0JCW5iID0gbWluKG5ibG9ja3MsIDMyIC0gYml0bm8pOwotCi0JCW1hc2sgPSAoMHhmZmZmZmZmZiA8PCAoMzIgLSBuYikgPj4gYml0bm8pOwotCQlhc3NlcnQoKG1hc2sgJiAqZGJtYXApID09IG1hc2spOwotCQkqZGJtYXAgJj0gfm1hc2s7Ci0KLQkJZGJtYXArKzsKLQkJYmxrbm8gKz0gbmI7Ci0JCW5ibG9ja3MgLT0gbmI7Ci0JfQotfQotCi0KLS8qCi0gKglEQkFsbG9jQ0soKQotICovCi1zdGF0aWMgdm9pZCBEQkFsbG9jQ0sodWludCAqIGRibWFwLCBzNjQgbWFwc2l6ZSwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKLXsKLQlpbnQgd29yZCwgbmIsIGJpdG5vOwotCXUzMiBtYXNrOwotCi0JYXNzZXJ0KGJsa25vID4gMCAmJiBibGtubyA8IG1hcHNpemUpOwotCWFzc2VydChuYmxvY2tzID4gMCAmJiBuYmxvY2tzIDw9IG1hcHNpemUpOwotCi0JYXNzZXJ0KGJsa25vICsgbmJsb2NrcyA8PSBtYXBzaXplKTsKLQotCWRibWFwICs9IChibGtubyAvIDMyKTsKLQl3aGlsZSAobmJsb2NrcyA+IDApIHsKLQkJYml0bm8gPSBibGtubyAmICgzMiAtIDEpOwotCQluYiA9IG1pbihuYmxvY2tzLCAzMiAtIGJpdG5vKTsKLQotCQltYXNrID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbmIpID4+IGJpdG5vKTsKLQkJYXNzZXJ0KChtYXNrICYgKmRibWFwKSA9PSBtYXNrKTsKLQotCQlkYm1hcCsrOwotCQlibGtubyArPSBuYjsKLQkJbmJsb2NrcyAtPSBuYjsKLQl9Ci19Ci0KLQotLyoKLSAqCURCRnJlZUNLKCkKLSAqLwotc3RhdGljIHZvaWQgREJGcmVlQ0sodWludCAqIGRibWFwLCBzNjQgbWFwc2l6ZSwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKLXsKLQlpbnQgd29yZCwgbmIsIGJpdG5vOwotCXUzMiBtYXNrOwotCi0JYXNzZXJ0KGJsa25vID4gMCAmJiBibGtubyA8IG1hcHNpemUpOwotCWFzc2VydChuYmxvY2tzID4gMCAmJiBuYmxvY2tzIDw9IG1hcHNpemUpOwotCi0JYXNzZXJ0KGJsa25vICsgbmJsb2NrcyA8PSBtYXBzaXplKTsKLQotCWRibWFwICs9IChibGtubyAvIDMyKTsKLQl3aGlsZSAobmJsb2NrcyA+IDApIHsKLQkJYml0bm8gPSBibGtubyAmICgzMiAtIDEpOwotCQluYiA9IG1pbihuYmxvY2tzLCAzMiAtIGJpdG5vKTsKLQotCQltYXNrID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbmIpID4+IGJpdG5vKTsKLQkJYXNzZXJ0KChtYXNrICYgKmRibWFwKSA9PSAwKTsKLQotCQlkYm1hcCsrOwotCQlibGtubyArPSBuYjsKLQkJbmJsb2NrcyAtPSBuYjsKLQl9Ci19Ci0KLQotLyoKLSAqCWRiUHJ0TWFwKCkKLSAqLwotc3RhdGljIHZvaWQgZGJQcnRNYXAoc3RydWN0IGJtYXAgKiBibXApCi17Ci0JcHJpbnRrKCIgICBtYXBzaXplOiAgICVkJWRcbiIsIGJtcC0+ZGJfbWFwc2l6ZSk7Ci0JcHJpbnRrKCIgICBuZnJlZTogICAgICVkJWRcbiIsIGJtcC0+ZGJfbmZyZWUpOwotCXByaW50aygiICAgbnVtYWc6ICAgICAlZFxuIiwgYm1wLT5kYl9udW1hZyk7Ci0JcHJpbnRrKCIgICBhZ3NpemU6ICAgICVkJWRcbiIsIGJtcC0+ZGJfYWdzaXplKTsKLQlwcmludGsoIiAgIGFnbDJzaXplOiAgJWRcbiIsIGJtcC0+ZGJfYWdsMnNpemUpOwotCXByaW50aygiICAgYWd3aWR0aDogICAlZFxuIiwgYm1wLT5kYl9hZ3dpZHRoKTsKLQlwcmludGsoIiAgIGFnc3RhcnQ6ICAgJWRcbiIsIGJtcC0+ZGJfYWdzdGFydCk7Ci0JcHJpbnRrKCIgICBhZ2hlaWd0aDogICVkXG4iLCBibXAtPmRiX2FnaGVpZ3RoKTsKLQlwcmludGsoIiAgIGFnbGV2ZWw6ICAgJWRcbiIsIGJtcC0+ZGJfYWdsZXZlbCk7Ci0JcHJpbnRrKCIgICBtYXhsZXZlbDogICVkXG4iLCBibXAtPmRiX21heGxldmVsKTsKLQlwcmludGsoIiAgIG1heGFnOiAgICAgJWRcbiIsIGJtcC0+ZGJfbWF4YWcpOwotCXByaW50aygiICAgYWdwcmVmOiAgICAlZFxuIiwgYm1wLT5kYl9hZ3ByZWYpOwotCXByaW50aygiICAgbDJuYnBwZzogICAlZFxuIiwgYm1wLT5kYl9sMm5icGVycGFnZSk7Ci19Ci0KLQotLyoKLSAqCWRiUHJ0Q3RsKCkKLSAqLwotc3RhdGljIHZvaWQgZGJQcnRDdGwoc3RydWN0IGRtYXBjdGwgKiBkY3ApCi17Ci0JaW50IGksIGosIG47Ci0KLQlwcmludGsoIiAgIGhlaWdodDogICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5oZWlnaHQpKTsKLQlwcmludGsoIiAgIGxlYWZpZHg6ICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5sZWFmaWR4KSk7Ci0JcHJpbnRrKCIgICBidWRtaW46ICAgICUwOHhcbiIsIGRjcC0+YnVkbWluKTsKLQlwcmludGsoIiAgIG5sZWFmczogICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5ubGVhZnMpKTsKLQlwcmludGsoIiAgIGwybmxlYWZzOiAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5sMm5sZWFmcykpOwotCi0JcHJpbnRrKCJcbiBUcmVlOlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IENUTExFQUZJTkQ7IGkgKz0gOCkgewotCQluID0gbWluKDgsIENUTExFQUZJTkQgLSBpKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKQotCQkJcHJpbnRmKCIgIFslMDN4XTogJTAyeCIsIGkgKyBqLAotCQkJICAgICAgIChjaGFyKSBkY3AtPnN0cmVlW2kgKyBqXSk7Ci0JCXByaW50ZigiXG4iKTsKLQl9Ci0KLQlwcmludGsoIlxuIFRyZWUgTGVhdmVzOlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IExQRVJDVEw7IGkgKz0gOCkgewotCQluID0gbWluKDgsIExQRVJDVEwgLSBpKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKQotCQkJcHJpbnRmKCIgIFslMDN4XTogJTAyeCIsCi0JCQkgICAgICAgaSArIGosCi0JCQkgICAgICAgKGNoYXIpIGRjcC0+c3RyZWVbaSArIGogKyBDVExMRUFGSU5EXSk7Ci0JCXByaW50ZigiXG4iKTsKLQl9Ci19Ci0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19ETUFQICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2R0cmVlLmMgYi9mcy9qZnMvamZzX2R0cmVlLmMKaW5kZXggODY3NmFlZS4uNzNiNWZjNyAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19kdHJlZS5jCisrKyBiL2ZzL2pmcy9qZnNfZHRyZWUuYwpAQCAtNDU1NCwyMDIgKzQ1NTQsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLSNpZmRlZiBfSkZTX0RFQlVHX0RUUkVFCi0vKgotICoJZHREaXNwbGF5VHJlZSgpCi0gKgotICogZnVuY3Rpb246IHRyYXZlcnNlIGZvcndhcmQKLSAqLwotaW50IGR0RGlzcGxheVRyZWUoc3RydWN0IGlub2RlICppcCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1ldGFwYWdlICptcDsKLQlkdHBhZ2VfdCAqcDsKLQlzNjQgYm4sIHBibjsKLQlpbnQgaW5kZXgsIGxhc3RpbmRleCwgdiwgaDsKLQlweGRfdCAqeGQ7Ci0Jc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKLQlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKLQlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OwotCXU4ICpzdGJsOwotCWludCBwc2l6ZSA9IDI1NjsKLQotCXByaW50aygiZGlzcGxheSBCKy10cmVlLlxuIik7Ci0KLQkvKiBjbGVhciBzdGFjayAqLwotCWJ0c3AgPSBidHN0YWNrLnN0YWNrOwotCi0JLyoKLQkgKiBzdGFydCB3aXRoIHJvb3QKLQkgKgotCSAqIHJvb3QgcmVzaWRlcyBpbiB0aGUgaW5vZGUKLQkgKi8KLQlibiA9IDA7Ci0JdiA9IGggPSAwOwotCi0JLyoKLQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBwYWdlOgotCSAqLwotICAgICAgbmV3UGFnZToKLQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBwcm9jZXNzIGVudHJpZXMgZm9yd2FyZCBmcm9tIGZpcnN0IGluZGV4ICovCi0JaW5kZXggPSAwOwotCWxhc3RpbmRleCA9IHAtPmhlYWRlci5uZXh0aW5kZXggLSAxOwotCi0JaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKLQkJLyoKLQkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgcGFnZQotCQkgKi8KLQkJcHJpbnRmKCJpbnRlcm5hbCBwYWdlICIpOwotCQlkdERpc3BsYXlQYWdlKGlwLCBibiwgcCk7Ci0KLQkJZ290byBnZXRDaGlsZDsKLQl9IGVsc2UgewkJLyogKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgKi8KLQotCQkvKgotCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBsZWFmIHBhZ2UKLQkJICovCi0JCXByaW50ZigibGVhZiBwYWdlICIpOwotCQlkdERpc3BsYXlQYWdlKGlwLCBibiwgcCk7Ci0KLQkJLyoKLQkJICogcHJvY2VzcyBsZWFmIHBhZ2UgZW50cmllcwotCQkgKgotCQkgZm9yICggOyBpbmRleCA8PSBsYXN0aW5kZXg7IGluZGV4KyspCi0JCSB7Ci0JCSB9Ci0JCSAqLwotCi0JCS8qIHVucGluIHRoZSBsZWFmIHBhZ2UgKi8KLQkJRFRfUFVUUEFHRShtcCk7Ci0JfQotCi0JLyoKLQkgKiBnbyBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgcGFnZQotCSAqLwotICAgICAgZ2V0UGFyZW50OgotCS8qIHBvcC9yZXN0b3JlIHBhcmVudCBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgY2hpbGQgcGFnZSAqLwotCWlmICgocGFyZW50ID0gKGJ0c3AgPT0gYnRzdGFjay5zdGFjayA/IE5VTEwgOiAtLWJ0c3ApKSA9PSBOVUxMKQotCQkvKiBjdXJyZW50IHBhZ2UgbXVzdCBoYXZlIGJlZW4gcm9vdCAqLwotCQlyZXR1cm47Ci0KLQkvKgotCSAqIHBhcmVudCBwYWdlIHNjYW4gY29tcGxldGVkCi0JICovCi0JaWYgKChpbmRleCA9IHBhcmVudC0+aW5kZXgpID09IChsYXN0aW5kZXggPSBwYXJlbnQtPmxhc3RpbmRleCkpIHsKLQkJLyogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UgKi8KLQkJZ290byBnZXRQYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiBwYXJlbnQgcGFnZSBoYXMgZW50cmllcyByZW1haW5pbmcKLQkgKi8KLQkvKiBnZXQgYmFjayB0aGUgcGFyZW50IHBhZ2UgKi8KLQlibiA9IHBhcmVudC0+Ym47Ci0JLyogdiA9IHBhcmVudC0+bGV2ZWw7ICovCi0JRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JLyogZ2V0IG5leHQgcGFyZW50IGVudHJ5ICovCi0JaW5kZXgrKzsKLQotCS8qCi0JICogaW50ZXJuYWwgcGFnZTogZ28gZG93biB0byBjaGlsZCBwYWdlIG9mIGN1cnJlbnQgZW50cnkKLQkgKi8KLSAgICAgIGdldENoaWxkOgotCS8qIHB1c2gvc2F2ZSBjdXJyZW50IHBhcmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KLQlidHNwLT5ibiA9IHBibiA9IGJuOwotCWJ0c3AtPmluZGV4ID0gaW5kZXg7Ci0JYnRzcC0+bGFzdGluZGV4ID0gbGFzdGluZGV4OwotCS8qIGJ0c3AtPmxldmVsID0gdjsgKi8KLQkvKiBidHNwLT5ub2RlID0gaDsgKi8KLQkrK2J0c3A7Ci0KLQkvKiBnZXQgY3VycmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KLQlzdGJsID0gRFRfR0VUU1RCTChwKTsKLQl4ZCA9IChweGRfdCAqKSAmIHAtPnNsb3Rbc3RibFtpbmRleF1dOwotCi0JLyoKLQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBlbnRyeToKLQkgKi8KLQotCS8qIGdldCBjaGlsZCBwYWdlICovCi0JYm4gPSBhZGRyZXNzUFhEKHhkKTsKLQlwc2l6ZSA9IGxlbmd0aFBYRCh4ZCkgPDwgaXAtPmlfaXBtbnQtPmlfbDJic2l6ZTsKLQotCXByaW50aygidHJhdmVyc2UgZG93biAweCVMeFslZF0tPjB4JUx4XG4iLCBwYm4sIGluZGV4LCBibik7Ci0JdisrOwotCWggPSBpbmRleDsKLQotCS8qIHJlbGVhc2UgcGFyZW50IHBhZ2UgKi8KLQlEVF9QVVRQQUdFKG1wKTsKLQotCS8qIHByb2Nlc3MgdGhlIGNoaWxkIHBhZ2UgKi8KLQlnb3RvIG5ld1BhZ2U7Ci19Ci0KLQotLyoKLSAqCWR0RGlzcGxheVBhZ2UoKQotICoKLSAqIGZ1bmN0aW9uOiBkaXNwbGF5IHBhZ2UKLSAqLwotaW50IGR0RGlzcGxheVBhZ2Uoc3RydWN0IGlub2RlICppcCwgczY0IGJuLCBkdHBhZ2VfdCAqIHApCi17Ci0JaW50IHJjOwotCXN0cnVjdCBtZXRhcGFnZSAqbXA7Ci0Jc3RydWN0IGxkdGVudHJ5ICpsaDsKLQlzdHJ1Y3QgaWR0ZW50cnkgKmloOwotCXB4ZF90ICp4ZDsKLQlpbnQgaSwgajsKLQl1OCAqc3RibDsKLQl3Y2hhcl90IG5hbWVbSkZTX05BTUVfTUFYICsgMV07Ci0Jc3RydWN0IGNvbXBvbmVudF9uYW1lIGtleSA9IHsgMCwgbmFtZSB9OwotCWludCBmcmVlcGFnZSA9IDA7Ci0KLQlpZiAocCA9PSBOVUxMKSB7Ci0JCWZyZWVwYWdlID0gMTsKLQkJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogZGlzcGxheSBwYWdlIGNvbnRyb2wgKi8KLQlwcmludGsoImJuOjB4JUx4IGZsYWc6MHglMDh4IG5leHRpbmRleDolZFxuIiwKLQkgICAgICAgYm4sIHAtPmhlYWRlci5mbGFnLCBwLT5oZWFkZXIubmV4dGluZGV4KTsKLQotCS8qIGRpc3BsYXkgZW50cmllcyAqLwotCXN0YmwgPSBEVF9HRVRTVEJMKHApOwotCWZvciAoaSA9IDAsIGogPSAxOyBpIDwgcC0+aGVhZGVyLm5leHRpbmRleDsgaSsrLCBqKyspIHsKLQkJZHRHZXRLZXkocCwgaSwgJmtleSwgSkZTX1NCSShpcC0+aV9zYiktPm1udGZsYWcpOwotCQlrZXkubmFtZVtrZXkubmFtbGVuXSA9ICdcMCc7Ci0JCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKLQkJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc3RibFtpXV07Ci0JCQlwcmludGYoIlx0WyVkXSAlczolZCIsIGksIGtleS5uYW1lLAotCQkJICAgICAgIGxlMzJfdG9fY3B1KGxoLT5pbnVtYmVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpaCA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgJiBwLT5zbG90W3N0YmxbaV1dOwotCQkJeGQgPSAocHhkX3QgKikgaWg7Ci0JCQlibiA9IGFkZHJlc3NQWEQoeGQpOwotCQkJcHJpbnRmKCJcdFslZF0gJXM6MHglTHgiLCBpLCBrZXkubmFtZSwgYm4pOwotCQl9Ci0KLQkJaWYgKGogPT0gNCkgewotCQkJcHJpbnRmKCJcbiIpOwotCQkJaiA9IDA7Ci0JCX0KLQl9Ci0KLQlwcmludGYoIlxuIik7Ci0KLQlpZiAoZnJlZXBhZ2UpCi0JCURUX1BVVFBBR0UobXApOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19EVFJFRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19kdHJlZS5oIGIvZnMvamZzL2pmc19kdHJlZS5oCmluZGV4IDI3M2E4MDEuLjEzZTRmZGYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfZHRyZWUuaAorKysgYi9mcy9qZnMvamZzX2R0cmVlLmgKQEAgLTI2OSwxMSArMjY5LDQgQEAKIAkJICAgIGlub190ICogb3JpZ19pbm8sIGlub190IG5ld19pbm8sIGludCBmbGFnKTsKIAogZXh0ZXJuIGludCBqZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7Ci0KLSNpZmRlZiAgX0pGU19ERUJVR19EVFJFRQotZXh0ZXJuIGludCBkdERpc3BsYXlUcmVlKHN0cnVjdCBpbm9kZSAqaXApOwotCi1leHRlcm4gaW50IGR0RGlzcGxheVBhZ2Uoc3RydWN0IGlub2RlICppcCwgczY0IGJuLCBkdHBhZ2VfdCAqIHApOwotI2VuZGlmCQkJCS8qIF9KRlNfREVCVUdfRFRSRUUgKi8KLQogI2VuZGlmCQkJCS8qICFfSF9KRlNfRFRSRUUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW1hcC5jIGIvZnMvamZzL2pmc19pbWFwLmMKaW5kZXggOTcxYWYyOS4uNDAyMWQ0NiAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbWFwLmMKKysrIGIvZnMvamZzL2pmc19pbWFwLmMKQEAgLTg3LDI1ICs4Nyw2IEBACiBzdGF0aWMgdm9pZCBjb3B5X3RvX2Rpbm9kZShzdHJ1Y3QgZGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKIAogLyoKLSAqCWRlYnVnIGNvZGUgZm9yIGRvdWJsZS1jaGVja2luZyBpbm9kZSBtYXAKLSAqLwotLyogI2RlZmluZQlfSkZTX0RFQlVHX0lNQVAJMSAqLwotCi0jaWZkZWYJX0pGU19ERUJVR19JTUFQCi0jZGVmaW5lIERCR19ESUlOSVQoaW1hcCkJREJHZGlJbml0KGltYXApCi0jZGVmaW5lIERCR19ESUFMTE9DKGltYXAsIGlubykJREJHZGlBbGxvYyhpbWFwLCBpbm8pCi0jZGVmaW5lIERCR19ESUZSRUUoaW1hcCwgaW5vKQlEQkdkaUZyZWUoaW1hcCwgaW5vKQotCi1zdGF0aWMgdm9pZCAqREJHZGlJbml0KHN0cnVjdCBpbm9tYXAgKiBpbWFwKTsKLXN0YXRpYyB2b2lkIERCR2RpQWxsb2Moc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubyk7Ci1zdGF0aWMgdm9pZCBEQkdkaUZyZWUoc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubyk7Ci0jZWxzZQotI2RlZmluZSBEQkdfRElJTklUKGltYXApCi0jZGVmaW5lIERCR19ESUFMTE9DKGltYXAsIGlubykKLSNkZWZpbmUgREJHX0RJRlJFRShpbWFwLCBpbm8pCi0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19JTUFQICovCi0KLS8qCiAgKiBOQU1FOiAgICAgICAgZGlNb3VudCgpCiAgKgogICogRlVOQ1RJT046ICAgIGluaXRpYWxpemUgdGhlIGluY29yZSBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmVzIGZvcgpAQCAtMTg4LDggKzE2OSw2IEBACiAJaW1hcC0+aW1faXBpbWFwID0gaXBpbWFwOwogCUpGU19JUChpcGltYXApLT5pX2ltYXAgPSBpbWFwOwogCi0vLyAgICAgIERCR19ESUlOSVQoaW1hcCk7Ci0KIAlyZXR1cm4gKDApOwogfQogCkBAIC0xMDQzLDcgKzEwMjIsNiBAQAogCQkvKiB1cGRhdGUgdGhlIGJpdG1hcC4KIAkJICovCiAJCWlhZ3AtPndtYXBbZXh0bm9dID0gY3B1X3RvX2xlMzIoYml0bWFwKTsKLQkJREJHX0RJRlJFRShpbWFwLCBpbnVtKTsKIAogCQkvKiB1cGRhdGUgdGhlIGZyZWUgaW5vZGUgY291bnRzIGF0IHRoZSBpYWcsIGFnIGFuZAogCQkgKiBtYXAgbGV2ZWwuCkBAIC0xMjMxLDcgKzEyMDksNiBAQAogCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUZyZWU6IHRoZSBwbWFwIGRvZXMgbm90IHNob3cgaW5vZGUgZnJlZSIpOwogCX0KIAlpYWdwLT53bWFwW2V4dG5vXSA9IDA7Ci0JREJHX0RJRlJFRShpbWFwLCBpbnVtKTsKIAlQWERsZW5ndGgoJmlhZ3AtPmlub2V4dFtleHRub10sIDApOwogCVBYRGFkZHJlc3MoJmlhZ3AtPmlub2V4dFtleHRub10sIDApOwogCkBAIC0xMzUwLDcgKzEzMjcsNiBAQAogCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKIAogCWlwLT5pX2lubyA9IChpYWdubyA8PCBMMklOT1NQRVJJQUcpICsgaW5vOwotCURCR19ESUFMTE9DKEpGU19JUChpcGltYXApLT5pX2ltYXAsIGlwLT5pX2lubyk7CiAJamZzX2lwLT5peHB4ZCA9IGlhZ3AtPmlub2V4dFtleHRub107CiAJamZzX2lwLT5hZ25vID0gQkxLVE9BRyhsZTY0X3RvX2NwdShpYWdwLT5hZ3N0YXJ0KSwgc2JpKTsKIAlqZnNfaXAtPmFjdGl2ZV9hZyA9IC0xOwpAQCAtMzE4NSw4NCArMzE2MSwzIEBACiAJaWYgKFNfSVNDSFIoaXAtPmlfbW9kZSkgfHwgU19JU0JMSyhpcC0+aV9tb2RlKSkKIAkJZGlwLT5kaV9yZGV2ID0gY3B1X3RvX2xlMzIoamZzX2lwLT5kZXYpOwogfQotCi0jaWZkZWYJX0pGU19ERUJVR19JTUFQCi0vKgotICoJREJHZGlJbml0KCkKLSAqLwotc3RhdGljIHZvaWQgKkRCR2RpSW5pdChzdHJ1Y3QgaW5vbWFwICogaW1hcCkKLXsKLQl1MzIgKmRpbWFwOwotCWludCBzaXplOwotCXNpemUgPSA2NCAqIDEwMjQ7Ci0JaWYgKChkaW1hcCA9ICh1MzIgKikgeG1hbGxvYyhzaXplLCBMMlBTSVpFLCBrZXJuZWxfaGVhcCkpID09IE5VTEwpCi0JCWFzc2VydCgwKTsKLQliemVybygodm9pZCAqKSBkaW1hcCwgc2l6ZSk7Ci0JaW1hcC0+aW1fREJHZGltYXAgPSBkaW1hcDsKLX0KLQotLyoKLSAqCURCR2RpQWxsb2MoKQotICovCi1zdGF0aWMgdm9pZCBEQkdkaUFsbG9jKHN0cnVjdCBpbm9tYXAgKiBpbWFwLCBpbm9fdCBpbm8pCi17Ci0JdTMyICpkaW1hcCA9IGltYXAtPmltX0RCR2RpbWFwOwotCWludCB3LCBiOwotCXUzMiBtOwotCXcgPSBpbm8gPj4gNTsKLQliID0gaW5vICYgMzE7Ci0JbSA9IDB4ODAwMDAwMDAgPj4gYjsKLQlhc3NlcnQodyA8IDY0ICogMjU2KTsKLQlpZiAoZGltYXBbd10gJiBtKSB7Ci0JCXByaW50aygiREVCVUcgZGlBbGxvYzogZHVwbGljYXRlIGFsbG9jIGlubzoweCV4XG4iLCBpbm8pOwotCX0KLQlkaW1hcFt3XSB8PSBtOwotfQotCi0vKgotICoJREJHZGlGcmVlKCkKLSAqLwotc3RhdGljIHZvaWQgREJHZGlGcmVlKHN0cnVjdCBpbm9tYXAgKiBpbWFwLCBpbm9fdCBpbm8pCi17Ci0JdTMyICpkaW1hcCA9IGltYXAtPmltX0RCR2RpbWFwOwotCWludCB3LCBiOwotCXUzMiBtOwotCXcgPSBpbm8gPj4gNTsKLQliID0gaW5vICYgMzE7Ci0JbSA9IDB4ODAwMDAwMDAgPj4gYjsKLQlhc3NlcnQodyA8IDY0ICogMjU2KTsKLQlpZiAoKGRpbWFwW3ddICYgbSkgPT0gMCkgewotCQlwcmludGsoIkRFQlVHIGRpRnJlZTogZHVwbGljYXRlIGZyZWUgaW5vOjB4JXhcbiIsIGlubyk7Ci0JfQotCWRpbWFwW3ddICY9IH5tOwotfQotCi1zdGF0aWMgdm9pZCBkdW1wX2NwKHN0cnVjdCBpbm9tYXAgKiBpcGltYXAsIGNoYXIgKmZ1bmN0aW9uLCBpbnQgbGluZSkKLXsKLQlwcmludGsoIlxuKiAqKioqKioqKiogKlxuQ29udHJvbCBQYWdlICVzICVkXG4iLCBmdW5jdGlvbiwgbGluZSk7Ci0JcHJpbnRrKCJGcmVlSUFHICVkXHROZXh0SUFHICVkXG4iLCBpcGltYXAtPmltX2ZyZWVpYWcsCi0JICAgICAgIGlwaW1hcC0+aW1fbmV4dGlhZyk7Ci0JcHJpbnRrKCJOdW1Jbm9zICVkXHROdW1GcmVlICVkXG4iLAotCSAgICAgICBhdG9taWNfcmVhZCgmaXBpbWFwLT5pbV9udW1pbm9zKSwKLQkgICAgICAgYXRvbWljX3JlYWQoJmlwaW1hcC0+aW1fbnVtZnJlZSkpOwotCXByaW50aygiQUcgSW5vRnJlZSAlZFx0QUcgRXh0RnJlZSAlZFxuIiwKLQkgICAgICAgaXBpbWFwLT5pbV9hZ2N0bFswXS5pbm9mcmVlLCBpcGltYXAtPmltX2FnY3RsWzBdLmV4dGZyZWUpOwotCXByaW50aygiQUcgTnVtSW5vcyAlZFx0QUcgTnVtRnJlZSAlZFxuIiwKLQkgICAgICAgaXBpbWFwLT5pbV9hZ2N0bFswXS5udW1pbm9zLCBpcGltYXAtPmltX2FnY3RsWzBdLm51bWZyZWUpOwotfQotCi1zdGF0aWMgdm9pZCBkdW1wX2lhZyhzdHJ1Y3QgaWFnICogaWFnLCBjaGFyICpmdW5jdGlvbiwgaW50IGxpbmUpCi17Ci0JcHJpbnRrKCJcbiogKioqKioqKioqICpcbklBRyAlcyAlZFxuIiwgZnVuY3Rpb24sIGxpbmUpOwotCXByaW50aygiSWFnTnVtICVkXHRJQUcgRnJlZSAlZFxuIiwgbGUzMl90b19jcHUoaWFnLT5pYWdudW0pLAotCSAgICAgICBsZTMyX3RvX2NwdShpYWctPmlhZ2ZyZWUpKTsKLQlwcmludGsoIklub0ZyZWVGd2QgJWRcdElub0ZyZWVCYWNrICVkXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdShpYWctPmlub2ZyZWVmd2QpLAotCSAgICAgICBsZTMyX3RvX2NwdShpYWctPmlub2ZyZWViYWNrKSk7Ci0JcHJpbnRrKCJFeHRGcmVlRndkICVkXHRFeHRGcmVlQmFjayAlZFxuIiwKLQkgICAgICAgbGUzMl90b19jcHUoaWFnLT5leHRmcmVlZndkKSwKLQkgICAgICAgbGUzMl90b19jcHUoaWFnLT5leHRmcmVlYmFjaykpOwotCXByaW50aygiTkZyZWVJbm9zICVkXHRORnJlZUV4dHMgJWRcbiIsIGxlMzJfdG9fY3B1KGlhZy0+bmZyZWVpbm9zKSwKLQkgICAgICAgbGUzMl90b19jcHUoaWFnLT5uZnJlZWV4dHMpKTsKLX0KLSNlbmRpZgkJCQkvKiBfSkZTX0RFQlVHX0lNQVAgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdW5pY29kZS5jIGIvZnMvamZzL2pmc191bmljb2RlLmMKaW5kZXggYjMyMjA4YWEuLmYzMjdkZWMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfdW5pY29kZS5jCisrKyBiL2ZzL2pmcy9qZnNfdW5pY29kZS5jCkBAIC01MSw4ICs1MSw5IEBACiAJCX0KIAl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyAoaSA8IGxlbikgJiYgZnJvbVtpXTsgaSsrKSB7Ci0JCQlpZiAobGUxNl90b19jcHUoZnJvbVtpXSkgJiAweGZmMDApIHsKLQkJCQlpZiAod2FybikgeworCQkJaWYgKHVubGlrZWx5KGxlMTZfdG9fY3B1KGZyb21baV0pICYgMHhmZjAwKSkgeworCQkJCXRvW2ldID0gJz8nOworCQkJCWlmICh1bmxpa2VseSh3YXJuKSkgewogCQkJCQl3YXJuLS07CiAJCQkJCXdhcm5fYWdhaW4tLTsKIAkJCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC02MSw3ICs2Miw3IEBACiAJCQkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJtb3VudCB3aXRoIGlvY2hhcnNldD11dGY4IHRvIGFjY2Vzc1xuIik7CiAJCQkJfQotCQkJCXRvW2ldID0gJz8nOworCiAJCQl9CiAJCQllbHNlCiAJCQkJdG9baV0gPSAoY2hhcikgKGxlMTZfdG9fY3B1KGZyb21baV0pKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfeHRyZWUuYyBiL2ZzL2pmcy9qZnNfeHRyZWUuYwppbmRleCAzMWIzNGRiLi5hN2ZlMmYyIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX3h0cmVlLmMKKysrIGIvZnMvamZzL2pmc194dHJlZS5jCkBAIC0xMzUsMTQgKzEzNSw2IEBACiBzdGF0aWMgaW50IHh0UmVsaW5rKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgeHRwYWdlX3QgKiBmcCk7CiAjZW5kaWYJCQkJLyogIF9TVElMTF9UT19QT1JUICovCiAKLS8qIEV4dGVybmFsIHJlZmVyZW5jZXMgKi8KLQotLyoKLSAqICAgICAgZGVidWcgY29udHJvbAotICovCi0vKiAgICAgICNkZWZpbmUgX0pGU19ERUJVR19YVFJFRSAgICAgICAgMSAqLwotCi0KIC8qCiAgKiAgICAgIHh0TG9va3VwKCkKICAqCkBAIC00MTQwLDMzOCArNDEzMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotI2lmZGVmIF9KRlNfREVCVUdfWFRSRUUKLS8qCi0gKiAgICAgIHh0RGlzcGxheVRyZWUoKQotICoKLSAqIGZ1bmN0aW9uOiB0cmF2ZXJzZSBmb3J3YXJkCi0gKi8KLWludCB4dERpc3BsYXlUcmVlKHN0cnVjdCBpbm9kZSAqaXApCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwotCXh0cGFnZV90ICpwOwotCXM2NCBibiwgcGJuOwotCWludCBpbmRleCwgbGFzdGluZGV4LCB2LCBoOwotCXhhZF90ICp4YWQ7Ci0Jc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKLQlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKLQlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OwotCi0JcHJpbnRrKCJkaXNwbGF5IEIrLXRyZWUuXG4iKTsKLQotCS8qIGNsZWFyIHN0YWNrICovCi0JYnRzcCA9IGJ0c3RhY2suc3RhY2s7Ci0KLQkvKgotCSAqIHN0YXJ0IHdpdGggcm9vdAotCSAqCi0JICogcm9vdCByZXNpZGVzIGluIHRoZSBpbm9kZQotCSAqLwotCWJuID0gMDsKLQl2ID0gaCA9IDA7Ci0KLQkvKgotCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6Ci0JICovCi0gICAgICBnZXRQYWdlOgotCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIHByb2Nlc3MgZW50cmllcyBmb3J3YXJkIGZyb20gZmlyc3QgaW5kZXggKi8KLQlpbmRleCA9IFhURU5UUllTVEFSVDsKLQlsYXN0aW5kZXggPSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIDE7Ci0KLQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9JTlRFUk5BTCkgewotCQkvKgotCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBwYWdlCi0JCSAqLwotCQlnb3RvIGdldENoaWxkOwotCX0gZWxzZSB7CQkvKiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSAqLwotCi0JCS8qCi0JCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGxlYWYgcGFnZQotCQkgKi8KLQkJcHJpbnRmKCJsZWFmIHBhZ2UgIik7Ci0JCXh0RGlzcGxheVBhZ2UoaXAsIGJuLCBwKTsKLQotCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCi0JCVhUX1BVVFBBR0UobXApOwotCX0KLQotCS8qCi0JICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKLQkgKi8KLSAgICAgIGdldFBhcmVudDoKLQkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KLQlpZiAoKHBhcmVudCA9IChidHNwID09IGJ0c3RhY2suc3RhY2sgPyBOVUxMIDogLS1idHNwKSkgPT0gTlVMTCkKLQkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAotCSAqLwotCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSAobGFzdGluZGV4ID0gcGFyZW50LT5sYXN0aW5kZXgpKSB7Ci0JCS8qIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlICovCi0JCWdvdG8gZ2V0UGFyZW50OwotCX0KLQotCS8qCi0JICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCi0JICovCi0JLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCi0JYm4gPSBwYXJlbnQtPmJuOwotCS8qIHYgPSBwYXJlbnQtPmxldmVsOyAqLwotCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIGdldCBuZXh0IHBhcmVudCBlbnRyeSAqLwotCWluZGV4Kys7Ci0KLQkvKgotCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5Ci0JICovCi0gICAgICBnZXRDaGlsZDoKLQkvKiBwdXNoL3NhdmUgY3VycmVudCBwYXJlbnQgZW50cnkgZm9yIHRoZSBjaGlsZCBwYWdlICovCi0JYnRzcC0+Ym4gPSBwYm4gPSBibjsKLQlidHNwLT5pbmRleCA9IGluZGV4OwotCWJ0c3AtPmxhc3RpbmRleCA9IGxhc3RpbmRleDsKLQkvKiBidHNwLT5sZXZlbCA9IHY7ICovCi0JLyogYnRzcC0+bm9kZSA9IGg7ICovCi0JKytidHNwOwotCi0JLyogZ2V0IGNoaWxkIHBhZ2UgKi8KLQl4YWQgPSAmcC0+eGFkW2luZGV4XTsKLQlibiA9IGFkZHJlc3NYQUQoeGFkKTsKLQotCS8qCi0JICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgZW50cnk6Ci0JICovCi0JLyogcmVsZWFzZSBwYXJlbnQgcGFnZSAqLwotCVhUX1BVVFBBR0UobXApOwotCi0JcHJpbnRrKCJ0cmF2ZXJzZSBkb3duIDB4JWx4WyVkXS0+MHglbHhcbiIsICh1bG9uZykgcGJuLCBpbmRleCwKLQkgICAgICAgKHVsb25nKSBibik7Ci0JdisrOwotCWggPSBpbmRleDsKLQotCS8qIHByb2Nlc3MgdGhlIGNoaWxkIHBhZ2UgKi8KLQlnb3RvIGdldFBhZ2U7Ci19Ci0KLQotLyoKLSAqICAgICAgeHREaXNwbGF5UGFnZSgpCi0gKgotICogZnVuY3Rpb246IGRpc3BsYXkgcGFnZQotICovCi1pbnQgeHREaXNwbGF5UGFnZShzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYm4sIHh0cGFnZV90ICogcCkKLXsKLQlpbnQgcmMgPSAwOwotCXhhZF90ICp4YWQ7Ci0JczY0IHhhZGRyLCB4b2ZmOwotCWludCB4bGVuLCBpLCBqOwotCi0JLyogZGlzcGxheSBwYWdlIGNvbnRyb2wgKi8KLQlwcmludGYoImJuOjB4JWx4IGZsYWc6MHgleCBuZXh0aW5kZXg6JWRcbiIsCi0JICAgICAgICh1bG9uZykgYm4sIHAtPmhlYWRlci5mbGFnLAotCSAgICAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSk7Ci0KLQkvKiBkaXNwbGF5IGVudHJpZXMgKi8KLQl4YWQgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07Ci0JCWZvciAoaSA9IFhURU5UUllTVEFSVCwgaiA9IDE7IGkgPCBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KTsKLQkJICAgICBpKyssIHhhZCsrLCBqKyspIHsKLQkJCXhvZmYgPSBvZmZzZXRYQUQoeGFkKTsKLQkJCXhhZGRyID0gYWRkcmVzc1hBRCh4YWQpOwotCQkJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOwotCQkJcHJpbnRmKCJcdFslZF0gMHglbHg6MHglbHgoMHgleCkiLCBpLCAodWxvbmcpIHhvZmYsCi0JCQkgICAgICAgKHVsb25nKSB4YWRkciwgeGxlbik7Ci0KLQkJCWlmIChqID09IDQpIHsKLQkJCQlwcmludGYoIlxuIik7Ci0JCQkJaiA9IDA7Ci0JCX0KLQl9Ci0KLQlwcmludGYoIlxuIik7Ci19Ci0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19YVFJFRSAqLwotCi0KLSNpZmRlZiBfSkZTX1dJUAotLyoKLSAqICAgICAgeHRHYXRoZXIoKQotICoKLSAqIGZ1bmN0aW9uOgotICogICAgICB0cmF2ZXJzZSBmb3IgYWxsb2NhdGlvbiBhY3F1aXJpbmcgdGxvY2sgYXQgY29tbWl0IHRpbWUKLSAqICAgICAgKHZzIGF0IHRoZSB0aW1lIG9mIHVwZGF0ZSkgbG9nZ2luZyBiYWNrd2FyZCB0b3AgZG93bgotICoKLSAqIG5vdGU6Ci0gKiAgICAgIHByb2JsZW0gLSBlc3RhYmxpc2hpbmcgdGhhdCBhbGwgbmV3IGFsbG9jYXRpb24gaGF2ZSBiZWVuCi0gKiAgICAgIHByb2Nlc3NlZCBib3RoIGZvciBhcHBlbmQgYW5kIHJhbmRvbSB3cml0ZSBpbiBzcGFyc2UgZmlsZQotICogICAgICBhdCB0aGUgY3VycmVudCBlbnRyeSBhdCB0aGUgY3VycmVudCBzdWJ0cmVlIHJvb3QgcGFnZQotICoKLSAqLwotaW50IHh0R2F0aGVyKGJ0cmVlX3QgKnQpCi17Ci0JaW50IHJjID0gMDsKLQl4dHBhZ2VfdCAqcDsKLQl1NjQgYm47Ci0JaW50IGluZGV4OwotCWJ0ZW50cnlfdCAqZTsKLQlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOwotCXN0cnVjdCBidHNmICpwYXJlbnQ7Ci0KLQkvKiBjbGVhciBzdGFjayAqLwotCUJUX0NMUigmYnRzdGFjayk7Ci0KLQkvKgotCSAqIHN0YXJ0IHdpdGggcm9vdAotCSAqCi0JICogcm9vdCByZXNpZGVzIGluIHRoZSBpbm9kZQotCSAqLwotCWJuID0gMDsKLQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBuZXcgcm9vdCBpcyBOT1QgcG9pbnRlZCBieSBhIG5ldyBlbnRyeQotCSAgIGlmIChwLT5oZWFkZXIuZmxhZyAmIE5FVykKLQkgICBhbGxvY2F0ZSBuZXcgcGFnZSBsb2NrOwotCSAgIHdyaXRlIGEgTkVXUEFHRSBsb2c7Ci0JICovCi0KLSAgICAgIGRvcGFnZToKLQkvKgotCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6Ci0JICovCi0JLyogcHJvY2VzcyBlbnRyaWVzIGJhY2t3YXJkIGZyb20gbGFzdCBpbmRleCAqLwotCWluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxOwotCi0JaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgewotCQkvKgotCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBsZWFmIHBhZ2UKLQkJICovCi0JCS8qIHByb2Nlc3MgbGVhZiBwYWdlIGVudHJpZXMgYmFja3dhcmQgKi8KLQkJZm9yICg7IGluZGV4ID49IFhURU5UUllTVEFSVDsgaW5kZXgtLSkgewotCQkJZSA9ICZwLT54YWRbaW5kZXhdOwotCQkJLyoKLQkJCSAqIGlmIG5ld3BhZ2UsIGxvZyBORVdQQUdFLgotCQkJICoKLQkJCSBpZiAoZS0+ZmxhZyAmIFhBRF9ORVcpIHsKLQkJCSBuZm91bmQgPSsgZW50cnktPmxlbmd0aDsKLQkJCSB1cGRhdGUgY3VycmVudCBwYWdlIGxvY2sgZm9yIHRoZSBlbnRyeTsKLQkJCSBuZXdwYWdlKGVudHJ5KTsKLQkJCSAqCi0JCQkgKiBpZiBtb3ZlZCwgbG9nIG1vdmUuCi0JCQkgKgotCQkJIH0gZWxzZSBpZiAoZS0+ZmxhZyAmIFhBRF9NT1ZFRCkgewotCQkJIHJlc2V0IGZsYWc7Ci0JCQkgdXBkYXRlIGN1cnJlbnQgcGFnZSBsb2NrIGZvciB0aGUgZW50cnk7Ci0JCQkgfQotCQkJICovCi0JCX0KLQotCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCi0JCVhUX1BVVFBBR0UobXApOwotCi0JCS8qCi0JCSAqIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlCi0JCSAqLwotCSAgICAgIGdldFBhcmVudDoKLQkJLyogcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KLQkJaWYgKChwYXJlbnQgPSBCVF9QT1AoJmJ0c3RhY2spKSA9PSBOVUxMKQotCQkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KLQkJCXJldHVybiAwOwotCi0JCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSBYVEVOVFJZU1RBUlQpIHsKLQkJCS8qCi0JCQkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAotCQkJICovCi0JCQkvKiBnbyBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgcGFnZSAqLwotCQkJZ290byBnZXRQYXJlbnQ7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCi0JCQkgKi8KLQkJCS8qIGdldCBiYWNrIHRoZSBwYXJlbnQgcGFnZSAqLwotCQkJYm4gPSBwYXJlbnQtPmJuOwotCQkJWFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOwotCQkJaWYgKHJjKQotCQkJCXJldHVybiAtRUlPOwotCi0JCQkvKiBmaXJzdCBzdWJyb290IHBhZ2Ugd2hpY2gKLQkJCSAqIGNvdmVycyBhbGwgbmV3IGFsbG9jYXRlZCBibG9ja3MKLQkJCSAqIGl0c2VsZiBub3QgbmV3L21vZGlmaWVkLgotCQkJICogKGlmIG1vZGlmaWVkIGZyb20gc3BsaXQgb2YgZGVzY2VuZGVudCwKLQkJCSAqIGdvIGRvd24gcGF0aCBvZiBzcGxpdCBwYWdlKQotCi0JCQkgaWYgKG5mb3VuZCA9PSBubmV3ICYmCi0JCQkgIShwLT5oZWFkZXIuZmxhZyAmIChORVcgfCBNT0QpKSkKLQkJCSBleGl0IHNjYW47Ci0JCQkgKi8KLQotCQkJLyogcHJvY2VzcyBwYXJlbnQgcGFnZSBlbnRyaWVzIGJhY2t3YXJkICovCi0JCQlpbmRleC0tOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgcGFnZQotCQkgKi8KLQl9Ci0KLQkvKgotCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5Ci0JICovCi0KLQkvKiBzYXZlIGN1cnJlbnQgcGFyZW50IGVudHJ5IGZvciB0aGUgY2hpbGQgcGFnZSAqLwotCUJUX1BVU0goJmJ0c3RhY2ssIGJuLCBpbmRleCk7Ci0KLQkvKiBnZXQgY3VycmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KLQllID0gJnAtPnhhZFtpbmRleF07Ci0KLQkvKgotCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGludGVybmFsIGVudHJ5OgotCSAqLwotCS8qCi0JICogaWYgbmV3IGVudHJ5LCBsb2cgYnRyZWVfdG5ld2VudHJ5LgotCSAqCi0JIGlmIChlLT5mbGFnICYgWEFEX05FVykKLQkgdXBkYXRlIHBhcmVudCBwYWdlIGxvY2sgZm9yIHRoZSBlbnRyeTsKLQkgKi8KLQotCS8qIHJlbGVhc2UgcGFyZW50IHBhZ2UgKi8KLQlYVF9QVVRQQUdFKG1wKTsKLQotCS8qIGdldCBjaGlsZCBwYWdlICovCi0JYm4gPSBlLT5ibjsKLQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKgotCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIG5vbi1yb290IHBhZ2U6Ci0JICovCi0JLyoKLQkgKiBpZiBuZXcsIGxvZyBidHJlZV9uZXdwYWdlLgotCSAqCi0JIGlmIChwLT5oZWFkZXIuZmxhZyAmIE5FVykKLQkgYWxsb2NhdGUgbmV3IHBhZ2UgbG9jazsKLQkgd3JpdGUgYSBORVdQQUdFIGxvZyAobmV4dCwgcHJldik7Ci0JICovCi0KLQkvKiBwcm9jZXNzIHRoZSBjaGlsZCBwYWdlICovCi0JZ290byBkb3BhZ2U7Ci0KLSAgICAgIG91dDoKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgkJCQkvKiBfSkZTX1dJUCAqLwotCi0KICNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKIGludCBqZnNfeHRzdGF0X3JlYWQoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKIAkJICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc194dHJlZS5oIGIvZnMvamZzL2pmc194dHJlZS5oCmluZGV4IGE2OTc4NDIuLmFmNjY4YTggMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfeHRyZWUuaAorKysgYi9mcy9qZnMvamZzX3h0cmVlLmgKQEAgLTEzMSwxMCArMTMxLDQgQEAKIGV4dGVybiBpbnQgeHRBcHBlbmQodGlkX3QgdGlkLAogCQkgICAgc3RydWN0IGlub2RlICppcCwgaW50IHhmbGFnLCBzNjQgeG9mZiwgaW50IG1heGJsb2NrcywKIAkJICAgIGludCAqeGxlbnAsIHM2NCAqIHhhZGRycCwgaW50IGZsYWcpOwotCi0jaWZkZWYgIF9KRlNfREVCVUdfWFRSRUUKLWV4dGVybiBpbnQgeHREaXNwbGF5VHJlZShzdHJ1Y3QgaW5vZGUgKmlwKTsKLWV4dGVybiBpbnQgeHREaXNwbGF5UGFnZShzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYm4sIHh0cGFnZV90ICogcCk7Ci0jZW5kaWYJCQkJLyogX0pGU19ERUJVR19YVFJFRSAqLwotCiAjZW5kaWYJCQkJLyogIV9IX0pGU19YVFJFRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL3hhdHRyLmMgYi9mcy9qZnMveGF0dHIuYwppbmRleCBlZTQzOGQ0Li41NTRlYzczIDEwMDY0NAotLS0gYS9mcy9qZnMveGF0dHIuYworKysgYi9mcy9qZnMveGF0dHIuYwpAQCAtNzgxLDcgKzc4MSw3IEBACiAJaWYgKElTX1JET05MWShpbm9kZSkpCiAJCXJldHVybiAtRVJPRlM7CiAKLQlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmKHN0cm5jbXAobmFtZSwgWEFUVFJfU1lTVEVNX1BSRUZJWCwgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pID09IDApCkBAIC03OTAsMTIgKzc5MCwxMiBAQAogCQkgKi8KIAkJcmV0dXJuIGNhbl9zZXRfc3lzdGVtX3hhdHRyKGlub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKTsKIAotCWlmKHN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTikgIT0gMCkKKwlpZihzdHJuY21wKG5hbWUsIFhBVFRSX1RSVVNURURfUFJFRklYLCBYQVRUUl9UUlVTVEVEX1BSRUZJWF9MRU4pID09IDApCiAJCXJldHVybiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSA/IDAgOiAtRVBFUk0pOwogCiAjaWZkZWYgQ09ORklHX0pGU19TRUNVUklUWQogCWlmIChzdHJuY21wKG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikKLQkgICAgIT0gMCkKKwkgICAgPT0gMCkKIAkJcmV0dXJuIDA7CS8qIExlYXZlIGl0IHRvIHRoZSBzZWN1cml0eSBtb2R1bGUgKi8KICNlbmRpZgogCQkKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Yy5jIGIvZnMvbG9ja2Qvc3ZjLmMKaW5kZXggNmUyNDI1NS4uMTJhODU3YyAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjLmMKKysrIGIvZnMvbG9ja2Qvc3ZjLmMKQEAgLTMzMSw3ICszMzEsNyBAQAogCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKIAkJLnByb2NuYW1lCT0gIm5sbV9ncmFjZV9wZXJpb2QiLAogCQkuZGF0YQkJPSAmbmxtX2dyYWNlX3BlcmlvZCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgbG9uZyksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKIAkJLmV4dHJhMQkJPSAodW5zaWduZWQgbG9uZyAqKSAmbmxtX2dyYWNlX3BlcmlvZF9taW4sCkBAIC0zNDEsNyArMzQxLDcgQEAKIAkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCiAJCS5wcm9jbmFtZQk9ICJubG1fdGltZW91dCIsCiAJCS5kYXRhCQk9ICZubG1fdGltZW91dCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgbG9uZyksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKIAkJLmV4dHJhMQkJPSAodW5zaWduZWQgbG9uZyAqKSAmbmxtX3RpbWVvdXRfbWluLApkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKaW5kZXggYTBiYzAzNC4uMjlmYTVkYSAxMDA2NDQKLS0tIGEvZnMvbG9ja3MuYworKysgYi9mcy9sb2Nrcy5jCkBAIC0xMjc2LDcgKzEyNzYsNyBAQAogICovCiBzdGF0aWMgaW50IF9fc2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZV9sb2NrICoqZmxwKQogewotCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqKmJlZm9yZSwgKipteV9iZWZvcmUgPSBOVUxMLCAqbGVhc2UgPSAqZmxwOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqKmJlZm9yZSwgKipteV9iZWZvcmUgPSBOVUxMLCAqbGVhc2U7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyb3IsIHJkbGVhc2VfY291bnQgPSAwLCB3cmxlYXNlX2NvdW50ID0gMDsKQEAgLTEyODcsNiArMTI4Nyw4IEBACiAJaWYgKCFmbHAgfHwgISgqZmxwKSB8fCAhKCpmbHApLT5mbF9sbW9wcyB8fCAhKCpmbHApLT5mbF9sbW9wcy0+ZmxfYnJlYWspCiAJCWdvdG8gb3V0OwogCisJbGVhc2UgPSAqZmxwOworCiAJZXJyb3IgPSAtRUFHQUlOOwogCWlmICgoYXJnID09IEZfUkRMQ0spICYmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPiAwKSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBmYThkZjgxLi4wMmE4MjRjIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpAQCAtMzE0LDcgKzMxNCw3IEBACiB2b2lkIHBhdGhfcmVsZWFzZV9vbl91bW91bnQoc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJZHB1dChuZC0+ZGVudHJ5KTsKLQlfbW50cHV0KG5kLT5tbnQpOworCW1udHB1dF9ub19leHBpcmUobmQtPm1udCk7CiB9CiAKIC8qCkBAIC0xMzEyLDcgKzEzMTIsNyBAQAogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+Y3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlLCBuZCk7CiAJaWYgKCFlcnJvcikgewotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJZnNub3RpZnlfY3JlYXRlKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCXNlY3VyaXR5X2lub2RlX3Bvc3RfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlKTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMTYzNyw3ICsxNjM3LDcgQEAKIAlEUVVPVF9JTklUKGRpcik7CiAJZXJyb3IgPSBkaXItPmlfb3AtPm1rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwogCWlmICghZXJyb3IpIHsKLQkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCWZzbm90aWZ5X2NyZWF0ZShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQlzZWN1cml0eV9pbm9kZV9wb3N0X21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwogCX0KIAlyZXR1cm4gZXJyb3I7CkBAIC0xNzEwLDcgKzE3MTAsNyBAQAogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+bWtkaXIoZGlyLCBkZW50cnksIG1vZGUpOwogCWlmICghZXJyb3IpIHsKLQkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCWZzbm90aWZ5X21rZGlyKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCXNlY3VyaXR5X2lub2RlX3Bvc3RfbWtkaXIoZGlyLGRlbnRyeSwgbW9kZSk7CiAJfQogCXJldHVybiBlcnJvcjsKQEAgLTE4MDEsNyArMTgwMSw3IEBACiAJfQogCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKIAlpZiAoIWVycm9yKSB7Ci0JCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCQlmc25vdGlmeV9ybWRpcihkZW50cnksIGRlbnRyeS0+ZF9pbm9kZSwgZGlyKTsKIAkJZF9kZWxldGUoZGVudHJ5KTsKIAl9CiAJZHB1dChkZW50cnkpOwpAQCAtMTg3NCw5ICsxODc0LDEwIEBACiAKIAkvKiBXZSBkb24ndCBkX2RlbGV0ZSgpIE5GUyBzaWxseXJlbmFtZWQgZmlsZXMtLXRoZXkgc3RpbGwgZXhpc3QuICovCiAJaWYgKCFlcnJvciAmJiAhKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKSkgeworCQlmc25vdGlmeV91bmxpbmsoZGVudHJ5LCBkaXIpOwogCQlkX2RlbGV0ZShkZW50cnkpOwotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fREVMRVRFKTsKIAl9CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE5NTAsNyArMTk1MSw3IEBACiAJRFFVT1RfSU5JVChkaXIpOwogCWVycm9yID0gZGlyLT5pX29wLT5zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKIAlpZiAoIWVycm9yKSB7Ci0JCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOworCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMjAyMyw3ICsyMDI0LDcgQEAKIAllcnJvciA9IGRpci0+aV9vcC0+bGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOwogCXVwKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CiAJaWYgKCFlcnJvcikgewotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJZnNub3RpZnlfY3JlYXRlKGRpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQlzZWN1cml0eV9pbm9kZV9wb3N0X2xpbmsob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMjE4Nyw2ICsyMTg4LDcgQEAKIHsKIAlpbnQgZXJyb3I7CiAJaW50IGlzX2RpciA9IFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKTsKKwljb25zdCBjaGFyICpvbGRfbmFtZTsKIAogCWlmIChvbGRfZGVudHJ5LT5kX2lub2RlID09IG5ld19kZW50cnktPmRfaW5vZGUpCiAgCQlyZXR1cm4gMDsKQEAgLTIyMDgsMTggKzIyMTAsMTggQEAKIAlEUVVPVF9JTklUKG9sZF9kaXIpOwogCURRVU9UX0lOSVQobmV3X2Rpcik7CiAKKwlvbGRfbmFtZSA9IGZzbm90aWZ5X29sZG5hbWVfaW5pdChvbGRfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKIAlpZiAoaXNfZGlyKQogCQllcnJvciA9IHZmc19yZW5hbWVfZGlyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOwogCWVsc2UKIAkJZXJyb3IgPSB2ZnNfcmVuYW1lX290aGVyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOwogCWlmICghZXJyb3IpIHsKLQkJaWYgKG9sZF9kaXIgPT0gbmV3X2RpcikKLQkJCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fUkVOQU1FKTsKLQkJZWxzZSB7Ci0JCQlpbm9kZV9kaXJfbm90aWZ5KG9sZF9kaXIsIEROX0RFTEVURSk7Ci0JCQlpbm9kZV9kaXJfbm90aWZ5KG5ld19kaXIsIEROX0NSRUFURSk7Ci0JCX0KKwkJY29uc3QgY2hhciAqbmV3X25hbWUgPSBvbGRfZGVudHJ5LT5kX25hbWUubmFtZTsKKwkJZnNub3RpZnlfbW92ZShvbGRfZGlyLCBuZXdfZGlyLCBvbGRfbmFtZSwgbmV3X25hbWUsIGlzX2Rpcik7CiAJfQorCWZzbm90aWZ5X29sZG5hbWVfZnJlZShvbGRfbmFtZSk7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggMjA4YzA3OS4uNTg3ZWIwZCAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2NoaWxkKTsKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X21vdW50cyk7CiAJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2ZzbGluayk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9leHBpcmUpOwogCQlpZiAobmFtZSkgewogCQkJaW50IHNpemUgPSBzdHJsZW4obmFtZSkrMTsKIAkJCWNoYXIgKm5ld25hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwpAQCAtMTY1LDggKzE2NSw4IEBACiAJCS8qIHN0aWNrIHRoZSBkdXBsaWNhdGUgbW91bnQgb24gdGhlIHNhbWUgZXhwaXJ5IGxpc3QKIAkJICogYXMgdGhlIG9yaWdpbmFsIGlmIHRoYXQgd2FzIG9uIG9uZSAqLwogCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJm9sZC0+bW50X2ZzbGluaykpCi0JCQlsaXN0X2FkZCgmbW50LT5tbnRfZnNsaW5rLCAmb2xkLT5tbnRfZnNsaW5rKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZvbGQtPm1udF9leHBpcmUpKQorCQkJbGlzdF9hZGQoJm1udC0+bW50X2V4cGlyZSwgJm9sZC0+bW50X2V4cGlyZSk7CiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAl9CiAJcmV0dXJuIG1udDsKQEAgLTM0NSwxMiArMzQ1LDEzIEBACiAJZm9yIChwID0gbW50OyBwOyBwID0gbmV4dF9tbnQocCwgbW50KSkgewogCQlsaXN0X2RlbCgmcC0+bW50X2xpc3QpOwogCQlsaXN0X2FkZCgmcC0+bW50X2xpc3QsICZraWxsKTsKKwkJcC0+bW50X25hbWVzcGFjZSA9IE5VTEw7CiAJfQogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZraWxsKSkgewogCQltbnQgPSBsaXN0X2VudHJ5KGtpbGwubmV4dCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9leHBpcmUpOwogCQlpZiAobW50LT5tbnRfcGFyZW50ID09IG1udCkgewogCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCQl9IGVsc2UgewpAQCAtNjQ0LDcgKzY0NSw3IEBACiAJaWYgKG1udCkgewogCQkvKiBzdG9wIGJpbmQgbW91bnRzIGZyb20gZXhwaXJpbmcgKi8KIAkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZnNsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZXhwaXJlKTsKIAkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCiAJCWVyciA9IGdyYWZ0X3RyZWUobW50LCBuZCk7CkBAIC03NDMsNyArNzQ0LDcgQEAKIAogCS8qIGlmIHRoZSBtb3VudCBpcyBtb3ZlZCwgaXQgc2hvdWxkIG5vIGxvbmdlciBiZSBleHBpcmUKIAkgKiBhdXRvbWF0aWNhbGx5ICovCi0JbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2ZzbGluayk7CisJbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2V4cGlyZSk7CiBvdXQyOgogCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIG91dDE6CkBAIC04MDcsMTIgKzgwOCwxMyBAQAogCQlnb3RvIHVubG9jazsKIAogCW5ld21udC0+bW50X2ZsYWdzID0gbW50X2ZsYWdzOworCW5ld21udC0+bW50X25hbWVzcGFjZSA9IGN1cnJlbnQtPm5hbWVzcGFjZTsKIAllcnIgPSBncmFmdF90cmVlKG5ld21udCwgbmQpOwogCiAJaWYgKGVyciA9PSAwICYmIGZzbGlzdCkgewogCQkvKiBhZGQgdG8gdGhlIHNwZWNpZmllZCBleHBpcmF0aW9uIGxpc3QgKi8KIAkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmbmV3bW50LT5tbnRfZnNsaW5rLCBmc2xpc3QpOworCQlsaXN0X2FkZF90YWlsKCZuZXdtbnQtPm1udF9leHBpcmUsIGZzbGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAl9CiAKQEAgLTgyNCw2ICs4MjYsNTQgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZG9fYWRkX21vdW50KTsKIAorc3RhdGljIHZvaWQgZXhwaXJlX21vdW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgbGlzdF9oZWFkICptb3VudHMpCit7CisJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKworCS8qCisJICogQ2hlY2sgaWYgbW91bnQgaXMgc3RpbGwgYXR0YWNoZWQsIGlmIG5vdCwgbGV0IHdob2V2ZXIgaG9sZHMgaXQgZGVhbAorCSAqIHdpdGggdGhlIHN1Y2tlcgorCSAqLworCWlmIChtbnQtPm1udF9wYXJlbnQgPT0gbW50KSB7CisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCBpdCBpcyBzdGlsbCBkZWFkOiB0aGUgY291bnQgc2hvdWxkIG5vdyBiZSAyIC0gYXMKKwkgKiBjb250cmlidXRlZCBieSB0aGUgdmZzbW91bnQgcGFyZW50IGFuZCB0aGUgbW50Z2V0IGFib3ZlCisJICovCisJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgPT0gMikgeworCQlzdHJ1Y3QgbmFtZWlkYXRhIG9sZF9uZDsKKworCQkvKiBkZWxldGUgZnJvbSB0aGUgbmFtZXNwYWNlICovCisJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOworCQltbnQtPm1udF9uYW1lc3BhY2UgPSBOVUxMOworCQlkZXRhY2hfbW50KG1udCwgJm9sZF9uZCk7CisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworCisJCS8qCisJCSAqIE5vdyBsYXkgaXQgdG8gcmVzdCBpZiB0aGlzIHdhcyB0aGUgbGFzdCByZWYgb24gdGhlIHN1cGVyYmxvY2sKKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmbW50LT5tbnRfc2ItPnNfYWN0aXZlKSA9PSAxKSB7CisJCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCisJCQlsb2NrX2tlcm5lbCgpOworCQkJRFFVT1RfT0ZGKG1udC0+bW50X3NiKTsKKwkJCWFjY3RfYXV0b19jbG9zZShtbnQtPm1udF9zYik7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCX0KKwkJbW50cHV0KG1udCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU29tZW9uZSBicm91Z2h0IGl0IGJhY2sgdG8gbGlmZSB3aGlsc3Qgd2UgZGlkbid0IGhhdmUgYW55CisJCSAqIGxvY2tzIGhlbGQgc28gcmV0dXJuIGl0IHRvIHRoZSBleHBpcmF0aW9uIGxpc3QKKwkJICovCisJCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2V4cGlyZSwgbW91bnRzKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCX0KK30KKwogLyoKICAqIHByb2Nlc3MgYSBsaXN0IG9mIGV4cGlyYWJsZSBtb3VudHBvaW50cyB3aXRoIHRoZSBpbnRlbnQgb2YgZGlzY2FyZGluZyBhbnkKICAqIG1vdW50cG9pbnRzIHRoYXQgYXJlbid0IGluIHVzZSBhbmQgaGF2ZW4ndCBiZWVuIHRvdWNoZWQgc2luY2UgbGFzdCB3ZSBjYW1lCkBAIC04NDYsMTMgKzg5NiwxMyBAQAogCSAqIC0gc3RpbGwgbWFya2VkIGZvciBleHBpcnkgKG1hcmtlZCBvbiB0aGUgbGFzdCBjYWxsIGhlcmU7IG1hcmtzIGFyZQogCSAqICAgY2xlYXJlZCBieSBtbnRwdXQoKSkKIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW50LCBuZXh0LCBtb3VudHMsIG1udF9mc2xpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW50LCBuZXh0LCBtb3VudHMsIG1udF9leHBpcmUpIHsKIAkJaWYgKCF4Y2hnKCZtbnQtPm1udF9leHBpcnlfbWFyaywgMSkgfHwKIAkJICAgIGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgIT0gMSkKIAkJCWNvbnRpbnVlOwogCiAJCW1udGdldChtbnQpOwotCQlsaXN0X21vdmUoJm1udC0+bW50X2ZzbGluaywgJmdyYXZleWFyZCk7CisJCWxpc3RfbW92ZSgmbW50LT5tbnRfZXhwaXJlLCAmZ3JhdmV5YXJkKTsKIAl9CiAKIAkvKgpAQCAtODYyLDYxICs5MTIsMTkgQEAKIAkgKiAtIGRpc3Bvc2Ugb2YgdGhlIGNvcnBzZQogCSAqLwogCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JhdmV5YXJkKSkgewotCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9mc2xpbmspOwotCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9leHBpcmUpOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9leHBpcmUpOwogCiAJCS8qIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBuYW1lc3BhY2UgaXMgZGVhZCAtIGFsbCB0aGUKIAkJICogdmZzbW91bnRzIGZyb20gaXQgYXJlIGdvaW5nIGF3YXkgYW55d2F5ICovCiAJCW5hbWVzcGFjZSA9IG1udC0+bW50X25hbWVzcGFjZTsKLQkJaWYgKCFuYW1lc3BhY2UgfHwgYXRvbWljX3JlYWQoJm5hbWVzcGFjZS0+Y291bnQpIDw9IDApCisJCWlmICghbmFtZXNwYWNlIHx8ICFuYW1lc3BhY2UtPnJvb3QpCiAJCQljb250aW51ZTsKIAkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOwogCiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAkJZG93bl93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOwotCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwotCi0JCS8qIGNoZWNrIHRoYXQgaXQgaXMgc3RpbGwgZGVhZDogdGhlIGNvdW50IHNob3VsZCBub3cgYmUgMiAtIGFzCi0JCSAqIGNvbnRyaWJ1dGVkIGJ5IHRoZSB2ZnNtb3VudCBwYXJlbnQgYW5kIHRoZSBtbnRnZXQgYWJvdmUgKi8KLQkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgPT0gMikgewotCQkJc3RydWN0IHZmc21vdW50ICp4ZG1udDsKLQkJCXN0cnVjdCBkZW50cnkgKnhkZW50cnk7Ci0KLQkJCS8qIGRlbGV0ZSBmcm9tIHRoZSBuYW1lc3BhY2UgKi8KLQkJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOwotCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfY2hpbGQpOwotCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7Ci0JCQltbnQtPm1udF9tb3VudHBvaW50LT5kX21vdW50ZWQtLTsKLQotCQkJeGRlbnRyeSA9IG1udC0+bW50X21vdW50cG9pbnQ7Ci0JCQltbnQtPm1udF9tb3VudHBvaW50ID0gbW50LT5tbnRfcm9vdDsKLQkJCXhkbW50ID0gbW50LT5tbnRfcGFyZW50OwotCQkJbW50LT5tbnRfcGFyZW50ID0gbW50OwotCi0JCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7Ci0KLQkJCW1udHB1dCh4ZG1udCk7Ci0JCQlkcHV0KHhkZW50cnkpOwotCi0JCQkvKiBub3cgbGF5IGl0IHRvIHJlc3QgaWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVmIG9uIHRoZQotCQkJICogc3VwZXJibG9jayAqLwotCQkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9zYi0+c19hY3RpdmUpID09IDEpIHsKLQkJCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCi0JCQkJbG9ja19rZXJuZWwoKTsKLQkJCQlEUVVPVF9PRkYobW50LT5tbnRfc2IpOwotCQkJCWFjY3RfYXV0b19jbG9zZShtbnQtPm1udF9zYik7Ci0JCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJfQotCi0JCQltbnRwdXQobW50KTsKLQkJfSBlbHNlIHsKLQkJCS8qIHNvbWVvbmUgYnJvdWdodCBpdCBiYWNrIHRvIGxpZmUgd2hpbHN0IHdlIGRpZG4ndAotCQkJICogaGF2ZSBhbnkgbG9ja3MgaGVsZCBzbyByZXR1cm4gaXQgdG8gdGhlIGV4cGlyYXRpb24KLQkJCSAqIGxpc3QgKi8KLQkJCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2ZzbGluaywgbW91bnRzKTsKLQkJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJfQotCisJCWV4cGlyZV9tb3VudChtbnQsIG1vdW50cyk7CiAJCXVwX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAKIAkJbW50cHV0KG1udCk7CkBAIC0xNDQ5LDE2ICsxNDU3LDEyIEBACiAKIHZvaWQgX19wdXRfbmFtZXNwYWNlKHN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZSkKIHsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKLQorCXN0cnVjdCB2ZnNtb3VudCAqcm9vdCA9IG5hbWVzcGFjZS0+cm9vdDsKKwluYW1lc3BhY2UtPnJvb3QgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAlkb3duX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkobW50LCAmbmFtZXNwYWNlLT5saXN0LCBtbnRfbGlzdCkgewotCQltbnQtPm1udF9uYW1lc3BhY2UgPSBOVUxMOwotCX0KLQotCXVtb3VudF90cmVlKG5hbWVzcGFjZS0+cm9vdCk7CisJdW1vdW50X3RyZWUocm9vdCk7CiAJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCXVwX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAJa2ZyZWUobmFtZXNwYWNlKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHByb2MuYyBiL2ZzL25mc2QvbmZzNHByb2MuYwppbmRleCBkNzFmMTQ1Li5lMDhlZGMxIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnM0cHJvYy5jCkBAIC0xNjksMTIgKzE2OSw2IEBACiAJCShpbnQpb3Blbi0+b3BfZm5hbWUubGVuLCBvcGVuLT5vcF9mbmFtZS5kYXRhLAogCQlvcGVuLT5vcF9zdGF0ZW93bmVyKTsKIAotCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSAhPSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCi0JCXJldHVybiBuZnNlcnJfZ3JhY2U7Ci0KLQlpZiAoIW5mczRfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKLQkJcmV0dXJuIG5mc2Vycl9ub19ncmFjZTsKLQogCS8qIFRoaXMgY2hlY2sgcmVxdWlyZWQgYnkgc3BlYy4gKi8KIAlpZiAob3Blbi0+b3BfY3JlYXRlICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgIT0gTkZTNF9PUEVOX0NMQUlNX05VTEwpCiAJCXJldHVybiBuZnNlcnJfaW52YWw7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRyZWNvdmVyLmMgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKaW5kZXggMDk1ZjE3NC4uNTdlZDUwZiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCisrKyBiL2ZzL25mc2QvbmZzNHJlY292ZXIuYwpAQCAtMTE5LDI1ICsxMTksMTIgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50Ci1uZnNkNF9yZWNfZnN5bmMoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQorc3RhdGljIHZvaWQKK25mc2Q0X3N5bmNfcmVjX2Rpcih2b2lkKQogewotCXN0cnVjdCBmaWxlICpmaWxwOwotCWludCBzdGF0dXMgPSBuZnNfb2s7Ci0KLQlkcHJpbnRrKCJORlNEOiBuZnM0X2ZzeW5jX3JlY19kaXJcbiIpOwotCWZpbHAgPSBkZW50cnlfb3BlbihkZ2V0KGRlbnRyeSksIG1udGdldChyZWNfZGlyLm1udCksIE9fUkRXUik7Ci0JaWYgKElTX0VSUihmaWxwKSkgewotCQlzdGF0dXMgPSBQVFJfRVJSKGZpbHApOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGZpbHAtPmZfb3AgJiYgZmlscC0+Zl9vcC0+ZnN5bmMpCi0JCXN0YXR1cyA9IGZpbHAtPmZfb3AtPmZzeW5jKGZpbHAsIGZpbHAtPmZfZGVudHJ5LCAwKTsKLQlmcHV0KGZpbHApOwotb3V0OgotCWlmIChzdGF0dXMpCi0JCXByaW50aygibmZzZDQ6IHVuYWJsZSB0byBzeW5jIHJlY292ZXJ5IGRpcmVjdG9yeVxuIik7Ci0JcmV0dXJuIHN0YXR1czsKKwlkb3duKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW5mc2Rfc3luY19kaXIocmVjX2Rpci5kZW50cnkpOworCXVwKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOwogfQogCiBpbnQKQEAgLTE3Niw3ICsxNjMsNyBAQAogCXVwKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOwogCWlmIChzdGF0dXMgPT0gMCkgewogCQljbHAtPmNsX2ZpcnN0c3RhdGUgPSAxOwotCQlzdGF0dXMgPSBuZnNkNF9yZWNfZnN5bmMocmVjX2Rpci5kZW50cnkpOworCQluZnNkNF9zeW5jX3JlY19kaXIoKTsKIAl9CiAJbmZzNF9yZXNldF91c2VyKHVpZCwgZ2lkKTsKIAlkcHJpbnRrKCJORlNEOiBuZnNkNF9jcmVhdGVfY2xpZF9kaXIgcmV0dXJucyAlZFxuIiwgc3RhdHVzKTsKQEAgLTMwMiw3ICsyODksOSBAQAogCiAJZHByaW50aygiTkZTRDogbmZzZDRfdW5saW5rX2NsaWRfZGlyLiBuYW1lICUuKnNcbiIsIG5hbWxlbiwgbmFtZSk7CiAKKwlkb3duKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOwogCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIHJlY19kaXIuZGVudHJ5LCBuYW1sZW4pOworCXVwKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOwogCWlmIChJU19FUlIoZGVudHJ5KSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGRlbnRyeSk7CiAJCXJldHVybiBzdGF0dXM7CkBAIC0zMjcsMTEgKzMxNiwxMiBAQAogCWlmICghcmVjX2Rpcl9pbml0IHx8ICFjbHAtPmNsX2ZpcnN0c3RhdGUpCiAJCXJldHVybjsKIAorCWNscC0+Y2xfZmlyc3RzdGF0ZSA9IDA7CiAJbmZzNF9zYXZlX3VzZXIoJnVpZCwgJmdpZCk7CiAJc3RhdHVzID0gbmZzZDRfdW5saW5rX2NsaWRfZGlyKGNscC0+Y2xfcmVjZGlyLCBIRVhESVJfTEVOLTEpOwogCW5mczRfcmVzZXRfdXNlcih1aWQsIGdpZCk7CiAJaWYgKHN0YXR1cyA9PSAwKQotCQlzdGF0dXMgPSBuZnNkNF9yZWNfZnN5bmMocmVjX2Rpci5kZW50cnkpOworCQluZnNkNF9zeW5jX3JlY19kaXIoKTsKIAlpZiAoc3RhdHVzKQogCQlwcmludGsoIk5GU0Q6IEZhaWxlZCB0byByZW1vdmUgZXhwaXJlZCBjbGllbnQgc3RhdGUgZGlyZWN0b3J5IgogCQkJCSIgJS4qc1xuIiwgSEVYRElSX0xFTiwgY2xwLT5jbF9yZWNkaXIpOwpAQCAtMzYyLDcgKzM1Miw3IEBACiAJCXJldHVybjsKIAlzdGF0dXMgPSBuZnNkNF9saXN0X3JlY19kaXIocmVjX2Rpci5kZW50cnksIHB1cmdlX29sZCk7CiAJaWYgKHN0YXR1cyA9PSAwKQotCQlzdGF0dXMgPSBuZnNkNF9yZWNfZnN5bmMocmVjX2Rpci5kZW50cnkpOworCQluZnNkNF9zeW5jX3JlY19kaXIoKTsKIAlpZiAoc3RhdHVzKQogCQlwcmludGsoIm5mc2Q0OiBmYWlsZWQgdG8gcHVyZ2Ugb2xkIGNsaWVudHMgZnJvbSByZWNvdmVyeSIKIAkJCSIgZGlyZWN0b3J5ICVzXG4iLCByZWNfZGlyLmRlbnRyeS0+ZF9uYW1lLm5hbWUpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggODllMzY1Mi4uYjgzZjhmYiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC04NzQsNiArODc0LDcgQEAKIAkJCSAgKiBjaGFuZ2UgcmVxdWVzdCBjb3JyZWN0bHkuICovCiAJCQlhdG9taWNfc2V0KCZjb25mLT5jbF9jYWxsYmFjay5jYl9zZXQsIDApOwogCQkJZ2VuX2NvbmZpcm0oY29uZik7CisJCQluZnNkNF9yZW1vdmVfY2xpZF9kaXIodW5jb25mKTsKIAkJCWV4cGlyZV9jbGllbnQodW5jb25mKTsKIAkJCXN0YXR1cyA9IG5mc19vazsKIApAQCAtMTE1OSw2ICsxMTYwLDcgQEAKIAlzdHAtPnN0X2RlbnlfYm1hcCA9IDA7CiAJX19zZXRfYml0KG9wZW4tPm9wX3NoYXJlX2FjY2VzcywgJnN0cC0+c3RfYWNjZXNzX2JtYXApOwogCV9fc2V0X2JpdChvcGVuLT5vcF9zaGFyZV9kZW55LCAmc3RwLT5zdF9kZW55X2JtYXApOworCXN0cC0+c3Rfb3BlbnN0cCA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMjk0LDcgKzEyOTYsNyBAQAogCWZwID0gZmluZF9maWxlKGlubyk7CiAJaWYgKCFmcCkKIAkJcmV0dXJuIG5mc19vazsKLQlyZXQgPSBuZnNlcnJfc2hhcmVfZGVuaWVkOworCXJldCA9IG5mc2Vycl9sb2NrZWQ7CiAJLyogU2VhcmNoIGZvciBjb25mbGljdGluZyBzaGFyZSByZXNlcnZhdGlvbnMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cCwgJmZwLT5maV9zdGF0ZWlkcywgc3RfcGVyZmlsZSkgewogCQlpZiAodGVzdF9iaXQoZGVueV90eXBlLCAmc3RwLT5zdF9kZW55X2JtYXApIHx8CkBAIC0xNDgyLDcgKzE0ODQsNyBAQAogCWlmIChzb3ApIHsKIAkJb3Blbi0+b3Bfc3RhdGVvd25lciA9IHNvcDsKIAkJLyogY2hlY2sgZm9yIHJlcGxheSAqLwotCQlpZiAob3Blbi0+b3Bfc2VxaWQgPT0gc29wLT5zb19zZXFpZCl7CisJCWlmIChvcGVuLT5vcF9zZXFpZCA9PSBzb3AtPnNvX3NlcWlkIC0gMSl7CiAJCQlpZiAoc29wLT5zb19yZXBsYXkucnBfYnVmbGVuKQogCQkJCXJldHVybiBORlNFUlJfUkVQTEFZX01FOwogCQkJZWxzZSB7CkBAIC0xNDk3LDcgKzE0OTksNyBAQAogCQkJCWdvdG8gcmVuZXc7CiAJCQl9CiAJCX0gZWxzZSBpZiAoc29wLT5zb19jb25maXJtZWQpIHsKLQkJCWlmIChvcGVuLT5vcF9zZXFpZCA9PSBzb3AtPnNvX3NlcWlkICsgMSkKKwkJCWlmIChvcGVuLT5vcF9zZXFpZCA9PSBzb3AtPnNvX3NlcWlkKQogCQkJCWdvdG8gcmVuZXc7CiAJCQlzdGF0dXMgPSBuZnNlcnJfYmFkX3NlcWlkOwogCQkJZ290byBvdXQ7CkBAIC0xNTMwLDggKzE1MzIsNiBAQAogCXN0YXR1cyA9IG5mc19vazsKIAlyZW5ld19jbGllbnQoc29wLT5zb19jbGllbnQpOwogb3V0OgotCWlmIChzdGF0dXMgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCi0JCXN0YXR1cyA9IG5mc2Vycl9yZWNsYWltX2JhZDsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNjg1LDE5ICsxNjg1LDExIEBACiB9CiAKIAotLyogZGVjcmVtZW50IHNlcWlkIG9uIHN1Y2Nlc3NmdWwgcmVjbGFpbSwgaXQgd2lsbCBiZSBidW1wZWQgaW4gZW5jb2RlX29wZW4gKi8KIHN0YXRpYyB2b2lkCi1uZnM0X3NldF9jbGFpbV9wcmV2KHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuLCBpbnQgKnN0YXR1cykKK25mczRfc2V0X2NsYWltX3ByZXYoc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7Ci0JaWYgKG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKSB7Ci0JCWlmICgqc3RhdHVzKQotCQkJKnN0YXR1cyA9IG5mc2Vycl9yZWNsYWltX2JhZDsKLQkJZWxzZSB7Ci0JCQlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19jb25maXJtZWQgPSAxOwotCQkJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fY2xpZW50LT5jbF9maXJzdHN0YXRlID0gMTsKLQkJCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3NlcWlkLS07Ci0JCX0KLQl9CisJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fY29uZmlybWVkID0gMTsKKwlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19jbGllbnQtPmNsX2ZpcnN0c3RhdGUgPSAxOwogfQogCiAvKgpAQCAtMTc4OSw2ICsxNzgxLDEyIEBACiAJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBOVUxMOwogCWludCBzdGF0dXM7CiAKKwlpZiAobmZzNF9pbl9ncmFjZSgpICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgIT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQorCQlyZXR1cm4gbmZzZXJyX2dyYWNlOworCisJaWYgKCFuZnM0X2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCisJCXJldHVybiBuZnNlcnJfbm9fZ3JhY2U7CisKIAlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CiAJaWYgKCFURVNUX0FDQ0VTUyhvcGVuLT5vcF9zaGFyZV9hY2Nlc3MpIHx8ICFURVNUX0RFTlkob3Blbi0+b3Bfc2hhcmVfZGVueSkpCiAJCWdvdG8gb3V0OwpAQCAtMTgyMyw2ICsxODIxLDcgQEAKIAkJc3RhdHVzID0gbmZzNF91cGdyYWRlX29wZW4ocnFzdHAsIGN1cnJlbnRfZmgsIHN0cCwgb3Blbik7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dDsKKwkJdXBkYXRlX3N0YXRlaWQoJnN0cC0+c3Rfc3RhdGVpZCk7CiAJfSBlbHNlIHsKIAkJLyogU3RhdGVpZCB3YXMgbm90IGZvdW5kLCB0aGlzIGlzIGEgbmV3IE9QRU4gKi8KIAkJaW50IGZsYWdzID0gMDsKQEAgLTE4NTYsOCArMTg1NSw4IEBACiBvdXQ6CiAJaWYgKGZwKQogCQlwdXRfbmZzNF9maWxlKGZwKTsKLQkvKiBDTEFJTV9QUkVWSU9VUyBoYXMgZGlmZmVyZW50IGVycm9yIHJldHVybnMgKi8KLQluZnM0X3NldF9jbGFpbV9wcmV2KG9wZW4sICZzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gMCAmJiBvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwkJbmZzNF9zZXRfY2xhaW1fcHJldihvcGVuKTsKIAkvKgogCSogVG8gZmluaXNoIHRoZSBvcGVuIHJlc3BvbnNlLCB3ZSBqdXN0IG5lZWQgdG8gc2V0IHRoZSByZmxhZ3MuCiAJKi8KQEAgLTE5OTAsMTQgKzE5ODksMTEgQEAKIAlxdWV1ZV9kZWxheWVkX3dvcmsobGF1bmRyeV93cSwgJmxhdW5kcm9tYXRfd29yaywgdCpIWik7CiB9CiAKLS8qIHNlYXJjaCBvd25lcmlkX2hhc2h0YmxbXSBhbmQgY2xvc2VfbHJ1IGZvciBzdGF0ZWlkIG93bmVyCi0gKiAoc3RhdGVpZC0+c2lfc3RhdGVvd25lcmlkKQotICovCiBzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVvd25lciAqCi1maW5kX29wZW5zdGF0ZW93bmVyX2lkKHUzMiBzdF9pZCwgaW50IGZsYWdzKSB7CitzZWFyY2hfY2xvc2VfbHJ1KHUzMiBzdF9pZCwgaW50IGZsYWdzKQorewogCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvY2FsID0gTlVMTDsKIAotCWRwcmludGsoIk5GU0Q6IGZpbmRfb3BlbnN0YXRlb3duZXJfaWQgJWRcbiIsIHN0X2lkKTsKIAlpZiAoZmxhZ3MgJiBDTE9TRV9TVEFURSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2FsLCAmY2xvc2VfbHJ1LCBzb19jbG9zZV9scnUpIHsKIAkJCWlmIChsb2NhbC0+c29faWQgPT0gc3RfaWQpCkBAIC0yMTYzLDE0ICsyMTU5LDE5IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK3NldGxrZmxnIChpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gTkZTNF9SRUFEV19MVCB8fCB0eXBlID09IE5GUzRfUkVBRF9MVCkgPworCQlSRF9TVEFURSA6IFdSX1NUQVRFOworfQogCiAvKiAKICAqIENoZWNrcyBmb3Igc2VxdWVuY2UgaWQgbXV0YXRpbmcgb3BlcmF0aW9ucy4gCiAgKi8KIHN0YXRpYyBpbnQKLW5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1MzIgc2VxaWQsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqc29wcCwgc3RydWN0IG5mczRfc3RhdGVpZCAqKnN0cHAsIGNsaWVudGlkX3QgKmxvY2tjbGlkKQorbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHUzMiBzZXFpZCwgc3RhdGVpZF90ICpzdGF0ZWlkLCBpbnQgZmxhZ3MsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKipzb3BwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoqc3RwcCwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spCiB7Ci0JaW50IHN0YXR1czsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CiAJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wOwogCkBAIC0yMTc4LDUzICsyMTc5LDY1IEBACiAJCQkic3RhdGVpZCA9ICglMDh4LyUwOHgvJTA4eC8lMDh4KVxuIiwgc2VxaWQsCiAJCXN0YXRlaWQtPnNpX2Jvb3QsIHN0YXRlaWQtPnNpX3N0YXRlb3duZXJpZCwgc3RhdGVpZC0+c2lfZmlsZWlkLAogCQlzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uKTsKLQkJCSAgICAgICAgCisKIAkqc3RwcCA9IE5VTEw7CiAJKnNvcHAgPSBOVUxMOwogCi0Jc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCWlmIChaRVJPX1NUQVRFSUQoc3RhdGVpZCkgfHwgT05FX1NUQVRFSUQoc3RhdGVpZCkpIHsKIAkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBtYWdpYyBzdGF0ZWlkIVxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCX0KIAotCXN0YXR1cyA9IG5mc2Vycl9zdGFsZV9zdGF0ZWlkOwogCWlmIChTVEFMRV9TVEFURUlEKHN0YXRlaWQpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIG5mc2Vycl9zdGFsZV9zdGF0ZWlkOwogCS8qCiAJKiBXZSByZXR1cm4gQkFEX1NUQVRFSUQgaWYgZmlsZWhhbmRsZSBkb2Vzbid0IG1hdGNoIHN0YXRlaWQsIAogCSogdGhlIGNvbmZpcm1lZCBmbGFnIGlzIGluY29ycmVjbHkgc2V0LCBvciB0aGUgZ2VuZXJhdGlvbiAKIAkqIG51bWJlciBpcyBpbmNvcnJlY3QuICAKLQkqIElmIHRoZXJlIGlzIG5vIGVudHJ5IGluIHRoZSBvcGVuZmlsZSB0YWJsZSBmb3IgdGhpcyBpZCwgCi0JKiB3ZSBjYW4ndCBhbHdheXMgcmV0dXJuIEJBRF9TVEFURUlEOwotCSogdGhpcyBtaWdodCBiZSBhIHJldHJhbnNtaXR0ZWQgQ0xPU0Ugd2hpY2ggaGFzIGFycml2ZWQgYWZ0ZXIgCi0JKiB0aGUgb3BlbmZpbGUgaGFzIGJlZW4gcmVsZWFzZWQuCiAJKi8KLQlpZiAoIShzdHAgPSBmaW5kX3N0YXRlaWQoc3RhdGVpZCwgZmxhZ3MpKSkKLQkJZ290byBub19uZnM0X3N0YXRlaWQ7CisJc3RwID0gZmluZF9zdGF0ZWlkKHN0YXRlaWQsIGZsYWdzKTsKKwlpZiAoc3RwID09IE5VTEwpIHsKKwkJLyoKKwkJICogQWxzbywgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGlzIGlzbid0IGp1c3QgdGhlIHJlc3VsdCBvZgorCQkgKiBhIHJlcGxheWVkIGNsb3NlOgorCQkgKi8KKwkJc29wID0gc2VhcmNoX2Nsb3NlX2xydShzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQsIGZsYWdzKTsKKwkJaWYgKHNvcCA9PSBOVUxMKQorCQkJcmV0dXJuIG5mc2Vycl9iYWRfc3RhdGVpZDsKKwkJKnNvcHAgPSBzb3A7CisJCWdvdG8gY2hlY2tfcmVwbGF5OworCX0KIAotCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKLQotCS8qIGZvciBuZXcgbG9jayBzdGF0ZW93bmVyczoKLQkgKiBjaGVjayB0aGF0IHRoZSBsb2NrLT52Lm5ldy5vcGVuX3N0YXRlaWQKLQkgKiByZWZlcnMgdG8gYW4gb3BlbiBzdGF0ZW93bmVyCi0JICoKLQkgKiBjaGVjayB0aGF0IHRoZSBsb2NrY2xpZCAobmZzNF9sb2NrLT52Lm5ldy5jbGllbnRpZCkgaXMgdGhlIHNhbWUKLQkgKiBhcyB0aGUgb3Blbl9zdGF0ZWlkLT5zdF9zdGF0ZW93bmVyLT5zb19jbGllbnQtPmNsaWVudGlkCi0JICovCi0JaWYgKGxvY2tjbGlkKSB7CisJaWYgKGxvY2spIHsKIAkJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wID0gc3RwLT5zdF9zdGF0ZW93bmVyOworCQljbGllbnRpZF90ICpsb2NrY2xpZCA9ICZsb2NrLT52Lm5ldy5jbGllbnRpZDsKIAkJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzb3AtPnNvX2NsaWVudDsKKwkJaW50IGxrZmxnID0gMDsKKwkJaW50IHN0YXR1czsKIAotCQlpZiAoIXNvcC0+c29faXNfb3Blbl9vd25lcikKLQkJCWdvdG8gb3V0OwotCQlpZiAoIWNtcF9jbGlkKCZjbHAtPmNsX2NsaWVudGlkLCBsb2NrY2xpZCkpCi0JCQlnb3RvIG91dDsKKwkJbGtmbGcgPSBzZXRsa2ZsZyhsb2NrLT5sa190eXBlKTsKKworCQlpZiAobG9jay0+bGtfaXNfbmV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICghc29wLT5zb19pc19vcGVuX293bmVyKQorCQkJICAgICAgIHJldHVybiBuZnNlcnJfYmFkX3N0YXRlaWQ7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICghY21wX2NsaWQoJmNscC0+Y2xfY2xpZW50aWQsIGxvY2tjbGlkKSkKKwkJCSAgICAgICByZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOworICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHAgaXMgdGhlIG9wZW4gc3RhdGVpZCAqLworICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZnM0X2NoZWNrX29wZW5tb2RlKHN0cCwgbGtmbGcpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKQorCQkJICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHAgaXMgdGhlIGxvY2sgc3RhdGVpZCAqLworICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZnM0X2NoZWNrX29wZW5tb2RlKHN0cC0+c3Rfb3BlbnN0cCwgbGtmbGcpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKQorCQkJICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICB9CisKIAl9CiAKIAlpZiAoKGZsYWdzICYgQ0hFQ0tfRkgpICYmIG5mczRfY2hlY2tfZmgoY3VycmVudF9maCwgc3RwKSkgewogCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGZoLXN0YXRlaWQgbWlzbWF0Y2ghXG4iKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiBuZnNlcnJfYmFkX3N0YXRlaWQ7CiAJfQogCiAJKnN0cHAgPSBzdHA7CkBAIC0yMjM1LDYzICsyMjQ4LDQxIEBACiAJKiAgRm9yIHRoZSBtb21lbnQsIHdlIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgb2YgCiAJKiAgZ2VuZXJhdGlvbiBudW1iZXIgd3JhcGFyb3VuZC4KIAkqLwotCWlmIChzZXFpZCAhPSBzb3AtPnNvX3NlcWlkICsgMSkKKwlpZiAoc2VxaWQgIT0gc29wLT5zb19zZXFpZCkKIAkJZ290byBjaGVja19yZXBsYXk7CiAKLQlpZiAoc29wLT5zb19jb25maXJtZWQpIHsKLQkJaWYgKGZsYWdzICYgQ09ORklSTSkgewotCQkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBleHBlY3RlZCB1bmNvbmZpcm1lZCBzdGF0ZW93bmVyIVxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQorCWlmIChzb3AtPnNvX2NvbmZpcm1lZCAmJiBmbGFncyAmIENPTkZJUk0pIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBleHBlY3RlZCIKKwkJCQkiIHVuY29uZmlybWVkIHN0YXRlb3duZXIhXG4iKTsKKwkJcmV0dXJuIG5mc2Vycl9iYWRfc3RhdGVpZDsKIAl9Ci0JZWxzZSB7Ci0JCWlmICghKGZsYWdzICYgQ09ORklSTSkpIHsKLQkJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogc3RhdGVvd25lciBub3QgY29uZmlybWVkIHlldCFcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlpZiAoIXNvcC0+c29fY29uZmlybWVkICYmICEoZmxhZ3MgJiBDT05GSVJNKSkgeworCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IHN0YXRlb3duZXIgbm90IgorCQkJCSIgY29uZmlybWVkIHlldCFcbiIpOworCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCX0KIAlpZiAoc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbiA+IHN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKSB7CiAJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogZnV0dXJlIHN0YXRlaWQ/IVxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCX0KIAotCXN0YXR1cyA9IG5mc2Vycl9vbGRfc3RhdGVpZDsKIAlpZiAoc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbiA8IHN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKSB7CiAJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogb2xkIHN0YXRlaWQhXG4iKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiBuZnNlcnJfb2xkX3N0YXRlaWQ7CiAJfQotCS8qIFhYWCByZW5ldyB0aGUgY2xpZW50IGxlYXNlIGhlcmUgKi8KLQlzdGF0dXMgPSBuZnNfb2s7Ci0KLW91dDoKLQlyZXR1cm4gc3RhdHVzOwotCi1ub19uZnM0X3N0YXRlaWQ6Ci0KLQkvKgotCSogV2UgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIGJhZCBzdGF0ZWlkIG9yIGEgcmVwbGF5LCAKLQkqIHN0YXJ0aW5nIGJ5IHRyeWluZyB0byBsb29rIHVwIHRoZSBzdGF0ZW93bmVyLgotCSogSWYgc3RhdGVvd25lciBpcyBub3QgZm91bmQgLSBzdGF0ZWlkIGlzIGJhZC4KLQkqLwotCWlmICghKHNvcCA9IGZpbmRfb3BlbnN0YXRlb3duZXJfaWQoc3RhdGVpZC0+c2lfc3RhdGVvd25lcmlkLCBmbGFncykpKSB7Ci0JCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogbm8gc3RhdGVvd25lciBvciBuZnM0X3N0YXRlaWQhXG4iKTsKLQkJc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOwotCQlnb3RvIG91dDsKLQl9Ci0JKnNvcHAgPSBzb3A7CisJcmVuZXdfY2xpZW50KHNvcC0+c29fY2xpZW50KTsKKwlyZXR1cm4gbmZzX29rOwogCiBjaGVja19yZXBsYXk6Ci0JaWYgKHNlcWlkID09IHNvcC0+c29fc2VxaWQpIHsKKwlpZiAoc2VxaWQgPT0gc29wLT5zb19zZXFpZCAtIDEpIHsKIAkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiByZXRyYW5zbWlzc2lvbj9cbiIpOwogCQkvKiBpbmRpY2F0ZSByZXBsYXkgdG8gY2FsbGluZyBmdW5jdGlvbiAqLwotCQlzdGF0dXMgPSBORlNFUlJfUkVQTEFZX01FOwotCX0gZWxzZSAgewotCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGJhZCBzZXFpZCAoZXhwZWN0ZWQgJWQsIGdvdCAlZFxuIiwgc29wLT5zb19zZXFpZCArMSwgc2VxaWQpOwotCi0JCSpzb3BwID0gTlVMTDsKLQkJc3RhdHVzID0gbmZzZXJyX2JhZF9zZXFpZDsKKwkJcmV0dXJuIE5GU0VSUl9SRVBMQVlfTUU7CiAJfQotCWdvdG8gb3V0OworCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogYmFkIHNlcWlkIChleHBlY3RlZCAlZCwgZ290ICVkKVxuIiwKKwkJCXNvcC0+c29fc2VxaWQsIHNlcWlkKTsKKwkqc29wcCA9IE5VTEw7CisJcmV0dXJuIG5mc2Vycl9iYWRfc2VxaWQ7CiB9CiAKIGludApAQCAtMjYwOSw3ICsyNjAwLDYgQEAKICAqIG9jY3VyZWQuIAogICoKICAqIHN0cmhhc2h2YWwgPSBsb2NrX293bmVyc3RyX2hhc2h2YWwgCi0gKiBzb19zZXFpZCA9IGxvY2stPmxrX25ld19sb2NrX3NlcWlkIC0gMTogaXQgZ2V0cyBidW1wZWQgaW4gZW5jb2RlIAogICovCiAKIHN0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoKQEAgLTI2MzQsNyArMjYyNCw3IEBACiAJc29wLT5zb19pc19vcGVuX293bmVyID0gMDsKIAlzb3AtPnNvX2lkID0gY3VycmVudF9vd25lcmlkKys7CiAJc29wLT5zb19jbGllbnQgPSBjbHA7Ci0Jc29wLT5zb19zZXFpZCA9IGxvY2stPmxrX25ld19sb2NrX3NlcWlkIC0gMTsKKwlzb3AtPnNvX3NlcWlkID0gbG9jay0+bGtfbmV3X2xvY2tfc2VxaWQ7CiAJc29wLT5zb19jb25maXJtZWQgPSAxOwogCXJwID0gJnNvcC0+c29fcmVwbGF5OwogCXJwLT5ycF9zdGF0dXMgPSBORlNFUlJfU0VSVkVSRkFVTFQ7CkBAIC0yNjY5LDYgKzI2NTksNyBAQAogCXN0cC0+c3RfdmZzX2ZpbGUgPSBvcGVuX3N0cC0+c3RfdmZzX2ZpbGU7IC8qIEZJWE1FIHJlZmNvdW50Pz8gKi8KIAlzdHAtPnN0X2FjY2Vzc19ibWFwID0gb3Blbl9zdHAtPnN0X2FjY2Vzc19ibWFwOwogCXN0cC0+c3RfZGVueV9ibWFwID0gb3Blbl9zdHAtPnN0X2RlbnlfYm1hcDsKKwlzdHAtPnN0X29wZW5zdHAgPSBvcGVuX3N0cDsKIAogb3V0OgogCXJldHVybiBzdHA7CkBAIC0yNjk5LDIyICsyNjkwLDE3IEBACiAJCShsb25nIGxvbmcpIGxvY2stPmxrX29mZnNldCwKIAkJKGxvbmcgbG9uZykgbG9jay0+bGtfbGVuZ3RoKTsKIAotCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgIWxvY2stPmxrX3JlY2xhaW0pCi0JCXJldHVybiBuZnNlcnJfZ3JhY2U7Ci0JaWYgKCFuZnM0X2luX2dyYWNlKCkgJiYgbG9jay0+bGtfcmVjbGFpbSkKLQkJcmV0dXJuIG5mc2Vycl9ub19ncmFjZTsKLQogCWlmIChjaGVja19sb2NrX2xlbmd0aChsb2NrLT5sa19vZmZzZXQsIGxvY2stPmxrX2xlbmd0aCkpCiAJCSByZXR1cm4gbmZzZXJyX2ludmFsOwogCiAJbmZzNF9sb2NrX3N0YXRlKCk7CiAKIAlpZiAobG9jay0+bGtfaXNfbmV3KSB7Ci0JLyoKLQkgKiBDbGllbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIG5ldyBsb2Nrb3duZXIuCi0JICogVXNlIG9wZW4gb3duZXIgYW5kIG9wZW4gc3RhdGVpZCB0byBjcmVhdGUgbG9jayBvd25lciBhbmQgbG9jayAKLQkgKiBzdGF0ZWlkLgotCSAqLworCQkvKgorCQkgKiBDbGllbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIG5ldyBsb2Nrb3duZXIuCisJCSAqIFVzZSBvcGVuIG93bmVyIGFuZCBvcGVuIHN0YXRlaWQgdG8gY3JlYXRlIGxvY2sgb3duZXIgYW5kCisJCSAqIGxvY2sgc3RhdGVpZC4KKwkJICovCiAJCXN0cnVjdCBuZnM0X3N0YXRlaWQgKm9wZW5fc3RwID0gTlVMTDsKIAkJc3RydWN0IG5mczRfZmlsZSAqZnA7CiAJCQpAQCAtMjcyNCwyMyArMjcxMCwxNCBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQkvKiBpcyB0aGUgbmV3IGxvY2sgc2VxaWQgcHJlc2VudGVkIGJ5IHRoZSBjbGllbnQgemVybz8gKi8KLQkJc3RhdHVzID0gbmZzZXJyX2JhZF9zZXFpZDsKLQkJaWYgKGxvY2stPnYubmV3LmxvY2tfc2VxaWQgIT0gMCkKLQkJCWdvdG8gb3V0OwotCiAJCS8qIHZhbGlkYXRlIGFuZCB1cGRhdGUgb3BlbiBzdGF0ZWlkIGFuZCBvcGVuIHNlcWlkICovCiAJCXN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChjdXJyZW50X2ZoLCAKIAkJCQkgICAgICAgIGxvY2stPmxrX25ld19vcGVuX3NlcWlkLAogCQkgICAgICAgICAgICAgICAgICAgICAgICAmbG9jay0+bGtfbmV3X29wZW5fc3RhdGVpZCwKIAkJICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRkggfCBPUEVOX1NUQVRFLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAmb3Blbl9zb3AsICZvcGVuX3N0cCwKLQkJCQkJJmxvY2stPnYubmV3LmNsaWVudGlkKTsKLQkJaWYgKHN0YXR1cykgewotCQkJaWYgKGxvY2stPmxrX3JlY2xhaW0pCi0JCQkJc3RhdHVzID0gbmZzZXJyX3JlY2xhaW1fYmFkOworCQkgICAgICAgICAgICAgICAgICAgICAgICAmb3Blbl9zb3AsICZvcGVuX3N0cCwgbG9jayk7CisJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dDsKLQkJfQogCQkvKiBjcmVhdGUgbG9ja293bmVyIGFuZCBsb2NrIHN0YXRlaWQgKi8KIAkJZnAgPSBvcGVuX3N0cC0+c3RfZmlsZTsKIAkJc3RyaGFzaHZhbCA9IGxvY2tfb3duZXJzdHJfaGFzaHZhbChmcC0+ZmlfaW5vZGUsIApAQCAtMjc2Niw3ICsyNzQzLDcgQEAKIAkJCQkgICAgICAgbG9jay0+bGtfb2xkX2xvY2tfc2VxaWQsIAogCQkJCSAgICAgICAmbG9jay0+bGtfb2xkX2xvY2tfc3RhdGVpZCwgCiAJCQkJICAgICAgIENIRUNLX0ZIIHwgTE9DS19TVEFURSwgCi0JCQkJICAgICAgICZsb2NrLT5sa19zdGF0ZW93bmVyLCAmbG9ja19zdHAsIE5VTEwpOworCQkJCSAgICAgICAmbG9jay0+bGtfc3RhdGVvd25lciwgJmxvY2tfc3RwLCBsb2NrKTsKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTI3NzgsNiArMjc1NSwxMyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlzdGF0dXMgPSBuZnNlcnJfZ3JhY2U7CisJaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiAhbG9jay0+bGtfcmVjbGFpbSkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gbmZzZXJyX25vX2dyYWNlOworCWlmICghbmZzNF9pbl9ncmFjZSgpICYmIGxvY2stPmxrX3JlY2xhaW0pCisJCWdvdG8gb3V0OworCiAJbG9ja3NfaW5pdF9sb2NrKCZmaWxlX2xvY2spOwogCXN3aXRjaCAobG9jay0+bGtfdHlwZSkgewogCQljYXNlIE5GUzRfUkVBRF9MVDoKQEAgLTI4NDQsMTAgKzI4MjgsMTAgQEAKIG91dF9kZXN0cm95X25ld19zdGF0ZWlkOgogCWlmIChsb2NrLT5sa19pc19uZXcpIHsKIAkJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogZGVzdHJveSBuZXcgc3RhdGVpZCFcbiIpOwotCS8qCi0JKiBBbiBlcnJvciBlbmNvdW50ZXJlZCBhZnRlciBpbnN0YW50aWF0aW9uIG9mIHRoZSBuZXcKLQkqIHN0YXRlaWQgaGFzIGZvcmNlZCB1cyB0byBkZXN0cm95IGl0LgotCSovCisJCS8qCisJCSAqIEFuIGVycm9yIGVuY291bnRlcmVkIGFmdGVyIGluc3RhbnRpYXRpb24gb2YgdGhlIG5ldworCQkgKiBzdGF0ZWlkIGhhcyBmb3JjZWQgdXMgdG8gZGVzdHJveSBpdC4KKwkJICovCiAJCWlmICghc2VxaWRfbXV0YXRpbmdfZXJyKHN0YXR1cykpCiAJCQlvcGVuX3NvcC0+c29fc2VxaWQtLTsKIApAQCAtMzA4Myw3ICszMDY3LDEyIEBACiAJICogb2YgdGhlIGxvY2tvd25lciBzdGF0ZSByZWxlYXNlZDsgc28gZG9uJ3QgcmVsZWFzZSBhbnkgdW50aWwgYWxsCiAJICogaGF2ZSBiZWVuIGNoZWNrZWQuICovCiAJc3RhdHVzID0gbmZzX29rOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc29wLCAmbWF0Y2hlcywgc29fcGVyY2xpZW50KSB7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtYXRjaGVzKSkgeworCQlzb3AgPSBsaXN0X2VudHJ5KG1hdGNoZXMubmV4dCwgc3RydWN0IG5mczRfc3RhdGVvd25lciwKKwkJCQkJCQkJc29fcGVyY2xpZW50KTsKKwkJLyogdW5oYXNoX3N0YXRlb3duZXIgZGVsZXRlcyBzb19wZXJjbGllbnQgb25seQorCQkgKiBmb3Igb3Blbm93bmVycy4gKi8KKwkJbGlzdF9kZWwoJnNvcC0+c29fcGVyY2xpZW50KTsKIAkJcmVsZWFzZV9zdGF0ZW93bmVyKHNvcCk7CiAJfQogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCA5MWZiMTcxLi40YzQxNDYzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtMTIxMCwxNiArMTIxMCwxNSBAQAogCXNhdmUgPSByZXNwLT5wOwogCiAvKgotICogUm91dGluZSBmb3IgZW5jb2RpbmcgdGhlIHJlc3VsdCBvZiBhCi0gKiAic2VxaWQtbXV0YXRpbmciIE5GU3Y0IG9wZXJhdGlvbi4gIFRoaXMgaXMKLSAqIHdoZXJlIHNlcWlkcyBhcmUgaW5jcmVtZW50ZWQsIGFuZCB0aGUKLSAqIHJlcGxheSBjYWNoZSBpcyBmaWxsZWQuCisgKiBSb3V0aW5lIGZvciBlbmNvZGluZyB0aGUgcmVzdWx0IG9mIGEgInNlcWlkLW11dGF0aW5nIiBORlN2NCBvcGVyYXRpb24uICBUaGlzCisgKiBpcyB3aGVyZSBzZXF1ZW5jZSBpZCdzIGFyZSBpbmNyZW1lbnRlZCwgYW5kIHRoZSByZXBsYXkgY2FjaGUgaXMgZmlsbGVkLgorICogTm90ZSB0aGF0IHdlIGluY3JlbWVudCBzZXF1ZW5jZSBpZCdzIGhlcmUsIGF0IHRoZSBsYXN0IG1vbWVudCwgc28gd2UncmUgc3VyZQorICogd2Uga25vdyB3aGV0aGVyIHRoZSBlcnJvciB0byBiZSByZXR1cm5lZCBpcyBhIHNlcXVlbmNlIGlkIG11dGF0aW5nIGVycm9yLgogICovCiAKICNkZWZpbmUgRU5DT0RFX1NFUUlEX09QX1RBSUwoc3RhdGVvd25lcikgZG8gewkJCVwKIAlpZiAoc2VxaWRfbXV0YXRpbmdfZXJyKG5mc2VycikgJiYgc3RhdGVvd25lcikgeyAJXAotCQlpZiAoc3RhdGVvd25lci0+c29fY29uZmlybWVkKQkJCVwKLQkJCXN0YXRlb3duZXItPnNvX3NlcWlkKys7CQkJXAorCQlzdGF0ZW93bmVyLT5zb19zZXFpZCsrOwkJCQlcCiAJCXN0YXRlb3duZXItPnNvX3JlcGxheS5ycF9zdGF0dXMgPSBuZnNlcnI7ICAgCVwKIAkJc3RhdGVvd25lci0+c29fcmVwbGF5LnJwX2J1ZmxlbiA9IAkJXAogCQkJICAoKChjaGFyICopKHJlc3ApLT5wIC0gKGNoYXIgKilzYXZlKSk7IFwKQEAgLTEzNjcsOSArMTM2Niw5IEBACiAJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKIAkJCWdvdG8gb3V0X3Jlc291cmNlOwogCQlpZiAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9OT1NVQlRSRUVDSEVDSykKLQkJCVdSSVRFMzIoTkZTNF9GSF9WT0xBVElMRV9BTlkpOworCQkJV1JJVEUzMihORlM0X0ZIX1BFUlNJU1RFTlQpOwogCQllbHNlCi0JCQlXUklURTMyKE5GUzRfRkhfVk9MQVRJTEVfQU5ZfE5GUzRfRkhfVk9MX1JFTkFNRSk7CisJCQlXUklURTMyKE5GUzRfRkhfUEVSU0lTVEVOVHxORlM0X0ZIX1ZPTF9SRU5BTUUpOwogCX0KIAlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0NIQU5HRSkgewogCQkvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggYmUyNGVhZC4uNGYyY2QzZCAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC00NSw3ICs0NSw3IEBACiAjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KICNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2ZoLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KICNpZmRlZiBDT05GSUdfTkZTRF9WNApAQCAtNzMzLDcgKzczMyw3IEBACiAJdXAoJmlub2RlLT5pX3NlbSk7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBuZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRwKQogewogCW5mc2RfZG9zeW5jKE5VTEwsIGRwLCBkcC0+ZF9pbm9kZS0+aV9mb3ApOwpAQCAtODYwLDcgKzg2MCw3IEBACiAJCW5mc2RzdGF0cy5pb19yZWFkICs9IGVycjsKIAkJKmNvdW50ID0gZXJyOwogCQllcnIgPSAwOwotCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fQUNDRVNTKTsKKwkJZnNub3RpZnlfYWNjZXNzKGZpbGUtPmZfZGVudHJ5KTsKIAl9IGVsc2UgCiAJCWVyciA9IG5mc2Vycm5vKGVycik7CiBvdXQ6CkBAIC05MTYsNyArOTE2LDcgQEAKIAlzZXRfZnMob2xkZnMpOwogCWlmIChlcnIgPj0gMCkgewogCQluZnNkc3RhdHMuaW9fd3JpdGUgKz0gY250OwotCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fTU9ESUZZKTsKKwkJZnNub3RpZnlfbW9kaWZ5KGZpbGUtPmZfZGVudHJ5KTsKIAl9CiAKIAkvKiBjbGVhciBzZXR1aWQvc2V0Z2lkIGZsYWcgYWZ0ZXIgd3JpdGUgKi8KZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uYwppbmRleCAzZjRhNDI4Li4zMmJmMDVlIDEwMDY0NAotLS0gYS9mcy9vcGVuLmMKKysrIGIvZnMvb3Blbi5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CkBAIC05NTEsNiArOTUxLDcgQEAKIAkJCQlwdXRfdW51c2VkX2ZkKGZkKTsKIAkJCQlmZCA9IFBUUl9FUlIoZik7CiAJCQl9IGVsc2UgeworCQkJCWZzbm90aWZ5X29wZW4oZi0+Zl9kZW50cnkpOwogCQkJCWZkX2luc3RhbGwoZmQsIGYpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggOTI5MmY1Zi4uNTYzYWJkMCAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KQEAgLTI1Miw3ICsyNTIsNyBAQAogCQkJZWxzZQogCQkJCXJldCA9IGRvX3N5bmNfcmVhZChmaWxlLCBidWYsIGNvdW50LCBwb3MpOwogCQkJaWYgKHJldCA+IDApIHsKLQkJCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fQUNDRVNTKTsKKwkJCQlmc25vdGlmeV9hY2Nlc3MoZmlsZS0+Zl9kZW50cnkpOwogCQkJCWN1cnJlbnQtPnJjaGFyICs9IHJldDsKIAkJCX0KIAkJCWN1cnJlbnQtPnN5c2NyKys7CkBAIC0zMDMsNyArMzAzLDcgQEAKIAkJCWVsc2UKIAkJCQlyZXQgPSBkb19zeW5jX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CiAJCQlpZiAocmV0ID4gMCkgewotCQkJCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LCBETl9NT0RJRlkpOworCQkJCWZzbm90aWZ5X21vZGlmeShmaWxlLT5mX2RlbnRyeSk7CiAJCQkJY3VycmVudC0+d2NoYXIgKz0gcmV0OwogCQkJfQogCQkJY3VycmVudC0+c3lzY3crKzsKQEAgLTUzOSw5ICs1MzksMTIgQEAKIG91dDoKIAlpZiAoaW92ICE9IGlvdnN0YWNrKQogCQlrZnJlZShpb3YpOwotCWlmICgocmV0ICsgKHR5cGUgPT0gUkVBRCkpID4gMCkKLQkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksCi0JCQkJKHR5cGUgPT0gUkVBRCkgPyBETl9BQ0NFU1MgOiBETl9NT0RJRlkpOworCWlmICgocmV0ICsgKHR5cGUgPT0gUkVBRCkpID4gMCkgeworCQlpZiAodHlwZSA9PSBSRUFEKQorCQkJZnNub3RpZnlfYWNjZXNzKGZpbGUtPmZfZGVudHJ5KTsKKwkJZWxzZQorCQkJZnNub3RpZnlfbW9kaWZ5KGZpbGUtPmZfZGVudHJ5KTsKKwl9CiAJcmV0dXJuIHJldDsKIEVmYXVsdDoKIAlyZXQgPSAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvYml0bWFwLmMgYi9mcy9yZWlzZXJmcy9iaXRtYXAuYwppbmRleCA0OWM0NzljLi45MDlmNzFlIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9iaXRtYXAuYworKysgYi9mcy9yZWlzZXJmcy9iaXRtYXAuYwpAQCAtNDYsMTEyNSArNDYsMTIyMSBAQAogI2RlZmluZSBURVNUX09QVElPTihvcHRuYW1lLCBzKSBcCiAgICAgdGVzdF9iaXQoX0FMTE9DXyAjIyBvcHRuYW1lICwgJlNCX0FMTE9DX09QVFMocykpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYml0X2FkZHJlc3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsCi0JCQkJICAgIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgKiBibWFwX25yLCBpbnQgKiBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2JpdF9hZGRyZXNzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCQkgICBiX2Jsb2NrbnJfdCBibG9jaywgaW50ICpibWFwX25yLCBpbnQgKm9mZnNldCkKIHsKLSAgICAvKiBJdCBpcyBpbiB0aGUgYml0bWFwIGJsb2NrIG51bWJlciBlcXVhbCB0byB0aGUgYmxvY2sKLSAgICAgKiBudW1iZXIgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBibG9jay4gKi8KLSAgICAqYm1hcF9uciA9IGJsb2NrIC8gKHMtPnNfYmxvY2tzaXplIDw8IDMpOwotICAgIC8qIFdpdGhpbiB0aGF0IGJpdG1hcCBibG9jayBpdCBpcyBsb2NhdGVkIGF0IGJpdCBvZmZzZXQgKm9mZnNldC4gKi8KLSAgICAqb2Zmc2V0ID0gYmxvY2sgJiAoKHMtPnNfYmxvY2tzaXplIDw8IDMpIC0gMSApOwotICAgIHJldHVybjsKKwkvKiBJdCBpcyBpbiB0aGUgYml0bWFwIGJsb2NrIG51bWJlciBlcXVhbCB0byB0aGUgYmxvY2sKKwkgKiBudW1iZXIgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBibG9jay4gKi8KKwkqYm1hcF9uciA9IGJsb2NrIC8gKHMtPnNfYmxvY2tzaXplIDw8IDMpOworCS8qIFdpdGhpbiB0aGF0IGJpdG1hcCBibG9jayBpdCBpcyBsb2NhdGVkIGF0IGJpdCBvZmZzZXQgKm9mZnNldC4gKi8KKwkqb2Zmc2V0ID0gYmxvY2sgJiAoKHMtPnNfYmxvY2tzaXplIDw8IDMpIC0gMSk7CisJcmV0dXJuOwogfQogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi1pbnQgaXNfcmV1c2FibGUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgYml0X3ZhbHVlKQoraW50IGlzX3JldXNhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpCiB7Ci0gICAgaW50IGksIGo7CisJaW50IGksIGo7CiAKLSAgICBpZiAoYmxvY2sgPT0gMCB8fCBibG9jayA+PSBTQl9CTE9DS19DT1VOVCAocykpIHsKLQlyZWlzZXJmc193YXJuaW5nIChzLCAidnMtNDAxMDogaXNfcmV1c2FibGU6IGJsb2NrIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UgJWx1ICgldSkiLAotCQkJICBibG9jaywgU0JfQkxPQ0tfQ09VTlQgKHMpKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBpdCBjYW4ndCBiZSBvbmUgb2YgdGhlIGJpdG1hcCBibG9ja3MgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUiAocyk7IGkgKyspCi0JaWYgKGJsb2NrID09IFNCX0FQX0JJVE1BUCAocylbaV0uYmgtPmJfYmxvY2tucikgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnM6IDQwMjA6IGlzX3JldXNhYmxlOiAiCi0JCQkgICAgICAiYml0bWFwIGJsb2NrICVsdSgldSkgY2FuJ3QgYmUgZnJlZWQgb3IgcmV1c2VkIiwKLQkJCSAgICAgIGJsb2NrLCBTQl9CTUFQX05SIChzKSk7Ci0JICAgIHJldHVybiAwOworCWlmIChibG9jayA9PSAwIHx8IGJsb2NrID49IFNCX0JMT0NLX0NPVU5UKHMpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgInZzLTQwMTA6IGlzX3JldXNhYmxlOiBibG9jayBudW1iZXIgaXMgb3V0IG9mIHJhbmdlICVsdSAoJXUpIiwKKwkJCQkgYmxvY2ssIFNCX0JMT0NLX0NPVU5UKHMpKTsKKwkJcmV0dXJuIDA7CiAJfQotICAKLSAgICBnZXRfYml0X2FkZHJlc3MgKHMsIGJsb2NrLCAmaSwgJmopOwogCi0gICAgaWYgKGkgPj0gU0JfQk1BUF9OUiAocykpIHsKLQlyZWlzZXJmc193YXJuaW5nIChzLCAidnMtNDAzMDogaXNfcmV1c2FibGU6IHRoZXJlIGlzIG5vIHNvIG1hbnkgYml0bWFwIGJsb2NrczogIgotCQkJICAiYmxvY2s9JWx1LCBiaXRtYXBfbnI9JWQiLCBibG9jaywgaSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQorCS8qIGl0IGNhbid0IGJlIG9uZSBvZiB0aGUgYml0bWFwIGJsb2NrcyAqLworCWZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspCisJCWlmIChibG9jayA9PSBTQl9BUF9CSVRNQVAocylbaV0uYmgtPmJfYmxvY2tucikgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAidnM6IDQwMjA6IGlzX3JldXNhYmxlOiAiCisJCQkJCSAiYml0bWFwIGJsb2NrICVsdSgldSkgY2FuJ3QgYmUgZnJlZWQgb3IgcmV1c2VkIiwKKwkJCQkJIGJsb2NrLCBTQl9CTUFQX05SKHMpKTsKKwkJCXJldHVybiAwOworCQl9CiAKLSAgICBpZiAoKGJpdF92YWx1ZSA9PSAwICYmIAotICAgICAgICAgcmVpc2VyZnNfdGVzdF9sZV9iaXQoaiwgU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2RhdGEpKSB8fAotCShiaXRfdmFsdWUgPT0gMSAmJiAKLQkgcmVpc2VyZnNfdGVzdF9sZV9iaXQoaiwgU0JfQVBfQklUTUFQIChzKVtpXS5iaC0+Yl9kYXRhKSA9PSAwKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDQwOiBpc19yZXVzYWJsZTogY29ycmVzcG9uZGluZyBiaXQgb2YgYmxvY2sgJWx1IGRvZXMgbm90ICIKLQkJCSAgIm1hdGNoIHJlcXVpcmVkIHZhbHVlIChpPT0lZCwgaj09JWQpIHRlc3RfYml0PT0lZCIsCi0JCWJsb2NrLCBpLCBqLCByZWlzZXJmc190ZXN0X2xlX2JpdCAoaiwgU0JfQVBfQklUTUFQIChzKVtpXS5iaC0+Yl9kYXRhKSk7CisJZ2V0X2JpdF9hZGRyZXNzKHMsIGJsb2NrLCAmaSwgJmopOwogCi0JcmV0dXJuIDA7Ci0gICAgfQorCWlmIChpID49IFNCX0JNQVBfTlIocykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAidnMtNDAzMDogaXNfcmV1c2FibGU6IHRoZXJlIGlzIG5vIHNvIG1hbnkgYml0bWFwIGJsb2NrczogIgorCQkJCSAiYmxvY2s9JWx1LCBiaXRtYXBfbnI9JWQiLCBibG9jaywgaSk7CisJCXJldHVybiAwOworCX0KIAotICAgIGlmIChiaXRfdmFsdWUgPT0gMCAmJiBibG9jayA9PSBTQl9ST09UX0JMT0NLIChzKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDUwOiBpc19yZXVzYWJsZTogdGhpcyBpcyByb290IGJsb2NrICgldSksICIKLQkJCSAgIml0IG11c3QgYmUgYnVzeSIsIFNCX1JPT1RfQkxPQ0sgKHMpKTsKLQlyZXR1cm4gMDsKLSAgICB9CisJaWYgKChiaXRfdmFsdWUgPT0gMCAmJgorCSAgICAgcmVpc2VyZnNfdGVzdF9sZV9iaXQoaiwgU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2RhdGEpKSB8fAorCSAgICAoYml0X3ZhbHVlID09IDEgJiYKKwkgICAgIHJlaXNlcmZzX3Rlc3RfbGVfYml0KGosIFNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9kYXRhKSA9PSAwKSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJICJ2cy00MDQwOiBpc19yZXVzYWJsZTogY29ycmVzcG9uZGluZyBiaXQgb2YgYmxvY2sgJWx1IGRvZXMgbm90ICIKKwkJCQkgIm1hdGNoIHJlcXVpcmVkIHZhbHVlIChpPT0lZCwgaj09JWQpIHRlc3RfYml0PT0lZCIsCisJCQkJIGJsb2NrLCBpLCBqLCByZWlzZXJmc190ZXN0X2xlX2JpdChqLAorCQkJCQkJCQkgICBTQl9BUF9CSVRNQVAKKwkJCQkJCQkJICAgKHMpW2ldLmJoLT4KKwkJCQkJCQkJICAgYl9kYXRhKSk7CiAKLSAgICByZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGJpdF92YWx1ZSA9PSAwICYmIGJsb2NrID09IFNCX1JPT1RfQkxPQ0socykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAidnMtNDA1MDogaXNfcmV1c2FibGU6IHRoaXMgaXMgcm9vdCBibG9jayAoJXUpLCAiCisJCQkJICJpdCBtdXN0IGJlIGJ1c3kiLCBTQl9ST09UX0JMT0NLKHMpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCisjZW5kaWYJCQkJLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCiAKIC8qIHNlYXJjaGVzIGluIGpvdXJuYWwgc3RydWN0dXJlcyBmb3IgYSBnaXZlbiBibG9jayBudW1iZXIgKGJtYXAsIG9mZikuIElmIGJsb2NrCiAgICBpcyBmb3VuZCBpbiByZWlzZXJmcyBqb3VybmFsIGl0IHN1Z2dlc3RzIG5leHQgZnJlZSBibG9jayBjYW5kaWRhdGUgdG8gdGVzdC4gKi8KLXN0YXRpYyBpbmxpbmUgIGludCBpc19ibG9ja19pbl9qb3VybmFsIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgYm1hcCwgaW50Ci1vZmYsIGludCAqbmV4dCkKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2Jsb2NrX2luX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgYm1hcCwgaW50CisJCQkJICAgICAgb2ZmLCBpbnQgKm5leHQpCiB7Ci0gICAgYl9ibG9ja25yX3QgdG1wOworCWJfYmxvY2tucl90IHRtcDsKIAotICAgIGlmIChyZWlzZXJmc19pbl9qb3VybmFsIChzLCBibWFwLCBvZmYsIDEsICZ0bXApKSB7Ci0JaWYgKHRtcCkgeyAgICAgICAgICAgICAgLyogaGludCBzdXBwbGllZCAqLwotCSAgICAqbmV4dCA9IHRtcDsKLQkgICAgUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAuaW5fam91cm5hbF9oaW50ICk7Ci0JfSBlbHNlIHsKLQkgICAgKCpuZXh0KSA9IG9mZiArIDE7ICAgICAgICAgIC8qIGluYyBvZmZzZXQgdG8gYXZvaWQgbG9vcGluZy4gKi8KLQkgICAgUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAuaW5fam91cm5hbF9ub2hpbnQgKTsKKwlpZiAocmVpc2VyZnNfaW5fam91cm5hbChzLCBibWFwLCBvZmYsIDEsICZ0bXApKSB7CisJCWlmICh0bXApIHsJLyogaGludCBzdXBwbGllZCAqLworCQkJKm5leHQgPSB0bXA7CisJCQlQUk9DX0lORk9fSU5DKHMsIHNjYW5fYml0bWFwLmluX2pvdXJuYWxfaGludCk7CisJCX0gZWxzZSB7CisJCQkoKm5leHQpID0gb2ZmICsgMTsJLyogaW5jIG9mZnNldCB0byBhdm9pZCBsb29waW5nLiAqLworCQkJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC5pbl9qb3VybmFsX25vaGludCk7CisJCX0KKwkJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC5yZXRyeSk7CisJCXJldHVybiAxOwogCX0KLQlQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5yZXRyeSApOwotCXJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyogaXQgc2VhcmNoZXMgZm9yIGEgd2luZG93IG9mIHplcm8gYml0cyB3aXRoIGdpdmVuIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RocyBpbiBvbmUgYml0bWFwCiAgKiBibG9jazsgKi8KLXN0YXRpYyBpbnQgc2Nhbl9iaXRtYXBfYmxvY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgICAgaW50IGJtYXBfbiwgaW50ICpiZWcsIGludCBib3VuZGFyeSwgaW50IG1pbiwgaW50IG1heCwgaW50IHVuZm0pCitzdGF0aWMgaW50IHNjYW5fYml0bWFwX2Jsb2NrKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICBpbnQgYm1hcF9uLCBpbnQgKmJlZywgaW50IGJvdW5kYXJ5LCBpbnQgbWluLAorCQkJICAgICBpbnQgbWF4LCBpbnQgdW5mbSkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKmJpPSZTQl9BUF9CSVRNQVAocylbYm1hcF9uXTsKLSAgICBpbnQgZW5kLCBuZXh0OwotICAgIGludCBvcmcgPSAqYmVnOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYmkgPSAmU0JfQVBfQklUTUFQKHMpW2JtYXBfbl07CisJaW50IGVuZCwgbmV4dDsKKwlpbnQgb3JnID0gKmJlZzsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIFJGQUxTRShibWFwX24gPj0gU0JfQk1BUF9OUiAocyksICJCaXRtYXAgJWQgaXMgb3V0IG9mIHJhbmdlICgwLi4lZCkiLGJtYXBfbiwgU0JfQk1BUF9OUiAocykgLSAxKTsKLSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5ibWFwICk7CisJUkZBTFNFKGJtYXBfbiA+PSBTQl9CTUFQX05SKHMpLCAiQml0bWFwICVkIGlzIG91dCBvZiByYW5nZSAoMC4uJWQpIiwKKwkgICAgICAgYm1hcF9uLCBTQl9CTUFQX05SKHMpIC0gMSk7CisJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC5ibWFwKTsKIC8qIHRoaXMgaXMgdW5jbGVhciBhbmQgbGFja3MgY29tbWVudHMsIGV4cGxhaW4gaG93IGpvdXJuYWwgYml0bWFwcwogICAgd29yayBoZXJlIGZvciB0aGUgcmVhZGVyLiAgQ29udmV5IGEgc2Vuc2Ugb2YgdGhlIGRlc2lnbiBoZXJlLiBXaGF0CiAgICBpcyBhIHdpbmRvdz8gKi8KIC8qIC0gSSBtZWFuIGBhIHdpbmRvdyBvZiB6ZXJvIGJpdHMnIGFzIGluIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24gLSBaYW0uICovCi0gIAotICAgIGlmICggIWJpICkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJOVUxMIGJpdG1hcCBpbmZvIHBvaW50ZXIgZm9yIGJpdG1hcCAlZCIsIGJtYXBfbik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChidWZmZXJfbG9ja2VkIChiaS0+YmgpKSB7Ci0gICAgICAgUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAud2FpdCApOwotICAgICAgIF9fd2FpdF9vbl9idWZmZXIgKGJpLT5iaCk7Ci0gICAgfQogCi0gICAgd2hpbGUgKDEpIHsKLQljb250OgotCWlmIChiaS0+ZnJlZV9jb3VudCA8IG1pbikKLQkJcmV0dXJuIDA7IC8vIE5vIGZyZWUgYmxvY2tzIGluIHRoaXMgYml0bWFwCi0KLQkvKiBzZWFyY2ggZm9yIGEgZmlyc3QgemVybyBiaXQgLS0gYmVnZ2luaW5nIG9mIGEgd2luZG93ICovCi0JKmJlZyA9IHJlaXNlcmZzX2ZpbmRfbmV4dF96ZXJvX2xlX2JpdAotCSAgICAgICAgKCh1bnNpZ25lZCBsb25nKikoYmktPmJoLT5iX2RhdGEpLCBib3VuZGFyeSwgKmJlZyk7Ci0gIAotCWlmICgqYmVnICsgbWluID4gYm91bmRhcnkpIHsgLyogc2VhcmNoIGZvciBhIHplcm8gYml0IGZhaWxzIG9yIHRoZSByZXN0IG9mIGJpdG1hcCBibG9jawotCQkJCSAgICAgICogY2Fubm90IGNvbnRhaW4gYSB6ZXJvIHdpbmRvdyBvZiBtaW5pbXVtIHNpemUgKi8KLQkgICAgcmV0dXJuIDA7CisJaWYgKCFiaSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJOVUxMIGJpdG1hcCBpbmZvIHBvaW50ZXIgZm9yIGJpdG1hcCAlZCIsCisJCQkJIGJtYXBfbik7CisJCXJldHVybiAwOworCX0KKwlpZiAoYnVmZmVyX2xvY2tlZChiaS0+YmgpKSB7CisJCVBST0NfSU5GT19JTkMocywgc2Nhbl9iaXRtYXAud2FpdCk7CisJCV9fd2FpdF9vbl9idWZmZXIoYmktPmJoKTsKIAl9CiAKLQlpZiAodW5mbSAmJiBpc19ibG9ja19pbl9qb3VybmFsKHMsYm1hcF9uLCAqYmVnLCBiZWcpKQotCSAgICBjb250aW51ZTsKLQkvKiBmaXJzdCB6ZXJvIGJpdCBmb3VuZDsgd2UgY2hlY2sgbmV4dCBiaXRzICovCi0JZm9yIChlbmQgPSAqYmVnICsgMTs7IGVuZCArKykgewotCSAgICBpZiAoZW5kID49ICpiZWcgKyBtYXggfHwgZW5kID49IGJvdW5kYXJ5IHx8IHJlaXNlcmZzX3Rlc3RfbGVfYml0IChlbmQsIGJpLT5iaC0+Yl9kYXRhKSkgewotCQluZXh0ID0gZW5kOwotCQlicmVhazsKLQkgICAgfQotCSAgICAvKiBmaW5kaW5nIHRoZSBvdGhlciBlbmQgb2YgemVybyBiaXQgd2luZG93IHJlcXVpcmVzIGxvb2tpbmcgaW50byBqb3VybmFsIHN0cnVjdHVyZXMgKGluCi0JICAgICAqIGNhc2Ugb2Ygc2VhcmNoaW5nIGZvciBmcmVlIGJsb2NrcyBmb3IgdW5mb3JtYXR0ZWQgbm9kZXMpICovCi0JICAgIGlmICh1bmZtICYmIGlzX2Jsb2NrX2luX2pvdXJuYWwocywgYm1hcF9uLCBlbmQsICZuZXh0KSkKLQkJYnJlYWs7Ci0JfQorCXdoaWxlICgxKSB7CisJICAgICAgY29udDoKKwkJaWYgKGJpLT5mcmVlX2NvdW50IDwgbWluKQorCQkJcmV0dXJuIDA7CS8vIE5vIGZyZWUgYmxvY2tzIGluIHRoaXMgYml0bWFwCiAKLQkvKiBub3cgKCpiZWcpIHBvaW50cyB0byBiZWdpbm5pbmcgb2YgemVybyBiaXRzIHdpbmRvdywKLQkgKiAoZW5kKSBwb2ludHMgdG8gb25lIGJpdCBhZnRlciB0aGUgd2luZG93IGVuZCAqLwotCWlmIChlbmQgLSAqYmVnID49IG1pbikgeyAvKiBpdCBzZWVtcyB3ZSBoYXZlIGZvdW5kIHdpbmRvdyBvZiBwcm9wZXIgc2l6ZSAqLwotCSAgICBpbnQgaTsKLQkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbCAocywgYmktPmJoLCAxKTsKLQkgICAgLyogdHJ5IHRvIHNldCBhbGwgYmxvY2tzIHVzZWQgY2hlY2tpbmcgYXJlIHRoZXkgc3RpbGwgZnJlZSAqLwotCSAgICBmb3IgKGkgPSAqYmVnOyBpIDwgZW5kOyBpKyspIHsKLQkJLyogSXQgc2VlbXMgdGhhdCB3ZSBzaG91bGQgbm90IGNoZWNrIGluIGpvdXJuYWwgYWdhaW4uICovCi0JCWlmIChyZWlzZXJmc190ZXN0X2FuZF9zZXRfbGVfYml0IChpLCBiaS0+YmgtPmJfZGF0YSkpIHsKLQkJICAgIC8qIGJpdCB3YXMgc2V0IGJ5IGFub3RoZXIgcHJvY2VzcwotCQkgICAgICogd2hpbGUgd2Ugc2xlcHQgaW4gcHJlcGFyZV9mb3Jfam91cm5hbCgpICovCi0JCSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5zdG9sZW4gKTsKLQkJICAgIGlmIChpID49ICpiZWcgKyBtaW4pCXsgLyogd2UgY2FuIGNvbnRpbnVlIHdpdGggc21hbGxlciBzZXQgb2YgYWxsb2NhdGVkIGJsb2NrcywKLQkJCQkJICAgKiBpZiBsZW5ndGggb2YgdGhpcyBzZXQgaXMgbW9yZSBvciBlcXVhbCB0byBgbWluJyAqLwotCQkJZW5kID0gaTsKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgLyogb3RoZXJ3aXNlIHdlIGNsZWFyIGFsbCBiaXQgd2VyZSBzZXQgLi4uICovCi0JCSAgICB3aGlsZSAoLS1pID49ICpiZWcpCi0JCQlyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQgKGksIGJpLT5iaC0+Yl9kYXRhKTsKLQkJICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyIChzLCBiaS0+YmgpOwotCQkgICAgKmJlZyA9IG9yZzsKLQkJICAgIC8qIC4uLiBhbmQgc2VhcmNoIGFnYWluIGluIGN1cnJlbnQgYmxvY2sgZnJvbSBiZWdpbm5pbmcgKi8KLQkJICAgIGdvdG8gY29udDsJCisJCS8qIHNlYXJjaCBmb3IgYSBmaXJzdCB6ZXJvIGJpdCAtLSBiZWdnaW5pbmcgb2YgYSB3aW5kb3cgKi8KKwkJKmJlZyA9IHJlaXNlcmZzX2ZpbmRfbmV4dF96ZXJvX2xlX2JpdAorCQkgICAgKCh1bnNpZ25lZCBsb25nICopKGJpLT5iaC0+Yl9kYXRhKSwgYm91bmRhcnksICpiZWcpOworCisJCWlmICgqYmVnICsgbWluID4gYm91bmRhcnkpIHsJLyogc2VhcmNoIGZvciBhIHplcm8gYml0IGZhaWxzIG9yIHRoZSByZXN0IG9mIGJpdG1hcCBibG9jaworCQkJCQkJICogY2Fubm90IGNvbnRhaW4gYSB6ZXJvIHdpbmRvdyBvZiBtaW5pbXVtIHNpemUgKi8KKwkJCXJldHVybiAwOwogCQl9Ci0JICAgIH0KLQkgICAgYmktPmZyZWVfY291bnQgLT0gKGVuZCAtICpiZWcpOwotCSAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBzLCBiaS0+YmgpOwogCi0JICAgIC8qIGZyZWUgYmxvY2sgY291bnQgY2FsY3VsYXRpb24gKi8KLQkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbCAocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOwotCSAgICBQVVRfU0JfRlJFRV9CTE9DS1MocywgU0JfRlJFRV9CTE9DS1MocykgLSAoZW5kIC0gKmJlZykpOwotCSAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCWlmICh1bmZtICYmIGlzX2Jsb2NrX2luX2pvdXJuYWwocywgYm1hcF9uLCAqYmVnLCBiZWcpKQorCQkJY29udGludWU7CisJCS8qIGZpcnN0IHplcm8gYml0IGZvdW5kOyB3ZSBjaGVjayBuZXh0IGJpdHMgKi8KKwkJZm9yIChlbmQgPSAqYmVnICsgMTs7IGVuZCsrKSB7CisJCQlpZiAoZW5kID49ICpiZWcgKyBtYXggfHwgZW5kID49IGJvdW5kYXJ5CisJCQkgICAgfHwgcmVpc2VyZnNfdGVzdF9sZV9iaXQoZW5kLCBiaS0+YmgtPmJfZGF0YSkpIHsKKwkJCQluZXh0ID0gZW5kOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmluZGluZyB0aGUgb3RoZXIgZW5kIG9mIHplcm8gYml0IHdpbmRvdyByZXF1aXJlcyBsb29raW5nIGludG8gam91cm5hbCBzdHJ1Y3R1cmVzIChpbgorCQkJICogY2FzZSBvZiBzZWFyY2hpbmcgZm9yIGZyZWUgYmxvY2tzIGZvciB1bmZvcm1hdHRlZCBub2RlcykgKi8KKwkJCWlmICh1bmZtICYmIGlzX2Jsb2NrX2luX2pvdXJuYWwocywgYm1hcF9uLCBlbmQsICZuZXh0KSkKKwkJCQlicmVhazsKKwkJfQogCi0JICAgIHJldHVybiBlbmQgLSAoKmJlZyk7Ci0JfSBlbHNlIHsKLQkgICAgKmJlZyA9IG5leHQ7CisJCS8qIG5vdyAoKmJlZykgcG9pbnRzIHRvIGJlZ2lubmluZyBvZiB6ZXJvIGJpdHMgd2luZG93LAorCQkgKiAoZW5kKSBwb2ludHMgdG8gb25lIGJpdCBhZnRlciB0aGUgd2luZG93IGVuZCAqLworCQlpZiAoZW5kIC0gKmJlZyA+PSBtaW4pIHsJLyogaXQgc2VlbXMgd2UgaGF2ZSBmb3VuZCB3aW5kb3cgb2YgcHJvcGVyIHNpemUgKi8KKwkJCWludCBpOworCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaS0+YmgsIDEpOworCQkJLyogdHJ5IHRvIHNldCBhbGwgYmxvY2tzIHVzZWQgY2hlY2tpbmcgYXJlIHRoZXkgc3RpbGwgZnJlZSAqLworCQkJZm9yIChpID0gKmJlZzsgaSA8IGVuZDsgaSsrKSB7CisJCQkJLyogSXQgc2VlbXMgdGhhdCB3ZSBzaG91bGQgbm90IGNoZWNrIGluIGpvdXJuYWwgYWdhaW4uICovCisJCQkJaWYgKHJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQKKwkJCQkgICAgKGksIGJpLT5iaC0+Yl9kYXRhKSkgeworCQkJCQkvKiBiaXQgd2FzIHNldCBieSBhbm90aGVyIHByb2Nlc3MKKwkJCQkJICogd2hpbGUgd2Ugc2xlcHQgaW4gcHJlcGFyZV9mb3Jfam91cm5hbCgpICovCisJCQkJCVBST0NfSU5GT19JTkMocywgc2Nhbl9iaXRtYXAuc3RvbGVuKTsKKwkJCQkJaWYgKGkgPj0gKmJlZyArIG1pbikgewkvKiB3ZSBjYW4gY29udGludWUgd2l0aCBzbWFsbGVyIHNldCBvZiBhbGxvY2F0ZWQgYmxvY2tzLAorCQkJCQkJCQkgKiBpZiBsZW5ndGggb2YgdGhpcyBzZXQgaXMgbW9yZSBvciBlcXVhbCB0byBgbWluJyAqLworCQkJCQkJZW5kID0gaTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8qIG90aGVyd2lzZSB3ZSBjbGVhciBhbGwgYml0IHdlcmUgc2V0IC4uLiAqLworCQkJCQl3aGlsZSAoLS1pID49ICpiZWcpCisJCQkJCQlyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQKKwkJCQkJCSAgICAoaSwgYmktPmJoLT5iX2RhdGEpOworCQkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLAorCQkJCQkJCQkJIGJpLT4KKwkJCQkJCQkJCSBiaCk7CisJCQkJCSpiZWcgPSBvcmc7CisJCQkJCS8qIC4uLiBhbmQgc2VhcmNoIGFnYWluIGluIGN1cnJlbnQgYmxvY2sgZnJvbSBiZWdpbm5pbmcgKi8KKwkJCQkJZ290byBjb250OworCQkJCX0KKwkJCX0KKwkJCWJpLT5mcmVlX2NvdW50IC09IChlbmQgLSAqYmVnKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcywgYmktPmJoKTsKKworCQkJLyogZnJlZSBibG9jayBjb3VudCBjYWxjdWxhdGlvbiAqLworCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwKKwkJCQkJCSAgICAgMSk7CisJCQlQVVRfU0JfRlJFRV9CTE9DS1MocywgU0JfRlJFRV9CTE9DS1MocykgLSAoZW5kIC0gKmJlZykpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisKKwkJCXJldHVybiBlbmQgLSAoKmJlZyk7CisJCX0gZWxzZSB7CisJCQkqYmVnID0gbmV4dDsKKwkJfQogCX0KLSAgICB9CiB9CiAKLXN0YXRpYyBpbnQgYm1hcF9oYXNoX2lkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdTMyIGlkKSB7Ci0gICAgY2hhciAqIGhhc2hfaW4gPSBOVUxMOwotICAgIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgICB1bnNpZ25lZCBibTsKK3N0YXRpYyBpbnQgYm1hcF9oYXNoX2lkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdTMyIGlkKQoreworCWNoYXIgKmhhc2hfaW4gPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwl1bnNpZ25lZCBibTsKIAotICAgIGlmIChpZCA8PSAyKSB7Ci0JYm0gPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhc2hfaW4gPSAoY2hhciAqKSgmaWQpOwotICAgICAgICBoYXNoID0ga2V5ZWRfaGFzaChoYXNoX2luLCA0KTsKLQlibSA9IGhhc2ggJSBTQl9CTUFQX05SKHMpOwotCWlmICghYm0pCi0JICAgIGJtID0gMTsKLSAgICB9Ci0gICAgLyogdGhpcyBjYW4gb25seSBiZSB0cnVlIHdoZW4gU0JfQk1BUF9OUiA9IDEgKi8KLSAgICBpZiAoYm0gPj0gU0JfQk1BUF9OUihzKSkKLSAgICAJYm0gPSAwOwotICAgIHJldHVybiBibTsKKwlpZiAoaWQgPD0gMikgeworCQlibSA9IDE7CisJfSBlbHNlIHsKKwkJaGFzaF9pbiA9IChjaGFyICopKCZpZCk7CisJCWhhc2ggPSBrZXllZF9oYXNoKGhhc2hfaW4sIDQpOworCQlibSA9IGhhc2ggJSBTQl9CTUFQX05SKHMpOworCQlpZiAoIWJtKQorCQkJYm0gPSAxOworCX0KKwkvKiB0aGlzIGNhbiBvbmx5IGJlIHRydWUgd2hlbiBTQl9CTUFQX05SID0gMSAqLworCWlmIChibSA+PSBTQl9CTUFQX05SKHMpKQorCQlibSA9IDA7CisJcmV0dXJuIGJtOwogfQogCiAvKgogICogaGFzaGVzIHRoZSBpZCBhbmQgdGhlbiByZXR1cm5zID4gMCBpZiB0aGUgYmxvY2sgZ3JvdXAgZm9yIHRoZQogICogY29ycmVzcG9uZGluZyBoYXNoIGlzIGZ1bGwKICAqLwotc3RhdGljIGlubGluZSBpbnQgYmxvY2tfZ3JvdXBfdXNlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHUzMiBpZCkgewotICAgIGludCBibTsKLSAgICBibSA9IGJtYXBfaGFzaF9pZChzLCBpZCk7Ci0gICAgaWYgKFNCX0FQX0JJVE1BUChzKVtibV0uZnJlZV9jb3VudCA+ICgocy0+c19ibG9ja3NpemUgPDwgMykgKiA2MCAvIDEwMCkgKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKK3N0YXRpYyBpbmxpbmUgaW50IGJsb2NrX2dyb3VwX3VzZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1MzIgaWQpCit7CisJaW50IGJtOworCWJtID0gYm1hcF9oYXNoX2lkKHMsIGlkKTsKKwlpZiAoU0JfQVBfQklUTUFQKHMpW2JtXS5mcmVlX2NvdW50ID4gKChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAqIDYwIC8gMTAwKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CiB9CiAKIC8qCiAgKiB0aGUgcGFja2luZyBpcyByZXR1cm5lZCBpbiBkaXNrIGJ5dGUgb3JkZXIKICAqLwotX19sZTMyIHJlaXNlcmZzX2Nob29zZV9wYWNraW5nKHN0cnVjdCBpbm9kZSAqZGlyKQorX19sZTMyIHJlaXNlcmZzX2Nob29zZV9wYWNraW5nKHN0cnVjdCBpbm9kZSAqIGRpcikKIHsKLSAgICBfX2xlMzIgcGFja2luZzsKLSAgICBpZiAoVEVTVF9PUFRJT04ocGFja2luZ19ncm91cHMsIGRpci0+aV9zYikpIHsKLQl1MzIgcGFyZW50X2RpciA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQpOwotCS8qCi0JICogc29tZSB2ZXJzaW9ucyBvZiByZWlzZXJmc2NrIGV4cGVjdCBwYWNraW5nIGxvY2FsaXR5IDEgdG8gYmUKLQkgKiBzcGVjaWFsCi0JICovCi0JaWYgKHBhcmVudF9kaXIgPT0gMSB8fCBibG9ja19ncm91cF91c2VkKGRpci0+aV9zYixwYXJlbnRfZGlyKSkKLSAgICAgICAgICAgIHBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfZGlyX2lkOwotICAgIH0gZWxzZQotICAgICAgICBwYWNraW5nID0gSU5PREVfUEtFWShkaXIpLT5rX29iamVjdGlkOwotICAgIHJldHVybiBwYWNraW5nOworCV9fbGUzMiBwYWNraW5nOworCWlmIChURVNUX09QVElPTihwYWNraW5nX2dyb3VwcywgZGlyLT5pX3NiKSkgeworCQl1MzIgcGFyZW50X2RpciA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQpOworCQkvKgorCQkgKiBzb21lIHZlcnNpb25zIG9mIHJlaXNlcmZzY2sgZXhwZWN0IHBhY2tpbmcgbG9jYWxpdHkgMSB0byBiZQorCQkgKiBzcGVjaWFsCisJCSAqLworCQlpZiAocGFyZW50X2RpciA9PSAxIHx8IGJsb2NrX2dyb3VwX3VzZWQoZGlyLT5pX3NiLCBwYXJlbnRfZGlyKSkKKwkJCXBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQ7CisJCWVsc2UKKwkJCXBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfZGlyX2lkOworCX0gZWxzZQorCQlwYWNraW5nID0gSU5PREVfUEtFWShkaXIpLT5rX29iamVjdGlkOworCXJldHVybiBwYWNraW5nOwogfQotICAKKwogLyogVHJpZXMgdG8gZmluZCBjb250aWd1b3VzIHplcm8gYml0IHdpbmRvdyAoZ2l2ZW4gc2l6ZSkgaW4gZ2l2ZW4gcmVnaW9uIG9mCiAgKiBiaXRtYXAgYW5kIHBsYWNlIG5ldyBibG9ja3MgdGhlcmUuIFJldHVybnMgbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3MuICovCi1zdGF0aWMgaW50IHNjYW5fYml0bWFwIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCWJfYmxvY2tucl90ICpzdGFydCwgYl9ibG9ja25yX3QgZmluaXNoLAotCQkJaW50IG1pbiwgaW50IG1heCwgaW50IHVuZm0sIHVuc2lnbmVkIGxvbmcgZmlsZV9ibG9jaykKK3N0YXRpYyBpbnQgc2Nhbl9iaXRtYXAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBiX2Jsb2NrbnJfdCAqIHN0YXJ0LCBiX2Jsb2NrbnJfdCBmaW5pc2gsCisJCSAgICAgICBpbnQgbWluLCBpbnQgbWF4LCBpbnQgdW5mbSwgdW5zaWduZWQgbG9uZyBmaWxlX2Jsb2NrKQogewotICAgIGludCBucl9hbGxvY2F0ZWQ9MDsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzID0gdGgtPnRfc3VwZXI7Ci0gICAgLyogZmluZCBldmVyeSBibSBhbmQgYm1hcCBhbmQgYm1hcF9uciBpbiB0aGlzIGZpbGUsIGFuZCBjaGFuZ2UgdGhlbSBhbGwgdG8gYml0bWFwX2Jsb2NrbnIKLSAgICAgKiAtIEhhbnMsIGl0IGlzIG5vdCBhIGJsb2NrIG51bWJlciAtIFphbS4gKi8KKwlpbnQgbnJfYWxsb2NhdGVkID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwkvKiBmaW5kIGV2ZXJ5IGJtIGFuZCBibWFwIGFuZCBibWFwX25yIGluIHRoaXMgZmlsZSwgYW5kIGNoYW5nZSB0aGVtIGFsbCB0byBiaXRtYXBfYmxvY2tucgorCSAqIC0gSGFucywgaXQgaXMgbm90IGEgYmxvY2sgbnVtYmVyIC0gWmFtLiAqLwogCi0gICAgaW50IGJtLCBvZmY7Ci0gICAgaW50IGVuZF9ibSwgZW5kX29mZjsKLSAgICBpbnQgb2ZmX21heCA9IHMtPnNfYmxvY2tzaXplIDw8IDM7CisJaW50IGJtLCBvZmY7CisJaW50IGVuZF9ibSwgZW5kX29mZjsKKwlpbnQgb2ZmX21heCA9IHMtPnNfYmxvY2tzaXplIDw8IDM7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5jYWxsICk7IAotICAgIGlmICggU0JfRlJFRV9CTE9DS1MocykgPD0gMCkKLQlyZXR1cm4gMDsgLy8gTm8gcG9pbnQgaW4gbG9va2luZyBmb3IgbW9yZSBmcmVlIGJsb2NrcworCVBST0NfSU5GT19JTkMocywgc2Nhbl9iaXRtYXAuY2FsbCk7CisJaWYgKFNCX0ZSRUVfQkxPQ0tTKHMpIDw9IDApCisJCXJldHVybiAwOwkvLyBObyBwb2ludCBpbiBsb29raW5nIGZvciBtb3JlIGZyZWUgYmxvY2tzCiAKLSAgICBnZXRfYml0X2FkZHJlc3MgKHMsICpzdGFydCwgJmJtLCAmb2ZmKTsKLSAgICBnZXRfYml0X2FkZHJlc3MgKHMsIGZpbmlzaCwgJmVuZF9ibSwgJmVuZF9vZmYpOwotICAgIGlmIChibSA+IFNCX0JNQVBfTlIocykpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChlbmRfYm0gPiBTQl9CTUFQX05SKHMpKQotICAgICAgICBlbmRfYm0gPSBTQl9CTUFQX05SKHMpOworCWdldF9iaXRfYWRkcmVzcyhzLCAqc3RhcnQsICZibSwgJm9mZik7CisJZ2V0X2JpdF9hZGRyZXNzKHMsIGZpbmlzaCwgJmVuZF9ibSwgJmVuZF9vZmYpOworCWlmIChibSA+IFNCX0JNQVBfTlIocykpCisJCXJldHVybiAwOworCWlmIChlbmRfYm0gPiBTQl9CTUFQX05SKHMpKQorCQllbmRfYm0gPSBTQl9CTUFQX05SKHMpOwogCi0gICAgLyogV2hlbiB0aGUgYml0bWFwIGlzIG1vcmUgdGhhbiAxMCUgZnJlZSwgYW55b25lIGNhbiBhbGxvY2F0ZS4KLSAgICAgKiBXaGVuIGl0J3MgbGVzcyB0aGFuIDEwJSBmcmVlLCBvbmx5IGZpbGVzIHRoYXQgYWxyZWFkeSB1c2UgdGhlCi0gICAgICogYml0bWFwIGFyZSBhbGxvd2VkLiBPbmNlIHdlIHBhc3MgODAlIGZ1bGwsIHRoaXMgcmVzdHJpY3Rpb24KLSAgICAgKiBpcyBsaWZ0ZWQuCi0gICAgICoKLSAgICAgKiBXZSBkbyB0aGlzIHNvIHRoYXQgZmlsZXMgdGhhdCBncm93IGxhdGVyIHN0aWxsIGhhdmUgc3BhY2UgY2xvc2UgdG8KLSAgICAgKiB0aGVpciBvcmlnaW5hbCBhbGxvY2F0aW9uLiBUaGlzIGltcHJvdmVzIGxvY2FsaXR5LCBhbmQgcHJlc3VtYWJseQotICAgICAqIHBlcmZvcm1hbmNlIGFzIGEgcmVzdWx0LgotICAgICAqCi0gICAgICogVGhpcyBpcyBvbmx5IGFuIGFsbG9jYXRpb24gcG9saWN5IGFuZCBkb2VzIG5vdCBtYWtlIHVwIGZvciBnZXR0aW5nIGEKLSAgICAgKiBiYWQgaGludC4gRGVjZW50IGhpbnRpbmcgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0byB3b3JrIHdlbGwuCi0gICAgICovCi0gICAgaWYgKCBURVNUX09QVElPTihza2lwX2J1c3ksIHMpICYmIFNCX0ZSRUVfQkxPQ0tTKHMpID4gU0JfQkxPQ0tfQ09VTlQocykvMjAgKSB7Ci0JZm9yICg7Ym0gPCBlbmRfYm07IGJtKyssIG9mZiA9IDApIHsKLQkgICAgaWYgKCAoIG9mZiAmJiAoIXVuZm0gfHwgKGZpbGVfYmxvY2sgIT0gMCkpKSB8fCBTQl9BUF9CSVRNQVAocylbYm1dLmZyZWVfY291bnQgPiAocy0+c19ibG9ja3NpemUgPDwgMykgLyAxMCApCi0JCW5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgb2ZmX21heCwgbWluLCBtYXgsIHVuZm0pOwotCSAgICBpZiAobnJfYWxsb2NhdGVkKQotCQlnb3RvIHJldDsKLSAgICAgICAgfQotCS8qIHdlIGtub3cgZnJvbSBhYm92ZSB0aGF0IHN0YXJ0IGlzIGEgcmVhc29uYWJsZSBudW1iZXIgKi8KLQlnZXRfYml0X2FkZHJlc3MgKHMsICpzdGFydCwgJmJtLCAmb2ZmKTsKLSAgICB9CisJLyogV2hlbiB0aGUgYml0bWFwIGlzIG1vcmUgdGhhbiAxMCUgZnJlZSwgYW55b25lIGNhbiBhbGxvY2F0ZS4KKwkgKiBXaGVuIGl0J3MgbGVzcyB0aGFuIDEwJSBmcmVlLCBvbmx5IGZpbGVzIHRoYXQgYWxyZWFkeSB1c2UgdGhlCisJICogYml0bWFwIGFyZSBhbGxvd2VkLiBPbmNlIHdlIHBhc3MgODAlIGZ1bGwsIHRoaXMgcmVzdHJpY3Rpb24KKwkgKiBpcyBsaWZ0ZWQuCisJICoKKwkgKiBXZSBkbyB0aGlzIHNvIHRoYXQgZmlsZXMgdGhhdCBncm93IGxhdGVyIHN0aWxsIGhhdmUgc3BhY2UgY2xvc2UgdG8KKwkgKiB0aGVpciBvcmlnaW5hbCBhbGxvY2F0aW9uLiBUaGlzIGltcHJvdmVzIGxvY2FsaXR5LCBhbmQgcHJlc3VtYWJseQorCSAqIHBlcmZvcm1hbmNlIGFzIGEgcmVzdWx0LgorCSAqCisJICogVGhpcyBpcyBvbmx5IGFuIGFsbG9jYXRpb24gcG9saWN5IGFuZCBkb2VzIG5vdCBtYWtlIHVwIGZvciBnZXR0aW5nIGEKKwkgKiBiYWQgaGludC4gRGVjZW50IGhpbnRpbmcgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0byB3b3JrIHdlbGwuCisJICovCisJaWYgKFRFU1RfT1BUSU9OKHNraXBfYnVzeSwgcykKKwkgICAgJiYgU0JfRlJFRV9CTE9DS1MocykgPiBTQl9CTE9DS19DT1VOVChzKSAvIDIwKSB7CisJCWZvciAoOyBibSA8IGVuZF9ibTsgYm0rKywgb2ZmID0gMCkgeworCQkJaWYgKChvZmYgJiYgKCF1bmZtIHx8IChmaWxlX2Jsb2NrICE9IDApKSkKKwkJCSAgICB8fCBTQl9BUF9CSVRNQVAocylbYm1dLmZyZWVfY291bnQgPgorCQkJICAgIChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAvIDEwKQorCQkJCW5yX2FsbG9jYXRlZCA9CisJCQkJICAgIHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgb2ZmX21heCwKKwkJCQkJCSAgICAgIG1pbiwgbWF4LCB1bmZtKTsKKwkJCWlmIChucl9hbGxvY2F0ZWQpCisJCQkJZ290byByZXQ7CisJCX0KKwkJLyogd2Uga25vdyBmcm9tIGFib3ZlIHRoYXQgc3RhcnQgaXMgYSByZWFzb25hYmxlIG51bWJlciAqLworCQlnZXRfYml0X2FkZHJlc3MocywgKnN0YXJ0LCAmYm0sICZvZmYpOworCX0KIAotICAgIGZvciAoO2JtIDwgZW5kX2JtOyBibSsrLCBvZmYgPSAwKSB7Ci0JbnJfYWxsb2NhdGVkID0gc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBvZmZfbWF4LCBtaW4sIG1heCwgdW5mbSk7Ci0JaWYgKG5yX2FsbG9jYXRlZCkKLQkgICAgZ290byByZXQ7Ci0gICAgfQorCWZvciAoOyBibSA8IGVuZF9ibTsgYm0rKywgb2ZmID0gMCkgeworCQlucl9hbGxvY2F0ZWQgPQorCQkgICAgc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBvZmZfbWF4LCBtaW4sIG1heCwgdW5mbSk7CisJCWlmIChucl9hbGxvY2F0ZWQpCisJCQlnb3RvIHJldDsKKwl9CiAKLSAgICBucl9hbGxvY2F0ZWQgPSBzY2FuX2JpdG1hcF9ibG9jayh0aCwgYm0sICZvZmYsIGVuZF9vZmYgKyAxLCBtaW4sIG1heCwgdW5mbSk7Ci0gIAotIHJldDoKLSAgICAqc3RhcnQgPSBibSAqIG9mZl9tYXggKyBvZmY7Ci0gICAgcmV0dXJuIG5yX2FsbG9jYXRlZDsKKwlucl9hbGxvY2F0ZWQgPQorCSAgICBzY2FuX2JpdG1hcF9ibG9jayh0aCwgYm0sICZvZmYsIGVuZF9vZmYgKyAxLCBtaW4sIG1heCwgdW5mbSk7CisKKyAgICAgIHJldDoKKwkqc3RhcnQgPSBibSAqIG9mZl9tYXggKyBvZmY7CisJcmV0dXJuIG5yX2FsbG9jYXRlZDsKIAogfQogCi1zdGF0aWMgdm9pZCBfcmVpc2VyZnNfZnJlZV9ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaywKLQkJCQkgIGludCBmb3JfdW5mb3JtYXR0ZWQpCitzdGF0aWMgdm9pZCBfcmVpc2VyZnNfZnJlZV9ibG9jayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkgc3RydWN0IGlub2RlICppbm9kZSwgYl9ibG9ja25yX3QgYmxvY2ssCisJCQkJIGludCBmb3JfdW5mb3JtYXR0ZWQpCiB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcyA9IHRoLT50X3N1cGVyOwotICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNiaDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKmFwYmk7Ci0gICAgaW50IG5yLCBvZmZzZXQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXI7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpyczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNiaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKmFwYmk7CisJaW50IG5yLCBvZmZzZXQ7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBQUk9DX0lORk9fSU5DKCBzLCBmcmVlX2Jsb2NrICk7CisJUFJPQ19JTkZPX0lOQyhzLCBmcmVlX2Jsb2NrKTsKIAotICAgIHJzID0gU0JfRElTS19TVVBFUl9CTE9DSyAocyk7Ci0gICAgc2JoID0gU0JfQlVGRkVSX1dJVEhfU0IgKHMpOwotICAgIGFwYmkgPSBTQl9BUF9CSVRNQVAocyk7CisJcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLKHMpOworCXNiaCA9IFNCX0JVRkZFUl9XSVRIX1NCKHMpOworCWFwYmkgPSBTQl9BUF9CSVRNQVAocyk7CiAKLSAgICBnZXRfYml0X2FkZHJlc3MgKHMsIGJsb2NrLCAmbnIsICZvZmZzZXQpOworCWdldF9iaXRfYWRkcmVzcyhzLCBibG9jaywgJm5yLCAmb2Zmc2V0KTsKIAotICAgIGlmIChuciA+PSBzYl9ibWFwX25yIChycykpIHsKLQlyZWlzZXJmc193YXJuaW5nIChzLCAidnMtNDA3NTogcmVpc2VyZnNfZnJlZV9ibG9jazogIgotCQkJICAiYmxvY2sgJWx1IGlzIG91dCBvZiByYW5nZSBvbiAlcyIsCi0JCQkgIGJsb2NrLCByZWlzZXJmc19iZGV2bmFtZSAocykpOwotCXJldHVybjsKLSAgICB9CisJaWYgKG5yID49IHNiX2JtYXBfbnIocnMpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgInZzLTQwNzU6IHJlaXNlcmZzX2ZyZWVfYmxvY2s6ICIKKwkJCQkgImJsb2NrICVsdSBpcyBvdXQgb2YgcmFuZ2Ugb24gJXMiLAorCQkJCSBibG9jaywgcmVpc2VyZnNfYmRldm5hbWUocykpOworCQlyZXR1cm47CisJfQogCi0gICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBhcGJpW25yXS5iaCwgMSApIDsKKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGFwYmlbbnJdLmJoLCAxKTsKIAotICAgIC8qIGNsZWFyIGJpdCBmb3IgdGhlIGdpdmVuIGJsb2NrIGluIGJpdCBtYXAgKi8KLSAgICBpZiAoIXJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdCAob2Zmc2V0LCBhcGJpW25yXS5iaC0+Yl9kYXRhKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDgwOiByZWlzZXJmc19mcmVlX2Jsb2NrOiAiCi0JCQkgICJmcmVlX2Jsb2NrICglczolbHUpW2RldjpibG9ja25yXTogYml0IGFscmVhZHkgY2xlYXJlZCIsCi0JCQkgIHJlaXNlcmZzX2JkZXZuYW1lIChzKSwgYmxvY2spOwotICAgIH0KLSAgICBhcGJpW25yXS5mcmVlX2NvdW50ICsrOwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIGFwYmlbbnJdLmJoKTsKKwkvKiBjbGVhciBiaXQgZm9yIHRoZSBnaXZlbiBibG9jayBpbiBiaXQgbWFwICovCisJaWYgKCFyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQob2Zmc2V0LCBhcGJpW25yXS5iaC0+Yl9kYXRhKSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJ2cy00MDgwOiByZWlzZXJmc19mcmVlX2Jsb2NrOiAiCisJCQkJICJmcmVlX2Jsb2NrICglczolbHUpW2RldjpibG9ja25yXTogYml0IGFscmVhZHkgY2xlYXJlZCIsCisJCQkJIHJlaXNlcmZzX2JkZXZuYW1lKHMpLCBibG9jayk7CisJfQorCWFwYmlbbnJdLmZyZWVfY291bnQrKzsKKwlqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIGFwYmlbbnJdLmJoKTsKIAotICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgc2JoLCAxKSA7Ci0gICAgLyogdXBkYXRlIHN1cGVyIGJsb2NrICovCi0gICAgc2V0X3NiX2ZyZWVfYmxvY2tzKCBycywgc2JfZnJlZV9ibG9ja3MocnMpICsgMSApOworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgc2JoLCAxKTsKKwkvKiB1cGRhdGUgc3VwZXIgYmxvY2sgKi8KKwlzZXRfc2JfZnJlZV9ibG9ja3MocnMsIHNiX2ZyZWVfYmxvY2tzKHJzKSArIDEpOwogCi0gICAgam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgcywgc2JoKTsKLSAgICBpZiAoZm9yX3VuZm9ybWF0dGVkKQotICAgICAgICBEUVVPVF9GUkVFX0JMT0NLX05PRElSVFkoaW5vZGUsIDEpOworCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcywgc2JoKTsKKwlpZiAoZm9yX3VuZm9ybWF0dGVkKQorCQlEUVVPVF9GUkVFX0JMT0NLX05PRElSVFkoaW5vZGUsIDEpOwogfQogCi12b2lkIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwgYl9ibG9ja25yX3QgYmxvY2ssCi0JCQkgIGludCBmb3JfdW5mb3JtYXR0ZWQpCit2b2lkIHJlaXNlcmZzX2ZyZWVfYmxvY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgc3RydWN0IGlub2RlICppbm9kZSwgYl9ibG9ja25yX3QgYmxvY2ssCisJCQkgaW50IGZvcl91bmZvcm1hdHRlZCkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzID0gdGgtPnRfc3VwZXI7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXI7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBSRkFMU0UoIXMsICJ2cy00MDYxOiB0cnlpbmcgdG8gZnJlZSBibG9jayBvbiBub25leGlzdGVudCBkZXZpY2UiKTsKLSAgICBSRkFMU0UoaXNfcmV1c2FibGUgKHMsIGJsb2NrLCAxKSA9PSAwLCAidnMtNDA3MTogY2FuIG5vdCBmcmVlIHN1Y2ggYmxvY2siKTsKLSAgICAvKiBtYXJrIGl0IGJlZm9yZSB3ZSBjbGVhciBpdCwganVzdCBpbiBjYXNlICovCi0gICAgam91cm5hbF9tYXJrX2ZyZWVkKHRoLCBzLCBibG9jaykgOwotICAgIF9yZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgYmxvY2ssIGZvcl91bmZvcm1hdHRlZCkgOworCVJGQUxTRSghcywgInZzLTQwNjE6IHRyeWluZyB0byBmcmVlIGJsb2NrIG9uIG5vbmV4aXN0ZW50IGRldmljZSIpOworCVJGQUxTRShpc19yZXVzYWJsZShzLCBibG9jaywgMSkgPT0gMCwKKwkgICAgICAgInZzLTQwNzE6IGNhbiBub3QgZnJlZSBzdWNoIGJsb2NrIik7CisJLyogbWFyayBpdCBiZWZvcmUgd2UgY2xlYXIgaXQsIGp1c3QgaW4gY2FzZSAqLworCWpvdXJuYWxfbWFya19mcmVlZCh0aCwgcywgYmxvY2spOworCV9yZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgYmxvY2ssIGZvcl91bmZvcm1hdHRlZCk7CiB9CiAKIC8qIHByZWFsbG9jYXRlZCBibG9ja3MgZG9uJ3QgbmVlZCB0byBiZSBydW4gdGhyb3VnaCBqb3VybmFsX21hcmtfZnJlZWQgKi8KLXN0YXRpYyB2b2lkIHJlaXNlcmZzX2ZyZWVfcHJlYWxsb2NfYmxvY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaykgewotICAgIFJGQUxTRSghdGgtPnRfc3VwZXIsICJ2cy00MDYwOiB0cnlpbmcgdG8gZnJlZSBibG9jayBvbiBub25leGlzdGVudCBkZXZpY2UiKTsKLSAgICBSRkFMU0UoaXNfcmV1c2FibGUgKHRoLT50X3N1cGVyLCBibG9jaywgMSkgPT0gMCwgInZzLTQwNzA6IGNhbiBub3QgZnJlZSBzdWNoIGJsb2NrIik7Ci0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAgIF9yZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgYmxvY2ssIDEpIDsKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX2ZyZWVfcHJlYWxsb2NfYmxvY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaykKK3sKKwlSRkFMU0UoIXRoLT50X3N1cGVyLAorCSAgICAgICAidnMtNDA2MDogdHJ5aW5nIHRvIGZyZWUgYmxvY2sgb24gbm9uZXhpc3RlbnQgZGV2aWNlIik7CisJUkZBTFNFKGlzX3JldXNhYmxlKHRoLT50X3N1cGVyLCBibG9jaywgMSkgPT0gMCwKKwkgICAgICAgInZzLTQwNzA6IGNhbiBub3QgZnJlZSBzdWNoIGJsb2NrIik7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgMSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGlzY2FyZF9wcmVhbGxvYyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqIHRoLAotCQkJCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSkKK3N0YXRpYyB2b2lkIF9fZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWkpCiB7Ci0gICAgdW5zaWduZWQgbG9uZyBzYXZlID0gZWktPmlfcHJlYWxsb2NfYmxvY2sgOwotICAgIGludCBkaXJ0eSA9IDA7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9ICZlaS0+dmZzX2lub2RlOwotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwl1bnNpZ25lZCBsb25nIHNhdmUgPSBlaS0+aV9wcmVhbGxvY19ibG9jazsKKwlpbnQgZGlydHkgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmZWktPnZmc19pbm9kZTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBpZiAoZWktPmlfcHJlYWxsb2NfY291bnQgPCAwKQotCXJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAiemFtLTQwMDE6JXM6IGlub2RlIGhhcyBuZWdhdGl2ZSBwcmVhbGxvYyBibG9ja3MgY291bnQuIiwgX19GVU5DVElPTl9fICk7CisJaWYgKGVpLT5pX3ByZWFsbG9jX2NvdW50IDwgMCkKKwkJcmVpc2VyZnNfd2FybmluZyh0aC0+dF9zdXBlciwKKwkJCQkgInphbS00MDAxOiVzOiBpbm9kZSBoYXMgbmVnYXRpdmUgcHJlYWxsb2MgYmxvY2tzIGNvdW50LiIsCisJCQkJIF9fRlVOQ1RJT05fXyk7CiAjZW5kaWYKLSAgICB3aGlsZSAoZWktPmlfcHJlYWxsb2NfY291bnQgPiAwKSB7Ci0JcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayh0aCwgaW5vZGUsIGVpLT5pX3ByZWFsbG9jX2Jsb2NrKTsKLQllaS0+aV9wcmVhbGxvY19ibG9jaysrOwotCWVpLT5pX3ByZWFsbG9jX2NvdW50IC0tOwotCWRpcnR5ID0gMTsKLSAgICB9Ci0gICAgaWYgKGRpcnR5KQotICAgIAlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKLSAgICBlaS0+aV9wcmVhbGxvY19ibG9jayA9IHNhdmU7Ci0gICAgbGlzdF9kZWxfaW5pdCgmKGVpLT5pX3ByZWFsbG9jX2xpc3QpKTsKKwl3aGlsZSAoZWktPmlfcHJlYWxsb2NfY291bnQgPiAwKSB7CisJCXJlaXNlcmZzX2ZyZWVfcHJlYWxsb2NfYmxvY2sodGgsIGlub2RlLCBlaS0+aV9wcmVhbGxvY19ibG9jayk7CisJCWVpLT5pX3ByZWFsbG9jX2Jsb2NrKys7CisJCWVpLT5pX3ByZWFsbG9jX2NvdW50LS07CisJCWRpcnR5ID0gMTsKKwl9CisJaWYgKGRpcnR5KQorCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwllaS0+aV9wcmVhbGxvY19ibG9jayA9IHNhdmU7CisJbGlzdF9kZWxfaW5pdCgmKGVpLT5pX3ByZWFsbG9jX2xpc3QpKTsKIH0KIAogLyogRklYTUU6IEl0IHNob3VsZCBiZSBpbmxpbmUgZnVuY3Rpb24gKi8KLXZvaWQgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUpCit2b2lkIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2Moc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWkgPSBSRUlTRVJGU19JKGlub2RlKTsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgaWYgKGVpLT5pX3ByZWFsbG9jX2NvdW50KQotCV9fZGlzY2FyZF9wcmVhbGxvYyh0aCwgZWkpOworCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSA9IFJFSVNFUkZTX0koaW5vZGUpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCWlmIChlaS0+aV9wcmVhbGxvY19jb3VudCkKKwkJX19kaXNjYXJkX3ByZWFsbG9jKHRoLCBlaSk7CiB9CiAKLXZvaWQgcmVpc2VyZnNfZGlzY2FyZF9hbGxfcHJlYWxsb2MgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKQordm9pZCByZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCkKIHsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICogcGxpc3QgPSAmU0JfSk9VUk5BTCh0aC0+dF9zdXBlciktPmpfcHJlYWxsb2NfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCA9ICZTQl9KT1VSTkFMKHRoLT50X3N1cGVyKS0+al9wcmVhbGxvY19saXN0OwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgd2hpbGUgKCFsaXN0X2VtcHR5KHBsaXN0KSkgewotCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaTsKLQllaSA9IGxpc3RfZW50cnkocGxpc3QtPm5leHQsIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvLCBpX3ByZWFsbG9jX2xpc3QpOworCXdoaWxlICghbGlzdF9lbXB0eShwbGlzdCkpIHsKKwkJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpOworCQllaSA9IGxpc3RfZW50cnkocGxpc3QtPm5leHQsIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvLAorCQkJCWlfcHJlYWxsb2NfbGlzdCk7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JaWYgKCFlaS0+aV9wcmVhbGxvY19jb3VudCkgewotCSAgICByZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwgInphbS00MDAxOiVzOiBpbm9kZSBpcyBpbiBwcmVhbGxvYyBsaXN0IGJ1dCBoYXMgbm8gcHJlYWxsb2NhdGVkIGJsb2Nrcy4iLCBfX0ZVTkNUSU9OX18pOwotCX0KKwkJaWYgKCFlaS0+aV9wcmVhbGxvY19jb3VudCkgeworCQkJcmVpc2VyZnNfd2FybmluZyh0aC0+dF9zdXBlciwKKwkJCQkJICJ6YW0tNDAwMTolczogaW5vZGUgaXMgaW4gcHJlYWxsb2MgbGlzdCBidXQgaGFzIG5vIHByZWFsbG9jYXRlZCBibG9ja3MuIiwKKwkJCQkJIF9fRlVOQ1RJT05fXyk7CisJCX0KICNlbmRpZgotCV9fZGlzY2FyZF9wcmVhbGxvYyh0aCwgZWkpOwotICAgIH0KKwkJX19kaXNjYXJkX3ByZWFsbG9jKHRoLCBlaSk7CisJfQogfQogCi12b2lkIHJlaXNlcmZzX2luaXRfYWxsb2Nfb3B0aW9ucyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQordm9pZCByZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICAgIHNldF9iaXQgKF9BTExPQ19za2lwX2J1c3ksICZTQl9BTExPQ19PUFRTKHMpKTsKLSAgICBzZXRfYml0IChfQUxMT0NfZGlyaWRfZ3JvdXBzLCAmU0JfQUxMT0NfT1BUUyhzKSk7Ci0gICAgc2V0X2JpdCAoX0FMTE9DX3BhY2tpbmdfZ3JvdXBzLCAmU0JfQUxMT0NfT1BUUyhzKSk7CisJc2V0X2JpdChfQUxMT0Nfc2tpcF9idXN5LCAmU0JfQUxMT0NfT1BUUyhzKSk7CisJc2V0X2JpdChfQUxMT0NfZGlyaWRfZ3JvdXBzLCAmU0JfQUxMT0NfT1BUUyhzKSk7CisJc2V0X2JpdChfQUxMT0NfcGFja2luZ19ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKIH0KIAogLyogYmxvY2sgYWxsb2NhdG9yIHJlbGF0ZWQgb3B0aW9ucyBhcmUgcGFyc2VkIGhlcmUgKi8KLWludCByZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGNoYXIgKiBvcHRpb25zKQoraW50IHJlaXNlcmZzX3BhcnNlX2FsbG9jX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjaGFyICpvcHRpb25zKQogewotICAgIGNoYXIgKiB0aGlzX2NoYXIsICogdmFsdWU7CisJY2hhciAqdGhpc19jaGFyLCAqdmFsdWU7CiAKLSAgICBSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJpdHMgPSAwOyAvKiBjbGVhciBkZWZhdWx0IHNldHRpbmdzICovCisJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5iaXRzID0gMDsJLyogY2xlYXIgZGVmYXVsdCBzZXR0aW5ncyAqLwogCi0gICAgd2hpbGUgKCAodGhpc19jaGFyID0gc3Ryc2VwICgmb3B0aW9ucywgIjoiKSkgIT0gTlVMTCApIHsKLQlpZiAoKHZhbHVlID0gc3RyY2hyICh0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JICAgICp2YWx1ZSsrID0gMDsKKwl3aGlsZSAoKHRoaXNfY2hhciA9IHN0cnNlcCgmb3B0aW9ucywgIjoiKSkgIT0gTlVMTCkgeworCQlpZiAoKHZhbHVlID0gc3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKIAotCWlmICghc3RyY21wKHRoaXNfY2hhciwgImNvbmNlbnRyYXRpbmdfZm9ybWF0dGVkX25vZGVzIikpIHsKLQkgICAgaW50IHRlbXA7Ci0JICAgIFNFVF9PUFRJT04oY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMpOwotCSAgICB0ZW1wID0gKHZhbHVlICYmICp2YWx1ZSkgPyBzaW1wbGVfc3RydG91bCAodmFsdWUsICZ2YWx1ZSwgMCkgOiAxMDsKLQkgICAgaWYgKHRlbXAgPD0gMCB8fCB0ZW1wID4gMTAwKSB7Ci0JCVJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMuYm9yZGVyID0gMTA7Ci0JICAgIH0gZWxzZSB7Ci0JCVJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMuYm9yZGVyID0gMTAwIC8gdGVtcDsKLQkgICB9Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJkaXNwbGFjaW5nX2xhcmdlX2ZpbGVzIikpIHsKLQkgICAgU0VUX09QVElPTihkaXNwbGFjaW5nX2xhcmdlX2ZpbGVzKTsKLQkgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5sYXJnZV9maWxlX3NpemUgPQotCQkodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IDE2OwotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzIikpIHsKLQkgICAgU0VUX09QVElPTihkaXNwbGFjaW5nX25ld19wYWNraW5nX2xvY2FsaXRpZXMpOwotCSAgICBjb250aW51ZTsKLQl9OworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2RlcyIpKSB7CisJCQlpbnQgdGVtcDsKKwkJCVNFVF9PUFRJT04oY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMpOworCQkJdGVtcCA9ICh2YWx1ZQorCQkJCSYmICp2YWx1ZSkgPyBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLAorCQkJCQkJCSAgICAwKSA6IDEwOworCQkJaWYgKHRlbXAgPD0gMCB8fCB0ZW1wID4gMTAwKSB7CisJCQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXIgPSAxMDsKKwkJCX0gZWxzZSB7CisJCQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXIgPQorCQkJCSAgICAxMDAgLyB0ZW1wOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlzcGxhY2luZ19sYXJnZV9maWxlcyIpKSB7CisJCQlTRVRfT1BUSU9OKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMpOworCQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5sYXJnZV9maWxlX3NpemUgPQorCQkJICAgICh2YWx1ZQorCQkJICAgICAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCkgOiAxNjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyIpKSB7CisJCQlTRVRfT1BUSU9OKGRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyk7CisJCQljb250aW51ZTsKKwkJfTsKIAotCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9sZF9oYXNoZWRfcmVsb2NhdGlvbiIpKSB7Ci0JICAgIFNFVF9PUFRJT04ob2xkX2hhc2hlZF9yZWxvY2F0aW9uKTsKLQkgICAgY29udGludWU7CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9sZF9oYXNoZWRfcmVsb2NhdGlvbiIpKSB7CisJCQlTRVRfT1BUSU9OKG9sZF9oYXNoZWRfcmVsb2NhdGlvbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm5ld19oYXNoZWRfcmVsb2NhdGlvbiIpKSB7CisJCQlTRVRfT1BUSU9OKG5ld19oYXNoZWRfcmVsb2NhdGlvbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpcmlkX2dyb3VwcyIpKSB7CisJCQlTRVRfT1BUSU9OKGRpcmlkX2dyb3Vwcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvaWRfZ3JvdXBzIikpIHsKKwkJCVNFVF9PUFRJT04ob2lkX2dyb3Vwcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJwYWNraW5nX2dyb3VwcyIpKSB7CisJCQlTRVRfT1BUSU9OKHBhY2tpbmdfZ3JvdXBzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgImhhc2hlZF9mb3JtYXR0ZWRfbm9kZXMiKSkgeworCQkJU0VUX09QVElPTihoYXNoZWRfZm9ybWF0dGVkX25vZGVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAic2tpcF9idXN5IikpIHsKKwkJCVNFVF9PUFRJT04oc2tpcF9idXN5KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiaHVuZHJlZHRoX3NsaWNlcyIpKSB7CisJCQlTRVRfT1BUSU9OKGh1bmRyZWR0aF9zbGljZXMpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvbGRfd2F5IikpIHsKKwkJCVNFVF9PUFRJT04ob2xkX3dheSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkIikpIHsKKwkJCVNFVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJwcmVhbGxvY21pbiIpKSB7CisJCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jbWluID0KKwkJCSAgICAodmFsdWUKKwkJCSAgICAgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApIDogNDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAicHJlYWxsb2NzaXplIikpIHsKKwkJCVJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplID0KKwkJCSAgICAodmFsdWUKKwkJCSAgICAgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsCisJCQkJCQkJIDApIDoKKwkJCSAgICBQUkVBTExPQ0FUSU9OX1NJWkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlaXNlcmZzX3dhcm5pbmcocywgInphbS00MDAxOiAlcyA6IHVua25vd24gb3B0aW9uIC0gJXMiLAorCQkJCSBfX0ZVTkNUSU9OX18sIHRoaXNfY2hhcik7CisJCXJldHVybiAxOwogCX0KIAotCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm5ld19oYXNoZWRfcmVsb2NhdGlvbiIpKSB7Ci0JICAgIFNFVF9PUFRJT04obmV3X2hhc2hlZF9yZWxvY2F0aW9uKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAgIGlmICghc3RyY21wKHRoaXNfY2hhciwgImRpcmlkX2dyb3VwcyIpKSB7Ci0JICAgIFNFVF9PUFRJT04oZGlyaWRfZ3JvdXBzKTsKLQkgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2lkX2dyb3VwcyIpKSB7Ci0JICAgIFNFVF9PUFRJT04ob2lkX2dyb3Vwcyk7Ci0JICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY21wKHRoaXNfY2hhciwgInBhY2tpbmdfZ3JvdXBzIikpIHsKLQkgICAgU0VUX09QVElPTihwYWNraW5nX2dyb3Vwcyk7Ci0JICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiaGFzaGVkX2Zvcm1hdHRlZF9ub2RlcyIpKSB7Ci0JICAgIFNFVF9PUFRJT04oaGFzaGVkX2Zvcm1hdHRlZF9ub2Rlcyk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgInNraXBfYnVzeSIpKSB7Ci0JICAgIFNFVF9PUFRJT04oc2tpcF9idXN5KTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiaHVuZHJlZHRoX3NsaWNlcyIpKSB7Ci0JICAgIFNFVF9PUFRJT04oaHVuZHJlZHRoX3NsaWNlcyk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9sZF93YXkiKSkgewotCSAgICBTRVRfT1BUSU9OKG9sZF93YXkpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCIpKSB7Ci0JICAgIFNFVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJwcmVhbGxvY21pbiIpKSB7Ci0JICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gPQotCQkodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IDQ7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgInByZWFsbG9jc2l6ZSIpKSB7Ci0JICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplID0KLQkJKHZhbHVlICYmICp2YWx1ZSkgPyBzaW1wbGVfc3RydG91bCAodmFsdWUsICZ2YWx1ZSwgMCkgOiBQUkVBTExPQ0FUSU9OX1NJWkU7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ6YW0tNDAwMTogJXMgOiB1bmtub3duIG9wdGlvbiAtICVzIiwKLQkJCSAgX19GVU5DVElPTl9fICwgdGhpc19jaGFyKTsKLQlyZXR1cm4gMTsKLSAgICAgIH0KLSAgCi0gICAgcmVpc2VyZnNfd2FybmluZyAocywgImFsbG9jYXRvciBvcHRpb25zID0gWyUwOHhdXG4iLCBTQl9BTExPQ19PUFRTKHMpKTsKLSAgICByZXR1cm4gMDsKKwlyZWlzZXJmc193YXJuaW5nKHMsICJhbGxvY2F0b3Igb3B0aW9ucyA9IFslMDh4XVxuIiwgU0JfQUxMT0NfT1BUUyhzKSk7CisJcmV0dXJuIDA7CiB9Ci0gIAotc3RhdGljIGlubGluZSB2b2lkIG5ld19oYXNoZWRfcmVsb2NhdGlvbiAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQotewotICAgIGNoYXIgKiBoYXNoX2luOwotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSkgewotCSAgICBoYXNoX2luID0gKGNoYXIqKSZoaW50LT5rZXkua19kaXJfaWQ7Ci0gICAgfSBlbHNlIHsKLQlpZiAoIWhpbnQtPmlub2RlKSB7Ci0JICAgIC8vaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnOwotCSAgICBoYXNoX2luID0gKGNoYXIqKSZoaW50LT5rZXkua19kaXJfaWQ7Ci0JfSBlbHNlIAotCSAgICBpZiAoIFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCi0JCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKLQkgICAgZWxzZQotCQloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX29iamVjdGlkKTsKLSAgICAgIH0KIAotICAgIGhpbnQtPnNlYXJjaF9zdGFydCA9IGhpbnQtPmJlZyArIGtleWVkX2hhc2goaGFzaF9pbiwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXdfaGFzaGVkX3JlbG9jYXRpb24ocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworCWNoYXIgKmhhc2hfaW47CisJaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7CisJCWhhc2hfaW4gPSAoY2hhciAqKSZoaW50LT5rZXkua19kaXJfaWQ7CisJfSBlbHNlIHsKKwkJaWYgKCFoaW50LT5pbm9kZSkgeworCQkJLy9oaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWc7CisJCQloYXNoX2luID0gKGNoYXIgKikmaGludC0+a2V5LmtfZGlyX2lkOworCQl9IGVsc2UKKwkJICAgIGlmIChURVNUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCwgaGludC0+dGgtPnRfc3VwZXIpKQorCQkJaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOworCQllbHNlCisJCQloYXNoX2luID0KKwkJCSAgICAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOworCX0KKworCWhpbnQtPnNlYXJjaF9zdGFydCA9CisJICAgIGhpbnQtPmJlZyArIGtleWVkX2hhc2goaGFzaF9pbiwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKIH0KIAogLyoKICAqIFJlbG9jYXRpb24gYmFzZWQgb24gZGlyaWQsIGhhc2hpbmcgdGhlbSBpbnRvIGEgZ2l2ZW4gYml0bWFwIGJsb2NrCiAgKiBmaWxlcy4gRm9ybWF0dGVkIG5vZGVzIGFyZSB1bmFmZmVjdGVkLCBhIHNlcGVyYXRlIHBvbGljeSBjb3ZlcnMgdGhlbQogICovCi1zdGF0aWMgdm9pZAotZGlyaWRfZ3JvdXBzIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3N0YXRpYyB2b2lkIGRpcmlkX2dyb3VwcyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCiB7Ci0gICAgdW5zaWduZWQgbG9uZyBoYXNoOwotICAgIF9fdTMyIGRpcmlkID0gMDsKLSAgICBpbnQgYm0gPSAwOwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBoaW50LT50aC0+dF9zdXBlcjsKLSAgICBpZiAoaGludC0+aW5vZGUpCi0JZGlyaWQgPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOwotICAgIGVsc2UgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKQotICAgICAgICBkaXJpZCA9IGhpbnQtPmtleS5rX2Rpcl9pZDsKLQotICAgIGlmIChkaXJpZCkgewotCWJtID0gYm1hcF9oYXNoX2lkKHNiLCBkaXJpZCk7Ci0JaGFzaCA9IGJtICogKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKLQkvKiBnaXZlIGEgcG9ydGlvbiBvZiB0aGUgYmxvY2sgZ3JvdXAgdG8gbWV0YWRhdGEgKi8KKwl1bnNpZ25lZCBsb25nIGhhc2g7CisJX191MzIgZGlyaWQgPSAwOworCWludCBibSA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGhpbnQtPnRoLT50X3N1cGVyOwogCWlmIChoaW50LT5pbm9kZSkKLQkgICAgaGFzaCArPSBzYi0+c19ibG9ja3NpemUvMjsKLQloaW50LT5zZWFyY2hfc3RhcnQgPSBoYXNoOwotICAgIH0KKwkJZGlyaWQgPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOworCWVsc2UgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKQorCQlkaXJpZCA9IGhpbnQtPmtleS5rX2Rpcl9pZDsKKworCWlmIChkaXJpZCkgeworCQlibSA9IGJtYXBfaGFzaF9pZChzYiwgZGlyaWQpOworCQloYXNoID0gYm0gKiAoc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCQkvKiBnaXZlIGEgcG9ydGlvbiBvZiB0aGUgYmxvY2sgZ3JvdXAgdG8gbWV0YWRhdGEgKi8KKwkJaWYgKGhpbnQtPmlub2RlKQorCQkJaGFzaCArPSBzYi0+c19ibG9ja3NpemUgLyAyOworCQloaW50LT5zZWFyY2hfc3RhcnQgPSBoYXNoOworCX0KIH0KIAogLyoKICAqIFJlbG9jYXRpb24gYmFzZWQgb24gb2lkLCBoYXNoaW5nIHRoZW0gaW50byBhIGdpdmVuIGJpdG1hcCBibG9jawogICogZmlsZXMuIEZvcm1hdHRlZCBub2RlcyBhcmUgdW5hZmZlY3RlZCwgYSBzZXBlcmF0ZSBwb2xpY3kgY292ZXJzIHRoZW0KICAqLwotc3RhdGljIHZvaWQKLW9pZF9ncm91cHMgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIHZvaWQgb2lkX2dyb3VwcyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCiB7Ci0gICAgaWYgKGhpbnQtPmlub2RlKSB7Ci0JdW5zaWduZWQgbG9uZyBoYXNoOwotCV9fdTMyIG9pZDsKLQlfX3UzMiBkaXJpZDsKLQlpbnQgYm07CisJaWYgKGhpbnQtPmlub2RlKSB7CisJCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwkJX191MzIgb2lkOworCQlfX3UzMiBkaXJpZDsKKwkJaW50IGJtOwogCi0JZGlyaWQgPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOworCQlkaXJpZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CiAKLQkvKiBrZWVwIHRoZSByb290IGRpciBhbmQgaXQncyBmaXJzdCBzZXQgb2Ygc3ViZGlycyBjbG9zZSB0bwotCSAqIHRoZSBzdGFydCBvZiB0aGUgZGlzawotCSAqLwotCWlmIChkaXJpZCA8PSAyKQotCSAgICBoYXNoID0gKGhpbnQtPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKLQllbHNlIHsKLQkgICAgb2lkID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOwotCSAgICBibSA9IGJtYXBfaGFzaF9pZChoaW50LT5pbm9kZS0+aV9zYiwgb2lkKTsKLQkgICAgaGFzaCA9IGJtICogKGhpbnQtPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKwkJLyoga2VlcCB0aGUgcm9vdCBkaXIgYW5kIGl0J3MgZmlyc3Qgc2V0IG9mIHN1YmRpcnMgY2xvc2UgdG8KKwkJICogdGhlIHN0YXJ0IG9mIHRoZSBkaXNrCisJCSAqLworCQlpZiAoZGlyaWQgPD0gMikKKwkJCWhhc2ggPSAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCQllbHNlIHsKKwkJCW9pZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX29iamVjdGlkKTsKKwkJCWJtID0gYm1hcF9oYXNoX2lkKGhpbnQtPmlub2RlLT5pX3NiLCBvaWQpOworCQkJaGFzaCA9IGJtICogKGhpbnQtPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKwkJfQorCQloaW50LT5zZWFyY2hfc3RhcnQgPSBoYXNoOwogCX0KLQloaW50LT5zZWFyY2hfc3RhcnQgPSBoYXNoOwotICAgIH0KIH0KIAogLyogcmV0dXJucyAxIGlmIGl0IGZpbmRzIGFuIGluZGlyZWN0IGl0ZW0gYW5kIGdldHMgdmFsaWQgaGludCBpbmZvCiAgKiBmcm9tIGl0LCBvdGhlcndpc2UgMAogICovCi1zdGF0aWMgaW50IGdldF9sZWZ0X25laWdoYm9yKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIGludCBnZXRfbGVmdF9uZWlnaGJvcihyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCiB7Ci0gICAgc3RydWN0IHBhdGggKiBwYXRoOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgICBpbnQgcG9zX2luX2l0ZW07Ci0gICAgX19sZTMyICogaXRlbTsKLSAgICBpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCBwb3NfaW5faXRlbTsKKwlfX2xlMzIgKml0ZW07CisJaW50IHJldCA9IDA7CiAKLSAgICBpZiAoIWhpbnQtPnBhdGgpCQkvKiByZWlzZXJmcyBjb2RlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdy9vIHBvaW50ZXIgdG8gcGF0aAorCWlmICghaGludC0+cGF0aCkJLyogcmVpc2VyZnMgY29kZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHcvbyBwb2ludGVyIHRvIHBhdGgKIAkJCQkgKiBzdHJ1Y3R1cmUgc3VwcGxpZWQ7IHRoZW4gd2UgcmVseSBvbiBzdXBwbGllZCBzZWFyY2hfc3RhcnQgKi8KLQlyZXR1cm4gMDsKKwkJcmV0dXJuIDA7CiAKLSAgICBwYXRoID0gaGludC0+cGF0aDsKLSAgICBiaCA9IGdldF9sYXN0X2JoKHBhdGgpOwotICAgIFJGQUxTRSggIWJoLCAiZ3JlZW4tNDAwMjogSWxsZWdhbCBwYXRoIHNwZWNpZmllZCB0byBnZXRfbGVmdF9uZWlnaGJvciIpOwotICAgIGloID0gZ2V0X2loKHBhdGgpOwotICAgIHBvc19pbl9pdGVtID0gcGF0aC0+cG9zX2luX2l0ZW07Ci0gICAgaXRlbSA9IGdldF9pdGVtIChwYXRoKTsKKwlwYXRoID0gaGludC0+cGF0aDsKKwliaCA9IGdldF9sYXN0X2JoKHBhdGgpOworCVJGQUxTRSghYmgsICJncmVlbi00MDAyOiBJbGxlZ2FsIHBhdGggc3BlY2lmaWVkIHRvIGdldF9sZWZ0X25laWdoYm9yIik7CisJaWggPSBnZXRfaWgocGF0aCk7CisJcG9zX2luX2l0ZW0gPSBwYXRoLT5wb3NfaW5faXRlbTsKKwlpdGVtID0gZ2V0X2l0ZW0ocGF0aCk7CiAKLSAgICBoaW50LT5zZWFyY2hfc3RhcnQgPSBiaC0+Yl9ibG9ja25yOworCWhpbnQtPnNlYXJjaF9zdGFydCA9IGJoLT5iX2Jsb2NrbnI7CiAKLSAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGlzX2luZGlyZWN0X2xlX2loIChpaCkpIHsKLQkvKiBmb3IgaW5kaXJlY3QgaXRlbTogZ28gdG8gbGVmdCBhbmQgbG9vayBmb3IgdGhlIGZpcnN0IG5vbi1ob2xlIGVudHJ5Ci0JICAgaW4gdGhlIGluZGlyZWN0IGl0ZW0gKi8KLQlpZiAocG9zX2luX2l0ZW0gPT0gSV9VTkZNX05VTSAoaWgpKQotCSAgICBwb3NfaW5faXRlbS0tOwotLy8JICAgIHBvc19pbl9pdGVtID0gSV9VTkZNX05VTSAoaWgpIC0gMTsKLQl3aGlsZSAocG9zX2luX2l0ZW0gPj0gMCkgewotCSAgICBpbnQgdD1nZXRfYmxvY2tfbnVtKGl0ZW0scG9zX2luX2l0ZW0pOwotCSAgICBpZiAodCkgewotCQloaW50LT5zZWFyY2hfc3RhcnQgPSB0OwotCQlyZXQgPSAxOwotCQlicmVhazsKLQkgICAgfQotCSAgICBwb3NfaW5faXRlbSAtLTsKKwlpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGlzX2luZGlyZWN0X2xlX2loKGloKSkgeworCQkvKiBmb3IgaW5kaXJlY3QgaXRlbTogZ28gdG8gbGVmdCBhbmQgbG9vayBmb3IgdGhlIGZpcnN0IG5vbi1ob2xlIGVudHJ5CisJCSAgIGluIHRoZSBpbmRpcmVjdCBpdGVtICovCisJCWlmIChwb3NfaW5faXRlbSA9PSBJX1VORk1fTlVNKGloKSkKKwkJCXBvc19pbl9pdGVtLS07CisvLyAgICAgICAgICBwb3NfaW5faXRlbSA9IElfVU5GTV9OVU0gKGloKSAtIDE7CisJCXdoaWxlIChwb3NfaW5faXRlbSA+PSAwKSB7CisJCQlpbnQgdCA9IGdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pOworCQkJaWYgKHQpIHsKKwkJCQloaW50LT5zZWFyY2hfc3RhcnQgPSB0OworCQkJCXJldCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwb3NfaW5faXRlbS0tOworCQl9CiAJfQotICAgIH0KIAotICAgIC8qIGRvZXMgcmVzdWx0IHZhbHVlIGZpdCBpbnRvIHNwZWNpZmllZCByZWdpb24/ICovCi0gICAgcmV0dXJuIHJldDsKKwkvKiBkb2VzIHJlc3VsdCB2YWx1ZSBmaXQgaW50byBzcGVjaWZpZWQgcmVnaW9uPyAqLworCXJldHVybiByZXQ7CiB9CiAKIC8qIHNob3VsZCBiZSwgaWYgZm9ybWF0dGVkIG5vZGUsIHRoZW4gdHJ5IHRvIHB1dCBvbiBmaXJzdCBwYXJ0IG9mIHRoZSBkZXZpY2UKICAgIHNwZWNpZmllZCBhcyBudW1iZXIgb2YgcGVyY2VudCB3aXRoIG1vdW50IG9wdGlvbiBkZXZpY2UsIGVsc2UgdHJ5IHRvIHB1dAogICAgb24gbGFzdCBvZiBkZXZpY2UuICBUaGlzIGlzIG5vdCB0byBzYXkgaXQgaXMgZ29vZCBjb2RlIHRvIGRvIHNvLAogICAgYnV0IHRoZSBlZmZlY3Qgc2hvdWxkIGJlIG1lYXN1cmVkLiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYm9yZGVyX2luX2hpbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCByZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYm9yZGVyX2luX2hpbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJCSAgICAgIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBiX2Jsb2NrbnJfdCBib3JkZXIgPSBTQl9CTE9DS19DT1VOVChzKSAvIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMuYm9yZGVyOworCWJfYmxvY2tucl90IGJvcmRlciA9CisJICAgIFNCX0JMT0NLX0NPVU5UKHMpIC8gUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXI7CiAKLSAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpCi0JaGludC0+ZW5kID0gYm9yZGVyIC0gMTsKLSAgICBlbHNlCi0JaGludC0+YmVnID0gYm9yZGVyOworCWlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSkKKwkJaGludC0+ZW5kID0gYm9yZGVyIC0gMTsKKwllbHNlCisJCWhpbnQtPmJlZyA9IGJvcmRlcjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRpc3BsYWNlX2xhcmdlX2ZpbGUocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxhY2VfbGFyZ2VfZmlsZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCiB7Ci0gICAgaWYgKCBURVNUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCwgaGludC0+dGgtPnRfc3VwZXIpKQotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhpbnQtPmJlZyArIGtleWVkX2hhc2goKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCksIDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7Ci0gICAgZWxzZQotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhpbnQtPmJlZyArIGtleWVkX2hhc2goKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX29iamVjdGlkKSwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKKwlpZiAoVEVTVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQsIGhpbnQtPnRoLT50X3N1cGVyKSkKKwkJaGludC0+c2VhcmNoX3N0YXJ0ID0KKwkJICAgIGhpbnQtPmJlZyArCisJCSAgICBrZXllZF9oYXNoKChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpLAorCQkJICAgICAgIDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7CisJZWxzZQorCQloaW50LT5zZWFyY2hfc3RhcnQgPQorCQkgICAgaGludC0+YmVnICsKKwkJICAgIGtleWVkX2hhc2goKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX29iamVjdGlkKSwKKwkJCSAgICAgICA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFzaF9mb3JtYXR0ZWRfbm9kZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX2Zvcm1hdHRlZF9ub2RlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgIGNoYXIgKiBoYXNoX2luOworCWNoYXIgKmhhc2hfaW47CiAKLSAgIGlmICghaGludC0+aW5vZGUpCi0JaGFzaF9pbiA9IChjaGFyKikmaGludC0+a2V5LmtfZGlyX2lkOwotICAgIGVsc2UgaWYgKCBURVNUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCwgaGludC0+dGgtPnRfc3VwZXIpKQotCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKLSAgICBlbHNlCi0JaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCk7CisJaWYgKCFoaW50LT5pbm9kZSkKKwkJaGFzaF9pbiA9IChjaGFyICopJmhpbnQtPmtleS5rX2Rpcl9pZDsKKwllbHNlIGlmIChURVNUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCwgaGludC0+dGgtPnRfc3VwZXIpKQorCQloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisJZWxzZQorCQloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX29iamVjdGlkKTsKIAotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhpbnQtPmJlZyArIGtleWVkX2hhc2goaGFzaF9pbiwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKKwloaW50LT5zZWFyY2hfc3RhcnQgPQorCSAgICBoaW50LT5iZWcgKyBrZXllZF9oYXNoKGhhc2hfaW4sIDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHRoaXNfYmxvY2tucl9hbGxvY2F0aW9uX3dvdWxkX21ha2VfaXRfYV9sYXJnZV9maWxlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIGlubGluZSBpbnQKK3RoaXNfYmxvY2tucl9hbGxvY2F0aW9uX3dvdWxkX21ha2VfaXRfYV9sYXJnZV9maWxlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICoKKwkJCQkJCSAgIGhpbnQpCiB7Ci0gICAgcmV0dXJuIGhpbnQtPmJsb2NrID09IFJFSVNFUkZTX1NCKGhpbnQtPnRoLT50X3N1cGVyKS0+c19hbGxvY19vcHRpb25zLmxhcmdlX2ZpbGVfc2l6ZTsKKwlyZXR1cm4gaGludC0+YmxvY2sgPT0KKwkgICAgUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMubGFyZ2VfZmlsZV9zaXplOwogfQogCiAjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotc3RhdGljIGlubGluZSB2b2lkIGRpc3BsYWNlX25ld19wYWNraW5nX2xvY2FsaXR5IChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNwbGFjZV9uZXdfcGFja2luZ19sb2NhbGl0eShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCiB7Ci0gICAgc3RydWN0IGluX2NvcmVfa2V5ICoga2V5ID0gJmhpbnQtPmtleTsKKwlzdHJ1Y3QgaW5fY29yZV9rZXkgKmtleSA9ICZoaW50LT5rZXk7CiAKLSAgICBoaW50LT50aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcyA9IDA7Ci0gICAgaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciopKCZrZXktPmtfb2JqZWN0aWQpLDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7CisJaGludC0+dGgtPmRpc3BsYWNlX25ld19ibG9ja3MgPSAwOworCWhpbnQtPnNlYXJjaF9zdGFydCA9CisJICAgIGhpbnQtPmJlZyArIGtleWVkX2hhc2goKGNoYXIgKikoJmtleS0+a19vYmplY3RpZCksCisJCQkJICAgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKIH0KLSAgI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IG9sZF9oYXNoZWRfcmVsb2NhdGlvbiAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQotewotICAgIGJfYmxvY2tucl90IGJvcmRlcjsKLSAgICB1MzIgaGFzaF9pbjsKLSAgICAKLSAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgfHwgaGludC0+aW5vZGUgPT0gTlVMTCkgewotCXJldHVybiAwOwotICAgICAgfQotCi0gICAgaGFzaF9pbiA9IGxlMzJfdG9fY3B1KChJTk9ERV9QS0VZKGhpbnQtPmlub2RlKSktPmtfZGlyX2lkKTsKLSAgICBib3JkZXIgPSBoaW50LT5iZWcgKyAodTMyKSBrZXllZF9oYXNoKCgoY2hhciAqKSAoJmhhc2hfaW4pKSwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnIC0gMSk7Ci0gICAgaWYgKGJvcmRlciA+IGhpbnQtPnNlYXJjaF9zdGFydCkKLQloaW50LT5zZWFyY2hfc3RhcnQgPSBib3JkZXI7Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotICAKLXN0YXRpYyBpbmxpbmUgaW50IG9sZF93YXkgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKLXsKLSAgICBiX2Jsb2NrbnJfdCBib3JkZXI7Ci0gICAgCi0gICAgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlIHx8IGhpbnQtPmlub2RlID09IE5VTEwpIHsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIAotICAgICAgYm9yZGVyID0gaGludC0+YmVnICsgbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKSAlIChoaW50LT5lbmQgIC0gaGludC0+YmVnKTsKLSAgICBpZiAoYm9yZGVyID4gaGludC0+c2VhcmNoX3N0YXJ0KQotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGJvcmRlcjsKLQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaHVuZHJlZHRoX3NsaWNlcyAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQotewotICAgIHN0cnVjdCBpbl9jb3JlX2tleSAqIGtleSA9ICZoaW50LT5rZXk7Ci0gICAgYl9ibG9ja25yX3Qgc2xpY2Vfc3RhcnQ7Ci0KLSAgICBzbGljZV9zdGFydCA9IChrZXllZF9oYXNoKChjaGFyKikoJmtleS0+a19kaXJfaWQpLDQpICUgMTAwKSAqIChoaW50LT5lbmQgLyAxMDApOwotICAgIGlmICggc2xpY2Vfc3RhcnQgPiBoaW50LT5zZWFyY2hfc3RhcnQgfHwgc2xpY2Vfc3RhcnQgKyAoaGludC0+ZW5kIC8gMTAwKSA8PSBoaW50LT5zZWFyY2hfc3RhcnQpIHsKLQloaW50LT5zZWFyY2hfc3RhcnQgPSBzbGljZV9zdGFydDsKLSAgICB9Ci19Ci0gIAotc3RhdGljIHZvaWQgZGV0ZXJtaW5lX3NlYXJjaF9zdGFydChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwKLQkJCQkJICBpbnQgYW1vdW50X25lZWRlZCkKLXsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBoaW50LT50aC0+dF9zdXBlcjsKLSAgICBpbnQgdW5mbV9oaW50OwotCi0gICAgaGludC0+YmVnID0gMDsKLSAgICBoaW50LT5lbmQgPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7Ci0KLSAgICAvKiBUaGlzIGlzIGZvcm1lciBib3JkZXIgYWxnb3JpdGhtLiBOb3cgd2l0aCB0dW5hYmxlIGJvcmRlciBvZmZzZXQgKi8KLSAgICBpZiAoY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMocykpCi0Jc2V0X2JvcmRlcl9pbl9oaW50KHMsIGhpbnQpOwotCi0jaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotICAgIC8qIHdoZW5ldmVyIHdlIGNyZWF0ZSBhIG5ldyBkaXJlY3RvcnksIHdlIGRpc3BsYWNlIGl0LiAgQXQgZmlyc3Qgd2Ugd2lsbAotICAgICAgIGhhc2ggZm9yIGxvY2F0aW9uLCBsYXRlciB3ZSBtaWdodCBsb29rIGZvciBhIG1vZGVyYXRlbHkgZW1wdHkgcGxhY2UgZm9yCi0gICAgICAgaXQgKi8KLSAgICBpZiAoZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzKHMpCi0JJiYgaGludC0+dGgtPmRpc3BsYWNlX25ld19ibG9ja3MpIHsKLQlkaXNwbGFjZV9uZXdfcGFja2luZ19sb2NhbGl0eShoaW50KTsKLQotCS8qIHdlIGRvIG5vdCBjb250aW51ZSBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0LAotCSAqIGlmIG5ldyBwYWNraW5nIGxvY2FsaXR5IGlzIGJlaW5nIGRpc3BsYWNlZCAqLwotCXJldHVybjsKLSAgICB9CQkJCSAgICAgIAogI2VuZGlmCi0gIAotICAgIC8qIGFsbCBwZXJzb25zIHNob3VsZCBmZWVsIGVuY291cmFnZWQgdG8gYWRkIG1vcmUgc3BlY2lhbCBjYXNlcyBoZXJlIGFuZAotICAgICAqIHRlc3QgdGhlbSAqLwogCi0gICAgaWYgKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMocykgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlCi0JJiYgdGhpc19ibG9ja25yX2FsbG9jYXRpb25fd291bGRfbWFrZV9pdF9hX2xhcmdlX2ZpbGUoaGludCkpIHsKLQlkaXNwbGFjZV9sYXJnZV9maWxlKGhpbnQpOwotCXJldHVybjsKLSAgICB9CitzdGF0aWMgaW5saW5lIGludCBvbGRfaGFzaGVkX3JlbG9jYXRpb24ocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworCWJfYmxvY2tucl90IGJvcmRlcjsKKwl1MzIgaGFzaF9pbjsKIAotICAgIC8qIGlmIG5vbmUgb2Ygb3VyIHNwZWNpYWwgY2FzZXMgaXMgcmVsZXZhbnQsIHVzZSB0aGUgbGVmdCBuZWlnaGJvciBpbiB0aGUKLSAgICAgICB0cmVlIG9yZGVyIG9mIHRoZSBuZXcgbm9kZSB3ZSBhcmUgYWxsb2NhdGluZyBmb3IgKi8KLSAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgVEVTVF9PUFRJT04oaGFzaGVkX2Zvcm1hdHRlZF9ub2RlcyxzKSkgewotICAgICAgICBoYXNoX2Zvcm1hdHRlZF9ub2RlKGhpbnQpOwotCXJldHVybjsKLSAgICB9CisJaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlIHx8IGhpbnQtPmlub2RlID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgdW5mbV9oaW50ID0gZ2V0X2xlZnRfbmVpZ2hib3IoaGludCk7CisJaGFzaF9pbiA9IGxlMzJfdG9fY3B1KChJTk9ERV9QS0VZKGhpbnQtPmlub2RlKSktPmtfZGlyX2lkKTsKKwlib3JkZXIgPQorCSAgICBoaW50LT5iZWcgKyAodTMyKSBrZXllZF9oYXNoKCgoY2hhciAqKSgmaGFzaF9pbikpLAorCQkJCQkgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnIC0gMSk7CisJaWYgKGJvcmRlciA+IGhpbnQtPnNlYXJjaF9zdGFydCkKKwkJaGludC0+c2VhcmNoX3N0YXJ0ID0gYm9yZGVyOwogCi0gICAgLyogTWltaWMgb2xkIGJsb2NrIGFsbG9jYXRvciBiZWhhdmlvdXIsIHRoYXQgaXMgaWYgVkZTIGFsbG93ZWQgZm9yIHByZWFsbG9jYXRpb24sCi0gICAgICAgbmV3IGJsb2NrcyBhcmUgZGlzcGxhY2VkIGJhc2VkIG9uIGRpcmVjdG9yeSBJRC4gQWxzbywgaWYgc3VnZ2VzdGVkIHNlYXJjaF9zdGFydAotICAgICAgIGlzIGxlc3MgdGhhbiBsYXN0IHByZWFsbG9jYXRlZCBibG9jaywgd2Ugc3RhcnQgc2VhcmNoaW5nIGZyb20gaXQsIGFzc3VtaW5nIHRoYXQKLSAgICAgICBIREQgZGF0YWZsb3cgaXMgZmFzdGVyIGluIGZvcndhcmQgZGlyZWN0aW9uICovCi0gICAgaWYgKCBURVNUX09QVElPTihvbGRfd2F5LCBzKSkgewotCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKLQkgICAgaWYgKCAhcmVpc2VyZnNfaGFzaGVkX3JlbG9jYXRpb24ocykpCi0JCW9sZF93YXkoaGludCk7Ci0JICAgIGVsc2UgaWYgKCFyZWlzZXJmc19ub191bmhhc2hlZF9yZWxvY2F0aW9uKHMpKQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBvbGRfd2F5KHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKK3sKKwliX2Jsb2NrbnJfdCBib3JkZXI7CisKKwlpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgfHwgaGludC0+aW5vZGUgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlib3JkZXIgPQorCSAgICBoaW50LT5iZWcgKworCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpICUgKGhpbnQtPmVuZCAtCisJCQkJCQkJICAgICAgaGludC0+YmVnKTsKKwlpZiAoYm9yZGVyID4gaGludC0+c2VhcmNoX3N0YXJ0KQorCQloaW50LT5zZWFyY2hfc3RhcnQgPSBib3JkZXI7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGh1bmRyZWR0aF9zbGljZXMocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworCXN0cnVjdCBpbl9jb3JlX2tleSAqa2V5ID0gJmhpbnQtPmtleTsKKwliX2Jsb2NrbnJfdCBzbGljZV9zdGFydDsKKworCXNsaWNlX3N0YXJ0ID0KKwkgICAgKGtleWVkX2hhc2goKGNoYXIgKikoJmtleS0+a19kaXJfaWQpLCA0KSAlIDEwMCkgKiAoaGludC0+ZW5kIC8gMTAwKTsKKwlpZiAoc2xpY2Vfc3RhcnQgPiBoaW50LT5zZWFyY2hfc3RhcnQKKwkgICAgfHwgc2xpY2Vfc3RhcnQgKyAoaGludC0+ZW5kIC8gMTAwKSA8PSBoaW50LT5zZWFyY2hfc3RhcnQpIHsKKwkJaGludC0+c2VhcmNoX3N0YXJ0ID0gc2xpY2Vfc3RhcnQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwKKwkJCQkgICBpbnQgYW1vdW50X25lZWRlZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBoaW50LT50aC0+dF9zdXBlcjsKKwlpbnQgdW5mbV9oaW50OworCisJaGludC0+YmVnID0gMDsKKwloaW50LT5lbmQgPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7CisKKwkvKiBUaGlzIGlzIGZvcm1lciBib3JkZXIgYWxnb3JpdGhtLiBOb3cgd2l0aCB0dW5hYmxlIGJvcmRlciBvZmZzZXQgKi8KKwlpZiAoY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMocykpCisJCXNldF9ib3JkZXJfaW5faGludChzLCBoaW50KTsKKworI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKKwkvKiB3aGVuZXZlciB3ZSBjcmVhdGUgYSBuZXcgZGlyZWN0b3J5LCB3ZSBkaXNwbGFjZSBpdC4gIEF0IGZpcnN0IHdlIHdpbGwKKwkgICBoYXNoIGZvciBsb2NhdGlvbiwgbGF0ZXIgd2UgbWlnaHQgbG9vayBmb3IgYSBtb2RlcmF0ZWx5IGVtcHR5IHBsYWNlIGZvcgorCSAgIGl0ICovCisJaWYgKGRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyhzKQorCSAgICAmJiBoaW50LT50aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcykgeworCQlkaXNwbGFjZV9uZXdfcGFja2luZ19sb2NhbGl0eShoaW50KTsKKworCQkvKiB3ZSBkbyBub3QgY29udGludWUgZGV0ZXJtaW5lX3NlYXJjaF9zdGFydCwKKwkJICogaWYgbmV3IHBhY2tpbmcgbG9jYWxpdHkgaXMgYmVpbmcgZGlzcGxhY2VkICovCisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCS8qIGFsbCBwZXJzb25zIHNob3VsZCBmZWVsIGVuY291cmFnZWQgdG8gYWRkIG1vcmUgc3BlY2lhbCBjYXNlcyBoZXJlIGFuZAorCSAqIHRlc3QgdGhlbSAqLworCisJaWYgKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMocykgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlCisJICAgICYmIHRoaXNfYmxvY2tucl9hbGxvY2F0aW9uX3dvdWxkX21ha2VfaXRfYV9sYXJnZV9maWxlKGhpbnQpKSB7CisJCWRpc3BsYWNlX2xhcmdlX2ZpbGUoaGludCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiBub25lIG9mIG91ciBzcGVjaWFsIGNhc2VzIGlzIHJlbGV2YW50LCB1c2UgdGhlIGxlZnQgbmVpZ2hib3IgaW4gdGhlCisJICAgdHJlZSBvcmRlciBvZiB0aGUgbmV3IG5vZGUgd2UgYXJlIGFsbG9jYXRpbmcgZm9yICovCisJaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKGhhc2hlZF9mb3JtYXR0ZWRfbm9kZXMsIHMpKSB7CisJCWhhc2hfZm9ybWF0dGVkX25vZGUoaGludCk7CisJCXJldHVybjsKKwl9CisKKwl1bmZtX2hpbnQgPSBnZXRfbGVmdF9uZWlnaGJvcihoaW50KTsKKworCS8qIE1pbWljIG9sZCBibG9jayBhbGxvY2F0b3IgYmVoYXZpb3VyLCB0aGF0IGlzIGlmIFZGUyBhbGxvd2VkIGZvciBwcmVhbGxvY2F0aW9uLAorCSAgIG5ldyBibG9ja3MgYXJlIGRpc3BsYWNlZCBiYXNlZCBvbiBkaXJlY3RvcnkgSUQuIEFsc28sIGlmIHN1Z2dlc3RlZCBzZWFyY2hfc3RhcnQKKwkgICBpcyBsZXNzIHRoYW4gbGFzdCBwcmVhbGxvY2F0ZWQgYmxvY2ssIHdlIHN0YXJ0IHNlYXJjaGluZyBmcm9tIGl0LCBhc3N1bWluZyB0aGF0CisJICAgSEREIGRhdGFmbG93IGlzIGZhc3RlciBpbiBmb3J3YXJkIGRpcmVjdGlvbiAqLworCWlmIChURVNUX09QVElPTihvbGRfd2F5LCBzKSkgeworCQlpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7CisJCQlpZiAoIXJlaXNlcmZzX2hhc2hlZF9yZWxvY2F0aW9uKHMpKQorCQkJCW9sZF93YXkoaGludCk7CisJCQllbHNlIGlmICghcmVpc2VyZnNfbm9fdW5oYXNoZWRfcmVsb2NhdGlvbihzKSkKKwkJCQlvbGRfaGFzaGVkX3JlbG9jYXRpb24oaGludCk7CisKKwkJCWlmIChoaW50LT5pbm9kZQorCQkJICAgICYmIGhpbnQtPnNlYXJjaF9zdGFydCA8CisJCQkgICAgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2spCisJCQkJaGludC0+c2VhcmNoX3N0YXJ0ID0KKwkJCQkgICAgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2s7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIFRoaXMgaXMgYW4gYXBwcm9hY2ggcHJvcG9zZWQgYnkgSGFucyAqLworCWlmIChURVNUX09QVElPTihodW5kcmVkdGhfc2xpY2VzLCBzKQorCSAgICAmJiAhKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMocykgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSkgeworCQlodW5kcmVkdGhfc2xpY2VzKGhpbnQpOworCQlyZXR1cm47CisJfQorCisJLyogb2xkX2hhc2hlZF9yZWxvY2F0aW9uIG9ubHkgd29ya3Mgb24gdW5mb3JtYXR0ZWQgKi8KKwlpZiAoIXVuZm1faGludCAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUgJiYKKwkgICAgVEVTVF9PUFRJT04ob2xkX2hhc2hlZF9yZWxvY2F0aW9uLCBzKSkgewogCQlvbGRfaGFzaGVkX3JlbG9jYXRpb24oaGludCk7CisJfQorCS8qIG5ld19oYXNoZWRfcmVsb2NhdGlvbiB3b3JrcyB3aXRoIGJvdGggZm9ybWF0dGVkL3VuZm9ybWF0dGVkIG5vZGVzICovCisJaWYgKCghdW5mbV9oaW50IHx8IGhpbnQtPmZvcm1hdHRlZF9ub2RlKSAmJgorCSAgICBURVNUX09QVElPTihuZXdfaGFzaGVkX3JlbG9jYXRpb24sIHMpKSB7CisJCW5ld19oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKKwl9CisJLyogZGlyaWQgZ3JvdXBpbmcgd29ya3Mgb25seSBvbiB1bmZvcm1hdHRlZCBub2RlcyAqLworCWlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihkaXJpZF9ncm91cHMsIHMpKSB7CisJCWRpcmlkX2dyb3VwcyhoaW50KTsKKwl9CisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworCWlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihkaXJpZF9ncm91cHMsIHMpKSB7CisJCWRpcmlkX2dyb3VwcyhoaW50KTsKKwl9CisjZW5kaWYKIAotCSAgICBpZiAoIGhpbnQtPmlub2RlICYmIGhpbnQtPnNlYXJjaF9zdGFydCA8IFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrKQotCQloaW50LT5zZWFyY2hfc3RhcnQgPSBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19ibG9jazsKKwkvKiBvaWQgZ3JvdXBpbmcgd29ya3Mgb25seSBvbiB1bmZvcm1hdHRlZCBub2RlcyAqLworCWlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihvaWRfZ3JvdXBzLCBzKSkgeworCQlvaWRfZ3JvdXBzKGhpbnQpOwogCX0KIAlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogVGhpcyBpcyBhbiBhcHByb2FjaCBwcm9wb3NlZCBieSBIYW5zICovCi0gICAgaWYgKCBURVNUX09QVElPTihodW5kcmVkdGhfc2xpY2VzLCBzKSAmJiAhIChkaXNwbGFjaW5nX2xhcmdlX2ZpbGVzKHMpICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSkpIHsKLQlodW5kcmVkdGhfc2xpY2VzKGhpbnQpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBvbGRfaGFzaGVkX3JlbG9jYXRpb24gb25seSB3b3JrcyBvbiB1bmZvcm1hdHRlZCAqLwotICAgIGlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJgotICAgICAgICBURVNUX09QVElPTihvbGRfaGFzaGVkX3JlbG9jYXRpb24sIHMpKQotICAgIHsKLQlvbGRfaGFzaGVkX3JlbG9jYXRpb24oaGludCk7Ci0gICAgfQotICAgIC8qIG5ld19oYXNoZWRfcmVsb2NhdGlvbiB3b3JrcyB3aXRoIGJvdGggZm9ybWF0dGVkL3VuZm9ybWF0dGVkIG5vZGVzICovCi0gICAgaWYgKCghdW5mbV9oaW50IHx8IGhpbnQtPmZvcm1hdHRlZF9ub2RlKSAmJgotICAgICAgICBURVNUX09QVElPTihuZXdfaGFzaGVkX3JlbG9jYXRpb24sIHMpKQotICAgIHsKLQluZXdfaGFzaGVkX3JlbG9jYXRpb24oaGludCk7Ci0gICAgfQotICAgIC8qIGRpcmlkIGdyb3VwaW5nIHdvcmtzIG9ubHkgb24gdW5mb3JtYXR0ZWQgbm9kZXMgKi8KLSAgICBpZiAoIXVuZm1faGludCAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgVEVTVF9PUFRJT04oZGlyaWRfZ3JvdXBzLHMpKQotICAgIHsKLSAgICAgICAgZGlyaWRfZ3JvdXBzKGhpbnQpOwotICAgIH0KLQotI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgVEVTVF9PUFRJT04oZGlyaWRfZ3JvdXBzLHMpKQotICAgIHsKLSAgICAgICAgZGlyaWRfZ3JvdXBzKGhpbnQpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogb2lkIGdyb3VwaW5nIHdvcmtzIG9ubHkgb24gdW5mb3JtYXR0ZWQgbm9kZXMgKi8KLSAgICBpZiAoIXVuZm1faGludCAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgVEVTVF9PUFRJT04ob2lkX2dyb3VwcyxzKSkKLSAgICB7Ci0gICAgICAgIG9pZF9ncm91cHMoaGludCk7Ci0gICAgfQotICAgIHJldHVybjsKIH0KIAogc3RhdGljIGludCBkZXRlcm1pbmVfcHJlYWxsb2Nfc2l6ZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCiB7Ci0gICAgLyogbWFrZSBtaW5pbXVtIHNpemUgYSBtb3VudCBvcHRpb24gYW5kIGJlbmNobWFyayBib3RoIHdheXMgKi8KLSAgICAvKiB3ZSBwcmVhbGxvY2F0ZSBibG9ja3Mgb25seSBmb3IgcmVndWxhciBmaWxlcywgc3BlY2lmaWMgc2l6ZSAqLwotICAgIC8qIGJlbmNobWFyayBwcmVhbGxvY2F0aW5nIGFsd2F5cyBhbmQgc2VlIHdoYXQgaGFwcGVucyAqLworCS8qIG1ha2UgbWluaW11bSBzaXplIGEgbW91bnQgb3B0aW9uIGFuZCBiZW5jaG1hcmsgYm90aCB3YXlzICovCisJLyogd2UgcHJlYWxsb2NhdGUgYmxvY2tzIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMsIHNwZWNpZmljIHNpemUgKi8KKwkvKiBiZW5jaG1hcmsgcHJlYWxsb2NhdGluZyBhbHdheXMgYW5kIHNlZSB3aGF0IGhhcHBlbnMgKi8KIAotICAgIGhpbnQtPnByZWFsbG9jX3NpemUgPSAwOworCWhpbnQtPnByZWFsbG9jX3NpemUgPSAwOwogCi0gICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBoaW50LT5wcmVhbGxvY2F0ZSkgewotCWlmIChTX0lTUkVHKGhpbnQtPmlub2RlLT5pX21vZGUpCi0JICAgICYmIGhpbnQtPmlub2RlLT5pX3NpemUgPj0gUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gKiBoaW50LT5pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpCi0JICAgIGhpbnQtPnByZWFsbG9jX3NpemUgPSBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUgLSAxOwotICAgIH0KLSAgICByZXR1cm4gQ0FSUllfT047CisJaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBoaW50LT5wcmVhbGxvY2F0ZSkgeworCQlpZiAoU19JU1JFRyhoaW50LT5pbm9kZS0+aV9tb2RlKQorCQkgICAgJiYgaGludC0+aW5vZGUtPmlfc2l6ZSA+PQorCQkgICAgUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMuCisJCSAgICBwcmVhbGxvY21pbiAqIGhpbnQtPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwkJCWhpbnQtPnByZWFsbG9jX3NpemUgPQorCQkJICAgIFJFSVNFUkZTX1NCKGhpbnQtPnRoLT50X3N1cGVyKS0+c19hbGxvY19vcHRpb25zLgorCQkJICAgIHByZWFsbG9jc2l6ZSAtIDE7CisJfQorCXJldHVybiBDQVJSWV9PTjsKIH0KIAogLyogWFhYIEkga25vdyBpdCBjb3VsZCBiZSBtZXJnZWQgd2l0aCB1cHBlci1sZXZlbCBmdW5jdGlvbjsKICAgIGJ1dCBtYXkgYmUgcmVzdWx0IGZ1bmN0aW9uIHdvdWxkIGJlIHRvbyBjb21wbGV4LiAqLwotc3RhdGljIGlubGluZSBpbnQgYWxsb2NhdGVfd2l0aG91dF93cmFwcGluZ19kaXNrIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQsCi0JCQkJCSBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywKLQkJCQkJIGJfYmxvY2tucl90IHN0YXJ0LCBiX2Jsb2NrbnJfdCBmaW5pc2gsCi0JCQkJCSBpbnQgbWluLAotCQkJCQkgaW50IGFtb3VudF9uZWVkZWQsIGludCBwcmVhbGxvY19zaXplKQorc3RhdGljIGlubGluZSBpbnQgYWxsb2NhdGVfd2l0aG91dF93cmFwcGluZ19kaXNrKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwKKwkJCQkJCSBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywKKwkJCQkJCSBiX2Jsb2NrbnJfdCBzdGFydCwKKwkJCQkJCSBiX2Jsb2NrbnJfdCBmaW5pc2gsIGludCBtaW4sCisJCQkJCQkgaW50IGFtb3VudF9uZWVkZWQsCisJCQkJCQkgaW50IHByZWFsbG9jX3NpemUpCiB7Ci0gICAgaW50IHJlc3QgPSBhbW91bnRfbmVlZGVkOwotICAgIGludCBucl9hbGxvY2F0ZWQ7Ci0gIAotICAgIHdoaWxlIChyZXN0ID4gMCAmJiBzdGFydCA8PSBmaW5pc2gpIHsKLQlucl9hbGxvY2F0ZWQgPSBzY2FuX2JpdG1hcCAoaGludC0+dGgsICZzdGFydCwgZmluaXNoLCBtaW4sCi0JCQkJICAgIHJlc3QgKyBwcmVhbGxvY19zaXplLCAhaGludC0+Zm9ybWF0dGVkX25vZGUsCi0JCQkJICAgIGhpbnQtPmJsb2NrKTsKKwlpbnQgcmVzdCA9IGFtb3VudF9uZWVkZWQ7CisJaW50IG5yX2FsbG9jYXRlZDsKIAotCWlmIChucl9hbGxvY2F0ZWQgPT0gMCkJLyogbm8gbmV3IGJsb2NrcyBhbGxvY2F0ZWQsIHJldHVybiAqLwotCSAgICBicmVhazsKLQkKLQkvKiBmaWxsIGZyZWVfYmxvY2tucnMgYXJyYXkgZmlyc3QgKi8KLQl3aGlsZSAocmVzdCA+IDAgJiYgbnJfYWxsb2NhdGVkID4gMCkgewotCSAgICAqIG5ld19ibG9ja25ycyArKyA9IHN0YXJ0ICsrOwotCSAgICByZXN0IC0tOyBucl9hbGxvY2F0ZWQgLS07CisJd2hpbGUgKHJlc3QgPiAwICYmIHN0YXJ0IDw9IGZpbmlzaCkgeworCQlucl9hbGxvY2F0ZWQgPSBzY2FuX2JpdG1hcChoaW50LT50aCwgJnN0YXJ0LCBmaW5pc2gsIG1pbiwKKwkJCQkJICAgcmVzdCArIHByZWFsbG9jX3NpemUsCisJCQkJCSAgICFoaW50LT5mb3JtYXR0ZWRfbm9kZSwgaGludC0+YmxvY2spOworCisJCWlmIChucl9hbGxvY2F0ZWQgPT0gMCkJLyogbm8gbmV3IGJsb2NrcyBhbGxvY2F0ZWQsIHJldHVybiAqLworCQkJYnJlYWs7CisKKwkJLyogZmlsbCBmcmVlX2Jsb2NrbnJzIGFycmF5IGZpcnN0ICovCisJCXdoaWxlIChyZXN0ID4gMCAmJiBucl9hbGxvY2F0ZWQgPiAwKSB7CisJCQkqbmV3X2Jsb2NrbnJzKysgPSBzdGFydCsrOworCQkJcmVzdC0tOworCQkJbnJfYWxsb2NhdGVkLS07CisJCX0KKworCQkvKiBkbyB3ZSBoYXZlIHNvbWV0aGluZyB0byBmaWxsIHByZWFsbG9jLiBhcnJheSBhbHNvID8gKi8KKwkJaWYgKG5yX2FsbG9jYXRlZCA+IDApIHsKKwkJCS8qIGl0IG1lYW5zIHByZWFsbG9jX3NpemUgd2FzIGdyZWF0ZXIgdGhhdCAwIGFuZCB3ZSBkbyBwcmVhbGxvY2F0aW9uICovCisJCQlsaXN0X2FkZCgmUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfbGlzdCwKKwkJCQkgJlNCX0pPVVJOQUwoaGludC0+dGgtPnRfc3VwZXIpLT4KKwkJCQkgal9wcmVhbGxvY19saXN0KTsKKwkJCVJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gc3RhcnQ7CisJCQlSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9CisJCQkgICAgbnJfYWxsb2NhdGVkOworCQkJYnJlYWs7CisJCX0KIAl9CiAKLQkvKiBkbyB3ZSBoYXZlIHNvbWV0aGluZyB0byBmaWxsIHByZWFsbG9jLiBhcnJheSBhbHNvID8gKi8KLQlpZiAobnJfYWxsb2NhdGVkID4gMCkgewotCSAgICAvKiBpdCBtZWFucyBwcmVhbGxvY19zaXplIHdhcyBncmVhdGVyIHRoYXQgMCBhbmQgd2UgZG8gcHJlYWxsb2NhdGlvbiAqLwotCSAgICBsaXN0X2FkZCgmUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfbGlzdCwKLQkJICAgICAmU0JfSk9VUk5BTChoaW50LT50aC0+dF9zdXBlciktPmpfcHJlYWxsb2NfbGlzdCk7Ci0JICAgIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gc3RhcnQ7Ci0JICAgIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID0gbnJfYWxsb2NhdGVkOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIChhbW91bnRfbmVlZGVkIC0gcmVzdCk7CisJcmV0dXJuIChhbW91bnRfbmVlZGVkIC0gcmVzdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGJsb2NrbnJzX2FuZF9wcmVhbGxvY19hcnJheXNfZnJvbV9zZWFyY2hfc3RhcnQKLSAgICAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQsIGJfYmxvY2tucl90ICpuZXdfYmxvY2tucnMsIGludCBhbW91bnRfbmVlZGVkKQotewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOwotICAgIGJfYmxvY2tucl90IHN0YXJ0ID0gaGludC0+c2VhcmNoX3N0YXJ0OwotICAgIGJfYmxvY2tucl90IGZpbmlzaCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKLSAgICBpbnQgcGFzc25vID0gMDsKLSAgICBpbnQgbnJfYWxsb2NhdGVkID0gMDsKLSAgICBpbnQgYmlnYWxsb2MgPSAwOworICAgIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQsIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorICAgICBpbnQgYW1vdW50X25lZWRlZCkgeworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOworCWJfYmxvY2tucl90IHN0YXJ0ID0gaGludC0+c2VhcmNoX3N0YXJ0OworCWJfYmxvY2tucl90IGZpbmlzaCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKKwlpbnQgcGFzc25vID0gMDsKKwlpbnQgbnJfYWxsb2NhdGVkID0gMDsKKwlpbnQgYmlnYWxsb2MgPSAwOwogCi0gICAgZGV0ZXJtaW5lX3ByZWFsbG9jX3NpemUoaGludCk7Ci0gICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgewotICAgICAgICBpbnQgcXVvdGFfcmV0OworCWRldGVybWluZV9wcmVhbGxvY19zaXplKGhpbnQpOworCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKwkJaW50IHF1b3RhX3JldDsKICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotCXJlaXNlcmZzX2RlYnVnIChzLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGE6IGFsbG9jYXRpbmcgJWQgYmxvY2tzIGlkPSV1IiwgYW1vdW50X25lZWRlZCwgaGludC0+aW5vZGUtPmlfdWlkKTsKKwkJcmVpc2VyZnNfZGVidWcocywgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCSAgICAgICAicmVpc2VycXVvdGE6IGFsbG9jYXRpbmcgJWQgYmxvY2tzIGlkPSV1IiwKKwkJCSAgICAgICBhbW91bnRfbmVlZGVkLCBoaW50LT5pbm9kZS0+aV91aWQpOwogI2VuZGlmCi0JcXVvdGFfcmV0ID0gRFFVT1RfQUxMT0NfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgYW1vdW50X25lZWRlZCk7Ci0JaWYgKHF1b3RhX3JldCkgICAgLyogUXVvdGEgZXhjZWVkZWQ/ICovCi0JICAgIHJldHVybiBRVU9UQV9FWENFRURFRDsKLQlpZiAoaGludC0+cHJlYWxsb2NhdGUgJiYgaGludC0+cHJlYWxsb2Nfc2l6ZSApIHsKKwkJcXVvdGFfcmV0ID0KKwkJICAgIERRVU9UX0FMTE9DX0JMT0NLX05PRElSVFkoaGludC0+aW5vZGUsIGFtb3VudF9uZWVkZWQpOworCQlpZiAocXVvdGFfcmV0KQkvKiBRdW90YSBleGNlZWRlZD8gKi8KKwkJCXJldHVybiBRVU9UQV9FWENFRURFRDsKKwkJaWYgKGhpbnQtPnByZWFsbG9jYXRlICYmIGhpbnQtPnByZWFsbG9jX3NpemUpIHsKICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotCSAgICByZWlzZXJmc19kZWJ1ZyAocywgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhOiBhbGxvY2F0aW5nIChwcmVhbGxvYykgJWQgYmxvY2tzIGlkPSV1IiwgaGludC0+cHJlYWxsb2Nfc2l6ZSwgaGludC0+aW5vZGUtPmlfdWlkKTsKKwkJCXJlaXNlcmZzX2RlYnVnKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJICAgICAgICJyZWlzZXJxdW90YTogYWxsb2NhdGluZyAocHJlYWxsb2MpICVkIGJsb2NrcyBpZD0ldSIsCisJCQkJICAgICAgIGhpbnQtPnByZWFsbG9jX3NpemUsIGhpbnQtPmlub2RlLT5pX3VpZCk7CiAjZW5kaWYKLQkgICAgcXVvdGFfcmV0ID0gRFFVT1RfUFJFQUxMT0NfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgaGludC0+cHJlYWxsb2Nfc2l6ZSk7Ci0JICAgIGlmIChxdW90YV9yZXQpCi0JCWhpbnQtPnByZWFsbG9jYXRlPWhpbnQtPnByZWFsbG9jX3NpemU9MDsKKwkJCXF1b3RhX3JldCA9CisJCQkgICAgRFFVT1RfUFJFQUxMT0NfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwKKwkJCQkJCQkgaGludC0+cHJlYWxsb2Nfc2l6ZSk7CisJCQlpZiAocXVvdGFfcmV0KQorCQkJCWhpbnQtPnByZWFsbG9jYXRlID0gaGludC0+cHJlYWxsb2Nfc2l6ZSA9IDA7CisJCX0KKwkJLyogZm9yIHVuZm9ybWF0dGVkIG5vZGVzLCBmb3JjZSBsYXJnZSBhbGxvY2F0aW9ucyAqLworCQliaWdhbGxvYyA9IGFtb3VudF9uZWVkZWQ7CiAJfQotCS8qIGZvciB1bmZvcm1hdHRlZCBub2RlcywgZm9yY2UgbGFyZ2UgYWxsb2NhdGlvbnMgKi8KLQliaWdhbGxvYyA9IGFtb3VudF9uZWVkZWQ7Ci0gICAgfQogCi0gICAgZG8gewotCS8qIGluIGJpZ2FsbG9jIG1vZGUsIG5yX2FsbG9jYXRlZCBzaG91bGQgc3RheSB6ZXJvIHVudGlsCi0JICogdGhlIGVudGlyZSBhbGxvY2F0aW9uIGlzIGZpbGxlZAotCSAqLwotCWlmICh1bmxpa2VseShiaWdhbGxvYyAmJiBucl9hbGxvY2F0ZWQpKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImJpZ2FsbG9jIGlzICVkLCBucl9hbGxvY2F0ZWQgJWRcbiIsCi0JICAgIGJpZ2FsbG9jLCBucl9hbGxvY2F0ZWQpOwotCSAgICAvKiByZXNldCB0aGluZ3MgdG8gYSBzYW5lIHZhbHVlICovCi0JICAgIGJpZ2FsbG9jID0gYW1vdW50X25lZWRlZCAtIG5yX2FsbG9jYXRlZDsKLQl9Ci0JLyoKLQkgKiB0cnkgcGFzcyAwIGFuZCBwYXNzIDEgbG9va2luZyBmb3IgYSBuaWNlIGJpZwotCSAqIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbi4gIFRoZW4gcmVzZXQgYW5kIGxvb2sKLQkgKiBmb3IgYW55dGhpbmcgeW91IGNhbiBmaW5kLgotCSAqLwotCWlmIChwYXNzbm8gPT0gMiAmJiBiaWdhbGxvYykgewotCSAgICBwYXNzbm8gPSAwOwotCSAgICBiaWdhbGxvYyA9IDA7Ci0JfQotCXN3aXRjaCAocGFzc25vKyspIHsKLSAgICAgICAgY2FzZSAwOiAvKiBTZWFyY2ggZnJvbSBoaW50LT5zZWFyY2hfc3RhcnQgdG8gZW5kIG9mIGRpc2sgKi8KLQkgICAgc3RhcnQgPSBoaW50LT5zZWFyY2hfc3RhcnQ7Ci0JICAgIGZpbmlzaCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKLQkgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogLyogU2VhcmNoIGZyb20gaGludC0+YmVnIHRvIGhpbnQtPnNlYXJjaF9zdGFydCAqLwotCSAgICBzdGFydCA9IGhpbnQtPmJlZzsKLQkgICAgZmluaXNoID0gaGludC0+c2VhcmNoX3N0YXJ0OwotCSAgICBicmVhazsKLQljYXNlIDI6IC8qIExhc3QgY2hhbmNlOiBTZWFyY2ggZnJvbSAwIHRvIGhpbnQtPmJlZyAqLwotCSAgICBzdGFydCA9IDA7Ci0JICAgIGZpbmlzaCA9IGhpbnQtPmJlZzsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDogLyogV2UndmUgdHJpZWQgc2VhcmNoaW5nIGV2ZXJ5d2hlcmUsIG5vdCBlbm91Z2ggc3BhY2UgKi8KLQkgICAgLyogRnJlZSB0aGUgYmxvY2tzICovCi0JICAgIGlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKwlkbyB7CisJCS8qIGluIGJpZ2FsbG9jIG1vZGUsIG5yX2FsbG9jYXRlZCBzaG91bGQgc3RheSB6ZXJvIHVudGlsCisJCSAqIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiBpcyBmaWxsZWQKKwkJICovCisJCWlmICh1bmxpa2VseShiaWdhbGxvYyAmJiBucl9hbGxvY2F0ZWQpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJiaWdhbGxvYyBpcyAlZCwgbnJfYWxsb2NhdGVkICVkXG4iLAorCQkJCQkgYmlnYWxsb2MsIG5yX2FsbG9jYXRlZCk7CisJCQkvKiByZXNldCB0aGluZ3MgdG8gYSBzYW5lIHZhbHVlICovCisJCQliaWdhbGxvYyA9IGFtb3VudF9uZWVkZWQgLSBucl9hbGxvY2F0ZWQ7CisJCX0KKwkJLyoKKwkJICogdHJ5IHBhc3MgMCBhbmQgcGFzcyAxIGxvb2tpbmcgZm9yIGEgbmljZSBiaWcKKwkJICogY29udGlndW91cyBhbGxvY2F0aW9uLiAgVGhlbiByZXNldCBhbmQgbG9vaworCQkgKiBmb3IgYW55dGhpbmcgeW91IGNhbiBmaW5kLgorCQkgKi8KKwkJaWYgKHBhc3NubyA9PSAyICYmIGJpZ2FsbG9jKSB7CisJCQlwYXNzbm8gPSAwOworCQkJYmlnYWxsb2MgPSAwOworCQl9CisJCXN3aXRjaCAocGFzc25vKyspIHsKKwkJY2FzZSAwOgkvKiBTZWFyY2ggZnJvbSBoaW50LT5zZWFyY2hfc3RhcnQgdG8gZW5kIG9mIGRpc2sgKi8KKwkJCXN0YXJ0ID0gaGludC0+c2VhcmNoX3N0YXJ0OworCQkJZmluaXNoID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOworCQkJYnJlYWs7CisJCWNhc2UgMToJLyogU2VhcmNoIGZyb20gaGludC0+YmVnIHRvIGhpbnQtPnNlYXJjaF9zdGFydCAqLworCQkJc3RhcnQgPSBoaW50LT5iZWc7CisJCQlmaW5pc2ggPSBoaW50LT5zZWFyY2hfc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSAyOgkvKiBMYXN0IGNoYW5jZTogU2VhcmNoIGZyb20gMCB0byBoaW50LT5iZWcgKi8KKwkJCXN0YXJ0ID0gMDsKKwkJCWZpbmlzaCA9IGhpbnQtPmJlZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBXZSd2ZSB0cmllZCBzZWFyY2hpbmcgZXZlcnl3aGVyZSwgbm90IGVub3VnaCBzcGFjZSAqLworCQkJLyogRnJlZSB0aGUgYmxvY2tzICovCisJCQlpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7CiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKLQkJcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogZnJlZWluZyAobm9zcGFjZSkgJWQgYmxvY2tzIGlkPSV1IiwgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgLSBucl9hbGxvY2F0ZWQsIGhpbnQtPmlub2RlLT5pX3VpZCk7CisJCQkJcmVpc2VyZnNfZGVidWcocywgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCQkJICAgICAgICJyZWlzZXJxdW90YTogZnJlZWluZyAobm9zcGFjZSkgJWQgYmxvY2tzIGlkPSV1IiwKKwkJCQkJICAgICAgIGFtb3VudF9uZWVkZWQgKworCQkJCQkgICAgICAgaGludC0+cHJlYWxsb2Nfc2l6ZSAtCisJCQkJCSAgICAgICBucl9hbGxvY2F0ZWQsCisJCQkJCSAgICAgICBoaW50LT5pbm9kZS0+aV91aWQpOwogI2VuZGlmCi0JCURRVU9UX0ZSRUVfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgLSBucl9hbGxvY2F0ZWQpOyAgICAgLyogRnJlZSBub3QgYWxsb2NhdGVkIGJsb2NrcyAqLwotCSAgICB9Ci0gIAkgICAgd2hpbGUgKG5yX2FsbG9jYXRlZCAtLSkKLQkJcmVpc2VyZnNfZnJlZV9ibG9jayhoaW50LT50aCwgaGludC0+aW5vZGUsIG5ld19ibG9ja25yc1tucl9hbGxvY2F0ZWRdLCAhaGludC0+Zm9ybWF0dGVkX25vZGUpOworCQkJCURRVU9UX0ZSRUVfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgLSBucl9hbGxvY2F0ZWQpOwkvKiBGcmVlIG5vdCBhbGxvY2F0ZWQgYmxvY2tzICovCisJCQl9CisJCQl3aGlsZSAobnJfYWxsb2NhdGVkLS0pCisJCQkJcmVpc2VyZnNfZnJlZV9ibG9jayhoaW50LT50aCwgaGludC0+aW5vZGUsCisJCQkJCQkgICAgbmV3X2Jsb2NrbnJzW25yX2FsbG9jYXRlZF0sCisJCQkJCQkgICAgIWhpbnQtPmZvcm1hdHRlZF9ub2RlKTsKIAotCSAgICByZXR1cm4gTk9fRElTS19TUEFDRTsKLQl9Ci0gICAgfSB3aGlsZSAoKG5yX2FsbG9jYXRlZCArPSBhbGxvY2F0ZV93aXRob3V0X3dyYXBwaW5nX2Rpc2sgKGhpbnQsCi0JCQkgICAgbmV3X2Jsb2NrbnJzICsgbnJfYWxsb2NhdGVkLCBzdGFydCwgZmluaXNoLAotCQkJICAgIGJpZ2FsbG9jID8gYmlnYWxsb2MgOiAxLAotCQkJICAgIGFtb3VudF9uZWVkZWQgLSBucl9hbGxvY2F0ZWQsCi0JCQkgICAgaGludC0+cHJlYWxsb2Nfc2l6ZSkpCi0JCQk8IGFtb3VudF9uZWVkZWQpOwotICAgIGlmICggIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmCi0gICAgICAgICBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSA+Ci0JIG5yX2FsbG9jYXRlZCArIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50KSB7Ci0gICAgLyogU29tZSBvZiBwcmVhbGxvY2F0aW9uIGJsb2NrcyB3ZXJlIG5vdCBhbGxvY2F0ZWQgKi8KKwkJCXJldHVybiBOT19ESVNLX1NQQUNFOworCQl9CisJfSB3aGlsZSAoKG5yX2FsbG9jYXRlZCArPSBhbGxvY2F0ZV93aXRob3V0X3dyYXBwaW5nX2Rpc2soaGludCwKKwkJCQkJCQkJIG5ld19ibG9ja25ycyArCisJCQkJCQkJCSBucl9hbGxvY2F0ZWQsCisJCQkJCQkJCSBzdGFydCwgZmluaXNoLAorCQkJCQkJCQkgYmlnYWxsb2MgPworCQkJCQkJCQkgYmlnYWxsb2MgOiAxLAorCQkJCQkJCQkgYW1vdW50X25lZWRlZCAtCisJCQkJCQkJCSBucl9hbGxvY2F0ZWQsCisJCQkJCQkJCSBoaW50LT4KKwkJCQkJCQkJIHByZWFsbG9jX3NpemUpKQorCQkgPCBhbW91bnRfbmVlZGVkKTsKKwlpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmCisJICAgIGFtb3VudF9uZWVkZWQgKyBoaW50LT5wcmVhbGxvY19zaXplID4KKwkgICAgbnJfYWxsb2NhdGVkICsgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQpIHsKKwkJLyogU29tZSBvZiBwcmVhbGxvY2F0aW9uIGJsb2NrcyB3ZXJlIG5vdCBhbGxvY2F0ZWQgKi8KICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotCXJlaXNlcmZzX2RlYnVnIChzLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGE6IGZyZWVpbmcgKGZhaWxlZCBwcmVhbGxvYykgJWQgYmxvY2tzIGlkPSV1IiwgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgLSBucl9hbGxvY2F0ZWQgLSBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19jb3VudCwgaGludC0+aW5vZGUtPmlfdWlkKTsKKwkJcmVpc2VyZnNfZGVidWcocywgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCSAgICAgICAicmVpc2VycXVvdGE6IGZyZWVpbmcgKGZhaWxlZCBwcmVhbGxvYykgJWQgYmxvY2tzIGlkPSV1IiwKKwkJCSAgICAgICBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtCisJCQkgICAgICAgbnJfYWxsb2NhdGVkIC0KKwkJCSAgICAgICBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19jb3VudCwKKwkJCSAgICAgICBoaW50LT5pbm9kZS0+aV91aWQpOwogI2VuZGlmCi0JRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCAtCi0JCQkJIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50KTsKLSAgICB9CisJCURRVU9UX0ZSRUVfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgYW1vdW50X25lZWRlZCArCisJCQkJCSBoaW50LT5wcmVhbGxvY19zaXplIC0gbnJfYWxsb2NhdGVkIC0KKwkJCQkJIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT4KKwkJCQkJIGlfcHJlYWxsb2NfY291bnQpOworCX0KIAotICAgIHJldHVybiBDQVJSWV9PTjsKKwlyZXR1cm4gQ0FSUllfT047CiB9CiAKIC8qIGdyYWIgbmV3IGJsb2NrbnJzIGZyb20gcHJlYWxsb2NhdGVkIGxpc3QgKi8KIC8qIHJldHVybiBhbW91bnQgc3RpbGwgbmVlZGVkIGFmdGVyIHVzaW5nIHRoZW0gKi8KLXN0YXRpYyBpbnQgdXNlX3ByZWFsbG9jYXRlZF9saXN0X2lmX2F2YWlsYWJsZSAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQsCi0JCQkJCSAgICAgICBiX2Jsb2NrbnJfdCAqbmV3X2Jsb2NrbnJzLCBpbnQgYW1vdW50X25lZWRlZCkKK3N0YXRpYyBpbnQgdXNlX3ByZWFsbG9jYXRlZF9saXN0X2lmX2F2YWlsYWJsZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQsCisJCQkJCSAgICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorCQkJCQkgICAgICBpbnQgYW1vdW50X25lZWRlZCkKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGhpbnQtPmlub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBoaW50LT5pbm9kZTsKIAotICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKLQl3aGlsZSAoYW1vdW50X25lZWRlZCkgeworCWlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKKwkJd2hpbGUgKGFtb3VudF9uZWVkZWQpIHsKIAotCSAgICAqbmV3X2Jsb2NrbnJzICsrID0gUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgKys7Ci0JICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IC0tOworCQkJKm5ld19ibG9ja25ycysrID0gUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfYmxvY2srKzsKKwkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50LS07CiAKLQkgICAgYW1vdW50X25lZWRlZCAtLTsKKwkJCWFtb3VudF9uZWVkZWQtLTsKIAotCSAgICBpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPD0gMCkgewotCQlsaXN0X2RlbCgmUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCk7ICAKLQkJYnJlYWs7Ci0JICAgIH0KKwkJCWlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA8PSAwKSB7CisJCQkJbGlzdF9kZWwoJlJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QpOworCQkJCWJyZWFrOworCQkJfQorCQl9CiAJfQotICAgICAgfQotICAgIC8qIHJldHVybiBhbW91bnQgc3RpbGwgbmVlZGVkIGFmdGVyIHVzaW5nIHByZWFsbG9jYXRlZCBibG9ja3MgKi8KLSAgICByZXR1cm4gYW1vdW50X25lZWRlZDsKKwkvKiByZXR1cm4gYW1vdW50IHN0aWxsIG5lZWRlZCBhZnRlciB1c2luZyBwcmVhbGxvY2F0ZWQgYmxvY2tzICovCisJcmV0dXJuIGFtb3VudF9uZWVkZWQ7CiB9CiAKLWludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwKLQkJCSAgICAgICBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywgaW50IGFtb3VudF9uZWVkZWQsCi0JCQkgICAgICAgaW50IHJlc2VydmVkX2J5X3VzIC8qIEFtb3VudCBvZiBibG9ja3Mgd2UgaGF2ZQotCQkJCQkJICAgICAgYWxyZWFkeSByZXNlcnZlZCAqLykKK2ludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQsIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLCBpbnQgYW1vdW50X25lZWRlZCwgaW50IHJlc2VydmVkX2J5X3VzCS8qIEFtb3VudCBvZiBibG9ja3Mgd2UgaGF2ZQorCQkJCQkJCQkJCQkJCQkJCQkgICBhbHJlYWR5IHJlc2VydmVkICovICkKIHsKLSAgICBpbnQgaW5pdGlhbF9hbW91bnRfbmVlZGVkID0gYW1vdW50X25lZWRlZDsKLSAgICBpbnQgcmV0OwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOworCWludCBpbml0aWFsX2Ftb3VudF9uZWVkZWQgPSBhbW91bnRfbmVlZGVkOworCWludCByZXQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7CiAKLSAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UsIHRha2luZyBpbnRvIGFjY291bnQgcmVzZXJ2ZWQgc3BhY2UgKi8KLSAgICBpZiAoIFNCX0ZSRUVfQkxPQ0tTKHMpIC0gUkVJU0VSRlNfU0IocyktPnJlc2VydmVkX2Jsb2NrcyA8Ci0JIGFtb3VudF9uZWVkZWQgLSByZXNlcnZlZF9ieV91cykKLSAgICAgICAgcmV0dXJuIE5PX0RJU0tfU1BBQ0U7Ci0gICAgLyogc2hvdWxkIHRoaXMgYmUgaWYgIWhpbnQtPmlub2RlICYmICBoaW50LT5wcmVhbGxvY2F0ZT8gKi8KLSAgICAvKiBkbyB5b3UgbWVhbiBoaW50LT5mb3JtYXR0ZWRfbm9kZSBjYW4gYmUgcmVtb3ZlZCA/IC0gWmFtICovCi0gICAgLyogaGludC0+Zm9ybWF0dGVkX25vZGUgY2Fubm90IGJlIHJlbW92ZWQgYmVjYXVzZSB3ZSB0cnkgdG8gYWNjZXNzCi0gICAgICAgaW5vZGUgaW5mb3JtYXRpb24gaGVyZSwgYW5kIHRoZXJlIGlzIG9mdGVuIG5vIGlub2RlIGFzc290aWF0ZWQgd2l0aAotICAgICAgIG1ldGFkYXRhIGFsbG9jYXRpb25zIC0gZ3JlZW4gKi8KKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UsIHRha2luZyBpbnRvIGFjY291bnQgcmVzZXJ2ZWQgc3BhY2UgKi8KKwlpZiAoU0JfRlJFRV9CTE9DS1MocykgLSBSRUlTRVJGU19TQihzKS0+cmVzZXJ2ZWRfYmxvY2tzIDwKKwkgICAgYW1vdW50X25lZWRlZCAtIHJlc2VydmVkX2J5X3VzKQorCQlyZXR1cm4gTk9fRElTS19TUEFDRTsKKwkvKiBzaG91bGQgdGhpcyBiZSBpZiAhaGludC0+aW5vZGUgJiYgIGhpbnQtPnByZWFsbG9jYXRlPyAqLworCS8qIGRvIHlvdSBtZWFuIGhpbnQtPmZvcm1hdHRlZF9ub2RlIGNhbiBiZSByZW1vdmVkID8gLSBaYW0gKi8KKwkvKiBoaW50LT5mb3JtYXR0ZWRfbm9kZSBjYW5ub3QgYmUgcmVtb3ZlZCBiZWNhdXNlIHdlIHRyeSB0byBhY2Nlc3MKKwkgICBpbm9kZSBpbmZvcm1hdGlvbiBoZXJlLCBhbmQgdGhlcmUgaXMgb2Z0ZW4gbm8gaW5vZGUgYXNzb3RpYXRlZCB3aXRoCisJICAgbWV0YWRhdGEgYWxsb2NhdGlvbnMgLSBncmVlbiAqLwogCi0gICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBoaW50LT5wcmVhbGxvY2F0ZSkgewotCWFtb3VudF9uZWVkZWQgPSB1c2VfcHJlYWxsb2NhdGVkX2xpc3RfaWZfYXZhaWxhYmxlCi0JICAgIChoaW50LCBuZXdfYmxvY2tucnMsIGFtb3VudF9uZWVkZWQpOwotCWlmIChhbW91bnRfbmVlZGVkID09IDApCS8qIGFsbCBibG9ja25ycyB3ZSBuZWVkIHdlIGdvdCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFsbG9jLiBsaXN0ICovCi0JICAgIHJldHVybiBDQVJSWV9PTjsKLQluZXdfYmxvY2tucnMgKz0gKGluaXRpYWxfYW1vdW50X25lZWRlZCAtIGFtb3VudF9uZWVkZWQpOwotICAgIH0KLQotICAgIC8qIGZpbmQgc2VhcmNoIHN0YXJ0IGFuZCBzYXZlIGl0IGluIGhpbnQgc3RydWN0dXJlICovCi0gICAgZGV0ZXJtaW5lX3NlYXJjaF9zdGFydChoaW50LCBhbW91bnRfbmVlZGVkKTsKLSAgICBpZiAoaGludC0+c2VhcmNoX3N0YXJ0ID49IFNCX0JMT0NLX0NPVU5UKHMpKQotICAgICAgICBoaW50LT5zZWFyY2hfc3RhcnQgPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7Ci0KLSAgICAvKiBhbGxvY2F0aW9uIGl0c2VsZjsgZmlsbCBuZXdfYmxvY2tucnMgYW5kIHByZWFsbG9jYXRpb24gYXJyYXlzICovCi0gICAgcmV0ID0gYmxvY2tucnNfYW5kX3ByZWFsbG9jX2FycmF5c19mcm9tX3NlYXJjaF9zdGFydAotCShoaW50LCBuZXdfYmxvY2tucnMsIGFtb3VudF9uZWVkZWQpOwotCi0gICAgLyogd2UgdXNlZCBwcmVhbGxvYy4gbGlzdCB0byBmaWxsIChwYXJ0aWFsbHkpIG5ld19ibG9ja25ycyBhcnJheS4gSWYgZmluYWwgYWxsb2NhdGlvbiBmYWlscyB3ZQotICAgICAqIG5lZWQgdG8gcmV0dXJuIGJsb2NrcyBiYWNrIHRvIHByZWFsbG9jLiBsaXN0IG9yIGp1c3QgZnJlZSB0aGVtLiAtLSBaYW0gKEkgY2hvc2Ugc2Vjb25kCi0gICAgICogdmFyaWFudCkgKi8KLQotICAgIGlmIChyZXQgIT0gQ0FSUllfT04pIHsKLQl3aGlsZSAoYW1vdW50X25lZWRlZCArKyA8IGluaXRpYWxfYW1vdW50X25lZWRlZCkgewotCSAgICByZWlzZXJmc19mcmVlX2Jsb2NrKGhpbnQtPnRoLCBoaW50LT5pbm9kZSwgKigtLW5ld19ibG9ja25ycyksIDEpOworCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgaGludC0+cHJlYWxsb2NhdGUpIHsKKwkJYW1vdW50X25lZWRlZCA9IHVzZV9wcmVhbGxvY2F0ZWRfbGlzdF9pZl9hdmFpbGFibGUKKwkJICAgIChoaW50LCBuZXdfYmxvY2tucnMsIGFtb3VudF9uZWVkZWQpOworCQlpZiAoYW1vdW50X25lZWRlZCA9PSAwKQkvKiBhbGwgYmxvY2tucnMgd2UgbmVlZCB3ZSBnb3QgZnJvbQorCQkJCQkgICBwcmVhbGxvYy4gbGlzdCAqLworCQkJcmV0dXJuIENBUlJZX09OOworCQluZXdfYmxvY2tucnMgKz0gKGluaXRpYWxfYW1vdW50X25lZWRlZCAtIGFtb3VudF9uZWVkZWQpOwogCX0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKworCS8qIGZpbmQgc2VhcmNoIHN0YXJ0IGFuZCBzYXZlIGl0IGluIGhpbnQgc3RydWN0dXJlICovCisJZGV0ZXJtaW5lX3NlYXJjaF9zdGFydChoaW50LCBhbW91bnRfbmVlZGVkKTsKKwlpZiAoaGludC0+c2VhcmNoX3N0YXJ0ID49IFNCX0JMT0NLX0NPVU5UKHMpKQorCQloaW50LT5zZWFyY2hfc3RhcnQgPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7CisKKwkvKiBhbGxvY2F0aW9uIGl0c2VsZjsgZmlsbCBuZXdfYmxvY2tucnMgYW5kIHByZWFsbG9jYXRpb24gYXJyYXlzICovCisJcmV0ID0gYmxvY2tucnNfYW5kX3ByZWFsbG9jX2FycmF5c19mcm9tX3NlYXJjaF9zdGFydAorCSAgICAoaGludCwgbmV3X2Jsb2NrbnJzLCBhbW91bnRfbmVlZGVkKTsKKworCS8qIHdlIHVzZWQgcHJlYWxsb2MuIGxpc3QgdG8gZmlsbCAocGFydGlhbGx5KSBuZXdfYmxvY2tucnMgYXJyYXkuIElmIGZpbmFsIGFsbG9jYXRpb24gZmFpbHMgd2UKKwkgKiBuZWVkIHRvIHJldHVybiBibG9ja3MgYmFjayB0byBwcmVhbGxvYy4gbGlzdCBvciBqdXN0IGZyZWUgdGhlbS4gLS0gWmFtIChJIGNob3NlIHNlY29uZAorCSAqIHZhcmlhbnQpICovCisKKwlpZiAocmV0ICE9IENBUlJZX09OKSB7CisJCXdoaWxlIChhbW91bnRfbmVlZGVkKysgPCBpbml0aWFsX2Ftb3VudF9uZWVkZWQpIHsKKwkJCXJlaXNlcmZzX2ZyZWVfYmxvY2soaGludC0+dGgsIGhpbnQtPmlub2RlLAorCQkJCQkgICAgKigtLW5ld19ibG9ja25ycyksIDEpOworCQl9CisJfQorCXJldHVybiByZXQ7CiB9CiAKIC8qIFRoZXNlIDIgZnVuY3Rpb25zIGFyZSBoZXJlIHRvIHByb3ZpZGUgYmxvY2tzIHJlc2VydmF0aW9uIHRvIHRoZSByZXN0IG9mIGtlcm5lbCAqLwogLyogUmVzZXJ2ZSBAYmxvY2tzIGFtb3VudCBvZiBibG9ja3MgaW4gZnMgcG9pbnRlZCBieSBAc2IuIENhbGxlciBtdXN0IG1ha2Ugc3VyZQogICAgdGhlcmUgYXJlIGFjdHVhbGx5IHRoaXMgbXVjaCBibG9ja3Mgb24gdGhlIEZTIGF2YWlsYWJsZSAqLwotdm9pZCByZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKCAKLQkJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCAvKiBzdXBlciBibG9jayBvZgotCQkJCQkJCSAgICAgICAgZmlsZXN5c3RlbSB3aGVyZQotCQkJCQkJCQlibG9ja3Mgc2hvdWxkIGJlCi0JCQkJCQkJCXJlc2VydmVkICovCi0JCQkJICAgICAgaW50IGJsb2NrcyAvKiBIb3cgbXVjaCB0byByZXNlcnZlICovCi0JCQkJCSAgKQordm9pZCByZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCS8qIHN1cGVyIGJsb2NrIG9mCisJCQkJCQkJCQkgICBmaWxlc3lzdGVtIHdoZXJlCisJCQkJCQkJCQkgICBibG9ja3Mgc2hvdWxkIGJlCisJCQkJCQkJCQkgICByZXNlcnZlZCAqLworCQkJCQkgICBpbnQgYmxvY2tzCS8qIEhvdyBtdWNoIHRvIHJlc2VydmUgKi8KKyAgICApCiB7CiAKLSAgICAvKiBGYXN0IGNhc2UsIGlmIHJlc2VydmF0aW9uIGlzIHplcm8gLSBleGl0IGltbWVkaWF0ZWx5LiAqLwotICAgIGlmICggIWJsb2NrcyApCi0JcmV0dXJuOworCS8qIEZhc3QgY2FzZSwgaWYgcmVzZXJ2YXRpb24gaXMgemVybyAtIGV4aXQgaW1tZWRpYXRlbHkuICovCisJaWYgKCFibG9ja3MpCisJCXJldHVybjsKIAotICAgIHNwaW5fbG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7Ci0gICAgUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MgKz0gYmxvY2tzOwotICAgIHNwaW5fdW5sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKwlzcGluX2xvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCVJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzICs9IGJsb2NrczsKKwlzcGluX3VubG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CiB9CiAKIC8qIFVucmVzZXJ2ZSBAYmxvY2tzIGFtb3VudCBvZiBibG9ja3MgaW4gZnMgcG9pbnRlZCBieSBAc2IgKi8KLXZvaWQgcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2NrcyggCi0JCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgLyogc3VwZXIgYmxvY2sgb2YKLQkJCQkJCQkgIGZpbGVzeXN0ZW0gd2hlcmUKLQkJCQkJCQkgIGJsb2NrcyBzaG91bGQgYmUKLQkJCQkJCQkgIHJlc2VydmVkICovCi0JCQkJaW50IGJsb2NrcyAvKiBIb3cgbXVjaCB0byB1bnJlc2VydmUgKi8KLQkJCQkJICApCit2b2lkIHJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwJLyogc3VwZXIgYmxvY2sgb2YKKwkJCQkJCQkJICAgZmlsZXN5c3RlbSB3aGVyZQorCQkJCQkJCQkgICBibG9ja3Mgc2hvdWxkIGJlCisJCQkJCQkJCSAgIHJlc2VydmVkICovCisJCQkJICAgICBpbnQgYmxvY2tzCS8qIEhvdyBtdWNoIHRvIHVucmVzZXJ2ZSAqLworICAgICkKIHsKIAotICAgIC8qIEZhc3QgY2FzZSwgaWYgdW5yZXNlcnZhdGlvbiBpcyB6ZXJvIC0gZXhpdCBpbW1lZGlhdGVseS4gKi8KLSAgICBpZiAoICFibG9ja3MgKQotCXJldHVybjsKKwkvKiBGYXN0IGNhc2UsIGlmIHVucmVzZXJ2YXRpb24gaXMgemVybyAtIGV4aXQgaW1tZWRpYXRlbHkuICovCisJaWYgKCFibG9ja3MpCisJCXJldHVybjsKIAotICAgIHNwaW5fbG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7Ci0gICAgUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MgLT0gYmxvY2tzOwotICAgIHNwaW5fdW5sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKLSAgICBSRkFMU0UoIFJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzIDwgMCwgImFtb3VudCBvZiBibG9ja3MgcmVzZXJ2ZWQgYmVjYW1lIHplcm8/Iik7CisJc3Bpbl9sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKwlSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcyAtPSBibG9ja3M7CisJc3Bpbl91bmxvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCVJGQUxTRShSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcyA8IDAsCisJICAgICAgICJhbW91bnQgb2YgYmxvY2tzIHJlc2VydmVkIGJlY2FtZSB6ZXJvPyIpOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyBob3cgbXVjaCBwYWdlcyB3ZSB3aWxsIGJlIGFibGUgdG8gd3JpdGUgdG8gRlMKICAgIHVzZWQgZm9yIHJlaXNlcmZzX2ZpbGVfd3JpdGUoKSBwdXJwb3NlcyBmb3Igbm93LiAqLwotaW50IHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMgKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiIC8qIHN1cGVyYmxvY2sgb2YgZmlsZXN5c3RlbQotCQkJCQkJICAgICAgIHRvIGVzdGltYXRlIHNwYWNlICovICkKK2ludCByZWlzZXJmc19jYW5fZml0X3BhZ2VzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IJLyogc3VwZXJibG9jayBvZiBmaWxlc3lzdGVtCisJCQkJCQkJICAgdG8gZXN0aW1hdGUgc3BhY2UgKi8gKQogewogCWludCBzcGFjZTsKIAogCXNwaW5fbG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7Ci0Jc3BhY2UgPSAoU0JfRlJFRV9CTE9DS1Moc2IpIC0gUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MpID4+ICggUEFHRV9DQUNIRV9TSElGVCAtIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlzcGFjZSA9CisJICAgIChTQl9GUkVFX0JMT0NLUyhzYikgLQorCSAgICAgUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MpID4+IChQQUdFX0NBQ0hFX1NISUZUIC0KKwkJCQkJCSAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKIAlzcGluX3VubG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CiAKLQlyZXR1cm4gc3BhY2U+MD9zcGFjZTowOworCXJldHVybiBzcGFjZSA+IDAgPyBzcGFjZSA6IDA7CiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9kaXIuYyBiL2ZzL3JlaXNlcmZzL2Rpci5jCmluZGV4IGZiZGU0YjAxLi45ZGQ3MWU4IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9kaXIuYworKysgYi9mcy9yZWlzZXJmcy9kaXIuYwpAQCAtMTIsMjY0ICsxMiwyODYgQEAKICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLWV4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICBNSU5fS0VZOworZXh0ZXJuIHN0cnVjdCByZWlzZXJmc19rZXkgTUlOX0tFWTsKIAotc3RhdGljIGludCByZWlzZXJmc19yZWFkZGlyIChzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7Ci1zdGF0aWMgaW50IHJlaXNlcmZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpIDsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CitzdGF0aWMgaW50IHJlaXNlcmZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICAgaW50IGRhdGFzeW5jKTsKIAogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWlzZXJmc19kaXJfb3BlcmF0aW9ucyA9IHsKLSAgICAucmVhZAk9IGdlbmVyaWNfcmVhZF9kaXIsCi0gICAgLnJlYWRkaXIJPSByZWlzZXJmc19yZWFkZGlyLAotICAgIC5mc3luYwk9IHJlaXNlcmZzX2Rpcl9mc3luYywKLSAgICAuaW9jdGwJPSByZWlzZXJmc19pb2N0bCwKKwkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPSByZWlzZXJmc19yZWFkZGlyLAorCS5mc3luYyA9IHJlaXNlcmZzX2Rpcl9mc3luYywKKwkuaW9jdGwgPSByZWlzZXJmc19pb2N0bCwKIH07CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykgewotICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotICBpbnQgZXJyOwotICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgZXJyID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSkgOwotICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpIDsKLSAgaWYgKGVyciA8IDApCi0gICAgICByZXR1cm4gZXJyOwotICByZXR1cm4gMDsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgICBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWVyciA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoaW5vZGUpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKLQogI2RlZmluZSBzdG9yZV9paCh3aGVyZSx3aGF0KSBjb3B5X2l0ZW1faGVhZCAod2hlcmUsIHdoYXQpCiAKIC8vCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRkaXIgKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwotICAgIHN0cnVjdCBjcHVfa2V5IHBvc19rZXk7CS8qIGtleSBvZiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkaXJlY3RvcnkgKGtleSBvZiBkaXJlY3RvcnkgZW50cnkpICovCi0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX2VudHJ5KTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLSAgICBpbnQgaXRlbV9udW0sIGVudHJ5X251bTsKLSAgICBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogcmtleTsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIHRtcF9paDsKLSAgICBpbnQgc2VhcmNoX3JlczsKLSAgICBjaGFyICogbG9jYWxfYnVmOwotICAgIGxvZmZfdCBuZXh0X3BvczsKLSAgICBjaGFyIHNtYWxsX2J1ZlszMl0gOyAvKiBhdm9pZCBrbWFsbG9jIGlmIHdlIGNhbiAqLwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7Ci0gICAgaW50IHJldCA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBjcHVfa2V5IHBvc19rZXk7CS8qIGtleSBvZiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkaXJlY3RvcnkgKGtleSBvZiBkaXJlY3RvcnkgZW50cnkpICovCisJSU5JVElBTElaRV9QQVRIKHBhdGhfdG9fZW50cnkpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGl0ZW1fbnVtLCBlbnRyeV9udW07CisJY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqcmtleTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loOworCWludCBzZWFyY2hfcmVzOworCWNoYXIgKmxvY2FsX2J1ZjsKKwlsb2ZmX3QgbmV4dF9wb3M7CisJY2hhciBzbWFsbF9idWZbMzJdOwkvKiBhdm9pZCBrbWFsbG9jIGlmIHdlIGNhbiAqLworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJaW50IHJldCA9IDA7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAotICAgIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoaW5vZGUtPmlfc2IsICJyZWFkZGlyIikgOworCXJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoaW5vZGUtPmlfc2IsICJyZWFkZGlyIik7CiAKLSAgICAvKiBmb3JtIGtleSBmb3Igc2VhcmNoIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeSB1c2luZyBmX3BvcyBmaWVsZCBvZgotICAgICAgIGZpbGUgc3RydWN0dXJlICovCi0gICAgbWFrZV9jcHVfa2V5ICgmcG9zX2tleSwgaW5vZGUsIChmaWxwLT5mX3BvcykgPyAoZmlscC0+Zl9wb3MpIDogRE9UX09GRlNFVCwKLQkJICBUWVBFX0RJUkVOVFJZLCAzKTsKLSAgICBuZXh0X3BvcyA9IGNwdV9rZXlfa19vZmZzZXQgKCZwb3Nfa2V5KTsKKwkvKiBmb3JtIGtleSBmb3Igc2VhcmNoIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeSB1c2luZyBmX3BvcyBmaWVsZCBvZgorCSAgIGZpbGUgc3RydWN0dXJlICovCisJbWFrZV9jcHVfa2V5KCZwb3Nfa2V5LCBpbm9kZSwKKwkJICAgICAoZmlscC0+Zl9wb3MpID8gKGZpbHAtPmZfcG9zKSA6IERPVF9PRkZTRVQsIFRZUEVfRElSRU5UUlksCisJCSAgICAgMyk7CisJbmV4dF9wb3MgPSBjcHVfa2V5X2tfb2Zmc2V0KCZwb3Nfa2V5KTsKIAotICAgIC8qICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInJlaXNlcmZzX3JlYWRkaXIgMTogZl9wb3MgPSAlTGQiLCBmaWxwLT5mX3Bvcyk7Ki8KKwkvKiAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJyZWlzZXJmc19yZWFkZGlyIDE6IGZfcG9zID0gJUxkIiwgZmlscC0+Zl9wb3MpOyAqLwogCi0gICAgcGF0aF90b19lbnRyeS5yZWFkYSA9IFBBVEhfUkVBREE7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICByZXNlYXJjaDoKLQkvKiBzZWFyY2ggdGhlIGRpcmVjdG9yeSBpdGVtLCBjb250YWluaW5nIGVudHJ5IHdpdGggc3BlY2lmaWVkIGtleSAqLwotCXNlYXJjaF9yZXMgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChpbm9kZS0+aV9zYiwgJnBvc19rZXksICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7Ci0JICAgIC8vIEZJWE1FOiB3ZSBjb3VsZCBqdXN0IHNraXAgcGFydCBvZiBkaXJlY3Rvcnkgd2hpY2ggY291bGQKLQkgICAgLy8gbm90IGJlIHJlYWQKLQkgICAgcmV0ID0gLUVJTzsKLQkgICAgZ290byBvdXQ7Ci0JfQotCWVudHJ5X251bSA9IGRlLmRlX2VudHJ5X251bTsKLQliaCA9IGRlLmRlX2JoOwotCWl0ZW1fbnVtID0gZGUuZGVfaXRlbV9udW07Ci0JaWggPSBkZS5kZV9paDsKLQlzdG9yZV9paCAoJnRtcF9paCwgaWgpOwotCQkKLQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLwotCVJGQUxTRSggQ09NUF9TSE9SVF9LRVlTICgmKGloLT5paF9rZXkpLCAmcG9zX2tleSksCi0JCSJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKLQkJaWgsICZwb3Nfa2V5KTsKLQlSRkFMU0UoIGl0ZW1fbnVtID4gQl9OUl9JVEVNUyAoYmgpIC0gMSwKLQkJInZzLTkwMDUgaXRlbV9udW0gPT0gJWQsIGl0ZW0gYW1vdW50ID09ICVkIiwgCi0JCWl0ZW1fbnVtLCBCX05SX0lURU1TIChiaCkpOwotICAgICAgCi0JLyogYW5kIGVudHJ5IG11c3QgYmUgbm90IG1vcmUgdGhhbiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaXRlbSAqLwotCVJGQUxTRSggSV9FTlRSWV9DT1VOVCAoaWgpIDwgZW50cnlfbnVtLAotCQkidnMtOTAxMDogZW50cnkgbnVtYmVyIGlzIHRvbyBiaWcgJWQgKCVkKSIsIAotCQllbnRyeV9udW0sIElfRU5UUllfQ09VTlQgKGloKSk7Ci0KLQlpZiAoc2VhcmNoX3JlcyA9PSBQT1NJVElPTl9GT1VORCB8fCBlbnRyeV9udW0gPCBJX0VOVFJZX0NPVU5UIChpaCkpIHsKLQkgICAgLyogZ28gdGhyb3VnaCBhbGwgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5IGl0ZW0gYmVnaW5uaW5nIGZyb20gdGhlIGVudHJ5LCB0aGF0IGhhcyBiZWVuIGZvdW5kICovCi0JICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gQl9JX0RFSCAoYmgsIGloKSArIGVudHJ5X251bTsKLQotCSAgICBmb3IgKDsgZW50cnlfbnVtIDwgSV9FTlRSWV9DT1VOVCAoaWgpOyBlbnRyeV9udW0gKyssIGRlaCArKykgewotCQlpbnQgZF9yZWNsZW47Ci0JCWNoYXIgKiBkX25hbWU7Ci0JCW9mZl90IGRfb2ZmOwotCQlpbm9fdCBkX2lubzsKLQotCQlpZiAoIWRlX3Zpc2libGUgKGRlaCkpCi0JCSAgICAvKiBpdCBpcyBoaWRkZW4gZW50cnkgKi8KLQkJICAgIGNvbnRpbnVlOwotCQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aCAoYmgsIGloLCBlbnRyeV9udW0pOwotCQlkX25hbWUgPSBCX0lfREVIX0VOVFJZX0ZJTEVfTkFNRSAoYmgsIGloLCBkZWgpOwotCQlpZiAoIWRfbmFtZVtkX3JlY2xlbiAtIDFdKQotCQkgICAgZF9yZWNsZW4gPSBzdHJsZW4gKGRfbmFtZSk7Ci0JCi0JCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpewotCQkgICAgLyogdG9vIGJpZyB0byBzZW5kIGJhY2sgdG8gVkZTICovCi0JCSAgICBjb250aW51ZSA7Ci0JCX0KLQotICAgICAgICAgICAgICAgIC8qIElnbm9yZSB0aGUgLnJlaXNlcmZzX3ByaXYgZW50cnkgKi8KLSAgICAgICAgICAgICAgICBpZiAocmVpc2VyZnNfeGF0dHJzIChpbm9kZS0+aV9zYikgJiYKLSAgICAgICAgICAgICAgICAgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKLSAgICAgICAgICAgICAgICAgICAgZmlscC0+Zl9kZW50cnkgPT0gaW5vZGUtPmlfc2ItPnNfcm9vdCAmJgotICAgICAgICAgICAgICAgICAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdCAmJgotICAgICAgICAgICAgICAgICAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSAmJgotICAgICAgICAgICAgICAgICAgICBkZWhfb2JqZWN0aWQoZGVoKSA9PSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWShSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPmtfb2JqZWN0aWQpKSB7Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLQkJZF9vZmYgPSBkZWhfb2Zmc2V0IChkZWgpOwotCQlmaWxwLT5mX3BvcyA9IGRfb2ZmIDsKLQkJZF9pbm8gPSBkZWhfb2JqZWN0aWQgKGRlaCk7Ci0JCWlmIChkX3JlY2xlbiA8PSAzMikgewotCQkgIGxvY2FsX2J1ZiA9IHNtYWxsX2J1ZiA7Ci0JCX0gZWxzZSB7Ci0JCSAgICBsb2NhbF9idWYgPSByZWlzZXJmc19rbWFsbG9jKGRfcmVjbGVuLCBHRlBfTk9GUywgaW5vZGUtPmlfc2IpIDsKLQkJICAgIGlmICghbG9jYWxfYnVmKSB7Ci0JCQlwYXRocmVsc2UgKCZwYXRoX3RvX2VudHJ5KTsKLQkJCXJldCA9IC1FTk9NRU0gOworCXBhdGhfdG9fZW50cnkucmVhZGEgPSBQQVRIX1JFQURBOworCXdoaWxlICgxKSB7CisJICAgICAgcmVzZWFyY2g6CisJCS8qIHNlYXJjaCB0aGUgZGlyZWN0b3J5IGl0ZW0sIGNvbnRhaW5pbmcgZW50cnkgd2l0aCBzcGVjaWZpZWQga2V5ICovCisJCXNlYXJjaF9yZXMgPQorCQkgICAgc2VhcmNoX2J5X2VudHJ5X2tleShpbm9kZS0+aV9zYiwgJnBvc19rZXksICZwYXRoX3RvX2VudHJ5LAorCQkJCQkmZGUpOworCQlpZiAoc2VhcmNoX3JlcyA9PSBJT19FUlJPUikgeworCQkJLy8gRklYTUU6IHdlIGNvdWxkIGp1c3Qgc2tpcCBwYXJ0IG9mIGRpcmVjdG9yeSB3aGljaCBjb3VsZAorCQkJLy8gbm90IGJlIHJlYWQKKwkJCXJldCA9IC1FSU87CiAJCQlnb3RvIG91dDsKLQkJICAgIH0KLQkJICAgIGlmIChpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aF90b19lbnRyeSkpIHsKLQkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGlub2RlLT5pX3NiKSA7Ci0JCQlnb3RvIHJlc2VhcmNoOwotCQkgICAgfQogCQl9Ci0JCS8vIE5vdGUsIHRoYXQgd2UgY29weSBuYW1lIHRvIHVzZXIgc3BhY2UgdmlhIHRlbXBvcmFyeQotCQkvLyBidWZmZXIgKGxvY2FsX2J1ZikgYmVjYXVzZSBmaWxsZGlyIHdpbGwgYmxvY2sgaWYKLQkJLy8gdXNlciBzcGFjZSBidWZmZXIgaXMgc3dhcHBlZCBvdXQuIEF0IHRoYXQgdGltZQotCQkvLyBlbnRyeSBjYW4gbW92ZSB0byBzb21ld2hlcmUgZWxzZQotCQltZW1jcHkgKGxvY2FsX2J1ZiwgZF9uYW1lLCBkX3JlY2xlbik7Ci0JCWlmIChmaWxsZGlyIChkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywgCi0JCSAgICAgICAgICAgICBEVF9VTktOT1dOKSA8IDApIHsKLQkJICAgIGlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7Ci0JCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOwotCQkgICAgfQotCQkgICAgZ290byBlbmQ7Ci0JCX0KLQkJaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKLQkJICAgIHJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGlub2RlLT5pX3NiKSA7CisJCWVudHJ5X251bSA9IGRlLmRlX2VudHJ5X251bTsKKwkJYmggPSBkZS5kZV9iaDsKKwkJaXRlbV9udW0gPSBkZS5kZV9pdGVtX251bTsKKwkJaWggPSBkZS5kZV9paDsKKwkJc3RvcmVfaWgoJnRtcF9paCwgaWgpOworCisJCS8qIHdlIG11c3QgaGF2ZSBmb3VuZCBpdGVtLCB0aGF0IGlzIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnksICovCisJCVJGQUxTRShDT01QX1NIT1JUX0tFWVMoJihpaC0+aWhfa2V5KSwgJnBvc19rZXkpLAorCQkgICAgICAgInZzLTkwMDA6IGZvdW5kIGl0ZW0gJWggZG9lcyBub3QgbWF0Y2ggdG8gZGlyIHdlIHJlYWRkaXIgJUsiLAorCQkgICAgICAgaWgsICZwb3Nfa2V5KTsKKwkJUkZBTFNFKGl0ZW1fbnVtID4gQl9OUl9JVEVNUyhiaCkgLSAxLAorCQkgICAgICAgInZzLTkwMDUgaXRlbV9udW0gPT0gJWQsIGl0ZW0gYW1vdW50ID09ICVkIiwKKwkJICAgICAgIGl0ZW1fbnVtLCBCX05SX0lURU1TKGJoKSk7CisKKwkJLyogYW5kIGVudHJ5IG11c3QgYmUgbm90IG1vcmUgdGhhbiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaXRlbSAqLworCQlSRkFMU0UoSV9FTlRSWV9DT1VOVChpaCkgPCBlbnRyeV9udW0sCisJCSAgICAgICAidnMtOTAxMDogZW50cnkgbnVtYmVyIGlzIHRvbyBiaWcgJWQgKCVkKSIsCisJCSAgICAgICBlbnRyeV9udW0sIElfRU5UUllfQ09VTlQoaWgpKTsKKworCQlpZiAoc2VhcmNoX3JlcyA9PSBQT1NJVElPTl9GT1VORAorCQkgICAgfHwgZW50cnlfbnVtIDwgSV9FTlRSWV9DT1VOVChpaCkpIHsKKwkJCS8qIGdvIHRocm91Z2ggYWxsIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtIGJlZ2lubmluZyBmcm9tIHRoZSBlbnRyeSwgdGhhdCBoYXMgYmVlbiBmb3VuZCAqLworCQkJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCA9CisJCQkgICAgQl9JX0RFSChiaCwgaWgpICsgZW50cnlfbnVtOworCisJCQlmb3IgKDsgZW50cnlfbnVtIDwgSV9FTlRSWV9DT1VOVChpaCk7CisJCQkgICAgIGVudHJ5X251bSsrLCBkZWgrKykgeworCQkJCWludCBkX3JlY2xlbjsKKwkJCQljaGFyICpkX25hbWU7CisJCQkJb2ZmX3QgZF9vZmY7CisJCQkJaW5vX3QgZF9pbm87CisKKwkJCQlpZiAoIWRlX3Zpc2libGUoZGVoKSkKKwkJCQkJLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCisJCQkJCWNvbnRpbnVlOworCQkJCWRfcmVjbGVuID0gZW50cnlfbGVuZ3RoKGJoLCBpaCwgZW50cnlfbnVtKTsKKwkJCQlkX25hbWUgPSBCX0lfREVIX0VOVFJZX0ZJTEVfTkFNRShiaCwgaWgsIGRlaCk7CisJCQkJaWYgKCFkX25hbWVbZF9yZWNsZW4gLSAxXSkKKwkJCQkJZF9yZWNsZW4gPSBzdHJsZW4oZF9uYW1lKTsKKworCQkJCWlmIChkX3JlY2xlbiA+CisJCQkJICAgIFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT4KKwkJCQkJCSAgICAgIHNfYmxvY2tzaXplKSkgeworCQkJCQkvKiB0b28gYmlnIHRvIHNlbmQgYmFjayB0byBWRlMgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLyogSWdub3JlIHRoZSAucmVpc2VyZnNfcHJpdiBlbnRyeSAqLworCQkJCWlmIChyZWlzZXJmc194YXR0cnMoaW5vZGUtPmlfc2IpICYmCisJCQkJICAgICFvbGRfZm9ybWF0X29ubHkoaW5vZGUtPmlfc2IpICYmCisJCQkJICAgIGZpbHAtPmZfZGVudHJ5ID09IGlub2RlLT5pX3NiLT5zX3Jvb3QgJiYKKwkJCQkgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5wcml2X3Jvb3QgJiYKKwkJCQkgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUKKwkJCQkgICAgJiYgZGVoX29iamVjdGlkKGRlaCkgPT0KKwkJCQkgICAgbGUzMl90b19jcHUoSU5PREVfUEtFWQorCQkJCQkJKFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+CisJCQkJCQkgcHJpdl9yb290LT5kX2lub2RlKS0+CisJCQkJCQlrX29iamVjdGlkKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlkX29mZiA9IGRlaF9vZmZzZXQoZGVoKTsKKwkJCQlmaWxwLT5mX3BvcyA9IGRfb2ZmOworCQkJCWRfaW5vID0gZGVoX29iamVjdGlkKGRlaCk7CisJCQkJaWYgKGRfcmVjbGVuIDw9IDMyKSB7CisJCQkJCWxvY2FsX2J1ZiA9IHNtYWxsX2J1ZjsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NhbF9idWYgPQorCQkJCQkgICAgcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsCisJCQkJCQkJICAgICBpbm9kZS0+aV9zYik7CisJCQkJCWlmICghbG9jYWxfYnVmKSB7CisJCQkJCQlwYXRocmVsc2UoJnBhdGhfdG9fZW50cnkpOworCQkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJCWlmIChpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgeworCQkJCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLAorCQkJCQkJCSAgICAgICBkX3JlY2xlbiwKKwkJCQkJCQkgICAgICAgaW5vZGUtPmlfc2IpOworCQkJCQkJZ290byByZXNlYXJjaDsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBOb3RlLCB0aGF0IHdlIGNvcHkgbmFtZSB0byB1c2VyIHNwYWNlIHZpYSB0ZW1wb3JhcnkKKwkJCQkvLyBidWZmZXIgKGxvY2FsX2J1ZikgYmVjYXVzZSBmaWxsZGlyIHdpbGwgYmxvY2sgaWYKKwkJCQkvLyB1c2VyIHNwYWNlIGJ1ZmZlciBpcyBzd2FwcGVkIG91dC4gQXQgdGhhdCB0aW1lCisJCQkJLy8gZW50cnkgY2FuIG1vdmUgdG8gc29tZXdoZXJlIGVsc2UKKwkJCQltZW1jcHkobG9jYWxfYnVmLCBkX25hbWUsIGRfcmVjbGVuKTsKKwkJCQlpZiAoZmlsbGRpcgorCQkJCSAgICAoZGlyZW50LCBsb2NhbF9idWYsIGRfcmVjbGVuLCBkX29mZiwgZF9pbm8sCisJCQkJICAgICBEVF9VTktOT1dOKSA8IDApIHsKKwkJCQkJaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKKwkJCQkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwKKwkJCQkJCQkgICAgICAgZF9yZWNsZW4sCisJCQkJCQkJICAgICAgIGlub2RlLT5pX3NiKTsKKwkJCQkJfQorCQkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQkJaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKKwkJCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwKKwkJCQkJCSAgICAgICBpbm9kZS0+aV9zYik7CisJCQkJfQorCQkJCS8vIG5leHQgZW50cnkgc2hvdWxkIGJlIGxvb2tlZCBmb3Igd2l0aCBzdWNoIG9mZnNldAorCQkJCW5leHRfcG9zID0gZGVoX29mZnNldChkZWgpICsgMTsKKworCQkJCWlmIChpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgeworCQkJCQlnb3RvIHJlc2VhcmNoOworCQkJCX0KKwkJCX0JLyogZm9yICovCiAJCX0KIAotCQkvLyBuZXh0IGVudHJ5IHNob3VsZCBiZSBsb29rZWQgZm9yIHdpdGggc3VjaCBvZmZzZXQKLQkJbmV4dF9wb3MgPSBkZWhfb2Zmc2V0IChkZWgpICsgMTsKKwkJaWYgKGl0ZW1fbnVtICE9IEJfTlJfSVRFTVMoYmgpIC0gMSkKKwkJCS8vIGVuZCBvZiBkaXJlY3RvcnkgaGFzIGJlZW4gcmVhY2hlZAorCQkJZ290byBlbmQ7CiAKLQkJaWYgKGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgewotCQkgICAgZ290byByZXNlYXJjaDsKKwkJLyogaXRlbSB3ZSB3ZW50IHRocm91Z2ggaXMgbGFzdCBpdGVtIG9mIG5vZGUuIFVzaW5nIHJpZ2h0CisJCSAgIGRlbGltaXRpbmcga2V5IGNoZWNrIGlzIGl0IGRpcmVjdG9yeSBlbmQgKi8KKwkJcmtleSA9IGdldF9ya2V5KCZwYXRoX3RvX2VudHJ5LCBpbm9kZS0+aV9zYik7CisJCWlmICghY29tcF9sZV9rZXlzKHJrZXksICZNSU5fS0VZKSkgeworCQkJLyogc2V0IHBvc19rZXkgdG8ga2V5LCB0aGF0IGlzIHRoZSBzbWFsbGVzdCBhbmQgZ3JlYXRlcgorCQkJICAgdGhhdCBrZXkgb2YgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGl0ZW0gKi8KKwkJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZwb3Nfa2V5LCBuZXh0X3Bvcyk7CisJCQljb250aW51ZTsKIAkJfQotCSAgICB9IC8qIGZvciAqLwotCX0KIAotCWlmIChpdGVtX251bSAhPSBCX05SX0lURU1TIChiaCkgLSAxKQotCSAgICAvLyBlbmQgb2YgZGlyZWN0b3J5IGhhcyBiZWVuIHJlYWNoZWQKLQkgICAgZ290byBlbmQ7CisJCWlmIChDT01QX1NIT1JUX0tFWVMocmtleSwgJnBvc19rZXkpKSB7CisJCQkvLyBlbmQgb2YgZGlyZWN0b3J5IGhhcyBiZWVuIHJlYWNoZWQKKwkJCWdvdG8gZW5kOworCQl9CiAKLQkvKiBpdGVtIHdlIHdlbnQgdGhyb3VnaCBpcyBsYXN0IGl0ZW0gb2Ygbm9kZS4gVXNpbmcgcmlnaHQKLQkgICBkZWxpbWl0aW5nIGtleSBjaGVjayBpcyBpdCBkaXJlY3RvcnkgZW5kICovCi0JcmtleSA9IGdldF9ya2V5ICgmcGF0aF90b19lbnRyeSwgaW5vZGUtPmlfc2IpOwotCWlmICghIGNvbXBfbGVfa2V5cyAocmtleSwgJk1JTl9LRVkpKSB7Ci0JICAgIC8qIHNldCBwb3Nfa2V5IHRvIGtleSwgdGhhdCBpcyB0aGUgc21hbGxlc3QgYW5kIGdyZWF0ZXIKLQkgICAgICAgdGhhdCBrZXkgb2YgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGl0ZW0gKi8KLQkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZwb3Nfa2V5LCBuZXh0X3Bvcyk7Ci0JICAgIGNvbnRpbnVlOwotCX0KKwkJLyogZGlyZWN0b3J5IGNvbnRpbnVlcyBpbiB0aGUgcmlnaHQgbmVpZ2hib3JpbmcgYmxvY2sgKi8KKwkJc2V0X2NwdV9rZXlfa19vZmZzZXQoJnBvc19rZXksCisJCQkJICAgICBsZV9rZXlfa19vZmZzZXQoS0VZX0ZPUk1BVF8zXzUsIHJrZXkpKTsKIAotCWlmICggQ09NUF9TSE9SVF9LRVlTIChya2V5LCAmcG9zX2tleSkpIHsKLQkgICAgLy8gZW5kIG9mIGRpcmVjdG9yeSBoYXMgYmVlbiByZWFjaGVkCi0JICAgIGdvdG8gZW5kOwotCX0KLQkKLQkvKiBkaXJlY3RvcnkgY29udGludWVzIGluIHRoZSByaWdodCBuZWlnaGJvcmluZyBibG9jayAqLwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmcG9zX2tleSwgbGVfa2V5X2tfb2Zmc2V0IChLRVlfRk9STUFUXzNfNSwgcmtleSkpOworCX0JCQkvKiB3aGlsZSAqLwogCi0gICAgfSAvKiB3aGlsZSAqLwotCi0KLSBlbmQ6Ci0gICAgZmlscC0+Zl9wb3MgPSBuZXh0X3BvczsKLSAgICBwYXRocmVsc2UgKCZwYXRoX3RvX2VudHJ5KTsKLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2VudHJ5KSA7Ci0gb3V0OgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJldDsKKyAgICAgIGVuZDoKKwlmaWxwLT5mX3BvcyA9IG5leHRfcG9zOworCXBhdGhyZWxzZSgmcGF0aF90b19lbnRyeSk7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19lbnRyeSk7CisgICAgICBvdXQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBjb21wb3NlIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJpZXMgKGVudHJpZXMgYXJlCiAgICBub3QgYWxpZ25lZCB0byA0IGJ5dGUgYm91bmRhcnkpICovCiAvKiB0aGUgbGFzdCBmb3VyIHBhcmFtcyBhcmUgTEUgKi8KLXZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbV92MSAoY2hhciAqIGJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAotCQkJICAgICBfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKQordm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtX3YxKGNoYXIgKmJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAorCQkJICAgIF9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKIAotICAgIG1lbXNldCAoYm9keSwgMCwgRU1QVFlfRElSX1NJWkVfVjEpOwotICAgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHk7Ci0gICAgCi0gICAgLyogZGlyZW50cnkgaGVhZGVyIG9mICIuIiAqLwotICAgIHB1dF9kZWhfb2Zmc2V0KCAmKGRlaFswXSksIERPVF9PRkZTRVQgKTsKLSAgICAvKiB0aGVzZSB0d28gYXJlIGZyb20gbWFrZV9sZV9pdGVtX2hlYWQsIGFuZCBhcmUgYXJlIExFICovCi0gICAgZGVoWzBdLmRlaF9kaXJfaWQgPSBkaXJpZDsKLSAgICBkZWhbMF0uZGVoX29iamVjdGlkID0gb2JqaWQ7Ci0gICAgZGVoWzBdLmRlaF9zdGF0ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFswXSksIEVNUFRZX0RJUl9TSVpFX1YxIC0gc3RybGVuKCAiLiIgKSk7Ci0gICAgbWFya19kZV92aXNpYmxlKCYoZGVoWzBdKSk7Ci0gIAotICAgIC8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLi4iICovCi0gICAgcHV0X2RlaF9vZmZzZXQoICYoZGVoWzFdKSwgRE9UX0RPVF9PRkZTRVQpOwotICAgIC8qIGtleSBvZiAiLi4iIGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KLSAgICAvKiB0aGVzZSB0d28gYXJlIGZyb20gdGhlIGlub2RlLCBhbmQgYXJlIGFyZSBMRSAqLwotICAgIGRlaFsxXS5kZWhfZGlyX2lkID0gcGFyX2RpcmlkOwotICAgIGRlaFsxXS5kZWhfb2JqZWN0aWQgPSBwYXJfb2JqaWQ7Ci0gICAgZGVoWzFdLmRlaF9zdGF0ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFsxXSksIGRlaF9sb2NhdGlvbiggJihkZWhbMF0pICkgLSBzdHJsZW4oICIuLiIgKSApOwotICAgIG1hcmtfZGVfdmlzaWJsZSgmKGRlaFsxXSkpOworCW1lbXNldChib2R5LCAwLCBFTVBUWV9ESVJfU0laRV9WMSk7CisJZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keTsKIAotICAgIC8qIGNvcHkgIi4uIiBhbmQgIi4iICovCi0gICAgbWVtY3B5IChib2R5ICsgZGVoX2xvY2F0aW9uKCAmKGRlaFswXSkgKSwgIi4iLCAxKTsKLSAgICBtZW1jcHkgKGJvZHkgKyBkZWhfbG9jYXRpb24oICYoZGVoWzFdKSApLCAiLi4iLCAyKTsKKwkvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4iICovCisJcHV0X2RlaF9vZmZzZXQoJihkZWhbMF0pLCBET1RfT0ZGU0VUKTsKKwkvKiB0aGVzZSB0d28gYXJlIGZyb20gbWFrZV9sZV9pdGVtX2hlYWQsIGFuZCBhcmUgYXJlIExFICovCisJZGVoWzBdLmRlaF9kaXJfaWQgPSBkaXJpZDsKKwlkZWhbMF0uZGVoX29iamVjdGlkID0gb2JqaWQ7CisJZGVoWzBdLmRlaF9zdGF0ZSA9IDA7CS8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKwlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoWzBdKSwgRU1QVFlfRElSX1NJWkVfVjEgLSBzdHJsZW4oIi4iKSk7CisJbWFya19kZV92aXNpYmxlKCYoZGVoWzBdKSk7CisKKwkvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4uIiAqLworCXB1dF9kZWhfb2Zmc2V0KCYoZGVoWzFdKSwgRE9UX0RPVF9PRkZTRVQpOworCS8qIGtleSBvZiAiLi4iIGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKwkvKiB0aGVzZSB0d28gYXJlIGZyb20gdGhlIGlub2RlLCBhbmQgYXJlIGFyZSBMRSAqLworCWRlaFsxXS5kZWhfZGlyX2lkID0gcGFyX2RpcmlkOworCWRlaFsxXS5kZWhfb2JqZWN0aWQgPSBwYXJfb2JqaWQ7CisJZGVoWzFdLmRlaF9zdGF0ZSA9IDA7CS8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKwlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoWzFdKSwgZGVoX2xvY2F0aW9uKCYoZGVoWzBdKSkgLSBzdHJsZW4oIi4uIikpOworCW1hcmtfZGVfdmlzaWJsZSgmKGRlaFsxXSkpOworCisJLyogY29weSAiLi4iIGFuZCAiLiIgKi8KKwltZW1jcHkoYm9keSArIGRlaF9sb2NhdGlvbigmKGRlaFswXSkpLCAiLiIsIDEpOworCW1lbWNweShib2R5ICsgZGVoX2xvY2F0aW9uKCYoZGVoWzFdKSksICIuLiIsIDIpOwogfQogCiAvKiBjb21wb3NlIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJpZXMgKi8KLXZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbSAoY2hhciAqIGJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAotCQkJICBfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKQordm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtKGNoYXIgKmJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAorCQkJIF9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKIAotICAgIG1lbXNldCAoYm9keSwgMCwgRU1QVFlfRElSX1NJWkUpOwotICAgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHk7Ci0gICAgCi0gICAgLyogZGlyZW50cnkgaGVhZGVyIG9mICIuIiAqLwotICAgIHB1dF9kZWhfb2Zmc2V0KCAmKGRlaFswXSksIERPVF9PRkZTRVQgKTsKLSAgICAvKiB0aGVzZSB0d28gYXJlIGZyb20gbWFrZV9sZV9pdGVtX2hlYWQsIGFuZCBhcmUgYXJlIExFICovCi0gICAgZGVoWzBdLmRlaF9kaXJfaWQgPSBkaXJpZDsKLSAgICBkZWhbMF0uZGVoX29iamVjdGlkID0gb2JqaWQ7Ci0gICAgZGVoWzBdLmRlaF9zdGF0ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFswXSksIEVNUFRZX0RJUl9TSVpFIC0gUk9VTkRfVVAoIHN0cmxlbiggIi4iICkgKSApOwotICAgIG1hcmtfZGVfdmlzaWJsZSgmKGRlaFswXSkpOwotICAKLSAgICAvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4uIiAqLwotICAgIHB1dF9kZWhfb2Zmc2V0KCAmKGRlaFsxXSksIERPVF9ET1RfT0ZGU0VUICk7Ci0gICAgLyoga2V5IG9mICIuLiIgZm9yIHRoZSByb290IGRpcmVjdG9yeSAqLwotICAgIC8qIHRoZXNlIHR3byBhcmUgZnJvbSB0aGUgaW5vZGUsIGFuZCBhcmUgYXJlIExFICovCi0gICAgZGVoWzFdLmRlaF9kaXJfaWQgPSBwYXJfZGlyaWQ7Ci0gICAgZGVoWzFdLmRlaF9vYmplY3RpZCA9IHBhcl9vYmppZDsKLSAgICBkZWhbMV0uZGVoX3N0YXRlID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLwotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoWzFdKSwgZGVoX2xvY2F0aW9uKCAmKGRlaFswXSkpIC0gUk9VTkRfVVAoIHN0cmxlbiggIi4uIiApICkgKTsKLSAgICBtYXJrX2RlX3Zpc2libGUoJihkZWhbMV0pKTsKKwltZW1zZXQoYm9keSwgMCwgRU1QVFlfRElSX1NJWkUpOworCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHk7CiAKLSAgICAvKiBjb3B5ICIuLiIgYW5kICIuIiAqLwotICAgIG1lbWNweSAoYm9keSArIGRlaF9sb2NhdGlvbiggJihkZWhbMF0pICksICIuIiwgMSk7Ci0gICAgbWVtY3B5IChib2R5ICsgZGVoX2xvY2F0aW9uKCAmKGRlaFsxXSkgKSwgIi4uIiwgMik7CisJLyogZGlyZW50cnkgaGVhZGVyIG9mICIuIiAqLworCXB1dF9kZWhfb2Zmc2V0KCYoZGVoWzBdKSwgRE9UX09GRlNFVCk7CisJLyogdGhlc2UgdHdvIGFyZSBmcm9tIG1ha2VfbGVfaXRlbV9oZWFkLCBhbmQgYXJlIGFyZSBMRSAqLworCWRlaFswXS5kZWhfZGlyX2lkID0gZGlyaWQ7CisJZGVoWzBdLmRlaF9vYmplY3RpZCA9IG9iamlkOworCWRlaFswXS5kZWhfc3RhdGUgPSAwOwkvKiBFbmRpYW4gc2FmZSBpZiAwICovCisJcHV0X2RlaF9sb2NhdGlvbigmKGRlaFswXSksIEVNUFRZX0RJUl9TSVpFIC0gUk9VTkRfVVAoc3RybGVuKCIuIikpKTsKKwltYXJrX2RlX3Zpc2libGUoJihkZWhbMF0pKTsKKworCS8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLi4iICovCisJcHV0X2RlaF9vZmZzZXQoJihkZWhbMV0pLCBET1RfRE9UX09GRlNFVCk7CisJLyoga2V5IG9mICIuLiIgZm9yIHRoZSByb290IGRpcmVjdG9yeSAqLworCS8qIHRoZXNlIHR3byBhcmUgZnJvbSB0aGUgaW5vZGUsIGFuZCBhcmUgYXJlIExFICovCisJZGVoWzFdLmRlaF9kaXJfaWQgPSBwYXJfZGlyaWQ7CisJZGVoWzFdLmRlaF9vYmplY3RpZCA9IHBhcl9vYmppZDsKKwlkZWhbMV0uZGVoX3N0YXRlID0gMDsJLyogRW5kaWFuIHNhZmUgaWYgMCAqLworCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbMV0pLAorCQkJIGRlaF9sb2NhdGlvbigmKGRlaFswXSkpIC0gUk9VTkRfVVAoc3RybGVuKCIuLiIpKSk7CisJbWFya19kZV92aXNpYmxlKCYoZGVoWzFdKSk7CisKKwkvKiBjb3B5ICIuLiIgYW5kICIuIiAqLworCW1lbWNweShib2R5ICsgZGVoX2xvY2F0aW9uKCYoZGVoWzBdKSksICIuIiwgMSk7CisJbWVtY3B5KGJvZHkgKyBkZWhfbG9jYXRpb24oJihkZWhbMV0pKSwgIi4uIiwgMik7CiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9kb19iYWxhbi5jIGIvZnMvcmVpc2VyZnMvZG9fYmFsYW4uYwppbmRleCAyMTE4ZGIyLi5iMjI2NGJhIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9kb19iYWxhbi5jCisrKyBiL2ZzL3JlaXNlcmZzL2RvX2JhbGFuLmMKQEAgLTgsNyArOCw2IEBACiAvKiBiYWxhbmNlIHRoZSB0cmVlIGFjY29yZGluZyB0byB0aGUgYW5hbHlzaXMgbWFkZSBiZWZvcmUsCQkqLwogLyogYW5kIHVzaW5nIGJ1ZmZlcnMgb2J0YWluZWQgYWZ0ZXIgYWxsIGFib3ZlLgkJCQkqLwogCi0KIC8qKgogICoqIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZQogICoqIGJhbGFuY2VfbGVhZgpAQCAtMjQsMjMgKzIzLDIyIEBACiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKIAotc3RydWN0IHRyZWVfYmFsYW5jZSAqIGN1cl90YiA9IE5VTEw7IC8qIGRldGVjdHMgd2hldGhlciBtb3JlIHRoYW4gb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSBvZiB0YiBleGlzdHMgYXMgYSBtZWFucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGNoZWNraW5nIHdoZXRoZXIgc2NoZWR1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbnRlcnJ1cHRpbmcgZG9fYmFsYW5jZSAqLworc3RydWN0IHRyZWVfYmFsYW5jZSAqY3VyX3RiID0gTlVMTDsJLyogZGV0ZWN0cyB3aGV0aGVyIG1vcmUgdGhhbiBvbmUKKwkJCQkJICAgY29weSBvZiB0YiBleGlzdHMgYXMgYSBtZWFucworCQkJCQkgICBvZiBjaGVja2luZyB3aGV0aGVyIHNjaGVkdWxlCisJCQkJCSAgIGlzIGludGVycnVwdGluZyBkb19iYWxhbmNlICovCiAjZW5kaWYKIAotaW5saW5lIHZvaWQgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCi0JCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgZmxhZykKK2lubGluZSB2b2lkIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgZmxhZykKIHsKLSAgICBqb3VybmFsX21hcmtfZGlydHkodGItPnRyYW5zYWN0aW9uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdGItPnRyYW5zYWN0aW9uX2hhbmRsZS0+dF9zdXBlciwgYmgpIDsKKwlqb3VybmFsX21hcmtfZGlydHkodGItPnRyYW5zYWN0aW9uX2hhbmRsZSwKKwkJCSAgIHRiLT50cmFuc2FjdGlvbl9oYW5kbGUtPnRfc3VwZXIsIGJoKTsKIH0KIAogI2RlZmluZSBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkKICNkZWZpbmUgZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5IGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5CiAKLQogLyogc3VtbWFyeTogCiAgaWYgZGVsZXRpbmcgc29tZXRoaW5nICggdGItPmluc2VydF9zaXplWzBdIDwgMCApCiAgICByZXR1cm4oYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlKCkpOyAoZmxhZyBkIGhhbmRsZWQgaGVyZSkKQEAgLTY0LDggKzYyLDYgQEAKIAogLUhhbnMgKi8KIAotCi0KIC8qIEJhbGFuY2UgbGVhZiBub2RlIGluIGNhc2Ugb2YgZGVsZXRlIG9yIGN1dDogaW5zZXJ0X3NpemVbMF0gPCAwCiAgKgogICogbG51bSwgcm51bSBjYW4gaGF2ZSB2YWx1ZXMgPj0gLTEKQEAgLTczLDEzODQgKzY5LDE5MzMgQEAKICAqCSAwIG1lYW5zIHRoYXQgbm90aGluZyBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZSBuZWlnaGJvcgogICoJPjAgbWVhbnMgdG8gc2hpZnQgZW50aXJlbHkgb3IgcGFydGx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGl0ZW1zIHRvIHRoZSBuZWlnaGJvcgogICovCi1zdGF0aWMgaW50IGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgZmxhZykKK3N0YXRpYyBpbnQgYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgZmxhZykKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlMwID0gUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKTsKLSAgICBpbnQgaXRlbV9wb3MgPSBQQVRIX0xBU1RfUE9TSVRJT04gKHRiLT50Yl9wYXRoKTsKLSAgICBpbnQgcG9zX2luX2l0ZW0gPSB0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW07Ci0gICAgc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOwotICAgIGludCBuOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiUzAgPSBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCk7CisJaW50IGl0ZW1fcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OKHRiLT50Yl9wYXRoKTsKKwlpbnQgcG9zX2luX2l0ZW0gPSB0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW07CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOworCWludCBuOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOwogCi0gICAgUkZBTFNFKCB0Yi0+RlJbMF0gJiYgQl9MRVZFTCAodGItPkZSWzBdKSAhPSBESVNLX0xFQUZfTk9ERV9MRVZFTCArIDEsCi0JICAgICJ2cy0gMTIwMDA6IGxldmVsOiB3cm9uZyBGUiAleiIsIHRiLT5GUlswXSk7Ci0gICAgUkZBTFNFKCB0Yi0+YmxrbnVtWzBdID4gMSwKLQkgICAgIlBBUC0xMjAwNTogdGItPmJsa251bSA9PSAlZCwgY2FuIG5vdCBiZSA+IDEiLCB0Yi0+YmxrbnVtWzBdKTsKLSAgICBSRkFMU0UoICEgdGItPmJsa251bVswXSAmJiAhIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwKLQkgICAgIlBBUC0xMjAxMDogdHJlZSBjYW4gbm90IGJlIGVtcHR5Iik7CisJUkZBTFNFKHRiLT5GUlswXSAmJiBCX0xFVkVMKHRiLT5GUlswXSkgIT0gRElTS19MRUFGX05PREVfTEVWRUwgKyAxLAorCSAgICAgICAidnMtIDEyMDAwOiBsZXZlbDogd3JvbmcgRlIgJXoiLCB0Yi0+RlJbMF0pOworCVJGQUxTRSh0Yi0+YmxrbnVtWzBdID4gMSwKKwkgICAgICAgIlBBUC0xMjAwNTogdGItPmJsa251bSA9PSAlZCwgY2FuIG5vdCBiZSA+IDEiLCB0Yi0+YmxrbnVtWzBdKTsKKwlSRkFMU0UoIXRiLT5ibGtudW1bMF0gJiYgIVBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwKKwkgICAgICAgIlBBUC0xMjAxMDogdHJlZSBjYW4gbm90IGJlIGVtcHR5Iik7CiAKLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3Bvcyk7CisJaWggPSBCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3Bvcyk7CiAKLSAgICAvKiBEZWxldGUgb3IgdHJ1bmNhdGUgdGhlIGl0ZW0gKi8KKwkvKiBEZWxldGUgb3IgdHJ1bmNhdGUgdGhlIGl0ZW0gKi8KIAotICAgIHN3aXRjaCAoZmxhZykgewotICAgIGNhc2UgTV9ERUxFVEU6ICAgLyogZGVsZXRlIGl0ZW0gaW4gU1swXSAqLworCXN3aXRjaCAoZmxhZykgeworCWNhc2UgTV9ERUxFVEU6CQkvKiBkZWxldGUgaXRlbSBpbiBTWzBdICovCiAKLQlSRkFMU0UoIGloX2l0ZW1fbGVuKGloKSArIElIX1NJWkUgIT0gLXRiLT5pbnNlcnRfc2l6ZVswXSwKLQkgICAgICAgICJ2cy0xMjAxMzogbW9kZSBEZWxldGUsIGluc2VydCBzaXplICVkLCBpaCB0byBiZSBkZWxldGVkICVoIiwKLSAJCSAtdGItPmluc2VydF9zaXplIFswXSwgaWgpOworCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpICsgSUhfU0laRSAhPSAtdGItPmluc2VydF9zaXplWzBdLAorCQkgICAgICAgInZzLTEyMDEzOiBtb2RlIERlbGV0ZSwgaW5zZXJ0IHNpemUgJWQsIGloIHRvIGJlIGRlbGV0ZWQgJWgiLAorCQkgICAgICAgLXRiLT5pbnNlcnRfc2l6ZVswXSwgaWgpOwogCi0JYmkudGIgPSB0YjsKLQliaS5iaV9iaCA9IHRiUzA7Ci0JYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpOwotCWxlYWZfZGVsZXRlX2l0ZW1zICgmYmksIDAsIGl0ZW1fcG9zLCAxLCAtMSk7CisJCWJpLnRiID0gdGI7CisJCWJpLmJpX2JoID0gdGJTMDsKKwkJYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApOworCQliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgMSk7CisJCWxlYWZfZGVsZXRlX2l0ZW1zKCZiaSwgMCwgaXRlbV9wb3MsIDEsIC0xKTsKIAotCWlmICggISBpdGVtX3BvcyAmJiB0Yi0+Q0ZMWzBdICkgewotCSAgICBpZiAoIEJfTlJfSVRFTVModGJTMCkgKSB7Ci0JCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdLHRiUzAsMCk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWlmICggISBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSApCi0JCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSx0Yi0+bGtleVswXSxQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCksMCk7Ci0JICAgIH0KLQl9IAotCi0JUkZBTFNFKCAhIGl0ZW1fcG9zICYmICF0Yi0+Q0ZMWzBdLAotCQkiUEFQLTEyMDIwOiB0Yi0+Q0ZMWzBdPT0lcCwgdGItPkxbMF09PSVwIiwgdGItPkNGTFswXSwgdGItPkxbMF0pOwotICAgIAotCWJyZWFrOwotCi0gICAgY2FzZSBNX0NVVDogeyAgLyogY3V0IGl0ZW0gaW4gU1swXSAqLwotCWJpLnRiID0gdGI7Ci0JYmkuYmlfYmggPSB0YlMwOwotCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7Ci0JYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKLQlpZiAoaXNfZGlyZW50cnlfbGVfaWggKGloKSkgewotCi0JICAgIC8qIFVGUyB1bmxpbmsgc2VtYW50aWNzIGFyZSBzdWNoIHRoYXQgeW91IGNhbiBvbmx5IGRlbGV0ZSBvbmUgZGlyZWN0b3J5IGVudHJ5IGF0IGEgdGltZS4gKi8KLQkgICAgLyogd2hlbiB3ZSBjdXQgYSBkaXJlY3RvcnkgdGItPmluc2VydF9zaXplWzBdIG1lYW5zIG51bWJlciBvZiBlbnRyaWVzIHRvIGJlIGN1dCAoYWx3YXlzIDEpICovCi0JICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IC0xOwotCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoJmJpLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sIC10Yi0+aW5zZXJ0X3NpemVbMF0pOwotCi0JICAgIFJGQUxTRSggISBpdGVtX3BvcyAmJiAhIHBvc19pbl9pdGVtICYmICEgdGItPkNGTFswXSwKLQkJICAgICJQQVAtMTIwMzA6IGNhbiBub3QgY2hhbmdlIGRlbGltaXRpbmcga2V5LiBDRkxbMF09JXAiLCAKLQkJICAgIHRiLT5DRkxbMF0pOwotCi0JICAgIGlmICggISBpdGVtX3BvcyAmJiAhIHBvc19pbl9pdGVtICYmIHRiLT5DRkxbMF0gKSB7Ci0JCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdLHRiUzAsMCk7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoJmJpLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sIC10Yi0+aW5zZXJ0X3NpemVbMF0pOwotCi0JICAgIFJGQUxTRSggISBpaF9pdGVtX2xlbihpaCksCi0JCSJQQVAtMTIwMzU6IGN1dCBtdXN0IGxlYXZlIG5vbi16ZXJvIGR5bmFtaWMgbGVuZ3RoIG9mIGl0ZW0iKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLQlwcmludF9jdXJfdGIgKCIxMjA0MCIpOwotCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIwNDA6IGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZTogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCi0JCQkoZmxhZyA9PSBNX1BBU1RFKSA/ICJQQVNURSIgOiAoKGZsYWcgPT0gTV9JTlNFUlQpID8gIklOU0VSVCIgOiAiVU5LTk9XTiIpLCBmbGFnKTsKLSAgICB9Ci0KLSAgICAvKiB0aGUgcnVsZSBpcyB0aGF0IG5vIHNoaWZ0aW5nIG9jY3VycyB1bmxlc3MgYnkgc2hpZnRpbmcgYSBub2RlIGNhbiBiZSBmcmVlZCAqLwotICAgIG4gPSBCX05SX0lURU1TKHRiUzApOwotICAgIGlmICggdGItPmxudW1bMF0gKSAgICAgLyogTFswXSB0YWtlcyBwYXJ0IGluIGJhbGFuY2luZyAqLwotICAgIHsKLQlpZiAoIHRiLT5sbnVtWzBdID09IC0xICkgICAgLyogTFswXSBtdXN0IGJlIGpvaW5lZCB3aXRoIFNbMF0gKi8KLQl7Ci0JICAgIGlmICggdGItPnJudW1bMF0gPT0gLTEgKSAgICAvKiBSWzBdIG11c3QgYmUgYWxzbyBqb2luZWQgd2l0aCBTWzBdICovCi0JICAgIHsJCQkKLQkJaWYgKCB0Yi0+RlJbMF0gPT0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApICkKLQkJewotCQkgICAgLyogYWxsIGNvbnRlbnRzIG9mIGFsbCB0aGUgMyBidWZmZXJzIHdpbGwgYmUgaW4gTFswXSAqLwotCQkgICAgaWYgKCBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSA9PSAwICYmIDEgPCBCX05SX0lURU1TKHRiLT5GUlswXSkgKQotCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sdGItPmxrZXlbMF0sdGItPkZSWzBdLDEpOwotCi0JCSAgICBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX0wsIHRiLCBuLCAtMSwgTlVMTCk7Ci0JCSAgICBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9SX1RPX0wsIHRiLCBCX05SX0lURU1TKHRiLT5SWzBdKSwgLTEsIE5VTEwpOwotCi0JCSAgICByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOwotCQkgICAgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0Yi0+UlswXSk7Ci0KLQkJICAgIHJldHVybiAwOworCQlpZiAoIWl0ZW1fcG9zICYmIHRiLT5DRkxbMF0pIHsKKwkJCWlmIChCX05SX0lURU1TKHRiUzApKSB7CisJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLCB0YlMwLAorCQkJCQkgICAgMCk7CisJCQl9IGVsc2UgeworCQkJCWlmICghUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKSkKKwkJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLAorCQkJCQkJICAgIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLAorCQkJCQkJCQkgICAwKSwgMCk7CisJCQl9CiAJCX0KLQkJLyogYWxsIGNvbnRlbnRzIG9mIGFsbCB0aGUgMyBidWZmZXJzIHdpbGwgYmUgaW4gUlswXSAqLwotCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1IsIHRiLCBuLCAtMSwgTlVMTCk7Ci0JCWxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX0xfVE9fUiwgdGIsIEJfTlJfSVRFTVModGItPkxbMF0pLCAtMSwgTlVMTCk7CiAKLQkJLyogcmlnaHRfZGVsaW1pdGluZ19rZXkgaXMgY29ycmVjdCBpbiBSWzBdICovCi0JCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdLHRiLT5SWzBdLDApOworCQlSRkFMU0UoIWl0ZW1fcG9zICYmICF0Yi0+Q0ZMWzBdLAorCQkgICAgICAgIlBBUC0xMjAyMDogdGItPkNGTFswXT09JXAsIHRiLT5MWzBdPT0lcCIsIHRiLT5DRkxbMF0sCisJCSAgICAgICB0Yi0+TFswXSk7CiAKLQkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlMwKTsKLQkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0Yi0+TFswXSk7CisJCWJyZWFrOwogCi0JCXJldHVybiAtMTsKLQkgICAgfQorCWNhc2UgTV9DVVQ6ewkJLyogY3V0IGl0ZW0gaW4gU1swXSAqLworCQkJYmkudGIgPSB0YjsKKwkJCWJpLmJpX2JoID0gdGJTMDsKKwkJCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJCWJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKTsKKwkJCWlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKIAotCSAgICBSRkFMU0UoIHRiLT5ybnVtWzBdICE9IDAsIAotCQkgICAgIlBBUC0xMjA0NTogcm51bSBtdXN0IGJlIDAgKCVkKSIsIHRiLT5ybnVtWzBdKTsKLQkgICAgLyogYWxsIGNvbnRlbnRzIG9mIExbMF0gYW5kIFNbMF0gd2lsbCBiZSBpbiBMWzBdICovCi0JICAgIGxlYWZfc2hpZnRfbGVmdCh0YiwgbiwgLTEpOworCQkJCS8qIFVGUyB1bmxpbmsgc2VtYW50aWNzIGFyZSBzdWNoIHRoYXQgeW91IGNhbiBvbmx5IGRlbGV0ZSBvbmUgZGlyZWN0b3J5IGVudHJ5IGF0IGEgdGltZS4gKi8KKwkJCQkvKiB3aGVuIHdlIGN1dCBhIGRpcmVjdG9yeSB0Yi0+aW5zZXJ0X3NpemVbMF0gbWVhbnMgbnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgY3V0IChhbHdheXMgMSkgKi8KKwkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSAtMTsKKwkJCQlsZWFmX2N1dF9mcm9tX2J1ZmZlcigmYmksIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwKKwkJCQkJCSAgICAgLXRiLT5pbnNlcnRfc2l6ZVswXSk7CiAKLQkgICAgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlMwKTsKKwkJCQlSRkFMU0UoIWl0ZW1fcG9zICYmICFwb3NfaW5faXRlbSAmJiAhdGItPkNGTFswXSwKKwkJCQkgICAgICAgIlBBUC0xMjAzMDogY2FuIG5vdCBjaGFuZ2UgZGVsaW1pdGluZyBrZXkuIENGTFswXT0lcCIsCisJCQkJICAgICAgIHRiLT5DRkxbMF0pOwogCi0JICAgIHJldHVybiAwOworCQkJCWlmICghaXRlbV9wb3MgJiYgIXBvc19pbl9pdGVtICYmIHRiLT5DRkxbMF0pIHsKKwkJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLAorCQkJCQkJICAgIHRiUzAsIDApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbGVhZl9jdXRfZnJvbV9idWZmZXIoJmJpLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sCisJCQkJCQkgICAgIC10Yi0+aW5zZXJ0X3NpemVbMF0pOworCisJCQkJUkZBTFNFKCFpaF9pdGVtX2xlbihpaCksCisJCQkJICAgICAgICJQQVAtMTIwMzU6IGN1dCBtdXN0IGxlYXZlIG5vbi16ZXJvIGR5bmFtaWMgbGVuZ3RoIG9mIGl0ZW0iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlwcmludF9jdXJfdGIoIjEyMDQwIik7CisJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCSAgICAgICAiUEFQLTEyMDQwOiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGU6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAorCQkJICAgICAgIChmbGFnID09CisJCQkJTV9QQVNURSkgPyAiUEFTVEUiIDogKChmbGFnID09CisJCQkJCQkgICAgICAgTV9JTlNFUlQpID8gIklOU0VSVCIgOgorCQkJCQkJICAgICAgIlVOS05PV04iKSwgZmxhZyk7CiAJfQotCS8qIGEgcGFydCBvZiBjb250ZW50cyBvZiBTWzBdIHdpbGwgYmUgaW4gTFswXSBhbmQgdGhlIHJlc3QgcGFydCBvZiBTWzBdIHdpbGwgYmUgaW4gUlswXSAqLwogCi0JUkZBTFNFKCAoIHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPCBuICkgfHwgCi0JCSggdGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA+IG4rMSApLAotCQkiUEFQLTEyMDUwOiBybnVtKCVkKSBhbmQgbG51bSglZCkgYW5kIGl0ZW0gbnVtYmVyKCVkKSBpbiBTWzBdIGFyZSBub3QgY29uc2lzdGVudCIsCi0JCXRiLT5ybnVtWzBdLCB0Yi0+bG51bVswXSwgbik7Ci0JUkZBTFNFKCAoIHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPT0gbiApICYmIAotCQkodGItPmxieXRlcyAhPSAtMSB8fCB0Yi0+cmJ5dGVzICE9IC0xKSwKLQkJIlBBUC0xMjA1NTogYmFkIHJieXRlcyAoJWQpL2xieXRlcyAoJWQpIHBhcmFtZXRlcnMgd2hlbiBpdGVtcyBhcmUgbm90IHNwbGl0IiwgCi0JCXRiLT5yYnl0ZXMsIHRiLT5sYnl0ZXMpOwotCVJGQUxTRSggKCB0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdID09IG4gKyAxICkgJiYgCi0JCSh0Yi0+bGJ5dGVzIDwgMSB8fCB0Yi0+cmJ5dGVzICE9IC0xKSwKLQkJIlBBUC0xMjA2MDogYmFkIHJieXRlcyAoJWQpL2xieXRlcyAoJWQpIHBhcmFtZXRlcnMgd2hlbiBpdGVtcyBhcmUgc3BsaXQiLCAKLQkJdGItPnJieXRlcywgdGItPmxieXRlcyk7CisJLyogdGhlIHJ1bGUgaXMgdGhhdCBubyBzaGlmdGluZyBvY2N1cnMgdW5sZXNzIGJ5IHNoaWZ0aW5nIGEgbm9kZSBjYW4gYmUgZnJlZWQgKi8KKwluID0gQl9OUl9JVEVNUyh0YlMwKTsKKwlpZiAodGItPmxudW1bMF0pIHsJLyogTFswXSB0YWtlcyBwYXJ0IGluIGJhbGFuY2luZyAqLworCQlpZiAodGItPmxudW1bMF0gPT0gLTEpIHsJLyogTFswXSBtdXN0IGJlIGpvaW5lZCB3aXRoIFNbMF0gKi8KKwkJCWlmICh0Yi0+cm51bVswXSA9PSAtMSkgewkvKiBSWzBdIG11c3QgYmUgYWxzbyBqb2luZWQgd2l0aCBTWzBdICovCisJCQkJaWYgKHRiLT5GUlswXSA9PSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCkpIHsKKwkJCQkJLyogYWxsIGNvbnRlbnRzIG9mIGFsbCB0aGUgMyBidWZmZXJzIHdpbGwgYmUgaW4gTFswXSAqLworCQkJCQlpZiAoUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKSA9PSAwCisJCQkJCSAgICAmJiAxIDwgQl9OUl9JVEVNUyh0Yi0+RlJbMF0pKQorCQkJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sCisJCQkJCQkJICAgIHRiLT5sa2V5WzBdLAorCQkJCQkJCSAgICB0Yi0+RlJbMF0sIDEpOwogCi0JbGVhZl9zaGlmdF9sZWZ0ICh0YiwgdGItPmxudW1bMF0sIHRiLT5sYnl0ZXMpOwotCWxlYWZfc2hpZnRfcmlnaHQodGIsIHRiLT5ybnVtWzBdLCB0Yi0+cmJ5dGVzKTsKKwkJCQkJbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9TX1RPX0wsIHRiLCBuLAorCQkJCQkJCS0xLCBOVUxMKTsKKwkJCQkJbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9SX1RPX0wsIHRiLAorCQkJCQkJCUJfTlJfSVRFTVModGItPlJbMF0pLAorCQkJCQkJCS0xLCBOVUxMKTsKIAotCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTMCk7CisJCQkJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlMwKTsKKwkJCQkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsCisJCQkJCQkJCSAgIHRiLT5SWzBdKTsKIAorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJLyogYWxsIGNvbnRlbnRzIG9mIGFsbCB0aGUgMyBidWZmZXJzIHdpbGwgYmUgaW4gUlswXSAqLworCQkJCWxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19SLCB0YiwgbiwgLTEsCisJCQkJCQlOVUxMKTsKKwkJCQlsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX0xfVE9fUiwgdGIsCisJCQkJCQlCX05SX0lURU1TKHRiLT5MWzBdKSwgLTEsIE5VTEwpOworCisJCQkJLyogcmlnaHRfZGVsaW1pdGluZ19rZXkgaXMgY29ycmVjdCBpbiBSWzBdICovCisJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdLAorCQkJCQkgICAgdGItPlJbMF0sIDApOworCisJCQkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiUzApOworCQkJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0Yi0+TFswXSk7CisKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCVJGQUxTRSh0Yi0+cm51bVswXSAhPSAwLAorCQkJICAgICAgICJQQVAtMTIwNDU6IHJudW0gbXVzdCBiZSAwICglZCkiLCB0Yi0+cm51bVswXSk7CisJCQkvKiBhbGwgY29udGVudHMgb2YgTFswXSBhbmQgU1swXSB3aWxsIGJlIGluIExbMF0gKi8KKwkJCWxlYWZfc2hpZnRfbGVmdCh0YiwgbiwgLTEpOworCisJCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTMCk7CisKKwkJCXJldHVybiAwOworCQl9CisJCS8qIGEgcGFydCBvZiBjb250ZW50cyBvZiBTWzBdIHdpbGwgYmUgaW4gTFswXSBhbmQgdGhlIHJlc3QgcGFydCBvZiBTWzBdIHdpbGwgYmUgaW4gUlswXSAqLworCisJCVJGQUxTRSgodGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA8IG4pIHx8CisJCSAgICAgICAodGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA+IG4gKyAxKSwKKwkJICAgICAgICJQQVAtMTIwNTA6IHJudW0oJWQpIGFuZCBsbnVtKCVkKSBhbmQgaXRlbSBudW1iZXIoJWQpIGluIFNbMF0gYXJlIG5vdCBjb25zaXN0ZW50IiwKKwkJICAgICAgIHRiLT5ybnVtWzBdLCB0Yi0+bG51bVswXSwgbik7CisJCVJGQUxTRSgodGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA9PSBuKSAmJgorCQkgICAgICAgKHRiLT5sYnl0ZXMgIT0gLTEgfHwgdGItPnJieXRlcyAhPSAtMSksCisJCSAgICAgICAiUEFQLTEyMDU1OiBiYWQgcmJ5dGVzICglZCkvbGJ5dGVzICglZCkgcGFyYW1ldGVycyB3aGVuIGl0ZW1zIGFyZSBub3Qgc3BsaXQiLAorCQkgICAgICAgdGItPnJieXRlcywgdGItPmxieXRlcyk7CisJCVJGQUxTRSgodGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA9PSBuICsgMSkgJiYKKwkJICAgICAgICh0Yi0+bGJ5dGVzIDwgMSB8fCB0Yi0+cmJ5dGVzICE9IC0xKSwKKwkJICAgICAgICJQQVAtMTIwNjA6IGJhZCByYnl0ZXMgKCVkKS9sYnl0ZXMgKCVkKSBwYXJhbWV0ZXJzIHdoZW4gaXRlbXMgYXJlIHNwbGl0IiwKKwkJICAgICAgIHRiLT5yYnl0ZXMsIHRiLT5sYnl0ZXMpOworCisJCWxlYWZfc2hpZnRfbGVmdCh0YiwgdGItPmxudW1bMF0sIHRiLT5sYnl0ZXMpOworCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLCB0Yi0+cm51bVswXSwgdGItPnJieXRlcyk7CisKKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiUzApOworCisJCXJldHVybiAwOworCX0KKworCWlmICh0Yi0+cm51bVswXSA9PSAtMSkgeworCQkvKiBhbGwgY29udGVudHMgb2YgUlswXSBhbmQgU1swXSB3aWxsIGJlIGluIFJbMF0gKi8KKwkJbGVhZl9zaGlmdF9yaWdodCh0YiwgbiwgLTEpOworCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTMCk7CisJCXJldHVybiAwOworCX0KKworCVJGQUxTRSh0Yi0+cm51bVswXSwKKwkgICAgICAgIlBBUC0xMjA2NTogYmFkIHJudW0gcGFyYW1ldGVyIG11c3QgYmUgMCAoJWQpIiwgdGItPnJudW1bMF0pOwogCXJldHVybiAwOwotICAgIH0KLQotICAgIGlmICggdGItPnJudW1bMF0gPT0gLTEgKSB7Ci0JLyogYWxsIGNvbnRlbnRzIG9mIFJbMF0gYW5kIFNbMF0gd2lsbCBiZSBpbiBSWzBdICovCi0JbGVhZl9zaGlmdF9yaWdodCh0YiwgbiwgLTEpOwotCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTMCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUkZBTFNFKCB0Yi0+cm51bVswXSwgCi0JICAgICJQQVAtMTIwNjU6IGJhZCBybnVtIHBhcmFtZXRlciBtdXN0IGJlIDAgKCVkKSIsIHRiLT5ybnVtWzBdKTsKLSAgICByZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGJhbGFuY2VfbGVhZiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwJCS8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0gKHRoaXMgaXMgb24gbGl0dGxlIGVuZGlhbikgKi8KLQkJCSBjb25zdCBjaGFyICogYm9keSwJCS8qIGJvZHkgIG9mIGluc2VydGVkIGl0ZW0gb3IgYnl0ZXMgdG8gcGFzdGUgKi8KLQkJCSBpbnQgZmxhZywJCQkvKiBpIC0gaW5zZXJ0LCBkIC0gZGVsZXRlLCBjIC0gY3V0LCBwIC0gcGFzdGUKLQkJCQkJCQkgICAoc2VlIGNvbW1lbnQgdG8gZG9fYmFsYW5jZSkgKi8KLQkJCSBzdHJ1Y3QgaXRlbV9oZWFkICogaW5zZXJ0X2tleSwgIC8qIGluIG91ciBwcm9jZXNzaW5nIG9mIG9uZSBsZXZlbCB3ZSBzb21ldGltZXMgZGV0ZXJtaW5lIHdoYXQKLQkJCQkJCQkgICAgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBuZXh0IGhpZ2hlciBsZXZlbC4gIFRoaXMgaW5zZXJ0aW9uCi0JCQkJCQkJICAgIGNvbnNpc3RzIG9mIGEga2V5IG9yIHR3byBrZXlzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nCi0JCQkJCQkJICAgIHBvaW50ZXJzICovCi0JCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGluc2VydF9wdHIgLyogaW5zZXJ0ZWQgbm9kZS1wdHJzIGZvciB0aGUgbmV4dCBsZXZlbCAqLworc3RhdGljIGludCBiYWxhbmNlX2xlYWYoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIHN0cnVjdCBpdGVtX2hlYWQgKmloLAkvKiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtICh0aGlzIGlzIG9uIGxpdHRsZSBlbmRpYW4pICovCisJCQljb25zdCBjaGFyICpib2R5LAkvKiBib2R5ICBvZiBpbnNlcnRlZCBpdGVtIG9yIGJ5dGVzIHRvIHBhc3RlICovCisJCQlpbnQgZmxhZywJLyogaSAtIGluc2VydCwgZCAtIGRlbGV0ZSwgYyAtIGN1dCwgcCAtIHBhc3RlCisJCQkJCSAgIChzZWUgY29tbWVudCB0byBkb19iYWxhbmNlKSAqLworCQkJc3RydWN0IGl0ZW1faGVhZCAqaW5zZXJ0X2tleSwJLyogaW4gb3VyIHByb2Nlc3Npbmcgb2Ygb25lIGxldmVsIHdlIHNvbWV0aW1lcyBkZXRlcm1pbmUgd2hhdAorCQkJCQkJCSAgIG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwuICBUaGlzIGluc2VydGlvbgorCQkJCQkJCSAgIGNvbnNpc3RzIG9mIGEga2V5IG9yIHR3byBrZXlzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nCisJCQkJCQkJICAgcG9pbnRlcnMgKi8KKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmluc2VydF9wdHIJLyogaW5zZXJ0ZWQgbm9kZS1wdHJzIGZvciB0aGUgbmV4dCBsZXZlbCAqLwogICAgICkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlMwID0gUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKTsKLSAgICBpbnQgaXRlbV9wb3MgPSBQQVRIX0xBU1RfUE9TSVRJT04gKHRiLT50Yl9wYXRoKTsJLyogIGluZGV4IGludG8gdGhlIGFycmF5IG9mIGl0ZW0gaGVhZGVycyBpbiBTWzBdIAotCQkJCQkJCSAgICBvZiB0aGUgYWZmZWN0ZWQgaXRlbSAqLwotICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNfbmV3WzJdOyAgLyogbmV3IG5vZGVzIGFsbG9jYXRlZCB0byBob2xkIHdoYXQgY291bGQgbm90IGZpdCBpbnRvIFMgKi8KLSAgICBpbnQgc251bVsyXTsJICAgIC8qIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwgYmUgcGxhY2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBTX25ldyAoaW5jbHVkZXMgcGFydGlhbGx5IHNoaWZ0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcykgKi8KLSAgICBpbnQgc2J5dGVzWzJdOyAgICAgICAgICAvKiBpZiBhbiBpdGVtIGlzIHBhcnRpYWxseSBzaGlmdGVkIGludG8gU19uZXcgdGhlbiAKLQkJCSAgICAgICBpZiBpdCBpcyBhIGRpcmVjdG9yeSBpdGVtIAotCQkJICAgICAgIGl0IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBmcm9tIHRoZSBpdGVtIHRoYXQgYXJlIHNoaWZ0ZWQgaW50byBTX25ldwotCQkJICAgICAgIGVsc2UKLQkJCSAgICAgICBpdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGl0ZW0gdGhhdCBhcmUgc2hpZnRlZCBpbnRvIFNfbmV3Ci0JCQkgICAgKi8KLSAgICBpbnQgbiwgaTsKLSAgICBpbnQgcmV0X3ZhbDsKLSAgICBpbnQgcG9zX2luX2l0ZW07Ci0gICAgaW50IHplcm9zX251bTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiUzAgPSBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCk7CisJaW50IGl0ZW1fcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OKHRiLT50Yl9wYXRoKTsJLyogIGluZGV4IGludG8gdGhlIGFycmF5IG9mIGl0ZW0gaGVhZGVycyBpbiBTWzBdIAorCQkJCQkJCSAgIG9mIHRoZSBhZmZlY3RlZCBpdGVtICovCisJc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqU19uZXdbMl07CS8qIG5ldyBub2RlcyBhbGxvY2F0ZWQgdG8gaG9sZCB3aGF0IGNvdWxkIG5vdCBmaXQgaW50byBTICovCisJaW50IHNudW1bMl07CQkvKiBudW1iZXIgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHBsYWNlZAorCQkJCSAgIGludG8gU19uZXcgKGluY2x1ZGVzIHBhcnRpYWxseSBzaGlmdGVkCisJCQkJICAgaXRlbXMpICovCisJaW50IHNieXRlc1syXTsJCS8qIGlmIGFuIGl0ZW0gaXMgcGFydGlhbGx5IHNoaWZ0ZWQgaW50byBTX25ldyB0aGVuIAorCQkJCSAgIGlmIGl0IGlzIGEgZGlyZWN0b3J5IGl0ZW0gCisJCQkJICAgaXQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZyb20gdGhlIGl0ZW0gdGhhdCBhcmUgc2hpZnRlZCBpbnRvIFNfbmV3CisJCQkJICAgZWxzZQorCQkJCSAgIGl0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgaXRlbSB0aGF0IGFyZSBzaGlmdGVkIGludG8gU19uZXcKKwkJCQkgKi8KKwlpbnQgbiwgaTsKKwlpbnQgcmV0X3ZhbDsKKwlpbnQgcG9zX2luX2l0ZW07CisJaW50IHplcm9zX251bTsKIAotICAgIFBST0NfSU5GT19JTkMoIHRiIC0+IHRiX3NiLCBiYWxhbmNlX2F0WyAwIF0gKTsKKwlQUk9DX0lORk9fSU5DKHRiLT50Yl9zYiwgYmFsYW5jZV9hdFswXSk7CiAKLSAgICAvKiBNYWtlIGJhbGFuY2UgaW4gY2FzZSBpbnNlcnRfc2l6ZVswXSA8IDAgKi8KLSAgICBpZiAoIHRiLT5pbnNlcnRfc2l6ZVswXSA8IDAgKQotCXJldHVybiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUgKHRiLCBmbGFnKTsKLSAgCi0gICAgemVyb3NfbnVtID0gMDsKLSAgICBpZiAoZmxhZyA9PSBNX0lOU0VSVCAmJiBib2R5ID09IDApCi0JemVyb3NfbnVtID0gaWhfaXRlbV9sZW4oIGloICk7CisJLyogTWFrZSBiYWxhbmNlIGluIGNhc2UgaW5zZXJ0X3NpemVbMF0gPCAwICovCisJaWYgKHRiLT5pbnNlcnRfc2l6ZVswXSA8IDApCisJCXJldHVybiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUodGIsIGZsYWcpOwogCi0gICAgcG9zX2luX2l0ZW0gPSB0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW07Ci0gICAgLyogZm9yIGluZGlyZWN0IGl0ZW0gcG9zX2luX2l0ZW0gaXMgbWVhc3VyZWQgaW4gdW5mb3JtYXR0ZWQgbm9kZQotICAgICAgIHBvaW50ZXJzLiBSZWNhbGN1bGF0ZSB0byBieXRlcyAqLwotICAgIGlmIChmbGFnICE9IE1fSU5TRVJUICYmIGlzX2luZGlyZWN0X2xlX2loIChCX05fUElURU1fSEVBRCAodGJTMCwgaXRlbV9wb3MpKSkKLQlwb3NfaW5faXRlbSAqPSBVTkZNX1BfU0laRTsKKwl6ZXJvc19udW0gPSAwOworCWlmIChmbGFnID09IE1fSU5TRVJUICYmIGJvZHkgPT0gMCkKKwkJemVyb3NfbnVtID0gaWhfaXRlbV9sZW4oaWgpOwogCi0gICAgaWYgKCB0Yi0+bG51bVswXSA+IDAgKSB7Ci0JLyogU2hpZnQgbG51bVswXSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIGxlZnQgbmVpZ2hib3IgTFswXSAqLwotCWlmICggaXRlbV9wb3MgPCB0Yi0+bG51bVswXSApIHsKLQkgICAgLyogbmV3IGl0ZW0gb3IgaXQgcGFydCBmYWxscyB0byBMWzBdLCBzaGlmdCBpdCB0b28gKi8KLQkgICAgbiA9IEJfTlJfSVRFTVModGItPkxbMF0pOworCXBvc19pbl9pdGVtID0gdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOworCS8qIGZvciBpbmRpcmVjdCBpdGVtIHBvc19pbl9pdGVtIGlzIG1lYXN1cmVkIGluIHVuZm9ybWF0dGVkIG5vZGUKKwkgICBwb2ludGVycy4gUmVjYWxjdWxhdGUgdG8gYnl0ZXMgKi8KKwlpZiAoZmxhZyAhPSBNX0lOU0VSVAorCSAgICAmJiBpc19pbmRpcmVjdF9sZV9paChCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpKQorCQlwb3NfaW5faXRlbSAqPSBVTkZNX1BfU0laRTsKIAotCSAgICBzd2l0Y2ggKGZsYWcpIHsKLQkgICAgY2FzZSBNX0lOU0VSVDogICAvKiBpbnNlcnQgaXRlbSBpbnRvIExbMF0gKi8KKwlpZiAodGItPmxudW1bMF0gPiAwKSB7CisJCS8qIFNoaWZ0IGxudW1bMF0gaXRlbXMgZnJvbSBTWzBdIHRvIHRoZSBsZWZ0IG5laWdoYm9yIExbMF0gKi8KKwkJaWYgKGl0ZW1fcG9zIDwgdGItPmxudW1bMF0pIHsKKwkJCS8qIG5ldyBpdGVtIG9yIGl0IHBhcnQgZmFsbHMgdG8gTFswXSwgc2hpZnQgaXQgdG9vICovCisJCQluID0gQl9OUl9JVEVNUyh0Yi0+TFswXSk7CiAKLQkJaWYgKCBpdGVtX3BvcyA9PSB0Yi0+bG51bVswXSAtIDEgJiYgdGItPmxieXRlcyAhPSAtMSApIHsKLQkJICAgIC8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBMWzBdICovCi0JCSAgICBpbnQgbmV3X2l0ZW1fbGVuOwotCQkgICAgaW50IHZlcnNpb247CisJCQlzd2l0Y2ggKGZsYWcpIHsKKwkJCWNhc2UgTV9JTlNFUlQ6CS8qIGluc2VydCBpdGVtIGludG8gTFswXSAqLwogCi0JCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9sZWZ0ICh0YiwgdGItPmxudW1bMF0tMSwgLTEpOworCQkJCWlmIChpdGVtX3BvcyA9PSB0Yi0+bG51bVswXSAtIDEKKwkJCQkgICAgJiYgdGItPmxieXRlcyAhPSAtMSkgeworCQkJCQkvKiBwYXJ0IG9mIG5ldyBpdGVtIGZhbGxzIGludG8gTFswXSAqLworCQkJCQlpbnQgbmV3X2l0ZW1fbGVuOworCQkJCQlpbnQgdmVyc2lvbjsKIAotCQkgICAgLyogQ2FsY3VsYXRlIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCB0byBTWzBdICovCi0JCSAgICBuZXdfaXRlbV9sZW4gPSBpaF9pdGVtX2xlbihpaCkgLSB0Yi0+bGJ5dGVzOwotCQkgICAgLyogQ2FsY3VsYXRlIGFuZCBjaGVjayBpdGVtIGxlbmd0aCB0byBpbnNlcnQgdG8gTFswXSAqLwotCQkgICAgcHV0X2loX2l0ZW1fbGVuKGloLCBpaF9pdGVtX2xlbihpaCkgLSBuZXdfaXRlbV9sZW4gKTsKKwkJCQkJcmV0X3ZhbCA9CisJCQkJCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdIC0gMSwKKwkJCQkJCQkgICAgLTEpOwogCi0JCSAgICBSRkFMU0UoIGloX2l0ZW1fbGVuKGloKSA8PSAwLAotCQkJICAgICJQQVAtMTIwODA6IHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5zZXJ0IGludG8gTFswXTogaWhfaXRlbV9sZW49JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGloX2l0ZW1fbGVuKGloKSk7CisJCQkJCS8qIENhbGN1bGF0ZSBpdGVtIGxlbmd0aCB0byBpbnNlcnQgdG8gU1swXSAqLworCQkJCQluZXdfaXRlbV9sZW4gPQorCQkJCQkgICAgaWhfaXRlbV9sZW4oaWgpIC0gdGItPmxieXRlczsKKwkJCQkJLyogQ2FsY3VsYXRlIGFuZCBjaGVjayBpdGVtIGxlbmd0aCB0byBpbnNlcnQgdG8gTFswXSAqLworCQkJCQlwdXRfaWhfaXRlbV9sZW4oaWgsCisJCQkJCQkJaWhfaXRlbV9sZW4oaWgpIC0KKwkJCQkJCQluZXdfaXRlbV9sZW4pOwogCi0JCSAgICAvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBMWzBdICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSB0Yi0+TFswXTsKLQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIGloLCBib2R5LAotCQkJCQkgIHplcm9zX251bSA+IGloX2l0ZW1fbGVuKGloKSA/IGloX2l0ZW1fbGVuKGloKSA6IHplcm9zX251bSk7CisJCQkJCVJGQUxTRShpaF9pdGVtX2xlbihpaCkgPD0gMCwKKwkJCQkJICAgICAgICJQQVAtMTIwODA6IHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5zZXJ0IGludG8gTFswXTogaWhfaXRlbV9sZW49JWQiLAorCQkJCQkgICAgICAgaWhfaXRlbV9sZW4oaWgpKTsKIAotCQkgICAgdmVyc2lvbiA9IGloX3ZlcnNpb24gKGloKTsKKwkJCQkJLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gTFswXSAqLworCQkJCQliaS50YiA9IHRiOworCQkJCQliaS5iaV9iaCA9IHRiLT5MWzBdOworCQkJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJICAgIGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJCQkJbGVhZl9pbnNlcnRfaW50b19idWYoJmJpLAorCQkJCQkJCSAgICAgbiArIGl0ZW1fcG9zIC0KKwkJCQkJCQkgICAgIHJldF92YWwsIGloLCBib2R5LAorCQkJCQkJCSAgICAgemVyb3NfbnVtID4KKwkJCQkJCQkgICAgIGloX2l0ZW1fbGVuKGloKSA/CisJCQkJCQkJICAgICBpaF9pdGVtX2xlbihpaCkgOgorCQkJCQkJCSAgICAgemVyb3NfbnVtKTsKIAotCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQsIGl0ZW0gbGVuZ3RoIGFuZCBib2R5IHRvIGluc2VydCBpbnRvIFNbMF0gKi8KLSAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwgbGVfaWhfa19vZmZzZXQoIGloICkgKyAodGItPmxieXRlcyA8PCAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpP3RiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtIFVORk1fUF9TSElGVDowKSkgKTsKKwkJCQkJdmVyc2lvbiA9IGloX3ZlcnNpb24oaWgpOwogCi0JCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBuZXdfaXRlbV9sZW4gKTsKLQkJICAgIGlmICggdGItPmxieXRlcyA+ICB6ZXJvc19udW0gKSB7Ci0JCQlib2R5ICs9ICh0Yi0+bGJ5dGVzIC0gemVyb3NfbnVtKTsKLQkJCXplcm9zX251bSA9IDA7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCQl6ZXJvc19udW0gLT0gdGItPmxieXRlczsKKwkJCQkJLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQsIGl0ZW0gbGVuZ3RoIGFuZCBib2R5IHRvIGluc2VydCBpbnRvIFNbMF0gKi8KKwkJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGloLAorCQkJCQkJCSAgIGxlX2loX2tfb2Zmc2V0KGloKSArCisJCQkJCQkJICAgKHRiLT4KKwkJCQkJCQkgICAgbGJ5dGVzIDw8CisJCQkJCQkJICAgIChpc19pbmRpcmVjdF9sZV9paAorCQkJCQkJCSAgICAgKGloKSA/IHRiLT50Yl9zYi0+CisJCQkJCQkJICAgICBzX2Jsb2Nrc2l6ZV9iaXRzIC0KKwkJCQkJCQkgICAgIFVORk1fUF9TSElGVCA6CisJCQkJCQkJICAgICAwKSkpOwogCi0JCSAgICBSRkFMU0UoIGloX2l0ZW1fbGVuKGloKSA8PSAwLAotCQkJIlBBUC0xMjA4NTogdGhlcmUgaXMgbm90aGluZyB0byBpbnNlcnQgaW50byBTWzBdOiBpaF9pdGVtX2xlbj0lZCIsCi0JCQlpaF9pdGVtX2xlbihpaCkpOwotCQl9IGVsc2UgewotCQkgICAgLyogbmV3IGl0ZW0gaW4gd2hvbGUgZmFsbHMgaW50byBMWzBdICovCi0JCSAgICAvKiBTaGlmdCBsbnVtWzBdLTEgaXRlbXMgdG8gTFswXSAqLwotCQkgICAgcmV0X3ZhbCA9IGxlYWZfc2hpZnRfbGVmdCh0YiwgdGItPmxudW1bMF0tMSwgdGItPmxieXRlcyk7Ci0JCSAgICAvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBMWzBdICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSB0Yi0+TFswXTsKLQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIGloLCBib2R5LCB6ZXJvc19udW0pOwotCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJICAgIHplcm9zX251bSA9IDA7Ci0JCX0KLQkJYnJlYWs7CisJCQkJCXB1dF9paF9pdGVtX2xlbihpaCwgbmV3X2l0ZW1fbGVuKTsKKwkJCQkJaWYgKHRiLT5sYnl0ZXMgPiB6ZXJvc19udW0pIHsKKwkJCQkJCWJvZHkgKz0KKwkJCQkJCSAgICAodGItPmxieXRlcyAtIHplcm9zX251bSk7CisJCQkJCQl6ZXJvc19udW0gPSAwOworCQkJCQl9IGVsc2UKKwkJCQkJCXplcm9zX251bSAtPSB0Yi0+bGJ5dGVzOwogCi0JICAgIGNhc2UgTV9QQVNURTogICAvKiBhcHBlbmQgaXRlbSBpbiBMWzBdICovCi0KLQkJaWYgKCBpdGVtX3BvcyA9PSB0Yi0+bG51bVswXSAtIDEgJiYgdGItPmxieXRlcyAhPSAtMSApIHsKLQkJICAgIC8qIHdlIG11c3Qgc2hpZnQgdGhlIHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KLQkJICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3BvcykpKSB7Ci0KLQkJCVJGQUxTRSggemVyb3NfbnVtLAotCQkJCSJQQVAtMTIwOTA6IGludmFsaWQgcGFyYW1ldGVyIGluIGNhc2Ugb2YgYSBkaXJlY3RvcnkiKTsKLQkJCS8qIGRpcmVjdG9yeSBpdGVtICovCi0JCQlpZiAoIHRiLT5sYnl0ZXMgPiBwb3NfaW5faXRlbSApIHsKLQkJCSAgICAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGZhbGxzIGludG8gTFswXSAqLwotCQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7Ci0JCQkgICAgaW50IGxfcG9zX2luX2l0ZW0gPSBwb3NfaW5faXRlbTsKLQkJCQkJCQkgIAotCQkJICAgIC8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGVudHJpZXMgZnJvbSBnaXZlbiBkaXJlY3RvcnkgaXRlbSAqLwotCQkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdLCB0Yi0+bGJ5dGVzIC0gMSk7Ci0JCQkgICAgaWYgKCByZXRfdmFsICYmICEgaXRlbV9wb3MgKSB7Ci0JCQkJcGFzdGVkID0gIEJfTl9QSVRFTV9IRUFEKHRiLT5MWzBdLEJfTlJfSVRFTVModGItPkxbMF0pLTEpOwotCQkJCWxfcG9zX2luX2l0ZW0gKz0gSV9FTlRSWV9DT1VOVChwYXN0ZWQpIC0gKHRiLT5sYnl0ZXMtMSk7Ci0JCQkgICAgfQotCi0JCQkgICAgLyogQXBwZW5kIGdpdmVuIGRpcmVjdG9yeSBlbnRyeSB0byBkaXJlY3RvcnkgaXRlbSAqLwotCQkJICAgIGJpLnRiID0gdGI7Ci0JCQkgICAgYmkuYmlfYmggPSB0Yi0+TFswXTsKLQkJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07Ci0JCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIGxfcG9zX2luX2l0ZW0sCi0JCQkJCQkgIHRiLT5pbnNlcnRfc2l6ZVswXSwgYm9keSwgemVyb3NfbnVtKTsKLQotCQkJICAgIC8qIHByZXZpb3VzIHN0cmluZyBwcmVwYXJlZCBzcGFjZSBmb3IgcGFzdGluZyBuZXcgZW50cnksIGZvbGxvd2luZyBzdHJpbmcgcGFzdGVzIHRoaXMgZW50cnkgKi8KLQotCQkJICAgIC8qIHdoZW4gd2UgaGF2ZSBtZXJnZSBkaXJlY3RvcnkgaXRlbSwgcG9zX2luX2l0ZW0gaGFzIGJlZW4gY2hhbmdlZCB0b28gKi8KLQotCQkJICAgIC8qIHBhc3RlIG5ldyBkaXJlY3RvcnkgZW50cnkuIDEgaXMgZW50cnkgbnVtYmVyICovCi0JCQkgICAgbGVhZl9wYXN0ZV9lbnRyaWVzIChiaS5iaV9iaCwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgbF9wb3NfaW5faXRlbSwgMSwKLQkJCQkJCShzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIAotCQkJCQkJYm9keSArIERFSF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0KLQkJCQkpOwotCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJICAgIC8qIG5ldyBkaXJlY3RvcnkgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBMWzBdICovCi0JCQkgICAgLyogU2hpZnQgbG51bVswXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgbG51bVswXSAqLwotCQkJICAgIGxlYWZfc2hpZnRfbGVmdCAodGIsIHRiLT5sbnVtWzBdLCB0Yi0+bGJ5dGVzKTsKLQkJCX0KLQkJCS8qIENhbGN1bGF0ZSBuZXcgcG9zaXRpb24gdG8gYXBwZW5kIGluIGl0ZW0gYm9keSAqLwotCQkJcG9zX2luX2l0ZW0gLT0gdGItPmxieXRlczsKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkJLyogcmVndWxhciBvYmplY3QgKi8KLQkJCVJGQUxTRSggdGItPmxieXRlcyA8PSAwLAotCQkJICAgICAgICAiUEFQLTEyMDk1OiB0aGVyZSBpcyBub3RoaW5nIHRvIHNoaWZ0IHRvIExbMF0uIGxieXRlcz0lZCIsCi0JCQkJdGItPmxieXRlcyk7Ci0JCQlSRkFMU0UoIHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVAtMTIxMDA6IGluY29ycmVjdCBwb3NpdGlvbiB0byBwYXN0ZTogaXRlbV9sZW49JWQsIHBvc19pbl9pdGVtPSVkIiwKLQkJCQlpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSksIHBvc19pbl9pdGVtKTsKLQotCQkJaWYgKCB0Yi0+bGJ5dGVzID49IHBvc19pbl9pdGVtICkgewotCQkJICAgIC8qIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdIGluIHdob2xlICovCi0JCQkgICAgaW50IGxfbjsKLQotCQkJICAgIC8qIHRoaXMgYnl0ZXMgbnVtYmVyIG11c3QgYmUgYXBwZW5kZWQgdG8gdGhlIGxhc3QgaXRlbSBvZiBMW2hdICovCi0JCQkgICAgbF9uID0gdGItPmxieXRlcyAtIHBvc19pbl9pdGVtOwotCi0JCQkgICAgLyogQ2FsY3VsYXRlIG5ldyBpbnNlcnRfc2l6ZVswXSAqLwotCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSAtPSBsX247Ci0KLQkJCSAgICBSRkFMU0UoIHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwLAotCQkJCSAgICAiUEFQLTEyMTA1OiB0aGVyZSBpcyBub3RoaW5nIHRvIHBhc3RlIGludG8gTFswXS4gaW5zZXJ0X3NpemU9JWQiLAotCQkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0pOwotCQkJICAgIHJldF92YWwgPSAgbGVhZl9zaGlmdF9sZWZ0KHRiLHRiLT5sbnVtWzBdLCAKLQkJCQkJCSAgICAgICBpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSkpOwotCQkJICAgIC8qIEFwcGVuZCB0byBib2R5IG9mIGl0ZW0gaW4gTFswXSAqLwotCQkJICAgIGJpLnRiID0gdGI7Ci0JCQkgICAgYmkuYmlfYmggPSB0Yi0+TFswXTsKLQkJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07Ci0JCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyKAotCQkJCSZiaSxuICsgaXRlbV9wb3MgLSByZXRfdmFsLAotCQkJCWloX2l0ZW1fbGVuKCBCX05fUElURU1fSEVBRCh0Yi0+TFswXSxuK2l0ZW1fcG9zLXJldF92YWwpKSwKLQkJCQlsX24sYm9keSwgemVyb3NfbnVtID4gbF9uID8gbF9uIDogemVyb3NfbnVtCi0JCQkJKTsKLQkJCSAgICAvKiAwLXRoIGl0ZW0gaW4gUzAgY2FuIGJlIG9ubHkgb2YgRElSRUNUIHR5cGUgd2hlbiBsX24gIT0gMCovCi0JCQkgICAgewotCQkJCWludCB2ZXJzaW9uOwotCQkJCWludCB0ZW1wX2wgPSBsX247Ci0JCQkJCi0JCQkJUkZBTFNFIChpaF9pdGVtX2xlbiAoQl9OX1BJVEVNX0hFQUQgKHRiUzAsIDApKSwKLQkJCQkJIlBBUC0xMjEwNjogaXRlbSBsZW5ndGggbXVzdCBiZSAwIik7Ci0JCQkJUkZBTFNFIChjb21wX3Nob3J0X2xlX2tleXMgKEJfTl9QS0VZICh0YlMwLCAwKSwKLQkJCQkJCQkgICAgQl9OX1BLRVkgKHRiLT5MWzBdLAotCQkJCQkJCQkJICAgIG4gKyBpdGVtX3BvcyAtIHJldF92YWwpKSwKLQkJCQkJIlBBUC0xMjEwNzogaXRlbXMgbXVzdCBiZSBvZiB0aGUgc2FtZSBmaWxlIik7Ci0JCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKEJfTl9QSVRFTV9IRUFEICh0Yi0+TFswXSwKLQkJCQkJCQkJICAgICAgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCkpKQl7Ci0JCQkJICAgIHRlbXBfbCA9IGxfbiA8PCAodGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUKTsKKwkJCQkJUkZBTFNFKGloX2l0ZW1fbGVuKGloKSA8PSAwLAorCQkJCQkgICAgICAgIlBBUC0xMjA4NTogdGhlcmUgaXMgbm90aGluZyB0byBpbnNlcnQgaW50byBTWzBdOiBpaF9pdGVtX2xlbj0lZCIsCisJCQkJCSAgICAgICBpaF9pdGVtX2xlbihpaCkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIG5ldyBpdGVtIGluIHdob2xlIGZhbGxzIGludG8gTFswXSAqLworCQkJCQkvKiBTaGlmdCBsbnVtWzBdLTEgaXRlbXMgdG8gTFswXSAqLworCQkJCQlyZXRfdmFsID0KKwkJCQkJICAgIGxlYWZfc2hpZnRfbGVmdCh0YiwgdGItPmxudW1bMF0gLSAxLAorCQkJCQkJCSAgICB0Yi0+bGJ5dGVzKTsKKwkJCQkJLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gTFswXSAqLworCQkJCQliaS50YiA9IHRiOworCQkJCQliaS5iaV9iaCA9IHRiLT5MWzBdOworCQkJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJICAgIGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJCQkJbGVhZl9pbnNlcnRfaW50b19idWYoJmJpLAorCQkJCQkJCSAgICAgbiArIGl0ZW1fcG9zIC0KKwkJCQkJCQkgICAgIHJldF92YWwsIGloLCBib2R5LAorCQkJCQkJCSAgICAgemVyb3NfbnVtKTsKKwkJCQkJdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQkJemVyb3NfbnVtID0gMDsKIAkJCQl9Ci0JCQkJLyogdXBkYXRlIGtleSBvZiBmaXJzdCBpdGVtIGluIFMwICovCi0JCQkJdmVyc2lvbiA9IGloX3ZlcnNpb24gKEJfTl9QSVRFTV9IRUFEICh0YlMwLCAwKSk7Ci0JCQkJc2V0X2xlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BLRVkgKHRiUzAsIDApLCAKLQkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUEtFWSAodGJTMCwgMCkpICsgdGVtcF9sKTsKLQkJCQkvKiB1cGRhdGUgbGVmdCBkZWxpbWl0aW5nIGtleSAqLwotCQkJCXNldF9sZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbMF0sdGItPmxrZXlbMF0pLAotCQkJCQkJICAgICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbMF0sdGItPmxrZXlbMF0pKSArIHRlbXBfbCk7Ci0JCQkgICAgfQorCQkJCWJyZWFrOwogCi0JCQkgICAgLyogQ2FsY3VsYXRlIG5ldyBib2R5LCBwb3NpdGlvbiBpbiBpdGVtIGFuZCBpbnNlcnRfc2l6ZVswXSAqLwotCQkJICAgIGlmICggbF9uID4gemVyb3NfbnVtICkgewotCQkJCWJvZHkgKz0gKGxfbiAtIHplcm9zX251bSk7Ci0JCQkJemVyb3NfbnVtID0gMDsKLQkJCSAgICB9Ci0JCQkgICAgZWxzZQotCQkJCXplcm9zX251bSAtPSBsX247Ci0JCQkgICAgcG9zX2luX2l0ZW0gPSAwOwkKKwkJCWNhc2UgTV9QQVNURToJLyogYXBwZW5kIGl0ZW0gaW4gTFswXSAqLwogCi0JCQkgICAgUkZBTFNFKCBjb21wX3Nob3J0X2xlX2tleXMgCi0JCQkJICAgIChCX05fUEtFWSh0YlMwLDApLAotCQkJCSAgICAgQl9OX1BLRVkodGItPkxbMF0sQl9OUl9JVEVNUyh0Yi0+TFswXSktMSkpIHx8Ci0JCQkJCi0JCQkJICAgICFvcF9pc19sZWZ0X21lcmdlYWJsZSAKLQkJCQkgICAgKEJfTl9QS0VZICh0YlMwLCAwKSwgdGJTMC0+Yl9zaXplKSB8fAotCQkJCSAgICAhb3BfaXNfbGVmdF9tZXJnZWFibGUKLQkJCQkgICAgKEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbMF0sdGItPmxrZXlbMF0pLCAKLQkJCQkgICAgIHRiUzAtPmJfc2l6ZSksCi0JCQkJICAgICJQQVAtMTIxMjA6IGl0ZW0gbXVzdCBiZSBtZXJnZS1hYmxlIHdpdGggbGVmdCBuZWlnaGJvcmluZyBpdGVtIik7CisJCQkJaWYgKGl0ZW1fcG9zID09IHRiLT5sbnVtWzBdIC0gMQorCQkJCSAgICAmJiB0Yi0+bGJ5dGVzICE9IC0xKSB7CisJCQkJCS8qIHdlIG11c3Qgc2hpZnQgdGhlIHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KKwkJCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loCisJCQkJCSAgICAoQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpKSkgeworCisJCQkJCQlSRkFMU0UoemVyb3NfbnVtLAorCQkJCQkJICAgICAgICJQQVAtMTIwOTA6IGludmFsaWQgcGFyYW1ldGVyIGluIGNhc2Ugb2YgYSBkaXJlY3RvcnkiKTsKKwkJCQkJCS8qIGRpcmVjdG9yeSBpdGVtICovCisJCQkJCQlpZiAodGItPmxieXRlcyA+IHBvc19pbl9pdGVtKSB7CisJCQkJCQkJLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBmYWxscyBpbnRvIExbMF0gKi8KKwkJCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkCisJCQkJCQkJICAgICpwYXN0ZWQ7CisJCQkJCQkJaW50IGxfcG9zX2luX2l0ZW0gPQorCQkJCQkJCSAgICBwb3NfaW5faXRlbTsKKworCQkJCQkJCS8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGVudHJpZXMgZnJvbSBnaXZlbiBkaXJlY3RvcnkgaXRlbSAqLworCQkJCQkJCXJldF92YWwgPQorCQkJCQkJCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIGxudW0KKwkJCQkJCQkJCSAgICBbMF0sCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIGxieXRlcworCQkJCQkJCQkJICAgIC0KKwkJCQkJCQkJCSAgICAxKTsKKwkJCQkJCQlpZiAocmV0X3ZhbAorCQkJCQkJCSAgICAmJiAhaXRlbV9wb3MpIHsKKwkJCQkJCQkJcGFzdGVkID0KKwkJCQkJCQkJICAgIEJfTl9QSVRFTV9IRUFECisJCQkJCQkJCSAgICAodGItPkxbMF0sCisJCQkJCQkJCSAgICAgQl9OUl9JVEVNUworCQkJCQkJCQkgICAgICh0Yi0+CisJCQkJCQkJCSAgICAgIExbMF0pIC0KKwkJCQkJCQkJICAgICAxKTsKKwkJCQkJCQkJbF9wb3NfaW5faXRlbSArPQorCQkJCQkJCQkgICAgSV9FTlRSWV9DT1VOVAorCQkJCQkJCQkgICAgKHBhc3RlZCkgLQorCQkJCQkJCQkgICAgKHRiLT4KKwkJCQkJCQkJICAgICBsYnl0ZXMgLQorCQkJCQkJCQkgICAgIDEpOworCQkJCQkJCX0KKworCQkJCQkJCS8qIEFwcGVuZCBnaXZlbiBkaXJlY3RvcnkgZW50cnkgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCQkJCQliaS50YiA9IHRiOworCQkJCQkJCWJpLmJpX2JoID0gdGItPkxbMF07CisJCQkJCQkJYmkuYmlfcGFyZW50ID0KKwkJCQkJCQkgICAgdGItPkZMWzBdOworCQkJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJCQkgICAgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24KKwkJCQkJCQkgICAgKHRiLCAwKTsKKwkJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcgorCQkJCQkJCSAgICAoJmJpLAorCQkJCQkJCSAgICAgbiArIGl0ZW1fcG9zIC0KKwkJCQkJCQkgICAgIHJldF92YWwsCisJCQkJCQkJICAgICBsX3Bvc19pbl9pdGVtLAorCQkJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdLAorCQkJCQkJCSAgICAgYm9keSwgemVyb3NfbnVtKTsKKworCQkJCQkJCS8qIHByZXZpb3VzIHN0cmluZyBwcmVwYXJlZCBzcGFjZSBmb3IgcGFzdGluZyBuZXcgZW50cnksIGZvbGxvd2luZyBzdHJpbmcgcGFzdGVzIHRoaXMgZW50cnkgKi8KKworCQkJCQkJCS8qIHdoZW4gd2UgaGF2ZSBtZXJnZSBkaXJlY3RvcnkgaXRlbSwgcG9zX2luX2l0ZW0gaGFzIGJlZW4gY2hhbmdlZCB0b28gKi8KKworCQkJCQkJCS8qIHBhc3RlIG5ldyBkaXJlY3RvcnkgZW50cnkuIDEgaXMgZW50cnkgbnVtYmVyICovCisJCQkJCQkJbGVhZl9wYXN0ZV9lbnRyaWVzKGJpLgorCQkJCQkJCQkJICAgYmlfYmgsCisJCQkJCQkJCQkgICBuICsKKwkJCQkJCQkJCSAgIGl0ZW1fcG9zCisJCQkJCQkJCQkgICAtCisJCQkJCQkJCQkgICByZXRfdmFsLAorCQkJCQkJCQkJICAgbF9wb3NfaW5faXRlbSwKKwkJCQkJCQkJCSAgIDEsCisJCQkJCQkJCQkgICAoc3RydWN0CisJCQkJCQkJCQkgICAgcmVpc2VyZnNfZGVfaGVhZAorCQkJCQkJCQkJICAgICopCisJCQkJCQkJCQkgICBib2R5LAorCQkJCQkJCQkJICAgYm9keQorCQkJCQkJCQkJICAgKworCQkJCQkJCQkJICAgREVIX1NJWkUsCisJCQkJCQkJCQkgICB0Yi0+CisJCQkJCQkJCQkgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkJICAgWzBdCisJCQkJCQkJICAgICk7CisJCQkJCQkJdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLyogbmV3IGRpcmVjdG9yeSBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIExbMF0gKi8KKwkJCQkJCQkvKiBTaGlmdCBsbnVtWzBdLTEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IGxieXRlcyBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRpcmVjdG9yeSBpdGVtIG51bWJlciBsbnVtWzBdICovCisJCQkJCQkJbGVhZl9zaGlmdF9sZWZ0KHRiLAorCQkJCQkJCQkJdGItPgorCQkJCQkJCQkJbG51bVswXSwKKwkJCQkJCQkJCXRiLT4KKwkJCQkJCQkJCWxieXRlcyk7CisJCQkJCQl9CisJCQkJCQkvKiBDYWxjdWxhdGUgbmV3IHBvc2l0aW9uIHRvIGFwcGVuZCBpbiBpdGVtIGJvZHkgKi8KKwkJCQkJCXBvc19pbl9pdGVtIC09IHRiLT5sYnl0ZXM7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiByZWd1bGFyIG9iamVjdCAqLworCQkJCQkJUkZBTFNFKHRiLT5sYnl0ZXMgPD0gMCwKKwkJCQkJCSAgICAgICAiUEFQLTEyMDk1OiB0aGVyZSBpcyBub3RoaW5nIHRvIHNoaWZ0IHRvIExbMF0uIGxieXRlcz0lZCIsCisJCQkJCQkgICAgICAgdGItPmxieXRlcyk7CisJCQkJCQlSRkFMU0UocG9zX2luX2l0ZW0gIT0KKwkJCQkJCSAgICAgICBpaF9pdGVtX2xlbgorCQkJCQkJICAgICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCSh0YlMwLCBpdGVtX3BvcykpLAorCQkJCQkJICAgICAgICJQQVAtMTIxMDA6IGluY29ycmVjdCBwb3NpdGlvbiB0byBwYXN0ZTogaXRlbV9sZW49JWQsIHBvc19pbl9pdGVtPSVkIiwKKwkJCQkJCSAgICAgICBpaF9pdGVtX2xlbgorCQkJCQkJICAgICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCSh0YlMwLCBpdGVtX3BvcykpLAorCQkJCQkJICAgICAgIHBvc19pbl9pdGVtKTsKKworCQkJCQkJaWYgKHRiLT5sYnl0ZXMgPj0gcG9zX2luX2l0ZW0pIHsKKwkJCQkJCQkvKiBhcHBlbmRlZCBpdGVtIHdpbGwgYmUgaW4gTFswXSBpbiB3aG9sZSAqLworCQkJCQkJCWludCBsX247CisKKwkJCQkJCQkvKiB0aGlzIGJ5dGVzIG51bWJlciBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZSBsYXN0IGl0ZW0gb2YgTFtoXSAqLworCQkJCQkJCWxfbiA9CisJCQkJCQkJICAgIHRiLT5sYnl0ZXMgLQorCQkJCQkJCSAgICBwb3NfaW5faXRlbTsKKworCQkJCQkJCS8qIENhbGN1bGF0ZSBuZXcgaW5zZXJ0X3NpemVbMF0gKi8KKwkJCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gLT0KKwkJCQkJCQkgICAgbF9uOworCisJCQkJCQkJUkZBTFNFKHRiLT4KKwkJCQkJCQkgICAgICAgaW5zZXJ0X3NpemVbMF0gPD0KKwkJCQkJCQkgICAgICAgMCwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjEwNTogdGhlcmUgaXMgbm90aGluZyB0byBwYXN0ZSBpbnRvIExbMF0uIGluc2VydF9zaXplPSVkIiwKKwkJCQkJCQkgICAgICAgdGItPgorCQkJCQkJCSAgICAgICBpbnNlcnRfc2l6ZVswXSk7CisJCQkJCQkJcmV0X3ZhbCA9CisJCQkJCQkJICAgIGxlYWZfc2hpZnRfbGVmdCh0YiwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgbG51bQorCQkJCQkJCQkJICAgIFswXSwKKwkJCQkJCQkJCSAgICBpaF9pdGVtX2xlbgorCQkJCQkJCQkJICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCQkJICAgICAodGJTMCwKKwkJCQkJCQkJCSAgICAgIGl0ZW1fcG9zKSkpOworCQkJCQkJCS8qIEFwcGVuZCB0byBib2R5IG9mIGl0ZW0gaW4gTFswXSAqLworCQkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQkJYmkuYmlfYmggPSB0Yi0+TFswXTsKKwkJCQkJCQliaS5iaV9wYXJlbnQgPQorCQkJCQkJCSAgICB0Yi0+RkxbMF07CisJCQkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkJCSAgICBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbgorCQkJCQkJCSAgICAodGIsIDApOworCQkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyCisJCQkJCQkJICAgICgmYmksCisJCQkJCQkJICAgICBuICsgaXRlbV9wb3MgLQorCQkJCQkJCSAgICAgcmV0X3ZhbCwKKwkJCQkJCQkgICAgIGloX2l0ZW1fbGVuCisJCQkJCQkJICAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkgICAgICAodGItPkxbMF0sCisJCQkJCQkJICAgICAgIG4gKyBpdGVtX3BvcyAtCisJCQkJCQkJICAgICAgIHJldF92YWwpKSwgbF9uLAorCQkJCQkJCSAgICAgYm9keSwKKwkJCQkJCQkgICAgIHplcm9zX251bSA+CisJCQkJCQkJICAgICBsX24gPyBsX24gOgorCQkJCQkJCSAgICAgemVyb3NfbnVtKTsKKwkJCQkJCQkvKiAwLXRoIGl0ZW0gaW4gUzAgY2FuIGJlIG9ubHkgb2YgRElSRUNUIHR5cGUgd2hlbiBsX24gIT0gMCAqLworCQkJCQkJCXsKKwkJCQkJCQkJaW50IHZlcnNpb247CisJCQkJCQkJCWludCB0ZW1wX2wgPQorCQkJCQkJCQkgICAgbF9uOworCisJCQkJCQkJCVJGQUxTRQorCQkJCQkJCQkgICAgKGloX2l0ZW1fbGVuCisJCQkJCQkJCSAgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJCSAgICAgICh0YlMwLAorCQkJCQkJCQkgICAgICAgMCkpLAorCQkJCQkJCQkgICAgICJQQVAtMTIxMDY6IGl0ZW0gbGVuZ3RoIG11c3QgYmUgMCIpOworCQkJCQkJCQlSRkFMU0UKKwkJCQkJCQkJICAgIChjb21wX3Nob3J0X2xlX2tleXMKKwkJCQkJCQkJICAgICAoQl9OX1BLRVkKKwkJCQkJCQkJICAgICAgKHRiUzAsIDApLAorCQkJCQkJCQkgICAgICBCX05fUEtFWQorCQkJCQkJCQkgICAgICAodGItPkxbMF0sCisJCQkJCQkJCSAgICAgICBuICsKKwkJCQkJCQkJICAgICAgIGl0ZW1fcG9zCisJCQkJCQkJCSAgICAgICAtCisJCQkJCQkJCSAgICAgICByZXRfdmFsKSksCisJCQkJCQkJCSAgICAgIlBBUC0xMjEwNzogaXRlbXMgbXVzdCBiZSBvZiB0aGUgc2FtZSBmaWxlIik7CisJCQkJCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paChCX05fUElURU1fSEVBRCh0Yi0+TFswXSwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCkpKSB7CisJCQkJCQkJCQl0ZW1wX2wgPQorCQkJCQkJCQkJICAgIGxfbgorCQkJCQkJCQkJICAgIDw8CisJCQkJCQkJCQkgICAgKHRiLT4KKwkJCQkJCQkJCSAgICAgdGJfc2ItPgorCQkJCQkJCQkJICAgICBzX2Jsb2Nrc2l6ZV9iaXRzCisJCQkJCQkJCQkgICAgIC0KKwkJCQkJCQkJCSAgICAgVU5GTV9QX1NISUZUKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkvKiB1cGRhdGUga2V5IG9mIGZpcnN0IGl0ZW0gaW4gUzAgKi8KKwkJCQkJCQkJdmVyc2lvbiA9CisJCQkJCQkJCSAgICBpaF92ZXJzaW9uCisJCQkJCQkJCSAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkJICAgICAodGJTMCwgMCkpOworCQkJCQkJCQlzZXRfbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkJCSAgICAodmVyc2lvbiwKKwkJCQkJCQkJICAgICBCX05fUEtFWQorCQkJCQkJCQkgICAgICh0YlMwLCAwKSwKKwkJCQkJCQkJICAgICBsZV9rZXlfa19vZmZzZXQKKwkJCQkJCQkJICAgICAodmVyc2lvbiwKKwkJCQkJCQkJICAgICAgQl9OX1BLRVkKKwkJCQkJCQkJICAgICAgKHRiUzAsCisJCQkJCQkJCSAgICAgICAwKSkgKworCQkJCQkJCQkgICAgIHRlbXBfbCk7CisJCQkJCQkJCS8qIHVwZGF0ZSBsZWZ0IGRlbGltaXRpbmcga2V5ICovCisJCQkJCQkJCXNldF9sZV9rZXlfa19vZmZzZXQKKwkJCQkJCQkJICAgICh2ZXJzaW9uLAorCQkJCQkJCQkgICAgIEJfTl9QREVMSU1fS0VZCisJCQkJCQkJCSAgICAgKHRiLT4KKwkJCQkJCQkJICAgICAgQ0ZMWzBdLAorCQkJCQkJCQkgICAgICB0Yi0+CisJCQkJCQkJCSAgICAgIGxrZXlbMF0pLAorCQkJCQkJCQkgICAgIGxlX2tleV9rX29mZnNldAorCQkJCQkJCQkgICAgICh2ZXJzaW9uLAorCQkJCQkJCQkgICAgICBCX05fUERFTElNX0tFWQorCQkJCQkJCQkgICAgICAodGItPgorCQkJCQkJCQkgICAgICAgQ0ZMWzBdLAorCQkJCQkJCQkgICAgICAgdGItPgorCQkJCQkJCQkgICAgICAgbGtleVswXSkpCisJCQkJCQkJCSAgICAgKyB0ZW1wX2wpOworCQkJCQkJCX0KKworCQkJCQkJCS8qIENhbGN1bGF0ZSBuZXcgYm9keSwgcG9zaXRpb24gaW4gaXRlbSBhbmQgaW5zZXJ0X3NpemVbMF0gKi8KKwkJCQkJCQlpZiAobF9uID4gemVyb3NfbnVtKSB7CisJCQkJCQkJCWJvZHkgKz0KKwkJCQkJCQkJICAgIChsX24gLQorCQkJCQkJCQkgICAgIHplcm9zX251bSk7CisJCQkJCQkJCXplcm9zX251bSA9IDA7CisJCQkJCQkJfSBlbHNlCisJCQkJCQkJCXplcm9zX251bSAtPQorCQkJCQkJCQkgICAgbF9uOworCQkJCQkJCXBvc19pbl9pdGVtID0gMDsKKworCQkJCQkJCVJGQUxTRQorCQkJCQkJCSAgICAoY29tcF9zaG9ydF9sZV9rZXlzCisJCQkJCQkJICAgICAoQl9OX1BLRVkodGJTMCwgMCksCisJCQkJCQkJICAgICAgQl9OX1BLRVkodGItPkxbMF0sCisJCQkJCQkJCSAgICAgICBCX05SX0lURU1TCisJCQkJCQkJCSAgICAgICAodGItPgorCQkJCQkJCQkJTFswXSkgLQorCQkJCQkJCQkgICAgICAgMSkpCisJCQkJCQkJICAgICB8fAorCQkJCQkJCSAgICAgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlCisJCQkJCQkJICAgICAoQl9OX1BLRVkodGJTMCwgMCksCisJCQkJCQkJICAgICAgdGJTMC0+Yl9zaXplKQorCQkJCQkJCSAgICAgfHwKKwkJCQkJCQkgICAgICFvcF9pc19sZWZ0X21lcmdlYWJsZQorCQkJCQkJCSAgICAgKEJfTl9QREVMSU1fS0VZCisJCQkJCQkJICAgICAgKHRiLT5DRkxbMF0sCisJCQkJCQkJICAgICAgIHRiLT5sa2V5WzBdKSwKKwkJCQkJCQkgICAgICB0YlMwLT5iX3NpemUpLAorCQkJCQkJCSAgICAgIlBBUC0xMjEyMDogaXRlbSBtdXN0IGJlIG1lcmdlLWFibGUgd2l0aCBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0iKTsKKwkJCQkJCX0gZWxzZSB7CS8qIG9ubHkgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSB3aWxsIGJlIGluIExbMF0gKi8KKworCQkJCQkJCS8qIENhbGN1bGF0ZSBwb3NpdGlvbiBpbiBpdGVtIGZvciBhcHBlbmQgaW4gU1swXSAqLworCQkJCQkJCXBvc19pbl9pdGVtIC09CisJCQkJCQkJICAgIHRiLT5sYnl0ZXM7CisKKwkJCQkJCQlSRkFMU0UocG9zX2luX2l0ZW0gPD0gMCwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjEyNTogbm8gcGxhY2UgZm9yIHBhc3RlLiBwb3NfaW5faXRlbT0lZCIsCisJCQkJCQkJICAgICAgIHBvc19pbl9pdGVtKTsKKworCQkJCQkJCS8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGJ5dGUgZnJvbSBpdGVtIG51bWJlciBsbnVtWzBdICovCisJCQkJCQkJbGVhZl9zaGlmdF9sZWZ0KHRiLAorCQkJCQkJCQkJdGItPgorCQkJCQkJCQkJbG51bVswXSwKKwkJCQkJCQkJCXRiLT4KKwkJCQkJCQkJCWxieXRlcyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgewkvKiBhcHBlbmRlZCBpdGVtIHdpbGwgYmUgaW4gTFswXSBpbiB3aG9sZSAqLworCisJCQkJCXN0cnVjdCBpdGVtX2hlYWQgKnBhc3RlZDsKKworCQkJCQlpZiAoIWl0ZW1fcG9zICYmIG9wX2lzX2xlZnRfbWVyZ2VhYmxlKEJfTl9QS0VZKHRiUzAsIDApLCB0YlMwLT5iX3NpemUpKSB7CS8qIGlmIHdlIHBhc3RlIGludG8gZmlyc3QgaXRlbSBvZiBTWzBdIGFuZCBpdCBpcyBsZWZ0IG1lcmdhYmxlICovCisJCQkJCQkvKiB0aGVuIGluY3JlbWVudCBwb3NfaW5faXRlbSBieSB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBpdGVtIGluIExbMF0gKi8KKwkJCQkJCXBhc3RlZCA9CisJCQkJCQkgICAgQl9OX1BJVEVNX0hFQUQodGItPkxbMF0sCisJCQkJCQkJCSAgIG4gLSAxKTsKKwkJCQkJCWlmIChpc19kaXJlbnRyeV9sZV9paChwYXN0ZWQpKQorCQkJCQkJCXBvc19pbl9pdGVtICs9CisJCQkJCQkJICAgIGloX2VudHJ5X2NvdW50CisJCQkJCQkJICAgIChwYXN0ZWQpOworCQkJCQkJZWxzZQorCQkJCQkJCXBvc19pbl9pdGVtICs9CisJCQkJCQkJICAgIGloX2l0ZW1fbGVuKHBhc3RlZCk7CisJCQkJCX0KKworCQkJCQkvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBieXRlIGZyb20gaXRlbSBudW1iZXIgbG51bVswXSAqLworCQkJCQlyZXRfdmFsID0KKwkJCQkJICAgIGxlYWZfc2hpZnRfbGVmdCh0YiwgdGItPmxudW1bMF0sCisJCQkJCQkJICAgIHRiLT5sYnl0ZXMpOworCQkJCQkvKiBBcHBlbmQgdG8gYm9keSBvZiBpdGVtIGluIExbMF0gKi8KKwkJCQkJYmkudGIgPSB0YjsKKwkJCQkJYmkuYmlfYmggPSB0Yi0+TFswXTsKKwkJCQkJYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOworCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCSAgICBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCk7CisJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwKKwkJCQkJCQkgICAgIG4gKyBpdGVtX3BvcyAtCisJCQkJCQkJICAgICByZXRfdmFsLAorCQkJCQkJCSAgICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJCQkJICAgICBib2R5LCB6ZXJvc19udW0pOworCisJCQkJCS8qIGlmIGFwcGVuZGVkIGl0ZW0gaXMgZGlyZWN0b3J5LCBwYXN0ZSBlbnRyeSAqLworCQkJCQlwYXN0ZWQgPQorCQkJCQkgICAgQl9OX1BJVEVNX0hFQUQodGItPkxbMF0sCisJCQkJCQkJICAgbiArIGl0ZW1fcG9zIC0KKwkJCQkJCQkgICByZXRfdmFsKTsKKwkJCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loKHBhc3RlZCkpCisJCQkJCQlsZWFmX3Bhc3RlX2VudHJpZXMoYmkuYmlfYmgsCisJCQkJCQkJCSAgIG4gKworCQkJCQkJCQkgICBpdGVtX3BvcyAtCisJCQkJCQkJCSAgIHJldF92YWwsCisJCQkJCQkJCSAgIHBvc19pbl9pdGVtLAorCQkJCQkJCQkgICAxLAorCQkJCQkJCQkgICAoc3RydWN0CisJCQkJCQkJCSAgICByZWlzZXJmc19kZV9oZWFkCisJCQkJCQkJCSAgICAqKWJvZHksCisJCQkJCQkJCSAgIGJvZHkgKworCQkJCQkJCQkgICBERUhfU0laRSwKKwkJCQkJCQkJICAgdGItPgorCQkJCQkJCQkgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICBbMF0KKwkJCQkJCSAgICApOworCQkJCQkvKiBpZiBhcHBlbmRlZCBpdGVtIGlzIGluZGlyZWN0IGl0ZW0sIHB1dCB1bmZvcm1hdHRlZCBub2RlIGludG8gdW4gbGlzdCAqLworCQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgocGFzdGVkKSkKKwkJCQkJCXNldF9paF9mcmVlX3NwYWNlKHBhc3RlZCwgMCk7CisJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJCXplcm9zX251bSA9IDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoJLyogY2FzZXMgZCBhbmQgdCAqLworCQkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkJICAgICAgICJQQVAtMTIxMzA6IGJhbGFuY2VfbGVhZjogbG51bSA+IDA6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAorCQkJCQkgICAgICAgKGZsYWcgPT0KKwkJCQkJCU1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09CisJCQkJCQkJCQkgTV9DVVQpCisJCQkJCQkJCQk/ICJDVVQiCisJCQkJCQkJCQk6CisJCQkJCQkJCQkiVU5LTk9XTiIpLAorCQkJCQkgICAgICAgZmxhZyk7CiAJCQl9Ci0JCQllbHNlIC8qIG9ubHkgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSB3aWxsIGJlIGluIExbMF0gKi8KLQkJCXsKLQkJCSAgICAvKiBDYWxjdWxhdGUgcG9zaXRpb24gaW4gaXRlbSBmb3IgYXBwZW5kIGluIFNbMF0gKi8KLQkJCSAgICBwb3NfaW5faXRlbSAtPSB0Yi0+bGJ5dGVzOwotCi0JCQkgICAgUkZBTFNFKCBwb3NfaW5faXRlbSA8PSAwLAotCQkJCSAgICAiUEFQLTEyMTI1OiBubyBwbGFjZSBmb3IgcGFzdGUuIHBvc19pbl9pdGVtPSVkIiwgcG9zX2luX2l0ZW0pOwotCi0JCQkgICAgLyogU2hpZnQgbG51bVswXSAtIDEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IGxieXRlcyAtIDEgYnl0ZSBmcm9tIGl0ZW0gbnVtYmVyIGxudW1bMF0gKi8KLQkJCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsdGItPmxudW1bMF0sdGItPmxieXRlcyk7Ci0JCQl9Ci0JCSAgICB9CisJCX0gZWxzZSB7CisJCQkvKiBuZXcgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBMWzBdICovCisJCQlsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdLCB0Yi0+bGJ5dGVzKTsKIAkJfQotCQllbHNlIC8qIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdIGluIHdob2xlICovCi0JCXsKLQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7Ci0KLQkJCWlmICggISBpdGVtX3BvcyAgJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUgKEJfTl9QS0VZICh0YlMwLCAwKSwgdGJTMC0+Yl9zaXplKSApCi0JCQl7IC8qIGlmIHdlIHBhc3RlIGludG8gZmlyc3QgaXRlbSBvZiBTWzBdIGFuZCBpdCBpcyBsZWZ0IG1lcmdhYmxlICovCi0JCQkgICAgLyogdGhlbiBpbmNyZW1lbnQgcG9zX2luX2l0ZW0gYnkgdGhlIHNpemUgb2YgdGhlIGxhc3QgaXRlbSBpbiBMWzBdICovCi0JCQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQodGItPkxbMF0sbi0xKTsKLQkJCSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpICkKLQkJCQlwb3NfaW5faXRlbSArPSBpaF9lbnRyeV9jb3VudChwYXN0ZWQpOwotCQkJICAgIGVsc2UKLQkJCQlwb3NfaW5faXRlbSArPSBpaF9pdGVtX2xlbihwYXN0ZWQpOwotCQkJfQotCi0JCSAgICAvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBieXRlIGZyb20gaXRlbSBudW1iZXIgbG51bVswXSAqLwotCQkgICAgcmV0X3ZhbCA9IGxlYWZfc2hpZnRfbGVmdCh0Yix0Yi0+bG51bVswXSx0Yi0+bGJ5dGVzKTsKLQkJICAgIC8qIEFwcGVuZCB0byBib2R5IG9mIGl0ZW0gaW4gTFswXSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoJmJpLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBwb3NfaW5faXRlbSwgdGItPmluc2VydF9zaXplWzBdLAotCQkJCQkgIGJvZHksIHplcm9zX251bSk7Ci0KLQkJICAgIC8qIGlmIGFwcGVuZGVkIGl0ZW0gaXMgZGlyZWN0b3J5LCBwYXN0ZSBlbnRyeSAqLwotCQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQgKHRiLT5MWzBdLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsKTsKLQkJICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAocGFzdGVkKSkKLQkJCWxlYWZfcGFzdGVfZW50cmllcyAoCi0JCQkgICAgYmkuYmlfYmgsIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIHBvc19pbl9pdGVtLCAxLCAKLQkJCSAgICAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCBib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQotCQkJICAgICk7Ci0JCSAgICAvKiBpZiBhcHBlbmRlZCBpdGVtIGlzIGluZGlyZWN0IGl0ZW0sIHB1dCB1bmZvcm1hdHRlZCBub2RlIGludG8gdW4gbGlzdCAqLwotCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChwYXN0ZWQpKQotCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHBhc3RlZCwgMCk7Ci0JCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQkgICAgemVyb3NfbnVtID0gMDsKLQkJfQotCQlicmVhazsKLQkgICAgZGVmYXVsdDogICAgLyogY2FzZXMgZCBhbmQgdCAqLwotCQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMTMwOiBiYWxhbmNlX2xlYWY6IGxudW0gPiAwOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKLQkJCQkoZmxhZyA9PSBNX0RFTEVURSkgPyAiREVMRVRFIiA6ICgoZmxhZyA9PSBNX0NVVCkgPyAiQ1VUIiA6ICJVTktOT1dOIiksIGZsYWcpOwotCSAgICB9Ci0JfSBlbHNlIHsgCi0JICAgIC8qIG5ldyBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIExbMF0gKi8KLQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLHRiLT5sbnVtWzBdLHRiLT5sYnl0ZXMpOwogCX0KLSAgICB9CS8qIHRiLT5sbnVtWzBdID4gMCAqLwogCi0gICAgLyogQ2FsY3VsYXRlIG5ldyBpdGVtIHBvc2l0aW9uICovCi0gICAgaXRlbV9wb3MgLT0gKCB0Yi0+bG51bVswXSAtICgoIHRiLT5sYnl0ZXMgIT0gLTEgKSA/IDEgOiAwKSk7CisJLyogdGItPmxudW1bMF0gPiAwICovCisJLyogQ2FsY3VsYXRlIG5ldyBpdGVtIHBvc2l0aW9uICovCisJaXRlbV9wb3MgLT0gKHRiLT5sbnVtWzBdIC0gKCh0Yi0+bGJ5dGVzICE9IC0xKSA/IDEgOiAwKSk7CiAKLSAgICBpZiAoIHRiLT5ybnVtWzBdID4gMCApIHsKLQkvKiBzaGlmdCBybnVtWzBdIGl0ZW1zIGZyb20gU1swXSB0byB0aGUgcmlnaHQgbmVpZ2hib3IgUlswXSAqLwotCW4gPSBCX05SX0lURU1TKHRiUzApOwotCXN3aXRjaCAoIGZsYWcgKSB7CisJaWYgKHRiLT5ybnVtWzBdID4gMCkgeworCQkvKiBzaGlmdCBybnVtWzBdIGl0ZW1zIGZyb20gU1swXSB0byB0aGUgcmlnaHQgbmVpZ2hib3IgUlswXSAqLworCQluID0gQl9OUl9JVEVNUyh0YlMwKTsKKwkJc3dpdGNoIChmbGFnKSB7CiAKLQljYXNlIE1fSU5TRVJUOiAgIC8qIGluc2VydCBpdGVtICovCi0JICAgIGlmICggbiAtIHRiLT5ybnVtWzBdIDwgaXRlbV9wb3MgKQotCSAgICB7IC8qIG5ldyBpdGVtIG9yIGl0cyBwYXJ0IGZhbGxzIHRvIFJbMF0gKi8KLQkJaWYgKCBpdGVtX3BvcyA9PSBuIC0gdGItPnJudW1bMF0gKyAxICYmIHRiLT5yYnl0ZXMgIT0gLTEgKQotCQl7IC8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBSWzBdICovCi0JCSAgICBsb2ZmX3Qgb2xkX2tleV9jb21wLCBvbGRfbGVuLCByX3plcm9zX251bWJlcjsKLQkJICAgIGNvbnN0IGNoYXIgKiByX2JvZHk7Ci0JCSAgICBpbnQgdmVyc2lvbjsKLQkJICAgIGxvZmZfdCBvZmZzZXQ7CisJCWNhc2UgTV9JTlNFUlQ6CS8qIGluc2VydCBpdGVtICovCisJCQlpZiAobiAtIHRiLT5ybnVtWzBdIDwgaXRlbV9wb3MpIHsJLyogbmV3IGl0ZW0gb3IgaXRzIHBhcnQgZmFsbHMgdG8gUlswXSAqLworCQkJCWlmIChpdGVtX3BvcyA9PSBuIC0gdGItPnJudW1bMF0gKyAxICYmIHRiLT5yYnl0ZXMgIT0gLTEpIHsJLyogcGFydCBvZiBuZXcgaXRlbSBmYWxscyBpbnRvIFJbMF0gKi8KKwkJCQkJbG9mZl90IG9sZF9rZXlfY29tcCwgb2xkX2xlbiwKKwkJCQkJICAgIHJfemVyb3NfbnVtYmVyOworCQkJCQljb25zdCBjaGFyICpyX2JvZHk7CisJCQkJCWludCB2ZXJzaW9uOworCQkJCQlsb2ZmX3Qgb2Zmc2V0OwogCi0JCSAgICBsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLTEsLTEpOworCQkJCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLCB0Yi0+cm51bVswXSAtIDEsCisJCQkJCQkJIC0xKTsKIAotCQkgICAgdmVyc2lvbiA9IGloX3ZlcnNpb24oaWgpOwotCQkgICAgLyogUmVtZW1iZXIga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgICAgb2xkX2tleV9jb21wID0gbGVfaWhfa19vZmZzZXQoIGloICk7Ci0JCSAgICBvbGRfbGVuID0gaWhfaXRlbV9sZW4oaWgpOworCQkJCQl2ZXJzaW9uID0gaWhfdmVyc2lvbihpaCk7CisJCQkJCS8qIFJlbWVtYmVyIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoICovCisJCQkJCW9sZF9rZXlfY29tcCA9IGxlX2loX2tfb2Zmc2V0KGloKTsKKwkJCQkJb2xkX2xlbiA9IGloX2l0ZW1fbGVuKGloKTsKIAotCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFJbMF0gKi8KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbGVfaWhfa19vZmZzZXQoIGloICkgKyAoKG9sZF9sZW4gLSB0Yi0+cmJ5dGVzICk8PChpc19pbmRpcmVjdF9sZV9paChpaCk/dGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUOjApKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwgb2Zmc2V0ICk7Ci0JCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCB0Yi0+cmJ5dGVzKTsKLQkJICAgIC8qIEluc2VydCBwYXJ0IG9mIHRoZSBpdGVtIGludG8gUlswXSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gdGItPlJbMF07Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkgICAgaWYgKCAob2xkX2xlbiAtIHRiLT5yYnl0ZXMpID4gemVyb3NfbnVtICkgewotCQkJcl96ZXJvc19udW1iZXIgPSAwOwotCQkJcl9ib2R5ID0gYm9keSArIChvbGRfbGVuIC0gdGItPnJieXRlcykgLSB6ZXJvc19udW07Ci0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCXJfYm9keSA9IGJvZHk7Ci0JCQlyX3plcm9zX251bWJlciA9IHplcm9zX251bSAtIChvbGRfbGVuIC0gdGItPnJieXRlcyk7Ci0JCQl6ZXJvc19udW0gLT0gcl96ZXJvc19udW1iZXI7Ci0JCSAgICB9CisJCQkJCS8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBSWzBdICovCisJCQkJCW9mZnNldCA9CisJCQkJCSAgICBsZV9paF9rX29mZnNldChpaCkgKworCQkJCQkgICAgKChvbGRfbGVuIC0KKwkJCQkJICAgICAgdGItPgorCQkJCQkgICAgICByYnl0ZXMpIDw8IChpc19pbmRpcmVjdF9sZV9paChpaCkKKwkJCQkJCQkgID8gdGItPnRiX3NiLT4KKwkJCQkJCQkgIHNfYmxvY2tzaXplX2JpdHMgLQorCQkJCQkJCSAgVU5GTV9QX1NISUZUIDogMCkpOworCQkJCQlzZXRfbGVfaWhfa19vZmZzZXQoaWgsIG9mZnNldCk7CisJCQkJCXB1dF9paF9pdGVtX2xlbihpaCwgdGItPnJieXRlcyk7CisJCQkJCS8qIEluc2VydCBwYXJ0IG9mIHRoZSBpdGVtIGludG8gUlswXSAqLworCQkJCQliaS50YiA9IHRiOworCQkJCQliaS5iaV9iaCA9IHRiLT5SWzBdOworCQkJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJICAgIGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCk7CisJCQkJCWlmICgob2xkX2xlbiAtIHRiLT5yYnl0ZXMpID4gemVyb3NfbnVtKSB7CisJCQkJCQlyX3plcm9zX251bWJlciA9IDA7CisJCQkJCQlyX2JvZHkgPQorCQkJCQkJICAgIGJvZHkgKyAob2xkX2xlbiAtCisJCQkJCQkJICAgIHRiLT5yYnl0ZXMpIC0KKwkJCQkJCSAgICB6ZXJvc19udW07CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyX2JvZHkgPSBib2R5OworCQkJCQkJcl96ZXJvc19udW1iZXIgPQorCQkJCQkJICAgIHplcm9zX251bSAtIChvbGRfbGVuIC0KKwkJCQkJCQkJIHRiLT5yYnl0ZXMpOworCQkJCQkJemVyb3NfbnVtIC09IHJfemVyb3NfbnVtYmVyOworCQkJCQl9CiAKLQkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIDAsIGloLCByX2JvZHksIHJfemVyb3NfbnVtYmVyKTsKKwkJCQkJbGVhZl9pbnNlcnRfaW50b19idWYoJmJpLCAwLCBpaCwgcl9ib2R5LAorCQkJCQkJCSAgICAgcl96ZXJvc19udW1iZXIpOwogCi0JCSAgICAvKiBSZXBsYWNlIHJpZ2h0IGRlbGltaXRpbmcga2V5IGJ5IGZpcnN0IGtleSBpbiBSWzBdICovCi0JCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKKwkJCQkJLyogUmVwbGFjZSByaWdodCBkZWxpbWl0aW5nIGtleSBieSBmaXJzdCBrZXkgaW4gUlswXSAqLworCQkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSwgdGItPnJrZXlbMF0sCisJCQkJCQkgICAgdGItPlJbMF0sIDApOwogCi0JCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gU1swXSAqLwotICAgICAgICAgICAgICAgICAgICBzZXRfbGVfaWhfa19vZmZzZXQoIGloLCBvbGRfa2V5X2NvbXAgKTsKLQkJICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIG9sZF9sZW4gLSB0Yi0+cmJ5dGVzICk7CisJCQkJCS8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBTWzBdICovCisJCQkJCXNldF9sZV9paF9rX29mZnNldChpaCwgb2xkX2tleV9jb21wKTsKKwkJCQkJcHV0X2loX2l0ZW1fbGVuKGloLAorCQkJCQkJCW9sZF9sZW4gLSB0Yi0+cmJ5dGVzKTsKIAotCQkgICAgdGItPmluc2VydF9zaXplWzBdIC09IHRiLT5yYnl0ZXM7CisJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSAtPSB0Yi0+cmJ5dGVzOwogCi0JCX0KLQkJZWxzZSAvKiB3aG9sZSBuZXcgaXRlbSBmYWxscyBpbnRvIFJbMF0gKi8KLQkJewkJCQkJICAKLQkJICAgIC8qIFNoaWZ0IHJudW1bMF0tMSBpdGVtcyB0byBSWzBdICovCi0JCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXS0xLHRiLT5yYnl0ZXMpOwotCQkgICAgLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gUlswXSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gdGItPlJbMF07Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0gLSAxLCBpaCwgYm9keSwgemVyb3NfbnVtKTsKKwkJCQl9IGVsc2UgewkvKiB3aG9sZSBuZXcgaXRlbSBmYWxscyBpbnRvIFJbMF0gKi8KIAotCQkgICAgaWYgKCBpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSAtIDEgPT0gMCApIHsKLQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdLHRiLT5SWzBdLDApOworCQkJCQkvKiBTaGlmdCBybnVtWzBdLTEgaXRlbXMgdG8gUlswXSAqLworCQkJCQlyZXRfdmFsID0KKwkJCQkJICAgIGxlYWZfc2hpZnRfcmlnaHQodGIsCisJCQkJCQkJICAgICB0Yi0+cm51bVswXSAtIDEsCisJCQkJCQkJICAgICB0Yi0+cmJ5dGVzKTsKKwkJCQkJLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gUlswXSAqLworCQkJCQliaS50YiA9IHRiOworCQkJCQliaS5iaV9iaCA9IHRiLT5SWzBdOworCQkJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJICAgIGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCk7CisJCQkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKCZiaSwKKwkJCQkJCQkgICAgIGl0ZW1fcG9zIC0gbiArCisJCQkJCQkJICAgICB0Yi0+cm51bVswXSAtIDEsCisJCQkJCQkJICAgICBpaCwgYm9keSwKKwkJCQkJCQkgICAgIHplcm9zX251bSk7CiAKLQkJICAgIH0KLQkJICAgIHplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIC8qIG5ldyBpdGVtIG9yIHBhcnQgb2YgaXQgZG9lc24ndCBmYWxsIGludG8gUlswXSAqLwotCSAgICB7Ci0JCWxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7CisJCQkJCWlmIChpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSAtIDEgPT0gMCkgeworCQkJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sCisJCQkJCQkJICAgIHRiLT5ya2V5WzBdLAorCQkJCQkJCSAgICB0Yi0+UlswXSwgMCk7CiAKLQljYXNlIE1fUEFTVEU6ICAgLyogYXBwZW5kIGl0ZW0gKi8KKwkJCQkJfQorCQkJCQl6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CS8qIG5ldyBpdGVtIG9yIHBhcnQgb2YgaXQgZG9lc24ndCBmYWxsIGludG8gUlswXSAqLwogCi0JICAgIGlmICggbiAtIHRiLT5ybnVtWzBdIDw9IGl0ZW1fcG9zICkgIC8qIHBhc3RlZCBpdGVtIG9yIHBhcnQgb2YgaXQgZmFsbHMgdG8gUlswXSAqLwotCSAgICB7Ci0JCWlmICggaXRlbV9wb3MgPT0gbiAtIHRiLT5ybnVtWzBdICYmIHRiLT5yYnl0ZXMgIT0gLTEgKQotCQl7IC8qIHdlIG11c3Qgc2hpZnQgdGhlIHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KLQkJICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSkpCi0JCSAgICB7IC8qIHdlIGFwcGVuZCB0byBkaXJlY3RvcnkgaXRlbSAqLwotCQkJaW50IGVudHJ5X2NvdW50OwotCi0JCQlSRkFMU0UoIHplcm9zX251bSwKLQkJCQkiUEFQLTEyMTQ1OiBpbnZhbGlkIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgZGlyZWN0b3J5Iik7Ci0JCQllbnRyeV9jb3VudCA9IElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpKTsKLQkJCWlmICggZW50cnlfY291bnQgLSB0Yi0+cmJ5dGVzIDwgcG9zX2luX2l0ZW0gKQotCQkJICAgIC8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZmFsbHMgaW50byBSWzBdICovCi0JCQl7Ci0JCQkgICAgaW50IHBhc3RlX2VudHJ5X3Bvc2l0aW9uOwotCi0JCQkgICAgUkZBTFNFKCB0Yi0+cmJ5dGVzIC0gMSA+PSBlbnRyeV9jb3VudCB8fCAKLQkJCQkgICAgISB0Yi0+aW5zZXJ0X3NpemVbMF0sCi0JCQkJICAgICJQQVAtMTIxNTA6IG5vIGVub3VnaCBvZiBlbnRyaWVzIHRvIHNoaWZ0IHRvIFJbMF06IHJieXRlcz0lZCwgZW50cnlfY291bnQ9JWQiLAotCQkJCSAgICB0Yi0+cmJ5dGVzLCBlbnRyeV9jb3VudCk7Ci0JCQkgICAgLyogU2hpZnQgcm51bVswXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCByYnl0ZXMtMSBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRpcmVjdG9yeSBpdGVtIG51bWJlciBybnVtWzBdICovCi0JCQkgICAgbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzIC0gMSk7Ci0JCQkgICAgLyogUGFzdGUgZ2l2ZW4gZGlyZWN0b3J5IGVudHJ5IHRvIGRpcmVjdG9yeSBpdGVtICovCi0JCQkgICAgcGFzdGVfZW50cnlfcG9zaXRpb24gPSBwb3NfaW5faXRlbSAtIGVudHJ5X2NvdW50ICsgdGItPnJieXRlcyAtIDE7Ci0JCQkgICAgYmkudGIgPSB0YjsKLQkJCSAgICBiaS5iaV9iaCA9IHRiLT5SWzBdOwotCQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKLQkJCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIDAsIHBhc3RlX2VudHJ5X3Bvc2l0aW9uLAotCQkJCQkJICB0Yi0+aW5zZXJ0X3NpemVbMF0sYm9keSx6ZXJvc19udW0pOwotCQkJICAgIC8qIHBhc3RlIGVudHJ5ICovCi0JCQkgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCQliaS5iaV9iaCwgMCwgcGFzdGVfZW50cnlfcG9zaXRpb24sIDEsIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIAotCQkJCWJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCi0JCQkJKTsJCQkJCQkJCQotCQkJCQkJCi0JCQkgICAgaWYgKCBwYXN0ZV9lbnRyeV9wb3NpdGlvbiA9PSAwICkgewotCQkJCS8qIGNoYW5nZSBkZWxpbWl0aW5nIGtleXMgKi8KLQkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKLQkJCSAgICB9Ci0KLQkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQkJICAgIHBvc19pbl9pdGVtKys7CisJCQkJbGVhZl9zaGlmdF9yaWdodCh0YiwgdGItPnJudW1bMF0sIHRiLT5yYnl0ZXMpOwogCQkJfQotCQkJZWxzZSAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGRvZXNuJ3QgZmFsbCBpbnRvIFJbMF0gKi8KLQkJCXsKLQkJCSAgICBsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLHRiLT5yYnl0ZXMpOwotCQkJfQotCQkgICAgfQotCQkgICAgZWxzZSAvKiByZWd1bGFyIG9iamVjdCAqLwotCQkgICAgewotCQkJaW50IG5fc2hpZnQsIG5fcmVtLCByX3plcm9zX251bWJlcjsKLQkJCWNvbnN0IGNoYXIgKiByX2JvZHk7CisJCQlicmVhazsKIAotCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IGJlIHNoaWZ0ZWQgZnJvbSBhcHBlbmRlZCBpdGVtICovCi0JCQlpZiAoIChuX3NoaWZ0ID0gdGItPnJieXRlcyAtIHRiLT5pbnNlcnRfc2l6ZVswXSkgPCAwICkKLQkJCSAgICBuX3NoaWZ0ID0gMDsKKwkJY2FzZSBNX1BBU1RFOgkvKiBhcHBlbmQgaXRlbSAqLwogCi0JCQlSRkFMU0UocG9zX2luX2l0ZW0gIT0gaWhfaXRlbV9sZW4oQl9OX1BJVEVNX0hFQUQgKHRiUzAsIGl0ZW1fcG9zKSksCi0JCQkgICAgICAgIlBBUC0xMjE1NTogaW52YWxpZCBwb3NpdGlvbiB0byBwYXN0ZS4gaWhfaXRlbV9sZW49JWQsIHBvc19pbl9pdGVtPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NfaW5faXRlbSwgaWhfaXRlbV9sZW4oIEJfTl9QSVRFTV9IRUFEKHRiUzAsaXRlbV9wb3MpKSk7CisJCQlpZiAobiAtIHRiLT5ybnVtWzBdIDw9IGl0ZW1fcG9zKSB7CS8qIHBhc3RlZCBpdGVtIG9yIHBhcnQgb2YgaXQgZmFsbHMgdG8gUlswXSAqLworCQkJCWlmIChpdGVtX3BvcyA9PSBuIC0gdGItPnJudW1bMF0gJiYgdGItPnJieXRlcyAhPSAtMSkgewkvKiB3ZSBtdXN0IHNoaWZ0IHRoZSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtICovCisJCQkJCWlmIChpc19kaXJlbnRyeV9sZV9paChCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpKSB7CS8qIHdlIGFwcGVuZCB0byBkaXJlY3RvcnkgaXRlbSAqLworCQkJCQkJaW50IGVudHJ5X2NvdW50OwogCi0JCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLG5fc2hpZnQpOwotCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IHJlbWFpbiBpbiBib2R5IGFmdGVyIGFwcGVuZGluZyB0byBSWzBdICovCi0JCQlpZiAoIChuX3JlbSA9IHRiLT5pbnNlcnRfc2l6ZVswXSAtIHRiLT5yYnl0ZXMpIDwgMCApCi0JCQkgICAgbl9yZW0gPSAwOwotCQkJCi0JCQl7Ci0JCQkgIGludCB2ZXJzaW9uOwotCQkJICB1bnNpZ25lZCBsb25nIHRlbXBfcmVtID0gbl9yZW07Ci0JCQkgIAotCQkJICB2ZXJzaW9uID0gaWhfdmVyc2lvbiAoQl9OX1BJVEVNX0hFQUQgKHRiLT5SWzBdLDApKTsKLQkJCSAgaWYgKGlzX2luZGlyZWN0X2xlX2tleSh2ZXJzaW9uLEJfTl9QS0VZKHRiLT5SWzBdLDApKSl7Ci0JCQkgICAgICB0ZW1wX3JlbSA9IG5fcmVtIDw8ICh0Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLQotCQkJCQkgVU5GTV9QX1NISUZUKTsKLQkJCSAgfQotCQkJICBzZXRfbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUEtFWSh0Yi0+UlswXSwwKSwgCi0JCQkJCSAgICAgICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QS0VZKHRiLT5SWzBdLDApKSArIHRlbXBfcmVtKTsKLQkJCSAgc2V0X2xlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSx0Yi0+cmtleVswXSksIAotCQkJCQkgICAgICAgbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUERFTElNX0tFWSh0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdKSkgKyB0ZW1wX3JlbSk7Ci0JCQl9CisJCQkJCQlSRkFMU0UoemVyb3NfbnVtLAorCQkJCQkJICAgICAgICJQQVAtMTIxNDU6IGludmFsaWQgcGFyYW1ldGVyIGluIGNhc2Ugb2YgYSBkaXJlY3RvcnkiKTsKKwkJCQkJCWVudHJ5X2NvdW50ID0KKwkJCQkJCSAgICBJX0VOVFJZX0NPVU5UKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJCSAgKHRiUzAsCisJCQkJCQkJCSAgIGl0ZW1fcG9zKSk7CisJCQkJCQlpZiAoZW50cnlfY291bnQgLSB0Yi0+cmJ5dGVzIDwKKwkJCQkJCSAgICBwb3NfaW5faXRlbSkKKwkJCQkJCQkvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGZhbGxzIGludG8gUlswXSAqLworCQkJCQkJeworCQkJCQkJCWludCBwYXN0ZV9lbnRyeV9wb3NpdGlvbjsKKworCQkJCQkJCVJGQUxTRSh0Yi0+cmJ5dGVzIC0gMSA+PQorCQkJCQkJCSAgICAgICBlbnRyeV9jb3VudAorCQkJCQkJCSAgICAgICB8fCAhdGItPgorCQkJCQkJCSAgICAgICBpbnNlcnRfc2l6ZVswXSwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjE1MDogbm8gZW5vdWdoIG9mIGVudHJpZXMgdG8gc2hpZnQgdG8gUlswXTogcmJ5dGVzPSVkLCBlbnRyeV9jb3VudD0lZCIsCisJCQkJCQkJICAgICAgIHRiLT5yYnl0ZXMsCisJCQkJCQkJICAgICAgIGVudHJ5X2NvdW50KTsKKwkJCQkJCQkvKiBTaGlmdCBybnVtWzBdLTEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IHJieXRlcy0xIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gZGlyZWN0b3J5IGl0ZW0gbnVtYmVyIHJudW1bMF0gKi8KKwkJCQkJCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLAorCQkJCQkJCQkJIHRiLT4KKwkJCQkJCQkJCSBybnVtCisJCQkJCQkJCQkgWzBdLAorCQkJCQkJCQkJIHRiLT4KKwkJCQkJCQkJCSByYnl0ZXMKKwkJCQkJCQkJCSAtIDEpOworCQkJCQkJCS8qIFBhc3RlIGdpdmVuIGRpcmVjdG9yeSBlbnRyeSB0byBkaXJlY3RvcnkgaXRlbSAqLworCQkJCQkJCXBhc3RlX2VudHJ5X3Bvc2l0aW9uID0KKwkJCQkJCQkgICAgcG9zX2luX2l0ZW0gLQorCQkJCQkJCSAgICBlbnRyeV9jb3VudCArCisJCQkJCQkJICAgIHRiLT5yYnl0ZXMgLSAxOworCQkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQkJYmkuYmlfYmggPSB0Yi0+UlswXTsKKwkJCQkJCQliaS5iaV9wYXJlbnQgPQorCQkJCQkJCSAgICB0Yi0+RlJbMF07CisJCQkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkJCSAgICBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24KKwkJCQkJCQkgICAgKHRiLCAwKTsKKwkJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcgorCQkJCQkJCSAgICAoJmJpLCAwLAorCQkJCQkJCSAgICAgcGFzdGVfZW50cnlfcG9zaXRpb24sCisJCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJCQkJICAgICBib2R5LCB6ZXJvc19udW0pOworCQkJCQkJCS8qIHBhc3RlIGVudHJ5ICovCisJCQkJCQkJbGVhZl9wYXN0ZV9lbnRyaWVzKGJpLgorCQkJCQkJCQkJICAgYmlfYmgsCisJCQkJCQkJCQkgICAwLAorCQkJCQkJCQkJICAgcGFzdGVfZW50cnlfcG9zaXRpb24sCisJCQkJCQkJCQkgICAxLAorCQkJCQkJCQkJICAgKHN0cnVjdAorCQkJCQkJCQkJICAgIHJlaXNlcmZzX2RlX2hlYWQKKwkJCQkJCQkJCSAgICAqKQorCQkJCQkJCQkJICAgYm9keSwKKwkJCQkJCQkJCSAgIGJvZHkKKwkJCQkJCQkJCSAgICsKKwkJCQkJCQkJCSAgIERFSF9TSVpFLAorCQkJCQkJCQkJICAgdGItPgorCQkJCQkJCQkJICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJCSAgIFswXQorCQkJCQkJCSAgICApOworCisJCQkJCQkJaWYgKHBhc3RlX2VudHJ5X3Bvc2l0aW9uCisJCQkJCQkJICAgID09IDApIHsKKwkJCQkJCQkJLyogY2hhbmdlIGRlbGltaXRpbmcga2V5cyAqLworCQkJCQkJCQlyZXBsYWNlX2tleSh0YiwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgQ0ZSCisJCQkJCQkJCQkgICAgWzBdLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBya2V5CisJCQkJCQkJCQkgICAgWzBdLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBSCisJCQkJCQkJCQkgICAgWzBdLAorCQkJCQkJCQkJICAgIDApOworCQkJCQkJCX0KKworCQkJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJCQkJcG9zX2luX2l0ZW0rKzsKKwkJCQkJCX0gZWxzZSB7CS8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZG9lc24ndCBmYWxsIGludG8gUlswXSAqLworCisJCQkJCQkJbGVhZl9zaGlmdF9yaWdodCh0YiwKKwkJCQkJCQkJCSB0Yi0+CisJCQkJCQkJCQkgcm51bQorCQkJCQkJCQkJIFswXSwKKwkJCQkJCQkJCSB0Yi0+CisJCQkJCQkJCQkgcmJ5dGVzKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLyogcmVndWxhciBvYmplY3QgKi8KKworCQkJCQkJaW50IG5fc2hpZnQsIG5fcmVtLAorCQkJCQkJICAgIHJfemVyb3NfbnVtYmVyOworCQkJCQkJY29uc3QgY2hhciAqcl9ib2R5OworCisJCQkJCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgYmUgc2hpZnRlZCBmcm9tIGFwcGVuZGVkIGl0ZW0gKi8KKwkJCQkJCWlmICgobl9zaGlmdCA9CisJCQkJCQkgICAgIHRiLT5yYnl0ZXMgLQorCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0pIDwgMCkKKwkJCQkJCQluX3NoaWZ0ID0gMDsKKworCQkJCQkJUkZBTFNFKHBvc19pbl9pdGVtICE9CisJCQkJCQkgICAgICAgaWhfaXRlbV9sZW4KKwkJCQkJCSAgICAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkodGJTMCwgaXRlbV9wb3MpKSwKKwkJCQkJCSAgICAgICAiUEFQLTEyMTU1OiBpbnZhbGlkIHBvc2l0aW9uIHRvIHBhc3RlLiBpaF9pdGVtX2xlbj0lZCwgcG9zX2luX2l0ZW09JWQiLAorCQkJCQkJICAgICAgIHBvc19pbl9pdGVtLAorCQkJCQkJICAgICAgIGloX2l0ZW1fbGVuCisJCQkJCQkgICAgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJKHRiUzAsIGl0ZW1fcG9zKSkpOworCisJCQkJCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLAorCQkJCQkJCQkgdGItPnJudW1bMF0sCisJCQkJCQkJCSBuX3NoaWZ0KTsKKwkJCQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCByZW1haW4gaW4gYm9keSBhZnRlciBhcHBlbmRpbmcgdG8gUlswXSAqLworCQkJCQkJaWYgKChuX3JlbSA9CisJCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSAtCisJCQkJCQkgICAgIHRiLT5yYnl0ZXMpIDwgMCkKKwkJCQkJCQluX3JlbSA9IDA7CisKKwkJCQkJCXsKKwkJCQkJCQlpbnQgdmVyc2lvbjsKKwkJCQkJCQl1bnNpZ25lZCBsb25nIHRlbXBfcmVtID0KKwkJCQkJCQkgICAgbl9yZW07CisKKwkJCQkJCQl2ZXJzaW9uID0KKwkJCQkJCQkgICAgaWhfdmVyc2lvbgorCQkJCQkJCSAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkgICAgICh0Yi0+UlswXSwgMCkpOworCQkJCQkJCWlmIChpc19pbmRpcmVjdF9sZV9rZXkKKwkJCQkJCQkgICAgKHZlcnNpb24sCisJCQkJCQkJICAgICBCX05fUEtFWSh0Yi0+UlswXSwKKwkJCQkJCQkJICAgICAgMCkpKSB7CisJCQkJCQkJCXRlbXBfcmVtID0KKwkJCQkJCQkJICAgIG5fcmVtIDw8CisJCQkJCQkJCSAgICAodGItPnRiX3NiLT4KKwkJCQkJCQkJICAgICBzX2Jsb2Nrc2l6ZV9iaXRzCisJCQkJCQkJCSAgICAgLQorCQkJCQkJCQkgICAgIFVORk1fUF9TSElGVCk7CisJCQkJCQkJfQorCQkJCQkJCXNldF9sZV9rZXlfa19vZmZzZXQKKwkJCQkJCQkgICAgKHZlcnNpb24sCisJCQkJCQkJICAgICBCX05fUEtFWSh0Yi0+UlswXSwKKwkJCQkJCQkJICAgICAgMCksCisJCQkJCQkJICAgICBsZV9rZXlfa19vZmZzZXQKKwkJCQkJCQkgICAgICh2ZXJzaW9uLAorCQkJCQkJCSAgICAgIEJfTl9QS0VZKHRiLT5SWzBdLAorCQkJCQkJCQkgICAgICAgMCkpICsKKwkJCQkJCQkgICAgIHRlbXBfcmVtKTsKKwkJCQkJCQlzZXRfbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkJICAgICh2ZXJzaW9uLAorCQkJCQkJCSAgICAgQl9OX1BERUxJTV9LRVkodGItPgorCQkJCQkJCQkJICAgIENGUgorCQkJCQkJCQkJICAgIFswXSwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgcmtleQorCQkJCQkJCQkJICAgIFswXSksCisJCQkJCQkJICAgICBsZV9rZXlfa19vZmZzZXQKKwkJCQkJCQkgICAgICh2ZXJzaW9uLAorCQkJCQkJCSAgICAgIEJfTl9QREVMSU1fS0VZCisJCQkJCQkJICAgICAgKHRiLT5DRlJbMF0sCisJCQkJCQkJICAgICAgIHRiLT5ya2V5WzBdKSkgKworCQkJCQkJCSAgICAgdGVtcF9yZW0pOworCQkJCQkJfQogLyoJCSAga19vZmZzZXQgKEJfTl9QS0VZKHRiLT5SWzBdLDApKSArPSBuX3JlbTsKIAkJICBrX29mZnNldCAoQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSx0Yi0+cmtleVswXSkpICs9IG5fcmVtOyovCi0JCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0Yi0+Q0ZSWzBdLCAwKTsKKwkJCQkJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eQorCQkJCQkJICAgICh0YiwgdGItPkNGUlswXSwgMCk7CiAKLQkJCS8qIEFwcGVuZCBwYXJ0IG9mIGJvZHkgaW50byBSWzBdICovCi0JCQliaS50YiA9IHRiOwotCQkJYmkuYmlfYmggPSB0Yi0+UlswXTsKLQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKLQkJCWJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCQlpZiAoIG5fcmVtID4gemVyb3NfbnVtICkgewotCQkJICAgIHJfemVyb3NfbnVtYmVyID0gMDsKLQkJCSAgICByX2JvZHkgPSBib2R5ICsgbl9yZW0gLSB6ZXJvc19udW07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgICByX2JvZHkgPSBib2R5OwotCQkJICAgIHJfemVyb3NfbnVtYmVyID0gemVyb3NfbnVtIC0gbl9yZW07Ci0JCQkgICAgemVyb3NfbnVtIC09IHJfemVyb3NfbnVtYmVyOwotCQkJfQorCQkJCQkJLyogQXBwZW5kIHBhcnQgb2YgYm9keSBpbnRvIFJbMF0gKi8KKwkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQliaS5iaV9iaCA9IHRiLT5SWzBdOworCQkJCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOworCQkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkJICAgIGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbgorCQkJCQkJICAgICh0YiwgMCk7CisJCQkJCQlpZiAobl9yZW0gPiB6ZXJvc19udW0pIHsKKwkJCQkJCQlyX3plcm9zX251bWJlciA9IDA7CisJCQkJCQkJcl9ib2R5ID0KKwkJCQkJCQkgICAgYm9keSArIG5fcmVtIC0KKwkJCQkJCQkgICAgemVyb3NfbnVtOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyX2JvZHkgPSBib2R5OworCQkJCQkJCXJfemVyb3NfbnVtYmVyID0KKwkJCQkJCQkgICAgemVyb3NfbnVtIC0gbl9yZW07CisJCQkJCQkJemVyb3NfbnVtIC09CisJCQkJCQkJICAgIHJfemVyb3NfbnVtYmVyOworCQkJCQkJfQogCi0JCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksIDAsIG5fc2hpZnQsIHRiLT5pbnNlcnRfc2l6ZVswXSAtIG5fcmVtLCByX2JvZHksIHJfemVyb3NfbnVtYmVyKTsKKwkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgMCwKKwkJCQkJCQkJICAgICBuX3NoaWZ0LAorCQkJCQkJCQkgICAgIHRiLT4KKwkJCQkJCQkJICAgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICAgIFswXSAtCisJCQkJCQkJCSAgICAgbl9yZW0sCisJCQkJCQkJCSAgICAgcl9ib2R5LAorCQkJCQkJCQkgICAgIHJfemVyb3NfbnVtYmVyKTsKIAotCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loIChCX05fUElURU1fSEVBRCh0Yi0+UlswXSwwKSkpIHsKKwkJCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paAorCQkJCQkJICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJICAgICAodGItPlJbMF0sIDApKSkgewogI2lmIDAKLQkJCSAgICBSRkFMU0UoIG5fcmVtLAotCQkJCSAgICAiUEFQLTEyMTYwOiBwYXN0ZSBtb3JlIHRoYW4gb25lIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciIpOworCQkJCQkJCVJGQUxTRShuX3JlbSwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjE2MDogcGFzdGUgbW9yZSB0aGFuIG9uZSB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIiKTsKICNlbmRpZgotCQkJICAgIHNldF9paF9mcmVlX3NwYWNlIChCX05fUElURU1fSEVBRCh0Yi0+UlswXSwwKSwgMCk7Ci0JCQl9Ci0JCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSBuX3JlbTsKLQkJCWlmICggISBuX3JlbSApCi0JCQkgICAgcG9zX2luX2l0ZW0gKys7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZSAvKiBwYXN0ZWQgaXRlbSBpbiB3aG9sZSBmYWxscyBpbnRvIFJbMF0gKi8KLQkJewotCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBhc3RlZDsKKwkJCQkJCQlzZXRfaWhfZnJlZV9zcGFjZQorCQkJCQkJCSAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkgICAgICh0Yi0+UlswXSwgMCksIDApOworCQkJCQkJfQorCQkJCQkJdGItPmluc2VydF9zaXplWzBdID0gbl9yZW07CisJCQkJCQlpZiAoIW5fcmVtKQorCQkJCQkJCXBvc19pbl9pdGVtKys7CisJCQkJCX0KKwkJCQl9IGVsc2UgewkvKiBwYXN0ZWQgaXRlbSBpbiB3aG9sZSBmYWxscyBpbnRvIFJbMF0gKi8KIAotCQkgICAgcmV0X3ZhbCA9IGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyk7Ci0JCSAgICAvKiBhcHBlbmQgaXRlbSBpbiBSWzBdICovCi0JCSAgICBpZiAoIHBvc19pbl9pdGVtID49IDAgKSB7CisJCQkJCXN0cnVjdCBpdGVtX2hlYWQgKnBhc3RlZDsKKworCQkJCQlyZXRfdmFsID0KKwkJCQkJICAgIGxlYWZfc2hpZnRfcmlnaHQodGIsIHRiLT5ybnVtWzBdLAorCQkJCQkJCSAgICAgdGItPnJieXRlcyk7CisJCQkJCS8qIGFwcGVuZCBpdGVtIGluIFJbMF0gKi8KKwkJCQkJaWYgKHBvc19pbl9pdGVtID49IDApIHsKKwkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQliaS5iaV9iaCA9IHRiLT5SWzBdOworCQkJCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOworCQkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkJICAgIGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbgorCQkJCQkJICAgICh0YiwgMCk7CisJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksCisJCQkJCQkJCSAgICAgaXRlbV9wb3MgLQorCQkJCQkJCQkgICAgIG4gKworCQkJCQkJCQkgICAgIHRiLT4KKwkJCQkJCQkJICAgICBybnVtWzBdLAorCQkJCQkJCQkgICAgIHBvc19pbl9pdGVtLAorCQkJCQkJCQkgICAgIHRiLT4KKwkJCQkJCQkJICAgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICAgIFswXSwgYm9keSwKKwkJCQkJCQkJICAgICB6ZXJvc19udW0pOworCQkJCQl9CisKKwkJCQkJLyogcGFzdGUgbmV3IGVudHJ5LCBpZiBpdGVtIGlzIGRpcmVjdG9yeSBpdGVtICovCisJCQkJCXBhc3RlZCA9CisJCQkJCSAgICBCX05fUElURU1fSEVBRCh0Yi0+UlswXSwKKwkJCQkJCQkgICBpdGVtX3BvcyAtIG4gKworCQkJCQkJCSAgIHRiLT5ybnVtWzBdKTsKKwkJCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loKHBhc3RlZCkKKwkJCQkJICAgICYmIHBvc19pbl9pdGVtID49IDApIHsKKwkJCQkJCWxlYWZfcGFzdGVfZW50cmllcyhiaS5iaV9iaCwKKwkJCQkJCQkJICAgaXRlbV9wb3MgLQorCQkJCQkJCQkgICBuICsKKwkJCQkJCQkJICAgdGItPnJudW1bMF0sCisJCQkJCQkJCSAgIHBvc19pbl9pdGVtLAorCQkJCQkJCQkgICAxLAorCQkJCQkJCQkgICAoc3RydWN0CisJCQkJCQkJCSAgICByZWlzZXJmc19kZV9oZWFkCisJCQkJCQkJCSAgICAqKWJvZHksCisJCQkJCQkJCSAgIGJvZHkgKworCQkJCQkJCQkgICBERUhfU0laRSwKKwkJCQkJCQkJICAgdGItPgorCQkJCQkJCQkgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICBbMF0KKwkJCQkJCSAgICApOworCQkJCQkJaWYgKCFwb3NfaW5faXRlbSkgeworCisJCQkJCQkJUkZBTFNFKGl0ZW1fcG9zIC0gbiArCisJCQkJCQkJICAgICAgIHRiLT5ybnVtWzBdLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMTY1OiBkaXJlY3RvcnkgaXRlbSBtdXN0IGJlIGZpcnN0IGl0ZW0gb2Ygbm9kZSB3aGVuIHBhc3RpbmcgaXMgaW4gMHRoIHBvc2l0aW9uIik7CisKKwkJCQkJCQkvKiB1cGRhdGUgZGVsaW1pdGluZyBrZXlzICovCisJCQkJCQkJcmVwbGFjZV9rZXkodGIsCisJCQkJCQkJCSAgICB0Yi0+Q0ZSWzBdLAorCQkJCQkJCQkgICAgdGItPnJrZXlbMF0sCisJCQkJCQkJCSAgICB0Yi0+UlswXSwKKwkJCQkJCQkJICAgIDApOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBhc3RlZCkpCisJCQkJCQlzZXRfaWhfZnJlZV9zcGFjZShwYXN0ZWQsIDApOworCQkJCQl6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CS8qIG5ldyBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIFJbMF0gKi8KKworCQkJCWxlYWZfc2hpZnRfcmlnaHQodGIsIHRiLT5ybnVtWzBdLCB0Yi0+cmJ5dGVzKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBjYXNlcyBkIGFuZCB0ICovCisJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJICAgICAgICJQQVAtMTIxNzU6IGJhbGFuY2VfbGVhZjogcm51bSA+IDA6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAorCQkJCSAgICAgICAoZmxhZyA9PQorCQkJCQlNX0RFTEVURSkgPyAiREVMRVRFIiA6ICgoZmxhZyA9PQorCQkJCQkJCQkgTV9DVVQpID8gIkNVVCIKKwkJCQkJCQkJOiAiVU5LTk9XTiIpLAorCQkJCSAgICAgICBmbGFnKTsKKwkJfQorCisJfQorCisJLyogdGItPnJudW1bMF0gPiAwICovCisJUkZBTFNFKHRiLT5ibGtudW1bMF0gPiAzLAorCSAgICAgICAiUEFQLTEyMTgwOiBibGtudW0gY2FuIG5vdCBiZSAlZC4gSXQgbXVzdCBiZSA8PSAzIiwKKwkgICAgICAgdGItPmJsa251bVswXSk7CisJUkZBTFNFKHRiLT5ibGtudW1bMF0gPCAwLAorCSAgICAgICAiUEFQLTEyMTg1OiBibGtudW0gY2FuIG5vdCBiZSAlZC4gSXQgbXVzdCBiZSA+PSAwIiwKKwkgICAgICAgdGItPmJsa251bVswXSk7CisKKwkvKiBpZiB3aGlsZSBhZGRpbmcgdG8gYSBub2RlIHdlIGRpc2NvdmVyIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gc3BsaXQKKwkgICBpdCBpbiB0d28sIGFuZCBtZXJnZSB0aGUgbGVmdCBwYXJ0IGludG8gdGhlIGxlZnQgbmVpZ2hib3IgYW5kIHRoZQorCSAgIHJpZ2h0IHBhcnQgaW50byB0aGUgcmlnaHQgbmVpZ2hib3IsIGVsaW1pbmF0aW5nIHRoZSBub2RlICovCisJaWYgKHRiLT5ibGtudW1bMF0gPT0gMCkgewkvKiBub2RlIFNbMF0gaXMgZW1wdHkgbm93ICovCisKKwkJUkZBTFNFKCF0Yi0+bG51bVswXSB8fCAhdGItPnJudW1bMF0sCisJCSAgICAgICAiUEFQLTEyMTkwOiBsbnVtIGFuZCBybnVtIG11c3Qgbm90IGJlIHplcm8iKTsKKwkJLyogaWYgaW5zZXJ0aW9uIHdhcyBkb25lIGJlZm9yZSAwLXRoIHBvc2l0aW9uIGluIFJbMF0sIHJpZ2h0CisJCSAgIGRlbGltaXRpbmcga2V5IG9mIHRoZSB0Yi0+TFswXSdzIGFuZCBsZWZ0IGRlbGltaXRpbmcga2V5IGFyZQorCQkgICBub3Qgc2V0IGNvcnJlY3RseSAqLworCQlpZiAodGItPkNGTFswXSkgeworCQkJaWYgKCF0Yi0+Q0ZSWzBdKQorCQkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkJICAgICAgICJ2cy0xMjE5NTogYmFsYW5jZV9sZWFmOiBDRlIgbm90IGluaXRpYWxpemVkIik7CisJCQljb3B5X2tleShCX05fUERFTElNX0tFWSh0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSksCisJCQkJIEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdKSk7CisJCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiLT5DRkxbMF0sIDApOworCQl9CisKKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiUzApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaWxsIG5ldyBub2RlcyB0aGF0IGFwcGVhciBpbiBwbGFjZSBvZiBTWzBdICovCisKKwkvKiBJIGFtIHRvbGQgdGhhdCB0aGlzIGNvcHlpbmcgaXMgYmVjYXVzZSB3ZSBuZWVkIGFuIGFycmF5IHRvIGVuYWJsZQorCSAgIHRoZSBsb29waW5nIGNvZGUuIC1IYW5zICovCisJc251bVswXSA9IHRiLT5zMW51bSwgc251bVsxXSA9IHRiLT5zMm51bTsKKwlzYnl0ZXNbMF0gPSB0Yi0+czFieXRlczsKKwlzYnl0ZXNbMV0gPSB0Yi0+czJieXRlczsKKwlmb3IgKGkgPSB0Yi0+YmxrbnVtWzBdIC0gMjsgaSA+PSAwOyBpLS0pIHsKKworCQlSRkFMU0UoIXNudW1baV0sICJQQVAtMTIyMDA6IHNudW1bJWRdID09ICVkLiBNdXN0IGJlID4gMCIsIGksCisJCSAgICAgICBzbnVtW2ldKTsKKworCQkvKiBoZXJlIHdlIHNoaWZ0IGZyb20gUyB0byBTX25ldyBub2RlcyAqLworCisJCVNfbmV3W2ldID0gZ2V0X0ZFQih0Yik7CisKKwkJLyogaW5pdGlhbGl6ZWQgYmxvY2sgdHlwZSBhbmQgdHJlZSBsZXZlbCAqLworCQlzZXRfYmxraF9sZXZlbChCX0JMS19IRUFEKFNfbmV3W2ldKSwgRElTS19MRUFGX05PREVfTEVWRUwpOworCisJCW4gPSBCX05SX0lURU1TKHRiUzApOworCisJCXN3aXRjaCAoZmxhZykgeworCQljYXNlIE1fSU5TRVJUOgkvKiBpbnNlcnQgaXRlbSAqLworCisJCQlpZiAobiAtIHNudW1baV0gPCBpdGVtX3BvcykgewkvKiBuZXcgaXRlbSBvciBpdCdzIHBhcnQgZmFsbHMgdG8gZmlyc3QgbmV3IG5vZGUgU19uZXdbaV0gKi8KKwkJCQlpZiAoaXRlbV9wb3MgPT0gbiAtIHNudW1baV0gKyAxICYmIHNieXRlc1tpXSAhPSAtMSkgewkvKiBwYXJ0IG9mIG5ldyBpdGVtIGZhbGxzIGludG8gU19uZXdbaV0gKi8KKwkJCQkJaW50IG9sZF9rZXlfY29tcCwgb2xkX2xlbiwKKwkJCQkJICAgIHJfemVyb3NfbnVtYmVyOworCQkJCQljb25zdCBjaGFyICpyX2JvZHk7CisJCQkJCWludCB2ZXJzaW9uOworCisJCQkJCS8qIE1vdmUgc251bVtpXS0xIGl0ZW1zIGZyb20gU1swXSB0byBTX25ld1tpXSAqLworCQkJCQlsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsCisJCQkJCQkJc251bVtpXSAtIDEsIC0xLAorCQkJCQkJCVNfbmV3W2ldKTsKKwkJCQkJLyogUmVtZW1iZXIga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggKi8KKwkJCQkJdmVyc2lvbiA9IGloX3ZlcnNpb24oaWgpOworCQkJCQlvbGRfa2V5X2NvbXAgPSBsZV9paF9rX29mZnNldChpaCk7CisJCQkJCW9sZF9sZW4gPSBpaF9pdGVtX2xlbihpaCk7CisKKwkJCQkJLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFNfbmV3W2ldICovCisJCQkJCXNldF9sZV9paF9rX29mZnNldChpaCwKKwkJCQkJCQkgICBsZV9paF9rX29mZnNldChpaCkgKworCQkJCQkJCSAgICgob2xkX2xlbiAtCisJCQkJCQkJICAgICBzYnl0ZXNbaV0pIDw8CisJCQkJCQkJICAgIChpc19pbmRpcmVjdF9sZV9paAorCQkJCQkJCSAgICAgKGloKSA/IHRiLT50Yl9zYi0+CisJCQkJCQkJICAgICBzX2Jsb2Nrc2l6ZV9iaXRzIC0KKwkJCQkJCQkgICAgIFVORk1fUF9TSElGVCA6CisJCQkJCQkJICAgICAwKSkpOworCisJCQkJCXB1dF9paF9pdGVtX2xlbihpaCwgc2J5dGVzW2ldKTsKKworCQkJCQkvKiBJbnNlcnQgcGFydCBvZiB0aGUgaXRlbSBpbnRvIFNfbmV3W2ldIGJlZm9yZSAwLXRoIGl0ZW0gKi8KKwkJCQkJYmkudGIgPSB0YjsKKwkJCQkJYmkuYmlfYmggPSBTX25ld1tpXTsKKwkJCQkJYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJCQkJYmkuYmlfcG9zaXRpb24gPSAwOworCisJCQkJCWlmICgob2xkX2xlbiAtIHNieXRlc1tpXSkgPiB6ZXJvc19udW0pIHsKKwkJCQkJCXJfemVyb3NfbnVtYmVyID0gMDsKKwkJCQkJCXJfYm9keSA9CisJCQkJCQkgICAgYm9keSArIChvbGRfbGVuIC0KKwkJCQkJCQkgICAgc2J5dGVzW2ldKSAtCisJCQkJCQkgICAgemVyb3NfbnVtOworCQkJCQl9IGVsc2UgeworCQkJCQkJcl9ib2R5ID0gYm9keTsKKwkJCQkJCXJfemVyb3NfbnVtYmVyID0KKwkJCQkJCSAgICB6ZXJvc19udW0gLSAob2xkX2xlbiAtCisJCQkJCQkJCSBzYnl0ZXNbaV0pOworCQkJCQkJemVyb3NfbnVtIC09IHJfemVyb3NfbnVtYmVyOworCQkJCQl9CisKKwkJCQkJbGVhZl9pbnNlcnRfaW50b19idWYoJmJpLCAwLCBpaCwgcl9ib2R5LAorCQkJCQkJCSAgICAgcl96ZXJvc19udW1iZXIpOworCisJCQkJCS8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBTW2ldICovCisJCQkJCXNldF9sZV9paF9rX29mZnNldChpaCwgb2xkX2tleV9jb21wKTsKKwkJCQkJcHV0X2loX2l0ZW1fbGVuKGloLAorCQkJCQkJCW9sZF9sZW4gLSBzYnl0ZXNbaV0pOworCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gLT0gc2J5dGVzW2ldOworCQkJCX0gZWxzZSB7CS8qIHdob2xlIG5ldyBpdGVtIGZhbGxzIGludG8gU19uZXdbaV0gKi8KKworCQkJCQkvKiBTaGlmdCBzbnVtWzBdIC0gMSBpdGVtcyB0byBTX25ld1tpXSAoc2J5dGVzW2ldIG9mIHNwbGl0IGl0ZW0pICovCisJCQkJCWxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19TTkVXLCB0YiwKKwkJCQkJCQlzbnVtW2ldIC0gMSwgc2J5dGVzW2ldLAorCQkJCQkJCVNfbmV3W2ldKTsKKworCQkJCQkvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBTX25ld1tpXSAqLworCQkJCQliaS50YiA9IHRiOworCQkJCQliaS5iaV9iaCA9IFNfbmV3W2ldOworCQkJCQliaS5iaV9wYXJlbnQgPSBOVUxMOworCQkJCQliaS5iaV9wb3NpdGlvbiA9IDA7CisJCQkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKCZiaSwKKwkJCQkJCQkgICAgIGl0ZW1fcG9zIC0gbiArCisJCQkJCQkJICAgICBzbnVtW2ldIC0gMSwgaWgsCisJCQkJCQkJICAgICBib2R5LCB6ZXJvc19udW0pOworCisJCQkJCXplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJfQorCQkJfQorCisJCQllbHNlIHsJLyogbmV3IGl0ZW0gb3IgaXQgcGFydCBkb24ndCBmYWxscyBpbnRvIFNfbmV3W2ldICovCisKKwkJCQlsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsCisJCQkJCQlzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTV9QQVNURToJLyogYXBwZW5kIGl0ZW0gKi8KKworCQkJaWYgKG4gLSBzbnVtW2ldIDw9IGl0ZW1fcG9zKSB7CS8qIHBhc3RlZCBpdGVtIG9yIHBhcnQgaWYgaXQgZmFsbHMgdG8gU19uZXdbaV0gKi8KKwkJCQlpZiAoaXRlbV9wb3MgPT0gbiAtIHNudW1baV0gJiYgc2J5dGVzW2ldICE9IC0xKSB7CS8qIHdlIG11c3Qgc2hpZnQgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSAqLworCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkICphdXhfaWg7CisKKwkJCQkJUkZBTFNFKGloLCAiUEFQLTEyMjEwOiBpaCBtdXN0IGJlIDAiKTsKKworCQkJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgKKwkJCQkJICAgIChhdXhfaWggPQorCQkJCQkgICAgIEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSkpIHsKKwkJCQkJCS8qIHdlIGFwcGVuZCB0byBkaXJlY3RvcnkgaXRlbSAqLworCisJCQkJCQlpbnQgZW50cnlfY291bnQ7CisKKwkJCQkJCWVudHJ5X2NvdW50ID0KKwkJCQkJCSAgICBpaF9lbnRyeV9jb3VudChhdXhfaWgpOworCisJCQkJCQlpZiAoZW50cnlfY291bnQgLSBzYnl0ZXNbaV0gPAorCQkJCQkJICAgIHBvc19pbl9pdGVtCisJCQkJCQkgICAgJiYgcG9zX2luX2l0ZW0gPD0KKwkJCQkJCSAgICBlbnRyeV9jb3VudCkgeworCQkJCQkJCS8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZmFsbHMgaW50byBTX25ld1tpXSAqLworCisJCQkJCQkJUkZBTFNFKCF0Yi0+CisJCQkJCQkJICAgICAgIGluc2VydF9zaXplWzBdLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMjE1OiBpbnNlcnRfc2l6ZSBpcyBhbHJlYWR5IDAiKTsKKwkJCQkJCQlSRkFMU0Uoc2J5dGVzW2ldIC0gMSA+PQorCQkJCQkJCSAgICAgICBlbnRyeV9jb3VudCwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjIyMDogdGhlcmUgYXJlIG5vIHNvIG11Y2ggZW50cmllcyAoJWQpLCBvbmx5ICVkIiwKKwkJCQkJCQkgICAgICAgc2J5dGVzW2ldIC0gMSwKKwkJCQkJCQkgICAgICAgZW50cnlfY291bnQpOworCisJCQkJCQkJLyogU2hpZnQgc251bVtpXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBzYnl0ZXNbaV0gZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgc251bVtpXSAqLworCQkJCQkJCWxlYWZfbW92ZV9pdGVtcworCQkJCQkJCSAgICAoTEVBRl9GUk9NX1NfVE9fU05FVywKKwkJCQkJCQkgICAgIHRiLCBzbnVtW2ldLAorCQkJCQkJCSAgICAgc2J5dGVzW2ldIC0gMSwKKwkJCQkJCQkgICAgIFNfbmV3W2ldKTsKKwkJCQkJCQkvKiBQYXN0ZSBnaXZlbiBkaXJlY3RvcnkgZW50cnkgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCQkJCQliaS50YiA9IHRiOworCQkJCQkJCWJpLmJpX2JoID0gU19uZXdbaV07CisJCQkJCQkJYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJCQkJCQliaS5iaV9wb3NpdGlvbiA9IDA7CisJCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIKKwkJCQkJCQkgICAgKCZiaSwgMCwKKwkJCQkJCQkgICAgIHBvc19pbl9pdGVtIC0KKwkJCQkJCQkgICAgIGVudHJ5X2NvdW50ICsKKwkJCQkJCQkgICAgIHNieXRlc1tpXSAtIDEsCisJCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJCQkJICAgICBib2R5LCB6ZXJvc19udW0pOworCQkJCQkJCS8qIHBhc3RlIG5ldyBkaXJlY3RvcnkgZW50cnkgKi8KKwkJCQkJCQlsZWFmX3Bhc3RlX2VudHJpZXMoYmkuCisJCQkJCQkJCQkgICBiaV9iaCwKKwkJCQkJCQkJCSAgIDAsCisJCQkJCQkJCQkgICBwb3NfaW5faXRlbQorCQkJCQkJCQkJICAgLQorCQkJCQkJCQkJICAgZW50cnlfY291bnQKKwkJCQkJCQkJCSAgICsKKwkJCQkJCQkJCSAgIHNieXRlcworCQkJCQkJCQkJICAgW2ldIC0KKwkJCQkJCQkJCSAgIDEsIDEsCisJCQkJCQkJCQkgICAoc3RydWN0CisJCQkJCQkJCQkgICAgcmVpc2VyZnNfZGVfaGVhZAorCQkJCQkJCQkJICAgICopCisJCQkJCQkJCQkgICBib2R5LAorCQkJCQkJCQkJICAgYm9keQorCQkJCQkJCQkJICAgKworCQkJCQkJCQkJICAgREVIX1NJWkUsCisJCQkJCQkJCQkgICB0Yi0+CisJCQkJCQkJCQkgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkJICAgWzBdCisJCQkJCQkJICAgICk7CisJCQkJCQkJdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQkJCQlwb3NfaW5faXRlbSsrOworCQkJCQkJfSBlbHNlIHsJLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBkb2Vzbid0IGZhbGwgaW50byBTX25ld1tpXSAqLworCQkJCQkJCWxlYWZfbW92ZV9pdGVtcworCQkJCQkJCSAgICAoTEVBRl9GUk9NX1NfVE9fU05FVywKKwkJCQkJCQkgICAgIHRiLCBzbnVtW2ldLAorCQkJCQkJCSAgICAgc2J5dGVzW2ldLAorCQkJCQkJCSAgICAgU19uZXdbaV0pOworCQkJCQkJfQorCQkJCQl9IGVsc2UgewkvKiByZWd1bGFyIG9iamVjdCAqLworCisJCQkJCQlpbnQgbl9zaGlmdCwgbl9yZW0sCisJCQkJCQkgICAgcl96ZXJvc19udW1iZXI7CisJCQkJCQljb25zdCBjaGFyICpyX2JvZHk7CisKKwkJCQkJCVJGQUxTRShwb3NfaW5faXRlbSAhPQorCQkJCQkJICAgICAgIGloX2l0ZW1fbGVuCisJCQkJCQkgICAgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJKHRiUzAsIGl0ZW1fcG9zKSkKKwkJCQkJCSAgICAgICB8fCB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0KKwkJCQkJCSAgICAgICAwLAorCQkJCQkJICAgICAgICJQQVAtMTIyMjU6IGl0ZW0gdG9vIHNob3J0IG9yIGluc2VydF9zaXplIDw9IDAiKTsKKworCQkJCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IGJlIHNoaWZ0ZWQgZnJvbSBhcHBlbmRlZCBpdGVtICovCisJCQkJCQluX3NoaWZ0ID0KKwkJCQkJCSAgICBzYnl0ZXNbaV0gLQorCQkJCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXTsKKwkJCQkJCWlmIChuX3NoaWZ0IDwgMCkKKwkJCQkJCQluX3NoaWZ0ID0gMDsKKwkJCQkJCWxlYWZfbW92ZV9pdGVtcworCQkJCQkJICAgIChMRUFGX0ZST01fU19UT19TTkVXLCB0YiwKKwkJCQkJCSAgICAgc251bVtpXSwgbl9zaGlmdCwKKwkJCQkJCSAgICAgU19uZXdbaV0pOworCisJCQkJCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgcmVtYWluIGluIGJvZHkgYWZ0ZXIgYXBwZW5kIHRvIFNfbmV3W2ldICovCisJCQkJCQluX3JlbSA9CisJCQkJCQkgICAgdGItPmluc2VydF9zaXplWzBdIC0KKwkJCQkJCSAgICBzYnl0ZXNbaV07CisJCQkJCQlpZiAobl9yZW0gPCAwKQorCQkJCQkJCW5fcmVtID0gMDsKKwkJCQkJCS8qIEFwcGVuZCBwYXJ0IG9mIGJvZHkgaW50byBTX25ld1swXSAqLworCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCWJpLmJpX2JoID0gU19uZXdbaV07CisJCQkJCQliaS5iaV9wYXJlbnQgPSBOVUxMOworCQkJCQkJYmkuYmlfcG9zaXRpb24gPSAwOworCisJCQkJCQlpZiAobl9yZW0gPiB6ZXJvc19udW0pIHsKKwkJCQkJCQlyX3plcm9zX251bWJlciA9IDA7CisJCQkJCQkJcl9ib2R5ID0KKwkJCQkJCQkgICAgYm9keSArIG5fcmVtIC0KKwkJCQkJCQkgICAgemVyb3NfbnVtOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyX2JvZHkgPSBib2R5OworCQkJCQkJCXJfemVyb3NfbnVtYmVyID0KKwkJCQkJCQkgICAgemVyb3NfbnVtIC0gbl9yZW07CisJCQkJCQkJemVyb3NfbnVtIC09CisJCQkJCQkJICAgIHJfemVyb3NfbnVtYmVyOworCQkJCQkJfQorCisJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksIDAsCisJCQkJCQkJCSAgICAgbl9zaGlmdCwKKwkJCQkJCQkJICAgICB0Yi0+CisJCQkJCQkJCSAgICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgICBbMF0gLQorCQkJCQkJCQkgICAgIG5fcmVtLAorCQkJCQkJCQkgICAgIHJfYm9keSwKKwkJCQkJCQkJICAgICByX3plcm9zX251bWJlcik7CisJCQkJCQl7CisJCQkJCQkJc3RydWN0IGl0ZW1faGVhZCAqdG1wOworCisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgQl9OX1BJVEVNX0hFQUQoU19uZXcKKwkJCQkJCQkJCSAgIFtpXSwKKwkJCQkJCQkJCSAgIDApOworCQkJCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paAorCQkJCQkJCSAgICAodG1wKSkgeworCQkJCQkJCQlzZXRfaWhfZnJlZV9zcGFjZQorCQkJCQkJCQkgICAgKHRtcCwgMCk7CisJCQkJCQkJCXNldF9sZV9paF9rX29mZnNldAorCQkJCQkJCQkgICAgKHRtcCwKKwkJCQkJCQkJICAgICBsZV9paF9rX29mZnNldAorCQkJCQkJCQkgICAgICh0bXApICsKKwkJCQkJCQkJICAgICAobl9yZW0gPDwKKwkJCQkJCQkJICAgICAgKHRiLT4KKwkJCQkJCQkJICAgICAgIHRiX3NiLT4KKwkJCQkJCQkJICAgICAgIHNfYmxvY2tzaXplX2JpdHMKKwkJCQkJCQkJICAgICAgIC0KKwkJCQkJCQkJICAgICAgIFVORk1fUF9TSElGVCkpKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlzZXRfbGVfaWhfa19vZmZzZXQKKwkJCQkJCQkJICAgICh0bXAsCisJCQkJCQkJCSAgICAgbGVfaWhfa19vZmZzZXQKKwkJCQkJCQkJICAgICAodG1wKSArCisJCQkJCQkJCSAgICAgbl9yZW0pOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJdGItPmluc2VydF9zaXplWzBdID0gbl9yZW07CisJCQkJCQlpZiAoIW5fcmVtKQorCQkJCQkJCXBvc19pbl9pdGVtKys7CisJCQkJCX0KKwkJCQl9IGVsc2UKKwkJCQkJLyogaXRlbSBmYWxscyB3aG9sbHkgaW50byBTX25ld1tpXSAqLworCQkJCXsKKwkJCQkJaW50IHJldF92YWw7CisJCQkJCXN0cnVjdCBpdGVtX2hlYWQgKnBhc3RlZDsKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkICppaCA9CisJCQkJCSAgICBCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3Bvcyk7CisKKwkJCQkJaWYgKCFpc19kaXJlbnRyeV9sZV9paChpaCkKKwkJCQkJICAgICYmIChwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihpaCkKKwkJCQkJCXx8IHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwKSkKKwkJCQkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjIzNTogYmFsYW5jZV9sZWFmOiBwb3NfaW5faXRlbSBtdXN0IGJlIGVxdWFsIHRvIGloX2l0ZW1fbGVuIik7CisjZW5kaWYJCQkJLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCisKKwkJCQkJcmV0X3ZhbCA9CisJCQkJCSAgICBsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fU05FVywKKwkJCQkJCQkgICAgdGIsIHNudW1baV0sCisJCQkJCQkJICAgIHNieXRlc1tpXSwKKwkJCQkJCQkgICAgU19uZXdbaV0pOworCisJCQkJCVJGQUxTRShyZXRfdmFsLAorCQkJCQkgICAgICAgIlBBUC0xMjI0MDogdW5leHBlY3RlZCB2YWx1ZSByZXR1cm5lZCBieSBsZWFmX21vdmVfaXRlbXMgKCVkKSIsCisJCQkJCSAgICAgICByZXRfdmFsKTsKKworCQkJCQkvKiBwYXN0ZSBpbnRvIGl0ZW0gKi8KKwkJCQkJYmkudGIgPSB0YjsKKwkJCQkJYmkuYmlfYmggPSBTX25ld1tpXTsKKwkJCQkJYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJCQkJYmkuYmlfcG9zaXRpb24gPSAwOworCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksCisJCQkJCQkJICAgICBpdGVtX3BvcyAtIG4gKworCQkJCQkJCSAgICAgc251bVtpXSwKKwkJCQkJCQkgICAgIHBvc19pbl9pdGVtLAorCQkJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdLAorCQkJCQkJCSAgICAgYm9keSwgemVyb3NfbnVtKTsKKworCQkJCQlwYXN0ZWQgPQorCQkJCQkgICAgQl9OX1BJVEVNX0hFQUQoU19uZXdbaV0sCisJCQkJCQkJICAgaXRlbV9wb3MgLSBuICsKKwkJCQkJCQkgICBzbnVtW2ldKTsKKwkJCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loKHBhc3RlZCkpIHsKKwkJCQkJCWxlYWZfcGFzdGVfZW50cmllcyhiaS5iaV9iaCwKKwkJCQkJCQkJICAgaXRlbV9wb3MgLQorCQkJCQkJCQkgICBuICsgc251bVtpXSwKKwkJCQkJCQkJICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJCSAgIDEsCisJCQkJCQkJCSAgIChzdHJ1Y3QKKwkJCQkJCQkJICAgIHJlaXNlcmZzX2RlX2hlYWQKKwkJCQkJCQkJICAgICopYm9keSwKKwkJCQkJCQkJICAgYm9keSArCisJCQkJCQkJCSAgIERFSF9TSVpFLAorCQkJCQkJCQkgICB0Yi0+CisJCQkJCQkJCSAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgIFswXQorCQkJCQkJICAgICk7CisJCQkJCX0KKworCQkJCQkvKiBpZiB3ZSBwYXN0ZSB0byBpbmRpcmVjdCBpdGVtIHVwZGF0ZSBpaF9mcmVlX3NwYWNlICovCisJCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paChwYXN0ZWQpKQorCQkJCQkJc2V0X2loX2ZyZWVfc3BhY2UocGFzdGVkLCAwKTsKKwkJCQkJemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCWVsc2UgewkvKiBwYXN0ZWQgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBTX25ld1tpXSAqLworCisJCQkJbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLAorCQkJCQkJc251bVtpXSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogY2FzZXMgZCBhbmQgdCAqLworCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCSAgICAgICAiUEFQLTEyMjQ1OiBiYWxhbmNlX2xlYWY6IGJsa251bSA+IDI6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAorCQkJCSAgICAgICAoZmxhZyA9PQorCQkJCQlNX0RFTEVURSkgPyAiREVMRVRFIiA6ICgoZmxhZyA9PQorCQkJCQkJCQkgTV9DVVQpID8gIkNVVCIKKwkJCQkJCQkJOiAiVU5LTk9XTiIpLAorCQkJCSAgICAgICBmbGFnKTsKKwkJfQorCisJCW1lbWNweShpbnNlcnRfa2V5ICsgaSwgQl9OX1BLRVkoU19uZXdbaV0sIDApLCBLRVlfU0laRSk7CisJCWluc2VydF9wdHJbaV0gPSBTX25ld1tpXTsKKworCQlSRkFMU0UoIWJ1ZmZlcl9qb3VybmFsZWQoU19uZXdbaV0pCisJCSAgICAgICB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShTX25ld1tpXSkKKwkJICAgICAgIHx8IGJ1ZmZlcl9kaXJ0eShTX25ld1tpXSksICJQQVAtMTIyNDc6IFNfbmV3WyVkXSA6ICglYikiLAorCQkgICAgICAgaSwgU19uZXdbaV0pOworCX0KKworCS8qIGlmIHRoZSBhZmZlY3RlZCBpdGVtIHdhcyBub3Qgd2hvbGx5IHNoaWZ0ZWQgdGhlbiB3ZSBwZXJmb3JtIGFsbCBuZWNlc3Nhcnkgb3BlcmF0aW9ucyBvbiB0aGF0IHBhcnQgb3Igd2hvbGUgb2YgdGhlCisJICAgYWZmZWN0ZWQgaXRlbSB3aGljaCByZW1haW5zIGluIFMgKi8KKwlpZiAoMCA8PSBpdGVtX3BvcyAmJiBpdGVtX3BvcyA8IHRiLT5zMG51bSkgewkvKiBpZiB3ZSBtdXN0IGluc2VydCBvciBhcHBlbmQgaW50byBidWZmZXIgU1swXSAqLworCisJCXN3aXRjaCAoZmxhZykgeworCQljYXNlIE1fSU5TRVJUOgkvKiBpbnNlcnQgaXRlbSBpbnRvIFNbMF0gKi8KIAkJCWJpLnRiID0gdGI7Ci0JCQliaS5iaV9iaCA9IHRiLT5SWzBdOwotCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOwotCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSxpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSwgcG9zX2luX2l0ZW0sCi0JCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdLGJvZHksIHplcm9zX251bSk7Ci0JCSAgICB9CisJCQliaS5iaV9iaCA9IHRiUzA7CisJCQliaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCk7CisJCQliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgMSk7CisJCQlsZWFmX2luc2VydF9pbnRvX2J1ZigmYmksIGl0ZW1fcG9zLCBpaCwgYm9keSwKKwkJCQkJICAgICB6ZXJvc19udW0pOwogCi0JCSAgICAvKiBwYXN0ZSBuZXcgZW50cnksIGlmIGl0ZW0gaXMgZGlyZWN0b3J5IGl0ZW0gKi8KLQkJICAgIHBhc3RlZCA9IEJfTl9QSVRFTV9IRUFEKHRiLT5SWzBdLCBpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSk7Ci0JCSAgICBpZiAoaXNfZGlyZW50cnlfbGVfaWggKHBhc3RlZCkgJiYgcG9zX2luX2l0ZW0gPj0gMCApIHsKLQkJCWxlYWZfcGFzdGVfZW50cmllcyAoCi0JCQkgICAgYmkuYmlfYmgsIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdLCBwb3NfaW5faXRlbSwgMSwgCi0JCQkgICAgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwgYm9keSArIERFSF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0KLQkJCSAgICApOwotCQkJaWYgKCAhIHBvc19pbl9pdGVtICkgeworCQkJLyogSWYgd2UgaW5zZXJ0IHRoZSBmaXJzdCBrZXkgY2hhbmdlIHRoZSBkZWxpbWl0aW5nIGtleSAqLworCQkJaWYgKGl0ZW1fcG9zID09IDApIHsKKwkJCQlpZiAodGItPkNGTFswXSkJLyogY2FuIGJlIDAgaW4gcmVpc2VyZnNjayAqLworCQkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sCisJCQkJCQkgICAgdGJTMCwgMCk7CiAKLQkJCSAgICBSRkFMU0UoIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdLAotCQkJCSAgICAiUEFQLTEyMTY1OiBkaXJlY3RvcnkgaXRlbSBtdXN0IGJlIGZpcnN0IGl0ZW0gb2Ygbm9kZSB3aGVuIHBhc3RpbmcgaXMgaW4gMHRoIHBvc2l0aW9uIik7Ci0KLQkJCSAgICAvKiB1cGRhdGUgZGVsaW1pdGluZyBrZXlzICovCi0JCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CiAJCQl9Ci0JCSAgICB9CisJCQlicmVhazsKIAotCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChwYXN0ZWQpKQotCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHBhc3RlZCwgMCk7Ci0JCSAgICB6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQljYXNlIE1fUEFTVEU6ewkvKiBhcHBlbmQgaXRlbSBpbiBTWzBdICovCisJCQkJc3RydWN0IGl0ZW1faGVhZCAqcGFzdGVkOworCisJCQkJcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpOworCQkJCS8qIHdoZW4gZGlyZWN0b3J5LCBtYXkgYmUgbmV3IGVudHJ5IGFscmVhZHkgcGFzdGVkICovCisJCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loKHBhc3RlZCkpIHsKKwkJCQkJaWYgKHBvc19pbl9pdGVtID49IDAgJiYKKwkJCQkJICAgIHBvc19pbl9pdGVtIDw9CisJCQkJCSAgICBpaF9lbnRyeV9jb3VudChwYXN0ZWQpKSB7CisKKwkJCQkJCVJGQUxTRSghdGItPmluc2VydF9zaXplWzBdLAorCQkJCQkJICAgICAgICJQQVAtMTIyNjA6IGluc2VydF9zaXplIGlzIDAgYWxyZWFkeSIpOworCisJCQkJCQkvKiBwcmVwYXJlIHNwYWNlICovCisJCQkJCQliaS50YiA9IHRiOworCQkJCQkJYmkuYmlfYmggPSB0YlMwOworCQkJCQkJYmkuYmlfcGFyZW50ID0KKwkJCQkJCSAgICBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwKKwkJCQkJCQkJICAgMCk7CisJCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCQkgICAgUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLAorCQkJCQkJCQkgICAgMSk7CisJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksCisJCQkJCQkJCSAgICAgaXRlbV9wb3MsCisJCQkJCQkJCSAgICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJCSAgICAgdGItPgorCQkJCQkJCQkgICAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgICAgWzBdLCBib2R5LAorCQkJCQkJCQkgICAgIHplcm9zX251bSk7CisKKwkJCQkJCS8qIHBhc3RlIGVudHJ5ICovCisJCQkJCQlsZWFmX3Bhc3RlX2VudHJpZXMoYmkuYmlfYmgsCisJCQkJCQkJCSAgIGl0ZW1fcG9zLAorCQkJCQkJCQkgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkJICAgMSwKKwkJCQkJCQkJICAgKHN0cnVjdAorCQkJCQkJCQkgICAgcmVpc2VyZnNfZGVfaGVhZAorCQkJCQkJCQkgICAgKilib2R5LAorCQkJCQkJCQkgICBib2R5ICsKKwkJCQkJCQkJICAgREVIX1NJWkUsCisJCQkJCQkJCSAgIHRiLT4KKwkJCQkJCQkJICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgWzBdCisJCQkJCQkgICAgKTsKKwkJCQkJCWlmICghaXRlbV9wb3MgJiYgIXBvc19pbl9pdGVtKSB7CisJCQkJCQkJUkZBTFNFKCF0Yi0+Q0ZMWzBdCisJCQkJCQkJICAgICAgIHx8ICF0Yi0+TFswXSwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjI3MDogQ0ZMWzBdL0xbMF0gbXVzdCBiZSBzcGVjaWZpZWQiKTsKKwkJCQkJCQlpZiAodGItPkNGTFswXSkgeworCQkJCQkJCQlyZXBsYWNlX2tleSh0YiwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgQ0ZMCisJCQkJCQkJCQkgICAgWzBdLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBsa2V5CisJCQkJCQkJCQkgICAgWzBdLAorCQkJCQkJCQkJICAgIHRiUzAsCisJCQkJCQkJCQkgICAgMCk7CisKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLyogcmVndWxhciBvYmplY3QgKi8KKwkJCQkJaWYgKHBvc19pbl9pdGVtID09IGloX2l0ZW1fbGVuKHBhc3RlZCkpIHsKKworCQkJCQkJUkZBTFNFKHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwLAorCQkJCQkJICAgICAgICJQQVAtMTIyNzU6IGluc2VydCBzaXplIG11c3Qgbm90IGJlICVkIiwKKwkJCQkJCSAgICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0pOworCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCWJpLmJpX2JoID0gdGJTMDsKKwkJCQkJCWJpLmJpX3BhcmVudCA9CisJCQkJCQkgICAgUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsCisJCQkJCQkJCSAgIDApOworCQkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkJICAgIFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwKKwkJCQkJCQkJICAgIDEpOworCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLAorCQkJCQkJCQkgICAgIGl0ZW1fcG9zLAorCQkJCQkJCQkgICAgIHBvc19pbl9pdGVtLAorCQkJCQkJCQkgICAgIHRiLT4KKwkJCQkJCQkJICAgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICAgIFswXSwgYm9keSwKKwkJCQkJCQkJICAgICB6ZXJvc19udW0pOworCisJCQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgocGFzdGVkKSkgeworI2lmIDAKKwkJCQkJCQlSRkFMU0UodGItPgorCQkJCQkJCSAgICAgICBpbnNlcnRfc2l6ZVswXSAhPQorCQkJCQkJCSAgICAgICBVTkZNX1BfU0laRSwKKwkJCQkJCQkgICAgICAgIlBBUC0xMjI4MDogaW5zZXJ0X3NpemUgZm9yIGluZGlyZWN0IGl0ZW0gbXVzdCBiZSAlZCwgbm90ICVkIiwKKwkJCQkJCQkgICAgICAgVU5GTV9QX1NJWkUsCisJCQkJCQkJICAgICAgIHRiLT4KKwkJCQkJCQkgICAgICAgaW5zZXJ0X3NpemVbMF0pOworI2VuZGlmCisJCQkJCQkJc2V0X2loX2ZyZWVfc3BhY2UKKwkJCQkJCQkgICAgKHBhc3RlZCwgMCk7CisJCQkJCQl9CisJCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCQl9CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCQkJCWVsc2UgeworCQkJCQkJaWYgKHRiLT5pbnNlcnRfc2l6ZVswXSkgeworCQkJCQkJCXByaW50X2N1cl90YigiMTIyODUiKTsKKwkJCQkJCQlyZWlzZXJmc19wYW5pYyh0Yi0+CisJCQkJCQkJCSAgICAgICB0Yl9zYiwKKwkJCQkJCQkJICAgICAgICJQQVAtMTIyODU6IGJhbGFuY2VfbGVhZjogaW5zZXJ0X3NpemUgbXVzdCBiZSAwICglZCkiLAorCQkJCQkJCQkgICAgICAgdGItPgorCQkJCQkJCQkgICAgICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgICAgIFswXSk7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KKworCQkJCX0KKwkJCX0JLyogY2FzZSBNX1BBU1RFOiAqLwogCQl9Ci0JICAgIH0KLQkgICAgZWxzZSAvKiBuZXcgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBSWzBdICovCi0JICAgIHsKLQkJbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzKTsKLQkgICAgfQotCSAgICBicmVhazsKLQlkZWZhdWx0OiAgICAvKiBjYXNlcyBkIGFuZCB0ICovCi0JICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIxNzU6IGJhbGFuY2VfbGVhZjogcm51bSA+IDA6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAotCQkJICAgIChmbGFnID09IE1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09IE1fQ1VUKSA/ICJDVVQiIDogIlVOS05PV04iKSwgZmxhZyk7CiAJfQotICAgIAotICAgIH0JLyogdGItPnJudW1bMF0gPiAwICovCi0KLQotICAgIFJGQUxTRSggdGItPmJsa251bVswXSA+IDMsCi0JICAgICJQQVAtMTIxODA6IGJsa251bSBjYW4gbm90IGJlICVkLiBJdCBtdXN0IGJlIDw9IDMiLCAgdGItPmJsa251bVswXSk7Ci0gICAgUkZBTFNFKCB0Yi0+YmxrbnVtWzBdIDwgMCwKLQkgICAgIlBBUC0xMjE4NTogYmxrbnVtIGNhbiBub3QgYmUgJWQuIEl0IG11c3QgYmUgPj0gMCIsICB0Yi0+YmxrbnVtWzBdKTsKLQotICAgIC8qIGlmIHdoaWxlIGFkZGluZyB0byBhIG5vZGUgd2UgZGlzY292ZXIgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBzcGxpdAotICAgICAgIGl0IGluIHR3bywgYW5kIG1lcmdlIHRoZSBsZWZ0IHBhcnQgaW50byB0aGUgbGVmdCBuZWlnaGJvciBhbmQgdGhlCi0gICAgICAgcmlnaHQgcGFydCBpbnRvIHRoZSByaWdodCBuZWlnaGJvciwgZWxpbWluYXRpbmcgdGhlIG5vZGUgKi8KLSAgICBpZiAoIHRiLT5ibGtudW1bMF0gPT0gMCApIHsgLyogbm9kZSBTWzBdIGlzIGVtcHR5IG5vdyAqLwotCi0JUkZBTFNFKCAhIHRiLT5sbnVtWzBdIHx8ICEgdGItPnJudW1bMF0sCi0JICAgICAgICAiUEFQLTEyMTkwOiBsbnVtIGFuZCBybnVtIG11c3Qgbm90IGJlIHplcm8iKTsKLQkvKiBpZiBpbnNlcnRpb24gd2FzIGRvbmUgYmVmb3JlIDAtdGggcG9zaXRpb24gaW4gUlswXSwgcmlnaHQKLQkgICBkZWxpbWl0aW5nIGtleSBvZiB0aGUgdGItPkxbMF0ncyBhbmQgbGVmdCBkZWxpbWl0aW5nIGtleSBhcmUKLQkgICBub3Qgc2V0IGNvcnJlY3RseSAqLwotCWlmICh0Yi0+Q0ZMWzBdKSB7Ci0JICAgIGlmICghdGItPkNGUlswXSkKLQkJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTEyMTk1OiBiYWxhbmNlX2xlYWY6IENGUiBub3QgaW5pdGlhbGl6ZWQiKTsKLQkgICAgY29weV9rZXkgKEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSksIEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSkpOwotCSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0Yi0+Q0ZMWzBdLCAwKTsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwlpZiAoZmxhZyA9PSBNX1BBU1RFICYmIHRiLT5pbnNlcnRfc2l6ZVswXSkgeworCQlwcmludF9jdXJfdGIoIjEyMjkwIik7CisJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCSAgICAgICAiUEFQLTEyMjkwOiBiYWxhbmNlX2xlYWY6IGluc2VydF9zaXplIGlzIHN0aWxsIG5vdCAwICglZCkiLAorCQkJICAgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSk7CiAJfQorI2VuZGlmCQkJCS8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLwogCi0JcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsdGJTMCk7CQkJCQkJCQkJCiAJcmV0dXJuIDA7Ci0gICAgfQotCi0KLSAgICAvKiBGaWxsIG5ldyBub2RlcyB0aGF0IGFwcGVhciBpbiBwbGFjZSBvZiBTWzBdICovCi0KLSAgICAvKiBJIGFtIHRvbGQgdGhhdCB0aGlzIGNvcHlpbmcgaXMgYmVjYXVzZSB3ZSBuZWVkIGFuIGFycmF5IHRvIGVuYWJsZQotICAgICAgIHRoZSBsb29waW5nIGNvZGUuIC1IYW5zICovCi0gICAgc251bVswXSA9IHRiLT5zMW51bSwKLQlzbnVtWzFdID0gdGItPnMybnVtOwotICAgIHNieXRlc1swXSA9IHRiLT5zMWJ5dGVzOwotICAgIHNieXRlc1sxXSA9IHRiLT5zMmJ5dGVzOwotICAgIGZvciggaSA9IHRiLT5ibGtudW1bMF0gLSAyOyBpID49IDA7IGktLSApIHsKLQotCVJGQUxTRSggIXNudW1baV0sICJQQVAtMTIyMDA6IHNudW1bJWRdID09ICVkLiBNdXN0IGJlID4gMCIsIGksIHNudW1baV0pOwotCi0JLyogaGVyZSB3ZSBzaGlmdCBmcm9tIFMgdG8gU19uZXcgbm9kZXMgKi8KLQotCVNfbmV3W2ldID0gZ2V0X0ZFQih0Yik7Ci0KLQkvKiBpbml0aWFsaXplZCBibG9jayB0eXBlIGFuZCB0cmVlIGxldmVsICovCi0gICAgICAgIHNldF9ibGtoX2xldmVsKCBCX0JMS19IRUFEKFNfbmV3W2ldKSwgRElTS19MRUFGX05PREVfTEVWRUwgKTsKLQotCi0JbiA9IEJfTlJfSVRFTVModGJTMCk7Ci0JCi0Jc3dpdGNoIChmbGFnKSB7Ci0JY2FzZSBNX0lOU0VSVDogICAvKiBpbnNlcnQgaXRlbSAqLwotCi0JICAgIGlmICggbiAtIHNudW1baV0gPCBpdGVtX3BvcyApCi0JICAgIHsgLyogbmV3IGl0ZW0gb3IgaXQncyBwYXJ0IGZhbGxzIHRvIGZpcnN0IG5ldyBub2RlIFNfbmV3W2ldKi8KLQkJaWYgKCBpdGVtX3BvcyA9PSBuIC0gc251bVtpXSArIDEgJiYgc2J5dGVzW2ldICE9IC0xICkKLQkJeyAvKiBwYXJ0IG9mIG5ldyBpdGVtIGZhbGxzIGludG8gU19uZXdbaV0gKi8KLQkJICAgIGludCBvbGRfa2V5X2NvbXAsIG9sZF9sZW4sIHJfemVyb3NfbnVtYmVyOwotCQkgICAgY29uc3QgY2hhciAqIHJfYm9keTsKLQkJICAgIGludCB2ZXJzaW9uOwotCi0JCSAgICAvKiBNb3ZlIHNudW1baV0tMSBpdGVtcyBmcm9tIFNbMF0gdG8gU19uZXdbaV0gKi8KLQkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0gLSAxLCAtMSwgU19uZXdbaV0pOwotCQkgICAgLyogUmVtZW1iZXIga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggKi8KLQkJICAgIHZlcnNpb24gPSBpaF92ZXJzaW9uIChpaCk7Ci0gICAgICAgICAgICAgICAgICAgIG9sZF9rZXlfY29tcCA9IGxlX2loX2tfb2Zmc2V0KCBpaCApOwotCQkgICAgb2xkX2xlbiA9IGloX2l0ZW1fbGVuKGloKTsKLQotCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFNfbmV3W2ldICovCi0gICAgICAgICAgICAgICAgICAgIHNldF9sZV9paF9rX29mZnNldCggaWgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlX2loX2tfb2Zmc2V0KGloKSArICgob2xkX2xlbiAtIHNieXRlc1tpXSApPDwoaXNfaW5kaXJlY3RfbGVfaWgoaWgpP3RiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtIFVORk1fUF9TSElGVDowKSkgKTsKLQotCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgc2J5dGVzW2ldICk7Ci0KLQkJICAgIC8qIEluc2VydCBwYXJ0IG9mIHRoZSBpdGVtIGludG8gU19uZXdbaV0gYmVmb3JlIDAtdGggaXRlbSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gU19uZXdbaV07Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSAwOwotCi0JCSAgICBpZiAoIChvbGRfbGVuIC0gc2J5dGVzW2ldKSA+IHplcm9zX251bSApIHsKLQkJCXJfemVyb3NfbnVtYmVyID0gMDsKLQkJCXJfYm9keSA9IGJvZHkgKyAob2xkX2xlbiAtIHNieXRlc1tpXSkgLSB6ZXJvc19udW07Ci0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCXJfYm9keSA9IGJvZHk7Ci0JCQlyX3plcm9zX251bWJlciA9IHplcm9zX251bSAtIChvbGRfbGVuIC0gc2J5dGVzW2ldKTsKLQkJCXplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKLQkJICAgIH0KLQotCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgMCwgaWgsIHJfYm9keSwgcl96ZXJvc19udW1iZXIpOwotCi0JCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gU1tpXSAqLwotICAgICAgICAgICAgICAgICAgICBzZXRfbGVfaWhfa19vZmZzZXQoIGloLCBvbGRfa2V5X2NvbXAgKTsKLQkJICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIG9sZF9sZW4gLSBzYnl0ZXNbaV0gKTsKLQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSAtPSBzYnl0ZXNbaV07Ci0JCX0KLQkJZWxzZSAvKiB3aG9sZSBuZXcgaXRlbSBmYWxscyBpbnRvIFNfbmV3W2ldICovCi0JCXsKLQkJICAgIC8qIFNoaWZ0IHNudW1bMF0gLSAxIGl0ZW1zIHRvIFNfbmV3W2ldIChzYnl0ZXNbaV0gb2Ygc3BsaXQgaXRlbSkgKi8KLQkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0gLSAxLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKLQotCQkgICAgLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gU19uZXdbaV0gKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IFNfbmV3W2ldOwotCQkgICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gMDsKLQkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIGl0ZW1fcG9zIC0gbiArIHNudW1baV0gLSAxLCBpaCwgYm9keSwgemVyb3NfbnVtKTsKLQotCQkgICAgemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgICAgZWxzZSAvKiBuZXcgaXRlbSBvciBpdCBwYXJ0IGRvbid0IGZhbGxzIGludG8gU19uZXdbaV0gKi8KLQkgICAgewotCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgTV9QQVNURTogICAvKiBhcHBlbmQgaXRlbSAqLwotCi0JICAgIGlmICggbiAtIHNudW1baV0gPD0gaXRlbV9wb3MgKSAgLyogcGFzdGVkIGl0ZW0gb3IgcGFydCBpZiBpdCBmYWxscyB0byBTX25ld1tpXSAqLwotCSAgICB7Ci0JCWlmICggaXRlbV9wb3MgPT0gbiAtIHNudW1baV0gJiYgc2J5dGVzW2ldICE9IC0xICkKLQkJeyAvKiB3ZSBtdXN0IHNoaWZ0IHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KLQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBhdXhfaWg7Ci0KLQkJICAgIFJGQUxTRSggaWgsICJQQVAtMTIyMTA6IGloIG11c3QgYmUgMCIpOwotCi0JCSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChhdXhfaWggPSBCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSkpIHsKLQkJCS8qIHdlIGFwcGVuZCB0byBkaXJlY3RvcnkgaXRlbSAqLwotCi0JCQlpbnQgZW50cnlfY291bnQ7Ci0JCQotCQkJZW50cnlfY291bnQgPSBpaF9lbnRyeV9jb3VudChhdXhfaWgpOwotCi0JCQlpZiAoIGVudHJ5X2NvdW50IC0gc2J5dGVzW2ldIDwgcG9zX2luX2l0ZW0gICYmIHBvc19pbl9pdGVtIDw9IGVudHJ5X2NvdW50ICkgewotCQkJICAgIC8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZmFsbHMgaW50byBTX25ld1tpXSAqLwotCQkgIAotCQkJICAgIFJGQUxTRSggISB0Yi0+aW5zZXJ0X3NpemVbMF0sCi0JCQkJICAgICJQQVAtMTIyMTU6IGluc2VydF9zaXplIGlzIGFscmVhZHkgMCIpOwotCQkJICAgIFJGQUxTRSggc2J5dGVzW2ldIC0gMSA+PSBlbnRyeV9jb3VudCwKLQkJCQkgICAgIlBBUC0xMjIyMDogdGhlcmUgYXJlIG5vIHNvIG11Y2ggZW50cmllcyAoJWQpLCBvbmx5ICVkIiwKLQkJCQkgICAgc2J5dGVzW2ldIC0gMSwgZW50cnlfY291bnQpOwotCi0JCQkgICAgLyogU2hpZnQgc251bVtpXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBzYnl0ZXNbaV0gZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgc251bVtpXSAqLwotCQkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXS0xLCBTX25ld1tpXSk7Ci0JCQkgICAgLyogUGFzdGUgZ2l2ZW4gZGlyZWN0b3J5IGVudHJ5IHRvIGRpcmVjdG9yeSBpdGVtICovCi0JCQkgICAgYmkudGIgPSB0YjsKLQkJCSAgICBiaS5iaV9iaCA9IFNfbmV3W2ldOwotCQkJICAgIGJpLmJpX3BhcmVudCA9IE5VTEw7Ci0JCQkgICAgYmkuYmlfcG9zaXRpb24gPSAwOwotCQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIDAsIHBvc19pbl9pdGVtIC0gZW50cnlfY291bnQgKyBzYnl0ZXNbaV0gLSAxLAotCQkJCQkJICB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksemVyb3NfbnVtKTsKLQkJCSAgICAvKiBwYXN0ZSBuZXcgZGlyZWN0b3J5IGVudHJ5ICovCi0JCQkgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCQliaS5iaV9iaCwgMCwgcG9zX2luX2l0ZW0gLSBlbnRyeV9jb3VudCArIHNieXRlc1tpXSAtIDEsCi0JCQkJMSwgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwgYm9keSArIERFSF9TSVpFLAotCQkJCXRiLT5pbnNlcnRfc2l6ZVswXQotCQkJCSk7Ci0JCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJCSAgICBwb3NfaW5faXRlbSsrOwotCQkJfSBlbHNlIHsgLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBkb2Vzbid0IGZhbGwgaW50byBTX25ld1tpXSAqLwotCQkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOwotCQkJfQotCQkgICAgfQotCQkgICAgZWxzZSAvKiByZWd1bGFyIG9iamVjdCAqLwotCQkgICAgewotCQkJaW50IG5fc2hpZnQsIG5fcmVtLCByX3plcm9zX251bWJlcjsKLQkJCWNvbnN0IGNoYXIgKiByX2JvZHk7Ci0KLQkJCVJGQUxTRSggcG9zX2luX2l0ZW0gIT0gaWhfaXRlbV9sZW4oQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpIHx8Ci0JCQkgICAgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwLAotCQkJICAgICAgICAiUEFQLTEyMjI1OiBpdGVtIHRvbyBzaG9ydCBvciBpbnNlcnRfc2l6ZSA8PSAwIik7Ci0KLQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCBiZSBzaGlmdGVkIGZyb20gYXBwZW5kZWQgaXRlbSAqLwotCQkJbl9zaGlmdCA9IHNieXRlc1tpXSAtIHRiLT5pbnNlcnRfc2l6ZVswXTsKLQkJCWlmICggbl9zaGlmdCA8IDAgKQotCQkJICAgIG5fc2hpZnQgPSAwOwotCQkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgbl9zaGlmdCwgU19uZXdbaV0pOwotCi0JCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgcmVtYWluIGluIGJvZHkgYWZ0ZXIgYXBwZW5kIHRvIFNfbmV3W2ldICovCi0JCQluX3JlbSA9IHRiLT5pbnNlcnRfc2l6ZVswXSAtIHNieXRlc1tpXTsKLQkJCWlmICggbl9yZW0gPCAwICkKLQkJCSAgICBuX3JlbSA9IDA7Ci0JCQkvKiBBcHBlbmQgcGFydCBvZiBib2R5IGludG8gU19uZXdbMF0gKi8KLQkJCWJpLnRiID0gdGI7Ci0JCQliaS5iaV9iaCA9IFNfbmV3W2ldOwotCQkJYmkuYmlfcGFyZW50ID0gTlVMTDsKLQkJCWJpLmJpX3Bvc2l0aW9uID0gMDsKLQotCQkJaWYgKCBuX3JlbSA+IHplcm9zX251bSApIHsKLQkJCSAgICByX3plcm9zX251bWJlciA9IDA7Ci0JCQkgICAgcl9ib2R5ID0gYm9keSArIG5fcmVtIC0gemVyb3NfbnVtOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgICAgcl9ib2R5ID0gYm9keTsKLQkJCSAgICByX3plcm9zX251bWJlciA9IHplcm9zX251bSAtIG5fcmVtOwotCQkJICAgIHplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKLQkJCX0KLQotCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCAwLCBuX3NoaWZ0LCB0Yi0+aW5zZXJ0X3NpemVbMF0tbl9yZW0sIHJfYm9keSxyX3plcm9zX251bWJlcik7Ci0JCQl7Ci0JCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHRtcDsKLQotCQkJICAgIHRtcCA9IEJfTl9QSVRFTV9IRUFEKFNfbmV3W2ldLDApOwotCQkJICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAodG1wKSkgewotCQkJCXNldF9paF9mcmVlX3NwYWNlICh0bXAsIDApOwotCQkJCXNldF9sZV9paF9rX29mZnNldCggdG1wLCBsZV9paF9rX29mZnNldCh0bXApICsgCi0JCQkJCSAgICAgICAgICAgIChuX3JlbSA8PCAodGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUKSkpOwotCQkJICAgIH0gZWxzZSB7Ci0JCQkJc2V0X2xlX2loX2tfb2Zmc2V0KCB0bXAsIGxlX2loX2tfb2Zmc2V0KHRtcCkgKyAKLQkJCQkgICAgICAgICAgICAgICAgICAgIG5fcmVtICk7Ci0JCQkgICAgfQotCQkJfQotCi0JCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSBuX3JlbTsKLQkJCWlmICggISBuX3JlbSApCi0JCQkgICAgcG9zX2luX2l0ZW0rKzsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICAvKiBpdGVtIGZhbGxzIHdob2xseSBpbnRvIFNfbmV3W2ldICovCi0JCXsKLQkJICAgIGludCByZXRfdmFsOwotCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBhc3RlZDsKLQotI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloID0gQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3Bvcyk7Ci0KLQkJICAgIGlmICggISBpc19kaXJlbnRyeV9sZV9paChpaCkgJiYgKHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKGloKSB8fAotCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCkgKQotCQkJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjIzNTogYmFsYW5jZV9sZWFmOiBwb3NfaW5faXRlbSBtdXN0IGJlIGVxdWFsIHRvIGloX2l0ZW1fbGVuIik7Ci0jZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCi0KLQkJICAgIHJldF92YWwgPSBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKLQotCQkgICAgUkZBTFNFKCByZXRfdmFsLAotCQkJICAgICJQQVAtMTIyNDA6IHVuZXhwZWN0ZWQgdmFsdWUgcmV0dXJuZWQgYnkgbGVhZl9tb3ZlX2l0ZW1zICglZCkiLAotCQkJICAgIHJldF92YWwpOwotCi0JCSAgICAvKiBwYXN0ZSBpbnRvIGl0ZW0gKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IFNfbmV3W2ldOwotCQkgICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gMDsKLQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgaXRlbV9wb3MgLSBuICsgc251bVtpXSwgcG9zX2luX2l0ZW0sIHRiLT5pbnNlcnRfc2l6ZVswXSwgYm9keSwgemVyb3NfbnVtKTsKLQotCQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQoU19uZXdbaV0sIGl0ZW1fcG9zIC0gbiArIHNudW1baV0pOwotCQkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpKQotCQkgICAgewotCQkJbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCSAgICBiaS5iaV9iaCwgaXRlbV9wb3MgLSBuICsgc251bVtpXSwgcG9zX2luX2l0ZW0sIDEsIAotCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIGJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCi0JCQkgICAgKTsKLQkJICAgIH0KLQotCQkgICAgLyogaWYgd2UgcGFzdGUgdG8gaW5kaXJlY3QgaXRlbSB1cGRhdGUgaWhfZnJlZV9zcGFjZSAqLwotCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChwYXN0ZWQpKQotCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHBhc3RlZCwgMCk7Ci0JCSAgICB6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgICBlbHNlIC8qIHBhc3RlZCBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIFNfbmV3W2ldICovCi0JICAgIHsKLQkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDogICAgLyogY2FzZXMgZCBhbmQgdCAqLwotCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMjQ1OiBiYWxhbmNlX2xlYWY6IGJsa251bSA+IDI6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAotCQkJICAgIChmbGFnID09IE1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09IE1fQ1VUKSA/ICJDVVQiIDogIlVOS05PV04iKSwgZmxhZyk7Ci0JfQotCi0JbWVtY3B5IChpbnNlcnRfa2V5ICsgaSxCX05fUEtFWShTX25ld1tpXSwwKSxLRVlfU0laRSk7Ci0JaW5zZXJ0X3B0cltpXSA9IFNfbmV3W2ldOwotCi0JUkZBTFNFICghYnVmZmVyX2pvdXJuYWxlZCAoU19uZXcgW2ldKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eSAoU19uZXcgW2ldKSB8fAotCQlidWZmZXJfZGlydHkgKFNfbmV3IFtpXSksCi0JCSJQQVAtMTIyNDc6IFNfbmV3WyVkXSA6ICglYikiLCBpLCBTX25ld1tpXSk7Ci0gICAgfQotCi0gICAgLyogaWYgdGhlIGFmZmVjdGVkIGl0ZW0gd2FzIG5vdCB3aG9sbHkgc2hpZnRlZCB0aGVuIHdlIHBlcmZvcm0gYWxsIG5lY2Vzc2FyeSBvcGVyYXRpb25zIG9uIHRoYXQgcGFydCBvciB3aG9sZSBvZiB0aGUKLSAgICAgICBhZmZlY3RlZCBpdGVtIHdoaWNoIHJlbWFpbnMgaW4gUyAqLwotICAgIGlmICggMCA8PSBpdGVtX3BvcyAmJiBpdGVtX3BvcyA8IHRiLT5zMG51bSApCi0gICAgeyAvKiBpZiB3ZSBtdXN0IGluc2VydCBvciBhcHBlbmQgaW50byBidWZmZXIgU1swXSAqLwotCi0Jc3dpdGNoIChmbGFnKQotCXsKLQljYXNlIE1fSU5TRVJUOiAgIC8qIGluc2VydCBpdGVtIGludG8gU1swXSAqLwotCSAgICBiaS50YiA9IHRiOwotCSAgICBiaS5iaV9iaCA9IHRiUzA7Ci0JICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7Ci0JICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7Ci0JICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIGl0ZW1fcG9zLCBpaCwgYm9keSwgemVyb3NfbnVtKTsKLQotCSAgICAvKiBJZiB3ZSBpbnNlcnQgdGhlIGZpcnN0IGtleSBjaGFuZ2UgdGhlIGRlbGltaXRpbmcga2V5ICovCi0JICAgIGlmKCBpdGVtX3BvcyA9PSAwICkgewotCQlpZiAodGItPkNGTFswXSkgLyogY2FuIGJlIDAgaW4gcmVpc2VyZnNjayAqLwotCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLHRiUzAsMCk7Ci0KLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgTV9QQVNURTogeyAgLyogYXBwZW5kIGl0ZW0gaW4gU1swXSAqLwotCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOwotCi0JICAgIHBhc3RlZCA9IEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3Bvcyk7Ci0JICAgIC8qIHdoZW4gZGlyZWN0b3J5LCBtYXkgYmUgbmV3IGVudHJ5IGFscmVhZHkgcGFzdGVkICovCi0JICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAocGFzdGVkKSkgewotCQlpZiAoIHBvc19pbl9pdGVtID49IDAgJiYKLQkJICAgIHBvc19pbl9pdGVtIDw9IGloX2VudHJ5X2NvdW50KHBhc3RlZCkgKSB7Ci0KLQkJICAgIFJGQUxTRSggISB0Yi0+aW5zZXJ0X3NpemVbMF0sIAotCQkJICAgICJQQVAtMTIyNjA6IGluc2VydF9zaXplIGlzIDAgYWxyZWFkeSIpOwotCi0JCSAgICAvKiBwcmVwYXJlIHNwYWNlICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSB0YlMwOwotCQkgICAgYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7Ci0JCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwgdGItPmluc2VydF9zaXplWzBdLCBib2R5LCB6ZXJvc19udW0pOwotCi0JCSAgICAvKiBwYXN0ZSBlbnRyeSAqLwotCQkgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCWJpLmJpX2JoLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sIDEsIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksCi0JCQlib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQotCQkJKTsKLQkJICAgIGlmICggISBpdGVtX3BvcyAmJiAhIHBvc19pbl9pdGVtICkgewotCQkJUkZBTFNFKCAhdGItPkNGTFswXSB8fCAhdGItPkxbMF0sIAotCQkJCSJQQVAtMTIyNzA6IENGTFswXS9MWzBdIG11c3QgYmUgc3BlY2lmaWVkIik7Ci0JCQlpZiAodGItPkNGTFswXSkgewotCQkJICAgIHJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSx0YlMwLDApOwotCi0JCQl9Ci0JCSAgICB9Ci0JCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQl9Ci0JICAgIH0gZWxzZSB7IC8qIHJlZ3VsYXIgb2JqZWN0ICovCi0JCWlmICggcG9zX2luX2l0ZW0gPT0gaWhfaXRlbV9sZW4ocGFzdGVkKSApIHsKLQotCQkgICAgUkZBTFNFKCB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCwKLQkJCSAgICAiUEFQLTEyMjc1OiBpbnNlcnQgc2l6ZSBtdXN0IG5vdCBiZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGItPmluc2VydF9zaXplWzBdKTsKLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IHRiUzA7Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKLQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwgdGItPmluc2VydF9zaXplWzBdLCBib2R5LCB6ZXJvc19udW0pOwotCi0JCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKHBhc3RlZCkpIHsKLSNpZiAwCi0JCQlSRkFMU0UoIHRiLT5pbnNlcnRfc2l6ZVswXSAhPSBVTkZNX1BfU0laRSwKLQkJCQkiUEFQLTEyMjgwOiBpbnNlcnRfc2l6ZSBmb3IgaW5kaXJlY3QgaXRlbSBtdXN0IGJlICVkLCBub3QgJWQiLAotCQkJCVVORk1fUF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0pOwotI2VuZGlmCi0JCQlzZXRfaWhfZnJlZV9zcGFjZSAocGFzdGVkLCAwKTsKLQkJICAgIH0KLQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCQllbHNlIHsKLQkJICAgIGlmICggdGItPmluc2VydF9zaXplWzBdICkgewotCQkJcHJpbnRfY3VyX3RiICgiMTIyODUiKTsKLQkJCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIyODU6IGJhbGFuY2VfbGVhZjogaW5zZXJ0X3NpemUgbXVzdCBiZSAwICglZCkiLCB0Yi0+aW5zZXJ0X3NpemVbMF0pOwotCQkgICAgfQotCQl9Ci0jZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCi0JICAgIAotCSAgICB9Ci0JfSAvKiBjYXNlIE1fUEFTVEU6ICovCi0JfQotICAgIH0KLQotI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGlmICggZmxhZyA9PSBNX1BBU1RFICYmIHRiLT5pbnNlcnRfc2l6ZVswXSApIHsKLQlwcmludF9jdXJfdGIgKCIxMjI5MCIpOwotCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIyOTA6IGJhbGFuY2VfbGVhZjogaW5zZXJ0X3NpemUgaXMgc3RpbGwgbm90IDAgKCVkKSIsIHRiLT5pbnNlcnRfc2l6ZVswXSk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLwotCi0gICAgcmV0dXJuIDA7Ci19IC8qIExlYWYgbGV2ZWwgb2YgdGhlIHRyZWUgaXMgYmFsYW5jZWQgKGVuZCBvZiBiYWxhbmNlX2xlYWYpICovCi0KLQorfQkJCQkvKiBMZWFmIGxldmVsIG9mIHRoZSB0cmVlIGlzIGJhbGFuY2VkIChlbmQgb2YgYmFsYW5jZV9sZWFmKSAqLwogCiAvKiBNYWtlIGVtcHR5IG5vZGUgKi8KLXZvaWQgbWFrZV9lbXB0eV9ub2RlIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSkKK3ZvaWQgbWFrZV9lbXB0eV9ub2RlKHN0cnVjdCBidWZmZXJfaW5mbyAqYmkpCiB7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOwogCi0gICAgUkZBTFNFKCBiaS0+YmlfYmggPT0gTlVMTCwgIlBBUC0xMjI5NTogcG9pbnRlciB0byB0aGUgYnVmZmVyIGlzIE5VTEwiKTsKKwlSRkFMU0UoYmktPmJpX2JoID09IE5VTEwsICJQQVAtMTIyOTU6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpcyBOVUxMIik7CiAKLSAgICBibGtoID0gQl9CTEtfSEVBRChiaS0+YmlfYmgpOwotICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIDAgKTsKLSAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBNQVhfQ0hJTERfU0laRShiaS0+YmlfYmgpICk7CisJYmxraCA9IEJfQkxLX0hFQUQoYmktPmJpX2JoKTsKKwlzZXRfYmxraF9ucl9pdGVtKGJsa2gsIDApOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgTUFYX0NISUxEX1NJWkUoYmktPmJpX2JoKSk7CiAKLSAgICBpZiAoYmktPmJpX3BhcmVudCkKLQlCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbiktPmRjX3NpemUgPSAwOyAvKiBFbmRpYW4gc2FmZSBpZiAwICovCisJaWYgKGJpLT5iaV9wYXJlbnQpCisJCUJfTl9DSElMRChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pLT5kY19zaXplID0gMDsJLyogRW5kaWFuIHNhZmUgaWYgMCAqLwogfQogCi0KIC8qIEdldCBmaXJzdCBlbXB0eSBidWZmZXIgKi8KLXN0cnVjdCBidWZmZXJfaGVhZCAqIGdldF9GRUIgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3N0cnVjdCBidWZmZXJfaGVhZCAqZ2V0X0ZFQihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKIHsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBmaXJzdF9iOwotICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKwlpbnQgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0X2I7CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9GRUJfU0laRTsgaSArKykKLQlpZiAodGItPkZFQltpXSAhPSAwKQotCSAgICBicmVhazsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZFQl9TSVpFOyBpKyspCisJCWlmICh0Yi0+RkVCW2ldICE9IDApCisJCQlicmVhazsKIAotICAgIGlmIChpID09IE1BWF9GRUJfU0laRSkKLQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsICJ2cy0xMjMwMDogZ2V0X0ZFQjogRkVCIGxpc3QgaXMgZW1wdHkiKTsKKwlpZiAoaSA9PSBNQVhfRkVCX1NJWkUpCisJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCSAgICAgICAidnMtMTIzMDA6IGdldF9GRUI6IEZFQiBsaXN0IGlzIGVtcHR5Iik7CiAKLSAgICBiaS50YiA9IHRiOwotICAgIGJpLmJpX2JoID0gZmlyc3RfYiA9IHRiLT5GRUJbaV07Ci0gICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKLSAgICBiaS5iaV9wb3NpdGlvbiA9IDA7Ci0gICAgbWFrZV9lbXB0eV9ub2RlICgmYmkpOwotICAgIHNldF9idWZmZXJfdXB0b2RhdGUoZmlyc3RfYik7Ci0gICAgdGItPkZFQltpXSA9IE5VTEw7Ci0gICAgdGItPnVzZWRbaV0gPSBmaXJzdF9iOworCWJpLnRiID0gdGI7CisJYmkuYmlfYmggPSBmaXJzdF9iID0gdGItPkZFQltpXTsKKwliaS5iaV9wYXJlbnQgPSBOVUxMOworCWJpLmJpX3Bvc2l0aW9uID0gMDsKKwltYWtlX2VtcHR5X25vZGUoJmJpKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGZpcnN0X2IpOworCXRiLT5GRUJbaV0gPSBOVUxMOworCXRiLT51c2VkW2ldID0gZmlyc3RfYjsKIAotICAgIHJldHVybihmaXJzdF9iKTsKKwlyZXR1cm4gKGZpcnN0X2IpOwogfQogCi0KIC8qIFRoaXMgaXMgbm93IHVzZWQgYmVjYXVzZSByZWlzZXJmc19mcmVlX2Jsb2NrIGhhcyB0byBiZSBhYmxlIHRvCiAqKiBzY2hlZHVsZS4KICovCi1zdGF0aWMgdm9pZCBzdG9yZV90aHJvd24gKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgdm9pZCBzdG9yZV90aHJvd24oc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgaW50IGk7CisJaW50IGk7CiAKLSAgICBpZiAoYnVmZmVyX2RpcnR5IChiaCkpCi0gICAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsICJzdG9yZV90aHJvd24gZGVhbHMgd2l0aCBkaXJ0eSBidWZmZXIiKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mICh0Yi0+dGhyb3duKS9zaXplb2YgKHRiLT50aHJvd25bMF0pOyBpICsrKQotCWlmICghdGItPnRocm93bltpXSkgewotCSAgICB0Yi0+dGhyb3duW2ldID0gYmg7Ci0JICAgIGdldF9iaChiaCkgOyAvKiBmcmVlX3Rocm93biBwdXRzIHRoaXMgKi8KLQkgICAgcmV0dXJuOwotCX0KLSAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsICJzdG9yZV90aHJvd246IHRvbyBtYW55IHRocm93biBidWZmZXJzIik7CisJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpCisJCXJlaXNlcmZzX3dhcm5pbmcodGItPnRiX3NiLAorCQkJCSAic3RvcmVfdGhyb3duIGRlYWxzIHdpdGggZGlydHkgYnVmZmVyIik7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0Yi0+dGhyb3duKSAvIHNpemVvZih0Yi0+dGhyb3duWzBdKTsgaSsrKQorCQlpZiAoIXRiLT50aHJvd25baV0pIHsKKwkJCXRiLT50aHJvd25baV0gPSBiaDsKKwkJCWdldF9iaChiaCk7CS8qIGZyZWVfdGhyb3duIHB1dHMgdGhpcyAqLworCQkJcmV0dXJuOworCQl9CisJcmVpc2VyZnNfd2FybmluZyh0Yi0+dGJfc2IsICJzdG9yZV90aHJvd246IHRvbyBtYW55IHRocm93biBidWZmZXJzIik7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfdGhyb3duKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKSB7Ci0gICAgaW50IGkgOwotICAgIGJfYmxvY2tucl90IGJsb2NrbnIgOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRiLT50aHJvd24pL3NpemVvZiAodGItPnRocm93blswXSk7IGkrKykgewotCWlmICh0Yi0+dGhyb3duW2ldKSB7Ci0JICAgIGJsb2NrbnIgPSB0Yi0+dGhyb3duW2ldLT5iX2Jsb2NrbnIgOwotCSAgICBpZiAoYnVmZmVyX2RpcnR5ICh0Yi0+dGhyb3duW2ldKSkKLQkgICAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsCi0JCQkJImZyZWVfdGhyb3duIGRlYWxzIHdpdGggZGlydHkgYnVmZmVyICVkIiwKLQkJCQlibG9ja25yKTsKLQkgICAgYnJlbHNlKHRiLT50aHJvd25baV0pIDsgLyogaW5jcmVtZW50ZWQgaW4gc3RvcmVfdGhyb3duICovCi0JICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsIE5VTEwsIGJsb2NrbnIsIDApOworc3RhdGljIHZvaWQgZnJlZV90aHJvd24oc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCit7CisJaW50IGk7CisJYl9ibG9ja25yX3QgYmxvY2tucjsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRiLT50aHJvd24pIC8gc2l6ZW9mKHRiLT50aHJvd25bMF0pOyBpKyspIHsKKwkJaWYgKHRiLT50aHJvd25baV0pIHsKKwkJCWJsb2NrbnIgPSB0Yi0+dGhyb3duW2ldLT5iX2Jsb2NrbnI7CisJCQlpZiAoYnVmZmVyX2RpcnR5KHRiLT50aHJvd25baV0pKQorCQkJCXJlaXNlcmZzX3dhcm5pbmcodGItPnRiX3NiLAorCQkJCQkJICJmcmVlX3Rocm93biBkZWFscyB3aXRoIGRpcnR5IGJ1ZmZlciAlZCIsCisJCQkJCQkgYmxvY2tucik7CisJCQlicmVsc2UodGItPnRocm93bltpXSk7CS8qIGluY3JlbWVudGVkIGluIHN0b3JlX3Rocm93biAqLworCQkJcmVpc2VyZnNfZnJlZV9ibG9jayh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBOVUxMLAorCQkJCQkgICAgYmxvY2tuciwgMCk7CisJCX0KIAl9Ci0gICAgfQogfQogCi12b2lkIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQordm9pZCByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKLSAgICBibGtoID0gQl9CTEtfSEVBRChiaCk7Ci0gICAgc2V0X2Jsa2hfbGV2ZWwoIGJsa2gsIEZSRUVfTEVWRUwgKTsKLSAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCAwICk7Ci0gICAgCi0gICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKLSAgICBzdG9yZV90aHJvd24gKHRiLCBiaCk7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJYmxraCA9IEJfQkxLX0hFQUQoYmgpOworCXNldF9ibGtoX2xldmVsKGJsa2gsIEZSRUVfTEVWRUwpOworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgMCk7CisKKwljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCXN0b3JlX3Rocm93bih0YiwgYmgpOwogfQogCiAvKiBSZXBsYWNlIG5fZGVzdCd0aCBrZXkgaW4gYnVmZmVyIGRlc3QgYnkgbl9zcmMndGgga2V5IG9mIGJ1ZmZlciBzcmMuKi8KLXZvaWQgcmVwbGFjZV9rZXkgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCwgaW50IG5fZGVzdCwKLQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBuX3NyYykKK3ZvaWQgcmVwbGFjZV9rZXkoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdCwgaW50IG5fZGVzdCwKKwkJIHN0cnVjdCBidWZmZXJfaGVhZCAqc3JjLCBpbnQgbl9zcmMpCiB7CiAKLSAgICBSRkFMU0UoIGRlc3QgPT0gTlVMTCB8fCBzcmMgPT0gTlVMTCwKLQkgICAgInZzLTEyMzA1OiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYnVmZmVyIGlzIDAgKHNyYz0lcCwgZGVzdD0lcCkiLAotCSAgICBzcmMsIGRlc3QpOwotICAgIFJGQUxTRSggISBCX0lTX0tFWVNfTEVWRUwgKGRlc3QpLAotCSAgICAidnMtMTIzMTA6IGludmFsaWQgbGV2ZWwgKCV6KSBmb3IgZGVzdGluYXRpb24gYnVmZmVyLiBkZXN0IG11c3QgYmUgbGVhZiIsCi0JICAgIGRlc3QpOwotICAgIFJGQUxTRSggbl9kZXN0IDwgMCB8fCBuX3NyYyA8IDAsCi0JICAgICJ2cy0xMjMxNTogc3JjKCVkKSBvciBkZXN0KCVkKSBrZXkgbnVtYmVyIDwgMCIsIG5fc3JjLCBuX2Rlc3QpOwotICAgIFJGQUxTRSggbl9kZXN0ID49IEJfTlJfSVRFTVMoZGVzdCkgfHwgbl9zcmMgPj0gQl9OUl9JVEVNUyhzcmMpLAotCSAgICAidnMtMTIzMjA6IHNyYyglZCglZCkpIG9yIGRlc3QoJWQoJWQpKSBrZXkgbnVtYmVyIGlzIHRvbyBiaWciLAotCSAgICBuX3NyYywgQl9OUl9JVEVNUyhzcmMpLCBuX2Rlc3QsIEJfTlJfSVRFTVMoZGVzdCkpOwotICAgCi0gICAgaWYgKEJfSVNfSVRFTVNfTEVWRUwgKHNyYykpCi0JLyogc291cmNlIGJ1ZmZlciBjb250YWlucyBsZWFmIG5vZGUgKi8KLQltZW1jcHkgKEJfTl9QREVMSU1fS0VZKGRlc3Qsbl9kZXN0KSwgQl9OX1BJVEVNX0hFQUQoc3JjLG5fc3JjKSwgS0VZX1NJWkUpOwotICAgIGVsc2UKLQltZW1jcHkgKEJfTl9QREVMSU1fS0VZKGRlc3Qsbl9kZXN0KSwgQl9OX1BERUxJTV9LRVkoc3JjLG5fc3JjKSwgS0VZX1NJWkUpOworCVJGQUxTRShkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCisJICAgICAgICJ2cy0xMjMwNTogc291cmNlIG9yIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyAwIChzcmM9JXAsIGRlc3Q9JXApIiwKKwkgICAgICAgc3JjLCBkZXN0KTsKKwlSRkFMU0UoIUJfSVNfS0VZU19MRVZFTChkZXN0KSwKKwkgICAgICAgInZzLTEyMzEwOiBpbnZhbGlkIGxldmVsICgleikgZm9yIGRlc3RpbmF0aW9uIGJ1ZmZlci4gZGVzdCBtdXN0IGJlIGxlYWYiLAorCSAgICAgICBkZXN0KTsKKwlSRkFMU0Uobl9kZXN0IDwgMCB8fCBuX3NyYyA8IDAsCisJICAgICAgICJ2cy0xMjMxNTogc3JjKCVkKSBvciBkZXN0KCVkKSBrZXkgbnVtYmVyIDwgMCIsIG5fc3JjLCBuX2Rlc3QpOworCVJGQUxTRShuX2Rlc3QgPj0gQl9OUl9JVEVNUyhkZXN0KSB8fCBuX3NyYyA+PSBCX05SX0lURU1TKHNyYyksCisJICAgICAgICJ2cy0xMjMyMDogc3JjKCVkKCVkKSkgb3IgZGVzdCglZCglZCkpIGtleSBudW1iZXIgaXMgdG9vIGJpZyIsCisJICAgICAgIG5fc3JjLCBCX05SX0lURU1TKHNyYyksIG5fZGVzdCwgQl9OUl9JVEVNUyhkZXN0KSk7CiAKLSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCBkZXN0LCAwKTsKKwlpZiAoQl9JU19JVEVNU19MRVZFTChzcmMpKQorCQkvKiBzb3VyY2UgYnVmZmVyIGNvbnRhaW5zIGxlYWYgbm9kZSAqLworCQltZW1jcHkoQl9OX1BERUxJTV9LRVkoZGVzdCwgbl9kZXN0KSwgQl9OX1BJVEVNX0hFQUQoc3JjLCBuX3NyYyksCisJCSAgICAgICBLRVlfU0laRSk7CisJZWxzZQorCQltZW1jcHkoQl9OX1BERUxJTV9LRVkoZGVzdCwgbl9kZXN0KSwgQl9OX1BERUxJTV9LRVkoc3JjLCBuX3NyYyksCisJCSAgICAgICBLRVlfU0laRSk7CisKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIGRlc3QsIDApOwogfQogCi0KLWludCBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAoCi0JCQkJc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAKLQkJCQlpbnQgaAotCQkJCSkKK2ludCBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gIGludCBTaF9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKKwlpbnQgU2hfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKIAotICBSRkFMU0UoIFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkgPT0gMCB8fCB0Yi0+RkxbaF0gPT0gMCwKLQkgICJ2cy0xMjMyNTogRkxbJWRdKCVwKSBvciBGWyVkXSglcCkgZG9lcyBub3QgZXhpc3QiLCAKLQkgIGgsIHRiLT5GTFtoXSwgaCwgUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSk7CisJUkZBTFNFKFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKSA9PSAwIHx8IHRiLT5GTFtoXSA9PSAwLAorCSAgICAgICAidnMtMTIzMjU6IEZMWyVkXSglcCkgb3IgRlslZF0oJXApIGRvZXMgbm90IGV4aXN0IiwKKwkgICAgICAgaCwgdGItPkZMW2hdLCBoLCBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCkpOwogCi0gIGlmIChTaF9wb3NpdGlvbiA9PSAwKQotICAgIHJldHVybiBCX05SX0lURU1TICh0Yi0+RkxbaF0pOwotICBlbHNlCi0gICAgcmV0dXJuIFNoX3Bvc2l0aW9uIC0gMTsKKwlpZiAoU2hfcG9zaXRpb24gPT0gMCkKKwkJcmV0dXJuIEJfTlJfSVRFTVModGItPkZMW2hdKTsKKwllbHNlCisJCXJldHVybiBTaF9wb3NpdGlvbiAtIDE7CiB9CiAKLQotaW50IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK2ludCBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24oc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICBpbnQgU2hfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJaW50IFNoX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CiAKLSAgUkZBTFNFKCBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpID09IDAgfHwgdGItPkZSW2hdID09IDAsCi0JICAidnMtMTIzMzA6IEZbJWRdKCVwKSBvciBGUlslZF0oJXApIGRvZXMgbm90IGV4aXN0IiwgCi0JICBoLCBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpLCBoLCB0Yi0+RlJbaF0pOworCVJGQUxTRShQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCkgPT0gMCB8fCB0Yi0+RlJbaF0gPT0gMCwKKwkgICAgICAgInZzLTEyMzMwOiBGWyVkXSglcCkgb3IgRlJbJWRdKCVwKSBkb2VzIG5vdCBleGlzdCIsCisJICAgICAgIGgsIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKSwgaCwgdGItPkZSW2hdKTsKIAotICBpZiAoU2hfcG9zaXRpb24gPT0gQl9OUl9JVEVNUyAoUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSkpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gU2hfcG9zaXRpb24gKyAxOworCWlmIChTaF9wb3NpdGlvbiA9PSBCX05SX0lURU1TKFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKSkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIFNoX3Bvc2l0aW9uICsgMTsKIH0KIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCiAKLWludCBpc19yZXVzYWJsZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpOwotc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfbm9kZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGNoYXIgKiBtZXMpCitpbnQgaXNfcmV1c2FibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSk7CitzdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9ub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQljaGFyICptZXMpCiB7Ci0gIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7Ci0gIGludCBpOworCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKKwlpbnQgaTsKIAotICBSRkFMU0UoICFiaCwgIlBBUC0xMjMzNjogYmggPT0gMCIpOworCVJGQUxTRSghYmgsICJQQVAtMTIzMzY6IGJoID09IDAiKTsKIAotICBpZiAoIWJoIHx8ICFCX0lTX0lOX1RSRUUgKGJoKSkKLSAgICByZXR1cm47Ci0gCi0gIFJGQUxTRSggIWJ1ZmZlcl9kaXJ0eSAoYmgpICYmIAotCSAgIShidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpLAotCSAgIlBBUC0xMjMzNzogYnVmZmVyICglYikgbXVzdCBiZSBkaXJ0eSIsIGJoKTsKLSAgZGMgPSBCX05fQ0hJTEQgKGJoLCAwKTsKKwlpZiAoIWJoIHx8ICFCX0lTX0lOX1RSRUUoYmgpKQorCQlyZXR1cm47CiAKLSAgZm9yIChpID0gMDsgaSA8PSBCX05SX0lURU1TIChiaCk7IGkgKyssIGRjICsrKSB7Ci0gICAgaWYgKCFpc19yZXVzYWJsZSAocywgZGNfYmxvY2tfbnVtYmVyKGRjKSwgMSkgKSB7Ci0gICAgICBwcmludF9jdXJfdGIgKG1lcyk7Ci0gICAgICByZWlzZXJmc19wYW5pYyAocywgIlBBUC0xMjMzODogY2hlY2tfaW50ZXJuYWxfbm9kZTogaW52YWxpZCBjaGlsZCBwb2ludGVyICV5IGluICViIiwgZGMsIGJoKTsKLSAgICB9Ci0gIH0KLX0KKwlSRkFMU0UoIWJ1ZmZlcl9kaXJ0eShiaCkgJiYKKwkgICAgICAgIShidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpLAorCSAgICAgICAiUEFQLTEyMzM3OiBidWZmZXIgKCViKSBtdXN0IGJlIGRpcnR5IiwgYmgpOworCWRjID0gQl9OX0NISUxEKGJoLCAwKTsKIAotCi1zdGF0aWMgaW50IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGNoYXIgKiB3aGljaCkKLXsKLSAgaWYgKCAoIWJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCkgJiYgYnVmZmVyX2xvY2tlZCAoYmgpKSB8fAotICAgICAgICAhQl9JU19JTl9UUkVFIChiaCkgKSB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTEyMzM5OiBsb2NrZWRfb3Jfbm90X2luX3RyZWU6ICVzICglYikiLAotICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLCBiaCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gCi0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgY2hlY2tfYmVmb3JlX2JhbGFuY2luZyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQotewotICBpbnQgcmV0dmFsID0gMDsJCi0KLSAgaWYgKCBjdXJfdGIgKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTEyMzM1OiBjaGVja19iZWZvcmVfYmFsYW5jaW5nOiAiCi0JCSAgICAic3VzcGVjdCB0aGF0IHNjaGVkdWxlIG9jY3VycmVkIGJhc2VkIG9uIGN1cl90YiBub3QgYmVpbmcgbnVsbCBhdCB0aGlzIHBvaW50IGluIGNvZGUuICIKLQkJICAgICJkb19iYWxhbmNlIGNhbm5vdCBwcm9wZXJseSBoYW5kbGUgc2NoZWR1bGUgb2NjdXJyaW5nIHdoaWxlIGl0IHJ1bnMuIik7Ci0gIH0KLSAgCi0gIC8qIGRvdWJsZSBjaGVjayB0aGF0IGJ1ZmZlcnMgdGhhdCB3ZSB3aWxsIG1vZGlmeSBhcmUgdW5sb2NrZWQuIChmaXhfbm9kZXMgc2hvdWxkIGFscmVhZHkgaGF2ZQotICAgICBwcmVwcGVkIGFsbCBvZiB0aGVzZSBmb3IgdXMpLiAqLwotICBpZiAoIHRiLT5sbnVtWzBdICkgewotICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5MWzBdLCAiTFswXSIpOwotICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5GTFswXSwgIkZMWzBdIik7Ci0gICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkNGTFswXSwgIkNGTFswXSIpOwotICAgIGNoZWNrX2xlYWYgKHRiLT5MWzBdKTsKLSAgfQotICBpZiAoIHRiLT5ybnVtWzBdICkgewotICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5SWzBdLCAiUlswXSIpOwotICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5GUlswXSwgIkZSWzBdIik7Ci0gICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkNGUlswXSwgIkNGUlswXSIpOwotICAgIGNoZWNrX2xlYWYgKHRiLT5SWzBdKTsKLSAgfQotICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlIChQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpLCAiU1swXSIpOwotICBjaGVja19sZWFmIChQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLXN0YXRpYyB2b2lkIGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQotewotICAgIGlmICh0Yi0+bG51bVswXSkgewotCWlmIChCX0ZSRUVfU1BBQ0UgKHRiLT5MWzBdKSAhPSAKLQkgICAgTUFYX0NISUxEX1NJWkUgKHRiLT5MWzBdKSAtIGRjX3NpemUoQl9OX0NISUxEICh0Yi0+RkxbMF0sIGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCkpKSkgewotCSAgICBwcmludF9jdXJfdGIgKCIxMjIyMSIpOwotCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMzU1OiBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWY6IHNoaWZ0IHRvIGxlZnQgd2FzIGluY29ycmVjdCIpOworCWZvciAoaSA9IDA7IGkgPD0gQl9OUl9JVEVNUyhiaCk7IGkrKywgZGMrKykgeworCQlpZiAoIWlzX3JldXNhYmxlKHMsIGRjX2Jsb2NrX251bWJlcihkYyksIDEpKSB7CisJCQlwcmludF9jdXJfdGIobWVzKTsKKwkJCXJlaXNlcmZzX3BhbmljKHMsCisJCQkJICAgICAgICJQQVAtMTIzMzg6IGNoZWNrX2ludGVybmFsX25vZGU6IGludmFsaWQgY2hpbGQgcG9pbnRlciAleSBpbiAlYiIsCisJCQkJICAgICAgIGRjLCBiaCk7CisJCX0KIAl9Ci0gICAgfQotICAgIGlmICh0Yi0+cm51bVswXSkgewotCWlmIChCX0ZSRUVfU1BBQ0UgKHRiLT5SWzBdKSAhPSAKLQkgICAgTUFYX0NISUxEX1NJWkUgKHRiLT5SWzBdKSAtIGRjX3NpemUoQl9OX0NISUxEICh0Yi0+RlJbMF0sIGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApKSkpIHsKLQkgICAgcHJpbnRfY3VyX3RiICgiMTIyMjIiKTsKLQkgICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjM2MDogY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmOiBzaGlmdCB0byByaWdodCB3YXMgaW5jb3JyZWN0Iik7Cit9CisKK3N0YXRpYyBpbnQgbG9ja2VkX29yX25vdF9pbl90cmVlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGNoYXIgKndoaWNoKQoreworCWlmICgoIWJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGJoKSAmJiBidWZmZXJfbG9ja2VkKGJoKSkgfHwKKwkgICAgIUJfSVNfSU5fVFJFRShiaCkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAidnMtMTIzMzk6IGxvY2tlZF9vcl9ub3RfaW5fdHJlZTogJXMgKCViKSIsCisJCQkJIHdoaWNoLCBiaCk7CisJCXJldHVybiAxOwogCX0KLSAgICB9Ci0gICAgaWYgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpICYmCi0JKEJfRlJFRV9TUEFDRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpICE9IAotCQkgICAgKE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSkgLQotCQkgICAgZGNfc2l6ZShCX05fQ0hJTEQgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpLAotCQkgICAgUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSkpKSkgKSkgewotCWludCBsZWZ0ID0gQl9GUkVFX1NQQUNFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSk7Ci0JaW50IHJpZ2h0ID0gKE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSkgLQotCQkgICAgZGNfc2l6ZShCX05fQ0hJTEQgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpLAotCQkJUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSkpKSk7Ci0JcHJpbnRfY3VyX3RiICgiMTIyMjMiKTsKLQlyZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsCi0JICAgICJCX0ZSRUVfU1BBQ0UgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKSA9ICVkOyAiCi0gICAgCSAgICAiTUFYX0NISUxEX1NJWkUgKCVkKSAtIGRjX3NpemUoICV5LCAlZCApIFslZF0gPSAlZCIsCi0JICAgIGxlZnQsCi0JICAgIE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSksCi0JICAgIFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpLAotCSAgICBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSwKLQkgICAgZGNfc2l6ZShCX05fQ0hJTEQgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpLCBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxICkpICksCi0JICAgIHJpZ2h0ICk7Ci0JcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjM2NTogY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmOiBTIGlzIGluY29ycmVjdCIpOwotICAgIH0KKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBjaGVja19sZWFmX2xldmVsIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCitzdGF0aWMgaW50IGNoZWNrX2JlZm9yZV9iYWxhbmNpbmcoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gIGNoZWNrX2xlYWYgKHRiLT5MWzBdKTsKLSAgY2hlY2tfbGVhZiAodGItPlJbMF0pOwotICBjaGVja19sZWFmIChQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpKTsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChjdXJfdGIpIHsKKwkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLCAidnMtMTIzMzU6IGNoZWNrX2JlZm9yZV9iYWxhbmNpbmc6ICIKKwkJCSAgICAgICAic3VzcGVjdCB0aGF0IHNjaGVkdWxlIG9jY3VycmVkIGJhc2VkIG9uIGN1cl90YiBub3QgYmVpbmcgbnVsbCBhdCB0aGlzIHBvaW50IGluIGNvZGUuICIKKwkJCSAgICAgICAiZG9fYmFsYW5jZSBjYW5ub3QgcHJvcGVybHkgaGFuZGxlIHNjaGVkdWxlIG9jY3VycmluZyB3aGlsZSBpdCBydW5zLiIpOworCX0KKworCS8qIGRvdWJsZSBjaGVjayB0aGF0IGJ1ZmZlcnMgdGhhdCB3ZSB3aWxsIG1vZGlmeSBhcmUgdW5sb2NrZWQuIChmaXhfbm9kZXMgc2hvdWxkIGFscmVhZHkgaGF2ZQorCSAgIHByZXBwZWQgYWxsIG9mIHRoZXNlIGZvciB1cykuICovCisJaWYgKHRiLT5sbnVtWzBdKSB7CisJCXJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUodGItPkxbMF0sICJMWzBdIik7CisJCXJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUodGItPkZMWzBdLCAiRkxbMF0iKTsKKwkJcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSh0Yi0+Q0ZMWzBdLCAiQ0ZMWzBdIik7CisJCWNoZWNrX2xlYWYodGItPkxbMF0pOworCX0KKwlpZiAodGItPnJudW1bMF0pIHsKKwkJcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSh0Yi0+UlswXSwgIlJbMF0iKTsKKwkJcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSh0Yi0+RlJbMF0sICJGUlswXSIpOworCQlyZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlKHRiLT5DRlJbMF0sICJDRlJbMF0iKTsKKwkJY2hlY2tfbGVhZih0Yi0+UlswXSk7CisJfQorCXJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUoUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpLCAiU1swXSIpOworCWNoZWNrX2xlYWYoUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpKTsKKworCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIGNoZWNrX2ludGVybmFsX2xldmVscyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQorc3RhdGljIHZvaWQgY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICBpbnQgaDsKKwlpZiAodGItPmxudW1bMF0pIHsKKwkJaWYgKEJfRlJFRV9TUEFDRSh0Yi0+TFswXSkgIT0KKwkJICAgIE1BWF9DSElMRF9TSVpFKHRiLT5MWzBdKSAtCisJCSAgICBkY19zaXplKEJfTl9DSElMRAorCQkJICAgICh0Yi0+RkxbMF0sIGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKSkpKSB7CisJCQlwcmludF9jdXJfdGIoIjEyMjIxIik7CisJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJICAgICAgICJQQVAtMTIzNTU6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogc2hpZnQgdG8gbGVmdCB3YXMgaW5jb3JyZWN0Iik7CisJCX0KKwl9CisJaWYgKHRiLT5ybnVtWzBdKSB7CisJCWlmIChCX0ZSRUVfU1BBQ0UodGItPlJbMF0pICE9CisJCSAgICBNQVhfQ0hJTERfU0laRSh0Yi0+UlswXSkgLQorCQkgICAgZGNfc2l6ZShCX05fQ0hJTEQKKwkJCSAgICAodGItPkZSWzBdLCBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApKSkpIHsKKwkJCXByaW50X2N1cl90YigiMTIyMjIiKTsKKwkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkgICAgICAgIlBBUC0xMjM2MDogY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmOiBzaGlmdCB0byByaWdodCB3YXMgaW5jb3JyZWN0Iik7CisJCX0KKwl9CisJaWYgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAxKSAmJgorCSAgICAoQl9GUkVFX1NQQUNFKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAwKSkgIT0KKwkgICAgIChNQVhfQ0hJTERfU0laRShQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMCkpIC0KKwkgICAgICBkY19zaXplKEJfTl9DSElMRChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMSksCisJCQkJUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKSkpKSkpIHsKKwkJaW50IGxlZnQgPSBCX0ZSRUVfU1BBQ0UoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApKTsKKwkJaW50IHJpZ2h0ID0gKE1BWF9DSElMRF9TSVpFKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAwKSkgLQorCQkJICAgICBkY19zaXplKEJfTl9DSElMRChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMSksCisJCQkJCSAgICAgICBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsCisJCQkJCQkJICAgICAgIDEpKSkpOworCQlwcmludF9jdXJfdGIoIjEyMjIzIik7CisJCXJlaXNlcmZzX3dhcm5pbmcodGItPnRiX3NiLAorCQkJCSAiQl9GUkVFX1NQQUNFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSkgPSAlZDsgIgorCQkJCSAiTUFYX0NISUxEX1NJWkUgKCVkKSAtIGRjX3NpemUoICV5LCAlZCApIFslZF0gPSAlZCIsCisJCQkJIGxlZnQsCisJCQkJIE1BWF9DSElMRF9TSVpFKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAwKSksCisJCQkJIFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAxKSwKKwkJCQkgUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKSwKKwkJCQkgZGNfc2l6ZShCX05fQ0hJTEQKKwkJCQkJIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMSksCisJCQkJCSAgUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKSkpLAorCQkJCSByaWdodCk7CisJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCSAgICAgICAiUEFQLTEyMzY1OiBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWY6IFMgaXMgaW5jb3JyZWN0Iik7CisJfQorfQogCi0gIC8qIGNoZWNrIGFsbCBpbnRlcm5hbCBub2RlcyAqLwotICBmb3IgKGggPSAxOyB0Yi0+aW5zZXJ0X3NpemVbaF07IGggKyspIHsKLSAgICBjaGVja19pbnRlcm5hbF9ub2RlICh0Yi0+dGJfc2IsIFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCksICJCQUQgQlVGRkVSIE9OIFBBVEgiKTsKLSAgICBpZiAodGItPmxudW1baF0pCi0gICAgICBjaGVja19pbnRlcm5hbF9ub2RlICh0Yi0+dGJfc2IsIHRiLT5MW2hdLCAiQkFEIEwiKTsKLSAgICBpZiAodGItPnJudW1baF0pCi0gICAgICBjaGVja19pbnRlcm5hbF9ub2RlICh0Yi0+dGJfc2IsIHRiLT5SW2hdLCAiQkFEIFIiKTsKLSAgfQorc3RhdGljIHZvaWQgY2hlY2tfbGVhZl9sZXZlbChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKK3sKKwljaGVja19sZWFmKHRiLT5MWzBdKTsKKwljaGVja19sZWFmKHRiLT5SWzBdKTsKKwljaGVja19sZWFmKFBBVEhfUExBU1RfQlVGRkVSKHRiLT50Yl9wYXRoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2ludGVybmFsX2xldmVscyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKK3sKKwlpbnQgaDsKKworCS8qIGNoZWNrIGFsbCBpbnRlcm5hbCBub2RlcyAqLworCWZvciAoaCA9IDE7IHRiLT5pbnNlcnRfc2l6ZVtoXTsgaCsrKSB7CisJCWNoZWNrX2ludGVybmFsX25vZGUodGItPnRiX3NiLCBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCksCisJCQkJICAgICJCQUQgQlVGRkVSIE9OIFBBVEgiKTsKKwkJaWYgKHRiLT5sbnVtW2hdKQorCQkJY2hlY2tfaW50ZXJuYWxfbm9kZSh0Yi0+dGJfc2IsIHRiLT5MW2hdLCAiQkFEIEwiKTsKKwkJaWYgKHRiLT5ybnVtW2hdKQorCQkJY2hlY2tfaW50ZXJuYWxfbm9kZSh0Yi0+dGJfc2IsIHRiLT5SW2hdLCAiQkFEIFIiKTsKKwl9CiAKIH0KIAogI2VuZGlmCiAKLQotCi0KLQotCiAvKiBOb3cgd2UgaGF2ZSBhbGwgb2YgdGhlIGJ1ZmZlcnMgdGhhdCBtdXN0IGJlIHVzZWQgaW4gYmFsYW5jaW5nIG9mCiAgICB0aGUgdHJlZS4gIFdlIHJlbHkgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBzY2hlZHVsZSgpIHdpbGwgbm90IG9jY3VyCiAgICB3aGlsZSBkb19iYWxhbmNlIHdvcmtzLiAoIE9ubHkgaW50ZXJydXB0IGhhbmRsZXJzIGFyZSBhY2NlcHRhYmxlLikKQEAgLTE0ODQsMTE0ICsyMDI5LDEwOSBAQAogCiAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG9fYmFsYW5jZV9zdGFydHMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQorc3RhdGljIGlubGluZSB2b2lkIGRvX2JhbGFuY2Vfc3RhcnRzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICAgIC8qIHVzZSBwcmludF9jdXJfdGIoKSB0byBzZWUgaW5pdGlhbCBzdGF0ZSBvZiBzdHJ1Y3QKLSAgICAgICB0cmVlX2JhbGFuY2UgKi8KKwkvKiB1c2UgcHJpbnRfY3VyX3RiKCkgdG8gc2VlIGluaXRpYWwgc3RhdGUgb2Ygc3RydWN0CisJICAgdHJlZV9iYWxhbmNlICovCiAKLSAgICAvKiBzdG9yZV9wcmludF90YiAodGIpOyAqLworCS8qIHN0b3JlX3ByaW50X3RiICh0Yik7ICovCiAKLSAgICAvKiBkbyBub3QgZGVsZXRlLCBqdXN0IGNvbW1lbnQgaXQgb3V0ICovCisJLyogZG8gbm90IGRlbGV0ZSwganVzdCBjb21tZW50IGl0IG91dCAqLwogLyogICAgcHJpbnRfdGIoZmxhZywgUEFUSF9MQVNUX1BPU0lUSU9OKHRiLT50Yl9wYXRoKSwgdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtLCB0YiwgCiAJICAgICAiY2hlY2siKTsqLwotICAgIFJGQUxTRSggY2hlY2tfYmVmb3JlX2JhbGFuY2luZyAodGIpLCAiUEFQLTEyMzQwOiBsb2NrZWQgYnVmZmVycyBpbiBUQiIpOworCVJGQUxTRShjaGVja19iZWZvcmVfYmFsYW5jaW5nKHRiKSwgIlBBUC0xMjM0MDogbG9ja2VkIGJ1ZmZlcnMgaW4gVEIiKTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBjdXJfdGIgPSB0YjsKKwljdXJfdGIgPSB0YjsKICNlbmRpZgogfQogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19iYWxhbmNlX2NvbXBsZXRlZCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQorc3RhdGljIGlubGluZSB2b2lkIGRvX2JhbGFuY2VfY29tcGxldGVkKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICAgIAorCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgY2hlY2tfbGVhZl9sZXZlbCAodGIpOwotICAgIGNoZWNrX2ludGVybmFsX2xldmVscyAodGIpOwotICAgIGN1cl90YiA9IE5VTEw7CisJY2hlY2tfbGVhZl9sZXZlbCh0Yik7CisJY2hlY2tfaW50ZXJuYWxfbGV2ZWxzKHRiKTsKKwljdXJfdGIgPSBOVUxMOwogI2VuZGlmCiAKLSAgICAvKiByZWlzZXJmc19mcmVlX2Jsb2NrIGlzIG5vIGxvbmdlciBzY2hlZHVsZSBzYWZlLiAgU28sIHdlIG5lZWQgdG8KLSAgICAqKiBwdXQgdGhlIGJ1ZmZlcnMgd2Ugd2FudCBmcmVlZCBvbiB0aGUgdGhyb3duIGxpc3QgZHVyaW5nIGRvX2JhbGFuY2UsCi0gICAgKiogYW5kIHRoZW4gZnJlZSB0aGVtIG5vdwotICAgICovCisJLyogcmVpc2VyZnNfZnJlZV9ibG9jayBpcyBubyBsb25nZXIgc2NoZWR1bGUgc2FmZS4gIFNvLCB3ZSBuZWVkIHRvCisJICoqIHB1dCB0aGUgYnVmZmVycyB3ZSB3YW50IGZyZWVkIG9uIHRoZSB0aHJvd24gbGlzdCBkdXJpbmcgZG9fYmFsYW5jZSwKKwkgKiogYW5kIHRoZW4gZnJlZSB0aGVtIG5vdworCSAqLwogCi0gICAgUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19kb19iYWxhbmNlICsrOworCVJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfZG9fYmFsYW5jZSsrOwogCi0KLSAgICAvKiByZWxlYXNlIGFsbCBub2RlcyBob2xkIHRvIHBlcmZvcm0gdGhlIGJhbGFuY2luZyAqLwotICAgIHVuZml4X25vZGVzKHRiKTsKLQotICAgIGZyZWVfdGhyb3duKHRiKSA7Ci19Ci0KLQotCi0KLQotdm9pZCBkb19iYWxhbmNlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIC8qIHRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmUgKi8KLQkJIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwJICAgLyogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSAqLwotCQkgY29uc3QgY2hhciAqIGJvZHksICAvKiBib2R5ICBvZiBpbnNlcnRlZCBpdGVtIG9yIGJ5dGVzIHRvIHBhc3RlICovCi0JCSBpbnQgZmxhZykgIC8qIGkgLSBpbnNlcnQsIGQgLSBkZWxldGUKLQkJCSAgICAgICBjIC0gY3V0LCBwIC0gcGFzdGUKLQkJCQkJCSAgICAgIAotCQkJICAgICAgIEN1dCBtZWFucyBkZWxldGUgcGFydCBvZiBhbiBpdGVtCi0JCQkgICAgICAgKGluY2x1ZGVzIHJlbW92aW5nIGFuIGVudHJ5IGZyb20gYQotCQkJICAgICAgIGRpcmVjdG9yeSkuCi0JCQkJCQkgICAgICAKLQkJCSAgICAgICBEZWxldGUgbWVhbnMgZGVsZXRlIHdob2xlIGl0ZW0uCi0JCQkJCQkgICAgICAKLQkJCSAgICAgICBJbnNlcnQgbWVhbnMgYWRkIGEgbmV3IGl0ZW0gaW50byB0aGUKLQkJCSAgICAgICB0cmVlLgotCQkJCQkJICAgICAgCQkJCQkJICAgICAgCi0JCQkgICAgICAgUGFzdGUgbWVhbnMgdG8gYXBwZW5kIHRvIHRoZSBlbmQgb2YgYW4KLQkJCSAgICAgICBleGlzdGluZyBmaWxlIG9yIHRvIGluc2VydCBhIGRpcmVjdG9yeQotCQkJICAgICAgIGVudHJ5LiAgKi8KLXsKLSAgICBpbnQgY2hpbGRfcG9zLCAvKiBwb3NpdGlvbiBvZiBhIGNoaWxkIG5vZGUgaW4gaXRzIHBhcmVudCAqLwotCWg7CSAgIC8qIGxldmVsIG9mIHRoZSB0cmVlIGJlaW5nIHByb2Nlc3NlZCAqLwotICAgIHN0cnVjdCBpdGVtX2hlYWQgaW5zZXJ0X2tleVsyXTsgLyogaW4gb3VyIHByb2Nlc3Npbmcgb2Ygb25lIGxldmVsCi0JCQkJICAgICAgIHdlIHNvbWV0aW1lcyBkZXRlcm1pbmUgd2hhdAotCQkJCSAgICAgICBtdXN0IGJlIGluc2VydGVkIGludG8gdGhlIG5leHQKLQkJCQkgICAgICAgaGlnaGVyIGxldmVsLiAgVGhpcyBpbnNlcnRpb24KLQkJCQkgICAgICAgY29uc2lzdHMgb2YgYSBrZXkgb3IgdHdvIGtleXMKLQkJCQkgICAgICAgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcKLQkJCQkgICAgICAgcG9pbnRlcnMgKi8KLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmluc2VydF9wdHJbMl07IC8qIGluc2VydGVkIG5vZGUtcHRycyBmb3IgdGhlIG5leHQKLQkJCQkJICBsZXZlbCAqLwotCi0gICAgdGItPnRiX21vZGUgPSBmbGFnOwotICAgIHRiLT5uZWVkX2JhbGFuY2VfZGlydHkgPSAwOwotCi0gICAgaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQih0YikpIHsKLSAgICAgICAgcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLCAiY2xtLTYwMDA6IGRvX2JhbGFuY2UsIGZzIGdlbmVyYXRpb24gaGFzIGNoYW5nZWRcbiIpIDsKLSAgICB9Ci0gICAgLyogaWYgd2UgaGF2ZSBubyByZWFsIHdvcmsgdG8gZG8gICovCi0gICAgaWYgKCAhIHRiLT5pbnNlcnRfc2l6ZVswXSApIHsKLQlyZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsCi0JCQkgICJQQVAtMTIzNTA6IGRvX2JhbGFuY2U6IGluc2VydF9zaXplID09IDAsIG1vZGUgPT0gJWMiLAotCQkJICBmbGFnKTsKKwkvKiByZWxlYXNlIGFsbCBub2RlcyBob2xkIHRvIHBlcmZvcm0gdGhlIGJhbGFuY2luZyAqLwogCXVuZml4X25vZGVzKHRiKTsKLQlyZXR1cm47Ci0gICAgfQogCi0gICAgYXRvbWljX2luYyAoJihmc19nZW5lcmF0aW9uICh0Yi0+dGJfc2IpKSk7Ci0gICAgZG9fYmFsYW5jZV9zdGFydHMgKHRiKTsKLSAgICAKKwlmcmVlX3Rocm93bih0Yik7Cit9CisKK3ZvaWQgZG9fYmFsYW5jZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwJLyogdHJlZV9iYWxhbmNlIHN0cnVjdHVyZSAqLworCQlzdHJ1Y3QgaXRlbV9oZWFkICppaCwJLyogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSAqLworCQljb25zdCBjaGFyICpib2R5LAkvKiBib2R5ICBvZiBpbnNlcnRlZCBpdGVtIG9yIGJ5dGVzIHRvIHBhc3RlICovCisJCWludCBmbGFnKQorewkJCQkvKiBpIC0gaW5zZXJ0LCBkIC0gZGVsZXRlCisJCQkJICAgYyAtIGN1dCwgcCAtIHBhc3RlCisKKwkJCQkgICBDdXQgbWVhbnMgZGVsZXRlIHBhcnQgb2YgYW4gaXRlbQorCQkJCSAgIChpbmNsdWRlcyByZW1vdmluZyBhbiBlbnRyeSBmcm9tIGEKKwkJCQkgICBkaXJlY3RvcnkpLgorCisJCQkJICAgRGVsZXRlIG1lYW5zIGRlbGV0ZSB3aG9sZSBpdGVtLgorCisJCQkJICAgSW5zZXJ0IG1lYW5zIGFkZCBhIG5ldyBpdGVtIGludG8gdGhlCisJCQkJICAgdHJlZS4KKworCQkJCSAgIFBhc3RlIG1lYW5zIHRvIGFwcGVuZCB0byB0aGUgZW5kIG9mIGFuCisJCQkJICAgZXhpc3RpbmcgZmlsZSBvciB0byBpbnNlcnQgYSBkaXJlY3RvcnkKKwkJCQkgICBlbnRyeS4gICovCisJaW50IGNoaWxkX3BvcywJCS8qIHBvc2l0aW9uIG9mIGEgY2hpbGQgbm9kZSBpbiBpdHMgcGFyZW50ICovCisJIGg7CQkJLyogbGV2ZWwgb2YgdGhlIHRyZWUgYmVpbmcgcHJvY2Vzc2VkICovCisJc3RydWN0IGl0ZW1faGVhZCBpbnNlcnRfa2V5WzJdOwkvKiBpbiBvdXIgcHJvY2Vzc2luZyBvZiBvbmUgbGV2ZWwKKwkJCQkJICAgd2Ugc29tZXRpbWVzIGRldGVybWluZSB3aGF0CisJCQkJCSAgIG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbmV4dAorCQkJCQkgICBoaWdoZXIgbGV2ZWwuICBUaGlzIGluc2VydGlvbgorCQkJCQkgICBjb25zaXN0cyBvZiBhIGtleSBvciB0d28ga2V5cworCQkJCQkgICBhbmQgdGhlaXIgY29ycmVzcG9uZGluZworCQkJCQkgICBwb2ludGVycyAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5zZXJ0X3B0clsyXTsJLyogaW5zZXJ0ZWQgbm9kZS1wdHJzIGZvciB0aGUgbmV4dAorCQkJCQkJICAgbGV2ZWwgKi8KKworCXRiLT50Yl9tb2RlID0gZmxhZzsKKwl0Yi0+bmVlZF9iYWxhbmNlX2RpcnR5ID0gMDsKKworCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIodGIpKSB7CisJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCSAgICAgICAiY2xtLTYwMDA6IGRvX2JhbGFuY2UsIGZzIGdlbmVyYXRpb24gaGFzIGNoYW5nZWRcbiIpOworCX0KKwkvKiBpZiB3ZSBoYXZlIG5vIHJlYWwgd29yayB0byBkbyAgKi8KKwlpZiAoIXRiLT5pbnNlcnRfc2l6ZVswXSkgeworCQlyZWlzZXJmc193YXJuaW5nKHRiLT50Yl9zYiwKKwkJCQkgIlBBUC0xMjM1MDogZG9fYmFsYW5jZTogaW5zZXJ0X3NpemUgPT0gMCwgbW9kZSA9PSAlYyIsCisJCQkJIGZsYWcpOworCQl1bmZpeF9ub2Rlcyh0Yik7CisJCXJldHVybjsKKwl9CisKKwlhdG9taWNfaW5jKCYoZnNfZ2VuZXJhdGlvbih0Yi0+dGJfc2IpKSk7CisJZG9fYmFsYW5jZV9zdGFydHModGIpOworCiAJLyogYmFsYW5jZSBsZWFmIHJldHVybnMgMCBleGNlcHQgaWYgY29tYmluaW5nIEwgUiBhbmQgUyBpbnRvCiAJICAgb25lIG5vZGUuICBzZWUgYmFsYW5jZV9pbnRlcm5hbCgpIGZvciBleHBsYW5hdGlvbiBvZiB0aGlzCi0JICAgbGluZSBvZiBjb2RlLiovCi0JY2hpbGRfcG9zID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIDApICsKLQkgIGJhbGFuY2VfbGVhZiAodGIsIGloLCBib2R5LCBmbGFnLCBpbnNlcnRfa2V5LCBpbnNlcnRfcHRyKTsKKwkgICBsaW5lIG9mIGNvZGUuICovCisJY2hpbGRfcG9zID0gUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgMCkgKworCSAgICBiYWxhbmNlX2xlYWYodGIsIGloLCBib2R5LCBmbGFnLCBpbnNlcnRfa2V5LCBpbnNlcnRfcHRyKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZiAodGIpOworCWNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZih0Yik7CiAjZW5kaWYKIAotICAgIC8qIEJhbGFuY2UgaW50ZXJuYWwgbGV2ZWwgb2YgdGhlIHRyZWUuICovCi0gICAgZm9yICggaCA9IDE7IGggPCBNQVhfSEVJR0hUICYmIHRiLT5pbnNlcnRfc2l6ZVtoXTsgaCsrICkKLQljaGlsZF9wb3MgPSBiYWxhbmNlX2ludGVybmFsICh0YiwgaCwgY2hpbGRfcG9zLCBpbnNlcnRfa2V5LCBpbnNlcnRfcHRyKTsKKwkvKiBCYWxhbmNlIGludGVybmFsIGxldmVsIG9mIHRoZSB0cmVlLiAqLworCWZvciAoaCA9IDE7IGggPCBNQVhfSEVJR0hUICYmIHRiLT5pbnNlcnRfc2l6ZVtoXTsgaCsrKQorCQljaGlsZF9wb3MgPQorCQkgICAgYmFsYW5jZV9pbnRlcm5hbCh0YiwgaCwgY2hpbGRfcG9zLCBpbnNlcnRfa2V5LCBpbnNlcnRfcHRyKTsKIAotCi0gICAgZG9fYmFsYW5jZV9jb21wbGV0ZWQgKHRiKTsKKwlkb19iYWxhbmNlX2NvbXBsZXRlZCh0Yik7CiAKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2ZpbGUuYyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwppbmRleCAxMmU5MTIwLi5jOWYxNzhmIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maWxlLmMKKysrIGIvZnMvcmVpc2VyZnMvZmlsZS5jCkBAIC0yLDcgKzIsNiBAQAogICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKICAqLwogCi0KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KQEAgLTMxLDgyICszMCw4NCBAQAogKiogV2UgdXNlIHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUgdG8gcGFjayB0aGUgdGFpbCwgc2luY2UgaXQgYWxyZWFkeSBoYXMKICoqIGFsbCB0aGUgY29uZGl0aW9ucyBjb2RlZC4gIAogKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfZmlsZV9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQorc3RhdGljIGludCByZWlzZXJmc19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICBpbnQgZXJyOwotICAgIGludCBqYmVnaW5fZmFpbHVyZSA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgZXJyOworCWludCBqYmVnaW5fZmFpbHVyZSA9IDA7CiAKLSAgICBpZiAoIVNfSVNSRUcgKGlub2RlLT5pX21vZGUpKQotCUJVRyAoKTsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCUJVRygpOwogCi0gICAgLyogZmFzdCBvdXQgZm9yIHdoZW4gbm90aGluZyBuZWVkcyB0byBiZSBkb25lICovCi0gICAgaWYgKChhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpID4gMSB8fAotCSEoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3BhY2tfb25fY2xvc2VfbWFzaykgfHwgCi0gICAgICAgICAhdGFpbF9oYXNfdG9fYmVfcGFja2VkKGlub2RlKSkgICAgICAgJiYgCi0JUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPD0gMCkgewotCXJldHVybiAwOwotICAgIH0gICAgCi0gICAgCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgZG93biAoJmlub2RlLT5pX3NlbSk7IAotICAgIC8qIGZyZWVpbmcgcHJlYWxsb2NhdGlvbiBvbmx5IGludm9sdmVzIHJlbG9nZ2luZyBibG9ja3MgdGhhdAotICAgICAqIGFyZSBhbHJlYWR5IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgcHJlYWxsb2NhdGlvbiBnZXRzCi0gICAgICogZnJlZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHRyYW5zYWN0aW9uLCBzbyBpdCBpcyBpbXBvc3NpYmxlIGZvcgotICAgICAqIHVzIHRvIGxvZyBhbnkgYWRkaXRpb25hbCBibG9ja3MgKGluY2x1ZGluZyBxdW90YSBibG9ja3MpCi0gICAgICovCi0gICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAxKTsKLSAgICBpZiAoZXJyKSB7Ci0JLyogdWggb2gsIHdlIGNhbid0IGFsbG93IHRoZSBpbm9kZSB0byBnbyBhd2F5IHdoaWxlIHRoZXJlCi0JICogaXMgc3RpbGwgcHJlYWxsb2NhdGlvbiBibG9ja3MgcGVuZGluZy4gIFRyeSB0byBqb2luIHRoZQotCSAqIGFib3J0ZWQgdHJhbnNhY3Rpb24KLQkgKi8KLQlqYmVnaW5fZmFpbHVyZSA9IGVycjsKLQllcnIgPSBqb3VybmFsX2pvaW5fYWJvcnQoJnRoLCBpbm9kZS0+aV9zYiwgMSk7Ci0KLQlpZiAoZXJyKSB7Ci0JICAgIC8qIGhtcGYsIG91ciBjaG9pY2VzIGhlcmUgYXJlbid0IGdvb2QuICBXZSBjYW4gcGluIHRoZSBpbm9kZQotCSAgICAgKiB3aGljaCB3aWxsIGRpc2FsbG93IHVubW91bnQgZnJvbSBldmVyeSBoYXBwZW5pbmcsIHdlIGNhbgotCSAgICAgKiBkbyBub3RoaW5nLCB3aGljaCB3aWxsIGNvcnJ1cHQgcmFuZG9tIG1lbW9yeSBvbiB1bm1vdW50LAotCSAgICAgKiBvciB3ZSBjYW4gZm9yY2libHkgcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIHByZWFsbG9jYXRpb24KLQkgICAgICogbGlzdCwgd2hpY2ggd2lsbCBsZWFrIGJsb2NrcyBvbiBkaXNrLiAgTGV0cyBwaW4gdGhlIGlub2RlCi0JICAgICAqIGFuZCBsZXQgdGhlIGFkbWluIGtub3cgd2hhdCBpcyBnb2luZyBvbi4KLQkgICAgICovCi0JICAgIGlncmFiKGlub2RlKTsKLQkgICAgcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgInBpbm5pbmcgaW5vZGUgJWx1IGJlY2F1c2UgdGhlICIKLQkgICAgICAgICAgICAgICAgICAgICAicHJlYWxsb2NhdGlvbiBjYW4ndCBiZSBmcmVlZCIpOwotCSAgICBnb3RvIG91dDsKKwkvKiBmYXN0IG91dCBmb3Igd2hlbiBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgKi8KKwlpZiAoKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxIHx8CisJICAgICAhKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spIHx8CisJICAgICAhdGFpbF9oYXNfdG9fYmVfcGFja2VkKGlub2RlKSkgJiYKKwkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPD0gMCkgeworCQlyZXR1cm4gMDsKIAl9Ci0gICAgfQotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworCisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkvKiBmcmVlaW5nIHByZWFsbG9jYXRpb24gb25seSBpbnZvbHZlcyByZWxvZ2dpbmcgYmxvY2tzIHRoYXQKKwkgKiBhcmUgYWxyZWFkeSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIHByZWFsbG9jYXRpb24gZ2V0cworCSAqIGZyZWVkIGF0IHRoZSBlbmQgb2YgZWFjaCB0cmFuc2FjdGlvbiwgc28gaXQgaXMgaW1wb3NzaWJsZSBmb3IKKwkgKiB1cyB0byBsb2cgYW55IGFkZGl0aW9uYWwgYmxvY2tzIChpbmNsdWRpbmcgcXVvdGEgYmxvY2tzKQorCSAqLworCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisJaWYgKGVycikgeworCQkvKiB1aCBvaCwgd2UgY2FuJ3QgYWxsb3cgdGhlIGlub2RlIHRvIGdvIGF3YXkgd2hpbGUgdGhlcmUKKwkJICogaXMgc3RpbGwgcHJlYWxsb2NhdGlvbiBibG9ja3MgcGVuZGluZy4gIFRyeSB0byBqb2luIHRoZQorCQkgKiBhYm9ydGVkIHRyYW5zYWN0aW9uCisJCSAqLworCQlqYmVnaW5fZmFpbHVyZSA9IGVycjsKKwkJZXJyID0gam91cm5hbF9qb2luX2Fib3J0KCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCisJCWlmIChlcnIpIHsKKwkJCS8qIGhtcGYsIG91ciBjaG9pY2VzIGhlcmUgYXJlbid0IGdvb2QuICBXZSBjYW4gcGluIHRoZSBpbm9kZQorCQkJICogd2hpY2ggd2lsbCBkaXNhbGxvdyB1bm1vdW50IGZyb20gZXZlcnkgaGFwcGVuaW5nLCB3ZSBjYW4KKwkJCSAqIGRvIG5vdGhpbmcsIHdoaWNoIHdpbGwgY29ycnVwdCByYW5kb20gbWVtb3J5IG9uIHVubW91bnQsCisJCQkgKiBvciB3ZSBjYW4gZm9yY2libHkgcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIHByZWFsbG9jYXRpb24KKwkJCSAqIGxpc3QsIHdoaWNoIHdpbGwgbGVhayBibG9ja3Mgb24gZGlzay4gIExldHMgcGluIHRoZSBpbm9kZQorCQkJICogYW5kIGxldCB0aGUgYWRtaW4ga25vdyB3aGF0IGlzIGdvaW5nIG9uLgorCQkJICovCisJCQlpZ3JhYihpbm9kZSk7CisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCQkgInBpbm5pbmcgaW5vZGUgJWx1IGJlY2F1c2UgdGhlICIKKwkJCQkJICJwcmVhbGxvY2F0aW9uIGNhbid0IGJlIGZyZWVkIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwogCiAjaWZkZWYgUkVJU0VSRlNfUFJFQUxMT0NBVEUKLSAgICByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jICgmdGgsIGlub2RlKTsKKwlyZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jKCZ0aCwgaW5vZGUpOwogI2VuZGlmCi0gICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisJZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMSk7CiAKLSAgICAvKiBjb3B5IGJhY2sgdGhlIGVycm9yIGNvZGUgZnJvbSBqb3VybmFsX2JlZ2luICovCi0gICAgaWYgKCFlcnIpCi0gICAgICAgIGVyciA9IGpiZWdpbl9mYWlsdXJlOworCS8qIGNvcHkgYmFjayB0aGUgZXJyb3IgY29kZSBmcm9tIGpvdXJuYWxfYmVnaW4gKi8KKwlpZiAoIWVycikKKwkJZXJyID0gamJlZ2luX2ZhaWx1cmU7CiAKLSAgICBpZiAoIWVyciAmJiBhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpIDw9IDEgJiYKLQkoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3BhY2tfb25fY2xvc2VfbWFzaykgJiYKLSAgICAgICAgdGFpbF9oYXNfdG9fYmVfcGFja2VkIChpbm9kZSkpIHsKLQkvKiBpZiByZWd1bGFyIGZpbGUgaXMgcmVsZWFzZWQgYnkgbGFzdCBob2xkZXIgYW5kIGl0IGhhcyBiZWVuCi0JICAgYXBwZW5kZWQgKHdlIGFwcGVuZCBieSB1bmZvcm1hdHRlZCBub2RlIG9ubHkpIG9yIGl0cyBkaXJlY3QKLQkgICBpdGVtKHMpIGhhZCB0byBiZSBjb252ZXJ0ZWQsIHRoZW4gaXQgbWF5IGhhdmUgdG8gYmUKLQkgICBpbmRpcmVjdDJkaXJlY3QgY29udmVydGVkICovCi0JZXJyID0gcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShpbm9kZSwgMCkgOwotICAgIH0KLW91dDoKLSAgICB1cCAoJmlub2RlLT5pX3NlbSk7IAotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIGVycjsKKwlpZiAoIWVyciAmJiBhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpIDw9IDEgJiYKKwkgICAgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spICYmCisJICAgIHRhaWxfaGFzX3RvX2JlX3BhY2tlZChpbm9kZSkpIHsKKwkJLyogaWYgcmVndWxhciBmaWxlIGlzIHJlbGVhc2VkIGJ5IGxhc3QgaG9sZGVyIGFuZCBpdCBoYXMgYmVlbgorCQkgICBhcHBlbmRlZCAod2UgYXBwZW5kIGJ5IHVuZm9ybWF0dGVkIG5vZGUgb25seSkgb3IgaXRzIGRpcmVjdAorCQkgICBpdGVtKHMpIGhhZCB0byBiZSBjb252ZXJ0ZWQsIHRoZW4gaXQgbWF5IGhhdmUgdG8gYmUKKwkJICAgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnRlZCAqLworCQllcnIgPSByZWlzZXJmc190cnVuY2F0ZV9maWxlKGlub2RlLCAwKTsKKwl9CisgICAgICBvdXQ6CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCByZWlzZXJmc192ZnNfdHJ1bmNhdGVfZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7Ci0gICAgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShpbm9kZSwgMSkgOworc3RhdGljIHZvaWQgcmVpc2VyZnNfdmZzX3RydW5jYXRlX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZWlzZXJmc190cnVuY2F0ZV9maWxlKGlub2RlLCAxKTsKIH0KIAogLyogU3luYyBhIHJlaXNlcmZzIGZpbGUuICovCkBAIC0xMTYsMjYgKzExNywyNCBAQAogICogYmUgcmVtb3ZlZC4uLgogICovCiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfc3luY19maWxlKAotCQkJICAgICAgc3RydWN0IGZpbGUgICAqIHBfc19maWxwLAotCQkJICAgICAgc3RydWN0IGRlbnRyeSAqIHBfc19kZW50cnksCi0JCQkgICAgICBpbnQgZGF0YXN5bmMKLQkJCSAgICAgICkgewotICBzdHJ1Y3QgaW5vZGUgKiBwX3NfaW5vZGUgPSBwX3NfZGVudHJ5LT5kX2lub2RlOwotICBpbnQgbl9lcnI7Ci0gIGludCBiYXJyaWVyX2RvbmU7CitzdGF0aWMgaW50IHJlaXNlcmZzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqcF9zX2ZpbHAsCisJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpwX3NfZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICpwX3NfaW5vZGUgPSBwX3NfZGVudHJ5LT5kX2lub2RlOworCWludCBuX2VycjsKKwlpbnQgYmFycmllcl9kb25lOwogCi0gIGlmICghU19JU1JFRyhwX3NfaW5vZGUtPmlfbW9kZSkpCi0gICAgICBCVUcgKCk7Ci0gIG5fZXJyID0gc3luY19tYXBwaW5nX2J1ZmZlcnMocF9zX2lub2RlLT5pX21hcHBpbmcpIDsKLSAgcmVpc2VyZnNfd3JpdGVfbG9jayhwX3NfaW5vZGUtPmlfc2IpOwotICBiYXJyaWVyX2RvbmUgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKHBfc19pbm9kZSk7Ci0gIHJlaXNlcmZzX3dyaXRlX3VubG9jayhwX3NfaW5vZGUtPmlfc2IpOwotICBpZiAoYmFycmllcl9kb25lICE9IDEpCi0gICAgICBibGtkZXZfaXNzdWVfZmx1c2gocF9zX2lub2RlLT5pX3NiLT5zX2JkZXYsIE5VTEwpOwotICBpZiAoYmFycmllcl9kb25lIDwgMCkKLSAgICByZXR1cm4gYmFycmllcl9kb25lOwotICByZXR1cm4gKCBuX2VyciA8IDAgKSA/IC1FSU8gOiAwOworCWlmICghU19JU1JFRyhwX3NfaW5vZGUtPmlfbW9kZSkpCisJCUJVRygpOworCW5fZXJyID0gc3luY19tYXBwaW5nX2J1ZmZlcnMocF9zX2lub2RlLT5pX21hcHBpbmcpOworCXJlaXNlcmZzX3dyaXRlX2xvY2socF9zX2lub2RlLT5pX3NiKTsKKwliYXJyaWVyX2RvbmUgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKHBfc19pbm9kZSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7CisJaWYgKGJhcnJpZXJfZG9uZSAhPSAxKQorCQlibGtkZXZfaXNzdWVfZmx1c2gocF9zX2lub2RlLT5pX3NiLT5zX2JkZXYsIE5VTEwpOworCWlmIChiYXJyaWVyX2RvbmUgPCAwKQorCQlyZXR1cm4gYmFycmllcl9kb25lOworCXJldHVybiAobl9lcnIgPCAwKSA/IC1FSU8gOiAwOwogfQogCiAvKiBJIHJlYWxseSBkbyBub3Qgd2FudCB0byBwbGF5IHdpdGggbWVtb3J5IHNob3J0YWdlIHJpZ2h0IG5vdywgc28KQEAgLTE0Nyw3MDAgKzE0Niw3OTcgQEAKIC8qIEFsbG9jYXRlcyBibG9ja3MgZm9yIGEgZmlsZSB0byBmdWxmaWwgd3JpdGUgcmVxdWVzdC4KICAgIE1hcHMgYWxsIHVubWFwcGVkIGJ1dCBwcmVwYXJlZCBwYWdlcyBmcm9tIHRoZSBsaXN0LgogICAgVXBkYXRlcyBtZXRhZGF0YSB3aXRoIG5ld2x5IGFsbG9jYXRlZCBibG9ja251bWJlcnMgYXMgbmVlZGVkICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2Nrc19mb3JfcmVnaW9uKAotCQkJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIC8qIElub2RlIHdlIHdvcmsgd2l0aCAqLwotCQkJCWxvZmZfdCBwb3MsIC8qIFdyaXRpbmcgcG9zaXRpb24gKi8KLQkJCQlpbnQgbnVtX3BhZ2VzLCAvKiBudW1iZXIgb2YgcGFnZXMgd3JpdGUgZ29pbmcKLQkJCQkJCSAgdG8gdG91Y2ggKi8KLQkJCQlpbnQgd3JpdGVfYnl0ZXMsIC8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLwotCQkJCXN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMsIC8qIGFycmF5IG9mCi0JCQkJCQkJICAgICAgICAgcHJlcGFyZWQgcGFnZXMKLQkJCQkJCQkgICAgICAgKi8KLQkJCQlpbnQgYmxvY2tzX3RvX2FsbG9jYXRlIC8qIEFtb3VudCBvZiBibG9ja3Mgd2UKLQkJCQkJCQkgIG5lZWQgdG8gYWxsb2NhdGUgdG8KLQkJCQkJCQkgIGZpdCB0aGUgZGF0YSBpbnRvIGZpbGUKLQkJCQkJCQkgKi8KLQkJCQkpCitzdGF0aWMgaW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2Nrc19mb3JfcmVnaW9uKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAkvKiBJbm9kZSB3ZSB3b3JrIHdpdGggKi8KKwkJCQkJICAgICAgIGxvZmZfdCBwb3MsCS8qIFdyaXRpbmcgcG9zaXRpb24gKi8KKwkJCQkJICAgICAgIGludCBudW1fcGFnZXMsCS8qIG51bWJlciBvZiBwYWdlcyB3cml0ZSBnb2luZworCQkJCQkJCQkgICB0byB0b3VjaCAqLworCQkJCQkgICAgICAgaW50IHdyaXRlX2J5dGVzLAkvKiBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCQkJICAgICAgIHN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMsCS8qIGFycmF5IG9mCisJCQkJCQkJCQkJICAgcHJlcGFyZWQgcGFnZXMKKwkJCQkJCQkJCQkgKi8KKwkJCQkJICAgICAgIGludCBibG9ja3NfdG9fYWxsb2NhdGUJLyogQW1vdW50IG9mIGJsb2NrcyB3ZQorCQkJCQkJCQkJICAgbmVlZCB0byBhbGxvY2F0ZSB0bworCQkJCQkJCQkJICAgZml0IHRoZSBkYXRhIGludG8gZmlsZQorCQkJCQkJCQkJICovCisgICAgKQogewotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsgLy8gY3B1IGtleSBvZiBpdGVtIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloOyAvLyBwb2ludGVyIHRvIGl0ZW0gaGVhZCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOyAvLyBCdWZmZXIgaGVhZCB0aGF0IGNvbnRhaW5zIGl0ZW1zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIF9fbGUzMiAqIGl0ZW07IC8vIHBvaW50ZXIgdG8gaXRlbSB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgSU5JVElBTElaRV9QQVRIKHBhdGgpOyAvLyBwYXRoIHRvIGl0ZW0sIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aC4KLSAgICBiX2Jsb2NrbnJfdCAqYWxsb2NhdGVkX2Jsb2NrczsgLy8gUG9pbnRlciB0byBhIHBsYWNlIHdoZXJlIGFsbG9jYXRlZCBibG9ja251bWJlcnMgd291bGQgYmUgc3RvcmVkLgotICAgIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQ7IC8vIGhpbnQgc3RydWN0dXJlIGZvciBibG9jayBhbGxvY2F0b3IuCi0gICAgc2l6ZV90IHJlczsgLy8gcmV0dXJuIHZhbHVlIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgd2UgY2FsbC4KLSAgICBpbnQgY3Vycl9ibG9jazsgLy8gY3VycmVudCBibG9jayB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdW5tYXBwZWQgYmxvY2tzLgotICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIKLSAgICBpbnQgaXRlbXBvczsgLy8gcG9zaXRpb24gaW4gaXRlbQotICAgIHVuc2lnbmVkIGludCBmcm9tID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7IC8vIHdyaXRpbmcgcG9zaXRpb24gaW4KLQkJCQkJCSAgICAgICAvLyBmaXJzdCBwYWdlCi0gICAgdW5zaWduZWQgaW50IHRvID0gKChwb3MgKyB3cml0ZV9ieXRlcyAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIDE7IC8qIGxhc3QgbW9kaWZpZWQgYnl0ZSBvZmZzZXQgaW4gbGFzdCBwYWdlICovCi0gICAgX191NjQgaG9sZV9zaXplIDsgLy8gYW1vdW50IG9mIGJsb2NrcyBmb3IgYSBmaWxlIGhvbGUsIGlmIGl0IG5lZWRlZCB0byBiZSBjcmVhdGVkLgotICAgIGludCBtb2RpZnlpbmdfdGhpc19pdGVtID0gMDsgLy8gRmxhZyBmb3IgaXRlbXMgdHJhdmVyc2FsIGNvZGUgdG8ga2VlcCB0cmFjawotCQkJCSAvLyBvZiB0aGUgZmFjdCB0aGF0IHdlIGFscmVhZHkgcHJlcGFyZWQKLQkJCQkgLy8gY3VycmVudCBibG9jayBmb3Igam91cm5hbAotICAgIGludCB3aWxsX3ByZWFsbG9jID0gMDsKLSAgICBSRkFMU0UoIWJsb2Nrc190b19hbGxvY2F0ZSwgImdyZWVuLTkwMDQ6IHRyaWVkIHRvIGFsbG9jYXRlIHplcm8gYmxvY2tzPyIpOworCXN0cnVjdCBjcHVfa2V5IGtleTsJLy8gY3B1IGtleSBvZiBpdGVtIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorCXN0cnVjdCBpdGVtX2hlYWQgKmloOwkvLyBwb2ludGVyIHRvIGl0ZW0gaGVhZCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwkvLyBCdWZmZXIgaGVhZCB0aGF0IGNvbnRhaW5zIGl0ZW1zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorCV9fbGUzMiAqaXRlbTsJCS8vIHBvaW50ZXIgdG8gaXRlbSB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisJSU5JVElBTElaRV9QQVRIKHBhdGgpOwkvLyBwYXRoIHRvIGl0ZW0sIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aC4KKwliX2Jsb2NrbnJfdCAqYWxsb2NhdGVkX2Jsb2NrczsJLy8gUG9pbnRlciB0byBhIHBsYWNlIHdoZXJlIGFsbG9jYXRlZCBibG9ja251bWJlcnMgd291bGQgYmUgc3RvcmVkLgorCXJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQ7CS8vIGhpbnQgc3RydWN0dXJlIGZvciBibG9jayBhbGxvY2F0b3IuCisJc2l6ZV90IHJlczsJCS8vIHJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB0aGF0IHdlIGNhbGwuCisJaW50IGN1cnJfYmxvY2s7CQkvLyBjdXJyZW50IGJsb2NrIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB1bm1hcHBlZCBibG9ja3MuCisJaW50IGk7CQkJLy8gbG9vcCBjb3VudGVyCisJaW50IGl0ZW1wb3M7CQkvLyBwb3NpdGlvbiBpbiBpdGVtCisJdW5zaWduZWQgaW50IGZyb20gPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsJLy8gd3JpdGluZyBwb3NpdGlvbiBpbgorCS8vIGZpcnN0IHBhZ2UKKwl1bnNpZ25lZCBpbnQgdG8gPSAoKHBvcyArIHdyaXRlX2J5dGVzIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgMTsJLyogbGFzdCBtb2RpZmllZCBieXRlIG9mZnNldCBpbiBsYXN0IHBhZ2UgKi8KKwlfX3U2NCBob2xlX3NpemU7CS8vIGFtb3VudCBvZiBibG9ja3MgZm9yIGEgZmlsZSBob2xlLCBpZiBpdCBuZWVkZWQgdG8gYmUgY3JlYXRlZC4KKwlpbnQgbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDA7CS8vIEZsYWcgZm9yIGl0ZW1zIHRyYXZlcnNhbCBjb2RlIHRvIGtlZXAgdHJhY2sKKwkvLyBvZiB0aGUgZmFjdCB0aGF0IHdlIGFscmVhZHkgcHJlcGFyZWQKKwkvLyBjdXJyZW50IGJsb2NrIGZvciBqb3VybmFsCisJaW50IHdpbGxfcHJlYWxsb2MgPSAwOworCVJGQUxTRSghYmxvY2tzX3RvX2FsbG9jYXRlLAorCSAgICAgICAiZ3JlZW4tOTAwNDogdHJpZWQgdG8gYWxsb2NhdGUgemVybyBibG9ja3M/Iik7CiAKLSAgICAvKiBvbmx5IHByZWFsbG9jYXRlIGlmIHRoaXMgaXMgYSBzbWFsbCB3cml0ZSAqLwotICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCB8fAotICAgICAgICghKHdyaXRlX2J5dGVzICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtMSkpICYmCi0gICAgICAgIGJsb2Nrc190b19hbGxvY2F0ZSA8Ci0gICAgICAgIFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZSkpCi0gICAgICAgIHdpbGxfcHJlYWxsb2MgPSBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemU7CisJLyogb25seSBwcmVhbGxvY2F0ZSBpZiB0aGlzIGlzIGEgc21hbGwgd3JpdGUgKi8KKwlpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgfHwKKwkgICAgKCEod3JpdGVfYnl0ZXMgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpICYmCisJICAgICBibG9ja3NfdG9fYWxsb2NhdGUgPAorCSAgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplKSkKKwkJd2lsbF9wcmVhbGxvYyA9CisJCSAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemU7CiAKLSAgICBhbGxvY2F0ZWRfYmxvY2tzID0ga21hbGxvYygoYmxvY2tzX3RvX2FsbG9jYXRlICsgd2lsbF9wcmVhbGxvYykgKgotICAgIAkJCQkJc2l6ZW9mKGJfYmxvY2tucl90KSwgR0ZQX05PRlMpOworCWFsbG9jYXRlZF9ibG9ja3MgPSBrbWFsbG9jKChibG9ja3NfdG9fYWxsb2NhdGUgKyB3aWxsX3ByZWFsbG9jKSAqCisJCQkJICAgc2l6ZW9mKGJfYmxvY2tucl90KSwgR0ZQX05PRlMpOwogCi0gICAgLyogRmlyc3Qgd2UgY29tcG9zZSBhIGtleSB0byBwb2ludCBhdCB0aGUgd3JpdGluZyBwb3NpdGlvbiwgd2Ugd2FudCB0byBkbwotICAgICAgIHRoYXQgb3V0c2lkZSBvZiBhbnkgbG9ja2luZyByZWdpb24uICovCi0gICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgcG9zKzEsIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOworCS8qIEZpcnN0IHdlIGNvbXBvc2UgYSBrZXkgdG8gcG9pbnQgYXQgdGhlIHdyaXRpbmcgcG9zaXRpb24sIHdlIHdhbnQgdG8gZG8KKwkgICB0aGF0IG91dHNpZGUgb2YgYW55IGxvY2tpbmcgcmVnaW9uLiAqLworCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgcG9zICsgMSwgVFlQRV9BTlksIDMgLyprZXkgbGVuZ3RoICovICk7CiAKLSAgICAvKiBJZiB3ZSBjYW1lIGhlcmUsIGl0IG1lYW5zIHdlIGFic29sdXRlbHkgbmVlZCB0byBvcGVuIGEgdHJhbnNhY3Rpb24sCi0gICAgICAgc2luY2Ugd2UgbmVlZCB0byBhbGxvY2F0ZSBzb21lIGJsb2NrcyAqLwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOyAvLyBKb3VybmFsaW5nIHN0dWZmIGFuZCB3ZSBuZWVkIHRoYXQuCi0gICAgcmVzID0gam91cm5hbF9iZWdpbih0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDEgKyAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSk7IC8vIFdpc2ggSSBrbm93IGlmIHRoaXMgbnVtYmVyIGVub3VnaAotICAgIGlmIChyZXMpCi0gICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKwkvKiBJZiB3ZSBjYW1lIGhlcmUsIGl0IG1lYW5zIHdlIGFic29sdXRlbHkgbmVlZCB0byBvcGVuIGEgdHJhbnNhY3Rpb24sCisJICAgc2luY2Ugd2UgbmVlZCB0byBhbGxvY2F0ZSBzb21lIGJsb2NrcyAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwkvLyBKb3VybmFsaW5nIHN0dWZmIGFuZCB3ZSBuZWVkIHRoYXQuCisJcmVzID0gam91cm5hbF9iZWdpbih0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDEgKyAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CS8vIFdpc2ggSSBrbm93IGlmIHRoaXMgbnVtYmVyIGVub3VnaAorCWlmIChyZXMpCisJCWdvdG8gZXJyb3JfZXhpdDsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwogCi0gICAgLyogTG9vayBmb3IgdGhlIGluLXRyZWUgcG9zaXRpb24gb2Ygb3VyIHdyaXRlLCBuZWVkIHBhdGggZm9yIGJsb2NrIGFsbG9jYXRvciAqLwotICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0gICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7Ci0JcmVzID0gLUVJTzsKLQlnb3RvIGVycm9yX2V4aXQ7Ci0gICAgfQotICAgCi0gICAgLyogQWxsb2NhdGUgYmxvY2tzICovCi0gICAgLyogRmlyc3QgZmlsbCBpbiAiaGludCIgc3RydWN0dXJlIGZvciBibG9jayBhbGxvY2F0b3IgKi8KLSAgICBoaW50LnRoID0gdGg7IC8vIHRyYW5zYWN0aW9uIGhhbmRsZS4KLSAgICBoaW50LnBhdGggPSAmcGF0aDsgLy8gUGF0aCwgc28gdGhhdCBibG9jayBhbGxvY2F0b3IgY2FuIGRldGVybWluZSBwYWNraW5nIGxvY2FsaXR5IG9yIHdoYXRldmVyIGl0IG5lZWRzIHRvIGRldGVybWluZS4KLSAgICBoaW50Lmlub2RlID0gaW5vZGU7IC8vIElub2RlIGlzIG5lZWRlZCBieSBibG9jayBhbGxvY2F0b3IgdG9vLgotICAgIGhpbnQuc2VhcmNoX3N0YXJ0ID0gMDsgLy8gV2UgaGF2ZSBubyBoaW50IG9uIHdoZXJlIHRvIHNlYXJjaCBmcmVlIGJsb2NrcyBmb3IgYmxvY2sgYWxsb2NhdG9yLgotICAgIGhpbnQua2V5ID0ga2V5Lm9uX2Rpc2tfa2V5OyAvLyBvbiBkaXNrIGtleSBvZiBmaWxlLgotICAgIGhpbnQuYmxvY2sgPSBpbm9kZS0+aV9ibG9ja3M+Pihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cy05KTsgLy8gTnVtYmVyIG9mIGRpc2sgYmxvY2tzIHRoaXMgZmlsZSBvY2N1cGllcyBhbHJlYWR5LgotICAgIGhpbnQuZm9ybWF0dGVkX25vZGUgPSAwOyAvLyBXZSBhcmUgYWxsb2NhdGluZyBibG9ja3MgZm9yIHVuZm9ybWF0dGVkIG5vZGUuCi0gICAgaGludC5wcmVhbGxvY2F0ZSA9IHdpbGxfcHJlYWxsb2M7Ci0KLSAgICAvKiBDYWxsIGJsb2NrIGFsbG9jYXRvciB0byBhbGxvY2F0ZSBibG9ja3MgKi8KLSAgICByZXMgPSByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgYWxsb2NhdGVkX2Jsb2NrcywgYmxvY2tzX3RvX2FsbG9jYXRlLCBibG9ja3NfdG9fYWxsb2NhdGUpOwotICAgIGlmICggcmVzICE9IENBUlJZX09OICkgewotCWlmICggcmVzID09IE5PX0RJU0tfU1BBQ0UgKSB7Ci0JICAgIC8qIFdlIGZsdXNoIHRoZSB0cmFuc2FjdGlvbiBpbiBjYXNlIG9mIG5vIHNwYWNlLiBUaGlzIHdheSBzb21lCi0JICAgICAgIGJsb2NrcyBtaWdodCBiZWNvbWUgZnJlZSAqLwotCSAgICBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9tdXN0X3dhaXQgPSAxOwotCSAgICByZXMgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpOwotICAgICAgICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7Ci0KLQkgICAgLyogV2UgbWlnaHQgaGF2ZSBzY2hlZHVsZWQsIHNvIHNlYXJjaCBhZ2FpbiAqLwotCSAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCSAgICBpZiAoIHJlcyA9PSBJT19FUlJPUiApIHsKKwkvKiBMb29rIGZvciB0aGUgaW4tdHJlZSBwb3NpdGlvbiBvZiBvdXIgd3JpdGUsIG5lZWQgcGF0aCBmb3IgYmxvY2sgYWxsb2NhdG9yICovCisJcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmVzID09IElPX0VSUk9SKSB7CiAJCXJlcyA9IC1FSU87CiAJCWdvdG8gZXJyb3JfZXhpdDsKLQkgICAgfQotCi0JICAgIC8qIHVwZGF0ZSBjaGFuZ2VkIGluZm8gZm9yIGhpbnQgc3RydWN0dXJlLiAqLwotCSAgICByZXMgPSByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgYWxsb2NhdGVkX2Jsb2NrcywgYmxvY2tzX3RvX2FsbG9jYXRlLCBibG9ja3NfdG9fYWxsb2NhdGUpOwotCSAgICBpZiAoIHJlcyAhPSBDQVJSWV9PTiApIHsKLQkJcmVzID0gLUVOT1NQQzsgCi0JCXBhdGhyZWxzZSgmcGF0aCk7Ci0JCWdvdG8gZXJyb3JfZXhpdDsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIHJlcyA9IC1FTk9TUEM7Ci0JICAgIHBhdGhyZWxzZSgmcGF0aCk7Ci0JICAgIGdvdG8gZXJyb3JfZXhpdDsKIAl9Ci0gICAgfQogCisJLyogQWxsb2NhdGUgYmxvY2tzICovCisJLyogRmlyc3QgZmlsbCBpbiAiaGludCIgc3RydWN0dXJlIGZvciBibG9jayBhbGxvY2F0b3IgKi8KKwloaW50LnRoID0gdGg7CQkvLyB0cmFuc2FjdGlvbiBoYW5kbGUuCisJaGludC5wYXRoID0gJnBhdGg7CS8vIFBhdGgsIHNvIHRoYXQgYmxvY2sgYWxsb2NhdG9yIGNhbiBkZXRlcm1pbmUgcGFja2luZyBsb2NhbGl0eSBvciB3aGF0ZXZlciBpdCBuZWVkcyB0byBkZXRlcm1pbmUuCisJaGludC5pbm9kZSA9IGlub2RlOwkvLyBJbm9kZSBpcyBuZWVkZWQgYnkgYmxvY2sgYWxsb2NhdG9yIHRvby4KKwloaW50LnNlYXJjaF9zdGFydCA9IDA7CS8vIFdlIGhhdmUgbm8gaGludCBvbiB3aGVyZSB0byBzZWFyY2ggZnJlZSBibG9ja3MgZm9yIGJsb2NrIGFsbG9jYXRvci4KKwloaW50LmtleSA9IGtleS5vbl9kaXNrX2tleTsJLy8gb24gZGlzayBrZXkgb2YgZmlsZS4KKwloaW50LmJsb2NrID0gaW5vZGUtPmlfYmxvY2tzID4+IChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOwkvLyBOdW1iZXIgb2YgZGlzayBibG9ja3MgdGhpcyBmaWxlIG9jY3VwaWVzIGFscmVhZHkuCisJaGludC5mb3JtYXR0ZWRfbm9kZSA9IDA7CS8vIFdlIGFyZSBhbGxvY2F0aW5nIGJsb2NrcyBmb3IgdW5mb3JtYXR0ZWQgbm9kZS4KKwloaW50LnByZWFsbG9jYXRlID0gd2lsbF9wcmVhbGxvYzsKKworCS8qIENhbGwgYmxvY2sgYWxsb2NhdG9yIHRvIGFsbG9jYXRlIGJsb2NrcyAqLworCXJlcyA9CisJICAgIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBhbGxvY2F0ZWRfYmxvY2tzLAorCQkJCSAgICAgICBibG9ja3NfdG9fYWxsb2NhdGUsIGJsb2Nrc190b19hbGxvY2F0ZSk7CisJaWYgKHJlcyAhPSBDQVJSWV9PTikgeworCQlpZiAocmVzID09IE5PX0RJU0tfU1BBQ0UpIHsKKwkJCS8qIFdlIGZsdXNoIHRoZSB0cmFuc2FjdGlvbiBpbiBjYXNlIG9mIG5vIHNwYWNlLiBUaGlzIHdheSBzb21lCisJCQkgICBibG9ja3MgbWlnaHQgYmVjb21lIGZyZWUgKi8KKwkJCVNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLT5qX211c3Rfd2FpdCA9IDE7CisJCQlyZXMgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpOworCQkJaWYgKHJlcykKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisKKwkJCS8qIFdlIG1pZ2h0IGhhdmUgc2NoZWR1bGVkLCBzbyBzZWFyY2ggYWdhaW4gKi8KKwkJCXJlcyA9CisJCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksCisJCQkJCQkgICAgICAgJnBhdGgpOworCQkJaWYgKHJlcyA9PSBJT19FUlJPUikgeworCQkJCXJlcyA9IC1FSU87CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfQorCisJCQkvKiB1cGRhdGUgY2hhbmdlZCBpbmZvIGZvciBoaW50IHN0cnVjdHVyZS4gKi8KKwkJCXJlcyA9CisJCQkgICAgcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIGFsbG9jYXRlZF9ibG9ja3MsCisJCQkJCQkgICAgICAgYmxvY2tzX3RvX2FsbG9jYXRlLAorCQkJCQkJICAgICAgIGJsb2Nrc190b19hbGxvY2F0ZSk7CisJCQlpZiAocmVzICE9IENBUlJZX09OKSB7CisJCQkJcmVzID0gLUVOT1NQQzsKKwkJCQlwYXRocmVsc2UoJnBhdGgpOworCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlcyA9IC1FTk9TUEM7CisJCQlwYXRocmVsc2UoJnBhdGgpOworCQkJZ290byBlcnJvcl9leGl0OworCQl9CisJfQogI2lmZGVmIF9fQklHX0VORElBTgotICAgICAgICAvLyBUb28gYmFkLCBJIGhhdmUgbm90IGZvdW5kIGFueSB3YXkgdG8gY29udmVydCBhIGdpdmVuIHJlZ2lvbiBmcm9tCi0gICAgICAgIC8vIGNwdSBmb3JtYXQgdG8gbGl0dGxlIGVuZGlhbiBmb3JtYXQKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2Nrc190b19hbGxvY2F0ZSA7IGkrKykKLSAgICAgICAgICAgIGFsbG9jYXRlZF9ibG9ja3NbaV09Y3B1X3RvX2xlMzIoYWxsb2NhdGVkX2Jsb2Nrc1tpXSk7Ci0gICAgfQorCS8vIFRvbyBiYWQsIEkgaGF2ZSBub3QgZm91bmQgYW55IHdheSB0byBjb252ZXJ0IGEgZ2l2ZW4gcmVnaW9uIGZyb20KKwkvLyBjcHUgZm9ybWF0IHRvIGxpdHRsZSBlbmRpYW4gZm9ybWF0CisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGJsb2Nrc190b19hbGxvY2F0ZTsgaSsrKQorCQkJYWxsb2NhdGVkX2Jsb2Nrc1tpXSA9IGNwdV90b19sZTMyKGFsbG9jYXRlZF9ibG9ja3NbaV0pOworCX0KICNlbmRpZgogCi0gICAgLyogQmxvY2tzIGFsbG9jYXRpbmcgd2VsbCBtaWdodCBoYXZlIHNjaGVkdWxlZCBhbmQgdHJlZSBtaWdodCBoYXZlIGNoYW5nZWQsCi0gICAgICAgbGV0J3Mgc2VhcmNoIHRoZSB0cmVlIGFnYWluICovCi0gICAgLyogZmluZCB3aGVyZSBpbiB0aGUgdHJlZSBvdXIgd3JpdGUgc2hvdWxkIGdvICovCi0gICAgcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLSAgICBpZiAoIHJlcyA9PSBJT19FUlJPUiApIHsKLQlyZXMgPSAtRUlPOwotCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLSAgICB9Ci0KLSAgICBiaCA9IGdldF9sYXN0X2JoKCAmcGF0aCApOyAvLyBHZXQgYSBidWZmZXJoZWFkIGZvciBsYXN0IGVsZW1lbnQgaW4gcGF0aC4KLSAgICBpaCA9IGdldF9paCggJnBhdGggKTsgICAgICAvLyBHZXQgYSBwb2ludGVyIHRvIGxhc3QgaXRlbSBoZWFkIGluIHBhdGguCi0gICAgaXRlbSA9IGdldF9pdGVtKCAmcGF0aCApOyAgLy8gR2V0IGEgcG9pbnRlciB0byBsYXN0IGl0ZW0gaW4gcGF0aAotCi0gICAgLyogTGV0J3Mgc2VlIHdoYXQgd2UgaGF2ZSBmb3VuZCAqLwotICAgIGlmICggcmVzICE9IFBPU0lUSU9OX0ZPVU5EICkgeyAvKiBwb3NpdGlvbiBub3QgZm91bmQsIHRoaXMgbWVhbnMgdGhhdCB3ZQotCQkJCSAgICAgIG1pZ2h0IG5lZWQgdG8gYXBwZW5kIGZpbGUgd2l0aCBob2xlcwotCQkJCSAgICAgIGZpcnN0ICovCi0JLy8gU2luY2Ugd2UgYXJlIHdyaXRpbmcgcGFzdCB0aGUgZmlsZSdzIGVuZCwgd2UgbmVlZCB0byBmaW5kIG91dCBpZgotCS8vIHRoZXJlIGlzIGEgaG9sZSB0aGF0IG5lZWRzIHRvIGJlIGluc2VydGVkIGJlZm9yZSBvdXIgd3JpdGluZwotCS8vIHBvc2l0aW9uLCBhbmQgaG93IG1hbnkgYmxvY2tzIGl0IGlzIGdvaW5nIHRvIGNvdmVyICh3ZSBuZWVkIHRvCi0JLy8gIHBvcHVsYXRlIHBvaW50ZXJzIHRvIGZpbGUgYmxvY2tzIHJlcHJlc2VudGluZyB0aGUgaG9sZSB3aXRoIHplcm9zKQotCi0JewotCSAgICBpbnQgaXRlbV9vZmZzZXQgPSAxOwotCSAgICAvKgotCSAgICAgKiBpZiBpaCBpcyBzdGF0IGRhdGEsIGl0cyBvZmZzZXQgaXMgMCBhbmQgd2UgZG9uJ3Qgd2FudCB0bwotCSAgICAgKiBhZGQgMSB0byBwb3MgaW4gdGhlIGhvbGVfc2l6ZSBjYWxjdWxhdGlvbgotCSAgICAgKi8KLQkgICAgaWYgKGlzX3N0YXRkYXRhX2xlX2loKGloKSkKLQkgICAgICAgIGl0ZW1fb2Zmc2V0ID0gMDsKLQkgICAgaG9sZV9zaXplID0gKHBvcyArIGl0ZW1fb2Zmc2V0IC0KLQkgICAgICAgICAgICAobGVfa2V5X2tfb2Zmc2V0KCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksCi0JCSAgICAmKGloLT5paF9rZXkpKSArCi0JCSAgICBvcF9ieXRlc19udW1iZXIoaWgsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpKSA+PgotCQkgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJLyogQmxvY2tzIGFsbG9jYXRpbmcgd2VsbCBtaWdodCBoYXZlIHNjaGVkdWxlZCBhbmQgdHJlZSBtaWdodCBoYXZlIGNoYW5nZWQsCisJICAgbGV0J3Mgc2VhcmNoIHRoZSB0cmVlIGFnYWluICovCisJLyogZmluZCB3aGVyZSBpbiB0aGUgdHJlZSBvdXIgd3JpdGUgc2hvdWxkIGdvICovCisJcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmVzID09IElPX0VSUk9SKSB7CisJCXJlcyA9IC1FSU87CisJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKIAl9CiAKLQlpZiAoIGhvbGVfc2l6ZSA+IDAgKSB7Ci0JICAgIGludCB0b19wYXN0ZSA9IG1pbl90KF9fdTY0LCBob2xlX3NpemUsIE1BWF9JVEVNX0xFTihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpL1VORk1fUF9TSVpFICk7IC8vIEhvdyBtdWNoIGRhdGEgdG8gaW5zZXJ0IGZpcnN0IHRpbWUuCi0JICAgIC8qIGFyZWEgZmlsbGVkIHdpdGggemVyb2VzLCB0byBzdXBwbHkgYXMgbGlzdCBvZiB6ZXJvIGJsb2NrbnVtYmVycwotCSAgICAgICBXZSBhbGxvY2F0ZSBpdCBvdXRzaWRlIG9mIGxvb3AganVzdCBpbiBjYXNlIGxvb3Agd291bGQgc3BpbiBmb3IKLQkgICAgICAgc2V2ZXJhbCBpdGVyYXRpb25zLiAqLwotCSAgICBjaGFyICp6ZXJvcyA9IGttYWxsb2ModG9fcGFzdGUqVU5GTV9QX1NJWkUsIEdGUF9BVE9NSUMpOyAvLyBXZSBjYW5ub3QgaW5zZXJ0IG1vcmUgdGhhbiBNQVhfSVRFTV9MRU4gYnl0ZXMgYW55d2F5LgotCSAgICBpZiAoICF6ZXJvcyApIHsKLQkJcmVzID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOwotCSAgICB9Ci0JICAgIG1lbXNldCAoIHplcm9zLCAwLCB0b19wYXN0ZSpVTkZNX1BfU0laRSk7Ci0JICAgIGRvIHsKLQkJdG9fcGFzdGUgPSBtaW5fdChfX3U2NCwgaG9sZV9zaXplLCBNQVhfSVRFTV9MRU4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKS9VTkZNX1BfU0laRSApOwotCQlpZiAoIGlzX2luZGlyZWN0X2xlX2loKGloKSApIHsKLQkJICAgIC8qIE9rLCB0aGVyZSBpcyBleGlzdGluZyBpbmRpcmVjdCBpdGVtIGFscmVhZHkuIE5lZWQgdG8gYXBwZW5kIGl0ICovCi0JCSAgICAvKiBDYWxjdWxhdGUgcG9zaXRpb24gcGFzdCBpbnNlcnRlZCBpdGVtICovCi0JCSAgICBtYWtlX2NwdV9rZXkoICZrZXksIGlub2RlLCBsZV9rZXlfa19vZmZzZXQoIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwgJihpaC0+aWhfa2V5KSkgKyBvcF9ieXRlc19udW1iZXIoaWgsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSksIFRZUEVfSU5ESVJFQ1QsIDMpOwotCQkgICAgcmVzID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKCB0aCwgJnBhdGgsICZrZXksIGlub2RlLCAoY2hhciAqKXplcm9zLCBVTkZNX1BfU0laRSp0b19wYXN0ZSk7Ci0JCSAgICBpZiAoIHJlcyApIHsKLQkJCWtmcmVlKHplcm9zKTsKLQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkJICAgIH0KLQkJfSBlbHNlIGlmICggaXNfc3RhdGRhdGFfbGVfaWgoaWgpICkgewotCQkgICAgLyogTm8gZXhpc3RpbmcgaXRlbSwgY3JlYXRlIGl0ICovCi0JCSAgICAvKiBpdGVtIGhlYWQgZm9yIG5ldyBpdGVtICovCi0JCSAgICBzdHJ1Y3QgaXRlbV9oZWFkIGluc19paDsKKwliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsJLy8gR2V0IGEgYnVmZmVyaGVhZCBmb3IgbGFzdCBlbGVtZW50IGluIHBhdGguCisJaWggPSBnZXRfaWgoJnBhdGgpOwkvLyBHZXQgYSBwb2ludGVyIHRvIGxhc3QgaXRlbSBoZWFkIGluIHBhdGguCisJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsJLy8gR2V0IGEgcG9pbnRlciB0byBsYXN0IGl0ZW0gaW4gcGF0aAogCi0JCSAgICAvKiBjcmVhdGUgYSBrZXkgZm9yIG91ciBuZXcgaXRlbSAqLwotCQkgICAgbWFrZV9jcHVfa2V5KCAma2V5LCBpbm9kZSwgMSwgVFlQRV9JTkRJUkVDVCwgMyk7CisJLyogTGV0J3Mgc2VlIHdoYXQgd2UgaGF2ZSBmb3VuZCAqLworCWlmIChyZXMgIT0gUE9TSVRJT05fRk9VTkQpIHsJLyogcG9zaXRpb24gbm90IGZvdW5kLCB0aGlzIG1lYW5zIHRoYXQgd2UKKwkJCQkJICAgbWlnaHQgbmVlZCB0byBhcHBlbmQgZmlsZSB3aXRoIGhvbGVzCisJCQkJCSAgIGZpcnN0ICovCisJCS8vIFNpbmNlIHdlIGFyZSB3cml0aW5nIHBhc3QgdGhlIGZpbGUncyBlbmQsIHdlIG5lZWQgdG8gZmluZCBvdXQgaWYKKwkJLy8gdGhlcmUgaXMgYSBob2xlIHRoYXQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIG91ciB3cml0aW5nCisJCS8vIHBvc2l0aW9uLCBhbmQgaG93IG1hbnkgYmxvY2tzIGl0IGlzIGdvaW5nIHRvIGNvdmVyICh3ZSBuZWVkIHRvCisJCS8vICBwb3B1bGF0ZSBwb2ludGVycyB0byBmaWxlIGJsb2NrcyByZXByZXNlbnRpbmcgdGhlIGhvbGUgd2l0aCB6ZXJvcykKIAotCQkgICAgLyogQ3JlYXRlIG5ldyBpdGVtIGhlYWQgZm9yIG91ciBuZXcgaXRlbSAqLwotCQkgICAgbWFrZV9sZV9pdGVtX2hlYWQgKCZpbnNfaWgsICZrZXksIGtleS52ZXJzaW9uLCAxLAotCQkJCSAgICAgICBUWVBFX0lORElSRUNULCB0b19wYXN0ZSpVTkZNX1BfU0laRSwKLQkJCQkgICAgICAgMCAvKiBmcmVlIHNwYWNlICovKTsKKwkJeworCQkJaW50IGl0ZW1fb2Zmc2V0ID0gMTsKKwkJCS8qCisJCQkgKiBpZiBpaCBpcyBzdGF0IGRhdGEsIGl0cyBvZmZzZXQgaXMgMCBhbmQgd2UgZG9uJ3Qgd2FudCB0bworCQkJICogYWRkIDEgdG8gcG9zIGluIHRoZSBob2xlX3NpemUgY2FsY3VsYXRpb24KKwkJCSAqLworCQkJaWYgKGlzX3N0YXRkYXRhX2xlX2loKGloKSkKKwkJCQlpdGVtX29mZnNldCA9IDA7CisJCQlob2xlX3NpemUgPSAocG9zICsgaXRlbV9vZmZzZXQgLQorCQkJCSAgICAgKGxlX2tleV9rX29mZnNldAorCQkJCSAgICAgIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksCisJCQkJICAgICAgICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyKGloLAorCQkJCQkJCQkJaW5vZGUtPgorCQkJCQkJCQkJaV9zYi0+CisJCQkJCQkJCQlzX2Jsb2Nrc2l6ZSkpKQorCQkJICAgID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQl9CiAKLQkJICAgIC8qIEZpbmQgd2hlcmUgc3VjaCBpdGVtIHNob3VsZCBsaXZlIGluIHRoZSB0cmVlICovCi0JCSAgICByZXMgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQkJICAgIGlmICggcmVzICE9IElURU1fTk9UX0ZPVU5EICkgewotCQkJLyogaXRlbSBzaG91bGQgbm90IGV4aXN0LCBvdGhlcndpc2Ugd2UgaGF2ZSBlcnJvciAqLwotCQkJaWYgKCByZXMgIT0gLUVOT1NQQyApIHsKLQkJCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKLQkJCQkiZ3JlZW4tOTAwODogc2VhcmNoX2J5X2tleSAoJUspIHJldHVybmVkICVkIiwKLQkJCQkJICAgICAgJmtleSwgcmVzKTsKKwkJaWYgKGhvbGVfc2l6ZSA+IDApIHsKKwkJCWludCB0b19wYXN0ZSA9IG1pbl90KF9fdTY0LCBob2xlX3NpemUsIE1BWF9JVEVNX0xFTihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpIC8gVU5GTV9QX1NJWkUpOwkvLyBIb3cgbXVjaCBkYXRhIHRvIGluc2VydCBmaXJzdCB0aW1lLgorCQkJLyogYXJlYSBmaWxsZWQgd2l0aCB6ZXJvZXMsIHRvIHN1cHBseSBhcyBsaXN0IG9mIHplcm8gYmxvY2tudW1iZXJzCisJCQkgICBXZSBhbGxvY2F0ZSBpdCBvdXRzaWRlIG9mIGxvb3AganVzdCBpbiBjYXNlIGxvb3Agd291bGQgc3BpbiBmb3IKKwkJCSAgIHNldmVyYWwgaXRlcmF0aW9ucy4gKi8KKwkJCWNoYXIgKnplcm9zID0ga21hbGxvYyh0b19wYXN0ZSAqIFVORk1fUF9TSVpFLCBHRlBfQVRPTUlDKTsJLy8gV2UgY2Fubm90IGluc2VydCBtb3JlIHRoYW4gTUFYX0lURU1fTEVOIGJ5dGVzIGFueXdheS4KKwkJCWlmICghemVyb3MpIHsKKwkJCQlyZXMgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKIAkJCX0KLQkJCXJlcyA9IC1FSU87Ci0JCSAgICAgICAga2ZyZWUoemVyb3MpOwotCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOwotCQkgICAgfQotCQkgICAgcmVzID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0oIHRoLCAmcGF0aCwgJmtleSwgJmluc19paCwgaW5vZGUsIChjaGFyICopemVyb3MpOworCQkJbWVtc2V0KHplcm9zLCAwLCB0b19wYXN0ZSAqIFVORk1fUF9TSVpFKTsKKwkJCWRvIHsKKwkJCQl0b19wYXN0ZSA9CisJCQkJICAgIG1pbl90KF9fdTY0LCBob2xlX3NpemUsCisJCQkJCSAgTUFYX0lURU1fTEVOKGlub2RlLT5pX3NiLT4KKwkJCQkJCSAgICAgICBzX2Jsb2Nrc2l6ZSkgLworCQkJCQkgIFVORk1fUF9TSVpFKTsKKwkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKSB7CisJCQkJCS8qIE9rLCB0aGVyZSBpcyBleGlzdGluZyBpbmRpcmVjdCBpdGVtIGFscmVhZHkuIE5lZWQgdG8gYXBwZW5kIGl0ICovCisJCQkJCS8qIENhbGN1bGF0ZSBwb3NpdGlvbiBwYXN0IGluc2VydGVkIGl0ZW0gKi8KKwkJCQkJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLAorCQkJCQkJICAgICBsZV9rZXlfa19vZmZzZXQKKwkJCQkJCSAgICAgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uCisJCQkJCQkgICAgICAoaW5vZGUpLAorCQkJCQkJICAgICAgJihpaC0+aWhfa2V5KSkgKworCQkJCQkJICAgICBvcF9ieXRlc19udW1iZXIoaWgsCisJCQkJCQkJCSAgICAgaW5vZGUtPgorCQkJCQkJCQkgICAgIGlfc2ItPgorCQkJCQkJCQkgICAgIHNfYmxvY2tzaXplKSwKKwkJCQkJCSAgICAgVFlQRV9JTkRJUkVDVCwgMyk7CisJCQkJCXJlcyA9CisJCQkJCSAgICByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0odGgsICZwYXRoLAorCQkJCQkJCQkgICAgICZrZXksCisJCQkJCQkJCSAgICAgaW5vZGUsCisJCQkJCQkJCSAgICAgKGNoYXIgKikKKwkJCQkJCQkJICAgICB6ZXJvcywKKwkJCQkJCQkJICAgICBVTkZNX1BfU0laRQorCQkJCQkJCQkgICAgICoKKwkJCQkJCQkJICAgICB0b19wYXN0ZSk7CisJCQkJCWlmIChyZXMpIHsKKwkJCQkJCWtmcmVlKHplcm9zKTsKKwkJCQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpKSB7CisJCQkJCS8qIE5vIGV4aXN0aW5nIGl0ZW0sIGNyZWF0ZSBpdCAqLworCQkJCQkvKiBpdGVtIGhlYWQgZm9yIG5ldyBpdGVtICovCisJCQkJCXN0cnVjdCBpdGVtX2hlYWQgaW5zX2loOworCisJCQkJCS8qIGNyZWF0ZSBhIGtleSBmb3Igb3VyIG5ldyBpdGVtICovCisJCQkJCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgMSwKKwkJCQkJCSAgICAgVFlQRV9JTkRJUkVDVCwgMyk7CisKKwkJCQkJLyogQ3JlYXRlIG5ldyBpdGVtIGhlYWQgZm9yIG91ciBuZXcgaXRlbSAqLworCQkJCQltYWtlX2xlX2l0ZW1faGVhZCgmaW5zX2loLCAma2V5LAorCQkJCQkJCSAga2V5LnZlcnNpb24sIDEsCisJCQkJCQkJICBUWVBFX0lORElSRUNULAorCQkJCQkJCSAgdG9fcGFzdGUgKgorCQkJCQkJCSAgVU5GTV9QX1NJWkUsCisJCQkJCQkJICAwIC8qIGZyZWUgc3BhY2UgKi8gKTsKKworCQkJCQkvKiBGaW5kIHdoZXJlIHN1Y2ggaXRlbSBzaG91bGQgbGl2ZSBpbiB0aGUgdHJlZSAqLworCQkJCQlyZXMgPQorCQkJCQkgICAgc2VhcmNoX2l0ZW0oaW5vZGUtPmlfc2IsICZrZXksCisJCQkJCQkJJnBhdGgpOworCQkJCQlpZiAocmVzICE9IElURU1fTk9UX0ZPVU5EKSB7CisJCQkJCQkvKiBpdGVtIHNob3VsZCBub3QgZXhpc3QsIG90aGVyd2lzZSB3ZSBoYXZlIGVycm9yICovCisJCQkJCQlpZiAocmVzICE9IC1FTk9TUEMpIHsKKwkJCQkJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT4KKwkJCQkJCQkJCSBpX3NiLAorCQkJCQkJCQkJICJncmVlbi05MDA4OiBzZWFyY2hfYnlfa2V5ICglSykgcmV0dXJuZWQgJWQiLAorCQkJCQkJCQkJICZrZXksCisJCQkJCQkJCQkgcmVzKTsKKwkJCQkJCX0KKwkJCQkJCXJlcyA9IC1FSU87CisJCQkJCQlrZnJlZSh6ZXJvcyk7CisJCQkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQkJCX0KKwkJCQkJcmVzID0KKwkJCQkJICAgIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCAmcGF0aCwKKwkJCQkJCQkJICZrZXksICZpbnNfaWgsCisJCQkJCQkJCSBpbm9kZSwKKwkJCQkJCQkJIChjaGFyICopemVyb3MpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJCQkJICAgICAgICJncmVlbi05MDExOiBVbmV4cGVjdGVkIGtleSB0eXBlICVLXG4iLAorCQkJCQkJICAgICAgICZrZXkpOworCQkJCX0KKwkJCQlpZiAocmVzKSB7CisJCQkJCWtmcmVlKHplcm9zKTsKKwkJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJCX0KKwkJCQkvKiBOb3cgd2Ugd2FudCB0byBjaGVjayBpZiB0cmFuc2FjdGlvbiBpcyB0b28gZnVsbCwgYW5kIGlmIGl0IGlzCisJCQkJICAgd2UgcmVzdGFydCBpdC4gVGhpcyB3aWxsIGFsc28gZnJlZSB0aGUgcGF0aC4gKi8KKwkJCQlpZiAoam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kCisJCQkJICAgICh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKKwkJCQkJcmVzID0KKwkJCQkJICAgIHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLAorCQkJCQkJCQkmcGF0aCk7CisJCQkJCWlmIChyZXMpIHsKKwkJCQkJCXBhdGhyZWxzZSgmcGF0aCk7CisJCQkJCQlrZnJlZSh6ZXJvcyk7CisJCQkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBXZWxsLCBuZWVkIHRvIHJlY2FsY3VsYXRlIHBhdGggYW5kIHN0dWZmICovCisJCQkJc2V0X2NwdV9rZXlfa19vZmZzZXQoJmtleSwKKwkJCQkJCSAgICAgY3B1X2tleV9rX29mZnNldCgma2V5KSArCisJCQkJCQkgICAgICh0b19wYXN0ZSA8PCBpbm9kZS0+CisJCQkJCQkgICAgICBpX2Jsa2JpdHMpKTsKKwkJCQlyZXMgPQorCQkJCSAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwKKwkJCQkJCQkgICAgICAgJmtleSwgJnBhdGgpOworCQkJCWlmIChyZXMgPT0gSU9fRVJST1IpIHsKKwkJCQkJcmVzID0gLUVJTzsKKwkJCQkJa2ZyZWUoemVyb3MpOworCQkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQkJfQorCQkJCWJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpOworCQkJCWloID0gZ2V0X2loKCZwYXRoKTsKKwkJCQlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOworCQkJCWhvbGVfc2l6ZSAtPSB0b19wYXN0ZTsKKwkJCX0gd2hpbGUgKGhvbGVfc2l6ZSk7CisJCQlrZnJlZSh6ZXJvcyk7CisJCX0KKwl9CisJLy8gR28gdGhyb3VnaCBleGlzdGluZyBpbmRpcmVjdCBpdGVtcyBmaXJzdAorCS8vIHJlcGxhY2UgYWxsIHplcm9lcyB3aXRoIGJsb2NrbnVtYmVycyBmcm9tIGxpc3QKKwkvLyBOb3RlIHRoYXQgaWYgbm8gY29ycmVzcG9uZGluZyBpdGVtIHdhcyBmb3VuZCwgYnkgcHJldmlvdXMgc2VhcmNoLAorCS8vIGl0IG1lYW5zIHRoZXJlIGFyZSBubyBleGlzdGluZyBpbi10cmVlIHJlcHJlc2VudGF0aW9uIGZvciBmaWxlIGFyZWEKKwkvLyB3ZSBhcmUgZ29pbmcgdG8gb3ZlcndyaXRlLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHNjYW4gdGhyb3VnaCBmb3IgaG9sZXMuCisJZm9yIChjdXJyX2Jsb2NrID0gMCwgaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW07CisJICAgICBjdXJyX2Jsb2NrIDwgYmxvY2tzX3RvX2FsbG9jYXRlICYmIHJlcyA9PSBQT1NJVElPTl9GT1VORDspIHsKKwkgICAgICByZXRyeToKKworCQlpZiAoaXRlbXBvcyA+PSBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSkgeworCQkJLyogV2UgcnVuIG91dCBvZiBkYXRhIGluIHRoaXMgaW5kaXJlY3QgaXRlbSwgbGV0J3MgbG9vayBmb3IgYW5vdGhlcgorCQkJICAgb25lLiAqLworCQkJLyogRmlyc3QgaWYgd2UgYXJlIGFscmVhZHkgbW9kaWZ5aW5nIGN1cnJlbnQgaXRlbSwgbG9nIGl0ICovCisJCQlpZiAobW9kaWZ5aW5nX3RoaXNfaXRlbSkgeworCQkJCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKKwkJCQltb2RpZnlpbmdfdGhpc19pdGVtID0gMDsKKwkJCX0KKwkJCS8qIFRoZW4gc2V0IHRoZSBrZXkgdG8gbG9vayBmb3IgYSBuZXcgaW5kaXJlY3QgaXRlbSAob2Zmc2V0IG9mIG9sZAorCQkJICAgaXRlbSBpcyBhZGRlZCB0byBvbGQgaXRlbSBsZW5ndGggKi8KKwkJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksCisJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0CisJCQkJCSAgICAgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwKKwkJCQkJICAgICAgJihpaC0+aWhfa2V5KSkgKworCQkJCQkgICAgIG9wX2J5dGVzX251bWJlcihpaCwKKwkJCQkJCQkgICAgIGlub2RlLT5pX3NiLT4KKwkJCQkJCQkgICAgIHNfYmxvY2tzaXplKSk7CisJCQkvKiBTZWFyY2ggb2ZvciBwb3NpdGlvbiBvZiBuZXcga2V5IGluIHRoZSB0cmVlLiAqLworCQkJcmVzID0KKwkJCSAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwKKwkJCQkJCSAgICAgICAmcGF0aCk7CisJCQlpZiAocmVzID09IElPX0VSUk9SKSB7CisJCQkJcmVzID0gLUVJTzsKKwkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQl9CisJCQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJCWloID0gZ2V0X2loKCZwYXRoKTsKKwkJCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJCQlpdGVtcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKKwkJCWNvbnRpbnVlOwkvLyBsb29wIHRvIGNoZWNrIGFsbCBraW5kcyBvZiBjb25kaXRpb25zIGFuZCBzbyBvbi4KKwkJfQorCQkvKiBPaywgd2UgaGF2ZSBjb3JyZWN0IHBvc2l0aW9uIGluIGl0ZW0gbm93LCBzbyBsZXQncyBzZWUgaWYgaXQgaXMKKwkJICAgcmVwcmVzZW50aW5nIGZpbGUgaG9sZSAoYmxvY2tudW1iZXIgaXMgemVybykgYW5kIGZpbGwgaXQgaWYgbmVlZGVkICovCisJCWlmICghaXRlbVtpdGVtcG9zXSkgeworCQkJLyogT2ssIGEgaG9sZS4gTm93IHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgYWxyZWFkeSBwcmVwYXJlZCB0aGlzCisJCQkgICBibG9jayB0byBiZSBqb3VybmFsZWQgKi8KKwkJCXdoaWxlICghbW9kaWZ5aW5nX3RoaXNfaXRlbSkgewkvLyBsb29wIHVudGlsIHN1Y2NlZWQKKwkJCQkvKiBXZWxsLCB0aGlzIGl0ZW0gaXMgbm90IGpvdXJuYWxlZCB5ZXQsIHNvIHdlIG11c3QgcHJlcGFyZQorCQkJCSAgIGl0IGZvciBqb3VybmFsIGZpcnN0LCBiZWZvcmUgd2UgY2FuIGNoYW5nZSBpdCAqLworCQkJCXN0cnVjdCBpdGVtX2hlYWQgdG1wX2loOwkvLyBXZSBjb3B5IGl0ZW0gaGVhZCBvZiBmb3VuZCBpdGVtLAorCQkJCS8vIGhlcmUgdG8gZGV0ZWN0IGlmIGZzIGNoYW5nZWQgdW5kZXIKKwkJCQkvLyB1cyB3aGlsZSB3ZSB3ZXJlIHByZXBhcmluZyBmb3IKKwkJCQkvLyBqb3VybmFsLgorCQkJCWludCBmc19nZW47CS8vIFdlIHN0b3JlIGZzIGdlbmVyYXRpb24gaGVyZSB0byBmaW5kIGlmIHNvbWVvbmUKKwkJCQkvLyBjaGFuZ2VzIGZzIHVuZGVyIG91ciBmZWV0CisKKwkJCQljb3B5X2l0ZW1faGVhZCgmdG1wX2loLCBpaCk7CS8vIFJlbWVtYmVyIGl0ZW1oZWFkCisJCQkJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpOwkvLyByZW1lbWJlciBmcyBnZW5lcmF0aW9uCisJCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChpbm9kZS0+aV9zYiwgYmgsIDEpOwkvLyBQcmVwYXJlIGEgYnVmZmVyIHdpdGhpbiB3aGljaCBpbmRpcmVjdCBpdGVtIGlzIHN0b3JlZCBmb3IgY2hhbmdpbmcuCisJCQkJaWYgKGZzX2NoYW5nZWQoZnNfZ2VuLCBpbm9kZS0+aV9zYikKKwkJCQkgICAgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKKwkJCQkJLy8gU2lnaCwgZnMgd2FzIGNoYW5nZWQgdW5kZXIgdXMsIHdlIG5lZWQgdG8gbG9vayBmb3IgbmV3CisJCQkJCS8vIGxvY2F0aW9uIG9mIGl0ZW0gd2UgYXJlIHdvcmtpbmcgd2l0aAorCisJCQkJCS8qIHVubWFyayBwcmVwYWVyZCBhcmVhIGFzIGpvdXJuYWxlZCBhbmQgc2VhcmNoIGZvciBpdCdzCisJCQkJCSAgIG5ldyBwb3NpdGlvbiAqLworCQkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihpbm9kZS0+CisJCQkJCQkJCQkgaV9zYiwKKwkJCQkJCQkJCSBiaCk7CisJCQkJCXJlcyA9CisJCQkJCSAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+CisJCQkJCQkJCSAgICAgICBpX3NiLAorCQkJCQkJCQkgICAgICAgJmtleSwKKwkJCQkJCQkJICAgICAgICZwYXRoKTsKKwkJCQkJaWYgKHJlcyA9PSBJT19FUlJPUikgeworCQkJCQkJcmVzID0gLUVJTzsKKwkJCQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJCQkJfQorCQkJCQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJCQkJaWggPSBnZXRfaWgoJnBhdGgpOworCQkJCQlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOworCQkJCQlpdGVtcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKKwkJCQkJZ290byByZXRyeTsKKwkJCQl9CisJCQkJbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDE7CisJCQl9CisJCQlpdGVtW2l0ZW1wb3NdID0gYWxsb2NhdGVkX2Jsb2Nrc1tjdXJyX2Jsb2NrXTsJLy8gQXNzaWduIG5ldyBibG9jaworCQkJY3Vycl9ibG9jaysrOworCQl9CisJCWl0ZW1wb3MrKzsKKwl9CisKKwlpZiAobW9kaWZ5aW5nX3RoaXNfaXRlbSkgewkvLyBXZSBuZWVkIHRvIGxvZyBsYXN0LWFjY2Vzc2VkIGJsb2NrLCBpZiBpdAorCQkvLyB3YXMgbW9kaWZpZWQsIGJ1dCBub3QgbG9nZ2VkIHlldC4KKwkJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBpbm9kZS0+aV9zYiwgYmgpOworCX0KKworCWlmIChjdXJyX2Jsb2NrIDwgYmxvY2tzX3RvX2FsbG9jYXRlKSB7CisJCS8vIE9oLCB3ZWxsIG5lZWQgdG8gYXBwZW5kIHRvIGluZGlyZWN0IGl0ZW0sIG9yIHRvIGNyZWF0ZSBpbmRpcmVjdCBpdGVtCisJCS8vIGlmIHRoZXJlIHdlcmVuJ3QgYW55CisJCWlmIChpc19pbmRpcmVjdF9sZV9paChpaCkpIHsKKwkJCS8vIEV4aXN0aW5nIGluZGlyZWN0IGl0ZW0gLSBhcHBlbmQuIEZpcnN0IGNhbGN1bGF0ZSBrZXkgZm9yIGFwcGVuZAorCQkJLy8gcG9zaXRpb24uIFdlIGRvIG5vdCBuZWVkIHRvIHJlY2FsY3VsYXRlIHBhdGggYXMgaXQgc2hvdWxkCisJCQkvLyBhbHJlYWR5IHBvaW50IHRvIGNvcnJlY3QgcGxhY2UuCisJCQltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsCisJCQkJICAgICBsZV9rZXlfa19vZmZzZXQoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24KKwkJCQkJCSAgICAgKGlub2RlKSwKKwkJCQkJCSAgICAgJihpaC0+aWhfa2V5KSkgKworCQkJCSAgICAgb3BfYnl0ZXNfbnVtYmVyKGloLAorCQkJCQkJICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLAorCQkJCSAgICAgVFlQRV9JTkRJUkVDVCwgMyk7CisJCQlyZXMgPQorCQkJICAgIHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSh0aCwgJnBhdGgsICZrZXksIGlub2RlLAorCQkJCQkJICAgICAoY2hhciAqKShhbGxvY2F0ZWRfYmxvY2tzICsKKwkJCQkJCQkgICAgICBjdXJyX2Jsb2NrKSwKKwkJCQkJCSAgICAgVU5GTV9QX1NJWkUgKgorCQkJCQkJICAgICAoYmxvY2tzX3RvX2FsbG9jYXRlIC0KKwkJCQkJCSAgICAgIGN1cnJfYmxvY2spKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQl9CisJCX0gZWxzZSBpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpKSB7CisJCQkvLyBMYXN0IGZvdW5kIGl0ZW0gd2FzIHN0YXRkYXRhLiBUaGF0IG1lYW5zIHdlIG5lZWQgdG8gY3JlYXRlIGluZGlyZWN0IGl0ZW0uCisJCQlzdHJ1Y3QgaXRlbV9oZWFkIGluc19paDsJLyogaXRlbWhlYWQgZm9yIG5ldyBpdGVtICovCisKKwkJCS8qIGNyZWF0ZSBhIGtleSBmb3Igb3VyIG5ldyBpdGVtICovCisJCQltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIDEsIFRZUEVfSU5ESVJFQ1QsIDMpOwkvLyBQb3NpdGlvbiBvbmUsCisJCQkvLyBiZWNhdXNlIHRoYXQncworCQkJLy8gd2hlcmUgZmlyc3QKKwkJCS8vIGluZGlyZWN0IGl0ZW0KKwkJCS8vIGJlZ2lucworCQkJLyogQ3JlYXRlIG5ldyBpdGVtIGhlYWQgZm9yIG91ciBuZXcgaXRlbSAqLworCQkJbWFrZV9sZV9pdGVtX2hlYWQoJmluc19paCwgJmtleSwga2V5LnZlcnNpb24sIDEsCisJCQkJCSAgVFlQRV9JTkRJUkVDVCwKKwkJCQkJICAoYmxvY2tzX3RvX2FsbG9jYXRlIC0KKwkJCQkJICAgY3Vycl9ibG9jaykgKiBVTkZNX1BfU0laRSwKKwkJCQkJICAwIC8qIGZyZWUgc3BhY2UgKi8gKTsKKwkJCS8qIEZpbmQgd2hlcmUgc3VjaCBpdGVtIHNob3VsZCBsaXZlIGluIHRoZSB0cmVlICovCisJCQlyZXMgPSBzZWFyY2hfaXRlbShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCQkJaWYgKHJlcyAhPSBJVEVNX05PVF9GT1VORCkgeworCQkJCS8qIFdlbGwsIGlmIHdlIGhhdmUgZm91bmQgc3VjaCBpdGVtIGFscmVhZHksIG9yIHNvbWUgZXJyb3IKKwkJCQkgICBvY2N1cmVkLCB3ZSBuZWVkIHRvIHdhcm4gdXNlciBhbmQgcmV0dXJuIGVycm9yICovCisJCQkJaWYgKHJlcyAhPSAtRU5PU1BDKSB7CisJCQkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCQkJICJncmVlbi05MDA5OiBzZWFyY2hfYnlfa2V5ICglSykgIgorCQkJCQkJCSAicmV0dXJuZWQgJWQiLCAma2V5LAorCQkJCQkJCSByZXMpOworCQkJCX0KKwkJCQlyZXMgPSAtRUlPOworCQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJCX0KKwkJCS8qIEluc2VydCBpdGVtIGludG8gdGhlIHRyZWUgd2l0aCB0aGUgZGF0YSBhcyBpdHMgYm9keSAqLworCQkJcmVzID0KKwkJCSAgICByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgJnBhdGgsICZrZXksICZpbnNfaWgsCisJCQkJCQkgaW5vZGUsCisJCQkJCQkgKGNoYXIgKikoYWxsb2NhdGVkX2Jsb2NrcyArCisJCQkJCQkJICBjdXJyX2Jsb2NrKSk7CiAJCX0gZWxzZSB7Ci0JCSAgICByZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMTE6IFVuZXhwZWN0ZWQga2V5IHR5cGUgJUtcbiIsICZrZXkpOworCQkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgICJncmVlbi05MDEwOiB1bmV4cGVjdGVkIGl0ZW0gdHlwZSBmb3Iga2V5ICVLXG4iLAorCQkJCSAgICAgICAma2V5KTsKIAkJfQotCQlpZiAoIHJlcyApIHsKLQkJICAgIGtmcmVlKHplcm9zKTsKLQkJICAgIGdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwl9CisJLy8gdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgdHJhbnNhY3Rpb24KKwkvLyB1bmxlc3Mgd2UgcmV0dXJuIGFuIGVycm9yLCB0aGV5IGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBsb2dnaW5nCisJLy8gdGhlIGlub2RlLgorCS8vCisJcGF0aHJlbHNlKCZwYXRoKTsKKwkvKgorCSAqIGNsZWFudXAgcHJlbGxvY2F0aW9uIGZyb20gcHJldmlvdXMgd3JpdGVzCisJICogaWYgdGhpcyBpcyBhIHBhcnRpYWwgYmxvY2sgd3JpdGUKKwkgKi8KKwlpZiAod3JpdGVfYnl0ZXMgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpCisJCXJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2ModGgsIGlub2RlKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCisJLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHBhZ2VzL2J1ZmZlcnMgYW5kIG1hcCB0aGUgYnVmZmVycyB0byBuZXdseSBhbGxvY2F0ZWQKKwkvLyBibG9ja3MgKHNvIHRoYXQgc3lzdGVtIGtub3dzIHdoZXJlIHRvIHdyaXRlIHRoZXNlIHBhZ2VzIGxhdGVyKS4KKwljdXJyX2Jsb2NrID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwcmVwYXJlZF9wYWdlc1tpXTsJLy9jdXJyZW50IHBhZ2UKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwkvLyBmaXJzdCBidWZmZXIgZm9yIGEgcGFnZQorCQlpbnQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsJLy8gaW4tcGFnZSBvZmZzZXRzIGZvciBidWZmZXJzLgorCisJCWlmICghcGFnZV9idWZmZXJzKHBhZ2UpKQorCQkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgICJncmVlbi05MDA1OiBObyBidWZmZXJzIGZvciBwcmVwYXJlZCBwYWdlPz8/Iik7CisKKwkJLyogRm9yIGVhY2ggYnVmZmVyIGluIHBhZ2UgKi8KKwkJZm9yIChiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJCSAgICAgYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CisJCQlpZiAoIWJoKQorCQkJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJCQkgICAgICAgImdyZWVuLTkwMDY6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOworCQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCQlpZiAoaSA9PSAwICYmIGJsb2NrX2VuZCA8PSBmcm9tKQorCQkJCS8qIGlmIHRoaXMgYnVmZmVyIGlzIGJlZm9yZSByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQgKi8KKwkJCQljb250aW51ZTsKKwkJCWlmIChpID09IG51bV9wYWdlcyAtIDEgJiYgYmxvY2tfc3RhcnQgPj0gdG8pCisJCQkJLyogSWYgdGhpcyBidWZmZXIgaXMgYWZ0ZXIgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBhYm9ydAorCQkJCSAgIHByb2Nlc3Npbmcgb2YgY3VycmVudCBwYWdlICovCisJCQkJYnJlYWs7CisKKwkJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsJLy8gT2ssIHVubWFwcGVkIGJ1ZmZlciwgbmVlZCB0byBtYXAgaXQKKwkJCQltYXBfYmgoYmgsIGlub2RlLT5pX3NiLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShhbGxvY2F0ZWRfYmxvY2tzCisJCQkJCQkgICBbY3Vycl9ibG9ja10pKTsKKwkJCQljdXJyX2Jsb2NrKys7CisJCQkJc2V0X2J1ZmZlcl9uZXcoYmgpOworCQkJfQogCQl9Ci0JCS8qIE5vdyB3ZSB3YW50IHRvIGNoZWNrIGlmIHRyYW5zYWN0aW9uIGlzIHRvbyBmdWxsLCBhbmQgaWYgaXQgaXMKLQkJICAgd2UgcmVzdGFydCBpdC4gVGhpcyB3aWxsIGFsc28gZnJlZSB0aGUgcGF0aC4gKi8KLQkJaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKLQkJICAgIHJlcyA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoemVyb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0JCS8qIFdlbGwsIG5lZWQgdG8gcmVjYWxjdWxhdGUgcGF0aCBhbmQgc3R1ZmYgKi8KLQkJc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyAodG9fcGFzdGUgPDwgaW5vZGUtPmlfYmxrYml0cykpOwotCQlyZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCQlpZiAoIHJlcyA9PSBJT19FUlJPUiApIHsKLQkJICAgIHJlcyA9IC1FSU87Ci0JCSAgICBrZnJlZSh6ZXJvcyk7Ci0JCSAgICBnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7Ci0JCX0KLQkJYmg9Z2V0X2xhc3RfYmgoJnBhdGgpOwotCQlpaD1nZXRfaWgoJnBhdGgpOwotCQlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOwotCQlob2xlX3NpemUgLT0gdG9fcGFzdGU7Ci0JICAgIH0gd2hpbGUgKCBob2xlX3NpemUgKTsKLQkgICAga2ZyZWUoemVyb3MpOwogCX0KLSAgICB9CiAKLSAgICAvLyBHbyB0aHJvdWdoIGV4aXN0aW5nIGluZGlyZWN0IGl0ZW1zIGZpcnN0Ci0gICAgLy8gcmVwbGFjZSBhbGwgemVyb2VzIHdpdGggYmxvY2tudW1iZXJzIGZyb20gbGlzdAotICAgIC8vIE5vdGUgdGhhdCBpZiBubyBjb3JyZXNwb25kaW5nIGl0ZW0gd2FzIGZvdW5kLCBieSBwcmV2aW91cyBzZWFyY2gsCi0gICAgLy8gaXQgbWVhbnMgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIGluLXRyZWUgcmVwcmVzZW50YXRpb24gZm9yIGZpbGUgYXJlYQotICAgIC8vIHdlIGFyZSBnb2luZyB0byBvdmVyd3JpdGUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2NhbiB0aHJvdWdoIGZvciBob2xlcy4KLSAgICBmb3IgKCBjdXJyX2Jsb2NrID0gMCwgaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW0gOyBjdXJyX2Jsb2NrIDwgYmxvY2tzX3RvX2FsbG9jYXRlICYmIHJlcyA9PSBQT1NJVElPTl9GT1VORCA7ICkgewotcmV0cnk6CisJUkZBTFNFKGN1cnJfYmxvY2sgPiBibG9ja3NfdG9fYWxsb2NhdGUsCisJICAgICAgICJncmVlbi05MDA3OiBVc2VkIHRvbyBtYW55IGJsb2Nrcz8gd2VpcmQiKTsKIAotCWlmICggaXRlbXBvcyA+PSBpaF9pdGVtX2xlbihpaCkvVU5GTV9QX1NJWkUgKSB7Ci0JICAgIC8qIFdlIHJ1biBvdXQgb2YgZGF0YSBpbiB0aGlzIGluZGlyZWN0IGl0ZW0sIGxldCdzIGxvb2sgZm9yIGFub3RoZXIKLQkgICAgICAgb25lLiAqLwotCSAgICAvKiBGaXJzdCBpZiB3ZSBhcmUgYWxyZWFkeSBtb2RpZnlpbmcgY3VycmVudCBpdGVtLCBsb2cgaXQgKi8KLQkgICAgaWYgKCBtb2RpZnlpbmdfdGhpc19pdGVtICkgewotCQlqb3VybmFsX21hcmtfZGlydHkgKHRoLCBpbm9kZS0+aV9zYiwgYmgpOwotCQltb2RpZnlpbmdfdGhpc19pdGVtID0gMDsKLQkgICAgfQotCSAgICAvKiBUaGVuIHNldCB0aGUga2V5IHRvIGxvb2sgZm9yIGEgbmV3IGluZGlyZWN0IGl0ZW0gKG9mZnNldCBvZiBvbGQKLQkgICAgICAgaXRlbSBpcyBhZGRlZCB0byBvbGQgaXRlbSBsZW5ndGggKi8KLQkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGxlX2tleV9rX29mZnNldCggZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLCAmKGloLT5paF9rZXkpKSArIG9wX2J5dGVzX251bWJlcihpaCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSk7Ci0JICAgIC8qIFNlYXJjaCBvZm9yIHBvc2l0aW9uIG9mIG5ldyBrZXkgaW4gdGhlIHRyZWUuICovCi0JICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JICAgIGlmICggcmVzID09IElPX0VSUk9SKSB7Ci0JCXJlcyA9IC1FSU87Ci0JCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkgICAgfQotCSAgICBiaD1nZXRfbGFzdF9iaCgmcGF0aCk7Ci0JICAgIGloPWdldF9paCgmcGF0aCk7Ci0JICAgIGl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7Ci0JICAgIGl0ZW1wb3MgPSBwYXRoLnBvc19pbl9pdGVtOwotCSAgICBjb250aW51ZTsgLy8gbG9vcCB0byBjaGVjayBhbGwga2luZHMgb2YgY29uZGl0aW9ucyBhbmQgc28gb24uCi0JfQotCS8qIE9rLCB3ZSBoYXZlIGNvcnJlY3QgcG9zaXRpb24gaW4gaXRlbSBub3csIHNvIGxldCdzIHNlZSBpZiBpdCBpcwotCSAgIHJlcHJlc2VudGluZyBmaWxlIGhvbGUgKGJsb2NrbnVtYmVyIGlzIHplcm8pIGFuZCBmaWxsIGl0IGlmIG5lZWRlZCAqLwotCWlmICggIWl0ZW1baXRlbXBvc10gKSB7Ci0JICAgIC8qIE9rLCBhIGhvbGUuIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGFscmVhZHkgcHJlcGFyZWQgdGhpcwotCSAgICAgICBibG9jayB0byBiZSBqb3VybmFsZWQgKi8KLQkgICAgd2hpbGUgKCAhbW9kaWZ5aW5nX3RoaXNfaXRlbSApIHsgLy8gbG9vcCB1bnRpbCBzdWNjZWVkCi0JCS8qIFdlbGwsIHRoaXMgaXRlbSBpcyBub3Qgam91cm5hbGVkIHlldCwgc28gd2UgbXVzdCBwcmVwYXJlCi0JCSAgIGl0IGZvciBqb3VybmFsIGZpcnN0LCBiZWZvcmUgd2UgY2FuIGNoYW5nZSBpdCAqLwotCQlzdHJ1Y3QgaXRlbV9oZWFkIHRtcF9paDsgLy8gV2UgY29weSBpdGVtIGhlYWQgb2YgZm91bmQgaXRlbSwKLQkJCQkJIC8vIGhlcmUgdG8gZGV0ZWN0IGlmIGZzIGNoYW5nZWQgdW5kZXIKLQkJCQkJIC8vIHVzIHdoaWxlIHdlIHdlcmUgcHJlcGFyaW5nIGZvcgotCQkJCQkgLy8gam91cm5hbC4KLQkJaW50IGZzX2dlbjsgLy8gV2Ugc3RvcmUgZnMgZ2VuZXJhdGlvbiBoZXJlIHRvIGZpbmQgaWYgc29tZW9uZQotCQkJICAgIC8vIGNoYW5nZXMgZnMgdW5kZXIgb3VyIGZlZXQKLQotCQljb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOyAvLyBSZW1lbWJlciBpdGVtaGVhZAotCQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbiAoaW5vZGUtPmlfc2IpOyAvLyByZW1lbWJlciBmcyBnZW5lcmF0aW9uCi0JCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKTsgLy8gUHJlcGFyZSBhIGJ1ZmZlciB3aXRoaW4gd2hpY2ggaW5kaXJlY3QgaXRlbSBpcyBzdG9yZWQgZm9yIGNoYW5naW5nLgotCQlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7Ci0JCSAgICAvLyBTaWdoLCBmcyB3YXMgY2hhbmdlZCB1bmRlciB1cywgd2UgbmVlZCB0byBsb29rIGZvciBuZXcKLQkJICAgIC8vIGxvY2F0aW9uIG9mIGl0ZW0gd2UgYXJlIHdvcmtpbmcgd2l0aAotCi0JCSAgICAvKiB1bm1hcmsgcHJlcGFlcmQgYXJlYSBhcyBqb3VybmFsZWQgYW5kIHNlYXJjaCBmb3IgaXQncwotCQkgICAgICAgbmV3IHBvc2l0aW9uICovCi0JCSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihpbm9kZS0+aV9zYiwgYmgpOwotCQkgICAgcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQkJICAgIGlmICggcmVzID09IElPX0VSUk9SKSB7Ci0JCQlyZXMgPSAtRUlPOwotCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOwotCQkgICAgfQotCQkgICAgYmg9Z2V0X2xhc3RfYmgoJnBhdGgpOwotCQkgICAgaWg9Z2V0X2loKCZwYXRoKTsKLQkJICAgIGl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7Ci0JCSAgICBpdGVtcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKLQkJICAgIGdvdG8gcmV0cnk7Ci0JCX0KLQkJbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDE7Ci0JICAgIH0KLQkgICAgaXRlbVtpdGVtcG9zXSA9IGFsbG9jYXRlZF9ibG9ja3NbY3Vycl9ibG9ja107IC8vIEFzc2lnbiBuZXcgYmxvY2sKLQkgICAgY3Vycl9ibG9jaysrOwotCX0KLQlpdGVtcG9zKys7Ci0gICAgfQotCi0gICAgaWYgKCBtb2RpZnlpbmdfdGhpc19pdGVtICkgeyAvLyBXZSBuZWVkIHRvIGxvZyBsYXN0LWFjY2Vzc2VkIGJsb2NrLCBpZiBpdAotCQkJCSAvLyB3YXMgbW9kaWZpZWQsIGJ1dCBub3QgbG9nZ2VkIHlldC4KLQlqb3VybmFsX21hcmtfZGlydHkgKHRoLCBpbm9kZS0+aV9zYiwgYmgpOwotICAgIH0KLQotICAgIGlmICggY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSApIHsKLQkvLyBPaCwgd2VsbCBuZWVkIHRvIGFwcGVuZCB0byBpbmRpcmVjdCBpdGVtLCBvciB0byBjcmVhdGUgaW5kaXJlY3QgaXRlbQotCS8vIGlmIHRoZXJlIHdlcmVuJ3QgYW55Ci0JaWYgKCBpc19pbmRpcmVjdF9sZV9paChpaCkgKSB7Ci0JICAgIC8vIEV4aXN0aW5nIGluZGlyZWN0IGl0ZW0gLSBhcHBlbmQuIEZpcnN0IGNhbGN1bGF0ZSBrZXkgZm9yIGFwcGVuZAotCSAgICAvLyBwb3NpdGlvbi4gV2UgZG8gbm90IG5lZWQgdG8gcmVjYWxjdWxhdGUgcGF0aCBhcyBpdCBzaG91bGQKLQkgICAgLy8gYWxyZWFkeSBwb2ludCB0byBjb3JyZWN0IHBsYWNlLgotCSAgICBtYWtlX2NwdV9rZXkoICZrZXksIGlub2RlLCBsZV9rZXlfa19vZmZzZXQoIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwgJihpaC0+aWhfa2V5KSkgKyBvcF9ieXRlc19udW1iZXIoaWgsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSksIFRZUEVfSU5ESVJFQ1QsIDMpOwotCSAgICByZXMgPSByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0oIHRoLCAmcGF0aCwgJmtleSwgaW5vZGUsIChjaGFyICopKGFsbG9jYXRlZF9ibG9ja3MrY3Vycl9ibG9jayksIFVORk1fUF9TSVpFKihibG9ja3NfdG9fYWxsb2NhdGUtY3Vycl9ibG9jaykpOwotCSAgICBpZiAoIHJlcyApIHsKLQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOwotCSAgICB9Ci0JfSBlbHNlIGlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkgKSB7Ci0JICAgIC8vIExhc3QgZm91bmQgaXRlbSB3YXMgc3RhdGRhdGEuIFRoYXQgbWVhbnMgd2UgbmVlZCB0byBjcmVhdGUgaW5kaXJlY3QgaXRlbS4KLQkgICAgc3RydWN0IGl0ZW1faGVhZCBpbnNfaWg7IC8qIGl0ZW1oZWFkIGZvciBuZXcgaXRlbSAqLwotCi0JICAgIC8qIGNyZWF0ZSBhIGtleSBmb3Igb3VyIG5ldyBpdGVtICovCi0JICAgIG1ha2VfY3B1X2tleSggJmtleSwgaW5vZGUsIDEsIFRZUEVfSU5ESVJFQ1QsIDMpOyAvLyBQb3NpdGlvbiBvbmUsCi0JCQkJCQkJICAgIC8vIGJlY2F1c2UgdGhhdCdzCi0JCQkJCQkJICAgIC8vIHdoZXJlIGZpcnN0Ci0JCQkJCQkJICAgIC8vIGluZGlyZWN0IGl0ZW0KLQkJCQkJCQkgICAgLy8gYmVnaW5zCi0JICAgIC8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KLQkgICAgbWFrZV9sZV9pdGVtX2hlYWQgKCZpbnNfaWgsICZrZXksIGtleS52ZXJzaW9uLCAxLCBUWVBFX0lORElSRUNULAotCQkJICAgICAgIChibG9ja3NfdG9fYWxsb2NhdGUtY3Vycl9ibG9jaykqVU5GTV9QX1NJWkUsCi0JCQkgICAgICAgMCAvKiBmcmVlIHNwYWNlICovKTsKLQkgICAgLyogRmluZCB3aGVyZSBzdWNoIGl0ZW0gc2hvdWxkIGxpdmUgaW4gdGhlIHRyZWUgKi8KLQkgICAgcmVzID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JICAgIGlmICggcmVzICE9IElURU1fTk9UX0ZPVU5EICkgewotCQkvKiBXZWxsLCBpZiB3ZSBoYXZlIGZvdW5kIHN1Y2ggaXRlbSBhbHJlYWR5LCBvciBzb21lIGVycm9yCi0JCSAgIG9jY3VyZWQsIHdlIG5lZWQgdG8gd2FybiB1c2VyIGFuZCByZXR1cm4gZXJyb3IgKi8KLQkJaWYgKCByZXMgIT0gLUVOT1NQQyApIHsKLQkJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAotCQkJCSAgICAgICJncmVlbi05MDA5OiBzZWFyY2hfYnlfa2V5ICglSykgIgotCQkJCSAgICAgICJyZXR1cm5lZCAlZCIsICZrZXksIHJlcyk7Ci0JCX0KLQkJcmVzID0gLUVJTzsKLQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOwotCSAgICB9Ci0JICAgIC8qIEluc2VydCBpdGVtIGludG8gdGhlIHRyZWUgd2l0aCB0aGUgZGF0YSBhcyBpdHMgYm9keSAqLwotCSAgICByZXMgPSByZWlzZXJmc19pbnNlcnRfaXRlbSggdGgsICZwYXRoLCAma2V5LCAmaW5zX2loLCBpbm9kZSwgKGNoYXIgKikoYWxsb2NhdGVkX2Jsb2NrcytjdXJyX2Jsb2NrKSk7Ci0JfSBlbHNlIHsKLQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDEwOiB1bmV4cGVjdGVkIGl0ZW0gdHlwZSBmb3Iga2V5ICVLXG4iLCZrZXkpOwotCX0KLSAgICB9Ci0KLSAgICAvLyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSB0cmFuc2FjdGlvbgotICAgIC8vIHVubGVzcyB3ZSByZXR1cm4gYW4gZXJyb3IsIHRoZXkgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIGxvZ2dpbmcKLSAgICAvLyB0aGUgaW5vZGUuCi0gICAgLy8KLSAgICBwYXRocmVsc2UoJnBhdGgpOwotICAgIC8qCi0gICAgICogY2xlYW51cCBwcmVsbG9jYXRpb24gZnJvbSBwcmV2aW91cyB3cml0ZXMKLSAgICAgKiBpZiB0aGlzIGlzIGEgcGFydGlhbCBibG9jayB3cml0ZQotICAgICAqLwotICAgIGlmICh3cml0ZV9ieXRlcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLTEpKQotICAgICAgICByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jKHRoLCBpbm9kZSk7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQotICAgIC8vIGdvIHRocm91Z2ggYWxsIHRoZSBwYWdlcy9idWZmZXJzIGFuZCBtYXAgdGhlIGJ1ZmZlcnMgdG8gbmV3bHkgYWxsb2NhdGVkCi0gICAgLy8gYmxvY2tzIChzbyB0aGF0IHN5c3RlbSBrbm93cyB3aGVyZSB0byB3cml0ZSB0aGVzZSBwYWdlcyBsYXRlcikuCi0gICAgY3Vycl9ibG9jayA9IDA7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXMgOyBpKysgKSB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U9cHJlcGFyZWRfcGFnZXNbaV07IC8vY3VycmVudCBwYWdlCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOy8vIGZpcnN0IGJ1ZmZlciBmb3IgYSBwYWdlCi0JaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7IC8vIGluLXBhZ2Ugb2Zmc2V0cyBmb3IgYnVmZmVycy4KLQotCWlmICghcGFnZV9idWZmZXJzKHBhZ2UpKQotCSAgICByZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMDU6IE5vIGJ1ZmZlcnMgZm9yIHByZXBhcmVkIHBhZ2U/Pz8iKTsKLQotCS8qIEZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCi0JZm9yKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKLQkgICAgYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgewotCSAgICBpZiAoIWJoKQotCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMDY6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOwotCSAgICBibG9ja19lbmQgPSBibG9ja19zdGFydCtpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JICAgIGlmIChpID09IDAgJiYgYmxvY2tfZW5kIDw9IGZyb20gKQotCQkvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0ICovCi0JCWNvbnRpbnVlOwotCSAgICBpZiAoaSA9PSBudW1fcGFnZXMgLSAxICYmIGJsb2NrX3N0YXJ0ID49IHRvKQotCQkvKiBJZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIGFib3J0Ci0JCSAgIHByb2Nlc3Npbmcgb2YgY3VycmVudCBwYWdlICovCi0JCWJyZWFrOwotCi0JICAgIGlmICggIWJ1ZmZlcl9tYXBwZWQoYmgpICkgeyAvLyBPaywgdW5tYXBwZWQgYnVmZmVyLCBuZWVkIHRvIG1hcCBpdAotCQltYXBfYmgoIGJoLCBpbm9kZS0+aV9zYiwgbGUzMl90b19jcHUoYWxsb2NhdGVkX2Jsb2Nrc1tjdXJyX2Jsb2NrXSkpOwotCQljdXJyX2Jsb2NrKys7Ci0JCXNldF9idWZmZXJfbmV3KGJoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBSRkFMU0UoIGN1cnJfYmxvY2sgPiBibG9ja3NfdG9fYWxsb2NhdGUsICJncmVlbi05MDA3OiBVc2VkIHRvbyBtYW55IGJsb2Nrcz8gd2VpcmQiKTsKLQotICAgIGtmcmVlKGFsbG9jYXRlZF9ibG9ja3MpOwotICAgIHJldHVybiAwOworCWtmcmVlKGFsbG9jYXRlZF9ibG9ja3MpOworCXJldHVybiAwOwogCiAvLyBOZWVkIHRvIGRlYWwgd2l0aCB0cmFuc2FjdGlvbiBoZXJlLgotZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczoKLSAgICBwYXRocmVsc2UoJnBhdGgpOwotICAgIC8vIGZyZWUgYmxvY2tzCi0gICAgZm9yKCBpID0gMDsgaSA8IGJsb2Nrc190b19hbGxvY2F0ZTsgaSsrICkKLQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgbGUzMl90b19jcHUoYWxsb2NhdGVkX2Jsb2Nrc1tpXSksIDEpOworICAgICAgZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczoKKwlwYXRocmVsc2UoJnBhdGgpOworCS8vIGZyZWUgYmxvY2tzCisJZm9yIChpID0gMDsgaSA8IGJsb2Nrc190b19hbGxvY2F0ZTsgaSsrKQorCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgbGUzMl90b19jcHUoYWxsb2NhdGVkX2Jsb2Nrc1tpXSksCisJCQkJICAgIDEpOwogCi1lcnJvcl9leGl0OgotICAgIGlmICh0aC0+dF90cmFuc19pZCkgewotICAgICAgICBpbnQgZXJyOwotICAgICAgICAvLyB1cGRhdGUgYW55IGNoYW5nZXMgd2UgbWFkZSB0byBibGsgY291bnQKLSAgICAgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7Ci0gICAgICAgIGVyciA9IGpvdXJuYWxfZW5kKHRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMSArIDIgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpKTsKLSAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgIHJlcyA9IGVycjsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICBrZnJlZShhbGxvY2F0ZWRfYmxvY2tzKTsKKyAgICAgIGVycm9yX2V4aXQ6CisJaWYgKHRoLT50X3RyYW5zX2lkKSB7CisJCWludCBlcnI7CisJCS8vIHVwZGF0ZSBhbnkgY2hhbmdlcyB3ZSBtYWRlIHRvIGJsayBjb3VudAorCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwkJZXJyID0KKwkJICAgIGpvdXJuYWxfZW5kKHRoLCBpbm9kZS0+aV9zYiwKKwkJCQlKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsKKwkJCQkyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJCWlmIChlcnIpCisJCQlyZXMgPSBlcnI7CisJfQorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJa2ZyZWUoYWxsb2NhdGVkX2Jsb2Nrcyk7CiAKLSAgICByZXR1cm4gcmVzOworCXJldHVybiByZXM7CiB9CiAKIC8qIFVubG9jayBwYWdlcyBwcmVwYXJlZCBieSByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSAqLwotc3RhdGljIHZvaWQgcmVpc2VyZnNfdW5wcmVwYXJlX3BhZ2VzKHN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMsIC8qIGxpc3Qgb2YgbG9ja2VkIHBhZ2VzICovCi0JCQkgICAgICBzaXplX3QgbnVtX3BhZ2VzIC8qIGFtb3VudCBvZiBwYWdlcyAqLykgewotICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLAkvKiBsaXN0IG9mIGxvY2tlZCBwYWdlcyAqLworCQkJCSAgICAgc2l6ZV90IG51bV9wYWdlcyAvKiBhbW91bnQgb2YgcGFnZXMgKi8gKQoreworCWludCBpOwkJCS8vIGxvb3AgY291bnRlcgogCi0gICAgZm9yIChpPTA7IGkgPCBudW1fcGFnZXMgOyBpKyspIHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHByZXBhcmVkX3BhZ2VzW2ldOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHByZXBhcmVkX3BhZ2VzW2ldOwogCi0JdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKLQl1bmxvY2tfcGFnZShwYWdlKTsKLQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0gICAgfQorCQl0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KIH0KIAogLyogVGhpcyBmdW5jdGlvbiB3aWxsIGNvcHkgZGF0YSBmcm9tIHVzZXJzcGFjZSB0byBzcGVjaWZpZWQgcGFnZXMgd2l0aGluCiAgICBzdXBwbGllZCBieXRlIHJhbmdlICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX2NvcHlfZnJvbV91c2VyX3RvX2ZpbGVfcmVnaW9uKAotCQkJCWxvZmZfdCBwb3MsIC8qIEluLWZpbGUgcG9zaXRpb24gKi8KLQkJCQlpbnQgbnVtX3BhZ2VzLCAvKiBOdW1iZXIgb2YgcGFnZXMgYWZmZWN0ZWQgKi8KLQkJCQlpbnQgd3JpdGVfYnl0ZXMsIC8qIEFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLwotCQkJCXN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMsIC8qIHBvaW50ZXIgdG8gCi0JCQkJCQkJCSBhcnJheSB0bwotCQkJCQkJCQkgcHJlcGFyZWQgcGFnZXMKLQkJCQkJCQkJKi8KLQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmIC8qIFBvaW50ZXIgdG8gdXNlci1zdXBwbGllZAotCQkJCQkJICAgZGF0YSovCi0JCQkJKQorc3RhdGljIGludCByZWlzZXJmc19jb3B5X2Zyb21fdXNlcl90b19maWxlX3JlZ2lvbihsb2ZmX3QgcG9zLAkvKiBJbi1maWxlIHBvc2l0aW9uICovCisJCQkJCQkgIGludCBudW1fcGFnZXMsCS8qIE51bWJlciBvZiBwYWdlcyBhZmZlY3RlZCAqLworCQkJCQkJICBpbnQgd3JpdGVfYnl0ZXMsCS8qIEFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLworCQkJCQkJICBzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLAkvKiBwb2ludGVyIHRvIAorCQkJCQkJCQkJCSAgIGFycmF5IHRvCisJCQkJCQkJCQkJICAgcHJlcGFyZWQgcGFnZXMKKwkJCQkJCQkJCQkgKi8KKwkJCQkJCSAgY29uc3QgY2hhciBfX3VzZXIgKiBidWYJLyogUG9pbnRlciB0byB1c2VyLXN1cHBsaWVkCisJCQkJCQkJCQkJICAgZGF0YSAqLworICAgICkKIHsKLSAgICBsb25nIHBhZ2VfZmF1bHQ9MDsgLy8gc3RhdHVzIG9mIGNvcHlfZnJvbV91c2VyLgotICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIuCi0gICAgaW50IG9mZnNldDsgLy8gb2Zmc2V0IGluIHBhZ2UKKwlsb25nIHBhZ2VfZmF1bHQgPSAwOwkvLyBzdGF0dXMgb2YgY29weV9mcm9tX3VzZXIuCisJaW50IGk7CQkJLy8gbG9vcCBjb3VudGVyLgorCWludCBvZmZzZXQ7CQkvLyBvZmZzZXQgaW4gcGFnZQogCi0gICAgZm9yICggaSA9IDAsIG9mZnNldCA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKTsgaSA8IG51bV9wYWdlcyA7IGkrKyxvZmZzZXQ9MCkgewotCXNpemVfdCBjb3VudCA9IG1pbl90KHNpemVfdCxQQUdFX0NBQ0hFX1NJWkUtb2Zmc2V0LHdyaXRlX2J5dGVzKTsgLy8gSG93IG11Y2ggb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhpcyBwYWdlCi0Jc3RydWN0IHBhZ2UgKnBhZ2U9cHJlcGFyZWRfcGFnZXNbaV07IC8vIEN1cnJlbnQgcGFnZSB3ZSBwcm9jZXNzLgorCWZvciAoaSA9IDAsIG9mZnNldCA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOyBpIDwgbnVtX3BhZ2VzOworCSAgICAgaSsrLCBvZmZzZXQgPSAwKSB7CisJCXNpemVfdCBjb3VudCA9IG1pbl90KHNpemVfdCwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0LCB3cml0ZV9ieXRlcyk7CS8vIEhvdyBtdWNoIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoaXMgcGFnZQorCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHByZXBhcmVkX3BhZ2VzW2ldOwkvLyBDdXJyZW50IHBhZ2Ugd2UgcHJvY2Vzcy4KIAotCWZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKCBidWYsIGNvdW50KTsKKwkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBjb3VudCk7CiAKLQkvKiBDb3B5IGRhdGEgZnJvbSB1c2Vyc3BhY2UgdG8gdGhlIGN1cnJlbnQgcGFnZSAqLwotCWttYXAocGFnZSk7Ci0JcGFnZV9mYXVsdCA9IF9fY29weV9mcm9tX3VzZXIocGFnZV9hZGRyZXNzKHBhZ2UpK29mZnNldCwgYnVmLCBjb3VudCk7IC8vIENvcHkgdGhlIGRhdGEuCi0JLyogRmx1c2ggcHJvY2Vzc29yJ3MgZGNhY2hlIGZvciB0aGlzIHBhZ2UgKi8KLQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQlrdW5tYXAocGFnZSk7Ci0JYnVmKz1jb3VudDsKLQl3cml0ZV9ieXRlcy09Y291bnQ7CisJCS8qIENvcHkgZGF0YSBmcm9tIHVzZXJzcGFjZSB0byB0aGUgY3VycmVudCBwYWdlICovCisJCWttYXAocGFnZSk7CisJCXBhZ2VfZmF1bHQgPSBfX2NvcHlfZnJvbV91c2VyKHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgYnVmLCBjb3VudCk7CS8vIENvcHkgdGhlIGRhdGEuCisJCS8qIEZsdXNoIHByb2Nlc3NvcidzIGRjYWNoZSBmb3IgdGhpcyBwYWdlICovCisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXAocGFnZSk7CisJCWJ1ZiArPSBjb3VudDsKKwkJd3JpdGVfYnl0ZXMgLT0gY291bnQ7CiAKLQlpZiAocGFnZV9mYXVsdCkKLQkgICAgYnJlYWs7IC8vIFdhcyB0aGVyZSBhIGZhdWx0PyBhYm9ydC4KLSAgICB9CisJCWlmIChwYWdlX2ZhdWx0KQorCQkJYnJlYWs7CS8vIFdhcyB0aGVyZSBhIGZhdWx0PyBhYm9ydC4KKwl9CiAKLSAgICByZXR1cm4gcGFnZV9mYXVsdD8tRUZBVUxUOjA7CisJcmV0dXJuIHBhZ2VfZmF1bHQgPyAtRUZBVUxUIDogMDsKIH0KIAogLyogdGFrZW4gZnMvYnVmZmVyLmM6X19ibG9ja19jb21taXRfd3JpdGUgKi8KIGludCByZWlzZXJmc19jb21taXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCisJCQkgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7Ci0gICAgdW5zaWduZWQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKLSAgICBpbnQgcGFydGlhbCA9IDA7Ci0gICAgdW5zaWduZWQgYmxvY2tzaXplOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOwotICAgIHVuc2lnbmVkIGxvbmcgaV9zaXplX2luZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotICAgIGludCBuZXc7Ci0gICAgaW50IGxvZ2l0ID0gcmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSk7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaW5vZGUtPmlfc2I7Ci0gICAgaW50IGJoX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gcy0+c19ibG9ja3NpemU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCWludCBwYXJ0aWFsID0gMDsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CisJdW5zaWduZWQgbG9uZyBpX3NpemVfaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW50IG5ldzsKKwlpbnQgbG9naXQgPSByZWlzZXJmc19maWxlX2RhdGFfbG9nKGlub2RlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpbm9kZS0+aV9zYjsKKwlpbnQgYmhfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzLT5zX2Jsb2Nrc2l6ZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQgPSAwOwogCi0gICAgdGgudF90cmFuc19pZCA9IDA7Ci0gICAgYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCXRoLnRfdHJhbnNfaWQgPSAwOworCWJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKIAotICAgIGlmIChsb2dpdCkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7Ci0JcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIHMsIGJoX3Blcl9wYWdlICsgMSk7Ci0JaWYgKHJldCkKLQkgICAgZ290byBkcm9wX3dyaXRlX2xvY2s7Ci0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKLSAgICB9Ci0gICAgZm9yKGJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSwgYmxvY2tfc3RhcnQgPSAwOwotICAgICAgICBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKLQlibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKQotICAgIHsKLQotCW5ldyA9IGJ1ZmZlcl9uZXcoYmgpOwotCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOwotCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOwotCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgewotCSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCi0JCSAgICBwYXJ0aWFsID0gMTsKLQl9IGVsc2UgewotCSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkgICAgaWYgKGxvZ2l0KSB7Ci0JCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDEpOwotCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBiaCk7Ci0JICAgIH0gZWxzZSBpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKLQkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCQkvKiBkbyBkYXRhPW9yZGVyZWQgb24gYW55IHBhZ2UgcGFzdCB0aGUgZW5kCi0JCSAqIG9mIGZpbGUgYW5kIGFueSBidWZmZXIgbWFya2VkIEJIX05ldy4KLQkJICovCi0JCWlmIChyZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpICYmCi0JCSAgICAobmV3IHx8IHBhZ2UtPmluZGV4ID49IGlfc2l6ZV9pbmRleCkpIHsKLQkJICAgIHJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3QoaW5vZGUsIGJoKTsKLQkgICAgICAgIH0KLQkgICAgfQorCWlmIChsb2dpdCkgeworCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCQlyZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZHJvcF93cml0ZV9sb2NrOworCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwogCX0KLSAgICB9Ci0gICAgaWYgKGxvZ2l0KSB7Ci0JcmV0ID0gam91cm5hbF9lbmQoJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOwotZHJvcF93cml0ZV9sb2NrOgotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBJZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSB3aGljaCBoYXBwZW5lZCB0byBtYWtlIGFsbCBidWZmZXJzCi0gICAgICogdXB0b2RhdGUgdGhlbiB3ZSBjYW4gb3B0aW1pemUgYXdheSBhIGJvZ3VzIHJlYWRwYWdlKCkgZm9yCi0gICAgICogdGhlIG5leHQgcmVhZCgpLiBIZXJlIHdlICdkaXNjb3Zlcicgd2hldGhlciB0aGUgcGFnZSB3ZW50Ci0gICAgICogdXB0b2RhdGUgYXMgYSByZXN1bHQgb2YgdGhpcyAocG90ZW50aWFsbHkgcGFydGlhbCkgd3JpdGUuCi0gICAgICovCi0gICAgaWYgKCFwYXJ0aWFsKQotCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLSAgICByZXR1cm4gcmV0OwotfQorCWZvciAoYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpLCBibG9ja19zdGFydCA9IDA7CisJICAgICBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKKwkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgewogCisJCW5ldyA9IGJ1ZmZlcl9uZXcoYmgpOworCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgeworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCXBhcnRpYWwgPSAxOworCQl9IGVsc2UgeworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQlpZiAobG9naXQpIHsKKwkJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAxKTsKKwkJCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBiaCk7CisJCQl9IGVsc2UgaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCS8qIGRvIGRhdGE9b3JkZXJlZCBvbiBhbnkgcGFnZSBwYXN0IHRoZSBlbmQKKwkJCQkgKiBvZiBmaWxlIGFuZCBhbnkgYnVmZmVyIG1hcmtlZCBCSF9OZXcuCisJCQkJICovCisJCQkJaWYgKHJlaXNlcmZzX2RhdGFfb3JkZXJlZChpbm9kZS0+aV9zYikgJiYKKwkJCQkgICAgKG5ldyB8fCBwYWdlLT5pbmRleCA+PSBpX3NpemVfaW5kZXgpKSB7CisJCQkJCXJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3QoaW5vZGUsIGJoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGxvZ2l0KSB7CisJCXJldCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwkgICAgICBkcm9wX3dyaXRlX2xvY2s6CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwl9CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSB3aGljaCBoYXBwZW5lZCB0byBtYWtlIGFsbCBidWZmZXJzCisJICogdXB0b2RhdGUgdGhlbiB3ZSBjYW4gb3B0aW1pemUgYXdheSBhIGJvZ3VzIHJlYWRwYWdlKCkgZm9yCisJICogdGhlIG5leHQgcmVhZCgpLiBIZXJlIHdlICdkaXNjb3Zlcicgd2hldGhlciB0aGUgcGFnZSB3ZW50CisJICogdXB0b2RhdGUgYXMgYSByZXN1bHQgb2YgdGhpcyAocG90ZW50aWFsbHkgcGFydGlhbCkgd3JpdGUuCisJICovCisJaWYgKCFwYXJ0aWFsKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJcmV0dXJuIHJldDsKK30KIAogLyogU3VibWl0IHBhZ2VzIGZvciB3cml0ZS4gVGhpcyB3YXMgc2VwYXJhdGVkIGZyb20gYWN0dWFsIGZpbGUgY29weWluZwogICAgYmVjYXVzZSB3ZSBtaWdodCB3YW50IHRvIGFsbG9jYXRlIGJsb2NrIG51bWJlcnMgaW4tYmV0d2Vlbi4KICAgIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGNhbGxlciB3aWxsIGFkanVzdCBmaWxlIHNpemUgdG8gY29ycmVjdCB2YWx1ZS4gKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfc3VibWl0X2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSgKLQkJCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCWxvZmZfdCBwb3MsIC8qIFdyaXRpbmcgcG9zaXRpb24gb2Zmc2V0ICovCi0JCQkJc2l6ZV90IG51bV9wYWdlcywgLyogTnVtYmVyIG9mIHBhZ2VzIHRvIHdyaXRlICovCi0JCQkJc2l6ZV90IHdyaXRlX2J5dGVzLCAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KLQkJCQlzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzIC8qIGxpc3Qgb2YgcGFnZXMgKi8KLQkJCQkpCitzdGF0aWMgaW50IHJlaXNlcmZzX3N1Ym1pdF9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsCS8qIFdyaXRpbmcgcG9zaXRpb24gb2Zmc2V0ICovCisJCQkJCQkgc2l6ZV90IG51bV9wYWdlcywJLyogTnVtYmVyIG9mIHBhZ2VzIHRvIHdyaXRlICovCisJCQkJCQkgc2l6ZV90IHdyaXRlX2J5dGVzLAkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCQkJCSBzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzCS8qIGxpc3Qgb2YgcGFnZXMgKi8KKyAgICApCiB7Ci0gICAgaW50IHN0YXR1czsgLy8gcmV0dXJuIHN0YXR1cyBvZiBibG9ja19jb21taXRfd3JpdGUuCi0gICAgaW50IHJldHZhbCA9IDA7IC8vIFJldHVybiB2YWx1ZSB3ZSBhcmUgZ29pbmcgdG8gcmV0dXJuLgotICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIKLSAgICBpbnQgb2Zmc2V0OyAvLyBXcml0aW5nIG9mZnNldCBpbiBwYWdlLgotICAgIGludCBvcmlnX3dyaXRlX2J5dGVzID0gd3JpdGVfYnl0ZXM7Ci0gICAgaW50IHNkX3VwZGF0ZSA9IDA7CisJaW50IHN0YXR1czsJCS8vIHJldHVybiBzdGF0dXMgb2YgYmxvY2tfY29tbWl0X3dyaXRlLgorCWludCByZXR2YWwgPSAwOwkJLy8gUmV0dXJuIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZXR1cm4uCisJaW50IGk7CQkJLy8gbG9vcCBjb3VudGVyCisJaW50IG9mZnNldDsJCS8vIFdyaXRpbmcgb2Zmc2V0IGluIHBhZ2UuCisJaW50IG9yaWdfd3JpdGVfYnl0ZXMgPSB3cml0ZV9ieXRlczsKKwlpbnQgc2RfdXBkYXRlID0gMDsKIAotICAgIGZvciAoIGkgPSAwLCBvZmZzZXQgPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7IGkgPCBudW1fcGFnZXMgOyBpKyssb2Zmc2V0PTApIHsKLQlpbnQgY291bnQgPSBtaW5fdChpbnQsUEFHRV9DQUNIRV9TSVpFLW9mZnNldCx3cml0ZV9ieXRlcyk7IC8vIEhvdyBtdWNoIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoaXMgcGFnZQotCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOyAvLyBDdXJyZW50IHBhZ2Ugd2UgcHJvY2Vzcy4KKwlmb3IgKGkgPSAwLCBvZmZzZXQgPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsgaSA8IG51bV9wYWdlczsKKwkgICAgIGkrKywgb2Zmc2V0ID0gMCkgeworCQlpbnQgY291bnQgPSBtaW5fdChpbnQsIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCwgd3JpdGVfYnl0ZXMpOwkvLyBIb3cgbXVjaCBvZiBieXRlcyB0byB3cml0ZSB0byB0aGlzIHBhZ2UKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwcmVwYXJlZF9wYWdlc1tpXTsJLy8gQ3VycmVudCBwYWdlIHdlIHByb2Nlc3MuCiAKLQlzdGF0dXMgPSByZWlzZXJmc19jb21taXRfcGFnZShpbm9kZSwgcGFnZSwgb2Zmc2V0LCBvZmZzZXQrY291bnQpOwotCWlmICggc3RhdHVzICkKLQkgICAgcmV0dmFsID0gc3RhdHVzOyAvLyBUbyBub3Qgb3ZlcmNvbXBsaWNhdGUgbWF0dGVycyBXZSBhcmUgZ29pbmcgdG8KLQkJCSAgICAgLy8gc3VibWl0IGFsbCB0aGUgcGFnZXMgZXZlbiBpZiB0aGVyZSB3YXMgZXJyb3IuCi0JCQkgICAgIC8vIHdlIG9ubHkgcmVtZW1iZXIgZXJyb3Igc3RhdHVzIHRvIHJlcG9ydCBpdCBvbgotCQkJICAgICAvLyBleGl0LgotCXdyaXRlX2J5dGVzLT1jb3VudDsKLSAgICB9Ci0gICAgLyogbm93IHRoYXQgd2UndmUgZ290dGVuIGFsbCB0aGUgb3JkZXJlZCBidWZmZXJzIG1hcmtlZCBkaXJ0eSwKLSAgICAgKiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSBpX3NpemUgYW5kIGNsb3NlIGFueSBydW5uaW5nIHRyYW5zYWN0aW9uCi0gICAgICovCi0gICAgaWYgKCBwb3MgKyBvcmlnX3dyaXRlX2J5dGVzID4gaW5vZGUtPmlfc2l6ZSkgewotCWlub2RlLT5pX3NpemUgPSBwb3MgKyBvcmlnX3dyaXRlX2J5dGVzOyAvLyBTZXQgbmV3IHNpemUKLQkvKiBJZiB0aGUgZmlsZSBoYXZlIGdyb3duIHNvIG11Y2ggdGhhdCB0YWlsIHBhY2tpbmcgaXMgbm8KLQkgKiBsb25nZXIgcG9zc2libGUsIHJlc2V0ICJuZWVkIHRvIHBhY2siIGZsYWcgKi8KLQlpZiAoIChoYXZlX2xhcmdlX3RhaWxzIChpbm9kZS0+aV9zYikgJiYKLQkgICAgICBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplIChpbm9kZSkqNCkgfHwKLQkgICAgIChoYXZlX3NtYWxsX3RhaWxzIChpbm9kZS0+aV9zYikgJiYKLQkgICAgIGlub2RlLT5pX3NpemUgPiBpX2Jsb2NrX3NpemUoaW5vZGUpKSApCi0JICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzayA7Ci0gICAgICAgIGVsc2UgaWYgKCAoaGF2ZV9sYXJnZV90YWlscyAoaW5vZGUtPmlfc2IpICYmCi0JICAgICAgICAgIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUgKGlub2RlKSo0KSB8fAotCSAgICAgICAgICAoaGF2ZV9zbWFsbF90YWlscyAoaW5vZGUtPmlfc2IpICYmCi0JCSAgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkpICkKLQkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9wYWNrX29uX2Nsb3NlX21hc2sgOworCQlzdGF0dXMgPQorCQkgICAgcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIG9mZnNldCwgb2Zmc2V0ICsgY291bnQpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dmFsID0gc3RhdHVzOwkvLyBUbyBub3Qgb3ZlcmNvbXBsaWNhdGUgbWF0dGVycyBXZSBhcmUgZ29pbmcgdG8KKwkJLy8gc3VibWl0IGFsbCB0aGUgcGFnZXMgZXZlbiBpZiB0aGVyZSB3YXMgZXJyb3IuCisJCS8vIHdlIG9ubHkgcmVtZW1iZXIgZXJyb3Igc3RhdHVzIHRvIHJlcG9ydCBpdCBvbgorCQkvLyBleGl0LgorCQl3cml0ZV9ieXRlcyAtPSBjb3VudDsKKwl9CisJLyogbm93IHRoYXQgd2UndmUgZ290dGVuIGFsbCB0aGUgb3JkZXJlZCBidWZmZXJzIG1hcmtlZCBkaXJ0eSwKKwkgKiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSBpX3NpemUgYW5kIGNsb3NlIGFueSBydW5uaW5nIHRyYW5zYWN0aW9uCisJICovCisJaWYgKHBvcyArIG9yaWdfd3JpdGVfYnl0ZXMgPiBpbm9kZS0+aV9zaXplKSB7CisJCWlub2RlLT5pX3NpemUgPSBwb3MgKyBvcmlnX3dyaXRlX2J5dGVzOwkvLyBTZXQgbmV3IHNpemUKKwkJLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBzbyBtdWNoIHRoYXQgdGFpbCBwYWNraW5nIGlzIG5vCisJCSAqIGxvbmdlciBwb3NzaWJsZSwgcmVzZXQgIm5lZWQgdG8gcGFjayIgZmxhZyAqLworCQlpZiAoKGhhdmVfbGFyZ2VfdGFpbHMoaW5vZGUtPmlfc2IpICYmCisJCSAgICAgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkgKiA0KSB8fAorCQkgICAgKGhhdmVfc21hbGxfdGFpbHMoaW5vZGUtPmlfc2IpICYmCisJCSAgICAgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkpKQorCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrOworCQllbHNlIGlmICgoaGF2ZV9sYXJnZV90YWlscyhpbm9kZS0+aV9zYikgJiYKKwkJCSAgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkgKiA0KSB8fAorCQkJIChoYXZlX3NtYWxsX3RhaWxzKGlub2RlLT5pX3NiKSAmJgorCQkJICBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplKGlub2RlKSkpCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX3BhY2tfb25fY2xvc2VfbWFzazsKIAorCQlpZiAodGgtPnRfdHJhbnNfaWQpIHsKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CS8vIEFuZCB1cGRhdGUgb24tZGlzayBtZXRhZGF0YQorCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJfSBlbHNlCisJCQlpbm9kZS0+aV9zYi0+c19vcC0+ZGlydHlfaW5vZGUoaW5vZGUpOworCisJCXNkX3VwZGF0ZSA9IDE7CisJfQogCWlmICh0aC0+dF90cmFuc19pZCkgewotCSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7IC8vIEFuZCB1cGRhdGUgb24tZGlzayBtZXRhZGF0YQotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCX0gZWxzZQotCSAgICBpbm9kZS0+aV9zYi0+c19vcC0+ZGlydHlfaW5vZGUoaW5vZGUpOworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKCFzZF91cGRhdGUpCisJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwkJc3RhdHVzID0gam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHZhbCA9IHN0YXR1czsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9CisJdGgtPnRfdHJhbnNfaWQgPSAwOwogCi0gICAgICAgIHNkX3VwZGF0ZSA9IDE7Ci0gICAgfQotICAgIGlmICh0aC0+dF90cmFuc19pZCkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICghc2RfdXBkYXRlKQotCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKLQlzdGF0dXMgPSBqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgcmV0dmFsID0gc3RhdHVzOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgfQotICAgIHRoLT50X3RyYW5zX2lkID0gMDsKLQotICAgIC8qIAotICAgICAqIHdlIGhhdmUgdG8gdW5sb2NrIHRoZSBwYWdlcyBhZnRlciB1cGRhdGluZyBpX3NpemUsIG90aGVyd2lzZQotICAgICAqIHdlIHJhY2Ugd2l0aCB3cml0ZXBhZ2UKLSAgICAgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wYWdlcyA7IGkrKykgewotCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOwotCXVubG9ja19wYWdlKHBhZ2UpOyAKLQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7Ci0JcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOworCS8qIAorCSAqIHdlIGhhdmUgdG8gdW5sb2NrIHRoZSBwYWdlcyBhZnRlciB1cGRhdGluZyBpX3NpemUsIG90aGVyd2lzZQorCSAqIHdlIHJhY2Ugd2l0aCB3cml0ZXBhZ2UKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwcmVwYXJlZF9wYWdlc1tpXTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKiBMb29rIGlmIHBhc3NlZCB3cml0aW5nIHJlZ2lvbiBpcyBnb2luZyB0byB0b3VjaCBmaWxlJ3MgdGFpbAogICAgKGlmIGl0IGlzIHByZXNlbnQpLiBBbmQgaWYgaXQgaXMsIGNvbnZlcnQgdGhlIHRhaWwgdG8gdW5mb3JtYXR0ZWQgbm9kZSAqLwotc3RhdGljIGludCByZWlzZXJmc19jaGVja19mb3JfdGFpbF9hbmRfY29udmVydCggc3RydWN0IGlub2RlICppbm9kZSwgLyogaW5vZGUgdG8gZGVhbCB3aXRoICovCi0JCQkJCSBsb2ZmX3QgcG9zLCAvKiBXcml0aW5nIHBvc2l0aW9uICovCi0JCQkJCSBpbnQgd3JpdGVfYnl0ZXMgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCi0JCQkJICAgICAgICApCitzdGF0aWMgaW50IHJlaXNlcmZzX2NoZWNrX2Zvcl90YWlsX2FuZF9jb252ZXJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCS8qIGlub2RlIHRvIGRlYWwgd2l0aCAqLworCQkJCQkgICAgICAgbG9mZl90IHBvcywJLyogV3JpdGluZyBwb3NpdGlvbiAqLworCQkJCQkgICAgICAgaW50IHdyaXRlX2J5dGVzCS8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLworICAgICkKIHsKLSAgICBJTklUSUFMSVpFX1BBVEgocGF0aCk7IC8vIG5lZWRlZCBmb3Igc2VhcmNoX2Zvcl9wb3NpdGlvbgotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsgLy8gS2V5IHRoYXQgd291bGQgcmVwcmVzZW50IGxhc3QgdG91Y2hlZCB3cml0aW5nIGJ5dGUuCi0gICAgc3RydWN0IGl0ZW1faGVhZCAqaWg7IC8vIGl0ZW0gaGVhZGVyIG9mIGZvdW5kIGJsb2NrOwotICAgIGludCByZXM7IC8vIFJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB3ZSBjYWxsLgotICAgIGludCBjb250X2V4cGFuZF9vZmZzZXQ7IC8vIFdlIHdpbGwgcHV0IG9mZnNldCBmb3IgZ2VuZXJpY19jb250X2V4cGFuZCBoZXJlCi0JCQkgICAgLy8gVGhpcyBjYW4gYmUgaW50IGp1c3QgYmVjYXVzZSB0YWlscyBhcmUgY3JlYXRlZAotCQkJICAgIC8vIG9ubHkgZm9yIHNtYWxsIGZpbGVzLgotIAorCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsJLy8gbmVlZGVkIGZvciBzZWFyY2hfZm9yX3Bvc2l0aW9uCisJc3RydWN0IGNwdV9rZXkga2V5OwkvLyBLZXkgdGhhdCB3b3VsZCByZXByZXNlbnQgbGFzdCB0b3VjaGVkIHdyaXRpbmcgYnl0ZS4KKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsJLy8gaXRlbSBoZWFkZXIgb2YgZm91bmQgYmxvY2s7CisJaW50IHJlczsJCS8vIFJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB3ZSBjYWxsLgorCWludCBjb250X2V4cGFuZF9vZmZzZXQ7CS8vIFdlIHdpbGwgcHV0IG9mZnNldCBmb3IgZ2VuZXJpY19jb250X2V4cGFuZCBoZXJlCisJLy8gVGhpcyBjYW4gYmUgaW50IGp1c3QgYmVjYXVzZSB0YWlscyBhcmUgY3JlYXRlZAorCS8vIG9ubHkgZm9yIHNtYWxsIGZpbGVzLgorCiAvKiB0aGlzIGVtYm9kaWVzIGEgZGVwZW5kZW5jeSBvbiBhIHBhcnRpY3VsYXIgdGFpbCBwb2xpY3kgKi8KLSAgICBpZiAoIGlub2RlLT5pX3NpemUgPj0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKjQgKSB7Ci0JLyogc3VjaCBhIGJpZyBmaWxlcyBkbyBub3QgaGF2ZSB0YWlscywgc28gd2Ugd29uJ3QgYm90aGVyIG91cnNlbHZlcwotCSAgIHRvIGxvb2sgZm9yIHRhaWxzLCBzaW1wbHkgcmV0dXJuICovCi0JcmV0dXJuIDA7Ci0gICAgfQorCWlmIChpbm9kZS0+aV9zaXplID49IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAqIDQpIHsKKwkJLyogc3VjaCBhIGJpZyBmaWxlcyBkbyBub3QgaGF2ZSB0YWlscywgc28gd2Ugd29uJ3QgYm90aGVyIG91cnNlbHZlcworCQkgICB0byBsb29rIGZvciB0YWlscywgc2ltcGx5IHJldHVybiAqLworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICAvKiBmaW5kIHRoZSBpdGVtIGNvbnRhaW5pbmcgdGhlIGxhc3QgYnl0ZSB0byBiZSB3cml0dGVuLCBvciBpZgotICAgICAqIHdyaXRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRoZW4gdGhlIGxhc3QgaXRlbSBvZiB0aGUKLSAgICAgKiBmaWxlIChhbmQgdGhlbiB3ZSBjaGVjayBpdHMgdHlwZSkuICovCi0gICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgcG9zK3dyaXRlX2J5dGVzKzEsIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOwotICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0gICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JcmV0dXJuIC1FSU87Ci0gICAgfQotICAgIGloID0gZ2V0X2loKCZwYXRoKTsKLSAgICByZXMgPSAwOwotICAgIGlmICggaXNfZGlyZWN0X2xlX2loKGloKSApIHsKLQkvKiBPaywgY2xvc2VzdCBpdGVtIGlzIGZpbGUgdGFpbCAodGFpbHMgYXJlIHN0b3JlZCBpbiAiZGlyZWN0IgotCSAqIGl0ZW1zKSwgc28gd2UgbmVlZCB0byB1bnBhY2sgaXQuICovCi0JLyogVG8gbm90IG92ZXJjb21wbGljYXRlIG1hdHRlcnMsIHdlIGp1c3QgY2FsbCBnZW5lcmljX2NvbnRfZXhwYW5kCi0JICAgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwgb3RoZXIgc3R1ZmYgYW5kIGZpbmFsbHkgd2lsbCBib2lsIGRvd24gdG8KLQkgICAgcmVpc2VyZnNfZ2V0X2Jsb2NrKCkgdGhhdCB3b3VsZCBkbyBuZWNlc3NhcnkgY29udmVyc2lvbi4gKi8KLQljb250X2V4cGFuZF9vZmZzZXQgPSBsZV9rZXlfa19vZmZzZXQoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLCAmKGloLT5paF9rZXkpKTsKLQlwYXRocmVsc2UoJnBhdGgpOwotCXJlcyA9IGdlbmVyaWNfY29udF9leHBhbmQoIGlub2RlLCBjb250X2V4cGFuZF9vZmZzZXQpOwotICAgIH0gZWxzZQotCXBhdGhyZWxzZSgmcGF0aCk7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJLyogZmluZCB0aGUgaXRlbSBjb250YWluaW5nIHRoZSBsYXN0IGJ5dGUgdG8gYmUgd3JpdHRlbiwgb3IgaWYKKwkgKiB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSB0aGVuIHRoZSBsYXN0IGl0ZW0gb2YgdGhlCisJICogZmlsZSAoYW5kIHRoZW4gd2UgY2hlY2sgaXRzIHR5cGUpLiAqLworCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgcG9zICsgd3JpdGVfYnl0ZXMgKyAxLCBUWVBFX0FOWSwKKwkJICAgICAzIC8qa2V5IGxlbmd0aCAqLyApOworCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJlcyA9PSBJT19FUlJPUikgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWggPSBnZXRfaWgoJnBhdGgpOworCXJlcyA9IDA7CisJaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpIHsKKwkJLyogT2ssIGNsb3Nlc3QgaXRlbSBpcyBmaWxlIHRhaWwgKHRhaWxzIGFyZSBzdG9yZWQgaW4gImRpcmVjdCIKKwkJICogaXRlbXMpLCBzbyB3ZSBuZWVkIHRvIHVucGFjayBpdC4gKi8KKwkJLyogVG8gbm90IG92ZXJjb21wbGljYXRlIG1hdHRlcnMsIHdlIGp1c3QgY2FsbCBnZW5lcmljX2NvbnRfZXhwYW5kCisJCSAgIHdoaWNoIHdpbGwgaW4gdHVybiBjYWxsIG90aGVyIHN0dWZmIGFuZCBmaW5hbGx5IHdpbGwgYm9pbCBkb3duIHRvCisJCSAgIHJlaXNlcmZzX2dldF9ibG9jaygpIHRoYXQgd291bGQgZG8gbmVjZXNzYXJ5IGNvbnZlcnNpb24uICovCisJCWNvbnRfZXhwYW5kX29mZnNldCA9CisJCSAgICBsZV9rZXlfa19vZmZzZXQoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLAorCQkJCSAgICAmKGloLT5paF9rZXkpKTsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJcmVzID0gZ2VuZXJpY19jb250X2V4cGFuZChpbm9kZSwgY29udF9leHBhbmRfb2Zmc2V0KTsKKwl9IGVsc2UKKwkJcGF0aHJlbHNlKCZwYXRoKTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJlczsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXM7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gbG9ja3MgcGFnZXMgc3RhcnRpbmcgZnJvbSBAcG9zIGZvciBAaW5vZGUuCkBAIC04NTEsMjc1ICs5NDcsMjk2IEBACiAgICBhcHBlbmQpLCBpdCBpcyB6ZXJvZWQsIHRoZW4uIAogICAgUmV0dXJucyBudW1iZXIgb2YgdW5hbGxvY2F0ZWQgYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZCB0byBjb3ZlcgogICAgbmV3IGZpbGUgZGF0YS4qLwotc3RhdGljIGludCByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSgKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlIC8qIElub2RlIG9mIHRoZSBmaWxlICovLAotCQkJCWxvZmZfdCBwb3MsIC8qIHBvc2l0aW9uIGluIHRoZSBmaWxlICovCi0JCQkJc2l6ZV90IG51bV9wYWdlcywgLyogbnVtYmVyIG9mIHBhZ2VzIHRvCi0JCQkJCSAgICAgICAgICBwcmVwYXJlICovCi0JCQkJc2l6ZV90IHdyaXRlX2J5dGVzLCAvKiBBbW91bnQgb2YgYnl0ZXMgdG8gYmUKLQkJCQkJCSAgICBvdmVyd3JpdHRlbiBmcm9tCi0JCQkJCQkgICAgQHBvcyAqLwotCQkJCXN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMgLyogcG9pbnRlciB0byBhcnJheQotCQkJCQkJCSAgICAgICB3aGVyZSB0byBzdG9yZQotCQkJCQkJCSAgICAgICBwcmVwYXJlZCBwYWdlcyAqLwotCQkJCQkgICApCitzdGF0aWMgaW50IHJlaXNlcmZzX3ByZXBhcmVfZmlsZV9yZWdpb25fZm9yX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUKKwkJCQkJCSAgLyogSW5vZGUgb2YgdGhlIGZpbGUgKi8gLAorCQkJCQkJICBsb2ZmX3QgcG9zLAkvKiBwb3NpdGlvbiBpbiB0aGUgZmlsZSAqLworCQkJCQkJICBzaXplX3QgbnVtX3BhZ2VzLAkvKiBudW1iZXIgb2YgcGFnZXMgdG8KKwkJCQkJCQkJCSAgIHByZXBhcmUgKi8KKwkJCQkJCSAgc2l6ZV90IHdyaXRlX2J5dGVzLAkvKiBBbW91bnQgb2YgYnl0ZXMgdG8gYmUKKwkJCQkJCQkJCSAgIG92ZXJ3cml0dGVuIGZyb20KKwkJCQkJCQkJCSAgIEBwb3MgKi8KKwkJCQkJCSAgc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcwkvKiBwb2ludGVyIHRvIGFycmF5CisJCQkJCQkJCQkJICAgd2hlcmUgdG8gc3RvcmUKKwkJCQkJCQkJCQkgICBwcmVwYXJlZCBwYWdlcyAqLworICAgICkKIHsKLSAgICBpbnQgcmVzPTA7IC8vIFJldHVybiB2YWx1ZXMgb2YgZGlmZmVyZW50IGZ1bmN0aW9ucyB3ZSBjYWxsLgotICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsgLy8gT2Zmc2V0IGluIGZpbGUgaW4gcGFnZXMuCi0gICAgaW50IGZyb20gPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsgLy8gV3JpdGluZyBvZmZzZXQgaW4gZmlyc3QgcGFnZQotICAgIGludCB0byA9ICgocG9zICsgd3JpdGVfYnl0ZXMgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxOwotCQkJCQkgLyogb2Zmc2V0IG9mIGxhc3QgbW9kaWZpZWQgYnl0ZSBpbiBsYXN0Ci0JCQkJICAgICAgICAgICAgcGFnZSAqLwotICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsgLy8gUGFnZXMgYXJlIG1hcHBlZCBoZXJlLgotICAgIGludCBpOyAvLyBTaW1wbGUgY291bnRlcgotICAgIGludCBibG9ja3MgPSAwOyAvKiBSZXR1cm4gdmFsdWUgKGJsb2NrcyB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQpICovCi0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7IC8vIEN1cnJlbnQgYnVmZmVyaGVhZCBhbmQgZmlyc3QgYnVmZmVyaGVhZAotCQkJCSAgIC8vIG9mIGEgcGFnZS4KLSAgICB1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOyAvLyBTdGFydGluZyBhbmQgZW5kaW5nIG9mZnNldHMgb2YgY3VycmVudAotCQkJCSAgICAgLy8gYnVmZmVyIGluIHRoZSBwYWdlLgotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqd2FpdFsyXSwgKip3YWl0X2JoPXdhaXQ7IC8vIEJ1ZmZlcnMgZm9yIHBhZ2UsIGlmCi0JCQkJCQkgLy8gUGFnZSBhcHBlYXJlZCB0byBiZSBub3QgdXAKLQkJCQkJCSAvLyB0byBkYXRlLiBOb3RlIGhvdyB3ZSBoYXZlCi0JCQkJCQkgLy8gYXQgbW9zdCAyIGJ1ZmZlcnMsIHRoaXMgaXMKLQkJCQkJCSAvLyBiZWNhdXNlIHdlIGF0IG1vc3QgbWF5Ci0JCQkJCQkgLy8gcGFydGlhbGx5IG92ZXJ3cml0ZSB0d28KLQkJCQkJCSAvLyBidWZmZXJzIGZvciBvbmUgcGFnZS4gT25lIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBiZWdpbm5pbmcgb2Ygd3JpdGUgYXJlYQotCQkJCQkJIC8vIGFuZCBvbmUgYXQgdGhlIGVuZC4KLQkJCQkJCSAvLyBFdmVyeXRoaW5nIGludGhlIG1pZGRsZSBnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0dGVuIHRvdGFsbHkuCisJaW50IHJlcyA9IDA7CQkvLyBSZXR1cm4gdmFsdWVzIG9mIGRpZmZlcmVudCBmdW5jdGlvbnMgd2UgY2FsbC4KKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CS8vIE9mZnNldCBpbiBmaWxlIGluIHBhZ2VzLgorCWludCBmcm9tID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CS8vIFdyaXRpbmcgb2Zmc2V0IGluIGZpcnN0IHBhZ2UKKwlpbnQgdG8gPSAoKHBvcyArIHdyaXRlX2J5dGVzIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgMTsKKwkvKiBvZmZzZXQgb2YgbGFzdCBtb2RpZmllZCBieXRlIGluIGxhc3QKKwkgICBwYWdlICovCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwkvLyBQYWdlcyBhcmUgbWFwcGVkIGhlcmUuCisJaW50IGk7CQkJLy8gU2ltcGxlIGNvdW50ZXIKKwlpbnQgYmxvY2tzID0gMDsJCS8qIFJldHVybiB2YWx1ZSAoYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZCkgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsJLy8gQ3VycmVudCBidWZmZXJoZWFkIGFuZCBmaXJzdCBidWZmZXJoZWFkCisJLy8gb2YgYSBwYWdlLgorCXVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CS8vIFN0YXJ0aW5nIGFuZCBlbmRpbmcgb2Zmc2V0cyBvZiBjdXJyZW50CisJLy8gYnVmZmVyIGluIHRoZSBwYWdlLgorCXN0cnVjdCBidWZmZXJfaGVhZCAqd2FpdFsyXSwgKip3YWl0X2JoID0gd2FpdDsJLy8gQnVmZmVycyBmb3IgcGFnZSwgaWYKKwkvLyBQYWdlIGFwcGVhcmVkIHRvIGJlIG5vdCB1cAorCS8vIHRvIGRhdGUuIE5vdGUgaG93IHdlIGhhdmUKKwkvLyBhdCBtb3N0IDIgYnVmZmVycywgdGhpcyBpcworCS8vIGJlY2F1c2Ugd2UgYXQgbW9zdCBtYXkKKwkvLyBwYXJ0aWFsbHkgb3ZlcndyaXRlIHR3bworCS8vIGJ1ZmZlcnMgZm9yIG9uZSBwYWdlLiBPbmUgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJlZ2lubmluZyBvZiB3cml0ZSBhcmVhCisJLy8gYW5kIG9uZSBhdCB0aGUgZW5kLgorCS8vIEV2ZXJ5dGhpbmcgaW50aGUgbWlkZGxlIGdldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXR0ZW4gdG90YWxseS4KIAotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsgLy8gY3B1IGtleSBvZiBpdGVtIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloID0gTlVMTDsgLy8gcG9pbnRlciB0byBpdGVtIGhlYWQgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICppdGVtYnVmPU5VTEw7IC8vIEJ1ZmZlciBoZWFkIHRoYXQgY29udGFpbnMgaXRlbXMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgSU5JVElBTElaRV9QQVRIKHBhdGgpOyAvLyBwYXRoIHRvIGl0ZW0sIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aC4KLSAgICBfX2xlMzIgKiBpdGVtPU5VTEw7IC8vIHBvaW50ZXIgdG8gaXRlbSB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgaW50IGl0ZW1fcG9zPS0xOyAvKiBQb3NpdGlvbiBpbiBpbmRpcmVjdCBpdGVtICovCisJc3RydWN0IGNwdV9rZXkga2V5OwkvLyBjcHUga2V5IG9mIGl0ZW0gdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisJc3RydWN0IGl0ZW1faGVhZCAqaWggPSBOVUxMOwkvLyBwb2ludGVyIHRvIGl0ZW0gaGVhZCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKml0ZW1idWYgPSBOVUxMOwkvLyBCdWZmZXIgaGVhZCB0aGF0IGNvbnRhaW5zIGl0ZW1zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsJLy8gcGF0aCB0byBpdGVtLCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGguCisJX19sZTMyICppdGVtID0gTlVMTDsJLy8gcG9pbnRlciB0byBpdGVtIHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlpbnQgaXRlbV9wb3MgPSAtMTsJLyogUG9zaXRpb24gaW4gaW5kaXJlY3QgaXRlbSAqLwogCi0KLSAgICBpZiAoIG51bV9wYWdlcyA8IDEgKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0JCQkgICJncmVlbi05MDAxOiByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSAiCi0JCQkgICJjYWxsZWQgd2l0aCB6ZXJvIG51bWJlciBvZiBwYWdlcyB0byBwcm9jZXNzIik7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci0gICAgfQotCi0gICAgLyogV2UgaGF2ZSAyIGxvb3BzIGZvciBwYWdlcy4gSW4gZmlyc3QgbG9vcCB3ZSBncmFiIGFuZCBsb2NrIHRoZSBwYWdlcywgc28KLSAgICAgICB0aGF0IG5vYm9keSB3b3VsZCB0b3VjaCB0aGVzZSB1bnRpbCB3ZSByZWxlYXNlIHRoZSBwYWdlcy4gVGhlbgotICAgICAgIHdlJ2Qgc3RhcnQgdG8gZGVhbCB3aXRoIG1hcHBpbmcgYnVmZmVycyB0byBibG9ja3MuICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgewotCXByZXBhcmVkX3BhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4ICsgaSk7IC8vIGxvY2tzIHRoZSBwYWdlCi0JaWYgKCAhcHJlcGFyZWRfcGFnZXNbaV0pIHsKLQkgICAgcmVzID0gLUVOT01FTTsKLQkgICAgZ290byBmYWlsZWRfcGFnZV9ncmFiYmluZzsKLQl9Ci0JaWYgKCFwYWdlX2hhc19idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldKSkKLQkgICAgY3JlYXRlX2VtcHR5X2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbaV0sIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgMCk7Ci0gICAgfQotCi0gICAgLyogTGV0J3MgY291bnQgYW1vdW50IG9mIGJsb2NrcyBmb3IgYSBjYXNlIHdoZXJlIGFsbCB0aGUgYmxvY2tzCi0gICAgICAgb3ZlcndyaXR0ZW4gYXJlIG5ldyAod2Ugd2lsbCBzdWJzdHJhY3QgYWxyZWFkeSBhbGxvY2F0ZWQgYmxvY2tzIGxhdGVyKSovCi0gICAgaWYgKCBudW1fcGFnZXMgPiAyICkKLQkvKiBUaGVzZSBhcmUgZnVsbC1vdmVyd3JpdHRlbiBwYWdlcyBzbyB3ZSBjb3VudCBhbGwgdGhlIGJsb2NrcyBpbgotCSAgIHRoZXNlIHBhZ2VzIGFyZSBjb3VudGVkIGFzIG5lZWRlZCB0byBiZSBhbGxvY2F0ZWQgKi8KLQlibG9ja3MgPSAobnVtX3BhZ2VzIC0gMikgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKLQotICAgIC8qIGNvdW50IGJsb2NrcyBuZWVkZWQgZm9yIGZpcnN0IHBhZ2UgKHBvc3NpYmx5IHBhcnRpYWxseSB3cml0dGVuKSAqLwotICAgIGJsb2NrcyArPSAoKFBBR0VfQ0FDSEVfU0laRSAtIGZyb20pID4+IGlub2RlLT5pX2Jsa2JpdHMpICsKLQkgICAhIShmcm9tICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS0xKSk7IC8qIHJvdW5kdXAgKi8KLQotICAgIC8qIE5vdyB3ZSBhY2NvdW50IGZvciBsYXN0IHBhZ2UuIElmIGxhc3QgcGFnZSA9PSBmaXJzdCBwYWdlICh3ZQotICAgICAgIG92ZXJ3cml0ZSBvbmx5IG9uZSBwYWdlKSwgd2Ugc3Vic3RyYWN0IGFsbCB0aGUgYmxvY2tzIHBhc3QgdGhlCi0gICAgICAgbGFzdCB3cml0aW5nIHBvc2l0aW9uIGluIGEgcGFnZSBvdXQgb2YgYWxyZWFkeSBjYWxjdWxhdGVkIG51bWJlcgotICAgICAgIG9mIGJsb2NrcyAqLwotICAgIGJsb2NrcyArPSAoKG51bV9wYWdlcyA+IDEpIDw8IChQQUdFX0NBQ0hFX1NISUZULWlub2RlLT5pX2Jsa2JpdHMpKSAtCi0JICAgKChQQUdFX0NBQ0hFX1NJWkUgLSB0bykgPj4gaW5vZGUtPmlfYmxrYml0cyk7Ci0JICAgLyogTm90ZSBob3cgd2UgZG8gbm90IHJvdW5kdXAgaGVyZSBzaW5jZSBwYXJ0aWFsIGJsb2NrcyBzdGlsbAotCQkgICBzaG91bGQgYmUgYWxsb2NhdGVkICovCi0KLSAgICAvKiBOb3cgaWYgYWxsIHRoZSB3cml0ZSBhcmVhIGxpZXMgcGFzdCB0aGUgZmlsZSBlbmQsIG5vIHBvaW50IGluCi0gICAgICAgbWFwaW5nIGJsb2Nrcywgc2luY2UgdGhlcmUgaXMgbm9uZSwgc28gd2UganVzdCB6ZXJvIG91dCByZW1haW5pbmcKLSAgICAgICBwYXJ0cyBvZiBmaXJzdCBhbmQgbGFzdCBwYWdlcyBpbiB3cml0ZSBhcmVhIChpZiBuZWVkZWQpICovCi0gICAgaWYgKCAocG9zICYgfigobG9mZl90KVBBR0VfQ0FDSEVfU0laRSAtIDEpKSA+IGlub2RlLT5pX3NpemUgKSB7Ci0JaWYgKCBmcm9tICE9IDAgKSB7LyogRmlyc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCi0JICAgIGNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbMF0sIEtNX1VTRVIwKTsKLQkgICAgbWVtc2V0KGthZGRyLCAwLCBmcm9tKTsKLQkgICAga3VubWFwX2F0b21pYygga2FkZHIsIEtNX1VTRVIwKTsKLQl9Ci0JaWYgKCB0byAhPSBQQUdFX0NBQ0hFX1NJWkUgKSB7IC8qIExhc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCi0JICAgIGNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdLCBLTV9VU0VSMCk7Ci0JICAgIG1lbXNldChrYWRkcit0bywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gdG8pOwotCSAgICBrdW5tYXBfYXRvbWljKCBrYWRkciwgS01fVVNFUjApOworCWlmIChudW1fcGFnZXMgPCAxKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJncmVlbi05MDAxOiByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSAiCisJCQkJICJjYWxsZWQgd2l0aCB6ZXJvIG51bWJlciBvZiBwYWdlcyB0byBwcm9jZXNzIik7CisJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCS8qIFNpbmNlIGFsbCBibG9ja3MgYXJlIG5ldyAtIHVzZSBhbHJlYWR5IGNhbGN1bGF0ZWQgdmFsdWUgKi8KLQlyZXR1cm4gYmxvY2tzOwotICAgIH0KKwkvKiBXZSBoYXZlIDIgbG9vcHMgZm9yIHBhZ2VzLiBJbiBmaXJzdCBsb29wIHdlIGdyYWIgYW5kIGxvY2sgdGhlIHBhZ2VzLCBzbworCSAgIHRoYXQgbm9ib2R5IHdvdWxkIHRvdWNoIHRoZXNlIHVudGlsIHdlIHJlbGVhc2UgdGhlIHBhZ2VzLiBUaGVuCisJICAgd2UnZCBzdGFydCB0byBkZWFsIHdpdGggbWFwcGluZyBidWZmZXJzIHRvIGJsb2Nrcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJcHJlcGFyZWRfcGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXggKyBpKTsJLy8gbG9ja3MgdGhlIHBhZ2UKKwkJaWYgKCFwcmVwYXJlZF9wYWdlc1tpXSkgeworCQkJcmVzID0gLUVOT01FTTsKKwkJCWdvdG8gZmFpbGVkX3BhZ2VfZ3JhYmJpbmc7CisJCX0KKwkJaWYgKCFwYWdlX2hhc19idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldKSkKKwkJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldLAorCQkJCQkgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgMCk7CisJfQogCi0gICAgLyogV2VsbCwgc2luY2Ugd2Ugd3JpdGUgc29tZXdoZXJlIGludG8gdGhlIG1pZGRsZSBvZiBhIGZpbGUsIHRoZXJlIGlzCi0gICAgICAgcG9zc2liaWxpdHkgd2UgYXJlIHdyaXRpbmcgb3ZlciBzb21lIGFscmVhZHkgYWxsb2NhdGVkIGJsb2Nrcywgc28KLSAgICAgICBsZXQncyBtYXAgdGhlc2UgYmxvY2tzIGFuZCBzdWJzdHJhY3QgbnVtYmVyIG9mIHN1Y2ggYmxvY2tzIG91dCBvZiBibG9ja3MKLSAgICAgICB3ZSBuZWVkIHRvIGFsbG9jYXRlIChjYWxjdWxhdGVkIGFib3ZlKSAqLwotICAgIC8qIE1hc2sgd3JpdGUgcG9zaXRpb24gdG8gc3RhcnQgb24gYmxvY2tzaXplLCB3ZSBkbyBpdCBvdXQgb2YgdGhlCi0gICAgICAgbG9vcCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAqLwotICAgIHBvcyAmPSB+KChsb2ZmX3QpIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpOwotICAgIC8qIFNldCBjcHUga2V5IHRvIHRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiBhIGZpbGUgKG9uIGxlZnQgYmxvY2sgYm91bmRhcnkpKi8KLSAgICBtYWtlX2NwdV9rZXkgKCZrZXksIGlub2RlLCAxICsgKChwb3MpICYgfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSksIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOworCS8qIExldCdzIGNvdW50IGFtb3VudCBvZiBibG9ja3MgZm9yIGEgY2FzZSB3aGVyZSBhbGwgdGhlIGJsb2NrcworCSAgIG92ZXJ3cml0dGVuIGFyZSBuZXcgKHdlIHdpbGwgc3Vic3RyYWN0IGFscmVhZHkgYWxsb2NhdGVkIGJsb2NrcyBsYXRlcikgKi8KKwlpZiAobnVtX3BhZ2VzID4gMikKKwkJLyogVGhlc2UgYXJlIGZ1bGwtb3ZlcndyaXR0ZW4gcGFnZXMgc28gd2UgY291bnQgYWxsIHRoZSBibG9ja3MgaW4KKwkJICAgdGhlc2UgcGFnZXMgYXJlIGNvdW50ZWQgYXMgbmVlZGVkIHRvIGJlIGFsbG9jYXRlZCAqLworCQlibG9ja3MgPQorCQkgICAgKG51bV9wYWdlcyAtIDIpIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsgLy8gV2UgbmVlZCB0aGF0IGZvciBhdCBsZWFzdCBzZWFyY2hfYnlfa2V5KCkKLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wYWdlcyA7IGkrKyApIHsgCisJLyogY291bnQgYmxvY2tzIG5lZWRlZCBmb3IgZmlyc3QgcGFnZSAocG9zc2libHkgcGFydGlhbGx5IHdyaXR0ZW4pICovCisJYmxvY2tzICs9ICgoUEFHRV9DQUNIRV9TSVpFIC0gZnJvbSkgPj4gaW5vZGUtPmlfYmxrYml0cykgKyAhIShmcm9tICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsJLyogcm91bmR1cCAqLwogCi0JaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tpXSk7Ci0JLyogRm9yIGVhY2ggYnVmZmVyIGluIHRoZSBwYWdlICovCi0JZm9yKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKLQkgICAgYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgewotCQlpZiAoIWJoKQotCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKLQkJLyogRmluZCB3aGVyZSB0aGlzIGJ1ZmZlciBlbmRzICovCi0JCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQkJaWYgKGkgPT0gMCAmJiBibG9ja19lbmQgPD0gZnJvbSApCi0JCSAgICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0Ki8KLQkJICAgIGNvbnRpbnVlOworCS8qIE5vdyB3ZSBhY2NvdW50IGZvciBsYXN0IHBhZ2UuIElmIGxhc3QgcGFnZSA9PSBmaXJzdCBwYWdlICh3ZQorCSAgIG92ZXJ3cml0ZSBvbmx5IG9uZSBwYWdlKSwgd2Ugc3Vic3RyYWN0IGFsbCB0aGUgYmxvY2tzIHBhc3QgdGhlCisJICAgbGFzdCB3cml0aW5nIHBvc2l0aW9uIGluIGEgcGFnZSBvdXQgb2YgYWxyZWFkeSBjYWxjdWxhdGVkIG51bWJlcgorCSAgIG9mIGJsb2NrcyAqLworCWJsb2NrcyArPSAoKG51bV9wYWdlcyA+IDEpIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cykpIC0KKwkgICAgKChQQUdFX0NBQ0hFX1NJWkUgLSB0bykgPj4gaW5vZGUtPmlfYmxrYml0cyk7CisJLyogTm90ZSBob3cgd2UgZG8gbm90IHJvdW5kdXAgaGVyZSBzaW5jZSBwYXJ0aWFsIGJsb2NrcyBzdGlsbAorCSAgIHNob3VsZCBiZSBhbGxvY2F0ZWQgKi8KIAotCQlpZiAoaSA9PSBudW1fcGFnZXMgLSAxICYmIGJsb2NrX3N0YXJ0ID49IHRvKSB7Ci0JCSAgICAvKiBJZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIGFib3J0Ci0JCSAgICAgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLwotCQkgICAgYnJlYWs7CisJLyogTm93IGlmIGFsbCB0aGUgd3JpdGUgYXJlYSBsaWVzIHBhc3QgdGhlIGZpbGUgZW5kLCBubyBwb2ludCBpbgorCSAgIG1hcGluZyBibG9ja3MsIHNpbmNlIHRoZXJlIGlzIG5vbmUsIHNvIHdlIGp1c3QgemVybyBvdXQgcmVtYWluaW5nCisJICAgcGFydHMgb2YgZmlyc3QgYW5kIGxhc3QgcGFnZXMgaW4gd3JpdGUgYXJlYSAoaWYgbmVlZGVkKSAqLworCWlmICgocG9zICYgfigobG9mZl90KSBQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgPiBpbm9kZS0+aV9zaXplKSB7CisJCWlmIChmcm9tICE9IDApIHsJLyogRmlyc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCisJCQljaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzWzBdLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIsIDAsIGZyb20pOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl9CisJCWlmICh0byAhPSBQQUdFX0NBQ0hFX1NJWkUpIHsJLyogTGFzdCBwYWdlIG5lZWRzIHRvIGJlIHBhcnRpYWxseSB6ZXJvZWQgKi8KKwkJCWNoYXIgKmthZGRyID0KKwkJCSAgICBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMgLSAxXSwKKwkJCQkJS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgdG8sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHRvKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAkJfQogCi0JCWlmICggYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciAhPTAgKSB7Ci0JCSAgICAvKiBUaGlzIGlzIG9wdGltaXNhdGlvbiBmb3IgYSBjYXNlIHdoZXJlIGJ1ZmZlciBpcyBtYXBwZWQKLQkJICAgICAgIGFuZCBoYXZlIGJsb2NrbnVtYmVyIGFzc2lnbmVkLiBJbiBjYXNlIHNpZ25pZmljYW50IGFtb3VudAotCQkgICAgICAgb2Ygc3VjaCBidWZmZXJzIGFyZSBwcmVzZW50LCB3ZSBtYXkgYXZvaWQgc29tZSBhbW91bnQKLQkJICAgICAgIG9mIHNlYXJjaF9ieV9rZXkgY2FsbHMuCi0JCSAgICAgICBQcm9iYWJseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBtb3ZlIHBhcnRzIG9mIHRoaXMgY29kZQotCQkgICAgICAgb3V0IG9mIEJLTCwgYnV0IEkgYWZyYWlkIHRoYXQgd291bGQgb3ZlcmNvbXBsaWNhdGUgY29kZQotCQkgICAgICAgd2l0aG91dCBhbnkgbm90aWNlYWJsZSBiZW5lZml0LgotCQkgICAgKi8KLQkJICAgIGl0ZW1fcG9zKys7Ci0JCSAgICAvKiBVcGRhdGUgdGhlIGtleSAqLwotCQkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCQkgICAgYmxvY2tzLS07IC8vIERlY3JlYXNlIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgbmVlZCB0byBiZQotCQkJICAgICAgLy8gYWxsb2NhdGVkCi0JCSAgICBjb250aW51ZTsgLy8gR28gdG8gdGhlIG5leHQgYnVmZmVyCi0JCX0KKwkJLyogU2luY2UgYWxsIGJsb2NrcyBhcmUgbmV3IC0gdXNlIGFscmVhZHkgY2FsY3VsYXRlZCB2YWx1ZSAqLworCQlyZXR1cm4gYmxvY2tzOworCX0KIAotCQlpZiAoICFpdGVtYnVmIHx8IC8qIGlmIGZpcnN0IGl0ZXJhdGlvbiAqLwotCQkgICAgIGl0ZW1fcG9zID49IGloX2l0ZW1fbGVuKGloKS9VTkZNX1BfU0laRSkKLQkJCQkJICAgICB7IC8qIG9yIGlmIHdlIHByb2dyZXNzZWQgcGFzdCB0aGUKLQkJCQkJCSAgY3VycmVudCB1bmZvcm1hdHRlZF9pdGVtICovCi0JCQkvKiBUcnkgdG8gZmluZCBuZXh0IGl0ZW0gKi8KLQkJCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JCQkvKiBBYm9ydCBpZiBubyBtb3JlIGl0ZW1zICovCi0JCQlpZiAoIHJlcyAhPSBQT1NJVElPTl9GT1VORCApIHsKLQkJCSAgICAvKiBtYWtlIHN1cmUgbGF0ZXIgbG9vcHMgZG9uJ3QgdXNlIHRoaXMgaXRlbSAqLwotCQkJICAgIGl0ZW1idWYgPSBOVUxMOwotCQkJICAgIGl0ZW0gPSBOVUxMOwotCQkJICAgIGJyZWFrOworCS8qIFdlbGwsIHNpbmNlIHdlIHdyaXRlIHNvbWV3aGVyZSBpbnRvIHRoZSBtaWRkbGUgb2YgYSBmaWxlLCB0aGVyZSBpcworCSAgIHBvc3NpYmlsaXR5IHdlIGFyZSB3cml0aW5nIG92ZXIgc29tZSBhbHJlYWR5IGFsbG9jYXRlZCBibG9ja3MsIHNvCisJICAgbGV0J3MgbWFwIHRoZXNlIGJsb2NrcyBhbmQgc3Vic3RyYWN0IG51bWJlciBvZiBzdWNoIGJsb2NrcyBvdXQgb2YgYmxvY2tzCisJICAgd2UgbmVlZCB0byBhbGxvY2F0ZSAoY2FsY3VsYXRlZCBhYm92ZSkgKi8KKwkvKiBNYXNrIHdyaXRlIHBvc2l0aW9uIHRvIHN0YXJ0IG9uIGJsb2Nrc2l6ZSwgd2UgZG8gaXQgb3V0IG9mIHRoZQorCSAgIGxvb3AgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKi8KKwlwb3MgJj0gfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKTsKKwkvKiBTZXQgY3B1IGtleSB0byB0aGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gYSBmaWxlIChvbiBsZWZ0IGJsb2NrIGJvdW5kYXJ5KSAqLworCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwKKwkJICAgICAxICsgKChwb3MpICYgfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSksCisJCSAgICAgVFlQRV9BTlksIDMgLyprZXkgbGVuZ3RoICovICk7CisKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsJLy8gV2UgbmVlZCB0aGF0IGZvciBhdCBsZWFzdCBzZWFyY2hfYnlfa2V5KCkKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKworCQloZWFkID0gcGFnZV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldKTsKKwkJLyogRm9yIGVhY2ggYnVmZmVyIGluIHRoZSBwYWdlICovCisJCWZvciAoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCQkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgeworCQkJaWYgKCFiaCkKKwkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLworCQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCQlpZiAoaSA9PSAwICYmIGJsb2NrX2VuZCA8PSBmcm9tKQorCQkJCS8qIGlmIHRoaXMgYnVmZmVyIGlzIGJlZm9yZSByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQgKi8KKwkJCQljb250aW51ZTsKKworCQkJaWYgKGkgPT0gbnVtX3BhZ2VzIC0gMSAmJiBibG9ja19zdGFydCA+PSB0bykgeworCQkJCS8qIElmIHRoaXMgYnVmZmVyIGlzIGFmdGVyIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgYWJvcnQKKwkJCQkgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLworCQkJCWJyZWFrOwogCQkJfQogCi0JCQkvKiBVcGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBpbmRpcmVjdCBpdGVtICovCi0JCQlpdGVtYnVmID0gZ2V0X2xhc3RfYmgoICZwYXRoICk7Ci0JCQlpaCA9IGdldF9paCggJnBhdGggKTsKLQkJCWl0ZW0gPSBnZXRfaXRlbSggJnBhdGggKTsKLQkJCWl0ZW1fcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKKwkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yICE9IDApIHsKKwkJCQkvKiBUaGlzIGlzIG9wdGltaXNhdGlvbiBmb3IgYSBjYXNlIHdoZXJlIGJ1ZmZlciBpcyBtYXBwZWQKKwkJCQkgICBhbmQgaGF2ZSBibG9ja251bWJlciBhc3NpZ25lZC4gSW4gY2FzZSBzaWduaWZpY2FudCBhbW91bnQKKwkJCQkgICBvZiBzdWNoIGJ1ZmZlcnMgYXJlIHByZXNlbnQsIHdlIG1heSBhdm9pZCBzb21lIGFtb3VudAorCQkJCSAgIG9mIHNlYXJjaF9ieV9rZXkgY2FsbHMuCisJCQkJICAgUHJvYmFibHkgaXQgd291bGQgYmUgcG9zc2libGUgdG8gbW92ZSBwYXJ0cyBvZiB0aGlzIGNvZGUKKwkJCQkgICBvdXQgb2YgQktMLCBidXQgSSBhZnJhaWQgdGhhdCB3b3VsZCBvdmVyY29tcGxpY2F0ZSBjb2RlCisJCQkJICAgd2l0aG91dCBhbnkgbm90aWNlYWJsZSBiZW5lZml0LgorCQkJCSAqLworCQkJCWl0ZW1fcG9zKys7CisJCQkJLyogVXBkYXRlIHRoZSBrZXkgKi8KKwkJCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LAorCQkJCQkJICAgICBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsKKwkJCQkJCSAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJCQlibG9ja3MtLTsJLy8gRGVjcmVhc2UgdGhlIGFtb3VudCBvZiBibG9ja3MgdGhhdCBuZWVkIHRvIGJlCisJCQkJLy8gYWxsb2NhdGVkCisJCQkJY29udGludWU7CS8vIEdvIHRvIHRoZSBuZXh0IGJ1ZmZlcgorCQkJfQogCi0JCQlSRkFMU0UoICFpc19pbmRpcmVjdF9sZV9paCAoaWgpLCAiZ3JlZW4tOTAwMzogaW5kaXJlY3QgaXRlbSBleHBlY3RlZCIpOwotCQl9CisJCQlpZiAoIWl0ZW1idWYgfHwJLyogaWYgZmlyc3QgaXRlcmF0aW9uICovCisJCQkgICAgaXRlbV9wb3MgPj0gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUpIHsJLyogb3IgaWYgd2UgcHJvZ3Jlc3NlZCBwYXN0IHRoZQorCQkJCQkJCQkJCSAgIGN1cnJlbnQgdW5mb3JtYXR0ZWRfaXRlbSAqLworCQkJCS8qIFRyeSB0byBmaW5kIG5leHQgaXRlbSAqLworCQkJCXJlcyA9CisJCQkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLAorCQkJCQkJCSAgICAgICAma2V5LCAmcGF0aCk7CisJCQkJLyogQWJvcnQgaWYgbm8gbW9yZSBpdGVtcyAqLworCQkJCWlmIChyZXMgIT0gUE9TSVRJT05fRk9VTkQpIHsKKwkJCQkJLyogbWFrZSBzdXJlIGxhdGVyIGxvb3BzIGRvbid0IHVzZSB0aGlzIGl0ZW0gKi8KKwkJCQkJaXRlbWJ1ZiA9IE5VTEw7CisJCQkJCWl0ZW0gPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CiAKLQkJLyogU2VlIGlmIHRoZXJlIGlzIHNvbWUgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlCi0JCSAgIGF0IHRoYXQgcG9zaXRpb24sIG1hcCB0aGUgYnVmZmVyIHRvIHRoaXMgYmxvY2sgKi8KLQkJaWYgKCBnZXRfYmxvY2tfbnVtKGl0ZW0saXRlbV9wb3MpICkgewotCQkgICAgbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgZ2V0X2Jsb2NrX251bShpdGVtLGl0ZW1fcG9zKSk7Ci0JCSAgICBibG9ja3MtLTsgLy8gRGVjcmVhc2UgdGhlIGFtb3VudCBvZiBibG9ja3MgdGhhdCBuZWVkIHRvIGJlCi0JCQkgICAgICAvLyBhbGxvY2F0ZWQKKwkJCQkvKiBVcGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBpbmRpcmVjdCBpdGVtICovCisJCQkJaXRlbWJ1ZiA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCQkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkJCQlpdGVtX3BvcyA9IHBhdGgucG9zX2luX2l0ZW07CisKKwkJCQlSRkFMU0UoIWlzX2luZGlyZWN0X2xlX2loKGloKSwKKwkJCQkgICAgICAgImdyZWVuLTkwMDM6IGluZGlyZWN0IGl0ZW0gZXhwZWN0ZWQiKTsKKwkJCX0KKworCQkJLyogU2VlIGlmIHRoZXJlIGlzIHNvbWUgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlCisJCQkgICBhdCB0aGF0IHBvc2l0aW9uLCBtYXAgdGhlIGJ1ZmZlciB0byB0aGlzIGJsb2NrICovCisJCQlpZiAoZ2V0X2Jsb2NrX251bShpdGVtLCBpdGVtX3BvcykpIHsKKwkJCQltYXBfYmgoYmgsIGlub2RlLT5pX3NiLAorCQkJCSAgICAgICBnZXRfYmxvY2tfbnVtKGl0ZW0sIGl0ZW1fcG9zKSk7CisJCQkJYmxvY2tzLS07CS8vIERlY3JlYXNlIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgbmVlZCB0byBiZQorCQkJCS8vIGFsbG9jYXRlZAorCQkJfQorCQkJaXRlbV9wb3MrKzsKKwkJCS8qIFVwZGF0ZSB0aGUga2V5ICovCisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LAorCQkJCQkgICAgIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKworCQkJCQkgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAJCX0KLQkJaXRlbV9wb3MrKzsKLQkJLyogVXBkYXRlIHRoZSBrZXkgKi8KLQkJc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCX0KLSAgICB9Ci0gICAgcGF0aHJlbHNlKCZwYXRoKTsgLy8gRnJlZSB0aGUgcGF0aAotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcGF0aHJlbHNlKCZwYXRoKTsJLy8gRnJlZSB0aGUgcGF0aAorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiAKIAkvKiBOb3cgemVybyBvdXQgdW5tYXBwZW5kIGJ1ZmZlcnMgZm9yIHRoZSBmaXJzdCBhbmQgbGFzdCBwYWdlcyBvZgogCSAgIHdyaXRlIGFyZWEgb3IgaXNzdWUgcmVhZCByZXF1ZXN0cyBpZiBwYWdlIGlzIG1hcHBlZC4gKi8KIAkvKiBGaXJzdCBwYWdlLCBzZWUgaWYgaXQgaXMgbm90IHVwdG9kYXRlICovCi0JaWYgKCAhUGFnZVVwdG9kYXRlKHByZXBhcmVkX3BhZ2VzWzBdKSApIHsKLQkgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1swXSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocHJlcGFyZWRfcGFnZXNbMF0pKSB7CisJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbMF0pOwogCi0JICAgIC8qIEZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCi0JICAgIGZvcihiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7Ci0JCWJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKKwkJLyogRm9yIGVhY2ggYnVmZmVyIGluIHBhZ2UgKi8KKwkJZm9yIChiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJCSAgICAgYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CiAKLQkJaWYgKCFiaCkKLQkJICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAwMjogQWxsb2NhdGVkIGJ1dCBhYnNlbnQgYnVmZmVyIGZvciBhIHBhZ2U/Iik7Ci0JCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLwotCQlibG9ja19lbmQgPSBibG9ja19zdGFydCtpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JCWlmICggYmxvY2tfZW5kIDw9IGZyb20gKQotCQkgICAgLyogaWYgdGhpcyBidWZmZXIgaXMgYmVmb3JlIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCovCi0JCSAgICBjb250aW51ZTsKLQkJaWYgKCBibG9ja19zdGFydCA8IGZyb20gKSB7IC8qIEFoYSwgb3VyIHBhcnRpYWwgYnVmZmVyICovCi0JCSAgICBpZiAoIGJ1ZmZlcl9tYXBwZWQoYmgpICkgeyAvKiBJZiBpdCBpcyBtYXBwZWQsIHdlIG5lZWQgdG8KLQkJCQkJCSAgaXNzdWUgUkVBRCByZXF1ZXN0IGZvciBpdCB0bwotCQkJCQkJICBub3QgbG9vc2UgZGF0YSAqLwotCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKLQkJCSp3YWl0X2JoKys9Ymg7Ci0JCSAgICB9IGVsc2UgeyAvKiBOb3QgbWFwcGVkLCB6ZXJvIGl0ICovCi0JCQljaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzWzBdLCBLTV9VU0VSMCk7Ci0JCQltZW1zZXQoa2FkZHIrYmxvY2tfc3RhcnQsIDAsIGZyb20tYmxvY2tfc3RhcnQpOwotCQkJa3VubWFwX2F0b21pYygga2FkZHIsIEtNX1VTRVIwKTsKLQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQkgICAgfQorCQkJaWYgKCFiaCkKKwkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLworCQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20pCisJCQkJLyogaWYgdGhpcyBidWZmZXIgaXMgYmVmb3JlIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCAqLworCQkJCWNvbnRpbnVlOworCQkJaWYgKGJsb2NrX3N0YXJ0IDwgZnJvbSkgewkvKiBBaGEsIG91ciBwYXJ0aWFsIGJ1ZmZlciAqLworCQkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSkgewkvKiBJZiBpdCBpcyBtYXBwZWQsIHdlIG5lZWQgdG8KKwkJCQkJCQkJICAgaXNzdWUgUkVBRCByZXF1ZXN0IGZvciBpdCB0bworCQkJCQkJCQkgICBub3QgbG9vc2UgZGF0YSAqLworCQkJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJCQkqd2FpdF9iaCsrID0gYmg7CisJCQkJfSBlbHNlIHsJLyogTm90IG1hcHBlZCwgemVybyBpdCAqLworCQkJCQljaGFyICprYWRkciA9CisJCQkJCSAgICBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1swXSwKKwkJCQkJCQlLTV9VU0VSMCk7CisJCQkJCW1lbXNldChrYWRkciArIGJsb2NrX3N0YXJ0LCAwLAorCQkJCQkgICAgICAgZnJvbSAtIGJsb2NrX3N0YXJ0KTsKKwkJCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQl9CisJCQl9CiAJCX0KLQkgICAgfQogCX0KIAogCS8qIExhc3QgcGFnZSwgc2VlIGlmIGl0IGlzIG5vdCB1cHRvZGF0ZSwgb3IgaWYgdGhlIGxhc3QgcGFnZSBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICovCi0JaWYgKCAhUGFnZVVwdG9kYXRlKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcy0xXSkgfHwgCi0JICAgICgocG9zK3dyaXRlX2J5dGVzKT4+UEFHRV9DQUNIRV9TSElGVCkgPiAoaW5vZGUtPmlfc2l6ZT4+UEFHRV9DQUNIRV9TSElGVCkgKSB7Ci0JICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMgLSAxXSkgfHwKKwkgICAgKChwb3MgKyB3cml0ZV9ieXRlcykgPj4gUEFHRV9DQUNIRV9TSElGVCkgPgorCSAgICAoaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgeworCQloZWFkID0gcGFnZV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcyAtIDFdKTsKIAotCSAgICAvKiBmb3IgZWFjaCBidWZmZXIgaW4gcGFnZSAqLwotCSAgICBmb3IoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OwotCQlibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CisJCS8qIGZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCisJCWZvciAoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCQkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgewogCi0JCWlmICghYmgpCi0JCSAgICByZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMDI6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOwotCQkvKiBGaW5kIHdoZXJlIHRoaXMgYnVmZmVyIGVuZHMgKi8KLQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQraW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCQlpZiAoIGJsb2NrX3N0YXJ0ID49IHRvICkKLQkJICAgIC8qIGlmIHRoaXMgYnVmZmVyIGlzIGFmdGVyIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCovCi0JCSAgICBicmVhazsKLQkJaWYgKCBibG9ja19lbmQgPiB0byApIHsgLyogQWhhLCBvdXIgcGFydGlhbCBidWZmZXIgKi8KLQkJICAgIGlmICggYnVmZmVyX21hcHBlZChiaCkgKSB7IC8qIElmIGl0IGlzIG1hcHBlZCwgd2UgbmVlZCB0bwotCQkJCQkJICBpc3N1ZSBSRUFEIHJlcXVlc3QgZm9yIGl0IHRvCi0JCQkJCQkgIG5vdCBsb29zZSBkYXRhICovCi0JCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOwotCQkJKndhaXRfYmgrKz1iaDsKLQkJICAgIH0gZWxzZSB7IC8qIE5vdCBtYXBwZWQsIHplcm8gaXQgKi8KLQkJCWNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdLCBLTV9VU0VSMCk7Ci0JCQltZW1zZXQoa2FkZHIrdG8sIDAsIGJsb2NrX2VuZC10byk7Ci0JCQlrdW5tYXBfYXRvbWljKCBrYWRkciwgS01fVVNFUjApOwotCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCSAgICB9CisJCQlpZiAoIWJoKQorCQkJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJCQkgICAgICAgImdyZWVuLTkwMDI6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOworCQkJLyogRmluZCB3aGVyZSB0aGlzIGJ1ZmZlciBlbmRzICovCisJCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJCWlmIChibG9ja19zdGFydCA+PSB0bykKKwkJCQkvKiBpZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQgKi8KKwkJCQlicmVhazsKKwkJCWlmIChibG9ja19lbmQgPiB0bykgewkvKiBBaGEsIG91ciBwYXJ0aWFsIGJ1ZmZlciAqLworCQkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSkgewkvKiBJZiBpdCBpcyBtYXBwZWQsIHdlIG5lZWQgdG8KKwkJCQkJCQkJICAgaXNzdWUgUkVBRCByZXF1ZXN0IGZvciBpdCB0bworCQkJCQkJCQkgICBub3QgbG9vc2UgZGF0YSAqLworCQkJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJCQkqd2FpdF9iaCsrID0gYmg7CisJCQkJfSBlbHNlIHsJLyogTm90IG1hcHBlZCwgemVybyBpdCAqLworCQkJCQljaGFyICprYWRkciA9CisJCQkJCSAgICBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlcworCQkJCQkJCVtudW1fcGFnZXMgLSAxXSwKKwkJCQkJCQlLTV9VU0VSMCk7CisJCQkJCW1lbXNldChrYWRkciArIHRvLCAwLCBibG9ja19lbmQgLSB0byk7CisJCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJfQorCQkJfQogCQl9Ci0JICAgIH0KIAl9CiAKLSAgICAvKiBXYWl0IGZvciByZWFkIHJlcXVlc3RzIHdlIG1hZGUgdG8gaGFwcGVuLCBpZiBuZWNlc3NhcnkgKi8KLSAgICB3aGlsZSh3YWl0X2JoID4gd2FpdCkgewotCXdhaXRfb25fYnVmZmVyKCotLXdhaXRfYmgpOwotCWlmICghYnVmZmVyX3VwdG9kYXRlKCp3YWl0X2JoKSkgewotCSAgICByZXMgPSAtRUlPOwotCSAgICBnb3RvIGZhaWxlZF9yZWFkOworCS8qIFdhaXQgZm9yIHJlYWQgcmVxdWVzdHMgd2UgbWFkZSB0byBoYXBwZW4sIGlmIG5lY2Vzc2FyeSAqLworCXdoaWxlICh3YWl0X2JoID4gd2FpdCkgeworCQl3YWl0X29uX2J1ZmZlcigqLS13YWl0X2JoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoKndhaXRfYmgpKSB7CisJCQlyZXMgPSAtRUlPOworCQkJZ290byBmYWlsZWRfcmVhZDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICByZXR1cm4gYmxvY2tzOwotZmFpbGVkX3BhZ2VfZ3JhYmJpbmc6Ci0gICAgbnVtX3BhZ2VzID0gaTsKLWZhaWxlZF9yZWFkOgotICAgIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKLSAgICByZXR1cm4gcmVzOworCXJldHVybiBibG9ja3M7CisgICAgICBmYWlsZWRfcGFnZV9ncmFiYmluZzoKKwludW1fcGFnZXMgPSBpOworICAgICAgZmFpbGVkX3JlYWQ6CisJcmVpc2VyZnNfdW5wcmVwYXJlX3BhZ2VzKHByZXBhcmVkX3BhZ2VzLCBudW1fcGFnZXMpOworCXJldHVybiByZXM7CiB9CiAKIC8qIFdyaXRlIEBjb3VudCBieXRlcyBhdCBwb3NpdGlvbiBAcHBvcyBpbiBhIGZpbGUgaW5kaWNhdGVkIGJ5IEBmaWxlCkBAIC0xMTQ4LDI2MiArMTI2NSwzMDUgQEAKICAgIEZ1dHVyZSBGZWF0dXJlczogcHJvdmlkaW5nIHNlYXJjaF9ieV9rZXkgd2l0aCBoaW50cy4KIAogKi8KLXN0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2ZpbGVfd3JpdGUoIHN0cnVjdCBmaWxlICpmaWxlLCAvKiB0aGUgZmlsZSB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCAvKiAgcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIGRhdGEKLShpbiB1c2Vyc3BhY2UpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcHBvcyAvKiBwb2ludGVyIHRvIHBvc2l0aW9uIGluIGZpbGUgdGhhdCB3ZSBzdGFydCB3cml0aW5nIGF0LiBTaG91bGQgYmUgdXBkYXRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmV3IGN1cnJlbnQgcG9zaXRpb24gYmVmb3JlIHJldHVybmluZy4gKi8gKQorc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwJLyogdGhlIGZpbGUgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIGludG8gKi8KKwkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwJLyogIHBvaW50ZXIgdG8gdXNlciBzdXBwbGllZCBkYXRhCisJCQkJCQkJCSAgIChpbiB1c2Vyc3BhY2UpICovCisJCQkJICAgc2l6ZV90IGNvdW50LAkvKiBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCQkgICBsb2ZmX3QgKiBwcG9zCS8qIHBvaW50ZXIgdG8gcG9zaXRpb24gaW4gZmlsZSB0aGF0IHdlIHN0YXJ0IHdyaXRpbmcgYXQuIFNob3VsZCBiZSB1cGRhdGVkIHRvCisJCQkJCQkJICogbmV3IGN1cnJlbnQgcG9zaXRpb24gYmVmb3JlIHJldHVybmluZy4gKi8KKwkJCQkgICApCiB7Ci0gICAgc2l6ZV90IGFscmVhZHlfd3JpdHRlbiA9IDA7IC8vIE51bWJlciBvZiBieXRlcyBhbHJlYWR5IHdyaXR0ZW4gdG8gdGhlIGZpbGUuCi0gICAgbG9mZl90IHBvczsgLy8gQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KLSAgICBzc2l6ZV90IHJlczsgLy8gcmV0dXJuIHZhbHVlIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgd2UgY2FsbC4KLSAgICBpbnQgZXJyID0gMDsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7IC8vIElub2RlIG9mIHRoZSBmaWxlIHRoYXQgd2UgYXJlIHdyaXRpbmcgdG8uCi0JCQkJLyogVG8gc2ltcGxpZnkgY29kaW5nIGF0IHRoaXMgdGltZSwgd2Ugc3RvcmUKLQkJCQkgICBsb2NrZWQgcGFnZXMgaW4gYXJyYXkgZm9yIG5vdyAqLwotICAgIHN0cnVjdCBwYWdlICogcHJlcGFyZWRfcGFnZXNbUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FXTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIHRoLnRfdHJhbnNfaWQgPSAwOworCXNpemVfdCBhbHJlYWR5X3dyaXR0ZW4gPSAwOwkvLyBOdW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSB3cml0dGVuIHRvIHRoZSBmaWxlLgorCWxvZmZfdCBwb3M7CQkvLyBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBmaWxlLgorCXNzaXplX3QgcmVzOwkJLy8gcmV0dXJuIHZhbHVlIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgd2UgY2FsbC4KKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CS8vIElub2RlIG9mIHRoZSBmaWxlIHRoYXQgd2UgYXJlIHdyaXRpbmcgdG8uCisJLyogVG8gc2ltcGxpZnkgY29kaW5nIGF0IHRoaXMgdGltZSwgd2Ugc3RvcmUKKwkgICBsb2NrZWQgcGFnZXMgaW4gYXJyYXkgZm9yIG5vdyAqLworCXN0cnVjdCBwYWdlICpwcmVwYXJlZF9wYWdlc1tSRUlTRVJGU19XUklURV9QQUdFU19BVF9BX1RJTUVdOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJdGgudF90cmFuc19pZCA9IDA7CiAKLSAgICBpZiAoIGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgeyAvLyBEaXJlY3QgSU8gbmVlZHMgdHJlYXRtZW50Ci0Jc3NpemVfdCByZXN1bHQsIGFmdGVyX2ZpbGVfZW5kID0gMDsKLQlpZiAoICgqcHBvcyArIGNvdW50ID49IGlub2RlLT5pX3NpemUpIHx8IChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpICkgewotCSAgICAvKiBJZiB3ZSBhcmUgYXBwZW5kaW5nIGEgZmlsZSwgd2UgbmVlZCB0byBwdXQgdGhpcyBzYXZlbGluayBpbiBoZXJlLgotCSAgICAgICBJZiB3ZSB3aWxsIGNyYXNoIHdoaWxlIGRvaW5nIGRpcmVjdCBpbywgZmluaXNoX3VuZmluaXNoZWQgd2lsbAotCSAgICAgICBjdXQgdGhlIGdhcmJhZ2UgZnJvbSB0aGUgZmlsZSBlbmQuICovCi0JICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCSAgICBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCApOwotICAgICAgICAgICAgaWYgKGVycikgewotCQlyZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKLQkJcmV0dXJuIGVycjsKLQkgICAgfQotCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwotCSAgICBhZGRfc2F2ZV9saW5rICgmdGgsIGlub2RlLCAxIC8qIFRydW5jYXRlICovKTsKLQkgICAgYWZ0ZXJfZmlsZV9lbmQgPSAxOwotCSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCApOwotICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQkgICAgaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQl9Ci0JcmVzdWx0ID0gZ2VuZXJpY19maWxlX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsJLy8gRGlyZWN0IElPIG5lZWRzIHRyZWF0bWVudAorCQlzc2l6ZV90IHJlc3VsdCwgYWZ0ZXJfZmlsZV9lbmQgPSAwOworCQlpZiAoKCpwcG9zICsgY291bnQgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJICAgIHx8IChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpKSB7CisJCQkvKiBJZiB3ZSBhcmUgYXBwZW5kaW5nIGEgZmlsZSwgd2UgbmVlZCB0byBwdXQgdGhpcyBzYXZlbGluayBpbiBoZXJlLgorCQkJICAgSWYgd2Ugd2lsbCBjcmFzaCB3aGlsZSBkb2luZyBkaXJlY3QgaW8sIGZpbmlzaF91bmZpbmlzaGVkIHdpbGwKKwkJCSAgIGN1dCB0aGUgZ2FyYmFnZSBmcm9tIHRoZSBmaWxlIGVuZC4gKi8KKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCQkJZXJyID0KKwkJCSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsCisJCQkJCSAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCQkJaWYgKGVycikgeworCQkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJCQlhZGRfc2F2ZV9saW5rKCZ0aCwgaW5vZGUsIDEgLyogVHJ1bmNhdGUgKi8gKTsKKwkJCWFmdGVyX2ZpbGVfZW5kID0gMTsKKwkJCWVyciA9CisJCQkgICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwKKwkJCQkJSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CiAKLQlpZiAoIGFmdGVyX2ZpbGVfZW5kICkgeyAvKiBOb3cgdXBkYXRlIGlfc2l6ZSBhbmQgcmVtb3ZlIHRoZSBzYXZlbGluayAqLwotCSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotCSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkgICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAxKTsKLSAgICAgICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwotCSAgICByZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7Ci0JICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOwotICAgICAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0JICAgIGVyciA9IHJlbW92ZV9zYXZlX2xpbmsgKGlub2RlLCAxLyogdHJ1bmNhdGUgKi8pOwotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCQlpZiAoYWZ0ZXJfZmlsZV9lbmQpIHsJLyogTm93IHVwZGF0ZSBpX3NpemUgYW5kIHJlbW92ZSB0aGUgc2F2ZWxpbmsgKi8KKwkJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisJCQlpZiAoZXJyKSB7CisJCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwkJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCQkJaWYgKGVycikgeworCQkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCWVyciA9IHJlbW92ZV9zYXZlX2xpbmsoaW5vZGUsIDEgLyogdHJ1bmNhdGUgKi8gKTsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJldHVybiByZXN1bHQ7Ci0gICAgfQorCWlmICh1bmxpa2VseSgoc3NpemVfdCkgY291bnQgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoIHVubGlrZWx5KChzc2l6ZV90KSBjb3VudCA8IDAgKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZiwgY291bnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKLSAgICBpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwlkb3duKCZpbm9kZS0+aV9zZW0pOwkvLyBsb2NrcyB0aGUgZW50aXJlIGZpbGUgZm9yIGp1c3QgdXMKIAotICAgIGRvd24oJmlub2RlLT5pX3NlbSk7IC8vIGxvY2tzIHRoZSBlbnRpcmUgZmlsZSBmb3IganVzdCB1cworCXBvcyA9ICpwcG9zOwogCi0gICAgcG9zID0gKnBwb3M7CisJLyogQ2hlY2sgaWYgd2UgY2FuIHdyaXRlIHRvIHNwZWNpZmllZCByZWdpb24gb2YgZmlsZSwgZmlsZQorCSAgIGlzIG5vdCBvdmVybHkgYmlnIGFuZCB0aGlzIGtpbmQgb2Ygc3R1ZmYuIEFkanVzdCBwb3MgYW5kCisJICAgY291bnQsIGlmIG5lZWRlZCAqLworCXJlcyA9IGdlbmVyaWNfd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgMCk7CisJaWYgKHJlcykKKwkJZ290byBvdXQ7CiAKLSAgICAvKiBDaGVjayBpZiB3ZSBjYW4gd3JpdGUgdG8gc3BlY2lmaWVkIHJlZ2lvbiBvZiBmaWxlLCBmaWxlCi0gICAgICAgaXMgbm90IG92ZXJseSBiaWcgYW5kIHRoaXMga2luZCBvZiBzdHVmZi4gQWRqdXN0IHBvcyBhbmQKLSAgICAgICBjb3VudCwgaWYgbmVlZGVkICovCi0gICAgcmVzID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJnBvcywgJmNvdW50LCAwKTsKLSAgICBpZiAocmVzKQotCWdvdG8gb3V0OworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIG91dDsKIAotICAgIGlmICggY291bnQgPT0gMCApCi0JZ290byBvdXQ7CisJcmVzID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OwogCi0gICAgcmVzID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOwotICAgIGlmIChyZXMpCi0JZ290byBvdXQ7CisJaW5vZGVfdXBkYXRlX3RpbWUoaW5vZGUsIDEpOwkvKiBCb3RoIG10aW1lIGFuZCBjdGltZSAqLwogCi0gICAgaW5vZGVfdXBkYXRlX3RpbWUoaW5vZGUsIDEpOyAvKiBCb3RoIG10aW1lIGFuZCBjdGltZSAqLworCS8vIE9rLCB3ZSBhcmUgZG9uZSB3aXRoIGFsbCB0aGUgY2hlY2tzLgogCi0gICAgLy8gT2ssIHdlIGFyZSBkb25lIHdpdGggYWxsIHRoZSBjaGVja3MuCisJLy8gTm93IHdlIHNob3VsZCBzdGFydCByZWFsIHdvcmsKIAotICAgIC8vIE5vdyB3ZSBzaG91bGQgc3RhcnQgcmVhbCB3b3JrCisJLyogSWYgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIHBhc3QgdGhlIGZpbGUncyBwYWNrZWQgdGFpbCBvciBpZiB3ZSBhcmUgZ29pbmcKKwkgICB0byBvdmVyd3JpdGUgcGFydCBvZiB0aGUgdGFpbCwgd2UgbmVlZCB0aGF0IHRhaWwgdG8gYmUgY29udmVydGVkIGludG8KKwkgICB1bmZvcm1hdHRlZCBub2RlICovCisJcmVzID0gcmVpc2VyZnNfY2hlY2tfZm9yX3RhaWxfYW5kX2NvbnZlcnQoaW5vZGUsIHBvcywgY291bnQpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OwogCi0gICAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIHBhc3QgdGhlIGZpbGUncyBwYWNrZWQgdGFpbCBvciBpZiB3ZSBhcmUgZ29pbmcKLSAgICAgICB0byBvdmVyd3JpdGUgcGFydCBvZiB0aGUgdGFpbCwgd2UgbmVlZCB0aGF0IHRhaWwgdG8gYmUgY29udmVydGVkIGludG8KLSAgICAgICB1bmZvcm1hdHRlZCBub2RlICovCi0gICAgcmVzID0gcmVpc2VyZnNfY2hlY2tfZm9yX3RhaWxfYW5kX2NvbnZlcnQoIGlub2RlLCBwb3MsIGNvdW50KTsKLSAgICBpZiAocmVzKQotCWdvdG8gb3V0OworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLyogVGhpcyBpcyB0aGUgbWFpbiBsb29wIGluIHdoaWNoIHdlIHJ1bm5pbmcgdW50aWwgc29tZSBlcnJvciBvY2N1cmVzCisJCSAgIG9yIHVudGlsIHdlIHdyaXRlIGFsbCBvZiB0aGUgZGF0YS4gKi8KKwkJc2l6ZV90IG51bV9wYWdlczsJLyogYW1vdW50IG9mIHBhZ2VzIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0aGlzIGl0ZXJhdGlvbiAqLworCQlzaXplX3Qgd3JpdGVfYnl0ZXM7CS8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSBkdXJpbmcgdGhpcyBpdGVyYXRpb24gKi8KKwkJc2l6ZV90IGJsb2Nrc190b19hbGxvY2F0ZTsJLyogaG93IG11Y2ggYmxvY2tzIHdlIG5lZWQgdG8gYWxsb2NhdGUgZm9yIHRoaXMgaXRlcmF0aW9uICovCiAKLSAgICB3aGlsZSAoIGNvdW50ID4gMCkgewotCS8qIFRoaXMgaXMgdGhlIG1haW4gbG9vcCBpbiB3aGljaCB3ZSBydW5uaW5nIHVudGlsIHNvbWUgZXJyb3Igb2NjdXJlcwotCSAgIG9yIHVudGlsIHdlIHdyaXRlIGFsbCBvZiB0aGUgZGF0YS4gKi8KLQlzaXplX3QgbnVtX3BhZ2VzOy8qIGFtb3VudCBvZiBwYWdlcyB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdGhpcyBpdGVyYXRpb24gKi8KLQlzaXplX3Qgd3JpdGVfYnl0ZXM7IC8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSBkdXJpbmcgdGhpcyBpdGVyYXRpb24gKi8KLQlzaXplX3QgYmxvY2tzX3RvX2FsbG9jYXRlOyAvKiBob3cgbXVjaCBibG9ja3Mgd2UgbmVlZCB0byBhbGxvY2F0ZSBmb3IgdGhpcyBpdGVyYXRpb24gKi8KLSAgICAgICAgCi0gICAgICAgIC8qICAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkgaXMgYW4gaWRpb20gZm9yIG9mZnNldCBpbnRvIGEgcGFnZSBvZiBwb3MqLwotCW51bV9wYWdlcyA9ICEhKChwb3MrY291bnQpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIC8qIHJvdW5kIHVwIHBhcnRpYWwKLQkJCQkJCQkgIHBhZ2VzICovCi0JCSAgICAoKGNvdW50ICsgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpKSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsgCi0JCQkJCQkvKiBjb252ZXJ0IHNpemUgdG8gYW1vdW50IG9mCi0JCQkJCQkgICBwYWdlcyAqLwotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICggbnVtX3BhZ2VzID4gUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FIAotCQl8fCBudW1fcGFnZXMgPiByZWlzZXJmc19jYW5fZml0X3BhZ2VzKGlub2RlLT5pX3NiKSApIHsKLQkgICAgLyogSWYgd2Ugd2VyZSBhc2tlZCB0byB3cml0ZSBtb3JlIGRhdGEgdGhhbiB3ZSB3YW50IHRvIG9yIGlmIHRoZXJlCi0JICAgICAgIGlzIG5vdCB0aGF0IG11Y2ggc3BhY2UsIHRoZW4gd2Ugc2hvcnRlbiBhbW91bnQgb2YgZGF0YSB0byB3cml0ZQotCSAgICAgICBmb3IgdGhpcyBpdGVyYXRpb24uICovCi0JICAgIG51bV9wYWdlcyA9IG1pbl90KHNpemVfdCwgUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FLCByZWlzZXJmc19jYW5fZml0X3BhZ2VzKGlub2RlLT5pX3NiKSk7Ci0JICAgIC8qIEFsc28gd2Ugc2hvdWxkIG5vdCBmb3JnZXQgdG8gc2V0IHNpemUgaW4gYnl0ZXMgYWNjb3JkaW5nbHkgKi8KLQkgICAgd3JpdGVfYnl0ZXMgPSAobnVtX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQpIC0gCi0JCQkgICAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpOwotCQkJCQkgLyogSWYgcG9zaXRpb24gaXMgbm90IG9uIHRoZQotCQkJCQkgICAgc3RhcnQgb2YgdGhlIHBhZ2UsIHdlIG5lZWQKLQkJCQkJICAgIHRvIHN1YnN0cmFjdCB0aGUgb2Zmc2V0Ci0JCQkJCSAgICB3aXRoaW4gcGFnZSAqLwotCX0gZWxzZQotCSAgICB3cml0ZV9ieXRlcyA9IGNvdW50OworCQkvKiAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpIGlzIGFuIGlkaW9tIGZvciBvZmZzZXQgaW50byBhIHBhZ2Ugb2YgcG9zICovCisJCW51bV9wYWdlcyA9ICEhKChwb3MgKyBjb3VudCkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsJLyogcm91bmQgdXAgcGFydGlhbAorCQkJCQkJCQkJICAgcGFnZXMgKi8KKwkJICAgICgoY291bnQgKworCQkgICAgICAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCS8qIGNvbnZlcnQgc2l6ZSB0byBhbW91bnQgb2YKKwkJICAgcGFnZXMgKi8KKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmIChudW1fcGFnZXMgPiBSRUlTRVJGU19XUklURV9QQUdFU19BVF9BX1RJTUUKKwkJICAgIHx8IG51bV9wYWdlcyA+IHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoaW5vZGUtPmlfc2IpKSB7CisJCQkvKiBJZiB3ZSB3ZXJlIGFza2VkIHRvIHdyaXRlIG1vcmUgZGF0YSB0aGFuIHdlIHdhbnQgdG8gb3IgaWYgdGhlcmUKKwkJCSAgIGlzIG5vdCB0aGF0IG11Y2ggc3BhY2UsIHRoZW4gd2Ugc2hvcnRlbiBhbW91bnQgb2YgZGF0YSB0byB3cml0ZQorCQkJICAgZm9yIHRoaXMgaXRlcmF0aW9uLiAqLworCQkJbnVtX3BhZ2VzID0KKwkJCSAgICBtaW5fdChzaXplX3QsIFJFSVNFUkZTX1dSSVRFX1BBR0VTX0FUX0FfVElNRSwKKwkJCQkgIHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoaW5vZGUtPmlfc2IpKTsKKwkJCS8qIEFsc28gd2Ugc2hvdWxkIG5vdCBmb3JnZXQgdG8gc2V0IHNpemUgaW4gYnl0ZXMgYWNjb3JkaW5nbHkgKi8KKwkJCXdyaXRlX2J5dGVzID0gKG51bV9wYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUKSAtCisJCQkgICAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisJCQkvKiBJZiBwb3NpdGlvbiBpcyBub3Qgb24gdGhlCisJCQkgICBzdGFydCBvZiB0aGUgcGFnZSwgd2UgbmVlZAorCQkJICAgdG8gc3Vic3RyYWN0IHRoZSBvZmZzZXQKKwkJCSAgIHdpdGhpbiBwYWdlICovCisJCX0gZWxzZQorCQkJd3JpdGVfYnl0ZXMgPSBjb3VudDsKIAotCS8qIHJlc2VydmUgdGhlIGJsb2NrcyB0byBiZSBhbGxvY2F0ZWQgbGF0ZXIsIHNvIHRoYXQgbGF0ZXIgb24KLQkgICB3ZSBzdGlsbCBoYXZlIHRoZSBzcGFjZSB0byB3cml0ZSB0aGUgYmxvY2tzIHRvICovCi0JcmVpc2VyZnNfY2xhaW1fYmxvY2tzX3RvX2JlX2FsbG9jYXRlZChpbm9kZS0+aV9zYiwgbnVtX3BhZ2VzIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cykpOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCS8qIHJlc2VydmUgdGhlIGJsb2NrcyB0byBiZSBhbGxvY2F0ZWQgbGF0ZXIsIHNvIHRoYXQgbGF0ZXIgb24KKwkJICAgd2Ugc3RpbGwgaGF2ZSB0aGUgc3BhY2UgdG8gd3JpdGUgdGhlIGJsb2NrcyB0byAqLworCQlyZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKGlub2RlLT5pX3NiLAorCQkJCQkJICAgICAgbnVtX3BhZ2VzIDw8CisJCQkJCQkgICAgICAoUEFHRV9DQUNIRV9TSElGVCAtCisJCQkJCQkgICAgICAgaW5vZGUtPmlfYmxrYml0cykpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCi0JaWYgKCAhbnVtX3BhZ2VzICkgeyAvKiBJZiB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggc3BhY2UgZXZlbiBmb3IgYSBzaW5nbGUgcGFnZS4uLiAqLwotCSAgICBpZiAoIHBvcyA+IGlub2RlLT5pX3NpemUraW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLShwb3MgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLTEpKSkgewotCQlyZXMgPSAtRU5PU1BDOwotCQlicmVhazsgLy8gSW4gY2FzZSB3ZSBhcmUgd3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGxhc3QgZmlsZSBibG9jaywgYnJlYWsuCi0JICAgIH0KLQkgICAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBwb3NzaWJseSBvdmVyd3JpdGluZyB0aGUgZmlsZSwgc28KLQkgICAgLy8gbGV0J3Mgc2V0IHdyaXRlIHNpemUgdG8gYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGJsb2Nrc2l6ZS4KLQkgICAgLy8gVGhpcyB3YXkgd2UgZ2V0IGl0IGNvcnJlY3RseSBmb3IgZmlsZSBob2xlcy4KLQkgICAgLy8gQnV0IG92ZXJ3cml0aW5nIGZpbGVzIG9uIGFic29sdXRlbGx5IGZ1bGwgdm9sdW1lcyB3b3VsZCBub3QKLQkgICAgLy8gYmUgdmVyeSBlZmZpY2llbnQuIFdlbGwsIHBlb3BsZSBhcmUgbm90IHN1cHBvc2VkIHRvIGZpbGwKLQkgICAgLy8gMTAwJSBvZiBkaXNrIHNwYWNlIGFueXdheS4KLQkgICAgd3JpdGVfYnl0ZXMgPSBtaW5fdChzaXplX3QsIGNvdW50LCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAocG9zICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSk7Ci0JICAgIG51bV9wYWdlcyA9IDE7Ci0JICAgIC8vIE5vIGJsb2NrcyB3ZXJlIGNsYWltZWQgYmVmb3JlLCBzbyBkbyBpdCBub3cuCi0JICAgIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoaW5vZGUtPmlfc2IsIDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKSk7Ci0JfQorCQlpZiAoIW51bV9wYWdlcykgewkvKiBJZiB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggc3BhY2UgZXZlbiBmb3IgYSBzaW5nbGUgcGFnZS4uLiAqLworCQkJaWYgKHBvcyA+CisJCQkgICAgaW5vZGUtPmlfc2l6ZSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCQkgICAgKHBvcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkpIHsKKwkJCQlyZXMgPSAtRU5PU1BDOworCQkJCWJyZWFrOwkvLyBJbiBjYXNlIHdlIGFyZSB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGFzdCBmaWxlIGJsb2NrLCBicmVhay4KKwkJCX0KKwkJCS8vIE90aGVyd2lzZSB3ZSBhcmUgcG9zc2libHkgb3ZlcndyaXRpbmcgdGhlIGZpbGUsIHNvCisJCQkvLyBsZXQncyBzZXQgd3JpdGUgc2l6ZSB0byBiZSBlcXVhbCBvciBsZXNzIHRoYW4gYmxvY2tzaXplLgorCQkJLy8gVGhpcyB3YXkgd2UgZ2V0IGl0IGNvcnJlY3RseSBmb3IgZmlsZSBob2xlcy4KKwkJCS8vIEJ1dCBvdmVyd3JpdGluZyBmaWxlcyBvbiBhYnNvbHV0ZWxseSBmdWxsIHZvbHVtZXMgd291bGQgbm90CisJCQkvLyBiZSB2ZXJ5IGVmZmljaWVudC4gV2VsbCwgcGVvcGxlIGFyZSBub3Qgc3VwcG9zZWQgdG8gZmlsbAorCQkJLy8gMTAwJSBvZiBkaXNrIHNwYWNlIGFueXdheS4KKwkJCXdyaXRlX2J5dGVzID0KKwkJCSAgICBtaW5fdChzaXplX3QsIGNvdW50LAorCQkJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KKwkJCQkgIChwb3MgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpKTsKKwkJCW51bV9wYWdlcyA9IDE7CisJCQkvLyBObyBibG9ja3Mgd2VyZSBjbGFpbWVkIGJlZm9yZSwgc28gZG8gaXQgbm93LgorCQkJcmVpc2VyZnNfY2xhaW1fYmxvY2tzX3RvX2JlX2FsbG9jYXRlZChpbm9kZS0+aV9zYiwKKwkJCQkJCQkgICAgICAxIDw8CisJCQkJCQkJICAgICAgKFBBR0VfQ0FDSEVfU0hJRlQKKwkJCQkJCQkgICAgICAgLQorCQkJCQkJCSAgICAgICBpbm9kZS0+CisJCQkJCQkJICAgICAgIGlfYmxrYml0cykpOworCQl9CiAKLQkvKiBQcmVwYXJlIGZvciB3cml0aW5nIGludG8gdGhlIHJlZ2lvbiwgcmVhZCBpbiBhbGwgdGhlCi0JICAgcGFydGlhbGx5IG92ZXJ3cml0dGVuIHBhZ2VzLCBpZiBuZWVkZWQuIEFuZCBsb2NrIHRoZSBwYWdlcywKLQkgICBzbyB0aGF0IG5vYm9keSBlbHNlIGNhbiBhY2Nlc3MgdGhlc2UgdW50aWwgd2UgYXJlIGRvbmUuCi0JICAgV2UgZ2V0IG51bWJlciBvZiBhY3R1YWwgYmxvY2tzIG5lZWRlZCBhcyBhIHJlc3VsdC4qLwotCWJsb2Nrc190b19hbGxvY2F0ZSA9IHJlaXNlcmZzX3ByZXBhcmVfZmlsZV9yZWdpb25fZm9yX3dyaXRlKGlub2RlLCBwb3MsIG51bV9wYWdlcywgd3JpdGVfYnl0ZXMsIHByZXBhcmVkX3BhZ2VzKTsKLQlpZiAoIGJsb2Nrc190b19hbGxvY2F0ZSA8IDAgKSB7Ci0JICAgIHJlcyA9IGJsb2Nrc190b19hbGxvY2F0ZTsKLQkgICAgcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgbnVtX3BhZ2VzIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cykpOwotCSAgICBicmVhazsKLQl9CisJCS8qIFByZXBhcmUgZm9yIHdyaXRpbmcgaW50byB0aGUgcmVnaW9uLCByZWFkIGluIGFsbCB0aGUKKwkJICAgcGFydGlhbGx5IG92ZXJ3cml0dGVuIHBhZ2VzLCBpZiBuZWVkZWQuIEFuZCBsb2NrIHRoZSBwYWdlcywKKwkJICAgc28gdGhhdCBub2JvZHkgZWxzZSBjYW4gYWNjZXNzIHRoZXNlIHVudGlsIHdlIGFyZSBkb25lLgorCQkgICBXZSBnZXQgbnVtYmVyIG9mIGFjdHVhbCBibG9ja3MgbmVlZGVkIGFzIGEgcmVzdWx0LiAqLworCQlibG9ja3NfdG9fYWxsb2NhdGUgPQorCQkgICAgcmVpc2VyZnNfcHJlcGFyZV9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUoaW5vZGUsIHBvcywKKwkJCQkJCQkgICBudW1fcGFnZXMsCisJCQkJCQkJICAgd3JpdGVfYnl0ZXMsCisJCQkJCQkJICAgcHJlcGFyZWRfcGFnZXMpOworCQlpZiAoYmxvY2tzX3RvX2FsbG9jYXRlIDwgMCkgeworCQkJcmVzID0gYmxvY2tzX3RvX2FsbG9jYXRlOworCQkJcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKKwkJCQkJCQludW1fcGFnZXMgPDwKKwkJCQkJCQkoUEFHRV9DQUNIRV9TSElGVCAtCisJCQkJCQkJIGlub2RlLT5pX2Jsa2JpdHMpKTsKKwkJCWJyZWFrOworCQl9CiAKLQkvKiBGaXJzdCB3ZSBjb3JyZWN0IG91ciBlc3RpbWF0ZSBvZiBob3cgbWFueSBibG9ja3Mgd2UgbmVlZCAqLwotCXJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsIChudW1fcGFnZXMgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpIC0gYmxvY2tzX3RvX2FsbG9jYXRlICk7CisJCS8qIEZpcnN0IHdlIGNvcnJlY3Qgb3VyIGVzdGltYXRlIG9mIGhvdyBtYW55IGJsb2NrcyB3ZSBuZWVkICovCisJCXJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsCisJCQkJCQkobnVtX3BhZ2VzIDw8CisJCQkJCQkgKFBBR0VfQ0FDSEVfU0hJRlQgLQorCQkJCQkJICBpbm9kZS0+aV9zYi0+CisJCQkJCQkgIHNfYmxvY2tzaXplX2JpdHMpKSAtCisJCQkJCQlibG9ja3NfdG9fYWxsb2NhdGUpOwogCi0JaWYgKCBibG9ja3NfdG9fYWxsb2NhdGUgPiAwKSB7LypXZSBvbmx5IGFsbG9jYXRlIGJsb2NrcyBpZiB3ZSBuZWVkIHRvKi8KLQkgICAgLyogRmlsbCBpbiBhbGwgdGhlIHBvc3NpYmxlIGhvbGVzIGFuZCBhcHBlbmQgdGhlIGZpbGUgaWYgbmVlZGVkICovCi0JICAgIHJlcyA9IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2Nrc19mb3JfcmVnaW9uKCZ0aCwgaW5vZGUsIHBvcywgbnVtX3BhZ2VzLCB3cml0ZV9ieXRlcywgcHJlcGFyZWRfcGFnZXMsIGJsb2Nrc190b19hbGxvY2F0ZSk7Ci0JfQorCQlpZiAoYmxvY2tzX3RvX2FsbG9jYXRlID4gMCkgewkvKldlIG9ubHkgYWxsb2NhdGUgYmxvY2tzIGlmIHdlIG5lZWQgdG8gKi8KKwkJCS8qIEZpbGwgaW4gYWxsIHRoZSBwb3NzaWJsZSBob2xlcyBhbmQgYXBwZW5kIHRoZSBmaWxlIGlmIG5lZWRlZCAqLworCQkJcmVzID0KKwkJCSAgICByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja3NfZm9yX3JlZ2lvbigmdGgsIGlub2RlLCBwb3MsCisJCQkJCQkJCW51bV9wYWdlcywKKwkJCQkJCQkJd3JpdGVfYnl0ZXMsCisJCQkJCQkJCXByZXBhcmVkX3BhZ2VzLAorCQkJCQkJCQlibG9ja3NfdG9fYWxsb2NhdGUpOworCQl9CiAKLQkvKiB3ZWxsLCB3ZSBoYXZlIGFsbG9jYXRlZCB0aGUgYmxvY2tzLCBzbyBpdCBpcyB0aW1lIHRvIGZyZWUKLQkgICB0aGUgcmVzZXJ2YXRpb24gd2UgbWFkZSBlYXJsaWVyLiAqLwotCXJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsIGJsb2Nrc190b19hbGxvY2F0ZSk7Ci0JaWYgKCByZXMgKSB7Ci0JICAgIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKLQkgICAgYnJlYWs7Ci0JfQorCQkvKiB3ZWxsLCB3ZSBoYXZlIGFsbG9jYXRlZCB0aGUgYmxvY2tzLCBzbyBpdCBpcyB0aW1lIHRvIGZyZWUKKwkJICAgdGhlIHJlc2VydmF0aW9uIHdlIG1hZGUgZWFybGllci4gKi8KKwkJcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKKwkJCQkJCWJsb2Nrc190b19hbGxvY2F0ZSk7CisJCWlmIChyZXMpIHsKKwkJCXJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKKwkJCWJyZWFrOworCQl9CiAKIC8qIE5PVEUgdGhhdCBhbGxvY2F0aW5nIGJsb2NrcyBhbmQgZmlsbGluZyBibG9ja3MgY2FuIGJlIGRvbmUgaW4gcmV2ZXJzZSBvcmRlcgogICAgYW5kIHByb2JhYmx5IHdlIHdvdWxkIGRvIHRoYXQganVzdCB0byBnZXQgcmlkIG9mIGdhcmJhZ2UgaW4gZmlsZXMgYWZ0ZXIgYQogICAgY3Jhc2ggKi8KIAotCS8qIENvcHkgZGF0YSBmcm9tIHVzZXItc3VwcGxpZWQgYnVmZmVyIHRvIGZpbGUncyBwYWdlcyAqLwotCXJlcyA9IHJlaXNlcmZzX2NvcHlfZnJvbV91c2VyX3RvX2ZpbGVfcmVnaW9uKHBvcywgbnVtX3BhZ2VzLCB3cml0ZV9ieXRlcywgcHJlcGFyZWRfcGFnZXMsIGJ1Zik7Ci0JaWYgKCByZXMgKSB7Ci0JICAgIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKLQkgICAgYnJlYWs7CisJCS8qIENvcHkgZGF0YSBmcm9tIHVzZXItc3VwcGxpZWQgYnVmZmVyIHRvIGZpbGUncyBwYWdlcyAqLworCQlyZXMgPQorCQkgICAgcmVpc2VyZnNfY29weV9mcm9tX3VzZXJfdG9fZmlsZV9yZWdpb24ocG9zLCBudW1fcGFnZXMsCisJCQkJCQkJICAgd3JpdGVfYnl0ZXMsCisJCQkJCQkJICAgcHJlcGFyZWRfcGFnZXMsIGJ1Zik7CisJCWlmIChyZXMpIHsKKwkJCXJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2VuZCB0aGUgcGFnZXMgdG8gZGlzayBhbmQgdW5sb2NrIHRoZW0uICovCisJCXJlcyA9CisJCSAgICByZWlzZXJmc19zdWJtaXRfZmlsZV9yZWdpb25fZm9yX3dyaXRlKCZ0aCwgaW5vZGUsIHBvcywKKwkJCQkJCQkgIG51bV9wYWdlcywKKwkJCQkJCQkgIHdyaXRlX2J5dGVzLAorCQkJCQkJCSAgcHJlcGFyZWRfcGFnZXMpOworCQlpZiAocmVzKQorCQkJYnJlYWs7CisKKwkJYWxyZWFkeV93cml0dGVuICs9IHdyaXRlX2J5dGVzOworCQlidWYgKz0gd3JpdGVfYnl0ZXM7CisJCSpwcG9zID0gcG9zICs9IHdyaXRlX2J5dGVzOworCQljb3VudCAtPSB3cml0ZV9ieXRlczsKKwkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChpbm9kZS0+aV9tYXBwaW5nKTsKIAl9CiAKLQkvKiBTZW5kIHRoZSBwYWdlcyB0byBkaXNrIGFuZCB1bmxvY2sgdGhlbS4gKi8KLQlyZXMgPSByZWlzZXJmc19zdWJtaXRfZmlsZV9yZWdpb25fZm9yX3dyaXRlKCZ0aCwgaW5vZGUsIHBvcywgbnVtX3BhZ2VzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnl0ZXMscHJlcGFyZWRfcGFnZXMpOwotCWlmICggcmVzICkKLQkgICAgYnJlYWs7CisJLyogdGhpcyBpcyBvbmx5IHRydWUgb24gZXJyb3IgKi8KKwlpZiAodGgudF90cmFuc19pZCkgeworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJZXJyID0gam91cm5hbF9lbmQoJnRoLCB0aC50X3N1cGVyLCB0aC50X2Jsb2Nrc19hbGxvY2F0ZWQpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlpZiAoZXJyKSB7CisJCQlyZXMgPSBlcnI7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KIAotCWFscmVhZHlfd3JpdHRlbiArPSB3cml0ZV9ieXRlczsKLQlidWYgKz0gd3JpdGVfYnl0ZXM7Ci0JKnBwb3MgPSBwb3MgKz0gd3JpdGVfYnl0ZXM7Ci0JY291bnQgLT0gd3JpdGVfYnl0ZXM7Ci0JYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChpbm9kZS0+aV9tYXBwaW5nKTsKLSAgICB9CisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkKKwkJcmVzID0KKwkJICAgIGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIGZpbGUtPmZfbWFwcGluZywKKwkJCQkJT1NZTkNfTUVUQURBVEEgfCBPU1lOQ19EQVRBKTsKIAotICAgIC8qIHRoaXMgaXMgb25seSB0cnVlIG9uIGVycm9yICovCi0gICAgaWYgKHRoLnRfdHJhbnNfaWQpIHsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgdGgudF9zdXBlciwgdGgudF9ibG9ja3NfYWxsb2NhdGVkKTsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgcmVzID0gZXJyOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmVpc2VyZnNfYXN5bmNfcHJvZ3Jlc3Nfd2FpdChpbm9kZS0+aV9zYik7CisJcmV0dXJuIChhbHJlYWR5X3dyaXR0ZW4gIT0gMCkgPyBhbHJlYWR5X3dyaXR0ZW4gOiByZXM7CiAKLSAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpIHx8IElTX1NZTkMoaW5vZGUpKQotCXJlcyA9IGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIGZpbGUtPmZfbWFwcGluZywgT1NZTkNfTUVUQURBVEF8T1NZTkNfREFUQSk7Ci0KLSAgICB1cCgmaW5vZGUtPmlfc2VtKTsKLSAgICByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gKGFscmVhZHlfd3JpdHRlbiAhPSAwKT9hbHJlYWR5X3dyaXR0ZW46cmVzOwotCi1vdXQ6Ci0gICAgdXAoJmlub2RlLT5pX3NlbSk7IC8vIHVubG9jayB0aGUgZmlsZSBvbiBleGl0LgotICAgIHJldHVybiByZXM7CisgICAgICBvdXQ6CisJdXAoJmlub2RlLT5pX3NlbSk7CS8vIHVubG9jayB0aGUgZmlsZSBvbiBleGl0LgorCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCiB7Ci0gICAgcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBidWYsIGNvdW50LCBwb3MpOwogfQogCi0KLQogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWlzZXJmc19maWxlX29wZXJhdGlvbnMgPSB7Ci0gICAgLnJlYWQJPSBnZW5lcmljX2ZpbGVfcmVhZCwKLSAgICAud3JpdGUJPSByZWlzZXJmc19maWxlX3dyaXRlLAotICAgIC5pb2N0bAk9IHJlaXNlcmZzX2lvY3RsLAotICAgIC5tbWFwCT0gZ2VuZXJpY19maWxlX21tYXAsCi0gICAgLnJlbGVhc2UJPSByZWlzZXJmc19maWxlX3JlbGVhc2UsCi0gICAgLmZzeW5jCT0gcmVpc2VyZnNfc3luY19maWxlLAotICAgIC5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKLSAgICAuYWlvX3JlYWQgICA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLSAgICAuYWlvX3dyaXRlICA9IHJlaXNlcmZzX2Fpb193cml0ZSwKKwkucmVhZCA9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZSA9IHJlaXNlcmZzX2ZpbGVfd3JpdGUsCisJLmlvY3RsID0gcmVpc2VyZnNfaW9jdGwsCisJLm1tYXAgPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkucmVsZWFzZSA9IHJlaXNlcmZzX2ZpbGVfcmVsZWFzZSwKKwkuZnN5bmMgPSByZWlzZXJmc19zeW5jX2ZpbGUsCisJLnNlbmRmaWxlID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorCS5haW9fcmVhZCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKwkuYWlvX3dyaXRlID0gcmVpc2VyZnNfYWlvX3dyaXRlLAogfTsKIAotCi1zdHJ1Y3QgIGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewotICAgIC50cnVuY2F0ZQk9IHJlaXNlcmZzX3Zmc190cnVuY2F0ZV9maWxlLAotICAgIC5zZXRhdHRyICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKLSAgICAuc2V0eGF0dHIgICA9IHJlaXNlcmZzX3NldHhhdHRyLAotICAgIC5nZXR4YXR0ciAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCi0gICAgLmxpc3R4YXR0ciAgPSByZWlzZXJmc19saXN0eGF0dHIsCi0gICAgLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCi0gICAgLnBlcm1pc3Npb24gPSByZWlzZXJmc19wZXJtaXNzaW9uLAorc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZSA9IHJlaXNlcmZzX3Zmc190cnVuY2F0ZV9maWxlLAorCS5zZXRhdHRyID0gcmVpc2VyZnNfc2V0YXR0ciwKKwkuc2V0eGF0dHIgPSByZWlzZXJmc19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSByZWlzZXJmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyID0gcmVpc2VyZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAorCS5wZXJtaXNzaW9uID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKIH07Ci0KLQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZml4X25vZGUuYyBiL2ZzL3JlaXNlcmZzL2ZpeF9ub2RlLmMKaW5kZXggZTRmNjRiZS4uMjcwNmUyYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZml4X25vZGUuYworKysgYi9mcy9yZWlzZXJmcy9maXhfbm9kZS5jCkBAIC0zNCwxNCArMzQsMTIgQEAKICAqKiAKICAqKi8KIAotCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIAotCiAvKiBUbyBtYWtlIGFueSBjaGFuZ2VzIGluIHRoZSB0cmVlIHdlIGZpbmQgYSBub2RlLCB0aGF0IGNvbnRhaW5zIGl0ZW0KICAgIHRvIGJlIGNoYW5nZWQvZGVsZXRlZCBvciBwb3NpdGlvbiBpbiB0aGUgbm9kZSB3ZSBpbnNlcnQgYSBuZXcgaXRlbQogICAgdG8uIFdlIGNhbGwgdGhpcyBub2RlIFMuIFRvIGRvIGJhbGFuY2luZyB3ZSBuZWVkIHRvIGRlY2lkZSB3aGF0IHdlCkBAIC01Niw0OTAgKzU0LDUyMiBAQAogICAgaGF2ZSB0byBoYXZlIGlmIHdlIGRvIG5vdCBhbnkgc2hpZnRpbmdzLCBpZiB3ZSBzaGlmdCB0byBsZWZ0L3JpZ2h0CiAgICBuZWlnaGJvciBvciB0byBib3RoLiAqLwogCi0KIC8qIHRha2luZyBpdGVtIG51bWJlciBpbiB2aXJ0dWFsIG5vZGUsIHJldHVybnMgbnVtYmVyIG9mIGl0ZW0sIHRoYXQgaXQgaGFzIGluIHNvdXJjZSBidWZmZXIgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG9sZF9pdGVtX251bSAoaW50IG5ld19udW0sIGludCBhZmZlY3RlZF9pdGVtX251bSwgaW50IG1vZGUpCitzdGF0aWMgaW5saW5lIGludCBvbGRfaXRlbV9udW0oaW50IG5ld19udW0sIGludCBhZmZlY3RlZF9pdGVtX251bSwgaW50IG1vZGUpCiB7Ci0gIGlmIChtb2RlID09IE1fUEFTVEUgfHwgbW9kZSA9PSBNX0NVVCB8fCBuZXdfbnVtIDwgYWZmZWN0ZWRfaXRlbV9udW0pCi0gICAgcmV0dXJuIG5ld19udW07CisJaWYgKG1vZGUgPT0gTV9QQVNURSB8fCBtb2RlID09IE1fQ1VUIHx8IG5ld19udW0gPCBhZmZlY3RlZF9pdGVtX251bSkKKwkJcmV0dXJuIG5ld19udW07CiAKLSAgaWYgKG1vZGUgPT0gTV9JTlNFUlQpIHsKKwlpZiAobW9kZSA9PSBNX0lOU0VSVCkgewogCi0gICAgUkZBTFNFKCBuZXdfbnVtID09IDAsIAotCSAgICAidnMtODAwNTogZm9yIElOU0VSVCBtb2RlIGFuZCBpdGVtIG51bWJlciBvZiBpbnNlcnRlZCBpdGVtIik7CisJCVJGQUxTRShuZXdfbnVtID09IDAsCisJCSAgICAgICAidnMtODAwNTogZm9yIElOU0VSVCBtb2RlIGFuZCBpdGVtIG51bWJlciBvZiBpbnNlcnRlZCBpdGVtIik7CiAKLSAgICByZXR1cm4gbmV3X251bSAtIDE7Ci0gIH0KKwkJcmV0dXJuIG5ld19udW0gLSAxOworCX0KIAotICBSRkFMU0UoIG1vZGUgIT0gTV9ERUxFVEUsCi0JICAidnMtODAxMDogb2xkX2l0ZW1fbnVtOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUgKG1vZGUgPSBcJyVjXCciLCBtb2RlKTsKLSAgLyogZGVsZXRlIG1vZGUgKi8KLSAgcmV0dXJuIG5ld19udW0gKyAxOworCVJGQUxTRShtb2RlICE9IE1fREVMRVRFLAorCSAgICAgICAidnMtODAxMDogb2xkX2l0ZW1fbnVtOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUgKG1vZGUgPSBcJyVjXCciLAorCSAgICAgICBtb2RlKTsKKwkvKiBkZWxldGUgbW9kZSAqLworCXJldHVybiBuZXdfbnVtICsgMTsKIH0KIAotc3RhdGljIHZvaWQgY3JlYXRlX3ZpcnR1YWxfbm9kZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3N0YXRpYyB2b2lkIGNyZWF0ZV92aXJ0dWFsX25vZGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gICAgaW50IG5ld19udW07Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogU2g7CS8qIHRoaXMgY29tZXMgZnJvbSB0Yi0+U1toXSAqLworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOworCWludCBuZXdfbnVtOworCXN0cnVjdCBidWZmZXJfaGVhZCAqU2g7CS8qIHRoaXMgY29tZXMgZnJvbSB0Yi0+U1toXSAqLwogCi0gICAgU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworCVNoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOwogCi0gICAgLyogc2l6ZSBvZiBjaGFuZ2VkIG5vZGUgKi8KLSAgICB2bi0+dm5fc2l6ZSA9IE1BWF9DSElMRF9TSVpFIChTaCkgLSBCX0ZSRUVfU1BBQ0UgKFNoKSArIHRiLT5pbnNlcnRfc2l6ZVtoXTsKKwkvKiBzaXplIG9mIGNoYW5nZWQgbm9kZSAqLworCXZuLT52bl9zaXplID0KKwkgICAgTUFYX0NISUxEX1NJWkUoU2gpIC0gQl9GUkVFX1NQQUNFKFNoKSArIHRiLT5pbnNlcnRfc2l6ZVtoXTsKIAotICAgIC8qIGZvciBpbnRlcm5hbCBub2RlcyBhcnJheSBpZiB2aXJ0dWFsIGl0ZW1zIGlzIG5vdCBjcmVhdGVkICovCi0gICAgaWYgKGgpIHsKLQl2bi0+dm5fbnJfaXRlbSA9ICh2bi0+dm5fc2l6ZSAtIERDX1NJWkUpIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIG51bWJlciBvZiBpdGVtcyBpbiB2aXJ0dWFsIG5vZGUgICovCi0gICAgdm4tPnZuX25yX2l0ZW0gPSBCX05SX0lURU1TIChTaCkgKyAoKHZuLT52bl9tb2RlID09IE1fSU5TRVJUKT8gMSA6IDApIC0gKCh2bi0+dm5fbW9kZSA9PSBNX0RFTEVURSk/IDEgOiAwKTsKLQotICAgIC8qIGZpcnN0IHZpcnR1YWwgaXRlbSAqLwotICAgIHZuLT52bl92aSA9IChzdHJ1Y3QgdmlydHVhbF9pdGVtICopKHRiLT50Yl92biArIDEpOwotICAgIG1lbXNldCAodm4tPnZuX3ZpLCAwLCB2bi0+dm5fbnJfaXRlbSAqIHNpemVvZiAoc3RydWN0IHZpcnR1YWxfaXRlbSkpOwotICAgIHZuLT52bl9mcmVlX3B0ciArPSB2bi0+dm5fbnJfaXRlbSAqIHNpemVvZiAoc3RydWN0IHZpcnR1YWxfaXRlbSk7Ci0KLQotICAgIC8qIGZpcnN0IGl0ZW0gaW4gdGhlIG5vZGUgKi8KLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChTaCwgMCk7Ci0KLSAgICAvKiBkZWZpbmUgdGhlIG1lcmdlYWJpbGl0eSBmb3IgMC10aCBpdGVtIChpZiBpdCBpcyBub3QgYmVpbmcgZGVsZXRlZCkgKi8KLSAgICBpZiAob3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIFNoLT5iX3NpemUpICYmICh2bi0+dm5fbW9kZSAhPSBNX0RFTEVURSB8fCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0pKQotCSAgICB2bi0+dm5fdmlbMF0udmlfdHlwZSB8PSBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFOwotCi0gICAgLyogZ28gdGhyb3VnaCBhbGwgaXRlbXMgdGhvc2UgcmVtYWluIGluIHRoZSB2aXJ0dWFsIG5vZGUgKGV4Y2VwdCBmb3IgdGhlIG5ldyAoaW5zZXJ0ZWQpIG9uZSkgKi8KLSAgICBmb3IgKG5ld19udW0gPSAwOyBuZXdfbnVtIDwgdm4tPnZuX25yX2l0ZW07IG5ld19udW0gKyspIHsKLQlpbnQgajsKLQlzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkgPSB2bi0+dm5fdmkgKyBuZXdfbnVtOwotCWludCBpc19hZmZlY3RlZCA9ICgobmV3X251bSAhPSB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0pID8gMCA6IDEpOwotICAgIAotCi0JaWYgKGlzX2FmZmVjdGVkICYmIHZuLT52bl9tb2RlID09IE1fSU5TRVJUKQotCSAgICBjb250aW51ZTsKLSAgICAKLQkvKiBnZXQgaXRlbSBudW1iZXIgaW4gc291cmNlIG5vZGUgKi8KLQlqID0gb2xkX2l0ZW1fbnVtIChuZXdfbnVtLCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0sIHZuLT52bl9tb2RlKTsKLSAgICAKLQl2aS0+dmlfaXRlbV9sZW4gKz0gaWhfaXRlbV9sZW4oaWggKyBqKSArIElIX1NJWkU7Ci0JdmktPnZpX2loID0gaWggKyBqOwotCXZpLT52aV9pdGVtID0gQl9JX1BJVEVNIChTaCwgaWggKyBqKTsKLQl2aS0+dmlfdWFyZWEgPSB2bi0+dm5fZnJlZV9wdHI7Ci0KLQkvLyBGSVhNRTogdGhlcmUgaXMgbm8gY2hlY2ssIHRoYXQgaXRlbSBvcGVyYXRpb24gZGlkIG5vdAotCS8vIGNvbnN1bWUgdG9vIG11Y2ggbWVtb3J5Ci0Jdm4tPnZuX2ZyZWVfcHRyICs9IG9wX2NyZWF0ZV92aSAodm4sIHZpLCBpc19hZmZlY3RlZCwgdGItPmluc2VydF9zaXplIFswXSk7Ci0JaWYgKHRiLT52bl9idWYgKyB0Yi0+dm5fYnVmX3NpemUgPCB2bi0+dm5fZnJlZV9wdHIpCi0JICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy04MDMwOiBjcmVhdGVfdmlydHVhbF9ub2RlOiAiCi0JCQkgICAgInZpcnR1YWwgbm9kZSBzcGFjZSBjb25zdW1lZCIpOwotCi0JaWYgKCFpc19hZmZlY3RlZCkKLQkgICAgLyogdGhpcyBpcyBub3QgYmVpbmcgY2hhbmdlZCAqLwotCSAgICBjb250aW51ZTsKLSAgICAKLQlpZiAodm4tPnZuX21vZGUgPT0gTV9QQVNURSB8fCB2bi0+dm5fbW9kZSA9PSBNX0NVVCkgewotCSAgICB2bi0+dm5fdmlbbmV3X251bV0udmlfaXRlbV9sZW4gKz0gdGItPmluc2VydF9zaXplWzBdOwotCSAgICB2aS0+dmlfbmV3X2RhdGEgPSB2bi0+dm5fZGF0YTsgLy8gcG9pbnRlciB0byBkYXRhIHdoaWNoIGlzIGdvaW5nIHRvIGJlIHBhc3RlZAorCS8qIGZvciBpbnRlcm5hbCBub2RlcyBhcnJheSBpZiB2aXJ0dWFsIGl0ZW1zIGlzIG5vdCBjcmVhdGVkICovCisJaWYgKGgpIHsKKwkJdm4tPnZuX25yX2l0ZW0gPSAodm4tPnZuX3NpemUgLSBEQ19TSVpFKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCQlyZXR1cm47CiAJfQotICAgIH0KIAotICAKLSAgICAvKiB2aXJ0dWFsIGluc2VydGVkIGl0ZW0gaXMgbm90IGRlZmluZWQgeWV0ICovCi0gICAgaWYgKHZuLT52bl9tb2RlID09IE1fSU5TRVJUKSB7Ci0Jc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpID0gdm4tPnZuX3ZpICsgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtOwotICAgICAgCi0JUkZBTFNFKCB2bi0+dm5faW5zX2loID09IDAsCi0JCSJ2cy04MDQwOiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtIGlzIG5vdCBzcGVjaWZpZWQiKTsKLQl2aS0+dmlfaXRlbV9sZW4gPSB0Yi0+aW5zZXJ0X3NpemVbMF07Ci0JdmktPnZpX2loID0gdm4tPnZuX2luc19paDsKLQl2aS0+dmlfaXRlbSA9IHZuLT52bl9kYXRhOwotCXZpLT52aV91YXJlYSA9IHZuLT52bl9mcmVlX3B0cjsKLQkKLQlvcF9jcmVhdGVfdmkgKHZuLCB2aSwgMC8qbm90IHBhc3RlZCBvciBjdXQqLywgdGItPmluc2VydF9zaXplIFswXSk7Ci0gICAgfQotICAKLSAgICAvKiBzZXQgcmlnaHQgbWVyZ2UgZmxhZyB3ZSB0YWtlIHJpZ2h0IGRlbGltaXRpbmcga2V5IGFuZCBjaGVjayB3aGV0aGVyIGl0IGlzIGEgbWVyZ2VhYmxlIGl0ZW0gKi8KLSAgICBpZiAodGItPkNGUlswXSkgewotCXN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXk7CisJLyogbnVtYmVyIG9mIGl0ZW1zIGluIHZpcnR1YWwgbm9kZSAgKi8KKwl2bi0+dm5fbnJfaXRlbSA9CisJICAgIEJfTlJfSVRFTVMoU2gpICsgKCh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCkgPyAxIDogMCkgLQorCSAgICAoKHZuLT52bl9tb2RlID09IE1fREVMRVRFKSA/IDEgOiAwKTsKIAotCWtleSA9IEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSk7Ci0JaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlIChrZXksIFNoLT5iX3NpemUpICYmICh2bi0+dm5fbW9kZSAhPSBNX0RFTEVURSB8fAotCQkJCQkJICAgICAgIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSAhPSBCX05SX0lURU1TIChTaCkgLSAxKSkKLQkJdm4tPnZuX3ZpW3ZuLT52bl9ucl9pdGVtLTFdLnZpX3R5cGUgfD0gVklfVFlQRV9SSUdIVF9NRVJHRUFCTEU7CisJLyogZmlyc3QgdmlydHVhbCBpdGVtICovCisJdm4tPnZuX3ZpID0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKikodGItPnRiX3ZuICsgMSk7CisJbWVtc2V0KHZuLT52bl92aSwgMCwgdm4tPnZuX25yX2l0ZW0gKiBzaXplb2Yoc3RydWN0IHZpcnR1YWxfaXRlbSkpOworCXZuLT52bl9mcmVlX3B0ciArPSB2bi0+dm5fbnJfaXRlbSAqIHNpemVvZihzdHJ1Y3QgdmlydHVhbF9pdGVtKTsKKworCS8qIGZpcnN0IGl0ZW0gaW4gdGhlIG5vZGUgKi8KKwlpaCA9IEJfTl9QSVRFTV9IRUFEKFNoLCAwKTsKKworCS8qIGRlZmluZSB0aGUgbWVyZ2VhYmlsaXR5IGZvciAwLXRoIGl0ZW0gKGlmIGl0IGlzIG5vdCBiZWluZyBkZWxldGVkKSAqLworCWlmIChvcF9pc19sZWZ0X21lcmdlYWJsZSgmKGloLT5paF9rZXkpLCBTaC0+Yl9zaXplKQorCSAgICAmJiAodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUgfHwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtKSkKKwkJdm4tPnZuX3ZpWzBdLnZpX3R5cGUgfD0gVklfVFlQRV9MRUZUX01FUkdFQUJMRTsKKworCS8qIGdvIHRocm91Z2ggYWxsIGl0ZW1zIHRob3NlIHJlbWFpbiBpbiB0aGUgdmlydHVhbCBub2RlIChleGNlcHQgZm9yIHRoZSBuZXcgKGluc2VydGVkKSBvbmUpICovCisJZm9yIChuZXdfbnVtID0gMDsgbmV3X251bSA8IHZuLT52bl9ucl9pdGVtOyBuZXdfbnVtKyspIHsKKwkJaW50IGo7CisJCXN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpID0gdm4tPnZuX3ZpICsgbmV3X251bTsKKwkJaW50IGlzX2FmZmVjdGVkID0KKwkJICAgICgobmV3X251bSAhPSB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0pID8gMCA6IDEpOworCisJCWlmIChpc19hZmZlY3RlZCAmJiB2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGdldCBpdGVtIG51bWJlciBpbiBzb3VyY2Ugbm9kZSAqLworCQlqID0gb2xkX2l0ZW1fbnVtKG5ld19udW0sIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSwKKwkJCQkgdm4tPnZuX21vZGUpOworCisJCXZpLT52aV9pdGVtX2xlbiArPSBpaF9pdGVtX2xlbihpaCArIGopICsgSUhfU0laRTsKKwkJdmktPnZpX2loID0gaWggKyBqOworCQl2aS0+dmlfaXRlbSA9IEJfSV9QSVRFTShTaCwgaWggKyBqKTsKKwkJdmktPnZpX3VhcmVhID0gdm4tPnZuX2ZyZWVfcHRyOworCisJCS8vIEZJWE1FOiB0aGVyZSBpcyBubyBjaGVjaywgdGhhdCBpdGVtIG9wZXJhdGlvbiBkaWQgbm90CisJCS8vIGNvbnN1bWUgdG9vIG11Y2ggbWVtb3J5CisJCXZuLT52bl9mcmVlX3B0ciArPQorCQkgICAgb3BfY3JlYXRlX3ZpKHZuLCB2aSwgaXNfYWZmZWN0ZWQsIHRiLT5pbnNlcnRfc2l6ZVswXSk7CisJCWlmICh0Yi0+dm5fYnVmICsgdGItPnZuX2J1Zl9zaXplIDwgdm4tPnZuX2ZyZWVfcHRyKQorCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCSAgICAgICAidnMtODAzMDogY3JlYXRlX3ZpcnR1YWxfbm9kZTogIgorCQkJCSAgICAgICAidmlydHVhbCBub2RlIHNwYWNlIGNvbnN1bWVkIik7CisKKwkJaWYgKCFpc19hZmZlY3RlZCkKKwkJCS8qIHRoaXMgaXMgbm90IGJlaW5nIGNoYW5nZWQgKi8KKwkJCWNvbnRpbnVlOworCisJCWlmICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFIHx8IHZuLT52bl9tb2RlID09IE1fQ1VUKSB7CisJCQl2bi0+dm5fdmlbbmV3X251bV0udmlfaXRlbV9sZW4gKz0gdGItPmluc2VydF9zaXplWzBdOworCQkJdmktPnZpX25ld19kYXRhID0gdm4tPnZuX2RhdGE7CS8vIHBvaW50ZXIgdG8gZGF0YSB3aGljaCBpcyBnb2luZyB0byBiZSBwYXN0ZWQKKwkJfQorCX0KKworCS8qIHZpcnR1YWwgaW5zZXJ0ZWQgaXRlbSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KKwlpZiAodm4tPnZuX21vZGUgPT0gTV9JTlNFUlQpIHsKKwkJc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkgPSB2bi0+dm5fdmkgKyB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW07CisKKwkJUkZBTFNFKHZuLT52bl9pbnNfaWggPT0gMCwKKwkJICAgICAgICJ2cy04MDQwOiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtIGlzIG5vdCBzcGVjaWZpZWQiKTsKKwkJdmktPnZpX2l0ZW1fbGVuID0gdGItPmluc2VydF9zaXplWzBdOworCQl2aS0+dmlfaWggPSB2bi0+dm5faW5zX2loOworCQl2aS0+dmlfaXRlbSA9IHZuLT52bl9kYXRhOworCQl2aS0+dmlfdWFyZWEgPSB2bi0+dm5fZnJlZV9wdHI7CisKKwkJb3BfY3JlYXRlX3ZpKHZuLCB2aSwgMCAvKm5vdCBwYXN0ZWQgb3IgY3V0ICovICwKKwkJCSAgICAgdGItPmluc2VydF9zaXplWzBdKTsKKwl9CisKKwkvKiBzZXQgcmlnaHQgbWVyZ2UgZmxhZyB3ZSB0YWtlIHJpZ2h0IGRlbGltaXRpbmcga2V5IGFuZCBjaGVjayB3aGV0aGVyIGl0IGlzIGEgbWVyZ2VhYmxlIGl0ZW0gKi8KKwlpZiAodGItPkNGUlswXSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXk7CisKKwkJa2V5ID0gQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSwgdGItPnJrZXlbMF0pOworCQlpZiAob3BfaXNfbGVmdF9tZXJnZWFibGUoa2V5LCBTaC0+Yl9zaXplKQorCQkgICAgJiYgKHZuLT52bl9tb2RlICE9IE1fREVMRVRFCisJCQl8fCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gIT0gQl9OUl9JVEVNUyhTaCkgLSAxKSkKKwkJCXZuLT52bl92aVt2bi0+dm5fbnJfaXRlbSAtIDFdLnZpX3R5cGUgfD0KKwkJCSAgICBWSV9UWVBFX1JJR0hUX01FUkdFQUJMRTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCWlmIChvcF9pc19sZWZ0X21lcmdlYWJsZSAoa2V5LCBTaC0+Yl9zaXplKSAmJgotCSAgICAhKHZuLT52bl9tb2RlICE9IE1fREVMRVRFIHx8IHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSAhPSBCX05SX0lURU1TIChTaCkgLSAxKSApIHsKLQkgICAgLyogd2UgZGVsZXRlIGxhc3QgaXRlbSBhbmQgaXQgY291bGQgYmUgbWVyZ2VkIHdpdGggcmlnaHQgbmVpZ2hib3IncyBmaXJzdCBpdGVtICovCi0JICAgIGlmICghKEJfTlJfSVRFTVMgKFNoKSA9PSAxICYmIGlzX2RpcmVudHJ5X2xlX2loIChCX05fUElURU1fSEVBRCAoU2gsIDApKSAmJgotCQkgIElfRU5UUllfQ09VTlQgKEJfTl9QSVRFTV9IRUFEIChTaCwgMCkpID09IDEpKSB7Ci0JCS8qIG5vZGUgY29udGFpbnMgbW9yZSB0aGFuIDEgaXRlbSwgb3IgaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0sIG9yIHRoaXMgaXRlbSBjb250YWlucyBtb3JlIHRoYW4gMSBlbnRyeSAqLwotCQlwcmludF9ibG9jayAoU2gsIDAsIC0xLCAtMSk7Ci0JCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy04MDQ1OiBjcmVhdGVfdmlydHVhbF9ub2RlOiByZGtleSAlaywgYWZmZWN0ZWQgaXRlbT09JWQgKG1vZGU9PSVjKSBNdXN0IGJlICVjIiwgCi0JCQkJa2V5LCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0sIHZuLT52bl9tb2RlLCBNX0RFTEVURSk7Ci0JICAgIH0gZWxzZQotCQkvKiB3ZSBjYW4gZGVsZXRlIGRpcmVjdG9yeSBpdGVtLCB0aGF0IGhhcyBvbmx5IG9uZSBkaXJlY3RvcnkgZW50cnkgaW4gaXQgKi8KLQkJOwotCX0KKwkJaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlKGtleSwgU2gtPmJfc2l6ZSkgJiYKKwkJICAgICEodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUKKwkJICAgICAgfHwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtICE9IEJfTlJfSVRFTVMoU2gpIC0gMSkpIHsKKwkJCS8qIHdlIGRlbGV0ZSBsYXN0IGl0ZW0gYW5kIGl0IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHJpZ2h0IG5laWdoYm9yJ3MgZmlyc3QgaXRlbSAqLworCQkJaWYgKCEKKwkJCSAgICAoQl9OUl9JVEVNUyhTaCkgPT0gMQorCQkJICAgICAmJiBpc19kaXJlbnRyeV9sZV9paChCX05fUElURU1fSEVBRChTaCwgMCkpCisJCQkgICAgICYmIElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQoU2gsIDApKSA9PSAxKSkgeworCQkJCS8qIG5vZGUgY29udGFpbnMgbW9yZSB0aGFuIDEgaXRlbSwgb3IgaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0sIG9yIHRoaXMgaXRlbSBjb250YWlucyBtb3JlIHRoYW4gMSBlbnRyeSAqLworCQkJCXByaW50X2Jsb2NrKFNoLCAwLCAtMSwgLTEpOworCQkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkJICAgICAgICJ2cy04MDQ1OiBjcmVhdGVfdmlydHVhbF9ub2RlOiByZGtleSAlaywgYWZmZWN0ZWQgaXRlbT09JWQgKG1vZGU9PSVjKSBNdXN0IGJlICVjIiwKKwkJCQkJICAgICAgIGtleSwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtLAorCQkJCQkgICAgICAgdm4tPnZuX21vZGUsIE1fREVMRVRFKTsKKwkJCX0gZWxzZQorCQkJCS8qIHdlIGNhbiBkZWxldGUgZGlyZWN0b3J5IGl0ZW0sIHRoYXQgaGFzIG9ubHkgb25lIGRpcmVjdG9yeSBlbnRyeSBpbiBpdCAqLworCQkJCTsKKwkJfQogI2VuZGlmCi0gICAgCi0gICAgfQotfQogCisJfQorfQogCiAvKiB1c2luZyB2aXJ0dWFsIG5vZGUgY2hlY2ssIGhvdyBtYW55IGl0ZW1zIGNhbiBiZSBzaGlmdGVkIHRvIGxlZnQKICAgIG5laWdoYm9yICovCi1zdGF0aWMgdm9pZCBjaGVja19sZWZ0IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoLCBpbnQgY3VyX2ZyZWUpCitzdGF0aWMgdm9pZCBjaGVja19sZWZ0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCwgaW50IGN1cl9mcmVlKQogewotICAgIGludCBpOwotICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKLSAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmk7Ci0gICAgaW50IGRfc2l6ZSwgaWhfc2l6ZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aTsKKwlpbnQgZF9zaXplLCBpaF9zaXplOwogCi0gICAgUkZBTFNFKCBjdXJfZnJlZSA8IDAsICJ2cy04MDUwOiBjdXJfZnJlZSAoJWQpIDwgMCIsIGN1cl9mcmVlKTsKKwlSRkFMU0UoY3VyX2ZyZWUgPCAwLCAidnMtODA1MDogY3VyX2ZyZWUgKCVkKSA8IDAiLCBjdXJfZnJlZSk7CiAKLSAgICAvKiBpbnRlcm5hbCBsZXZlbCAqLwotICAgIGlmIChoID4gMCkgewkKLQl0Yi0+bG51bVtoXSA9IGN1cl9mcmVlIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGxlYWYgbGV2ZWwgKi8KLQotICAgIGlmICghY3VyX2ZyZWUgfHwgIXZuLT52bl9ucl9pdGVtKSB7Ci0JLyogbm8gZnJlZSBzcGFjZSBvciBub3RoaW5nIHRvIG1vdmUgKi8KLQl0Yi0+bG51bVtoXSA9IDA7Ci0JdGItPmxieXRlcyA9IC0xOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBSRkFMU0UoICFQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApLAotCSAgICAidnMtODA1NTogcGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIGludmFsaWQiKTsKLQotICAgIHZpID0gdm4tPnZuX3ZpOwotICAgIGlmICgodW5zaWduZWQgaW50KWN1cl9mcmVlID49ICh2bi0+dm5fc2l6ZSAtICgodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKSA/IElIX1NJWkUgOiAwKSkpIHsKLQkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gTFswXSAqLwotCi0JUkZBTFNFKCB2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCB8fCB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFLAotCQkidnMtODA1NTogaW52YWxpZCBtb2RlIG9yIGJhbGFuY2UgY29uZGl0aW9uIGZhaWxlZCIpOwotCi0JdGItPmxudW1bMF0gPSB2bi0+dm5fbnJfaXRlbTsKLQl0Yi0+bGJ5dGVzID0gLTE7Ci0JcmV0dXJuOwotICAgIH0KLSAgCi0KLSAgICBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKLQotICAgIC8qIGZpcnN0IGl0ZW0gbWF5IGJlIG1lcmdlIHdpdGggbGFzdCBpdGVtIGluIGxlZnQgbmVpZ2hib3IgKi8KLSAgICBpZiAodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQotCWRfc2l6ZSA9IC0oKGludClJSF9TSVpFKSwgaWhfc2l6ZSA9IDA7Ci0KLSAgICB0Yi0+bG51bVswXSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHZuLT52bl9ucl9pdGVtOyBpICsrLCBpaF9zaXplID0gSUhfU0laRSwgZF9zaXplID0gMCwgdmkgKyspIHsKLQlkX3NpemUgKz0gdmktPnZpX2l0ZW1fbGVuOwotCWlmIChjdXJfZnJlZSA+PSBkX3NpemUpIHsJCi0JICAgIC8qIHRoZSBpdGVtIGNhbiBiZSBzaGlmdGVkIGVudGlyZWx5ICovCi0JICAgIGN1cl9mcmVlIC09IGRfc2l6ZTsKLQkgICAgdGItPmxudW1bMF0gKys7Ci0JICAgIGNvbnRpbnVlOworCS8qIGludGVybmFsIGxldmVsICovCisJaWYgKGggPiAwKSB7CisJCXRiLT5sbnVtW2hdID0gY3VyX2ZyZWUgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKKwkJcmV0dXJuOwogCX0KLSAgICAgIAotCS8qIHRoZSBpdGVtIGNhbm5vdCBiZSBzaGlmdGVkIGVudGlyZWx5LCB0cnkgdG8gc3BsaXQgaXQgKi8KLQkvKiBjaGVjayB3aGV0aGVyIExbMF0gY2FuIGhvbGQgaWggYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIHRoZSBpdGVtIGJvZHkgKi8KLQlpZiAoY3VyX2ZyZWUgPD0gaWhfc2l6ZSkgewotCSAgICAvKiBjYW5ub3Qgc2hpZnQgZXZlbiBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgaXRlbSAqLwotCSAgICB0Yi0+bGJ5dGVzID0gLTE7Ci0JICAgIHJldHVybjsKKworCS8qIGxlYWYgbGV2ZWwgKi8KKworCWlmICghY3VyX2ZyZWUgfHwgIXZuLT52bl9ucl9pdGVtKSB7CisJCS8qIG5vIGZyZWUgc3BhY2Ugb3Igbm90aGluZyB0byBtb3ZlICovCisJCXRiLT5sbnVtW2hdID0gMDsKKwkJdGItPmxieXRlcyA9IC0xOworCQlyZXR1cm47CiAJfQotCWN1cl9mcmVlIC09IGloX3NpemU7Ci0gICAgCi0JdGItPmxieXRlcyA9IG9wX2NoZWNrX2xlZnQgKHZpLCBjdXJfZnJlZSwgMCwgMCk7Ci0JaWYgKHRiLT5sYnl0ZXMgIT0gLTEpCi0JICAgIC8qIGNvdW50IHBhcnRpYWxseSBzaGlmdGVkIGl0ZW0gKi8KLQkgICAgdGItPmxudW1bMF0gKys7Ci0gICAgCi0JYnJlYWs7Ci0gICAgfQotICAKLSAgICByZXR1cm47CisKKwlSRkFMU0UoIVBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwKKwkgICAgICAgInZzLTgwNTU6IHBhcmVudCBkb2VzIG5vdCBleGlzdCBvciBpbnZhbGlkIik7CisKKwl2aSA9IHZuLT52bl92aTsKKwlpZiAoKHVuc2lnbmVkIGludCljdXJfZnJlZSA+PQorCSAgICAodm4tPnZuX3NpemUgLQorCSAgICAgKCh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfTEVGVF9NRVJHRUFCTEUpID8gSUhfU0laRSA6IDApKSkgeworCQkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gTFswXSAqLworCisJCVJGQUxTRSh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCB8fCB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFLAorCQkgICAgICAgInZzLTgwNTU6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKKworCQl0Yi0+bG51bVswXSA9IHZuLT52bl9ucl9pdGVtOworCQl0Yi0+bGJ5dGVzID0gLTE7CisJCXJldHVybjsKKwl9CisKKwlkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKKworCS8qIGZpcnN0IGl0ZW0gbWF5IGJlIG1lcmdlIHdpdGggbGFzdCBpdGVtIGluIGxlZnQgbmVpZ2hib3IgKi8KKwlpZiAodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQorCQlkX3NpemUgPSAtKChpbnQpSUhfU0laRSksIGloX3NpemUgPSAwOworCisJdGItPmxudW1bMF0gPSAwOworCWZvciAoaSA9IDA7IGkgPCB2bi0+dm5fbnJfaXRlbTsKKwkgICAgIGkrKywgaWhfc2l6ZSA9IElIX1NJWkUsIGRfc2l6ZSA9IDAsIHZpKyspIHsKKwkJZF9zaXplICs9IHZpLT52aV9pdGVtX2xlbjsKKwkJaWYgKGN1cl9mcmVlID49IGRfc2l6ZSkgeworCQkJLyogdGhlIGl0ZW0gY2FuIGJlIHNoaWZ0ZWQgZW50aXJlbHkgKi8KKwkJCWN1cl9mcmVlIC09IGRfc2l6ZTsKKwkJCXRiLT5sbnVtWzBdKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHRoZSBpdGVtIGNhbm5vdCBiZSBzaGlmdGVkIGVudGlyZWx5LCB0cnkgdG8gc3BsaXQgaXQgKi8KKwkJLyogY2hlY2sgd2hldGhlciBMWzBdIGNhbiBob2xkIGloIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiB0aGUgaXRlbSBib2R5ICovCisJCWlmIChjdXJfZnJlZSA8PSBpaF9zaXplKSB7CisJCQkvKiBjYW5ub3Qgc2hpZnQgZXZlbiBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgaXRlbSAqLworCQkJdGItPmxieXRlcyA9IC0xOworCQkJcmV0dXJuOworCQl9CisJCWN1cl9mcmVlIC09IGloX3NpemU7CisKKwkJdGItPmxieXRlcyA9IG9wX2NoZWNrX2xlZnQodmksIGN1cl9mcmVlLCAwLCAwKTsKKwkJaWYgKHRiLT5sYnl0ZXMgIT0gLTEpCisJCQkvKiBjb3VudCBwYXJ0aWFsbHkgc2hpZnRlZCBpdGVtICovCisJCQl0Yi0+bG51bVswXSsrOworCisJCWJyZWFrOworCX0KKworCXJldHVybjsKIH0KIAotCiAvKiB1c2luZyB2aXJ0dWFsIG5vZGUgY2hlY2ssIGhvdyBtYW55IGl0ZW1zIGNhbiBiZSBzaGlmdGVkIHRvIHJpZ2h0CiAgICBuZWlnaGJvciAqLwotc3RhdGljIHZvaWQgY2hlY2tfcmlnaHQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgsIGludCBjdXJfZnJlZSkKK3N0YXRpYyB2b2lkIGNoZWNrX3JpZ2h0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCwgaW50IGN1cl9mcmVlKQogewotICAgIGludCBpOwotICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKLSAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmk7Ci0gICAgaW50IGRfc2l6ZSwgaWhfc2l6ZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aTsKKwlpbnQgZF9zaXplLCBpaF9zaXplOwogCi0gICAgUkZBTFNFKCBjdXJfZnJlZSA8IDAsICJ2cy04MDcwOiBjdXJfZnJlZSA8IDAiKTsKLSAgICAKLSAgICAvKiBpbnRlcm5hbCBsZXZlbCAqLwotICAgIGlmIChoID4gMCkgewotCXRiLT5ybnVtW2hdID0gY3VyX2ZyZWUgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8qIGxlYWYgbGV2ZWwgKi8KLSAgICAKLSAgICBpZiAoIWN1cl9mcmVlIHx8ICF2bi0+dm5fbnJfaXRlbSkgewotCS8qIG5vIGZyZWUgc3BhY2UgICovCi0JdGItPnJudW1baF0gPSAwOwotCXRiLT5yYnl0ZXMgPSAtMTsKLQlyZXR1cm47Ci0gICAgfQotICAKLSAgICBSRkFMU0UoICFQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApLAotCSAgICAidnMtODA3NTogcGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIGludmFsaWQiKTsKLSAgCi0gICAgdmkgPSB2bi0+dm5fdmkgKyB2bi0+dm5fbnJfaXRlbSAtIDE7Ci0gICAgaWYgKCh1bnNpZ25lZCBpbnQpY3VyX2ZyZWUgPj0gKHZuLT52bl9zaXplIC0gKCh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKSA/IElIX1NJWkUgOiAwKSkpIHsKLQkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gUlswXSAqLwotCQotCVJGQUxTRSggdm4tPnZuX21vZGUgPT0gTV9JTlNFUlQgfHwgdm4tPnZuX21vZGUgPT0gTV9QQVNURSwKLQkJInZzLTgwODA6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKKwlSRkFMU0UoY3VyX2ZyZWUgPCAwLCAidnMtODA3MDogY3VyX2ZyZWUgPCAwIik7CiAKLQl0Yi0+cm51bVtoXSA9IHZuLT52bl9ucl9pdGVtOwotCXRiLT5yYnl0ZXMgPSAtMTsKLQlyZXR1cm47Ci0gICAgfQotICAgIAotICAgIGRfc2l6ZSA9IDAsIGloX3NpemUgPSBJSF9TSVpFOwotICAgIAotICAgIC8qIGxhc3QgaXRlbSBtYXkgYmUgbWVyZ2Ugd2l0aCBmaXJzdCBpdGVtIGluIHJpZ2h0IG5laWdoYm9yICovCi0gICAgaWYgKHZpLT52aV90eXBlICYgVklfVFlQRV9SSUdIVF9NRVJHRUFCTEUpCi0JZF9zaXplID0gLShpbnQpSUhfU0laRSwgaWhfc2l6ZSA9IDA7Ci0KLSAgICB0Yi0+cm51bVswXSA9IDA7Ci0gICAgZm9yIChpID0gdm4tPnZuX25yX2l0ZW0gLSAxOyBpID49IDA7IGkgLS0sIGRfc2l6ZSA9IDAsIGloX3NpemUgPSBJSF9TSVpFLCB2aSAtLSkgewotCWRfc2l6ZSArPSB2aS0+dmlfaXRlbV9sZW47Ci0JaWYgKGN1cl9mcmVlID49IGRfc2l6ZSkgewkKLQkgICAgLyogdGhlIGl0ZW0gY2FuIGJlIHNoaWZ0ZWQgZW50aXJlbHkgKi8KLQkgICAgY3VyX2ZyZWUgLT0gZF9zaXplOwotCSAgICB0Yi0+cm51bVswXSArKzsKLQkgICAgY29udGludWU7CisJLyogaW50ZXJuYWwgbGV2ZWwgKi8KKwlpZiAoaCA+IDApIHsKKwkJdGItPnJudW1baF0gPSBjdXJfZnJlZSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCQlyZXR1cm47CiAJfQotCQotCS8qIGNoZWNrIHdoZXRoZXIgUlswXSBjYW4gaG9sZCBpaCBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgb2YgdGhlIGl0ZW0gYm9keSAqLwotCWlmICggY3VyX2ZyZWUgPD0gaWhfc2l6ZSApIHsgICAgLyogY2Fubm90IHNoaWZ0IGV2ZW4gYSBwYXJ0IG9mIHRoZSBjdXJyZW50IGl0ZW0gKi8KLQkgICAgdGItPnJieXRlcyA9IC0xOwotCSAgICByZXR1cm47Ci0JfQotCQotCS8qIFJbMF0gY2FuIGhvbGQgdGhlIGhlYWRlciBvZiB0aGUgaXRlbSBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgb2YgaXRzIGJvZHkgKi8KLQljdXJfZnJlZSAtPSBpaF9zaXplOwkvKiBjdXJfZnJlZSBpcyBzdGlsbCA+IDAgKi8KIAotCXRiLT5yYnl0ZXMgPSBvcF9jaGVja19yaWdodCAodmksIGN1cl9mcmVlKTsKLQlpZiAodGItPnJieXRlcyAhPSAtMSkKLQkgICAgLyogY291bnQgcGFydGlhbGx5IHNoaWZ0ZWQgaXRlbSAqLwotCSAgICB0Yi0+cm51bVswXSArKzsKLSAgICAKLQlicmVhazsKLSAgICB9Ci0JCi0gIHJldHVybjsKKwkvKiBsZWFmIGxldmVsICovCisKKwlpZiAoIWN1cl9mcmVlIHx8ICF2bi0+dm5fbnJfaXRlbSkgeworCQkvKiBubyBmcmVlIHNwYWNlICAqLworCQl0Yi0+cm51bVtoXSA9IDA7CisJCXRiLT5yYnl0ZXMgPSAtMTsKKwkJcmV0dXJuOworCX0KKworCVJGQUxTRSghUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApLAorCSAgICAgICAidnMtODA3NTogcGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIGludmFsaWQiKTsKKworCXZpID0gdm4tPnZuX3ZpICsgdm4tPnZuX25yX2l0ZW0gLSAxOworCWlmICgodW5zaWduZWQgaW50KWN1cl9mcmVlID49CisJICAgICh2bi0+dm5fc2l6ZSAtCisJICAgICAoKHZpLT52aV90eXBlICYgVklfVFlQRV9SSUdIVF9NRVJHRUFCTEUpID8gSUhfU0laRSA6IDApKSkgeworCQkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gUlswXSAqLworCisJCVJGQUxTRSh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCB8fCB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFLAorCQkgICAgICAgInZzLTgwODA6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKKworCQl0Yi0+cm51bVtoXSA9IHZuLT52bl9ucl9pdGVtOworCQl0Yi0+cmJ5dGVzID0gLTE7CisJCXJldHVybjsKKwl9CisKKwlkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKKworCS8qIGxhc3QgaXRlbSBtYXkgYmUgbWVyZ2Ugd2l0aCBmaXJzdCBpdGVtIGluIHJpZ2h0IG5laWdoYm9yICovCisJaWYgKHZpLT52aV90eXBlICYgVklfVFlQRV9SSUdIVF9NRVJHRUFCTEUpCisJCWRfc2l6ZSA9IC0oaW50KUlIX1NJWkUsIGloX3NpemUgPSAwOworCisJdGItPnJudW1bMF0gPSAwOworCWZvciAoaSA9IHZuLT52bl9ucl9pdGVtIC0gMTsgaSA+PSAwOworCSAgICAgaS0tLCBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRSwgdmktLSkgeworCQlkX3NpemUgKz0gdmktPnZpX2l0ZW1fbGVuOworCQlpZiAoY3VyX2ZyZWUgPj0gZF9zaXplKSB7CisJCQkvKiB0aGUgaXRlbSBjYW4gYmUgc2hpZnRlZCBlbnRpcmVseSAqLworCQkJY3VyX2ZyZWUgLT0gZF9zaXplOworCQkJdGItPnJudW1bMF0rKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogY2hlY2sgd2hldGhlciBSWzBdIGNhbiBob2xkIGloIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiB0aGUgaXRlbSBib2R5ICovCisJCWlmIChjdXJfZnJlZSA8PSBpaF9zaXplKSB7CS8qIGNhbm5vdCBzaGlmdCBldmVuIGEgcGFydCBvZiB0aGUgY3VycmVudCBpdGVtICovCisJCQl0Yi0+cmJ5dGVzID0gLTE7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBSWzBdIGNhbiBob2xkIHRoZSBoZWFkZXIgb2YgdGhlIGl0ZW0gYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIGl0cyBib2R5ICovCisJCWN1cl9mcmVlIC09IGloX3NpemU7CS8qIGN1cl9mcmVlIGlzIHN0aWxsID4gMCAqLworCisJCXRiLT5yYnl0ZXMgPSBvcF9jaGVja19yaWdodCh2aSwgY3VyX2ZyZWUpOworCQlpZiAodGItPnJieXRlcyAhPSAtMSkKKwkJCS8qIGNvdW50IHBhcnRpYWxseSBzaGlmdGVkIGl0ZW0gKi8KKwkJCXRiLT5ybnVtWzBdKys7CisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOwogfQogCi0KIC8qCiAgKiBmcm9tIC0gbnVtYmVyIG9mIGl0ZW1zLCB3aGljaCBhcmUgc2hpZnRlZCB0byBsZWZ0IG5laWdoYm9yIGVudGlyZWx5CiAgKiB0byAtIG51bWJlciBvZiBpdGVtLCB3aGljaCBhcmUgc2hpZnRlZCB0byByaWdodCBuZWlnaGJvciBlbnRpcmVseQogICogZnJvbV9ieXRlcyAtIG51bWJlciBvZiBieXRlcyBvZiBib3VuZGFyeSBpdGVtIChvciBkaXJlY3RvcnkgZW50cmllcykgd2hpY2ggYXJlIHNoaWZ0ZWQgdG8gbGVmdCBuZWlnaGJvcgogICogdG9fYnl0ZXMgLSBudW1iZXIgb2YgYnl0ZXMgb2YgYm91bmRhcnkgaXRlbSAob3IgZGlyZWN0b3J5IGVudHJpZXMpIHdoaWNoIGFyZSBzaGlmdGVkIHRvIHJpZ2h0IG5laWdoYm9yICovCi1zdGF0aWMgaW50IGdldF9udW1fdmVyIChpbnQgbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCwKLQkJCWludCBmcm9tLCBpbnQgZnJvbV9ieXRlcywKLQkJCWludCB0bywgICBpbnQgdG9fYnl0ZXMsCi0JCQlzaG9ydCAqIHNudW0wMTIsIGludCBmbG93Ci0gICAgKQorc3RhdGljIGludCBnZXRfbnVtX3ZlcihpbnQgbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoLAorCQkgICAgICAgaW50IGZyb20sIGludCBmcm9tX2J5dGVzLAorCQkgICAgICAgaW50IHRvLCBpbnQgdG9fYnl0ZXMsIHNob3J0ICpzbnVtMDEyLCBpbnQgZmxvdykKIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgY3VyX2ZyZWU7Ci0gICAgLy8gICAgaW50IGJ5dGVzOwotICAgIGludCB1bml0czsKLSAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gICAgLy8gICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpOworCWludCBpOworCWludCBjdXJfZnJlZTsKKwkvLyAgICBpbnQgYnl0ZXM7CisJaW50IHVuaXRzOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOworCS8vICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aTsKIAotICAgIGludCB0b3RhbF9ub2RlX3NpemUsIG1heF9ub2RlX3NpemUsIGN1cnJlbnRfaXRlbV9zaXplOwotICAgIGludCBuZWVkZWRfbm9kZXM7Ci0gICAgaW50IHN0YXJ0X2l0ZW0sIAkvKiBwb3NpdGlvbiBvZiBpdGVtIHdlIHN0YXJ0IGZpbGxpbmcgbm9kZSBmcm9tICovCi0JZW5kX2l0ZW0sCS8qIHBvc2l0aW9uIG9mIGl0ZW0gd2UgZmluaXNoIGZpbGxpbmcgbm9kZSBieSAqLwotCXN0YXJ0X2J5dGVzLC8qIG51bWJlciBvZiBmaXJzdCBieXRlcyAoZW50cmllcyBmb3IgZGlyZWN0b3J5KSBvZiBzdGFydF9pdGVtLXRoIGl0ZW0gCi0JCSAgICAgICB3ZSBkbyBub3QgaW5jbHVkZSBpbnRvIG5vZGUgdGhhdCBpcyBiZWluZyBmaWxsZWQgKi8KLQllbmRfYnl0ZXM7CS8qIG51bWJlciBvZiBsYXN0IGJ5dGVzIChlbnRyaWVzIGZvciBkaXJlY3RvcnkpIG9mIGVuZF9pdGVtLXRoIGl0ZW0gCi0JCQkgICB3ZSBkbyBub2RlIGluY2x1ZGUgaW50byBub2RlIHRoYXQgaXMgYmVpbmcgZmlsbGVkICovCi0gICAgaW50IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzJdOyAvKiB0aGVzZSBhcmUgcG9zaXRpb25zIGluIHZpcnR1YWwgaXRlbSBvZgotCQkJCSAgICBpdGVtcywgdGhhdCBhcmUgc3BsaXQgYmV0d2VlbiBTWzBdIGFuZAotCQkJCSAgICBTMW5ldyBhbmQgUzFuZXcgYW5kIFMybmV3ICovCisJaW50IHRvdGFsX25vZGVfc2l6ZSwgbWF4X25vZGVfc2l6ZSwgY3VycmVudF9pdGVtX3NpemU7CisJaW50IG5lZWRlZF9ub2RlczsKKwlpbnQgc3RhcnRfaXRlbSwJCS8qIHBvc2l0aW9uIG9mIGl0ZW0gd2Ugc3RhcnQgZmlsbGluZyBub2RlIGZyb20gKi8KKwkgZW5kX2l0ZW0sCQkvKiBwb3NpdGlvbiBvZiBpdGVtIHdlIGZpbmlzaCBmaWxsaW5nIG5vZGUgYnkgKi8KKwkgc3RhcnRfYnl0ZXMsCQkvKiBudW1iZXIgb2YgZmlyc3QgYnl0ZXMgKGVudHJpZXMgZm9yIGRpcmVjdG9yeSkgb2Ygc3RhcnRfaXRlbS10aCBpdGVtIAorCQkJCSAgIHdlIGRvIG5vdCBpbmNsdWRlIGludG8gbm9kZSB0aGF0IGlzIGJlaW5nIGZpbGxlZCAqLworCSBlbmRfYnl0ZXM7CQkvKiBudW1iZXIgb2YgbGFzdCBieXRlcyAoZW50cmllcyBmb3IgZGlyZWN0b3J5KSBvZiBlbmRfaXRlbS10aCBpdGVtIAorCQkJCSAgIHdlIGRvIG5vZGUgaW5jbHVkZSBpbnRvIG5vZGUgdGhhdCBpcyBiZWluZyBmaWxsZWQgKi8KKwlpbnQgc3BsaXRfaXRlbV9wb3NpdGlvbnNbMl07CS8qIHRoZXNlIGFyZSBwb3NpdGlvbnMgaW4gdmlydHVhbCBpdGVtIG9mCisJCQkJCSAgIGl0ZW1zLCB0aGF0IGFyZSBzcGxpdCBiZXR3ZWVuIFNbMF0gYW5kCisJCQkJCSAgIFMxbmV3IGFuZCBTMW5ldyBhbmQgUzJuZXcgKi8KIAotICAgIHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdID0gLTE7Ci0gICAgc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV0gPSAtMTsKKwlzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9IC0xOworCXNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdID0gLTE7CiAKLSAgICAvKiBXZSBvbmx5IGNyZWF0ZSBhZGRpdGlvbmFsIG5vZGVzIGlmIHdlIGFyZSBpbiBpbnNlcnQgb3IgcGFzdGUgbW9kZQotICAgICAgIG9yIHdlIGFyZSBpbiByZXBsYWNlIG1vZGUgYXQgdGhlIGludGVybmFsIGxldmVsLiBJZiBoIGlzIDAgYW5kCi0gICAgICAgdGhlIG1vZGUgaXMgTV9SRVBMQUNFIHRoZW4gaW4gZml4X25vZGVzIHdlIGNoYW5nZSB0aGUgbW9kZSB0bwotICAgICAgIHBhc3RlIG9yIGluc2VydCBiZWZvcmUgd2UgZ2V0IGhlcmUgaW4gdGhlIGNvZGUuICAqLwotICAgIFJGQUxTRSggdGItPmluc2VydF9zaXplW2hdIDwgMCAgfHwgKG1vZGUgIT0gTV9JTlNFUlQgJiYgbW9kZSAhPSBNX1BBU1RFKSwKLQkgICAgInZzLTgxMDA6IGluc2VydF9zaXplIDwgMCBpbiBvdmVyZmxvdyIpOworCS8qIFdlIG9ubHkgY3JlYXRlIGFkZGl0aW9uYWwgbm9kZXMgaWYgd2UgYXJlIGluIGluc2VydCBvciBwYXN0ZSBtb2RlCisJICAgb3Igd2UgYXJlIGluIHJlcGxhY2UgbW9kZSBhdCB0aGUgaW50ZXJuYWwgbGV2ZWwuIElmIGggaXMgMCBhbmQKKwkgICB0aGUgbW9kZSBpcyBNX1JFUExBQ0UgdGhlbiBpbiBmaXhfbm9kZXMgd2UgY2hhbmdlIHRoZSBtb2RlIHRvCisJICAgcGFzdGUgb3IgaW5zZXJ0IGJlZm9yZSB3ZSBnZXQgaGVyZSBpbiB0aGUgY29kZS4gICovCisJUkZBTFNFKHRiLT5pbnNlcnRfc2l6ZVtoXSA8IDAgfHwgKG1vZGUgIT0gTV9JTlNFUlQgJiYgbW9kZSAhPSBNX1BBU1RFKSwKKwkgICAgICAgInZzLTgxMDA6IGluc2VydF9zaXplIDwgMCBpbiBvdmVyZmxvdyIpOwogCi0gICAgbWF4X25vZGVfc2l6ZSA9IE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpKTsKKwltYXhfbm9kZV9zaXplID0gTUFYX0NISUxEX1NJWkUoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKTsKIAotICAgIC8qIHNudW0wMTIgWzAtMl0gLSBudW1iZXIgb2YgaXRlbXMsIHRoYXQgbGF5Ci0gICAgICAgdG8gU1swXSwgZmlyc3QgbmV3IG5vZGUgYW5kIHNlY29uZCBuZXcgbm9kZSAqLwotICAgIHNudW0wMTJbM10gPSAtMTsJLyogczFieXRlcyAqLwotICAgIHNudW0wMTJbNF0gPSAtMTsJLyogczJieXRlcyAqLworCS8qIHNudW0wMTIgWzAtMl0gLSBudW1iZXIgb2YgaXRlbXMsIHRoYXQgbGF5CisJICAgdG8gU1swXSwgZmlyc3QgbmV3IG5vZGUgYW5kIHNlY29uZCBuZXcgbm9kZSAqLworCXNudW0wMTJbM10gPSAtMTsJLyogczFieXRlcyAqLworCXNudW0wMTJbNF0gPSAtMTsJLyogczJieXRlcyAqLwogCi0gICAgLyogaW50ZXJuYWwgbGV2ZWwgKi8KLSAgICBpZiAoaCA+IDApIHsKLQlpID0gKCh0byAtIGZyb20pICogKEtFWV9TSVpFICsgRENfU0laRSkgKyBEQ19TSVpFKTsKLQlpZiAoaSA9PSBtYXhfbm9kZV9zaXplKQotCSAgICByZXR1cm4gMTsKLQlyZXR1cm4gKGkgLyBtYXhfbm9kZV9zaXplICsgMSk7Ci0gICAgfQotCi0gICAgLyogbGVhZiBsZXZlbCAqLwotICAgIG5lZWRlZF9ub2RlcyA9IDE7Ci0gICAgdG90YWxfbm9kZV9zaXplID0gMDsKLSAgICBjdXJfZnJlZSA9IG1heF9ub2RlX3NpemU7Ci0KLSAgICAvLyBzdGFydCBmcm9tICdmcm9tJy10aCBpdGVtCi0gICAgc3RhcnRfaXRlbSA9IGZyb207Ci0gICAgLy8gc2tpcCBpdHMgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cwotICAgIHN0YXJ0X2J5dGVzID0gKChmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKLQotICAgIC8vIGxhc3QgaW5jbHVkZWQgaXRlbSBpcyB0aGUgJ2VuZF9pdGVtJy10aCBvbmUKLSAgICBlbmRfaXRlbSA9IHZuLT52bl9ucl9pdGVtIC0gdG8gLSAxOwotICAgIC8vIGRvIG5vdCBjb3VudCBsYXN0ICdlbmRfYnl0ZXMnIHVuaXRzIG9mICdlbmRfaXRlbSctdGggaXRlbQotICAgIGVuZF9ieXRlcyA9ICh0b19ieXRlcyAhPSAtMSkgPyB0b19ieXRlcyA6IDA7Ci0KLSAgICAvKiBnbyB0aHJvdWdoIGFsbCBpdGVtIGJlZ2lubmluZyBmcm9tIHRoZSBzdGFydF9pdGVtLXRoIGl0ZW0gYW5kIGVuZGluZyBieQotICAgICAgIHRoZSBlbmRfaXRlbS10aCBpdGVtLiBEbyBub3QgY291bnQgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cyBvZgotICAgICAgICdzdGFydF9pdGVtJy10aCBpdGVtIGFuZCBsYXN0ICdlbmRfYnl0ZXMnIG9mICdlbmRfaXRlbSctdGggaXRlbSAqLwotICAgIAotICAgIGZvciAoaSA9IHN0YXJ0X2l0ZW07IGkgPD0gZW5kX2l0ZW07IGkgKyspIHsKLQlzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkgPSB2bi0+dm5fdmkgKyBpOwotCWludCBza2lwX2Zyb21fZW5kID0gKChpID09IGVuZF9pdGVtKSA/IGVuZF9ieXRlcyA6IDApOwotCi0JUkZBTFNFKCBuZWVkZWRfbm9kZXMgPiAzLCAidnMtODEwNTogdG9vIG1hbnkgbm9kZXMgYXJlIG5lZWRlZCIpOwotCi0JLyogZ2V0IHNpemUgb2YgY3VycmVudCBpdGVtICovCi0JY3VycmVudF9pdGVtX3NpemUgPSB2aS0+dmlfaXRlbV9sZW47Ci0KLQkvKiBkbyBub3QgdGFrZSBpbiBjYWxjdWxhdGlvbiBoZWFkIHBhcnQgKGZyb21fYnl0ZXMpIG9mIGZyb20tdGggaXRlbSAqLwotCWN1cnJlbnRfaXRlbV9zaXplIC09IG9wX3BhcnRfc2l6ZSAodmksIDAvKmZyb20gc3RhcnQqLywgc3RhcnRfYnl0ZXMpOwotCi0JLyogZG8gbm90IHRha2UgaW4gY2FsY3VsYXRpb24gdGFpbCBwYXJ0IG9mIGxhc3QgaXRlbSAqLwotCWN1cnJlbnRfaXRlbV9zaXplIC09IG9wX3BhcnRfc2l6ZSAodmksIDEvKmZyb20gZW5kKi8sIHNraXBfZnJvbV9lbmQpOwotCi0JLyogaWYgaXRlbSBmaXRzIGludG8gY3VycmVudCBub2RlIGVudGllcmx5ICovCi0JaWYgKHRvdGFsX25vZGVfc2l6ZSArIGN1cnJlbnRfaXRlbV9zaXplIDw9IG1heF9ub2RlX3NpemUpIHsKLQkgICAgc251bTAxMltuZWVkZWRfbm9kZXMgLSAxXSArKzsKLQkgICAgdG90YWxfbm9kZV9zaXplICs9IGN1cnJlbnRfaXRlbV9zaXplOwotCSAgICBzdGFydF9ieXRlcyA9IDA7Ci0JICAgIGNvbnRpbnVlOworCS8qIGludGVybmFsIGxldmVsICovCisJaWYgKGggPiAwKSB7CisJCWkgPSAoKHRvIC0gZnJvbSkgKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSArIERDX1NJWkUpOworCQlpZiAoaSA9PSBtYXhfbm9kZV9zaXplKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAoaSAvIG1heF9ub2RlX3NpemUgKyAxKTsKIAl9CiAKLQlpZiAoY3VycmVudF9pdGVtX3NpemUgPiBtYXhfbm9kZV9zaXplKSB7Ci0JICAgIC8qIHZpcnR1YWwgaXRlbSBsZW5ndGggaXMgbG9uZ2VyLCB0aGFuIG1heCBzaXplIG9mIGl0ZW0gaW4KLSAgICAgICAgICAgICAgIGEgbm9kZS4gSXQgaXMgaW1wb3NzaWJsZSBmb3IgZGlyZWN0IGl0ZW0gKi8KLQkgICAgUkZBTFNFKCBpc19kaXJlY3RfbGVfaWggKHZpLT52aV9paCksCi0JCSAgICAidnMtODExMDogIgotCQkgICAgImRpcmVjdCBpdGVtIGxlbmd0aCBpcyAlZC4gSXQgY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAlZCIsCi0JCSAgICBjdXJyZW50X2l0ZW1fc2l6ZSwgbWF4X25vZGVfc2l6ZSk7Ci0JICAgIC8qIHdlIHdpbGwgdHJ5IHRvIHNwbGl0IGl0ICovCi0JICAgIGZsb3cgPSAxOwotCX0KLQotCWlmICghZmxvdykgewotCSAgICAvKiBhcyB3ZSBkbyBub3Qgc3BsaXQgaXRlbXMsIHRha2UgbmV3IG5vZGUgYW5kIGNvbnRpbnVlICovCi0JICAgIG5lZWRlZF9ub2RlcyArKzsgaSAtLTsgdG90YWxfbm9kZV9zaXplID0gMDsKLQkgICAgY29udGludWU7Ci0JfQotCi0JLy8gY2FsY3VsYXRlIG51bWJlciBvZiBpdGVtIHVuaXRzIHdoaWNoIGZpdCBpbnRvIG5vZGUgYmVpbmcKLQkvLyBmaWxsZWQKLQl7Ci0JICAgIGludCBmcmVlX3NwYWNlOwotCi0JICAgIGZyZWVfc3BhY2UgPSBtYXhfbm9kZV9zaXplIC0gdG90YWxfbm9kZV9zaXplIC0gSUhfU0laRTsKLQkgICAgdW5pdHMgPSBvcF9jaGVja19sZWZ0ICh2aSwgZnJlZV9zcGFjZSwgc3RhcnRfYnl0ZXMsIHNraXBfZnJvbV9lbmQpOwotCSAgICBpZiAodW5pdHMgPT0gLTEpIHsKLQkJLyogbm90aGluZyBmaXRzIGludG8gY3VycmVudCBub2RlLCB0YWtlIG5ldyBub2RlIGFuZCBjb250aW51ZSAqLwotCQluZWVkZWRfbm9kZXMgKyssIGktLSwgdG90YWxfbm9kZV9zaXplID0gMDsKLQkJY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLQkvKiBzb21ldGhpbmcgZml0cyBpbnRvIHRoZSBjdXJyZW50IG5vZGUgKi8KLQkvL2lmIChzbnVtMDEyWzNdICE9IC0xIHx8IG5lZWRlZF9ub2RlcyAhPSAxKQotCS8vICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODExNTogZ2V0X251bV92ZXI6IHRvbyBtYW55IG5vZGVzIHJlcXVpcmVkIik7Ci0JLy9zbnVtMDEyW25lZWRlZF9ub2RlcyAtIDEgKyAzXSA9IG9wX3VuaXRfbnVtICh2aSkgLSBzdGFydF9ieXRlcyAtIHVuaXRzOwotCXN0YXJ0X2J5dGVzICs9IHVuaXRzOwotCXNudW0wMTJbbmVlZGVkX25vZGVzIC0gMSArIDNdID0gdW5pdHM7Ci0KLQlpZiAobmVlZGVkX25vZGVzID4gMikKLQkgICAgcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLCAidnMtODExMTogZ2V0X251bV92ZXI6ICIKLQkJCSAgICAgICJzcGxpdF9pdGVtX3Bvc2l0aW9uIGlzIG91dCBvZiBib3VuZGFyeSIpOwotCXNudW0wMTJbbmVlZGVkX25vZGVzIC0gMV0gKys7Ci0Jc3BsaXRfaXRlbV9wb3NpdGlvbnNbbmVlZGVkX25vZGVzIC0gMV0gPSBpOwotCW5lZWRlZF9ub2RlcyArKzsKLQkvKiBjb250aW51ZSBmcm9tIHRoZSBzYW1lIGl0ZW0gd2l0aCBzdGFydF9ieXRlcyAhPSAtMSAqLwotCXN0YXJ0X2l0ZW0gPSBpOwotCWkgLS07CisJLyogbGVhZiBsZXZlbCAqLworCW5lZWRlZF9ub2RlcyA9IDE7CiAJdG90YWxfbm9kZV9zaXplID0gMDsKLSAgICB9CisJY3VyX2ZyZWUgPSBtYXhfbm9kZV9zaXplOwogCi0gICAgLy8gc3VtMDEyWzRdIChpZiBpdCBpcyBub3QgLTEpIGNvbnRhaW5zIG51bWJlciBvZiB1bml0cyBvZiB3aGljaAotICAgIC8vIGFyZSB0byBiZSBpbiBTMW5ldywgc251bTAxMlszXSAtIHRvIGJlIGluIFMwLiBUaGV5IGFyZSBzdXBwb3NlZAotICAgIC8vIHRvIGJlIFMxYnl0ZXMgYW5kIFMyYnl0ZXMgY29ycmVzcG9uZGluZ2x5LCBzbyByZWNhbGN1bGF0ZQotICAgIGlmIChzbnVtMDEyWzRdID4gMCkgewotCWludCBzcGxpdF9pdGVtX251bTsKLQlpbnQgYnl0ZXNfdG9fciwgYnl0ZXNfdG9fbDsKLQlpbnQgYnl0ZXNfdG9fUzFuZXc7Ci0gICAgCi0Jc3BsaXRfaXRlbV9udW0gPSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXTsKLQlieXRlc190b19sID0gKChmcm9tID09IHNwbGl0X2l0ZW1fbnVtICYmIGZyb21fYnl0ZXMgIT0gLTEpID8gZnJvbV9ieXRlcyA6IDApOwotCWJ5dGVzX3RvX3IgPSAoKGVuZF9pdGVtID09IHNwbGl0X2l0ZW1fbnVtICYmIGVuZF9ieXRlcyAhPSAtMSkgPyBlbmRfYnl0ZXMgOiAwKTsKLQlieXRlc190b19TMW5ldyA9ICgoc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF0gPT0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV0pID8gc251bTAxMlszXSA6IDApOworCS8vIHN0YXJ0IGZyb20gJ2Zyb20nLXRoIGl0ZW0KKwlzdGFydF9pdGVtID0gZnJvbTsKKwkvLyBza2lwIGl0cyBmaXJzdCAnc3RhcnRfYnl0ZXMnIHVuaXRzCisJc3RhcnRfYnl0ZXMgPSAoKGZyb21fYnl0ZXMgIT0gLTEpID8gZnJvbV9ieXRlcyA6IDApOwogCi0JLy8gczJieXRlcwotCXNudW0wMTJbNF0gPSBvcF91bml0X251bSAoJnZuLT52bl92aVtzcGxpdF9pdGVtX251bV0pIC0gc251bTAxMls0XSAtIGJ5dGVzX3RvX3IgLSBieXRlc190b19sIC0gYnl0ZXNfdG9fUzFuZXc7CisJLy8gbGFzdCBpbmNsdWRlZCBpdGVtIGlzIHRoZSAnZW5kX2l0ZW0nLXRoIG9uZQorCWVuZF9pdGVtID0gdm4tPnZuX25yX2l0ZW0gLSB0byAtIDE7CisJLy8gZG8gbm90IGNvdW50IGxhc3QgJ2VuZF9ieXRlcycgdW5pdHMgb2YgJ2VuZF9pdGVtJy10aCBpdGVtCisJZW5kX2J5dGVzID0gKHRvX2J5dGVzICE9IC0xKSA/IHRvX2J5dGVzIDogMDsKIAotCWlmICh2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dLnZpX2luZGV4ICE9IFRZUEVfRElSRU5UUlkgJiYKLQkgICAgdm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXS52aV9pbmRleCAhPSBUWVBFX0lORElSRUNUKQotCSAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsICJ2cy04MTE1OiBnZXRfbnVtX3Zlcjogbm90ICIKLQkJCSAgICAgICJkaXJlY3Rvcnkgb3IgaW5kaXJlY3QgaXRlbSIpOwotICAgIH0KKwkvKiBnbyB0aHJvdWdoIGFsbCBpdGVtIGJlZ2lubmluZyBmcm9tIHRoZSBzdGFydF9pdGVtLXRoIGl0ZW0gYW5kIGVuZGluZyBieQorCSAgIHRoZSBlbmRfaXRlbS10aCBpdGVtLiBEbyBub3QgY291bnQgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cyBvZgorCSAgICdzdGFydF9pdGVtJy10aCBpdGVtIGFuZCBsYXN0ICdlbmRfYnl0ZXMnIG9mICdlbmRfaXRlbSctdGggaXRlbSAqLwogCi0gICAgLyogbm93IHdlIGtub3cgUzJieXRlcywgY2FsY3VsYXRlIFMxYnl0ZXMgKi8KLSAgICBpZiAoc251bTAxMlszXSA+IDApIHsKLQlpbnQgc3BsaXRfaXRlbV9udW07Ci0JaW50IGJ5dGVzX3RvX3IsIGJ5dGVzX3RvX2w7Ci0JaW50IGJ5dGVzX3RvX1MybmV3OwotICAgIAotCXNwbGl0X2l0ZW1fbnVtID0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF07Ci0JYnl0ZXNfdG9fbCA9ICgoZnJvbSA9PSBzcGxpdF9pdGVtX251bSAmJiBmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKLQlieXRlc190b19yID0gKChlbmRfaXRlbSA9PSBzcGxpdF9pdGVtX251bSAmJiBlbmRfYnl0ZXMgIT0gLTEpID8gZW5kX2J5dGVzIDogMCk7Ci0JYnl0ZXNfdG9fUzJuZXcgPSAoKHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdID09IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdICYmIHNudW0wMTJbNF0gIT0gLTEpID8gc251bTAxMls0XSA6IDApOworCWZvciAoaSA9IHN0YXJ0X2l0ZW07IGkgPD0gZW5kX2l0ZW07IGkrKykgeworCQlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSA9IHZuLT52bl92aSArIGk7CisJCWludCBza2lwX2Zyb21fZW5kID0gKChpID09IGVuZF9pdGVtKSA/IGVuZF9ieXRlcyA6IDApOwogCi0JLy8gczFieXRlcwotCXNudW0wMTJbM10gPSBvcF91bml0X251bSAoJnZuLT52bl92aVtzcGxpdF9pdGVtX251bV0pIC0gc251bTAxMlszXSAtIGJ5dGVzX3RvX3IgLSBieXRlc190b19sIC0gYnl0ZXNfdG9fUzJuZXc7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuZWVkZWRfbm9kZXM7CisJCVJGQUxTRShuZWVkZWRfbm9kZXMgPiAzLCAidnMtODEwNTogdG9vIG1hbnkgbm9kZXMgYXJlIG5lZWRlZCIpOworCisJCS8qIGdldCBzaXplIG9mIGN1cnJlbnQgaXRlbSAqLworCQljdXJyZW50X2l0ZW1fc2l6ZSA9IHZpLT52aV9pdGVtX2xlbjsKKworCQkvKiBkbyBub3QgdGFrZSBpbiBjYWxjdWxhdGlvbiBoZWFkIHBhcnQgKGZyb21fYnl0ZXMpIG9mIGZyb20tdGggaXRlbSAqLworCQljdXJyZW50X2l0ZW1fc2l6ZSAtPQorCQkgICAgb3BfcGFydF9zaXplKHZpLCAwIC8qZnJvbSBzdGFydCAqLyAsIHN0YXJ0X2J5dGVzKTsKKworCQkvKiBkbyBub3QgdGFrZSBpbiBjYWxjdWxhdGlvbiB0YWlsIHBhcnQgb2YgbGFzdCBpdGVtICovCisJCWN1cnJlbnRfaXRlbV9zaXplIC09CisJCSAgICBvcF9wYXJ0X3NpemUodmksIDEgLypmcm9tIGVuZCAqLyAsIHNraXBfZnJvbV9lbmQpOworCisJCS8qIGlmIGl0ZW0gZml0cyBpbnRvIGN1cnJlbnQgbm9kZSBlbnRpZXJseSAqLworCQlpZiAodG90YWxfbm9kZV9zaXplICsgY3VycmVudF9pdGVtX3NpemUgPD0gbWF4X25vZGVfc2l6ZSkgeworCQkJc251bTAxMltuZWVkZWRfbm9kZXMgLSAxXSsrOworCQkJdG90YWxfbm9kZV9zaXplICs9IGN1cnJlbnRfaXRlbV9zaXplOworCQkJc3RhcnRfYnl0ZXMgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY3VycmVudF9pdGVtX3NpemUgPiBtYXhfbm9kZV9zaXplKSB7CisJCQkvKiB2aXJ0dWFsIGl0ZW0gbGVuZ3RoIGlzIGxvbmdlciwgdGhhbiBtYXggc2l6ZSBvZiBpdGVtIGluCisJCQkgICBhIG5vZGUuIEl0IGlzIGltcG9zc2libGUgZm9yIGRpcmVjdCBpdGVtICovCisJCQlSRkFMU0UoaXNfZGlyZWN0X2xlX2loKHZpLT52aV9paCksCisJCQkgICAgICAgInZzLTgxMTA6ICIKKwkJCSAgICAgICAiZGlyZWN0IGl0ZW0gbGVuZ3RoIGlzICVkLiBJdCBjYW4gbm90IGJlIGxvbmdlciB0aGFuICVkIiwKKwkJCSAgICAgICBjdXJyZW50X2l0ZW1fc2l6ZSwgbWF4X25vZGVfc2l6ZSk7CisJCQkvKiB3ZSB3aWxsIHRyeSB0byBzcGxpdCBpdCAqLworCQkJZmxvdyA9IDE7CisJCX0KKworCQlpZiAoIWZsb3cpIHsKKwkJCS8qIGFzIHdlIGRvIG5vdCBzcGxpdCBpdGVtcywgdGFrZSBuZXcgbm9kZSBhbmQgY29udGludWUgKi8KKwkJCW5lZWRlZF9ub2RlcysrOworCQkJaS0tOworCQkJdG90YWxfbm9kZV9zaXplID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8vIGNhbGN1bGF0ZSBudW1iZXIgb2YgaXRlbSB1bml0cyB3aGljaCBmaXQgaW50byBub2RlIGJlaW5nCisJCS8vIGZpbGxlZAorCQl7CisJCQlpbnQgZnJlZV9zcGFjZTsKKworCQkJZnJlZV9zcGFjZSA9IG1heF9ub2RlX3NpemUgLSB0b3RhbF9ub2RlX3NpemUgLSBJSF9TSVpFOworCQkJdW5pdHMgPQorCQkJICAgIG9wX2NoZWNrX2xlZnQodmksIGZyZWVfc3BhY2UsIHN0YXJ0X2J5dGVzLAorCQkJCQkgIHNraXBfZnJvbV9lbmQpOworCQkJaWYgKHVuaXRzID09IC0xKSB7CisJCQkJLyogbm90aGluZyBmaXRzIGludG8gY3VycmVudCBub2RlLCB0YWtlIG5ldyBub2RlIGFuZCBjb250aW51ZSAqLworCQkJCW5lZWRlZF9ub2RlcysrLCBpLS0sIHRvdGFsX25vZGVfc2l6ZSA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBzb21ldGhpbmcgZml0cyBpbnRvIHRoZSBjdXJyZW50IG5vZGUgKi8KKwkJLy9pZiAoc251bTAxMlszXSAhPSAtMSB8fCBuZWVkZWRfbm9kZXMgIT0gMSkKKwkJLy8gIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy04MTE1OiBnZXRfbnVtX3ZlcjogdG9vIG1hbnkgbm9kZXMgcmVxdWlyZWQiKTsKKwkJLy9zbnVtMDEyW25lZWRlZF9ub2RlcyAtIDEgKyAzXSA9IG9wX3VuaXRfbnVtICh2aSkgLSBzdGFydF9ieXRlcyAtIHVuaXRzOworCQlzdGFydF9ieXRlcyArPSB1bml0czsKKwkJc251bTAxMltuZWVkZWRfbm9kZXMgLSAxICsgM10gPSB1bml0czsKKworCQlpZiAobmVlZGVkX25vZGVzID4gMikKKwkJCXJlaXNlcmZzX3dhcm5pbmcodGItPnRiX3NiLCAidnMtODExMTogZ2V0X251bV92ZXI6ICIKKwkJCQkJICJzcGxpdF9pdGVtX3Bvc2l0aW9uIGlzIG91dCBvZiBib3VuZGFyeSIpOworCQlzbnVtMDEyW25lZWRlZF9ub2RlcyAtIDFdKys7CisJCXNwbGl0X2l0ZW1fcG9zaXRpb25zW25lZWRlZF9ub2RlcyAtIDFdID0gaTsKKwkJbmVlZGVkX25vZGVzKys7CisJCS8qIGNvbnRpbnVlIGZyb20gdGhlIHNhbWUgaXRlbSB3aXRoIHN0YXJ0X2J5dGVzICE9IC0xICovCisJCXN0YXJ0X2l0ZW0gPSBpOworCQlpLS07CisJCXRvdGFsX25vZGVfc2l6ZSA9IDA7CisJfQorCisJLy8gc3VtMDEyWzRdIChpZiBpdCBpcyBub3QgLTEpIGNvbnRhaW5zIG51bWJlciBvZiB1bml0cyBvZiB3aGljaAorCS8vIGFyZSB0byBiZSBpbiBTMW5ldywgc251bTAxMlszXSAtIHRvIGJlIGluIFMwLiBUaGV5IGFyZSBzdXBwb3NlZAorCS8vIHRvIGJlIFMxYnl0ZXMgYW5kIFMyYnl0ZXMgY29ycmVzcG9uZGluZ2x5LCBzbyByZWNhbGN1bGF0ZQorCWlmIChzbnVtMDEyWzRdID4gMCkgeworCQlpbnQgc3BsaXRfaXRlbV9udW07CisJCWludCBieXRlc190b19yLCBieXRlc190b19sOworCQlpbnQgYnl0ZXNfdG9fUzFuZXc7CisKKwkJc3BsaXRfaXRlbV9udW0gPSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXTsKKwkJYnl0ZXNfdG9fbCA9CisJCSAgICAoKGZyb20gPT0gc3BsaXRfaXRlbV9udW0KKwkJICAgICAgJiYgZnJvbV9ieXRlcyAhPSAtMSkgPyBmcm9tX2J5dGVzIDogMCk7CisJCWJ5dGVzX3RvX3IgPQorCQkgICAgKChlbmRfaXRlbSA9PSBzcGxpdF9pdGVtX251bQorCQkgICAgICAmJiBlbmRfYnl0ZXMgIT0gLTEpID8gZW5kX2J5dGVzIDogMCk7CisJCWJ5dGVzX3RvX1MxbmV3ID0KKwkJICAgICgoc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF0gPT0KKwkJICAgICAgc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV0pID8gc251bTAxMlszXSA6IDApOworCisJCS8vIHMyYnl0ZXMKKwkJc251bTAxMls0XSA9CisJCSAgICBvcF91bml0X251bSgmdm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXSkgLSBzbnVtMDEyWzRdIC0KKwkJICAgIGJ5dGVzX3RvX3IgLSBieXRlc190b19sIC0gYnl0ZXNfdG9fUzFuZXc7CisKKwkJaWYgKHZuLT52bl92aVtzcGxpdF9pdGVtX251bV0udmlfaW5kZXggIT0gVFlQRV9ESVJFTlRSWSAmJgorCQkgICAgdm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXS52aV9pbmRleCAhPSBUWVBFX0lORElSRUNUKQorCQkJcmVpc2VyZnNfd2FybmluZyh0Yi0+dGJfc2IsICJ2cy04MTE1OiBnZXRfbnVtX3Zlcjogbm90ICIKKwkJCQkJICJkaXJlY3Rvcnkgb3IgaW5kaXJlY3QgaXRlbSIpOworCX0KKworCS8qIG5vdyB3ZSBrbm93IFMyYnl0ZXMsIGNhbGN1bGF0ZSBTMWJ5dGVzICovCisJaWYgKHNudW0wMTJbM10gPiAwKSB7CisJCWludCBzcGxpdF9pdGVtX251bTsKKwkJaW50IGJ5dGVzX3RvX3IsIGJ5dGVzX3RvX2w7CisJCWludCBieXRlc190b19TMm5ldzsKKworCQlzcGxpdF9pdGVtX251bSA9IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdOworCQlieXRlc190b19sID0KKwkJICAgICgoZnJvbSA9PSBzcGxpdF9pdGVtX251bQorCQkgICAgICAmJiBmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKKwkJYnl0ZXNfdG9fciA9CisJCSAgICAoKGVuZF9pdGVtID09IHNwbGl0X2l0ZW1fbnVtCisJCSAgICAgICYmIGVuZF9ieXRlcyAhPSAtMSkgPyBlbmRfYnl0ZXMgOiAwKTsKKwkJYnl0ZXNfdG9fUzJuZXcgPQorCQkgICAgKChzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9PSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXQorCQkgICAgICAmJiBzbnVtMDEyWzRdICE9IC0xKSA/IHNudW0wMTJbNF0gOiAwKTsKKworCQkvLyBzMWJ5dGVzCisJCXNudW0wMTJbM10gPQorCQkgICAgb3BfdW5pdF9udW0oJnZuLT52bl92aVtzcGxpdF9pdGVtX251bV0pIC0gc251bTAxMlszXSAtCisJCSAgICBieXRlc190b19yIC0gYnl0ZXNfdG9fbCAtIGJ5dGVzX3RvX1MybmV3OworCX0KKworCXJldHVybiBuZWVkZWRfbm9kZXM7CiB9CiAKLQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBjdXJfdGI7CitleHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqY3VyX3RiOwogI2VuZGlmCiAKLQogLyogU2V0IHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZy4KICAqIFBlcmZvcm1zIHdyaXRlIG9mIHJlc3VsdHMgb2YgYW5hbHlzaXMgb2YgYmFsYW5jaW5nIGludG8gc3RydWN0dXJlIHRiLAogICogd2hlcmUgaXQgd2lsbCBsYXRlciBiZSB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBkbyB0aGUgYmFsYW5jaW5nLiAKQEAgLTU1NywxMzIgKzU4NywxMzEgQEAKICAqCXMxYnl0ZXMJbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICh0aGlzIG51bWJlciBpcyBjb250YWluZWQgaW4gczAxMiBhcnJheSkKICAqLwogCi1zdGF0aWMgdm9pZCBzZXRfcGFyYW1ldGVycyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCwgaW50IGxudW0sCi0JCQkgICAgaW50IHJudW0sIGludCBibGtfbnVtLCBzaG9ydCAqIHMwMTIsIGludCBsYiwgaW50IHJiKQorc3RhdGljIHZvaWQgc2V0X3BhcmFtZXRlcnMoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoLCBpbnQgbG51bSwKKwkJCSAgIGludCBybnVtLCBpbnQgYmxrX251bSwgc2hvcnQgKnMwMTIsIGludCBsYiwgaW50IHJiKQogewogCi0gIHRiLT5sbnVtW2hdID0gbG51bTsKLSAgdGItPnJudW1baF0gPSBybnVtOwotICB0Yi0+YmxrbnVtW2hdID0gYmxrX251bTsKKwl0Yi0+bG51bVtoXSA9IGxudW07CisJdGItPnJudW1baF0gPSBybnVtOworCXRiLT5ibGtudW1baF0gPSBibGtfbnVtOwogCi0gIGlmIChoID09IDApCi0gICAgeyAgLyogb25seSBmb3IgbGVhZiBsZXZlbCAqLwotICAgICAgaWYgKHMwMTIgIT0gTlVMTCkKLQl7Ci0JICB0Yi0+czBudW0gPSAqIHMwMTIgKyssCi0JICB0Yi0+czFudW0gPSAqIHMwMTIgKyssCi0JICB0Yi0+czJudW0gPSAqIHMwMTIgKys7Ci0JICB0Yi0+czFieXRlcyA9ICogczAxMiArKzsKLQkgIHRiLT5zMmJ5dGVzID0gKiBzMDEyOworCWlmIChoID09IDApIHsJCS8qIG9ubHkgZm9yIGxlYWYgbGV2ZWwgKi8KKwkJaWYgKHMwMTIgIT0gTlVMTCkgeworCQkJdGItPnMwbnVtID0gKnMwMTIrKywKKwkJCSAgICB0Yi0+czFudW0gPSAqczAxMisrLCB0Yi0+czJudW0gPSAqczAxMisrOworCQkJdGItPnMxYnl0ZXMgPSAqczAxMisrOworCQkJdGItPnMyYnl0ZXMgPSAqczAxMjsKKwkJfQorCQl0Yi0+bGJ5dGVzID0gbGI7CisJCXRiLT5yYnl0ZXMgPSByYjsKIAl9Ci0gICAgICB0Yi0+bGJ5dGVzID0gbGI7Ci0gICAgICB0Yi0+cmJ5dGVzID0gcmI7Ci0gICAgfQotICBQUk9DX0lORk9fQUREKCB0YiAtPiB0Yl9zYiwgbG51bVsgaCBdLCBsbnVtICk7Ci0gIFBST0NfSU5GT19BREQoIHRiIC0+IHRiX3NiLCBybnVtWyBoIF0sIHJudW0gKTsKKwlQUk9DX0lORk9fQUREKHRiLT50Yl9zYiwgbG51bVtoXSwgbG51bSk7CisJUFJPQ19JTkZPX0FERCh0Yi0+dGJfc2IsIHJudW1baF0sIHJudW0pOwogCi0gIFBST0NfSU5GT19BREQoIHRiIC0+IHRiX3NiLCBsYnl0ZXNbIGggXSwgbGIgKTsKLSAgUFJPQ19JTkZPX0FERCggdGIgLT4gdGJfc2IsIHJieXRlc1sgaCBdLCByYiApOworCVBST0NfSU5GT19BREQodGItPnRiX3NiLCBsYnl0ZXNbaF0sIGxiKTsKKwlQUk9DX0lORk9fQUREKHRiLT50Yl9zYiwgcmJ5dGVzW2hdLCByYik7CiB9CiAKLQotCiAvKiBjaGVjaywgZG9lcyBub2RlIGRpc2FwcGVhciBpZiB3ZSBzaGlmdCB0Yi0+bG51bVswXSBpdGVtcyB0byBsZWZ0CiAgICBuZWlnaGJvciBhbmQgdGItPnJudW1bMF0gdG8gdGhlIHJpZ2h0IG9uZS4gKi8KLXN0YXRpYyBpbnQgaXNfbGVhZl9yZW1vdmFibGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3N0YXRpYyBpbnQgaXNfbGVhZl9yZW1vdmFibGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKLSAgaW50IHRvX2xlZnQsIHRvX3JpZ2h0OwotICBpbnQgc2l6ZTsKLSAgaW50IHJlbWFpbl9pdGVtczsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlpbnQgdG9fbGVmdCwgdG9fcmlnaHQ7CisJaW50IHNpemU7CisJaW50IHJlbWFpbl9pdGVtczsKIAotICAvKiBudW1iZXIgb2YgaXRlbXMsIHRoYXQgd2lsbCBiZSBzaGlmdGVkIHRvIGxlZnQgKHJpZ2h0KSBuZWlnaGJvcgotICAgICBlbnRpcmVseSAqLwotICB0b19sZWZ0ID0gdGItPmxudW1bMF0gLSAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApOwotICB0b19yaWdodCA9IHRiLT5ybnVtWzBdIC0gKCh0Yi0+cmJ5dGVzICE9IC0xKSA/IDEgOiAwKTsKLSAgcmVtYWluX2l0ZW1zID0gdm4tPnZuX25yX2l0ZW07CisJLyogbnVtYmVyIG9mIGl0ZW1zLCB0aGF0IHdpbGwgYmUgc2hpZnRlZCB0byBsZWZ0IChyaWdodCkgbmVpZ2hib3IKKwkgICBlbnRpcmVseSAqLworCXRvX2xlZnQgPSB0Yi0+bG51bVswXSAtICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCk7CisJdG9fcmlnaHQgPSB0Yi0+cm51bVswXSAtICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCk7CisJcmVtYWluX2l0ZW1zID0gdm4tPnZuX25yX2l0ZW07CiAKLSAgLyogaG93IG1hbnkgaXRlbXMgcmVtYWluIGluIFNbMF0gYWZ0ZXIgc2hpZnRpbmdzIHRvIG5laWdoYm9ycyAqLwotICByZW1haW5faXRlbXMgLT0gKHRvX2xlZnQgKyB0b19yaWdodCk7CisJLyogaG93IG1hbnkgaXRlbXMgcmVtYWluIGluIFNbMF0gYWZ0ZXIgc2hpZnRpbmdzIHRvIG5laWdoYm9ycyAqLworCXJlbWFpbl9pdGVtcyAtPSAodG9fbGVmdCArIHRvX3JpZ2h0KTsKIAotICBpZiAocmVtYWluX2l0ZW1zIDwgMSkgewotICAgIC8qIGFsbCBjb250ZW50IG9mIG5vZGUgY2FuIGJlIHNoaWZ0ZWQgdG8gbmVpZ2hib3JzICovCi0gICAgc2V0X3BhcmFtZXRlcnMgKHRiLCAwLCB0b19sZWZ0LCB2bi0+dm5fbnJfaXRlbSAtIHRvX2xlZnQsIDAsIE5VTEwsIC0xLCAtMSk7ICAgIAotICAgIHJldHVybiAxOwotICB9Ci0gIAotICBpZiAocmVtYWluX2l0ZW1zID4gMSB8fCB0Yi0+bGJ5dGVzID09IC0xIHx8IHRiLT5yYnl0ZXMgPT0gLTEpCi0gICAgLyogU1swXSBpcyBub3QgcmVtb3ZhYmxlICovCi0gICAgcmV0dXJuIDA7CisJaWYgKHJlbWFpbl9pdGVtcyA8IDEpIHsKKwkJLyogYWxsIGNvbnRlbnQgb2Ygbm9kZSBjYW4gYmUgc2hpZnRlZCB0byBuZWlnaGJvcnMgKi8KKwkJc2V0X3BhcmFtZXRlcnModGIsIDAsIHRvX2xlZnQsIHZuLT52bl9ucl9pdGVtIC0gdG9fbGVmdCwgMCwKKwkJCSAgICAgICBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gMTsKKwl9CiAKLSAgLyogY2hlY2ssIHdoZXRoZXIgd2UgY2FuIGRpdmlkZSAxIHJlbWFpbmluZyBpdGVtIGJldHdlZW4gbmVpZ2hib3JzICovCisJaWYgKHJlbWFpbl9pdGVtcyA+IDEgfHwgdGItPmxieXRlcyA9PSAtMSB8fCB0Yi0+cmJ5dGVzID09IC0xKQorCQkvKiBTWzBdIGlzIG5vdCByZW1vdmFibGUgKi8KKwkJcmV0dXJuIDA7CiAKLSAgLyogZ2V0IHNpemUgb2YgcmVtYWluaW5nIGl0ZW0gKGluIGl0ZW0gdW5pdHMpICovCi0gIHNpemUgPSBvcF91bml0X251bSAoJih2bi0+dm5fdmlbdG9fbGVmdF0pKTsKKwkvKiBjaGVjaywgd2hldGhlciB3ZSBjYW4gZGl2aWRlIDEgcmVtYWluaW5nIGl0ZW0gYmV0d2VlbiBuZWlnaGJvcnMgKi8KIAotICBpZiAodGItPmxieXRlcyArIHRiLT5yYnl0ZXMgPj0gc2l6ZSkgewotICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgMCwgdG9fbGVmdCArIDEsIHRvX3JpZ2h0ICsgMSwgMCwgTlVMTCwgdGItPmxieXRlcywgLTEpOwotICAgIHJldHVybiAxOwotICB9CisJLyogZ2V0IHNpemUgb2YgcmVtYWluaW5nIGl0ZW0gKGluIGl0ZW0gdW5pdHMpICovCisJc2l6ZSA9IG9wX3VuaXRfbnVtKCYodm4tPnZuX3ZpW3RvX2xlZnRdKSk7CiAKLSAgcmV0dXJuIDA7CisJaWYgKHRiLT5sYnl0ZXMgKyB0Yi0+cmJ5dGVzID49IHNpemUpIHsKKwkJc2V0X3BhcmFtZXRlcnModGIsIDAsIHRvX2xlZnQgKyAxLCB0b19yaWdodCArIDEsIDAsIE5VTEwsCisJCQkgICAgICAgdGItPmxieXRlcywgLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAotCiAvKiBjaGVjayB3aGV0aGVyIEwsIFMsIFIgY2FuIGJlIGpvaW5lZCBpbiBvbmUgbm9kZSAqLwotc3RhdGljIGludCBhcmVfbGVhdmVzX3JlbW92YWJsZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgbGZyZWUsIGludCByZnJlZSkKK3N0YXRpYyBpbnQgYXJlX2xlYXZlc19yZW1vdmFibGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBsZnJlZSwgaW50IHJmcmVlKQogewotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gIGludCBpaF9zaXplOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlMwOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOworCWludCBpaF9zaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqUzA7CiAKLSAgUzAgPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIDApOworCVMwID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApOwogCi0gIGloX3NpemUgPSAwOwotICBpZiAodm4tPnZuX25yX2l0ZW0pIHsKLSAgICBpZiAodm4tPnZuX3ZpWzBdLnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQotICAgICAgaWhfc2l6ZSArPSBJSF9TSVpFOwotICAgIAotCWlmICh2bi0+dm5fdmlbdm4tPnZuX25yX2l0ZW0tMV0udmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKQotCSAgICBpaF9zaXplICs9IElIX1NJWkU7Ci0gICAgfSBlbHNlIHsKLQkvKiB0aGVyZSB3YXMgb25seSBvbmUgaXRlbSBhbmQgaXQgd2lsbCBiZSBkZWxldGVkICovCi0Jc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIAotICAgIFJGQUxTRSggQl9OUl9JVEVNUyAoUzApICE9IDEsCi0JICAgICJ2cy04MTI1OiBpdGVtIG51bWJlciBtdXN0IGJlIDE6IGl0IGlzICVkIiwgQl9OUl9JVEVNUyhTMCkpOworCWloX3NpemUgPSAwOworCWlmICh2bi0+dm5fbnJfaXRlbSkgeworCQlpZiAodm4tPnZuX3ZpWzBdLnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQorCQkJaWhfc2l6ZSArPSBJSF9TSVpFOwogCi0gICAgaWggPSBCX05fUElURU1fSEVBRCAoUzAsIDApOwotICAgIGlmICh0Yi0+Q0ZSWzBdICYmICFjb21wX3Nob3J0X2xlX2tleXMgKCYoaWgtPmloX2tleSksIEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSkpKQotCWlmIChpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7Ci0JICAgIC8qIERpcmVjdG9yeSBtdXN0IGJlIGluIGNvcnJlY3Qgc3RhdGUgaGVyZTogdGhhdCBpcwotCSAgICAgICBzb21ld2hlcmUgYXQgdGhlIGxlZnQgc2lkZSBzaG91bGQgZXhpc3QgZmlyc3QgZGlyZWN0b3J5Ci0JICAgICAgIGl0ZW0uIEJ1dCB0aGUgaXRlbSBiZWluZyBkZWxldGVkIGNhbiBub3QgYmUgdGhhdCBmaXJzdAotCSAgICAgICBvbmUgYmVjYXVzZSBpdHMgcmlnaHQgbmVpZ2hib3IgaXMgaXRlbSBvZiB0aGUgc2FtZQotCSAgICAgICBkaXJlY3RvcnkuIChCdXQgZmlyc3QgaXRlbSBhbHdheXMgZ2V0cyBkZWxldGVkIGluIGxhc3QKLQkgICAgICAgdHVybikuIFNvLCBuZWlnaGJvcnMgb2YgZGVsZXRlZCBpdGVtIGNhbiBiZSBtZXJnZWQsIHNvCi0JICAgICAgIHdlIGNhbiBzYXZlIGloX3NpemUgKi8KLQkgICAgaWhfc2l6ZSA9IElIX1NJWkU7Ci0JICAgIAotCSAgICAvKiB3ZSBtaWdodCBjaGVjayB0aGF0IGxlZnQgbmVpZ2hib3IgZXhpc3RzIGFuZCBpcyBvZiB0aGUKLQkgICAgICAgc2FtZSBkaXJlY3RvcnkgKi8KLQkgICAgUkZBTFNFKGxlX2loX2tfb2Zmc2V0IChpaCkgPT0gRE9UX09GRlNFVCwKLQkJInZzLTgxMzA6IGZpcnN0IGRpcmVjdG9yeSBpdGVtIGNhbiBub3QgYmUgcmVtb3ZlZCB1bnRpbCBkaXJlY3RvcnkgaXMgbm90IGVtcHR5Iik7Ci0gICAgICB9Ci0gICAgCi0gIH0KKwkJaWYgKHZuLT52bl92aVt2bi0+dm5fbnJfaXRlbSAtIDFdLgorCQkgICAgdmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKQorCQkJaWhfc2l6ZSArPSBJSF9TSVpFOworCX0gZWxzZSB7CisJCS8qIHRoZXJlIHdhcyBvbmx5IG9uZSBpdGVtIGFuZCBpdCB3aWxsIGJlIGRlbGV0ZWQgKi8KKwkJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgaWYgKE1BWF9DSElMRF9TSVpFIChTMCkgKyB2bi0+dm5fc2l6ZSA8PSByZnJlZSArIGxmcmVlICsgaWhfc2l6ZSkgewotICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgMCwgLTEsIC0xLCAtMSwgTlVMTCwgLTEsIC0xKTsKLSAgICBQUk9DX0lORk9fSU5DKCB0YiAtPiB0Yl9zYiwgbGVhdmVzX3JlbW92YWJsZSApOwotICAgIHJldHVybiAxOyAgCi0gIH0KLSAgcmV0dXJuIDA7Ci0gIAorCQlSRkFMU0UoQl9OUl9JVEVNUyhTMCkgIT0gMSwKKwkJICAgICAgICJ2cy04MTI1OiBpdGVtIG51bWJlciBtdXN0IGJlIDE6IGl0IGlzICVkIiwKKwkJICAgICAgIEJfTlJfSVRFTVMoUzApKTsKKworCQlpaCA9IEJfTl9QSVRFTV9IRUFEKFMwLCAwKTsKKwkJaWYgKHRiLT5DRlJbMF0KKwkJICAgICYmICFjb21wX3Nob3J0X2xlX2tleXMoJihpaC0+aWhfa2V5KSwKKwkJCQkJICAgQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSwKKwkJCQkJCQkgIHRiLT5ya2V5WzBdKSkpCisJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWgpKSB7CisJCQkJLyogRGlyZWN0b3J5IG11c3QgYmUgaW4gY29ycmVjdCBzdGF0ZSBoZXJlOiB0aGF0IGlzCisJCQkJICAgc29tZXdoZXJlIGF0IHRoZSBsZWZ0IHNpZGUgc2hvdWxkIGV4aXN0IGZpcnN0IGRpcmVjdG9yeQorCQkJCSAgIGl0ZW0uIEJ1dCB0aGUgaXRlbSBiZWluZyBkZWxldGVkIGNhbiBub3QgYmUgdGhhdCBmaXJzdAorCQkJCSAgIG9uZSBiZWNhdXNlIGl0cyByaWdodCBuZWlnaGJvciBpcyBpdGVtIG9mIHRoZSBzYW1lCisJCQkJICAgZGlyZWN0b3J5LiAoQnV0IGZpcnN0IGl0ZW0gYWx3YXlzIGdldHMgZGVsZXRlZCBpbiBsYXN0CisJCQkJICAgdHVybikuIFNvLCBuZWlnaGJvcnMgb2YgZGVsZXRlZCBpdGVtIGNhbiBiZSBtZXJnZWQsIHNvCisJCQkJICAgd2UgY2FuIHNhdmUgaWhfc2l6ZSAqLworCQkJCWloX3NpemUgPSBJSF9TSVpFOworCisJCQkJLyogd2UgbWlnaHQgY2hlY2sgdGhhdCBsZWZ0IG5laWdoYm9yIGV4aXN0cyBhbmQgaXMgb2YgdGhlCisJCQkJICAgc2FtZSBkaXJlY3RvcnkgKi8KKwkJCQlSRkFMU0UobGVfaWhfa19vZmZzZXQoaWgpID09IERPVF9PRkZTRVQsCisJCQkJICAgICAgICJ2cy04MTMwOiBmaXJzdCBkaXJlY3RvcnkgaXRlbSBjYW4gbm90IGJlIHJlbW92ZWQgdW50aWwgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eSIpOworCQkJfQorCisJfQorCisJaWYgKE1BWF9DSElMRF9TSVpFKFMwKSArIHZuLT52bl9zaXplIDw9IHJmcmVlICsgbGZyZWUgKyBpaF9zaXplKSB7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCAwLCAtMSwgLTEsIC0xLCBOVUxMLCAtMSwgLTEpOworCQlQUk9DX0lORk9fSU5DKHRiLT50Yl9zYiwgbGVhdmVzX3JlbW92YWJsZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKwogfQogCi0KLQogLyogd2hlbiB3ZSBkbyBub3Qgc3BsaXQgaXRlbSwgbG51bSBhbmQgcm51bSBhcmUgbnVtYmVycyBvZiBlbnRpcmUgaXRlbXMgKi8KICNkZWZpbmUgU0VUX1BBUl9TSElGVF9MRUZUIFwKIGlmIChoKVwKQEAgLTcwNCw3ICs3MzMsNiBAQAogCQkgICAgIC0xLCAtMSk7XAogfQogCi0KICNkZWZpbmUgU0VUX1BBUl9TSElGVF9SSUdIVCBcCiBpZiAoaClcCiB7XApAQCAtNzI0LDIxNCArNzUyLDE5OSBAQAogCQkgIC0xLCAtMSk7XAogfQogCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcnNfaW5fdGIoc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiKQoreworCWludCBuX2NvdW50ZXI7CiAKLXN0YXRpYyB2b2lkIGZyZWVfYnVmZmVyc19pbl90YiAoCi0JCSAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiCi0JCSAgICAgICApIHsKLSAgaW50IG5fY291bnRlcjsKKwlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3NfdGItPnRiX3BhdGgpOwogCi0gIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHBfc190Yi0+dGJfcGF0aCk7Ci0gIAotICBmb3IgKCBuX2NvdW50ZXIgPSAwOyBuX2NvdW50ZXIgPCBNQVhfSEVJR0hUOyBuX2NvdW50ZXIrKyApIHsKLSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+TFtuX2NvdW50ZXJdKTsKLSAgICBwX3NfdGItPkxbbl9jb3VudGVyXSA9IE5VTEw7Ci0gICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPlJbbl9jb3VudGVyXSk7Ci0gICAgcF9zX3RiLT5SW25fY291bnRlcl0gPSBOVUxMOwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GTFtuX2NvdW50ZXJdKTsKLSAgICBwX3NfdGItPkZMW25fY291bnRlcl0gPSBOVUxMOwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GUltuX2NvdW50ZXJdKTsKLSAgICBwX3NfdGItPkZSW25fY291bnRlcl0gPSBOVUxMOwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9jb3VudGVyXSk7Ci0gICAgcF9zX3RiLT5DRkxbbl9jb3VudGVyXSA9IE5VTEw7Ci0gICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGUltuX2NvdW50ZXJdKTsKLSAgICBwX3NfdGItPkNGUltuX2NvdW50ZXJdID0gTlVMTDsKLSAgfQorCWZvciAobl9jb3VudGVyID0gMDsgbl9jb3VudGVyIDwgTUFYX0hFSUdIVDsgbl9jb3VudGVyKyspIHsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkxbbl9jb3VudGVyXSk7CisJCXBfc190Yi0+TFtuX2NvdW50ZXJdID0gTlVMTDsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPlJbbl9jb3VudGVyXSk7CisJCXBfc190Yi0+UltuX2NvdW50ZXJdID0gTlVMTDsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZMW25fY291bnRlcl0pOworCQlwX3NfdGItPkZMW25fY291bnRlcl0gPSBOVUxMOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9jb3VudGVyXSk7CisJCXBfc190Yi0+RlJbbl9jb3VudGVyXSA9IE5VTEw7CisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9jb3VudGVyXSk7CisJCXBfc190Yi0+Q0ZMW25fY291bnRlcl0gPSBOVUxMOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZSW25fY291bnRlcl0pOworCQlwX3NfdGItPkNGUltuX2NvdW50ZXJdID0gTlVMTDsKKwl9CiB9CiAKLQogLyogR2V0IG5ldyBidWZmZXJzIGZvciBzdG9yaW5nIG5ldyBub2RlcyB0aGF0IGFyZSBjcmVhdGVkIHdoaWxlIGJhbGFuY2luZy4KICAqIFJldHVybnM6CVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgQ0FSUllfT04gLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgTk9fRElTS19TUEFDRSAtIG5vIGRpc2sgc3BhY2UuCiAgKi8KIC8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KLXN0YXRpYyBpbnQgIGdldF9lbXB0eV9ub2RlcygKLSAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKLSAgICAgICAgICAgICAgaW50IG5faAotICAgICAgICAgICAgKSB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfbmV3X2JoLAotICAgIAkJICAgICAgKglwX3NfU2ggPSBQQVRIX0hfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBuX2gpOwotICBiX2Jsb2NrbnJfdAkgICAgICAqCXBfbl9ibG9ja25yLAotICAgIAkJCWFfbl9ibG9ja25yc1tNQVhfQU1PVU5UX05FRURFRF0gPSB7MCwgfTsKLSAgaW50ICAgICAgIAkJbl9jb3VudGVyLAotICAgCQkJbl9udW1iZXJfb2ZfZnJlZWJsaywKLSAgICAgICAgICAgICAgICAJbl9hbW91bnRfbmVlZGVkLC8qIG51bWJlciBvZiBuZWVkZWQgZW1wdHkgYmxvY2tzICovCi0JCQluX3JldHZhbCA9IENBUlJZX09OOwotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKglwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOworc3RhdGljIGludCBnZXRfZW1wdHlfbm9kZXMoc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLCBpbnQgbl9oKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX25ld19iaCwKKwkgICAgKnBfc19TaCA9IFBBVEhfSF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKKwliX2Jsb2NrbnJfdCAqcF9uX2Jsb2NrbnIsIGFfbl9ibG9ja25yc1tNQVhfQU1PVU5UX05FRURFRF0gPSB7IDAsIH07CisJaW50IG5fY291bnRlciwgbl9udW1iZXJfb2ZfZnJlZWJsaywgbl9hbW91bnRfbmVlZGVkLAkvKiBudW1iZXIgb2YgbmVlZGVkIGVtcHR5IGJsb2NrcyAqLworCSBuX3JldHZhbCA9IENBUlJZX09OOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKIAorCS8qIG51bWJlcl9vZl9mcmVlYmxrIGlzIHRoZSBudW1iZXIgb2YgZW1wdHkgYmxvY2tzIHdoaWNoIGhhdmUgYmVlbgorCSAgIGFjcXVpcmVkIGZvciB1c2UgYnkgdGhlIGJhbGFuY2luZyBhbGdvcml0aG0gbWludXMgdGhlIG51bWJlciBvZgorCSAgIGVtcHR5IGJsb2NrcyB1c2VkIGluIHRoZSBwcmV2aW91cyBsZXZlbHMgb2YgdGhlIGFuYWx5c2lzLAorCSAgIG51bWJlcl9vZl9mcmVlYmxrID0gdGItPmN1cl9ibGtudW0gY2FuIGJlIG5vbi16ZXJvIGlmIGEgc2NoZWR1bGUgb2NjdXJzCisJICAgYWZ0ZXIgZW1wdHkgYmxvY2tzIGFyZSBhY3F1aXJlZCwgYW5kIHRoZSBiYWxhbmNpbmcgYW5hbHlzaXMgaXMKKwkgICB0aGVuIHJlc3RhcnRlZCwgYW1vdW50X25lZWRlZCBpcyB0aGUgbnVtYmVyIG5lZWRlZCBieSB0aGlzIGxldmVsCisJICAgKG5faCkgb2YgdGhlIGJhbGFuY2luZyBhbmFseXNpcy4KIAotICAvKiBudW1iZXJfb2ZfZnJlZWJsayBpcyB0aGUgbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyB3aGljaCBoYXZlIGJlZW4KLSAgICAgYWNxdWlyZWQgZm9yIHVzZSBieSB0aGUgYmFsYW5jaW5nIGFsZ29yaXRobSBtaW51cyB0aGUgbnVtYmVyIG9mCi0gICAgIGVtcHR5IGJsb2NrcyB1c2VkIGluIHRoZSBwcmV2aW91cyBsZXZlbHMgb2YgdGhlIGFuYWx5c2lzLAotICAgICBudW1iZXJfb2ZfZnJlZWJsayA9IHRiLT5jdXJfYmxrbnVtIGNhbiBiZSBub24temVybyBpZiBhIHNjaGVkdWxlIG9jY3VycwotICAgICBhZnRlciBlbXB0eSBibG9ja3MgYXJlIGFjcXVpcmVkLCBhbmQgdGhlIGJhbGFuY2luZyBhbmFseXNpcyBpcwotICAgICB0aGVuIHJlc3RhcnRlZCwgYW1vdW50X25lZWRlZCBpcyB0aGUgbnVtYmVyIG5lZWRlZCBieSB0aGlzIGxldmVsCi0gICAgIChuX2gpIG9mIHRoZSBiYWxhbmNpbmcgYW5hbHlzaXMuCi0JCQkgICAgCi0gICAgIE5vdGUgdGhhdCBmb3Igc3lzdGVtcyB3aXRoIG1hbnkgcHJvY2Vzc2VzIHdyaXRpbmcsIGl0IHdvdWxkIGJlCi0gICAgIG1vcmUgbGF5b3V0IG9wdGltYWwgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgbmVlZGVkIGJ5IGFsbAotICAgICBsZXZlbHMgYW5kIHRoZW4gdG8gcnVuIHJlaXNlcmZzX25ld19ibG9ja3MgdG8gZ2V0IGFsbCBvZiB0aGVtIGF0IG9uY2UuICAqLworCSAgIE5vdGUgdGhhdCBmb3Igc3lzdGVtcyB3aXRoIG1hbnkgcHJvY2Vzc2VzIHdyaXRpbmcsIGl0IHdvdWxkIGJlCisJICAgbW9yZSBsYXlvdXQgb3B0aW1hbCB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBuZWVkZWQgYnkgYWxsCisJICAgbGV2ZWxzIGFuZCB0aGVuIHRvIHJ1biByZWlzZXJmc19uZXdfYmxvY2tzIHRvIGdldCBhbGwgb2YgdGhlbSBhdCBvbmNlLiAgKi8KIAotICAvKiBJbml0aWF0ZSBudW1iZXJfb2ZfZnJlZWJsayB0byB0aGUgYW1vdW50IGFjcXVpcmVkIHByaW9yIHRvIHRoZSByZXN0YXJ0IG9mCi0gICAgIHRoZSBhbmFseXNpcyBvciAwIGlmIG5vdCByZXN0YXJ0ZWQsIHRoZW4gc3VidHJhY3QgdGhlIGFtb3VudCBuZWVkZWQKLSAgICAgYnkgYWxsIG9mIHRoZSBsZXZlbHMgb2YgdGhlIHRyZWUgYmVsb3cgbl9oLiAqLwotICAvKiBibGtudW0gaW5jbHVkZXMgU1tuX2hdLCBzbyB3ZSBzdWJ0cmFjdCAxIGluIHRoaXMgY2FsY3VsYXRpb24gKi8KLSAgZm9yICggbl9jb3VudGVyID0gMCwgbl9udW1iZXJfb2ZfZnJlZWJsayA9IHBfc190Yi0+Y3VyX2Jsa251bTsgbl9jb3VudGVyIDwgbl9oOyBuX2NvdW50ZXIrKyApCi0gICAgbl9udW1iZXJfb2ZfZnJlZWJsayAtPSAoIHBfc190Yi0+YmxrbnVtW25fY291bnRlcl0gKSA/IChwX3NfdGItPmJsa251bVtuX2NvdW50ZXJdIC0gMSkgOiAwOworCS8qIEluaXRpYXRlIG51bWJlcl9vZl9mcmVlYmxrIHRvIHRoZSBhbW91bnQgYWNxdWlyZWQgcHJpb3IgdG8gdGhlIHJlc3RhcnQgb2YKKwkgICB0aGUgYW5hbHlzaXMgb3IgMCBpZiBub3QgcmVzdGFydGVkLCB0aGVuIHN1YnRyYWN0IHRoZSBhbW91bnQgbmVlZGVkCisJICAgYnkgYWxsIG9mIHRoZSBsZXZlbHMgb2YgdGhlIHRyZWUgYmVsb3cgbl9oLiAqLworCS8qIGJsa251bSBpbmNsdWRlcyBTW25faF0sIHNvIHdlIHN1YnRyYWN0IDEgaW4gdGhpcyBjYWxjdWxhdGlvbiAqLworCWZvciAobl9jb3VudGVyID0gMCwgbl9udW1iZXJfb2ZfZnJlZWJsayA9IHBfc190Yi0+Y3VyX2Jsa251bTsKKwkgICAgIG5fY291bnRlciA8IG5faDsgbl9jb3VudGVyKyspCisJCW5fbnVtYmVyX29mX2ZyZWVibGsgLT0KKwkJICAgIChwX3NfdGItPmJsa251bVtuX2NvdW50ZXJdKSA/IChwX3NfdGItPmJsa251bVtuX2NvdW50ZXJdIC0KKwkJCQkJCSAgIDEpIDogMDsKIAotICAvKiBBbGxvY2F0ZSBtaXNzaW5nIGVtcHR5IGJsb2Nrcy4gKi8KLSAgLyogaWYgcF9zX1NoID09IDAgIHRoZW4gd2UgYXJlIGdldHRpbmcgYSBuZXcgcm9vdCAqLwotICBuX2Ftb3VudF9uZWVkZWQgPSAoIHBfc19TaCApID8gKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKSA6IDE7Ci0gIC8qICBBbW91bnRfbmVlZGVkID0gdGhlIGFtb3VudCB0aGF0IHdlIG5lZWQgbW9yZSB0aGFuIHRoZSBhbW91bnQgdGhhdCB3ZSBoYXZlLiAqLwotICBpZiAoIG5fYW1vdW50X25lZWRlZCA+IG5fbnVtYmVyX29mX2ZyZWVibGsgKQotICAgIG5fYW1vdW50X25lZWRlZCAtPSBuX251bWJlcl9vZl9mcmVlYmxrOwotICBlbHNlIC8qIElmIHdlIGhhdmUgZW5vdWdoIGFscmVhZHkgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLwotICAgIHJldHVybiBDQVJSWV9PTjsKKwkvKiBBbGxvY2F0ZSBtaXNzaW5nIGVtcHR5IGJsb2Nrcy4gKi8KKwkvKiBpZiBwX3NfU2ggPT0gMCAgdGhlbiB3ZSBhcmUgZ2V0dGluZyBhIG5ldyByb290ICovCisJbl9hbW91bnRfbmVlZGVkID0gKHBfc19TaCkgPyAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpIDogMTsKKwkvKiAgQW1vdW50X25lZWRlZCA9IHRoZSBhbW91bnQgdGhhdCB3ZSBuZWVkIG1vcmUgdGhhbiB0aGUgYW1vdW50IHRoYXQgd2UgaGF2ZS4gKi8KKwlpZiAobl9hbW91bnRfbmVlZGVkID4gbl9udW1iZXJfb2ZfZnJlZWJsaykKKwkJbl9hbW91bnRfbmVlZGVkIC09IG5fbnVtYmVyX29mX2ZyZWVibGs7CisJZWxzZQkJCS8qIElmIHdlIGhhdmUgZW5vdWdoIGFscmVhZHkgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLworCQlyZXR1cm4gQ0FSUllfT047CiAKLSAgLyogTm8gbmVlZCB0byBjaGVjayBxdW90YSAtIGlzIG5vdCBhbGxvY2F0ZWQgZm9yIGJsb2NrcyB1c2VkIGZvciBmb3JtYXR0ZWQgbm9kZXMgKi8KLSAgaWYgKHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzIChwX3NfdGIsIGFfbl9ibG9ja25ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9hbW91bnRfbmVlZGVkKSA9PSBOT19ESVNLX1NQQUNFKQotICAgIHJldHVybiBOT19ESVNLX1NQQUNFOworCS8qIE5vIG5lZWQgdG8gY2hlY2sgcXVvdGEgLSBpcyBub3QgYWxsb2NhdGVkIGZvciBibG9ja3MgdXNlZCBmb3IgZm9ybWF0dGVkIG5vZGVzICovCisJaWYgKHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzKHBfc190YiwgYV9uX2Jsb2NrbnJzLAorCQkJCSAgICAgICBuX2Ftb3VudF9uZWVkZWQpID09IE5PX0RJU0tfU1BBQ0UpCisJCXJldHVybiBOT19ESVNLX1NQQUNFOwogCi0gIC8qIGZvciBlYWNoIGJsb2NrbnVtYmVyIHdlIGp1c3QgZ290LCBnZXQgYSBidWZmZXIgYW5kIHN0aWNrIGl0IG9uIEZFQiAqLwotICBmb3IgKCBwX25fYmxvY2tuciA9IGFfbl9ibG9ja25ycywgbl9jb3VudGVyID0gMDsgbl9jb3VudGVyIDwgbl9hbW91bnRfbmVlZGVkOwotCXBfbl9ibG9ja25yKyssIG5fY291bnRlcisrICkgeyAKKwkvKiBmb3IgZWFjaCBibG9ja251bWJlciB3ZSBqdXN0IGdvdCwgZ2V0IGEgYnVmZmVyIGFuZCBzdGljayBpdCBvbiBGRUIgKi8KKwlmb3IgKHBfbl9ibG9ja25yID0gYV9uX2Jsb2NrbnJzLCBuX2NvdW50ZXIgPSAwOworCSAgICAgbl9jb3VudGVyIDwgbl9hbW91bnRfbmVlZGVkOyBwX25fYmxvY2tucisrLCBuX2NvdW50ZXIrKykgewogCi0gICAgUkZBTFNFKCAhICpwX25fYmxvY2tuciwKLQkgICAgIlBBUC04MTM1OiByZWlzZXJmc19uZXdfYmxvY2tucnMgZmFpbGVkIHdoZW4gZ290IG5ldyBibG9ja3MiKTsKKwkJUkZBTFNFKCEqcF9uX2Jsb2NrbnIsCisJCSAgICAgICAiUEFQLTgxMzU6IHJlaXNlcmZzX25ld19ibG9ja25ycyBmYWlsZWQgd2hlbiBnb3QgbmV3IGJsb2NrcyIpOwogCi0gICAgcF9zX25ld19iaCA9IHNiX2dldGJsayhwX3Nfc2IsICpwX25fYmxvY2tucik7Ci0gICAgUkZBTFNFIChidWZmZXJfZGlydHkgKHBfc19uZXdfYmgpIHx8Ci0JICAgIGJ1ZmZlcl9qb3VybmFsZWQgKHBfc19uZXdfYmgpIHx8Ci0JICAgIGJ1ZmZlcl9qb3VybmFsX2RpcnR5IChwX3NfbmV3X2JoKSwKLQkgICAgIlBBUC04MTQwOiBqb3VybmxhbGVkIG9yIGRpcnR5IGJ1ZmZlciAlYiBmb3IgdGhlIG5ldyBibG9jayIsIAotCSAgICBwX3NfbmV3X2JoKTsKLSAgICAKLSAgICAvKiBQdXQgZW1wdHkgYnVmZmVycyBpbnRvIHRoZSBhcnJheS4gKi8KLSAgICBSRkFMU0UgKHBfc190Yi0+RkVCW3Bfc190Yi0+Y3VyX2Jsa251bV0sCi0JICAgICJQQVAtODE0MTogYnVzeSBzbG90IGZvciBuZXcgYnVmZmVyIik7CisJCXBfc19uZXdfYmggPSBzYl9nZXRibGsocF9zX3NiLCAqcF9uX2Jsb2NrbnIpOworCQlSRkFMU0UoYnVmZmVyX2RpcnR5KHBfc19uZXdfYmgpIHx8CisJCSAgICAgICBidWZmZXJfam91cm5hbGVkKHBfc19uZXdfYmgpIHx8CisJCSAgICAgICBidWZmZXJfam91cm5hbF9kaXJ0eShwX3NfbmV3X2JoKSwKKwkJICAgICAgICJQQVAtODE0MDogam91cm5sYWxlZCBvciBkaXJ0eSBidWZmZXIgJWIgZm9yIHRoZSBuZXcgYmxvY2siLAorCQkgICAgICAgcF9zX25ld19iaCk7CiAKLSAgICBzZXRfYnVmZmVyX2pvdXJuYWxfbmV3IChwX3NfbmV3X2JoKTsKLSAgICBwX3NfdGItPkZFQltwX3NfdGItPmN1cl9ibGtudW0rK10gPSBwX3NfbmV3X2JoOwotICB9CisJCS8qIFB1dCBlbXB0eSBidWZmZXJzIGludG8gdGhlIGFycmF5LiAqLworCQlSRkFMU0UocF9zX3RiLT5GRUJbcF9zX3RiLT5jdXJfYmxrbnVtXSwKKwkJICAgICAgICJQQVAtODE0MTogYnVzeSBzbG90IGZvciBuZXcgYnVmZmVyIik7CiAKLSAgaWYgKCBuX3JldHZhbCA9PSBDQVJSWV9PTiAmJiBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKQotICAgIG5fcmV0dmFsID0gUkVQRUFUX1NFQVJDSCA7CisJCXNldF9idWZmZXJfam91cm5hbF9uZXcocF9zX25ld19iaCk7CisJCXBfc190Yi0+RkVCW3Bfc190Yi0+Y3VyX2Jsa251bSsrXSA9IHBfc19uZXdfYmg7CisJfQogCi0gIHJldHVybiBuX3JldHZhbDsKKwlpZiAobl9yZXR2YWwgPT0gQ0FSUllfT04gJiYgRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpCisJCW5fcmV0dmFsID0gUkVQRUFUX1NFQVJDSDsKKworCXJldHVybiBuX3JldHZhbDsKIH0KIAotCiAvKiBHZXQgZnJlZSBzcGFjZSBvZiB0aGUgbGVmdCBuZWlnaGJvciwgd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBwYXJlbnQKICAqIG5vZGUgb2YgdGhlIGxlZnQgbmVpZ2hib3IuICAqLwotc3RhdGljIGludCBnZXRfbGZyZWUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGdldF9sZnJlZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogbCwgKiBmOwotICAgIGludCBvcmRlcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmwsICpmOworCWludCBvcmRlcjsKIAotICAgIGlmICgoZiA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkpID09IDAgfHwgKGwgPSB0Yi0+RkxbaF0pID09IDApCi0JcmV0dXJuIDA7CisJaWYgKChmID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpKSA9PSAwIHx8IChsID0gdGItPkZMW2hdKSA9PSAwKQorCQlyZXR1cm4gMDsKIAotICAgIGlmIChmID09IGwpCi0Jb3JkZXIgPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgaCkgLSAxOwotICAgIGVsc2UgewotCW9yZGVyID0gQl9OUl9JVEVNUyAobCk7Ci0JZiA9IGw7Ci0gICAgfQorCWlmIChmID09IGwpCisJCW9yZGVyID0gUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkgLSAxOworCWVsc2UgeworCQlvcmRlciA9IEJfTlJfSVRFTVMobCk7CisJCWYgPSBsOworCX0KIAotICAgIHJldHVybiAoTUFYX0NISUxEX1NJWkUoZikgLSBkY19zaXplKEJfTl9DSElMRChmLG9yZGVyKSkpOworCXJldHVybiAoTUFYX0NISUxEX1NJWkUoZikgLSBkY19zaXplKEJfTl9DSElMRChmLCBvcmRlcikpKTsKIH0KIAotCiAvKiBHZXQgZnJlZSBzcGFjZSBvZiB0aGUgcmlnaHQgbmVpZ2hib3IsCiAgKiB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHBhcmVudCBub2RlIG9mIHRoZSByaWdodCBuZWlnaGJvci4KICAqLwotc3RhdGljIGludCBnZXRfcmZyZWUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGdldF9yZnJlZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIHIsICogZjsKLSAgaW50IG9yZGVyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqciwgKmY7CisJaW50IG9yZGVyOwogCi0gIGlmICgoZiA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkpID09IDAgfHwgKHIgPSB0Yi0+RlJbaF0pID09IDApCi0gICAgcmV0dXJuIDA7CisJaWYgKChmID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpKSA9PSAwIHx8IChyID0gdGItPkZSW2hdKSA9PSAwKQorCQlyZXR1cm4gMDsKIAotICBpZiAoZiA9PSByKQotICAgICAgb3JkZXIgPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgaCkgKyAxOwotICBlbHNlIHsKLSAgICAgIG9yZGVyID0gMDsKLSAgICAgIGYgPSByOwotICB9CisJaWYgKGYgPT0gcikKKwkJb3JkZXIgPSBQQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLCBoKSArIDE7CisJZWxzZSB7CisJCW9yZGVyID0gMDsKKwkJZiA9IHI7CisJfQogCi0gIHJldHVybiAoTUFYX0NISUxEX1NJWkUoZikgLSBkY19zaXplKCBCX05fQ0hJTEQoZixvcmRlcikpKTsKKwlyZXR1cm4gKE1BWF9DSElMRF9TSVpFKGYpIC0gZGNfc2l6ZShCX05fQ0hJTEQoZiwgb3JkZXIpKSk7CiAKIH0KIAotCiAvKiBDaGVjayB3aGV0aGVyIGxlZnQgbmVpZ2hib3IgaXMgaW4gbWVtb3J5LiAqLwotc3RhdGljIGludCAgaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSgKLSAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5faAotICAgICAgICAgICAgKSB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfZmF0aGVyLCAqIGxlZnQ7Ci0gIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOwotICBiX2Jsb2NrbnJfdAkJbl9sZWZ0X25laWdoYm9yX2Jsb2NrbnI7Ci0gIGludCAgICAgICAgICAgICAgICAgICBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb247CitzdGF0aWMgaW50IGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLCBpbnQgbl9oKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2ZhdGhlciwgKmxlZnQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOworCWJfYmxvY2tucl90IG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yOworCWludCBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb247CiAKLSAgaWYgKCAhIHBfc190Yi0+Rkxbbl9oXSApIC8qIEZhdGhlciBvZiB0aGUgbGVmdCBuZWlnaGJvciBkb2VzIG5vdCBleGlzdC4gKi8KLSAgICByZXR1cm4gMDsKKwlpZiAoIXBfc190Yi0+Rkxbbl9oXSkJLyogRmF0aGVyIG9mIHRoZSBsZWZ0IG5laWdoYm9yIGRvZXMgbm90IGV4aXN0LiAqLworCQlyZXR1cm4gMDsKIAotICAvKiBDYWxjdWxhdGUgZmF0aGVyIG9mIHRoZSBub2RlIHRvIGJlIGJhbGFuY2VkLiAqLwotICBwX3NfZmF0aGVyID0gUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKTsKKwkvKiBDYWxjdWxhdGUgZmF0aGVyIG9mIHRoZSBub2RlIHRvIGJlIGJhbGFuY2VkLiAqLworCXBfc19mYXRoZXIgPSBQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCArIDEpOwogCi0gIFJGQUxTRSggISBwX3NfZmF0aGVyIHx8IAotCSAgISBCX0lTX0lOX1RSRUUgKHBfc19mYXRoZXIpIHx8IAotCSAgISBCX0lTX0lOX1RSRUUgKHBfc190Yi0+Rkxbbl9oXSkgfHwKLQkgICEgYnVmZmVyX3VwdG9kYXRlIChwX3NfZmF0aGVyKSB8fCAKLQkgICEgYnVmZmVyX3VwdG9kYXRlIChwX3NfdGItPkZMW25faF0pLAotCSAgInZzLTgxNjU6IEZbaF0gKCViKSBvciBGTFtoXSAoJWIpIGlzIGludmFsaWQiLCAKLQkgIHBfc19mYXRoZXIsIHBfc190Yi0+Rkxbbl9oXSk7CisJUkZBTFNFKCFwX3NfZmF0aGVyIHx8CisJICAgICAgICFCX0lTX0lOX1RSRUUocF9zX2ZhdGhlcikgfHwKKwkgICAgICAgIUJfSVNfSU5fVFJFRShwX3NfdGItPkZMW25faF0pIHx8CisJICAgICAgICFidWZmZXJfdXB0b2RhdGUocF9zX2ZhdGhlcikgfHwKKwkgICAgICAgIWJ1ZmZlcl91cHRvZGF0ZShwX3NfdGItPkZMW25faF0pLAorCSAgICAgICAidnMtODE2NTogRltoXSAoJWIpIG9yIEZMW2hdICglYikgaXMgaW52YWxpZCIsCisJICAgICAgIHBfc19mYXRoZXIsIHBfc190Yi0+Rkxbbl9oXSk7CiAKKwkvKiBHZXQgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgdG8gdGhlIGxlZnQgbmVpZ2hib3IgaW50byB0aGUgbGVmdCBmYXRoZXIuICovCisJbl9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uID0gKHBfc19mYXRoZXIgPT0gcF9zX3RiLT5GTFtuX2hdKSA/CisJICAgIHBfc190Yi0+bGtleVtuX2hdIDogQl9OUl9JVEVNUyhwX3NfdGItPkZMW25faF0pOworCS8qIEdldCBsZWZ0IG5laWdoYm9yIGJsb2NrIG51bWJlci4gKi8KKwluX2xlZnRfbmVpZ2hib3JfYmxvY2tuciA9CisJICAgIEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb24pOworCS8qIExvb2sgZm9yIHRoZSBsZWZ0IG5laWdoYm9yIGluIHRoZSBjYWNoZS4gKi8KKwlpZiAoKGxlZnQgPSBzYl9maW5kX2dldF9ibG9jayhwX3Nfc2IsIG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yKSkpIHsKIAotICAvKiBHZXQgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgdG8gdGhlIGxlZnQgbmVpZ2hib3IgaW50byB0aGUgbGVmdCBmYXRoZXIuICovCi0gIG5fbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiA9ICggcF9zX2ZhdGhlciA9PSBwX3NfdGItPkZMW25faF0gKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgcF9zX3RiLT5sa2V5W25faF0gOiBCX05SX0lURU1TIChwX3NfdGItPkZMW25faF0pOwotICAvKiBHZXQgbGVmdCBuZWlnaGJvciBibG9jayBudW1iZXIuICovCi0gIG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yID0gQl9OX0NISUxEX05VTShwX3NfdGItPkZMW25faF0sIG5fbGVmdF9uZWlnaGJvcl9wb3NpdGlvbik7Ci0gIC8qIExvb2sgZm9yIHRoZSBsZWZ0IG5laWdoYm9yIGluIHRoZSBjYWNoZS4gKi8KLSAgaWYgKCAobGVmdCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKHBfc19zYiwgbl9sZWZ0X25laWdoYm9yX2Jsb2NrbnIpKSApIHsKKwkJUkZBTFNFKGJ1ZmZlcl91cHRvZGF0ZShsZWZ0KSAmJiAhQl9JU19JTl9UUkVFKGxlZnQpLAorCQkgICAgICAgInZzLTgxNzA6IGxlZnQgbmVpZ2hib3IgKCViICV6KSBpcyBub3QgaW4gdGhlIHRyZWUiLAorCQkgICAgICAgbGVmdCwgbGVmdCk7CisJCXB1dF9iaChsZWZ0KTsKKwkJcmV0dXJuIDE7CisJfQogCi0gICAgUkZBTFNFKCBidWZmZXJfdXB0b2RhdGUgKGxlZnQpICYmICEgQl9JU19JTl9UUkVFKGxlZnQpLAotCSAgICAidnMtODE3MDogbGVmdCBuZWlnaGJvciAoJWIgJXopIGlzIG5vdCBpbiB0aGUgdHJlZSIsIGxlZnQsIGxlZnQpOwotICAgIHB1dF9iaChsZWZ0KSA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotCiAjZGVmaW5lIExFRlRfUEFSRU5UUyAgJ2wnCiAjZGVmaW5lIFJJR0hUX1BBUkVOVFMgJ3InCiAKLQotc3RhdGljIHZvaWQgZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBwX3Nfa2V5KQorc3RhdGljIHZvaWQgZGVjcmVtZW50X2tleShzdHJ1Y3QgY3B1X2tleSAqcF9zX2tleSkKIHsKLSAgICAvLyBjYWxsIGl0ZW0gc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHRoaXMga2V5Ci0gICAgaXRlbV9vcHNbY3B1X2tleV9rX3R5cGUgKHBfc19rZXkpXS0+ZGVjcmVtZW50X2tleSAocF9zX2tleSk7CisJLy8gY2FsbCBpdGVtIHNwZWNpZmljIGZ1bmN0aW9uIGZvciB0aGlzIGtleQorCWl0ZW1fb3BzW2NwdV9rZXlfa190eXBlKHBfc19rZXkpXS0+ZGVjcmVtZW50X2tleShwX3Nfa2V5KTsKIH0KIAotCi0KLQogLyogQ2FsY3VsYXRlIGZhciBsZWZ0L3JpZ2h0IHBhcmVudCBvZiB0aGUgbGVmdC9yaWdodCBuZWlnaGJvciBvZiB0aGUgY3VycmVudCBub2RlLCB0aGF0CiAgKiBpcyBjYWxjdWxhdGUgdGhlIGxlZnQvcmlnaHQgKEZMW2hdL0ZSW2hdKSBuZWlnaGJvciBvZiB0aGUgcGFyZW50IEZbaF0uCiAgKiBDYWxjdWxhdGUgbGVmdC9yaWdodCBjb21tb24gcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIExbaF0vUltoXS4KQEAgLTk0MCwxMTEgKzk1MywxMjEgQEAKICAJCVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgQ0FSUllfT04gICAgICAgICAtIHNjaGVkdWxlIGRpZG4ndCBvY2N1ciB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOwogICovCi1zdGF0aWMgaW50ICBnZXRfZmFyX3BhcmVudCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqICAgcF9zX3RiLAotCQkJICAgIGludCAgICAgICAgICAgICAgICAgICAgIG5faCwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICoqICBwcF9zX2ZhdGhlciwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICoqICBwcF9zX2NvbV9mYXRoZXIsCi0JCQkgICAgY2hhciAgICAgICAgICAgICAgICAgICAgY19scl9wYXIpIAorc3RhdGljIGludCBnZXRfZmFyX3BhcmVudChzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIsCisJCQkgIGludCBuX2gsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBwX3NfZmF0aGVyLAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwcF9zX2NvbV9mYXRoZXIsIGNoYXIgY19scl9wYXIpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19wYXJlbnQ7Ci0gICAgSU5JVElBTElaRV9QQVRIIChzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKLSAgICBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoID0gcF9zX3RiLT50Yl9wYXRoOwotICAgIHN0cnVjdCBjcHVfa2V5CXNfbHJfZmF0aGVyX2tleTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9jb3VudGVyLAotCW5fcG9zaXRpb24gPSBJTlRfTUFYLAotCW5fZmlyc3RfbGFzdF9wb3NpdGlvbiA9IDAsCi0Jbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfcGF0aCwgbl9oKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19wYXJlbnQ7CisJSU5JVElBTElaRV9QQVRIKHNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOworCXN0cnVjdCBwYXRoICpwX3NfcGF0aCA9IHBfc190Yi0+dGJfcGF0aDsKKwlzdHJ1Y3QgY3B1X2tleSBzX2xyX2ZhdGhlcl9rZXk7CisJaW50IG5fY291bnRlciwKKwkgICAgbl9wb3NpdGlvbiA9IElOVF9NQVgsCisJICAgIG5fZmlyc3RfbGFzdF9wb3NpdGlvbiA9IDAsCisJICAgIG5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3BhdGgsIG5faCk7CiAKLSAgICAvKiBTdGFydGluZyBmcm9tIEZbbl9oXSBnbyB1cHdhcmRzIGluIHRoZSB0cmVlLCBhbmQgbG9vayBmb3IgdGhlIGNvbW1vbgotICAgICAgYW5jZXN0b3Igb2YgRltuX2hdLCBhbmQgaXRzIG5laWdoYm9yIGwvciwgdGhhdCBzaG91bGQgYmUgb2J0YWluZWQuICovCisJLyogU3RhcnRpbmcgZnJvbSBGW25faF0gZ28gdXB3YXJkcyBpbiB0aGUgdHJlZSwgYW5kIGxvb2sgZm9yIHRoZSBjb21tb24KKwkgICBhbmNlc3RvciBvZiBGW25faF0sIGFuZCBpdHMgbmVpZ2hib3IgbC9yLCB0aGF0IHNob3VsZCBiZSBvYnRhaW5lZC4gKi8KIAotICAgIG5fY291bnRlciA9IG5fcGF0aF9vZmZzZXQ7CisJbl9jb3VudGVyID0gbl9wYXRoX29mZnNldDsKIAotICAgIFJGQUxTRSggbl9jb3VudGVyIDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICAgIlBBUC04MTgwOiBpbnZhbGlkIHBhdGggbGVuZ3RoIik7CisJUkZBTFNFKG5fY291bnRlciA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAgICAgICJQQVAtODE4MDogaW52YWxpZCBwYXRoIGxlbmd0aCIpOwogCi0gIAotICAgIGZvciAoIDsgbl9jb3VudGVyID4gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVDsgbl9jb3VudGVyLS0gICkgIHsKLQkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBvZiB0aGUgY3VycmVudCBidWZmZXIgaW4gdGhlIHBhdGggaXMgcmVhbGx5IHBhcmVudCBpbiB0aGUgdHJlZS4gKi8KLQlpZiAoICEgQl9JU19JTl9UUkVFKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIgLSAxKSkgKQotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKLQkvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KLQlpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fY291bnRlciAtIDEpKSA+IEJfTlJfSVRFTVMocF9zX3BhcmVudCkgKQotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKLQkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCByZWFsbHkgcG9pbnRzIHRvIHRoZSBjaGlsZC4gKi8KLQlpZiAoIEJfTl9DSElMRF9OVU0ocF9zX3BhcmVudCwgbl9wb3NpdGlvbikgIT0KLQkgICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fY291bnRlciktPmJfYmxvY2tuciApCi0JICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOwotCS8qIFJldHVybiBkZWxpbWl0aW5nIGtleSBpZiBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIG5vdCBlcXVhbCB0byBmaXJzdC9sYXN0IG9uZS4gKi8KLQlpZiAoIGNfbHJfcGFyID09IFJJR0hUX1BBUkVOVFMgKQotCSAgICBuX2ZpcnN0X2xhc3RfcG9zaXRpb24gPSBCX05SX0lURU1TIChwX3NfcGFyZW50KTsKLQlpZiAoIG5fcG9zaXRpb24gIT0gbl9maXJzdF9sYXN0X3Bvc2l0aW9uICkgewotCSAgICAqcHBfc19jb21fZmF0aGVyID0gcF9zX3BhcmVudDsKLQkgICAgZ2V0X2JoKCpwcF9zX2NvbV9mYXRoZXIpIDsKLQkgICAgLyooKnBwX3NfY29tX2ZhdGhlciA9IHBfc19wYXJlbnQpLT5iX2NvdW50Kys7Ki8KLQkgICAgYnJlYWs7CisJZm9yICg7IG5fY291bnRlciA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQ7IG5fY291bnRlci0tKSB7CisJCS8qIENoZWNrIHdoZXRoZXIgcGFyZW50IG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBpbiB0aGUgcGF0aCBpcyByZWFsbHkgcGFyZW50IGluIHRoZSB0cmVlLiAqLworCQlpZiAoIUJfSVNfSU5fVFJFRQorCQkgICAgKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIgLSAxKSkpCisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCisJCWlmICgobl9wb3NpdGlvbiA9CisJCSAgICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsCisJCQkJCSAgbl9jb3VudGVyIC0gMSkpID4KKwkJICAgIEJfTlJfSVRFTVMocF9zX3BhcmVudCkpCisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCisJCWlmIChCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9CisJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIpLT5iX2Jsb2NrbnIpCisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJLyogUmV0dXJuIGRlbGltaXRpbmcga2V5IGlmIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgbm90IGVxdWFsIHRvIGZpcnN0L2xhc3Qgb25lLiAqLworCQlpZiAoY19scl9wYXIgPT0gUklHSFRfUEFSRU5UUykKKwkJCW5fZmlyc3RfbGFzdF9wb3NpdGlvbiA9IEJfTlJfSVRFTVMocF9zX3BhcmVudCk7CisJCWlmIChuX3Bvc2l0aW9uICE9IG5fZmlyc3RfbGFzdF9wb3NpdGlvbikgeworCQkJKnBwX3NfY29tX2ZhdGhlciA9IHBfc19wYXJlbnQ7CisJCQlnZXRfYmgoKnBwX3NfY29tX2ZhdGhlcik7CisJCQkvKigqcHBfc19jb21fZmF0aGVyID0gcF9zX3BhcmVudCktPmJfY291bnQrKzsgKi8KKwkJCWJyZWFrOworCQl9CiAJfQotICAgIH0KIAotICAgIC8qIGlmIHdlIGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgdHJlZSwgdGhlbiB0aGVyZSBpcyBubyBjb21tb24gZmF0aGVyICovCi0gICAgaWYgKCBuX2NvdW50ZXIgPT0gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCApIHsKLQkvKiBDaGVjayB3aGV0aGVyIGZpcnN0IGJ1ZmZlciBpbiB0aGUgcGF0aCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gKi8KLQlpZiAoIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+Yl9ibG9ja25yID09Ci0JICAgICBTQl9ST09UX0JMT0NLIChwX3NfdGItPnRiX3NiKSApIHsKLQkgICAgKnBwX3NfZmF0aGVyID0gKnBwX3NfY29tX2ZhdGhlciA9IE5VTEw7Ci0JICAgIHJldHVybiBDQVJSWV9PTjsKKwkvKiBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIHRyZWUsIHRoZW4gdGhlcmUgaXMgbm8gY29tbW9uIGZhdGhlciAqLworCWlmIChuX2NvdW50ZXIgPT0gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCkgeworCQkvKiBDaGVjayB3aGV0aGVyIGZpcnN0IGJ1ZmZlciBpbiB0aGUgcGF0aCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gKi8KKwkJaWYgKFBBVEhfT0ZGU0VUX1BCVUZGRVIKKwkJICAgIChwX3NfdGItPnRiX3BhdGgsCisJCSAgICAgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQorCQkgICAgU0JfUk9PVF9CTE9DSyhwX3NfdGItPnRiX3NiKSkgeworCQkJKnBwX3NfZmF0aGVyID0gKnBwX3NfY29tX2ZhdGhlciA9IE5VTEw7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAJfQotCXJldHVybiBSRVBFQVRfU0VBUkNIOwotICAgIH0KIAotICAgIFJGQUxTRSggQl9MRVZFTCAoKnBwX3NfY29tX2ZhdGhlcikgPD0gRElTS19MRUFGX05PREVfTEVWRUwsCi0JICAgICJQQVAtODE4NTogKCViICV6KSBsZXZlbCB0b28gc21hbGwiLCAKLQkgICAgKnBwX3NfY29tX2ZhdGhlciwgKnBwX3NfY29tX2ZhdGhlcik7CisJUkZBTFNFKEJfTEVWRUwoKnBwX3NfY29tX2ZhdGhlcikgPD0gRElTS19MRUFGX05PREVfTEVWRUwsCisJICAgICAgICJQQVAtODE4NTogKCViICV6KSBsZXZlbCB0b28gc21hbGwiLAorCSAgICAgICAqcHBfc19jb21fZmF0aGVyLCAqcHBfc19jb21fZmF0aGVyKTsKIAotICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbW1vbiBwYXJlbnQgaXMgbG9ja2VkLiAqLworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbW1vbiBwYXJlbnQgaXMgbG9ja2VkLiAqLwogCi0gICAgaWYgKCBidWZmZXJfbG9ja2VkICgqcHBfc19jb21fZmF0aGVyKSApIHsKLQlfX3dhaXRfb25fYnVmZmVyKCpwcF9zX2NvbV9mYXRoZXIpOwotCWlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgewotCSAgICBkZWNyZW1lbnRfYmNvdW50KCpwcF9zX2NvbV9mYXRoZXIpOwotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwlpZiAoYnVmZmVyX2xvY2tlZCgqcHBfc19jb21fZmF0aGVyKSkgeworCQlfX3dhaXRfb25fYnVmZmVyKCpwcF9zX2NvbV9mYXRoZXIpOworCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpIHsKKwkJCWRlY3JlbWVudF9iY291bnQoKnBwX3NfY29tX2ZhdGhlcik7CisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBTbywgd2UgZ290IGNvbW1vbiBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgaXRzIGxlZnQvcmlnaHQgbmVpZ2hib3IuCi0gICAgIE5vdyB3ZSBhcmUgZ2V0aW5nIHRoZSBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IuICovCisJLyogU28sIHdlIGdvdCBjb21tb24gcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIGl0cyBsZWZ0L3JpZ2h0IG5laWdoYm9yLgorCSAgIE5vdyB3ZSBhcmUgZ2V0aW5nIHRoZSBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IuICovCiAKLSAgICAvKiBGb3JtIGtleSB0byBnZXQgcGFyZW50IG9mIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yLiAqLwotICAgIGxlX2tleTJjcHVfa2V5ICgmc19scl9mYXRoZXJfa2V5LCBCX05fUERFTElNX0tFWSgqcHBfc19jb21fZmF0aGVyLCAoIGNfbHJfcGFyID09IExFRlRfUEFSRU5UUyApID8KLQkJCQkJCSAgICAgKHBfc190Yi0+bGtleVtuX2ggLSAxXSA9IG5fcG9zaXRpb24gLSAxKSA6IChwX3NfdGItPnJrZXlbbl9oIC0gMV0gPSBuX3Bvc2l0aW9uKSkpOworCS8qIEZvcm0ga2V5IHRvIGdldCBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IuICovCisJbGVfa2V5MmNwdV9rZXkoJnNfbHJfZmF0aGVyX2tleSwKKwkJICAgICAgIEJfTl9QREVMSU1fS0VZKCpwcF9zX2NvbV9mYXRoZXIsCisJCQkJICAgICAgKGNfbHJfcGFyID09CisJCQkJICAgICAgIExFRlRfUEFSRU5UUykgPyAocF9zX3RiLT5sa2V5W25faCAtIDFdID0KKwkJCQkJCQluX3Bvc2l0aW9uIC0KKwkJCQkJCQkxKSA6IChwX3NfdGItPnJrZXlbbl9oIC0KKwkJCQkJCQkJCSAgIDFdID0KKwkJCQkJCQkgICAgICBuX3Bvc2l0aW9uKSkpOwogCisJaWYgKGNfbHJfcGFyID09IExFRlRfUEFSRU5UUykKKwkJZGVjcmVtZW50X2tleSgmc19scl9mYXRoZXJfa2V5KTsKIAotICAgIGlmICggY19scl9wYXIgPT0gTEVGVF9QQVJFTlRTICkKLQlkZWNyZW1lbnRfa2V5KCZzX2xyX2ZhdGhlcl9rZXkpOworCWlmIChzZWFyY2hfYnlfa2V5CisJICAgIChwX3NfdGItPnRiX3NiLCAmc19scl9mYXRoZXJfa2V5LCAmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlciwKKwkgICAgIG5faCArIDEpID09IElPX0VSUk9SKQorCQkvLyBwYXRoIGlzIHJlbGVhc2VkCisJCXJldHVybiBJT19FUlJPUjsKIAotICAgIGlmIChzZWFyY2hfYnlfa2V5KHBfc190Yi0+dGJfc2IsICZzX2xyX2ZhdGhlcl9rZXksICZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyLCBuX2ggKyAxKSA9PSBJT19FUlJPUikKLQkvLyBwYXRoIGlzIHJlbGVhc2VkCi0JcmV0dXJuIElPX0VSUk9SOworCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkgeworCQlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCgmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7CisJCWRlY3JlbWVudF9iY291bnQoKnBwX3NfY29tX2ZhdGhlcik7CisJCXJldHVybiBSRVBFQVRfU0VBUkNIOworCX0KIAotICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgeworCSpwcF9zX2ZhdGhlciA9IFBBVEhfUExBU1RfQlVGRkVSKCZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKKworCVJGQUxTRShCX0xFVkVMKCpwcF9zX2ZhdGhlcikgIT0gbl9oICsgMSwKKwkgICAgICAgIlBBUC04MTkwOiAoJWIgJXopIGxldmVsIHRvbyBzbWFsbCIsICpwcF9zX2ZhdGhlciwgKnBwX3NfZmF0aGVyKTsKKwlSRkFMU0Uoc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlci5wYXRoX2xlbmd0aCA8CisJICAgICAgIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsICJQQVAtODE5MjogcGF0aCBsZW5ndGggaXMgdG9vIHNtYWxsIik7CisKKwlzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyLnBhdGhfbGVuZ3RoLS07CiAJZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOwotCWRlY3JlbWVudF9iY291bnQoKnBwX3NfY29tX2ZhdGhlcik7Ci0JcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0gICAgfQotCi0gICAgKnBwX3NfZmF0aGVyID0gUEFUSF9QTEFTVF9CVUZGRVIoJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOwotCi0gICAgUkZBTFNFKCBCX0xFVkVMICgqcHBfc19mYXRoZXIpICE9IG5faCArIDEsCi0JICAgICJQQVAtODE5MDogKCViICV6KSBsZXZlbCB0b28gc21hbGwiLCAqcHBfc19mYXRoZXIsICpwcF9zX2ZhdGhlcik7Ci0gICAgUkZBTFNFKCBzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyLnBhdGhfbGVuZ3RoIDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICAgIlBBUC04MTkyOiBwYXRoIGxlbmd0aCBpcyB0b28gc21hbGwiKTsKLQotICAgIHNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIucGF0aF9sZW5ndGgtLTsKLSAgICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCgmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7Ci0gICAgcmV0dXJuIENBUlJZX09OOworCXJldHVybiBDQVJSWV9PTjsKIH0KIAotCiAvKiBHZXQgcGFyZW50cyBvZiBuZWlnaGJvcnMgb2Ygbm9kZSBpbiB0aGUgcGF0aChTW25fcGF0aF9vZmZzZXRdKSBhbmQgY29tbW9uIHBhcmVudHMgb2YKICAqIFNbbl9wYXRoX29mZnNldF0gYW5kIExbbl9wYXRoX29mZnNldF0vUltuX3BhdGhfb2Zmc2V0XTogRltuX3BhdGhfb2Zmc2V0XSwgRkxbbl9wYXRoX29mZnNldF0sCiAgKiBGUltuX3BhdGhfb2Zmc2V0XSwgQ0ZMW25fcGF0aF9vZmZzZXRdLCBDRlJbbl9wYXRoX29mZnNldF0uCkBAIC0xMDUyLDEyMiArMTA3NSwxMjcgQEAKICAqIFJldHVybnM6CVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgQ0FSUllfT04gLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqLwotc3RhdGljIGludCAgZ2V0X3BhcmVudHMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsIGludCBuX2gpCitzdGF0aWMgaW50IGdldF9wYXJlbnRzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKIHsKLSAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5fcG9zaXRpb24sCi0Jbl9yZXRfdmFsdWUsCi0Jbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19jdXJmLAotCSogcF9zX2N1cmNmOworCXN0cnVjdCBwYXRoICpwX3NfcGF0aCA9IHBfc190Yi0+dGJfcGF0aDsKKwlpbnQgbl9wb3NpdGlvbiwKKwkgICAgbl9yZXRfdmFsdWUsCisJICAgIG5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2gpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2N1cmYsICpwX3NfY3VyY2Y7CiAKLSAgICAvKiBDdXJyZW50IG5vZGUgaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgb3Igd2lsbCBiZSByb290IG9mIHRoZSB0cmVlICovCi0gICAgaWYgKCBuX3BhdGhfb2Zmc2V0IDw9IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7Ci0JLyogVGhlIHJvb3QgY2FuIG5vdCBoYXZlIHBhcmVudHMuCi0JICAgUmVsZWFzZSBub2RlcyB3aGljaCBwcmV2aW91c2x5IHdlcmUgb2J0YWluZWQgYXMgcGFyZW50cyBvZiB0aGUgY3VycmVudCBub2RlIG5laWdoYm9ycy4gKi8KKwkvKiBDdXJyZW50IG5vZGUgaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgb3Igd2lsbCBiZSByb290IG9mIHRoZSB0cmVlICovCisJaWYgKG5fcGF0aF9vZmZzZXQgPD0gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCkgeworCQkvKiBUaGUgcm9vdCBjYW4gbm90IGhhdmUgcGFyZW50cy4KKwkJICAgUmVsZWFzZSBub2RlcyB3aGljaCBwcmV2aW91c2x5IHdlcmUgb2J0YWluZWQgYXMgcGFyZW50cyBvZiB0aGUgY3VycmVudCBub2RlIG5laWdoYm9ycy4gKi8KKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZMW25faF0pOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZMW25faF0pOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9oXSk7CisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9oXSk7CisJCXBfc190Yi0+Rkxbbl9oXSA9IHBfc190Yi0+Q0ZMW25faF0gPSBwX3NfdGItPkZSW25faF0gPQorCQkgICAgcF9zX3RiLT5DRlJbbl9oXSA9IE5VTEw7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBHZXQgcGFyZW50IEZMW25fcGF0aF9vZmZzZXRdIG9mIExbbl9wYXRoX29mZnNldF0uICovCisJaWYgKChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkpIHsKKwkJLyogQ3VycmVudCBub2RlIGlzIG5vdCB0aGUgZmlyc3QgY2hpbGQgb2YgaXRzIHBhcmVudC4gKi8KKwkJLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7ICovCisJCXBfc19jdXJmID0gcF9zX2N1cmNmID0KKwkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKKwkJZ2V0X2JoKHBfc19jdXJmKTsKKwkJZ2V0X2JoKHBfc19jdXJmKTsKKwkJcF9zX3RiLT5sa2V5W25faF0gPSBuX3Bvc2l0aW9uIC0gMTsKKwl9IGVsc2UgeworCQkvKiBDYWxjdWxhdGUgY3VycmVudCBwYXJlbnQgb2YgTFtuX3BhdGhfb2Zmc2V0XSwgd2hpY2ggaXMgdGhlIGxlZnQgbmVpZ2hib3Igb2YgdGhlIGN1cnJlbnQgbm9kZS4KKwkJICAgQ2FsY3VsYXRlIGN1cnJlbnQgY29tbW9uIHBhcmVudCBvZiBMW25fcGF0aF9vZmZzZXRdIGFuZCB0aGUgY3VycmVudCBub2RlLiBOb3RlIHRoYXQKKwkJICAgQ0ZMW25fcGF0aF9vZmZzZXRdIG5vdCBlcXVhbCBGTFtuX3BhdGhfb2Zmc2V0XSBhbmQgQ0ZMW25fcGF0aF9vZmZzZXRdIG5vdCBlcXVhbCBGW25fcGF0aF9vZmZzZXRdLgorCQkgICBDYWxjdWxhdGUgbGtleVtuX3BhdGhfb2Zmc2V0XS4gKi8KKwkJaWYgKChuX3JldF92YWx1ZSA9IGdldF9mYXJfcGFyZW50KHBfc190Yiwgbl9oICsgMSwgJnBfc19jdXJmLAorCQkJCQkJICAmcF9zX2N1cmNmLAorCQkJCQkJICBMRUZUX1BBUkVOVFMpKSAhPSBDQVJSWV9PTikKKwkJCXJldHVybiBuX3JldF92YWx1ZTsKKwl9CisKIAlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Rkxbbl9oXSk7CisJcF9zX3RiLT5GTFtuX2hdID0gcF9zX2N1cmY7CS8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBGTFtuX2hdLiAqLwogCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9oXSk7Ci0JZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZSW25faF0pOwotCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9oXSk7Ci0JcF9zX3RiLT5GTFtuX2hdID0gcF9zX3RiLT5DRkxbbl9oXSA9IHBfc190Yi0+RlJbbl9oXSA9IHBfc190Yi0+Q0ZSW25faF0gPSBOVUxMOwotCXJldHVybiBDQVJSWV9PTjsKLSAgICB9Ci0gIAotICAgIC8qIEdldCBwYXJlbnQgRkxbbl9wYXRoX29mZnNldF0gb2YgTFtuX3BhdGhfb2Zmc2V0XS4gKi8KLSAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkgKSAgewotCS8qIEN1cnJlbnQgbm9kZSBpcyBub3QgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQuICovCi0JLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7Ki8KLQlwX3NfY3VyZiA9IHBfc19jdXJjZiA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKLQlnZXRfYmgocF9zX2N1cmYpIDsKLQlnZXRfYmgocF9zX2N1cmYpIDsKLQlwX3NfdGItPmxrZXlbbl9oXSA9IG5fcG9zaXRpb24gLSAxOwotICAgIH0KLSAgICBlbHNlICB7Ci0JLyogQ2FsY3VsYXRlIGN1cnJlbnQgcGFyZW50IG9mIExbbl9wYXRoX29mZnNldF0sIHdoaWNoIGlzIHRoZSBsZWZ0IG5laWdoYm9yIG9mIHRoZSBjdXJyZW50IG5vZGUuCi0JICAgQ2FsY3VsYXRlIGN1cnJlbnQgY29tbW9uIHBhcmVudCBvZiBMW25fcGF0aF9vZmZzZXRdIGFuZCB0aGUgY3VycmVudCBub2RlLiBOb3RlIHRoYXQKLQkgICBDRkxbbl9wYXRoX29mZnNldF0gbm90IGVxdWFsIEZMW25fcGF0aF9vZmZzZXRdIGFuZCBDRkxbbl9wYXRoX29mZnNldF0gbm90IGVxdWFsIEZbbl9wYXRoX29mZnNldF0uCi0JICAgQ2FsY3VsYXRlIGxrZXlbbl9wYXRoX29mZnNldF0uICovCi0JaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZmFyX3BhcmVudChwX3NfdGIsIG5faCArIDEsICZwX3NfY3VyZiwKLQkJCQkJICAgJnBfc19jdXJjZiwgTEVGVF9QQVJFTlRTKSkgIT0gQ0FSUllfT04gKQotCSAgICByZXR1cm4gbl9yZXRfdmFsdWU7Ci0gICAgfQorCXBfc190Yi0+Q0ZMW25faF0gPSBwX3NfY3VyY2Y7CS8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBDRkxbbl9oXS4gKi8KIAotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GTFtuX2hdKTsKLSAgICBwX3NfdGItPkZMW25faF0gPSBwX3NfY3VyZjsgLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIEZMW25faF0uICovCi0gICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGTFtuX2hdKTsKLSAgICBwX3NfdGItPkNGTFtuX2hdID0gcF9zX2N1cmNmOyAvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgQ0ZMW25faF0uICovCi0KLSAgICBSRkFMU0UoIChwX3NfY3VyZiAmJiAhQl9JU19JTl9UUkVFIChwX3NfY3VyZikpIHx8IAotCSAgICAocF9zX2N1cmNmICYmICFCX0lTX0lOX1RSRUUgKHBfc19jdXJjZikpLAotCSAgICAiUEFQLTgxOTU6IEZMICglYikgb3IgQ0ZMICglYikgaXMgaW52YWxpZCIsIHBfc19jdXJmLCBwX3NfY3VyY2YpOworCVJGQUxTRSgocF9zX2N1cmYgJiYgIUJfSVNfSU5fVFJFRShwX3NfY3VyZikpIHx8CisJICAgICAgIChwX3NfY3VyY2YgJiYgIUJfSVNfSU5fVFJFRShwX3NfY3VyY2YpKSwKKwkgICAgICAgIlBBUC04MTk1OiBGTCAoJWIpIG9yIENGTCAoJWIpIGlzIGludmFsaWQiLCBwX3NfY3VyZiwgcF9zX2N1cmNmKTsKIAogLyogR2V0IHBhcmVudCBGUltuX2hdIG9mIFJbbl9oXS4gKi8KIAogLyogQ3VycmVudCBub2RlIGlzIHRoZSBsYXN0IGNoaWxkIG9mIEZbbl9oXS4gRlJbbl9oXSAhPSBGW25faF0uICovCi0gICAgaWYgKCBuX3Bvc2l0aW9uID09IEJfTlJfSVRFTVMgKFBBVEhfSF9QQlVGRkVSKHBfc19wYXRoLCBuX2ggKyAxKSkgKSB7CisJaWYgKG5fcG9zaXRpb24gPT0gQl9OUl9JVEVNUyhQQVRIX0hfUEJVRkZFUihwX3NfcGF0aCwgbl9oICsgMSkpKSB7CiAvKiBDYWxjdWxhdGUgY3VycmVudCBwYXJlbnQgb2YgUltuX2hdLCB3aGljaCBpcyB0aGUgcmlnaHQgbmVpZ2hib3Igb2YgRltuX2hdLgogICAgQ2FsY3VsYXRlIGN1cnJlbnQgY29tbW9uIHBhcmVudCBvZiBSW25faF0gYW5kIGN1cnJlbnQgbm9kZS4gTm90ZSB0aGF0IENGUltuX2hdCiAgICBub3QgZXF1YWwgRlJbbl9wYXRoX29mZnNldF0gYW5kIENGUltuX2hdIG5vdCBlcXVhbCBGW25faF0uICovCi0JaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZmFyX3BhcmVudChwX3NfdGIsIG5faCArIDEsICZwX3NfY3VyZiwgICZwX3NfY3VyY2YsIFJJR0hUX1BBUkVOVFMpKSAhPSBDQVJSWV9PTiApCi0JICAgIHJldHVybiBuX3JldF92YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSB7CisJCWlmICgobl9yZXRfdmFsdWUgPQorCQkgICAgIGdldF9mYXJfcGFyZW50KHBfc190Yiwgbl9oICsgMSwgJnBfc19jdXJmLCAmcF9zX2N1cmNmLAorCQkJCSAgICBSSUdIVF9QQVJFTlRTKSkgIT0gQ0FSUllfT04pCisJCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisJfSBlbHNlIHsKIC8qIEN1cnJlbnQgbm9kZSBpcyBub3QgdGhlIGxhc3QgY2hpbGQgb2YgaXRzIHBhcmVudCBGW25faF0uICovCi0JLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7Ki8KLQlwX3NfY3VyZiA9IHBfc19jdXJjZiA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKLQlnZXRfYmgocF9zX2N1cmYpIDsKLQlnZXRfYmgocF9zX2N1cmYpIDsKLQlwX3NfdGItPnJrZXlbbl9oXSA9IG5fcG9zaXRpb247Ci0gICAgfQkKKwkJLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7ICovCisJCXBfc19jdXJmID0gcF9zX2N1cmNmID0KKwkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKKwkJZ2V0X2JoKHBfc19jdXJmKTsKKwkJZ2V0X2JoKHBfc19jdXJmKTsKKwkJcF9zX3RiLT5ya2V5W25faF0gPSBuX3Bvc2l0aW9uOworCX0KIAotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GUltuX2hdKTsKLSAgICBwX3NfdGItPkZSW25faF0gPSBwX3NfY3VyZjsgLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIEZSW25fcGF0aF9vZmZzZXRdLiAqLwotICAgIAotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9oXSk7Ci0gICAgcF9zX3RiLT5DRlJbbl9oXSA9IHBfc19jdXJjZjsgLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIENGUltuX3BhdGhfb2Zmc2V0XS4gKi8KKwlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9oXSk7CisJcF9zX3RiLT5GUltuX2hdID0gcF9zX2N1cmY7CS8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBGUltuX3BhdGhfb2Zmc2V0XS4gKi8KIAotICAgIFJGQUxTRSggKHBfc19jdXJmICYmICFCX0lTX0lOX1RSRUUgKHBfc19jdXJmKSkgfHwKLSAgICAgICAgICAgIChwX3NfY3VyY2YgJiYgIUJfSVNfSU5fVFJFRSAocF9zX2N1cmNmKSksCi0JICAgICJQQVAtODIwNTogRlIgKCViKSBvciBDRlIgKCViKSBpcyBpbnZhbGlkIiwgcF9zX2N1cmYsIHBfc19jdXJjZik7CisJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGUltuX2hdKTsKKwlwX3NfdGItPkNGUltuX2hdID0gcF9zX2N1cmNmOwkvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgQ0ZSW25fcGF0aF9vZmZzZXRdLiAqLwogCi0gICAgcmV0dXJuIENBUlJZX09OOworCVJGQUxTRSgocF9zX2N1cmYgJiYgIUJfSVNfSU5fVFJFRShwX3NfY3VyZikpIHx8CisJICAgICAgIChwX3NfY3VyY2YgJiYgIUJfSVNfSU5fVFJFRShwX3NfY3VyY2YpKSwKKwkgICAgICAgIlBBUC04MjA1OiBGUiAoJWIpIG9yIENGUiAoJWIpIGlzIGludmFsaWQiLCBwX3NfY3VyZiwgcF9zX2N1cmNmKTsKKworCXJldHVybiBDQVJSWV9PTjsKIH0KIAotCiAvKiBpdCBpcyBwb3NzaWJsZSB0byByZW1vdmUgbm9kZSBhcyByZXN1bHQgb2Ygc2hpZnRpbmdzIHRvCiAgICBuZWlnaGJvcnMgZXZlbiB3aGVuIHdlIGluc2VydCBvciBwYXN0ZSBpdGVtLiAqLwotc3RhdGljIGlubGluZSBpbnQgY2FuX25vZGVfYmVfcmVtb3ZlZCAoaW50IG1vZGUsIGludCBsZnJlZSwgaW50IHNmcmVlLCBpbnQgcmZyZWUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW5saW5lIGludCBjYW5fbm9kZV9iZV9yZW1vdmVkKGludCBtb2RlLCBpbnQgbGZyZWUsIGludCBzZnJlZSwgaW50IHJmcmVlLAorCQkJCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0gICAgaW50IGxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogcl9rZXkgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqU2ggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJaW50IGxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCXN0cnVjdCByZWlzZXJmc19rZXkgKnJfa2V5ID0gTlVMTDsKIAotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKFNoLCAwKTsKLSAgICBpZiAoIHRiLT5DRlJbaF0gKQotCXJfa2V5ID0gQl9OX1BERUxJTV9LRVkodGItPkNGUltoXSx0Yi0+cmtleVtoXSk7Ci0gIAotICAgIGlmICgKLQlsZnJlZSArIHJmcmVlICsgc2ZyZWUgPCBNQVhfQ0hJTERfU0laRShTaCkgKyBsZXZieXRlcwotCS8qIHNoaWZ0aW5nIG1heSBtZXJnZSBpdGVtcyB3aGljaCBtaWdodCBzYXZlIHNwYWNlICovCi0JLSAoKCAhIGggJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIFNoLT5iX3NpemUpICkgPyBJSF9TSVpFIDogMCkKLQktICgoICEgaCAmJiByX2tleSAmJiBvcF9pc19sZWZ0X21lcmdlYWJsZSAocl9rZXksIFNoLT5iX3NpemUpICkgPyBJSF9TSVpFIDogMCkKLQkrICgoIGggKSA/IEtFWV9TSVpFIDogMCkpCi0gICAgewotCS8qIG5vZGUgY2FuIG5vdCBiZSByZW1vdmVkICovCi0JaWYgKHNmcmVlID49IGxldmJ5dGVzICkgeyAvKiBuZXcgaXRlbSBmaXRzIGludG8gbm9kZSBTW2hdIHdpdGhvdXQgYW55IHNoaWZ0aW5nICovCi0JICAgIGlmICggISBoICkKLQkJdGItPnMwbnVtID0gQl9OUl9JVEVNUyhTaCkgKyAoKG1vZGUgPT0gTV9JTlNFUlQgKSA/IDEgOiAwKTsKLQkgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotCSAgICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKwlpaCA9IEJfTl9QSVRFTV9IRUFEKFNoLCAwKTsKKwlpZiAodGItPkNGUltoXSkKKwkJcl9rZXkgPSBCX05fUERFTElNX0tFWSh0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSk7CisKKwlpZiAobGZyZWUgKyByZnJlZSArIHNmcmVlIDwgTUFYX0NISUxEX1NJWkUoU2gpICsgbGV2Ynl0ZXMKKwkgICAgLyogc2hpZnRpbmcgbWF5IG1lcmdlIGl0ZW1zIHdoaWNoIG1pZ2h0IHNhdmUgc3BhY2UgKi8KKwkgICAgLQorCSAgICAoKCFoCisJICAgICAgJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUoJihpaC0+aWhfa2V5KSwgU2gtPmJfc2l6ZSkpID8gSUhfU0laRSA6IDApCisJICAgIC0KKwkgICAgKCghaCAmJiByX2tleQorCSAgICAgICYmIG9wX2lzX2xlZnRfbWVyZ2VhYmxlKHJfa2V5LCBTaC0+Yl9zaXplKSkgPyBJSF9TSVpFIDogMCkKKwkgICAgKyAoKGgpID8gS0VZX1NJWkUgOiAwKSkgeworCQkvKiBub2RlIGNhbiBub3QgYmUgcmVtb3ZlZCAqLworCQlpZiAoc2ZyZWUgPj0gbGV2Ynl0ZXMpIHsJLyogbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLworCQkJaWYgKCFoKQorCQkJCXRiLT5zMG51bSA9CisJCQkJICAgIEJfTlJfSVRFTVMoU2gpICsKKwkJCQkgICAgKChtb2RlID09IE1fSU5TRVJUKSA/IDEgOiAwKTsKKwkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQkJcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CisJCX0KIAl9Ci0gICAgfQotICAgIFBST0NfSU5GT19JTkMoIHRiIC0+IHRiX3NiLCBjYW5fbm9kZV9iZV9yZW1vdmVkWyBoIF0gKTsKLSAgICByZXR1cm4gIU5PX0JBTEFOQ0lOR19ORUVERUQ7CisJUFJPQ19JTkZPX0lOQyh0Yi0+dGJfc2IsIGNhbl9ub2RlX2JlX3JlbW92ZWRbaF0pOworCXJldHVybiAhTk9fQkFMQU5DSU5HX05FRURFRDsKIH0KIAotCi0KIC8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBpbmNyZWFzaW5nIGl0cyBzaXplIGJ5CiAgKiBJbnNlcnRpbmcgb3IgUGFzdGluZy4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KQEAgLTExODIsMTU0ICsxMjEwLDE1NyBAQAogICoJICAgICAgIC0yIC0gbm8gZGlzayBzcGFjZS4KICAqLwogLyogaXAgbWVhbnMgSW5zZXJ0aW5nIG9yIFBhc3RpbmcgKi8KLXN0YXRpYyBpbnQgaXBfY2hlY2tfYmFsYW5jZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3N0YXRpYyBpbnQgaXBfY2hlY2tfYmFsYW5jZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gICAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOwotICAgIGludCBsZXZieXRlcywgIC8qIE51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgaW5zZXJ0ZWQgaW50byAodmFsdWUKLQkJICAgICAgaXMgbmVnYXRpdmUgaWYgYnl0ZXMgYXJlIGRlbGV0ZWQpIGJ1ZmZlciB3aGljaAotCQkgICAgICBjb250YWlucyBub2RlIGJlaW5nIGJhbGFuY2VkLiAgVGhlIG1uZW1vbmljIGlzCi0JCSAgICAgIHRoYXQgdGhlIGF0dGVtcHRlZCBjaGFuZ2UgaW4gbm9kZSBzcGFjZSB1c2VkIGxldmVsCi0JCSAgICAgIGlzIGxldmJ5dGVzIGJ5dGVzLiAqLwotCW5fcmV0X3ZhbHVlOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOworCWludCBsZXZieXRlcywJCS8qIE51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgaW5zZXJ0ZWQgaW50byAodmFsdWUKKwkJCQkgICBpcyBuZWdhdGl2ZSBpZiBieXRlcyBhcmUgZGVsZXRlZCkgYnVmZmVyIHdoaWNoCisJCQkJICAgY29udGFpbnMgbm9kZSBiZWluZyBiYWxhbmNlZC4gIFRoZSBtbmVtb25pYyBpcworCQkJCSAgIHRoYXQgdGhlIGF0dGVtcHRlZCBjaGFuZ2UgaW4gbm9kZSBzcGFjZSB1c2VkIGxldmVsCisJCQkJICAgaXMgbGV2Ynl0ZXMgYnl0ZXMuICovCisJIG5fcmV0X3ZhbHVlOwogCi0gICAgaW50IGxmcmVlLCBzZnJlZSwgcmZyZWUgLyogZnJlZSBzcGFjZSBpbiBMLCBTIGFuZCBSICovOworCWludCBsZnJlZSwgc2ZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCwgUyBhbmQgUiAqLyA7CiAKLSAgICAvKiBudmVyIGlzIHNob3J0IGZvciBudW1iZXIgb2YgdmVydGl4ZXMsIGFuZCBsbnZlciBpcyB0aGUgbnVtYmVyIGlmCi0gICAgICAgd2Ugc2hpZnQgdG8gdGhlIGxlZnQsIHJudmVyIGlzIHRoZSBudW1iZXIgaWYgd2Ugc2hpZnQgdG8gdGhlCi0gICAgICAgcmlnaHQsIGFuZCBscm52ZXIgaXMgdGhlIG51bWJlciBpZiB3ZSBzaGlmdCBpbiBib3RoIGRpcmVjdGlvbnMuCi0gICAgICAgVGhlIGdvYWwgaXMgdG8gbWluaW1pemUgZmlyc3QgdGhlIG51bWJlciBvZiB2ZXJ0aXhlcywgYW5kIHNlY29uZCwKLSAgICAgICB0aGUgbnVtYmVyIG9mIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZSBjaGFuZ2VkIGJ5IHNoaWZ0aW5nLAotICAgICAgIGFuZCB0aGlyZCB0aGUgbnVtYmVyIG9mIHVuY2FjaGVkIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZQotICAgICAgIGNoYW5nZWQgYnkgc2hpZnRpbmcgYW5kIG11c3QgYmUgcmVhZCBmcm9tIGRpc2suICAqLwotICAgIGludCBudmVyLCBsbnZlciwgcm52ZXIsIGxybnZlcjsKKwkvKiBudmVyIGlzIHNob3J0IGZvciBudW1iZXIgb2YgdmVydGl4ZXMsIGFuZCBsbnZlciBpcyB0aGUgbnVtYmVyIGlmCisJICAgd2Ugc2hpZnQgdG8gdGhlIGxlZnQsIHJudmVyIGlzIHRoZSBudW1iZXIgaWYgd2Ugc2hpZnQgdG8gdGhlCisJICAgcmlnaHQsIGFuZCBscm52ZXIgaXMgdGhlIG51bWJlciBpZiB3ZSBzaGlmdCBpbiBib3RoIGRpcmVjdGlvbnMuCisJICAgVGhlIGdvYWwgaXMgdG8gbWluaW1pemUgZmlyc3QgdGhlIG51bWJlciBvZiB2ZXJ0aXhlcywgYW5kIHNlY29uZCwKKwkgICB0aGUgbnVtYmVyIG9mIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZSBjaGFuZ2VkIGJ5IHNoaWZ0aW5nLAorCSAgIGFuZCB0aGlyZCB0aGUgbnVtYmVyIG9mIHVuY2FjaGVkIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZQorCSAgIGNoYW5nZWQgYnkgc2hpZnRpbmcgYW5kIG11c3QgYmUgcmVhZCBmcm9tIGRpc2suICAqLworCWludCBudmVyLCBsbnZlciwgcm52ZXIsIGxybnZlcjsKIAotICAgIC8qIHVzZWQgYXQgbGVhZiBsZXZlbCBvbmx5LCBTMCA9IFNbMF0gaXMgdGhlIG5vZGUgYmVpbmcgYmFsYW5jZWQsCi0gICAgICAgc0ludW0gWyBJID0gMCwxLDIgXSBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbAotICAgICAgIHJlbWFpbiBpbiBub2RlIFNJIGFmdGVyIGJhbGFuY2luZy4gIFMxIGFuZCBTMiBhcmUgbmV3Ci0gICAgICAgbm9kZXMgdGhhdCBtaWdodCBiZSBjcmVhdGVkLiAqLwotICAKLSAgICAvKiB3ZSBwZXJmb3JtIDggY2FsbHMgdG8gZ2V0X251bV92ZXIoKS4gIEZvciBlYWNoIGNhbGwgd2UgY2FsY3VsYXRlIGZpdmUgcGFyYW1ldGVycy4KLSAgICAgICB3aGVyZSA0dGggcGFyYW1ldGVyIGlzIHMxYnl0ZXMgYW5kIDV0aCAtIHMyYnl0ZXMKLSAgICAqLwotICAgIHNob3J0IHNudW0wMTJbNDBdID0gezAsfTsJLyogczBudW0sIHMxbnVtLCBzMm51bSBmb3IgOCBjYXNlcyAKLQkJCQkgICAwLDEgLSBkbyBub3Qgc2hpZnQgYW5kIGRvIG5vdCBzaGlmdCBidXQgYm90dGxlCi0JCQkJICAgMiAtIHNoaWZ0IG9ubHkgd2hvbGUgaXRlbSB0byBsZWZ0Ci0JCQkJICAgMyAtIHNoaWZ0IHRvIGxlZnQgYW5kIGJvdHRsZSBhcyBtdWNoIGFzIHBvc3NpYmxlCi0JCQkJICAgNCw1IC0gc2hpZnQgdG8gcmlnaHQJKHdob2xlIGl0ZW1zIGFuZCBhcyBtdWNoIGFzIHBvc3NpYmxlCi0JCQkJICAgNiw3IC0gc2hpZnQgdG8gYm90aCBkaXJlY3Rpb25zICh3aG9sZSBpdGVtcyBhbmQgYXMgbXVjaCBhcyBwb3NzaWJsZSkKLQkJCQkqLworCS8qIHVzZWQgYXQgbGVhZiBsZXZlbCBvbmx5LCBTMCA9IFNbMF0gaXMgdGhlIG5vZGUgYmVpbmcgYmFsYW5jZWQsCisJICAgc0ludW0gWyBJID0gMCwxLDIgXSBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbAorCSAgIHJlbWFpbiBpbiBub2RlIFNJIGFmdGVyIGJhbGFuY2luZy4gIFMxIGFuZCBTMiBhcmUgbmV3CisJICAgbm9kZXMgdGhhdCBtaWdodCBiZSBjcmVhdGVkLiAqLwogCi0gICAgLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCAqLwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNoOwotICAKLSAgICBTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0gICAgbGV2Ynl0ZXMgPSB0Yi0+aW5zZXJ0X3NpemVbaF07Ci0gIAotICAgIC8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIGNyZWF0aW5nIG5ldyByb290LiAqLwotICAgIGlmICggISBTaCApICB7Ci0JaWYgKCAhIGggKQotCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODIxMDogaXBfY2hlY2tfYmFsYW5jZTogU1swXSBjYW4gbm90IGJlIDAiKTsKLQlzd2l0Y2ggKCBuX3JldF92YWx1ZSA9IGdldF9lbXB0eV9ub2RlcyAodGIsIGgpICkgIHsKLQljYXNlIENBUlJZX09OOgotCSAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7Ci0JICAgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOyAvKiBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkICovCi0KLQljYXNlIE5PX0RJU0tfU1BBQ0U6Ci0JY2FzZSBSRVBFQVRfU0VBUkNIOgotCSAgICByZXR1cm4gbl9yZXRfdmFsdWU7Ci0JZGVmYXVsdDogICAKLQkgICAgcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLCAidnMtODIxNTogaXBfY2hlY2tfYmFsYW5jZTogaW5jb3JyZWN0IHJldHVybiB2YWx1ZSBvZiBnZXRfZW1wdHlfbm9kZXMiKTsKLQl9Ci0gICAgfQotICAKLSAgICBpZiAoIChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzICh0YiwgaCkpICE9IENBUlJZX09OICkgLyogZ2V0IHBhcmVudHMgb2YgU1toXSBuZWlnaGJvcnMuICovCi0JcmV0dXJuIG5fcmV0X3ZhbHVlOwotICAKLSAgICBzZnJlZSA9IEJfRlJFRV9TUEFDRSAoU2gpOwotCi0gICAgLyogZ2V0IGZyZWUgc3BhY2Ugb2YgbmVpZ2hib3JzICovCi0gICAgcmZyZWUgPSBnZXRfcmZyZWUgKHRiLCBoKTsKLSAgICBsZnJlZSA9IGdldF9sZnJlZSAodGIsIGgpOwotCi0gICAgaWYgKGNhbl9ub2RlX2JlX3JlbW92ZWQgKHZuLT52bl9tb2RlLCBsZnJlZSwgc2ZyZWUsIHJmcmVlLCB0YiwgaCkgPT0gTk9fQkFMQU5DSU5HX05FRURFRCkKLQkvKiBhbmQgbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLwotCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwotICAgICAKLSAgICBjcmVhdGVfdmlydHVhbF9ub2RlICh0YiwgaCk7Ci0KLSAgICAvKgkKLQlkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSBsZWZ0IG5laWdoYm9yIChpbiB0YiBzdHJ1Y3R1cmUpCi0JYW5kIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBmbG93IHRvIHRoZSBsZWZ0IG5laWdoYm9yCi0JZnJvbSB0aGUgbGVmdCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5IChyZXR1cm5lZCB2YWx1ZSkKLSAgICAqLwotICAgIGNoZWNrX2xlZnQgKHRiLCBoLCBsZnJlZSk7Ci0KLSAgICAvKgotICAgICAgZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgcmlnaHQgbmVpZ2hib3IgKGluIHRiIHN0cnVjdHVyZSkKLSAgICAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IKLSAgICAgIGZyb20gdGhlIHJpZ2h0IG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkgKHJldHVybmVkIHZhbHVlKQotICAgICovCi0gICAgY2hlY2tfcmlnaHQgKHRiLCBoLCByZnJlZSk7Ci0KLQotICAgIC8qIGFsbCBjb250ZW50cyBvZiBpbnRlcm5hbCBub2RlIFNbaF0gY2FuIGJlIG1vdmVkIGludG8gaXRzCi0gICAgICAgbmVpZ2hib3JzLCBTW2hdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcgKi8KLSAgICBpZiAoaCAmJiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpKSB7Ci0JaW50IHRvX3I7IAotICAgICAgIAotCS8qIFNpbmNlIHdlIGFyZSB3b3JraW5nIG9uIGludGVybmFsIG5vZGVzLCBhbmQgb3VyIGludGVybmFsCi0JICAgbm9kZXMgaGF2ZSBmaXhlZCBzaXplIGVudHJpZXMsIHRoZW4gd2UgY2FuIGJhbGFuY2UgYnkgdGhlCi0JICAgbnVtYmVyIG9mIGl0ZW1zIHJhdGhlciB0aGFuIHRoZSBzcGFjZSB0aGV5IGNvbnN1bWUuICBJbiB0aGlzCi0JICAgcm91dGluZSB3ZSBzZXQgdGhlIGxlZnQgbm9kZSBlcXVhbCB0byB0aGUgcmlnaHQgbm9kZSwKLQkgICBhbGxvd2luZyBhIGRpZmZlcmVuY2Ugb2YgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEgY2hpbGQKLQkgICBwb2ludGVyLiAqLwotCXRvX3IgPSAoKE1BWF9OUl9LRVkoU2gpPDwxKSsyLXRiLT5sbnVtW2hdLXRiLT5ybnVtW2hdK3ZuLT52bl9ucl9pdGVtKzEpLzIgLSAKLQkgICAgKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdKTsKLQlzZXRfcGFyYW1ldGVycyAodGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsIDAsIE5VTEwsIC0xLCAtMSk7Ci0JcmV0dXJuIENBUlJZX09OOwotICAgIH0KLQotICAgIC8qIHRoaXMgY2hlY2tzIGJhbGFuY2UgY29uZGl0aW9uLCB0aGF0IGFueSB0d28gbmVpZ2hib3Jpbmcgbm9kZXMgY2FuIG5vdCBmaXQgaW4gb25lIG5vZGUgKi8KLSAgICBSRkFMU0UoIGggJiYgCi0JICAgICggdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxIHx8IAotCSAgICAgIHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSksCi0JICAgICJ2cy04MjIwOiB0cmVlIGlzIG5vdCBiYWxhbmNlZCBvbiBpbnRlcm5hbCBsZXZlbCIpOwotICAgIFJGQUxTRSggISBoICYmICgodGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgKHRiLT5sYnl0ZXMgPT0gLTEpKSB8fAotCQkgICAgKHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICYmICh0Yi0+cmJ5dGVzID09IC0xKSkgKSwKLQkgICAgInZzLTgyMjU6IHRyZWUgaXMgbm90IGJhbGFuY2VkIG9uIGxlYWYgbGV2ZWwiKTsKLQotICAgIC8qIGFsbCBjb250ZW50cyBvZiBTWzBdIGNhbiBiZSBtb3ZlZCBpbnRvIGl0cyBuZWlnaGJvcnMKLSAgICAgICBTWzBdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcuICovCi0gICAgaWYgKCFoICYmIGlzX2xlYWZfcmVtb3ZhYmxlICh0YikpCi0JcmV0dXJuIENBUlJZX09OOwotCi0KLSAgICAvKiB3aHkgZG8gd2UgcGVyZm9ybSB0aGlzIGNoZWNrIGhlcmUgcmF0aGVyIHRoYW4gZWFybGllcj8/Ci0gICAgICAgQW5zd2VyOiB3ZSBjYW4gd2luIDEgbm9kZSBpbiBzb21lIGNhc2VzIGFib3ZlLiBNb3Jlb3ZlciB3ZQotICAgICAgIGNoZWNrZWQgaXQgYWJvdmUsIHdoZW4gd2UgY2hlY2tlZCwgdGhhdCBTWzBdIGlzIG5vdCByZW1vdmFibGUKLSAgICAgICBpbiBwcmluY2lwbGUgKi8KLSAgICBpZiAoc2ZyZWUgPj0gbGV2Ynl0ZXMpIHsgLyogbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLwotCWlmICggISBoICkKLQkgICAgdGItPnMwbnVtID0gdm4tPnZuX25yX2l0ZW07Ci0Jc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwotICAgIH0KLQotCi0gICAgewotCWludCBscGFyLCBycGFyLCBuc2V0LCBsc2V0LCByc2V0LCBscnNldDsKLQkvKiAKLQkgKiByZWd1bGFyIG92ZXJmbG93aW5nIG9mIHRoZSBub2RlCisJLyogd2UgcGVyZm9ybSA4IGNhbGxzIHRvIGdldF9udW1fdmVyKCkuICBGb3IgZWFjaCBjYWxsIHdlIGNhbGN1bGF0ZSBmaXZlIHBhcmFtZXRlcnMuCisJICAgd2hlcmUgNHRoIHBhcmFtZXRlciBpcyBzMWJ5dGVzIGFuZCA1dGggLSBzMmJ5dGVzCiAJICovCisJc2hvcnQgc251bTAxMls0MF0gPSB7IDAsIH07CS8qIHMwbnVtLCBzMW51bSwgczJudW0gZm9yIDggY2FzZXMgCisJCQkJCSAgIDAsMSAtIGRvIG5vdCBzaGlmdCBhbmQgZG8gbm90IHNoaWZ0IGJ1dCBib3R0bGUKKwkJCQkJICAgMiAtIHNoaWZ0IG9ubHkgd2hvbGUgaXRlbSB0byBsZWZ0CisJCQkJCSAgIDMgLSBzaGlmdCB0byBsZWZ0IGFuZCBib3R0bGUgYXMgbXVjaCBhcyBwb3NzaWJsZQorCQkJCQkgICA0LDUgLSBzaGlmdCB0byByaWdodCAod2hvbGUgaXRlbXMgYW5kIGFzIG11Y2ggYXMgcG9zc2libGUKKwkJCQkJICAgNiw3IC0gc2hpZnQgdG8gYm90aCBkaXJlY3Rpb25zICh3aG9sZSBpdGVtcyBhbmQgYXMgbXVjaCBhcyBwb3NzaWJsZSkKKwkJCQkJICovCiAKLQkvKiBnZXRfbnVtX3ZlciB3b3JrcyBpbiAyIG1vZGVzIChGTE9XICYgTk9fRkxPVykgCi0JICAgbHBhciwgcnBhciAtIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gbGVmdC9yaWdodCBuZWlnaGJvciAoaW5jbHVkaW5nIHNwbGl0dGluZyBpdGVtKQotCSAgIG5zZXQsIGxzZXQsIHJzZXQsIGxyc2V0IC0gc2hvd3MsIHdoZXRoZXIgZmxvd2luZyBpdGVtcyBnaXZlIGJldHRlciBwYWNraW5nIAotCSovCisJLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqU2g7CisKKwlTaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwlsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKKworCS8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIGNyZWF0aW5nIG5ldyByb290LiAqLworCWlmICghU2gpIHsKKwkJaWYgKCFoKQorCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCSAgICAgICAidnMtODIxMDogaXBfY2hlY2tfYmFsYW5jZTogU1swXSBjYW4gbm90IGJlIDAiKTsKKwkJc3dpdGNoIChuX3JldF92YWx1ZSA9IGdldF9lbXB0eV9ub2Rlcyh0YiwgaCkpIHsKKwkJY2FzZSBDQVJSWV9PTjoKKwkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQkJcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CS8qIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQgKi8KKworCQljYXNlIE5PX0RJU0tfU1BBQ0U6CisJCWNhc2UgUkVQRUFUX1NFQVJDSDoKKwkJCXJldHVybiBuX3JldF92YWx1ZTsKKwkJZGVmYXVsdDoKKwkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkgICAgICAgInZzLTgyMTU6IGlwX2NoZWNrX2JhbGFuY2U6IGluY29ycmVjdCByZXR1cm4gdmFsdWUgb2YgZ2V0X2VtcHR5X25vZGVzIik7CisJCX0KKwl9CisKKwlpZiAoKG5fcmV0X3ZhbHVlID0gZ2V0X3BhcmVudHModGIsIGgpKSAhPSBDQVJSWV9PTikJLyogZ2V0IHBhcmVudHMgb2YgU1toXSBuZWlnaGJvcnMuICovCisJCXJldHVybiBuX3JldF92YWx1ZTsKKworCXNmcmVlID0gQl9GUkVFX1NQQUNFKFNoKTsKKworCS8qIGdldCBmcmVlIHNwYWNlIG9mIG5laWdoYm9ycyAqLworCXJmcmVlID0gZ2V0X3JmcmVlKHRiLCBoKTsKKwlsZnJlZSA9IGdldF9sZnJlZSh0YiwgaCk7CisKKwlpZiAoY2FuX25vZGVfYmVfcmVtb3ZlZCh2bi0+dm5fbW9kZSwgbGZyZWUsIHNmcmVlLCByZnJlZSwgdGIsIGgpID09CisJICAgIE5PX0JBTEFOQ0lOR19ORUVERUQpCisJCS8qIGFuZCBuZXcgaXRlbSBmaXRzIGludG8gbm9kZSBTW2hdIHdpdGhvdXQgYW55IHNoaWZ0aW5nICovCisJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworCisJY3JlYXRlX3ZpcnR1YWxfbm9kZSh0YiwgaCk7CisKKwkvKiAgCisJICAgZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgbGVmdCBuZWlnaGJvciAoaW4gdGIgc3RydWN0dXJlKQorCSAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgbGVmdCBuZWlnaGJvcgorCSAgIGZyb20gdGhlIGxlZnQgbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAocmV0dXJuZWQgdmFsdWUpCisJICovCisJY2hlY2tfbGVmdCh0YiwgaCwgbGZyZWUpOworCisJLyoKKwkgICBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSByaWdodCBuZWlnaGJvciAoaW4gdGIgc3RydWN0dXJlKQorCSAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IKKwkgICBmcm9tIHRoZSByaWdodCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5IChyZXR1cm5lZCB2YWx1ZSkKKwkgKi8KKwljaGVja19yaWdodCh0YiwgaCwgcmZyZWUpOworCisJLyogYWxsIGNvbnRlbnRzIG9mIGludGVybmFsIG5vZGUgU1toXSBjYW4gYmUgbW92ZWQgaW50byBpdHMKKwkgICBuZWlnaGJvcnMsIFNbaF0gd2lsbCBiZSByZW1vdmVkIGFmdGVyIGJhbGFuY2luZyAqLworCWlmIChoICYmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkpIHsKKwkJaW50IHRvX3I7CisKKwkJLyogU2luY2Ugd2UgYXJlIHdvcmtpbmcgb24gaW50ZXJuYWwgbm9kZXMsIGFuZCBvdXIgaW50ZXJuYWwKKwkJICAgbm9kZXMgaGF2ZSBmaXhlZCBzaXplIGVudHJpZXMsIHRoZW4gd2UgY2FuIGJhbGFuY2UgYnkgdGhlCisJCSAgIG51bWJlciBvZiBpdGVtcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGhleSBjb25zdW1lLiAgSW4gdGhpcworCQkgICByb3V0aW5lIHdlIHNldCB0aGUgbGVmdCBub2RlIGVxdWFsIHRvIHRoZSByaWdodCBub2RlLAorCQkgICBhbGxvd2luZyBhIGRpZmZlcmVuY2Ugb2YgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEgY2hpbGQKKwkJICAgcG9pbnRlci4gKi8KKwkJdG9fciA9CisJCSAgICAoKE1BWF9OUl9LRVkoU2gpIDw8IDEpICsgMiAtIHRiLT5sbnVtW2hdIC0gdGItPnJudW1baF0gKworCQkgICAgIHZuLT52bl9ucl9pdGVtICsgMSkgLyAyIC0gKE1BWF9OUl9LRVkoU2gpICsgMSAtCisJCQkJCQl0Yi0+cm51bVtoXSk7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCB2bi0+dm5fbnJfaXRlbSArIDEgLSB0b19yLCB0b19yLCAwLCBOVUxMLAorCQkJICAgICAgIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiB0aGlzIGNoZWNrcyBiYWxhbmNlIGNvbmRpdGlvbiwgdGhhdCBhbnkgdHdvIG5laWdoYm9yaW5nIG5vZGVzIGNhbiBub3QgZml0IGluIG9uZSBub2RlICovCisJUkZBTFNFKGggJiYKKwkgICAgICAgKHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSB8fAorCQl0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpLAorCSAgICAgICAidnMtODIyMDogdHJlZSBpcyBub3QgYmFsYW5jZWQgb24gaW50ZXJuYWwgbGV2ZWwiKTsKKwlSRkFMU0UoIWggJiYgKCh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiAodGItPmxieXRlcyA9PSAtMSkpIHx8CisJCSAgICAgICh0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiAodGItPnJieXRlcyA9PSAtMSkpKSwKKwkgICAgICAgInZzLTgyMjU6IHRyZWUgaXMgbm90IGJhbGFuY2VkIG9uIGxlYWYgbGV2ZWwiKTsKKworCS8qIGFsbCBjb250ZW50cyBvZiBTWzBdIGNhbiBiZSBtb3ZlZCBpbnRvIGl0cyBuZWlnaGJvcnMKKwkgICBTWzBdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcuICovCisJaWYgKCFoICYmIGlzX2xlYWZfcmVtb3ZhYmxlKHRiKSkKKwkJcmV0dXJuIENBUlJZX09OOworCisJLyogd2h5IGRvIHdlIHBlcmZvcm0gdGhpcyBjaGVjayBoZXJlIHJhdGhlciB0aGFuIGVhcmxpZXI/PworCSAgIEFuc3dlcjogd2UgY2FuIHdpbiAxIG5vZGUgaW4gc29tZSBjYXNlcyBhYm92ZS4gTW9yZW92ZXIgd2UKKwkgICBjaGVja2VkIGl0IGFib3ZlLCB3aGVuIHdlIGNoZWNrZWQsIHRoYXQgU1swXSBpcyBub3QgcmVtb3ZhYmxlCisJICAgaW4gcHJpbmNpcGxlICovCisJaWYgKHNmcmVlID49IGxldmJ5dGVzKSB7CS8qIG5ldyBpdGVtIGZpdHMgaW50byBub2RlIFNbaF0gd2l0aG91dCBhbnkgc2hpZnRpbmcgKi8KKwkJaWYgKCFoKQorCQkJdGItPnMwbnVtID0gdm4tPnZuX25yX2l0ZW07CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKwl9CisKKwl7CisJCWludCBscGFyLCBycGFyLCBuc2V0LCBsc2V0LCByc2V0LCBscnNldDsKKwkJLyogCisJCSAqIHJlZ3VsYXIgb3ZlcmZsb3dpbmcgb2YgdGhlIG5vZGUKKwkJICovCisKKwkJLyogZ2V0X251bV92ZXIgd29ya3MgaW4gMiBtb2RlcyAoRkxPVyAmIE5PX0ZMT1cpIAorCQkgICBscGFyLCBycGFyIC0gbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byBsZWZ0L3JpZ2h0IG5laWdoYm9yIChpbmNsdWRpbmcgc3BsaXR0aW5nIGl0ZW0pCisJCSAgIG5zZXQsIGxzZXQsIHJzZXQsIGxyc2V0IC0gc2hvd3MsIHdoZXRoZXIgZmxvd2luZyBpdGVtcyBnaXZlIGJldHRlciBwYWNraW5nIAorCQkgKi8KICNkZWZpbmUgRkxPVyAxCi0jZGVmaW5lIE5PX0ZMT1cgMAkvKiBkbyBub3QgYW55IHNwbGl0dGluZyAqLworI2RlZmluZSBOT19GTE9XIDAJCS8qIGRvIG5vdCBhbnkgc3BsaXR0aW5nICovCiAKLQkvKiB3ZSBjaG9vc2Ugb25lIHRoZSBmb2xsb3dpbmcgKi8KKwkJLyogd2UgY2hvb3NlIG9uZSB0aGUgZm9sbG93aW5nICovCiAjZGVmaW5lIE5PVEhJTkdfU0hJRlRfTk9fRkxPVwkwCiAjZGVmaW5lIE5PVEhJTkdfU0hJRlRfRkxPVwk1CiAjZGVmaW5lIExFRlRfU0hJRlRfTk9fRkxPVwkxMApAQCAtMTMzOSwxNjQgKzEzNzAsMTczIEBACiAjZGVmaW5lIExSX1NISUZUX05PX0ZMT1cJMzAKICNkZWZpbmUgTFJfU0hJRlRfRkxPVwkJMzUKIAorCQlscGFyID0gdGItPmxudW1baF07CisJCXJwYXIgPSB0Yi0+cm51bVtoXTsKIAotCWxwYXIgPSB0Yi0+bG51bVtoXTsKLQlycGFyID0gdGItPnJudW1baF07CisJCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KKwkJICAgbm90aGluZyBpcyBzaGlmdGVkIHRvIHRoZSBuZWlnaGJvcnMsCisJCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXQgbm9kZSAoczAxMiBudW1iZXJzKSwKKwkJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55ICovCisJCW5zZXQgPSBOT1RISU5HX1NISUZUX05PX0ZMT1c7CisJCW52ZXIgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJICAgMCwgLTEsIGggPyB2bi0+dm5fbnJfaXRlbSA6IDAsIC0xLAorCQkJCSAgIHNudW0wMTIsIE5PX0ZMT1cpOwogCisJCWlmICghaCkgeworCQkJaW50IG52ZXIxOwogCi0JLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgotCSAgIG5vdGhpbmcgaXMgc2hpZnRlZCB0byB0aGUgbmVpZ2hib3JzLAotCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXQgbm9kZSAoczAxMiBudW1iZXJzKSwKLQkgICBhbmQgbnVtYmVyIG9mIGJ5dGVzIChzMWJ5dGVzKSBvZiB0aGUgc2hhcmVkIGRyb3Agd2hpY2ggZmxvdyB0byBTMSBpZiBhbnkgKi8KLQluc2V0ID0gTk9USElOR19TSElGVF9OT19GTE9XOwotCW52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLAotCQkJICAgIDAsIC0xLCBoP3ZuLT52bl9ucl9pdGVtOjAsIC0xLCAKLQkJCSAgICBzbnVtMDEyLCBOT19GTE9XKTsKKwkJCS8qIG5vdGUsIHRoYXQgaW4gdGhpcyBjYXNlIHdlIHRyeSB0byBib3R0bGUgYmV0d2VlbiBTWzBdIGFuZCBTMSAoUzEgLSB0aGUgZmlyc3QgbmV3IG5vZGUpICovCisJCQludmVyMSA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkJICAgIDAsIC0xLCAwLCAtMSwKKwkJCQkJICAgIHNudW0wMTIgKyBOT1RISU5HX1NISUZUX0ZMT1csIEZMT1cpOworCQkJaWYgKG52ZXIgPiBudmVyMSkKKwkJCQluc2V0ID0gTk9USElOR19TSElGVF9GTE9XLCBudmVyID0gbnZlcjE7CisJCX0KIAotCWlmICghaCkKLQl7Ci0JICAgIGludCBudmVyMTsKKwkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgorCQkgICBsX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgbF9zaGlmdF9ieXRlcyBvZiB0aGUgcmlnaHQgbW9zdAorCQkgICBsaXF1aWQgaXRlbSB0byBiZSBzaGlmdGVkIGFyZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IG5laWdoYm9yLAorCQkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0dGVkIG5vZGUgKHMwMTIgbnVtYmVycyksCisJCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQorCQkgKi8KKwkJbHNldCA9IExFRlRfU0hJRlRfTk9fRkxPVzsKKwkJbG52ZXIgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJICAgIGxwYXIgLSAoKGggfHwgdGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksCisJCQkJICAgIC0xLCBoID8gdm4tPnZuX25yX2l0ZW0gOiAwLCAtMSwKKwkJCQkgICAgc251bTAxMiArIExFRlRfU0hJRlRfTk9fRkxPVywgTk9fRkxPVyk7CisJCWlmICghaCkgeworCQkJaW50IGxudmVyMTsKIAotCSAgICAvKiBub3RlLCB0aGF0IGluIHRoaXMgY2FzZSB3ZSB0cnkgdG8gYm90dGxlIGJldHdlZW4gU1swXSBhbmQgUzEgKFMxIC0gdGhlIGZpcnN0IG5ldyBub2RlKSAqLwotCSAgICBudmVyMSA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAotCQkJCSAwLCAtMSwgMCwgLTEsIAotCQkJCSBzbnVtMDEyICsgTk9USElOR19TSElGVF9GTE9XLCBGTE9XKTsKLQkgICAgaWYgKG52ZXIgPiBudmVyMSkKLQkJbnNldCA9IE5PVEhJTkdfU0hJRlRfRkxPVywgbnZlciA9IG52ZXIxOworCQkJbG52ZXIxID0gZ2V0X251bV92ZXIodm4tPnZuX21vZGUsIHRiLCBoLAorCQkJCQkgICAgIGxwYXIgLQorCQkJCQkgICAgICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCksCisJCQkJCSAgICAgdGItPmxieXRlcywgMCwgLTEsCisJCQkJCSAgICAgc251bTAxMiArIExFRlRfU0hJRlRfRkxPVywgRkxPVyk7CisJCQlpZiAobG52ZXIgPiBsbnZlcjEpCisJCQkJbHNldCA9IExFRlRfU0hJRlRfRkxPVywgbG52ZXIgPSBsbnZlcjE7CisJCX0KKworCQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCisJCSAgIHJfc2hpZnRfbnVtIGZpcnN0IGl0ZW1zIGFuZCByX3NoaWZ0X2J5dGVzIG9mIHRoZSBsZWZ0IG1vc3QKKwkJICAgbGlxdWlkIGl0ZW0gdG8gYmUgc2hpZnRlZCBhcmUgc2hpZnRlZCB0byB0aGUgcmlnaHQgbmVpZ2hib3IsCisJCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKKwkJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55CisJCSAqLworCQlyc2V0ID0gUklHSFRfU0hJRlRfTk9fRkxPVzsKKwkJcm52ZXIgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJICAgIDAsIC0xLAorCQkJCSAgICBoID8gKHZuLT52bl9ucl9pdGVtIC0gcnBhcikgOiAocnBhciAtCisJCQkJCQkJCSAgICgodGItPgorCQkJCQkJCQkgICAgIHJieXRlcyAhPQorCQkJCQkJCQkgICAgIC0xKSA/IDEgOgorCQkJCQkJCQkgICAgMCkpLCAtMSwKKwkJCQkgICAgc251bTAxMiArIFJJR0hUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOworCQlpZiAoIWgpIHsKKwkJCWludCBybnZlcjE7CisKKwkJCXJudmVyMSA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkJICAgICAwLCAtMSwKKwkJCQkJICAgICAocnBhciAtCisJCQkJCSAgICAgICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCkpLAorCQkJCQkgICAgIHRiLT5yYnl0ZXMsCisJCQkJCSAgICAgc251bTAxMiArIFJJR0hUX1NISUZUX0ZMT1csIEZMT1cpOworCisJCQlpZiAocm52ZXIgPiBybnZlcjEpCisJCQkJcnNldCA9IFJJR0hUX1NISUZUX0ZMT1csIHJudmVyID0gcm52ZXIxOworCQl9CisKKwkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgorCQkgICBpdGVtcyBhcmUgc2hpZnRlZCBpbiBib3RoIGRpcmVjdGlvbnMsCisJCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKKwkJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55CisJCSAqLworCQlscnNldCA9IExSX1NISUZUX05PX0ZMT1c7CisJCWxybnZlciA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkgICAgIGxwYXIgLSAoKGggfHwgdGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksCisJCQkJICAgICAtMSwKKwkJCQkgICAgIGggPyAodm4tPnZuX25yX2l0ZW0gLSBycGFyKSA6IChycGFyIC0KKwkJCQkJCQkJICAgICgodGItPgorCQkJCQkJCQkgICAgICByYnl0ZXMgIT0KKwkJCQkJCQkJICAgICAgLTEpID8gMSA6CisJCQkJCQkJCSAgICAgMCkpLCAtMSwKKwkJCQkgICAgIHNudW0wMTIgKyBMUl9TSElGVF9OT19GTE9XLCBOT19GTE9XKTsKKwkJaWYgKCFoKSB7CisJCQlpbnQgbHJudmVyMTsKKworCQkJbHJudmVyMSA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkJICAgICAgbHBhciAtCisJCQkJCSAgICAgICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCksCisJCQkJCSAgICAgIHRiLT5sYnl0ZXMsCisJCQkJCSAgICAgIChycGFyIC0KKwkJCQkJICAgICAgICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCkpLAorCQkJCQkgICAgICB0Yi0+cmJ5dGVzLAorCQkJCQkgICAgICBzbnVtMDEyICsgTFJfU0hJRlRfRkxPVywgRkxPVyk7CisJCQlpZiAobHJudmVyID4gbHJudmVyMSkKKwkJCQlscnNldCA9IExSX1NISUZUX0ZMT1csIGxybnZlciA9IGxybnZlcjE7CisJCX0KKworCQkvKiBPdXIgZ2VuZXJhbCBzaGlmdGluZyBzdHJhdGVneSBpczoKKwkJICAgMSkgdG8gbWluaW1pemVkIG51bWJlciBvZiBuZXcgbm9kZXM7CisJCSAgIDIpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmVpZ2hib3JzIGludm9sdmVkIGluIHNoaWZ0aW5nOworCQkgICAzKSB0byBtaW5pbWl6ZWQgbnVtYmVyIG9mIGRpc2sgcmVhZHM7ICovCisKKwkJLyogd2UgY2FuIHdpbiBUV08gb3IgT05FIG5vZGVzIGJ5IHNoaWZ0aW5nIGluIGJvdGggZGlyZWN0aW9ucyAqLworCQlpZiAobHJudmVyIDwgbG52ZXIgJiYgbHJudmVyIDwgcm52ZXIpIHsKKwkJCVJGQUxTRShoICYmCisJCQkgICAgICAgKHRiLT5sbnVtW2hdICE9IDEgfHwKKwkJCQl0Yi0+cm51bVtoXSAhPSAxIHx8CisJCQkJbHJudmVyICE9IDEgfHwgcm52ZXIgIT0gMiB8fCBsbnZlciAhPSAyCisJCQkJfHwgaCAhPSAxKSwgInZzLTgyMzA6IGJhZCBoIik7CisJCQlpZiAobHJzZXQgPT0gTFJfU0hJRlRfRkxPVykKKwkJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLAorCQkJCQkgICAgICAgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsCisJCQkJCSAgICAgICB0Yi0+bGJ5dGVzLCB0Yi0+cmJ5dGVzKTsKKwkJCWVsc2UKKwkJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwKKwkJCQkJICAgICAgIHRiLT5sbnVtW2hdIC0KKwkJCQkJICAgICAgICgodGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksCisJCQkJCSAgICAgICB0Yi0+cm51bVtoXSAtCisJCQkJCSAgICAgICAoKHRiLT5yYnl0ZXMgPT0gLTEpID8gMCA6IDEpLAorCQkJCQkgICAgICAgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsIC0xLCAtMSk7CisKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCisJCS8qIGlmIHNoaWZ0aW5nIGRvZXNuJ3QgbGVhZCB0byBiZXR0ZXIgcGFja2luZyB0aGVuIGRvbid0IHNoaWZ0ICovCisJCWlmIChudmVyID09IGxybnZlcikgeworCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIG52ZXIsIHNudW0wMTIgKyBuc2V0LCAtMSwKKwkJCQkgICAgICAgLTEpOworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CisKKwkJLyogbm93IHdlIGtub3cgdGhhdCBmb3IgYmV0dGVyIHBhY2tpbmcgc2hpZnRpbmcgaW4gb25seSBvbmUKKwkJICAgZGlyZWN0aW9uIGVpdGhlciB0byB0aGUgbGVmdCBvciB0byB0aGUgcmlnaHQgaXMgcmVxdWlyZWQgKi8KKworCQkvKiAgaWYgc2hpZnRpbmcgdG8gdGhlIGxlZnQgaXMgYmV0dGVyIHRoYW4gc2hpZnRpbmcgdG8gdGhlIHJpZ2h0ICovCisJCWlmIChsbnZlciA8IHJudmVyKSB7CisJCQlTRVRfUEFSX1NISUZUX0xFRlQ7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCQkvKiBpZiBzaGlmdGluZyB0byB0aGUgcmlnaHQgaXMgYmV0dGVyIHRoYW4gc2hpZnRpbmcgdG8gdGhlIGxlZnQgKi8KKwkJaWYgKGxudmVyID4gcm52ZXIpIHsKKwkJCVNFVF9QQVJfU0hJRlRfUklHSFQ7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCQkvKiBub3cgc2hpZnRpbmcgaW4gZWl0aGVyIGRpcmVjdGlvbiBnaXZlcyB0aGUgc2FtZSBudW1iZXIKKwkJICAgb2Ygbm9kZXMgYW5kIHdlIGNhbiBtYWtlIHVzZSBvZiB0aGUgY2FjaGVkIG5laWdoYm9ycyAqLworCQlpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSh0YiwgaCkpIHsKKwkJCVNFVF9QQVJfU0hJRlRfTEVGVDsKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCisJCS8qIHNoaWZ0IHRvIHRoZSByaWdodCBpbmRlcGVuZGVudGx5IG9uIHdoZXRoZXIgdGhlIHJpZ2h0IG5laWdoYm9yIGluIGNhY2hlIG9yIG5vdCAqLworCQlTRVRfUEFSX1NISUZUX1JJR0hUOworCQlyZXR1cm4gQ0FSUllfT047CiAJfQotICAgICAgIAotIAotCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KLQkgICBsX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgbF9zaGlmdF9ieXRlcyBvZiB0aGUgcmlnaHQgbW9zdAotCSAgIGxpcXVpZCBpdGVtIHRvIGJlIHNoaWZ0ZWQgYXJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgbmVpZ2hib3IsCi0JICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdHRlZCBub2RlIChzMDEyIG51bWJlcnMpLAotCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQotCSovCi0JbHNldCA9IExFRlRfU0hJRlRfTk9fRkxPVzsKLQlsbnZlciA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAotCQkJICAgICBscGFyIC0gKCggaCB8fCB0Yi0+bGJ5dGVzID09IC0xICkgPyAwIDogMSksIC0xLCBoID8gdm4tPnZuX25yX2l0ZW06MCwgLTEsCi0JCQkgICAgIHNudW0wMTIgKyBMRUZUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOwotCWlmICghaCkKLQl7Ci0JICAgIGludCBsbnZlcjE7Ci0KLQkgICAgbG52ZXIxID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCi0JCQkJICBscGFyIC0gKCh0Yi0+bGJ5dGVzICE9IC0xKSA/IDEgOiAwKSwgdGItPmxieXRlcywgMCwgLTEsCi0JCQkJICBzbnVtMDEyICsgTEVGVF9TSElGVF9GTE9XLCBGTE9XKTsKLQkgICAgaWYgKGxudmVyID4gbG52ZXIxKQotCQlsc2V0ID0gTEVGVF9TSElGVF9GTE9XLCBsbnZlciA9IGxudmVyMTsKLQl9Ci0KLQotCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KLQkgICByX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgcl9zaGlmdF9ieXRlcyBvZiB0aGUgbGVmdCBtb3N0Ci0JICAgbGlxdWlkIGl0ZW0gdG8gYmUgc2hpZnRlZCBhcmUgc2hpZnRlZCB0byB0aGUgcmlnaHQgbmVpZ2hib3IsCi0JICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdHRlZCBub2RlIChzMDEyIG51bWJlcnMpLAotCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQotCSovCi0JcnNldCA9IFJJR0hUX1NISUZUX05PX0ZMT1c7Ci0Jcm52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKLQkJCSAgICAgMCwgLTEsIGggPyAodm4tPnZuX25yX2l0ZW0tcnBhcikgOiAocnBhciAtICgoIHRiLT5yYnl0ZXMgIT0gLTEgKSA/IDEgOiAwKSksIC0xLCAKLQkJCSAgICAgc251bTAxMiArIFJJR0hUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOwotCWlmICghaCkKLQl7Ci0JICAgIGludCBybnZlcjE7Ci0KLQkgICAgcm52ZXIxID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCi0JCQkJICAwLCAtMSwgKHJwYXIgLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwgdGItPnJieXRlcywgCi0JCQkJICBzbnVtMDEyICsgUklHSFRfU0hJRlRfRkxPVywgRkxPVyk7Ci0KLQkgICAgaWYgKHJudmVyID4gcm52ZXIxKQotCQlyc2V0ID0gUklHSFRfU0hJRlRfRkxPVywgcm52ZXIgPSBybnZlcjE7Ci0JfQotCi0KLQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCi0JICAgaXRlbXMgYXJlIHNoaWZ0ZWQgaW4gYm90aCBkaXJlY3Rpb25zLAotCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKLQkgICBhbmQgbnVtYmVyIG9mIGJ5dGVzIChzMWJ5dGVzKSBvZiB0aGUgc2hhcmVkIGRyb3Agd2hpY2ggZmxvdyB0byBTMSBpZiBhbnkKLQkqLwotCWxyc2V0ID0gTFJfU0hJRlRfTk9fRkxPVzsKLQlscm52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKLQkJCSAgICAgIGxwYXIgLSAoKGggfHwgdGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksIC0xLCBoID8gKHZuLT52bl9ucl9pdGVtLXJwYXIpOihycGFyIC0gKCh0Yi0+cmJ5dGVzICE9IC0xKSA/IDEgOiAwKSksIC0xLAotCQkJICAgICAgc251bTAxMiArIExSX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOwotCWlmICghaCkKLQl7Ci0JICAgIGludCBscm52ZXIxOwotCi0JICAgIGxybnZlcjEgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKLQkJCQkgICBscGFyIC0gKCh0Yi0+bGJ5dGVzICE9IC0xKSA/IDEgOiAwKSwgdGItPmxieXRlcywgKHJwYXIgLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwgdGItPnJieXRlcywKLQkJCQkgICBzbnVtMDEyICsgTFJfU0hJRlRfRkxPVywgRkxPVyk7Ci0JICAgIGlmIChscm52ZXIgPiBscm52ZXIxKQotCQlscnNldCA9IExSX1NISUZUX0ZMT1csIGxybnZlciA9IGxybnZlcjE7Ci0JfQotCi0KLQotCS8qIE91ciBnZW5lcmFsIHNoaWZ0aW5nIHN0cmF0ZWd5IGlzOgotCSAgIDEpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmV3IG5vZGVzOwotCSAgIDIpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmVpZ2hib3JzIGludm9sdmVkIGluIHNoaWZ0aW5nOwotCSAgIDMpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgZGlzayByZWFkczsgKi8KLQotCS8qIHdlIGNhbiB3aW4gVFdPIG9yIE9ORSBub2RlcyBieSBzaGlmdGluZyBpbiBib3RoIGRpcmVjdGlvbnMgKi8KLQlpZiAobHJudmVyIDwgbG52ZXIgJiYgbHJudmVyIDwgcm52ZXIpCi0JewotCSAgICBSRkFMU0UoIGggJiYgCi0JCSAgICAodGItPmxudW1baF0gIT0gMSB8fCAKLQkJICAgICB0Yi0+cm51bVtoXSAhPSAxIHx8IAotCQkgICAgIGxybnZlciAhPSAxIHx8IHJudmVyICE9IDIgfHwgbG52ZXIgIT0gMiB8fCBoICE9IDEpLAotCQkgICAgInZzLTgyMzA6IGJhZCBoIik7Ci0JICAgIGlmIChscnNldCA9PSBMUl9TSElGVF9GTE9XKQotCQlzZXRfcGFyYW1ldGVycyAodGIsIGgsIHRiLT5sbnVtW2hdLCB0Yi0+cm51bVtoXSwgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsCi0JCQkJdGItPmxieXRlcywgdGItPnJieXRlcyk7Ci0JICAgIGVsc2UKLQkJc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCB0Yi0+bG51bVtoXSAtICgodGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksIAotCQkJCXRiLT5ybnVtW2hdIC0gKCh0Yi0+cmJ5dGVzID09IC0xKSA/IDAgOiAxKSwgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsIC0xLCAtMSk7Ci0KLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLQotCS8qIGlmIHNoaWZ0aW5nIGRvZXNuJ3QgbGVhZCB0byBiZXR0ZXIgcGFja2luZyB0aGVuIGRvbid0IHNoaWZ0ICovCi0JaWYgKG52ZXIgPT0gbHJudmVyKQotCXsKLQkgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCBudmVyLCBzbnVtMDEyICsgbnNldCwgLTEsIC0xKTsKLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLQotCi0JLyogbm93IHdlIGtub3cgdGhhdCBmb3IgYmV0dGVyIHBhY2tpbmcgc2hpZnRpbmcgaW4gb25seSBvbmUKLQkgICBkaXJlY3Rpb24gZWl0aGVyIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZSByaWdodCBpcyByZXF1aXJlZCAqLwotCi0JLyogIGlmIHNoaWZ0aW5nIHRvIHRoZSBsZWZ0IGlzIGJldHRlciB0aGFuIHNoaWZ0aW5nIHRvIHRoZSByaWdodCAqLwotCWlmIChsbnZlciA8IHJudmVyKQotCXsKLQkgICAgU0VUX1BBUl9TSElGVF9MRUZUOwotCSAgICByZXR1cm4gQ0FSUllfT047Ci0JfQotCi0JLyogaWYgc2hpZnRpbmcgdG8gdGhlIHJpZ2h0IGlzIGJldHRlciB0aGFuIHNoaWZ0aW5nIHRvIHRoZSBsZWZ0ICovCi0JaWYgKGxudmVyID4gcm52ZXIpCi0JewotCSAgICBTRVRfUEFSX1NISUZUX1JJR0hUOwotCSAgICByZXR1cm4gQ0FSUllfT047Ci0JfQotCi0KLQkvKiBub3cgc2hpZnRpbmcgaW4gZWl0aGVyIGRpcmVjdGlvbiBnaXZlcyB0aGUgc2FtZSBudW1iZXIKLQkgICBvZiBub2RlcyBhbmQgd2UgY2FuIG1ha2UgdXNlIG9mIHRoZSBjYWNoZWQgbmVpZ2hib3JzICovCi0JaWYgKGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUgKHRiLGgpKQotCXsKLQkgICAgU0VUX1BBUl9TSElGVF9MRUZUOwotCSAgICByZXR1cm4gQ0FSUllfT047Ci0JfQotCi0JLyogc2hpZnQgdG8gdGhlIHJpZ2h0IGluZGVwZW5kZW50bHkgb24gd2hldGhlciB0aGUgcmlnaHQgbmVpZ2hib3IgaW4gY2FjaGUgb3Igbm90ICovCi0JU0VUX1BBUl9TSElGVF9SSUdIVDsKLQlyZXR1cm4gQ0FSUllfT047Ci0gICAgfQogfQogCi0KIC8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBEZWNyZWFzaW5nIGl0cyBzaXplIGJ5CiAgKiBEZWxldGluZyBvciBDdXR0aW5nIGZvciBJTlRFUk5BTCBub2RlIG9mIFMrdHJlZS4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KQEAgLTE1MTMsMTU3ICsxNTUzLDE3MyBAQAogICogTm90ZTogSXRlbXMgb2YgaW50ZXJuYWwgbm9kZXMgaGF2ZSBmaXhlZCBzaXplLCBzbyB0aGUgYmFsYW5jZSBjb25kaXRpb24gZm9yCiAgKiB0aGUgaW50ZXJuYWwgcGFydCBvZiBTK3RyZWUgaXMgYXMgZm9yIHRoZSBCLXRyZWVzLgogICovCi1zdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47CisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4gPSB0Yi0+dGJfdm47CiAKLSAgLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCwKLSAgICAgYW5kIEZoIGlzIGl0cyBmYXRoZXIuICAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTaCwgKiBGaDsKLSAgaW50IG1heHNpemUsCi0gICAgICBuX3JldF92YWx1ZTsKLSAgaW50IGxmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwgYW5kIFIgKi87CisJLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCwKKwkgICBhbmQgRmggaXMgaXRzIGZhdGhlci4gICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpTaCwgKkZoOworCWludCBtYXhzaXplLCBuX3JldF92YWx1ZTsKKwlpbnQgbGZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCBhbmQgUiAqLyA7CiAKLSAgU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOyAKLSAgRmggPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOyAKKwlTaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwlGaCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKIAotICBtYXhzaXplID0gTUFYX0NISUxEX1NJWkUoU2gpOyAKKwltYXhzaXplID0gTUFYX0NISUxEX1NJWkUoU2gpOwogCiAvKiAgIHVzaW5nIHRiLT5pbnNlcnRfc2l6ZVtoXSwgd2hpY2ggaXMgbmVnYXRpdmUgaW4gdGhpcyBjYXNlLCBjcmVhdGVfdmlydHVhbF9ub2RlIGNhbGN1bGF0ZXM6ICovCiAvKiAgIG5ld19ucl9pdGVtID0gbnVtYmVyIG9mIGl0ZW1zIG5vZGUgd291bGQgaGF2ZSBpZiBvcGVyYXRpb24gaXMgKi8KIC8qIAlwZXJmb3JtZWQgd2l0aG91dCBiYWxhbmNpbmcgKG5ld19ucl9pdGVtKTsgKi8KLSAgY3JlYXRlX3ZpcnR1YWxfbm9kZSAodGIsIGgpOworCWNyZWF0ZV92aXJ0dWFsX25vZGUodGIsIGgpOwogCi0gIGlmICggISBGaCApCi0gICAgeyAgIC8qIFNbaF0gaXMgdGhlIHJvb3QuICovCi0gICAgICBpZiAoIHZuLT52bl9ucl9pdGVtID4gMCApCi0JewotCSAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotCSAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7IC8qIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQgKi8KLQl9Ci0gICAgICAvKiBuZXdfbnJfaXRlbSA9PSAwLgotICAgICAgICogQ3VycmVudCByb290IHdpbGwgYmUgZGVsZXRlZCByZXN1bHRpbmcgaW4KLSAgICAgICAqIGRlY3JlbWVudGluZyB0aGUgdHJlZSBoZWlnaHQuICovCi0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDAsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047Ci0gICAgfQotCi0gIGlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X3BhcmVudHModGIsaCkpICE9IENBUlJZX09OICkKLSAgICByZXR1cm4gbl9yZXRfdmFsdWU7Ci0KLQotICAvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KLSAgcmZyZWUgPSBnZXRfcmZyZWUgKHRiLCBoKTsKLSAgbGZyZWUgPSBnZXRfbGZyZWUgKHRiLCBoKTsKLQkJCi0gIC8qIGRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gZml0IGludG8gbmVpZ2hib3JzICovCi0gIGNoZWNrX2xlZnQgKHRiLCBoLCBsZnJlZSk7Ci0gIGNoZWNrX3JpZ2h0ICh0YiwgaCwgcmZyZWUpOwotCi0KLSAgaWYgKCB2bi0+dm5fbnJfaXRlbSA+PSBNSU5fTlJfS0VZKFNoKSApCi0gICAgeyAvKiBCYWxhbmNlIGNvbmRpdGlvbiBmb3IgdGhlIGludGVybmFsIG5vZGUgaXMgdmFsaWQuCi0gICAgICAgKiBJbiB0aGlzIGNhc2Ugd2UgYmFsYW5jZSBvbmx5IGlmIGl0IGxlYWRzIHRvIGJldHRlciBwYWNraW5nLiAqLyAKLSAgICAgIGlmICggdm4tPnZuX25yX2l0ZW0gPT0gTUlOX05SX0tFWShTaCkgKQotCXsgLyogSGVyZSB3ZSBqb2luIFNbaF0gd2l0aCBvbmUgb2YgaXRzIG5laWdoYm9ycywKLQkgICAqIHdoaWNoIGlzIGltcG9zc2libGUgd2l0aCBncmVhdGVyIHZhbHVlcyBvZiBuZXdfbnJfaXRlbS4gKi8KLQkgIGlmICggdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxICkKLQkgICAgewotCSAgICAgIC8qIEFsbCBjb250ZW50cyBvZiBTW2hdIGNhbiBiZSBtb3ZlZCB0byBMW2hdLiAqLwotCSAgICAgIGludCBuOwotCSAgICAgIGludCBvcmRlcl9MOwotCSAgICAgIAotCSAgICAgIG9yZGVyX0wgPSAoKG49UEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkpPT0wKSA/IEJfTlJfSVRFTVModGItPkZMW2hdKSA6IG4gLSAxOwotCSAgICAgIG4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RkxbaF0sb3JkZXJfTCkpIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0JICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAtbi0xLCAwLCAwLCBOVUxMLCAtMSwgLTEpOwotCSAgICAgIHJldHVybiBDQVJSWV9PTjsKLQkgICAgfQotCi0JICBpZiAoIHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSApCi0JICAgIHsKLQkgICAgICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gUltoXS4gKi8KLQkgICAgICBpbnQgbjsKLQkgICAgICBpbnQgb3JkZXJfUjsKLQkgICAgCi0JICAgICAgb3JkZXJfUiA9ICgobj1QQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLCBoKSk9PUJfTlJfSVRFTVMoRmgpKSA/IDAgOiBuICsgMTsKLQkgICAgICBuID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZSW2hdLG9yZGVyX1IpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOwotCSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgLW4tMSwgMCwgTlVMTCwgLTEsIC0xKTsKLQkgICAgICByZXR1cm4gQ0FSUllfT047ICAgCi0JICAgIH0KKwlpZiAoIUZoKSB7CQkvKiBTW2hdIGlzIHRoZSByb290LiAqLworCQlpZiAodm4tPnZuX25yX2l0ZW0gPiAwKSB7CisJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwkJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwkvKiBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkICovCisJCX0KKwkJLyogbmV3X25yX2l0ZW0gPT0gMC4KKwkJICogQ3VycmVudCByb290IHdpbGwgYmUgZGVsZXRlZCByZXN1bHRpbmcgaW4KKwkJICogZGVjcmVtZW50aW5nIHRoZSB0cmVlIGhlaWdodC4gKi8KKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIDAsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKIAl9CiAKLSAgICAgIGlmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKLQl7Ci0JICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLwotCSAgaW50IHRvX3I7CisJaWYgKChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzKHRiLCBoKSkgIT0gQ0FSUllfT04pCisJCXJldHVybiBuX3JldF92YWx1ZTsKIAotCSAgdG9fciA9ICgoTUFYX05SX0tFWShTaCk8PDEpKzItdGItPmxudW1baF0tdGItPnJudW1baF0rdm4tPnZuX25yX2l0ZW0rMSkvMiAtIAotCSAgICAoTUFYX05SX0tFWShTaCkgKyAxIC0gdGItPnJudW1baF0pOwotCSAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCB2bi0+dm5fbnJfaXRlbSArIDEgLSB0b19yLCB0b19yLCAwLCBOVUxMLCAtMSwgLTEpOwotCSAgcmV0dXJuIENBUlJZX09OOworCS8qIGdldCBmcmVlIHNwYWNlIG9mIG5laWdoYm9ycyAqLworCXJmcmVlID0gZ2V0X3JmcmVlKHRiLCBoKTsKKwlsZnJlZSA9IGdldF9sZnJlZSh0YiwgaCk7CisKKwkvKiBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIGZpdCBpbnRvIG5laWdoYm9ycyAqLworCWNoZWNrX2xlZnQodGIsIGgsIGxmcmVlKTsKKwljaGVja19yaWdodCh0YiwgaCwgcmZyZWUpOworCisJaWYgKHZuLT52bl9ucl9pdGVtID49IE1JTl9OUl9LRVkoU2gpKSB7CS8qIEJhbGFuY2UgY29uZGl0aW9uIGZvciB0aGUgaW50ZXJuYWwgbm9kZSBpcyB2YWxpZC4KKwkJCQkJCSAqIEluIHRoaXMgY2FzZSB3ZSBiYWxhbmNlIG9ubHkgaWYgaXQgbGVhZHMgdG8gYmV0dGVyIHBhY2tpbmcuICovCisJCWlmICh2bi0+dm5fbnJfaXRlbSA9PSBNSU5fTlJfS0VZKFNoKSkgewkvKiBIZXJlIHdlIGpvaW4gU1toXSB3aXRoIG9uZSBvZiBpdHMgbmVpZ2hib3JzLAorCQkJCQkJCSAqIHdoaWNoIGlzIGltcG9zc2libGUgd2l0aCBncmVhdGVyIHZhbHVlcyBvZiBuZXdfbnJfaXRlbS4gKi8KKwkJCWlmICh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpIHsKKwkJCQkvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gTFtoXS4gKi8KKwkJCQlpbnQgbjsKKwkJCQlpbnQgb3JkZXJfTDsKKworCQkJCW9yZGVyX0wgPQorCQkJCSAgICAoKG4gPQorCQkJCSAgICAgIFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsCisJCQkJCQkJICBoKSkgPT0KKwkJCQkgICAgIDApID8gQl9OUl9JVEVNUyh0Yi0+RkxbaF0pIDogbiAtIDE7CisJCQkJbiA9IGRjX3NpemUoQl9OX0NISUxEKHRiLT5GTFtoXSwgb3JkZXJfTCkpIC8KKwkJCQkgICAgKERDX1NJWkUgKyBLRVlfU0laRSk7CisJCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIC1uIC0gMSwgMCwgMCwgTlVMTCwgLTEsCisJCQkJCSAgICAgICAtMSk7CisJCQkJcmV0dXJuIENBUlJZX09OOworCQkJfQorCisJCQlpZiAodGItPnJudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSB7CisJCQkJLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIFJbaF0uICovCisJCQkJaW50IG47CisJCQkJaW50IG9yZGVyX1I7CisKKwkJCQlvcmRlcl9SID0KKwkJCQkgICAgKChuID0KKwkJCQkgICAgICBQQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLAorCQkJCQkJCSAgaCkpID09CisJCQkJICAgICBCX05SX0lURU1TKEZoKSkgPyAwIDogbiArIDE7CisJCQkJbiA9IGRjX3NpemUoQl9OX0NISUxEKHRiLT5GUltoXSwgb3JkZXJfUikpIC8KKwkJCQkgICAgKERDX1NJWkUgKyBLRVlfU0laRSk7CisJCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIC1uIC0gMSwgMCwgTlVMTCwgLTEsCisJCQkJCSAgICAgICAtMSk7CisJCQkJcmV0dXJuIENBUlJZX09OOworCQkJfQorCQl9CisKKwkJaWYgKHRiLT5ybnVtW2hdICsgdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSB7CisJCQkvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLworCQkJaW50IHRvX3I7CisKKwkJCXRvX3IgPQorCQkJICAgICgoTUFYX05SX0tFWShTaCkgPDwgMSkgKyAyIC0gdGItPmxudW1baF0gLQorCQkJICAgICB0Yi0+cm51bVtoXSArIHZuLT52bl9ucl9pdGVtICsgMSkgLyAyIC0KKwkJCSAgICAoTUFYX05SX0tFWShTaCkgKyAxIC0gdGItPnJudW1baF0pOworCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsCisJCQkJICAgICAgIDAsIE5VTEwsIC0xLCAtMSk7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCQkvKiBCYWxhbmNpbmcgZG9lcyBub3QgbGVhZCB0byBiZXR0ZXIgcGFja2luZy4gKi8KKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwogCX0KIAotICAgICAgLyogQmFsYW5jaW5nIGRvZXMgbm90IGxlYWQgdG8gYmV0dGVyIHBhY2tpbmcuICovCi0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKLSAgICB9CisJLyogQ3VycmVudCBub2RlIGNvbnRhaW4gaW5zdWZmaWNpZW50IG51bWJlciBvZiBpdGVtcy4gQmFsYW5jaW5nIGlzIHJlcXVpcmVkLiAqLworCS8qIENoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbaF0gd2l0aCBsZWZ0IG5laWdoYm9yLiAqLworCWlmICh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCisJCWlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlKHRiLCBoKQorCQkgICAgfHwgdGItPnJudW1baF0gPCB2bi0+dm5fbnJfaXRlbSArIDEgfHwgIXRiLT5GUltoXSkgeworCQkJaW50IG47CisJCQlpbnQgb3JkZXJfTDsKIAotICAvKiBDdXJyZW50IG5vZGUgY29udGFpbiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGl0ZW1zLiBCYWxhbmNpbmcgaXMgcmVxdWlyZWQuICovCQotICAvKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTW2hdIHdpdGggbGVmdCBuZWlnaGJvci4gKi8KLSAgaWYgKHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKLSAgICBpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSAodGIsaCkgfHwgdGItPnJudW1baF0gPCB2bi0+dm5fbnJfaXRlbSArIDEgfHwgIXRiLT5GUltoXSkKLSAgICAgIHsKLQlpbnQgbjsKLQlpbnQgb3JkZXJfTDsKLQkgICAgICAKLQlvcmRlcl9MID0gKChuPVBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIGgpKT09MCkgPyBCX05SX0lURU1TKHRiLT5GTFtoXSkgOiBuIC0gMTsKLQluID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZMW2hdLG9yZGVyX0wpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOwotCXNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLW4tMSwgMCwgMCwgTlVMTCwgLTEsIC0xKTsKKwkJCW9yZGVyX0wgPQorCQkJICAgICgobiA9CisJCQkgICAgICBQQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLAorCQkJCQkJICBoKSkgPT0KKwkJCSAgICAgMCkgPyBCX05SX0lURU1TKHRiLT5GTFtoXSkgOiBuIC0gMTsKKwkJCW4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RkxbaF0sIG9yZGVyX0wpKSAvIChEQ19TSVpFICsKKwkJCQkJCQkJICAgICAgS0VZX1NJWkUpOworCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIC1uIC0gMSwgMCwgMCwgTlVMTCwgLTEsIC0xKTsKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCisJLyogQ2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgU1toXSB3aXRoIHJpZ2h0IG5laWdoYm9yLiAqLworCWlmICh0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpIHsKKwkJaW50IG47CisJCWludCBvcmRlcl9SOworCisJCW9yZGVyX1IgPQorCQkgICAgKChuID0KKwkJICAgICAgUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwKKwkJCQkJICBoKSkgPT0gQl9OUl9JVEVNUyhGaCkpID8gMCA6IChuICsgMSk7CisJCW4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RlJbaF0sIG9yZGVyX1IpKSAvIChEQ19TSVpFICsKKwkJCQkJCQkgICAgICBLRVlfU0laRSk7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAtbiAtIDEsIDAsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLworCWlmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkgeworCQlpbnQgdG9fcjsKKworCQl0b19yID0KKwkJICAgICgoTUFYX05SX0tFWShTaCkgPDwgMSkgKyAyIC0gdGItPmxudW1baF0gLSB0Yi0+cm51bVtoXSArCisJCSAgICAgdm4tPnZuX25yX2l0ZW0gKyAxKSAvIDIgLSAoTUFYX05SX0tFWShTaCkgKyAxIC0KKwkJCQkJCXRiLT5ybnVtW2hdKTsKKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsIDAsIE5VTEwsCisJCQkgICAgICAgLTEsIC0xKTsKKwkJcmV0dXJuIENBUlJZX09OOworCX0KKworCS8qIEZvciBpbnRlcm5hbCBub2RlcyB0cnkgdG8gYm9ycm93IGl0ZW0gZnJvbSBhIG5laWdoYm9yICovCisJUkZBTFNFKCF0Yi0+RkxbaF0gJiYgIXRiLT5GUltoXSwgInZzLTgyMzU6IHRyeWluZyB0byBib3Jyb3cgZm9yIHJvb3QiKTsKKworCS8qIEJvcnJvdyBvbmUgb3IgdHdvIGl0ZW1zIGZyb20gY2FjaGluZyBuZWlnaGJvciAqLworCWlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlKHRiLCBoKSB8fCAhdGItPkZSW2hdKSB7CisJCWludCBmcm9tX2w7CisKKwkJZnJvbV9sID0KKwkJICAgIChNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+bG51bVtoXSArIHZuLT52bl9ucl9pdGVtICsKKwkJICAgICAxKSAvIDIgLSAodm4tPnZuX25yX2l0ZW0gKyAxKTsKKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIC1mcm9tX2wsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwKKwkJICAgICAgIC0oKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdICsgdm4tPnZuX25yX2l0ZW0gKworCQkJICAxKSAvIDIgLSAodm4tPnZuX25yX2l0ZW0gKyAxKSksIDEsIE5VTEwsIC0xLCAtMSk7CiAJcmV0dXJuIENBUlJZX09OOwotICAgICAgfQotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbaF0gd2l0aCByaWdodCBuZWlnaGJvci4gKi8KLSAgaWYgKHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKLSAgICB7Ci0gICAgICBpbnQgbjsKLSAgICAgIGludCBvcmRlcl9SOwotCSAgICAKLSAgICAgIG9yZGVyX1IgPSAoKG49UEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkpPT1CX05SX0lURU1TKEZoKSkgPyAwIDogKG4gKyAxKTsKLSAgICAgIG4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RlJbaF0sb3JkZXJfUikpIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC1uLTEsIDAsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047ICAgCi0gICAgfQotCi0gIC8qIEFsbCBjb250ZW50cyBvZiBTW2hdIGNhbiBiZSBtb3ZlZCB0byB0aGUgbmVpZ2hib3JzIChMW2hdICYgUltoXSkuICovCi0gIGlmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKLSAgICB7Ci0gICAgICBpbnQgdG9fcjsKLQkgICAgCi0gICAgICB0b19yID0gKChNQVhfTlJfS0VZKFNoKTw8MSkrMi10Yi0+bG51bVtoXS10Yi0+cm51bVtoXSt2bi0+dm5fbnJfaXRlbSsxKS8yIC0gCi0JKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdKTsKLSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgdm4tPnZuX25yX2l0ZW0gKyAxIC0gdG9fciwgdG9fciwgMCwgTlVMTCwgLTEsIC0xKTsKLSAgICAgIHJldHVybiBDQVJSWV9PTjsKLSAgICB9Ci0KLSAgLyogRm9yIGludGVybmFsIG5vZGVzIHRyeSB0byBib3Jyb3cgaXRlbSBmcm9tIGEgbmVpZ2hib3IgKi8KLSAgUkZBTFNFKCAhdGItPkZMW2hdICYmICF0Yi0+RlJbaF0sICJ2cy04MjM1OiB0cnlpbmcgdG8gYm9ycm93IGZvciByb290Iik7Ci0KLSAgLyogQm9ycm93IG9uZSBvciB0d28gaXRlbXMgZnJvbSBjYWNoaW5nIG5laWdoYm9yICovCi0gIGlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlICh0YixoKSB8fCAhdGItPkZSW2hdKQotICAgIHsKLSAgICAgIGludCBmcm9tX2w7Ci0JCQotICAgICAgZnJvbV9sID0gKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5sbnVtW2hdICsgdm4tPnZuX25yX2l0ZW0gKyAxKSAvIDIgLSAgKHZuLT52bl9ucl9pdGVtICsgMSk7Ci0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIC1mcm9tX2wsIDAsIDEsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047Ci0gICAgfQotCi0gIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgLSgoTUFYX05SX0tFWShTaCkrMS10Yi0+cm51bVtoXSt2bi0+dm5fbnJfaXRlbSsxKS8yLSh2bi0+dm5fbnJfaXRlbSsxKSksIDEsIAotCQkgIE5VTEwsIC0xLCAtMSk7Ci0gIHJldHVybiBDQVJSWV9PTjsKIH0KIAotCiAvKiBDaGVjayB3aGV0aGVyIGN1cnJlbnQgbm9kZSBTW2hdIGlzIGJhbGFuY2VkIHdoZW4gRGVjcmVhc2luZyBpdHMgc2l6ZSBieQogICogRGVsZXRpbmcgb3IgVHJ1bmNhdGluZyBmb3IgTEVBRiBub2RlIG9mIFMrdHJlZS4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KQEAgLTE2NzcsOTEgKzE3MzMsODcgQEAKICAqCSAgICAgICAtMSAtIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CiAgKgkgICAgICAgLTIgLSBubyBkaXNrIHNwYWNlLgogICovCi1zdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2VfbGVhZiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3N0YXRpYyBpbnQgZGNfY2hlY2tfYmFsYW5jZV9sZWFmKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCkKIHsKLSAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOwogCi0gIC8qIE51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgZGVsZXRlZCBmcm9tCi0gICAgICh2YWx1ZSBpcyBuZWdhdGl2ZSBpZiBieXRlcyBhcmUgZGVsZXRlZCkgYnVmZmVyIHdoaWNoCi0gICAgIGNvbnRhaW5zIG5vZGUgYmVpbmcgYmFsYW5jZWQuICBUaGUgbW5lbW9uaWMgaXMgdGhhdCB0aGUKLSAgICAgYXR0ZW1wdGVkIGNoYW5nZSBpbiBub2RlIHNwYWNlIHVzZWQgbGV2ZWwgaXMgbGV2Ynl0ZXMgYnl0ZXMuICovCi0gIGludCBsZXZieXRlczsKLSAgLyogdGhlIG1heGltYWwgaXRlbSBzaXplICovCi0gIGludCBtYXhzaXplLAotICAgICAgbl9yZXRfdmFsdWU7Ci0gIC8qIFMwIGlzIHRoZSBub2RlIHdob3NlIGJhbGFuY2UgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQsCi0gICAgIGFuZCBGMCBpcyBpdHMgZmF0aGVyLiAgKi8KLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogUzAsICogRjA7Ci0gIGludCBsZnJlZSwgcmZyZWUgLyogZnJlZSBzcGFjZSBpbiBMIGFuZCBSICovOworCS8qIE51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgZGVsZXRlZCBmcm9tCisJICAgKHZhbHVlIGlzIG5lZ2F0aXZlIGlmIGJ5dGVzIGFyZSBkZWxldGVkKSBidWZmZXIgd2hpY2gKKwkgICBjb250YWlucyBub2RlIGJlaW5nIGJhbGFuY2VkLiAgVGhlIG1uZW1vbmljIGlzIHRoYXQgdGhlCisJICAgYXR0ZW1wdGVkIGNoYW5nZSBpbiBub2RlIHNwYWNlIHVzZWQgbGV2ZWwgaXMgbGV2Ynl0ZXMgYnl0ZXMuICovCisJaW50IGxldmJ5dGVzOworCS8qIHRoZSBtYXhpbWFsIGl0ZW0gc2l6ZSAqLworCWludCBtYXhzaXplLCBuX3JldF92YWx1ZTsKKwkvKiBTMCBpcyB0aGUgbm9kZSB3aG9zZSBiYWxhbmNlIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkLAorCSAgIGFuZCBGMCBpcyBpdHMgZmF0aGVyLiAgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlMwLCAqRjA7CisJaW50IGxmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwgYW5kIFIgKi8gOwogCi0gIFMwID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCAwKTsKLSAgRjAgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCVMwID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApOworCUYwID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApOwogCi0gIGxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOworCWxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOwogCi0gIG1heHNpemUgPSBNQVhfQ0hJTERfU0laRShTMCk7IAkvKiBtYXhpbWFsIHBvc3NpYmxlIHNpemUgb2YgYW4gaXRlbSAqLworCW1heHNpemUgPSBNQVhfQ0hJTERfU0laRShTMCk7CS8qIG1heGltYWwgcG9zc2libGUgc2l6ZSBvZiBhbiBpdGVtICovCiAKLSAgaWYgKCAhIEYwICkKLSAgICB7ICAvKiBTWzBdIGlzIHRoZSByb290IG5vdy4gKi8KKwlpZiAoIUYwKSB7CQkvKiBTWzBdIGlzIHRoZSByb290IG5vdy4gKi8KIAotICAgICAgUkZBTFNFKCAtbGV2Ynl0ZXMgPj0gbWF4c2l6ZSAtIEJfRlJFRV9TUEFDRSAoUzApLAotCSAgICAgICJ2cy04MjQwOiBhdHRlbXB0IHRvIGNyZWF0ZSBlbXB0eSBidWZmZXIgdHJlZSIpOworCQlSRkFMU0UoLWxldmJ5dGVzID49IG1heHNpemUgLSBCX0ZSRUVfU1BBQ0UoUzApLAorCQkgICAgICAgInZzLTgyNDA6IGF0dGVtcHQgdG8gY3JlYXRlIGVtcHR5IGJ1ZmZlciB0cmVlIik7CiAKLSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKLSAgICAgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwotICAgIH0KKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworCX0KIAotICBpZiAoIChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzKHRiLGgpKSAhPSBDQVJSWV9PTiApCi0gICAgcmV0dXJuIG5fcmV0X3ZhbHVlOworCWlmICgobl9yZXRfdmFsdWUgPSBnZXRfcGFyZW50cyh0YiwgaCkpICE9IENBUlJZX09OKQorCQlyZXR1cm4gbl9yZXRfdmFsdWU7CiAKLSAgLyogZ2V0IGZyZWUgc3BhY2Ugb2YgbmVpZ2hib3JzICovCi0gIHJmcmVlID0gZ2V0X3JmcmVlICh0YiwgaCk7Ci0gIGxmcmVlID0gZ2V0X2xmcmVlICh0YiwgaCk7CQkKKwkvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KKwlyZnJlZSA9IGdldF9yZnJlZSh0YiwgaCk7CisJbGZyZWUgPSBnZXRfbGZyZWUodGIsIGgpOwogCi0gIGNyZWF0ZV92aXJ0dWFsX25vZGUgKHRiLCBoKTsKKwljcmVhdGVfdmlydHVhbF9ub2RlKHRiLCBoKTsKIAotICAvKiBpZiAzIGxlYXZlcyBjYW4gYmUgbWVyZ2UgdG8gb25lLCBzZXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuICovCi0gIGlmIChhcmVfbGVhdmVzX3JlbW92YWJsZSAodGIsIGxmcmVlLCByZnJlZSkpCi0gICAgcmV0dXJuIENBUlJZX09OOworCS8qIGlmIDMgbGVhdmVzIGNhbiBiZSBtZXJnZSB0byBvbmUsIHNldCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gKi8KKwlpZiAoYXJlX2xlYXZlc19yZW1vdmFibGUodGIsIGxmcmVlLCByZnJlZSkpCisJCXJldHVybiBDQVJSWV9PTjsKIAotICAvKiBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSBsZWZ0L3JpZ2h0ICBuZWlnaGJvcgotICAgICBhbmQgdGhlIG1heGltYWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGZsb3cgdG8gdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IKLSAgICAgZnJvbSB0aGUgbGVmdC9yaWdodCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5Ci0gICAgICovCi0gIGNoZWNrX2xlZnQgKHRiLCBoLCBsZnJlZSk7Ci0gIGNoZWNrX3JpZ2h0ICh0YiwgaCwgcmZyZWUpOyAgIAorCS8qIGRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gdGhlIGxlZnQvcmlnaHQgIG5laWdoYm9yCisJICAgYW5kIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBmbG93IHRvIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yCisJICAgZnJvbSB0aGUgbGVmdC9yaWdodCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5CisJICovCisJY2hlY2tfbGVmdCh0YiwgaCwgbGZyZWUpOworCWNoZWNrX3JpZ2h0KHRiLCBoLCByZnJlZSk7CiAKLSAgLyogY2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgUyB3aXRoIGxlZnQgbmVpZ2hib3IuICovCi0gIGlmICh0Yi0+bG51bVswXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiB0Yi0+bGJ5dGVzID09IC0xKQotICAgIGlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlICh0YixoKSB8fAotCSgodGItPnJudW1bMF0gLSAoKHRiLT5yYnl0ZXMgPT0gLTEpID8gMCA6IDEpKSA8IHZuLT52bl9ucl9pdGVtKSB8fCAvKiBTIGNhbiBub3QgYmUgbWVyZ2VkIHdpdGggUiAqLwotCSF0Yi0+RlJbaF0pIHsKLSAgICAgIAotICAgICAgUkZBTFNFKCAhdGItPkZMW2hdLCAidnMtODI0NTogZGNfY2hlY2tfYmFsYW5jZV9sZWFmOiBGTFtoXSBtdXN0IGV4aXN0Iik7CisJLyogY2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgUyB3aXRoIGxlZnQgbmVpZ2hib3IuICovCisJaWYgKHRiLT5sbnVtWzBdID49IHZuLT52bl9ucl9pdGVtICYmIHRiLT5sYnl0ZXMgPT0gLTEpCisJCWlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlKHRiLCBoKSB8fCAoKHRiLT5ybnVtWzBdIC0gKCh0Yi0+cmJ5dGVzID09IC0xKSA/IDAgOiAxKSkgPCB2bi0+dm5fbnJfaXRlbSkgfHwJLyogUyBjYW4gbm90IGJlIG1lcmdlZCB3aXRoIFIgKi8KKwkJICAgICF0Yi0+RlJbaF0pIHsKIAotICAgICAgLyogc2V0IHBhcmFtZXRlciB0byBtZXJnZSBTWzBdIHdpdGggaXRzIGxlZnQgbmVpZ2hib3IgKi8KLSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLTEsIDAsIDAsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047Ci0gICAgfQorCQkJUkZBTFNFKCF0Yi0+RkxbaF0sCisJCQkgICAgICAgInZzLTgyNDU6IGRjX2NoZWNrX2JhbGFuY2VfbGVhZjogRkxbaF0gbXVzdCBleGlzdCIpOwogCi0gIC8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbMF0gd2l0aCByaWdodCBuZWlnaGJvci4gKi8KLSAgaWYgKHRiLT5ybnVtWzBdID49IHZuLT52bl9ucl9pdGVtICYmIHRiLT5yYnl0ZXMgPT0gLTEpIHsKLSAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC0xLCAwLCBOVUxMLCAtMSwgLTEpOwotICAgIHJldHVybiBDQVJSWV9PTjsKLSAgfQotICAKLSAgLyogQWxsIGNvbnRlbnRzIG9mIFNbMF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbMF0gJiBSWzBdKS4gU2V0IHBhcmFtZXRlcnMgYW5kIHJldHVybiAqLwotICBpZiAoaXNfbGVhZl9yZW1vdmFibGUgKHRiKSkKLSAgICByZXR1cm4gQ0FSUllfT047Ci0gIAotICAvKiBCYWxhbmNpbmcgaXMgbm90IHJlcXVpcmVkLiAqLwotICB0Yi0+czBudW0gPSB2bi0+dm5fbnJfaXRlbTsKLSAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKwkJCS8qIHNldCBwYXJhbWV0ZXIgdG8gbWVyZ2UgU1swXSB3aXRoIGl0cyBsZWZ0IG5laWdoYm9yICovCisJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgLTEsIDAsIDAsIE5VTEwsIC0xLCAtMSk7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCS8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbMF0gd2l0aCByaWdodCBuZWlnaGJvci4gKi8KKwlpZiAodGItPnJudW1bMF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgdGItPnJieXRlcyA9PSAtMSkgeworCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgLTEsIDAsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBBbGwgY29udGVudHMgb2YgU1swXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFswXSAmIFJbMF0pLiBTZXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuICovCisJaWYgKGlzX2xlYWZfcmVtb3ZhYmxlKHRiKSkKKwkJcmV0dXJuIENBUlJZX09OOworCisJLyogQmFsYW5jaW5nIGlzIG5vdCByZXF1aXJlZC4gKi8KKwl0Yi0+czBudW0gPSB2bi0+dm5fbnJfaXRlbTsKKwlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKIH0KIAotCi0KIC8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBEZWNyZWFzaW5nIGl0cyBzaXplIGJ5CiAgKiBEZWxldGluZyBvciBDdXR0aW5nLgogICogQ2FsY3VsYXRlIHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZyBmb3IgY3VycmVudCBsZXZlbCBoLgpAQCAtMTc3NSwxOCArMTgyNywxNyBAQAogICoJICAgICAgIC0xIC0gbm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZDsKICAqCSAgICAgICAtMiAtIG5vIGRpc2sgc3BhY2UuCiAgKi8KLXN0YXRpYyBpbnQgZGNfY2hlY2tfYmFsYW5jZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3N0YXRpYyBpbnQgZGNfY2hlY2tfYmFsYW5jZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gUkZBTFNFKCAhIChQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpKSwgInZzLTgyNTA6IFMgaXMgbm90IGluaXRpYWxpemVkIik7CisJUkZBTFNFKCEoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKSwKKwkgICAgICAgInZzLTgyNTA6IFMgaXMgbm90IGluaXRpYWxpemVkIik7CiAKLSBpZiAoIGggKQotICAgcmV0dXJuIGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwgKHRiLCBoKTsKLSBlbHNlCi0gICByZXR1cm4gZGNfY2hlY2tfYmFsYW5jZV9sZWFmICh0YiwgaCk7CisJaWYgKGgpCisJCXJldHVybiBkY19jaGVja19iYWxhbmNlX2ludGVybmFsKHRiLCBoKTsKKwllbHNlCisJCXJldHVybiBkY19jaGVja19iYWxhbmNlX2xlYWYodGIsIGgpOwogfQogCi0KLQogLyogQ2hlY2sgd2hldGhlciBjdXJyZW50IG5vZGUgU1toXSBpcyBiYWxhbmNlZC4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KICAqIFBhcmFtZXRlcnM6CkBAIC0xODA1LDQzOSArMTg1Niw0ODEgQEAKICAqCSAgICAgICAtMSAtIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CiAgKgkgICAgICAgLTIgLSBubyBkaXNrIHNwYWNlLgogICovCi1zdGF0aWMgaW50IGNoZWNrX2JhbGFuY2UgKGludCBtb2RlLCAKLQkJCSAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJICBpbnQgaCwgCi0JCQkgIGludCBpbnVtLAotCQkJICBpbnQgcG9zX2luX2l0ZW0sCi0JCQkgIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNfaWgsCi0JCQkgIGNvbnN0IHZvaWQgKiBkYXRhCi0JCQkgICkKK3N0YXRpYyBpbnQgY2hlY2tfYmFsYW5jZShpbnQgbW9kZSwKKwkJCSBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCSBpbnQgaCwKKwkJCSBpbnQgaW51bSwKKwkJCSBpbnQgcG9zX2luX2l0ZW0sCisJCQkgc3RydWN0IGl0ZW1faGVhZCAqaW5zX2loLCBjb25zdCB2b2lkICpkYXRhKQogewotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm47CisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdm47CiAKLSAgdm4gPSB0Yi0+dGJfdm4gPSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqKSh0Yi0+dm5fYnVmKTsKLSAgdm4tPnZuX2ZyZWVfcHRyID0gKGNoYXIgKikodGItPnRiX3ZuICsgMSk7Ci0gIHZuLT52bl9tb2RlID0gbW9kZTsKLSAgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtID0gaW51bTsKLSAgdm4tPnZuX3Bvc19pbl9pdGVtID0gcG9zX2luX2l0ZW07Ci0gIHZuLT52bl9pbnNfaWggPSBpbnNfaWg7Ci0gIHZuLT52bl9kYXRhID0gZGF0YTsKKwl2biA9IHRiLT50Yl92biA9IChzdHJ1Y3QgdmlydHVhbF9ub2RlICopKHRiLT52bl9idWYpOworCXZuLT52bl9mcmVlX3B0ciA9IChjaGFyICopKHRiLT50Yl92biArIDEpOworCXZuLT52bl9tb2RlID0gbW9kZTsKKwl2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gPSBpbnVtOworCXZuLT52bl9wb3NfaW5faXRlbSA9IHBvc19pbl9pdGVtOworCXZuLT52bl9pbnNfaWggPSBpbnNfaWg7CisJdm4tPnZuX2RhdGEgPSBkYXRhOwogCi0gIFJGQUxTRSggbW9kZSA9PSBNX0lOU0VSVCAmJiAhdm4tPnZuX2luc19paCwKLQkgICJ2cy04MjU1OiBpbnNfaWggY2FuIG5vdCBiZSAwIGluIGluc2VydCBtb2RlIik7CisJUkZBTFNFKG1vZGUgPT0gTV9JTlNFUlQgJiYgIXZuLT52bl9pbnNfaWgsCisJICAgICAgICJ2cy04MjU1OiBpbnNfaWggY2FuIG5vdCBiZSAwIGluIGluc2VydCBtb2RlIik7CiAKLSBpZiAoIHRiLT5pbnNlcnRfc2l6ZVtoXSA+IDAgKQotICAgLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyB3aGVuIHNpemUgb2Ygbm9kZSBpcyBpbmNyZWFzaW5nLiAqLwotICAgcmV0dXJuIGlwX2NoZWNrX2JhbGFuY2UgKHRiLCBoKTsKKwlpZiAodGItPmluc2VydF9zaXplW2hdID4gMCkKKwkJLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyB3aGVuIHNpemUgb2Ygbm9kZSBpcyBpbmNyZWFzaW5nLiAqLworCQlyZXR1cm4gaXBfY2hlY2tfYmFsYW5jZSh0YiwgaCk7CiAKLSAvKiBDYWxjdWxhdGUgYmFsYW5jZSBwYXJhbWV0ZXJzIHdoZW4gIHNpemUgb2Ygbm9kZSBpcyBkZWNyZWFzaW5nLiAqLwotIHJldHVybiBkY19jaGVja19iYWxhbmNlICh0YiwgaCk7CisJLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyB3aGVuICBzaXplIG9mIG5vZGUgaXMgZGVjcmVhc2luZy4gKi8KKwlyZXR1cm4gZGNfY2hlY2tfYmFsYW5jZSh0YiwgaCk7CiB9CiAKLQotCiAvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCBpcyB0aGUgcmVhbGx5IHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLiovCi1zdGF0aWMgaW50ICBnZXRfZGlyZWN0X3BhcmVudCgKLSAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5faAotICAgICAgICAgICAgKSB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaDsKLSAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGggICAgICA9IHBfc190Yi0+dGJfcGF0aDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9wb3NpdGlvbiwKLQluX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKLSAgICAKLSAgICAvKiBXZSBhcmUgaW4gdGhlIHJvb3Qgb3IgaW4gdGhlIG5ldyByb290LiAqLwotICAgIGlmICggbl9wYXRoX29mZnNldCA8PSBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgewotCQotCVJGQUxTRSggbl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgLSAxLAotCQkiUEFQLTgyNjA6IGludmFsaWQgb2Zmc2V0IGluIHRoZSBwYXRoIik7CitzdGF0aWMgaW50IGdldF9kaXJlY3RfcGFyZW50KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaDsKKwlzdHJ1Y3QgcGF0aCAqcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7CisJaW50IG5fcG9zaXRpb24sCisJICAgIG5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2gpOwogCi0JaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+Yl9ibG9ja25yID09Ci0JICAgICBTQl9ST09UX0JMT0NLIChwX3NfdGItPnRiX3NiKSApIHsKLQkgICAgLyogUm9vdCBpcyBub3QgY2hhbmdlZC4gKi8KLQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpID0gTlVMTDsKLQkgICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSA9IDA7Ci0JICAgIHJldHVybiBDQVJSWV9PTjsKKwkvKiBXZSBhcmUgaW4gdGhlIHJvb3Qgb3IgaW4gdGhlIG5ldyByb290LiAqLworCWlmIChuX3BhdGhfb2Zmc2V0IDw9IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKKworCQlSRkFMU0Uobl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgLSAxLAorCQkgICAgICAgIlBBUC04MjYwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOworCisJCWlmIChQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+CisJCSAgICBiX2Jsb2NrbnIgPT0gU0JfUk9PVF9CTE9DSyhwX3NfdGItPnRiX3NiKSkgeworCQkJLyogUm9vdCBpcyBub3QgY2hhbmdlZC4gKi8KKwkJCVBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSA9IE5VTEw7CisJCQlQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpID0gMDsKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsJLyogUm9vdCBpcyBjaGFuZ2VkIGFuZCB3ZSBtdXN0IHJlY2FsY3VsYXRlIHRoZSBwYXRoLiAqLwogCX0KLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsgLyogUm9vdCBpcyBjaGFuZ2VkIGFuZCB3ZSBtdXN0IHJlY2FsY3VsYXRlIHRoZSBwYXRoLiAqLwotICAgIH0KIAotICAgIGlmICggISBCX0lTX0lOX1RSRUUocF9zX2JoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKSApCi0JcmV0dXJuIFJFUEVBVF9TRUFSQ0g7IC8qIFBhcmVudCBpbiB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUuICovCisJaWYgKCFCX0lTX0lOX1RSRUUKKwkgICAgKHBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkpCisJCXJldHVybiBSRVBFQVRfU0VBUkNIOwkvKiBQYXJlbnQgaW4gdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlLiAqLwogCi0gICAgaWYgKCAobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpID4gQl9OUl9JVEVNUyhwX3NfYmgpICkKLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKLSAgICAKLSAgICBpZiAoIEJfTl9DSElMRF9OVU0ocF9zX2JoLCBuX3Bvc2l0aW9uKSAhPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0KS0+Yl9ibG9ja25yICkKLQkvKiBQYXJlbnQgaW4gdGhlIHBhdGggaXMgbm90IHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlIGluIHRoZSB0cmVlLiAqLwotCXJldHVybiBSRVBFQVRfU0VBUkNIOworCWlmICgobl9wb3NpdGlvbiA9CisJICAgICBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwKKwkJCQkgIG5fcGF0aF9vZmZzZXQgLSAxKSkgPiBCX05SX0lURU1TKHBfc19iaCkpCisJCXJldHVybiBSRVBFQVRfU0VBUkNIOwogCi0gICAgaWYgKCBidWZmZXJfbG9ja2VkKHBfc19iaCkgKSB7Ci0JX193YWl0X29uX2J1ZmZlcihwX3NfYmgpOwotCWlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKLQkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0gICAgfQorCWlmIChCX05fQ0hJTERfTlVNKHBfc19iaCwgbl9wb3NpdGlvbikgIT0KKwkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCktPmJfYmxvY2tucikKKwkJLyogUGFyZW50IGluIHRoZSBwYXRoIGlzIG5vdCBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJlZS4gKi8KKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAKLSAgICByZXR1cm4gQ0FSUllfT047IC8qIFBhcmVudCBpbiB0aGUgcGF0aCBpcyB1bmxvY2tlZCBhbmQgcmVhbGx5IHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLiAgKi8KKwlpZiAoYnVmZmVyX2xvY2tlZChwX3NfYmgpKSB7CisJCV9fd2FpdF9vbl9idWZmZXIocF9zX2JoKTsKKwkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKQorCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJfQorCisJcmV0dXJuIENBUlJZX09OOwkvKiBQYXJlbnQgaW4gdGhlIHBhdGggaXMgdW5sb2NrZWQgYW5kIHJlYWxseSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS4gICovCiB9CiAKLQogLyogVXNpbmcgbG51bVtuX2hdIGFuZCBybnVtW25faF0gd2Ugc2hvdWxkIGRldGVybWluZSB3aGF0IG5laWdoYm9ycwogICogb2YgU1tuX2hdIHdlCiAgKiBuZWVkIGluIG9yZGVyIHRvIGJhbGFuY2UgU1tuX2hdLCBhbmQgZ2V0IHRoZW0gaWYgbmVjZXNzYXJ5LgogICogUmV0dXJuczoJU0NIRURVTEVfT0NDVVJSRUQgLSBzY2hlZHVsZSBvY2N1cnJlZCB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOwogICoJICAgICAgICBDQVJSWV9PTiAtIHNjaGVkdWxlIGRpZG4ndCBvY2N1ciB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOwogICovCi1zdGF0aWMgaW50ICBnZXRfbmVpZ2hib3JzKAotCSAgICAgICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsCi0JICAgICAgICAgICAgaW50IAkJICBuX2gKLQkgICAgICAgICAgKSB7Ci0gICAgaW50CQkgCW5fY2hpbGRfcG9zaXRpb24sCi0Jbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCArIDEpOwotICAgIHVuc2lnbmVkIGxvbmcJCW5fc29uX251bWJlcjsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICoJcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2JoOworc3RhdGljIGludCBnZXRfbmVpZ2hib3JzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKK3sKKwlpbnQgbl9jaGlsZF9wb3NpdGlvbiwKKwkgICAgbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCArIDEpOworCXVuc2lnbmVkIGxvbmcgbl9zb25fbnVtYmVyOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaDsKIAorCVBST0NfSU5GT19JTkMocF9zX3NiLCBnZXRfbmVpZ2hib3JzW25faF0pOwogCi0gICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBnZXRfbmVpZ2hib3JzWyBuX2ggXSApOworCWlmIChwX3NfdGItPmxudW1bbl9oXSkgeworCQkvKiBXZSBuZWVkIGxlZnQgbmVpZ2hib3IgdG8gYmFsYW5jZSBTW25faF0uICovCisJCVBST0NfSU5GT19JTkMocF9zX3NiLCBuZWVkX2xfbmVpZ2hib3Jbbl9oXSk7CisJCXBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KTsKIAotICAgIGlmICggcF9zX3RiLT5sbnVtW25faF0gKSB7Ci0JLyogV2UgbmVlZCBsZWZ0IG5laWdoYm9yIHRvIGJhbGFuY2UgU1tuX2hdLiAqLwotCVBST0NfSU5GT19JTkMoIHBfc19zYiwgbmVlZF9sX25laWdoYm9yWyBuX2ggXSApOwotCXBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KTsKLQkKLQlSRkFMU0UoIHBfc19iaCA9PSBwX3NfdGItPkZMW25faF0gJiYgCi0JCSEgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KSwKLQkJIlBBUC04MjcwOiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQiKTsKKwkJUkZBTFNFKHBfc19iaCA9PSBwX3NfdGItPkZMW25faF0gJiYKKwkJICAgICAgICFQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgsIG5fcGF0aF9vZmZzZXQpLAorCQkgICAgICAgIlBBUC04MjcwOiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQiKTsKIAotCW5fY2hpbGRfcG9zaXRpb24gPSAoIHBfc19iaCA9PSBwX3NfdGItPkZMW25faF0gKSA/IHBfc190Yi0+bGtleVtuX2hdIDogQl9OUl9JVEVNUyAocF9zX3RiLT5GTFtuX2hdKTsKLQluX3Nvbl9udW1iZXIgPSBCX05fQ0hJTERfTlVNKHBfc190Yi0+Rkxbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbik7Ci0JcF9zX2JoID0gc2JfYnJlYWQocF9zX3NiLCBuX3Nvbl9udW1iZXIpOwotCWlmICghcF9zX2JoKQotCSAgICByZXR1cm4gSU9fRVJST1I7Ci0JaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSB7Ci0JICAgIGRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKLQkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbIG5faCBdICk7Ci0JICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCQluX2NoaWxkX3Bvc2l0aW9uID0KKwkJICAgIChwX3NfYmggPT0KKwkJICAgICBwX3NfdGItPkZMW25faF0pID8gcF9zX3RiLT5sa2V5W25faF0gOiBCX05SX0lURU1TKHBfc190Yi0+CisJCQkJCQkJCSAgICAgICBGTFtuX2hdKTsKKwkJbl9zb25fbnVtYmVyID0gQl9OX0NISUxEX05VTShwX3NfdGItPkZMW25faF0sIG5fY2hpbGRfcG9zaXRpb24pOworCQlwX3NfYmggPSBzYl9icmVhZChwX3Nfc2IsIG5fc29uX251bWJlcik7CisJCWlmICghcF9zX2JoKQorCQkJcmV0dXJuIElPX0VSUk9SOworCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpIHsKKwkJCWRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbbl9oXSk7CisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJfQorCisJCVJGQUxTRSghQl9JU19JTl9UUkVFKHBfc190Yi0+Rkxbbl9oXSkgfHwKKwkJICAgICAgIG5fY2hpbGRfcG9zaXRpb24gPiBCX05SX0lURU1TKHBfc190Yi0+Rkxbbl9oXSkgfHwKKwkJICAgICAgIEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKSAhPQorCQkgICAgICAgcF9zX2JoLT5iX2Jsb2NrbnIsICJQQVAtODI3NTogaW52YWxpZCBwYXJlbnQiKTsKKwkJUkZBTFNFKCFCX0lTX0lOX1RSRUUocF9zX2JoKSwgIlBBUC04MjgwOiBpbnZhbGlkIGNoaWxkIik7CisJCVJGQUxTRSghbl9oICYmCisJCSAgICAgICBCX0ZSRUVfU1BBQ0UocF9zX2JoKSAhPQorCQkgICAgICAgTUFYX0NISUxEX1NJWkUocF9zX2JoKSAtCisJCSAgICAgICBkY19zaXplKEJfTl9DSElMRChwX3NfdGItPkZMWzBdLCBuX2NoaWxkX3Bvc2l0aW9uKSksCisJCSAgICAgICAiUEFQLTgyOTA6IGludmFsaWQgY2hpbGQgc2l6ZSBvZiBsZWZ0IG5laWdoYm9yIik7CisKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkxbbl9oXSk7CisJCXBfc190Yi0+TFtuX2hdID0gcF9zX2JoOwogCX0KLQkKLQlSRkFMU0UoICEgQl9JU19JTl9UUkVFKHBfc190Yi0+Rkxbbl9oXSkgfHwKLSAgICAgICAgICAgICAgICBuX2NoaWxkX3Bvc2l0aW9uID4gQl9OUl9JVEVNUyhwX3NfdGItPkZMW25faF0pIHx8Ci0JICAgICAgICBCX05fQ0hJTERfTlVNKHBfc190Yi0+Rkxbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbikgIT0KLSAgICAgICAgICAgICAgICBwX3NfYmgtPmJfYmxvY2tuciwgIlBBUC04Mjc1OiBpbnZhbGlkIHBhcmVudCIpOwotCVJGQUxTRSggISBCX0lTX0lOX1RSRUUocF9zX2JoKSwgIlBBUC04MjgwOiBpbnZhbGlkIGNoaWxkIik7Ci0JUkZBTFNFKCAhIG5faCAmJgotICAgICAgICAgICAgICAgIEJfRlJFRV9TUEFDRSAocF9zX2JoKSAhPSBNQVhfQ0hJTERfU0laRSAocF9zX2JoKSAtIGRjX3NpemUoQl9OX0NISUxEIChwX3NfdGItPkZMWzBdLG5fY2hpbGRfcG9zaXRpb24pKSwKLSAgICAgICAgICAgICAgICAiUEFQLTgyOTA6IGludmFsaWQgY2hpbGQgc2l6ZSBvZiBsZWZ0IG5laWdoYm9yIik7CiAKLQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+TFtuX2hdKTsKLQlwX3NfdGItPkxbbl9oXSA9IHBfc19iaDsKLSAgICB9CisJaWYgKHBfc190Yi0+cm51bVtuX2hdKSB7CS8qIFdlIG5lZWQgcmlnaHQgbmVpZ2hib3IgdG8gYmFsYW5jZSBTW25fcGF0aF9vZmZzZXRdLiAqLworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgbmVlZF9yX25laWdoYm9yW25faF0pOworCQlwX3NfYmggPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9wYXRoX29mZnNldCk7CiAKKwkJUkZBTFNFKHBfc19iaCA9PSBwX3NfdGItPkZSW25faF0gJiYKKwkJICAgICAgIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc190Yi0+dGJfcGF0aCwKKwkJCQkJICAgIG5fcGF0aF9vZmZzZXQpID49CisJCSAgICAgICBCX05SX0lURU1TKHBfc19iaCksCisJCSAgICAgICAiUEFQLTgyOTU6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIHBhcmVudCIpOwogCi0gICAgaWYgKCBwX3NfdGItPnJudW1bbl9oXSApIHsgLyogV2UgbmVlZCByaWdodCBuZWlnaGJvciB0byBiYWxhbmNlIFNbbl9wYXRoX29mZnNldF0uICovCi0JUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBuZWVkX3JfbmVpZ2hib3JbIG5faCBdICk7Ci0JcF9zX2JoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5fcGF0aF9vZmZzZXQpOwotCQotCVJGQUxTRSggcF9zX2JoID09IHBfc190Yi0+RlJbbl9oXSAmJiAKLQkJUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KSA+PSBCX05SX0lURU1TKHBfc19iaCksCi0JCSJQQVAtODI5NTogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgcGFyZW50Iik7CisJCW5fY2hpbGRfcG9zaXRpb24gPQorCQkgICAgKHBfc19iaCA9PSBwX3NfdGItPkZSW25faF0pID8gcF9zX3RiLT5ya2V5W25faF0gKyAxIDogMDsKKwkJbl9zb25fbnVtYmVyID0gQl9OX0NISUxEX05VTShwX3NfdGItPkZSW25faF0sIG5fY2hpbGRfcG9zaXRpb24pOworCQlwX3NfYmggPSBzYl9icmVhZChwX3Nfc2IsIG5fc29uX251bWJlcik7CisJCWlmICghcF9zX2JoKQorCQkJcmV0dXJuIElPX0VSUk9SOworCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpIHsKKwkJCWRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbbl9oXSk7CisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJfQorCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+UltuX2hdKTsKKwkJcF9zX3RiLT5SW25faF0gPSBwX3NfYmg7CiAKLQluX2NoaWxkX3Bvc2l0aW9uID0gKCBwX3NfYmggPT0gcF9zX3RiLT5GUltuX2hdICkgPyBwX3NfdGItPnJrZXlbbl9oXSArIDEgOiAwOwotCW5fc29uX251bWJlciA9IEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GUltuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKTsKLQlwX3NfYmggPSBzYl9icmVhZChwX3Nfc2IsIG5fc29uX251bWJlcik7Ci0JaWYgKCFwX3NfYmgpCi0JICAgIHJldHVybiBJT19FUlJPUjsKLQlpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKLQkgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfYmgpOwotCSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGdldF9uZWlnaGJvcnNfcmVzdGFydFsgbl9oIF0gKTsKLQkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCVJGQUxTRSghbl9oCisJCSAgICAgICAmJiBCX0ZSRUVfU1BBQ0UocF9zX2JoKSAhPQorCQkgICAgICAgTUFYX0NISUxEX1NJWkUocF9zX2JoKSAtCisJCSAgICAgICBkY19zaXplKEJfTl9DSElMRChwX3NfdGItPkZSWzBdLCBuX2NoaWxkX3Bvc2l0aW9uKSksCisJCSAgICAgICAiUEFQLTgzMDA6IGludmFsaWQgY2hpbGQgc2l6ZSBvZiByaWdodCBuZWlnaGJvciAoJWQgIT0gJWQgLSAlZCkiLAorCQkgICAgICAgQl9GUkVFX1NQQUNFKHBfc19iaCksIE1BWF9DSElMRF9TSVpFKHBfc19iaCksCisJCSAgICAgICBkY19zaXplKEJfTl9DSElMRChwX3NfdGItPkZSWzBdLCBuX2NoaWxkX3Bvc2l0aW9uKSkpOworCiAJfQotCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5SW25faF0pOwotCXBfc190Yi0+UltuX2hdID0gcF9zX2JoOwotCi0JUkZBTFNFKCAhIG5faCAmJiBCX0ZSRUVfU1BBQ0UgKHBfc19iaCkgIT0gTUFYX0NISUxEX1NJWkUgKHBfc19iaCkgLSBkY19zaXplKEJfTl9DSElMRCAocF9zX3RiLT5GUlswXSxuX2NoaWxkX3Bvc2l0aW9uKSksCi0gICAgICAgICAgICAgICAgIlBBUC04MzAwOiBpbnZhbGlkIGNoaWxkIHNpemUgb2YgcmlnaHQgbmVpZ2hib3IgKCVkICE9ICVkIC0gJWQpIiwKLSAgICAgICAgICAgICAgICBCX0ZSRUVfU1BBQ0UgKHBfc19iaCksIE1BWF9DSElMRF9TSVpFIChwX3NfYmgpLAotICAgICAgICAgICAgICAgIGRjX3NpemUoQl9OX0NISUxEIChwX3NfdGItPkZSWzBdLG5fY2hpbGRfcG9zaXRpb24pKSk7Ci0JCi0gICAgfQotICAgIHJldHVybiBDQVJSWV9PTjsKKwlyZXR1cm4gQ0FSUllfT047CiB9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLXZvaWQgKiByZWlzZXJmc19rbWFsbG9jIChzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQordm9pZCAqcmVpc2VyZnNfa21hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgdm9pZCAqIHZwOwotICAgIHN0YXRpYyBzaXplX3QgbWFsbG9jZWQ7CisJdm9pZCAqdnA7CisJc3RhdGljIHNpemVfdCBtYWxsb2NlZDsKIAotCi0gICAgdnAgPSBrbWFsbG9jIChzaXplLCBmbGFncyk7Ci0gICAgaWYgKHZwKSB7Ci0JUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgKz0gc2l6ZTsKLQlpZiAoUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgPiBtYWxsb2NlZCArIDIwMDAwMCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzLAotCQkJICAgICAgInZzLTgzMDE6IHJlaXNlcmZzX2ttYWxsb2M6IGFsbG9jYXRlZCBtZW1vcnkgJWQiLAotCQkJICAgICAgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MpOwotCSAgICBtYWxsb2NlZCA9IFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzOworCXZwID0ga21hbGxvYyhzaXplLCBmbGFncyk7CisJaWYgKHZwKSB7CisJCVJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzICs9IHNpemU7CisJCWlmIChSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyA+IG1hbGxvY2VkICsgMjAwMDAwKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAidnMtODMwMTogcmVpc2VyZnNfa21hbGxvYzogYWxsb2NhdGVkIG1lbW9yeSAlZCIsCisJCQkJCSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7CisJCQltYWxsb2NlZCA9IFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzOworCQl9CiAJfQotICAgIH0KLSAgICByZXR1cm4gdnA7CisJcmV0dXJuIHZwOwogfQogCi12b2lkIHJlaXNlcmZzX2tmcmVlIChjb25zdCB2b2lkICogdnAsIHNpemVfdCBzaXplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQordm9pZCByZWlzZXJmc19rZnJlZShjb25zdCB2b2lkICp2cCwgc2l6ZV90IHNpemUsIHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBrZnJlZSAodnApOwotICAKLSAgICBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyAtPSBzaXplOwotICAgIGlmIChSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyA8IDApCi0JcmVpc2VyZnNfd2FybmluZyAocywgInZzLTgzMDI6IHJlaXNlcmZzX2tmcmVlOiBhbGxvY2F0ZWQgbWVtb3J5ICVkIiwKLQkJCSAgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MpOworCWtmcmVlKHZwKTsKKworCVJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzIC09IHNpemU7CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzIDwgMCkKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAidnMtODMwMjogcmVpc2VyZnNfa2ZyZWU6IGFsbG9jYXRlZCBtZW1vcnkgJWQiLAorCQkJCSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7CiAKIH0KICNlbmRpZgogCi0KLXN0YXRpYyBpbnQgZ2V0X3ZpcnR1YWxfbm9kZV9zaXplIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgaW50IGdldF92aXJ0dWFsX25vZGVfc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIGludCBtYXhfbnVtX29mX2l0ZW1zOwotICAgIGludCBtYXhfbnVtX29mX2VudHJpZXM7Ci0gICAgdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJaW50IG1heF9udW1fb2ZfaXRlbXM7CisJaW50IG1heF9udW1fb2ZfZW50cmllczsKKwl1bnNpZ25lZCBsb25nIGJsb2Nrc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAogI2RlZmluZSBNSU5fTkFNRV9MRU4gMQogCi0gICAgbWF4X251bV9vZl9pdGVtcyA9IChibG9ja3NpemUgLSBCTEtIX1NJWkUpIC8gKElIX1NJWkUgKyBNSU5fSVRFTV9MRU4pOwotICAgIG1heF9udW1fb2ZfZW50cmllcyA9IChibG9ja3NpemUgLSBCTEtIX1NJWkUgLSBJSF9TSVpFKSAvIAotICAgICAgICAgICAgICAgICAgICAgICAgIChERUhfU0laRSArIE1JTl9OQU1FX0xFTik7CisJbWF4X251bV9vZl9pdGVtcyA9IChibG9ja3NpemUgLSBCTEtIX1NJWkUpIC8gKElIX1NJWkUgKyBNSU5fSVRFTV9MRU4pOworCW1heF9udW1fb2ZfZW50cmllcyA9IChibG9ja3NpemUgLSBCTEtIX1NJWkUgLSBJSF9TSVpFKSAvCisJICAgIChERUhfU0laRSArIE1JTl9OQU1FX0xFTik7CiAKLSAgICByZXR1cm4gc2l6ZW9mKHN0cnVjdCB2aXJ0dWFsX25vZGUpICsgCi0gICAgICAgICAgIG1heChtYXhfbnVtX29mX2l0ZW1zICogc2l6ZW9mIChzdHJ1Y3QgdmlydHVhbF9pdGVtKSwKLQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgdmlydHVhbF9pdGVtKSArIHNpemVvZihzdHJ1Y3QgZGlyZW50cnlfdWFyZWEpICsgCi0gICAgICAgICAgICAgICAobWF4X251bV9vZl9lbnRyaWVzIC0gMSkgKiBzaXplb2YgKF9fdTE2KSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdmlydHVhbF9ub2RlKSArCisJICAgIG1heChtYXhfbnVtX29mX2l0ZW1zICogc2l6ZW9mKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pLAorCQlzaXplb2Yoc3RydWN0IHZpcnR1YWxfaXRlbSkgKyBzaXplb2Yoc3RydWN0IGRpcmVudHJ5X3VhcmVhKSArCisJCShtYXhfbnVtX29mX2VudHJpZXMgLSAxKSAqIHNpemVvZihfX3UxNikpOwogfQogCi0KLQogLyogbWF5YmUgd2Ugc2hvdWxkIGZhaWwgYmFsYW5jaW5nIHdlIGFyZSBnb2luZyB0byBwZXJmb3JtIHdoZW4ga21hbGxvYwogICAgZmFpbHMgc2V2ZXJhbCB0aW1lcy4gQnV0IG5vdyBpdCB3aWxsIGxvb3AgdW50aWwga21hbGxvYyBnZXRzCiAgICByZXF1aXJlZCBtZW1vcnkgKi8KLXN0YXRpYyBpbnQgZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCitzdGF0aWMgaW50IGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKIHsKLSAgICBpbnQgY2hlY2tfZnMgPSAwOwotICAgIGludCBzaXplOwotICAgIGNoYXIgKiBidWY7CisJaW50IGNoZWNrX2ZzID0gMDsKKwlpbnQgc2l6ZTsKKwljaGFyICpidWY7CiAKLSAgICBzaXplID0gZ2V0X3ZpcnR1YWxfbm9kZV9zaXplICh0Yi0+dGJfc2IsIFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCkpOworCXNpemUgPSBnZXRfdmlydHVhbF9ub2RlX3NpemUodGItPnRiX3NiLCBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCkpOwogCi0gICAgaWYgKHNpemUgPiB0Yi0+dm5fYnVmX3NpemUpIHsKLQkvKiB3ZSBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5IGZvciB2aXJ0dWFsIG5vZGUgKi8KLQlpZiAodGItPnZuX2J1ZikgewotCSAgICAvKiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYmVmb3JlICovCi0JICAgIHJlaXNlcmZzX2tmcmVlICh0Yi0+dm5fYnVmLCB0Yi0+dm5fYnVmX3NpemUsIHRiLT50Yl9zYik7Ci0JICAgIC8qIHRoaXMgaXMgbm90IG5lZWRlZCBpZiBrZnJlZSBpcyBhdG9taWMgKi8KLSAgICAgICAgICAgIGNoZWNrX2ZzID0gMTsKLQl9CisJaWYgKHNpemUgPiB0Yi0+dm5fYnVmX3NpemUpIHsKKwkJLyogd2UgaGF2ZSB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBmb3IgdmlydHVhbCBub2RlICovCisJCWlmICh0Yi0+dm5fYnVmKSB7CisJCQkvKiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYmVmb3JlICovCisJCQlyZWlzZXJmc19rZnJlZSh0Yi0+dm5fYnVmLCB0Yi0+dm5fYnVmX3NpemUsIHRiLT50Yl9zYik7CisJCQkvKiB0aGlzIGlzIG5vdCBuZWVkZWQgaWYga2ZyZWUgaXMgYXRvbWljICovCisJCQljaGVja19mcyA9IDE7CisJCX0KIAotCS8qIHZpcnR1YWwgbm9kZSByZXF1aXJlcyBub3cgbW9yZSBtZW1vcnkgKi8KLQl0Yi0+dm5fYnVmX3NpemUgPSBzaXplOworCQkvKiB2aXJ0dWFsIG5vZGUgcmVxdWlyZXMgbm93IG1vcmUgbWVtb3J5ICovCisJCXRiLT52bl9idWZfc2l6ZSA9IHNpemU7CiAKLQkvKiBnZXQgbWVtb3J5IGZvciB2aXJ0dWFsIGl0ZW0gKi8KLQlidWYgPSByZWlzZXJmc19rbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1dBUk4sIHRiLT50Yl9zYik7Ci0JaWYgKCAhIGJ1ZiApIHsKLQkgICAgLyogZ2V0dGluZyBtZW1vcnkgd2l0aCBHRlBfS0VSTkVMIHByaW9yaXR5IG1heSBpbnZvbHZlCi0gICAgICAgICAgICAgICBiYWxhbmNpbmcgbm93IChkdWUgdG8gaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24gb24KLSAgICAgICAgICAgICAgIGRjYWNoZSBzaHJpbmtpbmcpLiBTbywgcmVsZWFzZSBwYXRoIGFuZCBjb2xsZWN0ZWQKLSAgICAgICAgICAgICAgIHJlc291cmNlcyBoZXJlICovCi0JICAgIGZyZWVfYnVmZmVyc19pbl90YiAodGIpOwotCSAgICBidWYgPSByZWlzZXJmc19rbWFsbG9jKHNpemUsIEdGUF9OT0ZTLCB0Yi0+dGJfc2IpOwotCSAgICBpZiAoICFidWYgKSB7CisJCS8qIGdldCBtZW1vcnkgZm9yIHZpcnR1YWwgaXRlbSAqLworCQlidWYgPQorCQkgICAgcmVpc2VyZnNfa21hbGxvYyhzaXplLCBHRlBfQVRPTUlDIHwgX19HRlBfTk9XQVJOLAorCQkJCSAgICAgdGItPnRiX3NiKTsKKwkJaWYgKCFidWYpIHsKKwkJCS8qIGdldHRpbmcgbWVtb3J5IHdpdGggR0ZQX0tFUk5FTCBwcmlvcml0eSBtYXkgaW52b2x2ZQorCQkJICAgYmFsYW5jaW5nIG5vdyAoZHVlIHRvIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uIG9uCisJCQkgICBkY2FjaGUgc2hyaW5raW5nKS4gU28sIHJlbGVhc2UgcGF0aCBhbmQgY29sbGVjdGVkCisJCQkgICByZXNvdXJjZXMgaGVyZSAqLworCQkJZnJlZV9idWZmZXJzX2luX3RiKHRiKTsKKwkJCWJ1ZiA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZSwgR0ZQX05PRlMsIHRiLT50Yl9zYik7CisJCQlpZiAoIWJ1ZikgewogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCQlyZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsCi0JCQkJICAidnMtODM0NTogZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlOiAiCi0JCQkJICAia21hbGxvYyBmYWlsZWQuIHJlaXNlcmZzIGttYWxsb2NlZCAlZCBieXRlcyIsCi0JCQkJICBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2ttYWxsb2NzKTsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHRiLT50Yl9zYiwKKwkJCQkJCSAidnMtODM0NTogZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlOiAiCisJCQkJCQkgImttYWxsb2MgZmFpbGVkLiByZWlzZXJmcyBrbWFsbG9jZWQgJWQgYnl0ZXMiLAorCQkJCQkJIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPgorCQkJCQkJIHNfa21hbGxvY3MpOwogI2VuZGlmCi0JCXRiLT52bl9idWZfc2l6ZSA9IDA7Ci0JICAgIH0KLQkgICAgdGItPnZuX2J1ZiA9IGJ1ZjsKLQkgICAgc2NoZWR1bGUoKSA7Ci0JICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCQkJCXRiLT52bl9idWZfc2l6ZSA9IDA7CisJCQl9CisJCQl0Yi0+dm5fYnVmID0gYnVmOworCQkJc2NoZWR1bGUoKTsKKwkJCXJldHVybiBSRVBFQVRfU0VBUkNIOworCQl9CisKKwkJdGItPnZuX2J1ZiA9IGJ1ZjsKIAl9CiAKLQl0Yi0+dm5fYnVmID0gYnVmOwotICAgIH0KKwlpZiAoY2hlY2tfZnMgJiYgRklMRVNZU1RFTV9DSEFOR0VEX1RCKHRiKSkKKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAKLSAgICBpZiAoIGNoZWNrX2ZzICYmIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAodGIpICkKLSAgICAgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0KLSAgICByZXR1cm4gQ0FSUllfT047CisJcmV0dXJuIENBUlJZX09OOwogfQogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLXN0YXRpYyB2b2lkIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogcF9zX2JoLCAKLQkJCQkgICAgY29uc3QgY2hhciAqZGVzY3IsIGludCBsZXZlbCkgewotICBpZiAocF9zX2JoKSB7Ci0gICAgaWYgKGF0b21pY19yZWFkICgmKHBfc19iaC0+Yl9jb3VudCkpIDw9IDApIHsKK3N0YXRpYyB2b2lkIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmgsCisJCQkJICAgY29uc3QgY2hhciAqZGVzY3IsIGludCBsZXZlbCkKK3sKKwlpZiAocF9zX2JoKSB7CisJCWlmIChhdG9taWNfcmVhZCgmKHBfc19iaC0+Yl9jb3VudCkpIDw9IDApIHsKIAotICAgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTE6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogbmVnYXRpdmUgb3IgemVybyByZWZlcmVuY2UgY291bnRlciBmb3IgYnVmZmVyICVzWyVkXSAoJWIpXG4iLCBkZXNjciwgbGV2ZWwsIHBfc19iaCk7Ci0gICAgfQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtMTogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBuZWdhdGl2ZSBvciB6ZXJvIHJlZmVyZW5jZSBjb3VudGVyIGZvciBidWZmZXIgJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQogCi0gICAgaWYgKCAhIGJ1ZmZlcl91cHRvZGF0ZSAocF9zX2JoKSApIHsKLSAgICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC0yOiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBpcyBub3QgdXAgdG8gZGF0ZSAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOwotICAgIH0KKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX2JoKSkgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtMjogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaXMgbm90IHVwIHRvIGRhdGUgJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQogCi0gICAgaWYgKCAhIEJfSVNfSU5fVFJFRSAocF9zX2JoKSApIHsKLSAgICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC0zOiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBpcyBub3QgaW4gdHJlZSAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOwotICAgIH0KKwkJaWYgKCFCX0lTX0lOX1RSRUUocF9zX2JoKSkgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtMzogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaXMgbm90IGluIHRyZWUgJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQogCi0gICAgaWYgKHBfc19iaC0+Yl9iZGV2ICE9IHBfc19zYi0+c19iZGV2KSB7Ci0JcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTQ6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGhhcyB3cm9uZyBkZXZpY2UgJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKLSAgICB9CisJCWlmIChwX3NfYmgtPmJfYmRldiAhPSBwX3Nfc2ItPnNfYmRldikgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtNDogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaGFzIHdyb25nIGRldmljZSAlc1slZF0gKCViKVxuIiwKKwkJCQkgICAgICAgZGVzY3IsIGxldmVsLCBwX3NfYmgpOworCQl9CiAKLSAgICBpZiAocF9zX2JoLT5iX3NpemUgIT0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgewotCXJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC01OiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBoYXMgd3JvbmcgYmxvY2tzaXplICVzWyVkXSAoJWIpXG4iLCBkZXNjciwgbGV2ZWwsIHBfc19iaCk7Ci0gICAgfQorCQlpZiAocF9zX2JoLT5iX3NpemUgIT0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtNTogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaGFzIHdyb25nIGJsb2Nrc2l6ZSAlc1slZF0gKCViKVxuIiwKKwkJCQkgICAgICAgZGVzY3IsIGxldmVsLCBwX3NfYmgpOworCQl9CiAKLSAgICBpZiAocF9zX2JoLT5iX2Jsb2NrbnIgPiBTQl9CTE9DS19DT1VOVChwX3Nfc2IpKSB7Ci0JcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTY6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGJsb2NrIG51bWJlciB0b28gaGlnaCAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOwotICAgIH0KLSAgfQorCQlpZiAocF9zX2JoLT5iX2Jsb2NrbnIgPiBTQl9CTE9DS19DT1VOVChwX3Nfc2IpKSB7CisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJqbWFjZC02OiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBibG9jayBudW1iZXIgdG9vIGhpZ2ggJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQorCX0KIH0KICNlbHNlCi1zdGF0aWMgdm9pZCB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCwgCi0JCQkJICAgIGNvbnN0IGNoYXIgKmRlc2NyLCBpbnQgbGV2ZWwpCi17O30KK3N0YXRpYyB2b2lkIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmgsCisJCQkJICAgY29uc3QgY2hhciAqZGVzY3IsIGludCBsZXZlbCkKK3s7Cit9CiAjZW5kaWYKIAotc3RhdGljIGludCBjbGVhcl9hbGxfZGlydHlfYml0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gIHJldHVybiByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAwKSA7Ci19Ci0KLXN0YXRpYyBpbnQgd2FpdF90Yl9idWZmZXJzX3VudGlsX3VubG9ja2VkIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiKQorc3RhdGljIGludCBjbGVhcl9hbGxfZGlydHlfYml0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogbG9ja2VkOwotI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGludCByZXBlYXRfY291bnRlciA9IDA7Ci0jZW5kaWYKLSAgICBpbnQgaTsKLQotICAgIGRvIHsKLQotCWxvY2tlZCA9IE5VTEw7Ci0KLQlmb3IgKCBpID0gcF9zX3RiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aDsgIWxvY2tlZCAmJiBpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOyBpLS0gKSB7Ci0JICAgIGlmICggUEFUSF9PRkZTRVRfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBpKSApIHsKLQkJLyogaWYgSSB1bmRlcnN0YW5kIGNvcnJlY3RseSwgd2UgY2FuIG9ubHkgYmUgc3VyZSB0aGUgbGFzdCBidWZmZXIKLQkJKiogaW4gdGhlIHBhdGggaXMgaW4gdGhlIHRyZWUgLS1jbG0KLQkJKi8KLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkJaWYgKFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCkgPT0KLQkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBpKSkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgCi0JCQkJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIGkpLCAKLQkJCQkJICAgICJTIiwgCi0JCQkJCSAgICBwX3NfdGItPnRiX3BhdGgtPnBhdGhfbGVuZ3RoIC0gaSk7Ci0JCX0KLSNlbmRpZgotCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsCi0JCQkJICAgICBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIGkpKSkKLQkJewotCQkgICAgbG9ja2VkID0gUEFUSF9PRkZTRVRfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBpKTsKLQkJfQotCSAgICB9Ci0JfQotCi0JZm9yICggaSA9IDA7ICFsb2NrZWQgJiYgaSA8IE1BWF9IRUlHSFQgJiYgcF9zX3RiLT5pbnNlcnRfc2l6ZVtpXTsgaSsrICkgeyAKLQotCSAgICBpZiAocF9zX3RiLT5sbnVtW2ldICkgewotCi0JCWlmICggcF9zX3RiLT5MW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5MW2ldLCAiTCIsIGkpOwotCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPkxbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5MW2ldOwotCQl9Ci0KLQkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+RkxbaV0gKSB7Ci0JCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZMW2ldLCAiRkwiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GTFtpXSkpCi0JCQlsb2NrZWQgPSBwX3NfdGItPkZMW2ldOwotCQl9Ci0KLQkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+Q0ZMW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0sICJDRkwiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5DRkxbaV07Ci0JCX0KLQotCSAgICB9Ci0KLQkgICAgaWYgKCAhbG9ja2VkICYmIChwX3NfdGItPnJudW1baV0pICkgewotCi0JCWlmICggcF9zX3RiLT5SW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5SW2ldLCAiUiIsIGkpOwotCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPlJbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5SW2ldOwotCQl9Ci0KLSAgICAgICAKLQkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+RlJbaV0gKSB7Ci0JCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZSW2ldLCAiRlIiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GUltpXSkpCi0JCQlsb2NrZWQgPSBwX3NfdGItPkZSW2ldOwotCQl9Ci0KLQkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+Q0ZSW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0sICJDRlIiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5DRlJbaV07Ci0JCX0KLQkgICAgfQotCX0KLQkvKiBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhpcyBpcyBub3QgcmVxdWlyZWQuICBUaGUgRkVCIGxpc3Qgc2VlbXMKLQkqKiB0byBiZSBmdWxsIG9mIG5ld2x5IGFsbG9jYXRlZCBub2Rlcywgd2hpY2ggd2lsbCBuZXZlciBiZSBsb2NrZWQsCi0JKiogZGlydHksIG9yIGFueXRoaW5nIGVsc2UuCi0JKiogVG8gYmUgc2FmZSwgSSdtIHB1dHRpbmcgaW4gdGhlIGNoZWNrcyBhbmQgd2FpdHMgaW4uICBGb3IgdGhlIG1vbWVudCwKLQkqKiB0aGV5IGFyZSBuZWVkZWQgdG8ga2VlcCB0aGUgY29kZSBpbiBqb3VybmFsLmMgZnJvbSBjb21wbGFpbmluZwotCSoqIGFib3V0IHRoZSBidWZmZXIuICBUaGF0IGNvZGUgaXMgaW5zaWRlIENPTkZJR19SRUlTRVJGU19DSEVDSyBhcyB3ZWxsLgotCSoqIC0tY2xtCi0JKi8KLQlmb3IgKCBpID0gMDsgIWxvY2tlZCAmJiBpIDwgTUFYX0ZFQl9TSVpFOyBpKysgKSB7IAotCSAgICBpZiAoIHBfc190Yi0+RkVCW2ldICkgewotCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkVCW2ldKSkKLQkJICAgIGxvY2tlZCA9IHBfc190Yi0+RkVCW2ldIDsKLQkgICAgfQotCX0KLQotCWlmIChsb2NrZWQpIHsKLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkgICAgcmVwZWF0X2NvdW50ZXIrKzsKLQkgICAgaWYgKCAocmVwZWF0X2NvdW50ZXIgJSAxMDAwMCkgPT0gMCkgewotCQlyZWlzZXJmc193YXJuaW5nIChwX3NfdGItPnRiX3NiLAotCQkJCSAgIndhaXRfdGJfYnVmZmVyc191bnRpbF9yZWxlYXNlZCgpOiB0b28gbWFueSAiCi0JCQkJICAiaXRlcmF0aW9ucyB3YWl0aW5nIGZvciBidWZmZXIgdG8gdW5sb2NrICIKLQkJCQkgICIoJWIpIiwgbG9ja2VkKTsKLQotCQkvKiBEb24ndCBsb29wIGZvcmV2ZXIuICBUcnkgdG8gcmVjb3ZlciBmcm9tIHBvc3NpYmxlIGVycm9yLiAqLwotCi0JCXJldHVybiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApID8gUkVQRUFUX1NFQVJDSCA6IENBUlJZX09OOwotCSAgICB9Ci0jZW5kaWYKLQkgICAgX193YWl0X29uX2J1ZmZlciAobG9ja2VkKTsKLQkgICAgaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSB7Ci0JCXJldHVybiBSRVBFQVRfU0VBUkNIOwotCSAgICB9Ci0JfQotCi0gICAgfSB3aGlsZSAobG9ja2VkKTsKLQotICAgIHJldHVybiBDQVJSWV9PTjsKKwlyZXR1cm4gcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaCwgMCk7CiB9CiAKK3N0YXRpYyBpbnQgd2FpdF90Yl9idWZmZXJzX3VudGlsX3VubG9ja2VkKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxvY2tlZDsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwlpbnQgcmVwZWF0X2NvdW50ZXIgPSAwOworI2VuZGlmCisJaW50IGk7CisKKwlkbyB7CisKKwkJbG9ja2VkID0gTlVMTDsKKworCQlmb3IgKGkgPSBwX3NfdGItPnRiX3BhdGgtPnBhdGhfbGVuZ3RoOworCQkgICAgICFsb2NrZWQgJiYgaSA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsgaS0tKSB7CisJCQlpZiAoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIGkpKSB7CisJCQkJLyogaWYgSSB1bmRlcnN0YW5kIGNvcnJlY3RseSwgd2UgY2FuIG9ubHkgYmUgc3VyZSB0aGUgbGFzdCBidWZmZXIKKwkJCQkgKiogaW4gdGhlIHBhdGggaXMgaW4gdGhlIHRyZWUgLS1jbG0KKwkJCQkgKi8KKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwkJCQlpZiAoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3RiLT50Yl9wYXRoKSA9PQorCQkJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgaSkpIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBQQVRIX09GRlNFVF9QQlVGRkVSCisJCQkJCQkJICAgICAgIChwX3NfdGItPnRiX3BhdGgsCisJCQkJCQkJCWkpLCAiUyIsCisJCQkJCQkJICAgICAgIHBfc190Yi0+dGJfcGF0aC0+CisJCQkJCQkJICAgICAgIHBhdGhfbGVuZ3RoIC0gaSk7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgUEFUSF9PRkZTRVRfUEJVRkZFUgorCQkJCQkJCSAgKHBfc190Yi0+dGJfcGF0aCwKKwkJCQkJCQkgICBpKSkpIHsKKwkJCQkJbG9ja2VkID0KKwkJCQkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLAorCQkJCQkJCQlpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlmb3IgKGkgPSAwOyAhbG9ja2VkICYmIGkgPCBNQVhfSEVJR0hUICYmIHBfc190Yi0+aW5zZXJ0X3NpemVbaV07CisJCSAgICAgaSsrKSB7CisKKwkJCWlmIChwX3NfdGItPmxudW1baV0pIHsKKworCQkJCWlmIChwX3NfdGItPkxbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPkxbaV0sCisJCQkJCQkJICAgICAgICJMIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkxbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5MW2ldOworCQkJCX0KKworCQkJCWlmICghbG9ja2VkICYmIHBfc190Yi0+RkxbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPkZMW2ldLAorCQkJCQkJCSAgICAgICAiRkwiLCBpKTsKKwkJCQkJaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cworCQkJCQkgICAgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkxbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5GTFtpXTsKKwkJCQl9CisKKwkJCQlpZiAoIWxvY2tlZCAmJiBwX3NfdGItPkNGTFtpXSkgeworCQkJCQl0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJICAgICAgIHBfc190Yi0+Q0ZMW2ldLAorCQkJCQkJCSAgICAgICAiQ0ZMIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGTFtpXSkpCisJCQkJCQlsb2NrZWQgPSBwX3NfdGItPkNGTFtpXTsKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCFsb2NrZWQgJiYgKHBfc190Yi0+cm51bVtpXSkpIHsKKworCQkJCWlmIChwX3NfdGItPlJbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPlJbaV0sCisJCQkJCQkJICAgICAgICJSIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPlJbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5SW2ldOworCQkJCX0KKworCQkJCWlmICghbG9ja2VkICYmIHBfc190Yi0+RlJbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPkZSW2ldLAorCQkJCQkJCSAgICAgICAiRlIiLCBpKTsKKwkJCQkJaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cworCQkJCQkgICAgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RlJbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5GUltpXTsKKwkJCQl9CisKKwkJCQlpZiAoIWxvY2tlZCAmJiBwX3NfdGItPkNGUltpXSkgeworCQkJCQl0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJICAgICAgIHBfc190Yi0+Q0ZSW2ldLAorCQkJCQkJCSAgICAgICAiQ0ZSIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGUltpXSkpCisJCQkJCQlsb2NrZWQgPSBwX3NfdGItPkNGUltpXTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogYXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoaXMgaXMgbm90IHJlcXVpcmVkLiAgVGhlIEZFQiBsaXN0IHNlZW1zCisJCSAqKiB0byBiZSBmdWxsIG9mIG5ld2x5IGFsbG9jYXRlZCBub2Rlcywgd2hpY2ggd2lsbCBuZXZlciBiZSBsb2NrZWQsCisJCSAqKiBkaXJ0eSwgb3IgYW55dGhpbmcgZWxzZS4KKwkJICoqIFRvIGJlIHNhZmUsIEknbSBwdXR0aW5nIGluIHRoZSBjaGVja3MgYW5kIHdhaXRzIGluLiAgRm9yIHRoZSBtb21lbnQsCisJCSAqKiB0aGV5IGFyZSBuZWVkZWQgdG8ga2VlcCB0aGUgY29kZSBpbiBqb3VybmFsLmMgZnJvbSBjb21wbGFpbmluZworCQkgKiogYWJvdXQgdGhlIGJ1ZmZlci4gIFRoYXQgY29kZSBpcyBpbnNpZGUgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGFzIHdlbGwuCisJCSAqKiAtLWNsbQorCQkgKi8KKwkJZm9yIChpID0gMDsgIWxvY2tlZCAmJiBpIDwgTUFYX0ZFQl9TSVpFOyBpKyspIHsKKwkJCWlmIChwX3NfdGItPkZFQltpXSkgeworCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkgICAgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkVCW2ldKSkKKwkJCQkJbG9ja2VkID0gcF9zX3RiLT5GRUJbaV07CisJCQl9CisJCX0KKworCQlpZiAobG9ja2VkKSB7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCQlyZXBlYXRfY291bnRlcisrOworCQkJaWYgKChyZXBlYXRfY291bnRlciAlIDEwMDAwKSA9PSAwKSB7CisJCQkJcmVpc2VyZnNfd2FybmluZyhwX3NfdGItPnRiX3NiLAorCQkJCQkJICJ3YWl0X3RiX2J1ZmZlcnNfdW50aWxfcmVsZWFzZWQoKTogdG9vIG1hbnkgIgorCQkJCQkJICJpdGVyYXRpb25zIHdhaXRpbmcgZm9yIGJ1ZmZlciB0byB1bmxvY2sgIgorCQkJCQkJICIoJWIpIiwgbG9ja2VkKTsKKworCQkJCS8qIERvbid0IGxvb3AgZm9yZXZlci4gIFRyeSB0byByZWNvdmVyIGZyb20gcG9zc2libGUgZXJyb3IuICovCisKKwkJCQlyZXR1cm4gKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSA/CisJCQkJICAgIFJFUEVBVF9TRUFSQ0ggOiBDQVJSWV9PTjsKKwkJCX0KKyNlbmRpZgorCQkJX193YWl0X29uX2J1ZmZlcihsb2NrZWQpOworCQkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7CisJCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCQl9CisJCX0KKworCX0gd2hpbGUgKGxvY2tlZCk7CisKKwlyZXR1cm4gQ0FSUllfT047Cit9CiAKIC8qIFByZXBhcmUgZm9yIGJhbGFuY2luZywgdGhhdCBpcwogICoJZ2V0IGFsbCBuZWNlc3NhcnkgcGFyZW50cywgYW5kIG5laWdoYm9yczsKQEAgLTIyNjcsMjUyICsyMzYwLDI2NiBAQAogICogICAgICAgICAgICAgLTEgLSBpZiBub19kaXNrX3NwYWNlIAogICovCiAKK2ludCBmaXhfbm9kZXMoaW50IG5fb3BfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLCBzdHJ1Y3QgaXRlbV9oZWFkICpwX3NfaW5zX2loLAkvLyBpdGVtIGhlYWQgb2YgaXRlbSBiZWluZyBpbnNlcnRlZAorCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEJLy8gaW5zZXJ0ZWQgaXRlbSBvciBkYXRhIHRvIGJlIHBhc3RlZAorICAgICkKK3sKKwlpbnQgbl9yZXRfdmFsdWUsIG5faCwgbl9pdGVtX251bSA9IFBBVEhfTEFTVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgpOworCWludCBuX3Bvc19pbl9pdGVtOwogCi1pbnQgZml4X25vZGVzIChpbnQgbl9vcF9tb2RlLAotCSAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogCXBfc190YiwKLQkgICAgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBfc19pbnNfaWgsIC8vIGl0ZW0gaGVhZCBvZiBpdGVtIGJlaW5nIGluc2VydGVkCi0JICAgICAgIGNvbnN0IHZvaWQgKiBkYXRhIC8vIGluc2VydGVkIGl0ZW0gb3IgZGF0YSB0byBiZSBwYXN0ZWQKLSAgICApIHsKLSAgICBpbnQJbl9yZXRfdmFsdWUsCi0gICAgCW5faCwKLSAgICAJbl9pdGVtX251bSA9IFBBVEhfTEFTVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgpOwotICAgIGludCBuX3Bvc19pbl9pdGVtOworCS8qIHdlIHNldCB3YWl0X3RiX2J1ZmZlcnNfcnVuIHdoZW4gd2UgaGF2ZSB0byByZXN0b3JlIGFueSBkaXJ0eSBiaXRzIGNsZWFyZWQKKwkgKiogZHVyaW5nIHdhaXRfdGJfYnVmZmVyc19ydW4KKwkgKi8KKwlpbnQgd2FpdF90Yl9idWZmZXJzX3J1biA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCk7CiAKLSAgICAvKiB3ZSBzZXQgd2FpdF90Yl9idWZmZXJzX3J1biB3aGVuIHdlIGhhdmUgdG8gcmVzdG9yZSBhbnkgZGlydHkgYml0cyBjbGVhcmVkCi0gICAgKiogZHVyaW5nIHdhaXRfdGJfYnVmZmVyc19ydW4KLSAgICAqLwotICAgIGludCB3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMCA7IAotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCk7CisJKytSRUlTRVJGU19TQihwX3NfdGItPnRiX3NiKS0+c19maXhfbm9kZXM7CiAKLSAgICArKyBSRUlTRVJGU19TQihwX3NfdGIgLT4gdGJfc2IpIC0+IHNfZml4X25vZGVzOworCW5fcG9zX2luX2l0ZW0gPSBwX3NfdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOwogCi0gICAgbl9wb3NfaW5faXRlbSA9IHBfc190Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW07CisJcF9zX3RiLT5mc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihwX3NfdGItPnRiX3NiKTsKIAorCS8qIHdlIHByZXBhcmUgYW5kIGxvZyB0aGUgc3VwZXIgaGVyZSBzbyBpdCB3aWxsIGFscmVhZHkgYmUgaW4gdGhlCisJICoqIHRyYW5zYWN0aW9uIHdoZW4gZG9fYmFsYW5jZSBuZWVkcyB0byBjaGFuZ2UgaXQuCisJICoqIFRoaXMgd2F5IGRvX2JhbGFuY2Ugd29uJ3QgaGF2ZSB0byBzY2hlZHVsZSB3aGVuIHRyeWluZyB0byBwcmVwYXJlCisJICoqIHRoZSBzdXBlciBmb3IgbG9nZ2luZworCSAqLworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3RiLT50Yl9zYiwKKwkJCQkgICAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc190Yi0+dGJfc2IpLCAxKTsKKwlqb3VybmFsX21hcmtfZGlydHkocF9zX3RiLT50cmFuc2FjdGlvbl9oYW5kbGUsIHBfc190Yi0+dGJfc2IsCisJCQkgICBTQl9CVUZGRVJfV0lUSF9TQihwX3NfdGItPnRiX3NiKSk7CisJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKQorCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAotICAgIHBfc190Yi0+ZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKHBfc190Yi0+dGJfc2IpOwotCi0gICAgLyogd2UgcHJlcGFyZSBhbmQgbG9nIHRoZSBzdXBlciBoZXJlIHNvIGl0IHdpbGwgYWxyZWFkeSBiZSBpbiB0aGUKLSAgICAqKiB0cmFuc2FjdGlvbiB3aGVuIGRvX2JhbGFuY2UgbmVlZHMgdG8gY2hhbmdlIGl0LgotICAgICoqIFRoaXMgd2F5IGRvX2JhbGFuY2Ugd29uJ3QgaGF2ZSB0byBzY2hlZHVsZSB3aGVuIHRyeWluZyB0byBwcmVwYXJlCi0gICAgKiogdGhlIHN1cGVyIGZvciBsb2dnaW5nCi0gICAgKi8KLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc190Yi0+dGJfc2IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3RiLT50Yl9zYiksIDEpIDsKLSAgICBqb3VybmFsX21hcmtfZGlydHkocF9zX3RiLT50cmFuc2FjdGlvbl9oYW5kbGUsIHBfc190Yi0+dGJfc2IsIAotICAgICAgICAgICAgICAgICAgICAgICBTQl9CVUZGRVJfV0lUSF9TQihwX3NfdGItPnRiX3NiKSkgOwotICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKLQotICAgIC8qIGlmIGl0IHBvc3NpYmxlIGluIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uICovCi0gICAgaWYgKGJ1ZmZlcl9sb2NrZWQgKHBfc190YlMwKSkgewotICAgICAgICBfX3dhaXRfb25fYnVmZmVyIChwX3NfdGJTMCk7Ci0gICAgICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKLSAgICAgICAgICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOwotICAgIH0KLQotI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGlmICggY3VyX3RiICkgewotCXByaW50X2N1cl90YiAoImZpeF9ub2RlcyIpOwotCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzA1OiBmaXhfbm9kZXM6ICB0aGVyZSBpcyBwZW5kaW5nIGRvX2JhbGFuY2UiKTsKLSAgICB9Ci0KLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZSAocF9zX3RiUzApIHx8ICFCX0lTX0lOX1RSRUUgKHBfc190YlMwKSkgewotCXJlaXNlcmZzX3BhbmljIChwX3NfdGItPnRiX3NiLCAiUEFQLTgzMjA6IGZpeF9ub2RlczogU1swXSAoJWIgJXopIGlzIG5vdCB1cHRvZGF0ZSAiCi0JCQkiYXQgdGhlIGJlZ2lubmluZyBvZiBmaXhfbm9kZXMgb3Igbm90IGluIHRyZWUgKG1vZGUgJWMpIiwgcF9zX3RiUzAsIHBfc190YlMwLCBuX29wX21vZGUpOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMuICovCi0gICAgc3dpdGNoIChuX29wX21vZGUpIHsKLSAgICBjYXNlIE1fSU5TRVJUOgotCWlmICggbl9pdGVtX251bSA8PSAwIHx8IG5faXRlbV9udW0gPiBCX05SX0lURU1TKHBfc190YlMwKSApCi0JICAgIHJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzMwOiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciAlZCAoaW4gUzAgLSAlZCkgaW4gY2FzZSBvZiBpbnNlcnQiLAotCQkJICAgbl9pdGVtX251bSwgQl9OUl9JVEVNUyhwX3NfdGJTMCkpOwotCWJyZWFrOwotICAgIGNhc2UgTV9QQVNURToKLSAgICBjYXNlIE1fREVMRVRFOgotICAgIGNhc2UgTV9DVVQ6Ci0JaWYgKCBuX2l0ZW1fbnVtIDwgMCB8fCBuX2l0ZW1fbnVtID49IEJfTlJfSVRFTVMocF9zX3RiUzApICkgewotCSAgICBwcmludF9ibG9jayAocF9zX3RiUzAsIDAsIC0xLCAtMSk7Ci0JICAgIHJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzM1OiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciglZCk7IG1vZGUgPSAlYyBpbnNlcnRfc2l6ZSA9ICVkXG4iLCBuX2l0ZW1fbnVtLCBuX29wX21vZGUsIHBfc190Yi0+aW5zZXJ0X3NpemVbMF0pOworCS8qIGlmIGl0IHBvc3NpYmxlIGluIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uICovCisJaWYgKGJ1ZmZlcl9sb2NrZWQocF9zX3RiUzApKSB7CisJCV9fd2FpdF9vbl9idWZmZXIocF9zX3RiUzApOworCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpCisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAl9Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODM0MDogZml4X25vZGVzOiBJbmNvcnJlY3QgbW9kZSBvZiBvcGVyYXRpb24iKTsKLSAgICB9CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJaWYgKGN1cl90YikgeworCQlwcmludF9jdXJfdGIoImZpeF9ub2RlcyIpOworCQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLAorCQkJICAgICAgICJQQVAtODMwNTogZml4X25vZGVzOiAgdGhlcmUgaXMgcGVuZGluZyBkb19iYWxhbmNlIik7CisJfQorCisJaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX3RiUzApIHx8ICFCX0lTX0lOX1RSRUUocF9zX3RiUzApKSB7CisJCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsCisJCQkgICAgICAgIlBBUC04MzIwOiBmaXhfbm9kZXM6IFNbMF0gKCViICV6KSBpcyBub3QgdXB0b2RhdGUgIgorCQkJICAgICAgICJhdCB0aGUgYmVnaW5uaW5nIG9mIGZpeF9ub2RlcyBvciBub3QgaW4gdHJlZSAobW9kZSAlYykiLAorCQkJICAgICAgIHBfc190YlMwLCBwX3NfdGJTMCwgbl9vcF9tb2RlKTsKKwl9CisKKwkvKiBDaGVjayBwYXJhbWV0ZXJzLiAqLworCXN3aXRjaCAobl9vcF9tb2RlKSB7CisJY2FzZSBNX0lOU0VSVDoKKwkJaWYgKG5faXRlbV9udW0gPD0gMCB8fCBuX2l0ZW1fbnVtID4gQl9OUl9JVEVNUyhwX3NfdGJTMCkpCisJCQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLAorCQkJCSAgICAgICAiUEFQLTgzMzA6IGZpeF9ub2RlczogSW5jb3JyZWN0IGl0ZW0gbnVtYmVyICVkIChpbiBTMCAtICVkKSBpbiBjYXNlIG9mIGluc2VydCIsCisJCQkJICAgICAgIG5faXRlbV9udW0sIEJfTlJfSVRFTVMocF9zX3RiUzApKTsKKwkJYnJlYWs7CisJY2FzZSBNX1BBU1RFOgorCWNhc2UgTV9ERUxFVEU6CisJY2FzZSBNX0NVVDoKKwkJaWYgKG5faXRlbV9udW0gPCAwIHx8IG5faXRlbV9udW0gPj0gQl9OUl9JVEVNUyhwX3NfdGJTMCkpIHsKKwkJCXByaW50X2Jsb2NrKHBfc190YlMwLCAwLCAtMSwgLTEpOworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3RiLT50Yl9zYiwKKwkJCQkgICAgICAgIlBBUC04MzM1OiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciglZCk7IG1vZGUgPSAlYyBpbnNlcnRfc2l6ZSA9ICVkXG4iLAorCQkJCSAgICAgICBuX2l0ZW1fbnVtLCBuX29wX21vZGUsCisJCQkJICAgICAgIHBfc190Yi0+aW5zZXJ0X3NpemVbMF0pOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsCisJCQkgICAgICAgIlBBUC04MzQwOiBmaXhfbm9kZXM6IEluY29ycmVjdCBtb2RlIG9mIG9wZXJhdGlvbiIpOworCX0KICNlbmRpZgogCi0gICAgaWYgKGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZSAocF9zX3RiKSA9PSBSRVBFQVRfU0VBUkNIKQotCS8vIEZJWE1FOiBtYXliZSAtRU5PTUVNIHdoZW4gdGItPnZuX2J1ZiA9PSAwPyBOb3cganVzdCByZXBlYXQKLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwlpZiAoZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlKHBfc190YikgPT0gUkVQRUFUX1NFQVJDSCkKKwkJLy8gRklYTUU6IG1heWJlIC1FTk9NRU0gd2hlbiB0Yi0+dm5fYnVmID09IDA/IE5vdyBqdXN0IHJlcGVhdAorCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAotCi0gICAgLyogU3RhcnRpbmcgZnJvbSB0aGUgbGVhZiBsZXZlbDsgZm9yIGFsbCBsZXZlbHMgbl9oIG9mIHRoZSB0cmVlLiAqLwotICAgIGZvciAoIG5faCA9IDA7IG5faCA8IE1BWF9IRUlHSFQgJiYgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2hdOyBuX2grKyApIHsgCi0JaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZGlyZWN0X3BhcmVudChwX3NfdGIsIG5faCkpICE9IENBUlJZX09OICkgewotCSAgICBnb3RvIHJlcGVhdDsKLQl9Ci0KLQlpZiAoIChuX3JldF92YWx1ZSA9IGNoZWNrX2JhbGFuY2UgKG5fb3BfbW9kZSwgcF9zX3RiLCBuX2gsIG5faXRlbV9udW0sCi0JCQkJCSAgIG5fcG9zX2luX2l0ZW0sIHBfc19pbnNfaWgsIGRhdGEpKSAhPSBDQVJSWV9PTiApIHsKLQkgICAgaWYgKCBuX3JldF92YWx1ZSA9PSBOT19CQUxBTkNJTkdfTkVFREVEICkgewotCQkvKiBObyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkLiAqLwotCQlpZiAoIChuX3JldF92YWx1ZSA9IGdldF9uZWlnaGJvcnMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKLQkJICAgIGdvdG8gcmVwZWF0OworCS8qIFN0YXJ0aW5nIGZyb20gdGhlIGxlYWYgbGV2ZWw7IGZvciBhbGwgbGV2ZWxzIG5faCBvZiB0aGUgdHJlZS4gKi8KKwlmb3IgKG5faCA9IDA7IG5faCA8IE1BWF9IRUlHSFQgJiYgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2hdOyBuX2grKykgeworCQlpZiAoKG5fcmV0X3ZhbHVlID0gZ2V0X2RpcmVjdF9wYXJlbnQocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTikgeworCQkJZ290byByZXBlYXQ7CiAJCX0KLQkJaWYgKCBuX2ggIT0gTUFYX0hFSUdIVCAtIDEgKSAgCi0JCSAgICBwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gMDsKLQkJLyogb2ssIGFuYWx5c2lzIGFuZCByZXNvdXJjZSBnYXRoZXJpbmcgYXJlIGNvbXBsZXRlICovCi0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGdvdG8gcmVwZWF0OwotCX0KIAotCWlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X25laWdoYm9ycyhwX3NfdGIsIG5faCkpICE9IENBUlJZX09OICkgewotCSAgICBnb3RvIHJlcGVhdDsKLQl9Ci0KLQlpZiAoIChuX3JldF92YWx1ZSA9IGdldF9lbXB0eV9ub2RlcyhwX3NfdGIsIG5faCkpICE9IENBUlJZX09OICkgewotCSAgICBnb3RvIHJlcGVhdDsgICAgICAgIC8qIE5vIGRpc2sgc3BhY2UsIG9yIHNjaGVkdWxlIG9jY3VycmVkIGFuZAotCQkJCSAgIGFuYWx5c2lzIG1heSBiZSBpbnZhbGlkIGFuZCBuZWVkcyB0byBiZSByZWRvbmUuICovCi0JfQotICAgIAotCWlmICggISBQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCkgKSB7Ci0JICAgIC8qIFdlIGhhdmUgYSBwb3NpdGl2ZSBpbnNlcnQgc2l6ZSBidXQgbm8gbm9kZXMgZXhpc3Qgb24gdGhpcwotCSAgICAgICBsZXZlbCwgdGhpcyBtZWFucyB0aGF0IHdlIGFyZSBjcmVhdGluZyBhIG5ldyByb290LiAqLwotCi0JICAgIFJGQUxTRSggcF9zX3RiLT5ibGtudW1bbl9oXSAhPSAxLAotCQkgICAgIlBBUC04MzUwOiBjcmVhdGluZyBuZXcgZW1wdHkgcm9vdCIpOwotCi0JICAgIGlmICggbl9oIDwgTUFYX0hFSUdIVCAtIDEgKQotCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gMDsKLQl9Ci0JZWxzZQotCSAgICBpZiAoICEgUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKSApIHsKLQkJaWYgKCBwX3NfdGItPmJsa251bVtuX2hdID4gMSApIHsKLQkJICAgIC8qIFRoZSB0cmVlIG5lZWRzIHRvIGJlIGdyb3duLCBzbyB0aGlzIG5vZGUgU1tuX2hdCi0JCSAgICAgICB3aGljaCBpcyB0aGUgcm9vdCBub2RlIGlzIHNwbGl0IGludG8gdHdvIG5vZGVzLAotCQkgICAgICAgYW5kIGEgbmV3IG5vZGUgKFNbbl9oKzFdKSB3aWxsIGJlIGNyZWF0ZWQgdG8KLQkJICAgICAgIGJlY29tZSB0aGUgcm9vdCBub2RlLiAgKi8KLQkgIAotCQkgICAgUkZBTFNFKCBuX2ggPT0gTUFYX0hFSUdIVCAtIDEsCi0JCQkgICAgIlBBUC04MzU1OiBhdHRlbXB0IHRvIGNyZWF0ZSB0b28gaGlnaCBvZiBhIHRyZWUiKTsKLQotCQkgICAgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IChEQ19TSVpFICsgS0VZX1NJWkUpICogKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKSArIERDX1NJWkU7CisJCWlmICgobl9yZXRfdmFsdWUgPQorCQkgICAgIGNoZWNrX2JhbGFuY2Uobl9vcF9tb2RlLCBwX3NfdGIsIG5faCwgbl9pdGVtX251bSwKKwkJCQkgICBuX3Bvc19pbl9pdGVtLCBwX3NfaW5zX2loLAorCQkJCSAgIGRhdGEpKSAhPSBDQVJSWV9PTikgeworCQkJaWYgKG5fcmV0X3ZhbHVlID09IE5PX0JBTEFOQ0lOR19ORUVERUQpIHsKKwkJCQkvKiBObyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkLiAqLworCQkJCWlmICgobl9yZXRfdmFsdWUgPQorCQkJCSAgICAgZ2V0X25laWdoYm9ycyhwX3NfdGIsIG5faCkpICE9IENBUlJZX09OKSB7CisJCQkJCWdvdG8gcmVwZWF0OworCQkJCX0KKwkJCQlpZiAobl9oICE9IE1BWF9IRUlHSFQgLSAxKQorCQkJCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gMDsKKwkJCQkvKiBvaywgYW5hbHlzaXMgYW5kIHJlc291cmNlIGdhdGhlcmluZyBhcmUgY29tcGxldGUgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gcmVwZWF0OwogCQl9Ci0JCWVsc2UKLQkJICAgIGlmICggbl9oIDwgTUFYX0hFSUdIVCAtIDEgKQotCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7Ci0JICAgIH0KLQkgICAgZWxzZQotCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gKERDX1NJWkUgKyBLRVlfU0laRSkgKiAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpOwotICAgIH0KIAotICAgIGlmICgobl9yZXRfdmFsdWUgPSB3YWl0X3RiX2J1ZmZlcnNfdW50aWxfdW5sb2NrZWQgKHBfc190YikpID09IENBUlJZX09OKSB7Ci0JaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7Ci0JICAgIHdhaXRfdGJfYnVmZmVyc19ydW4gPSAxIDsKLQkgICAgbl9yZXRfdmFsdWUgPSBSRVBFQVRfU0VBUkNIIDsKLQkgICAgZ290byByZXBlYXQ7IAorCQlpZiAoKG5fcmV0X3ZhbHVlID0gZ2V0X25laWdoYm9ycyhwX3NfdGIsIG5faCkpICE9IENBUlJZX09OKSB7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCisJCWlmICgobl9yZXRfdmFsdWUgPSBnZXRfZW1wdHlfbm9kZXMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTikgeworCQkJZ290byByZXBlYXQ7CS8qIE5vIGRpc2sgc3BhY2UsIG9yIHNjaGVkdWxlIG9jY3VycmVkIGFuZAorCQkJCQkgICBhbmFseXNpcyBtYXkgYmUgaW52YWxpZCBhbmQgbmVlZHMgdG8gYmUgcmVkb25lLiAqLworCQl9CisKKwkJaWYgKCFQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCkpIHsKKwkJCS8qIFdlIGhhdmUgYSBwb3NpdGl2ZSBpbnNlcnQgc2l6ZSBidXQgbm8gbm9kZXMgZXhpc3Qgb24gdGhpcworCQkJICAgbGV2ZWwsIHRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm9vdC4gKi8KKworCQkJUkZBTFNFKHBfc190Yi0+YmxrbnVtW25faF0gIT0gMSwKKwkJCSAgICAgICAiUEFQLTgzNTA6IGNyZWF0aW5nIG5ldyBlbXB0eSByb290Iik7CisKKwkJCWlmIChuX2ggPCBNQVhfSEVJR0hUIC0gMSkKKwkJCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gMDsKKwkJfSBlbHNlIGlmICghUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKSkgeworCQkJaWYgKHBfc190Yi0+YmxrbnVtW25faF0gPiAxKSB7CisJCQkJLyogVGhlIHRyZWUgbmVlZHMgdG8gYmUgZ3Jvd24sIHNvIHRoaXMgbm9kZSBTW25faF0KKwkJCQkgICB3aGljaCBpcyB0aGUgcm9vdCBub2RlIGlzIHNwbGl0IGludG8gdHdvIG5vZGVzLAorCQkJCSAgIGFuZCBhIG5ldyBub2RlIChTW25faCsxXSkgd2lsbCBiZSBjcmVhdGVkIHRvCisJCQkJICAgYmVjb21lIHRoZSByb290IG5vZGUuICAqLworCisJCQkJUkZBTFNFKG5faCA9PSBNQVhfSEVJR0hUIC0gMSwKKwkJCQkgICAgICAgIlBBUC04MzU1OiBhdHRlbXB0IHRvIGNyZWF0ZSB0b28gaGlnaCBvZiBhIHRyZWUiKTsKKworCQkJCXBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPQorCQkJCSAgICAoRENfU0laRSArCisJCQkJICAgICBLRVlfU0laRSkgKiAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpICsKKwkJCQkgICAgRENfU0laRTsKKwkJCX0gZWxzZSBpZiAobl9oIDwgTUFYX0hFSUdIVCAtIDEpCisJCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7CisJCX0gZWxzZQorCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9CisJCQkgICAgKERDX1NJWkUgKyBLRVlfU0laRSkgKiAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpOworCX0KKworCWlmICgobl9yZXRfdmFsdWUgPSB3YWl0X3RiX2J1ZmZlcnNfdW50aWxfdW5sb2NrZWQocF9zX3RiKSkgPT0gQ0FSUllfT04pIHsKKwkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7CisJCQl3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMTsKKwkJCW5fcmV0X3ZhbHVlID0gUkVQRUFUX1NFQVJDSDsKKwkJCWdvdG8gcmVwZWF0OworCQl9IGVsc2UgeworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CiAJfSBlbHNlIHsKLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLSAgICB9IGVsc2UgewotCXdhaXRfdGJfYnVmZmVyc19ydW4gPSAxIDsKLQlnb3RvIHJlcGVhdDsgCi0gICAgfQotCi0gcmVwZWF0OgotICAgIC8vIGZpeF9ub2RlcyB3YXMgdW5hYmxlIHRvIHBlcmZvcm0gaXRzIGNhbGN1bGF0aW9uIGR1ZSB0bwotICAgIC8vIGZpbGVzeXN0ZW0gZ290IGNoYW5nZWQgdW5kZXIgdXMsIGxhY2sgb2YgZnJlZSBkaXNrIHNwYWNlIG9yIGkvbwotICAgIC8vIGZhaWx1cmUuIElmIHRoZSBmaXJzdCBpcyB0aGUgY2FzZSAtIHRoZSBzZWFyY2ggd2lsbCBiZQotICAgIC8vIHJlcGVhdGVkLiBGb3Igbm93IC0gZnJlZSBhbGwgcmVzb3VyY2VzIGFjcXVpcmVkIHNvIGZhciBleGNlcHQKLSAgICAvLyBmb3IgdGhlIG5ldyBhbGxvY2F0ZWQgbm9kZXMKLSAgICB7Ci0JaW50IGk7Ci0KLQkvKiBSZWxlYXNlIHBhdGggYnVmZmVycy4gKi8KLQlpZiAod2FpdF90Yl9idWZmZXJzX3J1bikgewotCSAgICBwYXRocmVsc2VfYW5kX3Jlc3RvcmUocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT50Yl9wYXRoKSA7Ci0JfSBlbHNlIHsKLQkgICAgcGF0aHJlbHNlIChwX3NfdGItPnRiX3BhdGgpOwotICAgICAgICB9CQotCS8qIGJyZWxzZSBhbGwgcmVzb3VyY2VzIGNvbGxlY3RlZCBmb3IgYmFsYW5jaW5nICovCi0JZm9yICggaSA9IDA7IGkgPCBNQVhfSEVJR0hUOyBpKysgKSB7Ci0JICAgIGlmICh3YWl0X3RiX2J1ZmZlcnNfcnVuKSB7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+TFtpXSk7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+UltpXSk7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkxbaV0pOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZSW2ldKTsKLQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0pOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGUltpXSk7Ci0JICAgIH0KLQotCSAgICBicmVsc2UgKHBfc190Yi0+TFtpXSk7cF9zX3RiLT5MW2ldID0gTlVMTDsKLQkgICAgYnJlbHNlIChwX3NfdGItPlJbaV0pO3Bfc190Yi0+UltpXSA9IE5VTEw7Ci0JICAgIGJyZWxzZSAocF9zX3RiLT5GTFtpXSk7cF9zX3RiLT5GTFtpXSA9IE5VTEw7Ci0JICAgIGJyZWxzZSAocF9zX3RiLT5GUltpXSk7cF9zX3RiLT5GUltpXSA9IE5VTEw7Ci0JICAgIGJyZWxzZSAocF9zX3RiLT5DRkxbaV0pO3Bfc190Yi0+Q0ZMW2ldID0gTlVMTDsKLQkgICAgYnJlbHNlIChwX3NfdGItPkNGUltpXSk7cF9zX3RiLT5DRlJbaV0gPSBOVUxMOworCQl3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMTsKKwkJZ290byByZXBlYXQ7CiAJfQogCi0JaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKLQkgICAgZm9yICggaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkrKyApIHsgCi0JCWlmICggcF9zX3RiLT5GRUJbaV0gKSB7Ci0JCSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCAKLQkJCQkJCSAgICAgcF9zX3RiLT5GRUJbaV0pIDsKKyAgICAgIHJlcGVhdDoKKwkvLyBmaXhfbm9kZXMgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGl0cyBjYWxjdWxhdGlvbiBkdWUgdG8KKwkvLyBmaWxlc3lzdGVtIGdvdCBjaGFuZ2VkIHVuZGVyIHVzLCBsYWNrIG9mIGZyZWUgZGlzayBzcGFjZSBvciBpL28KKwkvLyBmYWlsdXJlLiBJZiB0aGUgZmlyc3QgaXMgdGhlIGNhc2UgLSB0aGUgc2VhcmNoIHdpbGwgYmUKKwkvLyByZXBlYXRlZC4gRm9yIG5vdyAtIGZyZWUgYWxsIHJlc291cmNlcyBhY3F1aXJlZCBzbyBmYXIgZXhjZXB0CisJLy8gZm9yIHRoZSBuZXcgYWxsb2NhdGVkIG5vZGVzCisJeworCQlpbnQgaTsKKworCQkvKiBSZWxlYXNlIHBhdGggYnVmZmVycy4gKi8KKwkJaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKKwkJCXBhdGhyZWxzZV9hbmRfcmVzdG9yZShwX3NfdGItPnRiX3NiLCBwX3NfdGItPnRiX3BhdGgpOworCQl9IGVsc2UgeworCQkJcGF0aHJlbHNlKHBfc190Yi0+dGJfcGF0aCk7CiAJCX0KLQkgICAgfQorCQkvKiBicmVsc2UgYWxsIHJlc291cmNlcyBjb2xsZWN0ZWQgZm9yIGJhbGFuY2luZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hFSUdIVDsgaSsrKSB7CisJCQlpZiAod2FpdF90Yl9idWZmZXJzX3J1bikgeworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPkxbaV0pOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPlJbaV0pOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPkZMW2ldKTsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLAorCQkJCQkJCQkgcF9zX3RiLT5GUltpXSk7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkJIHBfc190Yi0+CisJCQkJCQkJCSBDRkxbaV0pOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPgorCQkJCQkJCQkgQ0ZSW2ldKTsKKwkJCX0KKworCQkJYnJlbHNlKHBfc190Yi0+TFtpXSk7CisJCQlwX3NfdGItPkxbaV0gPSBOVUxMOworCQkJYnJlbHNlKHBfc190Yi0+UltpXSk7CisJCQlwX3NfdGItPlJbaV0gPSBOVUxMOworCQkJYnJlbHNlKHBfc190Yi0+RkxbaV0pOworCQkJcF9zX3RiLT5GTFtpXSA9IE5VTEw7CisJCQlicmVsc2UocF9zX3RiLT5GUltpXSk7CisJCQlwX3NfdGItPkZSW2ldID0gTlVMTDsKKwkJCWJyZWxzZShwX3NfdGItPkNGTFtpXSk7CisJCQlwX3NfdGItPkNGTFtpXSA9IE5VTEw7CisJCQlicmVsc2UocF9zX3RiLT5DRlJbaV0pOworCQkJcF9zX3RiLT5DRlJbaV0gPSBOVUxMOworCQl9CisKKwkJaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkrKykgeworCQkJCWlmIChwX3NfdGItPkZFQltpXSkgeworCQkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcgorCQkJCQkgICAgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkVCW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG5fcmV0X3ZhbHVlOwogCX0KLQlyZXR1cm4gbl9yZXRfdmFsdWU7Ci0gICAgfQogCiB9CiAKLQogLyogQW5hdG9seSB3aWxsIHByb2JhYmx5IGZvcmdpdmUgbWUgcmVuYW1pbmcgcF9zX3RiIHRvIHRiLiBJIGp1c3QKICAgIHdhbnRlZCB0byBtYWtlIGxpbmVzIHNob3J0ZXIgKi8KLXZvaWQgdW5maXhfbm9kZXMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3ZvaWQgdW5maXhfbm9kZXMoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gICAgaW50CWk7CisJaW50IGk7CiAKLSAgICAvKiBSZWxlYXNlIHBhdGggYnVmZmVycy4gKi8KLSAgICBwYXRocmVsc2VfYW5kX3Jlc3RvcmUgKHRiLT50Yl9zYiwgdGItPnRiX3BhdGgpOworCS8qIFJlbGVhc2UgcGF0aCBidWZmZXJzLiAqLworCXBhdGhyZWxzZV9hbmRfcmVzdG9yZSh0Yi0+dGJfc2IsIHRiLT50Yl9wYXRoKTsKIAotICAgIC8qIGJyZWxzZSBhbGwgcmVzb3VyY2VzIGNvbGxlY3RlZCBmb3IgYmFsYW5jaW5nICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBNQVhfSEVJR0hUOyBpKysgKSB7Ci0JcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkxbaV0pOwotCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5SW2ldKTsKLQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAodGItPnRiX3NiLCB0Yi0+RkxbaV0pOwotCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5GUltpXSk7Ci0JcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkNGTFtpXSk7Ci0JcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkNGUltpXSk7CisJLyogYnJlbHNlIGFsbCByZXNvdXJjZXMgY29sbGVjdGVkIGZvciBiYWxhbmNpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hFSUdIVDsgaSsrKSB7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHRiLT50Yl9zYiwgdGItPkxbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcih0Yi0+dGJfc2IsIHRiLT5SW2ldKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIodGItPnRiX3NiLCB0Yi0+RkxbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcih0Yi0+dGJfc2IsIHRiLT5GUltpXSk7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHRiLT50Yl9zYiwgdGItPkNGTFtpXSk7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHRiLT50Yl9zYiwgdGItPkNGUltpXSk7CiAKLQlicmVsc2UgKHRiLT5MW2ldKTsKLQlicmVsc2UgKHRiLT5SW2ldKTsKLQlicmVsc2UgKHRiLT5GTFtpXSk7Ci0JYnJlbHNlICh0Yi0+RlJbaV0pOwotCWJyZWxzZSAodGItPkNGTFtpXSk7Ci0JYnJlbHNlICh0Yi0+Q0ZSW2ldKTsKLSAgICB9Ci0KLSAgICAvKiBkZWFsIHdpdGggbGlzdCBvZiBhbGxvY2F0ZWQgKHVzZWQgYW5kIHVudXNlZCkgbm9kZXMgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9GRUJfU0laRTsgaSsrICkgewotCWlmICggdGItPkZFQltpXSApIHsKLQkgICAgYl9ibG9ja25yX3QgYmxvY2tuciAgPSB0Yi0+RkVCW2ldLT5iX2Jsb2NrbnIgOwotCSAgICAvKiBkZS1hbGxvY2F0ZWQgYmxvY2sgd2hpY2ggd2FzIG5vdCB1c2VkIGJ5IGJhbGFuY2luZyBhbmQKLSAgICAgICAgICAgICAgIGJmb3JnZXQgYWJvdXQgYnVmZmVyIGZvciBpdCAqLwotCSAgICBicmVsc2UgKHRiLT5GRUJbaV0pOwotCSAgICByZWlzZXJmc19mcmVlX2Jsb2NrICh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBOVUxMLCBibG9ja25yLCAwKTsKKwkJYnJlbHNlKHRiLT5MW2ldKTsKKwkJYnJlbHNlKHRiLT5SW2ldKTsKKwkJYnJlbHNlKHRiLT5GTFtpXSk7CisJCWJyZWxzZSh0Yi0+RlJbaV0pOworCQlicmVsc2UodGItPkNGTFtpXSk7CisJCWJyZWxzZSh0Yi0+Q0ZSW2ldKTsKIAl9Ci0JaWYgKHRiLT51c2VkW2ldKSB7Ci0JICAgIC8qIHJlbGVhc2UgdXNlZCBhcyBuZXcgbm9kZXMgaW5jbHVkaW5nIGEgbmV3IHJvb3QgKi8KLQkgICAgYnJlbHNlICh0Yi0+dXNlZFtpXSk7CisKKwkvKiBkZWFsIHdpdGggbGlzdCBvZiBhbGxvY2F0ZWQgKHVzZWQgYW5kIHVudXNlZCkgbm9kZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZFQl9TSVpFOyBpKyspIHsKKwkJaWYgKHRiLT5GRUJbaV0pIHsKKwkJCWJfYmxvY2tucl90IGJsb2NrbnIgPSB0Yi0+RkVCW2ldLT5iX2Jsb2NrbnI7CisJCQkvKiBkZS1hbGxvY2F0ZWQgYmxvY2sgd2hpY2ggd2FzIG5vdCB1c2VkIGJ5IGJhbGFuY2luZyBhbmQKKwkJCSAgIGJmb3JnZXQgYWJvdXQgYnVmZmVyIGZvciBpdCAqLworCQkJYnJlbHNlKHRiLT5GRUJbaV0pOworCQkJcmVpc2VyZnNfZnJlZV9ibG9jayh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBOVUxMLAorCQkJCQkgICAgYmxvY2tuciwgMCk7CisJCX0KKwkJaWYgKHRiLT51c2VkW2ldKSB7CisJCQkvKiByZWxlYXNlIHVzZWQgYXMgbmV3IG5vZGVzIGluY2x1ZGluZyBhIG5ldyByb290ICovCisJCQlicmVsc2UodGItPnVzZWRbaV0pOworCQl9CiAJfQotICAgIH0KIAotICAgIGlmICh0Yi0+dm5fYnVmKSAKLSAgICByZWlzZXJmc19rZnJlZSAodGItPnZuX2J1ZiwgdGItPnZuX2J1Zl9zaXplLCB0Yi0+dGJfc2IpOworCWlmICh0Yi0+dm5fYnVmKQorCQlyZWlzZXJmc19rZnJlZSh0Yi0+dm5fYnVmLCB0Yi0+dm5fYnVmX3NpemUsIHRiLT50Yl9zYik7CiAKLX0gCi0KLQotCit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9oYXNoZXMuYyBiL2ZzL3JlaXNlcmZzL2hhc2hlcy5jCmluZGV4IDA4ZDA1MDguLjM3YzEzMDYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2hhc2hlcy5jCisrKyBiL2ZzL3JlaXNlcmZzL2hhc2hlcy5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogCi0KICNkZWZpbmUgREVMVEEgMHg5RTM3NzlCOQogI2RlZmluZSBGVUxMUk9VTkRTIDEwCQkvKiAzMiBpcyBvdmVya2lsbCwgMTYgaXMgc3Ryb25nIGNyeXB0byAqLwogI2RlZmluZSBQQVJUUk9VTkRTIDYJCS8qIDYgZ2V0cyBjb21wbGV0ZSBtaXhpbmcgKi8KQEAgLTQ4LDEwNSArNDcsNzUgQEAKIAkJaDEgKz0gYjE7CQkJCQkJXAogCX0gd2hpbGUoMCkKIAotCiB1MzIga2V5ZWRfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQogewotCXUzMiBrW10gPSB7IDB4OTQ2NGE0ODUsIDB4NTQyZTFhOTQsIDB4M2U4NDZiZmYsIDB4Yjc1YmNmYzN9OyAKKwl1MzIga1tdID0geyAweDk0NjRhNDg1LCAweDU0MmUxYTk0LCAweDNlODQ2YmZmLCAweGI3NWJjZmMzIH07CiAKIAl1MzIgaDAgPSBrWzBdLCBoMSA9IGtbMV07CiAJdTMyIGEsIGIsIGMsIGQ7CiAJdTMyIHBhZDsKIAlpbnQgaTsKLSAKLQkvLwlhc3NlcnQobGVuID49IDAgJiYgbGVuIDwgMjU2KTsKIAotCXBhZCA9ICh1MzIpbGVuIHwgKCh1MzIpbGVuIDw8IDgpOworCS8vICAgICAgYXNzZXJ0KGxlbiA+PSAwICYmIGxlbiA8IDI1Nik7CisKKwlwYWQgPSAodTMyKSBsZW4gfCAoKHUzMikgbGVuIDw8IDgpOwogCXBhZCB8PSBwYWQgPDwgMTY7CiAKLQl3aGlsZShsZW4gPj0gMTYpCi0JewotCQlhID0gKHUzMiltc2dbIDBdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDFdIDw8IDggfAotCQkgICAgKHUzMiltc2dbIDJdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbIDNdIDw8IDI0OwotCQliID0gKHUzMiltc2dbIDRdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDVdIDw8IDggfAotCQkgICAgKHUzMiltc2dbIDZdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbIDddIDw8IDI0OwotCQljID0gKHUzMiltc2dbIDhdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDldIDw8IDggfAotCQkgICAgKHUzMiltc2dbMTBdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbMTFdIDw8IDI0OwotCQlkID0gKHUzMiltc2dbMTJdICAgICAgfAotCQkgICAgKHUzMiltc2dbMTNdIDw8IDggfAotCQkgICAgKHUzMiltc2dbMTRdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbMTVdIDw8IDI0OwotCQkKKwl3aGlsZSAobGVuID49IDE2KSB7CisJCWEgPSAodTMyKSBtc2dbMF0gfAorCQkgICAgKHUzMikgbXNnWzFdIDw8IDggfCAodTMyKSBtc2dbMl0gPDwgMTYgfCAodTMyKSBtc2dbM10gPDwgMjQ7CisJCWIgPSAodTMyKSBtc2dbNF0gfAorCQkgICAgKHUzMikgbXNnWzVdIDw8IDggfCAodTMyKSBtc2dbNl0gPDwgMTYgfCAodTMyKSBtc2dbN10gPDwgMjQ7CisJCWMgPSAodTMyKSBtc2dbOF0gfAorCQkgICAgKHUzMikgbXNnWzldIDw8IDggfAorCQkgICAgKHUzMikgbXNnWzEwXSA8PCAxNiB8ICh1MzIpIG1zZ1sxMV0gPDwgMjQ7CisJCWQgPSAodTMyKSBtc2dbMTJdIHwKKwkJICAgICh1MzIpIG1zZ1sxM10gPDwgOCB8CisJCSAgICAodTMyKSBtc2dbMTRdIDw8IDE2IHwgKHUzMikgbXNnWzE1XSA8PCAyNDsKKwogCQlURUFDT1JFKFBBUlRST1VORFMpOwogCiAJCWxlbiAtPSAxNjsKIAkJbXNnICs9IDE2OwogCX0KIAotCWlmIChsZW4gPj0gMTIpCi0JewotCQlhID0gKHUzMiltc2dbIDBdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDFdIDw8IDggfAotCQkgICAgKHUzMiltc2dbIDJdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbIDNdIDw8IDI0OwotCQliID0gKHUzMiltc2dbIDRdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDVdIDw8IDggfAotCQkgICAgKHUzMiltc2dbIDZdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbIDddIDw8IDI0OwotCQljID0gKHUzMiltc2dbIDhdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDldIDw8IDggfAotCQkgICAgKHUzMiltc2dbMTBdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbMTFdIDw8IDI0OworCWlmIChsZW4gPj0gMTIpIHsKKwkJYSA9ICh1MzIpIG1zZ1swXSB8CisJCSAgICAodTMyKSBtc2dbMV0gPDwgOCB8ICh1MzIpIG1zZ1syXSA8PCAxNiB8ICh1MzIpIG1zZ1szXSA8PCAyNDsKKwkJYiA9ICh1MzIpIG1zZ1s0XSB8CisJCSAgICAodTMyKSBtc2dbNV0gPDwgOCB8ICh1MzIpIG1zZ1s2XSA8PCAxNiB8ICh1MzIpIG1zZ1s3XSA8PCAyNDsKKwkJYyA9ICh1MzIpIG1zZ1s4XSB8CisJCSAgICAodTMyKSBtc2dbOV0gPDwgOCB8CisJCSAgICAodTMyKSBtc2dbMTBdIDw8IDE2IHwgKHUzMikgbXNnWzExXSA8PCAyNDsKIAogCQlkID0gcGFkOwotCQlmb3IoaSA9IDEyOyBpIDwgbGVuOyBpKyspCi0JCXsKKwkJZm9yIChpID0gMTI7IGkgPCBsZW47IGkrKykgewogCQkJZCA8PD0gODsKIAkJCWQgfD0gbXNnW2ldOwogCQl9Ci0JfQotCWVsc2UgaWYgKGxlbiA+PSA4KQotCXsKLQkJYSA9ICh1MzIpbXNnWyAwXSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyAxXSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyAyXSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyAzXSA8PCAyNDsKLQkJYiA9ICh1MzIpbXNnWyA0XSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyA1XSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyA2XSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyA3XSA8PCAyNDsKKwl9IGVsc2UgaWYgKGxlbiA+PSA4KSB7CisJCWEgPSAodTMyKSBtc2dbMF0gfAorCQkgICAgKHUzMikgbXNnWzFdIDw8IDggfCAodTMyKSBtc2dbMl0gPDwgMTYgfCAodTMyKSBtc2dbM10gPDwgMjQ7CisJCWIgPSAodTMyKSBtc2dbNF0gfAorCQkgICAgKHUzMikgbXNnWzVdIDw8IDggfCAodTMyKSBtc2dbNl0gPDwgMTYgfCAodTMyKSBtc2dbN10gPDwgMjQ7CiAKIAkJYyA9IGQgPSBwYWQ7Ci0JCWZvcihpID0gODsgaSA8IGxlbjsgaSsrKQotCQl7CisJCWZvciAoaSA9IDg7IGkgPCBsZW47IGkrKykgewogCQkJYyA8PD0gODsKIAkJCWMgfD0gbXNnW2ldOwogCQl9Ci0JfQotCWVsc2UgaWYgKGxlbiA+PSA0KQotCXsKLQkJYSA9ICh1MzIpbXNnWyAwXSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyAxXSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyAyXSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyAzXSA8PCAyNDsKKwl9IGVsc2UgaWYgKGxlbiA+PSA0KSB7CisJCWEgPSAodTMyKSBtc2dbMF0gfAorCQkgICAgKHUzMikgbXNnWzFdIDw8IDggfCAodTMyKSBtc2dbMl0gPDwgMTYgfCAodTMyKSBtc2dbM10gPDwgMjQ7CiAKIAkJYiA9IGMgPSBkID0gcGFkOwotCQlmb3IoaSA9IDQ7IGkgPCBsZW47IGkrKykKLQkJeworCQlmb3IgKGkgPSA0OyBpIDwgbGVuOyBpKyspIHsKIAkJCWIgPDw9IDg7CiAJCQliIHw9IG1zZ1tpXTsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCWEgPSBiID0gYyA9IGQgPSBwYWQ7Ci0JCWZvcihpID0gMDsgaSA8IGxlbjsgaSsrKQotCQl7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQkJYSA8PD0gODsKIAkJCWEgfD0gbXNnW2ldOwogCQl9CkBAIC0xNTUsNTUgKzEyNCw1OSBAQAogCVRFQUNPUkUoRlVMTFJPVU5EUyk7CiAKIC8qCXJldHVybiAwOyovCi0JcmV0dXJuIGgwXmgxOworCXJldHVybiBoMCBeIGgxOwogfQogCiAvKiBXaGF0IGZvbGxvd3MgaW4gdGhpcyBmaWxlIGlzIGNvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBhbmQgdGhlCiAgKiBsaWNlbnNpbmcgb2Ygd2hhdCBmb2xsb3dzIGlzIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRSAqLwogCi11MzIgeXVyYV9oYXNoIChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQordTMyIHl1cmFfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQogewotICAgIGludCBqLCBwb3c7Ci0gICAgdTMyIGEsIGM7Ci0gICAgaW50IGk7Ci0gICAgCi0gICAgZm9yIChwb3c9MSxpPTE7IGkgPCBsZW47IGkrKykgcG93ID0gcG93ICogMTA7IAotICAgIAotICAgIGlmIChsZW4gPT0gMSkgCi0JYSA9IG1zZ1swXS00ODsKLSAgICBlbHNlCi0JYSA9IChtc2dbMF0gLSA0OCkgKiBwb3c7Ci0gICAgCi0gICAgZm9yIChpPTE7IGkgPCBsZW47IGkrKykgewotCWMgPSBtc2dbaV0gLSA0ODsgCi0JZm9yIChwb3c9MSxqPWk7IGogPCBsZW4tMTsgaisrKSBwb3cgPSBwb3cgKiAxMDsgCi0JYSA9IGEgKyBjICogcG93OwotICAgIH0KLSAgICAKLSAgICBmb3IgKDsgaSA8IDQwOyBpKyspIHsKLQljID0gJzAnIC0gNDg7IAotCWZvciAocG93PTEsaj1pOyBqIDwgbGVuLTE7IGorKykgcG93ID0gcG93ICogMTA7IAotCWEgPSBhICsgYyAqIHBvdzsKLSAgICB9Ci0gICAgCi0gICAgZm9yICg7IGkgPCAyNTY7IGkrKykgewotCWMgPSBpOyAKLQlmb3IgKHBvdz0xLGo9aTsgaiA8IGxlbi0xOyBqKyspIHBvdyA9IHBvdyAqIDEwOyAKLQlhID0gYSArIGMgKiBwb3c7Ci0gICAgfQotICAgIAotICAgIGEgPSBhIDw8IDc7Ci0gICAgcmV0dXJuIGE7CisJaW50IGosIHBvdzsKKwl1MzIgYSwgYzsKKwlpbnQgaTsKKworCWZvciAocG93ID0gMSwgaSA9IDE7IGkgPCBsZW47IGkrKykKKwkJcG93ID0gcG93ICogMTA7CisKKwlpZiAobGVuID09IDEpCisJCWEgPSBtc2dbMF0gLSA0ODsKKwllbHNlCisJCWEgPSAobXNnWzBdIC0gNDgpICogcG93OworCisJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCWMgPSBtc2dbaV0gLSA0ODsKKwkJZm9yIChwb3cgPSAxLCBqID0gaTsgaiA8IGxlbiAtIDE7IGorKykKKwkJCXBvdyA9IHBvdyAqIDEwOworCQlhID0gYSArIGMgKiBwb3c7CisJfQorCisJZm9yICg7IGkgPCA0MDsgaSsrKSB7CisJCWMgPSAnMCcgLSA0ODsKKwkJZm9yIChwb3cgPSAxLCBqID0gaTsgaiA8IGxlbiAtIDE7IGorKykKKwkJCXBvdyA9IHBvdyAqIDEwOworCQlhID0gYSArIGMgKiBwb3c7CisJfQorCisJZm9yICg7IGkgPCAyNTY7IGkrKykgeworCQljID0gaTsKKwkJZm9yIChwb3cgPSAxLCBqID0gaTsgaiA8IGxlbiAtIDE7IGorKykKKwkJCXBvdyA9IHBvdyAqIDEwOworCQlhID0gYSArIGMgKiBwb3c7CisJfQorCisJYSA9IGEgPDwgNzsKKwlyZXR1cm4gYTsKIH0KIAotdTMyIHI1X2hhc2ggKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pCit1MzIgcjVfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQogewotICB1MzIgYT0wOwotICB3aGlsZSgqbXNnKSB7IAotICAgIGEgKz0gKm1zZyA8PCA0OwotICAgIGEgKz0gKm1zZyA+PiA0OwotICAgIGEgKj0gMTE7Ci0gICAgbXNnKys7Ci0gICB9IAotICByZXR1cm4gYTsKKwl1MzIgYSA9IDA7CisJd2hpbGUgKCptc2cpIHsKKwkJYSArPSAqbXNnIDw8IDQ7CisJCWEgKz0gKm1zZyA+PiA0OworCQlhICo9IDExOworCQltc2crKzsKKwl9CisJcmV0dXJuIGE7CiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pYmFsYW5jZS5jIGIvZnMvcmVpc2VyZnMvaWJhbGFuY2UuYwppbmRleCBhMzYyMTI1Li42YzVhNzI2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pYmFsYW5jZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2liYWxhbmNlLmMKQEAgLTEwLDEzICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIAogLyogdGhpcyBpcyBvbmUgYW5kIG9ubHkgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIG91dHNpZGUgKGRvX2JhbGFuY2UuYykgKi8KLWludAliYWxhbmNlX2ludGVybmFsICgKLQkJCSAgc3RydWN0IHRyZWVfYmFsYW5jZSAqICwKLQkJCSAgaW50LAotCQkJICBpbnQsCi0JCQkgIHN0cnVjdCBpdGVtX2hlYWQgKiAsCi0JCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKiAKLQkJCSAgKTsKK2ludCBiYWxhbmNlX2ludGVybmFsKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiwKKwkJICAgICBpbnQsIGludCwgc3RydWN0IGl0ZW1faGVhZCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOwogCiAvKiBtb2RlcyBvZiBpbnRlcm5hbF9zaGlmdF9sZWZ0LCBpbnRlcm5hbF9zaGlmdF9yaWdodCBhbmQgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAqLwogI2RlZmluZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCAwCkBAIC0yNyw0NjQgKzIyLDQ3NCBAQAogI2RlZmluZSBJTlRFUk5BTF9JTlNFUlRfVE9fTCA1CiAjZGVmaW5lIElOVEVSTkFMX0lOU0VSVF9UT19SIDYKIAotc3RhdGljIHZvaWQJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zICgKLQkJCQkJCWludCBzaGlmdF9tb2RlLAotCQkJCQkJc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJCQkJaW50IGgsCi0JCQkJCQlzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLAotCQkJCQkJc3RydWN0IGJ1ZmZlcl9pbmZvICogc3JjX2JpLAotCQkJCQkJaW50ICogZF9rZXksCi0JCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogY2YKLQkJCQkJCSkKK3N0YXRpYyB2b2lkIGludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyhpbnQgc2hpZnRfbW9kZSwKKwkJCQkJICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJCSAgIGludCBoLAorCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaW5mbyAqc3JjX2JpLAorCQkJCQkgICBpbnQgKmRfa2V5LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipjZikKIHsKLSAgICBtZW1zZXQgKGRlc3RfYmksIDAsIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7Ci0gICAgbWVtc2V0IChzcmNfYmksIDAsIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7Ci0gICAgLyogZGVmaW5lIGRlc3QsIHNyYywgZGVzdCBwYXJlbnQsIGRlc3QgcG9zaXRpb24gKi8KLSAgICBzd2l0Y2ggKHNoaWZ0X21vZGUpIHsKLSAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MOgkvKiB1c2VkIGluIGludGVybmFsX3NoaWZ0X2xlZnQgKi8KLQlzcmNfYmktPnRiID0gdGI7Ci0Jc3JjX2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOwotCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MW2hdOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JKmRfa2V5ID0gdGItPmxrZXlbaF07Ci0JKmNmID0gdGItPkNGTFtoXTsKLQlicmVhazsKLSAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fTF9UT19TOgotCXNyY19iaS0+dGIgPSB0YjsKLQlzcmNfYmktPmJpX2JoID0gdGItPkxbaF07Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07Ci0Jc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsgLyogZGVzdCBwb3NpdGlvbiBpcyBhbmFsb2cgb2YgZGVzdC0+Yl9pdGVtX29yZGVyICovCi0JKmRfa2V5ID0gdGItPmxrZXlbaF07Ci0JKmNmID0gdGItPkNGTFtoXTsKLQlicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU5URVJOQUxfU0hJRlRfRlJPTV9SX1RPX1M6CS8qIHVzZWQgaW4gaW50ZXJuYWxfc2hpZnRfbGVmdCAqLwotCXNyY19iaS0+dGIgPSB0YjsKLQlzcmNfYmktPmJpX2JoID0gdGItPlJbaF07Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07Ci0Jc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JKmRfa2V5ID0gdGItPnJrZXlbaF07Ci0JKmNmID0gdGItPkNGUltoXTsKLQlicmVhazsKKwltZW1zZXQoZGVzdF9iaSwgMCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaW5mbykpOworCW1lbXNldChzcmNfYmksIDAsIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2luZm8pKTsKKwkvKiBkZWZpbmUgZGVzdCwgc3JjLCBkZXN0IHBhcmVudCwgZGVzdCBwb3NpdGlvbiAqLworCXN3aXRjaCAoc2hpZnRfbW9kZSkgeworCWNhc2UgSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0w6CS8qIHVzZWQgaW4gaW50ZXJuYWxfc2hpZnRfbGVmdCAqLworCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gdGItPkxbaF07CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCSpkX2tleSA9IHRiLT5sa2V5W2hdOworCQkqY2YgPSB0Yi0+Q0ZMW2hdOworCQlicmVhazsKKwljYXNlIElOVEVSTkFMX1NISUZUX0ZST01fTF9UT19TOgorCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSB0Yi0+TFtoXTsKKwkJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07CisJCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCk7CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CS8qIGRlc3QgcG9zaXRpb24gaXMgYW5hbG9nIG9mIGRlc3QtPmJfaXRlbV9vcmRlciAqLworCQkqZF9rZXkgPSB0Yi0+bGtleVtoXTsKKwkJKmNmID0gdGItPkNGTFtoXTsKKwkJYnJlYWs7CiAKLSAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SOgotCXNyY19iaS0+dGIgPSB0YjsKLQlzcmNfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKLQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0Jc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPlJbaF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JKmRfa2V5ID0gdGItPnJrZXlbaF07Ci0JKmNmID0gdGItPkNGUltoXTsKLQlicmVhazsKKwljYXNlIElOVEVSTkFMX1NISUZUX0ZST01fUl9UT19TOgkvKiB1c2VkIGluIGludGVybmFsX3NoaWZ0X2xlZnQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gdGItPlJbaF07CisJCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCBoKTsKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKKwkJKmRfa2V5ID0gdGItPnJrZXlbaF07CisJCSpjZiA9IHRiLT5DRlJbaF07CisJCWJyZWFrOwogCi0gICAgY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fTDoKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPkxbaF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMW2hdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKLQlicmVhazsKLQkKLSAgICBjYXNlIElOVEVSTkFMX0lOU0VSVF9UT19TOgotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JYnJlYWs7CisJY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUjoKKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SW2hdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCBoKTsKKwkJKmRfa2V5ID0gdGItPnJrZXlbaF07CisJCSpjZiA9IHRiLT5DRlJbaF07CisJCWJyZWFrOwogCi0gICAgY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fUjoKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPlJbaF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JYnJlYWs7CisJY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fTDoKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFtoXTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMW2hdOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCBoKTsKKwkJYnJlYWs7CiAKLSAgICBkZWZhdWx0OgotCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwgc2hpZnRfbW9kZSk7Ci0gICAgfQorCWNhc2UgSU5URVJOQUxfSU5TRVJUX1RPX1M6CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCk7CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJCWJyZWFrOworCisJY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fUjoKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSB0Yi0+UltoXTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJICAgICAgICJpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwKKwkJCSAgICAgICBzaGlmdF9tb2RlKTsKKwl9CiB9CiAKLQotCiAvKiBJbnNlcnQgY291bnQgbm9kZSBwb2ludGVycyBpbnRvIGJ1ZmZlciBjdXIgYmVmb3JlIHBvc2l0aW9uIHRvICsgMS4KICAqIEluc2VydCBjb3VudCBpdGVtcyBpbnRvIGJ1ZmZlciBjdXIgYmVmb3JlIHBvc2l0aW9uIHRvLgogICogSXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgYXJlIHNwZWNpZmllZCBieSBpbnNlcnRlZCBhbmQgYmggcmVzcGVjdGl2ZWx5LgotICovIAotc3RhdGljIHZvaWQgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogY3VyX2JpLAotCQkJCSAgICBpbnQgdG8sIGludCBjb3VudCwKLQkJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydGVkLAotCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogYmgKLSAgICApCisgKi8KK3N0YXRpYyB2b2lkIGludGVybmFsX2luc2VydF9jaGlsZHMoc3RydWN0IGJ1ZmZlcl9pbmZvICpjdXJfYmksCisJCQkJICAgaW50IHRvLCBpbnQgY291bnQsCisJCQkJICAgc3RydWN0IGl0ZW1faGVhZCAqaW5zZXJ0ZWQsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY3VyID0gY3VyX2JpLT5iaV9iaDsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgaW50IG5yOwotICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBpaDsKLSAgICBzdHJ1Y3QgZGlza19jaGlsZCBuZXdfZGNbMl07Ci0gICAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKLSAgICBpbnQgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmN1ciA9IGN1cl9iaS0+YmlfYmg7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJaW50IG5yOworCXN0cnVjdCByZWlzZXJmc19rZXkgKmloOworCXN0cnVjdCBkaXNrX2NoaWxkIG5ld19kY1syXTsKKwlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CisJaW50IGk7CiAKLSAgICBpZiAoY291bnQgPD0gMCkKLQlyZXR1cm47CisJaWYgKGNvdW50IDw9IDApCisJCXJldHVybjsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGN1cik7Ci0gICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJYmxraCA9IEJfQkxLX0hFQUQoY3VyKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKIAotICAgIFJGQUxTRSggY291bnQgPiAyLAotCSAgICAidG9vIG1hbnkgY2hpbGRyZW4gKCVkKSBhcmUgdG8gYmUgaW5zZXJ0ZWQiLCBjb3VudCk7Ci0gICAgUkZBTFNFKCBCX0ZSRUVfU1BBQ0UgKGN1cikgPCBjb3VudCAqIChLRVlfU0laRSArIERDX1NJWkUpLAotCSAgICAibm8gZW5vdWdoIGZyZWUgc3BhY2UgKCVkKSwgbmVlZGVkICVkIGJ5dGVzIiwgCi0JICAgIEJfRlJFRV9TUEFDRSAoY3VyKSwgY291bnQgKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSk7CisJUkZBTFNFKGNvdW50ID4gMiwgInRvbyBtYW55IGNoaWxkcmVuICglZCkgYXJlIHRvIGJlIGluc2VydGVkIiwgY291bnQpOworCVJGQUxTRShCX0ZSRUVfU1BBQ0UoY3VyKSA8IGNvdW50ICogKEtFWV9TSVpFICsgRENfU0laRSksCisJICAgICAgICJubyBlbm91Z2ggZnJlZSBzcGFjZSAoJWQpLCBuZWVkZWQgJWQgYnl0ZXMiLAorCSAgICAgICBCX0ZSRUVfU1BBQ0UoY3VyKSwgY291bnQgKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBjb3VudCBkaXNrX2NoaWxkICovCi0gICAgZGMgPSBCX05fQ0hJTEQoY3VyLHRvKzEpOworCS8qIHByZXBhcmUgc3BhY2UgZm9yIGNvdW50IGRpc2tfY2hpbGQgKi8KKwlkYyA9IEJfTl9DSElMRChjdXIsIHRvICsgMSk7CiAKLSAgICBtZW1tb3ZlIChkYyArIGNvdW50LCBkYywgKG5yKzEtKHRvKzEpKSAqIERDX1NJWkUpOworCW1lbW1vdmUoZGMgKyBjb3VudCwgZGMsIChuciArIDEgLSAodG8gKyAxKSkgKiBEQ19TSVpFKTsKIAotICAgIC8qIGNvcHkgdG9fYmVfaW5zZXJ0IGRpc2sgY2hpbGRyZW4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLQlwdXRfZGNfc2l6ZSggJihuZXdfZGNbaV0pLCBNQVhfQ0hJTERfU0laRShiaFtpXSkgLSBCX0ZSRUVfU1BBQ0UoYmhbaV0pKTsKLQlwdXRfZGNfYmxvY2tfbnVtYmVyKCAmKG5ld19kY1tpXSksIGJoW2ldLT5iX2Jsb2NrbnIgKTsKLSAgICB9Ci0gICAgbWVtY3B5IChkYywgbmV3X2RjLCBEQ19TSVpFICogY291bnQpOworCS8qIGNvcHkgdG9fYmVfaW5zZXJ0IGRpc2sgY2hpbGRyZW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwdXRfZGNfc2l6ZSgmKG5ld19kY1tpXSksCisJCQkgICAgTUFYX0NISUxEX1NJWkUoYmhbaV0pIC0gQl9GUkVFX1NQQUNFKGJoW2ldKSk7CisJCXB1dF9kY19ibG9ja19udW1iZXIoJihuZXdfZGNbaV0pLCBiaFtpXS0+Yl9ibG9ja25yKTsKKwl9CisJbWVtY3B5KGRjLCBuZXdfZGMsIERDX1NJWkUgKiBjb3VudCk7CiAKLSAgCi0gICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY291bnQgaXRlbXMgICovCi0gICAgaWggPSBCX05fUERFTElNX0tFWSAoY3VyLCAoKHRvID09IC0xKSA/IDAgOiB0bykpOworCS8qIHByZXBhcmUgc3BhY2UgZm9yIGNvdW50IGl0ZW1zICAqLworCWloID0gQl9OX1BERUxJTV9LRVkoY3VyLCAoKHRvID09IC0xKSA/IDAgOiB0bykpOwogCi0gICAgbWVtbW92ZSAoaWggKyBjb3VudCwgaWgsIChuciAtIHRvKSAqIEtFWV9TSVpFICsgKG5yICsgMSArIGNvdW50KSAqIERDX1NJWkUpOworCW1lbW1vdmUoaWggKyBjb3VudCwgaWgsCisJCShuciAtIHRvKSAqIEtFWV9TSVpFICsgKG5yICsgMSArIGNvdW50KSAqIERDX1NJWkUpOwogCi0gICAgLyogY29weSBpdGVtIGhlYWRlcnMgKGtleXMpICovCi0gICAgbWVtY3B5IChpaCwgaW5zZXJ0ZWQsIEtFWV9TSVpFKTsKLSAgICBpZiAoIGNvdW50ID4gMSApCi0JbWVtY3B5IChpaCArIDEsIGluc2VydGVkICsgMSwgS0VZX1NJWkUpOworCS8qIGNvcHkgaXRlbSBoZWFkZXJzIChrZXlzKSAqLworCW1lbWNweShpaCwgaW5zZXJ0ZWQsIEtFWV9TSVpFKTsKKwlpZiAoY291bnQgPiAxKQorCQltZW1jcHkoaWggKyAxLCBpbnNlcnRlZCArIDEsIEtFWV9TSVpFKTsKIAotICAgIC8qIHNpemVzLCBpdGVtIG51bWJlciAqLwotICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIGNvdW50ICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSAtIGNvdW50ICogKERDX1NJWkUgKyBLRVlfU0laRSApICk7CisJLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyBjb3VudCk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLAorCQkJICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSAtIGNvdW50ICogKERDX1NJWkUgKworCQkJCQkJCSAgICAgS0VZX1NJWkUpKTsKIAotICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoY3VyX2JpLT50YiwgY3VyLDApOworCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShjdXJfYmktPnRiLCBjdXIsIDApOwogCi0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotICAgIGNoZWNrX2ludGVybmFsIChjdXIpOwotICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKwkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCWNoZWNrX2ludGVybmFsKGN1cik7CisJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KIAotICAgIGlmIChjdXJfYmktPmJpX3BhcmVudCkgewotCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0gQl9OX0NISUxEIChjdXJfYmktPmJpX3BhcmVudCxjdXJfYmktPmJpX3Bvc2l0aW9uKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChjb3VudCAqIChEQ19TSVpFICsgS0VZX1NJWkUpKSk7Ci0JZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGN1cl9iaS0+dGIsIGN1cl9iaS0+YmlfcGFyZW50LCAwKTsKKwlpZiAoY3VyX2JpLT5iaV9wYXJlbnQpIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPQorCQkgICAgQl9OX0NISUxEKGN1cl9iaS0+YmlfcGFyZW50LCBjdXJfYmktPmJpX3Bvc2l0aW9uKTsKKwkJcHV0X2RjX3NpemUodF9kYywKKwkJCSAgICBkY19zaXplKHRfZGMpICsgKGNvdW50ICogKERDX1NJWkUgKyBLRVlfU0laRSkpKTsKKwkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGN1cl9iaS0+dGIsIGN1cl9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CiAKLQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0JY2hlY2tfaW50ZXJuYWwgKGN1cl9iaS0+YmlfcGFyZW50KTsKLQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovICAgCi0gICAgfQorCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCQljaGVja19pbnRlcm5hbChjdXJfYmktPmJpX3BhcmVudCk7CisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJfQogCiB9CiAKLQogLyogRGVsZXRlIGRlbF9udW0gaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgY3VyIHN0YXJ0aW5nIGZyb20gKgogICogdGhlIGZpcnN0X2kndGggaXRlbSBhbmQgZmlyc3RfcCd0aCBwb2ludGVycyByZXNwZWN0aXZlbHkuCQkqLwotc3RhdGljIHZvaWQJaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zICgKLQkJCQkJCXN0cnVjdCBidWZmZXJfaW5mbyAqIGN1cl9iaSwKLQkJCQkJCWludCBmaXJzdF9wLCAKLQkJCQkJCWludCBmaXJzdF9pLCAKLQkJCQkJCWludCBkZWxfbnVtCi0JCQkJCQkpCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMoc3RydWN0IGJ1ZmZlcl9pbmZvICpjdXJfYmksCisJCQkJCSAgIGludCBmaXJzdF9wLAorCQkJCQkgICBpbnQgZmlyc3RfaSwgaW50IGRlbF9udW0pCiB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIGN1ciA9IGN1cl9iaS0+YmlfYmg7Ci0gIGludCBucjsKLSAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OwotICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqY3VyID0gY3VyX2JpLT5iaV9iaDsKKwlpbnQgbnI7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5OworCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKIAotICBSRkFMU0UoIGN1ciA9PSBOVUxMLCAiYnVmZmVyIGlzIDAiKTsKLSAgUkZBTFNFKCBkZWxfbnVtIDwgMCwKLSAgICAgICAgICAibmVnYXRpdmUgbnVtYmVyIG9mIGl0ZW1zICglZCkgY2FuIG5vdCBiZSBkZWxldGVkIiwgZGVsX251bSk7Ci0gIFJGQUxTRSggZmlyc3RfcCA8IDAgfHwgZmlyc3RfcCArIGRlbF9udW0gPiBCX05SX0lURU1TIChjdXIpICsgMSB8fCBmaXJzdF9pIDwgMCwKLSAgICAgICAgICAiZmlyc3QgcG9pbnRlciBvcmRlciAoJWQpIDwgMCBvciAiCi0gICAgICAgICAgIm5vIHNvIG1hbnkgcG9pbnRlcnMgKCVkKSwgb25seSAoJWQpIG9yICIKLSAgICAgICAgICAiZmlyc3Qga2V5IG9yZGVyICVkIDwgMCIsIGZpcnN0X3AsIAotICAgICAgICAgIGZpcnN0X3AgKyBkZWxfbnVtLCBCX05SX0lURU1TIChjdXIpICsgMSwgZmlyc3RfaSk7Ci0gIGlmICggZGVsX251bSA9PSAwICkKLSAgICByZXR1cm47CisJUkZBTFNFKGN1ciA9PSBOVUxMLCAiYnVmZmVyIGlzIDAiKTsKKwlSRkFMU0UoZGVsX251bSA8IDAsCisJICAgICAgICJuZWdhdGl2ZSBudW1iZXIgb2YgaXRlbXMgKCVkKSBjYW4gbm90IGJlIGRlbGV0ZWQiLCBkZWxfbnVtKTsKKwlSRkFMU0UoZmlyc3RfcCA8IDAgfHwgZmlyc3RfcCArIGRlbF9udW0gPiBCX05SX0lURU1TKGN1cikgKyAxCisJICAgICAgIHx8IGZpcnN0X2kgPCAwLAorCSAgICAgICAiZmlyc3QgcG9pbnRlciBvcmRlciAoJWQpIDwgMCBvciAiCisJICAgICAgICJubyBzbyBtYW55IHBvaW50ZXJzICglZCksIG9ubHkgKCVkKSBvciAiCisJICAgICAgICJmaXJzdCBrZXkgb3JkZXIgJWQgPCAwIiwgZmlyc3RfcCwgZmlyc3RfcCArIGRlbF9udW0sCisJICAgICAgIEJfTlJfSVRFTVMoY3VyKSArIDEsIGZpcnN0X2kpOworCWlmIChkZWxfbnVtID09IDApCisJCXJldHVybjsKIAotICBibGtoID0gQl9CTEtfSEVBRChjdXIpOwotICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlibGtoID0gQl9CTEtfSEVBRChjdXIpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOwogCi0gIGlmICggZmlyc3RfcCA9PSAwICYmIGRlbF9udW0gPT0gbnIgKyAxICkgewotICAgIFJGQUxTRSggZmlyc3RfaSAhPSAwLCAiMXN0IGRlbGV0ZWQga2V5IG11c3QgaGF2ZSBvcmRlciAwLCBub3QgJWQiLCBmaXJzdF9pKTsKLSAgICBtYWtlX2VtcHR5X25vZGUgKGN1cl9iaSk7Ci0gICAgcmV0dXJuOwotICB9CisJaWYgKGZpcnN0X3AgPT0gMCAmJiBkZWxfbnVtID09IG5yICsgMSkgeworCQlSRkFMU0UoZmlyc3RfaSAhPSAwLAorCQkgICAgICAgIjFzdCBkZWxldGVkIGtleSBtdXN0IGhhdmUgb3JkZXIgMCwgbm90ICVkIiwgZmlyc3RfaSk7CisJCW1ha2VfZW1wdHlfbm9kZShjdXJfYmkpOworCQlyZXR1cm47CisJfQogCi0gIFJGQUxTRSggZmlyc3RfaSArIGRlbF9udW0gPiBCX05SX0lURU1TIChjdXIpLAotICAgICAgICAgICJmaXJzdF9pID0gJWQgZGVsX251bSA9ICVkICIKLSAgICAgICAgICAibm8gc28gbWFueSBrZXlzICglZCkgaW4gdGhlIG5vZGUgKCViKSgleikiLAotICAgICAgICAgIGZpcnN0X2ksIGRlbF9udW0sIGZpcnN0X2kgKyBkZWxfbnVtLCBjdXIsIGN1cik7CisJUkZBTFNFKGZpcnN0X2kgKyBkZWxfbnVtID4gQl9OUl9JVEVNUyhjdXIpLAorCSAgICAgICAiZmlyc3RfaSA9ICVkIGRlbF9udW0gPSAlZCAiCisJICAgICAgICJubyBzbyBtYW55IGtleXMgKCVkKSBpbiB0aGUgbm9kZSAoJWIpKCV6KSIsCisJICAgICAgIGZpcnN0X2ksIGRlbF9udW0sIGZpcnN0X2kgKyBkZWxfbnVtLCBjdXIsIGN1cik7CiAKKwkvKiBkZWxldGluZyAqLworCWRjID0gQl9OX0NISUxEKGN1ciwgZmlyc3RfcCk7CiAKLSAgLyogZGVsZXRpbmcgKi8KLSAgZGMgPSBCX05fQ0hJTEQgKGN1ciwgZmlyc3RfcCk7CisJbWVtbW92ZShkYywgZGMgKyBkZWxfbnVtLCAobnIgKyAxIC0gZmlyc3RfcCAtIGRlbF9udW0pICogRENfU0laRSk7CisJa2V5ID0gQl9OX1BERUxJTV9LRVkoY3VyLCBmaXJzdF9pKTsKKwltZW1tb3ZlKGtleSwga2V5ICsgZGVsX251bSwKKwkJKG5yIC0gZmlyc3RfaSAtIGRlbF9udW0pICogS0VZX1NJWkUgKyAobnIgKyAxIC0KKwkJCQkJCSAgICAgICBkZWxfbnVtKSAqIERDX1NJWkUpOwogCi0gIG1lbW1vdmUgKGRjLCBkYyArIGRlbF9udW0sIChuciArIDEgLSBmaXJzdF9wIC0gZGVsX251bSkgKiBEQ19TSVpFKTsKLSAga2V5ID0gQl9OX1BERUxJTV9LRVkgKGN1ciwgZmlyc3RfaSk7Ci0gIG1lbW1vdmUgKGtleSwga2V5ICsgZGVsX251bSwgKG5yIC0gZmlyc3RfaSAtIGRlbF9udW0pICogS0VZX1NJWkUgKyAobnIgKyAxIC0gZGVsX251bSkgKiBEQ19TSVpFKTsKKwkvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KKwlzZXRfYmxraF9ucl9pdGVtKGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSAtIGRlbF9udW0pOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwKKwkJCSAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKworCQkJICAgIChkZWxfbnVtICogKEtFWV9TSVpFICsgRENfU0laRSkpKTsKIAorCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShjdXJfYmktPnRiLCBjdXIsIDApOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KKwljaGVja19pbnRlcm5hbChjdXIpOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KIAotICAvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KLSAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpIC0gZGVsX251bSApOwotICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLAotICAgICAgICAgICAgICAgICAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKyAoZGVsX251bSAqIChLRVlfU0laRSArIERDX1NJWkUpICkgKTsKKwlpZiAoY3VyX2JpLT5iaV9wYXJlbnQpIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7CisJCXRfZGMgPSBCX05fQ0hJTEQoY3VyX2JpLT5iaV9wYXJlbnQsIGN1cl9iaS0+YmlfcG9zaXRpb24pOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgLSAoZGVsX251bSAqIChLRVlfU0laRSArIERDX1NJWkUpKSk7CiAKLSAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChjdXJfYmktPnRiLCBjdXIsIDApOwotICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLSAgY2hlY2tfaW50ZXJuYWwgKGN1cik7Ci0gIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotIAotICBpZiAoY3VyX2JpLT5iaV9wYXJlbnQpIHsKLSAgICBzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKLSAgICB0X2RjID0gQl9OX0NISUxEIChjdXJfYmktPmJpX3BhcmVudCwgY3VyX2JpLT5iaV9wb3NpdGlvbik7Ci0gICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLSAoZGVsX251bSAqIChLRVlfU0laRSArIERDX1NJWkUpICkgKTsKLQotICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoY3VyX2JpLT50YiwgY3VyX2JpLT5iaV9wYXJlbnQsMCk7Ci0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotICAgIGNoZWNrX2ludGVybmFsIChjdXJfYmktPmJpX3BhcmVudCk7Ci0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLyAgIAotICB9CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShjdXJfYmktPnRiLCBjdXJfYmktPmJpX3BhcmVudCwKKwkJCQkJICAgICAgIDApOworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCQljaGVja19pbnRlcm5hbChjdXJfYmktPmJpX3BhcmVudCk7CisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJfQogfQogCi0KIC8qIGRlbGV0ZSBuIG5vZGUgcG9pbnRlcnMgYW5kIGl0ZW1zIHN0YXJ0aW5nIGZyb20gZ2l2ZW4gcG9zaXRpb24gKi8KLXN0YXRpYyB2b2lkICBpbnRlcm5hbF9kZWxldGVfY2hpbGRzIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksIAotCQkJCSAgICAgaW50IGZyb20sIGludCBuKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfZGVsZXRlX2NoaWxkcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmN1cl9iaSwgaW50IGZyb20sIGludCBuKQogewotICBpbnQgaV9mcm9tOworCWludCBpX2Zyb207CiAKLSAgaV9mcm9tID0gKGZyb20gPT0gMCkgPyBmcm9tIDogZnJvbSAtIDE7CisJaV9mcm9tID0gKGZyb20gPT0gMCkgPyBmcm9tIDogZnJvbSAtIDE7CiAKLSAgLyogZGVsZXRlIG4gcG9pbnRlcnMgc3RhcnRpbmcgZnJvbSBgZnJvbScgcG9zaXRpb24gaW4gQ1VSOwotICAgICBkZWxldGUgbiBrZXlzIHN0YXJ0aW5nIGZyb20gJ2lfZnJvbScgcG9zaXRpb24gaW4gQ1VSOwotICAgICAqLwotICBpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMgKGN1cl9iaSwgZnJvbSwgaV9mcm9tLCBuKTsKKwkvKiBkZWxldGUgbiBwb2ludGVycyBzdGFydGluZyBmcm9tIGBmcm9tJyBwb3NpdGlvbiBpbiBDVVI7CisJICAgZGVsZXRlIG4ga2V5cyBzdGFydGluZyBmcm9tICdpX2Zyb20nIHBvc2l0aW9uIGluIENVUjsKKwkgKi8KKwlpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMoY3VyX2JpLCBmcm9tLCBpX2Zyb20sIG4pOwogfQogCi0KIC8qIGNvcHkgY3B5X251bSBub2RlIHBvaW50ZXJzIGFuZCBjcHlfbnVtIC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QKICogbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgZmlyc3QgaXRlbXMgZnJvbSBzcmMgdG8gdGFpbCBvZiBkZXN0CiAgKiBsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgbWVhbnMsIHRoYXQgd2UgY29weSBsYXN0IGl0ZW1zIGZyb20gc3JjIHRvIGhlYWQgb2YgZGVzdCAKICAqLwotc3RhdGljIHZvaWQgaW50ZXJuYWxfY29weV9wb2ludGVyc19pdGVtcyAoCi0JCQkJCSAgc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwKLQkJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsCi0JCQkJCSAgaW50IGxhc3RfZmlyc3QsIGludCBjcHlfbnVtCi0JCQkJCSAgKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfY29weV9wb2ludGVyc19pdGVtcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNyYywKKwkJCQkJIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSkKIHsKLSAgLyogQVRURU5USU9OISBOdW1iZXIgb2Ygbm9kZSBwb2ludGVycyBpbiBERVNUIGlzIGVxdWFsIHRvIG51bWJlciBvZiBpdGVtcyBpbiBERVNUICoKLSAgICogYXMgZGVsaW1pdGluZyBrZXkgaGF2ZSBhbHJlYWR5IGluc2VydGVkIHRvIGJ1ZmZlciBkZXN0LiovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKLSAgaW50IG5yX2Rlc3QsIG5yX3NyYzsKLSAgaW50IGRlc3Rfb3JkZXIsIHNyY19vcmRlcjsKLSAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OwotICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCS8qIEFUVEVOVElPTiEgTnVtYmVyIG9mIG5vZGUgcG9pbnRlcnMgaW4gREVTVCBpcyBlcXVhbCB0byBudW1iZXIgb2YgaXRlbXMgaW4gREVTVCAqCisJICogYXMgZGVsaW1pdGluZyBrZXkgaGF2ZSBhbHJlYWR5IGluc2VydGVkIHRvIGJ1ZmZlciBkZXN0LiovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisJaW50IG5yX2Rlc3QsIG5yX3NyYzsKKwlpbnQgZGVzdF9vcmRlciwgc3JjX29yZGVyOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCByZWlzZXJmc19rZXkgKmtleTsKKwlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CiAKLSAgbnJfc3JjID0gQl9OUl9JVEVNUyAoc3JjKTsKKwlucl9zcmMgPSBCX05SX0lURU1TKHNyYyk7CiAKLSAgUkZBTFNFKCBkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsIAotCSAgInNyYyAoJXApIG9yIGRlc3QgKCVwKSBidWZmZXIgaXMgMCIsIHNyYywgZGVzdCk7Ci0gIFJGQUxTRSggbGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNUICYmIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCwKLQkgICJpbnZhbGlkIGxhc3RfZmlyc3QgcGFyYW1ldGVyICglZCkiLCBsYXN0X2ZpcnN0KTsKLSAgUkZBTFNFKCBucl9zcmMgPCBjcHlfbnVtIC0gMSwgCi0JICAibm8gc28gbWFueSBpdGVtcyAoJWQpIGluIHNyYyAoJWQpIiwgY3B5X251bSwgbnJfc3JjKTsKLSAgUkZBTFNFKCBjcHlfbnVtIDwgMCwgImNweV9udW0gbGVzcyB0aGFuIDAgKCVkKSIsIGNweV9udW0pOwotICBSRkFMU0UoIGNweV9udW0gLSAxICsgQl9OUl9JVEVNUyhkZXN0KSA+IChpbnQpTUFYX05SX0tFWShkZXN0KSwKLQkgICJjcHlfbnVtICglZCkgKyBpdGVtIG51bWJlciBpbiBkZXN0ICglZCkgY2FuIG5vdCBiZSA+IE1BWF9OUl9LRVkoJWQpIiwKLQkgIGNweV9udW0sIEJfTlJfSVRFTVMoZGVzdCksIE1BWF9OUl9LRVkoZGVzdCkpOworCVJGQUxTRShkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCisJICAgICAgICJzcmMgKCVwKSBvciBkZXN0ICglcCkgYnVmZmVyIGlzIDAiLCBzcmMsIGRlc3QpOworCVJGQUxTRShsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QgJiYgbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNULAorCSAgICAgICAiaW52YWxpZCBsYXN0X2ZpcnN0IHBhcmFtZXRlciAoJWQpIiwgbGFzdF9maXJzdCk7CisJUkZBTFNFKG5yX3NyYyA8IGNweV9udW0gLSAxLAorCSAgICAgICAibm8gc28gbWFueSBpdGVtcyAoJWQpIGluIHNyYyAoJWQpIiwgY3B5X251bSwgbnJfc3JjKTsKKwlSRkFMU0UoY3B5X251bSA8IDAsICJjcHlfbnVtIGxlc3MgdGhhbiAwICglZCkiLCBjcHlfbnVtKTsKKwlSRkFMU0UoY3B5X251bSAtIDEgKyBCX05SX0lURU1TKGRlc3QpID4gKGludClNQVhfTlJfS0VZKGRlc3QpLAorCSAgICAgICAiY3B5X251bSAoJWQpICsgaXRlbSBudW1iZXIgaW4gZGVzdCAoJWQpIGNhbiBub3QgYmUgPiBNQVhfTlJfS0VZKCVkKSIsCisJICAgICAgIGNweV9udW0sIEJfTlJfSVRFTVMoZGVzdCksIE1BWF9OUl9LRVkoZGVzdCkpOwogCi0gIGlmICggY3B5X251bSA9PSAwICkKLSAgICByZXR1cm47CisJaWYgKGNweV9udW0gPT0gMCkKKwkJcmV0dXJuOwogCiAJLyogY29waW5nICovCi0gIGJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOwotICBucl9kZXN0ID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworCW5yX2Rlc3QgPSBibGtoX25yX2l0ZW0oYmxraCk7CiAKLSAgLypkZXN0X29yZGVyID0gKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAwIDogbnJfZGVzdDsqLwotICAvKnNyY19vcmRlciA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gKG5yX3NyYyAtIGNweV9udW0gKyAxKSA6IDA7Ki8KLSAgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPwkoZGVzdF9vcmRlciA9IDAsIHNyY19vcmRlciA9IG5yX3NyYyAtIGNweV9udW0gKyAxKSA6Ci0gICAgKGRlc3Rfb3JkZXIgPSBucl9kZXN0LCBzcmNfb3JkZXIgPSAwKTsKKwkvKmRlc3Rfb3JkZXIgPSAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSA/IDAgOiBucl9kZXN0OyAqLworCS8qc3JjX29yZGVyID0gKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAobnJfc3JjIC0gY3B5X251bSArIDEpIDogMDsgKi8KKwkobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSA/IChkZXN0X29yZGVyID0gMCwgc3JjX29yZGVyID0KKwkJCQkJIG5yX3NyYyAtIGNweV9udW0gKyAxKSA6IChkZXN0X29yZGVyID0KKwkJCQkJCQkJICBucl9kZXN0LAorCQkJCQkJCQkgIHNyY19vcmRlciA9CisJCQkJCQkJCSAgMCk7CiAKLSAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSBwb2ludGVycyAqLwotICBkYyA9IEJfTl9DSElMRCAoZGVzdCwgZGVzdF9vcmRlcik7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSBwb2ludGVycyAqLworCWRjID0gQl9OX0NISUxEKGRlc3QsIGRlc3Rfb3JkZXIpOwogCi0gIG1lbW1vdmUgKGRjICsgY3B5X251bSwgZGMsIChucl9kZXN0IC0gZGVzdF9vcmRlcikgKiBEQ19TSVpFKTsKKwltZW1tb3ZlKGRjICsgY3B5X251bSwgZGMsIChucl9kZXN0IC0gZGVzdF9vcmRlcikgKiBEQ19TSVpFKTsKIAogCS8qIGluc2VydCBwb2ludGVycyAqLwotICBtZW1jcHkgKGRjLCBCX05fQ0hJTEQgKHNyYywgc3JjX29yZGVyKSwgRENfU0laRSAqIGNweV9udW0pOworCW1lbWNweShkYywgQl9OX0NISUxEKHNyYywgc3JjX29yZGVyKSwgRENfU0laRSAqIGNweV9udW0pOwogCisJLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSAtIDEgaXRlbSBoZWFkZXJzICovCisJa2V5ID0gQl9OX1BERUxJTV9LRVkoZGVzdCwgZGVzdF9vcmRlcik7CisJbWVtbW92ZShrZXkgKyBjcHlfbnVtIC0gMSwga2V5LAorCQlLRVlfU0laRSAqIChucl9kZXN0IC0gZGVzdF9vcmRlcikgKyBEQ19TSVpFICogKG5yX2Rlc3QgKworCQkJCQkJCSAgICAgICBjcHlfbnVtKSk7CiAKLSAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSAtIDEgaXRlbSBoZWFkZXJzICovCi0gIGtleSA9IEJfTl9QREVMSU1fS0VZKGRlc3QsIGRlc3Rfb3JkZXIpOwotICBtZW1tb3ZlIChrZXkgKyBjcHlfbnVtIC0gMSwga2V5LAotCSAgIEtFWV9TSVpFICogKG5yX2Rlc3QgLSBkZXN0X29yZGVyKSArIERDX1NJWkUgKiAobnJfZGVzdCArIGNweV9udW0pKTsKKwkvKiBpbnNlcnQgaGVhZGVycyAqLworCW1lbWNweShrZXksIEJfTl9QREVMSU1fS0VZKHNyYywgc3JjX29yZGVyKSwgS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpKTsKIAorCS8qIHNpemVzLCBpdGVtIG51bWJlciAqLworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpICsgKGNweV9udW0gLSAxKSk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLAorCQkJICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSAtIChLRVlfU0laRSAqIChjcHlfbnVtIC0gMSkgKworCQkJCQkJICAgICBEQ19TSVpFICogY3B5X251bSkpOwogCi0gIC8qIGluc2VydCBoZWFkZXJzICovCi0gIG1lbWNweSAoa2V5LCBCX05fUERFTElNX0tFWSAoc3JjLCBzcmNfb3JkZXIpLCBLRVlfU0laRSAqIChjcHlfbnVtIC0gMSkpOworCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdCwgMCk7CiAKLSAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCi0gIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIChjcHlfbnVtIC0gMSApICk7Ci0gIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsCi0gICAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSAoS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpICsgRENfU0laRSAqIGNweV9udW0gKSApOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJY2hlY2tfaW50ZXJuYWwoZGVzdCk7CisJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KIAotICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGRlc3RfYmktPnRiLCBkZXN0LCAwKTsKKwlpZiAoZGVzdF9iaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGRlc3RfYmktPmJpX3BhcmVudCwgZGVzdF9iaS0+YmlfcG9zaXRpb24pOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgKyAoS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpICsKKwkJCQkJICAgICBEQ19TSVpFICogY3B5X251bSkpOwogCi0gIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLSAgY2hlY2tfaW50ZXJuYWwgKGRlc3QpOwotICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0KLSAgaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgewotICAgIHN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOwotICAgIHRfZGMgPSBCX05fQ0hJTEQoZGVzdF9iaS0+YmlfcGFyZW50LGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKLSAgICBwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChLRVlfU0laRSAqIChjcHlfbnVtIC0gMSkgKyBEQ19TSVpFICogY3B5X251bSkgKTsKLQotICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwwKTsKLSAgICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0gICAgY2hlY2tfaW50ZXJuYWwgKGRlc3RfYmktPmJpX3BhcmVudCk7Ci0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLyAgIAotICB9CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJCWNoZWNrX2ludGVybmFsKGRlc3RfYmktPmJpX3BhcmVudCk7CisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJfQogCiB9CiAKLQogLyogQ29weSBjcHlfbnVtIG5vZGUgcG9pbnRlcnMgYW5kIGNweV9udW0gLSAxIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdC4KICAqIERlbGV0ZSBjcHlfbnVtIC0gZGVsX3BhciBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBzcmMuCiAgKiBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgbWVhbnMsIHRoYXQgd2UgY29weS9kZWxldGUgZmlyc3QgaXRlbXMgZnJvbSBzcmMuCiAgKiBsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgbWVhbnMsIHRoYXQgd2UgY29weS9kZWxldGUgbGFzdCBpdGVtcyBmcm9tIHNyYy4KICAqLwotc3RhdGljIHZvaWQgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwgCi0JCQkJCSAgc3RydWN0IGJ1ZmZlcl9pbmZvICogc3JjX2JpLCAKLQkJCQkJICBpbnQgbGFzdF9maXJzdCwgaW50IGNweV9udW0sIGludCBkZWxfcGFyKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2luZm8gKnNyY19iaSwKKwkJCQkJIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwKKwkJCQkJIGludCBkZWxfcGFyKQogewotICAgIGludCBmaXJzdF9wb2ludGVyOwotICAgIGludCBmaXJzdF9pdGVtOwotICAgIAotICAgIGludGVybmFsX2NvcHlfcG9pbnRlcnNfaXRlbXMgKGRlc3RfYmksIHNyY19iaS0+YmlfYmgsIGxhc3RfZmlyc3QsIGNweV9udW0pOworCWludCBmaXJzdF9wb2ludGVyOworCWludCBmaXJzdF9pdGVtOwogCi0gICAgaWYgKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgewkvKiBzaGlmdF9sZWZ0IG9jY3VycyAqLwotCWZpcnN0X3BvaW50ZXIgPSAwOwotCWZpcnN0X2l0ZW0gPSAwOwotCS8qIGRlbGV0ZSBjcHlfbnVtIC0gZGVsX3BhciBwb2ludGVycyBhbmQga2V5cyBzdGFydGluZyBmb3IgcG9pbnRlcnMgd2l0aCBmaXJzdF9wb2ludGVyLCAKLQkgICBmb3Iga2V5IC0gd2l0aCBmaXJzdF9pdGVtICovCi0JaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zIChzcmNfYmksIGZpcnN0X3BvaW50ZXIsIGZpcnN0X2l0ZW0sIGNweV9udW0gLSBkZWxfcGFyKTsKLSAgICB9IGVsc2UgewkJCS8qIHNoaWZ0X3JpZ2h0IG9jY3VycyAqLwotCWludCBpLCBqOworCWludGVybmFsX2NvcHlfcG9pbnRlcnNfaXRlbXMoZGVzdF9iaSwgc3JjX2JpLT5iaV9iaCwgbGFzdF9maXJzdCwKKwkJCQkgICAgIGNweV9udW0pOwogCi0JaSA9ICggY3B5X251bSAtIGRlbF9wYXIgPT0gKCBqID0gQl9OUl9JVEVNUyhzcmNfYmktPmJpX2JoKSkgKyAxICkgPyAwIDogaiAtIGNweV9udW0gKyBkZWxfcGFyOworCWlmIChsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpIHsJLyogc2hpZnRfbGVmdCBvY2N1cnMgKi8KKwkJZmlyc3RfcG9pbnRlciA9IDA7CisJCWZpcnN0X2l0ZW0gPSAwOworCQkvKiBkZWxldGUgY3B5X251bSAtIGRlbF9wYXIgcG9pbnRlcnMgYW5kIGtleXMgc3RhcnRpbmcgZm9yIHBvaW50ZXJzIHdpdGggZmlyc3RfcG9pbnRlciwgCisJCSAgIGZvciBrZXkgLSB3aXRoIGZpcnN0X2l0ZW0gKi8KKwkJaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zKHNyY19iaSwgZmlyc3RfcG9pbnRlciwKKwkJCQkJICAgICAgIGZpcnN0X2l0ZW0sIGNweV9udW0gLSBkZWxfcGFyKTsKKwl9IGVsc2UgewkJLyogc2hpZnRfcmlnaHQgb2NjdXJzICovCisJCWludCBpLCBqOwogCi0JaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zIChzcmNfYmksIGogKyAxIC0gY3B5X251bSArIGRlbF9wYXIsIGksIGNweV9udW0gLSBkZWxfcGFyKTsKLSAgICB9CisJCWkgPSAoY3B5X251bSAtIGRlbF9wYXIgPT0KKwkJICAgICAoaiA9CisJCSAgICAgIEJfTlJfSVRFTVMoc3JjX2JpLT5iaV9iaCkpICsgMSkgPyAwIDogaiAtIGNweV9udW0gKworCQkgICAgZGVsX3BhcjsKKworCQlpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMoc3JjX2JpLAorCQkJCQkgICAgICAgaiArIDEgLSBjcHlfbnVtICsgZGVsX3BhciwgaSwKKwkJCQkJICAgICAgIGNweV9udW0gLSBkZWxfcGFyKTsKKwl9CiB9CiAKIC8qIEluc2VydCBuX3NyYyd0aCBrZXkgb2YgYnVmZmVyIHNyYyBiZWZvcmUgbl9kZXN0J3RoIGtleSBvZiBidWZmZXIgZGVzdC4gKi8KLXN0YXRpYyB2b2lkIGludGVybmFsX2luc2VydF9rZXkgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIAotCQkJCSBpbnQgZGVzdF9wb3NpdGlvbl9iZWZvcmUsICAgICAgICAgICAgICAgICAvKiBpbnNlcnQga2V5IGJlZm9yZSBrZXkgd2l0aCBuX2Rlc3QgbnVtYmVyICovCi0JCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywgCi0JCQkJIGludCBzcmNfcG9zaXRpb24pCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9pbnNlcnRfa2V5KHN0cnVjdCBidWZmZXJfaW5mbyAqZGVzdF9iaSwgaW50IGRlc3RfcG9zaXRpb25fYmVmb3JlLAkvKiBpbnNlcnQga2V5IGJlZm9yZSBrZXkgd2l0aCBuX2Rlc3QgbnVtYmVyICovCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBzcmNfcG9zaXRpb24pCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICAgIGludCBucjsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKwlpbnQgbnI7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5OwogCi0gICAgUkZBTFNFKCBkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCi0JICAgICJzb3VyY2UoJXApIG9yIGRlc3QoJXApIGJ1ZmZlciBpcyAwIiwgc3JjLCBkZXN0KTsKLSAgICBSRkFMU0UoIGRlc3RfcG9zaXRpb25fYmVmb3JlIDwgMCB8fCBzcmNfcG9zaXRpb24gPCAwLAotCSAgICAic291cmNlKCVkKSBvciBkZXN0KCVkKSBrZXkgbnVtYmVyIGxlc3MgdGhhbiAwIiwgCi0JICAgIHNyY19wb3NpdGlvbiwgZGVzdF9wb3NpdGlvbl9iZWZvcmUpOwotICAgIFJGQUxTRSggZGVzdF9wb3NpdGlvbl9iZWZvcmUgPiBCX05SX0lURU1TIChkZXN0KSB8fCAKLQkgICAgc3JjX3Bvc2l0aW9uID49IEJfTlJfSVRFTVMoc3JjKSwKLQkgICAgImludmFsaWQgcG9zaXRpb24gaW4gZGVzdCAoJWQgKGtleSBudW1iZXIgJWQpKSBvciBpbiBzcmMgKCVkIChrZXkgbnVtYmVyICVkKSkiLAotCSAgICBkZXN0X3Bvc2l0aW9uX2JlZm9yZSwgQl9OUl9JVEVNUyAoZGVzdCksIAotCSAgICBzcmNfcG9zaXRpb24sIEJfTlJfSVRFTVMoc3JjKSk7Ci0gICAgUkZBTFNFKCBCX0ZSRUVfU1BBQ0UgKGRlc3QpIDwgS0VZX1NJWkUsCi0JICAgICJubyBlbm91Z2ggZnJlZSBzcGFjZSAoJWQpIGluIGRlc3QgYnVmZmVyIiwgQl9GUkVFX1NQQUNFIChkZXN0KSk7CisJUkZBTFNFKGRlc3QgPT0gTlVMTCB8fCBzcmMgPT0gTlVMTCwKKwkgICAgICAgInNvdXJjZSglcCkgb3IgZGVzdCglcCkgYnVmZmVyIGlzIDAiLCBzcmMsIGRlc3QpOworCVJGQUxTRShkZXN0X3Bvc2l0aW9uX2JlZm9yZSA8IDAgfHwgc3JjX3Bvc2l0aW9uIDwgMCwKKwkgICAgICAgInNvdXJjZSglZCkgb3IgZGVzdCglZCkga2V5IG51bWJlciBsZXNzIHRoYW4gMCIsCisJICAgICAgIHNyY19wb3NpdGlvbiwgZGVzdF9wb3NpdGlvbl9iZWZvcmUpOworCVJGQUxTRShkZXN0X3Bvc2l0aW9uX2JlZm9yZSA+IEJfTlJfSVRFTVMoZGVzdCkgfHwKKwkgICAgICAgc3JjX3Bvc2l0aW9uID49IEJfTlJfSVRFTVMoc3JjKSwKKwkgICAgICAgImludmFsaWQgcG9zaXRpb24gaW4gZGVzdCAoJWQgKGtleSBudW1iZXIgJWQpKSBvciBpbiBzcmMgKCVkIChrZXkgbnVtYmVyICVkKSkiLAorCSAgICAgICBkZXN0X3Bvc2l0aW9uX2JlZm9yZSwgQl9OUl9JVEVNUyhkZXN0KSwKKwkgICAgICAgc3JjX3Bvc2l0aW9uLCBCX05SX0lURU1TKHNyYykpOworCVJGQUxTRShCX0ZSRUVfU1BBQ0UoZGVzdCkgPCBLRVlfU0laRSwKKwkgICAgICAgIm5vIGVub3VnaCBmcmVlIHNwYWNlICglZCkgaW4gZGVzdCBidWZmZXIiLCBCX0ZSRUVfU1BBQ0UoZGVzdCkpOwogCi0gICAgYmxraCA9IEJfQkxLX0hFQUQoZGVzdCk7Ci0gICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJYmxraCA9IEJfQkxLX0hFQUQoZGVzdCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBpbnNlcnRpbmcga2V5ICovCi0gICAga2V5ID0gQl9OX1BERUxJTV9LRVkgKGRlc3QsIGRlc3RfcG9zaXRpb25fYmVmb3JlKTsKLSAgICBtZW1tb3ZlIChrZXkgKyAxLCBrZXksIChuciAtIGRlc3RfcG9zaXRpb25fYmVmb3JlKSAqIEtFWV9TSVpFICsgKG5yICsgMSkgKiBEQ19TSVpFKTsKKwkvKiBwcmVwYXJlIHNwYWNlIGZvciBpbnNlcnRpbmcga2V5ICovCisJa2V5ID0gQl9OX1BERUxJTV9LRVkoZGVzdCwgZGVzdF9wb3NpdGlvbl9iZWZvcmUpOworCW1lbW1vdmUoa2V5ICsgMSwga2V5LAorCQkobnIgLSBkZXN0X3Bvc2l0aW9uX2JlZm9yZSkgKiBLRVlfU0laRSArIChuciArIDEpICogRENfU0laRSk7CiAKLSAgICAvKiBpbnNlcnQga2V5ICovCi0gICAgbWVtY3B5IChrZXksIEJfTl9QREVMSU1fS0VZKHNyYywgc3JjX3Bvc2l0aW9uKSwgS0VZX1NJWkUpOworCS8qIGluc2VydCBrZXkgKi8KKwltZW1jcHkoa2V5LCBCX05fUERFTElNX0tFWShzcmMsIHNyY19wb3NpdGlvbiksIEtFWV9TSVpFKTsKIAotICAgIC8qIENoYW5nZSBkaXJ0LCBmcmVlIHNwYWNlLCBpdGVtIG51bWJlciBmaWVsZHMuICovCisJLyogQ2hhbmdlIGRpcnQsIGZyZWUgc3BhY2UsIGl0ZW0gbnVtYmVyIGZpZWxkcy4gKi8KIAotICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIDEgKTsKLSAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBLRVlfU0laRSApOworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpICsgMSk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBLRVlfU0laRSk7CiAKLSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGRlc3RfYmktPnRiLCBkZXN0LCAwKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoZGVzdF9iaS0+dGIsIGRlc3QsIDApOwogCi0gICAgaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgewotCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOwotCXRfZGMgPSBCX05fQ0hJTEQoZGVzdF9iaS0+YmlfcGFyZW50LGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIEtFWV9TSVpFICk7CisJaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworCQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKwkJdF9kYyA9IEJfTl9DSElMRChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKKwkJcHV0X2RjX3NpemUodF9kYywgZGNfc2l6ZSh0X2RjKSArIEtFWV9TSVpFKTsKIAotCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwwKTsKLSAgICB9CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CisJfQogfQogCi0KLQogLyogSW5zZXJ0IGRfa2V5J3RoIChkZWxpbWl0aW5nKSBrZXkgZnJvbSBidWZmZXIgY2ZsIHRvIHRhaWwgb2YgZGVzdC4gCiAgKiBDb3B5IHBvaW50ZXJfYW1vdW50IG5vZGUgcG9pbnRlcnMgYW5kIHBvaW50ZXJfYW1vdW50IC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QuCiAgKiBSZXBsYWNlICBkX2tleSd0aCBrZXkgaW4gYnVmZmVyIGNmbC4KICAqIERlbGV0ZSBwb2ludGVyX2Ftb3VudCBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBzcmMuCiAgKi8KIC8qIHRoaXMgY2FuIGJlIGludm9rZWQgYm90aCB0byBzaGlmdCBmcm9tIFMgdG8gTCBhbmQgZnJvbSBSIHRvIFMgKi8KLXN0YXRpYyB2b2lkCWludGVybmFsX3NoaWZ0X2xlZnQgKAotCQkJCSAgICAgaW50IG1vZGUsCS8qIElOVEVSTkFMX0ZST01fU19UT19MIHwgSU5URVJOQUxfRlJPTV9SX1RPX1MgKi8KLQkJCQkgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJCQkgICAgIGludCBoLAotCQkJCSAgICAgaW50IHBvaW50ZXJfYW1vdW50Ci0JCQkJICAgICApCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9zaGlmdF9sZWZ0KGludCBtb2RlLAkvKiBJTlRFUk5BTF9GUk9NX1NfVE9fTCB8IElOVEVSTkFMX0ZST01fUl9UT19TICovCisJCQkJc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJaW50IGgsIGludCBwb2ludGVyX2Ftb3VudCkKIHsKLSAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY2Y7Ci0gIGludCBkX2tleV9wb3NpdGlvbjsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqY2Y7CisJaW50IGRfa2V5X3Bvc2l0aW9uOwogCi0gIGludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyAobW9kZSwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLCAmZF9rZXlfcG9zaXRpb24sICZjZik7CisJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKG1vZGUsIHRiLCBoLCAmZGVzdF9iaSwgJnNyY19iaSwKKwkJCQkgICAgICAgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOwogCi0gIC8qcHJpbnRrKCJwb2ludGVyX2Ftb3VudCA9ICVkXG4iLHBvaW50ZXJfYW1vdW50KTsqLworCS8qcHJpbnRrKCJwb2ludGVyX2Ftb3VudCA9ICVkXG4iLHBvaW50ZXJfYW1vdW50KTsgKi8KIAotICBpZiAocG9pbnRlcl9hbW91bnQpIHsKLSAgICAvKiBpbnNlcnQgZGVsaW1pdGluZyBrZXkgZnJvbSBjb21tb24gZmF0aGVyIG9mIGRlc3QgYW5kIHNyYyB0byBub2RlIGRlc3QgaW50byBwb3NpdGlvbiBCX05SX0lURU0oZGVzdCkgKi8KLSAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0X2JpLmJpX2JoKSwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKKwlpZiAocG9pbnRlcl9hbW91bnQpIHsKKwkJLyogaW5zZXJ0IGRlbGltaXRpbmcga2V5IGZyb20gY29tbW9uIGZhdGhlciBvZiBkZXN0IGFuZCBzcmMgdG8gbm9kZSBkZXN0IGludG8gcG9zaXRpb24gQl9OUl9JVEVNKGRlc3QpICovCisJCWludGVybmFsX2luc2VydF9rZXkoJmRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdF9iaS5iaV9iaCksIGNmLAorCQkJCSAgICBkX2tleV9wb3NpdGlvbik7CiAKLSAgICBpZiAoQl9OUl9JVEVNUyhzcmNfYmkuYmlfYmgpID09IHBvaW50ZXJfYW1vdW50IC0gMSkgewotICAgICAgaWYgKHNyY19iaS5iaV9wb3NpdGlvbi8qc3JjLT5iX2l0ZW1fb3JkZXIqLyA9PSAwKQotCXJlcGxhY2Vfa2V5ICh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfcGFyZW50LypzcmMtPmJfcGFyZW50Ki8sIDApOwotICAgIH0gZWxzZQotICAgICAgcmVwbGFjZV9rZXkgKHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHNyY19iaS5iaV9iaCwgcG9pbnRlcl9hbW91bnQgLSAxKTsKLSAgfQotICAvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCi0gIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKCZkZXN0X2JpLCAmc3JjX2JpLCBGSVJTVF9UT19MQVNULCBwb2ludGVyX2Ftb3VudCwgMCk7CisJCWlmIChCX05SX0lURU1TKHNyY19iaS5iaV9iaCkgPT0gcG9pbnRlcl9hbW91bnQgLSAxKSB7CisJCQlpZiAoc3JjX2JpLmJpX3Bvc2l0aW9uIC8qc3JjLT5iX2l0ZW1fb3JkZXIgKi8gID09IDApCisJCQkJcmVwbGFjZV9rZXkodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwKKwkJCQkJICAgIHNyY19iaS4KKwkJCQkJICAgIGJpX3BhcmVudCAvKnNyYy0+Yl9wYXJlbnQgKi8gLCAwKTsKKwkJfSBlbHNlCisJCQlyZXBsYWNlX2tleSh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfYmgsCisJCQkJICAgIHBvaW50ZXJfYW1vdW50IC0gMSk7CisJfQorCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KKwlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLCBGSVJTVF9UT19MQVNULAorCQkJCSAgICAgcG9pbnRlcl9hbW91bnQsIDApOwogCiB9CiAKQEAgLTQ5Myw2NyArNDk4LDY2IEBACiAgKiBEZWxldGUgbiAtIDEgaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgU1toXS4KICAqLwogLyogaXQgYWx3YXlzIHNoaWZ0cyBmcm9tIFNbaF0gdG8gTFtoXSAqLwotc3RhdGljIHZvaWQJaW50ZXJuYWxfc2hpZnQxX2xlZnQgKAotCQkJCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCi0JCQkJICAgICAgaW50IGgsIAotCQkJCSAgICAgIGludCBwb2ludGVyX2Ftb3VudAotCQkJCSAgICAgICkKK3N0YXRpYyB2b2lkIGludGVybmFsX3NoaWZ0MV9sZWZ0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCSBpbnQgaCwgaW50IHBvaW50ZXJfYW1vdW50KQogewotICBzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjZjsKLSAgaW50IGRfa2V5X3Bvc2l0aW9uOworCXN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpjZjsKKwlpbnQgZF9rZXlfcG9zaXRpb247CiAKLSAgaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLCAmZF9rZXlfcG9zaXRpb24sICZjZik7CisJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwKKwkJCQkgICAgICAgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKIAotICBpZiAoIHBvaW50ZXJfYW1vdW50ID4gMCApIC8qIGluc2VydCBsa2V5W2hdLXRoIGtleSAgZnJvbSBDRkxbaF0gdG8gbGVmdCBuZWlnaGJvciBMW2hdICovCi0gICAgaW50ZXJuYWxfaW5zZXJ0X2tleSAoJmRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdF9iaS5iaV9iaCksIGNmLCBkX2tleV9wb3NpdGlvbik7Ci0gIC8qCQlpbnRlcm5hbF9pbnNlcnRfa2V5ICh0Yi0+TFtoXSwgQl9OUl9JVEVNKHRiLT5MW2hdKSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0pOyovCisJaWYgKHBvaW50ZXJfYW1vdW50ID4gMCkJLyogaW5zZXJ0IGxrZXlbaF0tdGgga2V5ICBmcm9tIENGTFtoXSB0byBsZWZ0IG5laWdoYm9yIExbaF0gKi8KKwkJaW50ZXJuYWxfaW5zZXJ0X2tleSgmZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0X2JpLmJpX2JoKSwgY2YsCisJCQkJICAgIGRfa2V5X3Bvc2l0aW9uKTsKKwkvKiAgICAgICAgICAgIGludGVybmFsX2luc2VydF9rZXkgKHRiLT5MW2hdLCBCX05SX0lURU0odGItPkxbaF0pLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSk7ICovCiAKLSAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLwotICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgRklSU1RfVE9fTEFTVCwgcG9pbnRlcl9hbW91bnQsIDEpOwotICAvKglpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICh0Yi0+TFtoXSwgdGItPlNbaF0sIEZJUlNUX1RPX0xBU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsqLworCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KKwlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLCBGSVJTVF9UT19MQVNULAorCQkJCSAgICAgcG9pbnRlcl9hbW91bnQsIDEpOworCS8qICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKHRiLT5MW2hdLCB0Yi0+U1toXSwgRklSU1RfVE9fTEFTVCwgcG9pbnRlcl9hbW91bnQsIDEpOyAqLwogfQogCi0KIC8qIEluc2VydCBkX2tleSd0aCAoZGVsaW1pdGluZykga2V5IGZyb20gYnVmZmVyIGNmciB0byBoZWFkIG9mIGRlc3QuIAogICogQ29weSBuIG5vZGUgcG9pbnRlcnMgYW5kIG4gLSAxIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdC4KICAqIFJlcGxhY2UgIGRfa2V5J3RoIGtleSBpbiBidWZmZXIgY2ZyLgogICogRGVsZXRlIG4gaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgc3JjLgogICovCi1zdGF0aWMgdm9pZCBpbnRlcm5hbF9zaGlmdF9yaWdodCAoCi0JCQkJICBpbnQgbW9kZSwJLyogSU5URVJOQUxfRlJPTV9TX1RPX1IgfCBJTlRFUk5BTF9GUk9NX0xfVE9fUyAqLwotCQkJCSAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJCSAgaW50IGgsCi0JCQkJICBpbnQgcG9pbnRlcl9hbW91bnQKLQkJCQkgICkKK3N0YXRpYyB2b2lkIGludGVybmFsX3NoaWZ0X3JpZ2h0KGludCBtb2RlLAkvKiBJTlRFUk5BTF9GUk9NX1NfVE9fUiB8IElOVEVSTkFMX0ZST01fTF9UT19TICovCisJCQkJIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCSBpbnQgaCwgaW50IHBvaW50ZXJfYW1vdW50KQogewotICBzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjZjsKLSAgaW50IGRfa2V5X3Bvc2l0aW9uOwotICBpbnQgbnI7CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNmOworCWludCBkX2tleV9wb3NpdGlvbjsKKwlpbnQgbnI7CiAKKwlpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MobW9kZSwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLAorCQkJCSAgICAgICAmZF9rZXlfcG9zaXRpb24sICZjZik7CiAKLSAgaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChtb2RlLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKKwluciA9IEJfTlJfSVRFTVMoc3JjX2JpLmJpX2JoKTsKIAotICBuciA9IEJfTlJfSVRFTVMgKHNyY19iaS5iaV9iaCk7CisJaWYgKHBvaW50ZXJfYW1vdW50ID4gMCkgeworCQkvKiBpbnNlcnQgZGVsaW1pdGluZyBrZXkgZnJvbSBjb21tb24gZmF0aGVyIG9mIGRlc3QgYW5kIHNyYyB0byBkZXN0IG5vZGUgaW50byBwb3NpdGlvbiAwICovCisJCWludGVybmFsX2luc2VydF9rZXkoJmRlc3RfYmksIDAsIGNmLCBkX2tleV9wb3NpdGlvbik7CisJCWlmIChuciA9PSBwb2ludGVyX2Ftb3VudCAtIDEpIHsKKwkJCVJGQUxTRShzcmNfYmkuYmlfYmggIT0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpIC8qdGItPlNbaF0gKi8gfHwKKwkJCSAgICAgICBkZXN0X2JpLmJpX2JoICE9IHRiLT5SW2hdLAorCQkJICAgICAgICJzcmMgKCVwKSBtdXN0IGJlID09IHRiLT5TW2hdKCVwKSB3aGVuIGl0IGRpc2FwcGVhcnMiLAorCQkJICAgICAgIHNyY19iaS5iaV9iaCwgUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKTsKKwkJCS8qIHdoZW4gU1toXSBkaXNhcHBlcnMgcmVwbGFjZSBsZWZ0IGRlbGVtaXRpbmcga2V5IGFzIHdlbGwgKi8KKwkJCWlmICh0Yi0+Q0ZMW2hdKQorCQkJCXJlcGxhY2Vfa2V5KHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHRiLT5DRkxbaF0sCisJCQkJCSAgICB0Yi0+bGtleVtoXSk7CisJCX0gZWxzZQorCQkJcmVwbGFjZV9rZXkodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwgc3JjX2JpLmJpX2JoLAorCQkJCSAgICBuciAtIHBvaW50ZXJfYW1vdW50KTsKKwl9CiAKLSAgaWYgKHBvaW50ZXJfYW1vdW50ID4gMCkgewotICAgIC8qIGluc2VydCBkZWxpbWl0aW5nIGtleSBmcm9tIGNvbW1vbiBmYXRoZXIgb2YgZGVzdCBhbmQgc3JjIHRvIGRlc3Qgbm9kZSBpbnRvIHBvc2l0aW9uIDAgKi8KLSAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgMCwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKLSAgICBpZiAobnIgPT0gcG9pbnRlcl9hbW91bnQgLSAxKSB7Ci0JIFJGQUxTRSggc3JjX2JpLmJpX2JoICE9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCkvKnRiLT5TW2hdKi8gfHwgCi0JCSBkZXN0X2JpLmJpX2JoICE9IHRiLT5SW2hdLAotCQkgInNyYyAoJXApIG11c3QgYmUgPT0gdGItPlNbaF0oJXApIHdoZW4gaXQgZGlzYXBwZWFycyIsCi0JCSBzcmNfYmkuYmlfYmgsIFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCkpOwotICAgICAgLyogd2hlbiBTW2hdIGRpc2FwcGVycyByZXBsYWNlIGxlZnQgZGVsZW1pdGluZyBrZXkgYXMgd2VsbCAqLwotICAgICAgaWYgKHRiLT5DRkxbaF0pCi0JcmVwbGFjZV9rZXkgKHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdKTsKLSAgICB9IGVsc2UKLSAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfYmgsIG5yIC0gcG9pbnRlcl9hbW91bnQpOwotICB9ICAgICAgCi0KLSAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLwotICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgcG9pbnRlcl9hbW91bnQsIDApOworCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KKwlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLCBMQVNUX1RPX0ZJUlNULAorCQkJCSAgICAgcG9pbnRlcl9hbW91bnQsIDApOwogfQogCiAvKiBJbnNlcnQgZGVsaW1pdGluZyBrZXkgdG8gUltoXS4KQEAgLTU2MSw0OTggKzU2NSw1MjYgQEAKICAqIERlbGV0ZSBuIC0gMSBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBTW2hdLgogICovCiAvKiBpdCBhbHdheXMgc2hpZnQgZnJvbSBTW2hdIHRvIFJbaF0gKi8KLXN0YXRpYyB2b2lkCWludGVybmFsX3NoaWZ0MV9yaWdodCAoCi0JCQkJICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCi0JCQkJICAgICAgIGludCBoLCAKLQkJCQkgICAgICAgaW50IHBvaW50ZXJfYW1vdW50Ci0JCQkJICAgICAgICkKK3N0YXRpYyB2b2lkIGludGVybmFsX3NoaWZ0MV9yaWdodChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkgIGludCBoLCBpbnQgcG9pbnRlcl9hbW91bnQpCiB7Ci0gIHN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIGNmOwotICBpbnQgZF9rZXlfcG9zaXRpb247CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNmOworCWludCBkX2tleV9wb3NpdGlvbjsKIAotICBpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKKwlpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLAorCQkJCSAgICAgICAmZGVzdF9iaSwgJnNyY19iaSwgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOwogCi0gIGlmIChwb2ludGVyX2Ftb3VudCA+IDApIC8qIGluc2VydCBya2V5IGZyb20gQ0ZSW2hdIHRvIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KLSAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgMCwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKLSAgLyoJCWludGVybmFsX2luc2VydF9rZXkgKHRiLT5SW2hdLCAwLCB0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSk7Ki8KLQkKLSAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLwotICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgcG9pbnRlcl9hbW91bnQsIDEpOwotICAvKglpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICh0Yi0+UltoXSwgdGItPlNbaF0sIExBU1RfVE9fRklSU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsqLworCWlmIChwb2ludGVyX2Ftb3VudCA+IDApCS8qIGluc2VydCBya2V5IGZyb20gQ0ZSW2hdIHRvIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KKwkJaW50ZXJuYWxfaW5zZXJ0X2tleSgmZGVzdF9iaSwgMCwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKKwkvKiAgICAgICAgICAgIGludGVybmFsX2luc2VydF9rZXkgKHRiLT5SW2hdLCAwLCB0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSk7ICovCisKKwkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCisJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcygmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwKKwkJCQkgICAgIHBvaW50ZXJfYW1vdW50LCAxKTsKKwkvKiAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICh0Yi0+UltoXSwgdGItPlNbaF0sIExBU1RfVE9fRklSU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsgKi8KIH0KIAotCiAvKiBEZWxldGUgaW5zZXJ0X251bSBub2RlIHBvaW50ZXJzIHRvZ2V0aGVyIHdpdGggdGhlaXIgbGVmdCBpdGVtcwogICogYW5kIGJhbGFuY2UgY3VycmVudCBub2RlLiovCi1zdGF0aWMgdm9pZCBiYWxhbmNlX2ludGVybmFsX3doZW5fZGVsZXRlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQkJCQkgIGludCBoLCBpbnQgY2hpbGRfcG9zKQorc3RhdGljIHZvaWQgYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkJIGludCBoLCBpbnQgY2hpbGRfcG9zKQogewotICAgIGludCBpbnNlcnRfbnVtOwotICAgIGludCBuOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHRiU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKwlpbnQgaW5zZXJ0X251bTsKKwlpbnQgbjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiU2ggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOwogCi0gICAgaW5zZXJ0X251bSA9IHRiLT5pbnNlcnRfc2l6ZVtoXSAvICgoaW50KShEQ19TSVpFICsgS0VZX1NJWkUpKTsKLSAgCi0gICAgLyogZGVsZXRlIGNoaWxkLW5vZGUtcG9pbnRlcihzKSB0b2dldGhlciB3aXRoIHRoZWlyIGxlZnQgaXRlbShzKSAqLwotICAgIGJpLnRiID0gdGI7Ci0gICAgYmkuYmlfYmggPSB0YlNoOwotICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0gICAgYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJaW5zZXJ0X251bSA9IHRiLT5pbnNlcnRfc2l6ZVtoXSAvICgoaW50KShEQ19TSVpFICsgS0VZX1NJWkUpKTsKIAotICAgIGludGVybmFsX2RlbGV0ZV9jaGlsZHMgKCZiaSwgY2hpbGRfcG9zLCAtaW5zZXJ0X251bSk7CisJLyogZGVsZXRlIGNoaWxkLW5vZGUtcG9pbnRlcihzKSB0b2dldGhlciB3aXRoIHRoZWlyIGxlZnQgaXRlbShzKSAqLworCWJpLnRiID0gdGI7CisJYmkuYmlfYmggPSB0YlNoOworCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOwogCi0gICAgUkZBTFNFKCB0Yi0+YmxrbnVtW2hdID4gMSwKLQkgICAgInRiLT5ibGtudW1bJWRdPSVkIHdoZW4gaW5zZXJ0X3NpemUgPCAwIiwgaCwgdGItPmJsa251bVtoXSk7CisJaW50ZXJuYWxfZGVsZXRlX2NoaWxkcygmYmksIGNoaWxkX3BvcywgLWluc2VydF9udW0pOwogCi0gICAgbiA9IEJfTlJfSVRFTVModGJTaCk7CisJUkZBTFNFKHRiLT5ibGtudW1baF0gPiAxLAorCSAgICAgICAidGItPmJsa251bVslZF09JWQgd2hlbiBpbnNlcnRfc2l6ZSA8IDAiLCBoLCB0Yi0+YmxrbnVtW2hdKTsKIAotICAgIGlmICggdGItPmxudW1baF0gPT0gMCAmJiB0Yi0+cm51bVtoXSA9PSAwICkgewotCWlmICggdGItPmJsa251bVtoXSA9PSAwICkgewotCSAgICAvKiBub2RlIFNbaF0gKHJvb3Qgb2YgdGhlIHRyZWUpIGlzIGVtcHR5IG5vdyAqLwotCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19yb290OworCW4gPSBCX05SX0lURU1TKHRiU2gpOwogCi0JICAgIFJGQUxTRSggbiB8fCBCX0ZSRUVfU1BBQ0UgKHRiU2gpICE9IE1BWF9DSElMRF9TSVpFKHRiU2gpIC0gRENfU0laRSwKLQkJICAgICJidWZmZXIgbXVzdCBoYXZlIG9ubHkgMCBrZXlzICglZCkiLCBuKTsKLQkgICAgUkZBTFNFKCBiaS5iaV9wYXJlbnQsICJyb290IGhhcyBwYXJlbnQgKCVwKSIsIGJpLmJpX3BhcmVudCk7Ci0JCQotCSAgICAvKiBjaG9vc2UgYSBuZXcgcm9vdCAqLwotCSAgICBpZiAoICEgdGItPkxbaC0xXSB8fCAhIEJfTlJfSVRFTVModGItPkxbaC0xXSkgKQotCQluZXdfcm9vdCA9IHRiLT5SW2gtMV07Ci0JICAgIGVsc2UKLQkJbmV3X3Jvb3QgPSB0Yi0+TFtoLTFdOwotCSAgICAvKiBzd2l0Y2ggc3VwZXIgYmxvY2sncyB0cmVlIHJvb3QgYmxvY2sgbnVtYmVyIHRvIHRoZSBuZXcgdmFsdWUgKi8KLSAgICAgICAgICAgIFBVVF9TQl9ST09UX0JMT0NLKCB0Yi0+dGJfc2IsIG5ld19yb290LT5iX2Jsb2NrbnIgKTsKLQkgICAgLy9SRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3JzLT5zX3RyZWVfaGVpZ2h0IC0tOwotICAgICAgICAgICAgUFVUX1NCX1RSRUVfSEVJR0hUKCB0Yi0+dGJfc2IsIFNCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYikgLSAxICk7CisJaWYgKHRiLT5sbnVtW2hdID09IDAgJiYgdGItPnJudW1baF0gPT0gMCkgeworCQlpZiAodGItPmJsa251bVtoXSA9PSAwKSB7CisJCQkvKiBub2RlIFNbaF0gKHJvb3Qgb2YgdGhlIHRyZWUpIGlzIGVtcHR5IG5vdyAqLworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfcm9vdDsKIAotCSAgICBkb19iYWxhbmNlX21hcmtfc2JfZGlydHkgKHRiLCBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3NiaCwgMSk7Ci0JICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0JICAgIGlmIChoID4gMSkKLQkJLyogdXNlIGNoZWNrX2ludGVybmFsIGlmIG5ldyByb290IGlzIGFuIGludGVybmFsIG5vZGUgKi8KLQkJY2hlY2tfaW50ZXJuYWwgKG5ld19yb290KTsKLQkgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKwkJCVJGQUxTRShuCisJCQkgICAgICAgfHwgQl9GUkVFX1NQQUNFKHRiU2gpICE9CisJCQkgICAgICAgTUFYX0NISUxEX1NJWkUodGJTaCkgLSBEQ19TSVpFLAorCQkJICAgICAgICJidWZmZXIgbXVzdCBoYXZlIG9ubHkgMCBrZXlzICglZCkiLCBuKTsKKwkJCVJGQUxTRShiaS5iaV9wYXJlbnQsICJyb290IGhhcyBwYXJlbnQgKCVwKSIsCisJCQkgICAgICAgYmkuYmlfcGFyZW50KTsKIAotCSAgICAvKiBkbyB3aGF0IGlzIG5lZWRlZCBmb3IgYnVmZmVyIHRocm93biBmcm9tIHRyZWUgKi8KLQkgICAgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOwotCSAgICByZXR1cm47CisJCQkvKiBjaG9vc2UgYSBuZXcgcm9vdCAqLworCQkJaWYgKCF0Yi0+TFtoIC0gMV0gfHwgIUJfTlJfSVRFTVModGItPkxbaCAtIDFdKSkKKwkJCQluZXdfcm9vdCA9IHRiLT5SW2ggLSAxXTsKKwkJCWVsc2UKKwkJCQluZXdfcm9vdCA9IHRiLT5MW2ggLSAxXTsKKwkJCS8qIHN3aXRjaCBzdXBlciBibG9jaydzIHRyZWUgcm9vdCBibG9jayBudW1iZXIgdG8gdGhlIG5ldyB2YWx1ZSAqLworCQkJUFVUX1NCX1JPT1RfQkxPQ0sodGItPnRiX3NiLCBuZXdfcm9vdC0+Yl9ibG9ja25yKTsKKwkJCS8vUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19ycy0+c190cmVlX2hlaWdodCAtLTsKKwkJCVBVVF9TQl9UUkVFX0hFSUdIVCh0Yi0+dGJfc2IsCisJCQkJCSAgIFNCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYikgLSAxKTsKKworCQkJZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5KHRiLAorCQkJCQkJIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfc2JoLAorCQkJCQkJIDEpOworCQkJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJCQlpZiAoaCA+IDEpCisJCQkJLyogdXNlIGNoZWNrX2ludGVybmFsIGlmIG5ldyByb290IGlzIGFuIGludGVybmFsIG5vZGUgKi8KKwkJCQljaGVja19pbnRlcm5hbChuZXdfcm9vdCk7CisJCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KKworCQkJLyogZG8gd2hhdCBpcyBuZWVkZWQgZm9yIGJ1ZmZlciB0aHJvd24gZnJvbSB0cmVlICovCisJCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTaCk7CisJCQlyZXR1cm47CisJCX0KKwkJcmV0dXJuOwogCX0KLQlyZXR1cm47Ci0gICAgfQogCi0gICAgaWYgKCB0Yi0+TFtoXSAmJiB0Yi0+bG51bVtoXSA9PSAtQl9OUl9JVEVNUyh0Yi0+TFtoXSkgLSAxICkgeyAvKiBqb2luIFNbaF0gd2l0aCBMW2hdICovCisJaWYgKHRiLT5MW2hdICYmIHRiLT5sbnVtW2hdID09IC1CX05SX0lURU1TKHRiLT5MW2hdKSAtIDEpIHsJLyogam9pbiBTW2hdIHdpdGggTFtoXSAqLwogCi0JUkZBTFNFKCB0Yi0+cm51bVtoXSAhPSAwLAotCQkiaW52YWxpZCB0Yi0+cm51bVslZF09PSVkIHdoZW4gam9pbmluZyBTW2hdIHdpdGggTFtoXSIsCi0JCWgsIHRiLT5ybnVtW2hdKTsKKwkJUkZBTFNFKHRiLT5ybnVtW2hdICE9IDAsCisJCSAgICAgICAiaW52YWxpZCB0Yi0+cm51bVslZF09PSVkIHdoZW4gam9pbmluZyBTW2hdIHdpdGggTFtoXSIsCisJCSAgICAgICBoLCB0Yi0+cm51bVtoXSk7CiAKLQlpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIG4gKyAxKTsKLQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTaCk7CisJCWludGVybmFsX3NoaWZ0X2xlZnQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCBuICsgMSk7CisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlNoKTsKIAotCXJldHVybjsKLSAgICB9CisJCXJldHVybjsKKwl9CiAKLSAgICBpZiAoIHRiLT5SW2hdICYmICB0Yi0+cm51bVtoXSA9PSAtQl9OUl9JVEVNUyh0Yi0+UltoXSkgLSAxICkgeyAvKiBqb2luIFNbaF0gd2l0aCBSW2hdICovCi0JUkZBTFNFKCB0Yi0+bG51bVtoXSAhPSAwLAotCQkiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIHdoZW4gam9pbmluZyBTW2hdIHdpdGggUltoXSIsCi0JCWgsIHRiLT5sbnVtW2hdKTsKKwlpZiAodGItPlJbaF0gJiYgdGItPnJudW1baF0gPT0gLUJfTlJfSVRFTVModGItPlJbaF0pIC0gMSkgewkvKiBqb2luIFNbaF0gd2l0aCBSW2hdICovCisJCVJGQUxTRSh0Yi0+bG51bVtoXSAhPSAwLAorCQkgICAgICAgImludmFsaWQgdGItPmxudW1bJWRdPT0lZCB3aGVuIGpvaW5pbmcgU1toXSB3aXRoIFJbaF0iLAorCQkgICAgICAgaCwgdGItPmxudW1baF0pOwogCi0JaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgbiArIDEpOworCQlpbnRlcm5hbF9zaGlmdF9yaWdodChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsIG4gKyAxKTsKIAotCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLHRiU2gpOwotCXJldHVybjsKLSAgICB9CisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlNoKTsKKwkJcmV0dXJuOworCX0KIAotICAgIGlmICggdGItPmxudW1baF0gPCAwICkgeyAvKiBib3Jyb3cgZnJvbSBsZWZ0IG5laWdoYm9yIExbaF0gKi8KLQlSRkFMU0UoIHRiLT5ybnVtW2hdICE9IDAsCi0JCSJ3cm9uZyB0Yi0+cm51bVslZF09PSVkIHdoZW4gYm9ycm93IGZyb20gTFtoXSIsIGgsIHRiLT5ybnVtW2hdKTsKLQkvKmludGVybmFsX3NoaWZ0X3JpZ2h0ICh0YiwgaCwgdGItPkxbaF0sIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdLCB0Yi0+U1toXSwgLXRiLT5sbnVtW2hdKTsqLwotCWludGVybmFsX3NoaWZ0X3JpZ2h0IChJTlRFUk5BTF9TSElGVF9GUk9NX0xfVE9fUywgdGIsIGgsIC10Yi0+bG51bVtoXSk7Ci0JcmV0dXJuOwotICAgIH0KKwlpZiAodGItPmxudW1baF0gPCAwKSB7CS8qIGJvcnJvdyBmcm9tIGxlZnQgbmVpZ2hib3IgTFtoXSAqLworCQlSRkFMU0UodGItPnJudW1baF0gIT0gMCwKKwkJICAgICAgICJ3cm9uZyB0Yi0+cm51bVslZF09PSVkIHdoZW4gYm9ycm93IGZyb20gTFtoXSIsIGgsCisJCSAgICAgICB0Yi0+cm51bVtoXSk7CisJCS8qaW50ZXJuYWxfc2hpZnRfcmlnaHQgKHRiLCBoLCB0Yi0+TFtoXSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0sIHRiLT5TW2hdLCAtdGItPmxudW1baF0pOyAqLworCQlpbnRlcm5hbF9zaGlmdF9yaWdodChJTlRFUk5BTF9TSElGVF9GUk9NX0xfVE9fUywgdGIsIGgsCisJCQkJICAgICAtdGItPmxudW1baF0pOworCQlyZXR1cm47CisJfQogCi0gICAgaWYgKCB0Yi0+cm51bVtoXSA8IDAgKSB7IC8qIGJvcnJvdyBmcm9tIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KLQkgUkZBTFNFKCB0Yi0+bG51bVtoXSAhPSAwLAotCQkgImludmFsaWQgdGItPmxudW1bJWRdPT0lZCB3aGVuIGJvcnJvdyBmcm9tIFJbaF0iLCAKLQkJIGgsIHRiLT5sbnVtW2hdKTsKLQlpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1JfVE9fUywgdGIsIGgsIC10Yi0+cm51bVtoXSk7Lyp0Yi0+U1toXSwgdGItPkNGUltoXSwgdGItPnJrZXlbaF0sIHRiLT5SW2hdLCAtdGItPnJudW1baF0pOyovCi0JcmV0dXJuOwotICAgIH0KKwlpZiAodGItPnJudW1baF0gPCAwKSB7CS8qIGJvcnJvdyBmcm9tIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KKwkJUkZBTFNFKHRiLT5sbnVtW2hdICE9IDAsCisJCSAgICAgICAiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIHdoZW4gYm9ycm93IGZyb20gUltoXSIsCisJCSAgICAgICBoLCB0Yi0+bG51bVtoXSk7CisJCWludGVybmFsX3NoaWZ0X2xlZnQoSU5URVJOQUxfU0hJRlRfRlJPTV9SX1RPX1MsIHRiLCBoLCAtdGItPnJudW1baF0pOwkvKnRiLT5TW2hdLCB0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSwgdGItPlJbaF0sIC10Yi0+cm51bVtoXSk7ICovCisJCXJldHVybjsKKwl9CiAKLSAgICBpZiAoIHRiLT5sbnVtW2hdID4gMCApIHsgLyogc3BsaXQgU1toXSBpbnRvIHR3byBwYXJ0cyBhbmQgcHV0IHRoZW0gaW50byBuZWlnaGJvcnMgKi8KLQlSRkFMU0UoIHRiLT5ybnVtW2hdID09IDAgfHwgdGItPmxudW1baF0gKyB0Yi0+cm51bVtoXSAhPSBuICsgMSwKLQkJImludmFsaWQgdGItPmxudW1bJWRdPT0lZCBvciB0Yi0+cm51bVslZF09PSVkIHdoZW4gU1toXShpdGVtIG51bWJlciA9PSAlZCkgaXMgc3BsaXQgYmV0d2VlbiB0aGVtIiwKLQkJaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdLCBuKTsKKwlpZiAodGItPmxudW1baF0gPiAwKSB7CS8qIHNwbGl0IFNbaF0gaW50byB0d28gcGFydHMgYW5kIHB1dCB0aGVtIGludG8gbmVpZ2hib3JzICovCisJCVJGQUxTRSh0Yi0+cm51bVtoXSA9PSAwIHx8IHRiLT5sbnVtW2hdICsgdGItPnJudW1baF0gIT0gbiArIDEsCisJCSAgICAgICAiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIG9yIHRiLT5ybnVtWyVkXT09JWQgd2hlbiBTW2hdKGl0ZW0gbnVtYmVyID09ICVkKSBpcyBzcGxpdCBiZXR3ZWVuIHRoZW0iLAorCQkgICAgICAgaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdLCBuKTsKIAotCWludGVybmFsX3NoaWZ0X2xlZnQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgdGItPmxudW1baF0pOy8qdGItPkxbaF0sIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdLCB0Yi0+U1toXSwgdGItPmxudW1baF0pOyovCi0JaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgdGItPnJudW1baF0pOworCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgdGItPmxudW1baF0pOwkvKnRiLT5MW2hdLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSwgdGItPlNbaF0sIHRiLT5sbnVtW2hdKTsgKi8KKwkJaW50ZXJuYWxfc2hpZnRfcmlnaHQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLAorCQkJCSAgICAgdGItPnJudW1baF0pOwogCi0JcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlNoKTsKKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOwogCi0JcmV0dXJuOwotICAgIH0KLSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZTogdW5leHBlY3RlZCB0Yi0+bG51bVslZF09PSVkIG9yIHRiLT5ybnVtWyVkXT09JWQiLAotCQkgICAgaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdKTsKKwkJcmV0dXJuOworCX0KKwlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCSAgICAgICAiYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZTogdW5leHBlY3RlZCB0Yi0+bG51bVslZF09PSVkIG9yIHRiLT5ybnVtWyVkXT09JWQiLAorCQkgICAgICAgaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdKTsKIH0KIAotCiAvKiBSZXBsYWNlIGRlbGltaXRpbmcga2V5IG9mIGJ1ZmZlcnMgTFtoXSBhbmQgU1toXSBieSB0aGUgZ2l2ZW4ga2V5LiovCi1zdGF0aWMgdm9pZCByZXBsYWNlX2xrZXkgKAotCQkgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCi0JCSAgICAgIGludCBoLAotCQkgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICoga2V5Ci0JCSAgICAgICkKK3N0YXRpYyB2b2lkIHJlcGxhY2VfbGtleShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgsIHN0cnVjdCBpdGVtX2hlYWQgKmtleSkKIHsKLSAgIFJGQUxTRSggdGItPkxbaF0gPT0gTlVMTCB8fCB0Yi0+Q0ZMW2hdID09IE5VTEwsCi0JICAgIkxbaF0oJXApIGFuZCBDRkxbaF0oJXApIG11c3QgZXhpc3QgaW4gcmVwbGFjZV9sa2V5IiwgCi0JICAgdGItPkxbaF0sIHRiLT5DRkxbaF0pOworCVJGQUxTRSh0Yi0+TFtoXSA9PSBOVUxMIHx8IHRiLT5DRkxbaF0gPT0gTlVMTCwKKwkgICAgICAgIkxbaF0oJXApIGFuZCBDRkxbaF0oJXApIG11c3QgZXhpc3QgaW4gcmVwbGFjZV9sa2V5IiwKKwkgICAgICAgdGItPkxbaF0sIHRiLT5DRkxbaF0pOwogCi0gIGlmIChCX05SX0lURU1TKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSkgPT0gMCkKLSAgICByZXR1cm47CisJaWYgKEJfTlJfSVRFTVMoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKSA9PSAwKQorCQlyZXR1cm47CiAKLSAgbWVtY3B5IChCX05fUERFTElNX0tFWSh0Yi0+Q0ZMW2hdLHRiLT5sa2V5W2hdKSwga2V5LCBLRVlfU0laRSk7CisJbWVtY3B5KEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdKSwga2V5LCBLRVlfU0laRSk7CiAKLSAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPkNGTFtoXSwwKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiLT5DRkxbaF0sIDApOwogfQogCi0KIC8qIFJlcGxhY2UgZGVsaW1pdGluZyBrZXkgb2YgYnVmZmVycyBTW2hdIGFuZCBSW2hdIGJ5IHRoZSBnaXZlbiBrZXkuKi8KLXN0YXRpYyB2b2lkIHJlcGxhY2VfcmtleSAoCi0JCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJICAgICAgaW50IGgsCi0JCSAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBrZXkKLQkJICAgICAgKQorc3RhdGljIHZvaWQgcmVwbGFjZV9ya2V5KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCwgc3RydWN0IGl0ZW1faGVhZCAqa2V5KQogewotICBSRkFMU0UoIHRiLT5SW2hdID09IE5VTEwgfHwgdGItPkNGUltoXSA9PSBOVUxMLAotCSAgIlJbaF0oJXApIGFuZCBDRlJbaF0oJXApIG11c3QgZXhpc3QgaW4gcmVwbGFjZV9ya2V5IiwgCi0JICB0Yi0+UltoXSwgdGItPkNGUltoXSk7Ci0gIFJGQUxTRSggQl9OUl9JVEVNUyh0Yi0+UltoXSkgPT0gMCwKLQkgICJSW2hdIGNhbiBub3QgYmUgZW1wdHkgaWYgaXQgZXhpc3RzIChpdGVtIG51bWJlcj0lZCkiLCAKLQkgIEJfTlJfSVRFTVModGItPlJbaF0pKTsKKwlSRkFMU0UodGItPlJbaF0gPT0gTlVMTCB8fCB0Yi0+Q0ZSW2hdID09IE5VTEwsCisJICAgICAgICJSW2hdKCVwKSBhbmQgQ0ZSW2hdKCVwKSBtdXN0IGV4aXN0IGluIHJlcGxhY2VfcmtleSIsCisJICAgICAgIHRiLT5SW2hdLCB0Yi0+Q0ZSW2hdKTsKKwlSRkFMU0UoQl9OUl9JVEVNUyh0Yi0+UltoXSkgPT0gMCwKKwkgICAgICAgIlJbaF0gY2FuIG5vdCBiZSBlbXB0eSBpZiBpdCBleGlzdHMgKGl0ZW0gbnVtYmVyPSVkKSIsCisJICAgICAgIEJfTlJfSVRFTVModGItPlJbaF0pKTsKIAotICBtZW1jcHkgKEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbaF0sdGItPnJrZXlbaF0pLCBrZXksIEtFWV9TSVpFKTsKKwltZW1jcHkoQl9OX1BERUxJTV9LRVkodGItPkNGUltoXSwgdGItPnJrZXlbaF0pLCBrZXksIEtFWV9TSVpFKTsKIAotICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0Yi0+Q0ZSW2hdLCAwKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiLT5DRlJbaF0sIDApOwogfQogCi0KLWludCBiYWxhbmNlX2ludGVybmFsIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCQkJLyogdHJlZV9iYWxhbmNlIHN0cnVjdHVyZSAJCSovCi0JCSAgICAgIGludCBoLAkJCQkJLyogbGV2ZWwgb2YgdGhlIHRyZWUgCQkJKi8KLQkJICAgICAgaW50IGNoaWxkX3BvcywKLQkJICAgICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydF9rZXksCQkvKiBrZXkgZm9yIGluc2VydGlvbiBvbiBoaWdoZXIgbGV2ZWwgICAJKi8KLQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGluc2VydF9wdHIJLyogbm9kZSBmb3IgaW5zZXJ0aW9uIG9uIGhpZ2hlciBsZXZlbCovCitpbnQgYmFsYW5jZV9pbnRlcm5hbChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwJLyogdHJlZV9iYWxhbmNlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCisJCSAgICAgaW50IGgsCS8qIGxldmVsIG9mIHRoZSB0cmVlICAgICAgICAgICAgICAgICAgICAqLworCQkgICAgIGludCBjaGlsZF9wb3MsIHN0cnVjdCBpdGVtX2hlYWQgKmluc2VydF9rZXksCS8qIGtleSBmb3IgaW5zZXJ0aW9uIG9uIGhpZ2hlciBsZXZlbCAgICAqLworCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmluc2VydF9wdHIJLyogbm9kZSBmb3IgaW5zZXJ0aW9uIG9uIGhpZ2hlciBsZXZlbCAqLwogICAgICkKICAgICAvKiBpZiBpbnNlcnRpbmcvcGFzdGluZwogICAgICAgIHsKLSAgICAgICBjaGlsZF9wb3MgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlLXBvaW50ZXIgaW4gU1toXSB0aGF0CSAqCi0gICAgICAgcG9pbnRlZCB0byBTW2gtMV0gYmVmb3JlIGJhbGFuY2luZyBvZiB0aGUgaC0xIGxldmVsOwkJICoKKyAgICAgICBjaGlsZF9wb3MgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlLXBvaW50ZXIgaW4gU1toXSB0aGF0ICAgICAgICAqCisgICAgICAgcG9pbnRlZCB0byBTW2gtMV0gYmVmb3JlIGJhbGFuY2luZyBvZiB0aGUgaC0xIGxldmVsOyAgICAgICAgICAgICAgKgogICAgICAgIHRoaXMgbWVhbnMgdGhhdCBuZXcgcG9pbnRlcnMgYW5kIGl0ZW1zIG11c3QgYmUgaW5zZXJ0ZWQgQUZURVIgKgogICAgICAgIGNoaWxkX3BvcwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKLSAgIGl0IGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGVmdG1vc3QgcG9pbnRlciB0aGF0IG11c3QgYmUgZGVsZXRlZCAodG9nZXRoZXIgd2l0aAotICAgaXRzIGNvcnJlc3BvbmRpbmcga2V5IHRvIHRoZSBsZWZ0IG9mIHRoZSBwb2ludGVyKQotICAgYXMgYSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGxldmVsJ3MgYmFsYW5jaW5nLgotICAgfQotKi8KKyAgICAgICBpdCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGxlZnRtb3N0IHBvaW50ZXIgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgKHRvZ2V0aGVyIHdpdGgKKyAgICAgICBpdHMgY29ycmVzcG9uZGluZyBrZXkgdG8gdGhlIGxlZnQgb2YgdGhlIHBvaW50ZXIpCisgICAgICAgYXMgYSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGxldmVsJ3MgYmFsYW5jaW5nLgorICAgICAgIH0KKyAgICAgKi8KIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7Ci0gICAgaW50IG9yZGVyOwkJLyogd2UgcmV0dXJuIHRoaXM6IGl0IGlzIDAgaWYgdGhlcmUgaXMgbm8gU1toXSwgZWxzZSBpdCBpcyB0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovCi0gICAgaW50IGluc2VydF9udW0sIG4sIGs7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogU19uZXc7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCBuZXdfaW5zZXJ0X2tleTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBuZXdfaW5zZXJ0X3B0ciA9IE5VTEw7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIG5ld19pbnNlcnRfa2V5X2FkZHIgPSBpbnNlcnRfa2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CisJaW50IG9yZGVyOwkJLyogd2UgcmV0dXJuIHRoaXM6IGl0IGlzIDAgaWYgdGhlcmUgaXMgbm8gU1toXSwgZWxzZSBpdCBpcyB0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovCisJaW50IGluc2VydF9udW0sIG4sIGs7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpTX25ldzsKKwlzdHJ1Y3QgaXRlbV9oZWFkIG5ld19pbnNlcnRfa2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2luc2VydF9wdHIgPSBOVUxMOworCXN0cnVjdCBpdGVtX2hlYWQgKm5ld19pbnNlcnRfa2V5X2FkZHIgPSBpbnNlcnRfa2V5OwogCi0gICAgUkZBTFNFKCBoIDwgMSwgImggKCVkKSBjYW4gbm90IGJlIDwgMSBvbiBpbnRlcm5hbCBsZXZlbCIsIGgpOworCVJGQUxTRShoIDwgMSwgImggKCVkKSBjYW4gbm90IGJlIDwgMSBvbiBpbnRlcm5hbCBsZXZlbCIsIGgpOwogCi0gICAgUFJPQ19JTkZPX0lOQyggdGIgLT4gdGJfc2IsIGJhbGFuY2VfYXRbIGggXSApOworCVBST0NfSU5GT19JTkModGItPnRiX3NiLCBiYWxhbmNlX2F0W2hdKTsKIAotICAgIG9yZGVyID0gKCB0YlNoICkgPyBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSkvKnRiLT5TW2hdLT5iX2l0ZW1fb3JkZXIqLyA6IDA7CisJb3JkZXIgPQorCSAgICAodGJTaCkgPyBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsCisJCQkJICAgICBoICsgMSkgLyp0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovIDogMDsKIAotICAvKiBVc2luZyBpbnNlcnRfc2l6ZVtoXSBjYWxjdWxhdGUgdGhlIG51bWJlciBpbnNlcnRfbnVtIG9mIGl0ZW1zCi0gICAgIHRoYXQgbXVzdCBiZSBpbnNlcnRlZCB0byBvciBkZWxldGVkIGZyb20gU1toXS4gKi8KLSAgICBpbnNlcnRfbnVtID0gdGItPmluc2VydF9zaXplW2hdLygoaW50KShLRVlfU0laRSArIERDX1NJWkUpKTsKKwkvKiBVc2luZyBpbnNlcnRfc2l6ZVtoXSBjYWxjdWxhdGUgdGhlIG51bWJlciBpbnNlcnRfbnVtIG9mIGl0ZW1zCisJICAgdGhhdCBtdXN0IGJlIGluc2VydGVkIHRvIG9yIGRlbGV0ZWQgZnJvbSBTW2hdLiAqLworCWluc2VydF9udW0gPSB0Yi0+aW5zZXJ0X3NpemVbaF0gLyAoKGludCkoS0VZX1NJWkUgKyBEQ19TSVpFKSk7CiAKLSAgICAvKiBDaGVjayB3aGV0aGVyIGluc2VydF9udW0gaXMgcHJvcGVyICoqLwotICAgIFJGQUxTRSggaW5zZXJ0X251bSA8IC0yICB8fCAgaW5zZXJ0X251bSA+IDIsCi0JICAgICJpbmNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIGluc2VydGVkIHRvIHRoZSBpbnRlcm5hbCBub2RlICglZCkiLCAKLQkgICAgaW5zZXJ0X251bSk7Ci0gICAgUkZBTFNFKCBoID4gMSAgJiYgKGluc2VydF9udW0gPiAxIHx8IGluc2VydF9udW0gPCAtMSksCi0JICAgICJpbmNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zICglZCkgaW5zZXJ0ZWQgdG8gdGhlIGludGVybmFsIG5vZGUgb24gYSBsZXZlbCAoaD0lZCkgaGlnaGVyIHRoYW4gbGFzdCBpbnRlcm5hbCBsZXZlbCIsIAotCSAgICBpbnNlcnRfbnVtLCBoKTsKKwkvKiBDaGVjayB3aGV0aGVyIGluc2VydF9udW0gaXMgcHJvcGVyICogKi8KKwlSRkFMU0UoaW5zZXJ0X251bSA8IC0yIHx8IGluc2VydF9udW0gPiAyLAorCSAgICAgICAiaW5jb3JyZWN0IG51bWJlciBvZiBpdGVtcyBpbnNlcnRlZCB0byB0aGUgaW50ZXJuYWwgbm9kZSAoJWQpIiwKKwkgICAgICAgaW5zZXJ0X251bSk7CisJUkZBTFNFKGggPiAxICYmIChpbnNlcnRfbnVtID4gMSB8fCBpbnNlcnRfbnVtIDwgLTEpLAorCSAgICAgICAiaW5jb3JyZWN0IG51bWJlciBvZiBpdGVtcyAoJWQpIGluc2VydGVkIHRvIHRoZSBpbnRlcm5hbCBub2RlIG9uIGEgbGV2ZWwgKGg9JWQpIGhpZ2hlciB0aGFuIGxhc3QgaW50ZXJuYWwgbGV2ZWwiLAorCSAgICAgICBpbnNlcnRfbnVtLCBoKTsKIAotICAgIC8qIE1ha2UgYmFsYW5jZSBpbiBjYXNlIGluc2VydF9udW0gPCAwICovCi0gICAgaWYgKCBpbnNlcnRfbnVtIDwgMCApIHsKLQliYWxhbmNlX2ludGVybmFsX3doZW5fZGVsZXRlICh0YiwgaCwgY2hpbGRfcG9zKTsKLQlyZXR1cm4gb3JkZXI7Ci0gICAgfQotIAotICAgIGsgPSAwOwotICAgIGlmICggdGItPmxudW1baF0gPiAwICkgewotCS8qIHNoaWZ0IGxudW1baF0gaXRlbXMgZnJvbSBTW2hdIHRvIHRoZSBsZWZ0IG5laWdoYm9yIExbaF0uCi0JICAgY2hlY2sgaG93IG1hbnkgb2YgbmV3IGl0ZW1zIGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSBhZnRlcgotCSAgIHNoaWZ0aW5nICovCi0JbiA9IEJfTlJfSVRFTVMgKHRiLT5MW2hdKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIExbaF0gKi8KLQlpZiAoIHRiLT5sbnVtW2hdIDw9IGNoaWxkX3BvcyApIHsKLQkgICAgLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSAqLwotCSAgICBpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIHRiLT5sbnVtW2hdKTsKLQkgICAgLyppbnRlcm5hbF9zaGlmdF9sZWZ0ICh0Yi0+TFtoXSx0Yi0+Q0ZMW2hdLHRiLT5sa2V5W2hdLHRiU2gsdGItPmxudW1baF0pOyovCi0JICAgIGNoaWxkX3BvcyAtPSB0Yi0+bG51bVtoXTsKLQl9IGVsc2UgaWYgKCB0Yi0+bG51bVtoXSA+IGNoaWxkX3BvcyArIGluc2VydF9udW0gKSB7Ci0JICAgIC8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIExbaF0gKi8KLQkgICAgaW50ZXJuYWxfc2hpZnRfbGVmdCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCB0Yi0+bG51bVtoXSAtIGluc2VydF9udW0pOwotCSAgICAvKgkJCWludGVybmFsX3NoaWZ0X2xlZnQodGItPkxbaF0sdGItPkNGTFtoXSx0Yi0+bGtleVtoXSx0YlNoLAotCQkJCXRiLT5sbnVtW2hdLWluc2VydF9udW0pOwotCSAgICAqLwotCSAgICAvKiBpbnNlcnQgaW5zZXJ0X251bSBrZXlzIGFuZCBub2RlLXBvaW50ZXJzIGludG8gTFtoXSAqLwotCSAgICBiaS50YiA9IHRiOwotCSAgICBiaS5iaV9iaCA9IHRiLT5MW2hdOwotCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07Ci0JICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKLQkgICAgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoJmJpLC8qdGItPkxbaF0sIHRiLT5TW2gtMV0tPmJfbmV4dCovIG4gKyBjaGlsZF9wb3MgKyAxLAotCQkJCSAgICBpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cik7Ci0KLQkgICAgaW5zZXJ0X251bSA9IDA7IAotCX0gZWxzZSB7Ci0JICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7Ci0KLQkgICAgLyogc29tZSBpdGVtcyBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0sIGJ1dCBzb21lIGRvbid0IGZhbGwgKi8KLQkgICAgaW50ZXJuYWxfc2hpZnQxX2xlZnQodGIsaCxjaGlsZF9wb3MrMSk7Ci0JICAgIC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbmV3IGl0ZW1zIHRoYXQgZmFsbCBpbnRvIExbaF0gKi8KLQkgICAgayA9IHRiLT5sbnVtW2hdIC0gY2hpbGRfcG9zIC0gMTsKLQkgICAgYmkudGIgPSB0YjsKLQkgICAgYmkuYmlfYmggPSB0Yi0+TFtoXTsKLQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOwotCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZiaSwvKnRiLT5MW2hdLCB0Yi0+U1toLTFdLT5iX25leHQsKi8gbiArIGNoaWxkX3BvcyArIDEsaywKLQkJCQkgICAgaW5zZXJ0X2tleSxpbnNlcnRfcHRyKTsKLQotCSAgICByZXBsYWNlX2xrZXkodGIsaCxpbnNlcnRfa2V5ICsgayk7Ci0KLQkgICAgLyogcmVwbGFjZSB0aGUgZmlyc3Qgbm9kZS1wdHIgaW4gU1toXSBieSBub2RlLXB0ciB0byBpbnNlcnRfcHRyW2tdICovCi0JICAgIGRjID0gQl9OX0NISUxEKHRiU2gsIDApOwotCSAgICBwdXRfZGNfc2l6ZSggZGMsIE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJba10pIC0gQl9GUkVFX1NQQUNFIChpbnNlcnRfcHRyW2tdKSk7Ci0JICAgIHB1dF9kY19ibG9ja19udW1iZXIoIGRjLCBpbnNlcnRfcHRyW2tdLT5iX2Jsb2NrbnIgKTsKLQotCSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0YlNoLCAwKTsKLQotCSAgICBrKys7Ci0JICAgIGluc2VydF9rZXkgKz0gazsKLQkgICAgaW5zZXJ0X3B0ciArPSBrOwotCSAgICBpbnNlcnRfbnVtIC09IGs7Ci0JICAgIGNoaWxkX3BvcyA9IDA7CisJLyogTWFrZSBiYWxhbmNlIGluIGNhc2UgaW5zZXJ0X251bSA8IDAgKi8KKwlpZiAoaW5zZXJ0X251bSA8IDApIHsKKwkJYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZSh0YiwgaCwgY2hpbGRfcG9zKTsKKwkJcmV0dXJuIG9yZGVyOwogCX0KLSAgICB9CS8qIHRiLT5sbnVtW2hdID4gMCAqLwogCi0gICAgaWYgKCB0Yi0+cm51bVtoXSA+IDAgKSB7Ci0JLypzaGlmdCBybnVtW2hdIGl0ZW1zIGZyb20gU1toXSB0byB0aGUgcmlnaHQgbmVpZ2hib3IgUltoXSovCi0JLyogY2hlY2sgaG93IG1hbnkgb2YgbmV3IGl0ZW1zIGZhbGwgaW50byBSIG9yIENGUiBhZnRlciBzaGlmdGluZyAqLwotCW4gPSBCX05SX0lURU1TICh0YlNoKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KLQlpZiAoIG4gLSB0Yi0+cm51bVtoXSA+PSBjaGlsZF9wb3MgKQotCSAgICAvKiBuZXcgaXRlbXMgZmFsbCBpbnRvIFNbaF0gKi8KLQkgICAgLyppbnRlcm5hbF9zaGlmdF9yaWdodCh0YixoLHRiU2gsdGItPkNGUltoXSx0Yi0+cmtleVtoXSx0Yi0+UltoXSx0Yi0+cm51bVtoXSk7Ki8KLQkgICAgaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgdGItPnJudW1baF0pOwotCWVsc2UKLQkgICAgaWYgKCBuICsgaW5zZXJ0X251bSAtIHRiLT5ybnVtW2hdIDwgY2hpbGRfcG9zICkKLQkgICAgewotCQkvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBSW2hdICovCi0JCS8qaW50ZXJuYWxfc2hpZnRfcmlnaHQodGIsaCx0YlNoLHRiLT5DRlJbaF0sdGItPnJrZXlbaF0sdGItPlJbaF0sCi0JICAgIHRiLT5ybnVtW2hdIC0gaW5zZXJ0X251bSk7Ki8KLQkJaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgdGItPnJudW1baF0gLSBpbnNlcnRfbnVtKTsKKwlrID0gMDsKKwlpZiAodGItPmxudW1baF0gPiAwKSB7CisJCS8qIHNoaWZ0IGxudW1baF0gaXRlbXMgZnJvbSBTW2hdIHRvIHRoZSBsZWZ0IG5laWdoYm9yIExbaF0uCisJCSAgIGNoZWNrIGhvdyBtYW55IG9mIG5ldyBpdGVtcyBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0gYWZ0ZXIKKwkJICAgc2hpZnRpbmcgKi8KKwkJbiA9IEJfTlJfSVRFTVModGItPkxbaF0pOwkvKiBudW1iZXIgb2YgaXRlbXMgaW4gTFtoXSAqLworCQlpZiAodGItPmxudW1baF0gPD0gY2hpbGRfcG9zKSB7CisJCQkvKiBuZXcgaXRlbXMgZG9uJ3QgZmFsbCBpbnRvIExbaF0gb3IgQ0ZMW2hdICovCisJCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwKKwkJCQkJICAgIHRiLT5sbnVtW2hdKTsKKwkJCS8qaW50ZXJuYWxfc2hpZnRfbGVmdCAodGItPkxbaF0sdGItPkNGTFtoXSx0Yi0+bGtleVtoXSx0YlNoLHRiLT5sbnVtW2hdKTsgKi8KKwkJCWNoaWxkX3BvcyAtPSB0Yi0+bG51bVtoXTsKKwkJfSBlbHNlIGlmICh0Yi0+bG51bVtoXSA+IGNoaWxkX3BvcyArIGluc2VydF9udW0pIHsKKwkJCS8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIExbaF0gKi8KKwkJCWludGVybmFsX3NoaWZ0X2xlZnQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLAorCQkJCQkgICAgdGItPmxudW1baF0gLSBpbnNlcnRfbnVtKTsKKwkJCS8qICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfc2hpZnRfbGVmdCh0Yi0+TFtoXSx0Yi0+Q0ZMW2hdLHRiLT5sa2V5W2hdLHRiU2gsCisJCQkgICB0Yi0+bG51bVtoXS1pbnNlcnRfbnVtKTsKKwkJCSAqLworCQkJLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIExbaF0gKi8KKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IHRiLT5MW2hdOworCQkJYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOworCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwKKwkJCQkJICAgICAgIC8qdGItPkxbaF0sIHRiLT5TW2gtMV0tPmJfbmV4dCAqLworCQkJCQkgICAgICAgbiArIGNoaWxkX3BvcyArIDEsCisJCQkJCSAgICAgICBpbnNlcnRfbnVtLCBpbnNlcnRfa2V5LAorCQkJCQkgICAgICAgaW5zZXJ0X3B0cik7CiAKLQkJLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIFJbaF0gKi8KLQkJYmkudGIgPSB0YjsKLQkJYmkuYmlfYmggPSB0Yi0+UltoXTsKLQkJYmkuYmlfcGFyZW50ID0gdGItPkZSW2hdOwotCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmYmksIC8qdGItPlJbaF0sdGItPlNbaC0xXS0+Yl9uZXh0Ki8gY2hpbGRfcG9zIC0gbiAtIGluc2VydF9udW0gKyB0Yi0+cm51bVtoXSAtIDEsCi0JCQkJCWluc2VydF9udW0saW5zZXJ0X2tleSxpbnNlcnRfcHRyKTsKLQkJaW5zZXJ0X251bSA9IDA7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCXN0cnVjdCBkaXNrX2NoaWxkICogZGM7CisJCQlpbnNlcnRfbnVtID0gMDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKIAotCQkvKiBvbmUgb2YgdGhlIGl0ZW1zIGZhbGxzIGludG8gQ0ZSW2hdICovCi0JCWludGVybmFsX3NoaWZ0MV9yaWdodCh0YixoLG4gLSBjaGlsZF9wb3MgKyAxKTsKLQkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBuZXcgaXRlbXMgdGhhdCBmYWxsIGludG8gUltoXSAqLwotCQlrID0gdGItPnJudW1baF0gLSBuICsgY2hpbGRfcG9zIC0gMTsKLQkJYmkudGIgPSB0YjsKLQkJYmkuYmlfYmggPSB0Yi0+UltoXTsKLQkJYmkuYmlfcGFyZW50ID0gdGItPkZSW2hdOwotCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmYmksIC8qdGItPlJbaF0sIHRiLT5SW2hdLT5iX2NoaWxkLCovIDAsIGssIGluc2VydF9rZXkgKyAxLCBpbnNlcnRfcHRyICsgMSk7CisJCQkvKiBzb21lIGl0ZW1zIGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSwgYnV0IHNvbWUgZG9uJ3QgZmFsbCAqLworCQkJaW50ZXJuYWxfc2hpZnQxX2xlZnQodGIsIGgsIGNoaWxkX3BvcyArIDEpOworCQkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBuZXcgaXRlbXMgdGhhdCBmYWxsIGludG8gTFtoXSAqLworCQkJayA9IHRiLT5sbnVtW2hdIC0gY2hpbGRfcG9zIC0gMTsKKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IHRiLT5MW2hdOworCQkJYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOworCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwKKwkJCQkJICAgICAgIC8qdGItPkxbaF0sIHRiLT5TW2gtMV0tPmJfbmV4dCwgKi8KKwkJCQkJICAgICAgIG4gKyBjaGlsZF9wb3MgKyAxLCBrLAorCQkJCQkgICAgICAgaW5zZXJ0X2tleSwgaW5zZXJ0X3B0cik7CiAKLQkJcmVwbGFjZV9ya2V5KHRiLGgsaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSk7CisJCQlyZXBsYWNlX2xrZXkodGIsIGgsIGluc2VydF9rZXkgKyBrKTsKIAotCQkvKiByZXBsYWNlIHRoZSBmaXJzdCBub2RlLXB0ciBpbiBSW2hdIGJ5IG5vZGUtcHRyIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKi8KLQkJZGMgPSBCX05fQ0hJTEQodGItPlJbaF0sIDApOwotCQlwdXRfZGNfc2l6ZSggZGMsIE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSAtCi0gICAgCQkJCSAgICBCX0ZSRUVfU1BBQ0UgKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSk7Ci0JCXB1dF9kY19ibG9ja19udW1iZXIoIGRjLCBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXS0+Yl9ibG9ja25yICk7CisJCQkvKiByZXBsYWNlIHRoZSBmaXJzdCBub2RlLXB0ciBpbiBTW2hdIGJ5IG5vZGUtcHRyIHRvIGluc2VydF9wdHJba10gKi8KKwkJCWRjID0gQl9OX0NISUxEKHRiU2gsIDApOworCQkJcHV0X2RjX3NpemUoZGMsCisJCQkJICAgIE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJba10pIC0KKwkJCQkgICAgQl9GUkVFX1NQQUNFKGluc2VydF9wdHJba10pKTsKKwkJCXB1dF9kY19ibG9ja19udW1iZXIoZGMsIGluc2VydF9wdHJba10tPmJfYmxvY2tucik7CiAKLQkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPlJbaF0sMCk7CisJCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiU2gsIDApOwogCi0JCWluc2VydF9udW0gLT0gKGsgKyAxKTsKLQkgICAgfQotICAgIH0KKwkJCWsrKzsKKwkJCWluc2VydF9rZXkgKz0gazsKKwkJCWluc2VydF9wdHIgKz0gazsKKwkJCWluc2VydF9udW0gLT0gazsKKwkJCWNoaWxkX3BvcyA9IDA7CisJCX0KKwl9CisJLyogdGItPmxudW1baF0gPiAwICovCisJaWYgKHRiLT5ybnVtW2hdID4gMCkgeworCQkvKnNoaWZ0IHJudW1baF0gaXRlbXMgZnJvbSBTW2hdIHRvIHRoZSByaWdodCBuZWlnaGJvciBSW2hdICovCisJCS8qIGNoZWNrIGhvdyBtYW55IG9mIG5ldyBpdGVtcyBmYWxsIGludG8gUiBvciBDRlIgYWZ0ZXIgc2hpZnRpbmcgKi8KKwkJbiA9IEJfTlJfSVRFTVModGJTaCk7CS8qIG51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCisJCWlmIChuIC0gdGItPnJudW1baF0gPj0gY2hpbGRfcG9zKQorCQkJLyogbmV3IGl0ZW1zIGZhbGwgaW50byBTW2hdICovCisJCQkvKmludGVybmFsX3NoaWZ0X3JpZ2h0KHRiLGgsdGJTaCx0Yi0+Q0ZSW2hdLHRiLT5ya2V5W2hdLHRiLT5SW2hdLHRiLT5ybnVtW2hdKTsgKi8KKwkJCWludGVybmFsX3NoaWZ0X3JpZ2h0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwKKwkJCQkJICAgICB0Yi0+cm51bVtoXSk7CisJCWVsc2UgaWYgKG4gKyBpbnNlcnRfbnVtIC0gdGItPnJudW1baF0gPCBjaGlsZF9wb3MpIHsKKwkJCS8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIFJbaF0gKi8KKwkJCS8qaW50ZXJuYWxfc2hpZnRfcmlnaHQodGIsaCx0YlNoLHRiLT5DRlJbaF0sdGItPnJrZXlbaF0sdGItPlJbaF0sCisJCQkgICB0Yi0+cm51bVtoXSAtIGluc2VydF9udW0pOyAqLworCQkJaW50ZXJuYWxfc2hpZnRfcmlnaHQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLAorCQkJCQkgICAgIHRiLT5ybnVtW2hdIC0gaW5zZXJ0X251bSk7CisKKwkJCS8qIGluc2VydCBpbnNlcnRfbnVtIGtleXMgYW5kIG5vZGUtcG9pbnRlcnMgaW50byBSW2hdICovCisJCQliaS50YiA9IHRiOworCQkJYmkuYmlfYmggPSB0Yi0+UltoXTsKKwkJCWJpLmJpX3BhcmVudCA9IHRiLT5GUltoXTsKKwkJCWJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCBoKTsKKwkJCWludGVybmFsX2luc2VydF9jaGlsZHMoJmJpLAorCQkJCQkgICAgICAgLyp0Yi0+UltoXSx0Yi0+U1toLTFdLT5iX25leHQgKi8KKwkJCQkJICAgICAgIGNoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsKKwkJCQkJICAgICAgIHRiLT5ybnVtW2hdIC0gMSwKKwkJCQkJICAgICAgIGluc2VydF9udW0sIGluc2VydF9rZXksCisJCQkJCSAgICAgICBpbnNlcnRfcHRyKTsKKwkJCWluc2VydF9udW0gPSAwOworCQl9IGVsc2UgeworCQkJc3RydWN0IGRpc2tfY2hpbGQgKmRjOworCisJCQkvKiBvbmUgb2YgdGhlIGl0ZW1zIGZhbGxzIGludG8gQ0ZSW2hdICovCisJCQlpbnRlcm5hbF9zaGlmdDFfcmlnaHQodGIsIGgsIG4gLSBjaGlsZF9wb3MgKyAxKTsKKwkJCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbmV3IGl0ZW1zIHRoYXQgZmFsbCBpbnRvIFJbaF0gKi8KKwkJCWsgPSB0Yi0+cm51bVtoXSAtIG4gKyBjaGlsZF9wb3MgLSAxOworCQkJYmkudGIgPSB0YjsKKwkJCWJpLmJpX2JoID0gdGItPlJbaF07CisJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwKKwkJCQkJICAgICAgIC8qdGItPlJbaF0sIHRiLT5SW2hdLT5iX2NoaWxkLCAqLworCQkJCQkgICAgICAgMCwgaywgaW5zZXJ0X2tleSArIDEsCisJCQkJCSAgICAgICBpbnNlcnRfcHRyICsgMSk7CisKKwkJCXJlcGxhY2VfcmtleSh0YiwgaCwgaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSk7CisKKwkJCS8qIHJlcGxhY2UgdGhlIGZpcnN0IG5vZGUtcHRyIGluIFJbaF0gYnkgbm9kZS1wdHIgaW5zZXJ0X3B0cltpbnNlcnRfbnVtLWstMV0gKi8KKwkJCWRjID0gQl9OX0NISUxEKHRiLT5SW2hdLCAwKTsKKwkJCXB1dF9kY19zaXplKGRjLAorCQkJCSAgICBNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyCisJCQkJCQkgICBbaW5zZXJ0X251bSAtIGsgLSAxXSkgLQorCQkJCSAgICBCX0ZSRUVfU1BBQ0UoaW5zZXJ0X3B0cgorCQkJCQkJIFtpbnNlcnRfbnVtIC0gayAtIDFdKSk7CisJCQlwdXRfZGNfYmxvY2tfbnVtYmVyKGRjLAorCQkJCQkgICAgaW5zZXJ0X3B0cltpbnNlcnRfbnVtIC0gayAtCisJCQkJCQkgICAgICAgMV0tPmJfYmxvY2tucik7CisKKwkJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSh0YiwgdGItPlJbaF0sIDApOworCisJCQlpbnNlcnRfbnVtIC09IChrICsgMSk7CisJCX0KKwl9CiAKICAgICAvKiogRmlsbCBuZXcgbm9kZSB0aGF0IGFwcGVhcnMgaW5zdGVhZCBvZiBTW2hdICoqLwotICAgIFJGQUxTRSggdGItPmJsa251bVtoXSA+IDIsICJibGtudW0gY2FuIG5vdCBiZSA+IDIgZm9yIGludGVybmFsIGxldmVsIik7Ci0gICAgUkZBTFNFKCB0Yi0+YmxrbnVtW2hdIDwgMCwgImJsa251bSBjYW4gbm90IGJlIDwgMCIpOworCVJGQUxTRSh0Yi0+YmxrbnVtW2hdID4gMiwgImJsa251bSBjYW4gbm90IGJlID4gMiBmb3IgaW50ZXJuYWwgbGV2ZWwiKTsKKwlSRkFMU0UodGItPmJsa251bVtoXSA8IDAsICJibGtudW0gY2FuIG5vdCBiZSA8IDAiKTsKIAotICAgIGlmICggISB0Yi0+YmxrbnVtW2hdICkKLSAgICB7IC8qIG5vZGUgU1toXSBpcyBlbXB0eSBub3cgKi8KLQlSRkFMU0UoICEgdGJTaCwgIlNbaF0gaXMgZXF1YWwgTlVMTCIpOworCWlmICghdGItPmJsa251bVtoXSkgewkvKiBub2RlIFNbaF0gaXMgZW1wdHkgbm93ICovCisJCVJGQUxTRSghdGJTaCwgIlNbaF0gaXMgZXF1YWwgTlVMTCIpOwogCi0JLyogZG8gd2hhdCBpcyBuZWVkZWQgZm9yIGJ1ZmZlciB0aHJvd24gZnJvbSB0cmVlICovCi0JcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsdGJTaCk7Ci0JcmV0dXJuIG9yZGVyOwotICAgIH0KLQotICAgIGlmICggISB0YlNoICkgewotCS8qIGNyZWF0ZSBuZXcgcm9vdCAqLwotCXN0cnVjdCBkaXNrX2NoaWxkICAqIGRjOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIHRiU2hfMSA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCAtIDEpOwotICAgICAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqICBibGtoOwotCi0KLQlpZiAoIHRiLT5ibGtudW1baF0gIT0gMSApCi0JICAgIHJlaXNlcmZzX3BhbmljKE5VTEwsICJiYWxhbmNlX2ludGVybmFsOiBPbmUgbmV3IG5vZGUgcmVxdWlyZWQgZm9yIGNyZWF0aW5nIHRoZSBuZXcgcm9vdCIpOwotCS8qIFNbaF0gPSBlbXB0eSBidWZmZXIgZnJvbSB0aGUgbGlzdCBGRUIuICovCi0JdGJTaCA9IGdldF9GRUIgKHRiKTsKLSAgICAgICAgYmxraCA9IEJfQkxLX0hFQUQodGJTaCk7Ci0gICAgICAgIHNldF9ibGtoX2xldmVsKCBibGtoLCBoICsgMSApOwotCi0JLyogUHV0IHRoZSB1bmlxdWUgbm9kZS1wb2ludGVyIHRvIFNbaF0gdGhhdCBwb2ludHMgdG8gU1toLTFdLiAqLwotCi0JZGMgPSBCX05fQ0hJTEQodGJTaCwgMCk7Ci0JcHV0X2RjX2Jsb2NrX251bWJlciggZGMsIHRiU2hfMS0+Yl9ibG9ja25yICk7Ci0JcHV0X2RjX3NpemUoIGRjLCAoTUFYX0NISUxEX1NJWkUgKHRiU2hfMSkgLSBCX0ZSRUVfU1BBQ0UgKHRiU2hfMSkpKTsKLQotCXRiLT5pbnNlcnRfc2l6ZVtoXSAtPSBEQ19TSVpFOwotICAgICAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBEQ19TSVpFICk7Ci0KLQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0YlNoLCAwKTsKLQotCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLQljaGVja19pbnRlcm5hbCAodGJTaCk7Ci0JLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotICAgIAotICAgIC8qIHB1dCBuZXcgcm9vdCBpbnRvIHBhdGggc3RydWN0dXJlICovCi0JUEFUSF9PRkZTRVRfUEJVRkZFUih0Yi0+dGJfcGF0aCwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSA9IHRiU2g7Ci0KLQkvKiBDaGFuZ2Ugcm9vdCBpbiBzdHJ1Y3R1cmUgc3VwZXIgYmxvY2suICovCi0gICAgICAgIFBVVF9TQl9ST09UX0JMT0NLKCB0Yi0+dGJfc2IsIHRiU2gtPmJfYmxvY2tuciApOwotICAgICAgICBQVVRfU0JfVFJFRV9IRUlHSFQoIHRiLT50Yl9zYiwgU0JfVFJFRV9IRUlHSFQodGItPnRiX3NiKSArIDEgKTsKLQlkb19iYWxhbmNlX21hcmtfc2JfZGlydHkgKHRiLCBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3NiaCwgMSk7Ci0gICAgfQotCQotICAgIGlmICggdGItPmJsa251bVtoXSA9PSAyICkgewotCWludCBzbnVtOwotCXN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7Ci0KLQotCS8qIFNfbmV3ID0gZnJlZSBidWZmZXIgZnJvbSBsaXN0IEZFQiAqLwotCVNfbmV3ID0gZ2V0X0ZFQih0Yik7Ci0KLSAgICAgICAgc2V0X2Jsa2hfbGV2ZWwoIEJfQkxLX0hFQUQoU19uZXcpLCBoICsgMSApOwotCi0JZGVzdF9iaS50YiA9IHRiOwotCWRlc3RfYmkuYmlfYmggPSBTX25ldzsKLQlkZXN0X2JpLmJpX3BhcmVudCA9IE5VTEw7Ci0JZGVzdF9iaS5iaV9wb3NpdGlvbiA9IDA7Ci0Jc3JjX2JpLnRiID0gdGI7Ci0Jc3JjX2JpLmJpX2JoID0gdGJTaDsKLQlzcmNfYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKLQlzcmNfYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JCQotCW4gPSBCX05SX0lURU1TICh0YlNoKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KLQlzbnVtID0gKGluc2VydF9udW0gKyBuICsgMSkvMjsKLQlpZiAoIG4gLSBzbnVtID49IGNoaWxkX3BvcyApIHsKLQkgICAgLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBTX25ldyAqLwotCSAgICAvKglzdG9yZSB0aGUgZGVsaW1pdGluZyBrZXkgZm9yIHRoZSBuZXh0IGxldmVsICovCi0JICAgIC8qIG5ld19pbnNlcnRfa2V5ID0gKG4gLSBzbnVtKSd0aCBrZXkgaW4gU1toXSAqLwotCSAgICBtZW1jcHkgKCZuZXdfaW5zZXJ0X2tleSxCX05fUERFTElNX0tFWSh0YlNoLG4gLSBzbnVtKSwKLQkJICAgIEtFWV9TSVpFKTsKLQkgICAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhciAqLwotCSAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgc251bSwgMCk7Ci0JICAgIC8qICAgICAgICAgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhTX25ldywgdGJTaCwgTEFTVF9UT19GSVJTVCwgc251bSwgMCk7Ki8KLQl9IGVsc2UgaWYgKCBuICsgaW5zZXJ0X251bSAtIHNudW0gPCBjaGlsZF9wb3MgKSB7Ci0JICAgIC8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIFNfbmV3ICovCi0JICAgIC8qCXN0b3JlIHRoZSBkZWxpbWl0aW5nIGtleSBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KLQkgICAgLyogbmV3X2luc2VydF9rZXkgPSAobiArIGluc2VydF9pdGVtIC0gc251bSkndGgga2V5IGluIFNbaF0gKi8KLQkgICAgbWVtY3B5KCZuZXdfaW5zZXJ0X2tleSxCX05fUERFTElNX0tFWSh0YlNoLG4gKyBpbnNlcnRfbnVtIC0gc251bSksCi0JCSAgIEtFWV9TSVpFKTsKLQkgICAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhciAqLwotCSAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgc251bSAtIGluc2VydF9udW0sIDApOwotCSAgICAvKgkJCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoU19uZXcsdGJTaCwxLHNudW0gLSBpbnNlcnRfbnVtLDApOyovCi0KLQkgICAgLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIFNfbmV3ICovCi0JICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZkZXN0X2JpLCAvKlNfbmV3LHRiLT5TW2gtMV0tPmJfbmV4dCwqL2NoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsgc251bSAtIDEsCi0JCQkJICAgIGluc2VydF9udW0saW5zZXJ0X2tleSxpbnNlcnRfcHRyKTsKLQotCSAgICBpbnNlcnRfbnVtID0gMDsKLQl9IGVsc2UgewotCSAgICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOwotCi0JICAgIC8qIHNvbWUgaXRlbXMgZmFsbCBpbnRvIFNfbmV3LCBidXQgc29tZSBkb24ndCBmYWxsICovCi0JICAgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KLQkgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIG4gLSBjaGlsZF9wb3MgKyAxLCAxKTsKLQkgICAgLyoJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKFNfbmV3LHRiU2gsMSxuIC0gY2hpbGRfcG9zICsgMSwxKTsqLwotCSAgICAvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBTX25ldyAqLwotCSAgICBrID0gc251bSAtIG4gKyBjaGlsZF9wb3MgLSAxOwotCi0JICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZkZXN0X2JpLCAvKlNfbmV3LCovIDAsIGssIGluc2VydF9rZXkgKyAxLCBpbnNlcnRfcHRyKzEpOwotCi0JICAgIC8qIG5ld19pbnNlcnRfa2V5ID0gaW5zZXJ0X2tleVtpbnNlcnRfbnVtIC0gayAtIDFdICovCi0JICAgIG1lbWNweSgmbmV3X2luc2VydF9rZXksaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSwKLQkJICAgS0VZX1NJWkUpOwotCSAgICAvKiByZXBsYWNlIGZpcnN0IG5vZGUtcHRyIGluIFNfbmV3IGJ5IG5vZGUtcHRyIHRvIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdICovCi0KLQkgICAgZGMgPSBCX05fQ0hJTEQoU19uZXcsMCk7Ci0JICAgIHB1dF9kY19zaXplKCBkYywgKE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSAtCi0JCQkJQl9GUkVFX1NQQUNFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSkgKTsKLQkgICAgcHV0X2RjX2Jsb2NrX251bWJlciggZGMsIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdLT5iX2Jsb2NrbnIgKTsKLQotCSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCBTX25ldywwKTsKLQkJCQotCSAgICBpbnNlcnRfbnVtIC09IChrICsgMSk7Ci0JfQotCS8qIG5ld19pbnNlcnRfcHRyID0gbm9kZV9wb2ludGVyIHRvIFNfbmV3ICovCi0JbmV3X2luc2VydF9wdHIgPSBTX25ldzsKLQotCVJGQUxTRSAoIWJ1ZmZlcl9qb3VybmFsZWQoU19uZXcpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KFNfbmV3KSB8fAotCQlidWZmZXJfZGlydHkgKFNfbmV3KSwKLQkJImNtLTAwMDAxOiBiYWQgU19uZXcgKCViKSIsIFNfbmV3KTsKLQotCS8vIFNfbmV3IGlzIHJlbGVhc2VkIGluIHVuZml4X25vZGVzCi0gICAgfQotCi0gICAgbiA9IEJfTlJfSVRFTVMgKHRiU2gpOyAvKm51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCi0KLQlpZiAoIDAgPD0gY2hpbGRfcG9zICYmIGNoaWxkX3BvcyA8PSBuICYmIGluc2VydF9udW0gPiAwICkgewotCSAgICBiaS50YiA9IHRiOwotCSAgICBiaS5iaV9iaCA9IHRiU2g7Ci0JICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0JICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOwotCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgKLQkJICAgICZiaSwvKnRiU2gsKi8KLQkJICAgIC8qCQkoIHRiLT5TW2gtMV0tPmJfcGFyZW50ID09IHRiLT5TW2hdICkgPyB0Yi0+U1toLTFdLT5iX25leHQgOiAgdGItPlNbaF0tPmJfY2hpbGQtPmJfbmV4dCwqLwotCQkgICAgY2hpbGRfcG9zLGluc2VydF9udW0saW5zZXJ0X2tleSxpbnNlcnRfcHRyCi0JCSAgICApOworCQkvKiBkbyB3aGF0IGlzIG5lZWRlZCBmb3IgYnVmZmVyIHRocm93biBmcm9tIHRyZWUgKi8KKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOworCQlyZXR1cm4gb3JkZXI7CiAJfQogCisJaWYgKCF0YlNoKSB7CisJCS8qIGNyZWF0ZSBuZXcgcm9vdCAqLworCQlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTaF8xID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGggLSAxKTsKKwkJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CiAKLQltZW1jcHkgKG5ld19pbnNlcnRfa2V5X2FkZHIsJm5ld19pbnNlcnRfa2V5LEtFWV9TSVpFKTsKKwkJaWYgKHRiLT5ibGtudW1baF0gIT0gMSkKKwkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJICAgICAgICJiYWxhbmNlX2ludGVybmFsOiBPbmUgbmV3IG5vZGUgcmVxdWlyZWQgZm9yIGNyZWF0aW5nIHRoZSBuZXcgcm9vdCIpOworCQkvKiBTW2hdID0gZW1wdHkgYnVmZmVyIGZyb20gdGhlIGxpc3QgRkVCLiAqLworCQl0YlNoID0gZ2V0X0ZFQih0Yik7CisJCWJsa2ggPSBCX0JMS19IRUFEKHRiU2gpOworCQlzZXRfYmxraF9sZXZlbChibGtoLCBoICsgMSk7CisKKwkJLyogUHV0IHRoZSB1bmlxdWUgbm9kZS1wb2ludGVyIHRvIFNbaF0gdGhhdCBwb2ludHMgdG8gU1toLTFdLiAqLworCisJCWRjID0gQl9OX0NISUxEKHRiU2gsIDApOworCQlwdXRfZGNfYmxvY2tfbnVtYmVyKGRjLCB0YlNoXzEtPmJfYmxvY2tucik7CisJCXB1dF9kY19zaXplKGRjLAorCQkJICAgIChNQVhfQ0hJTERfU0laRSh0YlNoXzEpIC0gQl9GUkVFX1NQQUNFKHRiU2hfMSkpKTsKKworCQl0Yi0+aW5zZXJ0X3NpemVbaF0gLT0gRENfU0laRTsKKwkJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBEQ19TSVpFKTsKKworCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiU2gsIDApOworCisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJCWNoZWNrX2ludGVybmFsKHRiU2gpOworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCisJCS8qIHB1dCBuZXcgcm9vdCBpbnRvIHBhdGggc3RydWN0dXJlICovCisJCVBBVEhfT0ZGU0VUX1BCVUZGRVIodGItPnRiX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPQorCQkgICAgdGJTaDsKKworCQkvKiBDaGFuZ2Ugcm9vdCBpbiBzdHJ1Y3R1cmUgc3VwZXIgYmxvY2suICovCisJCVBVVF9TQl9ST09UX0JMT0NLKHRiLT50Yl9zYiwgdGJTaC0+Yl9ibG9ja25yKTsKKwkJUFVUX1NCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYiwgU0JfVFJFRV9IRUlHSFQodGItPnRiX3NiKSArIDEpOworCQlkb19iYWxhbmNlX21hcmtfc2JfZGlydHkodGIsIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfc2JoLCAxKTsKKwl9CisKKwlpZiAodGItPmJsa251bVtoXSA9PSAyKSB7CisJCWludCBzbnVtOworCQlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCisJCS8qIFNfbmV3ID0gZnJlZSBidWZmZXIgZnJvbSBsaXN0IEZFQiAqLworCQlTX25ldyA9IGdldF9GRUIodGIpOworCisJCXNldF9ibGtoX2xldmVsKEJfQkxLX0hFQUQoU19uZXcpLCBoICsgMSk7CisKKwkJZGVzdF9iaS50YiA9IHRiOworCQlkZXN0X2JpLmJpX2JoID0gU19uZXc7CisJCWRlc3RfYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJZGVzdF9iaS5iaV9wb3NpdGlvbiA9IDA7CisJCXNyY19iaS50YiA9IHRiOworCQlzcmNfYmkuYmlfYmggPSB0YlNoOworCQlzcmNfYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpOworCQlzcmNfYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKKworCQluID0gQl9OUl9JVEVNUyh0YlNoKTsJLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KKwkJc251bSA9IChpbnNlcnRfbnVtICsgbiArIDEpIC8gMjsKKwkJaWYgKG4gLSBzbnVtID49IGNoaWxkX3BvcykgeworCQkJLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBTX25ldyAqLworCQkJLyogIHN0b3JlIHRoZSBkZWxpbWl0aW5nIGtleSBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KKwkJCS8qIG5ld19pbnNlcnRfa2V5ID0gKG4gLSBzbnVtKSd0aCBrZXkgaW4gU1toXSAqLworCQkJbWVtY3B5KCZuZXdfaW5zZXJ0X2tleSwgQl9OX1BERUxJTV9LRVkodGJTaCwgbiAtIHNudW0pLAorCQkJICAgICAgIEtFWV9TSVpFKTsKKwkJCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KKwkJCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoJmRlc3RfYmksICZzcmNfYmksCisJCQkJCQkgICAgIExBU1RfVE9fRklSU1QsIHNudW0sIDApOworCQkJLyogICAgICAgICAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKFNfbmV3LCB0YlNoLCBMQVNUX1RPX0ZJUlNULCBzbnVtLCAwKTsgKi8KKwkJfSBlbHNlIGlmIChuICsgaW5zZXJ0X251bSAtIHNudW0gPCBjaGlsZF9wb3MpIHsKKwkJCS8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIFNfbmV3ICovCisJCQkvKiAgc3RvcmUgdGhlIGRlbGltaXRpbmcga2V5IGZvciB0aGUgbmV4dCBsZXZlbCAqLworCQkJLyogbmV3X2luc2VydF9rZXkgPSAobiArIGluc2VydF9pdGVtIC0gc251bSkndGgga2V5IGluIFNbaF0gKi8KKwkJCW1lbWNweSgmbmV3X2luc2VydF9rZXksCisJCQkgICAgICAgQl9OX1BERUxJTV9LRVkodGJTaCwgbiArIGluc2VydF9udW0gLSBzbnVtKSwKKwkJCSAgICAgICBLRVlfU0laRSk7CisJCQkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyICovCisJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLAorCQkJCQkJICAgICBMQVNUX1RPX0ZJUlNULAorCQkJCQkJICAgICBzbnVtIC0gaW5zZXJ0X251bSwgMCk7CisJCQkvKiAgICAgICAgICAgICAgICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoU19uZXcsdGJTaCwxLHNudW0gLSBpbnNlcnRfbnVtLDApOyAqLworCisJCQkvKiBpbnNlcnQgaW5zZXJ0X251bSBrZXlzIGFuZCBub2RlLXBvaW50ZXJzIGludG8gU19uZXcgKi8KKwkJCWludGVybmFsX2luc2VydF9jaGlsZHMoJmRlc3RfYmksCisJCQkJCSAgICAgICAvKlNfbmV3LHRiLT5TW2gtMV0tPmJfbmV4dCwgKi8KKwkJCQkJICAgICAgIGNoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsKKwkJCQkJICAgICAgIHNudW0gLSAxLAorCQkJCQkgICAgICAgaW5zZXJ0X251bSwgaW5zZXJ0X2tleSwKKwkJCQkJICAgICAgIGluc2VydF9wdHIpOworCisJCQlpbnNlcnRfbnVtID0gMDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKKworCQkJLyogc29tZSBpdGVtcyBmYWxsIGludG8gU19uZXcsIGJ1dCBzb21lIGRvbid0IGZhbGwgKi8KKwkJCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KKwkJCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoJmRlc3RfYmksICZzcmNfYmksCisJCQkJCQkgICAgIExBU1RfVE9fRklSU1QsCisJCQkJCQkgICAgIG4gLSBjaGlsZF9wb3MgKyAxLCAxKTsKKwkJCS8qICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhTX25ldyx0YlNoLDEsbiAtIGNoaWxkX3BvcyArIDEsMSk7ICovCisJCQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBTX25ldyAqLworCQkJayA9IHNudW0gLSBuICsgY2hpbGRfcG9zIC0gMTsKKworCQkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcygmZGVzdF9iaSwgLypTX25ldywgKi8gMCwgaywKKwkJCQkJICAgICAgIGluc2VydF9rZXkgKyAxLCBpbnNlcnRfcHRyICsgMSk7CisKKwkJCS8qIG5ld19pbnNlcnRfa2V5ID0gaW5zZXJ0X2tleVtpbnNlcnRfbnVtIC0gayAtIDFdICovCisJCQltZW1jcHkoJm5ld19pbnNlcnRfa2V5LCBpbnNlcnRfa2V5ICsgaW5zZXJ0X251bSAtIGsgLSAxLAorCQkJICAgICAgIEtFWV9TSVpFKTsKKwkJCS8qIHJlcGxhY2UgZmlyc3Qgbm9kZS1wdHIgaW4gU19uZXcgYnkgbm9kZS1wdHIgdG8gaW5zZXJ0X3B0cltpbnNlcnRfbnVtLWstMV0gKi8KKworCQkJZGMgPSBCX05fQ0hJTEQoU19uZXcsIDApOworCQkJcHV0X2RjX3NpemUoZGMsCisJCQkJICAgIChNQVhfQ0hJTERfU0laRQorCQkJCSAgICAgKGluc2VydF9wdHJbaW5zZXJ0X251bSAtIGsgLSAxXSkgLQorCQkJCSAgICAgQl9GUkVFX1NQQUNFKGluc2VydF9wdHIKKwkJCQkJCSAgW2luc2VydF9udW0gLSBrIC0gMV0pKSk7CisJCQlwdXRfZGNfYmxvY2tfbnVtYmVyKGRjLAorCQkJCQkgICAgaW5zZXJ0X3B0cltpbnNlcnRfbnVtIC0gayAtCisJCQkJCQkgICAgICAgMV0tPmJfYmxvY2tucik7CisKKwkJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSh0YiwgU19uZXcsIDApOworCisJCQlpbnNlcnRfbnVtIC09IChrICsgMSk7CisJCX0KKwkJLyogbmV3X2luc2VydF9wdHIgPSBub2RlX3BvaW50ZXIgdG8gU19uZXcgKi8KKwkJbmV3X2luc2VydF9wdHIgPSBTX25ldzsKKworCQlSRkFMU0UoIWJ1ZmZlcl9qb3VybmFsZWQoU19uZXcpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KFNfbmV3KQorCQkgICAgICAgfHwgYnVmZmVyX2RpcnR5KFNfbmV3KSwgImNtLTAwMDAxOiBiYWQgU19uZXcgKCViKSIsCisJCSAgICAgICBTX25ldyk7CisKKwkJLy8gU19uZXcgaXMgcmVsZWFzZWQgaW4gdW5maXhfbm9kZXMKKwl9CisKKwluID0gQl9OUl9JVEVNUyh0YlNoKTsJLypudW1iZXIgb2YgaXRlbXMgaW4gU1toXSAqLworCisJaWYgKDAgPD0gY2hpbGRfcG9zICYmIGNoaWxkX3BvcyA8PSBuICYmIGluc2VydF9udW0gPiAwKSB7CisJCWJpLnRiID0gdGI7CisJCWJpLmJpX2JoID0gdGJTaDsKKwkJYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpOworCQliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOworCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwJLyp0YlNoLCAqLworCQkJCSAgICAgICAvKiAgICAgICAgICAoIHRiLT5TW2gtMV0tPmJfcGFyZW50ID09IHRiLT5TW2hdICkgPyB0Yi0+U1toLTFdLT5iX25leHQgOiAgdGItPlNbaF0tPmJfY2hpbGQtPmJfbmV4dCwgKi8KKwkJCQkgICAgICAgY2hpbGRfcG9zLCBpbnNlcnRfbnVtLCBpbnNlcnRfa2V5LAorCQkJCSAgICAgICBpbnNlcnRfcHRyKTsKKwl9CisKKwltZW1jcHkobmV3X2luc2VydF9rZXlfYWRkciwgJm5ld19pbnNlcnRfa2V5LCBLRVlfU0laRSk7CiAJaW5zZXJ0X3B0clswXSA9IG5ld19pbnNlcnRfcHRyOwogCiAJcmV0dXJuIG9yZGVyOwotICAgIH0KLQotICAKLSAgICAKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lub2RlLmMgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCmluZGV4IDI4OWQ4NjQuLjFhYWYyYzcgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2lub2RlLmMKKysrIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwpAQCAtMTgsMTA3ICsxOCwxMDkgQEAKICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCi1leHRlcm4gaW50IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsgLyogZGVmYXVsdCBpbyBzaXplIGRldnVuZWQgaW4gc3VwZXIuYyAqLworZXh0ZXJuIGludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7CS8qIGRlZmF1bHQgaW8gc2l6ZSBkZXZ1bmVkIGluIHN1cGVyLmMgKi8KIAogc3RhdGljIGludCByZWlzZXJmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICpwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOworCQkJCSB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CiBzdGF0aWMgaW50IHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOwogCi12b2lkIHJlaXNlcmZzX2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit2b2lkIHJlaXNlcmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSBxdW90YSB1cGRhdGUgKHBvc3NpYmx5IGRlbGV0ZSkgKi8KLSAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiAqIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApIHF1b3RhIHVwZGF0ZSAocG9zc2libHkgZGVsZXRlKSAqLworCWludCBqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKworCSAgICAyICogUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoaW5vZGUtPmlfc2IpOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CiAKLSAgICAvKiBUaGUgPSAwIGhhcHBlbnMgd2hlbiB3ZSBhYm9ydCBjcmVhdGluZyBhIG5ldyBpbm9kZSBmb3Igc29tZSByZWFzb24gbGlrZSBsYWNrIG9mIHNwYWNlLi4gKi8KLSAgICBpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSAmJiBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZCAhPSAwKSB7IC8qIGFsc28gaGFuZGxlcyBiYWRfaW5vZGUgY2FzZSAqLwotCWRvd24gKCZpbm9kZS0+aV9zZW0pOyAKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAotCXJlaXNlcmZzX2RlbGV0ZV94YXR0cnMgKGlub2RlKTsKKwkvKiBUaGUgPSAwIGhhcHBlbnMgd2hlbiB3ZSBhYm9ydCBjcmVhdGluZyBhIG5ldyBpbm9kZSBmb3Igc29tZSByZWFzb24gbGlrZSBsYWNrIG9mIHNwYWNlLi4gKi8KKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSAmJiBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZCAhPSAwKSB7CS8qIGFsc28gaGFuZGxlcyBiYWRfaW5vZGUgY2FzZSAqLworCQlkb3duKCZpbm9kZS0+aV9zZW0pOwogCi0JaWYgKGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSkgewotCSAgICB1cCAoJmlub2RlLT5pX3NlbSk7Ci0JICAgIGdvdG8gb3V0OworCQlyZWlzZXJmc19kZWxldGVfeGF0dHJzKGlub2RlKTsKKworCQlpZiAoam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7CisJCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisKKwkJaWYgKHJlaXNlcmZzX2RlbGV0ZV9vYmplY3QoJnRoLCBpbm9kZSkpIHsKKwkJCXVwKCZpbm9kZS0+aV9zZW0pOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBEbyBxdW90YSB1cGRhdGUgaW5zaWRlIGEgdHJhbnNhY3Rpb24gZm9yIGpvdXJuYWxlZCBxdW90YXMuIFdlIG11c3QgZG8gdGhhdAorCQkgKiBhZnRlciBkZWxldGVfb2JqZWN0IHNvIHRoYXQgcXVvdGEgdXBkYXRlcyBnbyBpbnRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzCisJCSAqIHN0YXQgZGF0YSBkZWxldGlvbiAqLworCQlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKworCQlpZiAoam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSkgeworCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXVwKCZpbm9kZS0+aV9zZW0pOworCisJCS8qIGFsbCBpdGVtcyBvZiBmaWxlIGFyZSBkZWxldGVkLCBzbyB3ZSBjYW4gcmVtb3ZlICJzYXZlIiBsaW5rICovCisJCXJlbW92ZV9zYXZlX2xpbmsoaW5vZGUsIDAgLyogbm90IHRydW5jYXRlICovICk7CS8qIHdlIGNhbid0IGRvIGFueXRoaW5nCisJCQkJCQkJCSAqIGFib3V0IGFuIGVycm9yIGhlcmUgKi8KKwl9IGVsc2UgeworCQkvKiBubyBvYmplY3QgaXRlbXMgYXJlIGluIHRoZSB0cmVlICovCisJCTsKIAl9Ci0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0KLQlpZiAocmVpc2VyZnNfZGVsZXRlX29iamVjdCAoJnRoLCBpbm9kZSkpIHsKLQkgICAgdXAgKCZpbm9kZS0+aV9zZW0pOwotCSAgICBnb3RvIG91dDsKLQl9Ci0KLQkvKiBEbyBxdW90YSB1cGRhdGUgaW5zaWRlIGEgdHJhbnNhY3Rpb24gZm9yIGpvdXJuYWxlZCBxdW90YXMuIFdlIG11c3QgZG8gdGhhdAotCSAqIGFmdGVyIGRlbGV0ZV9vYmplY3Qgc28gdGhhdCBxdW90YSB1cGRhdGVzIGdvIGludG8gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMKLQkgKiBzdGF0IGRhdGEgZGVsZXRpb24gKi8KLQlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKLQotCWlmIChqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7Ci0JICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKLQkgICAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKLQotICAgICAgICAvKiBhbGwgaXRlbXMgb2YgZmlsZSBhcmUgZGVsZXRlZCwgc28gd2UgY2FuIHJlbW92ZSAic2F2ZSIgbGluayAqLwotCXJlbW92ZV9zYXZlX2xpbmsgKGlub2RlLCAwLyogbm90IHRydW5jYXRlICovKTsgLyogd2UgY2FuJ3QgZG8gYW55dGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhYm91dCBhbiBlcnJvciBoZXJlICovCi0gICAgfSBlbHNlIHsKLQkvKiBubyBvYmplY3QgaXRlbXMgYXJlIGluIHRoZSB0cmVlICovCi0JOwotICAgIH0KLW91dDoKLSAgICBjbGVhcl9pbm9kZSAoaW5vZGUpOyAvKiBub3RlIHRoaXMgbXVzdCBnbyBhZnRlciB0aGUgam91cm5hbF9lbmQgdG8gcHJldmVudCBkZWFkbG9jayAqLwotICAgIGlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICAgIG91dDoKKwljbGVhcl9pbm9kZShpbm9kZSk7CS8qIG5vdGUgdGhpcyBtdXN0IGdvIGFmdGVyIHRoZSBqb3VybmFsX2VuZCB0byBwcmV2ZW50IGRlYWRsb2NrICovCisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogfQogCi1zdGF0aWMgdm9pZCBfbWFrZV9jcHVfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSwgaW50IHZlcnNpb24sIF9fdTMyIGRpcmlkLCBfX3UzMiBvYmplY3RpZCwgCi0JICAgICAgIGxvZmZfdCBvZmZzZXQsIGludCB0eXBlLCBpbnQgbGVuZ3RoICkKK3N0YXRpYyB2b2lkIF9tYWtlX2NwdV9rZXkoc3RydWN0IGNwdV9rZXkgKmtleSwgaW50IHZlcnNpb24sIF9fdTMyIGRpcmlkLAorCQkJICBfX3UzMiBvYmplY3RpZCwgbG9mZl90IG9mZnNldCwgaW50IHR5cGUsIGludCBsZW5ndGgpCiB7Ci0gICAga2V5LT52ZXJzaW9uID0gdmVyc2lvbjsKKwlrZXktPnZlcnNpb24gPSB2ZXJzaW9uOwogCi0gICAga2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGRpcmlkOwotICAgIGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCA9IG9iamVjdGlkOwotICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0IChrZXksIG9mZnNldCk7Ci0gICAgc2V0X2NwdV9rZXlfa190eXBlIChrZXksIHR5cGUpOyAgCi0gICAga2V5LT5rZXlfbGVuZ3RoID0gbGVuZ3RoOworCWtleS0+b25fZGlza19rZXkua19kaXJfaWQgPSBkaXJpZDsKKwlrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBvYmplY3RpZDsKKwlzZXRfY3B1X2tleV9rX29mZnNldChrZXksIG9mZnNldCk7CisJc2V0X2NwdV9rZXlfa190eXBlKGtleSwgdHlwZSk7CisJa2V5LT5rZXlfbGVuZ3RoID0gbGVuZ3RoOwogfQogCi0KIC8qIHRha2UgYmFzZSBvZiBpbm9kZV9rZXkgKGl0IGNvbWVzIGZyb20gaW5vZGUgYWx3YXlzKSAoZGlyaWQsIG9iamVjdGlkKSBhbmQgdmVyc2lvbiBmcm9tIGFuIGlub2RlLCBzZXQKICAgIG9mZnNldCBhbmQgdHlwZSBvZiBrZXkgKi8KLXZvaWQgbWFrZV9jcHVfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSwgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBvZmZzZXQsCi0JICAgICAgaW50IHR5cGUsIGludCBsZW5ndGggKQordm9pZCBtYWtlX2NwdV9rZXkoc3RydWN0IGNwdV9rZXkgKmtleSwgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwKKwkJICBpbnQgdHlwZSwgaW50IGxlbmd0aCkKIHsKLSAgX21ha2VfY3B1X2tleSAoa2V5LCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUpLCBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCksCi0JCSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoaW5vZGUpLT5rX29iamVjdGlkKSwgCi0JCSBvZmZzZXQsIHR5cGUsIGxlbmd0aCk7CisJX21ha2VfY3B1X2tleShrZXksIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwKKwkJICAgICAgbGUzMl90b19jcHUoSU5PREVfUEtFWShpbm9kZSktPmtfZGlyX2lkKSwKKwkJICAgICAgbGUzMl90b19jcHUoSU5PREVfUEtFWShpbm9kZSktPmtfb2JqZWN0aWQpLCBvZmZzZXQsIHR5cGUsCisJCSAgICAgIGxlbmd0aCk7CiB9CiAKLQogLy8KIC8vIHdoZW4ga2V5IGlzIDAsIGRvIG5vdCBzZXQgdmVyc2lvbiBhbmQgc2hvcnQga2V5CiAvLwotaW5saW5lIHZvaWQgbWFrZV9sZV9pdGVtX2hlYWQgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXksCi0JCQkgICAgICAgaW50IHZlcnNpb24sCi0JCQkgICAgICAgbG9mZl90IG9mZnNldCwgaW50IHR5cGUsIGludCBsZW5ndGgsIAotCQkJICAgICAgIGludCBlbnRyeV9jb3VudC8qb3IgaWhfZnJlZV9zcGFjZSovKQoraW5saW5lIHZvaWQgbWFrZV9sZV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkgICAgICBpbnQgdmVyc2lvbiwKKwkJCSAgICAgIGxvZmZfdCBvZmZzZXQsIGludCB0eXBlLCBpbnQgbGVuZ3RoLAorCQkJICAgICAgaW50IGVudHJ5X2NvdW50IC8qb3IgaWhfZnJlZV9zcGFjZSAqLyApCiB7Ci0gICAgaWYgKGtleSkgewotCWloLT5paF9rZXkua19kaXJfaWQgPSBjcHVfdG9fbGUzMiAoa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCk7Ci0JaWgtPmloX2tleS5rX29iamVjdGlkID0gY3B1X3RvX2xlMzIgKGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCk7Ci0gICAgfQotICAgIHB1dF9paF92ZXJzaW9uKCBpaCwgdmVyc2lvbiApOwotICAgIHNldF9sZV9paF9rX29mZnNldCAoaWgsIG9mZnNldCk7Ci0gICAgc2V0X2xlX2loX2tfdHlwZSAoaWgsIHR5cGUpOwotICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIGxlbmd0aCApOwotICAgIC8qICAgIHNldF9paF9mcmVlX3NwYWNlIChpaCwgMCk7Ki8KLSAgICAvLyBmb3IgZGlyZWN0b3J5IGl0ZW1zIGl0IGlzIGVudHJ5IGNvdW50LCBmb3IgZGlyZWN0cyBhbmQgc3RhdAotICAgIC8vIGRhdGFzIC0gMHhmZmZmLCBmb3IgaW5kaXJlY3RzIC0gMAotICAgIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGVudHJ5X2NvdW50ICk7CisJaWYgKGtleSkgeworCQlpaC0+aWhfa2V5LmtfZGlyX2lkID0gY3B1X3RvX2xlMzIoa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCk7CisJCWloLT5paF9rZXkua19vYmplY3RpZCA9CisJCSAgICBjcHVfdG9fbGUzMihrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpOworCX0KKwlwdXRfaWhfdmVyc2lvbihpaCwgdmVyc2lvbik7CisJc2V0X2xlX2loX2tfb2Zmc2V0KGloLCBvZmZzZXQpOworCXNldF9sZV9paF9rX3R5cGUoaWgsIHR5cGUpOworCXB1dF9paF9pdGVtX2xlbihpaCwgbGVuZ3RoKTsKKwkvKiAgICBzZXRfaWhfZnJlZV9zcGFjZSAoaWgsIDApOyAqLworCS8vIGZvciBkaXJlY3RvcnkgaXRlbXMgaXQgaXMgZW50cnkgY291bnQsIGZvciBkaXJlY3RzIGFuZCBzdGF0CisJLy8gZGF0YXMgLSAweGZmZmYsIGZvciBpbmRpcmVjdHMgLSAwCisJcHV0X2loX2VudHJ5X2NvdW50KGloLCBlbnRyeV9jb3VudCk7CiB9CiAKIC8vCkBAIC0xNTMsODQgKzE1NSw4NCBAQAogKiogdG8gYmUgdW5tYXBwZWQsIHNvIHRoYXQgYmxvY2tfcHJlcGFyZV93cml0ZSB3aWxsIGNvcnJlY3RseSBjYWxsCiAqKiByZWlzZXJmc19nZXRfYmxvY2sgdG8gY29udmVydCB0aGUgdGFpbCBpbnRvIGFuIHVuZm9ybWF0dGVkIG5vZGUKICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZml4X3RhaWxfcGFnZV9mb3Jfd3JpdGluZyhzdHJ1Y3QgcGFnZSAqcGFnZSkgewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKm5leHQsICpiaCA7CitzdGF0aWMgaW5saW5lIHZvaWQgZml4X3RhaWxfcGFnZV9mb3Jfd3JpdGluZyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpuZXh0LCAqYmg7CiAKLSAgICBpZiAocGFnZSAmJiBwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7Ci0JaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSA7Ci0JYmggPSBoZWFkIDsKLQlkbyB7Ci0JICAgIG5leHQgPSBiaC0+Yl90aGlzX3BhZ2UgOwotCSAgICBpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciA9PSAwKSB7Ci0JICAgICAgICByZWlzZXJmc191bm1hcF9idWZmZXIoYmgpIDsKLQkgICAgfQotCSAgICBiaCA9IG5leHQgOwotCX0gd2hpbGUgKGJoICE9IGhlYWQpIDsKLSAgICB9CisJaWYgKHBhZ2UgJiYgcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQliaCA9IGhlYWQ7CisJCWRvIHsKKwkJCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciA9PSAwKSB7CisJCQkJcmVpc2VyZnNfdW5tYXBfYnVmZmVyKGJoKTsKKwkJCX0KKwkJCWJoID0gbmV4dDsKKwkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJfQogfQogCiAvKiByZWlzZXJmc19nZXRfYmxvY2sgZG9lcyBub3QgbmVlZCB0byBhbGxvY2F0ZSBhIGJsb2NrIG9ubHkgaWYgaXQgaGFzIGJlZW4KICAgIGRvbmUgYWxyZWFkeSBvciBub24taG9sZSBwb3NpdGlvbiBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgaW5kaXJlY3QgaXRlbSAqLwotc3RhdGljIGlubGluZSBpbnQgYWxsb2NhdGlvbl9uZWVkZWQgKGludCByZXR2YWwsIGJfYmxvY2tucl90IGFsbG9jYXRlZCwgCi0JCQkJICAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsCi0JCQkJICAgICBfX2xlMzIgKiBpdGVtLCBpbnQgcG9zX2luX2l0ZW0pCitzdGF0aWMgaW5saW5lIGludCBhbGxvY2F0aW9uX25lZWRlZChpbnQgcmV0dmFsLCBiX2Jsb2NrbnJfdCBhbGxvY2F0ZWQsCisJCQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloLAorCQkJCSAgICBfX2xlMzIgKiBpdGVtLCBpbnQgcG9zX2luX2l0ZW0pCiB7Ci0gIGlmIChhbGxvY2F0ZWQpCi0JIHJldHVybiAwOwotICBpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EICYmIGlzX2luZGlyZWN0X2xlX2loIChpaCkgJiYgCi0gICAgICBnZXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtKSkKLQkgcmV0dXJuIDA7Ci0gIHJldHVybiAxOworCWlmIChhbGxvY2F0ZWQpCisJCXJldHVybiAwOworCWlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQgJiYgaXNfaW5kaXJlY3RfbGVfaWgoaWgpICYmCisJICAgIGdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaW5kaXJlY3RfaXRlbV9mb3VuZCAoaW50IHJldHZhbCwgc3RydWN0IGl0ZW1faGVhZCAqIGloKQorc3RhdGljIGlubGluZSBpbnQgaW5kaXJlY3RfaXRlbV9mb3VuZChpbnQgcmV0dmFsLCBzdHJ1Y3QgaXRlbV9oZWFkICppaCkKIHsKLSAgcmV0dXJuIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpICYmIGlzX2luZGlyZWN0X2xlX2loIChpaCk7CisJcmV0dXJuIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpICYmIGlzX2luZGlyZWN0X2xlX2loKGloKTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2Jsb2NrX2Rldl9tYXBwZWQgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAKLQkJCQkJIGJfYmxvY2tucl90IGJsb2NrLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxvY2tfZGV2X21hcHBlZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCQliX2Jsb2NrbnJfdCBibG9jaywgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAltYXBfYmgoYmgsIGlub2RlLT5pX3NiLCBibG9jayk7CiB9CiAKLQogLy8KIC8vIGZpbGVzIHdoaWNoIHdlcmUgY3JlYXRlZCBpbiB0aGUgZWFybGllciB2ZXJzaW9uIGNhbiBub3QgYmUgbG9uZ2VyLAogLy8gdGhhbiAyIGdiCiAvLwotc3RhdGljIGludCBmaWxlX2NhcGFibGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb25nIGJsb2NrKQorc3RhdGljIGludCBmaWxlX2NhcGFibGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBibG9jaykKIHsKLSAgICBpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKSAhPSBLRVlfRk9STUFUXzNfNSB8fCAvLyBpdCBpcyBuZXcgZmlsZS4KLQlibG9jayA8ICgxIDw8ICgzMSAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkpIC8vIG9sZCBmaWxlLCBidXQgJ2Jsb2NrJyBpcyBpbnNpZGUgb2YgMmdiCi0JcmV0dXJuIDE7CisJaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSAhPSBLRVlfRk9STUFUXzNfNSB8fAkvLyBpdCBpcyBuZXcgZmlsZS4KKwkgICAgYmxvY2sgPCAoMSA8PCAoMzEgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpKQkvLyBvbGQgZmlsZSwgYnV0ICdibG9jaycgaXMgaW5zaWRlIG9mIDJnYgorCQlyZXR1cm4gMTsKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAvKnN0YXRpYyovIGludCByZXN0YXJ0X3RyYW5zYWN0aW9uKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKSB7Ci0gIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyIDsKLSAgaW50IGxlbiA9IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgOwotICBpbnQgZXJyOworCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOworCWludCBsZW4gPSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkOworCWludCBlcnI7CiAKLSAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICBCVUdfT04gKCF0aC0+dF9yZWZjb3VudCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF9yZWZjb3VudCk7CiAKLSAgLyogd2UgY2Fubm90IHJlc3RhcnQgd2hpbGUgbmVzdGVkICovCi0gIGlmICh0aC0+dF9yZWZjb3VudCA+IDEpIHsKLSAgICAgIHJldHVybiAwICA7Ci0gIH0KLSAgcGF0aHJlbHNlKHBhdGgpIDsKLSAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOwotICBlcnIgPSBqb3VybmFsX2VuZCh0aCwgcywgbGVuKSA7Ci0gIGlmICghZXJyKSB7Ci0gICAgICBlcnIgPSBqb3VybmFsX2JlZ2luKHRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDYpIDsKLSAgICAgIGlmICghZXJyKQotICAgICAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLSAgfQotICByZXR1cm4gZXJyOworCS8qIHdlIGNhbm5vdCByZXN0YXJ0IHdoaWxlIG5lc3RlZCAqLworCWlmICh0aC0+dF9yZWZjb3VudCA+IDEpIHsKKwkJcmV0dXJuIDA7CisJfQorCXBhdGhyZWxzZShwYXRoKTsKKwlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwllcnIgPSBqb3VybmFsX2VuZCh0aCwgcywgbGVuKTsKKwlpZiAoIWVycikgeworCQllcnIgPSBqb3VybmFsX2JlZ2luKHRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDYpOworCQlpZiAoIWVycikKKwkJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJfQorCXJldHVybiBlcnI7CiB9CiAKIC8vIGl0IGlzIGNhbGxlZCBieSBnZXRfYmxvY2sgd2hlbiBjcmVhdGUgPT0gMC4gUmV0dXJucyBibG9jayBudW1iZXIKQEAgLTI0MSwxOTAgKzI0MywxOTIgQEAKIC8vIFBsZWFzZSBpbXByb3ZlIHRoZSBlbmdsaXNoL2NsYXJpdHkgaW4gdGhlIGNvbW1lbnQgYWJvdmUsIGFzIGl0IGlzCiAvLyBoYXJkIHRvIHVuZGVyc3RhbmQuCiAKLXN0YXRpYyBpbnQgX2dldF9ibG9ja19jcmVhdGVfMCAoc3RydWN0IGlub2RlICogaW5vZGUsIGxvbmcgYmxvY2ssCi0JCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3Jlc3VsdCwKLQkJCQkgaW50IGFyZ3MpCitzdGF0aWMgaW50IF9nZXRfYmxvY2tfY3JlYXRlXzAoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBibG9jaywKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGFyZ3MpCiB7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCB0bXBfaWg7Ci0gICAgaW50IGZzX2dlbiA7Ci0gICAgaW50IGJsb2NrbnI7Ci0gICAgY2hhciAqIHAgPSBOVUxMOwotICAgIGludCBjaGFyczsKLSAgICBpbnQgcmV0IDsKLSAgICBpbnQgcmVzdWx0IDsKLSAgICBpbnQgZG9uZSA9IDAgOwotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0IDsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGl0ZW1faGVhZCAqaWgsIHRtcF9paDsKKwlpbnQgZnNfZ2VuOworCWludCBibG9ja25yOworCWNoYXIgKnAgPSBOVUxMOworCWludCBjaGFyczsKKwlpbnQgcmV0OworCWludCByZXN1bHQ7CisJaW50IGRvbmUgPSAwOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCi0gICAgLy8gcHJlcGFyZSB0aGUga2V5IHRvIGxvb2sgZm9yIHRoZSAnYmxvY2snLXRoIGJsb2NrIG9mIGZpbGUKLSAgICBtYWtlX2NwdV9rZXkgKCZrZXksIGlub2RlLAotCQkgIChsb2ZmX3QpYmxvY2sgKiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgKyAxLCBUWVBFX0FOWSwgMyk7CisJLy8gcHJlcGFyZSB0aGUga2V5IHRvIGxvb2sgZm9yIHRoZSAnYmxvY2snLXRoIGJsb2NrIG9mIGZpbGUKKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsCisJCSAgICAgKGxvZmZfdCkgYmxvY2sgKiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgKyAxLCBUWVBFX0FOWSwKKwkJICAgICAzKTsKIAotcmVzZWFyY2g6Ci0gICAgcmVzdWx0ID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCkgOwotICAgIGlmIChyZXN1bHQgIT0gUE9TSVRJT05fRk9VTkQpIHsKLQlwYXRocmVsc2UgKCZwYXRoKTsKLSAgICAgICAgaWYgKHApCi0gICAgICAgICAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLQlpZiAocmVzdWx0ID09IElPX0VSUk9SKQotCSAgICByZXR1cm4gLUVJTzsKLQkvLyBXZSBkbyBub3QgcmV0dXJuIC1FTk9FTlQgaWYgdGhlcmUgaXMgYSBob2xlIGJ1dCBwYWdlIGlzIHVwdG9kYXRlLCBiZWNhdXNlIGl0IG1lYW5zCi0JLy8gVGhhdCB0aGVyZSBpcyBzb21lIE1NQVBFRCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGF0IGlzIHlldCB0byBiZSB3cml0dGVuIHRvIGRpc2suCi0JaWYgKChhcmdzICYgR0VUX0JMT0NLX05PX0hPTEUpICYmICFQYWdlVXB0b2RhdGUoYmhfcmVzdWx0LT5iX3BhZ2UpICkgewotCSAgICByZXR1cm4gLUVOT0VOVCA7CisgICAgICByZXNlYXJjaDoKKwlyZXN1bHQgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCWlmIChyZXN1bHQgIT0gUE9TSVRJT05fRk9VTkQpIHsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJaWYgKHApCisJCQlrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOworCQlpZiAocmVzdWx0ID09IElPX0VSUk9SKQorCQkJcmV0dXJuIC1FSU87CisJCS8vIFdlIGRvIG5vdCByZXR1cm4gLUVOT0VOVCBpZiB0aGVyZSBpcyBhIGhvbGUgYnV0IHBhZ2UgaXMgdXB0b2RhdGUsIGJlY2F1c2UgaXQgbWVhbnMKKwkJLy8gVGhhdCB0aGVyZSBpcyBzb21lIE1NQVBFRCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGF0IGlzIHlldCB0byBiZSB3cml0dGVuIHRvIGRpc2suCisJCWlmICgoYXJncyAmIEdFVF9CTE9DS19OT19IT0xFKQorCQkgICAgJiYgIVBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkpIHsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCXJldHVybiAwOwogCX0KLSAgICAgICAgcmV0dXJuIDAgOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIGJoID0gZ2V0X2xhc3RfYmggKCZwYXRoKTsKLSAgICBpaCA9IGdldF9paCAoJnBhdGgpOwotICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAoaWgpKSB7Ci0JX19sZTMyICogaW5kX2l0ZW0gPSAoX19sZTMyICopQl9JX1BJVEVNIChiaCwgaWgpOwotCQotCS8qIEZJWE1FOiBoZXJlIHdlIGNvdWxkIGNhY2hlIGluZGlyZWN0IGl0ZW0gb3IgcGFydCBvZiBpdCBpbgotCSAgIHRoZSBpbm9kZSB0byBhdm9pZCBzZWFyY2hfYnlfa2V5IGluIGNhc2Ugb2Ygc3Vic2VxdWVudAotCSAgIGFjY2VzcyB0byBmaWxlICovCi0JYmxvY2tuciA9IGdldF9ibG9ja19udW0oaW5kX2l0ZW0sIHBhdGgucG9zX2luX2l0ZW0pIDsKLQlyZXQgPSAwIDsKLQlpZiAoYmxvY2tucikgewotCSAgICBtYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgYmxvY2tucik7Ci0JICAgIGlmIChwYXRoLnBvc19pbl9pdGVtID09ICgoaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUpIC0gMSkpIHsKLQkJc2V0X2J1ZmZlcl9ib3VuZGFyeShiaF9yZXN1bHQpOwotCSAgICB9Ci0JfSBlbHNlIAotCSAgICAvLyBXZSBkbyBub3QgcmV0dXJuIC1FTk9FTlQgaWYgdGhlcmUgaXMgYSBob2xlIGJ1dCBwYWdlIGlzIHVwdG9kYXRlLCBiZWNhdXNlIGl0IG1lYW5zCi0JICAgIC8vIFRoYXQgdGhlcmUgaXMgc29tZSBNTUFQRUQgZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgdGhhdCBpcyB5ZXQgdG8gIGJlIHdyaXR0ZW4gdG8gZGlzay4KLQkgICAgaWYgKChhcmdzICYgR0VUX0JMT0NLX05PX0hPTEUpICYmICFQYWdlVXB0b2RhdGUoYmhfcmVzdWx0LT5iX3BhZ2UpICkgewotCSAgICByZXQgPSAtRU5PRU5UIDsKLQkgICAgfQorCS8vCisJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJaWggPSBnZXRfaWgoJnBhdGgpOworCWlmIChpc19pbmRpcmVjdF9sZV9paChpaCkpIHsKKwkJX19sZTMyICppbmRfaXRlbSA9IChfX2xlMzIgKikgQl9JX1BJVEVNKGJoLCBpaCk7CiAKLQlwYXRocmVsc2UgKCZwYXRoKTsKLSAgICAgICAgaWYgKHApCi0gICAgICAgICAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLQlyZXR1cm4gcmV0IDsKLSAgICB9CisJCS8qIEZJWE1FOiBoZXJlIHdlIGNvdWxkIGNhY2hlIGluZGlyZWN0IGl0ZW0gb3IgcGFydCBvZiBpdCBpbgorCQkgICB0aGUgaW5vZGUgdG8gYXZvaWQgc2VhcmNoX2J5X2tleSBpbiBjYXNlIG9mIHN1YnNlcXVlbnQKKwkJICAgYWNjZXNzIHRvIGZpbGUgKi8KKwkJYmxvY2tuciA9IGdldF9ibG9ja19udW0oaW5kX2l0ZW0sIHBhdGgucG9zX2luX2l0ZW0pOworCQlyZXQgPSAwOworCQlpZiAoYmxvY2tucikgeworCQkJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGJsb2NrbnIpOworCQkJaWYgKHBhdGgucG9zX2luX2l0ZW0gPT0KKwkJCSAgICAoKGloX2l0ZW1fbGVuKGloKSAvIFVORk1fUF9TSVpFKSAtIDEpKSB7CisJCQkJc2V0X2J1ZmZlcl9ib3VuZGFyeShiaF9yZXN1bHQpOworCQkJfQorCQl9IGVsc2UKKwkJCS8vIFdlIGRvIG5vdCByZXR1cm4gLUVOT0VOVCBpZiB0aGVyZSBpcyBhIGhvbGUgYnV0IHBhZ2UgaXMgdXB0b2RhdGUsIGJlY2F1c2UgaXQgbWVhbnMKKwkJCS8vIFRoYXQgdGhlcmUgaXMgc29tZSBNTUFQRUQgZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgdGhhdCBpcyB5ZXQgdG8gIGJlIHdyaXR0ZW4gdG8gZGlzay4KKwkJaWYgKChhcmdzICYgR0VUX0JMT0NLX05PX0hPTEUpCisJCQkgICAgJiYgIVBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkpIHsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCX0KIAotICAgIC8vIHJlcXVlc3RlZCBkYXRhIGFyZSBpbiBkaXJlY3QgaXRlbShzKQotICAgIGlmICghKGFyZ3MgJiBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QpKSB7Ci0JLy8gd2UgYXJlIGNhbGxlZCBieSBibWFwLiBGSVhNRTogd2UgY2FuIG5vdCBtYXAgYmxvY2sgb2YgZmlsZQotCS8vIHdoZW4gaXQgaXMgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCi0JcGF0aHJlbHNlICgmcGF0aCk7CQotICAgICAgICBpZiAocCkKLSAgICAgICAgICAgIGt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSkgOwotCXJldHVybiAtRU5PRU5UOwotICAgIH0KKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJaWYgKHApCisJCQlrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOworCQlyZXR1cm4gcmV0OworCX0KKwkvLyByZXF1ZXN0ZWQgZGF0YSBhcmUgaW4gZGlyZWN0IGl0ZW0ocykKKwlpZiAoIShhcmdzICYgR0VUX0JMT0NLX1JFQURfRElSRUNUKSkgeworCQkvLyB3ZSBhcmUgY2FsbGVkIGJ5IGJtYXAuIEZJWE1FOiB3ZSBjYW4gbm90IG1hcCBibG9jayBvZiBmaWxlCisJCS8vIHdoZW4gaXQgaXMgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCWlmIChwKQorCQkJa3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQogCi0gICAgLyogaWYgd2UndmUgZ290IGEgZGlyZWN0IGl0ZW0sIGFuZCB0aGUgYnVmZmVyIG9yIHBhZ2Ugd2FzIHVwdG9kYXRlLAotICAgICoqIHdlIGRvbid0IHdhbnQgdG8gcHVsbCBkYXRhIG9mZiBkaXNrIGFnYWluLiAgc2tpcCB0byB0aGUKLSAgICAqKiBlbmQsIHdoZXJlIHdlIG1hcCB0aGUgYnVmZmVyIGFuZCByZXR1cm4KLSAgICAqLwotICAgIGlmIChidWZmZXJfdXB0b2RhdGUoYmhfcmVzdWx0KSkgewotICAgICAgICBnb3RvIGZpbmlzaGVkIDsKLSAgICB9IGVsc2UgCi0JLyoKLQkqKiBncmFiX3RhaWxfcGFnZSBjYW4gdHJpZ2dlciBjYWxscyB0byByZWlzZXJmc19nZXRfYmxvY2sgb24gdXAgdG8gZGF0ZQotCSoqIHBhZ2VzIHdpdGhvdXQgYW55IGJ1ZmZlcnMuICBJZiB0aGUgcGFnZSBpcyB1cCB0byBkYXRlLCB3ZSBkb24ndCB3YW50Ci0JKiogcmVhZCBvbGQgZGF0YSBvZmYgZGlzay4gIFNldCB0aGUgdXAgdG8gZGF0ZSBiaXQgb24gdGhlIGJ1ZmZlciBpbnN0ZWFkCi0JKiogYW5kIGp1bXAgdG8gdGhlIGVuZAotCSovCi0JICAgIGlmICghYmhfcmVzdWx0LT5iX3BhZ2UgfHwgUGFnZVVwdG9kYXRlKGJoX3Jlc3VsdC0+Yl9wYWdlKSkgeworCS8qIGlmIHdlJ3ZlIGdvdCBhIGRpcmVjdCBpdGVtLCBhbmQgdGhlIGJ1ZmZlciBvciBwYWdlIHdhcyB1cHRvZGF0ZSwKKwkgKiogd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGRhdGEgb2ZmIGRpc2sgYWdhaW4uICBza2lwIHRvIHRoZQorCSAqKiBlbmQsIHdoZXJlIHdlIG1hcCB0aGUgYnVmZmVyIGFuZCByZXR1cm4KKwkgKi8KKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCkpIHsKKwkJZ290byBmaW5pc2hlZDsKKwl9IGVsc2UKKwkJLyoKKwkJICoqIGdyYWJfdGFpbF9wYWdlIGNhbiB0cmlnZ2VyIGNhbGxzIHRvIHJlaXNlcmZzX2dldF9ibG9jayBvbiB1cCB0byBkYXRlCisJCSAqKiBwYWdlcyB3aXRob3V0IGFueSBidWZmZXJzLiAgSWYgdGhlIHBhZ2UgaXMgdXAgdG8gZGF0ZSwgd2UgZG9uJ3Qgd2FudAorCQkgKiogcmVhZCBvbGQgZGF0YSBvZmYgZGlzay4gIFNldCB0aGUgdXAgdG8gZGF0ZSBiaXQgb24gdGhlIGJ1ZmZlciBpbnN0ZWFkCisJCSAqKiBhbmQganVtcCB0byB0aGUgZW5kCisJCSAqLworCWlmICghYmhfcmVzdWx0LT5iX3BhZ2UgfHwgUGFnZVVwdG9kYXRlKGJoX3Jlc3VsdC0+Yl9wYWdlKSkgewogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCk7Ci0JCWdvdG8gZmluaXNoZWQgOwotICAgIH0KLQotICAgIC8vIHJlYWQgZmlsZSB0YWlsIGludG8gcGFydCBvZiBwYWdlCi0gICAgb2Zmc2V0ID0gKGNwdV9rZXlfa19vZmZzZXQoJmtleSkgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7Ci0gICAgZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpIDsKLSAgICBjb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOwotCi0gICAgLyogd2Ugb25seSB3YW50IHRvIGttYXAgaWYgd2UgYXJlIHJlYWRpbmcgdGhlIHRhaWwgaW50byB0aGUgcGFnZS4KLSAgICAqKiB0aGlzIGlzIG5vdCB0aGUgY29tbW9uIGNhc2UsIHNvIHdlIGRvbid0IGttYXAgdW50aWwgd2UgYXJlCi0gICAgKiogc3VyZSB3ZSBuZWVkIHRvLiAgQnV0LCB0aGlzIG1lYW5zIHRoZSBpdGVtIG1pZ2h0IG1vdmUgaWYKLSAgICAqKiBrbWFwIHNjaGVkdWxlcwotICAgICovCi0gICAgaWYgKCFwKSB7Ci0JcCA9IChjaGFyICopa21hcChiaF9yZXN1bHQtPmJfcGFnZSkgOwotCWlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aCkpIHsKLQkgICAgZ290byByZXNlYXJjaDsKKwkJZ290byBmaW5pc2hlZDsKIAl9Ci0gICAgfQotICAgIHAgKz0gb2Zmc2V0IDsKLSAgICBtZW1zZXQgKHAsIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7Ci0gICAgZG8gewotCWlmICghaXNfZGlyZWN0X2xlX2loIChpaCkpIHsKLQkgICAgQlVHICgpOwotICAgICAgICB9Ci0JLyogbWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgbW9yZSBieXRlcyB0aGFuIGFjdHVhbGx5IGV4aXN0IGluCi0JKiogdGhlIGZpbGUuICBUaGlzIGNhbiBoYXBwZW4gaW4gb2RkIGNhc2VzIHdoZXJlIGlfc2l6ZSBpc24ndAotCSoqIGNvcnJlY3QsIGFuZCB3aGVuIGRpcmVjdCBpdGVtIHBhZGRpbmcgcmVzdWx0cyBpbiBhIGZldyAKLQkqKiBleHRyYSBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3QgaXRlbQotCSovCi0gICAgICAgIGlmICgobGVfaWhfa19vZmZzZXQoaWgpICsgcGF0aC5wb3NfaW5faXRlbSkgPiBpbm9kZS0+aV9zaXplKQotCSAgICBicmVhayA7Ci0JaWYgKChsZV9paF9rX29mZnNldChpaCkgLSAxICsgaWhfaXRlbV9sZW4oaWgpKSA+IGlub2RlLT5pX3NpemUpIHsKLQkgICAgY2hhcnMgPSBpbm9kZS0+aV9zaXplIC0gKGxlX2loX2tfb2Zmc2V0KGloKSAtIDEpIC0gcGF0aC5wb3NfaW5faXRlbTsKLQkgICAgZG9uZSA9IDEgOwotCX0gZWxzZSB7Ci0JICAgIGNoYXJzID0gaWhfaXRlbV9sZW4oaWgpIC0gcGF0aC5wb3NfaW5faXRlbTsKKwkvLyByZWFkIGZpbGUgdGFpbCBpbnRvIHBhcnQgb2YgcGFnZQorCW9mZnNldCA9IChjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpOworCWNvcHlfaXRlbV9oZWFkKCZ0bXBfaWgsIGloKTsKKworCS8qIHdlIG9ubHkgd2FudCB0byBrbWFwIGlmIHdlIGFyZSByZWFkaW5nIHRoZSB0YWlsIGludG8gdGhlIHBhZ2UuCisJICoqIHRoaXMgaXMgbm90IHRoZSBjb21tb24gY2FzZSwgc28gd2UgZG9uJ3Qga21hcCB1bnRpbCB3ZSBhcmUKKwkgKiogc3VyZSB3ZSBuZWVkIHRvLiAgQnV0LCB0aGlzIG1lYW5zIHRoZSBpdGVtIG1pZ2h0IG1vdmUgaWYKKwkgKioga21hcCBzY2hlZHVsZXMKKwkgKi8KKwlpZiAoIXApIHsKKwkJcCA9IChjaGFyICopa21hcChiaF9yZXN1bHQtPmJfcGFnZSk7CisJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCSAgICAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCQkJZ290byByZXNlYXJjaDsKKwkJfQogCX0KLQltZW1jcHkgKHAsIEJfSV9QSVRFTSAoYmgsIGloKSArIHBhdGgucG9zX2luX2l0ZW0sIGNoYXJzKTsKKwlwICs9IG9mZnNldDsKKwltZW1zZXQocCwgMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwlkbyB7CisJCWlmICghaXNfZGlyZWN0X2xlX2loKGloKSkgeworCQkJQlVHKCk7CisJCX0KKwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgbW9yZSBieXRlcyB0aGFuIGFjdHVhbGx5IGV4aXN0IGluCisJCSAqKiB0aGUgZmlsZS4gIFRoaXMgY2FuIGhhcHBlbiBpbiBvZGQgY2FzZXMgd2hlcmUgaV9zaXplIGlzbid0CisJCSAqKiBjb3JyZWN0LCBhbmQgd2hlbiBkaXJlY3QgaXRlbSBwYWRkaW5nIHJlc3VsdHMgaW4gYSBmZXcgCisJCSAqKiBleHRyYSBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3QgaXRlbQorCQkgKi8KKwkJaWYgKChsZV9paF9rX29mZnNldChpaCkgKyBwYXRoLnBvc19pbl9pdGVtKSA+IGlub2RlLT5pX3NpemUpCisJCQlicmVhazsKKwkJaWYgKChsZV9paF9rX29mZnNldChpaCkgLSAxICsgaWhfaXRlbV9sZW4oaWgpKSA+IGlub2RlLT5pX3NpemUpIHsKKwkJCWNoYXJzID0KKwkJCSAgICBpbm9kZS0+aV9zaXplIC0gKGxlX2loX2tfb2Zmc2V0KGloKSAtIDEpIC0KKwkJCSAgICBwYXRoLnBvc19pbl9pdGVtOworCQkJZG9uZSA9IDE7CisJCX0gZWxzZSB7CisJCQljaGFycyA9IGloX2l0ZW1fbGVuKGloKSAtIHBhdGgucG9zX2luX2l0ZW07CisJCX0KKwkJbWVtY3B5KHAsIEJfSV9QSVRFTShiaCwgaWgpICsgcGF0aC5wb3NfaW5faXRlbSwgY2hhcnMpOwogCi0JaWYgKGRvbmUpIAotCSAgICBicmVhayA7CisJCWlmIChkb25lKQorCQkJYnJlYWs7CiAKLQlwICs9IGNoYXJzOworCQlwICs9IGNoYXJzOwogCi0JaWYgKFBBVEhfTEFTVF9QT1NJVElPTiAoJnBhdGgpICE9IChCX05SX0lURU1TIChiaCkgLSAxKSkKLQkgICAgLy8gd2UgZG9uZSwgaWYgcmVhZCBkaXJlY3QgaXRlbSBpcyBub3QgdGhlIGxhc3QgaXRlbSBvZgotCSAgICAvLyBub2RlIEZJWE1FOiB3ZSBjb3VsZCB0cnkgdG8gY2hlY2sgcmlnaHQgZGVsaW1pdGluZyBrZXkKLQkgICAgLy8gdG8gc2VlIHdoZXRoZXIgZGlyZWN0IGl0ZW0gY29udGludWVzIGluIHRoZSByaWdodAotCSAgICAvLyBuZWlnaGJvciBvciByZWx5IG9uIGlfc2l6ZQotCSAgICBicmVhazsKKwkJaWYgKFBBVEhfTEFTVF9QT1NJVElPTigmcGF0aCkgIT0gKEJfTlJfSVRFTVMoYmgpIC0gMSkpCisJCQkvLyB3ZSBkb25lLCBpZiByZWFkIGRpcmVjdCBpdGVtIGlzIG5vdCB0aGUgbGFzdCBpdGVtIG9mCisJCQkvLyBub2RlIEZJWE1FOiB3ZSBjb3VsZCB0cnkgdG8gY2hlY2sgcmlnaHQgZGVsaW1pdGluZyBrZXkKKwkJCS8vIHRvIHNlZSB3aGV0aGVyIGRpcmVjdCBpdGVtIGNvbnRpbnVlcyBpbiB0aGUgcmlnaHQKKwkJCS8vIG5laWdoYm9yIG9yIHJlbHkgb24gaV9zaXplCisJCQlicmVhazsKIAotCS8vIHVwZGF0ZSBrZXkgdG8gbG9vayBmb3IgdGhlIG5leHQgcGllY2UKLQlzZXRfY3B1X2tleV9rX29mZnNldCAoJmtleSwgY3B1X2tleV9rX29mZnNldCAoJmtleSkgKyBjaGFycyk7Ci0JcmVzdWx0ID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JaWYgKHJlc3VsdCAhPSBQT1NJVElPTl9GT1VORCkKLQkgICAgLy8gaS9vIGVycm9yIG1vc3QgbGlrZWx5Ci0JICAgIGJyZWFrOwotCWJoID0gZ2V0X2xhc3RfYmggKCZwYXRoKTsKLQlpaCA9IGdldF9paCAoJnBhdGgpOwotICAgIH0gd2hpbGUgKDEpOworCQkvLyB1cGRhdGUga2V5IHRvIGxvb2sgZm9yIHRoZSBuZXh0IHBpZWNlCisJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBjaGFycyk7CisJCXJlc3VsdCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJCWlmIChyZXN1bHQgIT0gUE9TSVRJT05fRk9VTkQpCisJCQkvLyBpL28gZXJyb3IgbW9zdCBsaWtlbHkKKwkJCWJyZWFrOworCQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJaWggPSBnZXRfaWgoJnBhdGgpOworCX0gd2hpbGUgKDEpOwogCi0gICAgZmx1c2hfZGNhY2hlX3BhZ2UoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLSAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKKwlmbHVzaF9kY2FjaGVfcGFnZShiaF9yZXN1bHQtPmJfcGFnZSk7CisJa3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKTsKIAotZmluaXNoZWQ6Ci0gICAgcGF0aHJlbHNlICgmcGF0aCk7CisgICAgICBmaW5pc2hlZDoKKwlwYXRocmVsc2UoJnBhdGgpOwogCi0gICAgaWYgKHJlc3VsdCA9PSBJT19FUlJPUikKLQlyZXR1cm4gLUVJTzsKKwlpZiAocmVzdWx0ID09IElPX0VSUk9SKQorCQlyZXR1cm4gLUVJTzsKIAotICAgIC8qIHRoaXMgYnVmZmVyIGhhcyB2YWxpZCBkYXRhLCBidXQgaXNuJ3QgdmFsaWQgZm9yIGlvLiAgbWFwcGluZyBpdCB0bwotICAgICAqIGJsb2NrICMwIHRlbGxzIHRoZSByZXN0IG9mIHJlaXNlcmZzIGl0IGp1c3QgaGFzIGEgdGFpbCBpbiBpdAotICAgICAqLwotICAgIG1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCAwKTsKLSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlIChiaF9yZXN1bHQpOwotICAgIHJldHVybiAwOworCS8qIHRoaXMgYnVmZmVyIGhhcyB2YWxpZCBkYXRhLCBidXQgaXNuJ3QgdmFsaWQgZm9yIGlvLiAgbWFwcGluZyBpdCB0bworCSAqIGJsb2NrICMwIHRlbGxzIHRoZSByZXN0IG9mIHJlaXNlcmZzIGl0IGp1c3QgaGFzIGEgdGFpbCBpbiBpdAorCSAqLworCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCAwKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCk7CisJcmV0dXJuIDA7CiB9CiAKLQogLy8gdGhpcyBpcyBjYWxsZWQgdG8gY3JlYXRlIGZpbGUgbWFwLiBTbywgX2dldF9ibG9ja19jcmVhdGVfMCB3aWxsIG5vdAogLy8gcmVhZCBkaXJlY3QgaXRlbQotc3RhdGljIGludCByZWlzZXJmc19ibWFwIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc2VjdG9yX3QgYmxvY2ssCi0JCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfYm1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKLSAgICBpZiAoIWZpbGVfY2FwYWJsZSAoaW5vZGUsIGJsb2NrKSkKLQlyZXR1cm4gLUVGQklHOworCWlmICghZmlsZV9jYXBhYmxlKGlub2RlLCBibG9jaykpCisJCXJldHVybiAtRUZCSUc7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICAvKiBkbyBub3QgcmVhZCB0aGUgZGlyZWN0IGl0ZW0gKi8KLSAgICBfZ2V0X2Jsb2NrX2NyZWF0ZV8wIChpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgMCkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJLyogZG8gbm90IHJlYWQgdGhlIGRpcmVjdCBpdGVtICovCisJX2dldF9ibG9ja19jcmVhdGVfMChpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgMCk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogc3BlY2lhbCB2ZXJzaW9uIG9mIGdldF9ibG9jayB0aGF0IGlzIG9ubHkgdXNlZCBieSBncmFiX3RhaWxfcGFnZSByaWdodApAQCAtNDQ0LDkgKzQ0OCwxMSBAQAogKiogZG9uJ3Qgd2FudCB0byBzZW5kIGNyZWF0ZSA9PSBHRVRfQkxPQ0tfTk9fSE9MRSB0byByZWlzZXJmc19nZXRfYmxvY2ssIAogKiogZG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24uCiAqLwotc3RhdGljIGludCByZWlzZXJmc19nZXRfYmxvY2tfY3JlYXRlXzAgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzZWN0b3JfdCBibG9jaywKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkgewotICAgIHJldHVybiByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIEdFVF9CTE9DS19OT19IT0xFKSA7CitzdGF0aWMgaW50IHJlaXNlcmZzX2dldF9ibG9ja19jcmVhdGVfMChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCisJCQkJICAgICAgIGludCBjcmVhdGUpCit7CisJcmV0dXJuIHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgR0VUX0JMT0NLX05PX0hPTEUpOwogfQogCiAvKiBUaGlzIGlzIHNwZWNpYWwgaGVscGVyIGZvciByZWlzZXJmc19nZXRfYmxvY2sgaW4gY2FzZSB3ZSBhcmUgZXhlY3V0aW5nCkBAIC00NTcsNDQgKzQ2Myw0MyBAQAogCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCiAJCQkJCSBpbnQgY3JlYXRlKQogewotICAgIGludCByZXQgOworCWludCByZXQ7CiAKLSAgICBiaF9yZXN1bHQtPmJfcGFnZSA9IE5VTEw7CisJYmhfcmVzdWx0LT5iX3BhZ2UgPSBOVUxMOwogCi0gICAgLyogV2Ugc2V0IHRoZSBiX3NpemUgYmVmb3JlIHJlaXNlcmZzX2dldF9ibG9jayBjYWxsIHNpbmNlIGl0IGlzCi0gICAgICAgcmVmZXJlbmNlZCBpbiBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoKSB0aGF0IG1heSBiZSBjYWxsZWQgZnJvbQotICAgICAgIHJlaXNlcmZzX2dldF9ibG9jaygpICovCi0gICAgYmhfcmVzdWx0LT5iX3NpemUgPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKKwkvKiBXZSBzZXQgdGhlIGJfc2l6ZSBiZWZvcmUgcmVpc2VyZnNfZ2V0X2Jsb2NrIGNhbGwgc2luY2UgaXQgaXMKKwkgICByZWZlcmVuY2VkIGluIGNvbnZlcnRfdGFpbF9mb3JfaG9sZSgpIHRoYXQgbWF5IGJlIGNhbGxlZCBmcm9tCisJICAgcmVpc2VyZnNfZ2V0X2Jsb2NrKCkgKi8KKwliaF9yZXN1bHQtPmJfc2l6ZSA9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOwogCi0gICAgcmV0ID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIGJoX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlIHwgR0VUX0JMT0NLX05PX0RBTkdMRSkgOwotICAgIGlmIChyZXQpCi0gICAgICAgIGdvdG8gb3V0OworCXJldCA9IHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgaWJsb2NrLCBiaF9yZXN1bHQsCisJCQkJIGNyZWF0ZSB8IEdFVF9CTE9DS19OT19EQU5HTEUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCi0gICAgLyogZG9uJ3QgYWxsb3cgZGlyZWN0IGlvIG9udG8gdGFpbCBwYWdlcyAqLwotICAgIGlmIChidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgJiYgYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkgewotICAgICAgICAvKiBtYWtlIHN1cmUgZnV0dXJlIGNhbGxzIHRvIHRoZSBkaXJlY3QgaW8gZnVuY3MgZm9yIHRoaXMgb2Zmc2V0Ci0gICAgICAgICoqIGluIHRoZSBmaWxlIGZhaWwgYnkgdW5tYXBwaW5nIHRoZSBidWZmZXIKLSAgICAgICAgKi8KLSAgICAgICAgY2xlYXJfYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpOwotICAgICAgICByZXQgPSAtRUlOVkFMIDsKLSAgICB9Ci0gICAgLyogUG9zc2libGUgdW5wYWNrZWQgdGFpbC4gRmx1c2ggdGhlIGRhdGEgYmVmb3JlIHBhZ2VzIGhhdmUKLSAgICAgICBkaXNhcHBlYXJlZCAqLwotICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfcGFja19vbl9jbG9zZV9tYXNrKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIGxvY2tfa2VybmVsKCk7Ci0gICAgICAgIGVyciA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoaW5vZGUpOwotICAgICAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2s7Ci0gICAgICAgIHVubG9ja19rZXJuZWwoKTsKLSAgICAgICAgaWYgKGVyciA8IDApCi0gICAgICAgICAgICByZXQgPSBlcnI7Ci0gICAgfQotb3V0OgotICAgIHJldHVybiByZXQgOworCS8qIGRvbid0IGFsbG93IGRpcmVjdCBpbyBvbnRvIHRhaWwgcGFnZXMgKi8KKwlpZiAoYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpICYmIGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKKwkJLyogbWFrZSBzdXJlIGZ1dHVyZSBjYWxscyB0byB0aGUgZGlyZWN0IGlvIGZ1bmNzIGZvciB0aGlzIG9mZnNldAorCQkgKiogaW4gdGhlIGZpbGUgZmFpbCBieSB1bm1hcHBpbmcgdGhlIGJ1ZmZlcgorCQkgKi8KKwkJY2xlYXJfYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwkvKiBQb3NzaWJsZSB1bnBhY2tlZCB0YWlsLiBGbHVzaCB0aGUgZGF0YSBiZWZvcmUgcGFnZXMgaGF2ZQorCSAgIGRpc2FwcGVhcmVkICovCisJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spIHsKKwkJaW50IGVycjsKKwkJbG9ja19rZXJuZWwoKTsKKwkJZXJyID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSk7CisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzazsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldCA9IGVycjsKKwl9CisgICAgICBvdXQ6CisJcmV0dXJuIHJldDsKIH0KIAotCiAvKgogKiogaGVscGVyIGZ1bmN0aW9uIGZvciB3aGVuIHJlaXNlcmZzX2dldF9ibG9jayBpcyBjYWxsZWQgZm9yIGEgaG9sZQogKiogYnV0IHRoZSBmaWxlIHRhaWwgaXMgc3RpbGwgaW4gYSBkaXJlY3QgaXRlbQpAQCAtNTA1LDQ5MCArNTEwLDU0NyBAQAogKiogeW91IHNob3VsZCBub3QgYmUgaW4gYSB0cmFuc2FjdGlvbiwgb3IgaGF2ZSBhbnkgcGF0aHMgaGVsZCB3aGVuIHlvdQogKiogY2FsbCB0aGlzLgogKi8KLXN0YXRpYyBpbnQgY29udmVydF90YWlsX2Zvcl9ob2xlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCi0JCQkJIGxvZmZfdCB0YWlsX29mZnNldCkgewotICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggOwotICAgIHVuc2lnbmVkIGxvbmcgdGFpbF9lbmQgOyAKLSAgICB1bnNpZ25lZCBsb25nIHRhaWxfc3RhcnQgOwotICAgIHN0cnVjdCBwYWdlICogdGFpbF9wYWdlIDsKLSAgICBzdHJ1Y3QgcGFnZSAqIGhvbGVfcGFnZSA9IGJoX3Jlc3VsdC0+Yl9wYWdlIDsKLSAgICBpbnQgcmV0dmFsID0gMCA7CitzdGF0aWMgaW50IGNvbnZlcnRfdGFpbF9mb3JfaG9sZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCQkgbG9mZl90IHRhaWxfb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyB0YWlsX2VuZDsKKwl1bnNpZ25lZCBsb25nIHRhaWxfc3RhcnQ7CisJc3RydWN0IHBhZ2UgKnRhaWxfcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqaG9sZV9wYWdlID0gYmhfcmVzdWx0LT5iX3BhZ2U7CisJaW50IHJldHZhbCA9IDA7CiAKLSAgICBpZiAoKHRhaWxfb2Zmc2V0ICYgKGJoX3Jlc3VsdC0+Yl9zaXplIC0gMSkpICE9IDEpIAotICAgICAgICByZXR1cm4gLUVJTyA7CisJaWYgKCh0YWlsX29mZnNldCAmIChiaF9yZXN1bHQtPmJfc2l6ZSAtIDEpKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKIAotICAgIC8qIGFsd2F5cyB0cnkgdG8gcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBibG9jayAqLwotICAgIHRhaWxfc3RhcnQgPSB0YWlsX29mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7Ci0gICAgdGFpbF9lbmQgPSAodGFpbF9zdGFydCB8IChiaF9yZXN1bHQtPmJfc2l6ZSAtIDEpKSArIDEgOworCS8qIGFsd2F5cyB0cnkgdG8gcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworCXRhaWxfc3RhcnQgPSB0YWlsX29mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl0YWlsX2VuZCA9ICh0YWlsX3N0YXJ0IHwgKGJoX3Jlc3VsdC0+Yl9zaXplIC0gMSkpICsgMTsKIAotICAgIGluZGV4ID0gdGFpbF9vZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVCA7Ci0gICAgLyogaG9sZV9wYWdlIGNhbiBiZSB6ZXJvIGluIGNhc2Ugb2YgZGlyZWN0X2lvLCB3ZSBhcmUgc3VyZQotICAgICAgIHRoYXQgd2UgY2Fubm90IGdldCBoZXJlIGlmIHdlIHdyaXRlIHdpdGggT19ESVJFQ1QgaW50bwotICAgICAgIHRhaWwgcGFnZSAqLwotICAgIGlmICghaG9sZV9wYWdlIHx8IGluZGV4ICE9IGhvbGVfcGFnZS0+aW5kZXgpIHsKLQl0YWlsX3BhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpIDsKLQlyZXR2YWwgPSAtRU5PTUVNOwotCWlmICghdGFpbF9wYWdlKSB7Ci0JICAgIGdvdG8gb3V0IDsKKwlpbmRleCA9IHRhaWxfb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJLyogaG9sZV9wYWdlIGNhbiBiZSB6ZXJvIGluIGNhc2Ugb2YgZGlyZWN0X2lvLCB3ZSBhcmUgc3VyZQorCSAgIHRoYXQgd2UgY2Fubm90IGdldCBoZXJlIGlmIHdlIHdyaXRlIHdpdGggT19ESVJFQ1QgaW50bworCSAgIHRhaWwgcGFnZSAqLworCWlmICghaG9sZV9wYWdlIHx8IGluZGV4ICE9IGhvbGVfcGFnZS0+aW5kZXgpIHsKKwkJdGFpbF9wYWdlID0gZ3JhYl9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGluZGV4KTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJaWYgKCF0YWlsX3BhZ2UpIHsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJdGFpbF9wYWdlID0gaG9sZV9wYWdlOwogCX0KLSAgICB9IGVsc2UgewotICAgICAgICB0YWlsX3BhZ2UgPSBob2xlX3BhZ2UgOwotICAgIH0KIAotICAgIC8qIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBjb252ZXJzaW9uIGRpZCBub3QgaGFwcGVuIHdoaWxlCi0gICAgKiogd2Ugd2VyZSBsb2NraW5nIHRoZSBwYWdlIGJlY2F1c2UgYW55b25lIHRoYXQgY291bGQgY29udmVydAotICAgICoqIG11c3QgZmlyc3QgdGFrZSBpX3NlbS4KLSAgICAqKgotICAgICoqIFdlIG11c3QgZml4IHRoZSB0YWlsIHBhZ2UgZm9yIHdyaXRpbmcgYmVjYXVzZSBpdCBtaWdodCBoYXZlIGJ1ZmZlcnMKLSAgICAqKiB0aGF0IGFyZSBtYXBwZWQsIGJ1dCBoYXZlIGEgYmxvY2sgbnVtYmVyIG9mIDAuICBUaGlzIGluZGljYXRlcyB0YWlsCi0gICAgKiogZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQgZGlyZWN0bHkgaW50byB0aGUgcGFnZSwgYW5kIGJsb2NrX3ByZXBhcmVfd3JpdGUKLSAgICAqKiB3b24ndCB0cmlnZ2VyIGEgZ2V0X2Jsb2NrIGluIHRoaXMgY2FzZS4KLSAgICAqLwotICAgIGZpeF90YWlsX3BhZ2VfZm9yX3dyaXRpbmcodGFpbF9wYWdlKSA7Ci0gICAgcmV0dmFsID0gcmVpc2VyZnNfcHJlcGFyZV93cml0ZShOVUxMLCB0YWlsX3BhZ2UsIHRhaWxfc3RhcnQsIHRhaWxfZW5kKTsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIHVubG9jayA7CisJLyogd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGNvbnZlcnNpb24gZGlkIG5vdCBoYXBwZW4gd2hpbGUKKwkgKiogd2Ugd2VyZSBsb2NraW5nIHRoZSBwYWdlIGJlY2F1c2UgYW55b25lIHRoYXQgY291bGQgY29udmVydAorCSAqKiBtdXN0IGZpcnN0IHRha2UgaV9zZW0uCisJICoqCisJICoqIFdlIG11c3QgZml4IHRoZSB0YWlsIHBhZ2UgZm9yIHdyaXRpbmcgYmVjYXVzZSBpdCBtaWdodCBoYXZlIGJ1ZmZlcnMKKwkgKiogdGhhdCBhcmUgbWFwcGVkLCBidXQgaGF2ZSBhIGJsb2NrIG51bWJlciBvZiAwLiAgVGhpcyBpbmRpY2F0ZXMgdGFpbAorCSAqKiBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZCBkaXJlY3RseSBpbnRvIHRoZSBwYWdlLCBhbmQgYmxvY2tfcHJlcGFyZV93cml0ZQorCSAqKiB3b24ndCB0cmlnZ2VyIGEgZ2V0X2Jsb2NrIGluIHRoaXMgY2FzZS4KKwkgKi8KKwlmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHRhaWxfcGFnZSk7CisJcmV0dmFsID0gcmVpc2VyZnNfcHJlcGFyZV93cml0ZShOVUxMLCB0YWlsX3BhZ2UsIHRhaWxfc3RhcnQsIHRhaWxfZW5kKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHVubG9jazsKIAotICAgIC8qIHRhaWwgY29udmVyc2lvbiBtaWdodCBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHBhZ2UgKi8KLSAgICBmbHVzaF9kY2FjaGVfcGFnZSh0YWlsX3BhZ2UpIDsKKwkvKiB0YWlsIGNvbnZlcnNpb24gbWlnaHQgY2hhbmdlIHRoZSBkYXRhIGluIHRoZSBwYWdlICovCisJZmx1c2hfZGNhY2hlX3BhZ2UodGFpbF9wYWdlKTsKIAotICAgIHJldHZhbCA9IHJlaXNlcmZzX2NvbW1pdF93cml0ZShOVUxMLCB0YWlsX3BhZ2UsIHRhaWxfc3RhcnQsIHRhaWxfZW5kKSA7CisJcmV0dmFsID0gcmVpc2VyZnNfY29tbWl0X3dyaXRlKE5VTEwsIHRhaWxfcGFnZSwgdGFpbF9zdGFydCwgdGFpbF9lbmQpOwogCi11bmxvY2s6Ci0gICAgaWYgKHRhaWxfcGFnZSAhPSBob2xlX3BhZ2UpIHsKLSAgICAgICAgdW5sb2NrX3BhZ2UodGFpbF9wYWdlKSA7Ci0JcGFnZV9jYWNoZV9yZWxlYXNlKHRhaWxfcGFnZSkgOwotICAgIH0KLW91dDoKLSAgICByZXR1cm4gcmV0dmFsIDsKKyAgICAgIHVubG9jazoKKwlpZiAodGFpbF9wYWdlICE9IGhvbGVfcGFnZSkgeworCQl1bmxvY2tfcGFnZSh0YWlsX3BhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UodGFpbF9wYWdlKTsKKwl9CisgICAgICBvdXQ6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX2FsbG9jYXRlX2Jsb2NrKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgbG9uZyBibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIAotCQkJICAgYl9ibG9ja25yX3QgKmFsbG9jYXRlZF9ibG9ja19uciwgCi0JCQkgICBzdHJ1Y3QgcGF0aCAqIHBhdGgsCi0JCQkgICBpbnQgZmxhZ3MpIHsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gIAorCQkJCSAgbG9uZyBibG9jaywKKwkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBiX2Jsb2NrbnJfdCAqIGFsbG9jYXRlZF9ibG9ja19uciwKKwkJCQkgIHN0cnVjdCBwYXRoICpwYXRoLCBpbnQgZmxhZ3MpCit7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisKICNpZmRlZiBSRUlTRVJGU19QUkVBTExPQ0FURQotICAgIGlmICghKGZsYWdzICYgR0VUX0JMT0NLX05PX0lTRU0pKSB7Ci0JcmV0dXJuIHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMyKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCBwYXRoLCBibG9jayk7Ci0gICAgfQorCWlmICghKGZsYWdzICYgR0VUX0JMT0NLX05PX0lTRU0pKSB7CisJCXJldHVybiByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzMih0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwKKwkJCQkJCSAgcGF0aCwgYmxvY2spOworCX0KICNlbmRpZgotICAgIHJldHVybiByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgcGF0aCwgYmxvY2spOworCXJldHVybiByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCBwYXRoLAorCQkJCQkgYmxvY2spOwogfQogCi1pbnQgcmVpc2VyZnNfZ2V0X2Jsb2NrIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc2VjdG9yX3QgYmxvY2ssCi0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsIGludCBjcmVhdGUpCitpbnQgcmVpc2VyZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0gICAgaW50IHJlcGVhdCwgcmV0dmFsID0gMDsKLSAgICBiX2Jsb2NrbnJfdCBhbGxvY2F0ZWRfYmxvY2tfbnIgPSAwOy8vIGJfYmxvY2tucl90IGlzICh1bnNpZ25lZCkgMzIgYml0IGludAotICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsKLSAgICBpbnQgcG9zX2luX2l0ZW07Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAqIHVuYmggPSBOVUxMOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgdG1wX2loOwotICAgIF9fbGUzMiAqIGl0ZW07Ci0gICAgaW50IGRvbmU7Ci0gICAgaW50IGZzX2dlbjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7Ci0gICAgLyogc3BhY2UgcmVzZXJ2ZWQgaW4gdHJhbnNhY3Rpb24gYmF0Y2g6IAotICAgICAgICAuIDMgYmFsYW5jaW5ncyBpbiBkaXJlY3QtPmluZGlyZWN0IGNvbnZlcnNpb24KLSAgICAgICAgLiAxIGJsb2NrIGludm9sdmVkIGludG8gcmVpc2VyZnNfdXBkYXRlX3NkKCkKLSAgICAgICBYWFggaW4gcHJhY3RpY2FsbHkgaW1wb3NzaWJsZSB3b3JzdCBjYXNlIGRpcmVjdDJpbmRpcmVjdCgpCi0gICAgICAgY2FuIGluY3VyIChtdWNoKSBtb3JlIHRoYW4gMyBiYWxhbmNpbmdzLgotICAgICAgIHF1b3RhIHVwZGF0ZSBmb3IgdXNlciwgZ3JvdXAgKi8KLSAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMSArIDIgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpOwotICAgIGludCB2ZXJzaW9uOwotICAgIGludCBkYW5nbGUgPSAxOwotICAgIGxvZmZfdCBuZXdfb2Zmc2V0ID0gKCgobG9mZl90KWJsb2NrKSA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgKyAxIDsKKwlpbnQgcmVwZWF0LCByZXR2YWwgPSAwOworCWJfYmxvY2tucl90IGFsbG9jYXRlZF9ibG9ja19uciA9IDA7CS8vIGJfYmxvY2tucl90IGlzICh1bnNpZ25lZCkgMzIgYml0IGludAorCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsKKwlpbnQgcG9zX2luX2l0ZW07CisJc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICp1bmJoID0gTlVMTDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loOworCV9fbGUzMiAqaXRlbTsKKwlpbnQgZG9uZTsKKwlpbnQgZnNfZ2VuOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gTlVMTDsKKwkvKiBzcGFjZSByZXNlcnZlZCBpbiB0cmFuc2FjdGlvbiBiYXRjaDogCisJICAgLiAzIGJhbGFuY2luZ3MgaW4gZGlyZWN0LT5pbmRpcmVjdCBjb252ZXJzaW9uCisJICAgLiAxIGJsb2NrIGludm9sdmVkIGludG8gcmVpc2VyZnNfdXBkYXRlX3NkKCkKKwkgICBYWFggaW4gcHJhY3RpY2FsbHkgaW1wb3NzaWJsZSB3b3JzdCBjYXNlIGRpcmVjdDJpbmRpcmVjdCgpCisJICAgY2FuIGluY3VyIChtdWNoKSBtb3JlIHRoYW4gMyBiYWxhbmNpbmdzLgorCSAgIHF1b3RhIHVwZGF0ZSBmb3IgdXNlciwgZ3JvdXAgKi8KKwlpbnQgamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMSArCisJICAgIDIgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpOworCWludCB2ZXJzaW9uOworCWludCBkYW5nbGUgPSAxOworCWxvZmZfdCBuZXdfb2Zmc2V0ID0KKwkgICAgKCgobG9mZl90KSBibG9jaykgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMTsKIAotCQkJCS8qIGJhZC4uLi4gKi8KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICB2ZXJzaW9uID0gZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKTsKKwkvKiBiYWQuLi4uICovCisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJdmVyc2lvbiA9IGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKTsKIAotICAgIGlmIChibG9jayA8IDApIHsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCXJldHVybiAtRUlPOwotICAgIH0KLQotICAgIGlmICghZmlsZV9jYXBhYmxlIChpbm9kZSwgYmxvY2spKSB7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQlyZXR1cm4gLUVGQklHOwotICAgIH0KLQotICAgIC8qIGlmICFjcmVhdGUsIHdlIGFyZW4ndCBjaGFuZ2luZyB0aGUgRlMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAgICAqKiBsb2cgYW55dGhpbmcsIHNvIHdlIGRvbid0IG5lZWQgdG8gc3RhcnQgYSB0cmFuc2FjdGlvbgotICAgICovCi0gICAgaWYgKCEoY3JlYXRlICYgR0VUX0JMT0NLX0NSRUFURSkpIHsKLQlpbnQgcmV0IDsKLQkvKiBmaW5kIG51bWJlciBvZiBibG9jay10aCBsb2dpY2FsIGJsb2NrIG9mIHRoZSBmaWxlICovCi0JcmV0ID0gX2dldF9ibG9ja19jcmVhdGVfMCAoaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSB8IEdFVF9CTE9DS19SRUFEX0RJUkVDVCkgOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBpZiB3ZSdyZSBhbHJlYWR5IGluIGEgdHJhbnNhY3Rpb24sIG1ha2Ugc3VyZSB0byBjbG9zZQotICAgICAqIGFueSBuZXcgdHJhbnNhY3Rpb25zIHdlIHN0YXJ0IGluIHRoaXMgZnVuYwotICAgICAqLwotICAgIGlmICgoY3JlYXRlICYgR0VUX0JMT0NLX05PX0RBTkdMRSkgfHwKLSAgICAgICAgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpCi0gICAgICAgIGRhbmdsZSA9IDA7Ci0KLSAgICAvKiBJZiBmaWxlIGlzIG9mIHN1Y2ggYSBzaXplLCB0aGF0IGl0IG1pZ2h0IGhhdmUgYSB0YWlsIGFuZCB0YWlscyBhcmUgZW5hYmxlZAotICAgICoqIHdlIHNob3VsZCBtYXJrIGl0IGFzIHBvc3NpYmx5IG5lZWRpbmcgdGFpbCBwYWNraW5nIG9uIGNsb3NlCi0gICAgKi8KLSAgICBpZiAoIChoYXZlX2xhcmdlX3RhaWxzIChpbm9kZS0+aV9zYikgJiYgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZSAoaW5vZGUpKjQpIHx8Ci0JIChoYXZlX3NtYWxsX3RhaWxzIChpbm9kZS0+aV9zYikgJiYgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkpICkKLQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX3BhY2tfb25fY2xvc2VfbWFzayA7Ci0KLSAgICAvKiBzZXQgdGhlIGtleSBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgJ2Jsb2NrJy10aCBibG9jayBvZiBmaWxlICovCi0gICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgbmV3X29mZnNldCwKLQkJICBUWVBFX0FOWSwgMy8qa2V5IGxlbmd0aCovKTsKLSAgICBpZiAoKG5ld19vZmZzZXQgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+IGlub2RlLT5pX3NpemUpIHsKLXN0YXJ0X3RyYW5zOgotCXRoID0gcmVpc2VyZnNfcGVyc2lzdGVudF90cmFuc2FjdGlvbihpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKLQlpZiAoIXRoKSB7Ci0JICAgIHJldHZhbCA9IC1FTk9NRU07Ci0JICAgIGdvdG8gZmFpbHVyZTsKLQl9Ci0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gICAgfQotIHJlc2VhcmNoOgotCi0gICAgcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCXJldHZhbCA9IC1FSU87Ci0JZ290byBmYWlsdXJlOwotICAgIH0KLQkKLSAgICBiaCA9IGdldF9sYXN0X2JoICgmcGF0aCk7Ci0gICAgaWggPSBnZXRfaWggKCZwYXRoKTsKLSAgICBpdGVtID0gZ2V0X2l0ZW0gKCZwYXRoKTsKLSAgICBwb3NfaW5faXRlbSA9IHBhdGgucG9zX2luX2l0ZW07Ci0KLSAgICBmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbiAoaW5vZGUtPmlfc2IpOwotICAgIGNvcHlfaXRlbV9oZWFkICgmdG1wX2loLCBpaCk7Ci0KLSAgICBpZiAoYWxsb2NhdGlvbl9uZWVkZWQgKHJldHZhbCwgYWxsb2NhdGVkX2Jsb2NrX25yLCBpaCwgaXRlbSwgcG9zX2luX2l0ZW0pKSB7Ci0JLyogd2UgaGF2ZSB0byBhbGxvY2F0ZSBibG9jayBmb3IgdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KLQlpZiAoIXRoKSB7Ci0JICAgIHBhdGhyZWxzZSgmcGF0aCkgOwotCSAgICBnb3RvIHN0YXJ0X3RyYW5zOworCWlmIChibG9jayA8IDApIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIC1FSU87CiAJfQogCi0JcmVwZWF0ID0gX2FsbG9jYXRlX2Jsb2NrKHRoLCBibG9jaywgaW5vZGUsICZhbGxvY2F0ZWRfYmxvY2tfbnIsICZwYXRoLCBjcmVhdGUpOwotCi0JaWYgKHJlcGVhdCA9PSBOT19ESVNLX1NQQUNFIHx8IHJlcGVhdCA9PSBRVU9UQV9FWENFRURFRCkgewotCSAgICAvKiByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiB0byBnaXZlIHRoZSBqb3VybmFsIGEgY2hhbmNlIHRvIGZyZWUKLQkgICAgKiogc29tZSBibG9ja3MuICByZWxlYXNlcyB0aGUgcGF0aCwgc28gd2UgaGF2ZSB0byBnbyBiYWNrIHRvCi0JICAgICoqIHJlc2VhcmNoIGlmIHdlIHN1Y2NlZWQgb24gdGhlIHNlY29uZCB0cnkKLQkgICAgKi8KLQkgICAgU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfbmV4dF9hc3luY19mbHVzaCA9IDE7Ci0JICAgIHJldHZhbCA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCkgOwotICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWx1cmU7Ci0JICAgIHJlcGVhdCA9IF9hbGxvY2F0ZV9ibG9jayh0aCwgYmxvY2ssIGlub2RlLCAmYWxsb2NhdGVkX2Jsb2NrX25yLCBOVUxMLCBjcmVhdGUpOwotCi0JICAgIGlmIChyZXBlYXQgIT0gTk9fRElTS19TUEFDRSAmJiByZXBlYXQgIT0gUVVPVEFfRVhDRUVERUQpIHsKLQkJZ290byByZXNlYXJjaCA7Ci0JICAgIH0KLQkgICAgaWYgKHJlcGVhdCA9PSBRVU9UQV9FWENFRURFRCkKLQkJcmV0dmFsID0gLUVEUVVPVDsKLQkgICAgZWxzZQotCQlyZXR2YWwgPSAtRU5PU1BDOwotCSAgICBnb3RvIGZhaWx1cmU7CisJaWYgKCFmaWxlX2NhcGFibGUoaW5vZGUsIGJsb2NrKSkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlyZXR1cm4gLUVGQklHOwogCX0KIAotCWlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aCkpIHsKLQkgICAgZ290byByZXNlYXJjaDsKKwkvKiBpZiAhY3JlYXRlLCB3ZSBhcmVuJ3QgY2hhbmdpbmcgdGhlIEZTLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisJICoqIGxvZyBhbnl0aGluZywgc28gd2UgZG9uJ3QgbmVlZCB0byBzdGFydCBhIHRyYW5zYWN0aW9uCisJICovCisJaWYgKCEoY3JlYXRlICYgR0VUX0JMT0NLX0NSRUFURSkpIHsKKwkJaW50IHJldDsKKwkJLyogZmluZCBudW1iZXIgb2YgYmxvY2stdGggbG9naWNhbCBibG9jayBvZiB0aGUgZmlsZSAqLworCQlyZXQgPSBfZ2V0X2Jsb2NrX2NyZWF0ZV8wKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LAorCQkJCQkgIGNyZWF0ZSB8IEdFVF9CTE9DS19SRUFEX0RJUkVDVCk7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCXJldHVybiByZXQ7CiAJfQotICAgIH0KKwkvKgorCSAqIGlmIHdlJ3JlIGFscmVhZHkgaW4gYSB0cmFuc2FjdGlvbiwgbWFrZSBzdXJlIHRvIGNsb3NlCisJICogYW55IG5ldyB0cmFuc2FjdGlvbnMgd2Ugc3RhcnQgaW4gdGhpcyBmdW5jCisJICovCisJaWYgKChjcmVhdGUgJiBHRVRfQkxPQ0tfTk9fREFOR0xFKSB8fAorCSAgICByZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkKKwkJZGFuZ2xlID0gMDsKIAotICAgIGlmIChpbmRpcmVjdF9pdGVtX2ZvdW5kIChyZXR2YWwsIGloKSkgewotICAgICAgICBiX2Jsb2NrbnJfdCB1bmZtX3B0cjsKLQkvKiAnYmxvY2snLXRoIGJsb2NrIGlzIGluIHRoZSBmaWxlIGFscmVhZHkgKHRoZXJlIGlzCi0JICAgY29ycmVzcG9uZGluZyBjZWxsIGluIHNvbWUgaW5kaXJlY3QgaXRlbSkuIEJ1dCBpdCBtYXkgYmUKLQkgICB6ZXJvIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciAoaG9sZSkgKi8KLSAgICAgICAgdW5mbV9wdHIgPSBnZXRfYmxvY2tfbnVtIChpdGVtLCBwb3NfaW5faXRlbSk7Ci0JaWYgKHVuZm1fcHRyID09IDApIHsKLQkgICAgLyogdXNlIGFsbG9jYXRlZCBibG9jayB0byBwbHVnIHRoZSBob2xlICovCi0JICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKSA7Ci0JICAgIGlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aCkpIHsKLQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKSA7Ci0JCWdvdG8gcmVzZWFyY2g7Ci0JICAgIH0KLQkgICAgc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKLQkgICAgaWYgKGJ1ZmZlcl9kaXJ0eShiaF9yZXN1bHQpICYmIHJlaXNlcmZzX2RhdGFfb3JkZXJlZChpbm9kZS0+aV9zYikpCi0JICAgIAlyZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KGlub2RlLCBiaF9yZXN1bHQpOwotCSAgICBwdXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtLCBhbGxvY2F0ZWRfYmxvY2tfbnIpIDsKLSAgICAgICAgICAgIHVuZm1fcHRyID0gYWxsb2NhdGVkX2Jsb2NrX25yOwotCSAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBpbm9kZS0+aV9zYiwgYmgpOwotCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7CisJLyogSWYgZmlsZSBpcyBvZiBzdWNoIGEgc2l6ZSwgdGhhdCBpdCBtaWdodCBoYXZlIGEgdGFpbCBhbmQgdGFpbHMgYXJlIGVuYWJsZWQKKwkgKiogd2Ugc2hvdWxkIG1hcmsgaXQgYXMgcG9zc2libHkgbmVlZGluZyB0YWlsIHBhY2tpbmcgb24gY2xvc2UKKwkgKi8KKwlpZiAoKGhhdmVfbGFyZ2VfdGFpbHMoaW5vZGUtPmlfc2IpCisJICAgICAmJiBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplKGlub2RlKSAqIDQpCisJICAgIHx8IChoYXZlX3NtYWxsX3RhaWxzKGlub2RlLT5pX3NiKQorCQkmJiBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplKGlub2RlKSkpCisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfcGFja19vbl9jbG9zZV9tYXNrOworCisJLyogc2V0IHRoZSBrZXkgb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlICdibG9jayctdGggYmxvY2sgb2YgZmlsZSAqLworCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgbmV3X29mZnNldCwgVFlQRV9BTlksIDMgLyprZXkgbGVuZ3RoICovICk7CisJaWYgKChuZXdfb2Zmc2V0ICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPiBpbm9kZS0+aV9zaXplKSB7CisJICAgICAgc3RhcnRfdHJhbnM6CisJCXRoID0gcmVpc2VyZnNfcGVyc2lzdGVudF90cmFuc2FjdGlvbihpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJaWYgKCF0aCkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwogCX0KLQlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsIHVuZm1fcHRyLCBpbm9kZSk7Ci0JcGF0aHJlbHNlICgmcGF0aCk7Ci0gICAgICAgIHJldHZhbCA9IDA7Ci0JaWYgKCFkYW5nbGUgJiYgdGgpCi0JICAgIHJldHZhbCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKyAgICAgIHJlc2VhcmNoOgogCi0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQkgCi0JLyogdGhlIGl0ZW0gd2FzIGZvdW5kLCBzbyBuZXcgYmxvY2tzIHdlcmUgbm90IGFkZGVkIHRvIHRoZSBmaWxlCi0JKiogdGhlcmUgaXMgbm8gbmVlZCB0byBtYWtlIHN1cmUgdGhlIGlub2RlIGlzIHVwZGF0ZWQgd2l0aCB0aGlzIAotCSoqIHRyYW5zYWN0aW9uCi0JKi8KLQlyZXR1cm4gcmV0dmFsOwotICAgIH0KKwlyZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBmYWlsdXJlOworCX0KIAotICAgIGlmICghdGgpIHsKLQlwYXRocmVsc2UoJnBhdGgpIDsKLQlnb3RvIHN0YXJ0X3RyYW5zOwotICAgIH0KKwliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwlpaCA9IGdldF9paCgmcGF0aCk7CisJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwlwb3NfaW5faXRlbSA9IHBhdGgucG9zX2luX2l0ZW07CiAKLSAgICAvKiBkZXNpcmVkIHBvc2l0aW9uIGlzIG5vdCBmb3VuZCBvciBpcyBpbiB0aGUgZGlyZWN0IGl0ZW0uIFdlIGhhdmUKLSAgICAgICB0byBhcHBlbmQgZmlsZSB3aXRoIGhvbGVzIHVwIHRvICdibG9jayctdGggYmxvY2sgY29udmVydGluZwotICAgICAgIGRpcmVjdCBpdGVtcyB0byBpbmRpcmVjdCBvbmUgaWYgbmVjZXNzYXJ5ICovCi0gICAgZG9uZSA9IDA7Ci0gICAgZG8gewotCWlmIChpc19zdGF0ZGF0YV9sZV9paCAoaWgpKSB7Ci0JICAgIF9fbGUzMiB1bnAgPSAwOwotCSAgICBzdHJ1Y3QgY3B1X2tleSB0bXBfa2V5OworCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKKwljb3B5X2l0ZW1faGVhZCgmdG1wX2loLCBpaCk7CiAKLQkgICAgLyogaW5kaXJlY3QgaXRlbSBoYXMgdG8gYmUgaW5zZXJ0ZWQgKi8KLQkgICAgbWFrZV9sZV9pdGVtX2hlYWQgKCZ0bXBfaWgsICZrZXksIHZlcnNpb24sIDEsIFRZUEVfSU5ESVJFQ1QsIAotCQkJICAgICAgIFVORk1fUF9TSVpFLCAwLyogZnJlZV9zcGFjZSAqLyk7CisJaWYgKGFsbG9jYXRpb25fbmVlZGVkCisJICAgIChyZXR2YWwsIGFsbG9jYXRlZF9ibG9ja19uciwgaWgsIGl0ZW0sIHBvc19pbl9pdGVtKSkgeworCQkvKiB3ZSBoYXZlIHRvIGFsbG9jYXRlIGJsb2NrIGZvciB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLworCQlpZiAoIXRoKSB7CisJCQlwYXRocmVsc2UoJnBhdGgpOworCQkJZ290byBzdGFydF90cmFuczsKKwkJfQogCi0JICAgIGlmIChjcHVfa2V5X2tfb2Zmc2V0ICgma2V5KSA9PSAxKSB7Ci0JCS8qIHdlIGFyZSBnb2luZyB0byBhZGQgJ2Jsb2NrJy10aCBibG9jayB0byB0aGUgZmlsZS4gVXNlCi0JCSAgIGFsbG9jYXRlZCBibG9jayBmb3IgdGhhdCAqLwotCQl1bnAgPSBjcHVfdG9fbGUzMiAoYWxsb2NhdGVkX2Jsb2NrX25yKTsKLQkJc2V0X2Jsb2NrX2Rldl9tYXBwZWQgKGJoX3Jlc3VsdCwgYWxsb2NhdGVkX2Jsb2NrX25yLCBpbm9kZSk7Ci0JCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7Ci0JCWRvbmUgPSAxOwotCSAgICB9Ci0JICAgIHRtcF9rZXkgPSBrZXk7IC8vIDspCi0JICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmdG1wX2tleSwgMSk7Ci0JICAgIFBBVEhfTEFTVF9QT1NJVElPTigmcGF0aCkgKys7CisJCXJlcGVhdCA9CisJCSAgICBfYWxsb2NhdGVfYmxvY2sodGgsIGJsb2NrLCBpbm9kZSwgJmFsbG9jYXRlZF9ibG9ja19uciwKKwkJCQkgICAgJnBhdGgsIGNyZWF0ZSk7CiAKLQkgICAgcmV0dmFsID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCAmcGF0aCwgJnRtcF9rZXksICZ0bXBfaWgsIGlub2RlLCAoY2hhciAqKSZ1bnApOwotCSAgICBpZiAocmV0dmFsKSB7Ci0JCXJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCAxKTsKLQkJZ290byBmYWlsdXJlOyAvLyByZXR2YWwgPT0gLUVOT1NQQywgLUVEUVVPVCBvciAtRUlPIG9yIC1FRVhJU1QKLQkgICAgfQotCSAgICAvL21hcmtfdGFpbF9jb252ZXJ0ZWQgKGlub2RlKTsKLQl9IGVsc2UgaWYgKGlzX2RpcmVjdF9sZV9paCAoaWgpKSB7Ci0JICAgIC8qIGRpcmVjdCBpdGVtIGhhcyB0byBiZSBjb252ZXJ0ZWQgKi8KLQkgICAgbG9mZl90IHRhaWxfb2Zmc2V0OworCQlpZiAocmVwZWF0ID09IE5PX0RJU0tfU1BBQ0UgfHwgcmVwZWF0ID09IFFVT1RBX0VYQ0VFREVEKSB7CisJCQkvKiByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiB0byBnaXZlIHRoZSBqb3VybmFsIGEgY2hhbmNlIHRvIGZyZWUKKwkJCSAqKiBzb21lIGJsb2Nrcy4gIHJlbGVhc2VzIHRoZSBwYXRoLCBzbyB3ZSBoYXZlIHRvIGdvIGJhY2sgdG8KKwkJCSAqKiByZXNlYXJjaCBpZiB3ZSBzdWNjZWVkIG9uIHRoZSBzZWNvbmQgdHJ5CisJCQkgKi8KKwkJCVNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxOworCQkJcmV0dmFsID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBmYWlsdXJlOworCQkJcmVwZWF0ID0KKwkJCSAgICBfYWxsb2NhdGVfYmxvY2sodGgsIGJsb2NrLCBpbm9kZSwKKwkJCQkJICAgICZhbGxvY2F0ZWRfYmxvY2tfbnIsIE5VTEwsIGNyZWF0ZSk7CiAKLQkgICAgdGFpbF9vZmZzZXQgPSAoKGxlX2loX2tfb2Zmc2V0IChpaCkgLSAxKSAmIH4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKLQkgICAgaWYgKHRhaWxfb2Zmc2V0ID09IGNwdV9rZXlfa19vZmZzZXQgKCZrZXkpKSB7Ci0JCS8qIGRpcmVjdCBpdGVtIHdlIGp1c3QgZm91bmQgZml0cyBpbnRvIGJsb2NrIHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgICB0byBtYXAuIENvbnZlcnQgaXQgaW50byB1bmZvcm1hdHRlZCBub2RlOiB1c2UKLSAgICAgICAgICAgICAgICAgICBiaF9yZXN1bHQgZm9yIHRoZSBjb252ZXJzaW9uICovCi0JCXNldF9ibG9ja19kZXZfbWFwcGVkIChiaF9yZXN1bHQsIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOwotCQl1bmJoID0gYmhfcmVzdWx0OwotCQlkb25lID0gMTsKLQkgICAgfSBlbHNlIHsKLQkJLyogd2UgaGF2ZSB0byBwYWRkIGZpbGUgdGFpbCBzdG9yZWQgaW4gZGlyZWN0IGl0ZW0ocykKLQkJICAgdXAgdG8gYmxvY2sgc2l6ZSBhbmQgY29udmVydCBpdCB0byB1bmZvcm1hdHRlZAotCQkgICBub2RlLiBGSVhNRTogdGhpcyBzaG91bGQgYWxzbyBnZXQgaW50byBwYWdlIGNhY2hlICovCi0KLQkJcGF0aHJlbHNlKCZwYXRoKSA7Ci0JCS8qCi0JCSAqIHVnbHksIGJ1dCB3ZSBjYW4gb25seSBlbmQgdGhlIHRyYW5zYWN0aW9uIGlmCi0JCSAqIHdlIGFyZW4ndCBuZXN0ZWQKLQkJICovCi0JCUJVR19PTiAoIXRoLT50X3JlZmNvdW50KTsKLQkJaWYgKHRoLT50X3JlZmNvdW50ID09IDEpIHsKLQkJICAgIHJldHZhbCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKLQkJICAgIHRoID0gTlVMTDsKLQkJICAgIGlmIChyZXR2YWwpCisJCQlpZiAocmVwZWF0ICE9IE5PX0RJU0tfU1BBQ0UgJiYgcmVwZWF0ICE9IFFVT1RBX0VYQ0VFREVEKSB7CisJCQkJZ290byByZXNlYXJjaDsKKwkJCX0KKwkJCWlmIChyZXBlYXQgPT0gUVVPVEFfRVhDRUVERUQpCisJCQkJcmV0dmFsID0gLUVEUVVPVDsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRU5PU1BDOwogCQkJZ290byBmYWlsdXJlOwogCQl9CiAKLQkJcmV0dmFsID0gY29udmVydF90YWlsX2Zvcl9ob2xlKGlub2RlLCBiaF9yZXN1bHQsIHRhaWxfb2Zmc2V0KSA7Ci0JCWlmIChyZXR2YWwpIHsKLQkJICAgIGlmICggcmV0dmFsICE9IC1FTk9TUEMgKQotCQkJcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJjbG0tNjAwNDogY29udmVydCB0YWlsIGZhaWxlZCBpbm9kZSAlbHUsIGVycm9yICVkIiwgaW5vZGUtPmlfaW5vLCByZXR2YWwpIDsKLQkJICAgIGlmIChhbGxvY2F0ZWRfYmxvY2tfbnIpIHsKLQkJCS8qIHRoZSBiaXRtYXAsIHRoZSBzdXBlciwgYW5kIHRoZSBzdGF0IGRhdGEgPT0gMyAqLwotCQkJaWYgKCF0aCkKLQkJCSAgICB0aCA9IHJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oaW5vZGUtPmlfc2IsMyk7Ci0JCQlpZiAodGgpCi0JCQkgICAgcmVpc2VyZnNfZnJlZV9ibG9jayAodGgsaW5vZGUsYWxsb2NhdGVkX2Jsb2NrX25yLDEpOwotCQkgICAgfQotCQkgICAgZ290byBmYWlsdXJlIDsKKwkJaWYgKGZzX2NoYW5nZWQoZnNfZ2VuLCBpbm9kZS0+aV9zYikKKwkJICAgICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCQlnb3RvIHJlc2VhcmNoOwogCQl9Ci0JCWdvdG8gcmVzZWFyY2ggOwotCSAgICB9Ci0JICAgIHJldHZhbCA9IGRpcmVjdDJpbmRpcmVjdCAodGgsIGlub2RlLCAmcGF0aCwgdW5iaCwgdGFpbF9vZmZzZXQpOwotCSAgICBpZiAocmV0dmFsKSB7Ci0JCXJlaXNlcmZzX3VubWFwX2J1ZmZlcih1bmJoKTsKLQkJcmVpc2VyZnNfZnJlZV9ibG9jayAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOwotCQlnb3RvIGZhaWx1cmU7Ci0JICAgIH0KLQkgICAgLyogaXQgaXMgaW1wb3J0YW50IHRoZSBzZXRfYnVmZmVyX3VwdG9kYXRlIGlzIGRvbmUgYWZ0ZXIKLQkgICAgKiogdGhlIGRpcmVjdDJpbmRpcmVjdC4gIFRoZSBidWZmZXIgbWlnaHQgY29udGFpbiB2YWxpZAotCSAgICAqKiBkYXRhIG5ld2VyIHRoYW4gdGhlIGRhdGEgb24gZGlzayAocmVhZCBieSByZWFkcGFnZSwgY2hhbmdlZCwKLQkgICAgKiogYW5kIHRoZW4gc2VudCBoZXJlIGJ5IHdyaXRlcGFnZSkuICBkaXJlY3QyaW5kaXJlY3QgbmVlZHMKLQkgICAgKiogdG8ga25vdyBpZiB1bmJoIHdhcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHNvIGl0IGNhbiBkZWNpZGUKLQkgICAgKiogaWYgdGhlIGRhdGEgaW4gdW5iaCBuZWVkcyB0byBiZSByZXBsYWNlZCB3aXRoIGRhdGEgZnJvbQotCSAgICAqKiB0aGUgZGlzawotCSAgICAqLwotCSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlICh1bmJoKTsKKwl9CiAKLQkgICAgLyogdW5iaC0+Yl9wYWdlID09IE5VTEwgaW4gY2FzZSBvZiBESVJFQ1RfSU8gcmVxdWVzdCwgdGhpcyBtZWFucwotCSAgICAgICBidWZmZXIgd2lsbCBkaXNhcHBlYXIgc2hvcnRseSwgc28gaXQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0bwotCSAgICAgKi8KLQkgICAgaWYgKCB1bmJoLT5iX3BhZ2UgKSB7Ci0JCS8qIHdlJ3ZlIGNvbnZlcnRlZCB0aGUgdGFpbCwgc28gd2UgbXVzdAotCQkqKiBmbHVzaCB1bmJoIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cwotCQkqLwotCQlyZWlzZXJmc19hZGRfdGFpbF9saXN0KGlub2RlLCB1bmJoKSA7CisJaWYgKGluZGlyZWN0X2l0ZW1fZm91bmQocmV0dmFsLCBpaCkpIHsKKwkJYl9ibG9ja25yX3QgdW5mbV9wdHI7CisJCS8qICdibG9jayctdGggYmxvY2sgaXMgaW4gdGhlIGZpbGUgYWxyZWFkeSAodGhlcmUgaXMKKwkJICAgY29ycmVzcG9uZGluZyBjZWxsIGluIHNvbWUgaW5kaXJlY3QgaXRlbSkuIEJ1dCBpdCBtYXkgYmUKKwkJICAgemVybyB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgKGhvbGUpICovCisJCXVuZm1fcHRyID0gZ2V0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSk7CisJCWlmICh1bmZtX3B0ciA9PSAwKSB7CisJCQkvKiB1c2UgYWxsb2NhdGVkIGJsb2NrIHRvIHBsdWcgdGhlIGhvbGUgKi8KKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKTsKKwkJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCQkgICAgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihpbm9kZS0+aV9zYiwKKwkJCQkJCQkJIGJoKTsKKwkJCQlnb3RvIHJlc2VhcmNoOworCQkJfQorCQkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkJCWlmIChidWZmZXJfZGlydHkoYmhfcmVzdWx0KQorCQkJICAgICYmIHJlaXNlcmZzX2RhdGFfb3JkZXJlZChpbm9kZS0+aV9zYikpCisJCQkJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmhfcmVzdWx0KTsKKwkJCXB1dF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0sIGFsbG9jYXRlZF9ibG9ja19ucik7CisJCQl1bmZtX3B0ciA9IGFsbG9jYXRlZF9ibG9ja19ucjsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKKwkJCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOworCQl9CisJCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwgdW5mbV9wdHIsIGlub2RlKTsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJcmV0dmFsID0gMDsKKwkJaWYgKCFkYW5nbGUgJiYgdGgpCisJCQlyZXR2YWwgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CiAKLQkJLyogbWFyayBpdCBkaXJ0eSBub3cgdG8gcHJldmVudCBjb21taXRfd3JpdGUgZnJvbSBhZGRpbmcKLQkJKiogdGhpcyBidWZmZXIgdG8gdGhlIGlub2RlJ3MgZGlydHkgYnVmZmVyIGxpc3QKLQkJKi8KLQkJLyoKLQkJICogQUtQTTogY2hhbmdlZCBfX21hcmtfYnVmZmVyX2RpcnR5IHRvIG1hcmtfYnVmZmVyX2RpcnR5KCkuCi0JCSAqIEl0J3Mgc3RpbGwgYXRvbWljLCBidXQgaXQgc2V0cyB0aGUgcGFnZSBkaXJ0eSB0b28sCi0JCSAqIHdoaWNoIG1ha2VzIGl0IGVsaWdpYmxlIGZvciB3cml0ZWJhY2sgYXQgYW55IHRpbWUgYnkgdGhlCi0JCSAqIFZNICh3aGljaCB3YXMgYWxzbyB0aGUgY2FzZSB3aXRoIF9fbWFya19idWZmZXJfZGlydHkoKSkKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKworCQkvKiB0aGUgaXRlbSB3YXMgZm91bmQsIHNvIG5ldyBibG9ja3Mgd2VyZSBub3QgYWRkZWQgdG8gdGhlIGZpbGUKKwkJICoqIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbm9kZSBpcyB1cGRhdGVkIHdpdGggdGhpcyAKKwkJICoqIHRyYW5zYWN0aW9uCiAJCSAqLwotCQltYXJrX2J1ZmZlcl9kaXJ0eSh1bmJoKSA7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICAvKiBhcHBlbmQgaW5kaXJlY3QgaXRlbSB3aXRoIGhvbGVzIGlmIG5lZWRlZCwgd2hlbiBhcHBlbmRpbmcKLQkgICAgICAgcG9pbnRlciB0byAnYmxvY2snLXRoIGJsb2NrIHVzZSBibG9jaywgd2hpY2ggaXMgYWxyZWFkeQotCSAgICAgICBhbGxvY2F0ZWQgKi8KLQkgICAgc3RydWN0IGNwdV9rZXkgdG1wX2tleTsKLQkgICAgdW5wX3QgdW5mX3NpbmdsZT0wOyAvLyBXZSB1c2UgdGhpcyBpbiBjYXNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgb25seQotCQkJCS8vIG9uZSBibG9jayB3aGljaCBpcyBhIGZhc3RwYXRoCi0JICAgIHVucF90ICp1bjsKLQkgICAgX191NjQgbWF4X3RvX2luc2VydD1NQVhfSVRFTV9MRU4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKS9VTkZNX1BfU0laRTsKLQkgICAgX191NjQgYmxvY2tzX25lZWRlZDsKLQotCSAgICBSRkFMU0UoIHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKGloKSAvIFVORk1fUF9TSVpFLAotCQkgICAgInZzLTgwNDogaW52YWxpZCBwb3NpdGlvbiBmb3IgYXBwZW5kIik7Ci0JICAgIC8qIGluZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGFwcGVuZGVkLCBzZXQgdXAga2V5IG9mIHRoYXQgcG9zaXRpb24gKi8KLQkgICAgbWFrZV9jcHVfa2V5ICgmdG1wX2tleSwgaW5vZGUsCi0JCQkgIGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwgJihpaC0+aWhfa2V5KSkgKyBvcF9ieXRlc19udW1iZXIgKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLAotCQkJICAvL3Bvc19pbl9pdGVtICogaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLAotCQkJICBUWVBFX0lORElSRUNULCAzKTsvLyBrZXkgdHlwZSBpcyB1bmltcG9ydGFudAotCi0JICAgIGJsb2Nrc19uZWVkZWQgPSAxICsgKChjcHVfa2V5X2tfb2Zmc2V0ICgma2V5KSAtIGNwdV9rZXlfa19vZmZzZXQgKCZ0bXBfa2V5KSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOwotCSAgICBSRkFMU0UoIGJsb2Nrc19uZWVkZWQgPCAwLCAiZ3JlZW4tODA1OiBpbnZhbGlkIG9mZnNldCIpOwotCi0JICAgIGlmICggYmxvY2tzX25lZWRlZCA9PSAxICkgewotCQl1biA9ICZ1bmZfc2luZ2xlOwotCSAgICB9IGVsc2UgewotCQl1bj1rbWFsbG9jKCBtaW4oYmxvY2tzX25lZWRlZCxtYXhfdG9faW5zZXJ0KSpVTkZNX1BfU0laRSwKLQkJCSAgICBHRlBfQVRPTUlDKTsgLy8gV2UgbmVlZCB0byBhdm9pZCBzY2hlZHVsaW5nLgotCQlpZiAoICF1bikgewotCQkgICAgdW4gPSAmdW5mX3NpbmdsZTsKLQkJICAgIGJsb2Nrc19uZWVkZWQgPSAxOwotCQkgICAgbWF4X3RvX2luc2VydCA9IDA7Ci0JCX0gZWxzZQotCQkgICAgbWVtc2V0KHVuLCAwLCBVTkZNX1BfU0laRSAqIG1pbihibG9ja3NfbmVlZGVkLG1heF90b19pbnNlcnQpKTsKLQkgICAgfQotCSAgICBpZiAoIGJsb2Nrc19uZWVkZWQgPD0gbWF4X3RvX2luc2VydCkgewotCQkvKiB3ZSBhcmUgZ29pbmcgdG8gYWRkIHRhcmdldCBibG9jayB0byB0aGUgZmlsZS4gVXNlIGFsbG9jYXRlZAotCQkgICBibG9jayBmb3IgdGhhdCAqLwotCQl1bltibG9ja3NfbmVlZGVkLTFdID0gY3B1X3RvX2xlMzIgKGFsbG9jYXRlZF9ibG9ja19ucik7Ci0JCXNldF9ibG9ja19kZXZfbWFwcGVkIChiaF9yZXN1bHQsIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOwotCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOwotCQlkb25lID0gMTsKLQkgICAgfSBlbHNlIHsKLQkJLyogcGFzdGUgaG9sZSB0byB0aGUgaW5kaXJlY3QgaXRlbSAqLwotCQkvKiBJZiBrbWFsbG9jIGZhaWxlZCwgbWF4X3RvX2luc2VydCBiZWNvbWVzIHplcm8gYW5kIGl0IG1lYW5zIHdlCi0JCSAgIG9ubHkgaGF2ZSBzcGFjZSBmb3Igb25lIGJsb2NrICovCi0JCWJsb2Nrc19uZWVkZWQ9bWF4X3RvX2luc2VydD9tYXhfdG9faW5zZXJ0OjE7Ci0JICAgIH0KLQkgICAgcmV0dmFsID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtICh0aCwgJnBhdGgsICZ0bXBfa2V5LCBpbm9kZSwgKGNoYXIgKil1biwgVU5GTV9QX1NJWkUgKiBibG9ja3NfbmVlZGVkKTsKLQotCSAgICBpZiAoYmxvY2tzX25lZWRlZCAhPSAxKQotCQlrZnJlZSh1bik7Ci0KLQkgICAgaWYgKHJldHZhbCkgewotCQlyZWlzZXJmc19mcmVlX2Jsb2NrICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7Ci0JCWdvdG8gZmFpbHVyZTsKLQkgICAgfQotCSAgICBpZiAoIWRvbmUpIHsKLQkJLyogV2UgbmVlZCB0byBtYXJrIG5ldyBmaWxlIHNpemUgaW4gY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKLQkJICAgaW50ZXJydXB0ZWQvYWJvcnRlZCBsYXRlciBvbi4gQW5kIHdlIG1heSBkbyB0aGlzIG9ubHkgZm9yCi0JCSAgIGhvbGVzLiAqLwotCQlpbm9kZS0+aV9zaXplICs9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAqIGJsb2Nrc19uZWVkZWQ7Ci0JICAgIH0KKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlpZiAoZG9uZSA9PSAxKQotCSAgICBicmVhazsKLQotCS8qIHRoaXMgbG9vcCBjb3VsZCBsb2cgbW9yZSBibG9ja3MgdGhhbiB3ZSBoYWQgb3JpZ2luYWxseSBhc2tlZAotCSoqIGZvci4gIFNvLCB3ZSBoYXZlIHRvIGFsbG93IHRoZSB0cmFuc2FjdGlvbiB0byBlbmQgaWYgaXQgaXMKLQkqKiB0b28gYmlnIG9yIHRvbyBmdWxsLiAgVXBkYXRlIHRoZSBpbm9kZSBzbyB0aGluZ3MgYXJlIAotCSoqIGNvbnNpc3RlbnQgaWYgd2UgY3Jhc2ggYmVmb3JlIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0JKioKLQkqKiByZWxlYXNlIHRoZSBwYXRoIHNvIHRoYXQgYW55Ym9keSB3YWl0aW5nIG9uIHRoZSBwYXRoIGJlZm9yZQotCSoqIGVuZGluZyB0aGVpciB0cmFuc2FjdGlvbiB3aWxsIGJlIGFibGUgdG8gY29udGludWUuCi0JKi8KLQlpZiAoam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kKHRoLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSkgewotCSAgcmV0dmFsID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKSA7Ci0JICBpZiAocmV0dmFsKQotCSAgICBnb3RvIGZhaWx1cmU7CisJaWYgKCF0aCkgeworCQlwYXRocmVsc2UoJnBhdGgpOworCQlnb3RvIHN0YXJ0X3RyYW5zOwogCX0KLQkvKiBpbnNlcnRpbmcgaW5kaXJlY3QgcG9pbnRlcnMgZm9yIGEgaG9sZSBjYW4gdGFrZSBhIAotCSoqIGxvbmcgdGltZS4gIHJlc2NoZWR1bGUgaWYgbmVlZGVkCi0JKi8KLQljb25kX3Jlc2NoZWQoKTsKIAotCXJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQkgICAgcmV0dmFsID0gLUVJTzsKLQkgICAgZ290byBmYWlsdXJlOworCS8qIGRlc2lyZWQgcG9zaXRpb24gaXMgbm90IGZvdW5kIG9yIGlzIGluIHRoZSBkaXJlY3QgaXRlbS4gV2UgaGF2ZQorCSAgIHRvIGFwcGVuZCBmaWxlIHdpdGggaG9sZXMgdXAgdG8gJ2Jsb2NrJy10aCBibG9jayBjb252ZXJ0aW5nCisJICAgZGlyZWN0IGl0ZW1zIHRvIGluZGlyZWN0IG9uZSBpZiBuZWNlc3NhcnkgKi8KKwlkb25lID0gMDsKKwlkbyB7CisJCWlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpIHsKKwkJCV9fbGUzMiB1bnAgPSAwOworCQkJc3RydWN0IGNwdV9rZXkgdG1wX2tleTsKKworCQkJLyogaW5kaXJlY3QgaXRlbSBoYXMgdG8gYmUgaW5zZXJ0ZWQgKi8KKwkJCW1ha2VfbGVfaXRlbV9oZWFkKCZ0bXBfaWgsICZrZXksIHZlcnNpb24sIDEsCisJCQkJCSAgVFlQRV9JTkRJUkVDVCwgVU5GTV9QX1NJWkUsCisJCQkJCSAgMCAvKiBmcmVlX3NwYWNlICovICk7CisKKwkJCWlmIChjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpID09IDEpIHsKKwkJCQkvKiB3ZSBhcmUgZ29pbmcgdG8gYWRkICdibG9jayctdGggYmxvY2sgdG8gdGhlIGZpbGUuIFVzZQorCQkJCSAgIGFsbG9jYXRlZCBibG9jayBmb3IgdGhhdCAqLworCQkJCXVucCA9IGNwdV90b19sZTMyKGFsbG9jYXRlZF9ibG9ja19ucik7CisJCQkJc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LAorCQkJCQkJICAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKKwkJCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQkJCWRvbmUgPSAxOworCQkJfQorCQkJdG1wX2tleSA9IGtleTsJLy8gOykKKwkJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZ0bXBfa2V5LCAxKTsKKwkJCVBBVEhfTEFTVF9QT1NJVElPTigmcGF0aCkrKzsKKworCQkJcmV0dmFsID0KKwkJCSAgICByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgJnBhdGgsICZ0bXBfa2V5LCAmdG1wX2loLAorCQkJCQkJIGlub2RlLCAoY2hhciAqKSZ1bnApOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLAorCQkJCQkJICAgIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJCQkJZ290byBmYWlsdXJlOwkvLyByZXR2YWwgPT0gLUVOT1NQQywgLUVEUVVPVCBvciAtRUlPIG9yIC1FRVhJU1QKKwkJCX0KKwkJCS8vbWFya190YWlsX2NvbnZlcnRlZCAoaW5vZGUpOworCQl9IGVsc2UgaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpIHsKKwkJCS8qIGRpcmVjdCBpdGVtIGhhcyB0byBiZSBjb252ZXJ0ZWQgKi8KKwkJCWxvZmZfdCB0YWlsX29mZnNldDsKKworCQkJdGFpbF9vZmZzZXQgPQorCQkJICAgICgobGVfaWhfa19vZmZzZXQoaWgpIC0KKwkJCSAgICAgIDEpICYgfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgKyAxOworCQkJaWYgKHRhaWxfb2Zmc2V0ID09IGNwdV9rZXlfa19vZmZzZXQoJmtleSkpIHsKKwkJCQkvKiBkaXJlY3QgaXRlbSB3ZSBqdXN0IGZvdW5kIGZpdHMgaW50byBibG9jayB3ZSBoYXZlCisJCQkJICAgdG8gbWFwLiBDb252ZXJ0IGl0IGludG8gdW5mb3JtYXR0ZWQgbm9kZTogdXNlCisJCQkJICAgYmhfcmVzdWx0IGZvciB0aGUgY29udmVyc2lvbiAqLworCQkJCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwKKwkJCQkJCSAgICAgYWxsb2NhdGVkX2Jsb2NrX25yLCBpbm9kZSk7CisJCQkJdW5iaCA9IGJoX3Jlc3VsdDsKKwkJCQlkb25lID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogd2UgaGF2ZSB0byBwYWRkIGZpbGUgdGFpbCBzdG9yZWQgaW4gZGlyZWN0IGl0ZW0ocykKKwkJCQkgICB1cCB0byBibG9jayBzaXplIGFuZCBjb252ZXJ0IGl0IHRvIHVuZm9ybWF0dGVkCisJCQkJICAgbm9kZS4gRklYTUU6IHRoaXMgc2hvdWxkIGFsc28gZ2V0IGludG8gcGFnZSBjYWNoZSAqLworCisJCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCQkvKgorCQkJCSAqIHVnbHksIGJ1dCB3ZSBjYW4gb25seSBlbmQgdGhlIHRyYW5zYWN0aW9uIGlmCisJCQkJICogd2UgYXJlbid0IG5lc3RlZAorCQkJCSAqLworCQkJCUJVR19PTighdGgtPnRfcmVmY291bnQpOworCQkJCWlmICh0aC0+dF9yZWZjb3VudCA9PSAxKSB7CisJCQkJCXJldHZhbCA9CisJCQkJCSAgICByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbgorCQkJCQkgICAgKHRoKTsKKwkJCQkJdGggPSBOVUxMOworCQkJCQlpZiAocmV0dmFsKQorCQkJCQkJZ290byBmYWlsdXJlOworCQkJCX0KKworCQkJCXJldHZhbCA9CisJCQkJICAgIGNvbnZlcnRfdGFpbF9mb3JfaG9sZShpbm9kZSwgYmhfcmVzdWx0LAorCQkJCQkJCSAgdGFpbF9vZmZzZXQpOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJaWYgKHJldHZhbCAhPSAtRU5PU1BDKQorCQkJCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJCQkJICJjbG0tNjAwNDogY29udmVydCB0YWlsIGZhaWxlZCBpbm9kZSAlbHUsIGVycm9yICVkIiwKKwkJCQkJCQkJIGlub2RlLT5pX2lubywKKwkJCQkJCQkJIHJldHZhbCk7CisJCQkJCWlmIChhbGxvY2F0ZWRfYmxvY2tfbnIpIHsKKwkJCQkJCS8qIHRoZSBiaXRtYXAsIHRoZSBzdXBlciwgYW5kIHRoZSBzdGF0IGRhdGEgPT0gMyAqLworCQkJCQkJaWYgKCF0aCkKKwkJCQkJCQl0aCA9IHJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oaW5vZGUtPmlfc2IsIDMpOworCQkJCQkJaWYgKHRoKQorCQkJCQkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsCisJCQkJCQkJCQkgICAgaW5vZGUsCisJCQkJCQkJCQkgICAgYWxsb2NhdGVkX2Jsb2NrX25yLAorCQkJCQkJCQkJICAgIDEpOworCQkJCQl9CisJCQkJCWdvdG8gZmFpbHVyZTsKKwkJCQl9CisJCQkJZ290byByZXNlYXJjaDsKKwkJCX0KKwkJCXJldHZhbCA9CisJCQkgICAgZGlyZWN0MmluZGlyZWN0KHRoLCBpbm9kZSwgJnBhdGgsIHVuYmgsCisJCQkJCSAgICB0YWlsX29mZnNldCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHVuYmgpOworCQkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLAorCQkJCQkJICAgIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJCQkJZ290byBmYWlsdXJlOworCQkJfQorCQkJLyogaXQgaXMgaW1wb3J0YW50IHRoZSBzZXRfYnVmZmVyX3VwdG9kYXRlIGlzIGRvbmUgYWZ0ZXIKKwkJCSAqKiB0aGUgZGlyZWN0MmluZGlyZWN0LiAgVGhlIGJ1ZmZlciBtaWdodCBjb250YWluIHZhbGlkCisJCQkgKiogZGF0YSBuZXdlciB0aGFuIHRoZSBkYXRhIG9uIGRpc2sgKHJlYWQgYnkgcmVhZHBhZ2UsIGNoYW5nZWQsCisJCQkgKiogYW5kIHRoZW4gc2VudCBoZXJlIGJ5IHdyaXRlcGFnZSkuICBkaXJlY3QyaW5kaXJlY3QgbmVlZHMKKwkJCSAqKiB0byBrbm93IGlmIHVuYmggd2FzIGFscmVhZHkgdXAgdG8gZGF0ZSwgc28gaXQgY2FuIGRlY2lkZQorCQkJICoqIGlmIHRoZSBkYXRhIGluIHVuYmggbmVlZHMgdG8gYmUgcmVwbGFjZWQgd2l0aCBkYXRhIGZyb20KKwkJCSAqKiB0aGUgZGlzaworCQkJICovCisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKHVuYmgpOworCisJCQkvKiB1bmJoLT5iX3BhZ2UgPT0gTlVMTCBpbiBjYXNlIG9mIERJUkVDVF9JTyByZXF1ZXN0LCB0aGlzIG1lYW5zCisJCQkgICBidWZmZXIgd2lsbCBkaXNhcHBlYXIgc2hvcnRseSwgc28gaXQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0bworCQkJICovCisJCQlpZiAodW5iaC0+Yl9wYWdlKSB7CisJCQkJLyogd2UndmUgY29udmVydGVkIHRoZSB0YWlsLCBzbyB3ZSBtdXN0CisJCQkJICoqIGZsdXNoIHVuYmggYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzCisJCQkJICovCisJCQkJcmVpc2VyZnNfYWRkX3RhaWxfbGlzdChpbm9kZSwgdW5iaCk7CisKKwkJCQkvKiBtYXJrIGl0IGRpcnR5IG5vdyB0byBwcmV2ZW50IGNvbW1pdF93cml0ZSBmcm9tIGFkZGluZworCQkJCSAqKiB0aGlzIGJ1ZmZlciB0byB0aGUgaW5vZGUncyBkaXJ0eSBidWZmZXIgbGlzdAorCQkJCSAqLworCQkJCS8qCisJCQkJICogQUtQTTogY2hhbmdlZCBfX21hcmtfYnVmZmVyX2RpcnR5IHRvIG1hcmtfYnVmZmVyX2RpcnR5KCkuCisJCQkJICogSXQncyBzdGlsbCBhdG9taWMsIGJ1dCBpdCBzZXRzIHRoZSBwYWdlIGRpcnR5IHRvbywKKwkJCQkgKiB3aGljaCBtYWtlcyBpdCBlbGlnaWJsZSBmb3Igd3JpdGViYWNrIGF0IGFueSB0aW1lIGJ5IHRoZQorCQkJCSAqIFZNICh3aGljaCB3YXMgYWxzbyB0aGUgY2FzZSB3aXRoIF9fbWFya19idWZmZXJfZGlydHkoKSkKKwkJCQkgKi8KKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eSh1bmJoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGFwcGVuZCBpbmRpcmVjdCBpdGVtIHdpdGggaG9sZXMgaWYgbmVlZGVkLCB3aGVuIGFwcGVuZGluZworCQkJICAgcG9pbnRlciB0byAnYmxvY2snLXRoIGJsb2NrIHVzZSBibG9jaywgd2hpY2ggaXMgYWxyZWFkeQorCQkJICAgYWxsb2NhdGVkICovCisJCQlzdHJ1Y3QgY3B1X2tleSB0bXBfa2V5OworCQkJdW5wX3QgdW5mX3NpbmdsZSA9IDA7CS8vIFdlIHVzZSB0aGlzIGluIGNhc2Ugd2UgbmVlZCB0byBhbGxvY2F0ZSBvbmx5CisJCQkvLyBvbmUgYmxvY2sgd2hpY2ggaXMgYSBmYXN0cGF0aAorCQkJdW5wX3QgKnVuOworCQkJX191NjQgbWF4X3RvX2luc2VydCA9CisJCQkgICAgTUFYX0lURU1fTEVOKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkgLworCQkJICAgIFVORk1fUF9TSVpFOworCQkJX191NjQgYmxvY2tzX25lZWRlZDsKKworCQkJUkZBTFNFKHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKGloKSAvIFVORk1fUF9TSVpFLAorCQkJICAgICAgICJ2cy04MDQ6IGludmFsaWQgcG9zaXRpb24gZm9yIGFwcGVuZCIpOworCQkJLyogaW5kaXJlY3QgaXRlbSBoYXMgdG8gYmUgYXBwZW5kZWQsIHNldCB1cCBrZXkgb2YgdGhhdCBwb3NpdGlvbiAqLworCQkJbWFrZV9jcHVfa2V5KCZ0bXBfa2V5LCBpbm9kZSwKKwkJCQkgICAgIGxlX2tleV9rX29mZnNldCh2ZXJzaW9uLAorCQkJCQkJICAgICAmKGloLT5paF9rZXkpKSArCisJCQkJICAgICBvcF9ieXRlc19udW1iZXIoaWgsCisJCQkJCQkgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSksCisJCQkJICAgICAvL3Bvc19pbl9pdGVtICogaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLAorCQkJCSAgICAgVFlQRV9JTkRJUkVDVCwgMyk7CS8vIGtleSB0eXBlIGlzIHVuaW1wb3J0YW50CisKKwkJCWJsb2Nrc19uZWVkZWQgPQorCQkJICAgIDEgKworCQkJICAgICgoY3B1X2tleV9rX29mZnNldCgma2V5KSAtCisJCQkgICAgICBjcHVfa2V5X2tfb2Zmc2V0KCZ0bXBfa2V5KSkgPj4gaW5vZGUtPmlfc2ItPgorCQkJICAgICBzX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCVJGQUxTRShibG9ja3NfbmVlZGVkIDwgMCwgImdyZWVuLTgwNTogaW52YWxpZCBvZmZzZXQiKTsKKworCQkJaWYgKGJsb2Nrc19uZWVkZWQgPT0gMSkgeworCQkJCXVuID0gJnVuZl9zaW5nbGU7CisJCQl9IGVsc2UgeworCQkJCXVuID0ga21hbGxvYyhtaW4oYmxvY2tzX25lZWRlZCwgbWF4X3RvX2luc2VydCkgKiBVTkZNX1BfU0laRSwgR0ZQX0FUT01JQyk7CS8vIFdlIG5lZWQgdG8gYXZvaWQgc2NoZWR1bGluZy4KKwkJCQlpZiAoIXVuKSB7CisJCQkJCXVuID0gJnVuZl9zaW5nbGU7CisJCQkJCWJsb2Nrc19uZWVkZWQgPSAxOworCQkJCQltYXhfdG9faW5zZXJ0ID0gMDsKKwkJCQl9IGVsc2UKKwkJCQkJbWVtc2V0KHVuLCAwLAorCQkJCQkgICAgICAgVU5GTV9QX1NJWkUgKiBtaW4oYmxvY2tzX25lZWRlZCwKKwkJCQkJCQkJIG1heF90b19pbnNlcnQpKTsKKwkJCX0KKwkJCWlmIChibG9ja3NfbmVlZGVkIDw9IG1heF90b19pbnNlcnQpIHsKKwkJCQkvKiB3ZSBhcmUgZ29pbmcgdG8gYWRkIHRhcmdldCBibG9jayB0byB0aGUgZmlsZS4gVXNlIGFsbG9jYXRlZAorCQkJCSAgIGJsb2NrIGZvciB0aGF0ICovCisJCQkJdW5bYmxvY2tzX25lZWRlZCAtIDFdID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoYWxsb2NhdGVkX2Jsb2NrX25yKTsKKwkJCQlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsCisJCQkJCQkgICAgIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOworCQkJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCQkJZG9uZSA9IDE7CisJCQl9IGVsc2UgeworCQkJCS8qIHBhc3RlIGhvbGUgdG8gdGhlIGluZGlyZWN0IGl0ZW0gKi8KKwkJCQkvKiBJZiBrbWFsbG9jIGZhaWxlZCwgbWF4X3RvX2luc2VydCBiZWNvbWVzIHplcm8gYW5kIGl0IG1lYW5zIHdlCisJCQkJICAgb25seSBoYXZlIHNwYWNlIGZvciBvbmUgYmxvY2sgKi8KKwkJCQlibG9ja3NfbmVlZGVkID0KKwkJCQkgICAgbWF4X3RvX2luc2VydCA/IG1heF90b19pbnNlcnQgOiAxOworCQkJfQorCQkJcmV0dmFsID0KKwkJCSAgICByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0odGgsICZwYXRoLCAmdG1wX2tleSwgaW5vZGUsCisJCQkJCQkgICAgIChjaGFyICopdW4sCisJCQkJCQkgICAgIFVORk1fUF9TSVpFICoKKwkJCQkJCSAgICAgYmxvY2tzX25lZWRlZCk7CisKKwkJCWlmIChibG9ja3NfbmVlZGVkICE9IDEpCisJCQkJa2ZyZWUodW4pOworCisJCQlpZiAocmV0dmFsKSB7CisJCQkJcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsCisJCQkJCQkgICAgYWxsb2NhdGVkX2Jsb2NrX25yLCAxKTsKKwkJCQlnb3RvIGZhaWx1cmU7CisJCQl9CisJCQlpZiAoIWRvbmUpIHsKKwkJCQkvKiBXZSBuZWVkIHRvIG1hcmsgbmV3IGZpbGUgc2l6ZSBpbiBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBiZQorCQkJCSAgIGludGVycnVwdGVkL2Fib3J0ZWQgbGF0ZXIgb24uIEFuZCB3ZSBtYXkgZG8gdGhpcyBvbmx5IGZvcgorCQkJCSAgIGhvbGVzLiAqLworCQkJCWlub2RlLT5pX3NpemUgKz0KKwkJCQkgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplICogYmxvY2tzX25lZWRlZDsKKwkJCX0KKwkJfQorCisJCWlmIChkb25lID09IDEpCisJCQlicmVhazsKKworCQkvKiB0aGlzIGxvb3AgY291bGQgbG9nIG1vcmUgYmxvY2tzIHRoYW4gd2UgaGFkIG9yaWdpbmFsbHkgYXNrZWQKKwkJICoqIGZvci4gIFNvLCB3ZSBoYXZlIHRvIGFsbG93IHRoZSB0cmFuc2FjdGlvbiB0byBlbmQgaWYgaXQgaXMKKwkJICoqIHRvbyBiaWcgb3IgdG9vIGZ1bGwuICBVcGRhdGUgdGhlIGlub2RlIHNvIHRoaW5ncyBhcmUgCisJCSAqKiBjb25zaXN0ZW50IGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgZnVuY3Rpb24gcmV0dXJucworCQkgKioKKwkJICoqIHJlbGVhc2UgdGhlIHBhdGggc28gdGhhdCBhbnlib2R5IHdhaXRpbmcgb24gdGhlIHBhdGggYmVmb3JlCisJCSAqKiBlbmRpbmcgdGhlaXIgdHJhbnNhY3Rpb24gd2lsbCBiZSBhYmxlIHRvIGNvbnRpbnVlLgorCQkgKi8KKwkJaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKKwkJCXJldHZhbCA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCk7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCQkvKiBpbnNlcnRpbmcgaW5kaXJlY3QgcG9pbnRlcnMgZm9yIGEgaG9sZSBjYW4gdGFrZSBhIAorCQkgKiogbG9uZyB0aW1lLiAgcmVzY2hlZHVsZSBpZiBuZWVkZWQKKwkJICovCisJCWNvbmRfcmVzY2hlZCgpOworCisJCXJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKwkJaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJ2cy04MjU6IHJlaXNlcmZzX2dldF9ibG9jazogIgorCQkJCQkgIiVLIHNob3VsZCBub3QgYmUgZm91bmQiLCAma2V5KTsKKwkJCXJldHZhbCA9IC1FRVhJU1Q7CisJCQlpZiAoYWxsb2NhdGVkX2Jsb2NrX25yKQorCQkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLAorCQkJCQkJICAgIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJCQlwYXRocmVsc2UoJnBhdGgpOworCQkJZ290byBmYWlsdXJlOworCQl9CisJCWJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpOworCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJCXBvc19pbl9pdGVtID0gcGF0aC5wb3NfaW5faXRlbTsKKwl9IHdoaWxlICgxKTsKKworCXJldHZhbCA9IDA7CisKKyAgICAgIGZhaWx1cmU6CisJaWYgKHRoICYmICghZGFuZ2xlIHx8IChyZXR2YWwgJiYgIXRoLT50X3RyYW5zX2lkKSkpIHsKKwkJaW50IGVycjsKKwkJaWYgKHRoLT50X3RyYW5zX2lkKQorCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJCWVyciA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwkJaWYgKGVycikKKwkJCXJldHZhbCA9IGVycjsKIAl9Ci0JaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTgyNTogcmVpc2VyZnNfZ2V0X2Jsb2NrOiAiCi0JCQkgICAgICAiJUsgc2hvdWxkIG5vdCBiZSBmb3VuZCIsICZrZXkpOwotCSAgICByZXR2YWwgPSAtRUVYSVNUOwotCSAgICBpZiAoYWxsb2NhdGVkX2Jsb2NrX25yKQotCSAgICAgICAgcmVpc2VyZnNfZnJlZV9ibG9jayAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOwotCSAgICBwYXRocmVsc2UoJnBhdGgpIDsKLQkgICAgZ290byBmYWlsdXJlOwotCX0KLQliaCA9IGdldF9sYXN0X2JoICgmcGF0aCk7Ci0JaWggPSBnZXRfaWggKCZwYXRoKTsKLQlpdGVtID0gZ2V0X2l0ZW0gKCZwYXRoKTsKLQlwb3NfaW5faXRlbSA9IHBhdGgucG9zX2luX2l0ZW07Ci0gICAgfSB3aGlsZSAoMSk7CiAKLQotICAgIHJldHZhbCA9IDA7Ci0KLSBmYWlsdXJlOgotICAgIGlmICh0aCAmJiAoIWRhbmdsZSB8fCAocmV0dmFsICYmICF0aC0+dF90cmFuc19pZCkpKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIGlmICh0aC0+dF90cmFuc19pZCkKLSAgICAgICAgICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOwotICAgICAgICBlcnIgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7Ci0gICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICByZXR2YWwgPSBlcnI7Ci0gICAgfQotCi0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Ci0gICAgcmV0dXJuIHJldHZhbDsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpOworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyBpbnQKIHJlaXNlcmZzX3JlYWRwYWdlcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKKwkJICAgc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIHVuc2lnbmVkIG5yX3BhZ2VzKQogewotICAgIHJldHVybiBtcGFnZV9yZWFkcGFnZXMobWFwcGluZywgcGFnZXMsIG5yX3BhZ2VzLCByZWlzZXJmc19nZXRfYmxvY2spOworCXJldHVybiBtcGFnZV9yZWFkcGFnZXMobWFwcGluZywgcGFnZXMsIG5yX3BhZ2VzLCByZWlzZXJmc19nZXRfYmxvY2spOwogfQogCiAvKiBDb21wdXRlIHJlYWwgbnVtYmVyIG9mIHVzZWQgYnl0ZXMgYnkgZmlsZQpAQCAtOTk2LDUxICsxMDU4LDU2IEBACiAgKi8KIHN0YXRpYyBpbnQgcmVhbF9zcGFjZV9kaWZmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBzZF9zaXplKQogewotICAgIGludCBieXRlczsKLSAgICBsb2ZmX3QgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKKwlpbnQgYnl0ZXM7CisJbG9mZl90IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAotICAgIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgIHJldHVybiBzZF9zaXplIDsKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gc2Rfc2l6ZTsKIAotICAgIC8qIEVuZCBvZiBmaWxlIGlzIGFsc28gaW4gZnVsbCBibG9jayB3aXRoIGluZGlyZWN0IHJlZmVyZW5jZSwgc28gcm91bmQKLSAgICAqKiB1cCB0byB0aGUgbmV4dCBibG9jay4KLSAgICAqKgotICAgICoqIHRoZXJlIGlzIGp1c3Qgbm8gd2F5IHRvIGtub3cgaWYgdGhlIHRhaWwgaXMgYWN0dWFsbHkgcGFja2VkCi0gICAgKiogb24gdGhlIGZpbGUsIHNvIHdlIGhhdmUgdG8gYXNzdW1lIGl0IGlzbid0LiAgV2hlbiB3ZSBwYWNrIHRoZQotICAgICoqIHRhaWwsIHdlIGFkZCA0IGJ5dGVzIHRvIHByZXRlbmQgdGhlcmUgcmVhbGx5IGlzIGFuIHVuZm9ybWF0dGVkCi0gICAgKiogbm9kZSBwb2ludGVyCi0gICAgKi8KLSAgICBieXRlcyA9ICgoaW5vZGUtPmlfc2l6ZSArIChibG9ja3NpemUtMSkpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSAqIFVORk1fUF9TSVpFICsgc2Rfc2l6ZTsKLSAgICByZXR1cm4gYnl0ZXMgOworCS8qIEVuZCBvZiBmaWxlIGlzIGFsc28gaW4gZnVsbCBibG9jayB3aXRoIGluZGlyZWN0IHJlZmVyZW5jZSwgc28gcm91bmQKKwkgKiogdXAgdG8gdGhlIG5leHQgYmxvY2suCisJICoqCisJICoqIHRoZXJlIGlzIGp1c3Qgbm8gd2F5IHRvIGtub3cgaWYgdGhlIHRhaWwgaXMgYWN0dWFsbHkgcGFja2VkCisJICoqIG9uIHRoZSBmaWxlLCBzbyB3ZSBoYXZlIHRvIGFzc3VtZSBpdCBpc24ndC4gIFdoZW4gd2UgcGFjayB0aGUKKwkgKiogdGFpbCwgd2UgYWRkIDQgYnl0ZXMgdG8gcHJldGVuZCB0aGVyZSByZWFsbHkgaXMgYW4gdW5mb3JtYXR0ZWQKKwkgKiogbm9kZSBwb2ludGVyCisJICovCisJYnl0ZXMgPQorCSAgICAoKGlub2RlLT5pX3NpemUgKworCSAgICAgIChibG9ja3NpemUgLSAxKSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICogVU5GTV9QX1NJWkUgKworCSAgICBzZF9zaXplOworCXJldHVybiBieXRlczsKIH0KIAogc3RhdGljIGlubGluZSBsb2ZmX3QgdG9fcmVhbF91c2VkX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVsb25nIGJsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Rfc2l6ZSkKKwkJCQkJaW50IHNkX3NpemUpCiB7Ci0gICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotICAgICAgICByZXR1cm4gaW5vZGUtPmlfc2l6ZSArIChsb2ZmX3QpKHJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkpIDsKLSAgICB9Ci0gICAgcmV0dXJuICgobG9mZl90KXJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkpICsgKCgobG9mZl90KWJsb2NrcykgPDwgOSk7CisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlyZXR1cm4gaW5vZGUtPmlfc2l6ZSArCisJCSAgICAobG9mZl90KSAocmVhbF9zcGFjZV9kaWZmKGlub2RlLCBzZF9zaXplKSk7CisJfQorCXJldHVybiAoKGxvZmZfdCkgcmVhbF9zcGFjZV9kaWZmKGlub2RlLCBzZF9zaXplKSkgKworCSAgICAoKChsb2ZmX3QpIGJsb2NrcykgPDwgOSk7CiB9CiAKIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGJ5IGZpbGUgaW4gUmVpc2VyRlMgY291bnRpbmcgKi8KIHN0YXRpYyBpbmxpbmUgdWxvbmcgdG9fZmFrZV91c2VkX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgc2Rfc2l6ZSkKIHsKLSAgICBsb2ZmX3QgYnl0ZXMgPSBpbm9kZV9nZXRfYnl0ZXMoaW5vZGUpIDsKLSAgICBsb2ZmX3QgcmVhbF9zcGFjZSA9IHJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkgOworCWxvZmZfdCBieXRlcyA9IGlub2RlX2dldF9ieXRlcyhpbm9kZSk7CisJbG9mZl90IHJlYWxfc3BhY2UgPSByZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpOwogCi0gICAgLyoga2VlcHMgZnNjayBhbmQgbm9uLXF1b3RhIHZlcnNpb25zIG9mIHJlaXNlcmZzIGhhcHB5ICovCi0gICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotICAgICAgICBieXRlcyArPSAobG9mZl90KTUxMSA7Ci0gICAgfQorCS8qIGtlZXBzIGZzY2sgYW5kIG5vbi1xdW90YSB2ZXJzaW9ucyBvZiByZWlzZXJmcyBoYXBweSAqLworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJYnl0ZXMgKz0gKGxvZmZfdCkgNTExOworCX0KIAotICAgIC8qIGZpbGVzIGZyb20gYmVmb3JlIHRoZSBxdW90YSBwYXRjaCBtaWdodCBpX2Jsb2NrcyBzdWNoIHRoYXQKLSAgICAqKiBieXRlcyA8IHJlYWxfc3BhY2UuICBEZWFsIHdpdGggdGhhdCBoZXJlIHRvIHByZXZlbnQgaXQgZnJvbQotICAgICoqIGdvaW5nIG5lZ2F0aXZlLgotICAgICovCi0gICAgaWYgKGJ5dGVzIDwgcmVhbF9zcGFjZSkKLSAgICAgICAgcmV0dXJuIDAgOwotICAgIHJldHVybiAoYnl0ZXMgLSByZWFsX3NwYWNlKSA+PiA5OworCS8qIGZpbGVzIGZyb20gYmVmb3JlIHRoZSBxdW90YSBwYXRjaCBtaWdodCBpX2Jsb2NrcyBzdWNoIHRoYXQKKwkgKiogYnl0ZXMgPCByZWFsX3NwYWNlLiAgRGVhbCB3aXRoIHRoYXQgaGVyZSB0byBwcmV2ZW50IGl0IGZyb20KKwkgKiogZ29pbmcgbmVnYXRpdmUuCisJICovCisJaWYgKGJ5dGVzIDwgcmVhbF9zcGFjZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChieXRlcyAtIHJlYWxfc3BhY2UpID4+IDk7CiB9CiAKIC8vCkBAIC0xMDUxLDI2MyArMTExOCwyNjkgQEAKIC8vCiAKIC8vIGNhbGxlZCBieSByZWFkX2xvY2tlZF9pbm9kZQotc3RhdGljIHZvaWQgaW5pdF9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBwYXRoICogcGF0aCkKK3N0YXRpYyB2b2lkIGluaXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIF9fdTMyIHJkZXY7Ci0gICAgLy9pbnQgdmVyc2lvbiA9IElURU1fVkVSU0lPTl8xOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJX191MzIgcmRldjsKKwkvL2ludCB2ZXJzaW9uID0gSVRFTV9WRVJTSU9OXzE7CiAKLSAgICBiaCA9IFBBVEhfUExBU1RfQlVGRkVSIChwYXRoKTsKLSAgICBpaCA9IFBBVEhfUElURU1fSEVBRCAocGF0aCk7CisJYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwYXRoKTsKKwlpaCA9IFBBVEhfUElURU1fSEVBRChwYXRoKTsKIAorCWNvcHlfa2V5KElOT0RFX1BLRVkoaW5vZGUpLCAmKGloLT5paF9rZXkpKTsKKwlpbm9kZS0+aV9ibGtzaXplID0gcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplOwogCi0gICAgY29weV9rZXkgKElOT0RFX1BLRVkgKGlub2RlKSwgJihpaC0+aWhfa2V5KSk7Ci0gICAgaW5vZGUtPmlfYmxrc2l6ZSA9IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsKKwlJTklUX0xJU1RfSEVBRCgmKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QpKTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyA9IDA7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV90cmFuc19pZCA9IDA7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBOVUxMOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKKwlpbml0X3J3c2VtKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKIAotICAgIElOSVRfTElTVF9IRUFEKCYoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCApKTsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyA9IDA7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV90cmFuc19pZCA9IDA7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBOVUxMOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKLSAgICBpbml0X3J3c2VtICgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7CisJaWYgKHN0YXRfZGF0YV92MShpaCkpIHsKKwkJc3RydWN0IHN0YXRfZGF0YV92MSAqc2QgPQorCQkgICAgKHN0cnVjdCBzdGF0X2RhdGFfdjEgKilCX0lfUElURU0oYmgsIGloKTsKKwkJdW5zaWduZWQgbG9uZyBibG9ja3M7CiAKLSAgICBpZiAoc3RhdF9kYXRhX3YxIChpaCkpIHsKLQlzdHJ1Y3Qgc3RhdF9kYXRhX3YxICogc2QgPSAoc3RydWN0IHN0YXRfZGF0YV92MSAqKUJfSV9QSVRFTSAoYmgsIGloKTsKLQl1bnNpZ25lZCBsb25nIGJsb2NrczsKKwkJc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKKwkJc2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUsIFNUQVRfREFUQV9WMSk7CisJCWlub2RlLT5pX21vZGUgPSBzZF92MV9tb2RlKHNkKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSBzZF92MV9ubGluayhzZCk7CisJCWlub2RlLT5pX3VpZCA9IHNkX3YxX3VpZChzZCk7CisJCWlub2RlLT5pX2dpZCA9IHNkX3YxX2dpZChzZCk7CisJCWlub2RlLT5pX3NpemUgPSBzZF92MV9zaXplKHNkKTsKKwkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc2RfdjFfYXRpbWUoc2QpOworCQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBzZF92MV9tdGltZShzZCk7CisJCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IHNkX3YxX2N0aW1lKHNkKTsKKwkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKIAotCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzUpOwotICAgICAgICBzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMSk7Ci0JaW5vZGUtPmlfbW9kZSAgPSBzZF92MV9tb2RlKHNkKTsKLQlpbm9kZS0+aV9ubGluayA9IHNkX3YxX25saW5rKHNkKTsKLQlpbm9kZS0+aV91aWQgICA9IHNkX3YxX3VpZChzZCk7Ci0JaW5vZGUtPmlfZ2lkICAgPSBzZF92MV9naWQoc2QpOwotCWlub2RlLT5pX3NpemUgID0gc2RfdjFfc2l6ZShzZCk7Ci0JaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc2RfdjFfYXRpbWUoc2QpOwotCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHNkX3YxX210aW1lKHNkKTsKLQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBzZF92MV9jdGltZShzZCk7Ci0JaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJCWlub2RlLT5pX2Jsb2NrcyA9IHNkX3YxX2Jsb2NrcyhzZCk7CisJCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpOworCQlibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKKwkJYmxvY2tzID0gX1JPVU5EX1VQKGJsb2NrcywgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDkpOworCQlpZiAoaW5vZGUtPmlfYmxvY2tzID4gYmxvY2tzKSB7CisJCQkvLyB0aGVyZSB3YXMgYSBidWcgaW4gPD0zLjUuMjMgd2hlbiBpX2Jsb2NrcyBjb3VsZCB0YWtlIG5lZ2F0aXZlCisJCQkvLyB2YWx1ZXMuIFN0YXJ0aW5nIGZyb20gMy41LjE3IHRoaXMgdmFsdWUgY291bGQgZXZlbiBiZSBzdG9yZWQgaW4KKwkJCS8vIHN0YXQgZGF0YS4gRm9yIHN1Y2ggZmlsZXMgd2Ugc2V0IGlfYmxvY2tzIGJhc2VkIG9uIGZpbGUKKwkJCS8vIHNpemUuIEp1c3QgMiBub3RlczogdGhpcyBjYW4gYmUgd3JvbmcgZm9yIHNwYXJjZSBmaWxlcy4gT24tZGlzayB2YWx1ZSB3aWxsIGJlCisJCQkvLyBvbmx5IHVwZGF0ZWQgaWYgZmlsZSdzIGlub2RlIHdpbGwgZXZlciBjaGFuZ2UKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IGJsb2NrczsKKwkJfQogCi0JaW5vZGUtPmlfYmxvY2tzID0gc2RfdjFfYmxvY2tzKHNkKTsKLQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUgKElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQpOwotCWJsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OwotCWJsb2NrcyA9IF9ST1VORF9VUCAoYmxvY2tzLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPj4gOSk7Ci0JaWYgKGlub2RlLT5pX2Jsb2NrcyA+IGJsb2NrcykgewotCSAgICAvLyB0aGVyZSB3YXMgYSBidWcgaW4gPD0zLjUuMjMgd2hlbiBpX2Jsb2NrcyBjb3VsZCB0YWtlIG5lZ2F0aXZlCi0JICAgIC8vIHZhbHVlcy4gU3RhcnRpbmcgZnJvbSAzLjUuMTcgdGhpcyB2YWx1ZSBjb3VsZCBldmVuIGJlIHN0b3JlZCBpbgotCSAgICAvLyBzdGF0IGRhdGEuIEZvciBzdWNoIGZpbGVzIHdlIHNldCBpX2Jsb2NrcyBiYXNlZCBvbiBmaWxlCi0JICAgIC8vIHNpemUuIEp1c3QgMiBub3RlczogdGhpcyBjYW4gYmUgd3JvbmcgZm9yIHNwYXJjZSBmaWxlcy4gT24tZGlzayB2YWx1ZSB3aWxsIGJlCi0JICAgIC8vIG9ubHkgdXBkYXRlZCBpZiBmaWxlJ3MgaW5vZGUgd2lsbCBldmVyIGNoYW5nZQotCSAgICBpbm9kZS0+aV9ibG9ja3MgPSBibG9ja3M7CisJCXJkZXYgPSBzZF92MV9yZGV2KHNkKTsKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPQorCQkgICAgc2RfdjFfZmlyc3RfZGlyZWN0X2J5dGUoc2QpOworCQkvKiBhbiBlYXJseSBidWcgaW4gdGhlIHF1b3RhIGNvZGUgY2FuIGdpdmUgdXMgYW4gb2RkIG51bWJlciBmb3IgdGhlCisJCSAqKiBibG9jayBjb3VudC4gIFRoaXMgaXMgaW5jb3JyZWN0LCBmaXggaXQgaGVyZS4KKwkJICovCisJCWlmIChpbm9kZS0+aV9ibG9ja3MgJiAxKSB7CisJCQlpbm9kZS0+aV9ibG9ja3MrKzsKKwkJfQorCQlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsCisJCQkJdG9fcmVhbF91c2VkX3NwYWNlKGlub2RlLCBpbm9kZS0+aV9ibG9ja3MsCisJCQkJCQkgICBTRF9WMV9TSVpFKSk7CisJCS8qIG5vcGFjayBpcyBpbml0aWFsbHkgemVybyBmb3IgdjEgb2JqZWN0cy4gRm9yIHYyIG9iamVjdHMsCisJCSAgIG5vcGFjayBpcyBpbml0aWFsaXNlZCBmcm9tIHNkX2F0dHJzICovCisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX25vcGFja19tYXNrOworCX0gZWxzZSB7CisJCS8vIG5ldyBzdGF0IGRhdGEgZm91bmQsIGJ1dCBvYmplY3QgbWF5IGhhdmUgb2xkIGl0ZW1zCisJCS8vIChkaXJlY3RvcmllcyBhbmQgc3ltbGlua3MpCisJCXN0cnVjdCBzdGF0X2RhdGEgKnNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilCX0lfUElURU0oYmgsIGloKTsKKworCQlpbm9kZS0+aV9tb2RlID0gc2RfdjJfbW9kZShzZCk7CisJCWlub2RlLT5pX25saW5rID0gc2RfdjJfbmxpbmsoc2QpOworCQlpbm9kZS0+aV91aWQgPSBzZF92Ml91aWQoc2QpOworCQlpbm9kZS0+aV9zaXplID0gc2RfdjJfc2l6ZShzZCk7CisJCWlub2RlLT5pX2dpZCA9IHNkX3YyX2dpZChzZCk7CisJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHNkX3YyX210aW1lKHNkKTsKKwkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc2RfdjJfYXRpbWUoc2QpOworCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBzZF92Ml9jdGltZShzZCk7CisJCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJCWlub2RlLT5pX2Jsb2NrcyA9IHNkX3YyX2Jsb2NrcyhzZCk7CisJCXJkZXYgPSBzZF92Ml9yZGV2KHNkKTsKKwkJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwkJCWlub2RlLT5pX2dlbmVyYXRpb24gPQorCQkJICAgIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZCk7CisJCWVsc2UKKwkJCWlub2RlLT5pX2dlbmVyYXRpb24gPSBzZF92Ml9nZW5lcmF0aW9uKHNkKTsKKworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQkJc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKKwkJZWxzZQorCQkJc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUsIEtFWV9GT1JNQVRfM182KTsKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSAwOworCQlzZXRfaW5vZGVfc2RfdmVyc2lvbihpbm9kZSwgU1RBVF9EQVRBX1YyKTsKKwkJaW5vZGVfc2V0X2J5dGVzKGlub2RlLAorCQkJCXRvX3JlYWxfdXNlZF9zcGFjZShpbm9kZSwgaW5vZGUtPmlfYmxvY2tzLAorCQkJCQkJICAgU0RfVjJfU0laRSkpOworCQkvKiByZWFkIHBlcnNpc3RlbnQgaW5vZGUgYXR0cmlidXRlcyBmcm9tIHNkIGFuZCBpbml0YWxpc2UKKwkJICAgZ2VuZXJpYyBpbm9kZSBmbGFncyBmcm9tIHRoZW0gKi8KKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnMgPSBzZF92Ml9hdHRycyhzZCk7CisJCXNkX2F0dHJzX3RvX2lfYXR0cnMoc2RfdjJfYXR0cnMoc2QpLCBpbm9kZSk7CiAJfQogCi0gICAgICAgIHJkZXYgPSBzZF92MV9yZGV2KHNkKTsKLQlSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IHNkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkKTsKLQkvKiBhbiBlYXJseSBidWcgaW4gdGhlIHF1b3RhIGNvZGUgY2FuIGdpdmUgdXMgYW4gb2RkIG51bWJlciBmb3IgdGhlCi0JKiogYmxvY2sgY291bnQuICBUaGlzIGlzIGluY29ycmVjdCwgZml4IGl0IGhlcmUuCi0JKi8KLQlpZiAoaW5vZGUtPmlfYmxvY2tzICYgMSkgewotCSAgICBpbm9kZS0+aV9ibG9ja3MrKyA7CisJcGF0aHJlbHNlKHBhdGgpOworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnJlaXNlcmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uczsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgbmV3X2RlY29kZV9kZXYocmRldikpOwogCX0KLQlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsIHRvX3JlYWxfdXNlZF9zcGFjZShpbm9kZSwgaW5vZGUtPmlfYmxvY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEX1YxX1NJWkUpKTsKLQkvKiBub3BhY2sgaXMgaW5pdGlhbGx5IHplcm8gZm9yIHYxIG9iamVjdHMuIEZvciB2MiBvYmplY3RzLAotCSAgIG5vcGFjayBpcyBpbml0aWFsaXNlZCBmcm9tIHNkX2F0dHJzICovCi0JUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfbm9wYWNrX21hc2s7Ci0gICAgfSBlbHNlIHsKLQkvLyBuZXcgc3RhdCBkYXRhIGZvdW5kLCBidXQgb2JqZWN0IG1heSBoYXZlIG9sZCBpdGVtcwotCS8vIChkaXJlY3RvcmllcyBhbmQgc3ltbGlua3MpCi0Jc3RydWN0IHN0YXRfZGF0YSAqIHNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilCX0lfUElURU0gKGJoLCBpaCk7Ci0KLQlpbm9kZS0+aV9tb2RlICAgPSBzZF92Ml9tb2RlKHNkKTsKLQlpbm9kZS0+aV9ubGluayAgPSBzZF92Ml9ubGluayhzZCk7Ci0JaW5vZGUtPmlfdWlkICAgID0gc2RfdjJfdWlkKHNkKTsKLQlpbm9kZS0+aV9zaXplICAgPSBzZF92Ml9zaXplKHNkKTsKLQlpbm9kZS0+aV9naWQgICAgPSBzZF92Ml9naWQoc2QpOwotCWlub2RlLT5pX210aW1lLnR2X3NlYyAgPSBzZF92Ml9tdGltZShzZCk7Ci0JaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc2RfdjJfYXRpbWUoc2QpOwotCWlub2RlLT5pX2N0aW1lLnR2X3NlYyAgPSBzZF92Ml9jdGltZShzZCk7Ci0JaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfYmxvY2tzID0gc2RfdjJfYmxvY2tzKHNkKTsKLSAgICAgICAgcmRldiAgICAgICAgICAgID0gc2RfdjJfcmRldihzZCk7Ci0JaWYoIFNfSVNDSFIoIGlub2RlIC0+IGlfbW9kZSApIHx8IFNfSVNCTEsoIGlub2RlIC0+IGlfbW9kZSApICkKLQkgICAgaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkKTsKLQllbHNlCi0gICAgICAgICAgICBpbm9kZS0+aV9nZW5lcmF0aW9uID0gc2RfdjJfZ2VuZXJhdGlvbihzZCk7Ci0KLQlpZiAoU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyAoaW5vZGUtPmlfbW9kZSkpCi0JICAgIHNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzUpOwotCWVsc2UKLQkgICAgc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlLCBLRVlfRk9STUFUXzNfNik7Ci0JUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSAwOwotCXNldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSwgU1RBVF9EQVRBX1YyKTsKLQlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsIHRvX3JlYWxfdXNlZF9zcGFjZShpbm9kZSwgaW5vZGUtPmlfYmxvY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEX1YyX1NJWkUpKTsKLQkvKiByZWFkIHBlcnNpc3RlbnQgaW5vZGUgYXR0cmlidXRlcyBmcm9tIHNkIGFuZCBpbml0YWxpc2UKLQkgICBnZW5lcmljIGlub2RlIGZsYWdzIGZyb20gdGhlbSAqLwotCVJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzID0gc2RfdjJfYXR0cnMoIHNkICk7Ci0Jc2RfYXR0cnNfdG9faV9hdHRycyggc2RfdjJfYXR0cnMoIHNkICksIGlub2RlICk7Ci0gICAgfQotCi0gICAgcGF0aHJlbHNlIChwYXRoKTsKLSAgICBpZiAoU19JU1JFRyAoaW5vZGUtPmlfbW9kZSkpIHsKLQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7Ci0JaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9uczsKLQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgOwotICAgIH0gZWxzZSBpZiAoU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpIHsKLQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKLQlpbm9kZS0+aV9mb3AgPSAmcmVpc2VyZnNfZGlyX29wZXJhdGlvbnM7Ci0gICAgfSBlbHNlIGlmIChTX0lTTE5LIChpbm9kZS0+aV9tb2RlKSkgewotCWlub2RlLT5pX29wID0gJnJlaXNlcmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnM7Ci0gICAgfSBlbHNlIHsKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwotCWlub2RlLT5pX29wID0gJnJlaXNlcmZzX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKLQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIG5ld19kZWNvZGVfZGV2KHJkZXYpKTsKLSAgICB9CiB9CiAKLQogLy8gdXBkYXRlIG5ldyBzdGF0IGRhdGEgd2l0aCBpbm9kZSBmaWVsZHMKLXN0YXRpYyB2b2lkIGlub2RlMnNkICh2b2lkICogc2QsIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb2ZmX3Qgc2l6ZSkKK3N0YXRpYyB2b2lkIGlub2RlMnNkKHZvaWQgKnNkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3Qgc3RhdF9kYXRhICogc2RfdjIgPSAoc3RydWN0IHN0YXRfZGF0YSAqKXNkOwotICAgIF9fdTE2IGZsYWdzOworCXN0cnVjdCBzdGF0X2RhdGEgKnNkX3YyID0gKHN0cnVjdCBzdGF0X2RhdGEgKilzZDsKKwlfX3UxNiBmbGFnczsKIAotICAgIHNldF9zZF92Ml9tb2RlKHNkX3YyLCBpbm9kZS0+aV9tb2RlICk7Ci0gICAgc2V0X3NkX3YyX25saW5rKHNkX3YyLCBpbm9kZS0+aV9ubGluayApOwotICAgIHNldF9zZF92Ml91aWQoc2RfdjIsIGlub2RlLT5pX3VpZCApOwotICAgIHNldF9zZF92Ml9zaXplKHNkX3YyLCBzaXplICk7Ci0gICAgc2V0X3NkX3YyX2dpZChzZF92MiwgaW5vZGUtPmlfZ2lkICk7Ci0gICAgc2V0X3NkX3YyX210aW1lKHNkX3YyLCBpbm9kZS0+aV9tdGltZS50dl9zZWMgKTsKLSAgICBzZXRfc2RfdjJfYXRpbWUoc2RfdjIsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyApOwotICAgIHNldF9zZF92Ml9jdGltZShzZF92MiwgaW5vZGUtPmlfY3RpbWUudHZfc2VjICk7Ci0gICAgc2V0X3NkX3YyX2Jsb2NrcyhzZF92MiwgdG9fZmFrZV91c2VkX2Jsb2Nrcyhpbm9kZSwgU0RfVjJfU0laRSkpOwotICAgIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCi0Jc2V0X3NkX3YyX3JkZXYoc2RfdjIsIG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKLSAgICBlbHNlCi0Jc2V0X3NkX3YyX2dlbmVyYXRpb24oc2RfdjIsIGlub2RlLT5pX2dlbmVyYXRpb24pOwotICAgIGZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnM7Ci0gICAgaV9hdHRyc190b19zZF9hdHRycyggaW5vZGUsICZmbGFncyApOwotICAgIHNldF9zZF92Ml9hdHRycyggc2RfdjIsIGZsYWdzICk7CisJc2V0X3NkX3YyX21vZGUoc2RfdjIsIGlub2RlLT5pX21vZGUpOworCXNldF9zZF92Ml9ubGluayhzZF92MiwgaW5vZGUtPmlfbmxpbmspOworCXNldF9zZF92Ml91aWQoc2RfdjIsIGlub2RlLT5pX3VpZCk7CisJc2V0X3NkX3YyX3NpemUoc2RfdjIsIHNpemUpOworCXNldF9zZF92Ml9naWQoc2RfdjIsIGlub2RlLT5pX2dpZCk7CisJc2V0X3NkX3YyX210aW1lKHNkX3YyLCBpbm9kZS0+aV9tdGltZS50dl9zZWMpOworCXNldF9zZF92Ml9hdGltZShzZF92MiwgaW5vZGUtPmlfYXRpbWUudHZfc2VjKTsKKwlzZXRfc2RfdjJfY3RpbWUoc2RfdjIsIGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7CisJc2V0X3NkX3YyX2Jsb2NrcyhzZF92MiwgdG9fZmFrZV91c2VkX2Jsb2Nrcyhpbm9kZSwgU0RfVjJfU0laRSkpOworCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJCXNldF9zZF92Ml9yZGV2KHNkX3YyLCBuZXdfZW5jb2RlX2Rldihpbm9kZS0+aV9yZGV2KSk7CisJZWxzZQorCQlzZXRfc2RfdjJfZ2VuZXJhdGlvbihzZF92MiwgaW5vZGUtPmlfZ2VuZXJhdGlvbik7CisJZmxhZ3MgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRyczsKKwlpX2F0dHJzX3RvX3NkX2F0dHJzKGlub2RlLCAmZmxhZ3MpOworCXNldF9zZF92Ml9hdHRycyhzZF92MiwgZmxhZ3MpOwogfQogCi0KIC8vIHVzZWQgdG8gY29weSBpbm9kZSdzIGZpZWxkcyB0byBvbGQgc3RhdCBkYXRhCi1zdGF0aWMgdm9pZCBpbm9kZTJzZF92MSAodm9pZCAqIHNkLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IHNpemUpCitzdGF0aWMgdm9pZCBpbm9kZTJzZF92MSh2b2lkICpzZCwgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCiB7Ci0gICAgc3RydWN0IHN0YXRfZGF0YV92MSAqIHNkX3YxID0gKHN0cnVjdCBzdGF0X2RhdGFfdjEgKilzZDsKKwlzdHJ1Y3Qgc3RhdF9kYXRhX3YxICpzZF92MSA9IChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopc2Q7CiAKLSAgICBzZXRfc2RfdjFfbW9kZShzZF92MSwgaW5vZGUtPmlfbW9kZSApOwotICAgIHNldF9zZF92MV91aWQoc2RfdjEsIGlub2RlLT5pX3VpZCApOwotICAgIHNldF9zZF92MV9naWQoc2RfdjEsIGlub2RlLT5pX2dpZCApOwotICAgIHNldF9zZF92MV9ubGluayhzZF92MSwgaW5vZGUtPmlfbmxpbmsgKTsKLSAgICBzZXRfc2RfdjFfc2l6ZShzZF92MSwgc2l6ZSApOwotICAgIHNldF9zZF92MV9hdGltZShzZF92MSwgaW5vZGUtPmlfYXRpbWUudHZfc2VjICk7Ci0gICAgc2V0X3NkX3YxX2N0aW1lKHNkX3YxLCBpbm9kZS0+aV9jdGltZS50dl9zZWMgKTsKLSAgICBzZXRfc2RfdjFfbXRpbWUoc2RfdjEsIGlub2RlLT5pX210aW1lLnR2X3NlYyApOworCXNldF9zZF92MV9tb2RlKHNkX3YxLCBpbm9kZS0+aV9tb2RlKTsKKwlzZXRfc2RfdjFfdWlkKHNkX3YxLCBpbm9kZS0+aV91aWQpOworCXNldF9zZF92MV9naWQoc2RfdjEsIGlub2RlLT5pX2dpZCk7CisJc2V0X3NkX3YxX25saW5rKHNkX3YxLCBpbm9kZS0+aV9ubGluayk7CisJc2V0X3NkX3YxX3NpemUoc2RfdjEsIHNpemUpOworCXNldF9zZF92MV9hdGltZShzZF92MSwgaW5vZGUtPmlfYXRpbWUudHZfc2VjKTsKKwlzZXRfc2RfdjFfY3RpbWUoc2RfdjEsIGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7CisJc2V0X3NkX3YxX210aW1lKHNkX3YxLCBpbm9kZS0+aV9tdGltZS50dl9zZWMpOwogCi0gICAgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKLSAgICAgICAgc2V0X3NkX3YxX3JkZXYoc2RfdjEsIG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKLSAgICBlbHNlCi0gICAgICAgIHNldF9zZF92MV9ibG9ja3Moc2RfdjEsIHRvX2Zha2VfdXNlZF9ibG9ja3MoaW5vZGUsIFNEX1YxX1NJWkUpKTsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlzZXRfc2RfdjFfcmRldihzZF92MSwgbmV3X2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldikpOworCWVsc2UKKwkJc2V0X3NkX3YxX2Jsb2NrcyhzZF92MSwgdG9fZmFrZV91c2VkX2Jsb2Nrcyhpbm9kZSwgU0RfVjFfU0laRSkpOwogCi0gICAgLy8gU2lnaC4gaV9maXJzdF9kaXJlY3RfYnl0ZSBpcyBiYWNrCi0gICAgc2V0X3NkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkX3YxLCBSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSk7CisJLy8gU2lnaC4gaV9maXJzdF9kaXJlY3RfYnl0ZSBpcyBiYWNrCisJc2V0X3NkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkX3YxLAorCQkJCSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSk7CiB9CiAKLQogLyogTk9URSwgeW91IG11c3QgcHJlcGFyZSB0aGUgYnVmZmVyIGhlYWQgYmVmb3JlIHNlbmRpbmcgaXQgaGVyZSwKICoqIGFuZCB0aGVuIGxvZyBpdCBhZnRlciB0aGUgY2FsbAogKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0X2RhdGEgKHN0cnVjdCBwYXRoICogcGF0aCwgc3RydWN0IGlub2RlICogaW5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3Qgc2l6ZSkKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0X2RhdGEoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIGxvZmZfdCBzaXplKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgCi0gICAgYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAocGF0aCk7Ci0gICAgaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgICBpZiAoIWlzX3N0YXRkYXRhX2xlX2loIChpaCkpCi0JcmVpc2VyZnNfcGFuaWMgKGlub2RlLT5pX3NiLCAidnMtMTMwNjU6IHVwZGF0ZV9zdGF0X2RhdGE6IGtleSAlaywgZm91bmQgaXRlbSAlaCIsCi0JCQlJTk9ERV9QS0VZIChpbm9kZSksIGloKTsKLSAgCi0gICAgaWYgKHN0YXRfZGF0YV92MSAoaWgpKSB7Ci0JLy8gcGF0aCBwb2ludHMgdG8gb2xkIHN0YXQgZGF0YQotCWlub2RlMnNkX3YxIChCX0lfUElURU0gKGJoLCBpaCksIGlub2RlLCBzaXplKTsKLSAgICB9IGVsc2UgewotCWlub2RlMnNkIChCX0lfUElURU0gKGJoLCBpaCksIGlub2RlLCBzaXplKTsKLSAgICB9CisJYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwYXRoKTsKKwlpaCA9IFBBVEhfUElURU1fSEVBRChwYXRoKTsKIAotICAgIHJldHVybjsKKwlpZiAoIWlzX3N0YXRkYXRhX2xlX2loKGloKSkKKwkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsCisJCQkgICAgICAgInZzLTEzMDY1OiB1cGRhdGVfc3RhdF9kYXRhOiBrZXkgJWssIGZvdW5kIGl0ZW0gJWgiLAorCQkJICAgICAgIElOT0RFX1BLRVkoaW5vZGUpLCBpaCk7CisKKwlpZiAoc3RhdF9kYXRhX3YxKGloKSkgeworCQkvLyBwYXRoIHBvaW50cyB0byBvbGQgc3RhdCBkYXRhCisJCWlub2RlMnNkX3YxKEJfSV9QSVRFTShiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJaW5vZGUyc2QoQl9JX1BJVEVNKGJoLCBpaCksIGlub2RlLCBzaXplKTsKKwl9CisKKwlyZXR1cm47CiB9CiAKLQotdm9pZCByZWlzZXJmc191cGRhdGVfc2Rfc2l6ZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IHNpemUpCit2b2lkIHJlaXNlcmZzX3VwZGF0ZV9zZF9zaXplKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7Ci0gICAgSU5JVElBTElaRV9QQVRIKHBhdGgpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICAgIGludCBmc19nZW4gOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloLCB0bXBfaWggOwotICAgIGludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkga2V5OworCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBmc19nZW47CisJc3RydWN0IGl0ZW1faGVhZCAqaWgsIHRtcF9paDsKKwlpbnQgcmV0dmFsOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgU0RfT0ZGU0VULCBUWVBFX1NUQVRfREFUQSwgMyk7Ly9rZXkgdHlwZSBpcyB1bmltcG9ydGFudAotICAgIAotICAgIGZvcig7OykgewotCWludCBwb3M7Ci0JLyogbG9vayBmb3IgdGhlIG9iamVjdCdzIHN0YXQgZGF0YSAqLwotCXJldHZhbCA9IHNlYXJjaF9pdGVtIChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy0xMzA1MDogcmVpc2VyZnNfdXBkYXRlX3NkOiAiCi0JCQkgICAgICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIHVwZGF0ZSAlSyBzdGF0IGRhdGEiLAotCQkJICAgICAgJmtleSk7Ci0JICAgIHJldHVybjsKKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIDMpOwkvL2tleSB0eXBlIGlzIHVuaW1wb3J0YW50CisKKwlmb3IgKDs7KSB7CisJCWludCBwb3M7CisJCS8qIGxvb2sgZm9yIHRoZSBvYmplY3QncyBzdGF0IGRhdGEgKi8KKwkJcmV0dmFsID0gc2VhcmNoX2l0ZW0oaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJ2cy0xMzA1MDogcmVpc2VyZnNfdXBkYXRlX3NkOiAiCisJCQkJCSAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIHVwZGF0ZSAlSyBzdGF0IGRhdGEiLAorCQkJCQkgJmtleSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHJldHZhbCA9PSBJVEVNX05PVF9GT1VORCkgeworCQkJcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OKCZwYXRoKTsKKwkJCXBhdGhyZWxzZSgmcGF0aCk7CisJCQlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgeworCQkJCS8qcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy0xMzA1MDogcmVpc2VyZnNfdXBkYXRlX3NkOiBpX25saW5rID09IDAsIHN0YXQgZGF0YSBub3QgZm91bmQiKTsgKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCQkgInZzLTEzMDYwOiByZWlzZXJmc191cGRhdGVfc2Q6ICIKKwkJCQkJICJzdGF0IGRhdGEgb2Ygb2JqZWN0ICVrIChubGluayA9PSAlZCkgbm90IGZvdW5kIChwb3MgJWQpIiwKKwkJCQkJIElOT0RFX1BLRVkoaW5vZGUpLCBpbm9kZS0+aV9ubGluaywKKwkJCQkJIHBvcyk7CisJCQlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIHNpZ2gsIHByZXBhcmVfZm9yX2pvdXJuYWwgbWlnaHQgc2NoZWR1bGUuICBXaGVuIGl0IHNjaGVkdWxlcyB0aGUKKwkJICoqIEZTIG1pZ2h0IGNoYW5nZS4gIFdlIGhhdmUgdG8gZGV0ZWN0IHRoYXQsIGFuZCBsb29wIGJhY2sgdG8gdGhlCisJCSAqKiBzZWFyY2ggaWYgdGhlIHN0YXQgZGF0YSBpdGVtIGhhcyBtb3ZlZAorCQkgKi8KKwkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCWloID0gZ2V0X2loKCZwYXRoKTsKKwkJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOworCQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7CisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKTsKKwkJaWYgKGZzX2NoYW5nZWQoZnNfZ2VuLCBpbm9kZS0+aV9zYikKKwkJICAgICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihpbm9kZS0+aV9zYiwgYmgpOworCQkJY29udGludWU7CS8qIFN0YXRfZGF0YSBpdGVtIGhhcyBiZWVuIG1vdmVkIGFmdGVyIHNjaGVkdWxpbmcuICovCisJCX0KKwkJYnJlYWs7CiAJfQotCWlmIChyZXR2YWwgPT0gSVRFTV9OT1RfRk9VTkQpIHsKLQkgICAgcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OICgmcGF0aCk7Ci0JICAgIHBhdGhyZWxzZSgmcGF0aCkgOwotCSAgICBpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgewotCQkvKnJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogaV9ubGluayA9PSAwLCBzdGF0IGRhdGEgbm90IGZvdW5kIik7Ki8KLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNjA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogIgotCQkJICAgICAgInN0YXQgZGF0YSBvZiBvYmplY3QgJWsgKG5saW5rID09ICVkKSBub3QgZm91bmQgKHBvcyAlZCkiLAotCQkJICAgICAgSU5PREVfUEtFWSAoaW5vZGUpLCBpbm9kZS0+aV9ubGluaywgcG9zKTsKLQkgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotCSAgICByZXR1cm47Ci0JfQotCQotCS8qIHNpZ2gsIHByZXBhcmVfZm9yX2pvdXJuYWwgbWlnaHQgc2NoZWR1bGUuICBXaGVuIGl0IHNjaGVkdWxlcyB0aGUKLQkqKiBGUyBtaWdodCBjaGFuZ2UuICBXZSBoYXZlIHRvIGRldGVjdCB0aGF0LCBhbmQgbG9vcCBiYWNrIHRvIHRoZQotCSoqIHNlYXJjaCBpZiB0aGUgc3RhdCBkYXRhIGl0ZW0gaGFzIG1vdmVkCi0JKi8KLQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKSA7Ci0JaWggPSBnZXRfaWgoJnBhdGgpIDsKLQljb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOwotCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uIChpbm9kZS0+aV9zYik7Ci0JcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChpbm9kZS0+aV9zYiwgYmgsIDEpIDsKLQlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKSA7Ci0JICAgIGNvbnRpbnVlIDsJLyogU3RhdF9kYXRhIGl0ZW0gaGFzIGJlZW4gbW92ZWQgYWZ0ZXIgc2NoZWR1bGluZy4gKi8KLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIHVwZGF0ZV9zdGF0X2RhdGEgKCZwYXRoLCBpbm9kZSwgc2l6ZSk7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5KHRoLCB0aC0+dF9zdXBlciwgYmgpIDsgCi0gICAgcGF0aHJlbHNlICgmcGF0aCk7Ci0gICAgcmV0dXJuOworCXVwZGF0ZV9zdGF0X2RhdGEoJnBhdGgsIGlub2RlLCBzaXplKTsKKwlqb3VybmFsX21hcmtfZGlydHkodGgsIHRoLT50X3N1cGVyLCBiaCk7CisJcGF0aHJlbHNlKCZwYXRoKTsKKwlyZXR1cm47CiB9CiAKIC8qIHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlIGlzIGNhbGxlZCB0byByZWFkIHRoZSBpbm9kZSBvZmYgZGlzaywgYW5kIGl0CkBAIC0xMzE2LDkgKzEzODksMTAgQEAKICoqIGNvcnJlc3BvbmRpbmcgaXB1dCBtaWdodCB0cnkgdG8gZGVsZXRlIHdoYXRldmVyIG9iamVjdCB0aGUgaW5vZGUgbGFzdAogKiogcmVwcmVzZW50ZWQuCiAqLwotc3RhdGljIHZvaWQgcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkgewotICAgIG1lbXNldChJTk9ERV9QS0VZKGlub2RlKSwgMCwgS0VZX1NJWkUpOwotICAgIG1ha2VfYmFkX2lub2RlKGlub2RlKTsKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX21ha2VfYmFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJbWVtc2V0KElOT0RFX1BLRVkoaW5vZGUpLCAwLCBLRVlfU0laRSk7CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogfQogCiAvLwpAQCAtMTMyNiw3NyArMTQwMCw3OSBAQAogLy8gZXZvbHZlZCBhcyB0aGUgcHJvdG90eXBlIGRpZAogLy8KIAotaW50IHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdm9pZCAqcCkKK2ludCByZWlzZXJmc19pbml0X2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpwKQogewotICAgIHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3MgPSAoc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqKXAgOwotICAgIGlub2RlLT5pX2lubyA9IGFyZ3MtPm9iamVjdGlkOwotICAgIElOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZCA9IGNwdV90b19sZTMyKGFyZ3MtPmRpcmlkKTsKLSAgICByZXR1cm4gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzID0gKHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKilwOworCWlub2RlLT5pX2lubyA9IGFyZ3MtPm9iamVjdGlkOworCUlOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZCA9IGNwdV90b19sZTMyKGFyZ3MtPmRpcmlkKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogbG9va3MgZm9yIHN0YXQgZGF0YSBpbiB0aGUgdHJlZSwgYW5kIGZpbGxzIHVwIHRoZSBmaWVsZHMgb2YgaW4tY29yZQogICAgaW5vZGUgc3RhdCBkYXRhIGZpZWxkcyAqLwotdm9pZCByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3MpCit2b2lkIHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJncykKIHsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fc2QpOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKLSAgICB1bnNpZ25lZCBsb25nIGRpcmlubzsKLSAgICBpbnQgcmV0dmFsOworCUlOSVRJQUxJWkVfUEFUSChwYXRoX3RvX3NkKTsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJdW5zaWduZWQgbG9uZyBkaXJpbm87CisJaW50IHJldHZhbDsKIAotICAgIGRpcmlubyA9IGFyZ3MtPmRpcmlkIDsKKwlkaXJpbm8gPSBhcmdzLT5kaXJpZDsKIAotICAgIC8qIHNldCB2ZXJzaW9uIDEsIHZlcnNpb24gMiBjb3VsZCBiZSB1c2VkIHRvbywgYmVjYXVzZSBzdGF0IGRhdGEKLSAgICAgICBrZXkgaXMgdGhlIHNhbWUgaW4gYm90aCB2ZXJzaW9ucyAqLwotICAgIGtleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7Ci0gICAga2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gZGlyaW5vOwotICAgIGtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOwotICAgIGtleS5vbl9kaXNrX2tleS5rX29mZnNldCA9IDA7Ci0gICAga2V5Lm9uX2Rpc2tfa2V5LmtfdHlwZSA9IDA7CisJLyogc2V0IHZlcnNpb24gMSwgdmVyc2lvbiAyIGNvdWxkIGJlIHVzZWQgdG9vLCBiZWNhdXNlIHN0YXQgZGF0YQorCSAgIGtleSBpcyB0aGUgc2FtZSBpbiBib3RoIHZlcnNpb25zICovCisJa2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKwlrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBkaXJpbm87CisJa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisJa2V5Lm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0ID0gMDsKKwlrZXkub25fZGlza19rZXkua190eXBlID0gMDsKIAotICAgIC8qIGxvb2sgZm9yIHRoZSBvYmplY3QncyBzdGF0IGRhdGEgKi8KLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoX3RvX3NkKTsKLSAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy0xMzA3MDogcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGU6ICIKLQkJCSAgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byBmaW5kIHN0YXQgZGF0YSBvZiAlSyIsCi0JCQkgICZrZXkpOwotCXJlaXNlcmZzX21ha2VfYmFkX2lub2RlKGlub2RlKSA7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAocmV0dmFsICE9IElURU1fRk9VTkQpIHsKLQkvKiBhIHN0YWxlIE5GUyBoYW5kbGUgY2FuIHRyaWdnZXIgdGhpcyB3aXRob3V0IGl0IGJlaW5nIGFuIGVycm9yICovCi0JcGF0aHJlbHNlICgmcGF0aF90b19zZCk7Ci0JcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoaW5vZGUpIDsKLQlpbm9kZS0+aV9ubGluayA9IDA7Ci0JcmV0dXJuOwotICAgIH0KKwkvKiBsb29rIGZvciB0aGUgb2JqZWN0J3Mgc3RhdCBkYXRhICovCisJcmV0dmFsID0gc2VhcmNoX2l0ZW0oaW5vZGUtPmlfc2IsICZrZXksICZwYXRoX3RvX3NkKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJ2cy0xMzA3MDogcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGU6ICIKKwkJCQkgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byBmaW5kIHN0YXQgZGF0YSBvZiAlSyIsCisJCQkJICZrZXkpOworCQlyZWlzZXJmc19tYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCXJldHVybjsKKwl9CisJaWYgKHJldHZhbCAhPSBJVEVNX0ZPVU5EKSB7CisJCS8qIGEgc3RhbGUgTkZTIGhhbmRsZSBjYW4gdHJpZ2dlciB0aGlzIHdpdGhvdXQgaXQgYmVpbmcgYW4gZXJyb3IgKi8KKwkJcGF0aHJlbHNlKCZwYXRoX3RvX3NkKTsKKwkJcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCXJldHVybjsKKwl9CiAKLSAgICBpbml0X2lub2RlIChpbm9kZSwgJnBhdGhfdG9fc2QpOwotICAgCi0gICAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBrbmZzZCBpcyB0cnlpbmcgdG8gYWNjZXNzIGlub2RlIG9mIGEgZmlsZQotICAgICAgIHRoYXQgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBkaXNrIGJ5IHNvbWUgb3RoZXIgdGhyZWFkLiBBcyB3ZQotICAgICAgIHVwZGF0ZSBzZCBvbiB1bmxpbmsgYWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdG8gY2hlY2sgZm9yIG5saW5rCi0gICAgICAgaGVyZS4gVGhpcyBidWcgd2FzIGZpcnN0IGZvdW5kIGJ5IFNpemlmIHdoZW4gZGVidWdnaW5nCi0gICAgICAgU3F1aWRORy9CdXR0ZXJmbHksIGZvcmdvdHRlbiwgYW5kIGZvdW5kIGFnYWluIGFmdGVyIFBoaWxpcHBlCi0gICAgICAgR3JhbW91bGxlIDxwaGlsaXBwZS5ncmFtb3VsbGVAbW1hbmlhLmNvbT4gcmVwcm9kdWNlZCBpdC4gCisJaW5pdF9pbm9kZShpbm9kZSwgJnBhdGhfdG9fc2QpOwogCi0gICAgICAgTW9yZSBsb2dpY2FsIGZpeCB3b3VsZCByZXF1aXJlIGNoYW5nZXMgaW4gZnMvaW5vZGUuYzppcHV0KCkgdG8KLSAgICAgICByZW1vdmUgaW5vZGUgZnJvbSBoYXNoLXRhYmxlIF9hZnRlcl8gZnMgY2xlYW5lZCBkaXNrIHN0dWZmIHVwIGFuZAotICAgICAgIGluIGlnZXQoKSB0byByZXR1cm4gTlVMTCBpZiBJX0ZSRUVJTkcgaW5vZGUgaXMgZm91bmQgaW4KLSAgICAgICBoYXNoLXRhYmxlLiAqLwotICAgIC8qIEN1cnJlbnRseSB0aGVyZSBpcyBvbmUgcGxhY2Ugd2hlcmUgaXQncyBvayB0byBtZWV0IGlub2RlIHdpdGgKLSAgICAgICBubGluaz09MDogcHJvY2Vzc2luZyBvZiBvcGVuLXVubGlua2VkIGFuZCBoYWxmLXRydW5jYXRlZCBmaWxlcwotICAgICAgIGR1cmluZyBtb3VudCAoZnMvcmVpc2VyZnMvc3VwZXIuYzpmaW5pc2hfdW5maW5pc2hlZCgpKS4gKi8KLSAgICBpZiggKCBpbm9kZSAtPiBpX25saW5rID09IDAgKSAmJiAKLQkhIFJFSVNFUkZTX1NCKGlub2RlIC0+IGlfc2IpIC0+IHNfaXNfdW5saW5rZWRfb2sgKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAotCQkJICAgICAgInZzLTEzMDc1OiByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZTogIgotCQkJICAgICAgImRlYWQgaW5vZGUgcmVhZCBmcm9tIGRpc2sgJUsuICIKLQkJCSAgICAgICJUaGlzIGlzIGxpa2VseSB0byBiZSByYWNlIHdpdGgga25mc2QuIElnbm9yZSIsCi0JCQkgICAgICAma2V5ICk7Ci0JICAgIHJlaXNlcmZzX21ha2VfYmFkX2lub2RlKCBpbm9kZSApOwotICAgIH0KKwkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGtuZnNkIGlzIHRyeWluZyB0byBhY2Nlc3MgaW5vZGUgb2YgYSBmaWxlCisJICAgdGhhdCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGRpc2sgYnkgc29tZSBvdGhlciB0aHJlYWQuIEFzIHdlCisJICAgdXBkYXRlIHNkIG9uIHVubGluayBhbGwgdGhhdCBpcyByZXF1aXJlZCBpcyB0byBjaGVjayBmb3IgbmxpbmsKKwkgICBoZXJlLiBUaGlzIGJ1ZyB3YXMgZmlyc3QgZm91bmQgYnkgU2l6aWYgd2hlbiBkZWJ1Z2dpbmcKKwkgICBTcXVpZE5HL0J1dHRlcmZseSwgZm9yZ290dGVuLCBhbmQgZm91bmQgYWdhaW4gYWZ0ZXIgUGhpbGlwcGUKKwkgICBHcmFtb3VsbGUgPHBoaWxpcHBlLmdyYW1vdWxsZUBtbWFuaWEuY29tPiByZXByb2R1Y2VkIGl0LiAKIAotICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fc2QpIDsgLyogaW5pdCBpbm9kZSBzaG91bGQgYmUgcmVsc2luZyAqLworCSAgIE1vcmUgbG9naWNhbCBmaXggd291bGQgcmVxdWlyZSBjaGFuZ2VzIGluIGZzL2lub2RlLmM6aXB1dCgpIHRvCisJICAgcmVtb3ZlIGlub2RlIGZyb20gaGFzaC10YWJsZSBfYWZ0ZXJfIGZzIGNsZWFuZWQgZGlzayBzdHVmZiB1cCBhbmQKKwkgICBpbiBpZ2V0KCkgdG8gcmV0dXJuIE5VTEwgaWYgSV9GUkVFSU5HIGlub2RlIGlzIGZvdW5kIGluCisJICAgaGFzaC10YWJsZS4gKi8KKwkvKiBDdXJyZW50bHkgdGhlcmUgaXMgb25lIHBsYWNlIHdoZXJlIGl0J3Mgb2sgdG8gbWVldCBpbm9kZSB3aXRoCisJICAgbmxpbms9PTA6IHByb2Nlc3Npbmcgb2Ygb3Blbi11bmxpbmtlZCBhbmQgaGFsZi10cnVuY2F0ZWQgZmlsZXMKKwkgICBkdXJpbmcgbW91bnQgKGZzL3JlaXNlcmZzL3N1cGVyLmM6ZmluaXNoX3VuZmluaXNoZWQoKSkuICovCisJaWYgKChpbm9kZS0+aV9ubGluayA9PSAwKSAmJgorCSAgICAhUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2lzX3VubGlua2VkX29rKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJ2cy0xMzA3NTogcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGU6ICIKKwkJCQkgImRlYWQgaW5vZGUgcmVhZCBmcm9tIGRpc2sgJUsuICIKKwkJCQkgIlRoaXMgaXMgbGlrZWx5IHRvIGJlIHJhY2Ugd2l0aCBrbmZzZC4gSWdub3JlIiwKKwkJCQkgJmtleSk7CisJCXJlaXNlcmZzX21ha2VfYmFkX2lub2RlKGlub2RlKTsKKwl9CisKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX3NkKTsJLyogaW5pdCBpbm9kZSBzaG91bGQgYmUgcmVsc2luZyAqLwogCiB9CiAKQEAgLTE0MTIsMTQxICsxNDg4LDE0OSBAQAogICogaW5vZGUgbnVtYmVycyAob2JqZWN0aWRzKSBhcmUgZGlzdGluZ3Vpc2hlZCBieSBwYXJlbnQgZGlyZWN0b3J5IGlkcy4KICAqCiAgKi8KLWludCByZWlzZXJmc19maW5kX2FjdG9yKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUgKQoraW50IHJlaXNlcmZzX2ZpbmRfYWN0b3Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3M7CisJc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJnczsKIAotICAgIGFyZ3MgPSBvcGFxdWU7Ci0gICAgLyogYXJncyBpcyBhbHJlYWR5IGluIENQVSBvcmRlciAqLwotICAgIHJldHVybiAoaW5vZGUtPmlfaW5vID09IGFyZ3MtPm9iamVjdGlkKSAmJgotCShsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpID09IGFyZ3MtPmRpcmlkKTsKKwlhcmdzID0gb3BhcXVlOworCS8qIGFyZ3MgaXMgYWxyZWFkeSBpbiBDUFUgb3JkZXIgKi8KKwlyZXR1cm4gKGlub2RlLT5pX2lubyA9PSBhcmdzLT5vYmplY3RpZCkgJiYKKwkgICAgKGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZCkgPT0gYXJncy0+ZGlyaWQpOwogfQogCi1zdHJ1Y3QgaW5vZGUgKiByZWlzZXJmc19pZ2V0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3N0cnVjdCBpbm9kZSAqcmVpc2VyZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXkpCiB7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyBhcmdzIDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgYXJnczsKIAotICAgIGFyZ3Mub2JqZWN0aWQgPSBrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgOwotICAgIGFyZ3MuZGlyaWQgPSBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkIDsKLSAgICBpbm9kZSA9IGlnZXQ1X2xvY2tlZCAocywga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkLCAKLQkJICAgcmVpc2VyZnNfZmluZF9hY3RvciwgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUsICh2b2lkICopKCZhcmdzKSk7Ci0gICAgaWYgKCFpbm9kZSkgCi0JcmV0dXJuIEVSUl9QVFIoLUVOT01FTSkgOworCWFyZ3Mub2JqZWN0aWQgPSBrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQ7CisJYXJncy5kaXJpZCA9IGtleS0+b25fZGlza19rZXkua19kaXJfaWQ7CisJaW5vZGUgPSBpZ2V0NV9sb2NrZWQocywga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkLAorCQkJICAgICByZWlzZXJmc19maW5kX2FjdG9yLCByZWlzZXJmc19pbml0X2xvY2tlZF9pbm9kZSwKKwkJCSAgICAgKHZvaWQgKikoJmFyZ3MpKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotICAgIGlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7Ci0JcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUoaW5vZGUsICZhcmdzKTsKLQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKLSAgICB9CisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUoaW5vZGUsICZhcmdzKTsKKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJfQogCi0gICAgaWYgKGNvbXBfc2hvcnRfa2V5cyAoSU5PREVfUEtFWSAoaW5vZGUpLCBrZXkpIHx8IGlzX2JhZF9pbm9kZSAoaW5vZGUpKSB7Ci0JLyogZWl0aGVyIGR1ZSB0byBpL28gZXJyb3Igb3IgYSBzdGFsZSBORlMgaGFuZGxlICovCi0JaXB1dCAoaW5vZGUpOwotCWlub2RlID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGlub2RlOworCWlmIChjb21wX3Nob3J0X2tleXMoSU5PREVfUEtFWShpbm9kZSksIGtleSkgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQkvKiBlaXRoZXIgZHVlIHRvIGkvbyBlcnJvciBvciBhIHN0YWxlIE5GUyBoYW5kbGUgKi8KKwkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gTlVMTDsKKwl9CisJcmV0dXJuIGlub2RlOwogfQogCiBzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKQogewotICAgIF9fdTMyICpkYXRhID0gdm9ianA7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5IDsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZTsKLSAgICAKLSAgICBrZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGRhdGFbMF0gOwotICAgIGtleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGRhdGFbMV0gOwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOwotICAgIGlub2RlID0gcmVpc2VyZnNfaWdldChzYiwgJmtleSkgOwotICAgIGlmIChpbm9kZSAmJiAhSVNfRVJSKGlub2RlKSAmJiBkYXRhWzJdICE9IDAgJiYKLQlkYXRhWzJdICE9IGlub2RlLT5pX2dlbmVyYXRpb24pIHsKLQkgICAgaXB1dChpbm9kZSkgOwotCSAgICBpbm9kZSA9IE5VTEwgOwotICAgIH0KLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soc2IpOwotICAgIGlmICghaW5vZGUpCi0JICAgIGlub2RlID0gRVJSX1BUUigtRVNUQUxFKTsKLSAgICBpZiAoSVNfRVJSKGlub2RlKSkKLQkgICAgcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihpbm9kZSkpOwotICAgIHJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7Ci0gICAgaWYgKCFyZXN1bHQpIHsKLQkgICAgaXB1dChpbm9kZSk7Ci0JICAgIHJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworCV9fdTMyICpkYXRhID0gdm9ianA7CisJc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBkYXRhWzBdOworCWtleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGRhdGFbMV07CisJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CisJaW5vZGUgPSByZWlzZXJmc19pZ2V0KHNiLCAma2V5KTsKKwlpZiAoaW5vZGUgJiYgIUlTX0VSUihpbm9kZSkgJiYgZGF0YVsyXSAhPSAwICYmCisJICAgIGRhdGFbMl0gIT0gaW5vZGUtPmlfZ2VuZXJhdGlvbikgeworCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCX0KKwlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOworCWlmICghaW5vZGUpCisJCWlub2RlID0gRVJSX1BUUigtRVNUQUxFKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihpbm9kZSkpOworCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlyZXR1cm4gcmVzdWx0OwogfQogCi1zdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGZodHlwZSwKLQkJCQkgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRlY3QsIHN0cnVjdCBkZW50cnkgKmRlKSwKLQkJCQkgIHZvaWQgKmNvbnRleHQpIHsKLSAgICBfX3UzMiBvYmpbM10sIHBhcmVudFszXTsKK3N0cnVjdCBkZW50cnkgKnJlaXNlcmZzX2RlY29kZV9maChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBfX3UzMiAqIGRhdGEsCisJCQkJICBpbnQgbGVuLCBpbnQgZmh0eXBlLAorCQkJCSAgaW50ICgqYWNjZXB0YWJsZSkgKHZvaWQgKmNvbnRlY3QsCisJCQkJCQkgICAgIHN0cnVjdCBkZW50cnkgKiBkZSksCisJCQkJICB2b2lkICpjb250ZXh0KQoreworCV9fdTMyIG9ialszXSwgcGFyZW50WzNdOwogCi0gICAgLyogZmh0eXBlIGhhcHBlbnMgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIHUzMnMgZW5jb2RlZC4KLSAgICAgKiBkdWUgdG8gYSBidWcgaW4gZWFybGllciBjb2RlLCBmaHR5cGUgbWlnaHQgaW5kaWNhdGUgdGhlcmUKLSAgICAgKiBhcmUgbW9yZSB1MzJzIHRoZW4gYWN0dWFsbHkgZml0dGVkLgotICAgICAqIHNvIGlmIGZodHlwZSBzZWVtcyB0byBiZSBtb3JlIHRoYW4gbGVuLCByZWR1Y2UgZmh0eXBlLgotICAgICAqIFZhbGlkIHR5cGVzIGFyZToKLSAgICAgKiAgIDIgLSBvYmplY3RpZCArIGRpcl9pZCAtIGxlZ2FjeSBzdXBwb3J0Ci0gICAgICogICAzIC0gb2JqZWN0aWQgKyBkaXJfaWQgKyBnZW5lcmF0aW9uCi0gICAgICogICA0IC0gb2JqZWN0aWQgKyBkaXJfaWQgKyBvYmplY3RpZCBhbmQgZGlyaWQgb2YgcGFyZW50IC0gbGVnYWN5Ci0gICAgICogICA1IC0gb2JqZWN0aWQgKyBkaXJfaWQgKyBnZW5lcmF0aW9uICsgb2JqZWN0aWQgYW5kIGRpcmlkIG9mIHBhcmVudAotICAgICAqICAgNiAtIGFzIGFib3ZlIHBsdXMgZ2VuZXJhdGlvbiBvZiBkaXJlY3RvcnkKLSAgICAgKiA2IGRvZXMgbm90IGZpdCBpbiBORlN2MiBoYW5kbGVzCi0gICAgICovCi0gICAgaWYgKGZodHlwZSA+IGxlbikgewotCSAgICBpZiAoZmh0eXBlICE9IDYgfHwgbGVuICE9IDUpCi0JCSAgICByZWlzZXJmc193YXJuaW5nIChzYiwgIm5mc2QvcmVpc2VyZnMsIGZodHlwZT0lZCwgbGVuPSVkIC0gb2RkIiwKLQkJCSAgIGZodHlwZSwgbGVuKTsKLQkgICAgZmh0eXBlID0gNTsKLSAgICB9CisJLyogZmh0eXBlIGhhcHBlbnMgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIHUzMnMgZW5jb2RlZC4KKwkgKiBkdWUgdG8gYSBidWcgaW4gZWFybGllciBjb2RlLCBmaHR5cGUgbWlnaHQgaW5kaWNhdGUgdGhlcmUKKwkgKiBhcmUgbW9yZSB1MzJzIHRoZW4gYWN0dWFsbHkgZml0dGVkLgorCSAqIHNvIGlmIGZodHlwZSBzZWVtcyB0byBiZSBtb3JlIHRoYW4gbGVuLCByZWR1Y2UgZmh0eXBlLgorCSAqIFZhbGlkIHR5cGVzIGFyZToKKwkgKiAgIDIgLSBvYmplY3RpZCArIGRpcl9pZCAtIGxlZ2FjeSBzdXBwb3J0CisJICogICAzIC0gb2JqZWN0aWQgKyBkaXJfaWQgKyBnZW5lcmF0aW9uCisJICogICA0IC0gb2JqZWN0aWQgKyBkaXJfaWQgKyBvYmplY3RpZCBhbmQgZGlyaWQgb2YgcGFyZW50IC0gbGVnYWN5CisJICogICA1IC0gb2JqZWN0aWQgKyBkaXJfaWQgKyBnZW5lcmF0aW9uICsgb2JqZWN0aWQgYW5kIGRpcmlkIG9mIHBhcmVudAorCSAqICAgNiAtIGFzIGFib3ZlIHBsdXMgZ2VuZXJhdGlvbiBvZiBkaXJlY3RvcnkKKwkgKiA2IGRvZXMgbm90IGZpdCBpbiBORlN2MiBoYW5kbGVzCisJICovCisJaWYgKGZodHlwZSA+IGxlbikgeworCQlpZiAoZmh0eXBlICE9IDYgfHwgbGVuICE9IDUpCisJCQlyZWlzZXJmc193YXJuaW5nKHNiLAorCQkJCQkgIm5mc2QvcmVpc2VyZnMsIGZodHlwZT0lZCwgbGVuPSVkIC0gb2RkIiwKKwkJCQkJIGZodHlwZSwgbGVuKTsKKwkJZmh0eXBlID0gNTsKKwl9CiAKLSAgICBvYmpbMF0gPSBkYXRhWzBdOwotICAgIG9ialsxXSA9IGRhdGFbMV07Ci0gICAgaWYgKGZodHlwZSA9PSAzIHx8IGZodHlwZSA+PSA1KQotCSAgICBvYmpbMl0gPSBkYXRhWzJdOwotICAgIGVsc2UgICAgb2JqWzJdID0gMDsgLyogZ2VuZXJhdGlvbiBudW1iZXIgKi8KKwlvYmpbMF0gPSBkYXRhWzBdOworCW9ialsxXSA9IGRhdGFbMV07CisJaWYgKGZodHlwZSA9PSAzIHx8IGZodHlwZSA+PSA1KQorCQlvYmpbMl0gPSBkYXRhWzJdOworCWVsc2UKKwkJb2JqWzJdID0gMDsJLyogZ2VuZXJhdGlvbiBudW1iZXIgKi8KIAotICAgIGlmIChmaHR5cGUgPj0gNCkgewotCSAgICBwYXJlbnRbMF0gPSBkYXRhW2ZodHlwZT49NT8zOjJdIDsKLQkgICAgcGFyZW50WzFdID0gZGF0YVtmaHR5cGU+PTU/NDozXSA7Ci0JICAgIGlmIChmaHR5cGUgPT0gNikKLQkJICAgIHBhcmVudFsyXSA9IGRhdGFbNV07Ci0JICAgIGVsc2UgICAgcGFyZW50WzJdID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHNiLT5zX2V4cG9ydF9vcC0+ZmluZF9leHBvcnRlZF9kZW50cnkoc2IsIG9iaiwgZmh0eXBlIDwgNCA/IE5VTEwgOiBwYXJlbnQsCi0JCQkgICAgICAgYWNjZXB0YWJsZSwgY29udGV4dCk7CisJaWYgKGZodHlwZSA+PSA0KSB7CisJCXBhcmVudFswXSA9IGRhdGFbZmh0eXBlID49IDUgPyAzIDogMl07CisJCXBhcmVudFsxXSA9IGRhdGFbZmh0eXBlID49IDUgPyA0IDogM107CisJCWlmIChmaHR5cGUgPT0gNikKKwkJCXBhcmVudFsyXSA9IGRhdGFbNV07CisJCWVsc2UKKwkJCXBhcmVudFsyXSA9IDA7CisJfQorCXJldHVybiBzYi0+c19leHBvcnRfb3AtPmZpbmRfZXhwb3J0ZWRfZGVudHJ5KHNiLCBvYmosCisJCQkJCQkgICAgIGZodHlwZSA8IDQgPyBOVUxMIDogcGFyZW50LAorCQkJCQkJICAgICBhY2NlcHRhYmxlLCBjb250ZXh0KTsKIH0KIAotaW50IHJlaXNlcmZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICpkYXRhLCBpbnQgKmxlbnAsIGludCBuZWVkX3BhcmVudCkgewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGUgOwotICAgIGludCBtYXhsZW4gPSAqbGVucDsKLSAgICAKLSAgICBpZiAobWF4bGVuIDwgMykKLSAgICAgICAgcmV0dXJuIDI1NSA7CitpbnQgcmVpc2VyZnNfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKiBkYXRhLCBpbnQgKmxlbnAsCisJCSAgICAgICBpbnQgbmVlZF9wYXJlbnQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgbWF4bGVuID0gKmxlbnA7CiAKLSAgICBkYXRhWzBdID0gaW5vZGUtPmlfaW5vIDsKLSAgICBkYXRhWzFdID0gbGUzMl90b19jcHUoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCkgOwotICAgIGRhdGFbMl0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uIDsKLSAgICAqbGVucCA9IDMgOwotICAgIC8qIG5vIHJvb20gZm9yIGRpcmVjdG9yeSBpbmZvPyByZXR1cm4gd2hhdCB3ZSd2ZSBzdG9yZWQgc28gZmFyICovCi0gICAgaWYgKG1heGxlbiA8IDUgfHwgISBuZWVkX3BhcmVudCkKLSAgICAgICAgcmV0dXJuIDMgOworCWlmIChtYXhsZW4gPCAzKQorCQlyZXR1cm4gMjU1OwogCi0gICAgc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0gICAgaW5vZGUgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlIDsKLSAgICBkYXRhWzNdID0gaW5vZGUtPmlfaW5vIDsKLSAgICBkYXRhWzRdID0gbGUzMl90b19jcHUoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCkgOwotICAgICpsZW5wID0gNSA7Ci0gICAgaWYgKG1heGxlbiA+PSA2KSB7Ci0JICAgIGRhdGFbNV0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uIDsKLQkgICAgKmxlbnAgPSA2IDsKLSAgICB9Ci0gICAgc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLSAgICByZXR1cm4gKmxlbnAgOworCWRhdGFbMF0gPSBpbm9kZS0+aV9pbm87CisJZGF0YVsxXSA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZCk7CisJZGF0YVsyXSA9IGlub2RlLT5pX2dlbmVyYXRpb247CisJKmxlbnAgPSAzOworCS8qIG5vIHJvb20gZm9yIGRpcmVjdG9yeSBpbmZvPyByZXR1cm4gd2hhdCB3ZSd2ZSBzdG9yZWQgc28gZmFyICovCisJaWYgKG1heGxlbiA8IDUgfHwgIW5lZWRfcGFyZW50KQorCQlyZXR1cm4gMzsKKworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCWlub2RlID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwlkYXRhWzNdID0gaW5vZGUtPmlfaW5vOworCWRhdGFbNF0gPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpOworCSpsZW5wID0gNTsKKwlpZiAobWF4bGVuID49IDYpIHsKKwkJZGF0YVs1XSA9IGlub2RlLT5pX2dlbmVyYXRpb247CisJCSpsZW5wID0gNjsKKwl9CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlyZXR1cm4gKmxlbnA7CiB9CiAKLQogLyogbG9va3MgZm9yIHN0YXQgZGF0YSwgdGhlbiBjb3BpZXMgZmllbGRzIHRvIGl0LCBtYXJrcyB0aGUgYnVmZmVyCiAgICBjb250YWluaW5nIHN0YXQgZGF0YSBhcyBkaXJ0eSAqLwogLyogcmVpc2VyZnMgaW5vZGVzIGFyZSBuZXZlciByZWFsbHkgZGlydHksIHNpbmNlIHRoZSBkaXJ0eSBpbm9kZSBjYWxsCkBAIC0xNTU0LDEyMSArMTYzOCwxMjggQEAKICoqIHRvIHByb3Blcmx5IG1hcmsgaW5vZGVzIGZvciBkYXRhc3luYyBhbmQgc3VjaCwgYnV0IG9ubHkgYWN0dWFsbHkKICoqIGRvZXMgc29tZXRoaW5nIHdoZW4gY2FsbGVkIGZvciBhIHN5bmNocm9ub3VzIHVwZGF0ZS4KICovCi1pbnQgcmVpc2VyZnNfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgZG9fc3luYykgewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBqYmVnaW5fY291bnQgPSAxIDsKK2ludCByZWlzZXJmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZG9fc3luYykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBqYmVnaW5fY291bnQgPSAxOwogCi0gICAgaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQotICAgICAgICByZXR1cm4gLUVST0ZTOwotICAgIC8qIG1lbW9yeSBwcmVzc3VyZSBjYW4gc29tZXRpbWVzIGluaXRpYXRlIHdyaXRlX2lub2RlIGNhbGxzIHdpdGggc3luYyA9PSAxLAotICAgICoqIHRoZXNlIGNhc2VzIGFyZSBqdXN0IHdoZW4gdGhlIHN5c3RlbSBuZWVkcyByYW0sIG5vdCB3aGVuIHRoZSAKLSAgICAqKiBpbm9kZSBuZWVkcyB0byByZWFjaCBkaXNrIGZvciBzYWZldHksIGFuZCB0aGV5IGNhbiBzYWZlbHkgYmUKLSAgICAqKiBpZ25vcmVkIGJlY2F1c2UgdGhlIGFsdGVyZWQgaW5vZGUgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQuCi0gICAgKi8KLSAgICBpZiAoZG9fc3luYyAmJiAhKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpKSB7Ci0JcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0JaWYgKCFqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0gICAgICAgICAgICBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgICAgICB9Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gLUVST0ZTOworCS8qIG1lbW9yeSBwcmVzc3VyZSBjYW4gc29tZXRpbWVzIGluaXRpYXRlIHdyaXRlX2lub2RlIGNhbGxzIHdpdGggc3luYyA9PSAxLAorCSAqKiB0aGVzZSBjYXNlcyBhcmUganVzdCB3aGVuIHRoZSBzeXN0ZW0gbmVlZHMgcmFtLCBub3Qgd2hlbiB0aGUgCisJICoqIGlub2RlIG5lZWRzIHRvIHJlYWNoIGRpc2sgZm9yIHNhZmV0eSwgYW5kIHRoZXkgY2FuIHNhZmVseSBiZQorCSAqKiBpZ25vcmVkIGJlY2F1c2UgdGhlIGFsdGVyZWQgaW5vZGUgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQuCisJICovCisJaWYgKGRvX3N5bmMgJiYgIShjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkgeworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKCFqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkpIHsKKwkJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJCWpvdXJuYWxfZW5kX3N5bmMoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJfQorCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyogc3RhdCBkYXRhIG9mIG5ldyBvYmplY3QgaXMgaW5zZXJ0ZWQgYWxyZWFkeSwgdGhpcyBpbnNlcnRzIHRoZSBpdGVtCiAgICBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyaWVzICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX25ld19kaXJlY3RvcnkgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgc3RydWN0IHBhdGggKiBwYXRoLAotCQkJCSAgIHN0cnVjdCBpbm9kZSAqIGRpcikKK3N0YXRpYyBpbnQgcmVpc2VyZnNfbmV3X2RpcmVjdG9yeShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICppaCwgc3RydWN0IHBhdGggKnBhdGgsCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmRpcikKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IHRoLT50X3N1cGVyOwotICAgIGNoYXIgZW1wdHlfZGlyIFtFTVBUWV9ESVJfU0laRV07Ci0gICAgY2hhciAqIGJvZHkgPSBlbXB0eV9kaXI7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIGludCByZXR2YWw7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHRoLT50X3N1cGVyOworCWNoYXIgZW1wdHlfZGlyW0VNUFRZX0RJUl9TSVpFXTsKKwljaGFyICpib2R5ID0gZW1wdHlfZGlyOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlpbnQgcmV0dmFsOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAgIAotICAgIF9tYWtlX2NwdV9rZXkgKCZrZXksIEtFWV9GT1JNQVRfM181LCBsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX2Rpcl9pZCksCi0JCSAgIGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpLCBET1RfT0ZGU0VULCBUWVBFX0RJUkVOVFJZLCAzLyprZXkgbGVuZ3RoKi8pOwotICAgIAotICAgIC8qIGNvbXBvc2UgaXRlbSBoZWFkIGZvciBuZXcgaXRlbS4gRGlyZWN0b3JpZXMgY29uc2lzdCBvZiBpdGVtcyBvZgotICAgICAgIG9sZCB0eXBlIChJVEVNX1ZFUlNJT05fMSkuIERvIG5vdCBzZXQga2V5IChzZWNvbmQgYXJnIGlzIDApLCBpdAotICAgICAgIGlzIGRvbmUgYnkgcmVpc2VyZnNfbmV3X2lub2RlICovCi0gICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpKSB7Ci0JbWFrZV9sZV9pdGVtX2hlYWQgKGloLCBOVUxMLCBLRVlfRk9STUFUXzNfNSwgRE9UX09GRlNFVCwgVFlQRV9ESVJFTlRSWSwgRU1QVFlfRElSX1NJWkVfVjEsIDIpOwotCQotCW1ha2VfZW1wdHlfZGlyX2l0ZW1fdjEgKGJvZHksIGloLT5paF9rZXkua19kaXJfaWQsIGloLT5paF9rZXkua19vYmplY3RpZCwKLQkJCQlJTk9ERV9QS0VZIChkaXIpLT5rX2Rpcl9pZCwgCi0JCQkJSU5PREVfUEtFWSAoZGlyKS0+a19vYmplY3RpZCApOwotICAgIH0gZWxzZSB7Ci0JbWFrZV9sZV9pdGVtX2hlYWQgKGloLCBOVUxMLCBLRVlfRk9STUFUXzNfNSwgRE9UX09GRlNFVCwgVFlQRV9ESVJFTlRSWSwgRU1QVFlfRElSX1NJWkUsIDIpOwotCQotCW1ha2VfZW1wdHlfZGlyX2l0ZW0gKGJvZHksIGloLT5paF9rZXkua19kaXJfaWQsIGloLT5paF9rZXkua19vYmplY3RpZCwKLQkJICAgCQlJTk9ERV9QS0VZIChkaXIpLT5rX2Rpcl9pZCwgCi0JCSAgIAkJSU5PREVfUEtFWSAoZGlyKS0+a19vYmplY3RpZCApOwotICAgIH0KLSAgICAKLSAgICAvKiBsb29rIGZvciBwbGFjZSBpbiB0aGUgdHJlZSBmb3IgbmV3IGl0ZW0gKi8KLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoc2IsICZrZXksIHBhdGgpOwotICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQlyZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTEzMDgwOiByZWlzZXJmc19uZXdfZGlyZWN0b3J5OiAiCi0JCQkgICJpL28gZmFpbHVyZSBvY2N1cnJlZCBjcmVhdGluZyBuZXcgZGlyZWN0b3J5Iik7Ci0JcmV0dXJuIC1FSU87Ci0gICAgfQotICAgIGlmIChyZXR2YWwgPT0gSVRFTV9GT1VORCkgewotCXBhdGhyZWxzZSAocGF0aCk7Ci0JcmVpc2VyZnNfd2FybmluZyAoc2IsICJ2cy0xMzA3MDogcmVpc2VyZnNfbmV3X2RpcmVjdG9yeTogIgotCQkJICAib2JqZWN0IHdpdGggdGhpcyBrZXkgZXhpc3RzICglaykiLCAmKGloLT5paF9rZXkpKTsKLQlyZXR1cm4gLUVFWElTVDsKLSAgICB9CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICAvKiBpbnNlcnQgaXRlbSwgdGhhdCBpcyBlbXB0eSBkaXJlY3RvcnkgaXRlbSAqLwotICAgIHJldHVybiByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsIHBhdGgsICZrZXksIGloLCBpbm9kZSwgYm9keSk7CisJX21ha2VfY3B1X2tleSgma2V5LCBLRVlfRk9STUFUXzNfNSwgbGUzMl90b19jcHUoaWgtPmloX2tleS5rX2Rpcl9pZCksCisJCSAgICAgIGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19vYmplY3RpZCksIERPVF9PRkZTRVQsCisJCSAgICAgIFRZUEVfRElSRU5UUlksIDMgLyprZXkgbGVuZ3RoICovICk7CisKKwkvKiBjb21wb3NlIGl0ZW0gaGVhZCBmb3IgbmV3IGl0ZW0uIERpcmVjdG9yaWVzIGNvbnNpc3Qgb2YgaXRlbXMgb2YKKwkgICBvbGQgdHlwZSAoSVRFTV9WRVJTSU9OXzEpLiBEbyBub3Qgc2V0IGtleSAoc2Vjb25kIGFyZyBpcyAwKSwgaXQKKwkgICBpcyBkb25lIGJ5IHJlaXNlcmZzX25ld19pbm9kZSAqLworCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKSB7CisJCW1ha2VfbGVfaXRlbV9oZWFkKGloLCBOVUxMLCBLRVlfRk9STUFUXzNfNSwgRE9UX09GRlNFVCwKKwkJCQkgIFRZUEVfRElSRU5UUlksIEVNUFRZX0RJUl9TSVpFX1YxLCAyKTsKKworCQltYWtlX2VtcHR5X2Rpcl9pdGVtX3YxKGJvZHksIGloLT5paF9rZXkua19kaXJfaWQsCisJCQkJICAgICAgIGloLT5paF9rZXkua19vYmplY3RpZCwKKwkJCQkgICAgICAgSU5PREVfUEtFWShkaXIpLT5rX2Rpcl9pZCwKKwkJCQkgICAgICAgSU5PREVfUEtFWShkaXIpLT5rX29iamVjdGlkKTsKKwl9IGVsc2UgeworCQltYWtlX2xlX2l0ZW1faGVhZChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsCisJCQkJICBUWVBFX0RJUkVOVFJZLCBFTVBUWV9ESVJfU0laRSwgMik7CisKKwkJbWFrZV9lbXB0eV9kaXJfaXRlbShib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLAorCQkJCSAgICBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCisJCQkJICAgIElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQsCisJCQkJICAgIElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZCk7CisJfQorCisJLyogbG9vayBmb3IgcGxhY2UgaW4gdGhlIHRyZWUgZm9yIG5ldyBpdGVtICovCisJcmV0dmFsID0gc2VhcmNoX2l0ZW0oc2IsICZrZXksIHBhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzYiwgInZzLTEzMDgwOiByZWlzZXJmc19uZXdfZGlyZWN0b3J5OiAiCisJCQkJICJpL28gZmFpbHVyZSBvY2N1cnJlZCBjcmVhdGluZyBuZXcgZGlyZWN0b3J5Iik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKKwkJcGF0aHJlbHNlKHBhdGgpOworCQlyZWlzZXJmc193YXJuaW5nKHNiLCAidnMtMTMwNzA6IHJlaXNlcmZzX25ld19kaXJlY3Rvcnk6ICIKKwkJCQkgIm9iamVjdCB3aXRoIHRoaXMga2V5IGV4aXN0cyAoJWspIiwKKwkJCQkgJihpaC0+aWhfa2V5KSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCS8qIGluc2VydCBpdGVtLCB0aGF0IGlzIGVtcHR5IGRpcmVjdG9yeSBpdGVtICovCisJcmV0dXJuIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCBwYXRoLCAma2V5LCBpaCwgaW5vZGUsIGJvZHkpOwogfQogCi0KIC8qIHN0YXQgZGF0YSBvZiBvYmplY3QgaGFzIGJlZW4gaW5zZXJ0ZWQsIHRoaXMgaW5zZXJ0cyB0aGUgaXRlbQogICAgY29udGFpbmluZyB0aGUgYm9keSBvZiBzeW1saW5rICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX25ld19zeW1saW5rIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCS8qIElub2RlIG9mIHN5bWxpbmsgKi8KLQkJCQkgc3RydWN0IGl0ZW1faGVhZCAqIGloLAotCQkJCSBzdHJ1Y3QgcGF0aCAqIHBhdGgsIGNvbnN0IGNoYXIgKiBzeW1uYW1lLCBpbnQgaXRlbV9sZW4pCitzdGF0aWMgaW50IHJlaXNlcmZzX25ld19zeW1saW5rKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAkvKiBJbm9kZSBvZiBzeW1saW5rICovCisJCQkJc3RydWN0IGl0ZW1faGVhZCAqaWgsCisJCQkJc3RydWN0IHBhdGggKnBhdGgsIGNvbnN0IGNoYXIgKnN5bW5hbWUsCisJCQkJaW50IGl0ZW1fbGVuKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gdGgtPnRfc3VwZXI7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIGludCByZXR2YWw7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHRoLT50X3N1cGVyOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlpbnQgcmV0dmFsOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgX21ha2VfY3B1X2tleSAoJmtleSwgS0VZX0ZPUk1BVF8zXzUsIAotCQkgICBsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX2Rpcl9pZCksIAotCQkgICBsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX29iamVjdGlkKSwKLQkJICAgMSwgVFlQRV9ESVJFQ1QsIDMvKmtleSBsZW5ndGgqLyk7CisJX21ha2VfY3B1X2tleSgma2V5LCBLRVlfRk9STUFUXzNfNSwKKwkJICAgICAgbGUzMl90b19jcHUoaWgtPmloX2tleS5rX2Rpcl9pZCksCisJCSAgICAgIGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19vYmplY3RpZCksCisJCSAgICAgIDEsIFRZUEVfRElSRUNULCAzIC8qa2V5IGxlbmd0aCAqLyApOwogCi0gICAgbWFrZV9sZV9pdGVtX2hlYWQgKGloLCBOVUxMLCBLRVlfRk9STUFUXzNfNSwgMSwgVFlQRV9ESVJFQ1QsIGl0ZW1fbGVuLCAwLypmcmVlX3NwYWNlKi8pOworCW1ha2VfbGVfaXRlbV9oZWFkKGloLCBOVUxMLCBLRVlfRk9STUFUXzNfNSwgMSwgVFlQRV9ESVJFQ1QsIGl0ZW1fbGVuLAorCQkJICAwIC8qZnJlZV9zcGFjZSAqLyApOwogCi0gICAgLyogbG9vayBmb3IgcGxhY2UgaW4gdGhlIHRyZWUgZm9yIG5ldyBpdGVtICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHNiLCAma2V5LCBwYXRoKTsKLSAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoc2IsICJ2cy0xMzA4MDogcmVpc2VyZnNfbmV3X3N5bWxpbmlrOiAiCi0JCQkgICJpL28gZmFpbHVyZSBvY2N1cnJlZCBjcmVhdGluZyBuZXcgc3ltbGluayIpOwotCXJldHVybiAtRUlPOwotICAgIH0KLSAgICBpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKLQlwYXRocmVsc2UgKHBhdGgpOwotCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19zeW1saW5rOiAiCi0JCQkgICJvYmplY3Qgd2l0aCB0aGlzIGtleSBleGlzdHMgKCVrKSIsICYoaWgtPmloX2tleSkpOwotCXJldHVybiAtRUVYSVNUOwotICAgIH0KKwkvKiBsb29rIGZvciBwbGFjZSBpbiB0aGUgdHJlZSBmb3IgbmV3IGl0ZW0gKi8KKwlyZXR2YWwgPSBzZWFyY2hfaXRlbShzYiwgJmtleSwgcGF0aCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQlyZWlzZXJmc193YXJuaW5nKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19zeW1saW5pazogIgorCQkJCSAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IHN5bWxpbmsiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChyZXR2YWwgPT0gSVRFTV9GT1VORCkgeworCQlwYXRocmVsc2UocGF0aCk7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJ2cy0xMzA4MDogcmVpc2VyZnNfbmV3X3N5bWxpbms6ICIKKwkJCQkgIm9iamVjdCB3aXRoIHRoaXMga2V5IGV4aXN0cyAoJWspIiwKKwkJCQkgJihpaC0+aWhfa2V5KSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KIAotICAgIC8qIGluc2VydCBpdGVtLCB0aGF0IGlzIGJvZHkgb2Ygc3ltbGluayAqLwotICAgIHJldHVybiByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsIHBhdGgsICZrZXksIGloLCBpbm9kZSwgc3ltbmFtZSk7CisJLyogaW5zZXJ0IGl0ZW0sIHRoYXQgaXMgYm9keSBvZiBzeW1saW5rICovCisJcmV0dXJuIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCBwYXRoLCAma2V5LCBpaCwgaW5vZGUsIHN5bW5hbWUpOwogfQogCi0KIC8qIGluc2VydHMgdGhlIHN0YXQgZGF0YSBpbnRvIHRoZSB0cmVlLCBhbmQgdGhlbiBjYWxscwogICAgcmVpc2VyZnNfbmV3X2RpcmVjdG9yeSAodG8gaW5zZXJ0ICIuIiwgIi4uIiBpdGVtIGlmIG5ldyBvYmplY3QgaXMKICAgIGRpcmVjdG9yeSkgb3IgcmVpc2VyZnNfbmV3X3N5bWxpbmsgKHRvIGluc2VydCBzeW1saW5rIGJvZHkgaWYgbmV3CkBAIC0xNjc4LDIxMyArMTc2OSwyMTkgQEAKICAgIG5vbi16ZXJvIGR1ZSB0byBhbiBlcnJvciwgd2UgaGF2ZSB0byBkcm9wIHRoZSBxdW90YSBwcmV2aW91c2x5IGFsbG9jYXRlZAogICAgZm9yIHRoZSBmcmVzaCBpbm9kZS4gIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBvdXRzaWRlIGEgdHJhbnNhY3Rpb24sIHNvCiAgICBpZiB3ZSByZXR1cm4gbm9uLXplcm8sIHdlIGFsc28gZW5kIHRoZSB0cmFuc2FjdGlvbi4gICovCi1pbnQgcmVpc2VyZnNfbmV3X2lub2RlIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCXN0cnVjdCBpbm9kZSAqIGRpciwgaW50IG1vZGUsIAotCQkJY29uc3QgY2hhciAqIHN5bW5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgLyogMCBmb3IgcmVndWxhciwgRU1UUllfRElSX1NJWkUgZm9yIGRpcnMsIAotCQkJICAgc3RybGVuIChzeW1uYW1lKSBmb3Igc3ltbGlua3MpKi8KLQkJICAgICAgICAgbG9mZl90IGlfc2l6ZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAKLQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoraW50IHJlaXNlcmZzX25ld19pbm9kZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSwgY29uc3QgY2hhciAqc3ltbmFtZSwKKwkJICAgICAgIC8qIDAgZm9yIHJlZ3VsYXIsIEVNVFJZX0RJUl9TSVpFIGZvciBkaXJzLCAKKwkJICAgICAgICAgIHN0cmxlbiAoc3ltbmFtZSkgZm9yIHN5bWxpbmtzKSAqLworCQkgICAgICAgbG9mZl90IGlfc2l6ZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fa2V5KTsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCBpaDsKLSAgICBzdHJ1Y3Qgc3RhdF9kYXRhIHNkOwotICAgIGludCByZXR2YWw7Ci0gICAgaW50IGVycjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCUlOSVRJQUxJWkVfUEFUSChwYXRoX3RvX2tleSk7CisJc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBpdGVtX2hlYWQgaWg7CisJc3RydWN0IHN0YXRfZGF0YSBzZDsKKwlpbnQgcmV0dmFsOworCWludCBlcnI7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gIAotICAgIGlmIChEUVVPVF9BTExPQ19JTk9ERShpbm9kZSkpIHsKLQllcnIgPSAtRURRVU9UOwotCWdvdG8gb3V0X2VuZF90cmFuczsKLSAgICB9Ci0gICAgaWYgKCFkaXIgfHwgIWRpci0+aV9ubGluaykgewotCWVyciA9IC1FUEVSTTsKLQlnb3RvIG91dF9iYWRfaW5vZGU7Ci0gICAgfQorCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgc2IgPSBkaXItPmlfc2I7Ci0KLSAgICAvKiBpdGVtIGhlYWQgb2YgbmV3IGl0ZW0gKi8KLSAgICBpaC5paF9rZXkua19kaXJfaWQgPSByZWlzZXJmc19jaG9vc2VfcGFja2luZyhkaXIpOwotICAgIGloLmloX2tleS5rX29iamVjdGlkID0gY3B1X3RvX2xlMzIgKHJlaXNlcmZzX2dldF91bnVzZWRfb2JqZWN0aWQgKHRoKSk7Ci0gICAgaWYgKCFpaC5paF9rZXkua19vYmplY3RpZCkgewotCWVyciA9IC1FTk9NRU07Ci0JZ290byBvdXRfYmFkX2lub2RlIDsKLSAgICB9Ci0gICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpKQotCS8qIG5vdCBhIHBlcmZlY3QgZ2VuZXJhdGlvbiBjb3VudCwgYXMgb2JqZWN0IGlkcyBjYW4gYmUgcmV1c2VkLCBidXQgCi0JKiogdGhpcyBpcyBhcyBnb29kIGFzIHJlaXNlcmZzIGNhbiBkbyByaWdodCBub3cuCi0JKiogbm90ZSB0aGF0IHRoZSBwcml2YXRlIHBhcnQgb2YgaW5vZGUgaXNuJ3QgZmlsbGVkIGluIHlldCwgd2UgaGF2ZQotCSoqIHRvIHVzZSB0aGUgZGlyZWN0b3J5LgotCSovCi0JaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChkaXIpLT5rX29iamVjdGlkKTsKLSAgICBlbHNlCi0jaWYgZGVmaW5lZCggVVNFX0lOT0RFX0dFTkVSQVRJT05fQ09VTlRFUiApCi0JaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1KFJFSVNFUkZTX1NCKHNiKS0+c19ycy0+c19pbm9kZV9nZW5lcmF0aW9uKTsKLSNlbHNlCi0JaW5vZGUtPmlfZ2VuZXJhdGlvbiA9ICsrZXZlbnQ7Ci0jZW5kaWYKLQotICAgIC8qIGZpbGwgc3RhdCBkYXRhICovCi0gICAgaW5vZGUtPmlfbmxpbmsgPSAoU19JU0RJUiAobW9kZSkgPyAyIDogMSk7Ci0KLSAgICAvKiB1aWQgYW5kIGdpZCBtdXN0IGFscmVhZHkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgZm9yIHF1b3RhIGluaXQgKi8KLQotICAgIC8qIHN5bWxpbmsgY2Fubm90IGJlIGltbXV0YWJsZSBvciBhcHBlbmQgb25seSwgcmlnaHQ/ICovCi0gICAgaWYoIFNfSVNMTksoIGlub2RlIC0+IGlfbW9kZSApICkKLQkgICAgaW5vZGUgLT4gaV9mbGFncyAmPSB+ICggU19JTU1VVEFCTEUgfCBTX0FQUEVORCApOwotCi0gICAgaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0KLQkgICAgQ1VSUkVOVF9USU1FX1NFQzsKLSAgICBpbm9kZS0+aV9zaXplID0gaV9zaXplOwotICAgIGlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0gICAgaW5vZGUtPmlfYnl0ZXMgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gU19JU0xOSyhtb2RlKSA/IDEgOiAKLSAgICAgIFUzMl9NQVgvKk5PX0JZVEVTX0lOX0RJUkVDVF9JVEVNKi87Ci0KLSAgICBJTklUX0xJU1RfSEVBRCgmKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QgKSk7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9IDA7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2psID0gTlVMTDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycyA9Ci0JUkVJU0VSRlNfSShkaXIpLT5pX2F0dHJzICYgUkVJU0VSRlNfSU5IRVJJVF9NQVNLOwotICAgIHNkX2F0dHJzX3RvX2lfYXR0cnMoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfYXR0cnMsIGlub2RlICk7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzcyA9IE5VTEw7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2RlZmF1bHQgPSBOVUxMOwotICAgIGluaXRfcndzZW0gKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKLQotICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkKLQltYWtlX2xlX2l0ZW1faGVhZCAoJmloLCBOVUxMLCBLRVlfRk9STUFUXzNfNSwgU0RfT0ZGU0VULCBUWVBFX1NUQVRfREFUQSwgU0RfVjFfU0laRSwgTUFYX1VTX0lOVCk7Ci0gICAgZWxzZQotCW1ha2VfbGVfaXRlbV9oZWFkICgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM182LCBTRF9PRkZTRVQsIFRZUEVfU1RBVF9EQVRBLCBTRF9TSVpFLCBNQVhfVVNfSU5UKTsKLQotICAgIC8qIGtleSB0byBzZWFyY2ggZm9yIGNvcnJlY3QgcGxhY2UgZm9yIG5ldyBzdGF0IGRhdGEgKi8KLSAgICBfbWFrZV9jcHVfa2V5ICgma2V5LCBLRVlfRk9STUFUXzNfNiwgbGUzMl90b19jcHUgKGloLmloX2tleS5rX2Rpcl9pZCksCi0JCSAgIGxlMzJfdG9fY3B1IChpaC5paF9rZXkua19vYmplY3RpZCksIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIDMvKmtleSBsZW5ndGgqLyk7Ci0KLSAgICAvKiBmaW5kIHByb3BlciBwbGFjZSBmb3IgaW5zZXJ0aW5nIG9mIHN0YXQgZGF0YSAqLwotICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzYiwgJmtleSwgJnBhdGhfdG9fa2V5KTsKLSAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JZXJyID0gLUVJTzsKLQlnb3RvIG91dF9iYWRfaW5vZGU7Ci0gICAgfQotICAgIGlmIChyZXR2YWwgPT0gSVRFTV9GT1VORCkgewotCXBhdGhyZWxzZSAoJnBhdGhfdG9fa2V5KTsKLQllcnIgPSAtRUVYSVNUOwotCWdvdG8gb3V0X2JhZF9pbm9kZTsKLSAgICB9Ci0gICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpKSB7Ci0JaWYgKGlub2RlLT5pX3VpZCAmIH4weGZmZmYgfHwgaW5vZGUtPmlfZ2lkICYgfjB4ZmZmZikgewotCSAgICBwYXRocmVsc2UgKCZwYXRoX3RvX2tleSk7Ci0JICAgIC8qIGlfdWlkIG9yIGlfZ2lkIGlzIHRvbyBiaWcgdG8gYmUgc3RvcmVkIGluIHN0YXQgZGF0YSB2My41ICovCi0JICAgIGVyciA9IC1FSU5WQUw7Ci0JICAgIGdvdG8gb3V0X2JhZF9pbm9kZTsKKwlpZiAoRFFVT1RfQUxMT0NfSU5PREUoaW5vZGUpKSB7CisJCWVyciA9IC1FRFFVT1Q7CisJCWdvdG8gb3V0X2VuZF90cmFuczsKIAl9Ci0JaW5vZGUyc2RfdjEgKCZzZCwgaW5vZGUsIGlub2RlLT5pX3NpemUpOwotICAgIH0gZWxzZSB7Ci0JaW5vZGUyc2QgKCZzZCwgaW5vZGUsIGlub2RlLT5pX3NpemUpOwotICAgIH0KLSAgICAvLyB0aGVzZSBkbyBub3QgZ28gdG8gb24tZGlzayBzdGF0IGRhdGEKLSAgICBpbm9kZS0+aV9pbm8gPSBsZTMyX3RvX2NwdSAoaWguaWhfa2V5Lmtfb2JqZWN0aWQpOwotICAgIGlub2RlLT5pX2Jsa3NpemUgPSByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7Ci0gIAotICAgIC8vIHN0b3JlIGluIGluLWNvcmUgaW5vZGUgdGhlIGtleSBvZiBzdGF0IGRhdGEgYW5kIHZlcnNpb24gYWxsCi0gICAgLy8gb2JqZWN0IGl0ZW1zIHdpbGwgaGF2ZSAoZGlyZWN0b3J5IGl0ZW1zIHdpbGwgaGF2ZSBvbGQgb2Zmc2V0Ci0gICAgLy8gZm9ybWF0LCBvdGhlciBuZXcgb2JqZWN0cyB3aWxsIGNvbnNpc3Qgb2YgbmV3IGl0ZW1zKQotICAgIG1lbWNweSAoSU5PREVfUEtFWSAoaW5vZGUpLCAmKGloLmloX2tleSksIEtFWV9TSVpFKTsKLSAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikgfHwgU19JU0RJUihtb2RlKSB8fCBTX0lTTE5LKG1vZGUpKQotICAgICAgICBzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKLSAgICBlbHNlCi0gICAgICAgIHNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzYpOwotICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkKLQlzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMSk7Ci0gICAgZWxzZQotCXNldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSwgU1RBVF9EQVRBX1YyKTsKLSAgICAKLSAgICAvKiBpbnNlcnQgdGhlIHN0YXQgZGF0YSBpbnRvIHRoZSB0cmVlICovCi0jaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotICAgIGlmIChSRUlTRVJGU19JKGRpciktPm5ld19wYWNraW5nX2xvY2FsaXR5KQotCXRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzID0gMTsKKwlpZiAoIWRpciB8fCAhZGlyLT5pX25saW5rKSB7CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBvdXRfYmFkX2lub2RlOworCX0KKworCXNiID0gZGlyLT5pX3NiOworCisJLyogaXRlbSBoZWFkIG9mIG5ldyBpdGVtICovCisJaWguaWhfa2V5LmtfZGlyX2lkID0gcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoZGlyKTsKKwlpaC5paF9rZXkua19vYmplY3RpZCA9IGNwdV90b19sZTMyKHJlaXNlcmZzX2dldF91bnVzZWRfb2JqZWN0aWQodGgpKTsKKwlpZiAoIWloLmloX2tleS5rX29iamVjdGlkKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2JhZF9pbm9kZTsKKwl9CisJaWYgKG9sZF9mb3JtYXRfb25seShzYikpCisJCS8qIG5vdCBhIHBlcmZlY3QgZ2VuZXJhdGlvbiBjb3VudCwgYXMgb2JqZWN0IGlkcyBjYW4gYmUgcmV1c2VkLCBidXQgCisJCSAqKiB0aGlzIGlzIGFzIGdvb2QgYXMgcmVpc2VyZnMgY2FuIGRvIHJpZ2h0IG5vdy4KKwkJICoqIG5vdGUgdGhhdCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIGlub2RlIGlzbid0IGZpbGxlZCBpbiB5ZXQsIHdlIGhhdmUKKwkJICoqIHRvIHVzZSB0aGUgZGlyZWN0b3J5LgorCQkgKi8KKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZCk7CisJZWxzZQorI2lmIGRlZmluZWQoIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKQorCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0KKwkJICAgIGxlMzJfdG9fY3B1KFJFSVNFUkZTX1NCKHNiKS0+c19ycy0+c19pbm9kZV9nZW5lcmF0aW9uKTsKKyNlbHNlCisJCWlub2RlLT5pX2dlbmVyYXRpb24gPSArK2V2ZW50OwogI2VuZGlmCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCAmcGF0aF90b19rZXksICZrZXksICZpaCwgaW5vZGUsIChjaGFyICopKCZzZCkpOwotICAgIGlmIChyZXR2YWwpIHsKLQllcnIgPSByZXR2YWw7Ci0JcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpIDsKLQlnb3RvIG91dF9iYWRfaW5vZGU7Ci0gICAgfQogCisJLyogZmlsbCBzdGF0IGRhdGEgKi8KKwlpbm9kZS0+aV9ubGluayA9IChTX0lTRElSKG1vZGUpID8gMiA6IDEpOworCisJLyogdWlkIGFuZCBnaWQgbXVzdCBhbHJlYWR5IGJlIHNldCBieSB0aGUgY2FsbGVyIGZvciBxdW90YSBpbml0ICovCisKKwkvKiBzeW1saW5rIGNhbm5vdCBiZSBpbW11dGFibGUgb3IgYXBwZW5kIG9ubHksIHJpZ2h0PyAqLworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlpbm9kZS0+aV9mbGFncyAmPSB+KFNfSU1NVVRBQkxFIHwgU19BUFBFTkQpOworCisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpbm9kZS0+aV9zaXplID0gaV9zaXplOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfYnl0ZXMgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gU19JU0xOSyhtb2RlKSA/IDEgOgorCSAgICBVMzJfTUFYIC8qTk9fQllURVNfSU5fRElSRUNUX0lURU0gKi8gOworCisJSU5JVF9MSVNUX0hFQUQoJihSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0KSk7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9IDA7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2psID0gTlVMTDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycyA9CisJICAgIFJFSVNFUkZTX0koZGlyKS0+aV9hdHRycyAmIFJFSVNFUkZTX0lOSEVSSVRfTUFTSzsKKwlzZF9hdHRyc190b19pX2F0dHJzKFJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzLCBpbm9kZSk7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzcyA9IE5VTEw7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2RlZmF1bHQgPSBOVUxMOworCWluaXRfcndzZW0oJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOworCisJaWYgKG9sZF9mb3JtYXRfb25seShzYikpCisJCW1ha2VfbGVfaXRlbV9oZWFkKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIFNEX09GRlNFVCwKKwkJCQkgIFRZUEVfU1RBVF9EQVRBLCBTRF9WMV9TSVpFLCBNQVhfVVNfSU5UKTsKKwllbHNlCisJCW1ha2VfbGVfaXRlbV9oZWFkKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzYsIFNEX09GRlNFVCwKKwkJCQkgIFRZUEVfU1RBVF9EQVRBLCBTRF9TSVpFLCBNQVhfVVNfSU5UKTsKKworCS8qIGtleSB0byBzZWFyY2ggZm9yIGNvcnJlY3QgcGxhY2UgZm9yIG5ldyBzdGF0IGRhdGEgKi8KKwlfbWFrZV9jcHVfa2V5KCZrZXksIEtFWV9GT1JNQVRfM182LCBsZTMyX3RvX2NwdShpaC5paF9rZXkua19kaXJfaWQpLAorCQkgICAgICBsZTMyX3RvX2NwdShpaC5paF9rZXkua19vYmplY3RpZCksIFNEX09GRlNFVCwKKwkJICAgICAgVFlQRV9TVEFUX0RBVEEsIDMgLyprZXkgbGVuZ3RoICovICk7CisKKwkvKiBmaW5kIHByb3BlciBwbGFjZSBmb3IgaW5zZXJ0aW5nIG9mIHN0YXQgZGF0YSAqLworCXJldHZhbCA9IHNlYXJjaF9pdGVtKHNiLCAma2V5LCAmcGF0aF90b19rZXkpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXRfYmFkX2lub2RlOworCX0KKwlpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKKwkJcGF0aHJlbHNlKCZwYXRoX3RvX2tleSk7CisJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gb3V0X2JhZF9pbm9kZTsKKwl9CisJaWYgKG9sZF9mb3JtYXRfb25seShzYikpIHsKKwkJaWYgKGlub2RlLT5pX3VpZCAmIH4weGZmZmYgfHwgaW5vZGUtPmlfZ2lkICYgfjB4ZmZmZikgeworCQkJcGF0aHJlbHNlKCZwYXRoX3RvX2tleSk7CisJCQkvKiBpX3VpZCBvciBpX2dpZCBpcyB0b28gYmlnIHRvIGJlIHN0b3JlZCBpbiBzdGF0IGRhdGEgdjMuNSAqLworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2JhZF9pbm9kZTsKKwkJfQorCQlpbm9kZTJzZF92MSgmc2QsIGlub2RlLCBpbm9kZS0+aV9zaXplKTsKKwl9IGVsc2UgeworCQlpbm9kZTJzZCgmc2QsIGlub2RlLCBpbm9kZS0+aV9zaXplKTsKKwl9CisJLy8gdGhlc2UgZG8gbm90IGdvIHRvIG9uLWRpc2sgc3RhdCBkYXRhCisJaW5vZGUtPmlfaW5vID0gbGUzMl90b19jcHUoaWguaWhfa2V5Lmtfb2JqZWN0aWQpOworCWlub2RlLT5pX2Jsa3NpemUgPSByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7CisKKwkvLyBzdG9yZSBpbiBpbi1jb3JlIGlub2RlIHRoZSBrZXkgb2Ygc3RhdCBkYXRhIGFuZCB2ZXJzaW9uIGFsbAorCS8vIG9iamVjdCBpdGVtcyB3aWxsIGhhdmUgKGRpcmVjdG9yeSBpdGVtcyB3aWxsIGhhdmUgb2xkIG9mZnNldAorCS8vIGZvcm1hdCwgb3RoZXIgbmV3IG9iamVjdHMgd2lsbCBjb25zaXN0IG9mIG5ldyBpdGVtcykKKwltZW1jcHkoSU5PREVfUEtFWShpbm9kZSksICYoaWguaWhfa2V5KSwgS0VZX1NJWkUpOworCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpIHx8IFNfSVNESVIobW9kZSkgfHwgU19JU0xOSyhtb2RlKSkKKwkJc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKKwllbHNlCisJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNik7CisJaWYgKG9sZF9mb3JtYXRfb25seShzYikpCisJCXNldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlLCBTVEFUX0RBVEFfVjEpOworCWVsc2UKKwkJc2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUsIFNUQVRfREFUQV9WMik7CisKKwkvKiBpbnNlcnQgdGhlIHN0YXQgZGF0YSBpbnRvIHRoZSB0cmVlICovCiAjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotICAgIGlmICghdGgtPmRpc3BsYWNlX25ld19ibG9ja3MpCi0JUkVJU0VSRlNfSShkaXIpLT5uZXdfcGFja2luZ19sb2NhbGl0eSA9IDA7CisJaWYgKFJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkpCisJCXRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzID0gMTsKICNlbmRpZgotICAgIGlmIChTX0lTRElSKG1vZGUpKSB7Ci0JLyogaW5zZXJ0IGl0ZW0gd2l0aCAiLiIgYW5kICIuLiIgKi8KLQlyZXR2YWwgPSByZWlzZXJmc19uZXdfZGlyZWN0b3J5ICh0aCwgaW5vZGUsICZpaCwgJnBhdGhfdG9fa2V5LCBkaXIpOwotICAgIH0KKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgJnBhdGhfdG9fa2V5LCAma2V5LCAmaWgsIGlub2RlLAorCQkJCSAoY2hhciAqKSgmc2QpKTsKKwlpZiAocmV0dmFsKSB7CisJCWVyciA9IHJldHZhbDsKKwkJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpOworCQlnb3RvIG91dF9iYWRfaW5vZGU7CisJfQorI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKKwlpZiAoIXRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzKQorCQlSRUlTRVJGU19JKGRpciktPm5ld19wYWNraW5nX2xvY2FsaXR5ID0gMDsKKyNlbmRpZgorCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCS8qIGluc2VydCBpdGVtIHdpdGggIi4iIGFuZCAiLi4iICovCisJCXJldHZhbCA9CisJCSAgICByZWlzZXJmc19uZXdfZGlyZWN0b3J5KHRoLCBpbm9kZSwgJmloLCAmcGF0aF90b19rZXksIGRpcik7CisJfQogCi0gICAgaWYgKFNfSVNMTksobW9kZSkpIHsKLQkvKiBpbnNlcnQgYm9keSBvZiBzeW1saW5rICovCi0JaWYgKCFvbGRfZm9ybWF0X29ubHkgKHNiKSkKLQkgICAgaV9zaXplID0gUk9VTkRfVVAoaV9zaXplKTsKLQlyZXR2YWwgPSByZWlzZXJmc19uZXdfc3ltbGluayAodGgsIGlub2RlLCAmaWgsICZwYXRoX3RvX2tleSwgc3ltbmFtZSwgaV9zaXplKTsKLSAgICB9Ci0gICAgaWYgKHJldHZhbCkgewotCWVyciA9IHJldHZhbDsKLQlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2tleSkgOwotCWpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7Ci0JZ290byBvdXRfaW5zZXJ0ZWRfc2Q7Ci0gICAgfQorCWlmIChTX0lTTE5LKG1vZGUpKSB7CisJCS8qIGluc2VydCBib2R5IG9mIHN5bWxpbmsgKi8KKwkJaWYgKCFvbGRfZm9ybWF0X29ubHkoc2IpKQorCQkJaV9zaXplID0gUk9VTkRfVVAoaV9zaXplKTsKKwkJcmV0dmFsID0KKwkJICAgIHJlaXNlcmZzX25ld19zeW1saW5rKHRoLCBpbm9kZSwgJmloLCAmcGF0aF90b19rZXksIHN5bW5hbWUsCisJCQkJCSBpX3NpemUpOworCX0KKwlpZiAocmV0dmFsKSB7CisJCWVyciA9IHJldHZhbDsKKwkJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpOworCQlqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOworCQlnb3RvIG91dF9pbnNlcnRlZF9zZDsKKwl9CiAKLSAgICAvKiBYWFggQ0hFQ0sgVEhJUyAqLwotICAgIGlmIChyZWlzZXJmc19wb3NpeGFjbCAoaW5vZGUtPmlfc2IpKSB7Ci0gICAgICAgIHJldHZhbCA9IHJlaXNlcmZzX2luaGVyaXRfZGVmYXVsdF9hY2wgKGRpciwgZGVudHJ5LCBpbm9kZSk7Ci0gICAgICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgICAgIGVyciA9IHJldHZhbDsKLSAgICAgICAgICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KSA7Ci0gICAgICAgICAgICBqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOwotICAgICAgICAgICAgZ290byBvdXRfaW5zZXJ0ZWRfc2Q7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUE9TSVhBQ0wpIHsKLQlyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIkFDTHMgYXJlbid0IGVuYWJsZWQgaW4gdGhlIGZzLCAiCi0JCQkgICJidXQgdmZzIHRoaW5rcyB0aGV5IGFyZSEiKTsKLSAgICB9IGVsc2UgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkaXIpKSB7Ci0JcmVpc2VyZnNfbWFya19pbm9kZV9wcml2YXRlIChpbm9kZSk7Ci0gICAgfQorCS8qIFhYWCBDSEVDSyBUSElTICovCisJaWYgKHJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSkgeworCQlyZXR2YWwgPSByZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsKGRpciwgZGVudHJ5LCBpbm9kZSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWVyciA9IHJldHZhbDsKKwkJCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KTsKKwkJCWpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7CisJCQlnb3RvIG91dF9pbnNlcnRlZF9zZDsKKwkJfQorCX0gZWxzZSBpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19QT1NJWEFDTCkgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAiQUNMcyBhcmVuJ3QgZW5hYmxlZCBpbiB0aGUgZnMsICIKKwkJCQkgImJ1dCB2ZnMgdGhpbmtzIHRoZXkgYXJlISIpOworCX0gZWxzZSBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoZGlyKSkgeworCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoaW5vZGUpOworCX0KIAotICAgIGluc2VydF9pbm9kZV9oYXNoIChpbm9kZSk7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7Ci0gICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpIDsKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiAKIC8qIGl0IGxvb2tzIGxpa2UgeW91IGNhbiBlYXNpbHkgY29tcHJlc3MgdGhlc2UgdHdvIGdvdG8gdGFyZ2V0cyBpbnRvCiAgKiBvbmUuICBLZWVwaW5nIGl0IGxpa2UgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGh1cnQgYW55dGhpbmcsIGFuZCB0aGV5CiAgKiBhcmUgcGxhY2UgaG9sZGVycyBmb3Igd2hhdCB0aGUgcXVvdGEgY29kZSBhY3R1YWxseSBuZWVkcy4KICAqLwotb3V0X2JhZF9pbm9kZToKLSAgICAvKiBJbnZhbGlkYXRlIHRoZSBvYmplY3QsIG5vdGhpbmcgd2FzIGluc2VydGVkIHlldCAqLwotICAgIElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkID0gMDsKKyAgICAgIG91dF9iYWRfaW5vZGU6CisJLyogSW52YWxpZGF0ZSB0aGUgb2JqZWN0LCBub3RoaW5nIHdhcyBpbnNlcnRlZCB5ZXQgKi8KKwlJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZCA9IDA7CiAKLSAgICAvKiBRdW90YSBjaGFuZ2UgbXVzdCBiZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiBmb3Igam91cm5hbGluZyAqLwotICAgIERRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCS8qIFF1b3RhIGNoYW5nZSBtdXN0IGJlIGluc2lkZSBhIHRyYW5zYWN0aW9uIGZvciBqb3VybmFsaW5nICovCisJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CiAKLW91dF9lbmRfdHJhbnM6Ci0gICAgam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSA7Ci0gICAgLyogRHJvcCBjYW4gYmUgb3V0c2lkZSBhbmQgaXQgbmVlZHMgbW9yZSBjcmVkaXRzIHNvIGl0J3MgYmV0dGVyIHRvIGhhdmUgaXQgb3V0c2lkZSAqLwotICAgIERRVU9UX0RST1AoaW5vZGUpOwotICAgIGlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKLSAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSk7CisgICAgICBvdXRfZW5kX3RyYW5zOgorCWpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7CisJLyogRHJvcCBjYW4gYmUgb3V0c2lkZSBhbmQgaXQgbmVlZHMgbW9yZSBjcmVkaXRzIHNvIGl0J3MgYmV0dGVyIHRvIGhhdmUgaXQgb3V0c2lkZSAqLworCURRVU9UX0RST1AoaW5vZGUpOworCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKKwltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAKLW91dF9pbnNlcnRlZF9zZDoKLSAgICBpbm9kZS0+aV9ubGluayA9IDA7Ci0gICAgdGgtPnRfdHJhbnNfaWQgPSAwOyAvKiBzbyB0aGUgY2FsbGVyIGNhbid0IHVzZSB0aGlzIGhhbmRsZSBsYXRlciAqLwotICAgIGlwdXQoaW5vZGUpOwotICAgIHJldHVybiBlcnI7CisgICAgICBvdXRfaW5zZXJ0ZWRfc2Q6CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCXRoLT50X3RyYW5zX2lkID0gMDsJLyogc28gdGhlIGNhbGxlciBjYW4ndCB1c2UgdGhpcyBoYW5kbGUgbGF0ZXIgKi8KKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtMTkwMCw3NyArMTk5Nyw3OCBAQAogKioKICoqIG9uIGZhaWx1cmUsIG5vbnplcm8gaXMgcmV0dXJuZWQsIHBhZ2VfcmVzdWx0IGFuZCBiaF9yZXN1bHQgYXJlIHVudG91Y2hlZC4KICovCi1zdGF0aWMgaW50IGdyYWJfdGFpbF9wYWdlKHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLCAKLQkJCSAgc3RydWN0IHBhZ2UgKipwYWdlX3Jlc3VsdCwgCi0JCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoX3Jlc3VsdCkgeworc3RhdGljIGludCBncmFiX3RhaWxfcGFnZShzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwKKwkJCSAgc3RydWN0IHBhZ2UgKipwYWdlX3Jlc3VsdCwKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhfcmVzdWx0KQorewogCi0gICAgLyogd2Ugd2FudCB0aGUgcGFnZSB3aXRoIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGZpbGUsCi0gICAgKiogbm90IHRoZSBwYWdlIHRoYXQgd2lsbCBob2xkIHRoZSBuZXh0IGJ5dGUgZm9yIGFwcGVuZGluZwotICAgICovCi0gICAgdW5zaWduZWQgbG9uZyBpbmRleCA9IChwX3NfaW5vZGUtPmlfc2l6ZS0xKSA+PiBQQUdFX0NBQ0hFX1NISUZUIDsKLSAgICB1bnNpZ25lZCBsb25nIHBvcyA9IDAgOwotICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAwIDsKLSAgICB1bnNpZ25lZCBsb25nIGJsb2Nrc2l6ZSA9IHBfc19pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgOwotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHBfc19pbm9kZS0+aV9zaXplKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkIDsKLSAgICBzdHJ1Y3QgcGFnZSAqIHBhZ2UgOwotICAgIGludCBlcnJvciA7Ci0gICAgCi0gICAgLyogd2Uga25vdyB0aGF0IHdlIGFyZSBvbmx5IGNhbGxlZCB3aXRoIGlub2RlLT5pX3NpemUgPiAwLgotICAgICoqIHdlIGFsc28ga25vdyB0aGF0IGEgZmlsZSB0YWlsIGNhbiBuZXZlciBiZSBhcyBiaWcgYXMgYSBibG9jawotICAgICoqIElmIGlfc2l6ZSAlIGJsb2Nrc2l6ZSA9PSAwLCBvdXIgZmlsZSBpcyBjdXJyZW50bHkgYmxvY2sgYWxpZ25lZAotICAgICoqIGFuZCBpdCB3b24ndCBuZWVkIGNvbnZlcnRpbmcgb3IgemVyb2luZyBhZnRlciBhIHRydW5jYXRlLgotICAgICovCi0gICAgaWYgKChvZmZzZXQgJiAoYmxvY2tzaXplIC0gMSkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQgOwotICAgIH0KLSAgICBwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKHBfc19pbm9kZS0+aV9tYXBwaW5nLCBpbmRleCkgOwotICAgIGVycm9yID0gLUVOT01FTSA7Ci0gICAgaWYgKCFwYWdlKSB7Ci0gICAgICAgIGdvdG8gb3V0IDsKLSAgICB9Ci0gICAgLyogc3RhcnQgd2l0aGluIHRoZSBwYWdlIG9mIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBmaWxlICovCi0gICAgc3RhcnQgPSAob2Zmc2V0IC8gYmxvY2tzaXplKSAqIGJsb2Nrc2l6ZSA7CisJLyogd2Ugd2FudCB0aGUgcGFnZSB3aXRoIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGZpbGUsCisJICoqIG5vdCB0aGUgcGFnZSB0aGF0IHdpbGwgaG9sZCB0aGUgbmV4dCBieXRlIGZvciBhcHBlbmRpbmcKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gKHBfc19pbm9kZS0+aV9zaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHBvcyA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IDA7CisJdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHBfc19pbm9kZS0+aV9zaXplKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgZXJyb3I7CiAKLSAgICBlcnJvciA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgc3RhcnQsIG9mZnNldCwgCi0JCQkJcmVpc2VyZnNfZ2V0X2Jsb2NrX2NyZWF0ZV8wKSA7Ci0gICAgaWYgKGVycm9yKQotCWdvdG8gdW5sb2NrIDsKLQotICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOyAgICAgIAotICAgIGJoID0gaGVhZDsKLSAgICBkbyB7Ci0JaWYgKHBvcyA+PSBzdGFydCkgewotCSAgICBicmVhayA7CisJLyogd2Uga25vdyB0aGF0IHdlIGFyZSBvbmx5IGNhbGxlZCB3aXRoIGlub2RlLT5pX3NpemUgPiAwLgorCSAqKiB3ZSBhbHNvIGtub3cgdGhhdCBhIGZpbGUgdGFpbCBjYW4gbmV2ZXIgYmUgYXMgYmlnIGFzIGEgYmxvY2sKKwkgKiogSWYgaV9zaXplICUgYmxvY2tzaXplID09IDAsIG91ciBmaWxlIGlzIGN1cnJlbnRseSBibG9jayBhbGlnbmVkCisJICoqIGFuZCBpdCB3b24ndCBuZWVkIGNvbnZlcnRpbmcgb3IgemVyb2luZyBhZnRlciBhIHRydW5jYXRlLgorCSAqLworCWlmICgob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKSA9PSAwKSB7CisJCXJldHVybiAtRU5PRU5UOwogCX0KLQliaCA9IGJoLT5iX3RoaXNfcGFnZSA7Ci0JcG9zICs9IGJsb2Nrc2l6ZSA7Ci0gICAgfSB3aGlsZShiaCAhPSBoZWFkKSA7CisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShwX3NfaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOworCWVycm9yID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpIHsKKwkJZ290byBvdXQ7CisJfQorCS8qIHN0YXJ0IHdpdGhpbiB0aGUgcGFnZSBvZiB0aGUgbGFzdCBibG9jayBpbiB0aGUgZmlsZSAqLworCXN0YXJ0ID0gKG9mZnNldCAvIGJsb2Nrc2l6ZSkgKiBibG9ja3NpemU7CiAKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkvKiBub3RlLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIHByZXBhcmVfd3JpdGUgc2hvdWxkCi0JKiogYmUgdGFraW5nIGNhcmUgb2YgdGhpcyBmb3IgdXMuICBJZiB0aGUgYnVmZmVyIGlzbid0IHVwIHRvIGRhdGUsCi0JKiogSSd2ZSBzY3Jld2VkIHVwIHRoZSBjb2RlIHRvIGZpbmQgdGhlIGJ1ZmZlciwgb3IgdGhlIGNvZGUgdG8KLQkqKiBjYWxsIHByZXBhcmVfd3JpdGUKLQkqLwotCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwKLQkJCSAgImNsbS02MDAwOiBlcnJvciByZWFkaW5nIGJsb2NrICVsdSBvbiBkZXYgJXMiLAotCQkJICBiaC0+Yl9ibG9ja25yLAotCQkJICByZWlzZXJmc19iZGV2bmFtZSAocF9zX2lub2RlLT5pX3NiKSkgOwotCWVycm9yID0gLUVJTyA7Ci0JZ290byB1bmxvY2sgOwotICAgIH0KLSAgICAqYmhfcmVzdWx0ID0gYmggOwotICAgICpwYWdlX3Jlc3VsdCA9IHBhZ2UgOworCWVycm9yID0gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCBzdGFydCwgb2Zmc2V0LAorCQkJCSAgICByZWlzZXJmc19nZXRfYmxvY2tfY3JlYXRlXzApOworCWlmIChlcnJvcikKKwkJZ290byB1bmxvY2s7CiAKLW91dDoKLSAgICByZXR1cm4gZXJyb3IgOworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJaWYgKHBvcyA+PSBzdGFydCkgeworCQkJYnJlYWs7CisJCX0KKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCXBvcyArPSBibG9ja3NpemU7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CiAKLXVubG9jazoKLSAgICB1bmxvY2tfcGFnZShwYWdlKSA7Ci0gICAgcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpIDsKLSAgICByZXR1cm4gZXJyb3IgOworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkvKiBub3RlLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIHByZXBhcmVfd3JpdGUgc2hvdWxkCisJCSAqKiBiZSB0YWtpbmcgY2FyZSBvZiB0aGlzIGZvciB1cy4gIElmIHRoZSBidWZmZXIgaXNuJ3QgdXAgdG8gZGF0ZSwKKwkJICoqIEkndmUgc2NyZXdlZCB1cCB0aGUgY29kZSB0byBmaW5kIHRoZSBidWZmZXIsIG9yIHRoZSBjb2RlIHRvCisJCSAqKiBjYWxsIHByZXBhcmVfd3JpdGUKKwkJICovCisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX2lub2RlLT5pX3NiLAorCQkJCSAiY2xtLTYwMDA6IGVycm9yIHJlYWRpbmcgYmxvY2sgJWx1IG9uIGRldiAlcyIsCisJCQkJIGJoLT5iX2Jsb2NrbnIsCisJCQkJIHJlaXNlcmZzX2JkZXZuYW1lKHBfc19pbm9kZS0+aV9zYikpOworCQllcnJvciA9IC1FSU87CisJCWdvdG8gdW5sb2NrOworCX0KKwkqYmhfcmVzdWx0ID0gYmg7CisJKnBhZ2VfcmVzdWx0ID0gcGFnZTsKKworICAgICAgb3V0OgorCXJldHVybiBlcnJvcjsKKworICAgICAgdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC0xOTc5LDIzNSArMjA3NywyNDcgQEAKICoqCiAqKiBzb21lIGNvZGUgdGFrZW4gZnJvbSBibG9ja190cnVuY2F0ZV9wYWdlCiAqLwotaW50IHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoc3RydWN0IGlub2RlICpwX3NfaW5vZGUsIGludCB1cGRhdGVfdGltZXN0YW1wcykgewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIC8qIHdlIHdhbnQgdGhlIG9mZnNldCBmb3IgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcF9zX2lub2RlLT5pX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOwotICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZSA9IHBfc19pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgOwotICAgIHVuc2lnbmVkIGxlbmd0aCA7Ci0gICAgc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMIDsKLSAgICBpbnQgZXJyb3IgOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMIDsKK2ludCByZWlzZXJmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLCBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwkvKiB3ZSB3YW50IHRoZSBvZmZzZXQgZm9yIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBfc19pbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IHBfc19pbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJdW5zaWduZWQgbGVuZ3RoOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKHBfc19pbm9kZS0+aV9zYik7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhwX3NfaW5vZGUtPmlfc2IpOwogCi0gICAgaWYgKHBfc19pbm9kZS0+aV9zaXplID4gMCkgewotICAgICAgICBpZiAoKGVycm9yID0gZ3JhYl90YWlsX3BhZ2UocF9zX2lub2RlLCAmcGFnZSwgJmJoKSkpIHsKLQkgICAgLy8gLUVOT0VOVCBtZWFucyB3ZSB0cnVuY2F0ZWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCAKLQkgICAgLy8gYW5kIGdldF9ibG9ja19jcmVhdGVfMCBjb3VsZCBub3QgZmluZCBhIGJsb2NrIHRvIHJlYWQgaW4sCi0JICAgIC8vIHdoaWNoIGlzIG9rLgotCSAgICBpZiAoZXJyb3IgIT0gLUVOT0VOVCkKLQkgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwKLQkJCQkgICJjbG0tNjAwMTogZ3JhYl90YWlsX3BhZ2UgZmFpbGVkICVkIiwKLQkJCQkgIGVycm9yKTsKLQkgICAgcGFnZSA9IE5VTEwgOwotCSAgICBiaCA9IE5VTEwgOworCWlmIChwX3NfaW5vZGUtPmlfc2l6ZSA+IDApIHsKKwkJaWYgKChlcnJvciA9IGdyYWJfdGFpbF9wYWdlKHBfc19pbm9kZSwgJnBhZ2UsICZiaCkpKSB7CisJCQkvLyAtRU5PRU5UIG1lYW5zIHdlIHRydW5jYXRlZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIAorCQkJLy8gYW5kIGdldF9ibG9ja19jcmVhdGVfMCBjb3VsZCBub3QgZmluZCBhIGJsb2NrIHRvIHJlYWQgaW4sCisJCQkvLyB3aGljaCBpcyBvay4KKwkJCWlmIChlcnJvciAhPSAtRU5PRU5UKQorCQkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX2lub2RlLT5pX3NiLAorCQkJCQkJICJjbG0tNjAwMTogZ3JhYl90YWlsX3BhZ2UgZmFpbGVkICVkIiwKKwkJCQkJCSBlcnJvcik7CisJCQlwYWdlID0gTlVMTDsKKwkJCWJoID0gTlVMTDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBzbywgaWYgcGFnZSAhPSBOVUxMLCB3ZSBoYXZlIGEgYnVmZmVyIGhlYWQgZm9yIHRoZSBvZmZzZXQgYXQgCi0gICAgKiogdGhlIGVuZCBvZiB0aGUgZmlsZS4gaWYgdGhlIGJoIGlzIG1hcHBlZCwgYW5kIGJoLT5iX2Jsb2NrbnIgIT0gMCwgCi0gICAgKiogdGhlbiB3ZSBoYXZlIGFuIHVuZm9ybWF0dGVkIG5vZGUuICBPdGhlcndpc2UsIHdlIGhhdmUgYSBkaXJlY3QgaXRlbSwgCi0gICAgKiogYW5kIG5vIHplcm9pbmcgaXMgcmVxdWlyZWQgb24gZGlzay4gIFdlIHplcm8gYWZ0ZXIgdGhlIHRydW5jYXRlLCAKLSAgICAqKiBiZWNhdXNlIHRoZSB0cnVuY2F0ZSBtaWdodCBwYWNrIHRoZSBpdGVtIGFueXdheSAKLSAgICAqKiAoaXQgd2lsbCB1bm1hcCBiaCBpZiBpdCBwYWNrcykuCi0gICAgKi8KLSAgICAvKiBpdCBpcyBlbm91Z2ggdG8gcmVzZXJ2ZSBzcGFjZSBpbiB0cmFuc2FjdGlvbiBmb3IgMiBiYWxhbmNpbmdzOgotICAgICAgIG9uZSBmb3IgInNhdmUiIGxpbmsgYWRkaW5nIGFuZCBhbm90aGVyIGZvciB0aGUgZmlyc3QKLSAgICAgICBjdXRfZnJvbV9pdGVtLiAxIGlzIGZvciB1cGRhdGVfc2QgKi8KLSAgICBlcnJvciA9IGpvdXJuYWxfYmVnaW4gKCZ0aCwgcF9zX2lub2RlLT5pX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMSk7Ci0gICAgaWYgKGVycm9yKQotICAgICAgICBnb3RvIG91dDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ocF9zX2lub2RlKSA7Ci0gICAgaWYgKHVwZGF0ZV90aW1lc3RhbXBzKQotCSAgICAvKiB3ZSBhcmUgZG9pbmcgcmVhbCB0cnVuY2F0ZTogaWYgdGhlIHN5c3RlbSBjcmFzaGVzIGJlZm9yZSB0aGUgbGFzdAotCSAgICAgICB0cmFuc2FjdGlvbiBvZiB0cnVuY2F0aW5nIGdldHMgY29tbWl0dGVkIC0gb24gcmVib290IHRoZSBmaWxlCi0JICAgICAgIGVpdGhlciBhcHBlYXJzIHRydW5jYXRlZCBwcm9wZXJseSBvciBub3QgdHJ1bmNhdGVkIGF0IGFsbCAqLwotCWFkZF9zYXZlX2xpbmsgKCZ0aCwgcF9zX2lub2RlLCAxKTsKLSAgICBlcnJvciA9IHJlaXNlcmZzX2RvX3RydW5jYXRlICgmdGgsIHBfc19pbm9kZSwgcGFnZSwgdXBkYXRlX3RpbWVzdGFtcHMpIDsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIGdvdG8gb3V0OwotICAgIGVycm9yID0gam91cm5hbF9lbmQgKCZ0aCwgcF9zX2lub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAxKTsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIGdvdG8gb3V0OworCS8qIHNvLCBpZiBwYWdlICE9IE5VTEwsIHdlIGhhdmUgYSBidWZmZXIgaGVhZCBmb3IgdGhlIG9mZnNldCBhdCAKKwkgKiogdGhlIGVuZCBvZiB0aGUgZmlsZS4gaWYgdGhlIGJoIGlzIG1hcHBlZCwgYW5kIGJoLT5iX2Jsb2NrbnIgIT0gMCwgCisJICoqIHRoZW4gd2UgaGF2ZSBhbiB1bmZvcm1hdHRlZCBub2RlLiAgT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgZGlyZWN0IGl0ZW0sIAorCSAqKiBhbmQgbm8gemVyb2luZyBpcyByZXF1aXJlZCBvbiBkaXNrLiAgV2UgemVybyBhZnRlciB0aGUgdHJ1bmNhdGUsIAorCSAqKiBiZWNhdXNlIHRoZSB0cnVuY2F0ZSBtaWdodCBwYWNrIHRoZSBpdGVtIGFueXdheSAKKwkgKiogKGl0IHdpbGwgdW5tYXAgYmggaWYgaXQgcGFja3MpLgorCSAqLworCS8qIGl0IGlzIGVub3VnaCB0byByZXNlcnZlIHNwYWNlIGluIHRyYW5zYWN0aW9uIGZvciAyIGJhbGFuY2luZ3M6CisJICAgb25lIGZvciAic2F2ZSIgbGluayBhZGRpbmcgYW5kIGFub3RoZXIgZm9yIHRoZSBmaXJzdAorCSAgIGN1dF9mcm9tX2l0ZW0uIDEgaXMgZm9yIHVwZGF0ZV9zZCAqLworCWVycm9yID0gam91cm5hbF9iZWdpbigmdGgsIHBfc19pbm9kZS0+aV9zYiwKKwkJCSAgICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDEpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHBfc19pbm9kZSk7CisJaWYgKHVwZGF0ZV90aW1lc3RhbXBzKQorCQkvKiB3ZSBhcmUgZG9pbmcgcmVhbCB0cnVuY2F0ZTogaWYgdGhlIHN5c3RlbSBjcmFzaGVzIGJlZm9yZSB0aGUgbGFzdAorCQkgICB0cmFuc2FjdGlvbiBvZiB0cnVuY2F0aW5nIGdldHMgY29tbWl0dGVkIC0gb24gcmVib290IHRoZSBmaWxlCisJCSAgIGVpdGhlciBhcHBlYXJzIHRydW5jYXRlZCBwcm9wZXJseSBvciBub3QgdHJ1bmNhdGVkIGF0IGFsbCAqLworCQlhZGRfc2F2ZV9saW5rKCZ0aCwgcF9zX2lub2RlLCAxKTsKKwllcnJvciA9IHJlaXNlcmZzX2RvX3RydW5jYXRlKCZ0aCwgcF9zX2lub2RlLCBwYWdlLCB1cGRhdGVfdGltZXN0YW1wcyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwllcnJvciA9CisJICAgIGpvdXJuYWxfZW5kKCZ0aCwgcF9zX2lub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAxKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OwogCi0gICAgaWYgKHVwZGF0ZV90aW1lc3RhbXBzKSB7Ci0JZXJyb3IgPSByZW1vdmVfc2F2ZV9saW5rIChwX3NfaW5vZGUsIDEvKiB0cnVuY2F0ZSAqLyk7Ci0gICAgICAgIGlmIChlcnJvcikKLSAgICAgICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIGlmIChwYWdlKSB7Ci0gICAgICAgIGxlbmd0aCA9IG9mZnNldCAmIChibG9ja3NpemUgLSAxKSA7Ci0JLyogaWYgd2UgYXJlIG5vdCBvbiBhIGJsb2NrIGJvdW5kYXJ5ICovCi0JaWYgKGxlbmd0aCkgewotCSAgICBjaGFyICprYWRkcjsKLQotCSAgICBsZW5ndGggPSBibG9ja3NpemUgLSBsZW5ndGggOwotCSAgICBrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKSA7Ci0JICAgIG1lbXNldChrYWRkciArIG9mZnNldCwgMCwgbGVuZ3RoKSA7ICAgCi0JICAgIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpIDsKLQkgICAga3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApIDsKLQkgICAgaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgIT0gMCkgewotCSAgICAgICAgbWFya19idWZmZXJfZGlydHkoYmgpIDsKLQkgICAgfQorCWlmICh1cGRhdGVfdGltZXN0YW1wcykgeworCQllcnJvciA9IHJlbW92ZV9zYXZlX2xpbmsocF9zX2lub2RlLCAxIC8qIHRydW5jYXRlICovICk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OwogCX0KLQl1bmxvY2tfcGFnZShwYWdlKSA7Ci0JcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpIDsKLSAgICB9CiAKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2socF9zX2lub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gMDsKLW91dDoKLSAgICBpZiAocGFnZSkgewotICAgICAgICB1bmxvY2tfcGFnZSAocGFnZSk7Ci0gICAgICAgIHBhZ2VfY2FjaGVfcmVsZWFzZSAocGFnZSk7Ci0gICAgfQotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhwX3NfaW5vZGUtPmlfc2IpOwotICAgIHJldHVybiBlcnJvcjsKKwlpZiAocGFnZSkgeworCQlsZW5ndGggPSBvZmZzZXQgJiAoYmxvY2tzaXplIC0gMSk7CisJCS8qIGlmIHdlIGFyZSBub3Qgb24gYSBibG9jayBib3VuZGFyeSAqLworCQlpZiAobGVuZ3RoKSB7CisJCQljaGFyICprYWRkcjsKKworCQkJbGVuZ3RoID0gYmxvY2tzaXplIC0gbGVuZ3RoOworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIGxlbmd0aCk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yICE9IDApIHsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQl9CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisKKwlyZWlzZXJmc193cml0ZV91bmxvY2socF9zX2lub2RlLT5pX3NiKTsKKwlyZXR1cm4gMDsKKyAgICAgIG91dDoKKwlpZiAocGFnZSkgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlyZWlzZXJmc193cml0ZV91bmxvY2socF9zX2lub2RlLT5pX3NiKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgCi0JCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2spIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICBpbnQgZnNfZ2VuIDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkIHRtcF9paCA7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqaWggOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICAgIF9fbGUzMiAqaXRlbSA7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5IDsKLSAgICBJTklUSUFMSVpFX1BBVEgocGF0aCkgOwotICAgIGludCBwb3NfaW5faXRlbSA7Ci0gICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UIDsKLSAgICBsb2ZmX3QgYnl0ZV9vZmZzZXQgPSAoYmxvY2sgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMSA7Ci0gICAgaW50IHJldHZhbCA7Ci0gICAgaW50IHVzZV9nZXRfYmxvY2sgPSAwIDsKLSAgICBpbnQgYnl0ZXNfY29waWVkID0gMCA7Ci0gICAgaW50IGNvcHlfc2l6ZSA7Ci0gICAgaW50IHRyYW5zX3J1bm5pbmcgPSAwOworc3RhdGljIGludCBtYXBfYmxvY2tfZm9yX3dyaXRlcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYmxvY2spCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgZnNfZ2VuOworCXN0cnVjdCBpdGVtX2hlYWQgdG1wX2loOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJX19sZTMyICppdGVtOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJaW50IHBvc19pbl9pdGVtOworCWludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVDsKKwlsb2ZmX3QgYnl0ZV9vZmZzZXQgPSAoYmxvY2sgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMTsKKwlpbnQgcmV0dmFsOworCWludCB1c2VfZ2V0X2Jsb2NrID0gMDsKKwlpbnQgYnl0ZXNfY29waWVkID0gMDsKKwlpbnQgY29weV9zaXplOworCWludCB0cmFuc19ydW5uaW5nID0gMDsKIAotICAgIC8qIGNhdGNoIHBsYWNlcyBiZWxvdyB0aGF0IHRyeSB0byBsb2cgc29tZXRoaW5nIHdpdGhvdXQgc3RhcnRpbmcgYSB0cmFucyAqLwotICAgIHRoLnRfdHJhbnNfaWQgPSAwOworCS8qIGNhdGNoIHBsYWNlcyBiZWxvdyB0aGF0IHRyeSB0byBsb2cgc29tZXRoaW5nIHdpdGhvdXQgc3RhcnRpbmcgYSB0cmFucyAqLworCXRoLnRfdHJhbnNfaWQgPSAwOwogCi0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhfcmVzdWx0KSkgewotCXJldHVybiAtRUlPOwotICAgIH0KLQotICAgIGttYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLXN0YXJ0X292ZXI6Ci0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLCBieXRlX29mZnNldCwgVFlQRV9BTlksIDMpIDsKLQotcmVzZWFyY2g6Ci0gICAgcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKSA7Ci0gICAgaWYgKHJldHZhbCAhPSBQT1NJVElPTl9GT1VORCkgewotICAgICAgICB1c2VfZ2V0X2Jsb2NrID0gMTsKLQlnb3RvIG91dCA7Ci0gICAgfSAKLQotICAgIGJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpIDsKLSAgICBpaCA9IGdldF9paCgmcGF0aCkgOwotICAgIGl0ZW0gPSBnZXRfaXRlbSgmcGF0aCkgOwotICAgIHBvc19pbl9pdGVtID0gcGF0aC5wb3NfaW5faXRlbSA7Ci0KLSAgICAvKiB3ZSd2ZSBmb3VuZCBhbiB1bmZvcm1hdHRlZCBub2RlICovCi0gICAgaWYgKGluZGlyZWN0X2l0ZW1fZm91bmQocmV0dmFsLCBpaCkpIHsKLQlpZiAoYnl0ZXNfY29waWVkID4gMCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgImNsbS02MDAyOiBieXRlc19jb3BpZWQgJWQiLAotCQkJICAgICAgYnl0ZXNfY29waWVkKSA7Ci0JfQotICAgICAgICBpZiAoIWdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pKSB7Ci0JICAgIC8qIGNyYXAsIHdlIGFyZSB3cml0aW5nIHRvIGEgaG9sZSAqLwotCSAgICB1c2VfZ2V0X2Jsb2NrID0gMTsKLQkgICAgZ290byBvdXQgOwotCX0KLQlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsIGdldF9ibG9ja19udW0oaXRlbSxwb3NfaW5faXRlbSksaW5vZGUpOwotICAgIH0gZWxzZSBpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkgewotICAgICAgICBjaGFyICpwIDsgCi0gICAgICAgIHAgPSBwYWdlX2FkZHJlc3MoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLSAgICAgICAgcCArPSAoYnl0ZV9vZmZzZXQgLTEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKLSAgICAgICAgY29weV9zaXplID0gaWhfaXRlbV9sZW4oaWgpIC0gcG9zX2luX2l0ZW07Ci0KLQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYikgOwotCWNvcHlfaXRlbV9oZWFkKCZ0bXBfaWgsIGloKSA7Ci0KLQlpZiAoIXRyYW5zX3J1bm5pbmcpIHsKLQkgICAgLyogdnMtMzA1MCBpcyBnb25lLCBubyBuZWVkIHRvIGRyb3AgdGhlIHBhdGggKi8KLQkgICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0JICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotCSAgICB0cmFuc19ydW5uaW5nID0gMTsKLQkgICAgaWYgKGZzX2NoYW5nZWQoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKLQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKSA7Ci0JCWdvdG8gcmVzZWFyY2g7Ci0JICAgIH0KKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpKSB7CisJCXJldHVybiAtRUlPOwogCX0KIAotCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKSA7CisJa21hcChiaF9yZXN1bHQtPmJfcGFnZSk7CisgICAgICBzdGFydF9vdmVyOgorCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgYnl0ZV9vZmZzZXQsIFRZUEVfQU5ZLCAzKTsKIAotCWlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aCkpIHsKLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKSA7Ci0JICAgIGdvdG8gcmVzZWFyY2g7CisgICAgICByZXNlYXJjaDoKKwlyZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCWlmIChyZXR2YWwgIT0gUE9TSVRJT05fRk9VTkQpIHsKKwkJdXNlX2dldF9ibG9jayA9IDE7CisJCWdvdG8gb3V0OwogCX0KIAotCW1lbWNweSggQl9JX1BJVEVNKGJoLCBpaCkgKyBwb3NfaW5faXRlbSwgcCArIGJ5dGVzX2NvcGllZCwgY29weV9zaXplKSA7CisJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJaWggPSBnZXRfaWgoJnBhdGgpOworCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOwogCi0Jam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgaW5vZGUtPmlfc2IsIGJoKSA7Ci0JYnl0ZXNfY29waWVkICs9IGNvcHlfc2l6ZSA7Ci0Jc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LCAwLCBpbm9kZSk7CisJLyogd2UndmUgZm91bmQgYW4gdW5mb3JtYXR0ZWQgbm9kZSAqLworCWlmIChpbmRpcmVjdF9pdGVtX2ZvdW5kKHJldHZhbCwgaWgpKSB7CisJCWlmIChieXRlc19jb3BpZWQgPiAwKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCQkgImNsbS02MDAyOiBieXRlc19jb3BpZWQgJWQiLAorCQkJCQkgYnl0ZXNfY29waWVkKTsKKwkJfQorCQlpZiAoIWdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pKSB7CisJCQkvKiBjcmFwLCB3ZSBhcmUgd3JpdGluZyB0byBhIGhvbGUgKi8KKwkJCXVzZV9nZXRfYmxvY2sgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LAorCQkJCSAgICAgZ2V0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSksIGlub2RlKTsKKwl9IGVsc2UgaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpIHsKKwkJY2hhciAqcDsKKwkJcCA9IHBhZ2VfYWRkcmVzcyhiaF9yZXN1bHQtPmJfcGFnZSk7CisJCXAgKz0gKGJ5dGVfb2Zmc2V0IC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCWNvcHlfc2l6ZSA9IGloX2l0ZW1fbGVuKGloKSAtIHBvc19pbl9pdGVtOwogCi0JLyogYXJlIHRoZXJlIHN0aWxsIGJ5dGVzIGxlZnQ/ICovCi0gICAgICAgIGlmIChieXRlc19jb3BpZWQgPCBiaF9yZXN1bHQtPmJfc2l6ZSAmJiAKLQkgICAgKGJ5dGVfb2Zmc2V0ICsgYnl0ZXNfY29waWVkKSA8IGlub2RlLT5pX3NpemUpIHsKLQkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoJmtleSwgY3B1X2tleV9rX29mZnNldCgma2V5KSArIGNvcHlfc2l6ZSkgOwotCSAgICBnb3RvIHJlc2VhcmNoIDsKKwkJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpOworCQljb3B5X2l0ZW1faGVhZCgmdG1wX2loLCBpaCk7CisKKwkJaWYgKCF0cmFuc19ydW5uaW5nKSB7CisJCQkvKiB2cy0zMDUwIGlzIGdvbmUsIG5vIG5lZWQgdG8gZHJvcCB0aGUgcGF0aCAqLworCQkJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIG91dDsKKwkJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJCQl0cmFuc19ydW5uaW5nID0gMTsKKwkJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCQkgICAgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihpbm9kZS0+aV9zYiwKKwkJCQkJCQkJIGJoKTsKKwkJCQlnb3RvIHJlc2VhcmNoOworCQkJfQorCQl9CisKKwkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChpbm9kZS0+aV9zYiwgYmgsIDEpOworCisJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCSAgICAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKTsKKwkJCWdvdG8gcmVzZWFyY2g7CisJCX0KKworCQltZW1jcHkoQl9JX1BJVEVNKGJoLCBpaCkgKyBwb3NfaW5faXRlbSwgcCArIGJ5dGVzX2NvcGllZCwKKwkJICAgICAgIGNvcHlfc2l6ZSk7CisKKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgaW5vZGUtPmlfc2IsIGJoKTsKKwkJYnl0ZXNfY29waWVkICs9IGNvcHlfc2l6ZTsKKwkJc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LCAwLCBpbm9kZSk7CisKKwkJLyogYXJlIHRoZXJlIHN0aWxsIGJ5dGVzIGxlZnQ/ICovCisJCWlmIChieXRlc19jb3BpZWQgPCBiaF9yZXN1bHQtPmJfc2l6ZSAmJgorCQkgICAgKGJ5dGVfb2Zmc2V0ICsgYnl0ZXNfY29waWVkKSA8IGlub2RlLT5pX3NpemUpIHsKKwkJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksCisJCQkJCSAgICAgY3B1X2tleV9rX29mZnNldCgma2V5KSArCisJCQkJCSAgICAgY29weV9zaXplKTsKKwkJCWdvdG8gcmVzZWFyY2g7CisJCX0KKwl9IGVsc2UgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAiY2xtLTYwMDM6IGJhZCBpdGVtIGlub2RlICVsdSwgZGV2aWNlICVzIiwKKwkJCQkgaW5vZGUtPmlfaW5vLCByZWlzZXJmc19iZGV2bmFtZShpbm9kZS0+aV9zYikpOworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIG91dDsKIAl9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0JCQkgICJjbG0tNjAwMzogYmFkIGl0ZW0gaW5vZGUgJWx1LCBkZXZpY2UgJXMiLAotCQkJICBpbm9kZS0+aV9pbm8sIHJlaXNlcmZzX2JkZXZuYW1lIChpbm9kZS0+aV9zYikpIDsKLSAgICAgICAgcmV0dmFsID0gLUVJTyA7Ci0JZ290byBvdXQgOwotICAgIH0KLSAgICByZXR2YWwgPSAwIDsKLSAgICAKLW91dDoKLSAgICBwYXRocmVsc2UoJnBhdGgpIDsKLSAgICBpZiAodHJhbnNfcnVubmluZykgewotICAgICAgICBpbnQgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICByZXR2YWwgPSBlcnI7Ci0JdHJhbnNfcnVubmluZyA9IDA7Ci0gICAgfQotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dmFsID0gMDsKIAotICAgIC8qIHRoaXMgaXMgd2hlcmUgd2UgZmlsbCBpbiBob2xlcyBpbiB0aGUgZmlsZS4gKi8KLSAgICBpZiAodXNlX2dldF9ibG9jaykgewotCXJldHZhbCA9IHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9CTE9DS19DUkVBVEUgfCBHRVRfQkxPQ0tfTk9fSVNFTSB8Ci0JCQkJICAgIEdFVF9CTE9DS19OT19EQU5HTEUpOwotCWlmICghcmV0dmFsKSB7Ci0JICAgIGlmICghYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpIHx8IGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKLQkgICAgICAgIC8qIGdldF9ibG9jayBmYWlsZWQgdG8gZmluZCBhIG1hcHBlZCB1bmZvcm1hdHRlZCBub2RlLiAqLwotCQl1c2VfZ2V0X2Jsb2NrID0gMCA7Ci0JCWdvdG8gc3RhcnRfb3ZlciA7Ci0JICAgIH0KKyAgICAgIG91dDoKKwlwYXRocmVsc2UoJnBhdGgpOworCWlmICh0cmFuc19ydW5uaW5nKSB7CisJCWludCBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQlpZiAoZXJyKQorCQkJcmV0dmFsID0gZXJyOworCQl0cmFuc19ydW5uaW5nID0gMDsKIAl9Ci0gICAgfQotICAgIGt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSkgOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiAKLSAgICBpZiAoIXJldHZhbCAmJiBidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgJiYgYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkgewotCS8qIHdlJ3ZlIGNvcGllZCBkYXRhIGZyb20gdGhlIHBhZ2UgaW50byB0aGUgZGlyZWN0IGl0ZW0sIHNvIHRoZQotCSAqIGJ1ZmZlciBpbiB0aGUgcGFnZSBpcyBub3cgY2xlYW4sIG1hcmsgaXQgdG8gcmVmbGVjdCB0aGF0LgotCSAqLwotICAgICAgICBsb2NrX2J1ZmZlcihiaF9yZXN1bHQpOwotCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaF9yZXN1bHQpOwotCXVubG9ja19idWZmZXIoYmhfcmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldHZhbCA7CisJLyogdGhpcyBpcyB3aGVyZSB3ZSBmaWxsIGluIGhvbGVzIGluIHRoZSBmaWxlLiAqLworCWlmICh1c2VfZ2V0X2Jsb2NrKSB7CisJCXJldHZhbCA9IHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwKKwkJCQkJICAgIEdFVF9CTE9DS19DUkVBVEUgfCBHRVRfQkxPQ0tfTk9fSVNFTQorCQkJCQkgICAgfCBHRVRfQkxPQ0tfTk9fREFOR0xFKTsKKwkJaWYgKCFyZXR2YWwpIHsKKwkJCWlmICghYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpCisJCQkgICAgfHwgYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkgeworCQkJCS8qIGdldF9ibG9jayBmYWlsZWQgdG8gZmluZCBhIG1hcHBlZCB1bmZvcm1hdHRlZCBub2RlLiAqLworCQkJCXVzZV9nZXRfYmxvY2sgPSAwOworCQkJCWdvdG8gc3RhcnRfb3ZlcjsKKwkJCX0KKwkJfQorCX0KKwlrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOworCisJaWYgKCFyZXR2YWwgJiYgYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpICYmIGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKKwkJLyogd2UndmUgY29waWVkIGRhdGEgZnJvbSB0aGUgcGFnZSBpbnRvIHRoZSBkaXJlY3QgaXRlbSwgc28gdGhlCisJCSAqIGJ1ZmZlciBpbiB0aGUgcGFnZSBpcyBub3cgY2xlYW4sIG1hcmsgaXQgdG8gcmVmbGVjdCB0aGF0LgorCQkgKi8KKwkJbG9ja19idWZmZXIoYmhfcmVzdWx0KTsKKwkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoX3Jlc3VsdCk7CisJCXVubG9ja19idWZmZXIoYmhfcmVzdWx0KTsKKwl9CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyogCkBAIC0yMjE1LDM4MyArMjMyNSwzOTAgQEAKICAqIHN0YXJ0L3JlY292ZXJ5IHBhdGggYXMgX19ibG9ja193cml0ZV9mdWxsX3BhZ2UsIGFsb25nIHdpdGggc3BlY2lhbAogICogY29kZSB0byBoYW5kbGUgcmVpc2VyZnMgdGFpbHMuCiAgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfZnVsbF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykgewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICB1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCA7Ci0gICAgaW50IGVycm9yID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIGJsb2NrIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaDsKLSAgICBpbnQgcGFydGlhbCA9IDAgOwotICAgIGludCBuciA9IDA7Ci0gICAgaW50IGNoZWNrZWQgPSBQYWdlQ2hlY2tlZChwYWdlKTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGlub2RlLT5pX3NiOwotICAgIGludCBiaF9wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHMtPnNfYmxvY2tzaXplOwotICAgIHRoLnRfdHJhbnNfaWQgPSAwOworc3RhdGljIGludCByZWlzZXJmc193cml0ZV9mdWxsX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludCBlcnJvciA9IDA7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaDsKKwlpbnQgcGFydGlhbCA9IDA7CisJaW50IG5yID0gMDsKKwlpbnQgY2hlY2tlZCA9IFBhZ2VDaGVja2VkKHBhZ2UpOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaW5vZGUtPmlfc2I7CisJaW50IGJoX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gcy0+c19ibG9ja3NpemU7CisJdGgudF90cmFuc19pZCA9IDA7CiAKLSAgICAvKiBUaGUgcGFnZSBkaXJ0eSBiaXQgaXMgY2xlYXJlZCBiZWZvcmUgd3JpdGVwYWdlIGlzIGNhbGxlZCwgd2hpY2gKLSAgICAgKiBtZWFucyB3ZSBoYXZlIHRvIHRlbGwgY3JlYXRlX2VtcHR5X2J1ZmZlcnMgdG8gbWFrZSBkaXJ0eSBidWZmZXJzCi0gICAgICogVGhlIHBhZ2UgcmVhbGx5IHNob3VsZCBiZSB1cCB0byBkYXRlIGF0IHRoaXMgcG9pbnQsIHNvIHRvc3NpbmcKLSAgICAgKiBpbiB0aGUgQkhfVXB0b2RhdGUgaXMganVzdCBhIHNhbml0eSBjaGVjay4KLSAgICAgKi8KLSAgICBpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKLQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBzLT5zX2Jsb2Nrc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICgxIDw8IEJIX0RpcnR5KSB8ICgxIDw8IEJIX1VwdG9kYXRlKSk7Ci0gICAgfQotICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOwotCi0gICAgLyogbGFzdCBwYWdlIGluIHRoZSBmaWxlLCB6ZXJvIG91dCBhbnkgY29udGVudHMgcGFzdCB0aGUKLSAgICAqKiBsYXN0IGJ5dGUgaW4gdGhlIGZpbGUKLSAgICAqLwotICAgIGlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgpIHsKLQljaGFyICprYWRkcjsKLQl1bnNpZ25lZCBsYXN0X29mZnNldDsKLQotICAgICAgICBsYXN0X29mZnNldCA9IGlub2RlLT5pX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOwotCS8qIG5vIGZpbGUgY29udGVudHMgaW4gdGhpcyBwYWdlICovCi0JaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCArIDEgfHwgIWxhc3Rfb2Zmc2V0KSB7Ci0gICAgCSAgICB1bmxvY2tfcGFnZShwYWdlKTsKLQkgICAgcmV0dXJuIDA7CisJLyogVGhlIHBhZ2UgZGlydHkgYml0IGlzIGNsZWFyZWQgYmVmb3JlIHdyaXRlcGFnZSBpcyBjYWxsZWQsIHdoaWNoCisJICogbWVhbnMgd2UgaGF2ZSB0byB0ZWxsIGNyZWF0ZV9lbXB0eV9idWZmZXJzIHRvIG1ha2UgZGlydHkgYnVmZmVycworCSAqIFRoZSBwYWdlIHJlYWxseSBzaG91bGQgYmUgdXAgdG8gZGF0ZSBhdCB0aGlzIHBvaW50LCBzbyB0b3NzaW5nCisJICogaW4gdGhlIEJIX1VwdG9kYXRlIGlzIGp1c3QgYSBzYW5pdHkgY2hlY2suCisJICovCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIHMtPnNfYmxvY2tzaXplLAorCQkJCSAgICAgKDEgPDwgQkhfRGlydHkpIHwgKDEgPDwgQkhfVXB0b2RhdGUpKTsKIAl9Ci0Ja2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JbWVtc2V0KGthZGRyICsgbGFzdF9vZmZzZXQsIDAsIFBBR0VfQ0FDSEVfU0laRS1sYXN0X29mZnNldCkgOwotCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpIDsKLQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCkgOwotICAgIH0KLSAgICBiaCA9IGhlYWQgOwotICAgIGJsb2NrID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBzLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA7Ci0gICAgLyogZmlyc3QgbWFwIGFsbCB0aGUgYnVmZmVycywgbG9nZ2luZyBhbnkgZGlyZWN0IGl0ZW1zIHdlIGZpbmQgKi8KLSAgICBkbyB7Ci0JaWYgKChjaGVja2VkIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpICYmICghYnVmZmVyX21hcHBlZChiaCkgfHwKLQkgICAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciA9PSAwKSkpIHsKLQkgICAgLyogbm90IG1hcHBlZCB5ZXQsIG9yIGl0IHBvaW50cyB0byBhIGRpcmVjdCBpdGVtLCBzZWFyY2gKLQkgICAgICogdGhlIGJ0cmVlIGZvciB0aGUgbWFwcGluZyBpbmZvLCBhbmQgbG9nIGFueSBkaXJlY3QKLQkgICAgICogaXRlbXMgZm91bmQKLQkgICAgICovCi0JICAgIGlmICgoZXJyb3IgPSBtYXBfYmxvY2tfZm9yX3dyaXRlcGFnZShpbm9kZSwgYmgsIGJsb2NrKSkpIHsKLQkJZ290byBmYWlsIDsKLQkgICAgfQotCX0KLSAgICAgICAgYmggPSBiaC0+Yl90aGlzX3BhZ2U7Ci0JYmxvY2srKzsKLSAgICB9IHdoaWxlKGJoICE9IGhlYWQpIDsKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCi0gICAgLyoKLSAgICAgKiB3ZSBzdGFydCB0aGUgdHJhbnNhY3Rpb24gYWZ0ZXIgbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2UsCi0gICAgICogYmVjYXVzZSBpdCBjYW4gY3JlYXRlIGhvbGVzIGluIHRoZSBmaWxlIChhbiB1bmJvdW5kZWQgb3BlcmF0aW9uKS4KLSAgICAgKiBzdGFydGluZyBpdCBoZXJlLCB3ZSBjYW4gbWFrZSBhIHJlbGlhYmxlIGVzdGltYXRlIGZvciBob3cgbWFueQotICAgICAqIGJsb2NrcyB3ZSdyZSBnb2luZyB0byBsb2cKLSAgICAgKi8KLSAgICBpZiAoY2hlY2tlZCkgewotCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7Ci0JcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKLQllcnJvciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOwotCWlmIChlcnJvcikgewotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2socyk7Ci0JICAgIGdvdG8gZmFpbDsKKwkvKiBsYXN0IHBhZ2UgaW4gdGhlIGZpbGUsIHplcm8gb3V0IGFueSBjb250ZW50cyBwYXN0IHRoZQorCSAqKiBsYXN0IGJ5dGUgaW4gdGhlIGZpbGUKKwkgKi8KKwlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4KSB7CisJCWNoYXIgKmthZGRyOworCQl1bnNpZ25lZCBsYXN0X29mZnNldDsKKworCQlsYXN0X29mZnNldCA9IGlub2RlLT5pX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCS8qIG5vIGZpbGUgY29udGVudHMgaW4gdGhpcyBwYWdlICovCisJCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXggKyAxIHx8ICFsYXN0X29mZnNldCkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgbGFzdF9vZmZzZXQsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGxhc3Rfb2Zmc2V0KTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAl9Ci0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKLSAgICB9Ci0gICAgLyogbm93IGdvIHRocm91Z2ggYW5kIGxvY2sgYW55IGRpcnR5IGJ1ZmZlcnMgb24gdGhlIHBhZ2UgKi8KLSAgICBkbyB7Ci0JZ2V0X2JoKGJoKTsKLQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKQotCSAgICBjb250aW51ZTsKLQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciA9PSAwKQotCSAgICBjb250aW51ZTsKKwliaCA9IGhlYWQ7CisJYmxvY2sgPSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIHMtPnNfYmxvY2tzaXplX2JpdHMpOworCS8qIGZpcnN0IG1hcCBhbGwgdGhlIGJ1ZmZlcnMsIGxvZ2dpbmcgYW55IGRpcmVjdCBpdGVtcyB3ZSBmaW5kICovCisJZG8geworCQlpZiAoKGNoZWNrZWQgfHwgYnVmZmVyX2RpcnR5KGJoKSkgJiYgKCFidWZmZXJfbWFwcGVkKGJoKSB8fAorCQkJCQkJICAgICAgKGJ1ZmZlcl9tYXBwZWQoYmgpCisJCQkJCQkgICAgICAgJiYgYmgtPmJfYmxvY2tuciA9PQorCQkJCQkJICAgICAgIDApKSkgeworCQkJLyogbm90IG1hcHBlZCB5ZXQsIG9yIGl0IHBvaW50cyB0byBhIGRpcmVjdCBpdGVtLCBzZWFyY2gKKwkJCSAqIHRoZSBidHJlZSBmb3IgdGhlIG1hcHBpbmcgaW5mbywgYW5kIGxvZyBhbnkgZGlyZWN0CisJCQkgKiBpdGVtcyBmb3VuZAorCQkJICovCisJCQlpZiAoKGVycm9yID0gbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2UoaW5vZGUsIGJoLCBibG9jaykpKSB7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQlibG9jaysrOworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCisJLyoKKwkgKiB3ZSBzdGFydCB0aGUgdHJhbnNhY3Rpb24gYWZ0ZXIgbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2UsCisJICogYmVjYXVzZSBpdCBjYW4gY3JlYXRlIGhvbGVzIGluIHRoZSBmaWxlIChhbiB1bmJvdW5kZWQgb3BlcmF0aW9uKS4KKwkgKiBzdGFydGluZyBpdCBoZXJlLCB3ZSBjYW4gbWFrZSBhIHJlbGlhYmxlIGVzdGltYXRlIGZvciBob3cgbWFueQorCSAqIGJsb2NrcyB3ZSdyZSBnb2luZyB0byBsb2cKKwkgKi8KKwlpZiAoY2hlY2tlZCkgeworCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCQllcnJvciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCX0KKwkvKiBub3cgZ28gdGhyb3VnaCBhbmQgbG9jayBhbnkgZGlydHkgYnVmZmVycyBvbiB0aGUgcGFnZSAqLworCWRvIHsKKwkJZ2V0X2JoKGJoKTsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKGNoZWNrZWQpIHsKKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDEpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgYmgpOworCQkJY29udGludWU7CisJCX0KKwkJLyogZnJvbSB0aGlzIHBvaW50IG9uLCB3ZSBrbm93IHRoZSBidWZmZXIgaXMgbWFwcGVkIHRvIGEKKwkJICogcmVhbCBibG9jayBhbmQgbm90IGEgZGlyZWN0IGl0ZW0KKwkJICovCisJCWlmICh3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX05PTkUgfHwgIXdiYy0+bm9uYmxvY2tpbmcpIHsKKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkgeworCQkJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCQl9IGVsc2UgeworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCX0KKwl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwogCiAJaWYgKGNoZWNrZWQpIHsKLQkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaCwgMSk7Ci0JICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIGJoKTsKLQkgICAgY29udGludWU7CisJCWVycm9yID0gam91cm5hbF9lbmQoJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZmFpbDsKIAl9Ci0JLyogZnJvbSB0aGlzIHBvaW50IG9uLCB3ZSBrbm93IHRoZSBidWZmZXIgaXMgbWFwcGVkIHRvIGEKLQkgKiByZWFsIGJsb2NrIGFuZCBub3QgYSBkaXJlY3QgaXRlbQorCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisKKwkvKgorCSAqIHNpbmNlIGFueSBidWZmZXIgbWlnaHQgYmUgdGhlIG9ubHkgZGlydHkgYnVmZmVyIG9uIHRoZSBwYWdlLCAKKwkgKiB0aGUgZmlyc3Qgc3VibWl0X2JoIGNhbiBicmluZyB0aGUgcGFnZSBvdXQgb2Ygd3JpdGViYWNrLgorCSAqIGJlIGNhcmVmdWwgd2l0aCB0aGUgYnVmZmVycy4KIAkgKi8KLQlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19OT05FIHx8ICF3YmMtPm5vbmJsb2NraW5nKSB7Ci0JICAgIGxvY2tfYnVmZmVyKGJoKTsKLQl9IGVsc2UgewotCSAgICBpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKLQkJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQl9Ci0JaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgewotCSAgICBtYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7Ci0JfSBlbHNlIHsKLQkgICAgdW5sb2NrX2J1ZmZlcihiaCk7Ci0JfQotICAgIH0gd2hpbGUoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKLQotICAgIGlmIChjaGVja2VkKSB7Ci0JZXJyb3IgPSBqb3VybmFsX2VuZCgmdGgsIHMsIGJoX3Blcl9wYWdlICsgMSk7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwotCWlmIChlcnJvcikKLQkgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7Ci0gICAgc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotICAgIHVubG9ja19wYWdlKHBhZ2UpOwotCi0gICAgLyoKLSAgICAgKiBzaW5jZSBhbnkgYnVmZmVyIG1pZ2h0IGJlIHRoZSBvbmx5IGRpcnR5IGJ1ZmZlciBvbiB0aGUgcGFnZSwgCi0gICAgICogdGhlIGZpcnN0IHN1Ym1pdF9iaCBjYW4gYnJpbmcgdGhlIHBhZ2Ugb3V0IG9mIHdyaXRlYmFjay4KLSAgICAgKiBiZSBjYXJlZnVsIHdpdGggdGhlIGJ1ZmZlcnMuCi0gICAgICovCi0gICAgZG8gewotICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7Ci0JaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKLQkgICAgc3VibWl0X2JoKFdSSVRFLCBiaCk7Ci0JICAgIG5yKys7Ci0JfQotCXB1dF9iaChiaCk7Ci0JYmggPSBuZXh0OwotICAgIH0gd2hpbGUoYmggIT0gaGVhZCk7Ci0KLSAgICBlcnJvciA9IDA7Ci1kb25lOgotICAgIGlmIChuciA9PSAwKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIGlmIHRoaXMgcGFnZSBvbmx5IGhhZCBhIGRpcmVjdCBpdGVtLCBpdCBpcyB2ZXJ5IHBvc3NpYmxlIGZvcgotICAgICAgICAgKiBubyBpbyB0byBiZSByZXF1aXJlZCB3aXRob3V0IHRoZXJlIGJlaW5nIGFuIGVycm9yLiAgT3IsIAotCSAqIHNvbWVvbmUgZWxzZSBjb3VsZCBoYXZlIGxvY2tlZCB0aGVtIGFuZCBzZW50IHRoZW0gZG93biB0aGUgCi0JICogcGlwZSB3aXRob3V0IGxvY2tpbmcgdGhlIHBhZ2UKLQkgKi8KLQliaCA9IGhlYWQgOwogCWRvIHsKLQkgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JICAgICAgICBwYXJ0aWFsID0gMTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYmggPSBiaC0+Yl90aGlzX3BhZ2U7Ci0JfSB3aGlsZShiaCAhPSBoZWFkKTsKLQlpZiAoIXBhcnRpYWwpCi0JICAgIFNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCQlpZiAoYnVmZmVyX2FzeW5jX3dyaXRlKGJoKSkgeworCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQlucisrOworCQl9CisJCXB1dF9iaChiaCk7CisJCWJoID0gbmV4dDsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKIAotZmFpbDoKLSAgICAvKiBjYXRjaGVzIHZhcmlvdXMgZXJyb3JzLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbnkgdmFsaWQgZGlydHkgYmxvY2tzCi0gICAgICogZ2V0IHRvIHRoZSBtZWRpYS4gIFRoZSBwYWdlIGlzIGN1cnJlbnRseSBsb2NrZWQgYW5kIG5vdCBtYXJrZWQgZm9yIAotICAgICAqIHdyaXRlYmFjawotICAgICAqLwotICAgIENsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwotICAgIGJoID0gaGVhZDsKLSAgICBkbyB7Ci0JZ2V0X2JoKGJoKTsKLQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYnVmZmVyX2RpcnR5KGJoKSAmJiBiaC0+Yl9ibG9ja25yKSB7Ci0JICAgIGxvY2tfYnVmZmVyKGJoKTsKLQkgICAgbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOwotCX0gZWxzZSB7Ci0JICAgIC8qCi0JICAgICAqIGNsZWFyIGFueSBkaXJ0eSBiaXRzIHRoYXQgbWlnaHQgaGF2ZSBjb21lIGZyb20gZ2V0dGluZwotCSAgICAgKiBhdHRhY2hlZCB0byBhIGRpcnR5IHBhZ2UKLQkgICAgICovCi0JICAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOworCWVycm9yID0gMDsKKyAgICAgIGRvbmU6CisJaWYgKG5yID09IDApIHsKKwkJLyoKKwkJICogaWYgdGhpcyBwYWdlIG9ubHkgaGFkIGEgZGlyZWN0IGl0ZW0sIGl0IGlzIHZlcnkgcG9zc2libGUgZm9yCisJCSAqIG5vIGlvIHRvIGJlIHJlcXVpcmVkIHdpdGhvdXQgdGhlcmUgYmVpbmcgYW4gZXJyb3IuICBPciwgCisJCSAqIHNvbWVvbmUgZWxzZSBjb3VsZCBoYXZlIGxvY2tlZCB0aGVtIGFuZCBzZW50IHRoZW0gZG93biB0aGUgCisJCSAqIHBpcGUgd2l0aG91dCBsb2NraW5nIHRoZSBwYWdlCisJCSAqLworCQliaCA9IGhlYWQ7CisJCWRvIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCXBhcnRpYWwgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCQlpZiAoIXBhcnRpYWwpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAl9Ci0gICAgICAgIGJoID0gYmgtPmJfdGhpc19wYWdlOwotICAgIH0gd2hpbGUoYmggIT0gaGVhZCk7Ci0gICAgU2V0UGFnZUVycm9yKHBhZ2UpOwotICAgIEJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKLSAgICBzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7Ci0gICAgdW5sb2NrX3BhZ2UocGFnZSk7Ci0gICAgZG8gewotICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7Ci0JaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKLQkgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKLQkgICAgc3VibWl0X2JoKFdSSVRFLCBiaCk7Ci0JICAgIG5yKys7Ci0JfQotCXB1dF9iaChiaCk7Ci0JYmggPSBuZXh0OwotICAgIH0gd2hpbGUoYmggIT0gaGVhZCk7Ci0gICAgZ290byBkb25lOworCXJldHVybiBlcnJvcjsKKworICAgICAgZmFpbDoKKwkvKiBjYXRjaGVzIHZhcmlvdXMgZXJyb3JzLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbnkgdmFsaWQgZGlydHkgYmxvY2tzCisJICogZ2V0IHRvIHRoZSBtZWRpYS4gIFRoZSBwYWdlIGlzIGN1cnJlbnRseSBsb2NrZWQgYW5kIG5vdCBtYXJrZWQgZm9yIAorCSAqIHdyaXRlYmFjaworCSAqLworCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCWJoID0gaGVhZDsKKwlkbyB7CisJCWdldF9iaChiaCk7CisJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBidWZmZXJfZGlydHkoYmgpICYmIGJoLT5iX2Jsb2NrbnIpIHsKKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCW1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBjbGVhciBhbnkgZGlydHkgYml0cyB0aGF0IG1pZ2h0IGhhdmUgY29tZSBmcm9tIGdldHRpbmcKKwkJCSAqIGF0dGFjaGVkIHRvIGEgZGlydHkgcGFnZQorCQkJICovCisJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQl9CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCVNldFBhZ2VFcnJvcihwYWdlKTsKKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCWRvIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCQlpZiAoYnVmZmVyX2FzeW5jX3dyaXRlKGJoKSkgeworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCXN1Ym1pdF9iaChXUklURSwgYmgpOworCQkJbnIrKzsKKwkJfQorCQlwdXRfYmgoYmgpOworCQliaCA9IG5leHQ7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJZ290byBkb25lOwogfQogCi0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfcmVhZHBhZ2UgKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqIHBhZ2UpCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLSAgICByZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UgKHBhZ2UsIHJlaXNlcmZzX2dldF9ibG9jayk7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIHJlaXNlcmZzX2dldF9ibG9jayk7CiB9CiAKLQotc3RhdGljIGludCByZWlzZXJmc193cml0ZXBhZ2UgKHN0cnVjdCBwYWdlICogcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCitzdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3QgOwotICAgIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpIDsKLSAgICByZXR1cm4gcmVpc2VyZnNfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIHdiYykgOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZWlzZXJmc193cml0ZV9mdWxsX3BhZ2UocGFnZSwgd2JjKTsKIH0KIAogc3RhdGljIGludCByZWlzZXJmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCSAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKSB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3QgOwotICAgIGludCByZXQ7Ci0gICAgaW50IG9sZF9yZWYgPSAwOwotCi0gICAgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhpbm9kZS0+aV9zYikgOwotICAgIGZpeF90YWlsX3BhZ2VfZm9yX3dyaXRpbmcocGFnZSkgOwotICAgIGlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgewotCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoOwotCXRoID0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiljdXJyZW50LT5qb3VybmFsX2luZm87Ci0gICAgICAgIEJVR19PTiAoIXRoLT50X3JlZmNvdW50KTsKLSAgICAgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotCW9sZF9yZWYgPSB0aC0+dF9yZWZjb3VudDsKLQl0aC0+dF9yZWZjb3VudCsrOwotICAgIH0KLQotICAgIHJldCA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIHJlaXNlcmZzX2dldF9ibG9jaykgOwotICAgIGlmIChyZXQgJiYgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpIHsKLSAgICAJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87Ci0JLyogdGhpcyBnZXRzIGEgbGl0dGxlIHVnbHkuICBJZiByZWlzZXJmc19nZXRfYmxvY2sgcmV0dXJuZWQgYW4KLQkgKiBlcnJvciBhbmQgbGVmdCBhIHRyYW5zYWNzdGlvbiBydW5uaW5nLCB3ZSd2ZSBnb3QgdG8gY2xvc2UgaXQsCi0JICogYW5kIHdlJ3ZlIGdvdCB0byBmcmVlIGhhbmRsZSBpZiBpdCB3YXMgYSBwZXJzaXN0ZW50IHRyYW5zYWN0aW9uLgotCSAqCi0JICogQnV0LCBpZiB3ZSBoYWQgbmVzdGVkIGludG8gYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24sIHdlIG5lZWQKLQkgKiB0byBqdXN0IGRyb3AgdGhlIHJlZiBjb3VudCBvbiB0aGUgaGFuZGxlLgotCSAqCi0JICogSWYgb2xkX3JlZiA9PSAwLCB0aGUgdHJhbnNhY3Rpb24gaXMgZnJvbSByZWlzZXJmc19nZXRfYmxvY2ssCi0JICogYW5kIGl0IHdhcyBhIHBlcnNpc3RlbnQgdHJhbnMuICBPdGhlcndpc2UsIGl0IHdhcyBuZXN0ZWQgYWJvdmUuCi0JICovCi0JaWYgKHRoLT50X3JlZmNvdW50ID4gb2xkX3JlZikgewotCSAgICBpZiAob2xkX3JlZikKLQkgICAgCXRoLT50X3JlZmNvdW50LS07Ci0JICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGludCBlcnI7Ci0JCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCQllcnIgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7Ci0JCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gZXJyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotCi19Ci0KLQotc3RhdGljIHNlY3Rvcl90IHJlaXNlcmZzX2FvcF9ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICphcywgc2VjdG9yX3QgYmxvY2spIHsKLSAgcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChhcywgYmxvY2ssIHJlaXNlcmZzX2JtYXApIDsKLX0KLQotc3RhdGljIGludCByZWlzZXJmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICpwYWdlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKSB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3QgOwotICAgIGxvZmZfdCBwb3MgPSAoKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHRvOwotICAgIGludCByZXQgPSAwOwotICAgIGludCB1cGRhdGVfc2QgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gTlVMTDsKLSAgICAKLSAgICByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKGlub2RlLT5pX3NiKSA7Ci0gICAgaWYgKHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKSB7Ci0gICAgICAgIHRoID0gY3VycmVudC0+am91cm5hbF9pbmZvOwotICAgIH0KLSAgICByZWlzZXJmc19jb21taXRfcGFnZShpbm9kZSwgcGFnZSwgZnJvbSwgdG8pOwotIAotICAgIC8qIGdlbmVyaWNfY29tbWl0X3dyaXRlIGRvZXMgdGhpcyBmb3IgdXMsIGJ1dCBkb2VzIG5vdCB1cGRhdGUgdGhlCi0gICAgKiogdHJhbnNhY3Rpb24gdHJhY2tpbmcgc3R1ZmYgd2hlbiB0aGUgc2l6ZSBjaGFuZ2VzLiAgU28sIHdlIGhhdmUKLSAgICAqKiB0byBkbyB0aGUgaV9zaXplIHVwZGF0ZXMgaGVyZS4KLSAgICAqLwotICAgIGlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7Ci0Jc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoIDsKLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkvKiBJZiB0aGUgZmlsZSBoYXZlIGdyb3duIGJleW9uZCB0aGUgYm9yZGVyIHdoZXJlIGl0Ci0JICAgY2FuIGhhdmUgYSB0YWlsLCB1bm1hcmsgaXQgYXMgbmVlZGluZyBhIHRhaWwKLQkgICBwYWNraW5nICovCi0JaWYgKCAoaGF2ZV9sYXJnZV90YWlscyAoaW5vZGUtPmlfc2IpICYmIGlub2RlLT5pX3NpemUgPiBpX2Jsb2NrX3NpemUgKGlub2RlKSo0KSB8fAotCSAgICAgKGhhdmVfc21hbGxfdGFpbHMgKGlub2RlLT5pX3NiKSAmJiBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplKGlub2RlKSkgKQotCSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2sgOwotCi0JcmV0ID0gam91cm5hbF9iZWdpbigmbXl0aCwgaW5vZGUtPmlfc2IsIDEpIDsKLQlpZiAocmV0KSB7Ci0JICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JICAgIGdvdG8gam91cm5hbF9lcnJvcjsKLQl9Ci0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0JaW5vZGUtPmlfc2l6ZSA9IHBvcyA7Ci0JcmVpc2VyZnNfdXBkYXRlX3NkKCZteXRoLCBpbm9kZSkgOwotCXVwZGF0ZV9zZCA9IDE7Ci0JcmV0ID0gam91cm5hbF9lbmQoJm15dGgsIGlub2RlLT5pX3NiLCAxKSA7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQlpZiAocmV0KQotCSAgICBnb3RvIGpvdXJuYWxfZXJyb3I7Ci0gICAgfQotICAgIGlmICh0aCkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICghdXBkYXRlX3NkKQotCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7Ci0JcmV0ID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JaWYgKHJldCkKLQkgICAgZ290byBvdXQ7Ci0gICAgfQotIAotICAgIC8qIHdlIHRlc3QgZm9yIE9fU1lOQyBoZXJlIHNvIHdlIGNhbiBjb21taXQgdGhlIHRyYW5zYWN0aW9uCi0gICAgKiogZm9yIGFueSBwYWNrZWQgdGFpbHMgdGhlIGZpbGUgbWlnaHQgaGF2ZSBoYWQKLSAgICAqLwotICAgIGlmIChmICYmIChmLT5mX2ZsYWdzICYgT19TWU5DKSkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotIAlyZXQgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKSA7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICB9Ci1vdXQ6Ci0gICAgcmV0dXJuIHJldCA7Ci0KLWpvdXJuYWxfZXJyb3I6Ci0gICAgaWYgKHRoKSB7Ci0JcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0JaWYgKCF1cGRhdGVfc2QpCi0JICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpIDsKLSAgICAgICAgcmV0ID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBzZF9hdHRyc190b19pX2F0dHJzKCBfX3UxNiBzZF9hdHRycywgc3RydWN0IGlub2RlICppbm9kZSApCisJCQkJICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKIHsKLQlpZiggcmVpc2VyZnNfYXR0cnMoIGlub2RlIC0+IGlfc2IgKSApIHsKLQkJaWYoIHNkX2F0dHJzICYgUkVJU0VSRlNfU1lOQ19GTCApCi0JCQlpbm9kZSAtPiBpX2ZsYWdzIHw9IFNfU1lOQzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgcmV0OworCWludCBvbGRfcmVmID0gMDsKKworCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpOworCWZpeF90YWlsX3BhZ2VfZm9yX3dyaXRpbmcocGFnZSk7CisJaWYgKHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKSB7CisJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoOworCQl0aCA9IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICopY3VycmVudC0+CisJCSAgICBqb3VybmFsX2luZm87CisJCUJVR19PTighdGgtPnRfcmVmY291bnQpOworCQlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwkJb2xkX3JlZiA9IHRoLT50X3JlZmNvdW50OworCQl0aC0+dF9yZWZjb3VudCsrOworCX0KKworCXJldCA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIHJlaXNlcmZzX2dldF9ibG9jayk7CisJaWYgKHJldCAmJiByZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwkJLyogdGhpcyBnZXRzIGEgbGl0dGxlIHVnbHkuICBJZiByZWlzZXJmc19nZXRfYmxvY2sgcmV0dXJuZWQgYW4KKwkJICogZXJyb3IgYW5kIGxlZnQgYSB0cmFuc2Fjc3Rpb24gcnVubmluZywgd2UndmUgZ290IHRvIGNsb3NlIGl0LAorCQkgKiBhbmQgd2UndmUgZ290IHRvIGZyZWUgaGFuZGxlIGlmIGl0IHdhcyBhIHBlcnNpc3RlbnQgdHJhbnNhY3Rpb24uCisJCSAqCisJCSAqIEJ1dCwgaWYgd2UgaGFkIG5lc3RlZCBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLCB3ZSBuZWVkCisJCSAqIHRvIGp1c3QgZHJvcCB0aGUgcmVmIGNvdW50IG9uIHRoZSBoYW5kbGUuCisJCSAqCisJCSAqIElmIG9sZF9yZWYgPT0gMCwgdGhlIHRyYW5zYWN0aW9uIGlzIGZyb20gcmVpc2VyZnNfZ2V0X2Jsb2NrLAorCQkgKiBhbmQgaXQgd2FzIGEgcGVyc2lzdGVudCB0cmFucy4gIE90aGVyd2lzZSwgaXQgd2FzIG5lc3RlZCBhYm92ZS4KKwkJICovCisJCWlmICh0aC0+dF9yZWZjb3VudCA+IG9sZF9yZWYpIHsKKwkJCWlmIChvbGRfcmVmKQorCQkJCXRoLT50X3JlZmNvdW50LS07CisJCQllbHNlIHsKKwkJCQlpbnQgZXJyOworCQkJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCQkJCWVyciA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwkJCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQkJCWlmIChlcnIpCisJCQkJCXJldCA9IGVycjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBzZWN0b3JfdCByZWlzZXJmc19hb3BfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYXMsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAoYXMsIGJsb2NrLCByZWlzZXJmc19ibWFwKTsKK30KKworc3RhdGljIGludCByZWlzZXJmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpIHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisJaW50IHJldCA9IDA7CisJaW50IHVwZGF0ZV9zZCA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBOVUxMOworCisJcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhpbm9kZS0+aV9zYik7CisJaWYgKHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKSB7CisJCXRoID0gY3VycmVudC0+am91cm5hbF9pbmZvOworCX0KKwlyZWlzZXJmc19jb21taXRfcGFnZShpbm9kZSwgcGFnZSwgZnJvbSwgdG8pOworCisJLyogZ2VuZXJpY19jb21taXRfd3JpdGUgZG9lcyB0aGlzIGZvciB1cywgYnV0IGRvZXMgbm90IHVwZGF0ZSB0aGUKKwkgKiogdHJhbnNhY3Rpb24gdHJhY2tpbmcgc3R1ZmYgd2hlbiB0aGUgc2l6ZSBjaGFuZ2VzLiAgU28sIHdlIGhhdmUKKwkgKiogdG8gZG8gdGhlIGlfc2l6ZSB1cGRhdGVzIGhlcmUuCisJICovCisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpIHsKKwkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBiZXlvbmQgdGhlIGJvcmRlciB3aGVyZSBpdAorCQkgICBjYW4gaGF2ZSBhIHRhaWwsIHVubWFyayBpdCBhcyBuZWVkaW5nIGEgdGFpbAorCQkgICBwYWNraW5nICovCisJCWlmICgoaGF2ZV9sYXJnZV90YWlscyhpbm9kZS0+aV9zYikKKwkJICAgICAmJiBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplKGlub2RlKSAqIDQpCisJCSAgICB8fCAoaGF2ZV9zbWFsbF90YWlscyhpbm9kZS0+aV9zYikKKwkJCSYmIGlub2RlLT5pX3NpemUgPiBpX2Jsb2NrX3NpemUoaW5vZGUpKSkKKwkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzazsKKworCQlyZXQgPSBqb3VybmFsX2JlZ2luKCZteXRoLCBpbm9kZS0+aV9zYiwgMSk7CisJCWlmIChyZXQpIHsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CisJCX0KKwkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IHBvczsKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKCZteXRoLCBpbm9kZSk7CisJCXVwZGF0ZV9zZCA9IDE7CisJCXJldCA9IGpvdXJuYWxfZW5kKCZteXRoLCBpbm9kZS0+aV9zYiwgMSk7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCWlmIChyZXQpCisJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CisJfQorCWlmICh0aCkgeworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKCF1cGRhdGVfc2QpCisJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwkJcmV0ID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJLyogd2UgdGVzdCBmb3IgT19TWU5DIGhlcmUgc28gd2UgY2FuIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24KKwkgKiogZm9yIGFueSBwYWNrZWQgdGFpbHMgdGhlIGZpbGUgbWlnaHQgaGF2ZSBoYWQKKwkgKi8KKwlpZiAoZiAmJiAoZi0+Zl9mbGFncyAmIE9fU1lOQykpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCXJldCA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoaW5vZGUpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCX0KKyAgICAgIG91dDoKKwlyZXR1cm4gcmV0OworCisgICAgICBqb3VybmFsX2Vycm9yOgorCWlmICh0aCkgeworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKCF1cGRhdGVfc2QpCisJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwkJcmV0ID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgc2RfYXR0cnNfdG9faV9hdHRycyhfX3UxNiBzZF9hdHRycywgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAocmVpc2VyZnNfYXR0cnMoaW5vZGUtPmlfc2IpKSB7CisJCWlmIChzZF9hdHRycyAmIFJFSVNFUkZTX1NZTkNfRkwpCisJCQlpbm9kZS0+aV9mbGFncyB8PSBTX1NZTkM7CiAJCWVsc2UKLQkJCWlub2RlIC0+IGlfZmxhZ3MgJj0gflNfU1lOQzsKLQkJaWYoIHNkX2F0dHJzICYgUkVJU0VSRlNfSU1NVVRBQkxFX0ZMICkKLQkJCWlub2RlIC0+IGlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJCQlpbm9kZS0+aV9mbGFncyAmPSB+U19TWU5DOworCQlpZiAoc2RfYXR0cnMgJiBSRUlTRVJGU19JTU1VVEFCTEVfRkwpCisJCQlpbm9kZS0+aV9mbGFncyB8PSBTX0lNTVVUQUJMRTsKIAkJZWxzZQotCQkJaW5vZGUgLT4gaV9mbGFncyAmPSB+U19JTU1VVEFCTEU7Ci0JCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX0FQUEVORF9GTCApCi0JCQlpbm9kZSAtPiBpX2ZsYWdzIHw9IFNfQVBQRU5EOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOworCQlpZiAoc2RfYXR0cnMgJiBSRUlTRVJGU19BUFBFTkRfRkwpCisJCQlpbm9kZS0+aV9mbGFncyB8PSBTX0FQUEVORDsKIAkJZWxzZQotCQkJaW5vZGUgLT4gaV9mbGFncyAmPSB+U19BUFBFTkQ7Ci0JCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX05PQVRJTUVfRkwgKQotCQkJaW5vZGUgLT4gaV9mbGFncyB8PSBTX05PQVRJTUU7CisJCQlpbm9kZS0+aV9mbGFncyAmPSB+U19BUFBFTkQ7CisJCWlmIChzZF9hdHRycyAmIFJFSVNFUkZTX05PQVRJTUVfRkwpCisJCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PQVRJTUU7CiAJCWVsc2UKLQkJCWlub2RlIC0+IGlfZmxhZ3MgJj0gflNfTk9BVElNRTsKLQkJaWYoIHNkX2F0dHJzICYgUkVJU0VSRlNfTk9UQUlMX0ZMICkKKwkJCWlub2RlLT5pX2ZsYWdzICY9IH5TX05PQVRJTUU7CisJCWlmIChzZF9hdHRycyAmIFJFSVNFUkZTX05PVEFJTF9GTCkKIAkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7CiAJCWVsc2UKIAkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX25vcGFja19tYXNrOwogCX0KIH0KIAotdm9pZCBpX2F0dHJzX3RvX3NkX2F0dHJzKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3UxNiAqc2RfYXR0cnMgKQordm9pZCBpX2F0dHJzX3RvX3NkX2F0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fdTE2ICogc2RfYXR0cnMpCiB7Ci0JaWYoIHJlaXNlcmZzX2F0dHJzKCBpbm9kZSAtPiBpX3NiICkgKSB7Ci0JCWlmKCBpbm9kZSAtPiBpX2ZsYWdzICYgU19JTU1VVEFCTEUgKQorCWlmIChyZWlzZXJmc19hdHRycyhpbm9kZS0+aV9zYikpIHsKKwkJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19JTU1VVEFCTEUpCiAJCQkqc2RfYXR0cnMgfD0gUkVJU0VSRlNfSU1NVVRBQkxFX0ZMOwogCQllbHNlCiAJCQkqc2RfYXR0cnMgJj0gflJFSVNFUkZTX0lNTVVUQUJMRV9GTDsKLQkJaWYoIGlub2RlIC0+IGlfZmxhZ3MgJiBTX1NZTkMgKQorCQlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBTX1NZTkMpCiAJCQkqc2RfYXR0cnMgfD0gUkVJU0VSRlNfU1lOQ19GTDsKIAkJZWxzZQogCQkJKnNkX2F0dHJzICY9IH5SRUlTRVJGU19TWU5DX0ZMOwotCQlpZiggaW5vZGUgLT4gaV9mbGFncyAmIFNfTk9BVElNRSApCisJCWlmIChpbm9kZS0+aV9mbGFncyAmIFNfTk9BVElNRSkKIAkJCSpzZF9hdHRycyB8PSBSRUlTRVJGU19OT0FUSU1FX0ZMOwogCQllbHNlCiAJCQkqc2RfYXR0cnMgJj0gflJFSVNFUkZTX05PQVRJTUVfRkw7Ci0JCWlmKCBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2sgKQorCQlpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrKQogCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX05PVEFJTF9GTDsKIAkJZWxzZQogCQkJKnNkX2F0dHJzICY9IH5SRUlTRVJGU19OT1RBSUxfRkw7CkBAIC0yNjAzLDEwNiArMjcyMCwxMDcgQEAKICovCiBzdGF0aWMgaW50IGludmFsaWRhdGVwYWdlX2Nhbl9kcm9wKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgaW50IHJldCA9IDEgOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYikgOworCWludCByZXQgPSAxOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYik7CiAKLSAgICBzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7Ci0gICAgaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgewotICAgICAgICBnb3RvIGZyZWVfamg7Ci0gICAgfQotICAgIC8qIHRoZSBwYWdlIGlzIGxvY2tlZCwgYW5kIHRoZSBvbmx5IHBsYWNlcyB0aGF0IGxvZyBhIGRhdGEgYnVmZmVyCi0gICAgICogYWxzbyBsb2NrIHRoZSBwYWdlLgotICAgICAqLwotICAgIGlmIChyZWlzZXJmc19maWxlX2RhdGFfbG9nKGlub2RlKSkgewotCS8qCi0JICogdmVyeSBjb25zZXJ2YXRpdmUsIGxlYXZlIHRoZSBidWZmZXIgcGlubmVkIGlmCi0JICogYW55b25lIG1pZ2h0IG5lZWQgaXQuCi0JICovCi0gICAgICAgIGlmIChidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKLQkgICAgcmV0ID0gMCA7CisJc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQlnb3RvIGZyZWVfamg7CiAJfQotICAgIH0gZWxzZQotICAgIGlmIChidWZmZXJfZGlydHkoYmgpIHx8IGJ1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0Jc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7Ci0Jc3RydWN0IHJlaXNlcmZzX2poICpqaCA9IGJoLT5iX3ByaXZhdGU7Ci0KLQkvKiB3aHkgaXMgdGhpcyBzYWZlPwotCSAqIHJlaXNlcmZzX3NldGF0dHIgdXBkYXRlcyBpX3NpemUgaW4gdGhlIG9uIGRpc2sKLQkgKiBzdGF0IGRhdGEgYmVmb3JlIGFsbG93aW5nIHZtdHJ1bmNhdGUgdG8gYmUgY2FsbGVkLgotCSAqCi0JICogSWYgYnVmZmVyIHdhcyBwdXQgb250byB0aGUgb3JkZXJlZCBsaXN0IGZvciB0aGlzCi0JICogdHJhbnNhY3Rpb24sIHdlIGtub3cgZm9yIHN1cmUgZWl0aGVyIHRoaXMgdHJhbnNhY3Rpb24KLQkgKiBvciBhbiBvbGRlciBvbmUgYWxyZWFkeSBoYXMgdXBkYXRlZCBpX3NpemUgb24gZGlzaywKLQkgKiBhbmQgdGhpcyBvcmRlcmVkIGRhdGEgd29uJ3QgYmUgcmVmZXJlbmNlZCBpbiB0aGUgZmlsZQotCSAqIGlmIHdlIGNyYXNoLgotCSAqCi0JICogaWYgdGhlIGJ1ZmZlciB3YXMgcHV0IG9udG8gdGhlIG9yZGVyZWQgbGlzdCBmb3IgYW4gb2xkZXIKLQkgKiB0cmFuc2FjdGlvbiwgd2UgbmVlZCB0byBsZWF2ZSBpdCBhcm91bmQKKwkvKiB0aGUgcGFnZSBpcyBsb2NrZWQsIGFuZCB0aGUgb25seSBwbGFjZXMgdGhhdCBsb2cgYSBkYXRhIGJ1ZmZlcgorCSAqIGFsc28gbG9jayB0aGUgcGFnZS4KIAkgKi8KLQlpZiAoamggJiYgKGpsID0gamgtPmpsKSAmJiBqbCAhPSBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9jdXJyZW50X2psKQotCSAgICByZXQgPSAwOwotICAgIH0KLWZyZWVfamg6Ci0gICAgaWYgKHJldCAmJiBiaC0+Yl9wcml2YXRlKSB7Ci0gICAgICAgIHJlaXNlcmZzX2ZyZWVfamgoYmgpOwotICAgIH0KLSAgICBzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spIDsKLSAgICByZXR1cm4gcmV0IDsKKwlpZiAocmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSkpIHsKKwkJLyoKKwkJICogdmVyeSBjb25zZXJ2YXRpdmUsIGxlYXZlIHRoZSBidWZmZXIgcGlubmVkIGlmCisJCSAqIGFueW9uZSBtaWdodCBuZWVkIGl0LgorCQkgKi8KKwkJaWYgKGJ1ZmZlcl9qb3VybmFsZWQoYmgpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSkgeworCQkJcmV0ID0gMDsKKwkJfQorCX0gZWxzZSBpZiAoYnVmZmVyX2RpcnR5KGJoKSB8fCBidWZmZXJfbG9ja2VkKGJoKSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwkJc3RydWN0IHJlaXNlcmZzX2poICpqaCA9IGJoLT5iX3ByaXZhdGU7CisKKwkJLyogd2h5IGlzIHRoaXMgc2FmZT8KKwkJICogcmVpc2VyZnNfc2V0YXR0ciB1cGRhdGVzIGlfc2l6ZSBpbiB0aGUgb24gZGlzaworCQkgKiBzdGF0IGRhdGEgYmVmb3JlIGFsbG93aW5nIHZtdHJ1bmNhdGUgdG8gYmUgY2FsbGVkLgorCQkgKgorCQkgKiBJZiBidWZmZXIgd2FzIHB1dCBvbnRvIHRoZSBvcmRlcmVkIGxpc3QgZm9yIHRoaXMKKwkJICogdHJhbnNhY3Rpb24sIHdlIGtub3cgZm9yIHN1cmUgZWl0aGVyIHRoaXMgdHJhbnNhY3Rpb24KKwkJICogb3IgYW4gb2xkZXIgb25lIGFscmVhZHkgaGFzIHVwZGF0ZWQgaV9zaXplIG9uIGRpc2ssCisJCSAqIGFuZCB0aGlzIG9yZGVyZWQgZGF0YSB3b24ndCBiZSByZWZlcmVuY2VkIGluIHRoZSBmaWxlCisJCSAqIGlmIHdlIGNyYXNoLgorCQkgKgorCQkgKiBpZiB0aGUgYnVmZmVyIHdhcyBwdXQgb250byB0aGUgb3JkZXJlZCBsaXN0IGZvciBhbiBvbGRlcgorCQkgKiB0cmFuc2FjdGlvbiwgd2UgbmVlZCB0byBsZWF2ZSBpdCBhcm91bmQKKwkJICovCisJCWlmIChqaCAmJiAoamwgPSBqaC0+amwpCisJCSAgICAmJiBqbCAhPSBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9jdXJyZW50X2psKQorCQkJcmV0ID0gMDsKKwl9CisgICAgICBmcmVlX2poOgorCWlmIChyZXQgJiYgYmgtPmJfcHJpdmF0ZSkgeworCQlyZWlzZXJmc19mcmVlX2poKGJoKTsKKwl9CisJc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBjbG0gLS0gdGFrZW4gZnJvbSBmcy9idWZmZXIuYzpibG9ja19pbnZhbGlkYXRlX3BhZ2UgKi8KIHN0YXRpYyBpbnQgcmVpc2VyZnNfaW52YWxpZGF0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKmJoLCAqbmV4dDsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLSAgICB1bnNpZ25lZCBpbnQgY3Vycl9vZmYgPSAwOwotICAgIGludCByZXQgPSAxOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKmJoLCAqbmV4dDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBpbnQgY3Vycl9vZmYgPSAwOworCWludCByZXQgPSAxOwogCi0gICAgQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCi0gICAgaWYgKG9mZnNldCA9PSAwKQotCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7CisJaWYgKG9mZnNldCA9PSAwKQorCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwogCi0gICAgaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQotCWdvdG8gb3V0OworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJZ290byBvdXQ7CiAKLSAgICBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwotICAgIGJoID0gaGVhZDsKLSAgICBkbyB7Ci0JdW5zaWduZWQgaW50IG5leHRfb2ZmID0gY3Vycl9vZmYgKyBiaC0+Yl9zaXplOwotCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwliaCA9IGhlYWQ7CisJZG8geworCQl1bnNpZ25lZCBpbnQgbmV4dF9vZmYgPSBjdXJyX29mZiArIGJoLT5iX3NpemU7CisJCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisKKwkJLyoKKwkJICogaXMgdGhpcyBibG9jayBmdWxseSBpbnZhbGlkYXRlZD8KKwkJICovCisJCWlmIChvZmZzZXQgPD0gY3Vycl9vZmYpIHsKKwkJCWlmIChpbnZhbGlkYXRlcGFnZV9jYW5fZHJvcChpbm9kZSwgYmgpKQorCQkJCXJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCk7CisJCQllbHNlCisJCQkJcmV0ID0gMDsKKwkJfQorCQljdXJyX29mZiA9IG5leHRfb2ZmOworCQliaCA9IG5leHQ7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CiAKIAkvKgotCSAqIGlzIHRoaXMgYmxvY2sgZnVsbHkgaW52YWxpZGF0ZWQ/CisJICogV2UgcmVsZWFzZSBidWZmZXJzIG9ubHkgaWYgdGhlIGVudGlyZSBwYWdlIGlzIGJlaW5nIGludmFsaWRhdGVkLgorCSAqIFRoZSBnZXRfYmxvY2sgY2FjaGVkIHZhbHVlIGhhcyBiZWVuIHVuY29uZGl0aW9uYWxseSBpbnZhbGlkYXRlZCwKKwkgKiBzbyByZWFsIElPIGlzIG5vdCBwb3NzaWJsZSBhbnltb3JlLgogCSAqLwotCWlmIChvZmZzZXQgPD0gY3Vycl9vZmYpIHsKLQkgICAgaWYgKGludmFsaWRhdGVwYWdlX2Nhbl9kcm9wKGlub2RlLCBiaCkpCi0JCXJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCk7Ci0JICAgIGVsc2UKLQkgICAgICAgIHJldCA9IDA7Ci0JfQotCWN1cnJfb2ZmID0gbmV4dF9vZmY7Ci0JYmggPSBuZXh0OwotICAgIH0gd2hpbGUgKGJoICE9IGhlYWQpOwotCi0gICAgLyoKLSAgICAgKiBXZSByZWxlYXNlIGJ1ZmZlcnMgb25seSBpZiB0aGUgZW50aXJlIHBhZ2UgaXMgYmVpbmcgaW52YWxpZGF0ZWQuCi0gICAgICogVGhlIGdldF9ibG9jayBjYWNoZWQgdmFsdWUgaGFzIGJlZW4gdW5jb25kaXRpb25hbGx5IGludmFsaWRhdGVkLAotICAgICAqIHNvIHJlYWwgSU8gaXMgbm90IHBvc3NpYmxlIGFueW1vcmUuCi0gICAgICovCi0gICAgaWYgKCFvZmZzZXQgJiYgcmV0KQotCXJldCA9IHRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgMCk7Ci1vdXQ6Ci0gICAgcmV0dXJuIHJldDsKKwlpZiAoIW9mZnNldCAmJiByZXQpCisJCXJldCA9IHRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgMCk7CisgICAgICBvdXQ6CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCByZWlzZXJmc19zZXRfcGFnZV9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSkgewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwotICAgIGlmIChyZWlzZXJmc19maWxlX2RhdGFfbG9nKGlub2RlKSkgewotCVNldFBhZ2VDaGVja2VkKHBhZ2UpOwotCXJldHVybiBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhwYWdlKTsKLSAgICB9Ci0gICAgcmV0dXJuIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycyhwYWdlKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaWYgKHJlaXNlcmZzX2ZpbGVfZGF0YV9sb2coaW5vZGUpKSB7CisJCVNldFBhZ2VDaGVja2VkKHBhZ2UpOworCQlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMocGFnZSk7CisJfQorCXJldHVybiBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMocGFnZSk7CiB9CiAKIC8qCkBAIC0yNzE2LDE0MyArMjgzNCwxNTIgQEAKICAqLwogc3RhdGljIGludCByZWlzZXJmc19yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHVudXNlZF9nZnBfZmxhZ3MpCiB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3QgOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYikgOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7Ci0gICAgaW50IHJldCA9IDEgOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldCA9IDE7CiAKLSAgICBXQVJOX09OKFBhZ2VDaGVja2VkKHBhZ2UpKTsKLSAgICBzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7Ci0gICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSA7Ci0gICAgYmggPSBoZWFkIDsKLSAgICBkbyB7Ci0JaWYgKGJoLT5iX3ByaXZhdGUpIHsKLQkgICAgaWYgKCFidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfbG9ja2VkKGJoKSkgewotCQlyZWlzZXJmc19mcmVlX2poKGJoKTsKLQkgICAgfSBlbHNlIHsKLQkJcmV0ID0gMCA7Ci0JCWJyZWFrIDsKLQkgICAgfQotCX0KLQliaCA9IGJoLT5iX3RoaXNfcGFnZSA7Ci0gICAgfSB3aGlsZSAoYmggIT0gaGVhZCkgOwotICAgIGlmIChyZXQpCi0JcmV0ID0gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKSA7Ci0gICAgc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7Ci0gICAgcmV0dXJuIHJldCA7CisJV0FSTl9PTihQYWdlQ2hlY2tlZChwYWdlKSk7CisJc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwliaCA9IGhlYWQ7CisJZG8geworCQlpZiAoYmgtPmJfcHJpdmF0ZSkgeworCQkJaWYgKCFidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJCXJlaXNlcmZzX2ZyZWVfamgoYmgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCWlmIChyZXQpCisJCXJldCA9IHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7CisJc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBXZSB0aGFuayBNaW5nbWluZyBDYW8gZm9yIGhlbHBpbmcgdXMgdW5kZXJzdGFuZCBpbiBncmVhdCBkZXRhaWwgd2hhdAogICAgdG8gZG8gaW4gdGhpcyBzZWN0aW9uIG9mIHRoZSBjb2RlLiAqLwogc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQorCQkJCSAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCisJCQkJICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCiB7Ci0gICAgc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CiAKLSAgICByZXR1cm4gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAotCQkJb2Zmc2V0LCBucl9zZWdzLCByZWlzZXJmc19nZXRfYmxvY2tzX2RpcmVjdF9pbywgTlVMTCk7CisJcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKKwkJCQkgIG9mZnNldCwgbnJfc2VncywKKwkJCQkgIHJlaXNlcmZzX2dldF9ibG9ja3NfZGlyZWN0X2lvLCBOVUxMKTsKIH0KIAotaW50IHJlaXNlcmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlIDsKLSAgICBpbnQgZXJyb3IgOwotICAgIHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICAgIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgewotCS8qIHZlcnNpb24gMiBpdGVtcyB3aWxsIGJlIGNhdWdodCBieSB0aGUgc19tYXhieXRlcyBjaGVjawotCSoqIGRvbmUgZm9yIHVzIGluIHZtdHJ1bmNhdGUKLQkqLwotCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUgJiYKLQkgICAgYXR0ci0+aWFfc2l6ZSA+IE1BWF9OT05fTEZTKSB7Ci0JICAgIGVycm9yID0gLUVGQklHIDsKLQkgICAgZ290byBvdXQ7Ci0JfQotCS8qIGZpbGwgaW4gaG9sZSBwb2ludGVycyBpbiB0aGUgZXhwYW5kaW5nIHRydW5jYXRlIGNhc2UuICovCi0gICAgICAgIGlmIChhdHRyLT5pYV9zaXplID4gaW5vZGUtPmlfc2l6ZSkgewotCSAgICBlcnJvciA9IGdlbmVyaWNfY29udF9leHBhbmQoaW5vZGUsIGF0dHItPmlhX3NpemUpIDsKLQkgICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID4gMCkgewotCQlpbnQgZXJyOwotCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLQkJLyogd2UncmUgY2hhbmdpbmcgYXQgbW9zdCAyIGJpdG1hcHMsIGlub2RlICsgc3VwZXIgKi8KLQkJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCA0KSA7Ci0JCWlmICghZXJyKSB7Ci0JCSAgICByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jICgmdGgsIGlub2RlKTsKLQkJICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDQpIDsKLQkJfQotCQlpZiAoZXJyKQotCQkgICAgZXJyb3IgPSBlcnI7Ci0JICAgIH0KLQkgICAgaWYgKGVycm9yKQotCSAgICAgICAgZ290byBvdXQ7Ci0JfQotICAgIH0KLQotICAgIGlmICgoKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAmJiAoYXR0ci0+aWFfdWlkICYgfjB4ZmZmZikpIHx8Ci0JICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYgKGF0dHItPmlhX2dpZCAmIH4weGZmZmYpKSkgJiYKLQkoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpKSB7Ci0JCS8qIHN0YXQgZGF0YSBvZiBmb3JtYXQgdjMuNSBoYXMgMTYgYml0IHVpZCBhbmQgZ2lkICovCi0JICAgIGVycm9yID0gLUVJTlZBTDsKLQkgICAgZ290byBvdXQ7Ci0JfQotCi0gICAgZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpIDsKLSAgICBpZiAoIWVycm9yKSB7Ci0JaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8Ci0JICAgIChpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19jaG93bl94YXR0cnMgKGlub2RlLCBhdHRyKTsKLQotICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHsKLQkJICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0JCSAgICBpbnQgamJlZ2luX2NvdW50ID0gMiooUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoaW5vZGUtPmlfc2IpK1JFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKSsyOwotCi0JCSAgICAvKiAodXNlcitncm91cCkqKG9sZCtuZXcpIHN0cnVjdHVyZSAtIHdlIGNvdW50IHF1b3RhIGluZm8gYW5kICwgaW5vZGUgd3JpdGUgKHNiLCBpbm9kZSkgKi8KLQkJICAgIGVycm9yID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpOwotIAkJICAgIGlmIChlcnJvcikKLSAJCQlnb3RvIG91dDsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBEUVVPVF9UUkFOU0ZFUihpbm9kZSwgYXR0cikgPyAtRURRVU9UIDogMDsKLQkJICAgIGlmIChlcnJvcikgewotCQkJam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKK2ludCByZWlzZXJmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yOworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgeworCQkvKiB2ZXJzaW9uIDIgaXRlbXMgd2lsbCBiZSBjYXVnaHQgYnkgdGhlIHNfbWF4Ynl0ZXMgY2hlY2sKKwkJICoqIGRvbmUgZm9yIHVzIGluIHZtdHJ1bmNhdGUKKwkJICovCisJCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUgJiYKKwkJICAgIGF0dHItPmlhX3NpemUgPiBNQVhfTk9OX0xGUykgeworCQkJZXJyb3IgPSAtRUZCSUc7CiAJCQlnb3RvIG91dDsKLQkJICAgIH0KLQkJICAgIC8qIFVwZGF0ZSBjb3JyZXNwb25kaW5nIGluZm8gaW4gaW5vZGUgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCi0JCSAgICAgKiBvbmUgdHJhbnNhY3Rpb24gKi8KLQkJICAgIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKQotCQkJaW5vZGUtPmlfdWlkID0gYXR0ci0+aWFfdWlkOwotCQkgICAgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpCi0JCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7Ci0JCSAgICBtYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQkJICAgIGVycm9yID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAkJfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZXJyb3IpCi0gICAgICAgICAgICBlcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGF0dHIpIDsKLSAgICB9CisJCS8qIGZpbGwgaW4gaG9sZSBwb2ludGVycyBpbiB0aGUgZXhwYW5kaW5nIHRydW5jYXRlIGNhc2UuICovCisJCWlmIChhdHRyLT5pYV9zaXplID4gaW5vZGUtPmlfc2l6ZSkgeworCQkJZXJyb3IgPSBnZW5lcmljX2NvbnRfZXhwYW5kKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKKwkJCWlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKKwkJCQlpbnQgZXJyOworCQkJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJCQkJLyogd2UncmUgY2hhbmdpbmcgYXQgbW9zdCAyIGJpdG1hcHMsIGlub2RlICsgc3VwZXIgKi8KKwkJCQllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDQpOworCQkJCWlmICghZXJyKSB7CisJCQkJCXJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2MoJnRoLCBpbm9kZSk7CisJCQkJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDQpOworCQkJCX0KKwkJCQlpZiAoZXJyKQorCQkJCQllcnJvciA9IGVycjsKKwkJCX0KKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KIAorCWlmICgoKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAmJiAoYXR0ci0+aWFfdWlkICYgfjB4ZmZmZikpIHx8CisJICAgICAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmIChhdHRyLT5pYV9naWQgJiB+MHhmZmZmKSkpICYmCisJICAgIChnZXRfaW5vZGVfc2RfdmVyc2lvbihpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKSkgeworCQkvKiBzdGF0IGRhdGEgb2YgZm9ybWF0IHYzLjUgaGFzIDE2IGJpdCB1aWQgYW5kIGdpZCAqLworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KIAotICAgIGlmICghZXJyb3IgJiYgcmVpc2VyZnNfcG9zaXhhY2wgKGlub2RlLT5pX3NiKSkgewotICAgICAgICBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpCi0gICAgICAgICAgICBlcnJvciA9IHJlaXNlcmZzX2FjbF9jaG1vZCAoaW5vZGUpOwotICAgIH0KKwllcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cik7CisJaWYgKCFlcnJvcikgeworCQlpZiAoKGlhX3ZhbGlkICYgQVRUUl9VSUQgJiYgYXR0ci0+aWFfdWlkICE9IGlub2RlLT5pX3VpZCkgfHwKKwkJICAgIChpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpKSB7CisJCQllcnJvciA9IHJlaXNlcmZzX2Nob3duX3hhdHRycyhpbm9kZSwgYXR0cik7CiAKLW91dDoKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgIHJldHVybiBlcnJvciA7CisJCQlpZiAoIWVycm9yKSB7CisJCQkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwkJCQlpbnQgamJlZ2luX2NvdW50ID0KKwkJCQkgICAgMiAqCisJCQkJICAgIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikgKworCQkJCSAgICAgUkVJU0VSRlNfUVVPVEFfREVMX0JMT0NLUyhpbm9kZS0+aV9zYikpICsKKwkJCQkgICAgMjsKKworCQkJCS8qICh1c2VyK2dyb3VwKSoob2xkK25ldykgc3RydWN0dXJlIC0gd2UgY291bnQgcXVvdGEgaW5mbyBhbmQgLCBpbm9kZSB3cml0ZSAoc2IsIGlub2RlKSAqLworCQkJCWVycm9yID0KKwkJCQkgICAgam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLAorCQkJCQkJICBqYmVnaW5fY291bnQpOworCQkJCWlmIChlcnJvcikKKwkJCQkJZ290byBvdXQ7CisJCQkJZXJyb3IgPQorCQkJCSAgICBEUVVPVF9UUkFOU0ZFUihpbm9kZSwgYXR0cikgPyAtRURRVU9UIDogMDsKKwkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwKKwkJCQkJCSAgICBqYmVnaW5fY291bnQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyogVXBkYXRlIGNvcnJlc3BvbmRpbmcgaW5mbyBpbiBpbm9kZSBzbyB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4KKwkJCQkgKiBvbmUgdHJhbnNhY3Rpb24gKi8KKwkJCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkKKwkJCQkJaW5vZGUtPmlfdWlkID0gYXR0ci0+aWFfdWlkOworCQkJCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKQorCQkJCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7CisJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQkJZXJyb3IgPQorCQkJCSAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQkJfQorCQl9CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGF0dHIpOworCX0KKworCWlmICghZXJyb3IgJiYgcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKSB7CisJCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkKKwkJCWVycm9yID0gcmVpc2VyZnNfYWNsX2NobW9kKGlub2RlKTsKKwl9CisKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiBlcnJvcjsKIH0KIAotCi0KIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zID0gewotICAgIC53cml0ZXBhZ2UgPSByZWlzZXJmc193cml0ZXBhZ2UsCi0gICAgLnJlYWRwYWdlID0gcmVpc2VyZnNfcmVhZHBhZ2UsIAotICAgIC5yZWFkcGFnZXMgPSByZWlzZXJmc19yZWFkcGFnZXMsIAotICAgIC5yZWxlYXNlcGFnZSA9IHJlaXNlcmZzX3JlbGVhc2VwYWdlLAotICAgIC5pbnZhbGlkYXRlcGFnZSA9IHJlaXNlcmZzX2ludmFsaWRhdGVwYWdlLAotICAgIC5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCi0gICAgLnByZXBhcmVfd3JpdGUgPSByZWlzZXJmc19wcmVwYXJlX3dyaXRlLAotICAgIC5jb21taXRfd3JpdGUgPSByZWlzZXJmc19jb21taXRfd3JpdGUsCi0gICAgLmJtYXAgPSByZWlzZXJmc19hb3BfYm1hcCwKLSAgICAuZGlyZWN0X0lPID0gcmVpc2VyZnNfZGlyZWN0X0lPLAotICAgIC5zZXRfcGFnZV9kaXJ0eSA9IHJlaXNlcmZzX3NldF9wYWdlX2RpcnR5LAotfSA7CisJLndyaXRlcGFnZSA9IHJlaXNlcmZzX3dyaXRlcGFnZSwKKwkucmVhZHBhZ2UgPSByZWlzZXJmc19yZWFkcGFnZSwKKwkucmVhZHBhZ2VzID0gcmVpc2VyZnNfcmVhZHBhZ2VzLAorCS5yZWxlYXNlcGFnZSA9IHJlaXNlcmZzX3JlbGVhc2VwYWdlLAorCS5pbnZhbGlkYXRlcGFnZSA9IHJlaXNlcmZzX2ludmFsaWRhdGVwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUgPSByZWlzZXJmc19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUgPSByZWlzZXJmc19jb21taXRfd3JpdGUsCisJLmJtYXAgPSByZWlzZXJmc19hb3BfYm1hcCwKKwkuZGlyZWN0X0lPID0gcmVpc2VyZnNfZGlyZWN0X0lPLAorCS5zZXRfcGFnZV9kaXJ0eSA9IHJlaXNlcmZzX3NldF9wYWdlX2RpcnR5LAorfTsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lvY3RsLmMgYi9mcy9yZWlzZXJmcy9pb2N0bC5jCmluZGV4IDc2Y2FlZGYuLjgxZmMwMDIgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2lvY3RsLmMKKysrIGIvZnMvcmVpc2VyZnMvaW9jdGwuYwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAotc3RhdGljIGludCByZWlzZXJmc191bnBhY2sgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApOworc3RhdGljIGludCByZWlzZXJmc191bnBhY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogCiAvKgogKiogcmVpc2VyZnNfaW9jdGwgLSBoYW5kbGVyIGZvciBpb2N0bCBmb3IgaW5vZGUKQEAgLTE5LDY5ICsxOSw3MiBAQAogKiogIDIpIFJFSVNFUkZTX0lPQ19bR1NdRVRGTEFHUywgUkVJU0VSRlNfSU9DX1tHU11FVFZFUlNJT04KICoqICAzKSBUaGF0J3MgYWxsIGZvciBhIHdoaWxlIC4uLgogKi8KLWludCByZWlzZXJmc19pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgdW5zaWduZWQgaW50IGNtZCwKLQkJdW5zaWduZWQgbG9uZyBhcmcpCitpbnQgcmVpc2VyZnNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXVuc2lnbmVkIGludCBmbGFnczsKIAogCXN3aXRjaCAoY21kKSB7Ci0JICAgIGNhc2UgUkVJU0VSRlNfSU9DX1VOUEFDSzoKLQkJaWYoIFNfSVNSRUcoIGlub2RlIC0+IGlfbW9kZSApICkgewotCQlpZiAoYXJnKQotCQkgICAgcmV0dXJuIHJlaXNlcmZzX3VucGFjayAoaW5vZGUsIGZpbHApOworCWNhc2UgUkVJU0VSRlNfSU9DX1VOUEFDSzoKKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWlmIChhcmcpCisJCQkJcmV0dXJuIHJlaXNlcmZzX3VucGFjayhpbm9kZSwgZmlscCk7CiAJCQllbHNlCiAJCQkJcmV0dXJuIDA7CiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FTk9UVFk7Ci0JLyogZm9sbG93aW5nIHR3byBjYXNlcyBhcmUgdGFrZW4gZnJvbSBmcy9leHQyL2lvY3RsLmMgYnkgUmVteQotCSAgIENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpICovCisJCS8qIGZvbGxvd2luZyB0d28gY2FzZXMgYXJlIHRha2VuIGZyb20gZnMvZXh0Mi9pb2N0bC5jIGJ5IFJlbXkKKwkJICAgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikgKi8KIAljYXNlIFJFSVNFUkZTX0lPQ19HRVRGTEFHUzoKLQkJaWYgKCFyZWlzZXJmc19hdHRycyAoaW5vZGUtPmlfc2IpKQorCQlpZiAoIXJlaXNlcmZzX2F0dHJzKGlub2RlLT5pX3NiKSkKIAkJCXJldHVybiAtRU5PVFRZOwogCi0JCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRyczsKLQkJaV9hdHRyc190b19zZF9hdHRycyggaW5vZGUsICggX191MTYgKiApICZmbGFncyApOwotCQlyZXR1cm4gcHV0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZyk7Ci0JY2FzZSBSRUlTRVJGU19JT0NfU0VURkxBR1M6IHsKLQkJaWYgKCFyZWlzZXJmc19hdHRycyAoaW5vZGUtPmlfc2IpKQotCQkJcmV0dXJuIC1FTk9UVFk7CisJCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnM7CisJCWlfYXR0cnNfdG9fc2RfYXR0cnMoaW5vZGUsIChfX3UxNiAqKSAmIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKWFyZyk7CisJY2FzZSBSRUlTRVJGU19JT0NfU0VURkxBR1M6eworCQkJaWYgKCFyZWlzZXJmc19hdHRycyhpbm9kZS0+aV9zYikpCisJCQkJcmV0dXJuIC1FTk9UVFk7CiAKLQkJaWYgKElTX1JET05MWShpbm9kZSkpCi0JCQlyZXR1cm4gLUVST0ZTOworCQkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQkJcmV0dXJuIC1FUk9GUzsKIAotCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCi0JCQlyZXR1cm4gLUVQRVJNOworCQkJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpCisJCQkgICAgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQkJcmV0dXJuIC1FUEVSTTsKIAotCQlpZiAoZ2V0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChnZXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCi0JCWlmICggKCAoIGZsYWdzIF4gUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRycykgJiAoIFJFSVNFUkZTX0lNTVVUQUJMRV9GTCB8IFJFSVNFUkZTX0FQUEVORF9GTCkpICYmCi0JCSAgICAgIWNhcGFibGUoIENBUF9MSU5VWF9JTU1VVEFCTEUgKSApCi0JCQlyZXR1cm4gLUVQRVJNOwotCQkJCi0JCWlmKCAoIGZsYWdzICYgUkVJU0VSRlNfTk9UQUlMX0ZMICkgJiYKLQkJICAgIFNfSVNSRUcoIGlub2RlIC0+IGlfbW9kZSApICkgeworCQkJaWYgKCgoZmxhZ3MgXiBSRUlTRVJGU19JKGlub2RlKS0+CisJCQkgICAgICBpX2F0dHJzKSAmIChSRUlTRVJGU19JTU1VVEFCTEVfRkwgfAorCQkJCQkgIFJFSVNFUkZTX0FQUEVORF9GTCkpCisJCQkgICAgJiYgIWNhcGFibGUoQ0FQX0xJTlVYX0lNTVVUQUJMRSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJaWYgKChmbGFncyAmIFJFSVNFUkZTX05PVEFJTF9GTCkgJiYKKwkJCSAgICBTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CiAJCQkJaW50IHJlc3VsdDsKIAotCQkJCXJlc3VsdCA9IHJlaXNlcmZzX3VucGFjayggaW5vZGUsIGZpbHAgKTsKLQkJCQlpZiggcmVzdWx0ICkKKwkJCQlyZXN1bHQgPSByZWlzZXJmc191bnBhY2soaW5vZGUsIGZpbHApOworCQkJCWlmIChyZXN1bHQpCiAJCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlzZF9hdHRyc190b19pX2F0dHJzKGZsYWdzLCBpbm9kZSk7CisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycyA9IGZsYWdzOworCQkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQlyZXR1cm4gMDsKIAkJfQotCQlzZF9hdHRyc190b19pX2F0dHJzKCBmbGFncywgaW5vZGUgKTsKLQkJUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRycyA9IGZsYWdzOwotCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCQlyZXR1cm4gMDsKLQl9CiAJY2FzZSBSRUlTRVJGU19JT0NfR0VUVkVSU0lPTjoKLQkJcmV0dXJuIHB1dF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZyk7CisJCXJldHVybiBwdXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKWFyZyk7CiAJY2FzZSBSRUlTRVJGU19JT0NfU0VUVkVSU0lPTjoKIAkJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQogCQkJcmV0dXJuIC1FUEVSTTsKIAkJaWYgKElTX1JET05MWShpbm9kZSkpCiAJCQlyZXR1cm4gLUVST0ZTOwotCQlpZiAoZ2V0X3VzZXIoaW5vZGUtPmlfZ2VuZXJhdGlvbiwgKGludCBfX3VzZXIgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwkKKwkJaWYgKGdldF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQlyZXR1cm4gMDsKQEAgLTk1LDYzICs5OCw2NSBAQAogKiogRnVuY3Rpb24gdHJ5IHRvIGNvbnZlcnQgdGFpbCBmcm9tIGRpcmVjdCBpdGVtIGludG8gaW5kaXJlY3QuCiAqKiBJdCBzZXQgdXAgbm9wYWNrIGF0dHJpYnV0ZSBpbiB0aGUgUkVJU0VSRlNfSShpbm9kZSktPm5vcGFjawogKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQorc3RhdGljIGludCByZWlzZXJmc191bnBhY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0gICAgaW50IHJldHZhbCA9IDA7Ci0gICAgaW50IGluZGV4IDsKLSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSA7Ci0gICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgOwotICAgIHVuc2lnbmVkIGxvbmcgd3JpdGVfZnJvbSA7Ci0gICAgdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgOwotICAgIAkKLSAgICBpZiAoaW5vZGUtPmlfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7Ci0gICAgICAgIHJldHVybiAwIDsKLSAgICB9Ci0gICAgLyogaW9jdGwgYWxyZWFkeSBkb25lICovCi0gICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykgewotICAgICAgICByZXR1cm4gMCA7Ci0gICAgfQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWludCByZXR2YWwgPSAwOworCWludCBpbmRleDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwl1bnNpZ25lZCBsb25nIHdyaXRlX2Zyb207CisJdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAKLSAgICAvKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBub2JvZHkgaXMgY2hhbmdpbmcgdGhlIGZpbGUgc2l6ZSBiZW5lYXRoCi0gICAgKiogdXMKLSAgICAqLwotICAgIGRvd24oJmlub2RlLT5pX3NlbSkgOworCWlmIChpbm9kZS0+aV9zaXplID09IDApIHsKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9ub3BhY2tfbWFzazsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGlvY3RsIGFscmVhZHkgZG9uZSAqLworCWlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2spIHsKKwkJcmV0dXJuIDA7CisJfQorCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwogCi0gICAgd3JpdGVfZnJvbSA9IGlub2RlLT5pX3NpemUgJiAoYmxvY2tzaXplIC0gMSkgOwotICAgIC8qIGlmIHdlIGFyZSBvbiBhIGJsb2NrIGJvdW5kYXJ5LCB3ZSBhcmUgYWxyZWFkeSB1bnBhY2tlZC4gICovCi0gICAgaWYgKCB3cml0ZV9mcm9tID09IDApIHsKKwkvKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBub2JvZHkgaXMgY2hhbmdpbmcgdGhlIGZpbGUgc2l6ZSBiZW5lYXRoCisJICoqIHVzCisJICovCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKworCXdyaXRlX2Zyb20gPSBpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpOworCS8qIGlmIHdlIGFyZSBvbiBhIGJsb2NrIGJvdW5kYXJ5LCB3ZSBhcmUgYWxyZWFkeSB1bnBhY2tlZC4gICovCisJaWYgKHdyaXRlX2Zyb20gPT0gMCkgeworCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB3ZSB1bnBhY2sgYnkgZmluZGluZyB0aGUgcGFnZSB3aXRoIHRoZSB0YWlsLCBhbmQgY2FsbGluZworCSAqKiByZWlzZXJmc19wcmVwYXJlX3dyaXRlIG9uIHRoYXQgcGFnZS4gIFRoaXMgd2lsbCBmb3JjZSBhIAorCSAqKiByZWlzZXJmc19nZXRfYmxvY2sgdG8gdW5wYWNrIHRoZSB0YWlsIGZvciB1cy4KKwkgKi8KKwlpbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwltYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlyZXR2YWwgPSAtRU5PTUVNOworCWlmICghcGFnZSkgeworCQlnb3RvIG91dDsKKwl9CisJcmV0dmFsID0KKwkgICAgbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgd3JpdGVfZnJvbSwgd3JpdGVfZnJvbSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyogY29udmVyc2lvbiBjYW4gY2hhbmdlIHBhZ2UgY29udGVudHMsIG11c3QgZmx1c2ggKi8KKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlyZXR2YWwgPQorCSAgICBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIHdyaXRlX2Zyb20sIHdyaXRlX2Zyb20pOwogCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7Ci0JZ290byBvdXQgOwotICAgIH0KIAotICAgIC8qIHdlIHVucGFjayBieSBmaW5kaW5nIHRoZSBwYWdlIHdpdGggdGhlIHRhaWwsIGFuZCBjYWxsaW5nCi0gICAgKiogcmVpc2VyZnNfcHJlcGFyZV93cml0ZSBvbiB0aGF0IHBhZ2UuICBUaGlzIHdpbGwgZm9yY2UgYSAKLSAgICAqKiByZWlzZXJmc19nZXRfYmxvY2sgdG8gdW5wYWNrIHRoZSB0YWlsIGZvciB1cy4KLSAgICAqLwotICAgIGluZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUIDsKLSAgICBtYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZyA7Ci0gICAgcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCkgOwotICAgIHJldHZhbCA9IC1FTk9NRU07Ci0gICAgaWYgKCFwYWdlKSB7Ci0gICAgICAgIGdvdG8gb3V0IDsKLSAgICB9Ci0gICAgcmV0dmFsID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgd3JpdGVfZnJvbSwgd3JpdGVfZnJvbSkgOwotICAgIGlmIChyZXR2YWwpCi0gICAgICAgIGdvdG8gb3V0X3VubG9jayA7CisgICAgICBvdXRfdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAotICAgIC8qIGNvbnZlcnNpb24gY2FuIGNoYW5nZSBwYWdlIGNvbnRlbnRzLCBtdXN0IGZsdXNoICovCi0gICAgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkgOwotICAgIHJldHZhbCA9IG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgd3JpdGVfZnJvbSwgd3JpdGVfZnJvbSkgOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7Ci0KLW91dF91bmxvY2s6Ci0gICAgdW5sb2NrX3BhZ2UocGFnZSkgOwotICAgIHBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKSA7Ci0KLW91dDoKLSAgICB1cCgmaW5vZGUtPmlfc2VtKSA7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0dmFsOworICAgICAgb3V0OgorCXVwKCZpbm9kZS0+aV9zZW0pOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2l0ZW1fb3BzLmMgYi9mcy9yZWlzZXJmcy9pdGVtX29wcy5jCmluZGV4IDBjZTMzZGIuLmUyMzdjZDYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2l0ZW1fb3BzLmMKKysrIGIvZnMvcmVpc2VyZnMvaXRlbV9vcHMuYwpAQCAtMTQsNzc2ICsxNCw3NDEgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gc3RhdCBkYXRhIGZ1bmN0aW9ucwogLy8KLXN0YXRpYyBpbnQgc2RfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQorc3RhdGljIGludCBzZF9ieXRlc19udW1iZXIoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBibG9ja19zaXplKQogewotICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2RfZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzZF9kZWNyZW1lbnRfa2V5KHN0cnVjdCBjcHVfa2V5ICprZXkpCiB7Ci0gICAga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkIC0tOwotICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCBUWVBFX0FOWSk7Ci0gICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoa2V5LCAobG9mZl90KSgtMSkpOworCWtleS0+b25fZGlza19rZXkua19vYmplY3RpZC0tOworCXNldF9jcHVfa2V5X2tfdHlwZShrZXksIFRZUEVfQU5ZKTsKKwlzZXRfY3B1X2tleV9rX29mZnNldChrZXksIChsb2ZmX3QpICgtMSkpOwogfQogCi1zdGF0aWMgaW50IHNkX2lzX2xlZnRfbWVyZ2VhYmxlIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQorc3RhdGljIGludCBzZF9pc19sZWZ0X21lcmdlYWJsZShzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXksIHVuc2lnbmVkIGxvbmcgYnNpemUpCiB7Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQotCi1zdGF0aWMgY2hhciAqIHByaW50X3RpbWUgKHRpbWVfdCB0KQorc3RhdGljIGNoYXIgKnByaW50X3RpbWUodGltZV90IHQpCiB7Ci0gICAgc3RhdGljIGNoYXIgdGltZWJ1ZlsyNTZdOworCXN0YXRpYyBjaGFyIHRpbWVidWZbMjU2XTsKIAotICAgIHNwcmludGYgKHRpbWVidWYsICIlbGQiLCB0KTsKLSAgICByZXR1cm4gdGltZWJ1ZjsKKwlzcHJpbnRmKHRpbWVidWYsICIlbGQiLCB0KTsKKwlyZXR1cm4gdGltZWJ1ZjsKIH0KIAotCi1zdGF0aWMgdm9pZCBzZF9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgc2RfcHJpbnRfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICBwcmludGsgKCJcdG1vZGUgfCBzaXplIHwgbmxpbmtzIHwgZmlyc3QgZGlyZWN0IHwgbXRpbWVcbiIpOwotICAgIGlmIChzdGF0X2RhdGFfdjEgKGloKSkgewotICAgICAgCXN0cnVjdCBzdGF0X2RhdGFfdjEgKiBzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopaXRlbTsKKwlwcmludGsoIlx0bW9kZSB8IHNpemUgfCBubGlua3MgfCBmaXJzdCBkaXJlY3QgfCBtdGltZVxuIik7CisJaWYgKHN0YXRfZGF0YV92MShpaCkpIHsKKwkJc3RydWN0IHN0YXRfZGF0YV92MSAqc2QgPSAoc3RydWN0IHN0YXRfZGF0YV92MSAqKWl0ZW07CiAKLQlwcmludGsgKCJcdDAlLTZvIHwgJTZ1IHwgJTJ1IHwgJWQgfCAlc1xuIiwgc2RfdjFfbW9kZShzZCksCi0gICAgICAgICAgICAgICAgc2RfdjFfc2l6ZShzZCksIHNkX3YxX25saW5rKHNkKSwgc2RfdjFfZmlyc3RfZGlyZWN0X2J5dGUoc2QpLAotICAgICAgICAgICAgICAgIHByaW50X3RpbWUoIHNkX3YxX210aW1lKHNkKSApICk7Ci0gICAgfSBlbHNlIHsKLQlzdHJ1Y3Qgc3RhdF9kYXRhICogc2QgPSAoc3RydWN0IHN0YXRfZGF0YSAqKWl0ZW07CisJCXByaW50aygiXHQwJS02byB8ICU2dSB8ICUydSB8ICVkIHwgJXNcbiIsIHNkX3YxX21vZGUoc2QpLAorCQkgICAgICAgc2RfdjFfc2l6ZShzZCksIHNkX3YxX25saW5rKHNkKSwKKwkJICAgICAgIHNkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkKSwKKwkJICAgICAgIHByaW50X3RpbWUoc2RfdjFfbXRpbWUoc2QpKSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHN0YXRfZGF0YSAqc2QgPSAoc3RydWN0IHN0YXRfZGF0YSAqKWl0ZW07CiAKLQlwcmludGsgKCJcdDAlLTZvIHwgJTZMdSB8ICUydSB8ICVkIHwgJXNcbiIsIHNkX3YyX21vZGUoc2QpLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZF92Ml9zaXplKHNkKSwgc2RfdjJfbmxpbmsoc2QpLAotICAgICAgICAgICAgc2RfdjJfcmRldihzZCksIHByaW50X3RpbWUoc2RfdjJfbXRpbWUoc2QpKSk7Ci0gICAgfQorCQlwcmludGsoIlx0MCUtNm8gfCAlNkx1IHwgJTJ1IHwgJWQgfCAlc1xuIiwgc2RfdjJfbW9kZShzZCksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNkX3YyX3NpemUoc2QpLCBzZF92Ml9ubGluayhzZCksCisJCSAgICAgICBzZF92Ml9yZGV2KHNkKSwgcHJpbnRfdGltZShzZF92Ml9tdGltZShzZCkpKTsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIHNkX2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCitzdGF0aWMgdm9pZCBzZF9jaGVja19pdGVtKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjaGFyICppdGVtKQogewotICAgIC8vIEZJWE1FOiB0eXBlIHNvbWV0aGluZyBoZXJlIQorCS8vIEZJWE1FOiB0eXBlIHNvbWV0aGluZyBoZXJlIQogfQogCi0KLXN0YXRpYyBpbnQgc2RfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCi0JCQkgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJCSBpbnQgaXNfYWZmZWN0ZWQsIAotCQkJIGludCBpbnNlcnRfc2l6ZSkKK3N0YXRpYyBpbnQgc2RfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksCisJCQlpbnQgaXNfYWZmZWN0ZWQsIGludCBpbnNlcnRfc2l6ZSkKIHsKLSAgICB2aS0+dmlfaW5kZXggPSBUWVBFX1NUQVRfREFUQTsKLSAgICAvL3ZpLT52aV90eXBlIHw9IFZJX1RZUEVfU1RBVF9EQVRBOy8vIG5vdCBuZWVkZWQ/Ci0gICAgcmV0dXJuIDA7CisJdmktPnZpX2luZGV4ID0gVFlQRV9TVEFUX0RBVEE7CisJLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX1NUQVRfREFUQTsvLyBub3QgbmVlZGVkPworCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgc2RfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwgCi0JCQkgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCitzdGF0aWMgaW50IHNkX2NoZWNrX2xlZnQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlLAorCQkJIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCiB7Ci0gICAgaWYgKHN0YXJ0X3NraXAgfHwgZW5kX3NraXApCi0JQlVHICgpOwotICAgIHJldHVybiAtMTsKKwlpZiAoc3RhcnRfc2tpcCB8fCBlbmRfc2tpcCkKKwkJQlVHKCk7CisJcmV0dXJuIC0xOwogfQogCi0KLXN0YXRpYyBpbnQgc2RfY2hlY2tfcmlnaHQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUpCitzdGF0aWMgaW50IHNkX2NoZWNrX3JpZ2h0KHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZnJlZSkKIHsKLSAgICByZXR1cm4gLTE7CisJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IHNkX3BhcnRfc2l6ZSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgc2RfcGFydF9zaXplKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKIHsKLSAgICBpZiAoY291bnQpCi0JQlVHICgpOwotICAgIHJldHVybiAwOworCWlmIChjb3VudCkKKwkJQlVHKCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2RfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyBpbnQgc2RfdW5pdF9udW0oc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7CisJcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7CiB9CiAKLQotc3RhdGljIHZvaWQgc2RfcHJpbnRfdmkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyB2b2lkIHNkX3ByaW50X3ZpKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJTVEFUREFUQSwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAotCQkgICAgICB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgIlNUQVREQVRBLCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCIsCisJCQkgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgc3RhdF9kYXRhX29wcyA9IHsKLQkuYnl0ZXNfbnVtYmVyCQk9IHNkX2J5dGVzX251bWJlciwKLQkuZGVjcmVtZW50X2tleQkJPSBzZF9kZWNyZW1lbnRfa2V5LAotCS5pc19sZWZ0X21lcmdlYWJsZQk9IHNkX2lzX2xlZnRfbWVyZ2VhYmxlLAotCS5wcmludF9pdGVtCQk9IHNkX3ByaW50X2l0ZW0sCi0JLmNoZWNrX2l0ZW0JCT0gc2RfY2hlY2tfaXRlbSwKKwkuYnl0ZXNfbnVtYmVyID0gc2RfYnl0ZXNfbnVtYmVyLAorCS5kZWNyZW1lbnRfa2V5ID0gc2RfZGVjcmVtZW50X2tleSwKKwkuaXNfbGVmdF9tZXJnZWFibGUgPSBzZF9pc19sZWZ0X21lcmdlYWJsZSwKKwkucHJpbnRfaXRlbSA9IHNkX3ByaW50X2l0ZW0sCisJLmNoZWNrX2l0ZW0gPSBzZF9jaGVja19pdGVtLAogCi0JLmNyZWF0ZV92aQkJPSBzZF9jcmVhdGVfdmksCi0JLmNoZWNrX2xlZnQJCT0gc2RfY2hlY2tfbGVmdCwKLQkuY2hlY2tfcmlnaHQJCT0gc2RfY2hlY2tfcmlnaHQsCi0JLnBhcnRfc2l6ZQkJPSBzZF9wYXJ0X3NpemUsCi0JLnVuaXRfbnVtCQk9IHNkX3VuaXRfbnVtLAotCS5wcmludF92aQkJPSBzZF9wcmludF92aQorCS5jcmVhdGVfdmkgPSBzZF9jcmVhdGVfdmksCisJLmNoZWNrX2xlZnQgPSBzZF9jaGVja19sZWZ0LAorCS5jaGVja19yaWdodCA9IHNkX2NoZWNrX3JpZ2h0LAorCS5wYXJ0X3NpemUgPSBzZF9wYXJ0X3NpemUsCisJLnVuaXRfbnVtID0gc2RfdW5pdF9udW0sCisJLnByaW50X3ZpID0gc2RfcHJpbnRfdmkKIH07CiAKLQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIGRpcmVjdCBpdGVtIGZ1bmN0aW9ucwogLy8KLXN0YXRpYyBpbnQgZGlyZWN0X2J5dGVzX251bWJlciAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSkKK3N0YXRpYyBpbnQgZGlyZWN0X2J5dGVzX251bWJlcihzdHJ1Y3QgaXRlbV9oZWFkICppaCwgaW50IGJsb2NrX3NpemUpCiB7Ci0gIHJldHVybiBpaF9pdGVtX2xlbihpaCk7CisJcmV0dXJuIGloX2l0ZW1fbGVuKGloKTsKIH0KIAotCiAvLyBGSVhNRTogdGhpcyBzaG91bGQgcHJvYmFibHkgc3dpdGNoIHRvIGluZGlyZWN0IGFzIHdlbGwKLXN0YXRpYyB2b2lkIGRpcmVjdF9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3N0YXRpYyB2b2lkIGRpcmVjdF9kZWNyZW1lbnRfa2V5KHN0cnVjdCBjcHVfa2V5ICprZXkpCiB7Ci0gICAgY3B1X2tleV9rX29mZnNldF9kZWMgKGtleSk7Ci0gICAgaWYgKGNwdV9rZXlfa19vZmZzZXQgKGtleSkgPT0gMCkKLQlzZXRfY3B1X2tleV9rX3R5cGUgKGtleSwgVFlQRV9TVEFUX0RBVEEpOwkKKwljcHVfa2V5X2tfb2Zmc2V0X2RlYyhrZXkpOworCWlmIChjcHVfa2V5X2tfb2Zmc2V0KGtleSkgPT0gMCkKKwkJc2V0X2NwdV9rZXlfa190eXBlKGtleSwgVFlQRV9TVEFUX0RBVEEpOwogfQogCi0KLXN0YXRpYyBpbnQgZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQorc3RhdGljIGludCBkaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUoc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGJzaXplKQogewotICAgIGludCB2ZXJzaW9uID0gbGVfa2V5X3ZlcnNpb24gKGtleSk7Ci0gICAgcmV0dXJuICgobGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBrZXkpICYgKGJzaXplIC0gMSkpICE9IDEpOworCWludCB2ZXJzaW9uID0gbGVfa2V5X3ZlcnNpb24oa2V5KTsKKwlyZXR1cm4gKChsZV9rZXlfa19vZmZzZXQodmVyc2lvbiwga2V5KSAmIChic2l6ZSAtIDEpKSAhPSAxKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBkaXJlY3RfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIGRpcmVjdF9wcmludF9pdGVtKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjaGFyICppdGVtKQogewotICAgIGludCBqID0gMDsKKwlpbnQgaiA9IDA7CiAKIC8vICAgIHJldHVybjsKLSAgICBwcmludGsgKCJcIiIpOwotICAgIHdoaWxlIChqIDwgaWhfaXRlbV9sZW4oaWgpKQotCXByaW50ayAoIiVjIiwgaXRlbVtqKytdKTsKLSAgICBwcmludGsgKCJcIlxuIik7CisJcHJpbnRrKCJcIiIpOworCXdoaWxlIChqIDwgaWhfaXRlbV9sZW4oaWgpKQorCQlwcmludGsoIiVjIiwgaXRlbVtqKytdKTsKKwlwcmludGsoIlwiXG4iKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBkaXJlY3RfY2hlY2tfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIGRpcmVjdF9jaGVja19pdGVtKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjaGFyICppdGVtKQogewotICAgIC8vIEZJWE1FOiB0eXBlIHNvbWV0aGluZyBoZXJlIQorCS8vIEZJWE1FOiB0eXBlIHNvbWV0aGluZyBoZXJlIQogfQogCi0KLXN0YXRpYyBpbnQgZGlyZWN0X2NyZWF0ZV92aSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLAotCQkJICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIAotCQkJICAgICBpbnQgaXNfYWZmZWN0ZWQsIAotCQkJICAgICBpbnQgaW5zZXJ0X3NpemUpCitzdGF0aWMgaW50IGRpcmVjdF9jcmVhdGVfdmkoc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4sCisJCQkgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksCisJCQkgICAgaW50IGlzX2FmZmVjdGVkLCBpbnQgaW5zZXJ0X3NpemUpCiB7Ci0gICAgdmktPnZpX2luZGV4ID0gVFlQRV9ESVJFQ1Q7Ci0gICAgLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0RJUkVDVDsKLSAgICByZXR1cm4gMDsKKwl2aS0+dmlfaW5kZXggPSBUWVBFX0RJUkVDVDsKKwkvL3ZpLT52aV90eXBlIHw9IFZJX1RZUEVfRElSRUNUOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRpcmVjdF9jaGVja19sZWZ0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLAotCQkJICAgICAgaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKK3N0YXRpYyBpbnQgZGlyZWN0X2NoZWNrX2xlZnQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlLAorCQkJICAgICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQogewotICAgIGludCBieXRlczsKKwlpbnQgYnl0ZXM7CiAKLSAgICBieXRlcyA9IGZyZWUgLSBmcmVlICUgODsKLSAgICByZXR1cm4gYnl0ZXMgPzogLTE7ICAgIAorCWJ5dGVzID0gZnJlZSAtIGZyZWUgJSA4OworCXJldHVybiBieXRlcyA/IDogLTE7CiB9CiAKLQotc3RhdGljIGludCBkaXJlY3RfY2hlY2tfcmlnaHQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUpCitzdGF0aWMgaW50IGRpcmVjdF9jaGVja19yaWdodChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUpCiB7Ci0gICAgcmV0dXJuIGRpcmVjdF9jaGVja19sZWZ0ICh2aSwgZnJlZSwgMCwgMCk7CisJcmV0dXJuIGRpcmVjdF9jaGVja19sZWZ0KHZpLCBmcmVlLCAwLCAwKTsKIH0KIAotc3RhdGljIGludCBkaXJlY3RfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IGNvdW50KQorc3RhdGljIGludCBkaXJlY3RfcGFydF9zaXplKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKIHsKLSAgICByZXR1cm4gY291bnQ7CisJcmV0dXJuIGNvdW50OwogfQogCi0KLXN0YXRpYyBpbnQgZGlyZWN0X3VuaXRfbnVtIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgaW50IGRpcmVjdF91bml0X251bShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICByZXR1cm4gdmktPnZpX2l0ZW1fbGVuIC0gSUhfU0laRTsKKwlyZXR1cm4gdmktPnZpX2l0ZW1fbGVuIC0gSUhfU0laRTsKIH0KIAotCi1zdGF0aWMgdm9pZCBkaXJlY3RfcHJpbnRfdmkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyB2b2lkIGRpcmVjdF9wcmludF92aShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiRElSRUNULCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCIsCi0JCSAgICAgIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCk7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiRElSRUNULCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCIsCisJCQkgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgZGlyZWN0X29wcyA9IHsKLQkuYnl0ZXNfbnVtYmVyCQk9IGRpcmVjdF9ieXRlc19udW1iZXIsCi0JLmRlY3JlbWVudF9rZXkJCT0gZGlyZWN0X2RlY3JlbWVudF9rZXksCi0JLmlzX2xlZnRfbWVyZ2VhYmxlCT0gZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlLAotCS5wcmludF9pdGVtCQk9IGRpcmVjdF9wcmludF9pdGVtLAotCS5jaGVja19pdGVtCQk9IGRpcmVjdF9jaGVja19pdGVtLAorCS5ieXRlc19udW1iZXIgPSBkaXJlY3RfYnl0ZXNfbnVtYmVyLAorCS5kZWNyZW1lbnRfa2V5ID0gZGlyZWN0X2RlY3JlbWVudF9rZXksCisJLmlzX2xlZnRfbWVyZ2VhYmxlID0gZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlLAorCS5wcmludF9pdGVtID0gZGlyZWN0X3ByaW50X2l0ZW0sCisJLmNoZWNrX2l0ZW0gPSBkaXJlY3RfY2hlY2tfaXRlbSwKIAotCS5jcmVhdGVfdmkJCT0gZGlyZWN0X2NyZWF0ZV92aSwKLQkuY2hlY2tfbGVmdAkJPSBkaXJlY3RfY2hlY2tfbGVmdCwKLQkuY2hlY2tfcmlnaHQJCT0gZGlyZWN0X2NoZWNrX3JpZ2h0LAotCS5wYXJ0X3NpemUJCT0gZGlyZWN0X3BhcnRfc2l6ZSwKLQkudW5pdF9udW0JCT0gZGlyZWN0X3VuaXRfbnVtLAotCS5wcmludF92aQkJPSBkaXJlY3RfcHJpbnRfdmkKKwkuY3JlYXRlX3ZpID0gZGlyZWN0X2NyZWF0ZV92aSwKKwkuY2hlY2tfbGVmdCA9IGRpcmVjdF9jaGVja19sZWZ0LAorCS5jaGVja19yaWdodCA9IGRpcmVjdF9jaGVja19yaWdodCwKKwkucGFydF9zaXplID0gZGlyZWN0X3BhcnRfc2l6ZSwKKwkudW5pdF9udW0gPSBkaXJlY3RfdW5pdF9udW0sCisJLnByaW50X3ZpID0gZGlyZWN0X3ByaW50X3ZpCiB9OwogCi0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBpbmRpcmVjdCBpdGVtIGZ1bmN0aW9ucwogLy8KIAotc3RhdGljIGludCBpbmRpcmVjdF9ieXRlc19udW1iZXIgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpCitzdGF0aWMgaW50IGluZGlyZWN0X2J5dGVzX251bWJlcihzdHJ1Y3QgaXRlbV9oZWFkICppaCwgaW50IGJsb2NrX3NpemUpCiB7Ci0gIHJldHVybiBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSAqIGJsb2NrX3NpemU7IC8vLSBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpOworCXJldHVybiBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSAqIGJsb2NrX3NpemU7CS8vLSBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpOwogfQogCi0KIC8vIGRlY3JlYXNlIG9mZnNldCwgaWYgaXQgYmVjb21lcyAwLCBjaGFuZ2UgdHlwZSB0byBzdGF0IGRhdGEKLXN0YXRpYyB2b2lkIGluZGlyZWN0X2RlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIHZvaWQgaW5kaXJlY3RfZGVjcmVtZW50X2tleShzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIGNwdV9rZXlfa19vZmZzZXRfZGVjIChrZXkpOwotICAgIGlmIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpID09IDApCi0Jc2V0X2NwdV9rZXlfa190eXBlIChrZXksIFRZUEVfU1RBVF9EQVRBKTsKKwljcHVfa2V5X2tfb2Zmc2V0X2RlYyhrZXkpOworCWlmIChjcHVfa2V5X2tfb2Zmc2V0KGtleSkgPT0gMCkKKwkJc2V0X2NwdV9rZXlfa190eXBlKGtleSwgVFlQRV9TVEFUX0RBVEEpOwogfQogCi0KIC8vIGlmIGl0IGlzIG5vdCBmaXJzdCBpdGVtIG9mIHRoZSBib2R5LCB0aGVuIGl0IGlzIG1lcmdlYWJsZQotc3RhdGljIGludCBpbmRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3N0YXRpYyBpbnQgaW5kaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUoc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYnNpemUpCiB7Ci0gICAgaW50IHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbiAoa2V5KTsKLSAgICByZXR1cm4gKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSAhPSAxKTsKKwlpbnQgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGtleSk7CisJcmV0dXJuIChsZV9rZXlfa19vZmZzZXQodmVyc2lvbiwga2V5KSAhPSAxKTsKIH0KIAotCiAvLyBwcmludGluZyBvZiBpbmRpcmVjdCBpdGVtCi1zdGF0aWMgdm9pZCBzdGFydF9uZXdfc2VxdWVuY2UgKF9fdTMyICogc3RhcnQsIGludCAqIGxlbiwgX191MzIgbmV3KQorc3RhdGljIHZvaWQgc3RhcnRfbmV3X3NlcXVlbmNlKF9fdTMyICogc3RhcnQsIGludCAqbGVuLCBfX3UzMiBuZXcpCiB7Ci0gICAgKnN0YXJ0ID0gbmV3OwotICAgICpsZW4gPSAxOworCSpzdGFydCA9IG5ldzsKKwkqbGVuID0gMTsKIH0KIAotCi1zdGF0aWMgaW50IHNlcXVlbmNlX2ZpbmlzaGVkIChfX3UzMiBzdGFydCwgaW50ICogbGVuLCBfX3UzMiBuZXcpCitzdGF0aWMgaW50IHNlcXVlbmNlX2ZpbmlzaGVkKF9fdTMyIHN0YXJ0LCBpbnQgKmxlbiwgX191MzIgbmV3KQogewotICAgIGlmIChzdGFydCA9PSBJTlRfTUFYKQotCXJldHVybiAxOworCWlmIChzdGFydCA9PSBJTlRfTUFYKQorCQlyZXR1cm4gMTsKIAotICAgIGlmIChzdGFydCA9PSAwICYmIG5ldyA9PSAwKSB7Ci0JKCpsZW4pICsrOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZiAoc3RhcnQgIT0gMCAmJiAoc3RhcnQgKyAqbGVuKSA9PSBuZXcpIHsKLQkoKmxlbikgKys7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9zZXF1ZW5jZSAoX191MzIgc3RhcnQsIGludCBsZW4pCi17Ci0gICAgaWYgKHN0YXJ0ID09IElOVF9NQVgpCi0JcmV0dXJuOwotCi0gICAgaWYgKGxlbiA9PSAxKQotCXByaW50ayAoIiAlZCIsIHN0YXJ0KTsKLSAgICBlbHNlCi0JcHJpbnRrICgiICVkKCVkKSIsIHN0YXJ0LCBsZW4pOwotfQotCi0KLXN0YXRpYyB2b2lkIGluZGlyZWN0X3ByaW50X2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCi17Ci0gICAgaW50IGo7Ci0gICAgX19sZTMyICogdW5wOwotICAgIF9fdTMyIHByZXYgPSBJTlRfTUFYOwotICAgIGludCBudW07Ci0KLSAgICB1bnAgPSAoX19sZTMyICopaXRlbTsKLQotICAgIGlmIChpaF9pdGVtX2xlbihpaCkgJSBVTkZNX1BfU0laRSkKLQlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaW5kaXJlY3RfcHJpbnRfaXRlbTogaW52YWxpZCBpdGVtIGxlbiIpOwotCi0gICAgcHJpbnRrICgiJWQgcG9pbnRlcnNcblsgIiwgKGludClJX1VORk1fTlVNIChpaCkpOwotICAgIGZvciAoaiA9IDA7IGogPCBJX1VORk1fTlVNIChpaCk7IGogKyspIHsKLQlpZiAoc2VxdWVuY2VfZmluaXNoZWQgKHByZXYsICZudW0sIGdldF9ibG9ja19udW0odW5wLCBqKSkpIHsKLQkgICAgcHJpbnRfc2VxdWVuY2UgKHByZXYsIG51bSk7Ci0JICAgIHN0YXJ0X25ld19zZXF1ZW5jZSAoJnByZXYsICZudW0sIGdldF9ibG9ja19udW0odW5wLCBqKSk7CisJaWYgKHN0YXJ0ID09IDAgJiYgbmV3ID09IDApIHsKKwkJKCpsZW4pKys7CisJCXJldHVybiAwOwogCX0KLSAgICB9Ci0gICAgcHJpbnRfc2VxdWVuY2UgKHByZXYsIG51bSk7Ci0gICAgcHJpbnRrICgiXVxuIik7CisJaWYgKHN0YXJ0ICE9IDAgJiYgKHN0YXJ0ICsgKmxlbikgPT0gbmV3KSB7CisJCSgqbGVuKSsrOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGluZGlyZWN0X2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCitzdGF0aWMgdm9pZCBwcmludF9zZXF1ZW5jZShfX3UzMiBzdGFydCwgaW50IGxlbikKIHsKLSAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKKwlpZiAoc3RhcnQgPT0gSU5UX01BWCkKKwkJcmV0dXJuOworCisJaWYgKGxlbiA9PSAxKQorCQlwcmludGsoIiAlZCIsIHN0YXJ0KTsKKwllbHNlCisJCXByaW50aygiICVkKCVkKSIsIHN0YXJ0LCBsZW4pOwogfQogCi0KLXN0YXRpYyBpbnQgaW5kaXJlY3RfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCi0JCQkgICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJCSAgICAgICBpbnQgaXNfYWZmZWN0ZWQsIAotCQkJICAgICAgIGludCBpbnNlcnRfc2l6ZSkKK3N0YXRpYyB2b2lkIGluZGlyZWN0X3ByaW50X2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgdmktPnZpX2luZGV4ID0gVFlQRV9JTkRJUkVDVDsKLSAgICAvL3ZpLT52aV90eXBlIHw9IFZJX1RZUEVfSU5ESVJFQ1Q7Ci0gICAgcmV0dXJuIDA7CisJaW50IGo7CisJX19sZTMyICp1bnA7CisJX191MzIgcHJldiA9IElOVF9NQVg7CisJaW50IG51bTsKKworCXVucCA9IChfX2xlMzIgKikgaXRlbTsKKworCWlmIChpaF9pdGVtX2xlbihpaCkgJSBVTkZNX1BfU0laRSkKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiaW5kaXJlY3RfcHJpbnRfaXRlbTogaW52YWxpZCBpdGVtIGxlbiIpOworCisJcHJpbnRrKCIlZCBwb2ludGVyc1xuWyAiLCAoaW50KUlfVU5GTV9OVU0oaWgpKTsKKwlmb3IgKGogPSAwOyBqIDwgSV9VTkZNX05VTShpaCk7IGorKykgeworCQlpZiAoc2VxdWVuY2VfZmluaXNoZWQocHJldiwgJm51bSwgZ2V0X2Jsb2NrX251bSh1bnAsIGopKSkgeworCQkJcHJpbnRfc2VxdWVuY2UocHJldiwgbnVtKTsKKwkJCXN0YXJ0X25ld19zZXF1ZW5jZSgmcHJldiwgJm51bSwgZ2V0X2Jsb2NrX251bSh1bnAsIGopKTsKKwkJfQorCX0KKwlwcmludF9zZXF1ZW5jZShwcmV2LCBudW0pOworCXByaW50aygiXVxuIik7CiB9CiAKLXN0YXRpYyBpbnQgaW5kaXJlY3RfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKLQkJCQlpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQorc3RhdGljIHZvaWQgaW5kaXJlY3RfY2hlY2tfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICBpbnQgYnl0ZXM7Ci0KLSAgICBieXRlcyA9IGZyZWUgLSBmcmVlICUgVU5GTV9QX1NJWkU7Ci0gICAgcmV0dXJuIGJ5dGVzID86IC0xOyAgICAKKwkvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKIH0KIAotCi1zdGF0aWMgaW50IGluZGlyZWN0X2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQorc3RhdGljIGludCBpbmRpcmVjdF9jcmVhdGVfdmkoc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4sCisJCQkgICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwKKwkJCSAgICAgIGludCBpc19hZmZlY3RlZCwgaW50IGluc2VydF9zaXplKQogewotICAgIHJldHVybiBpbmRpcmVjdF9jaGVja19sZWZ0ICh2aSwgZnJlZSwgMCwgMCk7CisJdmktPnZpX2luZGV4ID0gVFlQRV9JTkRJUkVDVDsKKwkvL3ZpLT52aV90eXBlIHw9IFZJX1RZUEVfSU5ESVJFQ1Q7CisJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaW5kaXJlY3RfY2hlY2tfbGVmdChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUsCisJCQkgICAgICAgaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKK3sKKwlpbnQgYnl0ZXM7CiAKKwlieXRlcyA9IGZyZWUgLSBmcmVlICUgVU5GTV9QX1NJWkU7CisJcmV0dXJuIGJ5dGVzID8gOiAtMTsKK30KKworc3RhdGljIGludCBpbmRpcmVjdF9jaGVja19yaWdodChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUpCit7CisJcmV0dXJuIGluZGlyZWN0X2NoZWNrX2xlZnQodmksIGZyZWUsIDAsIDApOworfQogCiAvLyByZXR1cm4gc2l6ZSBpbiBieXRlcyBvZiAndW5pdHMnIHVuaXRzLiBJZiBmaXJzdCA9PSAwIC0gY2FsY3VsYXRlIGZyb20gdGhlIGhlYWQgKGxlZnQpLCBvdGhlcndpc2UgLSBmcm9tIHRhaWwgKHJpZ2h0KQotc3RhdGljIGludCBpbmRpcmVjdF9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgdW5pdHMpCitzdGF0aWMgaW50IGluZGlyZWN0X3BhcnRfc2l6ZShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZpcnN0LCBpbnQgdW5pdHMpCiB7Ci0gICAgLy8gdW5pdCBvZiBpbmRpcmVjdCBpdGVtIGlzIGJ5dGUgKHlldCkKLSAgICByZXR1cm4gdW5pdHM7CisJLy8gdW5pdCBvZiBpbmRpcmVjdCBpdGVtIGlzIGJ5dGUgKHlldCkKKwlyZXR1cm4gdW5pdHM7CiB9CiAKLXN0YXRpYyBpbnQgaW5kaXJlY3RfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyBpbnQgaW5kaXJlY3RfdW5pdF9udW0oc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgLy8gdW5pdCBvZiBpbmRpcmVjdCBpdGVtIGlzIGJ5dGUgKHlldCkKLSAgICByZXR1cm4gdmktPnZpX2l0ZW1fbGVuIC0gSUhfU0laRTsKKwkvLyB1bml0IG9mIGluZGlyZWN0IGl0ZW0gaXMgYnl0ZSAoeWV0KQorCXJldHVybiB2aS0+dmlfaXRlbV9sZW4gLSBJSF9TSVpFOwogfQogCi1zdGF0aWMgdm9pZCBpbmRpcmVjdF9wcmludF92aSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQorc3RhdGljIHZvaWQgaW5kaXJlY3RfcHJpbnRfdmkoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIklORElSRUNULCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCIsCi0JCSAgICAgIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCk7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiSU5ESVJFQ1QsIGluZGV4ICVkLCB0eXBlIDB4JXgsICVoIiwKKwkJCSB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOwogfQogCiBzdGF0aWMgc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyBpbmRpcmVjdF9vcHMgPSB7Ci0JLmJ5dGVzX251bWJlcgkJPSBpbmRpcmVjdF9ieXRlc19udW1iZXIsCi0JLmRlY3JlbWVudF9rZXkJCT0gaW5kaXJlY3RfZGVjcmVtZW50X2tleSwKLQkuaXNfbGVmdF9tZXJnZWFibGUJPSBpbmRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSwKLQkucHJpbnRfaXRlbQkJPSBpbmRpcmVjdF9wcmludF9pdGVtLAotCS5jaGVja19pdGVtCQk9IGluZGlyZWN0X2NoZWNrX2l0ZW0sCisJLmJ5dGVzX251bWJlciA9IGluZGlyZWN0X2J5dGVzX251bWJlciwKKwkuZGVjcmVtZW50X2tleSA9IGluZGlyZWN0X2RlY3JlbWVudF9rZXksCisJLmlzX2xlZnRfbWVyZ2VhYmxlID0gaW5kaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUsCisJLnByaW50X2l0ZW0gPSBpbmRpcmVjdF9wcmludF9pdGVtLAorCS5jaGVja19pdGVtID0gaW5kaXJlY3RfY2hlY2tfaXRlbSwKIAotCS5jcmVhdGVfdmkJCT0gaW5kaXJlY3RfY3JlYXRlX3ZpLAotCS5jaGVja19sZWZ0CQk9IGluZGlyZWN0X2NoZWNrX2xlZnQsCi0JLmNoZWNrX3JpZ2h0CQk9IGluZGlyZWN0X2NoZWNrX3JpZ2h0LAotCS5wYXJ0X3NpemUJCT0gaW5kaXJlY3RfcGFydF9zaXplLAotCS51bml0X251bQkJPSBpbmRpcmVjdF91bml0X251bSwKLQkucHJpbnRfdmkJCT0gaW5kaXJlY3RfcHJpbnRfdmkKKwkuY3JlYXRlX3ZpID0gaW5kaXJlY3RfY3JlYXRlX3ZpLAorCS5jaGVja19sZWZ0ID0gaW5kaXJlY3RfY2hlY2tfbGVmdCwKKwkuY2hlY2tfcmlnaHQgPSBpbmRpcmVjdF9jaGVja19yaWdodCwKKwkucGFydF9zaXplID0gaW5kaXJlY3RfcGFydF9zaXplLAorCS51bml0X251bSA9IGluZGlyZWN0X3VuaXRfbnVtLAorCS5wcmludF92aSA9IGluZGlyZWN0X3ByaW50X3ZpCiB9OwogCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gZGlyZW50cnkgZnVuY3Rpb25zCiAvLwogCi0KLXN0YXRpYyBpbnQgZGlyZW50cnlfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQorc3RhdGljIGludCBkaXJlbnRyeV9ieXRlc19udW1iZXIoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBibG9ja19zaXplKQogewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy0xNjA5MDogZGlyZW50cnlfYnl0ZXNfbnVtYmVyOiAiCi0JCSAgICAgICJieXRlcyBudW1iZXIgaXMgYXNrZWQgZm9yIGRpcmVudHJ5Iik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpcmVudHJ5X2RlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQotewotICAgIGNwdV9rZXlfa19vZmZzZXRfZGVjIChrZXkpOwotICAgIGlmIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpID09IDApCi0Jc2V0X2NwdV9rZXlfa190eXBlIChrZXksIFRZUEVfU1RBVF9EQVRBKTsJCi19Ci0KLQotc3RhdGljIGludCBkaXJlbnRyeV9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKLXsKLSAgICBpZiAobGUzMl90b19jcHUgKGtleS0+dS5rX29mZnNldF92MS5rX29mZnNldCkgPT0gRE9UX09GRlNFVCkKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJ2cy0xNjA5MDogZGlyZW50cnlfYnl0ZXNfbnVtYmVyOiAiCisJCQkgImJ5dGVzIG51bWJlciBpcyBhc2tlZCBmb3IgZGlyZW50cnkiKTsKIAlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLQkKIH0KIAotCi1zdGF0aWMgdm9pZCBkaXJlbnRyeV9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgZGlyZW50cnlfZGVjcmVtZW50X2tleShzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIGludCBpOwotICAgIGludCBuYW1lbGVuOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOwotICAgIGNoYXIgKiBuYW1lOwotICAgIHN0YXRpYyBjaGFyIG5hbWVidWYgWzgwXTsKKwljcHVfa2V5X2tfb2Zmc2V0X2RlYyhrZXkpOworCWlmIChjcHVfa2V5X2tfb2Zmc2V0KGtleSkgPT0gMCkKKwkJc2V0X2NwdV9rZXlfa190eXBlKGtleSwgVFlQRV9TVEFUX0RBVEEpOworfQogCitzdGF0aWMgaW50IGRpcmVudHJ5X2lzX2xlZnRfbWVyZ2VhYmxlKHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJzaXplKQoreworCWlmIChsZTMyX3RvX2NwdShrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQpID09IERPVF9PRkZTRVQpCisJCXJldHVybiAwOworCXJldHVybiAxOwogCi0gICAgcHJpbnRrICgiXG4gIyAlLTE1cyUtMzBzJS0xNXMlLTE1cyUtMTVzXG4iLCAiTmFtZSIsICJLZXkgb2YgcG9pbnRlZCBvYmplY3QiLCAiSGFzaCIsICJHZW4gbnVtYmVyIiwgIlN0YXR1cyIpOworfQogCi0gICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopaXRlbTsKK3N0YXRpYyB2b2lkIGRpcmVudHJ5X3ByaW50X2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCit7CisJaW50IGk7CisJaW50IG5hbWVsZW47CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKKwljaGFyICpuYW1lOworCXN0YXRpYyBjaGFyIG5hbWVidWZbODBdOwogCi0gICAgZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQgKGloKTsgaSArKywgZGVoICsrKSB7Ci0JbmFtZWxlbiA9IChpID8gKGRlaF9sb2NhdGlvbihkZWggLSAxKSkgOiBpaF9pdGVtX2xlbihpaCkpIC0gZGVoX2xvY2F0aW9uKGRlaCk7Ci0JbmFtZSA9IGl0ZW0gKyBkZWhfbG9jYXRpb24oZGVoKTsKLQlpZiAobmFtZVtuYW1lbGVuLTFdID09IDApCi0JICBuYW1lbGVuID0gc3RybGVuIChuYW1lKTsKLQluYW1lYnVmWzBdID0gJyInOwotCWlmIChuYW1lbGVuID4gc2l6ZW9mIChuYW1lYnVmKSAtIDMpIHsKLQkgICAgc3RybmNweSAobmFtZWJ1ZiArIDEsIG5hbWUsIHNpemVvZiAobmFtZWJ1ZikgLSAzKTsKLQkgICAgbmFtZWJ1ZltzaXplb2YgKG5hbWVidWYpIC0gMl0gPSAnIic7Ci0JICAgIG5hbWVidWZbc2l6ZW9mIChuYW1lYnVmKSAtIDFdID0gMDsKLQl9IGVsc2UgewotCSAgICBtZW1jcHkgKG5hbWVidWYgKyAxLCBuYW1lLCBuYW1lbGVuKTsKLQkgICAgbmFtZWJ1ZltuYW1lbGVuICsgMV0gPSAnIic7Ci0JICAgIG5hbWVidWZbbmFtZWxlbiArIDJdID0gMDsKKwlwcmludGsoIlxuICMgJS0xNXMlLTMwcyUtMTVzJS0xNXMlLTE1c1xuIiwgIk5hbWUiLAorCSAgICAgICAiS2V5IG9mIHBvaW50ZWQgb2JqZWN0IiwgIkhhc2giLCAiR2VuIG51bWJlciIsICJTdGF0dXMiKTsKKworCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWl0ZW07CisKKwlmb3IgKGkgPSAwOyBpIDwgSV9FTlRSWV9DT1VOVChpaCk7IGkrKywgZGVoKyspIHsKKwkJbmFtZWxlbiA9CisJCSAgICAoaSA/IChkZWhfbG9jYXRpb24oZGVoIC0gMSkpIDogaWhfaXRlbV9sZW4oaWgpKSAtCisJCSAgICBkZWhfbG9jYXRpb24oZGVoKTsKKwkJbmFtZSA9IGl0ZW0gKyBkZWhfbG9jYXRpb24oZGVoKTsKKwkJaWYgKG5hbWVbbmFtZWxlbiAtIDFdID09IDApCisJCQluYW1lbGVuID0gc3RybGVuKG5hbWUpOworCQluYW1lYnVmWzBdID0gJyInOworCQlpZiAobmFtZWxlbiA+IHNpemVvZihuYW1lYnVmKSAtIDMpIHsKKwkJCXN0cm5jcHkobmFtZWJ1ZiArIDEsIG5hbWUsIHNpemVvZihuYW1lYnVmKSAtIDMpOworCQkJbmFtZWJ1ZltzaXplb2YobmFtZWJ1ZikgLSAyXSA9ICciJzsKKwkJCW5hbWVidWZbc2l6ZW9mKG5hbWVidWYpIC0gMV0gPSAwOworCQl9IGVsc2UgeworCQkJbWVtY3B5KG5hbWVidWYgKyAxLCBuYW1lLCBuYW1lbGVuKTsKKwkJCW5hbWVidWZbbmFtZWxlbiArIDFdID0gJyInOworCQkJbmFtZWJ1ZltuYW1lbGVuICsgMl0gPSAwOworCQl9CisKKwkJcHJpbnRrKCIlZDogICUtMTVzJS0xNWQlLTE1ZCUtMTVMZCUtMTVMZCglcylcbiIsCisJCSAgICAgICBpLCBuYW1lYnVmLAorCQkgICAgICAgZGVoX2Rpcl9pZChkZWgpLCBkZWhfb2JqZWN0aWQoZGVoKSwKKwkJICAgICAgIEdFVF9IQVNIX1ZBTFVFKGRlaF9vZmZzZXQoZGVoKSksCisJCSAgICAgICBHRVRfR0VORVJBVElPTl9OVU1CRVIoKGRlaF9vZmZzZXQoZGVoKSkpLAorCQkgICAgICAgKGRlX2hpZGRlbihkZWgpKSA/ICJISURERU4iIDogIlZJU0lCTEUiKTsKIAl9Ci0KLQlwcmludGsgKCIlZDogICUtMTVzJS0xNWQlLTE1ZCUtMTVMZCUtMTVMZCglcylcbiIsIAotCQlpLCBuYW1lYnVmLAotCQlkZWhfZGlyX2lkKGRlaCksIGRlaF9vYmplY3RpZChkZWgpLAotCQlHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoKSksIEdFVF9HRU5FUkFUSU9OX05VTUJFUiAoKGRlaF9vZmZzZXQgKGRlaCkpKSwKLQkJKGRlX2hpZGRlbiAoZGVoKSkgPyAiSElEREVOIiA6ICJWSVNJQkxFIik7Ci0gICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIGRpcmVudHJ5X2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCitzdGF0aWMgdm9pZCBkaXJlbnRyeV9jaGVja19pdGVtKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjaGFyICppdGVtKQogewotICAgIGludCBpOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworCWludCBpOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CiAKLSAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKLSAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilpdGVtOwotICAgIGZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UIChpaCk7IGkgKyssIGRlaCArKykgewotCTsKLSAgICB9CisJLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCisJZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopaXRlbTsKKwlmb3IgKGkgPSAwOyBpIDwgSV9FTlRSWV9DT1VOVChpaCk7IGkrKywgZGVoKyspIHsKKwkJOworCX0KIH0KIAotCi0KICNkZWZpbmUgRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTSAxCiAKIC8qCiAgKiBmdW5jdGlvbiByZXR1cm5zIG9sZCBlbnRyeSBudW1iZXIgaW4gZGlyZWN0b3J5IGl0ZW0gaW4gcmVhbCBub2RlCiAgKiB1c2luZyBuZXcgZW50cnkgbnVtYmVyIGluIHZpcnR1YWwgaXRlbSBpbiB2aXJ0dWFsIG5vZGUgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG9sZF9lbnRyeV9udW0gKGludCBpc19hZmZlY3RlZCwgaW50IHZpcnR1YWxfZW50cnlfbnVtLCBpbnQgcG9zX2luX2l0ZW0sIGludCBtb2RlKQorc3RhdGljIGlubGluZSBpbnQgb2xkX2VudHJ5X251bShpbnQgaXNfYWZmZWN0ZWQsIGludCB2aXJ0dWFsX2VudHJ5X251bSwKKwkJCQlpbnQgcG9zX2luX2l0ZW0sIGludCBtb2RlKQogewotICAgIGlmICggbW9kZSA9PSBNX0lOU0VSVCB8fCBtb2RlID09IE1fREVMRVRFKQotCXJldHVybiB2aXJ0dWFsX2VudHJ5X251bTsKLSAgICAKLSAgICBpZiAoIWlzX2FmZmVjdGVkKQotCS8qIGN1dCBvciBwYXN0ZSBpcyBhcHBsaWVkIHRvIGFub3RoZXIgaXRlbSAqLwotCXJldHVybiB2aXJ0dWFsX2VudHJ5X251bTsKKwlpZiAobW9kZSA9PSBNX0lOU0VSVCB8fCBtb2RlID09IE1fREVMRVRFKQorCQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CiAKLSAgICBpZiAodmlydHVhbF9lbnRyeV9udW0gPCBwb3NfaW5faXRlbSkKLQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CisJaWYgKCFpc19hZmZlY3RlZCkKKwkJLyogY3V0IG9yIHBhc3RlIGlzIGFwcGxpZWQgdG8gYW5vdGhlciBpdGVtICovCisJCXJldHVybiB2aXJ0dWFsX2VudHJ5X251bTsKIAotICAgIGlmIChtb2RlID09IE1fQ1VUKQotCXJldHVybiB2aXJ0dWFsX2VudHJ5X251bSArIDE7CisJaWYgKHZpcnR1YWxfZW50cnlfbnVtIDwgcG9zX2luX2l0ZW0pCisJCXJldHVybiB2aXJ0dWFsX2VudHJ5X251bTsKIAotICAgIFJGQUxTRSggbW9kZSAhPSBNX1BBU1RFIHx8IHZpcnR1YWxfZW50cnlfbnVtID09IDAsCi0JICAgICJ2cy04MDE1OiBvbGRfZW50cnlfbnVtOiBtb2RlIG11c3QgYmUgTV9QQVNURSAobW9kZSA9IFwnJWNcJyIsIG1vZGUpOwotICAgIAotICAgIHJldHVybiB2aXJ0dWFsX2VudHJ5X251bSAtIDE7CisJaWYgKG1vZGUgPT0gTV9DVVQpCisJCXJldHVybiB2aXJ0dWFsX2VudHJ5X251bSArIDE7CisKKwlSRkFMU0UobW9kZSAhPSBNX1BBU1RFIHx8IHZpcnR1YWxfZW50cnlfbnVtID09IDAsCisJICAgICAgICJ2cy04MDE1OiBvbGRfZW50cnlfbnVtOiBtb2RlIG11c3QgYmUgTV9QQVNURSAobW9kZSA9IFwnJWNcJyIsCisJICAgICAgIG1vZGUpOworCisJcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtIC0gMTsKIH0KIAotCi0KLQogLyogQ3JlYXRlIGFuIGFycmF5IG9mIHNpemVzIG9mIGRpcmVjdG9yeSBlbnRyaWVzIGZvciB2aXJ0dWFsCiAgICBpdGVtLiBSZXR1cm4gc3BhY2UgdXNlZCBieSBhbiBpdGVtLiBGSVhNRTogbm8gY29udHJvbCBvdmVyCiAgICBjb25zdW1pbmcgb2Ygc3BhY2UgdXNlZCBieSB0aGlzIGl0ZW0gaGFuZGxlciAqLwotc3RhdGljIGludCBkaXJlbnRyeV9jcmVhdGVfdmkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwKLQkJCSAgICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIAotCQkJICAgICAgIGludCBpc19hZmZlY3RlZCwgCi0JCQkgICAgICAgaW50IGluc2VydF9zaXplKQorc3RhdGljIGludCBkaXJlbnRyeV9jcmVhdGVfdmkoc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4sCisJCQkgICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwKKwkJCSAgICAgIGludCBpc19hZmZlY3RlZCwgaW50IGluc2VydF9zaXplKQogewotICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOwotICAgIGludCBpLCBqOwotICAgIGludCBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgZGlyZW50cnlfdWFyZWEpOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOwotICAKLSAgICB2aS0+dmlfaW5kZXggPSBUWVBFX0RJUkVOVFJZOworCXN0cnVjdCBkaXJlbnRyeV91YXJlYSAqZGlyX3UgPSB2aS0+dmlfdWFyZWE7CisJaW50IGksIGo7CisJaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IGRpcmVudHJ5X3VhcmVhKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwogCi0gICAgaWYgKCEodmktPnZpX2loKSB8fCAhdmktPnZpX2l0ZW0pCi0JQlVHICgpOworCXZpLT52aV9pbmRleCA9IFRZUEVfRElSRU5UUlk7CiAKKwlpZiAoISh2aS0+dmlfaWgpIHx8ICF2aS0+dmlfaXRlbSkKKwkJQlVHKCk7CiAKLSAgICBkaXJfdS0+ZmxhZ3MgPSAwOwotICAgIGlmIChsZV9paF9rX29mZnNldCAodmktPnZpX2loKSA9PSBET1RfT0ZGU0VUKQotCWRpcl91LT5mbGFncyB8PSBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNOworCWRpcl91LT5mbGFncyA9IDA7CisJaWYgKGxlX2loX2tfb2Zmc2V0KHZpLT52aV9paCkgPT0gRE9UX09GRlNFVCkKKwkJZGlyX3UtPmZsYWdzIHw9IERJUkVOVFJZX1ZJX0ZJUlNUX0RJUkVOVFJZX0lURU07CiAKLSAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKikodmktPnZpX2l0ZW0pOwotICAgIAotICAgIAotICAgIC8qIHZpcnR1YWwgZGlyZWN0b3J5IGl0ZW0gaGF2ZSB0aGlzIGFtb3VudCBvZiBlbnRyeSBhZnRlciAqLwotICAgIGRpcl91LT5lbnRyeV9jb3VudCA9IGloX2VudHJ5X2NvdW50ICh2aS0+dmlfaWgpICsgCi0JKChpc19hZmZlY3RlZCkgPyAoKHZuLT52bl9tb2RlID09IE1fQ1VUKSA/IC0xIDoKLQkJCSAgKHZuLT52bl9tb2RlID09IE1fUEFTVEUgPyAxIDogMCkpIDogMCk7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IGRpcl91LT5lbnRyeV9jb3VudDsgaSArKykgewotCWogPSBvbGRfZW50cnlfbnVtIChpc19hZmZlY3RlZCwgaSwgdm4tPnZuX3Bvc19pbl9pdGVtLCB2bi0+dm5fbW9kZSk7Ci0gICAgICAgIGRpcl91LT5lbnRyeV9zaXplc1tpXSA9IChqID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtqIC0gMV0pICkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaF9pdGVtX2xlbiAodmktPnZpX2loKSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWhfbG9jYXRpb24oICYoZGVoW2pdKSkgKyBERUhfU0laRTsKLSAgICB9CisJZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKHZpLT52aV9pdGVtKTsKIAotICAgIHNpemUgKz0gKGRpcl91LT5lbnRyeV9jb3VudCAqIHNpemVvZiAoc2hvcnQpKTsKLSAgICAKLSAgICAvKiBzZXQgc2l6ZSBvZiBwYXN0ZWQgZW50cnkgKi8KLSAgICBpZiAoaXNfYWZmZWN0ZWQgJiYgdm4tPnZuX21vZGUgPT0gTV9QQVNURSkKLQlkaXJfdS0+ZW50cnlfc2l6ZXNbdm4tPnZuX3Bvc19pbl9pdGVtXSA9IGluc2VydF9zaXplOworCS8qIHZpcnR1YWwgZGlyZWN0b3J5IGl0ZW0gaGF2ZSB0aGlzIGFtb3VudCBvZiBlbnRyeSBhZnRlciAqLworCWRpcl91LT5lbnRyeV9jb3VudCA9IGloX2VudHJ5X2NvdW50KHZpLT52aV9paCkgKworCSAgICAoKGlzX2FmZmVjdGVkKSA/ICgodm4tPnZuX21vZGUgPT0gTV9DVVQpID8gLTEgOgorCQkJICAgICAgKHZuLT52bl9tb2RlID09IE1fUEFTVEUgPyAxIDogMCkpIDogMCk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgZGlyX3UtPmVudHJ5X2NvdW50OyBpKyspIHsKKwkJaiA9IG9sZF9lbnRyeV9udW0oaXNfYWZmZWN0ZWQsIGksIHZuLT52bl9wb3NfaW5faXRlbSwKKwkJCQkgIHZuLT52bl9tb2RlKTsKKwkJZGlyX3UtPmVudHJ5X3NpemVzW2ldID0KKwkJICAgIChqID8gZGVoX2xvY2F0aW9uKCYoZGVoW2ogLSAxXSkpIDogaWhfaXRlbV9sZW4odmktPnZpX2loKSkgLQorCQkgICAgZGVoX2xvY2F0aW9uKCYoZGVoW2pdKSkgKyBERUhfU0laRTsKKwl9CisKKwlzaXplICs9IChkaXJfdS0+ZW50cnlfY291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKworCS8qIHNldCBzaXplIG9mIHBhc3RlZCBlbnRyeSAqLworCWlmIChpc19hZmZlY3RlZCAmJiB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFKQorCQlkaXJfdS0+ZW50cnlfc2l6ZXNbdm4tPnZuX3Bvc19pbl9pdGVtXSA9IGluc2VydF9zaXplOwogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgLyogY29tcGFyZSB0b3RhbCBzaXplIG9mIGVudHJpZXMgd2l0aCBpdGVtIGxlbmd0aCAqLwotICAgIHsKLQlpbnQgaywgbDsKLSAgICAKLQlsID0gMDsKLQlmb3IgKGsgPSAwOyBrIDwgZGlyX3UtPmVudHJ5X2NvdW50OyBrICsrKQotCSAgICBsICs9IGRpcl91LT5lbnRyeV9zaXplc1trXTsKLSAgICAKLQlpZiAobCArIElIX1NJWkUgIT0gdmktPnZpX2l0ZW1fbGVuICsgCi0JICAgICgoaXNfYWZmZWN0ZWQgJiYgKHZuLT52bl9tb2RlID09IE1fUEFTVEUgfHwgdm4tPnZuX21vZGUgPT0gTV9DVVQpKSA/IGluc2VydF9zaXplIDogMCkgKSB7Ci0JICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtODAyNTogc2V0X2VudHJ5X3NpemVzOiAobW9kZT09JWMsIGluc2VydF9zaXplPT0lZCksIGludmFsaWQgbGVuZ3RoIG9mIGRpcmVjdG9yeSBpdGVtIiwKLQkJCSAgICB2bi0+dm5fbW9kZSwgaW5zZXJ0X3NpemUpOworCS8qIGNvbXBhcmUgdG90YWwgc2l6ZSBvZiBlbnRyaWVzIHdpdGggaXRlbSBsZW5ndGggKi8KKwl7CisJCWludCBrLCBsOworCisJCWwgPSAwOworCQlmb3IgKGsgPSAwOyBrIDwgZGlyX3UtPmVudHJ5X2NvdW50OyBrKyspCisJCQlsICs9IGRpcl91LT5lbnRyeV9zaXplc1trXTsKKworCQlpZiAobCArIElIX1NJWkUgIT0gdmktPnZpX2l0ZW1fbGVuICsKKwkJICAgICgoaXNfYWZmZWN0ZWQKKwkJICAgICAgJiYgKHZuLT52bl9tb2RlID09IE1fUEFTVEUKKwkJCSAgfHwgdm4tPnZuX21vZGUgPT0gTV9DVVQpKSA/IGluc2VydF9zaXplIDogMCkpIHsKKwkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJICAgICAgICJ2cy04MDI1OiBzZXRfZW50cnlfc2l6ZXM6IChtb2RlPT0lYywgaW5zZXJ0X3NpemU9PSVkKSwgaW52YWxpZCBsZW5ndGggb2YgZGlyZWN0b3J5IGl0ZW0iLAorCQkJCSAgICAgICB2bi0+dm5fbW9kZSwgaW5zZXJ0X3NpemUpOworCQl9CiAJfQotICAgIH0KICNlbmRpZgogCi0gICAgcmV0dXJuIHNpemU7Ci0KKwlyZXR1cm4gc2l6ZTsKIAogfQogCi0KIC8vCiAvLyByZXR1cm4gbnVtYmVyIG9mIGVudHJpZXMgd2hpY2ggbWF5IGZpdCBpbnRvIHNwZWNpZmllZCBhbW91bnQgb2YKIC8vIGZyZWUgc3BhY2UsIG9yIC0xIGlmIGZyZWUgc3BhY2UgaXMgbm90IGVub3VnaCBldmVuIGZvciAxIGVudHJ5CiAvLwotc3RhdGljIGludCBkaXJlbnRyeV9jaGVja19sZWZ0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLAotCQkJCWludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCitzdGF0aWMgaW50IGRpcmVudHJ5X2NoZWNrX2xlZnQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlLAorCQkJICAgICAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCiB7Ci0gICAgaW50IGk7Ci0gICAgaW50IGVudHJpZXMgPSAwOwotICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOworCWludCBpOworCWludCBlbnRyaWVzID0gMDsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOwogCi0gICAgZm9yIChpID0gc3RhcnRfc2tpcDsgaSA8IGRpcl91LT5lbnRyeV9jb3VudCAtIGVuZF9za2lwOyBpICsrKSB7Ci0JaWYgKGRpcl91LT5lbnRyeV9zaXplc1tpXSA+IGZyZWUpCi0JICAgIC8qIGktdGggZW50cnkgZG9lc24ndCBmaXQgaW50byB0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2UgKi8KLQkgICAgYnJlYWs7Ci0JCSAgCi0JZnJlZSAtPSBkaXJfdS0+ZW50cnlfc2l6ZXNbaV07Ci0JZW50cmllcyArKzsKLSAgICB9CisJZm9yIChpID0gc3RhcnRfc2tpcDsgaSA8IGRpcl91LT5lbnRyeV9jb3VudCAtIGVuZF9za2lwOyBpKyspIHsKKwkJaWYgKGRpcl91LT5lbnRyeV9zaXplc1tpXSA+IGZyZWUpCisJCQkvKiBpLXRoIGVudHJ5IGRvZXNuJ3QgZml0IGludG8gdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlICovCisJCQlicmVhazsKIAotICAgIGlmIChlbnRyaWVzID09IGRpcl91LT5lbnRyeV9jb3VudCkgewotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAiZnJlZSBzcGFjZSAlZCwgZW50cnlfY291bnQgJWRcbiIsIGZyZWUsIGRpcl91LT5lbnRyeV9jb3VudCk7Ci0gICAgfQorCQlmcmVlIC09IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKwkJZW50cmllcysrOworCX0KIAotICAgIC8qICIuIiBhbmQgIi4uIiBjYW4gbm90IGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgKi8KLSAgICBpZiAoc3RhcnRfc2tpcCA9PSAwICYmIChkaXJfdS0+ZmxhZ3MgJiBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNKSAmJiBlbnRyaWVzIDwgMikKLQllbnRyaWVzID0gMDsKLSAgICAKLSAgICByZXR1cm4gZW50cmllcyA/OiAtMTsKKwlpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpIHsKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwgImZyZWUgc3BhY2UgJWQsIGVudHJ5X2NvdW50ICVkXG4iLCBmcmVlLAorCQkJICAgICAgIGRpcl91LT5lbnRyeV9jb3VudCk7CisJfQorCisJLyogIi4iIGFuZCAiLi4iIGNhbiBub3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAqLworCWlmIChzdGFydF9za2lwID09IDAgJiYgKGRpcl91LT5mbGFncyAmIERJUkVOVFJZX1ZJX0ZJUlNUX0RJUkVOVFJZX0lURU0pCisJICAgICYmIGVudHJpZXMgPCAyKQorCQllbnRyaWVzID0gMDsKKworCXJldHVybiBlbnRyaWVzID8gOiAtMTsKIH0KIAotCi1zdGF0aWMgaW50IGRpcmVudHJ5X2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQorc3RhdGljIGludCBkaXJlbnRyeV9jaGVja19yaWdodChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUpCiB7Ci0gICAgaW50IGk7Ci0gICAgaW50IGVudHJpZXMgPSAwOwotICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOwotICAgIAotICAgIGZvciAoaSA9IGRpcl91LT5lbnRyeV9jb3VudCAtIDE7IGkgPj0gMDsgaSAtLSkgewotCWlmIChkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPiBmcmVlKQotCSAgICAvKiBpLXRoIGVudHJ5IGRvZXNuJ3QgZml0IGludG8gdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlICovCi0JICAgIGJyZWFrOwotCQotCWZyZWUgLT0gZGlyX3UtPmVudHJ5X3NpemVzW2ldOwotCWVudHJpZXMgKys7Ci0gICAgfQotICAgIGlmIChlbnRyaWVzID09IGRpcl91LT5lbnRyeV9jb3VudCkKLQlCVUcgKCk7CisJaW50IGk7CisJaW50IGVudHJpZXMgPSAwOworCXN0cnVjdCBkaXJlbnRyeV91YXJlYSAqZGlyX3UgPSB2aS0+dmlfdWFyZWE7CiAKLSAgICAvKiAiLiIgYW5kICIuLiIgY2FuIG5vdCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyICovCi0gICAgaWYgKChkaXJfdS0+ZmxhZ3MgJiBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNKSAmJiBlbnRyaWVzID4gZGlyX3UtPmVudHJ5X2NvdW50IC0gMikKLQllbnRyaWVzID0gZGlyX3UtPmVudHJ5X2NvdW50IC0gMjsKKwlmb3IgKGkgPSBkaXJfdS0+ZW50cnlfY291bnQgLSAxOyBpID49IDA7IGktLSkgeworCQlpZiAoZGlyX3UtPmVudHJ5X3NpemVzW2ldID4gZnJlZSkKKwkJCS8qIGktdGggZW50cnkgZG9lc24ndCBmaXQgaW50byB0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2UgKi8KKwkJCWJyZWFrOwogCi0gICAgcmV0dXJuIGVudHJpZXMgPzogLTE7CisJCWZyZWUgLT0gZGlyX3UtPmVudHJ5X3NpemVzW2ldOworCQllbnRyaWVzKys7CisJfQorCWlmIChlbnRyaWVzID09IGRpcl91LT5lbnRyeV9jb3VudCkKKwkJQlVHKCk7CisKKwkvKiAiLiIgYW5kICIuLiIgY2FuIG5vdCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyICovCisJaWYgKChkaXJfdS0+ZmxhZ3MgJiBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNKQorCSAgICAmJiBlbnRyaWVzID4gZGlyX3UtPmVudHJ5X2NvdW50IC0gMikKKwkJZW50cmllcyA9IGRpcl91LT5lbnRyeV9jb3VudCAtIDI7CisKKwlyZXR1cm4gZW50cmllcyA/IDogLTE7CiB9CiAKLQogLyogc3VtIG9mIGVudHJ5IHNpemVzIGJldHdlZW4gZnJvbS10aCBhbmQgdG8tdGggZW50cmllcyBpbmNsdWRpbmcgYm90aCBlZGdlcyAqLwotc3RhdGljIGludCBkaXJlbnRyeV9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCitzdGF0aWMgaW50IGRpcmVudHJ5X3BhcnRfc2l6ZShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCiB7Ci0gICAgaW50IGksIHJldHZhbDsKLSAgICBpbnQgZnJvbSwgdG87Ci0gICAgc3RydWN0IGRpcmVudHJ5X3VhcmVhICogZGlyX3UgPSB2aS0+dmlfdWFyZWE7Ci0gICAgCi0gICAgcmV0dmFsID0gMDsKLSAgICBpZiAoZmlyc3QgPT0gMCkKLQlmcm9tID0gMDsKLSAgICBlbHNlCi0JZnJvbSA9IGRpcl91LT5lbnRyeV9jb3VudCAtIGNvdW50OwotICAgIHRvID0gZnJvbSArIGNvdW50IC0gMTsKKwlpbnQgaSwgcmV0dmFsOworCWludCBmcm9tLCB0bzsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOwogCi0gICAgZm9yIChpID0gZnJvbTsgaSA8PSB0bzsgaSArKykKLQlyZXR2YWwgKz0gZGlyX3UtPmVudHJ5X3NpemVzW2ldOworCXJldHZhbCA9IDA7CisJaWYgKGZpcnN0ID09IDApCisJCWZyb20gPSAwOworCWVsc2UKKwkJZnJvbSA9IGRpcl91LT5lbnRyeV9jb3VudCAtIGNvdW50OworCXRvID0gZnJvbSArIGNvdW50IC0gMTsKIAotICAgIHJldHVybiByZXR2YWw7CisJZm9yIChpID0gZnJvbTsgaSA8PSB0bzsgaSsrKQorCQlyZXR2YWwgKz0gZGlyX3UtPmVudHJ5X3NpemVzW2ldOworCisJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBkaXJlbnRyeV91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQorc3RhdGljIGludCBkaXJlbnRyeV91bml0X251bShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKLSAgICAKLSAgICByZXR1cm4gZGlyX3UtPmVudHJ5X2NvdW50OworCXN0cnVjdCBkaXJlbnRyeV91YXJlYSAqZGlyX3UgPSB2aS0+dmlfdWFyZWE7CisKKwlyZXR1cm4gZGlyX3UtPmVudHJ5X2NvdW50OwogfQogCi0KLQotc3RhdGljIHZvaWQgZGlyZW50cnlfcHJpbnRfdmkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyB2b2lkIGRpcmVudHJ5X3ByaW50X3ZpKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIGludCBpOwotICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOworCWludCBpOworCXN0cnVjdCBkaXJlbnRyeV91YXJlYSAqZGlyX3UgPSB2aS0+dmlfdWFyZWE7CiAKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiRElSRU5UUlksIGluZGV4ICVkLCB0eXBlIDB4JXgsICVoLCBmbGFncyAweCV4IiwKLQkJICAgICAgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loLCBkaXJfdS0+ZmxhZ3MpOwotICAgIHByaW50ayAoIiVkIGVudHJpZXM6ICIsIGRpcl91LT5lbnRyeV9jb3VudCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGRpcl91LT5lbnRyeV9jb3VudDsgaSArKykKLQlwcmludGsgKCIlZCAiLCBkaXJfdS0+ZW50cnlfc2l6ZXNbaV0pOwotICAgIHByaW50ayAoIlxuIik7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiRElSRU5UUlksIGluZGV4ICVkLCB0eXBlIDB4JXgsICVoLCBmbGFncyAweCV4IiwKKwkJCSB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgsIGRpcl91LT5mbGFncyk7CisJcHJpbnRrKCIlZCBlbnRyaWVzOiAiLCBkaXJfdS0+ZW50cnlfY291bnQpOworCWZvciAoaSA9IDA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQ7IGkrKykKKwkJcHJpbnRrKCIlZCAiLCBkaXJfdS0+ZW50cnlfc2l6ZXNbaV0pOworCXByaW50aygiXG4iKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgZGlyZW50cnlfb3BzID0gewotCS5ieXRlc19udW1iZXIJCT0gZGlyZW50cnlfYnl0ZXNfbnVtYmVyLAotCS5kZWNyZW1lbnRfa2V5CQk9IGRpcmVudHJ5X2RlY3JlbWVudF9rZXksCi0JLmlzX2xlZnRfbWVyZ2VhYmxlCT0gZGlyZW50cnlfaXNfbGVmdF9tZXJnZWFibGUsCi0JLnByaW50X2l0ZW0JCT0gZGlyZW50cnlfcHJpbnRfaXRlbSwKLQkuY2hlY2tfaXRlbQkJPSBkaXJlbnRyeV9jaGVja19pdGVtLAorCS5ieXRlc19udW1iZXIgPSBkaXJlbnRyeV9ieXRlc19udW1iZXIsCisJLmRlY3JlbWVudF9rZXkgPSBkaXJlbnRyeV9kZWNyZW1lbnRfa2V5LAorCS5pc19sZWZ0X21lcmdlYWJsZSA9IGRpcmVudHJ5X2lzX2xlZnRfbWVyZ2VhYmxlLAorCS5wcmludF9pdGVtID0gZGlyZW50cnlfcHJpbnRfaXRlbSwKKwkuY2hlY2tfaXRlbSA9IGRpcmVudHJ5X2NoZWNrX2l0ZW0sCiAKLQkuY3JlYXRlX3ZpCQk9IGRpcmVudHJ5X2NyZWF0ZV92aSwKLQkuY2hlY2tfbGVmdAkJPSBkaXJlbnRyeV9jaGVja19sZWZ0LAotCS5jaGVja19yaWdodAkJPSBkaXJlbnRyeV9jaGVja19yaWdodCwKLQkucGFydF9zaXplCQk9IGRpcmVudHJ5X3BhcnRfc2l6ZSwKLQkudW5pdF9udW0JCT0gZGlyZW50cnlfdW5pdF9udW0sCi0JLnByaW50X3ZpCQk9IGRpcmVudHJ5X3ByaW50X3ZpCisJLmNyZWF0ZV92aSA9IGRpcmVudHJ5X2NyZWF0ZV92aSwKKwkuY2hlY2tfbGVmdCA9IGRpcmVudHJ5X2NoZWNrX2xlZnQsCisJLmNoZWNrX3JpZ2h0ID0gZGlyZW50cnlfY2hlY2tfcmlnaHQsCisJLnBhcnRfc2l6ZSA9IGRpcmVudHJ5X3BhcnRfc2l6ZSwKKwkudW5pdF9udW0gPSBkaXJlbnRyeV91bml0X251bSwKKwkucHJpbnRfdmkgPSBkaXJlbnRyeV9wcmludF92aQogfTsKIAotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIEVycm9yIGNhdGNoaW5nIGZ1bmN0aW9ucyB0byBjYXRjaCBlcnJvcnMgY2F1c2VkIGJ5IGluY29ycmVjdCBpdGVtIHR5cGVzLgogLy8KLXN0YXRpYyBpbnQgZXJyY2F0Y2hfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQorc3RhdGljIGludCBlcnJjYXRjaF9ieXRlc19udW1iZXIoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBibG9ja19zaXplKQogewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwMTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKLSAgICByZXR1cm4gMDsKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkgImdyZWVuLTE2MDAxOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBlcnJjYXRjaF9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3N0YXRpYyB2b2lkIGVycmNhdGNoX2RlY3JlbWVudF9rZXkoc3RydWN0IGNwdV9rZXkgKmtleSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDI6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwMjogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKIH0KIAotCi1zdGF0aWMgaW50IGVycmNhdGNoX2lzX2xlZnRfbWVyZ2VhYmxlIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQorc3RhdGljIGludCBlcnJjYXRjaF9pc19sZWZ0X21lcmdlYWJsZShzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXksCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBic2l6ZSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDM6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwMzogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBlcnJjYXRjaF9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgZXJyY2F0Y2hfcHJpbnRfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDQ6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwNDogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBlcnJjYXRjaF9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgZXJyY2F0Y2hfY2hlY2tfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDU6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwNTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKIH0KIAotc3RhdGljIGludCBlcnJjYXRjaF9jcmVhdGVfdmkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwKLQkJCSAgICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIAotCQkJICAgICAgIGludCBpc19hZmZlY3RlZCwgCi0JCQkgICAgICAgaW50IGluc2VydF9zaXplKQorc3RhdGljIGludCBlcnJjYXRjaF9jcmVhdGVfdmkoc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4sCisJCQkgICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwKKwkJCSAgICAgIGludCBpc19hZmZlY3RlZCwgaW50IGluc2VydF9zaXplKQogewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwNjogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKLSAgICByZXR1cm4gMDsJLy8gV2UgbWlnaHQgcmV0dXJuIC0xIGhlcmUgYXMgd2VsbCwgYnV0IGl0IHdvbid0IGhlbHAgYXMgY3JlYXRlX3ZpcnR1YWxfbm9kZSgpIGZyb20gd2hlcmUKLQkJLy8gdGhpcyBvcGVyYXRpb24gaXMgY2FsbGVkIGZyb20gaXMgb2YgcmV0dXJuIHR5cGUgdm9pZC4KKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkgImdyZWVuLTE2MDA2OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJldHVybiAwOwkJLy8gV2UgbWlnaHQgcmV0dXJuIC0xIGhlcmUgYXMgd2VsbCwgYnV0IGl0IHdvbid0IGhlbHAgYXMgY3JlYXRlX3ZpcnR1YWxfbm9kZSgpIGZyb20gd2hlcmUKKwkvLyB0aGlzIG9wZXJhdGlvbiBpcyBjYWxsZWQgZnJvbSBpcyBvZiByZXR1cm4gdHlwZSB2b2lkLgogfQogCi1zdGF0aWMgaW50IGVycmNhdGNoX2NoZWNrX2xlZnQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsCi0JCQkJaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfY2hlY2tfbGVmdChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUsCisJCQkgICAgICAgaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDc6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIC0xOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDc6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmV0dXJuIC0xOwogfQogCi0KLXN0YXRpYyBpbnQgZXJyY2F0Y2hfY2hlY2tfcmlnaHQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUpCitzdGF0aWMgaW50IGVycmNhdGNoX2NoZWNrX3JpZ2h0KHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZnJlZSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDg6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIC0xOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDg6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGVycmNhdGNoX3BhcnRfc2l6ZSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfcGFydF9zaXplKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDk6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwOTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlcnJjYXRjaF91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQorc3RhdGljIGludCBlcnJjYXRjaF91bml0X251bShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMTA6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAxMDogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXJyY2F0Y2hfcHJpbnRfdmkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyB2b2lkIGVycmNhdGNoX3ByaW50X3ZpKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAxMTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkgImdyZWVuLTE2MDExOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwogfQogCiBzdGF0aWMgc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyBlcnJjYXRjaF9vcHMgPSB7Ci0gICAgZXJyY2F0Y2hfYnl0ZXNfbnVtYmVyLAotICAgIGVycmNhdGNoX2RlY3JlbWVudF9rZXksCi0gICAgZXJyY2F0Y2hfaXNfbGVmdF9tZXJnZWFibGUsCi0gICAgZXJyY2F0Y2hfcHJpbnRfaXRlbSwKLSAgICBlcnJjYXRjaF9jaGVja19pdGVtLAorCWVycmNhdGNoX2J5dGVzX251bWJlciwKKwllcnJjYXRjaF9kZWNyZW1lbnRfa2V5LAorCWVycmNhdGNoX2lzX2xlZnRfbWVyZ2VhYmxlLAorCWVycmNhdGNoX3ByaW50X2l0ZW0sCisJZXJyY2F0Y2hfY2hlY2tfaXRlbSwKIAotICAgIGVycmNhdGNoX2NyZWF0ZV92aSwKLSAgICBlcnJjYXRjaF9jaGVja19sZWZ0LAotICAgIGVycmNhdGNoX2NoZWNrX3JpZ2h0LAotICAgIGVycmNhdGNoX3BhcnRfc2l6ZSwKLSAgICBlcnJjYXRjaF91bml0X251bSwKLSAgICBlcnJjYXRjaF9wcmludF92aQorCWVycmNhdGNoX2NyZWF0ZV92aSwKKwllcnJjYXRjaF9jaGVja19sZWZ0LAorCWVycmNhdGNoX2NoZWNrX3JpZ2h0LAorCWVycmNhdGNoX3BhcnRfc2l6ZSwKKwllcnJjYXRjaF91bml0X251bSwKKwllcnJjYXRjaF9wcmludF92aQogfTsKIAotCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KIC8vCiAjaWYgISAoVFlQRV9TVEFUX0RBVEEgPT0gMCAmJiBUWVBFX0lORElSRUNUID09IDEgJiYgVFlQRV9ESVJFQ1QgPT0gMiAmJiBUWVBFX0RJUkVOVFJZID09IDMpCi0gIGRvIG5vdCBjb21waWxlCisjZXJyb3IgSXRlbSB0eXBlcyBtdXN0IHVzZSBkaXNrLWZvcm1hdCBhc3NpZ25lZCB2YWx1ZXMuCiAjZW5kaWYKIAotc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyAqIGl0ZW1fb3BzIFtUWVBFX0FOWSArIDFdID0gewotICAmc3RhdF9kYXRhX29wcywKLSAgJmluZGlyZWN0X29wcywKLSAgJmRpcmVjdF9vcHMsCi0gICZkaXJlbnRyeV9vcHMsCi0gIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICZlcnJjYXRjaF9vcHMJCS8qIFRoaXMgaXMgdG8gY2F0Y2ggZXJyb3JzIHdpdGggaW52YWxpZCB0eXBlICgxNXRoIGVudHJ5IGZvciBUWVBFX0FOWSkgKi8KK3N0cnVjdCBpdGVtX29wZXJhdGlvbnMgKml0ZW1fb3BzW1RZUEVfQU5ZICsgMV0gPSB7CisJJnN0YXRfZGF0YV9vcHMsCisJJmluZGlyZWN0X29wcywKKwkmZGlyZWN0X29wcywKKwkmZGlyZW50cnlfb3BzLAorCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJJmVycmNhdGNoX29wcwkJLyogVGhpcyBpcyB0byBjYXRjaCBlcnJvcnMgd2l0aCBpbnZhbGlkIHR5cGUgKDE1dGggZW50cnkgZm9yIFRZUEVfQU5ZKSAqLwogfTsKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvam91cm5hbC5jIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCmluZGV4IGQxYmNmMGQuLmM2NmMyN2UgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYworKysgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKQEAgLTU1LDcgKzU1LDYgQEAKICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KIAotCiAvKiBnZXRzIGEgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqIGZyb20gYSBsaXN0IGhlYWQgKi8KICNkZWZpbmUgSk9VUk5BTF9MSVNUX0VOVFJZKGgpIChsaXN0X2VudHJ5KChoKSwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpfbGlzdCkpCkBAIC02OSw1NSArNjgsNjEgQEAKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjb21taXRfd3E7CiAKLSNkZWZpbmUgSk9VUk5BTF9UUkFOU19IQUxGIDEwMTggICAvKiBtdXN0IGJlIGNvcnJlY3QgdG8ga2VlcCB0aGUgZGVzYyBhbmQgY29tbWl0Ci0JCQkJICAgICBzdHJ1Y3RzIGF0IDRrICovCi0jZGVmaW5lIEJVRk5SIDY0IC8qcmVhZCBhaGVhZCAqLworI2RlZmluZSBKT1VSTkFMX1RSQU5TX0hBTEYgMTAxOAkvKiBtdXN0IGJlIGNvcnJlY3QgdG8ga2VlcCB0aGUgZGVzYyBhbmQgY29tbWl0CisJCQkJICAgc3RydWN0cyBhdCA0ayAqLworI2RlZmluZSBCVUZOUiA2NAkJLypyZWFkIGFoZWFkICovCiAKIC8qIGNub2RlIHN0YXQgYml0cy4gIE1vdmUgdGhlc2UgaW50byByZWlzZXJmc19mcy5oICovCiAKICNkZWZpbmUgQkxPQ0tfRlJFRUQgMgkJLyogdGhpcyBibG9jayB3YXMgZnJlZWQsIGFuZCBjYW4ndCBiZSB3cml0dGVuLiAgKi8KLSNkZWZpbmUgQkxPQ0tfRlJFRURfSE9MREVSIDMgICAgLyogdGhpcyBibG9jayB3YXMgZnJlZWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24sIGFuZCBjYW4ndCBiZSB3cml0dGVuICovCisjZGVmaW5lIEJMT0NLX0ZSRUVEX0hPTERFUiAzCS8qIHRoaXMgYmxvY2sgd2FzIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uLCBhbmQgY2FuJ3QgYmUgd3JpdHRlbiAqLwogCiAjZGVmaW5lIEJMT0NLX05FRURTX0ZMVVNIIDQJLyogdXNlZCBpbiBmbHVzaF9qb3VybmFsX2xpc3QgKi8KICNkZWZpbmUgQkxPQ0tfRElSVElFRCA1CiAKLQogLyogam91cm5hbCBsaXN0IHN0YXRlIGJpdHMgKi8KICNkZWZpbmUgTElTVF9UT1VDSEVEIDEKICNkZWZpbmUgTElTVF9ESVJUWSAgIDIKLSNkZWZpbmUgTElTVF9DT01NSVRfUEVORElORyAgNAkJLyogc29tZW9uZSB3aWxsIGNvbW1pdCB0aGlzIGxpc3QgKi8KKyNkZWZpbmUgTElTVF9DT01NSVRfUEVORElORyAgNAkvKiBzb21lb25lIHdpbGwgY29tbWl0IHRoaXMgbGlzdCAqLwogCiAvKiBmbGFncyBmb3IgZG9fam91cm5hbF9lbmQgKi8KICNkZWZpbmUgRkxVU0hfQUxMICAgMQkJLyogZmx1c2ggY29tbWl0IGFuZCByZWFsIGJsb2NrcyAqLwogI2RlZmluZSBDT01NSVRfTk9XICAyCQkvKiBlbmQgYW5kIGNvbW1pdCB0aGlzIHRyYW5zYWN0aW9uICovCi0jZGVmaW5lIFdBSVQgICAgICAgIDQJCS8qIHdhaXQgZm9yIHRoZSBsb2cgYmxvY2tzIHRvIGhpdCB0aGUgZGlzayovCisjZGVmaW5lIFdBSVQgICAgICAgIDQJCS8qIHdhaXQgZm9yIHRoZSBsb2cgYmxvY2tzIHRvIGhpdCB0aGUgZGlzayAqLwogCi1zdGF0aWMgaW50IGRvX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKixzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix1bnNpZ25lZCBsb25nIG5ibG9ja3MsaW50IGZsYWdzKSA7Ci1zdGF0aWMgaW50IGZsdXNoX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpIDsKLXN0YXRpYyBpbnQgZmx1c2hfY29tbWl0X2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKSAgOwotc3RhdGljIGludCBjYW5fZGlydHkoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSA7Ci1zdGF0aWMgaW50IGpvdXJuYWxfam9pbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2Nrcyk7Ci1zdGF0aWMgaW50IHJlbGVhc2Vfam91cm5hbF9kZXYoIHN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIsCi0JCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgKTsKK3N0YXRpYyBpbnQgZG9fam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLAorCQkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzLAorCQkJICBpbnQgZmxhZ3MpOworc3RhdGljIGludCBmbHVzaF9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCk7CitzdGF0aWMgaW50IGZsdXNoX2NvbW1pdF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCSAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCk7CitzdGF0aWMgaW50IGNhbl9kaXJ0eShzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pOworc3RhdGljIGludCBqb3VybmFsX2pvaW4oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKTsKK3N0YXRpYyBpbnQgcmVsZWFzZV9qb3VybmFsX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyLAorCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsKTsKIHN0YXRpYyBpbnQgZGlydHlfb25lX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKTsKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpOwogc3RhdGljIHZvaWQgZmx1c2hfYXN5bmNfY29tbWl0cyh2b2lkICpwKTsKIHN0YXRpYyB2b2lkIHF1ZXVlX2xvZ193cml0ZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKIAogLyogdmFsdWVzIGZvciBqb2luIGluIGRvX2pvdXJuYWxfYmVnaW5fciAqLwogZW51bSB7Ci0gICAgSkJFR0lOX1JFRyA9IDAsIC8qIHJlZ3VsYXIgam91cm5hbCBiZWdpbiAqLwotICAgIEpCRUdJTl9KT0lOID0gMSwgLyogam9pbiB0aGUgcnVubmluZyB0cmFuc2FjdGlvbiBpZiBhdCBhbGwgcG9zc2libGUgKi8KLSAgICBKQkVHSU5fQUJPUlQgPSAyLCAvKiBjYWxsZWQgZnJvbSBjbGVhbnVwIGNvZGUsIGlnbm9yZXMgYWJvcnRlZCBmbGFnICovCisJSkJFR0lOX1JFRyA9IDAsCQkvKiByZWd1bGFyIGpvdXJuYWwgYmVnaW4gKi8KKwlKQkVHSU5fSk9JTiA9IDEsCS8qIGpvaW4gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24gaWYgYXQgYWxsIHBvc3NpYmxlICovCisJSkJFR0lOX0FCT1JUID0gMiwJLyogY2FsbGVkIGZyb20gY2xlYW51cCBjb2RlLCBpZ25vcmVzIGFib3J0ZWQgZmxhZyAqLwogfTsKIAogc3RhdGljIGludCBkb19qb3VybmFsX2JlZ2luX3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBqb2luKTsKKwkJCSAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLCBpbnQgam9pbik7CiAKLXN0YXRpYyB2b2lkIGluaXRfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgbWVtc2V0KGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgMCwgSk9VUk5BTF9IQVNIX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikpIDsKK3N0YXRpYyB2b2lkIGluaXRfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCW1lbXNldChqb3VybmFsLT5qX2hhc2hfdGFibGUsIDAsCisJICAgICAgIEpPVVJOQUxfSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopKTsKIH0KIAogLyoKQEAgLTEyNSwxNDkgKzEzMCwxNTkgQEAKICoqIG1ha2Ugc2NoZWR1bGUgaGFwcGVuIGFmdGVyIEkndmUgZnJlZWQgYSBibG9jay4gIExvb2sgYXQgcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gYW5kIGpvdXJuYWxfbWFya19mcmVlZCBmb3IKICoqIG1vcmUgZGV0YWlscy4KICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gIGlmIChiaCkgewotICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfdGVzdChiaCk7Ci0gIH0KLSAgcmV0dXJuIDAgOworc3RhdGljIGludCByZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoYmgpIHsKKwkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfdGVzdChiaCk7CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2JhcnJpZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+KDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSCk7Ci0gICAgcHJpbnRrKCJyZWlzZXJmczogZGlzYWJsaW5nIGZsdXNoIGJhcnJpZXJzIG9uICVzXG4iLCByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIKTsKKwlwcmludGsoInJlaXNlcmZzOiBkaXNhYmxpbmcgZmx1c2ggYmFycmllcnMgb24gJXNcbiIsCisJICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHMpKTsKIH0KIAotc3RhdGljIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqCi1hbGxvY2F0ZV9iaXRtYXBfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuIDsKLSAgc3RhdGljIGludCBpZDsKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmFsbG9jYXRlX2JpdG1hcF9ub2RlKHN0cnVjdCBzdXBlcl9ibG9jaworCQkJCQkJCSAqcF9zX3NiKQoreworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm47CisJc3RhdGljIGludCBpZDsKIAotICBibiA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIEdGUF9OT0ZTLCBwX3Nfc2IpIDsKLSAgaWYgKCFibikgewotICAgIHJldHVybiBOVUxMIDsKLSAgfQotICBibi0+ZGF0YSA9IHJlaXNlcmZzX2ttYWxsb2MocF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgR0ZQX05PRlMsIHBfc19zYikgOwotICBpZiAoIWJuLT5kYXRhKSB7Ci0gICAgcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpIDsKLSAgICByZXR1cm4gTlVMTCA7Ci0gIH0KLSAgYm4tPmlkID0gaWQrKyA7Ci0gIG1lbXNldChibi0+ZGF0YSwgMCwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgOwotICBJTklUX0xJU1RfSEVBRCgmYm4tPmxpc3QpIDsKLSAgcmV0dXJuIGJuIDsKKwlibiA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIEdGUF9OT0ZTLAorCQkJICAgICAgcF9zX3NiKTsKKwlpZiAoIWJuKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlibi0+ZGF0YSA9IHJlaXNlcmZzX2ttYWxsb2MocF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgR0ZQX05PRlMsIHBfc19zYik7CisJaWYgKCFibi0+ZGF0YSkgeworCQlyZWlzZXJmc19rZnJlZShibiwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIHBfc19zYik7CisJCXJldHVybiBOVUxMOworCX0KKwlibi0+aWQgPSBpZCsrOworCW1lbXNldChibi0+ZGF0YSwgMCwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmJuLT5saXN0KTsKKwlyZXR1cm4gYm47CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKgotZ2V0X2JpdG1hcF9ub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA9IE5VTEw7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dCA7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpnZXRfYml0bWFwX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0OwogCi0gIGpvdXJuYWwtPmpfdXNlZF9iaXRtYXBfbm9kZXMrKyA7Ci1yZXBlYXQ6CisJam91cm5hbC0+al91c2VkX2JpdG1hcF9ub2RlcysrOworICAgICAgcmVwZWF0OgogCi0gIGlmKGVudHJ5ICE9ICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgewotICAgIGJuID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlLCBsaXN0KSA7Ci0gICAgbGlzdF9kZWwoZW50cnkpIDsKLSAgICBtZW1zZXQoYm4tPmRhdGEsIDAsIHBfc19zYi0+c19ibG9ja3NpemUpIDsKLSAgICBqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzLS0gOwotICAgIHJldHVybiBibiA7Ci0gIH0KLSAgYm4gPSBhbGxvY2F0ZV9iaXRtYXBfbm9kZShwX3Nfc2IpIDsKLSAgaWYgKCFibikgewotICAgIHlpZWxkKCk7Ci0gICAgZ290byByZXBlYXQgOwotICB9Ci0gIHJldHVybiBibiA7CisJaWYgKGVudHJ5ICE9ICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgeworCQlibiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSwgbGlzdCk7CisJCWxpc3RfZGVsKGVudHJ5KTsKKwkJbWVtc2V0KGJuLT5kYXRhLCAwLCBwX3Nfc2ItPnNfYmxvY2tzaXplKTsKKwkJam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2Rlcy0tOworCQlyZXR1cm4gYm47CisJfQorCWJuID0gYWxsb2NhdGVfYml0bWFwX25vZGUocF9zX3NiKTsKKwlpZiAoIWJuKSB7CisJCXlpZWxkKCk7CisJCWdvdG8gcmVwZWF0OworCX0KKwlyZXR1cm4gYm47CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9iaXRtYXBfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4pIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBqb3VybmFsLT5qX3VzZWRfYml0bWFwX25vZGVzLS0gOwotICBpZiAoam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcyA+IFJFSVNFUkZTX01BWF9CSVRNQVBfTk9ERVMpIHsKLSAgICByZWlzZXJmc19rZnJlZShibi0+ZGF0YSwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgcF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpIDsKLSAgfSBlbHNlIHsKLSAgICBsaXN0X2FkZCgmYm4tPmxpc3QsICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgOwotICAgIGpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMrKyA7Ci0gIH0KKwkJCQkgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlqb3VybmFsLT5qX3VzZWRfYml0bWFwX25vZGVzLS07CisJaWYgKGpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMgPiBSRUlTRVJGU19NQVhfQklUTUFQX05PREVTKSB7CisJCXJlaXNlcmZzX2tmcmVlKGJuLT5kYXRhLCBwX3Nfc2ItPnNfYmxvY2tzaXplLCBwX3Nfc2IpOworCQlyZWlzZXJmc19rZnJlZShibiwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIHBfc19zYik7CisJfSBlbHNlIHsKKwkJbGlzdF9hZGQoJmJuLT5saXN0LCAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpOworCQlqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzKys7CisJfQogfQogCi1zdGF0aWMgdm9pZCBhbGxvY2F0ZV9iaXRtYXBfbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgaW50IGkgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4gPSBOVUxMIDsKLSAgZm9yIChpID0gMCA7IGkgPCBSRUlTRVJGU19NSU5fQklUTUFQX05PREVTIDsgaSsrKSB7Ci0gICAgYm4gPSBhbGxvY2F0ZV9iaXRtYXBfbm9kZShwX3Nfc2IpIDsKLSAgICBpZiAoYm4pIHsKLSAgICAgIGxpc3RfYWRkKCZibi0+bGlzdCwgJmpvdXJuYWwtPmpfYml0bWFwX25vZGVzKSA7Ci0gICAgICBqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzKysgOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhayA7IC8vIHRoaXMgaXMgb2ssIHdlJ2xsIHRyeSBhZ2FpbiB3aGVuIG1vcmUgYXJlIG5lZWRlZCAKLSAgICB9Ci0gIH0KK3N0YXRpYyB2b2lkIGFsbG9jYXRlX2JpdG1hcF9ub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgUkVJU0VSRlNfTUlOX0JJVE1BUF9OT0RFUzsgaSsrKSB7CisJCWJuID0gYWxsb2NhdGVfYml0bWFwX25vZGUocF9zX3NiKTsKKwkJaWYgKGJuKSB7CisJCQlsaXN0X2FkZCgmYm4tPmxpc3QsICZqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcyk7CisJCQlqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzKys7CisJCX0gZWxzZSB7CisJCQlicmVhazsJLy8gdGhpcyBpcyBvaywgd2UnbGwgdHJ5IGFnYWluIHdoZW4gbW9yZSBhcmUgbmVlZGVkIAorCQl9CisJfQogfQogCiBzdGF0aWMgaW50IHNldF9iaXRfaW5fbGlzdF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGludCBibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiKSB7Ci0gIGludCBibWFwX25yID0gYmxvY2sgLyAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSA7Ci0gIGludCBiaXRfbnIgPSBibG9jayAlIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpIDsKKwkJCQkgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIpCit7CisJaW50IGJtYXBfbnIgPSBibG9jayAvIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCWludCBiaXRfbnIgPSBibG9jayAlIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpOwogCi0gIGlmICghamItPmJpdG1hcHNbYm1hcF9ucl0pIHsKLSAgICBqYi0+Yml0bWFwc1tibWFwX25yXSA9IGdldF9iaXRtYXBfbm9kZShwX3Nfc2IpIDsKLSAgfQotICBzZXRfYml0KGJpdF9uciwgKHVuc2lnbmVkIGxvbmcgKilqYi0+Yml0bWFwc1tibWFwX25yXS0+ZGF0YSkgOwotICByZXR1cm4gMCA7CisJaWYgKCFqYi0+Yml0bWFwc1tibWFwX25yXSkgeworCQlqYi0+Yml0bWFwc1tibWFwX25yXSA9IGdldF9iaXRtYXBfbm9kZShwX3Nfc2IpOworCX0KKwlzZXRfYml0KGJpdF9uciwgKHVuc2lnbmVkIGxvbmcgKilqYi0+Yml0bWFwc1tibWFwX25yXS0+ZGF0YSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFudXBfYml0bWFwX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIpIHsKLSAgaW50IGk7Ci0gIGlmIChqYi0+Yml0bWFwcyA9PSBOVUxMKQotICAgIHJldHVybjsKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiKQoreworCWludCBpOworCWlmIChqYi0+Yml0bWFwcyA9PSBOVUxMKQorCQlyZXR1cm47CiAKLSAgZm9yIChpID0gMCA7IGkgPCBTQl9CTUFQX05SKHBfc19zYikgOyBpKyspIHsKLSAgICBpZiAoamItPmJpdG1hcHNbaV0pIHsKLSAgICAgIGZyZWVfYml0bWFwX25vZGUocF9zX3NiLCBqYi0+Yml0bWFwc1tpXSkgOwotICAgICAgamItPmJpdG1hcHNbaV0gPSBOVUxMIDsKLSAgICB9Ci0gIH0KKwlmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUihwX3Nfc2IpOyBpKyspIHsKKwkJaWYgKGpiLT5iaXRtYXBzW2ldKSB7CisJCQlmcmVlX2JpdG1hcF9ub2RlKHBfc19zYiwgamItPmJpdG1hcHNbaV0pOworCQkJamItPmJpdG1hcHNbaV0gPSBOVUxMOworCQl9CisJfQogfQogCiAvKgogKiogb25seSBjYWxsIHRoaXMgb24gRlMgdW5tb3VudC4KICovCiBzdGF0aWMgaW50IGZyZWVfbGlzdF9iaXRtYXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiX2FycmF5KSB7Ci0gIGludCBpIDsKLSAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA7Ci0gIGZvciAoaSA9IDAgOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUyA7IGkrKykgewotICAgIGpiID0gamJfYXJyYXkgKyBpIDsKLSAgICBqYi0+am91cm5hbF9saXN0ID0gTlVMTCA7Ci0gICAgY2xlYW51cF9iaXRtYXBfbGlzdChwX3Nfc2IsIGpiKSA7Ci0gICAgdmZyZWUoamItPmJpdG1hcHMpIDsKLSAgICBqYi0+Yml0bWFwcyA9IE5VTEwgOwotICB9Ci0gIHJldHVybiAwOworCQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiX2FycmF5KQoreworCWludCBpOworCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamI7CisJZm9yIChpID0gMDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFM7IGkrKykgeworCQlqYiA9IGpiX2FycmF5ICsgaTsKKwkJamItPmpvdXJuYWxfbGlzdCA9IE5VTEw7CisJCWNsZWFudXBfYml0bWFwX2xpc3QocF9zX3NiLCBqYik7CisJCXZmcmVlKGpiLT5iaXRtYXBzKTsKKwkJamItPmJpdG1hcHMgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmcmVlX2JpdG1hcF9ub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0IDsKLSAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA7CitzdGF0aWMgaW50IGZyZWVfYml0bWFwX25vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0OworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm47CiAKLSAgd2hpbGUobmV4dCAhPSAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIHsKLSAgICBibiA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlLCBsaXN0KSA7Ci0gICAgbGlzdF9kZWwobmV4dCkgOwotICAgIHJlaXNlcmZzX2tmcmVlKGJuLT5kYXRhLCBwX3Nfc2ItPnNfYmxvY2tzaXplLCBwX3Nfc2IpIDsKLSAgICByZWlzZXJmc19rZnJlZShibiwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIHBfc19zYikgOwotICAgIG5leHQgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0IDsKLSAgICBqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzLS0gOwotICB9CisJd2hpbGUgKG5leHQgIT0gJmpvdXJuYWwtPmpfYml0bWFwX25vZGVzKSB7CisJCWJuID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUsIGxpc3QpOworCQlsaXN0X2RlbChuZXh0KTsKKwkJcmVpc2VyZnNfa2ZyZWUoYm4tPmRhdGEsIHBfc19zYi0+c19ibG9ja3NpemUsIHBfc19zYik7CisJCXJlaXNlcmZzX2tmcmVlKGJuLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlKSwgcF9zX3NiKTsKKwkJbmV4dCA9IGpvdXJuYWwtPmpfYml0bWFwX25vZGVzLm5leHQ7CisJCWpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMtLTsKKwl9CiAKLSAgcmV0dXJuIDAgOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMjc1LDU5ICsyOTAsNjUgQEAKICoqIGpiX2FycmF5IGlzIHRoZSBhcnJheSB0byBiZSBmaWxsZWQgaW4uCiAqLwogaW50IHJlaXNlcmZzX2FsbG9jYXRlX2xpc3RfYml0bWFwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYl9hcnJheSwKLQkJCQkgICBpbnQgYm1hcF9ucikgewotICBpbnQgaSA7Ci0gIGludCBmYWlsZWQgPSAwIDsKLSAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA7Ci0gIGludCBtZW0gPSBibWFwX25yICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKSA7CisJCQkJICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYl9hcnJheSwKKwkJCQkgICBpbnQgYm1hcF9ucikKK3sKKwlpbnQgaTsKKwlpbnQgZmFpbGVkID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiOworCWludCBtZW0gPSBibWFwX25yICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKTsKIAotICBmb3IgKGkgPSAwIDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFMgOyBpKyspIHsKLSAgICBqYiA9IGpiX2FycmF5ICsgaSA7Ci0gICAgamItPmpvdXJuYWxfbGlzdCA9IE5VTEwgOwotICAgIGpiLT5iaXRtYXBzID0gdm1hbGxvYyggbWVtICkgOwotICAgIGlmICghamItPmJpdG1hcHMpIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiY2xtLTIwMDAsIHVuYWJsZSB0byBhbGxvY2F0ZSBiaXRtYXBzIGZvciBqb3VybmFsIGxpc3RzIikgOwotICAgICAgZmFpbGVkID0gMTsgICAKLSAgICAgIGJyZWFrIDsKLSAgICB9Ci0gICAgbWVtc2V0KGpiLT5iaXRtYXBzLCAwLCBtZW0pIDsKLSAgfQotICBpZiAoZmFpbGVkKSB7Ci0gICAgZnJlZV9saXN0X2JpdG1hcHMocF9zX3NiLCBqYl9hcnJheSkgOwotICAgIHJldHVybiAtMSA7Ci0gIH0KLSAgcmV0dXJuIDAgOworCWZvciAoaSA9IDA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTOyBpKyspIHsKKwkJamIgPSBqYl9hcnJheSArIGk7CisJCWpiLT5qb3VybmFsX2xpc3QgPSBOVUxMOworCQlqYi0+Yml0bWFwcyA9IHZtYWxsb2MobWVtKTsKKwkJaWYgKCFqYi0+Yml0bWFwcykgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiY2xtLTIwMDAsIHVuYWJsZSB0byBhbGxvY2F0ZSBiaXRtYXBzIGZvciBqb3VybmFsIGxpc3RzIik7CisJCQlmYWlsZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KGpiLT5iaXRtYXBzLCAwLCBtZW0pOworCX0KKwlpZiAoZmFpbGVkKSB7CisJCWZyZWVfbGlzdF9iaXRtYXBzKHBfc19zYiwgamJfYXJyYXkpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOwogfQogCiAvKgogKiogZmluZCBhbiBhdmFpbGFibGUgbGlzdCBiaXRtYXAuICBJZiB5b3UgY2FuJ3QgZmluZCBvbmUsIGZsdXNoIGEgY29tbWl0IGxpc3QgCiAqKiBhbmQgdHJ5IGFnYWluCiAqLwotc3RhdGljIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqCi1nZXRfbGlzdF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKSB7Ci0gIGludCBpLGogOyAKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gTlVMTCA7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpnZXRfbGlzdF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJCQkgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdAorCQkJCQkJICAgICpqbCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gTlVMTDsKIAotICBmb3IgKGogPSAwIDsgaiA8IChKT1VSTkFMX05VTV9CSVRNQVBTICogMykgOyBqKyspIHsKLSAgICBpID0gam91cm5hbC0+al9saXN0X2JpdG1hcF9pbmRleCA7Ci0gICAgam91cm5hbC0+al9saXN0X2JpdG1hcF9pbmRleCA9IChpICsgMSkgJSBKT1VSTkFMX05VTV9CSVRNQVBTIDsKLSAgICBqYiA9IGpvdXJuYWwtPmpfbGlzdF9iaXRtYXAgKyBpIDsKLSAgICBpZiAoam91cm5hbC0+al9saXN0X2JpdG1hcFtpXS5qb3VybmFsX2xpc3QpIHsKLSAgICAgIGZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgam91cm5hbC0+al9saXN0X2JpdG1hcFtpXS5qb3VybmFsX2xpc3QsIDEpIDsKLSAgICAgIGlmICgham91cm5hbC0+al9saXN0X2JpdG1hcFtpXS5qb3VybmFsX2xpc3QpIHsKLQlicmVhayA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJyZWFrIDsKLSAgICB9Ci0gIH0KLSAgaWYgKGpiLT5qb3VybmFsX2xpc3QpIHsgLyogZG91YmxlIGNoZWNrIHRvIG1ha2Ugc3VyZSBpZiBmbHVzaGVkIGNvcnJlY3RseSAqLwotICAgIHJldHVybiBOVUxMIDsKLSAgfQotICBqYi0+am91cm5hbF9saXN0ID0gamwgOwotICByZXR1cm4gamIgOworCWZvciAoaiA9IDA7IGogPCAoSk9VUk5BTF9OVU1fQklUTUFQUyAqIDMpOyBqKyspIHsKKwkJaSA9IGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXg7CisJCWpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggPSAoaSArIDEpICUgSk9VUk5BTF9OVU1fQklUTUFQUzsKKwkJamIgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwICsgaTsKKwkJaWYgKGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0KSB7CisJCQlmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsCisJCQkJCSAgam91cm5hbC0+al9saXN0X2JpdG1hcFtpXS4KKwkJCQkJICBqb3VybmFsX2xpc3QsIDEpOworCQkJaWYgKCFqb3VybmFsLT5qX2xpc3RfYml0bWFwW2ldLmpvdXJuYWxfbGlzdCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGpiLT5qb3VybmFsX2xpc3QpIHsJLyogZG91YmxlIGNoZWNrIHRvIG1ha2Ugc3VyZSBpZiBmbHVzaGVkIGNvcnJlY3RseSAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisJamItPmpvdXJuYWxfbGlzdCA9IGpsOworCXJldHVybiBqYjsKIH0KIAogLyogCkBAIC0zMzUsMTA0ICszNTYsMTE0IEBACiAqKiBVc2VzIHRoZSBjbm9kZS0+bmV4dCBhbmQgY25vZGUtPnByZXYgcG9pbnRlcnMKICoqIHJldHVybnMgTlVMTCBvbiBmYWlsdXJlCiAqLwotc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICphbGxvY2F0ZV9jbm9kZXMoaW50IG51bV9jbm9kZXMpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmhlYWQgOwotICBpbnQgaSA7Ci0gIGlmIChudW1fY25vZGVzIDw9IDApIHsKLSAgICByZXR1cm4gTlVMTCA7Ci0gIH0KLSAgaGVhZCA9IHZtYWxsb2MobnVtX2Nub2RlcyAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsKLSAgaWYgKCFoZWFkKSB7Ci0gICAgcmV0dXJuIE5VTEwgOwotICB9Ci0gIG1lbXNldChoZWFkLCAwLCBudW1fY25vZGVzICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSkgOwotICBoZWFkWzBdLnByZXYgPSBOVUxMIDsKLSAgaGVhZFswXS5uZXh0ID0gaGVhZCArIDEgOwotICBmb3IgKGkgPSAxIDsgaSA8IG51bV9jbm9kZXM7IGkrKykgewotICAgIGhlYWRbaV0ucHJldiA9IGhlYWQgKyAoaSAtIDEpIDsKLSAgICBoZWFkW2ldLm5leHQgPSBoZWFkICsgKGkgKyAxKSA7IC8qIGlmIGxhc3Qgb25lLCBvdmVyd3JpdGUgaXQgYWZ0ZXIgdGhlIGlmICovCi0gIH0KLSAgaGVhZFtudW1fY25vZGVzIC0xXS5uZXh0ID0gTlVMTCA7Ci0gIHJldHVybiBoZWFkIDsKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqYWxsb2NhdGVfY25vZGVzKGludCBudW1fY25vZGVzKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpoZWFkOworCWludCBpOworCWlmIChudW1fY25vZGVzIDw9IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWhlYWQgPSB2bWFsbG9jKG51bV9jbm9kZXMgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUpKTsKKwlpZiAoIWhlYWQpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChoZWFkLCAwLCBudW1fY25vZGVzICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSk7CisJaGVhZFswXS5wcmV2ID0gTlVMTDsKKwloZWFkWzBdLm5leHQgPSBoZWFkICsgMTsKKwlmb3IgKGkgPSAxOyBpIDwgbnVtX2Nub2RlczsgaSsrKSB7CisJCWhlYWRbaV0ucHJldiA9IGhlYWQgKyAoaSAtIDEpOworCQloZWFkW2ldLm5leHQgPSBoZWFkICsgKGkgKyAxKTsJLyogaWYgbGFzdCBvbmUsIG92ZXJ3cml0ZSBpdCBhZnRlciB0aGUgaWYgKi8KKwl9CisJaGVhZFtudW1fY25vZGVzIC0gMV0ubmV4dCA9IE5VTEw7CisJcmV0dXJuIGhlYWQ7CiB9CiAKIC8qCiAqKiBwdWxscyBhIGNub2RlIG9mZiB0aGUgZnJlZSBsaXN0LCBvciByZXR1cm5zIE5VTEwgb24gZmFpbHVyZSAKICovCi1zdGF0aWMgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmdldF9jbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmdldF9jbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY247CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CiAKLSAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJnZXRfY25vZGUiKSA7CisJcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJnZXRfY25vZGUiKTsKIAotICBpZiAoam91cm5hbC0+al9jbm9kZV9mcmVlIDw9IDApIHsKLSAgICByZXR1cm4gTlVMTCA7Ci0gIH0KLSAgam91cm5hbC0+al9jbm9kZV91c2VkKysgOwotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWUtLSA7Ci0gIGNuID0gam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgOwotICBpZiAoIWNuKSB7Ci0gICAgcmV0dXJuIGNuIDsKLSAgfQotICBpZiAoY24tPm5leHQpIHsKLSAgICBjbi0+bmV4dC0+cHJldiA9IE5VTEwgOwotICB9Ci0gIGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID0gY24tPm5leHQgOwotICBtZW1zZXQoY24sIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsKLSAgcmV0dXJuIGNuIDsKKwlpZiAoam91cm5hbC0+al9jbm9kZV9mcmVlIDw9IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWpvdXJuYWwtPmpfY25vZGVfdXNlZCsrOworCWpvdXJuYWwtPmpfY25vZGVfZnJlZS0tOworCWNuID0gam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3Q7CisJaWYgKCFjbikgeworCQlyZXR1cm4gY247CisJfQorCWlmIChjbi0+bmV4dCkgeworCQljbi0+bmV4dC0+cHJldiA9IE5VTEw7CisJfQorCWpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID0gY24tPm5leHQ7CisJbWVtc2V0KGNuLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUpKTsKKwlyZXR1cm4gY247CiB9CiAKIC8qCiAqKiByZXR1cm5zIGEgY25vZGUgdG8gdGhlIGZyZWUgbGlzdCAKICovCi1zdGF0aWMgdm9pZCBmcmVlX2Nub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworc3RhdGljIHZvaWQgZnJlZV9jbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImZyZWVfY25vZGUiKSA7CisJcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJmcmVlX2Nub2RlIik7CiAKLSAgam91cm5hbC0+al9jbm9kZV91c2VkLS0gOwotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWUrKyA7Ci0gIC8qIG1lbXNldChjbiwgMCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSkgOyAqLwotICBjbi0+bmV4dCA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0IDsKLSAgaWYgKGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0KSB7Ci0gICAgam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QtPnByZXYgPSBjbiA7Ci0gIH0KLSAgY24tPnByZXYgPSBOVUxMIDsgLyogbm90IG5lZWRlZCB3aXRoIHRoZSBtZW1zZXQsIGJ1dCBJIG1pZ2h0IGtpbGwgdGhlIG1lbXNldCwgYW5kIGZvcmdldCB0byBkbyB0aGlzICovCi0gIGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID0gY24gOworCWpvdXJuYWwtPmpfY25vZGVfdXNlZC0tOworCWpvdXJuYWwtPmpfY25vZGVfZnJlZSsrOworCS8qIG1lbXNldChjbiwgMCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSkgOyAqLworCWNuLT5uZXh0ID0gam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3Q7CisJaWYgKGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0KSB7CisJCWpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0LT5wcmV2ID0gY247CisJfQorCWNuLT5wcmV2ID0gTlVMTDsJLyogbm90IG5lZWRlZCB3aXRoIHRoZSBtZW1zZXQsIGJ1dCBJIG1pZ2h0IGtpbGwgdGhlIG1lbXNldCwgYW5kIGZvcmdldCB0byBkbyB0aGlzICovCisJam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBjbjsKIH0KIAotc3RhdGljIHZvaWQgY2xlYXJfcHJlcGFyZWRfYml0cyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCk7Ci0gIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKTsKK3N0YXRpYyB2b2lkIGNsZWFyX3ByZXBhcmVkX2JpdHMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwljbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZChiaCk7CisJY2xlYXJfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eShiaCk7CiB9CiAKIC8qIHV0aWxpdHkgZnVuY3Rpb24gdG8gZm9yY2UgYSBCVUcgaWYgaXQgaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGJpZwogKioga2VybmVsIGxvY2sgaGVsZC4gIGNhbGxlciBpcyB0aGUgc3RyaW5nIHByaW50ZWQganVzdCBiZWZvcmUgY2FsbGluZyBCVUcoKQogKi8KLXZvaWQgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpjYWxsZXIpIHsKK3ZvaWQgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpjYWxsZXIpCit7CiAjaWZkZWYgQ09ORklHX1NNUAotICBpZiAoY3VycmVudC0+bG9ja19kZXB0aCA8IDApIHsKLSAgICByZWlzZXJmc19wYW5pYyAoc2IsICIlcyBjYWxsZWQgd2l0aG91dCBrZXJuZWwgbG9jayBoZWxkIiwgY2FsbGVyKSA7Ci0gIH0KKwlpZiAoY3VycmVudC0+bG9ja19kZXB0aCA8IDApIHsKKwkJcmVpc2VyZnNfcGFuaWMoc2IsICIlcyBjYWxsZWQgd2l0aG91dCBrZXJuZWwgbG9jayBoZWxkIiwKKwkJCSAgICAgICBjYWxsZXIpOworCX0KICNlbHNlCi0gIDsKKwk7CiAjZW5kaWYKIH0KIAogLyogcmV0dXJuIGEgY25vZGUgd2l0aCBzYW1lIGRldiwgYmxvY2sgbnVtYmVyIGFuZCBzaXplIGluIHRhYmxlLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqCi1nZXRfam91cm5hbF9oYXNoX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqdGFibGUsCi0JCSAgICAgbG9uZyBibCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmdldF9qb3VybmFsX2hhc2hfZGV2KHN0cnVjdAorCQkJCQkJCQkgIHN1cGVyX2Jsb2NrCisJCQkJCQkJCSAgKnNiLAorCQkJCQkJCQkgIHN0cnVjdAorCQkJCQkJCQkgIHJlaXNlcmZzX2pvdXJuYWxfY25vZGUKKwkJCQkJCQkJICAqKnRhYmxlLAorCQkJCQkJCQkgIGxvbmcgYmwpCiB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiA7Ci0gIGNuID0gam91cm5hbF9oYXNoKHRhYmxlLCBzYiwgYmwpIDsKLSAgd2hpbGUoY24pIHsKLSAgICBpZiAoY24tPmJsb2NrbnIgPT0gYmwgJiYgY24tPnNiID09IHNiKQotICAgICAgcmV0dXJuIGNuIDsKLSAgICBjbiA9IGNuLT5obmV4dCA7Ci0gIH0KLSAgcmV0dXJuIChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKTAgOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKKwljbiA9IGpvdXJuYWxfaGFzaCh0YWJsZSwgc2IsIGJsKTsKKwl3aGlsZSAoY24pIHsKKwkJaWYgKGNuLT5ibG9ja25yID09IGJsICYmIGNuLT5zYiA9PSBzYikKKwkJCXJldHVybiBjbjsKKwkJY24gPSBjbi0+aG5leHQ7CisJfQorCXJldHVybiAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikwOwogfQogCiAvKgpAQCAtNDU0LDkxICs0ODUsMTAzIEBACiAqKgogKi8KIGludCByZWlzZXJmc19pbl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJtYXBfbnIsIGludCBiaXRfbnIsIGludCBzZWFyY2hfYWxsLCAKLQkJCWJfYmxvY2tucl90ICpuZXh0X3plcm9fYml0KSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuIDsKLSAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA7Ci0gIGludCBpIDsKLSAgdW5zaWduZWQgbG9uZyBibDsKKwkJCWludCBibWFwX25yLCBpbnQgYml0X25yLCBpbnQgc2VhcmNoX2FsbCwKKwkJCWJfYmxvY2tucl90ICogbmV4dF96ZXJvX2JpdCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY247CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGJsOwogCi0gICpuZXh0X3plcm9fYml0ID0gMCA7IC8qIGFsd2F5cyBzdGFydCB0aGlzIGF0IHplcm8uICovCisJKm5leHRfemVyb19iaXQgPSAwOwkvKiBhbHdheXMgc3RhcnQgdGhpcyBhdCB6ZXJvLiAqLwogCi0gIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5pbl9qb3VybmFsICk7Ci0gIC8qIElmIHdlIGFyZW4ndCBkb2luZyBhIHNlYXJjaF9hbGwsIHRoaXMgaXMgYSBtZXRhYmxvY2ssIGFuZCBpdCB3aWxsIGJlIGxvZ2dlZCBiZWZvcmUgdXNlLgotICAqKiBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIHRoYXQgZnJlZWQgaXQgY29tbWl0cywgIHRoaXMgdHJhbnNhY3Rpb24gd29uJ3QKLSAgKiogaGF2ZSBjb21taXR0ZWQgZWl0aGVyLCBhbmQgdGhlIGJsb2NrIHdpbGwgbmV2ZXIgYmUgd3JpdHRlbgotICAqLwotICBpZiAoc2VhcmNoX2FsbCkgewotICAgIGZvciAoaSA9IDAgOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUyA7IGkrKykgewotICAgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfYml0bWFwICk7Ci0gICAgICBqYiA9IGpvdXJuYWwtPmpfbGlzdF9iaXRtYXAgKyBpIDsKLSAgICAgIGlmIChqYi0+am91cm5hbF9saXN0ICYmIGpiLT5iaXRtYXBzW2JtYXBfbnJdICYmCi0gICAgICAgICAgdGVzdF9iaXQoYml0X25yLCAodW5zaWduZWQgbG9uZyAqKWpiLT5iaXRtYXBzW2JtYXBfbnJdLT5kYXRhKSkgewotCSpuZXh0X3plcm9fYml0ID0gZmluZF9uZXh0X3plcm9fYml0KCh1bnNpZ25lZCBsb25nICopCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamItPmJpdG1hcHNbYm1hcF9ucl0tPmRhdGEpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzLCBiaXRfbnIrMSkgOyAKLQlyZXR1cm4gMSA7Ci0gICAgICB9Ci0gICAgfQotICB9CisJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwuaW5fam91cm5hbCk7CisJLyogSWYgd2UgYXJlbid0IGRvaW5nIGEgc2VhcmNoX2FsbCwgdGhpcyBpcyBhIG1ldGFibG9jaywgYW5kIGl0IHdpbGwgYmUgbG9nZ2VkIGJlZm9yZSB1c2UuCisJICoqIGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gdGhhdCBmcmVlZCBpdCBjb21taXRzLCAgdGhpcyB0cmFuc2FjdGlvbiB3b24ndAorCSAqKiBoYXZlIGNvbW1pdHRlZCBlaXRoZXIsIGFuZCB0aGUgYmxvY2sgd2lsbCBuZXZlciBiZSB3cml0dGVuCisJICovCisJaWYgKHNlYXJjaF9hbGwpIHsKKwkJZm9yIChpID0gMDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFM7IGkrKykgeworCQkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwuaW5fam91cm5hbF9iaXRtYXApOworCQkJamIgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwICsgaTsKKwkJCWlmIChqYi0+am91cm5hbF9saXN0ICYmIGpiLT5iaXRtYXBzW2JtYXBfbnJdICYmCisJCQkgICAgdGVzdF9iaXQoYml0X25yLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgKilqYi0+Yml0bWFwc1tibWFwX25yXS0+CisJCQkJICAgICBkYXRhKSkgeworCQkJCSpuZXh0X3plcm9fYml0ID0KKwkJCQkgICAgZmluZF9uZXh0X3plcm9fYml0KCh1bnNpZ25lZCBsb25nICopCisJCQkJCQkgICAgICAgKGpiLT5iaXRtYXBzW2JtYXBfbnJdLT4KKwkJCQkJCQlkYXRhKSwKKwkJCQkJCSAgICAgICBwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMsCisJCQkJCQkgICAgICAgYml0X25yICsgMSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CiAKLSAgYmwgPSBibWFwX25yICogKHBfc19zYi0+c19ibG9ja3NpemUgPDwgMykgKyBiaXRfbnI7Ci0gIC8qIGlzIGl0IGluIGFueSBvbGQgdHJhbnNhY3Rpb25zPyAqLwotICBpZiAoc2VhcmNoX2FsbCAmJiAoY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCBibCkpKSB7Ci0gICAgcmV0dXJuIDE7IAotICB9CisJYmwgPSBibWFwX25yICogKHBfc19zYi0+c19ibG9ja3NpemUgPDwgMykgKyBiaXRfbnI7CisJLyogaXMgaXQgaW4gYW55IG9sZCB0cmFuc2FjdGlvbnM/ICovCisJaWYgKHNlYXJjaF9hbGwKKwkgICAgJiYgKGNuID0KKwkJZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgYmwpKSkgeworCQlyZXR1cm4gMTsKKwl9CiAKLSAgLyogaXMgaXQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLSAgaWYgKChjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibCkpKSB7Ci0gICAgQlVHKCk7Ci0gICAgcmV0dXJuIDE7IAotICB9CisJLyogaXMgaXQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlpZiAoKGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2hhc2hfdGFibGUsIGJsKSkpIHsKKwkJQlVHKCk7CisJCXJldHVybiAxOworCX0KIAotICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuaW5fam91cm5hbF9yZXVzYWJsZSApOwotICAvKiBzYWZlIGZvciByZXVzZSAqLwotICByZXR1cm4gMCA7CisJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwuaW5fam91cm5hbF9yZXVzYWJsZSk7CisJLyogc2FmZSBmb3IgcmV1c2UgKi8KKwlyZXR1cm4gMDsKIH0KIAogLyogaW5zZXJ0IGNuIGludG8gdGFibGUKICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5zZXJ0X2pvdXJuYWxfaGFzaChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKnRhYmxlLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuX29yaWcgOworc3RhdGljIGlubGluZSB2b2lkIGluc2VydF9qb3VybmFsX2hhc2goc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKip0YWJsZSwKKwkJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbl9vcmlnOwogCi0gIGNuX29yaWcgPSBqb3VybmFsX2hhc2godGFibGUsIGNuLT5zYiwgY24tPmJsb2NrbnIpIDsKLSAgY24tPmhuZXh0ID0gY25fb3JpZyA7Ci0gIGNuLT5ocHJldiA9IE5VTEwgOwotICBpZiAoY25fb3JpZykgewotICAgIGNuX29yaWctPmhwcmV2ID0gY24gOwotICB9Ci0gIGpvdXJuYWxfaGFzaCh0YWJsZSwgY24tPnNiLCBjbi0+YmxvY2tucikgPSAgY24gOworCWNuX29yaWcgPSBqb3VybmFsX2hhc2godGFibGUsIGNuLT5zYiwgY24tPmJsb2NrbnIpOworCWNuLT5obmV4dCA9IGNuX29yaWc7CisJY24tPmhwcmV2ID0gTlVMTDsKKwlpZiAoY25fb3JpZykgeworCQljbl9vcmlnLT5ocHJldiA9IGNuOworCX0KKwlqb3VybmFsX2hhc2godGFibGUsIGNuLT5zYiwgY24tPmJsb2NrbnIpID0gY247CiB9CiAKIC8qIGxvY2sgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KLWlubGluZSBzdGF0aWMgdm9pZCBsb2NrX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubG9ja19qb3VybmFsICk7Ci0gICAgZG93bigmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX2xvY2spOworaW5saW5lIHN0YXRpYyB2b2lkIGxvY2tfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwlQUk9DX0lORk9fSU5DKHBfc19zYiwgam91cm5hbC5sb2NrX2pvdXJuYWwpOworCWRvd24oJlNCX0pPVVJOQUwocF9zX3NiKS0+al9sb2NrKTsKIH0KIAogLyogdW5sb2NrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCi1pbmxpbmUgc3RhdGljIHZvaWQgdW5sb2NrX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgICB1cCgmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX2xvY2spOworaW5saW5lIHN0YXRpYyB2b2lkIHVubG9ja19qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXVwKCZTQl9KT1VSTkFMKHBfc19zYiktPmpfbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfam91cm5hbF9saXN0KHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQogewotICAgIGpsLT5qX3JlZmNvdW50Kys7CisJamwtPmpfcmVmY291bnQrKzsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKKwkJCQkgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCiB7Ci0gICAgaWYgKGpsLT5qX3JlZmNvdW50IDwgMSkgewotICAgICAgICByZWlzZXJmc19wYW5pYyAocywgInRyYW5zIGlkICVsdSwgcmVmY291bnQgYXQgJWQiLCBqbC0+al90cmFuc19pZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsLT5qX3JlZmNvdW50KTsKLSAgICB9Ci0gICAgaWYgKC0tamwtPmpfcmVmY291bnQgPT0gMCkKLSAgICAgICAgcmVpc2VyZnNfa2ZyZWUoamwsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0KSwgcyk7CisJaWYgKGpsLT5qX3JlZmNvdW50IDwgMSkgeworCQlyZWlzZXJmc19wYW5pYyhzLCAidHJhbnMgaWQgJWx1LCByZWZjb3VudCBhdCAlZCIsCisJCQkgICAgICAgamwtPmpfdHJhbnNfaWQsIGpsLT5qX3JlZmNvdW50KTsKKwl9CisJaWYgKC0tamwtPmpfcmVmY291bnQgPT0gMCkKKwkJcmVpc2VyZnNfa2ZyZWUoamwsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0KSwgcyk7CiB9CiAKIC8qCkBAIC01NDYsMzU4ICs1ODksMzc1IEBACiAqKiBpdCBnZXRzIGNhbGxlZCBieSBmbHVzaF9jb21taXRfbGlzdCwgYW5kIGNsZWFucyB1cCBhbnkgZGF0YSBzdG9yZWQgYWJvdXQgYmxvY2tzIGZyZWVkIGR1cmluZyBhCiAqKiB0cmFuc2FjdGlvbi4KICovCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2ZyZWVkX2Zvcl9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKSB7CitzdGF0aWMgdm9pZCBjbGVhbnVwX2ZyZWVkX2Zvcl9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJCSAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQorewogCi0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgPSBqbC0+al9saXN0X2JpdG1hcCA7Ci0gIGlmIChqYikgewotICAgIGNsZWFudXBfYml0bWFwX2xpc3QocF9zX3NiLCBqYikgOwotICB9Ci0gIGpsLT5qX2xpc3RfYml0bWFwLT5qb3VybmFsX2xpc3QgPSBOVUxMIDsKLSAgamwtPmpfbGlzdF9iaXRtYXAgPSBOVUxMIDsKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gamwtPmpfbGlzdF9iaXRtYXA7CisJaWYgKGpiKSB7CisJCWNsZWFudXBfYml0bWFwX2xpc3QocF9zX3NiLCBqYik7CisJfQorCWpsLT5qX2xpc3RfYml0bWFwLT5qb3VybmFsX2xpc3QgPSBOVUxMOworCWpsLT5qX2xpc3RfYml0bWFwID0gTlVMTDsKIH0KIAogc3RhdGljIGludCBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKKwkJCQkgICAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0OwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKIAotICAgIGlmICghbGlzdF9lbXB0eShlbnRyeSkpIHsKLSAgICAgICAgamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnktPm5leHQpOwotCWlmIChqbC0+al90cmFuc19pZCA8PSB0cmFuc19pZCkgewotCSAgICByZXR1cm4gMTsKKwlpZiAoIWxpc3RfZW1wdHkoZW50cnkpKSB7CisJCWpsID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5LT5uZXh0KTsKKwkJaWYgKGpsLT5qX3RyYW5zX2lkIDw9IHRyYW5zX2lkKSB7CisJCQlyZXR1cm4gMTsKKwkJfQogCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJlaXNlcmZzX2VuZF9idWZmZXJfaW9fc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpIHsKLSAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CitzdGF0aWMgdm9pZCByZWlzZXJmc19lbmRfYnVmZmVyX2lvX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQoreworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotICAgIGlmIChidWZmZXJfam91cm5hbGVkKGJoKSkgewotICAgICAgICByZWlzZXJmc193YXJuaW5nKE5VTEwsICJjbG0tMjA4NDogcGlubmVkIGJ1ZmZlciAlbHU6JXMgc2VudCB0byBkaXNrIiwKLQkgICAgICAgICAgICAgICAgIGJoLT5iX2Jsb2NrbnIsIGJkZXZuYW1lKGJoLT5iX2JkZXYsIGIpKSA7Ci0gICAgfQotICAgIGlmICh1cHRvZGF0ZSkKLSAgICAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCkgOwotICAgIGVsc2UKLSAgICAJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKSA7Ci0gICAgdW5sb2NrX2J1ZmZlcihiaCkgOwotICAgIHB1dF9iaChiaCkgOworCWlmIChidWZmZXJfam91cm5hbGVkKGJoKSkgeworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJICJjbG0tMjA4NDogcGlubmVkIGJ1ZmZlciAlbHU6JXMgc2VudCB0byBkaXNrIiwKKwkJCQkgYmgtPmJfYmxvY2tuciwgYmRldm5hbWUoYmgtPmJfYmRldiwgYikpOworCX0KKwlpZiAodXB0b2RhdGUpCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCWVsc2UKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKwlwdXRfYmgoYmgpOwogfQogCi1zdGF0aWMgdm9pZCByZWlzZXJmc19lbmRfb3JkZXJlZF9pbyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpIHsKLSAgICBpZiAodXB0b2RhdGUpCi0gICAgCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpIDsKLSAgICBlbHNlCi0gICAgCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCkgOwotICAgIHVubG9ja19idWZmZXIoYmgpIDsKLSAgICBwdXRfYmgoYmgpIDsKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwlpZiAodXB0b2RhdGUpCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCWVsc2UKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKwlwdXRfYmgoYmgpOwogfQogCi1zdGF0aWMgdm9pZCBzdWJtaXRfbG9nZ2VkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgZ2V0X2JoKGJoKSA7Ci0gICAgYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX2J1ZmZlcl9pb19zeW5jIDsKLSAgICBjbGVhcl9idWZmZXJfam91cm5hbF9uZXcgKGJoKTsKLSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpIDsKLSAgICBpZiAoIXRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfdGVzdCAoYmgpKQotICAgICAgICBCVUcoKTsKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCi0gICAgICAgIEJVRygpOwotICAgIHN1Ym1pdF9iaChXUklURSwgYmgpIDsKK3N0YXRpYyB2b2lkIHN1Ym1pdF9sb2dnZWRfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJZ2V0X2JoKGJoKTsKKwliaC0+Yl9lbmRfaW8gPSByZWlzZXJmc19lbmRfYnVmZmVyX2lvX3N5bmM7CisJY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3KGJoKTsKKwljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCWlmICghdGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF90ZXN0KGJoKSkKKwkJQlVHKCk7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlCVUcoKTsKKwlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKIH0KIAotc3RhdGljIHZvaWQgc3VibWl0X29yZGVyZWRfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKLSAgICBnZXRfYmgoYmgpIDsKLSAgICBiaC0+Yl9lbmRfaW8gPSByZWlzZXJmc19lbmRfb3JkZXJlZF9pbzsKLSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpIDsKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCi0gICAgICAgIEJVRygpOwotICAgIHN1Ym1pdF9iaChXUklURSwgYmgpIDsKK3N0YXRpYyB2b2lkIHN1Ym1pdF9vcmRlcmVkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWdldF9iaChiaCk7CisJYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX29yZGVyZWRfaW87CisJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCUJVRygpOworCXN1Ym1pdF9iaChXUklURSwgYmgpOwogfQogCi1zdGF0aWMgaW50IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgZ2V0X2JoKGJoKSA7Ci0gICAgYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX29yZGVyZWRfaW87Ci0gICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSA7Ci0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQotICAgICAgICBCVUcoKTsKLSAgICByZXR1cm4gc3VibWl0X2JoKFdSSVRFX0JBUlJJRVIsIGJoKSA7CitzdGF0aWMgaW50IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWdldF9iaChiaCk7CisJYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX29yZGVyZWRfaW87CisJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCUJVRygpOworCXJldHVybiBzdWJtaXRfYmgoV1JJVEVfQkFSUklFUiwgYmgpOwogfQogCiBzdGF0aWMgdm9pZCBjaGVja19iYXJyaWVyX2NvbXBsZXRpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKLSAgICBpZiAoYnVmZmVyX2VvcG5vdHN1cHAoYmgpKSB7Ci0JY2xlYXJfYnVmZmVyX2VvcG5vdHN1cHAoYmgpOwotCWRpc2FibGVfYmFycmllcihzKTsKLQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKLQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7Ci0gICAgfQorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoYnVmZmVyX2VvcG5vdHN1cHAoYmgpKSB7CisJCWNsZWFyX2J1ZmZlcl9lb3Bub3RzdXBwKGJoKTsKKwkJZGlzYWJsZV9iYXJyaWVyKHMpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwl9CiB9CiAKICNkZWZpbmUgQ0hVTktfU0laRSAzMgogc3RydWN0IGJ1ZmZlcl9jaHVuayB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaFtDSFVOS19TSVpFXTsKLSAgICBpbnQgbnI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaFtDSFVOS19TSVpFXTsKKwlpbnQgbnI7CiB9OwogCi1zdGF0aWMgdm9pZCB3cml0ZV9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykgewotICAgIGludCBpOwotICAgIGdldF9mc19leGNsKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNodW5rLT5uciA7IGkrKykgewotCXN1Ym1pdF9sb2dnZWRfYnVmZmVyKGNodW5rLT5iaFtpXSkgOwotICAgIH0KLSAgICBjaHVuay0+bnIgPSAwOwotICAgIHB1dF9mc19leGNsKCk7CitzdGF0aWMgdm9pZCB3cml0ZV9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykKK3sKKwlpbnQgaTsKKwlnZXRfZnNfZXhjbCgpOworCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnI7IGkrKykgeworCQlzdWJtaXRfbG9nZ2VkX2J1ZmZlcihjaHVuay0+YmhbaV0pOworCX0KKwljaHVuay0+bnIgPSAwOworCXB1dF9mc19leGNsKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX29yZGVyZWRfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspIHsKLSAgICBpbnQgaTsKLSAgICBnZXRfZnNfZXhjbCgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnIgOyBpKyspIHsKLQlzdWJtaXRfb3JkZXJlZF9idWZmZXIoY2h1bmstPmJoW2ldKSA7Ci0gICAgfQotICAgIGNodW5rLT5uciA9IDA7Ci0gICAgcHV0X2ZzX2V4Y2woKTsKK3N0YXRpYyB2b2lkIHdyaXRlX29yZGVyZWRfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspCit7CisJaW50IGk7CisJZ2V0X2ZzX2V4Y2woKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5yOyBpKyspIHsKKwkJc3VibWl0X29yZGVyZWRfYnVmZmVyKGNodW5rLT5iaFtpXSk7CisJfQorCWNodW5rLT5uciA9IDA7CisJcHV0X2ZzX2V4Y2woKTsKIH0KIAogc3RhdGljIGludCBhZGRfdG9fY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkgc3BpbmxvY2tfdCAqbG9jaywKLQkJCSB2b2lkIChmbikoc3RydWN0IGJ1ZmZlcl9jaHVuayAqKSkKKwkJCXNwaW5sb2NrX3QgKiBsb2NrLCB2b2lkIChmbikgKHN0cnVjdCBidWZmZXJfY2h1bmsgKikpCiB7Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgaWYgKGNodW5rLT5uciA+PSBDSFVOS19TSVpFKQotICAgICAgICBCVUcoKTsKLSAgICBjaHVuay0+YmhbY2h1bmstPm5yKytdID0gYmg7Ci0gICAgaWYgKGNodW5rLT5uciA+PSBDSFVOS19TSVpFKSB7Ci0JcmV0ID0gMTsKLSAgICAgICAgaWYgKGxvY2spCi0JICAgIHNwaW5fdW5sb2NrKGxvY2spOwotICAgICAgICBmbihjaHVuayk7Ci0gICAgICAgIGlmIChsb2NrKQotCSAgICBzcGluX2xvY2sobG9jayk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7CisJaW50IHJldCA9IDA7CisJaWYgKGNodW5rLT5uciA+PSBDSFVOS19TSVpFKQorCQlCVUcoKTsKKwljaHVuay0+YmhbY2h1bmstPm5yKytdID0gYmg7CisJaWYgKGNodW5rLT5uciA+PSBDSFVOS19TSVpFKSB7CisJCXJldCA9IDE7CisJCWlmIChsb2NrKQorCQkJc3Bpbl91bmxvY2sobG9jayk7CisJCWZuKGNodW5rKTsKKwkJaWYgKGxvY2spCisJCQlzcGluX2xvY2sobG9jayk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKLQogc3RhdGljIGF0b21pY190IG5yX3JlaXNlcmZzX2poID0gQVRPTUlDX0lOSVQoMCk7Ci1zdGF0aWMgc3RydWN0IHJlaXNlcmZzX2poICphbGxvY19qaCh2b2lkKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2poICpqaDsKLSAgICB3aGlsZSgxKSB7Ci0JamggPSBrbWFsbG9jKHNpemVvZigqamgpLCBHRlBfTk9GUyk7Ci0JaWYgKGpoKSB7Ci0JICAgIGF0b21pY19pbmMoJm5yX3JlaXNlcmZzX2poKTsKLQkgICAgcmV0dXJuIGpoOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qaCAqYWxsb2Nfamgodm9pZCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOworCXdoaWxlICgxKSB7CisJCWpoID0ga21hbGxvYyhzaXplb2YoKmpoKSwgR0ZQX05PRlMpOworCQlpZiAoamgpIHsKKwkJCWF0b21pY19pbmMoJm5yX3JlaXNlcmZzX2poKTsKKwkJCXJldHVybiBqaDsKKwkJfQorCQl5aWVsZCgpOwogCX0KLSAgICAgICAgeWllbGQoKTsKLSAgICB9CiB9CiAKIC8qCiAgKiB3ZSB3YW50IHRvIGZyZWUgdGhlIGpoIHdoZW4gdGhlIGJ1ZmZlciBoYXMgYmVlbiB3cml0dGVuCiAgKiBhbmQgd2FpdGVkIG9uCiAgKi8KLXZvaWQgcmVpc2VyZnNfZnJlZV9qaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2poICpqaDsKK3ZvaWQgcmVpc2VyZnNfZnJlZV9qaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCByZWlzZXJmc19qaCAqamg7CiAKLSAgICBqaCA9IGJoLT5iX3ByaXZhdGU7Ci0gICAgaWYgKGpoKSB7Ci0JYmgtPmJfcHJpdmF0ZSA9IE5VTEw7Ci0JamgtPmJoID0gTlVMTDsKLQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7Ci0Ja2ZyZWUoamgpOwotCWlmIChhdG9taWNfcmVhZCgmbnJfcmVpc2VyZnNfamgpIDw9IDApCi0JICAgIEJVRygpOwotCWF0b21pY19kZWMoJm5yX3JlaXNlcmZzX2poKTsKLQlwdXRfYmgoYmgpOwotICAgIH0KKwlqaCA9IGJoLT5iX3ByaXZhdGU7CisJaWYgKGpoKSB7CisJCWJoLT5iX3ByaXZhdGUgPSBOVUxMOworCQlqaC0+YmggPSBOVUxMOworCQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7CisJCWtmcmVlKGpoKTsKKwkJaWYgKGF0b21pY19yZWFkKCZucl9yZWlzZXJmc19qaCkgPD0gMCkKKwkJCUJVRygpOworCQlhdG9taWNfZGVjKCZucl9yZWlzZXJmc19qaCk7CisJCXB1dF9iaChiaCk7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX2FkZF9qaChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWlsKQorCQkJICAgaW50IHRhaWwpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2poICpqaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOwogCi0gICAgaWYgKGJoLT5iX3ByaXZhdGUpIHsKLQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKLQlpZiAoIWJoLT5iX3ByaXZhdGUpIHsKLQkgICAgc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKLQkgICAgZ290byBub19qaDsKKwlpZiAoYmgtPmJfcHJpdmF0ZSkgeworCQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwkJaWYgKCFiaC0+Yl9wcml2YXRlKSB7CisJCQlzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCQkJZ290byBub19qaDsKKwkJfQorCQlqaCA9IGJoLT5iX3ByaXZhdGU7CisJCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKKwl9IGVsc2UgeworCSAgICAgIG5vX2poOgorCQlnZXRfYmgoYmgpOworCQlqaCA9IGFsbG9jX2poKCk7CisJCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCQkvKiBidWZmZXIgbXVzdCBiZSBsb2NrZWQgZm9yIF9fYWRkX2poLCBzaG91bGQgYmUgYWJsZSB0byBoYXZlCisJCSAqIHR3byBhZGRzIGF0IHRoZSBzYW1lIHRpbWUKKwkJICovCisJCWlmIChiaC0+Yl9wcml2YXRlKQorCQkJQlVHKCk7CisJCWpoLT5iaCA9IGJoOworCQliaC0+Yl9wcml2YXRlID0gamg7CiAJfQotICAgICAgICBqaCA9IGJoLT5iX3ByaXZhdGU7Ci0JbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOwotICAgIH0gZWxzZSB7Ci1ub19qaDoKLQlnZXRfYmgoYmgpOwotCWpoID0gYWxsb2NfamgoKTsKLQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKLQkvKiBidWZmZXIgbXVzdCBiZSBsb2NrZWQgZm9yIF9fYWRkX2poLCBzaG91bGQgYmUgYWJsZSB0byBoYXZlCi0JICogdHdvIGFkZHMgYXQgdGhlIHNhbWUgdGltZQotCSAqLwotCWlmIChiaC0+Yl9wcml2YXRlKQotCSAgICBCVUcoKTsKLQlqaC0+YmggPSBiaDsKLQliaC0+Yl9wcml2YXRlID0gamg7Ci0gICAgfQotICAgIGpoLT5qbCA9IGotPmpfY3VycmVudF9qbDsKLSAgICBpZiAodGFpbCkKLQlsaXN0X2FkZF90YWlsKCZqaC0+bGlzdCwgJmpoLT5qbC0+al90YWlsX2JoX2xpc3QpOwotICAgIGVsc2UgewotCWxpc3RfYWRkX3RhaWwoJmpoLT5saXN0LCAmamgtPmpsLT5qX2JoX2xpc3QpOwotICAgIH0KLSAgICBzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotICAgIHJldHVybiAwOworCWpoLT5qbCA9IGotPmpfY3VycmVudF9qbDsKKwlpZiAodGFpbCkKKwkJbGlzdF9hZGRfdGFpbCgmamgtPmxpc3QsICZqaC0+amwtPmpfdGFpbF9iaF9saXN0KTsKKwllbHNlIHsKKwkJbGlzdF9hZGRfdGFpbCgmamgtPmxpc3QsICZqaC0+amwtPmpfYmhfbGlzdCk7CisJfQorCXNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJcmV0dXJuIDA7CiB9CiAKLWludCByZWlzZXJmc19hZGRfdGFpbF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKLSAgICByZXR1cm4gX19hZGRfamgoU0JfSk9VUk5BTChpbm9kZS0+aV9zYiksIGJoLCAxKTsKK2ludCByZWlzZXJmc19hZGRfdGFpbF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIF9fYWRkX2poKFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLCBiaCwgMSk7CiB9Ci1pbnQgcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgcmV0dXJuIF9fYWRkX2poKFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLCBiaCwgMCk7CitpbnQgcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBfX2FkZF9qaChTQl9KT1VSTkFMKGlub2RlLT5pX3NiKSwgYmgsIDApOwogfQogCiAjZGVmaW5lIEpIX0VOVFJZKGwpIGxpc3RfZW50cnkoKGwpLCBzdHJ1Y3QgcmVpc2VyZnNfamgsIGxpc3QpCi1zdGF0aWMgaW50IHdyaXRlX29yZGVyZWRfYnVmZmVycyhzcGlubG9ja190ICpsb2NrLAorc3RhdGljIGludCB3cml0ZV9vcmRlcmVkX2J1ZmZlcnMoc3BpbmxvY2tfdCAqIGxvY2ssCiAJCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCisJCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAogCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2poICpqaDsKLSAgICBpbnQgcmV0ID0gai0+al9lcnJubzsKLSAgICBzdHJ1Y3QgYnVmZmVyX2NodW5rIGNodW5rOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgdG1wOwotICAgIElOSVRfTElTVF9IRUFEKCZ0bXApOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IHJlaXNlcmZzX2poICpqaDsKKwlpbnQgcmV0ID0gai0+al9lcnJubzsKKwlzdHJ1Y3QgYnVmZmVyX2NodW5rIGNodW5rOworCXN0cnVjdCBsaXN0X2hlYWQgdG1wOworCUlOSVRfTElTVF9IRUFEKCZ0bXApOwogCi0gICAgY2h1bmsubnIgPSAwOwotICAgIHNwaW5fbG9jayhsb2NrKTsKLSAgICB3aGlsZSghbGlzdF9lbXB0eShsaXN0KSkgewotICAgICAgICBqaCA9IEpIX0VOVFJZKGxpc3QtPm5leHQpOwotCWJoID0gamgtPmJoOwotCWdldF9iaChiaCk7Ci0JaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JICAgIGlmICghYnVmZmVyX2RpcnR5KGJoKSkgewotCQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7Ci0JCWxpc3RfYWRkKCZqaC0+bGlzdCwgJnRtcCk7Ci0JCWdvdG8gbG9vcF9uZXh0OwotCSAgICB9Ci0JICAgIHNwaW5fdW5sb2NrKGxvY2spOwotCSAgICBpZiAoY2h1bmsubnIpCi0JCXdyaXRlX29yZGVyZWRfY2h1bmsoJmNodW5rKTsKLQkgICAgd2FpdF9vbl9idWZmZXIoYmgpOwotCSAgICBjb25kX3Jlc2NoZWQoKTsKLQkgICAgc3Bpbl9sb2NrKGxvY2spOwotCSAgICBnb3RvIGxvb3BfbmV4dDsKLSAgICAgICAgfQotCWlmIChidWZmZXJfZGlydHkoYmgpKSB7Ci0JICAgIGxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKLQkgICAgbGlzdF9hZGQoJmpoLT5saXN0LCAmdG1wKTsKLSAgICAgICAgICAgIGFkZF90b19jaHVuaygmY2h1bmssIGJoLCBsb2NrLCB3cml0ZV9vcmRlcmVkX2NodW5rKTsKLQl9IGVsc2UgewotCSAgICByZWlzZXJmc19mcmVlX2poKGJoKTsKLQkgICAgdW5sb2NrX2J1ZmZlcihiaCk7Ci0JfQotbG9vcF9uZXh0OgotCXB1dF9iaChiaCk7Ci0JY29uZF9yZXNjaGVkX2xvY2sobG9jayk7Ci0gICAgfQotICAgIGlmIChjaHVuay5ucikgewotCXNwaW5fdW5sb2NrKGxvY2spOwotICAgICAgICB3cml0ZV9vcmRlcmVkX2NodW5rKCZjaHVuayk7CisJY2h1bmsubnIgPSAwOwogCXNwaW5fbG9jayhsb2NrKTsKLSAgICB9Ci0gICAgd2hpbGUoIWxpc3RfZW1wdHkoJnRtcCkpIHsKLSAgICAgICAgamggPSBKSF9FTlRSWSh0bXAucHJldik7Ci0JYmggPSBqaC0+Ymg7Ci0JZ2V0X2JoKGJoKTsKLQlyZWlzZXJmc19mcmVlX2poKGJoKTsKLQotCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgewotCSAgICBzcGluX3VubG9jayhsb2NrKTsKLQkgICAgd2FpdF9vbl9idWZmZXIoYmgpOwotCSAgICBzcGluX2xvY2sobG9jayk7Ci0JfQotCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCSAgICByZXQgPSAtRUlPOwotICAgICAgICB9Ci0JcHV0X2JoKGJoKTsKLQljb25kX3Jlc2NoZWRfbG9jayhsb2NrKTsKLSAgICB9Ci0gICAgc3Bpbl91bmxvY2sobG9jayk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBmbHVzaF9vbGRlcl9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKm90aGVyX2psOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZpcnN0X2psOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKLSAgICB1bnNpZ25lZCBsb25nIG90aGVyX3RyYW5zX2lkOwotICAgIHVuc2lnbmVkIGxvbmcgZmlyc3RfdHJhbnNfaWQ7Ci0KLWZpbmRfZmlyc3Q6Ci0gICAgLyoKLSAgICAgKiBmaXJzdCB3ZSB3YWxrIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBvbGRlc3QgdW5jb21taXR0ZWQgdHJhbnNhdGlvbgotICAgICAqLwotICAgIGZpcnN0X2psID0gamw7Ci0gICAgZW50cnkgPSBqbC0+al9saXN0LnByZXY7Ci0gICAgd2hpbGUoMSkgewotCW90aGVyX2psID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKLQlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0IHx8Ci0JICAgIGF0b21pY19yZWFkKCZvdGhlcl9qbC0+al9vbGRlcl9jb21taXRzX2RvbmUpKQotCSAgICBicmVhazsKLQotICAgICAgICBmaXJzdF9qbCA9IG90aGVyX2psOwotCWVudHJ5ID0gb3RoZXJfamwtPmpfbGlzdC5wcmV2OwotICAgIH0KLQotICAgIC8qIGlmIHdlIGRpZG4ndCBmaW5kIGFueSBvbGRlciB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbnMsIHJldHVybiBub3cgKi8KLSAgICBpZiAoZmlyc3RfamwgPT0gamwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZmlyc3RfdHJhbnNfaWQgPSBmaXJzdF9qbC0+al90cmFuc19pZDsKLQotICAgIGVudHJ5ID0gJmZpcnN0X2psLT5qX2xpc3Q7Ci0gICAgd2hpbGUoMSkgewotCW90aGVyX2psID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKLQlvdGhlcl90cmFuc19pZCA9IG90aGVyX2psLT5qX3RyYW5zX2lkOwotCi0JaWYgKG90aGVyX3RyYW5zX2lkIDwgdHJhbnNfaWQpIHsKLQkgICAgaWYgKGF0b21pY19yZWFkKCZvdGhlcl9qbC0+al9jb21taXRfbGVmdCkgIT0gMCkgewotCQlmbHVzaF9jb21taXRfbGlzdChzLCBvdGhlcl9qbCwgMCk7Ci0KLQkJLyogbGlzdCB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGlzIGdvbmUsIHJldHVybiAqLwotCQlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCB0cmFuc19pZCkpCi0JCSAgICByZXR1cm4gMTsKLQotCQkvKiB0aGUgb25lIHdlIGp1c3QgZmx1c2hlZCBpcyBnb25lLCB0aGlzIG1lYW5zIGFsbAotCQkgKiBvbGRlciBsaXN0cyBhcmUgYWxzbyBnb25lLCBzbyBmaXJzdF9qbCBpcyBubyBsb25nZXIKLQkJICogdmFsaWQgZWl0aGVyLiAgR28gYmFjayB0byB0aGUgYmVnaW5uaW5nLgotCQkgKi8KLQkJaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgb3RoZXJfdHJhbnNfaWQpKSB7Ci0JCSAgICBnb3RvIGZpbmRfZmlyc3Q7CisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCWpoID0gSkhfRU5UUlkobGlzdC0+bmV4dCk7CisJCWJoID0gamgtPmJoOworCQlnZXRfYmgoYmgpOworCQlpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCWlmICghYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKKwkJCQlsaXN0X2FkZCgmamgtPmxpc3QsICZ0bXApOworCQkJCWdvdG8gbG9vcF9uZXh0OworCQkJfQorCQkJc3Bpbl91bmxvY2sobG9jayk7CisJCQlpZiAoY2h1bmsubnIpCisJCQkJd3JpdGVfb3JkZXJlZF9jaHVuaygmY2h1bmspOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlzcGluX2xvY2sobG9jayk7CisJCQlnb3RvIGxvb3BfbmV4dDsKIAkJfQotCSAgICB9Ci0JICAgIGVudHJ5ID0gZW50cnktPm5leHQ7Ci0JICAgIGlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpCi0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JICAgIHJldHVybiAwOworCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOworCQkJbGlzdF9hZGQoJmpoLT5saXN0LCAmdG1wKTsKKwkJCWFkZF90b19jaHVuaygmY2h1bmssIGJoLCBsb2NrLCB3cml0ZV9vcmRlcmVkX2NodW5rKTsKKwkJfSBlbHNlIHsKKwkJCXJlaXNlcmZzX2ZyZWVfamgoYmgpOworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCX0KKwkgICAgICBsb29wX25leHQ6CisJCXB1dF9iaChiaCk7CisJCWNvbmRfcmVzY2hlZF9sb2NrKGxvY2spOwogCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJaWYgKGNodW5rLm5yKSB7CisJCXNwaW5fdW5sb2NrKGxvY2spOworCQl3cml0ZV9vcmRlcmVkX2NodW5rKCZjaHVuayk7CisJCXNwaW5fbG9jayhsb2NrKTsKKwl9CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0bXApKSB7CisJCWpoID0gSkhfRU5UUlkodG1wLnByZXYpOworCQliaCA9IGpoLT5iaDsKKwkJZ2V0X2JoKGJoKTsKKwkJcmVpc2VyZnNfZnJlZV9qaChiaCk7CisKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlzcGluX3VubG9jayhsb2NrKTsKKwkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCXNwaW5fbG9jayhsb2NrKTsKKwkJfQorCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCXJldCA9IC1FSU87CisJCX0KKwkJcHV0X2JoKGJoKTsKKwkJY29uZF9yZXNjaGVkX2xvY2sobG9jayk7CisJfQorCXNwaW5fdW5sb2NrKGxvY2spOworCXJldHVybiByZXQ7CiB9Ci1pbnQgcmVpc2VyZnNfYXN5bmNfcHJvZ3Jlc3Nfd2FpdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBERUZJTkVfV0FJVCh3YWl0KTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwocyk7Ci0gICAgaWYgKGF0b21pY19yZWFkKCZqLT5qX2FzeW5jX3Rocm90dGxlKSkKLSAgICAJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOwotICAgIHJldHVybiAwOworCitzdGF0aWMgaW50IGZsdXNoX29sZGVyX2NvbW1pdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpvdGhlcl9qbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpmaXJzdF9qbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJdW5zaWduZWQgbG9uZyBvdGhlcl90cmFuc19pZDsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X3RyYW5zX2lkOworCisgICAgICBmaW5kX2ZpcnN0OgorCS8qCisJICogZmlyc3Qgd2Ugd2FsayBiYWNrd2FyZHMgdG8gZmluZCB0aGUgb2xkZXN0IHVuY29tbWl0dGVkIHRyYW5zYXRpb24KKwkgKi8KKwlmaXJzdF9qbCA9IGpsOworCWVudHJ5ID0gamwtPmpfbGlzdC5wcmV2OworCXdoaWxlICgxKSB7CisJCW90aGVyX2psID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKKwkJaWYgKGVudHJ5ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCB8fAorCQkgICAgYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX29sZGVyX2NvbW1pdHNfZG9uZSkpCisJCQlicmVhazsKKworCQlmaXJzdF9qbCA9IG90aGVyX2psOworCQllbnRyeSA9IG90aGVyX2psLT5qX2xpc3QucHJldjsKKwl9CisKKwkvKiBpZiB3ZSBkaWRuJ3QgZmluZCBhbnkgb2xkZXIgdW5jb21taXR0ZWQgdHJhbnNhY3Rpb25zLCByZXR1cm4gbm93ICovCisJaWYgKGZpcnN0X2psID09IGpsKSB7CisJCXJldHVybiAwOworCX0KKworCWZpcnN0X3RyYW5zX2lkID0gZmlyc3RfamwtPmpfdHJhbnNfaWQ7CisKKwllbnRyeSA9ICZmaXJzdF9qbC0+al9saXN0OworCXdoaWxlICgxKSB7CisJCW90aGVyX2psID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKKwkJb3RoZXJfdHJhbnNfaWQgPSBvdGhlcl9qbC0+al90cmFuc19pZDsKKworCQlpZiAob3RoZXJfdHJhbnNfaWQgPCB0cmFuc19pZCkgeworCQkJaWYgKGF0b21pY19yZWFkKCZvdGhlcl9qbC0+al9jb21taXRfbGVmdCkgIT0gMCkgeworCQkJCWZsdXNoX2NvbW1pdF9saXN0KHMsIG90aGVyX2psLCAwKTsKKworCQkJCS8qIGxpc3Qgd2Ugd2VyZSBjYWxsZWQgd2l0aCBpcyBnb25lLCByZXR1cm4gKi8KKwkJCQlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCB0cmFuc19pZCkpCisJCQkJCXJldHVybiAxOworCisJCQkJLyogdGhlIG9uZSB3ZSBqdXN0IGZsdXNoZWQgaXMgZ29uZSwgdGhpcyBtZWFucyBhbGwKKwkJCQkgKiBvbGRlciBsaXN0cyBhcmUgYWxzbyBnb25lLCBzbyBmaXJzdF9qbCBpcyBubyBsb25nZXIKKwkJCQkgKiB2YWxpZCBlaXRoZXIuICBHbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuCisJCQkJICovCisJCQkJaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUKKwkJCQkgICAgKHMsIG90aGVyX3RyYW5zX2lkKSkgeworCQkJCQlnb3RvIGZpbmRfZmlyc3Q7CisJCQkJfQorCQkJfQorCQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJCWlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK2ludCByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwocyk7CisJaWYgKGF0b21pY19yZWFkKCZqLT5qX2FzeW5jX3Rocm90dGxlKSkKKwkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFogLyAxMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC05MDcsMjEyICs5NjcsMjI1IEBACiAqKiBCZWZvcmUgdGhlIGNvbW1pdCBibG9jayBjYW4gYnkgd3JpdHRlbiwgZXZlcnkgb3RoZXIgbG9nIGJsb2NrIG11c3QgYmUgc2FmZWx5IG9uIGRpc2sKICoqCiAqLwotc3RhdGljIGludCBmbHVzaF9jb21taXRfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpIHsKLSAgaW50IGk7Ci0gIGludCBibiA7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gTlVMTCA7Ci0gIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgaW50IGJhcnJpZXIgPSAwOwotICBpbnQgcmV0dmFsID0gMDsKK3N0YXRpYyBpbnQgZmx1c2hfY29tbWl0X2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKQoreworCWludCBpOworCWludCBibjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKwlpbnQgYmFycmllciA9IDA7CisJaW50IHJldHZhbCA9IDA7CiAKLSAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChzLCAiZmx1c2hfY29tbWl0X2xpc3QiKSA7CisJcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChzLCAiZmx1c2hfY29tbWl0X2xpc3QiKTsKIAotICBpZiAoYXRvbWljX3JlYWQoJmpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSkpIHsKLSAgICByZXR1cm4gMCA7Ci0gIH0KKwlpZiAoYXRvbWljX3JlYWQoJmpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSkpIHsKKwkJcmV0dXJuIDA7CisJfQogCi0gIGdldF9mc19leGNsKCk7CisJZ2V0X2ZzX2V4Y2woKTsKIAotICAvKiBiZWZvcmUgd2UgY2FuIHB1dCBvdXIgY29tbWl0IGJsb2NrcyBvbiBkaXNrLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSBldmVyeW9uZSBvbGRlciB0aGFuCi0gICoqIHVzIGlzIG9uIGRpc2sgdG9vCi0gICovCi0gIEJVR19PTiAoamwtPmpfbGVuIDw9IDApOwotICBCVUdfT04gKHRyYW5zX2lkID09IGpvdXJuYWwtPmpfdHJhbnNfaWQpOworCS8qIGJlZm9yZSB3ZSBjYW4gcHV0IG91ciBjb21taXQgYmxvY2tzIG9uIGRpc2ssIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIG9sZGVyIHRoYW4KKwkgKiogdXMgaXMgb24gZGlzayB0b28KKwkgKi8KKwlCVUdfT04oamwtPmpfbGVuIDw9IDApOworCUJVR19PTih0cmFuc19pZCA9PSBqb3VybmFsLT5qX3RyYW5zX2lkKTsKIAotICBnZXRfam91cm5hbF9saXN0KGpsKTsKLSAgaWYgKGZsdXNoYWxsKSB7Ci0gICAgaWYgKGZsdXNoX29sZGVyX2NvbW1pdHMocywgamwpID09IDEpIHsKLSAgICAgIC8qIGxpc3QgZGlzYXBwZWFyZWQgZHVyaW5nIGZsdXNoX29sZGVyX2NvbW1pdHMuICByZXR1cm4gKi8KLSAgICAgIGdvdG8gcHV0X2psOwotICAgIH0KLSAgfQorCWdldF9qb3VybmFsX2xpc3QoamwpOworCWlmIChmbHVzaGFsbCkgeworCQlpZiAoZmx1c2hfb2xkZXJfY29tbWl0cyhzLCBqbCkgPT0gMSkgeworCQkJLyogbGlzdCBkaXNhcHBlYXJlZCBkdXJpbmcgZmx1c2hfb2xkZXJfY29tbWl0cy4gIHJldHVybiAqLworCQkJZ290byBwdXRfamw7CisJCX0KKwl9CiAKLSAgLyogbWFrZSBzdXJlIG5vYm9keSBpcyB0cnlpbmcgdG8gZmx1c2ggdGhpcyBvbmUgYXQgdGhlIHNhbWUgdGltZSAqLwotICBkb3duKCZqbC0+al9jb21taXRfbG9jayk7Ci0gIGlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIHRyYW5zX2lkKSkgewotICAgIHVwKCZqbC0+al9jb21taXRfbG9jayk7Ci0gICAgZ290byBwdXRfamw7Ci0gIH0KLSAgQlVHX09OIChqbC0+al90cmFuc19pZCA9PSAwKTsKKwkvKiBtYWtlIHN1cmUgbm9ib2R5IGlzIHRyeWluZyB0byBmbHVzaCB0aGlzIG9uZSBhdCB0aGUgc2FtZSB0aW1lICovCisJZG93bigmamwtPmpfY29tbWl0X2xvY2spOworCWlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIHRyYW5zX2lkKSkgeworCQl1cCgmamwtPmpfY29tbWl0X2xvY2spOworCQlnb3RvIHB1dF9qbDsKKwl9CisJQlVHX09OKGpsLT5qX3RyYW5zX2lkID09IDApOwogCi0gIC8qIHRoaXMgY29tbWl0IGlzIGRvbmUsIGV4aXQgKi8KLSAgaWYgKGF0b21pY19yZWFkKCYoamwtPmpfY29tbWl0X2xlZnQpKSA8PSAwKSB7Ci0gICAgaWYgKGZsdXNoYWxsKSB7Ci0gICAgICBhdG9taWNfc2V0KCYoamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSwgMSkgOwotICAgIH0KLSAgICB1cCgmamwtPmpfY29tbWl0X2xvY2spOwotICAgIGdvdG8gcHV0X2psOwotICB9CisJLyogdGhpcyBjb21taXQgaXMgZG9uZSwgZXhpdCAqLworCWlmIChhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgeworCQlpZiAoZmx1c2hhbGwpIHsKKwkJCWF0b21pY19zZXQoJihqbC0+al9vbGRlcl9jb21taXRzX2RvbmUpLCAxKTsKKwkJfQorCQl1cCgmamwtPmpfY29tbWl0X2xvY2spOworCQlnb3RvIHB1dF9qbDsKKwl9CiAKLSAgaWYgKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSkgewotICAgICAgdW5sb2NrX2tlcm5lbCgpOwotICAgICAgd3JpdGVfb3JkZXJlZF9idWZmZXJzKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLCBqbCwgJmpsLT5qX2JoX2xpc3QpOwotICAgICAgbG9ja19rZXJuZWwoKTsKLSAgfQotICBCVUdfT04gKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSk7Ci0gIC8qCi0gICAqIGZvciB0aGUgZGVzY3JpcHRpb24gYmxvY2sgYW5kIGFsbCB0aGUgbG9nIGJsb2Nrcywgc3VibWl0IGFueSBidWZmZXJzCi0gICAqIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IHJlYWNoZWQgdGhlIGRpc2sKLSAgICovCi0gIGF0b21pY19pbmMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICBmb3IgKGkgPSAwIDsgaSA8IChqbC0+al9sZW4gKyAxKSA7IGkrKykgewotICAgIGJuID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHMpICsgKGpsLT5qX3N0YXJ0K2kpICUKLSAgICAgICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7Ci0gICAgdGJoID0gam91cm5hbF9maW5kX2dldF9ibG9jayhzLCBibikgOwotICAgIGlmIChidWZmZXJfZGlydHkodGJoKSkgLyogcmVkdW5kYW50LCBsbF9yd19ibG9jaygpIGNoZWNrcyAqLwotCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmdGJoKSA7Ci0gICAgcHV0X2JoKHRiaCkgOwotICB9Ci0gIGF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworCWlmICghbGlzdF9lbXB0eSgmamwtPmpfYmhfbGlzdCkpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQl3cml0ZV9vcmRlcmVkX2J1ZmZlcnMoJmpvdXJuYWwtPmpfZGlydHlfYnVmZmVyc19sb2NrLAorCQkJCSAgICAgIGpvdXJuYWwsIGpsLCAmamwtPmpfYmhfbGlzdCk7CisJCWxvY2tfa2VybmVsKCk7CisJfQorCUJVR19PTighbGlzdF9lbXB0eSgmamwtPmpfYmhfbGlzdCkpOworCS8qCisJICogZm9yIHRoZSBkZXNjcmlwdGlvbiBibG9jayBhbmQgYWxsIHRoZSBsb2cgYmxvY2tzLCBzdWJtaXQgYW55IGJ1ZmZlcnMKKwkgKiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSByZWFjaGVkIHRoZSBkaXNrCisJICovCisJYXRvbWljX2luYygmam91cm5hbC0+al9hc3luY190aHJvdHRsZSk7CisJZm9yIChpID0gMDsgaSA8IChqbC0+al9sZW4gKyAxKTsgaSsrKSB7CisJCWJuID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHMpICsgKGpsLT5qX3N0YXJ0ICsgaSkgJQorCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKTsKKwkJdGJoID0gam91cm5hbF9maW5kX2dldF9ibG9jayhzLCBibik7CisJCWlmIChidWZmZXJfZGlydHkodGJoKSkJLyogcmVkdW5kYW50LCBsbF9yd19ibG9jaygpIGNoZWNrcyAqLworCQkJbGxfcndfYmxvY2soV1JJVEUsIDEsICZ0YmgpOworCQlwdXRfYmgodGJoKTsKKwl9CisJYXRvbWljX2RlYygmam91cm5hbC0+al9hc3luY190aHJvdHRsZSk7CiAKLSAgLyogd2FpdCBvbiBldmVyeXRoaW5nIHdyaXR0ZW4gc28gZmFyIGJlZm9yZSB3cml0aW5nIHRoZSBjb21taXQKLSAgICogaWYgd2UgYXJlIGluIGJhcnJpZXIgbW9kZSwgc2VuZCB0aGUgY29tbWl0IGRvd24gbm93Ci0gICAqLwotICBiYXJyaWVyID0gcmVpc2VyZnNfYmFycmllcl9mbHVzaChzKTsKLSAgaWYgKGJhcnJpZXIpIHsKLSAgICAgIGludCByZXQ7Ci0gICAgICBsb2NrX2J1ZmZlcihqbC0+al9jb21taXRfYmgpOwotICAgICAgcmV0ID0gc3VibWl0X2JhcnJpZXJfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7Ci0gICAgICBpZiAocmV0ID09IC1FT1BOT1RTVVBQKSB7Ci0JICBzZXRfYnVmZmVyX3VwdG9kYXRlKGpsLT5qX2NvbW1pdF9iaCk7Ci0gICAgICAgICAgZGlzYWJsZV9iYXJyaWVyKHMpOwotCSAgYmFycmllciA9IDA7Ci0gICAgICB9Ci0gIH0KLSAgZm9yIChpID0gMCA7ICBpIDwgKGpsLT5qX2xlbiArIDEpIDsgaSsrKSB7Ci0gICAgYm4gPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socykgKwotCSAoamwtPmpfc3RhcnQgKyBpKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocykgOwotICAgIHRiaCA9IGpvdXJuYWxfZmluZF9nZXRfYmxvY2socywgYm4pIDsKLSAgICB3YWl0X29uX2J1ZmZlcih0YmgpIDsKLSAgICAvLyBzaW5jZSB3ZSdyZSB1c2luZyBsbF9yd19ibGsgYWJvdmUsIGl0IG1pZ2h0IGhhdmUgc2tpcHBlZCBvdmVyCi0gICAgLy8gYSBsb2NrZWQgYnVmZmVyLiAgRG91YmxlIGNoZWNrIGhlcmUKLSAgICAvLwotICAgIGlmIChidWZmZXJfZGlydHkodGJoKSkgLyogcmVkdW5kYW50LCBzeW5jX2RpcnR5X2J1ZmZlcigpIGNoZWNrcyAqLwotICAgICAgc3luY19kaXJ0eV9idWZmZXIodGJoKTsKLSAgICBpZiAodW5saWtlbHkgKCFidWZmZXJfdXB0b2RhdGUodGJoKSkpIHsKKwkvKiB3YWl0IG9uIGV2ZXJ5dGhpbmcgd3JpdHRlbiBzbyBmYXIgYmVmb3JlIHdyaXRpbmcgdGhlIGNvbW1pdAorCSAqIGlmIHdlIGFyZSBpbiBiYXJyaWVyIG1vZGUsIHNlbmQgdGhlIGNvbW1pdCBkb3duIG5vdworCSAqLworCWJhcnJpZXIgPSByZWlzZXJmc19iYXJyaWVyX2ZsdXNoKHMpOworCWlmIChiYXJyaWVyKSB7CisJCWludCByZXQ7CisJCWxvY2tfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CisJCXJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqbC0+al9jb21taXRfYmgpOworCQlpZiAocmV0ID09IC1FT1BOT1RTVVBQKSB7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGpsLT5qX2NvbW1pdF9iaCk7CisJCQlkaXNhYmxlX2JhcnJpZXIocyk7CisJCQliYXJyaWVyID0gMDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgKGpsLT5qX2xlbiArIDEpOyBpKyspIHsKKwkJYm4gPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socykgKworCQkgICAgKGpsLT5qX3N0YXJ0ICsgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpOworCQl0YmggPSBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrKHMsIGJuKTsKKwkJd2FpdF9vbl9idWZmZXIodGJoKTsKKwkJLy8gc2luY2Ugd2UncmUgdXNpbmcgbGxfcndfYmxrIGFib3ZlLCBpdCBtaWdodCBoYXZlIHNraXBwZWQgb3ZlcgorCQkvLyBhIGxvY2tlZCBidWZmZXIuICBEb3VibGUgY2hlY2sgaGVyZQorCQkvLworCQlpZiAoYnVmZmVyX2RpcnR5KHRiaCkpCS8qIHJlZHVuZGFudCwgc3luY19kaXJ0eV9idWZmZXIoKSBjaGVja3MgKi8KKwkJCXN5bmNfZGlydHlfYnVmZmVyKHRiaCk7CisJCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgICByZWlzZXJmc193YXJuaW5nKHMsICJqb3VybmFsLTYwMSwgYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgImpvdXJuYWwtNjAxLCBidWZmZXIgd3JpdGUgZmFpbGVkIik7CiAjZW5kaWYKLSAgICAgIHJldHZhbCA9IC1FSU87Ci0gICAgfQotICAgIHB1dF9iaCh0YmgpIDsgLyogb25jZSBmb3Igam91cm5hbF9maW5kX2dldF9ibG9jayAqLwotICAgIHB1dF9iaCh0YmgpIDsgICAgLyogb25jZSBkdWUgdG8gb3JpZ2luYWwgZ2V0YmxrIGluIGRvX2pvdXJuYWxfZW5kICovCi0gICAgYXRvbWljX2RlYygmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgOwotICB9CisJCQlyZXR2YWwgPSAtRUlPOworCQl9CisJCXB1dF9iaCh0YmgpOwkvKiBvbmNlIGZvciBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrICovCisJCXB1dF9iaCh0YmgpOwkvKiBvbmNlIGR1ZSB0byBvcmlnaW5hbCBnZXRibGsgaW4gZG9fam91cm5hbF9lbmQgKi8KKwkJYXRvbWljX2RlYygmKGpsLT5qX2NvbW1pdF9sZWZ0KSk7CisJfQogCi0gIEJVR19PTiAoYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpICE9IDEpOworCUJVR19PTihhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgIT0gMSk7CiAKLSAgaWYgKCFiYXJyaWVyKSB7Ci0gICAgICBpZiAoYnVmZmVyX2RpcnR5KGpsLT5qX2NvbW1pdF9iaCkpCi0JQlVHKCk7Ci0gICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShqbC0+al9jb21taXRfYmgpIDsKLSAgICAgIHN5bmNfZGlydHlfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCkgOwotICB9IGVsc2UKLSAgICAgIHdhaXRfb25fYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CisJaWYgKCFiYXJyaWVyKSB7CisJCWlmIChidWZmZXJfZGlydHkoamwtPmpfY29tbWl0X2JoKSkKKwkJCUJVRygpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShqbC0+al9jb21taXRfYmgpOworCQlzeW5jX2RpcnR5X2J1ZmZlcihqbC0+al9jb21taXRfYmgpOworCX0gZWxzZQorCQl3YWl0X29uX2J1ZmZlcihqbC0+al9jb21taXRfYmgpOwogCi0gIGNoZWNrX2JhcnJpZXJfY29tcGxldGlvbihzLCBqbC0+al9jb21taXRfYmgpOworCWNoZWNrX2JhcnJpZXJfY29tcGxldGlvbihzLCBqbC0+al9jb21taXRfYmgpOwogCi0gIC8qIElmIHRoZXJlIHdhcyBhIHdyaXRlIGVycm9yIGluIHRoZSBqb3VybmFsIC0gd2UgY2FuJ3QgY29tbWl0IHRoaXMKLSAgICogdHJhbnNhY3Rpb24gLSBpdCB3aWxsIGJlIGludmFsaWQgYW5kLCBpZiBzdWNjZXNzZnVsLCB3aWxsIGp1c3QgZW5kCi0gICAqIHVwIHByb3BvZ2F0aW5nIHRoZSB3cml0ZSBlcnJvciBvdXQgdG8gdGhlIGZpbGVzeXN0ZW0uICovCi0gIGlmICh1bmxpa2VseSAoIWJ1ZmZlcl91cHRvZGF0ZShqbC0+al9jb21taXRfYmgpKSkgeworCS8qIElmIHRoZXJlIHdhcyBhIHdyaXRlIGVycm9yIGluIHRoZSBqb3VybmFsIC0gd2UgY2FuJ3QgY29tbWl0IHRoaXMKKwkgKiB0cmFuc2FjdGlvbiAtIGl0IHdpbGwgYmUgaW52YWxpZCBhbmQsIGlmIHN1Y2Nlc3NmdWwsIHdpbGwganVzdCBlbmQKKwkgKiB1cCBwcm9wb2dhdGluZyB0aGUgd3JpdGUgZXJyb3Igb3V0IHRvIHRoZSBmaWxlc3lzdGVtLiAqLworCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKGpsLT5qX2NvbW1pdF9iaCkpKSB7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgcmVpc2VyZnNfd2FybmluZyhzLCAiam91cm5hbC02MTU6IGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgImpvdXJuYWwtNjE1OiBidWZmZXIgd3JpdGUgZmFpbGVkIik7CiAjZW5kaWYKLSAgICByZXR2YWwgPSAtRUlPOwotICB9Ci0gIGJmb3JnZXQoamwtPmpfY29tbWl0X2JoKSA7Ci0gIGlmIChqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkICE9IDAgJiYKLSAgICAgKGpsLT5qX3RyYW5zX2lkIC0gam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCkgIT0gMSkgewotICAgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiY2xtLTIyMDA6IGxhc3QgY29tbWl0ICVsdSwgY3VycmVudCAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkLAotCQkgICAgICAgamwtPmpfdHJhbnNfaWQpOwotICB9Ci0gIGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQgPSBqbC0+al90cmFuc19pZDsKKwkJcmV0dmFsID0gLUVJTzsKKwl9CisJYmZvcmdldChqbC0+al9jb21taXRfYmgpOworCWlmIChqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkICE9IDAgJiYKKwkgICAgKGpsLT5qX3RyYW5zX2lkIC0gam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCkgIT0gMSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjIwMDogbGFzdCBjb21taXQgJWx1LCBjdXJyZW50ICVsdSIsCisJCQkJIGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQsIGpsLT5qX3RyYW5zX2lkKTsKKwl9CisJam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCA9IGpsLT5qX3RyYW5zX2lkOwogCi0gIC8qIG5vdywgZXZlcnkgY29tbWl0IGJsb2NrIGlzIG9uIHRoZSBkaXNrLiAgSXQgaXMgc2FmZSB0byBhbGxvdyBibG9ja3MgZnJlZWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24gdG8gYmUgcmVhbGxvY2F0ZWQgKi8KLSAgY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHMsIGpsKSA7CisJLyogbm93LCBldmVyeSBjb21taXQgYmxvY2sgaXMgb24gdGhlIGRpc2suICBJdCBpcyBzYWZlIHRvIGFsbG93IGJsb2NrcyBmcmVlZCBkdXJpbmcgdGhpcyB0cmFuc2FjdGlvbiB0byBiZSByZWFsbG9jYXRlZCAqLworCWNsZWFudXBfZnJlZWRfZm9yX2pvdXJuYWxfbGlzdChzLCBqbCk7CiAKLSAgcmV0dmFsID0gcmV0dmFsID8gcmV0dmFsIDogam91cm5hbC0+al9lcnJubzsKKwlyZXR2YWwgPSByZXR2YWwgPyByZXR2YWwgOiBqb3VybmFsLT5qX2Vycm5vOwogCi0gIC8qIG1hcmsgdGhlIG1ldGFkYXRhIGRpcnR5ICovCi0gIGlmICghcmV0dmFsKQotICAgIGRpcnR5X29uZV90cmFuc2FjdGlvbihzLCBqbCk7Ci0gIGF0b21pY19kZWMoJihqbC0+al9jb21taXRfbGVmdCkpIDsKKwkvKiBtYXJrIHRoZSBtZXRhZGF0YSBkaXJ0eSAqLworCWlmICghcmV0dmFsKQorCQlkaXJ0eV9vbmVfdHJhbnNhY3Rpb24ocywgamwpOworCWF0b21pY19kZWMoJihqbC0+al9jb21taXRfbGVmdCkpOwogCi0gIGlmIChmbHVzaGFsbCkgewotICAgIGF0b21pY19zZXQoJihqbC0+al9vbGRlcl9jb21taXRzX2RvbmUpLCAxKSA7Ci0gIH0KLSAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKLXB1dF9qbDoKLSAgcHV0X2pvdXJuYWxfbGlzdChzLCBqbCk7CisJaWYgKGZsdXNoYWxsKSB7CisJCWF0b21pY19zZXQoJihqbC0+al9vbGRlcl9jb21taXRzX2RvbmUpLCAxKTsKKwl9CisJdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKKyAgICAgIHB1dF9qbDoKKwlwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKIAotICBpZiAocmV0dmFsKQotICAgIHJlaXNlcmZzX2Fib3J0IChzLCByZXR2YWwsICJKb3VybmFsIHdyaXRlIGVycm9yIGluICVzIiwgX19GVU5DVElPTl9fKTsKLSAgcHV0X2ZzX2V4Y2woKTsKLSAgcmV0dXJuIHJldHZhbDsKKwlpZiAocmV0dmFsKQorCQlyZWlzZXJmc19hYm9ydChzLCByZXR2YWwsICJKb3VybmFsIHdyaXRlIGVycm9yIGluICVzIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCXB1dF9mc19leGNsKCk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoKICoqIGZsdXNoX2pvdXJuYWxfbGlzdCBmcmVxdWVudGx5IG5lZWRzIHRvIGZpbmQgYSBuZXdlciB0cmFuc2FjdGlvbiBmb3IgYSBnaXZlbiBibG9jay4gIFRoaXMgZG9lcyB0aGF0LCBvciAKICoqIHJldHVybnMgTlVMTCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nIAogKi8KLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpmaW5kX25ld2VyX2psX2Zvcl9jbihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pIHsKLSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGNuLT5zYjsKLSAgYl9ibG9ja25yX3QgYmxvY2tuciA9IGNuLT5ibG9ja25yIDsKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpmaW5kX25ld2VyX2psX2Zvcl9jbihzdHJ1Y3QKKwkJCQkJCQkgIHJlaXNlcmZzX2pvdXJuYWxfY25vZGUKKwkJCQkJCQkgICpjbikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gY24tPnNiOworCWJfYmxvY2tucl90IGJsb2NrbnIgPSBjbi0+YmxvY2tucjsKIAotICBjbiA9IGNuLT5ocHJldiA7Ci0gIHdoaWxlKGNuKSB7Ci0gICAgaWYgKGNuLT5zYiA9PSBzYiAmJiBjbi0+YmxvY2tuciA9PSBibG9ja25yICYmIGNuLT5qbGlzdCkgewotICAgICAgcmV0dXJuIGNuLT5qbGlzdCA7Ci0gICAgfQotICAgIGNuID0gY24tPmhwcmV2IDsKLSAgfQotICByZXR1cm4gTlVMTCA7CisJY24gPSBjbi0+aHByZXY7CisJd2hpbGUgKGNuKSB7CisJCWlmIChjbi0+c2IgPT0gc2IgJiYgY24tPmJsb2NrbnIgPT0gYmxvY2tuciAmJiBjbi0+amxpc3QpIHsKKwkJCXJldHVybiBjbi0+amxpc3Q7CisJCX0KKwkJY24gPSBjbi0+aHByZXY7CisJfQorCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCByZW1vdmVfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKiwKLXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKiwgdW5zaWduZWQgbG9uZywgaW50KTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9qb3VybmFsX2hhc2goc3RydWN0IHN1cGVyX2Jsb2NrICosCisJCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKiosCisJCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqLCB1bnNpZ25lZCBsb25nLAorCQkJCWludCk7CiAKIC8qCiAqKiBvbmNlIGFsbCB0aGUgcmVhbCBibG9ja3MgaGF2ZSBiZWVuIGZsdXNoZWQsIGl0IGlzIHNhZmUgdG8gcmVtb3ZlIHRoZW0gZnJvbSB0aGUKICoqIGpvdXJuYWwgbGlzdCBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gIEFzaWRlIGZyb20gZnJlZWluZyB0aGUgY25vZGUsIHRoaXMgYWxzbyBhbGxvd3MgdGhlCiAqKiBibG9jayB0byBiZSByZWFsbG9jYXRlZCBmb3IgZGF0YSBibG9ja3MgaWYgaXQgaGFkIGJlZW4gZGVsZXRlZC4KICovCi1zdGF0aWMgdm9pZCByZW1vdmVfYWxsX2Zyb21fam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGRlYnVnKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuLCAqbGFzdCA7Ci0gIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKK3N0YXRpYyB2b2lkIHJlbW92ZV9hbGxfZnJvbV9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJCSBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwKKwkJCQkJIGludCBkZWJ1ZykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpsYXN0OworCWNuID0gamwtPmpfcmVhbGJsb2NrOwogCi0gIC8qIHdoaWNoIGlzIGJldHRlciwgdG8gbG9jayBvbmNlIGFyb3VuZCB0aGUgd2hvbGUgbG9vcCwgb3IKLSAgKiogdG8gbG9jayBmb3IgZWFjaCBjYWxsIHRvIHJlbW92ZV9qb3VybmFsX2hhc2g/Ci0gICovCi0gIHdoaWxlKGNuKSB7Ci0gICAgaWYgKGNuLT5ibG9ja25yICE9IDApIHsKLSAgICAgIGlmIChkZWJ1ZykgewotICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImJsb2NrICV1LCBiaCBpcyAlZCwgc3RhdGUgJWxkIiwgY24tPmJsb2NrbnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY24tPmJoID8gMTogMCwgY24tPnN0YXRlKSA7Ci0gICAgICB9Ci0gICAgICBjbi0+c3RhdGUgPSAwIDsKLSAgICAgIHJlbW92ZV9qb3VybmFsX2hhc2gocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgamwsIGNuLT5ibG9ja25yLCAxKSA7Ci0gICAgfQotICAgIGxhc3QgPSBjbiA7Ci0gICAgY24gPSBjbi0+bmV4dCA7Ci0gICAgZnJlZV9jbm9kZShwX3Nfc2IsIGxhc3QpIDsKLSAgfQotICBqbC0+al9yZWFsYmxvY2sgPSBOVUxMIDsKKwkvKiB3aGljaCBpcyBiZXR0ZXIsIHRvIGxvY2sgb25jZSBhcm91bmQgdGhlIHdob2xlIGxvb3AsIG9yCisJICoqIHRvIGxvY2sgZm9yIGVhY2ggY2FsbCB0byByZW1vdmVfam91cm5hbF9oYXNoPworCSAqLworCXdoaWxlIChjbikgeworCQlpZiAoY24tPmJsb2NrbnIgIT0gMCkgeworCQkJaWYgKGRlYnVnKSB7CisJCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCQkgImJsb2NrICV1LCBiaCBpcyAlZCwgc3RhdGUgJWxkIiwKKwkJCQkJCSBjbi0+YmxvY2tuciwgY24tPmJoID8gMSA6IDAsCisJCQkJCQkgY24tPnN0YXRlKTsKKwkJCX0KKwkJCWNuLT5zdGF0ZSA9IDA7CisJCQlyZW1vdmVfam91cm5hbF9oYXNoKHBfc19zYiwgam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsCisJCQkJCSAgICBqbCwgY24tPmJsb2NrbnIsIDEpOworCQl9CisJCWxhc3QgPSBjbjsKKwkJY24gPSBjbi0+bmV4dDsKKwkJZnJlZV9jbm9kZShwX3Nfc2IsIGxhc3QpOworCX0KKwlqbC0+al9yZWFsYmxvY2sgPSBOVUxMOwogfQogCiAvKgpAQCAtMTEyMiw5OCArMTE5NSwxMDcgQEAKICoqIGNhbGxlZCBieSBmbHVzaF9qb3VybmFsX2xpc3QsIGJlZm9yZSBpdCBjYWxscyByZW1vdmVfYWxsX2Zyb21fam91cm5hbF9saXN0CiAqKgogKi8KLXN0YXRpYyBpbnQgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaCA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKK3N0YXRpYyBpbnQgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICBpZiAocmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkIChqb3VybmFsKSkKLSAgICByZXR1cm4gLUVJTzsKKwlpZiAocmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKQorCQlyZXR1cm4gLUVJTzsKIAotICBpZiAodHJhbnNfaWQgPj0gam91cm5hbC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSB7Ci0gICAgaWYgKGJ1ZmZlcl9sb2NrZWQoKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSkpICB7Ci0gICAgICB3YWl0X29uX2J1ZmZlcigoam91cm5hbC0+al9oZWFkZXJfYmgpKSA7Ci0gICAgICBpZiAodW5saWtlbHkgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpKSkgeworCWlmICh0cmFuc19pZCA+PSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpIHsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSkpIHsKKwkJCXdhaXRfb25fYnVmZmVyKChqb3VybmFsLT5qX2hlYWRlcl9iaCkpOworCQkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpKSkgewogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTY5OTogYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJCSAiam91cm5hbC02OTk6IGJ1ZmZlciB3cml0ZSBmYWlsZWQiKTsKICNlbmRpZgotICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgIH0KLSAgICB9Ci0gICAgam91cm5hbC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkID0gdHJhbnNfaWQgOwotICAgIGpvdXJuYWwtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCA9IG9mZnNldCA7Ci0gICAgamggPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICopKGpvdXJuYWwtPmpfaGVhZGVyX2JoLT5iX2RhdGEpIDsKLSAgICBqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkID0gY3B1X3RvX2xlMzIodHJhbnNfaWQpIDsKLSAgICBqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ID0gY3B1X3RvX2xlMzIob2Zmc2V0KSA7Ci0gICAgamgtPmpfbW91bnRfaWQgPSBjcHVfdG9fbGUzMihqb3VybmFsLT5qX21vdW50X2lkKSA7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwkJam91cm5hbC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkID0gdHJhbnNfaWQ7CisJCWpvdXJuYWwtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCA9IG9mZnNldDsKKwkJamggPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICopKGpvdXJuYWwtPmpfaGVhZGVyX2JoLT4KKwkJCQkJCQliX2RhdGEpOworCQlqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkID0gY3B1X3RvX2xlMzIodHJhbnNfaWQpOworCQlqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ID0gY3B1X3RvX2xlMzIob2Zmc2V0KTsKKwkJamgtPmpfbW91bnRfaWQgPSBjcHVfdG9fbGUzMihqb3VybmFsLT5qX21vdW50X2lkKTsKIAotICAgIGlmIChyZWlzZXJmc19iYXJyaWVyX2ZsdXNoKHBfc19zYikpIHsKLQlpbnQgcmV0OwotCWxvY2tfYnVmZmVyKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKLQlyZXQgPSBzdWJtaXRfYmFycmllcl9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOwotCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApIHsKLQkgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCk7Ci0JICAgIGRpc2FibGVfYmFycmllcihwX3Nfc2IpOwotCSAgICBnb3RvIHN5bmM7CisJCWlmIChyZWlzZXJmc19iYXJyaWVyX2ZsdXNoKHBfc19zYikpIHsKKwkJCWludCByZXQ7CisJCQlsb2NrX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCQlyZXQgPSBzdWJtaXRfYmFycmllcl9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOworCQkJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgeworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpOworCQkJCWRpc2FibGVfYmFycmllcihwX3Nfc2IpOworCQkJCWdvdG8gc3luYzsKKwkJCX0KKwkJCXdhaXRfb25fYnVmZmVyKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKKwkJCWNoZWNrX2JhcnJpZXJfY29tcGxldGlvbihwX3Nfc2IsIGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKKwkJfSBlbHNlIHsKKwkJICAgICAgc3luYzoKKwkJCXNldF9idWZmZXJfZGlydHkoam91cm5hbC0+al9oZWFkZXJfYmgpOworCQkJc3luY19kaXJ0eV9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOworCQl9CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC04Mzc6IElPIGVycm9yIGR1cmluZyBqb3VybmFsIHJlcGxheSIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAl9Ci0Jd2FpdF9vbl9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOwotCWNoZWNrX2JhcnJpZXJfY29tcGxldGlvbihwX3Nfc2IsIGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKLSAgICB9IGVsc2Ugewotc3luYzoKLQlzZXRfYnVmZmVyX2RpcnR5KGpvdXJuYWwtPmpfaGVhZGVyX2JoKSA7Ci0Jc3luY19kaXJ0eV9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKLSAgICB9Ci0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTgzNzogSU8gZXJyb3IgZHVyaW5nIGpvdXJuYWwgcmVwbGF5Iik7Ci0gICAgICByZXR1cm4gLUVJTyA7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwIDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkKSB7Ci0gICAgcmV0dXJuIF91cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2socF9zX3NiLCBvZmZzZXQsIHRyYW5zX2lkKTsKK3N0YXRpYyBpbnQgdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKK3sKKwlyZXR1cm4gX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIG9mZnNldCwgdHJhbnNfaWQpOwogfQorCiAvKiAKICoqIGZsdXNoIGFueSBhbmQgYWxsIGpvdXJuYWwgbGlzdHMgb2xkZXIgdGhhbiB5b3UgYXJlIAogKiogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gZmx1c2hfam91cm5hbF9saXN0CiAqLwogc3RhdGljIGludCBmbHVzaF9vbGRlcl9qb3VybmFsX2xpc3RzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQorCQkJCSAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCiB7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqb3RoZXJfamwgOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqb3RoZXJfamw7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOwogCi0gICAgLyogd2Uga25vdyB3ZSBhcmUgdGhlIG9ubHkgb25lcyBmbHVzaGluZyB0aGluZ3MsIG5vIGV4dHJhIHJhY2UKLSAgICAgKiBwcm90ZWN0aW9uIGlzIHJlcXVpcmVkLgotICAgICAqLwotcmVzdGFydDoKLSAgICBlbnRyeSA9IGpvdXJuYWwtPmpfam91cm5hbF9saXN0Lm5leHQ7Ci0gICAgLyogRGlkIHdlIHdyYXA/ICovCi0gICAgaWYgKGVudHJ5ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOwotICAgIGlmIChvdGhlcl9qbC0+al90cmFuc19pZCA8IHRyYW5zX2lkKSB7Ci0gICAgICAgIEJVR19PTiAob3RoZXJfamwtPmpfcmVmY291bnQgPD0gMCk7Ci0JLyogZG8gbm90IGZsdXNoIGFsbCAqLwotCWZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIG90aGVyX2psLCAwKSA7CisJLyogd2Uga25vdyB3ZSBhcmUgdGhlIG9ubHkgb25lcyBmbHVzaGluZyB0aGluZ3MsIG5vIGV4dHJhIHJhY2UKKwkgKiBwcm90ZWN0aW9uIGlzIHJlcXVpcmVkLgorCSAqLworICAgICAgcmVzdGFydDoKKwllbnRyeSA9IGpvdXJuYWwtPmpfam91cm5hbF9saXN0Lm5leHQ7CisJLyogRGlkIHdlIHdyYXA/ICovCisJaWYgKGVudHJ5ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKKwkJcmV0dXJuIDA7CisJb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCWlmIChvdGhlcl9qbC0+al90cmFuc19pZCA8IHRyYW5zX2lkKSB7CisJCUJVR19PTihvdGhlcl9qbC0+al9yZWZjb3VudCA8PSAwKTsKKwkJLyogZG8gbm90IGZsdXNoIGFsbCAqLworCQlmbHVzaF9qb3VybmFsX2xpc3QocF9zX3NiLCBvdGhlcl9qbCwgMCk7CiAKLQkvKiBvdGhlcl9qbCBpcyBub3cgZGVsZXRlZCBmcm9tIHRoZSBsaXN0ICovCi0JZ290byByZXN0YXJ0OwotICAgIH0KLSAgICByZXR1cm4gMCA7CisJCS8qIG90aGVyX2psIGlzIG5vdyBkZWxldGVkIGZyb20gdGhlIGxpc3QgKi8KKwkJZ290byByZXN0YXJ0OworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZGVsX2Zyb21fd29ya19saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgaWYgKCFsaXN0X2VtcHR5KCZqbC0+al93b3JraW5nX2xpc3QpKSB7Ci0JbGlzdF9kZWxfaW5pdCgmamwtPmpfd29ya2luZ19saXN0KTsKLQlqb3VybmFsLT5qX251bV93b3JrX2xpc3RzLS07Ci0gICAgfQorCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3dvcmtpbmdfbGlzdCkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmamwtPmpfd29ya2luZ19saXN0KTsKKwkJam91cm5hbC0+al9udW1fd29ya19saXN0cy0tOworCX0KIH0KIAogLyogZmx1c2ggYSBqb3VybmFsIGxpc3QsIGJvdGggY29tbWl0IGFuZCByZWFsIGJsb2NrcwpAQCAtMTIyNSwzODYgKzEzMDcsNDA3IEBACiAqKiBhbmQgdGhlIGpvdXJuYWwgaXMgbG9ja2VkLiAgVGhhdCBtZWFucyBpdCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSAKICoqIGRvX2pvdXJuYWxfZW5kLCBvciBieSBqb3VybmFsX3JlbGVhc2UKICovCi1zdGF0aWMgaW50IGZsdXNoX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpwamwgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpsYXN0IDsKLSAgaW50IGNvdW50IDsKLSAgaW50IHdhc19qd2FpdCA9IDAgOwotICBpbnQgd2FzX2RpcnR5ID0gMCA7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqc2F2ZWRfYmggOyAKLSAgdW5zaWduZWQgbG9uZyBqX2xlbl9zYXZlZCA9IGpsLT5qX2xlbiA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gIGludCBlcnIgPSAwOworc3RhdGljIGludCBmbHVzaF9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpwamw7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuLCAqbGFzdDsKKwlpbnQgY291bnQ7CisJaW50IHdhc19qd2FpdCA9IDA7CisJaW50IHdhc19kaXJ0eSA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpzYXZlZF9iaDsKKwl1bnNpZ25lZCBsb25nIGpfbGVuX3NhdmVkID0gamwtPmpfbGVuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKwlpbnQgZXJyID0gMDsKIAotICBCVUdfT04gKGpfbGVuX3NhdmVkIDw9IDApOworCUJVR19PTihqX2xlbl9zYXZlZCA8PSAwKTsKIAotICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSAhPSAwKSB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyhzLCAiY2xtLTIwNDg6IGZsdXNoX2pvdXJuYWxfbGlzdCBjYWxsZWQgd2l0aCB3Y291bnQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkpIDsKLSAgfQotICBCVUdfT04gKGpsLT5qX3RyYW5zX2lkID09IDApOwotCi0gIC8qIGlmIGZsdXNoYWxsID09IDAsIHRoZSBsb2NrIGlzIGFscmVhZHkgaGVsZCAqLwotICBpZiAoZmx1c2hhbGwpIHsKLSAgICAgIGRvd24oJmpvdXJuYWwtPmpfZmx1c2hfc2VtKTsKLSAgfSBlbHNlIGlmICghZG93bl90cnlsb2NrKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSkpIHsKLSAgICAgIEJVRygpOwotICB9Ci0KLSAgY291bnQgPSAwIDsKLSAgaWYgKGpfbGVuX3NhdmVkID4gam91cm5hbC0+al90cmFuc19tYXgpIHsKLSAgICByZWlzZXJmc19wYW5pYyhzLCAiam91cm5hbC03MTU6IGZsdXNoX2pvdXJuYWxfbGlzdCwgbGVuZ3RoIGlzICVsdSwgdHJhbnMgaWQgJWx1XG4iLCBqX2xlbl9zYXZlZCwgamwtPmpfdHJhbnNfaWQpOwotICAgIHJldHVybiAwIDsKLSAgfQotCi0gIGdldF9mc19leGNsKCk7Ci0KLSAgLyogaWYgYWxsIHRoZSB3b3JrIGlzIGFscmVhZHkgZG9uZSwgZ2V0IG91dCBvZiBoZXJlICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmIAotICAgICAgYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKLSAgICBnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm4gOwotICB9IAotCi0gIC8qIHN0YXJ0IGJ5IHB1dHRpbmcgdGhlIGNvbW1pdCBsaXN0IG9uIGRpc2suICBUaGlzIHdpbGwgYWxzbyBmbHVzaCAKLSAgKiogdGhlIGNvbW1pdCBsaXN0cyBvZiBhbnkgb2xkZXJzIHRyYW5zYWN0aW9ucwotICAqLwotICBmbHVzaF9jb21taXRfbGlzdChzLCBqbCwgMSkgOwotCi0gIGlmICghKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkgJiYgIXJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCi0gICAgICBCVUcoKTsKLQotICAvKiBhcmUgd2UgZG9uZSBub3c/ICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmIAotICAgICAgYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKLSAgICBnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm4gOwotICB9Ci0KLSAgLyogbG9vcCB0aHJvdWdoIGVhY2ggY25vZGUsIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIGl0LCAKLSAgKiogb3Igd2FpdCBvbiBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uLCBvciBqdXN0IGlnbm9yZSBpdCAKLSAgKi8KLSAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSAhPSAwKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMocywgImpvdXJuYWwtODQ0OiBwYW5pYyBqb3VybmFsIGxpc3QgaXMgZmx1c2hpbmcsIHdjb3VudCBpcyBub3QgMFxuIikgOwotICB9Ci0gIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKLSAgd2hpbGUoY24pIHsKLSAgICB3YXNfandhaXQgPSAwIDsKLSAgICB3YXNfZGlydHkgPSAwIDsKLSAgICBzYXZlZF9iaCA9IE5VTEwgOwotICAgIC8qIGJsb2NrbnIgb2YgMCBpcyBubyBsb25nZXIgaW4gdGhlIGhhc2gsIGlnbm9yZSBpdCAqLwotICAgIGlmIChjbi0+YmxvY2tuciA9PSAwKSB7Ci0gICAgICBnb3RvIGZyZWVfY25vZGUgOwotICAgIH0KLQotICAgIC8qIFRoaXMgdHJhbnNhY3Rpb24gZmFpbGVkIGNvbW1pdC4gRG9uJ3Qgd3JpdGUgb3V0IHRvIHRoZSBkaXNrICovCi0gICAgaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0RJUlRZKSkKLSAgICAgICAgZ290byBmcmVlX2Nub2RlOwotCi0gICAgcGpsID0gZmluZF9uZXdlcl9qbF9mb3JfY24oY24pIDsKLSAgICAvKiB0aGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUuICBXZSBjaGVjayBwamwgdG8gbWFrZSBzdXJlIHdlCi0gICAgKiogZG9uJ3QgY2xlYXIgQkhfSkRpcnR5X3dhaXQgaWYgd2UgYXJlbid0IHRoZSBvbmUgd3JpdGluZyB0aGlzCi0gICAgKiogYmxvY2sgdG8gZGlzawotICAgICovCi0gICAgaWYgKCFwamwgJiYgY24tPmJoKSB7Ci0gICAgICBzYXZlZF9iaCA9IGNuLT5iaCA7Ci0KLSAgICAgIC8qIHdlIGRvIHRoaXMgdG8gbWFrZSBzdXJlIG5vYm9keSByZWxlYXNlcyB0aGUgYnVmZmVyIHdoaWxlIAotICAgICAgKiogd2UgYXJlIHdvcmtpbmcgd2l0aCBpdCAKLSAgICAgICovCi0gICAgICBnZXRfYmgoc2F2ZWRfYmgpIDsKLQotICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsX2RpcnR5KHNhdmVkX2JoKSkgewotICAgICAgICBCVUdfT04gKCFjYW5fZGlydHkgKGNuKSk7Ci0gICAgICAgIHdhc19qd2FpdCA9IDEgOwotICAgICAgICB3YXNfZGlydHkgPSAxIDsKLSAgICAgIH0gZWxzZSBpZiAoY2FuX2RpcnR5KGNuKSkgewotICAgICAgICAvKiBldmVyeXRoaW5nIHdpdGggIXBqbCAmJiBqd2FpdCBzaG91bGQgYmUgd3JpdGFibGUgKi8KLQlCVUcoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpZiBzb21lb25lIGhhcyB0aGlzIGJsb2NrIGluIGEgbmV3ZXIgdHJhbnNhY3Rpb24sIGp1c3QgbWFrZQotICAgICoqIHN1cmUgdGhleSBhcmUgY29tbWl0ZWQsIGFuZCBkb24ndCB0cnkgd3JpdGluZyBpdCB0byBkaXNrCi0gICAgKi8KLSAgICBpZiAocGpsKSB7Ci0gICAgICBpZiAoYXRvbWljX3JlYWQoJnBqbC0+al9jb21taXRfbGVmdCkpCi0gICAgICAgIGZsdXNoX2NvbW1pdF9saXN0KHMsIHBqbCwgMSkgOwotICAgICAgZ290byBmcmVlX2Nub2RlIDsKLSAgICB9Ci0KLSAgICAvKiBiaCA9PSBOVUxMIHdoZW4gdGhlIGJsb2NrIGdvdCB0byBkaXNrIG9uIGl0cyBvd24sIE9SLCAKLSAgICAqKiB0aGUgYmxvY2sgZ290IGZyZWVkIGluIGEgZnV0dXJlIHRyYW5zYWN0aW9uIAotICAgICovCi0gICAgaWYgKHNhdmVkX2JoID09IE5VTEwpIHsKLSAgICAgIGdvdG8gZnJlZV9jbm9kZSA7Ci0gICAgfQotCi0gICAgLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAga3VwZGF0ZV9vbmVfdHJhbnNhY3Rpb24gaGFzIHRoaXMgbGlzdAotICAgICoqIGxvY2tlZCB3aGlsZSBpdCB3b3Jrcywgc28gd2Ugc2hvdWxkIG5ldmVyIHNlZSBhIGJ1ZmZlciBoZXJlIHRoYXQKLSAgICAqKiBpcyBub3QgbWFya2VkIEpEaXJ0eV93YWl0Ci0gICAgKi8KLSAgICBpZiAoKCF3YXNfandhaXQpICYmICFidWZmZXJfbG9ja2VkKHNhdmVkX2JoKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJqb3VybmFsLTgxMzogQkFEISBidWZmZXIgJWxsdSAlY2RpcnR5ICVjandhaXQsICIKLQkJCSAgIm5vdCBpbiBhIG5ld2VyIHRyYW5hc2N0aW9uIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXZlZF9iaC0+Yl9ibG9ja25yLAotCQkJICB3YXNfZGlydHkgPyAnICcgOiAnIScsIHdhc19qd2FpdCA/ICcgJyA6ICchJykgOwotICAgIH0KLSAgICBpZiAod2FzX2RpcnR5KSB7IAotICAgICAgLyogd2UgaW5jIGFnYWluIGJlY2F1c2Ugc2F2ZWRfYmggZ2V0cyBkZWNyZW1lbnRlZCBhdCBmcmVlX2Nub2RlICovCi0gICAgICBnZXRfYmgoc2F2ZWRfYmgpIDsKLSAgICAgIHNldF9iaXQoQkxPQ0tfTkVFRFNfRkxVU0gsICZjbi0+c3RhdGUpIDsKLSAgICAgIGxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKLSAgICAgIEJVR19PTiAoY24tPmJsb2NrbnIgIT0gc2F2ZWRfYmgtPmJfYmxvY2tucik7Ci0gICAgICBpZiAoYnVmZmVyX2RpcnR5KHNhdmVkX2JoKSkKLSAgICAgICAgc3VibWl0X2xvZ2dlZF9idWZmZXIoc2F2ZWRfYmgpIDsKLSAgICAgIGVsc2UKLSAgICAgICAgdW5sb2NrX2J1ZmZlcihzYXZlZF9iaCk7Ci0gICAgICBjb3VudCsrIDsKLSAgICB9IGVsc2UgewotICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgImNsbS0yMDgyOiBVbmFibGUgdG8gZmx1c2ggYnVmZmVyICVsbHUgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXZlZF9iaC0+Yl9ibG9ja25yLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLWZyZWVfY25vZGU6Ci0gICAgbGFzdCA9IGNuIDsKLSAgICBjbiA9IGNuLT5uZXh0IDsKLSAgICBpZiAoc2F2ZWRfYmgpIHsKLSAgICAgIC8qIHdlIGluY3JlbWVudGVkIHRoaXMgdG8ga2VlcCBvdGhlcnMgZnJvbSB0YWtpbmcgdGhlIGJ1ZmZlciBoZWFkIGF3YXkgKi8KLSAgICAgIHB1dF9iaChzYXZlZF9iaCkgOwotICAgICAgaWYgKGF0b21pY19yZWFkKCYoc2F2ZWRfYmgtPmJfY291bnQpKSA8IDApIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgImpvdXJuYWwtOTQ1OiBzYXZlZF9iaC0+Yl9jb3VudCA8IDAiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGNvdW50ID4gMCkgewotICAgIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKLSAgICB3aGlsZShjbikgewotICAgICAgaWYgKHRlc3RfYml0KEJMT0NLX05FRURTX0ZMVVNILCAmY24tPnN0YXRlKSkgewotCWlmICghY24tPmJoKSB7Ci0JICByZWlzZXJmc19wYW5pYyhzLCAiam91cm5hbC0xMDExOiBjbi0+YmggaXMgTlVMTFxuIikgOworCWlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpICE9IDApIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAiY2xtLTIwNDg6IGZsdXNoX2pvdXJuYWxfbGlzdCBjYWxsZWQgd2l0aCB3Y291bnQgJWQiLAorCQkJCSBhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpKTsKIAl9Ci0Jd2FpdF9vbl9idWZmZXIoY24tPmJoKSA7Ci0JaWYgKCFjbi0+YmgpIHsKLQkgIHJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTEwMTI6IGNuLT5iaCBpcyBOVUxMXG4iKSA7CisJQlVHX09OKGpsLT5qX3RyYW5zX2lkID09IDApOworCisJLyogaWYgZmx1c2hhbGwgPT0gMCwgdGhlIGxvY2sgaXMgYWxyZWFkeSBoZWxkICovCisJaWYgKGZsdXNoYWxsKSB7CisJCWRvd24oJmpvdXJuYWwtPmpfZmx1c2hfc2VtKTsKKwl9IGVsc2UgaWYgKCFkb3duX3RyeWxvY2soJmpvdXJuYWwtPmpfZmx1c2hfc2VtKSkgeworCQlCVUcoKTsKIAl9Ci0JaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKGNuLT5iaCkpKSB7CisKKwljb3VudCA9IDA7CisJaWYgKGpfbGVuX3NhdmVkID4gam91cm5hbC0+al90cmFuc19tYXgpIHsKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAiam91cm5hbC03MTU6IGZsdXNoX2pvdXJuYWxfbGlzdCwgbGVuZ3RoIGlzICVsdSwgdHJhbnMgaWQgJWx1XG4iLAorCQkJICAgICAgIGpfbGVuX3NhdmVkLCBqbC0+al90cmFuc19pZCk7CisJCXJldHVybiAwOworCX0KKworCWdldF9mc19leGNsKCk7CisKKwkvKiBpZiBhbGwgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lLCBnZXQgb3V0IG9mIGhlcmUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqbC0+al9ub256ZXJvbGVuKSkgPD0gMCAmJgorCSAgICBhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgeworCQlnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm47CisJfQorCisJLyogc3RhcnQgYnkgcHV0dGluZyB0aGUgY29tbWl0IGxpc3Qgb24gZGlzay4gIFRoaXMgd2lsbCBhbHNvIGZsdXNoIAorCSAqKiB0aGUgY29tbWl0IGxpc3RzIG9mIGFueSBvbGRlcnMgdHJhbnNhY3Rpb25zCisJICovCisJZmx1c2hfY29tbWl0X2xpc3QocywgamwsIDEpOworCisJaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0RJUlRZKQorCSAgICAmJiAhcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKQorCQlCVUcoKTsKKworCS8qIGFyZSB3ZSBkb25lIG5vdz8gKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqbC0+al9ub256ZXJvbGVuKSkgPD0gMCAmJgorCSAgICBhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgeworCQlnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm47CisJfQorCisJLyogbG9vcCB0aHJvdWdoIGVhY2ggY25vZGUsIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIGl0LCAKKwkgKiogb3Igd2FpdCBvbiBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uLCBvciBqdXN0IGlnbm9yZSBpdCAKKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpICE9IDApIHsKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAiam91cm5hbC04NDQ6IHBhbmljIGpvdXJuYWwgbGlzdCBpcyBmbHVzaGluZywgd2NvdW50IGlzIG5vdCAwXG4iKTsKKwl9CisJY24gPSBqbC0+al9yZWFsYmxvY2s7CisJd2hpbGUgKGNuKSB7CisJCXdhc19qd2FpdCA9IDA7CisJCXdhc19kaXJ0eSA9IDA7CisJCXNhdmVkX2JoID0gTlVMTDsKKwkJLyogYmxvY2tuciBvZiAwIGlzIG5vIGxvbmdlciBpbiB0aGUgaGFzaCwgaWdub3JlIGl0ICovCisJCWlmIChjbi0+YmxvY2tuciA9PSAwKSB7CisJCQlnb3RvIGZyZWVfY25vZGU7CisJCX0KKworCQkvKiBUaGlzIHRyYW5zYWN0aW9uIGZhaWxlZCBjb21taXQuIERvbid0IHdyaXRlIG91dCB0byB0aGUgZGlzayAqLworCQlpZiAoIShqbC0+al9zdGF0ZSAmIExJU1RfRElSVFkpKQorCQkJZ290byBmcmVlX2Nub2RlOworCisJCXBqbCA9IGZpbmRfbmV3ZXJfamxfZm9yX2NuKGNuKTsKKwkJLyogdGhlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLiAgV2UgY2hlY2sgcGpsIHRvIG1ha2Ugc3VyZSB3ZQorCQkgKiogZG9uJ3QgY2xlYXIgQkhfSkRpcnR5X3dhaXQgaWYgd2UgYXJlbid0IHRoZSBvbmUgd3JpdGluZyB0aGlzCisJCSAqKiBibG9jayB0byBkaXNrCisJCSAqLworCQlpZiAoIXBqbCAmJiBjbi0+YmgpIHsKKwkJCXNhdmVkX2JoID0gY24tPmJoOworCisJCQkvKiB3ZSBkbyB0aGlzIHRvIG1ha2Ugc3VyZSBub2JvZHkgcmVsZWFzZXMgdGhlIGJ1ZmZlciB3aGlsZSAKKwkJCSAqKiB3ZSBhcmUgd29ya2luZyB3aXRoIGl0IAorCQkJICovCisJCQlnZXRfYmgoc2F2ZWRfYmgpOworCisJCQlpZiAoYnVmZmVyX2pvdXJuYWxfZGlydHkoc2F2ZWRfYmgpKSB7CisJCQkJQlVHX09OKCFjYW5fZGlydHkoY24pKTsKKwkJCQl3YXNfandhaXQgPSAxOworCQkJCXdhc19kaXJ0eSA9IDE7CisJCQl9IGVsc2UgaWYgKGNhbl9kaXJ0eShjbikpIHsKKwkJCQkvKiBldmVyeXRoaW5nIHdpdGggIXBqbCAmJiBqd2FpdCBzaG91bGQgYmUgd3JpdGFibGUgKi8KKwkJCQlCVUcoKTsKKwkJCX0KKwkJfQorCisJCS8qIGlmIHNvbWVvbmUgaGFzIHRoaXMgYmxvY2sgaW4gYSBuZXdlciB0cmFuc2FjdGlvbiwganVzdCBtYWtlCisJCSAqKiBzdXJlIHRoZXkgYXJlIGNvbW1pdGVkLCBhbmQgZG9uJ3QgdHJ5IHdyaXRpbmcgaXQgdG8gZGlzaworCQkgKi8KKwkJaWYgKHBqbCkgeworCQkJaWYgKGF0b21pY19yZWFkKCZwamwtPmpfY29tbWl0X2xlZnQpKQorCQkJCWZsdXNoX2NvbW1pdF9saXN0KHMsIHBqbCwgMSk7CisJCQlnb3RvIGZyZWVfY25vZGU7CisJCX0KKworCQkvKiBiaCA9PSBOVUxMIHdoZW4gdGhlIGJsb2NrIGdvdCB0byBkaXNrIG9uIGl0cyBvd24sIE9SLCAKKwkJICoqIHRoZSBibG9jayBnb3QgZnJlZWQgaW4gYSBmdXR1cmUgdHJhbnNhY3Rpb24gCisJCSAqLworCQlpZiAoc2F2ZWRfYmggPT0gTlVMTCkgeworCQkJZ290byBmcmVlX2Nub2RlOworCQl9CisKKwkJLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAga3VwZGF0ZV9vbmVfdHJhbnNhY3Rpb24gaGFzIHRoaXMgbGlzdAorCQkgKiogbG9ja2VkIHdoaWxlIGl0IHdvcmtzLCBzbyB3ZSBzaG91bGQgbmV2ZXIgc2VlIGEgYnVmZmVyIGhlcmUgdGhhdAorCQkgKiogaXMgbm90IG1hcmtlZCBKRGlydHlfd2FpdAorCQkgKi8KKwkJaWYgKCghd2FzX2p3YWl0KSAmJiAhYnVmZmVyX2xvY2tlZChzYXZlZF9iaCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJqb3VybmFsLTgxMzogQkFEISBidWZmZXIgJWxsdSAlY2RpcnR5ICVjandhaXQsICIKKwkJCQkJICJub3QgaW4gYSBuZXdlciB0cmFuYXNjdGlvbiIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNhdmVkX2JoLT4KKwkJCQkJIGJfYmxvY2tuciwgd2FzX2RpcnR5ID8gJyAnIDogJyEnLAorCQkJCQkgd2FzX2p3YWl0ID8gJyAnIDogJyEnKTsKKwkJfQorCQlpZiAod2FzX2RpcnR5KSB7CisJCQkvKiB3ZSBpbmMgYWdhaW4gYmVjYXVzZSBzYXZlZF9iaCBnZXRzIGRlY3JlbWVudGVkIGF0IGZyZWVfY25vZGUgKi8KKwkJCWdldF9iaChzYXZlZF9iaCk7CisJCQlzZXRfYml0KEJMT0NLX05FRURTX0ZMVVNILCAmY24tPnN0YXRlKTsKKwkJCWxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCUJVR19PTihjbi0+YmxvY2tuciAhPSBzYXZlZF9iaC0+Yl9ibG9ja25yKTsKKwkJCWlmIChidWZmZXJfZGlydHkoc2F2ZWRfYmgpKQorCQkJCXN1Ym1pdF9sb2dnZWRfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCWVsc2UKKwkJCQl1bmxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCWNvdW50Kys7CisJCX0gZWxzZSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAiY2xtLTIwODI6IFVuYWJsZSB0byBmbHVzaCBidWZmZXIgJWxsdSBpbiAlcyIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNhdmVkX2JoLT4KKwkJCQkJIGJfYmxvY2tuciwgX19GVU5DVElPTl9fKTsKKwkJfQorCSAgICAgIGZyZWVfY25vZGU6CisJCWxhc3QgPSBjbjsKKwkJY24gPSBjbi0+bmV4dDsKKwkJaWYgKHNhdmVkX2JoKSB7CisJCQkvKiB3ZSBpbmNyZW1lbnRlZCB0aGlzIHRvIGtlZXAgb3RoZXJzIGZyb20gdGFraW5nIHRoZSBidWZmZXIgaGVhZCBhd2F5ICovCisJCQlwdXRfYmgoc2F2ZWRfYmgpOworCQkJaWYgKGF0b21pY19yZWFkKCYoc2F2ZWRfYmgtPmJfY291bnQpKSA8IDApIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgImpvdXJuYWwtOTQ1OiBzYXZlZF9iaC0+Yl9jb3VudCA8IDAiKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoY291bnQgPiAwKSB7CisJCWNuID0gamwtPmpfcmVhbGJsb2NrOworCQl3aGlsZSAoY24pIHsKKwkJCWlmICh0ZXN0X2JpdChCTE9DS19ORUVEU19GTFVTSCwgJmNuLT5zdGF0ZSkpIHsKKwkJCQlpZiAoIWNuLT5iaCkgeworCQkJCQlyZWlzZXJmc19wYW5pYyhzLAorCQkJCQkJICAgICAgICJqb3VybmFsLTEwMTE6IGNuLT5iaCBpcyBOVUxMXG4iKTsKKwkJCQl9CisJCQkJd2FpdF9vbl9idWZmZXIoY24tPmJoKTsKKwkJCQlpZiAoIWNuLT5iaCkgeworCQkJCQlyZWlzZXJmc19wYW5pYyhzLAorCQkJCQkJICAgICAgICJqb3VybmFsLTEwMTI6IGNuLT5iaCBpcyBOVUxMXG4iKTsKKwkJCQl9CisJCQkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoY24tPmJoKSkpIHsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkgIHJlaXNlcmZzX3dhcm5pbmcocywgImpvdXJuYWwtOTQ5OiBidWZmZXIgd3JpdGUgZmFpbGVkXG4iKSA7CisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgImpvdXJuYWwtOTQ5OiBidWZmZXIgd3JpdGUgZmFpbGVkXG4iKTsKICNlbmRpZgotICAgICAgICAgIGVyciA9IC1FSU87Ci0gIAl9Ci0JLyogbm90ZSwgd2UgbXVzdCBjbGVhciB0aGUgSkRpcnR5X3dhaXQgYml0IGFmdGVyIHRoZSB1cCB0byBkYXRlCi0JKiogY2hlY2ssIG90aGVyd2lzZSB3ZSByYWNlIGFnYWluc3Qgb3VyIGZsdXNocGFnZSByb3V0aW5lCi0JKi8KLSAgICAgICAgQlVHX09OICghdGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKSk7CisJCQkJCWVyciA9IC1FSU87CisJCQkJfQorCQkJCS8qIG5vdGUsIHdlIG11c3QgY2xlYXIgdGhlIEpEaXJ0eV93YWl0IGJpdCBhZnRlciB0aGUgdXAgdG8gZGF0ZQorCQkJCSAqKiBjaGVjaywgb3RoZXJ3aXNlIHdlIHJhY2UgYWdhaW5zdCBvdXIgZmx1c2hwYWdlIHJvdXRpbmUKKwkJCQkgKi8KKwkJCQlCVUdfT04oIXRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkKKwkJCQkgICAgICAgKGNuLT5iaCkpOwogCi0gICAgICAgIC8qIHVuZG8gdGhlIGluYyBmcm9tIGpvdXJuYWxfbWFya19kaXJ0eSAqLwotCXB1dF9iaChjbi0+YmgpIDsKLSAgICAgICAgYnJlbHNlKGNuLT5iaCkgOwotICAgICAgfQotICAgICAgY24gPSBjbi0+bmV4dCA7Ci0gICAgfQotICB9CisJCQkJLyogdW5kbyB0aGUgaW5jIGZyb20gam91cm5hbF9tYXJrX2RpcnR5ICovCisJCQkJcHV0X2JoKGNuLT5iaCk7CisJCQkJYnJlbHNlKGNuLT5iaCk7CisJCQl9CisJCQljbiA9IGNuLT5uZXh0OworCQl9CisJfQogCi0gIGlmIChlcnIpCi0gICAgcmVpc2VyZnNfYWJvcnQgKHMsIC1FSU8sICJXcml0ZSBlcnJvciB3aGlsZSBwdXNoaW5nIHRyYW5zYWN0aW9uIHRvIGRpc2sgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotZmx1c2hfb2xkZXJfYW5kX3JldHVybjoKKwlpZiAoZXJyKQorCQlyZWlzZXJmc19hYm9ydChzLCAtRUlPLAorCQkJICAgICAgICJXcml0ZSBlcnJvciB3aGlsZSBwdXNoaW5nIHRyYW5zYWN0aW9uIHRvIGRpc2sgaW4gJXMiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICBmbHVzaF9vbGRlcl9hbmRfcmV0dXJuOgogCisJLyogYmVmb3JlIHdlIGNhbiB1cGRhdGUgdGhlIGpvdXJuYWwgaGVhZGVyIGJsb2NrLCB3ZSBfbXVzdF8gZmx1c2ggYWxsIAorCSAqKiByZWFsIGJsb2NrcyBmcm9tIGFsbCBvbGRlciB0cmFuc2FjdGlvbnMgdG8gZGlzay4gIFRoaXMgaXMgYmVjYXVzZQorCSAqKiBvbmNlIHRoZSBoZWFkZXIgYmxvY2sgaXMgdXBkYXRlZCwgdGhpcyB0cmFuc2FjdGlvbiB3aWxsIG5vdCBiZQorCSAqKiByZXBsYXllZCBhZnRlciBhIGNyYXNoCisJICovCisJaWYgKGZsdXNoYWxsKSB7CisJCWZsdXNoX29sZGVyX2pvdXJuYWxfbGlzdHMocywgamwpOworCX0KIAotICAvKiBiZWZvcmUgd2UgY2FuIHVwZGF0ZSB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2ssIHdlIF9tdXN0XyBmbHVzaCBhbGwgCi0gICoqIHJlYWwgYmxvY2tzIGZyb20gYWxsIG9sZGVyIHRyYW5zYWN0aW9ucyB0byBkaXNrLiAgVGhpcyBpcyBiZWNhdXNlCi0gICoqIG9uY2UgdGhlIGhlYWRlciBibG9jayBpcyB1cGRhdGVkLCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgbm90IGJlCi0gICoqIHJlcGxheWVkIGFmdGVyIGEgY3Jhc2gKLSAgKi8KLSAgaWYgKGZsdXNoYWxsKSB7Ci0gICAgZmx1c2hfb2xkZXJfam91cm5hbF9saXN0cyhzLCBqbCk7Ci0gIH0gCi0gIAotICBlcnIgPSBqb3VybmFsLT5qX2Vycm5vOwotICAvKiBiZWZvcmUgd2UgY2FuIHJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIGhhc2ggdGFibGVzIGZvciB0aGlzIAotICAqKiB0cmFuc2FjdGlvbiwgd2UgbXVzdCBtYWtlIHN1cmUgaXQgY2FuIG5ldmVyIGJlIHJlcGxheWVkCi0gICoqCi0gICoqIHNpbmNlIHdlIGFyZSBvbmx5IGNhbGxlZCBmcm9tIGRvX2pvdXJuYWxfZW5kLCB3ZSBrbm93IGZvciBzdXJlIHRoZXJlCi0gICoqIGFyZSBubyBhbGxvY2F0aW9ucyBnb2luZyBvbiB3aGlsZSB3ZSBhcmUgZmx1c2hpbmcgam91cm5hbCBsaXN0cy4gIFNvLAotICAqKiB3ZSBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBqb3VybmFsIGhlYWRlciBibG9jayBmb3IgdGhlIGxhc3QgbGlzdAotICAqKiBiZWluZyBmbHVzaGVkCi0gICovCi0gIGlmICghZXJyICYmIGZsdXNoYWxsKSB7Ci0gICAgZXJyID0gdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHMsIChqbC0+al9zdGFydCArIGpsLT5qX2xlbiArIDIpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSwgamwtPmpfdHJhbnNfaWQpIDsKLSAgICBpZiAoZXJyKQotICAgICAgICByZWlzZXJmc19hYm9ydCAocywgLUVJTywgIldyaXRlIGVycm9yIHdoaWxlIHVwZGF0aW5nIGpvdXJuYWwgaGVhZGVyIGluICVzIiwgX19GVU5DVElPTl9fKTsKLSAgfQotICByZW1vdmVfYWxsX2Zyb21fam91cm5hbF9saXN0KHMsIGpsLCAwKSA7Ci0gIGxpc3RfZGVsX2luaXQoJmpsLT5qX2xpc3QpOwotICBqb3VybmFsLT5qX251bV9saXN0cy0tOwotICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOworCWVyciA9IGpvdXJuYWwtPmpfZXJybm87CisJLyogYmVmb3JlIHdlIGNhbiByZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBoYXNoIHRhYmxlcyBmb3IgdGhpcyAKKwkgKiogdHJhbnNhY3Rpb24sIHdlIG11c3QgbWFrZSBzdXJlIGl0IGNhbiBuZXZlciBiZSByZXBsYXllZAorCSAqKgorCSAqKiBzaW5jZSB3ZSBhcmUgb25seSBjYWxsZWQgZnJvbSBkb19qb3VybmFsX2VuZCwgd2Uga25vdyBmb3Igc3VyZSB0aGVyZQorCSAqKiBhcmUgbm8gYWxsb2NhdGlvbnMgZ29pbmcgb24gd2hpbGUgd2UgYXJlIGZsdXNoaW5nIGpvdXJuYWwgbGlzdHMuICBTbywKKwkgKiogd2Ugb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2sgZm9yIHRoZSBsYXN0IGxpc3QKKwkgKiogYmVpbmcgZmx1c2hlZAorCSAqLworCWlmICghZXJyICYmIGZsdXNoYWxsKSB7CisJCWVyciA9CisJCSAgICB1cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2socywKKwkJCQkJCShqbC0+al9zdGFydCArIGpsLT5qX2xlbiArCisJCQkJCQkgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpLAorCQkJCQkJamwtPmpfdHJhbnNfaWQpOworCQlpZiAoZXJyKQorCQkJcmVpc2VyZnNfYWJvcnQocywgLUVJTywKKwkJCQkgICAgICAgIldyaXRlIGVycm9yIHdoaWxlIHVwZGF0aW5nIGpvdXJuYWwgaGVhZGVyIGluICVzIiwKKwkJCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwl9CisJcmVtb3ZlX2FsbF9mcm9tX2pvdXJuYWxfbGlzdChzLCBqbCwgMCk7CisJbGlzdF9kZWxfaW5pdCgmamwtPmpfbGlzdCk7CisJam91cm5hbC0+al9udW1fbGlzdHMtLTsKKwlkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOwogCi0gIGlmIChqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQgIT0gMCAmJgotICAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQpICE9IDEpIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImNsbS0yMjAxOiBsYXN0IGZsdXNoICVsdSwgY3VycmVudCAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQsCi0JCSAgICAgICBqbC0+al90cmFuc19pZCk7Ci0gIH0KLSAgam91cm5hbC0+al9sYXN0X2ZsdXNoX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJaWYgKGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCAhPSAwICYmCisJICAgIChqbC0+al90cmFuc19pZCAtIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCkgIT0gMSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjIwMTogbGFzdCBmbHVzaCAlbHUsIGN1cnJlbnQgJWx1IiwKKwkJCQkgam91cm5hbC0+al9sYXN0X2ZsdXNoX2lkLCBqbC0+al90cmFuc19pZCk7CisJfQorCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCA9IGpsLT5qX3RyYW5zX2lkOwogCi0gIC8qIG5vdCBzdHJpY3RseSByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgZnJlZWluZyB0aGUgbGlzdCwgYnV0IGl0IHNob3VsZAotICAgKiBoZWxwIGZpbmQgY29kZSB1c2luZyBkZWFkIGxpc3RzIGxhdGVyIG9uCi0gICAqLwotICBqbC0+al9sZW4gPSAwIDsKLSAgYXRvbWljX3NldCgmKGpsLT5qX25vbnplcm9sZW4pLCAwKSA7Ci0gIGpsLT5qX3N0YXJ0ID0gMCA7Ci0gIGpsLT5qX3JlYWxibG9jayA9IE5VTEwgOwotICBqbC0+al9jb21taXRfYmggPSBOVUxMIDsKLSAgamwtPmpfdHJhbnNfaWQgPSAwIDsKLSAgamwtPmpfc3RhdGUgPSAwOwotICBwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKLSAgaWYgKGZsdXNoYWxsKQotICAgIHVwKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7Ci0gIHB1dF9mc19leGNsKCk7Ci0gIHJldHVybiBlcnIgOwotfSAKKwkvKiBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGZyZWVpbmcgdGhlIGxpc3QsIGJ1dCBpdCBzaG91bGQKKwkgKiBoZWxwIGZpbmQgY29kZSB1c2luZyBkZWFkIGxpc3RzIGxhdGVyIG9uCisJICovCisJamwtPmpfbGVuID0gMDsKKwlhdG9taWNfc2V0KCYoamwtPmpfbm9uemVyb2xlbiksIDApOworCWpsLT5qX3N0YXJ0ID0gMDsKKwlqbC0+al9yZWFsYmxvY2sgPSBOVUxMOworCWpsLT5qX2NvbW1pdF9iaCA9IE5VTEw7CisJamwtPmpfdHJhbnNfaWQgPSAwOworCWpsLT5qX3N0YXRlID0gMDsKKwlwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKKwlpZiAoZmx1c2hhbGwpCisJCXVwKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7CisJcHV0X2ZzX2V4Y2woKTsKKwlyZXR1cm4gZXJyOworfQogCiBzdGF0aWMgaW50IHdyaXRlX29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCiAJCQkJIHN0cnVjdCBidWZmZXJfY2h1bmsgKmNodW5rKQogewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKLSAgICBpbnQgcmV0ID0gMCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCWludCByZXQgPSAwOwogCi0gICAgamwtPmpfc3RhdGUgfD0gTElTVF9UT1VDSEVEOwotICAgIGRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7Ci0gICAgaWYgKGpsLT5qX2xlbiA9PSAwIHx8IGF0b21pY19yZWFkKCZqbC0+al9ub256ZXJvbGVuKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwlqbC0+al9zdGF0ZSB8PSBMSVNUX1RPVUNIRUQ7CisJZGVsX2Zyb21fd29ya19saXN0KHMsIGpsKTsKKwlpZiAoamwtPmpfbGVuID09IDAgfHwgYXRvbWljX3JlYWQoJmpsLT5qX25vbnplcm9sZW4pID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgY24gPSBqbC0+al9yZWFsYmxvY2sgOwotICAgIHdoaWxlKGNuKSB7Ci0gICAgICAgIC8qIGlmIHRoZSBibG9ja25yID09IDAsIHRoaXMgaGFzIGJlZW4gY2xlYXJlZCBmcm9tIHRoZSBoYXNoLAotICAgICAgICAqKiBza2lwIGl0Ci0gICAgICAgICovCi0gICAgICAgIGlmIChjbi0+YmxvY2tuciA9PSAwKSB7Ci0gICAgICAgICAgICBnb3RvIG5leHQgOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkoY24tPmJoKSkgewotCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcF9iaDsKLQkgICAgLyogd2UgY2FuIHJhY2UgYWdhaW5zdCBqb3VybmFsX21hcmtfZnJlZWQgd2hlbiB3ZSB0cnkKLQkgICAgICogdG8gbG9ja19idWZmZXIoY24tPmJoKSwgc28gd2UgaGF2ZSB0byBpbmMgdGhlIGJ1ZmZlcgotCSAgICAgKiBjb3VudCwgYW5kIHJlY2hlY2sgdGhpbmdzIGFmdGVyIGxvY2tpbmcKLQkgICAgICovCi0JICAgIHRtcF9iaCA9IGNuLT5iaDsKLQkgICAgZ2V0X2JoKHRtcF9iaCk7Ci0JICAgIGxvY2tfYnVmZmVyKHRtcF9iaCk7Ci0JICAgIGlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkodG1wX2JoKSkgewotCQlpZiAoIWJ1ZmZlcl9qb3VybmFsX2RpcnR5KHRtcF9iaCkgfHwKLQkJICAgIGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKHRtcF9iaCkpCi0JCSAgICBCVUcoKTsKLQkJYWRkX3RvX2NodW5rKGNodW5rLCB0bXBfYmgsIE5VTEwsIHdyaXRlX2NodW5rKTsKLQkJcmV0Kys7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIG5vdGUsIGNuLT5iaCBtaWdodCBiZSBudWxsIG5vdyAqLwotCQl1bmxvY2tfYnVmZmVyKHRtcF9iaCk7Ci0JICAgIH0KLQkgICAgcHV0X2JoKHRtcF9iaCk7Ci0gICAgICAgIH0KLW5leHQ6Ci0gICAgICAgIGNuID0gY24tPm5leHQgOwotCWNvbmRfcmVzY2hlZCgpOwotICAgIH0KLSAgICByZXR1cm4gcmV0IDsKKwljbiA9IGpsLT5qX3JlYWxibG9jazsKKwl3aGlsZSAoY24pIHsKKwkJLyogaWYgdGhlIGJsb2NrbnIgPT0gMCwgdGhpcyBoYXMgYmVlbiBjbGVhcmVkIGZyb20gdGhlIGhhc2gsCisJCSAqKiBza2lwIGl0CisJCSAqLworCQlpZiAoY24tPmJsb2NrbnIgPT0gMCkgeworCQkJZ290byBuZXh0OworCQl9CisJCWlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkoY24tPmJoKSkgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXBfYmg7CisJCQkvKiB3ZSBjYW4gcmFjZSBhZ2FpbnN0IGpvdXJuYWxfbWFya19mcmVlZCB3aGVuIHdlIHRyeQorCQkJICogdG8gbG9ja19idWZmZXIoY24tPmJoKSwgc28gd2UgaGF2ZSB0byBpbmMgdGhlIGJ1ZmZlcgorCQkJICogY291bnQsIGFuZCByZWNoZWNrIHRoaW5ncyBhZnRlciBsb2NraW5nCisJCQkgKi8KKwkJCXRtcF9iaCA9IGNuLT5iaDsKKwkJCWdldF9iaCh0bXBfYmgpOworCQkJbG9ja19idWZmZXIodG1wX2JoKTsKKwkJCWlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkodG1wX2JoKSkgeworCQkJCWlmICghYnVmZmVyX2pvdXJuYWxfZGlydHkodG1wX2JoKSB8fAorCQkJCSAgICBidWZmZXJfam91cm5hbF9wcmVwYXJlZCh0bXBfYmgpKQorCQkJCQlCVUcoKTsKKwkJCQlhZGRfdG9fY2h1bmsoY2h1bmssIHRtcF9iaCwgTlVMTCwgd3JpdGVfY2h1bmspOworCQkJCXJldCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBub3RlLCBjbi0+YmggbWlnaHQgYmUgbnVsbCBub3cgKi8KKwkJCQl1bmxvY2tfYnVmZmVyKHRtcF9iaCk7CisJCQl9CisJCQlwdXRfYmgodG1wX2JoKTsKKwkJfQorCSAgICAgIG5leHQ6CisJCWNuID0gY24tPm5leHQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKiB1c2VkIGJ5IGZsdXNoX2NvbW1pdF9saXN0ICovCiBzdGF0aWMgaW50IGRpcnR5X29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbDsKLSAgICBpbnQgcmV0ID0gMCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbDsKKwlpbnQgcmV0ID0gMDsKIAotICAgIGpsLT5qX3N0YXRlIHw9IExJU1RfRElSVFk7Ci0gICAgY24gPSBqbC0+al9yZWFsYmxvY2sgOwotICAgIHdoaWxlKGNuKSB7Ci0gICAgICAgIC8qIGxvb2sgZm9yIGEgbW9yZSByZWNlbnQgdHJhbnNhY3Rpb24gdGhhdCBsb2dnZWQgdGhpcwotICAgICAgICAqKiBidWZmZXIuICBPbmx5IHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiB3aXRoIGEgYnVmZmVyIGluCi0gICAgICAgICoqIGl0IGlzIGFsbG93ZWQgdG8gc2VuZCB0aGF0IGJ1ZmZlciB0byBkaXNrCi0gICAgICAgICovCi0JcGpsID0gZmluZF9uZXdlcl9qbF9mb3JfY24oY24pIDsKLSAgICAgICAgaWYgKCFwamwgJiYgY24tPmJsb2NrbnIgJiYgY24tPmJoICYmIGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGNuLT5iaCkpCi0JewotCSAgICBCVUdfT04gKCFjYW5fZGlydHkoY24pKTsKLQkgICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBwcmVwYXJlZCwgaXQgd2lsbCBlaXRoZXIgYmUgbG9nZ2VkCi0JICAgICAqIG9yIHJlc3RvcmVkLiAgSWYgcmVzdG9yZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0JICAgICAqIGl0IGFjdHVhbGx5IGdldHMgbWFya2VkIGRpcnR5Ci0JICAgICAqLwotICAgICAgICAgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChjbi0+YmgpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChjbi0+YmgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGNuLT5iaCk7Ci0JICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGNuLT5iaCk7Ci0JICAgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShjbi0+YmgpOwotCSAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNuID0gY24tPm5leHQgOwotICAgIH0KLSAgICByZXR1cm4gcmV0IDsKKwlqbC0+al9zdGF0ZSB8PSBMSVNUX0RJUlRZOworCWNuID0gamwtPmpfcmVhbGJsb2NrOworCXdoaWxlIChjbikgeworCQkvKiBsb29rIGZvciBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uIHRoYXQgbG9nZ2VkIHRoaXMKKwkJICoqIGJ1ZmZlci4gIE9ubHkgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIHdpdGggYSBidWZmZXIgaW4KKwkJICoqIGl0IGlzIGFsbG93ZWQgdG8gc2VuZCB0aGF0IGJ1ZmZlciB0byBkaXNrCisJCSAqLworCQlwamwgPSBmaW5kX25ld2VyX2psX2Zvcl9jbihjbik7CisJCWlmICghcGpsICYmIGNuLT5ibG9ja25yICYmIGNuLT5iaAorCQkgICAgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoY24tPmJoKSkgeworCQkJQlVHX09OKCFjYW5fZGlydHkoY24pKTsKKwkJCS8qIGlmIHRoZSBidWZmZXIgaXMgcHJlcGFyZWQsIGl0IHdpbGwgZWl0aGVyIGJlIGxvZ2dlZAorCQkJICogb3IgcmVzdG9yZWQuICBJZiByZXN0b3JlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUKKwkJCSAqIGl0IGFjdHVhbGx5IGdldHMgbWFya2VkIGRpcnR5CisJCQkgKi8KKwkJCWNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyhjbi0+YmgpOworCQkJaWYgKGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGNuLT5iaCkpIHsKKwkJCQlzZXRfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eShjbi0+YmgpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRfYnVmZmVyX2pvdXJuYWxfdGVzdChjbi0+YmgpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGNuLT5iaCk7CisJCQl9CisJCX0KKwkJY24gPSBjbi0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBrdXBkYXRlX3RyYW5zYWN0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAotCQkJCSAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKipuZXh0X2psLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm5leHRfdHJhbnNfaWQsCi0JCQkJICAgaW50IG51bV9ibG9ja3MsCi0JCQkJICAgaW50IG51bV90cmFucykgewotICAgIGludCByZXQgPSAwOwotICAgIGludCB3cml0dGVuID0gMCA7Ci0gICAgaW50IHRyYW5zYWN0aW9uc19mbHVzaGVkID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIG9yaWdfdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2NodW5rIGNodW5rOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgY2h1bmsubnIgPSAwOworCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKipuZXh0X2psLAorCQkJCXVuc2lnbmVkIGxvbmcgKm5leHRfdHJhbnNfaWQsCisJCQkJaW50IG51bV9ibG9ja3MsIGludCBudW1fdHJhbnMpCit7CisJaW50IHJldCA9IDA7CisJaW50IHdyaXR0ZW4gPSAwOworCWludCB0cmFuc2FjdGlvbnNfZmx1c2hlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBvcmlnX3RyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJc3RydWN0IGJ1ZmZlcl9jaHVuayBjaHVuazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJY2h1bmsubnIgPSAwOwogCi0gICAgZG93bigmam91cm5hbC0+al9mbHVzaF9zZW0pOwotICAgIGlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIG9yaWdfdHJhbnNfaWQpKSB7Ci0JZ290byBkb25lOwotICAgIH0KLQotICAgIC8qIHdlJ3ZlIGdvdCBqX2ZsdXNoX3NlbSBoZWxkLCBub2JvZHkgaXMgZ29pbmcgdG8gZGVsZXRlIGFueQotICAgICAqIG9mIHRoZXNlIGxpc3RzIG91dCBmcm9tIHVuZGVybmVhdGggdXMKLSAgICAgKi8KLSAgICB3aGlsZSgobnVtX3RyYW5zICYmIHRyYW5zYWN0aW9uc19mbHVzaGVkIDwgbnVtX3RyYW5zKSB8fAotICAgICAgICAgICghbnVtX3RyYW5zICYmIHdyaXR0ZW4gPCBudW1fYmxvY2tzKSkgewotCi0JaWYgKGpsLT5qX2xlbiA9PSAwIHx8IChqbC0+al9zdGF0ZSAmIExJU1RfVE9VQ0hFRCkgfHwKLQkgICAgYXRvbWljX3JlYWQoJmpsLT5qX2NvbW1pdF9sZWZ0KSB8fCAhKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkpCi0JewotCSAgICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOwotCSAgICBicmVhazsKKwlkb3duKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7CisJaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgb3JpZ190cmFuc19pZCkpIHsKKwkJZ290byBkb25lOwogCX0KLQlyZXQgPSB3cml0ZV9vbmVfdHJhbnNhY3Rpb24ocywgamwsICZjaHVuayk7CiAKLQlpZiAocmV0IDwgMCkKLQkgICAgZ290byBkb25lOwotCXRyYW5zYWN0aW9uc19mbHVzaGVkKys7Ci0Jd3JpdHRlbiArPSByZXQ7Ci0JZW50cnkgPSBqbC0+al9saXN0Lm5leHQ7CisJLyogd2UndmUgZ290IGpfZmx1c2hfc2VtIGhlbGQsIG5vYm9keSBpcyBnb2luZyB0byBkZWxldGUgYW55CisJICogb2YgdGhlc2UgbGlzdHMgb3V0IGZyb20gdW5kZXJuZWF0aCB1cworCSAqLworCXdoaWxlICgobnVtX3RyYW5zICYmIHRyYW5zYWN0aW9uc19mbHVzaGVkIDwgbnVtX3RyYW5zKSB8fAorCSAgICAgICAoIW51bV90cmFucyAmJiB3cml0dGVuIDwgbnVtX2Jsb2NrcykpIHsKIAotCS8qIGRpZCB3ZSB3cmFwPyAqLwotCWlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpIHsKLQkgICAgYnJlYWs7Ci0gICAgICAgIH0KLQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCWlmIChqbC0+al9sZW4gPT0gMCB8fCAoamwtPmpfc3RhdGUgJiBMSVNUX1RPVUNIRUQpIHx8CisJCSAgICBhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpCisJCSAgICB8fCAhKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkpIHsKKwkJCWRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSB3cml0ZV9vbmVfdHJhbnNhY3Rpb24ocywgamwsICZjaHVuayk7CiAKLQkvKiBkb24ndCBib3RoZXIgd2l0aCBvbGRlciB0cmFuc2FjdGlvbnMgKi8KLQlpZiAoamwtPmpfdHJhbnNfaWQgPD0gb3JpZ190cmFuc19pZCkKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChjaHVuay5ucikgewotICAgICAgICB3cml0ZV9jaHVuaygmY2h1bmspOwotICAgIH0KKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJCXRyYW5zYWN0aW9uc19mbHVzaGVkKys7CisJCXdyaXR0ZW4gKz0gcmV0OworCQllbnRyeSA9IGpsLT5qX2xpc3QubmV4dDsKIAotZG9uZToKLSAgICB1cCgmam91cm5hbC0+al9mbHVzaF9zZW0pOwotICAgIHJldHVybiByZXQ7CisJCS8qIGRpZCB3ZSB3cmFwPyAqLworCQlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7CisJCQlicmVhazsKKwkJfQorCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisKKwkJLyogZG9uJ3QgYm90aGVyIHdpdGggb2xkZXIgdHJhbnNhY3Rpb25zICovCisJCWlmIChqbC0+al90cmFuc19pZCA8PSBvcmlnX3RyYW5zX2lkKQorCQkJYnJlYWs7CisJfQorCWlmIChjaHVuay5ucikgeworCQl3cml0ZV9jaHVuaygmY2h1bmspOworCX0KKworICAgICAgZG9uZToKKwl1cCgmam91cm5hbC0+al9mbHVzaF9zZW0pOworCXJldHVybiByZXQ7CiB9CiAKIC8qIGZvciBvX3N5bmMgYW5kIGZzeW5jIGhlYXZ5IGFwcGxpY2F0aW9ucywgdGhleSB0ZW5kIHRvIHVzZQpAQCAtMTYxNyw0NyArMTcyMCw0OCBAQAogKiogbGlzdCB1cGRhdGVzIHRoZSBoZWFkZXIgYmxvY2sKICovCiBzdGF0aWMgaW50IGZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgewotICAgIHVuc2lnbmVkIGxvbmcgbGVuID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIGN1cl9sZW47Ci0gICAgaW50IHJldDsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGltaXQgPSAyNTY7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqdGpsOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZsdXNoX2psOwotICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQ7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKwkJCQkgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisJdW5zaWduZWQgbG9uZyBsZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgY3VyX2xlbjsKKwlpbnQgcmV0OworCWludCBpOworCWludCBsaW1pdCA9IDI1NjsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICp0amw7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqZmx1c2hfamw7CisJdW5zaWduZWQgbG9uZyB0cmFuc19pZDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CiAKLSAgICBmbHVzaF9qbCA9IHRqbCA9IGpsOworCWZsdXNoX2psID0gdGpsID0gamw7CiAKLSAgICAvKiBpbiBkYXRhIGxvZ2dpbmcgbW9kZSwgdHJ5IGhhcmRlciB0byBmbHVzaCBhIGxvdCBvZiBibG9ja3MgKi8KLSAgICBpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpCi0JbGltaXQgPSAxMDI0OwotICAgIC8qIGZsdXNoIGZvciAyNTYgdHJhbnNhY3Rpb25zIG9yIGxpbWl0IGJsb2Nrcywgd2hpY2hldmVyIGNvbWVzIGZpcnN0ICovCi0gICAgZm9yKGkgPSAwIDsgaSA8IDI1NiAmJiBsZW4gPCBsaW1pdCA7IGkrKykgewotCWlmIChhdG9taWNfcmVhZCgmdGpsLT5qX2NvbW1pdF9sZWZ0KSB8fAotCSAgICB0amwtPmpfdHJhbnNfaWQgPCBqbC0+al90cmFuc19pZCkgewotCSAgICBicmVhazsKKwkvKiBpbiBkYXRhIGxvZ2dpbmcgbW9kZSwgdHJ5IGhhcmRlciB0byBmbHVzaCBhIGxvdCBvZiBibG9ja3MgKi8KKwlpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpCisJCWxpbWl0ID0gMTAyNDsKKwkvKiBmbHVzaCBmb3IgMjU2IHRyYW5zYWN0aW9ucyBvciBsaW1pdCBibG9ja3MsIHdoaWNoZXZlciBjb21lcyBmaXJzdCAqLworCWZvciAoaSA9IDA7IGkgPCAyNTYgJiYgbGVuIDwgbGltaXQ7IGkrKykgeworCQlpZiAoYXRvbWljX3JlYWQoJnRqbC0+al9jb21taXRfbGVmdCkgfHwKKwkJICAgIHRqbC0+al90cmFuc19pZCA8IGpsLT5qX3RyYW5zX2lkKSB7CisJCQlicmVhazsKKwkJfQorCQljdXJfbGVuID0gYXRvbWljX3JlYWQoJnRqbC0+al9ub256ZXJvbGVuKTsKKwkJaWYgKGN1cl9sZW4gPiAwKSB7CisJCQl0amwtPmpfc3RhdGUgJj0gfkxJU1RfVE9VQ0hFRDsKKwkJfQorCQlsZW4gKz0gY3VyX2xlbjsKKwkJZmx1c2hfamwgPSB0amw7CisJCWlmICh0amwtPmpfbGlzdC5uZXh0ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKKwkJCWJyZWFrOworCQl0amwgPSBKT1VSTkFMX0xJU1RfRU5UUlkodGpsLT5qX2xpc3QubmV4dCk7CiAJfQotCWN1cl9sZW4gPSBhdG9taWNfcmVhZCgmdGpsLT5qX25vbnplcm9sZW4pOwotCWlmIChjdXJfbGVuID4gMCkgewotCSAgICB0amwtPmpfc3RhdGUgJj0gfkxJU1RfVE9VQ0hFRDsKKwkvKiB0cnkgdG8gZmluZCBhIGdyb3VwIG9mIGJsb2NrcyB3ZSBjYW4gZmx1c2ggYWNyb3NzIGFsbCB0aGUKKwkgKiogdHJhbnNhY3Rpb25zLCBidXQgb25seSBib3RoZXIgaWYgd2UndmUgYWN0dWFsbHkgc3Bhbm5lZAorCSAqKiBhY3Jvc3MgbXVsdGlwbGUgbGlzdHMKKwkgKi8KKwlpZiAoZmx1c2hfamwgIT0gamwpIHsKKwkJcmV0ID0ga3VwZGF0ZV90cmFuc2FjdGlvbnMocywgamwsICZ0amwsICZ0cmFuc19pZCwgbGVuLCBpKTsKIAl9Ci0JbGVuICs9IGN1cl9sZW47Ci0JZmx1c2hfamwgPSB0amw7Ci0JaWYgKHRqbC0+al9saXN0Lm5leHQgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQotCSAgICBicmVhazsKLQl0amwgPSBKT1VSTkFMX0xJU1RfRU5UUlkodGpsLT5qX2xpc3QubmV4dCk7Ci0gICAgfQotICAgIC8qIHRyeSB0byBmaW5kIGEgZ3JvdXAgb2YgYmxvY2tzIHdlIGNhbiBmbHVzaCBhY3Jvc3MgYWxsIHRoZQotICAgICoqIHRyYW5zYWN0aW9ucywgYnV0IG9ubHkgYm90aGVyIGlmIHdlJ3ZlIGFjdHVhbGx5IHNwYW5uZWQKLSAgICAqKiBhY3Jvc3MgbXVsdGlwbGUgbGlzdHMKLSAgICAqLwotICAgIGlmIChmbHVzaF9qbCAhPSBqbCkgewotICAgICAgICByZXQgPSBrdXBkYXRlX3RyYW5zYWN0aW9ucyhzLCBqbCwgJnRqbCwgJnRyYW5zX2lkLCBsZW4sIGkpOwotICAgIH0KLSAgICBmbHVzaF9qb3VybmFsX2xpc3QocywgZmx1c2hfamwsIDEpOwotICAgIHJldHVybiAwOworCWZsdXNoX2pvdXJuYWxfbGlzdChzLCBmbHVzaF9qbCwgMSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNjY1LDIwNyArMTc2OSwyNDggQEAKICoqIG9ubHkgdG91Y2hzIHRoZSBobmV4dCBhbmQgaHByZXYgcG9pbnRlcnMuCiAqLwogdm9pZCByZW1vdmVfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKnRhYmxlLAotCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCi0JCQl1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgcmVtb3ZlX2ZyZWVkKQorCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqdGFibGUsCisJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCisJCQkgdW5zaWduZWQgbG9uZyBibG9jaywgaW50IHJlbW92ZV9mcmVlZCkKIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1ciA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqaGVhZCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1cjsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKmhlYWQ7CiAKLSAgaGVhZD0gJihqb3VybmFsX2hhc2godGFibGUsIHNiLCBibG9jaykpIDsKLSAgaWYgKCFoZWFkKSB7Ci0gICAgcmV0dXJuIDsKLSAgfQotICBjdXIgPSAqaGVhZCA7Ci0gIHdoaWxlKGN1cikgewotICAgIGlmIChjdXItPmJsb2NrbnIgPT0gYmxvY2sgJiYgY3VyLT5zYiA9PSBzYiAmJiAoamwgPT0gTlVMTCB8fCBqbCA9PSBjdXItPmpsaXN0KSAmJiAKLSAgICAgICAgKCF0ZXN0X2JpdChCTE9DS19GUkVFRCwgJmN1ci0+c3RhdGUpIHx8IHJlbW92ZV9mcmVlZCkpIHsKLSAgICAgIGlmIChjdXItPmhuZXh0KSB7Ci0gICAgICAgIGN1ci0+aG5leHQtPmhwcmV2ID0gY3VyLT5ocHJldiA7Ci0gICAgICB9Ci0gICAgICBpZiAoY3VyLT5ocHJldikgewotCWN1ci0+aHByZXYtPmhuZXh0ID0gY3VyLT5obmV4dCA7Ci0gICAgICB9IGVsc2UgewotCSpoZWFkID0gY3VyLT5obmV4dCA7Ci0gICAgICB9Ci0gICAgICBjdXItPmJsb2NrbnIgPSAwIDsKLSAgICAgIGN1ci0+c2IgPSBOVUxMIDsKLSAgICAgIGN1ci0+c3RhdGUgPSAwIDsKLSAgICAgIGlmIChjdXItPmJoICYmIGN1ci0+amxpc3QpIC8qIGFueWJvZHkgd2hvIGNsZWFycyB0aGUgY3VyLT5iaCB3aWxsIGFsc28gZGVjIHRoZSBub256ZXJvbGVuICovCi0JYXRvbWljX2RlYygmKGN1ci0+amxpc3QtPmpfbm9uemVyb2xlbikpIDsKLSAgICAgIGN1ci0+YmggPSBOVUxMIDsKLSAgICAgIGN1ci0+amxpc3QgPSBOVUxMIDsKLSAgICB9IAotICAgIGN1ciA9IGN1ci0+aG5leHQgOwotICB9CisJaGVhZCA9ICYoam91cm5hbF9oYXNoKHRhYmxlLCBzYiwgYmxvY2spKTsKKwlpZiAoIWhlYWQpIHsKKwkJcmV0dXJuOworCX0KKwljdXIgPSAqaGVhZDsKKwl3aGlsZSAoY3VyKSB7CisJCWlmIChjdXItPmJsb2NrbnIgPT0gYmxvY2sgJiYgY3VyLT5zYiA9PSBzYgorCQkgICAgJiYgKGpsID09IE5VTEwgfHwgamwgPT0gY3VyLT5qbGlzdCkKKwkJICAgICYmICghdGVzdF9iaXQoQkxPQ0tfRlJFRUQsICZjdXItPnN0YXRlKSB8fCByZW1vdmVfZnJlZWQpKSB7CisJCQlpZiAoY3VyLT5obmV4dCkgeworCQkJCWN1ci0+aG5leHQtPmhwcmV2ID0gY3VyLT5ocHJldjsKKwkJCX0KKwkJCWlmIChjdXItPmhwcmV2KSB7CisJCQkJY3VyLT5ocHJldi0+aG5leHQgPSBjdXItPmhuZXh0OworCQkJfSBlbHNlIHsKKwkJCQkqaGVhZCA9IGN1ci0+aG5leHQ7CisJCQl9CisJCQljdXItPmJsb2NrbnIgPSAwOworCQkJY3VyLT5zYiA9IE5VTEw7CisJCQljdXItPnN0YXRlID0gMDsKKwkJCWlmIChjdXItPmJoICYmIGN1ci0+amxpc3QpCS8qIGFueWJvZHkgd2hvIGNsZWFycyB0aGUgY3VyLT5iaCB3aWxsIGFsc28gZGVjIHRoZSBub256ZXJvbGVuICovCisJCQkJYXRvbWljX2RlYygmKGN1ci0+amxpc3QtPmpfbm9uemVyb2xlbikpOworCQkJY3VyLT5iaCA9IE5VTEw7CisJCQljdXItPmpsaXN0ID0gTlVMTDsKKwkJfQorCQljdXIgPSBjdXItPmhuZXh0OworCX0KIH0KIAotc3RhdGljIHZvaWQgZnJlZV9qb3VybmFsX3JhbShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKLSAgcmVpc2VyZnNfa2ZyZWUoam91cm5hbC0+al9jdXJyZW50X2psLAotICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIHBfc19zYik7Ci0gIGpvdXJuYWwtPmpfbnVtX2xpc3RzLS07CitzdGF0aWMgdm9pZCBmcmVlX2pvdXJuYWxfcmFtKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCXJlaXNlcmZzX2tmcmVlKGpvdXJuYWwtPmpfY3VycmVudF9qbCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0KSwgcF9zX3NiKTsKKwlqb3VybmFsLT5qX251bV9saXN0cy0tOwogCi0gIHZmcmVlKGpvdXJuYWwtPmpfY25vZGVfZnJlZV9vcmlnKSA7Ci0gIGZyZWVfbGlzdF9iaXRtYXBzKHBfc19zYiwgam91cm5hbC0+al9saXN0X2JpdG1hcCkgOwotICBmcmVlX2JpdG1hcF9ub2RlcyhwX3Nfc2IpIDsgLyogbXVzdCBiZSBhZnRlciBmcmVlX2xpc3RfYml0bWFwcyAqLwotICBpZiAoam91cm5hbC0+al9oZWFkZXJfYmgpIHsKLSAgICBicmVsc2Uoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKLSAgfQotICAvKiBqX2hlYWRlcl9iaCBpcyBvbiB0aGUgam91cm5hbCBkZXYsIG1ha2Ugc3VyZSBub3QgdG8gcmVsZWFzZSB0aGUgam91cm5hbAotICAgKiBkZXYgdW50aWwgd2UgYnJlbHNlIGpfaGVhZGVyX2JoCi0gICAqLwotICByZWxlYXNlX2pvdXJuYWxfZGV2KHBfc19zYiwgam91cm5hbCk7Ci0gIHZmcmVlKGpvdXJuYWwpIDsKKwl2ZnJlZShqb3VybmFsLT5qX2Nub2RlX2ZyZWVfb3JpZyk7CisJZnJlZV9saXN0X2JpdG1hcHMocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfYml0bWFwKTsKKwlmcmVlX2JpdG1hcF9ub2RlcyhwX3Nfc2IpOwkvKiBtdXN0IGJlIGFmdGVyIGZyZWVfbGlzdF9iaXRtYXBzICovCisJaWYgKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSB7CisJCWJyZWxzZShqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJfQorCS8qIGpfaGVhZGVyX2JoIGlzIG9uIHRoZSBqb3VybmFsIGRldiwgbWFrZSBzdXJlIG5vdCB0byByZWxlYXNlIHRoZSBqb3VybmFsCisJICogZGV2IHVudGlsIHdlIGJyZWxzZSBqX2hlYWRlcl9iaAorCSAqLworCXJlbGVhc2Vfam91cm5hbF9kZXYocF9zX3NiLCBqb3VybmFsKTsKKwl2ZnJlZShqb3VybmFsKTsKIH0KIAogLyoKICoqIGNhbGwgb24gdW5tb3VudC4gIE9ubHkgc2V0IGVycm9yIHRvIDEgaWYgeW91IGhhdmVuJ3QgbWFkZSB5b3VyIHdheSBvdXQKICoqIG9mIHJlYWRfc3VwZXIoKSB5ZXQuICBBbnkgb3RoZXIgY2FsbGVyIG11c3Qga2VlcCBlcnJvciBhdCAwLgogKi8KLXN0YXRpYyBpbnQgZG9fam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgaW50IGVycm9yKSB7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aCA7Ci0gIGludCBmbHVzaGVkID0gMDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CitzdGF0aWMgaW50IGRvX2pvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOworCWludCBmbHVzaGVkID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICAvKiB3ZSBvbmx5IHdhbnQgdG8gZmx1c2ggb3V0IHRyYW5zYWN0aW9ucyBpZiB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGVycm9yID09IDAKLSAgKi8KLSAgaWYgKCFlcnJvciAmJiAhKHBfc19zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKLSAgICAvKiBlbmQgdGhlIGN1cnJlbnQgdHJhbnMgKi8KLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwxMCwgRkxVU0hfQUxMKSA7CisJLyogd2Ugb25seSB3YW50IHRvIGZsdXNoIG91dCB0cmFuc2FjdGlvbnMgaWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBlcnJvciA9PSAwCisJICovCisJaWYgKCFlcnJvciAmJiAhKHBfc19zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJLyogZW5kIHRoZSBjdXJyZW50IHRyYW5zICovCisJCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCQlkb19qb3VybmFsX2VuZCh0aCwgcF9zX3NiLCAxMCwgRkxVU0hfQUxMKTsKIAotICAgIC8qIG1ha2Ugc3VyZSBzb21ldGhpbmcgZ2V0cyBsb2dnZWQgdG8gZm9yY2Ugb3VyIHdheSBpbnRvIHRoZSBmbHVzaCBjb2RlICovCi0gICAgaWYgKCFqb3VybmFsX2pvaW4oJm15dGgsIHBfc19zYiwgMSkpIHsKLSAgICAgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYiksIDEpIDsKLSAgICAgICAgam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgICAgICAgZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwxLCBGTFVTSF9BTEwpIDsKLSAgICAgICAgZmx1c2hlZCA9IDE7Ci0gICAgfQotICB9CisJCS8qIG1ha2Ugc3VyZSBzb21ldGhpbmcgZ2V0cyBsb2dnZWQgdG8gZm9yY2Ugb3VyIHdheSBpbnRvIHRoZSBmbHVzaCBjb2RlICovCisJCWlmICgham91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwKKwkJCQkJCSAgICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwKKwkJCQkJCSAgICAgMSk7CisJCQlqb3VybmFsX21hcmtfZGlydHkoJm15dGgsIHBfc19zYiwKKwkJCQkJICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CisJCQlkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCBGTFVTSF9BTEwpOworCQkJZmx1c2hlZCA9IDE7CisJCX0KKwl9CiAKLSAgLyogdGhpcyBhbHNvIGNhdGNoZXMgZXJyb3JzIGR1cmluZyB0aGUgZG9fam91cm5hbF9lbmQgYWJvdmUgKi8KLSAgaWYgKCFlcnJvciAmJiByZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKLSAgICAgIG1lbXNldCgmbXl0aCwgMCwgc2l6ZW9mKG15dGgpKTsKLSAgICAgIGlmICgham91cm5hbF9qb2luX2Fib3J0KCZteXRoLCBwX3Nfc2IsIDEpKSB7Ci0JICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotCSAgam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgICAgICAgICBkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCBGTFVTSF9BTEwpIDsKLSAgICAgIH0KLSAgfQorCS8qIHRoaXMgYWxzbyBjYXRjaGVzIGVycm9ycyBkdXJpbmcgdGhlIGRvX2pvdXJuYWxfZW5kIGFib3ZlICovCisJaWYgKCFlcnJvciAmJiByZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJbWVtc2V0KCZteXRoLCAwLCBzaXplb2YobXl0aCkpOworCQlpZiAoIWpvdXJuYWxfam9pbl9hYm9ydCgmbXl0aCwgcF9zX3NiLCAxKSkgeworCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsCisJCQkJCQkgICAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYiksCisJCQkJCQkgICAgIDEpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsCisJCQkJCSAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpOworCQkJZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgRkxVU0hfQUxMKTsKKwkJfQorCX0KIAotICByZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50LS0gOwotICAvKiB3YWl0IGZvciBhbGwgY29tbWl0cyB0byBmaW5pc2ggKi8KLSAgY2FuY2VsX2RlbGF5ZWRfd29yaygmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3dvcmspOwotICBmbHVzaF93b3JrcXVldWUoY29tbWl0X3dxKTsKLSAgaWYgKCFyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50KSB7Ci0gICAgZGVzdHJveV93b3JrcXVldWUoY29tbWl0X3dxKTsKLSAgICBjb21taXRfd3EgPSBOVUxMOwotICB9CisJcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudC0tOworCS8qIHdhaXQgZm9yIGFsbCBjb21taXRzIHRvIGZpbmlzaCAqLworCWNhbmNlbF9kZWxheWVkX3dvcmsoJlNCX0pPVVJOQUwocF9zX3NiKS0+al93b3JrKTsKKwlmbHVzaF93b3JrcXVldWUoY29tbWl0X3dxKTsKKwlpZiAoIXJlaXNlcmZzX21vdW50ZWRfZnNfY291bnQpIHsKKwkJZGVzdHJveV93b3JrcXVldWUoY29tbWl0X3dxKTsKKwkJY29tbWl0X3dxID0gTlVMTDsKKwl9CiAKLSAgZnJlZV9qb3VybmFsX3JhbShwX3Nfc2IpIDsKKwlmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7CiAKLSAgcmV0dXJuIDAgOworCXJldHVybiAwOwogfQogCiAvKgogKiogY2FsbCBvbiB1bm1vdW50LiAgZmx1c2ggYWxsIGpvdXJuYWwgdHJhbnMsIHJlbGVhc2UgYWxsIGFsbG9jJ2QgcmFtCiAqLwotaW50IGpvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgcmV0dXJuIGRvX2pvdXJuYWxfcmVsZWFzZSh0aCwgcF9zX3NiLCAwKSA7CitpbnQgam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJcmV0dXJuIGRvX2pvdXJuYWxfcmVsZWFzZSh0aCwgcF9zX3NiLCAwKTsKIH0KKwogLyoKICoqIG9ubHkgY2FsbCBmcm9tIGFuIGVycm9yIGNvbmRpdGlvbiBpbnNpZGUgcmVpc2VyZnNfcmVhZF9zdXBlciEKICovCi1pbnQgam91cm5hbF9yZWxlYXNlX2Vycm9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICByZXR1cm4gZG9fam91cm5hbF9yZWxlYXNlKHRoLCBwX3Nfc2IsIDEpIDsKK2ludCBqb3VybmFsX3JlbGVhc2VfZXJyb3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXJldHVybiBkb19qb3VybmFsX3JlbGVhc2UodGgsIHBfc19zYiwgMSk7CiB9CiAKIC8qIGNvbXBhcmVzIGRlc2NyaXB0aW9uIGJsb2NrIHdpdGggY29tbWl0IGJsb2NrLiAgcmV0dXJucyAxIGlmIHRoZXkgZGlmZmVyLCAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lICovCi1zdGF0aWMgaW50IGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYywgCi0JCQkgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCkgewotICBpZiAoZ2V0X2NvbW1pdF90cmFuc19pZCAoY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19pZCAoZGVzYykgfHwgCi0gICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbiAoY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19sZW4gKGRlc2MpIHx8IAotICAgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4gKGNvbW1pdCkgPiBTQl9KT1VSTkFMKHBfc19zYiktPmpfdHJhbnNfbWF4IHx8Ci0gICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbiAoY29tbWl0KSA8PSAwIAotICApIHsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgcmV0dXJuIDAgOworc3RhdGljIGludCBqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MsCisJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0KQoreworCWlmIChnZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCkgIT0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSA+IFNCX0pPVVJOQUwocF9zX3NiKS0+al90cmFuc19tYXggfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSA8PSAwKSB7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KKwogLyogcmV0dXJucyAwIGlmIGl0IGRpZCBub3QgZmluZCBhIGRlc2NyaXB0aW9uIGJsb2NrICAKICoqIHJldHVybnMgLTEgaWYgaXQgZm91bmQgYSBjb3JydXB0IGNvbW1pdCBibG9jawogKiogcmV0dXJucyAxIGlmIGJvdGggZGVzYyBhbmQgY29tbWl0IHdlcmUgdmFsaWQgCiAqLwotc3RhdGljIGludCBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmgsIHVuc2lnbmVkIGxvbmcgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLCB1bnNpZ25lZCBsb25nICpuZXdlc3RfbW91bnRfaWQpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoIDsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgOworc3RhdGljIGludCBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmgsCisJCQkJCXVuc2lnbmVkIGxvbmcgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLAorCQkJCQl1bnNpZ25lZCBsb25nICpuZXdlc3RfbW91bnRfaWQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNfYmg7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAKLSAgaWYgKCFkX2JoKQotICAgICAgcmV0dXJuIDAgOworCWlmICghZF9iaCkKKwkJcmV0dXJuIDA7CiAKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhIDsKLSAgaWYgKGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA+IDAgJiYgIW1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljIChkX2JoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkgewotICAgIGlmIChvbGRlc3RfaW52YWxpZF90cmFuc19pZCAmJiAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgJiYgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgPiAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQpIHsKLSAgICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtOTg2OiB0cmFuc2FjdGlvbiAiCi0JICAgICAgICAgICAgICAiaXMgdmFsaWQgcmV0dXJuaW5nIGJlY2F1c2UgdHJhbnNfaWQgJWQgaXMgZ3JlYXRlciB0aGFuICIKLQkJICAgICAgIm9sZGVzdF9pbnZhbGlkICVsdSIsIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpLAotCQkgICAgICAgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKTsKLSAgICAgIHJldHVybiAwIDsKLSAgICB9Ci0gICAgaWYgKG5ld2VzdF9tb3VudF9pZCAmJiAqbmV3ZXN0X21vdW50X2lkID4gZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpKSB7Ci0gICAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwODc6IHRyYW5zYWN0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICJpcyB2YWxpZCByZXR1cm5pbmcgYmVjYXVzZSBtb3VudF9pZCAlZCBpcyBsZXNzIHRoYW4gIgotCQkgICAgICJuZXdlc3RfbW91bnRfaWQgJWx1IiwgZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpLAotCQkgICAgICpuZXdlc3RfbW91bnRfaWQpIDsKLSAgICAgIHJldHVybiAtMSA7Ci0gICAgfQotICAgIGlmICggZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpID4gU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3RyYW5zX21heCApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0yMDE4OiBCYWQgdHJhbnNhY3Rpb24gbGVuZ3RoICVkIGVuY291bnRlcmVkLCBpZ25vcmluZyB0cmFuc2FjdGlvbiIsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSk7Ci0gICAgICByZXR1cm4gLTEgOwotICAgIH0KLSAgICBvZmZzZXQgPSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7CisJZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhOworCWlmIChnZXRfZGVzY190cmFuc19sZW4oZGVzYykgPiAwCisJICAgICYmICFtZW1jbXAoZ2V0X2pvdXJuYWxfZGVzY19tYWdpYyhkX2JoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkgeworCQlpZiAob2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgJiYgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkCisJCSAgICAmJiBnZXRfZGVzY190cmFuc19pZChkZXNjKSA+ICpvbGRlc3RfaW52YWxpZF90cmFuc19pZCkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbC05ODY6IHRyYW5zYWN0aW9uICIKKwkJCQkgICAgICAgImlzIHZhbGlkIHJldHVybmluZyBiZWNhdXNlIHRyYW5zX2lkICVkIGlzIGdyZWF0ZXIgdGhhbiAiCisJCQkJICAgICAgICJvbGRlc3RfaW52YWxpZCAlbHUiLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19pZChkZXNjKSwKKwkJCQkgICAgICAgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChuZXdlc3RfbW91bnRfaWQKKwkJICAgICYmICpuZXdlc3RfbW91bnRfaWQgPiBnZXRfZGVzY19tb3VudF9pZChkZXNjKSkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbC0xMDg3OiB0cmFuc2FjdGlvbiAiCisJCQkJICAgICAgICJpcyB2YWxpZCByZXR1cm5pbmcgYmVjYXVzZSBtb3VudF9pZCAlZCBpcyBsZXNzIHRoYW4gIgorCQkJCSAgICAgICAibmV3ZXN0X21vdW50X2lkICVsdSIsCisJCQkJICAgICAgIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLAorCQkJCSAgICAgICAqbmV3ZXN0X21vdW50X2lkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpID4gU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3RyYW5zX21heCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0yMDE4OiBCYWQgdHJhbnNhY3Rpb24gbGVuZ3RoICVkIGVuY291bnRlcmVkLCBpZ25vcmluZyB0cmFuc2FjdGlvbiIsCisJCQkJCSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW9mZnNldCA9IGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOwogCi0gICAgLyogb2ssIHdlIGhhdmUgYSBqb3VybmFsIGRlc2NyaXB0aW9uIGJsb2NrLCBsZXRzIHNlZSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIHZhbGlkICovCi0gICAgY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCi0JCSAoKG9mZnNldCArIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSArIDEpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSkgOwotICAgIGlmICghY19iaCkKLSAgICAgIHJldHVybiAwIDsKLSAgICBjb21taXQgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICopY19iaC0+Yl9kYXRhIDsKLSAgICBpZiAoam91cm5hbF9jb21wYXJlX2Rlc2NfY29tbWl0KHBfc19zYiwgZGVzYywgY29tbWl0KSkgewotICAgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAKLSAgICAgICAgICAgICAgICAgICAgICJqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkLCBjb21taXQgb2Zmc2V0ICVsZCBoYWQgYmFkICIKLQkJICAgICAidGltZSAlZCBvciBsZW5ndGggJWQiLAotCQkgICAgIGNfYmgtPmJfYmxvY2tuciAtICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKLQkJICAgICBnZXRfY29tbWl0X3RyYW5zX2lkIChjb21taXQpLCAKLQkJICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbihjb21taXQpKTsKLSAgICAgIGJyZWxzZShjX2JoKSA7Ci0gICAgICBpZiAob2xkZXN0X2ludmFsaWRfdHJhbnNfaWQpIHsKLQkqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgPSBnZXRfZGVzY190cmFuc19pZChkZXNjKSA7Ci0JcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDA0OiAiCi0JCSAgICAgICAidHJhbnNhY3Rpb25faXNfdmFsaWQgc2V0dGluZyBvbGRlc3QgaW52YWxpZCB0cmFuc19pZCAiCi0JCSAgICAgICAidG8gJWQiLCBnZXRfZGVzY190cmFuc19pZChkZXNjKSkgOwotICAgICAgfQotICAgICAgcmV0dXJuIC0xOyAKLSAgICB9Ci0gICAgYnJlbHNlKGNfYmgpIDsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMDY6IGZvdW5kIHZhbGlkICIKLSAgICAgICAgICAgICAgICAgICAidHJhbnNhY3Rpb24gc3RhcnQgb2Zmc2V0ICVsbHUsIGxlbiAlZCBpZCAlZCIsCi0JCSAgIGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKLQkJICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLCBnZXRfZGVzY190cmFuc19pZChkZXNjKSkgOwotICAgIHJldHVybiAxIDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMCA7Ci0gIH0KKwkJLyogb2ssIHdlIGhhdmUgYSBqb3VybmFsIGRlc2NyaXB0aW9uIGJsb2NrLCBsZXRzIHNlZSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIHZhbGlkICovCisJCWNfYmggPQorCQkgICAgam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkJICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkJICAoKG9mZnNldCArIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSArCisJCQkJICAgIDEpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJCWlmICghY19iaCkKKwkJCXJldHVybiAwOworCQljb21taXQgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICopY19iaC0+Yl9kYXRhOworCQlpZiAoam91cm5hbF9jb21wYXJlX2Rlc2NfY29tbWl0KHBfc19zYiwgZGVzYywgY29tbWl0KSkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZCwgY29tbWl0IG9mZnNldCAlbGQgaGFkIGJhZCAiCisJCQkJICAgICAgICJ0aW1lICVkIG9yIGxlbmd0aCAlZCIsCisJCQkJICAgICAgIGNfYmgtPmJfYmxvY2tuciAtCisJCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLAorCQkJCSAgICAgICBnZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCksCisJCQkJICAgICAgIGdldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJaWYgKG9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKSB7CisJCQkJKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkID0KKwkJCQkgICAgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyk7CisJCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCQkgICAgICAgImpvdXJuYWwtMTAwNDogIgorCQkJCQkgICAgICAgInRyYW5zYWN0aW9uX2lzX3ZhbGlkIHNldHRpbmcgb2xkZXN0IGludmFsaWQgdHJhbnNfaWQgIgorCQkJCQkgICAgICAgInRvICVkIiwKKwkJCQkJICAgICAgIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVsc2UoY19iaCk7CisJCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCSAgICAgICAiam91cm5hbC0xMDA2OiBmb3VuZCB2YWxpZCAiCisJCQkgICAgICAgInRyYW5zYWN0aW9uIHN0YXJ0IG9mZnNldCAlbGx1LCBsZW4gJWQgaWQgJWQiLAorCQkJICAgICAgIGRfYmgtPmJfYmxvY2tuciAtCisJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLAorCQkJICAgICAgIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQogfQogCi1zdGF0aWMgdm9pZCBicmVsc2VfYXJyYXkoc3RydWN0IGJ1ZmZlcl9oZWFkICoqaGVhZHMsIGludCBudW0pIHsKLSAgaW50IGkgOwotICBmb3IgKGkgPSAwIDsgaSA8IG51bSA7IGkrKykgewotICAgIGJyZWxzZShoZWFkc1tpXSkgOwotICB9CitzdGF0aWMgdm9pZCBicmVsc2VfYXJyYXkoc3RydWN0IGJ1ZmZlcl9oZWFkICoqaGVhZHMsIGludCBudW0pCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWJyZWxzZShoZWFkc1tpXSk7CisJfQogfQogCiAvKgpAQCAtMTg3MywxNDkgKzIwMTgsMjAyIEBACiAqKiB0aGlzIGVpdGhlciByZWFkcyBpbiBhIHJlcGxheXMgYSB0cmFuc2FjdGlvbiwgb3IgcmV0dXJucyBiZWNhdXNlIHRoZSB0cmFuc2FjdGlvbgogKiogaXMgaW52YWxpZCwgb3IgdG9vIG9sZC4KICovCi1zdGF0aWMgaW50IGpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBjdXJfZGJsb2NrLCB1bnNpZ25lZCBsb25nIG9sZGVzdF9zdGFydCwgCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3RyYW5zX2lkLCB1bnNpZ25lZCBsb25nIG5ld2VzdF9tb3VudF9pZCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCA7Ci0gIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSAwIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbG9nX2Jsb2NrcyA9IE5VTEwgOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZWFsX2Jsb2NrcyA9IE5VTEwgOwotICB1bnNpZ25lZCBsb25nIHRyYW5zX29mZnNldCA7Ci0gIGludCBpOwotICBpbnQgdHJhbnNfaGFsZjsKK3N0YXRpYyBpbnQgam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGN1cl9kYmxvY2ssCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3N0YXJ0LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIG9sZGVzdF90cmFuc19pZCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBuZXdlc3RfbW91bnRfaWQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdDsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNfYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmxvZ19ibG9ja3MgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKnJlYWxfYmxvY2tzID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX29mZnNldDsKKwlpbnQgaTsKKwlpbnQgdHJhbnNfaGFsZjsKIAotICBkX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIGN1cl9kYmxvY2spIDsKLSAgaWYgKCFkX2JoKQotICAgIHJldHVybiAxIDsKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhIDsKLSAgdHJhbnNfb2Zmc2V0ID0gZF9iaC0+Yl9ibG9ja25yIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOwotICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMzc6ICIKLSAgICAgICAgICAgICAgICAgImpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbiwgb2Zmc2V0ICVsbHUsIGxlbiAlZCBtb3VudF9pZCAlZCIsCi0JCSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSBnZXRfZGVzY190cmFuc19sZW4oZGVzYyksIGdldF9kZXNjX21vdW50X2lkKGRlc2MpKSA7Ci0gIGlmIChnZXRfZGVzY190cmFuc19pZChkZXNjKSA8IG9sZGVzdF90cmFuc19pZCkgewotICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAzOTogIgotICAgICAgICAgICAgICAgICAgICJqb3VybmFsX3JlYWRfdHJhbnMgc2tpcHBpbmcgYmVjYXVzZSAlbHUgaXMgdG9vIG9sZCIsCi0JCSAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSkgOwotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIGlmIChnZXRfZGVzY19tb3VudF9pZChkZXNjKSAhPSBuZXdlc3RfbW91bnRfaWQpIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNDY6ICIKLSAgICAgICAgICAgICAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWQgaXMgIT0gIgotCQkgICAibmV3ZXN0X21vdW50X2lkICVsdSIsIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLAotCQkgICAgbmV3ZXN0X21vdW50X2lkKSA7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCi0JCSgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMSkgJSAKLQkJIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKLSAgaWYgKCFjX2JoKSB7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7Ci0gIGlmIChqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQocF9zX3NiLCBkZXNjLCBjb21taXQpKSB7Ci0gICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uLCAiCi0gICAgICAgICAgICAgICAgICAgImNvbW1pdCBvZmZzZXQgJWxsdSBoYWQgYmFkIHRpbWUgJWQgb3IgbGVuZ3RoICVkIiwKLQkJICAgY19iaC0+Yl9ibG9ja25yIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKLQkJICAgZ2V0X2NvbW1pdF90cmFuc19pZChjb21taXQpLCBnZXRfY29tbWl0X3RyYW5zX2xlbihjb21taXQpKTsKLSAgICBicmVsc2UoY19iaCkgOwotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgcmV0dXJuIDE7IAotICB9Ci0gIHRyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgOwotICAvKiBub3cgd2Uga25vdyB3ZSd2ZSBnb3QgYSBnb29kIHRyYW5zYWN0aW9uLCBhbmQgaXQgd2FzIGluc2lkZSB0aGUgdmFsaWQgdGltZSByYW5nZXMgKi8KLSAgbG9nX2Jsb2NrcyA9IHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYikgOwotICByZWFsX2Jsb2NrcyA9IHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYikgOwotICBpZiAoIWxvZ19ibG9ja3MgIHx8ICFyZWFsX2Jsb2NrcykgewotICAgIGJyZWxzZShjX2JoKSA7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTExNjk6IGttYWxsb2MgZmFpbGVkLCB1bmFibGUgdG8gbW91bnQgRlMiKSA7Ci0gICAgcmV0dXJuIC0xIDsKLSAgfQotICAvKiBnZXQgYWxsIHRoZSBidWZmZXIgaGVhZHMgKi8KLSAgdHJhbnNfaGFsZiA9IGpvdXJuYWxfdHJhbnNfaGFsZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgOwotICBmb3IoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7Ci0gICAgbG9nX2Jsb2Nrc1tpXSA9ICBqb3VybmFsX2dldGJsayhwX3Nfc2IsICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArICh0cmFuc19vZmZzZXQgKyAxICsgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOwotICAgIGlmIChpIDwgdHJhbnNfaGFsZikgewotICAgICAgcmVhbF9ibG9ja3NbaV0gPSBzYl9nZXRibGsocF9zX3NiLCBsZTMyX3RvX2NwdShkZXNjLT5qX3JlYWxibG9ja1tpXSkpIDsKLSAgICB9IGVsc2UgewotICAgICAgcmVhbF9ibG9ja3NbaV0gPSBzYl9nZXRibGsocF9zX3NiLCBsZTMyX3RvX2NwdShjb21taXQtPmpfcmVhbGJsb2NrW2kgLSB0cmFuc19oYWxmXSkpIDsKLSAgICB9Ci0gICAgaWYgKCByZWFsX2Jsb2Nrc1tpXS0+Yl9ibG9ja25yID4gU0JfQkxPQ0tfQ09VTlQocF9zX3NiKSApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xMjA3OiBSRVBMQVkgRkFJTFVSRSBmc2NrIHJlcXVpcmVkISBCbG9jayB0byByZXBsYXkgaXMgb3V0c2lkZSBvZiBmaWxlc3lzdGVtIik7Ci0gICAgICBnb3RvIGFib3J0X3JlcGxheTsKLSAgICB9Ci0gICAgLyogbWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZXBsYXkgb250byBsb2cgb3IgcmVzZXJ2ZWQgYXJlYSAqLwotICAgIGlmIChpc19ibG9ja19pbl9sb2dfb3JfcmVzZXJ2ZWRfYXJlYShwX3Nfc2IsIHJlYWxfYmxvY2tzW2ldLT5iX2Jsb2NrbnIpKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIwNDogUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgVHJ5aW5nIHRvIHJlcGxheSBvbnRvIGEgbG9nIGJsb2NrIikgOwotYWJvcnRfcmVwbGF5OgotICAgICAgYnJlbHNlX2FycmF5KGxvZ19ibG9ja3MsIGkpIDsKLSAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcywgaSkgOwotICAgICAgYnJlbHNlKGNfYmgpIDsKLSAgICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgICByZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICAgIHJldHVybiAtMSA7Ci0gICAgfQotICB9Ci0gIC8qIHJlYWQgaW4gdGhlIGxvZyBibG9ja3MsIG1lbWNweSB0byB0aGUgY29ycmVzcG9uZGluZyByZWFsIGJsb2NrICovCi0gIGxsX3J3X2Jsb2NrKFJFQUQsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgbG9nX2Jsb2NrcykgOwotICBmb3IgKGkgPSAwIDsgaSA8IGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA7IGkrKykgewotICAgIHdhaXRfb25fYnVmZmVyKGxvZ19ibG9ja3NbaV0pIDsKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShsb2dfYmxvY2tzW2ldKSkgewotICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTEyMTI6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7Ci0gICAgICBicmVsc2VfYXJyYXkobG9nX2Jsb2NrcyArIGksIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpIDsKLSAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpKSA7Ci0gICAgICBicmVsc2UoY19iaCkgOwotICAgICAgYnJlbHNlKGRfYmgpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmV0dXJuIC0xIDsKLSAgICB9Ci0gICAgbWVtY3B5KHJlYWxfYmxvY2tzW2ldLT5iX2RhdGEsIGxvZ19ibG9ja3NbaV0tPmJfZGF0YSwgcmVhbF9ibG9ja3NbaV0tPmJfc2l6ZSkgOwotICAgIHNldF9idWZmZXJfdXB0b2RhdGUocmVhbF9ibG9ja3NbaV0pIDsKLSAgICBicmVsc2UobG9nX2Jsb2Nrc1tpXSkgOwotICB9Ci0gIC8qIGZsdXNoIG91dCB0aGUgcmVhbCBibG9ja3MgKi8KLSAgZm9yIChpID0gMCA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgOyBpKyspIHsKLSAgICBzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKSA7Ci0gICAgbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSkgOwotICB9Ci0gIGZvciAoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7Ci0gICAgd2FpdF9vbl9idWZmZXIocmVhbF9ibG9ja3NbaV0pIDsgCi0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUocmVhbF9ibG9ja3NbaV0pKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIyNjogUkVQTEFZIEZBSUxVUkUsIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7Ci0gICAgICBicmVsc2VfYXJyYXkocmVhbF9ibG9ja3MgKyBpLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgLSBpKSA7Ci0gICAgICBicmVsc2UoY19iaCkgOwotICAgICAgYnJlbHNlKGRfYmgpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmV0dXJuIC0xIDsKLSAgICB9Ci0gICAgYnJlbHNlKHJlYWxfYmxvY2tzW2ldKSA7Ci0gIH0KLSAgY3VyX2RibG9jayA9ICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIDsKLSAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDk1OiBzZXR0aW5nIGpvdXJuYWwgIgotICAgICAgICAgICAgICAgICAic3RhcnQgdG8gb2Zmc2V0ICVsZCIsCi0JCSBjdXJfZGJsb2NrIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKSA7Ci0gIAotICAvKiBpbml0IHN0YXJ0aW5nIHZhbHVlcyBmb3IgdGhlIGZpcnN0IHRyYW5zYWN0aW9uLCBpbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdG8gYmUgcmVwbGF5ZWQuICovCi0gIGpvdXJuYWwtPmpfc3RhcnQgPSBjdXJfZGJsb2NrIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOwotICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSB0cmFuc19pZCA7Ci0gIGpvdXJuYWwtPmpfdHJhbnNfaWQgPSB0cmFuc19pZCArIDE7Ci0gIGJyZWxzZShjX2JoKSA7Ci0gIGJyZWxzZShkX2JoKSA7Ci0gIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGxlMzJfdG9fY3B1KGRlc2MtPmpfbGVuKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgbGUzMl90b19jcHUoZGVzYy0+al9sZW4pICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7Ci0gIHJldHVybiAwIDsKKwlkX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIGN1cl9kYmxvY2spOworCWlmICghZF9iaCkKKwkJcmV0dXJuIDE7CisJZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhOworCXRyYW5zX29mZnNldCA9IGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAzNzogIgorCQkgICAgICAgImpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbiwgb2Zmc2V0ICVsbHUsIGxlbiAlZCBtb3VudF9pZCAlZCIsCisJCSAgICAgICBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKKwkJICAgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOworCWlmIChnZXRfZGVzY190cmFuc19pZChkZXNjKSA8IG9sZGVzdF90cmFuc19pZCkgeworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMzk6ICIKKwkJCSAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWx1IGlzIHRvbyBvbGQiLAorCQkJICAgICAgIGN1cl9kYmxvY2sgLQorCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKTsKKwkJYnJlbHNlKGRfYmgpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGdldF9kZXNjX21vdW50X2lkKGRlc2MpICE9IG5ld2VzdF9tb3VudF9pZCkgeworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNDY6ICIKKwkJCSAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWQgaXMgIT0gIgorCQkJICAgICAgICJuZXdlc3RfbW91bnRfaWQgJWx1IiwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYyksCisJCQkgICAgICAgbmV3ZXN0X21vdW50X2lkKTsKKwkJYnJlbHNlKGRfYmgpOworCQlyZXR1cm4gMTsKKwl9CisJY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkgICAgICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMSkgJQorCQkJICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJaWYgKCFjX2JoKSB7CisJCWJyZWxzZShkX2JoKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1pdCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKiljX2JoLT5iX2RhdGE7CisJaWYgKGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChwX3Nfc2IsIGRlc2MsIGNvbW1pdCkpIHsKKwkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJqb3VybmFsX3JlYWRfdHJhbnNhY3Rpb24sICIKKwkJCSAgICAgICAiY29tbWl0IG9mZnNldCAlbGx1IGhhZCBiYWQgdGltZSAlZCBvciBsZW5ndGggJWQiLAorCQkJICAgICAgIGNfYmgtPmJfYmxvY2tuciAtCisJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCQkgICAgICAgZ2V0X2NvbW1pdF90cmFuc19pZChjb21taXQpLAorCQkJICAgICAgIGdldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCkpOworCQlicmVsc2UoY19iaCk7CisJCWJyZWxzZShkX2JoKTsKKwkJcmV0dXJuIDE7CisJfQorCXRyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyk7CisJLyogbm93IHdlIGtub3cgd2UndmUgZ290IGEgZ29vZCB0cmFuc2FjdGlvbiwgYW5kIGl0IHdhcyBpbnNpZGUgdGhlIHZhbGlkIHRpbWUgcmFuZ2VzICovCisJbG9nX2Jsb2NrcyA9CisJICAgIHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYik7CisJcmVhbF9ibG9ja3MgPQorCSAgICByZWlzZXJmc19rbWFsbG9jKGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIEdGUF9OT0ZTLCBwX3Nfc2IpOworCWlmICghbG9nX2Jsb2NrcyB8fCAhcmVhbF9ibG9ja3MpIHsKKwkJYnJlbHNlKGNfYmgpOworCQlicmVsc2UoZF9iaCk7CisJCXJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsCisJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQlyZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywKKwkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYik7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMTY5OiBrbWFsbG9jIGZhaWxlZCwgdW5hYmxlIHRvIG1vdW50IEZTIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogZ2V0IGFsbCB0aGUgYnVmZmVyIGhlYWRzICovCisJdHJhbnNfaGFsZiA9IGpvdXJuYWxfdHJhbnNfaGFsZihwX3Nfc2ItPnNfYmxvY2tzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpOyBpKyspIHsKKwkJbG9nX2Jsb2Nrc1tpXSA9CisJCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgICh0cmFuc19vZmZzZXQgKyAxICsKKwkJCQkgICAgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOworCQlpZiAoaSA8IHRyYW5zX2hhbGYpIHsKKwkJCXJlYWxfYmxvY2tzW2ldID0KKwkJCSAgICBzYl9nZXRibGsocF9zX3NiLAorCQkJCSAgICAgIGxlMzJfdG9fY3B1KGRlc2MtPmpfcmVhbGJsb2NrW2ldKSk7CisJCX0gZWxzZSB7CisJCQlyZWFsX2Jsb2Nrc1tpXSA9CisJCQkgICAgc2JfZ2V0YmxrKHBfc19zYiwKKwkJCQkgICAgICBsZTMyX3RvX2NwdShjb21taXQtPgorCQkJCQkJICBqX3JlYWxibG9ja1tpIC0gdHJhbnNfaGFsZl0pKTsKKwkJfQorCQlpZiAocmVhbF9ibG9ja3NbaV0tPmJfYmxvY2tuciA+IFNCX0JMT0NLX0NPVU5UKHBfc19zYikpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgImpvdXJuYWwtMTIwNzogUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgQmxvY2sgdG8gcmVwbGF5IGlzIG91dHNpZGUgb2YgZmlsZXN5c3RlbSIpOworCQkJZ290byBhYm9ydF9yZXBsYXk7CisJCX0KKwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZXBsYXkgb250byBsb2cgb3IgcmVzZXJ2ZWQgYXJlYSAqLworCQlpZiAoaXNfYmxvY2tfaW5fbG9nX29yX3Jlc2VydmVkX2FyZWEKKwkJICAgIChwX3Nfc2IsIHJlYWxfYmxvY2tzW2ldLT5iX2Jsb2NrbnIpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTEyMDQ6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIFRyeWluZyB0byByZXBsYXkgb250byBhIGxvZyBibG9jayIpOworCQkgICAgICBhYm9ydF9yZXBsYXk6CisJCQlicmVsc2VfYXJyYXkobG9nX2Jsb2NrcywgaSk7CisJCQlicmVsc2VfYXJyYXkocmVhbF9ibG9ja3MsIGkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCS8qIHJlYWQgaW4gdGhlIGxvZyBibG9ja3MsIG1lbWNweSB0byB0aGUgY29ycmVzcG9uZGluZyByZWFsIGJsb2NrICovCisJbGxfcndfYmxvY2soUkVBRCwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLCBsb2dfYmxvY2tzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpOyBpKyspIHsKKwkJd2FpdF9vbl9idWZmZXIobG9nX2Jsb2Nrc1tpXSk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGxvZ19ibG9ja3NbaV0pKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTEyMTI6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKTsKKwkJCWJyZWxzZV9hcnJheShsb2dfYmxvY2tzICsgaSwKKwkJCQkgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpOworCQkJYnJlbHNlX2FycmF5KHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbWNweShyZWFsX2Jsb2Nrc1tpXS0+Yl9kYXRhLCBsb2dfYmxvY2tzW2ldLT5iX2RhdGEsCisJCSAgICAgICByZWFsX2Jsb2Nrc1tpXS0+Yl9zaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShyZWFsX2Jsb2Nrc1tpXSk7CisJCWJyZWxzZShsb2dfYmxvY2tzW2ldKTsKKwl9CisJLyogZmx1c2ggb3V0IHRoZSByZWFsIGJsb2NrcyAqLworCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgeworCQlzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKTsKKwkJbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgeworCQl3YWl0X29uX2J1ZmZlcihyZWFsX2Jsb2Nrc1tpXSk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKHJlYWxfYmxvY2tzW2ldKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0xMjI2OiBSRVBMQVkgRkFJTFVSRSwgZnNjayByZXF1aXJlZCEgYnVmZmVyIHdyaXRlIGZhaWxlZCIpOworCQkJYnJlbHNlX2FycmF5KHJlYWxfYmxvY2tzICsgaSwKKwkJCQkgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWxzZShyZWFsX2Jsb2Nrc1tpXSk7CisJfQorCWN1cl9kYmxvY2sgPQorCSAgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJICAgICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsKKwkgICAgICAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkgICAgICAgImpvdXJuYWwtMTA5NTogc2V0dGluZyBqb3VybmFsICIgInN0YXJ0IHRvIG9mZnNldCAlbGQiLAorCQkgICAgICAgY3VyX2RibG9jayAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKTsKKworCS8qIGluaXQgc3RhcnRpbmcgdmFsdWVzIGZvciB0aGUgZmlyc3QgdHJhbnNhY3Rpb24sIGluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0byBiZSByZXBsYXllZC4gKi8KKwlqb3VybmFsLT5qX3N0YXJ0ID0gY3VyX2RibG9jayAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9IHRyYW5zX2lkOworCWpvdXJuYWwtPmpfdHJhbnNfaWQgPSB0cmFuc19pZCArIDE7CisJYnJlbHNlKGNfYmgpOworCWJyZWxzZShkX2JoKTsKKwlyZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLAorCQkgICAgICAgbGUzMl90b19jcHUoZGVzYy0+al9sZW4pICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKKwkJICAgICAgIHBfc19zYik7CisJcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsCisJCSAgICAgICBsZTMyX3RvX2NwdShkZXNjLT5qX2xlbikgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLAorCQkgICAgICAgcF9zX3NiKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiByZWFkcyBibG9ja3Mgc3RhcnRpbmcgZnJvbSBibG9jayBhbmQgdG8gbWF4X2Jsb2NrIG9mIGJ1ZnNpemUKQEAgLTIwMjQsMzkgKzIyMjIsMzkgQEAKICAgIFJpZ2h0IG5vdyBpdCBpcyBvbmx5IHVzZWQgZnJvbSBqb3VybmFsIGNvZGUuIEJ1dCBsYXRlciB3ZSBtaWdodCB1c2UgaXQKICAgIGZyb20gb3RoZXIgcGxhY2VzLgogICAgTm90ZTogRG8gbm90IHVzZSBqb3VybmFsX2dldGJsay9zYl9nZXRibGsgZnVuY3Rpb25zIGhlcmUhICovCi1zdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogcmVpc2VyZnNfYnJlYWRhIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCBibG9jaywgaW50IGJ1ZnNpemUsCi0JCQkgICAgdW5zaWduZWQgaW50IG1heF9ibG9jaykKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlaXNlcmZzX2JyZWFkYShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCBibG9jaywKKwkJCQkJICAgaW50IGJ1ZnNpemUsIHVuc2lnbmVkIGludCBtYXhfYmxvY2spCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhsaXN0W0JVRk5SXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJobGlzdFtCVUZOUl07CiAJdW5zaWduZWQgaW50IGJsb2NrcyA9IEJVRk5SOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IGksIGo7Ci0JCi0JYmggPSBfX2dldGJsayAoZGV2LCBibG9jaywgYnVmc2l6ZSApOwotCWlmIChidWZmZXJfdXB0b2RhdGUgKGJoKSkKLQkJcmV0dXJuIChiaCk7ICAgCi0JCQorCisJYmggPSBfX2dldGJsayhkZXYsIGJsb2NrLCBidWZzaXplKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJcmV0dXJuIChiaCk7CisKIAlpZiAoYmxvY2sgKyBCVUZOUiA+IG1heF9ibG9jaykgewogCQlibG9ja3MgPSBtYXhfYmxvY2sgLSBibG9jazsKIAl9CiAJYmhsaXN0WzBdID0gYmg7CiAJaiA9IDE7CiAJZm9yIChpID0gMTsgaSA8IGJsb2NrczsgaSsrKSB7Ci0JCWJoID0gX19nZXRibGsgKGRldiwgYmxvY2sgKyBpLCBidWZzaXplKTsKLQkJaWYgKGJ1ZmZlcl91cHRvZGF0ZSAoYmgpKSB7Ci0JCQlicmVsc2UgKGJoKTsKKwkJYmggPSBfX2dldGJsayhkZXYsIGJsb2NrICsgaSwgYnVmc2l6ZSk7CisJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQlicmVsc2UoYmgpOwogCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBiaGxpc3RbaisrXSA9IGJoOworCQl9IGVsc2UKKwkJCWJobGlzdFtqKytdID0gYmg7CiAJfQotCWxsX3J3X2Jsb2NrIChSRUFELCBqLCBiaGxpc3QpOwotCWZvcihpID0gMTsgaSA8IGo7IGkrKykgCi0JCWJyZWxzZSAoYmhsaXN0W2ldKTsKKwlsbF9yd19ibG9jayhSRUFELCBqLCBiaGxpc3QpOworCWZvciAoaSA9IDE7IGkgPCBqOyBpKyspCisJCWJyZWxzZShiaGxpc3RbaV0pOwogCWJoID0gYmhsaXN0WzBdOwotCXdhaXRfb25fYnVmZmVyIChiaCk7Ci0JaWYgKGJ1ZmZlcl91cHRvZGF0ZSAoYmgpKQorCXdhaXRfb25fYnVmZmVyKGJoKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKIAkJcmV0dXJuIGJoOwotCWJyZWxzZSAoYmgpOworCWJyZWxzZShiaCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTIwNjksMjE4ICsyMjY3LDI1MCBAQAogKioKICoqIE9uIGV4aXQsIGl0IHNldHMgdGhpbmdzIHVwIHNvIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiB3aWxsIHdvcmsgY29ycmVjdGx5LgogKi8KLXN0YXRpYyBpbnQgam91cm5hbF9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7Ci0gIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3RyYW5zX2lkID0gMDsKLSAgdW5zaWduZWQgbG9uZyBvbGRlc3RfaW52YWxpZF90cmFuc19pZCA9IDAgOwotICB0aW1lX3Qgc3RhcnQgOwotICB1bnNpZ25lZCBsb25nIG9sZGVzdF9zdGFydCA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgY3VyX2RibG9jayA9IDAgOwotICB1bnNpZ25lZCBsb25nIG5ld2VzdF9tb3VudF9pZCA9IDkgOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmggOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKmpoIDsKLSAgaW50IHZhbGlkX2pvdXJuYWxfaGVhZGVyID0gMCA7Ci0gIGludCByZXBsYXlfY291bnQgPSAwIDsKLSAgaW50IGNvbnRpbnVlX3JlcGxheSA9IDEgOwotICBpbnQgcmV0IDsKLSAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworc3RhdGljIGludCBqb3VybmFsX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIG9sZGVzdF90cmFuc19pZCA9IDA7CisJdW5zaWduZWQgbG9uZyBvbGRlc3RfaW52YWxpZF90cmFuc19pZCA9IDA7CisJdGltZV90IHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgb2xkZXN0X3N0YXJ0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGN1cl9kYmxvY2sgPSAwOworCXVuc2lnbmVkIGxvbmcgbmV3ZXN0X21vdW50X2lkID0gOTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmg7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKKwlpbnQgdmFsaWRfam91cm5hbF9oZWFkZXIgPSAwOworCWludCByZXBsYXlfY291bnQgPSAwOworCWludCBjb250aW51ZV9yZXBsYXkgPSAxOworCWludCByZXQ7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCi0gIGN1cl9kYmxvY2sgPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7Ci0gIHJlaXNlcmZzX2luZm8gKHBfc19zYiwgImNoZWNraW5nIHRyYW5zYWN0aW9uIGxvZyAoJXMpXG4iLAotCSBiZGV2bmFtZShqb3VybmFsLT5qX2Rldl9iZCwgYikpOwotICBzdGFydCA9IGdldF9zZWNvbmRzKCk7CisJY3VyX2RibG9jayA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCXJlaXNlcmZzX2luZm8ocF9zX3NiLCAiY2hlY2tpbmcgdHJhbnNhY3Rpb24gbG9nICglcylcbiIsCisJCSAgICAgIGJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2X2JkLCBiKSk7CisJc3RhcnQgPSBnZXRfc2Vjb25kcygpOwogCi0gIC8qIHN0ZXAgMSwgcmVhZCBpbiB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2suICBDaGVjayB0aGUgdHJhbnNhY3Rpb24gaXQgc2F5cyAKLSAgKiogaXMgdGhlIGZpcnN0IHVuZmx1c2hlZCwgYW5kIGlmIHRoYXQgdHJhbnNhY3Rpb24gaXMgbm90IHZhbGlkLCAKLSAgKiogcmVwbGF5IGlzIGRvbmUKLSAgKi8KLSAgam91cm5hbC0+al9oZWFkZXJfYmggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwKLQkJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKLQkJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKTsKLSAgaWYgKCFqb3VybmFsLT5qX2hlYWRlcl9iaCkgewotICAgIHJldHVybiAxIDsKLSAgfQotICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoam91cm5hbC0+al9oZWFkZXJfYmgtPmJfZGF0YSkgOwotICBpZiAobGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgPj0gMCAmJiAKLSAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDwgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpICYmIAotICAgICAgbGUzMl90b19jcHUoamgtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgPiAwKSB7Ci0gICAgb2xkZXN0X3N0YXJ0ID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgOwotICAgIG9sZGVzdF90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKLSAgICBuZXdlc3RfbW91bnRfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9tb3VudF9pZCk7Ci0gICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMTUzOiBmb3VuZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgImhlYWRlcjogZmlyc3RfdW5mbHVzaGVkX29mZnNldCAlZCwgbGFzdF9mbHVzaGVkX3RyYW5zX2lkICIKLQkJICAgIiVsdSIsIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpLAotCQkgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSkgOwotICAgIHZhbGlkX2pvdXJuYWxfaGVhZGVyID0gMSA7CisJLyogc3RlcCAxLCByZWFkIGluIHRoZSBqb3VybmFsIGhlYWRlciBibG9jay4gIENoZWNrIHRoZSB0cmFuc2FjdGlvbiBpdCBzYXlzIAorCSAqKiBpcyB0aGUgZmlyc3QgdW5mbHVzaGVkLCBhbmQgaWYgdGhhdCB0cmFuc2FjdGlvbiBpcyBub3QgdmFsaWQsIAorCSAqKiByZXBsYXkgaXMgZG9uZQorCSAqLworCWpvdXJuYWwtPmpfaGVhZGVyX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkJCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikKKwkJCQkJICAgICArIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisJaWYgKCFqb3VybmFsLT5qX2hlYWRlcl9iaCkgeworCQlyZXR1cm4gMTsKKwl9CisJamggPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICopKGpvdXJuYWwtPmpfaGVhZGVyX2JoLT5iX2RhdGEpOworCWlmIChsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KSA+PSAwICYmCisJICAgIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDwKKwkgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpCisJICAgICYmIGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpID4gMCkgeworCQlvbGRlc3Rfc3RhcnQgPQorCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkgICAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCk7CisJCW9sZGVzdF90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKKwkJbmV3ZXN0X21vdW50X2lkID0gbGUzMl90b19jcHUoamgtPmpfbW91bnRfaWQpOworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkgICAgICAgImpvdXJuYWwtMTE1MzogZm91bmQgaW4gIgorCQkJICAgICAgICJoZWFkZXI6IGZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgJWQsIGxhc3RfZmx1c2hlZF90cmFuc19pZCAiCisJCQkgICAgICAgIiVsdSIsIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpKTsKKwkJdmFsaWRfam91cm5hbF9oZWFkZXIgPSAxOwogCi0gICAgLyogbm93LCB3ZSB0cnkgdG8gcmVhZCB0aGUgZmlyc3QgdW5mbHVzaGVkIG9mZnNldC4gIElmIGl0IGlzIG5vdCB2YWxpZCwgCi0gICAgKiogdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkbywgYW5kIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlYWQgCi0gICAgKiogdGhyb3VnaCB0aGUgd2hvbGUgbG9nLgotICAgICovCi0gICAgZF9iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpKSA7Ci0gICAgcmV0ID0gam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZChwX3Nfc2IsIGRfYmgsIE5VTEwsIE5VTEwpIDsKLSAgICBpZiAoIXJldCkgewotICAgICAgY29udGludWVfcmVwbGF5ID0gMCA7Ci0gICAgfQotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgZ290byBzdGFydF9sb2dfcmVwbGF5OwotICB9CisJCS8qIG5vdywgd2UgdHJ5IHRvIHJlYWQgdGhlIGZpcnN0IHVuZmx1c2hlZCBvZmZzZXQuICBJZiBpdCBpcyBub3QgdmFsaWQsIAorCQkgKiogdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkbywgYW5kIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlYWQgCisJCSAqKiB0aHJvdWdoIHRoZSB3aG9sZSBsb2cuCisJCSAqLworCQlkX2JoID0KKwkJICAgIGpvdXJuYWxfYnJlYWQocF9zX3NiLAorCQkJCSAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkpOworCQlyZXQgPSBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHBfc19zYiwgZF9iaCwgTlVMTCwgTlVMTCk7CisJCWlmICghcmV0KSB7CisJCQljb250aW51ZV9yZXBsYXkgPSAwOworCQl9CisJCWJyZWxzZShkX2JoKTsKKwkJZ290byBzdGFydF9sb2dfcmVwbGF5OworCX0KIAotICBpZiAoY29udGludWVfcmVwbGF5ICYmIGJkZXZfcmVhZF9vbmx5KHBfc19zYi0+c19iZGV2KSkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwKLQkJICAgICAgImNsbS0yMDc2OiBkZXZpY2UgaXMgcmVhZG9ubHksIHVuYWJsZSB0byByZXBsYXkgbG9nIikgOwotICAgIHJldHVybiAtMSA7Ci0gIH0KKwlpZiAoY29udGludWVfcmVwbGF5ICYmIGJkZXZfcmVhZF9vbmx5KHBfc19zYi0+c19iZGV2KSkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkgImNsbS0yMDc2OiBkZXZpY2UgaXMgcmVhZG9ubHksIHVuYWJsZSB0byByZXBsYXkgbG9nIik7CisJCXJldHVybiAtMTsKKwl9CiAKLSAgLyogb2ssIHRoZXJlIGFyZSB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJlcGxheWVkLiAgc3RhcnQgd2l0aCB0aGUgZmlyc3QgbG9nIGJsb2NrLCBmaW5kCi0gICoqIGFsbCB0aGUgdmFsaWQgdHJhbnNhY3Rpb25zLCBhbmQgcGljayBvdXQgdGhlIG9sZGVzdC4KLSAgKi8KLSAgd2hpbGUoY29udGludWVfcmVwbGF5ICYmIGN1cl9kYmxvY2sgPCAoU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSB7Ci0gICAgLyogTm90ZSB0aGF0IGl0IGlzIHJlcXVpcmVkIGZvciBibG9ja3NpemUgb2YgcHJpbWFyeSBmcyBkZXZpY2UgYW5kIGpvdXJuYWwKLSAgICAgICBkZXZpY2UgdG8gYmUgdGhlIHNhbWUgKi8KLSAgICBkX2JoID0gcmVpc2VyZnNfYnJlYWRhKGpvdXJuYWwtPmpfZGV2X2JkLCBjdXJfZGJsb2NrLCBwX3Nfc2ItPnNfYmxvY2tzaXplLAotCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIDsKLSAgICByZXQgPSBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHBfc19zYiwgZF9iaCwgJm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLCAmbmV3ZXN0X21vdW50X2lkKSA7Ci0gICAgaWYgKHJldCA9PSAxKSB7Ci0gICAgICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKilkX2JoLT5iX2RhdGEgOwotICAgICAgaWYgKG9sZGVzdF9zdGFydCA9PSAwKSB7IC8qIGluaXQgYWxsIG9sZGVzdF8gdmFsdWVzICovCi0gICAgICAgIG9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKLQlvbGRlc3Rfc3RhcnQgPSBkX2JoLT5iX2Jsb2NrbnIgOwotCW5ld2VzdF9tb3VudF9pZCA9IGdldF9kZXNjX21vdW50X2lkKGRlc2MpIDsKLQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNzk6IFNldHRpbmcgIgotCSAgICAgICAgICAgICAgICJvbGRlc3Rfc3RhcnQgdG8gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCi0JCSAgICAgICBvbGRlc3Rfc3RhcnQgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSAgICAgICBvbGRlc3RfdHJhbnNfaWQpIDsKLSAgICAgIH0gZWxzZSBpZiAob2xkZXN0X3RyYW5zX2lkID4gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIHsgCi0gICAgICAgIC8qIG9uZSB3ZSBqdXN0IHJlYWQgd2FzIG9sZGVyICovCi0gICAgICAgIG9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKLQlvbGRlc3Rfc3RhcnQgPSBkX2JoLT5iX2Jsb2NrbnIgOwotCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTE4MDogUmVzZXR0aW5nICIKLQkgICAgICAgICAgICAgICAib2xkZXN0X3N0YXJ0IHRvIG9mZnNldCAlbHUsIHRyYW5zX2lkICVsdSIsCi0JCQlvbGRlc3Rfc3RhcnQgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCQlvbGRlc3RfdHJhbnNfaWQpIDsKLSAgICAgIH0KLSAgICAgIGlmIChuZXdlc3RfbW91bnRfaWQgPCBnZXRfZGVzY19tb3VudF9pZChkZXNjKSkgewotICAgICAgICBuZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKSA7CisJLyogb2ssIHRoZXJlIGFyZSB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJlcGxheWVkLiAgc3RhcnQgd2l0aCB0aGUgZmlyc3QgbG9nIGJsb2NrLCBmaW5kCisJICoqIGFsbCB0aGUgdmFsaWQgdHJhbnNhY3Rpb25zLCBhbmQgcGljayBvdXQgdGhlIG9sZGVzdC4KKwkgKi8KKwl3aGlsZSAoY29udGludWVfcmVwbGF5CisJICAgICAgICYmIGN1cl9kYmxvY2sgPAorCSAgICAgICAoU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQlTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSB7CisJCS8qIE5vdGUgdGhhdCBpdCBpcyByZXF1aXJlZCBmb3IgYmxvY2tzaXplIG9mIHByaW1hcnkgZnMgZGV2aWNlIGFuZCBqb3VybmFsCisJCSAgIGRldmljZSB0byBiZSB0aGUgc2FtZSAqLworCQlkX2JoID0KKwkJICAgIHJlaXNlcmZzX2JyZWFkYShqb3VybmFsLT5qX2Rldl9iZCwgY3VyX2RibG9jaywKKwkJCQkgICAgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOworCQlyZXQgPQorCQkgICAgam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZChwX3Nfc2IsIGRfYmgsCisJCQkJCQkgJm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLAorCQkJCQkJICZuZXdlc3RfbW91bnRfaWQpOworCQlpZiAocmV0ID09IDEpIHsKKwkJCWRlc2MgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqKWRfYmgtPmJfZGF0YTsKKwkJCWlmIChvbGRlc3Rfc3RhcnQgPT0gMCkgewkvKiBpbml0IGFsbCBvbGRlc3RfIHZhbHVlcyAqLworCQkJCW9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpOworCQkJCW9sZGVzdF9zdGFydCA9IGRfYmgtPmJfYmxvY2tucjsKKwkJCQluZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKTsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMTc5OiBTZXR0aW5nICIKKwkJCQkJICAgICAgICJvbGRlc3Rfc3RhcnQgdG8gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCisJCQkJCSAgICAgICBvbGRlc3Rfc3RhcnQgLQorCQkJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLCisJCQkJCSAgICAgICAocF9zX3NiKSwgb2xkZXN0X3RyYW5zX2lkKTsKKwkJCX0gZWxzZSBpZiAob2xkZXN0X3RyYW5zX2lkID4gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIHsKKwkJCQkvKiBvbmUgd2UganVzdCByZWFkIHdhcyBvbGRlciAqLworCQkJCW9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpOworCQkJCW9sZGVzdF9zdGFydCA9IGRfYmgtPmJfYmxvY2tucjsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMTgwOiBSZXNldHRpbmcgIgorCQkJCQkgICAgICAgIm9sZGVzdF9zdGFydCB0byBvZmZzZXQgJWx1LCB0cmFuc19pZCAlbHUiLAorCQkJCQkgICAgICAgb2xkZXN0X3N0YXJ0IC0KKwkJCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSworCQkJCQkgICAgICAgKHBfc19zYiksIG9sZGVzdF90cmFuc19pZCk7CisJCQl9CisJCQlpZiAobmV3ZXN0X21vdW50X2lkIDwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpIHsKKwkJCQluZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKTsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMjk5OiBTZXR0aW5nICIKKwkJCQkJICAgICAgICJuZXdlc3RfbW91bnRfaWQgdG8gJWQiLAorCQkJCQkgICAgICAgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOworCQkJfQorCQkJY3VyX2RibG9jayArPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAyOworCQl9IGVsc2UgeworCQkJY3VyX2RibG9jaysrOworCQl9CisJCWJyZWxzZShkX2JoKTsKKwl9CisKKyAgICAgIHN0YXJ0X2xvZ19yZXBsYXk6CisJY3VyX2RibG9jayA9IG9sZGVzdF9zdGFydDsKKwlpZiAob2xkZXN0X3RyYW5zX2lkKSB7CisJCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCSAgICAgICAiam91cm5hbC0xMjA2OiBTdGFydGluZyByZXBsYXkgIgorCQkJICAgICAgICJmcm9tIG9mZnNldCAlbGx1LCB0cmFuc19pZCAlbHUiLAorCQkJICAgICAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKKwkJCSAgICAgICBvbGRlc3RfdHJhbnNfaWQpOworCisJfQorCXJlcGxheV9jb3VudCA9IDA7CisJd2hpbGUgKGNvbnRpbnVlX3JlcGxheSAmJiBvbGRlc3RfdHJhbnNfaWQgPiAwKSB7CisJCXJldCA9CisJCSAgICBqb3VybmFsX3JlYWRfdHJhbnNhY3Rpb24ocF9zX3NiLCBjdXJfZGJsb2NrLCBvbGRlc3Rfc3RhcnQsCisJCQkJCSAgICAgb2xkZXN0X3RyYW5zX2lkLCBuZXdlc3RfbW91bnRfaWQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChyZXQgIT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJY3VyX2RibG9jayA9CisJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQ7CisJCXJlcGxheV9jb3VudCsrOworCQlpZiAoY3VyX2RibG9jayA9PSBvbGRlc3Rfc3RhcnQpCisJCQlicmVhazsKKwl9CisKKwlpZiAob2xkZXN0X3RyYW5zX2lkID09IDApIHsKKwkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJqb3VybmFsLTEyMjU6IE5vIHZhbGlkICIgInRyYW5zYWN0aW9ucyBmb3VuZCIpOworCX0KKwkvKiBqX3N0YXJ0IGRvZXMgbm90IGdldCBzZXQgY29ycmVjdGx5IGlmIHdlIGRvbid0IHJlcGxheSBhbnkgdHJhbnNhY3Rpb25zLgorCSAqKiBpZiB3ZSBoYWQgYSB2YWxpZCBqb3VybmFsX2hlYWRlciwgc2V0IGpfc3RhcnQgdG8gdGhlIGZpcnN0IHVuZmx1c2hlZCB0cmFuc2FjdGlvbiB2YWx1ZSwKKwkgKiogY29weSB0aGUgdHJhbnNfaWQgZnJvbSB0aGUgaGVhZGVyCisJICovCisJaWYgKHZhbGlkX2pvdXJuYWxfaGVhZGVyICYmIHJlcGxheV9jb3VudCA9PSAwKSB7CisJCWpvdXJuYWwtPmpfc3RhcnQgPSBsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KTsKKwkJam91cm5hbC0+al90cmFuc19pZCA9CisJCSAgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSArIDE7CisJCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9CisJCSAgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKTsKKwkJam91cm5hbC0+al9tb3VudF9pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX21vdW50X2lkKSArIDE7CisJfSBlbHNlIHsKKwkJam91cm5hbC0+al9tb3VudF9pZCA9IG5ld2VzdF9tb3VudF9pZCArIDE7CisJfQogCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTI5OTogU2V0dGluZyAiCi0JICAgICAgICAgICAgICAibmV3ZXN0X21vdW50X2lkIHRvICVkIiwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOwotICAgICAgfQotICAgICAgY3VyX2RibG9jayArPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAyIDsKLSAgICB9IGVsc2UgewotICAgICAgY3VyX2RibG9jaysrIDsKLSAgICB9Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgfQotCi1zdGFydF9sb2dfcmVwbGF5OgotICBjdXJfZGJsb2NrID0gb2xkZXN0X3N0YXJ0IDsKLSAgaWYgKG9sZGVzdF90cmFuc19pZCkgIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEyMDY6IFN0YXJ0aW5nIHJlcGxheSAiCi0gICAgICAgICAgICAgICAgICAgImZyb20gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCi0JCSAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSAgIG9sZGVzdF90cmFuc19pZCkgOwotCi0gIH0KLSAgcmVwbGF5X2NvdW50ID0gMCA7Ci0gIHdoaWxlKGNvbnRpbnVlX3JlcGxheSAmJiBvbGRlc3RfdHJhbnNfaWQgPiAwKSB7Ci0gICAgcmV0ID0gam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uKHBfc19zYiwgY3VyX2RibG9jaywgb2xkZXN0X3N0YXJ0LCBvbGRlc3RfdHJhbnNfaWQsIG5ld2VzdF9tb3VudF9pZCkgOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICByZXR1cm4gcmV0IDsKLSAgICB9IGVsc2UgaWYgKHJldCAhPSAwKSB7Ci0gICAgICBicmVhayA7Ci0gICAgfQotICAgIGN1cl9kYmxvY2sgPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQgOwotICAgIHJlcGxheV9jb3VudCsrIDsKLSAgIGlmIChjdXJfZGJsb2NrID09IG9sZGVzdF9zdGFydCkKLSAgICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAob2xkZXN0X3RyYW5zX2lkID09IDApIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEyMjU6IE5vIHZhbGlkICIKLSAgICAgICAgICAgICAgICAgICAidHJhbnNhY3Rpb25zIGZvdW5kIikgOwotICB9Ci0gIC8qIGpfc3RhcnQgZG9lcyBub3QgZ2V0IHNldCBjb3JyZWN0bHkgaWYgd2UgZG9uJ3QgcmVwbGF5IGFueSB0cmFuc2FjdGlvbnMuCi0gICoqIGlmIHdlIGhhZCBhIHZhbGlkIGpvdXJuYWxfaGVhZGVyLCBzZXQgal9zdGFydCB0byB0aGUgZmlyc3QgdW5mbHVzaGVkIHRyYW5zYWN0aW9uIHZhbHVlLAotICAqKiBjb3B5IHRoZSB0cmFuc19pZCBmcm9tIHRoZSBoZWFkZXIKLSAgKi8KLSAgaWYgKHZhbGlkX2pvdXJuYWxfaGVhZGVyICYmIHJlcGxheV9jb3VudCA9PSAwKSB7IAotICAgIGpvdXJuYWwtPmpfc3RhcnQgPSBsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KSA7Ci0gICAgam91cm5hbC0+al90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKLSAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSA7Ci0gICAgam91cm5hbC0+al9tb3VudF9pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX21vdW50X2lkKSArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgam91cm5hbC0+al9tb3VudF9pZCA9IG5ld2VzdF9tb3VudF9pZCArIDEgOwotICB9Ci0gIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTI5OTogU2V0dGluZyAiCi0gICAgICAgICAgICAgICAgICJuZXdlc3RfbW91bnRfaWQgdG8gJWx1Iiwgam91cm5hbC0+al9tb3VudF9pZCkgOwotICBqb3VybmFsLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKLSAgaWYgKHJlcGxheV9jb3VudCA+IDApIHsKLSAgICByZWlzZXJmc19pbmZvIChwX3Nfc2IsICJyZXBsYXllZCAlZCB0cmFuc2FjdGlvbnMgaW4gJWx1IHNlY29uZHNcbiIsCi0JCSAgIHJlcGxheV9jb3VudCwgZ2V0X3NlY29uZHMoKSAtIHN0YXJ0KSA7Ci0gIH0KLSAgaWYgKCFiZGV2X3JlYWRfb25seShwX3Nfc2ItPnNfYmRldikgJiYgCi0gICAgICAgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIGpvdXJuYWwtPmpfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkpCi0gIHsKLSAgICAgIC8qIHJlcGxheSBmYWlsZWQsIGNhbGxlciBtdXN0IGNhbGwgZnJlZV9qb3VybmFsX3JhbSBhbmQgYWJvcnQKLSAgICAgICoqIHRoZSBtb3VudAotICAgICAgKi8KLSAgICAgIHJldHVybiAtMSA7Ci0gIH0KLSAgcmV0dXJuIDAgOworCQkgICAgICAgIm5ld2VzdF9tb3VudF9pZCB0byAlbHUiLCBqb3VybmFsLT5qX21vdW50X2lkKTsKKwlqb3VybmFsLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBqb3VybmFsLT5qX3N0YXJ0OworCWlmIChyZXBsYXlfY291bnQgPiAwKSB7CisJCXJlaXNlcmZzX2luZm8ocF9zX3NiLAorCQkJICAgICAgInJlcGxheWVkICVkIHRyYW5zYWN0aW9ucyBpbiAlbHUgc2Vjb25kc1xuIiwKKwkJCSAgICAgIHJlcGxheV9jb3VudCwgZ2V0X3NlY29uZHMoKSAtIHN0YXJ0KTsKKwl9CisJaWYgKCFiZGV2X3JlYWRfb25seShwX3Nfc2ItPnNfYmRldikgJiYKKwkgICAgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIGpvdXJuYWwtPmpfc3RhcnQsCisJCQkJCSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpKSB7CisJCS8qIHJlcGxheSBmYWlsZWQsIGNhbGxlciBtdXN0IGNhbGwgZnJlZV9qb3VybmFsX3JhbSBhbmQgYWJvcnQKKwkJICoqIHRoZSBtb3VudAorCQkgKi8KKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmFsbG9jX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7Ci1yZXRyeToKLSAgICBqbCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QpLCBHRlBfTk9GUywgcyk7Ci0gICAgaWYgKCFqbCkgewotCXlpZWxkKCk7Ci0JZ290byByZXRyeTsKLSAgICB9Ci0gICAgbWVtc2V0KGpsLCAwLCBzaXplb2YoKmpsKSk7Ci0gICAgSU5JVF9MSVNUX0hFQUQoJmpsLT5qX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al93b3JraW5nX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al90YWlsX2JoX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al9iaF9saXN0KTsKLSAgICBzZW1hX2luaXQoJmpsLT5qX2NvbW1pdF9sb2NrLCAxKTsKLSAgICBTQl9KT1VSTkFMKHMpLT5qX251bV9saXN0cysrOwotICAgIGdldF9qb3VybmFsX2xpc3QoamwpOwotICAgIHJldHVybiBqbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKyAgICAgIHJldHJ5OgorCWpsID0gcmVpc2VyZnNfa21hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIEdGUF9OT0ZTLAorCQkJICAgICAgcyk7CisJaWYgKCFqbCkgeworCQl5aWVsZCgpOworCQlnb3RvIHJldHJ5OworCX0KKwltZW1zZXQoamwsIDAsIHNpemVvZigqamwpKTsKKwlJTklUX0xJU1RfSEVBRCgmamwtPmpfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX3dvcmtpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX3RhaWxfYmhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX2JoX2xpc3QpOworCXNlbWFfaW5pdCgmamwtPmpfY29tbWl0X2xvY2ssIDEpOworCVNCX0pPVVJOQUwocyktPmpfbnVtX2xpc3RzKys7CisJZ2V0X2pvdXJuYWxfbGlzdChqbCk7CisJcmV0dXJuIGpsOwogfQogCi1zdGF0aWMgdm9pZCBqb3VybmFsX2xpc3RfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICAgIFNCX0pPVVJOQUwocF9zX3NiKS0+al9jdXJyZW50X2psID0gYWxsb2Nfam91cm5hbF9saXN0KHBfc19zYik7Ci19Ci0KLXN0YXRpYyBpbnQgcmVsZWFzZV9qb3VybmFsX2Rldiggc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwKLQkJCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCApCitzdGF0aWMgdm9pZCBqb3VybmFsX2xpc3RfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKIHsKLSAgICBpbnQgcmVzdWx0OwotICAgIAotICAgIHJlc3VsdCA9IDA7Ci0KLSAgICBpZiggam91cm5hbCAtPiBqX2Rldl9maWxlICE9IE5VTEwgKSB7Ci0JcmVzdWx0ID0gZmlscF9jbG9zZSggam91cm5hbCAtPiBqX2Rldl9maWxlLCBOVUxMICk7Ci0Jam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKLQlqb3VybmFsIC0+IGpfZGV2X2JkID0gTlVMTDsKLSAgICB9IGVsc2UgaWYoIGpvdXJuYWwgLT4gal9kZXZfYmQgIT0gTlVMTCApIHsKLQlyZXN1bHQgPSBibGtkZXZfcHV0KCBqb3VybmFsIC0+IGpfZGV2X2JkICk7Ci0Jam91cm5hbCAtPiBqX2Rldl9iZCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYoIHJlc3VsdCAhPSAwICkgewotCXJlaXNlcmZzX3dhcm5pbmcoc3VwZXIsICJzaC00NTc6IHJlbGVhc2Vfam91cm5hbF9kZXY6IENhbm5vdCByZWxlYXNlIGpvdXJuYWwgZGV2aWNlOiAlaSIsIHJlc3VsdCApOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworCVNCX0pPVVJOQUwocF9zX3NiKS0+al9jdXJyZW50X2psID0gYWxsb2Nfam91cm5hbF9saXN0KHBfc19zYik7CiB9CiAKLXN0YXRpYyBpbnQgam91cm5hbF9pbml0X2Rldiggc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwgCi0JCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsLCAKLQkJCSAgICAgY29uc3QgY2hhciAqamRldl9uYW1lICkKK3N0YXRpYyBpbnQgcmVsZWFzZV9qb3VybmFsX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyLAorCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSAwOworCisJaWYgKGpvdXJuYWwtPmpfZGV2X2ZpbGUgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBmaWxwX2Nsb3NlKGpvdXJuYWwtPmpfZGV2X2ZpbGUsIE5VTEwpOworCQlqb3VybmFsLT5qX2Rldl9maWxlID0gTlVMTDsKKwkJam91cm5hbC0+al9kZXZfYmQgPSBOVUxMOworCX0gZWxzZSBpZiAoam91cm5hbC0+al9kZXZfYmQgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBibGtkZXZfcHV0KGpvdXJuYWwtPmpfZGV2X2JkKTsKKwkJam91cm5hbC0+al9kZXZfYmQgPSBOVUxMOworCX0KKworCWlmIChyZXN1bHQgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLAorCQkJCSAic2gtNDU3OiByZWxlYXNlX2pvdXJuYWxfZGV2OiBDYW5ub3QgcmVsZWFzZSBqb3VybmFsIGRldmljZTogJWkiLAorCQkJCSByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfaW5pdF9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwKKwkJCSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCwKKwkJCSAgICBjb25zdCBjaGFyICpqZGV2X25hbWUpCiB7CiAJaW50IHJlc3VsdDsKIAlkZXZfdCBqZGV2OwpAQCAtMjI4OSw1MCArMjUxOSw1MSBAQAogCiAJcmVzdWx0ID0gMDsKIAotCWpvdXJuYWwgLT4gal9kZXZfYmQgPSBOVUxMOwotCWpvdXJuYWwgLT4gal9kZXZfZmlsZSA9IE5VTEw7Ci0JamRldiA9IFNCX09ORElTS19KT1VSTkFMX0RFVklDRSggc3VwZXIgKSA/Ci0JCW5ld19kZWNvZGVfZGV2KFNCX09ORElTS19KT1VSTkFMX0RFVklDRShzdXBlcikpIDogc3VwZXItPnNfZGV2OwkKKwlqb3VybmFsLT5qX2Rldl9iZCA9IE5VTEw7CisJam91cm5hbC0+al9kZXZfZmlsZSA9IE5VTEw7CisJamRldiA9IFNCX09ORElTS19KT1VSTkFMX0RFVklDRShzdXBlcikgPworCSAgICBuZXdfZGVjb2RlX2RldihTQl9PTkRJU0tfSk9VUk5BTF9ERVZJQ0Uoc3VwZXIpKSA6IHN1cGVyLT5zX2RldjsKIAogCWlmIChiZGV2X3JlYWRfb25seShzdXBlci0+c19iZGV2KSkKLQkgICAgYmxrZGV2X21vZGUgPSBGTU9ERV9SRUFEOworCQlibGtkZXZfbW9kZSA9IEZNT0RFX1JFQUQ7CiAKIAkvKiB0aGVyZSBpcyBubyAiamRldiIgb3B0aW9uIGFuZCBqb3VybmFsIGlzIG9uIHNlcGFyYXRlIGRldmljZSAqLwotCWlmKCAoICFqZGV2X25hbWUgfHwgIWpkZXZfbmFtZVsgMCBdICkgKSB7CisJaWYgKCghamRldl9uYW1lIHx8ICFqZGV2X25hbWVbMF0pKSB7CiAJCWpvdXJuYWwtPmpfZGV2X2JkID0gb3Blbl9ieV9kZXZudW0oamRldiwgYmxrZGV2X21vZGUpOwogCQlpZiAoSVNfRVJSKGpvdXJuYWwtPmpfZGV2X2JkKSkgewogCQkJcmVzdWx0ID0gUFRSX0VSUihqb3VybmFsLT5qX2Rldl9iZCk7CiAJCQlqb3VybmFsLT5qX2Rldl9iZCA9IE5VTEw7Ci0JCQlyZWlzZXJmc193YXJuaW5nIChzdXBlciwgInNoLTQ1ODogam91cm5hbF9pbml0X2RldjogIgotCQkJCQkgICJjYW5ub3QgaW5pdCBqb3VybmFsIGRldmljZSAnJXMnOiAlaSIsCi0JCQkJCSAgX19iZGV2bmFtZShqZGV2LCBiKSwgcmVzdWx0ICk7CisJCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLCAic2gtNDU4OiBqb3VybmFsX2luaXRfZGV2OiAiCisJCQkJCSAiY2Fubm90IGluaXQgam91cm5hbCBkZXZpY2UgJyVzJzogJWkiLAorCQkJCQkgX19iZGV2bmFtZShqZGV2LCBiKSwgcmVzdWx0KTsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0gZWxzZSBpZiAoamRldiAhPSBzdXBlci0+c19kZXYpCiAJCQlzZXRfYmxvY2tzaXplKGpvdXJuYWwtPmpfZGV2X2JkLCBzdXBlci0+c19ibG9ja3NpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlqb3VybmFsIC0+IGpfZGV2X2ZpbGUgPSBmaWxwX29wZW4oIGpkZXZfbmFtZSwgMCwgMCApOwotCWlmKCAhSVNfRVJSKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgKSApIHsKKwlqb3VybmFsLT5qX2Rldl9maWxlID0gZmlscF9vcGVuKGpkZXZfbmFtZSwgMCwgMCk7CisJaWYgKCFJU19FUlIoam91cm5hbC0+al9kZXZfZmlsZSkpIHsKIAkJc3RydWN0IGlub2RlICpqZGV2X2lub2RlID0gam91cm5hbC0+al9kZXZfZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwotCQlpZiggIVNfSVNCTEsoIGpkZXZfaW5vZGUgLT4gaV9tb2RlICkgKSB7CisJCWlmICghU19JU0JMSyhqZGV2X2lub2RlLT5pX21vZGUpKSB7CiAJCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLCAiam91cm5hbF9pbml0X2RldjogJyVzJyBpcyAiCi0JCQkJCSAibm90IGEgYmxvY2sgZGV2aWNlIiwgamRldl9uYW1lICk7CisJCQkJCSAibm90IGEgYmxvY2sgZGV2aWNlIiwgamRldl9uYW1lKTsKIAkJCXJlc3VsdCA9IC1FTk9UQkxLOwotCQkJcmVsZWFzZV9qb3VybmFsX2Rldiggc3VwZXIsIGpvdXJuYWwgKTsKLQkJfSBlbHNlICB7CisJCQlyZWxlYXNlX2pvdXJuYWxfZGV2KHN1cGVyLCBqb3VybmFsKTsKKwkJfSBlbHNlIHsKIAkJCS8qIG9rICovCiAJCQlqb3VybmFsLT5qX2Rldl9iZCA9IElfQkRFVihqZGV2X2lub2RlKTsKIAkJCXNldF9ibG9ja3NpemUoam91cm5hbC0+al9kZXZfYmQsIHN1cGVyLT5zX2Jsb2Nrc2l6ZSk7Ci0JCQlyZWlzZXJmc19pbmZvKHN1cGVyLCAiam91cm5hbF9pbml0X2Rldjogam91cm5hbCBkZXZpY2U6ICVzXG4iLAorCQkJcmVpc2VyZnNfaW5mbyhzdXBlciwKKwkJCQkgICAgICAiam91cm5hbF9pbml0X2Rldjogam91cm5hbCBkZXZpY2U6ICVzXG4iLAogCQkJCSAgICAgIGJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2X2JkLCBiKSk7CiAJCX0KIAl9IGVsc2UgewotCQlyZXN1bHQgPSBQVFJfRVJSKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgKTsKLQkJam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKLQkJcmVpc2VyZnNfd2FybmluZyAoc3VwZXIsCi0JCQkJICAiam91cm5hbF9pbml0X2RldjogQ2Fubm90IG9wZW4gJyVzJzogJWkiLAotCQkJCSAgamRldl9uYW1lLCByZXN1bHQgKTsKKwkJcmVzdWx0ID0gUFRSX0VSUihqb3VybmFsLT5qX2Rldl9maWxlKTsKKwkJam91cm5hbC0+al9kZXZfZmlsZSA9IE5VTEw7CisJCXJlaXNlcmZzX3dhcm5pbmcoc3VwZXIsCisJCQkJICJqb3VybmFsX2luaXRfZGV2OiBDYW5ub3Qgb3BlbiAnJXMnOiAlaSIsCisJCQkJIGpkZXZfbmFtZSwgcmVzdWx0KTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIzNDAsMTkzICsyNTcxLDIxNCBAQAogLyoKICoqIG11c3QgYmUgY2FsbGVkIG9uY2Ugb24gZnMgbW91bnQuICBjYWxscyBqb3VybmFsX3JlYWQgZm9yIHlvdQogKi8KLWludCBqb3VybmFsX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGNvbnN0IGNoYXIgKiBqX2Rldl9uYW1lLCBpbnQgb2xkX2Zvcm1hdCwgdW5zaWduZWQgaW50IGNvbW1pdF9tYXhfYWdlKSB7Ci0gICAgaW50IG51bV9jbm9kZXMgPSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikgKiAyIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoamg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKLSAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CitpbnQgam91cm5hbF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBjb25zdCBjaGFyICpqX2Rldl9uYW1lLAorCQkgaW50IG9sZF9mb3JtYXQsIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSkKK3sKKwlpbnQgbnVtX2Nub2RlcyA9IFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAqIDI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaGpoOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnM7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLSAgICBqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpID0gdm1hbGxvYyhzaXplb2YgKHN0cnVjdCByZWlzZXJmc19qb3VybmFsKSkgOwotICAgIGlmICgham91cm5hbCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMTI1NjogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIGpvdXJuYWwgc3RydWN0dXJlIikgOwotCXJldHVybiAxIDsKLSAgICB9Ci0gICAgbWVtc2V0KGpvdXJuYWwsIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCkpIDsKLSAgICBJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIDsKLSAgICBJTklUX0xJU1RfSEVBRCAoJmpvdXJuYWwtPmpfcHJlYWxsb2NfbGlzdCk7Ci0gICAgSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfd29ya2luZ19saXN0KTsKLSAgICBJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpOwotICAgIGpvdXJuYWwtPmpfcGVyc2lzdGVudF90cmFucyA9IDA7Ci0gICAgaWYgKHJlaXNlcmZzX2FsbG9jYXRlX2xpc3RfYml0bWFwcyhwX3Nfc2IsCi0JCQkJICAgICAgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXAsCi0gCQkJCSAgICAgICBTQl9CTUFQX05SKHBfc19zYikpKQotCWdvdG8gZnJlZV9hbmRfcmV0dXJuIDsKLSAgICBhbGxvY2F0ZV9iaXRtYXBfbm9kZXMocF9zX3NiKSA7CisJam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKSA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsKSk7CisJaWYgKCFqb3VybmFsKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMjU2OiB1bmFibGUgdG8gZ2V0IG1lbW9yeSBmb3Igam91cm5hbCBzdHJ1Y3R1cmUiKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbXNldChqb3VybmFsLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwpKTsKKwlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpOworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3ByZWFsbG9jX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3dvcmtpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KTsKKwlqb3VybmFsLT5qX3BlcnNpc3RlbnRfdHJhbnMgPSAwOworCWlmIChyZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMocF9zX3NiLAorCQkJCQkgICBqb3VybmFsLT5qX2xpc3RfYml0bWFwLAorCQkJCQkgICBTQl9CTUFQX05SKHBfc19zYikpKQorCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwlhbGxvY2F0ZV9iaXRtYXBfbm9kZXMocF9zX3NiKTsKIAotICAgIC8qIHJlc2VydmVkIGZvciBqb3VybmFsIGFyZWEgc3VwcG9ydCAqLwotICAgIFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgPSAob2xkX2Zvcm1hdCA/Ci0JCQkJCSAgICAgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArCi0JCQkJCSAgICAgU0JfQk1BUF9OUihwX3Nfc2IpICsgMSA6Ci0JCQkJCSAgICAgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgLyBwX3Nfc2ItPnNfYmxvY2tzaXplICsgMik7IAotICAgIAotICAgIC8qIFNhbml0eSBjaGVjayB0byBzZWUgaXMgdGhlIHN0YW5kYXJkIGpvdXJuYWwgZml0dGluZyB3aXRoaW5nIGZpcnN0IGJpdG1hcAotICAgICAgIChhY3R1YWwgZm9yIHNtYWxsIGJsb2Nrc2l6ZXMpICovCi0gICAgaWYgKCAhU0JfT05ESVNLX0pPVVJOQUxfREVWSUNFKCBwX3Nfc2IgKSAmJgotICAgICAgICAgKFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikgPiBwX3Nfc2ItPnNfYmxvY2tzaXplICogOCkgKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xMzkzOiBqb3VybmFsIGRvZXMgbm90IGZpdCBmb3IgYXJlYSAiCi0JCQkgICJhZGRyZXNzZWQgYnkgZmlyc3Qgb2YgYml0bWFwIGJsb2Nrcy4gSXQgc3RhcnRzIGF0ICIKLQkJCSAgIiV1IGFuZCBpdHMgc2l6ZSBpcyAldS4gQmxvY2sgc2l6ZSAlbGQiLAotCQkJICBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpLAotCQkJICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYiksIHBfc19zYi0+c19ibG9ja3NpemUpOwotCWdvdG8gZnJlZV9hbmRfcmV0dXJuOwotICAgIH0KKwkvKiByZXNlcnZlZCBmb3Igam91cm5hbCBhcmVhIHN1cHBvcnQgKi8KKwlTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpID0gKG9sZF9mb3JtYXQgPworCQkJCQkJIFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUworCQkJCQkJIC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArCisJCQkJCQkgU0JfQk1BUF9OUihwX3Nfc2IpICsKKwkJCQkJCSAxIDoKKwkJCQkJCSBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAvCisJCQkJCQkgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIDIpOwogCi0gICAgaWYoIGpvdXJuYWxfaW5pdF9kZXYoIHBfc19zYiwgam91cm5hbCwgal9kZXZfbmFtZSApICE9IDAgKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJzaC00NjI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvcm5hbCBkZXZpY2UiKTsKLSAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOwotICAgIH0KKwkvKiBTYW5pdHkgY2hlY2sgdG8gc2VlIGlzIHRoZSBzdGFuZGFyZCBqb3VybmFsIGZpdHRpbmcgd2l0aGluZyBmaXJzdCBiaXRtYXAKKwkgICAoYWN0dWFsIGZvciBzbWFsbCBibG9ja3NpemVzKSAqLworCWlmICghU0JfT05ESVNLX0pPVVJOQUxfREVWSUNFKHBfc19zYikgJiYKKwkgICAgKFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgKworCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpID4gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSAqIDgpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMzkzOiBqb3VybmFsIGRvZXMgbm90IGZpdCBmb3IgYXJlYSAiCisJCQkJICJhZGRyZXNzZWQgYnkgZmlyc3Qgb2YgYml0bWFwIGJsb2Nrcy4gSXQgc3RhcnRzIGF0ICIKKwkJCQkgIiV1IGFuZCBpdHMgc2l6ZSBpcyAldS4gQmxvY2sgc2l6ZSAlbGQiLAorCQkJCSBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpLAorCQkJCSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYiksCisJCQkJIHBfc19zYi0+c19ibG9ja3NpemUpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CiAKLSAgICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLKHBfc19zYik7Ci0gICAgIAotICAgICAvKiByZWFkIGpvdXJuYWwgaGVhZGVyICovCi0gICAgIGJoamggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwKLQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOwotICAgICBpZiAoIWJoamgpIHsKLQkgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAic2gtNDU5OiB1bmFibGUgdG8gcmVhZCBqb3VybmFsIGhlYWRlciIpOwotCSBnb3RvIGZyZWVfYW5kX3JldHVybjsKLSAgICAgfQotICAgICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoYmhqaC0+Yl9kYXRhKTsKLSAgICAgCi0gICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGpvdXJuYWwgbWF0Y2hlcyB0byB0aGUgc3VwZXIgYmxvY2sgKi8KLSAgICAgaWYgKGlzX3JlaXNlcmZzX2pyKHJzKSAmJiAobGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYWdpYykgIT0gc2JfanBfam91cm5hbF9tYWdpYyhycykpKSB7Ci0JIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgInNoLTQ2MDogam91cm5hbCBoZWFkZXIgbWFnaWMgJXggIgotCQkJICAgIihkZXZpY2UgJXMpIGRvZXMgbm90IG1hdGNoIHRvIG1hZ2ljIGZvdW5kIGluIHN1cGVyICIKLQkJCSAgICJibG9jayAleCIsCi0JCQkgICBqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21hZ2ljLAotCQkJICAgYmRldm5hbWUoIGpvdXJuYWwtPmpfZGV2X2JkLCBiKSwKLQkJCSAgIHNiX2pwX2pvdXJuYWxfbWFnaWMocnMpKTsKLQkgYnJlbHNlIChiaGpoKTsKLQkgZ290byBmcmVlX2FuZF9yZXR1cm47Ci0gIH0KLSAgICAgCi0gIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICAgICAgPSBsZTMyX3RvX2NwdSAoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF90cmFuc19tYXgpOwotICBqb3VybmFsLT5qX21heF9iYXRjaCAgICAgID0gbGUzMl90b19jcHUgKGpoLT5qaF9qb3VybmFsLmpwX2pvdXJuYWxfbWF4X2JhdGNoKTsKLSAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGxlMzJfdG9fY3B1IChqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21heF9jb21taXRfYWdlKTsKLSAgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gSk9VUk5BTF9NQVhfVFJBTlNfQUdFOworCWlmIChqb3VybmFsX2luaXRfZGV2KHBfc19zYiwgam91cm5hbCwgal9kZXZfbmFtZSkgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkgInNoLTQ2MjogdW5hYmxlIHRvIGluaXRpYWxpemUgam9ybmFsIGRldmljZSIpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CiAKLSAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfbWF4KSB7Ci0gICAgLyogbWFrZSBzdXJlIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSwgYXNzaWduIGl0IGlmIHRoZXkgYXJlIG5vdCAqLwotICAgIF9fdTMyIGluaXRpYWwgPSBqb3VybmFsLT5qX3RyYW5zX21heDsKLSAgICBfX3UzMiByYXRpbyA9IDE7Ci0gICAgCi0gICAgaWYgKHBfc19zYi0+c19ibG9ja3NpemUgPCA0MDk2KQotICAgICAgcmF0aW8gPSA0MDk2IC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKLSAgICAKLSAgICBpZiAoU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpL2pvdXJuYWwtPmpfdHJhbnNfbWF4IDwgSk9VUk5BTF9NSU5fUkFUSU8pCi0gICAgICBqb3VybmFsLT5qX3RyYW5zX21heCA9IFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIEpPVVJOQUxfTUlOX1JBVElPOwotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCA+IEpPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQgLyByYXRpbykKLSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAvIHJhdGlvOwotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCA8IEpPVVJOQUxfVFJBTlNfTUlOX0RFRkFVTFQgLyByYXRpbykKLSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAvIHJhdGlvOwotICAgIAotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCAhPSBpbml0aWFsKQotICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAic2gtNDYxOiBqb3VybmFsX2luaXQ6IHdyb25nIHRyYW5zYWN0aW9uIG1heCBzaXplICgldSkuIENoYW5nZWQgdG8gJXUiLAotCSAgICAgIGluaXRpYWwsIGpvdXJuYWwtPmpfdHJhbnNfbWF4KTsKKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socF9zX3NiKTsKIAotICAgIGpvdXJuYWwtPmpfbWF4X2JhdGNoID0gam91cm5hbC0+al90cmFuc19tYXgqCi0gICAgICBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUL0pPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQ7Ci0gIH0gIAotICAKLSAgaWYgKCFqb3VybmFsLT5qX3RyYW5zX21heCkgewotICAgIC8qd2UgaGF2ZSB0aGUgZmlsZSBzeXN0ZW0gd2FzIGNyZWF0ZWQgYnkgb2xkIHZlcnNpb24gb2YgbWtyZWlzZXJmcyAKLSAgICAgIHNvIHRoaXMgZmllbGQgY29udGFpbnMgemVybyB2YWx1ZSAqLwotICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICAgICAgPSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIDsKLSAgICBqb3VybmFsLT5qX21heF9iYXRjaCAgICAgID0gSk9VUk5BTF9NQVhfQkFUQ0hfREVGQVVMVCA7Ci0gICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IEpPVVJOQUxfTUFYX0NPTU1JVF9BR0UgOwotICAgIAotICAgIC8qIGZvciBibG9ja3NpemUgPj0gNDA5NiAtIG1heCB0cmFuc2FjdGlvbiBzaXplIGlzIDEwMjQuIEZvciBibG9jayBzaXplIDwgNDA5NgotICAgICAgIHRyYW5zIG1heCBzaXplIGlzIGRlY3JlYXNlZCBwcm9wb3J0aW9uYWxseSAqLwotICAgIGlmIChwX3Nfc2ItPnNfYmxvY2tzaXplIDwgNDA5NikgewotICAgICAgam91cm5hbC0+al90cmFuc19tYXggLz0gKDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplKSA7Ci0gICAgICBqb3VybmFsLT5qX21heF9iYXRjaCA9IChqb3VybmFsLT5qX3RyYW5zX21heCkgKiA5IC8gMTAgOwotICAgIH0KLSAgfQorCS8qIHJlYWQgam91cm5hbCBoZWFkZXIgKi8KKwliaGpoID0gam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKTsKKwlpZiAoIWJoamgpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJICJzaC00NTk6IHVuYWJsZSB0byByZWFkIGpvdXJuYWwgaGVhZGVyIik7CisJCWdvdG8gZnJlZV9hbmRfcmV0dXJuOworCX0KKwlqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoYmhqaC0+Yl9kYXRhKTsKIAotICBqb3VybmFsLT5qX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2UgPSBqb3VybmFsLT5qX21heF9jb21taXRfYWdlOworCS8qIG1ha2Ugc3VyZSB0aGF0IGpvdXJuYWwgbWF0Y2hlcyB0byB0aGUgc3VwZXIgYmxvY2sgKi8KKwlpZiAoaXNfcmVpc2VyZnNfanIocnMpCisJICAgICYmIChsZTMyX3RvX2NwdShqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21hZ2ljKSAhPQorCQlzYl9qcF9qb3VybmFsX21hZ2ljKHJzKSkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJICJzaC00NjA6IGpvdXJuYWwgaGVhZGVyIG1hZ2ljICV4ICIKKwkJCQkgIihkZXZpY2UgJXMpIGRvZXMgbm90IG1hdGNoIHRvIG1hZ2ljIGZvdW5kIGluIHN1cGVyICIKKwkJCQkgImJsb2NrICV4IiwgamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYWdpYywKKwkJCQkgYmRldm5hbWUoam91cm5hbC0+al9kZXZfYmQsIGIpLAorCQkJCSBzYl9qcF9qb3VybmFsX21hZ2ljKHJzKSk7CisJCWJyZWxzZShiaGpoKTsKKwkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJfQogCi0gIGlmIChjb21taXRfbWF4X2FnZSAhPSAwKSB7Ci0gICAgICBqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gY29tbWl0X21heF9hZ2U7Ci0gICAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgfQorCWpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gbGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF90cmFuc19tYXgpOworCWpvdXJuYWwtPmpfbWF4X2JhdGNoID0gbGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYXhfYmF0Y2gpOworCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPQorCSAgICBsZTMyX3RvX2NwdShqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21heF9jb21taXRfYWdlKTsKKwlqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBKT1VSTkFMX01BWF9UUkFOU19BR0U7CiAKLSAgcmVpc2VyZnNfaW5mbyAocF9zX3NiLCAiam91cm5hbCBwYXJhbXM6IGRldmljZSAlcywgc2l6ZSAldSwgIgotCQkgImpvdXJuYWwgZmlyc3QgYmxvY2sgJXUsIG1heCB0cmFucyBsZW4gJXUsIG1heCBiYXRjaCAldSwgIgotCQkgIm1heCBjb21taXQgYWdlICV1LCBtYXggdHJhbnMgYWdlICV1XG4iLAotCQkgYmRldm5hbWUoIGpvdXJuYWwtPmpfZGV2X2JkLCBiKSwKLQkJIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSwKLQkJIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLAotCQkgam91cm5hbC0+al90cmFuc19tYXgsCi0JCSBqb3VybmFsLT5qX21heF9iYXRjaCwKLQkJIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UsCi0JCSBqb3VybmFsLT5qX21heF90cmFuc19hZ2UpOworCWlmIChqb3VybmFsLT5qX3RyYW5zX21heCkgeworCQkvKiBtYWtlIHN1cmUgdGhlc2UgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlLCBhc3NpZ24gaXQgaWYgdGhleSBhcmUgbm90ICovCisJCV9fdTMyIGluaXRpYWwgPSBqb3VybmFsLT5qX3RyYW5zX21heDsKKwkJX191MzIgcmF0aW8gPSAxOwogCi0gIGJyZWxzZSAoYmhqaCk7Ci0gICAgIAotICBqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4ID0gMCA7Ci0gIGpvdXJuYWxfbGlzdF9pbml0KHBfc19zYikgOworCQlpZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8IDQwOTYpCisJCQlyYXRpbyA9IDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplOwogCi0gIG1lbXNldChqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgMCwgSk9VUk5BTF9IQVNIX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikpIDsKKwkJaWYgKFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIGpvdXJuYWwtPmpfdHJhbnNfbWF4IDwKKwkJICAgIEpPVVJOQUxfTUlOX1JBVElPKQorCQkJam91cm5hbC0+al90cmFuc19tYXggPQorCQkJICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIEpPVVJOQUxfTUlOX1JBVElPOworCQlpZiAoam91cm5hbC0+al90cmFuc19tYXggPiBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIC8gcmF0aW8pCisJCQlqb3VybmFsLT5qX3RyYW5zX21heCA9CisJCQkgICAgSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAvIHJhdGlvOworCQlpZiAoam91cm5hbC0+al90cmFuc19tYXggPCBKT1VSTkFMX1RSQU5TX01JTl9ERUZBVUxUIC8gcmF0aW8pCisJCQlqb3VybmFsLT5qX3RyYW5zX21heCA9CisJCQkgICAgSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAvIHJhdGlvOwogCi0gIElOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnMpIDsKLSAgc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7CisJCWlmIChqb3VybmFsLT5qX3RyYW5zX21heCAhPSBpbml0aWFsKQorCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAic2gtNDYxOiBqb3VybmFsX2luaXQ6IHdyb25nIHRyYW5zYWN0aW9uIG1heCBzaXplICgldSkuIENoYW5nZWQgdG8gJXUiLAorCQkJCQkgaW5pdGlhbCwgam91cm5hbC0+al90cmFuc19tYXgpOwogCi0gIGpvdXJuYWwtPmpfc3RhcnQgPSAwIDsKLSAgam91cm5hbC0+al9sZW4gPSAwIDsKLSAgam91cm5hbC0+al9sZW5fYWxsb2MgPSAwIDsKLSAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfd2NvdW50KSwgMCkgOwotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9hc3luY190aHJvdHRsZSksIDApIDsKLSAgam91cm5hbC0+al9iY291bnQgPSAwIDsKLSAgam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gMCA7Ci0gIGpvdXJuYWwtPmpfbGFzdCA9IE5VTEwgOwotICBqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTCA7Ci0gIGluaXRfd2FpdHF1ZXVlX2hlYWQoJihqb3VybmFsLT5qX2pvaW5fd2FpdCkpIDsKLSAgc2VtYV9pbml0KCZqb3VybmFsLT5qX2xvY2ssIDEpOwotICBzZW1hX2luaXQoJmpvdXJuYWwtPmpfZmx1c2hfc2VtLCAxKTsKKwkJam91cm5hbC0+al9tYXhfYmF0Y2ggPSBqb3VybmFsLT5qX3RyYW5zX21heCAqCisJCSAgICBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUIC8gSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVDsKKwl9CiAKLSAgam91cm5hbC0+al90cmFuc19pZCA9IDEwIDsKLSAgam91cm5hbC0+al9tb3VudF9pZCA9IDEwIDsKLSAgam91cm5hbC0+al9zdGF0ZSA9IDAgOwotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDApIDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBhbGxvY2F0ZV9jbm9kZXMobnVtX2Nub2RlcykgOwotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfb3JpZyA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0IDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlID0gam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPyBudW1fY25vZGVzIDogMCA7Ci0gIGpvdXJuYWwtPmpfY25vZGVfdXNlZCA9IDAgOwotICBqb3VybmFsLT5qX211c3Rfd2FpdCA9IDAgOworCWlmICgham91cm5hbC0+al90cmFuc19tYXgpIHsKKwkJLyp3ZSBoYXZlIHRoZSBmaWxlIHN5c3RlbSB3YXMgY3JlYXRlZCBieSBvbGQgdmVyc2lvbiBvZiBta3JlaXNlcmZzIAorCQkgICBzbyB0aGlzIGZpZWxkIGNvbnRhaW5zIHplcm8gdmFsdWUgKi8KKwkJam91cm5hbC0+al90cmFuc19tYXggPSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUOworCQlqb3VybmFsLT5qX21heF9iYXRjaCA9IEpPVVJOQUxfTUFYX0JBVENIX0RFRkFVTFQ7CisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBKT1VSTkFMX01BWF9DT01NSVRfQUdFOwogCi0gIGluaXRfam91cm5hbF9oYXNoKHBfc19zYikgOwotICBqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKLSAgamwtPmpfbGlzdF9iaXRtYXAgPSBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqbCk7Ci0gIGlmICghamwtPmpfbGlzdF9iaXRtYXApIHsKLSAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMjAwNSwgZ2V0X2xpc3RfYml0bWFwIGZhaWxlZCBmb3Igam91cm5hbCBsaXN0IDAiKSA7Ci0gICAgZ290byBmcmVlX2FuZF9yZXR1cm47Ci0gIH0KLSAgaWYgKGpvdXJuYWxfcmVhZChwX3Nfc2IpIDwgMCkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiUmVwbGF5IEZhaWx1cmUsIHVuYWJsZSB0byBtb3VudCIpIDsKLSAgICBnb3RvIGZyZWVfYW5kX3JldHVybjsKLSAgfQorCQkvKiBmb3IgYmxvY2tzaXplID49IDQwOTYgLSBtYXggdHJhbnNhY3Rpb24gc2l6ZSBpcyAxMDI0LiBGb3IgYmxvY2sgc2l6ZSA8IDQwOTYKKwkJICAgdHJhbnMgbWF4IHNpemUgaXMgZGVjcmVhc2VkIHByb3BvcnRpb25hbGx5ICovCisJCWlmIChwX3Nfc2ItPnNfYmxvY2tzaXplIDwgNDA5NikgeworCQkJam91cm5hbC0+al90cmFuc19tYXggLz0gKDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplKTsKKwkJCWpvdXJuYWwtPmpfbWF4X2JhdGNoID0gKGpvdXJuYWwtPmpfdHJhbnNfbWF4KSAqIDkgLyAxMDsKKwkJfQorCX0KIAotICByZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50KysgOwotICBpZiAocmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCA8PSAxKQotICAgIGNvbW1pdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInJlaXNlcmZzIik7CisJam91cm5hbC0+al9kZWZhdWx0X21heF9jb21taXRfYWdlID0gam91cm5hbC0+al9tYXhfY29tbWl0X2FnZTsKIAotICBJTklUX1dPUksoJmpvdXJuYWwtPmpfd29yaywgZmx1c2hfYXN5bmNfY29tbWl0cywgcF9zX3NiKTsKLSAgcmV0dXJuIDAgOwotZnJlZV9hbmRfcmV0dXJuOgotICBmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7Ci0gIHJldHVybiAxOworCWlmIChjb21taXRfbWF4X2FnZSAhPSAwKSB7CisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBjb21taXRfbWF4X2FnZTsKKwkJam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gY29tbWl0X21heF9hZ2U7CisJfQorCisJcmVpc2VyZnNfaW5mbyhwX3Nfc2IsICJqb3VybmFsIHBhcmFtczogZGV2aWNlICVzLCBzaXplICV1LCAiCisJCSAgICAgICJqb3VybmFsIGZpcnN0IGJsb2NrICV1LCBtYXggdHJhbnMgbGVuICV1LCBtYXggYmF0Y2ggJXUsICIKKwkJICAgICAgIm1heCBjb21taXQgYWdlICV1LCBtYXggdHJhbnMgYWdlICV1XG4iLAorCQkgICAgICBiZGV2bmFtZShqb3VybmFsLT5qX2Rldl9iZCwgYiksCisJCSAgICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSwKKwkJICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4LAorCQkgICAgICBqb3VybmFsLT5qX21heF9iYXRjaCwKKwkJICAgICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSwgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKTsKKworCWJyZWxzZShiaGpoKTsKKworCWpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggPSAwOworCWpvdXJuYWxfbGlzdF9pbml0KHBfc19zYik7CisKKwltZW1zZXQoam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsIDAsCisJICAgICAgIEpPVVJOQUxfSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopKTsKKworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnMpOworCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisKKwlqb3VybmFsLT5qX3N0YXJ0ID0gMDsKKwlqb3VybmFsLT5qX2xlbiA9IDA7CisJam91cm5hbC0+al9sZW5fYWxsb2MgPSAwOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX3djb3VudCksIDApOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKSwgMCk7CisJam91cm5hbC0+al9iY291bnQgPSAwOworCWpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA9IDA7CisJam91cm5hbC0+al9sYXN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCYoam91cm5hbC0+al9qb2luX3dhaXQpKTsKKwlzZW1hX2luaXQoJmpvdXJuYWwtPmpfbG9jaywgMSk7CisJc2VtYV9pbml0KCZqb3VybmFsLT5qX2ZsdXNoX3NlbSwgMSk7CisKKwlqb3VybmFsLT5qX3RyYW5zX2lkID0gMTA7CisJam91cm5hbC0+al9tb3VudF9pZCA9IDEwOworCWpvdXJuYWwtPmpfc3RhdGUgPSAwOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2psb2NrKSwgMCk7CisJam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBhbGxvY2F0ZV9jbm9kZXMobnVtX2Nub2Rlcyk7CisJam91cm5hbC0+al9jbm9kZV9mcmVlX29yaWcgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdDsKKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA/IG51bV9jbm9kZXMgOiAwOworCWpvdXJuYWwtPmpfY25vZGVfdXNlZCA9IDA7CisJam91cm5hbC0+al9tdXN0X3dhaXQgPSAwOworCisJaW5pdF9qb3VybmFsX2hhc2gocF9zX3NiKTsKKwlqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKwlqbC0+al9saXN0X2JpdG1hcCA9IGdldF9saXN0X2JpdG1hcChwX3Nfc2IsIGpsKTsKKwlpZiAoIWpsLT5qX2xpc3RfYml0bWFwKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0yMDA1LCBnZXRfbGlzdF9iaXRtYXAgZmFpbGVkIGZvciBqb3VybmFsIGxpc3QgMCIpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CisJaWYgKGpvdXJuYWxfcmVhZChwX3Nfc2IpIDwgMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIlJlcGxheSBGYWlsdXJlLCB1bmFibGUgdG8gbW91bnQiKTsKKwkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJfQorCisJcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCsrOworCWlmIChyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50IDw9IDEpCisJCWNvbW1pdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInJlaXNlcmZzIik7CisKKwlJTklUX1dPUksoJmpvdXJuYWwtPmpfd29yaywgZmx1c2hfYXN5bmNfY29tbWl0cywgcF9zX3NiKTsKKwlyZXR1cm4gMDsKKyAgICAgIGZyZWVfYW5kX3JldHVybjoKKwlmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC0yNTM0LDk2ICsyNzg2LDEwMiBAQAogKiogYmUgdXNlZCBieSBkZWxldGUgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3Qgd3JpdGUgbW9yZSB0aGFuIGNhbiBmaXQgaW5zaWRlIGEgc2luZ2xlCiAqKiB0cmFuc2FjdGlvbgogKi8KLWludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIGludCBuZXdfYWxsb2MpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMICh0aC0+dF9zdXBlcik7Ci0gIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpIDsKLSAgLyogY2Fubm90IHJlc3RhcnQgd2hpbGUgbmVzdGVkICovCi0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgaWYgKHRoLT50X3JlZmNvdW50ID4gMSkKLSAgICByZXR1cm4gMCA7Ci0gIGlmICggam91cm5hbC0+al9tdXN0X3dhaXQgPiAwIHx8Ci0gICAgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmV3X2FsbG9jKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCB8fAotICAgICAgIGF0b21pY19yZWFkKCYoam91cm5hbC0+al9qbG9jaykpIHx8Ci0gICAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSB8fAotICAgICAgIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSB7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIHJldHVybiAwIDsKK2ludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJICAgaW50IG5ld19hbGxvYykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwodGgtPnRfc3VwZXIpOworCXRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpOworCS8qIGNhbm5vdCByZXN0YXJ0IHdoaWxlIG5lc3RlZCAqLworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCWlmICh0aC0+dF9yZWZjb3VudCA+IDEpCisJCXJldHVybiAwOworCWlmIChqb3VybmFsLT5qX211c3Rfd2FpdCA+IDAgfHwKKwkgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmV3X2FsbG9jKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCB8fAorCSAgICBhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfamxvY2spKSB8fAorCSAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSB8fAorCSAgICBqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPCAoam91cm5hbC0+al90cmFuc19tYXggKiAzKSkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgdHJhbnNhY3Rpb24sIGFuZCByZXF1aXJlcyB0aGUgCiAqKiBrZXJuZWxfbG9jayB0byBiZSBoZWxkCiAqLwotdm9pZCByZWlzZXJmc19ibG9ja193cml0ZXMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHRoLT50X3N1cGVyKTsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgam91cm5hbC0+al9tdXN0X3dhaXQgPSAxIDsKLSAgICBzZXRfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkgOwotICAgIHJldHVybiA7Ci19Ci0KLS8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBhIHRyYW5zYWN0aW9uIHN0YXJ0ZWQsIGFuZCBkb2VzIG5vdAotKiogcmVxdWlyZSBCS0wKLSovCi12b2lkIHJlaXNlcmZzX2FsbG93X3dyaXRlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIGNsZWFyX2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpIDsKLSAgICB3YWtlX3VwKCZqb3VybmFsLT5qX2pvaW5fd2FpdCkgOwotfQotCi0vKiB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYSB0cmFuc2FjdGlvbiBzdGFydGVkLCBhbmQgZG9lcyBub3QKLSoqIHJlcXVpcmUgQktMCi0qLwotdm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgd2FpdF9ldmVudChqb3VybmFsLT5qX2pvaW5fd2FpdCwKLSAgICAgICAgICAgICAgICF0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSA7Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXVlX2xvZ193cml0ZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7Ci0gICAgd2FpdF9xdWV1ZV90IHdhaXQ7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgICBzZXRfYml0KEpfV1JJVEVSU19RVUVVRUQsICZqb3VybmFsLT5qX3N0YXRlKTsKLQotICAgIC8qCi0gICAgICogd2UgZG9uJ3Qgd2FudCB0byB1c2Ugd2FpdF9ldmVudCBoZXJlIGJlY2F1c2UKLSAgICAgKiB3ZSBvbmx5IHdhbnQgdG8gd2FpdCBvbmNlLgotICAgICAqLwotICAgIGluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKLSAgICBhZGRfd2FpdF9xdWV1ZSgmam91cm5hbC0+al9qb2luX3dhaXQsICZ3YWl0KTsKLSAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0gICAgaWYgKHRlc3RfYml0KEpfV1JJVEVSU19RVUVVRUQsICZqb3VybmFsLT5qX3N0YXRlKSkKLSAgICAgICAgc2NoZWR1bGUoKTsKLSAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLSAgICByZW1vdmVfd2FpdF9xdWV1ZSgmam91cm5hbC0+al9qb2luX3dhaXQsICZ3YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgd2FrZV9xdWV1ZWRfd3JpdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQotICAgICAgICB3YWtlX3VwKCZqb3VybmFsLT5qX2pvaW5fd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxldF90cmFuc2FjdGlvbl9ncm93KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkKQordm9pZCByZWlzZXJmc19ibG9ja193cml0ZXMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgdW5zaWduZWQgbG9uZyBiY291bnQgPSBqb3VybmFsLT5qX2Jjb3VudDsKLSAgICB3aGlsZSgxKSB7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHRoLT50X3N1cGVyKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwlqb3VybmFsLT5qX211c3Rfd2FpdCA9IDE7CisJc2V0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOworCXJldHVybjsKK30KKworLyogdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRob3V0IGEgdHJhbnNhY3Rpb24gc3RhcnRlZCwgYW5kIGRvZXMgbm90CisqKiByZXF1aXJlIEJLTAorKi8KK3ZvaWQgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJY2xlYXJfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSk7CisJd2FrZV91cCgmam91cm5hbC0+al9qb2luX3dhaXQpOworfQorCisvKiB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYSB0cmFuc2FjdGlvbiBzdGFydGVkLCBhbmQgZG9lcyBub3QKKyoqIHJlcXVpcmUgQktMCisqLwordm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJd2FpdF9ldmVudChqb3VybmFsLT5qX2pvaW5fd2FpdCwKKwkJICAgIXRlc3RfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkpOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9sb2dfd3JpdGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJc2V0X2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSk7CisKKwkvKgorCSAqIHdlIGRvbid0IHdhbnQgdG8gdXNlIHdhaXRfZXZlbnQgaGVyZSBiZWNhdXNlCisJICogd2Ugb25seSB3YW50IHRvIHdhaXQgb25jZS4KKwkgKi8KKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoJmpvdXJuYWwtPmpfam9pbl93YWl0LCAmd2FpdCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0Jam91cm5hbC0+al9jdXJyZW50X2psLT5qX3N0YXRlIHw9IExJU1RfQ09NTUlUX1BFTkRJTkc7Ci0gICAgICAgIHdoaWxlICgoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDAgfHwKLQkgICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgJiYKLQkgICAgICAgam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgewotCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHNiKTsKKwlpZiAodGVzdF9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorCQlzY2hlZHVsZSgpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZqb3VybmFsLT5qX2pvaW5fd2FpdCwgJndhaXQpOworfQorCitzdGF0aWMgdm9pZCB3YWtlX3F1ZXVlZF93cml0ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSkpCisJCXdha2VfdXAoJmpvdXJuYWwtPmpfam9pbl93YWl0KTsKK30KKworc3RhdGljIHZvaWQgbGV0X3RyYW5zYWN0aW9uX2dyb3coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwoc2IpOworCXVuc2lnbmVkIGxvbmcgYmNvdW50ID0gam91cm5hbC0+al9iY291bnQ7CisJd2hpbGUgKDEpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQlqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfc3RhdGUgfD0gTElTVF9DT01NSVRfUEVORElORzsKKwkJd2hpbGUgKChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMCB8fAorCQkJYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSAmJgorCQkgICAgICAgam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgeworCQkJcXVldWVfbG9nX3dyaXRlcihzYik7CisJCX0KKwkJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gdHJhbnNfaWQpCisJCQlicmVhazsKKwkJaWYgKGJjb3VudCA9PSBqb3VybmFsLT5qX2Jjb3VudCkKKwkJCWJyZWFrOworCQliY291bnQgPSBqb3VybmFsLT5qX2Jjb3VudDsKIAl9Ci0JaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gdHJhbnNfaWQpCi0JICAgIGJyZWFrOwotCWlmIChiY291bnQgPT0gam91cm5hbC0+al9iY291bnQpCi0JICAgIGJyZWFrOwotCWJjb3VudCA9IGpvdXJuYWwtPmpfYmNvdW50OwotICAgIH0KIH0KIAogLyogam9pbiA9PSB0cnVlIGlmIHlvdSBtdXN0IGpvaW4gYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24uCkBAIC0yNjMyLDIyNCArMjg5MCwyNDQgQEAKICoqIHRoaXMgd2lsbCBibG9jayB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXMgam9pbmFibGUuICBzZW5kIHRoZSBudW1iZXIgb2YgYmxvY2tzIHlvdQogKiogZXhwZWN0IHRvIHVzZSBpbiBuYmxvY2tzLgogKi8KLXN0YXRpYyBpbnQgZG9fam91cm5hbF9iZWdpbl9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBqb2luKSB7Ci0gIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpIDsKLSAgaW50IG9sZF90cmFuc19pZCAgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOwotICBpbnQgc2NoZWRfY291bnQgPSAwOwotICBpbnQgcmV0dmFsOworc3RhdGljIGludCBkb19qb3VybmFsX2JlZ2luX3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzLAorCQkJICAgICAgaW50IGpvaW4pCit7CisJdGltZV90IG5vdyA9IGdldF9zZWNvbmRzKCk7CisJaW50IG9sZF90cmFuc19pZDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIG15dGg7CisJaW50IHNjaGVkX2NvdW50ID0gMDsKKwlpbnQgcmV0dmFsOwogCi0gIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiam91cm5hbF9iZWdpbiIpIDsKLSAgaWYgKG5ibG9ja3MgPiBqb3VybmFsLT5qX3RyYW5zX21heCkKLQlCVUcoKTsKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWxfYmVnaW4iKTsKKwlpZiAobmJsb2NrcyA+IGpvdXJuYWwtPmpfdHJhbnNfbWF4KQorCQlCVUcoKTsKIAotICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9iZWluZyApOwotICAvKiBzZXQgaGVyZSBmb3Igam91cm5hbF9qb2luICovCi0gIHRoLT50X3JlZmNvdW50ID0gMTsKLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2IgOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmpvdXJuYWxfYmVpbmcpOworCS8qIHNldCBoZXJlIGZvciBqb3VybmFsX2pvaW4gKi8KKwl0aC0+dF9yZWZjb3VudCA9IDE7CisJdGgtPnRfc3VwZXIgPSBwX3Nfc2I7CiAKLXJlbG9jazoKLSAgbG9ja19qb3VybmFsKHBfc19zYikgOwotICBpZiAoam9pbiAhPSBKQkVHSU5fQUJPUlQgJiYgcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkIChqb3VybmFsKSkgewotICAgIHVubG9ja19qb3VybmFsIChwX3Nfc2IpOwotICAgIHJldHZhbCA9IGpvdXJuYWwtPmpfZXJybm87Ci0gICAgZ290byBvdXRfZmFpbDsKLSAgfQotICBqb3VybmFsLT5qX2Jjb3VudCsrOwotCi0gIGlmICh0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSB7Ci0gICAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhwX3Nfc2IpIDsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd3JpdGVycyApOwotICAgIGdvdG8gcmVsb2NrIDsKLSAgfQotICBub3cgPSBnZXRfc2Vjb25kcygpOwotCi0gIC8qIGlmIHRoZXJlIGlzIG5vIHJvb20gaW4gdGhlIGpvdXJuYWwgT1IKLSAgKiogaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyB0b28gb2xkLCBhbmQgd2Ugd2VyZW4ndCBjYWxsZWQgam9pbmFibGUsIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCBiZWZvcmUgYmVnaW5uaW5nIAotICAqKiB3ZSBkb24ndCBzbGVlcCBpZiB0aGVyZSBhcmVuJ3Qgb3RoZXIgd3JpdGVycwotICAqLwotCi0gIGlmICggKCFqb2luICYmIGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgfHwKLSAgICAgKCAham9pbiAmJiAoam91cm5hbC0+al9sZW5fYWxsb2MgKyBuYmxvY2tzICsgMikgPj0gam91cm5hbC0+al9tYXhfYmF0Y2gpIHx8Ci0gICAgICgham9pbiAmJiBhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMCAmJiBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPiAwICYmCi0gICAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgfHwKLSAgICAgKCFqb2luICYmIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgfHwKLSAgICAgKCFqb2luICYmIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSkgewotCi0gICAgb2xkX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKLSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsgLyogYWxsb3cgb3RoZXJzIHRvIGZpbmlzaCB0aGlzIHRyYW5zYWN0aW9uICovCi0KLSAgICBpZiAoIWpvaW4gJiYgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmJsb2NrcyArIDIpID49Ci0gICAgICAgIGpvdXJuYWwtPmpfbWF4X2JhdGNoICYmCi0JKChqb3VybmFsLT5qX2xlbiArIG5ibG9ja3MgKyAyKSAqIDEwMCkgPCAoam91cm5hbC0+al9sZW5fYWxsb2MgKiA3NSkpCi0gICAgewotCWlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMTApIHsKLQkgICAgc2NoZWRfY291bnQrKzsKLQkgICAgcXVldWVfbG9nX3dyaXRlcihwX3Nfc2IpOwotCSAgICBnb3RvIHJlbG9jazsKKyAgICAgIHJlbG9jazoKKwlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwlpZiAoam9pbiAhPSBKQkVHSU5fQUJPUlQgJiYgcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJldHZhbCA9IGpvdXJuYWwtPmpfZXJybm87CisJCWdvdG8gb3V0X2ZhaWw7CiAJfQotICAgIH0KLSAgICAvKiBkb24ndCBtZXNzIHdpdGggam9pbmluZyB0aGUgdHJhbnNhY3Rpb24gaWYgYWxsIHdlIGhhdmUgdG8gZG8gaXMKLSAgICAgKiB3YWl0IGZvciBzb21lb25lIGVsc2UgdG8gZG8gYSBjb21taXQKLSAgICAgKi8KLSAgICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7Ci0Jd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gb2xkX3RyYW5zX2lkICYmCi0JICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgewotCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7Ci0gICAgICAgIH0KLQlnb3RvIHJlbG9jazsKLSAgICB9Ci0gICAgcmV0dmFsID0gam91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpIDsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF9mYWlsOworCWpvdXJuYWwtPmpfYmNvdW50Kys7CiAKLSAgICAvKiBzb21lb25lIG1pZ2h0IGhhdmUgZW5kZWQgdGhlIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLwotICAgIGlmIChvbGRfdHJhbnNfaWQgIT0gam91cm5hbC0+al90cmFuc19pZCkgewotICAgICAgICByZXR2YWwgPSBkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCAwKSA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dmFsID0gZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgQ09NTUlUX05PVykgOwotICAgIH0KLQotICAgIGlmIChyZXR2YWwpCi0gICAgICAgIGdvdG8gb3V0X2ZhaWw7Ci0KLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd2NvdW50ICk7Ci0gICAgZ290byByZWxvY2sgOwotICB9Ci0gIC8qIHdlIGFyZSB0aGUgZmlyc3Qgd3JpdGVyLCBzZXQgdHJhbnNfaWQgKi8KLSAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA9PSAwKSB7Ci0gICAgam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gZ2V0X3NlY29uZHMoKTsKLSAgfQotICBhdG9taWNfaW5jKCYoam91cm5hbC0+al93Y291bnQpKSA7Ci0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jICs9IG5ibG9ja3MgOwotICB0aC0+dF9ibG9ja3NfbG9nZ2VkID0gMCA7Ci0gIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgPSBuYmxvY2tzIDsKLSAgdGgtPnRfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkIDsKLSAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gIElOSVRfTElTVF9IRUFEICgmdGgtPnRfbGlzdCk7Ci0gIGdldF9mc19leGNsKCk7Ci0gIHJldHVybiAwIDsKLQotb3V0X2ZhaWw6Ci0gIG1lbXNldCAodGgsIDAsIHNpemVvZiAoKnRoKSk7Ci0gIC8qIFJlLXNldCB0aC0+dF9zdXBlciwgc28gd2UgY2FuIHByb3Blcmx5IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLSAgICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcwotICAgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2I7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKgotcmVpc2VyZnNfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBuYmxvY2tzKSB7Ci0gICAgaW50IHJldCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggOwotCi0gICAgLyogaWYgd2UncmUgbmVzdGluZyBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLiAgSXQgd2lsbCBiZQotICAgICoqIHBlcnNpc3RlbnQgb24gaXRzIG93bgotICAgICovCi0gICAgaWYgKHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcocykpIHsKLSAgICAgICAgdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOwotCXRoLT50X3JlZmNvdW50KysgOwotCWlmICh0aC0+dF9yZWZjb3VudCA8IDIpIHsKLQkgICAgQlVHKCkgOworCWlmICh0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSB7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2socF9zX3NiKTsKKwkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd3JpdGVycyk7CisJCWdvdG8gcmVsb2NrOwogCX0KLQlyZXR1cm4gdGggOwotICAgIH0KLSAgICB0aCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLCBHRlBfTk9GUywgcykgOwotICAgIGlmICghdGgpCi0gICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0ID0gam91cm5hbF9iZWdpbih0aCwgcywgbmJsb2NrcykgOwotICAgIGlmIChyZXQpIHsKLQlyZWlzZXJmc19rZnJlZSh0aCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLCBzKSA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKwlub3cgPSBnZXRfc2Vjb25kcygpOwogCi0gICAgU0JfSk9VUk5BTChzKS0+al9wZXJzaXN0ZW50X3RyYW5zKys7Ci0gICAgcmV0dXJuIHRoIDsKKwkvKiBpZiB0aGVyZSBpcyBubyByb29tIGluIHRoZSBqb3VybmFsIE9SCisJICoqIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCwgYW5kIHdlIHdlcmVuJ3QgY2FsbGVkIGpvaW5hYmxlLCB3YWl0IGZvciBpdCB0byBmaW5pc2ggYmVmb3JlIGJlZ2lubmluZyAKKwkgKiogd2UgZG9uJ3Qgc2xlZXAgaWYgdGhlcmUgYXJlbid0IG90aGVyIHdyaXRlcnMKKwkgKi8KKworCWlmICgoIWpvaW4gJiYgam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSB8fAorCSAgICAoIWpvaW4KKwkgICAgICYmIChqb3VybmFsLT5qX2xlbl9hbGxvYyArIG5ibG9ja3MgKyAyKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCkKKwkgICAgfHwgKCFqb2luICYmIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPiAwCisJCSYmIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA+IDAKKwkJJiYgKG5vdyAtIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSkgPgorCQlqb3VybmFsLT5qX21heF90cmFuc19hZ2UpIHx8ICgham9pbgorCQkJCQkgICAgICAmJiBhdG9taWNfcmVhZCgmam91cm5hbC0+al9qbG9jaykpCisJICAgIHx8ICgham9pbiAmJiBqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPCAoam91cm5hbC0+al90cmFuc19tYXggKiAzKSkpIHsKKworCQlvbGRfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOworCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOwkvKiBhbGxvdyBvdGhlcnMgdG8gZmluaXNoIHRoaXMgdHJhbnNhY3Rpb24gKi8KKworCQlpZiAoIWpvaW4gJiYgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmJsb2NrcyArIDIpID49CisJCSAgICBqb3VybmFsLT5qX21heF9iYXRjaCAmJgorCQkgICAgKChqb3VybmFsLT5qX2xlbiArIG5ibG9ja3MgKyAyKSAqIDEwMCkgPAorCQkgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICogNzUpKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDEwKSB7CisJCQkJc2NoZWRfY291bnQrKzsKKwkJCQlxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7CisJCQkJZ290byByZWxvY2s7CisJCQl9CisJCX0KKwkJLyogZG9uJ3QgbWVzcyB3aXRoIGpvaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGlmIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCisJCSAqIHdhaXQgZm9yIHNvbWVvbmUgZWxzZSB0byBkbyBhIGNvbW1pdAorCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgeworCQkJd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gb2xkX3RyYW5zX2lkICYmCisJCQkgICAgICAgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7CisJCQkJcXVldWVfbG9nX3dyaXRlcihwX3Nfc2IpOworCQkJfQorCQkJZ290byByZWxvY2s7CisJCX0KKwkJcmV0dmFsID0gam91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXRfZmFpbDsKKworCQkvKiBzb21lb25lIG1pZ2h0IGhhdmUgZW5kZWQgdGhlIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLworCQlpZiAob2xkX3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKKwkJCXJldHZhbCA9IGRvX2pvdXJuYWxfZW5kKCZteXRoLCBwX3Nfc2IsIDEsIDApOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgQ09NTUlUX05PVyk7CisJCX0KKworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXRfZmFpbDsKKworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgam91cm5hbC5qb3VybmFsX3JlbG9ja193Y291bnQpOworCQlnb3RvIHJlbG9jazsKKwl9CisJLyogd2UgYXJlIHRoZSBmaXJzdCB3cml0ZXIsIHNldCB0cmFuc19pZCAqLworCWlmIChqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPT0gMCkgeworCQlqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSBnZXRfc2Vjb25kcygpOworCX0KKwlhdG9taWNfaW5jKCYoam91cm5hbC0+al93Y291bnQpKTsKKwlqb3VybmFsLT5qX2xlbl9hbGxvYyArPSBuYmxvY2tzOworCXRoLT50X2Jsb2Nrc19sb2dnZWQgPSAwOworCXRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgPSBuYmxvY2tzOworCXRoLT50X3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKKwl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCUlOSVRfTElTVF9IRUFEKCZ0aC0+dF9saXN0KTsKKwlnZXRfZnNfZXhjbCgpOworCXJldHVybiAwOworCisgICAgICBvdXRfZmFpbDoKKwltZW1zZXQodGgsIDAsIHNpemVvZigqdGgpKTsKKwkvKiBSZS1zZXQgdGgtPnRfc3VwZXIsIHNvIHdlIGNhbiBwcm9wZXJseSBrZWVwIHRyYWNrIG9mIGhvdyBtYW55CisJICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcworCSAqIGNhbGwgaXMgcGFydCBvZiBhIGZhaWxlZCByZXN0YXJ0X3RyYW5zYWN0aW9uLCB3ZSBjYW4gZnJlZSBpdCBsYXRlciAqLworCXRoLT50X3N1cGVyID0gcF9zX3NiOworCXJldHVybiByZXR2YWw7CiB9CiAKLWludAotcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAodGgtPnRfdHJhbnNfaWQpCi0gICAgICAgIHJldCA9IGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7Ci0gICAgZWxzZQotICAgICAgICByZXQgPSAtRUlPOwotICAgIGlmICh0aC0+dF9yZWZjb3VudCA9PSAwKSB7Ci0gICAgICAgIFNCX0pPVVJOQUwocyktPmpfcGVyc2lzdGVudF90cmFucy0tOwotCXJlaXNlcmZzX2tmcmVlKHRoLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSksIHMpIDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKK3N0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0CisJCQkJCQkJCSAgICBzdXBlcl9ibG9jaworCQkJCQkJCQkgICAgKnMsCisJCQkJCQkJCSAgICBpbnQgbmJsb2NrcykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoOworCisJLyogaWYgd2UncmUgbmVzdGluZyBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLiAgSXQgd2lsbCBiZQorCSAqKiBwZXJzaXN0ZW50IG9uIGl0cyBvd24KKwkgKi8KKwlpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhzKSkgeworCQl0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwkJdGgtPnRfcmVmY291bnQrKzsKKwkJaWYgKHRoLT50X3JlZmNvdW50IDwgMikgeworCQkJQlVHKCk7CisJCX0KKwkJcmV0dXJuIHRoOworCX0KKwl0aCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLAorCQkJICAgICAgR0ZQX05PRlMsIHMpOworCWlmICghdGgpCisJCXJldHVybiBOVUxMOworCXJldCA9IGpvdXJuYWxfYmVnaW4odGgsIHMsIG5ibG9ja3MpOworCWlmIChyZXQpIHsKKwkJcmVpc2VyZnNfa2ZyZWUodGgsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlKSwKKwkJCSAgICAgICBzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJU0JfSk9VUk5BTChzKS0+al9wZXJzaXN0ZW50X3RyYW5zKys7CisJcmV0dXJuIHRoOwogfQogCi1zdGF0aWMgaW50IGpvdXJuYWxfam9pbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgewotICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87Ci0KLSAgLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KLSAgKiogcG9pbnRlcgotICAqLwotICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cl90aCA7Ci0gIGlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgewotICAgICAgQlVHKCkgOwotICB9Ci0gIHJldHVybiBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX0pPSU4pIDsKK2ludCByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlpbnQgcmV0ID0gMDsKKwlpZiAodGgtPnRfdHJhbnNfaWQpCisJCXJldCA9IGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7CisJZWxzZQorCQlyZXQgPSAtRUlPOworCWlmICh0aC0+dF9yZWZjb3VudCA9PSAwKSB7CisJCVNCX0pPVVJOQUwocyktPmpfcGVyc2lzdGVudF90cmFucy0tOworCQlyZWlzZXJmc19rZnJlZSh0aCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLAorCQkJICAgICAgIHMpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCi1pbnQgam91cm5hbF9qb2luX2Fib3J0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKSB7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKK3N0YXRpYyBpbnQgam91cm5hbF9qb2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CiAKLSAgLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KLSAgKiogcG9pbnRlcgotICAqLwotICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cl90aCA7Ci0gIGlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgewotICAgICAgQlVHKCkgOwotICB9Ci0gIHJldHVybiBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX0FCT1JUKSA7CisJLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KKwkgKiogcG9pbnRlcgorCSAqLworCXRoLT50X2hhbmRsZV9zYXZlID0gY3VyX3RoOworCWlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgeworCQlCVUcoKTsKKwl9CisJcmV0dXJuIGRvX2pvdXJuYWxfYmVnaW5fcih0aCwgcF9zX3NiLCBuYmxvY2tzLCBKQkVHSU5fSk9JTik7CiB9CiAKLWludCBqb3VybmFsX2JlZ2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOwotICAgIGludCByZXQgOworaW50IGpvdXJuYWxfam9pbl9hYm9ydChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0gY3VycmVudC0+am91cm5hbF9pbmZvOwogCi0gICAgdGgtPnRfaGFuZGxlX3NhdmUgPSBOVUxMIDsKLSAgICBpZiAoY3VyX3RoKSB7Ci0JLyogd2UgYXJlIG5lc3RpbmcgaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLwotCWlmIChjdXJfdGgtPnRfc3VwZXIgPT0gcF9zX3NiKSB7Ci0gICAgICAgICAgICAgIEJVR19PTiAoIWN1cl90aC0+dF9yZWZjb3VudCk7Ci0JICAgICAgY3VyX3RoLT50X3JlZmNvdW50KysgOwotCSAgICAgIG1lbWNweSh0aCwgY3VyX3RoLCBzaXplb2YoKnRoKSk7Ci0JICAgICAgaWYgKHRoLT50X3JlZmNvdW50IDw9IDEpCi0JCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIkJBRDogcmVmY291bnQgPD0gMSwgYnV0IGpvdXJuYWxfaW5mbyAhPSAwIik7Ci0JICAgICAgcmV0dXJuIDA7CisJLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KKwkgKiogcG9pbnRlcgorCSAqLworCXRoLT50X2hhbmRsZV9zYXZlID0gY3VyX3RoOworCWlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgeworCQlCVUcoKTsKKwl9CisJcmV0dXJuIGRvX2pvdXJuYWxfYmVnaW5fcih0aCwgcF9zX3NiLCBuYmxvY2tzLCBKQkVHSU5fQUJPUlQpOworfQorCitpbnQgam91cm5hbF9iZWdpbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwlpbnQgcmV0OworCisJdGgtPnRfaGFuZGxlX3NhdmUgPSBOVUxMOworCWlmIChjdXJfdGgpIHsKKwkJLyogd2UgYXJlIG5lc3RpbmcgaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLworCQlpZiAoY3VyX3RoLT50X3N1cGVyID09IHBfc19zYikgeworCQkJQlVHX09OKCFjdXJfdGgtPnRfcmVmY291bnQpOworCQkJY3VyX3RoLT50X3JlZmNvdW50Kys7CisJCQltZW1jcHkodGgsIGN1cl90aCwgc2l6ZW9mKCp0aCkpOworCQkJaWYgKHRoLT50X3JlZmNvdW50IDw9IDEpCisJCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCQkgIkJBRDogcmVmY291bnQgPD0gMSwgYnV0IGpvdXJuYWxfaW5mbyAhPSAwIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIHdlJ3ZlIGVuZGVkIHVwIHdpdGggYSBoYW5kbGUgZnJvbSBhIGRpZmZlcmVudCBmaWxlc3lzdGVtLgorCQkJICoqIHNhdmUgaXQgYW5kIHJlc3RvcmUgb24gam91cm5hbF9lbmQuICBUaGlzIHNob3VsZCBuZXZlcgorCQkJICoqIHJlYWxseSBoYXBwZW4uLi4KKwkJCSAqLworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiY2xtLTIxMDA6IG5lc3RpbmcgaW5mbyBhIGRpZmZlcmVudCBGUyIpOworCQkJdGgtPnRfaGFuZGxlX3NhdmUgPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJCQljdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aDsKKwkJfQogCX0gZWxzZSB7Ci0JICAgIC8qIHdlJ3ZlIGVuZGVkIHVwIHdpdGggYSBoYW5kbGUgZnJvbSBhIGRpZmZlcmVudCBmaWxlc3lzdGVtLgotCSAgICAqKiBzYXZlIGl0IGFuZCByZXN0b3JlIG9uIGpvdXJuYWxfZW5kLiAgVGhpcyBzaG91bGQgbmV2ZXIKLQkgICAgKiogcmVhbGx5IGhhcHBlbi4uLgotCSAgICAqLwotCSAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImNsbS0yMTAwOiBuZXN0aW5nIGluZm8gYSBkaWZmZXJlbnQgRlMiKSA7Ci0JICAgIHRoLT50X2hhbmRsZV9zYXZlID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKLQkgICAgY3VycmVudC0+am91cm5hbF9pbmZvID0gdGg7CisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOwogCX0KLSAgICB9IGVsc2UgewotCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOwotICAgIH0KLSAgICByZXQgPSBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX1JFRykgOwotICAgIGlmIChjdXJyZW50LT5qb3VybmFsX2luZm8gIT0gdGgpCi0gICAgICAgIEJVRygpIDsKKwlyZXQgPSBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX1JFRyk7CisJaWYgKGN1cnJlbnQtPmpvdXJuYWxfaW5mbyAhPSB0aCkKKwkJQlVHKCk7CiAKLSAgICAvKiBJIGd1ZXNzIHRoaXMgYm9pbHMgZG93biB0byBiZWluZyB0aGUgcmVjaXByb2NhbCBvZiBjbG0tMjEwMCBhYm92ZS4KLSAgICAgKiBJZiBkb19qb3VybmFsX2JlZ2luX3IgZmFpbHMsIHdlIG5lZWQgdG8gcHV0IGl0IGJhY2ssIHNpbmNlIGpvdXJuYWxfZW5kCi0gICAgICogd29uJ3QgYmUgY2FsbGVkIHRvIGRvIGl0LiAqLwotICAgIGlmIChyZXQpCi0gICAgICAgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwotICAgIGVsc2UKLSAgICAgICAgQlVHX09OICghdGgtPnRfcmVmY291bnQpOworCS8qIEkgZ3Vlc3MgdGhpcyBib2lscyBkb3duIHRvIGJlaW5nIHRoZSByZWNpcHJvY2FsIG9mIGNsbS0yMTAwIGFib3ZlLgorCSAqIElmIGRvX2pvdXJuYWxfYmVnaW5fciBmYWlscywgd2UgbmVlZCB0byBwdXQgaXQgYmFjaywgc2luY2Ugam91cm5hbF9lbmQKKwkgKiB3b24ndCBiZSBjYWxsZWQgdG8gZG8gaXQuICovCisJaWYgKHJldCkKKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmU7CisJZWxzZQorCQlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKIAotICAgIHJldHVybiByZXQgOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0yODYxLDEyOSArMzEzOSwxNDAgQEAKICoqIAogKiogaWYgal9sZW4sIGlzIGJpZ2dlciB0aGFuIGpfbGVuX2FsbG9jLCBpdCBwdXNoZXMgal9sZW5fYWxsb2MgdG8gMTAgKyBqX2xlbi4KICovCi1pbnQgam91cm5hbF9tYXJrX2RpcnR5KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiA9IE5VTEw7Ci0gIGludCBjb3VudF9hbHJlYWR5X2luY2QgPSAwIDsKLSAgaW50IHByZXBhcmVkID0gMCA7Ci0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKK2ludCBqb3VybmFsX21hcmtfZGlydHkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMOworCWludCBjb3VudF9hbHJlYWR5X2luY2QgPSAwOworCWludCBwcmVwYXJlZCA9IDA7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLm1hcmtfZGlydHkgKTsKLSAgaWYgKHRoLT50X3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKLSAgICByZWlzZXJmc19wYW5pYyh0aC0+dF9zdXBlciwgImpvdXJuYWwtMTU3NzogaGFuZGxlIHRyYW5zIGlkICVsZCAhPSBjdXJyZW50IHRyYW5zIGlkICVsZFxuIiwgCi0gICAgICAgICAgICAgICAgICAgdGgtPnRfdHJhbnNfaWQsIGpvdXJuYWwtPmpfdHJhbnNfaWQpOwotICB9CisJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eSk7CisJaWYgKHRoLT50X3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKKwkJcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsCisJCQkgICAgICAgImpvdXJuYWwtMTU3NzogaGFuZGxlIHRyYW5zIGlkICVsZCAhPSBjdXJyZW50IHRyYW5zIGlkICVsZFxuIiwKKwkJCSAgICAgICB0aC0+dF90cmFuc19pZCwgam91cm5hbC0+al90cmFuc19pZCk7CisJfQogCi0gIHBfc19zYi0+c19kaXJ0ID0gMTsKKwlwX3Nfc2ItPnNfZGlydCA9IDE7CiAKLSAgcHJlcGFyZWQgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCk7Ci0gIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKTsKLSAgLyogYWxyZWFkeSBpbiB0aGlzIHRyYW5zYWN0aW9uLCB3ZSBhcmUgZG9uZSAqLwotICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkpIHsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9hbHJlYWR5ICk7Ci0gICAgcmV0dXJuIDAgOwotICB9CisJcHJlcGFyZWQgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGJoKTsKKwljbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5KGJoKTsKKwkvKiBhbHJlYWR5IGluIHRoaXMgdHJhbnNhY3Rpb24sIHdlIGFyZSBkb25lICovCisJaWYgKGJ1ZmZlcl9qb3VybmFsZWQoYmgpKSB7CisJCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLm1hcmtfZGlydHlfYWxyZWFkeSk7CisJCXJldHVybiAwOworCX0KIAotICAvKiB0aGlzIG11c3QgYmUgdHVybmVkIGludG8gYSBwYW5pYyBpbnN0ZWFkIG9mIGEgd2FybmluZy4gIFdlIGNhbid0IGFsbG93Ci0gICoqIGEgZGlydHkgb3Igam91cm5hbF9kaXJ0eSBvciBsb2NrZWQgYnVmZmVyIHRvIGJlIGxvZ2dlZCwgYXMgc29tZSBjaGFuZ2VzCi0gICoqIGNvdWxkIGdldCB0byBkaXNrIHRvbyBlYXJseS4gIE5PVCBHT09ELgotICAqLwotICBpZiAoIXByZXBhcmVkIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTE3Nzc6IGJ1ZmZlciAlbGx1IGJhZCBzdGF0ZSAiCi0JCSAgICAgICIlY1BSRVBBUkVEICVjTE9DS0VEICVjRElSVFkgJWNKRElSVFlfV0FJVCIsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgcHJlcGFyZWQgPyAnICcgOiAnIScsCi0JCQkgICAgYnVmZmVyX2xvY2tlZChiaCkgPyAnICcgOiAnIScsCi0JCQkgICAgYnVmZmVyX2RpcnR5KGJoKSA/ICcgJyA6ICchJywKLQkJCSAgICBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkgPyAnICcgOiAnIScpIDsKLSAgfQorCS8qIHRoaXMgbXVzdCBiZSB0dXJuZWQgaW50byBhIHBhbmljIGluc3RlYWQgb2YgYSB3YXJuaW5nLiAgV2UgY2FuJ3QgYWxsb3cKKwkgKiogYSBkaXJ0eSBvciBqb3VybmFsX2RpcnR5IG9yIGxvY2tlZCBidWZmZXIgdG8gYmUgbG9nZ2VkLCBhcyBzb21lIGNoYW5nZXMKKwkgKiogY291bGQgZ2V0IHRvIGRpc2sgdG9vIGVhcmx5LiAgTk9UIEdPT0QuCisJICovCisJaWYgKCFwcmVwYXJlZCB8fCBidWZmZXJfZGlydHkoYmgpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xNzc3OiBidWZmZXIgJWxsdSBiYWQgc3RhdGUgIgorCQkJCSAiJWNQUkVQQVJFRCAlY0xPQ0tFRCAlY0RJUlRZICVjSkRJUlRZX1dBSVQiLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkJIHByZXBhcmVkID8gJyAnIDogJyEnLAorCQkJCSBidWZmZXJfbG9ja2VkKGJoKSA/ICcgJyA6ICchJywKKwkJCQkgYnVmZmVyX2RpcnR5KGJoKSA/ICcgJyA6ICchJywKKwkJCQkgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpID8gJyAnIDogJyEnKTsKKwl9CiAKLSAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSA8PSAwKSB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xNDA5OiBqb3VybmFsX21hcmtfZGlydHkgcmV0dXJuaW5nIGJlY2F1c2Ugal93Y291bnQgd2FzICVkIiwgYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIC8qIHRoaXMgZXJyb3IgbWVhbnMgSSd2ZSBzY3Jld2VkIHVwLCBhbmQgd2UndmUgb3ZlcmZsb3dlZCB0aGUgdHJhbnNhY3Rpb24uICAKLSAgKiogTm90aGluZyBjYW4gYmUgZG9uZSBoZXJlLCBleGNlcHQgbWFrZSB0aGUgRlMgcmVhZG9ubHkgb3IgcGFuaWMuCi0gICovIAotICBpZiAoam91cm5hbC0+al9sZW4gPj0gam91cm5hbC0+al90cmFuc19tYXgpIHsKLSAgICByZWlzZXJmc19wYW5pYyh0aC0+dF9zdXBlciwgImpvdXJuYWwtMTQxMzogam91cm5hbF9tYXJrX2RpcnR5OiBqX2xlbiAoJWx1KSBpcyB0b28gYmlnXG4iLCBqb3VybmFsLT5qX2xlbikgOwotICB9CisJaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSA8PSAwKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xNDA5OiBqb3VybmFsX21hcmtfZGlydHkgcmV0dXJuaW5nIGJlY2F1c2Ugal93Y291bnQgd2FzICVkIiwKKwkJCQkgYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIHRoaXMgZXJyb3IgbWVhbnMgSSd2ZSBzY3Jld2VkIHVwLCBhbmQgd2UndmUgb3ZlcmZsb3dlZCB0aGUgdHJhbnNhY3Rpb24uICAKKwkgKiogTm90aGluZyBjYW4gYmUgZG9uZSBoZXJlLCBleGNlcHQgbWFrZSB0aGUgRlMgcmVhZG9ubHkgb3IgcGFuaWMuCisJICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID49IGpvdXJuYWwtPmpfdHJhbnNfbWF4KSB7CisJCXJlaXNlcmZzX3BhbmljKHRoLT50X3N1cGVyLAorCQkJICAgICAgICJqb3VybmFsLTE0MTM6IGpvdXJuYWxfbWFya19kaXJ0eTogal9sZW4gKCVsdSkgaXMgdG9vIGJpZ1xuIiwKKwkJCSAgICAgICBqb3VybmFsLT5qX2xlbik7CisJfQogCi0gIGlmIChidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKLSAgICBjb3VudF9hbHJlYWR5X2luY2QgPSAxIDsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9ub3Rqb3VybmFsICk7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkgKGJoKTsKLSAgfQorCWlmIChidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJY291bnRfYWxyZWFkeV9pbmNkID0gMTsKKwkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9ub3Rqb3VybmFsKTsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpOworCX0KIAotICBpZiAoam91cm5hbC0+al9sZW4gPiBqb3VybmFsLT5qX2xlbl9hbGxvYykgewotICAgIGpvdXJuYWwtPmpfbGVuX2FsbG9jID0gam91cm5hbC0+al9sZW4gKyBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCA7Ci0gIH0KKwlpZiAoam91cm5hbC0+al9sZW4gPiBqb3VybmFsLT5qX2xlbl9hbGxvYykgeworCQlqb3VybmFsLT5qX2xlbl9hbGxvYyA9IGpvdXJuYWwtPmpfbGVuICsgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQ7CisJfQogCi0gIHNldF9idWZmZXJfam91cm5hbGVkIChiaCk7CisJc2V0X2J1ZmZlcl9qb3VybmFsZWQoYmgpOwogCi0gIC8qIG5vdyBwdXQgdGhpcyBndXkgb24gdGhlIGVuZCAqLwotICBpZiAoIWNuKSB7Ci0gICAgY24gPSBnZXRfY25vZGUocF9zX3NiKSA7Ci0gICAgaWYgKCFjbikgewotICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiZ2V0X2Nub2RlIGZhaWxlZCFcbiIpOyAKLSAgICB9CisJLyogbm93IHB1dCB0aGlzIGd1eSBvbiB0aGUgZW5kICovCisJaWYgKCFjbikgeworCQljbiA9IGdldF9jbm9kZShwX3Nfc2IpOworCQlpZiAoIWNuKSB7CisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJnZXRfY25vZGUgZmFpbGVkIVxuIik7CisJCX0KIAotICAgIGlmICh0aC0+dF9ibG9ja3NfbG9nZ2VkID09IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpIHsKLSAgICAgIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOwotICAgICAgam91cm5hbC0+al9sZW5fYWxsb2MgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOwotICAgIH0KLSAgICB0aC0+dF9ibG9ja3NfbG9nZ2VkKysgOwotICAgIGpvdXJuYWwtPmpfbGVuKysgOworCQlpZiAodGgtPnRfYmxvY2tzX2xvZ2dlZCA9PSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSB7CisJCQl0aC0+dF9ibG9ja3NfYWxsb2NhdGVkICs9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UOworCQkJam91cm5hbC0+al9sZW5fYWxsb2MgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQ7CisJCX0KKwkJdGgtPnRfYmxvY2tzX2xvZ2dlZCsrOworCQlqb3VybmFsLT5qX2xlbisrOwogCi0gICAgY24tPmJoID0gYmggOwotICAgIGNuLT5ibG9ja25yID0gYmgtPmJfYmxvY2tuciA7Ci0gICAgY24tPnNiID0gcF9zX3NiOwotICAgIGNuLT5qbGlzdCA9IE5VTEwgOwotICAgIGluc2VydF9qb3VybmFsX2hhc2goam91cm5hbC0+al9oYXNoX3RhYmxlLCBjbikgOwotICAgIGlmICghY291bnRfYWxyZWFkeV9pbmNkKSB7Ci0gICAgICBnZXRfYmgoYmgpIDsKLSAgICB9Ci0gIH0KLSAgY24tPm5leHQgPSBOVUxMIDsKLSAgY24tPnByZXYgPSBqb3VybmFsLT5qX2xhc3QgOwotICBjbi0+YmggPSBiaCA7Ci0gIGlmIChqb3VybmFsLT5qX2xhc3QpIHsKLSAgICBqb3VybmFsLT5qX2xhc3QtPm5leHQgPSBjbiA7Ci0gICAgam91cm5hbC0+al9sYXN0ID0gY24gOwotICB9IGVsc2UgewotICAgIGpvdXJuYWwtPmpfZmlyc3QgPSBjbiA7Ci0gICAgam91cm5hbC0+al9sYXN0ID0gY24gOwotICB9Ci0gIHJldHVybiAwIDsKKwkJY24tPmJoID0gYmg7CisJCWNuLT5ibG9ja25yID0gYmgtPmJfYmxvY2tucjsKKwkJY24tPnNiID0gcF9zX3NiOworCQljbi0+amxpc3QgPSBOVUxMOworCQlpbnNlcnRfam91cm5hbF9oYXNoKGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgY24pOworCQlpZiAoIWNvdW50X2FscmVhZHlfaW5jZCkgeworCQkJZ2V0X2JoKGJoKTsKKwkJfQorCX0KKwljbi0+bmV4dCA9IE5VTEw7CisJY24tPnByZXYgPSBqb3VybmFsLT5qX2xhc3Q7CisJY24tPmJoID0gYmg7CisJaWYgKGpvdXJuYWwtPmpfbGFzdCkgeworCQlqb3VybmFsLT5qX2xhc3QtPm5leHQgPSBjbjsKKwkJam91cm5hbC0+al9sYXN0ID0gY247CisJfSBlbHNlIHsKKwkJam91cm5hbC0+al9maXJzdCA9IGNuOworCQlqb3VybmFsLT5qX2xhc3QgPSBjbjsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLWludCBqb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgewotICBpZiAoIWN1cnJlbnQtPmpvdXJuYWxfaW5mbyAmJiB0aC0+dF9yZWZjb3VudCA+IDEpCi0gICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiUkVJU0VSLU5FU1RJTkc6IHRoIE5VTEwsIHJlZmNvdW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICB0aC0+dF9yZWZjb3VudCk7CitpbnQgam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpCit7CisJaWYgKCFjdXJyZW50LT5qb3VybmFsX2luZm8gJiYgdGgtPnRfcmVmY291bnQgPiAxKQorCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIlJFSVNFUi1ORVNUSU5HOiB0aCBOVUxMLCByZWZjb3VudCAlZCIsCisJCQkJIHRoLT50X3JlZmNvdW50KTsKIAotICBpZiAoIXRoLT50X3RyYW5zX2lkKSB7Ci0gICAgV0FSTl9PTiAoMSk7Ci0gICAgcmV0dXJuIC1FSU87Ci0gIH0KKwlpZiAoIXRoLT50X3RyYW5zX2lkKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAtRUlPOworCX0KIAotICB0aC0+dF9yZWZjb3VudC0tOwotICBpZiAodGgtPnRfcmVmY291bnQgPiAwKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKKwl0aC0+dF9yZWZjb3VudC0tOworCWlmICh0aC0+dF9yZWZjb3VudCA+IDApIHsKKwkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0KKwkJICAgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKIAotICAgIC8qIHdlIGFyZW4ndCBhbGxvd2VkIHRvIGNsb3NlIGEgbmVzdGVkIHRyYW5zYWN0aW9uIG9uIGEgZGlmZmVyZW50Ci0gICAgKiogZmlsZXN5c3RlbSBmcm9tIHRoZSBvbmUgaW4gdGhlIHRhc2sgc3RydWN0Ci0gICAgKi8KLSAgICBpZiAoY3VyX3RoLT50X3N1cGVyICE9IHRoLT50X3N1cGVyKQotICAgICAgQlVHKCkgOworCQkvKiB3ZSBhcmVuJ3QgYWxsb3dlZCB0byBjbG9zZSBhIG5lc3RlZCB0cmFuc2FjdGlvbiBvbiBhIGRpZmZlcmVudAorCQkgKiogZmlsZXN5c3RlbSBmcm9tIHRoZSBvbmUgaW4gdGhlIHRhc2sgc3RydWN0CisJCSAqLworCQlpZiAoY3VyX3RoLT50X3N1cGVyICE9IHRoLT50X3N1cGVyKQorCQkJQlVHKCk7CiAKLSAgICBpZiAodGggIT0gY3VyX3RoKSB7Ci0gICAgICBtZW1jcHkoY3VycmVudC0+am91cm5hbF9pbmZvLCB0aCwgc2l6ZW9mKCp0aCkpOwotICAgICAgdGgtPnRfdHJhbnNfaWQgPSAwOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgMCkgOwotICB9CisJCWlmICh0aCAhPSBjdXJfdGgpIHsKKwkJCW1lbWNweShjdXJyZW50LT5qb3VybmFsX2luZm8sIHRoLCBzaXplb2YoKnRoKSk7CisJCQl0aC0+dF90cmFuc19pZCA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIDApOworCX0KIH0KIAogLyogcmVtb3ZlcyBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCByZWxzaW5nIGFuZCBkZXNjcmVtZW50aW5nIGFueSBjb3VudGVycy4gIApAQCAtMjk5Myw0NyArMzI4Miw1MSBAQAogKioKICoqIHJldHVybnMgMSBpZiBpdCBjbGVhbmVkIGFuZCByZWxzZWQgdGhlIGJ1ZmZlci4gMCBvdGhlcndpc2UKICovCi1zdGF0aWMgaW50IHJlbW92ZV9mcm9tX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBiX2Jsb2NrbnJfdCBibG9ja25yLCBpbnQgYWxyZWFkeV9jbGVhbmVkKSB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIGludCByZXQgPSAwOworc3RhdGljIGludCByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkgICBiX2Jsb2NrbnJfdCBibG9ja25yLCBpbnQgYWxyZWFkeV9jbGVhbmVkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCWludCByZXQgPSAwOwogCi0gIGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2hhc2hfdGFibGUsIGJsb2NrbnIpIDsKLSAgaWYgKCFjbiB8fCAhY24tPmJoKSB7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0KLSAgYmggPSBjbi0+YmggOwotICBpZiAoY24tPnByZXYpIHsKLSAgICBjbi0+cHJldi0+bmV4dCA9IGNuLT5uZXh0IDsKLSAgfQotICBpZiAoY24tPm5leHQpIHsKLSAgICBjbi0+bmV4dC0+cHJldiA9IGNuLT5wcmV2IDsKLSAgfQotICBpZiAoY24gPT0gam91cm5hbC0+al9maXJzdCkgewotICAgIGpvdXJuYWwtPmpfZmlyc3QgPSBjbi0+bmV4dCA7Ci0gIH0KLSAgaWYgKGNuID09IGpvdXJuYWwtPmpfbGFzdCkgewotICAgIGpvdXJuYWwtPmpfbGFzdCA9IGNuLT5wcmV2IDsKLSAgfQotICBpZiAoYmgpCi0JcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgTlVMTCwgYmgtPmJfYmxvY2tuciwgMCkgOwotICBjbGVhcl9idWZmZXJfam91cm5hbGVkICAoYmgpOyAvKiBkb24ndCBsb2cgdGhpcyBvbmUgKi8KKwljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKKwlpZiAoIWNuIHx8ICFjbi0+YmgpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJYmggPSBjbi0+Ymg7CisJaWYgKGNuLT5wcmV2KSB7CisJCWNuLT5wcmV2LT5uZXh0ID0gY24tPm5leHQ7CisJfQorCWlmIChjbi0+bmV4dCkgeworCQljbi0+bmV4dC0+cHJldiA9IGNuLT5wcmV2OworCX0KKwlpZiAoY24gPT0gam91cm5hbC0+al9maXJzdCkgeworCQlqb3VybmFsLT5qX2ZpcnN0ID0gY24tPm5leHQ7CisJfQorCWlmIChjbiA9PSBqb3VybmFsLT5qX2xhc3QpIHsKKwkJam91cm5hbC0+al9sYXN0ID0gY24tPnByZXY7CisJfQorCWlmIChiaCkKKwkJcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgTlVMTCwKKwkJCQkgICAgYmgtPmJfYmxvY2tuciwgMCk7CisJY2xlYXJfYnVmZmVyX2pvdXJuYWxlZChiaCk7CS8qIGRvbid0IGxvZyB0aGlzIG9uZSAqLwogCi0gIGlmICghYWxyZWFkeV9jbGVhbmVkKSB7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkgKGJoKTsKLSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOwotICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGJoKTsKLSAgICBwdXRfYmgoYmgpIDsKLSAgICBpZiAoYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpIDwgMCkgewotICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xNzUyOiByZW1vdmUgZnJvbSB0cmFucywgYl9jb3VudCA8IDAiKTsKLSAgICB9Ci0gICAgcmV0ID0gMSA7Ci0gIH0KLSAgam91cm5hbC0+al9sZW4tLSA7Ci0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jLS0gOwotICBmcmVlX2Nub2RlKHBfc19zYiwgY24pIDsKLSAgcmV0dXJuIHJldCA7CisJaWYgKCFhbHJlYWR5X2NsZWFuZWQpIHsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpOworCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQljbGVhcl9idWZmZXJfam91cm5hbF90ZXN0KGJoKTsKKwkJcHV0X2JoKGJoKTsKKwkJaWYgKGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSA8IDApIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgImpvdXJuYWwtMTc1MjogcmVtb3ZlIGZyb20gdHJhbnMsIGJfY291bnQgPCAwIik7CisJCX0KKwkJcmV0ID0gMTsKKwl9CisJam91cm5hbC0+al9sZW4tLTsKKwlqb3VybmFsLT5qX2xlbl9hbGxvYy0tOworCWZyZWVfY25vZGUocF9zX3NiLCBjbik7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTMwNDYsMTIwICszMzM5LDEyOSBAQAogKiogYmxvY2tzIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uIG9uIGRpc2sKICoqCiAqLwotc3RhdGljIGludCBjYW5fZGlydHkoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7Ci0gIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBjbi0+c2I7Ci0gIGJfYmxvY2tucl90IGJsb2NrbnIgPSBjbi0+YmxvY2tuciAgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY3VyID0gY24tPmhwcmV2IDsKLSAgaW50IGNhbl9kaXJ0eSA9IDEgOwotICAKLSAgLyogZmlyc3QgdGVzdCBocHJldi4gIFRoZXNlIGFyZSBhbGwgbmV3ZXIgdGhhbiBjbiwgc28gYW55IG5vZGUgaGVyZQotICAqKiB3aXRoIHRoZSBzYW1lIGJsb2NrIG51bWJlciBhbmQgZGV2IG1lYW5zIHRoaXMgbm9kZSBjYW4ndCBiZSBzZW50Ci0gICoqIHRvIGRpc2sgcmlnaHQgbm93LgotICAqLwotICB3aGlsZShjdXIgJiYgY2FuX2RpcnR5KSB7Ci0gICAgaWYgKGN1ci0+amxpc3QgJiYgY3VyLT5iaCAmJiBjdXItPmJsb2NrbnIgJiYgY3VyLT5zYiA9PSBzYiAmJiAKLSAgICAgICAgY3VyLT5ibG9ja25yID09IGJsb2NrbnIpIHsKLSAgICAgIGNhbl9kaXJ0eSA9IDAgOwotICAgIH0KLSAgICBjdXIgPSBjdXItPmhwcmV2IDsKLSAgfQotICAvKiB0aGVuIHRlc3QgaG5leHQuICBUaGVzZSBhcmUgYWxsIG9sZGVyIHRoYW4gY24uICBBcyBsb25nIGFzIHRoZXkKLSAgKiogYXJlIGNvbW1pdHRlZCB0byB0aGUgbG9nLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGNuIHRvIGRpc2sKLSAgKi8KLSAgY3VyID0gY24tPmhuZXh0IDsKLSAgd2hpbGUoY3VyICYmIGNhbl9kaXJ0eSkgewotICAgIGlmIChjdXItPmpsaXN0ICYmIGN1ci0+amxpc3QtPmpfbGVuID4gMCAmJiAKLSAgICAgICAgYXRvbWljX3JlYWQoJihjdXItPmpsaXN0LT5qX2NvbW1pdF9sZWZ0KSkgPiAwICYmIGN1ci0+YmggJiYgCi0gICAgICAgIGN1ci0+YmxvY2tuciAmJiBjdXItPnNiID09IHNiICYmIGN1ci0+YmxvY2tuciA9PSBibG9ja25yKSB7Ci0gICAgICBjYW5fZGlydHkgPSAwIDsKLSAgICB9Ci0gICAgY3VyID0gY3VyLT5obmV4dCA7Ci0gIH0KLSAgcmV0dXJuIGNhbl9kaXJ0eSA7CitzdGF0aWMgaW50IGNhbl9kaXJ0eShzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGNuLT5zYjsKKwliX2Jsb2NrbnJfdCBibG9ja25yID0gY24tPmJsb2NrbnI7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1ciA9IGNuLT5ocHJldjsKKwlpbnQgY2FuX2RpcnR5ID0gMTsKKworCS8qIGZpcnN0IHRlc3QgaHByZXYuICBUaGVzZSBhcmUgYWxsIG5ld2VyIHRoYW4gY24sIHNvIGFueSBub2RlIGhlcmUKKwkgKiogd2l0aCB0aGUgc2FtZSBibG9jayBudW1iZXIgYW5kIGRldiBtZWFucyB0aGlzIG5vZGUgY2FuJ3QgYmUgc2VudAorCSAqKiB0byBkaXNrIHJpZ2h0IG5vdy4KKwkgKi8KKwl3aGlsZSAoY3VyICYmIGNhbl9kaXJ0eSkgeworCQlpZiAoY3VyLT5qbGlzdCAmJiBjdXItPmJoICYmIGN1ci0+YmxvY2tuciAmJiBjdXItPnNiID09IHNiICYmCisJCSAgICBjdXItPmJsb2NrbnIgPT0gYmxvY2tucikgeworCQkJY2FuX2RpcnR5ID0gMDsKKwkJfQorCQljdXIgPSBjdXItPmhwcmV2OworCX0KKwkvKiB0aGVuIHRlc3QgaG5leHQuICBUaGVzZSBhcmUgYWxsIG9sZGVyIHRoYW4gY24uICBBcyBsb25nIGFzIHRoZXkKKwkgKiogYXJlIGNvbW1pdHRlZCB0byB0aGUgbG9nLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGNuIHRvIGRpc2sKKwkgKi8KKwljdXIgPSBjbi0+aG5leHQ7CisJd2hpbGUgKGN1ciAmJiBjYW5fZGlydHkpIHsKKwkJaWYgKGN1ci0+amxpc3QgJiYgY3VyLT5qbGlzdC0+al9sZW4gPiAwICYmCisJCSAgICBhdG9taWNfcmVhZCgmKGN1ci0+amxpc3QtPmpfY29tbWl0X2xlZnQpKSA+IDAgJiYgY3VyLT5iaCAmJgorCQkgICAgY3VyLT5ibG9ja25yICYmIGN1ci0+c2IgPT0gc2IgJiYgY3VyLT5ibG9ja25yID09IGJsb2NrbnIpIHsKKwkJCWNhbl9kaXJ0eSA9IDA7CisJCX0KKwkJY3VyID0gY3VyLT5obmV4dDsKKwl9CisJcmV0dXJuIGNhbl9kaXJ0eTsKIH0KIAogLyogc3luY3MgdGhlIGNvbW1pdCBibG9ja3MsIGJ1dCBkb2VzIG5vdCBmb3JjZSB0aGUgcmVhbCBidWZmZXJzIHRvIGRpc2sKICoqIHdpbGwgd2FpdCB1bnRpbCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBkb25lL2NvbW1pdGVkIGJlZm9yZSByZXR1cm5pbmcgCiAqLwotaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gIC8qIHlvdSBjYW4gc3luYyB3aGlsZSBuZXN0ZWQsIHZlcnksIHZlcnkgYmFkICovCi0gIGlmICh0aC0+dF9yZWZjb3VudCA+IDEpIHsKLSAgICBCVUcoKSA7Ci0gIH0KLSAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpKSA7Ci0gIH0KLSAgcmV0dXJuIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIENPTU1JVF9OT1cgfCBXQUlUKSA7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJLyogeW91IGNhbiBzeW5jIHdoaWxlIG5lc3RlZCwgdmVyeSwgdmVyeSBiYWQgKi8KKwlpZiAodGgtPnRfcmVmY291bnQgPiAxKSB7CisJCUJVRygpOworCX0KKwlpZiAoam91cm5hbC0+al9sZW4gPT0gMCkgeworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwKKwkJCQkJICAgICAxKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpOworCX0KKwlyZXR1cm4gZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgQ09NTUlUX05PVyB8IFdBSVQpOwogfQogCiAvKgogKiogd3JpdGViYWNrIHRoZSBwZW5kaW5nIGFzeW5jIGNvbW1pdHMgdG8gZGlzawogKi8KLXN0YXRpYyB2b2lkIGZsdXNoX2FzeW5jX2NvbW1pdHModm9pZCAqcCkgewotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5Oworc3RhdGljIHZvaWQgZmx1c2hfYXN5bmNfY29tbWl0cyh2b2lkICpwKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKIAotICBsb2NrX2tlcm5lbCgpOwotICBpZiAoIWxpc3RfZW1wdHkoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSkgewotICAgICAgLyogbGFzdCBlbnRyeSBpcyB0aGUgeW91bmdlc3QsIGNvbW1pdCBpdCBhbmQgeW91IGdldCBldmVyeXRoaW5nICovCi0gICAgICBlbnRyeSA9IGpvdXJuYWwtPmpfam91cm5hbF9saXN0LnByZXY7Ci0gICAgICBqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7Ci0gICAgICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpsLCAxKTsKLSAgfQotICB1bmxvY2tfa2VybmVsKCk7Ci0gIC8qCi0gICAqIHRoaXMgaXMgYSBsaXR0bGUgcmFjZXksIGJ1dCB0aGVyZSdzIG5vIGhhcm0gaW4gbWlzc2luZwotICAgKiB0aGUgZmlsZW1hcF9mZGF0YV93cml0ZQotICAgKi8KLSAgaWYgKCFhdG9taWNfcmVhZCgmam91cm5hbC0+al9hc3luY190aHJvdHRsZSkgJiYgIXJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpIHsKLSAgICAgIGF0b21pY19pbmMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICAgICAgZmlsZW1hcF9mZGF0YXdyaXRlKHBfc19zYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKLSAgICAgIGF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICB9CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSkgeworCQkvKiBsYXN0IGVudHJ5IGlzIHRoZSB5b3VuZ2VzdCwgY29tbWl0IGl0IGFuZCB5b3UgZ2V0IGV2ZXJ5dGhpbmcgKi8KKwkJZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5wcmV2OworCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCWZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJLyoKKwkgKiB0aGlzIGlzIGEgbGl0dGxlIHJhY2V5LCBidXQgdGhlcmUncyBubyBoYXJtIGluIG1pc3NpbmcKKwkgKiB0aGUgZmlsZW1hcF9mZGF0YV93cml0ZQorCSAqLworCWlmICghYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpCisJICAgICYmICFyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJYXRvbWljX2luYygmam91cm5hbC0+al9hc3luY190aHJvdHRsZSk7CisJCWZpbGVtYXBfZmRhdGF3cml0ZShwX3Nfc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCWF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworCX0KIH0KIAogLyoKICoqIGZsdXNoZXMgYW55IG9sZCB0cmFuc2FjdGlvbnMgdG8gZGlzawogKiogZW5kcyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpZiBpdCBpcyB0b28gb2xkCiAqLwotaW50IHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gICAgdGltZV90IG5vdyA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworaW50IHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXRpbWVfdCBub3c7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICAgIG5vdyA9IGdldF9zZWNvbmRzKCk7Ci0gICAgLyogc2FmZXR5IGNoZWNrIHNvIHdlIGRvbid0IGZsdXNoIHdoaWxlIHdlIGFyZSByZXBsYXlpbmcgdGhlIGxvZyBkdXJpbmcKLSAgICAgKiBtb3VudAotICAgICAqLwotICAgIGlmIChsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKLQlyZXR1cm4gMCAgOwotICAgIH0KKwlub3cgPSBnZXRfc2Vjb25kcygpOworCS8qIHNhZmV0eSBjaGVjayBzbyB3ZSBkb24ndCBmbHVzaCB3aGlsZSB3ZSBhcmUgcmVwbGF5aW5nIHRoZSBsb2cgZHVyaW5nCisJICogbW91bnQKKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpKSB7CisJCXJldHVybiAwOworCX0KIAotICAgIC8qIGNoZWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgSWYgdGhlcmUgYXJlIG5vIHdyaXRlcnMsIGFuZCBpdCBpcwotICAgICAqIHRvbyBvbGQsIGZpbmlzaCBpdCwgYW5kIGZvcmNlIHRoZSBjb21taXQgYmxvY2tzIHRvIGRpc2sKLSAgICAgKi8KLSAgICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA8PSAwICYmCi0gICAgICAgIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA+IDAgJiYKLSAgICAgICAgam91cm5hbC0+al9sZW4gPiAwICYmCi0gICAgICAgIChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKQotICAgIHsKLQlpZiAoIWpvdXJuYWxfam9pbigmdGgsIHBfc19zYiwgMSkpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLCAxKSA7Ci0gICAgICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKKwkvKiBjaGVjayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIElmIHRoZXJlIGFyZSBubyB3cml0ZXJzLCBhbmQgaXQgaXMKKwkgKiB0b28gb2xkLCBmaW5pc2ggaXQsIGFuZCBmb3JjZSB0aGUgY29tbWl0IGJsb2NrcyB0byBkaXNrCisJICovCisJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPD0gMCAmJgorCSAgICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPiAwICYmCisJICAgIGpvdXJuYWwtPmpfbGVuID4gMCAmJgorCSAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgeworCQlpZiAoIWpvdXJuYWxfam9pbigmdGgsIHBfc19zYiwgMSkpIHsKKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLAorCQkJCQkJICAgICBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLAorCQkJCQkJICAgICAxKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHBfc19zYiwKKwkJCQkJICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CiAKLSAgICAgICAgICAgIC8qIHdlJ3JlIG9ubHkgYmVpbmcgY2FsbGVkIGZyb20ga3JlaXNlcmZzZCwgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gZG8KLSAgICAgICAgICAgICoqIGFuIGFzeW5jIGNvbW1pdCBzbyB0aGF0IGtyZWlzZXJmc2QgY2FuIGRvIGl0IGxhdGVyCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgZG9fam91cm5hbF9lbmQoJnRoLCBwX3Nfc2IsMSwgQ09NTUlUX05PVyB8IFdBSVQpIDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcF9zX3NiLT5zX2RpcnQ7CisJCQkvKiB3ZSdyZSBvbmx5IGJlaW5nIGNhbGxlZCBmcm9tIGtyZWlzZXJmc2QsIGl0IG1ha2VzIG5vIHNlbnNlIHRvIGRvCisJCQkgKiogYW4gYXN5bmMgY29tbWl0IHNvIHRoYXQga3JlaXNlcmZzZCBjYW4gZG8gaXQgbGF0ZXIKKwkJCSAqLworCQkJZG9fam91cm5hbF9lbmQoJnRoLCBwX3Nfc2IsIDEsIENPTU1JVF9OT1cgfCBXQUlUKTsKKwkJfQorCX0KKwlyZXR1cm4gcF9zX3NiLT5zX2RpcnQ7CiB9CiAKIC8qCkBAIC0zMTczLDEwMSArMzQ3NSwxMDggQEAKICoqIAogKiogTm90ZSwgd2UgY2FuJ3QgYWxsb3cgdGhlIGpvdXJuYWxfZW5kIHRvIHByb2NlZWQgd2hpbGUgdGhlcmUgYXJlIHN0aWxsIHdyaXRlcnMgaW4gdGhlIGxvZy4KICovCi1zdGF0aWMgaW50IGNoZWNrX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLCBpbnQgZmxhZ3MpIHsKK3N0YXRpYyBpbnQgY2hlY2tfam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsCisJCQkgICAgIGludCBmbGFncykKK3sKIAotICB0aW1lX3Qgbm93IDsKLSAgaW50IGZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEwgOwotICBpbnQgY29tbWl0X25vdyA9IGZsYWdzICYgQ09NTUlUX05PVyA7Ci0gIGludCB3YWl0X29uX2NvbW1pdCA9IGZsYWdzICYgV0FJVCA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisJdGltZV90IG5vdzsKKwlpbnQgZmx1c2ggPSBmbGFncyAmIEZMVVNIX0FMTDsKKwlpbnQgY29tbWl0X25vdyA9IGZsYWdzICYgQ09NTUlUX05PVzsKKwlpbnQgd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CiAKLSAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gIGlmICh0aC0+dF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsICJqb3VybmFsLTE1Nzc6IGhhbmRsZSB0cmFucyBpZCAlbGQgIT0gY3VycmVudCB0cmFucyBpZCAlbGRcbiIsIAotICAgICAgICAgICAgICAgICAgIHRoLT50X3RyYW5zX2lkLCBqb3VybmFsLT5qX3RyYW5zX2lkKTsKLSAgfQotCi0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jIC09ICh0aC0+dF9ibG9ja3NfYWxsb2NhdGVkIC0gdGgtPnRfYmxvY2tzX2xvZ2dlZCkgOwotICBpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpID4gMCkgeyAvKiA8PSAwIGlzIGFsbG93ZWQuICB1bm1vdW50aW5nIG1pZ2h0IG5vdCBjYWxsIGJlZ2luICovCi0gICAgYXRvbWljX2RlYygmKGpvdXJuYWwtPmpfd2NvdW50KSkgOwotICB9Ci0KLSAgLyogQlVHLCBkZWFsIHdpdGggY2FzZSB3aGVyZSBqX2xlbiBpcyAwLCBidXQgcGVvcGxlIHByZXZpb3VzbHkgZnJlZWQgYmxvY2tzIG5lZWQgdG8gYmUgcmVsZWFzZWQgCi0gICoqIHdpbGwgYmUgZGVhbHQgd2l0aCBieSBuZXh0IHRyYW5zYWN0aW9uIHRoYXQgYWN0dWFsbHkgd3JpdGVzIHNvbWV0aGluZywgYnV0IHNob3VsZCBiZSB0YWtlbgotICAqKiBjYXJlIG9mIGluIHRoaXMgdHJhbnMKLSAgKi8KLSAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKLSAgICBCVUcoKTsKLSAgfQotICAvKiBpZiB3Y291bnQgPiAwLCBhbmQgd2UgYXJlIGNhbGxlZCB0byB3aXRoIGZsdXNoIG9yIGNvbW1pdF9ub3csCi0gICoqIHdlIHdhaXQgb24gal9qb2luX3dhaXQuICBXZSB3aWxsIHdha2UgdXAgd2hlbiB0aGUgbGFzdCB3cml0ZXIgaGFzCi0gICoqIGZpbmlzaGVkIHRoZSB0cmFuc2FjdGlvbiwgYW5kIHN0YXJ0ZWQgaXQgb24gaXRzIHdheSB0byB0aGUgZGlzay4KLSAgKiogVGhlbiwgd2UgZmx1c2ggdGhlIGNvbW1pdCBvciBqb3VybmFsIGxpc3QsIGFuZCBqdXN0IHJldHVybiAwIAotICAqKiBiZWNhdXNlIHRoZSByZXN0IG9mIGpvdXJuYWwgZW5kIHdhcyBhbHJlYWR5IGRvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24uCi0gICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgPiAwKSB7Ci0gICAgaWYgKGZsdXNoIHx8IGNvbW1pdF9ub3cpIHsKLSAgICAgIHVuc2lnbmVkIHRyYW5zX2lkIDsKLQotICAgICAgamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7Ci0gICAgICB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOwotICAgICAgaWYgKHdhaXRfb25fY29tbWl0KQotICAgICAgICBqbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOwotICAgICAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAxKSA7Ci0gICAgICBpZiAoZmx1c2gpIHsKLSAgICAgICAgam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2ggPSAxIDsKLSAgICAgIH0KLSAgICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOwotCi0gICAgICAvKiBzbGVlcCB3aGlsZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzdGlsbCBqX2psb2NrZWQgKi8KLSAgICAgIHdoaWxlKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKLQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7Ci0JICAgIHF1ZXVlX2xvZ193cml0ZXIocF9zX3NiKTsKLSAgICAgICAgfSBlbHNlIHsKLQkgICAgbG9ja19qb3VybmFsKHBfc19zYik7Ci0JICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7Ci0JICAgICAgICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDEpIDsKLQkgICAgfQotCSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCWlmICh0aC0+dF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisJCXJlaXNlcmZzX3BhbmljKHRoLT50X3N1cGVyLAorCQkJICAgICAgICJqb3VybmFsLTE1Nzc6IGhhbmRsZSB0cmFucyBpZCAlbGQgIT0gY3VycmVudCB0cmFucyBpZCAlbGRcbiIsCisJCQkgICAgICAgdGgtPnRfdHJhbnNfaWQsIGpvdXJuYWwtPmpfdHJhbnNfaWQpOwogCX0KLSAgICAgIH0KLSAgICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7Ci0gICAgICAgICAgQlVHKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoY29tbWl0X25vdyAmJiBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocF9zX3NiLCB0cmFuc19pZCkgJiYKLSAgICAgICAgICB3YWl0X29uX2NvbW1pdCkKLSAgICAgIHsKLQkgIGZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpIDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwIDsKLSAgICB9IAotICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOwotICAgIHJldHVybiAwIDsKLSAgfQogCi0gIC8qIGRlYWwgd2l0aCBvbGQgdHJhbnNhY3Rpb25zIHdoZXJlIHdlIGFyZSB0aGUgbGFzdCB3cml0ZXJzICovCi0gIG5vdyA9IGdldF9zZWNvbmRzKCk7Ci0gIGlmICgobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgewotICAgIGNvbW1pdF9ub3cgPSAxIDsKLSAgICBqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxIDsKLSAgfQotICAvKiBkb24ndCBiYXRjaCB3aGVuIHNvbWVvbmUgaXMgd2FpdGluZyBvbiBqX2pvaW5fd2FpdCAqLwotICAvKiBkb24ndCBiYXRjaCB3aGVuIHN5bmNpbmcgdGhlIGNvbW1pdCBvciBmbHVzaGluZyB0aGUgd2hvbGUgdHJhbnMgKi8KLSAgaWYgKCEoam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSAmJiAhKGF0b21pY19yZWFkKCYoam91cm5hbC0+al9qbG9jaykpKSAmJiAhZmx1c2ggJiYgIWNvbW1pdF9ub3cgJiYKLSAgICAgIChqb3VybmFsLT5qX2xlbiA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoKSAgJiYKLSAgICAgIGpvdXJuYWwtPmpfbGVuX2FsbG9jIDwgam91cm5hbC0+al9tYXhfYmF0Y2ggJiYgam91cm5hbC0+al9jbm9kZV9mcmVlID4gKGpvdXJuYWwtPmpfdHJhbnNfbWF4ICogMykpIHsKLSAgICBqb3VybmFsLT5qX2Jjb3VudCsrIDsKLSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKLSAgICByZXR1cm4gMCA7Ci0gIH0KKwlqb3VybmFsLT5qX2xlbl9hbGxvYyAtPSAodGgtPnRfYmxvY2tzX2FsbG9jYXRlZCAtIHRoLT50X2Jsb2Nrc19sb2dnZWQpOworCWlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgPiAwKSB7CS8qIDw9IDAgaXMgYWxsb3dlZC4gIHVubW91bnRpbmcgbWlnaHQgbm90IGNhbGwgYmVnaW4gKi8KKwkJYXRvbWljX2RlYygmKGpvdXJuYWwtPmpfd2NvdW50KSk7CisJfQogCi0gIGlmIChqb3VybmFsLT5qX3N0YXJ0ID4gU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0wMDM6IGpvdXJuYWxfZW5kOiBqX3N0YXJ0ICglbGQpIGlzIHRvbyBoaWdoXG4iLCBqb3VybmFsLT5qX3N0YXJ0KSA7Ci0gIH0KLSAgcmV0dXJuIDEgOworCS8qIEJVRywgZGVhbCB3aXRoIGNhc2Ugd2hlcmUgal9sZW4gaXMgMCwgYnV0IHBlb3BsZSBwcmV2aW91c2x5IGZyZWVkIGJsb2NrcyBuZWVkIHRvIGJlIHJlbGVhc2VkIAorCSAqKiB3aWxsIGJlIGRlYWx0IHdpdGggYnkgbmV4dCB0cmFuc2FjdGlvbiB0aGF0IGFjdHVhbGx5IHdyaXRlcyBzb21ldGhpbmcsIGJ1dCBzaG91bGQgYmUgdGFrZW4KKwkgKiogY2FyZSBvZiBpbiB0aGlzIHRyYW5zCisJICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKwkJQlVHKCk7CisJfQorCS8qIGlmIHdjb3VudCA+IDAsIGFuZCB3ZSBhcmUgY2FsbGVkIHRvIHdpdGggZmx1c2ggb3IgY29tbWl0X25vdywKKwkgKiogd2Ugd2FpdCBvbiBqX2pvaW5fd2FpdC4gIFdlIHdpbGwgd2FrZSB1cCB3aGVuIHRoZSBsYXN0IHdyaXRlciBoYXMKKwkgKiogZmluaXNoZWQgdGhlIHRyYW5zYWN0aW9uLCBhbmQgc3RhcnRlZCBpdCBvbiBpdHMgd2F5IHRvIHRoZSBkaXNrLgorCSAqKiBUaGVuLCB3ZSBmbHVzaCB0aGUgY29tbWl0IG9yIGpvdXJuYWwgbGlzdCwgYW5kIGp1c3QgcmV0dXJuIDAgCisJICoqIGJlY2F1c2UgdGhlIHJlc3Qgb2Ygam91cm5hbCBlbmQgd2FzIGFscmVhZHkgZG9uZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpID4gMCkgeworCQlpZiAoZmx1c2ggfHwgY29tbWl0X25vdykgeworCQkJdW5zaWduZWQgdHJhbnNfaWQ7CisKKwkJCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworCQkJdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwkJCWlmICh3YWl0X29uX2NvbW1pdCkKKwkJCQlqbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOworCQkJYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAxKTsKKwkJCWlmIChmbHVzaCkgeworCQkJCWpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoID0gMTsKKwkJCX0KKwkJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisKKwkJCS8qIHNsZWVwIHdoaWxlIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHN0aWxsIGpfamxvY2tlZCAqLworCQkJd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7CisJCQkJCXF1ZXVlX2xvZ193cml0ZXIocF9zX3NiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwkJCQkJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKKwkJCQkJCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2psb2NrKSwKKwkJCQkJCQkgICAxKTsKKwkJCQkJfQorCQkJCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCQkJCX0KKwkJCX0KKwkJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7CisJCQkJQlVHKCk7CisJCQl9CisJCQlpZiAoY29tbWl0X25vdworCQkJICAgICYmIGpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShwX3Nfc2IsIHRyYW5zX2lkKQorCQkJICAgICYmIHdhaXRfb25fY29tbWl0KSB7CisJCQkJZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkZWFsIHdpdGggb2xkIHRyYW5zYWN0aW9ucyB3aGVyZSB3ZSBhcmUgdGhlIGxhc3Qgd3JpdGVycyAqLworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisJaWYgKChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKSB7CisJCWNvbW1pdF9ub3cgPSAxOworCQlqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxOworCX0KKwkvKiBkb24ndCBiYXRjaCB3aGVuIHNvbWVvbmUgaXMgd2FpdGluZyBvbiBqX2pvaW5fd2FpdCAqLworCS8qIGRvbid0IGJhdGNoIHdoZW4gc3luY2luZyB0aGUgY29tbWl0IG9yIGZsdXNoaW5nIHRoZSB3aG9sZSB0cmFucyAqLworCWlmICghKGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgJiYgIShhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfamxvY2spKSkKKwkgICAgJiYgIWZsdXNoICYmICFjb21taXRfbm93ICYmIChqb3VybmFsLT5qX2xlbiA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoKQorCSAgICAmJiBqb3VybmFsLT5qX2xlbl9hbGxvYyA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoCisJICAgICYmIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA+IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSB7CisJCWpvdXJuYWwtPmpfYmNvdW50Kys7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJldHVybiAwOworCX0KKworCWlmIChqb3VybmFsLT5qX3N0YXJ0ID4gU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7CisJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCSAgICAgICAiam91cm5hbC0wMDM6IGpvdXJuYWxfZW5kOiBqX3N0YXJ0ICglbGQpIGlzIHRvbyBoaWdoXG4iLAorCQkJICAgICAgIGpvdXJuYWwtPmpfc3RhcnQpOworCX0KKwlyZXR1cm4gMTsKIH0KIAogLyoKQEAgLTMyODQsODMgKzM1OTMsOTUgQEAKICoqCiAqKiBUaGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBkZWNyZW1lbnRpbmcgYW55IGNvdW50ZXJzIGFuZCBmaWxpbmcgaXQgb24gdGhlIGNsZWFuIGxpc3QuCiAqLwotaW50IGpvdXJuYWxfbWFya19mcmVlZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGJfYmxvY2tucl90IGJsb2NrbnIpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwgOwotICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gTlVMTCA7Ci0gIGludCBjbGVhbmVkID0gMCA7Ci0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKK2ludCBqb3VybmFsX21hcmtfZnJlZWQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgYl9ibG9ja25yX3QgYmxvY2tucikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgPSBOVUxMOworCWludCBjbGVhbmVkID0gMDsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICBjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKLSAgaWYgKGNuICYmIGNuLT5iaCkgewotICAgICAgYmggPSBjbi0+YmggOwotICAgICAgZ2V0X2JoKGJoKSA7Ci0gIH0KLSAgLyogaWYgaXQgaXMgam91cm5hbCBuZXcsIHdlIGp1c3QgcmVtb3ZlIGl0IGZyb20gdGhpcyB0cmFuc2FjdGlvbiAqLwotICBpZiAoYmggJiYgYnVmZmVyX2pvdXJuYWxfbmV3KGJoKSkgewotICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyAoYmgpOwotICAgIGNsZWFyX3ByZXBhcmVkX2JpdHMoYmgpIDsKLSAgICByZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoYmgpIDsKLSAgICBjbGVhbmVkID0gcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24ocF9zX3NiLCBibG9ja25yLCBjbGVhbmVkKSA7Ci0gIH0gZWxzZSB7Ci0gICAgLyogc2V0IHRoZSBiaXQgZm9yIHRoaXMgYmxvY2sgaW4gdGhlIGpvdXJuYWwgYml0bWFwIGZvciB0aGlzIHRyYW5zYWN0aW9uICovCi0gICAgamIgPSBqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXA7Ci0gICAgaWYgKCFqYikgewotICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0xNzAyOiBqb3VybmFsX21hcmtfZnJlZWQsIGpvdXJuYWxfbGlzdF9iaXRtYXAgaXMgTlVMTFxuIikgOwotICAgIH0KLSAgICBzZXRfYml0X2luX2xpc3RfYml0bWFwKHBfc19zYiwgYmxvY2tuciwgamIpIDsKKwljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKKwlpZiAoY24gJiYgY24tPmJoKSB7CisJCWJoID0gY24tPmJoOworCQlnZXRfYmgoYmgpOworCX0KKwkvKiBpZiBpdCBpcyBqb3VybmFsIG5ldywgd2UganVzdCByZW1vdmUgaXQgZnJvbSB0aGlzIHRyYW5zYWN0aW9uICovCisJaWYgKGJoICYmIGJ1ZmZlcl9qb3VybmFsX25ldyhiaCkpIHsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3KGJoKTsKKwkJY2xlYXJfcHJlcGFyZWRfYml0cyhiaCk7CisJCXJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihiaCk7CisJCWNsZWFuZWQgPSByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihwX3Nfc2IsIGJsb2NrbnIsIGNsZWFuZWQpOworCX0gZWxzZSB7CisJCS8qIHNldCB0aGUgYml0IGZvciB0aGlzIGJsb2NrIGluIHRoZSBqb3VybmFsIGJpdG1hcCBmb3IgdGhpcyB0cmFuc2FjdGlvbiAqLworCQlqYiA9IGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcDsKKwkJaWYgKCFqYikgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam91cm5hbC0xNzAyOiBqb3VybmFsX21hcmtfZnJlZWQsIGpvdXJuYWxfbGlzdF9iaXRtYXAgaXMgTlVMTFxuIik7CisJCX0KKwkJc2V0X2JpdF9pbl9saXN0X2JpdG1hcChwX3Nfc2IsIGJsb2NrbnIsIGpiKTsKIAotICAgIC8qIE5vdGUsIHRoZSBlbnRpcmUgd2hpbGUgbG9vcCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZS4gICovCisJCS8qIE5vdGUsIHRoZSBlbnRpcmUgd2hpbGUgbG9vcCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZS4gICovCiAKLSAgICBpZiAoYmgpIHsKLSAgICAgIGNsZWFyX3ByZXBhcmVkX2JpdHMoYmgpIDsKLSAgICAgIHJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihiaCkgOwotICAgIH0KLSAgICBjbGVhbmVkID0gcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24ocF9zX3NiLCBibG9ja25yLCBjbGVhbmVkKSA7CisJCWlmIChiaCkgeworCQkJY2xlYXJfcHJlcGFyZWRfYml0cyhiaCk7CisJCQlyZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoYmgpOworCQl9CisJCWNsZWFuZWQgPSByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihwX3Nfc2IsIGJsb2NrbnIsIGNsZWFuZWQpOwogCi0gICAgLyogZmluZCBhbGwgb2xkZXIgdHJhbnNhY3Rpb25zIHdpdGggdGhpcyBibG9jaywgbWFrZSBzdXJlIHRoZXkgZG9uJ3QgdHJ5IHRvIHdyaXRlIGl0IG91dCAqLwotICAgIGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCAgYmxvY2tucikgOwotICAgIHdoaWxlIChjbikgewotICAgICAgaWYgKHBfc19zYiA9PSBjbi0+c2IgJiYgYmxvY2tuciA9PSBjbi0+YmxvY2tucikgewotCXNldF9iaXQoQkxPQ0tfRlJFRUQsICZjbi0+c3RhdGUpIDsKLQlpZiAoY24tPmJoKSB7Ci0JICBpZiAoIWNsZWFuZWQpIHsKLQkgICAgLyogcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gd2lsbCBicmVsc2UgdGhlIGJ1ZmZlciBpZiBpdCB3YXMgCi0JICAgICoqIGluIHRoZSBjdXJyZW50IHRyYW5zCi0JICAgICovCi0gICAgICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKTsKLQkgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGNuLT5iaCk7Ci0JICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoY24tPmJoKTsKLQkgICAgY2xlYW5lZCA9IDEgOwotCSAgICBwdXRfYmgoY24tPmJoKSA7Ci0JICAgIGlmIChhdG9taWNfcmVhZCgmKGNuLT5iaC0+Yl9jb3VudCkpIDwgMCkgewotCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMjEzODogY24tPmJoLT5iX2NvdW50IDwgMCIpOwotCSAgICB9Ci0JICB9Ci0JICBpZiAoY24tPmpsaXN0KSB7IC8qIHNpbmNlIHdlIGFyZSBjbGVhcmluZyB0aGUgYmgsIHdlIE1VU1QgZGVjIG5vbnplcm9sZW4gKi8KLQkgICAgYXRvbWljX2RlYygmKGNuLT5qbGlzdC0+al9ub256ZXJvbGVuKSkgOwotCSAgfQotCSAgY24tPmJoID0gTlVMTCA7IAotCX0gCi0gICAgICB9Ci0gICAgICBjbiA9IGNuLT5obmV4dCA7Ci0gICAgfQotICB9CisJCS8qIGZpbmQgYWxsIG9sZGVyIHRyYW5zYWN0aW9ucyB3aXRoIHRoaXMgYmxvY2ssIG1ha2Ugc3VyZSB0aGV5IGRvbid0IHRyeSB0byB3cml0ZSBpdCBvdXQgKi8KKwkJY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLAorCQkJCQkgIGJsb2NrbnIpOworCQl3aGlsZSAoY24pIHsKKwkJCWlmIChwX3Nfc2IgPT0gY24tPnNiICYmIGJsb2NrbnIgPT0gY24tPmJsb2NrbnIpIHsKKwkJCQlzZXRfYml0KEJMT0NLX0ZSRUVELCAmY24tPnN0YXRlKTsKKwkJCQlpZiAoY24tPmJoKSB7CisJCQkJCWlmICghY2xlYW5lZCkgeworCQkJCQkJLyogcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gd2lsbCBicmVsc2UgdGhlIGJ1ZmZlciBpZiBpdCB3YXMgCisJCQkJCQkgKiogaW4gdGhlIGN1cnJlbnQgdHJhbnMKKwkJCQkJCSAqLworCQkJCQkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoY24tPgorCQkJCQkJCQkJICAgYmgpOworCQkJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGNuLT5iaCk7CisJCQkJCQljbGVhcl9idWZmZXJfam91cm5hbF90ZXN0KGNuLT4KKwkJCQkJCQkJCSAgYmgpOworCQkJCQkJY2xlYW5lZCA9IDE7CisJCQkJCQlwdXRfYmgoY24tPmJoKTsKKwkJCQkJCWlmIChhdG9taWNfcmVhZAorCQkJCQkJICAgICgmKGNuLT5iaC0+Yl9jb3VudCkpIDwgMCkgeworCQkJCQkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkJCQkJICJqb3VybmFsLTIxMzg6IGNuLT5iaC0+Yl9jb3VudCA8IDAiKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoY24tPmpsaXN0KSB7CS8qIHNpbmNlIHdlIGFyZSBjbGVhcmluZyB0aGUgYmgsIHdlIE1VU1QgZGVjIG5vbnplcm9sZW4gKi8KKwkJCQkJCWF0b21pY19kZWMoJgorCQkJCQkJCSAgIChjbi0+amxpc3QtPgorCQkJCQkJCSAgICBqX25vbnplcm9sZW4pKTsKKwkJCQkJfQorCQkJCQljbi0+YmggPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWNuID0gY24tPmhuZXh0OworCQl9CisJfQogCi0gIGlmIChiaCkgewotICAgIHB1dF9iaChiaCkgOyAvKiBnZXRfaGFzaCBncmFicyB0aGUgYnVmZmVyICovCi0gICAgaWYgKGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSA8IDApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMjE2NTogYmgtPmJfY291bnQgPCAwIik7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwIDsKKwlpZiAoYmgpIHsKKwkJcHV0X2JoKGJoKTsJLyogZ2V0X2hhc2ggZ3JhYnMgdGhlIGJ1ZmZlciAqLworCQlpZiAoYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpIDwgMCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0yMTY1OiBiaC0+Yl9jb3VudCA8IDAiKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIH0KIAotdm9pZCByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKGlub2RlLT5pX3NiKTsKLSAgUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7Ci0gIFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZCA7Cit2b2lkIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYik7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOwogfQogCiAvKgpAQCAtMzM2OCw5OSArMzY4OSwxMDIgQEAKICAqIGlmIGEgdHJhbnNhY3Rpb24gd2FzIGFjdHVhbGx5IGNvbW1pdHRlZCBhbmQgdGhlIGJhcnJpZXIgd2FzIGRvbmUKICAqLwogc3RhdGljIGludCBfX2NvbW1pdF90cmFuc19qbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCisJCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYiA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgaW50IHJldCA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHNiKTsKKwlpbnQgcmV0ID0gMDsKIAotICAgIC8qIGlzIGl0IGZyb20gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIG9yIGZyb20gYW4gdW5rbm93biB0cmFuc2FjdGlvbj8gKi8KLSAgICBpZiAoaWQgPT0gam91cm5hbC0+al90cmFuc19pZCkgewotCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOwotCS8qIHRyeSB0byBsZXQgb3RoZXIgd3JpdGVycyBjb21lIGluIGFuZCBncm93IHRoaXMgdHJhbnNhY3Rpb24gKi8KLQlsZXRfdHJhbnNhY3Rpb25fZ3JvdyhzYiwgaWQpOwotCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7Ci0JICAgIGdvdG8gZmx1c2hfY29tbWl0X29ubHk7CisJLyogaXMgaXQgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgb3IgZnJvbSBhbiB1bmtub3duIHRyYW5zYWN0aW9uPyAqLworCWlmIChpZCA9PSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisJCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworCQkvKiB0cnkgdG8gbGV0IG90aGVyIHdyaXRlcnMgY29tZSBpbiBhbmQgZ3JvdyB0aGlzIHRyYW5zYWN0aW9uICovCisJCWxldF90cmFuc2FjdGlvbl9ncm93KHNiLCBpZCk7CisJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7CisJCQlnb3RvIGZsdXNoX2NvbW1pdF9vbmx5OworCQl9CisKKwkJcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIHNiLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogc29tZW9uZSBtaWdodCBoYXZlIGVuZGVkIHRoaXMgdHJhbnNhY3Rpb24gd2hpbGUgd2Ugam9pbmVkICovCisJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHNiLCBTQl9CVUZGRVJfV0lUSF9TQihzYiksCisJCQkJCQkgICAgIDEpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHNiKSk7CisJCQlyZXQgPSBqb3VybmFsX2VuZCgmdGgsIHNiLCAxKTsKKwkJCWdvdG8gZmx1c2hfY29tbWl0X29ubHk7CisJCX0KKworCQlyZXQgPSBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgc2IsIDEpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IDE7CisKKwl9IGVsc2UgeworCQkvKiB0aGlzIGdldHMgdHJpY2t5LCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgam91cm5hbCBsaXN0IGluCisJCSAqIHRoZSBpbm9kZSBzdGlsbCBleGlzdHMuICBXZSBrbm93IHRoZSBsaXN0IGlzIHN0aWxsIGFyb3VuZAorCQkgKiBpZiB3ZSd2ZSBnb3QgYSBsYXJnZXIgdHJhbnNhY3Rpb24gaWQgdGhhbiB0aGUgb2xkZXN0IGxpc3QKKwkJICovCisJICAgICAgZmx1c2hfY29tbWl0X29ubHk6CisJCWlmIChqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUoaW5vZGUtPmlfc2IsIGlkKSkgeworCQkJLyoKKwkJCSAqIHdlIG9ubHkgc2V0IHJldCB0byAxIHdoZW4gd2Uga25vdyBmb3Igc3VyZQorCQkJICogdGhlIGJhcnJpZXIgaGFzbid0IGJlZW4gc3RhcnRlZCB5ZXQgb24gdGhlIGNvbW1pdAorCQkJICogYmxvY2suCisJCQkgKi8KKwkJCWlmIChhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpID4gMSkKKwkJCQlyZXQgPSAxOworCQkJZmx1c2hfY29tbWl0X2xpc3Qoc2IsIGpsLCAxKTsKKwkJCWlmIChqb3VybmFsLT5qX2Vycm5vKQorCQkJCXJldCA9IGpvdXJuYWwtPmpfZXJybm87CisJCX0KIAl9CisJLyogb3RoZXJ3aXNlIHRoZSBsaXN0IGlzIGdvbmUsIGFuZCBsb25nIHNpbmNlIGNvbW1pdHRlZCAqLworCXJldHVybiByZXQ7Cit9CiAKLQlyZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgc2IsIDEpIDsKLQlpZiAocmV0KQotCSAgICByZXR1cm4gcmV0OworaW50IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGlkID0gUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9qbDsKIAotCS8qIHNvbWVvbmUgbWlnaHQgaGF2ZSBlbmRlZCB0aGlzIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLwotCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7Ci0JICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHNiKSwgMSkgOwotCSAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzYiwgU0JfQlVGRkVSX1dJVEhfU0Ioc2IpKSA7Ci0JICAgIHJldCA9IGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDEpIDsKLQkgICAgZ290byBmbHVzaF9jb21taXRfb25seTsKLQl9Ci0KLQlyZXQgPSBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgc2IsIDEpIDsKLQlpZiAoIXJldCkKLQkgICAgcmV0ID0gMTsKLQotICAgIH0gZWxzZSB7Ci0JLyogdGhpcyBnZXRzIHRyaWNreSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGpvdXJuYWwgbGlzdCBpbgotCSAqIHRoZSBpbm9kZSBzdGlsbCBleGlzdHMuICBXZSBrbm93IHRoZSBsaXN0IGlzIHN0aWxsIGFyb3VuZAotCSAqIGlmIHdlJ3ZlIGdvdCBhIGxhcmdlciB0cmFuc2FjdGlvbiBpZCB0aGFuIHRoZSBvbGRlc3QgbGlzdAorCS8qIGZvciB0aGUgd2hvbGUgaW5vZGUsIGFzc3VtZSB1bnNldCBpZCBtZWFucyBpdCB3YXMKKwkgKiBjaGFuZ2VkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgTW9yZSBjb25zZXJ2YXRpdmUKIAkgKi8KLWZsdXNoX2NvbW1pdF9vbmx5OgotCWlmIChqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUoaW5vZGUtPmlfc2IsIGlkKSkgewotCSAgICAvKgotCSAgICAgKiB3ZSBvbmx5IHNldCByZXQgdG8gMSB3aGVuIHdlIGtub3cgZm9yIHN1cmUKLQkgICAgICogdGhlIGJhcnJpZXIgaGFzbid0IGJlZW4gc3RhcnRlZCB5ZXQgb24gdGhlIGNvbW1pdAotCSAgICAgKiBibG9jay4KLQkgICAgICovCi0JICAgIGlmIChhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpID4gMSkKLQkgICAgICAgIHJldCA9IDE7Ci0JICAgIGZsdXNoX2NvbW1pdF9saXN0KHNiLCBqbCwgMSkgOwotCSAgICBpZiAoam91cm5hbC0+al9lcnJubykKLQkJcmV0ID0gam91cm5hbC0+al9lcnJubzsKKwlpZiAoIWlkIHx8ICFqbCkgeworCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCQlpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOworCQkvKiBqbCB3aWxsIGJlIHVwZGF0ZWQgaW4gX19jb21taXRfdHJhbnNfamwgKi8KIAl9Ci0gICAgfQotICAgIC8qIG90aGVyd2lzZSB0aGUgbGlzdCBpcyBnb25lLCBhbmQgbG9uZyBzaW5jZSBjb21taXR0ZWQgKi8KLSAgICByZXR1cm4gcmV0OworCisJcmV0dXJuIF9fY29tbWl0X3RyYW5zX2psKGlub2RlLCBpZCwgamwpOwogfQogCi1pbnQgcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7Ci0gICAgdW5zaWduZWQgbG9uZyBpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsID0gUkVJU0VSRlNfSShpbm9kZSktPmlfamw7Ci0KLSAgICAvKiBmb3IgdGhlIHdob2xlIGlub2RlLCBhc3N1bWUgdW5zZXQgaWQgbWVhbnMgaXQgd2FzCi0gICAgICogY2hhbmdlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIE1vcmUgY29uc2VydmF0aXZlCi0gICAgICovCi0gICAgaWYgKCFpZCB8fCAhamwpIHsKLQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLQlpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOwotCS8qIGpsIHdpbGwgYmUgdXBkYXRlZCBpbiBfX2NvbW1pdF90cmFuc19qbCAqLwotICAgIH0KLQotICAgcmV0dXJuIF9fY29tbWl0X3RyYW5zX2psKGlub2RlLCBpZCwgamwpOwordm9pZCByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLnJlc3RvcmVfcHJlcGFyZWQpOworCWlmICghYmgpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAodGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5KGJoKSAmJgorCSAgICBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCQljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwKKwkJCQkJICBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwKKwkJCQkJICBiaC0+Yl9ibG9ja25yKTsKKwkJaWYgKGNuICYmIGNhbl9kaXJ0eShjbikpIHsKKwkJCXNldF9idWZmZXJfam91cm5hbF90ZXN0KGJoKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCX0KKwljbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZChiaCk7CiB9CiAKLXZvaWQgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5yZXN0b3JlX3ByZXBhcmVkICk7Ci0gICAgaWYgKCFiaCkgewotCXJldHVybiA7Ci0gICAgfQotICAgIGlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKSAmJgotCWJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSkgewotCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKLQljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLAotCQkJCSAgYmgtPmJfYmxvY2tucik7Ci0JaWYgKGNuICYmIGNhbl9kaXJ0eShjbikpIHsKLSAgICAgICAgICAgIHNldF9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7Ci0JICAgIG1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOwotfQotCi1leHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqY3VyX3RiIDsKK2V4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGI7CiAvKgogKiogYmVmb3JlIHdlIGNhbiBjaGFuZ2UgYSBtZXRhZGF0YSBibG9jaywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgaXQgd29uJ3QKICoqIGJlIHdyaXR0ZW4gdG8gZGlzayB3aGlsZSB3ZSBhcmUgYWx0ZXJpbmcgaXQuICBTbywgd2UgbXVzdDoKQEAgLTM0NjksMzkgKzM3OTMsNDEgQEAKICoqIAogKi8KIGludCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB3YWl0KSB7Ci0gIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5wcmVwYXJlICk7CisJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB3YWl0KQoreworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLnByZXBhcmUpOwogCi0gICAgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JaWYgKCF3YWl0KQotCSAgICByZXR1cm4gMDsKLQlsb2NrX2J1ZmZlcihiaCk7Ci0gICAgfQotICAgIHNldF9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOwotICAgIGlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSAgewotICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7Ci0gICAgICAgIHNldF9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5IChiaCk7Ci0gICAgfQotICAgIHVubG9ja19idWZmZXIoYmgpOwotICAgIHJldHVybiAxOworCWlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkgeworCQlpZiAoIXdhaXQpCisJCQlyZXR1cm4gMDsKKwkJbG9ja19idWZmZXIoYmgpOworCX0KKwlzZXRfYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoYmgpOworCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7CisJCWNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoYmgpOworCQlzZXRfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eShiaCk7CisJfQorCXVubG9ja19idWZmZXIoYmgpOworCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBmbHVzaF9vbGRfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotICAgIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpOworc3RhdGljIHZvaWQgZmx1c2hfb2xkX2pvdXJuYWxfbGlzdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwl0aW1lX3Qgbm93ID0gZ2V0X3NlY29uZHMoKTsKIAotICAgIHdoaWxlKCFsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKLSAgICAgICAgZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5uZXh0OwotCWpsID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKLQkvKiB0aGlzIGNoZWNrIHNob3VsZCBhbHdheXMgYmUgcnVuLCB0byBzZW5kIG9sZCBsaXN0cyB0byBkaXNrICovCi0JaWYgKGpsLT5qX3RpbWVzdGFtcCA8IChub3cgLSAoSk9VUk5BTF9NQVhfVFJBTlNfQUdFICogNCkpKSB7Ci0JICAgIGZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhzLCBqbCk7Ci0JfSBlbHNlIHsKLQkgICAgYnJlYWs7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKKwkJZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5uZXh0OworCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCS8qIHRoaXMgY2hlY2sgc2hvdWxkIGFsd2F5cyBiZSBydW4sIHRvIHNlbmQgb2xkIGxpc3RzIHRvIGRpc2sgKi8KKwkJaWYgKGpsLT5qX3RpbWVzdGFtcCA8IChub3cgLSAoSk9VUk5BTF9NQVhfVFJBTlNfQUdFICogNCkpKSB7CisJCQlmbHVzaF91c2VkX2pvdXJuYWxfbGlzdHMocywgamwpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KIAl9Ci0gICAgfQogfQogCiAvKiAKQEAgLTM1MTQsMzc1ICszODQwLDM5MCBAQAogKiogSWYgdGhlIGpvdXJuYWwgaXMgYWJvcnRlZCwgd2UganVzdCBjbGVhbiB1cC4gVGhpbmdzIGxpa2UgZmx1c2hpbmcKICoqIGpvdXJuYWwgbGlzdHMsIGV0YyBqdXN0IHdvbid0IGhhcHBlbi4KICovCi1zdGF0aWMgaW50IGRvX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsIAotCQkgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuLCAqbmV4dCwgKmpsX2NuOyAKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmxhc3RfY24gPSBOVUxMOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICpkZXNjIDsgCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsgCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqY19iaCA7IC8qIGNvbW1pdCBiaCAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmggOyAvKiBkZXNjIGJoICovCi0gIGludCBjdXJfd3JpdGVfc3RhcnQgPSAwIDsgLyogc3RhcnQgaW5kZXggb2YgY3VycmVudCBsb2cgd3JpdGUgKi8KLSAgaW50IG9sZF9zdGFydCA7Ci0gIGludCBpIDsKLSAgaW50IGZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEwgOwotICBpbnQgd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgKnRlbXBfamw7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqc2FmZTsKLSAgdW5zaWduZWQgbG9uZyBqaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgY29tbWl0X3RyYW5zX2lkOwotICBpbnQgdHJhbnNfaGFsZjsKK3N0YXRpYyBpbnQgZG9fam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsCisJCQkgIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpuZXh0LCAqamxfY247CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmxhc3RfY24gPSBOVUxMOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2M7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICpjb21taXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoOwkvKiBjb21taXQgYmggKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmg7CS8qIGRlc2MgYmggKi8KKwlpbnQgY3VyX3dyaXRlX3N0YXJ0ID0gMDsJLyogc3RhcnQgaW5kZXggb2YgY3VycmVudCBsb2cgd3JpdGUgKi8KKwlpbnQgb2xkX3N0YXJ0OworCWludCBpOworCWludCBmbHVzaCA9IGZsYWdzICYgRkxVU0hfQUxMOworCWludCB3YWl0X29uX2NvbW1pdCA9IGZsYWdzICYgV0FJVDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgKnRlbXBfamw7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICpzYWZlOworCXVuc2lnbmVkIGxvbmcgamluZGV4OworCXVuc2lnbmVkIGxvbmcgY29tbWl0X3RyYW5zX2lkOworCWludCB0cmFuc19oYWxmOwogCi0gIEJVR19PTiAodGgtPnRfcmVmY291bnQgPiAxKTsKLSAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTih0aC0+dF9yZWZjb3VudCA+IDEpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gIHB1dF9mc19leGNsKCk7Ci0gIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwotICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWwgZW5kIik7Ci0gIGlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7Ci0gICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotICAgICAgam91cm5hbF9tYXJrX2RpcnR5KHRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgfQorCXB1dF9mc19leGNsKCk7CisJY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmU7CisJcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJqb3VybmFsIGVuZCIpOworCWlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7CisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLAorCQkJCQkgICAgIDEpOworCQlqb3VybmFsX21hcmtfZGlydHkodGgsIHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CisJfQogCi0gIGxvY2tfam91cm5hbChwX3Nfc2IpIDsKLSAgaWYgKGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoKSB7Ci0gICAgZmxhZ3MgfD0gRkxVU0hfQUxMIDsKLSAgICBmbHVzaCA9IDEgOwotICB9Ci0gIGlmIChqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2gpIHsKLSAgICBmbGFncyB8PSBDT01NSVRfTk9XIHwgV0FJVDsKLSAgICB3YWl0X29uX2NvbW1pdCA9IDE7Ci0gIH0KKwlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwlpZiAoam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2gpIHsKKwkJZmxhZ3MgfD0gRkxVU0hfQUxMOworCQlmbHVzaCA9IDE7CisJfQorCWlmIChqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2gpIHsKKwkJZmxhZ3MgfD0gQ09NTUlUX05PVyB8IFdBSVQ7CisJCXdhaXRfb25fY29tbWl0ID0gMTsKKwl9CiAKLSAgLyogY2hlY2tfam91cm5hbF9lbmQgbG9ja3MgdGhlIGpvdXJuYWwsIGFuZCB1bmxvY2tzIGlmIGl0IGRvZXMgbm90IHJldHVybiAxIAotICAqKiBpdCB0ZWxscyB1cyBpZiB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgam91cm5hbF9lbmQsIG9yIGp1c3QgcmV0dXJuCi0gICovCi0gIGlmICghY2hlY2tfam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgZmxhZ3MpKSB7Ci0gICAgcF9zX3NiLT5zX2RpcnQgPSAxOwotICAgIHdha2VfcXVldWVkX3dyaXRlcnMocF9zX3NiKTsKLSAgICByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KHBfc19zYik7Ci0gICAgZ290byBvdXQgOwotICB9CisJLyogY2hlY2tfam91cm5hbF9lbmQgbG9ja3MgdGhlIGpvdXJuYWwsIGFuZCB1bmxvY2tzIGlmIGl0IGRvZXMgbm90IHJldHVybiAxIAorCSAqKiBpdCB0ZWxscyB1cyBpZiB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgam91cm5hbF9lbmQsIG9yIGp1c3QgcmV0dXJuCisJICovCisJaWYgKCFjaGVja19qb3VybmFsX2VuZCh0aCwgcF9zX3NiLCBuYmxvY2tzLCBmbGFncykpIHsKKwkJcF9zX3NiLT5zX2RpcnQgPSAxOworCQl3YWtlX3F1ZXVlZF93cml0ZXJzKHBfc19zYik7CisJCXJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQocF9zX3NiKTsKKwkJZ290byBvdXQ7CisJfQogCi0gIC8qIGNoZWNrX2pvdXJuYWxfZW5kIG1pZ2h0IHNldCB0aGVzZSwgY2hlY2sgYWdhaW4gKi8KLSAgaWYgKGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoKSB7Ci0gICAgZmx1c2ggPSAxIDsKLSAgfQorCS8qIGNoZWNrX2pvdXJuYWxfZW5kIG1pZ2h0IHNldCB0aGVzZSwgY2hlY2sgYWdhaW4gKi8KKwlpZiAoam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2gpIHsKKwkJZmx1c2ggPSAxOworCX0KIAotICAvKgotICAqKiBqIG11c3Qgd2FpdCBtZWFucyB3ZSBoYXZlIHRvIGZsdXNoIHRoZSBsb2cgYmxvY2tzLCBhbmQgdGhlIHJlYWwgYmxvY2tzIGZvcgotICAqKiB0aGlzIHRyYW5zYWN0aW9uCi0gICovCi0gIGlmIChqb3VybmFsLT5qX211c3Rfd2FpdCA+IDApIHsKLSAgICBmbHVzaCA9IDEgOwotICB9Ci0KKwkvKgorCSAqKiBqIG11c3Qgd2FpdCBtZWFucyB3ZSBoYXZlIHRvIGZsdXNoIHRoZSBsb2cgYmxvY2tzLCBhbmQgdGhlIHJlYWwgYmxvY2tzIGZvcgorCSAqKiB0aGlzIHRyYW5zYWN0aW9uCisJICovCisJaWYgKGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgeworCQlmbHVzaCA9IDE7CisJfQogI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCi0gIC8qIHF1b3RhIG9wcyBtaWdodCBuZWVkIHRvIG5lc3QsIHNldHVwIHRoZSBqb3VybmFsX2luZm8gcG9pbnRlciBmb3IgdGhlbSAqLwotICBjdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aCA7Ci0gIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jKHRoKTsgLyogaXQgc2hvdWxkIG5vdCBpbnZvbHZlIG5ldyBibG9ja3MgaW50bwotCQkJCSAgICAgICogdGhlIHRyYW5zYWN0aW9uICovCi0gIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlIDsKKwkvKiBxdW90YSBvcHMgbWlnaHQgbmVlZCB0byBuZXN0LCBzZXR1cCB0aGUgam91cm5hbF9pbmZvIHBvaW50ZXIgZm9yIHRoZW0gKi8KKwljdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aDsKKwlyZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyh0aCk7CS8qIGl0IHNob3VsZCBub3QgaW52b2x2ZSBuZXcgYmxvY2tzIGludG8KKwkJCQkJCSAqIHRoZSB0cmFuc2FjdGlvbiAqLworCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwogI2VuZGlmCi0gIAotICAvKiBzZXR1cCBkZXNjcmlwdGlvbiBibG9jayAqLwotICBkX2JoID0gam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQpIDsKLSAgc2V0X2J1ZmZlcl91cHRvZGF0ZShkX2JoKTsKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopKGRfYmgpLT5iX2RhdGEgOwotICBtZW1zZXQoZF9iaC0+Yl9kYXRhLCAwLCBkX2JoLT5iX3NpemUpIDsKLSAgbWVtY3B5KGdldF9qb3VybmFsX2Rlc2NfbWFnaWMgKGRfYmgpLCBKT1VSTkFMX0RFU0NfTUFHSUMsIDgpIDsKLSAgc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCkgOwogCi0gIC8qIHNldHVwIGNvbW1pdCBibG9jay4gIERvbid0IHdyaXRlIChrZWVwIGl0IGNsZWFuIHRvbykgdGhpcyBvbmUgdW50aWwgYWZ0ZXIgZXZlcnlvbmUgZWxzZSBpcyB3cml0dGVuICovCi0gIGNfYmggPSAgam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIAotCQkgKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al9sZW4gKyAxKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKLSAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7Ci0gIG1lbXNldChjX2JoLT5iX2RhdGEsIDAsIGNfYmgtPmJfc2l6ZSkgOwotICBzZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCwgam91cm5hbC0+al90cmFuc19pZCkgOwotICBzZXRfYnVmZmVyX3VwdG9kYXRlKGNfYmgpIDsKKwkvKiBzZXR1cCBkZXNjcmlwdGlvbiBibG9jayAqLworCWRfYmggPQorCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkgICBqb3VybmFsLT5qX3N0YXJ0KTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGRfYmgpOworCWRlc2MgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqKShkX2JoKS0+Yl9kYXRhOworCW1lbXNldChkX2JoLT5iX2RhdGEsIDAsIGRfYmgtPmJfc2l6ZSk7CisJbWVtY3B5KGdldF9qb3VybmFsX2Rlc2NfbWFnaWMoZF9iaCksIEpPVVJOQUxfREVTQ19NQUdJQywgOCk7CisJc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCk7CiAKLSAgLyogaW5pdCB0aGlzIGpvdXJuYWwgbGlzdCAqLwotICBqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKwkvKiBzZXR1cCBjb21taXQgYmxvY2suICBEb24ndCB3cml0ZSAoa2VlcCBpdCBjbGVhbiB0b28pIHRoaXMgb25lIHVudGlsIGFmdGVyIGV2ZXJ5b25lIGVsc2UgaXMgd3JpdHRlbiAqLworCWNfYmggPSBqb3VybmFsX2dldGJsayhwX3Nfc2IsIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCSAgICAgICgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfbGVuICsKKwkJCQkxKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpOworCWNvbW1pdCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKiljX2JoLT5iX2RhdGE7CisJbWVtc2V0KGNfYmgtPmJfZGF0YSwgMCwgY19iaC0+Yl9zaXplKTsKKwlzZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCwgam91cm5hbC0+al90cmFuc19pZCk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShjX2JoKTsKIAotICAvKiB3ZSBsb2NrIHRoZSBjb21taXQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGJlY2F1c2UKLSAgICogd2Ugd2FudCB0byBtYWtlIHN1cmUgbm9ib2R5IHRyaWVzIHRvIHJ1biBmbHVzaF9jb21taXRfbGlzdCB1bnRpbAotICAgKiB0aGUgbmV3IHRyYW5zYWN0aW9uIGlzIGZ1bGx5IHNldHVwLCBhbmQgd2UndmUgYWxyZWFkeSBmbHVzaGVkIHRoZQotICAgKiBvcmRlcmVkIGJoIGxpc3QKLSAgICovCi0gIGRvd24oJmpsLT5qX2NvbW1pdF9sb2NrKTsKKwkvKiBpbml0IHRoaXMgam91cm5hbCBsaXN0ICovCisJamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CiAKLSAgLyogc2F2ZSB0aGUgdHJhbnNhY3Rpb24gaWQgaW4gY2FzZSB3ZSBuZWVkIHRvIGNvbW1pdCBpdCBsYXRlciAqLwotICBjb21taXRfdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwkvKiB3ZSBsb2NrIHRoZSBjb21taXQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGJlY2F1c2UKKwkgKiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBub2JvZHkgdHJpZXMgdG8gcnVuIGZsdXNoX2NvbW1pdF9saXN0IHVudGlsCisJICogdGhlIG5ldyB0cmFuc2FjdGlvbiBpcyBmdWxseSBzZXR1cCwgYW5kIHdlJ3ZlIGFscmVhZHkgZmx1c2hlZCB0aGUKKwkgKiBvcmRlcmVkIGJoIGxpc3QKKwkgKi8KKwlkb3duKCZqbC0+al9jb21taXRfbG9jayk7CiAKLSAgYXRvbWljX3NldCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lLCAwKSA7Ci0gIGpsLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZCA7Ci0gIGpsLT5qX3RpbWVzdGFtcCA9IGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA7Ci0gIGpsLT5qX2NvbW1pdF9iaCA9IGNfYmggOwotICBqbC0+al9zdGFydCA9IGpvdXJuYWwtPmpfc3RhcnQgOwotICBqbC0+al9sZW4gPSBqb3VybmFsLT5qX2xlbiA7Ci0gIGF0b21pY19zZXQoJmpsLT5qX25vbnplcm9sZW4sIGpvdXJuYWwtPmpfbGVuKSA7Ci0gIGF0b21pY19zZXQoJmpsLT5qX2NvbW1pdF9sZWZ0LCBqb3VybmFsLT5qX2xlbiArIDIpOwotICBqbC0+al9yZWFsYmxvY2sgPSBOVUxMIDsKKwkvKiBzYXZlIHRoZSB0cmFuc2FjdGlvbiBpZCBpbiBjYXNlIHdlIG5lZWQgdG8gY29tbWl0IGl0IGxhdGVyICovCisJY29tbWl0X3RyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CiAKLSAgLyogVGhlIEVOVElSRSBGT1IgTE9PUCBNVVNUIG5vdCBjYXVzZSBzY2hlZHVsZSB0byBvY2N1ci4KLSAgKiogIGZvciBlYWNoIHJlYWwgYmxvY2ssIGFkZCBpdCB0byB0aGUgam91cm5hbCBsaXN0IGhhc2gsCi0gICoqIGNvcHkgaW50byByZWFsIGJsb2NrIGluZGV4IGFycmF5IGluIHRoZSBjb21taXQgb3IgZGVzYyBibG9jawotICAqLwotICB0cmFuc19oYWxmID0gam91cm5hbF90cmFuc19oYWxmKHBfc19zYi0+c19ibG9ja3NpemUpOwotICBmb3IgKGkgPSAwLCBjbiA9IGpvdXJuYWwtPmpfZmlyc3QgOyBjbiA7IGNuID0gY24tPm5leHQsIGkrKykgewotICAgIGlmIChidWZmZXJfam91cm5hbGVkIChjbi0+YmgpKSB7Ci0gICAgICBqbF9jbiA9IGdldF9jbm9kZShwX3Nfc2IpIDsKLSAgICAgIGlmICghamxfY24pIHsKLSAgICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0xNjc2LCBnZXRfY25vZGUgcmV0dXJuZWQgTlVMTFxuIikgOwotICAgICAgfQotICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICBqbC0+al9yZWFsYmxvY2sgPSBqbF9jbiA7Ci0gICAgICB9Ci0gICAgICBqbF9jbi0+cHJldiA9IGxhc3RfY24gOwotICAgICAgamxfY24tPm5leHQgPSBOVUxMIDsKLSAgICAgIGlmIChsYXN0X2NuKSB7Ci0gICAgICAgIGxhc3RfY24tPm5leHQgPSBqbF9jbiA7Ci0gICAgICB9Ci0gICAgICBsYXN0X2NuID0gamxfY24gOwotICAgICAgLyogbWFrZSBzdXJlIHRoZSBibG9jayB3ZSBhcmUgdHJ5aW5nIHRvIGxvZyBpcyBub3QgYSBibG9jayAKLSAgICAgICAgIG9mIGpvdXJuYWwgb3IgcmVzZXJ2ZWQgYXJlYSAqLworCWF0b21pY19zZXQoJmpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSwgMCk7CisJamwtPmpfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOworCWpsLT5qX3RpbWVzdGFtcCA9IGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZTsKKwlqbC0+al9jb21taXRfYmggPSBjX2JoOworCWpsLT5qX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydDsKKwlqbC0+al9sZW4gPSBqb3VybmFsLT5qX2xlbjsKKwlhdG9taWNfc2V0KCZqbC0+al9ub256ZXJvbGVuLCBqb3VybmFsLT5qX2xlbik7CisJYXRvbWljX3NldCgmamwtPmpfY29tbWl0X2xlZnQsIGpvdXJuYWwtPmpfbGVuICsgMik7CisJamwtPmpfcmVhbGJsb2NrID0gTlVMTDsKIAotICAgICAgaWYgKGlzX2Jsb2NrX2luX2xvZ19vcl9yZXNlcnZlZF9hcmVhKHBfc19zYiwgY24tPmJoLT5iX2Jsb2NrbnIpKSB7Ci0gICAgICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgImpvdXJuYWwtMjMzMjogVHJ5aW5nIHRvIGxvZyBibG9jayAlbHUsIHdoaWNoIGlzIGEgbG9nIGJsb2NrXG4iLCBjbi0+YmgtPmJfYmxvY2tucikgOwotICAgICAgfQotICAgICAgamxfY24tPmJsb2NrbnIgPSBjbi0+YmgtPmJfYmxvY2tuciA7IAotICAgICAgamxfY24tPnN0YXRlID0gMCA7Ci0gICAgICBqbF9jbi0+c2IgPSBwX3Nfc2I7Ci0gICAgICBqbF9jbi0+YmggPSBjbi0+YmggOwotICAgICAgamxfY24tPmpsaXN0ID0gamw7Ci0gICAgICBpbnNlcnRfam91cm5hbF9oYXNoKGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCBqbF9jbikgOwotICAgICAgaWYgKGkgPCB0cmFuc19oYWxmKSB7Ci0JZGVzYy0+al9yZWFsYmxvY2tbaV0gPSBjcHVfdG9fbGUzMihjbi0+YmgtPmJfYmxvY2tucikgOwotICAgICAgfSBlbHNlIHsKLQljb21taXQtPmpfcmVhbGJsb2NrW2kgLSB0cmFuc19oYWxmXSA9IGNwdV90b19sZTMyKGNuLT5iaC0+Yl9ibG9ja25yKSA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGktLSA7Ci0gICAgfQotICB9Ci0gIHNldF9kZXNjX3RyYW5zX2xlbihkZXNjLCBqb3VybmFsLT5qX2xlbikgOwotICBzZXRfZGVzY19tb3VudF9pZChkZXNjLCBqb3VybmFsLT5qX21vdW50X2lkKSA7Ci0gIHNldF9kZXNjX3RyYW5zX2lkKGRlc2MsIGpvdXJuYWwtPmpfdHJhbnNfaWQpIDsKLSAgc2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0LCBqb3VybmFsLT5qX2xlbik7CisJLyogVGhlIEVOVElSRSBGT1IgTE9PUCBNVVNUIG5vdCBjYXVzZSBzY2hlZHVsZSB0byBvY2N1ci4KKwkgKiogIGZvciBlYWNoIHJlYWwgYmxvY2ssIGFkZCBpdCB0byB0aGUgam91cm5hbCBsaXN0IGhhc2gsCisJICoqIGNvcHkgaW50byByZWFsIGJsb2NrIGluZGV4IGFycmF5IGluIHRoZSBjb21taXQgb3IgZGVzYyBibG9jaworCSAqLworCXRyYW5zX2hhbGYgPSBqb3VybmFsX3RyYW5zX2hhbGYocF9zX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJZm9yIChpID0gMCwgY24gPSBqb3VybmFsLT5qX2ZpcnN0OyBjbjsgY24gPSBjbi0+bmV4dCwgaSsrKSB7CisJCWlmIChidWZmZXJfam91cm5hbGVkKGNuLT5iaCkpIHsKKwkJCWpsX2NuID0gZ2V0X2Nub2RlKHBfc19zYik7CisJCQlpZiAoIWpsX2NuKSB7CisJCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCQkgICAgICAgImpvdXJuYWwtMTY3NiwgZ2V0X2Nub2RlIHJldHVybmVkIE5VTExcbiIpOworCQkJfQorCQkJaWYgKGkgPT0gMCkgeworCQkJCWpsLT5qX3JlYWxibG9jayA9IGpsX2NuOworCQkJfQorCQkJamxfY24tPnByZXYgPSBsYXN0X2NuOworCQkJamxfY24tPm5leHQgPSBOVUxMOworCQkJaWYgKGxhc3RfY24pIHsKKwkJCQlsYXN0X2NuLT5uZXh0ID0gamxfY247CisJCQl9CisJCQlsYXN0X2NuID0gamxfY247CisJCQkvKiBtYWtlIHN1cmUgdGhlIGJsb2NrIHdlIGFyZSB0cnlpbmcgdG8gbG9nIGlzIG5vdCBhIGJsb2NrIAorCQkJICAgb2Ygam91cm5hbCBvciByZXNlcnZlZCBhcmVhICovCiAKLSAgLyogc3BlY2lhbCBjaGVjayBpbiBjYXNlIGFsbCBidWZmZXJzIGluIHRoZSBqb3VybmFsIHdlcmUgbWFya2VkIGZvciBub3QgbG9nZ2luZyAqLwotICBpZiAoam91cm5hbC0+al9sZW4gPT0gMCkgewotICAgIEJVRygpOwotICB9CisJCQlpZiAoaXNfYmxvY2tfaW5fbG9nX29yX3Jlc2VydmVkX2FyZWEKKwkJCSAgICAocF9zX3NiLCBjbi0+YmgtPmJfYmxvY2tucikpIHsKKwkJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJCSAgICAgICAiam91cm5hbC0yMzMyOiBUcnlpbmcgdG8gbG9nIGJsb2NrICVsdSwgd2hpY2ggaXMgYSBsb2cgYmxvY2tcbiIsCisJCQkJCSAgICAgICBjbi0+YmgtPmJfYmxvY2tucik7CisJCQl9CisJCQlqbF9jbi0+YmxvY2tuciA9IGNuLT5iaC0+Yl9ibG9ja25yOworCQkJamxfY24tPnN0YXRlID0gMDsKKwkJCWpsX2NuLT5zYiA9IHBfc19zYjsKKwkJCWpsX2NuLT5iaCA9IGNuLT5iaDsKKwkJCWpsX2NuLT5qbGlzdCA9IGpsOworCQkJaW5zZXJ0X2pvdXJuYWxfaGFzaChqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgamxfY24pOworCQkJaWYgKGkgPCB0cmFuc19oYWxmKSB7CisJCQkJZGVzYy0+al9yZWFsYmxvY2tbaV0gPQorCQkJCSAgICBjcHVfdG9fbGUzMihjbi0+YmgtPmJfYmxvY2tucik7CisJCQl9IGVsc2UgeworCQkJCWNvbW1pdC0+al9yZWFsYmxvY2tbaSAtIHRyYW5zX2hhbGZdID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoY24tPmJoLT5iX2Jsb2NrbnIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaS0tOworCQl9CisJfQorCXNldF9kZXNjX3RyYW5zX2xlbihkZXNjLCBqb3VybmFsLT5qX2xlbik7CisJc2V0X2Rlc2NfbW91bnRfaWQoZGVzYywgam91cm5hbC0+al9tb3VudF9pZCk7CisJc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCk7CisJc2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0LCBqb3VybmFsLT5qX2xlbik7CiAKLSAgLyogd2UncmUgYWJvdXQgdG8gZGlydHkgYWxsIHRoZSBsb2cgYmxvY2tzLCBtYXJrIHRoZSBkZXNjcmlwdGlvbiBibG9jawotICAgKiBkaXJ0eSBub3cgdG9vLiAgRG9uJ3QgbWFyayB0aGUgY29tbWl0IGJsb2NrIGRpcnR5IHVudGlsIGFsbCB0aGUKLSAgICogb3RoZXJzIGFyZSBvbiBkaXNrCi0gICAqLwotICBtYXJrX2J1ZmZlcl9kaXJ0eShkX2JoKTsKKwkvKiBzcGVjaWFsIGNoZWNrIGluIGNhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIGpvdXJuYWwgd2VyZSBtYXJrZWQgZm9yIG5vdCBsb2dnaW5nICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKwkJQlVHKCk7CisJfQogCi0gIC8qIGZpcnN0IGRhdGEgYmxvY2sgaXMgal9zdGFydCArIDEsIHNvIGFkZCBvbmUgdG8gY3VyX3dyaXRlX3N0YXJ0IHdoZXJldmVyIHlvdSB1c2UgaXQgKi8KLSAgY3VyX3dyaXRlX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydCA7Ci0gIGNuID0gam91cm5hbC0+al9maXJzdCA7Ci0gIGppbmRleCA9IDEgOyAvKiBzdGFydCBhdCBvbmUgc28gd2UgZG9uJ3QgZ2V0IHRoZSBkZXNjIGFnYWluICovCi0gIHdoaWxlKGNuKSB7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChjbi0+YmgpOwotICAgIC8qIGNvcHkgYWxsIHRoZSByZWFsIGJsb2NrcyBpbnRvIGxvZyBhcmVhLiAgZGlydHkgbG9nIGJsb2NrcyAqLwotICAgIGlmIChidWZmZXJfam91cm5hbGVkIChjbi0+YmgpKSB7Ci0gICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcF9iaCA7Ci0gICAgICBjaGFyICphZGRyOwotICAgICAgc3RydWN0IHBhZ2UgKnBhZ2U7Ci0gICAgICB0bXBfYmggPSAgam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIAotCQkgICAgICAgKChjdXJfd3JpdGVfc3RhcnQgKyBqaW5kZXgpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSkgOwotICAgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZSh0bXBfYmgpOwotICAgICAgcGFnZSA9IGNuLT5iaC0+Yl9wYWdlOwotICAgICAgYWRkciA9IGttYXAocGFnZSk7Ci0gICAgICBtZW1jcHkodG1wX2JoLT5iX2RhdGEsIGFkZHIgKyBvZmZzZXRfaW5fcGFnZShjbi0+YmgtPmJfZGF0YSksCi0gICAgICAgICAgICAgY24tPmJoLT5iX3NpemUpOwotICAgICAga3VubWFwKHBhZ2UpOwotICAgICAgbWFya19idWZmZXJfZGlydHkodG1wX2JoKTsKLSAgICAgIGppbmRleCsrIDsKLSAgICAgIHNldF9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKTsKLSAgICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsZWQgKGNuLT5iaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEpEaXJ0eSBjbGVhcmVkIHNvbWV0aW1lIGR1cmluZyB0cmFuc2FjdGlvbi4gIGRvbid0IGxvZyB0aGlzIG9uZSAqLwotICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTIwNDg6IGRvX2pvdXJuYWxfZW5kOiBCQUQsIGJ1ZmZlciBpbiBqb3VybmFsIGhhc2gsIGJ1dCBub3QgSkRpcnR5ISIpIDsKLSAgICAgIGJyZWxzZShjbi0+YmgpIDsKLSAgICB9Ci0gICAgbmV4dCA9IGNuLT5uZXh0IDsKLSAgICBmcmVlX2Nub2RlKHBfc19zYiwgY24pIDsKLSAgICBjbiA9IG5leHQgOwotICAgIGNvbmRfcmVzY2hlZCgpOwotICB9CisJLyogd2UncmUgYWJvdXQgdG8gZGlydHkgYWxsIHRoZSBsb2cgYmxvY2tzLCBtYXJrIHRoZSBkZXNjcmlwdGlvbiBibG9jaworCSAqIGRpcnR5IG5vdyB0b28uICBEb24ndCBtYXJrIHRoZSBjb21taXQgYmxvY2sgZGlydHkgdW50aWwgYWxsIHRoZQorCSAqIG90aGVycyBhcmUgb24gZGlzaworCSAqLworCW1hcmtfYnVmZmVyX2RpcnR5KGRfYmgpOwogCi0gIC8qIHdlIGFyZSBkb25lICB3aXRoIGJvdGggdGhlIGNfYmggYW5kIGRfYmgsIGJ1dAotICAqKiBjX2JoIG11c3QgYmUgd3JpdHRlbiBhZnRlciBhbGwgb3RoZXIgY29tbWl0IGJsb2NrcywKLSAgKiogc28gd2UgZGlydHkvcmVsc2UgY19iaCBpbiBmbHVzaF9jb21taXRfbGlzdCwgd2l0aCBjb21taXRfbGVmdCA8PSAxLgotICAqLworCS8qIGZpcnN0IGRhdGEgYmxvY2sgaXMgal9zdGFydCArIDEsIHNvIGFkZCBvbmUgdG8gY3VyX3dyaXRlX3N0YXJ0IHdoZXJldmVyIHlvdSB1c2UgaXQgKi8KKwljdXJfd3JpdGVfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0OworCWNuID0gam91cm5hbC0+al9maXJzdDsKKwlqaW5kZXggPSAxOwkJLyogc3RhcnQgYXQgb25lIHNvIHdlIGRvbid0IGdldCB0aGUgZGVzYyBhZ2FpbiAqLworCXdoaWxlIChjbikgeworCQljbGVhcl9idWZmZXJfam91cm5hbF9uZXcoY24tPmJoKTsKKwkJLyogY29weSBhbGwgdGhlIHJlYWwgYmxvY2tzIGludG8gbG9nIGFyZWEuICBkaXJ0eSBsb2cgYmxvY2tzICovCisJCWlmIChidWZmZXJfam91cm5hbGVkKGNuLT5iaCkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wX2JoOworCQkJY2hhciAqYWRkcjsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOworCQkJdG1wX2JoID0KKwkJCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkJCSAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCQkJICAgKChjdXJfd3JpdGVfc3RhcnQgKworCQkJCQkgICAgIGppbmRleCkgJQorCQkJCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKHRtcF9iaCk7CisJCQlwYWdlID0gY24tPmJoLT5iX3BhZ2U7CisJCQlhZGRyID0ga21hcChwYWdlKTsKKwkJCW1lbWNweSh0bXBfYmgtPmJfZGF0YSwKKwkJCSAgICAgICBhZGRyICsgb2Zmc2V0X2luX3BhZ2UoY24tPmJoLT5iX2RhdGEpLAorCQkJICAgICAgIGNuLT5iaC0+Yl9zaXplKTsKKwkJCWt1bm1hcChwYWdlKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KHRtcF9iaCk7CisJCQlqaW5kZXgrKzsKKwkJCXNldF9idWZmZXJfam91cm5hbF9kaXJ0eShjbi0+YmgpOworCQkJY2xlYXJfYnVmZmVyX2pvdXJuYWxlZChjbi0+YmgpOworCQl9IGVsc2UgeworCQkJLyogSkRpcnR5IGNsZWFyZWQgc29tZXRpbWUgZHVyaW5nIHRyYW5zYWN0aW9uLiAgZG9uJ3QgbG9nIHRoaXMgb25lICovCisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTIwNDg6IGRvX2pvdXJuYWxfZW5kOiBCQUQsIGJ1ZmZlciBpbiBqb3VybmFsIGhhc2gsIGJ1dCBub3QgSkRpcnR5ISIpOworCQkJYnJlbHNlKGNuLT5iaCk7CisJCX0KKwkJbmV4dCA9IGNuLT5uZXh0OworCQlmcmVlX2Nub2RlKHBfc19zYiwgY24pOworCQljbiA9IG5leHQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KIAotICBqb3VybmFsLT5qX2N1cnJlbnRfamwgPSBhbGxvY19qb3VybmFsX2xpc3QocF9zX3NiKTsKKwkvKiB3ZSBhcmUgZG9uZSAgd2l0aCBib3RoIHRoZSBjX2JoIGFuZCBkX2JoLCBidXQKKwkgKiogY19iaCBtdXN0IGJlIHdyaXR0ZW4gYWZ0ZXIgYWxsIG90aGVyIGNvbW1pdCBibG9ja3MsCisJICoqIHNvIHdlIGRpcnR5L3JlbHNlIGNfYmggaW4gZmx1c2hfY29tbWl0X2xpc3QsIHdpdGggY29tbWl0X2xlZnQgPD0gMS4KKwkgKi8KIAotICAvKiBub3cgaXQgaXMgc2FmZSB0byBpbnNlcnQgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgbWFpbiBsaXN0ICovCi0gIGxpc3RfYWRkX3RhaWwoJmpsLT5qX2xpc3QsICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCk7Ci0gIGxpc3RfYWRkX3RhaWwoJmpsLT5qX3dvcmtpbmdfbGlzdCwgJmpvdXJuYWwtPmpfd29ya2luZ19saXN0KTsKLSAgam91cm5hbC0+al9udW1fd29ya19saXN0cysrOworCWpvdXJuYWwtPmpfY3VycmVudF9qbCA9IGFsbG9jX2pvdXJuYWxfbGlzdChwX3Nfc2IpOwogCi0gIC8qIHJlc2V0IGpvdXJuYWwgdmFsdWVzIGZvciB0aGUgbmV4dCB0cmFuc2FjdGlvbiAqLwotICBvbGRfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKLSAgam91cm5hbC0+al9zdGFydCA9IChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al9sZW4gKyAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKTsKLSAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfd2NvdW50KSwgMCkgOwotICBqb3VybmFsLT5qX2Jjb3VudCA9IDAgOwotICBqb3VybmFsLT5qX2xhc3QgPSBOVUxMIDsKLSAgam91cm5hbC0+al9maXJzdCA9IE5VTEwgOwotICBqb3VybmFsLT5qX2xlbiA9IDAgOwotICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSAwIDsKLSAgam91cm5hbC0+al90cmFuc19pZCsrIDsKLSAgam91cm5hbC0+al9jdXJyZW50X2psLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKLSAgam91cm5hbC0+al9tdXN0X3dhaXQgPSAwIDsKLSAgam91cm5hbC0+al9sZW5fYWxsb2MgPSAwIDsKLSAgam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2ggPSAwIDsKLSAgam91cm5hbC0+al9uZXh0X2FzeW5jX2ZsdXNoID0gMCA7Ci0gIGluaXRfam91cm5hbF9oYXNoKHBfc19zYikgOyAKKwkvKiBub3cgaXQgaXMgc2FmZSB0byBpbnNlcnQgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgbWFpbiBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmamwtPmpfbGlzdCwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZqbC0+al93b3JraW5nX2xpc3QsICZqb3VybmFsLT5qX3dvcmtpbmdfbGlzdCk7CisJam91cm5hbC0+al9udW1fd29ya19saXN0cysrOwogCi0gIC8vIG1ha2Ugc3VyZSByZWlzZXJmc19hZGRfamggc2VlcyB0aGUgbmV3IGN1cnJlbnRfamwgYmVmb3JlIHdlCi0gIC8vIHdyaXRlIG91dCB0aGUgdGFpbHMKLSAgc21wX21iKCk7CisJLyogcmVzZXQgam91cm5hbCB2YWx1ZXMgZm9yIHRoZSBuZXh0IHRyYW5zYWN0aW9uICovCisJb2xkX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydDsKKwlqb3VybmFsLT5qX3N0YXJ0ID0KKwkgICAgKGpvdXJuYWwtPmpfc3RhcnQgKyBqb3VybmFsLT5qX2xlbiArCisJICAgICAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKTsKKwlhdG9taWNfc2V0KCYoam91cm5hbC0+al93Y291bnQpLCAwKTsKKwlqb3VybmFsLT5qX2Jjb3VudCA9IDA7CisJam91cm5hbC0+al9sYXN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2xlbiA9IDA7CisJam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gMDsKKwlqb3VybmFsLT5qX3RyYW5zX2lkKys7CisJam91cm5hbC0+al9jdXJyZW50X2psLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKKwlqb3VybmFsLT5qX211c3Rfd2FpdCA9IDA7CisJam91cm5hbC0+al9sZW5fYWxsb2MgPSAwOworCWpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoID0gMDsKKwlqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAwOworCWluaXRfam91cm5hbF9oYXNoKHBfc19zYik7CiAKLSAgLyogdGFpbCBjb252ZXJzaW9uIHRhcmdldHMgaGF2ZSB0byBoaXQgdGhlIGRpc2sgYmVmb3JlIHdlIGVuZCB0aGUKLSAgICogdHJhbnNhY3Rpb24uICBPdGhlcndpc2UgYSBsYXRlciB0cmFuc2FjdGlvbiBtaWdodCByZXBhY2sgdGhlIHRhaWwKLSAgICogYmVmb3JlIHRoaXMgdHJhbnNhY3Rpb24gY29tbWl0cywgbGVhdmluZyB0aGUgZGF0YSBibG9jayB1bmZsdXNoZWQgYW5kCi0gICAqIGNsZWFuLCBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIGxhdGVyIHRyYW5zYWN0aW9uIGNvbW1pdHMsIHRoZSBkYXRhIGJsb2NrCi0gICAqIGlzIGxvc3QuCi0gICAqLwotICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpIHsKLSAgICAgIHVubG9ja19rZXJuZWwoKTsKLSAgICAgIHdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCi0JCQkgICAgam91cm5hbCwgamwsICZqbC0+al90YWlsX2JoX2xpc3QpOwotICAgICAgbG9ja19rZXJuZWwoKTsKLSAgfQotICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpCi0gICAgICBCVUcoKTsKLSAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKKwkvLyBtYWtlIHN1cmUgcmVpc2VyZnNfYWRkX2poIHNlZXMgdGhlIG5ldyBjdXJyZW50X2psIGJlZm9yZSB3ZQorCS8vIHdyaXRlIG91dCB0aGUgdGFpbHMKKwlzbXBfbWIoKTsKIAotICAvKiBob25vciB0aGUgZmx1c2ggd2lzaGVzIGZyb20gdGhlIGNhbGxlciwgc2ltcGxlIGNvbW1pdHMgY2FuCi0gICoqIGJlIGRvbmUgb3V0c2lkZSB0aGUgam91cm5hbCBsb2NrLCB0aGV5IGFyZSBkb25lIGJlbG93Ci0gICoqCi0gICoqIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBjb21taXQgbGlzdCByaWdodCBub3csIHdlIHB1dCBpdCBpbnRvCi0gICoqIHRoZSB3b3JrIHF1ZXVlIHNvIHRoZSBwZW9wbGUgd2FpdGluZyBvbiB0aGUgYXN5bmMgcHJvZ3Jlc3Mgd29yawotICAqKiBxdWV1ZSBkb24ndCB3YWl0IGZvciB0aGlzIHByb2MgdG8gZmx1c2ggam91cm5hbCBsaXN0cyBhbmQgc3VjaC4KLSAgKi8KLSAgaWYgKGZsdXNoKSB7Ci0gICAgZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSkgOwotICAgIGZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIGpsLCAxKSA7Ci0gIH0gZWxzZSBpZiAoIShqbC0+al9zdGF0ZSAmIExJU1RfQ09NTUlUX1BFTkRJTkcpKQotICAgIHF1ZXVlX2RlbGF5ZWRfd29yayhjb21taXRfd3EsICZqb3VybmFsLT5qX3dvcmssIEhaLzEwKTsKKwkvKiB0YWlsIGNvbnZlcnNpb24gdGFyZ2V0cyBoYXZlIHRvIGhpdCB0aGUgZGlzayBiZWZvcmUgd2UgZW5kIHRoZQorCSAqIHRyYW5zYWN0aW9uLiAgT3RoZXJ3aXNlIGEgbGF0ZXIgdHJhbnNhY3Rpb24gbWlnaHQgcmVwYWNrIHRoZSB0YWlsCisJICogYmVmb3JlIHRoaXMgdHJhbnNhY3Rpb24gY29tbWl0cywgbGVhdmluZyB0aGUgZGF0YSBibG9jayB1bmZsdXNoZWQgYW5kCisJICogY2xlYW4sIGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgbGF0ZXIgdHJhbnNhY3Rpb24gY29tbWl0cywgdGhlIGRhdGEgYmxvY2sKKwkgKiBpcyBsb3N0LgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmamwtPmpfdGFpbF9iaF9saXN0KSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCisJCQkJICAgICAgam91cm5hbCwgamwsICZqbC0+al90YWlsX2JoX2xpc3QpOworCQlsb2NrX2tlcm5lbCgpOworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpCisJCUJVRygpOworCXVwKCZqbC0+al9jb21taXRfbG9jayk7CiAKKwkvKiBob25vciB0aGUgZmx1c2ggd2lzaGVzIGZyb20gdGhlIGNhbGxlciwgc2ltcGxlIGNvbW1pdHMgY2FuCisJICoqIGJlIGRvbmUgb3V0c2lkZSB0aGUgam91cm5hbCBsb2NrLCB0aGV5IGFyZSBkb25lIGJlbG93CisJICoqCisJICoqIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBjb21taXQgbGlzdCByaWdodCBub3csIHdlIHB1dCBpdCBpbnRvCisJICoqIHRoZSB3b3JrIHF1ZXVlIHNvIHRoZSBwZW9wbGUgd2FpdGluZyBvbiB0aGUgYXN5bmMgcHJvZ3Jlc3Mgd29yaworCSAqKiBxdWV1ZSBkb24ndCB3YWl0IGZvciB0aGlzIHByb2MgdG8gZmx1c2ggam91cm5hbCBsaXN0cyBhbmQgc3VjaC4KKwkgKi8KKwlpZiAoZmx1c2gpIHsKKwkJZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSk7CisJCWZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIGpsLCAxKTsKKwl9IGVsc2UgaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0NPTU1JVF9QRU5ESU5HKSkKKwkJcXVldWVfZGVsYXllZF93b3JrKGNvbW1pdF93cSwgJmpvdXJuYWwtPmpfd29yaywgSFogLyAxMCk7CiAKLSAgLyogaWYgdGhlIG5leHQgdHJhbnNhY3Rpb24gaGFzIGFueSBjaGFuY2Ugb2Ygd3JhcHBpbmcsIGZsdXNoIAotICAqKiB0cmFuc2FjdGlvbnMgdGhhdCBtaWdodCBnZXQgb3ZlcndyaXR0ZW4uICBJZiBhbnkgam91cm5hbCBsaXN0cyBhcmUgdmVyeSAKLSAgKiogb2xkIGZsdXNoIHRoZW0gYXMgd2VsbC4gIAotICAqLwotZmlyc3Rfamw6Ci0gIGxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgc2FmZSwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7Ci0gICAgdGVtcF9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7Ci0gICAgaWYgKGpvdXJuYWwtPmpfc3RhcnQgPD0gdGVtcF9qbC0+al9zdGFydCkgewotICAgICAgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA+PQotICAgICAgICAgIHRlbXBfamwtPmpfc3RhcnQpCi0gICAgICB7Ci0JZmx1c2hfdXNlZF9qb3VybmFsX2xpc3RzKHBfc19zYiwgdGVtcF9qbCk7Ci0JZ290byBmaXJzdF9qbDsKLSAgICAgIH0gZWxzZSBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKwotICAgICAgICAgICAgICAgICAgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA8Ci0JCSAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKQotICAgICAgewotICAgICAgICAgIC8qIGlmIHdlIGRvbid0IGNyb3NzIGludG8gdGhlIG5leHQgdHJhbnNhY3Rpb24gYW5kIHdlIGRvbid0Ci0JICAgKiB3cmFwLCB0aGVyZSBpcyBubyB3YXkgd2UgY2FuIG92ZXJsYXAgYW55IGxhdGVyIHRyYW5zYWN0aW9ucwotCSAgICogYnJlYWsgbm93Ci0JICAgKi8KLQkgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKwotICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgPgotCQlTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpCi0gICAgewotICAgICAgaWYgKCgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgJQotICAgICAgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSA+PSB0ZW1wX2psLT5qX3N0YXJ0KQotICAgICAgewotCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOwotCWdvdG8gZmlyc3Rfamw7Ci0gICAgICB9IGVsc2UgewotCSAgLyogd2UgZG9uJ3Qgb3ZlcmxhcCBhbnl0aGluZyBmcm9tIG91dCBzdGFydCB0byB0aGUgZW5kIG9mIHRoZQotCSAgICogbG9nLCBhbmQgb3VyIHdyYXBwZWQgcG9ydGlvbiBkb2Vzbid0IG92ZXJsYXAgYW55dGhpbmcgYXQKLQkgICAqIHRoZSBzdGFydCBvZiB0aGUgbG9nLiAgV2UgY2FuIGJyZWFrCi0JICAgKi8KLQkgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBmbHVzaF9vbGRfam91cm5hbF9saXN0cyhwX3Nfc2IpOworCS8qIGlmIHRoZSBuZXh0IHRyYW5zYWN0aW9uIGhhcyBhbnkgY2hhbmNlIG9mIHdyYXBwaW5nLCBmbHVzaCAKKwkgKiogdHJhbnNhY3Rpb25zIHRoYXQgbWlnaHQgZ2V0IG92ZXJ3cml0dGVuLiAgSWYgYW55IGpvdXJuYWwgbGlzdHMgYXJlIHZlcnkgCisJICoqIG9sZCBmbHVzaCB0aGVtIGFzIHdlbGwuICAKKwkgKi8KKyAgICAgIGZpcnN0X2psOgorCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgc2FmZSwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7CisJCXRlbXBfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCQlpZiAoam91cm5hbC0+al9zdGFydCA8PSB0ZW1wX2psLT5qX3N0YXJ0KSB7CisJCQlpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKyBqb3VybmFsLT5qX3RyYW5zX21heCArIDEpID49CisJCQkgICAgdGVtcF9qbC0+al9zdGFydCkgeworCQkJCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOworCQkJCWdvdG8gZmlyc3Rfamw7CisJCQl9IGVsc2UgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsKKwkJCQkgICAgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA8CisJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7CisJCQkJLyogaWYgd2UgZG9uJ3QgY3Jvc3MgaW50byB0aGUgbmV4dCB0cmFuc2FjdGlvbiBhbmQgd2UgZG9uJ3QKKwkJCQkgKiB3cmFwLCB0aGVyZSBpcyBubyB3YXkgd2UgY2FuIG92ZXJsYXAgYW55IGxhdGVyIHRyYW5zYWN0aW9ucworCQkJCSAqIGJyZWFrIG5vdworCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsKKwkJCSAgICBqb3VybmFsLT5qX3RyYW5zX21heCArIDEpID4KKwkJCSAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkgeworCQkJaWYgKCgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgJQorCQkJICAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpID49CisJCQkgICAgdGVtcF9qbC0+al9zdGFydCkgeworCQkJCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOworCQkJCWdvdG8gZmlyc3Rfamw7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGRvbid0IG92ZXJsYXAgYW55dGhpbmcgZnJvbSBvdXQgc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUKKwkJCQkgKiBsb2csIGFuZCBvdXIgd3JhcHBlZCBwb3J0aW9uIGRvZXNuJ3Qgb3ZlcmxhcCBhbnl0aGluZyBhdAorCQkJCSAqIHRoZSBzdGFydCBvZiB0aGUgbG9nLiAgV2UgY2FuIGJyZWFrCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZmx1c2hfb2xkX2pvdXJuYWxfbGlzdHMocF9zX3NiKTsKIAotICBqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXAgPSBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqb3VybmFsLT5qX2N1cnJlbnRfamwpIDsKKwlqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXAgPQorCSAgICBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqb3VybmFsLT5qX2N1cnJlbnRfamwpOwogCi0gIGlmICghKGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcCkpIHsKLSAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJqb3VybmFsLTE5OTY6IGRvX2pvdXJuYWxfZW5kLCBjb3VsZCBub3QgZ2V0IGEgbGlzdCBiaXRtYXBcbiIpIDsKLSAgfQorCWlmICghKGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcCkpIHsKKwkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJICAgICAgICJqb3VybmFsLTE5OTY6IGRvX2pvdXJuYWxfZW5kLCBjb3VsZCBub3QgZ2V0IGEgbGlzdCBiaXRtYXBcbiIpOworCX0KIAotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDApIDsKLSAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gIC8qIHdha2UgdXAgYW55IGJvZHkgd2FpdGluZyB0byBqb2luLiAqLwotICBjbGVhcl9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOwotICB3YWtlX3VwKCYoam91cm5hbC0+al9qb2luX3dhaXQpKSA7CisJYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAwKTsKKwl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCS8qIHdha2UgdXAgYW55IGJvZHkgd2FpdGluZyB0byBqb2luLiAqLworCWNsZWFyX2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSk7CisJd2FrZV91cCgmKGpvdXJuYWwtPmpfam9pbl93YWl0KSk7CiAKLSAgaWYgKCFmbHVzaCAmJiB3YWl0X29uX2NvbW1pdCAmJgotICAgICAgam91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHBfc19zYiwgY29tbWl0X3RyYW5zX2lkKSkgewotCSAgZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSkgOwotICB9Ci1vdXQ6Ci0gIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiam91cm5hbCBlbmQyIik7CisJaWYgKCFmbHVzaCAmJiB3YWl0X29uX2NvbW1pdCAmJgorCSAgICBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocF9zX3NiLCBjb21taXRfdHJhbnNfaWQpKSB7CisJCWZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpOworCX0KKyAgICAgIG91dDoKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWwgZW5kMiIpOwogCi0gIG1lbXNldCAodGgsIDAsIHNpemVvZiAoKnRoKSk7Ci0gIC8qIFJlLXNldCB0aC0+dF9zdXBlciwgc28gd2UgY2FuIHByb3Blcmx5IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLSAgICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcwotICAgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2I7CisJbWVtc2V0KHRoLCAwLCBzaXplb2YoKnRoKSk7CisJLyogUmUtc2V0IHRoLT50X3N1cGVyLCBzbyB3ZSBjYW4gcHJvcGVybHkga2VlcCB0cmFjayBvZiBob3cgbWFueQorCSAqIHBlcnNpc3RlbnQgdHJhbnNhY3Rpb25zIHRoZXJlIGFyZS4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIGlmIHRoaXMKKwkgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KKwl0aC0+dF9zdXBlciA9IHBfc19zYjsKIAotICByZXR1cm4gam91cm5hbC0+al9lcnJubzsKKwlyZXR1cm4gam91cm5hbC0+al9lcnJubzsKIH0KIAotc3RhdGljIHZvaWQKLV9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9oYXJkIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIHZvaWQgX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X2hhcmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHNiKTsKLSAgICBpZiAodGVzdF9iaXQgKEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQotICAgICAgICByZXR1cm47CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHNiKTsKKwlpZiAodGVzdF9iaXQoSl9BQk9SVEVELCAmam91cm5hbC0+al9zdGF0ZSkpCisJCXJldHVybjsKIAotICAgIHByaW50ayAoS0VSTl9DUklUICJSRUlTRVJGUzogQWJvcnRpbmcgam91cm5hbCBmb3IgZmlsZXN5c3RlbSBvbiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpKTsKKwlwcmludGsoS0VSTl9DUklUICJSRUlTRVJGUzogQWJvcnRpbmcgam91cm5hbCBmb3IgZmlsZXN5c3RlbSBvbiAlc1xuIiwKKwkgICAgICAgcmVpc2VyZnNfYmRldm5hbWUoc2IpKTsKIAotICAgIHNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKLSAgICBzZXRfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKTsKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJc2V0X2JpdChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGR1bXBfc3RhY2soKTsKKwlkdW1wX3N0YWNrKCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQKLV9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9zb2Z0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCitzdGF0aWMgdm9pZCBfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfc29mdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgaWYgKHRlc3RfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKSkKLSAgICAgICAgcmV0dXJuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzYik7CisJaWYgKHRlc3RfYml0KEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorCQlyZXR1cm47CiAKLSAgICBpZiAoIWpvdXJuYWwtPmpfZXJybm8pCi0gICAgICAgIGpvdXJuYWwtPmpfZXJybm8gPSBlcnJubzsKKwlpZiAoIWpvdXJuYWwtPmpfZXJybm8pCisJCWpvdXJuYWwtPmpfZXJybm8gPSBlcnJubzsKIAotICAgIF9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9oYXJkIChzYik7CisJX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X2hhcmQoc2IpOwogfQogCi12b2lkCi1yZWlzZXJmc19qb3VybmFsX2Fib3J0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCit2b2lkIHJlaXNlcmZzX2pvdXJuYWxfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vKQogewotICAgIHJldHVybiBfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfc29mdCAoc2IsIGVycm5vKTsKKwlyZXR1cm4gX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X3NvZnQoc2IsIGVycm5vKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMgYi9mcy9yZWlzZXJmcy9sYmFsYW5jZS5jCmluZGV4IDI0MDY2MDguLjI1MzNjMWYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMKKysrIGIvZnMvcmVpc2VyZnMvbGJhbGFuY2UuYwpAQCAtMjEsNjQ4ICsyMSw3MDkgQEAKICAgIGxlYWZfcGFzdGVfZW50cmllcwogICAgKi8KIAotCiAvKiBjb3B5IGNvcHlfY291bnQgZW50cmllcyBmcm9tIHNvdXJjZSBkaXJlY3RvcnkgaXRlbSB0byBkZXN0IGJ1ZmZlciAoY3JlYXRpbmcgbmV3IGl0ZW0gaWYgbmVlZGVkKSAqLwotc3RhdGljIHZvaWQgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzb3VyY2UsIAotCQkJCSAgIGludCBsYXN0X2ZpcnN0LCBpbnQgaXRlbV9udW0sIGludCBmcm9tLCBpbnQgY29weV9jb3VudCkKK3N0YXRpYyB2b2lkIGxlYWZfY29weV9kaXJfZW50cmllcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNvdXJjZSwgaW50IGxhc3RfZmlyc3QsCisJCQkJICBpbnQgaXRlbV9udW0sIGludCBmcm9tLCBpbnQgY29weV9jb3VudCkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7Ci0gICAgaW50IGl0ZW1fbnVtX2luX2Rlc3Q7CQkvKiBlaXRoZXIgdGhlIG51bWJlciBvZiB0YXJnZXQgaXRlbSwKLQkJCQkJICAgb3IgaWYgd2UgbXVzdCBjcmVhdGUgYSBuZXcgaXRlbSwKLQkJCQkJICAgdGhlIG51bWJlciBvZiB0aGUgaXRlbSB3ZSB3aWxsCi0JCQkJCSAgIGNyZWF0ZSBpdCBuZXh0IHRvICovCi0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOwotICAgIGludCBjb3B5X3JlY29yZHNfbGVuOwkJCS8qIGxlbmd0aCBvZiBhbGwgcmVjb3JkcyBpbiBpdGVtIHRvIGJlIGNvcGllZCAqLwotICAgIGNoYXIgKiByZWNvcmRzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdCA9IGRlc3RfYmktPmJpX2JoOworCWludCBpdGVtX251bV9pbl9kZXN0OwkvKiBlaXRoZXIgdGhlIG51bWJlciBvZiB0YXJnZXQgaXRlbSwKKwkJCQkgICBvciBpZiB3ZSBtdXN0IGNyZWF0ZSBhIG5ldyBpdGVtLAorCQkJCSAgIHRoZSBudW1iZXIgb2YgdGhlIGl0ZW0gd2Ugd2lsbAorCQkJCSAgIGNyZWF0ZSBpdCBuZXh0IHRvICovCisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKKwlpbnQgY29weV9yZWNvcmRzX2xlbjsJLyogbGVuZ3RoIG9mIGFsbCByZWNvcmRzIGluIGl0ZW0gdG8gYmUgY29waWVkICovCisJY2hhciAqcmVjb3JkczsKIAotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNvdXJjZSwgaXRlbV9udW0pOworCWloID0gQl9OX1BJVEVNX0hFQUQoc291cmNlLCBpdGVtX251bSk7CiAKLSAgICBSRkFMU0UoICFpc19kaXJlbnRyeV9sZV9paCAoaWgpLCAidnMtMTAwMDA6IGl0ZW0gbXVzdCBiZSBkaXJlY3RvcnkgaXRlbSIpOworCVJGQUxTRSghaXNfZGlyZW50cnlfbGVfaWgoaWgpLCAidnMtMTAwMDA6IGl0ZW0gbXVzdCBiZSBkaXJlY3RvcnkgaXRlbSIpOwogCi0gICAgLyogbGVuZ3RoIG9mIGFsbCByZWNvcmQgdG8gYmUgY29waWVkIGFuZCBmaXJzdCBieXRlIG9mIHRoZSBsYXN0IG9mIHRoZW0gKi8KLSAgICBkZWggPSBCX0lfREVIIChzb3VyY2UsIGloKTsKLSAgICBpZiAoY29weV9jb3VudCkgewotCWNvcHlfcmVjb3Jkc19sZW4gPSAoZnJvbSA/IGRlaF9sb2NhdGlvbiggJihkZWhbZnJvbSAtIDFdKSApIDoKLSAgICAgICAgICAgIGloX2l0ZW1fbGVuKGloKSkgLSBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gKyBjb3B5X2NvdW50IC0gMV0pKTsKLQlyZWNvcmRzID0gc291cmNlLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gKyBjb3B5X2NvdW50IC0gMV0pKTsKLSAgICB9IGVsc2UgewotCWNvcHlfcmVjb3Jkc19sZW4gPSAwOwotCXJlY29yZHMgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIHdoZW4gY29weSBsYXN0IHRvIGZpcnN0LCBkZXN0IGJ1ZmZlciBjYW4gY29udGFpbiAwIGl0ZW1zICovCi0gICAgaXRlbV9udW1faW5fZGVzdCA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gKCggQl9OUl9JVEVNUyhkZXN0KSApID8gMCA6IC0xKSA6IChCX05SX0lURU1TKGRlc3QpIC0gMSk7Ci0KLSAgICAvKiBpZiB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gZGVzdCBvciB0aGUgZmlyc3QvbGFzdCBpdGVtIGluIGRlc3QgaXMgbm90IGl0ZW0gb2YgdGhlIHNhbWUgZGlyZWN0b3J5ICovCi0gICAgaWYgKCAoaXRlbV9udW1faW5fZGVzdCA9PSAtIDEpIHx8Ci0JKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCAmJiBsZV9paF9rX29mZnNldCAoaWgpID09IERPVF9PRkZTRVQpIHx8Ci0JICAgIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgJiYgY29tcF9zaG9ydF9sZV9rZXlzLypDT01QX1NIT1JUX0tFWVMqLyAoJmloLT5paF9rZXksIEJfTl9QS0VZIChkZXN0LCBpdGVtX251bV9pbl9kZXN0KSkpKSB7Ci0JLyogY3JlYXRlIG5ldyBpdGVtIGluIGRlc3QgKi8KLQlzdHJ1Y3QgaXRlbV9oZWFkIG5ld19paDsKLQotCS8qIGZvcm0gaXRlbSBoZWFkZXIgKi8KLQltZW1jcHkgKCZuZXdfaWguaWhfa2V5LCAmaWgtPmloX2tleSwgS0VZX1NJWkUpOwotCXB1dF9paF92ZXJzaW9uKCAmbmV3X2loLCBLRVlfRk9STUFUXzNfNSApOwotCS8qIGNhbGN1bGF0ZSBpdGVtIGxlbiAqLwotCXB1dF9paF9pdGVtX2xlbiggJm5ld19paCwgREVIX1NJWkUgKiBjb3B5X2NvdW50ICsgY29weV9yZWNvcmRzX2xlbiApOwotCXB1dF9paF9lbnRyeV9jb3VudCggJm5ld19paCwgMCApOwotICAgIAotCWlmIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpIHsKLQkgICAgLyogZm9ybSBrZXkgYnkgdGhlIGZvbGxvd2luZyB3YXkgKi8KLQkgICAgaWYgKGZyb20gPCBJX0VOVFJZX0NPVU5UKGloKSkgewotCQlzZXRfbGVfaWhfa19vZmZzZXQoICZuZXdfaWgsIGRlaF9vZmZzZXQoICYoZGVoW2Zyb21dKSApICk7Ci0JCS8qbWVtY3B5ICgmbmV3X2loLmloX2tleS5rX29mZnNldCwgJmRlaFtmcm9tXS5kZWhfb2Zmc2V0LCBTSE9SVF9LRVlfU0laRSk7Ki8KLQkgICAgfSBlbHNlIHsKLQkJLyogbm8gZW50cmllcyB3aWxsIGJlIGNvcGllZCB0byB0aGlzIGl0ZW0gaW4gdGhpcyBmdW5jdGlvbiAqLwotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuZXdfaWgsIFUzMl9NQVgpOwotCQkvKiB0aGlzIGl0ZW0gaXMgbm90IHlldCB2YWxpZCwgYnV0IHdlIHdhbnQgSV9JU19ESVJFQ1RPUllfSVRFTSB0byByZXR1cm4gMSBmb3IgaXQsIHNvIHdlIC0xICovCi0JICAgIH0KLQkgICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCAmKG5ld19paC5paF9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKKwkvKiBsZW5ndGggb2YgYWxsIHJlY29yZCB0byBiZSBjb3BpZWQgYW5kIGZpcnN0IGJ5dGUgb2YgdGhlIGxhc3Qgb2YgdGhlbSAqLworCWRlaCA9IEJfSV9ERUgoc291cmNlLCBpaCk7CisJaWYgKGNvcHlfY291bnQpIHsKKwkJY29weV9yZWNvcmRzX2xlbiA9IChmcm9tID8gZGVoX2xvY2F0aW9uKCYoZGVoW2Zyb20gLSAxXSkpIDoKKwkJCQkgICAgaWhfaXRlbV9sZW4oaWgpKSAtCisJCSAgICBkZWhfbG9jYXRpb24oJihkZWhbZnJvbSArIGNvcHlfY291bnQgLSAxXSkpOworCQlyZWNvcmRzID0KKwkJICAgIHNvdXJjZS0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsKKwkJICAgIGRlaF9sb2NhdGlvbigmKGRlaFtmcm9tICsgY29weV9jb3VudCAtIDFdKSk7CisJfSBlbHNlIHsKKwkJY29weV9yZWNvcmRzX2xlbiA9IDA7CisJCXJlY29yZHMgPSBOVUxMOwogCX0KLSAgICAKLQkvKiBpbnNlcnQgaXRlbSBpbnRvIGRlc3QgYnVmZmVyICovCi0JbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IEJfTlJfSVRFTVMoZGVzdCksICZuZXdfaWgsIE5VTEwsIDApOwotICAgIH0gZWxzZSB7Ci0JLyogcHJlcGFyZSBzcGFjZSBmb3IgZW50cmllcyAqLwotCWxlYWZfcGFzdGVfaW5fYnVmZmVyIChkZXN0X2JpLCAobGFzdF9maXJzdD09RklSU1RfVE9fTEFTVCkgPyAoQl9OUl9JVEVNUyhkZXN0KSAtIDEpIDogMCwgTUFYX1VTX0lOVCwKLQkJCSAgICAgIERFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4sIHJlY29yZHMsIDAKLQkgICAgKTsKLSAgICB9Ci0gIAotICAgIGl0ZW1fbnVtX2luX2Rlc3QgPSAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSA/IChCX05SX0lURU1TKGRlc3QpLTEpIDogMDsKLSAgICAKLSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKGRlc3RfYmktPmJpX2JoLCBpdGVtX251bV9pbl9kZXN0LAotCQkJKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgPyBJX0VOVFJZX0NPVU5UKEJfTl9QSVRFTV9IRUFEIChkZXN0LCBpdGVtX251bV9pbl9kZXN0KSkgOiAwLAotCQkJY29weV9jb3VudCwgZGVoICsgZnJvbSwgcmVjb3JkcywKLQkJCURFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4KLQkpOwotfQogCisJLyogd2hlbiBjb3B5IGxhc3QgdG8gZmlyc3QsIGRlc3QgYnVmZmVyIGNhbiBjb250YWluIDAgaXRlbXMgKi8KKwlpdGVtX251bV9pbl9kZXN0ID0KKwkgICAgKGxhc3RfZmlyc3QgPT0KKwkgICAgIExBU1RfVE9fRklSU1QpID8gKChCX05SX0lURU1TKGRlc3QpKSA/IDAgOiAtMSkgOiAoQl9OUl9JVEVNUyhkZXN0KQorCQkJCQkJCSAgICAgICAtIDEpOworCisJLyogaWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIGRlc3Qgb3IgdGhlIGZpcnN0L2xhc3QgaXRlbSBpbiBkZXN0IGlzIG5vdCBpdGVtIG9mIHRoZSBzYW1lIGRpcmVjdG9yeSAqLworCWlmICgoaXRlbV9udW1faW5fZGVzdCA9PSAtMSkgfHwKKwkgICAgKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCAmJiBsZV9paF9rX29mZnNldChpaCkgPT0gRE9UX09GRlNFVCkgfHwKKwkgICAgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVAorCSAgICAgJiYgY29tcF9zaG9ydF9sZV9rZXlzIC8qQ09NUF9TSE9SVF9LRVlTICovICgmaWgtPmloX2tleSwKKwkJCQkJCQkgQl9OX1BLRVkoZGVzdCwKKwkJCQkJCQkJICBpdGVtX251bV9pbl9kZXN0KSkpKQorCXsKKwkJLyogY3JlYXRlIG5ldyBpdGVtIGluIGRlc3QgKi8KKwkJc3RydWN0IGl0ZW1faGVhZCBuZXdfaWg7CisKKwkJLyogZm9ybSBpdGVtIGhlYWRlciAqLworCQltZW1jcHkoJm5ld19paC5paF9rZXksICZpaC0+aWhfa2V5LCBLRVlfU0laRSk7CisJCXB1dF9paF92ZXJzaW9uKCZuZXdfaWgsIEtFWV9GT1JNQVRfM181KTsKKwkJLyogY2FsY3VsYXRlIGl0ZW0gbGVuICovCisJCXB1dF9paF9pdGVtX2xlbigmbmV3X2loLAorCQkJCURFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4pOworCQlwdXRfaWhfZW50cnlfY291bnQoJm5ld19paCwgMCk7CisKKwkJaWYgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgeworCQkJLyogZm9ybSBrZXkgYnkgdGhlIGZvbGxvd2luZyB3YXkgKi8KKwkJCWlmIChmcm9tIDwgSV9FTlRSWV9DT1VOVChpaCkpIHsKKwkJCQlzZXRfbGVfaWhfa19vZmZzZXQoJm5ld19paCwKKwkJCQkJCSAgIGRlaF9vZmZzZXQoJihkZWhbZnJvbV0pKSk7CisJCQkJLyptZW1jcHkgKCZuZXdfaWguaWhfa2V5Lmtfb2Zmc2V0LCAmZGVoW2Zyb21dLmRlaF9vZmZzZXQsIFNIT1JUX0tFWV9TSVpFKTsgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogbm8gZW50cmllcyB3aWxsIGJlIGNvcGllZCB0byB0aGlzIGl0ZW0gaW4gdGhpcyBmdW5jdGlvbiAqLworCQkJCXNldF9sZV9paF9rX29mZnNldCgmbmV3X2loLCBVMzJfTUFYKTsKKwkJCQkvKiB0aGlzIGl0ZW0gaXMgbm90IHlldCB2YWxpZCwgYnV0IHdlIHdhbnQgSV9JU19ESVJFQ1RPUllfSVRFTSB0byByZXR1cm4gMSBmb3IgaXQsIHNvIHdlIC0xICovCisJCQl9CisJCQlzZXRfbGVfa2V5X2tfdHlwZShLRVlfRk9STUFUXzNfNSwgJihuZXdfaWguaWhfa2V5KSwKKwkJCQkJICBUWVBFX0RJUkVOVFJZKTsKKwkJfQorCisJCS8qIGluc2VydCBpdGVtIGludG8gZGVzdCBidWZmZXIgKi8KKwkJbGVhZl9pbnNlcnRfaW50b19idWYoZGVzdF9iaSwKKwkJCQkgICAgIChsYXN0X2ZpcnN0ID09CisJCQkJICAgICAgTEFTVF9UT19GSVJTVCkgPyAwIDogQl9OUl9JVEVNUyhkZXN0KSwKKwkJCQkgICAgICZuZXdfaWgsIE5VTEwsIDApOworCX0gZWxzZSB7CisJCS8qIHByZXBhcmUgc3BhY2UgZm9yIGVudHJpZXMgKi8KKwkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwKKwkJCQkgICAgIChsYXN0X2ZpcnN0ID09CisJCQkJICAgICAgRklSU1RfVE9fTEFTVCkgPyAoQl9OUl9JVEVNUyhkZXN0KSAtCisJCQkJCQkJMSkgOiAwLCBNQVhfVVNfSU5ULAorCQkJCSAgICAgREVIX1NJWkUgKiBjb3B5X2NvdW50ICsgY29weV9yZWNvcmRzX2xlbiwKKwkJCQkgICAgIHJlY29yZHMsIDApOworCX0KKworCWl0ZW1fbnVtX2luX2Rlc3QgPQorCSAgICAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSA/IChCX05SX0lURU1TKGRlc3QpIC0gMSkgOiAwOworCisJbGVhZl9wYXN0ZV9lbnRyaWVzKGRlc3RfYmktPmJpX2JoLCBpdGVtX251bV9pbl9kZXN0LAorCQkJICAgKGxhc3RfZmlyc3QgPT0KKwkJCSAgICBGSVJTVF9UT19MQVNUKSA/IElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQoZGVzdCwKKwkJCQkJCQkJCSAgaXRlbV9udW1faW5fZGVzdCkpCisJCQkgICA6IDAsIGNvcHlfY291bnQsIGRlaCArIGZyb20sIHJlY29yZHMsCisJCQkgICBERUhfU0laRSAqIGNvcHlfY291bnQgKyBjb3B5X3JlY29yZHNfbGVuKTsKK30KIAogLyogQ29weSB0aGUgZmlyc3QgKGlmIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgb3IgbGFzdCAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSBpdGVtIG9yIAogICAgcGFydCBvZiBpdCBvciBub3RoaW5nIChzZWUgdGhlIHJldHVybiAwIGJlbG93KSBmcm9tIFNPVVJDRSB0byB0aGUgZW5kIAogICAgKGlmIGxhc3RfZmlyc3QpIG9yIGJlZ2lubmluZyAoIWxhc3RfZmlyc3QpIG9mIHRoZSBERVNUICovCiAvKiByZXR1cm5zIDEgaWYgYW55dGhpbmcgd2FzIGNvcGllZCwgZWxzZSAwICovCi1zdGF0aWMgaW50IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAotCQkJCSAgICBpbnQgYnl0ZXNfb3JfZW50cmllcykKK3N0YXRpYyBpbnQgbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqc3JjLCBpbnQgbGFzdF9maXJzdCwKKwkJCQkgICBpbnQgYnl0ZXNfb3JfZW50cmllcykKIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICBpbnQgZGVzdF9ucl9pdGVtLCBzcmNfbnJfaXRlbTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgKi8KLSAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICBzdHJ1Y3QgaXRlbV9oZWFkICogZGloOwotICAKLSAgZGVzdF9ucl9pdGVtID0gQl9OUl9JVEVNUyhkZXN0KTsKLSAgCi0gIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgewotICAgIC8qIGlmICggREVTVCBpcyBlbXB0eSBvciBmaXJzdCBpdGVtIG9mIFNPVVJDRSBhbmQgbGFzdCBpdGVtIG9mIERFU1QgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0cwotICAgICAgIG9yIG9mIGRpZmZlcmVudCB0eXBlcyApIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byB0cmVhdCB0aGlzIGl0ZW0gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgaXRlbXMKLSAgICAgICB0aGF0IHdlIGNvcHksIHNvIHdlIHJldHVybiAqLwotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgMCk7Ci0gICAgZGloID0gQl9OX1BJVEVNX0hFQUQgKGRlc3QsIGRlc3RfbnJfaXRlbSAtIDEpOwotICAgIGlmICghZGVzdF9ucl9pdGVtIHx8ICghb3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIHNyYy0+Yl9zaXplKSkpCi0gICAgICAvKiB0aGVyZSBpcyBub3RoaW5nIHRvIG1lcmdlICovCi0gICAgICByZXR1cm4gMDsKLSAgICAgIAotICAgIFJGQUxTRSggISBpaF9pdGVtX2xlbihpaCksICJ2cy0xMDAxMDogaXRlbSBjYW4gbm90IGhhdmUgZW1wdHkgbGVuZ3RoIik7Ci0gICAgICAKLSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChpaCkgKSB7Ci0gICAgICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKQotCS8qIGNvcHkgYWxsIGVudHJpZXMgdG8gZGVzdCAqLwotCWJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0gICAgICBsZWFmX2NvcHlfZGlyX2VudHJpZXMgKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwgMCwgMCwgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgICAKLSAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIGJvZHkgb2YgdGhlIGxhc3QgaXRlbSBvZiB0aGUgREVTVAotICAgICAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgY29weSB3aG9sZSBib2R5OyBkb24ndCBjcmVhdGUgbmV3IGl0ZW0gaGVhZGVyCi0gICAgICAgKi8KLSAgICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKQotICAgICAgYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKwlpbnQgZGVzdF9ucl9pdGVtLCBzcmNfbnJfaXRlbTsJLyogbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpkaWg7CisKKwlkZXN0X25yX2l0ZW0gPSBCX05SX0lURU1TKGRlc3QpOworCisJaWYgKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgeworCQkvKiBpZiAoIERFU1QgaXMgZW1wdHkgb3IgZmlyc3QgaXRlbSBvZiBTT1VSQ0UgYW5kIGxhc3QgaXRlbSBvZiBERVNUIGFyZSB0aGUgaXRlbXMgb2YgZGlmZmVyZW50IG9iamVjdHMKKwkJICAgb3Igb2YgZGlmZmVyZW50IHR5cGVzICkgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIHRyZWF0IHRoaXMgaXRlbSBkaWZmZXJlbnRseSBmcm9tIHRoZSBvdGhlciBpdGVtcworCQkgICB0aGF0IHdlIGNvcHksIHNvIHdlIHJldHVybiAqLworCQlpaCA9IEJfTl9QSVRFTV9IRUFEKHNyYywgMCk7CisJCWRpaCA9IEJfTl9QSVRFTV9IRUFEKGRlc3QsIGRlc3RfbnJfaXRlbSAtIDEpOworCQlpZiAoIWRlc3RfbnJfaXRlbQorCQkgICAgfHwgKCFvcF9pc19sZWZ0X21lcmdlYWJsZSgmKGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSkpKQorCQkJLyogdGhlcmUgaXMgbm90aGluZyB0byBtZXJnZSAqLworCQkJcmV0dXJuIDA7CisKKwkJUkZBTFNFKCFpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAidnMtMTAwMTA6IGl0ZW0gY2FuIG5vdCBoYXZlIGVtcHR5IGxlbmd0aCIpOworCisJCWlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJCWlmIChieXRlc19vcl9lbnRyaWVzID09IC0xKQorCQkJCS8qIGNvcHkgYWxsIGVudHJpZXMgdG8gZGVzdCAqLworCQkJCWJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7CisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCAwLCAwLAorCQkJCQkgICAgICBieXRlc19vcl9lbnRyaWVzKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBmaXJzdCBpdGVtIG9mIFNPVVJDRSB0byB0aGUgZW5kIG9mIHRoZSBib2R5IG9mIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIERFU1QKKwkJICAgcGFydCBkZWZpbmVkIGJ5ICdieXRlc19vcl9lbnRyaWVzJzsgaWYgYnl0ZXNfb3JfZW50cmllcyA9PSAtMSBjb3B5IHdob2xlIGJvZHk7IGRvbid0IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXIKKwkJICovCisJCWlmIChieXRlc19vcl9lbnRyaWVzID09IC0xKQorCQkJYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGVsc2UgewotICAgICAgaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gaWhfaXRlbV9sZW4oaWgpICYmIGlzX2luZGlyZWN0X2xlX2loKGloKSkKLQlpZiAoZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSkKLQkgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtMTAwMjA6IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtOiAiCi0JCQkgICJsYXN0IHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCi0JCQkgIGloKTsKLSAgICB9CisJCWVsc2UgeworCQkJaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gaWhfaXRlbV9sZW4oaWgpCisJCQkgICAgJiYgaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQorCQkJCWlmIChnZXRfaWhfZnJlZV9zcGFjZShpaCkpCisJCQkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJCQkgICAgICAgInZzLTEwMDIwOiBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbTogIgorCQkJCQkJICAgICAgICJsYXN0IHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCisJCQkJCQkgICAgICAgaWgpOworCQl9CiAjZW5kaWYKLSAgICAgIAotICAgIC8qIG1lcmdlIGZpcnN0IGl0ZW0gKG9yIGl0cyBwYXJ0KSBvZiBzcmMgYnVmZmVyIHdpdGggdGhlIGxhc3QKLSAgICAgICBpdGVtIG9mIGRlc3QgYnVmZmVyLiBCb3RoIGFyZSBvZiB0aGUgc2FtZSBmaWxlICovCi0gICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksCi0JCQkgIGRlc3RfbnJfaXRlbSAtIDEsIGloX2l0ZW1fbGVuKGRpaCksIGJ5dGVzX29yX2VudHJpZXMsIEJfSV9QSVRFTShzcmMsaWgpLCAwCi0JCQkgICk7Ci0gICAgICAKLSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGRpaCkpIHsKLSAgICAgIFJGQUxTRSggZ2V0X2loX2ZyZWVfc3BhY2UgKGRpaCksCi0gICAgICAgICAgICAgICJ2cy0xMDAzMDogbWVyZ2UgdG8gbGVmdDogbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIG5vbi1sYXN0IGluZGlyZWN0IGl0ZW0gJWggbXVzdCBoYXZlIHplcnRvIGZyZWUgc3BhY2UiLAotICAgICAgICAgICAgICBpaCk7Ci0gICAgICBpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSBpaF9pdGVtX2xlbihpaCkpCi0Jc2V0X2loX2ZyZWVfc3BhY2UgKGRpaCwgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAxOwotICB9Ci0gIAogCi0gIC8qIGNvcHkgYm91bmRhcnkgaXRlbSB0byByaWdodCAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSAqLworCQkvKiBtZXJnZSBmaXJzdCBpdGVtIChvciBpdHMgcGFydCkgb2Ygc3JjIGJ1ZmZlciB3aXRoIHRoZSBsYXN0CisJCSAgIGl0ZW0gb2YgZGVzdCBidWZmZXIuIEJvdGggYXJlIG9mIHRoZSBzYW1lIGZpbGUgKi8KKwkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwKKwkJCQkgICAgIGRlc3RfbnJfaXRlbSAtIDEsIGloX2l0ZW1fbGVuKGRpaCksCisJCQkJICAgICBieXRlc19vcl9lbnRyaWVzLCBCX0lfUElURU0oc3JjLCBpaCksIDApOwogCi0gIC8qICggREVTVCBpcyBlbXB0eSBvciBsYXN0IGl0ZW0gb2YgU09VUkNFIGFuZCBmaXJzdCBpdGVtIG9mIERFU1QKLSAgICAgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0IG9yIG9mIGRpZmZlcmVudCB0eXBlcyApCi0gICAgICovCi0gIHNyY19ucl9pdGVtID0gQl9OUl9JVEVNUyAoc3JjKTsKLSAgaWggPSBCX05fUElURU1fSEVBRCAoc3JjLCBzcmNfbnJfaXRlbSAtIDEpOwotICBkaWggPSBCX05fUElURU1fSEVBRCAoZGVzdCwgMCk7CisJCWlmIChpc19pbmRpcmVjdF9sZV9paChkaWgpKSB7CisJCQlSRkFMU0UoZ2V0X2loX2ZyZWVfc3BhY2UoZGloKSwKKwkJCSAgICAgICAidnMtMTAwMzA6IG1lcmdlIHRvIGxlZnQ6IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBub24tbGFzdCBpbmRpcmVjdCBpdGVtICVoIG11c3QgaGF2ZSB6ZXJ0byBmcmVlIHNwYWNlIiwKKwkJCSAgICAgICBpaCk7CisJCQlpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSBpaF9pdGVtX2xlbihpaCkpCisJCQkJc2V0X2loX2ZyZWVfc3BhY2UoZGloLCBnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQl9CiAKLSAgaWYgKCFkZXN0X25yX2l0ZW0gfHwgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGRpaC0+aWhfa2V5KSwgc3JjLT5iX3NpemUpKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7Ci0gICAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkKLSAgICAgIC8qIGJ5dGVzX29yX2VudHJpZXMgPSBlbnRyaWVzIG51bWJlciBpbiBsYXN0IGl0ZW0gYm9keSBvZiBTT1VSQ0UgKi8KLSAgICAgIGJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0gICAgCi0gICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIHNyY19ucl9pdGVtIC0gMSwgaWhfZW50cnlfY291bnQoaWgpIC0gYnl0ZXNfb3JfZW50cmllcywgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KKwkJcmV0dXJuIDE7CisJfQogCi0gIC8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgbGFzdCBpdGVtIG9mIFNPVVJDRSB0byB0aGUgYmVnaW4gb2YgdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIERFU1Q7Ci0gICAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVfb3JfZW50cmllc3MgPT0gLTEgY29weSB3aG9sZSBib2R5OyBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1Q7Ci0gICAgIGRvbid0IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXIKLSAgICAgKi8KLSAgCi0gIFJGQUxTRSggaXNfaW5kaXJlY3RfbGVfaWgoaWgpICYmIGdldF9paF9mcmVlX3NwYWNlIChpaCksCi0gICAgICAgICAgInZzLTEwMDQwOiBtZXJnZSB0byByaWdodDogbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIG5vbi1sYXN0IGluZGlyZWN0IGl0ZW0gbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCi0JCSAgICBpaCk7CisJLyogY29weSBib3VuZGFyeSBpdGVtIHRvIHJpZ2h0IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpICovCiAKLSAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkgewotICAgIC8qIGJ5dGVzX29yX2VudHJpZXMgPSBsZW5ndGggb2YgbGFzdCBpdGVtIGJvZHkgb2YgU09VUkNFICovCi0gICAgYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKKwkvKiAoIERFU1QgaXMgZW1wdHkgb3IgbGFzdCBpdGVtIG9mIFNPVVJDRSBhbmQgZmlyc3QgaXRlbSBvZiBERVNUCisJICAgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0IG9yIG9mIGRpZmZlcmVudCB0eXBlcyApCisJICovCisJc3JjX25yX2l0ZW0gPSBCX05SX0lURU1TKHNyYyk7CisJaWggPSBCX05fUElURU1fSEVBRChzcmMsIHNyY19ucl9pdGVtIC0gMSk7CisJZGloID0gQl9OX1BJVEVNX0hFQUQoZGVzdCwgMCk7CiAKLSAgICBSRkFMU0UoIGxlX2loX2tfb2Zmc2V0IChkaWgpICE9Ci0gICAgICAgICAgICBsZV9paF9rX29mZnNldCAoaWgpICsgb3BfYnl0ZXNfbnVtYmVyIChpaCwgc3JjLT5iX3NpemUpLAotICAgICAgICAgICAgInZzLTEwMDUwOiBpdGVtcyAlaCBhbmQgJWggZG8gbm90IG1hdGNoIiwgaWgsIGRpaCk7CisJaWYgKCFkZXN0X25yX2l0ZW0gfHwgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlKCYoZGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSkpCisJCXJldHVybiAwOwogCi0gICAgLyogY2hhbmdlIGZpcnN0IGl0ZW0ga2V5IG9mIHRoZSBERVNUICovCi0gICAgc2V0X2xlX2loX2tfb2Zmc2V0IChkaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkpOworCWlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gLTEpCisJCQkvKiBieXRlc19vcl9lbnRyaWVzID0gZW50cmllcyBudW1iZXIgaW4gbGFzdCBpdGVtIGJvZHkgb2YgU09VUkNFICovCisJCQlieXRlc19vcl9lbnRyaWVzID0gaWhfZW50cnlfY291bnQoaWgpOwogCi0gICAgLyogaXRlbSBiZWNvbWVzIG5vbi1tZXJnZWFibGUgKi8KLSAgICAvKiBvciBtZXJnZWFibGUgaWYgbGVmdCBpdGVtIHdhcyAqLwotICAgIHNldF9sZV9paF9rX3R5cGUgKGRpaCwgbGVfaWhfa190eXBlIChpaCkpOwotICB9IGVsc2UgewotICAgIC8qIG1lcmdlIHRvIHJpZ2h0IG9ubHkgcGFydCBvZiBpdGVtICovCi0gICAgUkZBTFNFKCBpaF9pdGVtX2xlbihpaCkgPD0gYnl0ZXNfb3JfZW50cmllcywKLSAgICAgICAgICAgICJ2cy0xMDA2MDogbm8gc28gbXVjaCBieXRlcyAlbHUgKG5lZWRlZCAlbHUpIiwKLSAgICAgICAgICAgICggdW5zaWduZWQgbG9uZyApaWhfaXRlbV9sZW4oaWgpLCAoIHVuc2lnbmVkIGxvbmcgKWJ5dGVzX29yX2VudHJpZXMpOwotICAgIAotICAgIC8qIGNoYW5nZSBmaXJzdCBpdGVtIGtleSBvZiB0aGUgREVTVCAqLwotICAgIGlmICggaXNfZGlyZWN0X2xlX2loIChkaWgpICkgewotICAgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSA8PSAodW5zaWduZWQgbG9uZylieXRlc19vcl9lbnRyaWVzLAotCSAgICAgICJ2cy0xMDA3MDogZGloICVoLCBieXRlc19vcl9lbnRyaWVzKCVkKSIsIGRpaCwgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgICBzZXRfbGVfaWhfa19vZmZzZXQgKGRpaCwgbGVfaWhfa19vZmZzZXQgKGRpaCkgLSBieXRlc19vcl9lbnRyaWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSA8PQotICAgICAgICAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSwKLSAgICAgICAgICAgICAgInZzLTEwMDgwOiBkaWggJWgsIGJ5dGVzX29yX2VudHJpZXMoJWQpIiwKLSAgICAgICAgICAgICAgZGloLCAoYnl0ZXNfb3JfZW50cmllcy9VTkZNX1BfU0laRSkqZGVzdC0+Yl9zaXplKTsKLSAgICAgIHNldF9sZV9paF9rX29mZnNldCAoZGloLCBsZV9paF9rX29mZnNldCAoZGloKSAtICgoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSkpOwotICAgIH0KLSAgfQotICAKLSAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksIDAsIDAsIGJ5dGVzX29yX2VudHJpZXMsIEJfSV9QSVRFTShzcmMsaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gYnl0ZXNfb3JfZW50cmllcywgMCk7Ci0gIHJldHVybiAxOworCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCSAgICAgIHNyY19ucl9pdGVtIC0gMSwKKwkJCQkgICAgICBpaF9lbnRyeV9jb3VudChpaCkgLSBieXRlc19vcl9lbnRyaWVzLAorCQkJCSAgICAgIGJ5dGVzX29yX2VudHJpZXMpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGxhc3QgaXRlbSBvZiBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBib2R5IG9mIHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBERVNUOworCSAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVfb3JfZW50cmllc3MgPT0gLTEgY29weSB3aG9sZSBib2R5OyBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1Q7CisJICAgZG9uJ3QgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcgorCSAqLworCisJUkZBTFNFKGlzX2luZGlyZWN0X2xlX2loKGloKSAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJICAgICAgICJ2cy0xMDA0MDogbWVyZ2UgdG8gcmlnaHQ6IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBub24tbGFzdCBpbmRpcmVjdCBpdGVtIG11c3QgYmUgZmlsbGVkIGVudGlyZWx5ICglaCkiLAorCSAgICAgICBpaCk7CisKKwlpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSAtMSkgeworCQkvKiBieXRlc19vcl9lbnRyaWVzID0gbGVuZ3RoIG9mIGxhc3QgaXRlbSBib2R5IG9mIFNPVVJDRSAqLworCQlieXRlc19vcl9lbnRyaWVzID0gaWhfaXRlbV9sZW4oaWgpOworCisJCVJGQUxTRShsZV9paF9rX29mZnNldChkaWgpICE9CisJCSAgICAgICBsZV9paF9rX29mZnNldChpaCkgKyBvcF9ieXRlc19udW1iZXIoaWgsIHNyYy0+Yl9zaXplKSwKKwkJICAgICAgICJ2cy0xMDA1MDogaXRlbXMgJWggYW5kICVoIGRvIG5vdCBtYXRjaCIsIGloLCBkaWgpOworCisJCS8qIGNoYW5nZSBmaXJzdCBpdGVtIGtleSBvZiB0aGUgREVTVCAqLworCQlzZXRfbGVfaWhfa19vZmZzZXQoZGloLCBsZV9paF9rX29mZnNldChpaCkpOworCisJCS8qIGl0ZW0gYmVjb21lcyBub24tbWVyZ2VhYmxlICovCisJCS8qIG9yIG1lcmdlYWJsZSBpZiBsZWZ0IGl0ZW0gd2FzICovCisJCXNldF9sZV9paF9rX3R5cGUoZGloLCBsZV9paF9rX3R5cGUoaWgpKTsKKwl9IGVsc2UgeworCQkvKiBtZXJnZSB0byByaWdodCBvbmx5IHBhcnQgb2YgaXRlbSAqLworCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpIDw9IGJ5dGVzX29yX2VudHJpZXMsCisJCSAgICAgICAidnMtMTAwNjA6IG5vIHNvIG11Y2ggYnl0ZXMgJWx1IChuZWVkZWQgJWx1KSIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAodW5zaWduZWQgbG9uZylieXRlc19vcl9lbnRyaWVzKTsKKworCQkvKiBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1QgKi8KKwkJaWYgKGlzX2RpcmVjdF9sZV9paChkaWgpKSB7CisJCQlSRkFMU0UobGVfaWhfa19vZmZzZXQoZGloKSA8PQorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWJ5dGVzX29yX2VudHJpZXMsCisJCQkgICAgICAgInZzLTEwMDcwOiBkaWggJWgsIGJ5dGVzX29yX2VudHJpZXMoJWQpIiwgZGloLAorCQkJICAgICAgIGJ5dGVzX29yX2VudHJpZXMpOworCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGRpaCwKKwkJCQkJICAgbGVfaWhfa19vZmZzZXQoZGloKSAtCisJCQkJCSAgIGJ5dGVzX29yX2VudHJpZXMpOworCQl9IGVsc2UgeworCQkJUkZBTFNFKGxlX2loX2tfb2Zmc2V0KGRpaCkgPD0KKwkJCSAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSwKKwkJCSAgICAgICAidnMtMTAwODA6IGRpaCAlaCwgYnl0ZXNfb3JfZW50cmllcyglZCkiLAorCQkJICAgICAgIGRpaCwKKwkJCSAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSk7CisJCQlzZXRfbGVfaWhfa19vZmZzZXQoZGloLAorCQkJCQkgICBsZV9paF9rX29mZnNldChkaWgpIC0KKwkJCQkJICAgKChieXRlc19vcl9lbnRyaWVzIC8gVU5GTV9QX1NJWkUpICoKKwkJCQkJICAgIGRlc3QtPmJfc2l6ZSkpOworCQl9CisJfQorCisJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwgMCwgMCwgYnl0ZXNfb3JfZW50cmllcywKKwkJCSAgICAgQl9JX1BJVEVNKHNyYywKKwkJCQkgICAgICAgaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gYnl0ZXNfb3JfZW50cmllcywKKwkJCSAgICAgMCk7CisJcmV0dXJuIDE7CiB9CiAKLQogLyogY29weSBjcHlfbXVuIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdAogICogbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgY3B5X251bSAgaXRlbXMgYmVnaW5uaW5nIGZyb20gZmlyc3QtdGggaXRlbSBpbiBzcmMgdG8gdGFpbCBvZiBkZXN0CiAgKiBsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgbWVhbnMsIHRoYXQgd2UgY29weSBjcHlfbnVtICBpdGVtcyBiZWdpbm5pbmcgZnJvbSBmaXJzdC10aCBpdGVtIGluIHNyYyB0byBoZWFkIG9mIGRlc3QKICAqLwotc3RhdGljIHZvaWQgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAotCQkJCSAgICAgIGludCBmaXJzdCwgaW50IGNweV9udW0pCitzdGF0aWMgdm9pZCBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkoc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJCSAgICAgaW50IGZpcnN0LCBpbnQgY3B5X251bSkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0OwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBpbnQgZGVzdF9iZWZvcmU7Ci0gICAgaW50IGxhc3RfbG9jLCBsYXN0X2luc2VydGVkX2xvYywgbG9jYXRpb247Ci0gICAgaW50IGksIGo7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3Q7CisJaW50IG5yLCBmcmVlX3NwYWNlOworCWludCBkZXN0X2JlZm9yZTsKKwlpbnQgbGFzdF9sb2MsIGxhc3RfaW5zZXJ0ZWRfbG9jLCBsb2NhdGlvbjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKIAotICAgIFJGQUxTRSggbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNUICAmJiBsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QsCi0JICAgICJ2cy0xMDA5MDogYmFkIGxhc3RfZmlyc3QgcGFyYW1ldGVyICVkIiwgbGFzdF9maXJzdCk7Ci0gICAgUkZBTFNFKCBCX05SX0lURU1TIChzcmMpIC0gZmlyc3QgPCBjcHlfbnVtLAotCSAgICAidnMtMTAxMDA6IHRvbyBmZXcgaXRlbXMgaW4gc291cmNlICVkLCByZXF1aXJlZCAlZCBmcm9tICVkIiwKLQkgICAgQl9OUl9JVEVNUyhzcmMpLCBjcHlfbnVtLCBmaXJzdCk7Ci0gICAgUkZBTFNFKCBjcHlfbnVtIDwgMCwgInZzLTEwMTEwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7Ci0gICAgUkZBTFNFKCAhIGRlc3RfYmksICJ2cy0xMDEyMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRShsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QgJiYgbGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNULAorCSAgICAgICAidnMtMTAwOTA6IGJhZCBsYXN0X2ZpcnN0IHBhcmFtZXRlciAlZCIsIGxhc3RfZmlyc3QpOworCVJGQUxTRShCX05SX0lURU1TKHNyYykgLSBmaXJzdCA8IGNweV9udW0sCisJICAgICAgICJ2cy0xMDEwMDogdG9vIGZldyBpdGVtcyBpbiBzb3VyY2UgJWQsIHJlcXVpcmVkICVkIGZyb20gJWQiLAorCSAgICAgICBCX05SX0lURU1TKHNyYyksIGNweV9udW0sIGZpcnN0KTsKKwlSRkFMU0UoY3B5X251bSA8IDAsICJ2cy0xMDExMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRSghZGVzdF9iaSwgInZzLTEwMTIwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7CiAKLSAgICBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisJZGVzdCA9IGRlc3RfYmktPmJpX2JoOwogCi0gICAgUkZBTFNFKCAhIGRlc3QsICJ2cy0xMDEzMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRSghZGVzdCwgInZzLTEwMTMwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7CiAKLSAgICBpZiAoY3B5X251bSA9PSAwKQotCXJldHVybjsKKwlpZiAoY3B5X251bSA9PSAwKQorCQlyZXR1cm47CiAKLSAgICBibGtoID0gQl9CTEtfSEVBRChkZXN0KTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbSggYmxraCApOwotICAgIGZyZWVfc3BhY2UgPSBibGtoX2ZyZWVfc3BhY2UoYmxraCk7Ci0gIAotICAgIC8qIHdlIHdpbGwgaW5zZXJ0IGl0ZW1zIGJlZm9yZSAwLXRoIG9yIG5yLXRoIGl0ZW0gaW4gZGVzdCBidWZmZXIuIEl0IGRlcGVuZHMgb2YgbGFzdF9maXJzdCBwYXJhbWV0ZXIgKi8KLSAgICBkZXN0X2JlZm9yZSA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IG5yOworCWJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWZyZWVfc3BhY2UgPSBibGtoX2ZyZWVfc3BhY2UoYmxraCk7CiAKLSAgICAvKiBsb2NhdGlvbiBvZiBoZWFkIG9mIGZpcnN0IG5ldyBpdGVtICovCi0gICAgaWggPSBCX05fUElURU1fSEVBRCAoZGVzdCwgZGVzdF9iZWZvcmUpOworCS8qIHdlIHdpbGwgaW5zZXJ0IGl0ZW1zIGJlZm9yZSAwLXRoIG9yIG5yLXRoIGl0ZW0gaW4gZGVzdCBidWZmZXIuIEl0IGRlcGVuZHMgb2YgbGFzdF9maXJzdCBwYXJhbWV0ZXIgKi8KKwlkZXN0X2JlZm9yZSA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IG5yOwogCi0gICAgUkZBTFNFKCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgPCBjcHlfbnVtICogSUhfU0laRSwKLSAgICAgICAgICAgICJ2cy0xMDE0MDogbm90IGVub3VnaCBmcmVlIHNwYWNlIGZvciBoZWFkZXJzICVkIChuZWVkZWQgJWQpIiwKLSAgICAgICAgICAgIEJfRlJFRV9TUEFDRSAoZGVzdCksIGNweV9udW0gKiBJSF9TSVpFKTsKKwkvKiBsb2NhdGlvbiBvZiBoZWFkIG9mIGZpcnN0IG5ldyBpdGVtICovCisJaWggPSBCX05fUElURU1fSEVBRChkZXN0LCBkZXN0X2JlZm9yZSk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBoZWFkZXJzICovCi0gICAgbWVtbW92ZSAoaWggKyBjcHlfbnVtLCBpaCwgKG5yLWRlc3RfYmVmb3JlKSAqIElIX1NJWkUpOworCVJGQUxTRShibGtoX2ZyZWVfc3BhY2UoYmxraCkgPCBjcHlfbnVtICogSUhfU0laRSwKKwkgICAgICAgInZzLTEwMTQwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIGhlYWRlcnMgJWQgKG5lZWRlZCAlZCkiLAorCSAgICAgICBCX0ZSRUVfU1BBQ0UoZGVzdCksIGNweV9udW0gKiBJSF9TSVpFKTsKIAotICAgIC8qIGNvcHkgaXRlbSBoZWFkZXJzICovCi0gICAgbWVtY3B5IChpaCwgQl9OX1BJVEVNX0hFQUQgKHNyYywgZmlyc3QpLCBjcHlfbnVtICogSUhfU0laRSk7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgaGVhZGVycyAqLworCW1lbW1vdmUoaWggKyBjcHlfbnVtLCBpaCwgKG5yIC0gZGVzdF9iZWZvcmUpICogSUhfU0laRSk7CiAKLSAgICBmcmVlX3NwYWNlIC09IChJSF9TSVpFICogY3B5X251bSk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgZnJlZV9zcGFjZSApOworCS8qIGNvcHkgaXRlbSBoZWFkZXJzICovCisJbWVtY3B5KGloLCBCX05fUElURU1fSEVBRChzcmMsIGZpcnN0KSwgY3B5X251bSAqIElIX1NJWkUpOwogCi0gICAgLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KLSAgICBqID0gbG9jYXRpb24gPSAoZGVzdF9iZWZvcmUgPT0gMCkgPyBkZXN0LT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaC0xKTsKLSAgICBmb3IgKGkgPSBkZXN0X2JlZm9yZTsgaSA8IG5yICsgY3B5X251bTsgaSArKykgewotICAgICAgICBsb2NhdGlvbiAtPSBpaF9pdGVtX2xlbiggaWggKyBpIC0gZGVzdF9iZWZvcmUgKTsKLSAgICAgICAgcHV0X2loX2xvY2F0aW9uKCBpaCArIGkgLSBkZXN0X2JlZm9yZSwgbG9jYXRpb24gKTsKLSAgICB9CisJZnJlZV9zcGFjZSAtPSAoSUhfU0laRSAqIGNweV9udW0pOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgZnJlZV9zcGFjZSk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBpdGVtcyAqLwotICAgIGxhc3RfbG9jID0gaWhfbG9jYXRpb24oICYoaWhbbnIrY3B5X251bS0xLWRlc3RfYmVmb3JlXSkgKTsKLSAgICBsYXN0X2luc2VydGVkX2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW2NweV9udW0tMV0pICk7CisJLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KKwlqID0gbG9jYXRpb24gPSAoZGVzdF9iZWZvcmUgPT0gMCkgPyBkZXN0LT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaCAtIDEpOworCWZvciAoaSA9IGRlc3RfYmVmb3JlOyBpIDwgbnIgKyBjcHlfbnVtOyBpKyspIHsKKwkJbG9jYXRpb24gLT0gaWhfaXRlbV9sZW4oaWggKyBpIC0gZGVzdF9iZWZvcmUpOworCQlwdXRfaWhfbG9jYXRpb24oaWggKyBpIC0gZGVzdF9iZWZvcmUsIGxvY2F0aW9uKTsKKwl9CiAKLSAgICAvKiBjaGVjayBmcmVlIHNwYWNlICovCi0gICAgUkZBTFNFKCBmcmVlX3NwYWNlIDwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jLAotCSAgICAidnMtMTAxNTA6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBmb3IgaXRlbXMgJWQgKG5lZWRlZCAlZCkiLAotICAgICAgICAgICAgZnJlZV9zcGFjZSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKKwkvKiBwcmVwYXJlIHNwYWNlIGZvciBpdGVtcyAqLworCWxhc3RfbG9jID0gaWhfbG9jYXRpb24oJihpaFtuciArIGNweV9udW0gLSAxIC0gZGVzdF9iZWZvcmVdKSk7CisJbGFzdF9pbnNlcnRlZF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW2NweV9udW0gLSAxXSkpOwogCi0gICAgbWVtbW92ZSAoZGVzdC0+Yl9kYXRhICsgbGFzdF9sb2MsCi0JICAgICBkZXN0LT5iX2RhdGEgKyBsYXN0X2xvYyArIGogLSBsYXN0X2luc2VydGVkX2xvYywKLQkgICAgIGxhc3RfaW5zZXJ0ZWRfbG9jIC0gbGFzdF9sb2MpOworCS8qIGNoZWNrIGZyZWUgc3BhY2UgKi8KKwlSRkFMU0UoZnJlZV9zcGFjZSA8IGogLSBsYXN0X2luc2VydGVkX2xvYywKKwkgICAgICAgInZzLTEwMTUwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIGl0ZW1zICVkIChuZWVkZWQgJWQpIiwKKwkgICAgICAgZnJlZV9zcGFjZSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKIAotICAgIC8qIGNvcHkgaXRlbXMgKi8KLSAgICBtZW1jcHkgKGRlc3QtPmJfZGF0YSArIGxhc3RfaW5zZXJ0ZWRfbG9jLCBCX05fUElURU0oc3JjLChmaXJzdCArIGNweV9udW0gLSAxKSksCi0JICAgIGogLSBsYXN0X2luc2VydGVkX2xvYyk7CisJbWVtbW92ZShkZXN0LT5iX2RhdGEgKyBsYXN0X2xvYywKKwkJZGVzdC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBqIC0gbGFzdF9pbnNlcnRlZF9sb2MsCisJCWxhc3RfaW5zZXJ0ZWRfbG9jIC0gbGFzdF9sb2MpOwogCi0gICAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCi0gICAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgbnIgKyBjcHlfbnVtICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgZnJlZV9zcGFjZSAtIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MpICk7CisJLyogY29weSBpdGVtcyAqLworCW1lbWNweShkZXN0LT5iX2RhdGEgKyBsYXN0X2luc2VydGVkX2xvYywKKwkgICAgICAgQl9OX1BJVEVNKHNyYywgKGZpcnN0ICsgY3B5X251bSAtIDEpKSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKIAotICAgIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdCwgMCk7CisJLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBuciArIGNweV9udW0pOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgZnJlZV9zcGFjZSAtIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MpKTsKIAotICAgIGlmIChkZXN0X2JpLT5iaV9wYXJlbnQpIHsKLQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKLQl0X2RjID0gQl9OX0NISUxEIChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKLQlSRkFMU0UoIGRjX2Jsb2NrX251bWJlcih0X2RjKSAhPSBkZXN0LT5iX2Jsb2NrbnIsCi0JICAgICAgICAidnMtMTAxNjA6IGJsb2NrIG51bWJlciBpbiBiaCBkb2VzIG5vdCBtYXRjaCB0byBmaWVsZCBpbiBkaXNrX2NoaWxkIHN0cnVjdHVyZSAlbHUgYW5kICVsdSIsCi0gICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgZGVzdC0+Yl9ibG9ja25yLCAKLQkJKCBsb25nIHVuc2lnbmVkICkgZGNfYmxvY2tfbnVtYmVyKHRfZGMpKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MgKyBJSF9TSVpFICogY3B5X251bSApICk7Ci0gICAgCi0JZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LCAwKTsKLSAgICB9CisJZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkoZGVzdF9iaS0+dGIsIGRlc3QsIDApOworCisJaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworCQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKwkJdF9kYyA9IEJfTl9DSElMRChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKKwkJUkZBTFNFKGRjX2Jsb2NrX251bWJlcih0X2RjKSAhPSBkZXN0LT5iX2Jsb2NrbnIsCisJCSAgICAgICAidnMtMTAxNjA6IGJsb2NrIG51bWJlciBpbiBiaCBkb2VzIG5vdCBtYXRjaCB0byBmaWVsZCBpbiBkaXNrX2NoaWxkIHN0cnVjdHVyZSAlbHUgYW5kICVsdSIsCisJCSAgICAgICAobG9uZyB1bnNpZ25lZClkZXN0LT5iX2Jsb2NrbnIsCisJCSAgICAgICAobG9uZyB1bnNpZ25lZClkY19ibG9ja19udW1iZXIodF9kYykpOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgKyAoaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jICsKKwkJCQkJICAgICBJSF9TSVpFICogY3B5X251bSkpOworCisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CisJfQogfQogCi0KIC8qIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSAobGlxdWlkKSBpdGVtIGludG8gdHdvIGl0ZW1zICh1c2VmdWwgd2hlbgogICAgc2hpZnRpbmcgcGFydCBvZiBhbiBpdGVtIGludG8gYW5vdGhlciBub2RlLikgKi8KLXN0YXRpYyB2b2lkIGxlYWZfaXRlbV9ib3R0bGUgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywgaW50IGxhc3RfZmlyc3QsCi0JCQkgICAgICBpbnQgaXRlbV9udW0sIGludCBjcHlfYnl0ZXMpCitzdGF0aWMgdm9pZCBsZWFmX2l0ZW1fYm90dGxlKHN0cnVjdCBidWZmZXJfaW5mbyAqZGVzdF9iaSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJICAgICBpbnQgaXRlbV9udW0sIGludCBjcHlfYnl0ZXMpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgCi0gICAgUkZBTFNFKCBjcHlfYnl0ZXMgPT0gLTEsICJ2cy0xMDE3MDogYnl0ZXMgPT0gLSAxIG1lYW5zOiBkbyBub3Qgc3BsaXQgaXRlbSIpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdCA9IGRlc3RfYmktPmJpX2JoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOwogCi0gICAgaWYgKCBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgKSB7Ci0JLyogaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLwotCWlmIChpc19kaXJlbnRyeV9sZV9paCAoaWggPSBCX05fUElURU1fSEVBRChzcmMsaXRlbV9udW0pKSkKLQkgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGl0ZW1fbnVtLCAwLCBjcHlfYnl0ZXMpOwotCWVsc2UgewotCSAgICBzdHJ1Y3QgaXRlbV9oZWFkIG5faWg7Ci0gICAgICAKLQkgICAgLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBpdGVtIG51bWJlciAnaXRlbV9udW0nIG9mIFNPVVJDRSB0byB0aGUgZW5kIG9mIHRoZSBERVNUIAotCSAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2NweV9ieXRlcyc7IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXI7IGNoYW5nZSBvbGQgaXRlbV9oZWFkZXIgKD8/Pz8pOwotCSAgICAgICBuX2loID0gbmV3IGl0ZW1faGVhZGVyOwotCSAgICAqLwotCSAgICBtZW1jcHkgKCZuX2loLCBpaCwgSUhfU0laRSk7Ci0JICAgIHB1dF9paF9pdGVtX2xlbiggJm5faWgsIGNweV9ieXRlcyApOwotCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgewotCQlSRkFMU0UoIGNweV9ieXRlcyA9PSBpaF9pdGVtX2xlbihpaCkgJiYgZ2V0X2loX2ZyZWVfc3BhY2UoaWgpLAotCQkgICAgICAgICJ2cy0xMDE4MDogd2hlbiB3aG9sZSBpbmRpcmVjdCBpdGVtIGlzIGJvdHRsZSB0byBsZWZ0IG5laWdoYm9yLCBpdCBtdXN0IGhhdmUgZnJlZV9zcGFjZT09MCAobm90ICVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7Ci0JCXNldF9paF9mcmVlX3NwYWNlICgmbl9paCwgMCk7Ci0JICAgIH0KKwlSRkFMU0UoY3B5X2J5dGVzID09IC0xLAorCSAgICAgICAidnMtMTAxNzA6IGJ5dGVzID09IC0gMSBtZWFuczogZG8gbm90IHNwbGl0IGl0ZW0iKTsKIAotCSAgICBSRkFMU0UoIG9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSksCi0JCSAgICAidnMtMTAxOTA6IGJhZCBtZXJnZWFiaWxpdHkgb2YgaXRlbSAlaCIsIGloKTsKLQkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLwotCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0KSwgJm5faWgsIEJfTl9QSVRFTSAoc3JjLCBpdGVtX251bSksIDApOworCWlmIChsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpIHsKKwkJLyogaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLworCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWggPSBCX05fUElURU1fSEVBRChzcmMsIGl0ZW1fbnVtKSkpCisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULAorCQkJCQkgICAgICBpdGVtX251bSwgMCwgY3B5X2J5dGVzKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgaXRlbV9oZWFkIG5faWg7CisKKwkJCS8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgaXRlbSBudW1iZXIgJ2l0ZW1fbnVtJyBvZiBTT1VSQ0UgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAKKwkJCSAgIHBhcnQgZGVmaW5lZCBieSAnY3B5X2J5dGVzJzsgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcjsgY2hhbmdlIG9sZCBpdGVtX2hlYWRlciAoPz8/Pyk7CisJCQkgICBuX2loID0gbmV3IGl0ZW1faGVhZGVyOworCQkJICovCisJCQltZW1jcHkoJm5faWgsIGloLCBJSF9TSVpFKTsKKwkJCXB1dF9paF9pdGVtX2xlbigmbl9paCwgY3B5X2J5dGVzKTsKKwkJCWlmIChpc19pbmRpcmVjdF9sZV9paChpaCkpIHsKKwkJCQlSRkFMU0UoY3B5X2J5dGVzID09IGloX2l0ZW1fbGVuKGloKQorCQkJCSAgICAgICAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJCQkJICAgICAgICJ2cy0xMDE4MDogd2hlbiB3aG9sZSBpbmRpcmVjdCBpdGVtIGlzIGJvdHRsZSB0byBsZWZ0IG5laWdoYm9yLCBpdCBtdXN0IGhhdmUgZnJlZV9zcGFjZT09MCAobm90ICVsdSkiLAorCQkJCSAgICAgICAobG9uZyB1bnNpZ25lZClnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQkJCXNldF9paF9mcmVlX3NwYWNlKCZuX2loLCAwKTsKKwkJCX0KKworCQkJUkZBTFNFKG9wX2lzX2xlZnRfbWVyZ2VhYmxlKCYoaWgtPmloX2tleSksIHNyYy0+Yl9zaXplKSwKKwkJCSAgICAgICAidnMtMTAxOTA6IGJhZCBtZXJnZWFiaWxpdHkgb2YgaXRlbSAlaCIsIGloKTsKKwkJCW5faWguaWhfdmVyc2lvbiA9IGloLT5paF92ZXJzaW9uOwkvKiBKRE0gRW5kaWFuIHNhZmUsIGJvdGggbGUgKi8KKwkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKGRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdCksICZuX2loLAorCQkJCQkgICAgIEJfTl9QSVRFTShzcmMsIGl0ZW1fbnVtKSwgMCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiAgaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLworCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWggPSBCX05fUElURU1fSEVBRChzcmMsIGl0ZW1fbnVtKSkpCisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCQkgICAgICBpdGVtX251bSwKKwkJCQkJICAgICAgSV9FTlRSWV9DT1VOVChpaCkgLSBjcHlfYnl0ZXMsCisJCQkJCSAgICAgIGNweV9ieXRlcyk7CisJCWVsc2UgeworCQkJc3RydWN0IGl0ZW1faGVhZCBuX2loOworCisJCQkvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGl0ZW0gbnVtYmVyICdpdGVtX251bScgb2YgU09VUkNFIHRvIHRoZSBiZWdpbiBvZiB0aGUgREVTVCAKKwkJCSAgIHBhcnQgZGVmaW5lZCBieSAnY3B5X2J5dGVzJzsgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcjsKKwkJCSAgIG5faWggPSBuZXcgaXRlbV9oZWFkZXI7CisJCQkgKi8KKwkJCW1lbWNweSgmbl9paCwgaWgsIFNIT1JUX0tFWV9TSVpFKTsKKworCQkJbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247CS8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCisJCQlpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkgeworCQkJCXNldF9sZV9paF9rX29mZnNldCgmbl9paCwKKwkJCQkJCSAgIGxlX2loX2tfb2Zmc2V0KGloKSArCisJCQkJCQkgICBpaF9pdGVtX2xlbihpaCkgLSBjcHlfYnl0ZXMpOworCQkJCXNldF9sZV9paF9rX3R5cGUoJm5faWgsIFRZUEVfRElSRUNUKTsKKwkJCQlzZXRfaWhfZnJlZV9zcGFjZSgmbl9paCwgTUFYX1VTX0lOVCk7CisJCQl9IGVsc2UgeworCQkJCS8qIGluZGlyZWN0IGl0ZW0gKi8KKwkJCQlSRkFMU0UoIWNweV9ieXRlcyAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJCQkJICAgICAgICJ2cy0xMDIwMDogaWgtPmloX2ZyZWVfc3BhY2UgbXVzdCBiZSAwIHdoZW4gaW5kaXJlY3QgaXRlbSB3aWxsIGJlIGFwcGVuZGVkIik7CisJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KCZuX2loLAorCQkJCQkJICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJCSAgIChpaF9pdGVtX2xlbihpaCkgLQorCQkJCQkJICAgIGNweV9ieXRlcykgLyBVTkZNX1BfU0laRSAqCisJCQkJCQkgICBkZXN0LT5iX3NpemUpOworCQkJCXNldF9sZV9paF9rX3R5cGUoJm5faWgsIFRZUEVfSU5ESVJFQ1QpOworCQkJCXNldF9paF9mcmVlX3NwYWNlKCZuX2loLCBnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQkJfQorCisJCQkvKiBzZXQgaXRlbSBsZW5ndGggKi8KKwkJCXB1dF9paF9pdGVtX2xlbigmbl9paCwgY3B5X2J5dGVzKTsKKworCQkJbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247CS8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCisJCQlsZWFmX2luc2VydF9pbnRvX2J1ZihkZXN0X2JpLCAwLCAmbl9paCwKKwkJCQkJICAgICBCX05fUElURU0oc3JjLAorCQkJCQkJICAgICAgIGl0ZW1fbnVtKSArCisJCQkJCSAgICAgaWhfaXRlbV9sZW4oaWgpIC0gY3B5X2J5dGVzLCAwKTsKKwkJfQogCX0KLSAgICB9IGVsc2UgewotCS8qICBpZiAoIGlmIGl0ZW0gaW4gcG9zaXRpb24gaXRlbV9udW0gaW4gYnVmZmVyIFNPVVJDRSBpcyBkaXJlY3RvcnkgaXRlbSApICovCi0JaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgaXRlbV9udW0pKSkKLQkgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIGl0ZW1fbnVtLCBJX0VOVFJZX0NPVU5UKGloKSAtIGNweV9ieXRlcywgY3B5X2J5dGVzKTsKLQllbHNlIHsKLQkgICAgc3RydWN0IGl0ZW1faGVhZCBuX2loOwotICAgICAgCi0JICAgIC8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgaXRlbSBudW1iZXIgJ2l0ZW1fbnVtJyBvZiBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUIAotCSAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2NweV9ieXRlcyc7IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXI7Ci0JICAgICAgIG5faWggPSBuZXcgaXRlbV9oZWFkZXI7Ci0JICAgICovCi0JICAgIG1lbWNweSAoJm5faWgsIGloLCBTSE9SVF9LRVlfU0laRSk7Ci0KLQkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLwotCi0JICAgIGlmIChpc19kaXJlY3RfbGVfaWggKGloKSkgewotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuX2loLCBsZV9paF9rX29mZnNldCAoaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gY3B5X2J5dGVzKTsKLQkJc2V0X2xlX2loX2tfdHlwZSAoJm5faWgsIFRZUEVfRElSRUNUKTsKLQkJc2V0X2loX2ZyZWVfc3BhY2UgKCZuX2loLCBNQVhfVVNfSU5UKTsKLQkgICAgfSBlbHNlIHsKLQkJLyogaW5kaXJlY3QgaXRlbSAqLwotCQlSRkFMU0UoICFjcHlfYnl0ZXMgJiYgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSwKLQkJICAgICAgICAidnMtMTAyMDA6IGloLT5paF9mcmVlX3NwYWNlIG11c3QgYmUgMCB3aGVuIGluZGlyZWN0IGl0ZW0gd2lsbCBiZSBhcHBlbmRlZCIpOwotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuX2loLCBsZV9paF9rX29mZnNldCAoaWgpICsgKGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcykgLyBVTkZNX1BfU0laRSAqIGRlc3QtPmJfc2l6ZSk7Ci0JCXNldF9sZV9paF9rX3R5cGUgKCZuX2loLCBUWVBFX0lORElSRUNUKTsKLQkJc2V0X2loX2ZyZWVfc3BhY2UgKCZuX2loLCBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpKTsKLQkgICAgfQotICAgICAgCi0JICAgIC8qIHNldCBpdGVtIGxlbmd0aCAqLwotCSAgICBwdXRfaWhfaXRlbV9sZW4oICZuX2loLCBjcHlfYnl0ZXMgKTsKLQotCSAgICBuX2loLmloX3ZlcnNpb24gPSBpaC0+aWhfdmVyc2lvbjsgLyogSkRNIEVuZGlhbiBzYWZlLCBib3RoIGxlICovCi0KLQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIDAsICZuX2loLCBCX05fUElURU0oc3JjLGl0ZW1fbnVtKSArIGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcywgMCk7Ci0JfQotICAgIH0KIH0KIAotCiAvKiBJZiBjcHlfYnl0ZXMgZXF1YWxzIG1pbnVzIG9uZSB0aGFuIGNvcHkgY3B5X251bSB3aG9sZSBpdGVtcyBmcm9tIFNPVVJDRSB0byBERVNULgogICAgSWYgY3B5X2J5dGVzIG5vdCBlcXVhbCB0byBtaW51cyBvbmUgdGhhbiBjb3B5IGNweV9udW0tMSB3aG9sZSBpdGVtcyBmcm9tIFNPVVJDRSB0byBERVNULgogICAgRnJvbSBsYXN0IGl0ZW0gY29weSBjcHlfbnVtIGJ5dGVzIGZvciByZWd1bGFyIGl0ZW0gYW5kIGNweV9udW0gZGlyZWN0b3J5IGVudHJpZXMgZm9yCiAgICBkaXJlY3RvcnkgaXRlbS4gKi8KLXN0YXRpYyBpbnQgbGVhZl9jb3B5X2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwKLQkJCSAgICBpbnQgY3B5X2J5dGVzKQorc3RhdGljIGludCBsZWFmX2NvcHlfaXRlbXMoc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNyYywKKwkJCSAgIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwgaW50IGNweV9ieXRlcykKIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdDsKLSAgaW50IHBvcywgaSwgc3JjX25yX2l0ZW0sIGJ5dGVzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdDsKKwlpbnQgcG9zLCBpLCBzcmNfbnJfaXRlbSwgYnl0ZXM7CiAKLSAgZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICBSRkFMU0UoICFkZXN0IHx8ICFzcmMsICJ2cy0xMDIxMDogIWRlc3QgfHwgIXNyYyIpOwotICBSRkFMU0UoIGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCi0JICAidnMtMTAyMjA6bGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNUICYmIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCIpOwotICBSRkFMU0UoIEJfTlJfSVRFTVMoc3JjKSA8IGNweV9udW0sCi0JICAidnMtMTAyMzA6IE5vIGVub3VnaCBpdGVtczogJWQsIHJlcS4gJWQiLCBCX05SX0lURU1TKHNyYyksIGNweV9udW0pOwotICBSRkFMU0UoIGNweV9udW0gPCAwLCJ2cy0xMDI0MDogY3B5X251bSA8IDAgKCVkKSIsIGNweV9udW0pOworCWRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKwlSRkFMU0UoIWRlc3QgfHwgIXNyYywgInZzLTEwMjEwOiAhZGVzdCB8fCAhc3JjIik7CisJUkZBTFNFKGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCisJICAgICAgICJ2cy0xMDIyMDpsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QgJiYgbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNUIik7CisJUkZBTFNFKEJfTlJfSVRFTVMoc3JjKSA8IGNweV9udW0sCisJICAgICAgICJ2cy0xMDIzMDogTm8gZW5vdWdoIGl0ZW1zOiAlZCwgcmVxLiAlZCIsIEJfTlJfSVRFTVMoc3JjKSwKKwkgICAgICAgY3B5X251bSk7CisJUkZBTFNFKGNweV9udW0gPCAwLCAidnMtMTAyNDA6IGNweV9udW0gPCAwICglZCkiLCBjcHlfbnVtKTsKIAotIGlmICggY3B5X251bSA9PSAwICkKLSAgIHJldHVybiAwOwotIAotIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgewotICAgLyogY29weSBpdGVtcyB0byBsZWZ0ICovCi0gICBwb3MgPSAwOwotICAgaWYgKCBjcHlfbnVtID09IDEgKQotICAgICBieXRlcyA9IGNweV9ieXRlczsKLSAgIGVsc2UKLSAgICAgYnl0ZXMgPSAtMTsKLSAgIAotICAgLyogY29weSB0aGUgZmlyc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDAsYnl0ZXMpKSAqLwotICAgaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGJ5dGVzKTsKLSAgIGNweV9udW0gLT0gaTsKLSAgIGlmICggY3B5X251bSA9PSAwICkKLSAgICAgcmV0dXJuIGk7Ci0gICBwb3MgKz0gaTsKLSAgIGlmICggY3B5X2J5dGVzID09IC0xICkKLSAgICAgLyogY29weSBmaXJzdCBjcHlfbnVtIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcycgb2YgU09VUkNFIHRvIGVuZCBvZiBERVNUICovCi0gICAgIGxlYWZfY29weV9pdGVtc19lbnRpcmVseSAoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCBwb3MsIGNweV9udW0pOwotICAgZWxzZSB7Ci0gICAgIC8qIGNvcHkgZmlyc3QgY3B5X251bS0xIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcy0xJyBvZiB0aGUgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIERFU1QgKi8KLSAgICAgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIHBvcywgY3B5X251bS0xKTsKLQkgICAgIAotICAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGl0ZW0gd2hpY2ggbnVtYmVyIGlzIGNweV9udW0rcG9zLTEgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAqLwotICAgICBsZWFmX2l0ZW1fYm90dGxlIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGNweV9udW0rcG9zLTEsIGNweV9ieXRlcyk7Ci0gICB9IAotIH0gZWxzZSB7Ci0gICAvKiBjb3B5IGl0ZW1zIHRvIHJpZ2h0ICovCi0gICBzcmNfbnJfaXRlbSA9IEJfTlJfSVRFTVMgKHNyYyk7Ci0gICBpZiAoIGNweV9udW0gPT0gMSApCi0gICAgIGJ5dGVzID0gY3B5X2J5dGVzOwotICAgZWxzZQotICAgICBieXRlcyA9IC0xOwotICAgCi0gICAvKiBjb3B5IHRoZSBsYXN0IGl0ZW0gb3IgaXQgcGFydCBvciBub3RoaW5nIHRvIHRoZSBiZWdpbiBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDEsYnl0ZXMpKTsgKi8KLSAgIGkgPSBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbSAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBieXRlcyk7Ci0gICAKLSAgIGNweV9udW0gLT0gaTsKLSAgIGlmICggY3B5X251bSA9PSAwICkKLSAgICAgcmV0dXJuIGk7Ci0gICAKLSAgIHBvcyA9IHNyY19ucl9pdGVtIC0gY3B5X251bSAtIGk7Ci0gICBpZiAoIGNweV9ieXRlcyA9PSAtMSApIHsKLSAgICAgLyogc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zJyBjb3B5IGxhc3QgY3B5X251bSBpdGVtcyBvZiBTT1VSQ0UgdG8gYmVnaW4gb2YgREVTVCAqLwotICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLCBjcHlfbnVtKTsKLSAgIH0gZWxzZSB7Ci0gICAgIC8qIGNvcHkgbGFzdCBjcHlfbnVtLTEgaXRlbXMgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zKzEnIG9mIHRoZSBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUOyAqLwotICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zKzEsIGNweV9udW0tMSk7CisJaWYgKGNweV9udW0gPT0gMCkKKwkJcmV0dXJuIDA7CiAKLSAgICAgLyogY29weSBwYXJ0IG9mIHRoZSBpdGVtIHdoaWNoIG51bWJlciBpcyBwb3MgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUICovCi0gICAgIGxlYWZfaXRlbV9ib3R0bGUgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLCBjcHlfYnl0ZXMpOwotICAgfQotIH0KLSByZXR1cm4gaTsKKwlpZiAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSB7CisJCS8qIGNvcHkgaXRlbXMgdG8gbGVmdCAqLworCQlwb3MgPSAwOworCQlpZiAoY3B5X251bSA9PSAxKQorCQkJYnl0ZXMgPSBjcHlfYnl0ZXM7CisJCWVsc2UKKwkJCWJ5dGVzID0gLTE7CisKKwkJLyogY29weSB0aGUgZmlyc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDAsYnl0ZXMpKSAqLworCQlpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCBieXRlcyk7CisJCWNweV9udW0gLT0gaTsKKwkJaWYgKGNweV9udW0gPT0gMCkKKwkJCXJldHVybiBpOworCQlwb3MgKz0gaTsKKwkJaWYgKGNweV9ieXRlcyA9PSAtMSkKKwkJCS8qIGNvcHkgZmlyc3QgY3B5X251bSBpdGVtcyBzdGFydGluZyBmcm9tIHBvc2l0aW9uICdwb3MnIG9mIFNPVVJDRSB0byBlbmQgb2YgREVTVCAqLworCQkJbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5KGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwKKwkJCQkJCSBwb3MsIGNweV9udW0pOworCQllbHNlIHsKKwkJCS8qIGNvcHkgZmlyc3QgY3B5X251bS0xIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcy0xJyBvZiB0aGUgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIERFU1QgKi8KKwkJCWxlYWZfY29weV9pdGVtc19lbnRpcmVseShkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsCisJCQkJCQkgcG9zLCBjcHlfbnVtIC0gMSk7CisKKwkJCS8qIGNvcHkgcGFydCBvZiB0aGUgaXRlbSB3aGljaCBudW1iZXIgaXMgY3B5X251bStwb3MtMSB0byB0aGUgZW5kIG9mIHRoZSBERVNUICovCisJCQlsZWFmX2l0ZW1fYm90dGxlKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwKKwkJCQkJIGNweV9udW0gKyBwb3MgLSAxLCBjcHlfYnl0ZXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyogY29weSBpdGVtcyB0byByaWdodCAqLworCQlzcmNfbnJfaXRlbSA9IEJfTlJfSVRFTVMoc3JjKTsKKwkJaWYgKGNweV9udW0gPT0gMSkKKwkJCWJ5dGVzID0gY3B5X2J5dGVzOworCQllbHNlCisJCQlieXRlcyA9IC0xOworCisJCS8qIGNvcHkgdGhlIGxhc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUIChpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oREVTVCxTT1VSQ0UsMSxieXRlcykpOyAqLworCQlpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBieXRlcyk7CisKKwkJY3B5X251bSAtPSBpOworCQlpZiAoY3B5X251bSA9PSAwKQorCQkJcmV0dXJuIGk7CisKKwkJcG9zID0gc3JjX25yX2l0ZW0gLSBjcHlfbnVtIC0gaTsKKwkJaWYgKGNweV9ieXRlcyA9PSAtMSkgeworCQkJLyogc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zJyBjb3B5IGxhc3QgY3B5X251bSBpdGVtcyBvZiBTT1VSQ0UgdG8gYmVnaW4gb2YgREVTVCAqLworCQkJbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5KGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwKKwkJCQkJCSBwb3MsIGNweV9udW0pOworCQl9IGVsc2UgeworCQkJLyogY29weSBsYXN0IGNweV9udW0tMSBpdGVtcyBzdGFydGluZyBmcm9tIHBvc2l0aW9uICdwb3MrMScgb2YgdGhlIFNPVVJDRSB0byB0aGUgYmVnaW4gb2YgdGhlIERFU1Q7ICovCisJCQlsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCQkJIHBvcyArIDEsIGNweV9udW0gLSAxKTsKKworCQkJLyogY29weSBwYXJ0IG9mIHRoZSBpdGVtIHdoaWNoIG51bWJlciBpcyBwb3MgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUICovCisJCQlsZWFmX2l0ZW1fYm90dGxlKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLAorCQkJCQkgY3B5X2J5dGVzKTsKKwkJfQorCX0KKwlyZXR1cm4gaTsKIH0KIAotCiAvKiB0aGVyZSBhcmUgdHlwZXMgb2YgY29waW5nOiBmcm9tIFNbMF0gdG8gTFswXSwgZnJvbSBTWzBdIHRvIFJbMF0sCiAgICBmcm9tIFJbMF0gdG8gTFswXS4gZm9yIGVhY2ggb2YgdGhlc2Ugd2UgaGF2ZSB0byBkZWZpbmUgcGFyZW50IGFuZAogICAgcG9zaXRpb25zIG9mIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UgYnVmZmVycyAqLwotc3RhdGljIHZvaWQgbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksCi0JCQkJCXN0cnVjdCBidWZmZXJfaW5mbyAqIHNyY19iaSwgaW50ICogZmlyc3RfbGFzdCwKLQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldykKK3N0YXRpYyB2b2lkIGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gKnNyY19iaSwKKwkJCQkgICAgICAgaW50ICpmaXJzdF9sYXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNuZXcpCiB7Ci0gICAgbWVtc2V0IChkZXN0X2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOwotICAgIG1lbXNldCAoc3JjX2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOworCW1lbXNldChkZXN0X2JpLCAwLCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7CisJbWVtc2V0KHNyY19iaSwgMCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaW5mbykpOwogCi0gICAgLyogZGVmaW5lIGRlc3QsIHNyYywgZGVzdCBwYXJlbnQsIGRlc3QgcG9zaXRpb24gKi8KLSAgICBzd2l0Y2ggKHNoaWZ0X21vZGUpIHsKLSAgICBjYXNlIExFQUZfRlJPTV9TX1RPX0w6ICAgIC8qIGl0IGlzIHVzZWQgaW4gbGVhZl9zaGlmdF9sZWZ0ICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIDApOwkvKiBzcmMtPmJfaXRlbV9vcmRlciAqLwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFswXTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCSpmaXJzdF9sYXN0ID0gRklSU1RfVE9fTEFTVDsKLQlicmVhazsKKwkvKiBkZWZpbmUgZGVzdCwgc3JjLCBkZXN0IHBhcmVudCwgZGVzdCBwb3NpdGlvbiAqLworCXN3aXRjaCAoc2hpZnRfbW9kZSkgeworCWNhc2UgTEVBRl9GUk9NX1NfVE9fTDoJLyogaXQgaXMgdXNlZCBpbiBsZWFmX3NoaWZ0X2xlZnQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIDApOwkvKiBzcmMtPmJfaXRlbV9vcmRlciAqLworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MWzBdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkqZmlyc3RfbGFzdCA9IEZJUlNUX1RPX0xBU1Q7CisJCWJyZWFrOwogCi0gICAgY2FzZSBMRUFGX0ZST01fU19UT19SOiAgLyogaXQgaXMgdXNlZCBpbiBsZWFmX3NoaWZ0X3JpZ2h0ICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIDApOwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSB0Yi0+UlswXTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7Ci0JYnJlYWs7CisJY2FzZSBMRUFGX0ZST01fU19UT19SOgkvKiBpdCBpcyB1c2VkIGluIGxlYWZfc2hpZnRfcmlnaHQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIDApOworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SWzBdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOworCQlicmVhazsKIAotICAgIGNhc2UgTEVBRl9GUk9NX1JfVE9fTDogIC8qIGl0IGlzIHVzZWQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSB0Yi0+UlswXTsKLQlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MWzBdOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JKmZpcnN0X2xhc3QgPSBGSVJTVF9UT19MQVNUOwotCWJyZWFrOwotICAgIAotICAgIGNhc2UgTEVBRl9GUk9NX0xfVE9fUjogIC8qIGl0IGlzIHVzZWQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSB0Yi0+TFswXTsKLQlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPlJbMF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSWzBdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOwotCWJyZWFrOworCWNhc2UgTEVBRl9GUk9NX1JfVE9fTDoJLyogaXQgaXMgdXNlZCBpbiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gdGItPlJbMF07CisJCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZSWzBdOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFswXTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMWzBdOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJKmZpcnN0X2xhc3QgPSBGSVJTVF9UT19MQVNUOworCQlicmVhazsKIAotICAgIGNhc2UgTEVBRl9GUk9NX1NfVE9fU05FVzoKLQlzcmNfYmktPnRiID0gdGI7Ci0Jc3JjX2JpLT5iaV9iaCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOwotCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgMCk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IFNuZXc7Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gTlVMTDsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IDA7Ci0JKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOwotCWJyZWFrOwotICAgIAotICAgIGRlZmF1bHQ6Ci0JcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy0xMDI1MDogbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwgc2hpZnRfbW9kZSk7Ci0gICAgfQotICAgIFJGQUxTRSggc3JjX2JpLT5iaV9iaCA9PSAwIHx8IGRlc3RfYmktPmJpX2JoID09IDAsCi0JICAgICJ2cy0xMDI2MDogbW9kZT09JWQsIHNvdXJjZSAoJXApIG9yIGRlc3QgKCVwKSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgaW5jb3JyZWN0bHkiLAotCSAgICBzaGlmdF9tb2RlLCBzcmNfYmktPmJpX2JoLCBkZXN0X2JpLT5iaV9iaCk7CisJY2FzZSBMRUFGX0ZST01fTF9UT19SOgkvKiBpdCBpcyB1c2VkIGluIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAqLworCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSB0Yi0+TFswXTsKKwkJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gdGItPlJbMF07CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7CisJCWJyZWFrOworCisJY2FzZSBMRUFGX0ZST01fU19UT19TTkVXOgorCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCk7CisJCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgMCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gU25ldzsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gTlVMTDsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSAwOworCQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtMTAyNTA6IGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zOiBzaGlmdCB0eXBlIGlzIHVua25vd24gKCVkKSIsCisJCQkgICAgICAgc2hpZnRfbW9kZSk7CisJfQorCVJGQUxTRShzcmNfYmktPmJpX2JoID09IDAgfHwgZGVzdF9iaS0+YmlfYmggPT0gMCwKKwkgICAgICAgInZzLTEwMjYwOiBtb2RlPT0lZCwgc291cmNlICglcCkgb3IgZGVzdCAoJXApIGJ1ZmZlciBpcyBpbml0aWFsaXplZCBpbmNvcnJlY3RseSIsCisJICAgICAgIHNoaWZ0X21vZGUsIHNyY19iaS0+YmlfYmgsIGRlc3RfYmktPmJpX2JoKTsKIH0KIAotCi0KLQogLyogY29weSBtb3ZfbnVtIGl0ZW1zIGFuZCBtb3ZfYnl0ZXMgb2YgdGhlIChtb3ZfbnVtLTEpdGggaXRlbSB0bwogICAgbmVpZ2hib3IuIERlbGV0ZSB0aGVtIGZyb20gc291cmNlICovCi1pbnQgbGVhZl9tb3ZlX2l0ZW1zIChpbnQgc2hpZnRfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgbW92X251bSwgaW50IG1vdl9ieXRlcywgc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldykKK2ludCBsZWFmX21vdmVfaXRlbXMoaW50IHNoaWZ0X21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgbW92X251bSwKKwkJICAgIGludCBtb3ZfYnl0ZXMsIHN0cnVjdCBidWZmZXJfaGVhZCAqU25ldykKIHsKLSAgaW50IHJldF92YWx1ZTsKLSAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKLSAgaW50IGZpcnN0X2xhc3Q7CisJaW50IHJldF92YWx1ZTsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCWludCBmaXJzdF9sYXN0OwogCi0gIGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChzaGlmdF9tb2RlLCB0YiwgJmRlc3RfYmksICZzcmNfYmksICZmaXJzdF9sYXN0LCBTbmV3KTsKKwlsZWFmX2RlZmluZV9kZXN0X3NyY19pbmZvcyhzaGlmdF9tb2RlLCB0YiwgJmRlc3RfYmksICZzcmNfYmksCisJCQkJICAgJmZpcnN0X2xhc3QsIFNuZXcpOwogCi0gIHJldF92YWx1ZSA9IGxlYWZfY29weV9pdGVtcyAoJmRlc3RfYmksIHNyY19iaS5iaV9iaCwgZmlyc3RfbGFzdCwgbW92X251bSwgbW92X2J5dGVzKTsKKwlyZXRfdmFsdWUgPQorCSAgICBsZWFmX2NvcHlfaXRlbXMoJmRlc3RfYmksIHNyY19iaS5iaV9iaCwgZmlyc3RfbGFzdCwgbW92X251bSwKKwkJCSAgICBtb3ZfYnl0ZXMpOwogCi0gIGxlYWZfZGVsZXRlX2l0ZW1zICgmc3JjX2JpLCBmaXJzdF9sYXN0LCAoZmlyc3RfbGFzdCA9PSBGSVJTVF9UT19MQVNUKSA/IDAgOiAoQl9OUl9JVEVNUyhzcmNfYmkuYmlfYmgpIC0gbW92X251bSksIG1vdl9udW0sIG1vdl9ieXRlcyk7CisJbGVhZl9kZWxldGVfaXRlbXMoJnNyY19iaSwgZmlyc3RfbGFzdCwKKwkJCSAgKGZpcnN0X2xhc3QgPT0KKwkJCSAgIEZJUlNUX1RPX0xBU1QpID8gMCA6IChCX05SX0lURU1TKHNyY19iaS5iaV9iaCkgLQorCQkJCQkJIG1vdl9udW0pLCBtb3ZfbnVtLCBtb3ZfYnl0ZXMpOwogCi0gIAotICByZXR1cm4gcmV0X3ZhbHVlOworCXJldHVybiByZXRfdmFsdWU7CiB9CiAKLQogLyogU2hpZnQgc2hpZnRfbnVtIGl0ZW1zIChhbmQgc2hpZnRfYnl0ZXMgb2YgbGFzdCBzaGlmdGVkIGl0ZW0gaWYgc2hpZnRfYnl0ZXMgIT0gLTEpCiAgICBmcm9tIFNbMF0gdG8gTFswXSBhbmQgcmVwbGFjZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KLWludCBsZWFmX3NoaWZ0X2xlZnQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQoraW50IGxlYWZfc2hpZnRfbGVmdChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQogewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7Ci0gIGludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqUzAgPSBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCk7CisJaW50IGk7CiAKLSAgLyogbW92ZSBzaGlmdF9udW0gKGFuZCBzaGlmdF9ieXRlcyBieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIGxlZnQgbmVpZ2hib3IgTFswXSAqLwotICBpID0gbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19MLCB0Yiwgc2hpZnRfbnVtLCBzaGlmdF9ieXRlcywgTlVMTCk7CisJLyogbW92ZSBzaGlmdF9udW0gKGFuZCBzaGlmdF9ieXRlcyBieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIGxlZnQgbmVpZ2hib3IgTFswXSAqLworCWkgPSBsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fTCwgdGIsIHNoaWZ0X251bSwgc2hpZnRfYnl0ZXMsIE5VTEwpOwogCi0gIGlmICggc2hpZnRfbnVtICkgewotICAgIGlmIChCX05SX0lURU1TIChTMCkgPT0gMCkgeyAvKiBudW1iZXIgb2YgaXRlbXMgaW4gU1swXSA9PSAwICovCisJaWYgKHNoaWZ0X251bSkgeworCQlpZiAoQl9OUl9JVEVNUyhTMCkgPT0gMCkgewkvKiBudW1iZXIgb2YgaXRlbXMgaW4gU1swXSA9PSAwICovCiAKLSAgICAgIFJGQUxTRSggc2hpZnRfYnl0ZXMgIT0gLTEsCi0JICAgICAgInZzLTEwMjcwOiBTMCBpcyBlbXB0eSBub3csIGJ1dCBzaGlmdF9ieXRlcyAhPSAtMSAoJWQpIiwgCi0JICAgICAgc2hpZnRfYnl0ZXMpOworCQkJUkZBTFNFKHNoaWZ0X2J5dGVzICE9IC0xLAorCQkJICAgICAgICJ2cy0xMDI3MDogUzAgaXMgZW1wdHkgbm93LCBidXQgc2hpZnRfYnl0ZXMgIT0gLTEgKCVkKSIsCisJCQkgICAgICAgc2hpZnRfYnl0ZXMpOwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgICAgaWYgKHRiLT50Yl9tb2RlID09IE1fUEFTVEUgfHwgdGItPnRiX21vZGUgPT0gTV9JTlNFUlQpIHsKLQlwcmludF9jdXJfdGIgKCJ2cy0xMDI3NSIpOwotCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy0xMDI3NTogbGVhZl9zaGlmdF9sZWZ0OiBiYWxhbmNlIGNvbmRpdGlvbiBjb3JydXB0ZWQgKCVjKSIsIHRiLT50Yl9tb2RlKTsKLSAgICAgIH0KKwkJCWlmICh0Yi0+dGJfbW9kZSA9PSBNX1BBU1RFIHx8IHRiLT50Yl9tb2RlID09IE1fSU5TRVJUKSB7CisJCQkJcHJpbnRfY3VyX3RiKCJ2cy0xMDI3NSIpOworCQkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkJICAgICAgICJ2cy0xMDI3NTogbGVhZl9zaGlmdF9sZWZ0OiBiYWxhbmNlIGNvbmRpdGlvbiBjb3JydXB0ZWQgKCVjKSIsCisJCQkJCSAgICAgICB0Yi0+dGJfbW9kZSk7CisJCQl9CiAjZW5kaWYKIAotICAgICAgaWYgKFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpID09IDApCi0JcmVwbGFjZV9rZXkgKHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwgUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKSwgMCk7CisJCQlpZiAoUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKSA9PSAwKQorCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwKKwkJCQkJICAgIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwgMCk7CiAKLSAgICB9IGVsc2UgeyAgICAgCi0gICAgICAvKiByZXBsYWNlIGxrZXkgaW4gQ0ZMWzBdIGJ5IDAtdGgga2V5IGZyb20gU1swXTsgKi8KLSAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIFMwLCAwKTsKLSAgICAgIAotICAgICAgUkZBTFNFKCAoc2hpZnRfYnl0ZXMgIT0gLTEgJiYKLSAgICAgICAgICAgICAgIShpc19kaXJlbnRyeV9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKFMwLCAwKSkKLSAgICAgICAgICAgICAgICAmJiAhSV9FTlRSWV9DT1VOVCAoQl9OX1BJVEVNX0hFQUQgKFMwLCAwKSkpKSAmJgotCSAgICAgICghb3BfaXNfbGVmdF9tZXJnZWFibGUgKEJfTl9QS0VZIChTMCwgMCksIFMwLT5iX3NpemUpKSwKLQkgICAgICAidnMtMTAyODA6IGl0ZW0gbXVzdCBiZSBtZXJnZWFibGUiKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHJldHVybiBpOworCQl9IGVsc2UgeworCQkJLyogcmVwbGFjZSBsa2V5IGluIENGTFswXSBieSAwLXRoIGtleSBmcm9tIFNbMF07ICovCisJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIFMwLCAwKTsKKworCQkJUkZBTFNFKChzaGlmdF9ieXRlcyAhPSAtMSAmJgorCQkJCSEoaXNfZGlyZW50cnlfbGVfaWgoQl9OX1BJVEVNX0hFQUQoUzAsIDApKQorCQkJCSAgJiYgIUlfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQoUzAsIDApKSkpICYmCisJCQkgICAgICAgKCFvcF9pc19sZWZ0X21lcmdlYWJsZQorCQkJCShCX05fUEtFWShTMCwgMCksIFMwLT5iX3NpemUpKSwKKwkJCSAgICAgICAidnMtMTAyODA6IGl0ZW0gbXVzdCBiZSBtZXJnZWFibGUiKTsKKwkJfQorCX0KKworCXJldHVybiBpOwogfQogCi0KLQotCi0KIC8qIENMRUFOSU5HIFNUT1BQRUQgSEVSRSAqLwogCi0KLQotCiAvKiBTaGlmdCBzaGlmdF9udW0gKHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIHJpZ2h0IG5laWdoYm9yLCBhbmQgcmVwbGFjZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KLWludAlsZWFmX3NoaWZ0X3JpZ2h0KAotCQlzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQlpbnQgc2hpZnRfbnVtLAotCQlpbnQgc2hpZnRfYnl0ZXMKLQkpCitpbnQgbGVhZl9zaGlmdF9yaWdodChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQogewotICAvLyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogUzAgPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotICBpbnQgcmV0X3ZhbHVlOworCS8vICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisJaW50IHJldF92YWx1ZTsKIAotICAvKiBtb3ZlIHNoaWZ0X251bSAoYW5kIHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gcmlnaHQgbmVpZ2hib3IgUlswXSAqLwotICByZXRfdmFsdWUgPSBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1IsIHRiLCBzaGlmdF9udW0sIHNoaWZ0X2J5dGVzLCBOVUxMKTsKKwkvKiBtb3ZlIHNoaWZ0X251bSAoYW5kIHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gcmlnaHQgbmVpZ2hib3IgUlswXSAqLworCXJldF92YWx1ZSA9CisJICAgIGxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19SLCB0Yiwgc2hpZnRfbnVtLCBzaGlmdF9ieXRlcywgTlVMTCk7CiAKLSAgLyogcmVwbGFjZSBya2V5IGluIENGUlswXSBieSB0aGUgMC10aCBrZXkgZnJvbSBSWzBdICovCi0gIGlmIChzaGlmdF9udW0pIHsKLSAgICByZXBsYWNlX2tleSAodGIsIHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdLCB0Yi0+UlswXSwgMCk7CisJLyogcmVwbGFjZSBya2V5IGluIENGUlswXSBieSB0aGUgMC10aCBrZXkgZnJvbSBSWzBdICovCisJaWYgKHNoaWZ0X251bSkgeworCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSwgdGItPnJrZXlbMF0sIHRiLT5SWzBdLCAwKTsKIAotICB9CisJfQogCi0gIHJldHVybiByZXRfdmFsdWU7CisJcmV0dXJuIHJldF92YWx1ZTsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwKLQkJCQkJaW50IGZpcnN0LCBpbnQgZGVsX251bSk7CitzdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLAorCQkJCSAgICAgICBpbnQgZmlyc3QsIGludCBkZWxfbnVtKTsKIC8qICBJZiBkZWxfYnl0ZXMgPT0gLTEsIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ2ZpcnN0JyBkZWxldGUgZGVsX251bSBpdGVtcyBpbiB3aG9sZSBpbiBidWZmZXIgQ1VSLgogICAgIElmIG5vdC4gCiAgICAgSWYgbGFzdF9maXJzdCA9PSAwLiBTdGFydGluZyBmcm9tIHBvc2l0aW9uICdmaXJzdCcgZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBpbiB3aG9sZS4gRGVsZXRlIHBhcnQgb2YgYm9keSBvZgpAQCAtNjcwLDI4NyArNzMxLDI5MiBAQAogICAgIElmIGxhc3RfZmlyc3QgPT0gMS4gU3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAnZmlyc3QrMScgZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBpbiB3aG9sZS4gRGVsZXRlIHBhcnQgb2YgYm9keSBvZgogICAgIHRoZSBsYXN0IGl0ZW0gLiBQYXJ0IGRlZmluZWQgYnkgZGVsX2J5dGVzLiBEb24ndCBkZWxldGUgbGFzdCBpdGVtIGhlYWRlci4KICovCi12b2lkIGxlYWZfZGVsZXRlX2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksIGludCBsYXN0X2ZpcnN0LCAKLQkJCWludCBmaXJzdCwgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpCit2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zKHN0cnVjdCBidWZmZXJfaW5mbyAqY3VyX2JpLCBpbnQgbGFzdF9maXJzdCwKKwkJICAgICAgIGludCBmaXJzdCwgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgaW50IGl0ZW1fYW1vdW50ID0gQl9OUl9JVEVNUyAoYmggPSBjdXJfYmktPmJpX2JoKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBpdGVtX2Ftb3VudCA9IEJfTlJfSVRFTVMoYmggPSBjdXJfYmktPmJpX2JoKTsKIAotICAgIFJGQUxTRSggIWJoLCAiMTAxNTU6IGJoIGlzIG5vdCBkZWZpbmVkIik7Ci0gICAgUkZBTFNFKCBkZWxfbnVtIDwgMCwgIjEwMTYwOiBkZWxfbnVtIGNhbiBub3QgYmUgPCAwLiBkZWxfbnVtPT0lZCIsIGRlbF9udW0pOwotICAgIFJGQUxTRSggZmlyc3QgPCAwIHx8IGZpcnN0ICsgZGVsX251bSA+IGl0ZW1fYW1vdW50LAotCSAgICAiMTAxNjU6IGludmFsaWQgbnVtYmVyIG9mIGZpcnN0IGl0ZW0gdG8gYmUgZGVsZXRlZCAoJWQpIG9yICIKLQkgICAgIm5vIHNvIG11Y2ggaXRlbXMgKCVkKSB0byBkZWxldGUgKG9ubHkgJWQpIiwgCi0JICAgIGZpcnN0LCBmaXJzdCArIGRlbF9udW0sIGl0ZW1fYW1vdW50KTsKKwlSRkFMU0UoIWJoLCAiMTAxNTU6IGJoIGlzIG5vdCBkZWZpbmVkIik7CisJUkZBTFNFKGRlbF9udW0gPCAwLCAiMTAxNjA6IGRlbF9udW0gY2FuIG5vdCBiZSA8IDAuIGRlbF9udW09PSVkIiwKKwkgICAgICAgZGVsX251bSk7CisJUkZBTFNFKGZpcnN0IDwgMAorCSAgICAgICB8fCBmaXJzdCArIGRlbF9udW0gPiBpdGVtX2Ftb3VudCwKKwkgICAgICAgIjEwMTY1OiBpbnZhbGlkIG51bWJlciBvZiBmaXJzdCBpdGVtIHRvIGJlIGRlbGV0ZWQgKCVkKSBvciAiCisJICAgICAgICJubyBzbyBtdWNoIGl0ZW1zICglZCkgdG8gZGVsZXRlIChvbmx5ICVkKSIsIGZpcnN0LAorCSAgICAgICBmaXJzdCArIGRlbF9udW0sIGl0ZW1fYW1vdW50KTsKIAotICAgIGlmICggZGVsX251bSA9PSAwICkKLQlyZXR1cm47CisJaWYgKGRlbF9udW0gPT0gMCkKKwkJcmV0dXJuOwogCi0gICAgaWYgKCBmaXJzdCA9PSAwICYmIGRlbF9udW0gPT0gaXRlbV9hbW91bnQgJiYgZGVsX2J5dGVzID09IC0xICkgewotCW1ha2VfZW1wdHlfbm9kZSAoY3VyX2JpKTsKLQlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoY3VyX2JpLT50YiwgYmgsIDApOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIGRlbF9ieXRlcyA9PSAtMSApCi0JLyogZGVsZXRlIGRlbF9udW0gaXRlbXMgYmVnaW5uaW5nIGZyb20gaXRlbSBpbiBwb3NpdGlvbiBmaXJzdCAqLwotCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChjdXJfYmksIGZpcnN0LCBkZWxfbnVtKTsKLSAgICBlbHNlIHsKLQlpZiAoIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCApIHsKLQkgICAgLyogZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0ICAqLwotCSAgICBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoY3VyX2JpLCBmaXJzdCwgZGVsX251bS0xKTsKLQotCSAgICAvKiBkZWxldGUgdGhlIHBhcnQgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIGJoCi0JICAgICAgIGRvIG5vdCBkZWxldGUgaXRlbSBoZWFkZXIKLQkgICAgKi8KLQkgICAgbGVhZl9jdXRfZnJvbV9idWZmZXIgKGN1cl9iaSwgMCwgMCwgZGVsX2J5dGVzKTsKLQl9IGVsc2UgIHsKLQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotCSAgICBpbnQgbGVuOwotCi0JICAgIC8qIGRlbGV0ZSBkZWxfbnVtLTEgaXRlbXMgYmVnaW5uaW5nIGZyb20gaXRlbSBpbiBwb3NpdGlvbiBmaXJzdCsxICAqLwotCSAgICBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoY3VyX2JpLCBmaXJzdCsxLCBkZWxfbnVtLTEpOwotCi0JICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAoaWggPSBCX05fUElURU1fSEVBRChiaCwgQl9OUl9JVEVNUyhiaCktMSkpKSAJLyogdGhlIGxhc3QgaXRlbSBpcyBkaXJlY3RvcnkgICovCi0JICAgICAgICAvKiBsZW4gPSBudW1iZXJzIG9mIGRpcmVjdG9yeSBlbnRyaWVzIGluIHRoaXMgaXRlbSAqLwotCQlsZW4gPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0JICAgIGVsc2UKLQkgICAgICAgIC8qIGxlbiA9IGJvZHkgbGVuIG9mIGl0ZW0gKi8KLQkJbGVuID0gaWhfaXRlbV9sZW4oaWgpOwotCi0JICAgIC8qIGRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgbGFzdCBpdGVtIG9mIHRoZSBiaCAKLQkgICAgICAgZG8gbm90IGRlbGV0ZSBpdGVtIGhlYWRlcgotCSAgICAqLwotCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoY3VyX2JpLCBCX05SX0lURU1TKGJoKS0xLCBsZW4gLSBkZWxfYnl0ZXMsIGRlbF9ieXRlcyk7CisJaWYgKGZpcnN0ID09IDAgJiYgZGVsX251bSA9PSBpdGVtX2Ftb3VudCAmJiBkZWxfYnl0ZXMgPT0gLTEpIHsKKwkJbWFrZV9lbXB0eV9ub2RlKGN1cl9iaSk7CisJCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGN1cl9iaS0+dGIsIGJoLCAwKTsKKwkJcmV0dXJuOwogCX0KLSAgICB9Ci19CiAKKwlpZiAoZGVsX2J5dGVzID09IC0xKQorCQkvKiBkZWxldGUgZGVsX251bSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0ICovCisJCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5KGN1cl9iaSwgZmlyc3QsIGRlbF9udW0pOworCWVsc2UgeworCQlpZiAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSB7CisJCQkvKiBkZWxldGUgZGVsX251bS0xIGl0ZW1zIGJlZ2lubmluZyBmcm9tIGl0ZW0gaW4gcG9zaXRpb24gZmlyc3QgICovCisJCQlsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShjdXJfYmksIGZpcnN0LCBkZWxfbnVtIC0gMSk7CisKKwkJCS8qIGRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgZmlyc3QgaXRlbSBvZiB0aGUgYmgKKwkJCSAgIGRvIG5vdCBkZWxldGUgaXRlbSBoZWFkZXIKKwkJCSAqLworCQkJbGVhZl9jdXRfZnJvbV9idWZmZXIoY3VyX2JpLCAwLCAwLCBkZWxfYnl0ZXMpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJCQlpbnQgbGVuOworCisJCQkvKiBkZWxldGUgZGVsX251bS0xIGl0ZW1zIGJlZ2lubmluZyBmcm9tIGl0ZW0gaW4gcG9zaXRpb24gZmlyc3QrMSAgKi8KKwkJCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5KGN1cl9iaSwgZmlyc3QgKyAxLAorCQkJCQkJICAgZGVsX251bSAtIDEpOworCisJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgKKwkJCSAgICAoaWggPSBCX05fUElURU1fSEVBRChiaCwgQl9OUl9JVEVNUyhiaCkgLSAxKSkpCisJCQkJLyogdGhlIGxhc3QgaXRlbSBpcyBkaXJlY3RvcnkgICovCisJCQkJLyogbGVuID0gbnVtYmVycyBvZiBkaXJlY3RvcnkgZW50cmllcyBpbiB0aGlzIGl0ZW0gKi8KKwkJCQlsZW4gPSBpaF9lbnRyeV9jb3VudChpaCk7CisJCQllbHNlCisJCQkJLyogbGVuID0gYm9keSBsZW4gb2YgaXRlbSAqLworCQkJCWxlbiA9IGloX2l0ZW1fbGVuKGloKTsKKworCQkJLyogZGVsZXRlIHRoZSBwYXJ0IG9mIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJoIAorCQkJICAgZG8gbm90IGRlbGV0ZSBpdGVtIGhlYWRlcgorCQkJICovCisJCQlsZWFmX2N1dF9mcm9tX2J1ZmZlcihjdXJfYmksIEJfTlJfSVRFTVMoYmgpIC0gMSwKKwkJCQkJICAgICBsZW4gLSBkZWxfYnl0ZXMsIGRlbF9ieXRlcyk7CisJCX0KKwl9Cit9CiAKIC8qIGluc2VydCBpdGVtIGludG8gdGhlIGxlYWYgbm9kZSBpbiBwb3NpdGlvbiBiZWZvcmUgKi8KLXZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgYmVmb3JlLAotCQkJICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydGVkX2l0ZW1faWgsCi0JCQkgICBjb25zdCBjaGFyICogaW5zZXJ0ZWRfaXRlbV9ib2R5LAotCQkJICAgaW50IHplcm9zX251bWJlcikKK3ZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGJlZm9yZSwKKwkJCSAgc3RydWN0IGl0ZW1faGVhZCAqaW5zZXJ0ZWRfaXRlbV9paCwKKwkJCSAgY29uc3QgY2hhciAqaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpbnQgemVyb3NfbnVtYmVyKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBpOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7Ci0gICAgY2hhciAqIHRvOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaS0+YmlfYmg7CisJaW50IG5yLCBmcmVlX3NwYWNlOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCBpOworCWludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7CisJY2hhciAqdG87CiAKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJZnJlZV9zcGFjZSA9IGJsa2hfZnJlZV9zcGFjZShibGtoKTsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKCBibGtoICk7CisJLyogY2hlY2sgZnJlZSBzcGFjZSAqLworCVJGQUxTRShmcmVlX3NwYWNlIDwgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgKyBJSF9TSVpFLAorCSAgICAgICAidnMtMTAxNzA6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBpbiBibG9jayAleiwgbmV3IGl0ZW0gJWgiLAorCSAgICAgICBiaCwgaW5zZXJ0ZWRfaXRlbV9paCk7CisJUkZBTFNFKHplcm9zX251bWJlciA+IGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpLAorCSAgICAgICAidnMtMTAxNzI6IHplcm8gbnVtYmVyID09ICVkLCBpdGVtIGxlbmd0aCA9PSAlZCIsCisJICAgICAgIHplcm9zX251bWJlciwgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkpOwogCi0gICAgLyogY2hlY2sgZnJlZSBzcGFjZSAqLwotICAgIFJGQUxTRSggZnJlZV9zcGFjZSA8IGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpICsgSUhfU0laRSwKLSAgICAgICAgICAgICJ2cy0xMDE3MDogbm90IGVub3VnaCBmcmVlIHNwYWNlIGluIGJsb2NrICV6LCBuZXcgaXRlbSAlaCIsCi0gICAgICAgICAgICBiaCwgaW5zZXJ0ZWRfaXRlbV9paCk7Ci0gICAgUkZBTFNFKCB6ZXJvc19udW1iZXIgPiBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSwKLQkgICAgInZzLTEwMTcyOiB6ZXJvIG51bWJlciA9PSAlZCwgaXRlbSBsZW5ndGggPT0gJWQiLAotICAgICAgICAgICAgemVyb3NfbnVtYmVyLCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSk7CisJLyogZ2V0IGl0ZW0gbmV3IGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBiZWZvcmUgKi8KKwlpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBiZWZvcmUpOwogCisJLyogcHJlcGFyZSBzcGFjZSBmb3IgdGhlIGJvZHkgb2YgbmV3IGl0ZW0gKi8KKwlsYXN0X2xvYyA9IG5yID8gaWhfbG9jYXRpb24oJihpaFtuciAtIGJlZm9yZSAtIDFdKSkgOiBiaC0+Yl9zaXplOworCXVubW92ZWRfbG9jID0gYmVmb3JlID8gaWhfbG9jYXRpb24oaWggLSAxKSA6IGJoLT5iX3NpemU7CiAKLSAgICAvKiBnZXQgaXRlbSBuZXcgaXRlbSBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSAqLwotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCBiZWZvcmUpOworCW1lbW1vdmUoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCksCisJCWJoLT5iX2RhdGEgKyBsYXN0X2xvYywgdW5tb3ZlZF9sb2MgLSBsYXN0X2xvYyk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciB0aGUgYm9keSBvZiBuZXcgaXRlbSAqLwotICAgIGxhc3RfbG9jID0gbnIgPyBpaF9sb2NhdGlvbiggJihpaFtuciAtIGJlZm9yZSAtIDFdKSApIDogYmgtPmJfc2l6ZTsKLSAgICB1bm1vdmVkX2xvYyA9IGJlZm9yZSA/IGloX2xvY2F0aW9uKCBpaC0xICkgOiBiaC0+Yl9zaXplOworCXRvID0gYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCk7CisJbWVtc2V0KHRvLCAwLCB6ZXJvc19udW1iZXIpOworCXRvICs9IHplcm9zX251bWJlcjsKIAorCS8qIGNvcHkgYm9keSB0byBwcmVwYXJlZCBzcGFjZSAqLworCWlmIChpbnNlcnRlZF9pdGVtX2JvZHkpCisJCW1lbW1vdmUodG8sIGluc2VydGVkX2l0ZW1fYm9keSwKKwkJCWloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpIC0gemVyb3NfbnVtYmVyKTsKKwllbHNlCisJCW1lbXNldCh0bywgJ1wwJywgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgLSB6ZXJvc19udW1iZXIpOwogCi0gICAgbWVtbW92ZSAoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCksIAotCSAgICAgYmgtPmJfZGF0YSArIGxhc3RfbG9jLCB1bm1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKKwkvKiBpbnNlcnQgaXRlbSBoZWFkZXIgKi8KKwltZW1tb3ZlKGloICsgMSwgaWgsIElIX1NJWkUgKiAobnIgLSBiZWZvcmUpKTsKKwltZW1tb3ZlKGloLCBpbnNlcnRlZF9pdGVtX2loLCBJSF9TSVpFKTsKIAotICAgIHRvID0gYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCk7Ci0gICAgbWVtc2V0ICh0bywgMCwgemVyb3NfbnVtYmVyKTsKLSAgICB0byArPSB6ZXJvc19udW1iZXI7CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGJlZm9yZTsgaSA8IG5yICsgMTsgaSsrKSB7CisJCXVubW92ZWRfbG9jIC09IGloX2l0ZW1fbGVuKCYoaWhbaSAtIGJlZm9yZV0pKTsKKwkJcHV0X2loX2xvY2F0aW9uKCYoaWhbaSAtIGJlZm9yZV0pLCB1bm1vdmVkX2xvYyk7CisJfQogCi0gICAgLyogY29weSBib2R5IHRvIHByZXBhcmVkIHNwYWNlICovCi0gICAgaWYgKGluc2VydGVkX2l0ZW1fYm9keSkKLQltZW1tb3ZlICh0bywgaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSAtIHplcm9zX251bWJlcik7Ci0gICAgZWxzZQotCW1lbXNldCh0bywgJ1wwJywgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgLSB6ZXJvc19udW1iZXIpOwotICAKLSAgICAvKiBpbnNlcnQgaXRlbSBoZWFkZXIgKi8KLSAgICBtZW1tb3ZlIChpaCArIDEsIGloLCBJSF9TSVpFICogKG5yIC0gYmVmb3JlKSk7Ci0gICAgbWVtbW92ZSAoaWgsIGluc2VydGVkX2l0ZW1faWgsIElIX1NJWkUpOwotICAKLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gYmVmb3JlOyBpIDwgbnIgKyAxOyBpICsrKQotICAgIHsKLSAgICAgICAgdW5tb3ZlZF9sb2MgLT0gaWhfaXRlbV9sZW4oICYoaWhbaS1iZWZvcmVdKSk7Ci0JcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktYmVmb3JlXSksIHVubW92ZWRfbG9jICk7Ci0gICAgfQotICAKLSAgICAvKiBzaXplcywgZnJlZSBzcGFjZSwgaXRlbSBudW1iZXIgKi8KLSAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKLSAgICAgICAgICAgICAgICAgICAgZnJlZV9zcGFjZSAtIChJSF9TSVpFICsgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCApICkgKTsKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMSk7CisJLyogc2l6ZXMsIGZyZWUgc3BhY2UsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxKTsKKwlzZXRfYmxraF9mcmVlX3NwYWNlKGJsa2gsCisJCQkgICAgZnJlZV9zcGFjZSAtIChJSF9TSVpFICsKKwkJCQkJICBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSkpOworCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDEpOwogCi0gICAgaWYgKGJpLT5iaV9wYXJlbnQpIHsgCi0Jc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7Ci0JdF9kYyA9IEJfTl9DSElMRCAoYmktPmJpX3BhcmVudCwgYmktPmJpX3Bvc2l0aW9uKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChJSF9TSVpFICsgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkpKTsKLQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGJpLT50YiwgYmktPmJpX3BhcmVudCwgMCk7Ci0gICAgfQorCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsCisJCQkgICAgZGNfc2l6ZSh0X2RjKSArIChJSF9TSVpFICsKKwkJCQkJICAgICBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSkpOworCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoYmktPnRiLCBiaS0+YmlfcGFyZW50LCAwKTsKKwl9CiB9CiAKLQogLyogcGFzdGUgcGFzdGVfc2l6ZSBieXRlcyB0byBhZmZlY3RlZF9pdGVtX251bS10aCBpdGVtLiAKICAgIFdoZW4gaXRlbSBpcyBhIGRpcmVjdG9yeSwgdGhpcyBvbmx5IHByZXBhcmUgc3BhY2UgZm9yIG5ldyBlbnRyaWVzICovCi12b2lkIGxlYWZfcGFzdGVfaW5fYnVmZmVyIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgaW50IGFmZmVjdGVkX2l0ZW1fbnVtLAotCQkJICAgaW50IHBvc19pbl9pdGVtLCBpbnQgcGFzdGVfc2l6ZSwKLQkJCSAgIGNvbnN0IGNoYXIgKiBib2R5LAotCQkJICAgaW50IHplcm9zX251bWJlcikKK3ZvaWQgbGVhZl9wYXN0ZV9pbl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGFmZmVjdGVkX2l0ZW1fbnVtLAorCQkJICBpbnQgcG9zX2luX2l0ZW0sIGludCBwYXN0ZV9zaXplLAorCQkJICBjb25zdCBjaGFyICpib2R5LCBpbnQgemVyb3NfbnVtYmVyKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBpOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJpLT5iaV9iaDsKKwlpbnQgbnIsIGZyZWVfc3BhY2U7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IGk7CisJaW50IGxhc3RfbG9jLCB1bm1vdmVkX2xvYzsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKGJsa2gpOworCWJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKGJsa2gpOwogCi0KLSAgICAvKiBjaGVjayBmcmVlIHNwYWNlICovCi0gICAgUkZBTFNFKCBmcmVlX3NwYWNlIDwgcGFzdGVfc2l6ZSwKLSAgICAgICAgICAgICJ2cy0xMDE3NTogbm90IGVub3VnaCBmcmVlIHNwYWNlOiBuZWVkZWQgJWQsIGF2YWlsYWJsZSAlZCIsCi0gICAgICAgICAgICBwYXN0ZV9zaXplLCBmcmVlX3NwYWNlKTsKKwkvKiBjaGVjayBmcmVlIHNwYWNlICovCisJUkZBTFNFKGZyZWVfc3BhY2UgPCBwYXN0ZV9zaXplLAorCSAgICAgICAidnMtMTAxNzU6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZTogbmVlZGVkICVkLCBhdmFpbGFibGUgJWQiLAorCSAgICAgICBwYXN0ZV9zaXplLCBmcmVlX3NwYWNlKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGlmICh6ZXJvc19udW1iZXIgPiBwYXN0ZV9zaXplKSB7Ci0JcHJpbnRfY3VyX3RiICgiMTAxNzciKTsKLQlyZWlzZXJmc19wYW5pYyAoIE5VTEwsICJ2cy0xMDE3NzogbGVhZl9wYXN0ZV9pbl9idWZmZXI6IGVybyBudW1iZXIgPT0gJWQsIHBhc3RlX3NpemUgPT0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9zX251bWJlciwgcGFzdGVfc2l6ZSk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLwotCi0KLSAgICAvKiBpdGVtIHRvIGJlIGFwcGVuZGVkICovCi0gICAgaWggPSBCX05fUElURU1fSEVBRChiaCwgYWZmZWN0ZWRfaXRlbV9udW0pOwotCi0gICAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuciAtIGFmZmVjdGVkX2l0ZW1fbnVtIC0gMV0pICk7Ci0gICAgdW5tb3ZlZF9sb2MgPSBhZmZlY3RlZF9pdGVtX251bSA/IGloX2xvY2F0aW9uKCBpaC0xICkgOiBiaC0+Yl9zaXplOwotCi0gICAgLyogcHJlcGFyZSBzcGFjZSAqLwotICAgIG1lbW1vdmUgKGJoLT5iX2RhdGEgKyBsYXN0X2xvYyAtIHBhc3RlX3NpemUsIGJoLT5iX2RhdGEgKyBsYXN0X2xvYywKLQkgICAgIHVubW92ZWRfbG9jIC0gbGFzdF9sb2MpOwotCi0KLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gYWZmZWN0ZWRfaXRlbV9udW07IGkgPCBucjsgaSArKykKLQlwdXRfaWhfbG9jYXRpb24oICYoaWhbaS1hZmZlY3RlZF9pdGVtX251bV0pLAotICAgICAgICAgICAgICAgICAgICBpaF9sb2NhdGlvbiggJihpaFtpLWFmZmVjdGVkX2l0ZW1fbnVtXSkpIC0gcGFzdGVfc2l6ZSApOwotCi0gICAgaWYgKCBib2R5ICkgewotCWlmICghaXNfZGlyZW50cnlfbGVfaWggKGloKSkgewotCSAgICBpZiAoIXBvc19pbl9pdGVtKSB7Ci0JCS8qIHNoaWZ0IGRhdGEgdG8gcmlnaHQgKi8KLQkJbWVtbW92ZSAoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArIHBhc3RlX3NpemUsIAotCQkJIGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCksIGloX2l0ZW1fbGVuKGloKSk7Ci0JCS8qIHBhc3RlIGRhdGEgaW4gdGhlIGhlYWQgb2YgaXRlbSAqLwotCQltZW1zZXQgKGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCksIDAsIHplcm9zX251bWJlcik7Ci0JCW1lbWNweSAoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArIHplcm9zX251bWJlciwgYm9keSwgcGFzdGVfc2l6ZSAtIHplcm9zX251bWJlcik7Ci0JICAgIH0gZWxzZSB7Ci0JCW1lbXNldCAoYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gcGFzdGVfc2l6ZSwgMCwgemVyb3NfbnVtYmVyKTsKLQkJbWVtY3B5IChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplICsgemVyb3NfbnVtYmVyLCBib2R5LCBwYXN0ZV9zaXplIC0gemVyb3NfbnVtYmVyKTsKLQkgICAgfQorCWlmICh6ZXJvc19udW1iZXIgPiBwYXN0ZV9zaXplKSB7CisJCXByaW50X2N1cl90YigiMTAxNzciKTsKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtMTAxNzc6IGxlYWZfcGFzdGVfaW5fYnVmZmVyOiBlcm8gbnVtYmVyID09ICVkLCBwYXN0ZV9zaXplID09ICVkIiwKKwkJCSAgICAgICB6ZXJvc19udW1iZXIsIHBhc3RlX3NpemUpOwogCX0KLSAgICB9Ci0gICAgZWxzZQotCW1lbXNldChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplLCAnXDAnLCBwYXN0ZV9zaXplKTsKKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAotICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIGloX2l0ZW1fbGVuKGloKSArIHBhc3RlX3NpemUgKTsKKwkvKiBpdGVtIHRvIGJlIGFwcGVuZGVkICovCisJaWggPSBCX05fUElURU1fSEVBRChiaCwgYWZmZWN0ZWRfaXRlbV9udW0pOwogCi0gICAgLyogY2hhbmdlIGZyZWUgc3BhY2UgKi8KLSAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBmcmVlX3NwYWNlIC0gcGFzdGVfc2l6ZSApOworCWxhc3RfbG9jID0gaWhfbG9jYXRpb24oJihpaFtuciAtIGFmZmVjdGVkX2l0ZW1fbnVtIC0gMV0pKTsKKwl1bm1vdmVkX2xvYyA9IGFmZmVjdGVkX2l0ZW1fbnVtID8gaWhfbG9jYXRpb24oaWggLSAxKSA6IGJoLT5iX3NpemU7CiAKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7CisJLyogcHJlcGFyZSBzcGFjZSAqLworCW1lbW1vdmUoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gcGFzdGVfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAorCQl1bm1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKIAotICAgIGlmIChiaS0+YmlfcGFyZW50KSB7IAotCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOwotCXB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpICsgcGFzdGVfc2l6ZSApOwotCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoYmktPnRiLCBiaS0+YmlfcGFyZW50LCAwKTsKLSAgICB9CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGFmZmVjdGVkX2l0ZW1fbnVtOyBpIDwgbnI7IGkrKykKKwkJcHV0X2loX2xvY2F0aW9uKCYoaWhbaSAtIGFmZmVjdGVkX2l0ZW1fbnVtXSksCisJCQkJaWhfbG9jYXRpb24oJihpaFtpIC0gYWZmZWN0ZWRfaXRlbV9udW1dKSkgLQorCQkJCXBhc3RlX3NpemUpOworCisJaWYgKGJvZHkpIHsKKwkJaWYgKCFpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJCWlmICghcG9zX2luX2l0ZW0pIHsKKwkJCQkvKiBzaGlmdCBkYXRhIHRvIHJpZ2h0ICovCisJCQkJbWVtbW92ZShiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsKKwkJCQkJcGFzdGVfc2l6ZSwKKwkJCQkJYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwKKwkJCQkJaWhfaXRlbV9sZW4oaWgpKTsKKwkJCQkvKiBwYXN0ZSBkYXRhIGluIHRoZSBoZWFkIG9mIGl0ZW0gKi8KKwkJCQltZW1zZXQoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwgMCwKKwkJCQkgICAgICAgemVyb3NfbnVtYmVyKTsKKwkJCQltZW1jcHkoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArCisJCQkJICAgICAgIHplcm9zX251bWJlciwgYm9keSwKKwkJCQkgICAgICAgcGFzdGVfc2l6ZSAtIHplcm9zX251bWJlcik7CisJCQl9IGVsc2UgeworCQkJCW1lbXNldChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplLCAwLAorCQkJCSAgICAgICB6ZXJvc19udW1iZXIpOworCQkJCW1lbWNweShiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplICsKKwkJCQkgICAgICAgemVyb3NfbnVtYmVyLCBib2R5LAorCQkJCSAgICAgICBwYXN0ZV9zaXplIC0gemVyb3NfbnVtYmVyKTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQltZW1zZXQoYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gcGFzdGVfc2l6ZSwgJ1wwJywgcGFzdGVfc2l6ZSk7CisKKwlwdXRfaWhfaXRlbV9sZW4oaWgsIGloX2l0ZW1fbGVuKGloKSArIHBhc3RlX3NpemUpOworCisJLyogY2hhbmdlIGZyZWUgc3BhY2UgKi8KKwlzZXRfYmxraF9mcmVlX3NwYWNlKGJsa2gsIGZyZWVfc3BhY2UgLSBwYXN0ZV9zaXplKTsKKworCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDApOworCisJaWYgKGJpLT5iaV9wYXJlbnQpIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPQorCQkgICAgQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsIGRjX3NpemUodF9kYykgKyBwYXN0ZV9zaXplKTsKKwkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGJpLT50YiwgYmktPmJpX3BhcmVudCwgMCk7CisJfQogfQogCi0KIC8qIGN1dHMgREVMX0NPVU5UIGVudHJpZXMgYmVnaW5uaW5nIGZyb20gRlJPTS10aCBlbnRyeS4gRGlyZWN0b3J5IGl0ZW0KICAgIGRvZXMgbm90IGhhdmUgZnJlZSBzcGFjZSwgc28gaXQgbW92ZXMgREVIcyBhbmQgcmVtYWluaW5nIHJlY29yZHMgYXMKICAgIG5lY2Vzc2FyeS4gUmV0dXJuIHZhbHVlIGlzIHNpemUgb2YgcmVtb3ZlZCBwYXJ0IG9mIGRpcmVjdG9yeSBpdGVtCiAgICBpbiBieXRlcy4gKi8KLXN0YXRpYyBpbnQJbGVhZl9jdXRfZW50cmllcyAoCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCi0JCQkJc3RydWN0IGl0ZW1faGVhZCAqIGloLCAKLQkJCQlpbnQgZnJvbSwgCi0JCQkJaW50IGRlbF9jb3VudAotCQkJKQorc3RhdGljIGludCBsZWFmX2N1dF9lbnRyaWVzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBmcm9tLCBpbnQgZGVsX2NvdW50KQogewotICBjaGFyICogaXRlbTsKLSAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7Ci0gIGludCBwcmV2X3JlY29yZF9vZmZzZXQ7CS8qIG9mZnNldCBvZiByZWNvcmQsIHRoYXQgaXMgKGZyb20tMSl0aCAqLwotICBjaGFyICogcHJldl9yZWNvcmQ7CQkvKiAqLwotICBpbnQgY3V0X3JlY29yZHNfbGVuOwkJLyogbGVuZ3RoIG9mIGFsbCByZW1vdmVkIHJlY29yZHMgKi8KLSAgaW50IGk7CisJY2hhciAqaXRlbTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOworCWludCBwcmV2X3JlY29yZF9vZmZzZXQ7CS8qIG9mZnNldCBvZiByZWNvcmQsIHRoYXQgaXMgKGZyb20tMSl0aCAqLworCWNoYXIgKnByZXZfcmVjb3JkOwkvKiAqLworCWludCBjdXRfcmVjb3Jkc19sZW47CS8qIGxlbmd0aCBvZiBhbGwgcmVtb3ZlZCByZWNvcmRzICovCisJaW50IGk7CiAKKwkvKiBtYWtlIHN1cmUsIHRoYXQgaXRlbSBpcyBkaXJlY3RvcnkgYW5kIHRoZXJlIGFyZSBlbm91Z2ggZW50cmllcyB0bworCSAgIHJlbW92ZSAqLworCVJGQUxTRSghaXNfZGlyZW50cnlfbGVfaWgoaWgpLCAiMTAxODA6IGl0ZW0gaXMgbm90IGRpcmVjdG9yeSBpdGVtIik7CisJUkZBTFNFKElfRU5UUllfQ09VTlQoaWgpIDwgZnJvbSArIGRlbF9jb3VudCwKKwkgICAgICAgIjEwMTg1OiBpdGVtIGNvbnRhaW5zIG5vdCBlbm91Z2ggZW50cmllczogZW50cnlfY291dCA9ICVkLCBmcm9tID0gJWQsIHRvIGRlbGV0ZSA9ICVkIiwKKwkgICAgICAgSV9FTlRSWV9DT1VOVChpaCksIGZyb20sIGRlbF9jb3VudCk7CiAKLSAgLyogbWFrZSBzdXJlLCB0aGF0IGl0ZW0gaXMgZGlyZWN0b3J5IGFuZCB0aGVyZSBhcmUgZW5vdWdoIGVudHJpZXMgdG8KLSAgICAgcmVtb3ZlICovCi0gIFJGQUxTRSggIWlzX2RpcmVudHJ5X2xlX2loIChpaCksICIxMDE4MDogaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0iKTsKLSAgUkZBTFNFKCBJX0VOVFJZX0NPVU5UKGloKSA8IGZyb20gKyBkZWxfY291bnQsCi0JICAiMTAxODU6IGl0ZW0gY29udGFpbnMgbm90IGVub3VnaCBlbnRyaWVzOiBlbnRyeV9jb3V0ID0gJWQsIGZyb20gPSAlZCwgdG8gZGVsZXRlID0gJWQiLAotCSAgSV9FTlRSWV9DT1VOVChpaCksIGZyb20sIGRlbF9jb3VudCk7CisJaWYgKGRlbF9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKIAotICBpZiAoZGVsX2NvdW50ID09IDApCi0gICAgcmV0dXJuIDA7CisJLyogZmlyc3QgYnl0ZSBvZiBpdGVtICovCisJaXRlbSA9IGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCk7CiAKLSAgLyogZmlyc3QgYnl0ZSBvZiBpdGVtICovCi0gIGl0ZW0gPSBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpOworCS8qIGVudHJ5IGhlYWQgYXJyYXkgKi8KKwlkZWggPSBCX0lfREVIKGJoLCBpaCk7CiAKLSAgLyogZW50cnkgaGVhZCBhcnJheSAqLwotICBkZWggPSBCX0lfREVIIChiaCwgaWgpOworCS8qIGZpcnN0IGJ5dGUgb2YgcmVtYWluaW5nIGVudHJpZXMsIHRob3NlIGFyZSBCRUZPUkUgY3V0IGVudHJpZXMKKwkgICAocHJldl9yZWNvcmQpIGFuZCBsZW5ndGggb2YgYWxsIHJlbW92ZWQgcmVjb3JkcyAoY3V0X3JlY29yZHNfbGVuKSAqLworCXByZXZfcmVjb3JkX29mZnNldCA9CisJICAgIChmcm9tID8gZGVoX2xvY2F0aW9uKCYoZGVoW2Zyb20gLSAxXSkpIDogaWhfaXRlbV9sZW4oaWgpKTsKKwljdXRfcmVjb3Jkc19sZW4gPSBwcmV2X3JlY29yZF9vZmZzZXQgLypmcm9tX3JlY29yZCAqLyAgLQorCSAgICBkZWhfbG9jYXRpb24oJihkZWhbZnJvbSArIGRlbF9jb3VudCAtIDFdKSk7CisJcHJldl9yZWNvcmQgPSBpdGVtICsgcHJldl9yZWNvcmRfb2Zmc2V0OwogCi0gIC8qIGZpcnN0IGJ5dGUgb2YgcmVtYWluaW5nIGVudHJpZXMsIHRob3NlIGFyZSBCRUZPUkUgY3V0IGVudHJpZXMKLSAgICAgKHByZXZfcmVjb3JkKSBhbmQgbGVuZ3RoIG9mIGFsbCByZW1vdmVkIHJlY29yZHMgKGN1dF9yZWNvcmRzX2xlbikgKi8KLSAgcHJldl9yZWNvcmRfb2Zmc2V0ID0gKGZyb20gPyBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gLSAxXSkpIDogaWhfaXRlbV9sZW4oaWgpKTsKLSAgY3V0X3JlY29yZHNfbGVuID0gcHJldl9yZWNvcmRfb2Zmc2V0Lypmcm9tX3JlY29yZCovIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtmcm9tICsgZGVsX2NvdW50IC0gMV0pKTsKLSAgcHJldl9yZWNvcmQgPSBpdGVtICsgcHJldl9yZWNvcmRfb2Zmc2V0OworCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVtYWluaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSBJX0VOVFJZX0NPVU5UKGloKSAtIDE7IGkgPiBmcm9tICsgZGVsX2NvdW50IC0gMTsgaS0tKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCZkZWhbaV0pIC0KKwkJCQkgKERFSF9TSVpFICogZGVsX2NvdW50KSk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgZnJvbTsgaSsrKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCZkZWhbaV0pIC0gKERFSF9TSVpFICogZGVsX2NvdW50ICsKKwkJCQkJCQkgIGN1dF9yZWNvcmRzX2xlbikpOwogCi0gIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVtYWluaW5nIGVudHJpZXMgKi8KLSAgZm9yIChpID0gSV9FTlRSWV9DT1VOVChpaCkgLSAxOyBpID4gZnJvbSArIGRlbF9jb3VudCAtIDE7IGkgLS0pCi0gICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmZGVoW2ldICkgLSAoREVIX1NJWkUgKiBkZWxfY291bnQgKSApOworCXB1dF9paF9lbnRyeV9jb3VudChpaCwgaWhfZW50cnlfY291bnQoaWgpIC0gZGVsX2NvdW50KTsKIAotICBmb3IgKGkgPSAwOyBpIDwgZnJvbTsgaSArKykKLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCi0gICAgICAgIGRlaF9sb2NhdGlvbiggJmRlaFtpXSApIC0gKERFSF9TSVpFICogZGVsX2NvdW50ICsgY3V0X3JlY29yZHNfbGVuKSApOworCS8qIHNoaWZ0IGVudHJ5IGhlYWQgYXJyYXkgYW5kIGVudHJpZXMgdGhvc2UgYXJlIEFGVEVSIHJlbW92ZWQgZW50cmllcyAqLworCW1lbW1vdmUoKGNoYXIgKikoZGVoICsgZnJvbSksCisJCWRlaCArIGZyb20gKyBkZWxfY291bnQsCisJCXByZXZfcmVjb3JkIC0gY3V0X3JlY29yZHNfbGVuIC0gKGNoYXIgKikoZGVoICsgZnJvbSArCisJCQkJCQkJIGRlbF9jb3VudCkpOwogCi0gIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGloX2VudHJ5X2NvdW50KGloKSAtIGRlbF9jb3VudCApOworCS8qIHNoaWZ0IHJlY29yZHMsIHRob3NlIGFyZSBCRUZPUkUgcmVtb3ZlZCBlbnRyaWVzICovCisJbWVtbW92ZShwcmV2X3JlY29yZCAtIGN1dF9yZWNvcmRzX2xlbiAtIERFSF9TSVpFICogZGVsX2NvdW50LAorCQlwcmV2X3JlY29yZCwgaXRlbSArIGloX2l0ZW1fbGVuKGloKSAtIHByZXZfcmVjb3JkKTsKIAotICAvKiBzaGlmdCBlbnRyeSBoZWFkIGFycmF5IGFuZCBlbnRyaWVzIHRob3NlIGFyZSBBRlRFUiByZW1vdmVkIGVudHJpZXMgKi8KLSAgbWVtbW92ZSAoKGNoYXIgKikoZGVoICsgZnJvbSksCi0JICAgZGVoICsgZnJvbSArIGRlbF9jb3VudCwgCi0JICAgcHJldl9yZWNvcmQgLSBjdXRfcmVjb3Jkc19sZW4gLSAoY2hhciAqKShkZWggKyBmcm9tICsgZGVsX2NvdW50KSk7Ci0gIAotICAvKiBzaGlmdCByZWNvcmRzLCB0aG9zZSBhcmUgQkVGT1JFIHJlbW92ZWQgZW50cmllcyAqLwotICBtZW1tb3ZlIChwcmV2X3JlY29yZCAtIGN1dF9yZWNvcmRzX2xlbiAtIERFSF9TSVpFICogZGVsX2NvdW50LAotCSAgIHByZXZfcmVjb3JkLCBpdGVtICsgaWhfaXRlbV9sZW4oaWgpIC0gcHJldl9yZWNvcmQpOwotCi0gIHJldHVybiBERUhfU0laRSAqIGRlbF9jb3VudCArIGN1dF9yZWNvcmRzX2xlbjsKKwlyZXR1cm4gREVIX1NJWkUgKiBkZWxfY291bnQgKyBjdXRfcmVjb3Jkc19sZW47CiB9CiAKLQogLyogIHdoZW4gY3V0IGl0ZW0gaXMgcGFydCBvZiByZWd1bGFyIGZpbGUKICAgICAgICAgcG9zX2luX2l0ZW0gLSBmaXJzdCBieXRlIHRoYXQgbXVzdCBiZSBjdXQKICAgICAgICAgY3V0X3NpemUgLSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY3V0IGJlZ2lubmluZyBmcm9tIHBvc19pbl9pdGVtCkBAIC05NTksMjY0ICsxMDI1LDI3OCBAQAogICAgICAgICBwb3NfaW5faXRlbSAtIG51bWJlciBvZiBmaXJzdCBkZWxldGVkIGVudHJ5CiAgICAgICAgIGN1dF9zaXplIC0gY291bnQgb2YgZGVsZXRlZCBlbnRyaWVzCiAgICAgKi8KLXZvaWQgbGVhZl9jdXRfZnJvbV9idWZmZXIgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgY3V0X2l0ZW1fbnVtLAotCQkJICAgaW50IHBvc19pbl9pdGVtLCBpbnQgY3V0X3NpemUpCit2b2lkIGxlYWZfY3V0X2Zyb21fYnVmZmVyKHN0cnVjdCBidWZmZXJfaW5mbyAqYmksIGludCBjdXRfaXRlbV9udW0sCisJCQkgIGludCBwb3NfaW5faXRlbSwgaW50IGN1dF9zaXplKQogewotICAgIGludCBucjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IGJpLT5iaV9iaDsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7Ci0gICAgaW50IGk7CisJaW50IG5yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaS0+YmlfYmg7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IGxhc3RfbG9jLCB1bm1vdmVkX2xvYzsKKwlpbnQgaTsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CiAKLSAgICAvKiBpdGVtIGhlYWQgb2YgdHJ1bmNhdGVkIGl0ZW0gKi8KLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgY3V0X2l0ZW1fbnVtKTsKKwkvKiBpdGVtIGhlYWQgb2YgdHJ1bmNhdGVkIGl0ZW0gKi8KKwlpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBjdXRfaXRlbV9udW0pOwogCi0gICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChpaCkpIHsKLSAgICAgICAgLyogZmlyc3QgY3V0IGVudHJ5ICgpKi8KLSAgICAgICAgY3V0X3NpemUgPSBsZWFmX2N1dF9lbnRyaWVzIChiaCwgaWgsIHBvc19pbl9pdGVtLCBjdXRfc2l6ZSk7Ci0gICAgICAgIGlmIChwb3NfaW5faXRlbSA9PSAwKSB7Ci0JICAgICAgICAvKiBjaGFuZ2Uga2V5ICovCi0gICAgICAgICAgICBSRkFMU0UoIGN1dF9pdGVtX251bSwKLSAgICAgICAgICAgICAgICAgICAgIndoZW4gMC10aCBlbnJ0eSBvZiBpdGVtIGlzIGN1dCwgdGhhdCBpdGVtIG11c3QgYmUgZmlyc3QgaW4gdGhlIG5vZGUsIG5vdCAlZC10aCIsIGN1dF9pdGVtX251bSk7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgaXRlbSBrZXkgYnkga2V5IG9mIGZpcnN0IGVudHJ5IGluIHRoZSBpdGVtICovCi0JICAgIHNldF9sZV9paF9rX29mZnNldCAoaWgsIGRlaF9vZmZzZXQoQl9JX0RFSCAoYmgsIGloKSkpOwotICAgICAgICAgICAgLyptZW1jcHkgKCZpaC0+aWhfa2V5Lmtfb2Zmc2V0LCAmKEJfSV9ERUggKGJoLCBpaCktPmRlaF9vZmZzZXQpLCBTSE9SVF9LRVlfU0laRSk7Ki8KLQkgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGl0ZW0gaXMgZGlyZWN0IG9yIGluZGlyZWN0ICovCi0gICAgICAgIFJGQUxTRSggaXNfc3RhdGRhdGFfbGVfaWggKGloKSwgIjEwMTk1OiBpdGVtIGlzIHN0YXQgZGF0YSIpOwotICAgICAgICBSRkFMU0UoIHBvc19pbl9pdGVtICYmIHBvc19pbl9pdGVtICsgY3V0X3NpemUgIT0gaWhfaXRlbV9sZW4oaWgpLAotICAgICAgICAgICAgICAgICIxMDIwMDogaW52YWxpZCBvZmZzZXQgKCVsdSkgb3IgdHJ1bmNfc2l6ZSAoJWx1KSBvciBpaF9pdGVtX2xlbiAoJWx1KSIsCi0gICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgcG9zX2luX2l0ZW0sICggbG9uZyB1bnNpZ25lZCApIGN1dF9zaXplLCAKLQkJKCBsb25nIHVuc2lnbmVkICkgaWhfaXRlbV9sZW4gKGloKSk7CisJaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkgeworCQkvKiBmaXJzdCBjdXQgZW50cnkgKCkgKi8KKwkJY3V0X3NpemUgPSBsZWFmX2N1dF9lbnRyaWVzKGJoLCBpaCwgcG9zX2luX2l0ZW0sIGN1dF9zaXplKTsKKwkJaWYgKHBvc19pbl9pdGVtID09IDApIHsKKwkJCS8qIGNoYW5nZSBrZXkgKi8KKwkJCVJGQUxTRShjdXRfaXRlbV9udW0sCisJCQkgICAgICAgIndoZW4gMC10aCBlbnJ0eSBvZiBpdGVtIGlzIGN1dCwgdGhhdCBpdGVtIG11c3QgYmUgZmlyc3QgaW4gdGhlIG5vZGUsIG5vdCAlZC10aCIsCisJCQkgICAgICAgY3V0X2l0ZW1fbnVtKTsKKwkJCS8qIGNoYW5nZSBpdGVtIGtleSBieSBrZXkgb2YgZmlyc3QgZW50cnkgaW4gdGhlIGl0ZW0gKi8KKwkJCXNldF9sZV9paF9rX29mZnNldChpaCwgZGVoX29mZnNldChCX0lfREVIKGJoLCBpaCkpKTsKKwkJCS8qbWVtY3B5ICgmaWgtPmloX2tleS5rX29mZnNldCwgJihCX0lfREVIIChiaCwgaWgpLT5kZWhfb2Zmc2V0KSwgU0hPUlRfS0VZX1NJWkUpOyAqLworCQl9CisJfSBlbHNlIHsKKwkJLyogaXRlbSBpcyBkaXJlY3Qgb3IgaW5kaXJlY3QgKi8KKwkJUkZBTFNFKGlzX3N0YXRkYXRhX2xlX2loKGloKSwgIjEwMTk1OiBpdGVtIGlzIHN0YXQgZGF0YSIpOworCQlSRkFMU0UocG9zX2luX2l0ZW0gJiYgcG9zX2luX2l0ZW0gKyBjdXRfc2l6ZSAhPSBpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAiMTAyMDA6IGludmFsaWQgb2Zmc2V0ICglbHUpIG9yIHRydW5jX3NpemUgKCVsdSkgb3IgaWhfaXRlbV9sZW4gKCVsdSkiLAorCQkgICAgICAgKGxvbmcgdW5zaWduZWQpcG9zX2luX2l0ZW0sIChsb25nIHVuc2lnbmVkKWN1dF9zaXplLAorCQkgICAgICAgKGxvbmcgdW5zaWduZWQpaWhfaXRlbV9sZW4oaWgpKTsKIAotICAgICAgICAvKiBzaGlmdCBpdGVtIGJvZHkgdG8gbGVmdCBpZiBjdXQgaXMgZnJvbSB0aGUgaGVhZCBvZiBpdGVtICovCi0gICAgICAgIGlmIChwb3NfaW5faXRlbSA9PSAwKSB7Ci0gICAgICAgICAgICBtZW1tb3ZlKCBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLAotCQkgICAgIGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBjdXRfc2l6ZSwKLQkJICAgICBpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7Ci0JICAgIAotICAgICAgICAgICAgLyogY2hhbmdlIGtleSBvZiBpdGVtICovCi0gICAgICAgICAgICBpZiAoaXNfZGlyZWN0X2xlX2loIChpaCkpCi0JCXNldF9sZV9paF9rX29mZnNldCAoaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkgKyBjdXRfc2l6ZSk7Ci0gICAgICAgICAgICBlbHNlIHsKLQkJc2V0X2xlX2loX2tfb2Zmc2V0IChpaCwgbGVfaWhfa19vZmZzZXQgKGloKSArIChjdXRfc2l6ZSAvIFVORk1fUF9TSVpFKSAqIGJoLT5iX3NpemUpOwotICAgICAgICAgICAgICAgIFJGQUxTRSggaWhfaXRlbV9sZW4oaWgpID09IGN1dF9zaXplICYmIGdldF9paF9mcmVlX3NwYWNlIChpaCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAyMDU6IGludmFsaWQgaWhfZnJlZV9zcGFjZSAoJWgpIiwgaWgpOwotCSAgICAgICAgfQotCSAgICB9Ci0gICAgfQotICAKKwkJLyogc2hpZnQgaXRlbSBib2R5IHRvIGxlZnQgaWYgY3V0IGlzIGZyb20gdGhlIGhlYWQgb2YgaXRlbSAqLworCQlpZiAocG9zX2luX2l0ZW0gPT0gMCkgeworCQkJbWVtbW92ZShiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLAorCQkJCWJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBjdXRfc2l6ZSwKKwkJCQlpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7CiAKLSAgICAvKiBsb2NhdGlvbiBvZiB0aGUgbGFzdCBpdGVtICovCi0gICAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuciAtIGN1dF9pdGVtX251bSAtIDFdKSApOworCQkJLyogY2hhbmdlIGtleSBvZiBpdGVtICovCisJCQlpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkKKwkJCQlzZXRfbGVfaWhfa19vZmZzZXQoaWgsCisJCQkJCQkgICBsZV9paF9rX29mZnNldChpaCkgKworCQkJCQkJICAgY3V0X3NpemUpOworCQkJZWxzZSB7CisJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGloLAorCQkJCQkJICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJCSAgIChjdXRfc2l6ZSAvIFVORk1fUF9TSVpFKSAqCisJCQkJCQkgICBiaC0+Yl9zaXplKTsKKwkJCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpID09IGN1dF9zaXplCisJCQkJICAgICAgICYmIGdldF9paF9mcmVlX3NwYWNlKGloKSwKKwkJCQkgICAgICAgIjEwMjA1OiBpbnZhbGlkIGloX2ZyZWVfc3BhY2UgKCVoKSIsIGloKTsKKwkJCX0KKwkJfQorCX0KIAotICAgIC8qIGxvY2F0aW9uIG9mIHRoZSBpdGVtLCB3aGljaCBpcyByZW1haW5pbmcgYXQgdGhlIHNhbWUgcGxhY2UgKi8KLSAgICB1bm1vdmVkX2xvYyA9IGN1dF9pdGVtX251bSA/IGloX2xvY2F0aW9uKGloLTEpIDogYmgtPmJfc2l6ZTsKKwkvKiBsb2NhdGlvbiBvZiB0aGUgbGFzdCBpdGVtICovCisJbGFzdF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW25yIC0gY3V0X2l0ZW1fbnVtIC0gMV0pKTsKIAorCS8qIGxvY2F0aW9uIG9mIHRoZSBpdGVtLCB3aGljaCBpcyByZW1haW5pbmcgYXQgdGhlIHNhbWUgcGxhY2UgKi8KKwl1bm1vdmVkX2xvYyA9IGN1dF9pdGVtX251bSA/IGloX2xvY2F0aW9uKGloIC0gMSkgOiBiaC0+Yl9zaXplOwogCi0gICAgLyogc2hpZnQgKi8KLSAgICBtZW1tb3ZlIChiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBjdXRfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAotCSAgICAgICB1bm1vdmVkX2xvYyAtIGxhc3RfbG9jIC0gY3V0X3NpemUpOworCS8qIHNoaWZ0ICovCisJbWVtbW92ZShiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBjdXRfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAorCQl1bm1vdmVkX2xvYyAtIGxhc3RfbG9jIC0gY3V0X3NpemUpOwogCi0gICAgLyogY2hhbmdlIGl0ZW0gbGVuZ3RoICovCi0gICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgaWhfaXRlbV9sZW4oaWgpIC0gY3V0X3NpemUgKTsKLSAgCi0gICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChpaCkpIHsKLSAgICAgICAgaWYgKHBvc19pbl9pdGVtKQotICAgICAgICAgICAgc2V0X2loX2ZyZWVfc3BhY2UgKGloLCAwKTsKLSAgICB9CisJLyogY2hhbmdlIGl0ZW0gbGVuZ3RoICovCisJcHV0X2loX2l0ZW1fbGVuKGloLCBpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7CiAKLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gY3V0X2l0ZW1fbnVtOyBpIDwgbnI7IGkgKyspCi0gICAgcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktY3V0X2l0ZW1fbnVtXSksIGloX2xvY2F0aW9uKCAmaWhbaS1jdXRfaXRlbV9udW1dKSArIGN1dF9zaXplICk7CisJaWYgKGlzX2luZGlyZWN0X2xlX2loKGloKSkgeworCQlpZiAocG9zX2luX2l0ZW0pCisJCQlzZXRfaWhfZnJlZV9zcGFjZShpaCwgMCk7CisJfQogCi0gICAgLyogc2l6ZSwgZnJlZSBzcGFjZSAqLwotICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIGN1dF9zaXplICk7CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGN1dF9pdGVtX251bTsgaSA8IG5yOyBpKyspCisJCXB1dF9paF9sb2NhdGlvbigmKGloW2kgLSBjdXRfaXRlbV9udW1dKSwKKwkJCQlpaF9sb2NhdGlvbigmaWhbaSAtIGN1dF9pdGVtX251bV0pICsgY3V0X3NpemUpOwogCi0gICAgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKGJpLT50YiwgYmgsIDApOwotICAgIAotICAgIGlmIChiaS0+YmlfcGFyZW50KSB7IAotICAgICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7Ci0gICAgICB0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOwotICAgICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLSBjdXRfc2l6ZSApOwotICAgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOwotICAgIH0KKwkvKiBzaXplLCBmcmVlIHNwYWNlICovCisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKyBjdXRfc2l6ZSk7CisKKwlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eShiaS0+dGIsIGJoLCAwKTsKKworCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsIGRjX3NpemUodF9kYykgLSBjdXRfc2l6ZSk7CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworCX0KIH0KIAotCiAvKiBkZWxldGUgZGVsX251bSBpdGVtcyBmcm9tIGJ1ZmZlciBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCd0aCBpdGVtICovCi1zdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksCi0JCQkJCWludCBmaXJzdCwgaW50IGRlbF9udW0pCitzdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLAorCQkJCSAgICAgICBpbnQgZmlyc3QsIGludCBkZWxfbnVtKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBucjsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgbGFzdF9sb2MsIGxhc3RfcmVtb3ZlZF9sb2M7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gYmktPmJpX2JoOworCWludCBucjsKKwlpbnQgaSwgajsKKwlpbnQgbGFzdF9sb2MsIGxhc3RfcmVtb3ZlZF9sb2M7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgUkZBTFNFKCBiaCA9PSBOVUxMLCAiMTAyMTA6IGJ1ZmZlciBpcyAwIik7Ci0gIFJGQUxTRSggZGVsX251bSA8IDAsICIxMDIxNTogZGVsX251bSBsZXNzIHRoYW4gMCAoJWQpIiwgZGVsX251bSk7CisJUkZBTFNFKGJoID09IE5VTEwsICIxMDIxMDogYnVmZmVyIGlzIDAiKTsKKwlSRkFMU0UoZGVsX251bSA8IDAsICIxMDIxNTogZGVsX251bSBsZXNzIHRoYW4gMCAoJWQpIiwgZGVsX251bSk7CiAKLSAgaWYgKGRlbF9udW0gPT0gMCkKLSAgICByZXR1cm47CisJaWYgKGRlbF9udW0gPT0gMCkKKwkJcmV0dXJuOwogCi0gIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJYmxraCA9IEJfQkxLX0hFQUQoYmgpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOwogCi0gIFJGQUxTRSggZmlyc3QgPCAwIHx8IGZpcnN0ICsgZGVsX251bSA+IG5yLAotICAgICAgICAgICIxMDIyMDogZmlyc3Q9JWQsIG51bWJlcj0lZCwgdGhlcmUgaXMgJWQgaXRlbXMiLCBmaXJzdCwgZGVsX251bSwgbnIpOworCVJGQUxTRShmaXJzdCA8IDAgfHwgZmlyc3QgKyBkZWxfbnVtID4gbnIsCisJICAgICAgICIxMDIyMDogZmlyc3Q9JWQsIG51bWJlcj0lZCwgdGhlcmUgaXMgJWQgaXRlbXMiLCBmaXJzdCwgZGVsX251bSwKKwkgICAgICAgbnIpOwogCi0gIGlmIChmaXJzdCA9PSAwICYmIGRlbF9udW0gPT0gbnIpIHsKLSAgICAvKiB0aGlzIGRvZXMgbm90IHdvcmsgKi8KLSAgICBtYWtlX2VtcHR5X25vZGUgKGJpKTsKLSAgICAKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7Ci0gICAgcmV0dXJuOwotICB9CisJaWYgKGZpcnN0ID09IDAgJiYgZGVsX251bSA9PSBucikgeworCQkvKiB0aGlzIGRvZXMgbm90IHdvcmsgKi8KKwkJbWFrZV9lbXB0eV9ub2RlKGJpKTsKIAotICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgZmlyc3QpOwotICAKLSAgLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KLSAgaiA9IChmaXJzdCA9PSAwKSA/IGJoLT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaC0xKTsKLSAgICAgIAotICAvKiBkZWxldGUgaXRlbXMgKi8KLSAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuci0xLWZpcnN0XSkgKTsKLSAgbGFzdF9yZW1vdmVkX2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW2RlbF9udW0tMV0pICk7CisJCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDApOworCQlyZXR1cm47CisJfQogCi0gIG1lbW1vdmUgKGJoLT5iX2RhdGEgKyBsYXN0X2xvYyArIGogLSBsYXN0X3JlbW92ZWRfbG9jLAotCSAgIGJoLT5iX2RhdGEgKyBsYXN0X2xvYywgbGFzdF9yZW1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKLSAgCi0gIC8qIGRlbGV0ZSBpdGVtIGhlYWRlcnMgKi8KLSAgbWVtbW92ZSAoaWgsIGloICsgZGVsX251bSwgKG5yIC0gZmlyc3QgLSBkZWxfbnVtKSAqIElIX1NJWkUpOwotICAKLSAgLyogY2hhbmdlIGl0ZW0gbG9jYXRpb24gKi8KLSAgZm9yIChpID0gZmlyc3Q7IGkgPCBuciAtIGRlbF9udW07IGkgKyspCi0gICAgcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktZmlyc3RdKSwgaWhfbG9jYXRpb24oICYoaWhbaS1maXJzdF0pICkgKyAoaiAtIGxhc3RfcmVtb3ZlZF9sb2MpICk7CisJaWggPSBCX05fUElURU1fSEVBRChiaCwgZmlyc3QpOwogCi0gIC8qIHNpemVzLCBpdGVtIG51bWJlciAqLwotICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgLSBkZWxfbnVtICk7Ci0gIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIChqIC0gbGFzdF9yZW1vdmVkX2xvYyArIElIX1NJWkUgKiBkZWxfbnVtKSApOworCS8qIGxvY2F0aW9uIG9mIHVubW92YWJsZSBpdGVtICovCisJaiA9IChmaXJzdCA9PSAwKSA/IGJoLT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaCAtIDEpOwogCi0gIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChiaS0+dGIsIGJoLCAwKTsKLSAgCi0gIGlmIChiaS0+YmlfcGFyZW50KSB7Ci0gICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPSBCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7Ci0gICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLQotCQkJCShqIC0gbGFzdF9yZW1vdmVkX2xvYyArIElIX1NJWkUgKiBkZWxfbnVtKSk7Ci0gICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOwotICB9CisJLyogZGVsZXRlIGl0ZW1zICovCisJbGFzdF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW25yIC0gMSAtIGZpcnN0XSkpOworCWxhc3RfcmVtb3ZlZF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW2RlbF9udW0gLSAxXSkpOworCisJbWVtbW92ZShiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBqIC0gbGFzdF9yZW1vdmVkX2xvYywKKwkJYmgtPmJfZGF0YSArIGxhc3RfbG9jLCBsYXN0X3JlbW92ZWRfbG9jIC0gbGFzdF9sb2MpOworCisJLyogZGVsZXRlIGl0ZW0gaGVhZGVycyAqLworCW1lbW1vdmUoaWgsIGloICsgZGVsX251bSwgKG5yIC0gZmlyc3QgLSBkZWxfbnVtKSAqIElIX1NJWkUpOworCisJLyogY2hhbmdlIGl0ZW0gbG9jYXRpb24gKi8KKwlmb3IgKGkgPSBmaXJzdDsgaSA8IG5yIC0gZGVsX251bTsgaSsrKQorCQlwdXRfaWhfbG9jYXRpb24oJihpaFtpIC0gZmlyc3RdKSwKKwkJCQlpaF9sb2NhdGlvbigmKGloW2kgLSBmaXJzdF0pKSArIChqIC0KKwkJCQkJCQkJIGxhc3RfcmVtb3ZlZF9sb2MpKTsKKworCS8qIHNpemVzLCBpdGVtIG51bWJlciAqLworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpIC0gZGVsX251bSk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLAorCQkJICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIChqIC0gbGFzdF9yZW1vdmVkX2xvYyArCisJCQkJCQkgICAgIElIX1NJWkUgKiBkZWxfbnVtKSk7CisKKwlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eShiaS0+dGIsIGJoLCAwKTsKKworCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0KKwkJICAgIEJfTl9DSElMRChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgLSAoaiAtIGxhc3RfcmVtb3ZlZF9sb2MgKworCQkJCQkgICAgIElIX1NJWkUgKiBkZWxfbnVtKSk7CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworCX0KIH0KIAotCi0KLQotCiAvKiBwYXN0ZSBuZXdfZW50cnlfY291bnQgZW50cmllcyAobmV3X2RlaHMsIHJlY29yZHMpIGludG8gcG9zaXRpb24gYmVmb3JlIHRvIGl0ZW1fbnVtLXRoIGl0ZW0gKi8KLXZvaWQgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLAordm9pZCBsZWFmX3Bhc3RlX2VudHJpZXMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCWludCBpdGVtX251bSwKIAkJCWludCBiZWZvcmUsCiAJCQlpbnQgbmV3X2VudHJ5X2NvdW50LAotCQkJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBuZXdfZGVocywKLQkJCWNvbnN0IGNoYXIgKiByZWNvcmRzLAotCQkJaW50IHBhc3RlX3NpemUKLQkJKQorCQkJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKm5ld19kZWhzLAorCQkJY29uc3QgY2hhciAqcmVjb3JkcywgaW50IHBhc3RlX3NpemUpCiB7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGNoYXIgKiBpdGVtOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOwotICAgIGNoYXIgKiBpbnNlcnRfcG9pbnQ7Ci0gICAgaW50IGksIG9sZF9lbnRyeV9udW07CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJY2hhciAqaXRlbTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOworCWNoYXIgKmluc2VydF9wb2ludDsKKwlpbnQgaSwgb2xkX2VudHJ5X251bTsKIAotICAgIGlmIChuZXdfZW50cnlfY291bnQgPT0gMCkKLSAgICAgICAgcmV0dXJuOworCWlmIChuZXdfZW50cnlfY291bnQgPT0gMCkKKwkJcmV0dXJuOwogCi0gICAgaWggPSBCX05fUElURU1fSEVBRChiaCwgaXRlbV9udW0pOworCWloID0gQl9OX1BJVEVNX0hFQUQoYmgsIGl0ZW1fbnVtKTsKIAotICAvKiBtYWtlIHN1cmUsIHRoYXQgaXRlbSBpcyBkaXJlY3RvcnksIGFuZCB0aGVyZSBhcmUgZW5vdWdoIHJlY29yZHMgaW4gaXQgKi8KLSAgUkZBTFNFKCAhaXNfZGlyZW50cnlfbGVfaWggKGloKSwgIjEwMjI1OiBpdGVtIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSIpOwotICBSRkFMU0UoIElfRU5UUllfQ09VTlQgKGloKSA8IGJlZm9yZSwKLQkgICIxMDIzMDogdGhlcmUgYXJlIG5vIGVudHJ5IHdlIHBhc3RlIGVudHJpZXMgYmVmb3JlLiBlbnRyeV9jb3VudCA9ICVkLCBiZWZvcmUgPSAlZCIsCi0JICBJX0VOVFJZX0NPVU5UIChpaCksIGJlZm9yZSk7CisJLyogbWFrZSBzdXJlLCB0aGF0IGl0ZW0gaXMgZGlyZWN0b3J5LCBhbmQgdGhlcmUgYXJlIGVub3VnaCByZWNvcmRzIGluIGl0ICovCisJUkZBTFNFKCFpc19kaXJlbnRyeV9sZV9paChpaCksICIxMDIyNTogaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0iKTsKKwlSRkFMU0UoSV9FTlRSWV9DT1VOVChpaCkgPCBiZWZvcmUsCisJICAgICAgICIxMDIzMDogdGhlcmUgYXJlIG5vIGVudHJ5IHdlIHBhc3RlIGVudHJpZXMgYmVmb3JlLiBlbnRyeV9jb3VudCA9ICVkLCBiZWZvcmUgPSAlZCIsCisJICAgICAgIElfRU5UUllfQ09VTlQoaWgpLCBiZWZvcmUpOwogCisJLyogZmlyc3QgYnl0ZSBvZiBkZXN0IGl0ZW0gKi8KKwlpdGVtID0gYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKTsKIAotICAvKiBmaXJzdCBieXRlIG9mIGRlc3QgaXRlbSAqLwotICBpdGVtID0gYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKTsKKwkvKiBlbnRyeSBoZWFkIGFycmF5ICovCisJZGVoID0gQl9JX0RFSChiaCwgaWgpOwogCi0gIC8qIGVudHJ5IGhlYWQgYXJyYXkgKi8KLSAgZGVoID0gQl9JX0RFSCAoYmgsIGloKTsKKwkvKiBuZXcgcmVjb3JkcyB3aWxsIGJlIHBhc3RlZCBhdCB0aGlzIHBvaW50ICovCisJaW5zZXJ0X3BvaW50ID0KKwkgICAgaXRlbSArCisJICAgIChiZWZvcmUgPyBkZWhfbG9jYXRpb24oJihkZWhbYmVmb3JlIC0gMV0pKQorCSAgICAgOiAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkpOwogCi0gIC8qIG5ldyByZWNvcmRzIHdpbGwgYmUgcGFzdGVkIGF0IHRoaXMgcG9pbnQgKi8KLSAgaW5zZXJ0X3BvaW50ID0gaXRlbSArIChiZWZvcmUgPyBkZWhfbG9jYXRpb24oICYoZGVoW2JlZm9yZSAtIDFdKSkgOiAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkpOworCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQUZURVIgbmV3IHJlY29yZHMgKi8KKwlmb3IgKGkgPSBJX0VOVFJZX0NPVU5UKGloKSAtIDE7IGkgPj0gYmVmb3JlOyBpLS0pCisJCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbaV0pLAorCQkJCSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSArCisJCQkJIChERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCkpOwogCi0gIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQUZURVIgbmV3IHJlY29yZHMgKi8KLSAgZm9yIChpID0gSV9FTlRSWV9DT1VOVChpaCkgLSAxOyBpID49IGJlZm9yZTsgaSAtLSkKLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCi0gICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyAoREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQgKSk7IAorCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQkVGT1JFIG5ldyByZWNvcmRzICovCisJZm9yIChpID0gMDsgaSA8IGJlZm9yZTsgaSsrKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyBwYXN0ZV9zaXplKTsKIAotICAvKiBhZGp1c3QgbG9jYXRpb25zIG9mIHJlY29yZHMgdGhhdCB3aWxsIGJlIEJFRk9SRSBuZXcgcmVjb3JkcyAqLwotICBmb3IgKGkgPSAwOyBpIDwgYmVmb3JlOyBpICsrKQotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyBwYXN0ZV9zaXplICk7CisJb2xkX2VudHJ5X251bSA9IElfRU5UUllfQ09VTlQoaWgpOworCXB1dF9paF9lbnRyeV9jb3VudChpaCwgaWhfZW50cnlfY291bnQoaWgpICsgbmV3X2VudHJ5X2NvdW50KTsKIAotICBvbGRfZW50cnlfbnVtID0gSV9FTlRSWV9DT1VOVChpaCk7Ci0gIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGloX2VudHJ5X2NvdW50KGloKSArIG5ld19lbnRyeV9jb3VudCApOworCS8qIHByZXBhcmUgc3BhY2UgZm9yIHBhc3RlZCByZWNvcmRzICovCisJbWVtbW92ZShpbnNlcnRfcG9pbnQgKyBwYXN0ZV9zaXplLCBpbnNlcnRfcG9pbnQsCisJCWl0ZW0gKyAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkgLSBpbnNlcnRfcG9pbnQpOwogCi0gIC8qIHByZXBhcmUgc3BhY2UgZm9yIHBhc3RlZCByZWNvcmRzICovCi0gIG1lbW1vdmUgKGluc2VydF9wb2ludCArIHBhc3RlX3NpemUsIGluc2VydF9wb2ludCwgaXRlbSArIChpaF9pdGVtX2xlbihpaCkgLSBwYXN0ZV9zaXplKSAtIGluc2VydF9wb2ludCk7CisJLyogY29weSBuZXcgcmVjb3JkcyAqLworCW1lbWNweShpbnNlcnRfcG9pbnQgKyBERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCwgcmVjb3JkcywKKwkgICAgICAgcGFzdGVfc2l6ZSAtIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50KTsKIAotICAvKiBjb3B5IG5ldyByZWNvcmRzICovCi0gIG1lbWNweSAoaW5zZXJ0X3BvaW50ICsgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQsIHJlY29yZHMsCi0JCSAgIHBhc3RlX3NpemUgLSBERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCk7Ci0gIAotICAvKiBwcmVwYXJlIHNwYWNlIGZvciBuZXcgZW50cnkgaGVhZHMgKi8KLSAgZGVoICs9IGJlZm9yZTsKLSAgbWVtbW92ZSAoKGNoYXIgKikoZGVoICsgbmV3X2VudHJ5X2NvdW50KSwgZGVoLCBpbnNlcnRfcG9pbnQgLSAoY2hhciAqKWRlaCk7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgbmV3IGVudHJ5IGhlYWRzICovCisJZGVoICs9IGJlZm9yZTsKKwltZW1tb3ZlKChjaGFyICopKGRlaCArIG5ld19lbnRyeV9jb3VudCksIGRlaCwKKwkJaW5zZXJ0X3BvaW50IC0gKGNoYXIgKilkZWgpOwogCi0gIC8qIGNvcHkgbmV3IGVudHJ5IGhlYWRzICovCi0gIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKSgoY2hhciAqKWRlaCk7Ci0gIG1lbWNweSAoZGVoLCBuZXdfZGVocywgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQpOworCS8qIGNvcHkgbmV3IGVudHJ5IGhlYWRzICovCisJZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKChjaGFyICopZGVoKTsKKwltZW1jcHkoZGVoLCBuZXdfZGVocywgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQpOwogCi0gIC8qIHNldCBsb2NhdGlvbnMgb2YgbmV3IHJlY29yZHMgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5ld19lbnRyeV9jb3VudDsgaSArKykKLSAgewotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwKLSAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSApKSArCi0gICAgICAgICgtIGRlaF9sb2NhdGlvbiggJihuZXdfZGVoc1tuZXdfZW50cnlfY291bnQgLSAxXSkpICsKLSAgICAgICAgaW5zZXJ0X3BvaW50ICsgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQgLSBpdGVtKSk7Ci0gIH0KKwkvKiBzZXQgbG9jYXRpb25zIG9mIG5ldyByZWNvcmRzICovCisJZm9yIChpID0gMDsgaSA8IG5ld19lbnRyeV9jb3VudDsgaSsrKSB7CisJCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbaV0pLAorCQkJCSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSArCisJCQkJICgtZGVoX2xvY2F0aW9uCisJCQkJICAoJihuZXdfZGVoc1tuZXdfZW50cnlfY291bnQgLSAxXSkpICsKKwkJCQkgIGluc2VydF9wb2ludCArIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50IC0KKwkJCQkgIGl0ZW0pKTsKKwl9CiAKLQotICAvKiBjaGFuZ2UgaXRlbSBrZXkgaWYgbmVjZXNzYXJ5ICh3aGVuIHdlIHBhc3RlIGJlZm9yZSAwLXRoIGVudHJ5ICovCi0gIGlmICghYmVmb3JlKQotICAgIHsKLQlzZXRfbGVfaWhfa19vZmZzZXQgKGloLCBkZWhfb2Zmc2V0KG5ld19kZWhzKSk7CisJLyogY2hhbmdlIGl0ZW0ga2V5IGlmIG5lY2Vzc2FyeSAod2hlbiB3ZSBwYXN0ZSBiZWZvcmUgMC10aCBlbnRyeSAqLworCWlmICghYmVmb3JlKSB7CisJCXNldF9sZV9paF9rX29mZnNldChpaCwgZGVoX29mZnNldChuZXdfZGVocykpOwogLyogICAgICBtZW1jcHkgKCZpaC0+aWhfa2V5Lmtfb2Zmc2V0LCAKIAkJICAgICAgICZuZXdfZGVocy0+ZGVoX29mZnNldCwgU0hPUlRfS0VZX1NJWkUpOyovCi0gICAgfQotCisJfQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICB7Ci0gICAgaW50IHByZXYsIG5leHQ7Ci0gICAgLyogY2hlY2sgcmVjb3JkIGxvY2F0aW9ucyAqLwotICAgIGRlaCA9IEJfSV9ERUggKGJoLCBpaCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQoaWgpOyBpICsrKSB7Ci0gICAgICBuZXh0ID0gKGkgPCBJX0VOVFJZX0NPVU5UKGloKSAtIDEpID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtpICsgMV0pKSA6IDA7Ci0gICAgICBwcmV2ID0gKGkgIT0gMCkgPyBkZWhfbG9jYXRpb24oICYoZGVoW2kgLSAxXSkgKSA6IDA7Ci0gICAgICAKLSAgICAgIGlmIChwcmV2ICYmIHByZXYgPD0gZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSkpKQotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy0xMDI0MDogbGVhZl9wYXN0ZV9lbnRyaWVzOiBkaXJlY3RvcnkgaXRlbSAoJWgpIGNvcnJ1cHRlZCAocHJldiAlYSwgY3VyKCVkKSAlYSkiLAotCQkJICBpaCwgZGVoICsgaSAtIDEsIGksIGRlaCArIGkpOwotICAgICAgaWYgKG5leHQgJiYgbmV4dCA+PSBkZWhfbG9jYXRpb24oICYoZGVoW2ldKSkpCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTEwMjUwOiBsZWFmX3Bhc3RlX2VudHJpZXM6IGRpcmVjdG9yeSBpdGVtICglaCkgY29ycnVwdGVkIChjdXIoJWQpICVhLCBuZXh0ICVhKSIsCi0JCQkgIGloLCBpLCBkZWggKyBpLCBkZWggKyBpICsgMSk7Ci0gICAgfQotICB9CisJeworCQlpbnQgcHJldiwgbmV4dDsKKwkJLyogY2hlY2sgcmVjb3JkIGxvY2F0aW9ucyAqLworCQlkZWggPSBCX0lfREVIKGJoLCBpaCk7CisJCWZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UKGloKTsgaSsrKSB7CisJCQluZXh0ID0KKwkJCSAgICAoaSA8CisJCQkgICAgIElfRU5UUllfQ09VTlQoaWgpIC0KKwkJCSAgICAgMSkgPyBkZWhfbG9jYXRpb24oJihkZWhbaSArIDFdKSkgOiAwOworCQkJcHJldiA9IChpICE9IDApID8gZGVoX2xvY2F0aW9uKCYoZGVoW2kgLSAxXSkpIDogMDsKKworCQkJaWYgKHByZXYgJiYgcHJldiA8PSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSkKKwkJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCQkgInZzLTEwMjQwOiBsZWFmX3Bhc3RlX2VudHJpZXM6IGRpcmVjdG9yeSBpdGVtICglaCkgY29ycnVwdGVkIChwcmV2ICVhLCBjdXIoJWQpICVhKSIsCisJCQkJCQkgaWgsIGRlaCArIGkgLSAxLCBpLCBkZWggKyBpKTsKKwkJCWlmIChuZXh0ICYmIG5leHQgPj0gZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkpCisJCQkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCQkJICJ2cy0xMDI1MDogbGVhZl9wYXN0ZV9lbnRyaWVzOiBkaXJlY3RvcnkgaXRlbSAoJWgpIGNvcnJ1cHRlZCAoY3VyKCVkKSAlYSwgbmV4dCAlYSkiLAorCQkJCQkJIGloLCBpLCBkZWggKyBpLCBkZWggKyBpICsgMSk7CisJCX0KKwl9CiAjZW5kaWYKIAogfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbmFtZWkuYyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKaW5kZXggNGEzMzMyNS4uYTIwYmJjMSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvbmFtZWkuYworKysgYi9mcy9yZWlzZXJmcy9uYW1laS5jCkBAIC0yNSw4NiArMjUsODUgQEAKIAogLy8gZGlyZWN0b3J5IGl0ZW0gY29udGFpbnMgYXJyYXkgb2YgZW50cnkgaGVhZGVycy4gVGhpcyBwZXJmb3JtcwogLy8gYmluYXJ5IHNlYXJjaCB0aHJvdWdoIHRoYXQgYXJyYXkKLXN0YXRpYyBpbnQgYmluX3NlYXJjaF9pbl9kaXJfaXRlbSAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLCBsb2ZmX3Qgb2ZmKQorc3RhdGljIGludCBiaW5fc2VhcmNoX2luX2Rpcl9pdGVtKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlLCBsb2ZmX3Qgb2ZmKQogewotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCA9IGRlLT5kZV9paDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaCA9IGRlLT5kZV9kZWg7Ci0gICAgaW50IHJib3VuZCwgbGJvdW5kLCBqOworCXN0cnVjdCBpdGVtX2hlYWQgKmloID0gZGUtPmRlX2loOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggPSBkZS0+ZGVfZGVoOworCWludCByYm91bmQsIGxib3VuZCwgajsKIAotICAgIGxib3VuZCA9IDA7Ci0gICAgcmJvdW5kID0gSV9FTlRSWV9DT1VOVCAoaWgpIC0gMTsKKwlsYm91bmQgPSAwOworCXJib3VuZCA9IElfRU5UUllfQ09VTlQoaWgpIC0gMTsKIAotICAgIGZvciAoaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMjsgbGJvdW5kIDw9IHJib3VuZDsgaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMikgewotCWlmIChvZmYgPCBkZWhfb2Zmc2V0IChkZWggKyBqKSkgewotCSAgICByYm91bmQgPSBqIC0gMTsKLQkgICAgY29udGludWU7CisJZm9yIChqID0gKHJib3VuZCArIGxib3VuZCkgLyAyOyBsYm91bmQgPD0gcmJvdW5kOworCSAgICAgaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMikgeworCQlpZiAob2ZmIDwgZGVoX29mZnNldChkZWggKyBqKSkgeworCQkJcmJvdW5kID0gaiAtIDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob2ZmID4gZGVoX29mZnNldChkZWggKyBqKSkgeworCQkJbGJvdW5kID0gaiArIDE7CisJCQljb250aW51ZTsKKwkJfQorCQkvLyB0aGlzIGlzIG5vdCBuYW1lIGZvdW5kLCBidXQgbWF0Y2hlZCB0aGlyZCBrZXkgY29tcG9uZW50CisJCWRlLT5kZV9lbnRyeV9udW0gPSBqOworCQlyZXR1cm4gTkFNRV9GT1VORDsKIAl9Ci0JaWYgKG9mZiA+IGRlaF9vZmZzZXQgKGRlaCArIGopKSB7Ci0JICAgIGxib3VuZCA9IGogKyAxOwotCSAgICBjb250aW51ZTsKLQl9Ci0JLy8gdGhpcyBpcyBub3QgbmFtZSBmb3VuZCwgYnV0IG1hdGNoZWQgdGhpcmQga2V5IGNvbXBvbmVudAotCWRlLT5kZV9lbnRyeV9udW0gPSBqOwotCXJldHVybiBOQU1FX0ZPVU5EOwotICAgIH0KIAotICAgIGRlLT5kZV9lbnRyeV9udW0gPSBsYm91bmQ7Ci0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCWRlLT5kZV9lbnRyeV9udW0gPSBsYm91bmQ7CisJcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogfQogCi0KIC8vIGNvbW1lbnQ/ICBtYXliZSBzb21ldGhpbmcgbGlrZSBzZXQgZGUgdG8gcG9pbnQgdG8gd2hhdCB0aGUgcGF0aCBwb2ludHMgdG8/Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlX2l0ZW1fbG9jYXRpb24gKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSwgc3RydWN0IHBhdGggKiBwYXRoKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kZV9pdGVtX2xvY2F0aW9uKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlLAorCQkJCQlzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKLSAgICBkZS0+ZGVfYmggPSBnZXRfbGFzdF9iaCAocGF0aCk7Ci0gICAgZGUtPmRlX2loID0gZ2V0X2loIChwYXRoKTsKLSAgICBkZS0+ZGVfZGVoID0gQl9JX0RFSCAoZGUtPmRlX2JoLCBkZS0+ZGVfaWgpOwotICAgIGRlLT5kZV9pdGVtX251bSA9IFBBVEhfTEFTVF9QT1NJVElPTiAocGF0aCk7Ci19IAotCisJZGUtPmRlX2JoID0gZ2V0X2xhc3RfYmgocGF0aCk7CisJZGUtPmRlX2loID0gZ2V0X2loKHBhdGgpOworCWRlLT5kZV9kZWggPSBCX0lfREVIKGRlLT5kZV9iaCwgZGUtPmRlX2loKTsKKwlkZS0+ZGVfaXRlbV9udW0gPSBQQVRIX0xBU1RfUE9TSVRJT04ocGF0aCk7Cit9CiAKIC8vIGRlX2JoLCBkZV9paCwgZGVfZGVoIChwb2ludHMgdG8gZmlyc3QgZWxlbWVudCBvZiBhcnJheSksIGRlX2l0ZW1fbnVtIGlzIHNldAotaW5saW5lIHZvaWQgc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK2lubGluZSB2b2lkIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW07CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCA9IGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtOwogCi0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOwogCi0gICAgZGUtPmRlX2VudHJ5bGVuID0gZW50cnlfbGVuZ3RoIChkZS0+ZGVfYmgsIGRlLT5kZV9paCwgZGUtPmRlX2VudHJ5X251bSk7Ci0gICAgZGUtPmRlX25hbWVsZW4gPSBkZS0+ZGVfZW50cnlsZW4gLSAoZGVfd2l0aF9zZCAoZGVoKSA/IFNEX1NJWkUgOiAwKTsKLSAgICBkZS0+ZGVfbmFtZSA9IEJfSV9QSVRFTSAoZGUtPmRlX2JoLCBkZS0+ZGVfaWgpICsgZGVoX2xvY2F0aW9uKGRlaCk7Ci0gICAgaWYgKGRlLT5kZV9uYW1lW2RlLT5kZV9uYW1lbGVuIC0gMV0gPT0gMCkKLQlkZS0+ZGVfbmFtZWxlbiA9IHN0cmxlbiAoZGUtPmRlX25hbWUpOworCWRlLT5kZV9lbnRyeWxlbiA9IGVudHJ5X2xlbmd0aChkZS0+ZGVfYmgsIGRlLT5kZV9paCwgZGUtPmRlX2VudHJ5X251bSk7CisJZGUtPmRlX25hbWVsZW4gPSBkZS0+ZGVfZW50cnlsZW4gLSAoZGVfd2l0aF9zZChkZWgpID8gU0RfU0laRSA6IDApOworCWRlLT5kZV9uYW1lID0gQl9JX1BJVEVNKGRlLT5kZV9iaCwgZGUtPmRlX2loKSArIGRlaF9sb2NhdGlvbihkZWgpOworCWlmIChkZS0+ZGVfbmFtZVtkZS0+ZGVfbmFtZWxlbiAtIDFdID09IDApCisJCWRlLT5kZV9uYW1lbGVuID0gc3RybGVuKGRlLT5kZV9uYW1lKTsKIH0KIAotCiAvLyB3aGF0IGVudHJ5IHBvaW50cyB0bwotc3RhdGljIGlubGluZSB2b2lkIHNldF9kZV9vYmplY3Rfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlX29iamVjdF9rZXkoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpCiB7Ci0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOwotICAgIGRlLT5kZV9kaXJfaWQgPSBkZWhfZGlyX2lkKCAmKGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0pKTsKLSAgICBkZS0+ZGVfb2JqZWN0aWQgPSBkZWhfb2JqZWN0aWQoICYoZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXSkpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOworCWRlLT5kZV9kaXJfaWQgPSBkZWhfZGlyX2lkKCYoZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXSkpOworCWRlLT5kZV9vYmplY3RpZCA9IGRlaF9vYmplY3RpZCgmKGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0pKTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfZGVfZW50cnlfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfZGVfZW50cnlfa2V5KHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW07CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCA9IGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtOwogCi0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOwogCi0gICAgLyogc3RvcmUga2V5IG9mIHRoZSBmb3VuZCBlbnRyeSAqLwotICAgIGRlLT5kZV9lbnRyeV9rZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OwotICAgIGRlLT5kZV9lbnRyeV9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSBsZTMyX3RvX2NwdSAoZGUtPmRlX2loLT5paF9rZXkua19kaXJfaWQpOwotICAgIGRlLT5kZV9lbnRyeV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChkZS0+ZGVfaWgtPmloX2tleS5rX29iamVjdGlkKTsKLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJihkZS0+ZGVfZW50cnlfa2V5KSwgZGVoX29mZnNldCAoZGVoKSk7Ci0gICAgc2V0X2NwdV9rZXlfa190eXBlICgmKGRlLT5kZV9lbnRyeV9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKKwkvKiBzdG9yZSBrZXkgb2YgdGhlIGZvdW5kIGVudHJ5ICovCisJZGUtPmRlX2VudHJ5X2tleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7CisJZGUtPmRlX2VudHJ5X2tleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9CisJICAgIGxlMzJfdG9fY3B1KGRlLT5kZV9paC0+aWhfa2V5LmtfZGlyX2lkKTsKKwlkZS0+ZGVfZW50cnlfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPQorCSAgICBsZTMyX3RvX2NwdShkZS0+ZGVfaWgtPmloX2tleS5rX29iamVjdGlkKTsKKwlzZXRfY3B1X2tleV9rX29mZnNldCgmKGRlLT5kZV9lbnRyeV9rZXkpLCBkZWhfb2Zmc2V0KGRlaCkpOworCXNldF9jcHVfa2V5X2tfdHlwZSgmKGRlLT5kZV9lbnRyeV9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKIH0KIAotCiAvKiBXZSBhc3NpZ24gYSBrZXkgdG8gZWFjaCBkaXJlY3RvcnkgaXRlbSwgYW5kIHBsYWNlIG11bHRpcGxlIGVudHJpZXMKIGluIGEgc2luZ2xlIGRpcmVjdG9yeSBpdGVtLiAgQSBkaXJlY3RvcnkgaXRlbSBoYXMgYSBrZXkgZXF1YWwgdG8gdGhlCiBrZXkgb2YgdGhlIGZpcnN0IGRpcmVjdG9yeSBlbnRyeSBpbiBpdC4KQEAgLTExNyw1OCArMTE2LDYwIEBACiAqLwogCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1pbnQgc2VhcmNoX2J5X2VudHJ5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LAotCQkJIHN0cnVjdCBwYXRoICogcGF0aCwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQoraW50IHNlYXJjaF9ieV9lbnRyeV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCXN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgICBpbnQgcmV0dmFsOworCWludCByZXR2YWw7CiAKLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoc2IsIGtleSwgcGF0aCk7Ci0gICAgc3dpdGNoIChyZXR2YWwpIHsKLSAgICBjYXNlIElURU1fTk9UX0ZPVU5EOgotCWlmICghUEFUSF9MQVNUX1BPU0lUSU9OIChwYXRoKSkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTcwMDA6IHNlYXJjaF9ieV9lbnRyeV9rZXk6IHNlYXJjaF9ieV9rZXkgcmV0dXJuZWQgaXRlbSBwb3NpdGlvbiA9PSAwIik7Ci0JICAgIHBhdGhyZWxzZShwYXRoKSA7Ci0JICAgIHJldHVybiBJT19FUlJPUiA7CisJcmV0dmFsID0gc2VhcmNoX2l0ZW0oc2IsIGtleSwgcGF0aCk7CisJc3dpdGNoIChyZXR2YWwpIHsKKwljYXNlIElURU1fTk9UX0ZPVU5EOgorCQlpZiAoIVBBVEhfTEFTVF9QT1NJVElPTihwYXRoKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzYiwKKwkJCQkJICJ2cy03MDAwOiBzZWFyY2hfYnlfZW50cnlfa2V5OiBzZWFyY2hfYnlfa2V5IHJldHVybmVkIGl0ZW0gcG9zaXRpb24gPT0gMCIpOworCQkJcGF0aHJlbHNlKHBhdGgpOworCQkJcmV0dXJuIElPX0VSUk9SOworCQl9CisJCVBBVEhfTEFTVF9QT1NJVElPTihwYXRoKS0tOworCisJY2FzZSBJVEVNX0ZPVU5EOgorCQlicmVhazsKKworCWNhc2UgSU9fRVJST1I6CisJCXJldHVybiByZXR2YWw7CisKKwlkZWZhdWx0OgorCQlwYXRocmVsc2UocGF0aCk7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsCisJCQkJICJ2cy03MDAyOiBzZWFyY2hfYnlfZW50cnlfa2V5OiBubyBwYXRoIHRvIGhlcmUiKTsKKwkJcmV0dXJuIElPX0VSUk9SOwogCX0KLQlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpIC0tOwogCi0gICAgY2FzZSBJVEVNX0ZPVU5EOgotCWJyZWFrOwotCi0gICAgY2FzZSBJT19FUlJPUjoKLQlyZXR1cm4gcmV0dmFsOwotCi0gICAgZGVmYXVsdDoKLQlwYXRocmVsc2UgKHBhdGgpOwotCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtNzAwMjogc2VhcmNoX2J5X2VudHJ5X2tleTogbm8gcGF0aCB0byBoZXJlIik7Ci0JcmV0dXJuIElPX0VSUk9SOwotICAgIH0KLQotICAgIHNldF9kZV9pdGVtX2xvY2F0aW9uIChkZSwgcGF0aCk7CisJc2V0X2RlX2l0ZW1fbG9jYXRpb24oZGUsIHBhdGgpOwogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgaWYgKCFpc19kaXJlbnRyeV9sZV9paCAoZGUtPmRlX2loKSB8fCAKLQlDT01QX1NIT1JUX0tFWVMgKCYoZGUtPmRlX2loLT5paF9rZXkpLCBrZXkpKSB7Ci0JcHJpbnRfYmxvY2sgKGRlLT5kZV9iaCwgMCwgLTEsIC0xKTsKLQlyZWlzZXJmc19wYW5pYyAoc2IsICJ2cy03MDA1OiBzZWFyY2hfYnlfZW50cnlfa2V5OiBmb3VuZCBpdGVtICVoIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZG9lcyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBrZXkgJUsiLCBkZS0+ZGVfaWgsIGtleSk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLworCWlmICghaXNfZGlyZW50cnlfbGVfaWgoZGUtPmRlX2loKSB8fAorCSAgICBDT01QX1NIT1JUX0tFWVMoJihkZS0+ZGVfaWgtPmloX2tleSksIGtleSkpIHsKKwkJcHJpbnRfYmxvY2soZGUtPmRlX2JoLCAwLCAtMSwgLTEpOworCQlyZWlzZXJmc19wYW5pYyhzYiwKKwkJCSAgICAgICAidnMtNzAwNTogc2VhcmNoX2J5X2VudHJ5X2tleTogZm91bmQgaXRlbSAlaCBpcyBub3QgZGlyZWN0b3J5IGl0ZW0gb3IgIgorCQkJICAgICAgICJkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGtleSAlSyIsCisJCQkgICAgICAgZGUtPmRlX2loLCBrZXkpOworCX0KKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAotICAgIC8qIGJpbmFyeSBzZWFyY2ggaW4gZGlyZWN0b3J5IGl0ZW0gYnkgdGhpcmQgY29tcG9uZW4gdCBvZiB0aGUKLSAgICAgICBrZXkuIHNldHMgZGUtPmRlX2VudHJ5X251bSBvZiBkZSAqLwotICAgIHJldHZhbCA9IGJpbl9zZWFyY2hfaW5fZGlyX2l0ZW0gKGRlLCBjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKTsKLSAgICBwYXRoLT5wb3NfaW5faXRlbSA9IGRlLT5kZV9lbnRyeV9udW07Ci0gICAgaWYgKHJldHZhbCAhPSBOQU1FX05PVF9GT1VORCkgewotCS8vIHVnbHksIGJ1dCByZW5hbWUgbmVlZHMgZGVfYmgsIGRlX2RlaCwgZGVfbmFtZSwgZGVfbmFtZWxlbiwgZGVfb2JqZWN0aWQgc2V0Ci0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKGRlKTsKLQlzZXRfZGVfb2JqZWN0X2tleSAoZGUpOwotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOworCS8qIGJpbmFyeSBzZWFyY2ggaW4gZGlyZWN0b3J5IGl0ZW0gYnkgdGhpcmQgY29tcG9uZW4gdCBvZiB0aGUKKwkgICBrZXkuIHNldHMgZGUtPmRlX2VudHJ5X251bSBvZiBkZSAqLworCXJldHZhbCA9IGJpbl9zZWFyY2hfaW5fZGlyX2l0ZW0oZGUsIGNwdV9rZXlfa19vZmZzZXQoa2V5KSk7CisJcGF0aC0+cG9zX2luX2l0ZW0gPSBkZS0+ZGVfZW50cnlfbnVtOworCWlmIChyZXR2YWwgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKwkJLy8gdWdseSwgYnV0IHJlbmFtZSBuZWVkcyBkZV9iaCwgZGVfZGVoLCBkZV9uYW1lLCBkZV9uYW1lbGVuLCBkZV9vYmplY3RpZCBzZXQKKwkJc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oZGUpOworCQlzZXRfZGVfb2JqZWN0X2tleShkZSk7CisJfQorCXJldHVybiByZXR2YWw7CiB9CiAKLQotCiAvKiBLZXllZCAzMi1iaXQgaGFzaCBmdW5jdGlvbiB1c2luZyBURUEgaW4gYSBEYXZpcy1NZXllciBmdW5jdGlvbiAqLwogCiAvKiBUaGUgdGhpcmQgY29tcG9uZW50IGlzIGhhc2hlZCwgYW5kIHlvdSBjYW4gY2hvb3NlIGZyb20gbW9yZSB0aGFuCkBAIC0xNzYsMzcxICsxNzcsMzkzIEBACiAgICBidXQgYXJlIHRob3VnaHQgYWJvdXQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG1vdmVkIHRvIGhhc2hlcy5jCiAgICBKZWRpLCBwbGVhc2UgZG8gc28uICAtSGFucyAqLwogCi1zdGF0aWMgX191MzIgZ2V0X3RoaXJkX2NvbXBvbmVudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgCi0JCQkJICBjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3N0YXRpYyBfX3UzMiBnZXRfdGhpcmRfY29tcG9uZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKLSAgICBfX3UzMiByZXM7CisJX191MzIgcmVzOwogCi0gICAgaWYgKCFsZW4gfHwgKGxlbiA9PSAxICYmIG5hbWVbMF0gPT0gJy4nKSkKLQlyZXR1cm4gRE9UX09GRlNFVDsKLSAgICBpZiAobGVuID09IDIgJiYgbmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpCi0JcmV0dXJuIERPVF9ET1RfT0ZGU0VUOworCWlmICghbGVuIHx8IChsZW4gPT0gMSAmJiBuYW1lWzBdID09ICcuJykpCisJCXJldHVybiBET1RfT0ZGU0VUOworCWlmIChsZW4gPT0gMiAmJiBuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJykKKwkJcmV0dXJuIERPVF9ET1RfT0ZGU0VUOwogCi0gICAgcmVzID0gUkVJU0VSRlNfU0IocyktPnNfaGFzaF9mdW5jdGlvbiAobmFtZSwgbGVuKTsKKwlyZXMgPSBSRUlTRVJGU19TQihzKS0+c19oYXNoX2Z1bmN0aW9uKG5hbWUsIGxlbik7CiAKLSAgICAvLyB0YWtlIGJpdHMgZnJvbSA3LXRoIHRvIDMwLXRoIGluY2x1ZGluZyBib3RoIGJvdW5kcwotICAgIHJlcyA9IEdFVF9IQVNIX1ZBTFVFKHJlcyk7Ci0gICAgaWYgKHJlcyA9PSAwKQotCS8vIG5lZWRlZCB0byBoYXZlIG5vIG5hbWVzIGJlZm9yZSAiLiIgYW5kICIuLiIgdGhvc2UgaGF2ZSBoYXNoCi0JLy8gdmFsdWUgPT0gMCBhbmQgZ2VuZXJhdGlvbiBjb250ZXJzIDEgYW5kIDIgYWNjb3JkaW5nbHkKLQlyZXMgPSAxMjg7Ci0gICAgcmV0dXJuIHJlcyArIE1BWF9HRU5FUkFUSU9OX05VTUJFUjsKKwkvLyB0YWtlIGJpdHMgZnJvbSA3LXRoIHRvIDMwLXRoIGluY2x1ZGluZyBib3RoIGJvdW5kcworCXJlcyA9IEdFVF9IQVNIX1ZBTFVFKHJlcyk7CisJaWYgKHJlcyA9PSAwKQorCQkvLyBuZWVkZWQgdG8gaGF2ZSBubyBuYW1lcyBiZWZvcmUgIi4iIGFuZCAiLi4iIHRob3NlIGhhdmUgaGFzaAorCQkvLyB2YWx1ZSA9PSAwIGFuZCBnZW5lcmF0aW9uIGNvbnRlcnMgMSBhbmQgMiBhY2NvcmRpbmdseQorCQlyZXMgPSAxMjg7CisJcmV0dXJuIHJlcyArIE1BWF9HRU5FUkFUSU9OX05VTUJFUjsKIH0KIAotCi1zdGF0aWMgaW50IHJlaXNlcmZzX21hdGNoIChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIAotCQkJICAgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuKQorc3RhdGljIGludCByZWlzZXJmc19tYXRjaChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCSAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCiB7Ci0gICAgaW50IHJldHZhbCA9IE5BTUVfTk9UX0ZPVU5EOworCWludCByZXR2YWwgPSBOQU1FX05PVF9GT1VORDsKIAotICAgIGlmICgobmFtZWxlbiA9PSBkZS0+ZGVfbmFtZWxlbikgJiYKLQkhbWVtY21wKGRlLT5kZV9uYW1lLCBuYW1lLCBkZS0+ZGVfbmFtZWxlbikpCi0JcmV0dmFsID0gKGRlX3Zpc2libGUgKGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtKSA/IE5BTUVfRk9VTkQgOiBOQU1FX0ZPVU5EX0lOVklTSUJMRSk7CisJaWYgKChuYW1lbGVuID09IGRlLT5kZV9uYW1lbGVuKSAmJgorCSAgICAhbWVtY21wKGRlLT5kZV9uYW1lLCBuYW1lLCBkZS0+ZGVfbmFtZWxlbikpCisJCXJldHZhbCA9CisJCSAgICAoZGVfdmlzaWJsZShkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bSkgPyBOQU1FX0ZPVU5EIDoKKwkJICAgICBOQU1FX0ZPVU5EX0lOVklTSUJMRSk7CiAKLSAgICByZXR1cm4gcmV0dmFsOworCXJldHVybiByZXR2YWw7CiB9CiAKLQogLyogZGUncyBkZV9iaCwgZGVfaWgsIGRlX2RlaCwgZGVfaXRlbV9udW0sIGRlX2VudHJ5X251bSBhcmUgc2V0IGFscmVhZHkgKi8KIAogCQkJCS8qIHVzZWQgd2hlbiBoYXNoIGNvbGxpc2lvbnMgZXhpc3QgKi8KIAotCi1zdGF0aWMgaW50IGxpbmVhcl9zZWFyY2hfaW5fZGlyX2l0ZW0gKHN0cnVjdCBjcHVfa2V5ICoga2V5LCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsCi0JCQkJICAgICAgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuKQorc3RhdGljIGludCBsaW5lYXJfc2VhcmNoX2luX2Rpcl9pdGVtKHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaDsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBpOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggPSBkZS0+ZGVfZGVoOworCWludCByZXR2YWw7CisJaW50IGk7CiAKLSAgICBpID0gZGUtPmRlX2VudHJ5X251bTsKKwlpID0gZGUtPmRlX2VudHJ5X251bTsKIAotICAgIGlmIChpID09IElfRU5UUllfQ09VTlQgKGRlLT5kZV9paCkgfHwKLQlHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoICsgaSkpICE9IEdFVF9IQVNIX1ZBTFVFIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKSkgewotCWkgLS07Ci0gICAgfQotCi0gICAgUkZBTFNFKCBkZS0+ZGVfZGVoICE9IEJfSV9ERUggKGRlLT5kZV9iaCwgZGUtPmRlX2loKSwKLQkgICAgInZzLTcwMTA6IGFycmF5IG9mIGVudHJ5IGhlYWRlcnMgbm90IGZvdW5kIik7Ci0KLSAgICBkZWggKz0gaTsKLQotICAgIGZvciAoOyBpID49IDA7IGkgLS0sIGRlaCAtLSkgewotCWlmIChHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoKSkgIT0KLQkgICAgR0VUX0hBU0hfVkFMVUUgKGNwdV9rZXlfa19vZmZzZXQgKGtleSkpKSB7Ci0JICAgIC8vIGhhc2ggdmFsdWUgZG9lcyBub3QgbWF0Y2gsIG5vIG5lZWQgdG8gY2hlY2sgd2hvbGUgbmFtZQotCSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisJaWYgKGkgPT0gSV9FTlRSWV9DT1VOVChkZS0+ZGVfaWgpIHx8CisJICAgIEdFVF9IQVNIX1ZBTFVFKGRlaF9vZmZzZXQoZGVoICsgaSkpICE9CisJICAgIEdFVF9IQVNIX1ZBTFVFKGNwdV9rZXlfa19vZmZzZXQoa2V5KSkpIHsKKwkJaS0tOwogCX0KLSAgIAotCS8qIG1hcmssIHRoYXQgdGhpcyBnZW5lcmF0aW9uIG51bWJlciBpcyB1c2VkICovCi0JaWYgKGRlLT5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcpCi0JICAgIHNldF9iaXQgKEdFVF9HRU5FUkFUSU9OX05VTUJFUiAoZGVoX29mZnNldCAoZGVoKSksICh1bnNpZ25lZCBsb25nICopZGUtPmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyk7CiAKLQkvLyBjYWxjdWxhdGUgcG9pbnRlciB0byBuYW1lIGFuZCBuYW1lbGVuCi0JZGUtPmRlX2VudHJ5X251bSA9IGk7Ci0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKGRlKTsKKwlSRkFMU0UoZGUtPmRlX2RlaCAhPSBCX0lfREVIKGRlLT5kZV9iaCwgZGUtPmRlX2loKSwKKwkgICAgICAgInZzLTcwMTA6IGFycmF5IG9mIGVudHJ5IGhlYWRlcnMgbm90IGZvdW5kIik7CiAKLQlpZiAoKHJldHZhbCA9IHJlaXNlcmZzX21hdGNoIChkZSwgbmFtZSwgbmFtZWxlbikpICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0JICAgIC8vIGRlJ3MgZGVfbmFtZSwgZGVfbmFtZWxlbiwgZGVfcmVjb3JkbGVuIGFyZSBzZXQuIEZpbGwgdGhlIHJlc3Q6CisJZGVoICs9IGk7CiAKLQkgICAgLy8ga2V5IG9mIHBvaW50ZWQgb2JqZWN0Ci0JICAgIHNldF9kZV9vYmplY3Rfa2V5IChkZSk7CisJZm9yICg7IGkgPj0gMDsgaS0tLCBkZWgtLSkgeworCQlpZiAoR0VUX0hBU0hfVkFMVUUoZGVoX29mZnNldChkZWgpKSAhPQorCQkgICAgR0VUX0hBU0hfVkFMVUUoY3B1X2tleV9rX29mZnNldChrZXkpKSkgeworCQkJLy8gaGFzaCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCwgbm8gbmVlZCB0byBjaGVjayB3aG9sZSBuYW1lCisJCQlyZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisJCX0KIAotCSAgICBzdG9yZV9kZV9lbnRyeV9rZXkgKGRlKTsKKwkJLyogbWFyaywgdGhhdCB0aGlzIGdlbmVyYXRpb24gbnVtYmVyIGlzIHVzZWQgKi8KKwkJaWYgKGRlLT5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcpCisJCQlzZXRfYml0KEdFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCkpLAorCQkJCSh1bnNpZ25lZCBsb25nICopZGUtPmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyk7CiAKLQkgICAgLy8gcmV0dmFsIGNhbiBiZSBOQU1FX0ZPVU5EIG9yIE5BTUVfRk9VTkRfSU5WSVNJQkxFCi0JICAgIHJldHVybiByZXR2YWw7CisJCS8vIGNhbGN1bGF0ZSBwb2ludGVyIHRvIG5hbWUgYW5kIG5hbWVsZW4KKwkJZGUtPmRlX2VudHJ5X251bSA9IGk7CisJCXNldF9kZV9uYW1lX2FuZF9uYW1lbGVuKGRlKTsKKworCQlpZiAoKHJldHZhbCA9CisJCSAgICAgcmVpc2VyZnNfbWF0Y2goZGUsIG5hbWUsIG5hbWVsZW4pKSAhPSBOQU1FX05PVF9GT1VORCkgeworCQkJLy8gZGUncyBkZV9uYW1lLCBkZV9uYW1lbGVuLCBkZV9yZWNvcmRsZW4gYXJlIHNldC4gRmlsbCB0aGUgcmVzdDoKKworCQkJLy8ga2V5IG9mIHBvaW50ZWQgb2JqZWN0CisJCQlzZXRfZGVfb2JqZWN0X2tleShkZSk7CisKKwkJCXN0b3JlX2RlX2VudHJ5X2tleShkZSk7CisKKwkJCS8vIHJldHZhbCBjYW4gYmUgTkFNRV9GT1VORCBvciBOQU1FX0ZPVU5EX0lOVklTSUJMRQorCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICBpZiAoR0VUX0dFTkVSQVRJT05fTlVNQkVSIChsZV9paF9rX29mZnNldCAoZGUtPmRlX2loKSkgPT0gMCkKLQkvKiB3ZSBoYXZlIHJlYWNoZWQgbGVmdCBtb3N0IGVudHJ5IGluIHRoZSBub2RlLiBJbiBjb21tb24gd2UKLSAgICAgICAgICAgaGF2ZSB0byBnbyB0byB0aGUgbGVmdCBuZWlnaGJvciwgYnV0IGlmIGdlbmVyYXRpb24gY291bnRlcgotICAgICAgICAgICBpcyAwIGFscmVhZHksIHdlIGtub3cgZm9yIHN1cmUsIHRoYXQgdGhlcmUgaXMgbm8gbmFtZSB3aXRoCi0gICAgICAgICAgIHRoZSBzYW1lIGhhc2ggdmFsdWUgKi8KLQkvLyBGSVhNRTogdGhpcyB3b3JrIGNvcnJlY3RseSBvbmx5IGJlY2F1c2UgaGFzaCB2YWx1ZSBjYW4gbm90Ci0JLy8gYmUgMC4gQnR3LCBpbiBjYXNlIG9mIFl1cmEncyBoYXNoIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlLAotCS8vIHNvLCB0aGlzIGlzIGEgYnVnCi0JcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCWlmIChHRVRfR0VORVJBVElPTl9OVU1CRVIobGVfaWhfa19vZmZzZXQoZGUtPmRlX2loKSkgPT0gMCkKKwkJLyogd2UgaGF2ZSByZWFjaGVkIGxlZnQgbW9zdCBlbnRyeSBpbiB0aGUgbm9kZS4gSW4gY29tbW9uIHdlCisJCSAgIGhhdmUgdG8gZ28gdG8gdGhlIGxlZnQgbmVpZ2hib3IsIGJ1dCBpZiBnZW5lcmF0aW9uIGNvdW50ZXIKKwkJICAgaXMgMCBhbHJlYWR5LCB3ZSBrbm93IGZvciBzdXJlLCB0aGF0IHRoZXJlIGlzIG5vIG5hbWUgd2l0aAorCQkgICB0aGUgc2FtZSBoYXNoIHZhbHVlICovCisJCS8vIEZJWE1FOiB0aGlzIHdvcmsgY29ycmVjdGx5IG9ubHkgYmVjYXVzZSBoYXNoIHZhbHVlIGNhbiBub3QKKwkJLy8gYmUgMC4gQnR3LCBpbiBjYXNlIG9mIFl1cmEncyBoYXNoIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlLAorCQkvLyBzbywgdGhpcyBpcyBhIGJ1ZworCQlyZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKLSAgICBSRkFMU0UoIGRlLT5kZV9pdGVtX251bSwKLQkgICAgInZzLTcwMTU6IHR3byBkaXJpdGVtcyBvZiB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gb25lIG5vZGU/Iik7CisJUkZBTFNFKGRlLT5kZV9pdGVtX251bSwKKwkgICAgICAgInZzLTcwMTU6IHR3byBkaXJpdGVtcyBvZiB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gb25lIG5vZGU/Iik7CiAKLSAgICByZXR1cm4gR09UT19QUkVWSU9VU19JVEVNOworCXJldHVybiBHT1RPX1BSRVZJT1VTX0lURU07CiB9CiAKLQogLy8gbWF5IHJldHVybiBOQU1FX0ZPVU5ELCBOQU1FX0ZPVU5EX0lOVklTSUJMRSwgTkFNRV9OT1RfRk9VTkQKIC8vIEZJWE1FOiBzaG91bGQgYWRkIHNvbWV0aGluZyBsaWtlIElPRVJST1IKLXN0YXRpYyBpbnQgcmVpc2VyZnNfZmluZF9lbnRyeSAoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIAotCQkJCXN0cnVjdCBwYXRoICogcGF0aF90b19lbnRyeSwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQorc3RhdGljIGludCByZWlzZXJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgcGF0aCAqcGF0aF90b19lbnRyeSwKKwkJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXlfdG9fc2VhcmNoOwotICAgIGludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkga2V5X3RvX3NlYXJjaDsKKwlpbnQgcmV0dmFsOwogCisJaWYgKG5hbWVsZW4gPiBSRUlTRVJGU19NQVhfTkFNRShkaXItPmlfc2ItPnNfYmxvY2tzaXplKSkKKwkJcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCi0gICAgaWYgKG5hbWVsZW4gPiBSRUlTRVJGU19NQVhfTkFNRSAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpCi0JcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCS8qIHdlIHdpbGwgc2VhcmNoIGZvciB0aGlzIGtleSBpbiB0aGUgdHJlZSAqLworCW1ha2VfY3B1X2tleSgma2V5X3RvX3NlYXJjaCwgZGlyLAorCQkgICAgIGdldF90aGlyZF9jb21wb25lbnQoZGlyLT5pX3NiLCBuYW1lLCBuYW1lbGVuKSwKKwkJICAgICBUWVBFX0RJUkVOVFJZLCAzKTsKIAotICAgIC8qIHdlIHdpbGwgc2VhcmNoIGZvciB0aGlzIGtleSBpbiB0aGUgdHJlZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJmtleV90b19zZWFyY2gsIGRpciwgCi0JCSAgZ2V0X3RoaXJkX2NvbXBvbmVudCAoZGlyLT5pX3NiLCBuYW1lLCBuYW1lbGVuKSwgVFlQRV9ESVJFTlRSWSwgMyk7CisJd2hpbGUgKDEpIHsKKwkJcmV0dmFsID0KKwkJICAgIHNlYXJjaF9ieV9lbnRyeV9rZXkoZGlyLT5pX3NiLCAma2V5X3RvX3NlYXJjaCwKKwkJCQkJcGF0aF90b19lbnRyeSwgZGUpOworCQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwgInphbS03MDAxOiBpbyBlcnJvciBpbiAlcyIsCisJCQkJCSBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIElPX0VSUk9SOworCQl9CiAKLSAgICB3aGlsZSAoMSkgewotCXJldHZhbCA9IHNlYXJjaF9ieV9lbnRyeV9rZXkgKGRpci0+aV9zYiwgJmtleV90b19zZWFyY2gsIHBhdGhfdG9fZW50cnksIGRlKTsKKwkJLyogY29tcGFyZSBuYW1lcyBmb3IgYWxsIGVudHJpZXMgaGF2aW5nIGdpdmVuIGhhc2ggdmFsdWUgKi8KKwkJcmV0dmFsID0KKwkJICAgIGxpbmVhcl9zZWFyY2hfaW5fZGlyX2l0ZW0oJmtleV90b19zZWFyY2gsIGRlLCBuYW1lLAorCQkJCQkgICAgICBuYW1lbGVuKTsKKwkJaWYgKHJldHZhbCAhPSBHT1RPX1BSRVZJT1VTX0lURU0pIHsKKwkJCS8qIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2NhbiBkaXJlY3RvcnkgYW55bW9yZS4gR2l2ZW4gZW50cnkgZm91bmQgb3IgZG9lcyBub3QgZXhpc3QgKi8KKwkJCXBhdGhfdG9fZW50cnktPnBvc19pbl9pdGVtID0gZGUtPmRlX2VudHJ5X251bTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKworCQkvKiB0aGVyZSBpcyBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnkgYW5kIGdpdmVuIGVudHJ5IGNhbiBiZSB0aGVyZSAqLworCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5X3RvX3NlYXJjaCwKKwkJCQkgICAgIGxlX2loX2tfb2Zmc2V0KGRlLT5kZV9paCkgLSAxKTsKKwkJcGF0aHJlbHNlKHBhdGhfdG9fZW50cnkpOworCisJfQkJCS8qIHdoaWxlICgxKSAqLworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworCUlOSVRJQUxJWkVfUEFUSChwYXRoX3RvX2VudHJ5KTsKKworCWlmIChSRUlTRVJGU19NQVhfTkFNRShkaXItPmlfc2ItPnNfYmxvY2tzaXplKSA8IGRlbnRyeS0+ZF9uYW1lLmxlbikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKKwlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSZwYXRoX3RvX2VudHJ5LCAmZGUpOworCXBhdGhyZWxzZSgmcGF0aF90b19lbnRyeSk7CisJaWYgKHJldHZhbCA9PSBOQU1FX0ZPVU5EKSB7CisJCS8qIEhpZGUgdGhlIC5yZWlzZXJmc19wcml2IGRpcmVjdG9yeSAqLworCQlpZiAocmVpc2VyZnNfeGF0dHJzKGRpci0+aV9zYikgJiYKKwkJICAgICFvbGRfZm9ybWF0X29ubHkoZGlyLT5pX3NiKSAmJgorCQkgICAgUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290ICYmCisJCSAgICBSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKKwkJICAgIGRlLmRlX29iamVjdGlkID09CisJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZCisJCQkJKFJFSVNFUkZTX1NCKGRpci0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPgorCQkJCWtfb2JqZWN0aWQpKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisKKwkJaW5vZGUgPQorCQkgICAgcmVpc2VyZnNfaWdldChkaXItPmlfc2IsIChzdHJ1Y3QgY3B1X2tleSAqKSYoZGUuZGVfZGlyX2lkKSk7CisJCWlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgeworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJfQorCisJCS8qIFByb3BvZ2F0ZSB0aGUgcHJpdl9vYmplY3QgZmxhZyBzbyB3ZSBrbm93IHdlJ3JlIGluIHRoZSBwcml2IHRyZWUgKi8KKwkJaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGRpcikpCisJCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoaW5vZGUpOworCX0KKwlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKIAlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInphbS03MDAxOiBpbyBlcnJvciBpbiAlcyIsCi0JCQkgICAgICBfX0ZVTkNUSU9OX18pOwotCSAgICByZXR1cm4gSU9fRVJST1I7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIAotCS8qIGNvbXBhcmUgbmFtZXMgZm9yIGFsbCBlbnRyaWVzIGhhdmluZyBnaXZlbiBoYXNoIHZhbHVlICovCi0JcmV0dmFsID0gbGluZWFyX3NlYXJjaF9pbl9kaXJfaXRlbSAoJmtleV90b19zZWFyY2gsIGRlLCBuYW1lLCBuYW1lbGVuKTsKLQlpZiAocmV0dmFsICE9IEdPVE9fUFJFVklPVVNfSVRFTSkgewotCSAgICAvKiB0aGVyZSBpcyBubyBuZWVkIHRvIHNjYW4gZGlyZWN0b3J5IGFueW1vcmUuIEdpdmVuIGVudHJ5IGZvdW5kIG9yIGRvZXMgbm90IGV4aXN0ICovCi0JICAgIHBhdGhfdG9fZW50cnktPnBvc19pbl9pdGVtID0gZGUtPmRlX2VudHJ5X251bTsKLQkgICAgcmV0dXJuIHJldHZhbDsKLQl9CisJaWYgKGlub2RlKQorCQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiAKLQkvKiB0aGVyZSBpcyBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnkgYW5kIGdpdmVuIGVudHJ5IGNhbiBiZSB0aGVyZSAqLwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgma2V5X3RvX3NlYXJjaCwgbGVfaWhfa19vZmZzZXQgKGRlLT5kZV9paCkgLSAxKTsKLQlwYXRocmVsc2UgKHBhdGhfdG9fZW50cnkpOwotCi0gICAgfSAvKiB3aGlsZSAoMSkgKi8KKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqIHJlaXNlcmZzX2xvb2t1cCAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7Ci0KLSAgICBpZiAoUkVJU0VSRlNfTUFYX05BTUUgKGRpci0+aV9zYi0+c19ibG9ja3NpemUpIDwgZGVudHJ5LT5kX25hbWUubGVuKQotCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwotCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOwotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0gICAgcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotICAgIGlmIChyZXR2YWwgPT0gTkFNRV9GT1VORCkgewotICAgICAgICAvKiBIaWRlIHRoZSAucmVpc2VyZnNfcHJpdiBkaXJlY3RvcnkgKi8KLQlpZiAocmVpc2VyZnNfeGF0dHJzIChkaXItPmlfc2IpICYmCi0JICAgICFvbGRfZm9ybWF0X29ubHkoZGlyLT5pX3NiKSAmJgotICAgICAgICAgICAgUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290ICYmCi0gICAgICAgICAgICBSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKLQkgICAgZGUuZGVfb2JqZWN0aWQgPT0gbGUzMl90b19jcHUgKElOT0RFX1BLRVkoUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+a19vYmplY3RpZCkpIHsKLQkgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoZGlyLT5pX3NiKTsKLQkgIHJldHVybiBFUlJfUFRSICgtRUFDQ0VTKTsKLQl9Ci0KLQlpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKGRpci0+aV9zYiwgKHN0cnVjdCBjcHVfa2V5ICopJihkZS5kZV9kaXJfaWQpKTsKLQlpZiAoIWlub2RlIHx8IElTX0VSUihpbm9kZSkpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0JICAgIHJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotICAgICAgICB9Ci0KLQkvKiBQcm9wb2dhdGUgdGhlIHByaXZfb2JqZWN0IGZsYWcgc28gd2Uga25vdyB3ZSdyZSBpbiB0aGUgcHJpdiB0cmVlICovCi0JaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkaXIpKQotCSAgICByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUgKGlub2RlKTsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgaWYgKCByZXR2YWwgPT0gSU9fRVJST1IgKSB7Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTyk7Ci0gICAgfQotCi0gICAgaWYgKGlub2RlKQotCSAgICByZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7Ci0gICAgCi0gICAgZF9hZGQoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQogLyogCiAqKiBsb29rcyB1cCB0aGUgZGVudHJ5IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciBjaGlsZC4KICoqIHRha2VuIGZyb20gZXh0Ml9nZXRfcGFyZW50CiAqLwogc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKIHsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7Ci0gICAgc3RydWN0IGRlbnRyeSAqcGFyZW50OwotICAgIHN0cnVjdCBpbm9kZSAqZGlyID0gY2hpbGQtPmRfaW5vZGUgOworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aF90b19lbnRyeSk7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqZGlyID0gY2hpbGQtPmRfaW5vZGU7CiAKKwlpZiAoZGlyLT5pX25saW5rID09IDApIHsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJfQorCWRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CiAKLSAgICBpZiAoZGlyLT5pX25saW5rID09IDApIHsKLQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLSAgICB9Ci0gICAgZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKLQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsICIuLiIsIDIsICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotICAgIGlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCkgeworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgIi4uIiwgMiwgJnBhdGhfdG9fZW50cnksICZkZSk7CisJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKwlpbm9kZSA9IHJlaXNlcmZzX2lnZXQoZGlyLT5pX3NiLCAoc3RydWN0IGNwdV9rZXkgKikmKGRlLmRlX2Rpcl9pZCkpOwogCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotICAgIH0KLSAgICBpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKGRpci0+aV9zYiwgKHN0cnVjdCBjcHVfa2V5ICopJihkZS5kZV9kaXJfaWQpKTsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKIAotICAgIGlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgewotCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotICAgIH0KLSAgICBwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwotICAgIGlmICghcGFyZW50KSB7Ci0JaXB1dChpbm9kZSk7Ci0JcGFyZW50ID0gRVJSX1BUUigtRU5PTUVNKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmVudDsKKwlpZiAoIWlub2RlIHx8IElTX0VSUihpbm9kZSkpIHsKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJfQorCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJldHVybiBwYXJlbnQ7CiB9CiAKLQogLyogYWRkIGVudHJ5IHRvIHRoZSBkaXJlY3RvcnkgKGVudHJ5IGNhbiBiZSBoaWRkZW4pLiAKIAogaW5zZXJ0IGRlZmluaXRpb24gb2Ygd2hlbiBoaWRkZW4gZGlyZWN0b3JpZXMgYXJlIHVzZWQgaGVyZSAtSGFucwogCiAgRG9lcyBub3QgbWFyayBkaXIgICBpbm9kZSBkaXJ0eSwgZG8gaXQgYWZ0ZXIgc3VjY2Vzc2VzZnVsbCBjYWxsIHRvIGl0ICovCiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfYWRkX2VudHJ5IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbiwgc3RydWN0IGlub2RlICogaW5vZGUsCi0JCQkgICAgICAgaW50IHZpc2libGUpCitzdGF0aWMgaW50IHJlaXNlcmZzX2FkZF9lbnRyeShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB2aXNpYmxlKQogewotICAgIHN0cnVjdCBjcHVfa2V5IGVudHJ5X2tleTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7Ci0gICAgaW50IGJpdF9zdHJpbmcgW01BWF9HRU5FUkFUSU9OX05VTUJFUiAvIChzaXplb2YoaW50KSAqIDgpICsgMV07Ci0gICAgaW50IGdlbl9udW1iZXI7Ci0gICAgY2hhciBzbWFsbF9idWZbMzIrREVIX1NJWkVdIDsgLyogNDggYnl0ZXMgbm93IGFuZCB3ZSBhdm9pZCBrbWFsbG9jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2UgY3JlYXRlIGZpbGUgd2l0aCBzaG9ydCBuYW1lICovCi0gICAgY2hhciAqIGJ1ZmZlcjsKLSAgICBpbnQgYnVmbGVuLCBwYXN0ZV9zaXplOwotICAgIGludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkgZW50cnlfa2V5OworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJaW50IGJpdF9zdHJpbmdbTUFYX0dFTkVSQVRJT05fTlVNQkVSIC8gKHNpemVvZihpbnQpICogOCkgKyAxXTsKKwlpbnQgZ2VuX251bWJlcjsKKwljaGFyIHNtYWxsX2J1ZlszMiArIERFSF9TSVpFXTsJLyogNDggYnl0ZXMgbm93IGFuZCB3ZSBhdm9pZCBrbWFsbG9jCisJCQkJCSAgIGlmIHdlIGNyZWF0ZSBmaWxlIHdpdGggc2hvcnQgbmFtZSAqLworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgYnVmbGVuLCBwYXN0ZV9zaXplOworCWludCByZXR2YWw7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICAvKiBjYW5ub3QgYWxsb3cgaXRlbXMgdG8gYmUgYWRkZWQgaW50byBhIGJ1c3kgZGVsZXRlZCBkaXJlY3RvcnkgKi8KLSAgICBpZiAoIW5hbWVsZW4pCi0JcmV0dXJuIC1FSU5WQUw7CisJLyogY2Fubm90IGFsbG93IGl0ZW1zIHRvIGJlIGFkZGVkIGludG8gYSBidXN5IGRlbGV0ZWQgZGlyZWN0b3J5ICovCisJaWYgKCFuYW1lbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgIGlmIChuYW1lbGVuID4gUkVJU0VSRlNfTUFYX05BTUUgKGRpci0+aV9zYi0+c19ibG9ja3NpemUpKQotCXJldHVybiAtRU5BTUVUT09MT05HOworCWlmIChuYW1lbGVuID4gUkVJU0VSRlNfTUFYX05BTUUoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpCisJCXJldHVybiAtRU5BTUVUT09MT05HOwogCi0gICAgLyogZWFjaCBlbnRyeSBoYXMgdW5pcXVlIGtleS4gY29tcG9zZSBpdCAqLwotICAgIG1ha2VfY3B1X2tleSAoJmVudHJ5X2tleSwgZGlyLCAKLQkJICBnZXRfdGhpcmRfY29tcG9uZW50IChkaXItPmlfc2IsIG5hbWUsIG5hbWVsZW4pLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkvKiBlYWNoIGVudHJ5IGhhcyB1bmlxdWUga2V5LiBjb21wb3NlIGl0ICovCisJbWFrZV9jcHVfa2V5KCZlbnRyeV9rZXksIGRpciwKKwkJICAgICBnZXRfdGhpcmRfY29tcG9uZW50KGRpci0+aV9zYiwgbmFtZSwgbmFtZWxlbiksCisJCSAgICAgVFlQRV9ESVJFTlRSWSwgMyk7CiAKLSAgICAvKiBnZXQgbWVtb3J5IGZvciBjb21wb3NpbmcgdGhlIGVudHJ5ICovCi0gICAgYnVmbGVuID0gREVIX1NJWkUgKyBST1VORF9VUCAobmFtZWxlbik7Ci0gICAgaWYgKGJ1ZmxlbiA+IHNpemVvZiAoc21hbGxfYnVmKSkgewotCWJ1ZmZlciA9IHJlaXNlcmZzX2ttYWxsb2MgKGJ1ZmxlbiwgR0ZQX05PRlMsIGRpci0+aV9zYik7Ci0JaWYgKGJ1ZmZlciA9PSAwKQotCSAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9IGVsc2UKLQlidWZmZXIgPSBzbWFsbF9idWY7CisJLyogZ2V0IG1lbW9yeSBmb3IgY29tcG9zaW5nIHRoZSBlbnRyeSAqLworCWJ1ZmxlbiA9IERFSF9TSVpFICsgUk9VTkRfVVAobmFtZWxlbik7CisJaWYgKGJ1ZmxlbiA+IHNpemVvZihzbWFsbF9idWYpKSB7CisJCWJ1ZmZlciA9IHJlaXNlcmZzX2ttYWxsb2MoYnVmbGVuLCBHRlBfTk9GUywgZGlyLT5pX3NiKTsKKwkJaWYgKGJ1ZmZlciA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlCisJCWJ1ZmZlciA9IHNtYWxsX2J1ZjsKIAotICAgIHBhc3RlX3NpemUgPSAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRpcikgPT0gU1RBVF9EQVRBX1YxKSA/IChERUhfU0laRSArIG5hbWVsZW4pIDogYnVmbGVuOworCXBhc3RlX3NpemUgPQorCSAgICAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGlyKSA9PQorCSAgICAgU1RBVF9EQVRBX1YxKSA/IChERUhfU0laRSArIG5hbWVsZW4pIDogYnVmbGVuOwogCi0gICAgLyogZmlsbCBidWZmZXIgOiBkaXJlY3RvcnkgZW50cnkgaGVhZCwgbmFtZVssIGRpciBvYmplY3RpZCB8ICwgc3RhdCBkYXRhIHwgLHN0YXQgZGF0YSwgZGlyIG9iamVjdGlkIF0gKi8KLSAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilidWZmZXI7Ci0gICAgZGVoLT5kZWhfbG9jYXRpb24gPSAwOyAvKiBKRE0gRW5kaWFuIHNhZmUgaWYgMCAqLwotICAgIHB1dF9kZWhfb2Zmc2V0KCBkZWgsIGNwdV9rZXlfa19vZmZzZXQoICZlbnRyeV9rZXkgKSApOwotICAgIGRlaC0+ZGVoX3N0YXRlID0gMDsgLyogSkRNIEVuZGlhbiBzYWZlIGlmIDAgKi8KLSAgICAvKiBwdXQga2V5IChpbm8gYW5hbG9nKSB0byBkZSAqLwotICAgIGRlaC0+ZGVoX2Rpcl9pZCA9IElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQ7IC8qIHNhZmU6IGtfZGlyX2lkIGlzIGxlICovCi0gICAgZGVoLT5kZWhfb2JqZWN0aWQgPSBJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQ7IC8qIHNhZmU6IGtfb2JqZWN0aWQgaXMgbGUgKi8KKwkvKiBmaWxsIGJ1ZmZlciA6IGRpcmVjdG9yeSBlbnRyeSBoZWFkLCBuYW1lWywgZGlyIG9iamVjdGlkIHwgLCBzdGF0IGRhdGEgfCAsc3RhdCBkYXRhLCBkaXIgb2JqZWN0aWQgXSAqLworCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJ1ZmZlcjsKKwlkZWgtPmRlaF9sb2NhdGlvbiA9IDA7CS8qIEpETSBFbmRpYW4gc2FmZSBpZiAwICovCisJcHV0X2RlaF9vZmZzZXQoZGVoLCBjcHVfa2V5X2tfb2Zmc2V0KCZlbnRyeV9rZXkpKTsKKwlkZWgtPmRlaF9zdGF0ZSA9IDA7CS8qIEpETSBFbmRpYW4gc2FmZSBpZiAwICovCisJLyogcHV0IGtleSAoaW5vIGFuYWxvZykgdG8gZGUgKi8KKwlkZWgtPmRlaF9kaXJfaWQgPSBJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQ7CS8qIHNhZmU6IGtfZGlyX2lkIGlzIGxlICovCisJZGVoLT5kZWhfb2JqZWN0aWQgPSBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZDsJLyogc2FmZToga19vYmplY3RpZCBpcyBsZSAqLwogCi0gICAgLyogY29weSBuYW1lICovCi0gICAgbWVtY3B5ICgoY2hhciAqKShkZWggKyAxKSwgbmFtZSwgbmFtZWxlbik7Ci0gICAgLyogcGFkZCBieSAwcyB0byB0aGUgNCBieXRlIGJvdW5kYXJ5ICovCi0gICAgcGFkZF9pdGVtICgoY2hhciAqKShkZWggKyAxKSwgUk9VTkRfVVAgKG5hbWVsZW4pLCBuYW1lbGVuKTsKKwkvKiBjb3B5IG5hbWUgKi8KKwltZW1jcHkoKGNoYXIgKikoZGVoICsgMSksIG5hbWUsIG5hbWVsZW4pOworCS8qIHBhZGQgYnkgMHMgdG8gdGhlIDQgYnl0ZSBib3VuZGFyeSAqLworCXBhZGRfaXRlbSgoY2hhciAqKShkZWggKyAxKSwgUk9VTkRfVVAobmFtZWxlbiksIG5hbWVsZW4pOwogCi0gICAgLyogZW50cnkgaXMgcmVhZHkgdG8gYmUgcGFzdGVkIGludG8gdHJlZSwgc2V0ICd2aXNpYmlsaXR5JyBhbmQgJ3N0YXQgZGF0YSBpbiBlbnRyeScgYXR0cmlidXRlcyAqLwotICAgIG1hcmtfZGVfd2l0aG91dF9zZCAoZGVoKTsKLSAgICB2aXNpYmxlID8gbWFya19kZV92aXNpYmxlIChkZWgpIDogbWFya19kZV9oaWRkZW4gKGRlaCk7CisJLyogZW50cnkgaXMgcmVhZHkgdG8gYmUgcGFzdGVkIGludG8gdHJlZSwgc2V0ICd2aXNpYmlsaXR5JyBhbmQgJ3N0YXQgZGF0YSBpbiBlbnRyeScgYXR0cmlidXRlcyAqLworCW1hcmtfZGVfd2l0aG91dF9zZChkZWgpOworCXZpc2libGUgPyBtYXJrX2RlX3Zpc2libGUoZGVoKSA6IG1hcmtfZGVfaGlkZGVuKGRlaCk7CiAKLSAgICAvKiBmaW5kIHRoZSBwcm9wZXIgcGxhY2UgZm9yIHRoZSBuZXcgZW50cnkgKi8KLSAgICBtZW1zZXQgKGJpdF9zdHJpbmcsIDAsIHNpemVvZiAoYml0X3N0cmluZykpOwotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IChjaGFyICopYml0X3N0cmluZzsKLSAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsIG5hbWUsIG5hbWVsZW4sICZwYXRoLCAmZGUpOwotICAgIGlmKCByZXR2YWwgIT0gTkFNRV9OT1RfRk9VTkQgKSB7CisJLyogZmluZCB0aGUgcHJvcGVyIHBsYWNlIGZvciB0aGUgbmV3IGVudHJ5ICovCisJbWVtc2V0KGJpdF9zdHJpbmcsIDAsIHNpemVvZihiaXRfc3RyaW5nKSk7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gKGNoYXIgKiliaXRfc3RyaW5nOworCXJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkoZGlyLCBuYW1lLCBuYW1lbGVuLCAmcGF0aCwgJmRlKTsKKwlpZiAocmV0dmFsICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisJCWlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCQkJcmVpc2VyZnNfa2ZyZWUoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoZGlyLT5pX3NiLAorCQkJCQkgInphbS03MDAyOiVzOiBcInJlaXNlcmZzX2ZpbmRfZW50cnlcIiAiCisJCQkJCSAiaGFzIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgKCVkKSIsCisJCQkJCSBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCX0KKworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlnZW5fbnVtYmVyID0KKwkgICAgZmluZF9maXJzdF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKWJpdF9zdHJpbmcsCisJCQkJTUFYX0dFTkVSQVRJT05fTlVNQkVSICsgMSk7CisJaWYgKGdlbl9udW1iZXIgPiBNQVhfR0VORVJBVElPTl9OVU1CRVIpIHsKKwkJLyogdGhlcmUgaXMgbm8gZnJlZSBnZW5lcmF0aW9uIG51bWJlciAqLworCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwKKwkJCQkgInJlaXNlcmZzX2FkZF9lbnRyeTogQ29uZ3JhdHVsYXRpb25zISB3ZSBoYXZlIGdvdCBoYXNoIGZ1bmN0aW9uIHNjcmV3ZWQgdXAiKTsKKwkJaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCisJCQlyZWlzZXJmc19rZnJlZShidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogYWRqdXN0IG9mZnNldCBvZiBkaXJlY3RvcnkgZW5ydHkgKi8KKwlwdXRfZGVoX29mZnNldChkZWgsIFNFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCksIGdlbl9udW1iZXIpKTsKKwlzZXRfY3B1X2tleV9rX29mZnNldCgmZW50cnlfa2V5LCBkZWhfb2Zmc2V0KGRlaCkpOworCisJLyogdXBkYXRlIG1heC1oYXNoLWNvbGxpc2lvbnMgY291bnRlciBpbiByZWlzZXJmc19zYl9pbmZvICovCisJUFJPQ19JTkZPX01BWCh0aC0+dF9zdXBlciwgbWF4X2hhc2hfY29sbGlzaW9ucywgZ2VuX251bWJlcik7CisKKwlpZiAoZ2VuX251bWJlciAhPSAwKSB7CS8qIHdlIG5lZWQgdG8gcmUtc2VhcmNoIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50ICovCisJCWlmIChzZWFyY2hfYnlfZW50cnlfa2V5KGRpci0+aV9zYiwgJmVudHJ5X2tleSwgJnBhdGgsICZkZSkgIT0KKwkJICAgIE5BTUVfTk9UX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwKKwkJCQkJICJ2cy03MDMyOiByZWlzZXJmc19hZGRfZW50cnk6ICIKKwkJCQkJICJlbnRyeSB3aXRoIHRoaXMga2V5ICglSykgYWxyZWFkeSBleGlzdHMiLAorCQkJCQkgJmVudHJ5X2tleSk7CisKKwkJCWlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCQkJCXJlaXNlcmZzX2tmcmVlKGJ1ZmZlciwgYnVmbGVuLCBkaXItPmlfc2IpOworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiBwZXJmb3JtIHRoZSBpbnNlcnRpb24gb2YgdGhlIGVudHJ5IHRoYXQgd2UgaGF2ZSBwcmVwYXJlZCAqLworCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSh0aCwgJnBhdGgsICZlbnRyeV9rZXksIGRpciwgYnVmZmVyLAorCQkJCSAgICAgcGFzdGVfc2l6ZSk7CiAJaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCi0JICAgIHJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLQlwYXRocmVsc2UgKCZwYXRoKTsKLQotCWlmICggcmV0dmFsID09IElPX0VSUk9SICkgewotCSAgICByZXR1cm4gLUVJTzsKKwkJcmVpc2VyZnNfa2ZyZWUoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisJaWYgKHJldHZhbCkgeworCQlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLSAgICAgICAgaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInphbS03MDAyOiVzOiBcInJlaXNlcmZzX2ZpbmRfZW50cnlcIiAiCi0JCQkgICAgICAiaGFzIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgKCVkKSIsCi0JCQkgICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7Ci0gICAgICAgfQorCWRpci0+aV9zaXplICs9IHBhc3RlX3NpemU7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgdmlzaWJsZSkKKwkJLy8gcmVpc2VyZnNfbWtkaXIgb3IgcmVpc2VyZnNfcmVuYW1lIHdpbGwgZG8gdGhhdCBieSBpdHNlbGYKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBkaXIpOwogCi0JcmV0dXJuIC1FRVhJU1Q7Ci0gICAgfQotCi0gICAgZ2VuX251bWJlciA9IGZpbmRfZmlyc3RfemVyb19iaXQgKCh1bnNpZ25lZCBsb25nICopYml0X3N0cmluZywgTUFYX0dFTkVSQVRJT05fTlVNQkVSICsgMSk7Ci0gICAgaWYgKGdlbl9udW1iZXIgPiBNQVhfR0VORVJBVElPTl9OVU1CRVIpIHsKLSAgICAgIC8qIHRoZXJlIGlzIG5vIGZyZWUgZ2VuZXJhdGlvbiBudW1iZXIgKi8KLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInJlaXNlcmZzX2FkZF9lbnRyeTogQ29uZ3JhdHVsYXRpb25zISB3ZSBoYXZlIGdvdCBoYXNoIGZ1bmN0aW9uIHNjcmV3ZWQgdXAiKTsKLSAgICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQotICAgICAgICAgIHJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLSAgICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0gICAgLyogYWRqdXN0IG9mZnNldCBvZiBkaXJlY3RvcnkgZW5ydHkgKi8KLSAgICBwdXRfZGVoX29mZnNldChkZWgsIFNFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCksIGdlbl9udW1iZXIpKTsKLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJmVudHJ5X2tleSwgZGVoX29mZnNldChkZWgpKTsKLSAKLSAgICAvKiB1cGRhdGUgbWF4LWhhc2gtY29sbGlzaW9ucyBjb3VudGVyIGluIHJlaXNlcmZzX3NiX2luZm8gKi8KLSAgICBQUk9DX0lORk9fTUFYKCB0aCAtPiB0X3N1cGVyLCBtYXhfaGFzaF9jb2xsaXNpb25zLCBnZW5fbnVtYmVyICk7Ci0gCQkgIAotICAgIGlmIChnZW5fbnVtYmVyICE9IDApIHsJLyogd2UgbmVlZCB0byByZS1zZWFyY2ggZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQgKi8KLSAgICAgIGlmIChzZWFyY2hfYnlfZW50cnlfa2V5IChkaXItPmlfc2IsICZlbnRyeV9rZXksICZwYXRoLCAmZGUpICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChkaXItPmlfc2IsICJ2cy03MDMyOiByZWlzZXJmc19hZGRfZW50cnk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnRyeSB3aXRoIHRoaXMga2V5ICglSykgYWxyZWFkeSBleGlzdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X2tleSk7Ci0KLQkgICAgaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCi0JCXJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLQkgICAgcGF0aHJlbHNlICgmcGF0aCk7Ci0JICAgIHJldHVybiAtRUJVU1k7Ci0JfQotICAgIH0KLSAgCi0gICAgLyogcGVyZm9ybSB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBlbnRyeSB0aGF0IHdlIGhhdmUgcHJlcGFyZWQgKi8KLSAgICByZXR2YWwgPSByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0gKHRoLCAmcGF0aCwgJmVudHJ5X2tleSwgZGlyLCBidWZmZXIsIHBhc3RlX3NpemUpOwotICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQotCXJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0JcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotCXJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgZGlyLT5pX3NpemUgKz0gcGFzdGVfc2l6ZTsKLSAgICBkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIGlmICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgJiYgdmlzaWJsZSkKLQkvLyByZWlzZXJmc19ta2RpciBvciByZWlzZXJmc19yZW5hbWUgd2lsbCBkbyB0aGF0IGJ5IGl0c2VsZgotCXJlaXNlcmZzX3VwZGF0ZV9zZCAodGgsIGRpcik7Ci0KLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHF1b3RhIHV0aWxpdHkgZnVuY3Rpb24sIGNhbGwgaWYgeW91J3ZlIGhhZCB0byBhYm9ydCBhZnRlciBjYWxsaW5nCkBAIC01NDgsMTIgKzU3MSwxMyBAQAogKiogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gaW5vZGVzIHRoYXQgZG8gbm90IGhhdmUgc3RhdCBkYXRhCiAqKiBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlIHlldC4KICovCi1zdGF0aWMgaW50IGRyb3BfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICBEUVVPVF9EUk9QKGlub2RlKTsKLSAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSkgOwotICAgIGlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKLSAgICBpcHV0KGlub2RlKSA7Ci0gICAgcmV0dXJuIDAgOworc3RhdGljIGludCBkcm9wX25ld19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCURRVU9UX0RST1AoaW5vZGUpOworCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBkb2VzIHNldHVwIGZvciByZWlzZXJmc19uZXdfaW5vZGUuICAKQEAgLTU2MSw5MDUgKzU4NSw5NjggQEAKICoqIG91dHNpZGUgb2YgYSB0cmFuc2FjdGlvbiwgc28gd2UgaGFkIHRvIHB1bGwgc29tZSBiaXRzIG9mCiAqKiByZWlzZXJmc19uZXdfaW5vZGUgb3V0IGludG8gdGhpcyBmdW5jLgogKi8KLXN0YXRpYyBpbnQgbmV3X2lub2RlX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsIGludCBtb2RlKSB7CitzdGF0aWMgaW50IG5ld19pbm9kZV9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSkKK3sKIAotICAgIC8qIHRoZSBxdW90YSBpbml0IGNhbGxzIGhhdmUgdG8ga25vdyB3aG8gdG8gY2hhcmdlIHRoZSBxdW90YSB0bywgc28KLSAgICAqKiB3ZSBoYXZlIHRvIHNldCB1aWQgYW5kIGdpZCBoZXJlCi0gICAgKi8KLSAgICBpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKLSAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkvKiB0aGUgcXVvdGEgaW5pdCBjYWxscyBoYXZlIHRvIGtub3cgd2hvIHRvIGNoYXJnZSB0aGUgcXVvdGEgdG8sIHNvCisJICoqIHdlIGhhdmUgdG8gc2V0IHVpZCBhbmQgZ2lkIGhlcmUKKwkgKi8KKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAotICAgIGlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKLSAgICAgICAgaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKLSAgICAgICAgaWYgKFNfSVNESVIobW9kZSkpCi0gICAgICAgICAgICBpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0gICAgfQotICAgIERRVU9UX0lOSVQoaW5vZGUpOwotICAgIHJldHVybiAwIDsKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZSB7CisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCX0KKwlEUVVPVF9JTklUKGlub2RlKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWlzZXJmc19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKLQkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgaW50IHJlaXNlcmZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBsb2NrZWQ7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCS8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSoocXVvdGFzIGZvciBuZXcgaW5vZGUgKyB1cGRhdGUgb2YgcXVvdGEgZm9yIGRpcmVjdG9yeSBvd25lcikgKi8KKwlpbnQgamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsKKwkgICAgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpICsKKwkJIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBsb2NrZWQ7CiAKLSAgICBpZiAoIShpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpKSkgewotCXJldHVybiAtRU5PTUVNIDsKLSAgICB9Ci0gICAgbmV3X2lub2RlX2luaXQoaW5vZGUsIGRpciwgbW9kZSk7CisJaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOwogCi0gICAgbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKGRpcik7CisJbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2woZGlyKTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CiAKLSAgICBpZiAobG9ja2VkKQotICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKwlpZiAobG9ja2VkKQorCQlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyhkaXItPmlfc2IpOwogCi0gICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIGRyb3BfbmV3X2lub2RlIChpbm9kZSk7Ci0gICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9CisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwlpZiAocmV0dmFsKSB7CisJCWRyb3BfbmV3X2lub2RlKGlub2RlKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KIAotICAgIHJldHZhbCA9IHJlaXNlcmZzX25ld19pbm9kZSAoJnRoLCBkaXIsIG1vZGUsIE5VTEwsIDAvKmlfc2l6ZSovLCBkZW50cnksIGlub2RlKTsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF9mYWlsZWQ7Ci0JCi0gICAgaWYgKGxvY2tlZCkgewotICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOwotICAgICAgICBsb2NrZWQgPSAwOwotICAgIH0KKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19uZXdfaW5vZGUoJnRoLCBkaXIsIG1vZGUsIE5VTEwsIDAgLyppX3NpemUgKi8gLCBkZW50cnksCisJCQkgICAgICAgaW5vZGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2ZhaWxlZDsKIAotICAgIGlub2RlLT5pX29wID0gJnJlaXNlcmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLSAgICBpbm9kZS0+aV9mb3AgPSAmcmVpc2VyZnNfZmlsZV9vcGVyYXRpb25zOwotICAgIGlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyA7CisJaWYgKGxvY2tlZCkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CisJCWxvY2tlZCA9IDA7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAKLQkJCQlpbm9kZSwgMS8qdmlzaWJsZSovKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIGludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmstLTsKLQlyZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgIHJldHZhbCA9IGVycjsKLQlpcHV0IChpbm9kZSk7Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwogCi0gICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfYWRkX2VudHJ5KCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CisJaWYgKHJldHZhbCkgeworCQlpbnQgZXJyOworCQlpbm9kZS0+aV9ubGluay0tOworCQlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQlpZiAoZXJyKQorCQkJcmV0dmFsID0gZXJyOworCQlpcHV0KGlub2RlKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpOwogCi1vdXRfZmFpbGVkOgotICAgIGlmIChsb2NrZWQpCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCisgICAgICBvdXRfZmFpbGVkOgorCWlmIChsb2NrZWQpCisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMoZGlyLT5pX3NiKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCi0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfbWtub2QgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgcmRldikKK3N0YXRpYyBpbnQgcmVpc2VyZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkgIGRldl90IHJkZXYpCiB7Ci0gICAgaW50IHJldHZhbDsKLSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCi0gICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKStSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSk7Ci0gICAgaW50IGxvY2tlZDsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCisJaW50IGpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArCisJICAgIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKSArCisJCSBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSk7CisJaW50IGxvY2tlZDsKIAotICAgIGlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKLQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW5ld192YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKLQlyZXR1cm4gLUVOT01FTSA7Ci0gICAgfQotICAgIG5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOworCWlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwluZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKIAotICAgIGxvY2tlZCA9IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsIChkaXIpOworCWxvY2tlZCA9IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsKGRpcik7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOwogCi0gICAgaWYgKGxvY2tlZCkKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMgKGRpci0+aV9zYik7CisJaWYgKGxvY2tlZCkKKwkJcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoZGlyLT5pX3NiKTsKIAotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgTlVMTCwgMC8qaV9zaXplKi8sIGRlbnRyeSwgaW5vZGUpOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19uZXdfaW5vZGUoJnRoLCBkaXIsIG1vZGUsIE5VTEwsIDAgLyppX3NpemUgKi8gLCBkZW50cnksCisJCQkgICAgICAgaW5vZGUpOworCWlmIChyZXR2YWwpIHsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KIAotICAgIGlmIChsb2NrZWQpIHsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKLSAgICAgICAgbG9ja2VkID0gMDsKLSAgICB9CisJaWYgKGxvY2tlZCkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CisJCWxvY2tlZCA9IDA7CisJfQogCisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CiAKLSAgICBpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7Ci0gICAgaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KSA7CisJLy9GSVhNRTogbmVlZGVkIGZvciBibG9jayBhbmQgY2hhciBkZXZpY2VzIG9ubHkKKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CiAKLSAgICAvL0ZJWE1FOiBuZWVkZWQgZm9yIGJsb2NrIGFuZCBjaGFyIGRldmljZXMgb25seQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKTsKIAotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubGVuLCBpbm9kZSwgMSAvKnZpc2libGUgKi8gKTsKKwlpZiAocmV0dmFsKSB7CisJCWludCBlcnI7CisJCWlub2RlLT5pX25saW5rLS07CisJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAKLQkJCQkgaW5vZGUsIDEvKnZpc2libGUqLyk7Ci0gICAgaWYgKHJldHZhbCkgewotICAgICAgICBpbnQgZXJyOwotCWlub2RlLT5pX25saW5rLS07Ci0JcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKLQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgICAgIGlmIChlcnIpCi0JICAgIHJldHZhbCA9IGVycjsKLQlpcHV0IChpbm9kZSk7Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwogCi0gICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0KLW91dF9mYWlsZWQ6Ci0gICAgaWYgKGxvY2tlZCkKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0dmFsOworICAgICAgb3V0X2ZhaWxlZDoKKwlpZiAobG9ja2VkKQorCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJcmV0dXJuIHJldHZhbDsKIH0KIAotCi1zdGF0aWMgaW50IHJlaXNlcmZzX21rZGlyIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCitzdGF0aWMgaW50IHJlaXNlcmZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQogewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOwotICAgIGludCBsb2NrZWQ7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLworCWludCBqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKworCSAgICAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikgKworCQkgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOworCWludCBsb2NrZWQ7CiAKICNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi0gICAgLyogc2V0IGZsYWcgdGhhdCBuZXcgcGFja2luZyBsb2NhbGl0eSBjcmVhdGVkIGFuZCBuZXcgYmxvY2tzIGZvciB0aGUgY29udGVudCAgICAgKiBvZiB0aGF0IGRpcmVjdG9yeSBhcmUgbm90IGRpc3BsYWNlZCB5ZXQgKi8KLSAgICBSRUlTRVJGU19JKGRpciktPm5ld19wYWNraW5nX2xvY2FsaXR5ID0gMTsKKwkvKiBzZXQgZmxhZyB0aGF0IG5ldyBwYWNraW5nIGxvY2FsaXR5IGNyZWF0ZWQgYW5kIG5ldyBibG9ja3MgZm9yIHRoZSBjb250ZW50ICAgICAqIG9mIHRoYXQgZGlyZWN0b3J5IGFyZSBub3QgZGlzcGxhY2VkIHlldCAqLworCVJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkgPSAxOwogI2VuZGlmCi0gICAgbW9kZSA9IFNfSUZESVIgfCBtb2RlOwotICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7Ci0JcmV0dXJuIC1FTk9NRU0gOwotICAgIH0KLSAgICBuZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKKwltb2RlID0gU19JRkRJUiB8IG1vZGU7CisJaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOwogCi0gICAgbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKGRpcik7CisJbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2woZGlyKTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICBpZiAobG9ja2VkKQotICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJaWYgKGxvY2tlZCkKKwkJcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoZGlyLT5pX3NiKTsKIAotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCisJLyogaW5jIHRoZSBsaW5rIGNvdW50IG5vdywgc28gYW5vdGhlciB3cml0ZXIgZG9lc24ndCBvdmVyZmxvdyBpdCB3aGlsZQorCSAqKiB3ZSBzbGVlcCBsYXRlciBvbi4KKwkgKi8KKwlJTkNfRElSX0lOT0RFX05MSU5LKGRpcikKIAotICAgIC8qIGluYyB0aGUgbGluayBjb3VudCBub3csIHNvIGFub3RoZXIgd3JpdGVyIGRvZXNuJ3Qgb3ZlcmZsb3cgaXQgd2hpbGUKLSAgICAqKiB3ZSBzbGVlcCBsYXRlciBvbi4KLSAgICAqLwotICAgIElOQ19ESVJfSU5PREVfTkxJTksoZGlyKQorCSAgICByZXR2YWwgPSByZWlzZXJmc19uZXdfaW5vZGUoJnRoLCBkaXIsIG1vZGUsIE5VTEwgLypzeW1saW5rICovICwKKwkJCQkJb2xkX2Zvcm1hdF9vbmx5KGRpci0+aV9zYikgPworCQkJCQlFTVBUWV9ESVJfU0laRV9WMSA6IEVNUFRZX0RJUl9TSVpFLAorCQkJCQlkZW50cnksIGlub2RlKTsKKwlpZiAocmV0dmFsKSB7CisJCWRpci0+aV9ubGluay0tOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgTlVMTC8qc3ltbGluayovLAotCQkJCW9sZF9mb3JtYXRfb25seSAoZGlyLT5pX3NiKSA/IAotCQkJCUVNUFRZX0RJUl9TSVpFX1YxIDogRU1QVFlfRElSX1NJWkUsCi0JCQkJZGVudHJ5LCBpbm9kZSk7Ci0gICAgaWYgKHJldHZhbCkgewotCWRpci0+aV9ubGluay0tIDsKLQlnb3RvIG91dF9mYWlsZWQ7Ci0gICAgfQorCWlmIChsb2NrZWQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhkaXItPmlfc2IpOworCQlsb2NrZWQgPSAwOworCX0KIAotICAgIGlmIChsb2NrZWQpIHsKLQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOwotCWxvY2tlZCA9IDA7Ci0gICAgfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcik7CiAKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOwogCi0gICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0gICAgaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOworCS8vIG5vdGUsIF90aGlzXyBhZGRfZW50cnkgd2lsbCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQorCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX2FkZF9lbnRyeSgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxIC8qdmlzaWJsZSAqLyApOworCWlmIChyZXR2YWwpIHsKKwkJaW50IGVycjsKKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQlERUNfRElSX0lOT0RFX05MSU5LKGRpcik7CisJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCS8vIHRoZSBhYm92ZSBhZGRfZW50cnkgZGlkIG5vdCB1cGRhdGUgZGlyJ3Mgc3RhdCBkYXRhCisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgZGlyKTsKIAotICAgIC8vIG5vdGUsIF90aGlzXyBhZGRfZW50cnkgd2lsbCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQotICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgCi0JCQkJaW5vZGUsIDEvKnZpc2libGUqLyk7Ci0gICAgaWYgKHJldHZhbCkgewotCWludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOwotCURFQ19ESVJfSU5PREVfTkxJTksoZGlyKTsKLQlyZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLQlpZiAoZXJyKQotCSAgICByZXR2YWwgPSBlcnI7Ci0JaXB1dCAoaW5vZGUpOwotCWdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9Ci0KLSAgICAvLyB0aGUgYWJvdmUgYWRkX2VudHJ5IGRpZCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBkaXIpOwotCi0gICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci1vdXRfZmFpbGVkOgotICAgIGlmIChsb2NrZWQpCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICAvKiB3ZSBjYW4gY2hlYXQgYmVjYXVzZSBhbiBvbGQgZm9ybWF0IGRpciBjYW5ub3QgaGF2ZQotICAgICoqIEVNUFRZX0RJUl9TSVpFLCBhbmQgYSBuZXcgZm9ybWF0IGRpciBjYW5ub3QgaGF2ZQotICAgICoqIEVNUFRZX0RJUl9TSVpFX1YxLiAgU28sIGlmIHRoZSBpbm9kZSBpcyBlaXRoZXIgc2l6ZSwgCi0gICAgKiogcmVnYXJkbGVzcyBvZiBkaXNrIGZvcm1hdCB2ZXJzaW9uLCB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LgotICAgICovCi0gICAgaWYgKGlub2RlLT5pX3NpemUgIT0gRU1QVFlfRElSX1NJWkUgJiYKLSAgICAgICAgaW5vZGUtPmlfc2l6ZSAhPSBFTVBUWV9ESVJfU0laRV9WMSkgewotICAgICAgICByZXR1cm4gMCA7Ci0gICAgfQotICAgIHJldHVybiAxIDsKLX0KLQotc3RhdGljIGludCByZWlzZXJmc19ybWRpciAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0gICAgaW50IHJldHZhbCwgZXJyOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBqYmVnaW5fY291bnQ7IAotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKLQotCi0gICAgLyogd2Ugd2lsbCBiZSBkb2luZyAyIGJhbGFuY2luZ3MgYW5kIHVwZGF0ZSAyIHN0YXQgZGF0YSwgd2UgY2hhbmdlIHF1b3RhcwotICAgICAqIG9mIHRoZSBvd25lciBvZiB0aGUgZGlyZWN0b3J5IGFuZCBvZiB0aGUgb3duZXIgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0gICAgICogVGhlIHF1b3RhIHN0cnVjdHVyZSBpcyBwb3NzaWJseSBkZWxldGVkIG9ubHkgb24gbGFzdCBpcHV0ID0+IG91dHNpZGUKLSAgICAgKiBvZiB0aGlzIHRyYW5zYWN0aW9uICovCi0gICAgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiArIDQgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKTsKLQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF9ybWRpcjsKLQotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0gICAgaWYgKCAocmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoLCAmZGUpKSA9PSBOQU1FX05PVF9GT1VORCkgewotCXJldHZhbCA9IC1FTk9FTlQ7Ci0JZ290byBlbmRfcm1kaXI7Ci0gICAgfSBlbHNlIGlmICggcmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmV0dmFsID0gLUVJTzsKLQlnb3RvIGVuZF9ybWRpcjsKLSAgICB9Ci0KLSAgICBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKLQotICAgIGlmIChkZS5kZV9vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pIHsKLQkvLyBGSVhNRTogY29tcGFyZSBrZXkgb2YgYW4gb2JqZWN0IGFuZCBhIGtleSBmb3VuZCBpbiB0aGUKLQkvLyBlbnRyeQotCXJldHZhbCA9IC1FSU87Ci0JZ290byBlbmRfcm1kaXI7Ci0gICAgfQotICAgIGlmICghcmVpc2VyZnNfZW1wdHlfZGlyKGlub2RlKSkgewotCXJldHZhbCA9IC1FTk9URU1QVFk7Ci0JZ290byBlbmRfcm1kaXI7Ci0gICAgfQotCi0gICAgLyogY3V0IGVudHJ5IGZyb20gZGlyIGRpcmVjdG9yeSAqLwotICAgIHJldHZhbCA9IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKCZ0aCwgJnBhdGgsICYoZGUuZGVfZW50cnlfa2V5KSwgZGlyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBwYWdlICovIAotCQkJCSAgICAgMC8qbmV3IGZpbGUgc2l6ZSAtIG5vdCB1c2VkIGhlcmUqLyk7Ci0gICAgaWYgKHJldHZhbCA8IDApCi0JZ290byBlbmRfcm1kaXI7Ci0KLSAgICBpZiAoIGlub2RlLT5pX25saW5rICE9IDIgJiYgaW5vZGUtPmlfbmxpbmsgIT0gMSApCi0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICIlczogZW1wdHkgZGlyZWN0b3J5IGhhcyBubGluayAiCi0JCQkgICIhPSAyICglZCkiLCBfX0ZVTkNUSU9OX18sIGlub2RlLT5pX25saW5rKTsKLQotICAgIGlub2RlLT5pX25saW5rID0gMDsKLSAgICBpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKLQotICAgIERFQ19ESVJfSU5PREVfTkxJTksoZGlyKQotICAgIGRpci0+aV9zaXplIC09IChERUhfU0laRSArIGRlLmRlX2VudHJ5bGVuKTsKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgZGlyKTsKLQotICAgIC8qIHByZXZlbnQgZW1wdHkgZGlyZWN0b3J5IGZyb20gZ2V0dGluZyBsb3N0ICovCi0gICAgYWRkX3NhdmVfbGluayAoJnRoLCBpbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7Ci0KLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotb3V0X3JtZGlyOgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7Ci0JCi0gZW5kX3JtZGlyOgotICAgIC8qIHdlIG11c3QgcmVsZWFzZSBwYXRoLCBiZWNhdXNlIHdlIGRpZCBub3QgY2FsbAotICAgICAgIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0sIG9yIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZG9lcyBub3QKLSAgICAgICByZWxlYXNlIHBhdGggaWYgb3BlcmF0aW9uIHdhcyBub3QgY29tcGxldGUgKi8KLSAgICBwYXRocmVsc2UgKCZwYXRoKTsKLSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKLX0KLQotc3RhdGljIGludCByZWlzZXJmc191bmxpbmsgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQotewotICAgIGludCByZXR2YWwsIGVycjsKLSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGpiZWdpbl9jb3VudDsKLSAgICB1bnNpZ25lZCBsb25nIHNhdmVsaW5rOwotCi0gICAgaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0KLSAgICAvKiBpbiB0aGlzIHRyYW5zYWN0aW9uIHdlIGNhbiBiZSBkb2luZyBhdCBtYXggdHdvIGJhbGFuY2luZ3MgYW5kIHVwZGF0ZQotICAgICAqIHR3byBzdGF0IGRhdGFzLCB3ZSBjaGFuZ2UgcXVvdGFzIG9mIHRoZSBvd25lciBvZiB0aGUgZGlyZWN0b3J5IGFuZCBvZgotICAgICAqIHRoZSBvd25lciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4gVGhlIHF1b3RhIHN0cnVjdHVyZSBpcyBwb3NzaWJseQotICAgICAqIGRlbGV0ZWQgb25seSBvbiBpcHV0ID0+IG91dHNpZGUgb2YgdGhpcyB0cmFuc2FjdGlvbiAqLwotICAgIGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDIgKyA0ICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYik7Ci0KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgaWYgKHJldHZhbCkKLSAgICAgICAgZ290byBvdXRfdW5saW5rOwotCQotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0gICAgaWYgKCAocmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoLCAmZGUpKSA9PSBOQU1FX05PVF9GT1VORCkgewotCXJldHZhbCA9IC1FTk9FTlQ7Ci0JZ290byBlbmRfdW5saW5rOwotICAgIH0gZWxzZSBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmV0dmFsID0gLUVJTzsKLQlnb3RvIGVuZF91bmxpbms7Ci0gICAgfQotCi0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOwotCi0gICAgaWYgKGRlLmRlX29iamVjdGlkICE9IGlub2RlLT5pX2lubykgewotCS8vIEZJWE1FOiBjb21wYXJlIGtleSBvZiBhbiBvYmplY3QgYW5kIGEga2V5IGZvdW5kIGluIHRoZQotCS8vIGVudHJ5Ci0JcmV0dmFsID0gLUVJTzsKLQlnb3RvIGVuZF91bmxpbms7Ci0gICAgfQotICAKLSAgICBpZiAoIWlub2RlLT5pX25saW5rKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICIlczogZGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAiCi0JCQkgICIoJXM6JWx1KSwgJWQiLCBfX0ZVTkNUSU9OX18sCi0JCQkgIHJlaXNlcmZzX2JkZXZuYW1lIChpbm9kZS0+aV9zYiksIGlub2RlLT5pX2lubywKLQkJCSAgaW5vZGUtPmlfbmxpbmspOwotCWlub2RlLT5pX25saW5rID0gMTsKLSAgICB9Ci0KLSAgICBpbm9kZS0+aV9ubGluay0tOwotCi0gICAgLyoKLSAgICAgKiB3ZSBzY2hlZHVsZSBiZWZvcmUgZG9pbmcgdGhlIGFkZF9zYXZlX2xpbmsgY2FsbCwgc2F2ZSB0aGUgbGluawotICAgICAqIGNvdW50IHNvIHdlIGRvbid0IHJhY2UKLSAgICAgKi8KLSAgICBzYXZlbGluayA9IGlub2RlLT5pX25saW5rOwotCi0KLSAgICByZXR2YWwgPSByZWlzZXJmc19jdXRfZnJvbV9pdGVtICgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwgMCk7Ci0gICAgaWYgKHJldHZhbCA8IDApIHsKLQlpbm9kZS0+aV9ubGluaysrOwotCWdvdG8gZW5kX3VubGluazsKLSAgICB9Ci0gICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0KLSAgICBkaXItPmlfc2l6ZSAtPSAoZGUuZGVfZW50cnlsZW4gKyBERUhfU0laRSk7Ci0gICAgZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgZGlyKTsKLQotICAgIGlmICghc2F2ZWxpbmspCi0gICAgICAgLyogcHJldmVudCBmaWxlIGZyb20gZ2V0dGluZyBsb3N0ICovCi0gICAgICAgYWRkX3NhdmVfbGluayAoJnRoLCBpbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7Ci0KLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7Ci0KLSBlbmRfdW5saW5rOgotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Ci0gICAgaWYgKGVycikKLSAgICAgICAgcmV0dmFsID0gZXJyOwotb3V0X3VubGluazoKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHJlaXNlcmZzX3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqIHBhcmVudF9kaXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNvbnN0IGNoYXIgKiBzeW1uYW1lKQotewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgY2hhciAqIG5hbWU7Ci0gICAgaW50IGl0ZW1fbGVuOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBtb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKLSAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCi0gICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MocGFyZW50X2Rpci0+aV9zYikrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKHBhcmVudF9kaXItPmlfc2IpKTsKLQotICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKHBhcmVudF9kaXItPmlfc2IpKSkgewotCXJldHVybiAtRU5PTUVNIDsKLSAgICB9Ci0gICAgbmV3X2lub2RlX2luaXQoaW5vZGUsIHBhcmVudF9kaXIsIG1vZGUpOwotCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKLSAgICBpdGVtX2xlbiA9IFJPVU5EX1VQIChzdHJsZW4gKHN5bW5hbWUpKTsKLSAgICBpZiAoaXRlbV9sZW4gPiBNQVhfRElSRUNUX0lURU1fTEVOIChwYXJlbnRfZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKLQlyZXR2YWwgPSAgLUVOQU1FVE9PTE9ORzsKLQlkcm9wX25ld19pbm9kZShpbm9kZSk7Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLSAgCi0gICAgbmFtZSA9IHJlaXNlcmZzX2ttYWxsb2MgKGl0ZW1fbGVuLCBHRlBfTk9GUywgcGFyZW50X2Rpci0+aV9zYik7Ci0gICAgaWYgKCFuYW1lKSB7Ci0JZHJvcF9uZXdfaW5vZGUoaW5vZGUpOwotCXJldHZhbCA9ICAtRU5PTUVNOwotCWdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9Ci0gICAgbWVtY3B5IChuYW1lLCBzeW1uYW1lLCBzdHJsZW4gKHN5bW5hbWUpKTsKLSAgICBwYWRkX2l0ZW0gKG5hbWUsIGl0ZW1fbGVuLCBzdHJsZW4gKHN5bW5hbWUpKTsKLQotICAgIC8qIFdlIHdvdWxkIGluaGVyaXQgdGhlIGRlZmF1bHQgQUNMIGhlcmUsIGJ1dCBzeW1saW5rcyBkb24ndCBnZXQgQUNMcyAqLwotCi0gICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKLSAgICAgICAgcmVpc2VyZnNfa2ZyZWUgKG5hbWUsIGl0ZW1fbGVuLCBwYXJlbnRfZGlyLT5pX3NiKTsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KLQotICAgIHJldHZhbCA9IHJlaXNlcmZzX25ld19pbm9kZSAoJnRoLCBwYXJlbnRfZGlyLCBtb2RlLCBuYW1lLCBzdHJsZW4gKHN5bW5hbWUpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnRyeSwgaW5vZGUpOwotICAgIHJlaXNlcmZzX2tmcmVlIChuYW1lLCBpdGVtX2xlbiwgcGFyZW50X2Rpci0+aV9zYik7Ci0gICAgaWYgKHJldHZhbCkgeyAvKiByZWlzZXJmc19uZXdfaW5vZGUgaXB1dHMgZm9yIHVzICovCi0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLQotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwYXJlbnRfZGlyKSA7Ci0KLSAgICBpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0gICAgaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwotCi0gICAgLy8gbXVzdCBiZSBzdXJlIHRoaXMgaW5vZGUgaXMgd3JpdHRlbiB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KLSAgICAvLwotICAgIC8vcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlLCBSRUFEX0JMT0NLUyk7Ci0KLSAgICByZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkgKCZ0aCwgcGFyZW50X2RpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxLyp2aXNpYmxlKi8pOwotICAgIGlmIChyZXR2YWwpIHsKLQlpbnQgZXJyOwotCWlub2RlLT5pX25saW5rLS07Ci0JcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKLQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotCWlmIChlcnIpCi0JICAgIHJldHZhbCA9IGVycjsKLQlpcHV0IChpbm9kZSk7Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLQotICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBwYXJlbnRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLW91dF9mYWlsZWQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBhcmVudF9kaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfbGluayAoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKLXsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArIHVwZGF0ZSBvZiBxdW90YXMgZm9yIHRoZSBvd25lcnMgb2YgdGhlIGRpcmVjdG9yeSAqLwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYik7Ci0KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7Ci0gICAgaWYgKGlub2RlLT5pX25saW5rID49IFJFSVNFUkZTX0xJTktfTUFYKSB7Ci0JLy9GSVhNRTogc2RfbmxpbmsgaXMgMzIgYml0IGZvciBuZXcgZmlsZXMKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworICAgICAgb3V0X2ZhaWxlZDoKKwlpZiAobG9ja2VkKQorCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CiAJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0JcmV0dXJuIC1FTUxJTks7Ci0gICAgfQotICAgIGlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9CisJcmV0dXJuIHJldHZhbDsKK30KIAotICAgIC8qIGluYyBiZWZvcmUgc2NoZWR1bGluZyBzbyByZWlzZXJmc191bmxpbmsga25vd3Mgd2UgYXJlIGhlcmUgKi8KLSAgICBpbm9kZS0+aV9ubGluaysrOworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyogd2UgY2FuIGNoZWF0IGJlY2F1c2UgYW4gb2xkIGZvcm1hdCBkaXIgY2Fubm90IGhhdmUKKwkgKiogRU1QVFlfRElSX1NJWkUsIGFuZCBhIG5ldyBmb3JtYXQgZGlyIGNhbm5vdCBoYXZlCisJICoqIEVNUFRZX0RJUl9TSVpFX1YxLiAgU28sIGlmIHRoZSBpbm9kZSBpcyBlaXRoZXIgc2l6ZSwgCisJICoqIHJlZ2FyZGxlc3Mgb2YgZGlzayBmb3JtYXQgdmVyc2lvbiwgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoaW5vZGUtPmlfc2l6ZSAhPSBFTVBUWV9ESVJfU0laRSAmJgorCSAgICBpbm9kZS0+aV9zaXplICE9IEVNUFRZX0RJUl9TSVpFX1YxKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KIAotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgaW5vZGUtPmlfbmxpbmstLTsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChkaXItPmlfc2IpOwotICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmV0dmFsLCBlcnI7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBqYmVnaW5fY291bnQ7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CiAKLSAgICAvKiBjcmVhdGUgbmV3IGVudHJ5ICovCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAotCQkJCSBpbm9kZSwgMS8qdmlzaWJsZSovKTsKKwkvKiB3ZSB3aWxsIGJlIGRvaW5nIDIgYmFsYW5jaW5ncyBhbmQgdXBkYXRlIDIgc3RhdCBkYXRhLCB3ZSBjaGFuZ2UgcXVvdGFzCisJICogb2YgdGhlIG93bmVyIG9mIHRoZSBkaXJlY3RvcnkgYW5kIG9mIHRoZSBvd25lciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKwkgKiBUaGUgcXVvdGEgc3RydWN0dXJlIGlzIHBvc3NpYmx5IGRlbGV0ZWQgb25seSBvbiBsYXN0IGlwdXQgPT4gb3V0c2lkZQorCSAqIG9mIHRoaXMgdHJhbnNhY3Rpb24gKi8KKwlqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICsKKwkgICAgNCAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpOwogCi0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3JtZGlyOwogCi0gICAgaWYgKHJldHZhbCkgewotCWludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmstLTsKLQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwlpZiAoKHJldHZhbCA9CisJICAgICByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSAmcGF0aCwgJmRlKSkgPT0gTkFNRV9OT1RfRk9VTkQpIHsKKwkJcmV0dmFsID0gLUVOT0VOVDsKKwkJZ290byBlbmRfcm1kaXI7CisJfSBlbHNlIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfcm1kaXI7CisJfQorCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpOworCisJaWYgKGRlLmRlX29iamVjdGlkICE9IGlub2RlLT5pX2lubykgeworCQkvLyBGSVhNRTogY29tcGFyZSBrZXkgb2YgYW4gb2JqZWN0IGFuZCBhIGtleSBmb3VuZCBpbiB0aGUKKwkJLy8gZW50cnkKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfcm1kaXI7CisJfQorCWlmICghcmVpc2VyZnNfZW1wdHlfZGlyKGlub2RlKSkgeworCQlyZXR2YWwgPSAtRU5PVEVNUFRZOworCQlnb3RvIGVuZF9ybWRpcjsKKwl9CisKKwkvKiBjdXQgZW50cnkgZnJvbSBkaXIgZGlyZWN0b3J5ICovCisJcmV0dmFsID0gcmVpc2VyZnNfY3V0X2Zyb21faXRlbSgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwJLyogcGFnZSAqLworCQkJCQkwIC8qbmV3IGZpbGUgc2l6ZSAtIG5vdCB1c2VkIGhlcmUgKi8gKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlbmRfcm1kaXI7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgIT0gMiAmJiBpbm9kZS0+aV9ubGluayAhPSAxKQorCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAiJXM6IGVtcHR5IGRpcmVjdG9yeSBoYXMgbmxpbmsgIgorCQkJCSAiIT0gMiAoJWQpIiwgX19GVU5DVElPTl9fLCBpbm9kZS0+aV9ubGluayk7CisKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKworCURFQ19ESVJfSU5PREVfTkxJTksoZGlyKQorCSAgICBkaXItPmlfc2l6ZSAtPSAoREVIX1NJWkUgKyBkZS5kZV9lbnRyeWxlbik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgZGlyKTsKKworCS8qIHByZXZlbnQgZW1wdHkgZGlyZWN0b3J5IGZyb20gZ2V0dGluZyBsb3N0ICovCisJYWRkX3NhdmVfbGluaygmdGgsIGlub2RlLCAwIC8qIG5vdCB0cnVuY2F0ZSAqLyApOworCisJcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CisgICAgICBvdXRfcm1kaXI6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZW5kX3JtZGlyOgorCS8qIHdlIG11c3QgcmVsZWFzZSBwYXRoLCBiZWNhdXNlIHdlIGRpZCBub3QgY2FsbAorCSAgIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0sIG9yIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZG9lcyBub3QKKwkgICByZWxlYXNlIHBhdGggaWYgb3BlcmF0aW9uIHdhcyBub3QgY29tcGxldGUgKi8KKwlwYXRocmVsc2UoJnBhdGgpOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwogCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwogCXJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7Ci0gICAgfQotCi0gICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0KLSAgICBhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCkgOwotICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJldHZhbCwgZXJyOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgamJlZ2luX2NvdW50OworCXVuc2lnbmVkIGxvbmcgc2F2ZWxpbms7CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIGluIHRoaXMgdHJhbnNhY3Rpb24gd2UgY2FuIGJlIGRvaW5nIGF0IG1heCB0d28gYmFsYW5jaW5ncyBhbmQgdXBkYXRlCisJICogdHdvIHN0YXQgZGF0YXMsIHdlIGNoYW5nZSBxdW90YXMgb2YgdGhlIG93bmVyIG9mIHRoZSBkaXJlY3RvcnkgYW5kIG9mCisJICogdGhlIG93bmVyIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiBUaGUgcXVvdGEgc3RydWN0dXJlIGlzIHBvc3NpYmx5CisJICogZGVsZXRlZCBvbmx5IG9uIGlwdXQgPT4gb3V0c2lkZSBvZiB0aGlzIHRyYW5zYWN0aW9uICovCisJamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiArCisJICAgIDQgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKTsKKworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3VubGluazsKKworCWRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisJaWYgKChyZXR2YWwgPQorCSAgICAgcmVpc2VyZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQkgJnBhdGgsICZkZSkpID09IE5BTUVfTk9UX0ZPVU5EKSB7CisJCXJldHZhbCA9IC1FTk9FTlQ7CisJCWdvdG8gZW5kX3VubGluazsKKwl9IGVsc2UgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGVuZF91bmxpbms7CisJfQorCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKTsKKworCWlmIChkZS5kZV9vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJLy8gRklYTUU6IGNvbXBhcmUga2V5IG9mIGFuIG9iamVjdCBhbmQgYSBrZXkgZm91bmQgaW4gdGhlCisJCS8vIGVudHJ5CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZW5kX3VubGluazsKKwl9CisKKwlpZiAoIWlub2RlLT5pX25saW5rKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICIlczogZGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAiCisJCQkJICIoJXM6JWx1KSwgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQkJIHJlaXNlcmZzX2JkZXZuYW1lKGlub2RlLT5pX3NiKSwgaW5vZGUtPmlfaW5vLAorCQkJCSBpbm9kZS0+aV9ubGluayk7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwl9CisKKwlpbm9kZS0+aV9ubGluay0tOworCisJLyoKKwkgKiB3ZSBzY2hlZHVsZSBiZWZvcmUgZG9pbmcgdGhlIGFkZF9zYXZlX2xpbmsgY2FsbCwgc2F2ZSB0aGUgbGluaworCSAqIGNvdW50IHNvIHdlIGRvbid0IHJhY2UKKwkgKi8KKwlzYXZlbGluayA9IGlub2RlLT5pX25saW5rOworCisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwKKwkJCQkgICAwKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlpbm9kZS0+aV9ubGluaysrOworCQlnb3RvIGVuZF91bmxpbms7CisJfQorCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisKKwlkaXItPmlfc2l6ZSAtPSAoZGUuZGVfZW50cnlsZW4gKyBERUhfU0laRSk7CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBkaXIpOworCisJaWYgKCFzYXZlbGluaykKKwkJLyogcHJldmVudCBmaWxlIGZyb20gZ2V0dGluZyBsb3N0ICovCisJCWFkZF9zYXZlX2xpbmsoJnRoLCBpbm9kZSwgMCAvKiBub3QgdHJ1bmNhdGUgKi8gKTsKKworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7CisKKyAgICAgIGVuZF91bmxpbms6CisJcGF0aHJlbHNlKCZwYXRoKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwlpZiAoZXJyKQorCQlyZXR2YWwgPSBlcnI7CisgICAgICBvdXRfdW5saW5rOgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKnBhcmVudF9kaXIsCisJCQkgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwljaGFyICpuYW1lOworCWludCBpdGVtX2xlbjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBtb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCisJaW50IGpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArCisJICAgIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MocGFyZW50X2Rpci0+aV9zYikgKworCQkgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKHBhcmVudF9kaXItPmlfc2IpKTsKKworCWlmICghKGlub2RlID0gbmV3X2lub2RlKHBhcmVudF9kaXItPmlfc2IpKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbmV3X2lub2RlX2luaXQoaW5vZGUsIHBhcmVudF9kaXIsIG1vZGUpOworCisJcmVpc2VyZnNfd3JpdGVfbG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKKwlpdGVtX2xlbiA9IFJPVU5EX1VQKHN0cmxlbihzeW1uYW1lKSk7CisJaWYgKGl0ZW1fbGVuID4gTUFYX0RJUkVDVF9JVEVNX0xFTihwYXJlbnRfZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKKwkJcmV0dmFsID0gLUVOQU1FVE9PTE9ORzsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJbmFtZSA9IHJlaXNlcmZzX2ttYWxsb2MoaXRlbV9sZW4sIEdGUF9OT0ZTLCBwYXJlbnRfZGlyLT5pX3NiKTsKKwlpZiAoIW5hbWUpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCW1lbWNweShuYW1lLCBzeW1uYW1lLCBzdHJsZW4oc3ltbmFtZSkpOworCXBhZGRfaXRlbShuYW1lLCBpdGVtX2xlbiwgc3RybGVuKHN5bW5hbWUpKTsKKworCS8qIFdlIHdvdWxkIGluaGVyaXQgdGhlIGRlZmF1bHQgQUNMIGhlcmUsIGJ1dCBzeW1saW5rcyBkb24ndCBnZXQgQUNMcyAqLworCisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlkcm9wX25ld19pbm9kZShpbm9kZSk7CisJCXJlaXNlcmZzX2tmcmVlKG5hbWUsIGl0ZW1fbGVuLCBwYXJlbnRfZGlyLT5pX3NiKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KKworCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX25ld19pbm9kZSgmdGgsIHBhcmVudF9kaXIsIG1vZGUsIG5hbWUsIHN0cmxlbihzeW1uYW1lKSwKKwkJCSAgICAgICBkZW50cnksIGlub2RlKTsKKwlyZWlzZXJmc19rZnJlZShuYW1lLCBpdGVtX2xlbiwgcGFyZW50X2Rpci0+aV9zYik7CisJaWYgKHJldHZhbCkgewkJLyogcmVpc2VyZnNfbmV3X2lub2RlIGlwdXRzIGZvciB1cyAqLworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ocGFyZW50X2Rpcik7CisKKwlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOworCisJLy8gbXVzdCBiZSBzdXJlIHRoaXMgaW5vZGUgaXMgd3JpdHRlbiB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KKwkvLworCS8vcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlLCBSRUFEX0JMT0NLUyk7CisKKwlyZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBwYXJlbnRfZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxIC8qdmlzaWJsZSAqLyApOworCWlmIChyZXR2YWwpIHsKKwkJaW50IGVycjsKKwkJaW5vZGUtPmlfbmxpbmstLTsKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOworCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlyZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisgICAgICBvdXRfZmFpbGVkOgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsCisJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyB1cGRhdGUgb2YgcXVvdGFzIGZvciB0aGUgb3duZXJzIG9mIHRoZSBkaXJlY3RvcnkgKi8KKwlpbnQgamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsKKwkgICAgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpOworCisJcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworCWlmIChpbm9kZS0+aV9ubGluayA+PSBSRUlTRVJGU19MSU5LX01BWCkgeworCQkvL0ZJWE1FOiBzZF9ubGluayBpcyAzMiBiaXQgZm9yIG5ldyBmaWxlcworCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJcmV0dXJuIC1FTUxJTks7CisJfQorCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBpbmMgYmVmb3JlIHNjaGVkdWxpbmcgc28gcmVpc2VyZnNfdW5saW5rIGtub3dzIHdlIGFyZSBoZXJlICovCisJaW5vZGUtPmlfbmxpbmsrKzsKKworCXJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlpbm9kZS0+aV9ubGluay0tOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBjcmVhdGUgbmV3IGVudHJ5ICovCisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfYWRkX2VudHJ5KCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CisKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpOworCisJaWYgKHJldHZhbCkgeworCQlpbnQgZXJyOworCQlpbm9kZS0+aV9ubGluay0tOworCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCXJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7CisJfQorCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7Cit9CiAKIC8vIGRlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHBvaW50aW5nIHRvIGFuIGVudHJ5IHdoaWNoIAotc3RhdGljIGludCBkZV9zdGlsbF92YWxpZCAoY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4sIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3N0YXRpYyBpbnQgZGVfc3RpbGxfdmFsaWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCSAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSB0bXAgPSAqZGU7Ci0gICAgCi0gICAgLy8gcmVjYWxjdWxhdGUgcG9pbnRlciB0byBuYW1lIGFuZCBuYW1lIGxlbmd0aAotICAgIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuICgmdG1wKTsKLSAgICAvLyBGSVhNRTogY291bGQgY2hlY2sgbW9yZQotICAgIGlmICh0bXAuZGVfbmFtZWxlbiAhPSBsZW4gfHwgbWVtY21wIChuYW1lLCBkZS0+ZGVfbmFtZSwgbGVuKSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IHRtcCA9ICpkZTsKKworCS8vIHJlY2FsY3VsYXRlIHBvaW50ZXIgdG8gbmFtZSBhbmQgbmFtZSBsZW5ndGgKKwlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbigmdG1wKTsKKwkvLyBGSVhNRTogY291bGQgY2hlY2sgbW9yZQorCWlmICh0bXAuZGVfbmFtZWxlbiAhPSBsZW4gfHwgbWVtY21wKG5hbWUsIGRlLT5kZV9uYW1lLCBsZW4pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAotCi1zdGF0aWMgaW50IGVudHJ5X3BvaW50c190b19vYmplY3QgKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RhdGljIGludCBlbnRyeV9wb2ludHNfdG9fb2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCQkJICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgaWYgKCFkZV9zdGlsbF92YWxpZCAobmFtZSwgbGVuLCBkZSkpCi0JcmV0dXJuIDA7CisJaWYgKCFkZV9zdGlsbF92YWxpZChuYW1lLCBsZW4sIGRlKSkKKwkJcmV0dXJuIDA7CiAKLSAgICBpZiAoaW5vZGUpIHsKLQlpZiAoIWRlX3Zpc2libGUgKGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtKSkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy03MDQyOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKLQlyZXR1cm4gKGRlLT5kZV9vYmplY3RpZCA9PSBpbm9kZS0+aV9pbm8pID8gMSA6IDA7Ci0gICAgfQorCWlmIChpbm9kZSkgeworCQlpZiAoIWRlX3Zpc2libGUoZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW0pKQorCQkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCQkgICAgICAgInZzLTcwNDI6IGVudHJ5X3BvaW50c190b19vYmplY3Q6IGVudHJ5IG11c3QgYmUgdmlzaWJsZSIpOworCQlyZXR1cm4gKGRlLT5kZV9vYmplY3RpZCA9PSBpbm9kZS0+aV9pbm8pID8gMSA6IDA7CisJfQogCi0gICAgLyogdGhpcyBtdXN0IGJlIGFkZGVkIGhpZGRlbiBlbnRyeSAqLwotICAgIGlmIChkZV92aXNpYmxlIChkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bSkpCi0JcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy03MDQzOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKKwkvKiB0aGlzIG11c3QgYmUgYWRkZWQgaGlkZGVuIGVudHJ5ICovCisJaWYgKGRlX3Zpc2libGUoZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW0pKQorCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJICAgICAgICJ2cy03MDQzOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKIAotICAgIHJldHVybiAxOworCXJldHVybiAxOwogfQogCi0KIC8qIHNldHMga2V5IG9mIG9iamVjdGlkIHRoZSBlbnRyeSBoYXMgdG8gcG9pbnQgdG8gKi8KLXN0YXRpYyB2b2lkIHNldF9pbm9faW5fZGlyX2VudHJ5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzZXRfaW5vX2luX2Rpcl9lbnRyeShzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KQogewotICAgIC8qIEpETSBUaGVzZSBvcGVyYXRpb25zIGFyZSBlbmRpYW4gc2FmZSAtIGJvdGggYXJlIGxlICovCi0gICAgZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXS5kZWhfZGlyX2lkID0ga2V5LT5rX2Rpcl9pZDsKLSAgICBkZS0+ZGVfZGVoW2RlLT5kZV9lbnRyeV9udW1dLmRlaF9vYmplY3RpZCA9IGtleS0+a19vYmplY3RpZDsKKwkvKiBKRE0gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgZW5kaWFuIHNhZmUgLSBib3RoIGFyZSBsZSAqLworCWRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0uZGVoX2Rpcl9pZCA9IGtleS0+a19kaXJfaWQ7CisJZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXS5kZWhfb2JqZWN0aWQgPSBrZXktPmtfb2JqZWN0aWQ7CiB9CiAKLQogLyogCiAgKiBwcm9jZXNzLCB0aGF0IGlzIGdvaW5nIHRvIGNhbGwgZml4X25vZGVzL2RvX2JhbGFuY2UgbXVzdCBob2xkIG9ubHkKICAqIG9uZSBwYXRoLiBJZiBpdCBob2xkcyAyIG9yIG1vcmUsIGl0IGNhbiBnZXQgaW50byBlbmRsZXNzIHdhaXRpbmcgaW4KICAqIGdldF9lbXB0eV9ub2RlcyBvciBpdHMgY2xvbmVzIAogICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlbmFtZSAoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKiBuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQorc3RhdGljIGludCByZWlzZXJmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkJICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewotICAgIGludCByZXR2YWw7Ci0gICAgSU5JVElBTElaRV9QQVRIIChvbGRfZW50cnlfcGF0aCk7Ci0gICAgSU5JVElBTElaRV9QQVRIIChuZXdfZW50cnlfcGF0aCk7Ci0gICAgSU5JVElBTElaRV9QQVRIIChkb3RfZG90X2VudHJ5X3BhdGgpOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgbmV3X2VudHJ5X2loLCBvbGRfZW50cnlfaWgsIGRvdF9kb3RfaWggOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgb2xkX2RlLCBuZXdfZGUsIGRvdF9kb3RfZGU7Ci0gICAgc3RydWN0IGlub2RlICogb2xkX2lub2RlLCAqIG5ld19kZW50cnlfaW5vZGU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGpiZWdpbl9jb3VudCA7IAotICAgIHVtb2RlX3Qgb2xkX2lub2RlX21vZGU7Ci0gICAgdW5zaWduZWQgbG9uZyBzYXZlbGluayA9IDE7Ci0gICAgc3RydWN0IHRpbWVzcGVjIGN0aW1lOworCWludCByZXR2YWw7CisJSU5JVElBTElaRV9QQVRIKG9sZF9lbnRyeV9wYXRoKTsKKwlJTklUSUFMSVpFX1BBVEgobmV3X2VudHJ5X3BhdGgpOworCUlOSVRJQUxJWkVfUEFUSChkb3RfZG90X2VudHJ5X3BhdGgpOworCXN0cnVjdCBpdGVtX2hlYWQgbmV3X2VudHJ5X2loLCBvbGRfZW50cnlfaWgsIGRvdF9kb3RfaWg7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBvbGRfZGUsIG5ld19kZSwgZG90X2RvdF9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgKm5ld19kZW50cnlfaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgamJlZ2luX2NvdW50OworCXVtb2RlX3Qgb2xkX2lub2RlX21vZGU7CisJdW5zaWduZWQgbG9uZyBzYXZlbGluayA9IDE7CisJc3RydWN0IHRpbWVzcGVjIGN0aW1lOwogCi0gICAgLyogdGhyZWUgYmFsYW5jaW5nczogKDEpIG9sZCBuYW1lIHJlbW92YWwsICgyKSBuZXcgbmFtZSBpbnNlcnRpb24KLSAgICAgICBhbmQgKDMpIG1heWJlICJzYXZlIiBsaW5rIGluc2VydGlvbgotICAgICAgIHN0YXQgZGF0YSB1cGRhdGVzOiAoMSkgb2xkIGRpcmVjdG9yeSwKLSAgICAgICAoMikgbmV3IGRpcmVjdG9yeSBhbmQgKDMpIG1heWJlIG9sZCBvYmplY3Qgc3RhdCBkYXRhICh3aGVuIGl0IGlzCi0gICAgICAgZGlyZWN0b3J5KSBhbmQgKDQpIG1heWJlIHN0YXQgZGF0YSBvZiBvYmplY3QgdG8gd2hpY2ggbmV3IGVudHJ5Ci0gICAgICAgcG9pbnRlZCBpbml0aWFsbHkgYW5kICg1KSBtYXliZSBibG9jayBjb250YWluaW5nICIuLiIgb2YKLSAgICAgICByZW5hbWVkIGRpcmVjdG9yeQotICAgICAgIHF1b3RhIHVwZGF0ZXM6IHR3byBwYXJlbnQgZGlyZWN0b3JpZXMgKi8KLSAgICBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyA1ICsgNCAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhvbGRfZGlyLT5pX3NiKTsKKwkvKiB0aHJlZSBiYWxhbmNpbmdzOiAoMSkgb2xkIG5hbWUgcmVtb3ZhbCwgKDIpIG5ldyBuYW1lIGluc2VydGlvbgorCSAgIGFuZCAoMykgbWF5YmUgInNhdmUiIGxpbmsgaW5zZXJ0aW9uCisJICAgc3RhdCBkYXRhIHVwZGF0ZXM6ICgxKSBvbGQgZGlyZWN0b3J5LAorCSAgICgyKSBuZXcgZGlyZWN0b3J5IGFuZCAoMykgbWF5YmUgb2xkIG9iamVjdCBzdGF0IGRhdGEgKHdoZW4gaXQgaXMKKwkgICBkaXJlY3RvcnkpIGFuZCAoNCkgbWF5YmUgc3RhdCBkYXRhIG9mIG9iamVjdCB0byB3aGljaCBuZXcgZW50cnkKKwkgICBwb2ludGVkIGluaXRpYWxseSBhbmQgKDUpIG1heWJlIGJsb2NrIGNvbnRhaW5pbmcgIi4uIiBvZgorCSAgIHJlbmFtZWQgZGlyZWN0b3J5CisJICAgcXVvdGEgdXBkYXRlczogdHdvIHBhcmVudCBkaXJlY3RvcmllcyAqLworCWpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDUgKworCSAgICA0ICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKG9sZF9kaXItPmlfc2IpOwogCi0gICAgb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICBuZXdfZGVudHJ5X2lub2RlID0gbmV3X2RlbnRyeS0+ZF9pbm9kZTsKKwlvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCW5ld19kZW50cnlfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOwogCi0gICAgLy8gbWFrZSBzdXJlLCB0aGF0IG9sZG5hbWUgc3RpbGwgZXhpc3RzIGFuZCBwb2ludHMgdG8gYW4gb2JqZWN0IHdlCi0gICAgLy8gYXJlIGdvaW5nIHRvIHJlbmFtZQotICAgIG9sZF9kZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSBOVUxMOwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2sob2xkX2Rpci0+aV9zYik7Ci0gICAgcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAob2xkX2Rpciwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG9sZF9kZW50cnktPmRfbmFtZS5sZW4sCi0JCQkJICAmb2xkX2VudHJ5X3BhdGgsICZvbGRfZGUpOwotICAgIHBhdGhyZWxzZSAoJm9sZF9lbnRyeV9wYXRoKTsKLSAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCXJldHVybiAtRUlPOwotICAgIH0KLQotICAgIGlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCB8fCBvbGRfZGUuZGVfb2JqZWN0aWQgIT0gb2xkX2lub2RlLT5pX2lubykgewotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKLQlyZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBvbGRfaW5vZGVfbW9kZSA9IG9sZF9pbm9kZS0+aV9tb2RlOwotICAgIGlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgewotCS8vIG1ha2Ugc3VyZSwgdGhhdCBkaXJlY3RvcnkgYmVpbmcgcmVuYW1lZCBoYXMgY29ycmVjdCAiLi4iIAotCS8vIGFuZCB0aGF0IGl0cyBuZXcgcGFyZW50IGRpcmVjdG9yeSBoYXMgbm90IHRvbyBtYW55IGxpbmtzCi0JLy8gYWxyZWFkeQotCi0JaWYgKG5ld19kZW50cnlfaW5vZGUpIHsKLQkgICAgaWYgKCFyZWlzZXJmc19lbXB0eV9kaXIobmV3X2RlbnRyeV9pbm9kZSkpIHsKLQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCQlyZXR1cm4gLUVOT1RFTVBUWTsKLQkgICAgfQotCX0KLQkKLQkvKiBkaXJlY3RvcnkgaXMgcmVuYW1lZCwgaXRzIHBhcmVudCBkaXJlY3Rvcnkgd2lsbCBiZSBjaGFuZ2VkLCAKLQkqKiBzbyBmaW5kICIuLiIgZW50cnkgCi0JKi8KLQlkb3RfZG90X2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0JcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAob2xkX2lub2RlLCAiLi4iLCAyLCAmZG90X2RvdF9lbnRyeV9wYXRoLCAmZG90X2RvdF9kZSk7Ci0JcGF0aHJlbHNlICgmZG90X2RvdF9lbnRyeV9wYXRoKTsKLQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCSAgICByZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBpbm9kZSBudW1iZXIgb2YgLi4gbXVzdCBlcXVhbCBvbGRfZGlyLT5pX2lubyAqLwotCWlmIChkb3RfZG90X2RlLmRlX29iamVjdGlkICE9IG9sZF9kaXItPmlfaW5vKSB7Ci0JICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKLQkgICAgcmV0dXJuIC1FSU87Ci0JfQotICAgIH0KLQotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAob2xkX2Rpci0+aV9zYik7Ci0gICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgLyogYWRkIG5ldyBlbnRyeSAob3IgZmluZCB0aGUgZXhpc3Rpbmcgb25lKSAqLwotICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBuZXdfZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwgCi0JCQkJIG9sZF9pbm9kZSwgMCk7Ci0gICAgaWYgKHJldHZhbCA9PSAtRUVYSVNUKSB7Ci0JaWYgKCFuZXdfZGVudHJ5X2lub2RlKSB7Ci0JICAgIHJlaXNlcmZzX3BhbmljIChvbGRfZGlyLT5pX3NiLAotCQkJICAgICJ2cy03MDUwOiBuZXcgZW50cnkgaXMgZm91bmQsIG5ldyBpbm9kZSA9PSAwXG4iKTsKLQl9Ci0gICAgfSBlbHNlIGlmIChyZXR2YWwpIHsKLQlpbnQgZXJyID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKLSAgICB9Ci0KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2RpcikgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihuZXdfZGlyKSA7Ci0KLSAgICAvKiB0aGlzIG1ha2VzIGl0IHNvIGFuIGZzeW5jIG9uIGFuIG9wZW4gZmQgZm9yIHRoZSBvbGQgbmFtZSB3aWxsCi0gICAgKiogY29tbWl0IHRoZSByZW5hbWUgb3BlcmF0aW9uCi0gICAgKi8KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2lub2RlKSA7Ci0KLSAgICBpZiAobmV3X2RlbnRyeV9pbm9kZSkgCi0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG5ld19kZW50cnlfaW5vZGUpIDsKLQotICAgIHdoaWxlICgxKSB7Ci0JLy8gbG9vayBmb3Igb2xkIG5hbWUgdXNpbmcgY29ycmVzcG9uZGluZyBlbnRyeSBrZXkgKGZvdW5kIGJ5IHJlaXNlcmZzX2ZpbmRfZW50cnkpCi0JaWYgKChyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChuZXdfZGlyLT5pX3NiLCAmb2xkX2RlLmRlX2VudHJ5X2tleSwKLQkJCQkJICAgJm9sZF9lbnRyeV9wYXRoLCAmb2xkX2RlKSkgIT0gTkFNRV9GT1VORCkgewotCSAgICBwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKLQkgICAgam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JICAgIHJldHVybiAtRUlPOwotCX0KLQotCWNvcHlfaXRlbV9oZWFkKCZvbGRfZW50cnlfaWgsIGdldF9paCgmb2xkX2VudHJ5X3BhdGgpKSA7Ci0KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgb2xkX2RlLmRlX2JoLCAxKSA7Ci0KLQkvLyBsb29rIGZvciBuZXcgbmFtZSBieSByZWlzZXJmc19maW5kX2VudHJ5Ci0JbmV3X2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0JcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAobmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5sZW4sIAotCQkJCSAgICAgICZuZXdfZW50cnlfcGF0aCwgJm5ld19kZSk7Ci0JLy8gcmVpc2VyZnNfYWRkX2VudHJ5IHNob3VsZCBub3QgcmV0dXJuIElPX0VSUk9SLCBiZWNhdXNlIGl0IGlzIGNhbGxlZCB3aXRoIGVzc2VudGlhbGx5IHNhbWUgcGFyYW1ldGVycyBmcm9tCi0gICAgICAgIC8vIHJlaXNlcmZzX2FkZF9lbnRyeSBhYm92ZSwgYW5kIHdlJ2xsIGNhdGNoIGFueSBpL28gZXJyb3JzIGJlZm9yZSB3ZSBnZXQgaGVyZS4KLQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkRfSU5WSVNJQkxFICYmIHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7Ci0JICAgIHBhdGhyZWxzZSgmbmV3X2VudHJ5X3BhdGgpOwotCSAgICBwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKLQkgICAgam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JICAgIHJldHVybiAtRUlPOwotCX0KLQotCWNvcHlfaXRlbV9oZWFkKCZuZXdfZW50cnlfaWgsIGdldF9paCgmbmV3X2VudHJ5X3BhdGgpKSA7Ci0KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoLCAxKSA7Ci0KLQlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKLQkgICAgaWYgKChyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChuZXdfZGlyLT5pX3NiLCAmZG90X2RvdF9kZS5kZV9lbnRyeV9rZXksCi0JCQkJCSAgICAgICAmZG90X2RvdF9lbnRyeV9wYXRoLCAmZG90X2RvdF9kZSkpICE9IE5BTUVfRk9VTkQpIHsKLQkJcGF0aHJlbHNlKCZkb3RfZG90X2VudHJ5X3BhdGgpOwotCQlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKLQkJcGF0aHJlbHNlKCZvbGRfZW50cnlfcGF0aCk7Ci0JCWpvdXJuYWxfZW5kKCZ0aCwgb2xkX2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkvLyBtYWtlIHN1cmUsIHRoYXQgb2xkbmFtZSBzdGlsbCBleGlzdHMgYW5kIHBvaW50cyB0byBhbiBvYmplY3Qgd2UKKwkvLyBhcmUgZ29pbmcgdG8gcmVuYW1lCisJb2xkX2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhvbGRfZGlyLT5pX3NiKTsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19maW5kX2VudHJ5KG9sZF9kaXIsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCW9sZF9kZW50cnktPmRfbmFtZS5sZW4sICZvbGRfZW50cnlfcGF0aCwKKwkJCQkmb2xkX2RlKTsKKwlwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CiAJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKIAkJcmV0dXJuIC1FSU87Ci0JICAgIH0KLQkgICAgY29weV9pdGVtX2hlYWQoJmRvdF9kb3RfaWgsIGdldF9paCgmZG90X2RvdF9lbnRyeV9wYXRoKSkgOwotCSAgICAvLyBub2RlIGNvbnRhaW5pbmcgIi4uIiBnZXRzIGludG8gdHJhbnNhY3Rpb24KLQkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIGRvdF9kb3RfZGUuZGVfYmgsIDEpIDsKIAl9Ci0JCQkJLyogd2Ugc2hvdWxkIGNoZWNrIHNlYWxzIGhlcmUsIG5vdCBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0dWZmLCB5ZXM/IFRoZW4sIGhhdmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXRoZXJlZCBldmVyeXRoaW5nIGludG8gUkFNIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBsb2NrIHRoZSBidWZmZXJzLCB5ZXM/ICAtSGFucyAqLwotCQkJCS8qIHByb2JhYmx5LiAgb3VyIHJlbmFtZSBuZWVkcyB0byBob2xkIG1vcmUgCi0JCQkJKiogdGhhbiBvbmUgcGF0aCBhdCBvbmNlLiAgVGhlIHNlYWxzIHdvdWxkIAotCQkJCSoqIGhhdmUgdG8gYmUgd3JpdHRlbiB0byBkZWFsIHdpdGggbXVsdGktcGF0aCAKLQkJCQkqKiBpc3N1ZXMgLWNocmlzCi0JCQkJKi8KLQkvKiBzYW5pdHkgY2hlY2tpbmcgYmVmb3JlIGRvaW5nIHRoZSByZW5hbWUgLSBhdm9pZCByYWNlcyBtYW55Ci0JKiogb2YgdGhlIGFib3ZlIGNoZWNrcyBjb3VsZCBoYXZlIHNjaGVkdWxlZC4gIFdlIGhhdmUgdG8gYmUKLQkqKiBzdXJlIG91ciBpdGVtcyBoYXZlbid0IGJlZW4gc2hpZnRlZCBieSBhbm90aGVyIHByb2Nlc3MuCi0JKi8KLQlpZiAoaXRlbV9tb3ZlZCgmbmV3X2VudHJ5X2loLCAmbmV3X2VudHJ5X3BhdGgpIHx8Ci0JICAgICFlbnRyeV9wb2ludHNfdG9fb2JqZWN0KG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCQkgICAgJm5ld19kZSwgbmV3X2RlbnRyeV9pbm9kZSkgfHwKLQkgICAgaXRlbV9tb3ZlZCgmb2xkX2VudHJ5X2loLCAmb2xkX2VudHJ5X3BhdGgpIHx8IAotCSAgICAhZW50cnlfcG9pbnRzX3RvX29iamVjdCAob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCQkgICAgICZvbGRfZGUsIG9sZF9pbm9kZSkpIHsKLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgb2xkX2RlLmRlX2JoKTsKLQkgICAgaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKQotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKLQkgICAgY29udGludWU7CisKKwlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQgfHwgb2xkX2RlLmRlX29iamVjdGlkICE9IG9sZF9pbm9kZS0+aV9pbm8pIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CisKKwlvbGRfaW5vZGVfbW9kZSA9IG9sZF9pbm9kZS0+aV9tb2RlOwogCWlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgewotCSAgICBpZiAoIGl0ZW1fbW92ZWQoJmRvdF9kb3RfaWgsICZkb3RfZG90X2VudHJ5X3BhdGgpIHx8Ci0JCSFlbnRyeV9wb2ludHNfdG9fb2JqZWN0ICggIi4uIiwgMiwgJmRvdF9kb3RfZGUsIG9sZF9kaXIpICkgewotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBvbGRfZGUuZGVfYmgpOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBuZXdfZGUuZGVfYmgpOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKLQkJY29udGludWU7Ci0JICAgIH0KKwkJLy8gbWFrZSBzdXJlLCB0aGF0IGRpcmVjdG9yeSBiZWluZyByZW5hbWVkIGhhcyBjb3JyZWN0ICIuLiIgCisJCS8vIGFuZCB0aGF0IGl0cyBuZXcgcGFyZW50IGRpcmVjdG9yeSBoYXMgbm90IHRvbyBtYW55IGxpbmtzCisJCS8vIGFscmVhZHkKKworCQlpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCQkJaWYgKCFyZWlzZXJmc19lbXB0eV9kaXIobmV3X2RlbnRyeV9pbm9kZSkpIHsKKwkJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQkJcmV0dXJuIC1FTk9URU1QVFk7CisJCQl9CisJCX0KKworCQkvKiBkaXJlY3RvcnkgaXMgcmVuYW1lZCwgaXRzIHBhcmVudCBkaXJlY3Rvcnkgd2lsbCBiZSBjaGFuZ2VkLCAKKwkJICoqIHNvIGZpbmQgIi4uIiBlbnRyeSAKKwkJICovCisJCWRvdF9kb3RfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwkJcmV0dmFsID0KKwkJICAgIHJlaXNlcmZzX2ZpbmRfZW50cnkob2xkX2lub2RlLCAiLi4iLCAyLCAmZG90X2RvdF9lbnRyeV9wYXRoLAorCQkJCQkmZG90X2RvdF9kZSk7CisJCXBhdGhyZWxzZSgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwkJaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIGlub2RlIG51bWJlciBvZiAuLiBtdXN0IGVxdWFsIG9sZF9kaXItPmlfaW5vICovCisJCWlmIChkb3RfZG90X2RlLmRlX29iamVjdGlkICE9IG9sZF9kaXItPmlfaW5vKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQogCX0KIAotCVJGQUxTRSggU19JU0RJUihvbGRfaW5vZGVfbW9kZSkgJiYgCi0JCSAhYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoZG90X2RvdF9kZS5kZV9iaCksICIiICk7Ci0KLQlicmVhazsKLSAgICB9Ci0KLSAgICAvKiBvaywgYWxsIHRoZSBjaGFuZ2VzIGNhbiBiZSBkb25lIGluIG9uZSBmZWxsIHN3b29wIHdoZW4gd2UKLSAgICAgICBoYXZlIGNsYWltZWQgYWxsIHRoZSBidWZmZXJzIG5lZWRlZC4qLwotICAgIAotICAgIG1hcmtfZGVfdmlzaWJsZSAobmV3X2RlLmRlX2RlaCArIG5ld19kZS5kZV9lbnRyeV9udW0pOwotICAgIHNldF9pbm9faW5fZGlyX2VudHJ5ICgmbmV3X2RlLCBJTk9ERV9QS0VZIChvbGRfaW5vZGUpKTsKLSAgICBqb3VybmFsX21hcmtfZGlydHkgKCZ0aCwgb2xkX2Rpci0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKLQotICAgIG1hcmtfZGVfaGlkZGVuIChvbGRfZGUuZGVfZGVoICsgb2xkX2RlLmRlX2VudHJ5X251bSk7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5ICgmdGgsIG9sZF9kaXItPmlfc2IsIG9sZF9kZS5kZV9iaCk7Ci0gICAgY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIG9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gY3RpbWU7Ci0gICAgbmV3X2Rpci0+aV9jdGltZSA9IG5ld19kaXItPmlfbXRpbWUgPSBjdGltZTsKLSAgICAvKiB0aGFua3MgdG8gQWxleCBBZHJpYWFuc2UgPGFsZXhfYUBjYWx0ZWNoLmVkdT4gZm9yIHBhdGNoIHdoaWNoIGFkZHMgY3RpbWUgdXBkYXRlIG9mCi0gICAgICAgcmVuYW1lZCBvYmplY3QgKi8KLSAgICBvbGRfaW5vZGUtPmlfY3RpbWUgPSBjdGltZTsKLQotICAgIGlmIChuZXdfZGVudHJ5X2lub2RlKSB7Ci0JLy8gYWRqdXN0IGxpbmsgbnVtYmVyIG9mIHRoZSB2aWN0aW0KLQlpZiAoU19JU0RJUihuZXdfZGVudHJ5X2lub2RlLT5pX21vZGUpKSB7Ci0JICAgIG5ld19kZW50cnlfaW5vZGUtPmlfbmxpbmsgID0gMDsKLQl9IGVsc2UgewotCSAgICBuZXdfZGVudHJ5X2lub2RlLT5pX25saW5rLS07CisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCXJldHVybiByZXR2YWw7CiAJfQotCW5ld19kZW50cnlfaW5vZGUtPmlfY3RpbWUgPSBjdGltZTsKLQlzYXZlbGluayA9IG5ld19kZW50cnlfaW5vZGUtPmlfbmxpbms7Ci0gICAgfQogCi0gICAgaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKSB7Ci0JLy8gYWRqdXN0ICIuLiIgb2YgcmVuYW1lZCBkaXJlY3RvcnkgCi0Jc2V0X2lub19pbl9kaXJfZW50cnkgKCZkb3RfZG90X2RlLCBJTk9ERV9QS0VZIChuZXdfZGlyKSk7Ci0Jam91cm5hbF9tYXJrX2RpcnR5ICgmdGgsIG5ld19kaXItPmlfc2IsIGRvdF9kb3RfZGUuZGVfYmgpOwotCQotICAgICAgICBpZiAoIW5ld19kZW50cnlfaW5vZGUpCi0JICAgIC8qIHRoZXJlIChpbiBuZXdfZGlyKSB3YXMgbm8gZGlyZWN0b3J5LCBzbyBpdCBnb3QgbmV3IGxpbmsKLQkgICAgICAgKCIuLiIgIG9mIHJlbmFtZWQgZGlyZWN0b3J5KSAqLwotCSAgICBJTkNfRElSX0lOT0RFX05MSU5LKG5ld19kaXIpOwotCQkKLQkvKiBvbGQgZGlyZWN0b3J5IGxvc3Qgb25lIGxpbmsgLSAiLi4gIiBvZiByZW5hbWVkIGRpcmVjdG9yeSAqLwotCURFQ19ESVJfSU5PREVfTkxJTksob2xkX2Rpcik7Ci0gICAgfQorCS8qIGFkZCBuZXcgZW50cnkgKG9yIGZpbmQgdGhlIGV4aXN0aW5nIG9uZSkgKi8KKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBuZXdfZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubGVuLCBvbGRfaW5vZGUsIDApOworCWlmIChyZXR2YWwgPT0gLUVFWElTVCkgeworCQlpZiAoIW5ld19kZW50cnlfaW5vZGUpIHsKKwkJCXJlaXNlcmZzX3BhbmljKG9sZF9kaXItPmlfc2IsCisJCQkJICAgICAgICJ2cy03MDUwOiBuZXcgZW50cnkgaXMgZm91bmQsIG5ldyBpbm9kZSA9PSAwXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAocmV0dmFsKSB7CisJCWludCBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwkJcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKKwl9CiAKLSAgICAvLyBsb29rcyBsaWtlIGluIDIuMy45OXByZTMgYnJlbHNlIGlzIGF0b21pYy4gc28gd2UgY2FuIHVzZSBwYXRocmVsc2UKLSAgICBwYXRocmVsc2UgKCZuZXdfZW50cnlfcGF0aCk7Ci0gICAgcGF0aHJlbHNlICgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG5ld19kaXIpOwogCi0gICAgLy8gRklYTUU6IHRoaXMgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSdzIHJldHVybiB2YWx1ZSBtYXkgc2NyZXcgdXAKLSAgICAvLyBhbnlib2R5LCBidXQgaXQgd2lsbCBwYW5pYyBpZiB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgdGhlCi0gICAgLy8gZW50cnkuIFRoaXMgbmVlZHMgb25lIG1vcmUgY2xlYW4gdXAKLSAgICBpZiAocmVpc2VyZnNfY3V0X2Zyb21faXRlbSAoJnRoLCAmb2xkX2VudHJ5X3BhdGgsICYob2xkX2RlLmRlX2VudHJ5X2tleSksIG9sZF9kaXIsIE5VTEwsIDApIDwgMCkKLQlyZWlzZXJmc193YXJuaW5nIChvbGRfZGlyLT5pX3NiLCAidnMtNzA2MDogcmVpc2VyZnNfcmVuYW1lOiBjb3VsZG4ndCBub3QgY3V0IG9sZCBuYW1lLiBGc2NrIGxhdGVyPyIpOworCS8qIHRoaXMgbWFrZXMgaXQgc28gYW4gZnN5bmMgb24gYW4gb3BlbiBmZCBmb3IgdGhlIG9sZCBuYW1lIHdpbGwKKwkgKiogY29tbWl0IHRoZSByZW5hbWUgb3BlcmF0aW9uCisJICovCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG9sZF9pbm9kZSk7CiAKLSAgICBvbGRfZGlyLT5pX3NpemUgLT0gREVIX1NJWkUgKyBvbGRfZGUuZGVfZW50cnlsZW47CisJaWYgKG5ld19kZW50cnlfaW5vZGUpCisJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihuZXdfZGVudHJ5X2lub2RlKTsKIAotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBvbGRfZGlyKTsKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgbmV3X2Rpcik7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG9sZF9pbm9kZSk7CisJd2hpbGUgKDEpIHsKKwkJLy8gbG9vayBmb3Igb2xkIG5hbWUgdXNpbmcgY29ycmVzcG9uZGluZyBlbnRyeSBrZXkgKGZvdW5kIGJ5IHJlaXNlcmZzX2ZpbmRfZW50cnkpCisJCWlmICgocmV0dmFsID0KKwkJICAgICBzZWFyY2hfYnlfZW50cnlfa2V5KG5ld19kaXItPmlfc2IsICZvbGRfZGUuZGVfZW50cnlfa2V5LAorCQkJCQkgJm9sZF9lbnRyeV9wYXRoLAorCQkJCQkgJm9sZF9kZSkpICE9IE5BTUVfRk9VTkQpIHsKKwkJCXBhdGhyZWxzZSgmb2xkX2VudHJ5X3BhdGgpOworCQkJam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAotICAgIGlmIChuZXdfZGVudHJ5X2lub2RlKSB7Ci0JaWYgKHNhdmVsaW5rID09IDApCi0JICAgIGFkZF9zYXZlX2xpbmsgKCZ0aCwgbmV3X2RlbnRyeV9pbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7Ci0JcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG5ld19kZW50cnlfaW5vZGUpOwotICAgIH0KKwkJY29weV9pdGVtX2hlYWQoJm9sZF9lbnRyeV9paCwgZ2V0X2loKCZvbGRfZW50cnlfcGF0aCkpOwogCi0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKKwkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIG9sZF9kZS5kZV9iaCwgMSk7CisKKwkJLy8gbG9vayBmb3IgbmV3IG5hbWUgYnkgcmVpc2VyZnNfZmluZF9lbnRyeQorCQluZXdfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwkJcmV0dmFsID0KKwkJICAgIHJlaXNlcmZzX2ZpbmRfZW50cnkobmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCW5ld19kZW50cnktPmRfbmFtZS5sZW4sICZuZXdfZW50cnlfcGF0aCwKKwkJCQkJJm5ld19kZSk7CisJCS8vIHJlaXNlcmZzX2FkZF9lbnRyeSBzaG91bGQgbm90IHJldHVybiBJT19FUlJPUiwgYmVjYXVzZSBpdCBpcyBjYWxsZWQgd2l0aCBlc3NlbnRpYWxseSBzYW1lIHBhcmFtZXRlcnMgZnJvbQorCQkvLyByZWlzZXJmc19hZGRfZW50cnkgYWJvdmUsIGFuZCB3ZSdsbCBjYXRjaCBhbnkgaS9vIGVycm9ycyBiZWZvcmUgd2UgZ2V0IGhlcmUuCisJCWlmIChyZXR2YWwgIT0gTkFNRV9GT1VORF9JTlZJU0lCTEUgJiYgcmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJCXBhdGhyZWxzZSgmbmV3X2VudHJ5X3BhdGgpOworCQkJcGF0aHJlbHNlKCZvbGRfZW50cnlfcGF0aCk7CisJCQlqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWNvcHlfaXRlbV9oZWFkKCZuZXdfZW50cnlfaWgsIGdldF9paCgmbmV3X2VudHJ5X3BhdGgpKTsKKworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoLCAxKTsKKworCQlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWlmICgocmV0dmFsID0KKwkJCSAgICAgc2VhcmNoX2J5X2VudHJ5X2tleShuZXdfZGlyLT5pX3NiLAorCQkJCQkJICZkb3RfZG90X2RlLmRlX2VudHJ5X2tleSwKKwkJCQkJCSAmZG90X2RvdF9lbnRyeV9wYXRoLAorCQkJCQkJICZkb3RfZG90X2RlKSkgIT0gTkFNRV9GT1VORCkgeworCQkJCXBhdGhyZWxzZSgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwkJCQlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKKwkJCQlwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKKwkJCQlqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJY29weV9pdGVtX2hlYWQoJmRvdF9kb3RfaWgsCisJCQkJICAgICAgIGdldF9paCgmZG90X2RvdF9lbnRyeV9wYXRoKSk7CisJCQkvLyBub2RlIGNvbnRhaW5pbmcgIi4uIiBnZXRzIGludG8gdHJhbnNhY3Rpb24KKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJICAgICBkb3RfZG90X2RlLmRlX2JoLCAxKTsKKwkJfQorCQkvKiB3ZSBzaG91bGQgY2hlY2sgc2VhbHMgaGVyZSwgbm90IGRvCisJCSAgIHRoaXMgc3R1ZmYsIHllcz8gVGhlbiwgaGF2aW5nCisJCSAgIGdhdGhlcmVkIGV2ZXJ5dGhpbmcgaW50byBSQU0gd2UKKwkJICAgc2hvdWxkIGxvY2sgdGhlIGJ1ZmZlcnMsIHllcz8gIC1IYW5zICovCisJCS8qIHByb2JhYmx5LiAgb3VyIHJlbmFtZSBuZWVkcyB0byBob2xkIG1vcmUgCisJCSAqKiB0aGFuIG9uZSBwYXRoIGF0IG9uY2UuICBUaGUgc2VhbHMgd291bGQgCisJCSAqKiBoYXZlIHRvIGJlIHdyaXR0ZW4gdG8gZGVhbCB3aXRoIG11bHRpLXBhdGggCisJCSAqKiBpc3N1ZXMgLWNocmlzCisJCSAqLworCQkvKiBzYW5pdHkgY2hlY2tpbmcgYmVmb3JlIGRvaW5nIHRoZSByZW5hbWUgLSBhdm9pZCByYWNlcyBtYW55CisJCSAqKiBvZiB0aGUgYWJvdmUgY2hlY2tzIGNvdWxkIGhhdmUgc2NoZWR1bGVkLiAgV2UgaGF2ZSB0byBiZQorCQkgKiogc3VyZSBvdXIgaXRlbXMgaGF2ZW4ndCBiZWVuIHNoaWZ0ZWQgYnkgYW5vdGhlciBwcm9jZXNzLgorCQkgKi8KKwkJaWYgKGl0ZW1fbW92ZWQoJm5ld19lbnRyeV9paCwgJm5ld19lbnRyeV9wYXRoKSB8fAorCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3QobmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCSAgICBuZXdfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCQkgICAgJm5ld19kZSwgbmV3X2RlbnRyeV9pbm9kZSkgfHwKKwkJICAgIGl0ZW1fbW92ZWQoJm9sZF9lbnRyeV9paCwgJm9sZF9lbnRyeV9wYXRoKSB8fAorCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3Qob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCSAgICBvbGRfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCQkgICAgJm9sZF9kZSwgb2xkX2lub2RlKSkgeworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJCSBuZXdfZGUuZGVfYmgpOworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJCSBvbGRfZGUuZGVfYmgpOworCQkJaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKQorCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKG9sZF9pbm9kZS0+CisJCQkJCQkJCSBpX3NiLAorCQkJCQkJCQkgZG90X2RvdF9kZS4KKwkJCQkJCQkJIGRlX2JoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgeworCQkJaWYgKGl0ZW1fbW92ZWQoJmRvdF9kb3RfaWgsICZkb3RfZG90X2VudHJ5X3BhdGgpIHx8CisJCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3QoIi4uIiwgMiwgJmRvdF9kb3RfZGUsCisJCQkJCQkgICAgb2xkX2RpcikpIHsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihvbGRfaW5vZGUtPgorCQkJCQkJCQkgaV9zYiwKKwkJCQkJCQkJIG9sZF9kZS5kZV9iaCk7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT4KKwkJCQkJCQkJIGlfc2IsCisJCQkJCQkJCSBuZXdfZGUuZGVfYmgpOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKG9sZF9pbm9kZS0+CisJCQkJCQkJCSBpX3NiLAorCQkJCQkJCQkgZG90X2RvdF9kZS4KKwkJCQkJCQkJIGRlX2JoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCVJGQUxTRShTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSAmJgorCQkgICAgICAgIWJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGRvdF9kb3RfZGUuZGVfYmgpLCAiIik7CisKKwkJYnJlYWs7CisJfQorCisJLyogb2ssIGFsbCB0aGUgY2hhbmdlcyBjYW4gYmUgZG9uZSBpbiBvbmUgZmVsbCBzd29vcCB3aGVuIHdlCisJICAgaGF2ZSBjbGFpbWVkIGFsbCB0aGUgYnVmZmVycyBuZWVkZWQuICovCisKKwltYXJrX2RlX3Zpc2libGUobmV3X2RlLmRlX2RlaCArIG5ld19kZS5kZV9lbnRyeV9udW0pOworCXNldF9pbm9faW5fZGlyX2VudHJ5KCZuZXdfZGUsIElOT0RFX1BLRVkob2xkX2lub2RlKSk7CisJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgb2xkX2Rpci0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKKworCW1hcmtfZGVfaGlkZGVuKG9sZF9kZS5kZV9kZWggKyBvbGRfZGUuZGVfZW50cnlfbnVtKTsKKwlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBvbGRfZGlyLT5pX3NiLCBvbGRfZGUuZGVfYmgpOworCWN0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IGN0aW1lOworCW5ld19kaXItPmlfY3RpbWUgPSBuZXdfZGlyLT5pX210aW1lID0gY3RpbWU7CisJLyogdGhhbmtzIHRvIEFsZXggQWRyaWFhbnNlIDxhbGV4X2FAY2FsdGVjaC5lZHU+IGZvciBwYXRjaCB3aGljaCBhZGRzIGN0aW1lIHVwZGF0ZSBvZgorCSAgIHJlbmFtZWQgb2JqZWN0ICovCisJb2xkX2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CisKKwlpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCQkvLyBhZGp1c3QgbGluayBudW1iZXIgb2YgdGhlIHZpY3RpbQorCQlpZiAoU19JU0RJUihuZXdfZGVudHJ5X2lub2RlLT5pX21vZGUpKSB7CisJCQluZXdfZGVudHJ5X2lub2RlLT5pX25saW5rID0gMDsKKwkJfSBlbHNlIHsKKwkJCW5ld19kZW50cnlfaW5vZGUtPmlfbmxpbmstLTsKKwkJfQorCQluZXdfZGVudHJ5X2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CisJCXNhdmVsaW5rID0gbmV3X2RlbnRyeV9pbm9kZS0+aV9ubGluazsKKwl9CisKKwlpZiAoU19JU0RJUihvbGRfaW5vZGVfbW9kZSkpIHsKKwkJLy8gYWRqdXN0ICIuLiIgb2YgcmVuYW1lZCBkaXJlY3RvcnkgCisJCXNldF9pbm9faW5fZGlyX2VudHJ5KCZkb3RfZG90X2RlLCBJTk9ERV9QS0VZKG5ld19kaXIpKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgbmV3X2Rpci0+aV9zYiwgZG90X2RvdF9kZS5kZV9iaCk7CisKKwkJaWYgKCFuZXdfZGVudHJ5X2lub2RlKQorCQkJLyogdGhlcmUgKGluIG5ld19kaXIpIHdhcyBubyBkaXJlY3RvcnksIHNvIGl0IGdvdCBuZXcgbGluaworCQkJICAgKCIuLiIgIG9mIHJlbmFtZWQgZGlyZWN0b3J5KSAqLworCQkJSU5DX0RJUl9JTk9ERV9OTElOSyhuZXdfZGlyKTsKKworCQkvKiBvbGQgZGlyZWN0b3J5IGxvc3Qgb25lIGxpbmsgLSAiLi4gIiBvZiByZW5hbWVkIGRpcmVjdG9yeSAqLworCQlERUNfRElSX0lOT0RFX05MSU5LKG9sZF9kaXIpOworCX0KKwkvLyBsb29rcyBsaWtlIGluIDIuMy45OXByZTMgYnJlbHNlIGlzIGF0b21pYy4gc28gd2UgY2FuIHVzZSBwYXRocmVsc2UKKwlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKKwlwYXRocmVsc2UoJmRvdF9kb3RfZW50cnlfcGF0aCk7CisKKwkvLyBGSVhNRTogdGhpcyByZWlzZXJmc19jdXRfZnJvbV9pdGVtJ3MgcmV0dXJuIHZhbHVlIG1heSBzY3JldyB1cAorCS8vIGFueWJvZHksIGJ1dCBpdCB3aWxsIHBhbmljIGlmIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCB0aGUKKwkvLyBlbnRyeS4gVGhpcyBuZWVkcyBvbmUgbW9yZSBjbGVhbiB1cAorCWlmIChyZWlzZXJmc19jdXRfZnJvbV9pdGVtCisJICAgICgmdGgsICZvbGRfZW50cnlfcGF0aCwgJihvbGRfZGUuZGVfZW50cnlfa2V5KSwgb2xkX2RpciwgTlVMTCwKKwkgICAgIDApIDwgMCkKKwkJcmVpc2VyZnNfd2FybmluZyhvbGRfZGlyLT5pX3NiLAorCQkJCSAidnMtNzA2MDogcmVpc2VyZnNfcmVuYW1lOiBjb3VsZG4ndCBub3QgY3V0IG9sZCBuYW1lLiBGc2NrIGxhdGVyPyIpOworCisJb2xkX2Rpci0+aV9zaXplIC09IERFSF9TSVpFICsgb2xkX2RlLmRlX2VudHJ5bGVuOworCisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgb2xkX2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgbmV3X2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgb2xkX2lub2RlKTsKKworCWlmIChuZXdfZGVudHJ5X2lub2RlKSB7CisJCWlmIChzYXZlbGluayA9PSAwKQorCQkJYWRkX3NhdmVfbGluaygmdGgsIG5ld19kZW50cnlfaW5vZGUsCisJCQkJICAgICAgMCAvKiBub3QgdHJ1bmNhdGUgKi8gKTsKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgbmV3X2RlbnRyeV9pbm9kZSk7CisJfQorCisJcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgogICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KICAqLwogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0gIC8vJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zLAkvKiBkZWZhdWx0X2ZpbGVfb3BzICovCi0gICAgLmNyZWF0ZQk9IHJlaXNlcmZzX2NyZWF0ZSwKLSAgICAubG9va3VwCT0gcmVpc2VyZnNfbG9va3VwLAotICAgIC5saW5rCT0gcmVpc2VyZnNfbGluaywKLSAgICAudW5saW5rCT0gcmVpc2VyZnNfdW5saW5rLAotICAgIC5zeW1saW5rCT0gcmVpc2VyZnNfc3ltbGluaywKLSAgICAubWtkaXIJPSByZWlzZXJmc19ta2RpciwKLSAgICAucm1kaXIJPSByZWlzZXJmc19ybWRpciwKLSAgICAubWtub2QJPSByZWlzZXJmc19ta25vZCwKLSAgICAucmVuYW1lCT0gcmVpc2VyZnNfcmVuYW1lLAotICAgIC5zZXRhdHRyICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKLSAgICAuc2V0eGF0dHIgICA9IHJlaXNlcmZzX3NldHhhdHRyLAotICAgIC5nZXR4YXR0ciAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCi0gICAgLmxpc3R4YXR0ciAgPSByZWlzZXJmc19saXN0eGF0dHIsCi0gICAgLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCi0gICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKKwkvLyZyZWlzZXJmc19kaXJfb3BlcmF0aW9ucywgICAvKiBkZWZhdWx0X2ZpbGVfb3BzICovCisJLmNyZWF0ZSA9IHJlaXNlcmZzX2NyZWF0ZSwKKwkubG9va3VwID0gcmVpc2VyZnNfbG9va3VwLAorCS5saW5rID0gcmVpc2VyZnNfbGluaywKKwkudW5saW5rID0gcmVpc2VyZnNfdW5saW5rLAorCS5zeW1saW5rID0gcmVpc2VyZnNfc3ltbGluaywKKwkubWtkaXIgPSByZWlzZXJmc19ta2RpciwKKwkucm1kaXIgPSByZWlzZXJmc19ybWRpciwKKwkubWtub2QgPSByZWlzZXJmc19ta25vZCwKKwkucmVuYW1lID0gcmVpc2VyZnNfcmVuYW1lLAorCS5zZXRhdHRyID0gcmVpc2VyZnNfc2V0YXR0ciwKKwkuc2V0eGF0dHIgPSByZWlzZXJmc19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSByZWlzZXJmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyID0gcmVpc2VyZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAorCS5wZXJtaXNzaW9uID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKIH07CiAKIC8qCkBAIC0xNDY3LDI4ICsxNTU0LDI3IEBACiAgKiBzdHVmZiBhZGRlZAogICovCiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0gICAgLnJlYWRsaW5rICAgICAgID0gZ2VuZXJpY19yZWFkbGluaywKLSAgICAuZm9sbG93X2xpbmsgICAgPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAotICAgIC5wdXRfbGluayAgICAgICA9IHBhZ2VfcHV0X2xpbmssCi0gICAgLnNldGF0dHIgICAgICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKLSAgICAuc2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19zZXR4YXR0ciwKLSAgICAuZ2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19nZXR4YXR0ciwKLSAgICAubGlzdHhhdHRyICAgICAgPSByZWlzZXJmc19saXN0eGF0dHIsCi0gICAgLnJlbW92ZXhhdHRyICAgID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCi0gICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKKwkucmVhZGxpbmsgPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluayA9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rID0gcGFnZV9wdXRfbGluaywKKwkuc2V0YXR0ciA9IHJlaXNlcmZzX3NldGF0dHIsCisJLnNldHhhdHRyID0gcmVpc2VyZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyID0gcmVpc2VyZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0ciA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKKwkucGVybWlzc2lvbiA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCiAKIH07CiAKLQogLyoKICAqIHNwZWNpYWwgZmlsZSBvcGVyYXRpb25zLi4ganVzdCB4YXR0ci9hY2wgc3R1ZmYKICAqLwogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0gewotICAgIC5zZXRhdHRyICAgICAgICA9IHJlaXNlcmZzX3NldGF0dHIsCi0gICAgLnNldHhhdHRyICAgICAgID0gcmVpc2VyZnNfc2V0eGF0dHIsCi0gICAgLmdldHhhdHRyICAgICAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCi0gICAgLmxpc3R4YXR0ciAgICAgID0gcmVpc2VyZnNfbGlzdHhhdHRyLAotICAgIC5yZW1vdmV4YXR0ciAgICA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAotICAgIC5wZXJtaXNzaW9uICAgICA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCisJLnNldGF0dHIgPSByZWlzZXJmc19zZXRhdHRyLAorCS5zZXR4YXR0ciA9IHJlaXNlcmZzX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IHJlaXNlcmZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIgPSByZWlzZXJmc19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCisJLnBlcm1pc3Npb24gPSByZWlzZXJmc19wZXJtaXNzaW9uLAogCiB9OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvb2JqZWN0aWQuYyBiL2ZzL3JlaXNlcmZzL29iamVjdGlkLmMKaW5kZXggYmZlOGUyNS4uZjYyNTkwYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvb2JqZWN0aWQuYworKysgYi9mcy9yZWlzZXJmcy9vYmplY3RpZC5jCkBAIC0xNCwyNCArMTQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAoX19sZTMyICopKChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKikocnMpICsgMSkgOlwKIAkJCSAoX19sZTMyICopKChycykgKyAxKSkKIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCiAKLXN0YXRpYyB2b2lkIGNoZWNrX29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgX19sZTMyICogbWFwKQorc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0aWRfbWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgX19sZTMyICogbWFwKQogewotICAgIGlmIChsZTMyX3RvX2NwdSAobWFwWzBdKSAhPSAxKQotCXJlaXNlcmZzX3BhbmljIChzLCAidnMtMTUwMTA6IGNoZWNrX29iamVjdGlkX21hcDogbWFwIGNvcnJ1cHRlZDogJWx4IiwKLQkJCSggbG9uZyB1bnNpZ25lZCBpbnQgKSBsZTMyX3RvX2NwdSAobWFwWzBdKSk7CisJaWYgKGxlMzJfdG9fY3B1KG1hcFswXSkgIT0gMSkKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAidnMtMTUwMTA6IGNoZWNrX29iamVjdGlkX21hcDogbWFwIGNvcnJ1cHRlZDogJWx4IiwKKwkJCSAgICAgICAobG9uZyB1bnNpZ25lZCBpbnQpbGUzMl90b19jcHUobWFwWzBdKSk7CiAKLSAgICAvLyBGSVhNRTogYWRkIHNvbWV0aGluZyBlbHNlIGhlcmUKKwkvLyBGSVhNRTogYWRkIHNvbWV0aGluZyBlbHNlIGhlcmUKIH0KIAogI2Vsc2UKLXN0YXRpYyB2b2lkIGNoZWNrX29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgX19sZTMyICogbWFwKQotezt9CitzdGF0aWMgdm9pZCBjaGVja19vYmplY3RpZF9tYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBfX2xlMzIgKiBtYXApCit7OworfQogI2VuZGlmCiAKLQogLyogV2hlbiB3ZSBhbGxvY2F0ZSBvYmplY3RpZHMgd2UgYWxsb2NhdGUgdGhlIGZpcnN0IHVudXNlZCBvYmplY3RpZC4KICAgIEVhY2ggc2VxdWVuY2Ugb2Ygb2JqZWN0aWRzIGluIHVzZSAodGhlIG9kZCBzZXF1ZW5jZXMpIGlzIGZvbGxvd2VkCiAgICBieSBhIHNlcXVlbmNlIG9mIG9iamVjdGlkcyBub3QgaW4gdXNlICh0aGUgZXZlbiBzZXF1ZW5jZXMpLiAgV2UKQEAgLTQ2LDE2MSArNDYsMTYyIEBACiAgICBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb25zIG9mIGxheW91dCBjb3VsZCByZXN1bHQgZnJvbSBjb21wbGljYXRpbmcKICAgIG9iamVjdGlkIGFzc2lnbm1lbnQsIGJ1dCB3ZSBoYXZlIGRlZmVycmVkIG1ha2luZyB0aGVtIGZvciBub3cuICovCiAKLQogLyogZ2V0IHVuaXF1ZSBvYmplY3QgaWRlbnRpZmllciAqLwotX191MzIgcmVpc2VyZnNfZ2V0X3VudXNlZF9vYmplY3RpZCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCitfX3UzMiByZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAgIF9fbGUzMiAqIG1hcCA9IG9iamVjdGlkX21hcCAocywgcnMpOwotICAgIF9fdTMyIHVudXNlZF9vYmplY3RpZDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlfX2xlMzIgKm1hcCA9IG9iamVjdGlkX21hcChzLCBycyk7CisJX191MzIgdW51c2VkX29iamVjdGlkOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgY2hlY2tfb2JqZWN0aWRfbWFwIChzLCBtYXApOworCWNoZWNrX29iamVjdGlkX21hcChzLCBtYXApOwogCi0gICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50IG5lZWRlZCAtSGFucyAqLwotICAgIHVudXNlZF9vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChtYXBbMV0pOwotICAgIGlmICh1bnVzZWRfb2JqZWN0aWQgPT0gVTMyX01BWCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICIlczogbm8gbW9yZSBvYmplY3QgaWRzIiwgX19GVU5DVElPTl9fKTsKLQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSkgOwotCXJldHVybiAwOwotICAgIH0KKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKTsKKwkvKiBjb21tZW50IG5lZWRlZCAtSGFucyAqLworCXVudXNlZF9vYmplY3RpZCA9IGxlMzJfdG9fY3B1KG1hcFsxXSk7CisJaWYgKHVudXNlZF9vYmplY3RpZCA9PSBVMzJfTUFYKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgIiVzOiBubyBtb3JlIG9iamVjdCBpZHMiLCBfX0ZVTkNUSU9OX18pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCXJldHVybiAwOworCX0KIAotICAgIC8qIFRoaXMgaW5jcmVtZW50YXRpb24gYWxsb2NhdGVzIHRoZSBmaXJzdCB1bnVzZWQgb2JqZWN0aWQuIFRoYXQKLSAgICAgICBpcyB0byBzYXksIHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgb2JqZWN0aWQgbWFwIGlzIHRoZSBmaXJzdAotICAgICAgIHVudXNlZCBvYmplY3RpZCwgYW5kIGJ5IGluY3JlbWVudGluZyBpdCB3ZSB1c2UgaXQuICBTZWUgYmVsb3cKLSAgICAgICB3aGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgd2UgZWxpbWluYXRlZCBhIHNlcXVlbmNlIG9mIHVudXNlZAotICAgICAgIG9iamVjdGlkcy4uLi4gKi8KLSAgICBtYXBbMV0gPSBjcHVfdG9fbGUzMiAodW51c2VkX29iamVjdGlkICsgMSk7CisJLyogVGhpcyBpbmNyZW1lbnRhdGlvbiBhbGxvY2F0ZXMgdGhlIGZpcnN0IHVudXNlZCBvYmplY3RpZC4gVGhhdAorCSAgIGlzIHRvIHNheSwgdGhlIGZpcnN0IGVudHJ5IG9uIHRoZSBvYmplY3RpZCBtYXAgaXMgdGhlIGZpcnN0CisJICAgdW51c2VkIG9iamVjdGlkLCBhbmQgYnkgaW5jcmVtZW50aW5nIGl0IHdlIHVzZSBpdC4gIFNlZSBiZWxvdworCSAgIHdoZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBlbGltaW5hdGVkIGEgc2VxdWVuY2Ugb2YgdW51c2VkCisJICAgb2JqZWN0aWRzLi4uLiAqLworCW1hcFsxXSA9IGNwdV90b19sZTMyKHVudXNlZF9vYmplY3RpZCArIDEpOwogCi0gICAgLyogTm93IHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBlbGltaW5hdGVkIHRoZSBsYXN0IHJlbWFpbmluZyBtZW1iZXIgb2YKLSAgICAgICB0aGUgZmlyc3QgZXZlbiBzZXF1ZW5jZSAoYW5kIGNhbiBlbGltaW5hdGUgdGhlIHNlcXVlbmNlIGJ5Ci0gICAgICAgZWxpbWluYXRpbmcgaXRzIGxhc3Qgb2JqZWN0aWQgZnJvbSBvaWRzKSwgYW5kIGNhbiBjb2xsYXBzZSB0aGUKLSAgICAgICBmaXJzdCB0d28gb2RkIHNlcXVlbmNlcyBpbnRvIG9uZSBzZXF1ZW5jZS4gIElmIHNvLCB0aGVuIHRoZSBuZXQKLSAgICAgICByZXN1bHQgaXMgdG8gZWxpbWluYXRlIGEgcGFpciBvZiBvYmplY3RpZHMgZnJvbSBvaWRzLiAgV2UgZG8gdGhpcwotICAgICAgIGJ5IHNoaWZ0aW5nIHRoZSBlbnRpcmUgbWFwIHRvIHRoZSBsZWZ0LiAqLwotICAgIGlmIChzYl9vaWRfY3Vyc2l6ZShycykgPiAyICYmIG1hcFsxXSA9PSBtYXBbMl0pIHsKLQltZW1tb3ZlIChtYXAgKyAxLCBtYXAgKyAzLCAoc2Jfb2lkX2N1cnNpemUocnMpIC0gMykgKiBzaXplb2YoX191MzIpKTsKLSAgICAgICAgc2V0X3NiX29pZF9jdXJzaXplKCBycywgc2Jfb2lkX2N1cnNpemUocnMpIC0gMiApOwotICAgIH0KKwkvKiBOb3cgd2UgY2hlY2sgdG8gc2VlIGlmIHdlIGVsaW1pbmF0ZWQgdGhlIGxhc3QgcmVtYWluaW5nIG1lbWJlciBvZgorCSAgIHRoZSBmaXJzdCBldmVuIHNlcXVlbmNlIChhbmQgY2FuIGVsaW1pbmF0ZSB0aGUgc2VxdWVuY2UgYnkKKwkgICBlbGltaW5hdGluZyBpdHMgbGFzdCBvYmplY3RpZCBmcm9tIG9pZHMpLCBhbmQgY2FuIGNvbGxhcHNlIHRoZQorCSAgIGZpcnN0IHR3byBvZGQgc2VxdWVuY2VzIGludG8gb25lIHNlcXVlbmNlLiAgSWYgc28sIHRoZW4gdGhlIG5ldAorCSAgIHJlc3VsdCBpcyB0byBlbGltaW5hdGUgYSBwYWlyIG9mIG9iamVjdGlkcyBmcm9tIG9pZHMuICBXZSBkbyB0aGlzCisJICAgYnkgc2hpZnRpbmcgdGhlIGVudGlyZSBtYXAgdG8gdGhlIGxlZnQuICovCisJaWYgKHNiX29pZF9jdXJzaXplKHJzKSA+IDIgJiYgbWFwWzFdID09IG1hcFsyXSkgeworCQltZW1tb3ZlKG1hcCArIDEsIG1hcCArIDMsCisJCQkoc2Jfb2lkX2N1cnNpemUocnMpIC0gMykgKiBzaXplb2YoX191MzIpKTsKKwkJc2V0X3NiX29pZF9jdXJzaXplKHJzLCBzYl9vaWRfY3Vyc2l6ZShycykgLSAyKTsKKwl9CiAKLSAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgcmV0dXJuIHVudXNlZF9vYmplY3RpZDsKKwlqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwlyZXR1cm4gdW51c2VkX29iamVjdGlkOwogfQogCi0KIC8qIG1ha2VzIG9iamVjdCBpZGVudGlmaWVyIHVudXNlZCAqLwotdm9pZCByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJX191MzIgb2JqZWN0aWRfdG9fcmVsZWFzZSkKK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBfX3UzMiBvYmplY3RpZF90b19yZWxlYXNlKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAgIF9fbGUzMiAqIG1hcCA9IG9iamVjdGlkX21hcCAocywgcnMpOwotICAgIGludCBpID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlfX2xlMzIgKm1hcCA9IG9iamVjdGlkX21hcChzLCBycyk7CisJaW50IGkgPSAwOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAgIC8vcmV0dXJuOwotICAgIGNoZWNrX29iamVjdGlkX21hcCAocywgbWFwKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwkvL3JldHVybjsKKwljaGVja19vYmplY3RpZF9tYXAocywgbWFwKTsKIAotICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKLSAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7IAorCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOworCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOwogCi0gICAgLyogc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0aWQgbWFwIChpID0gMCkgYW5kIGdvIHRvCi0gICAgICAgdGhlIGVuZCBvZiBpdCAoaSA9IGRpc2tfc2ItPnNfb2lkX2N1cnNpemUpLiAgTGluZWFyIHNlYXJjaCBpcwotICAgICAgIHdoYXQgd2UgdXNlLCB0aG91Z2ggaXQgaXMgcG9zc2libGUgdGhhdCBiaW5hcnkgc2VhcmNoIHdvdWxkIGJlCi0gICAgICAgbW9yZSBlZmZpY2llbnQgYWZ0ZXIgcGVyZm9ybWluZyBsb3RzIG9mIGRlbGV0aW9ucyAod2hpY2ggaXMKLSAgICAgICB3aGVuIG9pZHMgaXMgbGFyZ2UuKSAgV2Ugb25seSBjaGVjayBldmVuIGkncy4gKi8KLSAgICB3aGlsZSAoaSA8IHNiX29pZF9jdXJzaXplKHJzKSkgewotCWlmIChvYmplY3RpZF90b19yZWxlYXNlID09IGxlMzJfdG9fY3B1IChtYXBbaV0pKSB7Ci0JICAgIC8qIFRoaXMgaW5jcmVtZW50YXRpb24gdW5hbGxvY2F0ZXMgdGhlIG9iamVjdGlkLiAqLwotCSAgICAvL21hcFtpXSsrOwotCSAgICBtYXBbaV0gPSBjcHVfdG9fbGUzMiAobGUzMl90b19jcHUgKG1hcFtpXSkgKyAxKTsKKwkvKiBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3RpZCBtYXAgKGkgPSAwKSBhbmQgZ28gdG8KKwkgICB0aGUgZW5kIG9mIGl0IChpID0gZGlza19zYi0+c19vaWRfY3Vyc2l6ZSkuICBMaW5lYXIgc2VhcmNoIGlzCisJICAgd2hhdCB3ZSB1c2UsIHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0aGF0IGJpbmFyeSBzZWFyY2ggd291bGQgYmUKKwkgICBtb3JlIGVmZmljaWVudCBhZnRlciBwZXJmb3JtaW5nIGxvdHMgb2YgZGVsZXRpb25zICh3aGljaCBpcworCSAgIHdoZW4gb2lkcyBpcyBsYXJnZS4pICBXZSBvbmx5IGNoZWNrIGV2ZW4gaSdzLiAqLworCXdoaWxlIChpIDwgc2Jfb2lkX2N1cnNpemUocnMpKSB7CisJCWlmIChvYmplY3RpZF90b19yZWxlYXNlID09IGxlMzJfdG9fY3B1KG1hcFtpXSkpIHsKKwkJCS8qIFRoaXMgaW5jcmVtZW50YXRpb24gdW5hbGxvY2F0ZXMgdGhlIG9iamVjdGlkLiAqLworCQkJLy9tYXBbaV0rKzsKKwkJCW1hcFtpXSA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KG1hcFtpXSkgKyAxKTsKIAotCSAgICAvKiBEaWQgd2UgdW5hbGxvY2F0ZSB0aGUgbGFzdCBtZW1iZXIgb2YgYW4gb2RkIHNlcXVlbmNlLCBhbmQgY2FuIHNocmluayBvaWRzPyAqLwotCSAgICBpZiAobWFwW2ldID09IG1hcFtpKzFdKSB7Ci0JCS8qIHNocmluayBvYmplY3RpZCBtYXAgKi8KLQkJbWVtbW92ZSAobWFwICsgaSwgbWFwICsgaSArIDIsIAotCQkJIChzYl9vaWRfY3Vyc2l6ZShycykgLSBpIC0gMikgKiBzaXplb2YgKF9fdTMyKSk7Ci0JCS8vZGlza19zYi0+c19vaWRfY3Vyc2l6ZSAtPSAyOwotICAgICAgICAgICAgICAgIHNldF9zYl9vaWRfY3Vyc2l6ZSggcnMsIHNiX29pZF9jdXJzaXplKHJzKSAtIDIgKTsKKwkJCS8qIERpZCB3ZSB1bmFsbG9jYXRlIHRoZSBsYXN0IG1lbWJlciBvZiBhbiBvZGQgc2VxdWVuY2UsIGFuZCBjYW4gc2hyaW5rIG9pZHM/ICovCisJCQlpZiAobWFwW2ldID09IG1hcFtpICsgMV0pIHsKKwkJCQkvKiBzaHJpbmsgb2JqZWN0aWQgbWFwICovCisJCQkJbWVtbW92ZShtYXAgKyBpLCBtYXAgKyBpICsgMiwKKwkJCQkJKHNiX29pZF9jdXJzaXplKHJzKSAtIGkgLQorCQkJCQkgMikgKiBzaXplb2YoX191MzIpKTsKKwkJCQkvL2Rpc2tfc2ItPnNfb2lkX2N1cnNpemUgLT0gMjsKKwkJCQlzZXRfc2Jfb2lkX2N1cnNpemUocnMsIHNiX29pZF9jdXJzaXplKHJzKSAtIDIpOwogCi0JCVJGQUxTRSggc2Jfb2lkX2N1cnNpemUocnMpIDwgMiB8fCAKLQkJICAgICAgICBzYl9vaWRfY3Vyc2l6ZShycykgPiBzYl9vaWRfbWF4c2l6ZShycyksCi0JCSAgICAgICAgInZzLTE1MDA1OiBvYmplY3RpZCBtYXAgY29ycnVwdGVkIGN1cl9zaXplID09ICVkIChtYXggPT0gJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiX29pZF9jdXJzaXplKHJzKSwgc2Jfb2lkX21heHNpemUocnMpKTsKLQkgICAgfQotCSAgICByZXR1cm47CisJCQkJUkZBTFNFKHNiX29pZF9jdXJzaXplKHJzKSA8IDIgfHwKKwkJCQkgICAgICAgc2Jfb2lkX2N1cnNpemUocnMpID4gc2Jfb2lkX21heHNpemUocnMpLAorCQkJCSAgICAgICAidnMtMTUwMDU6IG9iamVjdGlkIG1hcCBjb3JydXB0ZWQgY3VyX3NpemUgPT0gJWQgKG1heCA9PSAlZCkiLAorCQkJCSAgICAgICBzYl9vaWRfY3Vyc2l6ZShycyksIHNiX29pZF9tYXhzaXplKHJzKSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAob2JqZWN0aWRfdG9fcmVsZWFzZSA+IGxlMzJfdG9fY3B1KG1hcFtpXSkgJiYKKwkJICAgIG9iamVjdGlkX3RvX3JlbGVhc2UgPCBsZTMyX3RvX2NwdShtYXBbaSArIDFdKSkgeworCQkJLyogc2l6ZSBvZiBvYmplY3RpZCBtYXAgaXMgbm90IGNoYW5nZWQgKi8KKwkJCWlmIChvYmplY3RpZF90b19yZWxlYXNlICsgMSA9PSBsZTMyX3RvX2NwdShtYXBbaSArIDFdKSkgeworCQkJCS8vb2JqZWN0aWRfbWFwW2krMV0tLTsKKwkJCQltYXBbaSArIDFdID0KKwkJCQkgICAgY3B1X3RvX2xlMzIobGUzMl90b19jcHUobWFwW2kgKyAxXSkgLSAxKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8qIEpETSBjb21wYXJpbmcgdHdvIGxpdHRsZS1lbmRpYW4gdmFsdWVzIGZvciBlcXVhbGl0eSAtLSBzYWZlICovCisJCQlpZiAoc2Jfb2lkX2N1cnNpemUocnMpID09IHNiX29pZF9tYXhzaXplKHJzKSkgeworCQkJCS8qIG9iamVjdGlkIG1hcCBtdXN0IGJlIGV4cGFuZGVkLCBidXQgdGhlcmUgaXMgbm8gc3BhY2UgKi8KKwkJCQlQUk9DX0lORk9fSU5DKHMsIGxlYWtlZF9vaWQpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLyogZXhwYW5kIHRoZSBvYmplY3RpZCBtYXAgKi8KKwkJCW1lbW1vdmUobWFwICsgaSArIDMsIG1hcCArIGkgKyAxLAorCQkJCShzYl9vaWRfY3Vyc2l6ZShycykgLSBpIC0gMSkgKiBzaXplb2YoX191MzIpKTsKKwkJCW1hcFtpICsgMV0gPSBjcHVfdG9fbGUzMihvYmplY3RpZF90b19yZWxlYXNlKTsKKwkJCW1hcFtpICsgMl0gPSBjcHVfdG9fbGUzMihvYmplY3RpZF90b19yZWxlYXNlICsgMSk7CisJCQlzZXRfc2Jfb2lkX2N1cnNpemUocnMsIHNiX29pZF9jdXJzaXplKHJzKSArIDIpOworCQkJcmV0dXJuOworCQl9CisJCWkgKz0gMjsKIAl9CiAKLQlpZiAob2JqZWN0aWRfdG9fcmVsZWFzZSA+IGxlMzJfdG9fY3B1IChtYXBbaV0pICYmIAotCSAgICBvYmplY3RpZF90b19yZWxlYXNlIDwgbGUzMl90b19jcHUgKG1hcFtpICsgMV0pKSB7Ci0JICAgIC8qIHNpemUgb2Ygb2JqZWN0aWQgbWFwIGlzIG5vdCBjaGFuZ2VkICovCi0JICAgIGlmIChvYmplY3RpZF90b19yZWxlYXNlICsgMSA9PSBsZTMyX3RvX2NwdSAobWFwW2kgKyAxXSkpIHsKLQkJLy9vYmplY3RpZF9tYXBbaSsxXS0tOwotCQltYXBbaSArIDFdID0gY3B1X3RvX2xlMzIgKGxlMzJfdG9fY3B1IChtYXBbaSArIDFdKSAtIDEpOwotCQlyZXR1cm47Ci0JICAgIH0KLQotICAgICAgICAgICAgLyogSkRNIGNvbXBhcmluZyB0d28gbGl0dGxlLWVuZGlhbiB2YWx1ZXMgZm9yIGVxdWFsaXR5IC0tIHNhZmUgKi8KLQlpZiAoc2Jfb2lkX2N1cnNpemUocnMpID09IHNiX29pZF9tYXhzaXplKHJzKSkgewotCQkvKiBvYmplY3RpZCBtYXAgbXVzdCBiZSBleHBhbmRlZCwgYnV0IHRoZXJlIGlzIG5vIHNwYWNlICovCi0JCVBST0NfSU5GT19JTkMoIHMsIGxlYWtlZF9vaWQgKTsKLQkJcmV0dXJuOwotCX0KLQotCSAgICAvKiBleHBhbmQgdGhlIG9iamVjdGlkIG1hcCovCi0JICAgIG1lbW1vdmUgKG1hcCArIGkgKyAzLCBtYXAgKyBpICsgMSwgCi0JCSAgICAgKHNiX29pZF9jdXJzaXplKHJzKSAtIGkgLSAxKSAqIHNpemVvZihfX3UzMikpOwotCSAgICBtYXBbaSArIDFdID0gY3B1X3RvX2xlMzIgKG9iamVjdGlkX3RvX3JlbGVhc2UpOwotCSAgICBtYXBbaSArIDJdID0gY3B1X3RvX2xlMzIgKG9iamVjdGlkX3RvX3JlbGVhc2UgKyAxKTsKLSAgICAgICAgICAgIHNldF9zYl9vaWRfY3Vyc2l6ZSggcnMsIHNiX29pZF9jdXJzaXplKHJzKSArIDIgKTsKLQkgICAgcmV0dXJuOwotCX0KLQlpICs9IDI7Ci0gICAgfQotCi0gICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTE1MDExOiByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkOiB0cmllZCB0byBmcmVlIGZyZWUgb2JqZWN0IGlkICglbHUpIiwKLQkJICAgICAgKCBsb25nIHVuc2lnbmVkICkgb2JqZWN0aWRfdG9fcmVsZWFzZSk7CisJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJICJ2cy0xNTAxMTogcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZDogdHJpZWQgdG8gZnJlZSBmcmVlIG9iamVjdCBpZCAoJWx1KSIsCisJCQkgKGxvbmcgdW5zaWduZWQpb2JqZWN0aWRfdG9fcmVsZWFzZSk7CiB9CiAKK2ludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpkaXNrX3NiID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlpbnQgY3VyX3NpemUgPSBzYl9vaWRfY3Vyc2l6ZShkaXNrX3NiKTsKKwlpbnQgbmV3X3NpemUgPSAocy0+c19ibG9ja3NpemUgLSBTQl9TSVpFKSAvIHNpemVvZihfX3UzMikgLyAyICogMjsKKwlpbnQgb2xkX21heCA9IHNiX29pZF9tYXhzaXplKGRpc2tfc2IpOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSAqZGlza19zYl92MTsKKwlfX2xlMzIgKm9iamVjdGlkX21hcCwgKm5ld19vYmplY3RpZF9tYXA7CisJaW50IGk7CiAKLWludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc2IgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLSAgICBpbnQgY3VyX3NpemUgPSBzYl9vaWRfY3Vyc2l6ZShkaXNrX3NiKTsKLSAgICBpbnQgbmV3X3NpemUgPSAocy0+c19ibG9ja3NpemUgLSBTQl9TSVpFKSAvIHNpemVvZihfX3UzMikgLyAyICogMiA7Ci0gICAgaW50IG9sZF9tYXggPSBzYl9vaWRfbWF4c2l6ZShkaXNrX3NiKTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKmRpc2tfc2JfdjEgOwotICAgIF9fbGUzMiAqb2JqZWN0aWRfbWFwLCAqbmV3X29iamVjdGlkX21hcCA7Ci0gICAgaW50IGkgOworCWRpc2tfc2JfdjEgPQorCSAgICAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICopKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2RhdGEpOworCW9iamVjdGlkX21hcCA9IChfX2xlMzIgKikgKGRpc2tfc2JfdjEgKyAxKTsKKwluZXdfb2JqZWN0aWRfbWFwID0gKF9fbGUzMiAqKSAoZGlza19zYiArIDEpOwogCi0gICAgZGlza19zYl92MT0oc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICopKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2RhdGEpOwotICAgIG9iamVjdGlkX21hcCA9IChfX2xlMzIgKikoZGlza19zYl92MSArIDEpIDsKLSAgICBuZXdfb2JqZWN0aWRfbWFwID0gKF9fbGUzMiAqKShkaXNrX3NiICsgMSkgOworCWlmIChjdXJfc2l6ZSA+IG5ld19zaXplKSB7CisJCS8qIG1hcmsgZXZlcnlvbmUgdXNlZCB0aGF0IHdhcyBsaXN0ZWQgYXMgZnJlZSBhdCB0aGUgZW5kIG9mIHRoZSBvYmplY3RpZAorCQkgKiogbWFwIAorCQkgKi8KKwkJb2JqZWN0aWRfbWFwW25ld19zaXplIC0gMV0gPSBvYmplY3RpZF9tYXBbY3VyX3NpemUgLSAxXTsKKwkJc2V0X3NiX29pZF9jdXJzaXplKGRpc2tfc2IsIG5ld19zaXplKTsKKwl9CisJLyogbW92ZSB0aGUgc21hbGxlciBvYmplY3RpZCBtYXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBuZXcgc3VwZXIgKi8KKwlmb3IgKGkgPSBuZXdfc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCW9iamVjdGlkX21hcFtpICsgKG9sZF9tYXggLSBuZXdfc2l6ZSldID0gb2JqZWN0aWRfbWFwW2ldOworCX0KIAotICAgIGlmIChjdXJfc2l6ZSA+IG5ld19zaXplKSB7Ci0JLyogbWFyayBldmVyeW9uZSB1c2VkIHRoYXQgd2FzIGxpc3RlZCBhcyBmcmVlIGF0IHRoZSBlbmQgb2YgdGhlIG9iamVjdGlkCi0JKiogbWFwIAotCSovCi0Jb2JqZWN0aWRfbWFwW25ld19zaXplIC0gMV0gPSBvYmplY3RpZF9tYXBbY3VyX3NpemUgLSAxXSA7Ci0Jc2V0X3NiX29pZF9jdXJzaXplKGRpc2tfc2IsbmV3X3NpemUpIDsKLSAgICB9Ci0gICAgLyogbW92ZSB0aGUgc21hbGxlciBvYmplY3RpZCBtYXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBuZXcgc3VwZXIgKi8KLSAgICBmb3IgKGkgPSBuZXdfc2l6ZSAtIDEgOyBpID49IDAgOyBpLS0pIHsKLSAgICAgICAgb2JqZWN0aWRfbWFwW2kgKyAob2xkX21heCAtIG5ld19zaXplKV0gPSBvYmplY3RpZF9tYXBbaV0gOyAKLSAgICB9CisJLyogc2V0IHRoZSBtYXggc2l6ZSBzbyB3ZSBkb24ndCBvdmVyZmxvdyBsYXRlciAqLworCXNldF9zYl9vaWRfbWF4c2l6ZShkaXNrX3NiLCBuZXdfc2l6ZSk7CiAKKwkvKiBaZXJvIG91dCBsYWJlbCBhbmQgZ2VuZXJhdGUgcmFuZG9tIFVVSUQgKi8KKwltZW1zZXQoZGlza19zYi0+c19sYWJlbCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfbGFiZWwpKTsKKwlnZW5lcmF0ZV9yYW5kb21fdXVpZChkaXNrX3NiLT5zX3V1aWQpOwogCi0gICAgLyogc2V0IHRoZSBtYXggc2l6ZSBzbyB3ZSBkb24ndCBvdmVyZmxvdyBsYXRlciAqLwotICAgIHNldF9zYl9vaWRfbWF4c2l6ZShkaXNrX3NiLG5ld19zaXplKSA7Ci0KLSAgICAvKiBaZXJvIG91dCBsYWJlbCBhbmQgZ2VuZXJhdGUgcmFuZG9tIFVVSUQgKi8KLSAgICBtZW1zZXQoZGlza19zYi0+c19sYWJlbCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfbGFiZWwpKSA7Ci0gICAgZ2VuZXJhdGVfcmFuZG9tX3V1aWQoZGlza19zYi0+c191dWlkKTsKLQotICAgIC8qIGZpbmFsbHksIHplcm8gb3V0IHRoZSB1bnVzZWQgY2h1bmsgb2YgdGhlIG5ldyBzdXBlciAqLwotICAgIG1lbXNldChkaXNrX3NiLT5zX3VudXNlZCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfdW51c2VkKSkgOwotICAgIHJldHVybiAwIDsKKwkvKiBmaW5hbGx5LCB6ZXJvIG91dCB0aGUgdW51c2VkIGNodW5rIG9mIHRoZSBuZXcgc3VwZXIgKi8KKwltZW1zZXQoZGlza19zYi0+c191bnVzZWQsIDAsIHNpemVvZihkaXNrX3NiLT5zX3VudXNlZCkpOworCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcmludHMuYyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCmluZGV4IDE2ZmRjYTEuLmQ1NWUxNjQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3ByaW50cy5jCisrKyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCkBAIC0xNSwxNjkgKzE1LDE2NyBAQAogc3RhdGljIGNoYXIgZm10X2J1ZlsxMDI0XTsKIHN0YXRpYyBjaGFyIG9mZl9idWZbODBdOwogCi0KLXN0YXRpYyBjaGFyICogcmVpc2VyZnNfY3B1X29mZnNldCAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgY2hhciAqcmVpc2VyZnNfY3B1X29mZnNldChzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICBpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQotICAgIHNwcmludGYgKG9mZl9idWYsICIlTHUoJUx1KSIsIAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylHRVRfSEFTSF9WQUxVRSAoY3B1X2tleV9rX29mZnNldCAoa2V5KSksCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9HRU5FUkFUSU9OX05VTUJFUiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSkpOwotICBlbHNlCi0gICAgc3ByaW50ZiAob2ZmX2J1ZiwgIjB4JUx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyljcHVfa2V5X2tfb2Zmc2V0IChrZXkpKTsKLSAgcmV0dXJuIG9mZl9idWY7CisJaWYgKGNwdV9rZXlfa190eXBlKGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKwkJc3ByaW50ZihvZmZfYnVmLCAiJUx1KCVMdSkiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCUdFVF9IQVNIX1ZBTFVFKGNwdV9rZXlfa19vZmZzZXQoa2V5KSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJR0VUX0dFTkVSQVRJT05fTlVNQkVSKGNwdV9rZXlfa19vZmZzZXQoa2V5KSkpOworCWVsc2UKKwkJc3ByaW50ZihvZmZfYnVmLCAiMHglTHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHVfa2V5X2tfb2Zmc2V0KGtleSkpOworCXJldHVybiBvZmZfYnVmOwogfQogCi0KLXN0YXRpYyBjaGFyICogbGVfb2Zmc2V0IChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQorc3RhdGljIGNoYXIgKmxlX29mZnNldChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gIGludCB2ZXJzaW9uOworCWludCB2ZXJzaW9uOwogCi0gIHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbiAoa2V5KTsKLSAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKLSAgICBzcHJpbnRmIChvZmZfYnVmLCAiJUx1KCVMdSkiLCAKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpR0VUX0hBU0hfVkFMVUUgKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSksCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9HRU5FUkFUSU9OX05VTUJFUiAobGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBrZXkpKSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChvZmZfYnVmLCAiMHglTHgiLCAodW5zaWduZWQgbG9uZyBsb25nKWxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSk7Ci0gIHJldHVybiBvZmZfYnVmOworCXZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbihrZXkpOworCWlmIChsZV9rZXlfa190eXBlKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKwkJc3ByaW50ZihvZmZfYnVmLCAiJUx1KCVMdSkiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCUdFVF9IQVNIX1ZBTFVFKGxlX2tleV9rX29mZnNldCh2ZXJzaW9uLCBrZXkpKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQlHRVRfR0VORVJBVElPTl9OVU1CRVIobGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkpKTsKKwllbHNlCisJCXNwcmludGYob2ZmX2J1ZiwgIjB4JUx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkpOworCXJldHVybiBvZmZfYnVmOwogfQogCi0KLXN0YXRpYyBjaGFyICogY3B1X3R5cGUgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIGNoYXIgKmNwdV90eXBlKHN0cnVjdCBjcHVfa2V5ICprZXkpCiB7Ci0gICAgaWYgKGNwdV9rZXlfa190eXBlIChrZXkpID09IFRZUEVfU1RBVF9EQVRBKQotCXJldHVybiAiU0QiOwotICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQotCXJldHVybiAiRElSIjsKLSAgICBpZiAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFQ1QpCi0JcmV0dXJuICJESVJFQ1QiOwotICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX0lORElSRUNUKQotCXJldHVybiAiSU5EIjsKLSAgICByZXR1cm4gIlVOS05PV04iOworCWlmIChjcHVfa2V5X2tfdHlwZShrZXkpID09IFRZUEVfU1RBVF9EQVRBKQorCQlyZXR1cm4gIlNEIjsKKwlpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQorCQlyZXR1cm4gIkRJUiI7CisJaWYgKGNwdV9rZXlfa190eXBlKGtleSkgPT0gVFlQRV9ESVJFQ1QpCisJCXJldHVybiAiRElSRUNUIjsKKwlpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0lORElSRUNUKQorCQlyZXR1cm4gIklORCI7CisJcmV0dXJuICJVTktOT1dOIjsKIH0KIAotCi1zdGF0aWMgY2hhciAqIGxlX3R5cGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgY2hhciAqbGVfdHlwZShzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gICAgaW50IHZlcnNpb247Ci0gICAgCi0gICAgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChrZXkpOworCWludCB2ZXJzaW9uOwogCi0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9TVEFUX0RBVEEpCi0JcmV0dXJuICJTRCI7Ci0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKLQlyZXR1cm4gIkRJUiI7Ci0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFQ1QpCi0JcmV0dXJuICJESVJFQ1QiOwotICAgIGlmIChsZV9rZXlfa190eXBlICh2ZXJzaW9uLCBrZXkpID09IFRZUEVfSU5ESVJFQ1QpCi0JcmV0dXJuICJJTkQiOwotICAgIHJldHVybiAiVU5LTk9XTiI7CisJdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGtleSk7CisKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfU1RBVF9EQVRBKQorCQlyZXR1cm4gIlNEIjsKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfRElSRU5UUlkpCisJCXJldHVybiAiRElSIjsKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfRElSRUNUKQorCQlyZXR1cm4gIkRJUkVDVCI7CisJaWYgKGxlX2tleV9rX3R5cGUodmVyc2lvbiwga2V5KSA9PSBUWVBFX0lORElSRUNUKQorCQlyZXR1cm4gIklORCI7CisJcmV0dXJuICJVTktOT1dOIjsKIH0KIAotCiAvKiAlayAqLwotc3RhdGljIHZvaWQgc3ByaW50Zl9sZV9rZXkgKGNoYXIgKiBidWYsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2xlX2tleShjaGFyICpidWYsIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSkKIHsKLSAgaWYgKGtleSkKLSAgICBzcHJpbnRmIChidWYsICJbJWQgJWQgJXMgJXNdIiwgbGUzMl90b19jcHUgKGtleS0+a19kaXJfaWQpLAotCSAgICAgbGUzMl90b19jcHUgKGtleS0+a19vYmplY3RpZCksIGxlX29mZnNldCAoa2V5KSwgbGVfdHlwZSAoa2V5KSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChidWYsICJbTlVMTF0iKTsKKwlpZiAoa2V5KQorCQlzcHJpbnRmKGJ1ZiwgIlslZCAlZCAlcyAlc10iLCBsZTMyX3RvX2NwdShrZXktPmtfZGlyX2lkKSwKKwkJCWxlMzJfdG9fY3B1KGtleS0+a19vYmplY3RpZCksIGxlX29mZnNldChrZXkpLAorCQkJbGVfdHlwZShrZXkpKTsKKwllbHNlCisJCXNwcmludGYoYnVmLCAiW05VTExdIik7CiB9CiAKLQogLyogJUsgKi8KLXN0YXRpYyB2b2lkIHNwcmludGZfY3B1X2tleSAoY2hhciAqIGJ1Ziwgc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2NwdV9rZXkoY2hhciAqYnVmLCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICBpZiAoa2V5KQotICAgIHNwcmludGYgKGJ1ZiwgIlslZCAlZCAlcyAlc10iLCBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkLAotCSAgICAga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkLCByZWlzZXJmc19jcHVfb2Zmc2V0IChrZXkpLAotICAgICAgICAgICAgIGNwdV90eXBlIChrZXkpKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworCWlmIChrZXkpCisJCXNwcmludGYoYnVmLCAiWyVkICVkICVzICVzXSIsIGtleS0+b25fZGlza19rZXkua19kaXJfaWQsCisJCQlrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQsIHJlaXNlcmZzX2NwdV9vZmZzZXQoa2V5KSwKKwkJCWNwdV90eXBlKGtleSkpOworCWVsc2UKKwkJc3ByaW50ZihidWYsICJbTlVMTF0iKTsKIH0KIAotc3RhdGljIHZvaWQgc3ByaW50Zl9kZV9oZWFkKCBjaGFyICpidWYsIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggKQorc3RhdGljIHZvaWQgc3ByaW50Zl9kZV9oZWFkKGNoYXIgKmJ1Ziwgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCkKIHsKLSAgICBpZiggZGVoICkKLSAgICAgICAgc3ByaW50ZiggYnVmLCAiW29mZnNldD0lZCBkaXJfaWQ9JWQgb2JqZWN0aWQ9JWQgbG9jYXRpb249JWQgc3RhdGU9JTA0eF0iLCBkZWhfb2Zmc2V0KGRlaCksIGRlaF9kaXJfaWQoZGVoKSwKLSAgICAgICAgICAgICAgICAgZGVoX29iamVjdGlkKGRlaCksIGRlaF9sb2NhdGlvbihkZWgpLCBkZWhfc3RhdGUoZGVoKSApOwotICAgIGVsc2UKLSAgICAgICAgc3ByaW50ZiggYnVmLCAiW05VTExdIiApOworCWlmIChkZWgpCisJCXNwcmludGYoYnVmLAorCQkJIltvZmZzZXQ9JWQgZGlyX2lkPSVkIG9iamVjdGlkPSVkIGxvY2F0aW9uPSVkIHN0YXRlPSUwNHhdIiwKKwkJCWRlaF9vZmZzZXQoZGVoKSwgZGVoX2Rpcl9pZChkZWgpLCBkZWhfb2JqZWN0aWQoZGVoKSwKKwkJCWRlaF9sb2NhdGlvbihkZWgpLCBkZWhfc3RhdGUoZGVoKSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIltOVUxMXSIpOwogCiB9CiAKLXN0YXRpYyB2b2lkIHNwcmludGZfaXRlbV9oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgaXRlbV9oZWFkICogaWgpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2l0ZW1faGVhZChjaGFyICpidWYsIHN0cnVjdCBpdGVtX2hlYWQgKmloKQogewotICAgIGlmIChpaCkgewotCXN0cmNweSAoYnVmLCAoaWhfdmVyc2lvbiAoaWgpID09IEtFWV9GT1JNQVRfM182KSA/ICIqMy42KiAiIDogIiozLjUqIik7Ci0Jc3ByaW50Zl9sZV9rZXkgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgJihpaC0+aWhfa2V5KSk7Ci0Jc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiLCBpdGVtX2xlbiAlZCwgaXRlbV9sb2NhdGlvbiAlZCwgIgotCQkgImZyZWVfc3BhY2UoZW50cnlfY291bnQpICVkIiwKLQkJIGloX2l0ZW1fbGVuKGloKSwgaWhfbG9jYXRpb24oaWgpLCBpaF9mcmVlX3NwYWNlIChpaCkpOwotICAgIH0gZWxzZQotCXNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworCWlmIChpaCkgeworCQlzdHJjcHkoYnVmLAorCQkgICAgICAgKGloX3ZlcnNpb24oaWgpID09IEtFWV9GT1JNQVRfM182KSA/ICIqMy42KiAiIDogIiozLjUqIik7CisJCXNwcmludGZfbGVfa2V5KGJ1ZiArIHN0cmxlbihidWYpLCAmKGloLT5paF9rZXkpKTsKKwkJc3ByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgIiwgaXRlbV9sZW4gJWQsIGl0ZW1fbG9jYXRpb24gJWQsICIKKwkJCSJmcmVlX3NwYWNlKGVudHJ5X2NvdW50KSAlZCIsCisJCQlpaF9pdGVtX2xlbihpaCksIGloX2xvY2F0aW9uKGloKSwgaWhfZnJlZV9zcGFjZShpaCkpOworCX0gZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIltOVUxMXSIpOwogfQogCi0KLXN0YXRpYyB2b2lkIHNwcmludGZfZGlyZW50cnkgKGNoYXIgKiBidWYsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3N0YXRpYyB2b2lkIHNwcmludGZfZGlyZW50cnkoY2hhciAqYnVmLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgY2hhciBuYW1lWzIwXTsKKwljaGFyIG5hbWVbMjBdOwogCi0gIG1lbWNweSAobmFtZSwgZGUtPmRlX25hbWUsIGRlLT5kZV9uYW1lbGVuID4gMTkgPyAxOSA6IGRlLT5kZV9uYW1lbGVuKTsKLSAgbmFtZSBbZGUtPmRlX25hbWVsZW4gPiAxOSA/IDE5IDogZGUtPmRlX25hbWVsZW5dID0gMDsKLSAgc3ByaW50ZiAoYnVmLCAiXCIlc1wiPT0+WyVkICVkXSIsIG5hbWUsIGRlLT5kZV9kaXJfaWQsIGRlLT5kZV9vYmplY3RpZCk7CisJbWVtY3B5KG5hbWUsIGRlLT5kZV9uYW1lLCBkZS0+ZGVfbmFtZWxlbiA+IDE5ID8gMTkgOiBkZS0+ZGVfbmFtZWxlbik7CisJbmFtZVtkZS0+ZGVfbmFtZWxlbiA+IDE5ID8gMTkgOiBkZS0+ZGVfbmFtZWxlbl0gPSAwOworCXNwcmludGYoYnVmLCAiXCIlc1wiPT0+WyVkICVkXSIsIG5hbWUsIGRlLT5kZV9kaXJfaWQsIGRlLT5kZV9vYmplY3RpZCk7CiB9CiAKLQotc3RhdGljIHZvaWQgc3ByaW50Zl9ibG9ja19oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIHNwcmludGZfYmxvY2tfaGVhZChjaGFyICpidWYsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gIHNwcmludGYgKGJ1ZiwgImxldmVsPSVkLCBucl9pdGVtcz0lZCwgZnJlZV9zcGFjZT0lZCByZGtleSAiLAotCSAgIEJfTEVWRUwgKGJoKSwgQl9OUl9JVEVNUyAoYmgpLCBCX0ZSRUVfU1BBQ0UgKGJoKSk7CisJc3ByaW50ZihidWYsICJsZXZlbD0lZCwgbnJfaXRlbXM9JWQsIGZyZWVfc3BhY2U9JWQgcmRrZXkgIiwKKwkJQl9MRVZFTChiaCksIEJfTlJfSVRFTVMoYmgpLCBCX0ZSRUVfU1BBQ0UoYmgpKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBzcHJpbnRmX2J1ZmZlcl9oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkgCitzdGF0aWMgdm9pZCBzcHJpbnRmX2J1ZmZlcl9oZWFkKGNoYXIgKmJ1Ziwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotICBzcHJpbnRmIChidWYsICJkZXYgJXMsIHNpemUgJWQsIGJsb2NrbnIgJWxsdSwgY291bnQgJWQsIHN0YXRlIDB4JWx4LCBwYWdlICVwLCAoJXMsICVzLCAlcykiLAotCSAgIGJkZXZuYW1lIChiaC0+Yl9iZGV2LCBiKSwgYmgtPmJfc2l6ZSwKLQkgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCi0JICAgYXRvbWljX3JlYWQgKCYoYmgtPmJfY291bnQpKSwKLQkgICBiaC0+Yl9zdGF0ZSwgYmgtPmJfcGFnZSwKLQkgICBidWZmZXJfdXB0b2RhdGUgKGJoKSA/ICJVUFRPREFURSIgOiAiIVVQVE9EQVRFIiwKLQkgICBidWZmZXJfZGlydHkgKGJoKSA/ICJESVJUWSIgOiAiQ0xFQU4iLAotCSAgIGJ1ZmZlcl9sb2NrZWQgKGJoKSA/ICJMT0NLRUQiIDogIlVOTE9DS0VEIik7CisJc3ByaW50ZihidWYsCisJCSJkZXYgJXMsIHNpemUgJWQsIGJsb2NrbnIgJWxsdSwgY291bnQgJWQsIHN0YXRlIDB4JWx4LCBwYWdlICVwLCAoJXMsICVzLCAlcykiLAorCQliZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSwgYmgtPmJfc2l6ZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSksCisJCWJoLT5iX3N0YXRlLCBiaC0+Yl9wYWdlLAorCQlidWZmZXJfdXB0b2RhdGUoYmgpID8gIlVQVE9EQVRFIiA6ICIhVVBUT0RBVEUiLAorCQlidWZmZXJfZGlydHkoYmgpID8gIkRJUlRZIiA6ICJDTEVBTiIsCisJCWJ1ZmZlcl9sb2NrZWQoYmgpID8gIkxPQ0tFRCIgOiAiVU5MT0NLRUQiKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBzcHJpbnRmX2Rpc2tfY2hpbGQgKGNoYXIgKiBidWYsIHN0cnVjdCBkaXNrX2NoaWxkICogZGMpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2Rpc2tfY2hpbGQoY2hhciAqYnVmLCBzdHJ1Y3QgZGlza19jaGlsZCAqZGMpCiB7Ci0gIHNwcmludGYgKGJ1ZiwgIltkY19udW1iZXI9JWQsIGRjX3NpemU9JXVdIiwgZGNfYmxvY2tfbnVtYmVyKGRjKSwgZGNfc2l6ZShkYykpOworCXNwcmludGYoYnVmLCAiW2RjX251bWJlcj0lZCwgZGNfc2l6ZT0ldV0iLCBkY19ibG9ja19udW1iZXIoZGMpLAorCQlkY19zaXplKGRjKSk7CiB9CiAKLQotc3RhdGljIGNoYXIgKiBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QgKGNoYXIgKiBmbXQsIGludCAqIHdoYXQsIGludCAqIHNraXApCitzdGF0aWMgY2hhciAqaXNfdGhlcmVfcmVpc2VyZnNfc3RydWN0KGNoYXIgKmZtdCwgaW50ICp3aGF0LCBpbnQgKnNraXApCiB7Ci0gIGNoYXIgKiBrID0gZm10OworCWNoYXIgKmsgPSBmbXQ7CiAKLSAgKnNraXAgPSAwOwotICAKLSAgd2hpbGUgKChrID0gc3RyY2hyIChrLCAnJScpKSAhPSBOVUxMKQotICB7Ci0gICAgaWYgKGtbMV0gPT0gJ2snIHx8IGtbMV0gPT0gJ0snIHx8IGtbMV0gPT0gJ2gnIHx8IGtbMV0gPT0gJ3QnIHx8Ci0JICAgICAga1sxXSA9PSAneicgfHwga1sxXSA9PSAnYicgfHwga1sxXSA9PSAneScgfHwga1sxXSA9PSAnYScgKSB7Ci0gICAgICAqd2hhdCA9IGtbMV07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpza2lwKSArKzsKLSAgICBrICsrOwotICB9Ci0gIHJldHVybiBrOworCSpza2lwID0gMDsKKworCXdoaWxlICgoayA9IHN0cmNocihrLCAnJScpKSAhPSBOVUxMKSB7CisJCWlmIChrWzFdID09ICdrJyB8fCBrWzFdID09ICdLJyB8fCBrWzFdID09ICdoJyB8fCBrWzFdID09ICd0JyB8fAorCQkgICAga1sxXSA9PSAneicgfHwga1sxXSA9PSAnYicgfHwga1sxXSA9PSAneScgfHwga1sxXSA9PSAnYScpIHsKKwkJCSp3aGF0ID0ga1sxXTsKKwkJCWJyZWFrOworCQl9CisJCSgqc2tpcCkrKzsKKwkJaysrOworCX0KKwlyZXR1cm4gazsKIH0KIAotCiAvKiBkZWJ1Z2dpbmcgcmVpc2VyZnMgd2UgdXNlZCB0byBwcmludCBvdXQgYSBsb3Qgb2YgZGlmZmVyZW50CiAgICB2YXJpYWJsZXMsIGxpa2Uga2V5cywgaXRlbSBoZWFkZXJzLCBidWZmZXIgaGVhZHMgZXRjLiBWYWx1ZXMgb2YKICAgIG1vc3QgZmllbGRzIG1hdHRlci4gU28gaXQgdG9vayBhIGxvbmcgdGltZSBqdXN0IHRvIHdyaXRlCkBAIC0xOTEsNjEgKzE4OSw2NCBAQAogICAgICAgICAgICBrZXktPmtfb2Zmc2V0LCBrZXktPmtfdW5pcXVlbmVzcyk7IAogKi8KIAotCi1zdGF0aWMgdm9pZAotcHJlcGFyZV9lcnJvcl9idWYoIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkKK3N0YXRpYyB2b2lkIHByZXBhcmVfZXJyb3JfYnVmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQogewotICAgIGNoYXIgKiBmbXQxID0gZm10X2J1ZjsKLSAgICBjaGFyICogazsKLSAgICBjaGFyICogcCA9IGVycm9yX2J1ZjsKLSAgICBpbnQgaSwgaiwgd2hhdCwgc2tpcDsKKwljaGFyICpmbXQxID0gZm10X2J1ZjsKKwljaGFyICprOworCWNoYXIgKnAgPSBlcnJvcl9idWY7CisJaW50IGksIGosIHdoYXQsIHNraXA7CiAKLSAgICBzdHJjcHkgKGZtdDEsIGZtdCk7CisJc3RyY3B5KGZtdDEsIGZtdCk7CiAKLSAgICB3aGlsZSggKGsgPSBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QoIGZtdDEsICZ3aGF0LCAmc2tpcCApKSAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAgICprID0gMDsKKwl3aGlsZSAoKGsgPSBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QoZm10MSwgJndoYXQsICZza2lwKSkgIT0gTlVMTCkgeworCQkqayA9IDA7CiAKLSAgICAgICAgcCArPSB2c3ByaW50ZiAocCwgZm10MSwgYXJncyk7CisJCXAgKz0gdnNwcmludGYocCwgZm10MSwgYXJncyk7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNraXA7IGkgKyspCi0gICAgICAgICAgICBqID0gdmFfYXJnIChhcmdzLCBpbnQpOworCQlmb3IgKGkgPSAwOyBpIDwgc2tpcDsgaSsrKQorCQkJaiA9IHZhX2FyZyhhcmdzLCBpbnQpOwogCi0gICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICBjYXNlICdrJzoKLSAgICAgICAgICAgIHNwcmludGZfbGVfa2V5IChwLCB2YV9hcmcoYXJncywgc3RydWN0IHJlaXNlcmZzX2tleSAqKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnSyc6Ci0gICAgICAgICAgICBzcHJpbnRmX2NwdV9rZXkgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgY3B1X2tleSAqKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICBzcHJpbnRmX2l0ZW1faGVhZCAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCBpdGVtX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgc3ByaW50Zl9kaXJlbnRyeSAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3knOgotICAgICAgICAgICAgc3ByaW50Zl9kaXNrX2NoaWxkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGRpc2tfY2hpbGQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgc3ByaW50Zl9ibG9ja19oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgIHNwcmludGZfYnVmZmVyX2hlYWQgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgICAgc3ByaW50Zl9kZV9oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwkJc3dpdGNoICh3aGF0KSB7CisJCWNhc2UgJ2snOgorCQkJc3ByaW50Zl9sZV9rZXkocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19rZXkgKikpOworCQkJYnJlYWs7CisJCWNhc2UgJ0snOgorCQkJc3ByaW50Zl9jcHVfa2V5KHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgY3B1X2tleSAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlzcHJpbnRmX2l0ZW1faGVhZChwLCB2YV9hcmcoYXJncywgc3RydWN0IGl0ZW1faGVhZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlzcHJpbnRmX2RpcmVudHJ5KHAsCisJCQkJCSB2YV9hcmcoYXJncywKKwkJCQkJCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKikpOworCQkJYnJlYWs7CisJCWNhc2UgJ3knOgorCQkJc3ByaW50Zl9kaXNrX2NoaWxkKHAsCisJCQkJCSAgIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgZGlza19jaGlsZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQlzcHJpbnRmX2Jsb2NrX2hlYWQocCwKKwkJCQkJICAgdmFfYXJnKGFyZ3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlzcHJpbnRmX2J1ZmZlcl9oZWFkKHAsCisJCQkJCSAgICB2YV9hcmcoYXJncywgc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCXNwcmludGZfZGVfaGVhZChwLAorCQkJCQl2YV9hcmcoYXJncywKKwkJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKTsKKwkJCWJyZWFrOworCQl9CiAKLSAgICAgICAgcCArPSBzdHJsZW4gKHApOwotICAgICAgICBmbXQxID0gayArIDI7Ci0gICAgfQotICAgIHZzcHJpbnRmIChwLCBmbXQxLCBhcmdzKTsKKwkJcCArPSBzdHJsZW4ocCk7CisJCWZtdDEgPSBrICsgMjsKKwl9CisJdnNwcmludGYocCwgZm10MSwgYXJncyk7CiAKIH0KIAotCiAvKiBpbiBhZGRpdGlvbiB0byB1c3VhbCBjb252ZXJzaW9uIHNwZWNpZmllcnMgdGhpcyBhY2NlcHRzIHJlaXNlcmZzCiAgICBzcGVjaWZpYyBjb252ZXJzaW9uIHNwZWNpZmllcnM6IAogICAgJWsgdG8gcHJpbnQgbGl0dGxlIGVuZGlhbiBrZXksIApAQCAtMjY0LDQzICsyNjUsNDMgQEAKICAgICB2YV9lbmQoIGFyZ3MgKTtcCiB9CiAKLXZvaWQgcmVpc2VyZnNfd2FybmluZyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQordm9pZCByZWlzZXJmc193YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewotICBkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7Ci0gIGlmIChzYikKLSAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJSZWlzZXJGUzogJXM6IHdhcm5pbmc6ICVzXG4iLAotICAgICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIGVycm9yX2J1Zik7Ci0gIGVsc2UKLSAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJSZWlzZXJGUzogd2FybmluZzogJXNcbiIsIGVycm9yX2J1Zik7CisJZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworCWlmIChzYikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVpc2VyRlM6ICVzOiB3YXJuaW5nOiAlc1xuIiwKKwkJICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlaXNlckZTOiB3YXJuaW5nOiAlc1xuIiwgZXJyb3JfYnVmKTsKIH0KIAogLyogTm8gbmV3bGluZS4uIHJlaXNlcmZzX2luZm8gY2FsbHMgY2FuIGJlIGZvbGxvd2VkIGJ5IHByaW50aydzICovCi12b2lkIHJlaXNlcmZzX2luZm8gKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3ZvaWQgcmVpc2VyZnNfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOwotICBpZiAoc2IpCi0gICAgICBwcmludGsgKEtFUk5fTk9USUNFICJSZWlzZXJGUzogJXM6ICVzIiwKLSAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOwotICBlbHNlCi0gICAgICBwcmludGsgKEtFUk5fTk9USUNFICJSZWlzZXJGUzogJXMiLCBlcnJvcl9idWYpOworCWRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKKwlpZiAoc2IpCisJCXByaW50ayhLRVJOX05PVElDRSAiUmVpc2VyRlM6ICVzOiAlcyIsCisJCSAgICAgICByZWlzZXJmc19iZGV2bmFtZShzYiksIGVycm9yX2J1Zik7CisJZWxzZQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlaXNlckZTOiAlcyIsIGVycm9yX2J1Zik7CiB9CiAKIC8qIE5vIG5ld2xpbmUuLiByZWlzZXJmc19wcmludGsgY2FsbHMgY2FuIGJlIGZvbGxvd2VkIGJ5IHByaW50aydzICovCi1zdGF0aWMgdm9pZCByZWlzZXJmc19wcmludGsgKGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOwotICBwcmludGsgKGVycm9yX2J1Zik7CisJZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworCXByaW50ayhlcnJvcl9idWYpOwogfQogCi12b2lkIHJlaXNlcmZzX2RlYnVnIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQordm9pZCByZWlzZXJmc19kZWJ1ZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKLSAgaWYgKHMpCi0gICAgICBwcmludGsgKEtFUk5fREVCVUcgIlJlaXNlckZTOiAlczogJXNcbiIsCi0gICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBlcnJvcl9idWYpOwotICBlbHNlCi0gICAgICBwcmludGsgKEtFUk5fREVCVUcgIlJlaXNlckZTOiAlc1xuIiwgZXJyb3JfYnVmKTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisJaWYgKHMpCisJCXByaW50ayhLRVJOX0RFQlVHICJSZWlzZXJGUzogJXM6ICVzXG4iLAorCQkgICAgICAgcmVpc2VyZnNfYmRldm5hbWUocyksIGVycm9yX2J1Zik7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiUmVpc2VyRlM6ICVzXG4iLCBlcnJvcl9idWYpOwogI2VuZGlmCiB9CiAKQEAgLTM0OSwzNzkgKzM1MCw0MDMgQEAKIAogICAgLiAgKi8KIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi1leHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqIGN1cl90YjsKK2V4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGI7CiAjZW5kaWYKIAotdm9pZCByZWlzZXJmc19wYW5pYyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3ZvaWQgcmVpc2VyZnNfcGFuaWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKLSAgcHJpbnRrIChLRVJOX0VNRVJHICJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIGVycm9yX2J1Zik7Ci0gIEJVRyAoKTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisJICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwlCVUcoKTsKIAotICAvKiB0aGlzIGlzIG5vdCBhY3R1YWxseSBjYWxsZWQsIGJ1dCBtYWtlcyByZWlzZXJmc19wYW5pYygpICJub3JldHVybiIgKi8KLSAgcGFuaWMgKCJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotCSByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOworCS8qIHRoaXMgaXMgbm90IGFjdHVhbGx5IGNhbGxlZCwgYnV0IG1ha2VzIHJlaXNlcmZzX3BhbmljKCkgIm5vcmV0dXJuIiAqLworCXBhbmljKCJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAorCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKIH0KIAotdm9pZAotcmVpc2VyZnNfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pCit2b2lkIHJlaXNlcmZzX2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gICAgZG9fcmVpc2VyZnNfd2FybmluZyAoZm10KTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CiAKLSAgICBpZiAocmVpc2VyZnNfZXJyb3JfcGFuaWMgKHNiKSkgewotICAgICAgICBwYW5pYyAoS0VSTl9DUklUICJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKLSAgICB9CisJaWYgKHJlaXNlcmZzX2Vycm9yX3BhbmljKHNiKSkgeworCQlwYW5pYyhLRVJOX0NSSVQgIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisJCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwl9CiAKLSAgICBpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCi0gICAgICAgIHJldHVybjsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybjsKIAotICAgIHByaW50ayAoS0VSTl9DUklUICJSRUlTRVJGUzogYWJvcnQgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKKwlwcmludGsoS0VSTl9DUklUICJSRUlTRVJGUzogYWJvcnQgKGRldmljZSAlcyk6ICVzXG4iLAorCSAgICAgICByZWlzZXJmc19iZGV2bmFtZShzYiksIGVycm9yX2J1Zik7CiAKLSAgICBzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7Ci0gICAgcmVpc2VyZnNfam91cm5hbF9hYm9ydCAoc2IsIGVycm5vKTsKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJcmVpc2VyZnNfam91cm5hbF9hYm9ydChzYiwgZXJybm8pOwogfQogCiAvKiB0aGlzIHByaW50cyBpbnRlcm5hbCBub2RlcyAoNCBrZXlzL2l0ZW1zIGluIGxpbmUpIChkY19udW1iZXIsCiAgICBkY19zaXplKVtrX2RpcmlkLCBrX29iamVjdGlkLCBrX29mZnNldCwga191bmlxdWVuZXNzXShkY19udW1iZXIsCiAgICBkY19zaXplKS4uLiovCi1zdGF0aWMgaW50IHByaW50X2ludGVybmFsIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGZpcnN0LCBpbnQgbGFzdCkKK3N0YXRpYyBpbnQgcHJpbnRfaW50ZXJuYWwoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGZpcnN0LCBpbnQgbGFzdCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OwotICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7Ci0gICAgaW50IGk7Ci0gICAgaW50IGZyb20sIHRvOwotICAgIAotICAgIGlmICghQl9JU19LRVlTX0xFVkVMIChiaCkpCi0JcmV0dXJuIDE7CisJc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5OworCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKKwlpbnQgaTsKKwlpbnQgZnJvbSwgdG87CiAKLSAgICBjaGVja19pbnRlcm5hbCAoYmgpOwotICAgIAotICAgIGlmIChmaXJzdCA9PSAtMSkgewotCWZyb20gPSAwOwotCXRvID0gQl9OUl9JVEVNUyAoYmgpOwotICAgIH0gZWxzZSB7Ci0JZnJvbSA9IGZpcnN0OwotCXRvID0gbGFzdCA8IEJfTlJfSVRFTVMgKGJoKSA/IGxhc3QgOiBCX05SX0lURU1TIChiaCk7Ci0gICAgfQorCWlmICghQl9JU19LRVlTX0xFVkVMKGJoKSkKKwkJcmV0dXJuIDE7CiAKLSAgICByZWlzZXJmc19wcmludGsgKCJJTlRFUk5BTCBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCAgYmgtPmJfYmxvY2tuciwgYmgpOwotICAgIAotICAgIGRjID0gQl9OX0NISUxEIChiaCwgZnJvbSk7Ci0gICAgcmVpc2VyZnNfcHJpbnRrICgiUFRSICVkOiAleSAiLCBmcm9tLCBkYyk7Ci0gICAgCi0gICAgZm9yIChpID0gZnJvbSwga2V5ID0gQl9OX1BERUxJTV9LRVkgKGJoLCBmcm9tKSwgZGMgKys7IGkgPCB0bzsgaSArKywga2V5ICsrLCBkYyArKykgewotCXJlaXNlcmZzX3ByaW50ayAoIktFWSAlZDogJWsgUFRSICVkOiAleSAiLCBpLCBrZXksIGkgKyAxLCBkYyk7Ci0JaWYgKGkgJiYgaSAlIDQgPT0gMCkKLQkgICAgcHJpbnRrICgiXG4iKTsKLSAgICB9Ci0gICAgcHJpbnRrICgiXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KKwljaGVja19pbnRlcm5hbChiaCk7CiAKKwlpZiAoZmlyc3QgPT0gLTEpIHsKKwkJZnJvbSA9IDA7CisJCXRvID0gQl9OUl9JVEVNUyhiaCk7CisJfSBlbHNlIHsKKwkJZnJvbSA9IGZpcnN0OworCQl0byA9IGxhc3QgPCBCX05SX0lURU1TKGJoKSA/IGxhc3QgOiBCX05SX0lURU1TKGJoKTsKKwl9CiAKKwlyZWlzZXJmc19wcmludGsoIklOVEVSTkFMIE5PREUgKCVsZCkgY29udGFpbnMgJXpcbiIsIGJoLT5iX2Jsb2NrbnIsIGJoKTsKIAorCWRjID0gQl9OX0NISUxEKGJoLCBmcm9tKTsKKwlyZWlzZXJmc19wcmludGsoIlBUUiAlZDogJXkgIiwgZnJvbSwgZGMpOwogCi0KLXN0YXRpYyBpbnQgcHJpbnRfbGVhZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsIGludCBsYXN0KQotewotICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gICAgaW50IGksIG5yOwotICAgIGludCBmcm9tLCB0bzsKLQotICAgIGlmICghQl9JU19JVEVNU19MRVZFTCAoYmgpKQotCXJldHVybiAxOwotCi0gICAgY2hlY2tfbGVhZiAoYmgpOwotCi0gICAgYmxraCA9IEJfQkxLX0hFQUQgKGJoKTsKLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwwKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLQotICAgIHByaW50ayAoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0gICAgcmVpc2VyZnNfcHJpbnRrICgiTEVBRiBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCBiaC0+Yl9ibG9ja25yLCBiaCk7Ci0KLSAgICBpZiAoIShwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykpIHsKLQlyZWlzZXJmc19wcmludGsgKCJGSVJTVCBJVEVNX0tFWTogJWssIExBU1QgSVRFTSBLRVk6ICVrXG4iLAotCQkJICAmKGloLT5paF9rZXkpLCAmKChpaCArIG5yIC0gMSktPmloX2tleSkpOworCWZvciAoaSA9IGZyb20sIGtleSA9IEJfTl9QREVMSU1fS0VZKGJoLCBmcm9tKSwgZGMrKzsgaSA8IHRvOworCSAgICAgaSsrLCBrZXkrKywgZGMrKykgeworCQlyZWlzZXJmc19wcmludGsoIktFWSAlZDogJWsgUFRSICVkOiAleSAiLCBpLCBrZXksIGkgKyAxLCBkYyk7CisJCWlmIChpICYmIGkgJSA0ID09IDApCisJCQlwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKIAlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoZmlyc3QgPCAwIHx8IGZpcnN0ID4gbnIgLSAxKSAKLQlmcm9tID0gMDsKLSAgICBlbHNlIAotCWZyb20gPSBmaXJzdDsKLQotICAgIGlmIChsYXN0IDwgMCB8fCBsYXN0ID4gbnIgKQotCXRvID0gbnI7Ci0gICAgZWxzZQotCXRvID0gbGFzdDsKLQotICAgIGloICs9IGZyb207Ci0gICAgcHJpbnRrICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgcHJpbnRrICgifCMjfCAgIHR5cGUgICAgfCAgICAgICAgICAga2V5ICAgICAgICAgICB8IGlsZW4gfCBmcmVlX3NwYWNlIHwgdmVyc2lvbiB8IGxvYyAgfFxuIik7Ci0gICAgZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyssIGloICsrKSB7Ci0JcHJpbnRrICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JcmVpc2VyZnNfcHJpbnRrICgifCUyZHwgJWggfFxuIiwgaSwgaWgpOwotCWlmIChwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykKLQkgICAgb3BfcHJpbnRfaXRlbSAoaWgsIEJfSV9QSVRFTSAoYmgsIGloKSk7Ci0gICAgfQotCi0gICAgcHJpbnRrICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0KLSAgICByZXR1cm4gMDsKIH0KIAotY2hhciAqIHJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKQorc3RhdGljIGludCBwcmludF9sZWFmKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsCisJCSAgICAgIGludCBsYXN0KQogewotICAgIGlmICggY29kZSA9PSBZVVJBX0hBU0gpCi0JcmV0dXJuICJydXBhc292IjsKLSAgICBpZiAoIGNvZGUgPT0gVEVBX0hBU0gpCi0JcmV0dXJuICJ0ZWEiOwotICAgIGlmICggY29kZSA9PSBSNV9IQVNIKQotCXJldHVybiAicjUiOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCBpLCBucjsKKwlpbnQgZnJvbSwgdG87CiAKLSAgICByZXR1cm4gInVua25vd24iOworCWlmICghQl9JU19JVEVNU19MRVZFTChiaCkpCisJCXJldHVybiAxOworCisJY2hlY2tfbGVhZihiaCk7CisKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJaWggPSBCX05fUElURU1fSEVBRChiaCwgMCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisKKwlwcmludGsKKwkgICAgKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXJlaXNlcmZzX3ByaW50aygiTEVBRiBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCBiaC0+Yl9ibG9ja25yLCBiaCk7CisKKwlpZiAoIShwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykpIHsKKwkJcmVpc2VyZnNfcHJpbnRrKCJGSVJTVCBJVEVNX0tFWTogJWssIExBU1QgSVRFTSBLRVk6ICVrXG4iLAorCQkJCSYoaWgtPmloX2tleSksICYoKGloICsgbnIgLSAxKS0+aWhfa2V5KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChmaXJzdCA8IDAgfHwgZmlyc3QgPiBuciAtIDEpCisJCWZyb20gPSAwOworCWVsc2UKKwkJZnJvbSA9IGZpcnN0OworCisJaWYgKGxhc3QgPCAwIHx8IGxhc3QgPiBucikKKwkJdG8gPSBucjsKKwllbHNlCisJCXRvID0gbGFzdDsKKworCWloICs9IGZyb207CisJcHJpbnRrCisJICAgICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrCisJICAgICgifCMjfCAgIHR5cGUgICAgfCAgICAgICAgICAga2V5ICAgICAgICAgICB8IGlsZW4gfCBmcmVlX3NwYWNlIHwgdmVyc2lvbiB8IGxvYyAgfFxuIik7CisJZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyssIGloKyspIHsKKwkJcHJpbnRrCisJCSAgICAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlyZWlzZXJmc19wcmludGsoInwlMmR8ICVoIHxcbiIsIGksIGloKTsKKwkJaWYgKHByaW50X21vZGUgJiBQUklOVF9MRUFGX0lURU1TKQorCQkJb3BfcHJpbnRfaXRlbShpaCwgQl9JX1BJVEVNKGJoLCBpaCkpOworCX0KKworCXByaW50aworCSAgICAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKnJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKQoreworCWlmIChjb2RlID09IFlVUkFfSEFTSCkKKwkJcmV0dXJuICJydXBhc292IjsKKwlpZiAoY29kZSA9PSBURUFfSEFTSCkKKwkJcmV0dXJuICJ0ZWEiOworCWlmIChjb2RlID09IFI1X0hBU0gpCisJCXJldHVybiAicjUiOworCisJcmV0dXJuICJ1bmtub3duIjsKIH0KIAogLyogcmV0dXJuIDEgaWYgdGhpcyBpcyBub3Qgc3VwZXIgYmxvY2sgKi8KLXN0YXRpYyBpbnQgcHJpbnRfc3VwZXJfYmxvY2sgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQorc3RhdGljIGludCBwcmludF9zdXBlcl9ibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKShiaC0+Yl9kYXRhKTsKLSAgICBpbnQgc2tpcHBlZCwgZGF0YV9ibG9ja3M7Ci0gICAgY2hhciAqdmVyc2lvbjsKLSAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9CisJICAgIChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKikoYmgtPmJfZGF0YSk7CisJaW50IHNraXBwZWQsIGRhdGFfYmxvY2tzOworCWNoYXIgKnZlcnNpb247CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzXzNfNShycykpIHsKLSAgICAgICAgdmVyc2lvbiA9ICIzLjUiOwotICAgIH0gZWxzZSBpZiAoaXNfcmVpc2VyZnNfM182KHJzKSkgewotICAgICAgICB2ZXJzaW9uID0gIjMuNiI7Ci0gICAgfSBlbHNlIGlmIChpc19yZWlzZXJmc19qcihycykpIHsKLSAgICAgIHZlcnNpb24gPSAoKHNiX3ZlcnNpb24ocnMpID09IFJFSVNFUkZTX1ZFUlNJT05fMikgPwotIAkJICIzLjYiIDogIjMuNSIpOyAgCi0gICAgfSBlbHNlIHsKLQlyZXR1cm4gMTsKLSAgICB9CisJaWYgKGlzX3JlaXNlcmZzXzNfNShycykpIHsKKwkJdmVyc2lvbiA9ICIzLjUiOworCX0gZWxzZSBpZiAoaXNfcmVpc2VyZnNfM182KHJzKSkgeworCQl2ZXJzaW9uID0gIjMuNiI7CisJfSBlbHNlIGlmIChpc19yZWlzZXJmc19qcihycykpIHsKKwkJdmVyc2lvbiA9ICgoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8yKSA/CisJCQkgICAiMy42IiA6ICIzLjUiKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMTsKKwl9CiAKLSAgICBwcmludGsgKCIlc1wncyBzdXBlciBibG9jayBpcyBpbiBibG9jayAlbGx1XG4iLCBiZGV2bmFtZSAoYmgtPmJfYmRldiwgYiksCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwotICAgIHByaW50ayAoIlJlaXNlcmZzIHZlcnNpb24gJXNcbiIsIHZlcnNpb24gKTsKLSAgICBwcmludGsgKCJCbG9jayBjb3VudCAldVxuIiwgc2JfYmxvY2tfY291bnQocnMpKTsKLSAgICBwcmludGsgKCJCbG9ja3NpemUgJWRcbiIsIHNiX2Jsb2Nrc2l6ZShycykpOwotICAgIHByaW50ayAoIkZyZWUgYmxvY2tzICV1XG4iLCBzYl9mcmVlX2Jsb2NrcyhycykpOwotICAgIC8vIEZJWE1FOiB0aGlzIHdvdWxkIGJlIGNvbmZ1c2luZyBpZgotICAgIC8vIHNvbWVvbmUgc3RvcmVzIHJlaXNlcmZzIHN1cGVyIGJsb2NrIGluIHNvbWUgZGF0YSBibG9jayA7KQorCXByaW50aygiJXNcJ3Mgc3VwZXIgYmxvY2sgaXMgaW4gYmxvY2sgJWxsdVxuIiwgYmRldm5hbWUoYmgtPmJfYmRldiwgYiksCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJcHJpbnRrKCJSZWlzZXJmcyB2ZXJzaW9uICVzXG4iLCB2ZXJzaW9uKTsKKwlwcmludGsoIkJsb2NrIGNvdW50ICV1XG4iLCBzYl9ibG9ja19jb3VudChycykpOworCXByaW50aygiQmxvY2tzaXplICVkXG4iLCBzYl9ibG9ja3NpemUocnMpKTsKKwlwcmludGsoIkZyZWUgYmxvY2tzICV1XG4iLCBzYl9mcmVlX2Jsb2NrcyhycykpOworCS8vIEZJWE1FOiB0aGlzIHdvdWxkIGJlIGNvbmZ1c2luZyBpZgorCS8vIHNvbWVvbmUgc3RvcmVzIHJlaXNlcmZzIHN1cGVyIGJsb2NrIGluIHNvbWUgZGF0YSBibG9jayA7KQogLy8gICAgc2tpcHBlZCA9IChiaC0+Yl9ibG9ja25yICogYmgtPmJfc2l6ZSkgLyBzYl9ibG9ja3NpemUocnMpOwotICAgIHNraXBwZWQgPSBiaC0+Yl9ibG9ja25yOwotICAgIGRhdGFfYmxvY2tzID0gc2JfYmxvY2tfY291bnQocnMpIC0gc2tpcHBlZCAtIDEgLSBzYl9ibWFwX25yKHJzKSAtCi0JICAgICghaXNfcmVpc2VyZnNfanIocnMpID8gc2JfanBfam91cm5hbF9zaXplKHJzKSArIDEgOiBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbChycykpIC0JICAgIAotCSAgICBzYl9mcmVlX2Jsb2Nrcyhycyk7Ci0gICAgcHJpbnRrICgiQnVzeSBibG9ja3MgKHNraXBwZWQgJWQsIGJpdG1hcHMgLSAlZCwgam91cm5hbCAob3IgcmVzZXJ2ZWQpIGJsb2NrcyAtICVkXG4iCi0JICAgICIxIHN1cGVyIGJsb2NrLCAlZCBkYXRhIGJsb2Nrc1xuIiwgCi0JICAgIHNraXBwZWQsIHNiX2JtYXBfbnIocnMpLCAoIWlzX3JlaXNlcmZzX2pyKHJzKSA/IChzYl9qcF9qb3VybmFsX3NpemUocnMpICsgMSkgOgotCQkJCSAgICAgIHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsKHJzKSkgLCBkYXRhX2Jsb2Nrcyk7Ci0gICAgcHJpbnRrICgiUm9vdCBibG9jayAldVxuIiwgc2Jfcm9vdF9ibG9jayhycykpOwotICAgIHByaW50ayAoIkpvdXJuYWwgYmxvY2sgKGZpcnN0KSAlZFxuIiwgc2JfanBfam91cm5hbF8xc3RfYmxvY2socnMpKTsKLSAgICBwcmludGsgKCJKb3VybmFsIGRldiAlZFxuIiwgc2JfanBfam91cm5hbF9kZXYocnMpKTsKLSAgICBwcmludGsgKCJKb3VybmFsIG9yaWcgc2l6ZSAlZFxuIiwgc2JfanBfam91cm5hbF9zaXplKHJzKSk7Ci0gICAgcHJpbnRrICgiRlMgc3RhdGUgJWRcbiIsIHNiX2ZzX3N0YXRlKHJzKSk7Ci0gICAgcHJpbnRrICgiSGFzaCBmdW5jdGlvbiBcIiVzXCJcbiIsCi0JICAgIHJlaXNlcmZzX2hhc2huYW1lKHNiX2hhc2hfZnVuY3Rpb25fY29kZShycykpKTsKLSAgICAKLSAgICBwcmludGsgKCJUcmVlIGhlaWdodCAlZFxuIiwgc2JfdHJlZV9oZWlnaHQocnMpKTsKLSAgICByZXR1cm4gMDsKKwlza2lwcGVkID0gYmgtPmJfYmxvY2tucjsKKwlkYXRhX2Jsb2NrcyA9IHNiX2Jsb2NrX2NvdW50KHJzKSAtIHNraXBwZWQgLSAxIC0gc2JfYm1hcF9ucihycykgLQorCSAgICAoIWlzX3JlaXNlcmZzX2pyKHJzKSA/IHNiX2pwX2pvdXJuYWxfc2l6ZShycykgKworCSAgICAgMSA6IHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsKHJzKSkgLSBzYl9mcmVlX2Jsb2Nrcyhycyk7CisJcHJpbnRrCisJICAgICgiQnVzeSBibG9ja3MgKHNraXBwZWQgJWQsIGJpdG1hcHMgLSAlZCwgam91cm5hbCAob3IgcmVzZXJ2ZWQpIGJsb2NrcyAtICVkXG4iCisJICAgICAiMSBzdXBlciBibG9jaywgJWQgZGF0YSBibG9ja3NcbiIsIHNraXBwZWQsIHNiX2JtYXBfbnIocnMpLAorCSAgICAgKCFpc19yZWlzZXJmc19qcihycykgPyAoc2JfanBfam91cm5hbF9zaXplKHJzKSArIDEpIDoKKwkgICAgICBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbChycykpLCBkYXRhX2Jsb2Nrcyk7CisJcHJpbnRrKCJSb290IGJsb2NrICV1XG4iLCBzYl9yb290X2Jsb2NrKHJzKSk7CisJcHJpbnRrKCJKb3VybmFsIGJsb2NrIChmaXJzdCkgJWRcbiIsIHNiX2pwX2pvdXJuYWxfMXN0X2Jsb2NrKHJzKSk7CisJcHJpbnRrKCJKb3VybmFsIGRldiAlZFxuIiwgc2JfanBfam91cm5hbF9kZXYocnMpKTsKKwlwcmludGsoIkpvdXJuYWwgb3JpZyBzaXplICVkXG4iLCBzYl9qcF9qb3VybmFsX3NpemUocnMpKTsKKwlwcmludGsoIkZTIHN0YXRlICVkXG4iLCBzYl9mc19zdGF0ZShycykpOworCXByaW50aygiSGFzaCBmdW5jdGlvbiBcIiVzXCJcbiIsCisJICAgICAgIHJlaXNlcmZzX2hhc2huYW1lKHNiX2hhc2hfZnVuY3Rpb25fY29kZShycykpKTsKKworCXByaW50aygiVHJlZSBoZWlnaHQgJWRcbiIsIHNiX3RyZWVfaGVpZ2h0KHJzKSk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJpbnRfZGVzY19ibG9jayAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgaW50IHByaW50X2Rlc2NfYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICpkZXNjOwogCi0gICAgaWYgKG1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljIChiaCksIEpPVVJOQUxfREVTQ19NQUdJQywgOCkpCi0JcmV0dXJuIDE7CisJaWYgKG1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljKGJoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkKKwkJcmV0dXJuIDE7CiAKLSAgICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKikoYmgtPmJfZGF0YSk7Ci0gICAgcHJpbnRrICgiRGVzYyBibG9jayAlbGx1IChqX3RyYW5zX2lkICVkLCBqX21vdW50X2lkICVkLCBqX2xlbiAlZCkiLAotCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIGdldF9kZXNjX3RyYW5zX2lkIChkZXNjKSwgZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpLAotCSAgICBnZXRfZGVzY190cmFuc19sZW4gKGRlc2MpKTsKKwlkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKikoYmgtPmJfZGF0YSk7CisJcHJpbnRrKCJEZXNjIGJsb2NrICVsbHUgKGpfdHJhbnNfaWQgJWQsIGpfbW91bnRfaWQgJWQsIGpfbGVuICVkKSIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyksCisJICAgICAgIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQotdm9pZCBwcmludF9ibG9jayAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIC4uLikvL2ludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsIGludCBsYXN0KQordm9pZCBwcmludF9ibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAuLi4pCS8vaW50IHByaW50X21vZGUsIGludCBmaXJzdCwgaW50IGxhc3QpCiB7Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGludCBtb2RlLCBmaXJzdCwgbGFzdDsKKwl2YV9saXN0IGFyZ3M7CisJaW50IG1vZGUsIGZpcnN0LCBsYXN0OwogCi0gICAgdmFfc3RhcnQgKGFyZ3MsIGJoKTsKKwl2YV9zdGFydChhcmdzLCBiaCk7CiAKLSAgICBpZiAoICEgYmggKSB7Ci0JcHJpbnRrKCJwcmludF9ibG9jazogYnVmZmVyIGlzIE5VTExcbiIpOwotCXJldHVybjsKLSAgICB9CisJaWYgKCFiaCkgeworCQlwcmludGsoInByaW50X2Jsb2NrOiBidWZmZXIgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CiAKLSAgICBtb2RlID0gdmFfYXJnIChhcmdzLCBpbnQpOwotICAgIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBpbnQpOwotICAgIGxhc3QgPSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0gICAgaWYgKHByaW50X2xlYWYgKGJoLCBtb2RlLCBmaXJzdCwgbGFzdCkpCi0JaWYgKHByaW50X2ludGVybmFsIChiaCwgZmlyc3QsIGxhc3QpKQotCSAgICBpZiAocHJpbnRfc3VwZXJfYmxvY2sgKGJoKSkKLQkJaWYgKHByaW50X2Rlc2NfYmxvY2sgKGJoKSkKLQkJICAgIHByaW50ayAoIkJsb2NrICVsbHUgY29udGFpbnMgdW5mb3JtYXR0ZWQgZGF0YVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwltb2RlID0gdmFfYXJnKGFyZ3MsIGludCk7CisJZmlyc3QgPSB2YV9hcmcoYXJncywgaW50KTsKKwlsYXN0ID0gdmFfYXJnKGFyZ3MsIGludCk7CisJaWYgKHByaW50X2xlYWYoYmgsIG1vZGUsIGZpcnN0LCBsYXN0KSkKKwkJaWYgKHByaW50X2ludGVybmFsKGJoLCBmaXJzdCwgbGFzdCkpCisJCQlpZiAocHJpbnRfc3VwZXJfYmxvY2soYmgpKQorCQkJCWlmIChwcmludF9kZXNjX2Jsb2NrKGJoKSkKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIkJsb2NrICVsbHUgY29udGFpbnMgdW5mb3JtYXR0ZWQgZGF0YVxuIiwKKwkJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwogfQogCi0KLQogc3RhdGljIGNoYXIgcHJpbnRfdGJfYnVmWzIwNDhdOwogCiAvKiB0aGlzIHN0b3JlcyBpbml0aWFsIHN0YXRlIG9mIHRyZWUgYmFsYW5jZSBpbiB0aGUgcHJpbnRfdGJfYnVmICovCi12b2lkIHN0b3JlX3ByaW50X3RiIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit2b2lkIHN0b3JlX3ByaW50X3RiKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICAgIGludCBoID0gMDsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoLCAqIHRiRmg7CisJaW50IGggPSAwOworCWludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTaCwgKnRiRmg7CiAKLSAgICBpZiAoIXRiKQotCXJldHVybjsKKwlpZiAoIXRiKQorCQlyZXR1cm47CiAKLSAgICBzcHJpbnRmIChwcmludF90Yl9idWYsICJcbiIKLQkgICAgICJCQUxBTkNJTkcgJWRcbiIKLQkgICAgICJNT0RFPSVjLCBJVEVNX1BPUz0lZCBQT1NfSU5fSVRFTT0lZFxuIiAKLQkgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkgICAgICIqIGggKiAgICBTICAgICogICAgTCAgICAqICAgIFIgICAgKiAgIEYgICAqICAgRkwgICogICBGUiAgKiAgQ0ZMICAqICBDRlIgICpcbiIsCi0JICAgICBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UsCi0JICAgICB0Yi0+dGJfbW9kZSwgUEFUSF9MQVNUX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCksIHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbSk7Ci0gIAotICAgIGZvciAoaCA9IDA7IGggPCBzaXplb2YodGItPmluc2VydF9zaXplKSAvIHNpemVvZiAodGItPmluc2VydF9zaXplWzBdKTsgaCArKykgewotCWlmIChQQVRIX0hfUEFUSF9PRkZTRVQgKHRiLT50Yl9wYXRoLCBoKSA8PSB0Yi0+dGJfcGF0aC0+cGF0aF9sZW5ndGggJiYgCi0JICAgIFBBVEhfSF9QQVRIX09GRlNFVCAodGItPnRiX3BhdGgsIGgpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7Ci0JICAgIHRiU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCSAgICB0YkZoID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKLQl9IGVsc2UgewotCSAgICB0YlNoID0gTlVMTDsKLQkgICAgdGJGaCA9IE5VTEw7CisJc3ByaW50ZihwcmludF90Yl9idWYsICJcbiIKKwkJIkJBTEFOQ0lORyAlZFxuIgorCQkiTU9ERT0lYywgSVRFTV9QT1M9JWQgUE9TX0lOX0lURU09JWRcbiIKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkiKiBoICogICAgUyAgICAqICAgIEwgICAgKiAgICBSICAgICogICBGICAgKiAgIEZMICAqICAgRlIgICogIENGTCAgKiAgQ0ZSICAqXG4iLAorCQlSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UsCisJCXRiLT50Yl9tb2RlLCBQQVRIX0xBU1RfUE9TSVRJT04odGItPnRiX3BhdGgpLAorCQl0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW0pOworCisJZm9yIChoID0gMDsgaCA8IHNpemVvZih0Yi0+aW5zZXJ0X3NpemUpIC8gc2l6ZW9mKHRiLT5pbnNlcnRfc2l6ZVswXSk7CisJICAgICBoKyspIHsKKwkJaWYgKFBBVEhfSF9QQVRIX09GRlNFVCh0Yi0+dGJfcGF0aCwgaCkgPD0KKwkJICAgIHRiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aAorCQkgICAgJiYgUEFUSF9IX1BBVEhfT0ZGU0VUKHRiLT50Yl9wYXRoLAorCQkJCQkgIGgpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CisJCQl0YlNoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQkJdGJGaCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJfSBlbHNlIHsKKwkJCXRiU2ggPSBOVUxMOworCQkJdGJGaCA9IE5VTEw7CisJCX0KKwkJc3ByaW50ZihwcmludF90Yl9idWYgKyBzdHJsZW4ocHJpbnRfdGJfYnVmKSwKKwkJCSIqICVkICogJTNsbGQoJTJkKSAqICUzbGxkKCUyZCkgKiAlM2xsZCglMmQpICogJTVsbGQgKiAlNWxsZCAqICU1bGxkICogJTVsbGQgKiAlNWxsZCAqXG4iLAorCQkJaCwKKwkJCSh0YlNoKSA/IChsb25nIGxvbmcpKHRiU2gtPmJfYmxvY2tucikgOiAoLTFMTCksCisJCQkodGJTaCkgPyBhdG9taWNfcmVhZCgmKHRiU2gtPmJfY291bnQpKSA6IC0xLAorCQkJKHRiLT5MW2hdKSA/IChsb25nIGxvbmcpKHRiLT5MW2hdLT5iX2Jsb2NrbnIpIDogKC0xTEwpLAorCQkJKHRiLT5MW2hdKSA/IGF0b21pY19yZWFkKCYodGItPkxbaF0tPmJfY291bnQpKSA6IC0xLAorCQkJKHRiLT5SW2hdKSA/IChsb25nIGxvbmcpKHRiLT5SW2hdLT5iX2Jsb2NrbnIpIDogKC0xTEwpLAorCQkJKHRiLT5SW2hdKSA/IGF0b21pY19yZWFkKCYodGItPlJbaF0tPmJfY291bnQpKSA6IC0xLAorCQkJKHRiRmgpID8gKGxvbmcgbG9uZykodGJGaC0+Yl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+RkxbaF0pID8gKGxvbmcgbG9uZykodGItPkZMW2hdLT4KKwkJCQkJCSAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+RlJbaF0pID8gKGxvbmcgbG9uZykodGItPkZSW2hdLT4KKwkJCQkJCSAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+Q0ZMW2hdKSA/IChsb25nIGxvbmcpKHRiLT5DRkxbaF0tPgorCQkJCQkJICAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+Q0ZSW2hdKSA/IChsb25nIGxvbmcpKHRiLT5DRlJbaF0tPgorCQkJCQkJICAgYl9ibG9ja25yKSA6ICgtMUxMKSk7CiAJfQotCXNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwKLQkJICIqICVkICogJTNsbGQoJTJkKSAqICUzbGxkKCUyZCkgKiAlM2xsZCglMmQpICogJTVsbGQgKiAlNWxsZCAqICU1bGxkICogJTVsbGQgKiAlNWxsZCAqXG4iLAotCQkgaCwgCi0JCSAodGJTaCkgPyAobG9uZyBsb25nKSh0YlNoLT5iX2Jsb2NrbnIpOigtMUxMKSwKLQkJICh0YlNoKSA/IGF0b21pY19yZWFkICgmKHRiU2gtPmJfY291bnQpKSA6IC0xLAotCQkgKHRiLT5MW2hdKSA/IChsb25nIGxvbmcpKHRiLT5MW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSwKLQkJICh0Yi0+TFtoXSkgPyBhdG9taWNfcmVhZCAoJih0Yi0+TFtoXS0+Yl9jb3VudCkpIDogLTEsCi0JCSAodGItPlJbaF0pID8gKGxvbmcgbG9uZykodGItPlJbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5SW2hdKSA/IGF0b21pY19yZWFkICgmKHRiLT5SW2hdLT5iX2NvdW50KSkgOiAtMSwKLQkJICh0YkZoKSA/IChsb25nIGxvbmcpKHRiRmgtPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5GTFtoXSkgPyAobG9uZyBsb25nKSh0Yi0+RkxbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5GUltoXSkgPyAobG9uZyBsb25nKSh0Yi0+RlJbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5DRkxbaF0pID8gKGxvbmcgbG9uZykodGItPkNGTFtoXS0+Yl9ibG9ja25yKTooLTFMTCksCi0JCSAodGItPkNGUltoXSkgPyAobG9uZyBsb25nKSh0Yi0+Q0ZSW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSk7Ci0gICAgfQogCi0gICAgc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLCAKLQkgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkgICAgICIqIGggKiBzaXplICogbG4gKiBsYiAqIHJuICogcmIgKiBibGtuICogczAgKiBzMSAqIHMxYiAqIHMyICogczJiICogY3VyYiAqIGxrICogcmsgKlxuIgotCSAgICAgIiogMCAqICU0ZCAqICUyZCAqICUyZCAqICUyZCAqICUyZCAqICU0ZCAqICUyZCAqICUyZCAqICUzZCAqICUyZCAqICUzZCAqICU0ZCAqICUyZCAqICUyZCAqXG4iLAotCSAgICAgdGItPmluc2VydF9zaXplWzBdLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcywgdGItPnJudW1bMF0sdGItPnJieXRlcywgdGItPmJsa251bVswXSwgCi0JICAgICB0Yi0+czBudW0sIHRiLT5zMW51bSx0Yi0+czFieXRlcywgIHRiLT5zMm51bSwgdGItPnMyYnl0ZXMsIHRiLT5jdXJfYmxrbnVtLCB0Yi0+bGtleVswXSwgdGItPnJrZXlbMF0pOworCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkJIiogaCAqIHNpemUgKiBsbiAqIGxiICogcm4gKiByYiAqIGJsa24gKiBzMCAqIHMxICogczFiICogczIgKiBzMmIgKiBjdXJiICogbGsgKiByayAqXG4iCisJCSIqIDAgKiAlNGQgKiAlMmQgKiAlMmQgKiAlMmQgKiAlMmQgKiAlNGQgKiAlMmQgKiAlMmQgKiAlM2QgKiAlMmQgKiAlM2QgKiAlNGQgKiAlMmQgKiAlMmQgKlxuIiwKKwkJdGItPmluc2VydF9zaXplWzBdLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcywgdGItPnJudW1bMF0sCisJCXRiLT5yYnl0ZXMsIHRiLT5ibGtudW1bMF0sIHRiLT5zMG51bSwgdGItPnMxbnVtLCB0Yi0+czFieXRlcywKKwkJdGItPnMybnVtLCB0Yi0+czJieXRlcywgdGItPmN1cl9ibGtudW0sIHRiLT5sa2V5WzBdLAorCQl0Yi0+cmtleVswXSk7CiAKLSAgICAvKiB0aGlzIHByaW50cyBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIG5vbi1sZWFmIGxldmVscyAqLwotICAgIGggPSAwOwotICAgIGRvIHsKLQloKys7Ci0Jc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLAotCQkgIiogJWQgKiAlNGQgKiAlMmQgKiAgICAqICUyZCAqICAgICogJTJkICpcbiIsCi0JCWgsIHRiLT5pbnNlcnRfc2l6ZVtoXSwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLCB0Yi0+YmxrbnVtW2hdKTsKLSAgICB9IHdoaWxlICh0Yi0+aW5zZXJ0X3NpemVbaF0pOworCS8qIHRoaXMgcHJpbnRzIGJhbGFuY2UgcGFyYW1ldGVycyBmb3Igbm9uLWxlYWYgbGV2ZWxzICovCisJaCA9IDA7CisJZG8geworCQloKys7CisJCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCQkiKiAlZCAqICU0ZCAqICUyZCAqICAgICogJTJkICogICAgKiAlMmQgKlxuIiwKKwkJCWgsIHRiLT5pbnNlcnRfc2l6ZVtoXSwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLAorCQkJdGItPmJsa251bVtoXSk7CisJfSB3aGlsZSAodGItPmluc2VydF9zaXplW2hdKTsKIAotICAgIHNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwgCi0JICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0JICAgICAiRkVCIGxpc3Q6ICIpOworCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkJIkZFQiBsaXN0OiAiKTsKIAotICAgIC8qIHByaW50IEZFQiBsaXN0IChsaXN0IG9mIGJ1ZmZlcnMgaW4gZm9ybSAoYmggKGJfYmxvY2tuciwgYl9jb3VudCksIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBuZXcgbm9kZXMpICovCi0gICAgaCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGItPkZFQikgLyBzaXplb2YgKHRiLT5GRUJbMF0pOyBpICsrKQotCXNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwKLQkJICIlcCAoJWxsdSAlZCklcyIsIHRiLT5GRUJbaV0sIHRiLT5GRUJbaV0gPyAodW5zaWduZWQgbG9uZyBsb25nKXRiLT5GRUJbaV0tPmJfYmxvY2tuciA6IDBVTEwsCi0JCSB0Yi0+RkVCW2ldID8gYXRvbWljX3JlYWQgKCYodGItPkZFQltpXS0+Yl9jb3VudCkpIDogMCwgCi0JCSAoaSA9PSBzaXplb2YgKHRiLT5GRUIpIC8gc2l6ZW9mICh0Yi0+RkVCWzBdKSAtIDEpID8gIlxuIiA6ICIsICIpOworCS8qIHByaW50IEZFQiBsaXN0IChsaXN0IG9mIGJ1ZmZlcnMgaW4gZm9ybSAoYmggKGJfYmxvY2tuciwgYl9jb3VudCksIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBuZXcgbm9kZXMpICovCisJaCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0Yi0+RkVCKSAvIHNpemVvZih0Yi0+RkVCWzBdKTsgaSsrKQorCQlzcHJpbnRmKHByaW50X3RiX2J1ZiArIHN0cmxlbihwcmludF90Yl9idWYpLAorCQkJIiVwICglbGx1ICVkKSVzIiwgdGItPkZFQltpXSwKKwkJCXRiLT5GRUJbaV0gPyAodW5zaWduZWQgbG9uZyBsb25nKXRiLT5GRUJbaV0tPgorCQkJYl9ibG9ja25yIDogMFVMTCwKKwkJCXRiLT5GRUJbaV0gPyBhdG9taWNfcmVhZCgmKHRiLT5GRUJbaV0tPmJfY291bnQpKSA6IDAsCisJCQkoaSA9PQorCQkJIHNpemVvZih0Yi0+RkVCKSAvIHNpemVvZih0Yi0+RkVCWzBdKSAtCisJCQkgMSkgPyAiXG4iIDogIiwgIik7CiAKLSAgICBzcHJpbnRmIChwcmludF90Yl9idWYgKyBzdHJsZW4gKHByaW50X3RiX2J1ZiksIAotCSAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PSB0aGUgZW5kID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJc3ByaW50ZihwcmludF90Yl9idWYgKyBzdHJsZW4ocHJpbnRfdGJfYnVmKSwKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PSB0aGUgZW5kID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiB9CiAKLXZvaWQgcHJpbnRfY3VyX3RiIChjaGFyICogbWVzKQordm9pZCBwcmludF9jdXJfdGIoY2hhciAqbWVzKQogewotICAgIHByaW50ayAoIiVzXG4lcyIsIG1lcywgcHJpbnRfdGJfYnVmKTsKKwlwcmludGsoIiVzXG4lcyIsIG1lcywgcHJpbnRfdGJfYnVmKTsKIH0KIAotc3RhdGljIHZvaWQgY2hlY2tfbGVhZl9ibG9ja19oZWFkIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIGNoZWNrX2xlYWZfYmxvY2tfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gIGludCBucjsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlpbnQgbnI7CiAKLSAgYmxraCA9IEJfQkxLX0hFQUQgKGJoKTsKLSAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7Ci0gIGlmICggbnIgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQotICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAxMDogY2hlY2tfbGVhZl9ibG9ja19oZWFkOiBpbnZhbGlkIGl0ZW0gbnVtYmVyICV6IiwgYmgpOwotICBpZiAoIGJsa2hfZnJlZV9zcGFjZShibGtoKSA+IAotICAgICAgYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUgKiBuciApCi0gICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy02MDIwOiBjaGVja19sZWFmX2Jsb2NrX2hlYWQ6IGludmFsaWQgZnJlZSBzcGFjZSAleiIsIGJoKTsKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCi17Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIAotICAgIGJsa2ggPSBCX0JMS19IRUFEIChiaCk7Ci0gICAgaWYgKCEoQl9MRVZFTCAoYmgpID4gRElTS19MRUFGX05PREVfTEVWRUwgJiYgQl9MRVZFTCAoYmgpIDw9IE1BWF9IRUlHSFQpKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAyNTogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBsZXZlbCAleiIsIGJoKTsKLQotICAgIGlmIChCX05SX0lURU1TIChiaCkgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAzMDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBpdGVtIG51bWJlciAleiIsIGJoKTsKLQotICAgIGlmIChCX0ZSRUVfU1BBQ0UgKGJoKSAhPSAKLQliaC0+Yl9zaXplIC0gQkxLSF9TSVpFIC0gS0VZX1NJWkUgKiBCX05SX0lURU1TIChiaCkgLSBEQ19TSVpFICogKEJfTlJfSVRFTVMgKGJoKSArIDEpKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjA0MDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBmcmVlIHNwYWNlICV6IiwgYmgpOworCWJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlpZiAobnIgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQorCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJICAgICAgICJ2cy02MDEwOiBjaGVja19sZWFmX2Jsb2NrX2hlYWQ6IGludmFsaWQgaXRlbSBudW1iZXIgJXoiLAorCQkJICAgICAgIGJoKTsKKwlpZiAoYmxraF9mcmVlX3NwYWNlKGJsa2gpID4gYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUgKiBucikKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAyMDogY2hlY2tfbGVhZl9ibG9ja19oZWFkOiBpbnZhbGlkIGZyZWUgc3BhY2UgJXoiLAorCQkJICAgICAgIGJoKTsKIAogfQogCi0KLXZvaWQgY2hlY2tfbGVhZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9ibG9ja19oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOwogCi0gICAgaWYgKCFiaCkKLQlyZXR1cm47Ci0gICAgY2hlY2tfbGVhZl9ibG9ja19oZWFkIChiaCk7Ci0gICAgZm9yIChpID0gMCwgaWggPSBCX05fUElURU1fSEVBRCAoYmgsIDApOyBpIDwgQl9OUl9JVEVNUyAoYmgpOyBpICsrLCBpaCArKykKLQlvcF9jaGVja19pdGVtIChpaCwgQl9JX1BJVEVNIChiaCwgaWgpKTsKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJaWYgKCEoQl9MRVZFTChiaCkgPiBESVNLX0xFQUZfTk9ERV9MRVZFTCAmJiBCX0xFVkVMKGJoKSA8PSBNQVhfSEVJR0hUKSkKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAyNTogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBsZXZlbCAleiIsCisJCQkgICAgICAgYmgpOworCisJaWYgKEJfTlJfSVRFTVMoYmgpID4gKGJoLT5iX3NpemUgLSBCTEtIX1NJWkUpIC8gSUhfU0laRSkKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAzMDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBpdGVtIG51bWJlciAleiIsCisJCQkgICAgICAgYmgpOworCisJaWYgKEJfRlJFRV9TUEFDRShiaCkgIT0KKwkgICAgYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIEtFWV9TSVpFICogQl9OUl9JVEVNUyhiaCkgLQorCSAgICBEQ19TSVpFICogKEJfTlJfSVRFTVMoYmgpICsgMSkpCisJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkgICAgICAgInZzLTYwNDA6IGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQ6IGludmFsaWQgZnJlZSBzcGFjZSAleiIsCisJCQkgICAgICAgYmgpOworCiB9CiAKLQotdm9pZCBjaGVja19pbnRlcm5hbCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit2b2lkIGNoZWNrX2xlYWYoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgaWYgKCFiaCkKLSAgICByZXR1cm47Ci0gIGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQgKGJoKTsKKwlpbnQgaTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKworCWlmICghYmgpCisJCXJldHVybjsKKwljaGVja19sZWFmX2Jsb2NrX2hlYWQoYmgpOworCWZvciAoaSA9IDAsIGloID0gQl9OX1BJVEVNX0hFQUQoYmgsIDApOyBpIDwgQl9OUl9JVEVNUyhiaCk7IGkrKywgaWgrKykKKwkJb3BfY2hlY2tfaXRlbShpaCwgQl9JX1BJVEVNKGJoLCBpaCkpOwogfQogCit2b2lkIGNoZWNrX2ludGVybmFsKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFiaCkKKwkJcmV0dXJuOworCWNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQoYmgpOworfQogCi12b2lkIHByaW50X3N0YXRpc3RpY3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit2b2lkIHByaW50X3N0YXRpc3RpY3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewogCi0gIC8qCi0gIHByaW50ayAoInJlaXNlcmZzX3B1dF9zdXBlcjogc2Vzc2lvbiBzdGF0aXN0aWNzOiBiYWxhbmNlcyAlZCwgZml4X25vZGVzICVkLCBcCi1ibWFwIHdpdGggc2VhcmNoICVkLCB3aXRob3V0ICVkLCBkaXIyaW5kICVkLCBpbmQyZGlyICVkXG4iLAotCSAgUkVJU0VSRlNfU0IocyktPnNfZG9fYmFsYW5jZSwgUkVJU0VSRlNfU0IocyktPnNfZml4X25vZGVzLAotCSAgUkVJU0VSRlNfU0IocyktPnNfYm1hcHMsIFJFSVNFUkZTX1NCKHMpLT5zX2JtYXBzX3dpdGhvdXRfc2VhcmNoLAotCSAgUkVJU0VSRlNfU0IocyktPnNfZGlyZWN0MmluZGlyZWN0LCBSRUlTRVJGU19TQihzKS0+c19pbmRpcmVjdDJkaXJlY3QpOwotICAqLworCS8qCisJICAgcHJpbnRrICgicmVpc2VyZnNfcHV0X3N1cGVyOiBzZXNzaW9uIHN0YXRpc3RpY3M6IGJhbGFuY2VzICVkLCBmaXhfbm9kZXMgJWQsIFwKKwkgICBibWFwIHdpdGggc2VhcmNoICVkLCB3aXRob3V0ICVkLCBkaXIyaW5kICVkLCBpbmQyZGlyICVkXG4iLAorCSAgIFJFSVNFUkZTX1NCKHMpLT5zX2RvX2JhbGFuY2UsIFJFSVNFUkZTX1NCKHMpLT5zX2ZpeF9ub2RlcywKKwkgICBSRUlTRVJGU19TQihzKS0+c19ibWFwcywgUkVJU0VSRlNfU0IocyktPnNfYm1hcHNfd2l0aG91dF9zZWFyY2gsCisJICAgUkVJU0VSRlNfU0IocyktPnNfZGlyZWN0MmluZGlyZWN0LCBSRUlTRVJGU19TQihzKS0+c19pbmRpcmVjdDJkaXJlY3QpOworCSAqLwogCiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcm9jZnMuYyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCmluZGV4IGUyNDJlYmMuLmZjMmY0M2MgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCisrKyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCkBAIC0zMywyOCArMzMsMjcgQEAKIHN0YXRpYyBpbnQgc2hvd192ZXJzaW9uKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAljaGFyICpmb3JtYXQ7Ci0gICAgCi0JaWYgKCBSRUlTRVJGU19TQihzYiktPnNfcHJvcGVydGllcyAmICgxIDw8IFJFSVNFUkZTXzNfNikgKSB7CisKKwlpZiAoUkVJU0VSRlNfU0Ioc2IpLT5zX3Byb3BlcnRpZXMgJiAoMSA8PCBSRUlTRVJGU18zXzYpKSB7CiAJCWZvcm1hdCA9ICIzLjYiOwotCX0gZWxzZSBpZiAoIFJFSVNFUkZTX1NCKHNiKS0+c19wcm9wZXJ0aWVzICYgKDEgPDwgUkVJU0VSRlNfM181KSApIHsKKwl9IGVsc2UgaWYgKFJFSVNFUkZTX1NCKHNiKS0+c19wcm9wZXJ0aWVzICYgKDEgPDwgUkVJU0VSRlNfM181KSkgewogCQlmb3JtYXQgPSAiMy41IjsKIAl9IGVsc2UgewogCQlmb3JtYXQgPSAidW5rbm93biI7CiAJfQogCi0Jc2VxX3ByaW50ZihtLCAiJXMgZm9ybWF0XHR3aXRoIGNoZWNrcyAlc1xuIiwKLQkJCWZvcm1hdCwKKwlzZXFfcHJpbnRmKG0sICIlcyBmb3JtYXRcdHdpdGggY2hlY2tzICVzXG4iLCBmb3JtYXQsCiAjaWYgZGVmaW5lZCggQ09ORklHX1JFSVNFUkZTX0NIRUNLICkKLQkJCSJvbiIKKwkJICAgIm9uIgogI2Vsc2UKLQkJCSJvZmYiCisJCSAgICJvZmYiCiAjZW5kaWYKLQkJKTsKKwkgICAgKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MoIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCi0JCQkJICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhICkKK2ludCByZWlzZXJmc19nbG9iYWxfdmVyc2lvbl9pbl9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJKnN0YXJ0ID0gYnVmZmVyOwogCSplb2YgPSAxOwpAQCAtNzksODcgKzc4LDY4IEBACiAKICNkZWZpbmUgREpGKCB4ICkgbGUzMl90b19jcHUoIHJzIC0+IHggKQogI2RlZmluZSBESlYoIHggKSBsZTMyX3RvX2NwdSggc192MSAtPiB4ICkKLSNkZWZpbmUgREpQKCB4ICkgbGUzMl90b19jcHUoIGpwIC0+IHggKSAKKyNkZWZpbmUgREpQKCB4ICkgbGUzMl90b19jcHUoIGpwIC0+IHggKQogI2RlZmluZSBKRiggeCApICggciAtPiBzX2pvdXJuYWwgLT4geCApCiAKIHN0YXRpYyBpbnQgc2hvd19zdXBlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7Ci0gICAgCi0Jc2VxX3ByaW50ZihtLAkic3RhdGU6IFx0JXNcbiIKLQkJCSJtb3VudCBvcHRpb25zOiBcdCVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIKLQkJCSJnZW4uIGNvdW50ZXI6IFx0JWlcbiIKLQkJCSJzX2ttYWxsb2NzOiBcdCVpXG4iCi0JCQkic19kaXNrX3JlYWRzOiBcdCVpXG4iCi0JCQkic19kaXNrX3dyaXRlczogXHQlaVxuIgotCQkJInNfZml4X25vZGVzOiBcdCVpXG4iCi0JCQkic19kb19iYWxhbmNlOiBcdCVpXG4iCi0JCQkic191bm5lZWRlZF9sZWZ0X25laWdoYm9yOiBcdCVpXG4iCi0JCQkic19nb29kX3NlYXJjaF9ieV9rZXlfcmVhZGE6IFx0JWlcbiIKLQkJCSJzX2JtYXBzOiBcdCVpXG4iCi0JCQkic19ibWFwc193aXRob3V0X3NlYXJjaDogXHQlaVxuIgotCQkJInNfZGlyZWN0MmluZGlyZWN0OiBcdCVpXG4iCi0JCQkic19pbmRpcmVjdDJkaXJlY3Q6IFx0JWlcbiIKLQkJCSJcbiIKLQkJCSJtYXhfaGFzaF9jb2xsaXNpb25zOiBcdCVpXG4iCiAKLQkJCSJicmVhZHM6IFx0JWx1XG4iCi0JCQkiYnJlYWRfbWlzc2VzOiBcdCVsdVxuIgotCi0JCQkic2VhcmNoX2J5X2tleTogXHQlbHVcbiIKLQkJCSJzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ6IFx0JWx1XG4iCi0JCQkic2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkKLQkJCSJpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkicGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKLQkJCSJjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKLQkJCSJkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkiZGVsZXRlX2l0ZW1fcmVzdGFydGVkOiBcdCVsdVxuIgotCi0JCQkibGVha2VkX29pZDogXHQlbHVcbiIKLQkJCSJsZWF2ZXNfcmVtb3ZhYmxlOiBcdCVsdVxuIiwKLQotCQkJU0YoIHNfbW91bnRfc3RhdGUgKSA9PSBSRUlTRVJGU19WQUxJRF9GUyA/Ci0JCQkiUkVJU0VSRlNfVkFMSURfRlMiIDogIlJFSVNFUkZTX0VSUk9SX0ZTIiwKLQkJCXJlaXNlcmZzX3I1X2hhc2goIHNiICkgPyAiRk9SQ0VfUjUgIiA6ICIiLAotCQkJcmVpc2VyZnNfcnVwYXNvdl9oYXNoKCBzYiApID8gIkZPUkNFX1JVUEFTT1YgIiA6ICIiLAotCQkJcmVpc2VyZnNfdGVhX2hhc2goIHNiICkgPyAiRk9SQ0VfVEVBICIgOiAiIiwKLQkJCXJlaXNlcmZzX2hhc2hfZGV0ZWN0KCBzYiApID8gIkRFVEVDVF9IQVNIICIgOiAiIiwKLQkJCXJlaXNlcmZzX25vX2JvcmRlciggc2IgKSA/ICJOT19CT1JERVIgIiA6ICJCT1JERVIgIiwKLQkJCXJlaXNlcmZzX25vX3VuaGFzaGVkX3JlbG9jYXRpb24oIHNiICkgPyAiTk9fVU5IQVNIRURfUkVMT0NBVElPTiAiIDogIiIsCi0JCQlyZWlzZXJmc19oYXNoZWRfcmVsb2NhdGlvbiggc2IgKSA/ICJVTkhBU0hFRF9SRUxPQ0FUSU9OICIgOiAiIiwKLQkJCXJlaXNlcmZzX3Rlc3Q0KCBzYiApID8gIlRFU1Q0ICIgOiAiIiwKLQkJCWhhdmVfbGFyZ2VfdGFpbHMoIHNiICkgPyAiVEFJTFMgIiA6IGhhdmVfc21hbGxfdGFpbHMoc2IpPyJTTUFMTF9UQUlMUyAiOiJOT19UQUlMUyAiLAotCQkJcmVwbGF5X29ubHkoIHNiICkgPyAiUkVQTEFZX09OTFkgIiA6ICIiLAotCQkJY29udmVydF9yZWlzZXJmcyggc2IgKSA/ICJDT05WICIgOiAiIiwKLQotCQkJYXRvbWljX3JlYWQoICZyIC0+IHNfZ2VuZXJhdGlvbl9jb3VudGVyICksCi0JCQlTRiggc19rbWFsbG9jcyApLAotCQkJU0YoIHNfZGlza19yZWFkcyApLAotCQkJU0YoIHNfZGlza193cml0ZXMgKSwKLQkJCVNGKCBzX2ZpeF9ub2RlcyApLAotCQkJU0YoIHNfZG9fYmFsYW5jZSApLAotCQkJU0YoIHNfdW5uZWVkZWRfbGVmdF9uZWlnaGJvciApLAotCQkJU0YoIHNfZ29vZF9zZWFyY2hfYnlfa2V5X3JlYWRhICksCi0JCQlTRiggc19ibWFwcyApLAotCQkJU0YoIHNfYm1hcHNfd2l0aG91dF9zZWFyY2ggKSwKLQkJCVNGKCBzX2RpcmVjdDJpbmRpcmVjdCApLAotCQkJU0YoIHNfaW5kaXJlY3QyZGlyZWN0ICksCi0JCQlTRlAoIG1heF9oYXNoX2NvbGxpc2lvbnMgKSwKLQkJCVNGUCggYnJlYWRzICksCi0JCQlTRlAoIGJyZWFkX21pc3MgKSwKLQkJCVNGUCggc2VhcmNoX2J5X2tleSApLAotCQkJU0ZQKCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQgKSwKLQkJCVNGUCggc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQgKSwKLQotCQkJU0ZQKCBpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQgKSwKLQkJCVNGUCggcGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZCApLAotCQkJU0ZQKCBjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZCApLAotCQkJU0ZQKCBkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQgKSwKLQkJCVNGUCggZGVsZXRlX2l0ZW1fcmVzdGFydGVkICksCi0KLQkJCVNGUCggbGVha2VkX29pZCApLAotCQkJU0ZQKCBsZWF2ZXNfcmVtb3ZhYmxlICkgKTsKKwlzZXFfcHJpbnRmKG0sICJzdGF0ZTogXHQlc1xuIgorCQkgICAibW91bnQgb3B0aW9uczogXHQlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iCisJCSAgICJnZW4uIGNvdW50ZXI6IFx0JWlcbiIKKwkJICAgInNfa21hbGxvY3M6IFx0JWlcbiIKKwkJICAgInNfZGlza19yZWFkczogXHQlaVxuIgorCQkgICAic19kaXNrX3dyaXRlczogXHQlaVxuIgorCQkgICAic19maXhfbm9kZXM6IFx0JWlcbiIKKwkJICAgInNfZG9fYmFsYW5jZTogXHQlaVxuIgorCQkgICAic191bm5lZWRlZF9sZWZ0X25laWdoYm9yOiBcdCVpXG4iCisJCSAgICJzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYTogXHQlaVxuIgorCQkgICAic19ibWFwczogXHQlaVxuIgorCQkgICAic19ibWFwc193aXRob3V0X3NlYXJjaDogXHQlaVxuIgorCQkgICAic19kaXJlY3QyaW5kaXJlY3Q6IFx0JWlcbiIKKwkJICAgInNfaW5kaXJlY3QyZGlyZWN0OiBcdCVpXG4iCisJCSAgICJcbiIKKwkJICAgIm1heF9oYXNoX2NvbGxpc2lvbnM6IFx0JWlcbiIKKwkJICAgImJyZWFkczogXHQlbHVcbiIKKwkJICAgImJyZWFkX21pc3NlczogXHQlbHVcbiIKKwkJICAgInNlYXJjaF9ieV9rZXk6IFx0JWx1XG4iCisJCSAgICJzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ6IFx0JWx1XG4iCisJCSAgICJzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImluc2VydF9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgInBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCisJCSAgICJjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImRlbGV0ZV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImxlYWtlZF9vaWQ6IFx0JWx1XG4iCisJCSAgICJsZWF2ZXNfcmVtb3ZhYmxlOiBcdCVsdVxuIiwKKwkJICAgU0Yoc19tb3VudF9zdGF0ZSkgPT0gUkVJU0VSRlNfVkFMSURfRlMgPworCQkgICAiUkVJU0VSRlNfVkFMSURfRlMiIDogIlJFSVNFUkZTX0VSUk9SX0ZTIiwKKwkJICAgcmVpc2VyZnNfcjVfaGFzaChzYikgPyAiRk9SQ0VfUjUgIiA6ICIiLAorCQkgICByZWlzZXJmc19ydXBhc292X2hhc2goc2IpID8gIkZPUkNFX1JVUEFTT1YgIiA6ICIiLAorCQkgICByZWlzZXJmc190ZWFfaGFzaChzYikgPyAiRk9SQ0VfVEVBICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfaGFzaF9kZXRlY3Qoc2IpID8gIkRFVEVDVF9IQVNIICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfbm9fYm9yZGVyKHNiKSA/ICJOT19CT1JERVIgIiA6ICJCT1JERVIgIiwKKwkJICAgcmVpc2VyZnNfbm9fdW5oYXNoZWRfcmVsb2NhdGlvbihzYikgPworCQkgICAiTk9fVU5IQVNIRURfUkVMT0NBVElPTiAiIDogIiIsCisJCSAgIHJlaXNlcmZzX2hhc2hlZF9yZWxvY2F0aW9uKHNiKSA/ICJVTkhBU0hFRF9SRUxPQ0FUSU9OICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfdGVzdDQoc2IpID8gIlRFU1Q0ICIgOiAiIiwKKwkJICAgaGF2ZV9sYXJnZV90YWlscyhzYikgPyAiVEFJTFMgIiA6IGhhdmVfc21hbGxfdGFpbHMoc2IpID8KKwkJICAgIlNNQUxMX1RBSUxTICIgOiAiTk9fVEFJTFMgIiwKKwkJICAgcmVwbGF5X29ubHkoc2IpID8gIlJFUExBWV9PTkxZICIgOiAiIiwKKwkJICAgY29udmVydF9yZWlzZXJmcyhzYikgPyAiQ09OViAiIDogIiIsCisJCSAgIGF0b21pY19yZWFkKCZyLT5zX2dlbmVyYXRpb25fY291bnRlciksIFNGKHNfa21hbGxvY3MpLAorCQkgICBTRihzX2Rpc2tfcmVhZHMpLCBTRihzX2Rpc2tfd3JpdGVzKSwgU0Yoc19maXhfbm9kZXMpLAorCQkgICBTRihzX2RvX2JhbGFuY2UpLCBTRihzX3VubmVlZGVkX2xlZnRfbmVpZ2hib3IpLAorCQkgICBTRihzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYSksIFNGKHNfYm1hcHMpLAorCQkgICBTRihzX2JtYXBzX3dpdGhvdXRfc2VhcmNoKSwgU0Yoc19kaXJlY3QyaW5kaXJlY3QpLAorCQkgICBTRihzX2luZGlyZWN0MmRpcmVjdCksIFNGUChtYXhfaGFzaF9jb2xsaXNpb25zKSwgU0ZQKGJyZWFkcyksCisJCSAgIFNGUChicmVhZF9taXNzKSwgU0ZQKHNlYXJjaF9ieV9rZXkpLAorCQkgICBTRlAoc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkKSwgU0ZQKHNlYXJjaF9ieV9rZXlfcmVzdGFydGVkKSwKKwkJICAgU0ZQKGluc2VydF9pdGVtX3Jlc3RhcnRlZCksIFNGUChwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkKSwKKwkJICAgU0ZQKGN1dF9mcm9tX2l0ZW1fcmVzdGFydGVkKSwKKwkJICAgU0ZQKGRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZCksIFNGUChkZWxldGVfaXRlbV9yZXN0YXJ0ZWQpLAorCQkgICBTRlAobGVha2VkX29pZCksIFNGUChsZWF2ZXNfcmVtb3ZhYmxlKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2OSw2MSArMTQ5LDU1IEBACiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CiAJaW50IGxldmVsOwogCi0Jc2VxX3ByaW50ZihtLAkibGV2ZWxcdCIKLQkJCSIgICAgIGJhbGFuY2VzIgotCQkJIiBbc2JrOiAgcmVhZHMiCi0JCQkiICAgZnNfY2hhbmdlZCIKLQkJCSIgICByZXN0YXJ0ZWRdIgotCQkJIiAgIGZyZWUgc3BhY2UiCi0JCQkiICAgICAgICBpdGVtcyIKLQkJCSIgICBjYW5fcmVtb3ZlIgotCQkJIiAgICAgICAgIGxudW0iCi0JCQkiICAgICAgICAgcm51bSIKLQkJCSIgICAgICAgbGJ5dGVzIgotCQkJIiAgICAgICByYnl0ZXMiCi0JCQkiICAgICBnZXRfbmVpZyIKLQkJCSIgZ2V0X25laWdfcmVzIgotCQkJIiAgbmVlZF9sX25laWciCi0JCQkiICBuZWVkX3JfbmVpZyIKLQkJCSJcbiIKLQkJCQotCQkpOworCXNlcV9wcmludGYobSwgImxldmVsXHQiCisJCSAgICIgICAgIGJhbGFuY2VzIgorCQkgICAiIFtzYms6ICByZWFkcyIKKwkJICAgIiAgIGZzX2NoYW5nZWQiCisJCSAgICIgICByZXN0YXJ0ZWRdIgorCQkgICAiICAgZnJlZSBzcGFjZSIKKwkJICAgIiAgICAgICAgaXRlbXMiCisJCSAgICIgICBjYW5fcmVtb3ZlIgorCQkgICAiICAgICAgICAgbG51bSIKKwkJICAgIiAgICAgICAgIHJudW0iCisJCSAgICIgICAgICAgbGJ5dGVzIgorCQkgICAiICAgICAgIHJieXRlcyIKKwkJICAgIiAgICAgZ2V0X25laWciCisJCSAgICIgZ2V0X25laWdfcmVzIiAiICBuZWVkX2xfbmVpZyIgIiAgbmVlZF9yX25laWciICJcbiIpOwogCi0JZm9yKCBsZXZlbCA9IDAgOyBsZXZlbCA8IE1BWF9IRUlHSFQgOyArKyBsZXZlbCApIHsKLQkJc2VxX3ByaW50ZihtLAkiJWlcdCIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybGkiCi0JCQkJIiAlMTJsaSIKLQkJCQkiICUxMmxpIgotCQkJCSIgJTEybGkiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiXG4iLAotCQkJCWxldmVsLCAKLQkJCQlTRlBMKCBiYWxhbmNlX2F0ICksCi0JCQkJU0ZQTCggc2JrX3JlYWRfYXQgKSwKLQkJCQlTRlBMKCBzYmtfZnNfY2hhbmdlZCApLAotCQkJCVNGUEwoIHNia19yZXN0YXJ0ZWQgKSwKLQkJCQlTRlBMKCBmcmVlX2F0ICksCi0JCQkJU0ZQTCggaXRlbXNfYXQgKSwKLQkJCQlTRlBMKCBjYW5fbm9kZV9iZV9yZW1vdmVkICksCi0JCQkJU0ZQTCggbG51bSApLAotCQkJCVNGUEwoIHJudW0gKSwKLQkJCQlTRlBMKCBsYnl0ZXMgKSwKLQkJCQlTRlBMKCByYnl0ZXMgKSwKLQkJCQlTRlBMKCBnZXRfbmVpZ2hib3JzICksCi0JCQkJU0ZQTCggZ2V0X25laWdoYm9yc19yZXN0YXJ0ICksCi0JCQkJU0ZQTCggbmVlZF9sX25laWdoYm9yICksCi0JCQkJU0ZQTCggbmVlZF9yX25laWdoYm9yICkKLQkJCSk7CisJZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgTUFYX0hFSUdIVDsgKytsZXZlbCkgeworCQlzZXFfcHJpbnRmKG0sICIlaVx0IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybGkiCisJCQkgICAiICUxMmxpIgorCQkJICAgIiAlMTJsaSIKKwkJCSAgICIgJTEybGkiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIlxuIiwKKwkJCSAgIGxldmVsLAorCQkJICAgU0ZQTChiYWxhbmNlX2F0KSwKKwkJCSAgIFNGUEwoc2JrX3JlYWRfYXQpLAorCQkJICAgU0ZQTChzYmtfZnNfY2hhbmdlZCksCisJCQkgICBTRlBMKHNia19yZXN0YXJ0ZWQpLAorCQkJICAgU0ZQTChmcmVlX2F0KSwKKwkJCSAgIFNGUEwoaXRlbXNfYXQpLAorCQkJICAgU0ZQTChjYW5fbm9kZV9iZV9yZW1vdmVkKSwKKwkJCSAgIFNGUEwobG51bSksCisJCQkgICBTRlBMKHJudW0pLAorCQkJICAgU0ZQTChsYnl0ZXMpLAorCQkJICAgU0ZQTChyYnl0ZXMpLAorCQkJICAgU0ZQTChnZXRfbmVpZ2hib3JzKSwKKwkJCSAgIFNGUEwoZ2V0X25laWdoYm9yc19yZXN0YXJ0KSwKKwkJCSAgIFNGUEwobmVlZF9sX25laWdoYm9yKSwgU0ZQTChuZWVkX3JfbmVpZ2hib3IpCisJCSAgICApOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTIzMiwzMSArMjA2LDMwIEBACiB7CiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CiAKLQlzZXFfcHJpbnRmKG0sCSJmcmVlX2Jsb2NrOiAlbHVcbiIKLQkJCSIgIHNjYW5fYml0bWFwOiIKLQkJCSIgICAgICAgICAgd2FpdCIKLQkJCSIgICAgICAgICAgYm1hcCIKLQkJCSIgICAgICAgICByZXRyeSIKLQkJCSIgICAgICAgIHN0b2xlbiIKLQkJCSIgIGpvdXJuYWxfaGludCIKLQkJCSJqb3VybmFsX25vaGludCIKLQkJCSJcbiIKLQkJCSIgJTE0bHUiCi0JCQkiICUxNGx1IgotCQkJIiAlMTRsdSIKLQkJCSIgJTE0bHUiCi0JCQkiICUxNGx1IgotCQkJIiAlMTRsdSIKLQkJCSIgJTE0bHUiCi0JCQkiXG4iLAotCQkJU0ZQKCBmcmVlX2Jsb2NrICksCi0JCQlTRlBGKCBjYWxsICksIAotCQkJU0ZQRiggd2FpdCApLCAKLQkJCVNGUEYoIGJtYXAgKSwKLQkJCVNGUEYoIHJldHJ5ICksCi0JCQlTRlBGKCBzdG9sZW4gKSwKLQkJCVNGUEYoIGluX2pvdXJuYWxfaGludCApLAotCQkJU0ZQRiggaW5fam91cm5hbF9ub2hpbnQgKSApOworCXNlcV9wcmludGYobSwgImZyZWVfYmxvY2s6ICVsdVxuIgorCQkgICAiICBzY2FuX2JpdG1hcDoiCisJCSAgICIgICAgICAgICAgd2FpdCIKKwkJICAgIiAgICAgICAgICBibWFwIgorCQkgICAiICAgICAgICAgcmV0cnkiCisJCSAgICIgICAgICAgIHN0b2xlbiIKKwkJICAgIiAgam91cm5hbF9oaW50IgorCQkgICAiam91cm5hbF9ub2hpbnQiCisJCSAgICJcbiIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIlxuIiwKKwkJICAgU0ZQKGZyZWVfYmxvY2spLAorCQkgICBTRlBGKGNhbGwpLAorCQkgICBTRlBGKHdhaXQpLAorCQkgICBTRlBGKGJtYXApLAorCQkgICBTRlBGKHJldHJ5KSwKKwkJICAgU0ZQRihzdG9sZW4pLAorCQkgICBTRlBGKGluX2pvdXJuYWxfaGludCksIFNGUEYoaW5fam91cm5hbF9ub2hpbnQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjY0LDQ2ICsyMzcsNDIgQEAKIHN0YXRpYyBpbnQgc2hvd19vbl9kaXNrX3N1cGVyKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JfaW5mbyA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mbyAtPiBzX3JzOwotCWludCBoYXNoX2NvZGUgPSBERkwoIHNfaGFzaF9mdW5jdGlvbl9jb2RlICk7Ci0JX191MzIgZmxhZ3MgPSBESkYoIHNfZmxhZ3MgKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mby0+c19yczsKKwlpbnQgaGFzaF9jb2RlID0gREZMKHNfaGFzaF9mdW5jdGlvbl9jb2RlKTsKKwlfX3UzMiBmbGFncyA9IERKRihzX2ZsYWdzKTsKIAotCXNlcV9wcmludGYobSwJImJsb2NrX2NvdW50OiBcdCVpXG4iCi0JCQkiZnJlZV9ibG9ja3M6IFx0JWlcbiIKLQkJCSJyb290X2Jsb2NrOiBcdCVpXG4iCi0JCQkiYmxvY2tzaXplOiBcdCVpXG4iCi0JCQkib2lkX21heHNpemU6IFx0JWlcbiIKLQkJCSJvaWRfY3Vyc2l6ZTogXHQlaVxuIgotCQkJInVtb3VudF9zdGF0ZTogXHQlaVxuIgotCQkJIm1hZ2ljOiBcdCUxMC4xMHNcbiIKLQkJCSJmc19zdGF0ZTogXHQlaVxuIgotCQkJImhhc2g6IFx0JXNcbiIKLQkJCSJ0cmVlX2hlaWdodDogXHQlaVxuIgotCQkJImJtYXBfbnI6IFx0JWlcbiIKLQkJCSJ2ZXJzaW9uOiBcdCVpXG4iCi0JCQkiZmxhZ3M6IFx0JXhbJXNdXG4iCi0JCQkicmVzZXJ2ZWRfZm9yX2pvdXJuYWw6IFx0JWlcbiIsCi0KLQkJCURGTCggc19ibG9ja19jb3VudCApLAotCQkJREZMKCBzX2ZyZWVfYmxvY2tzICksCi0JCQlERkwoIHNfcm9vdF9ibG9jayApLAotCQkJREYoIHNfYmxvY2tzaXplICksCi0JCQlERiggc19vaWRfbWF4c2l6ZSApLAotCQkJREYoIHNfb2lkX2N1cnNpemUgKSwKLQkJCURGKCBzX3Vtb3VudF9zdGF0ZSApLAotCQkJcnMgLT4gc192MS5zX21hZ2ljLAotCQkJREYoIHNfZnNfc3RhdGUgKSwKLQkJCWhhc2hfY29kZSA9PSBURUFfSEFTSCA/ICJ0ZWEiIDoKLQkJCSggaGFzaF9jb2RlID09IFlVUkFfSEFTSCApID8gInJ1cGFzb3YiIDoKLQkJCSggaGFzaF9jb2RlID09IFI1X0hBU0ggKSA/ICJyNSIgOgotCQkJKCBoYXNoX2NvZGUgPT0gVU5TRVRfSEFTSCApID8gInVuc2V0IiA6ICJ1bmtub3duIiwKLQkJCURGKCBzX3RyZWVfaGVpZ2h0ICksCi0JCQlERiggc19ibWFwX25yICksCi0JCQlERiggc192ZXJzaW9uICksCi0JCQlmbGFncywKLQkJCSggZmxhZ3MgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkICkKLQkJCT8gImF0dHJzX2NsZWFyZWQiIDogIiIsCi0JCQlERiAoc19yZXNlcnZlZF9mb3Jfam91cm5hbCkpOworCXNlcV9wcmludGYobSwgImJsb2NrX2NvdW50OiBcdCVpXG4iCisJCSAgICJmcmVlX2Jsb2NrczogXHQlaVxuIgorCQkgICAicm9vdF9ibG9jazogXHQlaVxuIgorCQkgICAiYmxvY2tzaXplOiBcdCVpXG4iCisJCSAgICJvaWRfbWF4c2l6ZTogXHQlaVxuIgorCQkgICAib2lkX2N1cnNpemU6IFx0JWlcbiIKKwkJICAgInVtb3VudF9zdGF0ZTogXHQlaVxuIgorCQkgICAibWFnaWM6IFx0JTEwLjEwc1xuIgorCQkgICAiZnNfc3RhdGU6IFx0JWlcbiIKKwkJICAgImhhc2g6IFx0JXNcbiIKKwkJICAgInRyZWVfaGVpZ2h0OiBcdCVpXG4iCisJCSAgICJibWFwX25yOiBcdCVpXG4iCisJCSAgICJ2ZXJzaW9uOiBcdCVpXG4iCisJCSAgICJmbGFnczogXHQleFslc11cbiIKKwkJICAgInJlc2VydmVkX2Zvcl9qb3VybmFsOiBcdCVpXG4iLAorCQkgICBERkwoc19ibG9ja19jb3VudCksCisJCSAgIERGTChzX2ZyZWVfYmxvY2tzKSwKKwkJICAgREZMKHNfcm9vdF9ibG9jayksCisJCSAgIERGKHNfYmxvY2tzaXplKSwKKwkJICAgREYoc19vaWRfbWF4c2l6ZSksCisJCSAgIERGKHNfb2lkX2N1cnNpemUpLAorCQkgICBERihzX3Vtb3VudF9zdGF0ZSksCisJCSAgIHJzLT5zX3YxLnNfbWFnaWMsCisJCSAgIERGKHNfZnNfc3RhdGUpLAorCQkgICBoYXNoX2NvZGUgPT0gVEVBX0hBU0ggPyAidGVhIiA6CisJCSAgIChoYXNoX2NvZGUgPT0gWVVSQV9IQVNIKSA/ICJydXBhc292IiA6CisJCSAgIChoYXNoX2NvZGUgPT0gUjVfSEFTSCkgPyAicjUiIDoKKwkJICAgKGhhc2hfY29kZSA9PSBVTlNFVF9IQVNIKSA/ICJ1bnNldCIgOiAidW5rbm93biIsCisJCSAgIERGKHNfdHJlZV9oZWlnaHQpLAorCQkgICBERihzX2JtYXBfbnIpLAorCQkgICBERihzX3ZlcnNpb24pLCBmbGFncywgKGZsYWdzICYgcmVpc2VyZnNfYXR0cnNfY2xlYXJlZCkKKwkJICAgPyAiYXR0cnNfY2xlYXJlZCIgOiAiIiwgREYoc19yZXNlcnZlZF9mb3Jfam91cm5hbCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTEsMTMxICsyODAsMTIyIEBACiBzdGF0aWMgaW50IHNob3dfb2lkbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JfaW5mbyA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mbyAtPiBzX3JzOwotCXVuc2lnbmVkIGludCBtYXBzaXplID0gbGUxNl90b19jcHUoIHJzIC0+IHNfdjEuc19vaWRfY3Vyc2l6ZSApOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSBzYl9pbmZvLT5zX3JzOworCXVuc2lnbmVkIGludCBtYXBzaXplID0gbGUxNl90b19jcHUocnMtPnNfdjEuc19vaWRfY3Vyc2l6ZSk7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF91c2VkID0gMDsKIAlpbnQgaTsKIAotCWZvciggaSA9IDAgOyBpIDwgbWFwc2l6ZSA7ICsraSApIHsKKwlmb3IgKGkgPSAwOyBpIDwgbWFwc2l6ZTsgKytpKSB7CiAJCV9fdTMyIHJpZ2h0OwogCi0JCXJpZ2h0ID0gKCBpID09IG1hcHNpemUgLSAxICkgPyBNQVhfS0VZX09CSkVDVElEIDogTUFQKCBpICsgMSApOworCQlyaWdodCA9IChpID09IG1hcHNpemUgLSAxKSA/IE1BWF9LRVlfT0JKRUNUSUQgOiBNQVAoaSArIDEpOwogCQlzZXFfcHJpbnRmKG0sICIlczogWyAleCAuLiAleCApXG4iLAotCQkJCSggaSAmIDEgKSA/ICJmcmVlIiA6ICJ1c2VkIiwgTUFQKCBpICksIHJpZ2h0ICk7Ci0JCWlmKCAhICggaSAmIDEgKSApIHsKLQkJCXRvdGFsX3VzZWQgKz0gcmlnaHQgLSBNQVAoIGkgKTsKKwkJCSAgIChpICYgMSkgPyAiZnJlZSIgOiAidXNlZCIsIE1BUChpKSwgcmlnaHQpOworCQlpZiAoIShpICYgMSkpIHsKKwkJCXRvdGFsX3VzZWQgKz0gcmlnaHQgLSBNQVAoaSk7CiAJCX0KIAl9CiAjaWYgZGVmaW5lZCggUkVJU0VSRlNfVVNFX09JRE1BUEYgKQotCWlmKCBzYl9pbmZvIC0+IG9pZG1hcC51c2VfZmlsZSAmJiAoIHNiX2luZm8gLT4gb2lkbWFwLm1hcGYgIT0gTlVMTCApICkgeworCWlmIChzYl9pbmZvLT5vaWRtYXAudXNlX2ZpbGUgJiYgKHNiX2luZm8tPm9pZG1hcC5tYXBmICE9IE5VTEwpKSB7CiAJCWxvZmZfdCBzaXplID0gc2JfaW5mby0+b2lkbWFwLm1hcGYtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7Ci0JCXRvdGFsX3VzZWQgKz0gc2l6ZSAvIHNpemVvZiggcmVpc2VyZnNfb2lkaW50ZXJ2YWxfZF90ICk7CisJCXRvdGFsX3VzZWQgKz0gc2l6ZSAvIHNpemVvZihyZWlzZXJmc19vaWRpbnRlcnZhbF9kX3QpOwogCX0KICNlbmRpZgotCXNlcV9wcmludGYobSwgInRvdGFsOiBcdCVpIFslaS8laV0gdXNlZDogJWx1IFtleGFjdF1cbiIsIAotCQkJbWFwc2l6ZSwgCi0JCQltYXBzaXplLCBsZTE2X3RvX2NwdSggcnMgLT4gc192MS5zX29pZF9tYXhzaXplICksCi0JCQl0b3RhbF91c2VkKTsKKwlzZXFfcHJpbnRmKG0sICJ0b3RhbDogXHQlaSBbJWkvJWldIHVzZWQ6ICVsdSBbZXhhY3RdXG4iLAorCQkgICBtYXBzaXplLAorCQkgICBtYXBzaXplLCBsZTE2X3RvX2NwdShycy0+c192MS5zX29pZF9tYXhzaXplKSwgdG90YWxfdXNlZCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2hvd19qb3VybmFsKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqciA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gciAtPiBzX3JzOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSByLT5zX3JzOwogCXN0cnVjdCBqb3VybmFsX3BhcmFtcyAqanAgPSAmcnMtPnNfdjEuc19qb3VybmFsOwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLSAgICAKIAotCXNlcV9wcmludGYobSwJIC8qIG9uLWRpc2sgZmllbGRzICovCi0gCQkJImpwX2pvdXJuYWxfMXN0X2Jsb2NrOiBcdCVpXG4iCi0gCQkJImpwX2pvdXJuYWxfZGV2OiBcdCVzWyV4XVxuIgotIAkJCSJqcF9qb3VybmFsX3NpemU6IFx0JWlcbiIKLSAJCQkianBfam91cm5hbF90cmFuc19tYXg6IFx0JWlcbiIKLSAJCQkianBfam91cm5hbF9tYWdpYzogXHQlaVxuIgotIAkJCSJqcF9qb3VybmFsX21heF9iYXRjaDogXHQlaVxuIgotIAkJCSJqcF9qb3VybmFsX21heF9jb21taXRfYWdlOiBcdCVpXG4iCi0gCQkJImpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTogXHQlaVxuIgotCQkJLyogaW5jb3JlIGZpZWxkcyAqLwotCQkJImpfMXN0X3Jlc2VydmVkX2Jsb2NrOiBcdCVpXG4iCSAgCi0JCQkial9zdGF0ZTogXHQlbGlcbiIJCQkKLQkJCSJqX3RyYW5zX2lkOiBcdCVsdVxuIgotCQkJImpfbW91bnRfaWQ6IFx0JWx1XG4iCi0JCQkial9zdGFydDogXHQlbHVcbiIKLQkJCSJqX2xlbjogXHQlbHVcbiIKLQkJCSJqX2xlbl9hbGxvYzogXHQlbHVcbiIKLQkJCSJqX3djb3VudDogXHQlaVxuIgotCQkJImpfYmNvdW50OiBcdCVsdVxuIgotCQkJImpfZmlyc3RfdW5mbHVzaGVkX29mZnNldDogXHQlbHVcbiIKLQkJCSJqX2xhc3RfZmx1c2hfdHJhbnNfaWQ6IFx0JWx1XG4iCi0JCQkial90cmFuc19zdGFydF90aW1lOiBcdCVsaVxuIgotCQkJImpfbGlzdF9iaXRtYXBfaW5kZXg6IFx0JWlcbiIKLQkJCSJqX211c3Rfd2FpdDogXHQlaVxuIgotCQkJImpfbmV4dF9mdWxsX2ZsdXNoOiBcdCVpXG4iCi0JCQkial9uZXh0X2FzeW5jX2ZsdXNoOiBcdCVpXG4iCi0JCQkial9jbm9kZV91c2VkOiBcdCVpXG4iCi0JCQkial9jbm9kZV9mcmVlOiBcdCVpXG4iCi0JCQkiXG4iCi0JCQkvKiByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90LmpvdXJuYWwgZmllbGRzICovCi0JCQkiaW5fam91cm5hbDogXHQlMTJsdVxuIgotCQkJImluX2pvdXJuYWxfYml0bWFwOiBcdCUxMmx1XG4iCi0JCQkiaW5fam91cm5hbF9yZXVzYWJsZTogXHQlMTJsdVxuIgotCQkJImxvY2tfam91cm5hbDogXHQlMTJsdVxuIgotCQkJImxvY2tfam91cm5hbF93YWl0OiBcdCUxMmx1XG4iCi0JCQkiam91cm5hbF9iZWdpbjogXHQlMTJsdVxuIgotCQkJImpvdXJuYWxfcmVsb2NrX3dyaXRlcnM6IFx0JTEybHVcbiIKLQkJCSJqb3VybmFsX3JlbG9ja193Y291bnQ6IFx0JTEybHVcbiIKLQkJCSJtYXJrX2RpcnR5OiBcdCUxMmx1XG4iCi0JCQkibWFya19kaXJ0eV9hbHJlYWR5OiBcdCUxMmx1XG4iCi0JCQkibWFya19kaXJ0eV9ub3Rqb3VybmFsOiBcdCUxMmx1XG4iCi0JCQkicmVzdG9yZV9wcmVwYXJlZDogXHQlMTJsdVxuIgotCQkJInByZXBhcmU6IFx0JTEybHVcbiIKLQkJCSJwcmVwYXJlX3JldHJ5OiBcdCUxMmx1XG4iLAotCi0gICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfMXN0X2Jsb2NrICksCi0gICAgICAgICAgICAgICAgICAgICAgICBiZGV2bmFtZShTQl9KT1VSTkFMKHNiKS0+al9kZXZfYmQsIGIpLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX2RldiApLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX3NpemUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF90cmFuc19tYXggKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF9tYWdpYyApLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX21heF9iYXRjaCApLAotCQkJU0JfSk9VUk5BTChzYiktPmpfbWF4X2NvbW1pdF9hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZSApLAotCi0JCQlKRiggal8xc3RfcmVzZXJ2ZWRfYmxvY2sgKSwJCQkKLQkJCUpGKCBqX3N0YXRlICksCQkJCi0JCQlKRiggal90cmFuc19pZCApLAotCQkJSkYoIGpfbW91bnRfaWQgKSwKLQkJCUpGKCBqX3N0YXJ0ICksCi0JCQlKRiggal9sZW4gKSwKLQkJCUpGKCBqX2xlbl9hbGxvYyApLAotCQkJYXRvbWljX3JlYWQoICYgciAtPiBzX2pvdXJuYWwgLT4gal93Y291bnQgKSwKLQkJCUpGKCBqX2Jjb3VudCApLAotCQkJSkYoIGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCApLAotCQkJSkYoIGpfbGFzdF9mbHVzaF90cmFuc19pZCApLAotCQkJSkYoIGpfdHJhbnNfc3RhcnRfdGltZSApLAotCQkJSkYoIGpfbGlzdF9iaXRtYXBfaW5kZXggKSwKLQkJCUpGKCBqX211c3Rfd2FpdCApLAotCQkJSkYoIGpfbmV4dF9mdWxsX2ZsdXNoICksCi0JCQlKRiggal9uZXh0X2FzeW5jX2ZsdXNoICksCi0JCQlKRiggal9jbm9kZV91c2VkICksCi0JCQlKRiggal9jbm9kZV9mcmVlICksCi0KLQkJCVNGUEooIGluX2pvdXJuYWwgKSwKLQkJCVNGUEooIGluX2pvdXJuYWxfYml0bWFwICksCi0JCQlTRlBKKCBpbl9qb3VybmFsX3JldXNhYmxlICksCi0JCQlTRlBKKCBsb2NrX2pvdXJuYWwgKSwKLQkJCVNGUEooIGxvY2tfam91cm5hbF93YWl0ICksCi0JCQlTRlBKKCBqb3VybmFsX2JlaW5nICksCi0JCQlTRlBKKCBqb3VybmFsX3JlbG9ja193cml0ZXJzICksCi0JCQlTRlBKKCBqb3VybmFsX3JlbG9ja193Y291bnQgKSwKLQkJCVNGUEooIG1hcmtfZGlydHkgKSwKLQkJCVNGUEooIG1hcmtfZGlydHlfYWxyZWFkeSApLAotCQkJU0ZQSiggbWFya19kaXJ0eV9ub3Rqb3VybmFsICksCi0JCQlTRlBKKCByZXN0b3JlX3ByZXBhcmVkICksCi0JCQlTRlBKKCBwcmVwYXJlICksCi0JCQlTRlBKKCBwcmVwYXJlX3JldHJ5ICkKLQkJKTsKKwlzZXFfcHJpbnRmKG0sCQkvKiBvbi1kaXNrIGZpZWxkcyAqLworCQkgICAianBfam91cm5hbF8xc3RfYmxvY2s6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfZGV2OiBcdCVzWyV4XVxuIgorCQkgICAianBfam91cm5hbF9zaXplOiBcdCVpXG4iCisJCSAgICJqcF9qb3VybmFsX3RyYW5zX21heDogXHQlaVxuIgorCQkgICAianBfam91cm5hbF9tYWdpYzogXHQlaVxuIgorCQkgICAianBfam91cm5hbF9tYXhfYmF0Y2g6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2U6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTogXHQlaVxuIgorCQkgICAvKiBpbmNvcmUgZmllbGRzICovCisJCSAgICJqXzFzdF9yZXNlcnZlZF9ibG9jazogXHQlaVxuIgorCQkgICAial9zdGF0ZTogXHQlbGlcbiIKKwkJICAgImpfdHJhbnNfaWQ6IFx0JWx1XG4iCisJCSAgICJqX21vdW50X2lkOiBcdCVsdVxuIgorCQkgICAial9zdGFydDogXHQlbHVcbiIKKwkJICAgImpfbGVuOiBcdCVsdVxuIgorCQkgICAial9sZW5fYWxsb2M6IFx0JWx1XG4iCisJCSAgICJqX3djb3VudDogXHQlaVxuIgorCQkgICAial9iY291bnQ6IFx0JWx1XG4iCisJCSAgICJqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQ6IFx0JWx1XG4iCisJCSAgICJqX2xhc3RfZmx1c2hfdHJhbnNfaWQ6IFx0JWx1XG4iCisJCSAgICJqX3RyYW5zX3N0YXJ0X3RpbWU6IFx0JWxpXG4iCisJCSAgICJqX2xpc3RfYml0bWFwX2luZGV4OiBcdCVpXG4iCisJCSAgICJqX211c3Rfd2FpdDogXHQlaVxuIgorCQkgICAial9uZXh0X2Z1bGxfZmx1c2g6IFx0JWlcbiIKKwkJICAgImpfbmV4dF9hc3luY19mbHVzaDogXHQlaVxuIgorCQkgICAial9jbm9kZV91c2VkOiBcdCVpXG4iICJqX2Nub2RlX2ZyZWU6IFx0JWlcbiIgIlxuIgorCQkgICAvKiByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90LmpvdXJuYWwgZmllbGRzICovCisJCSAgICJpbl9qb3VybmFsOiBcdCUxMmx1XG4iCisJCSAgICJpbl9qb3VybmFsX2JpdG1hcDogXHQlMTJsdVxuIgorCQkgICAiaW5fam91cm5hbF9yZXVzYWJsZTogXHQlMTJsdVxuIgorCQkgICAibG9ja19qb3VybmFsOiBcdCUxMmx1XG4iCisJCSAgICJsb2NrX2pvdXJuYWxfd2FpdDogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9iZWdpbjogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9yZWxvY2tfd3JpdGVyczogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9yZWxvY2tfd2NvdW50OiBcdCUxMmx1XG4iCisJCSAgICJtYXJrX2RpcnR5OiBcdCUxMmx1XG4iCisJCSAgICJtYXJrX2RpcnR5X2FscmVhZHk6IFx0JTEybHVcbiIKKwkJICAgIm1hcmtfZGlydHlfbm90am91cm5hbDogXHQlMTJsdVxuIgorCQkgICAicmVzdG9yZV9wcmVwYXJlZDogXHQlMTJsdVxuIgorCQkgICAicHJlcGFyZTogXHQlMTJsdVxuIgorCQkgICAicHJlcGFyZV9yZXRyeTogXHQlMTJsdVxuIiwKKwkJICAgREpQKGpwX2pvdXJuYWxfMXN0X2Jsb2NrKSwKKwkJICAgYmRldm5hbWUoU0JfSk9VUk5BTChzYiktPmpfZGV2X2JkLCBiKSwKKwkJICAgREpQKGpwX2pvdXJuYWxfZGV2KSwKKwkJICAgREpQKGpwX2pvdXJuYWxfc2l6ZSksCisJCSAgIERKUChqcF9qb3VybmFsX3RyYW5zX21heCksCisJCSAgIERKUChqcF9qb3VybmFsX21hZ2ljKSwKKwkJICAgREpQKGpwX2pvdXJuYWxfbWF4X2JhdGNoKSwKKwkJICAgU0JfSk9VUk5BTChzYiktPmpfbWF4X2NvbW1pdF9hZ2UsCisJCSAgIERKUChqcF9qb3VybmFsX21heF90cmFuc19hZ2UpLAorCQkgICBKRihqXzFzdF9yZXNlcnZlZF9ibG9jayksCisJCSAgIEpGKGpfc3RhdGUpLAorCQkgICBKRihqX3RyYW5zX2lkKSwKKwkJICAgSkYoal9tb3VudF9pZCksCisJCSAgIEpGKGpfc3RhcnQpLAorCQkgICBKRihqX2xlbiksCisJCSAgIEpGKGpfbGVuX2FsbG9jKSwKKwkJICAgYXRvbWljX3JlYWQoJnItPnNfam91cm5hbC0+al93Y291bnQpLAorCQkgICBKRihqX2Jjb3VudCksCisJCSAgIEpGKGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCksCisJCSAgIEpGKGpfbGFzdF9mbHVzaF90cmFuc19pZCksCisJCSAgIEpGKGpfdHJhbnNfc3RhcnRfdGltZSksCisJCSAgIEpGKGpfbGlzdF9iaXRtYXBfaW5kZXgpLAorCQkgICBKRihqX211c3Rfd2FpdCksCisJCSAgIEpGKGpfbmV4dF9mdWxsX2ZsdXNoKSwKKwkJICAgSkYoal9uZXh0X2FzeW5jX2ZsdXNoKSwKKwkJICAgSkYoal9jbm9kZV91c2VkKSwKKwkJICAgSkYoal9jbm9kZV9mcmVlKSwKKwkJICAgU0ZQSihpbl9qb3VybmFsKSwKKwkJICAgU0ZQSihpbl9qb3VybmFsX2JpdG1hcCksCisJCSAgIFNGUEooaW5fam91cm5hbF9yZXVzYWJsZSksCisJCSAgIFNGUEoobG9ja19qb3VybmFsKSwKKwkJICAgU0ZQSihsb2NrX2pvdXJuYWxfd2FpdCksCisJCSAgIFNGUEooam91cm5hbF9iZWluZyksCisJCSAgIFNGUEooam91cm5hbF9yZWxvY2tfd3JpdGVycyksCisJCSAgIFNGUEooam91cm5hbF9yZWxvY2tfd2NvdW50KSwKKwkJICAgU0ZQSihtYXJrX2RpcnR5KSwKKwkJICAgU0ZQSihtYXJrX2RpcnR5X2FscmVhZHkpLAorCQkgICBTRlBKKG1hcmtfZGlydHlfbm90am91cm5hbCksCisJCSAgIFNGUEoocmVzdG9yZV9wcmVwYXJlZCksIFNGUEoocHJlcGFyZSksIFNGUEoocHJlcGFyZV9yZXRyeSkKKwkgICAgKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUwLDcgKzQxMCw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLXN0YXRpYyB2b2lkICpyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqcl9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqIHBvcykKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBkZS0+cGFyZW50LT5kYXRhOwpAQCAtNDcyLDcgKzQzMiw3IEBACiAJcmV0dXJuIHM7CiB9CiAKLXN0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3N0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKiBwb3MpCiB7CiAJKysqcG9zOwogCWlmICh2KQpAQCAtNDg5LDcgKzQ0OSw3IEBACiBzdGF0aWMgaW50IHJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IG0tPnByaXZhdGU7Ci0JaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqKSA9IGRlLT5kYXRhOworCWludCAoKnNob3cpIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopID0gZGUtPmRhdGE7CiAJcmV0dXJuIHNob3cobSwgdik7CiB9CiAKQEAgLTUxMiwxNyArNDcyLDE3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJfZmlsZV9vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IHJfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorCS5vcGVuID0gcl9vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAogfTsKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pbmZvX3Jvb3QgPSBOVUxMOwogc3RhdGljIGNvbnN0IGNoYXIgcHJvY19pbmZvX3Jvb3RfbmFtZVtdID0gImZzL3JlaXNlcmZzIjsKIAogc3RhdGljIHZvaWQgYWRkX2ZpbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqbmFtZSwKLQlpbnQgKCpmdW5jKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopKQorCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopKQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGU7CiAJZGUgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCAwLCBSRUlTRVJGU19TQihzYiktPnByb2NkaXIpOwpAQCAtNTMyLDExICs0OTIsMTIgQEAKIAl9CiB9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9faW5pdCggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzcGluX2xvY2tfaW5pdCggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKLQlSRUlTRVJGU19TQihzYiktPnByb2NkaXIgPSBwcm9jX21rZGlyKHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIHByb2NfaW5mb19yb290KTsKLQlpZiggUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyICkgeworCXNwaW5fbG9ja19pbml0KCZfX1BJTkZPKHNiKS5sb2NrKTsKKwlSRUlTRVJGU19TQihzYiktPnByb2NkaXIgPQorCSAgICBwcm9jX21rZGlyKHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgcHJvY19pbmZvX3Jvb3QpOworCWlmIChSRUlTRVJGU19TQihzYiktPnByb2NkaXIpIHsKIAkJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwogCQlSRUlTRVJGU19TQihzYiktPnByb2NkaXItPmRhdGEgPSBzYjsKIAkJYWRkX2ZpbGUoc2IsICJ2ZXJzaW9uIiwgc2hvd192ZXJzaW9uKTsKQEAgLTU0OSwxMSArNTEwLDExIEBACiAJCXJldHVybiAwOwogCX0KIAlyZWlzZXJmc193YXJuaW5nKHNiLCAicmVpc2VyZnM6IGNhbm5vdCBjcmVhdGUgL3Byb2MvJXMvJXMiLAotCQkJIHByb2NfaW5mb19yb290X25hbWUsIHJlaXNlcmZzX2JkZXZuYW1lIChzYikgKTsKKwkJCSBwcm9jX2luZm9fcm9vdF9uYW1lLCByZWlzZXJmc19iZGV2bmFtZShzYikpOwogCXJldHVybiAxOwogfQogCi1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgKQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IFJFSVNFUkZTX1NCKHNiKS0+cHJvY2RpcjsKIAlpZiAoZGUpIHsKQEAgLTU2NSw0OCArNTI2LDQ4IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdXBlciIsIGRlKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoInZlcnNpb24iLCBkZSk7CiAJfQotCXNwaW5fbG9jayggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKLQlfX1BJTkZPKCBzYiApLmV4aXRpbmcgPSAxOwotCXNwaW5fdW5sb2NrKCAmIF9fUElORk8oIHNiICkubG9jayApOwotCWlmICggcHJvY19pbmZvX3Jvb3QgKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBwcm9jX2luZm9fcm9vdCApOworCXNwaW5fbG9jaygmX19QSU5GTyhzYikubG9jayk7CisJX19QSU5GTyhzYikuZXhpdGluZyA9IDE7CisJc3Bpbl91bmxvY2soJl9fUElORk8oc2IpLmxvY2spOworCWlmIChwcm9jX2luZm9fcm9vdCkgeworCQlyZW1vdmVfcHJvY19lbnRyeShyZWlzZXJmc19iZGV2bmFtZShzYiksIHByb2NfaW5mb19yb290KTsKIAkJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyID0gTlVMTDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoIGNoYXIgKm5hbWUsIAotCQkJCQkJICAgICAgcmVhZF9wcm9jX3QgKmZ1bmMgKQorc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbChjaGFyICpuYW1lLAorCQkJCQkJICAgICByZWFkX3Byb2NfdCAqIGZ1bmMpCiB7Ci0JcmV0dXJuICggcHJvY19pbmZvX3Jvb3QgKSA/IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIG5hbWUsIDAsIAotCQkJCQkJCSAgICBwcm9jX2luZm9fcm9vdCwgCi0JCQkJCQkJICAgIGZ1bmMsIE5VTEwgKSA6IE5VTEw7CisJcmV0dXJuIChwcm9jX2luZm9fcm9vdCkgPyBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KG5hbWUsIDAsCisJCQkJCQkJIHByb2NfaW5mb19yb290LAorCQkJCQkJCSBmdW5jLCBOVUxMKSA6IE5VTEw7CiB9CiAKLXZvaWQgcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCggY29uc3QgY2hhciAqbmFtZSApCit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSkKIHsKLQlyZW1vdmVfcHJvY19lbnRyeSggbmFtZSwgcHJvY19pbmZvX3Jvb3QgKTsKKwlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBwcm9jX2luZm9fcm9vdCk7CiB9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfaW5pdCh2b2lkKQogewotCWlmKCBwcm9jX2luZm9fcm9vdCA9PSBOVUxMICkgeworCWlmIChwcm9jX2luZm9fcm9vdCA9PSBOVUxMKSB7CiAJCXByb2NfaW5mb19yb290ID0gcHJvY19ta2Rpcihwcm9jX2luZm9fcm9vdF9uYW1lLCBOVUxMKTsKLQkJaWYoIHByb2NfaW5mb19yb290ICkgewotCQkJcHJvY19pbmZvX3Jvb3QgLT4gb3duZXIgPSBUSElTX01PRFVMRTsKKwkJaWYgKHByb2NfaW5mb19yb290KSB7CisJCQlwcm9jX2luZm9fcm9vdC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAkJfSBlbHNlIHsKLQkJCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsCi0JCQkJCSAgInJlaXNlcmZzOiBjYW5ub3QgY3JlYXRlIC9wcm9jLyVzIiwKLQkJCQkJICBwcm9jX2luZm9fcm9vdF9uYW1lICk7CisJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCSAicmVpc2VyZnM6IGNhbm5vdCBjcmVhdGUgL3Byb2MvJXMiLAorCQkJCQkgcHJvY19pbmZvX3Jvb3RfbmFtZSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSggdm9pZCApCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKHZvaWQpCiB7Ci0JaWYgKCBwcm9jX2luZm9fcm9vdCAhPSBOVUxMICkgeworCWlmIChwcm9jX2luZm9fcm9vdCAhPSBOVUxMKSB7CiAJCXByb2NfaW5mb19yb290ID0gTlVMTDsKIAkJcmVtb3ZlX3Byb2NfZW50cnkocHJvY19pbmZvX3Jvb3RfbmFtZSwgTlVMTCk7CiAJfQpAQCAtNjE2LDIyICs1NzcsNDAgQEAKIC8qIFJFSVNFUkZTX1BST0NfSU5GTyAqLwogI2Vsc2UKIAotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkgeyByZXR1cm4gMDsgfQotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkgeyByZXR1cm4gMDsgfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gMDsKK30KIAotc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbCggY2hhciAqbmFtZSwgCi0JCQkJCQkgICAgICByZWFkX3Byb2NfdCAqZnVuYyApCi17IHJldHVybiBOVUxMOyB9CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlaXNlcmZzX3Byb2NfcmVnaXN0ZXJfZ2xvYmFsKGNoYXIgKm5hbWUsCisJCQkJCQkgICAgIHJlYWRfcHJvY190ICogZnVuYykKK3sKKwlyZXR1cm4gTlVMTDsKK30KIAotdm9pZCByZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsKCBjb25zdCBjaGFyICpuYW1lICkgezt9Cit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSkKK3s7Cit9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKSB7IHJldHVybiAwOyB9Ci1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKCB2b2lkICkgeyByZXR1cm4gMDsgfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSh2b2lkKQoreworCXJldHVybiAwOworfQogCi1pbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyggY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIAotCQkJCSAgICAgb2ZmX3Qgb2Zmc2V0LAotCQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSApCi17IHJldHVybiAwOyB9CitpbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKKwkJCQkgICAgb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQogCiAvKiBSRUlTRVJGU19QUk9DX0lORk8gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvcmVzaXplLmMgYi9mcy9yZWlzZXJmcy9yZXNpemUuYwppbmRleCAxNzAwMTIwLi4zOWNjN2Y0IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9yZXNpemUuYworKysgYi9mcy9yZWlzZXJmcy9yZXNpemUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIAogICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKICAqLwotIAorCiAvKiAKICAqIFdyaXR0ZW4gYnkgQWxleGFuZGVyIFphcm9jaGVudGNldi4KICAqCkBAIC0xNywyMyArMTcsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mc19zYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAKLWludCByZWlzZXJmc19yZXNpemUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHVuc2lnbmVkIGxvbmcgYmxvY2tfY291bnRfbmV3KQoraW50IHJlaXNlcmZzX3Jlc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHVuc2lnbmVkIGxvbmcgYmxvY2tfY291bnRfbmV3KQogewotICAgICAgICBpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBzYjsKLSAgICAgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaXRtYXA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKmJpdG1hcDsKIAlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKm9sZF9iaXRtYXAgPSBTQl9BUF9CSVRNQVAocyk7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwogCXVuc2lnbmVkIGludCBibWFwX25yX25ldywgYm1hcF9ucjsKIAl1bnNpZ25lZCBpbnQgYmxvY2tfcl9uZXcsIGJsb2NrX3I7Ci0JCi0Jc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICogamI7CisKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiOwogCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCBqYml0bWFwW0pPVVJOQUxfTlVNX0JJVE1BUFNdOwotCQorCiAJdW5zaWduZWQgbG9uZyBpbnQgYmxvY2tfY291bnQsIGZyZWVfYmxvY2tzOwogCWludCBpOwotCWludCBjb3B5X3NpemUgOworCWludCBjb3B5X3NpemU7CiAKIAlzYiA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CiAKQEAgLTQ3LDEzNiArNDcsMTQ1IEBACiAJaWYgKCFiaCkgewogCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogY2FuXCd0IHJlYWQgbGFzdCBibG9ja1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwotCX0JCisJfQogCWJmb3JnZXQoYmgpOwogCiAJLyogb2xkIGRpc2sgbGF5b3V0IGRldGVjdGlvbjsgdGhvc2UgcGFydGl0aW9ucyBjYW4gYmUgbW91bnRlZCwgYnV0CiAJICogY2Fubm90IGJlIHJlc2l6ZWQgKi8KLQlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocyktPmJfYmxvY2tuciAqCVNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX3NpemUgCi0JCSE9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTICkgewotCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogdW5hYmxlIHRvIHJlc2l6ZSBhIHJlaXNlcmZzIHdpdGhvdXQgZGlzdHJpYnV0ZWQgYml0bWFwIChmcyB2ZXJzaW9uIDwgMy41LjEyKVxuIik7CisJaWYgKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2Jsb2NrbnIgKiBTQl9CVUZGRVJfV0lUSF9TQihzKS0+Yl9zaXplCisJICAgICE9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSB7CisJCXByaW50aworCQkgICAgKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byByZXNpemUgYSByZWlzZXJmcyB3aXRob3V0IGRpc3RyaWJ1dGVkIGJpdG1hcCAoZnMgdmVyc2lvbiA8IDMuNS4xMilcbiIpOwogCQlyZXR1cm4gLUVOT1RTVVBQOwogCX0KLSAgICAgICAKKwogCS8qIGNvdW50IHVzZWQgYml0cyBpbiBsYXN0IGJpdG1hcCBibG9jayAqLwotCWJsb2NrX3IgPSBTQl9CTE9DS19DT1VOVChzKSAtCi0JICAgICAgICAoU0JfQk1BUF9OUihzKSAtIDEpICogcy0+c19ibG9ja3NpemUgKiA4OwotCQorCWJsb2NrX3IgPSBTQl9CTE9DS19DT1VOVChzKSAtIChTQl9CTUFQX05SKHMpIC0gMSkgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDg7CisKIAkvKiBjb3VudCBiaXRtYXAgYmxvY2tzIGluIG5ldyBmcyAqLwotCWJtYXBfbnJfbmV3ID0gYmxvY2tfY291bnRfbmV3IC8gKCBzLT5zX2Jsb2Nrc2l6ZSAqIDggKTsKKwlibWFwX25yX25ldyA9IGJsb2NrX2NvdW50X25ldyAvIChzLT5zX2Jsb2Nrc2l6ZSAqIDgpOwogCWJsb2NrX3JfbmV3ID0gYmxvY2tfY291bnRfbmV3IC0gYm1hcF9ucl9uZXcgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDg7Ci0JaWYgKGJsb2NrX3JfbmV3KSAKKwlpZiAoYmxvY2tfcl9uZXcpCiAJCWJtYXBfbnJfbmV3Kys7CiAJZWxzZQogCQlibG9ja19yX25ldyA9IHMtPnNfYmxvY2tzaXplICogODsKIAogCS8qIHNhdmUgb2xkIHZhbHVlcyAqLwogCWJsb2NrX2NvdW50ID0gU0JfQkxPQ0tfQ09VTlQocyk7Ci0JYm1hcF9uciAgICAgPSBTQl9CTUFQX05SKHMpOworCWJtYXBfbnIgPSBTQl9CTUFQX05SKHMpOwogCiAJLyogcmVzaXppbmcgb2YgcmVpc2VyZnMgYml0bWFwcyAoam91cm5hbCBhbmQgcmVhbCksIGlmIG5lZWRlZCAqLwotCWlmIChibWFwX25yX25ldyA+IGJtYXBfbnIpIHsJICAgIAotCSAgICAvKiByZWFsbG9jYXRlIGpvdXJuYWwgYml0bWFwcyAqLwotCSAgICBpZiAocmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHMsIGpiaXRtYXAsIGJtYXBfbnJfbmV3KSA8IDApIHsKLQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGpvdXJuYWwgYml0bWFwc1xuIik7Ci0JCXVubG9ja19zdXBlcihzKSA7Ci0JCXJldHVybiAtRU5PTUVNIDsKLQkgICAgfQotCSAgICAvKiB0aGUgbmV3IGpvdXJuYWwgYml0bWFwcyBhcmUgemVybyBmaWxsZWQsIG5vdyB3ZSBjb3B5IGluIHRoZSBiaXRtYXAKLQkgICAgKiogbm9kZSBwb2ludGVycyBmcm9tIHRoZSBvbGQgam91cm5hbCBiaXRtYXAgc3RydWN0cywgYW5kIHRoZW4KLQkgICAgKiogdHJhbnNmZXIgdGhlIG5ldyBkYXRhIHN0cnVjdHVyZXMgaW50byB0aGUgam91cm5hbCBzdHJ1Y3QuCi0JICAgICoqCi0JICAgICoqIHVzaW5nIHRoZSBjb3B5X3NpemUgdmFyIGJlbG93IGFsbG93cyB0aGlzIGNvZGUgdG8gd29yayBmb3IKLQkgICAgKiogYm90aCBzaHJpbmtpbmcgYW5kIGV4cGFuZGluZyB0aGUgRlMuCi0JICAgICovCi0JICAgIGNvcHlfc2l6ZSA9IGJtYXBfbnJfbmV3IDwgYm1hcF9uciA/IGJtYXBfbnJfbmV3IDogYm1hcF9uciA7Ci0JICAgIGNvcHlfc2l6ZSA9IGNvcHlfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXBfbm9kZSAqKSA7Ci0JICAgIGZvciAoaSA9IDAgOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUyA7IGkrKykgewotCQlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKipub2RlX3RtcCA7Ci0JCWpiID0gU0JfSk9VUk5BTChzKS0+al9saXN0X2JpdG1hcCArIGkgOwotCQltZW1jcHkoamJpdG1hcFtpXS5iaXRtYXBzLCBqYi0+Yml0bWFwcywgY29weV9zaXplKSA7CisJaWYgKGJtYXBfbnJfbmV3ID4gYm1hcF9ucikgeworCQkvKiByZWFsbG9jYXRlIGpvdXJuYWwgYml0bWFwcyAqLworCQlpZiAocmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHMsIGpiaXRtYXAsIGJtYXBfbnJfbmV3KSA8IDApIHsKKwkJCXByaW50aworCQkJICAgICgicmVpc2VyZnNfcmVzaXplOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBqb3VybmFsIGJpdG1hcHNcbiIpOworCQkJdW5sb2NrX3N1cGVyKHMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJLyogdGhlIG5ldyBqb3VybmFsIGJpdG1hcHMgYXJlIHplcm8gZmlsbGVkLCBub3cgd2UgY29weSBpbiB0aGUgYml0bWFwCisJCSAqKiBub2RlIHBvaW50ZXJzIGZyb20gdGhlIG9sZCBqb3VybmFsIGJpdG1hcCBzdHJ1Y3RzLCBhbmQgdGhlbgorCQkgKiogdHJhbnNmZXIgdGhlIG5ldyBkYXRhIHN0cnVjdHVyZXMgaW50byB0aGUgam91cm5hbCBzdHJ1Y3QuCisJCSAqKgorCQkgKiogdXNpbmcgdGhlIGNvcHlfc2l6ZSB2YXIgYmVsb3cgYWxsb3dzIHRoaXMgY29kZSB0byB3b3JrIGZvcgorCQkgKiogYm90aCBzaHJpbmtpbmcgYW5kIGV4cGFuZGluZyB0aGUgRlMuCisJCSAqLworCQljb3B5X3NpemUgPSBibWFwX25yX25ldyA8IGJtYXBfbnIgPyBibWFwX25yX25ldyA6IGJtYXBfbnI7CisJCWNvcHlfc2l6ZSA9CisJCSAgICBjb3B5X3NpemUgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwX25vZGUgKik7CisJCWZvciAoaSA9IDA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTOyBpKyspIHsKKwkJCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKm5vZGVfdG1wOworCQkJamIgPSBTQl9KT1VSTkFMKHMpLT5qX2xpc3RfYml0bWFwICsgaTsKKwkJCW1lbWNweShqYml0bWFwW2ldLmJpdG1hcHMsIGpiLT5iaXRtYXBzLCBjb3B5X3NpemUpOwogCi0JCS8qIGp1c3QgaW4gY2FzZSB2ZnJlZSBzY2hlZHVsZXMgb24gdXMsIGNvcHkgdGhlIG5ldwotCQkqKiBwb2ludGVyIGludG8gdGhlIGpvdXJuYWwgc3RydWN0IGJlZm9yZSBmcmVlaW5nIHRoZSAKLQkJKiogb2xkIG9uZQotCQkqLwotCQlub2RlX3RtcCA9IGpiLT5iaXRtYXBzIDsKLQkJamItPmJpdG1hcHMgPSBqYml0bWFwW2ldLmJpdG1hcHMgOwotCQl2ZnJlZShub2RlX3RtcCkgOwotCSAgICB9CQotCQotCSAgICAvKiBhbGxvY2F0ZSBhZGRpdGlvbmFsIGJpdG1hcCBibG9ja3MsIHJlYWxsb2NhdGUgYXJyYXkgb2YgYml0bWFwCi0JICAgICAqIGJsb2NrIHBvaW50ZXJzICovCi0JICAgIGJpdG1hcCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBibWFwX25yX25ldyk7Ci0JICAgIGlmICghYml0bWFwKSB7Ci0JCS8qIEpvdXJuYWwgYml0bWFwcyBhcmUgc3RpbGwgc3VwZXJzaXplZCwgYnV0IHRoZSBtZW1vcnkgaXNuJ3QKLQkJICogbGVha2VkLCBzbyBJIGd1ZXNzIGl0J3Mgb2sgKi8KLQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JICAgIH0KLQkgICAgbWVtc2V0IChiaXRtYXAsIDAsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgYm1hcF9ucjsgaSsrKQotCQliaXRtYXBbaV0gPSBvbGRfYml0bWFwW2ldOworCQkJLyoganVzdCBpbiBjYXNlIHZmcmVlIHNjaGVkdWxlcyBvbiB1cywgY29weSB0aGUgbmV3CisJCQkgKiogcG9pbnRlciBpbnRvIHRoZSBqb3VybmFsIHN0cnVjdCBiZWZvcmUgZnJlZWluZyB0aGUgCisJCQkgKiogb2xkIG9uZQorCQkJICovCisJCQlub2RlX3RtcCA9IGpiLT5iaXRtYXBzOworCQkJamItPmJpdG1hcHMgPSBqYml0bWFwW2ldLmJpdG1hcHM7CisJCQl2ZnJlZShub2RlX3RtcCk7CisJCX0KIAotCSAgICAvKiBUaGlzIGRvZXNuJ3QgZ28gdGhyb3VnaCB0aGUgam91cm5hbCwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0by4KLQkgICAgICogVGhlIGNoYW5nZXMgYXJlIHN0aWxsIGF0b21pYzogV2UncmUgc3luY2VkIHVwIHdoZW4gdGhlIGpvdXJuYWwKLQkgICAgICogdHJhbnNhY3Rpb24gYmVnaW5zLCBhbmQgdGhlIG5ldyBiaXRtYXBzIGRvbid0IG1hdHRlciBpZiB0aGUKLQkgICAgICogdHJhbnNhY3Rpb24gZmFpbHMuICovCi0JICAgIGZvciAoaSA9IGJtYXBfbnI7IGkgPCBibWFwX25yX25ldzsgaSsrKSB7Ci0JCWJpdG1hcFtpXS5iaCA9IHNiX2dldGJsayhzLCBpICogcy0+c19ibG9ja3NpemUgKiA4KTsKLQkJbWVtc2V0KGJpdG1hcFtpXS5iaC0+Yl9kYXRhLCAwLCBzYl9ibG9ja3NpemUoc2IpKTsKLQkJcmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdCgwLCBiaXRtYXBbaV0uYmgtPmJfZGF0YSk7CisJCS8qIGFsbG9jYXRlIGFkZGl0aW9uYWwgYml0bWFwIGJsb2NrcywgcmVhbGxvY2F0ZSBhcnJheSBvZiBiaXRtYXAKKwkJICogYmxvY2sgcG9pbnRlcnMgKi8KKwkJYml0bWFwID0KKwkJICAgIHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBibWFwX25yX25ldyk7CisJCWlmICghYml0bWFwKSB7CisJCQkvKiBKb3VybmFsIGJpdG1hcHMgYXJlIHN0aWxsIHN1cGVyc2l6ZWQsIGJ1dCB0aGUgbWVtb3J5IGlzbid0CisJCQkgKiBsZWFrZWQsIHNvIEkgZ3Vlc3MgaXQncyBvayAqLworCQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChiaXRtYXAsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOworCQlmb3IgKGkgPSAwOyBpIDwgYm1hcF9ucjsgaSsrKQorCQkJYml0bWFwW2ldID0gb2xkX2JpdG1hcFtpXTsKIAotCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJpdG1hcFtpXS5iaCk7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KGJpdG1hcFtpXS5iaCkgOwotCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBbaV0uYmgpOwotCQkvLyB1cGRhdGUgYml0bWFwX2luZm8gc3R1ZmYKLQkJYml0bWFwW2ldLmZpcnN0X3plcm9faGludD0xOwotCQliaXRtYXBbaV0uZnJlZV9jb3VudCA9IHNiX2Jsb2Nrc2l6ZShzYikgKiA4IC0gMTsKLQkgICAgfQkKLQkgICAgLyogZnJlZSBvbGQgYml0bWFwIGJsb2NrcyBhcnJheSAqLwotCSAgICBTQl9BUF9CSVRNQVAocykgPSBiaXRtYXA7Ci0JICAgIHZmcmVlIChvbGRfYml0bWFwKTsKKwkJLyogVGhpcyBkb2Vzbid0IGdvIHRocm91Z2ggdGhlIGpvdXJuYWwsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdG8uCisJCSAqIFRoZSBjaGFuZ2VzIGFyZSBzdGlsbCBhdG9taWM6IFdlJ3JlIHN5bmNlZCB1cCB3aGVuIHRoZSBqb3VybmFsCisJCSAqIHRyYW5zYWN0aW9uIGJlZ2lucywgYW5kIHRoZSBuZXcgYml0bWFwcyBkb24ndCBtYXR0ZXIgaWYgdGhlCisJCSAqIHRyYW5zYWN0aW9uIGZhaWxzLiAqLworCQlmb3IgKGkgPSBibWFwX25yOyBpIDwgYm1hcF9ucl9uZXc7IGkrKykgeworCQkJYml0bWFwW2ldLmJoID0gc2JfZ2V0YmxrKHMsIGkgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDgpOworCQkJbWVtc2V0KGJpdG1hcFtpXS5iaC0+Yl9kYXRhLCAwLCBzYl9ibG9ja3NpemUoc2IpKTsKKwkJCXJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQoMCwgYml0bWFwW2ldLmJoLT5iX2RhdGEpOworCisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJpdG1hcFtpXS5iaCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBbaV0uYmgpOworCQkJc3luY19kaXJ0eV9idWZmZXIoYml0bWFwW2ldLmJoKTsKKwkJCS8vIHVwZGF0ZSBiaXRtYXBfaW5mbyBzdHVmZgorCQkJYml0bWFwW2ldLmZpcnN0X3plcm9faGludCA9IDE7CisJCQliaXRtYXBbaV0uZnJlZV9jb3VudCA9IHNiX2Jsb2Nrc2l6ZShzYikgKiA4IC0gMTsKKwkJfQorCQkvKiBmcmVlIG9sZCBiaXRtYXAgYmxvY2tzIGFycmF5ICovCisJCVNCX0FQX0JJVE1BUChzKSA9IGJpdG1hcDsKKwkJdmZyZWUob2xkX2JpdG1hcCk7CiAJfQotCQorCiAJLyogYmVnaW4gdHJhbnNhY3Rpb24sIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgaXQncyBmaW5lLiBZZXMsIHdlIGhhdmUKIAkgKiBpbmNvcnJlY3QgYml0bWFwcyBub3csIGJ1dCBub25lIG9mIGl0IGlzIGV2ZXIgZ29pbmcgdG8gdG91Y2ggdGhlCiAJICogZGlzayBhbnl3YXkuICovCiAJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKTsKIAlpZiAoZXJyKQotCSAgICByZXR1cm4gZXJyOworCQlyZXR1cm4gZXJyOwogCiAJLyogY29ycmVjdCBsYXN0IGJpdG1hcCBibG9ja3MgaW4gb2xkIGFuZCBuZXcgZGlzayBsYXlvdXQgKi8KIAlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uYmgsIDEpOwogCWZvciAoaSA9IGJsb2NrX3I7IGkgPCBzLT5zX2Jsb2Nrc2l6ZSAqIDg7IGkrKykKLQkgICAgcmVpc2VyZnNfdGVzdF9hbmRfY2xlYXJfbGVfYml0KGksIAotCQkJCQkgICBTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmJoLT5iX2RhdGEpOworCQlyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQoaSwKKwkJCQkJICAgICAgIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0KKwkJCQkJCQkgICAgICAgMV0uYmgtPmJfZGF0YSk7CiAJU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5mcmVlX2NvdW50ICs9IHMtPnNfYmxvY2tzaXplICogOCAtIGJsb2NrX3I7Ci0JaWYgKCAhU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5maXJzdF96ZXJvX2hpbnQpCi0JICAgIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uZmlyc3RfemVyb19oaW50ID0gYmxvY2tfcjsKKwlpZiAoIVNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uZmlyc3RfemVyb19oaW50KQorCQlTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmZpcnN0X3plcm9faGludCA9IGJsb2NrX3I7CiAKIAlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmJoKTsKIAogCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uYmgsIDEpOwogCWZvciAoaSA9IGJsb2NrX3JfbmV3OyBpIDwgcy0+c19ibG9ja3NpemUgKiA4OyBpKyspCi0JICAgIHJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQoaSwKLQkJCQkJIFNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmJoLT5iX2RhdGEpOworCQlyZWlzZXJmc190ZXN0X2FuZF9zZXRfbGVfYml0KGksCisJCQkJCSAgICAgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0KKwkJCQkJCQkgICAgIDFdLmJoLT5iX2RhdGEpOwogCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmJoKTsKLSAKLQlTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5mcmVlX2NvdW50IC09IHMtPnNfYmxvY2tzaXplICogOCAtIGJsb2NrX3JfbmV3OworCisJU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uZnJlZV9jb3VudCAtPQorCSAgICBzLT5zX2Jsb2Nrc2l6ZSAqIDggLSBibG9ja19yX25ldzsKIAkvKiBFeHRyZW1lIGNhc2Ugd2hlcmUgbGFzdCBiaXRtYXAgaXMgdGhlIG9ubHkgdmFsaWQgYmxvY2sgaW4gaXRzZWxmLiAqLwotCWlmICggIVNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmZyZWVfY291bnQgKQotCSAgICBTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5maXJzdF96ZXJvX2hpbnQgPSAwOwotIAkvKiB1cGRhdGUgc3VwZXIgKi8KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7CisJaWYgKCFTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5mcmVlX2NvdW50KQorCQlTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5maXJzdF96ZXJvX2hpbnQgPSAwOworCS8qIHVwZGF0ZSBzdXBlciAqLworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOwogCWZyZWVfYmxvY2tzID0gU0JfRlJFRV9CTE9DS1Mocyk7Ci0JUFVUX1NCX0ZSRUVfQkxPQ0tTKHMsIGZyZWVfYmxvY2tzICsgKGJsb2NrX2NvdW50X25ldyAtIGJsb2NrX2NvdW50IC0gKGJtYXBfbnJfbmV3IC0gYm1hcF9ucikpKTsKKwlQVVRfU0JfRlJFRV9CTE9DS1MocywKKwkJCSAgIGZyZWVfYmxvY2tzICsgKGJsb2NrX2NvdW50X25ldyAtIGJsb2NrX2NvdW50IC0KKwkJCQkJICAoYm1hcF9ucl9uZXcgLSBibWFwX25yKSkpOwogCVBVVF9TQl9CTE9DS19DT1VOVChzLCBibG9ja19jb3VudF9uZXcpOwogCVBVVF9TQl9CTUFQX05SKHMsIGJtYXBfbnJfbmV3KTsKIAlzLT5zX2RpcnQgPSAxOwogCiAJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOwotCQorCiAJU0JfSk9VUk5BTChzKS0+al9tdXN0X3dhaXQgPSAxOwogCXJldHVybiBqb3VybmFsX2VuZCgmdGgsIHMsIDEwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N0cmVlLmMgYi9mcy9yZWlzZXJmcy9zdHJlZS5jCmluZGV4IDYzMTU4NDkuLmUyZDA4ZDcgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N0cmVlLmMKKysrIGIvZnMvcmVpc2VyZnMvc3RyZWUuYwpAQCAtNTksNDYgKzU5LDQ1IEBACiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogLyogRG9lcyB0aGUgYnVmZmVyIGNvbnRhaW4gYSBkaXNrIGJsb2NrIHdoaWNoIGlzIGluIHRoZSB0cmVlLiAqLwotaW5saW5lIGludCBCX0lTX0lOX1RSRUUgKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCkKK2lubGluZSBpbnQgQl9JU19JTl9UUkVFKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoKQogewogCi0gIFJGQUxTRSggQl9MRVZFTCAocF9zX2JoKSA+IE1BWF9IRUlHSFQsCi0JICAiUEFQLTEwMTA6IGJsb2NrICglYikgaGFzIHRvbyBiaWcgbGV2ZWwgKCV6KSIsIHBfc19iaCwgcF9zX2JoKTsKKwlSRkFMU0UoQl9MRVZFTChwX3NfYmgpID4gTUFYX0hFSUdIVCwKKwkgICAgICAgIlBBUC0xMDEwOiBibG9jayAoJWIpIGhhcyB0b28gYmlnIGxldmVsICgleikiLCBwX3NfYmgsIHBfc19iaCk7CiAKLSAgcmV0dXJuICggQl9MRVZFTCAocF9zX2JoKSAhPSBGUkVFX0xFVkVMICk7CisJcmV0dXJuIChCX0xFVkVMKHBfc19iaCkgIT0gRlJFRV9MRVZFTCk7CiB9CiAKIC8vCiAvLyB0byBnZXRzIGl0ZW0gaGVhZCBpbiBsZSBmb3JtCiAvLwotaW5saW5lIHZvaWQgY29weV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqIHBfdl90bywgCi0JCQkgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogcF92X2Zyb20pCitpbmxpbmUgdm9pZCBjb3B5X2l0ZW1faGVhZChzdHJ1Y3QgaXRlbV9oZWFkICpwX3ZfdG8sCisJCQkgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICpwX3ZfZnJvbSkKIHsKLSAgbWVtY3B5IChwX3ZfdG8sIHBfdl9mcm9tLCBJSF9TSVpFKTsKKwltZW1jcHkocF92X3RvLCBwX3ZfZnJvbSwgSUhfU0laRSk7CiB9CiAKLQogLyogazEgaXMgcG9pbnRlciB0byBvbi1kaXNrIHN0cnVjdHVyZSB3aGljaCBpcyBzdG9yZWQgaW4gbGl0dGxlLWVuZGlhbgogICAgZm9ybS4gazIgaXMgcG9pbnRlciB0byBjcHUgdmFyaWFibGUuIEZvciBrZXkgb2YgaXRlbXMgb2YgdGhlIHNhbWUKICAgIG9iamVjdCB0aGlzIHJldHVybnMgMC4KICAgIFJldHVybnM6IC0xIGlmIGtleTEgPCBrZXkyIAogICAgMCBpZiBrZXkxID09IGtleTIKICAgIDEgaWYga2V5MSA+IGtleTIgKi8KLWlubGluZSBpbnQgIGNvbXBfc2hvcnRfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGxlX2tleSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBjcHVfa2V5KQoraW5saW5lIGludCBjb21wX3Nob3J0X2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqbGVfa2V5LAorCQkJICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmNwdV9rZXkpCiB7Ci0gIF9fdTMyIG47Ci0gIG4gPSBsZTMyX3RvX2NwdShsZV9rZXktPmtfZGlyX2lkKTsKLSAgaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKLSAgICAgIHJldHVybiAtMTsKLSAgaWYgKG4gPiBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKLSAgICAgIHJldHVybiAxOwotICBuID0gbGUzMl90b19jcHUobGVfa2V5LT5rX29iamVjdGlkKTsKLSAgaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKQotICAgICAgcmV0dXJuIC0xOwotICBpZiAobiA+IGNwdV9rZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpCi0gICAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7CisJX191MzIgbjsKKwluID0gbGUzMl90b19jcHUobGVfa2V5LT5rX2Rpcl9pZCk7CisJaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKKwkJcmV0dXJuIC0xOworCWlmIChuID4gY3B1X2tleS0+b25fZGlza19rZXkua19kaXJfaWQpCisJCXJldHVybiAxOworCW4gPSBsZTMyX3RvX2NwdShsZV9rZXktPmtfb2JqZWN0aWQpOworCWlmIChuIDwgY3B1X2tleS0+b25fZGlza19rZXkua19vYmplY3RpZCkKKwkJcmV0dXJuIC0xOworCWlmIChuID4gY3B1X2tleS0+b25fZGlza19rZXkua19vYmplY3RpZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIC8qIGsxIGlzIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgd2hpY2ggaXMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4KQEAgLTEwNiw2OCArMTA1LDcyIEBACiAgICBDb21wYXJlIGtleXMgdXNpbmcgYWxsIDQga2V5IGZpZWxkcy4KICAgIFJldHVybnM6IC0xIGlmIGtleTEgPCBrZXkyIDAKICAgIGlmIGtleTEgPSBrZXkyIDEgaWYga2V5MSA+IGtleTIgKi8KLXN0YXRpYyBpbmxpbmUgaW50ICBjb21wX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBsZV9rZXksIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogY3B1X2tleSkKK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBfa2V5cyhjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpsZV9rZXksCisJCQkgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmNwdV9rZXkpCiB7Ci0gIGludCByZXR2YWw7CisJaW50IHJldHZhbDsKIAotICByZXR2YWwgPSBjb21wX3Nob3J0X2tleXMgKGxlX2tleSwgY3B1X2tleSk7Ci0gIGlmIChyZXR2YWwpCi0gICAgICByZXR1cm4gcmV0dmFsOwotICBpZiAobGVfa2V5X2tfb2Zmc2V0IChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpIDwgY3B1X2tleV9rX29mZnNldCAoY3B1X2tleSkpCi0gICAgICByZXR1cm4gLTE7Ci0gIGlmIChsZV9rZXlfa19vZmZzZXQgKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPiBjcHVfa2V5X2tfb2Zmc2V0IChjcHVfa2V5KSkKLSAgICAgIHJldHVybiAxOworCXJldHZhbCA9IGNvbXBfc2hvcnRfa2V5cyhsZV9rZXksIGNwdV9rZXkpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKGxlX2tleV9rX29mZnNldChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpIDwKKwkgICAgY3B1X2tleV9rX29mZnNldChjcHVfa2V5KSkKKwkJcmV0dXJuIC0xOworCWlmIChsZV9rZXlfa19vZmZzZXQobGVfa2V5X3ZlcnNpb24obGVfa2V5KSwgbGVfa2V5KSA+CisJICAgIGNwdV9rZXlfa19vZmZzZXQoY3B1X2tleSkpCisJCXJldHVybiAxOwogCi0gIGlmIChjcHVfa2V5LT5rZXlfbGVuZ3RoID09IDMpCi0gICAgICByZXR1cm4gMDsKKwlpZiAoY3B1X2tleS0+a2V5X2xlbmd0aCA9PSAzKQorCQlyZXR1cm4gMDsKIAotICAvKiB0aGlzIHBhcnQgaXMgbmVlZGVkIG9ubHkgd2hlbiB0YWlsIGNvbnZlcnNpb24gaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgaWYgKGxlX2tleV9rX3R5cGUgKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPCBjcHVfa2V5X2tfdHlwZSAoY3B1X2tleSkpCi0gICAgcmV0dXJuIC0xOworCS8qIHRoaXMgcGFydCBpcyBuZWVkZWQgb25seSB3aGVuIHRhaWwgY29udmVyc2lvbiBpcyBpbiBwcm9ncmVzcyAqLworCWlmIChsZV9rZXlfa190eXBlKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPAorCSAgICBjcHVfa2V5X2tfdHlwZShjcHVfa2V5KSkKKwkJcmV0dXJuIC0xOwogCi0gIGlmIChsZV9rZXlfa190eXBlIChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpID4gY3B1X2tleV9rX3R5cGUgKGNwdV9rZXkpKQotICAgIHJldHVybiAxOworCWlmIChsZV9rZXlfa190eXBlKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPgorCSAgICBjcHVfa2V5X2tfdHlwZShjcHVfa2V5KSkKKwkJcmV0dXJuIDE7CiAKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQotaW5saW5lIGludCBjb21wX3Nob3J0X2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkxLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5MikKK2lubGluZSBpbnQgY29tcF9zaG9ydF9sZV9rZXlzKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmtleTEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkyKQogewotICBfX3UzMiAqIHBfc18xX3UzMiwgKiBwX3NfMl91MzI7Ci0gIGludCBuX2tleV9sZW5ndGggPSBSRUlTRVJGU19TSE9SVF9LRVlfTEVOOworCV9fdTMyICpwX3NfMV91MzIsICpwX3NfMl91MzI7CisJaW50IG5fa2V5X2xlbmd0aCA9IFJFSVNFUkZTX1NIT1JUX0tFWV9MRU47CiAKLSAgcF9zXzFfdTMyID0gKF9fdTMyICopa2V5MTsKLSAgcF9zXzJfdTMyID0gKF9fdTMyICopa2V5MjsKLSAgZm9yKCA7IG5fa2V5X2xlbmd0aC0tOyArK3Bfc18xX3UzMiwgKytwX3NfMl91MzIgKSB7Ci0gICAgaWYgKCBsZTMyX3RvX2NwdSAoKnBfc18xX3UzMikgPCBsZTMyX3RvX2NwdSAoKnBfc18yX3UzMikgKQotICAgICAgcmV0dXJuIC0xOwotICAgIGlmICggbGUzMl90b19jcHUgKCpwX3NfMV91MzIpID4gbGUzMl90b19jcHUgKCpwX3NfMl91MzIpICkKLSAgICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOworCXBfc18xX3UzMiA9IChfX3UzMiAqKSBrZXkxOworCXBfc18yX3UzMiA9IChfX3UzMiAqKSBrZXkyOworCWZvciAoOyBuX2tleV9sZW5ndGgtLTsgKytwX3NfMV91MzIsICsrcF9zXzJfdTMyKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqcF9zXzFfdTMyKSA8IGxlMzJfdG9fY3B1KCpwX3NfMl91MzIpKQorCQkJcmV0dXJuIC0xOworCQlpZiAobGUzMl90b19jcHUoKnBfc18xX3UzMikgPiBsZTMyX3RvX2NwdSgqcF9zXzJfdTMyKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAotaW5saW5lIHZvaWQgbGVfa2V5MmNwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICogdG8sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBmcm9tKQoraW5saW5lIHZvaWQgbGVfa2V5MmNwdV9rZXkoc3RydWN0IGNwdV9rZXkgKnRvLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpmcm9tKQogewotICAgIGludCB2ZXJzaW9uOwotICAgIHRvLT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGxlMzJfdG9fY3B1IChmcm9tLT5rX2Rpcl9pZCk7Ci0gICAgdG8tPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBsZTMyX3RvX2NwdSAoZnJvbS0+a19vYmplY3RpZCk7Ci0gICAgCi0gICAgLy8gZmluZCBvdXQgdmVyc2lvbiBvZiB0aGUga2V5Ci0gICAgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChmcm9tKTsKLSAgICB0by0+dmVyc2lvbiA9IHZlcnNpb247Ci0gICAgdG8tPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0ID0gbGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGZyb20pOwotICAgIHRvLT5vbl9kaXNrX2tleS5rX3R5cGUgPSBsZV9rZXlfa190eXBlKHZlcnNpb24sIGZyb20pOworCWludCB2ZXJzaW9uOworCXRvLT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGxlMzJfdG9fY3B1KGZyb20tPmtfZGlyX2lkKTsKKwl0by0+b25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1KGZyb20tPmtfb2JqZWN0aWQpOworCisJLy8gZmluZCBvdXQgdmVyc2lvbiBvZiB0aGUga2V5CisJdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGZyb20pOworCXRvLT52ZXJzaW9uID0gdmVyc2lvbjsKKwl0by0+b25fZGlza19rZXkua19vZmZzZXQgPSBsZV9rZXlfa19vZmZzZXQodmVyc2lvbiwgZnJvbSk7CisJdG8tPm9uX2Rpc2tfa2V5LmtfdHlwZSA9IGxlX2tleV9rX3R5cGUodmVyc2lvbiwgZnJvbSk7CiB9CiAKLQotCiAvLyB0aGlzIGRvZXMgbm90IHNheSB3aGljaCBvbmUgaXMgYmlnZ2VyLCBpdCBvbmx5IHJldHVybnMgMSBpZiBrZXlzCiAvLyBhcmUgbm90IGVxdWFsLCAwIG90aGVyd2lzZQotaW5saW5lIGludCBjb21wX2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrMSwgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGsyKQoraW5saW5lIGludCBjb21wX2xlX2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqazEsCisJCQljb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprMikKIHsKLSAgICByZXR1cm4gbWVtY21wIChrMSwgazIsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2tleSkpOworCXJldHVybiBtZW1jbXAoazEsIGsyLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2tleSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NCwzNzMgKzE4NywzOTYgQEAKICB0aGVyZSBhcmUgbm8gcG9zc2libGUgaXRlbXMsIGFuZCB3ZSBoYXZlIG5vdCBmb3VuZCBpdC4gV2l0aCBlYWNoIGV4YW1pbmF0aW9uIHdlCiAgY3V0IHRoZSBudW1iZXIgb2YgcG9zc2libGUgaXRlbXMgaXQgY291bGQgYmUgYnkgb25lIG1vcmUgdGhhbiBoYWxmIHJvdW5kZWQgZG93biwKICBvciB3ZSBmaW5kIGl0LiAqLwotc3RhdGljIGlubGluZQlpbnQgYmluX3NlYXJjaCAoCi0gICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiBwX3Zfa2V5LCAvKiBLZXkgdG8gc2VhcmNoIGZvci4gICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICBjb25zdCB2b2lkICogcF92X2Jhc2UsLyogRmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkuICAgICAgICAgICAgICovCi0JICAgICAgaW50ICAgICAgIHBfbl9udW0sICAgIC8qIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJyYXkuICAgICAgICAqLwotCSAgICAgIGludCAgICAgICBwX25fd2lkdGgsICAvKiBJdGVtIHNpemUgaW4gdGhlIGFycmF5LgotCQkJCSAgICAgICBzZWFyY2hlZC4gTGVzdCB0aGUgcmVhZGVyIGJlCi0JCQkJICAgICAgIGNvbmZ1c2VkLCBub3RlIHRoYXQgdGhpcyBpcyBjcmFmdGVkCi0JCQkJICAgICAgIGFzIGEgZ2VuZXJhbCBmdW5jdGlvbiwgYW5kIHdoZW4gaXQKLQkJCQkgICAgICAgaXMgYXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gdGhlIGFycmF5Ci0JCQkJICAgICAgIG9mIGl0ZW0gaGVhZGVycyBpbiBhIG5vZGUsIHBfbl93aWR0aAotCQkJCSAgICAgICBpcyBhY3R1YWxseSB0aGUgaXRlbSBoZWFkZXIgc2l6ZSBub3QKLQkJCQkgICAgICAgdGhlIGl0ZW0gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICBpbnQgICAgICogcF9uX3BvcyAgICAgLyogTnVtYmVyIG9mIHRoZSBzZWFyY2hlZCBmb3IgZWxlbWVudC4gKi8KLSAgICAgICAgICAgICkgewotICAgIGludCAgIG5fcmJvdW5kLCBuX2xib3VuZCwgbl9qOworc3RhdGljIGlubGluZSBpbnQgYmluX3NlYXJjaChjb25zdCB2b2lkICpwX3Zfa2V5LAkvKiBLZXkgdG8gc2VhcmNoIGZvci4gICAgICAgICAgICAgICAgICAgKi8KKwkJCSAgICAgY29uc3Qgdm9pZCAqcF92X2Jhc2UsCS8qIEZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5LiAgICAgICAgICAgICAqLworCQkJICAgICBpbnQgcF9uX251bSwJLyogTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhcnJheS4gICAgICAgICovCisJCQkgICAgIGludCBwX25fd2lkdGgsCS8qIEl0ZW0gc2l6ZSBpbiB0aGUgYXJyYXkuCisJCQkJCQkgICBzZWFyY2hlZC4gTGVzdCB0aGUgcmVhZGVyIGJlCisJCQkJCQkgICBjb25mdXNlZCwgbm90ZSB0aGF0IHRoaXMgaXMgY3JhZnRlZAorCQkJCQkJICAgYXMgYSBnZW5lcmFsIGZ1bmN0aW9uLCBhbmQgd2hlbiBpdAorCQkJCQkJICAgaXMgYXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gdGhlIGFycmF5CisJCQkJCQkgICBvZiBpdGVtIGhlYWRlcnMgaW4gYSBub2RlLCBwX25fd2lkdGgKKwkJCQkJCSAgIGlzIGFjdHVhbGx5IHRoZSBpdGVtIGhlYWRlciBzaXplIG5vdAorCQkJCQkJICAgdGhlIGl0ZW0gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCSAgICAgaW50ICpwX25fcG9zCS8qIE51bWJlciBvZiB0aGUgc2VhcmNoZWQgZm9yIGVsZW1lbnQuICovCisgICAgKQoreworCWludCBuX3Jib3VuZCwgbl9sYm91bmQsIG5fajsKIAotICAgZm9yICggbl9qID0gKChuX3Jib3VuZCA9IHBfbl9udW0gLSAxKSArIChuX2xib3VuZCA9IDApKS8yOyBuX2xib3VuZCA8PSBuX3Jib3VuZDsgbl9qID0gKG5fcmJvdW5kICsgbl9sYm91bmQpLzIgKQotICAgICBzd2l0Y2goIGNvbXBfa2V5cygoc3RydWN0IHJlaXNlcmZzX2tleSAqKSgoY2hhciAqIClwX3ZfYmFzZSArIG5faiAqIHBfbl93aWR0aCksIChzdHJ1Y3QgY3B1X2tleSAqKXBfdl9rZXkpICkgIHsKLSAgICAgY2FzZSAtMTogbl9sYm91bmQgPSBuX2ogKyAxOyBjb250aW51ZTsKLSAgICAgY2FzZSAgMTogbl9yYm91bmQgPSBuX2ogLSAxOyBjb250aW51ZTsKLSAgICAgY2FzZSAgMDogKnBfbl9wb3MgPSBuX2o7ICAgICByZXR1cm4gSVRFTV9GT1VORDsgLyogS2V5IGZvdW5kIGluIHRoZSBhcnJheS4gICovCi0gICAgICAgIH0KKwlmb3IgKG5faiA9ICgobl9yYm91bmQgPSBwX25fbnVtIC0gMSkgKyAobl9sYm91bmQgPSAwKSkgLyAyOworCSAgICAgbl9sYm91bmQgPD0gbl9yYm91bmQ7IG5faiA9IChuX3Jib3VuZCArIG5fbGJvdW5kKSAvIDIpCisJCXN3aXRjaCAoY29tcF9rZXlzCisJCQkoKHN0cnVjdCByZWlzZXJmc19rZXkgKikoKGNoYXIgKilwX3ZfYmFzZSArCisJCQkJCQkgbl9qICogcF9uX3dpZHRoKSwKKwkJCSAoc3RydWN0IGNwdV9rZXkgKilwX3Zfa2V5KSkgeworCQljYXNlIC0xOgorCQkJbl9sYm91bmQgPSBuX2ogKyAxOworCQkJY29udGludWU7CisJCWNhc2UgMToKKwkJCW5fcmJvdW5kID0gbl9qIC0gMTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDA6CisJCQkqcF9uX3BvcyA9IG5fajsKKwkJCXJldHVybiBJVEVNX0ZPVU5EOwkvKiBLZXkgZm91bmQgaW4gdGhlIGFycmF5LiAgKi8KKwkJfQogCi0gICAgLyogYmluX3NlYXJjaCBkaWQgbm90IGZpbmQgZ2l2ZW4ga2V5LCBpdCByZXR1cm5zIHBvc2l0aW9uIG9mIGtleSwKLSAgICAgICAgdGhhdCBpcyBtaW5pbWFsIGFuZCBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZS4gKi8KLSAgICAqcF9uX3BvcyA9IG5fbGJvdW5kOwotICAgIHJldHVybiBJVEVNX05PVF9GT1VORDsKKwkvKiBiaW5fc2VhcmNoIGRpZCBub3QgZmluZCBnaXZlbiBrZXksIGl0IHJldHVybnMgcG9zaXRpb24gb2Yga2V5LAorCSAgIHRoYXQgaXMgbWluaW1hbCBhbmQgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvbmUuICovCisJKnBfbl9wb3MgPSBuX2xib3VuZDsKKwlyZXR1cm4gSVRFTV9OT1RfRk9VTkQ7CiB9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLWV4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogY3VyX3RiOworZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKmN1cl90YjsKICNlbmRpZgogCi0KLQogLyogTWluaW1hbCBwb3NzaWJsZSBrZXkuIEl0IGlzIG5ldmVyIGluIHRoZSB0cmVlLiAqLwotY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAgTUlOX0tFWSA9IHswLCAwLCB7ezAsIDB9LH19OworY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSBNSU5fS0VZID0geyAwLCAwLCB7ezAsIDB9LH0gfTsKIAogLyogTWF4aW1hbCBwb3NzaWJsZSBrZXkuIEl0IGlzIG5ldmVyIGluIHRoZSB0cmVlLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgIE1BWF9LRVkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSBNQVhfS0VZID0gewogCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZiksCiAJX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSwKIAl7e19fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZiksCi0JX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKX0sfQorCSAgX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKX0sfQogfTsKIAotCiAvKiBHZXQgZGVsaW1pdGluZyBrZXkgb2YgdGhlIGJ1ZmZlciBieSBsb29raW5nIGZvciBpdCBpbiB0aGUgYnVmZmVycyBpbiB0aGUgcGF0aCwgc3RhcnRpbmcgZnJvbSB0aGUgYm90dG9tCiAgICBvZiB0aGUgcGF0aCwgYW5kIGdvaW5nIHVwd2FyZHMuICBXZSBtdXN0IGNoZWNrIHRoZSBwYXRoJ3MgdmFsaWRpdHkgYXQgZWFjaCBzdGVwLiAgSWYgdGhlIGtleSBpcyBub3QgaW4KICAgIHRoZSBwYXRoLCB0aGVyZSBpcyBubyBkZWxpbWl0aW5nIGtleSBpbiB0aGUgdHJlZSAoYnVmZmVyIGlzIGZpcnN0IG9yIGxhc3QgYnVmZmVyIGluIHRyZWUpLCBhbmQgaW4gdGhpcwogICAgY2FzZSB3ZSByZXR1cm4gYSBzcGVjaWFsIGtleSwgZWl0aGVyIE1JTl9LRVkgb3IgTUFYX0tFWS4gKi8KLXN0YXRpYyBpbmxpbmUJY29uc3Qgc3RydWN0ICByZWlzZXJmc19rZXkgKiBnZXRfbGtleSAgKAotCSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX2Noa19wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYgotICAgICAgICAgICAgICAgICAgICAgICkgewotICBpbnQgICAgICAgICAgICAgICAgICAgbl9wb3NpdGlvbiwgbl9wYXRoX29mZnNldCA9IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGg7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfcGFyZW50OwotICAKLSAgUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwgCi0JICAiUEFQLTUwMTA6IGludmFsaWQgb2Zmc2V0IGluIHRoZSBwYXRoIik7CitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9sa2V5KGNvbnN0IHN0cnVjdCBwYXRoCisJCQkJCQkgICpwX3NfY2hrX3BhdGgsCisJCQkJCQkgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jaworCQkJCQkJICAqcF9zX3NiKQoreworCWludCBuX3Bvc2l0aW9uLCBuX3BhdGhfb2Zmc2V0ID0gcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19wYXJlbnQ7CiAKLSAgLyogV2hpbGUgbm90IGhpZ2hlciBpbiBwYXRoIHRoYW4gZmlyc3QgZWxlbWVudC4gKi8KLSAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0LS0gPiBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgeworCVJGQUxTRShuX3BhdGhfb2Zmc2V0IDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICAgICAgIlBBUC01MDEwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOwogCi0gICAgUkZBTFNFKCAhIGJ1ZmZlcl91cHRvZGF0ZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpLAotCSAgICAiUEFQLTUwMjA6IHBhcmVudCBpcyBub3QgdXB0b2RhdGUiKTsKKwkvKiBXaGlsZSBub3QgaGlnaGVyIGluIHBhdGggdGhhbiBmaXJzdCBlbGVtZW50LiAqLworCXdoaWxlIChuX3BhdGhfb2Zmc2V0LS0gPiBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CiAKLSAgICAvKiBQYXJlbnQgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlIG5vdy4gKi8KLSAgICBpZiAoICEgQl9JU19JTl9UUkVFKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpICkKLSAgICAgIHJldHVybiAmTUFYX0tFWTsKLSAgICAvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KLSAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSkgPiBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKLSAgICAgICByZXR1cm4gJk1BWF9LRVk7Ci0gICAgLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCi0gICAgaWYgKCBCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9Ci0JIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0ICsgMSktPmJfYmxvY2tuciApCi0gICAgICByZXR1cm4gJk1BWF9LRVk7Ci0gICAgLyogUmV0dXJuIGRlbGltaXRpbmcga2V5IGlmIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgbm90IGVxdWFsIHRvIHplcm8uICovCi0gICAgaWYgKCBuX3Bvc2l0aW9uICkKLSAgICAgIHJldHVybiBCX05fUERFTElNX0tFWShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uIC0gMSk7Ci0gIH0KLSAgLyogUmV0dXJuIE1JTl9LRVkgaWYgd2UgYXJlIGluIHRoZSByb290IG9mIHRoZSBidWZmZXIgdHJlZS4gKi8KLSAgaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQotICAgICAgIFNCX1JPT1RfQkxPQ0sgKHBfc19zYikgKQotICAgIHJldHVybiAmTUlOX0tFWTsKLSAgcmV0dXJuICAmTUFYX0tFWTsKKwkJUkZBTFNFKCFidWZmZXJfdXB0b2RhdGUKKwkJICAgICAgIChQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpLAorCQkgICAgICAgIlBBUC01MDIwOiBwYXJlbnQgaXMgbm90IHVwdG9kYXRlIik7CisKKwkJLyogUGFyZW50IGF0IHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZSBub3cuICovCisJCWlmICghQl9JU19JTl9UUkVFCisJCSAgICAocF9zX3BhcmVudCA9CisJCSAgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSkKKwkJCXJldHVybiAmTUFYX0tFWTsKKwkJLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCisJCWlmICgobl9wb3NpdGlvbiA9CisJCSAgICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX2Noa19wYXRoLAorCQkJCQkgIG5fcGF0aF9vZmZzZXQpKSA+CisJCSAgICBCX05SX0lURU1TKHBfc19wYXJlbnQpKQorCQkJcmV0dXJuICZNQVhfS0VZOworCQkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCByZWFsbHkgcG9pbnRzIHRvIHRoZSBjaGlsZC4gKi8KKwkJaWYgKEJfTl9DSElMRF9OVU0ocF9zX3BhcmVudCwgbl9wb3NpdGlvbikgIT0KKwkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLAorCQkJCQluX3BhdGhfb2Zmc2V0ICsgMSktPmJfYmxvY2tucikKKwkJCXJldHVybiAmTUFYX0tFWTsKKwkJLyogUmV0dXJuIGRlbGltaXRpbmcga2V5IGlmIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgbm90IGVxdWFsIHRvIHplcm8uICovCisJCWlmIChuX3Bvc2l0aW9uKQorCQkJcmV0dXJuIEJfTl9QREVMSU1fS0VZKHBfc19wYXJlbnQsIG5fcG9zaXRpb24gLSAxKTsKKwl9CisJLyogUmV0dXJuIE1JTl9LRVkgaWYgd2UgYXJlIGluIHRoZSByb290IG9mIHRoZSBidWZmZXIgdHJlZS4gKi8KKwlpZiAoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpLT4KKwkgICAgYl9ibG9ja25yID09IFNCX1JPT1RfQkxPQ0socF9zX3NiKSkKKwkJcmV0dXJuICZNSU5fS0VZOworCXJldHVybiAmTUFYX0tFWTsKIH0KIAotCiAvKiBHZXQgZGVsaW1pdGluZyBrZXkgb2YgdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aCBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yLiAqLwotaW5saW5lCWNvbnN0IHN0cnVjdCAgcmVpc2VyZnNfa2V5ICogZ2V0X3JrZXkgICgKLQkgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19jaGtfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IKLSAgICAgICAgICAgICAgICAgICAgICApIHsKLSAgaW50ICAgICAgICAgICAgICAgICAgIG5fcG9zaXRpb24sCi0gICAgCQkJbl9wYXRoX29mZnNldCA9IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGg7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfcGFyZW50OworaW5saW5lIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9ya2V5KGNvbnN0IHN0cnVjdCBwYXRoICpwX3NfY2hrX3BhdGgsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCWludCBuX3Bvc2l0aW9uLCBuX3BhdGhfb2Zmc2V0ID0gcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19wYXJlbnQ7CiAKLSAgUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICJQQVAtNTAzMDogaW52YWxpZCBvZmZzZXQgaW4gdGhlIHBhdGgiKTsKKwlSRkFMU0Uobl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAgICAgICJQQVAtNTAzMDogaW52YWxpZCBvZmZzZXQgaW4gdGhlIHBhdGgiKTsKIAotICB3aGlsZSAoIG5fcGF0aF9vZmZzZXQtLSA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7CisJd2hpbGUgKG5fcGF0aF9vZmZzZXQtLSA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKIAotICAgIFJGQUxTRSggISBidWZmZXJfdXB0b2RhdGUoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSwKLQkgICAgIlBBUC01MDQwOiBwYXJlbnQgaXMgbm90IHVwdG9kYXRlIik7CisJCVJGQUxTRSghYnVmZmVyX3VwdG9kYXRlCisJCSAgICAgICAoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSwKKwkJICAgICAgICJQQVAtNTA0MDogcGFyZW50IGlzIG5vdCB1cHRvZGF0ZSIpOwogCi0gICAgLyogUGFyZW50IGF0IHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZSBub3cuICovCi0gICAgaWYgKCAhIEJfSVNfSU5fVFJFRShwX3NfcGFyZW50ID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSApCi0gICAgICByZXR1cm4gJk1JTl9LRVk7Ci0gICAgLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCi0gICAgaWYgKCAobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpID4gQl9OUl9JVEVNUyhwX3NfcGFyZW50KSApCi0gICAgICByZXR1cm4gJk1JTl9LRVk7Ci0gICAgLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCi0gICAgaWYgKCBCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQgKyAxKS0+Yl9ibG9ja25yICkKLSAgICAgIHJldHVybiAmTUlOX0tFWTsKLSAgICAvKiBSZXR1cm4gZGVsaW1pdGluZyBrZXkgaWYgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBub3QgdGhlIGxhc3Qgb25lLiAqLwotICAgIGlmICggbl9wb3NpdGlvbiAhPSBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKLSAgICAgIHJldHVybiBCX05fUERFTElNX0tFWShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uKTsKLSAgfQotICAvKiBSZXR1cm4gTUFYX0tFWSBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIGJ1ZmZlciB0cmVlLiAqLwotICBpZiAoIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+Yl9ibG9ja25yID09Ci0gICAgICAgU0JfUk9PVF9CTE9DSyAocF9zX3NiKSApCi0gICAgcmV0dXJuICZNQVhfS0VZOwotICByZXR1cm4gICZNSU5fS0VZOworCQkvKiBQYXJlbnQgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlIG5vdy4gKi8KKwkJaWYgKCFCX0lTX0lOX1RSRUUKKwkJICAgIChwX3NfcGFyZW50ID0KKwkJICAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpKQorCQkJcmV0dXJuICZNSU5fS0VZOworCQkvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KKwkJaWYgKChuX3Bvc2l0aW9uID0KKwkJICAgICBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfY2hrX3BhdGgsCisJCQkJCSAgbl9wYXRoX29mZnNldCkpID4KKwkJICAgIEJfTlJfSVRFTVMocF9zX3BhcmVudCkpCisJCQlyZXR1cm4gJk1JTl9LRVk7CisJCS8qIENoZWNrIHdoZXRoZXIgcGFyZW50IGF0IHRoZSBwYXRoIHJlYWxseSBwb2ludHMgdG8gdGhlIGNoaWxkLiAqLworCQlpZiAoQl9OX0NISUxEX05VTShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uKSAhPQorCQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsCisJCQkJCW5fcGF0aF9vZmZzZXQgKyAxKS0+Yl9ibG9ja25yKQorCQkJcmV0dXJuICZNSU5fS0VZOworCQkvKiBSZXR1cm4gZGVsaW1pdGluZyBrZXkgaWYgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBub3QgdGhlIGxhc3Qgb25lLiAqLworCQlpZiAobl9wb3NpdGlvbiAhPSBCX05SX0lURU1TKHBfc19wYXJlbnQpKQorCQkJcmV0dXJuIEJfTl9QREVMSU1fS0VZKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pOworCX0KKwkvKiBSZXR1cm4gTUFYX0tFWSBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIGJ1ZmZlciB0cmVlLiAqLworCWlmIChQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPgorCSAgICBiX2Jsb2NrbnIgPT0gU0JfUk9PVF9CTE9DSyhwX3Nfc2IpKQorCQlyZXR1cm4gJk1BWF9LRVk7CisJcmV0dXJuICZNSU5fS0VZOwogfQogCi0KIC8qIENoZWNrIHdoZXRoZXIgYSBrZXkgaXMgY29udGFpbmVkIGluIHRoZSB0cmVlIHJvb3RlZCBmcm9tIGEgYnVmZmVyIGF0IGEgcGF0aC4gKi8KIC8qIFRoaXMgd29ya3MgYnkgbG9va2luZyBhdCB0aGUgbGVmdCBhbmQgcmlnaHQgZGVsaW1pdGluZyBrZXlzIGZvciB0aGUgYnVmZmVyIGluIHRoZSBsYXN0IHBhdGhfZWxlbWVudCBpbgogICAgdGhlIHBhdGguICBUaGVzZSBkZWxpbWl0aW5nIGtleXMgYXJlIHN0b3JlZCBhdCBsZWFzdCBvbmUgbGV2ZWwgYWJvdmUgdGhhdCBidWZmZXIgaW4gdGhlIHRyZWUuIElmIHRoZQogICAgYnVmZmVyIGlzIHRoZSBmaXJzdCBvciBsYXN0IG5vZGUgaW4gdGhlIHRyZWUgb3JkZXIgdGhlbiBvbmUgb2YgdGhlIGRlbGltaXRpbmcga2V5cyBtYXkgYmUgYWJzZW50LCBhbmQgaW4KICAgIHRoaXMgY2FzZSBnZXRfbGtleSBhbmQgZ2V0X3JrZXkgcmV0dXJuIGEgc3BlY2lhbCBrZXkgd2hpY2ggaXMgTUlOX0tFWSBvciBNQVhfS0VZLiAqLwotc3RhdGljICBpbmxpbmUgIGludCBrZXlfaW5fYnVmZmVyICgKLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX2Noa19wYXRoLCAvKiBQYXRoIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkLiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2tleSwgICAgICAvKiBLZXkgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiICAgICAgICAvKiBTdXBlciBibG9jayBwb2ludGVyLiAgICAgICAgICAgKi8KLQkJICAgICAgKSB7CitzdGF0aWMgaW5saW5lIGludCBrZXlfaW5fYnVmZmVyKHN0cnVjdCBwYXRoICpwX3NfY2hrX3BhdGgsCS8qIFBhdGggd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAqLworCQkJCWNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5LAkvKiBLZXkgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAgKi8KKwkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYgkvKiBTdXBlciBibG9jayBwb2ludGVyLiAgICAgICAgICAgKi8KKyAgICApCit7CiAKLSAgUkZBTFNFKCAhIHBfc19rZXkgfHwgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgfHwKLQkgIHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGggPiBNQVhfSEVJR0hULAotCSAgIlBBUC01MDUwOiBwb2ludGVyIHRvIHRoZSBrZXkoJXApIGlzIE5VTEwgb3IgaW52YWxpZCBwYXRoIGxlbmd0aCglZCkiLAotCSAgcF9zX2tleSwgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCk7Ci0gIFJGQUxTRSggIVBBVEhfUExBU1RfQlVGRkVSKHBfc19jaGtfcGF0aCktPmJfYmRldiwKLQkgICJQQVAtNTA2MDogZGV2aWNlIG11c3Qgbm90IGJlIE5PREVWIik7CisJUkZBTFNFKCFwX3Nfa2V5IHx8IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGggPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUCisJICAgICAgIHx8IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGggPiBNQVhfSEVJR0hULAorCSAgICAgICAiUEFQLTUwNTA6IHBvaW50ZXIgdG8gdGhlIGtleSglcCkgaXMgTlVMTCBvciBpbnZhbGlkIHBhdGggbGVuZ3RoKCVkKSIsCisJICAgICAgIHBfc19rZXksIHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGgpOworCVJGQUxTRSghUEFUSF9QTEFTVF9CVUZGRVIocF9zX2Noa19wYXRoKS0+Yl9iZGV2LAorCSAgICAgICAiUEFQLTUwNjA6IGRldmljZSBtdXN0IG5vdCBiZSBOT0RFViIpOwogCi0gIGlmICggY29tcF9rZXlzKGdldF9sa2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSwgcF9zX2tleSkgPT0gMSApCi0gICAgLyogbGVmdCBkZWxpbWl0aW5nIGtleSBpcyBiaWdnZXIsIHRoYXQgdGhlIGtleSB3ZSBsb29rIGZvciAqLwotICAgIHJldHVybiAwOwotICAvLyAgaWYgKCBjb21wX2tleXMocF9zX2tleSwgZ2V0X3JrZXkocF9zX2Noa19wYXRoLCBwX3Nfc2IpKSAhPSAtMSApCi0gIGlmICggY29tcF9rZXlzKGdldF9ya2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSwgcF9zX2tleSkgIT0gMSApCi0gICAgLyogcF9zX2tleSBtdXN0IGJlIGxlc3MgdGhhbiByaWdodCBkZWxpbWl0aWluZyBrZXkgKi8KLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7CisJaWYgKGNvbXBfa2V5cyhnZXRfbGtleShwX3NfY2hrX3BhdGgsIHBfc19zYiksIHBfc19rZXkpID09IDEpCisJCS8qIGxlZnQgZGVsaW1pdGluZyBrZXkgaXMgYmlnZ2VyLCB0aGF0IHRoZSBrZXkgd2UgbG9vayBmb3IgKi8KKwkJcmV0dXJuIDA7CisJLy8gIGlmICggY29tcF9rZXlzKHBfc19rZXksIGdldF9ya2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSkgIT0gLTEgKQorCWlmIChjb21wX2tleXMoZ2V0X3JrZXkocF9zX2Noa19wYXRoLCBwX3Nfc2IpLCBwX3Nfa2V5KSAhPSAxKQorCQkvKiBwX3Nfa2V5IG11c3QgYmUgbGVzcyB0aGFuIHJpZ2h0IGRlbGltaXRpaW5nIGtleSAqLworCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAotCi1pbmxpbmUgdm9pZCBkZWNyZW1lbnRfYmNvdW50KAotICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2JoCi0gICAgICAgICAgICApIHsgCi0gIGlmICggcF9zX2JoICkgewotICAgIGlmICggYXRvbWljX3JlYWQgKCYocF9zX2JoLT5iX2NvdW50KSkgKSB7Ci0gICAgICBwdXRfYmgocF9zX2JoKSA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlaXNlcmZzX3BhbmljKE5VTEwsICJQQVAtNTA3MDogZGVjcmVtZW50X2Jjb3VudDogdHJ5aW5nIHRvIGZyZWUgZnJlZSBidWZmZXIgJWIiLCBwX3NfYmgpOwotICB9CitpbmxpbmUgdm9pZCBkZWNyZW1lbnRfYmNvdW50KHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoKQoreworCWlmIChwX3NfYmgpIHsKKwkJaWYgKGF0b21pY19yZWFkKCYocF9zX2JoLT5iX2NvdW50KSkpIHsKKwkJCXB1dF9iaChwX3NfYmgpOworCQkJcmV0dXJuOworCQl9CisJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkgICAgICAgIlBBUC01MDcwOiBkZWNyZW1lbnRfYmNvdW50OiB0cnlpbmcgdG8gZnJlZSBmcmVlIGJ1ZmZlciAlYiIsCisJCQkgICAgICAgcF9zX2JoKTsKKwl9CiB9CiAKLQogLyogRGVjcmVtZW50IGJfY291bnQgZmllbGQgb2YgdGhlIGFsbCBidWZmZXJzIGluIHRoZSBwYXRoLiAqLwotdm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCAoCi0gICAgICAgICAgICAgIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoCi0gICAgICAgICAgICApIHsKLSAgaW50IG5fcGF0aF9vZmZzZXQgPSBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoOwordm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKQoreworCWludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKIAotICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgfHwKLQkgIG5fcGF0aF9vZmZzZXQgPiBFWFRFTkRFRF9NQVhfSEVJR0hUIC0gMSwKLQkgICJQQVAtNTA4MDogaW52YWxpZCBwYXRoIG9mZnNldCBvZiAlZCIsIG5fcGF0aF9vZmZzZXQpOworCVJGQUxTRShuX3BhdGhfb2Zmc2V0IDwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUIHx8CisJICAgICAgIG5fcGF0aF9vZmZzZXQgPiBFWFRFTkRFRF9NQVhfSEVJR0hUIC0gMSwKKwkgICAgICAgIlBBUC01MDgwOiBpbnZhbGlkIHBhdGggb2Zmc2V0IG9mICVkIiwgbl9wYXRoX29mZnNldCk7CiAKLSAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXdoaWxlIChuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLSAgICBiaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCBuX3BhdGhfb2Zmc2V0LS0pOwotICAgIGRlY3JlbWVudF9iY291bnQgKGJoKTsKLSAgfQotICBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoID0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOworCQliaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCBuX3BhdGhfb2Zmc2V0LS0pOworCQlkZWNyZW1lbnRfYmNvdW50KGJoKTsKKwl9CisJcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsKIH0KIAotCi1pbnQgcmVpc2VyZnNfY2hlY2tfcGF0aChzdHJ1Y3QgcGF0aCAqcCkgewotICBSRkFMU0UoIHAtPnBhdGhfbGVuZ3RoICE9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICJwYXRoIG5vdCBwcm9wZXJseSByZWxzZWQiKSA7Ci0gIHJldHVybiAwIDsKK2ludCByZWlzZXJmc19jaGVja19wYXRoKHN0cnVjdCBwYXRoICpwKQoreworCVJGQUxTRShwLT5wYXRoX2xlbmd0aCAhPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAgICAgICJwYXRoIG5vdCBwcm9wZXJseSByZWxzZWQiKTsKKwlyZXR1cm4gMDsKIH0KIAotCiAvKiBSZWxlYXNlIGFsbCBidWZmZXJzIGluIHRoZSBwYXRoLiBSZXN0b3JlIGRpcnR5IGJpdHMgY2xlYW4KICoqIHdoZW4gcHJlcGFyaW5nIHRoZSBidWZmZXIgZm9yIHRoZSBsb2cKICoqCiAqKiBvbmx5IGNhbGxlZCBmcm9tIGZpeF9ub2RlcygpCiAqLwotdm9pZCAgcGF0aHJlbHNlX2FuZF9yZXN0b3JlICgKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIAotICAgICAgICBzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aAotICAgICAgKSB7Ci0gIGludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKK3ZvaWQgcGF0aHJlbHNlX2FuZF9yZXN0b3JlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCkKK3sKKwlpbnQgbl9wYXRoX29mZnNldCA9IHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGg7CiAKLSAgUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VULCAKLQkgICJjbG0tNDAwMDogaW52YWxpZCBwYXRoIG9mZnNldCIpOwotICAKLSAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgIHsKLSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9wYXRoX29mZnNldCkpOwotICAgIGJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7Ci0gIH0KLSAgcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsKKwlSRkFMU0Uobl9wYXRoX29mZnNldCA8IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICAgICAgImNsbS00MDAwOiBpbnZhbGlkIHBhdGggb2Zmc2V0Iik7CisKKwl3aGlsZSAobl9wYXRoX29mZnNldCA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgeworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLAorCQkJCQkJIFBBVEhfT0ZGU0VUX1BCVUZGRVIKKwkJCQkJCSAocF9zX3NlYXJjaF9wYXRoLAorCQkJCQkJICBuX3BhdGhfb2Zmc2V0KSk7CisJCWJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7CisJfQorCXBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7CiB9CiAKIC8qIFJlbGVhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIHBhdGguICovCi12b2lkICBwYXRocmVsc2UgKAotICAgICAgICBzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aAotICAgICAgKSB7Ci0gIGludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKLQotICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQsCi0JICAiUEFQLTUwOTA6IGludmFsaWQgcGF0aCBvZmZzZXQiKTsKLSAgCi0gIHdoaWxlICggbl9wYXRoX29mZnNldCA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCApICAKLSAgICBicmVsc2UoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3Nfc2VhcmNoX3BhdGgsIG5fcGF0aF9vZmZzZXQtLSkpOwotCi0gIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGlzX2xlYWYgKGNoYXIgKiBidWYsIGludCBibG9ja3NpemUsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQordm9pZCBwYXRocmVsc2Uoc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCkKIHsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCB1c2VkX3NwYWNlOwotICAgIGludCBwcmV2X2xvY2F0aW9uOwotICAgIGludCBpOwotICAgIGludCBucjsKKwlpbnQgbl9wYXRoX29mZnNldCA9IHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGg7CiAKLSAgICBibGtoID0gKHN0cnVjdCBibG9ja19oZWFkICopYnVmOwotICAgIGlmICggYmxraF9sZXZlbChibGtoKSAhPSBESVNLX0xFQUZfTk9ERV9MRVZFTCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiB0aGlzIHNob3VsZCBiZSBjYXVnaHQgZWFybGllciIpOwotCXJldHVybiAwOwotICAgIH0KKwlSRkFMU0Uobl9wYXRoX29mZnNldCA8IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICAgICAgIlBBUC01MDkwOiBpbnZhbGlkIHBhdGggb2Zmc2V0Iik7CiAKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBpZiAobnIgPCAxIHx8IG5yID4gKChibG9ja3NpemUgLSBCTEtIX1NJWkUpIC8gKElIX1NJWkUgKyBNSU5fSVRFTV9MRU4pKSkgewotCS8qIGl0ZW0gbnVtYmVyIGlzIHRvbyBiaWcgb3IgdG9vIHNtYWxsICovCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IG5yX2l0ZW0gc2VlbXMgd3Jvbmc6ICV6IiwgYmgpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpaCA9IChzdHJ1Y3QgaXRlbV9oZWFkICopKGJ1ZiArIEJMS0hfU0laRSkgKyBuciAtIDE7Ci0gICAgdXNlZF9zcGFjZSA9IEJMS0hfU0laRSArIElIX1NJWkUgKiBuciArIChibG9ja3NpemUgLSBpaF9sb2NhdGlvbiAoaWgpKTsKLSAgICBpZiAodXNlZF9zcGFjZSAhPSBibG9ja3NpemUgLSBibGtoX2ZyZWVfc3BhY2UoYmxraCkpIHsKLQkvKiBmcmVlIHNwYWNlIGRvZXMgbm90IG1hdGNoIHRvIGNhbGN1bGF0ZWQgYW1vdW50IG9mIHVzZSBzcGFjZSAqLwotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBmcmVlIHNwYWNlIHNlZW1zIHdyb25nOiAleiIsIGJoKTsKLQlyZXR1cm4gMDsKLSAgICB9CisJd2hpbGUgKG5fcGF0aF9vZmZzZXQgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpCisJCWJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7CiAKLSAgICAvLyBGSVhNRTogaXQgaXNfbGVhZiB3aWxsIGhpdCBwZXJmb3JtYW5jZSB0b28gbXVjaCAtIHdlIG1heSBoYXZlCi0gICAgLy8gcmV0dXJuIDEgaGVyZQotCi0gICAgLyogY2hlY2sgdGFibGVzIG9mIGl0ZW0gaGVhZHMgKi8KLSAgICBpaCA9IChzdHJ1Y3QgaXRlbV9oZWFkICopKGJ1ZiArIEJMS0hfU0laRSk7Ci0gICAgcHJldl9sb2NhdGlvbiA9IGJsb2Nrc2l6ZTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkgKyssIGloICsrKSB7Ci0JaWYgKCBsZV9paF9rX3R5cGUoaWgpID09IFRZUEVfQU5ZKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiB3cm9uZyBpdGVtIHR5cGUgZm9yIGl0ZW0gJWgiLGloKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmIChpaF9sb2NhdGlvbiAoaWgpID49IGJsb2Nrc2l6ZSB8fCBpaF9sb2NhdGlvbiAoaWgpIDwgSUhfU0laRSAqIG5yKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBpdGVtIGxvY2F0aW9uIHNlZW1zIHdyb25nOiAlaCIsIGloKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmIChpaF9pdGVtX2xlbiAoaWgpIDwgMSB8fCBpaF9pdGVtX2xlbiAoaWgpID4gTUFYX0lURU1fTEVOIChibG9ja3NpemUpKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBpdGVtIGxlbmd0aCBzZWVtcyB3cm9uZzogJWgiLCBpaCk7Ci0JICAgIHJldHVybiAwOwotCX0KLQlpZiAocHJldl9sb2NhdGlvbiAtIGloX2xvY2F0aW9uIChpaCkgIT0gaWhfaXRlbV9sZW4gKGloKSkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfbGVhZjogaXRlbSBsb2NhdGlvbiBzZWVtcyB3cm9uZyAoc2Vjb25kIG9uZSk6ICVoIiwgaWgpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JcHJldl9sb2NhdGlvbiA9IGloX2xvY2F0aW9uIChpaCk7Ci0gICAgfQotCi0gICAgLy8gb25lIG1heSBpbWFnaW5lIG11Y2ggbW9yZSBjaGVja3MKLSAgICByZXR1cm4gMTsKKwlwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoID0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOwogfQogCitzdGF0aWMgaW50IGlzX2xlYWYoY2hhciAqYnVmLCBpbnQgYmxvY2tzaXplLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCB1c2VkX3NwYWNlOworCWludCBwcmV2X2xvY2F0aW9uOworCWludCBpOworCWludCBucjsKKworCWJsa2ggPSAoc3RydWN0IGJsb2NrX2hlYWQgKilidWY7CisJaWYgKGJsa2hfbGV2ZWwoYmxraCkgIT0gRElTS19MRUFGX05PREVfTEVWRUwpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiaXNfbGVhZjogdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGVhcmxpZXIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJaWYgKG5yIDwgMSB8fCBuciA+ICgoYmxvY2tzaXplIC0gQkxLSF9TSVpFKSAvIChJSF9TSVpFICsgTUlOX0lURU1fTEVOKSkpIHsKKwkJLyogaXRlbSBudW1iZXIgaXMgdG9vIGJpZyBvciB0b28gc21hbGwgKi8KKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiaXNfbGVhZjogbnJfaXRlbSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7CisJCXJldHVybiAwOworCX0KKwlpaCA9IChzdHJ1Y3QgaXRlbV9oZWFkICopKGJ1ZiArIEJMS0hfU0laRSkgKyBuciAtIDE7CisJdXNlZF9zcGFjZSA9IEJMS0hfU0laRSArIElIX1NJWkUgKiBuciArIChibG9ja3NpemUgLSBpaF9sb2NhdGlvbihpaCkpOworCWlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgeworCQkvKiBmcmVlIHNwYWNlIGRvZXMgbm90IG1hdGNoIHRvIGNhbGN1bGF0ZWQgYW1vdW50IG9mIHVzZSBzcGFjZSAqLworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJpc19sZWFmOiBmcmVlIHNwYWNlIHNlZW1zIHdyb25nOiAleiIsCisJCQkJIGJoKTsKKwkJcmV0dXJuIDA7CisJfQorCS8vIEZJWE1FOiBpdCBpc19sZWFmIHdpbGwgaGl0IHBlcmZvcm1hbmNlIHRvbyBtdWNoIC0gd2UgbWF5IGhhdmUKKwkvLyByZXR1cm4gMSBoZXJlCisKKwkvKiBjaGVjayB0YWJsZXMgb2YgaXRlbSBoZWFkcyAqLworCWloID0gKHN0cnVjdCBpdGVtX2hlYWQgKikoYnVmICsgQkxLSF9TSVpFKTsKKwlwcmV2X2xvY2F0aW9uID0gYmxvY2tzaXplOworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrLCBpaCsrKSB7CisJCWlmIChsZV9paF9rX3R5cGUoaWgpID09IFRZUEVfQU5ZKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCSAiaXNfbGVhZjogd3JvbmcgaXRlbSB0eXBlIGZvciBpdGVtICVoIiwKKwkJCQkJIGloKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChpaF9sb2NhdGlvbihpaCkgPj0gYmxvY2tzaXplCisJCSAgICB8fCBpaF9sb2NhdGlvbihpaCkgPCBJSF9TSVpFICogbnIpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkJICJpc19sZWFmOiBpdGVtIGxvY2F0aW9uIHNlZW1zIHdyb25nOiAlaCIsCisJCQkJCSBpaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoaWhfaXRlbV9sZW4oaWgpIDwgMQorCQkgICAgfHwgaWhfaXRlbV9sZW4oaWgpID4gTUFYX0lURU1fTEVOKGJsb2Nrc2l6ZSkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkJICJpc19sZWFmOiBpdGVtIGxlbmd0aCBzZWVtcyB3cm9uZzogJWgiLAorCQkJCQkgaWgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHByZXZfbG9jYXRpb24gLSBpaF9sb2NhdGlvbihpaCkgIT0gaWhfaXRlbV9sZW4oaWgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCSAiaXNfbGVhZjogaXRlbSBsb2NhdGlvbiBzZWVtcyB3cm9uZyAoc2Vjb25kIG9uZSk6ICVoIiwKKwkJCQkJIGloKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByZXZfbG9jYXRpb24gPSBpaF9sb2NhdGlvbihpaCk7CisJfQorCisJLy8gb25lIG1heSBpbWFnaW5lIG11Y2ggbW9yZSBjaGVja3MKKwlyZXR1cm4gMTsKK30KIAogLyogcmV0dXJucyAxIGlmIGJ1ZiBsb29rcyBsaWtlIGFuIGludGVybmFsIG5vZGUsIDAgb3RoZXJ3aXNlICovCi1zdGF0aWMgaW50IGlzX2ludGVybmFsIChjaGFyICogYnVmLCBpbnQgYmxvY2tzaXplLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyBpbnQgaXNfaW50ZXJuYWwoY2hhciAqYnVmLCBpbnQgYmxvY2tzaXplLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKLSAgICBpbnQgbnI7Ci0gICAgaW50IHVzZWRfc3BhY2U7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJaW50IG5yOworCWludCB1c2VkX3NwYWNlOwogCi0gICAgYmxraCA9IChzdHJ1Y3QgYmxvY2tfaGVhZCAqKWJ1ZjsKLSAgICBuciA9IGJsa2hfbGV2ZWwoYmxraCk7Ci0gICAgaWYgKG5yIDw9IERJU0tfTEVBRl9OT0RFX0xFVkVMIHx8IG5yID4gTUFYX0hFSUdIVCkgewotCS8qIHRoaXMgbGV2ZWwgaXMgbm90IHBvc3NpYmxlIGZvciBpbnRlcm5hbCBub2RlcyAqLwotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19pbnRlcm5hbDogdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGVhcmxpZXIiKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7Ci0gICAgaWYgKG5yID4gKGJsb2Nrc2l6ZSAtIEJMS0hfU0laRSAtIERDX1NJWkUpIC8gKEtFWV9TSVpFICsgRENfU0laRSkpIHsKLQkvKiBmb3IgaW50ZXJuYWwgd2hpY2ggaXMgbm90IHJvb3Qgd2UgbWlnaHQgY2hlY2sgbWluIG51bWJlciBvZiBrZXlzICovCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2ludGVybmFsOiBudW1iZXIgb2Yga2V5IHNlZW1zIHdyb25nOiAleiIsIGJoKTsKLQlyZXR1cm4gMDsKLSAgICB9CisJYmxraCA9IChzdHJ1Y3QgYmxvY2tfaGVhZCAqKWJ1ZjsKKwluciA9IGJsa2hfbGV2ZWwoYmxraCk7CisJaWYgKG5yIDw9IERJU0tfTEVBRl9OT0RFX0xFVkVMIHx8IG5yID4gTUFYX0hFSUdIVCkgeworCQkvKiB0aGlzIGxldmVsIGlzIG5vdCBwb3NzaWJsZSBmb3IgaW50ZXJuYWwgbm9kZXMgKi8KKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiaXNfaW50ZXJuYWw6IHRoaXMgc2hvdWxkIGJlIGNhdWdodCBlYXJsaWVyIik7CisJCXJldHVybiAwOworCX0KIAotICAgIHVzZWRfc3BhY2UgPSBCTEtIX1NJWkUgKyBLRVlfU0laRSAqIG5yICsgRENfU0laRSAqIChuciArIDEpOwotICAgIGlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19pbnRlcm5hbDogZnJlZSBzcGFjZSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQorCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWlmIChuciA+IChibG9ja3NpemUgLSBCTEtIX1NJWkUgLSBEQ19TSVpFKSAvIChLRVlfU0laRSArIERDX1NJWkUpKSB7CisJCS8qIGZvciBpbnRlcm5hbCB3aGljaCBpcyBub3Qgcm9vdCB3ZSBtaWdodCBjaGVjayBtaW4gbnVtYmVyIG9mIGtleXMgKi8KKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiaXNfaW50ZXJuYWw6IG51bWJlciBvZiBrZXkgc2VlbXMgd3Jvbmc6ICV6IiwKKwkJCQkgYmgpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAvLyBvbmUgbWF5IGltYWdpbmUgbXVjaCBtb3JlIGNoZWNrcwotICAgIHJldHVybiAxOworCXVzZWRfc3BhY2UgPSBCTEtIX1NJWkUgKyBLRVlfU0laRSAqIG5yICsgRENfU0laRSAqIChuciArIDEpOworCWlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgeworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJICJpc19pbnRlcm5hbDogZnJlZSBzcGFjZSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7CisJCXJldHVybiAwOworCX0KKwkvLyBvbmUgbWF5IGltYWdpbmUgbXVjaCBtb3JlIGNoZWNrcworCXJldHVybiAxOwogfQogCi0KIC8vIG1ha2Ugc3VyZSB0aGF0IGJoIGNvbnRhaW5zIGZvcm1hdHRlZCBub2RlIG9mIHJlaXNlcmZzIHRyZWUgb2YKIC8vICdsZXZlbCctdGggbGV2ZWwKLXN0YXRpYyBpbnQgaXNfdHJlZV9ub2RlIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGxldmVsKQorc3RhdGljIGludCBpc190cmVlX25vZGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGxldmVsKQogewotICAgIGlmIChCX0xFVkVMIChiaCkgIT0gbGV2ZWwpIHsKLQlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfdHJlZV9ub2RlOiBub2RlIGxldmVsICVkIGRvZXMgbm90IG1hdGNoIHRvIHRoZSBleHBlY3RlZCBvbmUgJWQiLAotCQlCX0xFVkVMIChiaCksIGxldmVsKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGxldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMKQotCXJldHVybiBpc19sZWFmIChiaC0+Yl9kYXRhLCBiaC0+Yl9zaXplLCBiaCk7CisJaWYgKEJfTEVWRUwoYmgpICE9IGxldmVsKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkgImlzX3RyZWVfbm9kZTogbm9kZSBsZXZlbCAlZCBkb2VzIG5vdCBtYXRjaCB0byB0aGUgZXhwZWN0ZWQgb25lICVkIiwKKwkJCQkgQl9MRVZFTChiaCksIGxldmVsKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChsZXZlbCA9PSBESVNLX0xFQUZfTk9ERV9MRVZFTCkKKwkJcmV0dXJuIGlzX2xlYWYoYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSwgYmgpOwogCi0gICAgcmV0dXJuIGlzX2ludGVybmFsIChiaC0+Yl9kYXRhLCBiaC0+Yl9zaXplLCBiaCk7CisJcmV0dXJuIGlzX2ludGVybmFsKGJoLT5iX2RhdGEsIGJoLT5iX3NpemUsIGJoKTsKIH0KIAotCi0KICNkZWZpbmUgU0VBUkNIX0JZX0tFWV9SRUFEQSAxNgogCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1zdGF0aWMgdm9pZCBzZWFyY2hfYnlfa2V5X3JlYWRhIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsCi0JCQkJIHVuc2lnbmVkIGxvbmcgKmIsIGludCBudW0pCitzdGF0aWMgdm9pZCBzZWFyY2hfYnlfa2V5X3JlYWRhKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwKKwkJCQl1bnNpZ25lZCBsb25nICpiLCBpbnQgbnVtKQogewotICAgIGludCBpLGo7Ci0gIAotICAgIGZvciAoaSA9IDAgOyBpIDwgbnVtIDsgaSsrKSB7Ci0JYmhbaV0gPSBzYl9nZXRibGsgKHMsIGJbaV0pOwotICAgIH0KLSAgICBmb3IgKGogPSAwIDsgaiA8IGkgOyBqKyspIHsKLQkvKgotCSAqIG5vdGUsIHRoaXMgbmVlZHMgYXR0ZW50aW9uIGlmIHdlIGFyZSBnZXR0aW5nIHJpZCBvZiB0aGUgQktMCi0JICogeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBwcmVwYXJlZCBiaXQgaXNuJ3Qgc2V0IG9uIHRoaXMgYnVmZmVyCi0JICovCi0JaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhbal0pKQotCSAgICBsbF9yd19ibG9jayhSRUFEQSwgMSwgYmggKyBqKTsKLSAgICAJYnJlbHNlKGJoW2pdKTsKLSAgICB9CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJYmhbaV0gPSBzYl9nZXRibGsocywgYltpXSk7CisJfQorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJLyoKKwkJICogbm90ZSwgdGhpcyBuZWVkcyBhdHRlbnRpb24gaWYgd2UgYXJlIGdldHRpbmcgcmlkIG9mIHRoZSBCS0wKKwkJICogeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBwcmVwYXJlZCBiaXQgaXNuJ3Qgc2V0IG9uIHRoaXMgYnVmZmVyCisJCSAqLworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaFtqXSkpCisJCQlsbF9yd19ibG9jayhSRUFEQSwgMSwgYmggKyBqKTsKKwkJYnJlbHNlKGJoW2pdKTsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTc2LDE5MyArNjAyLDE5OSBAQAogICAgY29ycmVjdG5lc3Mgb2YgdGhlIHRvcCBvZiB0aGUgcGF0aCBidXQgbmVlZCBub3QgYmUgY2hlY2tlZCBmb3IgdGhlCiAgICBjb3JyZWN0bmVzcyBvZiB0aGUgYm90dG9tIG9mIHRoZSBwYXRoICovCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1pbnQgc2VhcmNoX2J5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiLAotCQkgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19rZXksIC8qIEtleSB0byBzZWFyY2guICovCi0JCSAgIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoLCAvKiBUaGlzIHN0cnVjdHVyZSB3YXMKLQkJCQkJCSAgICAgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAotCQkJCQkJICAgICBieSB0aGUgY2FsbGluZwotCQkJCQkJICAgICBmdW5jdGlvbi4gSXQgaXMgZmlsbGVkIHVwCi0JCQkJCQkgICAgIGJ5IHRoaXMgZnVuY3Rpb24uICAqLwotCQkgICBpbnQgbl9zdG9wX2xldmVsIC8qIEhvdyBmYXIgZG93biB0aGUgdHJlZSB0byBzZWFyY2guIFRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wIGF0IGxlYWYgbGV2ZWwgLSBzZXQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0tfTEVBRl9OT0RFX0xFVkVMICovCi0gICAgKSB7Ci0gICAgaW50ICBuX2Jsb2NrX251bWJlcjsKLSAgICBpbnQgIGV4cGVjdGVkX2xldmVsOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiAgICAgICBwX3NfYmg7Ci0gICAgc3RydWN0IHBhdGhfZWxlbWVudCAqICAgICAgIHBfc19sYXN0X2VsZW1lbnQ7Ci0gICAgaW50CQkJCW5fbm9kZV9sZXZlbCwgbl9yZXR2YWw7Ci0gICAgaW50IAkJCXJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZTsKLSAgICBpbnQJCQkJZnNfZ2VuOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcmVhZGFfYmhbU0VBUkNIX0JZX0tFWV9SRUFEQV07Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgIHJlYWRhX2Jsb2Nrc1tTRUFSQ0hfQllfS0VZX1JFQURBXTsKLSAgICBpbnQgcmVhZGFfY291bnQgPSAwOworaW50IHNlYXJjaF9ieV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5LAkvKiBLZXkgdG8gc2VhcmNoLiAqLworCQkgIHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgsCS8qIFRoaXMgc3RydWN0dXJlIHdhcworCQkJCQkJICAgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAorCQkJCQkJICAgYnkgdGhlIGNhbGxpbmcKKwkJCQkJCSAgIGZ1bmN0aW9uLiBJdCBpcyBmaWxsZWQgdXAKKwkJCQkJCSAgIGJ5IHRoaXMgZnVuY3Rpb24uICAqLworCQkgIGludCBuX3N0b3BfbGV2ZWwJLyogSG93IGZhciBkb3duIHRoZSB0cmVlIHRvIHNlYXJjaC4gVG8KKwkJCQkJICAgc3RvcCBhdCBsZWFmIGxldmVsIC0gc2V0IHRvCisJCQkJCSAgIERJU0tfTEVBRl9OT0RFX0xFVkVMICovCisgICAgKQoreworCWludCBuX2Jsb2NrX251bWJlcjsKKwlpbnQgZXhwZWN0ZWRfbGV2ZWw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmg7CisJc3RydWN0IHBhdGhfZWxlbWVudCAqcF9zX2xhc3RfZWxlbWVudDsKKwlpbnQgbl9ub2RlX2xldmVsLCBuX3JldHZhbDsKKwlpbnQgcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlOworCWludCBmc19nZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpyZWFkYV9iaFtTRUFSQ0hfQllfS0VZX1JFQURBXTsKKwl1bnNpZ25lZCBsb25nIHJlYWRhX2Jsb2Nrc1tTRUFSQ0hfQllfS0VZX1JFQURBXTsKKwlpbnQgcmVhZGFfY291bnQgPSAwOwogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgaW50IG5fcmVwZWF0X2NvdW50ZXIgPSAwOworCWludCBuX3JlcGVhdF9jb3VudGVyID0gMDsKICNlbmRpZgotICAgIAotICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleSApOwotICAgIAotICAgIC8qIEFzIHdlIGFkZCBlYWNoIG5vZGUgdG8gYSBwYXRoIHdlIGluY3JlYXNlIGl0cyBjb3VudC4gIFRoaXMgbWVhbnMgdGhhdAotICAgICAgIHdlIG11c3QgYmUgY2FyZWZ1bCB0byByZWxlYXNlIGFsbCBub2RlcyBpbiBhIHBhdGggYmVmb3JlIHdlIGVpdGhlcgotICAgICAgIGRpc2NhcmQgdGhlIHBhdGggc3RydWN0IG9yIHJlLXVzZSB0aGUgcGF0aCBzdHJ1Y3QsIGFzIHdlIGRvIGhlcmUuICovCiAKLSAgICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3Nfc2VhcmNoX3BhdGgpOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBzZWFyY2hfYnlfa2V5KTsKIAotICAgIHJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7CisJLyogQXMgd2UgYWRkIGVhY2ggbm9kZSB0byBhIHBhdGggd2UgaW5jcmVhc2UgaXRzIGNvdW50LiAgVGhpcyBtZWFucyB0aGF0CisJICAgd2UgbXVzdCBiZSBjYXJlZnVsIHRvIHJlbGVhc2UgYWxsIG5vZGVzIGluIGEgcGF0aCBiZWZvcmUgd2UgZWl0aGVyCisJICAgZGlzY2FyZCB0aGUgcGF0aCBzdHJ1Y3Qgb3IgcmUtdXNlIHRoZSBwYXRoIHN0cnVjdCwgYXMgd2UgZG8gaGVyZS4gKi8KIAotICAgIC8qIFdpdGggZWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIHdlIHNlYXJjaCB0aHJvdWdoIHRoZSBpdGVtcyBpbiB0aGUKLSAgICAgICBjdXJyZW50IG5vZGUsIGFuZCBjYWxjdWxhdGUgdGhlIG5leHQgY3VycmVudCBub2RlKG5leHQgcGF0aCBlbGVtZW50KQotICAgICAgIGZvciB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhpcyBsb29wLi4gKi8KLSAgICBuX2Jsb2NrX251bWJlciA9IFNCX1JPT1RfQkxPQ0sgKHBfc19zYik7Ci0gICAgZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKLSAgICB3aGlsZSAoIDEgKSB7CisJZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgocF9zX3NlYXJjaF9wYXRoKTsKKworCXJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7CisKKwkvKiBXaXRoIGVhY2ggaXRlcmF0aW9uIG9mIHRoaXMgbG9vcCB3ZSBzZWFyY2ggdGhyb3VnaCB0aGUgaXRlbXMgaW4gdGhlCisJICAgY3VycmVudCBub2RlLCBhbmQgY2FsY3VsYXRlIHRoZSBuZXh0IGN1cnJlbnQgbm9kZShuZXh0IHBhdGggZWxlbWVudCkKKwkgICBmb3IgdGhlIG5leHQgaXRlcmF0aW9uIG9mIHRoaXMgbG9vcC4uICovCisJbl9ibG9ja19udW1iZXIgPSBTQl9ST09UX0JMT0NLKHBfc19zYik7CisJZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKKwl3aGlsZSAoMSkgewogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JaWYgKCAhKCsrbl9yZXBlYXRfY291bnRlciAlIDUwMDAwKSApCi0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIlBBUC01MTAwOiBzZWFyY2hfYnlfa2V5OiAlczoiCi0JCQkgICAgICAidGhlcmUgd2VyZSAlZCBpdGVyYXRpb25zIG9mIHdoaWxlIGxvb3AgIgotCQkJICAgICAgImxvb2tpbmcgZm9yIGtleSAlSyIsCi0JCQkgICAgICBjdXJyZW50LT5jb21tLCBuX3JlcGVhdF9jb3VudGVyLCBwX3Nfa2V5KTsKKwkJaWYgKCEoKytuX3JlcGVhdF9jb3VudGVyICUgNTAwMDApKQorCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJQQVAtNTEwMDogc2VhcmNoX2J5X2tleTogJXM6IgorCQkJCQkgInRoZXJlIHdlcmUgJWQgaXRlcmF0aW9ucyBvZiB3aGlsZSBsb29wICIKKwkJCQkJICJsb29raW5nIGZvciBrZXkgJUsiLAorCQkJCQkgY3VycmVudC0+Y29tbSwgbl9yZXBlYXRfY291bnRlciwKKwkJCQkJIHBfc19rZXkpOwogI2VuZGlmCiAKLQkvKiBwcmVwIHBhdGggdG8gaGF2ZSBhbm90aGVyIGVsZW1lbnQgYWRkZWQgdG8gaXQuICovCi0JcF9zX2xhc3RfZWxlbWVudCA9IFBBVEhfT0ZGU0VUX1BFTEVNRU5UKHBfc19zZWFyY2hfcGF0aCwgKytwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoKTsKLQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbiAocF9zX3NiKTsKKwkJLyogcHJlcCBwYXRoIHRvIGhhdmUgYW5vdGhlciBlbGVtZW50IGFkZGVkIHRvIGl0LiAqLworCQlwX3NfbGFzdF9lbGVtZW50ID0KKwkJICAgIFBBVEhfT0ZGU0VUX1BFTEVNRU5UKHBfc19zZWFyY2hfcGF0aCwKKwkJCQkJICsrcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCk7CisJCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKHBfc19zYik7CiAKLQkvKiBSZWFkIHRoZSBuZXh0IHRyZWUgbm9kZSwgYW5kIHNldCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBwYXRoIHRvCi0gICAgICAgICAgIGhhdmUgYSBwb2ludGVyIHRvIGl0LiAqLwotCWlmICgocF9zX2JoID0gcF9zX2xhc3RfZWxlbWVudC0+cGVfYnVmZmVyID0KLQkgICAgIHNiX2dldGJsayhwX3Nfc2IsIG5fYmxvY2tfbnVtYmVyKSkgKSB7Ci0JICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKHBfc19iaCkgJiYgcmVhZGFfY291bnQgPiAxKSB7Ci0JCXNlYXJjaF9ieV9rZXlfcmVhZGEgKHBfc19zYiwgcmVhZGFfYmgsCi0JCSAgICAgICAgICAgICAgICAgICAgIHJlYWRhX2Jsb2NrcywgcmVhZGFfY291bnQpOwotCSAgICB9Ci0JICAgIGxsX3J3X2Jsb2NrKFJFQUQsIDEsICZwX3NfYmgpOwotCSAgICB3YWl0X29uX2J1ZmZlcihwX3NfYmgpOwotCSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShwX3NfYmgpKQotCSAgICAgICAgZ290byBpb19lcnJvcjsKLQl9IGVsc2UgewotaW9fZXJyb3I6Ci0JICAgIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggLS07Ci0JICAgIHBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOwotCSAgICByZXR1cm4gSU9fRVJST1I7Ci0JfQotCXJlYWRhX2NvdW50ID0gMDsKLQlpZiAoZXhwZWN0ZWRfbGV2ZWwgPT0gLTEpCi0JCWV4cGVjdGVkX2xldmVsID0gU0JfVFJFRV9IRUlHSFQgKHBfc19zYik7Ci0JZXhwZWN0ZWRfbGV2ZWwgLS07Ci0KLQkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNjaGVkdWxlIG9jY3VycmVkLiBXZSBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIGtleQotCSAgIHRvIHNlYXJjaCBpcyBzdGlsbCBpbiB0aGUgdHJlZSByb290ZWQgZnJvbSB0aGUgY3VycmVudCBidWZmZXIuIElmCi0JICAgbm90IHRoZW4gcmVwZWF0IHNlYXJjaCBmcm9tIHRoZSByb290LiAqLwotCWlmICggZnNfY2hhbmdlZCAoZnNfZ2VuLCBwX3Nfc2IpICYmIAotCSAgICAoIUJfSVNfSU5fVFJFRSAocF9zX2JoKSB8fAotCSAgICAgQl9MRVZFTChwX3NfYmgpICE9IGV4cGVjdGVkX2xldmVsIHx8Ci0JICAgICAha2V5X2luX2J1ZmZlcihwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXksIHBfc19zYikpKSB7Ci0JICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkICk7Ci0JICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQgKTsKLQkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBzYmtfcmVzdGFydGVkWyBleHBlY3RlZF9sZXZlbCAtIDEgXSApOwotCSAgICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3Nfc2VhcmNoX3BhdGgpOwotCSAgICAKLQkgICAgLyogR2V0IHRoZSByb290IGJsb2NrIG51bWJlciBzbyB0aGF0IHdlIGNhbiByZXBlYXQgdGhlIHNlYXJjaAotCSAgICAgICBzdGFydGluZyBmcm9tIHRoZSByb290LiAqLwotCSAgICBuX2Jsb2NrX251bWJlciA9IFNCX1JPT1RfQkxPQ0sgKHBfc19zYik7Ci0JICAgIGV4cGVjdGVkX2xldmVsID0gLTE7Ci0JICAgIHJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7Ci0JICAgIAotCSAgICAvKiByZXBlYXQgc2VhcmNoIGZyb20gdGhlIHJvb3QgKi8KLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAgIC8qIG9ubHkgY2hlY2sgdGhhdCB0aGUga2V5IGlzIGluIHRoZSBidWZmZXIgaWYgcF9zX2tleSBpcyBub3QKLSAgICAgICAgICAgZXF1YWwgdG8gdGhlIE1BWF9LRVkuIExhdHRlciBjYXNlIGlzIG9ubHkgcG9zc2libGUgaW4KLSAgICAgICAgICAgImZpbmlzaF91bmZpbmlzaGVkKCkiIHByb2Nlc3NpbmcgZHVyaW5nIG1vdW50LiAqLwotICAgICAgICBSRkFMU0UoIGNvbXBfa2V5cyggJk1BWF9LRVksIHBfc19rZXkgKSAmJgotICAgICAgICAgICAgICAgICEga2V5X2luX2J1ZmZlcihwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXksIHBfc19zYiksCi0JCSJQQVAtNTEzMDoga2V5IGlzIG5vdCBpbiB0aGUgYnVmZmVyIik7Ci0jaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JaWYgKCBjdXJfdGIgKSB7Ci0JICAgIHByaW50X2N1cl90YiAoIjUxNDAiKTsKLQkgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiUEFQLTUxNDA6IHNlYXJjaF9ieV9rZXk6IHNjaGVkdWxlIG9jY3VycmVkIGluIGRvX2JhbGFuY2UhIik7Ci0JfQotI2VuZGlmCi0KLQkvLyBtYWtlIHN1cmUsIHRoYXQgdGhlIG5vZGUgY29udGVudHMgbG9vayBsaWtlIGEgbm9kZSBvZgotCS8vIGNlcnRhaW4gbGV2ZWwKLQlpZiAoIWlzX3RyZWVfbm9kZSAocF9zX2JoLCBleHBlY3RlZF9sZXZlbCkpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAidnMtNTE1MDogc2VhcmNoX2J5X2tleTogIgotCQkJICAgICAgImludmFsaWQgZm9ybWF0IGZvdW5kIGluIGJsb2NrICVsZC4gRnNjaz8iLAotCQkJICAgICAgcF9zX2JoLT5iX2Jsb2NrbnIpOwotCSAgICBwYXRocmVsc2UgKHBfc19zZWFyY2hfcGF0aCk7Ci0JICAgIHJldHVybiBJT19FUlJPUjsKLQl9Ci0JCi0JLyogb2ssIHdlIGhhdmUgYWNxdWlyZWQgbmV4dCBmb3JtYXR0ZWQgbm9kZSBpbiB0aGUgdHJlZSAqLwotCW5fbm9kZV9sZXZlbCA9IEJfTEVWRUwgKHBfc19iaCk7Ci0KLQlQUk9DX0lORk9fQkhfU1RBVCggcF9zX3NiLCBwX3NfYmgsIG5fbm9kZV9sZXZlbCAtIDEgKTsKLQotCVJGQUxTRSggbl9ub2RlX2xldmVsIDwgbl9zdG9wX2xldmVsLAotCQkidnMtNTE1MjogdHJlZSBsZXZlbCAoJWQpIGlzIGxlc3MgdGhhbiBzdG9wIGxldmVsICglZCkiLAotCQluX25vZGVfbGV2ZWwsIG5fc3RvcF9sZXZlbCk7Ci0KLQluX3JldHZhbCA9IGJpbl9zZWFyY2goIHBfc19rZXksIEJfTl9QSVRFTV9IRUFEKHBfc19iaCwgMCksCi0gICAgICAgICAgICAgICAgQl9OUl9JVEVNUyhwX3NfYmgpLAotICAgICAgICAgICAgICAgICggbl9ub2RlX2xldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMICkgPyBJSF9TSVpFIDogS0VZX1NJWkUsCi0gICAgICAgICAgICAgICAgJihwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbikpOwotCWlmIChuX25vZGVfbGV2ZWwgPT0gbl9zdG9wX2xldmVsKSB7Ci0JICAgIHJldHVybiBuX3JldHZhbDsKLQl9Ci0KLQkvKiB3ZSBhcmUgbm90IGluIHRoZSBzdG9wIGxldmVsICovCi0JaWYgKG5fcmV0dmFsID09IElURU1fRk9VTkQpCi0JICAgIC8qIGl0ZW0gaGFzIGJlZW4gZm91bmQsIHNvIHdlIGNob29zZSB0aGUgcG9pbnRlciB3aGljaCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIGZvdW5kIG9uZSAqLwotCSAgICBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbisrOwotCi0JLyogaWYgaXRlbSB3YXMgbm90IGZvdW5kIHdlIGNob29zZSB0aGUgcG9zaXRpb24gd2hpY2ggaXMgdG8KLQkgICB0aGUgbGVmdCBvZiB0aGUgZm91bmQgaXRlbS4gVGhpcyByZXF1aXJlcyBubyBjb2RlLAotCSAgIGJpbl9zZWFyY2ggZGlkIGl0IGFscmVhZHkuKi8KLQotCS8qIFNvIHdlIGhhdmUgY2hvc2VuIGEgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgbm9kZSB3aGljaCBpcwotCSAgIGFuIGludGVybmFsIG5vZGUuICBOb3cgd2UgY2FsY3VsYXRlIGNoaWxkIGJsb2NrIG51bWJlciBieQotCSAgIHBvc2l0aW9uIGluIHRoZSBub2RlLiAqLwotCW5fYmxvY2tfbnVtYmVyID0gQl9OX0NISUxEX05VTShwX3NfYmgsIHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKTsKLQotCS8qIGlmIHdlIGFyZSBnb2luZyB0byByZWFkIGxlYWYgbm9kZXMsIHRyeSBmb3IgcmVhZCBhaGVhZCBhcyB3ZWxsICovCi0JaWYgKChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQSkgJiYKLQkgICAgbl9ub2RlX2xldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMICsgMSkKLQl7Ci0JICAgIGludCBwb3MgPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbjsKLQkgICAgaW50IGxpbWl0ID0gQl9OUl9JVEVNUyhwX3NfYmgpOwotCSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpsZV9rZXk7Ci0KLQkgICAgaWYgKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBX0JBQ0spCi0JCWxpbWl0ID0gMDsKLQkgICAgd2hpbGUocmVhZGFfY291bnQgPCBTRUFSQ0hfQllfS0VZX1JFQURBKSB7Ci0JCWlmIChwb3MgPT0gbGltaXQpCi0JCSAgICBicmVhazsKLQkgICAgICAgIHJlYWRhX2Jsb2Nrc1tyZWFkYV9jb3VudCsrXSA9IEJfTl9DSElMRF9OVU0ocF9zX2JoLCBwb3MpOwotCQlpZiAocF9zX3NlYXJjaF9wYXRoLT5yZWFkYSAmIFBBVEhfUkVBREFfQkFDSykKLQkJICAgIHBvcy0tOwotCQllbHNlCi0JCSAgICBwb3MrKzsKLQotCQkvKgotCQkgKiBjaGVjayB0byBtYWtlIHN1cmUgd2UncmUgaW4gdGhlIHNhbWUgb2JqZWN0Ci0JCSAqLwotCQlsZV9rZXkgPSBCX05fUERFTElNX0tFWShwX3NfYmgsIHBvcyk7Ci0JCWlmIChsZTMyX3RvX2NwdShsZV9rZXktPmtfb2JqZWN0aWQpICE9Ci0JCSAgICBwX3Nfa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKQotCQl7Ci0JCSAgICBicmVhazsKKwkJLyogUmVhZCB0aGUgbmV4dCB0cmVlIG5vZGUsIGFuZCBzZXQgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcGF0aCB0bworCQkgICBoYXZlIGEgcG9pbnRlciB0byBpdC4gKi8KKwkJaWYgKChwX3NfYmggPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9idWZmZXIgPQorCQkgICAgIHNiX2dldGJsayhwX3Nfc2IsIG5fYmxvY2tfbnVtYmVyKSkpIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKHBfc19iaCkgJiYgcmVhZGFfY291bnQgPiAxKSB7CisJCQkJc2VhcmNoX2J5X2tleV9yZWFkYShwX3Nfc2IsIHJlYWRhX2JoLAorCQkJCQkJICAgIHJlYWRhX2Jsb2NrcywgcmVhZGFfY291bnQpOworCQkJfQorCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJnBfc19iaCk7CisJCQl3YWl0X29uX2J1ZmZlcihwX3NfYmgpOworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX2JoKSkKKwkJCQlnb3RvIGlvX2Vycm9yOworCQl9IGVsc2UgeworCQkgICAgICBpb19lcnJvcjoKKwkJCXBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGgtLTsKKwkJCXBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOworCQkJcmV0dXJuIElPX0VSUk9SOwogCQl9Ci0JICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KKwkJcmVhZGFfY291bnQgPSAwOworCQlpZiAoZXhwZWN0ZWRfbGV2ZWwgPT0gLTEpCisJCQlleHBlY3RlZF9sZXZlbCA9IFNCX1RSRUVfSEVJR0hUKHBfc19zYik7CisJCWV4cGVjdGVkX2xldmVsLS07CiAKKwkJLyogSXQgaXMgcG9zc2libGUgdGhhdCBzY2hlZHVsZSBvY2N1cnJlZC4gV2UgbXVzdCBjaGVjayB3aGV0aGVyIHRoZSBrZXkKKwkJICAgdG8gc2VhcmNoIGlzIHN0aWxsIGluIHRoZSB0cmVlIHJvb3RlZCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlci4gSWYKKwkJICAgbm90IHRoZW4gcmVwZWF0IHNlYXJjaCBmcm9tIHRoZSByb290LiAqLworCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIHBfc19zYikgJiYKKwkJICAgICghQl9JU19JTl9UUkVFKHBfc19iaCkgfHwKKwkJICAgICBCX0xFVkVMKHBfc19iaCkgIT0gZXhwZWN0ZWRfbGV2ZWwgfHwKKwkJICAgICAha2V5X2luX2J1ZmZlcihwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXksIHBfc19zYikpKSB7CisJCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkKTsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZCk7CisJCQlQUk9DX0lORk9fSU5DKHBfc19zYiwKKwkJCQkgICAgICBzYmtfcmVzdGFydGVkW2V4cGVjdGVkX2xldmVsIC0gMV0pOworCQkJZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgocF9zX3NlYXJjaF9wYXRoKTsKKworCQkJLyogR2V0IHRoZSByb290IGJsb2NrIG51bWJlciBzbyB0aGF0IHdlIGNhbiByZXBlYXQgdGhlIHNlYXJjaAorCQkJICAgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdC4gKi8KKwkJCW5fYmxvY2tfbnVtYmVyID0gU0JfUk9PVF9CTE9DSyhwX3Nfc2IpOworCQkJZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKKwkJCXJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7CisKKwkJCS8qIHJlcGVhdCBzZWFyY2ggZnJvbSB0aGUgcm9vdCAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKiBvbmx5IGNoZWNrIHRoYXQgdGhlIGtleSBpcyBpbiB0aGUgYnVmZmVyIGlmIHBfc19rZXkgaXMgbm90CisJCSAgIGVxdWFsIHRvIHRoZSBNQVhfS0VZLiBMYXR0ZXIgY2FzZSBpcyBvbmx5IHBvc3NpYmxlIGluCisJCSAgICJmaW5pc2hfdW5maW5pc2hlZCgpIiBwcm9jZXNzaW5nIGR1cmluZyBtb3VudC4gKi8KKwkJUkZBTFNFKGNvbXBfa2V5cygmTUFYX0tFWSwgcF9zX2tleSkgJiYKKwkJICAgICAgICFrZXlfaW5fYnVmZmVyKHBfc19zZWFyY2hfcGF0aCwgcF9zX2tleSwgcF9zX3NiKSwKKwkJICAgICAgICJQQVAtNTEzMDoga2V5IGlzIG5vdCBpbiB0aGUgYnVmZmVyIik7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCWlmIChjdXJfdGIpIHsKKwkJCXByaW50X2N1cl90YigiNTE0MCIpOworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiUEFQLTUxNDA6IHNlYXJjaF9ieV9rZXk6IHNjaGVkdWxlIG9jY3VycmVkIGluIGRvX2JhbGFuY2UhIik7CisJCX0KKyNlbmRpZgorCisJCS8vIG1ha2Ugc3VyZSwgdGhhdCB0aGUgbm9kZSBjb250ZW50cyBsb29rIGxpa2UgYSBub2RlIG9mCisJCS8vIGNlcnRhaW4gbGV2ZWwKKwkJaWYgKCFpc190cmVlX25vZGUocF9zX2JoLCBleHBlY3RlZF9sZXZlbCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAidnMtNTE1MDogc2VhcmNoX2J5X2tleTogIgorCQkJCQkgImludmFsaWQgZm9ybWF0IGZvdW5kIGluIGJsb2NrICVsZC4gRnNjaz8iLAorCQkJCQkgcF9zX2JoLT5iX2Jsb2NrbnIpOworCQkJcGF0aHJlbHNlKHBfc19zZWFyY2hfcGF0aCk7CisJCQlyZXR1cm4gSU9fRVJST1I7CisJCX0KKworCQkvKiBvaywgd2UgaGF2ZSBhY3F1aXJlZCBuZXh0IGZvcm1hdHRlZCBub2RlIGluIHRoZSB0cmVlICovCisJCW5fbm9kZV9sZXZlbCA9IEJfTEVWRUwocF9zX2JoKTsKKworCQlQUk9DX0lORk9fQkhfU1RBVChwX3Nfc2IsIHBfc19iaCwgbl9ub2RlX2xldmVsIC0gMSk7CisKKwkJUkZBTFNFKG5fbm9kZV9sZXZlbCA8IG5fc3RvcF9sZXZlbCwKKwkJICAgICAgICJ2cy01MTUyOiB0cmVlIGxldmVsICglZCkgaXMgbGVzcyB0aGFuIHN0b3AgbGV2ZWwgKCVkKSIsCisJCSAgICAgICBuX25vZGVfbGV2ZWwsIG5fc3RvcF9sZXZlbCk7CisKKwkJbl9yZXR2YWwgPSBiaW5fc2VhcmNoKHBfc19rZXksIEJfTl9QSVRFTV9IRUFEKHBfc19iaCwgMCksCisJCQkJICAgICAgQl9OUl9JVEVNUyhwX3NfYmgpLAorCQkJCSAgICAgIChuX25vZGVfbGV2ZWwgPT0KKwkJCQkgICAgICAgRElTS19MRUFGX05PREVfTEVWRUwpID8gSUhfU0laRSA6CisJCQkJICAgICAgS0VZX1NJWkUsCisJCQkJICAgICAgJihwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbikpOworCQlpZiAobl9ub2RlX2xldmVsID09IG5fc3RvcF9sZXZlbCkgeworCQkJcmV0dXJuIG5fcmV0dmFsOworCQl9CisKKwkJLyogd2UgYXJlIG5vdCBpbiB0aGUgc3RvcCBsZXZlbCAqLworCQlpZiAobl9yZXR2YWwgPT0gSVRFTV9GT1VORCkKKwkJCS8qIGl0ZW0gaGFzIGJlZW4gZm91bmQsIHNvIHdlIGNob29zZSB0aGUgcG9pbnRlciB3aGljaCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIGZvdW5kIG9uZSAqLworCQkJcF9zX2xhc3RfZWxlbWVudC0+cGVfcG9zaXRpb24rKzsKKworCQkvKiBpZiBpdGVtIHdhcyBub3QgZm91bmQgd2UgY2hvb3NlIHRoZSBwb3NpdGlvbiB3aGljaCBpcyB0bworCQkgICB0aGUgbGVmdCBvZiB0aGUgZm91bmQgaXRlbS4gVGhpcyByZXF1aXJlcyBubyBjb2RlLAorCQkgICBiaW5fc2VhcmNoIGRpZCBpdCBhbHJlYWR5LiAqLworCisJCS8qIFNvIHdlIGhhdmUgY2hvc2VuIGEgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgbm9kZSB3aGljaCBpcworCQkgICBhbiBpbnRlcm5hbCBub2RlLiAgTm93IHdlIGNhbGN1bGF0ZSBjaGlsZCBibG9jayBudW1iZXIgYnkKKwkJICAgcG9zaXRpb24gaW4gdGhlIG5vZGUuICovCisJCW5fYmxvY2tfbnVtYmVyID0KKwkJICAgIEJfTl9DSElMRF9OVU0ocF9zX2JoLCBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbik7CisKKwkJLyogaWYgd2UgYXJlIGdvaW5nIHRvIHJlYWQgbGVhZiBub2RlcywgdHJ5IGZvciByZWFkIGFoZWFkIGFzIHdlbGwgKi8KKwkJaWYgKChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQSkgJiYKKwkJICAgIG5fbm9kZV9sZXZlbCA9PSBESVNLX0xFQUZfTk9ERV9MRVZFTCArIDEpIHsKKwkJCWludCBwb3MgPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbjsKKwkJCWludCBsaW1pdCA9IEJfTlJfSVRFTVMocF9zX2JoKTsKKwkJCXN0cnVjdCByZWlzZXJmc19rZXkgKmxlX2tleTsKKworCQkJaWYgKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBX0JBQ0spCisJCQkJbGltaXQgPSAwOworCQkJd2hpbGUgKHJlYWRhX2NvdW50IDwgU0VBUkNIX0JZX0tFWV9SRUFEQSkgeworCQkJCWlmIChwb3MgPT0gbGltaXQpCisJCQkJCWJyZWFrOworCQkJCXJlYWRhX2Jsb2Nrc1tyZWFkYV9jb3VudCsrXSA9CisJCQkJICAgIEJfTl9DSElMRF9OVU0ocF9zX2JoLCBwb3MpOworCQkJCWlmIChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQV9CQUNLKQorCQkJCQlwb3MtLTsKKwkJCQllbHNlCisJCQkJCXBvcysrOworCisJCQkJLyoKKwkJCQkgKiBjaGVjayB0byBtYWtlIHN1cmUgd2UncmUgaW4gdGhlIHNhbWUgb2JqZWN0CisJCQkJICovCisJCQkJbGVfa2V5ID0gQl9OX1BERUxJTV9LRVkocF9zX2JoLCBwb3MpOworCQkJCWlmIChsZTMyX3RvX2NwdShsZV9rZXktPmtfb2JqZWN0aWQpICE9CisJCQkJICAgIHBfc19rZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQogCiAvKiBGb3JtIHRoZSBwYXRoIHRvIGFuIGl0ZW0gYW5kIHBvc2l0aW9uIGluIHRoaXMgaXRlbSB3aGljaCBjb250YWlucwogICAgZmlsZSBieXRlIGRlZmluZWQgYnkgcF9zX2tleS4gSWYgdGhlcmUgaXMgbm8gc3VjaCBpdGVtCkBAIC03ODAsOTQgKzgxMiw5NyBAQAogICAgdW5pdHMgb2YgZGlyZWN0b3J5IGVudHJpZXMuICAqLwogCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1pbnQgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IsICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2suICAgICAgICAgICovCi0JCQkJY29uc3Qgc3RydWN0IGNwdV9rZXkgICogcF9jcHVfa2V5LCAgICAgIC8qIEtleSB0byBzZWFyY2ggKGNwdSB2YXJpYWJsZSkgICAgICAgICAqLwotCQkJCXN0cnVjdCBwYXRoICAgICAgICAgKiBwX3Nfc2VhcmNoX3BhdGggLyogRmlsbGVkIHVwIGJ5IHRoaXMgZnVuY3Rpb24uICAgICAgICAgICovCi0gICAgKSB7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAgICAqIHBfbGVfaWg7IC8qIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9ibGtfc2l6ZTsKLSAgICBsb2ZmX3QgaXRlbV9vZmZzZXQsIG9mZnNldDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIGludCByZXR2YWw7CitpbnQgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCS8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrLiAgICAgICAgICAqLworCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX2NwdV9rZXksCS8qIEtleSB0byBzZWFyY2ggKGNwdSB2YXJpYWJsZSkgICAgICAgICAqLworCQkJICAgICAgIHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgJLyogRmlsbGVkIHVwIGJ5IHRoaXMgZnVuY3Rpb24uICAgICAgICAgICovCisgICAgKQoreworCXN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWg7CS8qIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgKi8KKwlpbnQgbl9ibGtfc2l6ZTsKKwlsb2ZmX3QgaXRlbV9vZmZzZXQsIG9mZnNldDsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworCWludCByZXR2YWw7CiAKLSAgICAvKiBJZiBzZWFyY2hpbmcgZm9yIGRpcmVjdG9yeSBlbnRyeS4gKi8KLSAgICBpZiAoIGlzX2RpcmVudHJ5X2NwdV9rZXkgKHBfY3B1X2tleSkgKQotCXJldHVybiAgc2VhcmNoX2J5X2VudHJ5X2tleSAocF9zX3NiLCBwX2NwdV9rZXksIHBfc19zZWFyY2hfcGF0aCwgJmRlKTsKKwkvKiBJZiBzZWFyY2hpbmcgZm9yIGRpcmVjdG9yeSBlbnRyeS4gKi8KKwlpZiAoaXNfZGlyZW50cnlfY3B1X2tleShwX2NwdV9rZXkpKQorCQlyZXR1cm4gc2VhcmNoX2J5X2VudHJ5X2tleShwX3Nfc2IsIHBfY3B1X2tleSwgcF9zX3NlYXJjaF9wYXRoLAorCQkJCQkgICAmZGUpOwogCi0gICAgLyogSWYgbm90IHNlYXJjaGluZyBmb3IgZGlyZWN0b3J5IGVudHJ5LiAqLwotICAgIAotICAgIC8qIElmIGl0ZW0gaXMgZm91bmQuICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHBfc19zYiwgcF9jcHVfa2V5LCBwX3Nfc2VhcmNoX3BhdGgpOwotICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpCi0JcmV0dXJuIHJldHZhbDsKLSAgICBpZiAoIHJldHZhbCA9PSBJVEVNX0ZPVU5EICkgIHsKKwkvKiBJZiBub3Qgc2VhcmNoaW5nIGZvciBkaXJlY3RvcnkgZW50cnkuICovCiAKLQlSRkFMU0UoICEgaWhfaXRlbV9sZW4oCi0gICAgICAgICAgICAgICAgQl9OX1BJVEVNX0hFQUQoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3NlYXJjaF9wYXRoKSwKLQkJCSAgICAgICBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3NlYXJjaF9wYXRoKSkpLAotCSAgICAgICAgIlBBUC01MTY1OiBpdGVtIGxlbmd0aCBlcXVhbHMgemVybyIpOworCS8qIElmIGl0ZW0gaXMgZm91bmQuICovCisJcmV0dmFsID0gc2VhcmNoX2l0ZW0ocF9zX3NiLCBwX2NwdV9rZXksIHBfc19zZWFyY2hfcGF0aCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKIAotCXBvc19pbl9pdGVtKHBfc19zZWFyY2hfcGF0aCkgPSAwOwotCXJldHVybiBQT1NJVElPTl9GT1VORDsKLSAgICB9CisJCVJGQUxTRSghaWhfaXRlbV9sZW4KKwkJICAgICAgIChCX05fUElURU1fSEVBRAorCQkJKFBBVEhfUExBU1RfQlVGRkVSKHBfc19zZWFyY2hfcGF0aCksCisJCQkgUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCkpKSwKKwkJICAgICAgICJQQVAtNTE2NTogaXRlbSBsZW5ndGggZXF1YWxzIHplcm8iKTsKIAotICAgIFJGQUxTRSggISBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3NlYXJjaF9wYXRoKSwKLQkgICAgIlBBUC01MTcwOiBwb3NpdGlvbiBlcXVhbHMgemVybyIpOwotCi0gICAgLyogSXRlbSBpcyBub3QgZm91bmQuIFNldCBwYXRoIHRvIHRoZSBwcmV2aW91cyBpdGVtLiAqLwotICAgIHBfbGVfaWggPSBCX05fUElURU1fSEVBRChQQVRIX1BMQVNUX0JVRkZFUihwX3Nfc2VhcmNoX3BhdGgpLCAtLVBBVEhfTEFTVF9QT1NJVElPTihwX3Nfc2VhcmNoX3BhdGgpKTsKLSAgICBuX2Jsa19zaXplID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKLQotICAgIGlmIChjb21wX3Nob3J0X2tleXMgKCYocF9sZV9paC0+aWhfa2V5KSwgcF9jcHVfa2V5KSkgewotCXJldHVybiBGSUxFX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogcXVpdGUgdWdseSB0aGlzIGZhcgotCi0gICAgaXRlbV9vZmZzZXQgPSBsZV9paF9rX29mZnNldCAocF9sZV9paCk7Ci0gICAgb2Zmc2V0ID0gY3B1X2tleV9rX29mZnNldCAocF9jcHVfa2V5KTsKLQotICAgIC8qIE5lZWRlZCBieXRlIGlzIGNvbnRhaW5lZCBpbiB0aGUgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZSBwYXRoLiovCi0gICAgaWYgKGl0ZW1fb2Zmc2V0IDw9IG9mZnNldCAmJgotCWl0ZW1fb2Zmc2V0ICsgb3BfYnl0ZXNfbnVtYmVyIChwX2xlX2loLCBuX2Jsa19zaXplKSA+IG9mZnNldCkgewotCXBvc19pbl9pdGVtIChwX3Nfc2VhcmNoX3BhdGgpID0gb2Zmc2V0IC0gaXRlbV9vZmZzZXQ7Ci0JaWYgKCBpc19pbmRpcmVjdF9sZV9paChwX2xlX2loKSApIHsKLQkgICAgcG9zX2luX2l0ZW0gKHBfc19zZWFyY2hfcGF0aCkgLz0gbl9ibGtfc2l6ZTsKKwkJcG9zX2luX2l0ZW0ocF9zX3NlYXJjaF9wYXRoKSA9IDA7CisJCXJldHVybiBQT1NJVElPTl9GT1VORDsKIAl9Ci0JcmV0dXJuIFBPU0lUSU9OX0ZPVU5EOwotICAgIH0KIAotICAgIC8qIE5lZWRlZCBieXRlIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUKLSAgICAgcGF0aC4gU2V0IHBvc19pbl9pdGVtIG91dCBvZiB0aGUgaXRlbS4gKi8KLSAgICBpZiAoIGlzX2luZGlyZWN0X2xlX2loIChwX2xlX2loKSApCi0JcG9zX2luX2l0ZW0gKHBfc19zZWFyY2hfcGF0aCkgPSBpaF9pdGVtX2xlbihwX2xlX2loKSAvIFVORk1fUF9TSVpFOwotICAgIGVsc2UKLSAgICAgICAgcG9zX2luX2l0ZW0gKHBfc19zZWFyY2hfcGF0aCkgPSBpaF9pdGVtX2xlbiggcF9sZV9paCApOwotICAKLSAgICByZXR1cm4gUE9TSVRJT05fTk9UX0ZPVU5EOworCVJGQUxTRSghUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCksCisJICAgICAgICJQQVAtNTE3MDogcG9zaXRpb24gZXF1YWxzIHplcm8iKTsKKworCS8qIEl0ZW0gaXMgbm90IGZvdW5kLiBTZXQgcGF0aCB0byB0aGUgcHJldmlvdXMgaXRlbS4gKi8KKwlwX2xlX2loID0KKwkgICAgQl9OX1BJVEVNX0hFQUQoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3NlYXJjaF9wYXRoKSwKKwkJCSAgIC0tUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCkpOworCW5fYmxrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworCisJaWYgKGNvbXBfc2hvcnRfa2V5cygmKHBfbGVfaWgtPmloX2tleSksIHBfY3B1X2tleSkpIHsKKwkJcmV0dXJuIEZJTEVfTk9UX0ZPVU5EOworCX0KKwkvLyBGSVhNRTogcXVpdGUgdWdseSB0aGlzIGZhcgorCisJaXRlbV9vZmZzZXQgPSBsZV9paF9rX29mZnNldChwX2xlX2loKTsKKwlvZmZzZXQgPSBjcHVfa2V5X2tfb2Zmc2V0KHBfY3B1X2tleSk7CisKKwkvKiBOZWVkZWQgYnl0ZSBpcyBjb250YWluZWQgaW4gdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aC4gKi8KKwlpZiAoaXRlbV9vZmZzZXQgPD0gb2Zmc2V0ICYmCisJICAgIGl0ZW1fb2Zmc2V0ICsgb3BfYnl0ZXNfbnVtYmVyKHBfbGVfaWgsIG5fYmxrX3NpemUpID4gb2Zmc2V0KSB7CisJCXBvc19pbl9pdGVtKHBfc19zZWFyY2hfcGF0aCkgPSBvZmZzZXQgLSBpdGVtX29mZnNldDsKKwkJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBfbGVfaWgpKSB7CisJCQlwb3NfaW5faXRlbShwX3Nfc2VhcmNoX3BhdGgpIC89IG5fYmxrX3NpemU7CisJCX0KKwkJcmV0dXJuIFBPU0lUSU9OX0ZPVU5EOworCX0KKworCS8qIE5lZWRlZCBieXRlIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUKKwkgICBwYXRoLiBTZXQgcG9zX2luX2l0ZW0gb3V0IG9mIHRoZSBpdGVtLiAqLworCWlmIChpc19pbmRpcmVjdF9sZV9paChwX2xlX2loKSkKKwkJcG9zX2luX2l0ZW0ocF9zX3NlYXJjaF9wYXRoKSA9CisJCSAgICBpaF9pdGVtX2xlbihwX2xlX2loKSAvIFVORk1fUF9TSVpFOworCWVsc2UKKwkJcG9zX2luX2l0ZW0ocF9zX3NlYXJjaF9wYXRoKSA9IGloX2l0ZW1fbGVuKHBfbGVfaWgpOworCisJcmV0dXJuIFBPU0lUSU9OX05PVF9GT1VORDsKIH0KIAotCiAvKiBDb21wYXJlIGdpdmVuIGl0ZW0gYW5kIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aC4gKi8KLWludCBjb21wX2l0ZW1zIChjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoKQoraW50IGNvbXBfaXRlbXMoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICogaWg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmg7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgICAvKiBMYXN0IGJ1ZmZlciBhdCB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUuICovCi0gICAgaWYgKCAhIEJfSVNfSU5fVFJFRShwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCkpICkKLQlyZXR1cm4gMTsKKwkvKiBMYXN0IGJ1ZmZlciBhdCB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUuICovCisJaWYgKCFCX0lTX0lOX1RSRUUocF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpKSkKKwkJcmV0dXJuIDE7CiAKLSAgICAvKiBMYXN0IHBhdGggcG9zaXRpb24gaXMgaW52YWxpZC4gKi8KLSAgICBpZiAoIFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkgPj0gQl9OUl9JVEVNUyhwX3NfYmgpICkKLQlyZXR1cm4gMTsKKwkvKiBMYXN0IHBhdGggcG9zaXRpb24gaXMgaW52YWxpZC4gKi8KKwlpZiAoUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19wYXRoKSA+PSBCX05SX0lURU1TKHBfc19iaCkpCisJCXJldHVybiAxOwogCi0gICAgLyogd2UgbmVlZCBvbmx5IHRvIGtub3csIHdoZXRoZXIgaXQgaXMgdGhlIHNhbWUgaXRlbSAqLwotICAgIGloID0gZ2V0X2loIChwX3NfcGF0aCk7Ci0gICAgcmV0dXJuIG1lbWNtcCAoc3RvcmVkX2loLCBpaCwgSUhfU0laRSk7CisJLyogd2UgbmVlZCBvbmx5IHRvIGtub3csIHdoZXRoZXIgaXQgaXMgdGhlIHNhbWUgaXRlbSAqLworCWloID0gZ2V0X2loKHBfc19wYXRoKTsKKwlyZXR1cm4gbWVtY21wKHN0b3JlZF9paCwgaWgsIElIX1NJWkUpOwogfQogCi0KIC8qIHVuZm9ybWF0dGVkIG5vZGVzIGFyZSBub3QgbG9nZ2VkIGFueW1vcmUsIGV2ZXIuICBUaGlzIGlzIHNhZmUKICoqIG5vdwogKi8KQEAgLTg3Niw0NjEgKzkxMSw0NjYgQEAKIC8vIGJsb2NrIGNhbiBub3QgYmUgZm9yZ290dGVuIGFzIGl0IGlzIGluIEkvTyBvciBoZWxkIGJ5IHNvbWVvbmUKICNkZWZpbmUgYmxvY2tfaW5fdXNlKGJoKSAoYnVmZmVyX2xvY2tlZChiaCkgfHwgKGhlbGRfYnlfb3RoZXJzKGJoKSkpCiAKLQotCiAvLyBwcmVwYXJlIGZvciBkZWxldGUgb3IgY3V0IG9mIGRpcmVjdCBpdGVtCi1zdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2Zvcl9kaXJlY3RfaXRlbSAoc3RydWN0IHBhdGggKiBwYXRoLAotCQkJCQkgICBzdHJ1Y3QgaXRlbV9oZWFkICogbGVfaWgsCi0JCQkJCSAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLAotCQkJCQkgICBsb2ZmX3QgbmV3X2ZpbGVfbGVuZ3RoLAotCQkJCQkgICBpbnQgKiBjdXRfc2l6ZSkKK3N0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtKHN0cnVjdCBwYXRoICpwYXRoLAorCQkJCQkgIHN0cnVjdCBpdGVtX2hlYWQgKmxlX2loLAorCQkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgbG9mZl90IG5ld19maWxlX2xlbmd0aCwgaW50ICpjdXRfc2l6ZSkKIHsKLSAgICBsb2ZmX3Qgcm91bmRfbGVuOworCWxvZmZfdCByb3VuZF9sZW47CiAKKwlpZiAobmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpKSB7CisJCS8qIGl0ZW0gaGFzIHRvIGJlIGRlbGV0ZWQgKi8KKwkJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwkJcmV0dXJuIE1fREVMRVRFOworCX0KKwkvLyBuZXcgZmlsZSBnZXRzIHRydW5jYXRlZAorCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzYpIHsKKwkJLy8gCisJCXJvdW5kX2xlbiA9IFJPVU5EX1VQKG5ld19maWxlX2xlbmd0aCk7CisJCS8qIHRoaXMgd2FzIG5fbmV3X2ZpbGVfbGVuZ3RoIDwgbGVfaWggLi4uICovCisJCWlmIChyb3VuZF9sZW4gPCBsZV9paF9rX29mZnNldChsZV9paCkpIHsKKwkJCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7CisJCQlyZXR1cm4gTV9ERUxFVEU7CS8qIERlbGV0ZSB0aGlzIGl0ZW0uICovCisJCX0KKwkJLyogQ2FsY3VsYXRlIGZpcnN0IHBvc2l0aW9uIGFuZCBzaXplIGZvciBjdXR0aW5nIGZyb20gaXRlbS4gKi8KKwkJcG9zX2luX2l0ZW0ocGF0aCkgPSByb3VuZF9sZW4gLSAobGVfaWhfa19vZmZzZXQobGVfaWgpIC0gMSk7CisJCSpjdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4obGVfaWgpIC0gcG9zX2luX2l0ZW0ocGF0aCkpOwogCi0gICAgaWYgKCBuZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldCAoaW5vZGUpICkgewotCS8qIGl0ZW0gaGFzIHRvIGJlIGRlbGV0ZWQgKi8KLQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOwotCXJldHVybiBNX0RFTEVURTsKLSAgICB9Ci0JCi0gICAgLy8gbmV3IGZpbGUgZ2V0cyB0cnVuY2F0ZWQKLSAgICBpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNikgewotCS8vIAotCXJvdW5kX2xlbiA9IFJPVU5EX1VQIChuZXdfZmlsZV9sZW5ndGgpOyAKLQkvKiB0aGlzIHdhcyBuX25ld19maWxlX2xlbmd0aCA8IGxlX2loIC4uLiAqLwotCWlmICggcm91bmRfbGVuIDwgbGVfaWhfa19vZmZzZXQgKGxlX2loKSApICB7Ci0JICAgICpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7Ci0JICAgIHJldHVybiBNX0RFTEVURTsgLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KKwkJcmV0dXJuIE1fQ1VUOwkvKiBDdXQgZnJvbSB0aGlzIGl0ZW0uICovCisJfQorCisJLy8gb2xkIGZpbGU6IGl0ZW1zIG1heSBoYXZlIGFueSBsZW5ndGgKKworCWlmIChuZXdfZmlsZV9sZW5ndGggPCBsZV9paF9rX29mZnNldChsZV9paCkpIHsKKwkJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwkJcmV0dXJuIE1fREVMRVRFOwkvKiBEZWxldGUgdGhpcyBpdGVtLiAqLwogCX0KIAkvKiBDYWxjdWxhdGUgZmlyc3QgcG9zaXRpb24gYW5kIHNpemUgZm9yIGN1dHRpbmcgZnJvbSBpdGVtLiAqLwotCXBvc19pbl9pdGVtIChwYXRoKSA9IHJvdW5kX2xlbiAtIChsZV9paF9rX29mZnNldCAobGVfaWgpIC0gMSk7Ci0JKmN1dF9zaXplID0gLShpaF9pdGVtX2xlbihsZV9paCkgLSBwb3NfaW5faXRlbShwYXRoKSk7Ci0JCi0JcmV0dXJuIE1fQ1VUOyAvKiBDdXQgZnJvbSB0aGlzIGl0ZW0uICovCi0gICAgfQotCi0KLSAgICAvLyBvbGQgZmlsZTogaXRlbXMgbWF5IGhhdmUgYW55IGxlbmd0aAotCi0gICAgaWYgKCBuZXdfZmlsZV9sZW5ndGggPCBsZV9paF9rX29mZnNldCAobGVfaWgpICkgIHsKLQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOwotCXJldHVybiBNX0RFTEVURTsgLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KLSAgICB9Ci0gICAgLyogQ2FsY3VsYXRlIGZpcnN0IHBvc2l0aW9uIGFuZCBzaXplIGZvciBjdXR0aW5nIGZyb20gaXRlbS4gKi8KLSAgICAqY3V0X3NpemUgPSAtKGloX2l0ZW1fbGVuKGxlX2loKSAtCi0JCSAgICAgIChwb3NfaW5faXRlbSAocGF0aCkgPSBuZXdfZmlsZV9sZW5ndGggKyAxIC0gbGVfaWhfa19vZmZzZXQgKGxlX2loKSkpOwotICAgIHJldHVybiBNX0NVVDsgLyogQ3V0IGZyb20gdGhpcyBpdGVtLiAqLworCSpjdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4obGVfaWgpIC0KKwkJICAgICAgKHBvc19pbl9pdGVtKHBhdGgpID0KKwkJICAgICAgIG5ld19maWxlX2xlbmd0aCArIDEgLSBsZV9paF9rX29mZnNldChsZV9paCkpKTsKKwlyZXR1cm4gTV9DVVQ7CQkvKiBDdXQgZnJvbSB0aGlzIGl0ZW0uICovCiB9CiAKLQotc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbSAoc3RydWN0IHBhdGggKiBwYXRoLAotCQkJCQkgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBsZV9paCwKLQkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKLQkJCQkJICAgICBsb2ZmX3QgbmV3X2ZpbGVfbGVuZ3RoLAotCQkJCQkgICAgIGludCAqIGN1dF9zaXplKQorc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbShzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKmxlX2loLAorCQkJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIGxvZmZfdCBuZXdfZmlsZV9sZW5ndGgsCisJCQkJCSAgICBpbnQgKmN1dF9zaXplKQogewotICAgIGlmIChsZV9paF9rX29mZnNldCAobGVfaWgpID09IERPVF9PRkZTRVQgJiYgCi0JbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSkgewotCVJGQUxTRSggaWhfZW50cnlfY291bnQgKGxlX2loKSAhPSAyLAotCSAgICAgICAgIlBBUC01MjIwOiBpbmNvcnJlY3QgZW1wdHkgZGlyZWN0b3J5IGl0ZW0gKCVoKSIsIGxlX2loKTsKLQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOwotCXJldHVybiBNX0RFTEVURTsgLyogRGVsZXRlIHRoZSBkaXJlY3RvcnkgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyeS4gKi8KLSAgICB9Ci0gICAgCi0gICAgaWYgKCBpaF9lbnRyeV9jb3VudCAobGVfaWgpID09IDEgKSAgewotCS8qIERlbGV0ZSB0aGUgZGlyZWN0b3J5IGl0ZW0gc3VjaCBhcyB0aGVyZSBpcyBvbmUgcmVjb3JkIG9ubHkKLQkgICBpbiB0aGlzIGl0ZW0qLwotCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7Ci0JcmV0dXJuIE1fREVMRVRFOwotICAgIH0KLSAgICAKLSAgICAvKiBDdXQgb25lIHJlY29yZCBmcm9tIHRoZSBkaXJlY3RvcnkgaXRlbS4gKi8KLSAgICAqY3V0X3NpemUgPSAtKERFSF9TSVpFICsgZW50cnlfbGVuZ3RoIChnZXRfbGFzdF9iaCAocGF0aCksIGxlX2loLCBwb3NfaW5faXRlbSAocGF0aCkpKTsKLSAgICByZXR1cm4gTV9DVVQ7IAotfQorCWlmIChsZV9paF9rX29mZnNldChsZV9paCkgPT0gRE9UX09GRlNFVCAmJgorCSAgICBuZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldChpbm9kZSkpIHsKKwkJUkZBTFNFKGloX2VudHJ5X2NvdW50KGxlX2loKSAhPSAyLAorCQkgICAgICAgIlBBUC01MjIwOiBpbmNvcnJlY3QgZW1wdHkgZGlyZWN0b3J5IGl0ZW0gKCVoKSIsIGxlX2loKTsKKwkJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwkJcmV0dXJuIE1fREVMRVRFOwkvKiBEZWxldGUgdGhlIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJ5LiAqLworCX0KIAorCWlmIChpaF9lbnRyeV9jb3VudChsZV9paCkgPT0gMSkgeworCQkvKiBEZWxldGUgdGhlIGRpcmVjdG9yeSBpdGVtIHN1Y2ggYXMgdGhlcmUgaXMgb25lIHJlY29yZCBvbmx5CisJCSAgIGluIHRoaXMgaXRlbSAqLworCQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOworCQlyZXR1cm4gTV9ERUxFVEU7CisJfQorCisJLyogQ3V0IG9uZSByZWNvcmQgZnJvbSB0aGUgZGlyZWN0b3J5IGl0ZW0uICovCisJKmN1dF9zaXplID0KKwkgICAgLShERUhfU0laRSArCisJICAgICAgZW50cnlfbGVuZ3RoKGdldF9sYXN0X2JoKHBhdGgpLCBsZV9paCwgcG9zX2luX2l0ZW0ocGF0aCkpKTsKKwlyZXR1cm4gTV9DVVQ7Cit9CiAKIC8qICBJZiB0aGUgcGF0aCBwb2ludHMgdG8gYSBkaXJlY3Rvcnkgb3IgZGlyZWN0IGl0ZW0sIGNhbGN1bGF0ZSBtb2RlIGFuZCB0aGUgc2l6ZSBjdXQsIGZvciBiYWxhbmNlLgogICAgIElmIHRoZSBwYXRoIHBvaW50cyB0byBhbiBpbmRpcmVjdCBpdGVtLCByZW1vdmUgc29tZSBudW1iZXIgb2YgaXRzIHVuZm9ybWF0dGVkIG5vZGVzLgogICAgIEluIGNhc2Ugb2YgZmlsZSB0cnVuY2F0ZSBjYWxjdWxhdGUgd2hldGhlciB0aGlzIGl0ZW0gbXVzdCBiZSBkZWxldGVkL3RydW5jYXRlZCBvciBsYXN0CiAgICAgdW5mb3JtYXR0ZWQgbm9kZSBvZiB0aGlzIGl0ZW0gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBkaXJlY3QgaXRlbS4KICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBkZXRlcm1pbmF0aW9uIG9mIHdoYXQgYmFsYW5jZSBtb2RlIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHNob3VsZCBlbXBsb3kuICovCi1zdGF0aWMgY2hhciAgcHJlcGFyZV9mb3JfZGVsZXRlX29yX2N1dCgKLQkJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKLQkJCQkgICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2l0ZW1fa2V5LAotCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICogcF9uX3JlbW92ZWQsICAgICAgLyogTnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIHdoaWNoIHdlcmUgcmVtb3ZlZAotCQkJCQkJCQkJCSAgZnJvbSBlbmQgb2YgdGhlIGZpbGUuICovCi0JCQkJICAgICAgIGludCAgICAgICAgICAgICAgICAgKiBwX25fY3V0X3NpemUsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgICBuX25ld19maWxlX2xlbmd0aCAvKiBNQVhfS0VZX09GRlNFVCBpbiBjYXNlIG9mIGRlbGV0ZS4gKi8KLSAgICApIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiID0gaW5vZGUtPmlfc2I7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAgICAqIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCk7CitzdGF0aWMgY2hhciBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksIGludCAqcF9uX3JlbW92ZWQsCS8qIE51bWJlciBvZiB1bmZvcm1hdHRlZCBub2RlcyB3aGljaCB3ZXJlIHJlbW92ZWQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBmcm9tIGVuZCBvZiB0aGUgZmlsZS4gKi8KKwkJCQkgICAgICBpbnQgKnBfbl9jdXRfc2l6ZSwgdW5zaWduZWQgbG9uZyBsb25nIG5fbmV3X2ZpbGVfbGVuZ3RoCS8qIE1BWF9LRVlfT0ZGU0VUIGluIGNhc2Ugb2YgZGVsZXRlLiAqLworICAgICkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgLyogU3RhdF9kYXRhIGl0ZW0uICovCi0gICAgaWYgKCBpc19zdGF0ZGF0YV9sZV9paCAocF9sZV9paCkgKSB7CisJLyogU3RhdF9kYXRhIGl0ZW0uICovCisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKHBfbGVfaWgpKSB7CiAKLQlSRkFMU0UoIG5fbmV3X2ZpbGVfbGVuZ3RoICE9IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSwKLQkJIlBBUC01MjEwOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUiKTsKKwkJUkZBTFNFKG5fbmV3X2ZpbGVfbGVuZ3RoICE9IG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpLAorCQkgICAgICAgIlBBUC01MjEwOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUiKTsKIAotCSpwX25fY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihwX2xlX2loKSk7Ci0JcmV0dXJuIE1fREVMRVRFOwotICAgIH0KKwkJKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfbGVfaWgpKTsKKwkJcmV0dXJuIE1fREVMRVRFOworCX0KIAorCS8qIERpcmVjdG9yeSBpdGVtLiAqLworCWlmIChpc19kaXJlbnRyeV9sZV9paChwX2xlX2loKSkKKwkJcmV0dXJuIHByZXBhcmVfZm9yX2RpcmVudHJ5X2l0ZW0ocF9zX3BhdGgsIHBfbGVfaWgsIGlub2RlLAorCQkJCQkJIG5fbmV3X2ZpbGVfbGVuZ3RoLAorCQkJCQkJIHBfbl9jdXRfc2l6ZSk7CiAKLSAgICAvKiBEaXJlY3RvcnkgaXRlbS4gKi8KLSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChwX2xlX2loKSApCi0JcmV0dXJuIHByZXBhcmVfZm9yX2RpcmVudHJ5X2l0ZW0gKHBfc19wYXRoLCBwX2xlX2loLCBpbm9kZSwgbl9uZXdfZmlsZV9sZW5ndGgsIHBfbl9jdXRfc2l6ZSk7CisJLyogRGlyZWN0IGl0ZW0uICovCisJaWYgKGlzX2RpcmVjdF9sZV9paChwX2xlX2loKSkKKwkJcmV0dXJuIHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtKHBfc19wYXRoLCBwX2xlX2loLCBpbm9kZSwKKwkJCQkJICAgICAgIG5fbmV3X2ZpbGVfbGVuZ3RoLCBwX25fY3V0X3NpemUpOwogCi0gICAgLyogRGlyZWN0IGl0ZW0uICovCi0gICAgaWYgKCBpc19kaXJlY3RfbGVfaWggKHBfbGVfaWgpICkKLQlyZXR1cm4gcHJlcGFyZV9mb3JfZGlyZWN0X2l0ZW0gKHBfc19wYXRoLCBwX2xlX2loLCBpbm9kZSwgbl9uZXdfZmlsZV9sZW5ndGgsIHBfbl9jdXRfc2l6ZSk7CisJLyogQ2FzZSBvZiBhbiBpbmRpcmVjdCBpdGVtLiAqLworCXsKKwkJaW50IG5fdW5mbV9udW1iZXIsCS8qIE51bWJlciBvZiB0aGUgaXRlbSB1bmZvcm1hdHRlZCBub2Rlcy4gKi8KKwkJIG5fY291bnRlciwgbl9ibGtfc2l6ZTsKKwkJX19sZTMyICpwX25fdW5mbV9wb2ludGVyOwkvKiBQb2ludGVyIHRvIHRoZSB1bmZvcm1hdHRlZCBub2RlIG51bWJlci4gKi8KKwkJX191MzIgdG1wOworCQlzdHJ1Y3QgaXRlbV9oZWFkIHNfaWg7CS8qIEl0ZW0gaGVhZGVyLiAqLworCQljaGFyIGNfbW9kZTsJLyogUmV0dXJuZWQgbW9kZSBvZiB0aGUgYmFsYW5jZS4gKi8KKwkJaW50IG5lZWRfcmVzZWFyY2g7CiAKKwkJbl9ibGtfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7CiAKLSAgICAvKiBDYXNlIG9mIGFuIGluZGlyZWN0IGl0ZW0uICovCi0gICAgewotCWludCAgICAgICAgICAgICAgICAgICBuX3VuZm1fbnVtYmVyLCAgICAvKiBOdW1iZXIgb2YgdGhlIGl0ZW0gdW5mb3JtYXR0ZWQgbm9kZXMuICovCi0JICAgIG5fY291bnRlciwKLQkgICAgbl9ibGtfc2l6ZTsKLQlfX2xlMzIgICAgICAgICAgICAgICAqIHBfbl91bmZtX3BvaW50ZXI7IC8qIFBvaW50ZXIgdG8gdGhlIHVuZm9ybWF0dGVkIG5vZGUgbnVtYmVyLiAqLwotCV9fdTMyIHRtcDsKLQlzdHJ1Y3QgaXRlbV9oZWFkICAgICAgc19paDsgICAgICAgICAgIC8qIEl0ZW0gaGVhZGVyLiAqLwotCWNoYXIgICAgICAgICAgICAgICAgICBjX21vZGU7ICAgICAgICAgICAvKiBSZXR1cm5lZCBtb2RlIG9mIHRoZSBiYWxhbmNlLiAqLwotCWludCBuZWVkX3Jlc2VhcmNoOworCQkvKiBTZWFyY2ggZm9yIHRoZSBuZWVkZWQgb2JqZWN0IGluZGlyZWN0IGl0ZW0gdW50aWwgdGhlcmUgYXJlIG5vIHVuZm9ybWF0dGVkIG5vZGVzIHRvIGJlIHJlbW92ZWQuICovCisJCWRvIHsKKwkJCW5lZWRfcmVzZWFyY2ggPSAwOworCQkJcF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpOworCQkJLyogQ29weSBpbmRpcmVjdCBpdGVtIGhlYWRlciB0byBhIHRlbXAgdmFyaWFibGUuICovCisJCQljb3B5X2l0ZW1faGVhZCgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7CisJCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoaXMgaXRlbS4gKi8KKwkJCW5fdW5mbV9udW1iZXIgPSBJX1VORk1fTlVNKCZzX2loKTsKIAorCQkJUkZBTFNFKCFpc19pbmRpcmVjdF9sZV9paCgmc19paCkgfHwgIW5fdW5mbV9udW1iZXIgfHwKKwkJCSAgICAgICBwb3NfaW5faXRlbShwX3NfcGF0aCkgKyAxICE9IG5fdW5mbV9udW1iZXIsCisJCQkgICAgICAgIlBBUC01MjQwOiBpbnZhbGlkIGl0ZW0gJWggIgorCQkJICAgICAgICJuX3VuZm1fbnVtYmVyID0gJWQgKnBfbl9wb3NfaW5faXRlbSA9ICVkIiwKKwkJCSAgICAgICAmc19paCwgbl91bmZtX251bWJlciwgcG9zX2luX2l0ZW0ocF9zX3BhdGgpKTsKIAotCW5fYmxrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworCQkJLyogQ2FsY3VsYXRlIGJhbGFuY2UgbW9kZSBhbmQgcG9zaXRpb24gaW4gdGhlIGl0ZW0gdG8gcmVtb3ZlIHVuZm9ybWF0dGVkIG5vZGVzLiAqLworCQkJaWYgKG5fbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpKSB7CS8qIENhc2Ugb2YgZGVsZXRlLiAqLworCQkJCXBvc19pbl9pdGVtKHBfc19wYXRoKSA9IDA7CisJCQkJKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKCZzX2loKSk7CisJCQkJY19tb2RlID0gTV9ERUxFVEU7CisJCQl9IGVsc2UgewkvKiBDYXNlIG9mIHRydW5jYXRlLiAqLworCQkJCWlmIChuX25ld19maWxlX2xlbmd0aCA8IGxlX2loX2tfb2Zmc2V0KCZzX2loKSkgeworCQkJCQlwb3NfaW5faXRlbShwX3NfcGF0aCkgPSAwOworCQkJCQkqcF9uX2N1dF9zaXplID0KKwkJCQkJICAgIC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKCZzX2loKSk7CisJCQkJCWNfbW9kZSA9IE1fREVMRVRFOwkvKiBEZWxldGUgdGhpcyBpdGVtLiAqLworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGluZGlyZWN0IGl0ZW0gbXVzdCBiZSB0cnVuY2F0ZWQgc3RhcnRpbmcgZnJvbSAqcF9uX3Bvc19pbl9pdGVtLXRoIHBvc2l0aW9uICovCisJCQkJCXBvc19pbl9pdGVtKHBfc19wYXRoKSA9CisJCQkJCSAgICAobl9uZXdfZmlsZV9sZW5ndGggKyBuX2Jsa19zaXplIC0KKwkJCQkJICAgICBsZV9paF9rX29mZnNldCgmc19paCkpID4+IHBfc19zYi0+CisJCQkJCSAgICBzX2Jsb2Nrc2l6ZV9iaXRzOwogCi0JLyogU2VhcmNoIGZvciB0aGUgbmVlZGVkIG9iamVjdCBpbmRpcmVjdCBpdGVtIHVudGlsIHRoZXJlIGFyZSBubyB1bmZvcm1hdHRlZCBub2RlcyB0byBiZSByZW1vdmVkLiAqLwotCWRvICB7Ci0JICAgIG5lZWRfcmVzZWFyY2ggPSAwOwotICAgICAgICAgICAgcF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpOwotCSAgICAvKiBDb3B5IGluZGlyZWN0IGl0ZW0gaGVhZGVyIHRvIGEgdGVtcCB2YXJpYWJsZS4gKi8KLQkgICAgY29weV9pdGVtX2hlYWQoJnNfaWgsIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkpOwotCSAgICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoaXMgaXRlbS4gKi8KLQkgICAgbl91bmZtX251bWJlciA9IElfVU5GTV9OVU0oJnNfaWgpOworCQkJCQlSRkFMU0UocG9zX2luX2l0ZW0ocF9zX3BhdGgpID4KKwkJCQkJICAgICAgIG5fdW5mbV9udW1iZXIsCisJCQkJCSAgICAgICAiUEFQLTUyNTA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGl0ZW0iKTsKIAotCSAgICBSRkFMU0UoICEgaXNfaW5kaXJlY3RfbGVfaWgoJnNfaWgpIHx8ICEgbl91bmZtX251bWJlciB8fAotCQkgICAgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSArIDEgIT0gIG5fdW5mbV9udW1iZXIsCi0JCSAgICAiUEFQLTUyNDA6IGludmFsaWQgaXRlbSAlaCAiCi0JCSAgICAibl91bmZtX251bWJlciA9ICVkICpwX25fcG9zX2luX2l0ZW0gPSAlZCIsIAotCQkgICAgJnNfaWgsIG5fdW5mbV9udW1iZXIsIHBvc19pbl9pdGVtIChwX3NfcGF0aCkpOworCQkJCQkvKiBFaXRoZXIgY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgb2YgaW5kaXJlY3QgaXRlbSB0byBkaXJlY3QgaXRlbSBvciBpbmNyZWFzZQorCQkJCQkgICBpdHMgZnJlZSBzcGFjZS4gICovCisJCQkJCWlmIChwb3NfaW5faXRlbShwX3NfcGF0aCkgPT0KKwkJCQkJICAgIG5fdW5mbV9udW1iZXIpIHsKKwkJCQkJCSpwX25fY3V0X3NpemUgPSAwOwkvKiBOb3RoaW5nIHRvIGN1dC4gKi8KKwkJCQkJCXJldHVybiBNX0NPTlZFUlQ7CS8qIE1heWJlIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHRvIHRoZSBkaXJlY3QgaXRlbS4gKi8KKwkJCQkJfQorCQkJCQkvKiBDYWxjdWxhdGUgc2l6ZSB0byBjdXQuICovCisJCQkJCSpwX25fY3V0X3NpemUgPQorCQkJCQkgICAgLShpaF9pdGVtX2xlbigmc19paCkgLQorCQkJCQkgICAgICBwb3NfaW5faXRlbShwX3NfcGF0aCkgKgorCQkJCQkgICAgICBVTkZNX1BfU0laRSk7CiAKLQkgICAgLyogQ2FsY3VsYXRlIGJhbGFuY2UgbW9kZSBhbmQgcG9zaXRpb24gaW4gdGhlIGl0ZW0gdG8gcmVtb3ZlIHVuZm9ybWF0dGVkIG5vZGVzLiAqLwotCSAgICBpZiAoIG5fbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSApIHsvKiBDYXNlIG9mIGRlbGV0ZS4gKi8KLQkJcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9IDA7Ci0JCSpwX25fY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbigmc19paCkpOwotCQljX21vZGUgPSBNX0RFTEVURTsKLQkgICAgfQotCSAgICBlbHNlICB7IC8qIENhc2Ugb2YgdHJ1bmNhdGUuICovCi0JCWlmICggbl9uZXdfZmlsZV9sZW5ndGggPCBsZV9paF9rX29mZnNldCAoJnNfaWgpICkgIHsKLQkJICAgIHBvc19pbl9pdGVtIChwX3NfcGF0aCkgPSAwOwotCQkgICAgKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKCZzX2loKSk7Ci0JCSAgICBjX21vZGUgPSBNX0RFTEVURTsgLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KLQkJfQotCQllbHNlICB7Ci0JCSAgICAvKiBpbmRpcmVjdCBpdGVtIG11c3QgYmUgdHJ1bmNhdGVkIHN0YXJ0aW5nIGZyb20gKnBfbl9wb3NfaW5faXRlbS10aCBwb3NpdGlvbiAqLwotCQkgICAgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9IChuX25ld19maWxlX2xlbmd0aCArIG5fYmxrX3NpemUgLSBsZV9paF9rX29mZnNldCAoJnNfaWgpICkgPj4gcF9zX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQkJCQljX21vZGUgPSBNX0NVVDsJLyogQ3V0IGZyb20gdGhpcyBpbmRpcmVjdCBpdGVtLiAqLworCQkJCX0KKwkJCX0KIAotCQkgICAgUkZBTFNFKCBwb3NfaW5faXRlbSAocF9zX3BhdGgpID4gbl91bmZtX251bWJlciwKLQkJCSAgICAiUEFQLTUyNTA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGl0ZW0iKTsKKwkJCVJGQUxTRShuX3VuZm1fbnVtYmVyIDw9IHBvc19pbl9pdGVtKHBfc19wYXRoKSwKKwkJCSAgICAgICAiUEFQLTUyNjA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGluZGlyZWN0IGl0ZW0iKTsKIAotCQkgICAgLyogRWl0aGVyIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIGluZGlyZWN0IGl0ZW0gdG8gZGlyZWN0IGl0ZW0gb3IgaW5jcmVhc2UKLQkJICAgICAgIGl0cyBmcmVlIHNwYWNlLiAgKi8KLQkJICAgIGlmICggcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9PSBuX3VuZm1fbnVtYmVyICkgIHsKLQkJCSpwX25fY3V0X3NpemUgPSAwOyAvKiBOb3RoaW5nIHRvIGN1dC4gKi8KLQkJCXJldHVybiBNX0NPTlZFUlQ7IC8qIE1heWJlIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHRvIHRoZSBkaXJlY3QgaXRlbS4gKi8KLQkJICAgIH0KLQkJICAgIC8qIENhbGN1bGF0ZSBzaXplIHRvIGN1dC4gKi8KLQkJICAgICpwX25fY3V0X3NpemUgPSAtKGloX2l0ZW1fbGVuKCZzX2loKSAtIHBvc19pbl9pdGVtKHBfc19wYXRoKSAqIFVORk1fUF9TSVpFKTsKKwkJCS8qIHBvaW50ZXJzIHRvIGJlIGN1dCAqLworCQkJbl91bmZtX251bWJlciAtPSBwb3NfaW5faXRlbShwX3NfcGF0aCk7CisJCQkvKiBTZXQgcG9pbnRlciB0byB0aGUgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgdGhhdCBpcyB0byBiZSBjdXQuICovCisJCQlwX25fdW5mbV9wb2ludGVyID0KKwkJCSAgICAoX19sZTMyICopIEJfSV9QSVRFTShwX3NfYmgsCisJCQkJCQkgJnNfaWgpICsgSV9VTkZNX05VTSgmc19paCkgLQorCQkJICAgIDEgLSAqcF9uX3JlbW92ZWQ7CiAKLQkJICAgIGNfbW9kZSA9IE1fQ1VUOyAgICAgLyogQ3V0IGZyb20gdGhpcyBpbmRpcmVjdCBpdGVtLiAqLwotCQl9Ci0JICAgIH0KKwkJCS8qIFdlIGdvIHRocm91Z2ggdGhlIHVuZm9ybWF0dGVkIG5vZGVzIHBvaW50ZXJzIG9mIHRoZSBpbmRpcmVjdAorCQkJICAgaXRlbSBhbmQgbG9vayBmb3IgdGhlIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoZSBjYWNoZS4gSWYgd2UKKwkJCSAgIGZvdW5kIHNvbWUgb2YgdGhlbSB3ZSBmcmVlIGl0LCB6ZXJvIGNvcnJlc3BvbmRpbmcgaW5kaXJlY3QgaXRlbQorCQkJICAgZW50cnkgYW5kIGxvZyBidWZmZXIgY29udGFpbmluZyB0aGF0IGluZGlyZWN0IGl0ZW0uIEZvciB0aGlzIHdlCisJCQkgICBuZWVkIHRvIHByZXBhcmUgbGFzdCBwYXRoIGVsZW1lbnQgZm9yIGxvZ2dpbmcuIElmIHNvbWUKKwkJCSAgIHVuZm9ybWF0dGVkIG5vZGUgaGFzIGJfY291bnQgPiAxIHdlIG11c3Qgbm90IGZyZWUgdGhpcworCQkJICAgdW5mb3JtYXR0ZWQgbm9kZSBzaW5jZSBpdCBpcyBpbiB1c2UuICovCisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgcF9zX2JoLCAxKTsKKwkJCS8vIG5vdGU6IHBhdGggY291bGQgYmUgY2hhbmdlZCwgZmlyc3QgbGluZSBpbiBmb3IgbG9vcCB0YWtlcyBjYXJlCisJCQkvLyBvZiBpdAogCi0JICAgIFJGQUxTRSggbl91bmZtX251bWJlciA8PSBwb3NfaW5faXRlbSAocF9zX3BhdGgpLAotCQkgICAgIlBBUC01MjYwOiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBpbmRpcmVjdCBpdGVtIik7CisJCQlmb3IgKG5fY291bnRlciA9ICpwX25fcmVtb3ZlZDsKKwkJCSAgICAgbl9jb3VudGVyIDwgbl91bmZtX251bWJlcjsKKwkJCSAgICAgbl9jb3VudGVyKyssIHBfbl91bmZtX3BvaW50ZXItLSkgewogCi0JICAgIC8qIHBvaW50ZXJzIHRvIGJlIGN1dCAqLwotCSAgICBuX3VuZm1fbnVtYmVyIC09IHBvc19pbl9pdGVtIChwX3NfcGF0aCk7Ci0JICAgIC8qIFNldCBwb2ludGVyIHRvIHRoZSBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciB0aGF0IGlzIHRvIGJlIGN1dC4gKi8KLQkgICAgcF9uX3VuZm1fcG9pbnRlciA9IChfX2xlMzIgKilCX0lfUElURU0ocF9zX2JoLCAmc19paCkgKyBJX1VORk1fTlVNKCZzX2loKSAtIDEgLSAqcF9uX3JlbW92ZWQ7CisJCQkJY29uZF9yZXNjaGVkKCk7CisJCQkJaWYgKGl0ZW1fbW92ZWQoJnNfaWgsIHBfc19wYXRoKSkgeworCQkJCQluZWVkX3Jlc2VhcmNoID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCVJGQUxTRShwX25fdW5mbV9wb2ludGVyIDwKKwkJCQkgICAgICAgKF9fbGUzMiAqKSBCX0lfUElURU0ocF9zX2JoLCAmc19paCkKKwkJCQkgICAgICAgfHwgcF9uX3VuZm1fcG9pbnRlciA+CisJCQkJICAgICAgIChfX2xlMzIgKikgQl9JX1BJVEVNKHBfc19iaCwKKwkJCQkJCQkgICAgJnNfaWgpICsKKwkJCQkgICAgICAgSV9VTkZNX05VTSgmc19paCkgLSAxLAorCQkJCSAgICAgICAidnMtNTI2NTogcG9pbnRlciBvdXQgb2YgcmFuZ2UiKTsKIAorCQkJCS8qIEhvbGUsIG5vdGhpbmcgdG8gcmVtb3ZlLiAqLworCQkJCWlmICghZ2V0X2Jsb2NrX251bShwX25fdW5mbV9wb2ludGVyLCAwKSkgeworCQkJCQkoKnBfbl9yZW1vdmVkKSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CiAKLQkgICAgLyogV2UgZ28gdGhyb3VnaCB0aGUgdW5mb3JtYXR0ZWQgbm9kZXMgcG9pbnRlcnMgb2YgdGhlIGluZGlyZWN0Ci0JICAgICAgIGl0ZW0gYW5kIGxvb2sgZm9yIHRoZSB1bmZvcm1hdHRlZCBub2RlcyBpbiB0aGUgY2FjaGUuIElmIHdlCi0JICAgICAgIGZvdW5kIHNvbWUgb2YgdGhlbSB3ZSBmcmVlIGl0LCB6ZXJvIGNvcnJlc3BvbmRpbmcgaW5kaXJlY3QgaXRlbQotCSAgICAgICBlbnRyeSBhbmQgbG9nIGJ1ZmZlciBjb250YWluaW5nIHRoYXQgaW5kaXJlY3QgaXRlbS4gRm9yIHRoaXMgd2UKLQkgICAgICAgbmVlZCB0byBwcmVwYXJlIGxhc3QgcGF0aCBlbGVtZW50IGZvciBsb2dnaW5nLiBJZiBzb21lCi0JICAgICAgIHVuZm9ybWF0dGVkIG5vZGUgaGFzIGJfY291bnQgPiAxIHdlIG11c3Qgbm90IGZyZWUgdGhpcwotCSAgICAgICB1bmZvcm1hdHRlZCBub2RlIHNpbmNlIGl0IGlzIGluIHVzZS4gKi8KLQkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsIHBfc19iaCwgMSk7Ci0JICAgIC8vIG5vdGU6IHBhdGggY291bGQgYmUgY2hhbmdlZCwgZmlyc3QgbGluZSBpbiBmb3IgbG9vcCB0YWtlcyBjYXJlCi0JICAgIC8vIG9mIGl0CisJCQkJKCpwX25fcmVtb3ZlZCkrKzsKIAotCSAgICBmb3IgKG5fY291bnRlciA9ICpwX25fcmVtb3ZlZDsKLQkJIG5fY291bnRlciA8IG5fdW5mbV9udW1iZXI7IG5fY291bnRlcisrLCBwX25fdW5mbV9wb2ludGVyLS0gKSB7CisJCQkJdG1wID0gZ2V0X2Jsb2NrX251bShwX25fdW5mbV9wb2ludGVyLCAwKTsKKwkJCQlwdXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsIDAsIDApOworCQkJCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcF9zX3NiLCBwX3NfYmgpOworCQkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCB0bXAsIDEpOworCQkJCWlmIChpdGVtX21vdmVkKCZzX2loLCBwX3NfcGF0aCkpIHsKKwkJCQkJbmVlZF9yZXNlYXJjaCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KIAotCQljb25kX3Jlc2NoZWQoKTsKLQkJaWYgKGl0ZW1fbW92ZWQgKCZzX2loLCBwX3NfcGF0aCkpIHsKLQkJICAgIG5lZWRfcmVzZWFyY2ggPSAxIDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCVJGQUxTRSggcF9uX3VuZm1fcG9pbnRlciA8IChfX2xlMzIgKilCX0lfUElURU0ocF9zX2JoLCAmc19paCkgfHwKLQkJCXBfbl91bmZtX3BvaW50ZXIgPiAoX19sZTMyICopQl9JX1BJVEVNKHBfc19iaCwgJnNfaWgpICsgSV9VTkZNX05VTSgmc19paCkgLSAxLAotCQkJInZzLTUyNjU6IHBvaW50ZXIgb3V0IG9mIHJhbmdlIik7CisJCQkvKiBhIHRyaWNrLiAgSWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBsb2dnZWQsIHRoaXMKKwkJCSAqKiB3aWxsIGRvIG5vdGhpbmcuICBJZiB3ZSd2ZSBicm9rZW4gdGhlIGxvb3Agd2l0aG91dAorCQkJICoqIGxvZ2dpbmcgaXQsIGl0IHdpbGwgcmVzdG9yZSB0aGUgYnVmZmVyCisJCQkgKioKKwkJCSAqLworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3NiLCBwX3NfYmgpOwogCi0JCS8qIEhvbGUsIG5vdGhpbmcgdG8gcmVtb3ZlLiAqLwotCQlpZiAoICEgZ2V0X2Jsb2NrX251bShwX25fdW5mbV9wb2ludGVyLDApICkgIHsKLQkJCSgqcF9uX3JlbW92ZWQpKys7Ci0JCQljb250aW51ZTsKLQkJfQorCQkJLyogVGhpcyBsb29wIGNhbiBiZSBvcHRpbWl6ZWQuICovCisJCX0gd2hpbGUgKCgqcF9uX3JlbW92ZWQgPCBuX3VuZm1fbnVtYmVyIHx8IG5lZWRfcmVzZWFyY2gpICYmCisJCQkgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX3NiLCBwX3NfaXRlbV9rZXksCisJCQkJCQkgICAgcF9zX3BhdGgpID09CisJCQkgUE9TSVRJT05fRk9VTkQpOwogCi0JCSgqcF9uX3JlbW92ZWQpKys7CisJCVJGQUxTRSgqcF9uX3JlbW92ZWQgPCBuX3VuZm1fbnVtYmVyLAorCQkgICAgICAgIlBBUC01MzEwOiBpbmRpcmVjdCBpdGVtIGlzIG5vdCBmb3VuZCIpOworCQlSRkFMU0UoaXRlbV9tb3ZlZCgmc19paCwgcF9zX3BhdGgpLAorCQkgICAgICAgImFmdGVyIHdoaWxlLCBjb21wIGZhaWxlZCwgcmV0cnkiKTsKIAotCQl0bXAgPSBnZXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsMCk7Ci0JCXB1dF9ibG9ja19udW0ocF9uX3VuZm1fcG9pbnRlciwgMCwgMCk7Ci0JCWpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHBfc19zYiwgcF9zX2JoKTsKLQkJcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIHRtcCwgMSk7Ci0JCWlmICggaXRlbV9tb3ZlZCAoJnNfaWgsIHBfc19wYXRoKSApICB7Ci0JCQluZWVkX3Jlc2VhcmNoID0gMTsKLQkJCWJyZWFrIDsKLQkJfQotCSAgICB9Ci0KLQkgICAgLyogYSB0cmljay4gIElmIHRoZSBidWZmZXIgaGFzIGJlZW4gbG9nZ2VkLCB0aGlzCi0JICAgICoqIHdpbGwgZG8gbm90aGluZy4gIElmIHdlJ3ZlIGJyb2tlbiB0aGUgbG9vcCB3aXRob3V0Ci0JICAgICoqIGxvZ2dpbmcgaXQsIGl0IHdpbGwgcmVzdG9yZSB0aGUgYnVmZmVyCi0JICAgICoqCi0JICAgICovCi0JICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc19zYiwgcF9zX2JoKTsKLQotCSAgICAvKiBUaGlzIGxvb3AgY2FuIGJlIG9wdGltaXplZC4gKi8KLQl9IHdoaWxlICggKCpwX25fcmVtb3ZlZCA8IG5fdW5mbV9udW1iZXIgfHwgbmVlZF9yZXNlYXJjaCkgJiYKLQkJICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpID09IFBPU0lUSU9OX0ZPVU5EICk7Ci0KLQlSRkFMU0UoICpwX25fcmVtb3ZlZCA8IG5fdW5mbV9udW1iZXIsIAotCQkiUEFQLTUzMTA6IGluZGlyZWN0IGl0ZW0gaXMgbm90IGZvdW5kIik7Ci0JUkZBTFNFKCBpdGVtX21vdmVkICgmc19paCwgcF9zX3BhdGgpLCAKLQkJImFmdGVyIHdoaWxlLCBjb21wIGZhaWxlZCwgcmV0cnkiKSA7Ci0KLQlpZiAoY19tb2RlID09IE1fQ1VUKQotCSAgICBwb3NfaW5faXRlbSAocF9zX3BhdGgpICo9IFVORk1fUF9TSVpFOwotCXJldHVybiBjX21vZGU7Ci0gICAgfQorCQlpZiAoY19tb2RlID09IE1fQ1VUKQorCQkJcG9zX2luX2l0ZW0ocF9zX3BhdGgpICo9IFVORk1fUF9TSVpFOworCQlyZXR1cm4gY19tb2RlOworCX0KIH0KIAogLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIGRlbGV0ZWQgb3IgY3V0IGR1cmluZyBiYWxhbmNlICovCi1zdGF0aWMgaW50IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoCi0gICAgc3RydWN0ICB0cmVlX2JhbGFuY2UgICogcF9zX3RiLAotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGNfbW9kZQotICAgICkgewotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG5fZGVsX3NpemU7Ci0gICAgc3RydWN0ICBpdGVtX2hlYWQgICAgICogcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwX3NfdGItPnRiX3BhdGgpOwotCi0gICAgaWYgKCBpc19zdGF0ZGF0YV9sZV9paCAocF9sZV9paCkgKQotCXJldHVybiAwOwotCi0gICAgbl9kZWxfc2l6ZSA9ICggY19tb2RlID09IE1fREVMRVRFICkgPyBpaF9pdGVtX2xlbihwX2xlX2loKSA6IC1wX3NfdGItPmluc2VydF9zaXplWzBdOwotICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKHBfbGVfaWgpICkgewotCS8vIHJldHVybiBFTVBUWV9ESVJfU0laRTsgLyogV2UgZGVsZXRlIGVtdHkgZGlyZWN0b3JpcyBvbmx5LiAqLwotCS8vIHdlIGNhbid0IHVzZSBFTVBUWV9ESVJfU0laRSwgYXMgb2xkIGZvcm1hdCBkaXJzIGhhdmUgYSBkaWZmZXJlbnQKLQkvLyBlbXB0eSBzaXplLiAgaWNrLiBGSVhNRSwgaXMgdGhpcyByaWdodD8KLQkvLwotCXJldHVybiBuX2RlbF9zaXplIDsKLSAgICB9Ci0KLSAgICBpZiAoIGlzX2luZGlyZWN0X2xlX2loIChwX2xlX2loKSApCi0Jbl9kZWxfc2l6ZSA9IChuX2RlbF9zaXplL1VORk1fUF9TSVpFKSoKLQkgIChQQVRIX1BMQVNUX0JVRkZFUihwX3NfdGItPnRiX3BhdGgpLT5iX3NpemUpOy8vIC0gZ2V0X2loX2ZyZWVfc3BhY2UgKHBfbGVfaWgpOwotICAgIHJldHVybiBuX2RlbF9zaXplOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X3RiX3N0cnVjdCgKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLAotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IsCi0gICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoLAotICAgIGludCAgICAgICAgICAgICAgICAgICBuX3NpemUKLSAgICApIHsKLQotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLQotICAgIG1lbXNldCAocF9zX3RiLCdcMCcsc2l6ZW9mKHN0cnVjdCB0cmVlX2JhbGFuY2UpKTsKLSAgICBwX3NfdGItPnRyYW5zYWN0aW9uX2hhbmRsZSA9IHRoIDsKLSAgICBwX3NfdGItPnRiX3NiID0gcF9zX3NiOwotICAgIHBfc190Yi0+dGJfcGF0aCA9IHBfc19wYXRoOwotICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSBOVUxMOwotICAgIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpID0gMDsKLSAgICBwX3NfdGItPmluc2VydF9zaXplWzBdID0gbl9zaXplOwotfQotCi0KLQotdm9pZCBwYWRkX2l0ZW0gKGNoYXIgKiBpdGVtLCBpbnQgdG90YWxfbGVuZ3RoLCBpbnQgbGVuZ3RoKQorc3RhdGljIGludCBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgY2hhciBjX21vZGUpCiB7Ci0gICAgaW50IGk7CisJaW50IG5fZGVsX3NpemU7CisJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwX3NfdGItPnRiX3BhdGgpOwogCi0gICAgZm9yIChpID0gdG90YWxfbGVuZ3RoOyBpID4gbGVuZ3RoOyApCi0JaXRlbSBbLS1pXSA9IDA7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKHBfbGVfaWgpKQorCQlyZXR1cm4gMDsKKworCW5fZGVsX3NpemUgPQorCSAgICAoY19tb2RlID09CisJICAgICBNX0RFTEVURSkgPyBpaF9pdGVtX2xlbihwX2xlX2loKSA6IC1wX3NfdGItPmluc2VydF9zaXplWzBdOworCWlmIChpc19kaXJlbnRyeV9sZV9paChwX2xlX2loKSkgeworCQkvLyByZXR1cm4gRU1QVFlfRElSX1NJWkU7IC8qIFdlIGRlbGV0ZSBlbXR5IGRpcmVjdG9yaXMgb25seS4gKi8KKwkJLy8gd2UgY2FuJ3QgdXNlIEVNUFRZX0RJUl9TSVpFLCBhcyBvbGQgZm9ybWF0IGRpcnMgaGF2ZSBhIGRpZmZlcmVudAorCQkvLyBlbXB0eSBzaXplLiAgaWNrLiBGSVhNRSwgaXMgdGhpcyByaWdodD8KKwkJLy8KKwkJcmV0dXJuIG5fZGVsX3NpemU7CisJfQorCisJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBfbGVfaWgpKQorCQluX2RlbF9zaXplID0gKG5fZGVsX3NpemUgLyBVTkZNX1BfU0laRSkgKiAoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3RiLT50Yl9wYXRoKS0+Yl9zaXplKTsJLy8gLSBnZXRfaWhfZnJlZV9zcGFjZSAocF9sZV9paCk7CisJcmV0dXJuIG5fZGVsX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfdGJfc3RydWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLAorCQkJICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkgICBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsIGludCBuX3NpemUpCit7CisKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKworCW1lbXNldChwX3NfdGIsICdcMCcsIHNpemVvZihzdHJ1Y3QgdHJlZV9iYWxhbmNlKSk7CisJcF9zX3RiLT50cmFuc2FjdGlvbl9oYW5kbGUgPSB0aDsKKwlwX3NfdGItPnRiX3NiID0gcF9zX3NiOworCXBfc190Yi0+dGJfcGF0aCA9IHBfc19wYXRoOworCVBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSBOVUxMOworCVBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpID0gMDsKKwlwX3NfdGItPmluc2VydF9zaXplWzBdID0gbl9zaXplOworfQorCit2b2lkIHBhZGRfaXRlbShjaGFyICppdGVtLCBpbnQgdG90YWxfbGVuZ3RoLCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCisJZm9yIChpID0gdG90YWxfbGVuZ3RoOyBpID4gbGVuZ3RoOykKKwkJaXRlbVstLWldID0gMDsKIH0KIAogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCiBjaGFyIGtleTJ0eXBlKHN0cnVjdCByZWlzZXJmc19rZXkgKmloKQogewotICBpZiAoaXNfZGlyZW50cnlfbGVfa2V5KDIsIGloKSkKLSAgICByZXR1cm4gJ2QnOwotICBpZiAoaXNfZGlyZWN0X2xlX2tleSgyLCBpaCkpCi0gICAgcmV0dXJuICdEJzsKLSAgaWYgKGlzX2luZGlyZWN0X2xlX2tleSgyLCBpaCkpCi0gICAgcmV0dXJuICdpJzsKLSAgaWYgKGlzX3N0YXRkYXRhX2xlX2tleSgyLCBpaCkpCi0gICAgcmV0dXJuICdzJzsKLSAgcmV0dXJuICd1JzsKKwlpZiAoaXNfZGlyZW50cnlfbGVfa2V5KDIsIGloKSkKKwkJcmV0dXJuICdkJzsKKwlpZiAoaXNfZGlyZWN0X2xlX2tleSgyLCBpaCkpCisJCXJldHVybiAnRCc7CisJaWYgKGlzX2luZGlyZWN0X2xlX2tleSgyLCBpaCkpCisJCXJldHVybiAnaSc7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2tleSgyLCBpaCkpCisJCXJldHVybiAncyc7CisJcmV0dXJuICd1JzsKIH0KIAogY2hhciBoZWFkMnR5cGUoc3RydWN0IGl0ZW1faGVhZCAqaWgpCiB7Ci0gIGlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpCi0gICAgcmV0dXJuICdkJzsKLSAgaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpCi0gICAgcmV0dXJuICdEJzsKLSAgaWYgKGlzX2luZGlyZWN0X2xlX2loKGloKSkKLSAgICByZXR1cm4gJ2knOwotICBpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpKQotICAgIHJldHVybiAncyc7Ci0gIHJldHVybiAndSc7CisJaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkKKwkJcmV0dXJuICdkJzsKKwlpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkKKwkJcmV0dXJuICdEJzsKKwlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQorCQlyZXR1cm4gJ2knOworCWlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCisJCXJldHVybiAncyc7CisJcmV0dXJuICd1JzsKIH0KICNlbmRpZgogCiAvKiBEZWxldGUgb2JqZWN0IGl0ZW0uICovCi1pbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCSAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCwgLyogUGF0aCB0byB0aGUgZGVsZXRlZCBpdGVtLiAqLwotCQkJICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19pdGVtX2tleSwgLyogS2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRlbGV0ZWQgaXRlbS4gICovCi0JCQkgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwvKiBpbm9kZSBpcyBoZXJlIGp1c3QgdG8gdXBkYXRlIGlfYmxvY2tzIGFuZCBxdW90YXMgKi8KLQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc191bl9iaCkgICAgLyogTlVMTCBvciB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIuICAgICovCi17Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOwotICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgICBzX2RlbF9iYWxhbmNlOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgICBzX2loOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgICAqcV9paDsKLSAgICBpbnQJCQkgIHF1b3RhX2N1dF9ieXRlczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9yZXRfdmFsdWUsCi0Jbl9kZWxfc2l6ZSwKLQluX3JlbW92ZWQ7CitpbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwJLyogUGF0aCB0byB0aGUgZGVsZXRlZCBpdGVtLiAqLworCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksCS8qIEtleSB0byBzZWFyY2ggZm9yIHRoZSBkZWxldGVkIGl0ZW0uICAqLworCQkJIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLAkvKiBpbm9kZSBpcyBoZXJlIGp1c3QgdG8gdXBkYXRlIGlfYmxvY2tzIGFuZCBxdW90YXMgKi8KKwkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc191bl9iaCkKK3sJCQkJLyogTlVMTCBvciB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIuICAgICovCisJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7CisJc3RydWN0IHRyZWVfYmFsYW5jZSBzX2RlbF9iYWxhbmNlOworCXN0cnVjdCBpdGVtX2hlYWQgc19paDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpxX2loOworCWludCBxdW90YV9jdXRfYnl0ZXM7CisJaW50IG5fcmV0X3ZhbHVlLCBuX2RlbF9zaXplLCBuX3JlbW92ZWQ7CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgY19tb2RlOwotICAgIGludAkJCW5faXRlciA9IDA7CisJY2hhciBjX21vZGU7CisJaW50IG5faXRlciA9IDA7CiAjZW5kaWYKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIGluaXRfdGJfc3RydWN0KHRoLCAmc19kZWxfYmFsYW5jZSwgcF9zX3NiLCBwX3NfcGF0aCwgMC8qc2l6ZSBpcyB1bmtub3duKi8pOworCWluaXRfdGJfc3RydWN0KHRoLCAmc19kZWxfYmFsYW5jZSwgcF9zX3NiLCBwX3NfcGF0aCwKKwkJICAgICAgIDAgLypzaXplIGlzIHVua25vd24gKi8gKTsKIAotICAgIHdoaWxlICggMSApIHsKLQluX3JlbW92ZWQgPSAwOworCXdoaWxlICgxKSB7CisJCW5fcmVtb3ZlZCA9IDA7CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQluX2l0ZXIrKzsKLQljX21vZGUgPQorCQluX2l0ZXIrKzsKKwkJY19tb2RlID0KICNlbmRpZgotCSAgICBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksICZuX3JlbW92ZWQsICZuX2RlbF9zaXplLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChwX3NfaW5vZGUpKTsKKwkJICAgIHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQodGgsIHBfc19pbm9kZSwgcF9zX3BhdGgsCisJCQkJCSAgICAgIHBfc19pdGVtX2tleSwgJm5fcmVtb3ZlZCwKKwkJCQkJICAgICAgJm5fZGVsX3NpemUsCisJCQkJCSAgICAgIG1heF9yZWlzZXJmc19vZmZzZXQocF9zX2lub2RlKSk7CiAKLQlSRkFMU0UoIGNfbW9kZSAhPSBNX0RFTEVURSwgIlBBUC01MzIwOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUiKTsKKwkJUkZBTFNFKGNfbW9kZSAhPSBNX0RFTEVURSwgIlBBUC01MzIwOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUiKTsKIAotCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKLQlzX2RlbF9iYWxhbmNlLmluc2VydF9zaXplWzBdID0gbl9kZWxfc2l6ZTsKKwkJY29weV9pdGVtX2hlYWQoJnNfaWgsIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkpOworCQlzX2RlbF9iYWxhbmNlLmluc2VydF9zaXplWzBdID0gbl9kZWxfc2l6ZTsKIAotCW5fcmV0X3ZhbHVlID0gZml4X25vZGVzKE1fREVMRVRFLCAmc19kZWxfYmFsYW5jZSwgTlVMTCwgTlVMTCk7Ci0JaWYgKCBuX3JldF92YWx1ZSAhPSBSRVBFQVRfU0VBUkNIICkKLQkgICAgYnJlYWs7CisJCW5fcmV0X3ZhbHVlID0gZml4X25vZGVzKE1fREVMRVRFLCAmc19kZWxfYmFsYW5jZSwgTlVMTCwgTlVMTCk7CisJCWlmIChuX3JldF92YWx1ZSAhPSBSRVBFQVRfU0VBUkNIKQorCQkJYnJlYWs7CiAKLQlQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGRlbGV0ZV9pdGVtX3Jlc3RhcnRlZCApOworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgZGVsZXRlX2l0ZW1fcmVzdGFydGVkKTsKIAotCS8vIGZpbGUgc3lzdGVtIGNoYW5nZWQsIHJlcGVhdCBzZWFyY2gKLQluX3JldF92YWx1ZSA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7Ci0JaWYgKG5fcmV0X3ZhbHVlID09IElPX0VSUk9SKQotCSAgICBicmVhazsKLQlpZiAobl9yZXRfdmFsdWUgPT0gRklMRV9OT1RfRk9VTkQpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAidnMtNTM0MDogcmVpc2VyZnNfZGVsZXRlX2l0ZW06ICIKLQkJCSAgICAgICJubyBpdGVtcyBvZiB0aGUgZmlsZSAlSyBmb3VuZCIsIHBfc19pdGVtX2tleSk7Ci0JICAgIGJyZWFrOworCQkvLyBmaWxlIHN5c3RlbSBjaGFuZ2VkLCByZXBlYXQgc2VhcmNoCisJCW5fcmV0X3ZhbHVlID0KKwkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7CisJCWlmIChuX3JldF92YWx1ZSA9PSBJT19FUlJPUikKKwkJCWJyZWFrOworCQlpZiAobl9yZXRfdmFsdWUgPT0gRklMRV9OT1RfRk9VTkQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgInZzLTUzNDA6IHJlaXNlcmZzX2RlbGV0ZV9pdGVtOiAiCisJCQkJCSAibm8gaXRlbXMgb2YgdGhlIGZpbGUgJUsgZm91bmQiLAorCQkJCQkgcF9zX2l0ZW1fa2V5KTsKKwkJCWJyZWFrOworCQl9CisJfQkJCS8qIHdoaWxlICgxKSAqLworCisJaWYgKG5fcmV0X3ZhbHVlICE9IENBUlJZX09OKSB7CisJCXVuZml4X25vZGVzKCZzX2RlbF9iYWxhbmNlKTsKKwkJcmV0dXJuIDA7CiAJfQotICAgIH0gLyogd2hpbGUgKDEpICovCisJLy8gcmVpc2VyZnNfZGVsZXRlX2l0ZW0gcmV0dXJucyBpdGVtIGxlbmd0aCB3aGVuIHN1Y2Nlc3MKKwluX3JldF92YWx1ZSA9IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoJnNfZGVsX2JhbGFuY2UsIE1fREVMRVRFKTsKKwlxX2loID0gZ2V0X2loKHBfc19wYXRoKTsKKwlxdW90YV9jdXRfYnl0ZXMgPSBpaF9pdGVtX2xlbihxX2loKTsKIAotICAgIGlmICggbl9yZXRfdmFsdWUgIT0gQ0FSUllfT04gKSB7Ci0JdW5maXhfbm9kZXMoJnNfZGVsX2JhbGFuY2UpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8vIHJlaXNlcmZzX2RlbGV0ZV9pdGVtIHJldHVybnMgaXRlbSBsZW5ndGggd2hlbiBzdWNjZXNzCi0gICAgbl9yZXRfdmFsdWUgPSBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKCZzX2RlbF9iYWxhbmNlLCBNX0RFTEVURSk7Ci0gICAgcV9paCA9IGdldF9paChwX3NfcGF0aCkgOwotICAgIHF1b3RhX2N1dF9ieXRlcyA9IGloX2l0ZW1fbGVuKHFfaWgpIDsKLQotICAgIC8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlCi0gICAgKiogaGFzIGEgdGFpbC4gIE9uIHRhaWwgaW5zZXJ0LCB3ZSBhbGxvY2F0ZSBxdW90YSBmb3IgMSB1bmZvcm1hdHRlZCBub2RlLgotICAgICoqIFdlIHRlc3QgdGhlIG9mZnNldCBiZWNhdXNlIHRoZSB0YWlsIG1pZ2h0IGhhdmUgYmVlbgotICAgICoqIHNwbGl0IGludG8gbXVsdGlwbGUgaXRlbXMsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVjcmVtZW50IGZvcgotICAgICoqIHRoZSB1bmZtIG5vZGUgb25jZQotICAgICovCi0gICAgaWYgKCFTX0lTTE5LIChwX3NfaW5vZGUtPmlfbW9kZSkgJiYgaXNfZGlyZWN0X2xlX2loKHFfaWgpKSB7Ci0gICAgICAgIGlmICgobGVfaWhfa19vZmZzZXQocV9paCkgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA9PSAxKSB7Ci0gICAgICAgICAgICBxdW90YV9jdXRfYnl0ZXMgPSBwX3Nfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkU7Ci0gICAgICAgIH0gZWxzZSB7Ci0JICAgIHF1b3RhX2N1dF9ieXRlcyA9IDAgOworCS8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlCisJICoqIGhhcyBhIHRhaWwuICBPbiB0YWlsIGluc2VydCwgd2UgYWxsb2NhdGUgcXVvdGEgZm9yIDEgdW5mb3JtYXR0ZWQgbm9kZS4KKwkgKiogV2UgdGVzdCB0aGUgb2Zmc2V0IGJlY2F1c2UgdGhlIHRhaWwgbWlnaHQgaGF2ZSBiZWVuCisJICoqIHNwbGl0IGludG8gbXVsdGlwbGUgaXRlbXMsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVjcmVtZW50IGZvcgorCSAqKiB0aGUgdW5mbSBub2RlIG9uY2UKKwkgKi8KKwlpZiAoIVNfSVNMTksocF9zX2lub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChxX2loKSkgeworCQlpZiAoKGxlX2loX2tfb2Zmc2V0KHFfaWgpICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSkgPT0gMSkgeworCQkJcXVvdGFfY3V0X2J5dGVzID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFOworCQl9IGVsc2UgeworCQkJcXVvdGFfY3V0X2J5dGVzID0gMDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICBpZiAoIHBfc191bl9iaCApICB7Ci0JaW50IG9mZjsKLSAgICAgICAgY2hhciAqZGF0YSA7CisJaWYgKHBfc191bl9iaCkgeworCQlpbnQgb2ZmOworCQljaGFyICpkYXRhOwogCi0JLyogV2UgYXJlIGluIGRpcmVjdDJpbmRpcmVjdCBjb252ZXJzaW9uLCBzbyBtb3ZlIHRhaWwgY29udGVudHMKLSAgICAgICAgICAgdG8gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KLQkvKiBub3RlLCB3ZSBkbyB0aGUgY29weSBiZWZvcmUgcHJlcGFyaW5nIHRoZSBidWZmZXIgYmVjYXVzZSB3ZQotCSoqIGRvbid0IGNhcmUgYWJvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmZvcm1hdHRlZCBub2RlIHlldC4KLQkqKiB0aGUgb25seSB0aGluZyB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZGlyZWN0IGl0ZW0ncyBkYXRhCi0JKiogaXMgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUuCi0JKioKLQkqKiBPdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgdG8gY2FsbCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIG9uCi0JKiogdGhlIHVuZm9ybWF0dGVkIG5vZGUsIHdoaWNoIG1pZ2h0IHNjaGVkdWxlLCBtZWFuaW5nIHdlJ2QgaGF2ZSB0bwotCSoqIGxvb3AgYWxsIHRoZSB3YXkgYmFjayB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIHdoaWxlIGxvb3AuCi0JKioKLQkqKiBUaGUgdW5mb3JtYXR0ZWQgbm9kZSBtdXN0IGJlIGRpcnRpZWQgbGF0ZXIgb24uICBXZSBjYW4ndCBiZQotCSoqIHN1cmUgaGVyZSBpZiB0aGUgZW50aXJlIHRhaWwgaGFzIGJlZW4gZGVsZXRlZCB5ZXQuCi0gICAgICAgICoqCi0gICAgICAgICoqIHBfc191bl9iaCBpcyBmcm9tIHRoZSBwYWdlIGNhY2hlIChhbGwgdW5mb3JtYXR0ZWQgbm9kZXMgYXJlCi0gICAgICAgICoqIGZyb20gdGhlIHBhZ2UgY2FjaGUpIGFuZCBtaWdodCBiZSBhIGhpZ2htZW0gcGFnZS4gIFNvLCB3ZQotICAgICAgICAqKiBjYW4ndCB1c2UgcF9zX3VuX2JoLT5iX2RhdGEuCi0JKiogLWNsbQotCSovCisJCS8qIFdlIGFyZSBpbiBkaXJlY3QyaW5kaXJlY3QgY29udmVyc2lvbiwgc28gbW92ZSB0YWlsIGNvbnRlbnRzCisJCSAgIHRvIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCisJCS8qIG5vdGUsIHdlIGRvIHRoZSBjb3B5IGJlZm9yZSBwcmVwYXJpbmcgdGhlIGJ1ZmZlciBiZWNhdXNlIHdlCisJCSAqKiBkb24ndCBjYXJlIGFib3V0IHRoZSBjb250ZW50cyBvZiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSB5ZXQuCisJCSAqKiB0aGUgb25seSB0aGluZyB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZGlyZWN0IGl0ZW0ncyBkYXRhCisJCSAqKiBpcyBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZS4KKwkJICoqCisJCSAqKiBPdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgdG8gY2FsbCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIG9uCisJCSAqKiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSwgd2hpY2ggbWlnaHQgc2NoZWR1bGUsIG1lYW5pbmcgd2UnZCBoYXZlIHRvCisJCSAqKiBsb29wIGFsbCB0aGUgd2F5IGJhY2sgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3aGlsZSBsb29wLgorCQkgKioKKwkJICoqIFRoZSB1bmZvcm1hdHRlZCBub2RlIG11c3QgYmUgZGlydGllZCBsYXRlciBvbi4gIFdlIGNhbid0IGJlCisJCSAqKiBzdXJlIGhlcmUgaWYgdGhlIGVudGlyZSB0YWlsIGhhcyBiZWVuIGRlbGV0ZWQgeWV0LgorCQkgKioKKwkJICoqIHBfc191bl9iaCBpcyBmcm9tIHRoZSBwYWdlIGNhY2hlIChhbGwgdW5mb3JtYXR0ZWQgbm9kZXMgYXJlCisJCSAqKiBmcm9tIHRoZSBwYWdlIGNhY2hlKSBhbmQgbWlnaHQgYmUgYSBoaWdobWVtIHBhZ2UuICBTbywgd2UKKwkJICoqIGNhbid0IHVzZSBwX3NfdW5fYmgtPmJfZGF0YS4KKwkJICoqIC1jbG0KKwkJICovCiAKLSAgICAgICAgZGF0YSA9IGttYXBfYXRvbWljKHBfc191bl9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7Ci0Jb2ZmID0gKChsZV9paF9rX29mZnNldCAoJnNfaWgpIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwotCW1lbWNweShkYXRhICsgb2ZmLAotCSAgICAgICBCX0lfUElURU0oUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpLCAmc19paCksIG5fcmV0X3ZhbHVlKTsKLQlrdW5tYXBfYXRvbWljKGRhdGEsIEtNX1VTRVIwKTsKLSAgICB9Ci0gICAgLyogUGVyZm9ybSBiYWxhbmNpbmcgYWZ0ZXIgYWxsIHJlc291cmNlcyBoYXZlIGJlZW4gY29sbGVjdGVkIGF0IG9uY2UuICovIAotICAgIGRvX2JhbGFuY2UoJnNfZGVsX2JhbGFuY2UsIE5VTEwsIE5VTEwsIE1fREVMRVRFKTsKKwkJZGF0YSA9IGttYXBfYXRvbWljKHBfc191bl9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7CisJCW9mZiA9ICgobGVfaWhfa19vZmZzZXQoJnNfaWgpIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOworCQltZW1jcHkoZGF0YSArIG9mZiwKKwkJICAgICAgIEJfSV9QSVRFTShQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCksICZzX2loKSwKKwkJICAgICAgIG5fcmV0X3ZhbHVlKTsKKwkJa3VubWFwX2F0b21pYyhkYXRhLCBLTV9VU0VSMCk7CisJfQorCS8qIFBlcmZvcm0gYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgaGF2ZSBiZWVuIGNvbGxlY3RlZCBhdCBvbmNlLiAqLworCWRvX2JhbGFuY2UoJnNfZGVsX2JhbGFuY2UsIE5VTEwsIE5VTEwsIE1fREVMRVRFKTsKIAogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0gICAgcmVpc2VyZnNfZGVidWcgKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGRlbGV0ZV9pdGVtKCk6IGZyZWVpbmcgJXUsIGlkPSV1IHR5cGU9JWMiLCBxdW90YV9jdXRfYnl0ZXMsIHBfc19pbm9kZS0+aV91aWQsIGhlYWQydHlwZSgmc19paCkpOworCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBkZWxldGVfaXRlbSgpOiBmcmVlaW5nICV1LCBpZD0ldSB0eXBlPSVjIiwKKwkJICAgICAgIHF1b3RhX2N1dF9ieXRlcywgcF9zX2lub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKCZzX2loKSk7CiAjZW5kaWYKLSAgICBEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkocF9zX2lub2RlLCBxdW90YV9jdXRfYnl0ZXMpOworCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShwX3NfaW5vZGUsIHF1b3RhX2N1dF9ieXRlcyk7CiAKLSAgICAvKiBSZXR1cm4gZGVsZXRlZCBib2R5IGxlbmd0aCAqLwotICAgIHJldHVybiBuX3JldF92YWx1ZTsKKwkvKiBSZXR1cm4gZGVsZXRlZCBib2R5IGxlbmd0aCAqLworCXJldHVybiBuX3JldF92YWx1ZTsKIH0KIAotCiAvKiBTdW1tYXJ5IE9mIE1lY2hhbmlzbXMgRm9yIEhhbmRsaW5nIENvbGxpc2lvbnMgQmV0d2VlbiBQcm9jZXNzZXM6CiAKICBkZWxldGlvbiBvZiB0aGUgYm9keSBvZiB0aGUgb2JqZWN0IGlzIHBlcmZvcm1lZCBieSBpcHV0KCksIHdpdGggdGhlCkBAIC0xMzQ3LDcyNyArMTM4Nyw4MDQgQEAKICAtIEhhbnMKICovCiAKLQogLyogdGhpcyBkZWxldGVzIGl0ZW0gd2hpY2ggbmV2ZXIgZ2V0cyBzcGxpdCAqLwotdm9pZCByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCit2b2lkIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSkKIHsKLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlIHRiOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgaW50IGl0ZW1fbGVuID0gMDsKLSAgICBpbnQgdGJfaW5pdCA9IDAgOwotICAgIHN0cnVjdCBjcHVfa2V5IGNwdV9rZXk7Ci0gICAgaW50IHJldHZhbDsKLSAgICBpbnQgcXVvdGFfY3V0X2J5dGVzID0gMDsKKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlIHRiOworCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsKKwlpbnQgaXRlbV9sZW4gPSAwOworCWludCB0Yl9pbml0ID0gMDsKKwlzdHJ1Y3QgY3B1X2tleSBjcHVfa2V5OworCWludCByZXR2YWw7CisJaW50IHF1b3RhX2N1dF9ieXRlcyA9IDA7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgCi0gICAgbGVfa2V5MmNwdV9rZXkgKCZjcHVfa2V5LCBrZXkpOwotICAgIAotICAgIHdoaWxlICgxKSB7Ci0JcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHRoLT50X3N1cGVyLCAmY3B1X2tleSwgJnBhdGgpOwotCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsCi0JCQkgICAgICAidnMtNTM1MDogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW06ICIKLQkJCSAgICAgICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZGVsZXRlICVLIiwKLQkJCSAgICAgICZjcHVfa2V5KTsKLQkgICAgYnJlYWs7Ci0JfQotCWlmIChyZXR2YWwgIT0gSVRFTV9GT1VORCkgewotCSAgICBwYXRocmVsc2UgKCZwYXRoKTsKLQkgICAgLy8gTm8gbmVlZCBmb3IgYSB3YXJuaW5nLCBpZiB0aGVyZSBpcyBqdXN0IG5vIGZyZWUgc3BhY2UgdG8gaW5zZXJ0ICcuLicgaXRlbSBpbnRvIHRoZSBuZXdseS1jcmVhdGVkIHN1YmRpcgotCSAgICBpZiAoICEoICh1bnNpZ25lZCBsb25nIGxvbmcpIEdFVF9IQVNIX1ZBTFVFIChsZV9rZXlfa19vZmZzZXQgKGxlX2tleV92ZXJzaW9uIChrZXkpLCBrZXkpKSA9PSAwICYmIFwKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIEdFVF9HRU5FUkFUSU9OX05VTUJFUiAobGVfa2V5X2tfb2Zmc2V0IChsZV9rZXlfdmVyc2lvbiAoa2V5KSwga2V5KSkgPT0gMSApICkKLQkJcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsICJ2cy01MzU1OiByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbTogJWsgbm90IGZvdW5kIiwga2V5KTsKLQkgICAgYnJlYWs7Ci0JfQotCWlmICghdGJfaW5pdCkgewotCSAgICB0Yl9pbml0ID0gMSA7Ci0JICAgIGl0ZW1fbGVuID0gaWhfaXRlbV9sZW4oIFBBVEhfUElURU1fSEVBRCgmcGF0aCkgKTsKLQkgICAgaW5pdF90Yl9zdHJ1Y3QgKHRoLCAmdGIsIHRoLT50X3N1cGVyLCAmcGF0aCwgLSAoSUhfU0laRSArIGl0ZW1fbGVuKSk7Ci0JfQotCXF1b3RhX2N1dF9ieXRlcyA9IGloX2l0ZW1fbGVuKFBBVEhfUElURU1fSEVBRCgmcGF0aCkpIDsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotCXJldHZhbCA9IGZpeF9ub2RlcyAoTV9ERUxFVEUsICZ0YiwgTlVMTCwgTlVMTCk7Ci0JaWYgKHJldHZhbCA9PSBSRVBFQVRfU0VBUkNIKSB7Ci0JICAgIFBST0NfSU5GT19JTkMoIHRoIC0+IHRfc3VwZXIsIGRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZCApOwotCSAgICBjb250aW51ZTsKLQl9CisJbGVfa2V5MmNwdV9rZXkoJmNwdV9rZXksIGtleSk7CiAKLQlpZiAocmV0dmFsID09IENBUlJZX09OKSB7Ci0JICAgIGRvX2JhbGFuY2UgKCZ0YiwgTlVMTCwgTlVMTCwgTV9ERUxFVEUpOwotCSAgICBpZiAoaW5vZGUpIHsJLyogU2hvdWxkIHdlIGNvdW50IHF1b3RhIGZvciBpdGVtPyAod2UgZG9uJ3QgY291bnQgcXVvdGFzIGZvciBzYXZlLWxpbmtzKSAqLworCXdoaWxlICgxKSB7CisJCXJldHZhbCA9IHNlYXJjaF9pdGVtKHRoLT50X3N1cGVyLCAmY3B1X2tleSwgJnBhdGgpOworCQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHRoLT50X3N1cGVyLAorCQkJCQkgInZzLTUzNTA6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAiCisJCQkJCSAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIGRlbGV0ZSAlSyIsCisJCQkJCSAmY3B1X2tleSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAocmV0dmFsICE9IElURU1fRk9VTkQpIHsKKwkJCXBhdGhyZWxzZSgmcGF0aCk7CisJCQkvLyBObyBuZWVkIGZvciBhIHdhcm5pbmcsIGlmIHRoZXJlIGlzIGp1c3Qgbm8gZnJlZSBzcGFjZSB0byBpbnNlcnQgJy4uJyBpdGVtIGludG8gdGhlIG5ld2x5LWNyZWF0ZWQgc3ViZGlyCisJCQlpZiAoIQorCQkJICAgICgodW5zaWduZWQgbG9uZyBsb25nKQorCQkJICAgICBHRVRfSEFTSF9WQUxVRShsZV9rZXlfa19vZmZzZXQKKwkJCQkJICAgIChsZV9rZXlfdmVyc2lvbihrZXkpLCBrZXkpKSA9PSAwCisJCQkgICAgICYmICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkgICAgIEdFVF9HRU5FUkFUSU9OX05VTUJFUihsZV9rZXlfa19vZmZzZXQKKwkJCQkJCSAgIChsZV9rZXlfdmVyc2lvbihrZXkpLAorCQkJCQkJICAgIGtleSkpID09IDEpKQorCQkJCXJlaXNlcmZzX3dhcm5pbmcodGgtPnRfc3VwZXIsCisJCQkJCQkgInZzLTUzNTU6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAlayBub3QgZm91bmQiLAorCQkJCQkJIGtleSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXRiX2luaXQpIHsKKwkJCXRiX2luaXQgPSAxOworCQkJaXRlbV9sZW4gPSBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQoJnBhdGgpKTsKKwkJCWluaXRfdGJfc3RydWN0KHRoLCAmdGIsIHRoLT50X3N1cGVyLCAmcGF0aCwKKwkJCQkgICAgICAgLShJSF9TSVpFICsgaXRlbV9sZW4pKTsKKwkJfQorCQlxdW90YV9jdXRfYnl0ZXMgPSBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQoJnBhdGgpKTsKKworCQlyZXR2YWwgPSBmaXhfbm9kZXMoTV9ERUxFVEUsICZ0YiwgTlVMTCwgTlVMTCk7CisJCWlmIChyZXR2YWwgPT0gUkVQRUFUX1NFQVJDSCkgeworCQkJUFJPQ19JTkZPX0lOQyh0aC0+dF9zdXBlciwgZGVsZXRlX3NvbGlkX2l0ZW1fcmVzdGFydGVkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJldHZhbCA9PSBDQVJSWV9PTikgeworCQkJZG9fYmFsYW5jZSgmdGIsIE5VTEwsIE5VTEwsIE1fREVMRVRFKTsKKwkJCWlmIChpbm9kZSkgewkvKiBTaG91bGQgd2UgY291bnQgcXVvdGEgZm9yIGl0ZW0/ICh3ZSBkb24ndCBjb3VudCBxdW90YXMgZm9yIHNhdmUtbGlua3MpICovCiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKLQkJcmVpc2VyZnNfZGVidWcgKHRoLT50X3N1cGVyLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgZGVsZXRlX3NvbGlkX2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwgcXVvdGFfY3V0X2J5dGVzLCBpbm9kZS0+aV91aWQsIGtleTJ0eXBlKGtleSkpOworCQkJCXJlaXNlcmZzX2RlYnVnKHRoLT50X3N1cGVyLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCQkgICAgICAgInJlaXNlcnF1b3RhIGRlbGV0ZV9zb2xpZF9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsCisJCQkJCSAgICAgICBxdW90YV9jdXRfYnl0ZXMsIGlub2RlLT5pX3VpZCwKKwkJCQkJICAgICAgIGtleTJ0eXBlKGtleSkpOwogI2VuZGlmCi0JCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgcXVvdGFfY3V0X2J5dGVzKTsKLQkgICAgfQotCSAgICBicmVhazsKKwkJCQlEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkoaW5vZGUsCisJCQkJCQkJIHF1b3RhX2N1dF9ieXRlcyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkvLyBJT19FUlJPUiwgTk9fRElTS19TUEFDRSwgZXRjCisJCXJlaXNlcmZzX3dhcm5pbmcodGgtPnRfc3VwZXIsCisJCQkJICJ2cy01MzYwOiByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbTogIgorCQkJCSAiY291bGQgbm90IGRlbGV0ZSAlSyBkdWUgdG8gZml4X25vZGVzIGZhaWx1cmUiLAorCQkJCSAmY3B1X2tleSk7CisJCXVuZml4X25vZGVzKCZ0Yik7CisJCWJyZWFrOwogCX0KIAotCS8vIElPX0VSUk9SLCBOT19ESVNLX1NQQUNFLCBldGMKLQlyZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwgInZzLTUzNjA6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAiCi0JCQkgICJjb3VsZCBub3QgZGVsZXRlICVLIGR1ZSB0byBmaXhfbm9kZXMgZmFpbHVyZSIsICZjcHVfa2V5KTsKLQl1bmZpeF9ub2RlcyAoJnRiKTsKLQlicmVhazsKLSAgICB9Ci0KLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CiB9CiAKLQotaW50IHJlaXNlcmZzX2RlbGV0ZV9vYmplY3QgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK2ludCByZWlzZXJmc19kZWxldGVfb2JqZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBpbnQgZXJyOwotICAgIGlub2RlLT5pX3NpemUgPSAwOwotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlpbnQgZXJyOworCWlub2RlLT5pX3NpemUgPSAwOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgLyogZm9yIGRpcmVjdG9yeSB0aGlzIGRlbGV0ZXMgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiAqLwotICAgIGVyciA9IHJlaXNlcmZzX2RvX3RydW5jYXRlICh0aCwgaW5vZGUsIE5VTEwsIDAvKm5vIHRpbWVzdGFtcCB1cGRhdGVzKi8pOwotICAgIGlmIChlcnIpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgCisJLyogZm9yIGRpcmVjdG9yeSB0aGlzIGRlbGV0ZXMgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiAqLworCWVyciA9CisJICAgIHJlaXNlcmZzX2RvX3RydW5jYXRlKHRoLCBpbm9kZSwgTlVMTCwgMCAvKm5vIHRpbWVzdGFtcCB1cGRhdGVzICovICk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogI2lmIGRlZmluZWQoIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKQotICAgIGlmKCAhb2xkX2Zvcm1hdF9vbmx5ICggdGggLT4gdF9zdXBlciApICkKLSAgICAgIHsKLSAgICAgICBfX2xlMzIgKmlub2RlX2dlbmVyYXRpb247Ci0gICAgICAgCi0gICAgICAgaW5vZGVfZ2VuZXJhdGlvbiA9IAotICAgICAgICAgJlJFSVNFUkZTX1NCKHRoIC0+IHRfc3VwZXIpIC0+IHNfcnMgLT4gc19pbm9kZV9nZW5lcmF0aW9uOwotICAgICAgICppbm9kZV9nZW5lcmF0aW9uID0gY3B1X3RvX2xlMzIoIGxlMzJfdG9fY3B1KCAqaW5vZGVfZ2VuZXJhdGlvbiApICsgMSApOwotICAgICAgfQorCWlmICghb2xkX2Zvcm1hdF9vbmx5KHRoLT50X3N1cGVyKSkgeworCQlfX2xlMzIgKmlub2RlX2dlbmVyYXRpb247CisKKwkJaW5vZGVfZ2VuZXJhdGlvbiA9CisJCSAgICAmUkVJU0VSRlNfU0IodGgtPnRfc3VwZXIpLT5zX3JzLT5zX2lub2RlX2dlbmVyYXRpb247CisJCSppbm9kZV9nZW5lcmF0aW9uID0KKwkJICAgIGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KCppbm9kZV9nZW5lcmF0aW9uKSArIDEpOworCX0KIC8qIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKi8KICNlbmRpZgotICAgIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICh0aCwgaW5vZGUsIElOT0RFX1BLRVkgKGlub2RlKSk7CisJcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0odGgsIGlub2RlLCBJTk9ERV9QS0VZKGlub2RlKSk7CiAKLSAgICByZXR1cm4gZXJyOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkCi11bm1hcF9idWZmZXJzKHN0cnVjdCBwYWdlICpwYWdlLCBsb2ZmX3QgcG9zKSB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgOwotICAgIHVuc2lnbmVkIGxvbmcgdGFpbF9pbmRleCA7Ci0gICAgdW5zaWduZWQgbG9uZyBjdXJfaW5kZXggOworc3RhdGljIHZvaWQgdW5tYXBfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQ7CisJdW5zaWduZWQgbG9uZyB0YWlsX2luZGV4OworCXVuc2lnbmVkIGxvbmcgY3VyX2luZGV4OwogCi0gICAgaWYgKHBhZ2UpIHsKLQlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgewotCSAgICB0YWlsX2luZGV4ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKLQkgICAgY3VyX2luZGV4ID0gMCA7Ci0JICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOwotCSAgICBiaCA9IGhlYWQgOwotCSAgICBkbyB7Ci0JCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2UgOworCWlmIChwYWdlKSB7CisJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCQl0YWlsX2luZGV4ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQkJY3VyX2luZGV4ID0gMDsKKwkJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCQliaCA9IGhlYWQ7CisJCQlkbyB7CisJCQkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKIAotCQkvKiB3ZSB3YW50IHRvIHVubWFwIHRoZSBidWZmZXJzIHRoYXQgY29udGFpbiB0aGUgdGFpbCwgYW5kCi0JCSoqIGFsbCB0aGUgYnVmZmVycyBhZnRlciBpdCAoc2luY2UgdGhlIHRhaWwgbXVzdCBiZSBhdCB0aGUKLQkJKiogZW5kIG9mIHRoZSBmaWxlKS4gIFdlIGRvbid0IHdhbnQgdG8gdW5tYXAgZmlsZSBkYXRhCi0JCSoqIGJlZm9yZSB0aGUgdGFpbCwgc2luY2UgaXQgbWlnaHQgYmUgZGlydHkgYW5kIHdhaXRpbmcgdG8KLQkJKiogcmVhY2ggZGlzawotCQkqLwotCQljdXJfaW5kZXggKz0gYmgtPmJfc2l6ZSA7Ci0JCWlmIChjdXJfaW5kZXggPiB0YWlsX2luZGV4KSB7Ci0JCSAgICByZWlzZXJmc191bm1hcF9idWZmZXIoYmgpIDsKKwkJCQkvKiB3ZSB3YW50IHRvIHVubWFwIHRoZSBidWZmZXJzIHRoYXQgY29udGFpbiB0aGUgdGFpbCwgYW5kCisJCQkJICoqIGFsbCB0aGUgYnVmZmVycyBhZnRlciBpdCAoc2luY2UgdGhlIHRhaWwgbXVzdCBiZSBhdCB0aGUKKwkJCQkgKiogZW5kIG9mIHRoZSBmaWxlKS4gIFdlIGRvbid0IHdhbnQgdG8gdW5tYXAgZmlsZSBkYXRhCisJCQkJICoqIGJlZm9yZSB0aGUgdGFpbCwgc2luY2UgaXQgbWlnaHQgYmUgZGlydHkgYW5kIHdhaXRpbmcgdG8KKwkJCQkgKiogcmVhY2ggZGlzaworCQkJCSAqLworCQkJCWN1cl9pbmRleCArPSBiaC0+Yl9zaXplOworCQkJCWlmIChjdXJfaW5kZXggPiB0YWlsX2luZGV4KSB7CisJCQkJCXJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCk7CisJCQkJfQorCQkJCWJoID0gbmV4dDsKKwkJCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCQkJaWYgKFBBR0VfU0laRSA9PSBiaC0+Yl9zaXplKSB7CisJCQkJY2xlYXJfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCX0KIAkJfQotCQliaCA9IG5leHQgOwotCSAgICB9IHdoaWxlIChiaCAhPSBoZWFkKSA7Ci0JICAgIGlmICggUEFHRV9TSVpFID09IGJoLT5iX3NpemUgKSB7Ci0JCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7Ci0JICAgIH0KIAl9Ci0gICAgfQogfQogCi1zdGF0aWMgaW50IG1heWJlX2luZGlyZWN0X3RvX2RpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICAgICAgc3RydWN0IGlub2RlICogcF9zX2lub2RlLAotCQkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIAotCQkJICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgICAgICAqIHBfc19pdGVtX2tleSwKLQkJCSAgICAgIGxvZmZfdCAgICAgICAgIG5fbmV3X2ZpbGVfc2l6ZSwKLQkJCSAgICAgIGNoYXIgICAgICAgICAgICAgICAgKiBwX2NfbW9kZQotCQkJICAgICAgKSB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOwotICAgIGludCBuX2Jsb2NrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOwotICAgIGludCBjdXRfYnl0ZXM7Ci0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworc3RhdGljIGludCBtYXliZV9pbmRpcmVjdF90b19kaXJlY3Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJICAgIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLAorCQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICAgc3RydWN0IHBhdGggKnBfc19wYXRoLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqcF9zX2l0ZW1fa2V5LAorCQkJCSAgICBsb2ZmX3Qgbl9uZXdfZmlsZV9zaXplLCBjaGFyICpwX2NfbW9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKKwlpbnQgbl9ibG9ja19zaXplID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgY3V0X2J5dGVzOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgaWYgKG5fbmV3X2ZpbGVfc2l6ZSAhPSBwX3NfaW5vZGUtPmlfc2l6ZSkKLQlCVUcgKCk7CisJaWYgKG5fbmV3X2ZpbGVfc2l6ZSAhPSBwX3NfaW5vZGUtPmlfc2l6ZSkKKwkJQlVHKCk7CiAKLSAgICAvKiB0aGUgcGFnZSBiZWluZyBzZW50IGluIGNvdWxkIGJlIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGkvbyBlcnJvcgotICAgICoqIHJlYWRpbmcgaW4gdGhlIGxhc3QgYmxvY2suICBUaGUgdXNlciB3aWxsIGhpdCBwcm9ibGVtcyB0cnlpbmcgdG8KLSAgICAqKiByZWFkIHRoZSBmaWxlLCBidXQgZm9yIG5vdyB3ZSBqdXN0IHNraXAgdGhlIGluZGlyZWN0MmRpcmVjdAotICAgICovCi0gICAgaWYgKGF0b21pY19yZWFkKCZwX3NfaW5vZGUtPmlfY291bnQpID4gMSB8fCAKLSAgICAgICAgIXRhaWxfaGFzX3RvX2JlX3BhY2tlZCAocF9zX2lub2RlKSB8fCAKLQkhcGFnZSB8fCAoUkVJU0VSRlNfSShwX3NfaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykpIHsKLQkvLyBsZWF2ZSB0YWlsIGluIGFuIHVuZm9ybWF0dGVkIG5vZGUJCi0JKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKLQljdXRfYnl0ZXMgPSBuX2Jsb2NrX3NpemUgLSAobl9uZXdfZmlsZV9zaXplICYgKG5fYmxvY2tfc2l6ZSAtIDEpKTsKLQlwYXRocmVsc2UocF9zX3BhdGgpOwotCXJldHVybiBjdXRfYnl0ZXM7Ci0gICAgfQotICAgIC8qIFBlcm1vcm0gdGhlIGNvbnZlcnNpb24gdG8gYSBkaXJlY3RfaXRlbS4gKi8KLSAgICAvKnJldHVybiBpbmRpcmVjdF90b19kaXJlY3QgKHBfc19pbm9kZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwgbl9uZXdfZmlsZV9zaXplLCBwX2NfbW9kZSk7Ki8KLSAgICByZXR1cm4gaW5kaXJlY3QyZGlyZWN0ICh0aCwgcF9zX2lub2RlLCBwYWdlLCBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LCBuX25ld19maWxlX3NpemUsIHBfY19tb2RlKTsKKwkvKiB0aGUgcGFnZSBiZWluZyBzZW50IGluIGNvdWxkIGJlIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGkvbyBlcnJvcgorCSAqKiByZWFkaW5nIGluIHRoZSBsYXN0IGJsb2NrLiAgVGhlIHVzZXIgd2lsbCBoaXQgcHJvYmxlbXMgdHJ5aW5nIHRvCisJICoqIHJlYWQgdGhlIGZpbGUsIGJ1dCBmb3Igbm93IHdlIGp1c3Qgc2tpcCB0aGUgaW5kaXJlY3QyZGlyZWN0CisJICovCisJaWYgKGF0b21pY19yZWFkKCZwX3NfaW5vZGUtPmlfY291bnQpID4gMSB8fAorCSAgICAhdGFpbF9oYXNfdG9fYmVfcGFja2VkKHBfc19pbm9kZSkgfHwKKwkgICAgIXBhZ2UgfHwgKFJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2spKSB7CisJCS8vIGxlYXZlIHRhaWwgaW4gYW4gdW5mb3JtYXR0ZWQgbm9kZSAgICAKKwkJKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKKwkJY3V0X2J5dGVzID0KKwkJICAgIG5fYmxvY2tfc2l6ZSAtIChuX25ld19maWxlX3NpemUgJiAobl9ibG9ja19zaXplIC0gMSkpOworCQlwYXRocmVsc2UocF9zX3BhdGgpOworCQlyZXR1cm4gY3V0X2J5dGVzOworCX0KKwkvKiBQZXJtb3JtIHRoZSBjb252ZXJzaW9uIHRvIGEgZGlyZWN0X2l0ZW0uICovCisJLypyZXR1cm4gaW5kaXJlY3RfdG9fZGlyZWN0IChwX3NfaW5vZGUsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksIG5fbmV3X2ZpbGVfc2l6ZSwgcF9jX21vZGUpOyAqLworCXJldHVybiBpbmRpcmVjdDJkaXJlY3QodGgsIHBfc19pbm9kZSwgcGFnZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwKKwkJCSAgICAgICBuX25ld19maWxlX3NpemUsIHBfY19tb2RlKTsKIH0KIAotCiAvKiB3ZSBkaWQgaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24uIEFuZCB3ZSBoYXZlIGluc2VydGVkIGRpcmVjdAogICAgaXRlbSBzdWNjZXNzZXNmdWxseSwgYnV0IHRoZXJlIHdlcmUgbm8gZGlzayBzcGFjZSB0byBjdXQgdW5mbQogICAgcG9pbnRlciBiZWluZyBjb252ZXJ0ZWQuIFRoZXJlZm9yZSB3ZSBoYXZlIHRvIGRlbGV0ZSBpbnNlcnRlZAogICAgZGlyZWN0IGl0ZW0ocykgKi8KLXN0YXRpYyB2b2lkIGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IHBhdGggKiBwYXRoKQorc3RhdGljIHZvaWQgaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKQogewotICAgIHN0cnVjdCBjcHVfa2V5IHRhaWxfa2V5OwotICAgIGludCB0YWlsX2xlbjsKLSAgICBpbnQgcmVtb3ZlZDsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJc3RydWN0IGNwdV9rZXkgdGFpbF9rZXk7CisJaW50IHRhaWxfbGVuOworCWludCByZW1vdmVkOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgbWFrZV9jcHVfa2V5ICgmdGFpbF9rZXksIGlub2RlLCBpbm9kZS0+aV9zaXplICsgMSwgVFlQRV9ESVJFQ1QsIDQpOy8vICEhISEKLSAgICB0YWlsX2tleS5rZXlfbGVuZ3RoID0gNDsKKwltYWtlX2NwdV9rZXkoJnRhaWxfa2V5LCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSArIDEsIFRZUEVfRElSRUNULCA0KTsJLy8gISEhIQorCXRhaWxfa2V5LmtleV9sZW5ndGggPSA0OwogCi0gICAgdGFpbF9sZW4gPSAoY3B1X2tleV9rX29mZnNldCAoJnRhaWxfa2V5KSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgLSAxOwotICAgIHdoaWxlICh0YWlsX2xlbikgewotCS8qIGxvb2sgZm9yIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHRhaWwgKi8KLQlpZiAoc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKGlub2RlLT5pX3NiLCAmdGFpbF9rZXksIHBhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKGlub2RlLT5pX3NiLCAidnMtNTYxNTogaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjazogZm91bmQgaW52YWxpZCBpdGVtIik7Ci0JUkZBTFNFKCBwYXRoLT5wb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQgKHBhdGgpKSAtIDEsCi0JICAgICAgICAidnMtNTYxNjogYXBwZW5kZWQgYnl0ZXMgZm91bmQiKTsKLQlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpIC0tOwotCQotCXJlbW92ZWQgPSByZWlzZXJmc19kZWxldGVfaXRlbSAodGgsIHBhdGgsICZ0YWlsX2tleSwgaW5vZGUsIE5VTEwvKnVuYmggbm90IG5lZWRlZCovKTsKLQlSRkFMU0UoIHJlbW92ZWQgPD0gMCB8fCByZW1vdmVkID4gdGFpbF9sZW4sCi0JICAgICAgICAidnMtNTYxNzogdGhlcmUgd2FzIHRhaWwgJWQgYnl0ZXMsIHJlbW92ZWQgaXRlbSBsZW5ndGggJWQgYnl0ZXMiLAotICAgICAgICAgICAgICAgIHRhaWxfbGVuLCByZW1vdmVkKTsKLQl0YWlsX2xlbiAtPSByZW1vdmVkOwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmdGFpbF9rZXksIGNwdV9rZXlfa19vZmZzZXQgKCZ0YWlsX2tleSkgLSByZW1vdmVkKTsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrOiBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiBoYXMgYmVlbiByb2xsZWQgYmFjayBkdWUgdG8gbGFjayBvZiBkaXNrIHNwYWNlIik7Ci0gICAgLy9tYXJrX2ZpbGVfd2l0aG91dF90YWlsIChpbm9kZSk7Ci0gICAgbWFya19pbm9kZV9kaXJ0eSAoaW5vZGUpOworCXRhaWxfbGVuID0KKwkgICAgKGNwdV9rZXlfa19vZmZzZXQoJnRhaWxfa2V5KSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgLSAxOworCXdoaWxlICh0YWlsX2xlbikgeworCQkvKiBsb29rIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZSB0YWlsICovCisJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJnRhaWxfa2V5LCBwYXRoKSA9PQorCQkgICAgUE9TSVRJT05fTk9UX0ZPVU5EKQorCQkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgICJ2cy01NjE1OiBpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrOiBmb3VuZCBpbnZhbGlkIGl0ZW0iKTsKKwkJUkZBTFNFKHBhdGgtPnBvc19pbl9pdGVtICE9CisJCSAgICAgICBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQocGF0aCkpIC0gMSwKKwkJICAgICAgICJ2cy01NjE2OiBhcHBlbmRlZCBieXRlcyBmb3VuZCIpOworCQlQQVRIX0xBU1RfUE9TSVRJT04ocGF0aCktLTsKKworCQlyZW1vdmVkID0KKwkJICAgIHJlaXNlcmZzX2RlbGV0ZV9pdGVtKHRoLCBwYXRoLCAmdGFpbF9rZXksIGlub2RlLAorCQkJCQkgTlVMTCAvKnVuYmggbm90IG5lZWRlZCAqLyApOworCQlSRkFMU0UocmVtb3ZlZCA8PSAwCisJCSAgICAgICB8fCByZW1vdmVkID4gdGFpbF9sZW4sCisJCSAgICAgICAidnMtNTYxNzogdGhlcmUgd2FzIHRhaWwgJWQgYnl0ZXMsIHJlbW92ZWQgaXRlbSBsZW5ndGggJWQgYnl0ZXMiLAorCQkgICAgICAgdGFpbF9sZW4sIHJlbW92ZWQpOworCQl0YWlsX2xlbiAtPSByZW1vdmVkOworCQlzZXRfY3B1X2tleV9rX29mZnNldCgmdGFpbF9rZXksCisJCQkJICAgICBjcHVfa2V5X2tfb2Zmc2V0KCZ0YWlsX2tleSkgLSByZW1vdmVkKTsKKwl9CisJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCSAiaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjazogaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24gaGFzIGJlZW4gcm9sbGVkIGJhY2sgZHVlIHRvIGxhY2sgb2YgZGlzayBzcGFjZSIpOworCS8vbWFya19maWxlX3dpdGhvdXRfdGFpbCAoaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogfQogCi0KIC8qIChUcnVuY2F0ZSBvciBjdXQgZW50cnkpIG9yIGRlbGV0ZSBvYmplY3QgaXRlbS4gUmV0dXJucyA8IDAgb24gZmFpbHVyZSAqLwotaW50IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCSAgICBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoLAotCQkJICAgIHN0cnVjdCBjcHVfa2V5ICogcF9zX2l0ZW1fa2V5LAotCQkJICAgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwKLQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgCi0JCQkgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSkKK2ludCByZWlzZXJmc19jdXRfZnJvbV9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IHBhdGggKnBfc19wYXRoLAorCQkJICAgc3RydWN0IGNwdV9rZXkgKnBfc19pdGVtX2tleSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLAorCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UsIGxvZmZfdCBuX25ld19maWxlX3NpemUpCiB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOwotICAgIC8qIEV2ZXJ5IGZ1bmN0aW9uIHdoaWNoIGlzIGdvaW5nIHRvIGNhbGwgZG9fYmFsYW5jZSBtdXN0IGZpcnN0Ci0gICAgICAgY3JlYXRlIGEgdHJlZV9iYWxhbmNlIHN0cnVjdHVyZS4gIFRoZW4gaXQgbXVzdCBmaWxsIHVwIHRoaXMKLSAgICAgICBzdHJ1Y3R1cmUgYnkgdXNpbmcgdGhlIGluaXRfdGJfc3RydWN0IGFuZCBmaXhfbm9kZXMgZnVuY3Rpb25zLgotICAgICAgIEFmdGVyIHRoYXQgd2UgY2FuIG1ha2UgdHJlZSBiYWxhbmNpbmcuICovCi0gICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX2N1dF9iYWxhbmNlOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWg7Ci0gICAgaW50IG5fY3V0X3NpemUgPSAwLCAgICAgICAgLyogQW1vdW50IHRvIGJlIGN1dC4gKi8KLQluX3JldF92YWx1ZSA9IENBUlJZX09OLAotCW5fcmVtb3ZlZCA9IDAsICAgICAvKiBOdW1iZXIgb2YgdGhlIHJlbW92ZWQgdW5mb3JtYXR0ZWQgbm9kZXMuICovCi0Jbl9pc19pbm9kZV9sb2NrZWQgPSAwOwotICAgIGNoYXIgICAgICAgICAgICAgICAgY19tb2RlOyAgICAgICAgICAgIC8qIE1vZGUgb2YgdGhlIGJhbGFuY2UuICovCi0gICAgaW50IHJldHZhbDIgPSAtMTsKLSAgICBpbnQgcXVvdGFfY3V0X2J5dGVzOwotICAgIGxvZmZfdCB0YWlsX3BvcyA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7CisJLyogRXZlcnkgZnVuY3Rpb24gd2hpY2ggaXMgZ29pbmcgdG8gY2FsbCBkb19iYWxhbmNlIG11c3QgZmlyc3QKKwkgICBjcmVhdGUgYSB0cmVlX2JhbGFuY2Ugc3RydWN0dXJlLiAgVGhlbiBpdCBtdXN0IGZpbGwgdXAgdGhpcworCSAgIHN0cnVjdHVyZSBieSB1c2luZyB0aGUgaW5pdF90Yl9zdHJ1Y3QgYW5kIGZpeF9ub2RlcyBmdW5jdGlvbnMuCisJICAgQWZ0ZXIgdGhhdCB3ZSBjYW4gbWFrZSB0cmVlIGJhbGFuY2luZy4gKi8KKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfY3V0X2JhbGFuY2U7CisJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paDsKKwlpbnQgbl9jdXRfc2l6ZSA9IDAsCS8qIEFtb3VudCB0byBiZSBjdXQuICovCisJICAgIG5fcmV0X3ZhbHVlID0gQ0FSUllfT04sIG5fcmVtb3ZlZCA9IDAsCS8qIE51bWJlciBvZiB0aGUgcmVtb3ZlZCB1bmZvcm1hdHRlZCBub2Rlcy4gKi8KKwkgICAgbl9pc19pbm9kZV9sb2NrZWQgPSAwOworCWNoYXIgY19tb2RlOwkJLyogTW9kZSBvZiB0aGUgYmFsYW5jZS4gKi8KKwlpbnQgcmV0dmFsMiA9IC0xOworCWludCBxdW90YV9jdXRfYnl0ZXM7CisJbG9mZl90IHRhaWxfcG9zID0gMDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICAKLSAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfY3V0X2JhbGFuY2UsIHBfc19pbm9kZS0+aV9zYiwgcF9zX3BhdGgsIG5fY3V0X3NpemUpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCisJaW5pdF90Yl9zdHJ1Y3QodGgsICZzX2N1dF9iYWxhbmNlLCBwX3NfaW5vZGUtPmlfc2IsIHBfc19wYXRoLAorCQkgICAgICAgbl9jdXRfc2l6ZSk7CiAKLSAgICAvKiBSZXBlYXQgdGhpcyBsb29wIHVudGlsIHdlIGVpdGhlciBjdXQgdGhlIGl0ZW0gd2l0aG91dCBuZWVkaW5nCi0gICAgICAgdG8gYmFsYW5jZSwgb3Igd2UgZml4X25vZGVzIHdpdGhvdXQgc2NoZWR1bGUgb2NjdXJyaW5nICovCi0gICAgd2hpbGUgKCAxICkgewotCS8qIERldGVybWluZSB0aGUgYmFsYW5jZSBtb2RlLCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSB0bwotCSAgIGJlIGN1dCwgYW5kIHNpemUgdG8gYmUgY3V0LiAgSW4gY2FzZSBvZiB0aGUgaW5kaXJlY3QgaXRlbQotCSAgIGZyZWUgdW5mb3JtYXR0ZWQgbm9kZXMgd2hpY2ggYXJlIHBvaW50ZWQgdG8gYnkgdGhlIGN1dAotCSAgIHBvaW50ZXJzLiAqLwotICAgICAgCi0JY19tb2RlID0gcHJlcGFyZV9mb3JfZGVsZXRlX29yX2N1dCh0aCwgcF9zX2lub2RlLCBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LCAmbl9yZW1vdmVkLCAKLQkJCQkJICAgJm5fY3V0X3NpemUsIG5fbmV3X2ZpbGVfc2l6ZSk7Ci0JaWYgKCBjX21vZGUgPT0gTV9DT05WRVJUICkgIHsKLQkgICAgLyogY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgdG8gZGlyZWN0IGl0ZW0gb3IgbGVhdmUKLSAgICAgICAgICAgICAgIHRhaWwgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KLQkgICAgUkZBTFNFKCBuX3JldF92YWx1ZSAhPSBDQVJSWV9PTiwgIlBBUC01NTcwOiBjYW4gbm90IGNvbnZlcnQgdHdpY2UiKTsKKwkvKiBSZXBlYXQgdGhpcyBsb29wIHVudGlsIHdlIGVpdGhlciBjdXQgdGhlIGl0ZW0gd2l0aG91dCBuZWVkaW5nCisJICAgdG8gYmFsYW5jZSwgb3Igd2UgZml4X25vZGVzIHdpdGhvdXQgc2NoZWR1bGUgb2NjdXJyaW5nICovCisJd2hpbGUgKDEpIHsKKwkJLyogRGV0ZXJtaW5lIHRoZSBiYWxhbmNlIG1vZGUsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIHRvCisJCSAgIGJlIGN1dCwgYW5kIHNpemUgdG8gYmUgY3V0LiAgSW4gY2FzZSBvZiB0aGUgaW5kaXJlY3QgaXRlbQorCQkgICBmcmVlIHVuZm9ybWF0dGVkIG5vZGVzIHdoaWNoIGFyZSBwb2ludGVkIHRvIGJ5IHRoZSBjdXQKKwkJICAgcG9pbnRlcnMuICovCiAKLQkgICAgbl9yZXRfdmFsdWUgPSBtYXliZV9pbmRpcmVjdF90b19kaXJlY3QgKHRoLCBwX3NfaW5vZGUsIHBhZ2UsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksCi0JCQkJCQkgICAgbl9uZXdfZmlsZV9zaXplLCAmY19tb2RlKTsKLQkgICAgaWYgKCBjX21vZGUgPT0gTV9TS0lQX0JBTEFOQ0lORyApCi0JCS8qIHRhaWwgaGFzIGJlZW4gbGVmdCBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLwotCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisJCWNfbW9kZSA9CisJCSAgICBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoLAorCQkJCQkgICAgICBwX3NfaXRlbV9rZXksICZuX3JlbW92ZWQsCisJCQkJCSAgICAgICZuX2N1dF9zaXplLCBuX25ld19maWxlX3NpemUpOworCQlpZiAoY19tb2RlID09IE1fQ09OVkVSVCkgeworCQkJLyogY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgdG8gZGlyZWN0IGl0ZW0gb3IgbGVhdmUKKwkJCSAgIHRhaWwgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwkJCVJGQUxTRShuX3JldF92YWx1ZSAhPSBDQVJSWV9PTiwKKwkJCSAgICAgICAiUEFQLTU1NzA6IGNhbiBub3QgY29udmVydCB0d2ljZSIpOwogCi0JICAgIG5faXNfaW5vZGVfbG9ja2VkID0gMTsKLQkgIAotCSAgICAvKiByZW1vdmluZyBvZiBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgd2lsbCBjaGFuZ2UgdmFsdWUgd2UKLSAgICAgICAgICAgICAgIGhhdmUgdG8gcmV0dXJuIHRvIHRydW5jYXRlLiBTYXZlIGl0ICovCi0JICAgIHJldHZhbDIgPSBuX3JldF92YWx1ZTsKLQkgICAgLypyZXR2YWwyID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIChuX25ld19maWxlX3NpemUgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsqLwotCSAgCi0JICAgIC8qIFNvLCB3ZSBoYXZlIHBlcmZvcm1lZCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgY29udmVyc2lvbjoKLQkgICAgICAgaW5zZXJ0aW5nIHRoZSBuZXcgZGlyZWN0IGl0ZW0uICBOb3cgd2UgYXJlIHJlbW92aW5nIHRoZQotCSAgICAgICBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlci4gU2V0IGtleSB0byBzZWFyY2ggZm9yCi0JICAgICAgIGl0LiAqLwotICAgICAgCSAgICBzZXRfY3B1X2tleV9rX3R5cGUgKHBfc19pdGVtX2tleSwgVFlQRV9JTkRJUkVDVCk7Ci0JICAgIHBfc19pdGVtX2tleS0+a2V5X2xlbmd0aCA9IDQ7Ci0JICAgIG5fbmV3X2ZpbGVfc2l6ZSAtPSAobl9uZXdfZmlsZV9zaXplICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSk7Ci0JICAgIHRhaWxfcG9zID0gbl9uZXdfZmlsZV9zaXplOwotCSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAocF9zX2l0ZW1fa2V5LCBuX25ld19maWxlX3NpemUgKyAxKTsKLQkgICAgaWYgKCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCApewotCQlwcmludF9ibG9jayAoUEFUSF9QTEFTVF9CVUZGRVIgKHBfc19wYXRoKSwgMywgUEFUSF9MQVNUX1BPU0lUSU9OIChwX3NfcGF0aCkgLSAxLCBQQVRIX0xBU1RfUE9TSVRJT04gKHBfc19wYXRoKSArIDEpOwotCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJQQVAtNTU4MDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogaXRlbSB0byBjb252ZXJ0IGRvZXMgbm90IGV4aXN0ICglSykiLCBwX3NfaXRlbV9rZXkpOwotCSAgICB9Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAobl9jdXRfc2l6ZSA9PSAwKSB7Ci0JICAgIHBhdGhyZWxzZSAocF9zX3BhdGgpOwotCSAgICByZXR1cm4gMDsKKwkJCW5fcmV0X3ZhbHVlID0KKwkJCSAgICBtYXliZV9pbmRpcmVjdF90b19kaXJlY3QodGgsIHBfc19pbm9kZSwgcGFnZSwKKwkJCQkJCSAgICAgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwKKwkJCQkJCSAgICAgbl9uZXdfZmlsZV9zaXplLCAmY19tb2RlKTsKKwkJCWlmIChjX21vZGUgPT0gTV9TS0lQX0JBTEFOQ0lORykKKwkJCQkvKiB0YWlsIGhhcyBiZWVuIGxlZnQgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwkJCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisKKwkJCW5faXNfaW5vZGVfbG9ja2VkID0gMTsKKworCQkJLyogcmVtb3Zpbmcgb2YgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHdpbGwgY2hhbmdlIHZhbHVlIHdlCisJCQkgICBoYXZlIHRvIHJldHVybiB0byB0cnVuY2F0ZS4gU2F2ZSBpdCAqLworCQkJcmV0dmFsMiA9IG5fcmV0X3ZhbHVlOworCQkJLypyZXR2YWwyID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIChuX25ld19maWxlX3NpemUgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsgKi8KKworCQkJLyogU28sIHdlIGhhdmUgcGVyZm9ybWVkIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb252ZXJzaW9uOgorCQkJICAgaW5zZXJ0aW5nIHRoZSBuZXcgZGlyZWN0IGl0ZW0uICBOb3cgd2UgYXJlIHJlbW92aW5nIHRoZQorCQkJICAgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIuIFNldCBrZXkgdG8gc2VhcmNoIGZvcgorCQkJICAgaXQuICovCisJCQlzZXRfY3B1X2tleV9rX3R5cGUocF9zX2l0ZW1fa2V5LCBUWVBFX0lORElSRUNUKTsKKwkJCXBfc19pdGVtX2tleS0+a2V5X2xlbmd0aCA9IDQ7CisJCQluX25ld19maWxlX3NpemUgLT0KKwkJCSAgICAobl9uZXdfZmlsZV9zaXplICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSk7CisJCQl0YWlsX3BvcyA9IG5fbmV3X2ZpbGVfc2l6ZTsKKwkJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KHBfc19pdGVtX2tleSwgbl9uZXdfZmlsZV9zaXplICsgMSk7CisJCQlpZiAoc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkKKwkJCSAgICAocF9zX3NiLCBwX3NfaXRlbV9rZXksCisJCQkgICAgIHBfc19wYXRoKSA9PSBQT1NJVElPTl9OT1RfRk9VTkQpIHsKKwkJCQlwcmludF9ibG9jayhQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCksIDMsCisJCQkJCSAgICBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpIC0gMSwKKwkJCQkJICAgIFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkgKyAxKTsKKwkJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJCSAgICAgICAiUEFQLTU1ODA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IGl0ZW0gdG8gY29udmVydCBkb2VzIG5vdCBleGlzdCAoJUspIiwKKwkJCQkJICAgICAgIHBfc19pdGVtX2tleSk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobl9jdXRfc2l6ZSA9PSAwKSB7CisJCQlwYXRocmVsc2UocF9zX3BhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdID0gbl9jdXRfc2l6ZTsKKworCQluX3JldF92YWx1ZSA9IGZpeF9ub2RlcyhjX21vZGUsICZzX2N1dF9iYWxhbmNlLCBOVUxMLCBOVUxMKTsKKwkJaWYgKG5fcmV0X3ZhbHVlICE9IFJFUEVBVF9TRUFSQ0gpCisJCQlicmVhazsKKworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgY3V0X2Zyb21faXRlbV9yZXN0YXJ0ZWQpOworCisJCW5fcmV0X3ZhbHVlID0KKwkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7CisJCWlmIChuX3JldF92YWx1ZSA9PSBQT1NJVElPTl9GT1VORCkKKwkJCWNvbnRpbnVlOworCisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiUEFQLTU2MTA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IGl0ZW0gJUsgbm90IGZvdW5kIiwKKwkJCQkgcF9zX2l0ZW1fa2V5KTsKKwkJdW5maXhfbm9kZXMoJnNfY3V0X2JhbGFuY2UpOworCQlyZXR1cm4gKG5fcmV0X3ZhbHVlID09IElPX0VSUk9SKSA/IC1FSU8gOiAtRU5PRU5UOworCX0JCQkvKiB3aGlsZSAqLworCisJLy8gY2hlY2sgZml4X25vZGVzIHJlc3VsdHMgKElPX0VSUk9SIG9yIE5PX0RJU0tfU1BBQ0UpCisJaWYgKG5fcmV0X3ZhbHVlICE9IENBUlJZX09OKSB7CisJCWlmIChuX2lzX2lub2RlX2xvY2tlZCkgeworCQkJLy8gRklYTUU6IHRoaXMgc2VlbXMgdG8gYmUgbm90IG5lZWRlZDogd2UgYXJlIGFsd2F5cyBhYmxlCisJCQkvLyB0byBjdXQgaXRlbQorCQkJaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjayh0aCwgcF9zX2lub2RlLCBwX3NfcGF0aCk7CisJCX0KKwkJaWYgKG5fcmV0X3ZhbHVlID09IE5PX0RJU0tfU1BBQ0UpCisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIk5PX0RJU0tfU1BBQ0UiKTsKKwkJdW5maXhfbm9kZXMoJnNfY3V0X2JhbGFuY2UpOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlzX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdID0gbl9jdXRfc2l6ZTsKLQkKLQluX3JldF92YWx1ZSA9IGZpeF9ub2RlcyhjX21vZGUsICZzX2N1dF9iYWxhbmNlLCBOVUxMLCBOVUxMKTsKLSAgICAgIAlpZiAoIG5fcmV0X3ZhbHVlICE9IFJFUEVBVF9TRUFSQ0ggKQotCSAgICBicmVhazsKLQkKLQlQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGN1dF9mcm9tX2l0ZW1fcmVzdGFydGVkICk7CisJLyogZ28gYWhlYWQgYW5kIHBlcmZvcm0gYmFsYW5jaW5nICovCiAKLQluX3JldF92YWx1ZSA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7Ci0JaWYgKG5fcmV0X3ZhbHVlID09IFBPU0lUSU9OX0ZPVU5EKQotCSAgICBjb250aW51ZTsKKwlSRkFMU0UoY19tb2RlID09IE1fUEFTVEUgfHwgY19tb2RlID09IE1fSU5TRVJULCAiaW52YWxpZCBtb2RlIik7CiAKLQlyZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJQQVAtNTYxMDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogaXRlbSAlSyBub3QgZm91bmQiLCBwX3NfaXRlbV9rZXkpOwotCXVuZml4X25vZGVzICgmc19jdXRfYmFsYW5jZSk7Ci0JcmV0dXJuIChuX3JldF92YWx1ZSA9PSBJT19FUlJPUikgPyAtRUlPIDogLUVOT0VOVDsKLSAgICB9IC8qIHdoaWxlICovCi0gIAotICAgIC8vIGNoZWNrIGZpeF9ub2RlcyByZXN1bHRzIChJT19FUlJPUiBvciBOT19ESVNLX1NQQUNFKQotICAgIGlmICggbl9yZXRfdmFsdWUgIT0gQ0FSUllfT04gKSB7Ci0JaWYgKCBuX2lzX2lub2RlX2xvY2tlZCApIHsKLQkgICAgLy8gRklYTUU6IHRoaXMgc2VlbXMgdG8gYmUgbm90IG5lZWRlZDogd2UgYXJlIGFsd2F5cyBhYmxlCi0JICAgIC8vIHRvIGN1dCBpdGVtCi0JICAgIGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2sgKHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoKTsKKwkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSBjdXQgZnJvbSB0aGUgaXRlbS4gKi8KKwlxdW90YV9jdXRfYnl0ZXMgPQorCSAgICAoY19tb2RlID09CisJICAgICBNX0RFTEVURSkgPyBpaF9pdGVtX2xlbihnZXRfaWgocF9zX3BhdGgpKSA6IC1zX2N1dF9iYWxhbmNlLgorCSAgICBpbnNlcnRfc2l6ZVswXTsKKwlpZiAocmV0dmFsMiA9PSAtMSkKKwkJbl9yZXRfdmFsdWUgPSBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKCZzX2N1dF9iYWxhbmNlLCBjX21vZGUpOworCWVsc2UKKwkJbl9yZXRfdmFsdWUgPSByZXR2YWwyOworCisJLyogRm9yIGRpcmVjdCBpdGVtcywgd2Ugb25seSBjaGFuZ2UgdGhlIHF1b3RhIHdoZW4gZGVsZXRpbmcgdGhlIGxhc3QKKwkgKiogaXRlbS4KKwkgKi8KKwlwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEKHNfY3V0X2JhbGFuY2UudGJfcGF0aCk7CisJaWYgKCFTX0lTTE5LKHBfc19pbm9kZS0+aV9tb2RlKSAmJiBpc19kaXJlY3RfbGVfaWgocF9sZV9paCkpIHsKKwkJaWYgKGNfbW9kZSA9PSBNX0RFTEVURSAmJgorCQkgICAgKGxlX2loX2tfb2Zmc2V0KHBfbGVfaWgpICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSkgPT0KKwkJICAgIDEpIHsKKwkJCS8vIEZJWE1FOiB0aGlzIGlzIHRvIGtlZXAgMy41IGhhcHB5CisJCQlSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBVMzJfTUFYOworCQkJcXVvdGFfY3V0X2J5dGVzID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFOworCQl9IGVsc2UgeworCQkJcXVvdGFfY3V0X2J5dGVzID0gMDsKKwkJfQogCX0KLQlpZiAobl9yZXRfdmFsdWUgPT0gTk9fRElTS19TUEFDRSkKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiTk9fRElTS19TUEFDRSIpOwotCXVuZml4X25vZGVzICgmc19jdXRfYmFsYW5jZSk7Ci0JcmV0dXJuIC1FSU87Ci0gICAgfQotCi0gICAgLyogZ28gYWhlYWQgYW5kIHBlcmZvcm0gYmFsYW5jaW5nICovCi0gICAgCi0gICAgUkZBTFNFKCBjX21vZGUgPT0gTV9QQVNURSB8fCBjX21vZGUgPT0gTV9JTlNFUlQsICJpbnZhbGlkIG1vZGUiKTsKLQotICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIGN1dCBmcm9tIHRoZSBpdGVtLiAqLwotICAgIHF1b3RhX2N1dF9ieXRlcyA9ICggY19tb2RlID09IE1fREVMRVRFICkgPyBpaF9pdGVtX2xlbihnZXRfaWgocF9zX3BhdGgpKSA6IC1zX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdOwotICAgIGlmIChyZXR2YWwyID09IC0xKQotCW5fcmV0X3ZhbHVlID0gY2FsY19kZWxldGVkX2J5dGVzX251bWJlcigmc19jdXRfYmFsYW5jZSwgY19tb2RlKTsKLSAgICBlbHNlCi0Jbl9yZXRfdmFsdWUgPSByZXR2YWwyOwotCi0KLSAgICAvKiBGb3IgZGlyZWN0IGl0ZW1zLCB3ZSBvbmx5IGNoYW5nZSB0aGUgcXVvdGEgd2hlbiBkZWxldGluZyB0aGUgbGFzdAotICAgICoqIGl0ZW0uCi0gICAgKi8KLSAgICBwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEIChzX2N1dF9iYWxhbmNlLnRiX3BhdGgpOwotICAgIGlmICghU19JU0xOSyAocF9zX2lub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChwX2xlX2loKSkgewotICAgICAgICBpZiAoY19tb2RlID09IE1fREVMRVRFICYmCi0JICAgKGxlX2loX2tfb2Zmc2V0IChwX2xlX2loKSAmIChwX3Nfc2ItPnNfYmxvY2tzaXplIC0gMSkpID09IDEgKSB7Ci0JICAgIC8vIEZJWE1FOiB0aGlzIGlzIHRvIGtlZXAgMy41IGhhcHB5Ci0JICAgIFJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFUzMl9NQVg7Ci0JICAgIHF1b3RhX2N1dF9ieXRlcyA9IHBfc19zYi0+c19ibG9ja3NpemUgKyBVTkZNX1BfU0laRSA7Ci0gICAgICAgIH0gZWxzZSB7Ci0JICAgIHF1b3RhX2N1dF9ieXRlcyA9IDAgOwotCX0KLSAgICB9CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgaWYgKG5faXNfaW5vZGVfbG9ja2VkKSB7Ci0Jc3RydWN0IGl0ZW1faGVhZCAqIGxlX2loID0gUEFUSF9QSVRFTV9IRUFEIChzX2N1dF9iYWxhbmNlLnRiX3BhdGgpOwotCS8qIHdlIGFyZSBnb2luZyB0byBjb21wbGV0ZSBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbi4gTWFrZQotICAgICAgICAgICBzdXJlLCB0aGF0IHdlIGV4YWN0bHkgcmVtb3ZlIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyCi0gICAgICAgICAgIG9mIHRoZSBpdGVtICovCi0JaWYgKCFpc19pbmRpcmVjdF9sZV9paCAobGVfaWgpKQotCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTY1MjogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgotCQkJICAgICJpdGVtIG11c3QgYmUgaW5kaXJlY3QgJWgiLCBsZV9paCk7CisJaWYgKG5faXNfaW5vZGVfbG9ja2VkKSB7CisJCXN0cnVjdCBpdGVtX2hlYWQgKmxlX2loID0KKwkJICAgIFBBVEhfUElURU1fSEVBRChzX2N1dF9iYWxhbmNlLnRiX3BhdGgpOworCQkvKiB3ZSBhcmUgZ29pbmcgdG8gY29tcGxldGUgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24uIE1ha2UKKwkJICAgc3VyZSwgdGhhdCB3ZSBleGFjdGx5IHJlbW92ZSBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlcgorCQkgICBvZiB0aGUgaXRlbSAqLworCQlpZiAoIWlzX2luZGlyZWN0X2xlX2loKGxlX2loKSkKKwkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkgICAgICAgInZzLTU2NTI6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06ICIKKwkJCQkgICAgICAgIml0ZW0gbXVzdCBiZSBpbmRpcmVjdCAlaCIsIGxlX2loKTsKIAotCWlmIChjX21vZGUgPT0gTV9ERUxFVEUgJiYgaWhfaXRlbV9sZW4obGVfaWgpICE9IFVORk1fUF9TSVpFKQotCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTY1MzogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgotCQkJICAgICJjb21wbGV0aW5nIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uIGluZGlyZWN0IGl0ZW0gJWggIgotCQkJICAgICJiZWluZyBkZWxldGVkIG11c3QgYmUgb2YgNCBieXRlIGxvbmciLCBsZV9paCk7CisJCWlmIChjX21vZGUgPT0gTV9ERUxFVEUgJiYgaWhfaXRlbV9sZW4obGVfaWgpICE9IFVORk1fUF9TSVpFKQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAidnMtNTY1MzogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgorCQkJCSAgICAgICAiY29tcGxldGluZyBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbiBpbmRpcmVjdCBpdGVtICVoICIKKwkJCQkgICAgICAgImJlaW5nIGRlbGV0ZWQgbXVzdCBiZSBvZiA0IGJ5dGUgbG9uZyIsCisJCQkJICAgICAgIGxlX2loKTsKIAotCWlmIChjX21vZGUgPT0gTV9DVVQgJiYgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSAhPSAtVU5GTV9QX1NJWkUpIHsKLQkgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgInZzLTU2NTQ6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06ICIKLQkJCSAgICAiY2FuIG5vdCBjb21wbGV0ZSBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbiBvZiAlaCAoQ1VULCBpbnNlcnRfc2l6ZT09JWQpIiwKLQkJCSAgICBsZV9paCwgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSk7CisJCWlmIChjX21vZGUgPT0gTV9DVVQKKwkJICAgICYmIHNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gIT0gLVVORk1fUF9TSVpFKSB7CisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJ2cy01NjU0OiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiAiCisJCQkJICAgICAgICJjYW4gbm90IGNvbXBsZXRlIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uIG9mICVoIChDVVQsIGluc2VydF9zaXplPT0lZCkiLAorCQkJCSAgICAgICBsZV9paCwgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSk7CisJCX0KKwkJLyogaXQgd291bGQgYmUgdXNlZnVsIHRvIG1ha2Ugc3VyZSwgdGhhdCByaWdodCBuZWlnaGJvcmluZworCQkgICBpdGVtIGlzIGRpcmVjdCBpdGVtIG9mIHRoaXMgZmlsZSAqLwogCX0KLQkvKiBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gbWFrZSBzdXJlLCB0aGF0IHJpZ2h0IG5laWdoYm9yaW5nCi0gICAgICAgICAgIGl0ZW0gaXMgZGlyZWN0IGl0ZW0gb2YgdGhpcyBmaWxlICovCi0gICAgfQogI2VuZGlmCi0gICAgCi0gICAgZG9fYmFsYW5jZSgmc19jdXRfYmFsYW5jZSwgTlVMTCwgTlVMTCwgY19tb2RlKTsKLSAgICBpZiAoIG5faXNfaW5vZGVfbG9ja2VkICkgewotCS8qIHdlJ3ZlIGRvbmUgYW4gaW5kaXJlY3QtPmRpcmVjdCBjb252ZXJzaW9uLiAgd2hlbiB0aGUgZGF0YSBibG9jawotCSoqIHdhcyBmcmVlZCwgaXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBibG9ja3MgdGhhdCBtdXN0Ci0JKiogYmUgZmx1c2hlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMsIG1ha2Ugc3VyZSB0bwotCSoqIHVubWFwIGFuZCBpbnZhbGlkYXRlIGl0Ci0JKi8KLQl1bm1hcF9idWZmZXJzKHBhZ2UsIHRhaWxfcG9zKTsKLQlSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrIDsKLSAgICB9CisKKwlkb19iYWxhbmNlKCZzX2N1dF9iYWxhbmNlLCBOVUxMLCBOVUxMLCBjX21vZGUpOworCWlmIChuX2lzX2lub2RlX2xvY2tlZCkgeworCQkvKiB3ZSd2ZSBkb25lIGFuIGluZGlyZWN0LT5kaXJlY3QgY29udmVyc2lvbi4gIHdoZW4gdGhlIGRhdGEgYmxvY2sKKwkJICoqIHdhcyBmcmVlZCwgaXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBibG9ja3MgdGhhdCBtdXN0CisJCSAqKiBiZSBmbHVzaGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cywgbWFrZSBzdXJlIHRvCisJCSAqKiB1bm1hcCBhbmQgaW52YWxpZGF0ZSBpdAorCQkgKi8KKwkJdW5tYXBfYnVmZmVycyhwYWdlLCB0YWlsX3Bvcyk7CisJCVJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2s7CisJfQogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0gICAgcmVpc2VyZnNfZGVidWcgKHBfc19pbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGN1dF9mcm9tX2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwgcXVvdGFfY3V0X2J5dGVzLCBwX3NfaW5vZGUtPmlfdWlkLCAnPycpOworCXJlaXNlcmZzX2RlYnVnKHBfc19pbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBjdXRfZnJvbV9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsCisJCSAgICAgICBxdW90YV9jdXRfYnl0ZXMsIHBfc19pbm9kZS0+aV91aWQsICc/Jyk7CiAjZW5kaWYKLSAgICBEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkocF9zX2lub2RlLCBxdW90YV9jdXRfYnl0ZXMpOwotICAgIHJldHVybiBuX3JldF92YWx1ZTsKKwlEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkocF9zX2lub2RlLCBxdW90YV9jdXRfYnl0ZXMpOworCXJldHVybiBuX3JldF92YWx1ZTsKIH0KIAotc3RhdGljIHZvaWQgdHJ1bmNhdGVfZGlyZWN0b3J5IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogaW5vZGUpCitzdGF0aWMgdm9pZCB0cnVuY2F0ZV9kaXJlY3Rvcnkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgaWYgKGlub2RlLT5pX25saW5rKQotCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAotCQkJICAidnMtNTY1NTogdHJ1bmNhdGVfZGlyZWN0b3J5OiBsaW5rIGNvdW50ICE9IDAiKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwlpZiAoaW5vZGUtPmlfbmxpbmspCisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJ2cy01NjU1OiB0cnVuY2F0ZV9kaXJlY3Rvcnk6IGxpbmsgY291bnQgIT0gMCIpOwogCi0gICAgc2V0X2xlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkgKGlub2RlKSwgRE9UX09GRlNFVCk7Ci0gICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZIChpbm9kZSksIFRZUEVfRElSRU5UUlkpOwotICAgIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICh0aCwgaW5vZGUsIElOT0RFX1BLRVkgKGlub2RlKSk7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOwotICAgIHNldF9sZV9rZXlfa19vZmZzZXQgKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZIChpbm9kZSksIFNEX09GRlNFVCk7Ci0gICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZIChpbm9kZSksIFRZUEVfU1RBVF9EQVRBKTsgICAgCisJc2V0X2xlX2tleV9rX29mZnNldChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWShpbm9kZSksIERPVF9PRkZTRVQpOworCXNldF9sZV9rZXlfa190eXBlKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZKGlub2RlKSwgVFlQRV9ESVJFTlRSWSk7CisJcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0odGgsIGlub2RlLCBJTk9ERV9QS0VZKGlub2RlKSk7CisJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJc2V0X2xlX2tleV9rX29mZnNldChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWShpbm9kZSksIFNEX09GRlNFVCk7CisJc2V0X2xlX2tleV9rX3R5cGUoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkoaW5vZGUpLCBUWVBFX1NUQVRfREFUQSk7CiB9CiAKLQotCi0KIC8qIFRydW5jYXRlIGZpbGUgdG8gdGhlIG5ldyBzaXplLiBOb3RlLCB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGggYSB0cmFuc2FjdGlvbgogICAgYWxyZWFkeSBzdGFydGVkICovCi1pbnQgcmVpc2VyZnNfZG9fdHJ1bmNhdGUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgc3RydWN0ICBpbm9kZSAqIHBfc19pbm9kZSwgLyogLT5pX3NpemUgY29udGFpbnMgbmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICovCi0JCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgLyogdXAgdG8gZGF0ZSBmb3IgbGFzdCBibG9jayAqLwotCQkJICAgaW50IHVwZGF0ZV90aW1lc3RhbXBzICAvKiB3aGVuIGl0IGlzIGNhbGxlZCBieQotCQkJCQkJICAgICBmaWxlX3JlbGVhc2UgdG8gY29udmVydAotCQkJCQkJICAgICB0aGUgdGFpbCAtIG5vIHRpbWVzdGFtcHMKLQkJCQkJCSAgICAgc2hvdWxkIGJlIHVwZGF0ZWQgKi8KLSAgICApIHsKLSAgICBJTklUSUFMSVpFX1BBVEggKHNfc2VhcmNoX3BhdGgpOyAgICAgICAvKiBQYXRoIHRvIHRoZSBjdXJyZW50IG9iamVjdCBpdGVtLiAqLwotICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgKiBwX2xlX2loOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gYW4gaXRlbSBoZWFkZXIuICovCi0gICAgc3RydWN0IGNwdV9rZXkgICAgICBzX2l0ZW1fa2V5OyAgICAgLyogS2V5IHRvIHNlYXJjaCBmb3IgYSBwcmV2aW91cyBmaWxlIGl0ZW0uICovCi0gICAgbG9mZl90ICAgICAgICAgbl9maWxlX3NpemUsICAgIC8qIE9sZCBmaWxlIHNpemUuICovCi0Jbl9uZXdfZmlsZV9zaXplOy8qIE5ldyBmaWxlIHNpemUuICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5fZGVsZXRlZDsgICAgICAvKiBOdW1iZXIgb2YgZGVsZXRlZCBvciB0cnVuY2F0ZWQgYnl0ZXMuICovCi0gICAgaW50IHJldHZhbDsKLSAgICBpbnQgZXJyID0gMDsKK2ludCByZWlzZXJmc19kb190cnVuY2F0ZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICpwX3NfaW5vZGUsCS8qIC0+aV9zaXplIGNvbnRhaW5zIG5ldworCQkJCQkJCQkJCQkJICAgc2l6ZSAqLworCQkJIHN0cnVjdCBwYWdlICpwYWdlLAkvKiB1cCB0byBkYXRlIGZvciBsYXN0IGJsb2NrICovCisJCQkgaW50IHVwZGF0ZV90aW1lc3RhbXBzCS8qIHdoZW4gaXQgaXMgY2FsbGVkIGJ5CisJCQkJCQkgICBmaWxlX3JlbGVhc2UgdG8gY29udmVydAorCQkJCQkJICAgdGhlIHRhaWwgLSBubyB0aW1lc3RhbXBzCisJCQkJCQkgICBzaG91bGQgYmUgdXBkYXRlZCAqLworICAgICkKK3sKKwlJTklUSUFMSVpFX1BBVEgoc19zZWFyY2hfcGF0aCk7CS8qIFBhdGggdG8gdGhlIGN1cnJlbnQgb2JqZWN0IGl0ZW0uICovCisJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paDsJLyogUG9pbnRlciB0byBhbiBpdGVtIGhlYWRlci4gKi8KKwlzdHJ1Y3QgY3B1X2tleSBzX2l0ZW1fa2V5OwkvKiBLZXkgdG8gc2VhcmNoIGZvciBhIHByZXZpb3VzIGZpbGUgaXRlbS4gKi8KKwlsb2ZmX3Qgbl9maWxlX3NpemUsCS8qIE9sZCBmaWxlIHNpemUuICovCisJIG5fbmV3X2ZpbGVfc2l6ZTsJLyogTmV3IGZpbGUgc2l6ZS4gKi8KKwlpbnQgbl9kZWxldGVkOwkJLyogTnVtYmVyIG9mIGRlbGV0ZWQgb3IgdHJ1bmNhdGVkIGJ5dGVzLiAqLworCWludCByZXR2YWw7CisJaW50IGVyciA9IDA7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgaWYgKCAhIChTX0lTUkVHKHBfc19pbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKHBfc19pbm9kZS0+aV9tb2RlKSkgKQotCXJldHVybiAwOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCWlmICghCisJICAgIChTX0lTUkVHKHBfc19pbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKQorCSAgICAgfHwgU19JU0xOSyhwX3NfaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm4gMDsKIAotICAgIGlmIChTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKSkgewotCS8vIGRlbGV0aW9uIG9mIGRpcmVjdG9yeSAtIG5vIG5lZWQgdG8gdXBkYXRlIHRpbWVzdGFtcHMKLQl0cnVuY2F0ZV9kaXJlY3RvcnkgKHRoLCBwX3NfaW5vZGUpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIEdldCBuZXcgZmlsZSBzaXplLiAqLwotICAgIG5fbmV3X2ZpbGVfc2l6ZSA9IHBfc19pbm9kZS0+aV9zaXplOwotCi0gICAgLy8gRklYTUU6IG5vdGUsIHRoYXQga2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQgaGVyZQotICAgIG1ha2VfY3B1X2tleSAoJnNfaXRlbV9rZXksIHBfc19pbm9kZSwgbWF4X3JlaXNlcmZzX29mZnNldCAocF9zX2lub2RlKSwgVFlQRV9ESVJFQ1QsIDMpOwotCi0gICAgcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX2lub2RlLT5pX3NiLCAmc19pdGVtX2tleSwgJnNfc2VhcmNoX3BhdGgpOwotICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsICJ2cy01NjU3OiByZWlzZXJmc19kb190cnVuY2F0ZTogIgotCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIHRydW5jYXRlICVLIiwgJnNfaXRlbV9rZXkpOwotICAgICAgICBlcnIgPSAtRUlPOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCB8fCByZXR2YWwgPT0gRklMRV9OT1RfRk9VTkQpIHsKLQlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsICJQQVAtNTY2MDogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6ICIKLQkJCSAgIndyb25nIHJlc3VsdCAlZCBvZiBzZWFyY2ggZm9yICVLIiwgcmV0dmFsLCAmc19pdGVtX2tleSk7Ci0KLSAgICAgICAgZXJyID0gLUVJTzsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgc19zZWFyY2hfcGF0aC5wb3NfaW5faXRlbSAtLTsKLQotICAgIC8qIEdldCByZWFsIGZpbGUgc2l6ZSAodG90YWwgbGVuZ3RoIG9mIGFsbCBmaWxlIGl0ZW1zKSAqLwotICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQoJnNfc2VhcmNoX3BhdGgpOwotICAgIGlmICggaXNfc3RhdGRhdGFfbGVfaWggKHBfbGVfaWgpICkKLQluX2ZpbGVfc2l6ZSA9IDA7Ci0gICAgZWxzZSB7Ci0JbG9mZl90IG9mZnNldCA9IGxlX2loX2tfb2Zmc2V0IChwX2xlX2loKTsKLQlpbnQgYnl0ZXMgPSBvcF9ieXRlc19udW1iZXIgKHBfbGVfaWgscF9zX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7Ci0KLQkvKiB0aGlzIG1heSBtaXNtYXRjaCB3aXRoIHJlYWwgZmlsZSBzaXplOiBpZiBsYXN0IGRpcmVjdCBpdGVtCi0gICAgICAgICAgIGhhZCBubyBwYWRkaW5nIHplcm9zIGFuZCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgaGFkIG5vIGZyZWUKLSAgICAgICAgICAgc3BhY2UsIHRoaXMgZmlsZSB3b3VsZCBoYXZlIHRoaXMgZmlsZSBzaXplICovCi0Jbl9maWxlX3NpemUgPSBvZmZzZXQgKyBieXRlcyAtIDE7Ci0gICAgfQotICAgIC8qCi0gICAgICogYXJlIHdlIGRvaW5nIGEgZnVsbCB0cnVuY2F0ZSBvciBkZWxldGUsIGlmIHNvCi0gICAgICoga2ljayBpbiB0aGUgcmVhZGEgY29kZQotICAgICAqLwotICAgIGlmIChuX25ld19maWxlX3NpemUgPT0gMCkKLSAgICAgICAgc19zZWFyY2hfcGF0aC5yZWFkYSA9IFBBVEhfUkVBREEgfCBQQVRIX1JFQURBX0JBQ0s7Ci0KLSAgICBpZiAoIG5fZmlsZV9zaXplID09IDAgfHwgbl9maWxlX3NpemUgPCBuX25ld19maWxlX3NpemUgKSB7Ci0JZ290byB1cGRhdGVfYW5kX291dCA7Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIGtleSB0byBzZWFyY2ggZm9yIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJnNfaXRlbV9rZXksIG5fZmlsZV9zaXplKTsKLQotICAgIGRvICB7Ci0JLyogQ3V0IG9yIGRlbGV0ZSBmaWxlIGl0ZW0uICovCi0Jbl9kZWxldGVkID0gcmVpc2VyZnNfY3V0X2Zyb21faXRlbSh0aCwgJnNfc2VhcmNoX3BhdGgsICZzX2l0ZW1fa2V5LCBwX3NfaW5vZGUsICBwYWdlLCBuX25ld19maWxlX3NpemUpOwotCWlmIChuX2RlbGV0ZWQgPCAwKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwgInZzLTU2NjU6IHJlaXNlcmZzX2RvX3RydW5jYXRlOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtIGZhaWxlZCIpOwotCSAgICByZWlzZXJmc19jaGVja19wYXRoKCZzX3NlYXJjaF9wYXRoKSA7Ci0JICAgIHJldHVybiAwOworCWlmIChTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKSkgeworCQkvLyBkZWxldGlvbiBvZiBkaXJlY3RvcnkgLSBubyBuZWVkIHRvIHVwZGF0ZSB0aW1lc3RhbXBzCisJCXRydW5jYXRlX2RpcmVjdG9yeSh0aCwgcF9zX2lub2RlKTsKKwkJcmV0dXJuIDA7CiAJfQogCi0JUkZBTFNFKCBuX2RlbGV0ZWQgPiBuX2ZpbGVfc2l6ZSwKLQkJIlBBUC01NjcwOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiB0b28gbWFueSBieXRlcyBkZWxldGVkOiBkZWxldGVkICVkLCBmaWxlX3NpemUgJWx1LCBpdGVtX2tleSAlSyIsCi0JCW5fZGVsZXRlZCwgbl9maWxlX3NpemUsICZzX2l0ZW1fa2V5KTsKKwkvKiBHZXQgbmV3IGZpbGUgc2l6ZS4gKi8KKwluX25ld19maWxlX3NpemUgPSBwX3NfaW5vZGUtPmlfc2l6ZTsKIAotCS8qIENoYW5nZSBrZXkgdG8gc2VhcmNoIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KLQluX2ZpbGVfc2l6ZSAtPSBuX2RlbGV0ZWQ7CisJLy8gRklYTUU6IG5vdGUsIHRoYXQga2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQgaGVyZQorCW1ha2VfY3B1X2tleSgmc19pdGVtX2tleSwgcF9zX2lub2RlLCBtYXhfcmVpc2VyZnNfb2Zmc2V0KHBfc19pbm9kZSksCisJCSAgICAgVFlQRV9ESVJFQ1QsIDMpOwogCi0Jc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZzX2l0ZW1fa2V5LCBuX2ZpbGVfc2l6ZSk7CisJcmV0dmFsID0KKwkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX2lub2RlLT5pX3NiLCAmc19pdGVtX2tleSwKKwkJCQkgICAgICAgJnNfc2VhcmNoX3BhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3NfaW5vZGUtPmlfc2IsCisJCQkJICJ2cy01NjU3OiByZWlzZXJmc19kb190cnVuY2F0ZTogIgorCQkJCSAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIHRydW5jYXRlICVLIiwKKwkJCQkgJnNfaXRlbV9rZXkpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCB8fCByZXR2YWwgPT0gRklMRV9OT1RfRk9VTkQpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3NfaW5vZGUtPmlfc2IsCisJCQkJICJQQVAtNTY2MDogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6ICIKKwkJCQkgIndyb25nIHJlc3VsdCAlZCBvZiBzZWFyY2ggZm9yICVLIiwgcmV0dmFsLAorCQkJCSAmc19pdGVtX2tleSk7CiAKLQkvKiBXaGlsZSB0aGVyZSBhcmUgYnl0ZXMgdG8gdHJ1bmNhdGUgYW5kIHByZXZpb3VzIGZpbGUgaXRlbSBpcyBwcmVzZW50ZWQgaW4gdGhlIHRyZWUuICovCisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KIAorCXNfc2VhcmNoX3BhdGgucG9zX2luX2l0ZW0tLTsKKworCS8qIEdldCByZWFsIGZpbGUgc2l6ZSAodG90YWwgbGVuZ3RoIG9mIGFsbCBmaWxlIGl0ZW1zKSAqLworCXBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQoJnNfc2VhcmNoX3BhdGgpOworCWlmIChpc19zdGF0ZGF0YV9sZV9paChwX2xlX2loKSkKKwkJbl9maWxlX3NpemUgPSAwOworCWVsc2UgeworCQlsb2ZmX3Qgb2Zmc2V0ID0gbGVfaWhfa19vZmZzZXQocF9sZV9paCk7CisJCWludCBieXRlcyA9CisJCSAgICBvcF9ieXRlc19udW1iZXIocF9sZV9paCwgcF9zX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisKKwkJLyogdGhpcyBtYXkgbWlzbWF0Y2ggd2l0aCByZWFsIGZpbGUgc2l6ZTogaWYgbGFzdCBkaXJlY3QgaXRlbQorCQkgICBoYWQgbm8gcGFkZGluZyB6ZXJvcyBhbmQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIGhhZCBubyBmcmVlCisJCSAgIHNwYWNlLCB0aGlzIGZpbGUgd291bGQgaGF2ZSB0aGlzIGZpbGUgc2l6ZSAqLworCQluX2ZpbGVfc2l6ZSA9IG9mZnNldCArIGJ5dGVzIC0gMTsKKwl9CiAJLyoKLQkqKiBUaGlzIGxvb3AgY291bGQgdGFrZSBhIHJlYWxseSBsb25nIHRpbWUsIGFuZCBjb3VsZCBsb2cgCi0JKiogbWFueSBtb3JlIGJsb2NrcyB0aGFuIGEgdHJhbnNhY3Rpb24gY2FuIGhvbGQuICBTbywgd2UgZG8gYSBwb2xpdGUKLQkqKiBqb3VybmFsIGVuZCBoZXJlLCBhbmQgaWYgdGhlIHRyYW5zYWN0aW9uIG5lZWRzIGVuZGluZywgd2UgbWFrZQotCSoqIHN1cmUgdGhlIGZpbGUgaXMgY29uc2lzdGVudCBiZWZvcmUgZW5kaW5nIHRoZSBjdXJyZW50IHRyYW5zCi0JKiogYW5kIHN0YXJ0aW5nIGEgbmV3IG9uZQotCSovCi0gICAgICAgIGlmIChqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7Ci0JICBpbnQgb3JpZ19sZW5fYWxsb2MgPSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkIDsKLQkgIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKCZzX3NlYXJjaF9wYXRoKSA7CisJICogYXJlIHdlIGRvaW5nIGEgZnVsbCB0cnVuY2F0ZSBvciBkZWxldGUsIGlmIHNvCisJICoga2ljayBpbiB0aGUgcmVhZGEgY29kZQorCSAqLworCWlmIChuX25ld19maWxlX3NpemUgPT0gMCkKKwkJc19zZWFyY2hfcGF0aC5yZWFkYSA9IFBBVEhfUkVBREEgfCBQQVRIX1JFQURBX0JBQ0s7CiAKLQkgIGlmICh1cGRhdGVfdGltZXN0YW1wcykgewotCSAgICAgIHBfc19pbm9kZS0+aV9tdGltZSA9IHBfc19pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0JICB9IAotCSAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBwX3NfaW5vZGUpIDsKLQotCSAgZXJyID0gam91cm5hbF9lbmQodGgsIHBfc19pbm9kZS0+aV9zYiwgb3JpZ19sZW5fYWxsb2MpIDsKLQkgIGlmIChlcnIpCi0JICAgIGdvdG8gb3V0OwotCSAgZXJyID0gam91cm5hbF9iZWdpbiAodGgsIHBfc19pbm9kZS0+aV9zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDYpOwotCSAgaWYgKGVycikKLQkgICAgZ290byBvdXQ7Ci0JICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ocF9zX2lub2RlKSA7CisJaWYgKG5fZmlsZV9zaXplID09IDAgfHwgbl9maWxlX3NpemUgPCBuX25ld19maWxlX3NpemUpIHsKKwkJZ290byB1cGRhdGVfYW5kX291dDsKIAl9Ci0gICAgfSB3aGlsZSAoIG5fZmlsZV9zaXplID4gUk9VTkRfVVAgKG5fbmV3X2ZpbGVfc2l6ZSkgJiYKLQkgICAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3NfaW5vZGUtPmlfc2IsICZzX2l0ZW1fa2V5LCAmc19zZWFyY2hfcGF0aCkgPT0gUE9TSVRJT05fRk9VTkQgKSAgOwogCi0gICAgUkZBTFNFKCBuX2ZpbGVfc2l6ZSA+IFJPVU5EX1VQIChuX25ld19maWxlX3NpemUpLAotCSAgICAiUEFQLTU2ODA6IHRydW5jYXRlIGRpZCBub3QgZmluaXNoOiBuZXdfZmlsZV9zaXplICVMZCwgY3VycmVudCAlTGQsIG9pZCAlZCIsCi0JICAgIG5fbmV3X2ZpbGVfc2l6ZSwgbl9maWxlX3NpemUsIHNfaXRlbV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCk7CisJLyogVXBkYXRlIGtleSB0byBzZWFyY2ggZm9yIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KKwlzZXRfY3B1X2tleV9rX29mZnNldCgmc19pdGVtX2tleSwgbl9maWxlX3NpemUpOwogCi11cGRhdGVfYW5kX291dDoKLSAgICBpZiAodXBkYXRlX3RpbWVzdGFtcHMpIHsKLQkvLyB0aGlzIGlzIHRydW5jYXRlLCBub3QgZmlsZSBjbG9zaW5nCi0JICAgIHBfc19pbm9kZS0+aV9tdGltZSA9IHBfc19pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0gICAgfQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAodGgsIHBfc19pbm9kZSk7CisJZG8geworCQkvKiBDdXQgb3IgZGVsZXRlIGZpbGUgaXRlbS4gKi8KKwkJbl9kZWxldGVkID0KKwkJICAgIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0odGgsICZzX3NlYXJjaF9wYXRoLCAmc19pdGVtX2tleSwKKwkJCQkJICAgcF9zX2lub2RlLCBwYWdlLCBuX25ld19maWxlX3NpemUpOworCQlpZiAobl9kZWxldGVkIDwgMCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3NfaW5vZGUtPmlfc2IsCisJCQkJCSAidnMtNTY2NTogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZmFpbGVkIik7CisJCQlyZWlzZXJmc19jaGVja19wYXRoKCZzX3NlYXJjaF9wYXRoKTsKKwkJCXJldHVybiAwOworCQl9CiAKLW91dDoKLSAgICBwYXRocmVsc2UoJnNfc2VhcmNoX3BhdGgpIDsKLSAgICByZXR1cm4gZXJyOworCQlSRkFMU0Uobl9kZWxldGVkID4gbl9maWxlX3NpemUsCisJCSAgICAgICAiUEFQLTU2NzA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IHRvbyBtYW55IGJ5dGVzIGRlbGV0ZWQ6IGRlbGV0ZWQgJWQsIGZpbGVfc2l6ZSAlbHUsIGl0ZW1fa2V5ICVLIiwKKwkJICAgICAgIG5fZGVsZXRlZCwgbl9maWxlX3NpemUsICZzX2l0ZW1fa2V5KTsKKworCQkvKiBDaGFuZ2Uga2V5IHRvIHNlYXJjaCB0aGUgbGFzdCBmaWxlIGl0ZW0uICovCisJCW5fZmlsZV9zaXplIC09IG5fZGVsZXRlZDsKKworCQlzZXRfY3B1X2tleV9rX29mZnNldCgmc19pdGVtX2tleSwgbl9maWxlX3NpemUpOworCisJCS8qIFdoaWxlIHRoZXJlIGFyZSBieXRlcyB0byB0cnVuY2F0ZSBhbmQgcHJldmlvdXMgZmlsZSBpdGVtIGlzIHByZXNlbnRlZCBpbiB0aGUgdHJlZS4gKi8KKworCQkvKgorCQkgKiogVGhpcyBsb29wIGNvdWxkIHRha2UgYSByZWFsbHkgbG9uZyB0aW1lLCBhbmQgY291bGQgbG9nIAorCQkgKiogbWFueSBtb3JlIGJsb2NrcyB0aGFuIGEgdHJhbnNhY3Rpb24gY2FuIGhvbGQuICBTbywgd2UgZG8gYSBwb2xpdGUKKwkJICoqIGpvdXJuYWwgZW5kIGhlcmUsIGFuZCBpZiB0aGUgdHJhbnNhY3Rpb24gbmVlZHMgZW5kaW5nLCB3ZSBtYWtlCisJCSAqKiBzdXJlIHRoZSBmaWxlIGlzIGNvbnNpc3RlbnQgYmVmb3JlIGVuZGluZyB0aGUgY3VycmVudCB0cmFucworCQkgKiogYW5kIHN0YXJ0aW5nIGEgbmV3IG9uZQorCQkgKi8KKwkJaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKKwkJCWludCBvcmlnX2xlbl9hbGxvYyA9IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQ7CisJCQlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCgmc19zZWFyY2hfcGF0aCk7CisKKwkJCWlmICh1cGRhdGVfdGltZXN0YW1wcykgeworCQkJCXBfc19pbm9kZS0+aV9tdGltZSA9IHBfc19pbm9kZS0+aV9jdGltZSA9CisJCQkJICAgIENVUlJFTlRfVElNRV9TRUM7CisJCQl9CisJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSk7CisKKwkJCWVyciA9IGpvdXJuYWxfZW5kKHRoLCBwX3NfaW5vZGUtPmlfc2IsIG9yaWdfbGVuX2FsbG9jKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCQllcnIgPSBqb3VybmFsX2JlZ2luKHRoLCBwX3NfaW5vZGUtPmlfc2IsCisJCQkJCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDYpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwX3NfaW5vZGUpOworCQl9CisJfSB3aGlsZSAobl9maWxlX3NpemUgPiBST1VORF9VUChuX25ld19maWxlX3NpemUpICYmCisJCSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3NfaW5vZGUtPmlfc2IsICZzX2l0ZW1fa2V5LAorCQkJCQkgICAgJnNfc2VhcmNoX3BhdGgpID09IFBPU0lUSU9OX0ZPVU5EKTsKKworCVJGQUxTRShuX2ZpbGVfc2l6ZSA+IFJPVU5EX1VQKG5fbmV3X2ZpbGVfc2l6ZSksCisJICAgICAgICJQQVAtNTY4MDogdHJ1bmNhdGUgZGlkIG5vdCBmaW5pc2g6IG5ld19maWxlX3NpemUgJUxkLCBjdXJyZW50ICVMZCwgb2lkICVkIiwKKwkgICAgICAgbl9uZXdfZmlsZV9zaXplLCBuX2ZpbGVfc2l6ZSwgc19pdGVtX2tleS5vbl9kaXNrX2tleS5rX29iamVjdGlkKTsKKworICAgICAgdXBkYXRlX2FuZF9vdXQ6CisJaWYgKHVwZGF0ZV90aW1lc3RhbXBzKSB7CisJCS8vIHRoaXMgaXMgdHJ1bmNhdGUsIG5vdCBmaWxlIGNsb3NpbmcKKwkJcF9zX2lub2RlLT5pX210aW1lID0gcF9zX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwl9CisJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBwX3NfaW5vZGUpOworCisgICAgICBvdXQ6CisJcGF0aHJlbHNlKCZzX3NlYXJjaF9wYXRoKTsKKwlyZXR1cm4gZXJyOwogfQogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKIC8vIHRoaXMgbWFrZXMgc3VyZSwgdGhhdCB3ZSBfX2FwcGVuZF9fLCBub3Qgb3ZlcndyaXRlIG9yIGFkZCBob2xlcwotc3RhdGljIHZvaWQgY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlIChzdHJ1Y3QgcGF0aCAqIHBhdGgsIAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogcF9zX2tleSkKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5KQogewotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBmb3VuZF9paCA9IGdldF9paCAocGF0aCk7Ci0gICAgCi0gICAgaWYgKGlzX2RpcmVjdF9sZV9paCAoZm91bmRfaWgpKSB7Ci0JaWYgKGxlX2loX2tfb2Zmc2V0IChmb3VuZF9paCkgKyBvcF9ieXRlc19udW1iZXIgKGZvdW5kX2loLCBnZXRfbGFzdF9iaCAocGF0aCktPmJfc2l6ZSkgIT0KLQkgICAgY3B1X2tleV9rX29mZnNldCAocF9zX2tleSkgfHwKLQkgICAgb3BfYnl0ZXNfbnVtYmVyIChmb3VuZF9paCwgZ2V0X2xhc3RfYmggKHBhdGgpLT5iX3NpemUpICE9IHBvc19pbl9pdGVtIChwYXRoKSkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJQQVAtNTcyMDogY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlOiAiCi0JCQkgICAgImZvdW5kIGRpcmVjdCBpdGVtICVoIG9yIHBvc2l0aW9uICglZCkgZG9lcyBub3QgbWF0Y2ggdG8ga2V5ICVLIiwKLQkJCSAgICBmb3VuZF9paCwgcG9zX2luX2l0ZW0gKHBhdGgpLCBwX3Nfa2V5KTsKLSAgICB9Ci0gICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChmb3VuZF9paCkpIHsKLQlpZiAobGVfaWhfa19vZmZzZXQgKGZvdW5kX2loKSArIG9wX2J5dGVzX251bWJlciAoZm91bmRfaWgsIGdldF9sYXN0X2JoIChwYXRoKS0+Yl9zaXplKSAhPSBjcHVfa2V5X2tfb2Zmc2V0IChwX3Nfa2V5KSB8fCAKLQkgICAgSV9VTkZNX05VTSAoZm91bmRfaWgpICE9IHBvc19pbl9pdGVtIChwYXRoKSB8fAotCSAgICBnZXRfaWhfZnJlZV9zcGFjZSAoZm91bmRfaWgpICE9IDApCi0JICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAiUEFQLTU3MzA6IGNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZTogIgotCQkJICAgICJmb3VuZCBpbmRpcmVjdCBpdGVtICglaCkgb3IgcG9zaXRpb24gKCVkKSBkb2VzIG5vdCBtYXRjaCB0byBrZXkgKCVLKSIsCi0JCQkgICAgZm91bmRfaWgsIHBvc19pbl9pdGVtIChwYXRoKSwgcF9zX2tleSk7Ci0gICAgfQotfQotI2VuZGlmIC8qIGNvbmZpZyByZWlzZXJmcyBjaGVjayAqLworCXN0cnVjdCBpdGVtX2hlYWQgKmZvdW5kX2loID0gZ2V0X2loKHBhdGgpOwogCisJaWYgKGlzX2RpcmVjdF9sZV9paChmb3VuZF9paCkpIHsKKwkJaWYgKGxlX2loX2tfb2Zmc2V0KGZvdW5kX2loKSArCisJCSAgICBvcF9ieXRlc19udW1iZXIoZm91bmRfaWgsCisJCQkJICAgIGdldF9sYXN0X2JoKHBhdGgpLT5iX3NpemUpICE9CisJCSAgICBjcHVfa2V5X2tfb2Zmc2V0KHBfc19rZXkpCisJCSAgICB8fCBvcF9ieXRlc19udW1iZXIoZm91bmRfaWgsCisJCQkJICAgICAgIGdldF9sYXN0X2JoKHBhdGgpLT5iX3NpemUpICE9CisJCSAgICBwb3NfaW5faXRlbShwYXRoKSkKKwkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJICAgICAgICJQQVAtNTcyMDogY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlOiAiCisJCQkJICAgICAgICJmb3VuZCBkaXJlY3QgaXRlbSAlaCBvciBwb3NpdGlvbiAoJWQpIGRvZXMgbm90IG1hdGNoIHRvIGtleSAlSyIsCisJCQkJICAgICAgIGZvdW5kX2loLCBwb3NfaW5faXRlbShwYXRoKSwgcF9zX2tleSk7CisJfQorCWlmIChpc19pbmRpcmVjdF9sZV9paChmb3VuZF9paCkpIHsKKwkJaWYgKGxlX2loX2tfb2Zmc2V0KGZvdW5kX2loKSArCisJCSAgICBvcF9ieXRlc19udW1iZXIoZm91bmRfaWgsCisJCQkJICAgIGdldF9sYXN0X2JoKHBhdGgpLT5iX3NpemUpICE9CisJCSAgICBjcHVfa2V5X2tfb2Zmc2V0KHBfc19rZXkpCisJCSAgICB8fCBJX1VORk1fTlVNKGZvdW5kX2loKSAhPSBwb3NfaW5faXRlbShwYXRoKQorCQkgICAgfHwgZ2V0X2loX2ZyZWVfc3BhY2UoZm91bmRfaWgpICE9IDApCisJCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJCSAgICAgICAiUEFQLTU3MzA6IGNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZTogIgorCQkJCSAgICAgICAiZm91bmQgaW5kaXJlY3QgaXRlbSAoJWgpIG9yIHBvc2l0aW9uICglZCkgZG9lcyBub3QgbWF0Y2ggdG8ga2V5ICglSykiLAorCQkJCSAgICAgICBmb3VuZF9paCwgcG9zX2luX2l0ZW0ocGF0aCksIHBfc19rZXkpOworCX0KK30KKyNlbmRpZgkJCQkvKiBjb25maWcgcmVpc2VyZnMgY2hlY2sgKi8KIAogLyogUGFzdGUgYnl0ZXMgdG8gdGhlIGV4aXN0aW5nIGl0ZW0uIFJldHVybnMgYnl0ZXMgbnVtYmVyIHBhc3RlZCBpbnRvIHRoZSBpdGVtLiAqLwotaW50IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19zZWFyY2hfcGF0aCwJLyogUGF0aCB0byB0aGUgcGFzdGVkIGl0ZW0uICAgICAgICAgICovCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2tleSwgICAgICAgIAkvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbmVlZGVkIGl0ZW0uKi8KLQkJCSAgICAgIHN0cnVjdCBpbm9kZQkgICogaW5vZGUsCQkvKiBJbm9kZSBpdGVtIGJlbG9uZ3MgdG8gKi8KLQkJCSAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgKiBwX2NfYm9keSwgICAgICAgCS8qIFBvaW50ZXIgdG8gdGhlIGJ5dGVzIHRvIHBhc3RlLiAgICAqLwotCQkJICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fcGFzdGVkX3NpemUpICAJLyogU2l6ZSBvZiBwYXN0ZWQgYnl0ZXMuICAgICAgICAgICAgICovCi17Ci0gICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX3Bhc3RlX2JhbGFuY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZXR2YWw7Ci0gICAgaW50CQkJZnNfZ2VuOworaW50IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCwJLyogUGF0aCB0byB0aGUgcGFzdGVkIGl0ZW0uICAgICAgICAgICovCisJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5LAkvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbmVlZGVkIGl0ZW0uICovCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCS8qIElub2RlIGl0ZW0gYmVsb25ncyB0byAqLworCQkJICAgICBjb25zdCBjaGFyICpwX2NfYm9keSwJLyogUG9pbnRlciB0byB0aGUgYnl0ZXMgdG8gcGFzdGUuICAgICovCisJCQkgICAgIGludCBuX3Bhc3RlZF9zaXplKQorewkJCQkvKiBTaXplIG9mIHBhc3RlZCBieXRlcy4gICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfcGFzdGVfYmFsYW5jZTsKKwlpbnQgcmV0dmFsOworCWludCBmc19nZW47CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYikgOworCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKIAogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0gICAgcmVpc2VyZnNfZGVidWcgKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgcGFzdGVfaW50b19pdGVtKCk6IGFsbG9jYXRpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIG5fcGFzdGVkX3NpemUsIGlub2RlLT5pX3VpZCwga2V5MnR5cGUoJihwX3Nfa2V5LT5vbl9kaXNrX2tleSkpKTsKKwlyZWlzZXJmc19kZWJ1Zyhpbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBwYXN0ZV9pbnRvX2l0ZW0oKTogYWxsb2NhdGluZyAldSBpZD0ldSB0eXBlPSVjIiwKKwkJICAgICAgIG5fcGFzdGVkX3NpemUsIGlub2RlLT5pX3VpZCwKKwkJICAgICAgIGtleTJ0eXBlKCYocF9zX2tleS0+b25fZGlza19rZXkpKSk7CiAjZW5kaWYKIAotICAgIGlmIChEUVVPVF9BTExPQ19TUEFDRV9OT0RJUlRZKGlub2RlLCBuX3Bhc3RlZF9zaXplKSkgewotCXBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOwotCXJldHVybiAtRURRVU9UOwotICAgIH0KLSAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfcGFzdGVfYmFsYW5jZSwgdGgtPnRfc3VwZXIsIHBfc19zZWFyY2hfcGF0aCwgbl9wYXN0ZWRfc2l6ZSk7CisJaWYgKERRVU9UX0FMTE9DX1NQQUNFX05PRElSVFkoaW5vZGUsIG5fcGFzdGVkX3NpemUpKSB7CisJCXBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOworCQlyZXR1cm4gLUVEUVVPVDsKKwl9CisJaW5pdF90Yl9zdHJ1Y3QodGgsICZzX3Bhc3RlX2JhbGFuY2UsIHRoLT50X3N1cGVyLCBwX3Nfc2VhcmNoX3BhdGgsCisJCSAgICAgICBuX3Bhc3RlZF9zaXplKTsKICNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi0gICAgc19wYXN0ZV9iYWxhbmNlLmtleSA9IHBfc19rZXktPm9uX2Rpc2tfa2V5OworCXNfcGFzdGVfYmFsYW5jZS5rZXkgPSBwX3Nfa2V5LT5vbl9kaXNrX2tleTsKICNlbmRpZgogCi0gICAgLyogRFFVT1RfKiBjYW4gc2NoZWR1bGUsIG11c3QgY2hlY2sgYmVmb3JlIHRoZSBmaXhfbm9kZXMgKi8KLSAgICBpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKSkgewotCWdvdG8gc2VhcmNoX2FnYWluOwotICAgIH0KKwkvKiBEUVVPVF8qIGNhbiBzY2hlZHVsZSwgbXVzdCBjaGVjayBiZWZvcmUgdGhlIGZpeF9ub2RlcyAqLworCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpKSB7CisJCWdvdG8gc2VhcmNoX2FnYWluOworCX0KIAotICAgIHdoaWxlICgocmV0dmFsID0gZml4X25vZGVzKE1fUEFTVEUsICZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwsIHBfY19ib2R5KSkgPT0KLVJFUEVBVF9TRUFSQ0ggKSB7Ci1zZWFyY2hfYWdhaW46Ci0JLyogZmlsZSBzeXN0ZW0gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBmaXhfbm9kZXMgKi8KLQlQUk9DX0lORk9fSU5DKCB0aCAtPiB0X3N1cGVyLCBwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkICk7Ci0JcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKHRoLT50X3N1cGVyLCBwX3Nfa2V5LCBwX3Nfc2VhcmNoX3BhdGgpOwotCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQkgICAgcmV0dmFsID0gLUVJTyA7Ci0JICAgIGdvdG8gZXJyb3Jfb3V0IDsKLQl9Ci0JaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIlBBUC01NzEwOiByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW06IGVudHJ5IG9yIHBhc3RlZCBieXRlICglSykgZXhpc3RzIiwgcF9zX2tleSk7Ci0JICAgIHJldHZhbCA9IC1FRVhJU1QgOwotCSAgICBnb3RvIGVycm9yX291dCA7Ci0JfQotCQorCXdoaWxlICgocmV0dmFsID0KKwkJZml4X25vZGVzKE1fUEFTVEUsICZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwsCisJCQkgIHBfY19ib2R5KSkgPT0gUkVQRUFUX1NFQVJDSCkgeworCSAgICAgIHNlYXJjaF9hZ2FpbjoKKwkJLyogZmlsZSBzeXN0ZW0gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBmaXhfbm9kZXMgKi8KKwkJUFJPQ19JTkZPX0lOQyh0aC0+dF9zdXBlciwgcGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZCk7CisJCXJldHZhbCA9CisJCSAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSh0aC0+dF9zdXBlciwgcF9zX2tleSwKKwkJCQkJICAgICAgIHBfc19zZWFyY2hfcGF0aCk7CisJCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQorCQlpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCQkgIlBBUC01NzEwOiByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW06IGVudHJ5IG9yIHBhc3RlZCBieXRlICglSykgZXhpc3RzIiwKKwkJCQkJIHBfc19rZXkpOworCQkJcmV0dmFsID0gLUVFWElTVDsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlIChwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXkpOworCQljaGVja19yZXNlYXJjaF9mb3JfcGFzdGUocF9zX3NlYXJjaF9wYXRoLCBwX3Nfa2V5KTsKICNlbmRpZgotICAgIH0KKwl9CiAKLSAgICAvKiBQZXJmb3JtIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBjb2xsZWN0ZWQgYnkgZml4X25vZGVzLCBhbmQKLSAgICAgICBhY2Nlc3NpbmcgdGhlbSB3aWxsIG5vdCByaXNrIHRyaWdnZXJpbmcgc2NoZWR1bGUuICovCi0gICAgaWYgKCByZXR2YWwgPT0gQ0FSUllfT04gKSB7Ci0JZG9fYmFsYW5jZSgmc19wYXN0ZV9iYWxhbmNlLCBOVUxMLyppaCovLCBwX2NfYm9keSwgTV9QQVNURSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHZhbCA9IChyZXR2YWwgPT0gTk9fRElTS19TUEFDRSkgPyAtRU5PU1BDIDogLUVJTzsKLWVycm9yX291dDoKLSAgICAvKiB0aGlzIGFsc28gcmVsZWFzZXMgdGhlIHBhdGggKi8KLSAgICB1bmZpeF9ub2Rlcygmc19wYXN0ZV9iYWxhbmNlKTsKKwkvKiBQZXJmb3JtIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBjb2xsZWN0ZWQgYnkgZml4X25vZGVzLCBhbmQKKwkgICBhY2Nlc3NpbmcgdGhlbSB3aWxsIG5vdCByaXNrIHRyaWdnZXJpbmcgc2NoZWR1bGUuICovCisJaWYgKHJldHZhbCA9PSBDQVJSWV9PTikgeworCQlkb19iYWxhbmNlKCZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwgLyppaCAqLyAsIHBfY19ib2R5LCBNX1BBU1RFKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IChyZXR2YWwgPT0gTk9fRElTS19TUEFDRSkgPyAtRU5PU1BDIDogLUVJTzsKKyAgICAgIGVycm9yX291dDoKKwkvKiB0aGlzIGFsc28gcmVsZWFzZXMgdGhlIHBhdGggKi8KKwl1bmZpeF9ub2Rlcygmc19wYXN0ZV9iYWxhbmNlKTsKICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotICAgIHJlaXNlcmZzX2RlYnVnIChpbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIHBhc3RlX2ludG9faXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLCBuX3Bhc3RlZF9zaXplLCBpbm9kZS0+aV91aWQsIGtleTJ0eXBlKCYocF9zX2tleS0+b25fZGlza19rZXkpKSk7CisJcmVpc2VyZnNfZGVidWcoaW5vZGUtPmlfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCSAgICAgICAicmVpc2VycXVvdGEgcGFzdGVfaW50b19pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsCisJCSAgICAgICBuX3Bhc3RlZF9zaXplLCBpbm9kZS0+aV91aWQsCisJCSAgICAgICBrZXkydHlwZSgmKHBfc19rZXktPm9uX2Rpc2tfa2V5KSkpOwogI2VuZGlmCi0gICAgRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKGlub2RlLCBuX3Bhc3RlZF9zaXplKTsKLSAgICByZXR1cm4gcmV0dmFsIDsKKwlEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkoaW5vZGUsIG5fcGFzdGVkX3NpemUpOworCXJldHVybiByZXR2YWw7CiB9CiAKLQogLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aC4gKi8KLWludCByZWlzZXJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkgc3RydWN0IHBhdGggICAgICAgICAqIAlwX3NfcGF0aCwgICAgICAgICAvKiBQYXRoIHRvIHRoZSBpbnNlcnRlZGVkIGl0ZW0uICAgICAgICAgKi8KLQkJCSBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICoga2V5LAotCQkJIHN0cnVjdCBpdGVtX2hlYWQgICAgKiAJcF9zX2loLCAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiovCi0JCQkgc3RydWN0IGlub2RlICAgICAgICAqIGlub2RlLAotCQkJIGNvbnN0IGNoYXIgICAgICAgICAgKiAJcF9jX2JvZHkpICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYnl0ZXMgdG8gaW5zZXJ0LiAgICAgICovCi17Ci0gICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX2luc19iYWxhbmNlOwotICAgIGludCAgICAgICAgICAgICAgICAgcmV0dmFsOwotICAgIGludCBmc19nZW4gPSAwIDsKLSAgICBpbnQgcXVvdGFfYnl0ZXMgPSAwIDsKK2ludCByZWlzZXJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHBhdGggKnBfc19wYXRoLAkvKiBQYXRoIHRvIHRoZSBpbnNlcnRlZGVkIGl0ZW0uICAgICAgICAgKi8KKwkJCSBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LCBzdHJ1Y3QgaXRlbV9oZWFkICpwX3NfaWgsCS8qIFBvaW50ZXIgdG8gdGhlIGl0ZW0gaGVhZGVyIHRvIGluc2VydC4gKi8KKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpwX2NfYm9keSkKK3sJCQkJLyogUG9pbnRlciB0byB0aGUgYnl0ZXMgdG8gaW5zZXJ0LiAgICAgICovCisJc3RydWN0IHRyZWVfYmFsYW5jZSBzX2luc19iYWxhbmNlOworCWludCByZXR2YWw7CisJaW50IGZzX2dlbiA9IDA7CisJaW50IHF1b3RhX2J5dGVzID0gMDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIGlmIChpbm9kZSkgeyAgICAgIC8qIERvIHdlIGNvdW50IHF1b3RhcyBmb3IgaXRlbT8gKi8KLQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7Ci0JcXVvdGFfYnl0ZXMgPSBpaF9pdGVtX2xlbihwX3NfaWgpOworCWlmIChpbm9kZSkgewkJLyogRG8gd2UgY291bnQgcXVvdGFzIGZvciBpdGVtPyAqLworCQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7CisJCXF1b3RhX2J5dGVzID0gaWhfaXRlbV9sZW4ocF9zX2loKTsKIAotCS8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlIGhhcwotCSAqKiBhIHRhaWwsIGxpbmtzIGFyZSBhbHdheXMgdGFpbHMsIHNvIHRoZXJlJ3Mgbm8gZ3Vlc3NpbmcgbmVlZGVkCi0JICovCi0JaWYgKCFTX0lTTE5LIChpbm9kZS0+aV9tb2RlKSAmJiBpc19kaXJlY3RfbGVfaWgocF9zX2loKSkgewotCSAgICBxdW90YV9ieXRlcyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFIDsKLQl9CisJCS8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlIGhhcworCQkgKiogYSB0YWlsLCBsaW5rcyBhcmUgYWx3YXlzIHRhaWxzLCBzbyB0aGVyZSdzIG5vIGd1ZXNzaW5nIG5lZWRlZAorCQkgKi8KKwkJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChwX3NfaWgpKSB7CisJCQlxdW90YV9ieXRlcyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFOworCQl9CiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKLQlyZWlzZXJmc19kZWJ1ZyAoaW5vZGUtPmlfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBpbnNlcnRfaXRlbSgpOiBhbGxvY2F0aW5nICV1IGlkPSV1IHR5cGU9JWMiLCBxdW90YV9ieXRlcywgaW5vZGUtPmlfdWlkLCBoZWFkMnR5cGUocF9zX2loKSk7CisJCXJlaXNlcmZzX2RlYnVnKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJyZWlzZXJxdW90YSBpbnNlcnRfaXRlbSgpOiBhbGxvY2F0aW5nICV1IGlkPSV1IHR5cGU9JWMiLAorCQkJICAgICAgIHF1b3RhX2J5dGVzLCBpbm9kZS0+aV91aWQsIGhlYWQydHlwZShwX3NfaWgpKTsKICNlbmRpZgotCS8qIFdlIGNhbid0IGRpcnR5IGlub2RlIGhlcmUuIEl0IHdvdWxkIGJlIGltbWVkaWF0ZWx5IHdyaXR0ZW4gYnV0Ci0JICogYXBwcm9wcmlhdGUgc3RhdCBpdGVtIGlzbid0IGluc2VydGVkIHlldC4uLiAqLwotCWlmIChEUVVPVF9BTExPQ19TUEFDRV9OT0RJUlRZKGlub2RlLCBxdW90YV9ieXRlcykpIHsKLQkgICAgcGF0aHJlbHNlKHBfc19wYXRoKTsKLQkgICAgcmV0dXJuIC1FRFFVT1Q7CisJCS8qIFdlIGNhbid0IGRpcnR5IGlub2RlIGhlcmUuIEl0IHdvdWxkIGJlIGltbWVkaWF0ZWx5IHdyaXR0ZW4gYnV0CisJCSAqIGFwcHJvcHJpYXRlIHN0YXQgaXRlbSBpc24ndCBpbnNlcnRlZCB5ZXQuLi4gKi8KKwkJaWYgKERRVU9UX0FMTE9DX1NQQUNFX05PRElSVFkoaW5vZGUsIHF1b3RhX2J5dGVzKSkgeworCQkJcGF0aHJlbHNlKHBfc19wYXRoKTsKKwkJCXJldHVybiAtRURRVU9UOworCQl9CiAJfQotICAgIH0KLSAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfaW5zX2JhbGFuY2UsIHRoLT50X3N1cGVyLCBwX3NfcGF0aCwgSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfc19paCkpOworCWluaXRfdGJfc3RydWN0KHRoLCAmc19pbnNfYmFsYW5jZSwgdGgtPnRfc3VwZXIsIHBfc19wYXRoLAorCQkgICAgICAgSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfc19paCkpOwogI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgICBzX2luc19iYWxhbmNlLmtleSA9IGtleS0+b25fZGlza19rZXk7CisJc19pbnNfYmFsYW5jZS5rZXkgPSBrZXktPm9uX2Rpc2tfa2V5OwogI2VuZGlmCi0gICAgLyogRFFVT1RfKiBjYW4gc2NoZWR1bGUsIG11c3QgY2hlY2sgdG8gYmUgc3VyZSBjYWxsaW5nIGZpeF9ub2RlcyBpcyBzYWZlICovCi0gICAgaWYgKGlub2RlICYmIGZzX2NoYW5nZWQoZnNfZ2VuLCBpbm9kZS0+aV9zYikpIHsKLQlnb3RvIHNlYXJjaF9hZ2FpbjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIChyZXR2YWwgPSBmaXhfbm9kZXMoTV9JTlNFUlQsICZzX2luc19iYWxhbmNlLCBwX3NfaWgsIHBfY19ib2R5KSkgPT0gUkVQRUFUX1NFQVJDSCkgewotc2VhcmNoX2FnYWluOgotCS8qIGZpbGUgc3lzdGVtIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSBpbiB0aGUgZml4X25vZGVzICovCi0JUFJPQ19JTkZPX0lOQyggdGggLT4gdF9zdXBlciwgaW5zZXJ0X2l0ZW1fcmVzdGFydGVkICk7Ci0JcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHRoLT50X3N1cGVyLCBrZXksIHBfc19wYXRoKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJldHZhbCA9IC1FSU87Ci0JICAgIGdvdG8gZXJyb3Jfb3V0IDsKKwkvKiBEUVVPVF8qIGNhbiBzY2hlZHVsZSwgbXVzdCBjaGVjayB0byBiZSBzdXJlIGNhbGxpbmcgZml4X25vZGVzIGlzIHNhZmUgKi8KKwlpZiAoaW5vZGUgJiYgZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKSkgeworCQlnb3RvIHNlYXJjaF9hZ2FpbjsKIAl9Ci0JaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAiUEFQLTU3NjA6IHJlaXNlcmZzX2luc2VydF9pdGVtOiAiCi0JCQkgICAgICAia2V5ICVLIGFscmVhZHkgZXhpc3RzIGluIHRoZSB0cmVlIiwga2V5KTsKLQkgICAgcmV0dmFsID0gLUVFWElTVCA7Ci0JICAgIGdvdG8gZXJyb3Jfb3V0OyAKKworCXdoaWxlICgocmV0dmFsID0KKwkJZml4X25vZGVzKE1fSU5TRVJULCAmc19pbnNfYmFsYW5jZSwgcF9zX2loLAorCQkJICBwX2NfYm9keSkpID09IFJFUEVBVF9TRUFSQ0gpIHsKKwkgICAgICBzZWFyY2hfYWdhaW46CisJCS8qIGZpbGUgc3lzdGVtIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSBpbiB0aGUgZml4X25vZGVzICovCisJCVBST0NfSU5GT19JTkModGgtPnRfc3VwZXIsIGluc2VydF9pdGVtX3Jlc3RhcnRlZCk7CisJCXJldHZhbCA9IHNlYXJjaF9pdGVtKHRoLT50X3N1cGVyLCBrZXksIHBfc19wYXRoKTsKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcmV0dmFsID0gLUVJTzsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCWlmIChyZXR2YWwgPT0gSVRFTV9GT1VORCkgeworCQkJcmVpc2VyZnNfd2FybmluZyh0aC0+dF9zdXBlciwKKwkJCQkJICJQQVAtNTc2MDogcmVpc2VyZnNfaW5zZXJ0X2l0ZW06ICIKKwkJCQkJICJrZXkgJUsgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRyZWUiLAorCQkJCQkga2V5KTsKKwkJCXJldHZhbCA9IC1FRVhJU1Q7CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBtYWtlIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIHdpbGwgYmUgY29sbGVjdGVkIGF0IGEgdGltZSAqLyAKLSAgICBpZiAoIHJldHZhbCA9PSBDQVJSWV9PTiApIHsKLQlkb19iYWxhbmNlICgmc19pbnNfYmFsYW5jZSwgcF9zX2loLCBwX2NfYm9keSwgTV9JTlNFUlQpOwotCXJldHVybiAwOwotICAgIH0KKwkvKiBtYWtlIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIHdpbGwgYmUgY29sbGVjdGVkIGF0IGEgdGltZSAqLworCWlmIChyZXR2YWwgPT0gQ0FSUllfT04pIHsKKwkJZG9fYmFsYW5jZSgmc19pbnNfYmFsYW5jZSwgcF9zX2loLCBwX2NfYm9keSwgTV9JTlNFUlQpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICByZXR2YWwgPSAocmV0dmFsID09IE5PX0RJU0tfU1BBQ0UpID8gLUVOT1NQQyA6IC1FSU87Ci1lcnJvcl9vdXQ6Ci0gICAgLyogYWxzbyByZWxlYXNlcyB0aGUgcGF0aCAqLwotICAgIHVuZml4X25vZGVzKCZzX2luc19iYWxhbmNlKTsKKwlyZXR2YWwgPSAocmV0dmFsID09IE5PX0RJU0tfU1BBQ0UpID8gLUVOT1NQQyA6IC1FSU87CisgICAgICBlcnJvcl9vdXQ6CisJLyogYWxzbyByZWxlYXNlcyB0aGUgcGF0aCAqLworCXVuZml4X25vZGVzKCZzX2luc19iYWxhbmNlKTsKICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotICAgIHJlaXNlcmZzX2RlYnVnICh0aC0+dF9zdXBlciwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGluc2VydF9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIHF1b3RhX2J5dGVzLCBpbm9kZS0+aV91aWQsIGhlYWQydHlwZShwX3NfaWgpKTsKKwlyZWlzZXJmc19kZWJ1Zyh0aC0+dF9zdXBlciwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBpbnNlcnRfaXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLAorCQkgICAgICAgcXVvdGFfYnl0ZXMsIGlub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKHBfc19paCkpOwogI2VuZGlmCi0gICAgaWYgKGlub2RlKQotCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgcXVvdGFfYnl0ZXMpIDsKLSAgICByZXR1cm4gcmV0dmFsOyAKKwlpZiAoaW5vZGUpCisJCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgcXVvdGFfYnl0ZXMpOworCXJldHVybiByZXR2YWw7CiB9Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IDRiODBhYjkuLjY5NTFjMzUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtMzUsODMgKzM1LDgxIEBACiBzdGF0aWMgY29uc3QgY2hhciByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nW10gPSBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HOwogc3RhdGljIGNvbnN0IGNoYXIgcmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nW10gPSBSRUlTRVIyRlNfSlJfU1VQRVJfTUFHSUNfU1RSSU5HOwogCi1pbnQgaXNfcmVpc2VyZnNfM181IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycykKK2ludCBpc19yZWlzZXJmc18zXzUoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycykKIHsKLSAgcmV0dXJuICFzdHJuY21wIChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzVfbWFnaWNfc3RyaW5nLAotCQkgICBzdHJsZW4gKHJlaXNlcmZzXzNfNV9tYWdpY19zdHJpbmcpKTsKKwlyZXR1cm4gIXN0cm5jbXAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfM181X21hZ2ljX3N0cmluZywKKwkJCXN0cmxlbihyZWlzZXJmc18zXzVfbWFnaWNfc3RyaW5nKSk7CiB9CiAKLQotaW50IGlzX3JlaXNlcmZzXzNfNiAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCitpbnQgaXNfcmVpc2VyZnNfM182KHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMpCiB7Ci0gIHJldHVybiAhc3RybmNtcCAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfM182X21hZ2ljX3N0cmluZywKLSAJCSAgIHN0cmxlbiAocmVpc2VyZnNfM182X21hZ2ljX3N0cmluZykpOworCXJldHVybiAhc3RybmNtcChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAorCQkJc3RybGVuKHJlaXNlcmZzXzNfNl9tYWdpY19zdHJpbmcpKTsKIH0KIAotCi1pbnQgaXNfcmVpc2VyZnNfanIgKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzKQoraW50IGlzX3JlaXNlcmZzX2pyKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMpCiB7Ci0gIHJldHVybiAhc3RybmNtcCAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nLAotIAkJICAgc3RybGVuIChyZWlzZXJmc19qcl9tYWdpY19zdHJpbmcpKTsKKwlyZXR1cm4gIXN0cm5jbXAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nLAorCQkJc3RybGVuKHJlaXNlcmZzX2pyX21hZ2ljX3N0cmluZykpOwogfQogCi0KLXN0YXRpYyBpbnQgaXNfYW55X3JlaXNlcmZzX21hZ2ljX3N0cmluZyAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCitzdGF0aWMgaW50IGlzX2FueV9yZWlzZXJmc19tYWdpY19zdHJpbmcoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycykKIHsKLSAgcmV0dXJuIChpc19yZWlzZXJmc18zXzUgKHJzKSB8fCBpc19yZWlzZXJmc18zXzYgKHJzKSB8fAotCSAgaXNfcmVpc2VyZnNfanIgKHJzKSk7CisJcmV0dXJuIChpc19yZWlzZXJmc18zXzUocnMpIHx8IGlzX3JlaXNlcmZzXzNfNihycykgfHwKKwkJaXNfcmVpc2VyZnNfanIocnMpKTsKIH0KIAotc3RhdGljIGludCByZWlzZXJmc19yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpOwotc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCBrc3RhdGZzICogYnVmKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpOworc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKIAotc3RhdGljIGludCByZWlzZXJmc19zeW5jX2ZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgd2FpdCkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCB3YWl0KQogewotICAgIGlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0gICAgICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0JcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKLQlpZiAoIWpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKSkKLSAgICAgICAgICAgIGlmICgham91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpKQotICAgICAgICAgICAgICAgIHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHMpOwotCXMtPnNfZGlydCA9IDA7IC8qIEV2ZW4gaWYgaXQncyBub3QgdHJ1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICogV2UnbGwgbG9vcCBmb3JldmVyIGluIHN5bmNfc3VwZXJzIG90aGVyd2lzZSAqLwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzLT5zX2RpcnQgPSAwOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCQlpZiAoIWpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKSkKKwkJCWlmICgham91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpKQorCQkJCXJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHMpOworCQlzLT5zX2RpcnQgPSAwOwkvKiBFdmVuIGlmIGl0J3Mgbm90IHRydWUuCisJCQkJICogV2UnbGwgbG9vcCBmb3JldmVyIGluIHN5bmNfc3VwZXJzIG90aGVyd2lzZSAqLworCQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisJfSBlbHNlIHsKKwkJcy0+c19kaXJ0ID0gMDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHJlaXNlcmZzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICByZWlzZXJmc19zeW5jX2ZzKHMsIDEpOworCXJlaXNlcmZzX3N5bmNfZnMocywgMSk7CiB9CiAKLXN0YXRpYyB2b2lkIHJlaXNlcmZzX3dyaXRlX3N1cGVyX2xvY2tmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3dyaXRlX3N1cGVyX2xvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICByZWlzZXJmc193cml0ZV9sb2NrKHMpOwotICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotICAgIGludCBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMSkgOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgcmVpc2VyZnNfYmxvY2tfd3JpdGVzKCZ0aCkgOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOwotICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOwotICAgICAgICByZWlzZXJmc19ibG9ja193cml0ZXMoJnRoKSA7Ci0gICAgICAgIGpvdXJuYWxfZW5kX3N5bmMoJnRoLCBzLCAxKSA7Ci0gICAgfQotICB9Ci0gIHMtPnNfZGlydCA9IDA7Ci0gIHJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7CisJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJaW50IGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKTsKKwkJaWYgKGVycikgeworCQkJcmVpc2VyZnNfYmxvY2tfd3JpdGVzKCZ0aCk7CisJCX0gZWxzZSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLAorCQkJCQkJICAgICAxKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwkJCXJlaXNlcmZzX2Jsb2NrX3dyaXRlcygmdGgpOworCQkJam91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpOworCQl9CisJfQorCXMtPnNfZGlydCA9IDA7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwogfQogCi1zdGF0aWMgdm9pZCByZWlzZXJmc191bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHMpIDsKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlyZWlzZXJmc19hbGxvd193cml0ZXMocyk7CiB9CiAKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5fY29yZV9rZXkgIE1BWF9JTl9DT1JFX0tFWTsKLQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbl9jb3JlX2tleSBNQVhfSU5fQ09SRV9LRVk7CiAKIC8qIHRoaXMgaXMgdXNlZCB0byBkZWxldGUgInNhdmUgbGluayIgd2hlbiB0aGVyZSBhcmUgbm8gaXRlbXMgb2YgYQogICAgZmlsZSBpdCBwb2ludHMgdG8uIEl0IGNhbiBlaXRoZXIgaGFwcGVuIGlmIHVubGluayBpcyBjb21wbGV0ZWQgYnV0CkBAIC0xMjAsMzY0ICsxMTgsMzg3IEBACiAgICBwcm90ZWN0aW5nIHVubGluayBpcyBiaWdnZXIgdGhhdCBhIGtleSBsZiAic2F2ZSBsaW5rIiB3aGljaAogICAgcHJvdGVjdHMgdHJ1bmNhdGUpLCBzbyB0aGVyZSBsZWZ0IG5vIGl0ZW1zIHRvIG1ha2UgdHJ1bmNhdGUKICAgIGNvbXBsZXRpb24gb24gKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX3NhdmVfbGlua19vbmx5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCBpbnQgb2lkX2ZyZWUpCitzdGF0aWMgaW50IHJlbW92ZV9zYXZlX2xpbmtfb25seShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkJIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwgaW50IG9pZF9mcmVlKQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0gICAgaW50IGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBlcnI7CiAKLSAgICAgLyogd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBiYWxhbmNpbmcgKi8KLSAgICAgZXJyID0gam91cm5hbF9iZWdpbiAoJnRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7Ci0gICAgIGlmIChlcnIpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gCi0gICAgIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICgmdGgsIE5VTEwsIGtleSk7Ci0gICAgIGlmIChvaWRfZnJlZSkKLSAgICAgICAgLyogcmVtb3ZhbHMgYXJlIHByb3RlY3RlZCBieSBkaXJlY3QgaXRlbXMgKi8KLSAgICAgICAgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZCAoJnRoLCBsZTMyX3RvX2NwdSAoa2V5LT5rX29iamVjdGlkKSk7CisJLyogd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBiYWxhbmNpbmcgKi8KKwllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLSAgICAgcmV0dXJuIGpvdXJuYWxfZW5kICgmdGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKKwlyZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSgmdGgsIE5VTEwsIGtleSk7CisJaWYgKG9pZF9mcmVlKQorCQkvKiByZW1vdmFscyBhcmUgcHJvdGVjdGVkIGJ5IGRpcmVjdCBpdGVtcyAqLworCQlyZWlzZXJmc19yZWxlYXNlX29iamVjdGlkKCZ0aCwgbGUzMl90b19jcHUoa2V5LT5rX29iamVjdGlkKSk7CisKKwlyZXR1cm4gam91cm5hbF9lbmQoJnRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7CiB9Ci0gCisKICNpZmRlZiBDT05GSUdfUVVPVEEKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCk7CiAjZW5kaWYKLSAKKwogLyogbG9vayBmb3IgdW5jb21wbGV0ZWQgdW5saW5rcyBhbmQgdHJ1bmNhdGVzIGFuZCBjb21wbGV0ZSB0aGVtICovCi1zdGF0aWMgaW50IGZpbmlzaF91bmZpbmlzaGVkIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIGludCBmaW5pc2hfdW5maW5pc2hlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKLSAgICBzdHJ1Y3QgY3B1X2tleSBtYXhfY3B1X2tleSwgb2JqX2tleTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5IHNhdmVfbGlua19rZXk7Ci0gICAgaW50IHJldHZhbCA9IDA7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIGludCBpdGVtX3BvczsKLSAgICBjaGFyICogaXRlbTsKLSAgICBpbnQgZG9uZTsKLSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAgICBpbnQgdHJ1bmNhdGU7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCBjcHVfa2V5IG1heF9jcHVfa2V5LCBvYmpfa2V5OworCXN0cnVjdCByZWlzZXJmc19rZXkgc2F2ZV9saW5rX2tleTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBpdGVtX3BvczsKKwljaGFyICppdGVtOworCWludCBkb25lOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHRydW5jYXRlOwogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIGludCBpOwotICAgIGludCBtc19hY3RpdmVfc2V0OworCWludCBpOworCWludCBtc19hY3RpdmVfc2V0OwogI2VuZGlmCi0gCi0gCi0gICAgLyogY29tcG9zZSBrZXkgdG8gbG9vayBmb3IgInNhdmUiIGxpbmtzICovCi0gICAgbWF4X2NwdV9rZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OwotICAgIG1heF9jcHVfa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gfjBVOwotICAgIG1heF9jcHVfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSB+MFU7Ci0gICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZtYXhfY3B1X2tleSwgfjBVKTsKLSAgICBtYXhfY3B1X2tleS5rZXlfbGVuZ3RoID0gMzsKKworCS8qIGNvbXBvc2Uga2V5IHRvIGxvb2sgZm9yICJzYXZlIiBsaW5rcyAqLworCW1heF9jcHVfa2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKwltYXhfY3B1X2tleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IH4wVTsKKwltYXhfY3B1X2tleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gfjBVOworCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZtYXhfY3B1X2tleSwgfjBVKTsKKwltYXhfY3B1X2tleS5rZXlfbGVuZ3RoID0gMzsKIAogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIC8qIE5lZWRlZCBmb3IgaXB1dCgpIHRvIHdvcmsgY29ycmVjdGx5IGFuZCBub3QgdHJhc2ggZGF0YSAqLwotICAgIGlmIChzLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSB7Ci0JICAgIG1zX2FjdGl2ZV9zZXQgPSAwOwotICAgIH0gZWxzZSB7Ci0JICAgIG1zX2FjdGl2ZV9zZXQgPSAxOwotCSAgICBzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKLSAgICB9Ci0gICAgLyogVHVybiBvbiBxdW90YXMgc28gdGhhdCB0aGV5IGFyZSB1cGRhdGVkIGNvcnJlY3RseSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgewotCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSkgewotCSAgICBpbnQgcmV0ID0gcmVpc2VyZnNfcXVvdGFfb25fbW91bnQocywgaSk7Ci0JICAgIGlmIChyZXQgPCAwKQotCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmczogY2Fubm90IHR1cm4gb24gam91cm5hbGxlZCBxdW90YTogZXJyb3IgJWQiLCByZXQpOworCS8qIE5lZWRlZCBmb3IgaXB1dCgpIHRvIHdvcmsgY29ycmVjdGx5IGFuZCBub3QgdHJhc2ggZGF0YSAqLworCWlmIChzLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSB7CisJCW1zX2FjdGl2ZV9zZXQgPSAwOworCX0gZWxzZSB7CisJCW1zX2FjdGl2ZV9zZXQgPSAxOworCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKIAl9Ci0gICAgfQorCS8qIFR1cm4gb24gcXVvdGFzIHNvIHRoYXQgdGhleSBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKSB7CisJCQlpbnQgcmV0ID0gcmVpc2VyZnNfcXVvdGFfb25fbW91bnQocywgaSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgInJlaXNlcmZzOiBjYW5ub3QgdHVybiBvbiBqb3VybmFsbGVkIHF1b3RhOiBlcnJvciAlZCIsCisJCQkJCQkgcmV0KTsKKwkJfQorCX0KICNlbmRpZgotIAotICAgIGRvbmUgPSAwOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2lzX3VubGlua2VkX29rID0gMTsKLSAgICB3aGlsZSAoIXJldHZhbCkgewotICAgICAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAocywgJm1heF9jcHVfa2V5LCAmcGF0aCk7Ci0gICAgICAgIGlmIChyZXR2YWwgIT0gSVRFTV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMTQwOiBmaW5pc2hfdW5maW5pc2hlZDogc2VhcmNoX2J5X2tleSByZXR1cm5lZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJoID0gZ2V0X2xhc3RfYmggKCZwYXRoKTsKLSAgICAgICAgaXRlbV9wb3MgPSBnZXRfaXRlbV9wb3MgKCZwYXRoKTsKLSAgICAgICAgaWYgKGl0ZW1fcG9zICE9IEJfTlJfSVRFTVMgKGJoKSkgewotICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTIwNjA6IGZpbmlzaF91bmZpbmlzaGVkOiB3cm9uZyBwb3NpdGlvbiBmb3VuZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaXRlbV9wb3MgLS07Ci0gICAgICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCBpdGVtX3Bvcyk7Ci0gCi0gICAgICAgIGlmIChsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX2Rpcl9pZCkgIT0gTUFYX0tFWV9PQkpFQ1RJRCkKLSAgICAgICAgICAgIC8qIHRoZXJlIGFyZSBubyAic2F2ZSIgbGlua3MgYW55bW9yZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIHNhdmVfbGlua19rZXkgPSBpaC0+aWhfa2V5OwotICAgICAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkKLSAgICAgICAgICAgIHRydW5jYXRlID0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdHJ1bmNhdGUgPSAwOwotIAotICAgICAgICAvKiByZWlzZXJmc19pZ2V0IG5lZWRzIGtfZGlyaWQgYW5kIGtfb2JqZWN0aWQgb25seSAqLwotICAgICAgICBpdGVtID0gQl9JX1BJVEVNIChiaCwgaWgpOwotICAgICAgICBvYmpfa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gbGUzMl90b19jcHUgKCooX19sZTMyICopaXRlbSk7Ci0gICAgICAgIG9ial9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpOwotCW9ial9rZXkub25fZGlza19rZXkua19vZmZzZXQgPSAwOwotCW9ial9rZXkub25fZGlza19rZXkua190eXBlID0gMDsKLQkKLSAgICAgICAgcGF0aHJlbHNlICgmcGF0aCk7Ci0gCi0gICAgICAgIGlub2RlID0gcmVpc2VyZnNfaWdldCAocywgJm9ial9rZXkpOwotICAgICAgICBpZiAoIWlub2RlKSB7Ci0gICAgICAgICAgICAvKiB0aGUgdW5saW5rIGFsbW9zdCBjb21wbGV0ZWQsIGl0IGp1c3QgZGlkIG5vdCBtYW5hZ2UgdG8gcmVtb3ZlCi0JICAgICAgICJzYXZlIiBsaW5rIGFuZCByZWxlYXNlIG9iamVjdGlkICovCi0gICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjE4MDogZmluaXNoX3VuZmluaXNoZWQ6IGlnZXQgZmFpbGVkIGZvciAlSyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqX2tleSk7Ci0gICAgICAgICAgICByZXR2YWwgPSByZW1vdmVfc2F2ZV9saW5rX29ubHkgKHMsICZzYXZlX2xpbmtfa2V5LCAxKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CiAKLQlpZiAoIXRydW5jYXRlICYmIGlub2RlLT5pX25saW5rKSB7Ci0JICAgIC8qIGZpbGUgaXMgbm90IHVubGlua2VkICovCi0gICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjE4NTogZmluaXNoX3VuZmluaXNoZWQ6IGZpbGUgJUsgaXMgbm90IHVubGlua2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmpfa2V5KTsKLSAgICAgICAgICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seSAocywgJnNhdmVfbGlua19rZXksIDApOwotICAgICAgICAgICAgY29udGludWU7Ci0JfQotCURRVU9UX0lOSVQoaW5vZGUpOworCWRvbmUgPSAwOworCVJFSVNFUkZTX1NCKHMpLT5zX2lzX3VubGlua2VkX29rID0gMTsKKwl3aGlsZSAoIXJldHZhbCkgeworCQlyZXR2YWwgPSBzZWFyY2hfaXRlbShzLCAmbWF4X2NwdV9rZXksICZwYXRoKTsKKwkJaWYgKHJldHZhbCAhPSBJVEVNX05PVF9GT1VORCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInZzLTIxNDA6IGZpbmlzaF91bmZpbmlzaGVkOiBzZWFyY2hfYnlfa2V5IHJldHVybmVkICVkIiwKKwkJCQkJIHJldHZhbCk7CisJCQlicmVhazsKKwkJfQogCi0JaWYgKHRydW5jYXRlICYmIFNfSVNESVIgKGlub2RlLT5pX21vZGUpICkgewotCSAgICAvKiBXZSBnb3QgYSB0cnVuY2F0ZSByZXF1ZXN0IGZvciBhIGRpciB3aGljaCBpcyBpbXBvc3NpYmxlLgotCSAgICAgICBUaGUgb25seSBpbWFnaW5hYmxlIHdheSBpcyB0byBleGVjdXRlIHVuZmluaXNoZWQgdHJ1bmNhdGUgcmVxdWVzdAotCSAgICAgICB0aGVuIGJvb3QgaW50byBvbGQga2VybmVsLCByZW1vdmUgdGhlIGZpbGUgYW5kIGNyZWF0ZSBkaXIgd2l0aAotCSAgICAgICB0aGUgc2FtZSBrZXkuICovCi0JICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImdyZWVuLTIxMDE6IGltcG9zc2libGUgdHJ1bmNhdGUgb24gYSBkaXJlY3RvcnkgJWsuIFBsZWFzZSByZXBvcnQiLCBJTk9ERV9QS0VZIChpbm9kZSkpOwotCSAgICByZXR2YWwgPSByZW1vdmVfc2F2ZV9saW5rX29ubHkgKHMsICZzYXZlX2xpbmtfa2V5LCAwKTsKLQkgICAgdHJ1bmNhdGUgPSAwOwotCSAgICBpcHV0IChpbm9kZSk7IAotCSAgICBjb250aW51ZTsKKwkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCWl0ZW1fcG9zID0gZ2V0X2l0ZW1fcG9zKCZwYXRoKTsKKwkJaWYgKGl0ZW1fcG9zICE9IEJfTlJfSVRFTVMoYmgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAidnMtMjA2MDogZmluaXNoX3VuZmluaXNoZWQ6IHdyb25nIHBvc2l0aW9uIGZvdW5kIik7CisJCQlicmVhazsKKwkJfQorCQlpdGVtX3Bvcy0tOworCQlpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBpdGVtX3Bvcyk7CisKKwkJaWYgKGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19kaXJfaWQpICE9IE1BWF9LRVlfT0JKRUNUSUQpCisJCQkvKiB0aGVyZSBhcmUgbm8gInNhdmUiIGxpbmtzIGFueW1vcmUgKi8KKwkJCWJyZWFrOworCisJCXNhdmVfbGlua19rZXkgPSBpaC0+aWhfa2V5OworCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQorCQkJdHJ1bmNhdGUgPSAxOworCQllbHNlCisJCQl0cnVuY2F0ZSA9IDA7CisKKwkJLyogcmVpc2VyZnNfaWdldCBuZWVkcyBrX2RpcmlkIGFuZCBrX29iamVjdGlkIG9ubHkgKi8KKwkJaXRlbSA9IEJfSV9QSVRFTShiaCwgaWgpOworCQlvYmpfa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gbGUzMl90b19jcHUoKihfX2xlMzIgKikgaXRlbSk7CisJCW9ial9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9CisJCSAgICBsZTMyX3RvX2NwdShpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpOworCQlvYmpfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0ID0gMDsKKwkJb2JqX2tleS5vbl9kaXNrX2tleS5rX3R5cGUgPSAwOworCisJCXBhdGhyZWxzZSgmcGF0aCk7CisKKwkJaW5vZGUgPSByZWlzZXJmc19pZ2V0KHMsICZvYmpfa2V5KTsKKwkJaWYgKCFpbm9kZSkgeworCQkJLyogdGhlIHVubGluayBhbG1vc3QgY29tcGxldGVkLCBpdCBqdXN0IGRpZCBub3QgbWFuYWdlIHRvIHJlbW92ZQorCQkJICAgInNhdmUiIGxpbmsgYW5kIHJlbGVhc2Ugb2JqZWN0aWQgKi8KKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJ2cy0yMTgwOiBmaW5pc2hfdW5maW5pc2hlZDogaWdldCBmYWlsZWQgZm9yICVLIiwKKwkJCQkJICZvYmpfa2V5KTsKKwkJCXJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seShzLCAmc2F2ZV9saW5rX2tleSwgMSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghdHJ1bmNhdGUgJiYgaW5vZGUtPmlfbmxpbmspIHsKKwkJCS8qIGZpbGUgaXMgbm90IHVubGlua2VkICovCisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAidnMtMjE4NTogZmluaXNoX3VuZmluaXNoZWQ6IGZpbGUgJUsgaXMgbm90IHVubGlua2VkIiwKKwkJCQkJICZvYmpfa2V5KTsKKwkJCXJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seShzLCAmc2F2ZV9saW5rX2tleSwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlEUVVPVF9JTklUKGlub2RlKTsKKworCQlpZiAodHJ1bmNhdGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJLyogV2UgZ290IGEgdHJ1bmNhdGUgcmVxdWVzdCBmb3IgYSBkaXIgd2hpY2ggaXMgaW1wb3NzaWJsZS4KKwkJCSAgIFRoZSBvbmx5IGltYWdpbmFibGUgd2F5IGlzIHRvIGV4ZWN1dGUgdW5maW5pc2hlZCB0cnVuY2F0ZSByZXF1ZXN0CisJCQkgICB0aGVuIGJvb3QgaW50byBvbGQga2VybmVsLCByZW1vdmUgdGhlIGZpbGUgYW5kIGNyZWF0ZSBkaXIgd2l0aAorCQkJICAgdGhlIHNhbWUga2V5LiAqLworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgImdyZWVuLTIxMDE6IGltcG9zc2libGUgdHJ1bmNhdGUgb24gYSBkaXJlY3RvcnkgJWsuIFBsZWFzZSByZXBvcnQiLAorCQkJCQkgSU5PREVfUEtFWShpbm9kZSkpOworCQkJcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGlua19vbmx5KHMsICZzYXZlX2xpbmtfa2V5LCAwKTsKKwkJCXRydW5jYXRlID0gMDsKKwkJCWlwdXQoaW5vZGUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodHJ1bmNhdGUpIHsKKwkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9CisJCQkgICAgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7CisJCQkvKiBub3QgY29tcGxldGVkIHRydW5jYXRlIGZvdW5kLiBOZXcgc2l6ZSB3YXMgY29tbWl0dGVkIHRvZ2V0aGVyCisJCQkgICB3aXRoICJzYXZlIiBsaW5rICovCisJCQlyZWlzZXJmc19pbmZvKHMsICJUcnVuY2F0aW5nICVrIHRvICVMZCAuLiIsCisJCQkJICAgICAgSU5PREVfUEtFWShpbm9kZSksIGlub2RlLT5pX3NpemUpOworCQkJcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShpbm9kZSwKKwkJCQkJICAgICAgIDAKKwkJCQkJICAgICAgIC8qZG9uJ3QgdXBkYXRlIG1vZGlmaWNhdGlvbiB0aW1lICovCisJCQkJCSAgICAgICApOworCQkJcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGluayhpbm9kZSwgdHJ1bmNhdGUpOworCQl9IGVsc2UgeworCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3VubGlua19tYXNrOworCQkJLyogbm90IGNvbXBsZXRlZCB1bmxpbmsgKHJtZGlyKSBmb3VuZCAqLworCQkJcmVpc2VyZnNfaW5mbyhzLCAiUmVtb3ZpbmcgJWsuLiIsIElOT0RFX1BLRVkoaW5vZGUpKTsKKwkJCS8qIHJlbW92YWwgZ2V0cyBjb21wbGV0ZWQgaW4gaXB1dCAqLworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCWlwdXQoaW5vZGUpOworCQlwcmludGsoImRvbmVcbiIpOworCQlkb25lKys7CiAJfQotIAotICAgICAgICBpZiAodHJ1bmNhdGUpIHsKLSAgICAgICAgICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7Ci0gICAgICAgICAgICAvKiBub3QgY29tcGxldGVkIHRydW5jYXRlIGZvdW5kLiBOZXcgc2l6ZSB3YXMgY29tbWl0dGVkIHRvZ2V0aGVyCi0JICAgICAgIHdpdGggInNhdmUiIGxpbmsgKi8KLSAgICAgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJUcnVuY2F0aW5nICVrIHRvICVMZCAuLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTk9ERV9QS0VZIChpbm9kZSksIGlub2RlLT5pX3NpemUpOwotICAgICAgICAgICAgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZSAoaW5vZGUsIDAvKmRvbid0IHVwZGF0ZSBtb2RpZmljYXRpb24gdGltZSovKTsKLSAgICAgICAgICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmsgKGlub2RlLCB0cnVuY2F0ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzIHw9IGlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKLSAgICAgICAgICAgIC8qIG5vdCBjb21wbGV0ZWQgdW5saW5rIChybWRpcikgZm91bmQgKi8KLSAgICAgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJSZW1vdmluZyAlay4uIiwgSU5PREVfUEtFWSAoaW5vZGUpKTsKLSAgICAgICAgICAgIC8qIHJlbW92YWwgZ2V0cyBjb21wbGV0ZWQgaW4gaXB1dCAqLwotICAgICAgICAgICAgcmV0dmFsID0gMDsKLSAgICAgICAgfQotIAotICAgICAgICBpcHV0IChpbm9kZSk7Ci0gICAgICAgIHByaW50ayAoImRvbmVcbiIpOwotICAgICAgICBkb25lICsrOwotICAgIH0KLSAgICBSRUlTRVJGU19TQihzKS0+c19pc191bmxpbmtlZF9vayA9IDA7Ci0gICAgIAorCVJFSVNFUkZTX1NCKHMpLT5zX2lzX3VubGlua2VkX29rID0gMDsKKwogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIC8qIFR1cm4gcXVvdGFzIG9mZiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgewotICAgICAgICAgICAgaWYgKHNiX2Rxb3B0KHMpLT5maWxlc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgdmZzX3F1b3RhX29mZl9tb3VudChzLCBpKTsKLSAgICB9Ci0gICAgaWYgKG1zX2FjdGl2ZV9zZXQpCi0JICAgIC8qIFJlc3RvcmUgdGhlIGZsYWcgYmFjayAqLwotCSAgICBzLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CisJLyogVHVybiBxdW90YXMgb2ZmICovCisJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKSB7CisJCWlmIChzYl9kcW9wdChzKS0+ZmlsZXNbaV0pCisJCQl2ZnNfcXVvdGFfb2ZmX21vdW50KHMsIGkpOworCX0KKwlpZiAobXNfYWN0aXZlX3NldCkKKwkJLyogUmVzdG9yZSB0aGUgZmxhZyBiYWNrICovCisJCXMtPnNfZmxhZ3MgJj0gfk1TX0FDVElWRTsKICNlbmRpZgotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIGlmIChkb25lKQotICAgICAgICByZWlzZXJmc19pbmZvIChzLCAiVGhlcmUgd2VyZSAlZCB1bmNvbXBsZXRlZCB1bmxpbmtzL3RydW5jYXRlcy4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxldGVkXG4iLCBkb25lKTsKLSAgICByZXR1cm4gcmV0dmFsOworCXBhdGhyZWxzZSgmcGF0aCk7CisJaWYgKGRvbmUpCisJCXJlaXNlcmZzX2luZm8ocywgIlRoZXJlIHdlcmUgJWQgdW5jb21wbGV0ZWQgdW5saW5rcy90cnVuY2F0ZXMuICIKKwkJCSAgICAgICJDb21wbGV0ZWRcbiIsIGRvbmUpOworCXJldHVybiByZXR2YWw7CiB9Ci0gCisKIC8qIHRvIHByb3RlY3QgZmlsZSBiZWluZyB1bmxpbmtlZCBmcm9tIGdldHRpbmcgbG9zdCB3ZSAic2FmZSIgbGluayBmaWxlcwogICAgYmVpbmcgdW5saW5rZWQuIFRoaXMgbGluayB3aWxsIGJlIGRlbGV0ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gd2l0aCBsYXN0CiAgICBpdGVtIG9mIGZpbGUuIG1vdW50aW5nIHRoZSBmaWxlc3l0ZW0gd2Ugc2NhbiBhbGwgdGhlc2UgbGlua3MgYW5kIHJlbW92ZQogICAgZmlsZXMgd2hpY2ggYWxtb3N0IGdvdCBsb3N0ICovCi12b2lkIGFkZF9zYXZlX2xpbmsgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiB0aCwKLQkJICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdHJ1bmNhdGUpCit2b2lkIGFkZF9zYXZlX2xpbmsoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0cnVuY2F0ZSkKIHsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOwotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIHN0cnVjdCBpdGVtX2hlYWQgaWg7Ci0gICAgX19sZTMyIGxpbms7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCWludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBpdGVtX2hlYWQgaWg7CisJX19sZTMyIGxpbms7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICAvKiBmaWxlIGNhbiBvbmx5IGdldCBvbmUgInNhdmUgbGluayIgb2YgZWFjaCBraW5kICovCi0gICAgUkZBTFNFKCB0cnVuY2F0ZSAmJiAKLQkgICAgKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICYgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2sgKSwKLQkgICAgInNhdmVkIGxpbmsgYWxyZWFkeSBleGlzdHMgZm9yIHRydW5jYXRlZCBpbm9kZSAlbHgiLAotCSAgICAoIGxvbmcgKSBpbm9kZSAtPiBpX2lubyApOwotICAgIFJGQUxTRSggIXRydW5jYXRlICYmIAotCSAgICAoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2sgKSwKLQkgICAgInNhdmVkIGxpbmsgYWxyZWFkeSBleGlzdHMgZm9yIHVubGlua2VkIGlub2RlICVseCIsCi0JICAgICggbG9uZyApIGlub2RlIC0+IGlfaW5vICk7CisJLyogZmlsZSBjYW4gb25seSBnZXQgb25lICJzYXZlIGxpbmsiIG9mIGVhY2gga2luZCAqLworCVJGQUxTRSh0cnVuY2F0ZSAmJgorCSAgICAgICAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzayksCisJICAgICAgICJzYXZlZCBsaW5rIGFscmVhZHkgZXhpc3RzIGZvciB0cnVuY2F0ZWQgaW5vZGUgJWx4IiwKKwkgICAgICAgKGxvbmcpaW5vZGUtPmlfaW5vKTsKKwlSRkFMU0UoIXRydW5jYXRlICYmCisJICAgICAgIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbGlua19zYXZlZF91bmxpbmtfbWFzayksCisJICAgICAgICJzYXZlZCBsaW5rIGFscmVhZHkgZXhpc3RzIGZvciB1bmxpbmtlZCBpbm9kZSAlbHgiLAorCSAgICAgICAobG9uZylpbm9kZS0+aV9pbm8pOwogCi0gICAgLyogc2V0dXAga2V5IG9mICJzYXZlIiBsaW5rICovCi0gICAga2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKLSAgICBrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBNQVhfS0VZX09CSkVDVElEOwotICAgIGtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOwotICAgIGlmICghdHJ1bmNhdGUpIHsKLQkvKiB1bmxpbmssIHJtZGlyLCByZW5hbWUgKi8KLQlzZXRfY3B1X2tleV9rX29mZnNldCAoJmtleSwgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7Ci0Jc2V0X2NwdV9rZXlfa190eXBlICgma2V5LCBUWVBFX0RJUkVDVCk7CisJLyogc2V0dXAga2V5IG9mICJzYXZlIiBsaW5rICovCisJa2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKwlrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBNQVhfS0VZX09CSkVDVElEOworCWtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCWlmICghdHJ1bmNhdGUpIHsKKwkJLyogdW5saW5rLCBybWRpciwgcmVuYW1lICovCisJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQlzZXRfY3B1X2tleV9rX3R5cGUoJmtleSwgVFlQRV9ESVJFQ1QpOwogCi0JLyogaXRlbSBoZWFkIG9mICJzYWZlIiBsaW5rICovCi0JbWFrZV9sZV9pdGVtX2hlYWQgKCZpaCwgJmtleSwga2V5LnZlcnNpb24sIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsIFRZUEVfRElSRUNULAotCQkJICAgNC8qbGVuZ3RoKi8sIDB4ZmZmZi8qZnJlZSBzcGFjZSovKTsKLSAgICB9IGVsc2UgewotCS8qIHRydW5jYXRlICovCi0JaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpKQotCSAgICByZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAiZ3JlZW4tMjEwMjogQWRkaW5nIGEgdHJ1bmNhdGUgc2F2ZWxpbmsgZm9yIGEgZGlyZWN0b3J5ICVrISBQbGVhc2UgcmVwb3J0IiwgSU5PREVfUEtFWShpbm9kZSkpOwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgma2V5LCAxKTsKLQlzZXRfY3B1X2tleV9rX3R5cGUgKCZrZXksIFRZUEVfSU5ESVJFQ1QpOworCQkvKiBpdGVtIGhlYWQgb2YgInNhZmUiIGxpbmsgKi8KKwkJbWFrZV9sZV9pdGVtX2hlYWQoJmloLCAma2V5LCBrZXkudmVyc2lvbiwKKwkJCQkgIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsIFRZUEVfRElSRUNULAorCQkJCSAgNCAvKmxlbmd0aCAqLyAsIDB4ZmZmZiAvKmZyZWUgc3BhY2UgKi8gKTsKKwl9IGVsc2UgeworCQkvKiB0cnVuY2F0ZSAqLworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAiZ3JlZW4tMjEwMjogQWRkaW5nIGEgdHJ1bmNhdGUgc2F2ZWxpbmsgZm9yIGEgZGlyZWN0b3J5ICVrISBQbGVhc2UgcmVwb3J0IiwKKwkJCQkJIElOT0RFX1BLRVkoaW5vZGUpKTsKKwkJc2V0X2NwdV9rZXlfa19vZmZzZXQoJmtleSwgMSk7CisJCXNldF9jcHVfa2V5X2tfdHlwZSgma2V5LCBUWVBFX0lORElSRUNUKTsKIAotCS8qIGl0ZW0gaGVhZCBvZiAic2FmZSIgbGluayAqLwotCW1ha2VfbGVfaXRlbV9oZWFkICgmaWgsICZrZXksIGtleS52ZXJzaW9uLCAxLCBUWVBFX0lORElSRUNULAotCQkJICAgNC8qbGVuZ3RoKi8sIDAvKmZyZWUgc3BhY2UqLyk7Ci0gICAgfQotICAgIGtleS5rZXlfbGVuZ3RoID0gMzsKKwkJLyogaXRlbSBoZWFkIG9mICJzYWZlIiBsaW5rICovCisJCW1ha2VfbGVfaXRlbV9oZWFkKCZpaCwgJmtleSwga2V5LnZlcnNpb24sIDEsIFRZUEVfSU5ESVJFQ1QsCisJCQkJICA0IC8qbGVuZ3RoICovICwgMCAvKmZyZWUgc3BhY2UgKi8gKTsKKwl9CisJa2V5LmtleV9sZW5ndGggPSAzOwogCi0gICAgLyogbG9vayBmb3IgaXRzIHBsYWNlIGluIHRoZSB0cmVlICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0gICAgaWYgKHJldHZhbCAhPSBJVEVNX05PVF9GT1VORCkgewotCWlmICggcmV0dmFsICE9IC1FTk9TUEMgKQotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTIxMDA6IGFkZF9zYXZlX2xpbms6IgotCQkJICAic2VhcmNoX2J5X2tleSAoJUspIHJldHVybmVkICVkIiwgJmtleSwgcmV0dmFsKTsKLQlwYXRocmVsc2UgKCZwYXRoKTsKLQlyZXR1cm47Ci0gICAgfQorCS8qIGxvb2sgZm9yIGl0cyBwbGFjZSBpbiB0aGUgdHJlZSAqLworCXJldHZhbCA9IHNlYXJjaF9pdGVtKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJldHZhbCAhPSBJVEVNX05PVF9GT1VORCkgeworCQlpZiAocmV0dmFsICE9IC1FTk9TUEMpCisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAidnMtMjEwMDogYWRkX3NhdmVfbGluazoiCisJCQkJCSAic2VhcmNoX2J5X2tleSAoJUspIHJldHVybmVkICVkIiwgJmtleSwKKwkJCQkJIHJldHZhbCk7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCXJldHVybjsKKwl9CiAKLSAgICAvKiBib2R5IG9mICJzYXZlIiBsaW5rICovCi0gICAgbGluayA9IElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQ7CisJLyogYm9keSBvZiAic2F2ZSIgbGluayAqLworCWxpbmsgPSBJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQ7CiAKLSAgICAvKiBwdXQgInNhdmUiIGxpbmsgaW5vdCB0cmVlLCBkb24ndCBjaGFyZ2UgcXVvdGEgdG8gYW55b25lICovCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCAmcGF0aCwgJmtleSwgJmloLCBOVUxMLCAoY2hhciAqKSZsaW5rKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0JaWYgKHJldHZhbCAhPSAtRU5PU1BDKQotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTIxMjA6IGFkZF9zYXZlX2xpbms6IGluc2VydF9pdGVtIHJldHVybmVkICVkIiwKLQkJCSAgcmV0dmFsKTsKLSAgICB9IGVsc2UgewotCWlmKCB0cnVuY2F0ZSApCi0JICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7Ci0JZWxzZQotCSAgICBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzIHw9IGlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKLSAgICB9CisJLyogcHV0ICJzYXZlIiBsaW5rIGlub3QgdHJlZSwgZG9uJ3QgY2hhcmdlIHF1b3RhIHRvIGFueW9uZSAqLworCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCAmcGF0aCwgJmtleSwgJmloLCBOVUxMLCAoY2hhciAqKSZsaW5rKTsKKwlpZiAocmV0dmFsKSB7CisJCWlmIChyZXR2YWwgIT0gLUVOT1NQQykKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAidnMtMjEyMDogYWRkX3NhdmVfbGluazogaW5zZXJ0X2l0ZW0gcmV0dXJuZWQgJWQiLAorCQkJCQkgcmV0dmFsKTsKKwl9IGVsc2UgeworCQlpZiAodHJ1bmNhdGUpCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PQorCQkJICAgIGlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrOworCQllbHNlCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2s7CisJfQogfQogCi0KIC8qIHRoaXMgb3BlbnMgdHJhbnNhY3Rpb24gdW5saWtlIGFkZF9zYXZlX2xpbmsgKi8KLWludCByZW1vdmVfc2F2ZV9saW5rIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHRydW5jYXRlKQoraW50IHJlbW92ZV9zYXZlX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHRydW5jYXRlKQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2tleSBrZXk7Ci0gICAgaW50IGVycjsKLSAKLSAgICAvKiB3ZSBhcmUgZ29pbmcgdG8gZG8gb25lIGJhbGFuY2luZyBvbmx5ICovCi0gICAgZXJyID0gam91cm5hbF9iZWdpbiAoJnRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOwotICAgIGlmIChlcnIpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gCi0gICAgLyogc2V0dXAga2V5IG9mICJzYXZlIiBsaW5rICovCi0gICAga2V5LmtfZGlyX2lkID0gY3B1X3RvX2xlMzIgKE1BWF9LRVlfT0JKRUNUSUQpOwotICAgIGtleS5rX29iamVjdGlkID0gSU5PREVfUEtFWSAoaW5vZGUpLT5rX29iamVjdGlkOwotICAgIGlmICghdHJ1bmNhdGUpIHsKLSAgICAgICAgLyogdW5saW5rLCBybWRpciwgcmVuYW1lICovCi0gICAgICAgIHNldF9sZV9rZXlfa19vZmZzZXQgKEtFWV9GT1JNQVRfM181LCAma2V5LAotCQkJICAgICAxICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLSAgICAgICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCAma2V5LCBUWVBFX0RJUkVDVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogdHJ1bmNhdGUgKi8KLSAgICAgICAgc2V0X2xlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsICZrZXksIDEpOwotICAgICAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsICZrZXksIFRZUEVfSU5ESVJFQ1QpOwotICAgIH0KLSAKLSAgICBpZiggKCB0cnVuY2F0ZSAmJiAKLSAgICAgICAgICAoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzayApICkgfHwKLSAgICAgICAgKCAhdHJ1bmNhdGUgJiYgCi0gICAgICAgICAgKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICYgaV9saW5rX3NhdmVkX3VubGlua19tYXNrICkgKSApCi0JLyogZG9uJ3QgdGFrZSBxdW90YSBieXRlcyBmcm9tIGFueXdoZXJlICovCi0JcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKCZ0aCwgTlVMTCwgJmtleSk7Ci0gICAgaWYgKCF0cnVuY2F0ZSkgewotCXJlaXNlcmZzX3JlbGVhc2Vfb2JqZWN0aWQgKCZ0aCwgaW5vZGUtPmlfaW5vKTsKLQlSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICY9IH5pX2xpbmtfc2F2ZWRfdW5saW5rX21hc2s7Ci0gICAgfSBlbHNlCi0JUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyAmPSB+aV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7Ci0gCi0gICAgcmV0dXJuIGpvdXJuYWxfZW5kICgmdGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlzdHJ1Y3QgcmVpc2VyZnNfa2V5IGtleTsKKwlpbnQgZXJyOworCisJLyogd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBiYWxhbmNpbmcgb25seSAqLworCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBzZXR1cCBrZXkgb2YgInNhdmUiIGxpbmsgKi8KKwlrZXkua19kaXJfaWQgPSBjcHVfdG9fbGUzMihNQVhfS0VZX09CSkVDVElEKTsKKwlrZXkua19vYmplY3RpZCA9IElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkOworCWlmICghdHJ1bmNhdGUpIHsKKwkJLyogdW5saW5rLCBybWRpciwgcmVuYW1lICovCisJCXNldF9sZV9rZXlfa19vZmZzZXQoS0VZX0ZPUk1BVF8zXzUsICZrZXksCisJCQkJICAgIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQlzZXRfbGVfa2V5X2tfdHlwZShLRVlfRk9STUFUXzNfNSwgJmtleSwgVFlQRV9ESVJFQ1QpOworCX0gZWxzZSB7CisJCS8qIHRydW5jYXRlICovCisJCXNldF9sZV9rZXlfa19vZmZzZXQoS0VZX0ZPUk1BVF8zXzUsICZrZXksIDEpOworCQlzZXRfbGVfa2V5X2tfdHlwZShLRVlfRk9STUFUXzNfNSwgJmtleSwgVFlQRV9JTkRJUkVDVCk7CisJfQorCisJaWYgKCh0cnVuY2F0ZSAmJgorCSAgICAgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2spKSB8fAorCSAgICAoIXRydW5jYXRlICYmCisJICAgICAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2spKSkKKwkJLyogZG9uJ3QgdGFrZSBxdW90YSBieXRlcyBmcm9tIGFueXdoZXJlICovCisJCXJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtKCZ0aCwgTlVMTCwgJmtleSk7CisJaWYgKCF0cnVuY2F0ZSkgeworCQlyZWlzZXJmc19yZWxlYXNlX29iamVjdGlkKCZ0aCwgaW5vZGUtPmlfaW5vKTsKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKKwl9IGVsc2UKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrOworCisJcmV0dXJuIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKIH0KIAotCi1zdGF0aWMgdm9pZCByZWlzZXJmc19wdXRfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCitzdGF0aWMgdm9pZCByZWlzZXJmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICBpbnQgaTsKLSAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gIHRoLnRfdHJhbnNfaWQgPSAwOworCWludCBpOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJdGgudF90cmFuc19pZCA9IDA7CiAKLSAgaWYgKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KSB7Ci0gICAgZF9pbnZhbGlkYXRlIChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7Ci0gICAgZHB1dCAoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpOwotICB9Ci0gIAotICBpZiAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCkgewotICAgIGRfaW52YWxpZGF0ZSAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7Ci0gICAgZHB1dCAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7Ci0gIH0KKwlpZiAoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpIHsKKwkJZF9pbnZhbGlkYXRlKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KTsKKwkJZHB1dChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CisJfQogCi0gIC8qIGNoYW5nZSBmaWxlIHN5c3RlbSBzdGF0ZSB0byBjdXJyZW50IHN0YXRlIGlmIGl0IHdhcyBtb3VudGVkIHdpdGggcmVhZC13cml0ZSBwZXJtaXNzaW9ucyAqLwotICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotICAgIGlmICgham91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSkgewotICAgICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7Ci0gICAgICAgIHNldF9zYl91bW91bnRfc3RhdGUoIFNCX0RJU0tfU1VQRVJfQkxPQ0socyksIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICk7Ci0gICAgICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgfQotICB9CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKKwkJZF9pbnZhbGlkYXRlKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOworCQlkcHV0KFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOworCX0KIAotICAvKiBub3RlLCBqb3VybmFsX3JlbGVhc2UgY2hlY2tzIGZvciByZWFkb25seSBtb3VudCwgYW5kIGNhbiBkZWNpZGUgbm90Ci0gICoqIHRvIGRvIGEgam91cm5hbF9lbmQKLSAgKi8KLSAgam91cm5hbF9yZWxlYXNlKCZ0aCwgcykgOworCS8qIGNoYW5nZSBmaWxlIHN5c3RlbSBzdGF0ZSB0byBjdXJyZW50IHN0YXRlIGlmIGl0IHdhcyBtb3VudGVkIHdpdGggcmVhZC13cml0ZSBwZXJtaXNzaW9ucyAqLworCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWlmICgham91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSkgeworCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwKKwkJCQkJCSAgICAgMSk7CisJCQlzZXRfc2JfdW1vdW50X3N0YXRlKFNCX0RJU0tfU1VQRVJfQkxPQ0socyksCisJCQkJCSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSk7CisJCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCX0KKwl9CiAKLSAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIgKHMpOyBpICsrKQotICAgIGJyZWxzZSAoU0JfQVBfQklUTUFQIChzKVtpXS5iaCk7CisJLyogbm90ZSwgam91cm5hbF9yZWxlYXNlIGNoZWNrcyBmb3IgcmVhZG9ubHkgbW91bnQsIGFuZCBjYW4gZGVjaWRlIG5vdAorCSAqKiB0byBkbyBhIGpvdXJuYWxfZW5kCisJICovCisJam91cm5hbF9yZWxlYXNlKCZ0aCwgcyk7CiAKLSAgdmZyZWUgKFNCX0FQX0JJVE1BUCAocykpOworCWZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspCisJCWJyZWxzZShTQl9BUF9CSVRNQVAocylbaV0uYmgpOwogCi0gIGJyZWxzZSAoU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKwl2ZnJlZShTQl9BUF9CSVRNQVAocykpOwogCi0gIHByaW50X3N0YXRpc3RpY3MgKHMpOworCWJyZWxzZShTQl9CVUZGRVJfV0lUSF9TQihzKSk7CiAKLSAgaWYgKFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzICE9IDApIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjAwNDogcmVpc2VyZnNfcHV0X3N1cGVyOiBhbGxvY2F0ZWQgbWVtb3J5IGxlZnQgJWQiLAotCQkgICAgICBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7Ci0gIH0KKwlwcmludF9zdGF0aXN0aWNzKHMpOwogCi0gIGlmIChSRUlTRVJGU19TQihzKS0+cmVzZXJ2ZWRfYmxvY2tzICE9IDApIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiZ3JlZW4tMjAwNTogcmVpc2VyZnNfcHV0X3N1cGVyOiByZXNlcnZlZCBibG9ja3MgbGVmdCAlZCIsCi0JCSAgICAgIFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MpOwotICB9CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzICE9IDApIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAidnMtMjAwNDogcmVpc2VyZnNfcHV0X3N1cGVyOiBhbGxvY2F0ZWQgbWVtb3J5IGxlZnQgJWQiLAorCQkJCSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7CisJfQogCi0gIHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKCBzICk7CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJICJncmVlbi0yMDA1OiByZWlzZXJmc19wdXRfc3VwZXI6IHJlc2VydmVkIGJsb2NrcyBsZWZ0ICVkIiwKKwkJCQkgUkVJU0VSRlNfU0IocyktPnJlc2VydmVkX2Jsb2Nrcyk7CisJfQogCi0gIGtmcmVlKHMtPnNfZnNfaW5mbyk7Ci0gIHMtPnNfZnNfaW5mbyA9IE5VTEw7CisJcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUocyk7CiAKLSAgcmV0dXJuOworCWtmcmVlKHMtPnNfZnNfaW5mbyk7CisJcy0+c19mc19pbmZvID0gTlVMTDsKKworCXJldHVybjsKIH0KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIHJlaXNlcmZzX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnJlaXNlcmZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqcmVpc2VyZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHJlaXNlcmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVpID0gKHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICopCisJICAgIGttZW1fY2FjaGVfYWxsb2MocmVpc2VyZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwpAQCAtNDg4LDI1ICs1MDksMjYgQEAKIAlrbWVtX2NhY2hlX2ZyZWUocmVpc2VyZnNfaW5vZGVfY2FjaGVwLCBSRUlTRVJGU19JKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Jc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICopIGZvbzsKKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKilmb287CiAKLQlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRlkgfCBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQogCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX3ByZWFsbG9jX2xpc3QpIDsKKwkJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX3ByZWFsbG9jX2xpc3QpOwogCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOwogCQllaS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKIAkJZWktPmlfYWNsX2RlZmF1bHQgPSBOVUxMOwogCX0KIH0KLSAKKwogc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKIHsKIAlyZWlzZXJmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicmVpc2VyX2lub2RlX2NhY2hlIiwKLQkJCQkJICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8pLAotCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAotCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJCQkJCQkgIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkgcmVpc2VyZnNfaW5vZGVfaW5mbyksCisJCQkJCQkgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkJICBpbml0X29uY2UsIE5VTEwpOwogCWlmIChyZWlzZXJmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CkBAIC01MTUsNzIgKzUzNyw3NiBAQAogc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCiB7CiAJaWYgKGttZW1fY2FjaGVfZGVzdHJveShyZWlzZXJmc19pbm9kZV9jYWNoZXApKQotCQlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAicmVpc2VyZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkIik7CisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkgInJlaXNlcmZzX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZCIpOwogfQogCiAvKiB3ZSBkb24ndCBtYXJrIGlub2RlcyBkaXJ0eSwgd2UganVzdCBsb2cgdGhlbSAqLwotc3RhdGljIHZvaWQgcmVpc2VyZnNfZGlydHlfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CitzdGF0aWMgdm9pZCByZWlzZXJmc19kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CiAKLSAgICBpbnQgZXJyID0gMDsKLSAgICBpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgImNsbS02MDA2OiB3cml0aW5nIGlub2RlICVsdSBvbiByZWFkb25seSBGUyIsCi0JICAgICAgICAgICAgICAgICAgaW5vZGUtPmlfaW5vKSA7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWludCBlcnIgPSAwOworCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAiY2xtLTYwMDY6IHdyaXRpbmcgaW5vZGUgJWx1IG9uIHJlYWRvbmx5IEZTIiwKKwkJCQkgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuOworCX0KKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAotICAgIC8qIHRoaXMgaXMgcmVhbGx5IG9ubHkgdXNlZCBmb3IgYXRpbWUgdXBkYXRlcywgc28gdGhleSBkb24ndCBoYXZlCi0gICAgKiogdG8gYmUgaW5jbHVkZWQgaW4gT19TWU5DIG9yIGZzeW5jCi0gICAgKi8KLSAgICBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDEpIDsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoaW5vZGUtPmlfc2IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0gICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMSkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJLyogdGhpcyBpcyByZWFsbHkgb25seSB1c2VkIGZvciBhdGltZSB1cGRhdGVzLCBzbyB0aGV5IGRvbid0IGhhdmUKKwkgKiogdG8gYmUgaW5jbHVkZWQgaW4gT19TWU5DIG9yIGZzeW5jCisJICovCisJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAxKTsKKwlpZiAoZXJyKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCXJldHVybjsKKwl9CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOworCWpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiB9CiAKLXN0YXRpYyB2b2lkIHJlaXNlcmZzX2NsZWFyX2lub2RlIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIHZvaWQgcmVpc2VyZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCi0gICAgYWNsID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzczsKLSAgICBpZiAoYWNsICYmICFJU19FUlIgKGFjbCkpCi0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2wpOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOworCWFjbCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3M7CisJaWYgKGFjbCAmJiAhSVNfRVJSKGFjbCkpCisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzcyA9IE5VTEw7CiAKLSAgICBhY2wgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdDsKLSAgICBpZiAoYWNsICYmICFJU19FUlIgKGFjbCkpCi0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2wpOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKKwlhY2wgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdDsKKwlpZiAoYWNsICYmICFJU19FUlIoYWNsKSkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7CiB9CiAKICNpZmRlZiBDT05GSUdfUVVPVEEKLXN0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QpOwotc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjaGFyICosIHNpemVfdCwgbG9mZl90KTsKK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwKKwkJCQkgICAgc2l6ZV90LCBsb2ZmX3QpOworc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjaGFyICosIHNpemVfdCwKKwkJCQkgICBsb2ZmX3QpOwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByZWlzZXJmc19zb3BzID0KLXsKLSAgLmFsbG9jX2lub2RlID0gcmVpc2VyZnNfYWxsb2NfaW5vZGUsCi0gIC5kZXN0cm95X2lub2RlID0gcmVpc2VyZnNfZGVzdHJveV9pbm9kZSwKLSAgLndyaXRlX2lub2RlID0gcmVpc2VyZnNfd3JpdGVfaW5vZGUsCi0gIC5kaXJ0eV9pbm9kZSA9IHJlaXNlcmZzX2RpcnR5X2lub2RlLAotICAuZGVsZXRlX2lub2RlID0gcmVpc2VyZnNfZGVsZXRlX2lub2RlLAotICAuY2xlYXJfaW5vZGUgID0gcmVpc2VyZnNfY2xlYXJfaW5vZGUsCi0gIC5wdXRfc3VwZXIgPSByZWlzZXJmc19wdXRfc3VwZXIsCi0gIC53cml0ZV9zdXBlciA9IHJlaXNlcmZzX3dyaXRlX3N1cGVyLAotICAuc3luY19mcyA9IHJlaXNlcmZzX3N5bmNfZnMsCi0gIC53cml0ZV9zdXBlcl9sb2NrZnMgPSByZWlzZXJmc193cml0ZV9zdXBlcl9sb2NrZnMsCi0gIC51bmxvY2tmcyA9IHJlaXNlcmZzX3VubG9ja2ZzLAotICAuc3RhdGZzID0gcmVpc2VyZnNfc3RhdGZzLAotICAucmVtb3VudF9mcyA9IHJlaXNlcmZzX3JlbW91bnQsCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcmVpc2VyZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUgPSByZWlzZXJmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSA9IHJlaXNlcmZzX2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlID0gcmVpc2VyZnNfd3JpdGVfaW5vZGUsCisJLmRpcnR5X2lub2RlID0gcmVpc2VyZnNfZGlydHlfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZSA9IHJlaXNlcmZzX2RlbGV0ZV9pbm9kZSwKKwkuY2xlYXJfaW5vZGUgPSByZWlzZXJmc19jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyID0gcmVpc2VyZnNfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlciA9IHJlaXNlcmZzX3dyaXRlX3N1cGVyLAorCS5zeW5jX2ZzID0gcmVpc2VyZnNfc3luY19mcywKKwkud3JpdGVfc3VwZXJfbG9ja2ZzID0gcmVpc2VyZnNfd3JpdGVfc3VwZXJfbG9ja2ZzLAorCS51bmxvY2tmcyA9IHJlaXNlcmZzX3VubG9ja2ZzLAorCS5zdGF0ZnMgPSByZWlzZXJmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMgPSByZWlzZXJmc19yZW1vdW50LAogI2lmZGVmIENPTkZJR19RVU9UQQotICAucXVvdGFfcmVhZCA9IHJlaXNlcmZzX3F1b3RhX3JlYWQsCi0gIC5xdW90YV93cml0ZSA9IHJlaXNlcmZzX3F1b3RhX3dyaXRlLAorCS5xdW90YV9yZWFkID0gcmVpc2VyZnNfcXVvdGFfcmVhZCwKKwkucXVvdGFfd3JpdGUgPSByZWlzZXJmc19xdW90YV93cml0ZSwKICNlbmRpZgogfTsKIApAQCAtNTk2LDUwICs2MjIsNDggQEAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50LCBjaGFyICopOwogCi1zdGF0aWMgc3RydWN0IGRxdW90X29wZXJhdGlvbnMgcmVpc2VyZnNfcXVvdGFfb3BlcmF0aW9ucyA9Ci17Ci0gIC5pbml0aWFsaXplID0gcmVpc2VyZnNfZHF1b3RfaW5pdGlhbGl6ZSwKLSAgLmRyb3AgPSByZWlzZXJmc19kcXVvdF9kcm9wLAotICAuYWxsb2Nfc3BhY2UgPSBkcXVvdF9hbGxvY19zcGFjZSwKLSAgLmFsbG9jX2lub2RlID0gZHF1b3RfYWxsb2NfaW5vZGUsCi0gIC5mcmVlX3NwYWNlID0gZHF1b3RfZnJlZV9zcGFjZSwKLSAgLmZyZWVfaW5vZGUgPSBkcXVvdF9mcmVlX2lub2RlLAotICAudHJhbnNmZXIgPSBkcXVvdF90cmFuc2ZlciwKLSAgLndyaXRlX2RxdW90ID0gcmVpc2VyZnNfd3JpdGVfZHF1b3QsCi0gIC5hY3F1aXJlX2RxdW90ID0gcmVpc2VyZnNfYWNxdWlyZV9kcXVvdCwKLSAgLnJlbGVhc2VfZHF1b3QgPSByZWlzZXJmc19yZWxlYXNlX2RxdW90LAotICAubWFya19kaXJ0eSA9IHJlaXNlcmZzX21hcmtfZHF1b3RfZGlydHksCi0gIC53cml0ZV9pbmZvID0gcmVpc2VyZnNfd3JpdGVfaW5mbywKK3N0YXRpYyBzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyByZWlzZXJmc19xdW90YV9vcGVyYXRpb25zID0geworCS5pbml0aWFsaXplID0gcmVpc2VyZnNfZHF1b3RfaW5pdGlhbGl6ZSwKKwkuZHJvcCA9IHJlaXNlcmZzX2RxdW90X2Ryb3AsCisJLmFsbG9jX3NwYWNlID0gZHF1b3RfYWxsb2Nfc3BhY2UsCisJLmFsbG9jX2lub2RlID0gZHF1b3RfYWxsb2NfaW5vZGUsCisJLmZyZWVfc3BhY2UgPSBkcXVvdF9mcmVlX3NwYWNlLAorCS5mcmVlX2lub2RlID0gZHF1b3RfZnJlZV9pbm9kZSwKKwkudHJhbnNmZXIgPSBkcXVvdF90cmFuc2ZlciwKKwkud3JpdGVfZHF1b3QgPSByZWlzZXJmc193cml0ZV9kcXVvdCwKKwkuYWNxdWlyZV9kcXVvdCA9IHJlaXNlcmZzX2FjcXVpcmVfZHF1b3QsCisJLnJlbGVhc2VfZHF1b3QgPSByZWlzZXJmc19yZWxlYXNlX2RxdW90LAorCS5tYXJrX2RpcnR5ID0gcmVpc2VyZnNfbWFya19kcXVvdF9kaXJ0eSwKKwkud3JpdGVfaW5mbyA9IHJlaXNlcmZzX3dyaXRlX2luZm8sCiB9OwogCi1zdGF0aWMgc3RydWN0IHF1b3RhY3RsX29wcyByZWlzZXJmc19xY3RsX29wZXJhdGlvbnMgPQotewotICAucXVvdGFfb24gPSByZWlzZXJmc19xdW90YV9vbiwKLSAgLnF1b3RhX29mZiA9IHZmc19xdW90YV9vZmYsCi0gIC5xdW90YV9zeW5jID0gdmZzX3F1b3RhX3N5bmMsCi0gIC5nZXRfaW5mbyA9IHZmc19nZXRfZHFpbmZvLAotICAuc2V0X2luZm8gPSB2ZnNfc2V0X2RxaW5mbywKLSAgLmdldF9kcWJsayA9IHZmc19nZXRfZHFibGssCi0gIC5zZXRfZHFibGsgPSB2ZnNfc2V0X2RxYmxrLAorc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgcmVpc2VyZnNfcWN0bF9vcGVyYXRpb25zID0geworCS5xdW90YV9vbiA9IHJlaXNlcmZzX3F1b3RhX29uLAorCS5xdW90YV9vZmYgPSB2ZnNfcXVvdGFfb2ZmLAorCS5xdW90YV9zeW5jID0gdmZzX3F1b3RhX3N5bmMsCisJLmdldF9pbmZvID0gdmZzX2dldF9kcWluZm8sCisJLnNldF9pbmZvID0gdmZzX3NldF9kcWluZm8sCisJLmdldF9kcWJsayA9IHZmc19nZXRfZHFibGssCisJLnNldF9kcWJsayA9IHZmc19zZXRfZHFibGssCiB9OwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgcmVpc2VyZnNfZXhwb3J0X29wcyA9IHsKLSAgLmVuY29kZV9maCA9IHJlaXNlcmZzX2VuY29kZV9maCwKLSAgLmRlY29kZV9maCA9IHJlaXNlcmZzX2RlY29kZV9maCwKLSAgLmdldF9wYXJlbnQgPSByZWlzZXJmc19nZXRfcGFyZW50LAotICAuZ2V0X2RlbnRyeSA9IHJlaXNlcmZzX2dldF9kZW50cnksCi19IDsKKwkuZW5jb2RlX2ZoID0gcmVpc2VyZnNfZW5jb2RlX2ZoLAorCS5kZWNvZGVfZmggPSByZWlzZXJmc19kZWNvZGVfZmgsCisJLmdldF9wYXJlbnQgPSByZWlzZXJmc19nZXRfcGFyZW50LAorCS5nZXRfZGVudHJ5ID0gcmVpc2VyZnNfZ2V0X2RlbnRyeSwKK307CiAKIC8qIHRoaXMgc3RydWN0IGlzIHVzZWQgaW4gcmVpc2VyZnNfZ2V0b3B0ICgpIGZvciBjb250YWluaW5nIHRoZSB2YWx1ZSBmb3IgdGhvc2UKICAgIG1vdW50IG9wdGlvbnMgdGhhdCBoYXZlIHZhbHVlcyByYXRoZXIgdGhhbiBiZWluZyB0b2dnbGVzLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKiB2YWx1ZTsKLSAgICBpbnQgc2V0bWFzazsgLyogYml0bWFzayB3aGljaCBpcyB0byBzZXQgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gdGhpcwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiAqLwotICAgIGludCBjbHJtYXNrOyAvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIGNsZWFyIG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuICB0aGlzCi0JCSAgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiBUaGlzIGlzCi0JCSAgICBhcHBsaWVkIEJFRk9SRSBzZXRtYXNrICovCisJY2hhciAqdmFsdWU7CisJaW50IHNldG1hc2s7CQkvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIHNldCBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiB0aGlzCisJCQkJICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gKi8KKwlpbnQgY2xybWFzazsJCS8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gY2xlYXIgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gIHRoaXMKKwkJCQkgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiBUaGlzIGlzCisJCQkJICAgYXBwbGllZCBCRUZPUkUgc2V0bWFzayAqLwogfSBhcmdfZGVzY190OwogCiAvKiBTZXQgdGhpcyBiaXQgaW4gYXJnX3JlcXVpcmVkIHRvIGFsbG93IGVtcHR5IGFyZ3VtZW50cyAqLwpAQCAtNjQ4LDY3ICs2NzIsNzAgQEAKIC8qIHRoaXMgc3RydWN0IGlzIHVzZWQgaW4gcmVpc2VyZnNfZ2V0b3B0KCkgZm9yIGRlc2NyaWJpbmcgdGhlIHNldCBvZiByZWlzZXJmcwogICAgbW91bnQgb3B0aW9ucyAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKiBvcHRpb25fbmFtZTsKLSAgICBpbnQgYXJnX3JlcXVpcmVkOyAvKiAwIGlmIGFyZ3VtZW50IGlzIG5vdCByZXF1aXJlZCwgbm90IDAgb3RoZXJ3aXNlICovCi0gICAgY29uc3QgYXJnX2Rlc2NfdCAqIHZhbHVlczsgLyogbGlzdCBvZiB2YWx1ZXMgYWNjZXB0ZWQgYnkgYW4gb3B0aW9uICovCi0gICAgaW50IHNldG1hc2s7IC8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gc2V0IG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gKi8KLSAgICBpbnQgY2xybWFzazsgLyogYml0bWFzayB3aGljaCBpcyB0byBjbGVhciBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiAgdGhpcwotCQkgICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gVGhpcyBpcwotCQkgICAgYXBwbGllZCBCRUZPUkUgc2V0bWFzayAqLworCWNoYXIgKm9wdGlvbl9uYW1lOworCWludCBhcmdfcmVxdWlyZWQ7CS8qIDAgaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkLCBub3QgMCBvdGhlcndpc2UgKi8KKwljb25zdCBhcmdfZGVzY190ICp2YWx1ZXM7CS8qIGxpc3Qgb2YgdmFsdWVzIGFjY2VwdGVkIGJ5IGFuIG9wdGlvbiAqLworCWludCBzZXRtYXNrOwkJLyogYml0bWFzayB3aGljaCBpcyB0byBzZXQgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gdGhpcworCQkJCSAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuICovCisJaW50IGNscm1hc2s7CQkvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIGNsZWFyIG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuICB0aGlzCisJCQkJICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gVGhpcyBpcworCQkJCSAgIGFwcGxpZWQgQkVGT1JFIHNldG1hc2sgKi8KIH0gb3B0X2Rlc2NfdDsKIAogLyogcG9zc2libGUgdmFsdWVzIGZvciAtbyBkYXRhPSAqLwogc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgbG9nZ2luZ19tb2RlW10gPSB7Ci0gICAgeyJvcmRlcmVkIiwgMTw8UkVJU0VSRlNfREFUQV9PUkRFUkVELCAoMTw8UkVJU0VSRlNfREFUQV9MT0d8MTw8UkVJU0VSRlNfREFUQV9XUklURUJBQ0spfSwKLSAgICB7ImpvdXJuYWwiLCAxPDxSRUlTRVJGU19EQVRBX0xPRywgKDE8PFJFSVNFUkZTX0RBVEFfT1JERVJFRHwxPDxSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyl9LAotICAgIHsid3JpdGViYWNrIiwgMTw8UkVJU0VSRlNfREFUQV9XUklURUJBQ0ssICgxPDxSRUlTRVJGU19EQVRBX09SREVSRUR8MTw8UkVJU0VSRlNfREFUQV9MT0cpfSwKLSAgICB7TlVMTCwgMH0KKwl7Im9yZGVyZWQiLCAxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCwKKwkgKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cgfCAxIDw8IFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKX0sCisJeyJqb3VybmFsIiwgMSA8PCBSRUlTRVJGU19EQVRBX0xPRywKKwkgKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEIHwgMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyl9LAorCXsid3JpdGViYWNrIiwgMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSywKKwkgKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEIHwgMSA8PCBSRUlTRVJGU19EQVRBX0xPRyl9LAorCXtOVUxMLCAwfQogfTsKIAogLyogcG9zc2libGUgdmFsdWVzIGZvciAtbyBiYXJyaWVyPSAqLwogc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgYmFycmllcl9tb2RlW10gPSB7Ci0gICAgeyJub25lIiwgMTw8UkVJU0VSRlNfQkFSUklFUl9OT05FLCAxPDxSRUlTRVJGU19CQVJSSUVSX0ZMVVNIfSwKLSAgICB7ImZsdXNoIiwgMTw8UkVJU0VSRlNfQkFSUklFUl9GTFVTSCwgMTw8UkVJU0VSRlNfQkFSUklFUl9OT05FfSwKLSAgICB7TlVMTCwgMH0KKwl7Im5vbmUiLCAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfTk9ORSwgMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIfSwKKwl7ImZsdXNoIiwgMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNILCAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfTk9ORX0sCisJe05VTEwsIDB9CiB9OwogCiAvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yICItbyBibG9jay1hbGxvY2F0b3I9IiBhbmQgYml0cyB3aGljaCBhcmUgdG8gYmUgc2V0IGluCiAgICBzX21vdW50X29wdCBvZiByZWlzZXJmcyBzcGVjaWZpYyBwYXJ0IG9mIGluLWNvcmUgc3VwZXIgYmxvY2sgKi8KIHN0YXRpYyBjb25zdCBhcmdfZGVzY190IGJhbGxvY1tdID0gewotICAgIHsibm9ib3JkZXIiLCAxPDxSRUlTRVJGU19OT19CT1JERVIsIDB9LAotICAgIHsiYm9yZGVyIiwgMCwgMTw8UkVJU0VSRlNfTk9fQk9SREVSfSwKLSAgICB7Im5vX3VuaGFzaGVkX3JlbG9jYXRpb24iLCAxPDxSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OLCAwfSwKLSAgICB7Imhhc2hlZF9yZWxvY2F0aW9uIiwgMTw8UkVJU0VSRlNfSEFTSEVEX1JFTE9DQVRJT04sIDB9LAotICAgIHsidGVzdDQiLCAxPDxSRUlTRVJGU19URVNUNCwgMH0sCi0gICAgeyJub3Rlc3Q0IiwgMCwgMTw8UkVJU0VSRlNfVEVTVDR9LAotICAgIHtOVUxMLCAwLCAwfQorCXsibm9ib3JkZXIiLCAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUiwgMH0sCisJeyJib3JkZXIiLCAwLCAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUn0sCisJeyJub191bmhhc2hlZF9yZWxvY2F0aW9uIiwgMSA8PCBSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OLCAwfSwKKwl7Imhhc2hlZF9yZWxvY2F0aW9uIiwgMSA8PCBSRUlTRVJGU19IQVNIRURfUkVMT0NBVElPTiwgMH0sCisJeyJ0ZXN0NCIsIDEgPDwgUkVJU0VSRlNfVEVTVDQsIDB9LAorCXsibm90ZXN0NCIsIDAsIDEgPDwgUkVJU0VSRlNfVEVTVDR9LAorCXtOVUxMLCAwLCAwfQogfTsKIAogc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgdGFpbHNbXSA9IHsKLSAgICB7Im9uIiwgMTw8UkVJU0VSRlNfTEFSR0VUQUlMLCAxPDxSRUlTRVJGU19TTUFMTFRBSUx9LAotICAgIHsib2ZmIiwgMCwgKDE8PFJFSVNFUkZTX0xBUkdFVEFJTCl8KDE8PFJFSVNFUkZTX1NNQUxMVEFJTCl9LAotICAgIHsic21hbGwiLCAxPDxSRUlTRVJGU19TTUFMTFRBSUwsIDE8PFJFSVNFUkZTX0xBUkdFVEFJTH0sCi0gICAge05VTEwsIDAsIDB9CisJeyJvbiIsIDEgPDwgUkVJU0VSRlNfTEFSR0VUQUlMLCAxIDw8IFJFSVNFUkZTX1NNQUxMVEFJTH0sCisJeyJvZmYiLCAwLCAoMSA8PCBSRUlTRVJGU19MQVJHRVRBSUwpIHwgKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKX0sCisJeyJzbWFsbCIsIDEgPDwgUkVJU0VSRlNfU01BTExUQUlMLCAxIDw8IFJFSVNFUkZTX0xBUkdFVEFJTH0sCisJe05VTEwsIDAsIDB9CiB9OwogCiBzdGF0aWMgY29uc3QgYXJnX2Rlc2NfdCBlcnJvcl9hY3Rpb25zW10gPSB7Ci0gICAgeyJwYW5pYyIsIDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMsCi0gICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0VSUk9SX1JPIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSl9LAotICAgIHsicm8tcmVtb3VudCIsIDEgPDwgUkVJU0VSRlNfRVJST1JfUk8sCi0gICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSl9LAorCXsicGFuaWMiLCAxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDLAorCSAoMSA8PCBSRUlTRVJGU19FUlJPUl9STyB8IDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUpfSwKKwl7InJvLXJlbW91bnQiLCAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPLAorCSAoMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQyB8IDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUpfSwKICNpZmRlZiBSRUlTRVJGU19KT1VSTkFMX0VSUk9SX0FMTE9XU19OT19MT0cKLSAgICB7ImNvbnRpbnVlIiwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSwKLSAgICAgICAgICAgICAgKDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMgfCAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPKX0sCisJeyJjb250aW51ZSIsIDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUsCisJICgxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9STyl9LAogI2VuZGlmCi0gICAge05VTEwsIDAsIDB9LAorCXtOVUxMLCAwLCAwfSwKIH07CiAKLWludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSAxMjggKiAxMDI0OyAvKiBEZWZhdWx0IHJlY29tbWVuZGVkIEkvTyBzaXplIGlzIDEyOGsuCi0JCQkJCSAgICAgIFRoZXJlIG1pZ2h0IGJlIGJyb2tlbiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUKLQkJCQkJICAgICAgY29uZnVzZWQgYnkgdGhpcy4gVXNlIG5vbGFyZ2VpbyBtb3VudCBvcHRpb24KLQkJCQkJICAgICAgdG8gZ2V0IHVzdWFsIGkvbyBzaXplID0gUEFHRV9TSVpFLgotCQkJCQkgICAgKi8KK2ludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSAxMjggKiAxMDI0OwkvKiBEZWZhdWx0IHJlY29tbWVuZGVkIEkvTyBzaXplIGlzIDEyOGsuCisJCQkJCQkgICBUaGVyZSBtaWdodCBiZSBicm9rZW4gYXBwbGljYXRpb25zIHRoYXQgYXJlCisJCQkJCQkgICBjb25mdXNlZCBieSB0aGlzLiBVc2Ugbm9sYXJnZWlvIG1vdW50IG9wdGlvbgorCQkJCQkJICAgdG8gZ2V0IHVzdWFsIGkvbyBzaXplID0gUEFHRV9TSVpFLgorCQkJCQkJICovCiAKIC8qIHByb2NlZWQgb25seSBvbmUgb3B0aW9uIGZyb20gYSBsaXN0ICpjdXIgLSBzdHJpbmcgY29udGFpbmluZyBvZiBtb3VudCBvcHRpb25zCiAgICBvcHRzIC0gYXJyYXkgb2Ygb3B0aW9ucyB3aGljaCBhcmUgYWNjZXB0ZWQKQEAgLTcxNiw0ODYgKzc0Myw1MzAgQEAKICAgIGluIHRoZSBpbnB1dCAtIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IGlzIHN0b3JlZCBoZXJlCiAgICBiaXRfZmxhZ3MgLSBpZiBvcHRpb24gcmVxdWlyZXMgdG8gc2V0IGEgY2VydGFpbiBiaXQgLSBpdCBpcyBzZXQgaGVyZQogICAgcmV0dXJuIC0xIGlmIHVua25vd24gb3B0aW9uIGlzIGZvdW5kLCBvcHQtPmFyZ19yZXF1aXJlZCBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfZ2V0b3B0ICggc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqKiBjdXIsIG9wdF9kZXNjX3QgKiBvcHRzLCBjaGFyICoqIG9wdF9hcmcsCi0JCQkgICAgdW5zaWduZWQgbG9uZyAqIGJpdF9mbGFncykKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZ2V0b3B0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY2hhciAqKmN1ciwgb3B0X2Rlc2NfdCAqIG9wdHMsCisJCQkgICBjaGFyICoqb3B0X2FyZywgdW5zaWduZWQgbG9uZyAqYml0X2ZsYWdzKQogewotICAgIGNoYXIgKiBwOwotICAgIC8qIGZvbz1iYXIsIAotICAgICAgIF4gICBeICBeCi0gICAgICAgfCAgIHwgICstLSBvcHRpb25fZW5kCi0gICAgICAgfCAgICstLSBhcmdfc3RhcnQKLSAgICAgICArLS0gb3B0aW9uX3N0YXJ0Ci0gICAgKi8KLSAgICBjb25zdCBvcHRfZGVzY190ICogb3B0OwotICAgIGNvbnN0IGFyZ19kZXNjX3QgKiBhcmc7Ci0gICAgCi0gICAgCi0gICAgcCA9ICpjdXI7Ci0gICAgCi0gICAgLyogYXNzdW1lIGFyZ3VtZW50IGNhbm5vdCBjb250YWluIGNvbW1hcyAqLwotICAgICpjdXIgPSBzdHJjaHIgKHAsICcsJyk7Ci0gICAgaWYgKCpjdXIpIHsKLQkqKCpjdXIpID0gJ1wwJzsKLQkoKmN1cikgKys7Ci0gICAgfQorCWNoYXIgKnA7CisJLyogZm9vPWJhciwgCisJICAgXiAgIF4gIF4KKwkgICB8ICAgfCAgKy0tIG9wdGlvbl9lbmQKKwkgICB8ICAgKy0tIGFyZ19zdGFydAorCSAgICstLSBvcHRpb25fc3RhcnQKKwkgKi8KKwljb25zdCBvcHRfZGVzY190ICpvcHQ7CisJY29uc3QgYXJnX2Rlc2NfdCAqYXJnOwogCi0gICAgaWYgKCAhc3RybmNtcCAocCwgImFsbG9jPSIsIDYpICkgewotCS8qIFVnbHkgc3BlY2lhbCBjYXNlLCBwcm9iYWJseSB3ZSBzaG91bGQgcmVkbyBvcHRpb25zIHBhcnNlciBzbyB0aGF0Ci0JICAgaXQgY2FuIHVuZGVyc3RhbmQgc2V2ZXJhbCBhcmd1bWVudHMgZm9yIHNvbWUgb3B0aW9ucywgYWxzbyBzbyB0aGF0Ci0JICAgaXQgY2FuIGZpbGwgc2V2ZXJhbCBiaXRmaWVsZHMgd2l0aCBvcHRpb24gdmFsdWVzLiAqLwotCWlmICggcmVpc2VyZnNfcGFyc2VfYWxsb2Nfb3B0aW9ucyggcywgcCArIDYpICkgewotCSAgICByZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KKwlwID0gKmN1cjsKIAotIAotICAgIC8qIGZvciBldmVyeSBvcHRpb24gaW4gdGhlIGxpc3QgKi8KLSAgICBmb3IgKG9wdCA9IG9wdHM7IG9wdC0+b3B0aW9uX25hbWU7IG9wdCArKykgewotCWlmICghc3RybmNtcCAocCwgb3B0LT5vcHRpb25fbmFtZSwgc3RybGVuIChvcHQtPm9wdGlvbl9uYW1lKSkpIHsKLQkgICAgaWYgKGJpdF9mbGFncykgewotICAgICAgICAgICAgICAgIGlmIChvcHQtPmNscm1hc2sgPT0gKDEgPDwgUkVJU0VSRlNfVU5TVVBQT1JURURfT1BUKSkKLSAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgIiVzIG5vdCBzdXBwb3J0ZWQuIiwgcCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAqYml0X2ZsYWdzICY9IH5vcHQtPmNscm1hc2s7Ci0gICAgICAgICAgICAgICAgaWYgKG9wdC0+c2V0bWFzayA9PSAoMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFQpKQotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAiJXMgbm90IHN1cHBvcnRlZC4iLCBwKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpiaXRfZmxhZ3MgfD0gb3B0LT5zZXRtYXNrOwotCSAgICB9Ci0JICAgIGJyZWFrOworCS8qIGFzc3VtZSBhcmd1bWVudCBjYW5ub3QgY29udGFpbiBjb21tYXMgKi8KKwkqY3VyID0gc3RyY2hyKHAsICcsJyk7CisJaWYgKCpjdXIpIHsKKwkJKigqY3VyKSA9ICdcMCc7CisJCSgqY3VyKSsrOwogCX0KLSAgICB9Ci0gICAgaWYgKCFvcHQtPm9wdGlvbl9uYW1lKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgInVua25vd24gbW91bnQgb3B0aW9uIFwiJXNcIiIsIHApOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgcCArPSBzdHJsZW4gKG9wdC0+b3B0aW9uX25hbWUpOwotICAgIHN3aXRjaCAoKnApIHsKLSAgICBjYXNlICc9JzoKLQlpZiAoIW9wdC0+YXJnX3JlcXVpcmVkKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ0aGUgb3B0aW9uIFwiJXNcIiBkb2VzIG5vdCByZXF1aXJlIGFuIGFyZ3VtZW50IiwKLQkJICAgIG9wdC0+b3B0aW9uX25hbWUpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCWJyZWFrOwotCQotICAgIGNhc2UgMDoKLQlpZiAob3B0LT5hcmdfcmVxdWlyZWQpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywgInRoZSBvcHRpb24gXCIlc1wiIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iiwgb3B0LT5vcHRpb25fbmFtZSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlyZWlzZXJmc193YXJuaW5nIChzLCAiaGVhZCBvZiBvcHRpb24gXCIlc1wiIGlzIG9ubHkgY29ycmVjdCIsIG9wdC0+b3B0aW9uX25hbWUpOwotCXJldHVybiAtMTsKLSAgICB9CiAKLSAgICAvKiBtb3ZlIHRvIHRoZSBhcmd1bWVudCwgb3IgdG8gbmV4dCBvcHRpb24gaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkICovCi0gICAgcCArKzsKLSAgICAKLSAgICBpZiAoIG9wdC0+YXJnX3JlcXVpcmVkICYmICEob3B0LT5hcmdfcmVxdWlyZWQgJiAoMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpKSAmJiAhc3RybGVuIChwKSApIHsKLQkvKiB0aGlzIGNhdGNoZXMgIm9wdGlvbj0sIiBpZiBub3QgYWxsb3dlZCAqLwotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJlbXB0eSBhcmd1bWVudCBmb3IgXCIlc1wiIiwgb3B0LT5vcHRpb25fbmFtZSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBpZiAoIW9wdC0+dmFsdWVzKSB7Ci0JLyogKj1OVUxMb3B0X2FyZyBjb250YWlucyBwb2ludGVyIHRvIGFyZ3VtZW50ICovCi0JKm9wdF9hcmcgPSBwOwotCXJldHVybiBvcHQtPmFyZ19yZXF1aXJlZCAmIH4oMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpOwotICAgIH0KLSAgICAKLSAgICAvKiB2YWx1ZXMgcG9zc2libGUgZm9yIHRoaXMgb3B0aW9uIGFyZSBsaXN0ZWQgaW4gb3B0LT52YWx1ZXMgKi8KLSAgICBmb3IgKGFyZyA9IG9wdC0+dmFsdWVzOyBhcmctPnZhbHVlOyBhcmcgKyspIHsKLQlpZiAoIXN0cmNtcCAocCwgYXJnLT52YWx1ZSkpIHsKLQkgICAgaWYgKGJpdF9mbGFncykgewotCQkqYml0X2ZsYWdzICY9IH5hcmctPmNscm1hc2s7Ci0JCSpiaXRfZmxhZ3MgfD0gYXJnLT5zZXRtYXNrOwotCSAgICB9Ci0JICAgIHJldHVybiBvcHQtPmFyZ19yZXF1aXJlZDsKKwlpZiAoIXN0cm5jbXAocCwgImFsbG9jPSIsIDYpKSB7CisJCS8qIFVnbHkgc3BlY2lhbCBjYXNlLCBwcm9iYWJseSB3ZSBzaG91bGQgcmVkbyBvcHRpb25zIHBhcnNlciBzbyB0aGF0CisJCSAgIGl0IGNhbiB1bmRlcnN0YW5kIHNldmVyYWwgYXJndW1lbnRzIGZvciBzb21lIG9wdGlvbnMsIGFsc28gc28gdGhhdAorCQkgICBpdCBjYW4gZmlsbCBzZXZlcmFsIGJpdGZpZWxkcyB3aXRoIG9wdGlvbiB2YWx1ZXMuICovCisJCWlmIChyZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zKHMsIHAgKyA2KSkgeworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KIAl9Ci0gICAgfQotICAgIAotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJiYWQgdmFsdWUgXCIlc1wiIGZvciBvcHRpb24gXCIlc1wiIiwgcCwgb3B0LT5vcHRpb25fbmFtZSk7Ci0gICAgcmV0dXJuIC0xOworCisJLyogZm9yIGV2ZXJ5IG9wdGlvbiBpbiB0aGUgbGlzdCAqLworCWZvciAob3B0ID0gb3B0czsgb3B0LT5vcHRpb25fbmFtZTsgb3B0KyspIHsKKwkJaWYgKCFzdHJuY21wKHAsIG9wdC0+b3B0aW9uX25hbWUsIHN0cmxlbihvcHQtPm9wdGlvbl9uYW1lKSkpIHsKKwkJCWlmIChiaXRfZmxhZ3MpIHsKKwkJCQlpZiAob3B0LT5jbHJtYXNrID09CisJCQkJICAgICgxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVCkpCisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywgIiVzIG5vdCBzdXBwb3J0ZWQuIiwKKwkJCQkJCQkgcCk7CisJCQkJZWxzZQorCQkJCQkqYml0X2ZsYWdzICY9IH5vcHQtPmNscm1hc2s7CisJCQkJaWYgKG9wdC0+c2V0bWFzayA9PQorCQkJCSAgICAoMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFQpKQorCQkJCQlyZWlzZXJmc193YXJuaW5nKHMsICIlcyBub3Qgc3VwcG9ydGVkLiIsCisJCQkJCQkJIHApOworCQkJCWVsc2UKKwkJCQkJKmJpdF9mbGFncyB8PSBvcHQtPnNldG1hc2s7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIW9wdC0+b3B0aW9uX25hbWUpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAidW5rbm93biBtb3VudCBvcHRpb24gXCIlc1wiIiwgcCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwICs9IHN0cmxlbihvcHQtPm9wdGlvbl9uYW1lKTsKKwlzd2l0Y2ggKCpwKSB7CisJY2FzZSAnPSc6CisJCWlmICghb3B0LT5hcmdfcmVxdWlyZWQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJ0aGUgb3B0aW9uIFwiJXNcIiBkb2VzIG5vdCByZXF1aXJlIGFuIGFyZ3VtZW50IiwKKwkJCQkJIG9wdC0+b3B0aW9uX25hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOworCisJY2FzZSAwOgorCQlpZiAob3B0LT5hcmdfcmVxdWlyZWQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJ0aGUgb3B0aW9uIFwiJXNcIiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCisJCQkJCSBvcHQtPm9wdGlvbl9uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZWlzZXJmc193YXJuaW5nKHMsICJoZWFkIG9mIG9wdGlvbiBcIiVzXCIgaXMgb25seSBjb3JyZWN0IiwKKwkJCQkgb3B0LT5vcHRpb25fbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBtb3ZlIHRvIHRoZSBhcmd1bWVudCwgb3IgdG8gbmV4dCBvcHRpb24gaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkICovCisJcCsrOworCisJaWYgKG9wdC0+YXJnX3JlcXVpcmVkCisJICAgICYmICEob3B0LT5hcmdfcmVxdWlyZWQgJiAoMSA8PCBSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSkpCisJICAgICYmICFzdHJsZW4ocCkpIHsKKwkJLyogdGhpcyBjYXRjaGVzICJvcHRpb249LCIgaWYgbm90IGFsbG93ZWQgKi8KKwkJcmVpc2VyZnNfd2FybmluZyhzLCAiZW1wdHkgYXJndW1lbnQgZm9yIFwiJXNcIiIsCisJCQkJIG9wdC0+b3B0aW9uX25hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFvcHQtPnZhbHVlcykgeworCQkvKiAqPU5VTExvcHRfYXJnIGNvbnRhaW5zIHBvaW50ZXIgdG8gYXJndW1lbnQgKi8KKwkJKm9wdF9hcmcgPSBwOworCQlyZXR1cm4gb3B0LT5hcmdfcmVxdWlyZWQgJiB+KDEgPDwgUkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpOworCX0KKworCS8qIHZhbHVlcyBwb3NzaWJsZSBmb3IgdGhpcyBvcHRpb24gYXJlIGxpc3RlZCBpbiBvcHQtPnZhbHVlcyAqLworCWZvciAoYXJnID0gb3B0LT52YWx1ZXM7IGFyZy0+dmFsdWU7IGFyZysrKSB7CisJCWlmICghc3RyY21wKHAsIGFyZy0+dmFsdWUpKSB7CisJCQlpZiAoYml0X2ZsYWdzKSB7CisJCQkJKmJpdF9mbGFncyAmPSB+YXJnLT5jbHJtYXNrOworCQkJCSpiaXRfZmxhZ3MgfD0gYXJnLT5zZXRtYXNrOworCQkJfQorCQkJcmV0dXJuIG9wdC0+YXJnX3JlcXVpcmVkOworCQl9CisJfQorCisJcmVpc2VyZnNfd2FybmluZyhzLCAiYmFkIHZhbHVlIFwiJXNcIiBmb3Igb3B0aW9uIFwiJXNcIiIsIHAsCisJCQkgb3B0LT5vcHRpb25fbmFtZSk7CisJcmV0dXJuIC0xOwogfQogCiAvKiByZXR1cm5zIDAgaWYgc29tZXRoaW5nIGlzIHdyb25nIGluIG9wdGlvbiBzdHJpbmcsIDEgLSBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfcGFyc2Vfb3B0aW9ucyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqIG9wdGlvbnMsIC8qIHN0cmluZyBnaXZlbiB2aWEgbW91bnQncyAtbyAqLwotCQkJCSAgIHVuc2lnbmVkIGxvbmcgKiBtb3VudF9vcHRpb25zLAotCQkJCSAgIC8qIGFmdGVyIHRoZSBwYXJzaW5nIHBoYXNlLCBjb250YWlucyB0aGUKLQkJCQkgICAgICBjb2xsZWN0aW9uIG9mIGJpdGZsYWdzIGRlZmluaW5nIHdoYXQKLQkJCQkgICAgICBtb3VudCBvcHRpb25zIHdlcmUgc2VsZWN0ZWQuICovCi0JCQkJICAgdW5zaWduZWQgbG9uZyAqIGJsb2NrcywgLyogc3RydG9sLWVkIGZyb20gTk5OIG9mIHJlc2l6ZT1OTk4gKi8KLQkJCQkgICBjaGFyICoqIGpkZXZfbmFtZSwKLQkJCQkgICB1bnNpZ25lZCBpbnQgKiBjb21taXRfbWF4X2FnZSkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNoYXIgKm9wdGlvbnMsCS8qIHN0cmluZyBnaXZlbiB2aWEgbW91bnQncyAtbyAqLworCQkJCSAgdW5zaWduZWQgbG9uZyAqbW91bnRfb3B0aW9ucywKKwkJCQkgIC8qIGFmdGVyIHRoZSBwYXJzaW5nIHBoYXNlLCBjb250YWlucyB0aGUKKwkJCQkgICAgIGNvbGxlY3Rpb24gb2YgYml0ZmxhZ3MgZGVmaW5pbmcgd2hhdAorCQkJCSAgICAgbW91bnQgb3B0aW9ucyB3ZXJlIHNlbGVjdGVkLiAqLworCQkJCSAgdW5zaWduZWQgbG9uZyAqYmxvY2tzLAkvKiBzdHJ0b2wtZWQgZnJvbSBOTk4gb2YgcmVzaXplPU5OTiAqLworCQkJCSAgY2hhciAqKmpkZXZfbmFtZSwKKwkJCQkgIHVuc2lnbmVkIGludCAqY29tbWl0X21heF9hZ2UpCiB7Ci0gICAgaW50IGM7Ci0gICAgY2hhciAqIGFyZyA9IE5VTEw7Ci0gICAgY2hhciAqIHBvczsKLSAgICBvcHRfZGVzY190IG9wdHNbXSA9IHsKLQkvKiBDb21wYXRpYmlsaXR5IHN0dWZmLCBzbyB0aGF0IC1vIG5vdGFpbCBmb3Igb2xkIHNldHVwcyBzdGlsbCB3b3JrICovCi0JeyJ0YWlscyIsCS5hcmdfcmVxdWlyZWQgPSAndCcsIC52YWx1ZXMgPSB0YWlsc30sCi0JeyJub3RhaWwiLAkuY2xybWFzayA9ICgxPDxSRUlTRVJGU19MQVJHRVRBSUwpfCgxPDxSRUlTRVJGU19TTUFMTFRBSUwpfSwKLQl7ImNvbnYiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX0NPTlZFUlR9LAotCXsiYXR0cnMiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX0FUVFJTfSwKLQl7Im5vYXR0cnMiLAkuY2xybWFzayA9IDE8PFJFSVNFUkZTX0FUVFJTfSwKKwlpbnQgYzsKKwljaGFyICphcmcgPSBOVUxMOworCWNoYXIgKnBvczsKKwlvcHRfZGVzY190IG9wdHNbXSA9IHsKKwkJLyogQ29tcGF0aWJpbGl0eSBzdHVmZiwgc28gdGhhdCAtbyBub3RhaWwgZm9yIG9sZCBzZXR1cHMgc3RpbGwgd29yayAqLworCQl7InRhaWxzIiwuYXJnX3JlcXVpcmVkID0gJ3QnLC52YWx1ZXMgPSB0YWlsc30sCisJCXsibm90YWlsIiwuY2xybWFzayA9CisJCSAoMSA8PCBSRUlTRVJGU19MQVJHRVRBSUwpIHwgKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKX0sCisJCXsiY29udiIsLnNldG1hc2sgPSAxIDw8IFJFSVNFUkZTX0NPTlZFUlR9LAorCQl7ImF0dHJzIiwuc2V0bWFzayA9IDEgPDwgUkVJU0VSRlNfQVRUUlN9LAorCQl7Im5vYXR0cnMiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19BVFRSU30sCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSCi0JeyJ1c2VyX3hhdHRyIiwJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19YQVRUUlNfVVNFUn0sCi0JeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMTw8UkVJU0VSRlNfWEFUVFJTX1VTRVJ9LAorCQl7InVzZXJfeGF0dHIiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19YQVRUUlNfVVNFUn0sCisJCXsibm91c2VyX3hhdHRyIiwuY2xybWFzayA9IDEgPDwgUkVJU0VSRlNfWEFUVFJTX1VTRVJ9LAogI2Vsc2UKLQl7InVzZXJfeGF0dHIiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCi0JeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMTw8UkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKKwkJeyJ1c2VyX3hhdHRyIiwuc2V0bWFzayA9IDEgPDwgUkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKKwkJeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAotCXsiYWNsIiwJCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfUE9TSVhBQ0x9LAotCXsibm9hY2wiLAkuY2xybWFzayA9IDE8PFJFSVNFUkZTX1BPU0lYQUNMfSwKKwkJeyJhY2wiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19QT1NJWEFDTH0sCisJCXsibm9hY2wiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19QT1NJWEFDTH0sCiAjZWxzZQotCXsiYWNsIiwJCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKLQl7Im5vYWNsIiwJLmNscm1hc2sgPSAxPDxSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAorCQl7ImFjbCIsLnNldG1hc2sgPSAxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCisJCXsibm9hY2wiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAogI2VuZGlmCi0JeyJub2xvZyIsfSwJIC8qIFRoaXMgaXMgdW5zdXBwb3J0ZWQgKi8KLQl7InJlcGxheW9ubHkiLAkuc2V0bWFzayA9IDE8PFJFUExBWU9OTFl9LAotCXsiYmxvY2stYWxsb2NhdG9yIiwgLmFyZ19yZXF1aXJlZCA9ICdhJywgLnZhbHVlcyA9IGJhbGxvY30sCi0JeyJkYXRhIiwJLmFyZ19yZXF1aXJlZCA9ICdkJywgLnZhbHVlcyA9IGxvZ2dpbmdfbW9kZX0sCi0JeyJiYXJyaWVyIiwJLmFyZ19yZXF1aXJlZCA9ICdiJywgLnZhbHVlcyA9IGJhcnJpZXJfbW9kZX0sCi0JeyJyZXNpemUiLAkuYXJnX3JlcXVpcmVkID0gJ3InLCAudmFsdWVzID0gTlVMTH0sCi0JeyJqZGV2IiwJLmFyZ19yZXF1aXJlZCA9ICdqJywgLnZhbHVlcyA9IE5VTEx9LAotCXsibm9sYXJnZWlvIiwJLmFyZ19yZXF1aXJlZCA9ICd3JywgLnZhbHVlcyA9IE5VTEx9LAotCXsiY29tbWl0IiwJLmFyZ19yZXF1aXJlZCA9ICdjJywgLnZhbHVlcyA9IE5VTEx9LAotCXsidXNycXVvdGEiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX1FVT1RBfSwKLQl7ImdycHF1b3RhIiwJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19RVU9UQX0sCi0JeyJub3F1b3RhIiwJLmNscm1hc2sgPSAxPDxSRUlTRVJGU19RVU9UQX0sCi0JeyJlcnJvcnMiLCAJLmFyZ19yZXF1aXJlZCA9ICdlJywgLnZhbHVlcyA9IGVycm9yX2FjdGlvbnN9LAotCXsidXNyanF1b3RhIiwJLmFyZ19yZXF1aXJlZCA9ICd1J3woMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpLCAudmFsdWVzID0gTlVMTH0sCi0JeyJncnBqcXVvdGEiLAkuYXJnX3JlcXVpcmVkID0gJ2cnfCgxPDxSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSksIC52YWx1ZXMgPSBOVUxMfSwKLQl7ImpxZm10IiwJLmFyZ19yZXF1aXJlZCA9ICdmJywgLnZhbHVlcyA9IE5VTEx9LAotCXtOVUxMLH0KLSAgICB9OwotCQotICAgICpibG9ja3MgPSAwOwotICAgIGlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCi0JLyogdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbjogY3JlYXRlIHRhaWxzLCBqb3VybmFsaW5nIG9uLCBubwotCSAgIGNvbnZlcnNpb24gdG8gbmV3ZXN0IGZvcm1hdCAqLworCQl7Im5vbG9nIix9LAkvKiBUaGlzIGlzIHVuc3VwcG9ydGVkICovCisJCXsicmVwbGF5b25seSIsLnNldG1hc2sgPSAxIDw8IFJFUExBWU9OTFl9LAorCQl7ImJsb2NrLWFsbG9jYXRvciIsLmFyZ19yZXF1aXJlZCA9ICdhJywudmFsdWVzID0gYmFsbG9jfSwKKwkJeyJkYXRhIiwuYXJnX3JlcXVpcmVkID0gJ2QnLC52YWx1ZXMgPSBsb2dnaW5nX21vZGV9LAorCQl7ImJhcnJpZXIiLC5hcmdfcmVxdWlyZWQgPSAnYicsLnZhbHVlcyA9IGJhcnJpZXJfbW9kZX0sCisJCXsicmVzaXplIiwuYXJnX3JlcXVpcmVkID0gJ3InLC52YWx1ZXMgPSBOVUxMfSwKKwkJeyJqZGV2IiwuYXJnX3JlcXVpcmVkID0gJ2onLC52YWx1ZXMgPSBOVUxMfSwKKwkJeyJub2xhcmdlaW8iLC5hcmdfcmVxdWlyZWQgPSAndycsLnZhbHVlcyA9IE5VTEx9LAorCQl7ImNvbW1pdCIsLmFyZ19yZXF1aXJlZCA9ICdjJywudmFsdWVzID0gTlVMTH0sCisJCXsidXNycXVvdGEiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19RVU9UQX0sCisJCXsiZ3JwcXVvdGEiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19RVU9UQX0sCisJCXsibm9xdW90YSIsLmNscm1hc2sgPSAxIDw8IFJFSVNFUkZTX1FVT1RBfSwKKwkJeyJlcnJvcnMiLC5hcmdfcmVxdWlyZWQgPSAnZScsLnZhbHVlcyA9IGVycm9yX2FjdGlvbnN9LAorCQl7InVzcmpxdW90YSIsLmFyZ19yZXF1aXJlZCA9CisJCSAndScgfCAoMSA8PCBSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSksLnZhbHVlcyA9IE5VTEx9LAorCQl7ImdycGpxdW90YSIsLmFyZ19yZXF1aXJlZCA9CisJCSAnZycgfCAoMSA8PCBSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSksLnZhbHVlcyA9IE5VTEx9LAorCQl7ImpxZm10IiwuYXJnX3JlcXVpcmVkID0gJ2YnLC52YWx1ZXMgPSBOVUxMfSwKKwkJe05VTEwsfQorCX07CisKKwkqYmxvY2tzID0gMDsKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQkvKiB1c2UgZGVmYXVsdCBjb25maWd1cmF0aW9uOiBjcmVhdGUgdGFpbHMsIGpvdXJuYWxpbmcgb24sIG5vCisJCSAgIGNvbnZlcnNpb24gdG8gbmV3ZXN0IGZvcm1hdCAqLworCQlyZXR1cm4gMTsKKworCWZvciAocG9zID0gb3B0aW9uczsgcG9zOykgeworCQljID0gcmVpc2VyZnNfZ2V0b3B0KHMsICZwb3MsIG9wdHMsICZhcmcsIG1vdW50X29wdGlvbnMpOworCQlpZiAoYyA9PSAtMSkKKwkJCS8qIHdyb25nIG9wdGlvbiBpcyBnaXZlbiAqLworCQkJcmV0dXJuIDA7CisKKwkJaWYgKGMgPT0gJ3InKSB7CisJCQljaGFyICpwOworCisJCQlwID0gTlVMTDsKKwkJCS8qICJyZXNpemU9Tk5OIiBvciAicmVzaXplPWF1dG8iICovCisKKwkJCWlmICghc3RyY21wKGFyZywgImF1dG8iKSkgeworCQkJCS8qIEZyb20gSkZTIGNvZGUsIHRvIGF1dG8tZ2V0IHRoZSBzaXplLiAqLworCQkJCSpibG9ja3MgPQorCQkJCSAgICBzLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gcy0+CisJCQkJICAgIHNfYmxvY2tzaXplX2JpdHM7CisJCQl9IGVsc2UgeworCQkJCSpibG9ja3MgPSBzaW1wbGVfc3RydG91bChhcmcsICZwLCAwKTsKKwkJCQlpZiAoKnAgIT0gJ1wwJykgeworCQkJCQkvKiBOTk4gZG9lcyBub3QgbG9vayBsaWtlIGEgbnVtYmVyICovCisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGJhZCB2YWx1ZSAlcyIsCisJCQkJCQkJIGFyZyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChjID09ICdjJykgeworCQkJY2hhciAqcCA9IE5VTEw7CisJCQl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZywgJnAsIDApOworCQkJLyogY29tbWl0PU5OTiAodGltZSBpbiBzZWNvbmRzKSAqLworCQkJaWYgKCpwICE9ICdcMCcgfHwgdmFsID49ICh1bnNpZ25lZCBpbnQpLTEpIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGJhZCB2YWx1ZSAlcyIsCisJCQkJCQkgYXJnKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCSpjb21taXRfbWF4X2FnZSA9ICh1bnNpZ25lZCBpbnQpdmFsOworCQl9CisKKwkJaWYgKGMgPT0gJ3cnKSB7CisJCQljaGFyICpwID0gTlVMTDsKKwkJCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChhcmcsICZwLCAwKTsKKworCQkJaWYgKCpwICE9ICdcMCcpIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IG5vbi1udW1lcmljIHZhbHVlICVzIGZvciBub2xhcmdlaW8gb3B0aW9uIiwKKwkJCQkJCSBhcmcpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKHZhbCkKKwkJCQlyZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSBQQUdFX1NJWkU7CisJCQllbHNlCisJCQkJcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gMTI4ICogMTAyNDsKKwkJfQorCisJCWlmIChjID09ICdqJykgeworCQkJaWYgKGFyZyAmJiAqYXJnICYmIGpkZXZfbmFtZSkgeworCQkJCWlmICgqamRldl9uYW1lKSB7CS8vSG0sIGFscmVhZHkgYXNzaWduZWQ/CisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGpvdXJuYWwgZGV2aWNlIHdhcyBhbHJlYWR5ICBzcGVjaWZpZWQgdG8gYmUgJXMiLAorCQkJCQkJCSAqamRldl9uYW1lKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCSpqZGV2X25hbWUgPSBhcmc7CisJCQl9CisJCX0KKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkJaWYgKGMgPT0gJ3UnIHx8IGMgPT0gJ2cnKSB7CisJCQlpbnQgcXR5cGUgPSBjID09ICd1JyA/IFVTUlFVT1RBIDogR1JQUVVPVEE7CisKKwkJCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChzKSkgeworCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogY2Fubm90IGNoYW5nZSBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoKmFyZykgewkvKiBTb21lIGZpbGVuYW1lIHNwZWNpZmllZD8gKi8KKwkJCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdCisJCQkJICAgICYmIHN0cmNtcChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0sCisJCQkJCSAgICAgIGFyZykpIHsKKwkJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogJXMgcXVvdGEgZmlsZSBhbHJlYWR5IHNwZWNpZmllZC4iLAorCQkJCQkJCSBRVFlQRTJOQU1FKHF0eXBlKSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlpZiAoc3RyY2hyKGFyZywgJy8nKSkgeworCQkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBxdW90YWZpbGUgbXVzdCBiZSBvbiBmaWxlc3lzdGVtIHJvb3QuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0gPQorCQkJCSAgICBrbWFsbG9jKHN0cmxlbihhcmcpICsgMSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pIHsKKwkJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogbm90IGVub3VnaCBtZW1vcnkgZm9yIHN0b3JpbmcgcXVvdGFmaWxlIG5hbWUuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlzdHJjcHkoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdLCBhcmcpOworCQkJCSptb3VudF9vcHRpb25zIHw9IDEgPDwgUkVJU0VSRlNfUVVPVEE7CisJCQl9IGVsc2UgeworCQkJCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pIHsKKwkJCQkJa2ZyZWUoUkVJU0VSRlNfU0IocyktPgorCQkJCQkgICAgICBzX3FmX25hbWVzW3F0eXBlXSk7CisJCQkJCVJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSA9CisJCQkJCSAgICBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoYyA9PSAnZicpIHsKKwkJCWlmICghc3RyY21wKGFyZywgInZmc29sZCIpKQorCQkJCVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQgPSBRRk1UX1ZGU19PTEQ7CisJCQllbHNlIGlmICghc3RyY21wKGFyZywgInZmc3YwIikpCisJCQkJUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdCA9IFFGTVRfVkZTX1YwOworCQkJZWxzZSB7CisJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiB1bmtub3duIHF1b3RhIGZvcm1hdCBzcGVjaWZpZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKyNlbHNlCisJCWlmIChjID09ICd1JyB8fCBjID09ICdnJyB8fCBjID09ICdmJykgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGpvdXJuYWxsZWQgcXVvdGEgb3B0aW9ucyBub3Qgc3VwcG9ydGVkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKyNlbmRpZgorCX0KKworI2lmZGVmIENPTkZJR19RVU9UQQorCWlmICghUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdAorCSAgICAmJiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbVVNSUVVPVEFdCisJCXx8IFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbGxlZCBxdW90YSBmb3JtYXQgbm90IHNwZWNpZmllZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIFRoaXMgY2hlY2tpbmcgaXMgbm90IHByZWNpc2Ugd3J0IHRoZSBxdW90YSB0eXBlIGJ1dCBmb3Igb3VyIHB1cnBvc2VzIGl0IGlzIHN1ZmZpY2llbnQgKi8KKwlpZiAoISgqbW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX1FVT1RBKSkKKwkgICAgJiYgc2JfYW55X3F1b3RhX2VuYWJsZWQocykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogcXVvdGEgb3B0aW9ucyBtdXN0IGJlIHByZXNlbnQgd2hlbiBxdW90YSBpcyB0dXJuZWQgb24uIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCiAJcmV0dXJuIDE7Ci0gICAgCi0gICAgZm9yIChwb3MgPSBvcHRpb25zOyBwb3M7ICkgewotCWMgPSByZWlzZXJmc19nZXRvcHQgKHMsICZwb3MsIG9wdHMsICZhcmcsIG1vdW50X29wdGlvbnMpOwotCWlmIChjID09IC0xKQotCSAgICAvKiB3cm9uZyBvcHRpb24gaXMgZ2l2ZW4gKi8KLQkgICAgcmV0dXJuIDA7Ci0JCi0JaWYgKGMgPT0gJ3InKSB7Ci0JICAgIGNoYXIgKiBwOwotCSAgICAKLQkgICAgcCA9IE5VTEw7Ci0JICAgIC8qICJyZXNpemU9Tk5OIiBvciAicmVzaXplPWF1dG8iICovCi0KLQkgICAgaWYgKCFzdHJjbXAoYXJnLCAiYXV0byIpKSB7Ci0JCSAgICAvKiBGcm9tIEpGUyBjb2RlLCB0byBhdXRvLWdldCB0aGUgc2l6ZS4qLwotCQkgICAgKmJsb2NrcyA9IHMtPnNfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiBzLT5zX2Jsb2Nrc2l6ZV9iaXRzOwotCSAgICB9IGVsc2UgewotCQkgICAgKmJsb2NrcyA9IHNpbXBsZV9zdHJ0b3VsIChhcmcsICZwLCAwKTsKLQkJICAgIGlmICgqcCAhPSAnXDAnKSB7Ci0JCQkvKiBOTk4gZG9lcyBub3QgbG9vayBsaWtlIGEgbnVtYmVyICovCi0JCQlyZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogYmFkIHZhbHVlICVzIiwgYXJnKTsKLQkJCXJldHVybiAwOwotCQkgICAgfQotCSAgICB9Ci0JfQotCi0JaWYgKCBjID09ICdjJyApIHsKLQkJY2hhciAqcCA9IE5VTEw7Ci0JCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwgKGFyZywgJnAsIDApOwotCQkvKiBjb21taXQ9Tk5OICh0aW1lIGluIHNlY29uZHMpICovCi0JCWlmICggKnAgIT0gJ1wwJyB8fCB2YWwgPj0gKHVuc2lnbmVkIGludCktMSkgewotCQkJcmVpc2VyZnNfd2FybmluZyAocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGJhZCB2YWx1ZSAlcyIsIGFyZyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkqY29tbWl0X21heF9hZ2UgPSAodW5zaWduZWQgaW50KXZhbDsKLQl9Ci0KLQlpZiAoIGMgPT0gJ3cnICkgewotCQljaGFyICpwPU5VTEw7Ci0JCWludCB2YWwgPSBzaW1wbGVfc3RydG91bCAoYXJnLCAmcCwgMCk7Ci0KLQkJaWYgKCAqcCAhPSAnXDAnKSB7Ci0JCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogbm9uLW51bWVyaWMgdmFsdWUgJXMgZm9yIG5vbGFyZ2VpbyBvcHRpb24iLCBhcmcpOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCB2YWwgKSAKLQkJICAgIHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZSA9IFBBR0VfU0laRTsKLQkJZWxzZQotCQkgICAgcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gMTI4ICogMTAyNDsKLQl9Ci0KLQlpZiAoYyA9PSAnaicpIHsKLQkgICAgaWYgKGFyZyAmJiAqYXJnICYmIGpkZXZfbmFtZSkgewotCQlpZiAoICpqZGV2X25hbWUgKSB7IC8vSG0sIGFscmVhZHkgYXNzaWduZWQ/Ci0JCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbCBkZXZpY2Ugd2FzIGFscmVhZHkgIHNwZWNpZmllZCB0byBiZSAlcyIsICpqZGV2X25hbWUpOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkJKmpkZXZfbmFtZSA9IGFyZzsKLQkgICAgfQotCX0KLQotI2lmZGVmIENPTkZJR19RVU9UQQotCWlmIChjID09ICd1JyB8fCBjID09ICdnJykgewotCSAgICBpbnQgcXR5cGUgPSBjID09ICd1JyA/IFVTUlFVT1RBIDogR1JQUVVPVEE7Ci0KLQkgICAgaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHMpKSB7Ci0JCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGNhbm5vdCBjaGFuZ2Ugam91cm5hbGxlZCBxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLiIpOwotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgICBpZiAoKmFyZykgewkvKiBTb21lIGZpbGVuYW1lIHNwZWNpZmllZD8gKi8KLQkgICAgICAgIGlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0gJiYgc3RyY21wKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSwgYXJnKSkgewotCQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogJXMgcXVvdGEgZmlsZSBhbHJlYWR5IHNwZWNpZmllZC4iLCBRVFlQRTJOQU1FKHF0eXBlKSk7Ci0JCSAgICByZXR1cm4gMDsKLQkJfQotCQlpZiAoc3RyY2hyKGFyZywgJy8nKSkgewotCQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogcXVvdGFmaWxlIG11c3QgYmUgb24gZmlsZXN5c3RlbSByb290LiIpOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkgICAgCVJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSA9IGttYWxsb2Moc3RybGVuKGFyZykrMSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCSAgICByZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBub3QgZW5vdWdoIG1lbW9yeSBmb3Igc3RvcmluZyBxdW90YWZpbGUgbmFtZS4iKTsKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JCXN0cmNweShSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0sIGFyZyk7Ci0JCSptb3VudF9vcHRpb25zIHw9IDE8PFJFSVNFUkZTX1FVT1RBOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCSAgICBrZnJlZShSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pOwotCQkgICAgUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JfQotCWlmIChjID09ICdmJykgewotCSAgICBpZiAoIXN0cmNtcChhcmcsICJ2ZnNvbGQiKSkKLQkJUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdCA9IFFGTVRfVkZTX09MRDsKLQkgICAgZWxzZSBpZiAoIXN0cmNtcChhcmcsICJ2ZnN2MCIpKQotCQlSRUlTRVJGU19TQihzKS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfVjA7Ci0JICAgIGVsc2UgewotCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiB1bmtub3duIHF1b3RhIGZvcm1hdCBzcGVjaWZpZWQuIik7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JfQotI2Vsc2UKLQlpZiAoYyA9PSAndScgfHwgYyA9PSAnZycgfHwgYyA9PSAnZicpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbGxlZCBxdW90YSBvcHRpb25zIG5vdCBzdXBwb3J0ZWQuIik7Ci0JICAgIHJldHVybiAwOwotCX0KLSNlbmRpZgotICAgIH0KLSAgICAKLSNpZmRlZiBDT05GSUdfUVVPVEEKLSAgICBpZiAoIVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQgJiYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fCBSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pKSB7Ci0JcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbGxlZCBxdW90YSBmb3JtYXQgbm90IHNwZWNpZmllZC4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgLyogVGhpcyBjaGVja2luZyBpcyBub3QgcHJlY2lzZSB3cnQgdGhlIHF1b3RhIHR5cGUgYnV0IGZvciBvdXIgcHVycG9zZXMgaXQgaXMgc3VmZmljaWVudCAqLwotICAgIGlmICghKCptb3VudF9vcHRpb25zICYgKDE8PFJFSVNFUkZTX1FVT1RBKSkgJiYgc2JfYW55X3F1b3RhX2VuYWJsZWQocykpIHsKLQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBxdW90YSBvcHRpb25zIG11c3QgYmUgcHJlc2VudCB3aGVuIHF1b3RhIGlzIHR1cm5lZCBvbi4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBzd2l0Y2hfZGF0YV9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBtb2RlKSB7Ci0gICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkgfAotCQkJCSAgICAgICAoMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSykpOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBtb2RlKTsKK3N0YXRpYyB2b2lkIHN3aXRjaF9kYXRhX21vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBsb25nIG1vZGUpCit7CisJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cpIHwKKwkJCQkJICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkgfAorCQkJCQkgKDEgPDwgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spKTsKKwlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgbW9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9kYXRhX21vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBsb25nIG1vdW50X29wdGlvbnMpCiB7Ci0gICAgaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX0xPRykpIHsKLSAgICAgICAgaWYgKCFyZWlzZXJmc19kYXRhX2xvZyhzKSkgewotCSAgICBzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfTE9HKTsKLQkgICAgcmVpc2VyZnNfaW5mbyAocywgInN3aXRjaGluZyB0byBqb3VybmFsZWQgZGF0YSBtb2RlXG4iKTsKKwlpZiAobW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX0RBVEFfTE9HKSkgeworCQlpZiAoIXJlaXNlcmZzX2RhdGFfbG9nKHMpKSB7CisJCQlzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfTE9HKTsKKwkJCXJlaXNlcmZzX2luZm8ocywgInN3aXRjaGluZyB0byBqb3VybmFsZWQgZGF0YSBtb2RlXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAobW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkpIHsKKwkJaWYgKCFyZWlzZXJmc19kYXRhX29yZGVyZWQocykpIHsKKwkJCXN3aXRjaF9kYXRhX21vZGUocywgUkVJU0VSRlNfREFUQV9PUkRFUkVEKTsKKwkJCXJlaXNlcmZzX2luZm8ocywgInN3aXRjaGluZyB0byBvcmRlcmVkIGRhdGEgbW9kZVxuIik7CisJCX0KKwl9IGVsc2UgaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSykpIHsKKwkJaWYgKCFyZWlzZXJmc19kYXRhX3dyaXRlYmFjayhzKSkgeworCQkJc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyk7CisJCQlyZWlzZXJmc19pbmZvKHMsICJzd2l0Y2hpbmcgdG8gd3JpdGViYWNrIGRhdGEgbW9kZVxuIik7CisJCX0KIAl9Ci0gICAgfSBlbHNlIGlmIChtb3VudF9vcHRpb25zICYgKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEKSkgewotICAgICAgICBpZiAoIXJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSkgewotCSAgICBzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfT1JERVJFRCk7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJzd2l0Y2hpbmcgdG8gb3JkZXJlZCBkYXRhIG1vZGVcbiIpOwotCX0KLSAgICB9IGVsc2UgaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSykpIHsKLSAgICAgICAgaWYgKCFyZWlzZXJmc19kYXRhX3dyaXRlYmFjayhzKSkgewotCSAgICBzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKTsKLQkgICAgcmVpc2VyZnNfaW5mbyAocywgInN3aXRjaGluZyB0byB3cml0ZWJhY2sgZGF0YSBtb2RlXG4iKTsKLQl9Ci0gICAgfQogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVfYmFycmllcl9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBiaXRzKSB7Ci0gICAgaW50IGZsdXNoID0gKDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSCk7Ci0gICAgaW50IG5vbmUgPSAoMSA8PCBSRUlTRVJGU19CQVJSSUVSX05PTkUpOwotICAgIGludCBhbGxfYmFycmllciA9IGZsdXNoIHwgbm9uZTsKLQotICAgIGlmIChiaXRzICYgYWxsX2JhcnJpZXIpIHsKLSAgICAgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH5hbGxfYmFycmllcjsKLQlpZiAoYml0cyAmIGZsdXNoKSB7Ci0JICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSBmbHVzaDsKLQkgICAgcHJpbnRrKCJyZWlzZXJmczogZW5hYmxpbmcgd3JpdGUgYmFycmllciBmbHVzaCBtb2RlXG4iKTsKLQl9IGVsc2UgaWYgKGJpdHMgJiBub25lKSB7Ci0JICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSBub25lOwotCSAgICBwcmludGsoInJlaXNlcmZzOiB3cml0ZSBiYXJyaWVycyB0dXJuZWQgb2ZmXG4iKTsKLQl9Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZV9hdHRycyggc3RydWN0IHN1cGVyX2Jsb2NrICpzICkKK3N0YXRpYyB2b2lkIGhhbmRsZV9iYXJyaWVyX21vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBsb25nIGJpdHMpCiB7Ci0Jc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKKwlpbnQgZmx1c2ggPSAoMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIKTsKKwlpbnQgbm9uZSA9ICgxIDw8IFJFSVNFUkZTX0JBUlJJRVJfTk9ORSk7CisJaW50IGFsbF9iYXJyaWVyID0gZmx1c2ggfCBub25lOwogCi0JaWYoIHJlaXNlcmZzX2F0dHJzKCBzICkgKSB7Ci0JCWlmKCBvbGRfZm9ybWF0X29ubHkocykgKSB7Ci0JCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmczogY2Fubm90IHN1cHBvcnQgYXR0cmlidXRlcyBvbiAzLjUueCBkaXNrIGZvcm1hdCIgKTsKLQkJCVJFSVNFUkZTX1NCKHMpIC0+IHNfbW91bnRfb3B0ICY9IH4gKCAxIDw8IFJFSVNFUkZTX0FUVFJTICk7CisJaWYgKGJpdHMgJiBhbGxfYmFycmllcikgeworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJj0gfmFsbF9iYXJyaWVyOworCQlpZiAoYml0cyAmIGZsdXNoKSB7CisJCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gZmx1c2g7CisJCQlwcmludGsoInJlaXNlcmZzOiBlbmFibGluZyB3cml0ZSBiYXJyaWVyIGZsdXNoIG1vZGVcbiIpOworCQl9IGVsc2UgaWYgKGJpdHMgJiBub25lKSB7CisJCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gbm9uZTsKKwkJCXByaW50aygicmVpc2VyZnM6IHdyaXRlIGJhcnJpZXJzIHR1cm5lZCBvZmZcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfYXR0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLKHMpOworCisJaWYgKHJlaXNlcmZzX2F0dHJzKHMpKSB7CisJCWlmIChvbGRfZm9ybWF0X29ubHkocykpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJyZWlzZXJmczogY2Fubm90IHN1cHBvcnQgYXR0cmlidXRlcyBvbiAzLjUueCBkaXNrIGZvcm1hdCIpOworCQkJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oMSA8PCBSRUlTRVJGU19BVFRSUyk7CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYoICEoIGxlMzJfdG9fY3B1KCBycyAtPiBzX2ZsYWdzICkgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkICkgKSB7Ci0JCQkJcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnM6IGNhbm5vdCBzdXBwb3J0IGF0dHJpYnV0ZXMgdW50aWwgZmxhZyBpcyBzZXQgaW4gc3VwZXItYmxvY2siICk7Ci0JCQkJUkVJU0VSRlNfU0IocykgLT4gc19tb3VudF9vcHQgJj0gfiAoIDEgPDwgUkVJU0VSRlNfQVRUUlMgKTsKKwkJaWYgKCEobGUzMl90b19jcHUocnMtPnNfZmxhZ3MpICYgcmVpc2VyZnNfYXR0cnNfY2xlYXJlZCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJyZWlzZXJmczogY2Fubm90IHN1cHBvcnQgYXR0cmlidXRlcyB1bnRpbCBmbGFnIGlzIHNldCBpbiBzdXBlci1ibG9jayIpOworCQkJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oMSA8PCBSRUlTRVJGU19BVFRSUyk7CiAJCX0KLQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KCBycyAtPiBzX2ZsYWdzICkgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkKSB7CisJfSBlbHNlIGlmIChsZTMyX3RvX2NwdShycy0+c19mbGFncykgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkKSB7CiAJCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSBSRUlTRVJGU19BVFRSUzsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgaW50ICogbW91bnRfZmxhZ3MsIGNoYXIgKiBhcmcpCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgKm1vdW50X2ZsYWdzLCBjaGFyICphcmcpCiB7Ci0gIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOwotICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgdW5zaWduZWQgbG9uZyBibG9ja3M7Ci0gIHVuc2lnbmVkIGxvbmcgbW91bnRfb3B0aW9ucyA9IFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdDsKLSAgdW5zaWduZWQgbG9uZyBzYWZlX21hc2sgPSAwOwotICB1bnNpZ25lZCBpbnQgY29tbWl0X21heF9hZ2UgPSAodW5zaWduZWQgaW50KS0xOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7Ci0gIGludCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpyczsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgbW91bnRfb3B0aW9ucyA9IFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdDsKKwl1bnNpZ25lZCBsb25nIHNhZmVfbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGNvbW1pdF9tYXhfYWdlID0gKHVuc2lnbmVkIGludCktMTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJaW50IGVycjsKICNpZmRlZiBDT05GSUdfUVVPVEEKLSAgaW50IGk7CisJaW50IGk7CiAjZW5kaWYKIAotICBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOworCXJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKIAotICBpZiAoIXJlaXNlcmZzX3BhcnNlX29wdGlvbnMocywgYXJnLCAmbW91bnRfb3B0aW9ucywgJmJsb2NrcywgTlVMTCwgJmNvbW1pdF9tYXhfYWdlKSkgeworCWlmICghcmVpc2VyZnNfcGFyc2Vfb3B0aW9ucworCSAgICAocywgYXJnLCAmbW91bnRfb3B0aW9ucywgJmJsb2NrcywgTlVMTCwgJmNvbW1pdF9tYXhfYWdlKSkgewogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKLQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0pIHsKLQkgICAga2ZyZWUoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0pOwotCSAgICBSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSA9IE5VTEw7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKKwkJCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSkgeworCQkJCWtmcmVlKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKTsKKwkJCQlSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSA9IE5VTEw7CisJCQl9CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotI2VuZGlmCi0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLSAgCi0gIGhhbmRsZV9hdHRycyhzKTsKIAotICAvKiBBZGQgb3B0aW9ucyB0aGF0IGFyZSBzYWZlIGhlcmUgKi8KLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfU01BTExUQUlMOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19MQVJHRVRBSUw7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUjsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfTk9fVU5IQVNIRURfUkVMT0NBVElPTjsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfSEFTSEVEX1JFTE9DQVRJT047Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1RFU1Q0OwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19BVFRSUzsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfWEFUVFJTX1VTRVI7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1BPU0lYQUNMOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19CQVJSSUVSX05PTkU7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRTsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUM7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1FVT1RBOworCWhhbmRsZV9hdHRycyhzKTsKIAotICAvKiBVcGRhdGUgdGhlIGJpdG1hc2ssIHRha2luZyBjYXJlIHRvIGtlZXAKLSAgICogdGhlIGJpdHMgd2UncmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGhlcmUgKi8KLSAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ID0gKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmIH5zYWZlX21hc2spIHwgIChtb3VudF9vcHRpb25zICYgc2FmZV9tYXNrKTsKKwkvKiBBZGQgb3B0aW9ucyB0aGF0IGFyZSBzYWZlIGhlcmUgKi8KKwlzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19TTUFMTFRBSUw7CisJc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfTEFSR0VUQUlMOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUjsKKwlzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1RFU1Q0OworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0FUVFJTOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1hBVFRSU19VU0VSOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1BPU0lYQUNMOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0g7CisJc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1FVT1RBOwogCi0gIGlmKGNvbW1pdF9tYXhfYWdlICE9IDAgJiYgY29tbWl0X21heF9hZ2UgIT0gKHVuc2lnbmVkIGludCktMSkgewotICAgIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgfQotICBlbHNlIGlmKGNvbW1pdF9tYXhfYWdlID09IDApCi0gIHsKLSAgICAvKiAwIG1lYW5zIHJlc3RvcmUgZGVmYXVsdHMuICovCi0gICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGpvdXJuYWwtPmpfZGVmYXVsdF9tYXhfY29tbWl0X2FnZTsKLSAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBKT1VSTkFMX01BWF9UUkFOU19BR0U7Ci0gIH0KKwkvKiBVcGRhdGUgdGhlIGJpdG1hc2ssIHRha2luZyBjYXJlIHRvIGtlZXAKKwkgKiB0aGUgYml0cyB3ZSdyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgaGVyZSAqLworCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCA9CisJICAgIChSRUlTRVJGU19TQihzKS0+CisJICAgICBzX21vdW50X29wdCAmIH5zYWZlX21hc2spIHwgKG1vdW50X29wdGlvbnMgJiBzYWZlX21hc2spOwogCi0gIGlmKGJsb2NrcykgewotICAgIGludCByYyA9IHJlaXNlcmZzX3Jlc2l6ZShzLCBibG9ja3MpOwotICAgIGlmIChyYyAhPSAwKQotICAgICAgcmV0dXJuIHJjOwotICB9CisJaWYgKGNvbW1pdF9tYXhfYWdlICE9IDAgJiYgY29tbWl0X21heF9hZ2UgIT0gKHVuc2lnbmVkIGludCktMSkgeworCQlqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gY29tbWl0X21heF9hZ2U7CisJCWpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSA9IGNvbW1pdF9tYXhfYWdlOworCX0gZWxzZSBpZiAoY29tbWl0X21heF9hZ2UgPT0gMCkgeworCQkvKiAwIG1lYW5zIHJlc3RvcmUgZGVmYXVsdHMuICovCisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBqb3VybmFsLT5qX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2U7CisJCWpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSA9IEpPVVJOQUxfTUFYX1RSQU5TX0FHRTsKKwl9CiAKLSAgaWYgKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkgewotICAgIHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0gICAgLyogcmVtb3VudCByZWFkLW9ubHkgKi8KLSAgICBpZiAocy0+c19mbGFncyAmIE1TX1JET05MWSkKLSAgICAgIC8qIGl0IGlzIHJlYWQtb25seSBhbHJlYWR5ICovCi0gICAgICByZXR1cm4gMDsKLSAgICAvKiB0cnkgdG8gcmVtb3VudCBmaWxlIHN5c3RlbSB3aXRoIHJlYWQtb25seSBwZXJtaXNzaW9ucyAqLwotICAgIGlmIChzYl91bW91bnRfc3RhdGUocnMpID09IFJFSVNFUkZTX1ZBTElEX0ZTIHx8IFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICE9IFJFSVNFUkZTX1ZBTElEX0ZTKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisJaWYgKGJsb2NrcykgeworCQlpbnQgcmMgPSByZWlzZXJmc19yZXNpemUocywgYmxvY2tzKTsKKwkJaWYgKHJjICE9IDApCisJCQlyZXR1cm4gcmM7CisJfQogCi0gICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSA7Ci0gICAgaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKKwlpZiAoKm1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXJlaXNlcmZzX3hhdHRyX2luaXQocywgKm1vdW50X2ZsYWdzKTsKKwkJLyogcmVtb3VudCByZWFkLW9ubHkgKi8KKwkJaWYgKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCQkvKiBpdCBpcyByZWFkLW9ubHkgYWxyZWFkeSAqLworCQkJcmV0dXJuIDA7CisJCS8qIHRyeSB0byByZW1vdW50IGZpbGUgc3lzdGVtIHdpdGggcmVhZC1vbmx5IHBlcm1pc3Npb25zICovCisJCWlmIChzYl91bW91bnRfc3RhdGUocnMpID09IFJFSVNFUkZTX1ZBTElEX0ZTCisJCSAgICB8fCBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSAhPSBSRUlTRVJGU19WQUxJRF9GUykgeworCQkJcmV0dXJuIDA7CisJCX0KIAotICAgIC8qIE1vdW50aW5nIGEgcncgcGFydGl0aW9uIHJlYWQtb25seS4gKi8KLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7Ci0gICAgc2V0X3NiX3Vtb3VudF9zdGF0ZSggcnMsIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICk7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKLSAgfSBlbHNlIHsKLSAgICAvKiByZW1vdW50IHJlYWQtd3JpdGUgKi8KLSAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCXJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0JcmV0dXJuIDA7IC8qIFdlIGFyZSByZWFkLXdyaXRlIGFscmVhZHkgKi8KLSAgICB9CisJCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxMCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCi0gICAgaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCi0JcmV0dXJuIGpvdXJuYWwtPmpfZXJybm87CisJCS8qIE1vdW50aW5nIGEgcncgcGFydGl0aW9uIHJlYWQtb25seS4gKi8KKwkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7CisJCXNldF9zYl91bW91bnRfc3RhdGUocnMsIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOworCX0gZWxzZSB7CisJCS8qIHJlbW91bnQgcmVhZC13cml0ZSAqLworCQlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJcmVpc2VyZnNfeGF0dHJfaW5pdChzLCAqbW91bnRfZmxhZ3MpOworCQkJcmV0dXJuIDA7CS8qIFdlIGFyZSByZWFkLXdyaXRlIGFscmVhZHkgKi8KKwkJfQogCi0gICAgaGFuZGxlX2RhdGFfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKLSAgICBoYW5kbGVfYmFycmllcl9tb2RlKHMsIG1vdW50X29wdGlvbnMpOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlID0gc2JfdW1vdW50X3N0YXRlKHJzKSA7Ci0gICAgcy0+c19mbGFncyAmPSB+TVNfUkRPTkxZIDsgLyogbm93IGl0IGlzIHNhZmUgdG8gY2FsbCBqb3VybmFsX2JlZ2luICovCi0gICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSA7Ci0gICAgaWYgKGVycikKLQlyZXR1cm4gZXJyOwotICAgIAotICAgIC8qIE1vdW50IGEgcGFydGl0aW9uIHdoaWNoIGlzIHJlYWQtb25seSwgcmVhZC13cml0ZSAqLwotICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKLSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IHNiX3Vtb3VudF9zdGF0ZShycyk7Ci0gICAgcy0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwotICAgIHNldF9zYl91bW91bnRfc3RhdGUoIHJzLCBSRUlTRVJGU19FUlJPUl9GUyApOwotICAgIC8qIG1hcmtfYnVmZmVyX2RpcnR5IChTQl9CVUZGRVJfV0lUSF9TQiAocyksIDEpOyAqLwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgPSBSRUlTRVJGU19WQUxJRF9GUyA7Ci0gIH0KLSAgLyogdGhpcyB3aWxsIGZvcmNlIGEgZnVsbCBmbHVzaCBvZiBhbGwgam91cm5hbCBsaXN0cyAqLwotICBTQl9KT1VSTkFMKHMpLT5qX211c3Rfd2FpdCA9IDEgOwotICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIHMsIDEwKSA7Ci0gIGlmIChlcnIpCi0gICAgcmV0dXJuIGVycjsKLSAgcy0+c19kaXJ0ID0gMDsKKwkJaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKKwkJCXJldHVybiBqb3VybmFsLT5qX2Vycm5vOwogCi0gIGlmICghKCAqbW91bnRfZmxhZ3MgJiBNU19SRE9OTFkgKSApIHsKLSAgICBmaW5pc2hfdW5maW5pc2hlZCggcyApOwotICAgIHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0gIH0KKwkJaGFuZGxlX2RhdGFfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKKwkJaGFuZGxlX2JhcnJpZXJfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKKwkJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgPSBzYl91bW91bnRfc3RhdGUocnMpOworCQlzLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CS8qIG5vdyBpdCBpcyBzYWZlIHRvIGNhbGwgam91cm5hbF9iZWdpbiAqLworCQllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotICByZXR1cm4gMDsKKwkJLyogTW91bnQgYSBwYXJ0aXRpb24gd2hpY2ggaXMgcmVhZC1vbmx5LCByZWFkLXdyaXRlICovCisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IHNiX3Vtb3VudF9zdGF0ZShycyk7CisJCXMtPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKwkJc2V0X3NiX3Vtb3VudF9zdGF0ZShycywgUkVJU0VSRlNfRVJST1JfRlMpOworCQkvKiBtYXJrX2J1ZmZlcl9kaXJ0eSAoU0JfQlVGRkVSX1dJVEhfU0IgKHMpLCAxKTsgKi8KKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IFJFSVNFUkZTX1ZBTElEX0ZTOworCX0KKwkvKiB0aGlzIHdpbGwgZm9yY2UgYSBmdWxsIGZsdXNoIG9mIGFsbCBqb3VybmFsIGxpc3RzICovCisJU0JfSk9VUk5BTChzKS0+al9tdXN0X3dhaXQgPSAxOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMTApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcy0+c19kaXJ0ID0gMDsKKworCWlmICghKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJZmluaXNoX3VuZmluaXNoZWQocyk7CisJCXJlaXNlcmZzX3hhdHRyX2luaXQocywgKm1vdW50X2ZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyogbG9hZF9iaXRtYXBfaW5mb19kYXRhIC0gU2V0cyB1cCB0aGUgcmVpc2VyZnNfYml0bWFwX2luZm8gc3RydWN0dXJlIGZyb20gZGlzay4KQEAgLTEyMTQsNzYxICsxMjg1LDgyOSBAQAogICogZnJlZSBibG9ja3MgYXQgYWxsLgogICovCiAKLXN0YXRpYyB2b2lkIGxvYWRfYml0bWFwX2luZm9fZGF0YSAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaSkKK3N0YXRpYyB2b2lkIGxvYWRfYml0bWFwX2luZm9fZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaSkKIHsKLSAgICB1bnNpZ25lZCBsb25nICpjdXIgPSAodW5zaWduZWQgbG9uZyAqKWJpLT5iaC0+Yl9kYXRhOworCXVuc2lnbmVkIGxvbmcgKmN1ciA9ICh1bnNpZ25lZCBsb25nICopYmktPmJoLT5iX2RhdGE7CiAKLSAgICB3aGlsZSAoKGNoYXIgKiljdXIgPCAoYmktPmJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemUpKSB7CisJd2hpbGUgKChjaGFyICopY3VyIDwgKGJpLT5iaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplKSkgewogCi0JLyogTm8gbmVlZCB0byBzY2FuIGlmIGFsbCAwJ3Mgb3IgYWxsIDEncy4KLQkgKiBTaW5jZSB3ZSdyZSBvbmx5IGNvdW50aW5nIDAncywgd2UgY2FuIHNpbXBseSBpZ25vcmUgYWxsIDEncyAqLwotCWlmICgqY3VyID09IDApIHsKLQkgICAgaWYgKGJpLT5maXJzdF96ZXJvX2hpbnQgPT0gMCkgewotCQliaS0+Zmlyc3RfemVyb19oaW50ID0gKChjaGFyICopY3VyIC0gYmktPmJoLT5iX2RhdGEpIDw8IDM7Ci0JICAgIH0KLQkgICAgYmktPmZyZWVfY291bnQgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjg7Ci0JfSBlbHNlIGlmICgqY3VyICE9IH4wTCkgewotCSAgICBpbnQgYjsKLQkgICAgZm9yIChiID0gMDsgYiA8IHNpemVvZih1bnNpZ25lZCBsb25nKSo4OyBiKyspIHsKLQkJaWYgKCFyZWlzZXJmc190ZXN0X2xlX2JpdCAoYiwgY3VyKSkgewotCQkgICAgYmktPmZyZWVfY291bnQgKys7Ci0JCSAgICBpZiAoYmktPmZpcnN0X3plcm9faGludCA9PSAwKQotCQkJYmktPmZpcnN0X3plcm9faGludCA9Ci0JCQkJCSgoKGNoYXIgKiljdXIgLSBiaS0+YmgtPmJfZGF0YSkgPDwgMykgKyBiOwotCQkgICAgfQorCQkvKiBObyBuZWVkIHRvIHNjYW4gaWYgYWxsIDAncyBvciBhbGwgMSdzLgorCQkgKiBTaW5jZSB3ZSdyZSBvbmx5IGNvdW50aW5nIDAncywgd2UgY2FuIHNpbXBseSBpZ25vcmUgYWxsIDEncyAqLworCQlpZiAoKmN1ciA9PSAwKSB7CisJCQlpZiAoYmktPmZpcnN0X3plcm9faGludCA9PSAwKSB7CisJCQkJYmktPmZpcnN0X3plcm9faGludCA9CisJCQkJICAgICgoY2hhciAqKWN1ciAtIGJpLT5iaC0+Yl9kYXRhKSA8PCAzOworCQkJfQorCQkJYmktPmZyZWVfY291bnQgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogODsKKwkJfSBlbHNlIGlmICgqY3VyICE9IH4wTCkgeworCQkJaW50IGI7CisJCQlmb3IgKGIgPSAwOyBiIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogODsgYisrKSB7CisJCQkJaWYgKCFyZWlzZXJmc190ZXN0X2xlX2JpdChiLCBjdXIpKSB7CisJCQkJCWJpLT5mcmVlX2NvdW50Kys7CisJCQkJCWlmIChiaS0+Zmlyc3RfemVyb19oaW50ID09IDApCisJCQkJCQliaS0+Zmlyc3RfemVyb19oaW50ID0KKwkJCQkJCSAgICAoKChjaGFyICopY3VyIC0KKwkJCQkJCSAgICAgIGJpLT5iaC0+Yl9kYXRhKSA8PCAzKSArIGI7CisJCQkJfQorCQkJfQogCQl9Ci0JICAgIH0KLQljdXIgKys7Ci0gICAgfQorCQljdXIrKzsKKwl9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKIC8vIFRoaXMgb3V0cHV0cyBhIGxvdCBvZiB1bm5lZGVkIGluZm8gb24gYmlnIEZTZXMKIC8vICAgIHJlaXNlcmZzX3dhcm5pbmcgKCJiaXRtYXAgbG9hZGVkIGZyb20gYmxvY2sgJWQ6ICVkIGZyZWUgYmxvY2tzIiwKLS8vCQkgICAgICBiaS0+YmgtPmJfYmxvY2tuciwgYmktPmZyZWVfY291bnQpOworLy8gICAgICAgICAgICAgICAgICAgIGJpLT5iaC0+Yl9ibG9ja25yLCBiaS0+ZnJlZV9jb3VudCk7CiAjZW5kaWYKIH0KLSAgCi1zdGF0aWMgaW50IHJlYWRfYml0bWFwcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKLXsKLSAgICBpbnQgaSwgYm1hcF9ucjsKIAotICAgIFNCX0FQX0JJVE1BUCAocykgPSB2bWFsbG9jIChzaXplb2YgKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBTQl9CTUFQX05SKHMpKTsKLSAgICBpZiAoU0JfQVBfQklUTUFQIChzKSA9PSAwKQotCXJldHVybiAxOwotICAgIG1lbXNldCAoU0JfQVBfQklUTUFQIChzKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8pICogU0JfQk1BUF9OUihzKSk7Ci0gICAgZm9yIChpID0gMCwgYm1hcF9uciA9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUgKyAxOwotCSBpIDwgU0JfQk1BUF9OUihzKTsgaSsrLCBibWFwX25yID0gcy0+c19ibG9ja3NpemUgKiA4ICogaSkgewotCVNCX0FQX0JJVE1BUCAocylbaV0uYmggPSBzYl9nZXRibGsocywgYm1hcF9ucik7Ci0JaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkKLQkgICAgbGxfcndfYmxvY2soUkVBRCwgMSwgJlNCX0FQX0JJVE1BUChzKVtpXS5iaCk7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspIHsKLQl3YWl0X29uX2J1ZmZlcihTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKTsKLQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcocywic2gtMjAyOTogcmVpc2VyZnMgcmVhZF9iaXRtYXBzOiAiCi0JCQkgImJpdG1hcCBibG9jayAoIyVsdSkgcmVhZGluZyBmYWlsZWQiLAotCQkJIFNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9ibG9ja25yKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKLQkJYnJlbHNlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCk7Ci0JICAgIHZmcmVlKFNCX0FQX0JJVE1BUChzKSk7Ci0JICAgIFNCX0FQX0JJVE1BUChzKSA9IE5VTEw7Ci0JICAgIHJldHVybiAxOworc3RhdGljIGludCByZWFkX2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCWludCBpLCBibWFwX25yOworCisJU0JfQVBfQklUTUFQKHMpID0KKwkgICAgdm1hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOworCWlmIChTQl9BUF9CSVRNQVAocykgPT0gMCkKKwkJcmV0dXJuIDE7CisJbWVtc2V0KFNCX0FQX0JJVE1BUChzKSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBTQl9CTUFQX05SKHMpKTsKKwlmb3IgKGkgPSAwLCBibWFwX25yID0KKwkgICAgIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUgKyAxOworCSAgICAgaSA8IFNCX0JNQVBfTlIocyk7IGkrKywgYm1hcF9uciA9IHMtPnNfYmxvY2tzaXplICogOCAqIGkpIHsKKwkJU0JfQVBfQklUTUFQKHMpW2ldLmJoID0gc2JfZ2V0YmxrKHMsIGJtYXBfbnIpOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKQorCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJlNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CiAJfQotCWxvYWRfYml0bWFwX2luZm9fZGF0YSAocywgU0JfQVBfQklUTUFQIChzKSArIGkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUihzKTsgaSsrKSB7CisJCXdhaXRfb25fYnVmZmVyKFNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgInNoLTIwMjk6IHJlaXNlcmZzIHJlYWRfYml0bWFwczogIgorCQkJCQkgImJpdG1hcCBibG9jayAoIyVsdSkgcmVhZGluZyBmYWlsZWQiLAorCQkJCQkgU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2Jsb2NrbnIpOworCQkJZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKKwkJCQlicmVsc2UoU0JfQVBfQklUTUFQKHMpW2ldLmJoKTsKKwkJCXZmcmVlKFNCX0FQX0JJVE1BUChzKSk7CisJCQlTQl9BUF9CSVRNQVAocykgPSBOVUxMOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbG9hZF9iaXRtYXBfaW5mb19kYXRhKHMsIFNCX0FQX0JJVE1BUChzKSArIGkpOworCX0KKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWFkX29sZF9iaXRtYXBzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIGludCByZWFkX29sZF9iaXRtYXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgaW50IGkgOwotICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7Ci0gIGludCBibXAxID0gKFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUyAvIHMtPnNfYmxvY2tzaXplKSArIDE7ICAvKiBmaXJzdCBvZiBiaXRtYXAgYmxvY2tzICovCisJaW50IGk7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisJaW50IGJtcDEgPSAoUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUpICsgMTsJLyogZmlyc3Qgb2YgYml0bWFwIGJsb2NrcyAqLwogCi0gIC8qIHJlYWQgdHJ1ZSBiaXRtYXAgKi8KLSAgU0JfQVBfQklUTUFQIChzKSA9IHZtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2J1ZmZlcl9pbmZvICopICogc2JfYm1hcF9ucihycykpOwotICBpZiAoU0JfQVBfQklUTUFQIChzKSA9PSAwKQotICAgIHJldHVybiAxOworCS8qIHJlYWQgdHJ1ZSBiaXRtYXAgKi8KKwlTQl9BUF9CSVRNQVAocykgPQorCSAgICB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYnVmZmVyX2luZm8gKikgKiBzYl9ibWFwX25yKHJzKSk7CisJaWYgKFNCX0FQX0JJVE1BUChzKSA9PSAwKQorCQlyZXR1cm4gMTsKIAotICBtZW1zZXQgKFNCX0FQX0JJVE1BUCAocyksIDAsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2J1ZmZlcl9pbmZvICopICogc2JfYm1hcF9ucihycykpOworCW1lbXNldChTQl9BUF9CSVRNQVAocyksIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYnVmZmVyX2luZm8gKikgKiBzYl9ibWFwX25yKHJzKSk7CiAKLSAgZm9yIChpID0gMDsgaSA8IHNiX2JtYXBfbnIocnMpOyBpICsrKSB7Ci0gICAgU0JfQVBfQklUTUFQIChzKVtpXS5iaCA9IHNiX2JyZWFkIChzLCBibXAxICsgaSk7Ci0gICAgaWYgKCFTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKQotICAgICAgcmV0dXJuIDE7Ci0gICAgbG9hZF9iaXRtYXBfaW5mb19kYXRhIChzLCBTQl9BUF9CSVRNQVAgKHMpICsgaSk7Ci0gIH0KKwlmb3IgKGkgPSAwOyBpIDwgc2JfYm1hcF9ucihycyk7IGkrKykgeworCQlTQl9BUF9CSVRNQVAocylbaV0uYmggPSBzYl9icmVhZChzLCBibXAxICsgaSk7CisJCWlmICghU0JfQVBfQklUTUFQKHMpW2ldLmJoKQorCQkJcmV0dXJuIDE7CisJCWxvYWRfYml0bWFwX2luZm9fZGF0YShzLCBTQl9BUF9CSVRNQVAocykgKyBpKTsKKwl9CiAKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9zdXBlcl9ibG9jayAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgaW50IG9mZnNldCkKK3N0YXRpYyBpbnQgcmVhZF9zdXBlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBvZmZzZXQpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7Ci0gICAgaW50IGZzX2Jsb2Nrc2l6ZTsKLSAKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnM7CisJaW50IGZzX2Jsb2Nrc2l6ZTsKIAotICAgIGJoID0gc2JfYnJlYWQgKHMsIG9mZnNldCAvIHMtPnNfYmxvY2tzaXplKTsKLSAgICBpZiAoIWJoKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAwNjogcmVhZF9zdXBlcl9ibG9jazogIgotICAgICAgICAgICAgICAiYnJlYWQgZmFpbGVkIChkZXYgJXMsIGJsb2NrICVsdSwgc2l6ZSAlbHUpIiwKLSAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSwgcy0+c19ibG9ja3NpemUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotIAotICAgIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7Ci0gICAgaWYgKCFpc19hbnlfcmVpc2VyZnNfbWFnaWNfc3RyaW5nIChycykpIHsKLSAgICAgIGJyZWxzZSAoYmgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotIAotICAgIC8vCi0gICAgLy8gb2ssIHJlaXNlcmZzIHNpZ25hdHVyZSAob2xkIG9yIG5ldykgZm91bmQgaW4gYXQgdGhlIGdpdmVuIG9mZnNldAotICAgIC8vICAgIAotICAgIGZzX2Jsb2Nrc2l6ZSA9IHNiX2Jsb2Nrc2l6ZShycyk7Ci0gICAgYnJlbHNlIChiaCk7Ci0gICAgc2Jfc2V0X2Jsb2Nrc2l6ZSAocywgZnNfYmxvY2tzaXplKTsKLSAgICAKLSAgICBiaCA9IHNiX2JyZWFkIChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7Ci0gICAgaWYgKCFiaCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJzaC0yMDA3OiByZWFkX3N1cGVyX2Jsb2NrOiAiCi0gICAgICAgICAgICAgICAgImJyZWFkIGZhaWxlZCAoZGV2ICVzLCBibG9jayAlbHUsIHNpemUgJWx1KVxuIiwKLSAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAocyksIG9mZnNldCAvIHMtPnNfYmxvY2tzaXplLCBzLT5zX2Jsb2Nrc2l6ZSk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotICAgIAotICAgIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7Ci0gICAgaWYgKHNiX2Jsb2Nrc2l6ZShycykgIT0gcy0+c19ibG9ja3NpemUpIHsKLQlyZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAxMTogcmVhZF9zdXBlcl9ibG9jazogIgotCQkiY2FuJ3QgZmluZCBhIHJlaXNlcmZzIGZpbGVzeXN0ZW0gb24gKGRldiAlcywgYmxvY2sgJUx1LCBzaXplICVsdSlcbiIsCi0JCXJlaXNlcmZzX2JkZXZuYW1lIChzKSwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBzLT5zX2Jsb2Nrc2l6ZSk7Ci0JYnJlbHNlIChiaCk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCBycy0+c192MS5zX3Jvb3RfYmxvY2sgPT0gY3B1X3RvX2xlMzIoLTEpICkgewotICAgICAgIGJyZWxzZShiaCkgOwotICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJVbmZpbmlzaGVkIHJlaXNlcmZzY2sgLS1yZWJ1aWxkLXRyZWUgcnVuIGRldGVjdGVkLiBQbGVhc2UgcnVuXG4iCi0gICAgICAgICAgICAgICJyZWlzZXJmc2NrIC0tcmVidWlsZC10cmVlIGFuZCB3YWl0IGZvciBhIGNvbXBsZXRpb24uIElmIHRoYXQgZmFpbHNcbiIKLSAgICAgICAgICAgICAgImdldCBuZXdlciByZWlzZXJmc3Byb2dzIHBhY2thZ2UiKTsKLSAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBTQl9CVUZGRVJfV0lUSF9TQiAocykgPSBiaDsKLSAgICBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKSA9IHJzOwotCi0gICAgaWYgKGlzX3JlaXNlcmZzX2pyIChycykpIHsKLQkvKiBtYWdpYyBpcyBvZiBub24tc3RhbmRhcmQgam91cm5hbCBmaWxlc3lzdGVtLCBsb29rIGF0IHNfdmVyc2lvbiB0bwotCSAgIGZpbmQgd2hpY2ggZm9ybWF0IGlzIGluIHVzZSAqLwotCWlmIChzYl92ZXJzaW9uKHJzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzIpCi0JICByZWlzZXJmc193YXJuaW5nIChzLCAicmVhZF9zdXBlcl9ibG9jazogZm91bmQgcmVpc2VyZnMgZm9ybWF0IFwiMy42XCIiCi0JCSAgIiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsIik7Ci0JZWxzZSBpZiAoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8xKQotCSAgcmVpc2VyZnNfd2FybmluZyAocywgInJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHJlaXNlcmZzIGZvcm1hdCBcIjMuNVwiIgotCQkgICIgd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCIpOwotCWVsc2UgewotCSAgcmVpc2VyZnNfd2FybmluZyAocywgInNoLTIwMTI6IHJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHVua25vd24gIgotCQkJICAgICJmb3JtYXQgXCIldVwiIG9mIHJlaXNlcmZzIHdpdGggbm9uLXN0YW5kYXJkIG1hZ2ljIiwKLQkJCSAgICBzYl92ZXJzaW9uKHJzKSk7Ci0JcmV0dXJuIDE7CisJYmggPSBzYl9icmVhZChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJzaC0yMDA2OiByZWFkX3N1cGVyX2Jsb2NrOiAiCisJCQkJICJicmVhZCBmYWlsZWQgKGRldiAlcywgYmxvY2sgJWx1LCBzaXplICVsdSkiLAorCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSwgb2Zmc2V0IC8gcy0+c19ibG9ja3NpemUsCisJCQkJIHMtPnNfYmxvY2tzaXplKTsKKwkJcmV0dXJuIDE7CiAJfQotICAgIH0KLSAgICBlbHNlCi0gICAgICAvKiBzX3ZlcnNpb24gb2Ygc3RhbmRhcmQgZm9ybWF0IG1heSBjb250YWluIGluY29ycmVjdCBpbmZvcm1hdGlvbiwKLQkgc28gd2UganVzdCBsb29rIGF0IHRoZSBtYWdpYyBzdHJpbmcgKi8KLSAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJmb3VuZCByZWlzZXJmcyBmb3JtYXQgXCIlc1wiIHdpdGggc3RhbmRhcmQgam91cm5hbFxuIiwKLQkgICAgICBpc19yZWlzZXJmc18zXzUgKHJzKSA/ICIzLjUiIDogIjMuNiIpOwogCi0gICAgcy0+c19vcCA9ICZyZWlzZXJmc19zb3BzOwotICAgIHMtPnNfZXhwb3J0X29wID0gJnJlaXNlcmZzX2V4cG9ydF9vcHM7CisJcnMgPSAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICopYmgtPmJfZGF0YTsKKwlpZiAoIWlzX2FueV9yZWlzZXJmc19tYWdpY19zdHJpbmcocnMpKSB7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAxOworCX0KKwkvLworCS8vIG9rLCByZWlzZXJmcyBzaWduYXR1cmUgKG9sZCBvciBuZXcpIGZvdW5kIGluIGF0IHRoZSBnaXZlbiBvZmZzZXQKKwkvLyAgICAKKwlmc19ibG9ja3NpemUgPSBzYl9ibG9ja3NpemUocnMpOworCWJyZWxzZShiaCk7CisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBmc19ibG9ja3NpemUpOworCisJYmggPSBzYl9icmVhZChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJzaC0yMDA3OiByZWFkX3N1cGVyX2Jsb2NrOiAiCisJCQkJICJicmVhZCBmYWlsZWQgKGRldiAlcywgYmxvY2sgJWx1LCBzaXplICVsdSlcbiIsCisJCQkJIHJlaXNlcmZzX2JkZXZuYW1lKHMpLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgcy0+c19ibG9ja3NpemUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlycyA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworCWlmIChzYl9ibG9ja3NpemUocnMpICE9IHMtPnNfYmxvY2tzaXplKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgInNoLTIwMTE6IHJlYWRfc3VwZXJfYmxvY2s6ICIKKwkJCQkgImNhbid0IGZpbmQgYSByZWlzZXJmcyBmaWxlc3lzdGVtIG9uIChkZXYgJXMsIGJsb2NrICVMdSwgc2l6ZSAlbHUpXG4iLAorCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJCSBzLT5zX2Jsb2Nrc2l6ZSk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChycy0+c192MS5zX3Jvb3RfYmxvY2sgPT0gY3B1X3RvX2xlMzIoLTEpKSB7CisJCWJyZWxzZShiaCk7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgIlVuZmluaXNoZWQgcmVpc2VyZnNjayAtLXJlYnVpbGQtdHJlZSBydW4gZGV0ZWN0ZWQuIFBsZWFzZSBydW5cbiIKKwkJCQkgInJlaXNlcmZzY2sgLS1yZWJ1aWxkLXRyZWUgYW5kIHdhaXQgZm9yIGEgY29tcGxldGlvbi4gSWYgdGhhdCBmYWlsc1xuIgorCQkJCSAiZ2V0IG5ld2VyIHJlaXNlcmZzcHJvZ3MgcGFja2FnZSIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlTQl9CVUZGRVJfV0lUSF9TQihzKSA9IGJoOworCVNCX0RJU0tfU1VQRVJfQkxPQ0socykgPSByczsKKworCWlmIChpc19yZWlzZXJmc19qcihycykpIHsKKwkJLyogbWFnaWMgaXMgb2Ygbm9uLXN0YW5kYXJkIGpvdXJuYWwgZmlsZXN5c3RlbSwgbG9vayBhdCBzX3ZlcnNpb24gdG8KKwkJICAgZmluZCB3aGljaCBmb3JtYXQgaXMgaW4gdXNlICovCisJCWlmIChzYl92ZXJzaW9uKHJzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzIpCisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAicmVhZF9zdXBlcl9ibG9jazogZm91bmQgcmVpc2VyZnMgZm9ybWF0IFwiMy42XCIiCisJCQkJCSAiIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwiKTsKKwkJZWxzZSBpZiAoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8xKQorCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHJlaXNlcmZzIGZvcm1hdCBcIjMuNVwiIgorCQkJCQkgIiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsIik7CisJCWVsc2UgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInNoLTIwMTI6IHJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHVua25vd24gIgorCQkJCQkgImZvcm1hdCBcIiV1XCIgb2YgcmVpc2VyZnMgd2l0aCBub24tc3RhbmRhcmQgbWFnaWMiLAorCQkJCQkgc2JfdmVyc2lvbihycykpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UKKwkJLyogc192ZXJzaW9uIG9mIHN0YW5kYXJkIGZvcm1hdCBtYXkgY29udGFpbiBpbmNvcnJlY3QgaW5mb3JtYXRpb24sCisJCSAgIHNvIHdlIGp1c3QgbG9vayBhdCB0aGUgbWFnaWMgc3RyaW5nICovCisJCXJlaXNlcmZzX2luZm8ocywKKwkJCSAgICAgICJmb3VuZCByZWlzZXJmcyBmb3JtYXQgXCIlc1wiIHdpdGggc3RhbmRhcmQgam91cm5hbFxuIiwKKwkJCSAgICAgIGlzX3JlaXNlcmZzXzNfNShycykgPyAiMy41IiA6ICIzLjYiKTsKKworCXMtPnNfb3AgPSAmcmVpc2VyZnNfc29wczsKKwlzLT5zX2V4cG9ydF9vcCA9ICZyZWlzZXJmc19leHBvcnRfb3BzOwogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIHMtPnNfcWNvcCA9ICZyZWlzZXJmc19xY3RsX29wZXJhdGlvbnM7Ci0gICAgcy0+ZHFfb3AgPSAmcmVpc2VyZnNfcXVvdGFfb3BlcmF0aW9uczsKKwlzLT5zX3Fjb3AgPSAmcmVpc2VyZnNfcWN0bF9vcGVyYXRpb25zOworCXMtPmRxX29wID0gJnJlaXNlcmZzX3F1b3RhX29wZXJhdGlvbnM7CiAjZW5kaWYKIAotICAgIC8qIG5ldyBmb3JtYXQgaXMgbGltaXRlZCBieSB0aGUgMzIgYml0IHdpZGUgaV9ibG9ja3MgZmllbGQsIHdhbnQgdG8KLSAgICAqKiBiZSBvbmUgZnVsbCBibG9jayBiZWxvdyB0aGF0LgotICAgICovCi0gICAgcy0+c19tYXhieXRlcyA9ICg1MTJMTCA8PCAzMikgLSBzLT5zX2Jsb2Nrc2l6ZSA7Ci0gICAgcmV0dXJuIDA7CisJLyogbmV3IGZvcm1hdCBpcyBsaW1pdGVkIGJ5IHRoZSAzMiBiaXQgd2lkZSBpX2Jsb2NrcyBmaWVsZCwgd2FudCB0bworCSAqKiBiZSBvbmUgZnVsbCBibG9jayBiZWxvdyB0aGF0LgorCSAqLworCXMtPnNfbWF4Ynl0ZXMgPSAoNTEyTEwgPDwgMzIpIC0gcy0+c19ibG9ja3NpemU7CisJcmV0dXJuIDA7CiB9CiAKLQotCiAvKiBhZnRlciBqb3VybmFsIHJlcGxheSwgcmVyZWFkIGFsbCBiaXRtYXAgYW5kIHN1cGVyIGJsb2NrcyAqLwotc3RhdGljIGludCByZXJlYWRfbWV0YV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7Ci0gIGludCBpIDsKLSAgbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9CVUZGRVJfV0lUSF9TQihzKSkpIDsKLSAgd2FpdF9vbl9idWZmZXIoU0JfQlVGRkVSX1dJVEhfU0IocykpIDsKLSAgaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQlVGRkVSX1dJVEhfU0IocykpKSB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAocywgInJlcmVhZF9tZXRhX2Jsb2NrcywgZXJyb3IgcmVhZGluZyB0aGUgc3VwZXIiKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9CitzdGF0aWMgaW50IHJlcmVhZF9tZXRhX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJaW50IGk7CisJbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9CVUZGRVJfV0lUSF9TQihzKSkpOworCXdhaXRfb25fYnVmZmVyKFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9CVUZGRVJfV0lUSF9TQihzKSkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAicmVyZWFkX21ldGFfYmxvY2tzLCBlcnJvciByZWFkaW5nIHRoZSBzdXBlciIpOworCQlyZXR1cm4gMTsKKwl9CiAKLSAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocykgOyBpKyspIHsKLSAgICBsbF9yd19ibG9jayhSRUFELCAxLCAmKFNCX0FQX0JJVE1BUChzKVtpXS5iaCkpIDsKLSAgICB3YWl0X29uX2J1ZmZlcihTQl9BUF9CSVRNQVAocylbaV0uYmgpIDsKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVyZWFkX21ldGFfYmxvY2tzLCBlcnJvciByZWFkaW5nIGJpdG1hcCBibG9jayBudW1iZXIgJWQgYXQgJWxsdSIsCi0gICAgICAgIGksICh1bnNpZ25lZCBsb25nIGxvbmcpU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2Jsb2NrbnIpIDsKLSAgICAgIHJldHVybiAxIDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDAgOworCWZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspIHsKKwkJbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9BUF9CSVRNQVAocylbaV0uYmgpKTsKKwkJd2FpdF9vbl9idWZmZXIoU0JfQVBfQklUTUFQKHMpW2ldLmJoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlcmVhZF9tZXRhX2Jsb2NrcywgZXJyb3IgcmVhZGluZyBiaXRtYXAgYmxvY2sgbnVtYmVyICVkIGF0ICVsbHUiLAorCQkJCQkgaSwKKwkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpU0JfQVBfQklUTUFQKHMpW2ldLgorCQkJCQkgYmgtPmJfYmxvY2tucik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIAogfQogCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBoYXNoIGRldGVjdGlvbiBzdHVmZgogCi0KIC8vIGlmIHJvb3QgZGlyZWN0b3J5IGlzIGVtcHR5IC0gd2Ugc2V0IGRlZmF1bHQgLSBZdXJhJ3MgLSBoYXNoIGFuZAogLy8gd2FybiBhYm91dCBpdAogLy8gRklYTUU6IHdlIGxvb2sgZm9yIG9ubHkgb25lIG5hbWUgaW4gYSBkaXJlY3RvcnkuIElmIHRlYSBhbmQgeXVyYQogLy8gYml0aCBoYXZlIHRoZSBzYW1lIHZhbHVlIC0gd2UgYXNrIHVzZXIgdG8gc2VuZCByZXBvcnQgdG8gdGhlCiAvLyBtYWlsaW5nIGxpc3QKLXN0YXRpYyBfX3UzMiBmaW5kX2hhc2hfb3V0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIF9fdTMyIGZpbmRfaGFzaF9vdXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKLSAgICBfX3UzMiBoYXNoID0gREVGQVVMVF9IQVNIOworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJX191MzIgaGFzaCA9IERFRkFVTFRfSEFTSDsKIAotICAgIGlub2RlID0gcy0+c19yb290LT5kX2lub2RlOworCWlub2RlID0gcy0+c19yb290LT5kX2lub2RlOwogCi0gICAgZG8geyAvLyBTb21lIHNlcmlvdXMgImdvdG8iLWhhdGVyIHdhcyB0aGVyZSA7KQotCXUzMiB0ZWFoYXNoLCByNWhhc2gsIHl1cmFoYXNoOworCWRvIHsJCQkvLyBTb21lIHNlcmlvdXMgImdvdG8iLWhhdGVyIHdhcyB0aGVyZSA7KQorCQl1MzIgdGVhaGFzaCwgcjVoYXNoLCB5dXJhaGFzaDsKIAotCW1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIH4wLCBUWVBFX0RJUkVOVFJZLCAzKTsKLQlyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChzLCAma2V5LCAmcGF0aCwgJmRlKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotCSAgICByZXR1cm4gVU5TRVRfSEFTSCA7Ci0JfQotCWlmIChyZXR2YWwgPT0gTkFNRV9OT1RfRk9VTkQpCi0JICAgIGRlLmRlX2VudHJ5X251bSAtLTsKLQlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoJmRlKTsKLQlpZiAoZGVoX29mZnNldCggJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkgKSA9PSBET1RfRE9UX09GRlNFVCkgewotCSAgICAvKiBhbGxvdyBvdmVycmlkZSBpbiB0aGlzIGNhc2UgKi8KLQkgICAgaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSkgewotCQloYXNoID0gWVVSQV9IQVNIIDsKLQkgICAgfQotCSAgICByZWlzZXJmc193YXJuaW5nKHMsIkZTIHNlZW1zIHRvIGJlIGVtcHR5LCBhdXRvZGV0ZWN0ICIKLQkgICAgICAgICAgICAgICAgICAgICAiaXMgdXNpbmcgdGhlIGRlZmF1bHQgaGFzaCIpOwotCSAgICBicmVhazsKLQl9Ci0JcjVoYXNoPUdFVF9IQVNIX1ZBTFVFIChyNV9oYXNoIChkZS5kZV9uYW1lLCBkZS5kZV9uYW1lbGVuKSk7Ci0JdGVhaGFzaD1HRVRfSEFTSF9WQUxVRSAoa2V5ZWRfaGFzaCAoZGUuZGVfbmFtZSwgZGUuZGVfbmFtZWxlbikpOwotCXl1cmFoYXNoPUdFVF9IQVNIX1ZBTFVFICh5dXJhX2hhc2ggKGRlLmRlX25hbWUsIGRlLmRlX25hbWVsZW4pKTsKLQlpZiAoICggKHRlYWhhc2ggPT0gcjVoYXNoKSAmJiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSA9PSByNWhhc2gpICkgfHwKLQkgICAgICggKHRlYWhhc2ggPT0geXVyYWhhc2gpICYmICh5dXJhaGFzaCA9PSBHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSApIHx8Ci0JICAgICAoIChyNWhhc2ggPT0geXVyYWhhc2gpICYmICh5dXJhaGFzaCA9PSBHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSApICkgewotCSAgICByZWlzZXJmc193YXJuaW5nKHMsIlVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBoYXNoIGZ1bmN0aW9uLiAiCi0JCQkgICAgICJQbGVhc2UgbW91bnQgd2l0aCAtbyBoYXNoPXt0ZWEscnVwYXNvdixyNX0iLAotCQkJICAgICByZWlzZXJmc19iZGV2bmFtZSAocykpOwotCSAgICBoYXNoID0gVU5TRVRfSEFTSDsKLQkgICAgYnJlYWs7Ci0JfQotCWlmIChHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkgKSA9PSB5dXJhaGFzaCkKLQkgICAgaGFzaCA9IFlVUkFfSEFTSDsKLQllbHNlIGlmIChHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkgKSA9PSB0ZWFoYXNoKQotCSAgICBoYXNoID0gVEVBX0hBU0g7Ci0JZWxzZSBpZiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpICkgPT0gcjVoYXNoKQotCSAgICBoYXNoID0gUjVfSEFTSDsKLQllbHNlIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywiVW5yZWNvZ25pc2VkIGhhc2ggZnVuY3Rpb24iKTsKLQkgICAgaGFzaCA9IFVOU0VUX0hBU0g7Ci0JfQotICAgIH0gd2hpbGUgKDApOworCQltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIH4wLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkJcmV0dmFsID0gc2VhcmNoX2J5X2VudHJ5X2tleShzLCAma2V5LCAmcGF0aCwgJmRlKTsKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCXJldHVybiBVTlNFVF9IQVNIOworCQl9CisJCWlmIChyZXR2YWwgPT0gTkFNRV9OT1RfRk9VTkQpCisJCQlkZS5kZV9lbnRyeV9udW0tLTsKKwkJc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oJmRlKTsKKwkJaWYgKGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpID09IERPVF9ET1RfT0ZGU0VUKSB7CisJCQkvKiBhbGxvdyBvdmVycmlkZSBpbiB0aGlzIGNhc2UgKi8KKwkJCWlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykpIHsKKwkJCQloYXNoID0gWVVSQV9IQVNIOworCQkJfQorCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiRlMgc2VlbXMgdG8gYmUgZW1wdHksIGF1dG9kZXRlY3QgIgorCQkJCQkgImlzIHVzaW5nIHRoZSBkZWZhdWx0IGhhc2giKTsKKwkJCWJyZWFrOworCQl9CisJCXI1aGFzaCA9IEdFVF9IQVNIX1ZBTFVFKHI1X2hhc2goZGUuZGVfbmFtZSwgZGUuZGVfbmFtZWxlbikpOworCQl0ZWFoYXNoID0gR0VUX0hBU0hfVkFMVUUoa2V5ZWRfaGFzaChkZS5kZV9uYW1lLCBkZS5kZV9uYW1lbGVuKSk7CisJCXl1cmFoYXNoID0gR0VUX0hBU0hfVkFMVUUoeXVyYV9oYXNoKGRlLmRlX25hbWUsIGRlLmRlX25hbWVsZW4pKTsKKwkJaWYgKCgodGVhaGFzaCA9PSByNWhhc2gpCisJCSAgICAgJiYKKwkJICAgICAoR0VUX0hBU0hfVkFMVUUoZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpCisJCSAgICAgID09IHI1aGFzaCkpIHx8ICgodGVhaGFzaCA9PSB5dXJhaGFzaCkKKwkJCQkgICAgICAmJiAoeXVyYWhhc2ggPT0KKwkJCQkJICBHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0CisJCQkJCQkJICgmCisJCQkJCQkJICAoZGUuCisJCQkJCQkJICAgZGVfZGVoW2RlLgorCQkJCQkJCQkgIGRlX2VudHJ5X251bV0pKSkpKQorCQkgICAgfHwgKChyNWhhc2ggPT0geXVyYWhhc2gpCisJCQkmJiAoeXVyYWhhc2ggPT0KKwkJCSAgICBHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0CisJCQkJCSAgICgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJVbmFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgaGFzaCBmdW5jdGlvbi4gIgorCQkJCQkgIlBsZWFzZSBtb3VudCB3aXRoIC1vIGhhc2g9e3RlYSxydXBhc292LHI1fSIsCisJCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJCQloYXNoID0gVU5TRVRfSEFTSDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0KCYoZGUuZGVfZGVoW2RlLmRlX2VudHJ5X251bV0pKSkgPT0KKwkJICAgIHl1cmFoYXNoKQorCQkJaGFzaCA9IFlVUkFfSEFTSDsKKwkJZWxzZSBpZiAoR0VUX0hBU0hfVkFMVUUKKwkJCSAoZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpID09IHRlYWhhc2gpCisJCQloYXNoID0gVEVBX0hBU0g7CisJCWVsc2UgaWYgKEdFVF9IQVNIX1ZBTFVFCisJCQkgKGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSA9PSByNWhhc2gpCisJCQloYXNoID0gUjVfSEFTSDsKKwkJZWxzZSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJVbnJlY29nbmlzZWQgaGFzaCBmdW5jdGlvbiIpOworCQkJaGFzaCA9IFVOU0VUX0hBU0g7CisJCX0KKwl9IHdoaWxlICgwKTsKIAotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIHJldHVybiBoYXNoOworCXBhdGhyZWxzZSgmcGF0aCk7CisJcmV0dXJuIGhhc2g7CiB9CiAKIC8vIGZpbmRzIG91dCB3aGljaCBoYXNoIG5hbWVzIGFyZSBzb3J0ZWQgd2l0aAotc3RhdGljIGludCB3aGF0X2hhc2ggKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCitzdGF0aWMgaW50IHdoYXRfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgX191MzIgY29kZTsKKwlfX3UzMiBjb2RlOwogCi0gICAgY29kZSA9IHNiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpKTsKKwljb2RlID0gc2JfaGFzaF9mdW5jdGlvbl9jb2RlKFNCX0RJU0tfU1VQRVJfQkxPQ0socykpOwogCi0gICAgLyogcmVpc2VyZnNfaGFzaF9kZXRlY3QoKSA9PSB0cnVlIGlmIGFueSBvZiB0aGUgaGFzaCBtb3VudCBvcHRpb25zCi0gICAgKiogd2VyZSB1c2VkLiAgV2UgbXVzdCBjaGVjayB0aGVtIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBpc24ndAotICAgICoqIHVzaW5nIGEgYmFkIGhhc2ggdmFsdWUKLSAgICAqLwotICAgIGlmIChjb2RlID09IFVOU0VUX0hBU0ggfHwgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpCi0JY29kZSA9IGZpbmRfaGFzaF9vdXQgKHMpOworCS8qIHJlaXNlcmZzX2hhc2hfZGV0ZWN0KCkgPT0gdHJ1ZSBpZiBhbnkgb2YgdGhlIGhhc2ggbW91bnQgb3B0aW9ucworCSAqKiB3ZXJlIHVzZWQuICBXZSBtdXN0IGNoZWNrIHRoZW0gdG8gbWFrZSBzdXJlIHRoZSB1c2VyIGlzbid0CisJICoqIHVzaW5nIGEgYmFkIGhhc2ggdmFsdWUKKwkgKi8KKwlpZiAoY29kZSA9PSBVTlNFVF9IQVNIIHx8IHJlaXNlcmZzX2hhc2hfZGV0ZWN0KHMpKQorCQljb2RlID0gZmluZF9oYXNoX291dChzKTsKIAotICAgIGlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpIHsKLQkvKiBkZXRlY3Rpb24gaGFzIGZvdW5kIHRoZSBoYXNoLCBhbmQgd2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZSAKLQkqKiBtb3VudCBvcHRpb25zIAotCSovCi0JaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSAmJiBjb2RlICE9IFlVUkFfSEFTSCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiRXJyb3IsICVzIGhhc2ggZGV0ZWN0ZWQsICIKLQkJICAgInVuYWJsZSB0byBmb3JjZSBydXBhc292IGhhc2giLCByZWlzZXJmc19oYXNobmFtZShjb2RlKSkgOwotCSAgICBjb2RlID0gVU5TRVRfSEFTSCA7Ci0JfSBlbHNlIGlmIChyZWlzZXJmc190ZWFfaGFzaChzKSAmJiBjb2RlICE9IFRFQV9IQVNIKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJFcnJvciwgJXMgaGFzaCBkZXRlY3RlZCwgIgotCQkgICAidW5hYmxlIHRvIGZvcmNlIHRlYSBoYXNoIiwgcmVpc2VyZnNfaGFzaG5hbWUoY29kZSkpIDsKLQkgICAgY29kZSA9IFVOU0VUX0hBU0ggOwotCX0gZWxzZSBpZiAocmVpc2VyZnNfcjVfaGFzaChzKSAmJiBjb2RlICE9IFI1X0hBU0gpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywgIkVycm9yLCAlcyBoYXNoIGRldGVjdGVkLCAiCi0JCSAgICJ1bmFibGUgdG8gZm9yY2UgcjUgaGFzaCIsIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKSA7Ci0JICAgIGNvZGUgPSBVTlNFVF9IQVNIIDsKLQl9IAotICAgIH0gZWxzZSB7IAotICAgICAgICAvKiBmaW5kX2hhc2hfb3V0IHdhcyBub3QgY2FsbGVkIG9yIGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGhhc2ggKi8KLQlpZiAocmVpc2VyZnNfcnVwYXNvdl9oYXNoKHMpKSB7Ci0JICAgIGNvZGUgPSBZVVJBX0hBU0ggOwotCX0gZWxzZSBpZiAocmVpc2VyZnNfdGVhX2hhc2gocykpIHsKLQkgICAgY29kZSA9IFRFQV9IQVNIIDsKLQl9IGVsc2UgaWYgKHJlaXNlcmZzX3I1X2hhc2gocykpIHsKLQkgICAgY29kZSA9IFI1X0hBU0ggOwotCX0gCi0gICAgfQorCWlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpIHsKKwkJLyogZGV0ZWN0aW9uIGhhcyBmb3VuZCB0aGUgaGFzaCwgYW5kIHdlIG11c3QgY2hlY2sgYWdhaW5zdCB0aGUgCisJCSAqKiBtb3VudCBvcHRpb25zIAorCQkgKi8KKwkJaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSAmJiBjb2RlICE9IFlVUkFfSEFTSCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiRXJyb3IsICVzIGhhc2ggZGV0ZWN0ZWQsICIKKwkJCQkJICJ1bmFibGUgdG8gZm9yY2UgcnVwYXNvdiBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9IGVsc2UgaWYgKHJlaXNlcmZzX3RlYV9oYXNoKHMpICYmIGNvZGUgIT0gVEVBX0hBU0gpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgIkVycm9yLCAlcyBoYXNoIGRldGVjdGVkLCAiCisJCQkJCSAidW5hYmxlIHRvIGZvcmNlIHRlYSBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9IGVsc2UgaWYgKHJlaXNlcmZzX3I1X2hhc2gocykgJiYgY29kZSAhPSBSNV9IQVNIKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJFcnJvciwgJXMgaGFzaCBkZXRlY3RlZCwgIgorCQkJCQkgInVuYWJsZSB0byBmb3JjZSByNSBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9CisJfSBlbHNlIHsKKwkJLyogZmluZF9oYXNoX291dCB3YXMgbm90IGNhbGxlZCBvciBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBoYXNoICovCisJCWlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykpIHsKKwkJCWNvZGUgPSBZVVJBX0hBU0g7CisJCX0gZWxzZSBpZiAocmVpc2VyZnNfdGVhX2hhc2gocykpIHsKKwkJCWNvZGUgPSBURUFfSEFTSDsKKwkJfSBlbHNlIGlmIChyZWlzZXJmc19yNV9oYXNoKHMpKSB7CisJCQljb2RlID0gUjVfSEFTSDsKKwkJfQorCX0KIAotICAgIC8qIGlmIHdlIGFyZSBtb3VudGVkIFJXLCBhbmQgd2UgaGF2ZSBhIG5ldyB2YWxpZCBoYXNoIGNvZGUsIHVwZGF0ZSAKLSAgICAqKiB0aGUgc3VwZXIKLSAgICAqLwotICAgIGlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgCi0JIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAKLSAgICAgICAgY29kZSAhPSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkpIHsKLSAgICAgICAgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpLCBjb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvZGU7CisJLyogaWYgd2UgYXJlIG1vdW50ZWQgUlcsIGFuZCB3ZSBoYXZlIGEgbmV3IHZhbGlkIGhhc2ggY29kZSwgdXBkYXRlIAorCSAqKiB0aGUgc3VwZXIKKwkgKi8KKwlpZiAoY29kZSAhPSBVTlNFVF9IQVNIICYmCisJICAgICEocy0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkgICAgY29kZSAhPSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkpIHsKKwkJc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpLCBjb2RlKTsKKwl9CisJcmV0dXJuIGNvZGU7CiB9CiAKIC8vIHJldHVybiBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIGZ1bmN0aW9uCi1zdGF0aWMgaGFzaGZfdCBoYXNoX2Z1bmN0aW9uIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIGhhc2hmX3QgaGFzaF9mdW5jdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgc3dpdGNoICh3aGF0X2hhc2ggKHMpKSB7Ci0gICAgY2FzZSBURUFfSEFTSDoKLQlyZWlzZXJmc19pbmZvIChzLCAiVXNpbmcgdGVhIGhhc2ggdG8gc29ydCBuYW1lc1xuIik7Ci0JcmV0dXJuIGtleWVkX2hhc2g7Ci0gICAgY2FzZSBZVVJBX0hBU0g6Ci0JcmVpc2VyZnNfaW5mbyAocywgIlVzaW5nIHJ1cGFzb3YgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKLQlyZXR1cm4geXVyYV9oYXNoOwotICAgIGNhc2UgUjVfSEFTSDoKLQlyZWlzZXJmc19pbmZvIChzLCAiVXNpbmcgcjUgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKLQlyZXR1cm4gcjVfaGFzaDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisJc3dpdGNoICh3aGF0X2hhc2gocykpIHsKKwljYXNlIFRFQV9IQVNIOgorCQlyZWlzZXJmc19pbmZvKHMsICJVc2luZyB0ZWEgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKKwkJcmV0dXJuIGtleWVkX2hhc2g7CisJY2FzZSBZVVJBX0hBU0g6CisJCXJlaXNlcmZzX2luZm8ocywgIlVzaW5nIHJ1cGFzb3YgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKKwkJcmV0dXJuIHl1cmFfaGFzaDsKKwljYXNlIFI1X0hBU0g6CisJCXJlaXNlcmZzX2luZm8ocywgIlVzaW5nIHI1IGhhc2ggdG8gc29ydCBuYW1lc1xuIik7CisJCXJldHVybiByNV9oYXNoOworCX0KKwlyZXR1cm4gTlVMTDsKIH0KIAogLy8gdGhpcyBpcyB1c2VkIHRvIHNldCB1cCBjb3JyZWN0IHZhbHVlIGZvciBvbGQgcGFydGl0aW9ucwotc3RhdGljIGludCBmdW5jdGlvbjJjb2RlIChoYXNoZl90IGZ1bmMpCitzdGF0aWMgaW50IGZ1bmN0aW9uMmNvZGUoaGFzaGZfdCBmdW5jKQogewotICAgIGlmIChmdW5jID09IGtleWVkX2hhc2gpCi0JcmV0dXJuIFRFQV9IQVNIOwotICAgIGlmIChmdW5jID09IHl1cmFfaGFzaCkKLQlyZXR1cm4gWVVSQV9IQVNIOwotICAgIGlmIChmdW5jID09IHI1X2hhc2gpCi0JcmV0dXJuIFI1X0hBU0g7CisJaWYgKGZ1bmMgPT0ga2V5ZWRfaGFzaCkKKwkJcmV0dXJuIFRFQV9IQVNIOworCWlmIChmdW5jID09IHl1cmFfaGFzaCkKKwkJcmV0dXJuIFlVUkFfSEFTSDsKKwlpZiAoZnVuYyA9PSByNV9oYXNoKQorCQlyZXR1cm4gUjVfSEFTSDsKIAotICAgIEJVRygpIDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorCUJVRygpOwkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAjZGVmaW5lIFNXQVJOKHNpbGVudCwgcywgLi4uKQkJCVwKIAlpZiAoIShzaWxlbnQpKQkJCQlcCiAJCXJlaXNlcmZzX3dhcm5pbmcgKHMsIF9fVkFfQVJHU19fKQogCi1zdGF0aWMgaW50IHJlaXNlcmZzX2ZpbGxfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHZvaWQgKiBkYXRhLCBpbnQgc2lsZW50KQorc3RhdGljIGludCByZWlzZXJmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7Ci0gICAgaW50IGo7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IG9sZF9mb3JtYXQgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzOwotICAgIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSA9IDA7Ci0gICAgaW50IGppbml0X2RvbmUgPSAwIDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3MgOwotICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOwotICAgIGNoYXIgKmpkZXZfbmFtZTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JpOwotICAgIGludCBlcnJ2YWwgPSAtRUlOVkFMOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pbm9kZTsKKwlpbnQgajsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBvbGRfZm9ybWF0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrczsKKwl1bnNpZ25lZCBpbnQgY29tbWl0X21heF9hZ2UgPSAwOworCWludCBqaW5pdF9kb25lID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3M7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpyczsKKwljaGFyICpqZGV2X25hbWU7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiaTsKKwlpbnQgZXJydmFsID0gLUVJTlZBTDsKIAotICAgIHNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKCFzYmkpIHsKLQllcnJ2YWwgPSAtRU5PTUVNOwotCWdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHMtPnNfZnNfaW5mbyA9IHNiaTsKLSAgICBtZW1zZXQgKHNiaSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbykpOwotICAgIC8qIFNldCBkZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uczogbm9uLWFnZ3Jlc3NpdmUgdGFpbHMsIFJPIG9uIGVycm9ycyAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19TTUFMTFRBSUwpOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19FUlJPUl9STyk7Ci0gICAgLyogbm8gcHJlYWxsb2NhdGlvbiBtaW5pbXVtLCBiZSBzbWFydCBpbgotICAgICAgIHJlaXNlcmZzX2ZpbGVfd3JpdGUgaW5zdGVhZCAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gPSAwOwotICAgIC8qIFByZWFsbG9jYXRlIGJ5IDE2IGJsb2NrcyAoMTctMSkgYXQgb25jZSAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplID0gMTc7Ci0gICAgLyogSW5pdGlhbGl6ZSB0aGUgcndzZW0gZm9yIHhhdHRyIGRpciAqLwotICAgIGluaXRfcndzZW0oJlJFSVNFUkZTX1NCKHMpLT54YXR0cl9kaXJfc2VtKTsKKwlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKSB7CisJCWVycnZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3NiX2luZm8pKTsKKwkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbnM6IG5vbi1hZ2dyZXNzaXZlIHRhaWxzLCBSTyBvbiBlcnJvcnMgKi8KKwlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKTsKKwlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfRVJST1JfUk8pOworCS8qIG5vIHByZWFsbG9jYXRpb24gbWluaW11bSwgYmUgc21hcnQgaW4KKwkgICByZWlzZXJmc19maWxlX3dyaXRlIGluc3RlYWQgKi8KKwlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jbWluID0gMDsKKwkvKiBQcmVhbGxvY2F0ZSBieSAxNiBibG9ja3MgKDE3LTEpIGF0IG9uY2UgKi8KKwlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZSA9IDE3OworCS8qIEluaXRpYWxpemUgdGhlIHJ3c2VtIGZvciB4YXR0ciBkaXIgKi8KKwlpbml0X3J3c2VtKCZSRUlTRVJGU19TQihzKS0+eGF0dHJfZGlyX3NlbSk7CiAKLSAgICAvKiBzZXR1cCBkZWZhdWx0IGJsb2NrIGFsbG9jYXRvciBvcHRpb25zICovCi0gICAgcmVpc2VyZnNfaW5pdF9hbGxvY19vcHRpb25zKHMpOworCS8qIHNldHVwIGRlZmF1bHQgYmxvY2sgYWxsb2NhdG9yIG9wdGlvbnMgKi8KKwlyZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMocyk7CiAKLSAgICBqZGV2X25hbWUgPSBOVUxMOwotICAgIGlmIChyZWlzZXJmc19wYXJzZV9vcHRpb25zIChzLCAoY2hhciAqKSBkYXRhLCAmKHNiaS0+c19tb3VudF9vcHQpLCAmYmxvY2tzLCAmamRldl9uYW1lLCAmY29tbWl0X21heF9hZ2UpID09IDApIHsKLQlnb3RvIGVycm9yOwotICAgIH0KKwlqZGV2X25hbWUgPSBOVUxMOworCWlmIChyZWlzZXJmc19wYXJzZV9vcHRpb25zCisJICAgIChzLCAoY2hhciAqKWRhdGEsICYoc2JpLT5zX21vdW50X29wdCksICZibG9ja3MsICZqZGV2X25hbWUsCisJICAgICAmY29tbWl0X21heF9hZ2UpID09IDApIHsKKwkJZ290byBlcnJvcjsKKwl9CiAKLSAgICBpZiAoYmxvY2tzKSB7Ci0JU1dBUk4gKHNpbGVudCwgcywgImptYWNkLTc6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHJlc2l6ZSBvcHRpb24gIgotCSAgICAgICAiZm9yIHJlbW91bnQgb25seSIpOwotCWdvdG8gZXJyb3I7Ci0gICAgfQkKKwlpZiAoYmxvY2tzKSB7CisJCVNXQVJOKHNpbGVudCwgcywgImptYWNkLTc6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHJlc2l6ZSBvcHRpb24gIgorCQkgICAgICAiZm9yIHJlbW91bnQgb25seSIpOworCQlnb3RvIGVycm9yOworCX0KIAotICAgIC8qIHRyeSBvbGQgZm9ybWF0ICh1bmRpc3RyaWJ1dGVkIGJpdG1hcCwgc3VwZXIgYmxvY2sgaW4gOC10aCAxayBibG9jayBvZiBhIGRldmljZSkgKi8KLSAgICBpZiAoIXJlYWRfc3VwZXJfYmxvY2sgKHMsIFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUykpCi0gICAgICBvbGRfZm9ybWF0ID0gMTsKLSAgICAvKiB0cnkgbmV3IGZvcm1hdCAoNjQtdGggMWsgYmxvY2spLCB3aGljaCBjYW4gY29udGFpbiByZWlzZXJmcyBzdXBlciBibG9jayAqLwotICAgIGVsc2UgaWYgKHJlYWRfc3VwZXJfYmxvY2sgKHMsIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkgewotICAgICAgU1dBUk4oc2lsZW50LCBzLCAic2gtMjAyMTogcmVpc2VyZnNfZmlsbF9zdXBlcjogY2FuIG5vdCBmaW5kIHJlaXNlcmZzIG9uICVzIiwgcmVpc2VyZnNfYmRldm5hbWUgKHMpKTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQorCS8qIHRyeSBvbGQgZm9ybWF0ICh1bmRpc3RyaWJ1dGVkIGJpdG1hcCwgc3VwZXIgYmxvY2sgaW4gOC10aCAxayBibG9jayBvZiBhIGRldmljZSkgKi8KKwlpZiAoIXJlYWRfc3VwZXJfYmxvY2socywgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkKKwkJb2xkX2Zvcm1hdCA9IDE7CisJLyogdHJ5IG5ldyBmb3JtYXQgKDY0LXRoIDFrIGJsb2NrKSwgd2hpY2ggY2FuIGNvbnRhaW4gcmVpc2VyZnMgc3VwZXIgYmxvY2sgKi8KKwllbHNlIGlmIChyZWFkX3N1cGVyX2Jsb2NrKHMsIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJzaC0yMDIxOiByZWlzZXJmc19maWxsX3N1cGVyOiBjYW4gbm90IGZpbmQgcmVpc2VyZnMgb24gJXMiLAorCQkgICAgICByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJCWdvdG8gZXJyb3I7CisJfQogCi0gICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLSAgICAvKiBMZXQncyBkbyBiYXNpYyBzYW5pdHkgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdW5kZXJseWluZyBkZXZpY2UgaXMgbm90Ci0gICAgICAgc21hbGxlciB0aGFuIHRoZSBmaWxlc3lzdGVtLiBJZiB0aGUgY2hlY2sgZmFpbHMgdGhlbiBhYm9ydCBhbmQgc2NyZWFtLAotICAgICAgIGJlY2F1c2UgYmFkIHN0dWZmIHdpbGwgaGFwcGVuIG90aGVyd2lzZS4gKi8KLSAgICBpZiAoIHMtPnNfYmRldiAmJiBzLT5zX2JkZXYtPmJkX2lub2RlICYmIGlfc2l6ZV9yZWFkKHMtPnNfYmRldi0+YmRfaW5vZGUpIDwgc2JfYmxvY2tfY291bnQocnMpKnNiX2Jsb2Nrc2l6ZShycykpIHsKLQlTV0FSTiAoc2lsZW50LCBzLCAiRmlsZXN5c3RlbSBvbiAlcyBjYW5ub3QgYmUgbW91bnRlZCBiZWNhdXNlIGl0IGlzIGJpZ2dlciB0aGFuIHRoZSBkZXZpY2UiLCByZWlzZXJmc19iZGV2bmFtZShzKSk7Ci0JU1dBUk4oc2lsZW50LCBzLCAiWW91IG1heSBuZWVkIHRvIHJ1biBmc2NrIG9yIGluY3JlYXNlIHNpemUgb2YgeW91ciBMVk0gcGFydGl0aW9uIik7Ci0JU1dBUk4oc2lsZW50LCBzLCAiT3IgbWF5IGJlIHlvdSBmb3Jnb3QgdG8gcmVib290IGFmdGVyIGZkaXNrIHdoZW4gaXQgdG9sZCB5b3UgdG8iKTsKLQlnb3RvIGVycm9yOwotICAgIH0KKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisJLyogTGV0J3MgZG8gYmFzaWMgc2FuaXR5IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHVuZGVybHlpbmcgZGV2aWNlIGlzIG5vdAorCSAgIHNtYWxsZXIgdGhhbiB0aGUgZmlsZXN5c3RlbS4gSWYgdGhlIGNoZWNrIGZhaWxzIHRoZW4gYWJvcnQgYW5kIHNjcmVhbSwKKwkgICBiZWNhdXNlIGJhZCBzdHVmZiB3aWxsIGhhcHBlbiBvdGhlcndpc2UuICovCisJaWYgKHMtPnNfYmRldiAmJiBzLT5zX2JkZXYtPmJkX2lub2RlCisJICAgICYmIGlfc2l6ZV9yZWFkKHMtPnNfYmRldi0+YmRfaW5vZGUpIDwKKwkgICAgc2JfYmxvY2tfY291bnQocnMpICogc2JfYmxvY2tzaXplKHJzKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJGaWxlc3lzdGVtIG9uICVzIGNhbm5vdCBiZSBtb3VudGVkIGJlY2F1c2UgaXQgaXMgYmlnZ2VyIHRoYW4gdGhlIGRldmljZSIsCisJCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHMpKTsKKwkJU1dBUk4oc2lsZW50LCBzLAorCQkgICAgICAiWW91IG1heSBuZWVkIHRvIHJ1biBmc2NrIG9yIGluY3JlYXNlIHNpemUgb2YgeW91ciBMVk0gcGFydGl0aW9uIik7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgIk9yIG1heSBiZSB5b3UgZm9yZ290IHRvIHJlYm9vdCBhZnRlciBmZGlzayB3aGVuIGl0IHRvbGQgeW91IHRvIik7CisJCWdvdG8gZXJyb3I7CisJfQogCi0gICAgc2JpLT5zX21vdW50X3N0YXRlID0gU0JfUkVJU0VSRlNfU1RBVEUocyk7Ci0gICAgc2JpLT5zX21vdW50X3N0YXRlID0gUkVJU0VSRlNfVkFMSURfRlMgOworCXNiaS0+c19tb3VudF9zdGF0ZSA9IFNCX1JFSVNFUkZTX1NUQVRFKHMpOworCXNiaS0+c19tb3VudF9zdGF0ZSA9IFJFSVNFUkZTX1ZBTElEX0ZTOwogCi0gICAgaWYgKG9sZF9mb3JtYXQgPyByZWFkX29sZF9iaXRtYXBzKHMpIDogcmVhZF9iaXRtYXBzKHMpKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtODogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlYWQgYml0bWFwIik7Ci0JZ290byBlcnJvcjsKLSAgICB9CisJaWYgKG9sZF9mb3JtYXQgPyByZWFkX29sZF9iaXRtYXBzKHMpIDogcmVhZF9iaXRtYXBzKHMpKSB7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgImptYWNkLTg6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byByZWFkIGJpdG1hcCIpOworCQlnb3RvIGVycm9yOworCX0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBTV0FSTiAoc2lsZW50LCBzLCAiQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIHNldCBPTiIpOwotICAgIFNXQVJOIChzaWxlbnQsIHMsICItIGl0IGlzIHNsb3cgbW9kZSBmb3IgZGVidWdnaW5nLiIpOworCVNXQVJOKHNpbGVudCwgcywgIkNPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBzZXQgT04iKTsKKwlTV0FSTihzaWxlbnQsIHMsICItIGl0IGlzIHNsb3cgbW9kZSBmb3IgZGVidWdnaW5nLiIpOwogI2VuZGlmCiAKLSAgICAvKiBtYWtlIGRhdGE9b3JkZXJlZCB0aGUgZGVmYXVsdCAqLwotICAgIGlmICghcmVpc2VyZnNfZGF0YV9sb2cocykgJiYgIXJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSAmJgotICAgICAgICAhcmVpc2VyZnNfZGF0YV93cml0ZWJhY2socykpCi0gICAgewotICAgICAgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9ICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCk7Ci0gICAgfQotCi0gICAgaWYgKHJlaXNlcmZzX2RhdGFfbG9nKHMpKSB7Ci0gICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyBqb3VybmFsZWQgZGF0YSBtb2RlXG4iKTsKLSAgICB9IGVsc2UgaWYgKHJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSkgewotICAgICAgICByZWlzZXJmc19pbmZvIChzLCAidXNpbmcgb3JkZXJlZCBkYXRhIG1vZGVcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyB3cml0ZWJhY2sgZGF0YSBtb2RlXG4iKTsKLSAgICB9Ci0gICAgaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocykpIHsKLSAgICAJcHJpbnRrKCJyZWlzZXJmczogdXNpbmcgZmx1c2ggYmFycmllcnNcbiIpOwotICAgIH0KLQotICAgIC8vIHNldF9kZXZpY2Vfcm8ocy0+c19kZXYsIDEpIDsKLSAgICBpZiggam91cm5hbF9pbml0KHMsIGpkZXZfbmFtZSwgb2xkX2Zvcm1hdCwgY29tbWl0X21heF9hZ2UpICkgewotCVNXQVJOKHNpbGVudCwgcywgInNoLTIwMjI6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvdXJuYWwgc3BhY2UiKSA7Ci0JZ290byBlcnJvciA7Ci0gICAgfSBlbHNlIHsKLQlqaW5pdF9kb25lID0gMSA7IC8qIG9uY2UgdGhpcyBpcyBzZXQsIGpvdXJuYWxfcmVsZWFzZSBtdXN0IGJlIGNhbGxlZAotCQkJICoqIGlmIHdlIGVycm9yIG91dCBvZiB0aGUgbW91bnQKLQkJCSAqLwotICAgIH0KLSAgICBpZiAocmVyZWFkX21ldGFfYmxvY2tzKHMpKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtOTogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlcmVhZCBtZXRhIGJsb2NrcyBhZnRlciBqb3VybmFsIGluaXQiKSA7Ci0JZ290byBlcnJvciA7Ci0gICAgfQotCi0gICAgaWYgKHJlcGxheV9vbmx5IChzKSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKGJkZXZfcmVhZF9vbmx5KHMtPnNfYmRldikgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotICAgICAgICBTV0FSTihzaWxlbnQsIHMsICJjbG0tNzAwMDogRGV0ZWN0ZWQgcmVhZG9ubHkgZGV2aWNlLCBtYXJraW5nIEZTIHJlYWRvbmx5IikgOwotCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIDsKLSAgICB9Ci0gICAgYXJncy5vYmplY3RpZCA9IFJFSVNFUkZTX1JPT1RfT0JKRUNUSUQgOwotICAgIGFyZ3MuZGlyaWQgPSBSRUlTRVJGU19ST09UX1BBUkVOVF9PQkpFQ1RJRCA7Ci0gICAgcm9vdF9pbm9kZSA9IGlnZXQ1X2xvY2tlZCAocywgUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRCwgcmVpc2VyZnNfZmluZF9hY3RvciwgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUsICh2b2lkICopKCZhcmdzKSk7Ci0gICAgaWYgKCFyb290X2lub2RlKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtMTA6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZCIpOwotCWdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKHJvb3RfaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewotCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKHJvb3RfaW5vZGUsICZhcmdzKTsKLQl1bmxvY2tfbmV3X2lub2RlKHJvb3RfaW5vZGUpOwotICAgIH0KLQotICAgIHMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsgIAotICAgIGlmICghcy0+c19yb290KSB7Ci0JaXB1dChyb290X2lub2RlKTsKLQlnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8vIGRlZmluZSBhbmQgaW5pdGlhbGl6ZSBoYXNoIGZ1bmN0aW9uCi0gICAgc2JpLT5zX2hhc2hfZnVuY3Rpb24gPSBoYXNoX2Z1bmN0aW9uIChzKTsKLSAgICBpZiAoc2JpLT5zX2hhc2hfZnVuY3Rpb24gPT0gTlVMTCkgewotICAgICAgZHB1dChzLT5zX3Jvb3QpIDsKLSAgICAgIHMtPnNfcm9vdCA9IE5VTEwgOwotICAgICAgZ290byBlcnJvciA7Ci0gICAgfQotCi0gICAgaWYgKGlzX3JlaXNlcmZzXzNfNSAocnMpIHx8IChpc19yZWlzZXJmc19qciAocnMpICYmIFNCX1ZFUlNJT04gKHMpID09IFJFSVNFUkZTX1ZFUlNJT05fMSkpCi0Jc2V0X2JpdChSRUlTRVJGU18zXzUsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLSAgICBlbHNlCi0Jc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLSAgICAKLSAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCi0JZXJydmFsID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEpIDsKLSAgICAgICAgaWYgKGVycnZhbCkgewotCSAgICBkcHV0IChzLT5zX3Jvb3QpOwotCSAgICBzLT5zX3Jvb3QgPSBOVUxMOwotCSAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0JcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOwotCi0gICAgICAgIHNldF9zYl91bW91bnRfc3RhdGUoIHJzLCBSRUlTRVJGU19FUlJPUl9GUyApOwotCXNldF9zYl9mc19zdGF0ZSAocnMsIDApOwotCQotCWlmIChvbGRfZm9ybWF0X29ubHkocykpIHsKLQkgIC8qIGZpbGVzeXN0ZW0gb2YgZm9ybWF0IDMuNSBlaXRoZXIgd2l0aCBzdGFuZGFyZCBvciBub24tc3RhbmRhcmQKLQkgICAgIGpvdXJuYWwgKi8KLQkgIGlmIChjb252ZXJ0X3JlaXNlcmZzIChzKSkgewotCSAgICAvKiBhbmQgLW8gY29udiBpcyBnaXZlbiAqLwotCSAgICBpZighc2lsZW50KQotCSAgICAgIHJlaXNlcmZzX2luZm8gKHMsImNvbnZlcnRpbmcgMy41IGZpbGVzeXN0ZW0gdG8gdGhlIDMuNiBmb3JtYXQiKSA7Ci0KLQkgICAgaWYgKGlzX3JlaXNlcmZzXzNfNSAocnMpKQotCSAgICAgIC8qIHB1dCBtYWdpYyBzdHJpbmcgb2YgMy42IGZvcm1hdC4gMi4yIHdpbGwgbm90IGJlIGFibGUgdG8KLQkJIG1vdW50IHRoaXMgZmlsZXN5c3RlbSBhbnltb3JlICovCi0JICAgICAgbWVtY3B5IChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAotCQkgICAgICBzaXplb2YgKHJlaXNlcmZzXzNfNl9tYWdpY19zdHJpbmcpKTsKLQotCSAgICBzZXRfc2JfdmVyc2lvbihycyxSRUlTRVJGU19WRVJTSU9OXzIpOwotCSAgICByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzKSA7Ci0JICAgIHNldF9iaXQoUkVJU0VSRlNfM182LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7Ci0JICAgIGNsZWFyX2JpdChSRUlTRVJGU18zXzUsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLQkgIH0gZWxzZSBpZiAoIXNpbGVudCl7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIikgOwotCSAgfQorCS8qIG1ha2UgZGF0YT1vcmRlcmVkIHRoZSBkZWZhdWx0ICovCisJaWYgKCFyZWlzZXJmc19kYXRhX2xvZyhzKSAmJiAhcmVpc2VyZnNfZGF0YV9vcmRlcmVkKHMpICYmCisJICAgICFyZWlzZXJmc19kYXRhX3dyaXRlYmFjayhzKSkgeworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEKTsKIAl9CiAKLQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOwotCWVycnZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMSkgOwotCWlmIChlcnJ2YWwpIHsKLQkgICAgZHB1dCAocy0+c19yb290KTsKLQkgICAgcy0+c19yb290ID0gTlVMTDsKLQkgICAgZ290byBlcnJvcjsKKwlpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpIHsKKwkJcmVpc2VyZnNfaW5mbyhzLCAidXNpbmcgam91cm5hbGVkIGRhdGEgbW9kZVxuIik7CisJfSBlbHNlIGlmIChyZWlzZXJmc19kYXRhX29yZGVyZWQocykpIHsKKwkJcmVpc2VyZnNfaW5mbyhzLCAidXNpbmcgb3JkZXJlZCBkYXRhIG1vZGVcbiIpOworCX0gZWxzZSB7CisJCXJlaXNlcmZzX2luZm8ocywgInVzaW5nIHdyaXRlYmFjayBkYXRhIG1vZGVcbiIpOworCX0KKwlpZiAocmVpc2VyZnNfYmFycmllcl9mbHVzaChzKSkgeworCQlwcmludGsoInJlaXNlcmZzOiB1c2luZyBmbHVzaCBiYXJyaWVyc1xuIik7CisJfQorCS8vIHNldF9kZXZpY2Vfcm8ocy0+c19kZXYsIDEpIDsKKwlpZiAoam91cm5hbF9pbml0KHMsIGpkZXZfbmFtZSwgb2xkX2Zvcm1hdCwgY29tbWl0X21heF9hZ2UpKSB7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgInNoLTIwMjI6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvdXJuYWwgc3BhY2UiKTsKKwkJZ290byBlcnJvcjsKKwl9IGVsc2UgeworCQlqaW5pdF9kb25lID0gMTsJLyogb25jZSB0aGlzIGlzIHNldCwgam91cm5hbF9yZWxlYXNlIG11c3QgYmUgY2FsbGVkCisJCQkJICoqIGlmIHdlIGVycm9yIG91dCBvZiB0aGUgbW91bnQKKwkJCQkgKi8KKwl9CisJaWYgKHJlcmVhZF9tZXRhX2Jsb2NrcyhzKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJqbWFjZC05OiByZWlzZXJmc19maWxsX3N1cGVyOiB1bmFibGUgdG8gcmVyZWFkIG1ldGEgYmxvY2tzIGFmdGVyIGpvdXJuYWwgaW5pdCIpOworCQlnb3RvIGVycm9yOwogCX0KIAotCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgcy0+c19mbGFncykpKSB7Ci0JICAgIGRwdXQgKHMtPnNfcm9vdCk7Ci0JICAgIHMtPnNfcm9vdCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7CisJaWYgKHJlcGxheV9vbmx5KHMpKQorCQlnb3RvIGVycm9yOworCisJaWYgKGJkZXZfcmVhZF9vbmx5KHMtPnNfYmRldikgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJjbG0tNzAwMDogRGV0ZWN0ZWQgcmVhZG9ubHkgZGV2aWNlLCBtYXJraW5nIEZTIHJlYWRvbmx5Iik7CisJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlhcmdzLm9iamVjdGlkID0gUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRDsKKwlhcmdzLmRpcmlkID0gUkVJU0VSRlNfUk9PVF9QQVJFTlRfT0JKRUNUSUQ7CisJcm9vdF9pbm9kZSA9CisJICAgIGlnZXQ1X2xvY2tlZChzLCBSRUlTRVJGU19ST09UX09CSkVDVElELCByZWlzZXJmc19maW5kX2FjdG9yLAorCQkJIHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlLCAodm9pZCAqKSgmYXJncykpOworCWlmICghcm9vdF9pbm9kZSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJqbWFjZC0xMDogcmVpc2VyZnNfZmlsbF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CiAJfQogCi0JLyogbG9vayBmb3IgZmlsZXMgd2hpY2ggd2VyZSB0byBiZSByZW1vdmVkIGluIHByZXZpb3VzIHNlc3Npb24gKi8KLQlmaW5pc2hfdW5maW5pc2hlZCAocyk7Ci0gICAgfSBlbHNlIHsKLQlpZiAoIG9sZF9mb3JtYXRfb25seShzKSAmJiAhc2lsZW50KSB7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIikgOworCWlmIChyb290X2lub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUocm9vdF9pbm9kZSwgJmFyZ3MpOworCQl1bmxvY2tfbmV3X2lub2RlKHJvb3RfaW5vZGUpOwogCX0KIAotCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgcy0+c19mbGFncykpKSB7Ci0JICAgIGRwdXQgKHMtPnNfcm9vdCk7Ci0JICAgIHMtPnNfcm9vdCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghcy0+c19yb290KSB7CisJCWlwdXQocm9vdF9pbm9kZSk7CisJCWdvdG8gZXJyb3I7CiAJfQotICAgIH0KLSAgICAvLyBtYXJrIGhhc2ggaW4gc3VwZXIgYmxvY2s6IGl0IGNvdWxkIGJlIHVuc2V0LiBvdmVyd3JpdGUgc2hvdWxkIGJlIG9rCi0gICAgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZSggcnMsIGZ1bmN0aW9uMmNvZGUoc2JpLT5zX2hhc2hfZnVuY3Rpb24gKSApOwotCi0gICAgaGFuZGxlX2F0dHJzKCBzICk7Ci0KLSAgICByZWlzZXJmc19wcm9jX2luZm9faW5pdCggcyApOwotCi0gICAgaW5pdF93YWl0cXVldWVfaGVhZCAoJihzYmktPnNfd2FpdCkpOwotICAgIHNwaW5fbG9ja19pbml0KCZzYmktPmJpdG1hcF9sb2NrKTsKLQotICAgIHJldHVybiAoMCk7Ci0KLSBlcnJvcjoKLSAgICBpZiAoamluaXRfZG9uZSkgeyAvKiBraWxsIHRoZSBjb21taXQgdGhyZWFkLCBmcmVlIGpvdXJuYWwgcmFtICovCi0Jam91cm5hbF9yZWxlYXNlX2Vycm9yKE5VTEwsIHMpIDsKLSAgICB9Ci0gICAgaWYgKFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpKSB7Ci0JZm9yIChqID0gMDsgaiA8IFNCX0JNQVBfTlIgKHMpOyBqICsrKSB7Ci0JICAgIGlmIChTQl9BUF9CSVRNQVAgKHMpKQotCQlicmVsc2UgKFNCX0FQX0JJVE1BUCAocylbal0uYmgpOworCS8vIGRlZmluZSBhbmQgaW5pdGlhbGl6ZSBoYXNoIGZ1bmN0aW9uCisJc2JpLT5zX2hhc2hfZnVuY3Rpb24gPSBoYXNoX2Z1bmN0aW9uKHMpOworCWlmIChzYmktPnNfaGFzaF9mdW5jdGlvbiA9PSBOVUxMKSB7CisJCWRwdXQocy0+c19yb290KTsKKwkJcy0+c19yb290ID0gTlVMTDsKKwkJZ290byBlcnJvcjsKIAl9Ci0JaWYgKFNCX0FQX0JJVE1BUCAocykpCi0JICAgIHZmcmVlIChTQl9BUF9CSVRNQVAgKHMpKTsKLSAgICB9Ci0gICAgaWYgKFNCX0JVRkZFUl9XSVRIX1NCIChzKSkKLQlicmVsc2UoU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKworCWlmIChpc19yZWlzZXJmc18zXzUocnMpCisJICAgIHx8IChpc19yZWlzZXJmc19qcihycykgJiYgU0JfVkVSU0lPTihzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzEpKQorCQlzZXRfYml0KFJFSVNFUkZTXzNfNSwgJihzYmktPnNfcHJvcGVydGllcykpOworCWVsc2UKKwkJc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKworCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisKKwkJZXJydmFsID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEpOworCQlpZiAoZXJydmFsKSB7CisJCQlkcHV0KHMtPnNfcm9vdCk7CisJCQlzLT5zX3Jvb3QgPSBOVUxMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKTsKKworCQlzZXRfc2JfdW1vdW50X3N0YXRlKHJzLCBSRUlTRVJGU19FUlJPUl9GUyk7CisJCXNldF9zYl9mc19zdGF0ZShycywgMCk7CisKKwkJaWYgKG9sZF9mb3JtYXRfb25seShzKSkgeworCQkJLyogZmlsZXN5c3RlbSBvZiBmb3JtYXQgMy41IGVpdGhlciB3aXRoIHN0YW5kYXJkIG9yIG5vbi1zdGFuZGFyZAorCQkJICAgam91cm5hbCAqLworCQkJaWYgKGNvbnZlcnRfcmVpc2VyZnMocykpIHsKKwkJCQkvKiBhbmQgLW8gY29udiBpcyBnaXZlbiAqLworCQkJCWlmICghc2lsZW50KQorCQkJCQlyZWlzZXJmc19pbmZvKHMsCisJCQkJCQkgICAgICAiY29udmVydGluZyAzLjUgZmlsZXN5c3RlbSB0byB0aGUgMy42IGZvcm1hdCIpOworCisJCQkJaWYgKGlzX3JlaXNlcmZzXzNfNShycykpCisJCQkJCS8qIHB1dCBtYWdpYyBzdHJpbmcgb2YgMy42IGZvcm1hdC4gMi4yIHdpbGwgbm90IGJlIGFibGUgdG8KKwkJCQkJICAgbW91bnQgdGhpcyBmaWxlc3lzdGVtIGFueW1vcmUgKi8KKwkJCQkJbWVtY3B5KHJzLT5zX3YxLnNfbWFnaWMsCisJCQkJCSAgICAgICByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAorCQkJCQkgICAgICAgc2l6ZW9mCisJCQkJCSAgICAgICAocmVpc2VyZnNfM182X21hZ2ljX3N0cmluZykpOworCisJCQkJc2V0X3NiX3ZlcnNpb24ocnMsIFJFSVNFUkZTX1ZFUlNJT05fMik7CisJCQkJcmVpc2VyZnNfY29udmVydF9vYmplY3RpZF9tYXBfdjEocyk7CisJCQkJc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKwkJCQljbGVhcl9iaXQoUkVJU0VSRlNfM181LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7CisJCQl9IGVsc2UgaWYgKCFzaWxlbnQpIHsKKwkJCQlyZWlzZXJmc19pbmZvKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIik7CisJCQl9CisJCX0KKworCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCWVycnZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMSk7CisJCWlmIChlcnJ2YWwpIHsKKwkJCWRwdXQocy0+c19yb290KTsKKwkJCXMtPnNfcm9vdCA9IE5VTEw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKChlcnJ2YWwgPSByZWlzZXJmc194YXR0cl9pbml0KHMsIHMtPnNfZmxhZ3MpKSkgeworCQkJZHB1dChzLT5zX3Jvb3QpOworCQkJcy0+c19yb290ID0gTlVMTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBsb29rIGZvciBmaWxlcyB3aGljaCB3ZXJlIHRvIGJlIHJlbW92ZWQgaW4gcHJldmlvdXMgc2Vzc2lvbiAqLworCQlmaW5pc2hfdW5maW5pc2hlZChzKTsKKwl9IGVsc2UgeworCQlpZiAob2xkX2Zvcm1hdF9vbmx5KHMpICYmICFzaWxlbnQpIHsKKwkJCXJlaXNlcmZzX2luZm8ocywgInVzaW5nIDMuNS54IGRpc2sgZm9ybWF0XG4iKTsKKwkJfQorCisJCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdChzLCBzLT5zX2ZsYWdzKSkpIHsKKwkJCWRwdXQocy0+c19yb290KTsKKwkJCXMtPnNfcm9vdCA9IE5VTEw7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCS8vIG1hcmsgaGFzaCBpbiBzdXBlciBibG9jazogaXQgY291bGQgYmUgdW5zZXQuIG92ZXJ3cml0ZSBzaG91bGQgYmUgb2sKKwlzZXRfc2JfaGFzaF9mdW5jdGlvbl9jb2RlKHJzLCBmdW5jdGlvbjJjb2RlKHNiaS0+c19oYXNoX2Z1bmN0aW9uKSk7CisKKwloYW5kbGVfYXR0cnMocyk7CisKKwlyZWlzZXJmc19wcm9jX2luZm9faW5pdChzKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihzYmktPnNfd2FpdCkpOworCXNwaW5fbG9ja19pbml0KCZzYmktPmJpdG1hcF9sb2NrKTsKKworCXJldHVybiAoMCk7CisKKyAgICAgIGVycm9yOgorCWlmIChqaW5pdF9kb25lKSB7CS8qIGtpbGwgdGhlIGNvbW1pdCB0aHJlYWQsIGZyZWUgam91cm5hbCByYW0gKi8KKwkJam91cm5hbF9yZWxlYXNlX2Vycm9yKE5VTEwsIHMpOworCX0KKwlpZiAoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkgeworCQlmb3IgKGogPSAwOyBqIDwgU0JfQk1BUF9OUihzKTsgaisrKSB7CisJCQlpZiAoU0JfQVBfQklUTUFQKHMpKQorCQkJCWJyZWxzZShTQl9BUF9CSVRNQVAocylbal0uYmgpOworCQl9CisJCWlmIChTQl9BUF9CSVRNQVAocykpCisJCQl2ZnJlZShTQl9BUF9CSVRNQVAocykpOworCX0KKwlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocykpCisJCWJyZWxzZShTQl9CVUZGRVJfV0lUSF9TQihzKSk7CiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gICAgZm9yIChqID0gMDsgaiA8IE1BWFFVT1RBUzsgaisrKSB7Ci0JaWYgKHNiaS0+c19xZl9uYW1lc1tqXSkKLQkgICAga2ZyZWUoc2JpLT5zX3FmX25hbWVzW2pdKTsKLSAgICB9CisJZm9yIChqID0gMDsgaiA8IE1BWFFVT1RBUzsgaisrKSB7CisJCWlmIChzYmktPnNfcWZfbmFtZXNbal0pCisJCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbal0pOworCX0KICNlbmRpZgotICAgIGlmIChzYmkgIT0gTlVMTCkgewotCWtmcmVlKHNiaSk7Ci0gICAgfQorCWlmIChzYmkgIT0gTlVMTCkgeworCQlrZnJlZShzYmkpOworCX0KIAotICAgIHMtPnNfZnNfaW5mbyA9IE5VTEw7Ci0gICAgcmV0dXJuIGVycnZhbDsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybiBlcnJ2YWw7CiB9CiAKLQotc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCBrc3RhdGZzICogYnVmKQorc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewotICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAKLSAgYnVmLT5mX25hbWVsZW4gPSAoUkVJU0VSRlNfTUFYX05BTUUgKHMtPnNfYmxvY2tzaXplKSk7Ci0gIGJ1Zi0+Zl9iZnJlZSAgID0gc2JfZnJlZV9ibG9ja3MocnMpOwotICBidWYtPmZfYmF2YWlsICA9IGJ1Zi0+Zl9iZnJlZTsKLSAgYnVmLT5mX2Jsb2NrcyAgPSBzYl9ibG9ja19jb3VudChycykgLSBzYl9ibWFwX25yKHJzKSAtIDE7Ci0gIGJ1Zi0+Zl9ic2l6ZSAgID0gcy0+c19ibG9ja3NpemU7Ci0gIC8qIGNoYW5nZWQgdG8gYWNjb21tb2RhdGUgZ2NjIGZvbGtzLiovCi0gIGJ1Zi0+Zl90eXBlICAgID0gIFJFSVNFUkZTX1NVUEVSX01BR0lDOwotICByZXR1cm4gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKworCWJ1Zi0+Zl9uYW1lbGVuID0gKFJFSVNFUkZTX01BWF9OQU1FKHMtPnNfYmxvY2tzaXplKSk7CisJYnVmLT5mX2JmcmVlID0gc2JfZnJlZV9ibG9ja3MocnMpOworCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWU7CisJYnVmLT5mX2Jsb2NrcyA9IHNiX2Jsb2NrX2NvdW50KHJzKSAtIHNiX2JtYXBfbnIocnMpIC0gMTsKKwlidWYtPmZfYnNpemUgPSBzLT5zX2Jsb2Nrc2l6ZTsKKwkvKiBjaGFuZ2VkIHRvIGFjY29tbW9kYXRlIGdjYyBmb2xrcy4gKi8KKwlidWYtPmZfdHlwZSA9IFJFSVNFUkZTX1NVUEVSX01BR0lDOworCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1FVT1RBCiBzdGF0aWMgaW50IHJlaXNlcmZzX2RxdW90X2luaXRpYWxpemUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0LCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgcmV0LCBlcnI7CiAKLSAgICAvKiBXZSBtYXkgY3JlYXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICAgIHJldCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMipSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikpOwotICAgIGlmIChyZXQpCi0JZ290byBvdXQ7Ci0gICAgcmV0ID0gZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7Ci0gICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMipSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikpOwotICAgIGlmICghcmV0ICYmIGVycikKLQlyZXQgPSBlcnI7Ci1vdXQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0OworCS8qIFdlIG1heSBjcmVhdGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJcmV0ID0KKwkgICAgam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLAorCQkJICAyICogUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBkcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKKwllcnIgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLAorCQkJMiAqIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJaWYgKCFyZXQgJiYgZXJyKQorCQlyZXQgPSBlcnI7CisgICAgICBvdXQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHJlaXNlcmZzX2RxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIGludCByZXQsIGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIC8qIFdlIG1heSBkZWxldGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAyKlJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKLSAgICBpZiAocmV0KQotIAlnb3RvIG91dDsKLSAgICByZXQgPSBkcXVvdF9kcm9wKGlub2RlKTsKLSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAyKlJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKLSAgICBpZiAoIXJldCAmJiBlcnIpCi0JcmV0ID0gZXJyOwotb3V0OgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJldDsKKwkvKiBXZSBtYXkgZGVsZXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwKKwkJCSAgMiAqIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBkcXVvdF9kcm9wKGlub2RlKTsKKwllcnIgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLAorCQkJMiAqIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAoIXJldCAmJiBlcnIpCisJCXJldCA9IGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIGludCByZXQsIGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKLSAgICByZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZHF1b3QtPmRxX3NiKSk7Ci0gICAgaWYgKHJldCkKLQlnb3RvIG91dDsKLSAgICByZXQgPSBkcXVvdF9jb21taXQoZHF1b3QpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZHF1b3QtPmRxX3NiKSk7Ci0gICAgaWYgKCFyZXQgJiYgZXJyKQotCXJldCA9IGVycjsKLW91dDoKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKLSAgICByZXR1cm4gcmV0OworCXJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKKwlyZXQgPQorCSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLAorCQkJICBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0ID0gZHF1b3RfY29tbWl0KGRxdW90KTsKKwllcnIgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIGRxdW90LT5kcV9zYiwKKwkJCVJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKKwlpZiAoIXJldCAmJiBlcnIpCisJCXJldCA9IGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHJlaXNlcmZzX2FjcXVpcmVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIGludCByZXQsIGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKLSAgICByZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKLSAgICBpZiAocmV0KQotCWdvdG8gb3V0OwotICAgIHJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKLSAgICBpZiAoIXJldCAmJiBlcnIpCi0JcmV0ID0gZXJyOwotb3V0OgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOwotICAgIHJldHVybiByZXQ7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhkcXVvdC0+ZHFfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBkcXVvdC0+ZHFfc2IsCisJCQkgIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOworCWVyciA9CisJICAgIGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLAorCQkJUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CisJaWYgKCFyZXQgJiYgZXJyKQorCQlyZXQgPSBlcnI7CisgICAgICBvdXQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRxdW90LT5kcV9zYik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCByZWlzZXJmc19yZWxlYXNlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0LCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgcmV0LCBlcnI7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRxdW90LT5kcV9zYik7Ci0gICAgcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfREVMX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKLSAgICBpZiAocmV0KQotIAlnb3RvIG91dDsKLSAgICByZXQgPSBkcXVvdF9yZWxlYXNlKGRxdW90KTsKLSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfREVMX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKLSAgICBpZiAoIXJldCAmJiBlcnIpCi0JcmV0ID0gZXJyOwotb3V0OgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOwotICAgIHJldHVybiByZXQ7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhkcXVvdC0+ZHFfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBkcXVvdC0+ZHFfc2IsCisJCQkgIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0ID0gZHF1b3RfcmVsZWFzZShkcXVvdCk7CisJZXJyID0KKwkgICAgam91cm5hbF9lbmQoJnRoLCBkcXVvdC0+ZHFfc2IsCisJCQlSRUlTRVJGU19RVU9UQV9ERUxfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCWlmICghcmV0ICYmIGVycikKKwkJcmV0ID0gZXJyOworICAgICAgb3V0OgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfbWFya19kcXVvdF9kaXJ0eShzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewotICAgIC8qIEFyZSB3ZSBqb3VybmFsbGluZyBxdW90YXM/ICovCi0gICAgaWYgKFJFSVNFUkZTX1NCKGRxdW90LT5kcV9zYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdIHx8Ci0gICAgICAgIFJFSVNFUkZTX1NCKGRxdW90LT5kcV9zYiktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7Ci0JZHF1b3RfbWFya19kcXVvdF9kaXJ0eShkcXVvdCk7Ci0JcmV0dXJuIHJlaXNlcmZzX3dyaXRlX2RxdW90KGRxdW90KTsKLSAgICB9Ci0gICAgZWxzZQotCXJldHVybiBkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwkvKiBBcmUgd2Ugam91cm5hbGxpbmcgcXVvdGFzPyAqLworCWlmIChSRUlTRVJGU19TQihkcXVvdC0+ZHFfc2IpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fAorCSAgICBSRUlTRVJGU19TQihkcXVvdC0+ZHFfc2IpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgeworCQlkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwkJcmV0dXJuIHJlaXNlcmZzX3dyaXRlX2RxdW90KGRxdW90KTsKKwl9IGVsc2UKKwkJcmV0dXJuIGRxdW90X21hcmtfZHF1b3RfZGlydHkoZHF1b3QpOwogfQogCiBzdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0LCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgcmV0LCBlcnI7CiAKLSAgICAvKiBEYXRhIGJsb2NrICsgaW5vZGUgYmxvY2sgKi8KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKLSAgICByZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgc2IsIDIpOwotICAgIGlmIChyZXQpCi0JZ290byBvdXQ7Ci0gICAgcmV0ID0gZHF1b3RfY29tbWl0X2luZm8oc2IsIHR5cGUpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDIpOwotICAgIGlmICghcmV0ICYmIGVycikKLQlyZXQgPSBlcnI7Ci1vdXQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKLSAgICByZXR1cm4gcmV0OworCS8qIERhdGEgYmxvY2sgKyBpbm9kZSBibG9jayAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOworCXJldCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzYiwgMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0ID0gZHF1b3RfY29tbWl0X2luZm8oc2IsIHR5cGUpOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDIpOworCWlmICghcmV0ICYmIGVycikKKwkJcmV0ID0gZXJyOworICAgICAgb3V0OgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTE5NzcsNDUgKzIxMTYsNDggQEAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7CiAJcmV0dXJuIHZmc19xdW90YV9vbl9tb3VudChzYiwgUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdLAotCQkJUkVJU0VSRlNfU0Ioc2IpLT5zX2pxdW90YV9mbXQsIHR5cGUpOworCQkJCSAgUkVJU0VSRlNfU0Ioc2IpLT5zX2pxdW90YV9mbXQsIHR5cGUpOwogfQogCiAvKgogICogU3RhbmRhcmQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHF1b3RhX29uCiAgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsIGNoYXIgKnBhdGgpCitzdGF0aWMgaW50IHJlaXNlcmZzX3F1b3RhX29uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLAorCQkJICAgICBjaGFyICpwYXRoKQogewotICAgIGludCBlcnI7Ci0gICAgc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyOworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAKLSAgICBpZiAoIShSRUlTRVJGU19TQihzYiktPnNfbW91bnRfb3B0ICYgKDE8PFJFSVNFUkZTX1FVT1RBKSkpCi0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKLSAgICBpZiAoZXJyKQotICAgICAgICByZXR1cm4gZXJyOwotICAgIC8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KLSAgICBpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwlpZiAoIShSRUlTRVJGU19TQihzYiktPnNfbW91bnRfb3B0ICYgKDEgPDwgUkVJU0VSRlNfUVVPVEEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KKwlpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiAtRVhERVY7CisJfQorCS8qIFdlIG11c3Qgbm90IHBhY2sgdGFpbHMgZm9yIHF1b3RhIGZpbGVzIG9uIHJlaXNlcmZzIGZvciBxdW90YSBJTyB0byB3b3JrICovCisJaWYgKCFSRUlTRVJGU19JKG5kLmRlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsCisJCQkJICJyZWlzZXJmczogUXVvdGEgZmlsZSBtdXN0IGhhdmUgdGFpbCBwYWNraW5nIGRpc2FibGVkLiIpOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIE5vdCBqb3VybmFsbGluZyBxdW90YT8gTm8gbW9yZSB0ZXN0cyBuZWVkZWQuLi4gKi8KKwlpZiAoIVJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gJiYKKwkgICAgIVJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7CisJfQorCS8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KKwlpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQorCQlyZWlzZXJmc193YXJuaW5nKHNiLAorCQkJCSAicmVpc2VyZnM6IFF1b3RhIGZpbGUgbm90IG9uIGZpbGVzeXN0ZW0gcm9vdC4gIgorCQkJCSAiSm91cm5hbGxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLiIpOwogCXBhdGhfcmVsZWFzZSgmbmQpOwotICAgICAgICByZXR1cm4gLUVYREVWOwotICAgIH0KLSAgICAvKiBXZSBtdXN0IG5vdCBwYWNrIHRhaWxzIGZvciBxdW90YSBmaWxlcyBvbiByZWlzZXJmcyBmb3IgcXVvdGEgSU8gdG8gd29yayAqLwotICAgIGlmICghUkVJU0VSRlNfSShuZC5kZW50cnktPmRfaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykgewotCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJyZWlzZXJmczogUXVvdGEgZmlsZSBtdXN0IGhhdmUgdGFpbCBwYWNraW5nIGRpc2FibGVkLiIpOwotCXBhdGhfcmVsZWFzZSgmbmQpOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICAvKiBOb3Qgam91cm5hbGxpbmcgcXVvdGE/IE5vIG1vcmUgdGVzdHMgbmVlZGVkLi4uICovCi0gICAgaWYgKCFSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCi0gICAgICAgICFSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7Ci0JcGF0aF9yZWxlYXNlKCZuZCk7Ci0gICAgICAgIHJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7Ci0gICAgfQotICAgIC8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KLSAgICBpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQotCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJyZWlzZXJmczogUXVvdGEgZmlsZSBub3Qgb24gZmlsZXN5c3RlbSByb290LiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKb3VybmFsbGVkIHF1b3RhIHdpbGwgbm90IHdvcmsuIik7Ci0gICAgcGF0aF9yZWxlYXNlKCZuZCk7Ci0gICAgcmV0dXJuIHZmc19xdW90YV9vbihzYiwgdHlwZSwgZm9ybWF0X2lkLCBwYXRoKTsKKwlyZXR1cm4gdmZzX3F1b3RhX29uKHNiLCB0eXBlLCBmb3JtYXRfaWQsIHBhdGgpOwogfQogCiAvKiBSZWFkIGRhdGEgZnJvbSBxdW90YWZpbGUgLSBhdm9pZCBwYWdlY2FjaGUgYW5kIHN1Y2ggYmVjYXVzZSB3ZSBjYW5ub3QgYWZmb3JkCkBAIC0yMDI1LDQyICsyMTY3LDQ0IEBACiBzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAogCQkJCSAgIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCiB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07Ci0gICAgdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0gICAgaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OwotICAgIHNpemVfdCB0b3JlYWQ7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOwotICAgIGxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OworCXNpemVfdCB0b3JlYWQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAKLSAgICBpZiAob2ZmID4gaV9zaXplKQotCXJldHVybiAwOwotICAgIGlmIChvZmYrbGVuID4gaV9zaXplKQotCWxlbiA9IGlfc2l6ZS1vZmY7Ci0gICAgdG9yZWFkID0gbGVuOwotICAgIHdoaWxlICh0b3JlYWQgPiAwKSB7Ci0JdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG9yZWFkID8gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG9yZWFkOwotCXRtcF9iaC5iX3N0YXRlID0gMDsKLQkvKiBRdW90YSBmaWxlcyBhcmUgd2l0aG91dCB0YWlscyBzbyB3ZSBjYW4gc2FmZWx5IHVzZSB0aGlzIGZ1bmN0aW9uICovCi0JcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7Ci0JZXJyID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDApOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7Ci0JaWYgKGVycikKLQkgICAgcmV0dXJuIGVycjsKLQlpZiAoIWJ1ZmZlcl9tYXBwZWQoJnRtcF9iaCkpICAgIC8qIEEgaG9sZT8gKi8KLQkgICAgbWVtc2V0KGRhdGEsIDAsIHRvY29weSk7Ci0JZWxzZSB7Ci0JICAgIGJoID0gc2JfYnJlYWQoc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOwotCSAgICBpZiAoIWJoKQotCQlyZXR1cm4gLUVJTzsKLQkgICAgbWVtY3B5KGRhdGEsIGJoLT5iX2RhdGErb2Zmc2V0LCB0b2NvcHkpOwotCSAgICBicmVsc2UoYmgpOworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYgKyBsZW4gPiBpX3NpemUpCisJCWxlbiA9IGlfc2l6ZSAtIG9mZjsKKwl0b3JlYWQgPSBsZW47CisJd2hpbGUgKHRvcmVhZCA+IDApIHsKKwkJdG9jb3B5ID0KKwkJICAgIHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8CisJCSAgICB0b3JlYWQgPyBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3JlYWQ7CisJCXRtcF9iaC5iX3N0YXRlID0gMDsKKwkJLyogUXVvdGEgZmlsZXMgYXJlIHdpdGhvdXQgdGFpbHMgc28gd2UgY2FuIHNhZmVseSB1c2UgdGhpcyBmdW5jdGlvbiAqLworCQlyZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKKwkJZXJyID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDApOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKCZ0bXBfYmgpKQkvKiBBIGhvbGU/ICovCisJCQltZW1zZXQoZGF0YSwgMCwgdG9jb3B5KTsKKwkJZWxzZSB7CisJCQliaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIC1FSU87CisJCQltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YSArIG9mZnNldCwgdG9jb3B5KTsKKwkJCWJyZWxzZShiaCk7CisJCX0KKwkJb2Zmc2V0ID0gMDsKKwkJdG9yZWFkIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOwogCX0KLQlvZmZzZXQgPSAwOwotCXRvcmVhZCAtPSB0b2NvcHk7Ci0JZGF0YSArPSB0b2NvcHk7Ci0JYmxrKys7Ci0gICAgfQotICAgIHJldHVybiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAogLyogV3JpdGUgdG8gcXVvdGFmaWxlICh3ZSBrbm93IHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHN0YXJ0ZWQgYW5kIGhhcwpAQCAtMjA2OCwxMTcgKzIyMTIsMTE2IEBACiBzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKIAkJCQkgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKLSAgICB1bnNpZ25lZCBsb25nIGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLSAgICBpbnQgZXJyID0gMCwgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpLCB0b2NvcHk7Ci0gICAgaW50IGpvdXJuYWxfcXVvdGEgPSBSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbdHlwZV0gIT0gTlVMTDsKLSAgICBzaXplX3QgdG93cml0ZSA9IGxlbjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wX2JoLCAqYmg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OworCWludCBqb3VybmFsX3F1b3RhID0gUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdICE9IE5VTEw7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOwogCi0gICAgZG93bigmaW5vZGUtPmlfc2VtKTsKLSAgICB3aGlsZSAodG93cml0ZSA+IDApIHsKLQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3dyaXRlID8KLQkgICAgICAgICBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3dyaXRlOwotCXRtcF9iaC5iX3N0YXRlID0gMDsKLQllcnIgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsaywgJnRtcF9iaCwgR0VUX0JMT0NLX0NSRUFURSk7Ci0JaWYgKGVycikKLQkgICAgZ290byBvdXQ7Ci0JaWYgKG9mZnNldCB8fCB0b2NvcHkgIT0gc2ItPnNfYmxvY2tzaXplKQotCSAgICBiaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKLQllbHNlCi0JICAgIGJoID0gc2JfZ2V0YmxrKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKLQlpZiAoIWJoKSB7Ci0JICAgIGVyciA9IC1FSU87Ci0JICAgIGdvdG8gb3V0OworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJd2hpbGUgKHRvd3JpdGUgPiAwKSB7CisJCXRvY29weSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8IHRvd3JpdGUgPworCQkgICAgc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKwkJdG1wX2JoLmJfc3RhdGUgPSAwOworCQllcnIgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsaywgJnRtcF9iaCwgR0VUX0JMT0NLX0NSRUFURSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKG9mZnNldCB8fCB0b2NvcHkgIT0gc2ItPnNfYmxvY2tzaXplKQorCQkJYmggPSBzYl9icmVhZChzYiwgdG1wX2JoLmJfYmxvY2tucik7CisJCWVsc2UKKwkJCWJoID0gc2JfZ2V0YmxrKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJaWYgKCFiaCkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxvY2tfYnVmZmVyKGJoKTsKKwkJbWVtY3B5KGJoLT5iX2RhdGEgKyBvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIGJoLCAxKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KGN1cnJlbnQtPmpvdXJuYWxfaW5mbywgc2IsIGJoKTsKKwkJaWYgKCFqb3VybmFsX3F1b3RhKQorCQkJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmgpOworCQlicmVsc2UoYmgpOworCQlvZmZzZXQgPSAwOworCQl0b3dyaXRlIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOwogCX0KLQlsb2NrX2J1ZmZlcihiaCk7Ci0JbWVtY3B5KGJoLT5iX2RhdGErb2Zmc2V0LCBkYXRhLCB0b2NvcHkpOwotCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOwotCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCXVubG9ja19idWZmZXIoYmgpOwotCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIGJoLCAxKTsKLQlqb3VybmFsX21hcmtfZGlydHkoY3VycmVudC0+am91cm5hbF9pbmZvLCBzYiwgYmgpOwotCWlmICgham91cm5hbF9xdW90YSkKLQkJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmgpOwotCWJyZWxzZShiaCk7Ci0Jb2Zmc2V0ID0gMDsKLQl0b3dyaXRlIC09IHRvY29weTsKLQlkYXRhICs9IHRvY29weTsKLQlibGsrKzsKLSAgICB9Ci1vdXQ6Ci0gICAgaWYgKGxlbiA9PSB0b3dyaXRlKQotCXJldHVybiBlcnI7Ci0gICAgaWYgKGlub2RlLT5pX3NpemUgPCBvZmYrbGVuLXRvd3JpdGUpCi0JaV9zaXplX3dyaXRlKGlub2RlLCBvZmYrbGVuLXRvd3JpdGUpOwotICAgIGlub2RlLT5pX3ZlcnNpb24rKzsKLSAgICBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotICAgIG1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotICAgIHVwKCZpbm9kZS0+aV9zZW0pOwotICAgIHJldHVybiBsZW4gLSB0b3dyaXRlOworICAgICAgb3V0OgorCWlmIChsZW4gPT0gdG93cml0ZSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoaW5vZGUtPmlfc2l6ZSA8IG9mZiArIGxlbiAtIHRvd3JpdGUpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2ZmICsgbGVuIC0gdG93cml0ZSk7CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIGxlbiAtIHRvd3JpdGU7CiB9CiAKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrKgotZ2V0X3N1cGVyX2Jsb2NrIChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAotCQkgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfc3VwZXJfYmxvY2soc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgcmVpc2VyZnNfZmlsbF9zdXBlcik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1pbml0X3JlaXNlcmZzX2ZzICggdm9pZCApCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JlaXNlcmZzX2ZzKHZvaWQpCiB7CiAJaW50IHJldDsKIAotCWlmICgocmV0ID0gaW5pdF9pbm9kZWNhY2hlICgpKSkgeworCWlmICgocmV0ID0gaW5pdF9pbm9kZWNhY2hlKCkpKSB7CiAJCXJldHVybiByZXQ7CiAJfQogCi0gICAgICAgIGlmICgocmV0ID0gcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnMgKCkpKQotICAgICAgICAgICAgZ290byBmYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM7CisJaWYgKChyZXQgPSByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycygpKSkKKwkJZ290byBmYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM7CiAKLQlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQgKCk7Ci0JcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwgKCJ2ZXJzaW9uIiwgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyk7CisJcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0KCk7CisJcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoInZlcnNpb24iLAorCQkJCSAgICAgIHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MpOwogCi0gICAgICAgIHJldCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0gKCYgcmVpc2VyZnNfZnNfdHlwZSk7CisJcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmVpc2VyZnNfZnNfdHlwZSk7CiAKIAlpZiAocmV0ID09IDApIHsKIAkJcmV0dXJuIDA7CiAJfQogCi0gICAgICAgIHJlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnMgKCk7CisJcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycygpOwogCi1mYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM6Ci0JcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCAoInZlcnNpb24iKTsKLQlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUgKCk7Ci0JZGVzdHJveV9pbm9kZWNhY2hlICgpOworICAgICAgZmFpbGVkX3JlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzOgorCXJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoInZlcnNpb24iKTsKKwlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUoKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotZXhpdF9yZWlzZXJmc19mcyAoIHZvaWQgKQorc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmVpc2VyZnNfZnModm9pZCkKIHsKLSAgICAgICAgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKLQlyZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsICgidmVyc2lvbiIpOwotCXJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSAoKTsKLSAgICAgICAgdW5yZWdpc3Rlcl9maWxlc3lzdGVtICgmIHJlaXNlcmZzX2ZzX3R5cGUpOwotCWRlc3Ryb3lfaW5vZGVjYWNoZSAoKTsKKwlyZWlzZXJmc194YXR0cl91bnJlZ2lzdGVyX2hhbmRsZXJzKCk7CisJcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCgidmVyc2lvbiIpOworCXJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSgpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmVpc2VyZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CiB9CiAKIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJlaXNlcmZzX2ZzX3R5cGUgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJyZWlzZXJmcyIsCi0JLmdldF9zYgkJPSBnZXRfc3VwZXJfYmxvY2ssCi0JLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAotCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJyZWlzZXJmcyIsCisJLmdldF9zYiA9IGdldF9zdXBlcl9ibG9jaywKKwkua2lsbF9zYiA9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzID0gRlNfUkVRVUlSRVNfREVWLAogfTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OICgiUmVpc2VyRlMgam91cm5hbGVkIGZpbGVzeXN0ZW0iKTsKLU1PRFVMRV9BVVRIT1IgICAgICAoIkhhbnMgUmVpc2VyIDxyZWlzZXJAbmFtZXN5cy5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSAgICAgKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVpc2VyRlMgam91cm5hbGVkIGZpbGVzeXN0ZW0iKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgUmVpc2VyIDxyZWlzZXJAbmFtZXN5cy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLW1vZHVsZV9pbml0IChpbml0X3JlaXNlcmZzX2ZzKTsKLW1vZHVsZV9leGl0IChleGl0X3JlaXNlcmZzX2ZzKTsKK21vZHVsZV9pbml0KGluaXRfcmVpc2VyZnNfZnMpOworbW9kdWxlX2V4aXQoZXhpdF9yZWlzZXJmc19mcyk7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYyBiL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCmluZGV4IDYxOTE5MDkuLmM5MmUxMjQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCisrKyBiL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCkBAIC0xMSwxNTYgKzExLDE1OSBAQAogLyogYWNjZXNzIHRvIHRhaWwgOiB3aGVuIG9uZSBpcyBnb2luZyB0byByZWFkIHRhaWwgaXQgbXVzdCBtYWtlIHN1cmUsIHRoYXQgaXMgbm90IHJ1bm5pbmcuCiAgZGlyZWN0MmluZGlyZWN0IGFuZCBpbmRpcmVjdDJkaXJlY3QgY2FuIG5vdCBydW4gY29uY3VycmVudGx5ICovCiAKLQogLyogQ29udmVydHMgZGlyZWN0IGl0ZW1zIHRvIGFuIHVuZm9ybWF0dGVkIG5vZGUuIFBhbmljcyBpZiBmaWxlIGhhcyBubwogICAgdGFpbC4gLUVOT1NQQyBpZiBubyBkaXNrIHNwYWNlIGZvciBjb252ZXJzaW9uICovCiAvKiBwYXRoIHBvaW50cyB0byBmaXJzdCBkaXJlY3QgaXRlbSBvZiB0aGUgZmlsZSByZWdhcmxlc3Mgb2YgaG93IG1hbnkgb2YKICAgIHRoZW0gYXJlIHRoZXJlICovCi1pbnQgZGlyZWN0MmluZGlyZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogaW5vZGUsIAotCQkgICAgIHN0cnVjdCBwYXRoICogcGF0aCwgc3RydWN0IGJ1ZmZlcl9oZWFkICogdW5iaCwKLQkJICAgICBsb2ZmX3QgdGFpbF9vZmZzZXQpCitpbnQgZGlyZWN0MmluZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBidWZmZXJfaGVhZCAqdW5iaCwKKwkJICAgIGxvZmZfdCB0YWlsX29mZnNldCkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdXBfdG9fZGF0ZV9iaCA7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOwotICAgIHVuc2lnbmVkIGxvbmcgdG90YWxfdGFpbCA9IDAgOwotICAgIHN0cnVjdCBjcHVfa2V5IGVuZF9rZXk7ICAvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZQotCQkJCWNvbnZlcnRlZCBpdGVtLiAqLwotICAgIHN0cnVjdCBpdGVtX2hlYWQgaW5kX2loOyAvKiBuZXcgaW5kaXJlY3QgaXRlbSB0byBiZSBpbnNlcnRlZCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgb2YgdW5mbSBwb2ludGVyIHRvIGJlIHBhc3RlZCAqLwotICAgIGludAluX2Jsa19zaXplLAotICAgICAgbl9yZXR2YWw7CSAgLyogcmV0dXJuZWQgdmFsdWUgZm9yIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCBjbG9uZXMgKi8KLSAgICB1bnBfdCB1bmZtX3B0cjsgIC8qIEhhbmRsZSBvbiBhbiB1bmZvcm1hdHRlZCBub2RlCi0JCQkJICAgICAgIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUKLQkJCQkgICAgICAgdHJlZS4gKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp1cF90b19kYXRlX2JoOworCXN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocGF0aCk7CisJdW5zaWduZWQgbG9uZyB0b3RhbF90YWlsID0gMDsKKwlzdHJ1Y3QgY3B1X2tleSBlbmRfa2V5OwkvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZQorCQkJCSAgIGNvbnZlcnRlZCBpdGVtLiAqLworCXN0cnVjdCBpdGVtX2hlYWQgaW5kX2loOwkvKiBuZXcgaW5kaXJlY3QgaXRlbSB0byBiZSBpbnNlcnRlZCBvcgorCQkJCQkgICBrZXkgb2YgdW5mbSBwb2ludGVyIHRvIGJlIHBhc3RlZCAqLworCWludCBuX2Jsa19zaXplLCBuX3JldHZhbDsJLyogcmV0dXJuZWQgdmFsdWUgZm9yIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCBjbG9uZXMgKi8KKwl1bnBfdCB1bmZtX3B0cjsJCS8qIEhhbmRsZSBvbiBhbiB1bmZvcm1hdHRlZCBub2RlCisJCQkJICAgdGhhdCB3aWxsIGJlIGluc2VydGVkIGluIHRoZQorCQkJCSAgIHRyZWUuICovCiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBSRUlTRVJGU19TQihzYiktPnNfZGlyZWN0MmluZGlyZWN0ICsrOworCVJFSVNFUkZTX1NCKHNiKS0+c19kaXJlY3QyaW5kaXJlY3QrKzsKIAotICAgIG5fYmxrX3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJbl9ibGtfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAotICAgIC8qIGFuZCBrZXkgdG8gc2VhcmNoIGZvciBhcHBlbmQgb3IgaW5zZXJ0IHBvaW50ZXIgdG8gdGhlIG5ldwotICAgICAgIHVuZm9ybWF0dGVkIG5vZGUuICovCi0gICAgY29weV9pdGVtX2hlYWQgKCZpbmRfaWgsIHBfbGVfaWgpOwotICAgIHNldF9sZV9paF9rX29mZnNldCAoJmluZF9paCwgdGFpbF9vZmZzZXQpOwotICAgIHNldF9sZV9paF9rX3R5cGUgKCZpbmRfaWgsIFRZUEVfSU5ESVJFQ1QpOworCS8qIGFuZCBrZXkgdG8gc2VhcmNoIGZvciBhcHBlbmQgb3IgaW5zZXJ0IHBvaW50ZXIgdG8gdGhlIG5ldworCSAgIHVuZm9ybWF0dGVkIG5vZGUuICovCisJY29weV9pdGVtX2hlYWQoJmluZF9paCwgcF9sZV9paCk7CisJc2V0X2xlX2loX2tfb2Zmc2V0KCZpbmRfaWgsIHRhaWxfb2Zmc2V0KTsKKwlzZXRfbGVfaWhfa190eXBlKCZpbmRfaWgsIFRZUEVfSU5ESVJFQ1QpOwogCi0gICAgLyogU2V0IHRoZSBrZXkgdG8gc2VhcmNoIGZvciB0aGUgcGxhY2UgZm9yIG5ldyB1bmZtIHBvaW50ZXIgKi8KLSAgICBtYWtlX2NwdV9rZXkgKCZlbmRfa2V5LCBpbm9kZSwgdGFpbF9vZmZzZXQsIFRZUEVfSU5ESVJFQ1QsIDQpOworCS8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIHBsYWNlIGZvciBuZXcgdW5mbSBwb2ludGVyICovCisJbWFrZV9jcHVfa2V5KCZlbmRfa2V5LCBpbm9kZSwgdGFpbF9vZmZzZXQsIFRZUEVfSU5ESVJFQ1QsIDQpOwogCi0gICAgLy8gRklYTUU6IHdlIGNvdWxkIGF2b2lkIHRoaXMgCi0gICAgaWYgKCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoc2IsICZlbmRfa2V5LCBwYXRoKSA9PSBQT1NJVElPTl9GT1VORCApIHsKLQlyZWlzZXJmc193YXJuaW5nIChzYiwgIlBBUC0xNDAzMDogZGlyZWN0MmluZGlyZWN0OiAiCi0JCQkicGFzdGVkIG9yIGluc2VydGVkIGJ5dGUgZXhpc3RzIGluIHRoZSB0cmVlICVLLiAiCi0JCQkiVXNlIGZzY2sgdG8gcmVwYWlyLiIsICZlbmRfa2V5KTsKLQlwYXRocmVsc2UocGF0aCk7Ci0JcmV0dXJuIC1FSU87Ci0gICAgfQotICAgIAotICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOwotCi0gICAgdW5mbV9wdHIgPSBjcHVfdG9fbGUzMiAodW5iaC0+Yl9ibG9ja25yKTsKLSAgICAKLSAgICBpZiAoIGlzX3N0YXRkYXRhX2xlX2loIChwX2xlX2loKSApICB7Ci0JLyogSW5zZXJ0IG5ldyBpbmRpcmVjdCBpdGVtLiAqLwotCXNldF9paF9mcmVlX3NwYWNlICgmaW5kX2loLCAwKTsgLyogZGVsZXRlIGF0IG5lYXJlc3QgZnV0dXJlICovCi0gICAgICAgIHB1dF9paF9pdGVtX2xlbiggJmluZF9paCwgVU5GTV9QX1NJWkUgKTsKLQlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpKys7Ci0Jbl9yZXR2YWwgPSByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsIHBhdGgsICZlbmRfa2V5LCAmaW5kX2loLCBpbm9kZSwKLQkJCQkJIChjaGFyICopJnVuZm1fcHRyKTsKLSAgICB9IGVsc2UgewotCS8qIFBhc3RlIGludG8gbGFzdCBpbmRpcmVjdCBpdGVtIG9mIGFuIG9iamVjdC4gKi8KLQluX3JldHZhbCA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSh0aCwgcGF0aCwgJmVuZF9rZXksIGlub2RlLAotCQkJCQkgICAgKGNoYXIgKikmdW5mbV9wdHIsIFVORk1fUF9TSVpFKTsKLSAgICB9Ci0gICAgaWYgKCBuX3JldHZhbCApIHsKLQlyZXR1cm4gbl9yZXR2YWw7Ci0gICAgfQotCi0gICAgLy8gbm90ZTogZnJvbSBoZXJlIHRoZXJlIGFyZSB0d28ga2V5cyB3aGljaCBoYXZlIG1hdGNoaW5nIGZpcnN0Ci0gICAgLy8gdGhyZWUga2V5IGNvbXBvbmVudHMuIFRoZXkgb25seSBkaWZmZXIgYnkgdGhlIGZvdXJ0aCBvbmUuCi0KLQotICAgIC8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRpcmVjdCBpdGVtcyBvZiB0aGUgZmlsZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJmVuZF9rZXksIGlub2RlLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChpbm9kZSksIFRZUEVfRElSRUNULCA0KTsKLQotICAgIC8qIE1vdmUgYnl0ZXMgZnJvbSB0aGUgZGlyZWN0IGl0ZW1zIHRvIHRoZSBuZXcgdW5mb3JtYXR0ZWQgbm9kZQotICAgICAgIGFuZCBkZWxldGUgdGhlbS4gKi8KLSAgICB3aGlsZSAoMSkgIHsKLQlpbnQgdGFpbF9zaXplOwotCi0JLyogZW5kX2tleS5rX29mZnNldCBpcyBzZXQgc28sIHRoYXQgd2Ugd2lsbCBhbHdheXMgaGF2ZSBmb3VuZAotICAgICAgICAgICBsYXN0IGl0ZW0gb2YgdGhlIGZpbGUgKi8KLQlpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChzYiwgJmVuZF9rZXksIHBhdGgpID09IFBPU0lUSU9OX0ZPVU5EICkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKHNiLCAiUEFQLTE0MDUwOiBkaXJlY3QyaW5kaXJlY3Q6ICIKLQkJCSAgICAiZGlyZWN0IGl0ZW0gKCVLKSBub3QgZm91bmQiLCAmZW5kX2tleSk7Ci0JcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCAocGF0aCk7Ci0JUkZBTFNFKCAhaXNfZGlyZWN0X2xlX2loIChwX2xlX2loKSwKLQkgICAgICAgICJ2cy0xNDA1NTogZGlyZWN0IGl0ZW0gZXhwZWN0ZWQoJUspLCBmb3VuZCAlaCIsCi0gICAgICAgICAgICAgICAgJmVuZF9rZXksIHBfbGVfaWgpOwotICAgICAgICB0YWlsX3NpemUgPSAobGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpICYgKG5fYmxrX3NpemUgLSAxKSkKLSAgICAgICAgICAgICsgaWhfaXRlbV9sZW4ocF9sZV9paCkgLSAxOwotCi0JLyogd2Ugb25seSBzZW5kIHRoZSB1bmJoIHBvaW50ZXIgaWYgdGhlIGJ1ZmZlciBpcyBub3QgdXAgdG8gZGF0ZS4KLQkqKiB0aGlzIGF2b2lkcyBvdmVyd3JpdGluZyBnb29kIGRhdGEgZnJvbSB3cml0ZXBhZ2UoKSB3aXRoIG9sZCBkYXRhCi0JKiogZnJvbSB0aGUgZGlzayBvciBidWZmZXIgY2FjaGUKLQkqKiBTcGVjaWFsIGNhc2U6IHVuYmgtPmJfcGFnZSB3aWxsIGJlIE5VTEwgaWYgd2UgYXJlIGNvbWluZyB0aHJvdWdoCi0JKiogRElSRUNUX0lPIGhhbmRsZXIgaGVyZS4KLQkqLwotCWlmICghdW5iaC0+Yl9wYWdlIHx8IGJ1ZmZlcl91cHRvZGF0ZSh1bmJoKSB8fCBQYWdlVXB0b2RhdGUodW5iaC0+Yl9wYWdlKSkgewotCSAgICB1cF90b19kYXRlX2JoID0gTlVMTCA7Ci0JfSBlbHNlIHsKLQkgICAgdXBfdG9fZGF0ZV9iaCA9IHVuYmggOworCS8vIEZJWE1FOiB3ZSBjb3VsZCBhdm9pZCB0aGlzIAorCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzYiwgJmVuZF9rZXksIHBhdGgpID09IFBPU0lUSU9OX0ZPVU5EKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJQQVAtMTQwMzA6IGRpcmVjdDJpbmRpcmVjdDogIgorCQkJCSAicGFzdGVkIG9yIGluc2VydGVkIGJ5dGUgZXhpc3RzIGluIHRoZSB0cmVlICVLLiAiCisJCQkJICJVc2UgZnNjayB0byByZXBhaXIuIiwgJmVuZF9rZXkpOworCQlwYXRocmVsc2UocGF0aCk7CisJCXJldHVybiAtRUlPOwogCX0KLQluX3JldHZhbCA9IHJlaXNlcmZzX2RlbGV0ZV9pdGVtICh0aCwgcGF0aCwgJmVuZF9rZXksIGlub2RlLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cF90b19kYXRlX2JoKSA7CiAKLQl0b3RhbF90YWlsICs9IG5fcmV0dmFsIDsKLQlpZiAodGFpbF9zaXplID09IG5fcmV0dmFsKQotCSAgICAvLyBkb25lOiBmaWxlIGRvZXMgbm90IGhhdmUgZGlyZWN0IGl0ZW1zIGFueW1vcmUKLQkgICAgYnJlYWs7CisJcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwYXRoKTsKIAotICAgIH0KLSAgICAvKiBpZiB3ZSd2ZSBjb3BpZWQgYnl0ZXMgZnJvbSBkaXNrIGludG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gemVybwotICAgICoqIG91dCB0aGUgdW51c2VkIHBhcnQgb2YgdGhlIGJsb2NrIChpdCB3YXMgbm90IHVwIHRvIGRhdGUgYmVmb3JlKQotICAgICovCi0gICAgaWYgKHVwX3RvX2RhdGVfYmgpIHsKLSAgICAgICAgdW5zaWduZWQgcGdvZmYgPSAodGFpbF9vZmZzZXQgKyB0b3RhbF90YWlsIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7Ci0JY2hhciAqa2FkZHI9a21hcF9hdG9taWModXBfdG9fZGF0ZV9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7Ci0JbWVtc2V0KGthZGRyICsgcGdvZmYsIDAsIG5fYmxrX3NpemUgLSB0b3RhbF90YWlsKSA7Ci0Ja3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwotICAgIH0KKwl1bmZtX3B0ciA9IGNwdV90b19sZTMyKHVuYmgtPmJfYmxvY2tucik7CiAKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFUzMl9NQVg7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKHBfbGVfaWgpKSB7CisJCS8qIEluc2VydCBuZXcgaW5kaXJlY3QgaXRlbS4gKi8KKwkJc2V0X2loX2ZyZWVfc3BhY2UoJmluZF9paCwgMCk7CS8qIGRlbGV0ZSBhdCBuZWFyZXN0IGZ1dHVyZSAqLworCQlwdXRfaWhfaXRlbV9sZW4oJmluZF9paCwgVU5GTV9QX1NJWkUpOworCQlQQVRIX0xBU1RfUE9TSVRJT04ocGF0aCkrKzsKKwkJbl9yZXR2YWwgPQorCQkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsIHBhdGgsICZlbmRfa2V5LCAmaW5kX2loLCBpbm9kZSwKKwkJCQkJIChjaGFyICopJnVuZm1fcHRyKTsKKwl9IGVsc2UgeworCQkvKiBQYXN0ZSBpbnRvIGxhc3QgaW5kaXJlY3QgaXRlbSBvZiBhbiBvYmplY3QuICovCisJCW5fcmV0dmFsID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHRoLCBwYXRoLCAmZW5kX2tleSwgaW5vZGUsCisJCQkJCQkgICAgKGNoYXIgKikmdW5mbV9wdHIsCisJCQkJCQkgICAgVU5GTV9QX1NJWkUpOworCX0KKwlpZiAobl9yZXR2YWwpIHsKKwkJcmV0dXJuIG5fcmV0dmFsOworCX0KKwkvLyBub3RlOiBmcm9tIGhlcmUgdGhlcmUgYXJlIHR3byBrZXlzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlyc3QKKwkvLyB0aHJlZSBrZXkgY29tcG9uZW50cy4gVGhleSBvbmx5IGRpZmZlciBieSB0aGUgZm91cnRoIG9uZS4KIAotICAgIHJldHVybiAwOworCS8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRpcmVjdCBpdGVtcyBvZiB0aGUgZmlsZSAqLworCW1ha2VfY3B1X2tleSgmZW5kX2tleSwgaW5vZGUsIG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpLCBUWVBFX0RJUkVDVCwKKwkJICAgICA0KTsKKworCS8qIE1vdmUgYnl0ZXMgZnJvbSB0aGUgZGlyZWN0IGl0ZW1zIHRvIHRoZSBuZXcgdW5mb3JtYXR0ZWQgbm9kZQorCSAgIGFuZCBkZWxldGUgdGhlbS4gKi8KKwl3aGlsZSAoMSkgeworCQlpbnQgdGFpbF9zaXplOworCisJCS8qIGVuZF9rZXkua19vZmZzZXQgaXMgc2V0IHNvLCB0aGF0IHdlIHdpbGwgYWx3YXlzIGhhdmUgZm91bmQKKwkJICAgbGFzdCBpdGVtIG9mIHRoZSBmaWxlICovCisJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzYiwgJmVuZF9rZXksIHBhdGgpID09CisJCSAgICBQT1NJVElPTl9GT1VORCkKKwkJCXJlaXNlcmZzX3BhbmljKHNiLAorCQkJCSAgICAgICAiUEFQLTE0MDUwOiBkaXJlY3QyaW5kaXJlY3Q6ICIKKwkJCQkgICAgICAgImRpcmVjdCBpdGVtICglSykgbm90IGZvdW5kIiwgJmVuZF9rZXkpOworCQlwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEKHBhdGgpOworCQlSRkFMU0UoIWlzX2RpcmVjdF9sZV9paChwX2xlX2loKSwKKwkJICAgICAgICJ2cy0xNDA1NTogZGlyZWN0IGl0ZW0gZXhwZWN0ZWQoJUspLCBmb3VuZCAlaCIsCisJCSAgICAgICAmZW5kX2tleSwgcF9sZV9paCk7CisJCXRhaWxfc2l6ZSA9IChsZV9paF9rX29mZnNldChwX2xlX2loKSAmIChuX2Jsa19zaXplIC0gMSkpCisJCSAgICArIGloX2l0ZW1fbGVuKHBfbGVfaWgpIC0gMTsKKworCQkvKiB3ZSBvbmx5IHNlbmQgdGhlIHVuYmggcG9pbnRlciBpZiB0aGUgYnVmZmVyIGlzIG5vdCB1cCB0byBkYXRlLgorCQkgKiogdGhpcyBhdm9pZHMgb3ZlcndyaXRpbmcgZ29vZCBkYXRhIGZyb20gd3JpdGVwYWdlKCkgd2l0aCBvbGQgZGF0YQorCQkgKiogZnJvbSB0aGUgZGlzayBvciBidWZmZXIgY2FjaGUKKwkJICoqIFNwZWNpYWwgY2FzZTogdW5iaC0+Yl9wYWdlIHdpbGwgYmUgTlVMTCBpZiB3ZSBhcmUgY29taW5nIHRocm91Z2gKKwkJICoqIERJUkVDVF9JTyBoYW5kbGVyIGhlcmUuCisJCSAqLworCQlpZiAoIXVuYmgtPmJfcGFnZSB8fCBidWZmZXJfdXB0b2RhdGUodW5iaCkKKwkJICAgIHx8IFBhZ2VVcHRvZGF0ZSh1bmJoLT5iX3BhZ2UpKSB7CisJCQl1cF90b19kYXRlX2JoID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXVwX3RvX2RhdGVfYmggPSB1bmJoOworCQl9CisJCW5fcmV0dmFsID0gcmVpc2VyZnNfZGVsZXRlX2l0ZW0odGgsIHBhdGgsICZlbmRfa2V5LCBpbm9kZSwKKwkJCQkJCXVwX3RvX2RhdGVfYmgpOworCisJCXRvdGFsX3RhaWwgKz0gbl9yZXR2YWw7CisJCWlmICh0YWlsX3NpemUgPT0gbl9yZXR2YWwpCisJCQkvLyBkb25lOiBmaWxlIGRvZXMgbm90IGhhdmUgZGlyZWN0IGl0ZW1zIGFueW1vcmUKKwkJCWJyZWFrOworCisJfQorCS8qIGlmIHdlJ3ZlIGNvcGllZCBieXRlcyBmcm9tIGRpc2sgaW50byB0aGUgcGFnZSwgd2UgbmVlZCB0byB6ZXJvCisJICoqIG91dCB0aGUgdW51c2VkIHBhcnQgb2YgdGhlIGJsb2NrIChpdCB3YXMgbm90IHVwIHRvIGRhdGUgYmVmb3JlKQorCSAqLworCWlmICh1cF90b19kYXRlX2JoKSB7CisJCXVuc2lnbmVkIHBnb2ZmID0KKwkJICAgICh0YWlsX29mZnNldCArIHRvdGFsX3RhaWwgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyh1cF90b19kYXRlX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgcGdvZmYsIDAsIG5fYmxrX3NpemUgLSB0b3RhbF90YWlsKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCX0KKworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gVTMyX01BWDsKKworCXJldHVybiAwOwogfQogCi0KIC8qIHN0b2xlbiBmcm9tIGZzL2J1ZmZlci5jICovCi12b2lkIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgbG9ja19idWZmZXIoYmgpIDsKLSAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7Ci0gICAgICBCVUcoKSA7Ci0gICAgfQotICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOwotICAgIC8qIFJlbW92ZSB0aGUgYnVmZmVyIGZyb20gd2hhdGV2ZXIgbGlzdCBpdCBiZWxvbmdzIHRvLiBXZSBhcmUgbW9zdGx5Ci0gICAgICAgaW50ZXJlc3RlZCBpbiByZW1vdmluZyBpdCBmcm9tIHBlci1zYiBqX2RpcnR5X2J1ZmZlcnMgbGlzdCwgdG8gYXZvaWQKLSAgICAgICAgQlVHKCkgb24gYXR0ZW1wdCB0byB3cml0ZSBub3QgbWFwcGVkIGJ1ZmZlciAqLwotICAgIGlmICggKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSB8fCBiaC0+Yl9wcml2YXRlKSAmJiBiaC0+Yl9wYWdlKSB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGJoLT5iX3BhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmogPSBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKTsKLQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKLQlsaXN0X2RlbF9pbml0KCZiaC0+Yl9hc3NvY19idWZmZXJzKTsKLQlyZWlzZXJmc19mcmVlX2poKGJoKTsKLQlzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotICAgIH0KLSAgICBjbGVhcl9idWZmZXJfbWFwcGVkKGJoKSA7Ci0gICAgY2xlYXJfYnVmZmVyX3JlcShiaCkgOwotICAgIGNsZWFyX2J1ZmZlcl9uZXcoYmgpOwotICAgIGJoLT5iX2JkZXYgPSBOVUxMOwotICAgIHVubG9ja19idWZmZXIoYmgpIDsKK3ZvaWQgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJbG9ja19idWZmZXIoYmgpOworCWlmIChidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJQlVHKCk7CisJfQorCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJLyogUmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB3aGF0ZXZlciBsaXN0IGl0IGJlbG9uZ3MgdG8uIFdlIGFyZSBtb3N0bHkKKwkgICBpbnRlcmVzdGVkIGluIHJlbW92aW5nIGl0IGZyb20gcGVyLXNiIGpfZGlydHlfYnVmZmVycyBsaXN0LCB0byBhdm9pZAorCSAgIEJVRygpIG9uIGF0dGVtcHQgdG8gd3JpdGUgbm90IG1hcHBlZCBidWZmZXIgKi8KKwlpZiAoKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSB8fCBiaC0+Yl9wcml2YXRlKSAmJiBiaC0+Yl9wYWdlKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBiaC0+Yl9wYWdlLT5tYXBwaW5nLT5ob3N0OworCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpOworCQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmYmgtPmJfYXNzb2NfYnVmZmVycyk7CisJCXJlaXNlcmZzX2ZyZWVfamgoYmgpOworCQlzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCX0KKwljbGVhcl9idWZmZXJfbWFwcGVkKGJoKTsKKwljbGVhcl9idWZmZXJfcmVxKGJoKTsKKwljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwliaC0+Yl9iZGV2ID0gTlVMTDsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKIH0KIAogLyogdGhpcyBmaXJzdCBsb2NrcyBpbm9kZSAobmVpdGhlciByZWFkcyBub3Igc3luYyBhcmUgcGVybWl0dGVkKSwKQEAgLTE2OSwxMDggKzE3MiwxMDggQEAKICAgIHdoYXQgd2UgZXhwZWN0IGZyb20gaXQgKG51bWJlciBvZiBjdXQgYnl0ZXMpLiBCdXQgd2hlbiB0YWlsIHJlbWFpbnMKICAgIGluIHRoZSB1bmZvcm1hdHRlZCBub2RlLCB3ZSBzZXQgbW9kZSB0byBTS0lQX0JBTEFOQ0lORyBhbmQgdW5sb2NrCiAgICBpbm9kZSAqLwotaW50IGluZGlyZWN0MmRpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkgICAgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwKLQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgCi0JCSAgICAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCwgLyogcGF0aCB0byB0aGUgaW5kaXJlY3QgaXRlbS4gKi8KLQkJICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19pdGVtX2tleSwgLyogS2V5IHRvIGxvb2sgZm9yIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciB0byBiZSBjdXQuICovCi0JCSAgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSwgLyogTmV3IGZpbGUgc2l6ZS4gKi8KLQkJICAgICBjaGFyICogcF9jX21vZGUpCitpbnQgaW5kaXJlY3QyZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwJLyogcGF0aCB0byB0aGUgaW5kaXJlY3QgaXRlbS4gKi8KKwkJICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksCS8qIEtleSB0byBsb29rIGZvciB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgdG8gYmUgY3V0LiAqLworCQkgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSwJLyogTmV3IGZpbGUgc2l6ZS4gKi8KKwkJICAgIGNoYXIgKnBfY19tb2RlKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICAgc19paDsKLSAgICB1bnNpZ25lZCBsb25nIG5fYmxvY2tfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7Ci0gICAgY2hhciAqIHRhaWw7Ci0gICAgaW50IHRhaWxfbGVuLCByb3VuZF90YWlsX2xlbjsKLSAgICBsb2ZmX3QgcG9zLCBwb3MxOyAvKiBwb3NpdGlvbiBvZiBmaXJzdCBieXRlIG9mIHRoZSB0YWlsICovCi0gICAgc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOworCXN0cnVjdCBpdGVtX2hlYWQgc19paDsKKwl1bnNpZ25lZCBsb25nIG5fYmxvY2tfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7CisJY2hhciAqdGFpbDsKKwlpbnQgdGFpbF9sZW4sIHJvdW5kX3RhaWxfbGVuOworCWxvZmZfdCBwb3MsIHBvczE7CS8qIHBvc2l0aW9uIG9mIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgKi8KKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBSRUlTRVJGU19TQihwX3Nfc2IpLT5zX2luZGlyZWN0MmRpcmVjdCArKzsKKwlSRUlTRVJGU19TQihwX3Nfc2IpLT5zX2luZGlyZWN0MmRpcmVjdCsrOwogCi0gICAgKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKKwkqcF9jX21vZGUgPSBNX1NLSVBfQkFMQU5DSU5HOwogCi0gICAgLyogc3RvcmUgaXRlbSBoZWFkIHBhdGggcG9pbnRzIHRvLiAqLwotICAgIGNvcHlfaXRlbV9oZWFkICgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7Ci0KLSAgICB0YWlsX2xlbiA9IChuX25ld19maWxlX3NpemUgJiAobl9ibG9ja19zaXplIC0gMSkpOwotICAgIGlmIChnZXRfaW5vZGVfc2RfdmVyc2lvbiAocF9zX2lub2RlKSA9PSBTVEFUX0RBVEFfVjIpCi0Jcm91bmRfdGFpbF9sZW4gPSBST1VORF9VUCAodGFpbF9sZW4pOwotICAgIGVsc2UKLQlyb3VuZF90YWlsX2xlbiA9IHRhaWxfbGVuOwotCi0gICAgcG9zID0gbGVfaWhfa19vZmZzZXQgKCZzX2loKSAtIDEgKyAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLSAxKSAqIHBfc19zYi0+c19ibG9ja3NpemU7Ci0gICAgcG9zMSA9IHBvczsKLQotICAgIC8vIHdlIGFyZSBwcm90ZWN0ZWQgYnkgaV9zZW0uIFRoZSB0YWlsIGNhbiBub3QgZGlzYXBwZXIsIG5vdAotICAgIC8vIGFwcGVuZCBjYW4gYmUgZG9uZSBlaXRoZXIKLSAgICAvLyB3ZSBhcmUgaW4gdHJ1bmNhdGUgb3IgcGFja2luZyB0YWlsIGluIGZpbGVfcmVsZWFzZQotCi0gICAgdGFpbCA9IChjaGFyICopa21hcChwYWdlKSA7IC8qIHRoaXMgY2FuIHNjaGVkdWxlICovCi0KLSAgICBpZiAocGF0aF9jaGFuZ2VkICgmc19paCwgcF9zX3BhdGgpKSB7Ci0JLyogcmUtc2VhcmNoIGluZGlyZWN0IGl0ZW0gKi8KLQlpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCApCi0JICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgIlBBUC01NTIwOiBpbmRpcmVjdDJkaXJlY3Q6ICIKLQkJCSAgICJpdGVtIHRvIGJlIGNvbnZlcnRlZCAlSyBkb2VzIG5vdCBleGlzdCIsIHBfc19pdGVtX2tleSk7CisJLyogc3RvcmUgaXRlbSBoZWFkIHBhdGggcG9pbnRzIHRvLiAqLwogCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKKworCXRhaWxfbGVuID0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChuX2Jsb2NrX3NpemUgLSAxKSk7CisJaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uKHBfc19pbm9kZSkgPT0gU1RBVF9EQVRBX1YyKQorCQlyb3VuZF90YWlsX2xlbiA9IFJPVU5EX1VQKHRhaWxfbGVuKTsKKwllbHNlCisJCXJvdW5kX3RhaWxfbGVuID0gdGFpbF9sZW47CisKKwlwb3MgPQorCSAgICBsZV9paF9rX29mZnNldCgmc19paCkgLSAxICsgKGloX2l0ZW1fbGVuKCZzX2loKSAvIFVORk1fUF9TSVpFIC0KKwkJCQkJIDEpICogcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlwb3MxID0gcG9zOworCisJLy8gd2UgYXJlIHByb3RlY3RlZCBieSBpX3NlbS4gVGhlIHRhaWwgY2FuIG5vdCBkaXNhcHBlciwgbm90CisJLy8gYXBwZW5kIGNhbiBiZSBkb25lIGVpdGhlcgorCS8vIHdlIGFyZSBpbiB0cnVuY2F0ZSBvciBwYWNraW5nIHRhaWwgaW4gZmlsZV9yZWxlYXNlCisKKwl0YWlsID0gKGNoYXIgKilrbWFwKHBhZ2UpOwkvKiB0aGlzIGNhbiBzY2hlZHVsZSAqLworCisJaWYgKHBhdGhfY2hhbmdlZCgmc19paCwgcF9zX3BhdGgpKSB7CisJCS8qIHJlLXNlYXJjaCBpbmRpcmVjdCBpdGVtICovCisJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpCisJCSAgICA9PSBQT1NJVElPTl9OT1RfRk9VTkQpCisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJQQVAtNTUyMDogaW5kaXJlY3QyZGlyZWN0OiAiCisJCQkJICAgICAgICJpdGVtIHRvIGJlIGNvbnZlcnRlZCAlSyBkb2VzIG5vdCBleGlzdCIsCisJCQkJICAgICAgIHBfc19pdGVtX2tleSk7CisJCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQlwb3MgPSBsZV9paF9rX29mZnNldCAoJnNfaWgpIC0gMSArIAotCSAgICAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLSAxKSAqIHBfc19zYi0+c19ibG9ja3NpemU7Ci0JaWYgKHBvcyAhPSBwb3MxKQotCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTUzMDogaW5kaXJlY3QyZGlyZWN0OiAiCi0JCQkgICAgInRhaWwgcG9zaXRpb24gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIHJlYWRpbmcgaXQiKTsKKwkJcG9zID0gbGVfaWhfa19vZmZzZXQoJnNfaWgpIC0gMSArCisJCSAgICAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLQorCQkgICAgIDEpICogcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJaWYgKHBvcyAhPSBwb3MxKQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAidnMtNTUzMDogaW5kaXJlY3QyZGlyZWN0OiAiCisJCQkJICAgICAgICJ0YWlsIHBvc2l0aW9uIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSByZWFkaW5nIGl0Iik7CiAjZW5kaWYKLSAgICB9CisJfQogCisJLyogU2V0IGRpcmVjdCBpdGVtIGhlYWRlciB0byBpbnNlcnQuICovCisJbWFrZV9sZV9pdGVtX2hlYWQoJnNfaWgsIE5VTEwsIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKHBfc19pbm9kZSksCisJCQkgIHBvczEgKyAxLCBUWVBFX0RJUkVDVCwgcm91bmRfdGFpbF9sZW4sCisJCQkgIDB4ZmZmZiAvKmloX2ZyZWVfc3BhY2UgKi8gKTsKIAotICAgIC8qIFNldCBkaXJlY3QgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiAqLwotICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmc19paCwgTlVMTCwgZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKHBfc19pbm9kZSksIHBvczEgKyAxLAotCQkgICAgICAgVFlQRV9ESVJFQ1QsIHJvdW5kX3RhaWxfbGVuLCAweGZmZmYvKmloX2ZyZWVfc3BhY2UqLyk7CisJLyogd2Ugd2FudCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgaW4gdGhlIHBhZ2UuCisJICoqIHRoZSBwYWdlIHdhcyBsb2NrZWQgYW5kIHRoaXMgcGFydCBvZiB0aGUgcGFnZSB3YXMgdXAgdG8gZGF0ZSB3aGVuCisJICoqIGluZGlyZWN0MmRpcmVjdCB3YXMgY2FsbGVkLCBzbyB3ZSBrbm93IHRoZSBieXRlcyBhcmUgc3RpbGwgdmFsaWQKKwkgKi8KKwl0YWlsID0gdGFpbCArIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwogCi0gICAgLyogd2Ugd2FudCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgaW4gdGhlIHBhZ2UuCi0gICAgKiogdGhlIHBhZ2Ugd2FzIGxvY2tlZCBhbmQgdGhpcyBwYXJ0IG9mIHRoZSBwYWdlIHdhcyB1cCB0byBkYXRlIHdoZW4KLSAgICAqKiBpbmRpcmVjdDJkaXJlY3Qgd2FzIGNhbGxlZCwgc28gd2Uga25vdyB0aGUgYnl0ZXMgYXJlIHN0aWxsIHZhbGlkCi0gICAgKi8KLSAgICB0YWlsID0gdGFpbCArIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpIDsKKwlQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpKys7CiAKLSAgICBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpKys7CisJa2V5ID0gKnBfc19pdGVtX2tleTsKKwlzZXRfY3B1X2tleV9rX3R5cGUoJmtleSwgVFlQRV9ESVJFQ1QpOworCWtleS5rZXlfbGVuZ3RoID0gNDsKKwkvKiBJbnNlcnQgdGFpbCBhcyBuZXcgZGlyZWN0IGl0ZW0gaW4gdGhlIHRyZWUgKi8KKwlpZiAocmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsIHBfc19wYXRoLCAma2V5LCAmc19paCwgcF9zX2lub2RlLAorCQkJCSB0YWlsID8gdGFpbCA6IE5VTEwpIDwgMCkgeworCQkvKiBObyBkaXNrIG1lbW9yeS4gU28gd2UgY2FuIG5vdCBjb252ZXJ0IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZQorCQkgICB0byB0aGUgZGlyZWN0IGl0ZW0uICBJbiB0aGlzIGNhc2Ugd2UgdXNlZCB0byBhZGp1c3QKKwkJICAgaW5kaXJlY3QgaXRlbXMncyBpaF9mcmVlX3NwYWNlLiBOb3cgaWhfZnJlZV9zcGFjZSBpcyBub3QKKwkJICAgdXNlZCwgaXQgd291bGQgYmUgaWRlYWwgdG8gd3JpdGUgemVyb3MgdG8gY29ycmVzcG9uZGluZworCQkgICB1bmZvcm1hdHRlZCBub2RlLiBGb3Igbm93IGlfc2l6ZSBpcyBjb25zaWRlcmVkIGFzIGd1YXJkIGZvcgorCQkgICBnb2luZyBvdXQgb2YgZmlsZSBzaXplICovCisJCWt1bm1hcChwYWdlKTsKKwkJcmV0dXJuIG5fYmxvY2tfc2l6ZSAtIHJvdW5kX3RhaWxfbGVuOworCX0KKwlrdW5tYXAocGFnZSk7CiAKLSAgICBrZXkgPSAqcF9zX2l0ZW1fa2V5OwotICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoJmtleSwgVFlQRV9ESVJFQ1QpOwotICAgIGtleS5rZXlfbGVuZ3RoID0gNDsKLSAgICAvKiBJbnNlcnQgdGFpbCBhcyBuZXcgZGlyZWN0IGl0ZW0gaW4gdGhlIHRyZWUgKi8KLSAgICBpZiAoIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCBwX3NfcGF0aCwgJmtleSwgJnNfaWgsIHBfc19pbm9kZSwKLQkJCSAgICAgIHRhaWwgPyB0YWlsIDogTlVMTCkgPCAwICkgewotCS8qIE5vIGRpc2sgbWVtb3J5LiBTbyB3ZSBjYW4gbm90IGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlCi0JICAgdG8gdGhlIGRpcmVjdCBpdGVtLiAgSW4gdGhpcyBjYXNlIHdlIHVzZWQgdG8gYWRqdXN0Ci0JICAgaW5kaXJlY3QgaXRlbXMncyBpaF9mcmVlX3NwYWNlLiBOb3cgaWhfZnJlZV9zcGFjZSBpcyBub3QKLQkgICB1c2VkLCBpdCB3b3VsZCBiZSBpZGVhbCB0byB3cml0ZSB6ZXJvcyB0byBjb3JyZXNwb25kaW5nCi0JICAgdW5mb3JtYXR0ZWQgbm9kZS4gRm9yIG5vdyBpX3NpemUgaXMgY29uc2lkZXJlZCBhcyBndWFyZCBmb3IKLQkgICBnb2luZyBvdXQgb2YgZmlsZSBzaXplICovCi0Ja3VubWFwKHBhZ2UpIDsKKwkvKiBtYWtlIHN1cmUgdG8gZ2V0IHRoZSBpX2Jsb2NrcyBjaGFuZ2VzIGZyb20gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKi8KKwlyZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSk7CisKKwkvLyBub3RlOiB3ZSBoYXZlIG5vdyB0aGUgc2FtZSBhcyBpbiBhYm92ZSBkaXJlY3QyaW5kaXJlY3QKKwkvLyBjb252ZXJzaW9uOiB0aGVyZSBhcmUgdHdvIGtleXMgd2hpY2ggaGF2ZSBtYXRjaGluZyBmaXJzdCB0aHJlZQorCS8vIGtleSBjb21wb25lbnRzLiBUaGV5IG9ubHkgZGlmZmVyIGJ5IHRoZSBmb3VodGggb25lLgorCisJLyogV2UgaGF2ZSBpbnNlcnRlZCBuZXcgZGlyZWN0IGl0ZW0gYW5kIG11c3QgcmVtb3ZlIGxhc3QKKwkgICB1bmZvcm1hdHRlZCBub2RlLiAqLworCSpwX2NfbW9kZSA9IE1fQ1VUOworCisJLyogd2Ugc3RvcmUgcG9zaXRpb24gb2YgZmlyc3QgZGlyZWN0IGl0ZW0gaW4gdGhlIGluLWNvcmUgaW5vZGUgKi8KKwkvL21hcmtfZmlsZV93aXRoX3RhaWwgKHBfc19pbm9kZSwgcG9zMSArIDEpOworCVJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IHBvczEgKyAxOworCiAJcmV0dXJuIG5fYmxvY2tfc2l6ZSAtIHJvdW5kX3RhaWxfbGVuOwotICAgIH0KLSAgICBrdW5tYXAocGFnZSkgOwotCi0gICAgLyogbWFrZSBzdXJlIHRvIGdldCB0aGUgaV9ibG9ja3MgY2hhbmdlcyBmcm9tIHJlaXNlcmZzX2luc2VydF9pdGVtICovCi0gICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBwX3NfaW5vZGUpOwotCi0gICAgLy8gbm90ZTogd2UgaGF2ZSBub3cgdGhlIHNhbWUgYXMgaW4gYWJvdmUgZGlyZWN0MmluZGlyZWN0Ci0gICAgLy8gY29udmVyc2lvbjogdGhlcmUgYXJlIHR3byBrZXlzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlyc3QgdGhyZWUKLSAgICAvLyBrZXkgY29tcG9uZW50cy4gVGhleSBvbmx5IGRpZmZlciBieSB0aGUgZm91aHRoIG9uZS4KLQotICAgIC8qIFdlIGhhdmUgaW5zZXJ0ZWQgbmV3IGRpcmVjdCBpdGVtIGFuZCBtdXN0IHJlbW92ZSBsYXN0Ci0gICAgICAgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KLSAgICAqcF9jX21vZGUgPSBNX0NVVDsKLQotICAgIC8qIHdlIHN0b3JlIHBvc2l0aW9uIG9mIGZpcnN0IGRpcmVjdCBpdGVtIGluIHRoZSBpbi1jb3JlIGlub2RlICovCi0gICAgLy9tYXJrX2ZpbGVfd2l0aF90YWlsIChwX3NfaW5vZGUsIHBvczEgKyAxKTsKLSAgICBSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBwb3MxICsgMTsKLQotICAgIHJldHVybiBuX2Jsb2NrX3NpemUgLSByb3VuZF90YWlsX2xlbjsKIH0KLQotCi0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCmluZGV4IDQ1NTgyZmUuLmUzODZkM2QgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHIuYwpAQCAtNTEsNjcgKzUxLDY4IEBACiAjZGVmaW5lIFBSSVZST09UX05BTUUgIi5yZWlzZXJmc19wcml2IgogI2RlZmluZSBYQVJPT1RfTkFNRSAgICJ4YXR0cnMiCiAKLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAoY29uc3QgY2hhciAqcHJlZml4KTsKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChjb25zdCBjaGFyCisJCQkJCQkJCSpwcmVmaXgpOwogCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqCi1jcmVhdGVfeGFfcm9vdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjcmVhdGVfeGFfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotICAgIHN0cnVjdCBkZW50cnkgKnByaXZyb290ID0gZGdldCAoUkVJU0VSRlNfU0Ioc2IpLT5wcml2X3Jvb3QpOwotICAgIHN0cnVjdCBkZW50cnkgKnhhcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpwcml2cm9vdCA9IGRnZXQoUkVJU0VSRlNfU0Ioc2IpLT5wcml2X3Jvb3QpOworCXN0cnVjdCBkZW50cnkgKnhhcm9vdDsKIAotICAgIC8qIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZCBhdCBtb3VudC10aW1lICovCi0gICAgaWYgKCFwcml2cm9vdCkKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworCS8qIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZCBhdCBtb3VudC10aW1lICovCisJaWYgKCFwcml2cm9vdCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwogCi0gICAgeGFyb290ID0gbG9va3VwX29uZV9sZW4gKFhBUk9PVF9OQU1FLCBwcml2cm9vdCwgc3RybGVuIChYQVJPT1RfTkFNRSkpOwotICAgIGlmIChJU19FUlIgKHhhcm9vdCkpIHsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfSBlbHNlIGlmICgheGFyb290LT5kX2lub2RlKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIGRvd24gKCZwcml2cm9vdC0+ZF9pbm9kZS0+aV9zZW0pOwotICAgICAgICBlcnIgPSBwcml2cm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIgKHByaXZyb290LT5kX2lub2RlLCB4YXJvb3QsIDA3MDApOwotICAgICAgICB1cCAoJnByaXZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJeGFyb290ID0gbG9va3VwX29uZV9sZW4oWEFST09UX05BTUUsIHByaXZyb290LCBzdHJsZW4oWEFST09UX05BTUUpKTsKKwlpZiAoSVNfRVJSKHhhcm9vdCkpIHsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmICgheGFyb290LT5kX2lub2RlKSB7CisJCWludCBlcnI7CisJCWRvd24oJnByaXZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJCWVyciA9CisJCSAgICBwcml2cm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIocHJpdnJvb3QtPmRfaW5vZGUsIHhhcm9vdCwKKwkJCQkJCSAgIDA3MDApOworCQl1cCgmcHJpdnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKIAotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBkcHV0ICh4YXJvb3QpOwotICAgICAgICAgICAgZHB1dCAocHJpdnJvb3QpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgUkVJU0VSRlNfU0Ioc2IpLT54YXR0cl9yb290ID0gZGdldCAoeGFyb290KTsKLSAgICB9CisJCWlmIChlcnIpIHsKKwkJCWRwdXQoeGFyb290KTsKKwkJCWRwdXQocHJpdnJvb3QpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJfQorCQlSRUlTRVJGU19TQihzYiktPnhhdHRyX3Jvb3QgPSBkZ2V0KHhhcm9vdCk7CisJfQogCi1vdXQ6Ci0gICAgZHB1dCAocHJpdnJvb3QpOwotICAgIHJldHVybiB4YXJvb3Q7CisgICAgICBvdXQ6CisJZHB1dChwcml2cm9vdCk7CisJcmV0dXJuIHhhcm9vdDsKIH0KIAogLyogVGhpcyB3aWxsIHJldHVybiBhIGRlbnRyeSwgb3IgZXJyb3IsIHJlZmVyaW5nIHRvIHRoZSB4YSByb290IGRpcmVjdG9yeS4KICAqIElmIHRoZSB4YSByb290IGRvZXNuJ3QgZXhpc3QgeWV0LCB0aGUgZGVudHJ5IHdpbGwgYmUgcmV0dXJuZWQgd2l0aG91dAogICogYW4gYXNzb2NpYXRlZCBpbm9kZS4gVGhpcyBkZW50cnkgY2FuIGJlIHVzZWQgd2l0aCAtPm1rZGlyIHRvIGNyZWF0ZQogICogdGhlIHhhIGRpcmVjdG9yeS4gKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKLV9fZ2V0X3hhX3Jvb3QgKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpfX2dldF94YV9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2cm9vdCA9IGRnZXQgKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOwotICAgIHN0cnVjdCBkZW50cnkgKnhhcm9vdCA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqcHJpdnJvb3QgPSBkZ2V0KFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOworCXN0cnVjdCBkZW50cnkgKnhhcm9vdCA9IE5VTEw7CiAKLSAgICBpZiAoSVNfRVJSIChwcml2cm9vdCkgfHwgIXByaXZyb290KQotICAgICAgICByZXR1cm4gcHJpdnJvb3Q7CisJaWYgKElTX0VSUihwcml2cm9vdCkgfHwgIXByaXZyb290KQorCQlyZXR1cm4gcHJpdnJvb3Q7CiAKLSAgICB4YXJvb3QgPSBsb29rdXBfb25lX2xlbiAoWEFST09UX05BTUUsIHByaXZyb290LCBzdHJsZW4gKFhBUk9PVF9OQU1FKSk7Ci0gICAgaWYgKElTX0VSUiAoeGFyb290KSkgewotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCF4YXJvb3QtPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgeGFyb290ID0gTlVMTDsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCXhhcm9vdCA9IGxvb2t1cF9vbmVfbGVuKFhBUk9PVF9OQU1FLCBwcml2cm9vdCwgc3RybGVuKFhBUk9PVF9OQU1FKSk7CisJaWYgKElTX0VSUih4YXJvb3QpKSB7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoIXhhcm9vdC0+ZF9pbm9kZSkgeworCQlkcHV0KHhhcm9vdCk7CisJCXhhcm9vdCA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KIAotICAgIFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290ID0gZGdldCAoeGFyb290KTsKKwlSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCA9IGRnZXQoeGFyb290KTsKIAotb3V0OgotICAgIGRwdXQgKHByaXZyb290KTsKLSAgICByZXR1cm4geGFyb290OworICAgICAgb3V0OgorCWRwdXQocHJpdnJvb3QpOworCXJldHVybiB4YXJvb3Q7CiB9CiAKIC8qIFJldHVybnMgdGhlIGRlbnRyeSAob3IgTlVMTCkgcmVmZXJyaW5nIHRvIHRoZSByb290IG9mIHRoZSBleHRlbmRlZApAQCAtMTE5LDE0NyArMTIwLDE0NSBAQAogICogT3RoZXJ3aXNlLCB3ZSBhdHRlbXB0IHRvIHJldHJlaXZlIGl0IGZyb20gZGlzay4gSXQgbWF5IGFsc28gcmV0dXJuCiAgKiBhIHBvaW50ZXItZW5jb2RlZCBlcnJvci4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICoKLWdldF94YV9yb290IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKmdldF94YV9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBkZ2V0IChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZGdldChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CiAKLSAgICBpZiAoIWRlbnRyeSkKLSAgICAgICAgZGVudHJ5ID0gX19nZXRfeGFfcm9vdCAocyk7CisJaWYgKCFkZW50cnkpCisJCWRlbnRyeSA9IF9fZ2V0X3hhX3Jvb3Qocyk7CiAKLSAgICByZXR1cm4gZGVudHJ5OworCXJldHVybiBkZW50cnk7CiB9CiAKIC8qIE9wZW5zIHRoZSBkaXJlY3RvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgaW5vZGUncyBleHRlbmRlZCBhdHRyaWJ1dGUgc3RvcmUuCiAgKiBJZiBmbGFncyBhbGxvdywgdGhlIHRyZWUgdG8gdGhlIGRpcmVjdG9yeSBtYXkgYmUgY3JlYXRlZC4gSWYgY3JlYXRpb24gaXMKICAqIHByb2hpYml0ZWQsIC1FTk9EQVRBIGlzIHJldHVybmVkLiAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKgotb3Blbl94YV9kaXIgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvcGVuX3hhX2Rpcihjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCiB7Ci0gICAgc3RydWN0IGRlbnRyeSAqeGFyb290LCAqeGFkaXI7Ci0gICAgY2hhciBuYW1lYnVmWzE3XTsKKwlzdHJ1Y3QgZGVudHJ5ICp4YXJvb3QsICp4YWRpcjsKKwljaGFyIG5hbWVidWZbMTddOwogCi0gICAgeGFyb290ID0gZ2V0X3hhX3Jvb3QgKGlub2RlLT5pX3NiKTsKLSAgICBpZiAoSVNfRVJSICh4YXJvb3QpKSB7Ci0gICAgICAgIHJldHVybiB4YXJvb3Q7Ci0gICAgfSBlbHNlIGlmICgheGFyb290KSB7Ci0gICAgICAgIGlmIChmbGFncyA9PSAwIHx8IGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7Ci0gICAgICAgICAgICB4YXJvb3QgPSBjcmVhdGVfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgaWYgKElTX0VSUiAoeGFyb290KSkKLSAgICAgICAgICAgICAgICByZXR1cm4geGFyb290OwotICAgICAgICB9Ci0gICAgICAgIGlmICgheGFyb290KQotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9EQVRBKTsKLSAgICB9CisJeGFyb290ID0gZ2V0X3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCWlmIChJU19FUlIoeGFyb290KSkgeworCQlyZXR1cm4geGFyb290OworCX0gZWxzZSBpZiAoIXhhcm9vdCkgeworCQlpZiAoZmxhZ3MgPT0gMCB8fCBmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJeGFyb290ID0gY3JlYXRlX3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCQkJaWYgKElTX0VSUih4YXJvb3QpKQorCQkJCXJldHVybiB4YXJvb3Q7CisJCX0KKwkJaWYgKCF4YXJvb3QpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJfQogCi0gICAgLyogb2ssIHdlIGhhdmUgeGFyb290IG9wZW4gKi8KKwkvKiBvaywgd2UgaGF2ZSB4YXJvb3Qgb3BlbiAqLwogCi0gICAgc25wcmludGYgKG5hbWVidWYsIHNpemVvZiAobmFtZWJ1ZiksICIlWC4lWCIsCi0gICAgICAgICAgICAgIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQpLAotICAgICAgICAgICAgICBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKLSAgICB4YWRpciA9IGxvb2t1cF9vbmVfbGVuIChuYW1lYnVmLCB4YXJvb3QsIHN0cmxlbiAobmFtZWJ1ZikpOwotICAgIGlmIChJU19FUlIgKHhhZGlyKSkgewotICAgICAgICBkcHV0ICh4YXJvb3QpOwotICAgICAgICByZXR1cm4geGFkaXI7Ci0gICAgfQorCXNucHJpbnRmKG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSwgIiVYLiVYIiwKKwkJIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkKSwKKwkJIGlub2RlLT5pX2dlbmVyYXRpb24pOworCXhhZGlyID0gbG9va3VwX29uZV9sZW4obmFtZWJ1ZiwgeGFyb290LCBzdHJsZW4obmFtZWJ1ZikpOworCWlmIChJU19FUlIoeGFkaXIpKSB7CisJCWRwdXQoeGFyb290KTsKKwkJcmV0dXJuIHhhZGlyOworCX0KIAotICAgIGlmICgheGFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgaWYgKGZsYWdzID09IDAgfHwgZmxhZ3MgJiBYQVRUUl9DUkVBVEUpIHsKLSAgICAgICAgICAgIC8qIEFsdGhvdWdoIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0cnlpbmcgdG8gY3JlYXRlIHRoaXMgZGlyZWN0b3J5LAotICAgICAgICAgICAgICogYW5vdGhlciBkaXJlY3Rvcnkgd2l0aCB0aGUgc2FtZSBoYXNoIG1heSBiZSBjcmVhdGVkLCBzbyB3ZSBuZWVkCi0gICAgICAgICAgICAgKiB0byBwcm90ZWN0IGFnYWluc3QgdGhhdCAqLwotICAgICAgICAgICAgZXJyID0geGFyb290LT5kX2lub2RlLT5pX29wLT5ta2RpciAoeGFyb290LT5kX2lub2RlLCB4YWRpciwgMDcwMCk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgICAgICAgICBkcHV0ICh4YWRpcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF4YWRpci0+ZF9pbm9kZSkgewotICAgICAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgICAgIGRwdXQgKHhhZGlyKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRSICgtRU5PREFUQSk7Ci0gICAgICAgIH0KLSAgICB9CisJaWYgKCF4YWRpci0+ZF9pbm9kZSkgeworCQlpbnQgZXJyOworCQlpZiAoZmxhZ3MgPT0gMCB8fCBmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJLyogQWx0aG91Z2ggdGhlcmUgaXMgbm90aGluZyBlbHNlIHRyeWluZyB0byBjcmVhdGUgdGhpcyBkaXJlY3RvcnksCisJCQkgKiBhbm90aGVyIGRpcmVjdG9yeSB3aXRoIHRoZSBzYW1lIGhhc2ggbWF5IGJlIGNyZWF0ZWQsIHNvIHdlIG5lZWQKKwkJCSAqIHRvIHByb3RlY3QgYWdhaW5zdCB0aGF0ICovCisJCQllcnIgPQorCQkJICAgIHhhcm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIoeGFyb290LT5kX2lub2RlLCB4YWRpciwKKwkJCQkJCQkgMDcwMCk7CisJCQlpZiAoZXJyKSB7CisJCQkJZHB1dCh4YXJvb3QpOworCQkJCWRwdXQoeGFkaXIpOworCQkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCQl9CisJCX0KKwkJaWYgKCF4YWRpci0+ZF9pbm9kZSkgeworCQkJZHB1dCh4YXJvb3QpOworCQkJZHB1dCh4YWRpcik7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJCX0KKwl9CiAKLSAgICBkcHV0ICh4YXJvb3QpOwotICAgIHJldHVybiB4YWRpcjsKKwlkcHV0KHhhcm9vdCk7CisJcmV0dXJuIHhhZGlyOwogfQogCiAvKiBSZXR1cm5zIGEgZGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBleHRlbmRlZCBhdHRyaWJ1dGUgZmlsZQogICogZm9yIHRoZSBpbm9kZS4gSWYgZmxhZ3MgYWxsb3csIHRoZSBmaWxlIGlzIGNyZWF0ZWQuIE90aGVyd2lzZSwgYQogICogdmFsaWQgb3IgbmVnYXRpdmUgZGVudHJ5LCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKLWdldF94YV9maWxlX2RlbnRyeSAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF94YV9maWxlX2RlbnRyeShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQogewotICAgIHN0cnVjdCBkZW50cnkgKnhhZGlyLCAqeGFmaWxlOwotICAgIGludCBlcnIgPSAwOworCXN0cnVjdCBkZW50cnkgKnhhZGlyLCAqeGFmaWxlOworCWludCBlcnIgPSAwOwogCi0gICAgeGFkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSICh4YWRpcikpIHsKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZGlyKSk7Ci0gICAgfSBlbHNlIGlmICh4YWRpciAmJiAheGFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoeGFkaXIpOwotICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwl4YWRpciA9IG9wZW5feGFfZGlyKGlub2RlLCBmbGFncyk7CisJaWYgKElTX0VSUih4YWRpcikpIHsKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUih4YWRpcikpOworCX0gZWxzZSBpZiAoeGFkaXIgJiYgIXhhZGlyLT5kX2lub2RlKSB7CisJCWRwdXQoeGFkaXIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJfQogCi0gICAgeGFmaWxlID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBzdHJsZW4gKG5hbWUpKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKSB7Ci0gICAgICAgIGRwdXQgKHhhZGlyKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZmlsZSkpOwotICAgIH0KKwl4YWZpbGUgPSBsb29rdXBfb25lX2xlbihuYW1lLCB4YWRpciwgc3RybGVuKG5hbWUpKTsKKwlpZiAoSVNfRVJSKHhhZmlsZSkpIHsKKwkJZHB1dCh4YWRpcik7CisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoeGFmaWxlKSk7CisJfQogCi0gICAgaWYgKHhhZmlsZS0+ZF9pbm9kZSkgeyAvKiBmaWxlIGV4aXN0cyAqLwotICAgICAgICBpZiAoZmxhZ3MgJiBYQVRUUl9DUkVBVEUpIHsKLSAgICAgICAgICAgIGVyciA9IC1FRVhJU1Q7Ci0gICAgICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSB8fCBmbGFncyAmIEZMX1JFQURPTkxZKSB7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGlub2RlLT5pX3NlbSBpcyBkb3duLCBzbyBub3RoaW5nIGVsc2UgY2FuIHRyeSB0byBjcmVhdGUKLSAgICAgICAgICogdGhlIHNhbWUgeGF0dHIgKi8KLSAgICAgICAgZXJyID0geGFkaXItPmRfaW5vZGUtPmlfb3AtPmNyZWF0ZSAoeGFkaXItPmRfaW5vZGUsIHhhZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDcwMHxTX0lGUkVHLCBOVUxMKTsKKwlpZiAoeGFmaWxlLT5kX2lub2RlKSB7CS8qIGZpbGUgZXhpc3RzICovCisJCWlmIChmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJZXJyID0gLUVFWElTVDsKKwkJCWRwdXQoeGFmaWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmIChmbGFncyAmIFhBVFRSX1JFUExBQ0UgfHwgZmxhZ3MgJiBGTF9SRUFET05MWSkgeworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQkvKiBpbm9kZS0+aV9zZW0gaXMgZG93biwgc28gbm90aGluZyBlbHNlIGNhbiB0cnkgdG8gY3JlYXRlCisJCSAqIHRoZSBzYW1lIHhhdHRyICovCisJCWVyciA9IHhhZGlyLT5kX2lub2RlLT5pX29wLT5jcmVhdGUoeGFkaXItPmRfaW5vZGUsIHhhZmlsZSwKKwkJCQkJCSAgIDA3MDAgfCBTX0lGUkVHLCBOVUxMKTsKIAotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9CisJCWlmIChlcnIpIHsKKwkJCWRwdXQoeGFmaWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQogCi1vdXQ6Ci0gICAgZHB1dCAoeGFkaXIpOwotICAgIGlmIChlcnIpCi0gICAgICAgIHhhZmlsZSA9IEVSUl9QVFIgKGVycik7Ci0gICAgcmV0dXJuIHhhZmlsZTsKKyAgICAgIG91dDoKKwlkcHV0KHhhZGlyKTsKKwlpZiAoZXJyKQorCQl4YWZpbGUgPSBFUlJfUFRSKGVycik7CisJcmV0dXJuIHhhZmlsZTsKIH0KIAotCiAvKiBPcGVucyBhIGZpbGUgcG9pbnRlciB0byB0aGUgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBpbm9kZSAqLwotc3RhdGljIHN0cnVjdCBmaWxlICoKLW9wZW5feGFfZmlsZSAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBmaWxlICpvcGVuX3hhX2ZpbGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgaW50IGZsYWdzKQogewotICAgIHN0cnVjdCBkZW50cnkgKnhhZmlsZTsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqeGFmaWxlOworCXN0cnVjdCBmaWxlICpmcDsKIAotICAgIHhhZmlsZSA9IGdldF94YV9maWxlX2RlbnRyeSAoaW5vZGUsIG5hbWUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKQotICAgICAgICByZXR1cm4gRVJSX1BUUiAoUFRSX0VSUiAoeGFmaWxlKSk7Ci0gICAgZWxzZSBpZiAoIXhhZmlsZS0+ZF9pbm9kZSkgewotICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwl4YWZpbGUgPSBnZXRfeGFfZmlsZV9kZW50cnkoaW5vZGUsIG5hbWUsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKHhhZmlsZSkpCisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoeGFmaWxlKSk7CisJZWxzZSBpZiAoIXhhZmlsZS0+ZF9pbm9kZSkgeworCQlkcHV0KHhhZmlsZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKKwl9CiAKLSAgICBmcCA9IGRlbnRyeV9vcGVuICh4YWZpbGUsIE5VTEwsIE9fUkRXUik7Ci0gICAgLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworCWZwID0gZGVudHJ5X29wZW4oeGFmaWxlLCBOVUxMLCBPX1JEV1IpOworCS8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KIAotICAgIHJldHVybiBmcDsKKwlyZXR1cm4gZnA7CiB9CiAKLQogLyoKICAqIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGZzL3JlaXNlcmZzL2Rpci5jOnJlaXNlcmZzX3JlYWRkaXIsIGJ1dAogICogd2UgbmVlZCB0byBkcm9wIHRoZSBwYXRoIGJlZm9yZSBjYWxsaW5nIHRoZSBmaWxsZGlyIHN0cnVjdC4gIFRoYXQKQEAgLTI3MywxMzkgKzI3MiwxNDYgQEAKICAqIHdlJ3JlIGNhbGxlZCB3aXRoIGlfc2VtIGhlbGQsIHNvIHRoZXJlIGFyZSBubyB3b3JyaWVzIGFib3V0IHRoZSBkaXJlY3RvcnkKICAqIGNoYW5naW5nIHVuZGVybmVhdGggdXMuCiAgKi8KLXN0YXRpYyBpbnQgX194YXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCitzdGF0aWMgaW50IF9feGF0dHJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0gICAgc3RydWN0IGNwdV9rZXkgcG9zX2tleTsJLyoga2V5IG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeSAoa2V5IG9mIGRpcmVjdG9yeSBlbnRyeSkgKi8KLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fZW50cnkpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIGludCBlbnRyeV9udW07Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCB0bXBfaWg7Ci0gICAgaW50IHNlYXJjaF9yZXM7Ci0gICAgY2hhciAqIGxvY2FsX2J1ZjsKLSAgICBsb2ZmX3QgbmV4dF9wb3M7Ci0gICAgY2hhciBzbWFsbF9idWZbMzJdIDsgLyogYXZvaWQga21hbGxvYyBpZiB3ZSBjYW4gKi8KLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwotICAgIGludCBkX3JlY2xlbjsKLSAgICBjaGFyICogZF9uYW1lOwotICAgIG9mZl90IGRfb2ZmOwotICAgIGlub190IGRfaW5vOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBjcHVfa2V5IHBvc19rZXk7CS8qIGtleSBvZiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkaXJlY3RvcnkgKGtleSBvZiBkaXJlY3RvcnkgZW50cnkpICovCisJSU5JVElBTElaRV9QQVRIKHBhdGhfdG9fZW50cnkpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGVudHJ5X251bTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loOworCWludCBzZWFyY2hfcmVzOworCWNoYXIgKmxvY2FsX2J1ZjsKKwlsb2ZmX3QgbmV4dF9wb3M7CisJY2hhciBzbWFsbF9idWZbMzJdOwkvKiBhdm9pZCBrbWFsbG9jIGlmIHdlIGNhbiAqLworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CisJaW50IGRfcmVjbGVuOworCWNoYXIgKmRfbmFtZTsKKwlvZmZfdCBkX29mZjsKKwlpbm9fdCBkX2lubzsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwogCisJLyogZm9ybSBrZXkgZm9yIHNlYXJjaCB0aGUgbmV4dCBkaXJlY3RvcnkgZW50cnkgdXNpbmcgZl9wb3MgZmllbGQgb2YKKwkgICBmaWxlIHN0cnVjdHVyZSAqLworCW5leHRfcG9zID0gbWF4X3JlaXNlcmZzX29mZnNldChpbm9kZSk7CiAKLSAgICAvKiBmb3JtIGtleSBmb3Igc2VhcmNoIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeSB1c2luZyBmX3BvcyBmaWVsZCBvZgotICAgICAgIGZpbGUgc3RydWN0dXJlICovCi0gICAgbmV4dF9wb3MgPSBtYXhfcmVpc2VyZnNfb2Zmc2V0KGlub2RlKTsKKwl3aGlsZSAoMSkgeworCSAgICAgIHJlc2VhcmNoOgorCQlpZiAobmV4dF9wb3MgPD0gRE9UX0RPVF9PRkZTRVQpCisJCQlicmVhazsKKwkJbWFrZV9jcHVfa2V5KCZwb3Nfa2V5LCBpbm9kZSwgbmV4dF9wb3MsIFRZUEVfRElSRU5UUlksIDMpOwogCi0gICAgd2hpbGUgKDEpIHsKLXJlc2VhcmNoOgotCWlmIChuZXh0X3BvcyA8PSBET1RfRE9UX09GRlNFVCkKLQkgICAgYnJlYWs7Ci0JbWFrZV9jcHVfa2V5ICgmcG9zX2tleSwgaW5vZGUsIG5leHRfcG9zLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkJc2VhcmNoX3JlcyA9CisJCSAgICBzZWFyY2hfYnlfZW50cnlfa2V5KGlub2RlLT5pX3NiLCAmcG9zX2tleSwgJnBhdGhfdG9fZW50cnksCisJCQkJCSZkZSk7CisJCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7CisJCQkvLyBGSVhNRTogd2UgY291bGQganVzdCBza2lwIHBhcnQgb2YgZGlyZWN0b3J5IHdoaWNoIGNvdWxkCisJCQkvLyBub3QgYmUgcmVhZAorCQkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAKLQlzZWFyY2hfcmVzID0gc2VhcmNoX2J5X2VudHJ5X2tleShpbm9kZS0+aV9zYiwgJnBvc19rZXksICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7Ci0JICAgIC8vIEZJWE1FOiB3ZSBjb3VsZCBqdXN0IHNraXAgcGFydCBvZiBkaXJlY3Rvcnkgd2hpY2ggY291bGQKLQkgICAgLy8gbm90IGJlIHJlYWQKLQkgICAgcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKLQkgICAgcmV0dXJuIC1FSU87Ci0JfQorCQlpZiAoc2VhcmNoX3JlcyA9PSBOQU1FX05PVF9GT1VORCkKKwkJCWRlLmRlX2VudHJ5X251bS0tOwogCi0JaWYgKHNlYXJjaF9yZXMgPT0gTkFNRV9OT1RfRk9VTkQpCi0JICAgIGRlLmRlX2VudHJ5X251bS0tOworCQlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbigmZGUpOworCQllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07CisJCWRlaCA9ICYoZGUuZGVfZGVoW2VudHJ5X251bV0pOwogCi0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oJmRlKTsKLQllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07Ci0JZGVoID0gJihkZS5kZV9kZWhbZW50cnlfbnVtXSk7CisJCWJoID0gZGUuZGVfYmg7CisJCWloID0gZGUuZGVfaWg7CiAKLQliaCA9IGRlLmRlX2JoOwotCWloID0gZGUuZGVfaWg7CisJCWlmICghaXNfZGlyZW50cnlfbGVfaWgoaWgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAibm90IGRpcmVudHJ5ICVoIiwgaWgpOworCQkJYnJlYWs7CisJCX0KKwkJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOwogCi0JaWYgKCFpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJub3QgZGlyZW50cnkgJWgiLCBpaCk7Ci0JICAgIGJyZWFrOwotICAgICAgICB9Ci0JY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOworCQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLworCQlSRkFMU0UoQ09NUF9TSE9SVF9LRVlTKCYoaWgtPmloX2tleSksICZwb3Nfa2V5KSwKKwkJICAgICAgICJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKKwkJICAgICAgIGloLCAmcG9zX2tleSk7CiAKLQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLwotCVJGQUxTRSggQ09NUF9TSE9SVF9LRVlTICgmKGloLT5paF9rZXkpLCAmcG9zX2tleSksCi0JCSJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKLQkJaWgsICZwb3Nfa2V5KTsKKwkJaWYgKGRlaF9vZmZzZXQoZGVoKSA8PSBET1RfRE9UX09GRlNFVCkgeworCQkJYnJlYWs7CisJCX0KIAotCWlmIChkZWhfb2Zmc2V0KGRlaCkgPD0gRE9UX0RPVF9PRkZTRVQpIHsKLQkgICAgYnJlYWs7Ci0JfQorCQkvKiBsb29rIGZvciB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAqLworCQluZXh0X3BvcyA9IGRlaF9vZmZzZXQoZGVoKSAtIDE7CiAKLQkvKiBsb29rIGZvciB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAqLwotCW5leHRfcG9zID0gZGVoX29mZnNldCAoZGVoKSAtIDE7CisJCWlmICghZGVfdmlzaWJsZShkZWgpKQorCQkJLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCisJCQljb250aW51ZTsKIAotCWlmICghZGVfdmlzaWJsZSAoZGVoKSkKLQkgICAgLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCi0JICAgIGNvbnRpbnVlOworCQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aChiaCwgaWgsIGVudHJ5X251bSk7CisJCWRfbmFtZSA9IEJfSV9ERUhfRU5UUllfRklMRV9OQU1FKGJoLCBpaCwgZGVoKTsKKwkJZF9vZmYgPSBkZWhfb2Zmc2V0KGRlaCk7CisJCWRfaW5vID0gZGVoX29iamVjdGlkKGRlaCk7CiAKLQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aChiaCwgaWgsIGVudHJ5X251bSk7Ci0JZF9uYW1lID0gQl9JX0RFSF9FTlRSWV9GSUxFX05BTUUgKGJoLCBpaCwgZGVoKTsKLQlkX29mZiA9IGRlaF9vZmZzZXQgKGRlaCk7Ci0JZF9pbm8gPSBkZWhfb2JqZWN0aWQgKGRlaCk7CisJCWlmICghZF9uYW1lW2RfcmVjbGVuIC0gMV0pCisJCQlkX3JlY2xlbiA9IHN0cmxlbihkX25hbWUpOwogCi0JaWYgKCFkX25hbWVbZF9yZWNsZW4gLSAxXSkKLQkgICAgZF9yZWNsZW4gPSBzdHJsZW4gKGRfbmFtZSk7CisJCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKKwkJCS8qIHRvbyBiaWcgdG8gc2VuZCBiYWNrIHRvIFZGUyAqLworCQkJY29udGludWU7CisJCX0KIAotCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpewotCSAgICAvKiB0b28gYmlnIHRvIHNlbmQgYmFjayB0byBWRlMgKi8KLQkgICAgY29udGludWUgOwotCX0KKwkJLyogSWdub3JlIHRoZSAucmVpc2VyZnNfcHJpdiBlbnRyeSAqLworCQlpZiAocmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSAmJgorCQkgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKKwkJICAgIGRlaF9vYmplY3RpZChkZWgpID09CisJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZCisJCQkJKFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+CisJCQkJa19vYmplY3RpZCkpCisJCQljb250aW51ZTsKIAotICAgICAgICAvKiBJZ25vcmUgdGhlIC5yZWlzZXJmc19wcml2IGVudHJ5ICovCi0gICAgICAgIGlmIChyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSAmJgotICAgICAgICAgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKLSAgICAgICAgICAgIGRlaF9vYmplY3RpZCAoZGVoKSA9PSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWShSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPmtfb2JqZWN0aWQpKQotICAgICAgICAgIGNvbnRpbnVlOworCQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKKwkJCWxvY2FsX2J1ZiA9IHNtYWxsX2J1ZjsKKwkJfSBlbHNlIHsKKwkJCWxvY2FsX2J1ZiA9CisJCQkgICAgcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKTsKKwkJCWlmICghbG9jYWxfYnVmKSB7CisJCQkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWlmIChpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgeworCQkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sCisJCQkJCSAgICAgICBpbm9kZS0+aV9zYik7CiAKLQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKLQkgIGxvY2FsX2J1ZiA9IHNtYWxsX2J1ZiA7Ci0JfSBlbHNlIHsKLQkgICAgbG9jYWxfYnVmID0gcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKSA7Ci0JICAgIGlmICghbG9jYWxfYnVmKSB7Ci0JCXBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotCQlyZXR1cm4gLUVOT01FTSA7Ci0JICAgIH0KLQkgICAgaWYgKGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgewotCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOworCQkJCS8qIHNpZ2gsIG11c3QgcmV0cnkuICBEbyB0aGlzIHNhbWUgb2Zmc2V0IGFnYWluICovCisJCQkJbmV4dF9wb3MgPSBkX29mZjsKKwkJCQlnb3RvIHJlc2VhcmNoOworCQkJfQorCQl9CiAKLQkJLyogc2lnaCwgbXVzdCByZXRyeS4gIERvIHRoaXMgc2FtZSBvZmZzZXQgYWdhaW4gKi8KLQkJbmV4dF9wb3MgPSBkX29mZjsKLQkJZ290byByZXNlYXJjaDsKLQkgICAgfQotCX0KKwkJLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5CisJCS8vIGJ1ZmZlciAobG9jYWxfYnVmKSBiZWNhdXNlIGZpbGxkaXIgd2lsbCBibG9jayBpZgorCQkvLyB1c2VyIHNwYWNlIGJ1ZmZlciBpcyBzd2FwcGVkIG91dC4gQXQgdGhhdCB0aW1lCisJCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCisJCW1lbWNweShsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOwogCi0JLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5Ci0JLy8gYnVmZmVyIChsb2NhbF9idWYpIGJlY2F1c2UgZmlsbGRpciB3aWxsIGJsb2NrIGlmCi0JLy8gdXNlciBzcGFjZSBidWZmZXIgaXMgc3dhcHBlZCBvdXQuIEF0IHRoYXQgdGltZQotCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCi0JbWVtY3B5IChsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOworCQkvKiB0aGUgZmlsbGRpciBmdW5jdGlvbiBtaWdodCBuZWVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9ucywKKwkJICogb3IgZG8gd2hvIGtub3dzIHdoYXQuICBSZWxlYXNlIHRoZSBwYXRoIG5vdyB0aGF0IHdlJ3ZlCisJCSAqIGNvcGllZCBhbGwgdGhlIGltcG9ydGFudCBzdHVmZiBvdXQgb2YgdGhlIGRlaAorCQkgKi8KKwkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKIAotCS8qIHRoZSBmaWxsZGlyIGZ1bmN0aW9uIG1pZ2h0IG5lZWQgdG8gc3RhcnQgdHJhbnNhY3Rpb25zLAotCSAqIG9yIGRvIHdobyBrbm93cyB3aGF0LiAgUmVsZWFzZSB0aGUgcGF0aCBub3cgdGhhdCB3ZSd2ZQotCSAqIGNvcGllZCBhbGwgdGhlIGltcG9ydGFudCBzdHVmZiBvdXQgb2YgdGhlIGRlaAotCSAqLwotCXBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOworCQlpZiAoZmlsbGRpcihkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKKwkJCSAgICBEVF9VTktOT1dOKSA8IDApIHsKKwkJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwKKwkJCQkJICAgICAgIGlub2RlLT5pX3NiKTsKKwkJCX0KKwkJCWdvdG8gZW5kOworCQl9CisJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYik7CisJCX0KKwl9CQkJLyogd2hpbGUgKi8KIAotCWlmIChmaWxsZGlyIChkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKLQkJICAgICBEVF9VTktOT1dOKSA8IDApIHsKLQkgICAgaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKLQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKLQkgICAgfQotCSAgICBnb3RvIGVuZDsKLQl9Ci0JaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKLQkgICAgcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKLQl9Ci0gICAgfSAvKiB3aGlsZSAqLwotCi1lbmQ6Ci0gICAgcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7Ci0gICAgcmV0dXJuIDA7CisgICAgICBlbmQ6CisJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQxNyw2MyArNDIzLDU5IEBACiBzdGF0aWMKIGludCB4YXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBmaWxsZGlyX3QgZmlsbGVyLCB2b2lkICpidWYpCiB7Ci0gICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICAgICAgaW50IHJlcyA9IC1FTk9URElSOwotICAgICAgICBpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPnJlYWRkaXIpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIGRvd24oJmlub2RlLT5pX3NlbSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCByZXMgPSAtRU5PVERJUjsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPnJlYWRkaXIpCisJCWdvdG8gb3V0OworCWRvd24oJmlub2RlLT5pX3NlbSk7CiAvLyAgICAgICAgZG93bigmaW5vZGUtPmlfem9tYmllKTsKLSAgICAgICAgcmVzID0gLUVOT0VOVDsKLSAgICAgICAgaWYgKCFJU19ERUFERElSKGlub2RlKSkgewotICAgICAgICAgICAgICAgIGxvY2tfa2VybmVsKCk7Ci0gICAgICAgICAgICAgICAgcmVzID0gX194YXR0cl9yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKLSAgICAgICAgICAgICAgICB1bmxvY2tfa2VybmVsKCk7Ci0gICAgICAgIH0KKwlyZXMgPSAtRU5PRU5UOworCWlmICghSVNfREVBRERJUihpbm9kZSkpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJcmVzID0gX194YXR0cl9yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KIC8vICAgICAgICB1cCgmaW5vZGUtPmlfem9tYmllKTsKLSAgICAgICAgdXAoJmlub2RlLT5pX3NlbSk7Ci1vdXQ6Ci0gICAgICAgIHJldHVybiByZXM7CisJdXAoJmlub2RlLT5pX3NlbSk7CisgICAgICBvdXQ6CisJcmV0dXJuIHJlczsKIH0KIAotCiAvKiBJbnRlcm5hbCBvcGVyYXRpb25zIG9uIGZpbGUgZGF0YSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLSAgICAgICAga3VubWFwKHBhZ2UpOwotICAgICAgICBwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICoKLXJlaXNlcmZzX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgc3RydWN0IHBhZ2UgKnJlaXNlcmZzX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0gICAgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGlyLT5pX21hcHBpbmc7Ci0gICAgICAgIHN0cnVjdCBwYWdlICpwYWdlOwotICAgICAgICAvKiBXZSBjYW4gZGVhZGxvY2sgaWYgd2UgdHJ5IHRvIGZyZWUgZGVudHJpZXMsCi0gICAgICAgICAgIGFuZCBhbiB1bmxpbmsvcm1kaXIgaGFzIGp1c3Qgb2NjdXJlZCAtIEdGUF9OT0ZTIGF2b2lkcyB0aGlzICovCi0gICAgICAgIG1hcHBpbmctPmZsYWdzID0gKG1hcHBpbmctPmZsYWdzICYgfl9fR0ZQX0JJVFNfTUFTSykgfCBHRlBfTk9GUzsKLSAgICAgICAgcGFnZSA9IHJlYWRfY2FjaGVfcGFnZSAobWFwcGluZywgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOwotICAgICAgICBpZiAoIUlTX0VSUihwYWdlKSkgewotICAgICAgICAgICAgICAgIHdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7Ci0gICAgICAgICAgICAgICAga21hcChwYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCS8qIFdlIGNhbiBkZWFkbG9jayBpZiB3ZSB0cnkgdG8gZnJlZSBkZW50cmllcywKKwkgICBhbmQgYW4gdW5saW5rL3JtZGlyIGhhcyBqdXN0IG9jY3VyZWQgLSBHRlBfTk9GUyBhdm9pZHMgdGhpcyAqLworCW1hcHBpbmctPmZsYWdzID0gKG1hcHBpbmctPmZsYWdzICYgfl9fR0ZQX0JJVFNfTUFTSykgfCBHRlBfTk9GUzsKKwlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCisJCQkgICAgICAgKGZpbGxlcl90ICopIG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJa21hcChwYWdlKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlnb3RvIGZhaWw7CiAKLSAgICAgICAgICAgICAgICBpZiAoUGFnZUVycm9yKHBhZ2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWdlOworCQlpZiAoUGFnZUVycm9yKHBhZ2UpKQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gcGFnZTsKIAotZmFpbDoKLSAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UocGFnZSk7Ci0gICAgICAgIHJldHVybiBFUlJfUFRSKC1FSU8pOworICAgICAgZmFpbDoKKwlyZWlzZXJmc19wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIH0KIAotc3RhdGljIGlubGluZSBfX3UzMgoteGF0dHJfaGFzaCAoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3UzMiB4YXR0cl9oYXNoKGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbikKIHsKLSAgICByZXR1cm4gY3N1bV9wYXJ0aWFsIChtc2csIGxlbiwgMCk7CisJcmV0dXJuIGNzdW1fcGFydGlhbChtc2csIGxlbiwgMCk7CiB9CiAKIC8qIEdlbmVyaWMgZXh0ZW5kZWQgYXR0cmlidXRlIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSB4YSBwbHVnaW5zICovCkBAIC00ODIsMjk0ICs0ODQsMzAwIEBACiAgKiBpbm9kZS0+aV9zZW06IGRvd24KICAqLwogaW50Ci1yZWlzZXJmc194YXR0cl9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBpbnQgZmxhZ3MpCityZWlzZXJmc194YXR0cl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorCQkgICBzaXplX3QgYnVmZmVyX3NpemUsIGludCBmbGFncykKIHsKLSAgICBpbnQgZXJyID0gMDsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IHBhZ2UgKnBhZ2U7Ci0gICAgY2hhciAqZGF0YTsKLSAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLSAgICBzaXplX3QgZmlsZV9wb3MgPSAwOwotICAgIHNpemVfdCBidWZmZXJfcG9zID0gMDsKLSAgICBzdHJ1Y3QgaW5vZGUgKnhpbm9kZTsKLSAgICBzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7Ci0gICAgX191MzIgeGFoYXNoID0gMDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJY2hhciAqZGF0YTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzaXplX3QgZmlsZV9wb3MgPSAwOworCXNpemVfdCBidWZmZXJfcG9zID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKnhpbm9kZTsKKwlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisJX191MzIgeGFoYXNoID0gMDsKIAotICAgIGlmIChJU19SRE9OTFkgKGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUk9GUzsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKIAotICAgIGlmIChJU19JTU1VVEFCTEUgKGlub2RlKSB8fCBJU19BUFBFTkQgKGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQotICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIC8qIEVtcHR5IHhhdHRycyBhcmUgb2ssIHRoZXkncmUganVzdCBlbXB0eSBmaWxlcywgbm8gaGFzaCAqLwotICAgIGlmIChidWZmZXIgJiYgYnVmZmVyX3NpemUpCi0gICAgICAgIHhhaGFzaCA9IHhhdHRyX2hhc2ggKGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCS8qIEVtcHR5IHhhdHRycyBhcmUgb2ssIHRoZXkncmUganVzdCBlbXB0eSBmaWxlcywgbm8gaGFzaCAqLworCWlmIChidWZmZXIgJiYgYnVmZmVyX3NpemUpCisJCXhhaGFzaCA9IHhhdHRyX2hhc2goYnVmZmVyLCBidWZmZXJfc2l6ZSk7CiAKLW9wZW5fZmlsZToKLSAgICBmcCA9IG9wZW5feGFfZmlsZSAoaW5vZGUsIG5hbWUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSIChmcCkpIHsKLSAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICB4aW5vZGUgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9oYXNfeGF0dHJfZGlyOwotCi0gICAgLyogd2UgbmVlZCB0byBjb3B5IGl0IG9mZi4uICovCi0gICAgaWYgKHhpbm9kZS0+aV9ubGluayA+IDEpIHsKLQlmcHV0KGZwKTsKLSAgICAgICAgZXJyID0gcmVpc2VyZnNfeGF0dHJfZGVsIChpbm9kZSwgbmFtZSk7Ci0gICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIC8qIFdlIGp1c3Qga2lsbGVkIHRoZSBvbGQgb25lLCB3ZSdyZSBub3QgcmVwbGFjaW5nIGFueW1vcmUgKi8KLSAgICAgICAgaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKLSAgICAgICAgICAgIGZsYWdzICY9IH5YQVRUUl9SRVBMQUNFOwotICAgICAgICBnb3RvIG9wZW5fZmlsZTsKLSAgICB9Ci0KLSAgICAvKiBSZXNpemUgaXQgc28gd2UncmUgb2sgdG8gd3JpdGUgdGhlcmUgKi8KLSAgICBuZXdhdHRycy5pYV9zaXplID0gYnVmZmVyX3NpemU7Ci0gICAgbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX1NJWkUgfCBBVFRSX0NUSU1FOwotICAgIGRvd24gKCZ4aW5vZGUtPmlfc2VtKTsKLSAgICBlcnIgPSBub3RpZnlfY2hhbmdlKGZwLT5mX2RlbnRyeSwgJm5ld2F0dHJzKTsKLSAgICBpZiAoZXJyKQotICAgICAgICBnb3RvIG91dF9maWxwOwotCi0gICAgbWFwcGluZyA9IHhpbm9kZS0+aV9tYXBwaW5nOwotICAgIHdoaWxlIChidWZmZXJfcG9zIDwgYnVmZmVyX3NpemUgfHwgYnVmZmVyX3BvcyA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBjaHVuazsKLSAgICAgICAgc2l6ZV90IHNraXAgPSAwOwotICAgICAgICBzaXplX3QgcGFnZV9vZmZzZXQgPSAoZmlsZV9wb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwotICAgICAgICBpZiAoYnVmZmVyX3NpemUgLSBidWZmZXJfcG9zID4gUEFHRV9DQUNIRV9TSVpFKQotICAgICAgICAgICAgY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNodW5rID0gYnVmZmVyX3NpemUgLSBidWZmZXJfcG9zOwotCi0gICAgICAgIHBhZ2UgPSByZWlzZXJmc19nZXRfcGFnZSAoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKLSAgICAgICAgaWYgKElTX0VSUiAocGFnZSkpIHsKLSAgICAgICAgICAgIGVyciA9IFBUUl9FUlIgKHBhZ2UpOwotICAgICAgICAgICAgZ290byBvdXRfZmlscDsKLSAgICAgICAgfQotCi0gICAgICAgIGxvY2tfcGFnZSAocGFnZSk7Ci0gICAgICAgIGRhdGEgPSBwYWdlX2FkZHJlc3MgKHBhZ2UpOwotCi0gICAgICAgIGlmIChmaWxlX3BvcyA9PSAwKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICpyeGg7Ci0gICAgICAgICAgICBza2lwID0gZmlsZV9wb3MgPSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOwotICAgICAgICAgICAgaWYgKGNodW5rICsgc2tpcCA+IFBBR0VfQ0FDSEVfU0laRSkKLSAgICAgICAgICAgICAgICBjaHVuayA9IFBBR0VfQ0FDSEVfU0laRSAtIHNraXA7Ci0gICAgICAgICAgICByeGggPSAoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlciAqKWRhdGE7Ci0gICAgICAgICAgICByeGgtPmhfbWFnaWMgPSBjcHVfdG9fbGUzMiAoUkVJU0VSRlNfWEFUVFJfTUFHSUMpOwotICAgICAgICAgICAgcnhoLT5oX2hhc2ggPSBjcHVfdG9fbGUzMiAoeGFoYXNoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlIChmcCwgcGFnZSwgcGFnZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX29mZnNldCArIGNodW5rICsgc2tpcCk7Ci0gICAgICAgIGlmICghZXJyKSB7Ci0JICAgIGlmIChidWZmZXIpCi0JCW1lbWNweSAoZGF0YSArIHNraXAsIGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIGNodW5rKTsKLSAgICAgICAgICAgIGVyciA9IG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUgKGZwLCBwYWdlLCBwYWdlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfb2Zmc2V0ICsgY2h1bmsgKyBza2lwKTsKKyAgICAgIG9wZW5fZmlsZToKKwlmcCA9IG9wZW5feGFfZmlsZShpbm9kZSwgbmFtZSwgZmxhZ3MpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQlnb3RvIG91dDsKIAl9Ci0gICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKLSAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UgKHBhZ2UpOwotICAgICAgICBidWZmZXJfcG9zICs9IGNodW5rOwotICAgICAgICBmaWxlX3BvcyArPSBjaHVuazsKLSAgICAgICAgc2tpcCA9IDA7Ci0gICAgICAgIGlmIChlcnIgfHwgYnVmZmVyX3NpemUgPT0gMCB8fCAhYnVmZmVyKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQogCi0gICAgLyogV2UgY2FuJ3QgbWFyayB0aGUgaW5vZGUgZGlydHkgaWYgaXQncyBub3QgaGFzaGVkLiBUaGlzIGlzIHRoZSBjYXNlCi0gICAgICogd2hlbiB3ZSdyZSBpbmhlcml0aW5nIHRoZSBkZWZhdWx0IEFDTC4gSWYgd2UgZGlydHkgaXQsIHRoZSBpbm9kZQotICAgICAqIGdldHMgbWFya2VkIGRpcnR5LCBidXQgd29uJ3QgKGV2ZXIpIG1ha2UgaXQgb250byB0aGUgZGlydHkgbGlzdCB1bnRpbAotICAgICAqIGl0J3Mgc3luY2VkIGV4cGxpY2l0bHkgdG8gY2xlYXIgSV9ESVJUWS4gVGhpcyBpcyBiYWQuICovCi0gICAgaWYgKCFobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpIHsKLSAgICAgICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgICAgICBtYXJrX2lub2RlX2RpcnR5IChpbm9kZSk7Ci0gICAgfQorCXhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLW91dF9maWxwOgotICAgIHVwICgmeGlub2RlLT5pX3NlbSk7Ci0gICAgZnB1dChmcCk7CisJLyogd2UgbmVlZCB0byBjb3B5IGl0IG9mZi4uICovCisJaWYgKHhpbm9kZS0+aV9ubGluayA+IDEpIHsKKwkJZnB1dChmcCk7CisJCWVyciA9IHJlaXNlcmZzX3hhdHRyX2RlbChpbm9kZSwgbmFtZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJCS8qIFdlIGp1c3Qga2lsbGVkIHRoZSBvbGQgb25lLCB3ZSdyZSBub3QgcmVwbGFjaW5nIGFueW1vcmUgKi8KKwkJaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKKwkJCWZsYWdzICY9IH5YQVRUUl9SRVBMQUNFOworCQlnb3RvIG9wZW5fZmlsZTsKKwl9CiAKLW91dDoKLSAgICByZXR1cm4gZXJyOworCS8qIFJlc2l6ZSBpdCBzbyB3ZSdyZSBvayB0byB3cml0ZSB0aGVyZSAqLworCW5ld2F0dHJzLmlhX3NpemUgPSBidWZmZXJfc2l6ZTsKKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7CisJZG93bigmeGlub2RlLT5pX3NlbSk7CisJZXJyID0gbm90aWZ5X2NoYW5nZShmcC0+Zl9kZW50cnksICZuZXdhdHRycyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmlscDsKKworCW1hcHBpbmcgPSB4aW5vZGUtPmlfbWFwcGluZzsKKwl3aGlsZSAoYnVmZmVyX3BvcyA8IGJ1ZmZlcl9zaXplIHx8IGJ1ZmZlcl9wb3MgPT0gMCkgeworCQlzaXplX3QgY2h1bms7CisJCXNpemVfdCBza2lwID0gMDsKKwkJc2l6ZV90IHBhZ2Vfb2Zmc2V0ID0gKGZpbGVfcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKwkJaWYgKGJ1ZmZlcl9zaXplIC0gYnVmZmVyX3BvcyA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJCWNodW5rID0gUEFHRV9DQUNIRV9TSVpFOworCQllbHNlCisJCQljaHVuayA9IGJ1ZmZlcl9zaXplIC0gYnVmZmVyX3BvczsKKworCQlwYWdlID0gcmVpc2VyZnNfZ2V0X3BhZ2UoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0X2ZpbHA7CisJCX0KKworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWRhdGEgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwkJaWYgKGZpbGVfcG9zID09IDApIHsKKwkJCXN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKnJ4aDsKKwkJCXNraXAgPSBmaWxlX3BvcyA9IHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKwkJCWlmIChjaHVuayArIHNraXAgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCQkJY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkUgLSBza2lwOworCQkJcnhoID0gKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKilkYXRhOworCQkJcnhoLT5oX21hZ2ljID0gY3B1X3RvX2xlMzIoUkVJU0VSRlNfWEFUVFJfTUFHSUMpOworCQkJcnhoLT5oX2hhc2ggPSBjcHVfdG9fbGUzMih4YWhhc2gpOworCQl9CisKKwkJZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoZnAsIHBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkJICAgIHBhZ2Vfb2Zmc2V0ICsgY2h1bmsgKyBza2lwKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWlmIChidWZmZXIpCisJCQkJbWVtY3B5KGRhdGEgKyBza2lwLCBidWZmZXIgKyBidWZmZXJfcG9zLCBjaHVuayk7CisJCQllcnIgPQorCQkJICAgIG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoZnAsIHBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkJCSBwYWdlX29mZnNldCArIGNodW5rICsKKwkJCQkJCQkgc2tpcCk7CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJlaXNlcmZzX3B1dF9wYWdlKHBhZ2UpOworCQlidWZmZXJfcG9zICs9IGNodW5rOworCQlmaWxlX3BvcyArPSBjaHVuazsKKwkJc2tpcCA9IDA7CisJCWlmIChlcnIgfHwgYnVmZmVyX3NpemUgPT0gMCB8fCAhYnVmZmVyKQorCQkJYnJlYWs7CisJfQorCisJLyogV2UgY2FuJ3QgbWFyayB0aGUgaW5vZGUgZGlydHkgaWYgaXQncyBub3QgaGFzaGVkLiBUaGlzIGlzIHRoZSBjYXNlCisJICogd2hlbiB3ZSdyZSBpbmhlcml0aW5nIHRoZSBkZWZhdWx0IEFDTC4gSWYgd2UgZGlydHkgaXQsIHRoZSBpbm9kZQorCSAqIGdldHMgbWFya2VkIGRpcnR5LCBidXQgd29uJ3QgKGV2ZXIpIG1ha2UgaXQgb250byB0aGUgZGlydHkgbGlzdCB1bnRpbAorCSAqIGl0J3Mgc3luY2VkIGV4cGxpY2l0bHkgdG8gY2xlYXIgSV9ESVJUWS4gVGhpcyBpcyBiYWQuICovCisJaWYgKCFobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpIHsKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisKKyAgICAgIG91dF9maWxwOgorCXVwKCZ4aW5vZGUtPmlfc2VtKTsKKwlmcHV0KGZwKTsKKworICAgICAgb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIC8qCiAgKiBpbm9kZS0+aV9zZW06IGRvd24KICAqLwogaW50Ci1yZWlzZXJmc194YXR0cl9nZXQgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQorcmVpc2VyZnNfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQogewotICAgIHNzaXplX3QgZXJyID0gMDsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc2l6ZV90IGlzaXplOwotICAgIHNpemVfdCBmaWxlX3BvcyA9IDA7Ci0gICAgc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwOwotICAgIHN0cnVjdCBwYWdlICpwYWdlOwotICAgIHN0cnVjdCBpbm9kZSAqeGlub2RlOwotICAgIF9fdTMyIGhhc2ggPSAwOworCXNzaXplX3QgZXJyID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc2l6ZV90IGlzaXplOworCXNpemVfdCBmaWxlX3BvcyA9IDA7CisJc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBpbm9kZSAqeGlub2RlOworCV9fdTMyIGhhc2ggPSAwOwogCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAvKiBXZSBjYW4ndCBoYXZlIHhhdHRycyBhdHRhY2hlZCB0byB2MSBpdGVtcyBzaW5jZSB0aGV5IGRvbid0IGhhdmUKLSAgICAgKiBnZW5lcmF0aW9uIG51bWJlcnMgKi8KLSAgICBpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwkvKiBXZSBjYW4ndCBoYXZlIHhhdHRycyBhdHRhY2hlZCB0byB2MSBpdGVtcyBzaW5jZSB0aGV5IGRvbid0IGhhdmUKKwkgKiBnZW5lcmF0aW9uIG51bWJlcnMgKi8KKwlpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgZnAgPSBvcGVuX3hhX2ZpbGUgKGlub2RlLCBuYW1lLCBGTF9SRUFET05MWSk7Ci0gICAgaWYgKElTX0VSUiAoZnApKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGZwKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gb3Blbl94YV9maWxlKGlub2RlLCBuYW1lLCBGTF9SRUFET05MWSk7CisJaWYgKElTX0VSUihmcCkpIHsKKwkJZXJyID0gUFRSX0VSUihmcCk7CisJCWdvdG8gb3V0OworCX0KIAotICAgIHhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICBpc2l6ZSA9IHhpbm9kZS0+aV9zaXplOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaGFzX3hhdHRyX2RpcjsKKwl4aW5vZGUgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaXNpemUgPSB4aW5vZGUtPmlfc2l6ZTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLSAgICAvKiBKdXN0IHJldHVybiB0aGUgc2l6ZSBuZWVkZWQgKi8KLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOwotICAgICAgICBnb3RvIG91dF9kcHV0OwotICAgIH0KKwkvKiBKdXN0IHJldHVybiB0aGUgc2l6ZSBuZWVkZWQgKi8KKwlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJZXJyID0gaXNpemUgLSBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlcik7CisJCWdvdG8gb3V0X2RwdXQ7CisJfQogCi0gICAgaWYgKGJ1ZmZlcl9zaXplIDwgaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSB7Ci0gICAgICAgIGVyciA9IC1FUkFOR0U7Ci0gICAgICAgIGdvdG8gb3V0X2RwdXQ7Ci0gICAgfQorCWlmIChidWZmZXJfc2l6ZSA8IGlzaXplIC0gc2l6ZW9mKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSB7CisJCWVyciA9IC1FUkFOR0U7CisJCWdvdG8gb3V0X2RwdXQ7CisJfQogCi0gICAgd2hpbGUgKGZpbGVfcG9zIDwgaXNpemUpIHsKLSAgICAgICAgc2l6ZV90IGNodW5rOwotICAgICAgICBjaGFyICpkYXRhOwotICAgICAgICBzaXplX3Qgc2tpcCA9IDA7Ci0gICAgICAgIGlmIChpc2l6ZSAtIGZpbGVfcG9zID4gUEFHRV9DQUNIRV9TSVpFKQotICAgICAgICAgICAgY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNodW5rID0gaXNpemUgLSBmaWxlX3BvczsKKwl3aGlsZSAoZmlsZV9wb3MgPCBpc2l6ZSkgeworCQlzaXplX3QgY2h1bms7CisJCWNoYXIgKmRhdGE7CisJCXNpemVfdCBza2lwID0gMDsKKwkJaWYgKGlzaXplIC0gZmlsZV9wb3MgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCQljaHVuayA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJZWxzZQorCQkJY2h1bmsgPSBpc2l6ZSAtIGZpbGVfcG9zOwogCi0gICAgICAgIHBhZ2UgPSByZWlzZXJmc19nZXRfcGFnZSAoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKLSAgICAgICAgaWYgKElTX0VSUiAocGFnZSkpIHsKLSAgICAgICAgICAgIGVyciA9IFBUUl9FUlIgKHBhZ2UpOwotICAgICAgICAgICAgZ290byBvdXRfZHB1dDsKLSAgICAgICAgfQorCQlwYWdlID0gcmVpc2VyZnNfZ2V0X3BhZ2UoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0X2RwdXQ7CisJCX0KIAotICAgICAgICBsb2NrX3BhZ2UgKHBhZ2UpOwotICAgICAgICBkYXRhID0gcGFnZV9hZGRyZXNzIChwYWdlKTsKLSAgICAgICAgaWYgKGZpbGVfcG9zID09IDApIHsKLSAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKnJ4aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKilkYXRhOwotICAgICAgICAgICAgc2tpcCA9IGZpbGVfcG9zID0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKLSAgICAgICAgICAgIGNodW5rIC09IHNraXA7Ci0gICAgICAgICAgICAvKiBNYWdpYyBkb2Vzbid0IG1hdGNoIHVwLi4gKi8KLSAgICAgICAgICAgIGlmIChyeGgtPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIgKFJFSVNFUkZTX1hBVFRSX01BR0lDKSkgewotICAgICAgICAgICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKLSAgICAgICAgICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJJbnZhbGlkIG1hZ2ljIGZvciB4YXR0ciAoJXMpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzb2NpYXRlZCB3aXRoICVrIiwgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTk9ERV9QS0VZIChpbm9kZSkpOwotICAgICAgICAgICAgICAgIGVyciA9IC1FSU87Ci0gICAgICAgICAgICAgICAgZ290byBvdXRfZHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhc2ggPSBsZTMyX3RvX2NwdSAocnhoLT5oX2hhc2gpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSAoYnVmZmVyICsgYnVmZmVyX3BvcywgZGF0YSArIHNraXAsIGNodW5rKTsKLSAgICAgICAgdW5sb2NrX3BhZ2UgKHBhZ2UpOwotICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7Ci0gICAgICAgIGZpbGVfcG9zICs9IGNodW5rOwotICAgICAgICBidWZmZXJfcG9zICs9IGNodW5rOwotICAgICAgICBza2lwID0gMDsKLSAgICB9Ci0gICAgZXJyID0gaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWRhdGEgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWlmIChmaWxlX3BvcyA9PSAwKSB7CisJCQlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICpyeGggPQorCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICopZGF0YTsKKwkJCXNraXAgPSBmaWxlX3BvcyA9IHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKwkJCWNodW5rIC09IHNraXA7CisJCQkvKiBNYWdpYyBkb2Vzbid0IG1hdGNoIHVwLi4gKi8KKwkJCWlmIChyeGgtPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoUkVJU0VSRlNfWEFUVFJfTUFHSUMpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcmVpc2VyZnNfcHV0X3BhZ2UocGFnZSk7CisJCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJCSAiSW52YWxpZCBtYWdpYyBmb3IgeGF0dHIgKCVzKSAiCisJCQkJCQkgImFzc29jaWF0ZWQgd2l0aCAlayIsIG5hbWUsCisJCQkJCQkgSU5PREVfUEtFWShpbm9kZSkpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBvdXRfZHB1dDsKKwkJCX0KKwkJCWhhc2ggPSBsZTMyX3RvX2NwdShyeGgtPmhfaGFzaCk7CisJCX0KKwkJbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIGRhdGEgKyBza2lwLCBjaHVuayk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZWlzZXJmc19wdXRfcGFnZShwYWdlKTsKKwkJZmlsZV9wb3MgKz0gY2h1bms7CisJCWJ1ZmZlcl9wb3MgKz0gY2h1bms7CisJCXNraXAgPSAwOworCX0KKwllcnIgPSBpc2l6ZSAtIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKIAotICAgIGlmICh4YXR0cl9oYXNoIChidWZmZXIsIGlzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKSkgIT0gaGFzaCkgewotICAgICAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIkludmFsaWQgaGFzaCBmb3IgeGF0dHIgKCVzKSBhc3NvY2lhdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggJWsiLCBuYW1lLCBJTk9ERV9QS0VZIChpbm9kZSkpOwotICAgICAgICBlcnIgPSAtRUlPOwotICAgIH0KKwlpZiAoeGF0dHJfaGFzaChidWZmZXIsIGlzaXplIC0gc2l6ZW9mKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSAhPQorCSAgICBoYXNoKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJJbnZhbGlkIGhhc2ggZm9yIHhhdHRyICglcykgYXNzb2NpYXRlZCAiCisJCQkJICJ3aXRoICVrIiwgbmFtZSwgSU5PREVfUEtFWShpbm9kZSkpOworCQllcnIgPSAtRUlPOworCX0KIAotb3V0X2RwdXQ6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZHB1dDoKKwlmcHV0KGZwKTsKIAotb3V0OgotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAotX19yZWlzZXJmc194YXR0cl9kZWwgKHN0cnVjdCBkZW50cnkgKnhhZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK19fcmVpc2VyZnNfeGF0dHJfZGVsKHN0cnVjdCBkZW50cnkgKnhhZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0gICAgc3RydWN0IGlub2RlICpkaXIgPSB4YWRpci0+ZF9pbm9kZTsKLSAgICBpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICpkaXIgPSB4YWRpci0+ZF9pbm9kZTsKKwlpbnQgZXJyID0gMDsKIAotICAgIGRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuIChuYW1lLCB4YWRpciwgbmFtZWxlbik7Ci0gICAgaWYgKElTX0VSUiAoZGVudHJ5KSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChkZW50cnkpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKLSAgICAgICAgZXJyID0gLUVOT0RBVEE7Ci0gICAgICAgIGdvdG8gb3V0X2ZpbGU7Ci0gICAgfQorCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIHhhZGlyLCBuYW1lbGVuKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJZXJyID0gUFRSX0VSUihkZW50cnkpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKwkJZXJyID0gLUVOT0RBVEE7CisJCWdvdG8gb3V0X2ZpbGU7CisJfQogCi0gICAgLyogU2tpcCBkaXJlY3Rvcmllcy4uICovCi0gICAgaWYgKFNfSVNESVIgKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKLSAgICAgICAgZ290byBvdXRfZmlsZTsKKwkvKiBTa2lwIGRpcmVjdG9yaWVzLi4gKi8KKwlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0X2ZpbGU7CiAKLSAgICBpZiAoIWlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkZW50cnktPmRfaW5vZGUpKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgIk9JRCAlMDh4IFslLipzLyUuKnNdIGRvZXNuJ3QgaGF2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXYgZmxhZyBzZXQgW3BhcmVudCBpcyAlc3NldF0uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChkZW50cnktPmRfaW5vZGUpLT5rX29iamVjdGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhhZGlyLT5kX25hbWUubGVuLCB4YWRpci0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4sIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc19yZWlzZXJmc19wcml2X29iamVjdCAoeGFkaXItPmRfaW5vZGUpID8gIiIgOiAibm90ICIpOwotICAgICAgICBkcHV0IChkZW50cnkpOwotICAgICAgICByZXR1cm4gLUVJTzsKLSAgICB9CisJaWYgKCFpc19yZWlzZXJmc19wcml2X29iamVjdChkZW50cnktPmRfaW5vZGUpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoZGlyLT5pX3NiLCAiT0lEICUwOHggWyUuKnMvJS4qc10gZG9lc24ndCBoYXZlICIKKwkJCQkgInByaXYgZmxhZyBzZXQgW3BhcmVudCBpcyAlc3NldF0uIiwKKwkJCQkgbGUzMl90b19jcHUoSU5PREVfUEtFWShkZW50cnktPmRfaW5vZGUpLT4KKwkJCQkJICAgICBrX29iamVjdGlkKSwgeGFkaXItPmRfbmFtZS5sZW4sCisJCQkJIHhhZGlyLT5kX25hbWUubmFtZSwgbmFtZWxlbiwgbmFtZSwKKwkJCQkgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoeGFkaXItPgorCQkJCQkJCSBkX2lub2RlKSA/ICIiIDoKKwkJCQkgIm5vdCAiKTsKKwkJZHB1dChkZW50cnkpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAKLSAgICBlcnIgPSBkaXItPmlfb3AtPnVubGluayAoZGlyLCBkZW50cnkpOwotICAgIGlmICghZXJyKQotICAgICAgICBkX2RlbGV0ZSAoZGVudHJ5KTsKKwllcnIgPSBkaXItPmlfb3AtPnVubGluayhkaXIsIGRlbnRyeSk7CisJaWYgKCFlcnIpCisJCWRfZGVsZXRlKGRlbnRyeSk7CiAKLW91dF9maWxlOgotICAgIGRwdXQgKGRlbnRyeSk7CisgICAgICBvdXRfZmlsZToKKwlkcHV0KGRlbnRyeSk7CiAKLW91dDoKLSAgICByZXR1cm4gZXJyOworICAgICAgb3V0OgorCXJldHVybiBlcnI7CiB9CiAKLQotaW50Ci1yZWlzZXJmc194YXR0cl9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQgcmVpc2VyZnNfeGF0dHJfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnI7CiAKLSAgICBpZiAoSVNfUkRPTkxZIChpbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CiAKLSAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwlkaXIgPSBvcGVuX3hhX2Rpcihpbm9kZSwgRkxfUkVBRE9OTFkpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWdvdG8gb3V0OworCX0KIAotICAgIGVyciA9IF9fcmVpc2VyZnNfeGF0dHJfZGVsIChkaXIsIG5hbWUsIHN0cmxlbiAobmFtZSkpOwotICAgIGRwdXQgKGRpcik7CisJZXJyID0gX19yZWlzZXJmc194YXR0cl9kZWwoZGlyLCBuYW1lLCBzdHJsZW4obmFtZSkpOworCWRwdXQoZGlyKTsKIAotICAgIGlmICghZXJyKSB7Ci0gICAgICAgIGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICAgICAgbWFya19pbm9kZV9kaXJ0eSAoaW5vZGUpOwotICAgIH0KKwlpZiAoIWVycikgeworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KIAotb3V0OgotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogLyogVGhlIGZvbGxvd2luZyBhcmUgc2lkZSBlZmZlY3RzIG9mIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBhcmVuJ3QgZXhwbGljaXRseQpAQCAtNzc3LDE2OCArNzg1LDE2NCBAQAogICogb3Igb3duZXJzaGlwIGNoYW5nZXMsIG9iamVjdCBkZWxldGlvbnMsIGV0Yy4gKi8KIAogc3RhdGljIGludAotcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIgKHZvaWQgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQorcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICp4YWRpciA9IChzdHJ1Y3QgZGVudHJ5ICopYnVmOworCXN0cnVjdCBkZW50cnkgKnhhZGlyID0gKHN0cnVjdCBkZW50cnkgKilidWY7CiAKLSAgICByZXR1cm4gX19yZWlzZXJmc194YXR0cl9kZWwgKHhhZGlyLCBuYW1lLCBuYW1lbGVuKTsKKwlyZXR1cm4gX19yZWlzZXJmc194YXR0cl9kZWwoeGFkaXIsIG5hbWUsIG5hbWVsZW4pOwogCiB9CiAKIC8qIFRoaXMgaXMgY2FsbGVkIHcvIGlub2RlLT5pX3NlbSBkb3duZWQgKi8KLWludAotcmVpc2VyZnNfZGVsZXRlX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSkKK2ludCByZWlzZXJmc19kZWxldGVfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgc3RydWN0IGZpbGUgKmZwOwotICAgIHN0cnVjdCBkZW50cnkgKmRpciwgKnJvb3Q7Ci0gICAgaW50IGVyciA9IDA7CisJc3RydWN0IGZpbGUgKmZwOworCXN0cnVjdCBkZW50cnkgKmRpciwgKnJvb3Q7CisJaW50IGVyciA9IDA7CiAKLSAgICAvKiBTa2lwIG91dCwgYW4geGF0dHIgaGFzIG5vIHhhdHRycyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KLSAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGlub2RlKSB8fAotICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUpID09IFNUQVRfREFUQV9WMSB8fAotICAgICAgICAhcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgZGlyID0gb3Blbl94YV9kaXIgKGlub2RlLCBGTF9SRUFET05MWSk7Ci0gICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgaWYgKElTX0VSUiAoZGlyKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChkaXIpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoZGlyKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCS8qIFNraXAgb3V0LCBhbiB4YXR0ciBoYXMgbm8geGF0dHJzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworCWlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpID09IFNUQVRfREFUQV9WMSB8fAorCSAgICAhcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJZGlyID0gb3Blbl94YV9kaXIoaW5vZGUsIEZMX1JFQURPTkxZKTsKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoIWRpci0+ZF9pbm9kZSkgeworCQlkcHV0KGRpcik7CisJCXJldHVybiAwOworCX0KIAotICAgIGZwID0gZGVudHJ5X29wZW4gKGRpciwgTlVMTCwgT19SRFdSKTsKLSAgICBpZiAoSVNfRVJSIChmcCkpIHsKLSAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOwotICAgICAgICAvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCi0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwlmcCA9IGRlbnRyeV9vcGVuKGRpciwgTlVMTCwgT19SRFdSKTsKKwlpZiAoSVNfRVJSKGZwKSkgeworCQllcnIgPSBQVFJfRVJSKGZwKTsKKwkJLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworCQlnb3RvIG91dDsKKwl9CiAKLSAgICBsb2NrX2tlcm5lbCAoKTsKLSAgICBlcnIgPSB4YXR0cl9yZWFkZGlyIChmcCwgcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIsIGRpcik7Ci0gICAgaWYgKGVycikgewotICAgICAgICB1bmxvY2tfa2VybmVsICgpOwotICAgICAgICBnb3RvIG91dF9kaXI7Ci0gICAgfQorCWxvY2tfa2VybmVsKCk7CisJZXJyID0geGF0dHJfcmVhZGRpcihmcCwgcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIsIGRpcik7CisJaWYgKGVycikgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWdvdG8gb3V0X2RpcjsKKwl9CiAKLSAgICAvKiBMZWZ0b3ZlcnMgYmVzaWRlcyAuIGFuZCAuLiAtLSB0aGF0J3Mgbm90IGdvb2QuICovCi0gICAgaWYgKGRpci0+ZF9pbm9kZS0+aV9ubGluayA8PSAyKSB7Ci0gICAgICAgIHJvb3QgPSBnZXRfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOwotICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICBlcnIgPSB2ZnNfcm1kaXIgKHJvb3QtPmRfaW5vZGUsIGRpcik7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgZHB1dCAocm9vdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZW1vdmUgYWxsIGVudHJpZXMgaW4gZGlyZWN0b3J5Iik7Ci0gICAgfQotICAgIHVubG9ja19rZXJuZWwgKCk7CisJLyogTGVmdG92ZXJzIGJlc2lkZXMgLiBhbmQgLi4gLS0gdGhhdCdzIG5vdCBnb29kLiAqLworCWlmIChkaXItPmRfaW5vZGUtPmlfbmxpbmsgPD0gMikgeworCQlyb290ID0gZ2V0X3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCQlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVyciA9IHZmc19ybWRpcihyb290LT5kX2lub2RlLCBkaXIpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJZHB1dChyb290KTsKKwl9IGVsc2UgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAiQ291bGRuJ3QgcmVtb3ZlIGFsbCBlbnRyaWVzIGluIGRpcmVjdG9yeSIpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CiAKLW91dF9kaXI6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZGlyOgorCWZwdXQoZnApOwogCi1vdXQ6Ci0gICAgaWYgKCFlcnIpCi0gICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiB+aV9oYXNfeGF0dHJfZGlyOwotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJaWYgKCFlcnIpCisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0KKwkJICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgfmlfaGFzX3hhdHRyX2RpcjsKKwlyZXR1cm4gZXJyOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfY2hvd25fYnVmIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOwotICAgIHN0cnVjdCBkZW50cnkgKnhhZGlyOwotICAgIHN0cnVjdCBpYXR0ciAqYXR0cnM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICp4YWRpcjsKKwlzdHJ1Y3QgaWF0dHIgKmF0dHJzOwogfTsKIAogLyogWFhYOiBJZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgSSdkIGxvdmUgdG8gaGVhciBhYm91dCBpdCAqLwogc3RhdGljIGludAotcmVpc2VyZnNfY2hvd25feGF0dHJzX2ZpbGxlciAodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCityZWlzZXJmc19jaG93bl94YXR0cnNfZmlsbGVyKHZvaWQgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkgICAgIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfY2hvd25fYnVmICpjaG93bl9idWYgPSAoc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiAqKWJ1ZjsKLSAgICBzdHJ1Y3QgZGVudHJ5ICp4YWZpbGUsICp4YWRpciA9IGNob3duX2J1Zi0+eGFkaXI7Ci0gICAgc3RydWN0IGlhdHRyICphdHRycyA9IGNob3duX2J1Zi0+YXR0cnM7Ci0gICAgaW50IGVyciA9IDA7CisJc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiAqY2hvd25fYnVmID0gKHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgKilidWY7CisJc3RydWN0IGRlbnRyeSAqeGFmaWxlLCAqeGFkaXIgPSBjaG93bl9idWYtPnhhZGlyOworCXN0cnVjdCBpYXR0ciAqYXR0cnMgPSBjaG93bl9idWYtPmF0dHJzOworCWludCBlcnIgPSAwOwogCi0gICAgeGFmaWxlID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBuYW1lbGVuKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKQotICAgICAgICByZXR1cm4gUFRSX0VSUiAoeGFmaWxlKTsKLSAgICBlbHNlIGlmICgheGFmaWxlLT5kX2lub2RlKSB7Ci0gICAgICAgIGRwdXQgKHhhZmlsZSk7Ci0gICAgICAgIHJldHVybiAtRU5PREFUQTsKLSAgICB9CisJeGFmaWxlID0gbG9va3VwX29uZV9sZW4obmFtZSwgeGFkaXIsIG5hbWVsZW4pOworCWlmIChJU19FUlIoeGFmaWxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoeGFmaWxlKTsKKwllbHNlIGlmICgheGFmaWxlLT5kX2lub2RlKSB7CisJCWRwdXQoeGFmaWxlKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KIAotICAgIGlmICghU19JU0RJUiAoeGFmaWxlLT5kX2lub2RlLT5pX21vZGUpKQotICAgICAgICBlcnIgPSBub3RpZnlfY2hhbmdlICh4YWZpbGUsIGF0dHJzKTsKLSAgICBkcHV0ICh4YWZpbGUpOworCWlmICghU19JU0RJUih4YWZpbGUtPmRfaW5vZGUtPmlfbW9kZSkpCisJCWVyciA9IG5vdGlmeV9jaGFuZ2UoeGFmaWxlLCBhdHRycyk7CisJZHB1dCh4YWZpbGUpOwogCi0gICAgcmV0dXJuIGVycjsKKwlyZXR1cm4gZXJyOwogfQogCi1pbnQKLXJlaXNlcmZzX2Nob3duX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycykKK2ludCByZWlzZXJmc19jaG93bl94YXR0cnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycykKIHsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgYnVmOwotICAgIHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHJzLT5pYV92YWxpZDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnIgPSAwOworCXN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgYnVmOworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHJzLT5pYV92YWxpZDsKIAotICAgIC8qIFNraXAgb3V0LCBhbiB4YXR0ciBoYXMgbm8geGF0dHJzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwotICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8Ci0gICAgICAgICFyZWlzZXJmc194YXR0cnMoaW5vZGUtPmlfc2IpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKLSAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGlmIChQVFJfRVJSIChkaXIpICE9IC1FTk9EQVRBKQotICAgICAgICAgICAgZXJyID0gUFRSX0VSUiAoZGlyKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfSBlbHNlIGlmICghZGlyLT5kX2lub2RlKSB7Ci0gICAgICAgIGRwdXQgKGRpcik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwkvKiBTa2lwIG91dCwgYW4geGF0dHIgaGFzIG5vIHhhdHRycyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpIHx8CisJICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEgfHwKKwkgICAgIXJlaXNlcmZzX3hhdHRycyhpbm9kZS0+aV9zYikpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWRpciA9IG9wZW5feGFfZGlyKGlub2RlLCBGTF9SRUFET05MWSk7CisJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwlpZiAoSVNfRVJSKGRpcikpIHsKKwkJaWYgKFBUUl9FUlIoZGlyKSAhPSAtRU5PREFUQSkKKwkJCWVyciA9IFBUUl9FUlIoZGlyKTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmICghZGlyLT5kX2lub2RlKSB7CisJCWRwdXQoZGlyKTsKKwkJZ290byBvdXQ7CisJfQogCi0gICAgZnAgPSBkZW50cnlfb3BlbiAoZGlyLCBOVUxMLCBPX1JEV1IpOwotICAgIGlmIChJU19FUlIgKGZwKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7Ci0gICAgICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gZGVudHJ5X29wZW4oZGlyLCBOVUxMLCBPX1JEV1IpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQkvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCisJCWdvdG8gb3V0OworCX0KIAotICAgIGxvY2tfa2VybmVsICgpOworCWxvY2tfa2VybmVsKCk7CiAKLSAgICBhdHRycy0+aWFfdmFsaWQgJj0gKEFUVFJfVUlEIHwgQVRUUl9HSUQgfCBBVFRSX0NUSU1FKTsKLSAgICBidWYueGFkaXIgPSBkaXI7Ci0gICAgYnVmLmF0dHJzID0gYXR0cnM7Ci0gICAgYnVmLmlub2RlID0gaW5vZGU7CisJYXR0cnMtPmlhX3ZhbGlkICY9IChBVFRSX1VJRCB8IEFUVFJfR0lEIHwgQVRUUl9DVElNRSk7CisJYnVmLnhhZGlyID0gZGlyOworCWJ1Zi5hdHRycyA9IGF0dHJzOworCWJ1Zi5pbm9kZSA9IGlub2RlOwogCi0gICAgZXJyID0geGF0dHJfcmVhZGRpciAoZnAsIHJlaXNlcmZzX2Nob3duX3hhdHRyc19maWxsZXIsICZidWYpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgdW5sb2NrX2tlcm5lbCAoKTsKLSAgICAgICAgZ290byBvdXRfZGlyOwotICAgIH0KKwllcnIgPSB4YXR0cl9yZWFkZGlyKGZwLCByZWlzZXJmc19jaG93bl94YXR0cnNfZmlsbGVyLCAmYnVmKTsKKwlpZiAoZXJyKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJZ290byBvdXRfZGlyOworCX0KIAotICAgIGVyciA9IG5vdGlmeV9jaGFuZ2UgKGRpciwgYXR0cnMpOwotICAgIHVubG9ja19rZXJuZWwgKCk7CisJZXJyID0gbm90aWZ5X2NoYW5nZShkaXIsIGF0dHJzKTsKKwl1bmxvY2tfa2VybmVsKCk7CiAKLW91dF9kaXI6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZGlyOgorCWZwdXQoZnApOwogCi1vdXQ6Ci0gICAgYXR0cnMtPmlhX3ZhbGlkID0gaWFfdmFsaWQ7Ci0gICAgcmV0dXJuIGVycjsKKyAgICAgIG91dDoKKwlhdHRycy0+aWFfdmFsaWQgPSBpYV92YWxpZDsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qIEFjdHVhbCBvcGVyYXRpb25zIHRoYXQgYXJlIGV4cG9ydGVkIHRvIFZGUy1sYW5kICovCiAKIC8qCkBAIC05NDYsNjEgKzk1MCw2MCBAQAogICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCiAgKi8KIHNzaXplX3QKLXJlaXNlcmZzX2dldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3JlaXNlcmZzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJICBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAobmFtZSk7Ci0gICAgaW50IGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChuYW1lKTsKKwlpbnQgZXJyOwogCi0gICAgaWYgKCF4YWggfHwgIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICgheGFoIHx8ICFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAorCSAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbihkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICBlcnIgPSB4YWgtPmdldCAoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJldHVybiBlcnI7CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzKGRlbnRyeS0+ZF9zYik7CisJZXJyID0geGFoLT5nZXQoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qCiAgKiBJbm9kZSBvcGVyYXRpb24gc2V0eGF0dHIoKQogICoKICAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0gZG93bgogICovCiBpbnQKLXJlaXNlcmZzX3NldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCityZWlzZXJmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOwotICAgIGludCBlcnI7Ci0gICAgaW50IGxvY2s7CisJc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXgobmFtZSk7CisJaW50IGVycjsKKwlpbnQgbG9jazsKIAotICAgIGlmICgheGFoIHx8ICFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAotICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXhhaCB8fCAhcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIGlmIChJU19SRE9OTFkgKGRlbnRyeS0+ZF9pbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX1JET05MWShkZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gLUVST0ZTOwogCi0gICAgaWYgKElTX0lNTVVUQUJMRSAoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQgKGRlbnRyeS0+ZF9pbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX0lNTVVUQUJMRShkZW50cnktPmRfaW5vZGUpIHx8IElTX0FQUEVORChkZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gLUVST0ZTOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIGxvY2sgPSAhaGFzX3hhdHRyX2RpciAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICBpZiAobG9jaykKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZWxzZQotICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOwotICAgIGVyciA9IHhhaC0+c2V0IChkZW50cnktPmRfaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7Ci0gICAgaWYgKGxvY2spCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZWxzZQotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmV0dXJuIGVycjsKKwlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlsb2NrID0gIWhhc194YXR0cl9kaXIoZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAobG9jaykKKwkJcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllbHNlCisJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllcnIgPSB4YWgtPnNldChkZW50cnktPmRfaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJaWYgKGxvY2spCisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllbHNlCisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTEwMDgsMzQ0ICsxMDExLDM0MyBAQAogICoKICAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0gZG93bgogICovCi1pbnQKLXJlaXNlcmZzX3JlbW92ZXhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQgcmVpc2VyZnNfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGludCBlcnI7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOworCWludCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXgobmFtZSk7CiAKLSAgICBpZiAoIXhhaCB8fCAhcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKLSAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQotICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKCF4YWggfHwgIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8CisJICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLSAgICBpZiAoSVNfUkRPTkxZIChkZW50cnktPmRfaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVST0ZTOworCWlmIChJU19SRE9OTFkoZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKIAotICAgIGlmIChJU19JTU1VVEFCTEUgKGRlbnRyeS0+ZF9pbm9kZSkgfHwgSVNfQVBQRU5EIChkZW50cnktPmRfaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmIChJU19JTU1VVEFCTEUoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQoZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaSAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaShkZW50cnktPmRfaW5vZGUpOworCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKIAotICAgIC8qIERlbGV0aW9uIHByZS1vcGVyYXRpb24gKi8KLSAgICBpZiAoeGFoLT5kZWwpIHsKLSAgICAgICAgZXJyID0geGFoLT5kZWwgKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSk7Ci0gICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICB9CisJLyogRGVsZXRpb24gcHJlLW9wZXJhdGlvbiAqLworCWlmICh4YWgtPmRlbCkgeworCQllcnIgPSB4YWgtPmRlbChkZW50cnktPmRfaW5vZGUsIG5hbWUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQogCi0gICAgZXJyID0gcmVpc2VyZnNfeGF0dHJfZGVsIChkZW50cnktPmRfaW5vZGUsIG5hbWUpOworCWVyciA9IHJlaXNlcmZzX3hhdHRyX2RlbChkZW50cnktPmRfaW5vZGUsIG5hbWUpOwogCi0gICAgZGVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICBtYXJrX2lub2RlX2RpcnR5IChkZW50cnktPmRfaW5vZGUpOworCWRlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkZW50cnktPmRfaW5vZGUpOwogCi1vdXQ6Ci0gICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGRlbnRyeS0+ZF9zYik7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qIFRoaXMgaXMgd2hhdCBmaWxsZGlyIHdpbGwgdXNlOgogICogcl9wb3Mgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgYW1vdW50IG9mIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgZW50aXJlCiAgKiBsaXN0LiBJZiByX3BvcyBiZWNvbWVzIGxhcmdlciB0aGFuIHJfc2l6ZSwgd2UgbmVlZCBtb3JlIHNwYWNlIGFuZCB3ZQogICogcmV0dXJuIGFuIGVycm9yIGluZGljYXRpbmcgdGhpcy4gSWYgcl9wb3MgaXMgbGVzcyB0aGFuIHJfc2l6ZSwgdGhlbiB3ZSd2ZQogICogZmlsbGVkIHRoZSBidWZmZXIgc3VjY2Vzc2Z1bGx5IGFuZCB3ZSByZXR1cm4gc3VjY2VzcyAqLwogc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgewotICAgIGludCByX3BvczsKLSAgICBpbnQgcl9zaXplOwotICAgIGNoYXIgKnJfYnVmOwotICAgIHN0cnVjdCBpbm9kZSAqcl9pbm9kZTsKKwlpbnQgcl9wb3M7CisJaW50IHJfc2l6ZTsKKwljaGFyICpyX2J1ZjsKKwlzdHJ1Y3QgaW5vZGUgKnJfaW5vZGU7CiB9OwogCiBzdGF0aWMgaW50Ci1yZWlzZXJmc19saXN0eGF0dHJfZmlsbGVyICh2b2lkICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQorcmVpc2VyZnNfbGlzdHhhdHRyX2ZpbGxlcih2b2lkICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKmIgPSAoc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKilidWY7Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgaWYgKG5hbWVbMF0gIT0gJy4nIHx8IChuYW1lbGVuICE9IDEgJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVsZW4gIT0gMikpKSB7Ci0gICAgICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWggPSBmaW5kX3hhdHRyX2hhbmRsZXJfcHJlZml4IChuYW1lKTsKLSAgICAgICAgaWYgKCF4YWgpIHJldHVybiAwOyAvKiBVbnN1cHBvcnRlZCB4YXR0ciBuYW1lLCBza2lwIGl0ICovCisJc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKmIgPSAoc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKilidWY7CisJaW50IGxlbiA9IDA7CisJaWYgKG5hbWVbMF0gIT0gJy4nCisJICAgIHx8IChuYW1lbGVuICE9IDEgJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVsZW4gIT0gMikpKSB7CisJCXN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWggPQorCQkgICAgZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChuYW1lKTsKKwkJaWYgKCF4YWgpCisJCQlyZXR1cm4gMDsJLyogVW5zdXBwb3J0ZWQgeGF0dHIgbmFtZSwgc2tpcCBpdCAqLwogCi0gICAgICAgIC8qIFdlIGNhbGwgLT5saXN0KCkgdHdpY2UgYmVjYXVzZSB0aGUgb3BlcmF0aW9uIGlzbid0IHJlcXVpcmVkIHRvIGp1c3QKLSAgICAgICAgICogcmV0dXJuIHRoZSBuYW1lIGJhY2sgLSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSAqLwotICAgICAgICBsZW4gKz0geGFoLT5saXN0IChiLT5yX2lub2RlLCBuYW1lLCBuYW1lbGVuLCBOVUxMKTsKKwkJLyogV2UgY2FsbCAtPmxpc3QoKSB0d2ljZSBiZWNhdXNlIHRoZSBvcGVyYXRpb24gaXNuJ3QgcmVxdWlyZWQgdG8ganVzdAorCQkgKiByZXR1cm4gdGhlIG5hbWUgYmFjayAtIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlICovCisJCWxlbiArPSB4YWgtPmxpc3QoYi0+cl9pbm9kZSwgbmFtZSwgbmFtZWxlbiwgTlVMTCk7CiAKLSAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgaWYgKGItPnJfcG9zICsgbGVuICsgMSA8PSBiLT5yX3NpemUpIHsKLSAgICAgICAgICAgICAgICBjaGFyICpwID0gYi0+cl9idWYgKyBiLT5yX3BvczsKLSAgICAgICAgICAgICAgICBwICs9IHhhaC0+bGlzdCAoYi0+cl9pbm9kZSwgbmFtZSwgbmFtZWxlbiwgcCk7Ci0gICAgICAgICAgICAgICAgKnArKyA9ICdcMCc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiLT5yX3BvcyArPSBsZW4gKyAxOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAobGVuKSB7CisJCQlpZiAoYi0+cl9wb3MgKyBsZW4gKyAxIDw9IGItPnJfc2l6ZSkgeworCQkJCWNoYXIgKnAgPSBiLT5yX2J1ZiArIGItPnJfcG9zOworCQkJCXAgKz0geGFoLT5saXN0KGItPnJfaW5vZGUsIG5hbWUsIG5hbWVsZW4sIHApOworCQkJCSpwKysgPSAnXDAnOworCQkJfQorCQkJYi0+cl9wb3MgKz0gbGVuICsgMTsKKwkJfQorCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQorCiAvKgogICogSW5vZGUgb3BlcmF0aW9uIGxpc3R4YXR0cigpCiAgKgogICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCiAgKi8KLXNzaXplX3QKLXJlaXNlcmZzX2xpc3R4YXR0ciAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3NpemVfdCByZWlzZXJmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmIGJ1ZjsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnIgPSAwOworCXN0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmIGJ1ZjsKIAotICAgIGlmICghZGVudHJ5LT5kX2lub2RlKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZGlyID0gb3Blbl94YV9kaXIgKGRlbnRyeS0+ZF9pbm9kZSwgRkxfUkVBRE9OTFkpOwotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7Ci0gICAgICAgIGlmIChlcnIgPT0gLUVOT0RBVEEpCi0gICAgICAgICAgICBlcnIgPSAwOyAvKiBOb3QgYW4gZXJyb3IgaWYgdGhlcmUgYXJlbid0IGFueSB4YXR0cnMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCWRpciA9IG9wZW5feGFfZGlyKGRlbnRyeS0+ZF9pbm9kZSwgRkxfUkVBRE9OTFkpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWlmIChlcnIgPT0gLUVOT0RBVEEpCisJCQllcnIgPSAwOwkvKiBOb3QgYW4gZXJyb3IgaWYgdGhlcmUgYXJlbid0IGFueSB4YXR0cnMgKi8KKwkJZ290byBvdXQ7CisJfQogCi0gICAgZnAgPSBkZW50cnlfb3BlbiAoZGlyLCBOVUxMLCBPX1JEV1IpOwotICAgIGlmIChJU19FUlIgKGZwKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7Ci0gICAgICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gZGVudHJ5X29wZW4oZGlyLCBOVUxMLCBPX1JEV1IpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQkvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCisJCWdvdG8gb3V0OworCX0KIAotICAgIGJ1Zi5yX2J1ZiA9IGJ1ZmZlcjsKLSAgICBidWYucl9zaXplID0gYnVmZmVyID8gc2l6ZSA6IDA7Ci0gICAgYnVmLnJfcG9zID0gMDsKLSAgICBidWYucl9pbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlidWYucl9idWYgPSBidWZmZXI7CisJYnVmLnJfc2l6ZSA9IGJ1ZmZlciA/IHNpemUgOiAwOworCWJ1Zi5yX3BvcyA9IDA7CisJYnVmLnJfaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKLSAgICBSRUlTRVJGU19JKGRlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgfD0gaV9oYXNfeGF0dHJfZGlyOworCVJFSVNFUkZTX0koZGVudHJ5LT5kX2lub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLSAgICBlcnIgPSB4YXR0cl9yZWFkZGlyIChmcCwgcmVpc2VyZnNfbGlzdHhhdHRyX2ZpbGxlciwgJmJ1Zik7Ci0gICAgaWYgKGVycikKLSAgICAgICAgZ290byBvdXRfZGlyOworCWVyciA9IHhhdHRyX3JlYWRkaXIoZnAsIHJlaXNlcmZzX2xpc3R4YXR0cl9maWxsZXIsICZidWYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2RpcjsKIAotICAgIGlmIChidWYucl9wb3MgPiBidWYucl9zaXplICYmIGJ1ZmZlciAhPSBOVUxMKQotICAgICAgICBlcnIgPSAtRVJBTkdFOwotICAgIGVsc2UKLSAgICAgICAgZXJyID0gYnVmLnJfcG9zOworCWlmIChidWYucl9wb3MgPiBidWYucl9zaXplICYmIGJ1ZmZlciAhPSBOVUxMKQorCQllcnIgPSAtRVJBTkdFOworCWVsc2UKKwkJZXJyID0gYnVmLnJfcG9zOwogCi1vdXRfZGlyOgotICAgIGZwdXQoZnApOworICAgICAgb3V0X2RpcjoKKwlmcHV0KGZwKTsKIAotb3V0OgotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmV0dXJuIGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB4YXR0ciBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUgKi8KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHhhdHRyX2hhbmRsZXJzID0gTElTVF9IRUFEX0lOSVQgKHhhdHRyX2hhbmRsZXJzKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHhhdHRyX2hhbmRsZXJzID0gTElTVF9IRUFEX0lOSVQoeGF0dHJfaGFuZGxlcnMpOwogc3RhdGljIERFRklORV9SV0xPQ0soaGFuZGxlcl9sb2NrKTsKIAotc3RhdGljIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICoKLWZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKGNvbnN0IGNoYXIgKnByZWZpeCkKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChjb25zdCBjaGFyCisJCQkJCQkJCSpwcmVmaXgpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IE5VTEw7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCi0gICAgcmVhZF9sb2NrICgmaGFuZGxlcl9sb2NrKTsKLSAgICBsaXN0X2Zvcl9lYWNoIChwLCAmeGF0dHJfaGFuZGxlcnMpIHsKLSAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKLSAgICAgICAgaWYgKHN0cm5jbXAgKHhhaC0+cHJlZml4LCBwcmVmaXgsIHN0cmxlbiAoeGFoLT5wcmVmaXgpKSA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHhhaCA9IE5VTEw7Ci0gICAgfQorCXJlYWRfbG9jaygmaGFuZGxlcl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ4YXR0cl9oYW5kbGVycykgeworCQl4YWggPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyLCBoYW5kbGVycyk7CisJCWlmIChzdHJuY21wKHhhaC0+cHJlZml4LCBwcmVmaXgsIHN0cmxlbih4YWgtPnByZWZpeCkpID09IDApCisJCQlicmVhazsKKwkJeGFoID0gTlVMTDsKKwl9CiAKLSAgICByZWFkX3VubG9jayAoJmhhbmRsZXJfbG9jayk7Ci0gICAgcmV0dXJuIHhhaDsKKwlyZWFkX3VubG9jaygmaGFuZGxlcl9sb2NrKTsKKwlyZXR1cm4geGFoOwogfQogCi1zdGF0aWMgdm9pZAotX191bnJlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKQorc3RhdGljIHZvaWQgX191bnJlZ2lzdGVyX2hhbmRsZXJzKHZvaWQpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaDsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqdG1wOworCXN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWg7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnRtcDsKIAotICAgIGxpc3RfZm9yX2VhY2hfc2FmZSAocCwgdG1wLCAmeGF0dHJfaGFuZGxlcnMpIHsKLSAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKLSAgICAgICAgaWYgKHhhaC0+ZXhpdCkKLSAgICAgICAgICAgIHhhaC0+ZXhpdCgpOworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCB0bXAsICZ4YXR0cl9oYW5kbGVycykgeworCQl4YWggPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyLCBoYW5kbGVycyk7CisJCWlmICh4YWgtPmV4aXQpCisJCQl4YWgtPmV4aXQoKTsKIAotICAgICAgICBsaXN0X2RlbF9pbml0IChwKTsKLSAgICB9Ci0gICAgSU5JVF9MSVNUX0hFQUQgKCZ4YXR0cl9oYW5kbGVycyk7CisJCWxpc3RfZGVsX2luaXQocCk7CisJfQorCUlOSVRfTElTVF9IRUFEKCZ4YXR0cl9oYW5kbGVycyk7CiB9CiAKLWludCBfX2luaXQKLXJlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKQoraW50IF9faW5pdCByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKQogewotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWg7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKLSAgICB3cml0ZV9sb2NrICgmaGFuZGxlcl9sb2NrKTsKKwl3cml0ZV9sb2NrKCZoYW5kbGVyX2xvY2spOwogCi0gICAgLyogSWYgd2UncmUgYWxyZWFkeSBpbml0aWFsaXplZCwgbm90aGluZyB0byBkbyAqLwotICAgIGlmICghbGlzdF9lbXB0eSAoJnhhdHRyX2hhbmRsZXJzKSkgewotICAgICAgICB3cml0ZV91bmxvY2sgKCZoYW5kbGVyX2xvY2spOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisJLyogSWYgd2UncmUgYWxyZWFkeSBpbml0aWFsaXplZCwgbm90aGluZyB0byBkbyAqLworCWlmICghbGlzdF9lbXB0eSgmeGF0dHJfaGFuZGxlcnMpKSB7CisJCXdyaXRlX3VubG9jaygmaGFuZGxlcl9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgLyogQWRkIHRoZSBoYW5kbGVycyAqLwotICAgIGxpc3RfYWRkX3RhaWwgKCZ1c2VyX2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7Ci0gICAgbGlzdF9hZGRfdGFpbCAoJnRydXN0ZWRfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKwkvKiBBZGQgdGhlIGhhbmRsZXJzICovCisJbGlzdF9hZGRfdGFpbCgmdXNlcl9oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworCWxpc3RfYWRkX3RhaWwoJnRydXN0ZWRfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFkKLSAgICBsaXN0X2FkZF90YWlsICgmc2VjdXJpdHlfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKwlsaXN0X2FkZF90YWlsKCZzZWN1cml0eV9oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAotICAgIGxpc3RfYWRkX3RhaWwgKCZwb3NpeF9hY2xfYWNjZXNzX2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7Ci0gICAgbGlzdF9hZGRfdGFpbCAoJnBvc2l4X2FjbF9kZWZhdWx0X2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CisJbGlzdF9hZGRfdGFpbCgmcG9zaXhfYWNsX2FjY2Vzc19oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworCWxpc3RfYWRkX3RhaWwoJnBvc2l4X2FjbF9kZWZhdWx0X2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CiAjZW5kaWYKIAotICAgIC8qIFJ1biBpbml0aWFsaXplcnMsIGlmIGF2YWlsYWJsZSAqLwotICAgIGxpc3RfZm9yX2VhY2ggKHAsICZ4YXR0cl9oYW5kbGVycykgewotICAgICAgICB4YWggPSBsaXN0X2VudHJ5IChwLCBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciwgaGFuZGxlcnMpOwotICAgICAgICBpZiAoeGFoLT5pbml0KSB7Ci0gICAgICAgICAgICBlcnIgPSB4YWgtPmluaXQgKCk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCAocCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJLyogUnVuIGluaXRpYWxpemVycywgaWYgYXZhaWxhYmxlICovCisJbGlzdF9mb3JfZWFjaChwLCAmeGF0dHJfaGFuZGxlcnMpIHsKKwkJeGFoID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciwgaGFuZGxlcnMpOworCQlpZiAoeGFoLT5pbml0KSB7CisJCQllcnIgPSB4YWgtPmluaXQoKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlsaXN0X2RlbF9pbml0KHApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQogCi0gICAgLyogQ2xlYW4gdXAgb3RoZXIgaGFuZGxlcnMsIGlmIGFueSBmYWlsZWQgKi8KLSAgICBpZiAoZXJyKQotICAgICAgICBfX3VucmVnaXN0ZXJfaGFuZGxlcnMgKCk7CisJLyogQ2xlYW4gdXAgb3RoZXIgaGFuZGxlcnMsIGlmIGFueSBmYWlsZWQgKi8KKwlpZiAoZXJyKQorCQlfX3VucmVnaXN0ZXJfaGFuZGxlcnMoKTsKIAotICAgIHdyaXRlX3VubG9jayAoJmhhbmRsZXJfbG9jayk7Ci0gICAgcmV0dXJuIGVycjsKKwl3cml0ZV91bmxvY2soJmhhbmRsZXJfbG9jayk7CisJcmV0dXJuIGVycjsKIH0KIAotdm9pZAotcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyAodm9pZCkKK3ZvaWQgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKQogewotICAgIHdyaXRlX2xvY2sgKCZoYW5kbGVyX2xvY2spOwotICAgIF9fdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKLSAgICB3cml0ZV91bmxvY2sgKCZoYW5kbGVyX2xvY2spOworCXdyaXRlX2xvY2soJmhhbmRsZXJfbG9jayk7CisJX191bnJlZ2lzdGVyX2hhbmRsZXJzKCk7CisJd3JpdGVfdW5sb2NrKCZoYW5kbGVyX2xvY2spOwogfQogCiAvKiBUaGlzIHdpbGwgY2F0Y2ggbG9va3VwcyBmcm9tIHRoZSBmcyByb290IHRvIC5yZWlzZXJmc19wcml2ICovCiBzdGF0aWMgaW50Ci14YXR0cl9sb29rdXBfcG9pc29uIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxMSwgc3RydWN0IHFzdHIgKm5hbWUpCit4YXR0cl9sb29rdXBfcG9pc29uKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnExLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2X3Jvb3QgPSBSRUlTRVJGU19TQihkZW50cnktPmRfc2IpLT5wcml2X3Jvb3Q7Ci0gICAgaWYgKG5hbWUtPmxlbiA9PSBwcml2X3Jvb3QtPmRfbmFtZS5sZW4gJiYKLSAgICAgICAgbmFtZS0+aGFzaCA9PSBwcml2X3Jvb3QtPmRfbmFtZS5oYXNoICYmCi0gICAgICAgICFtZW1jbXAgKG5hbWUtPm5hbWUsIHByaXZfcm9vdC0+ZF9uYW1lLm5hbWUsIG5hbWUtPmxlbikpIHsKLSAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0gZWxzZSBpZiAocTEtPmxlbiA9PSBuYW1lLT5sZW4gJiYKLSAgICAgICAgICAgICAgICFtZW1jbXAocTEtPm5hbWUsIG5hbWUtPm5hbWUsIG5hbWUtPmxlbikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiAxOworCXN0cnVjdCBkZW50cnkgKnByaXZfcm9vdCA9IFJFSVNFUkZTX1NCKGRlbnRyeS0+ZF9zYiktPnByaXZfcm9vdDsKKwlpZiAobmFtZS0+bGVuID09IHByaXZfcm9vdC0+ZF9uYW1lLmxlbiAmJgorCSAgICBuYW1lLT5oYXNoID09IHByaXZfcm9vdC0+ZF9uYW1lLmhhc2ggJiYKKwkgICAgIW1lbWNtcChuYW1lLT5uYW1lLCBwcml2X3Jvb3QtPmRfbmFtZS5uYW1lLCBuYW1lLT5sZW4pKSB7CisJCXJldHVybiAtRU5PRU5UOworCX0gZWxzZSBpZiAocTEtPmxlbiA9PSBuYW1lLT5sZW4gJiYKKwkJICAgIW1lbWNtcChxMS0+bmFtZSwgbmFtZS0+bmFtZSwgbmFtZS0+bGVuKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgeGF0dHJfbG9va3VwX3BvaXNvbl9vcHMgPSB7Ci0gICAgLmRfY29tcGFyZSA9IHhhdHRyX2xvb2t1cF9wb2lzb24sCisJLmRfY29tcGFyZSA9IHhhdHRyX2xvb2t1cF9wb2lzb24sCiB9OwogCi0KIC8qIFdlIG5lZWQgdG8gdGFrZSBhIGNvcHkgb2YgdGhlIG1vdW50IGZsYWdzIHNpbmNlIHRoaW5ncyBsaWtlCiAgKiBNU19SRE9OTFkgZG9uJ3QgZ2V0IHNldCB1bnRpbCAqYWZ0ZXIqIHdlJ3JlIGNhbGxlZC4KICAqIG1vdW50X2ZsYWdzICE9IG1vdW50X29wdGlvbnMgKi8KLWludAotcmVpc2VyZnNfeGF0dHJfaW5pdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgbW91bnRfZmxhZ3MpCitpbnQgcmVpc2VyZnNfeGF0dHJfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBtb3VudF9mbGFncykKIHsKLSAgaW50IGVyciA9IDA7CisJaW50IGVyciA9IDA7CiAKLSAgLyogV2UgbmVlZCBnZW5lcmF0aW9uIG51bWJlcnMgdG8gZW5zdXJlIHRoYXQgdGhlIG9pZCBtYXBwaW5nIGlzIGNvcnJlY3QKLSAgICogdjMuNSBmaWxlc3lzdGVtcyBkb24ndCBoYXZlIHRoZW0uICovCi0gIGlmICghb2xkX2Zvcm1hdF9vbmx5IChzKSkgewotICAgIHNldF9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgfSBlbHNlIGlmIChyZWlzZXJmc194YXR0cnNfb3B0aW9uYWwgKHMpKSB7Ci0gICAgLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkCi0gICAgICogYXQgbW91bnQgdGltZS4gRXJyb3Igb3V0LiAqLwotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ4YXR0cnMvQUNMcyBub3Qgc3VwcG9ydGVkIG9uIHByZSB2My42ICIKLSAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IGZpbGVzeXN0ZW0uIEZhaWxpbmcgbW91bnQuIik7Ci0gICAgZXJyID0gLUVPUE5PVFNVUFA7Ci0gICAgZ290byBlcnJvcjsKLSAgfSBlbHNlIHsKLSAgICAvKiBPbGQgZm9ybWF0IGZpbGVzeXN0ZW0sIGJ1dCBubyBvcHRpb25hbCB4YXR0cnMgaGF2ZSBiZWVuIGVuYWJsZWQuIFRoaXMKLSAgICAgKiBtZWFucyB3ZSBzaWxlbnRseSBkaXNhYmxlIHhhdHRycyBvbiB0aGUgZmlsZXN5c3RlbS4gKi8KLSAgICBjbGVhcl9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgfQorCS8qIFdlIG5lZWQgZ2VuZXJhdGlvbiBudW1iZXJzIHRvIGVuc3VyZSB0aGF0IHRoZSBvaWQgbWFwcGluZyBpcyBjb3JyZWN0CisJICogdjMuNSBmaWxlc3lzdGVtcyBkb24ndCBoYXZlIHRoZW0uICovCisJaWYgKCFvbGRfZm9ybWF0X29ubHkocykpIHsKKwkJc2V0X2JpdChSRUlTRVJGU19YQVRUUlMsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7CisJfSBlbHNlIGlmIChyZWlzZXJmc194YXR0cnNfb3B0aW9uYWwocykpIHsKKwkJLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkCisJCSAqIGF0IG1vdW50IHRpbWUuIEVycm9yIG91dC4gKi8KKwkJcmVpc2VyZnNfd2FybmluZyhzLCAieGF0dHJzL0FDTHMgbm90IHN1cHBvcnRlZCBvbiBwcmUgdjMuNiAiCisJCQkJICJmb3JtYXQgZmlsZXN5c3RlbS4gRmFpbGluZyBtb3VudC4iKTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgbm8gb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkLiBUaGlzCisJCSAqIG1lYW5zIHdlIHNpbGVudGx5IGRpc2FibGUgeGF0dHJzIG9uIHRoZSBmaWxlc3lzdGVtLiAqLworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworCX0KIAotICAvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSBwcml2cm9vdCBsb2NhdGVkIHlldCAtIGdvIGZpbmQgaXQgKi8KLSAgaWYgKHJlaXNlcmZzX3hhdHRycyAocykgJiYgIVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKLSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSAgICAgIGRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuIChQUklWUk9PVF9OQU1FLCBzLT5zX3Jvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuIChQUklWUk9PVF9OQU1FKSk7Ci0gICAgICBpZiAoIUlTX0VSUiAoZGVudHJ5KSkgewotICAgICAgICBpZiAoIShtb3VudF9mbGFncyAmIE1TX1JET05MWSkgJiYgIWRlbnRyeS0+ZF9pbm9kZSkgewotICAgICAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7Ci0gICAgICAgICAgICBkb3duICgmaW5vZGUtPmlfc2VtKTsKLSAgICAgICAgICAgIGVyciA9IGlub2RlLT5pX29wLT5ta2RpciAoaW5vZGUsIGRlbnRyeSwgMDcwMCk7Ci0gICAgICAgICAgICB1cCAoJmlub2RlLT5pX3NlbSk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgZHB1dCAoZGVudHJ5KTsKLSAgICAgICAgICAgICAgICBkZW50cnkgPSBOVUxMOwotICAgICAgICAgICAgfQorCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHByaXZyb290IGxvY2F0ZWQgeWV0IC0gZ28gZmluZCBpdCAqLworCWlmIChyZWlzZXJmc194YXR0cnMocykgJiYgIVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCQlkZW50cnkgPSBsb29rdXBfb25lX2xlbihQUklWUk9PVF9OQU1FLCBzLT5zX3Jvb3QsCisJCQkJCXN0cmxlbihQUklWUk9PVF9OQU1FKSk7CisJCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJCWlmICghKG1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAhZGVudHJ5LT5kX2lub2RlKSB7CisJCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCQkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJCQllcnIgPSBpbm9kZS0+aV9vcC0+bWtkaXIoaW5vZGUsIGRlbnRyeSwgMDcwMCk7CisJCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQkJaWYgKGVycikgeworCQkJCQlkcHV0KGRlbnRyeSk7CisJCQkJCWRlbnRyeSA9IE5VTEw7CisJCQkJfQogCi0gICAgICAgICAgICBpZiAoZGVudHJ5ICYmIGRlbnRyeS0+ZF9pbm9kZSkKLSAgICAgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAiQ3JlYXRlZCAlcyBvbiAlcyAtIHJlc2VydmVkIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhhdHRyIHN0b3JhZ2UuIiwgUFJJVlJPT1RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoaW5vZGUtPmlfc2IpKTsKLSAgICAgICAgfSBlbHNlIGlmICghZGVudHJ5LT5kX2lub2RlKSB7Ci0gICAgICAgICAgICBkcHV0IChkZW50cnkpOwotICAgICAgICAgICAgZGVudHJ5ID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRlbnRyeSk7CisJCQkJaWYgKGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUpCisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgIkNyZWF0ZWQgJXMgb24gJXMgLSByZXNlcnZlZCBmb3IgIgorCQkJCQkJCSAieGF0dHIgc3RvcmFnZS4iLAorCQkJCQkJCSBQUklWUk9PVF9OQU1FLAorCQkJCQkJCSByZWlzZXJmc19iZGV2bmFtZQorCQkJCQkJCSAoaW5vZGUtPmlfc2IpKTsKKwkJCX0gZWxzZSBpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgeworCQkJCWRwdXQoZGVudHJ5KTsKKwkJCQlkZW50cnkgPSBOVUxMOworCQkJfQorCQl9IGVsc2UKKwkJCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKIAotICAgICAgaWYgKCFlcnIgJiYgZGVudHJ5KSB7Ci0gICAgICAgICAgcy0+c19yb290LT5kX29wID0gJnhhdHRyX2xvb2t1cF9wb2lzb25fb3BzOwotICAgICAgICAgIHJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZSAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICAgICAgICBSRUlTRVJGU19TQihzKS0+cHJpdl9yb290ID0gZGVudHJ5OwotICAgICAgfSBlbHNlIGlmICghKG1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSkgeyAvKiB4YXR0cnMgYXJlIHVuYXZhaWxhYmxlICovCi0gICAgICAgICAgLyogSWYgd2UncmUgcmVhZC1vbmx5IGl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgZGlyIGhhc24ndCBiZWVuCi0gICAgICAgICAgICogY3JlYXRlZC4gTm90IGFuIGVycm9yIC0tIGp1c3Qgbm8geGF0dHJzIG9uIHRoZSBmcy4gV2UnbGwKLSAgICAgICAgICAgKiBjaGVjayBhZ2FpbiBpZiB3ZSBnbyByZWFkLXdyaXRlICovCi0gICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInhhdHRycy9BQ0xzIGVuYWJsZWQgYW5kIGNvdWxkbid0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluZC9jcmVhdGUgLnJlaXNlcmZzX3ByaXYuIEZhaWxpbmcgbW91bnQuIik7Ci0gICAgICAgICAgZXJyID0gLUVPUE5PVFNVUFA7Ci0gICAgICB9Ci0gIH0KKwkJaWYgKCFlcnIgJiYgZGVudHJ5KSB7CisJCQlzLT5zX3Jvb3QtPmRfb3AgPSAmeGF0dHJfbG9va3VwX3BvaXNvbl9vcHM7CisJCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoZGVudHJ5LT5kX2lub2RlKTsKKwkJCVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QgPSBkZW50cnk7CisJCX0gZWxzZSBpZiAoIShtb3VudF9mbGFncyAmIE1TX1JET05MWSkpIHsJLyogeGF0dHJzIGFyZSB1bmF2YWlsYWJsZSAqLworCQkJLyogSWYgd2UncmUgcmVhZC1vbmx5IGl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgZGlyIGhhc24ndCBiZWVuCisJCQkgKiBjcmVhdGVkLiBOb3QgYW4gZXJyb3IgLS0ganVzdCBubyB4YXR0cnMgb24gdGhlIGZzLiBXZSdsbAorCQkJICogY2hlY2sgYWdhaW4gaWYgd2UgZ28gcmVhZC13cml0ZSAqLworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAieGF0dHJzL0FDTHMgZW5hYmxlZCBhbmQgY291bGRuJ3QgIgorCQkJCQkgImZpbmQvY3JlYXRlIC5yZWlzZXJmc19wcml2LiBGYWlsaW5nIG1vdW50LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCX0KKwl9CiAKLWVycm9yOgotICAgLyogVGhpcyBpcyBvbmx5IG5vbnplcm8gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluaXRpYWxpemluZyB0aGUgeGF0dHIKLSAgICAqIGRpcmVjdG9yeSBvciBpZiB0aGVyZSBpcyBhIGNvbmRpdGlvbiB3aGVyZSB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uICovCi0gICAgaWYgKGVycikgewotICAgICAgICAgIGNsZWFyX2JpdCAoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOwotICAgICAgICAgIGNsZWFyX2JpdCAoUkVJU0VSRlNfWEFUVFJTX1VTRVIsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7Ci0gICAgICAgICAgY2xlYXJfYml0IChSRUlTRVJGU19QT1NJWEFDTCwgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgICB9CisgICAgICBlcnJvcjoKKwkvKiBUaGlzIGlzIG9ubHkgbm9uemVybyBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW5pdGlhbGl6aW5nIHRoZSB4YXR0cgorCSAqIGRpcmVjdG9yeSBvciBpZiB0aGVyZSBpcyBhIGNvbmRpdGlvbiB3aGVyZSB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uICovCisJaWYgKGVycikgeworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTX1VTRVIsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7CisJCWNsZWFyX2JpdChSRUlTRVJGU19QT1NJWEFDTCwgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKKwl9CiAKLSAgICAvKiBUaGUgc3VwZXJfYmxvY2sgTVNfUE9TSVhBQ0wgbXVzdCBtaXJyb3IgdGhlIChubylhY2wgbW91bnQgb3B0aW9uLiAqLwotICAgIHMtPnNfZmxhZ3MgPSBzLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMOwotICAgIGlmIChyZWlzZXJmc19wb3NpeGFjbCAocykpCi0Jcy0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKKwkvKiBUaGUgc3VwZXJfYmxvY2sgTVNfUE9TSVhBQ0wgbXVzdCBtaXJyb3IgdGhlIChubylhY2wgbW91bnQgb3B0aW9uLiAqLworCXMtPnNfZmxhZ3MgPSBzLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMOworCWlmIChyZWlzZXJmc19wb3NpeGFjbChzKSkKKwkJcy0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKIAotICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAotX19yZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBuZWVkX2xvY2spCitfX3JlaXNlcmZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kLAorCQkgICAgICBpbnQgbmVlZF9sb2NrKQogewotCXVtb2RlX3QJCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCiAJaWYgKG1hc2sgJiBNQVlfV1JJVEUpIHsKIAkJLyoKQEAgLTEzNjMsNTAgKzEzNjUsNTAgQEAKIAl9CiAKIAkvKiBXZSBkb24ndCBkbyBwZXJtaXNzaW9uIGNoZWNrcyBvbiB0aGUgaW50ZXJuYWwgb2JqZWN0cy4KLQkqIFBlcm1pc3Npb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAib3duaW5nIiBvYmplY3QuICovCi0gICAgICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpKQorCSAqIFBlcm1pc3Npb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAib3duaW5nIiBvYmplY3QuICovCisJaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoY3VycmVudC0+ZnN1aWQgPT0gaW5vZGUtPmlfdWlkKSB7CiAJCW1vZGUgPj49IDY7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAogCX0gZWxzZSBpZiAocmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpICYmCi0gICAgICAgICAgICAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSAhPSBTVEFUX0RBVEFfVjEpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJCSAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSAhPSBTVEFUX0RBVEFfVjEpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCiAJCS8qIEFDTCBjYW4ndCBjb250YWluIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaWYKIAkJICAgdGhlIEFDTF9NQVNLIGVudHJ5IGlzIDAgKi8KIAkJaWYgKCEobW9kZSAmIFNfSVJXWEcpKQogCQkJZ290byBjaGVja19ncm91cHM7CiAKLSAgICAgICAgICAgICAgICBpZiAobmVlZF9sb2NrKSB7Ci0JCSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJfaSAoaW5vZGUpOwotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisJCWlmIChuZWVkX2xvY2spIHsKKwkJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKGlub2RlKTsKKwkJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOwogCQl9Ci0gICAgICAgICAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRfbG9jaykgewotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLQkJICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2kgKGlub2RlKTsKKwkJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwkJaWYgKG5lZWRfbG9jaykgeworCQkJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koaW5vZGUpOwogCQl9Ci0gICAgICAgICAgICAgICAgaWYgKElTX0VSUiAoYWNsKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoUFRSX0VSUiAoYWNsKSA9PSAtRU5PREFUQSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2hlY2tfZ3JvdXBzOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUiAoYWNsKTsKLSAgICAgICAgICAgICAgICB9CisJCWlmIChJU19FUlIoYWNsKSkgeworCQkJaWYgKFBUUl9FUlIoYWNsKSA9PSAtRU5PREFUQSkKKwkJCQlnb3RvIGNoZWNrX2dyb3VwczsKKwkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KIAotICAgICAgICAgICAgICAgIGlmIChhY2wpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uIChpbm9kZSwgYWNsLCBtYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBQ0NFUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjaGVja19jYXBhYmlsaXRpZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwkJaWYgKGFjbCkgeworCQkJaW50IGVyciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOworCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJCWlmIChlcnIgPT0gLUVBQ0NFUykgeworCQkJCWdvdG8gY2hlY2tfY2FwYWJpbGl0aWVzOworCQkJfQorCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIHsKIAkJCWdvdG8gY2hlY2tfZ3JvdXBzOwotICAgICAgICAgICAgICAgIH0KKwkJfQogI2VuZGlmCiAJfSBlbHNlIHsKLWNoZWNrX2dyb3VwczoKKwkgICAgICBjaGVja19ncm91cHM6CiAJCWlmIChpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkpCiAJCQltb2RlID4+PSAzOwogCX0KQEAgLTE0MTQsMTAgKzE0MTYsMTAgQEAKIAkvKgogCSAqIElmIHRoZSBEQUNzIGFyZSBvayB3ZSBkb24ndCBuZWVkIGFueSBjYXBhYmlsaXR5IGNoZWNrLgogCSAqLwotCWlmICgoKG1vZGUgJiBtYXNrICYgKE1BWV9SRUFEfE1BWV9XUklURXxNQVlfRVhFQykpID09IG1hc2spKQorCWlmICgoKG1vZGUgJiBtYXNrICYgKE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUMpKSA9PSBtYXNrKSkKIAkJcmV0dXJuIDA7CiAKLWNoZWNrX2NhcGFiaWxpdGllczoKKyAgICAgIGNoZWNrX2NhcGFiaWxpdGllczoKIAkvKgogCSAqIFJlYWQvd3JpdGUgREFDcyBhcmUgYWx3YXlzIG92ZXJyaWRhYmxlLgogCSAqIEV4ZWN1dGFibGUgREFDcyBhcmUgb3ZlcnJpZGFibGUgaWYgYXQgbGVhc3Qgb25lIGV4ZWMgYml0IGlzIHNldC4KQEAgLTE0MzcsMTQgKzE0MzksMTMgQEAKIAlyZXR1cm4gLUVBQ0NFUzsKIH0KIAotaW50Ci1yZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitpbnQgcmVpc2VyZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0gICAgcmV0dXJuIF9fcmVpc2VyZnNfcGVybWlzc2lvbiAoaW5vZGUsIG1hc2ssIG5kLCAxKTsKKwlyZXR1cm4gX19yZWlzZXJmc19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBuZCwgMSk7CiB9CiAKIGludAotcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3JlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLSAgICByZXR1cm4gX19yZWlzZXJmc19wZXJtaXNzaW9uIChpbm9kZSwgbWFzaywgbmQsIDApOworCXJldHVybiBfX3JlaXNlcmZzX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIG5kLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKaW5kZXggYzMxMjg4MS4uNjcwM2VmYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKQEAgLTksNyArOSw4IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotc3RhdGljIGludCByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpOworc3RhdGljIGludCByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLAorCQkJICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCk7CiAKIHN0YXRpYyBpbnQKIHhhdHRyX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKQEAgLTM0LDE0ICszNSwxMyBAQAogCX0gZWxzZQogCQlhY2wgPSBOVUxMOwogCi0JZXJyb3IgPSByZWlzZXJmc19zZXRfYWNsIChpbm9kZSwgdHlwZSwgYWNsKTsKKwllcnJvciA9IHJlaXNlcmZzX3NldF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7CiAKLXJlbGVhc2VfYW5kX291dDoKKyAgICAgIHJlbGVhc2VfYW5kX291dDoKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCXJldHVybiBlcnJvcjsKIH0KIAotCiBzdGF0aWMgaW50CiB4YXR0cl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewpAQCAtNTEsNyArNTEsNyBAQAogCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlhY2wgPSByZWlzZXJmc19nZXRfYWNsIChpbm9kZSwgdHlwZSk7CisJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgdHlwZSk7CiAJaWYgKElTX0VSUihhY2wpKQogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwogCWlmIChhY2wgPT0gTlVMTCkKQEAgLTYyLDEyICs2MiwxMCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCiAvKgogICogQ29udmVydCBmcm9tIGZpbGVzeXN0ZW0gdG8gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgogICovCi1zdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCi1wb3NpeF9hY2xfZnJvbV9kaXNrKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpwb3NpeF9hY2xfZnJvbV9kaXNrKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKIHsKIAljb25zdCBjaGFyICplbmQgPSAoY2hhciAqKXZhbHVlICsgc2l6ZTsKIAlpbnQgbiwgY291bnQ7CkBAIC03Niw4ICs3NCw4IEBACiAJaWYgKCF2YWx1ZSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKHNpemUgPCBzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikpCi0JCSByZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlpZiAoKChyZWlzZXJmc19hY2xfaGVhZGVyICopdmFsdWUpLT5hX3ZlcnNpb24gIT0KKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKCgocmVpc2VyZnNfYWNsX2hlYWRlciAqKSB2YWx1ZSktPmFfdmVyc2lvbiAhPQogCSAgICBjcHVfdG9fbGUzMihSRUlTRVJGU19BQ0xfVkVSU0lPTikpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKTsKQEAgLTg5LDQxICs4NywzOSBAQAogCWFjbCA9IHBvc2l4X2FjbF9hbGxvYyhjb3VudCwgR0ZQX05PRlMpOwogCWlmICghYWNsKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlmb3IgKG49MDsgbiA8IGNvdW50OyBuKyspIHsKLQkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9Ci0JCQkocmVpc2VyZnNfYWNsX2VudHJ5ICopdmFsdWU7CisJZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKKwkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9IChyZWlzZXJmc19hY2xfZW50cnkgKikgdmFsdWU7CiAJCWlmICgoY2hhciAqKXZhbHVlICsgc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCkgPiBlbmQpCiAJCQlnb3RvIGZhaWw7Ci0JCWFjbC0+YV9lbnRyaWVzW25dLmVfdGFnICA9IGxlMTZfdG9fY3B1KGVudHJ5LT5lX3RhZyk7CisJCWFjbC0+YV9lbnRyaWVzW25dLmVfdGFnID0gbGUxNl90b19jcHUoZW50cnktPmVfdGFnKTsKIAkJYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtID0gbGUxNl90b19jcHUoZW50cnktPmVfcGVybSk7Ci0JCXN3aXRjaChhY2wtPmFfZW50cmllc1tuXS5lX3RhZykgewotCQkJY2FzZSBBQ0xfVVNFUl9PQko6Ci0JCQljYXNlIEFDTF9HUk9VUF9PQko6Ci0JCQljYXNlIEFDTF9NQVNLOgotCQkJY2FzZSBBQ0xfT1RIRVI6Ci0JCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsKLQkJCQkJc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCk7Ci0JCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9IEFDTF9VTkRFRklORURfSUQ7Ci0JCQkJYnJlYWs7CisJCXN3aXRjaCAoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpIHsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKworCQkJICAgIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9IEFDTF9VTkRFRklORURfSUQ7CisJCQlicmVhazsKIAotCQkJY2FzZSBBQ0xfVVNFUjoKLQkJCWNhc2UgQUNMX0dST1VQOgotCQkJCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOwotCQkJCWlmICgoY2hhciAqKXZhbHVlID4gZW5kKQotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9Ci0JCQkJCWxlMzJfdG9fY3B1KGVudHJ5LT5lX2lkKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKKwkJY2FzZSBBQ0xfVVNFUjoKKwkJY2FzZSBBQ0xfR1JPVVA6CisJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKyBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KTsKKwkJCWlmICgoY2hhciAqKXZhbHVlID4gZW5kKQogCQkJCWdvdG8gZmFpbDsKKwkJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZV9pZCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOwogCQl9CiAJfQogCWlmICh2YWx1ZSAhPSBlbmQpCiAJCWdvdG8gZmFpbDsKIAlyZXR1cm4gYWNsOwogCi1mYWlsOgorICAgICAgZmFpbDoKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQpAQCAtMTMxLDQ2ICsxMjcsNDYgQEAKIC8qCiAgKiBDb252ZXJ0IGZyb20gaW4tbWVtb3J5IHRvIGZpbGVzeXN0ZW0gcmVwcmVzZW50YXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkICoKLXBvc2l4X2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICpzaXplKQorc3RhdGljIHZvaWQgKnBvc2l4X2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICogc2l6ZSkKIHsKIAlyZWlzZXJmc19hY2xfaGVhZGVyICpleHRfYWNsOwogCWNoYXIgKmU7CiAJaW50IG47CiAKIAkqc2l6ZSA9IHJlaXNlcmZzX2FjbF9zaXplKGFjbC0+YV9jb3VudCk7Ci0JZXh0X2FjbCA9IChyZWlzZXJmc19hY2xfaGVhZGVyICopa21hbGxvYyhzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikgKwotCQlhY2wtPmFfY291bnQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KSwgR0ZQX05PRlMpOworCWV4dF9hY2wgPSAocmVpc2VyZnNfYWNsX2hlYWRlciAqKSBrbWFsbG9jKHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKSArCisJCQkJCQkgIGFjbC0+YV9jb3VudCAqCisJCQkJCQkgIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpLAorCQkJCQkJICBHRlBfTk9GUyk7CiAJaWYgKCFleHRfYWNsKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlleHRfYWNsLT5hX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihSRUlTRVJGU19BQ0xfVkVSU0lPTik7CiAJZSA9IChjaGFyICopZXh0X2FjbCArIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKTsKLQlmb3IgKG49MDsgbiA8IGFjbC0+YV9jb3VudDsgbisrKSB7Ci0JCXJlaXNlcmZzX2FjbF9lbnRyeSAqZW50cnkgPSAocmVpc2VyZnNfYWNsX2VudHJ5ICopZTsKLQkJZW50cnktPmVfdGFnICA9IGNwdV90b19sZTE2KGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKTsKKwlmb3IgKG4gPSAwOyBuIDwgYWNsLT5hX2NvdW50OyBuKyspIHsKKwkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9IChyZWlzZXJmc19hY2xfZW50cnkgKikgZTsKKwkJZW50cnktPmVfdGFnID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpOwogCQllbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKLQkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7Ci0JCQljYXNlIEFDTF9VU0VSOgotCQkJY2FzZSBBQ0xfR1JPVVA6Ci0JCQkJZW50cnktPmVfaWQgPQotCQkJCQljcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKLQkJCQllICs9IHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOwotCQkJCWJyZWFrOworCQlzd2l0Y2ggKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVI6CisJCWNhc2UgQUNMX0dST1VQOgorCQkJZW50cnktPmVfaWQgPSBjcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKKwkJCWUgKz0gc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeSk7CisJCQlicmVhazsKIAotCQkJY2FzZSBBQ0xfVVNFUl9PQko6Ci0JCQljYXNlIEFDTF9HUk9VUF9PQko6Ci0JCQljYXNlIEFDTF9NQVNLOgotCQkJY2FzZSBBQ0xfT1RIRVI6Ci0JCQkJZSArPSBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KTsKLQkJCQlicmVhazsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQllICs9IHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkJYnJlYWs7CiAKLQkJCWRlZmF1bHQ6Ci0JCQkJZ290byBmYWlsOworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOwogCQl9CiAJfQogCXJldHVybiAoY2hhciAqKWV4dF9hY2w7CiAKLWZhaWw6CisgICAgICBmYWlsOgogCWtmcmVlKGV4dF9hY2wpOwogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQpAQCAtMTgxLDU5ICsxNzcsNTggQEAKICAqIGlub2RlLT5pX3NlbTogZG93bgogICogQktMIGhlbGQgW2JlZm9yZSAyLjUueF0KICAqLwotc3RydWN0IHBvc2l4X2FjbCAqCi1yZWlzZXJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQorc3RydWN0IHBvc2l4X2FjbCAqcmVpc2VyZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAljaGFyICpuYW1lLCAqdmFsdWU7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqKnBfYWNsOwogCXNpemVfdCBzaXplOwogCWludCByZXR2YWw7Ci0gICAgICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICpyZWlzZXJmc19pID0gUkVJU0VSRlNfSShpbm9kZSk7CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfQUNDRVNTOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwotICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfREVGQVVMVDoKLSAgICAgICAgICAgICAgICBuYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcF9hY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfZGVmYXVsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FSU5WQUwpOwotICAgICAgICB9CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOworCQlwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9hY2Nlc3M7CisJCWJyZWFrOworCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUOworCQlwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CiAKLSAgICAgICAgaWYgKElTX0VSUiAoKnBfYWNsKSkgewotICAgICAgICAgICAgaWYgKFBUUl9FUlIgKCpwX2FjbCkgPT0gLUVOT0RBVEEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKnBfYWNsICE9IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gcG9zaXhfYWNsX2R1cCAoKnBfYWNsKTsKKwlpZiAoSVNfRVJSKCpwX2FjbCkpIHsKKwkJaWYgKFBUUl9FUlIoKnBfYWNsKSA9PSAtRU5PREFUQSkKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoKnBfYWNsICE9IE5VTEwpCisJCXJldHVybiBwb3NpeF9hY2xfZHVwKCpwX2FjbCk7CiAKLSAgICAgICAgc2l6ZSA9IHJlaXNlcmZzX3hhdHRyX2dldCAoaW5vZGUsIG5hbWUsIE5VTEwsIDApOwotICAgICAgICBpZiAoKGludClzaXplIDwgMCkgewotICAgICAgICAgICAgaWYgKHNpemUgPT0gLUVOT0RBVEEgfHwgc2l6ZSA9PSAtRU5PU1lTKSB7Ci0JCSpwX2FjbCA9IEVSUl9QVFIgKC1FTk9EQVRBKTsKLQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoc2l6ZSk7Ci0gICAgICAgIH0KKwlzaXplID0gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBOVUxMLCAwKTsKKwlpZiAoKGludClzaXplIDwgMCkgeworCQlpZiAoc2l6ZSA9PSAtRU5PREFUQSB8fCBzaXplID09IC1FTk9TWVMpIHsKKwkJCSpwX2FjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIEVSUl9QVFIoc2l6ZSk7CisJfQogCi0gICAgICAgIHZhbHVlID0ga21hbGxvYyAoc2l6ZSwgR0ZQX05PRlMpOwotICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9NRU0pOworCXZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlyZXR2YWwgPSByZWlzZXJmc194YXR0cl9nZXQoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplKTsKIAlpZiAocmV0dmFsID09IC1FTk9EQVRBIHx8IHJldHZhbCA9PSAtRU5PU1lTKSB7CiAJCS8qIFRoaXMgc2hvdWxkbid0IGFjdHVhbGx5IGhhcHBlbiBhcyBpdCBzaG91bGQgaGF2ZQogCQkgICBiZWVuIGNhdWdodCBhYm92ZS4uIGJ1dCBqdXN0IGluIGNhc2UgKi8KIAkJYWNsID0gTlVMTDsKLQkJKnBfYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA8IDApIHsKKwkJKnBfYWNsID0gRVJSX1BUUigtRU5PREFUQSk7CisJfSBlbHNlIGlmIChyZXR2YWwgPCAwKSB7CiAJCWFjbCA9IEVSUl9QVFIocmV0dmFsKTsKIAl9IGVsc2UgewogCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV9kaXNrKHZhbHVlLCByZXR2YWwpOwotCQkqcF9hY2wgPSBwb3NpeF9hY2xfZHVwIChhY2wpOwotICAgICAgICB9CisJCSpwX2FjbCA9IHBvc2l4X2FjbF9kdXAoYWNsKTsKKwl9CiAKIAlrZnJlZSh2YWx1ZSk7CiAJcmV0dXJuIGFjbDsKQEAgLTI0OCw3MiArMjQzLDcyIEBACiBzdGF0aWMgaW50CiByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCiB7Ci0gICAgICAgIGNoYXIgKm5hbWU7CisJY2hhciAqbmFtZTsKIAl2b2lkICp2YWx1ZSA9IE5VTEw7CiAJc3RydWN0IHBvc2l4X2FjbCAqKnBfYWNsOwogCXNpemVfdCBzaXplOwogCWludCBlcnJvcjsKLSAgICAgICAgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOwogCiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfQUNDRVNTOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwotICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKLSAgICAgICAgICAgICAgICBpZiAoYWNsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZSAoYWNsLCAmbW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2wgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVDsKLSAgICAgICAgICAgICAgICBwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OwotICAgICAgICAgICAgICAgIGlmICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2wgPyAtRUFDQ0VTIDogMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CisJCXBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKKwkJaWYgKGFjbCkgeworCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCWlmIChlcnJvciA8IDApCisJCQkJcmV0dXJuIGVycm9yOworCQkJZWxzZSB7CisJCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQkJaWYgKGVycm9yID09IDApCisJCQkJCWFjbCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7CisJCXBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiBhY2wgPyAtRUFDQ0VTIDogMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0gCWlmIChhY2wpIHsKLSAgICAgICAgICAgIHZhbHVlID0gcG9zaXhfYWNsX3RvX2Rpc2soYWNsLCAmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoSVNfRVJSKHZhbHVlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKGludClQVFJfRVJSKHZhbHVlKTsKLSAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgMCk7CisJaWYgKGFjbCkgeworCQl2YWx1ZSA9IHBvc2l4X2FjbF90b19kaXNrKGFjbCwgJnNpemUpOworCQlpZiAoSVNfRVJSKHZhbHVlKSkKKwkJCXJldHVybiAoaW50KVBUUl9FUlIodmFsdWUpOworCQllcnJvciA9IHJlaXNlcmZzX3hhdHRyX3NldChpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIDApOwogCX0gZWxzZSB7Ci0gICAgICAgICAgICBlcnJvciA9IHJlaXNlcmZzX3hhdHRyX2RlbCAoaW5vZGUsIG5hbWUpOwotICAgICAgICAgICAgaWYgKGVycm9yID09IC1FTk9EQVRBKSB7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBtYXkgc2VlbSBvZGQgaGVyZSwgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIEFDTCB3YXMgc2V0Ci0gICAgICAgICAgICAgICAgICogd2l0aCBhIHZhbHVlIHJlcHJlc2VudGFibGUgd2l0aCBtb2RlIGJpdHMuIElmIHRoZXJlIHdhcwotICAgICAgICAgICAgICAgICAqIGFuIEFDTCBiZWZvcmUsIHJlaXNlcmZzX3hhdHRyX2RlbCBhbHJlYWR5IGRpcnRpZWQgdGhlIGlub2RlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1hcmtfaW5vZGVfZGlydHkgKGlub2RlKTsKLSAgICAgICAgICAgICAgICBlcnJvciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJZXJyb3IgPSByZWlzZXJmc194YXR0cl9kZWwoaW5vZGUsIG5hbWUpOworCQlpZiAoZXJyb3IgPT0gLUVOT0RBVEEpIHsKKwkJCS8qIFRoaXMgbWF5IHNlZW0gb2RkIGhlcmUsIGJ1dCBpdCBtZWFucyB0aGF0IHRoZSBBQ0wgd2FzIHNldAorCQkJICogd2l0aCBhIHZhbHVlIHJlcHJlc2VudGFibGUgd2l0aCBtb2RlIGJpdHMuIElmIHRoZXJlIHdhcworCQkJICogYW4gQUNMIGJlZm9yZSwgcmVpc2VyZnNfeGF0dHJfZGVsIGFscmVhZHkgZGlydGllZCB0aGUgaW5vZGUuCisJCQkgKi8KKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJZXJyb3IgPSAwOworCQl9CisJfQogCiAJaWYgKHZhbHVlKQogCQlrZnJlZSh2YWx1ZSk7CiAKLSAgICAgICAgaWYgKCFlcnJvcikgewotICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgb2xkIG9uZSAqLwotICAgICAgICAgICAgaWYgKCFJU19FUlIgKCpwX2FjbCkgJiYgKnBfYWNsKQotICAgICAgICAgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlICgqcF9hY2wpOworCWlmICghZXJyb3IpIHsKKwkJLyogUmVsZWFzZSB0aGUgb2xkIG9uZSAqLworCQlpZiAoIUlTX0VSUigqcF9hY2wpICYmICpwX2FjbCkKKwkJCXBvc2l4X2FjbF9yZWxlYXNlKCpwX2FjbCk7CiAKLSAgICAgICAgICAgIGlmIChhY2wgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAqcF9hY2wgPSBFUlJfUFRSICgtRU5PREFUQSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBfYWNsID0gcG9zaXhfYWNsX2R1cCAoYWNsKTsKLSAgICAgICAgfQorCQlpZiAoYWNsID09IE5VTEwpCisJCQkqcF9hY2wgPSBFUlJfUFRSKC1FTk9EQVRBKTsKKwkJZWxzZQorCQkJKnBfYWNsID0gcG9zaXhfYWNsX2R1cChhY2wpOworCX0KIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTMyMSwxOTIgKzMxNiwxOTAgQEAKIC8qIGRpci0+aV9zZW06IGRvd24sCiAgKiBpbm9kZSBpcyBuZXcgYW5kIG5vdCByZWxlYXNlZCBpbnRvIHRoZSB3aWxkIHlldCAqLwogaW50Ci1yZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQorcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLSAgICBpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVyciA9IDA7CiAKLSAgICAvKiBBQ0xzIG9ubHkgZ2V0IGFwcGxpZWQgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICovCi0gICAgaWYgKFNfSVNMTksgKGlub2RlLT5pX21vZGUpKQotICAgICAgICByZXR1cm4gMDsKKwkvKiBBQ0xzIG9ubHkgZ2V0IGFwcGxpZWQgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICovCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAwOwogCi0gICAgLyogQUNMcyBjYW4gb25seSBiZSB1c2VkIG9uICJuZXciIG9iamVjdHMsIHNvIGlmIGl0J3MgYW4gb2xkIG9iamVjdAotICAgICAqIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5oZXJpdCBmcm9tICovCi0gICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChkaXIpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgZ290byBhcHBseV91bWFzazsKKwkvKiBBQ0xzIGNhbiBvbmx5IGJlIHVzZWQgb24gIm5ldyIgb2JqZWN0cywgc28gaWYgaXQncyBhbiBvbGQgb2JqZWN0CisJICogdGhlcmUgaXMgbm90aGluZyB0byBpbmhlcml0IGZyb20gKi8KKwlpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGlyKSA9PSBTVEFUX0RBVEFfVjEpCisJCWdvdG8gYXBwbHlfdW1hc2s7CiAKLSAgICAvKiBEb24ndCBhcHBseSBBQ0xzIHRvIG9iamVjdHMgaW4gdGhlIC5yZWlzZXJmc19wcml2IHRyZWUuLiBUaGlzCi0gICAgICogd291bGQgYmUgdXNlbGVzcyBzaW5jZSBwZXJtaXNzaW9ucyBhcmUgaWdub3JlZCwgYW5kIGEgcGFpbiBiZWNhdXNlCi0gICAgICogaXQgaW50cm9kdWNlcyBsb2NraW5nIGN5Y2xlcyAqLwotICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoZGlyKSkgewotICAgICAgICByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUgKGlub2RlKTsKLSAgICAgICAgZ290byBhcHBseV91bWFzazsKLSAgICB9CisJLyogRG9uJ3QgYXBwbHkgQUNMcyB0byBvYmplY3RzIGluIHRoZSAucmVpc2VyZnNfcHJpdiB0cmVlLi4gVGhpcworCSAqIHdvdWxkIGJlIHVzZWxlc3Mgc2luY2UgcGVybWlzc2lvbnMgYXJlIGlnbm9yZWQsIGFuZCBhIHBhaW4gYmVjYXVzZQorCSAqIGl0IGludHJvZHVjZXMgbG9ja2luZyBjeWNsZXMgKi8KKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoZGlyKSkgeworCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoaW5vZGUpOworCQlnb3RvIGFwcGx5X3VtYXNrOworCX0KIAotICAgIGFjbCA9IHJlaXNlcmZzX2dldF9hY2wgKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7Ci0gICAgaWYgKElTX0VSUiAoYWNsKSkgewotICAgICAgICBpZiAoUFRSX0VSUiAoYWNsKSA9PSAtRU5PREFUQSkKLSAgICAgICAgICAgIGdvdG8gYXBwbHlfdW1hc2s7Ci0gICAgICAgIHJldHVybiBQVFJfRVJSIChhY2wpOwotICAgIH0KKwlhY2wgPSByZWlzZXJmc19nZXRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7CisJaWYgKElTX0VSUihhY2wpKSB7CisJCWlmIChQVFJfRVJSKGFjbCkgPT0gLUVOT0RBVEEpCisJCQlnb3RvIGFwcGx5X3VtYXNrOworCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCX0KIAotICAgIGlmIChhY2wpIHsKLSAgICAgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsX2NvcHk7Ci0gICAgICAgIG1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLSAgICAgICAgaW50IG5lZWRfYWNsOworCWlmIChhY2wpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsX2NvcHk7CisJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJaW50IG5lZWRfYWNsOwogCi0gICAgICAgIC8qIENvcHkgdGhlIGRlZmF1bHQgQUNMIHRvIHRoZSBkZWZhdWx0IEFDTCBvZiBhIG5ldyBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpKSB7Ci0gICAgICAgICAgICBlcnIgPSByZWlzZXJmc19zZXRfYWNsIChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKLSAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9CisJCS8qIENvcHkgdGhlIGRlZmF1bHQgQUNMIHRvIHRoZSBkZWZhdWx0IEFDTCBvZiBhIG5ldyBkaXJlY3RvcnkgKi8KKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWVyciA9IHJlaXNlcmZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJfQogCi0gICAgICAgIC8qIE5vdyB3ZSByZWNvbmNpbGUgdGhlIG5ldyBBQ0wgYW5kIHRoZSBtb2RlLAotICAgICAgICAgICBwb3RlbnRpYWxseSBtb2RpZnlpbmcgYm90aCAqLwotICAgICAgICBhY2xfY29weSA9IHBvc2l4X2FjbF9jbG9uZSAoYWNsLCBHRlBfTk9GUyk7Ci0gICAgICAgIGlmICghYWNsX2NvcHkpIHsKLSAgICAgICAgICAgIGVyciA9IC1FTk9NRU07Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KKwkJLyogTm93IHdlIHJlY29uY2lsZSB0aGUgbmV3IEFDTCBhbmQgdGhlIG1vZGUsCisJCSAgIHBvdGVudGlhbGx5IG1vZGlmeWluZyBib3RoICovCisJCWFjbF9jb3B5ID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOworCQlpZiAoIWFjbF9jb3B5KSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBjbGVhbnVwOworCQl9CiAKKwkJbmVlZF9hY2wgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoYWNsX2NvcHksICZtb2RlKTsKKwkJaWYgKG5lZWRfYWNsID49IDApIHsKKwkJCWlmIChtb2RlICE9IGlub2RlLT5pX21vZGUpIHsKKwkJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCX0KIAotICAgICAgICBuZWVkX2FjbCA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcSAoYWNsX2NvcHksICZtb2RlKTsKLSAgICAgICAgaWYgKG5lZWRfYWNsID49IDApIHsKLSAgICAgICAgICAgIGlmIChtb2RlICE9IGlub2RlLT5pX21vZGUpIHsKLSAgICAgICAgICAgICAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKLSAgICAgICAgICAgIH0KKwkJCS8qIElmIHdlIG5lZWQgYW4gQUNMLi4gKi8KKwkJCWlmIChuZWVkX2FjbCA+IDApIHsKKwkJCQllcnIgPQorCQkJCSAgICByZWlzZXJmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsCisJCQkJCQkgICAgIGFjbF9jb3B5KTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIGNsZWFudXBfY29weTsKKwkJCX0KKwkJfQorCSAgICAgIGNsZWFudXBfY29weToKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsX2NvcHkpOworCSAgICAgIGNsZWFudXA6CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJfSBlbHNlIHsKKwkgICAgICBhcHBseV91bWFzazoKKwkJLyogbm8gQUNMLCBhcHBseSB1bWFzayAqLworCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJfQogCi0gICAgICAgICAgICAvKiBJZiB3ZSBuZWVkIGFuIEFDTC4uICovCi0gICAgICAgICAgICBpZiAobmVlZF9hY2wgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcmVpc2VyZnNfc2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsX2NvcHkpOwotICAgICAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9jb3B5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci1jbGVhbnVwX2NvcHk6Ci0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2xfY29weSk7Ci1jbGVhbnVwOgotICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoYWNsKTsKLSAgICB9IGVsc2UgewotYXBwbHlfdW1hc2s6Ci0gICAgICAgIC8qIG5vIEFDTCwgYXBwbHkgdW1hc2sgKi8KLSAgICAgICAgaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAogLyogTG9va3MgdXAgYW5kIGNhY2hlcyB0aGUgcmVzdWx0IG9mIHRoZSBkZWZhdWx0IEFDTC4KICAqIFdlIGRvIHRoaXMgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNhcnJ5IHRoZSB4YXR0cl9zZW0gaW50bwogICogcmVpc2VyZnNfbmV3X2lub2RlIGlmIHdlIGRvbid0IG5lZWQgdG8gKi8KLWludAotcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitpbnQgcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2woc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAocmVpc2VyZnNfcG9zaXhhY2wgKGlub2RlLT5pX3NiKSAmJgotICAgICAgICAhaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGlub2RlKSkgewotICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0gICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChpbm9kZSk7Ci0gICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQpOwotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJfaSAoaW5vZGUpOwotICAgICAgICByZXQgPSBhY2wgPyAxIDogMDsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50Ci1yZWlzZXJmc19hY2xfY2htb2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0gICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOwotICAgICAgICBpbnQgZXJyb3I7Ci0KLSAgICAgICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8Ci0JICAgICFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpCi0gICAgICAgIHsKLQkgICAgcmV0dXJuIDA7CisJaW50IHJldCA9IDA7CisJaWYgKHJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSAmJiAhaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSB7CisJCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwkJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2koaW5vZGUpOworCQlyZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCk7CisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koaW5vZGUpOworCQlyZXQgPSBhY2wgPyAxIDogMDsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIAl9CiAKLSAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICBhY2wgPSByZWlzZXJmc19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOwotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgaWYgKCFhY2wpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChJU19FUlIoYWNsKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihhY2wpOwotICAgICAgICBjbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9OT0ZTKTsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLSAgICAgICAgaWYgKCFjbG9uZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0gICAgICAgIGlmICghZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBpbnQgbG9jayA9ICFoYXNfeGF0dHJfZGlyIChpbm9kZSk7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pIChpbm9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2spCi0gICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLSAgICAgICAgICAgICAgICBpZiAobG9jaykKLSAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2kgKGlub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7Ci0gICAgICAgIHJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmVpc2VyZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisJaW50IGVycm9yOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChnZXRfaW5vZGVfc2RfdmVyc2lvbihpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8CisJICAgICFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWlmICghYWNsKQorCQlyZXR1cm4gMDsKKwlpZiAoSVNfRVJSKGFjbCkpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlpZiAoIWNsb25lKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcnJvciA9IHBvc2l4X2FjbF9jaG1vZF9tYXNxKGNsb25lLCBpbm9kZS0+aV9tb2RlKTsKKwlpZiAoIWVycm9yKSB7CisJCWludCBsb2NrID0gIWhhc194YXR0cl9kaXIoaW5vZGUpOworCQlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2koaW5vZGUpOworCQlpZiAobG9jaykKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJZWxzZQorCQkJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVycm9yID0gcmVpc2VyZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCWlmIChsb2NrKQorCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVsc2UKKwkJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pKGlub2RlKTsKKwl9CisJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludAogcG9zaXhfYWNsX2FjY2Vzc19nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKKwkJICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpLTEpCisJaWYgKHN0cmxlbihuYW1lKSAhPSBzaXplb2YoUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUykgLSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4geGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50CiBwb3NpeF9hY2xfYWNjZXNzX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKKwkJICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKS0xKQorCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpIC0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIHhhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgdmFsdWUsIHNpemUpOwogfQogCi1zdGF0aWMgaW50Ci1wb3NpeF9hY2xfYWNjZXNzX2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgcG9zaXhfYWNsX2FjY2Vzc19kZWwoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOwotICAgIHN0cnVjdCBwb3NpeF9hY2wgKiphY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOwotICAgIGlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpLTEpCi0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKCFJU19FUlIgKCphY2wpICYmICphY2wpIHsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKCphY2wpOwotICAgICAgICAqYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOworCXN0cnVjdCBwb3NpeF9hY2wgKiphY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOworCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFJU19FUlIoKmFjbCkgJiYgKmFjbCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZSgqYWNsKTsKKwkJKmFjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1wb3NpeF9hY2xfYWNjZXNzX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCitwb3NpeF9hY2xfYWNjZXNzX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCSAgICAgIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgbGVuID0gbmFtZWxlbjsKLSAgICBpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCWludCBsZW4gPSBuYW1lbGVuOworCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gMDsKKwlpZiAob3V0KQorCQltZW1jcHkob3V0LCBuYW1lLCBsZW4pOwogCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfYWNjZXNzX2hhbmRsZXIgPSB7CkBAIC01MTgsNDggKzUxMSw0OCBAQAogfTsKIAogc3RhdGljIGludAotcG9zaXhfYWNsX2RlZmF1bHRfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3Bvc2l4X2FjbF9kZWZhdWx0X2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKS0xKQorCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSAtIDEpCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiB4YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50CiBwb3NpeF9hY2xfZGVmYXVsdF9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorCQkgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCktMSkKKwlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCkgLSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4geGF0dHJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgdmFsdWUsIHNpemUpOwogfQogCi1zdGF0aWMgaW50Ci1wb3NpeF9hY2xfZGVmYXVsdF9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgaW50IHBvc2l4X2FjbF9kZWZhdWx0X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICpyZWlzZXJmc19pID0gUkVJU0VSRlNfSShpbm9kZSk7Ci0gICAgc3RydWN0IHBvc2l4X2FjbCAqKmFjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OwotICAgIGlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKS0xKQotCXJldHVybiAtRUlOVkFMOwotICAgIGlmICghSVNfRVJSICgqYWNsKSAmJiAqYWNsKSB7Ci0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlICgqYWNsKTsKLSAgICAgICAgKmFjbCA9IEVSUl9QVFIgKC1FTk9EQVRBKTsKLSAgICB9CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisJaWYgKHN0cmxlbihuYW1lKSAhPSBzaXplb2YoUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQpIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFJU19FUlIoKmFjbCkgJiYgKmFjbCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZSgqYWNsKTsKKwkJKmFjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1wb3NpeF9hY2xfZGVmYXVsdF9saXN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KQorcG9zaXhfYWNsX2RlZmF1bHRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJICAgICAgIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgbGVuID0gbmFtZWxlbjsKLSAgICBpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCWludCBsZW4gPSBuYW1lbGVuOworCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gMDsKKwlpZiAob3V0KQorCQltZW1jcHkob3V0LCBuYW1lLCBsZW4pOwogCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfZGVmYXVsdF9oYW5kbGVyID0gewpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3NlY3VyaXR5LmMKaW5kZXggZTA0NGQ1MS4uNWU5MGE5NSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfc2VjdXJpdHkuYworKysgYi9mcy9yZWlzZXJmcy94YXR0cl9zZWN1cml0eS5jCkBAIC05LDU3ICs5LDU1IEBACiAjZGVmaW5lIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCAic2VjdXJpdHkuIgogCiBzdGF0aWMgaW50Ci1zZWN1cml0eV9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzZWN1cml0eV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CiAKLSAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50Ci1zZWN1cml0eV9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9TRUNVUklUWV9QUkVGSVgpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX3NldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworCXJldHVybiByZWlzZXJmc194YXR0cl9zZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNlY3VyaXR5X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLXNlY3VyaXR5X2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3NlY3VyaXR5X2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWludCBsZW4gPSBuYW1lbGVuOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gMDsKIAotICAgIHJldHVybiAwOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CisKKwlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50Ci1zZWN1cml0eV9saXN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KQotewotICAgIGludCBsZW4gPSBuYW1lbGVuOwotCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAob3V0KQotICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgc2VjdXJpdHlfaGFuZGxlciA9IHsKIAkucHJlZml4ID0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAogCS5nZXQgPSBzZWN1cml0eV9nZXQsCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMgYi9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMKaW5kZXggNDM3NjIxOS4uMjUwMWY3ZSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfdHJ1c3RlZC5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3RydXN0ZWQuYwpAQCAtOSw2OSArOSw2NyBAQAogI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQordHJ1c3RlZF9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9nZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworCXJldHVybiByZWlzZXJmc194YXR0cl9nZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfc2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCi0gICAgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3RydXN0ZWRfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9zZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0cnVzdGVkX2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVFJVU1RFRF9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfZGVsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQordHJ1c3RlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCiB7Ci0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWludCBsZW4gPSBuYW1lbGVuOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIDA7CiAKLSAgICBpZiAoIShjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkpCi0gICAgICAgIHJldHVybiAtRVBFUk07CisJaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQorCQlyZXR1cm4gMDsKIAotICAgIHJldHVybiAwOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CisKKwlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50Ci10cnVzdGVkX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCi17Ci0gICAgaW50IGxlbiA9IG5hbWVsZW47Ci0KLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAob3V0KQotICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgdHJ1c3RlZF9oYW5kbGVyID0gewogCS5wcmVmaXggPSBYQVRUUl9UUlVTVEVEX1BSRUZJWCwKIAkuZ2V0ID0gdHJ1c3RlZF9nZXQsCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMgYi9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMKaW5kZXggMDc3MjgwNi4uNTE0NTgwNCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfdXNlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3VzZXIuYwpAQCAtMTMsODEgKzEzLDgwIEBACiAjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYICJ1c2VyLiIKIAogc3RhdGljIGludAotdXNlcl9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit1c2VyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewogCi0gICAgaW50IGVycm9yOworCWludCBlcnJvcjsKIAotICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZCAoaW5vZGUsIE1BWV9SRUFELCBOVUxMKTsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIHJldHVybiBlcnJvcjsKKwllcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKGlub2RlLCBNQVlfUkVBRCwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLSAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50Ci11c2VyX3NldCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAotICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit1c2VyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisJIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAKLSAgICBpbnQgZXJyb3I7CisJaW50IGVycm9yOwogCi0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgIGlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIoaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLSAgICBpZiAoIVNfSVNSRUcgKGlub2RlLT5pX21vZGUpICYmCi0gICAgICAgICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZCAoaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7Ci0gICAgaWYgKGVycm9yKQotICAgICAgICByZXR1cm4gZXJyb3I7CisJZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZChpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9zZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGludCB1c2VyX2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBlcnJvcjsKKworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIoaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWVycm9yID0gcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQoaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotdXNlcl9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit1c2VyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgZXJyb3I7CisJaW50IGxlbiA9IG5hbWVsZW47CisJaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlcihpbm9kZS0+aV9zYikpCisJCXJldHVybiAwOwogCi0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKLQotICAgIGlmICghU19JU1JFRyAoaW5vZGUtPmlfbW9kZSkgJiYKLSAgICAgICAgKCFTX0lTRElSIChpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICBlcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkIChpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci11c2VyX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCi17Ci0gICAgaW50IGxlbiA9IG5hbWVsZW47Ci0gICAgaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlciAoaW5vZGUtPmlfc2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOwotCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciB1c2VyX2hhbmRsZXIgPSB7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAyNWJjMWVjLi42ZTU3ZWUyIDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTg0MCw3ICs4NDAsNiBAQAogCW1udC0+bW50X3Jvb3QgPSBkZ2V0KHNiLT5zX3Jvb3QpOwogCW1udC0+bW50X21vdW50cG9pbnQgPSBzYi0+c19yb290OwogCW1udC0+bW50X3BhcmVudCA9IG1udDsKLQltbnQtPm1udF9uYW1lc3BhY2UgPSBjdXJyZW50LT5uYW1lc3BhY2U7CiAJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CiAJZnJlZV9zZWNkYXRhKHNlY2RhdGEpOwogCXB1dF9maWxlc3lzdGVtKHR5cGUpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IGQ3MmMxY2UuLjMzNTI4OGI5IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0zLDcgKzMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzkxLDkgKzM5MSw2IEBACiAgKiBzeXNmc191cGRhdGVfZmlsZSAtIHVwZGF0ZSB0aGUgbW9kaWZpZWQgdGltZXN0YW1wIG9uIGFuIG9iamVjdCBhdHRyaWJ1dGUuCiAgKiBAa29iajogb2JqZWN0IHdlJ3JlIGFjdGluZyBmb3IuCiAgKiBAYXR0cjogYXR0cmlidXRlIGRlc2NyaXB0b3IuCi0gKgotICogQWxzbyBjYWxsIGRub3RpZnkgZm9yIHRoZSBkZW50cnksIHdoaWNoIGxvdHMgb2YgdXNlcnNwYWNlIHByb2dyYW1zCi0gKiB1c2UuCiAgKi8KIGludCBzeXNmc191cGRhdGVfZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyKQogewpAQCAtNDA4LDcgKzQwNSw3IEBACiAJCWlmICh2aWN0aW0tPmRfaW5vZGUgJiYgCiAJCSAgICAodmljdGltLT5kX3BhcmVudC0+ZF9pbm9kZSA9PSBkaXItPmRfaW5vZGUpKSB7CiAJCQl2aWN0aW0tPmRfaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JCQlkbm90aWZ5X3BhcmVudCh2aWN0aW0sIEROX01PRElGWSk7CisJCQlmc25vdGlmeV9tb2RpZnkodmljdGltKTsKIAogCQkJLyoqCiAJCQkgKiBEcm9wIHJlZmVyZW5jZSBmcm9tIGluaXRpYWwgc3lzZnNfZ2V0X2RlbnRyeSgpLgpkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKaW5kZXggOTNkZWU3MC4uNmFjZDVjNiAxMDA2NDQKLS0tIGEvZnMveGF0dHIuYworKysgYi9mcy94YXR0ci5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogLyoKQEAgLTU3LDggKzU4LDEwIEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwogCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPnNldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKLQkJaWYgKCFlcnJvcikKKwkJaWYgKCFlcnJvcikgeworCQkJZnNub3RpZnlfeGF0dHIoZCk7CiAJCQlzZWN1cml0eV9pbm9kZV9wb3N0X3NldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKKwkJfQogb3V0OgogCQl1cCgmZC0+ZF9pbm9kZS0+aV9zZW0pOwogCX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKaW5kZXggMmI0MWU0Ny4uMmY2YWIxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKQEAgLTY0LDcgKzY0LDcgQEAKIAogLyogVmVyc2lvbiBzdHJpbmcgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwNTAzMDkKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMDUwNDA4CiAKIC8qCiAgKiBPUyBuYW1lLCB1c2VkIGZvciB0aGUgX09TIG9iamVjdC4gIFRoZSBfT1Mgb2JqZWN0IGlzIGVzc2VudGlhbGx5IG9ic29sZXRlLApAQCAtMTMwLDkgKzEzMCw4IEBACiAjZGVmaW5lIEFDUElfTUFYX0dQRV9CTE9DS1MgICAgICAgICAgICAgMgogI2RlZmluZSBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCAgICAgICAgIDgKIAotLyoKLSAqIE1ldGhvZCBpbmZvIChpbiBXQUxLX1NUQVRFKSwgY29udGFpbmluZyBsb2NhbCB2YXJpYWJsZXMgYW5kIGFyZ3VtZXRucwotICovCisvKiBNZXRob2QgaW5mbyAoaW4gV0FMS19TVEFURSksIGNvbnRhaW5pbmcgbG9jYWwgdmFyaWFibGVzIGFuZCBhcmd1bWV0bnMgKi8KKwogI2RlZmluZSBBQ1BJX01FVEhPRF9OVU1fTE9DQUxTICAgICAgICAgIDgKICNkZWZpbmUgQUNQSV9NRVRIT0RfTUFYX0xPQ0FMICAgICAgICAgICA3CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmggYi9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oCmluZGV4IDIyM2IyYTUuLjhiYTM3MmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZGVidWcuaApAQCAtNjEsOSArNjEsNyBAQAogCiAKICNkZWZpbmUgUEFSQU1fTElTVChwbCkgICAgICAgICAgICAgICAgICBwbAotCiAjZGVmaW5lIERCVEVTVF9PVVRQVVRfTEVWRUwobHZsKSAgICAgICAgaWYgKGFjcGlfZ2JsX2RiX29wdF92ZXJib3NlKQotCiAjZGVmaW5lIFZFUkJPU0VfUFJJTlQoZnApICAgICAgICAgICAgICAgREJURVNUX09VVFBVVF9MRVZFTChsdmwpIHtcCiAJCQkgIGFjcGlfb3NfcHJpbnRmIFBBUkFNX0xJU1QoZnApO30KIApAQCAtNzEsMTMgKzY5LDkgQEAKICNkZWZpbmUgRVhfU0lOR0xFX1NURVAgICAgICAgICAgICAgICAgICAyCiAKIAotLyogUHJvdG90eXBlcyAqLwotCi0KIC8qCiAgKiBkYnhmYWNlIC0gZXh0ZXJuYWwgZGVidWdnZXIgaW50ZXJmYWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2RiX2luaXRpYWxpemUgKAogCXZvaWQpOwpAQCAtOTIsMjAgKzg2LDEwIEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF90eXBlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfc3RhcnRfY29tbWFuZCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KLXZvaWQKLWFjcGlfZGJfbWV0aG9kX2VuZCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KIAogLyoKICAqIGRiY21kcyAtIGRlYnVnIGNvbW1hbmRzIGFuZCBvdXRwdXQgcm91dGluZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9kYl9kaXNhc3NlbWJsZV9tZXRob2QgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwpAQCAtMTc3LDU3ICsxNjEsMzAgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3RfYXJnKTsKIAogdm9pZAotYWNwaV9kYl9kaXNwbGF5X2xvY2tzICh2b2lkKTsKLQorYWNwaV9kYl9kaXNwbGF5X2xvY2tzICgKKwl2b2lkKTsKIAogdm9pZAogYWNwaV9kYl9kaXNwbGF5X3Jlc291cmNlcyAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0X2FyZyk7CiAKIHZvaWQKLWFjcGlfZGJfZGlzcGxheV9ncGVzICh2b2lkKTsKK2FjcGlfZGJfZGlzcGxheV9ncGVzICgKKwl2b2lkKTsKIAogdm9pZAogYWNwaV9kYl9jaGVja19pbnRlZ3JpdHkgKAogCXZvaWQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kYl9pbnRlZ3JpdHlfd2FsayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9kYl93YWxrX2FuZF9tYXRjaF9uYW1lICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX3dhbGtfZm9yX3JlZmVyZW5jZXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZGJfd2Fsa19mb3Jfc3BlY2lmaWNfb2JqZWN0cyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCiB2b2lkCiBhY3BpX2RiX2dlbmVyYXRlX2dwZSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZ3BlX2FyZywKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpibG9ja19hcmcpOwogCisKIC8qCiAgKiBkYmRpc3BseSAtIGRlYnVnIGRpc3BsYXkgY29tbWFuZHMKICAqLwotCiB2b2lkCiBhY3BpX2RiX2Rpc3BsYXlfbWV0aG9kX2luZm8gKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKQEAgLTI3MSwxOSArMjI4LDEwIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKLXZvaWQKLWFjcGlfZGJfZHVtcF9wYXJzZXJfZGVzY3JpcHRvciAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCi12b2lkICoKLWFjcGlfZGJfZ2V0X3BvaW50ZXIgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldCk7Ci0KIAogLyoKICAqIGRiZXhlYyAtIGRlYnVnZ2VyIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbgogICovCi0KIHZvaWQKIGFjcGlfZGJfZXhlY3V0ZSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSwKQEAgLTI5Niw0NCArMjQ0LDE1IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbnVtX2xvb3BzX2FyZywKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXRob2RfbmFtZV9hcmcpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kYl9leGVjdXRlX21ldGhvZCAoCi0Jc3RydWN0IGFjcGlfZGJfbWV0aG9kX2luZm8gICAgICAqaW5mbywKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXR1cm5fb2JqKTsKLQotdm9pZAotYWNwaV9kYl9leGVjdXRlX3NldHVwICgKLQlzdHJ1Y3QgYWNwaV9kYl9tZXRob2RfaW5mbyAgICAgICppbmZvKTsKLQotdTMyCi1hY3BpX2RiX2dldF9vdXRzdGFuZGluZ19hbGxvY2F0aW9ucyAoCi0Jdm9pZCk7Ci0KLXZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZGJfbWV0aG9kX3RocmVhZCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX2V4ZWN1dGlvbl93YWxrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KIAogLyoKICAqIGRiZmlsZWlvIC0gRGVidWdnZXIgZmlsZSBJL08gY29tbWFuZHMKICAqLwotCiBhY3BpX29iamVjdF90eXBlCiBhY3BpX2RiX21hdGNoX2FyZ3VtZW50ICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2FyZ3VtZW50LAogCXN0cnVjdCBhcmd1bWVudF9pbmZvICAgICAgICAgICAgKmFyZ3VtZW50cyk7CiAKLWFjcGlfc3RhdHVzCi1hZV9sb2NhbF9sb2FkX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9wdHIpOwotCiB2b2lkCiBhY3BpX2RiX2Nsb3NlX2RlYnVnX2ZpbGUgKAogCXZvaWQpOwpAQCAtMzU2LDE2ICsyNzUsMTcgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmaWxlbmFtZSwKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGUpOwogCisKIC8qCiAgKiBkYmhpc3RyeSAtIGRlYnVnZ2VyIEhJU1RPUlkgY29tbWFuZAogICovCi0KIHZvaWQKIGFjcGlfZGJfYWRkX3RvX2hpc3RvcnkgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbW1hbmRfbGluZSk7CiAKIHZvaWQKLWFjcGlfZGJfZGlzcGxheV9oaXN0b3J5ICh2b2lkKTsKK2FjcGlfZGJfZGlzcGxheV9oaXN0b3J5ICgKKwl2b2lkKTsKIAogY2hhciAqCiBhY3BpX2RiX2dldF9mcm9tX2hpc3RvcnkgKApAQCAtMzc1LDcgKzI5NSw2IEBACiAvKgogICogZGJpbnB1dCAtIHVzZXIgZnJvbnQtZW5kIHRvIHRoZSBBTUwgZGVidWdnZXIKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9kYl9jb21tYW5kX2Rpc3BhdGNoICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnB1dF9idWZmZXIsCkBAIC0zODYsNzEgKzMwNSwyOCBAQAogYWNwaV9kYl9leGVjdXRlX3RocmVhZCAoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CiAKLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9oZWxwICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoZWxwX3R5cGUpOwotCi1jaGFyICoKLWFjcGlfZGJfZ2V0X25leHRfdG9rZW4gKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqbmV4dCk7Ci0KLXUzMgotYWNwaV9kYl9nZXRfbGluZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5wdXRfYnVmZmVyKTsKLQotdTMyCi1hY3BpX2RiX21hdGNoX2NvbW1hbmQgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfY29tbWFuZCk7Ci0KLXZvaWQKLWFjcGlfZGJfc2luZ2xlX3RocmVhZCAoCi0Jdm9pZCk7Ci0KIAogLyoKICAqIGRic3RhdHMgLSBHZW5lcmF0aW9uIGFuZCBkaXNwbGF5IG9mIEFDUEkgdGFibGUgc3RhdGlzdGljcwogICovCi0KIHZvaWQKIGFjcGlfZGJfZ2VuZXJhdGVfc3RhdGlzdGljcyAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCwKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21ldGhvZCk7CiAKLQogYWNwaV9zdGF0dXMKIGFjcGlfZGJfZGlzcGxheV9zdGF0aXN0aWNzICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0eXBlX2FyZyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RiX2NsYXNzaWZ5X29uZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotdm9pZAotYWNwaV9kYl9jb3VudF9uYW1lc3BhY2Vfb2JqZWN0cyAoCi0Jdm9pZCk7Ci0KLXZvaWQKLWFjcGlfZGJfZW51bWVyYXRlX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCiAKIC8qCiAgKiBkYnV0aWxzIC0gQU1MIGRlYnVnZ2VyIHV0aWxpdGllcwogICovCi0KIHZvaWQKIGFjcGlfZGJfc2V0X291dHB1dF9kZXN0aW5hdGlvbiAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7CiAKIHZvaWQKLWFjcGlfZGJfZHVtcF9idWZmZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7Ci0KLXZvaWQKIGFjcGlfZGJfZHVtcF9vYmplY3QgKAogCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKm9ial9kZXNjLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwpAQCAtNDU5LDE0ICszMzUsOCBAQAogYWNwaV9kYl9wcmVwX25hbWVzdHJpbmcgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwogCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX3NlY29uZF9wYXNzX3BhcnNlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpyb290KTsKLQogc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgogYWNwaV9kYl9sb2NhbF9uc19sb29rdXAgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwogCi0KICNlbmRpZiAgLyogX19BQ0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzYXNtLmggYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAppbmRleCAyNmQ5MDdlLi5kYmZhODc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaApAQCAtMTAyLDU4ICsxMDIsMTYgQEAKIC8qCiAgKiBkbXdhbGsKICAqLwotCi12b2lkCi1hY3BpX2RtX3dhbGtfcGFyc2VfdHJlZSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JYXNsX3dhbGtfY2FsbGJhY2sgICAgICAgICAgICAgICBkZXNjZW5kaW5nX2NhbGxiYWNrLAotCWFzbF93YWxrX2NhbGxiYWNrICAgICAgICAgICAgICAgYXNjZW5kaW5nX2NhbGxiYWNrLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9kbV9kZXNjZW5kaW5nX29wICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9kbV9hc2NlbmRpbmdfb3AgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLQotLyoKLSAqIGRtb3Bjb2RlCi0gKi8KLQotdm9pZAotYWNwaV9kbV92YWxpZGF0ZV9uYW1lICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotdTMyCi1hY3BpX2RtX2R1bXBfbmFtZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7Ci0KLXZvaWQKLWFjcGlfZG1fdW5pY29kZSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCiB2b2lkCiBhY3BpX2RtX2Rpc2Fzc2VtYmxlICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vcGNvZGVzKTsKIAotdm9pZAotYWNwaV9kbV9uYW1lc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKIAotdm9pZAotYWNwaV9kbV9kaXNwbGF5X3BhdGggKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQorLyoKKyAqIGRtb3Bjb2RlCisgKi8KIHZvaWQKIGFjcGlfZG1fZGlzYXNzZW1ibGVfb25lX29wICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLApAQCAtMTY1LDE4ICsxMjMsOSBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKIAogdTMyCi1hY3BpX2RtX2Jsb2NrX3R5cGUgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotdTMyCiBhY3BpX2RtX2xpc3RfdHlwZSAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwogCi1hY3BpX3N0YXR1cwotYWNwaV9wc19kaXNwbGF5X29iamVjdF9wYXRobmFtZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KIHZvaWQKIGFjcGlfZG1fbWV0aG9kX2ZsYWdzICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CkBAIC0xOTcsMTAgKzE0Niw2IEBACiBhY3BpX2RtX21hdGNoX29wICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKLXZvaWQKLWFjcGlfZG1fbWF0Y2hfa2V5d29yZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCiB1OAogYWNwaV9kbV9jb21tYV9pZl9saXN0X21lbWJlciAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwpAQCAtMjExLDEzICsxNTYsMjUgQEAKIAogCiAvKgotICogZG1vYmplY3QKKyAqIGRtbmFtZXMKICAqLwordTMyCithY3BpX2RtX2R1bXBfbmFtZSAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7CisKK2FjcGlfc3RhdHVzCithY3BpX3BzX2Rpc3BsYXlfb2JqZWN0X3BhdGhuYW1lICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAogdm9pZAotYWNwaV9kbV9kZWNvZGVfbm9kZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CithY3BpX2RtX25hbWVzdHJpbmcgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwogCisKKy8qCisgKiBkbW9iamVjdAorICovCiB2b2lkCiBhY3BpX2RtX2Rpc3BsYXlfaW50ZXJuYWxfb2JqZWN0ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKQEAgLTI0MSw2ICsxOTgsMTYgQEAKIC8qCiAgKiBkbWJ1ZmZlcgogICovCit2b2lkCithY3BpX2RtX2Rpc2FzbV9ieXRlX2xpc3QgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9kYXRhLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9jb3VudCk7CisKK3ZvaWQKK2FjcGlfZG1fYnl0ZV9saXN0ICgKKwlzdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8gICAgICAgICppbmZvLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAogdm9pZAogYWNwaV9pc19laXNhX2lkICgKQEAgLTI2MiwxOCArMjI5LDYgQEAKIC8qCiAgKiBkbXJlc3JjCiAgKi8KLQotdm9pZAotYWNwaV9kbV9kaXNhc21fYnl0ZV9saXN0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfZGF0YSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfY291bnQpOwotCi12b2lkCi1hY3BpX2RtX2J5dGVfbGlzdCAoCi0Jc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICAgICAgICAqaW5mbywKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KIHZvaWQKIGFjcGlfZG1fcmVzb3VyY2VfZGVzY3JpcHRvciAoCiAJc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICAgICAgICAqaW5mbywKQEAgLTI5NiwxOSArMjUxLDEwIEBACiBhY3BpX2RtX2RlY29kZV9hdHRyaWJ1dGUgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKTsKIAorCiAvKgogICogZG1yZXNyY2wKICAqLwotCi12b2lkCi1hY3BpX2RtX2lvX2ZsYWdzICgKLQkJdTggICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotdm9pZAotYWNwaV9kbV9tZW1vcnlfZmxhZ3MgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY19mbGFncyk7Ci0KIHZvaWQKIGFjcGlfZG1fd29yZF9kZXNjcmlwdG9yICgKIAlzdHJ1Y3QgYXNsX3dvcmRfYWRkcmVzc19kZXNjICAgICpyZXNvdXJjZSwKQEAgLTM3Myw3ICszMTksNiBAQAogLyoKICAqIGRtcmVzcmNzCiAgKi8KLQogdm9pZAogYWNwaV9kbV9pcnFfZGVzY3JpcHRvciAoCiAJc3RydWN0IGFzbF9pcnFfZm9ybWF0X2Rlc2MgICAgICAqcmVzb3VyY2UsCkBAIC00MjAsNyArMzY1LDYgQEAKIC8qCiAgKiBkbXV0aWxzCiAgKi8KLQogdm9pZAogYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdCAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaCBiL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCmluZGV4IDIzN2Q2MzQuLjhmNWYyZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCkBAIC01MCw0MCArNTAsOSBAQAogI2RlZmluZSBOQU1FT0ZfQVJHX05URSAgICAgICJfX0EwIgogCiAKLS8qIENvbW1vbiBpbnRlcmZhY2VzICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wdXNoICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wb3AgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wX2NvdW50LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXZvaWQgKgotYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotI2VuZGlmCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi0KLS8qIGRzb3Bjb2RlIC0gc3VwcG9ydCBmb3IgbGF0ZSBldmFsdWF0aW9uICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnNjb3BlX25vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydCk7Ci0KKy8qCisgKiBkc29wY29kZSAtIHN1cHBvcnQgZm9yIGxhdGUgZXZhbHVhdGlvbgorICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwpAQCAtMTAxLDE1ICs3MCw2IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmJ1ZmZlcl9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9mZnNldF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmxlbmd0aF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlc3VsdF9kZXNjKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwpAQCAtMTMwLDkgKzkwLDkgQEAKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUpOwogCiAKLS8qIGRzY3RybCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UsIGNvbnRyb2wgc3RhY2sgcm91dGluZXMgKi8KLQotCisvKgorICogZHNjdHJsIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgY29udHJvbCBzdGFjayByb3V0aW5lcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3AgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCkBAIC0xNDQsOSArMTA0LDkgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKIAotLyogZHNleGVjIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgbWV0aG9kIGV4ZWN1dGlvbiBjYWxsYmFja3MgKi8KLQotCisvKgorICogZHNleGVjIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgbWV0aG9kIGV4ZWN1dGlvbiBjYWxsYmFja3MKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTE2MiwxNCArMTIyLDkgQEAKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICpzdGF0ZSk7CiAKIAotLyogZHNmaWVsZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UgZm9yIEFNTCBmaWVsZHMgKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzICgKLQlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAgICppbmZvLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnKTsKLQorLyoKKyAqIGRzZmllbGQgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIGZvciBBTUwgZmllbGRzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2NyZWF0ZV9maWVsZCAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCkBAIC0xOTksOCArMTU0LDkgQEAKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogCi0vKiBkc2xvYWQgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlLCBuYW1lc3BhY2UgbG9hZCBjYWxsYmFja3MgKi8KLQorLyoKKyAqIGRzbG9hZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UsIG5hbWVzcGFjZSBsb2FkIGNhbGxiYWNrcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19sb2FkMV9iZWdpbl9vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTIyNSw5ICsxODEsOSBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIpOwogCiAKLS8qIGRzbXRoZGF0IC0gbWV0aG9kIGRhdGEgKGxvY2Fscy9hcmdzKSAqLwotCi0KKy8qCisgKiBkc210aGRhdCAtIG1ldGhvZCBkYXRhIChsb2NhbHMvYXJncykKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZHNfc3RvcmVfb2JqZWN0X3RvX2xvY2FsICgKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKQEAgLTI1MCwxNCArMjA2LDYgQEAKIGFjcGlfZHNfaXNfbWV0aG9kX3ZhbHVlICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9vYmplY3RfdHlwZQotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLSNlbmRpZgotCiBhY3BpX3N0YXR1cwogYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLApAQCAtMjY1LDEyICsyMTMsNiBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYyk7CiAKLXZvaWQKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCiBhY3BpX3N0YXR1cwogYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbXMsCkBAIC0yODgsMTYgKzIzMCwxMCBAQAogYWNwaV9kc19tZXRob2RfZGF0YV9pbml0ICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotCi0vKiBkc21ldGhvZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UgLSBjb250cm9sIG1ldGhvZCBwYXJzaW5nICovCi0KKy8qCisgKiBkc21ldGhvZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UgLSBjb250cm9sIG1ldGhvZCBwYXJzaW5nCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX3BhcnNlX21ldGhvZCAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlKTsKQEAgLTMyNCwyMCArMjYwLDE4IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2FsbGluZ19tZXRob2Rfbm9kZSk7CiAKIAotLyogZHNvYmogLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIC0gb2JqZWN0IGluaXRpYWxpemF0aW9uIGFuZCBjb252ZXJzaW9uICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfb25lX29iamVjdCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQorLyoKKyAqIGRzaW5pdAorICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMgKAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc3RhcnRfbm9kZSk7CiAKKworLyoKKyAqIGRzb2JqZWN0IC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSAtIG9iamVjdCBpbml0aWFsaXphdGlvbiBhbmQgY29udmVyc2lvbgorICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLApAQCAtMzUzLDEyICsyODcsNiBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmpfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2J1aWxkX2ludGVybmFsX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2NfcHRyKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKQEAgLTM3Miw4ICszMDAsOSBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAogCi0vKiBkc3V0aWxzIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSB1dGlsaXR5IHJvdXRpbmVzICovCi0KKy8qCisgKiBkc3V0aWxzIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSB1dGlsaXR5IHJvdXRpbmVzCisgKi8KIHZvaWQKIGFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKQEAgLTQxOCw3ICszNDcsNiBAQAogLyoKICAqIGRzd3Njb3BlIC0gU2NvcGUgU3RhY2sgbWFuaXB1bGF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaCAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKQEAgLTQzNSw3ICszNjMsMTggQEAKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogCi0vKiBkc3dzdGF0ZSAtIHBhcnNlciBXQUxLX1NUQVRFIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KKy8qCisgKiBkc3dzdGF0ZSAtIHBhcnNlciBXQUxLX1NUQVRFIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3B1c2ggKAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcCAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BfY291bnQsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKgogYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSAoCkBAIC00NTQsMTIgKzM5Myw2IEBACiAJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfbnVtYmVyKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0jZW5kaWYKLQogYWNwaV9zdGF0dXMKIGFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF9jb3VudCwKQEAgLTQ5NCwyMCArNDI3LDggQEAKIGFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSAoCiAJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKTsKIAotI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQotdm9pZAotYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZV9jYWNoZSAoCi0Jdm9pZCk7Ci0jZW5kaWYKLQogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfaW5zZXJ0ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZHNfcmVzdWx0X3JlbW92ZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LApAQCAtNTI5LDQgKzQ1MCwxMCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKKyNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKK3ZvaWQKK2FjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGVfY2FjaGUgKAorCXZvaWQpOworI2VuZGlmCisKICNlbmRpZiAvKiBfQUNESVNQQVRfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKaW5kZXggMmRlYzA4My4uNjFhMjdjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKQEAgLTQ1LDYgKzQ1LDkgQEAKICNkZWZpbmUgX19BQ0VWRU5UU19IX18KIAogCisvKgorICogZXZldmVudAorICovCiBhY3BpX3N0YXR1cwogYWNwaV9ldl9pbml0aWFsaXplX2V2ZW50cyAoCiAJdm9pZCk7CkBAIC01MywyOCArNTYsMTQgQEAKIGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyAoCiAJdm9pZCk7CiAKLQotLyoKLSAqIEV2Zml4ZWQgLSBGaXhlZCBldmVudCBoYW5kbGluZwotICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUgKAotCXZvaWQpOwotCiB1MzIKIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0ICgKIAl2b2lkKTsKIAotdTMyCi1hY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLQogCiAvKgotICogRXZtaXNjCisgKiBldm1pc2MKICAqLwotCiB1OAogYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0ICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKQEAgLTEwMCwyNCArODksMTAgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5X3ZhbHVlKTsKIAotdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2ggKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCiAKIC8qCi0gKiBFdmdwZSAtIEdQRSBoYW5kbGluZyBhbmQgZGlzcGF0Y2gKKyAqIGV2Z3BlIC0gR1BFIGhhbmRsaW5nIGFuZCBkaXNwYXRjaAogICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKAotCUFDUElfR1BFX0NBTExCQUNLICAgICAgIGdwZV93YWxrX2NhbGxiYWNrLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi11OAotYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKLQogYWNwaV9zdGF0dXMKIGFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MgKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLApAQCAtMTM3LDkgKzExMiwyMyBAQAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIpOwogCisKKy8qCisgKiBldmdwZWJsaworICovCit1OAorYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQgKAorCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKKwogYWNwaV9zdGF0dXMKLWFjcGlfZXZfZ3BlX2luaXRpYWxpemUgKAotCXZvaWQpOworYWNwaV9ldl93YWxrX2dwZV9saXN0ICgKKwlBQ1BJX0dQRV9DQUxMQkFDSyAgICAgICBncGVfd2Fsa19jYWxsYmFjaywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycyAoCisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayAoCkBAIC0xNTQsMTEgKzE0Myw2IEBACiBhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2sgKAogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2RlbGV0ZV9ncGVfaGFuZGxlcnMgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7Ci0KIHUzMgogYWNwaV9ldl9ncGVfZGlzcGF0Y2ggKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLApAQCAtMTc3LDEwICsxNjEsMTQgQEAKIGFjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUgKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKIAotLyoKLSAqIEV2cmVnaW9uIC0gQWRkcmVzcyBTcGFjZSBoYW5kbGluZwotICovCithY3BpX3N0YXR1cworYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZSAoCisJdm9pZCk7CiAKKworLyoKKyAqIGV2cmVnaW9uIC0gQWRkcmVzcyBTcGFjZSBoYW5kbGluZworICovCiBhY3BpX3N0YXR1cwogYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyAoCiAJdm9pZCk7CkBAIC0xOTgsMTMgKzE4Niw2IEBACiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzCiBhY3BpX2V2X2F0dGFjaF9yZWdpb24gKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfb2JqLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmosCkBAIC0yMzMsMTcgKzIxNCwxMCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAqcmVnaW9uX29iaiwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVnX3J1biAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKIAogLyoKLSAqIEV2cmVnaW5pIC0gUmVnaW9uIGluaXRpYWxpemF0aW9uIGFuZCBzZXR1cAorICogZXZyZWdpbmkgLSBSZWdpb24gaW5pdGlhbGl6YXRpb24gYW5kIHNldHVwCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLApAQCAtMjkzLDkgKzI2Nyw4IEBACiAKIAogLyoKLSAqIEV2c2NpIC0gU0NJIChTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQpIGhhbmRsaW5nL2Rpc3BhdGNoCisgKiBldnNjaSAtIFNDSSAoU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0KSBoYW5kbGluZy9kaXNwYXRjaAogICovCi0KIHUzMiBBQ1BJX1NZU1RFTV9YRkFDRQogYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlciAoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNleGNlcC5oIGIvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaAppbmRleCA1M2Y4YjUwLi42MGQ3MzdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKQEAgLTQ4LDcgKzQ4LDYgQEAKIC8qCiAgKiBFeGNlcHRpb25zIHJldHVybmVkIGJ5IGV4dGVybmFsIEFDUEkgaW50ZXJmYWNlcwogICovCi0KICNkZWZpbmUgQUVfQ09ERV9FTlZJUk9OTUVOVEFMICAgICAgICAgICAweDAwMDAKICNkZWZpbmUgQUVfQ09ERV9QUk9HUkFNTUVSICAgICAgICAgICAgICAweDEwMDAKICNkZWZpbmUgQUVfQ09ERV9BQ1BJX1RBQkxFUyAgICAgICAgICAgICAweDIwMDAKQEAgLTk5LDYgKzk4LDcgQEAKIAogI2RlZmluZSBBRV9DT0RFX0VOVl9NQVggICAgICAgICAgICAgICAgIDB4MDAxRQogCisKIC8qCiAgKiBQcm9ncmFtbWVyIGV4Y2VwdGlvbnMKICAqLwpAQCAtMTY4LDYgKzE2OCw3IEBACiAKICNkZWZpbmUgQUVfQ09ERV9BTUxfTUFYICAgICAgICAgICAgICAgICAweDAwMjEKIAorCiAvKgogICogSW50ZXJuYWwgZXhjZXB0aW9ucyB1c2VkIGZvciBjb250cm9sCiAgKi8KQEAgLTE4OCw2ICsxODksNyBAQAogCiAjaWZkZWYgREVGSU5FX0FDUElfR0xPQkFMUwogCisKIC8qCiAgKiBTdHJpbmcgdmVyc2lvbnMgb2YgdGhlIGV4Y2VwdGlvbiBjb2RlcyBhYm92ZQogICogVGhlc2Ugc3RyaW5ncyBtdXN0IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluZXMgZXhhY3RseQpAQCAtMzA0LDUgKzMwNiw0IEBACiAKICNlbmRpZiAvKiBBQ1BJIEdMT0JBTFMgKi8KIAotCiAjZW5kaWYgLyogX19BQ0VYQ0VQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmggYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAppbmRleCBjN2YzODdhLi40OTQ2Njk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaApAQCAtMTQ2LDE1ICsxNDYsMTUgQEAKIEFDUElfRVhURVJOIEZBQ1NfREVTQ1JJUFRPUiAgICAgICAgICAgICphY3BpX2dibF9GQUNTOwogQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfY29tbW9uX2ZhY3MgICAgICAgICAgICAgYWNwaV9nYmxfY29tbW9uX2ZBQ1M7CiAvKgotICogU2luY2UgdGhlcmUgbWF5IGJlIG11bHRpcGxlIFNTRFRzIGFuZCBQU0RUUywgYSBzaW5nbGUgcG9pbnRlciBpcyBub3QKKyAqIFNpbmNlIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBTU0RUcyBhbmQgUFNEVHMsIGEgc2luZ2xlIHBvaW50ZXIgaXMgbm90CiAgKiBzdWZmaWNpZW50OyBUaGVyZWZvcmUsIHRoZXJlIGlzbid0IG9uZSEKICAqLwogCiAKIC8qCi0gKiBIYW5kbGUgYm90aCBBQ1BJIDEuMCBhbmQgQUNQSSAyLjAgSW50ZWdlciB3aWR0aHMKLSAqIElmIHdlIGFyZSBydW5uaW5nIGEgbWV0aG9kIHRoYXQgZXhpc3RzIGluIGEgMzItYml0IEFDUEkgdGFibGUuCi0gKiBVc2Ugb25seSAzMiBiaXRzIG9mIHRoZSBJbnRlZ2VyIGZvciBjb252ZXJzaW9uLgorICogSGFuZGxlIGJvdGggQUNQSSAxLjAgYW5kIEFDUEkgMi4wIEludGVnZXIgd2lkdGhzOgorICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCB0aGF0IGV4aXN0cyBpbiBhIDMyLWJpdCBBQ1BJIHRhYmxlLAorICogdXNlIG9ubHkgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIChpbnRlcm5hbCkgNjQtYml0IEludGVnZXIuCiAgKi8KIEFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoOwogQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOwpAQCAtMjQ2LDYgKzI0Niw3IEBACiBBQ1BJX0VYVEVSTiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kZWVwZXN0X25lc3Rpbmc7CiAjZW5kaWYKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlcnByZXRlciBnbG9iYWxzCkBAIC0yNjgsNiArMjY5LDcgQEAKIAogQUNQSV9FWFRFUk4gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAqYWNwaV9nYmxfcGFyc2VkX25hbWVzcGFjZV9yb290OwogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEhhcmR3YXJlIGdsb2JhbHMKQEAgLTI5OCw3ICszMDAsNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIEFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RiX291dHB1dF9mbGFnczsKIAogI2lmZGVmIEFDUElfRElTQVNTRU1CTEVSCkBAIC0zNTMsNSArMzU0LDQgQEAKIAogI2VuZGlmIC8qIEFDUElfREVCVUdHRVIgKi8KIAotCiAjZW5kaWYgLyogX19BQ0dMT0JBTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmggYi9pbmNsdWRlL2FjcGkvYWNod2FyZS5oCmluZGV4IDI4YWQxMzkuLjlkNjM2NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaApAQCAtNDYsMjUgKzQ2LDI5IEBACiAKIAogLyogUE0gVGltZXIgdGlja3MgcGVyIHNlY29uZCAoSFopICovCisKICNkZWZpbmUgUE1fVElNRVJfRlJFUVVFTkNZICAzNTc5NTQ1CiAKKy8qIFZhbHVlcyBmb3IgdGhlIF9TU1QgcmVzZXJ2ZWQgbWV0aG9kICovCisKKyNkZWZpbmUgQUNQSV9TU1RfSU5ESUNBVE9SX09GRiAgMAorI2RlZmluZSBBQ1BJX1NTVF9XT1JLSU5HICAgICAgICAxCisjZGVmaW5lIEFDUElfU1NUX1dBS0lORyAgICAgICAgIDIKKyNkZWZpbmUgQUNQSV9TU1RfU0xFRVBJTkcgICAgICAgMworI2RlZmluZSBBQ1BJX1NTVF9TTEVFUF9DT05URVhUICA0CisKIAogLyogUHJvdG90eXBlcyAqLwogCiAKKy8qCisgKiBod2FjcGkgLSBoaWdoIGxldmVsIGZ1bmN0aW9ucworICovCiBhY3BpX3N0YXR1cwogYWNwaV9od19pbml0aWFsaXplICgKIAl2b2lkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfaHdfc2h1dGRvd24gKAotCXZvaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19pbml0aWFsaXplX3N5c3RlbV9pbmZvICgKLQl2b2lkKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfaHdfc2V0X21vZGUgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CiAKQEAgLTcyLDEyICs3NiwxMCBAQAogYWNwaV9od19nZXRfbW9kZSAoCiAJdm9pZCk7CiAKLXUzMgotYWNwaV9od19nZXRfbW9kZV9jYXBhYmlsaXRpZXMgKAotCXZvaWQpOwogCi0vKiBSZWdpc3RlciBJL08gUHJvdG90eXBlcyAqLwotCisvKgorICogaHdyZWdzIC0gQUNQSSBSZWdpc3RlciBJL08KKyAqLwogc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKgogYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8gKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQpOwpAQCAtMTExLDggKzExMyw5IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CiAKIAotLyogR1BFIHN1cHBvcnQgKi8KLQorLyoKKyAqIGh3Z3BlIC0gR1BFIHN1cHBvcnQKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcgKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKQEAgLTEzMSwxMiArMTM0LDEyIEBACiAJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX2h3X2dldF9ncGVfc3RhdHVzICgKIAlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKIAlhY3BpX2V2ZW50X3N0YXR1cyAgICAgICAgICAgICAgICpldmVudF9zdGF0dXMpOwotI2VuZGlmCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcyAoCkBAIC0xNTUsMTUgKzE1OCwxMSBAQAogCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV93YWtldXBfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwogCi0KLS8qIEFDUEkgVGltZXIgcHJvdG90eXBlcyAqLwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQorLyoKKyAqIGh3dGltZXIgLSBBQ1BJIFRpbWVyIHByb3RvdHlwZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24gKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlc29sdXRpb24pOwpAQCAtMTc3LDYgKzE3Niw3IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF90aWNrcywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF90aWNrcywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lX2VsYXBzZWQpOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KKwogCiAjZW5kaWYgLyogX19BQ0hXQVJFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmggYi9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaAppbmRleCBjNTMwMWY1Li41YzcxNzI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaApAQCAtNDgsMzcgKzQ4LDkgQEAKICNkZWZpbmUgQUNQSV9XQUxLX09QRVJBTkRTICAgICAgICgmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSkKIAogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jaGVja19vYmplY3RfdHlwZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlX25lZWRlZCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHRoaXNfdHlwZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpOwotCi0vKgotICogZXh4ZmFjZSAtIEV4dGVybmFsIGludGVycHJldGVyIGludGVyZmFjZXMKLSAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9sb2FkX3RhYmxlICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZXhlY3V0ZV9tZXRob2QgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm1ldGhvZF9ub2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbXMsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9vYmpfZGVzYyk7Ci0KLQogLyoKICAqIGV4Y29udnJ0IC0gb2JqZWN0IGNvbnZlcnNpb24KICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtMTEwLDE3ICs4MiwxMCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYywKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotdTMyCi1hY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlciwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xlbmd0aCk7CiAKIC8qCiAgKiBleGZpZWxkIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gZmllbGQgbWFuaXB1bGF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY29tbW9uX2J1ZmZlcl9zZXR1cCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC0xMjgsNDIgKzkzLDYgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXR1bV9jb3VudCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc2V0dXBfcmVnaW9uICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWNjZXNzX3JlZ2lvbiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfd3JpdGUpOwotCi11OAotYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2ZpZWxkX2RhdHVtX2lvICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZSk7Ci0KLWFjcGlfc3RhdHVzCiBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgbWFzaywKQEAgLTE5OCwyOCArMTI3LDMzIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjKTsKIAorCiAvKgotICogZXhtaXNjIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gc3BlY2lmaWMgb3Bjb2RlcworICogZXhmbGRpbyAtIGxvdyBsZXZlbCBmaWVsZCBJL08KICAqLworYWNwaV9zdGF0dXMKK2FjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9hY2Nlc3NfcmVnaW9uICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV82QV8wVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKLXU4Ci1hY3BpX2V4X2RvX21hdGNoICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX29wLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm1hdGNoX29iaik7Ci0KKy8qCisgKiBleG1pc2MgLSBtaXNjIHN1cHBvcnQgcm91dGluZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtMjI3LDEzICsxNjEsNiBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX211bHRpcGxlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAqcmV0dXJuX3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9kZXNjKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZXhfY29uY2F0X3RlbXBsYXRlICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzIsCkBAIC0zMDgsMTMgKzIzNSw2IEBACiAvKgogICogZXhjb25maWcgLSBkeW5hbWljIHRhYmxlIGxvYWQvdW5sb2FkCiAgKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWRkX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqZGRiX2hhbmRsZSk7Ci0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2xvYWRfb3AgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtMzM0LDcgKzI1NCw2IEBACiAvKgogICogZXhtdXRleCAtIG11dGV4IHN1cHBvcnQKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9hY3F1aXJlX211dGV4ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aW1lX2Rlc2MsCkBAIC0zNTQsMTUgKzI3MywxMCBAQAogYWNwaV9leF91bmxpbmtfbXV0ZXggKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKIAotdm9pZAotYWNwaV9leF9saW5rX211dGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpOwogCiAvKgotICogZXhwcmVwIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gcHJlcCB1dGlsaXRpZXMKKyAqIGV4cHJlcCAtIEFDUEkgQU1MIGV4ZWN1dGlvbiAtIHByZXAgdXRpbGl0aWVzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKQEAgLTM3NSwxMCArMjg5LDEwIEBACiBhY3BpX2V4X3ByZXBfZmllbGRfdmFsdWUgKAogCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8pOwogCisKIC8qCiAgKiBleHN5c3RlbSAtIEludGVyZmFjZSB0byBPUyBzZXJ2aWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X3N5c3RlbV9kb19ub3RpZnlfb3AgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbHVlLApAQCAtNDIxLDkgKzMzNSw4IEBACiAKIAogLyoKLSAqIGV4bW9uYWRpYyAtIEFDUEkgQU1MIChwLWNvZGUpIGV4ZWN1dGlvbiwgbW9uYWRpYyBvcGVyYXRvcnMKKyAqIGV4b3BhcmcxIC0gQUNQSSBBTUwgZXhlY3V0aW9uLCAxIG9wZXJhbmQKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwpAQCAtNDQ1LDkgKzM1OCw4IEBACiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKIC8qCi0gKiBleGR5YWRpYyAtIEFDUEkgQU1MIChwLWNvZGUpIGV4ZWN1dGlvbiwgZHlhZGljIG9wZXJhdG9ycworICogZXhvcGFyZzIgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDIgb3BlcmFuZHMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwpAQCAtNDY2LDIxICszNzgsNTYgQEAKIAogCiAvKgotICogZXhyZXNvbHYgIC0gT2JqZWN0IHJlc29sdXRpb24gYW5kIGdldCB2YWx1ZSBmdW5jdGlvbnMKKyAqIGV4b3BhcmczIC0gQUNQSSBBTUwgZXhlY3V0aW9uLCAzIG9wZXJhbmRzCiAgKi8KK2FjcGlfc3RhdHVzCithY3BpX2V4X29wY29kZV8zQV8wVF8wUiAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCithY3BpX2V4X29wY29kZV8zQV8xVF8xUiAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKKworLyoKKyAqIGV4b3Bhcmc2IC0gQUNQSSBBTUwgZXhlY3V0aW9uLCA2IG9wZXJhbmRzCisgKi8KK2FjcGlfc3RhdHVzCithY3BpX2V4X29wY29kZV82QV8wVF8xUiAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKKworLyoKKyAqIGV4cmVzb2x2IC0gT2JqZWN0IHJlc29sdXRpb24gYW5kIGdldCB2YWx1ZSBmdW5jdGlvbnMKKyAqLworYWNwaV9zdGF0dXMKIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvcGVyYW5kLAorCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgKnJldHVybl90eXBlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYyk7CisKKworLyoKKyAqIGV4cmVzbnRlIC0gcmVzb2x2ZSBuYW1lc3BhY2Ugbm9kZQorICovCithY3BpX3N0YXR1cwogYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipzdGFja19wdHIsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKKworLyoKKyAqIGV4cmVzb3AgLSByZXNvbHZlIG9wZXJhbmQgdG8gdmFsdWUKKyAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUgKAorYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzICgKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCkBAIC00ODgsNyArNDM1LDYgQEAKIC8qCiAgKiBleGR1bXAgLSBJbnRlcnByZXRlciBkZWJ1ZyBvdXRwdXQgcm91dGluZXMKICAqLwotCiB2b2lkCiBhY3BpX2V4X2R1bXBfb3BlcmFuZCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC01MDQsNyArNDUwLDcgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHZvaWQKIGFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvciAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LApAQCAtNTE0LDQ2ICs0NjAsMTIgQEAKIGFjcGlfZXhfZHVtcF9ub2RlICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKLXZvaWQKLWFjcGlfZXhfb3V0X3N0cmluZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpOwotCi12b2lkCi1hY3BpX2V4X291dF9wb2ludGVyICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSk7Ci0KLXZvaWQKLWFjcGlfZXhfb3V0X2ludGVnZXIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCi12b2lkCi1hY3BpX2V4X291dF9hZGRyZXNzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIHZhbHVlKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKgotICogZXhuYW1lcyAtIGludGVycHJldGVyL3NjYW5uZXIgbmFtZSBsb2FkL2V4ZWN1dGUKKyAqIGV4bmFtZXMgLSBBTUwgbmFtZXN0cmluZyBzdXBwb3J0CiAgKi8KLQotY2hhciAqCi1hY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9jb3VudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9uYW1lX3NlZ3MpOwotCi11MzIKLWFjcGlfZXhfZ29vZF9jaGFyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3Rlcik7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X25hbWVfc2VnbWVudCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmluX2FtbF9hZGRyZXNzLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfc3RyaW5nKTsKLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfZ2V0X25hbWVfc3RyaW5nICgKIAlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIGRhdGFfdHlwZSwKQEAgLTU2MSwxNiArNDczLDEwIEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dF9uYW1lX3N0cmluZywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfbmFtZV9sZW5ndGgpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9kb19uYW1lICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIGRhdGFfdHlwZSwKLQlhY3BpX2ludGVycHJldGVyX21vZGUgICAgICAgICAgIGxvYWRfZXhlY19tb2RlKTsKLQogCiAvKgogICogZXhzdG9yZSAtIE9iamVjdCBzdG9yZSBzdXBwb3J0CiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3RvcmUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbF9kZXNjLApAQCAtNTc4LDEyICs0ODQsNiBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCkBAIC01OTMsMTAgKzQ5MywxMCBAQAogI2RlZmluZSBBQ1BJX0lNUExJQ0lUX0NPTlZFUlNJT04gICAgICAgIFRSVUUKICNkZWZpbmUgQUNQSV9OT19JTVBMSUNJVF9DT05WRVJTSU9OICAgICBGQUxTRQogCi0vKgotICogZXhzdG9yZW4KLSAqLwogCisvKgorICogZXhzdG9yZW4gLSByZXNvbHZlL3N0b3JlIG9iamVjdAorICovCiBhY3BpX3N0YXR1cwogYWNwaV9leF9yZXNvbHZlX29iamVjdCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnNvdXJjZV9kZXNjX3B0ciwKQEAgLTYxMiw5ICs1MTIsOCBAQAogCiAKIC8qCi0gKiBleGNvcHkgLSBvYmplY3QgY29weQorICogZXhzdG9yb2IgLSBzdG9yZSBvYmplY3QgLSBidWZmZXIvc3RyaW5nCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlciAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCkBAIC02MjUsNiArNTI0LDEwIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2MpOwogCisKKy8qCisgKiBleGNvcHkgLSBvYmplY3QgY29weQorICovCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jb3B5X2ludGVnZXJfdG9faW5kZXhfZmllbGQgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLApAQCAtNjQ1LDEwICs1NDgsMTAgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYyk7CiAKKwogLyoKICAqIGV4dXRpbHMgLSBpbnRlcnByZXRlci9zY2FubmVyIHV0aWxpdGllcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgKIAl2b2lkKTsKQEAgLTY2OSwxMSArNTcyLDYgQEAKIGFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrZWQpOwogCi11MzIKLWFjcGlfZXhfZGlnaXRzX25lZWRlZCAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpOwotCiB2b2lkCiBhY3BpX2V4X2Vpc2FfaWRfdG9fc3RyaW5nICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNfaWQsCkBAIC02ODgsNyArNTg2LDYgQEAKIC8qCiAgKiBleHJlZ2lvbiAtIGRlZmF1bHQgb3BfcmVnaW9uIGhhbmRsZXJzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3lzdGVtX21lbW9yeV9zcGFjZV9oYW5kbGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaCBiL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKaW5kZXggMDFkM2I0Yi4uMDMwZTY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCkBAIC03Miw3ICs3Miw2IEBACiAgKgogICogTk9URTogYW55IGNoYW5nZXMgaGVyZSBtdXN0IGJlIHJlZmxlY3RlZCBpbiB0aGUgYWNwaV9nYmxfbXV0ZXhfbmFtZXMgdGFibGUgYWxzbyEKICAqLwotCiAjZGVmaW5lIEFDUElfTVRYX0VYRUNVVEUgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBQ1BJX01UWF9JTlRFUlBSRVRFUiAgICAgICAgICAgIDEKICNkZWZpbmUgQUNQSV9NVFhfUEFSU0VSICAgICAgICAgICAgICAgICAyCkBAIC0xNTEsMTMgKzE1MCwxMyBAQAogI2RlZmluZSBBQ1BJX0ZJRUxEX0RXT1JEX0dSQU5VTEFSSVRZICAgIDQKICNkZWZpbmUgQUNQSV9GSUVMRF9RV09SRF9HUkFOVUxBUklUWSAgICA4CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogTmFtZXNwYWNlIHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyogT3BlcmF0aW9uYWwgbW9kZXMgb2YgdGhlIEFNTCBpbnRlcnByZXRlci9zY2FubmVyICovCiAKIHR5cGVkZWYgZW51bQpAQCAtMTc2LDcgKzE3NSw2IEBACiAgKiBkYXRhX3R5cGUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gaW50ZXJuYWwgZGVzY3JpcHRvcnMsIGFuZCBNVVNUCiAgKiBiZSB0aGUgZmlyc3QgYnl0ZSBpbiB0aGlzIHN0cnVjdHVyZS4KICAqLwotCiB1bmlvbiBhY3BpX25hbWVfdW5pb24KIHsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOwpAQCAtNDE1LDcgKzQxMyw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogI2RlZmluZSBBQ1BJX0NPTlRST0xfTk9STUFMICAgICAgICAgICAgICAgICAgMHhDMAogI2RlZmluZSBBQ1BJX0NPTlRST0xfQ09ORElUSU9OQUxfRVhFQ1VUSU5HICAgMHhDMQogI2RlZmluZSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORyAgICAgMHhDMgpAQCAtNDI0LDYgKzQyMSw3IEBACiAKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKwogc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgOwogc3RydWN0IGFjcGlfb2JqX211dGV4OwogdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgIDsKQEAgLTYwMSw3ICs1OTksNiBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7ICAgICAgICAgICAvKiBPcGNvZGUgdHlwZSAqLwogfTsKIAotCiB1bmlvbiBhY3BpX3BhcnNlX3ZhbHVlCiB7CiAJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjsgICAgICAgIC8qIEludGVnZXIgY29uc3RhbnQgKFVwIHRvIDY0IGJpdHMpICovCkBAIC02MTMsNyArNjEwLDYgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqYXJnOyAgICAgICAgICAgLyogYXJndW1lbnRzIGFuZCBjb250YWluZWQgb3BzICovCiB9OwogCi0KICNkZWZpbmUgQUNQSV9QQVJTRV9DT01NT04gXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTsgICAgICAvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqL1wKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogVHlwZSBvZiBPcCAqL1wKQEAgLTY5MSw3ICs2ODcsNiBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX29wX25hbWVbMTJdOwogfTsKIAotCiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdAogewogCXN0cnVjdCBhY3BpX3BhcnNlX29ial9jb21tb24gICAgICAgIGNvbW1vbjsKQEAgLTgzNCw3ICs4MjksNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIHJlc291cmNlX3R5cGUgdmFsdWVzICovCiAKICNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWV9SQU5HRSAgICAgICAgIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oIGIvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKaW5kZXggZmNhY2VkMS4uMDliZTkzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKQEAgLTUzOSwxMSArNTM5LDYgQEAKIAogCiAjZGVmaW5lIEFDUElfRFVNUF9FTlRSWShhLGIpICAgICAgICAgICAgYWNwaV9uc19kdW1wX2VudHJ5IChhLGIpCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotI2RlZmluZSBBQ1BJX0RVTVBfVEFCTEVTKGEsYikgICAgICAgICAgIGFjcGlfbnNfZHVtcF90YWJsZXMoYSxiKQotI2VuZGlmCi0KICNkZWZpbmUgQUNQSV9EVU1QX1BBVEhOQU1FKGEsYixjLGQpICAgICBhY3BpX25zX2R1bXBfcGF0aG5hbWUoYSxiLGMsZCkKICNkZWZpbmUgQUNQSV9EVU1QX1JFU09VUkNFX0xJU1QoYSkgICAgICBhY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdChhKQogI2RlZmluZSBBQ1BJX0RVTVBfQlVGRkVSKGEsYikgICAgICAgICAgIGFjcGlfdXRfZHVtcF9idWZmZXIoKHU4ICopYSxiLERCX0JZVEVfRElTUExBWSxfQ09NUE9ORU5UKQpAQCAtNTk2LDExICs1OTEsNiBAQAogI2RlZmluZSBBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoYSkKICNkZWZpbmUgQUNQSV9EVU1QX09QRVJBTkRTKGEsYixjLGQsZSkKICNkZWZpbmUgQUNQSV9EVU1QX0VOVFJZKGEsYikKLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0jZGVmaW5lIEFDUElfRFVNUF9UQUJMRVMoYSxiKQotI2VuZGlmCi0KICNkZWZpbmUgQUNQSV9EVU1QX1BBVEhOQU1FKGEsYixjLGQpCiAjZGVmaW5lIEFDUElfRFVNUF9SRVNPVVJDRV9MSVNUKGEpCiAjZGVmaW5lIEFDUElfRFVNUF9CVUZGRVIoYSxiKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaCBiL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViN2NiMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6IGFjbmFtZXMuaCAtIEdsb2JhbCBuYW1lcyBhbmQgc3RyaW5ncworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfX0FDTkFNRVNfSF9fCisjZGVmaW5lIF9fQUNOQU1FU19IX18KKworLyogTWV0aG9kIG5hbWVzIC0gdGhlc2UgbWV0aG9kcyBjYW4gYXBwZWFyIGFueXdoZXJlIGluIHRoZSBuYW1lc3BhY2UgKi8KKworI2RlZmluZSBNRVRIT0RfTkFNRV9fSElEICAgICAgICAiX0hJRCIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0NJRCAgICAgICAgIl9DSUQiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19VSUQgICAgICAgICJfVUlEIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fQURSICAgICAgICAiX0FEUiIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0lOSSAgICAgICAgIl9JTkkiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19TVEEgICAgICAgICJfU1RBIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fUkVHICAgICAgICAiX1JFRyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1NFRyAgICAgICAgIl9TRUciCisjZGVmaW5lIE1FVEhPRF9OQU1FX19CQk4gICAgICAgICJfQkJOIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fUFJUICAgICAgICAiX1BSVCIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0NSUyAgICAgICAgIl9DUlMiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19QUlMgICAgICAgICJfUFJTIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fUFJXICAgICAgICAiX1BSVyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1NSUyAgICAgICAgIl9TUlMiCisKKy8qIE1ldGhvZCBuYW1lcyAtIHRoZXNlIG1ldGhvZHMgbXVzdCBhcHBlYXIgYXQgdGhlIG5hbWVzcGFjZSByb290ICovCisKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0JGUyAgICAgICAgIlxcX0JGUyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0dUUyAgICAgICAgIlxcX0dUUyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1BUUyAgICAgICAgIlxcX1BUUyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1NTVCAgICAgICAgIlxcX1NJLl9TU1QiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19XQUsgICAgICAgICJcXF9XQUsiCisKKy8qIERlZmluaXRpb25zIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzcGFjZSBuYW1lcyAgKi8KKworI2RlZmluZSBBQ1BJX1VOS05PV05fTkFNRSAgICAgICAodTMyKSAweDNGM0YzRjNGICAgICAvKiBVbmtub3duIG5hbWUgaXMgICI/Pz8/IiAqLworI2RlZmluZSBBQ1BJX1JPT1RfTkFNRSAgICAgICAgICAodTMyKSAweDVGNUY1RjVDICAgICAvKiBSb290IG5hbWUgaXMgICAgICJcX19fIiAqLworI2RlZmluZSBBQ1BJX1NZU19CVVNfTkFNRSAgICAgICAodTMyKSAweDVGNTM0MjVGICAgICAvKiBTeXMgYnVzIG5hbWUgaXMgICJfU0JfIiAqLworCisjZGVmaW5lIEFDUElfTlNfUk9PVF9QQVRIICAgICAgICJcXCIKKyNkZWZpbmUgQUNQSV9OU19TWVNURU1fQlVTICAgICAgIl9TQl8iCisKKworI2VuZGlmICAvKiBfX0FDTkFNRVNfSF9fICAqLworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKaW5kZXggOGIzY2RjMy4uZDFiM2NlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKQEAgLTU3LDE3ICs1Nyw2IEBACiAjZGVmaW5lIEFDUElfTlNfTkVXU0NPUEUgICAgICAgICAgICAxICAgLyogYSBkZWZpbml0aW9uIG9mIHRoaXMgdHlwZSBvcGVucyBhIG5hbWUgc2NvcGUgKi8KICNkZWZpbmUgQUNQSV9OU19MT0NBTCAgICAgICAgICAgICAgIDIgICAvKiBzdXBwcmVzcyBzZWFyY2ggb2YgZW5jbG9zaW5nIHNjb3BlcyAqLwogCi0KLS8qIERlZmluaXRpb25zIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzcGFjZSBuYW1lcyAgKi8KLQotI2RlZmluZSBBQ1BJX1VOS05PV05fTkFNRSAgICAgICAgICAgKHUzMikgMHgzRjNGM0YzRiAgICAgLyogVW5rbm93biBuYW1lIGlzICAiPz8/PyIgKi8KLSNkZWZpbmUgQUNQSV9ST09UX05BTUUgICAgICAgICAgICAgICh1MzIpIDB4NUY1RjVGNUMgICAgIC8qIFJvb3QgbmFtZSBpcyAgICAgIlxfX18iICovCi0jZGVmaW5lIEFDUElfU1lTX0JVU19OQU1FICAgICAgICAgICAodTMyKSAweDVGNTM0MjVGICAgICAvKiBTeXMgYnVzIG5hbWUgaXMgICJfU0JfIiAqLwotCi0jZGVmaW5lIEFDUElfTlNfUk9PVF9QQVRIICAgICAgICAgICAiXFwiCi0jZGVmaW5lIEFDUElfTlNfU1lTVEVNX0JVUyAgICAgICAgICAiX1NCXyIKLQotCiAvKiBGbGFncyBmb3IgYWNwaV9uc19sb29rdXAsIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlciAqLwogCiAjZGVmaW5lIEFDUElfTlNfTk9fVVBTRUFSQ0ggICAgICAgICAwCkBAIC04MCwxMCArNjksOSBAQAogI2RlZmluZSBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLICAgICAgRkFMU0UKIAogCi1hY3BpX3N0YXR1cwotYWNwaV9uc19sb2FkX25hbWVzcGFjZSAoCi0Jdm9pZCk7Ci0KKy8qCisgKiBuc2luaXQgLSBOYW1lc3BhY2UgaW5pdGlhbGl6YXRpb24KKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzICgKIAl2b2lkKTsKQEAgLTkzLDIzICs4MSwyMiBAQAogCXZvaWQpOwogCiAKLS8qIE5hbWVzcGFjZSBpbml0IC0gbnN4ZmluaXQgKi8KKy8qCisgKiBuc2xvYWQgLSAgTmFtZXNwYWNlIGxvYWRpbmcKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfbnNfbG9hZF9uYW1lc3BhY2UgKAorCXZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19pbml0X29uZV9kZXZpY2UgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfaW5pdF9vbmVfb2JqZWN0ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworYWNwaV9uc19sb2FkX3RhYmxlICgKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjLAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwogCiAKKy8qCisgKiBuc3dhbGsgLSB3YWxrIHRoZSBuYW1lc3BhY2UKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKQEAgLTEyNiwzNyArMTEzLDI0IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50LAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmNoaWxkKTsKIAotdm9pZAotYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkKTsKIAotCi0vKiBOYW1lc3BhY2UgbG9hZGluZyAtIG5zbG9hZCAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYyk7Ci0KKy8qCisgKiBuc3BhcnNlIC0gdGFibGUgcGFyc2luZworICovCiBhY3BpX3N0YXR1cwogYWNwaV9uc19wYXJzZV90YWJsZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzY29wZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKTsKK2FjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfbnVtYmVyLAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MpOwogCiAKIC8qCi0gKiBUb3AtbGV2ZWwgbmFtZXNwYWNlIGFjY2VzcyAtIG5zYWNjZXNzCisgKiBuc2FjY2VzcyAtIFRvcC1sZXZlbCBuYW1lc3BhY2UgYWNjZXNzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfbnNfcm9vdF9pbml0aWFsaXplICgKIAl2b2lkKTsKQEAgLTE3Myw5ICsxNDcsOCBAQAogCiAKIC8qCi0gKiBOYW1lZCBvYmplY3QgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gLSBuc2FsbG9jCisgKiBuc2FsbG9jIC0gTmFtZWQgb2JqZWN0IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCiAgKi8KLQogc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgogYWNwaV9uc19jcmVhdGVfbm9kZSAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKQEAgLTE4OSw2ICsxNjIsMTAgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfaGFuZGxlKTsKIAogdm9pZAorYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkKTsKKwordm9pZAogYWNwaV9uc19kZXRhY2hfb2JqZWN0ICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKIApAQCAtMjAxLDM2ICsxNzgsMTYgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMSwKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMik7CiAKLXZvaWQKLWFjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Ci0KIAogLyoKLSAqIE5hbWVzcGFjZSBtb2RpZmljYXRpb24gLSBuc21vZGlmeQorICogbnNkdW1wIC0gTmFtZXNwYWNlIGR1bXAvcHJpbnQgdXRpbGl0aWVzCiAgKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9uc191bmxvYWRfbmFtZXNwYWNlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2RlbGV0ZV9zdWJ0cmVlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSk7Ci0jZW5kaWYKLQotCi0vKgotICogTmFtZXNwYWNlIGR1bXAvcHJpbnQgdXRpbGl0aWVzIC0gbnNkdW1wCi0gKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHZvaWQKIGFjcGlfbnNfZHVtcF90YWJsZXMgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX2Jhc2UsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVwdGgpOwotI2VuZGlmCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogdm9pZAogYWNwaV9uc19kdW1wX2VudHJ5ICgKQEAgLTI0OSwxOSArMjA2LDYgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZWdtZW50cywKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSk7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi12b2lkCi1hY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzICgKLQl2b2lkKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9uc19kdW1wX29uZV9vYmplY3QgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKQEAgLTI2OSw3ICsyMTMsNyBAQAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCiBhY3BpX25zX2R1bXBfb2JqZWN0cyAoCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLApAQCAtMjc3LDEzICsyMjEsMTIgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmRlcl9pZCwKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAKIC8qCi0gKiBOYW1lc3BhY2UgZXZhbHVhdGlvbiBmdW5jdGlvbnMgLSBuc2V2YWwKKyAqIG5zZXZhbCAtIE5hbWVzcGFjZSBldmFsdWF0aW9uIGZ1bmN0aW9ucwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSAoCiAJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CkBAIC0yOTgsNDAgKzI0MSwxNCBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGhuYW1lLAogCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOwogCi1hY3BpX3N0YXR1cwotYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X29iamVjdF92YWx1ZSAoCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7Ci0KIAogLyoKLSAqIFBhcmVudC9DaGlsZC9QZWVyIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBuc25hbWVzIC0gTmFtZSBhbmQgU2NvcGUgbWFuaXB1bGF0aW9uCiAgKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX25hbWUKLWFjcGlfbnNfZmluZF9wYXJlbnRfbmFtZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZV90b19zZWFyY2gpOwotI2VuZGlmCi0KLQotLyoKLSAqIE5hbWUgYW5kIFNjb3BlIG1hbmlwdWxhdGlvbiAtIG5zbmFtZXMKLSAqLwotCiB1MzIKIGFjcGlfbnNfb3BlbnNfc2NvcGUgKAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSk7CiAKLXZvaWQKLWFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9idWZmZXIpOwotCiBjaGFyICoKIGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKQEAgLTM2Myw5ICsyODAsOCBAQAogCiAKIC8qCi0gKiBPYmplY3QgbWFuYWdlbWVudCBmb3IgbmFtZXNwYWNlIG5vZGVzIC0gbnNvYmplY3QKKyAqIG5zb2JqZWN0IC0gT2JqZWN0IG1hbmFnZW1lbnQgZm9yIG5hbWVzcGFjZSBub2RlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX25zX2F0dGFjaF9vYmplY3QgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCkBAIC0zOTksOSArMzE1LDggQEAKIAogCiAvKgotICogTmFtZXNwYWNlIHNlYXJjaGluZyBhbmQgZW50cnkgLSBuc3NlYXJjaAorICogbnNzZWFyY2ggLSBOYW1lc3BhY2Ugc2VhcmNoaW5nIGFuZCBlbnRyeQogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbmFtZSwKQEAgLTQyOCwxNyArMzQzLDEyIEBACiAKIAogLyoKLSAqIFV0aWxpdHkgZnVuY3Rpb25zIC0gbnN1dGlscworICogbnN1dGlscyAtIFV0aWxpdHkgZnVuY3Rpb25zCiAgKi8KLQogdTgKIGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXggKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKIAotdTgKLWFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwKTsKLQogYWNwaV9vYmplY3RfdHlwZQogYWNwaV9uc19nZXRfdHlwZSAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CkBAIC01MTEsNSArNDIxLDQgQEAKIGFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZSAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CiAKLQogI2VuZGlmIC8qIF9fQUNOQU1FU1BfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaCBiL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCmluZGV4IDAzNjAyM2EuLmUwNzliOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCkBAIC0xMzMsNiArMTMzLDcgQEAKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CiB9OwogCisKIC8qCiAgKiBOb3RlOiBUaGUgU3RyaW5nIGFuZCBCdWZmZXIgb2JqZWN0IG11c3QgYmUgaWRlbnRpY2FsIHRocm91Z2ggdGhlIFBvaW50ZXIKICAqIGVsZW1lbnQuICBUaGVyZSBpcyBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgpAQCAtNDY4LDcgKzQ2OSw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIE9iamVjdCBkZXNjcmlwdG9yIHR5cGVzICovCiAKICNkZWZpbmUgQUNQSV9ERVNDX1RZUEVfQ0FDSEVEICAgICAgICAgICAweDAxICAgICAgICAvKiBVc2VkIG9ubHkgd2hlbiBvYmplY3QgaXMgY2FjaGVkICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaCBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGVjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaApAQCAtMCwwICsxLDMyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6IGFjb3Bjb2RlLmggLSBBTUwgb3Bjb2RlIGluZm9ybWF0aW9uIGZvciB0aGUgQU1MIHBhcnNlciBhbmQgaW50ZXJwcmV0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX19BQ09QQ09ERV9IX18KKyNkZWZpbmUgX19BQ09QQ09ERV9IX18KKworI2RlZmluZSBNQVhfRVhURU5ERURfT1BDT0RFICAgICAgICAgMHg4OAorI2RlZmluZSBOVU1fRVhURU5ERURfT1BDT0RFICAgICAgICAgKE1BWF9FWFRFTkRFRF9PUENPREUgKyAxKQorI2RlZmluZSBNQVhfSU5URVJOQUxfT1BDT0RFCisjZGVmaW5lIE5VTV9JTlRFUk5BTF9PUENPREUgICAgICAgICAoTUFYX0lOVEVSTkFMX09QQ09ERSArIDEpCisKKy8qIFVzZWQgZm9yIG5vbi1hc3NpZ25lZCBvcGNvZGVzICovCisKKyNkZWZpbmUgX1VOSyAgICAgICAgICAgICAgICAgICAgICAgIDB4NkIKKworLyoKKyAqIFJlc2VydmVkIEFTQ0lJIGNoYXJhY3RlcnMuICBEbyBub3QgdXNlIGFueSBvZiB0aGVzZSBmb3IKKyAqIGludGVybmFsIG9wY29kZXMsIHNpbmNlIHRoZXkgYXJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZQorICogbmFtZSBzdHJpbmdzIGZyb20gQU1MIG9wY29kZXMKKyAqLworI2RlZmluZSBfQVNDICAgICAgICAgICAgICAgICAgICAgICAgMHg2QworI2RlZmluZSBfTkFNICAgICAgICAgICAgICAgICAgICAgICAgMHg2QworI2RlZmluZSBfUEZYICAgICAgICAgICAgICAgICAgICAgICAgMHg2RAorCisKKy8qCisgKiBBbGwgQU1MIG9wY29kZXMgYW5kIHRoZSBwYXJzZS10aW1lIGFyZ3VtZW50cyBmb3IgZWFjaC4gIFVzZWQgYnkgdGhlIEFNTAorICogcGFyc2VyICBFYWNoIGxpc3QgaXMgY29tcHJlc3NlZCBpbnRvIGEgMzItYml0IG51bWJlciBhbmQgc3RvcmVkIGluIHRoZQorICogbWFzdGVyIG9wY29kZSB0YWJsZSAoaW4gcHNvcGNvZGUuYykuCisgKi8KKyNkZWZpbmUgQVJHUF9BQ0NFU1NGSUVMRF9PUCAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCisjZGVmaW5lIEFSR1BfQUNRVUlSRV9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1dPUkREQVRBKQorI2RlZmluZSBBUkdQX0FERF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9BTElBU19PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUVTVFJJTkcsIEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9BUkcwICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0FSRzEgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQVJHMiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9BUkczICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0FSRzQgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQVJHNSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9BUkc2ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0JBTktfRklFTERfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FU1RSSU5HLCAgICBBUkdQX05BTUVTVFJJTkcsQVJHUF9URVJNQVJHLCAgIEFSR1BfQllURURBVEEsICBBUkdQX0ZJRUxETElTVCkKKyNkZWZpbmUgQVJHUF9CSVRfQU5EX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfQklUX05BTkRfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0JJVF9OT1JfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9CSVRfTk9UX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0JJVF9PUl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9CSVRfWE9SX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfQlJFQUtfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9CUkVBS19QT0lOVF9PUCAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0JVRkZFUl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX0JZVEVMSVNUKQorI2RlZmluZSBBUkdQX0JZVEVfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfQllURURBVEEpCisjZGVmaW5lIEFSR1BfQllURUxJU1RfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQorI2RlZmluZSBBUkdQX0NPTkNBVF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9DT05DQVRfUkVTX09QICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfQ09ORF9SRUZfT0ZfT1AgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9DT05USU5VRV9PUCAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0NPUFlfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9TSU1QTEVOQU1FKQorI2RlZmluZSBBUkdQX0NSRUFURV9CSVRfRklFTERfT1AgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCisjZGVmaW5lIEFSR1BfQ1JFQVRFX0JZVEVfRklFTERfT1AgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9DUkVBVEVfRFdPUkRfRklFTERfT1AgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQorI2RlZmluZSBBUkdQX0NSRUFURV9GSUVMRF9PUCAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9OQU1FKQorI2RlZmluZSBBUkdQX0NSRUFURV9RV09SRF9GSUVMRF9PUCAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCisjZGVmaW5lIEFSR1BfQ1JFQVRFX1dPUkRfRklFTERfT1AgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9EQVRBX1JFR0lPTl9PUCAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX05BTUUsICAgICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9ERUJVR19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0RFQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX0RFUkVGX09GX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9ERVZJQ0VfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9PQkpMSVNUKQorI2RlZmluZSBBUkdQX0RJVklERV9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCwgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfRFdPUkRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9EV09SRERBVEEpCisjZGVmaW5lIEFSR1BfRUxTRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1MSVNUKQorI2RlZmluZSBBUkdQX0VWRU5UX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9GQVRBTF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX0JZVEVEQVRBLCAgIEFSR1BfRFdPUkREQVRBLCAgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0ZJRUxEX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FU1RSSU5HLCAgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9GSUVMRExJU1QpCisjZGVmaW5lIEFSR1BfRklORF9TRVRfTEVGVF9CSVRfT1AgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9GSU5EX1NFVF9SSUdIVF9CSVRfT1AgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0ZST01fQkNEX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfSUZfT1AgICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUxJU1QpCisjZGVmaW5lIEFSR1BfSU5DUkVNRU5UX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfSU5ERVhfRklFTERfT1AgICAgICAgICAgICAgQVJHUF9MSVNUNSAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUVTVFJJTkcsICAgIEFSR1BfTkFNRVNUUklORyxBUkdQX0JZVEVEQVRBLCAgQVJHUF9GSUVMRExJU1QpCisjZGVmaW5lIEFSR1BfSU5ERVhfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0xBTkRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xFUVVBTF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xHUkVBVEVSX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xHUkVBVEVSRVFVQUxfT1AgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xMRVNTX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xMRVNTRVFVQUxfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xOT1RfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9MTk9URVFVQUxfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9MT0FEX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUVTVFJJTkcsIEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX0xPQURfVEFCTEVfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9URVJNQVJHLCAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9MT0NBTDAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0xPQ0FMMSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9DQUwyICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9MT0NBTDMgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0xPQ0FMNCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9DQUw1ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9MT0NBTDYgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0xPQ0FMNyAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9SX09QICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfTUFUQ0hfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX0JZVEVEQVRBLCAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9NRVRIT0RfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfVEVSTUxJU1QpCisjZGVmaW5lIEFSR1BfTUVUSE9EQ0FMTF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQorI2RlZmluZSBBUkdQX01JRF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfTU9EX09QICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX01VTFRJUExZX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9NVVRFWF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUUsICAgICAgIEFSR1BfQllURURBVEEpCisjZGVmaW5lIEFSR1BfTkFNRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FLCAgICAgICBBUkdQX0RBVEFPQkopCisjZGVmaW5lIEFSR1BfTkFNRURGSUVMRF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQorI2RlZmluZSBBUkdQX05BTUVQQVRIX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKKyNkZWZpbmUgQVJHUF9OT09QX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX05PVElGWV9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX09ORV9PUCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfT05FU19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9QQUNLQUdFX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfQllURURBVEEsICAgICAgQVJHUF9EQVRBT0JKTElTVCkKKyNkZWZpbmUgQVJHUF9QT1dFUl9SRVNfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1Q1IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfV09SRERBVEEsICBBUkdQX09CSkxJU1QpCisjZGVmaW5lIEFSR1BfUFJPQ0VTU09SX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUNiAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfQllURURBVEEsICBBUkdQX0RXT1JEREFUQSwgQVJHUF9CWVRFREFUQSwgIEFSR1BfT0JKTElTVCkKKyNkZWZpbmUgQVJHUF9RV09SRF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1FXT1JEREFUQSkKKyNkZWZpbmUgQVJHUF9SRUZfT0ZfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9SRUdJT05fT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX05BTUUsICAgICAgIEFSR1BfQllURURBVEEsICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9SRUxFQVNFX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9SRVNFUlZFREZJRUxEX09QICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCisjZGVmaW5lIEFSR1BfUkVTRVRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfUkVUVVJOX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX1JFVklTSU9OX09QICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfU0NPUEVfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfVEVSTUxJU1QpCisjZGVmaW5lIEFSR1BfU0hJRlRfTEVGVF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1NISUZUX1JJR0hUX09QICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9TSUdOQUxfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9TSVpFX09GX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9TTEVFUF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfU1RBTExfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX1NUQVRJQ1NUUklOR19PUCAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKKyNkZWZpbmUgQVJHUF9TVE9SRV9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1NUUklOR19PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfQ0hBUkxJU1QpCisjZGVmaW5lIEFSR1BfU1VCVFJBQ1RfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RIRVJNQUxfWk9ORV9PUCAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX09CSkxJU1QpCisjZGVmaW5lIEFSR1BfVElNRVJfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9UT19CQ0RfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RPX0JVRkZFUl9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfVE9fREVDX1NUUl9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9UT19IRVhfU1RSX09QICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RPX0lOVEVHRVJfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfVE9fU1RSSU5HX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RZUEVfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1VOTE9BRF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1ZBUl9QQUNLQUdFX09QICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX0RBVEFPQkpMSVNUKQorI2RlZmluZSBBUkdQX1dBSVRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX1dISUxFX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1MSVNUKQorI2RlZmluZSBBUkdQX1dPUkRfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfV09SRERBVEEpCisjZGVmaW5lIEFSR1BfWkVST19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKworCisvKgorICogQWxsIEFNTCBvcGNvZGVzIGFuZCB0aGUgcnVudGltZSBhcmd1bWVudHMgZm9yIGVhY2guICBVc2VkIGJ5IHRoZSBBTUwKKyAqIGludGVycHJldGVyICBFYWNoIGxpc3QgaXMgY29tcHJlc3NlZCBpbnRvIGEgMzItYml0IG51bWJlciBhbmQgc3RvcmVkCisgKiBpbiB0aGUgbWFzdGVyIG9wY29kZSB0YWJsZSAoaW4gcHNvcGNvZGUuYykuCisgKgorICogKFVzZWQgYnkgcHJlcF9vcGVyYW5kcyBwcm9jZWR1cmUgYW5kIHRoZSBBU0wgQ29tcGlsZXIpCisgKi8KKyNkZWZpbmUgQVJHSV9BQ0NFU1NGSUVMRF9PUCAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfQUNRVUlSRV9PUCAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9NVVRFWCwgICAgICBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfQUREX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0FMSUFTX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9BUkcwICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0FSRzEgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfQVJHMiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9BUkczICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0FSRzQgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfQVJHNSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9BUkc2ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0JBTktfRklFTERfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9CSVRfQU5EX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQklUX05BTkRfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0JJVF9OT1JfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9CSVRfTk9UX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0JJVF9PUl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9CSVRfWE9SX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQlJFQUtfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9CUkVBS19QT0lOVF9PUCAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0JVRkZFUl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9CWVRFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfQllURUxJU1RfT1AgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0NPTkNBVF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9DT01QVVRFREFUQSwgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9DT05DQVRfUkVTX09QICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfQlVGRkVSLCAgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQ09ORF9SRUZfT0ZfT1AgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9PQkpFQ1RfUkVGLCBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9DT05USU5VRV9PUCAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfQ09QWV9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9BTllUWVBFLCAgICBBUkdJX1NJTVBMRV9UQVJHRVQpCisjZGVmaW5lIEFSR0lfQ1JFQVRFX0JJVF9GSUVMRF9PUCAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQorI2RlZmluZSBBUkdJX0NSRUFURV9CWVRFX0ZJRUxEX09QICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1JFRkVSRU5DRSkKKyNkZWZpbmUgQVJHSV9DUkVBVEVfRFdPUkRfRklFTERfT1AgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCisjZGVmaW5lIEFSR0lfQ1JFQVRFX0ZJRUxEX09QICAgICAgICAgICAgQVJHSV9MSVNUNCAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfSU5URUdFUiwgICAgICBBUkdJX1JFRkVSRU5DRSkKKyNkZWZpbmUgQVJHSV9DUkVBVEVfUVdPUkRfRklFTERfT1AgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCisjZGVmaW5lIEFSR0lfQ1JFQVRFX1dPUkRfRklFTERfT1AgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQorI2RlZmluZSBBUkdJX0RBVEFfUkVHSU9OX09QICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfU1RSSU5HLCAgICAgQVJHSV9TVFJJTkcsICAgICAgICBBUkdJX1NUUklORykKKyNkZWZpbmUgQVJHSV9ERUJVR19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0RFQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUl9SRUYpCisjZGVmaW5lIEFSR0lfREVSRUZfT0ZfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9SRUZfT1JfU1RSSU5HKQorI2RlZmluZSBBUkdJX0RFVklDRV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9ESVZJREVfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1Q0IChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0RXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9FTFNFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfRVZFTlRfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0ZBVEFMX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfRklFTERfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9GUk9NX0JDRF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0lGX09QICAgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9JTkNSRU1FTlRfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVJfUkVGKQorI2RlZmluZSBBUkdJX0lOREVYX0ZJRUxEX09QICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9JTkRFWF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0NPTVBMRVhPQkosIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfTEFORF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfTEVRVUFMX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQorI2RlZmluZSBBUkdJX0xHUkVBVEVSX09QICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9DT01QVVRFREFUQSkKKyNkZWZpbmUgQVJHSV9MR1JFQVRFUkVRVUFMX09QICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfTExFU1NfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQorI2RlZmluZSBBUkdJX0xMRVNTRVFVQUxfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9MTk9UX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfTE5PVEVRVUFMX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0xPQURfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfUkVHSU9OX09SX0ZJRUxELEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0xPQURfVEFCTEVfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDYgKEFSR0lfU1RSSU5HLCAgICAgQVJHSV9TVFJJTkcsICAgICAgICBBUkdJX1NUUklORywgICAgICAgQVJHSV9TVFJJTkcsICAgIEFSR0lfU1RSSU5HLCBBUkdJX0FOWVRZUEUpCisjZGVmaW5lIEFSR0lfTE9DQUwwICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9MT0NBTDEgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPQ0FMMiAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfTE9DQUwzICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9MT0NBTDQgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPQ0FMNSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfTE9DQUw2ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9MT0NBTDcgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPUl9PUCAgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX01BVENIX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDYgKEFSR0lfUEFDS0FHRSwgICAgQVJHSV9JTlRFR0VSLCAgIEFSR0lfQ09NUFVURURBVEEsICAgICAgQVJHSV9JTlRFR0VSLEFSR0lfQ09NUFVURURBVEEsQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX01FVEhPRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9NRVRIT0RDQUxMX09QICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfTUlEX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUNCAoQVJHSV9CVUZGRVJfT1JfU1RSSU5HLEFSR0lfSU5URUdFUiwgIEFSR0lfSU5URUdFUiwgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9NT0RfT1AgICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfTVVMVElQTFlfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX01VVEVYX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9OQU1FX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfTkFNRURGSUVMRF9PUCAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX05BTUVQQVRIX09QICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9OT09QX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX05PVElGWV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfREVWSUNFX1JFRiwgQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX09ORV9PUCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfT05FU19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9QQUNLQUdFX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfUE9XRVJfUkVTX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1BST0NFU1NPUl9PUCAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9RV09SRF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfUkVGX09GX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9PQkpFQ1RfUkVGKQorI2RlZmluZSBBUkdJX1JFR0lPTl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX1JFTEVBU0VfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfTVVURVgpCisjZGVmaW5lIEFSR0lfUkVTRVJWRURGSUVMRF9PUCAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1JFU0VUX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfRVZFTlQpCisjZGVmaW5lIEFSR0lfUkVUVVJOX09QICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1JFVklTSU9OX09QICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfU0NPUEVfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1NISUZUX0xFRlRfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9TSElGVF9SSUdIVF9PUCAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfU0lHTkFMX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9FVkVOVCkKKyNkZWZpbmUgQVJHSV9TSVpFX09GX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0RBVEFPQkpFQ1QpCisjZGVmaW5lIEFSR0lfU0xFRVBfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX1NUQUxMX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9TVEFUSUNTVFJJTkdfT1AgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfU1RPUkVfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9EQVRBUkVGT0JKLCBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9TVFJJTkdfT1AgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfU1VCVFJBQ1RfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX1RIRVJNQUxfWk9ORV9PUCAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9USU1FUl9PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX1RPX0JDRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9GSVhFRF9UQVJHRVQpCisjZGVmaW5lIEFSR0lfVE9fQlVGRkVSX09QICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKKyNkZWZpbmUgQVJHSV9UT19ERUNfU1RSX09QICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfRklYRURfVEFSR0VUKQorI2RlZmluZSBBUkdJX1RPX0hFWF9TVFJfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9GSVhFRF9UQVJHRVQpCisjZGVmaW5lIEFSR0lfVE9fSU5URUdFUl9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKKyNkZWZpbmUgQVJHSV9UT19TVFJJTkdfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9GSVhFRF9UQVJHRVQpCisjZGVmaW5lIEFSR0lfVFlQRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9BTllUWVBFKQorI2RlZmluZSBBUkdJX1VOTE9BRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfRERCSEFORExFKQorI2RlZmluZSBBUkdJX1ZBUl9QQUNLQUdFX09QICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9XQUlUX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0VWRU5ULCAgICAgIEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9XSElMRV9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfV09SRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisKKyNlbmRpZiAvKiBfX0FDT1BDT0RFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmggYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAppbmRleCBjMDM5NWVmLi42OTgyNzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaApAQCAtNjQsOCArNjQsMTcgQEAKIAogI2RlZmluZSBBQ1BJX1BBUlNFX0RFRkVSUkVEX09QICAgICAgICAgIDB4MDEwMAogCi0vKiBQYXJzZXIgZXh0ZXJuYWwgaW50ZXJmYWNlcyAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUGFyc2VyIGludGVyZmFjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIHBzeGZhY2UgLSBQYXJzZXIgZXh0ZXJuYWwgaW50ZXJmYWNlcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9wc3hfbG9hZF90YWJsZSAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGNvZGVfYWRkciwKQEAgLTc2LDIzICs4NSwxMyBAQAogCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBQYXJzZXIgaW50ZXJmYWNlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBwc2FyZ3MgLSBQYXJzZSBBTUwgb3Bjb2RlIGFyZ3VtZW50cyAqLwotCisvKgorICogcHNhcmdzIC0gUGFyc2UgQU1MIG9wY29kZSBhcmd1bWVudHMKKyAqLwogdTggKgogYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZCAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKIAotdTMyCi1hY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOwotCiBjaGFyICoKIGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKQEAgLTExMCwxMCArMTA5LDYgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcsCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCk7CiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X25leHRfZmllbGQgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSk7Ci0KIGFjcGlfc3RhdHVzCiBhY3BpX3BzX2dldF9uZXh0X2FyZyAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTEyMiw4ICsxMTcsOSBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipyZXR1cm5fYXJnKTsKIAogCi0vKiBwc2ZpbmQgKi8KLQorLyoKKyAqIHBzZmluZAorICovCiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCiBhY3BpX3BzX2ZpbmRfbmFtZSAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqc2NvcGUsCkBAIC0xMzUsOCArMTMxLDkgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKIAotLyogcHNvcGNvZGUgLSBBTUwgT3Bjb2RlIGluZm9ybWF0aW9uICovCi0KKy8qCisgKiBwc29wY29kZSAtIEFNTCBPcGNvZGUgaW5mb3JtYXRpb24KKyAqLwogY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKgogYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKQEAgLTE0Niw1NiArMTQzLDI1IEBACiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwogCiAKLS8qIHBzcGFyc2UgLSB0b3AgbGV2ZWwgcGFyc2luZyByb3V0aW5lcyAqLwotCi11MzIKLWFjcGlfcHNfZ2V0X29wY29kZV9zaXplICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7Ci0KLXZvaWQKLWFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9wc19maW5kX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3V0X29wKTsKLQotdm9pZAotYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX3BhcnNlX2xvb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCisvKgorICogcHNwYXJzZSAtIHRvcCBsZXZlbCBwYXJzaW5nIHJvdXRpbmVzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX3BzX3BhcnNlX2FtbCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3BzX3BhcnNlX3RhYmxlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWwsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfc2l6ZSwKLQlhY3BpX3BhcnNlX2Rvd253YXJkcyAgICAgICAgICAgIGRlc2NlbmRpbmdfY2FsbGJhY2ssCi0JYWNwaV9wYXJzZV91cHdhcmRzICAgICAgICAgICAgICBhc2NlbmRpbmdfY2FsbGJhY2ssCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqKnJvb3Rfb2JqZWN0KTsKK3UzMgorYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKIAogdTE2CiBhY3BpX3BzX3BlZWtfb3Bjb2RlICgKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpzdGF0ZSk7CiAKIAotLyogcHNzY29wZSAtIFNjb3BlIHN0YWNrIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KLQotCisvKgorICogcHNzY29wZSAtIFNjb3BlIHN0YWNrIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfcHNfaW5pdF9zY29wZSAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLApAQCAtMjI4LDggKzE5NCw5IEBACiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqc3RhdGUpOwogCiAKLS8qIHBzdHJlZSAtIHBhcnNlIHRyZWUgbWFuaXB1bGF0aW9uIHJvdXRpbmVzICovCi0KKy8qCisgKiBwc3RyZWUgLSBwYXJzZSB0cmVlIG1hbmlwdWxhdGlvbiByb3V0aW5lcworICovCiB2b2lkCiBhY3BpX3BzX2FwcGVuZF9hcmcoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCkBAIC0yNDcsMjAgKzIxNCwxNyBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ24pOwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X2NoaWxkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgogYWNwaV9wc19nZXRfZGVwdGhfbmV4dCAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3JpZ2luLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIAotLyogcHN3YWxrIC0gcGFyc2UgdHJlZSB3YWxrIHJvdXRpbmVzICovCi0KKy8qCisgKiBwc3dhbGsgLSBwYXJzZSB0cmVlIHdhbGsgcm91dGluZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfcHNfd2Fsa19wYXJzZWRfYW1sICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpzdGFydF9vcCwKQEAgLTI4Myw5ICsyNDcsMTQgQEAKIGFjcGlfcHNfZGVsZXRlX2NvbXBsZXRlZF9vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKK3ZvaWQKK2FjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnJvb3QpOwogCi0vKiBwc3V0aWxzIC0gcGFyc2VyIHV0aWxpdGllcyAqLwogCisvKgorICogcHN1dGlscyAtIHBhcnNlciB1dGlsaXRpZXMKKyAqLwogdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgogYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AgKAogCXZvaWQpOwpAQCAtMzAzLDEyICsyNzIsNiBAQAogYWNwaV9wc19mcmVlX29wICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLXZvaWQKLWFjcGlfcHNfZGVsZXRlX3BhcnNlX2NhY2hlICgKLQl2b2lkKTsKLSNlbmRpZgotCiB1OAogYWNwaV9wc19pc19sZWFkaW5nX2NoYXIgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyk7CkBAIC0zMTcsMjAgKzI4MCwyNyBAQAogYWNwaV9wc19pc19wcmVmaXhfY2hhciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHUzMgogYWNwaV9wc19nZXRfbmFtZSgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiB2b2lkCiBhY3BpX3BzX3NldF9uYW1lKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAKKyNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKK3ZvaWQKK2FjcGlfcHNfZGVsZXRlX3BhcnNlX2NhY2hlICgKKwl2b2lkKTsKKyNlbmRpZgogCi0vKiBwc2R1bXAgLSBkaXNwbGF5IHBhcnNlciB0cmVlICovCiAKKy8qCisgKiBwc2R1bXAgLSBkaXNwbGF5IHBhcnNlciB0cmVlCisgKi8KIHUzMgogYWNwaV9wc19zcHJpbnRfcGF0aCAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3N0YXJ0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGkuaCBiL2luY2x1ZGUvYWNwaS9hY3BpLmgKaW5kZXggYWQ1MzI1Mi4uYTY5ZDc4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGkuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaS5oCkBAIC00OSw2ICs0OSw3IEBACiAgKiBXZSBwdXQgdGhlbSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdXBsaWNhdGUgdGhlbQogICogaW4gdGhlIHJlc3Qgb2YgdGhlIHNvdXJjZSBjb2RlIGFnYWluIGFuZCBhZ2Fpbi4KICAqLworI2luY2x1ZGUgImFjbmFtZXMuaCIgICAgICAgICAgICAvKiBHbG9iYWwgQUNQSSBuYW1lcyBhbmQgc3RyaW5ncyAqLwogI2luY2x1ZGUgImFjY29uZmlnLmgiICAgICAgICAgICAvKiBDb25maWd1cmF0aW9uIGNvbnN0YW50cyAqLwogI2luY2x1ZGUgInBsYXRmb3JtL2FjZW52LmgiICAgICAvKiBUYXJnZXQgZW52aXJvbm1lbnQgc3BlY2lmaWMgaXRlbXMgKi8KICNpbmNsdWRlICJhY3R5cGVzLmgiICAgICAgICAgICAgLyogRnVuZGFtZW50YWwgY29tbW9uIGRhdGEgdHlwZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggOWFkMTQyNC4uOGQwZTEyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTM1MSw2ICszNTEsMjcgQEAKIGludCBhY3BpX2NyZWF0ZV9kaXIoc3RydWN0IGFjcGlfZGV2aWNlICopOwogdm9pZCBhY3BpX3JlbW92ZV9kaXIoc3RydWN0IGFjcGlfZGV2aWNlICopOwogCisKKy8qCisgKiBCaW5kIHBoeXNpY2FsIGRldmljZXMgd2l0aCBBQ1BJIGRldmljZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorc3RydWN0IGFjcGlfYnVzX3R5cGUgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgYnVzX3R5cGUJCSpidXM7CisJLyogRm9yIGdlbmVyYWwgZGV2aWNlcyB1bmRlciB0aGUgYnVzKi8KKwlpbnQgKCpmaW5kX2RldmljZSkoc3RydWN0IGRldmljZSAqLCBhY3BpX2hhbmRsZSopOworCS8qIEZvciBicmlkZ2VzLCBzdWNoIGFzIFBDSSByb290IGJyaWRnZSwgSURFIGNvbnRyb2xsZXIgKi8KKwlpbnQgKCpmaW5kX2JyaWRnZSkoc3RydWN0IGRldmljZSAqLCBhY3BpX2hhbmRsZSAqKTsKK307CitpbnQgcmVnaXN0ZXJfYWNwaV9idXNfdHlwZShzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqKTsKK2ludCB1bnJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoc3RydWN0IGFjcGlfYnVzX3R5cGUgKik7CitzdHJ1Y3QgZGV2aWNlICphY3BpX2dldF9waHlzaWNhbF9kZXZpY2UoYWNwaV9oYW5kbGUpOworLyogaGVscGVyICovCithY3BpX2hhbmRsZSBhY3BpX2dldF9jaGlsZChhY3BpX2hhbmRsZSwgYWNwaV9pbnRlZ2VyKTsKK2FjcGlfaGFuZGxlIGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisjZGVmaW5lIERFVklDRV9BQ1BJX0hBTkRMRShkZXYpICgoYWNwaV9oYW5kbGUpKChkZXYpLT5maXJtd2FyZV9kYXRhKSkKKwogI2VuZGlmIC8qQ09ORklHX0FDUElfQlVTKi8KIAogI2VuZGlmIC8qX19BQ1BJX0JVU19IX18qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCmluZGV4IDRlYzcyMmQuLmNhZWFhNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKQEAgLTEwOSw1ICsxMDksMTAgQEAKIAogaW50IGFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpOwogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG90IEtleXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBpbnQgYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZDsKIAogI2VuZGlmIC8qX19BQ1BJX0RSSVZFUlNfSF9fKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKaW5kZXggODU3YzgwNy4uZWE0ODlmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKQEAgLTc5LDcgKzc5LDYgQEAKIC8qCiAgKiBPU0wgSW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duIHByaW1pdGl2ZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc19pbml0aWFsaXplICgKIAl2b2lkKTsKQEAgLTkyLDcgKzkxLDYgQEAKIC8qCiAgKiBBQ1BJIFRhYmxlIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLApAQCAtMTEyLDcgKzExMCw2IEBACiAvKgogICogU3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF91bml0cywKQEAgLTE1Niw3ICsxNTMsNiBAQAogLyoKICAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBtYXBwaW5nCiAgKi8KLQogdm9pZCAqCiBhY3BpX29zX2FsbG9jYXRlICgKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwpAQCAtMTg3LDcgKzE4Myw2IEBACiAvKgogICogSW50ZXJydXB0IGhhbmRsZXJzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfaW5zdGFsbF9pbnRlcnJ1cHRfaGFuZGxlciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2ksCkBAIC0yMDMsNyArMTk4LDYgQEAKIC8qCiAgKiBUaHJlYWRzIGFuZCBTY2hlZHVsaW5nCiAgKi8KLQogdTMyCiBhY3BpX29zX2dldF90aHJlYWRfaWQgKAogCXZvaWQpOwpAQCAtMjM0LDcgKzIyOCw2IEBACiAvKgogICogUGxhdGZvcm0gYW5kIGhhcmR3YXJlLWluZGVwZW5kZW50IEkvTyBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfcmVhZF9wb3J0ICgKIAlhY3BpX2lvX2FkZHJlc3MgICAgICAgICAgICAgICAgIGFkZHJlc3MsCkBAIC0yNTEsNyArMjQ0LDYgQEAKIC8qCiAgKiBQbGF0Zm9ybSBhbmQgaGFyZHdhcmUtaW5kZXBlbmRlbnQgcGh5c2ljYWwgbWVtb3J5IGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc19yZWFkX21lbW9yeSAoCiAJYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLApAQCAtMjcwLDcgKzI2Miw2IEBACiAgKiBOb3RlOiBDYW4ndCB1c2UgIlJlZ2lzdGVyIiBhcyBhIHBhcmFtZXRlciwgY2hhbmdlZCB0byAiUmVnIiAtLQogICogY2VydGFpbiBjb21waWxlcnMgY29tcGxhaW4uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbiAoCiAJc3RydWN0IGFjcGlfcGNpX2lkICAgICAgICAgICAgICAqcGNpX2lkLApAQCAtMjg4LDcgKzI3OSw2IEBACiAvKgogICogSW50ZXJpbSBmdW5jdGlvbiBuZWVkZWQgZm9yIFBDSSBJUlEgcm91dGluZwogICovCi0KIHZvaWQKIGFjcGlfb3NfZGVyaXZlX3BjaV9pZCgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHJoYW5kbGUsCkBAIC0yOTgsNyArMjg4LDYgQEAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzCiAgKi8KLQogdTgKIGFjcGlfb3NfcmVhZGFibGUgKAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvaW50ZXIsCkBAIC0zMjMsNyArMzEyLDYgQEAKIC8qCiAgKiBEZWJ1ZyBwcmludCByb3V0aW5lcwogICovCi0KIHZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKIGFjcGlfb3NfcHJpbnRmICgKIAljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpmb3JtYXQsCkBAIC0zMzksMTEgKzMyNywxMCBAQAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RpbmF0aW9uKTsKIAogCisjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIC8qCiAgKiBEZWJ1ZyBpbnB1dAogICovCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogdTMyCiBhY3BpX29zX2dldF9saW5lICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIpOwpAQCAtMzUzLDcgKzM0MCw2IEBACiAvKgogICogRGlyZWN0b3J5IG1hbmlwdWxhdGlvbgogICovCi0KIHZvaWQgKgogYWNwaV9vc19vcGVuX2RpcmVjdG9yeSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUsCkBAIC0zNzcsNyArMzYzLDYgQEAKIC8qCiAgKiBEZWJ1ZwogICovCi0KIHZvaWQKIGFjcGlfb3NfZGJnX2Fzc2VydCgKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmYWlsZWRfYXNzZXJ0aW9uLApAQCAtMzg1LDUgKzM3MCw0IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlKTsKIAotCiAjZW5kaWYgLyogX19BQ1BJT1NYRl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAppbmRleCAwMGQ3OGI3Li5mOGY2MTlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCkBAIC01MCwxMCArNTAsOSBAQAogI2luY2x1ZGUgImFjdGJsLmgiCiAKIAotIC8qCisvKgogICogR2xvYmFsIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSAoCiAJdm9pZCk7CkBAIC0xMDYsOSArMTA1LDggQEAKICNlbmRpZgogCiAvKgotICogQUNQSSBNZW1vcnkgbWFuYWdlcgorICogQUNQSSBNZW1vcnkgbWFuYWdtZW50CiAgKi8KLQogdm9pZCAqCiBhY3BpX2FsbG9jYXRlICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwpAQCAtMTI1LDcgKzEyMyw2IEBACiAvKgogICogQUNQSSB0YWJsZSBtYW5pcHVsYXRpb24gaW50ZXJmYWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2ZpbmRfcm9vdF9wb2ludGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLApAQCAtMTY4LDcgKzE2NSw2IEBACiAvKgogICogTmFtZXNwYWNlIGFuZCBuYW1lIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV93YWxrX25hbWVzcGFjZSAoCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLApAQCAtMjE4LDcgKzIxNCw2IEBACiAvKgogICogT2JqZWN0IG1hbmlwdWxhdGlvbiBhbmQgZW51bWVyYXRpb24KICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9ldmFsdWF0ZV9vYmplY3QgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LApAQCAtMjYyLDcgKzI1Nyw2IEBACiAvKgogICogRXZlbnQgaGFuZGxlciBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZXZlbnQsCkBAIC0zMTksNyArMzEzLDYgQEAKIC8qCiAgKiBFdmVudCBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayAoCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LApAQCAtNDA0LDcgKzM5Nyw2IEBACiAvKgogICogUmVzb3VyY2UgaW50ZXJmYWNlcwogICovCi0KIHR5cGVkZWYKIGFjcGlfc3RhdHVzICgqQUNQSV9XQUxLX1JFU09VUkNFX0NBTExCQUNLKSAoCiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqcmVzb3VyY2UsCkBAIC00NDgsNyArNDQwLDYgQEAKIC8qCiAgKiBIYXJkd2FyZSAoQUNQSSBkZXZpY2UpIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfcmVnaXN0ZXIgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oIGIvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaAppbmRleCA5M2M1NWZmLi5lZDY3OTI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKQEAgLTQ4LDcgKzQ4LDYgQEAKIC8qCiAgKiAgRnVuY3Rpb24gcHJvdG90eXBlcyBjYWxsZWQgZnJvbSBBY3BpKiBBUElzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YSAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCkBAIC02MCwxMiArNTksMTIgQEAKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAogCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOwotI2VuZGlmCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhICgKQEAgLTk1LDYxICs5NCw5IEBACiAKIAogLyoKLSAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgY2FsbGVkIGZyb20gYWNwaV9yc19jcmVhdGUqCisgKiByc2R1bXAKICAqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi12b2lkCi1hY3BpX3JzX2R1bXBfaXJxICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX2FkZHJlc3MxNiAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF9hZGRyZXNzMzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfYWRkcmVzczY0ICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX2RtYSAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF9pbyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfZml4ZWRfaW8gKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfbWVtb3J5MjQgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfbWVtb3J5MzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWMgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHZvaWQKIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0ICgKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpyZXNvdXJjZSk7CkBAIC0xNTcsOCArMTA0LDEyIEBACiB2b2lkCiBhY3BpX3JzX2R1bXBfaXJxX2xpc3QgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJvdXRlX3RhYmxlKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKKworLyoKKyAqIHJzY2FsYworICovCiBhY3BpX3N0YXR1cwogYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fc3RhcnQgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oIGIvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKaW5kZXggYzk3ODQzZi4uZTZiOWUzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKQEAgLTU2LDcgKzU2LDYgQEAKICAqIFdhbGsgc3RhdGUgLSBjdXJyZW50IHN0YXRlIG9mIGEgcGFyc2UgdHJlZSB3YWxrLiAgVXNlZCBmb3IgYm90aCBhIGxlaXN1cmVseSBzdHJvbGwgdGhyb3VnaAogICogdGhlIHRyZWUgKGZvciB3aGF0ZXZlciByZWFzb24pLCBhbmQgZm9yIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbi4KICAqLwotCiAjZGVmaW5lIEFDUElfTkVYVF9PUF9ET1dOV0FSRCAgICAgICAxCiAjZGVmaW5lIEFDUElfTkVYVF9PUF9VUFdBUkQgICAgICAgICAyCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKaW5kZXggZThmNWQ0Zi4uMzlkZjkyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKQEAgLTUwLDE3ICs1MCw5IEBACiAjZGVmaW5lIFNJWkVfSU5fSEVBREVSICAgICAgICAgIDAKIAogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2hhbmRsZV90b19vYmplY3QgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfaWQsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqKnRhYmxlX2Rlc2MpOwotI2VuZGlmCi0KIC8qCiAgKiB0YmNvbnZydCAtIFRhYmxlIGNvbnZlcnNpb24gcm91dGluZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV90Yl9jb252ZXJ0X3RvX3hzZHQgKAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwpAQCAtNzgsMTAgKzcwLDEwIEBACiAJc3RydWN0IHJzZHBfZGVzY3JpcHRvciAgICAgICAgICAqUlNEUCwKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpSU0RUKTsKIAorCiAvKgogICogdGJnZXQgLSBUYWJsZSAiZ2V0IiByb3V0aW5lcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2dldF90YWJsZSAoCiAJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKQEAgLTk5LDE3ICs5MSw2IEBACiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90aGlzX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdGJfdGFibGVfb3ZlcnJpZGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfdGJfZ2V0X3RhYmxlX3B0ciAoCiAJYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCkBAIC0xMjcsMzYgKzEwOCwyMyBAQAogYWNwaV90Yl92YWxpZGF0ZV9yc2R0ICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9wdHIpOwogCisKKy8qCisgKiB0YmdldGFsbCAtIGdldCBtdWx0aXBsZSByZXF1aXJlZCB0YWJsZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyAoCiAJdm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwogCiAvKgogICogdGJpbnN0YWxsIC0gVGFibGUgaW5zdGFsbGF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfdGJfaW5zdGFsbF90YWJsZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX21hdGNoX3NpZ25hdHVyZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfdHlwZSk7Ci0KLWFjcGlfc3RhdHVzCiBhY3BpX3RiX3JlY29nbml6ZV90YWJsZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF90eXBlKTsKQEAgLTE3MCw3ICsxMzgsNiBAQAogLyoKICAqIHRicmVtb3ZlIC0gVGFibGUgcmVtb3ZhbCBhbmQgZGVsZXRpb24KICAqLwotCiB2b2lkCiBhY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzICgKIAl2b2lkKTsKQEAgLTE4OSwyOCArMTU2LDggQEAKIAogCiAvKgotICogdGJyc2QgLSBSU0RQLCBSU0RUIHV0aWxpdGllcworICogdGJ4ZnJvb3QgLSBSU0RQLCBSU0RUIHV0aWxpdGllcwogICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9yc2R0ICgKLQl2b2lkKTsKLQotdTggKgotYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhcnRfYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2ZpbmRfcnNkcCAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotCi0vKgotICogdGJ1dGlscyAtIGNvbW1vbiB0YWJsZSB1dGlsaXRpZXMKLSAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV90Yl9maW5kX3RhYmxlICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaWduYXR1cmUsCkBAIC0yMTksNiArMTY2LDE0IEBACiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqKnRhYmxlX3B0cik7CiAKIGFjcGlfc3RhdHVzCithY3BpX3RiX2dldF90YWJsZV9yc2R0ICgKKwl2b2lkKTsKKworCisvKgorICogdGJ1dGlscyAtIGNvbW1vbiB0YWJsZSB1dGlsaXRpZXMKKyAqLworYWNwaV9zdGF0dXMKIGFjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9oZWFkZXIpOwogCkBAIC0yMzEsNSArMTg2LDQgQEAKIGFjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9oZWFkZXIpOwogCi0KICNlbmRpZiAvKiBfX0FDVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwuaAppbmRleCA3ZWVlNzMxLi5iNWNkY2NhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwuaApAQCAtMTMzLDcgKzEzMyw2IEBACiAjZGVmaW5lIERVQUxfUElDICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgTVVMVElQTEVfQVBJQyAgICAgICAgICAgMQogCi0KIC8qIE1hc3RlciBNQURUICovCiAKIHN0cnVjdCBtdWx0aXBsZV9hcGljX3RhYmxlCkBAIC0xNDQsNyArMTQzLDYgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMSAgICAgICA6IDMxOwogfTsKIAotCiAvKiBWYWx1ZXMgZm9yIFR5cGUgaW4gQVBJQ19IRUFERVJfREVGICovCiAKICNkZWZpbmUgQVBJQ19QUk9DRVNTT1IgICAgICAgICAgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKaW5kZXggN2FjYjU1MC4uM2E0NTFkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCkBAIC00NzgsNyArNDc4LDYgQEAKICNkZWZpbmUgQUNQSV9UWVBFX0lOVkFMSUQgICAgICAgICAgICAgICAweDFFCiAjZGVmaW5lIEFDUElfVFlQRV9OT1RfRk9VTkQgICAgICAgICAgICAgMHhGRgogCi0KIC8qCiAgKiBCaXRtYXBwZWQgQUNQSSB0eXBlcy4gIFVzZWQgaW50ZXJuYWxseSBvbmx5CiAgKi8KQEAgLTgwMyw3ICs4MDIsNiBAQAogLyoKICAqIFR5cGVzIHNwZWNpZmljIHRvIHRoZSBPUyBzZXJ2aWNlIGludGVyZmFjZXMKICAqLwotCiB0eXBlZGVmIHUzMgogKEFDUElfU1lTVEVNX1hGQUNFICphY3BpX29zZF9oYW5kbGVyKSAoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaAppbmRleCAwZGUyNmI4Li4xOTJkMGJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKQEAgLTUyLDEzICs1Miw2IEBACiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3QsCi0JYWNwaV9wa2dfY2FsbGJhY2sgICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCiBzdHJ1Y3QgYWNwaV9wa2dfaW5mbwogewogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZyZWVfc3BhY2U7CkBAIC03OSwzNyArNzIsMTMgQEAKICNkZWZpbmUgREJfUVdPUkRfRElTUExBWSAgICA4CiAKIAotLyogR2xvYmFsIGluaXRpYWxpemF0aW9uIGludGVyZmFjZXMgKi8KLQorLyoKKyAqIHV0Z2xvYmFsIC0gR2xvYmFsIGRhdGEgc3RydWN0dXJlcyBhbmQgcHJvY2VkdXJlcworICovCiB2b2lkCiBhY3BpX3V0X2luaXRfZ2xvYmFscyAoCiAJdm9pZCk7CiAKLXZvaWQKLWFjcGlfdXRfdGVybWluYXRlICgKLQl2b2lkKTsKLQotCi0vKgotICogdXRfaW5pdCAtIG1pc2NlbGxhbmVvdXMgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duCi0gKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfaGFyZHdhcmVfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7Ci0KLXZvaWQKLWFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICgKLQl2b2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfdmFsaWRhdGVfZmFkdCAoCi0Jdm9pZCk7Ci0KLS8qCi0gKiB1dF9nbG9iYWwgLSBHbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwcm9jZWR1cmVzCi0gKi8KLQogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIAogY2hhciAqCkBAIC0xNTcsOSArMTI2LDI0IEBACiAKIAogLyoKLSAqIHV0X2NsaWIgLSBMb2NhbCBpbXBsZW1lbnRhdGlvbnMgb2YgQyBsaWJyYXJ5IGZ1bmN0aW9ucworICogdXRpbml0IC0gbWlzY2VsbGFuZW91cyBpbml0aWFsaXphdGlvbiBhbmQgc2h1dGRvd24KICAqLworYWNwaV9zdGF0dXMKK2FjcGlfdXRfaGFyZHdhcmVfaW5pdGlhbGl6ZSAoCisJdm9pZCk7CiAKK3ZvaWQKK2FjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICgKKwl2b2lkKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfdmFsaWRhdGVfZmFkdCAoCisJdm9pZCk7CisKKworLyoKKyAqIHV0Y2xpYiAtIExvY2FsIGltcGxlbWVudGF0aW9ucyBvZiBDIGxpYnJhcnkgZnVuY3Rpb25zCisgKi8KICNpZm5kZWYgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCiAKIGFjcGlfc2l6ZQpAQCAtMjYwLDEwICsyNDQsMTAgQEAKIAogI2VuZGlmIC8qIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWSAqLwogCi0vKgotICogdXRfY29weSAtIE9iamVjdCBjb25zdHJ1Y3Rpb24gYW5kIGNvbnZlcnNpb24gaW50ZXJmYWNlcwotICovCiAKKy8qCisgKiB1dGNvcHkgLSBPYmplY3QgY29uc3RydWN0aW9uIGFuZCBjb252ZXJzaW9uIGludGVyZmFjZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfdXRfYnVpbGRfc2ltcGxlX29iamVjdCgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCkBAIC0yNzgsMzAgKzI2MiwxMSBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwYWNlX3VzZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUoCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqdXNlcl9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9vYmopOwotCi1hY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCAoCiAJdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqb2JqLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKippbnRlcm5hbF9vYmopOwpAQCAtMzEyLDE3ICsyNzcsNiBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3Rfb2JqKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iaiwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X29iaiwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MpOwotCi1hY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYywKQEAgLTMzMCw5ICsyODQsOCBAQAogCiAKIC8qCi0gKiB1dF9jcmVhdGUgLSBPYmplY3QgY3JlYXRpb24KKyAqIHV0Y3JlYXRlIC0gT2JqZWN0IGNyZWF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKQEAgLTM0MCw5ICsyOTMsOCBAQAogCiAKIC8qCi0gKiB1dF9kZWJ1ZyAtIERlYnVnIGludGVyZmFjZXMKKyAqIHV0ZGVidWcgLSBEZWJ1ZyBpbnRlcmZhY2VzCiAgKi8KLQogdm9pZAogYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSAoCiAJdm9pZCk7CkBAIC00NDAsMTEgKzM5MiwxNCBAQAogCiAKIC8qCi0gKiB1dF9kZWxldGUgLSBPYmplY3QgZGVsZXRpb24KKyAqIHV0ZGVsZXRlIC0gT2JqZWN0IGRlbGV0aW9uIGFuZCByZWZlcmVuY2UgY291bnRzCiAgKi8KK3ZvaWQKK2FjcGlfdXRfYWRkX3JlZmVyZW5jZSAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKIAogdm9pZAotYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqICgKK2FjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKIAogdm9pZApAQCAtNDYxLDI1ICs0MTYsOCBAQAogCiAKIC8qCi0gKiB1dF9ldmFsIC0gb2JqZWN0IGV2YWx1YXRpb24KKyAqIHV0ZXZhbCAtIG9iamVjdCBldmFsdWF0aW9uCiAgKi8KLQotLyogTWV0aG9kIG5hbWUgc3RyaW5ncyAqLwotCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19ISUQgICAgICAgICJfSElEIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fQ0lEICAgICAgICAiX0NJRCIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1VJRCAgICAgICAgIl9VSUQiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19BRFIgICAgICAgICJfQURSIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fU1RBICAgICAgICAiX1NUQSIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1JFRyAgICAgICAgIl9SRUciCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19TRUcgICAgICAgICJfU0VHIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fQkJOICAgICAgICAiX0JCTiIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1BSVCAgICAgICAgIl9QUlQiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19DUlMgICAgICAgICJfQ1JTIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fUFJTICAgICAgICAiX1BSUyIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1BSVyAgICAgICAgIl9QUlciCi0KLQogYWNwaV9zdGF0dXMKIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKQEAgLTUyMiwzOSArNDYwLDEwIEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGlnaGVzdCk7CiAKLS8qCi0gKiB1dF9tdXRleCAtIG11dHVhbCBleGNsdXNpb24gaW50ZXJmYWNlcwotICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X211dGV4X2luaXRpYWxpemUgKAotCXZvaWQpOwotCi12b2lkCi1hY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSAoCi0Jdm9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2RlbGV0ZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2FjcXVpcmVfbXV0ZXggKAotCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9yZWxlYXNlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKLQogCiAvKgotICogdXRfb2JqZWN0IC0gaW50ZXJuYWwgb2JqZWN0IGNyZWF0ZS9kZWxldGUvY2FjaGUgcm91dGluZXMKKyAqIHV0b2JqZWN0IC0gaW50ZXJuYWwgb2JqZWN0IGNyZWF0ZS9kZWxldGUvY2FjaGUgcm91dGluZXMKICAqLwotCiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICoKIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLApAQCAtNTg3LDUwICs0OTYsMTUgQEAKIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QgKAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3NpemUpOwogCi0KLS8qCi0gKiB1dF9yZWZfY250IC0gT2JqZWN0IHJlZmVyZW5jZSBjb3VudCBtYW5hZ2VtZW50Ci0gKi8KLQotdm9pZAotYWNwaV91dF9hZGRfcmVmZXJlbmNlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOwotCi12b2lkCi1hY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCk7Ci0KLS8qCi0gKiB1dF9zaXplIC0gT2JqZWN0IHNpemUgcm91dGluZXMKLSAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCk7Ci0KIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2dldF9vYmplY3Rfc2l6ZSgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCiAKIC8qCi0gKiB1dF9zdGF0ZSAtIEdlbmVyaWMgc3RhdGUgY3JlYXRpb24vY2FjaGUgcm91dGluZXMKKyAqIHV0c3RhdGUgLSBHZW5lcmljIHN0YXRlIGNyZWF0aW9uL2NhY2hlIHJvdXRpbmVzCiAgKi8KLQogdm9pZAogYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKAogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipsaXN0X2hlYWQsCkBAIC02NjYsMTQgKzU0MCwxNCBAQAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipzdGF0ZV9saXN0KTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2ggKAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX29iamVjdCwKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlcm5hbF9vYmplY3QsCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICoqc3RhdGVfbGlzdCk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKgogYWNwaV91dF9jcmVhdGVfY29udHJvbF9zdGF0ZSAoCkBAIC02OTMsMTUgKzU2NywxMCBAQAogCXZvaWQpOwogI2VuZGlmCiAKKwogLyoKLSAqIHV0bWlzYworICogdXRtYXRoCiAgKi8KLQotdm9pZAotYWNwaV91dF9wcmludF9zdHJpbmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpOwotCiBhY3BpX3N0YXR1cwogYWNwaV91dF9kaXZpZGUgKAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aWRlbmQsCkBAIC03MTYsNiArNTg1LDI1IEBACiAJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqb3V0X3F1b3RpZW50LAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9yZW1haW5kZXIpOwogCisvKgorICogdXRtaXNjCisgKi8KK2FjcGlfc3RhdHVzCithY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3QsCisJYWNwaV9wa2dfY2FsbGJhY2sgICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCitjaGFyICoKK2FjcGlfdXRfc3RydXByICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKTsKKwordm9pZAorYWNwaV91dF9wcmludF9zdHJpbmcgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpOworCiB1OAogYWNwaV91dF92YWxpZF9hY3BpX25hbWUgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CkBAIC03MzQsMTEgKzYyMiwyMSBAQAogCiAjZGVmaW5lIEFDUElfQU5ZX0JBU0UgICAgICAgIDAKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1jaGFyICoKLWFjcGlfdXRfc3RydXByICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKTsKLSNlbmRpZgorYWNwaV9zdGF0dXMKK2FjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSAoCisJdm9pZCk7CisKK3ZvaWQKK2FjcGlfdXRfbXV0ZXhfdGVybWluYXRlICgKKwl2b2lkKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfYWNxdWlyZV9tdXRleCAoCisJYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X3JlbGVhc2VfbXV0ZXggKAorCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOwogCiB1OCAqCiBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnICgKQEAgLTc2OCw5ICs2NjYsOCBAQAogCiAKIC8qCi0gKiBVdGFsbG9jIC0gbWVtb3J5IGFsbG9jYXRpb24gYW5kIG9iamVjdCBjYWNoaW5nCisgKiB1dGFsbG9jIC0gbWVtb3J5IGFsbG9jYXRpb24gYW5kIG9iamVjdCBjYWNoaW5nCiAgKi8KLQogdm9pZCAqCiBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZSAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkKTsKQEAgLTc5NSw5ICs2OTIsNiBAQAogCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKmJ1ZmZlciwKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX2xlbmd0aCk7CiAKLQotLyogTWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zICovCi0KIHZvaWQgKgogYWNwaV91dF9hbGxvY2F0ZSAoCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLApAQCAtODEyLDkgKzcwNiw3IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7CiAKLQogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0KIHZvaWQgKgogYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2sgKAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKQEAgLTgzNiwzNCArNzI4LDExIEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7CiAKLXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqCi1hY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jYXRpb24pOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF90cmFja19hbGxvY2F0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCi0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWRkcmVzcywKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY190eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7Ci0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCiBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvICgKIAl2b2lkKTsKLSNlbmRpZgorI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIHZvaWQKIGFjcGlfdXRfZHVtcF9hbGxvY2F0aW9ucyAoCkBAIC04NzEsNSArNzQwLDQgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUpOwogI2VuZGlmCiAKLQogI2VuZGlmIC8qIF9BQ1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmggYi9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCmluZGV4IDJlYzUzOGUuLjU1ZTk3ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaApAQCAtMTQ2LDggKzE0Niw3IEBACiAKIC8qIHByZWZpeGVkIG9wY29kZXMgKi8KIAotI2RlZmluZSBBTUxfRVhUT1AgICAgICAgICAgICAgICAgICAgKHUxNikgMHgwMDViCi0KKyNkZWZpbmUgQU1MX0VYVE9QICAgICAgICAgICAgICAgICAgICh1MTYpIDB4MDA1YiAgICAgLyogcHJlZml4IGZvciAyLWJ5dGUgb3Bjb2RlcyAqLwogCiAjZGVmaW5lIEFNTF9NVVRFWF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViMDEKICNkZWZpbmUgQU1MX0VWRU5UX09QICAgICAgICAgICAgICAgICh1MTYpIDB4NWIwMgpAQCAtMTk0LDcgKzE5Myw2IEBACiAgKiBVc2Ugb25seSAiVW5rbm93biIgQU1MIG9wY29kZXMsIGRvbid0IGF0dGVtcHQgdG8gdXNlCiAgKiBhbnkgdmFsaWQgQUNQSSBBU0NJSSB2YWx1ZXMgKEEtWiwgMC05LCAnLScpCiAgKi8KLQogI2RlZmluZSBBTUxfSU5UX05BTUVQQVRIX09QICAgICAgICAgKHUxNikgMHgwMDJkCiAjZGVmaW5lIEFNTF9JTlRfTkFNRURGSUVMRF9PUCAgICAgICAodTE2KSAweDAwMzAKICNkZWZpbmUgQU1MX0lOVF9SRVNFUlZFREZJRUxEX09QICAgICh1MTYpIDB4MDAzMQpAQCAtMjE0LDcgKzIxMiw2IEBACiAgKiBUaGVyZSBjYW4gYmUgdXAgdG8gMzEgdW5pcXVlIGFyZ3VtZW50IHR5cGVzCiAgKiBaZXJvIGlzIHJlc2VydmVkIGFzIGVuZC1vZi1saXN0IGluZGljYXRvcgogICovCi0KICNkZWZpbmUgQVJHUF9CWVRFREFUQSAgICAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgQVJHUF9CWVRFTElTVCAgICAgICAgICAgICAgIDB4MDIKICNkZWZpbmUgQVJHUF9DSEFSTElTVCAgICAgICAgICAgICAgIDB4MDMKQEAgLTI5NSw3ICsyOTIsNiBAQAogLyoKICAqIG9wY29kZSBncm91cHMgYW5kIHR5cGVzCiAgKi8KLQogI2RlZmluZSBPUEdSUF9OQU1FRCAgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBPUEdSUF9GSUVMRCAgICAgICAgICAgICAgICAgMHgwMgogI2RlZmluZSBPUEdSUF9CWVRFTElTVCAgICAgICAgICAgICAgMHgwNApAQCAtMzgxLDYgKzM3NywxMiBAQAogI2RlZmluZSBBTUxfVFlQRV9VTkRFRklORUQgICAgICAgICAgMHgxOQogI2RlZmluZSBBTUxfVFlQRV9CT0dVUyAgICAgICAgICAgICAgMHgxQQogCisvKiBBTUwgUGFja2FnZSBMZW5ndGggZW5jb2RpbmdzICovCisKKyNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMSAgICAgIDB4NDAKKyNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMiAgICAgIDB4NDAwMAorI2RlZmluZSBBQ1BJX0FNTF9QQUNLQUdFX1RZUEUzICAgICAgMHg0MDAwMDAKKyNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFNCAgICAgIDB4NDAwMDAwMDAKIAogLyoKICAqIE9wY29kZSBjbGFzc2VzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmggYi9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2NzMwZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaApAQCAtMCwwICsxLDI5IEBACisKKy8qIF9QREMgYml0IGRlZmluaXRpb24gZm9yIEludGVsIHByb2Nlc3NvcnMgKi8KKworI2lmbmRlZiBfX1BEQ19JTlRFTF9IX18KKyNkZWZpbmUgX19QRENfSU5URUxfSF9fCisKKyNkZWZpbmUgQUNQSV9QRENfUF9GRkgJCQkoMHgwMDAxKQorI2RlZmluZSBBQ1BJX1BEQ19DX0MxX0hBTFQJCSgweDAwMDIpCisjZGVmaW5lIEFDUElfUERDX1RfRkZICQkJKDB4MDAwNCkKKyNkZWZpbmUgQUNQSV9QRENfU01QX0MxUFQJCSgweDAwMDgpCisjZGVmaW5lIEFDUElfUERDX1NNUF9DMkMzCQkoMHgwMDEwKQorI2RlZmluZSBBQ1BJX1BEQ19TTVBfUF9TV0NPT1JECQkoMHgwMDIwKQorI2RlZmluZSBBQ1BJX1BEQ19TTVBfQ19TV0NPT1JECQkoMHgwMDQwKQorI2RlZmluZSBBQ1BJX1BEQ19TTVBfVF9TV0NPT1JECQkoMHgwMDgwKQorI2RlZmluZSBBQ1BJX1BEQ19DX0MxX0ZGSAkJKDB4MDEwMCkKKworCisjZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUAkoQUNQSV9QRENfU01QX0MxUFQgfCBcCisJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQpCisKKyNkZWZpbmUgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QX01TUgkoQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QIHwgXAorCQkJCQkgQUNQSV9QRENfUF9GRkgpCisKKyNkZWZpbmUgQUNQSV9QRENfQ19DQVBBQklMSVRZX1NNUAkoQUNQSV9QRENfU01QX0MyQzMgfCBcCisJCQkJCSBBQ1BJX1BEQ19TTVBfQzFQVCB8IFwKKwkJCQkJIEFDUElfUERDX0NfQzFfSEFMVCkKKworI2VuZGlmIC8qIF9fUERDX0lOVEVMX0hfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCmluZGV4IDU3YmY5MzYuLmFkZjk2OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCkBAIC0xOTgsNiArMTk4LDcgQEAKICNlbmRpZgogI2VuZGlmIC8qICFERUJVR0dFUl9USFJFQURJTkcgKi8KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogQyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KQEAgLTIwOSw3ICsyMTAsNiBAQAogICogVXNlIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgaGVhZGVycy4KICAqIFdlIHdhbnQgdG8ga2VlcCB0aGVzZSB0byBhIG1pbmltdW0uCiAgKi8KLQogI2lmZGVmIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMKIC8qCiAgKiBVc2UgdGhlIHN0YW5kYXJkIGhlYWRlcnMgZnJvbSB0aGUgc3RhbmRhcmQgbG9jYXRpb25zCkBAIC0yMjQsMTQgKzIyNCw4IEBACiAvKgogICogV2Ugd2lsbCBiZSBsaW5raW5nIHRvIHRoZSBzdGFuZGFyZCBDbGliIGZ1bmN0aW9ucwogICovCi0KICNkZWZpbmUgQUNQSV9TVFJTVFIoczEsczIpICAgICAgc3Ryc3RyKChzMSksIChzMikpCiAjZGVmaW5lIEFDUElfU1RSQ0hSKHMxLGMpICAgICAgIHN0cmNocigoczEpLCAoYykpCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotI2RlZmluZSBBQ1BJX1NUUlVQUihzKSAgICAgICAgICAodm9pZCkgYWNwaV91dF9zdHJ1cHIgKChzKSkKLSNlbmRpZgotCiAjZGVmaW5lIEFDUElfU1RSTEVOKHMpICAgICAgICAgIChhY3BpX3NpemUpIHN0cmxlbigocykpCiAjZGVmaW5lIEFDUElfU1RSQ1BZKGQscykgICAgICAgICh2b2lkKSBzdHJjcHkoKGQpLCAocykpCiAjZGVmaW5lIEFDUElfU1RSTkNQWShkLHMsbikgICAgICh2b2lkKSBzdHJuY3B5KChkKSwgKHMpLCAoYWNwaV9zaXplKShuKSkKQEAgLTI1NCwxNCArMjQ4LDE1IEBACiAjZGVmaW5lIEFDUElfSVNfQUxQSEEgICAgICAgICAgIGlzYWxwaGEKICNkZWZpbmUgQUNQSV9JU19BU0NJSSAgICAgICAgICAgaXNhc2NpaQogCisjZWxzZQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogTm90IHVzaW5nIG5hdGl2ZSBDIGxpYnJhcnksIHVzZSBsb2NhbCBpbXBsZW1lbnRhdGlvbnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZWxzZQogCi0vKgorIC8qCiAgKiBVc2UgbG9jYWwgZGVmaW5pdGlvbnMgb2YgQyBsaWJyYXJ5IG1hY3JvcyBhbmQgZnVuY3Rpb25zCiAgKiBOT1RFOiBUaGUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIG1heSBub3QgYmUgYXMgZWZmaWNpZW50CiAgKiBhcyBhbiBpbmxpbmUgb3IgYXNzZW1ibHkgY29kZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBhCkBAIC0yNzgsMTQgKzI3MywxMiBAQAogLyoKICAqIFN0b3JhZ2UgYWxpZ25tZW50IHByb3BlcnRpZXMKICAqLwotCiAjZGVmaW5lICBfQVVQQk5EICAgICAgICAgICAgICAgIChzaXplb2YgKGFjcGlfbmF0aXZlX2ludCkgLSAxKQogI2RlZmluZSAgX0FETkJORCAgICAgICAgICAgICAgICAoc2l6ZW9mIChhY3BpX25hdGl2ZV9pbnQpIC0gMSkKIAogLyoKICAqIFZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgbWFjcm8gZGVmaW5pdGlvbnMKICAqLwotCiAjZGVmaW5lIF9ibmQoWCwgYm5kKSAgICAgICAgICAgICgoKHNpemVvZiAoWCkpICsgKGJuZCkpICYgKH4oYm5kKSkpCiAjZGVmaW5lIHZhX2FyZyhhcCwgVCkgICAgICAgICAgICgqKFQgKikoKChhcCkgKz0gKF9ibmQgKFQsIF9BVVBCTkQpKSkgLSAoX2JuZCAoVCxfQUROQk5EKSkpKQogI2RlZmluZSB2YV9lbmQoYXApICAgICAgICAgICAgICAodm9pZCkgMApAQCAtMjk2LDExICsyODksNiBAQAogCiAjZGVmaW5lIEFDUElfU1RSU1RSKHMxLHMyKSAgICAgIGFjcGlfdXRfc3Ryc3RyICgoczEpLCAoczIpKQogI2RlZmluZSBBQ1BJX1NUUkNIUihzMSxjKSAgICAgICBhY3BpX3V0X3N0cmNociAoKHMxKSwgKGMpKQotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLSNkZWZpbmUgQUNQSV9TVFJVUFIocykgICAgICAgICAgKHZvaWQpIGFjcGlfdXRfc3RydXByICgocykpCi0jZW5kaWYKLQogI2RlZmluZSBBQ1BJX1NUUkxFTihzKSAgICAgICAgICAoYWNwaV9zaXplKSBhY3BpX3V0X3N0cmxlbiAoKHMpKQogI2RlZmluZSBBQ1BJX1NUUkNQWShkLHMpICAgICAgICAodm9pZCkgYWNwaV91dF9zdHJjcHkgKChkKSwgKHMpKQogI2RlZmluZSBBQ1BJX1NUUk5DUFkoZCxzLG4pICAgICAodm9pZCkgYWNwaV91dF9zdHJuY3B5ICgoZCksIChzKSwgKGFjcGlfc2l6ZSkobikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKaW5kZXggMmY1MGE1Yi4uNTBjZmVhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaApAQCAtNCw2ICs0LDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQlVTWV9NRVRSSUMJMTAKIAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIJOApAQCAtMTQsNiArMTYsOCBAQAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9NQVhfVEhST1RUTEUJMjUwCS8qIDI1JSAqLwogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9NQVhfRFVUWV9XSURUSAk0CiAKKyNkZWZpbmUgQUNQSV9QRENfUkVWSVNJT05fSUQJCTB4MQorCiAvKiBQb3dlciBNYW5hZ2VtZW50ICovCiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeDsKQEAgLTU5LDYgKzYzLDkgQEAKIAl1MzIJCQlibV9hY3Rpdml0eTsKIAlpbnQJCQljb3VudDsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggc3RhdGVzW0FDUElfUFJPQ0VTU09SX01BWF9QT1dFUl07CisKKwkvKiB0aGUgX1BEQyBvYmplY3RzIHBhc3NlZCBieSB0aGUgZHJpdmVyLCBpZiBhbnkgKi8KKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjOwogfTsKIAogLyogUGVyZm9ybWFuY2UgTWFuYWdlbWVudCAqLwpAQCAtODIsOCArODksNiBAQAogCWFjcGlfaW50ZWdlcgkJc3RhdHVzOwkJCS8qIHN1Y2Nlc3MgaW5kaWNhdG9yICovCiB9OwogCi0jZGVmaW5lIEFDUElfUERDX1JFVklTSU9OX0lEICAgICAgICAgICAgICAgICAgIDB4MQotCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgewogCXVuc2lnbmVkIGludAkJIHN0YXRlOwogCXVuc2lnbmVkIGludAkJIHBsYXRmb3JtX2xpbWl0OwpAQCAtMTc5LDcgKzE4NCwzMiBAQAogZXh0ZXJuIHN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHJvY2Vzc29yc1tOUl9DUFVTXTsKIGV4dGVybiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfZXJyYXRhIGVycmF0YTsKIAoraW50IGFjcGlfcHJvY2Vzc29yX3NldF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkY19pbik7CisKKyNpZmRlZiBBUkNIX0hBU19QT1dFUl9QRENfSU5JVAordm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgKnBvdywKKwkJdW5zaWduZWQgaW50IGNwdSk7Cit2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywKKwkJdW5zaWduZWQgaW50IGNwdSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKAorCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgKnBvdywgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlwb3ctPnBkYyA9IE5VTEw7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjaygKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlmbGFncy0+Ym1fY2hlY2sgPSAxOworCXJldHVybjsKK30KKyNlbmRpZgorCiAvKiBpbiBwcm9jZXNzb3JfcGVyZmxpYi5jICovCisKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2luaXQodm9pZCk7CiB2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19leGl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGNpLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaAppbmRleCBiNzgwNmFhLi4yODk1NzY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaApAQCAtNTgsNyArNTgsNyBAQAogCiBleHRlcm4gdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK2V4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oCmluZGV4IDQwOGFlYTUuLjIyYjUzZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmgKQEAgLTEzMyw2ICsxMzMsMTIgQEAKICNkZWZpbmUgX19TMTExCV9QQUdFX1MoMCkKIAogLyoKKyAqIHBncHJvdF9ub25jYWNoZWQoKSBpcyBvbmx5IGZvciBpbmZpbmliYW5kIHBjaSBzdXBwb3J0LCBhbmQgYSByZWFsCisgKiBpbXBsZW1lbnRhdGlvbiBmb3IgUkFNIHdvdWxkIGJlIG1vcmUgY29tcGxpY2F0ZWQuCisgKi8KKyNkZWZpbmUgcGdwcm90X25vbmNhY2hlZChwcm90KQkocHJvdCkKKworLyoKICAqIEJBRF9QQUdFVEFCTEUgaXMgdXNlZCB3aGVuIHdlIG5lZWQgYSBib2d1cyBwYWdlLXRhYmxlLCB3aGlsZQogICogQkFEX1BBR0UgaXMgdXNlZCBmb3IgYSBib2d1cyBwYWdlLgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvcGxhdGZvcm0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvcGxhdGZvcm0uaAppbmRleCA1MmRlZDUxLi5jMGNhZjNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9wbGF0Zm9ybS5oCkBAIC0xMTUsNiArMTE1LDcgQEAKIH0KIAogdm9pZCBpeHAyMDAwX21hcF9pbyh2b2lkKTsKK3ZvaWQgaXhwMjAwMF91YXJ0X2luaXQodm9pZCk7CiB2b2lkIGl4cDIwMDBfaW5pdF9pcnEodm9pZCk7CiB2b2lkIGl4cDIwMDBfaW5pdF90aW1lKHVuc2lnbmVkIGxvbmcpOwogdW5zaWduZWQgbG9uZyBpeHAyMDAwX2dldHRpbWVvZmZzZXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCmluZGV4IGMyN2I5ZDMuLjc0OTUwMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTM4Myw2ICszODMsMTgwIEBACiAJCSp2YWRkcisrID0gaW5sKGlvX2FkZHIpOwogfQogCisjZGVmaW5lCV9faXNfaW9fYWRkcmVzcyhwKQkoKCh1bnNpZ25lZCBsb25nKXAgPj0gMHgwKSAmJiBcCisJCQkJCSgodW5zaWduZWQgbG9uZylwIDw9IDB4MDAwMGZmZmYpKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK19faXhwNHh4X2lvcmVhZDgodm9pZCBfX2lvbWVtICpwb3J0KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCXJldHVybgkodW5zaWduZWQgaW50KV9faXhwNHh4X2luYigodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJcmV0dXJuICh1bnNpZ25lZCBpbnQpX19yYXdfcmVhZGIoKHUzMilwb3J0KTsKKyNlbHNlCisJCXJldHVybiAodW5zaWduZWQgaW50KV9faXhwNHh4X3JlYWRiKCh1MzIpcG9ydCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2l4cDR4eF9pb3JlYWQ4X3JlcCh1MzIgcG9ydCwgdTggKnZhZGRyLCB1MzIgY291bnQpCit7CisJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKKwkJX19peHA0eHhfaW5zYihwb3J0LCB2YWRkciwgY291bnQpOworCWVsc2UKKyNpZm5kZWYJQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfcmVhZHNiKCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworI2Vsc2UKKwkJX19peHA0eHhfcmVhZHNiKHBvcnQsIHZhZGRyLCBjb3VudCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK19faXhwNHh4X2lvcmVhZDE2KHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlyZXR1cm4JKHVuc2lnbmVkIGludClfX2l4cDR4eF9pbncoKHVuc2lnbmVkIGludClwb3J0KTsKKwllbHNlCisjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCXJldHVybiBsZTE2X3RvX2NwdShfX3Jhd19yZWFkdygodTMyKXBvcnQpKTsKKyNlbHNlCisJCXJldHVybiAodW5zaWduZWQgaW50KV9faXhwNHh4X3JlYWR3KCh1MzIpcG9ydCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2l4cDR4eF9pb3JlYWQxNl9yZXAodTMyIHBvcnQsIHUxNiAqdmFkZHIsIHUzMiBjb3VudCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9pbnN3KHBvcnQsIHZhZGRyLCBjb3VudCk7CisJZWxzZQorI2lmbmRlZglDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd19yZWFkc3coKHZvaWQgX19pb21lbSAqKXBvcnQsIHZhZGRyLCBjb3VudCk7CisjZWxzZQorCQlfX2l4cDR4eF9yZWFkc3cocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorX19peHA0eHhfaW9yZWFkMzIodm9pZCBfX2lvbWVtICpwb3J0KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCXJldHVybgkodW5zaWduZWQgaW50KV9faXhwNHh4X2lubCgodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UgeworI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlyZXR1cm4gbGUzMl90b19jcHUoX19yYXdfcmVhZGwoKHUzMilwb3J0KSk7CisjZWxzZQorCQlyZXR1cm4gKHVuc2lnbmVkIGludClfX2l4cDR4eF9yZWFkbCgodTMyKXBvcnQpOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvcmVhZDMyX3JlcCh1MzIgcG9ydCwgdTMyICp2YWRkciwgdTMyIGNvdW50KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCV9faXhwNHh4X2luc2wocG9ydCwgdmFkZHIsIGNvdW50KTsKKwllbHNlCisjaWZuZGVmCUNPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCV9fcmF3X3JlYWRzbCgodm9pZCBfX2lvbWVtICopcG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbHNlCisJCV9faXhwNHh4X3JlYWRzbChwb3J0LCB2YWRkciwgY291bnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW93cml0ZTgodTggdmFsdWUsIHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRiKHZhbHVlLCAodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfd3JpdGViKHZhbHVlLCAodTMyKXBvcnQpOworI2Vsc2UKKwkJX19peHA0eHhfd3JpdGViKHZhbHVlLCAodTMyKXBvcnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW93cml0ZThfcmVwKHUzMiBwb3J0LCB1OCAqdmFkZHIsIHUzMiBjb3VudCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRzYihwb3J0LCB2YWRkciwgY291bnQpOworI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd193cml0ZXNiKCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworI2Vsc2UKKwkJX19peHA0eHhfd3JpdGVzYihwb3J0LCB2YWRkciwgY291bnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW93cml0ZTE2KHUxNiB2YWx1ZSwgdm9pZCBfX2lvbWVtICpwb3J0KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCV9faXhwNHh4X291dHcodmFsdWUsICh1bnNpZ25lZCBpbnQpcG9ydCk7CisJZWxzZQorI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodmFsdWUpLCAodTMyKXBvcnQpOworI2Vsc2UKKwkJX19peHA0eHhfd3JpdGV3KHZhbHVlLCAodTMyKXBvcnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW93cml0ZTE2X3JlcCh1MzIgcG9ydCwgdTE2ICp2YWRkciwgdTMyIGNvdW50KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCV9faXhwNHh4X291dHN3KHBvcnQsIHZhZGRyLCBjb3VudCk7CisjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCV9fcmF3X3JlYWRzdygodm9pZCBfX2lvbWVtICopcG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbHNlCisJCV9faXhwNHh4X3dyaXRlc3cocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvd3JpdGUzMih1MzIgdmFsdWUsIHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRsKHZhbHVlLCAodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfd3JpdGVsKGNwdV90b19sZTMyKHZhbHVlKSwgKHUzMilwb3J0KTsKKyNlbHNlCisJCV9faXhwNHh4X3dyaXRlbCh2YWx1ZSwgKHUzMilwb3J0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvd3JpdGUzMl9yZXAodTMyIHBvcnQsIHUzMiAqdmFkZHIsIHUzMiBjb3VudCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRzbChwb3J0LCB2YWRkciwgY291bnQpOworI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd19yZWFkc2woKHZvaWQgX19pb21lbSAqKXBvcnQsIHZhZGRyLCBjb3VudCk7CisjZWxzZQorCQlfX2l4cDR4eF9vdXRzbChwb3J0LCB2YWRkciwgY291bnQpOworI2VuZGlmCit9CisKKyNkZWZpbmUJaW9yZWFkOChwKQkJCV9faXhwNHh4X2lvcmVhZDgocCkKKyNkZWZpbmUJaW9yZWFkMTYocCkJCQlfX2l4cDR4eF9pb3JlYWQxNihwKQorI2RlZmluZQlpb3JlYWQzMihwKQkJCV9faXhwNHh4X2lvcmVhZDMyKHApCisKKyNkZWZpbmUJaW9yZWFkOF9yZXAocCwgdiwgYykJCV9faXhwNHh4X2lvcmVhZDhfcmVwKHAsIHYsIGMpCisjZGVmaW5lCWlvcmVhZDE2X3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW9yZWFkMTZfcmVwKHAsIHYsIGMpCisjZGVmaW5lCWlvcmVhZDMyX3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW9yZWFkMzJfcmVwKHAsIHYsIGMpCisKKyNkZWZpbmUJaW93cml0ZTgodixwKQkJCV9faXhwNHh4X2lvd3JpdGU4KHYscCkKKyNkZWZpbmUJaW93cml0ZTE2KHYscCkJCQlfX2l4cDR4eF9pb3dyaXRlMTYodixwKQorI2RlZmluZQlpb3dyaXRlMzIodixwKQkJCV9faXhwNHh4X2lvd3JpdGUzMih2LHApCisKKyNkZWZpbmUJaW93cml0ZThfcmVwKHAsIHYsIGMpCQlfX2l4cDR4eF9pb3dyaXRlOF9yZXAocCwgdiwgYykKKyNkZWZpbmUJaW93cml0ZTE2X3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW93cml0ZTE2X3JlcChwLCB2LCBjKQorI2RlZmluZQlpb3dyaXRlMzJfcmVwKHAsIHYsIGMpCQlfX2l4cDR4eF9pb3dyaXRlMzJfcmVwKHAsIHYsIGMpCisKKyNkZWZpbmUJaW9wb3J0X21hcChwb3J0LCBucikJCSgodm9pZCBfX2lvbWVtKilwb3J0KQorI2RlZmluZQlpb3BvcnRfdW5tYXAoYWRkcikKIAogI2VuZGlmCS8vICBfX0FTTV9BUk1fQVJDSF9JT19ICiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDIuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDIuaAppbmRleCA2MGYwMDJiLi4zOWNhNWEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWgyLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oMi5oCkBAIC0zNCwxMSArMzQsNiBAQAogLyogQXQgT01BUDE2MTAgSW5ub3ZhdG9yIHRoZSBFdGhlcm5ldCBpcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8gQ1MxICovCiAjZGVmaW5lIE9NQVAxNjEwX0VUSFJfU1RBUlQJCTB4MDQwMDAzMDAKIAotLyogSW50ZWwgU1RSQVRBIE5PUiBmbGFzaCBhdCBDUzMgb3IgQ1MyQihOQU5EIEJvb3QpICovCi0jZGVmaW5lIE9NQVBfTk9SX0ZMQVNIX1NJWkUgICAgICAgICAgICAgU1pfMzJNCi0jZGVmaW5lIE9NQVBfTk9SX0ZMQVNIX1NUQVJUMSAgICAgICAgICAgMHgwQzAwMDAwMCAvKiBDUzMgKi8KLSNkZWZpbmUgT01BUF9OT1JfRkxBU0hfU1RBUlQyICAgICAgICAgICAweDBBMDAwMDAwIC8qIENTMkIgKi8KLQogLyogU2Ftc3VuZyBOQU5EIGZsYXNoIGF0IENTMkIgb3IgQ1MzKE5BTkQgQm9vdCkgKi8KICNkZWZpbmUgT01BUF9OQU5EX0ZMQVNIX1NUQVJUMSAgICAgICAgICAgMHgwQTAwMDAwMCAvKiBDUzJCICovCiAjZGVmaW5lIE9NQVBfTkFORF9GTEFTSF9TVEFSVDIgICAgICAgICAgIDB4MEMwMDAwMDAgLyogQ1MzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWgzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWgzLmgKaW5kZXggZTRkMWNkMi4uMWIxMmMxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oMy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDMuaApAQCAtMzAsMTEgKzMwLDYgQEAKIC8qIEluIE9NQVAxNzEwIEgzIHRoZSBFdGhlcm5ldCBpcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8gQ1MxICovCiAjZGVmaW5lIE9NQVAxNzEwX0VUSFJfU1RBUlQJCTB4MDQwMDAzMDAKIAotLyogSW50ZWwgU1RSQVRBIE5PUiBmbGFzaCBhdCBDUzMgb3IgQ1MyQihOQU5EIEJvb3QpICovCi0jZGVmaW5lIE9NQVBfTk9SX0ZMQVNIX1NJWkUgICAgICAgICAgICAgU1pfMzJNCi0jZGVmaW5lIE9NQVBfTk9SX0ZMQVNIX1NUQVJUMSAJCTB4MEMwMDAwMDAgLyogQ1MzICovCi0jZGVmaW5lIE9NQVBfTk9SX0ZMQVNIX1NUQVJUMiAJCTB4MEEwMDAwMDAgLyogQ1MyQiAqLwotCiAvKiBTYW1zdW5nIE5BTkQgZmxhc2ggYXQgQ1MyQiBvciBDUzMoTkFORCBCb290KSAqLwogI2RlZmluZSBPTUFQX05BTkRfRkxBU0hfU1RBUlQxICAgICAgICAgICAweDBBMDAwMDAwIC8qIENTMkIgKi8KICNkZWZpbmUgT01BUF9OQU5EX0ZMQVNIX1NUQVJUMiAgICAgICAgICAgMHgwQzAwMDAwMCAvKiBDUzMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtb3NrLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLW9zay5oCmluZGV4IGFhYTQ5YTAuLjJiMWE4YTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtb3NrLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1vc2suaApAQCAtMzIsMTAgKzMyLDUgQEAKIC8qIEF0IE9NQVA1OTEyIE9TSyB0aGUgRXRoZXJuZXQgaXMgZGlyZWN0bHkgY29ubmVjdGVkIHRvIENTMSAqLwogI2RlZmluZSBPTUFQX09TS19FVEhSX1NUQVJUCQkweDA0ODAwMzAwCiAKLS8qIE1pY3JvbiBOT1IgZmxhc2ggYXQgQ1MzIG1hcHBlZCB0byBhZGRyZXNzIDB4MCBpZiBCTSBiaXQgaXMgMSAqLwotI2RlZmluZSBPTUFQX09TS19OT1JfRkxBU0hfQkFTRQkJMHhEODAwMDAwMAotI2RlZmluZSBPTUFQX09TS19OT1JfRkxBU0hfU0laRQkJU1pfMzJNCi0jZGVmaW5lIE9NQVBfT1NLX05PUl9GTEFTSF9TVEFSVAkweDAwMDAwMDAwCi0KICNlbmRpZiAvKiAgX19BU01fQVJDSF9PTUFQX09TS19IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaAppbmRleCAxY2VmZDYwLi45NWJkNjI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC5oCkBAIC0xNiwxMCArMTYsMTEgQEAKIC8qIERpZmZlcmVudCBwZXJpcGhlcmFsIGlkcyAqLwogI2RlZmluZSBPTUFQX1RBR19DTE9DSwkJMHg0ZjAxCiAjZGVmaW5lIE9NQVBfVEFHX01NQwkJMHg0ZjAyCi0jZGVmaW5lIE9NQVBfVEFHX1VBUlQJCTB4NGYwMworI2RlZmluZSBPTUFQX1RBR19TRVJJQUxfQ09OU09MRSAweDRmMDMKICNkZWZpbmUgT01BUF9UQUdfVVNCCQkweDRmMDQKICNkZWZpbmUgT01BUF9UQUdfTENECQkweDRmMDUKICNkZWZpbmUgT01BUF9UQUdfR1BJT19TV0lUQ0gJMHg0ZjA2CisjZGVmaW5lIE9NQVBfVEFHX1VBUlQJCTB4NGYwNwogCiAjZGVmaW5lIE9NQVBfVEFHX0JPT1RfUkVBU09OICAgIDB4NGY4MAogI2RlZmluZSBPTUFQX1RBR19GTEFTSF9QQVJUCTB4NGY4MQpAQCAtMzUsNyArMzYsNyBAQAogCXMxNiBtbWMxX3N3aXRjaF9waW4sIG1tYzJfc3dpdGNoX3BpbjsKIH07CiAKLXN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIHsKK3N0cnVjdCBvbWFwX3NlcmlhbF9jb25zb2xlX2NvbmZpZyB7CiAJdTggY29uc29sZV91YXJ0OwogCXUzMiBjb25zb2xlX3NwZWVkOwogfTsKQEAgLTgyLDcgKzgzLDggQEAKICAqLwogI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX1RZUEVfQ09WRVIJCTB4MDAwMAogI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX1RZUEVfQ09OTkVDVElPTgkweDAwMDEKLSNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9GTEFHX0lOVkVSVEVEICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX0ZMQUdfSU5WRVJURUQJCTB4MDAwMQorI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX0ZMQUdfT1VUUFVUCQkweDAwMDIKIHN0cnVjdCBvbWFwX2dwaW9fc3dpdGNoX2NvbmZpZyB7CiAJY2hhciBuYW1lWzEyXTsKIAl1MTYgZ3BpbzsKQEAgLTk5LDYgKzEwMSwxMCBAQAogCWNoYXIgcmVhc29uX3N0clsxMl07CiB9OwogCitzdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyB7CisJLyogQml0IGZpZWxkIG9mIFVBUlRzIHByZXNlbnQ7IGJpdCAwIC0tPiBVQVJUMSAqLworCXVuc2lnbmVkIGludCBlbmFibGVkX3VhcnRzOworfTsKIAogc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5IHsKIAl1MTYgdGFnOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jb21tb24uaApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvY29tbW9uLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY29tbW9uLmgKaW5kZXggOWY2Mjg1OC4uMmE2NzZiNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY29tbW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5oCisgKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2NvbW1vbi5oCiAgKgogICogSGVhZGVyIGZvciBjb2RlIGNvbW1vbiB0byBhbGwgT01BUCBtYWNoaW5lcy4KICAqCkBAIC0yOSw3ICsyOSw3IEBACiAKIHN0cnVjdCBzeXNfdGltZXI7CiAKLWV4dGVybiB2b2lkIG9tYXBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcF9tYXBfY29tbW9uX2lvKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgb21hcF90aW1lcjsKIGV4dGVybiB2b2lkIG9tYXBfc2VyaWFsX2luaXQoaW50IHBvcnRzW10pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaAppbmRleCBkNzg1MjQ4Li5jZTExNGNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZG1hLmgKQEAgLTI0MSw2ICsyNDEsNyBAQAogZXh0ZXJuIGRtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX3NyY19wb3MoaW50IGxjaCk7CiBleHRlcm4gZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfZHN0X3BvcyhpbnQgbGNoKTsKIGV4dGVybiB2b2lkIG9tYXBfY2xlYXJfZG1hKGludCBsY2gpOworZXh0ZXJuIGludCBvbWFwX2RtYV9ydW5uaW5nKHZvaWQpOwogCiAvKiBSZXR1cm5zIDEgaWYgdGhlIERNQSBtb2R1bGUgaXMgaW4gT01BUDE1MTAtY29tcGF0aWJsZSBtb2RlLCAwIG90aGVyd2lzZSAqLwogZXh0ZXJuIGludCBvbWFwX2RtYV9pbl8xNTEwX21vZGUodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2hhcmR3YXJlLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2hhcmR3YXJlLmgKaW5kZXggMzdlMDZjNy4uNDgyNThjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9oYXJkd2FyZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaGFyZHdhcmUuaApAQCAtNTQsNiArNTQsMTkgQEAKIAogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRpbWVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIE9NQVBfTVBVX1RJTUVSMV9CQVNFCSgweGZmZmVjNTAwKQorI2RlZmluZSBPTUFQX01QVV9USU1FUjJfQkFTRQkoMHhmZmZlYzYwMCkKKyNkZWZpbmUgT01BUF9NUFVfVElNRVIzX0JBU0UJKDB4ZmZmZWM3MDApCisjZGVmaW5lIE1QVV9USU1FUl9GUkVFCQkoMSA8PCA2KQorI2RlZmluZSBNUFVfVElNRVJfQ0xPQ0tfRU5BQkxFCSgxIDw8IDUpCisjZGVmaW5lIE1QVV9USU1FUl9BUgkJKDEgPDwgMSkKKyNkZWZpbmUgTVBVX1RJTUVSX1NUCQkoMSA8PCAwKQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KQEAgLTc4LDYgKzkxLDcgQEAKIAogLyogRFNQIGNsb2NrIGNvbnRyb2wgKi8KICNkZWZpbmUgRFNQX0NPTkZJR19SRUdfQkFTRSAgICAgKDB4ZTEwMDgwMDApCisjZGVmaW5lIERTUF9DS0NUTAkJKERTUF9DT05GSUdfUkVHX0JBU0UgKyAweDApCiAjZGVmaW5lIERTUF9JRExFQ1QxCQkoRFNQX0NPTkZJR19SRUdfQkFTRSArIDB4NCkKICNkZWZpbmUgRFNQX0lETEVDVDIJCShEU1BfQ09ORklHX1JFR19CQVNFICsgMHg4KQogCkBAIC04OCw2ICsxMDIsNyBAQAogICovCiAjZGVmaW5lIFVMUERfUkVHX0JBU0UJCSgweGZmZmUwODAwKQogI2RlZmluZSBVTFBEX0lUX1NUQVRVUwkJKFVMUERfUkVHX0JBU0UgKyAweDE0KQorI2RlZmluZSBVTFBEX1NFVFVQX0FOQUxPR19DRUxMXzMJKFVMUERfUkVHX0JBU0UgKyAweDI0KQogI2RlZmluZSBVTFBEX0NMT0NLX0NUUkwJCShVTFBEX1JFR19CQVNFICsgMHgzMCkKICMJZGVmaW5lIERJU19VU0JfUFZDSV9DTEsJCSgxIDw8IDUpCS8qIG5vIFVTQi9GQUMgc3luY2ggKi8KICMJZGVmaW5lIFVTQl9NQ0xLX0VOCQkoMSA8PCA0KQkvKiBlbmFibGUgVzRfVVNCX0NMS08gKi8KQEAgLTI2OCwxNyArMjgzLDEwIEBACiAgKiBQcm9jZXNzb3Igc3BlY2lmaWMgZGVmaW5lcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisKICNpbmNsdWRlICJvbWFwNzMwLmgiCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCiAjaW5jbHVkZSAib21hcDE1MTAuaCIKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKICNpbmNsdWRlICJvbWFwMTZ4eC5oIgotI2VuZGlmCiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJxcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcnFzLmgKaW5kZXggNjcwMWZkOS4uMGQwNWE3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcnFzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcnFzLmgKQEAgLTE1OSw2ICsxNTksNyBAQAogI2RlZmluZSBJTlRfMTYxMF9HUElPX0JBTkszCSg0MSArIElIMl9CQVNFKQogI2RlZmluZSBJTlRfMTYxMF9NTUMyCQkoNDIgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfQ0YJCSg0MyArIElIMl9CQVNFKQorI2RlZmluZSBJTlRfMTYxMF9XQUtFX1VQX1JFUQkoNDYgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfR1BJT19CQU5LNAkoNDggKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfU1BJCQkoNDkgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfRE1BX0NINgkoNTMgKyBJSDJfQkFTRSkKQEAgLTIzOCw2ICsyMzksOCBAQAogI2RlZmluZSBJSF9NUFVJT19CQVNFCQkoT01BUF9NQVhfR1BJT19MSU5FUyArIElIX0dQSU9fQkFTRSkKICNkZWZpbmUgSUhfQk9BUkRfQkFTRQkJKDE2ICsgSUhfTVBVSU9fQkFTRSkKIAorI2RlZmluZSBPTUFQX0lSUV9CSVQoaXJxKQkoMSA8PCAoKGlycSkgJSAzMikpCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiBleHRlcm4gdm9pZCBvbWFwX2luaXRfaXJxKHZvaWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL211eC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdXguaAppbmRleCAzOWY5OWRlLi41YmQzZjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL211eC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbXV4LmgKQEAgLTIzMSw3ICsyMzEsNyBAQAogCUoxOV8xNjEwX0VUTV9ENiwKIAlKMThfMTYxMF9FVE1fRDcsCiAKLQkvKiBPTUFQLTE2MTAgR1BJTyAqLworCS8qIE9NQVAxNlhYIEdQSU8gKi8KIAlQMjBfMTYxMF9HUElPNCwKIAlWOV8xNjEwX0dQSU83LAogCVc4XzE2MTBfR1BJTzksCkBAIC0yNDEsNiArMjQxLDkgQEAKIAlBQTIwXzE2MTBfR1BJT180MSwKIAlXMTlfMTYxMF9HUElPNDgsCiAJTTdfMTYxMF9HUElPNjIsCisJVjE0XzE2WFhfR1BJTzM3LAorCVI5XzE2WFhfR1BJTzE4LAorCUwxNF8xNlhYX0dQSU80OSwKIAogCS8qIE9NQVAtMTYxMCB1V2lyZSAqLwogCVYxOV8xNjEwX1VXSVJFX1NDTEssCkBAIC0yODUsMTIgKzI4OCwxMyBAQAogCVY2X1VTQjJfVFhELAogCVc1X1VTQjJfU0UwLAogCi0JLyogVUFSVDEgMTYxMCAqLwotCisJLyogMTZYWCBVQVJUICovCiAJUjEzXzE2MTBfVUFSVDFfVFgsCi0JVjE0XzE2MTBfVUFSVDFfUlgsCisJVjE0XzE2WFhfVUFSVDFfUlgsCiAJUjE0XzE2MTBfVUFSVDFfQ1RTLAogCUFBMTVfMTYxMF9VQVJUMV9SVFMsCisJUjlfMTZYWF9VQVJUMl9SWCwKKwlMMTRfMTZYWF9VQVJUM19SWCwKIAogCS8qIEkyQyBPTUFQLTE2MTAgKi8KIAlJMkNfU0NMLApAQCAtMzMyLDcgKzMzNiw3IEBACiAgKiBUYWJsZSBvZiB2YXJpb3VzIEZVTkNfTVVYIGFuZCBQVUxMX0RXTiBjb21iaW5hdGlvbnMgZm9yIGVhY2ggZGV2aWNlLgogICogU2VlIGFsc28gcmVnX2NmZ190IGFib3ZlIGZvciB0aGUgbG9va3VwIHRhYmxlLgogICovCi1zdGF0aWMgcmVnX2NmZ19zZXQgX19pbml0ZGF0YV9vcl9tb2R1bGUKK3N0YXRpYyBjb25zdCByZWdfY2ZnX3NldCBfX2luaXRkYXRhX29yX21vZHVsZQogcmVnX2NmZ190YWJsZVtdID0gewogLyoKICAqCSBkZXNjcmlwdGlvbgkJbXV4ICBtb2RlICAgbXV4CSBwdWxsIHB1bGwgIHB1bGwgIHB1X3BkCSBwdSAgZGJnCkBAIC00NTUsNyArNDU5LDcgQEAKIE1VWF9DRkcoIkoxOV8xNjEwX0VUTV9ENiIsCSA1LCAgICAwLCAgICAxLAkgIDAsICAyMCwgICAwLAkgIDAsCSAwLCAgMSkKIE1VWF9DRkcoIkoxOF8xNjEwX0VUTV9ENyIsCSA1LCAgIDI3LCAgICAxLAkgIDAsICAxOSwgICAwLAkgIDAsCSAwLCAgMSkKIAotLyogT01BUC0xNjEwIEdQSU8gKi8KKy8qIE9NQVAxNlhYIEdQSU8gKi8KIE1VWF9DRkcoIlAyMF8xNjEwX0dQSU80IiwJIDYsICAgMjcsICAgIDAsCSAgMSwgICA3LCAgIDAsCSAgMSwJIDEsICAxKQogTVVYX0NGRygiVjlfMTYxMF9HUElPNyIsCSBCLCAgIDEyLCAgICAxLAkgIDIsICAyMCwgICAwLAkgIDIsCSAxLCAgMSkKIE1VWF9DRkcoIlc4XzE2MTBfR1BJTzkiLAkgQiwgICAyMSwgICAgMCwJICAyLCAgMjMsICAgMCwJICAyLAkgMSwgIDEpCkBAIC00NjUsNiArNDY5LDkgQEAKIE1VWF9DRkcoIkFBMjBfMTYxMF9HUElPXzQxIiwJIDksICAgIDksICAgIDcsCSAgMSwgIDMxLCAgIDAsCSAgMSwJIDEsICAxKQogTVVYX0NGRygiVzE5XzE2MTBfR1BJTzQ4IiwJIDgsICAgMTUsICAgIDcsICAgMSwgIDIzLCAgIDEsICAgIDEsICAgICAwLCAgMSkKIE1VWF9DRkcoIk03XzE2MTBfR1BJTzYyIiwJMTAsICAgIDAsICAgIDAsICAgNCwgIDI0LCAgIDAsICAgIDQsICAgICAwLCAgMSkKK01VWF9DRkcoIlYxNF8xNlhYX0dQSU8zNyIsCSA5LCAgIDE4LCAgICA3LAkgIDIsICAgMiwgICAwLAkgIDIsCSAyLCAgMCkKK01VWF9DRkcoIlI5XzE2WFhfR1BJTzE4IiwJIEMsICAgMTgsICAgIDcsICAgMywgICAwLCAgIDAsICAgIDMsICAgICAwLCAgMCkKK01VWF9DRkcoIkwxNF8xNlhYX0dQSU80OSIsCSA2LCAgICAzLCAgICA3LCAgIDAsICAzMSwgICAwLCAgICAwLCAgICAzMSwgIDApCiAKIC8qIE9NQVAtMTYxMCB1V2lyZSAqLwogTVVYX0NGRygiVjE5XzE2MTBfVVdJUkVfU0NMSyIsCSA4LCAgICA2LCAgICAwLAkgIDEsICAyMCwgICAwLAkgIDEsCSAxLCAgMSkKQEAgLTUwMywxNiArNTEwLDE3IEBACiBNVVhfQ0ZHKCJXOV9VU0IyX1RYRU4iLAkJIEIsICAgOSwgICAgIDEsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAxKQogTVVYX0NGRygiQUE5X1VTQjJfVlAiLAkJIEIsICAgNiwgICAgIDEsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAxKQogTVVYX0NGRygiWTVfVVNCMl9SQ1YiLAkJIEMsICAyMSwgICAgIDEsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAxKQotTVVYX0NGRygiUjhfVVNCMl9WTSIsCQkgQywgIDE4LCAgICAgMSwJIE5BLCAgIDAsICAgMCwJIE5BLAkgMCwgIDEpCitNVVhfQ0ZHKCJSOV9VU0IyX1ZNIiwJCSBDLCAgMTgsICAgICAxLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKIE1VWF9DRkcoIlY2X1VTQjJfVFhEIiwJCSBDLCAgMjcsICAgICAyLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKIE1VWF9DRkcoIlc1X1VTQjJfU0UwIiwJCSBDLCAgMjQsICAgICAyLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKIAotCi0vKiBVQVJUMSAqLworLyogMTZYWCBVQVJUICovCiBNVVhfQ0ZHKCJSMTNfMTYxMF9VQVJUMV9UWCIsCSBBLCAgMTIsICAgICA2LAkgIDIsICAxMCwgICAwLAkgIDIsCTEwLCAgMSkKLU1VWF9DRkcoIlYxNF8xNjEwX1VBUlQxX1JYIiwJIDksICAxOCwgICAgIDAsCSAgMiwgICAyLCAgIDAsCSAgMiwJIDIsICAxKQorTVVYX0NGRygiVjE0XzE2WFhfVUFSVDFfUlgiLAkgOSwgIDE4LCAgICAgMCwJICAyLCAgIDIsICAgMCwJICAyLAkgMiwgIDEpCiBNVVhfQ0ZHKCJSMTRfMTYxMF9VQVJUMV9DVFMiLAkgOSwgIDE1LCAgICAgMCwJICAyLCAgIDEsICAgMCwJICAyLAkgMSwgIDEpCiBNVVhfQ0ZHKCJBQTE1XzE2MTBfVUFSVDFfUlRTIiwJIDksICAxMiwgICAgIDEsCSAgMiwgICAwLCAgIDAsCSAgMiwJIDAsICAxKQorTVVYX0NGRygiUjlfMTZYWF9VQVJUMl9SWCIsCSBDLCAgMTgsICAgICAwLCAgIDMsICAgMCwgICAwLCAgICAzLCAgICAgMCwgIDEpCitNVVhfQ0ZHKCJMMTRfMTZYWF9VQVJUM19SWCIsCSA2LCAgIDMsICAgICAwLCAgIDAsICAzMSwgICAwLCAgICAwLCAgICAzMSwgIDEpCiAKIC8qIEkyQyBpbnRlcmZhY2UgKi8KIE1VWF9DRkcoIkkyQ19TQ0wiLAkJIDcsICAyNCwgICAgIDAsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTZ4eC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTZ4eC5oCmluZGV4IDg4YjFmZTQuLjM4YTliOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE2eHguaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNnh4LmgKQEAgLTE4Myw1ICsxODMsMzcgQEAKICNkZWZpbmUgT01BUDE2WFhfUFdMX0VOQUJMRQkoT01BUDE2WFhfUFdMX0JBU0UgKyAweDAwKQogI2RlZmluZSBPTUFQMTZYWF9QV0xfQ0xLX0VOQUJMRQkoT01BUDE2WFhfUFdMX0JBU0UgKyAweDA0KQogCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXYXRjaGRvZyB0aW1lcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogMzItYml0IFdhdGNoZG9nIHRpbWVyIGluIE9NQVAgMTZYWCAqLworI2RlZmluZSBPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSAgICAgICAgKDB4ZmZmZWIwMDApCisjZGVmaW5lIE9NQVBfMTZYWF9XSURSICAgICAgICAgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgwMCkKKyNkZWZpbmUgT01BUF8xNlhYX1dEX1NZU0NPTkZJRyAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDEwKQorI2RlZmluZSBPTUFQXzE2WFhfV0RfU1lTU1RBVFVTIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4MTQpCisjZGVmaW5lIE9NQVBfMTZYWF9XQ0xSICAgICAgICAgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgyNCkKKyNkZWZpbmUgT01BUF8xNlhYX1dDUlIgICAgICAgICAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDI4KQorI2RlZmluZSBPTUFQXzE2WFhfV0xEUiAgICAgICAgIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4MmMpCisjZGVmaW5lIE9NQVBfMTZYWF9XVEdSICAgICAgICAgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgzMCkKKyNkZWZpbmUgT01BUF8xNlhYX1dXUFMgICAgICAgICAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDM0KQorI2RlZmluZSBPTUFQXzE2WFhfV1NQUiAgICAgICAgIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4NDgpCisKKyNkZWZpbmUgV0NMUl9QUkVfU0hJRlQgICAgICAgICA1CisjZGVmaW5lIFdDTFJfUFRWX1NISUZUICAgICAgICAgMgorCisjZGVmaW5lIFdXUFNfV19QRU5EX1dTUFIgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgV1dQU19XX1BFTkRfV1RHUiAgICAgICAoMSA8PCAzKQorI2RlZmluZSBXV1BTX1dfUEVORF9XTERSICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFdXUFNfV19QRU5EX1dDUlIgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgV1dQU19XX1BFTkRfV0NMUiAgICAgICAoMSA8PCAwKQorCisjZGVmaW5lIFdTUFJfRU5BQkxFXzAgICAgICAgICAgKDB4MDAwMGJiYmIpCisjZGVmaW5lIFdTUFJfRU5BQkxFXzEgICAgICAgICAgKDB4MDAwMDQ0NDQpCisjZGVmaW5lIFdTUFJfRElTQUJMRV8wICAgICAgICAgKDB4MDAwMGFhYWEpCisjZGVmaW5lIFdTUFJfRElTQUJMRV8xICAgICAgICAgKDB4MDAwMDU1NTUpCisKICNlbmRpZiAvKiAgX19BU01fQVJDSF9PTUFQMTZYWF9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3N5c3RlbS5oCmluZGV4IDE3YTJjNDguLmZmMzdiYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9zeXN0ZW0uaApAQCAtNSw3ICs1LDkgQEAKICNpZm5kZWYgX19BU01fQVJDSF9TWVNURU1fSAogI2RlZmluZSBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2lkbGUodm9pZCkKIHsKQEAgLTE0LDcgKzE2LDI0IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSkKIHsKLQlvbWFwX3dyaXRldygxLCBBUk1fUlNUQ1QxKTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCisJLyoKKwkgKiBXb3JrYXJvdW5kIGZvciA1OTEyLzE2MTFiIGJ1ZyBtZW50aW9uZWQgaW4gc3ByejIwOWQucGRmIHAuIDI4CisJICogIkdsb2JhbCBTb2Z0d2FyZSBSZXNldCBBZmZlY3RzIFRyYWZmaWMgQ29udHJvbGxlciBGcmVxdWVuY3kiLgorCSAqLworCWlmIChjcHVfaXNfb21hcDU5MTIoKSkgeworCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KERQTExfQ1RMKSAmIH4oMSA8PCA0KSwKKwkJCQkgRFBMTF9DVEwpOworCQlvbWFwX3dyaXRldygweDgsIEFSTV9SU1RDVDEpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUNIX1ZPSUNFQkxVRQorCWlmIChtYWNoaW5lX2lzX3ZvaWNlYmx1ZSgpKQorCQl2b2ljZWJsdWVfcmVzZXQoKTsKKwllbHNlCisjZW5kaWYKKwkJb21hcF93cml0ZXcoMSwgQVJNX1JTVENUMSk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL210ZC14aXAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tdGQteGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwNGRiYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tdGQteGlwLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIE1URCBwcmltaXRpdmVzIGZvciBYSVAgc3VwcG9ydC4gQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZ1bmN0aW9ucworICoKKyAqIERvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gSXQncyBpbmNsdWRlZCBmcm9tIGxpbnV4L210ZC94aXAuaAorICogCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENyZWF0ZWQ6CU5vdiAyLCAyMDA0CisgKiBDb3B5cmlnaHQ6CShDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICRJZDogeGlwLmgsdiAxLjIgMjAwNC8xMi8wMSAxNTo0OToxMCBuaWNvIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfUFhBX01URF9YSVBfSF9fCisjZGVmaW5lIF9fQVJDSF9QWEFfTVREX1hJUF9IX18KKworI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisKKyNkZWZpbmUgeGlwX2lycXBlbmRpbmcoKQkoSUNJUCAmIElDTVIpCisKKy8qIHdlIHNhbXBsZSBPU0NSIGFuZCBjb252ZXJ0IGRlc2lyZWQgZGVsdGEgdG8gdXNlYyAoMS80IH49IDEwMDAwMDAvMzY4NjQwMCkgKi8KKyNkZWZpbmUgeGlwX2N1cnJ0aW1lKCkJCShPU0NSKQorI2RlZmluZSB4aXBfZWxhcHNlZF9zaW5jZSh4KQkoc2lnbmVkKSgoT1NDUiAtICh4KSkgLyA0KQorCisvKgorICogeGlwX2NwdV9pZGxlKCkgaXMgdXNlZCB3aGVuIHdhaXRpbmcgZm9yIGEgZGVsYXkgZXF1YWwgb3IgbGFyZ2VyIHRoYW4KKyAqIHRoZSBzeXN0ZW0gdGltZXIgdGljayBwZXJpb2QuICBUaGlzIHNob3VsZCBwdXQgdGhlIENQVSBpbnRvIGlkbGUgbW9kZQorICogdG8gc2F2ZSBwb3dlciBhbmQgdG8gYmUgd29rZW4gdXAgb25seSB3aGVuIHNvbWUgaW50ZXJydXB0cyBhcmUgcGVuZGluZy4KKyAqIEFzIGFib3ZlLCB0aGlzIHNob3VsZCBub3QgcmVseSB1cG9uIHN0YW5kYXJkIGtlcm5lbCBjb2RlLgorICovCisKKyNkZWZpbmUgeGlwX2NwdV9pZGxlKCkgIGFzbSB2b2xhdGlsZSAoIm1jciBwMTQsIDAsICUwLCBjNywgYzAsIDAiIDo6ICJyIiAoMSkpCisKKyNlbmRpZiAvKiBfX0FSQ0hfUFhBX01URF9YSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvbXRkLXhpcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL210ZC14aXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGNmZGFjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL210ZC14aXAuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogTVREIHByaW1pdGl2ZXMgZm9yIFhJUCBzdXBwb3J0LiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgZnVuY3Rpb25zCisgKgorICogRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiBJdCdzIGluY2x1ZGVkIGZyb20gbGludXgvbXRkL3hpcC5oCisgKiAKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJTm92IDIsIDIwMDQKKyAqIENvcHlyaWdodDoJKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogJElkOiB4aXAuaCx2IDEuMiAyMDA0LzEyLzAxIDE1OjQ5OjEwIG5pY28gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVJDSF9TQTExMDBfTVREX1hJUF9IX18KKyNkZWZpbmUgX19BUkNIX1NBMTEwMF9NVERfWElQX0hfXworCisjZGVmaW5lIHhpcF9pcnFwZW5kaW5nKCkJKElDSVAgJiBJQ01SKQorCisvKiB3ZSBzYW1wbGUgT1NDUiBhbmQgY29udmVydCBkZXNpcmVkIGRlbHRhIHRvIHVzZWMgKDEvNCB+PSAxMDAwMDAwLzM2ODY0MDApICovCisjZGVmaW5lIHhpcF9jdXJydGltZSgpCQkoT1NDUikKKyNkZWZpbmUgeGlwX2VsYXBzZWRfc2luY2UoeCkJKHNpZ25lZCkoKE9TQ1IgLSAoeCkpIC8gNCkKKworI2VuZGlmIC8qIF9fQVJDSF9TQTExMDBfTVREX1hJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL2FyY2guaCBiL2luY2x1ZGUvYXNtLWFybS9tYWNoL2FyY2guaAppbmRleCBhMmZiYjY1Li41NmM2YmY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC9hcmNoLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvYXJjaC5oCkBAIC0yNiw3ICsyNiw3IEBACiAJCQkJCQkgKiBwYWdlIHRhYmUgZW50cnkJKi8KIAogCWNvbnN0IGNoYXIJCSpuYW1lOwkJLyogYXJjaGl0ZWN0dXJlIG5hbWUJKi8KLQl1bnNpZ25lZCBpbnQJCXBhcmFtX29mZnNldDsJLyogcGFyYW1ldGVyIHBhZ2UJKi8KKwl1bnNpZ25lZCBsb25nCQlib290X3BhcmFtczsJLyogdGFnZ2VkIGxpc3QJCSovCiAKIAl1bnNpZ25lZCBpbnQJCXZpZGVvX3N0YXJ0OwkvKiBzdGFydCBvZiB2aWRlbyBSQU0JKi8KIAl1bnNpZ25lZCBpbnQJCXZpZGVvX2VuZDsJLyogZW5kIG9mIHZpZGVvIFJBTQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL210ZC14aXAuaCBiL2luY2x1ZGUvYXNtLWFybS9tdGQteGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViMTI3Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL210ZC14aXAuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogTVREIHByaW1pdGl2ZXMgZm9yIFhJUCBzdXBwb3J0LiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgZnVuY3Rpb25zCisgKgorICogRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiBJdCdzIGluY2x1ZGVkIGZyb20gbGludXgvbXRkL3hpcC5oCisgKiAKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJTm92IDIsIDIwMDQKKyAqIENvcHlyaWdodDoJKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogJElkOiB4aXAuaCx2IDEuMiAyMDA0LzEyLzAxIDE1OjQ5OjEwIG5pY28gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVJNX01URF9YSVBfSF9fCisjZGVmaW5lIF9fQVJNX01URF9YSVBfSF9fCisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdGQteGlwLmg+CisKKy8qIGZpbGwgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2ggKi8KKyNkZWZpbmUgeGlwX2lwcmVmZXRjaCgpIAlkbyB7IGFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOyB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogX19BUk1fTVREX1hJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wY2kuaCBiL2luY2x1ZGUvYXNtLWFybS9wY2kuaAppbmRleCBlMzAwNjQ2Li5iMjhmMWM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3BjaS5oCkBAIC0xNCw3ICsxNCw3IEBACiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3NtcC5oIGIvaW5jbHVkZS9hc20tYXJtL3NtcC5oCmluZGV4IDZjNmM2MGEuLmRiYjRkODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc21wLmgKQEAgLTIzLDkgKzIzLDYgQEAKIAogI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSkKIAotZXh0ZXJuIGNwdW1hc2tfdCBjcHVfcHJlc2VudF9tYXNrOwotI2RlZmluZSBjcHVfcG9zc2libGVfbWFwIGNwdV9wcmVzZW50X21hc2sKLQogLyoKICAqIGF0IHRoZSBtb21lbnQsIHRoZXJlJ3Mgbm90IGEgYmlnIHBlbmFsdHkgZm9yIGNoYW5naW5nIENQVXMKICAqICh0aGUgPmJpZzwgcGVuYWx0eSBpcyBydW5uaW5nIFNNUCBpbiB0aGUgZmlyc3QgcGxhY2UpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vc3RhdC5oIGIvaW5jbHVkZS9hc20tYXJtL3N0YXQuaAppbmRleCBjYThlN2E4Li5lYzRlMmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vc3RhdC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9zdGF0LmgKQEAgLTg5LDYgKzg5LDYgQEAKIAl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CiAKIAl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOwotfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvcGNpLmggYi9pbmNsdWRlL2FzbS1oODMwMC9wY2kuaAppbmRleCBkMDMyNzI5Li41ZWRhZDViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9wY2kuaApAQCAtMTUsNyArMTUsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitleHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oIGIvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmgKaW5kZXggYzk3NmMxZC4uY2Y4MjhhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmgKQEAgLTI4LDYgKzI4LDggQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGFjcGkvcGRjX2ludGVsLmg+CisKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CQkvKiBkZWZpbmVzIGNtcHhjaGcgKi8KIAogI2RlZmluZSBDT01QSUxFUl9ERVBFTkRFTlRfSU5UNjQgICBsb25nIGxvbmcKQEAgLTEwMSwxMiArMTAzLDYgQEAKICAgICAgICAgOiI9ciIobl9oaSksICI9ciIobl9sbykgICAgIFwKICAgICAgICAgOiIwIihuX2hpKSwgIjEiKG5fbG8pKQogCi0vKgotICogUmVmZXIgSW50ZWwgQUNQSSBfUERDIHN1cHBvcnQgZG9jdW1lbnQgZm9yIGJpdCBkZWZpbml0aW9ucwotICovCi0jZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUCAJMHhhCi0jZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX01TUgkweDEKLQogI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QgCiBleHRlcm4gaW50IGFjcGlfbGFwaWM7CiBleHRlcm4gaW50IGFjcGlfaW9hcGljOwpAQCAtMTg1LDYgKzE4MSw4IEBACiAKIGV4dGVybiB1OCB4ODZfYWNwaWlkX3RvX2FwaWNpZFtdOwogCisjZGVmaW5lIEFSQ0hfSEFTX1BPV0VSX1BEQ19JTklUCTEKKwogI2VuZGlmIC8qX19LRVJORUxfXyovCiAKICNlbmRpZiAvKl9BU01fQUNQSV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYXBpY2RlZi5oIGIvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmgKaW5kZXggMGZlZDVlMy4uYTk2YThmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmgKQEAgLTEwOSwxMSArMTA5LDcgQEAKIAogI2RlZmluZSBBUElDX0JBU0UgKGZpeF90b192aXJ0KEZJWF9BUElDX0JBU0UpKQogCi0jaWZkZWYgQ09ORklHX05VTUEKLSAjZGVmaW5lIE1BWF9JT19BUElDUyAzMgotI2Vsc2UKLSAjZGVmaW5lIE1BWF9JT19BUElDUyA4Ci0jZW5kaWYKKyNkZWZpbmUgTUFYX0lPX0FQSUNTIDY0CiAKIC8qCiAgKiB0aGUgbG9jYWwgQVBJQyByZWdpc3RlciBzdHJ1Y3R1cmUsIG1lbW9yeSBtYXBwZWQuIE5vdCB0ZXJyaWJseSB3ZWxsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9tbXpvbmUuaAppbmRleCAzM2NlNWQzLi41MTY0MjEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbW16b25lLmgKQEAgLTgsMjAgKzgsMTUgQEAKIAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAotI2lmIENPTkZJR19OVU1BCisjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiBzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGVfZGF0YVtdOwogI2RlZmluZSBOT0RFX0RBVEEobmlkKQkobm9kZV9kYXRhW25pZF0pCiAKLSNpZmRlZiBDT05GSUdfTlVNQQotCSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi0JCSNpbmNsdWRlIDxhc20vbnVtYXEuaD4KLQkjZWxzZQkvKiBzdW1taXQgb3IgZ2VuZXJpYyBhcmNoICovCi0JCSNpbmNsdWRlIDxhc20vc3JhdC5oPgotCSNlbmRpZgotI2Vsc2UgLyogIUNPTkZJR19OVU1BICovCi0JI2RlZmluZSBnZXRfbWVtY2ZnX251bWEgZ2V0X21lbWNmZ19udW1hX2ZsYXQKLQkjZGVmaW5lIGdldF96aG9sZXNfc2l6ZShuKSAoMCkKLSNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLworI2lmZGVmIENPTkZJR19YODZfTlVNQVEKKwkjaW5jbHVkZSA8YXNtL251bWFxLmg+CisjZWxzZQkvKiBzdW1taXQgb3IgZ2VuZXJpYyBhcmNoICovCisJI2luY2x1ZGUgPGFzbS9zcmF0Lmg+CisjZW5kaWYKIAogZXh0ZXJuIGludCBnZXRfbWVtY2ZnX251bWFfZmxhdCh2b2lkICk7CiAvKgpAQCAtNDIsNiArMzcsMTEgQEAKIAlnZXRfbWVtY2ZnX251bWFfZmxhdCgpOwogfQogCitleHRlcm4gaW50IGVhcmx5X3Bmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pOworCisjZWxzZSAvKiAhQ09ORklHX05VTUEgKi8KKyNkZWZpbmUgZ2V0X21lbWNmZ19udW1hIGdldF9tZW1jZmdfbnVtYV9mbGF0CisjZGVmaW5lIGdldF96aG9sZXNfc2l6ZShuKSAoMCkKICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCiAjaWZkZWYgQ09ORklHX0RJU0NPTlRJR01FTQpAQCAtMTUxLDYgKzE1MSw0IEBACiAKICNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLwogCi1leHRlcm4gaW50IGVhcmx5X3Bmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pOwotCiAjZW5kaWYgLyogX0FTTV9NTVpPTkVfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGNpLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BjaS5oCmluZGV4IDM1NjE4OTkuLjc4Yzg1OTg1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BjaS5oCkBAIC0yNyw3ICsyNyw3IEBACiBzdHJ1Y3QgcGNpX2J1cyAqIHBjaWJpb3Nfc2Nhbl9yb290KGludCBidXMpOwogCiB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLXZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpOwordm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSk7CiBzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKnBjaWJpb3NfZ2V0X2lycV9yb3V0aW5nX3RhYmxlKHZvaWQpOwogaW50IHBjaWJpb3Nfc2V0X2lycV9yb3V0aW5nKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaW4sIGludCBpcnEpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAppbmRleCA2ZjBmOTNkLi41ZDA2ZTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKQEAgLTY5NCw0ICs2OTQsMTIgQEAKIGV4dGVybiB2b2lkIGVuYWJsZV9zZXBfY3B1KHZvaWQpOwogZXh0ZXJuIGludCBzeXNlbnRlcl9zZXR1cCh2b2lkKTsKIAorI2lmZGVmIENPTkZJR19NVFJSCitleHRlcm4gdm9pZCBtdHJyX2FwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtdHJyX2JwX2luaXQodm9pZCk7CisjZWxzZQorI2RlZmluZSBtdHJyX2FwX2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbXRycl9icF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQVNNX0kzODZfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCmluZGV4IGUyNWU0YzcuLmE3Y2IzNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaApAQCAtMjk2LDggKzI5NiwxMSBAQAogI2RlZmluZSBfX05SX2tleWN0bAkJMjg4CiAjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjg5CiAjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjkwCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI5MQorI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI5MgorI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjkzCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMjkxCisjZGVmaW5lIE5SX3N5c2NhbGxzIDI5NAogCiAvKgogICogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC0xMjg6IHNlZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9hY3BpLmggYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAppbmRleCA2YTI2YTk3Li40YzA2ZDQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaApAQCAtOTgsNiArOTgsMTUgQEAKIGludCBhY3BpX3JlcXVlc3RfdmVjdG9yICh1MzIgaW50X3R5cGUpOwogaW50IGFjcGlfZ3NpX3RvX2lycSAodTMyIGdzaSwgdW5zaWduZWQgaW50ICppcnEpOwogCisvKgorICogUmVjb3JkIHRoZSBjcGVpIG92ZXJyaWRlIGZsYWcgYW5kIGN1cnJlbnQgbG9naWNhbCBjcHUuIFRoaXMgaXMKKyAqIHVzZWZ1bCBmb3IgQ1BVIHJlbW92YWwuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgY2FuX2NwZWlfcmV0YXJnZXQodm9pZCk7CitleHRlcm4gdW5zaWduZWQgaW50IGlzX2NwdV9jcGVpX3RhcmdldCh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIHNldF9jcGVpX3RhcmdldF9jcHUodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdW5zaWduZWQgaW50IGdldF9jcGVpX3RhcmdldF9jcHUodm9pZCk7CisKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAvKiBQcm94aW1pdHkgYml0bWFwIGxlbmd0aDsgX1BYTSBpcyBhdCBtb3N0IDI1NSAoOCBiaXQpKi8KICNkZWZpbmUgTUFYX1BYTV9ET01BSU5TICgyNTYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oIGIvaW5jbHVkZS9hc20taWE2NC9od19pcnEuaAppbmRleCBjZDRlMDZiLi4wNDFhYjhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaHdfaXJxLmgKQEAgLTgxLDcgKzgxLDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9pYTY0X2xzYXBpYzsJLyogQ1BVLWludGVybmFsIGludGVycnVwdCBjb250cm9sbGVyICovCiAKLWV4dGVybiBpbnQgYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyAoaW50IGlycSk7IC8qIGFsbG9jYXRlIGEgZnJlZSB2ZWN0b3Igd2l0aG91dCBwYW5pYyAqLwogZXh0ZXJuIGludCBhc3NpZ25faXJxX3ZlY3RvciAoaW50IGlycSk7CS8qIGFsbG9jYXRlIGEgZnJlZSB2ZWN0b3IgKi8KIGV4dGVybiB2b2lkIGZyZWVfaXJxX3ZlY3RvciAoaW50IHZlY3Rvcik7CiBleHRlcm4gdm9pZCBpYTY0X3NlbmRfaXBpIChpbnQgY3B1LCBpbnQgdmVjdG9yLCBpbnQgZGVsaXZlcnlfbW9kZSwgaW50IHJlZGlyZWN0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oCmluZGV4IDBjNGM1ZDguLmYxMTc3MWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wY2kuaApAQCAtNDcsNyArNDcsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycSAoaW50IGlycSkKK3BjaWJpb3NfcGVuYWxpemVfaXNhX2lycSAoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9hcmNoLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FyY2guaAppbmRleCA2MzVmZGNlLi5hYjgyN2QyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2FyY2guaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FyY2guaApAQCAtMTEsNiArMTEsNyBAQAogI2lmbmRlZiBfQVNNX0lBNjRfU05fQVJDSF9ICiAjZGVmaW5lIF9BU01fSUE2NF9TTl9BUkNIX0gKIAorI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2ludHIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCmluZGV4IGU1MTQ3MWYuLmUxOTBkZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCkBAIC05LDYgKzksOCBAQAogI2lmbmRlZiBfQVNNX0lBNjRfU05fSU5UUl9ICiAjZGVmaW5lIF9BU01fSUE2NF9TTl9JTlRSX0gKIAorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisKICNkZWZpbmUgU0dJX1VBUlRfVkVDVE9SCQkoMHhlOSkKICNkZWZpbmUgU0dJX1BDSUJSX0VSUk9SCQkoMHgzMykKIApAQCAtMzMsNyArMzUsNyBAQAogCiAvLyBUaGUgU04gUFJPTSBpcnEgc3RydWN0CiBzdHJ1Y3Qgc25faXJxX2luZm8gewotCXN0cnVjdCBzbl9pcnFfaW5mbyAqaXJxX25leHQ7CS8qIHNoYXJpbmcgaXJxIGxpc3QJICAgICAqLworCXN0cnVjdCBzbl9pcnFfaW5mbyAqaXJxX25leHQ7CS8qIGRlcHJlY2F0ZWQgRE8gTk9UIFVTRSAgICAgKi8KIAlzaG9ydAkJaXJxX25hc2lkOwkvKiBOYXNpZCBJUlEgaXMgYXNzaWduZWQgdG8gICovCiAJaW50CQlpcnFfc2xpY2U7CS8qIHNsaWNlIElSUSBpcyBhc3NpZ25lZCB0byAgKi8KIAlpbnQJCWlycV9jcHVpZDsJLyoga2VybmVsIGxvZ2ljYWwgY3B1aWQJICAgICAqLwpAQCAtNDcsNiArNDksOCBAQAogCWludAkJaXJxX2Nvb2tpZTsJLyogdW5pcXVlIGNvb2tpZSAJICAgICAqLwogCWludAkJaXJxX2ZsYWdzOwkvKiBmbGFncyAqLwogCWludAkJaXJxX3NoYXJlX2NudDsJLyogbnVtIGRldmljZXMgc2hhcmluZyBJUlEgICAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJLyogbGlzdCBvZiBzbl9pcnFfaW5mbyBzdHJ1Y3RzICovCisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CS8qIHJjdSBjYWxsYmFjayBsaXN0ICovCiB9OwogCiBleHRlcm4gdm9pZCBzbl9zZW5kX0lQSV9waHlzKGludCwgbG9uZywgaW50LCBpbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BjaWJyX3Byb3ZpZGVyLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmgKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BjaWJyX3Byb3ZpZGVyLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnJfcHJvdmlkZXIuaAppbmRleCAxY2QyOTFkLi5mOWI4ZDIxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vaW5jbHVkZS9wY2kvcGNpYnJfcHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmgKQEAgLTgsNiArOCw5IEBACiAjaWZuZGVmIF9BU01fSUE2NF9TTl9QQ0lfUENJQlJfUFJPVklERVJfSAogI2RlZmluZSBfQVNNX0lBNjRfU05fUENJX1BDSUJSX1BST1ZJREVSX0gKIAorI2luY2x1ZGUgPGFzbS9zbi9pbnRyLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CisKIC8qIFdvcmthcm91bmRzICovCiAjZGVmaW5lIFBWOTA3NTE2ICgxIDw8IDEpIC8qIFRJT0NQOiBEb24ndCB3cml0ZSB0aGUgd3JpdGUgYnVmZmVyIGZsdXNoIHJlZyAqLwogCkBAIC0yMCw3ICsyMyw3IEBACiAjZGVmaW5lIElTX1BJQ19TT0ZUKHBzKSAgICAgKHBzLT5wYmlfYnJpZGdlX3R5cGUgPT0gUENJQlJfQlJJREdFVFlQRV9QSUMpCiAKIAotLyogCisvKgogICogVGhlIGRpZmZlcmVudCBQQ0kgQnJpZGdlIHR5cGVzIHN1cHBvcnRlZCBvbiB0aGUgU0dJIEFsdGl4IHBsYXRmb3JtcwogICovCiAjZGVmaW5lIFBDSUJSX0JSSURHRVRZUEVfVU5LTk9XTiAgICAgICAtMQpAQCAtMTAwLDE1ICsxMDMsMTYgQEAKIAogCXN0cnVjdCBhdGVfcmVzb3VyY2UgICAgIHBiaV9pbnRfYXRlX3Jlc291cmNlOwogCXVpbnQ2NF90ICAgICAgICAgICAgICAgIHBiaV9pbnRfYXRlX3NpemU7Ci0JCisKIAl1aW50NjRfdCAgICAgICAgICAgICAgICBwYmlfZGlyX3hiYXNlOwogCWNoYXIgICAgICAgICAgICAgICAgICAgIHBiaV9odWJfeGlkOwogCiAJdWludDY0X3QgICAgICAgICAgICAgICAgcGJpX2RldnJlZ1s4XTsKLQlzcGlubG9ja190ICAgICAgICAgICAgICBwYmlfbG9jazsKIAogCXVpbnQzMl90CQlwYmlfdmFsaWRfZGV2aWNlczsKIAl1aW50MzJfdAkJcGJpX2VuYWJsZWRfZGV2aWNlczsKKworCXNwaW5sb2NrX3QgICAgICAgICAgICAgIHBiaV9sb2NrOwogfTsKIAogLyoKQEAgLTE0OCw0ICsxNTIsOCBAQAogZXh0ZXJuIGludCAJCXBjaWJyX2F0ZV9hbGxvYyhzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50KTsKIGV4dGVybiB2b2lkIAkJcGNpYnJfYXRlX2ZyZWUoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7CiBleHRlcm4gdm9pZCAJCWF0ZV93cml0ZShzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50LCBpbnQsIHVpbnQ2NF90KTsKK2V4dGVybiBpbnQgc2FsX3BjaWJyX3Nsb3RfZW5hYmxlKHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCwgaW50IGRldmljZSwKKwkJCQkgdm9pZCAqcmVzcCk7CitleHRlcm4gaW50IHNhbF9wY2licl9zbG90X2Rpc2FibGUoc3RydWN0IHBjaWJ1c19pbmZvICpzb2Z0LCBpbnQgZGV2aWNlLAorCQkJCSAgaW50IGFjdGlvbiwgdm9pZCAqcmVzcCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oCmluZGV4IGVkNDAzMWQuLjQ5NzExZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaApAQCAtMTAsMTEgKzEwLDExIEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotZXh0ZXJuIHN0cnVjdCBzbl9pcnFfaW5mbyAqKnNuX2lycTsKLQogI2RlZmluZSBTTl9QQ0lERVZfSU5GTyhwY2lfZGV2KSBcCiAgICAgICAgICgoc3RydWN0IHBjaWRldl9pbmZvICopKHBjaV9kZXYpLT5zeXNkYXRhKQogCisjZGVmaW5lIFNOX1BDSUJVU19CVVNTT0ZUX0lORk8ocGNpX2J1cykgXAorCShzdHJ1Y3QgcGNpYnVzX2luZm8gKikoKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKShQQ0lfQ09OVFJPTExFUigocGNpX2J1cykpLT5wbGF0Zm9ybV9kYXRhKSkKIC8qCiAgKiBHaXZlbiBhIHBjaV9idXMsIHJldHVybiB0aGUgc24gcGNpYnVzX2J1c3NvZnQgc3RydWN0LiAgTm90ZSB0aGF0CiAgKiB0aGlzIG9ubHkgd29ya3MgZm9yIHJvb3QgYnVzc2VzLCBub3QgZm9yIGJ1c3NlcyByZXByZXNlbnRlZCBieSBQUEIncy4KQEAgLTIzLDYgKzIzLDggQEAKICNkZWZpbmUgU05fUENJQlVTX0JVU1NPRlQocGNpX2J1cykgXAogICAgICAgICAoKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKShQQ0lfQ09OVFJPTExFUigocGNpX2J1cykpLT5wbGF0Zm9ybV9kYXRhKSkKIAorI2RlZmluZSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpIFwKKwkoc3RydWN0IHBjaWJ1c19pbmZvICopKChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKikoUENJX0NPTlRST0xMRVIoKHBjaV9idXMpKS0+cGxhdGZvcm1fZGF0YSkpCiAvKgogICogR2l2ZW4gYSBzdHJ1Y3QgcGNpX2RldiwgcmV0dXJuIHRoZSBzbiBwY2lidXNfYnVzc29mdCBzdHJ1Y3QuICBOb3RlCiAgKiB0aGF0IHRoaXMgaXMgbm90IGVxdWl2YWxlbnQgdG8gU05fUENJQlVTX0JVU1NPRlQocGNpX2Rldi0+YnVzKSBkdWUKQEAgLTUwLDkgKzUyLDE3IEBACiAKIAlzdHJ1Y3Qgc25faXJxX2luZm8JKnBkaV9zbl9pcnFfaW5mbzsKIAlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwZGlfcHJvdmlkZXI7CS8qIHNuIHBjaSBvcHMgKi8KKwlzdHJ1Y3QgcGNpX2RldiAJCSpob3N0X3BjaV9kZXY7CQkvKiBob3N0IGJ1cyBsaW5rICovCiB9OwogCiBleHRlcm4gdm9pZCBzbl9pcnFfZml4dXAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCiAJCQkgc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbyk7Ci0KK2V4dGVybiB2b2lkIHNuX2lycV91bmZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKK2V4dGVybiB2b2lkIHNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKGludCBzZWdtZW50LCBpbnQgYnVzbnVtLAorIAkJCQkgICAgc3RydWN0IHBjaV9idXMgKmJ1cyk7CitleHRlcm4gdm9pZCBzbl9idXNfc3RvcmVfc3lzZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIHNuX2J1c19mcmVlX3N5c2RhdGEodm9pZCk7CitleHRlcm4gdm9pZCBzbl9wY2lfZml4dXBfc2xvdChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIHNuX3BjaV91bmZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBzbl9pcnFfbGhfaW5pdCh2b2lkKTsKICNlbmRpZgkJCQkvKiBfQVNNX0lBNjRfU05fUENJX1BDSURFVl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vaW5jbHVkZS9wY2kvcGljLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BpYy5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvaWE2NC9zbi9pbmNsdWRlL3BjaS9waWMuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20taWE2NC9zbi9waWMuaAppbmRleCBmZDE4YWNlLi4wZGU4MmU2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vaW5jbHVkZS9wY2kvcGljLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9waWMuaApAQCAtMTUsNyArMTUsNyBAQAogICogUElDIGhhbmRsZXMgUENJL1ggYnVzc2VzLiAgUENJL1ggcmVxdWlyZXMgdGhhdCB0aGUgJ2JyaWRnZScgKGkuZS4gUElDKQogICogYmUgZGVzaWduYXRlZCBhcyAnZGV2aWNlIDAnLiAgIFRoYXQgaXMgYSBkZXBhcnR1cmUgZnJvbSBlYXJsaWVyIFNHSQogICogUENJIGJyaWRnZXMuICBCZWNhdXNlIG9mIHRoYXQgd2UgdXNlIGNvbmZpZyBzcGFjZSAxIHRvIGFjY2VzcyB0aGUKLSAqIGNvbmZpZyBzcGFjZSBvZiB0aGUgZmlyc3QgYWN0dWFsIFBDSSBkZXZpY2Ugb24gdGhlIGJ1cy4gCisgKiBjb25maWcgc3BhY2Ugb2YgdGhlIGZpcnN0IGFjdHVhbCBQQ0kgZGV2aWNlIG9uIHRoZSBidXMuCiAgKiBIZXJlJ3Mgd2hhdCB0aGUgUElDIG1hbnVhbCBzYXlzOgogICoKICAqICAgICBUaGUgY3VycmVudCBQQ0ktWCBidXMgc3BlY2lmaWNhdGlvbiBub3cgZGVmaW5lcyB0aGF0IHRoZSBwYXJlbnQKQEAgLTI5LDE0ICsyOSwxNCBAQAogICogICAgIGNvcnJlbGF0ZWQgQ29uZmlncyBwYWNlIGFuZCBvdXIgZGV2aWNlIHNwYWNlIDAgPC0+IDAsIDEgPC0+IDEsIGV0Yy4KICAqICAgICBQQ0ktWCByZXF1aXJlcyB3ZSBzdGFydCBhIDEsIG5vdCAwIGFuZCBjdXJyZW50bHkgdGhlIFBYIGJyaWNrCiAgKiAgICAgZG9lcyBhc3NvY2lhdGUgb3VyOgotICogCisgKgogICogICAgICAgICBkZXZpY2UgMCB3aXRoIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2luZG93IDEsCi0gKiAgICAgICAgIGRldmljZSAxIHdpdGggY29uZmlndXJhdGlvbiBzcGFjZSB3aW5kb3cgMiwgCisgKiAgICAgICAgIGRldmljZSAxIHdpdGggY29uZmlndXJhdGlvbiBzcGFjZSB3aW5kb3cgMiwKICAqICAgICAgICAgZGV2aWNlIDIgd2l0aCBjb25maWd1cmF0aW9uIHNwYWNlIHdpbmRvdyAzLAogICogICAgICAgICBkZXZpY2UgMyB3aXRoIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2luZG93IDQuCiAgKgotICogVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCBhbGwgY29uZmlnIHNwYWNlIGFjY2VzcyBhcmUgb2ZmLWJ5LW9uZSB3aXRoIAotICogcmVsYXRpb24gdG8gb3RoZXIgcGVyLXNsb3QgYWNjZXNzZXMgb24gdGhlIFBJQy4gICAKKyAqIFRoZSBuZXQgZWZmZWN0IGlzIHRoYXQgYWxsIGNvbmZpZyBzcGFjZSBhY2Nlc3MgYXJlIG9mZi1ieS1vbmUgd2l0aAorICogcmVsYXRpb24gdG8gb3RoZXIgcGVyLXNsb3QgYWNjZXNzZXMgb24gdGhlIFBJQy4KICAqIEhlcmUgaXMgYSB0YWJsZSB0aGF0IHNob3dzIHNvbWUgb2YgdGhhdDoKICAqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCBTbG90IwpAQCAtNjUsNyArNjUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBOT1RFOiBQSUMgV0FSLiBQViM4NTQ2OTcuICBQSUMgZG9lcyBub3QgYWxsb3cgd3JpdGVzIGp1c3QgdG8gWzMxOjBdCi0gKiBvZiBhIDY0LWJpdCByZWdpc3Rlci4gIFdoZW4gd3JpdGluZyBQSUMgcmVnaXN0ZXJzLCBhbHdheXMgd3JpdGUgdGhlIAorICogb2YgYSA2NC1iaXQgcmVnaXN0ZXIuICBXaGVuIHdyaXRpbmcgUElDIHJlZ2lzdGVycywgYWx3YXlzIHdyaXRlIHRoZQogICogZW50aXJlIDY0IGJpdHMuCiAgKi8KIApAQCAtMTY0LDcgKzE2NCw3IEBACiAJdWludDY0X3QJY2xlYXJfYWxsOwkJCS8qIDB4MDAwezQzOCwsLDVGOH0gKi8KICAgICB9IHBfYnVmX2NvdW50WzhdOwogCi0gICAgCisKICAgICAvKiAweDAwMDYwMC0weDAwMDlGRiAtLSBQQ0kvWCByZWdpc3RlcnMgKi8KICAgICB1aW50NjRfdAkJcF9wY2l4X2J1c19lcnJfYWRkcjsJCS8qIDB4MDAwNjAwICovCiAgICAgdWludDY0X3QJCXBfcGNpeF9idXNfZXJyX2F0dHI7CQkvKiAweDAwMDYwOCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9jcHVpZC5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9jcHVpZC5oCmluZGV4IDIwYjMwMDEuLmQyYzFkMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fY3B1aWQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX2NwdWlkLmgKQEAgLTgxLDExICs4MSw2IEBACiAgKgogICovCiAKLSNpZm5kZWYgQ09ORklHX1NNUAotI2RlZmluZSBjcHVfcGh5c2ljYWxfaWQoY3B1aWQpCQkJKChpYTY0X2dldHJlZyhfSUE2NF9SRUdfQ1JfTElEKSA+PiAxNikgJiAweGZmZmYpCi0jZW5kaWYKLQotCiAjZGVmaW5lIGdldF9ub2RlX251bWJlcihhZGRyKQkJCU5BU0lEX0dFVChhZGRyKQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKaW5kZXggMTQ1NTM3NS4uMjc5NzZkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCkBAIC0xMzQsNDMgKzEzNCwyOCBAQAogCiAjZGVmaW5lIFNOX1NBTF9GQUtFX1BST00JCQkgICAweDAyMDA5OTk5CiAKLQogLyoqCi0gKiBzbl9zYWxfcmV2X21ham9yIC0gZ2V0IHRoZSBtYWpvciBTR0kgU0FMIHJldmlzaW9uIG51bWJlcgotICoKLSAqIFRoZSBTR0kgUFJPTSBzdG9yZXMgaXRzIHZlcnNpb24gaW4gc2FsX1thYl1fcmV2XyhtYWpvcnxtaW5vcikuCi0gKiBUaGlzIHJvdXRpbmUgc2ltcGx5IGV4dHJhY3RzIHRoZSBtYWpvciB2YWx1ZSBmcm9tIHRoZQotICogQGlhNjRfc2FsX3N5c3RhYiBzdHJ1Y3R1cmUgY29uc3RydWN0ZWQgYnkgaWE2NF9zYWxfaW5pdCgpLgotICovCi1zdGF0aWMgaW5saW5lIGludAotc25fc2FsX3Jldl9tYWpvcih2b2lkKQorICAqIHNuX3NhbF9yZXZpc2lvbiAtIGdldCB0aGUgU0dJIFNBTCByZXZpc2lvbiBudW1iZXIKKyAgKgorICAqIFRoZSBTR0kgUFJPTSBzdG9yZXMgaXRzIHZlcnNpb24gaW4gdGhlIHNhbF9bYWJdX3Jldl8obWFqb3J8bWlub3IpLgorICAqIFRoaXMgcm91dGluZSBzaW1wbHkgZXh0cmFjdHMgdGhlIG1ham9yIGFuZCBtaW5vciB2YWx1ZXMgYW5kCisgICogcHJlc2VudHMgdGhlbSBpbiBhIHUzMiBmb3JtYXQuCisgICoKKyAgKiBGb3IgZXhhbXBsZSwgdmVyc2lvbiA0LjA1IHdvdWxkIGJlIHJlcHJlc2VudGVkIGF0IDB4MDQwNS4KKyAgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitzbl9zYWxfcmV2KHZvaWQpCiB7CiAJc3RydWN0IGlhNjRfc2FsX3N5c3RhYiAqc3lzdGFiID0gZWZpLnNhbF9zeXN0YWI7CiAKLQlyZXR1cm4gKGludClzeXN0YWItPnNhbF9iX3Jldl9tYWpvcjsKLX0KLQotLyoqCi0gKiBzbl9zYWxfcmV2X21pbm9yIC0gZ2V0IHRoZSBtaW5vciBTR0kgU0FMIHJldmlzaW9uIG51bWJlcgotICoKLSAqIFRoZSBTR0kgUFJPTSBzdG9yZXMgaXRzIHZlcnNpb24gaW4gc2FsX1thYl1fcmV2XyhtYWpvcnxtaW5vcikuCi0gKiBUaGlzIHJvdXRpbmUgc2ltcGx5IGV4dHJhY3RzIHRoZSBtaW5vciB2YWx1ZSBmcm9tIHRoZQotICogQGlhNjRfc2FsX3N5c3RhYiBzdHJ1Y3R1cmUgY29uc3RydWN0ZWQgYnkgaWE2NF9zYWxfaW5pdCgpLgotICovCi1zdGF0aWMgaW5saW5lIGludAotc25fc2FsX3Jldl9taW5vcih2b2lkKQotewotCXN0cnVjdCBpYTY0X3NhbF9zeXN0YWIgKnN5c3RhYiA9IGVmaS5zYWxfc3lzdGFiOwotCQotCXJldHVybiAoaW50KXN5c3RhYi0+c2FsX2JfcmV2X21pbm9yOworCXJldHVybiAodTMyKShzeXN0YWItPnNhbF9iX3Jldl9tYWpvciA8PCA4IHwgc3lzdGFiLT5zYWxfYl9yZXZfbWlub3IpOwogfQogCiAvKgogICogU3BlY2lmeSB0aGUgbWluaW11bSBQUk9NIHJldnNpb24gcmVxdWlyZWQgZm9yIHRoaXMga2VybmVsLgogICogTm90ZSB0aGF0IHRoZXkncmUgc3RvcmVkIGluIGhleCBmb3JtYXQuLi4KICAqLwotI2RlZmluZSBTTl9TQUxfTUlOX01BSk9SCTB4NCAgLyogU04yIGtlcm5lbHMgbmVlZCBhdCBsZWFzdCBQUk9NIDQuMCAqLwotI2RlZmluZSBTTl9TQUxfTUlOX01JTk9SCTB4MAorI2RlZmluZSBTTl9TQUxfTUlOX1ZFUlNJT04JMHgwNDA0CiAKIC8qCiAgKiBSZXR1cm5zIHRoZSBtYXN0ZXIgY29uc29sZSBuYXNpZCwgaWYgdGhlIGNhbGwgZmFpbHMsIHJldHVybiBhbiBpbGxlZ2FsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vaW5jbHVkZS9wY2kvdGlvY3AuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY3AuaApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBhcmNoL2lhNjQvc24vaW5jbHVkZS9wY2kvdGlvY3AuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20taWE2NC9zbi90aW9jcC5oCmluZGV4IGYwN2M4M2IuLjVmMjQ4OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3BjaS90aW9jcC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY3AuaApAQCAtMTExLDcgKzExMSw3IEBACiAJdWludDY0X3QJY2xlYXJfYWxsOwkJCS8qIDB4MDAwezQzOCwsLDVGOH0gKi8KICAgICB9IGNwX2J1Zl9jb3VudFs4XTsKIAotICAgIAorCiAgICAgLyogMHgwMDA2MDAtMHgwMDA5RkYgLS0gUENJL1ggcmVnaXN0ZXJzICovCiAgICAgdWludDY0X3QJCWNwX3BjaXhfYnVzX2Vycl9hZGRyOwkJLyogMHgwMDA2MDAgKi8KICAgICB1aW50NjRfdAkJY3BfcGNpeF9idXNfZXJyX2F0dHI7CQkvKiAweDAwMDYwOCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oCmluZGV4IDk5MDIxODUuLjFkZjFjOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwLmgKQEAgLTE2LDcgKzE2LDYgQEAKICNkZWZpbmUgX0FTTV9JQTY0X1NOX1hQX0gKIAogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zMWQxMzgwNi5oIGIvaW5jbHVkZS9hc20tbTMyci9zMWQxMzgwNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGQzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3MxZDEzODA2LmgKQEAgLTAsMCArMSwxOTkgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBGaWxlIGdlbmVyYXRlZCBieSBTMUQxMzgwNkNGRy5FWEUKKy8vCisvLyAgQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRXBzb24gUmVzZWFyY2ggYW5kIERldmVsb3BtZW50LCBJbmMuCisvLyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUGFuZWw6ICAoYWN0aXZlKSAgNjQweDQ4MCA3N0h6IFNUTiBTaW5nbGUgOC1iaXQgKFBDTEs9Q0xLST0yNS4xNzVNSHopCisvLyBNZW1vcnk6IEVtYmVkZGVkIFNEUkFNIChNQ0xLPUNMS0kzPTUwLjAwME1IeikgKEJVU0NMSz0zMy4zMzNNSHopCisKKyNkZWZpbmUgU1dJVkVMX1ZJRVcJCTAJLyogMDpub25lLCAxOjkwIG5vdCBjb21wbGV0ZWQgKi8KKworc3RhdGljIHN0cnVjdCBzMWQxM3h4eGZiX3JlZ3ZhbCBzMWQxM3h4eGZiX2luaXRyZWdzW10gPSB7CisKKyAgICB7MHgwMDAxLDB4MDB9LCAgIC8vIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXIKKyAgICB7MHgwMUZDLDB4MDB9LCAgIC8vIERpc3BsYXkgTW9kZSBSZWdpc3RlcgorI2lmIGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkpCisgICAgezB4MDAwNCwweDAwfSwgICAvLyBHZW5lcmFsIElPIFBpbnMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwCisgICAgezB4MDAwNSwweDAwfSwgICAvLyBHZW5lcmFsIElPIFBpbnMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCisgICAgezB4MDAwOCwweDAwfSwgICAvLyBHZW5lcmFsIElPIFBpbnMgQ29udHJvbCBSZWdpc3RlciAwCisgICAgezB4MDAwOSwweDAwfSwgICAvLyBHZW5lcmFsIElPIFBpbnMgQ29udHJvbCBSZWdpc3RlciAxCisgICAgezB4MDAxMCwweDAwfSwgICAvLyBNZW1vcnkgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMTQsMHgwMH0sICAgLy8gTENEIFBpeGVsIENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDE4LDB4MDB9LCAgIC8vIENSVC9UViBQaXhlbCBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAxQywweDAwfSwgICAvLyBNZWRpYVBsdWcgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorLyoKKyAqIC4uIDEwTUh6OiAweDAwCisgKiAuLiAzME1IejogMHgwMQorICogMzBNSHogLi46IDB4MDIKKyAqLworICAgIHsweDAwMUUsMHgwMn0sICAgLy8gQ1BVIFRvIE1lbW9yeSBXYWl0IFN0YXRlIFNlbGVjdCBSZWdpc3RlcgorICAgIHsweDAwMjEsMHgwMn0sICAgLy8gRFJBTSBSZWZyZXNoIFJhdGUgUmVnaXN0ZXIKKyAgICB7MHgwMDJBLDB4MTF9LCAgIC8vIERSQU0gVGltaW5ncyBDb250cm9sIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDJCLDB4MTN9LCAgIC8vIERSQU0gVGltaW5ncyBDb250cm9sIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDIwLDB4ODB9LCAgIC8vIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAzMCwweDI1fSwgICAvLyBQYW5lbCBUeXBlIFJlZ2lzdGVyCisgICAgezB4MDAzMSwweDAwfSwgICAvLyBNT0QgUmF0ZSBSZWdpc3RlcgorICAgIHsweDAwMzIsMHg0Rn0sICAgLy8gTENEIEhvcml6b250YWwgRGlzcGxheSBXaWR0aCBSZWdpc3RlcgorICAgIHsweDAwMzQsMHgxMn0sICAgLy8gTENEIEhvcml6b250YWwgTm9uLURpc3BsYXkgUGVyaW9kIFJlZ2lzdGVyCisgICAgezB4MDAzNSwweDAxfSwgICAvLyBURlQgRlBMSU5FIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAzNiwweDBCfSwgICAvLyBURlQgRlBMSU5FIFB1bHNlIFdpZHRoIFJlZ2lzdGVyCisgICAgezB4MDAzOCwweERGfSwgICAvLyBMQ0QgVmVydGljYWwgRGlzcGxheSBIZWlnaHQgUmVnaXN0ZXIgMAorICAgIHsweDAwMzksMHgwMX0sICAgLy8gTENEIFZlcnRpY2FsIERpc3BsYXkgSGVpZ2h0IFJlZ2lzdGVyIDEKKyAgICB7MHgwMDNBLDB4MkN9LCAgIC8vIExDRCBWZXJ0aWNhbCBOb24tRGlzcGxheSBQZXJpb2QgUmVnaXN0ZXIKKyAgICB7MHgwMDNCLDB4MEF9LCAgIC8vIFRGVCBGUEZSQU1FIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAzQywweDAxfSwgICAvLyBURlQgRlBGUkFNRSBQdWxzZSBXaWR0aCBSZWdpc3RlcgorCisgICAgezB4MDA0MSwweDAwfSwgICAvLyBMQ0QgTWlzY2VsbGFuZW91cyBSZWdpc3RlcgorICAgIHsweDAwNDIsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAwCisgICAgezB4MDA0MywweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDQ0LDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMgorCisjZWxpZiBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX09QU1BVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSTMpCisgICAgezB4MDAwNCwweDA3fSwgICAvLyBHUElPWzA6N10gZGlyZWN0aW9uCisgICAgezB4MDAwNSwweDAwfSwgICAvLyBHUElPWzg6MTJdIGRpcmVjdGlvbgorICAgIHsweDAwMDgsMHgwMH0sICAgLy8gR1BJT1swOjddIGRhdGEKKyAgICB7MHgwMDA5LDB4MDB9LCAgIC8vIEdQSU9bODoxMl0gZGF0YQorICAgIHsweDAwMDgsMHgwNH0sICAgLy8gTENEIHBhbmVsIFZjYyBvbgorICAgIHsweDAwMDgsMHgwNX0sICAgLy8gTENEIHBhbmVsIHJlc2V0CisgICAgezB4MDAxMCwweDAxfSwgICAvLyBNZW1vcnkgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMTQsMHgzMH0sICAgLy8gTENEIFBpeGVsIENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKENMS0kgMjJNSHovNCkKKyAgICB7MHgwMDE4LDB4MDB9LCAgIC8vIENSVC9UViBQaXhlbCBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAxQywweDAwfSwgICAvLyBNZWRpYVBsdWcgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcigxME1IeikKKyAgICB7MHgwMDFFLDB4MDB9LCAgIC8vIENQVSBUbyBNZW1vcnkgV2FpdCBTdGF0ZSBTZWxlY3QgUmVnaXN0ZXIKKyAgICB7MHgwMDIwLDB4ODB9LCAgIC8vIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAyMSwweDAzfSwgICAvLyBEUkFNIFJlZnJlc2ggUmF0ZSBSZWdpc3RlcgorICAgIHsweDAwMkEsMHgwMH0sICAgLy8gRFJBTSBUaW1pbmdzIENvbnRyb2wgUmVnaXN0ZXIgMAorICAgIHsweDAwMkIsMHgwMX0sICAgLy8gRFJBTSBUaW1pbmdzIENvbnRyb2wgUmVnaXN0ZXIgMQorICAgIHsweDAwMzAsMHgyNX0sICAgLy8gUGFuZWwgVHlwZSBSZWdpc3RlcgorICAgIHsweDAwMzEsMHgwMH0sICAgLy8gTU9EIFJhdGUgUmVnaXN0ZXIKKyAgICB7MHgwMDMyLDB4MWR9LCAgIC8vIExDRCBIb3Jpem9udGFsIERpc3BsYXkgV2lkdGggUmVnaXN0ZXIKKyAgICB7MHgwMDM0LDB4MDV9LCAgIC8vIExDRCBIb3Jpem9udGFsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorICAgIHsweDAwMzUsMHgwMX0sICAgLy8gVEZUIEZQTElORSBTdGFydCBQb3NpdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMzYsMHgwMX0sICAgLy8gVEZUIEZQTElORSBQdWxzZSBXaWR0aCBSZWdpc3RlcgorICAgIHsweDAwMzgsMHgzRn0sICAgLy8gTENEIFZlcnRpY2FsIERpc3BsYXkgSGVpZ2h0IFJlZ2lzdGVyIDAKKyAgICB7MHgwMDM5LDB4MDF9LCAgIC8vIExDRCBWZXJ0aWNhbCBEaXNwbGF5IEhlaWdodCBSZWdpc3RlciAxCisgICAgezB4MDAzQSwweDBifSwgICAvLyBMQ0QgVmVydGljYWwgTm9uLURpc3BsYXkgUGVyaW9kIFJlZ2lzdGVyCisgICAgezB4MDAzQiwweDA3fSwgICAvLyBURlQgRlBGUkFNRSBTdGFydCBQb3NpdGlvbiBSZWdpc3RlcgorICAgIHsweDAwM0MsMHgwMn0sICAgLy8gVEZUIEZQRlJBTUUgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKworICAgIHsweDAwNDEsMHgwMH0sICAgLy8gTENEIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXIKKyNpZiAoU1dJVkVMX1ZJRVcgPT0gMCkKKyAgICB7MHgwMDQyLDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMAorICAgIHsweDAwNDMsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAxCisgICAgezB4MDA0NCwweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDIKKworI2VsaWYgKFNXSVZFTF9WSUVXID09IDEpCisgICAgLy8gMTAyNCAtIFcoMzIwKSA9IDB4MkMwCisgICAgezB4MDA0MiwweEMwfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDQzLDB4MDJ9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMQorICAgIHsweDAwNDQsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAyCisgICAgLy8gMTAyNAorICAgIHsweDAwNDYsMHgwMH0sICAgLy8gTENEIE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAwCisgICAgezB4MDA0NywweDAyfSwgICAvLyBMQ0QgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDEKKyNlbHNlCisjZXJyb3IgdW5zdXBwb3J0ZWQgU1dJVkVMX1ZJRVcgbW9kZQorI2VuZGlmCisjZWxzZQorI2Vycm9yIG5vIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KKyNlbmRpZiAgLyogQ09ORklHX1BMQVRfWFhYICovCisKKyAgICB7MHgwMDQ4LDB4MDB9LCAgIC8vIExDRCBQaXhlbCBQYW5uaW5nIFJlZ2lzdGVyCisgICAgezB4MDA0QSwweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBGSUZPIEhpZ2ggVGhyZXNob2xkIENvbnRyb2wgUmVnaXN0ZXIKKyAgICB7MHgwMDRCLDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IEZJRk8gTG93IFRocmVzaG9sZCBDb250cm9sIFJlZ2lzdGVyCisgICAgezB4MDA1MCwweDRGfSwgICAvLyBDUlQvVFYgSG9yaXpvbnRhbCBEaXNwbGF5IFdpZHRoIFJlZ2lzdGVyCisgICAgezB4MDA1MiwweDEzfSwgICAvLyBDUlQvVFYgSG9yaXpvbnRhbCBOb24tRGlzcGxheSBQZXJpb2QgUmVnaXN0ZXIKKyAgICB7MHgwMDUzLDB4MDF9LCAgIC8vIENSVC9UViBIUlRDIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisgICAgezB4MDA1NCwweDBCfSwgICAvLyBDUlQvVFYgSFJUQyBQdWxzZSBXaWR0aCBSZWdpc3RlcgorICAgIHsweDAwNTYsMHhERn0sICAgLy8gQ1JUL1RWIFZlcnRpY2FsIERpc3BsYXkgSGVpZ2h0IFJlZ2lzdGVyIDAKKyAgICB7MHgwMDU3LDB4MDF9LCAgIC8vIENSVC9UViBWZXJ0aWNhbCBEaXNwbGF5IEhlaWdodCBSZWdpc3RlciAxCisgICAgezB4MDA1OCwweDJCfSwgICAvLyBDUlQvVFYgVmVydGljYWwgTm9uLURpc3BsYXkgUGVyaW9kIFJlZ2lzdGVyCisgICAgezB4MDA1OSwweDA5fSwgICAvLyBDUlQvVFYgVlJUQyBTdGFydCBQb3NpdGlvbiBSZWdpc3RlcgorICAgIHsweDAwNUEsMHgwMX0sICAgLy8gQ1JUL1RWIFZSVEMgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKyAgICB7MHgwMDVCLDB4MTB9LCAgIC8vIFRWIE91dHB1dCBDb250cm9sIFJlZ2lzdGVyCisKKyAgICB7MHgwMDYyLDB4MDB9LCAgIC8vIENSVC9UViBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMAorICAgIHsweDAwNjMsMHgwMH0sICAgLy8gQ1JUL1RWIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAxCisgICAgezB4MDA2NCwweDAwfSwgICAvLyBDUlQvVFYgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDIKKworICAgIHsweDAwNjgsMHgwMH0sICAgLy8gQ1JUL1RWIFBpeGVsIFBhbm5pbmcgUmVnaXN0ZXIKKyAgICB7MHgwMDZBLDB4MDB9LCAgIC8vIENSVC9UViBEaXNwbGF5IEZJRk8gSGlnaCBUaHJlc2hvbGQgQ29udHJvbCBSZWdpc3RlcgorICAgIHsweDAwNkIsMHgwMH0sICAgLy8gQ1JUL1RWIERpc3BsYXkgRklGTyBMb3cgVGhyZXNob2xkIENvbnRyb2wgUmVnaXN0ZXIKKyAgICB7MHgwMDcwLDB4MDB9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIENvbnRyb2wgUmVnaXN0ZXIKKyAgICB7MHgwMDcxLDB4MDF9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIKKyAgICB7MHgwMDcyLDB4MDB9LCAgIC8vIExDRCBDdXJzb3IgWCBQb3NpdGlvbiBSZWdpc3RlciAwCisgICAgezB4MDA3MywweDAwfSwgICAvLyBMQ0QgQ3Vyc29yIFggUG9zaXRpb24gUmVnaXN0ZXIgMQorICAgIHsweDAwNzQsMHgwMH0sICAgLy8gTENEIEN1cnNvciBZIFBvc2l0aW9uIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDc1LDB4MDB9LCAgIC8vIExDRCBDdXJzb3IgWSBQb3NpdGlvbiBSZWdpc3RlciAxCisgICAgezB4MDA3NiwweDAwfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBCbHVlIENvbG9yIDAgUmVnaXN0ZXIKKyAgICB7MHgwMDc3LDB4MDB9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIEdyZWVuIENvbG9yIDAgUmVnaXN0ZXIKKyAgICB7MHgwMDc4LDB4MDB9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIFJlZCBDb2xvciAwIFJlZ2lzdGVyCisgICAgezB4MDA3QSwweDFGfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBCbHVlIENvbG9yIDEgUmVnaXN0ZXIKKyAgICB7MHgwMDdCLDB4M0Z9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIEdyZWVuIENvbG9yIDEgUmVnaXN0ZXIKKyAgICB7MHgwMDdDLDB4MUZ9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIFJlZCBDb2xvciAxIFJlZ2lzdGVyCisgICAgezB4MDA3RSwweDAwfSwgICAvLyBMQ0QgSW5rL0N1cnNvciBGSUZPIFRocmVzaG9sZCBSZWdpc3RlcgorICAgIHsweDAwODAsMHgwMH0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgQ29udHJvbCBSZWdpc3RlcgorICAgIHsweDAwODEsMHgwMX0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgorICAgIHsweDAwODIsMHgwMH0sICAgLy8gQ1JUL1RWIEN1cnNvciBYIFBvc2l0aW9uIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDgzLDB4MDB9LCAgIC8vIENSVC9UViBDdXJzb3IgWCBQb3NpdGlvbiBSZWdpc3RlciAxCisgICAgezB4MDA4NCwweDAwfSwgICAvLyBDUlQvVFYgQ3Vyc29yIFkgUG9zaXRpb24gUmVnaXN0ZXIgMAorICAgIHsweDAwODUsMHgwMH0sICAgLy8gQ1JUL1RWIEN1cnNvciBZIFBvc2l0aW9uIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDg2LDB4MDB9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIEJsdWUgQ29sb3IgMCBSZWdpc3RlcgorICAgIHsweDAwODcsMHgwMH0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgR3JlZW4gQ29sb3IgMCBSZWdpc3RlcgorICAgIHsweDAwODgsMHgwMH0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgUmVkIENvbG9yIDAgUmVnaXN0ZXIKKyAgICB7MHgwMDhBLDB4MUZ9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIEJsdWUgQ29sb3IgMSBSZWdpc3RlcgorICAgIHsweDAwOEIsMHgzRn0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgR3JlZW4gQ29sb3IgMSBSZWdpc3RlcgorICAgIHsweDAwOEMsMHgxRn0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgUmVkIENvbG9yIDEgUmVnaXN0ZXIKKyAgICB7MHgwMDhFLDB4MDB9LCAgIC8vIENSVC9UViBJbmsvQ3Vyc29yIEZJRk8gVGhyZXNob2xkIFJlZ2lzdGVyCisgICAgezB4MDEwMCwweDAwfSwgICAvLyBCaXRCbHQgQ29udHJvbCBSZWdpc3RlciAwCisgICAgezB4MDEwMSwweDAwfSwgICAvLyBCaXRCbHQgQ29udHJvbCBSZWdpc3RlciAxCisgICAgezB4MDEwMiwweDAwfSwgICAvLyBCaXRCbHQgUk9QIENvZGUvQ29sb3IgRXhwYW5zaW9uIFJlZ2lzdGVyCisgICAgezB4MDEwMywweDAwfSwgICAvLyBCaXRCbHQgT3BlcmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDEwNCwweDAwfSwgICAvLyBCaXRCbHQgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMAorICAgIHsweDAxMDUsMHgwMH0sICAgLy8gQml0Qmx0IFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKyAgICB7MHgwMTA2LDB4MDB9LCAgIC8vIEJpdEJsdCBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAyCisgICAgezB4MDEwOCwweDAwfSwgICAvLyBCaXRCbHQgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAwCisgICAgezB4MDEwOSwweDAwfSwgICAvLyBCaXRCbHQgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAxCisgICAgezB4MDEwQSwweDAwfSwgICAvLyBCaXRCbHQgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAyCisgICAgezB4MDEwQywweDAwfSwgICAvLyBCaXRCbHQgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDAKKyAgICB7MHgwMTBELDB4MDB9LCAgIC8vIEJpdEJsdCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMQorICAgIHsweDAxMTAsMHgwMH0sICAgLy8gQml0Qmx0IFdpZHRoIFJlZ2lzdGVyIDAKKyAgICB7MHgwMTExLDB4MDB9LCAgIC8vIEJpdEJsdCBXaWR0aCBSZWdpc3RlciAxCisgICAgezB4MDExMiwweDAwfSwgICAvLyBCaXRCbHQgSGVpZ2h0IFJlZ2lzdGVyIDAKKyAgICB7MHgwMTEzLDB4MDB9LCAgIC8vIEJpdEJsdCBIZWlnaHQgUmVnaXN0ZXIgMQorICAgIHsweDAxMTQsMHgwMH0sICAgLy8gQml0Qmx0IEJhY2tncm91bmQgQ29sb3IgUmVnaXN0ZXIgMAorICAgIHsweDAxMTUsMHgwMH0sICAgLy8gQml0Qmx0IEJhY2tncm91bmQgQ29sb3IgUmVnaXN0ZXIgMQorICAgIHsweDAxMTgsMHgwMH0sICAgLy8gQml0Qmx0IEZvcmVncm91bmQgQ29sb3IgUmVnaXN0ZXIgMAorICAgIHsweDAxMTksMHgwMH0sICAgLy8gQml0Qmx0IEZvcmVncm91bmQgQ29sb3IgUmVnaXN0ZXIgMQorICAgIHsweDAxRTAsMHgwMH0sICAgLy8gTG9vay1VcCBUYWJsZSBNb2RlIFJlZ2lzdGVyCisgICAgezB4MDFFMiwweDAwfSwgICAvLyBMb29rLVVwIFRhYmxlIEFkZHJlc3MgUmVnaXN0ZXIKKyAgICB7MHgwMUYwLDB4MTB9LCAgIC8vIFBvd2VyIFNhdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAxRjEsMHgwMH0sICAgLy8gUG93ZXIgU2F2ZSBTdGF0dXMgUmVnaXN0ZXIKKyAgICB7MHgwMUY0LDB4MDB9LCAgIC8vIENQVS10by1NZW1vcnkgQWNjZXNzIFdhdGNoZG9nIFRpbWVyIFJlZ2lzdGVyCisjaWYgKFNXSVZFTF9WSUVXID09IDApCisgICAgezB4MDFGQywweDAxfSwgICAvLyBEaXNwbGF5IE1vZGUgUmVnaXN0ZXIoMHgwMTpMQ0QsIDB4MDI6Q1JULCAweDAzOkxDRCZDUlQpCisjZWxpZiAoU1dJVkVMX1ZJRVcgPT0gMSkKKyAgICB7MHgwMUZDLDB4NDF9LCAgIC8vIERpc3BsYXkgTW9kZSBSZWdpc3RlcigweDAxOkxDRCwgMHgwMjpDUlQsIDB4MDM6TENEJkNSVCkKKyNlbHNlCisjZXJyb3IgdW5zdXBwb3J0ZWQgU1dJVkVMX1ZJRVcgbW9kZQorI2VuZGlmICAvKiBTV0lWRUxfVklFVyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfUExBVF9NMzI3MDBVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9PUFNQVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkzKQorICAgIHsweDAwMDgsMHgwN30sICAgLy8gTENEIHBhbmVsIFZkZCAmIFZnIG9uCisjZW5kaWYKKworICAgIHsweDAwNDAsMHgwNX0sICAgLy8gTENEIERpc3BsYXkgTW9kZSBSZWdpc3RlciAoMjo0YnBwLDM6OGJwcCw1OjE2YnBwKQorI2lmIGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkpCisgICAgezB4MDA0NiwweDgwfSwgICAvLyBMQ0QgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDAKKyAgICB7MHgwMDQ3LDB4MDJ9LCAgIC8vIExDRCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMQorI2VsaWYgZGVmaW5lZChDT05GSUdfUExBVF9NMzI3MDBVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9PUFNQVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkzKQorICAgIHsweDAwNDYsMHhmMH0sICAgLy8gTENEIE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAwCisgICAgezB4MDA0NywweDAwfSwgICAvLyBMQ0QgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDEKKyNlbmRpZgorICAgIHsweDAwNjAsMHgwNX0sICAgLy8gQ1JUL1RWIERpc3BsYXkgTW9kZSBSZWdpc3RlciAoMjo0YnBwLDM6OGJwcCw1OjE2YnBwKQorICAgIHsweDAwNjYsMHg4MH0sICAgLy8gQ1JUL1RWIE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAwCS8vIHRha2VvCisgICAgezB4MDA2NywweDAyfSwgICAvLyBDUlQvVFYgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDEKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3BjaS5oIGIvaW5jbHVkZS9hc20tbTY4ay9wY2kuaAppbmRleCA5ZTdkNzlhLi45ZDJjMDdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvcGNpLmgKQEAgLTQzLDcgKzQzLDcgQEAKIAkvKiBObyBzcGVjaWFsIGJ1cyBtYXN0ZXJpbmcgc2V0dXAgaGFuZGxpbmcgKi8KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQorc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BjaS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wY2kuaAppbmRleCAyZDMyM2I2Li5kNzBkYzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGNpLmgKQEAgLTY5LDcgKzY5LDcgQEAKIAogZXh0ZXJuIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9rZXhlYy5oIGIvaW5jbHVkZS9hc20tcHBjL2tleGVjLmgKaW5kZXggNzMxOTEzMS4uNmQyYWEwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2tleGVjLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2tleGVjLmgKQEAgLTI3LDYgKzI3LDggQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorZXh0ZXJuIHZvaWQgKmNyYXNoX25vdGVzOworCiBzdHJ1Y3Qga2ltYWdlOwogCiBleHRlcm4gdm9pZCBtYWNoaW5lX2tleGVjX3NpbXBsZShzdHJ1Y3Qga2ltYWdlICppbWFnZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbWFjaW8uaCBiL2luY2x1ZGUvYXNtLXBwYy9tYWNpby5oCmluZGV4IDJjYWZjOTkuLmE0ODFiNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tYWNpby5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tYWNpby5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfX01BQ0lPX0FTSUNfSF9fCiAjZGVmaW5lIF9fTUFDSU9fQVNJQ19IX18KIAorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KIAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBtYWNpb19idXNfdHlwZTsKQEAgLTEyMCwxMCArMTIxLDEwIEBACiBzdHJ1Y3QgbWFjaW9fZHJpdmVyCiB7CiAJY2hhcgkJCSpuYW1lOwotCXN0cnVjdCBvZl9tYXRjaAkJKm1hdGNoX3RhYmxlOworCXN0cnVjdCBvZl9kZXZpY2VfaWQJKm1hdGNoX3RhYmxlOwogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKIAotCWludAkoKnByb2JlKShzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpOworCWludAkoKnByb2JlKShzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKTsKIAlpbnQJKCpyZW1vdmUpKHN0cnVjdCBtYWNpb19kZXYqIGRldik7CiAKIAlpbnQJKCpzdXNwZW5kKShzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLXBwYy9tbXVfY29udGV4dC5oCmluZGV4IGNjYWJiY2UuLmFmZTI2ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tbXVfY29udGV4dC5oCkBAIC0xNDksNiArMTQ5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAlpZiAobW0tPmNvbnRleHQgIT0gTk9fQ09OVEVYVCkgewogCQljbGVhcl9iaXQobW0tPmNvbnRleHQsIGNvbnRleHRfbWFwKTsKIAkJbW0tPmNvbnRleHQgPSBOT19DT05URVhUOwpAQCAtMTU2LDYgKzE1Nyw3IEBACiAJCWF0b21pY19pbmMoJm5yX2ZyZWVfY29udGV4dHMpOwogI2VuZGlmCiAJfQorCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tcGM4eHguaCBiL2luY2x1ZGUvYXNtLXBwYy9tcGM4eHguaAppbmRleCA3MTRkNjljLi43YzMxZjJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbXBjOHh4LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL21wYzh4eC5oCkBAIC02OCw2ICs2OCwxMCBAQAogI2luY2x1ZGUgPHBsYXRmb3Jtcy9sYW50ZWMuaD4KICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODg1QURTKQorI2luY2x1ZGUgPHBsYXRmb3Jtcy9tcGM4ODVhZHMuaD4KKyNlbmRpZgorCiAvKiBDdXJyZW50bHksIGFsbCA4eHggYm9hcmRzIHRoYXQgc3VwcG9ydCBhIHByb2Nlc3NvciB0byBQQ0kvSVNBIGJyaWRnZQogICogdXNlIHRoZSBzYW1lIG1lbW9yeSBtYXAuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9vZl9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXBwYy9vZl9kZXZpY2UuaAppbmRleCA3MjI5NzM1Li40YjI2NGNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvb2ZfZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL29mX2RldmljZS5oCkBAIC0yNCwyMCArMjQsOCBAQAogfTsKICNkZWZpbmUJdG9fb2ZfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgb2ZfZGV2aWNlLCBkZXYpCiAKLS8qCi0gKiBTdHJ1Y3QgdXNlZCBmb3IgbWF0Y2hpbmcgYSBkZXZpY2UKLSAqLwotc3RydWN0IG9mX21hdGNoCi17Ci0JY2hhcgkqbmFtZTsKLQljaGFyCSp0eXBlOwotCWNoYXIJKmNvbXBhdGlibGU7Ci0Jdm9pZAkqZGF0YTsKLX07Ci0jZGVmaW5lIE9GX0FOWV9NQVRDSAkJKChjaGFyICopLTFMKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IG9mX21hdGNoICpvZl9tYXRjaF9kZXZpY2UoCi0JY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaGVzLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX21hdGNoX2RldmljZSgKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpOwogCiBleHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2X2dldChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgb2ZfZGV2X3B1dChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpOwpAQCAtNDksMTAgKzM3LDEwIEBACiBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyCiB7CiAJY2hhcgkJCSpuYW1lOwotCXN0cnVjdCBvZl9tYXRjaAkJKm1hdGNoX3RhYmxlOworCXN0cnVjdCBvZl9kZXZpY2VfaWQJKm1hdGNoX3RhYmxlOwogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKIAotCWludAkoKnByb2JlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpOworCWludAkoKnByb2JlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKTsKIAlpbnQJKCpyZW1vdmUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7CiAKIAlpbnQJKCpzdXNwZW5kKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcGNpLmggYi9pbmNsdWRlL2FzbS1wcGMvcGNpLmgKaW5kZXggZGIwYTJhMC4uYTEzZDU1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wY2kuaApAQCAtMzcsNyArMzcsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitleHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXBwYy91bmlzdGQuaAppbmRleCBlOGI3OTIyLi5hNzg5NGUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL3VuaXN0ZC5oCkBAIC0yNjIsNyArMjYyLDcgQEAKICNkZWZpbmUgX19OUl9ydGFzCQkyNTUKICNkZWZpbmUgX19OUl9zeXNfZGVidWdfc2V0Y29udGV4dCAyNTYKIC8qIE51bWJlciAyNTcgaXMgcmVzZXJ2ZWQgZm9yIHZzZXJ2ZXIgKi8KLS8qIE51bWJlciAyNTggaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfcmVtYXBfZmlsZV9wYWdlcyAqLworLyogMjU4IGN1cnJlbnRseSB1bnVzZWQgKi8KIC8qIE51bWJlciAyNTkgaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfbWJpbmQgKi8KIC8qIE51bWJlciAyNjAgaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfZ2V0X21lbXBvbGljeSAqLwogLyogTnVtYmVyIDI2MSBpcyByZXNlcnZlZCBmb3IgbmV3IHN5c19zZXRfbWVtcG9saWN5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9jcHV0YWJsZS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvY3B1dGFibGUuaAppbmRleCBjYmJmYmVjLi5kNjdmYTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9jcHV0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2NwdXRhYmxlLmgKQEAgLTEzOCw2ICsxMzgsNyBAQAogI2RlZmluZSBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSAgCUFTTV9DT05TVCgweDAwMDAwMjAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfTE9DS0xFU1NfVExCSUUJCUFTTV9DT05TVCgweDAwMDAwNDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfTU1DUkFfU0lIVgkJQVNNX0NPTlNUKDB4MDAwMDA4MDAwMDAwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9DVFJMCQkJQVNNX0NPTlNUKDB4MDAwMDEwMDAwMDAwMDAwMCkKIAogLyogUGxhdGZvcm0gZmlybXdhcmUgZmVhdHVyZXMgKi8KICNkZWZpbmUgRldfRlRSXwkJCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQpAQCAtMTQ4LDcgKzE0OSw3IEBACiAKICNkZWZpbmUgQ1BVX0ZUUl9QUENBU19BUkNIX1YyX0JBU0UgKENQVV9GVFJfU0xCIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVX0ZUUl9UTEJJRUwgfCBDUFVfRlRSX05PRVhFQ1VURSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVV9GVFJfTk9EU0lTUkFMSUdOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04gfCBDUFVfRlRSX0NUUkwpCiAKIC8qIGlTZXJpZXMgZG9lc24ndCBzdXBwb3J0IGxhcmdlIHBhZ2VzICovCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9odmNvbnNvbGUuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2h2Y29uc29sZS5oCmluZGV4IGQ4OWQ5NGMuLjZkYTkzY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2h2Y29uc29sZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2h2Y29uc29sZS5oCkBAIC0yOSwxMiArMjksMjEgQEAKICAqLwogI2RlZmluZSBNQVhfTlJfSFZDX0NPTlNPTEVTCTE2CiAKKy8qIGltcGxlbWVudGVkIGJ5IGEgbG93IGxldmVsIGRyaXZlciAqLworc3RydWN0IGh2X29wcyB7CisJaW50ICgqZ2V0X2NoYXJzKSh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCk7CisJaW50ICgqcHV0X2NoYXJzKSh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCk7Cit9OwogZXh0ZXJuIGludCBodmNfZ2V0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIGV4dGVybiBpbnQgaHZjX3B1dF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCk7CiAKLS8qIEVhcmx5IGRpc2NvdmVyeSBvZiBjb25zb2xlIGFkYXB0ZXJzLiAqLwotZXh0ZXJuIGludCBodmNfZmluZF92dHlzKHZvaWQpOworc3RydWN0IGh2Y19zdHJ1Y3Q7CiAKLS8qIEltcGxlbWVudGVkIGJ5IGEgY29uc29sZSBkcml2ZXIgKi8KLWV4dGVybiBpbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCk7CisvKiBSZWdpc3RlciBhIHZ0ZXJtIGFuZCBhIHNsb3QgaW5kZXggZm9yIHVzZSBhcyBhIGNvbnNvbGUgKGNvbnNvbGVfaW5pdCkgKi8KK2V4dGVybiBpbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCwgc3RydWN0IGh2X29wcyAqb3BzKTsKKy8qIHJlZ2lzdGVyIGEgdnRlcm0gZm9yIGh2YyB0dHkgb3BlcmF0aW9uIChtb2R1bGVfaW5pdCBvciBob3RwbHVnIGFkZCkgKi8KK2V4dGVybiBzdHJ1Y3QgaHZjX3N0cnVjdCAqIF9fZGV2aW5pdCBodmNfYWxsb2ModWludDMyX3QgdnRlcm1ubywgaW50IGlycSwKKwkJCQkJCSBzdHJ1Y3QgaHZfb3BzICpvcHMpOworLyogcmVtb3ZlIGEgdnRlcm0gZnJvbSBodmMgdHR5IG9wZXJhdGlvbiAobW9kZWxlX2V4aXQgb3IgaG90cGx1ZyByZW1vdmUpICovCitleHRlcm4gaW50IF9fZGV2ZXhpdCBodmNfcmVtb3ZlKHN0cnVjdCBodmNfc3RydWN0ICpocCk7CiAjZW5kaWYgLyogX1BQQzY0X0hWQ09OU09MRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL0h2Q2FsbEhwdC5oIGIvaW5jbHVkZS9hc20tcHBjNjQvaVNlcmllcy9IdkNhbGxIcHQuaAppbmRleCA2NmYzODIyLi40M2ExOTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL0h2Q2FsbEhwdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2lTZXJpZXMvSHZDYWxsSHB0LmgKQEAgLTc3LDI3ICs3NywyNiBAQAogCXJldHVybiBjb21wcmVzc2VkU3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZFZhbGlkKEhQVEUgKmhwdGUsIHU2NCB2cG4pCitzdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTY0IHZwbikKIHsKIAlyZXR1cm4gSHZDYWxsM1JldDE2KEh2Q2FsbEhwdEZpbmRWYWxpZCwgaHB0ZSwgdnBuLCAwLCAwKTsKIH0KIAotc3RhdGljIGlubGluZSB1NjQgSHZDYWxsSHB0X2ZpbmROZXh0VmFsaWQoSFBURSAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKK3N0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kTmV4dFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKIAkJdTggYml0c29uLCB1OCBiaXRzb2ZmKQogewogCXJldHVybiBIdkNhbGwzUmV0MTYoSHZDYWxsSHB0RmluZE5leHRWYWxpZCwgaHB0ZSwgaHB0ZUluZGV4LAogCQkJYml0c29uLCBiaXRzb2ZmKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9nZXQoSFBURSAqaHB0ZSwgdTMyIGhwdGVJbmRleCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfZ2V0KGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCkKIHsKIAlIdkNhbGwyUmV0MTYoSHZDYWxsSHB0R2V0LCBocHRlLCBocHRlSW5kZXgsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgSHZDYWxsSHB0X2FkZFZhbGlkYXRlKHUzMiBocHRlSW5kZXgsIHUzMiBoQml0LCBIUFRFICpocHRlKQorc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9hZGRWYWxpZGF0ZSh1MzIgaHB0ZUluZGV4LCB1MzIgaEJpdCwgaHB0ZV90ICpocHRlKQogewotCUh2Q2FsbDQoSHZDYWxsSHB0QWRkVmFsaWRhdGUsIGhwdGVJbmRleCwgaEJpdCwgKCooKHU2NCAqKWhwdGUpKSwKLQkJCSgqKCgodTY0ICopaHB0ZSkrMSkpKTsKKwlIdkNhbGw0KEh2Q2FsbEhwdEFkZFZhbGlkYXRlLCBocHRlSW5kZXgsIGhCaXQsIGhwdGUtPnYsIGhwdGUtPnIpOwogfQogCiAjZW5kaWYgLyogX0hWQ0FMTEhQVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9tYWNoZGVwLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9tYWNoZGVwLmgKaW5kZXggOWNkYWQzZS4uZjBjMWQyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L21hY2hkZXAuaApAQCAtNTMsMTAgKzUzLDggQEAKIAlsb25nCQkoKmhwdGVfaW5zZXJ0KSh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmEsCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcHJwbiwKLQkJCQkgICAgICAgaW50IHNlY29uZGFyeSwgCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaHB0ZWZsYWdzLCAKLQkJCQkgICAgICAgaW50IGJvbHRlZCwKLQkJCQkgICAgICAgaW50IGxhcmdlKTsKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2ZmxhZ3MsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcmZsYWdzKTsKIAlsb25nCQkoKmhwdGVfcmVtb3ZlKSh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXApOwogCXZvaWQJCSgqZmx1c2hfaGFzaF9yYW5nZSkodW5zaWduZWQgbG9uZyBjb250ZXh0LAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBudW1iZXIsCkBAIC0xNDAsOCArMTM4LDEzIEBACiAJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCQlwZ3Byb3RfdCB2bWFfcHJvdCk7CiAKKwkvKiBJZGxlIGxvb3AgZm9yIHRoaXMgcGxhdGZvcm0sIGxlYXZlIGVtcHR5IGZvciBkZWZhdWx0IGlkbGUgbG9vcCAqLworCWludAkJKCppZGxlX2xvb3ApKHZvaWQpOwogfTsKIAorZXh0ZXJuIGludCBkZWZhdWx0X2lkbGUodm9pZCk7CitleHRlcm4gaW50IG5hdGl2ZV9pZGxlKHZvaWQpOworCiBleHRlcm4gc3RydWN0IG1hY2hkZXBfY2FsbHMgcHBjX21kOwogZXh0ZXJuIGNoYXIgY21kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9tbXUuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L21tdS5oCmluZGV4IGYzNzNkZTUuLjNkMDdkZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L21tdS5oCkBAIC02MCw2ICs2MCwyMiBAQAogCiAjZGVmaW5lIEhQVEVTX1BFUl9HUk9VUCA4CiAKKyNkZWZpbmUgSFBURV9WX0FWUE5fU0hJRlQJNworI2RlZmluZSBIUFRFX1ZfQVZQTgkJQVNNX0NPTlNUKDB4ZmZmZmZmZmZmZmZmZmY4MCkKKyNkZWZpbmUgSFBURV9WX0FWUE5fVkFMKHgpCSgoKHgpICYgSFBURV9WX0FWUE4pID4+IEhQVEVfVl9BVlBOX1NISUZUKQorI2RlZmluZSBIUFRFX1ZfQk9MVEVECQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDEwKQorI2RlZmluZSBIUFRFX1ZfTE9DSwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwOCkKKyNkZWZpbmUgSFBURV9WX0xBUkdFCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA0KQorI2RlZmluZSBIUFRFX1ZfU0VDT05EQVJZCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDIpCisjZGVmaW5lIEhQVEVfVl9WQUxJRAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKKworI2RlZmluZSBIUFRFX1JfUFAwCQlBU01fQ09OU1QoMHg4MDAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBIUFRFX1JfVFMJCUFTTV9DT05TVCgweDQwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIEhQVEVfUl9SUE5fU0hJRlQJMTIKKyNkZWZpbmUgSFBURV9SX1JQTgkJQVNNX0NPTlNUKDB4M2ZmZmZmZmZmZmZmZjAwMCkKKyNkZWZpbmUgSFBURV9SX0ZMQUdTCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwM2ZmKQorI2RlZmluZSBIUFRFX1JfUFAJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDMpCisKIC8qIFZhbHVlcyBmb3IgUFAgKGFzc3VtZXMgS3M9MCwgS3A9MSkgKi8KIC8qIHBwMCB3aWxsIGFsd2F5cyBiZSAwIGZvciBsaW51eCAgICAgKi8KICNkZWZpbmUgUFBfUldYWAkwCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciBub25lICovCkBAIC02OSw1NCArODUsMTMgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotLyogSGFyZHdhcmUgUGFnZSBUYWJsZSBFbnRyeSAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgYXZwbjo1NzsgLyogdnNpZCB8IGFwaSA9PSBhdnBuICAqLwotCXVuc2lnbmVkIGxvbmcgOiAgICAgMjsgLyogU29mdHdhcmUgdXNlICovCi0JdW5zaWduZWQgbG9uZyBib2x0ZWQ6IDE7IC8qIEhQVEUgaXMgImJvbHRlZCIgKi8KLQl1bnNpZ25lZCBsb25nIGxvY2s6IDE7IC8qIGxvY2sgb24gcFNlcmllcyBTTVAgKi8KLQl1bnNpZ25lZCBsb25nIGw6ICAgIDE7IC8qIFZpcnR1YWwgcGFnZSBpcyBsYXJnZSAoTD0xKSBvciA0IEtCIChMPTApICovCi0JdW5zaWduZWQgbG9uZyBoOiAgICAxOyAvKiBIYXNoIGZ1bmN0aW9uIGlkZW50aWZpZXIgKi8KLQl1bnNpZ25lZCBsb25nIHY6ICAgIDE7IC8qIFZhbGlkICh2PTEpIG9yIGludmFsaWQgKHY9MCkgKi8KLX0gSHB0ZV9kd29yZDA7CisJdW5zaWduZWQgbG9uZyB2OworCXVuc2lnbmVkIGxvbmcgcjsKK30gaHB0ZV90OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBwcDA6ICAxOyAvKiBQYWdlIHByb3RlY3Rpb24gYml0IDAgKi8KLQl1bnNpZ25lZCBsb25nIHRzOiAgIDE7IC8qIFRhZyBzZXQgYml0ICovCi0JdW5zaWduZWQgbG9uZyBycG46IDUwOyAvKiBSZWFsIHBhZ2UgbnVtYmVyICovCi0JdW5zaWduZWQgbG9uZyA6ICAgICAyOyAvKiBSZXNlcnZlZCAqLwotCXVuc2lnbmVkIGxvbmcgYWM6ICAgMTsgLyogQWRkcmVzcyBjb21wYXJlICovIAotCXVuc2lnbmVkIGxvbmcgcjogICAgMTsgLyogUmVmZXJlbmNlZCAqLwotCXVuc2lnbmVkIGxvbmcgYzogICAgMTsgLyogQ2hhbmdlZCAqLwotCXVuc2lnbmVkIGxvbmcgdzogICAgMTsgLyogV3JpdGUtdGhydSBjYWNoZSBtb2RlICovCi0JdW5zaWduZWQgbG9uZyBpOiAgICAxOyAvKiBDYWNoZSBpbmhpYml0ZWQgKi8KLQl1bnNpZ25lZCBsb25nIG06ICAgIDE7IC8qIE1lbW9yeSBjb2hlcmVuY2UgcmVxdWlyZWQgKi8KLQl1bnNpZ25lZCBsb25nIGc6ICAgIDE7IC8qIEd1YXJkZWQgKi8KLQl1bnNpZ25lZCBsb25nIG46ICAgIDE7IC8qIE5vLWV4ZWN1dGUgKi8KLQl1bnNpZ25lZCBsb25nIHBwOiAgIDI7IC8qIFBhZ2UgcHJvdGVjdGlvbiBiaXRzIDE6MiAqLwotfSBIcHRlX2R3b3JkMTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgcGFkZGluZ1s2XTsJICAgCS8qIHBhZGRpbmcgKi8KLQl1bnNpZ25lZCBsb25nIDogICAgICAgNjsJLyogcGFkZGluZyAqLyAKLQl1bnNpZ25lZCBsb25nIGZsYWdzOiAxMDsJLyogSFBURSBmbGFncyAqLwotfSBIcHRlX2R3b3JkMV9mbGFnczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuaW9uIHsKLQkJdW5zaWduZWQgbG9uZyBkd29yZDA7Ci0JCUhwdGVfZHdvcmQwICAgZHcwOwotCX0gZHcwOwotCi0JdW5pb24gewotCQl1bnNpZ25lZCBsb25nIGR3b3JkMTsKLQkJSHB0ZV9kd29yZDEgZHcxOwotCQlIcHRlX2R3b3JkMV9mbGFncyBmbGFnczsKLQl9IGR3MTsKLX0gSFBURTsgCi0KLWV4dGVybiBIUFRFICoJCWh0YWJfYWRkcmVzczsKLWV4dGVybiB1bnNpZ25lZCBsb25nCWh0YWJfaGFzaF9tYXNrOworZXh0ZXJuIGhwdGVfdCAqaHRhYl9hZGRyZXNzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHRhYl9oYXNoX21hc2s7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBocHRfaGFzaCh1bnNpZ25lZCBsb25nIHZwbiwgaW50IGxhcmdlKQogewpAQCAtMTgxLDE4ICsxNTYsMTggQEAKIAlhc20gdm9sYXRpbGUoInB0ZXN5bmMiOiA6IDoibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzbG90MnZhKHVuc2lnbmVkIGxvbmcgYXZwbiwgdW5zaWduZWQgbG9uZyBsYXJnZSwKLQkJdW5zaWduZWQgbG9uZyBzZWNvbmRhcnksIHVuc2lnbmVkIGxvbmcgc2xvdCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzbG90MnZhKHVuc2lnbmVkIGxvbmcgaHB0ZV92LCB1bnNpZ25lZCBsb25nIHNsb3QpCiB7CisJdW5zaWduZWQgbG9uZyBhdnBuID0gSFBURV9WX0FWUE5fVkFMKGhwdGVfdik7CiAJdW5zaWduZWQgbG9uZyB2YTsKIAogCXZhID0gYXZwbiA8PCAyMzsKIAotCWlmICghbGFyZ2UpIHsKKwlpZiAoISAoaHB0ZV92ICYgSFBURV9WX0xBUkdFKSkgewogCQl1bnNpZ25lZCBsb25nIHZwaSwgcHRlZzsKIAogCQlwdGVnID0gc2xvdCAvIEhQVEVTX1BFUl9HUk9VUDsKLQkJaWYgKHNlY29uZGFyeSkKKwkJaWYgKGhwdGVfdiAmIEhQVEVfVl9TRUNPTkRBUlkpCiAJCQlwdGVnID0gfnB0ZWc7CiAKIAkJdnBpID0gKCh2YSA+PiAyOCkgXiBwdGVnKSAmIGh0YWJfaGFzaF9tYXNrOwpAQCAtMjE5LDExICsxOTQsMTEgQEAKIAogZXh0ZXJuIGxvbmcgcFNlcmllc19scGFyX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmEsIHVuc2lnbmVkIGxvbmcgcHJwbiwKLQkJCQkgICAgIGludCBzZWNvbmRhcnksIHVuc2lnbmVkIGxvbmcgaHB0ZWZsYWdzLAotCQkJCSAgICAgaW50IGJvbHRlZCwgaW50IGxhcmdlKTsKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmZsYWdzLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyByZmxhZ3MpOwogZXh0ZXJuIGxvbmcgbmF0aXZlX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwgdW5zaWduZWQgbG9uZyB2YSwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBycG4sIGludCBzZWNvbmRhcnksCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBocHRlZmxhZ3MsIGludCBib2x0ZWQsIGludCBsYXJnZSk7CisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwcnBuLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCB1bnNpZ25lZCBsb25nIHJmbGFncyk7CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaAppbmRleCBkMTJkZmNlLi5mYWE3NzIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaApAQCAtMzcsNyArMzcsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcHBjNjQvcHJvY2Vzc29yLmgKaW5kZXggYWYyOGFhNS4uMzUyMzA2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvcHJvY2Vzc29yLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbWNmZy5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogCiAvKiBNYWNoaW5lIFN0YXRlIFJlZ2lzdGVyIChNU1IpIEZpZWxkcyAqLwogI2RlZmluZSBNU1JfU0ZfTEcJNjMgICAgICAgICAgICAgIC8qIEVuYWJsZSA2NCBiaXQgbW9kZSAqLwpAQCAtNTAxLDI0ICs1MDIsMzcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGN0cmw7CiAKLQljdHJsID0gbWZzcHIoU1BSTl9DVFJMRik7Ci0JY3RybCB8PSBDVFJMX1JVTkxBVENIOwotCW10c3ByKFNQUk5fQ1RSTFQsIGN0cmwpOworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9DVFJMKSkgeworCQljdHJsID0gbWZzcHIoU1BSTl9DVFJMRik7CisJCWN0cmwgfD0gQ1RSTF9SVU5MQVRDSDsKKwkJbXRzcHIoU1BSTl9DVFJMVCwgY3RybCk7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHBjNjRfcnVubGF0Y2hfb2ZmKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBjdHJsOwogCi0JY3RybCA9IG1mc3ByKFNQUk5fQ1RSTEYpOwotCWN0cmwgJj0gfkNUUkxfUlVOTEFUQ0g7Ci0JbXRzcHIoU1BSTl9DVFJMVCwgY3RybCk7CisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0NUUkwpKSB7CisJCWN0cmwgPSBtZnNwcihTUFJOX0NUUkxGKTsKKwkJY3RybCAmPSB+Q1RSTF9SVU5MQVRDSDsKKwkJbXRzcHIoU1BSTl9DVFJMVCwgY3RybCk7CisJfQogfQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIFJVTkxBVENIX09OKFJFRykJCQlcCitCRUdJTl9GVFJfU0VDVElPTgkJCQlcCisJbWZzcHIJKFJFRyksU1BSTl9DVFJMRjsJCVwKKwlvcmkJKFJFRyksKFJFRyksQ1RSTF9SVU5MQVRDSDsJXAorCW10c3ByCVNQUk5fQ1RSTFQsKFJFRyk7CQlcCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DVFJMKQorI2VuZGlmCisKIC8qCiAgKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgU0xCLiBJZiB0aGlzIGV2ZXIgY2hhbmdlcyB3ZSBzaG91bGQgaGFuZGxlCiAgKiBpdCB3aXRoIGEgdXNlIGEgY3B1IGZlYXR1cmUgZml4dXAuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3VuaXN0ZC5oCmluZGV4IDYwNWQ5MWUuLjRhOTRhY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3VuaXN0ZC5oCkBAIC0yNjgsNyArMjY4LDcgQEAKICNkZWZpbmUgX19OUl9ydGFzCQkyNTUKIC8qIE51bWJlciAyNTYgaXMgcmVzZXJ2ZWQgZm9yIHN5c19kZWJ1Z19zZXRjb250ZXh0ICovCiAvKiBOdW1iZXIgMjU3IGlzIHJlc2VydmVkIGZvciB2c2VydmVyICovCi0vKiBOdW1iZXIgMjU4IGlzIHJlc2VydmVkIGZvciBuZXcgc3lzX3JlbWFwX2ZpbGVfcGFnZXMgKi8KKy8qIDI1OCBjdXJyZW50bHkgdW51c2VkICovCiAjZGVmaW5lIF9fTlJfbWJpbmQJCTI1OQogI2RlZmluZSBfX05SX2dldF9tZW1wb2xpY3kJMjYwCiAjZGVmaW5lIF9fTlJfc2V0X21lbXBvbGljeQkyNjEKQEAgLTI4Myw4ICsyODMsMTAgQEAKICNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkyNzAKICNkZWZpbmUgX19OUl9rZXljdGwJCTI3MQogI2RlZmluZSBfX05SX3dhaXRpZAkJMjcyCisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjczCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjc0CiAKLSNkZWZpbmUgX19OUl9zeXNjYWxscwkJMjczCisjZGVmaW5lIF9fTlJfc3lzY2FsbHMJCTI3NQogI2lmZGVmIF9fS0VSTkVMX18KICNkZWZpbmUgTlJfc3lzY2FsbHMJX19OUl9zeXNjYWxscwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wY2kuaCBiL2luY2x1ZGUvYXNtLXNoL3BjaS5oCmluZGV4IDI2MDQ0ODguLjBhNTIzYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BjaS5oCkBAIC0zNiw3ICszNiw3IEBACiAKIGV4dGVybiB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAotc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQorc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3BjaS5oIGIvaW5jbHVkZS9hc20tc2g2NC9wY2kuaAppbmRleCBjNjg4NzBlLi5hYTgwNDMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvcGNpLmgKQEAgLTI2LDcgKzI2LDcgQEAKIC8qCiAgKiBTZXQgcGVuYWxpemUgaXNhIGlycSBmdW5jdGlvbgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3BjaS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvcGNpLmgKaW5kZXggNDRiYjM4Ny4uOTcwNTJiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcGNpLmgKQEAgLTIwLDcgKzIwLDcgQEAKIAkvKiBObyBzcGVjaWFsIGJ1cyBtYXN0ZXJpbmcgc2V0dXAgaGFuZGxpbmcgKi8KIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQorZXh0ZXJuIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3VuaXN0ZC5oCmluZGV4IDg0NjcwODQuLmFlZTE3ZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3VuaXN0ZC5oCkBAIC0yMTIsNyArMjEyLDcgQEAKICNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUgICAgICAgMTkzIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9lcG9sbF9jdGwgICAgICAgICAgMTk0IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9lcG9sbF93YWl0ICAgICAgICAgMTk1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl91bGltaXQgICAgICAgICAgMTk2ICAgIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0ICAgICAgICAgMTk2IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9nZXRwcGlkICAgICAgICAgICAgMTk3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9zaWdhY3Rpb24gICAgICAgICAgMTk4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9zZ2V0bWFzayAgICAgICAgICAgMTk5IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIzNCw3ICsyMzQsNyBAQAogI2RlZmluZSBfX05SX2lwYyAgICAgICAgICAgICAgICAyMTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NpZ3JldHVybiAgICAgICAgICAyMTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2Nsb25lICAgICAgICAgICAgICAyMTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBfX05SX21vZGlmeV9sZHQgICAgICAyMTggICAgTGludXggU3BlY2lmaWMgLSBpMzg2IHNwZWNpZmljLCB1bnVzZWQgICAgICAqLworI2RlZmluZSBfX05SX2lvcHJpb19nZXQgICAgICAgICAyMTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2FkanRpbWV4ICAgICAgICAgICAyMTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NpZ3Byb2NtYXNrICAgICAgICAyMjAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUgICAgICAyMjEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmgKaW5kZXggMDE4ZTJlNC4uOGI3MGVkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lycS5oCkBAIC0xNiw2ICsxNiwxOCBAQAogI2luY2x1ZGUgPGFzbS9waWwuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKK3N0cnVjdCBpbm9fYnVja2V0OworCisjZGVmaW5lIE1BWF9JUlFfREVTQ19BQ1RJT04JNAorCitzdHJ1Y3QgaXJxX2Rlc2MgeworCXZvaWQJCQkoKnByZV9oYW5kbGVyKShzdHJ1Y3QgaW5vX2J1Y2tldCAqLCB2b2lkICosIHZvaWQgKik7CisJdm9pZAkJCSpwcmVfaGFuZGxlcl9hcmcxOworCXZvaWQJCQkqcHJlX2hhbmRsZXJfYXJnMjsKKwl1MzIJCQlhY3Rpb25fYWN0aXZlX21hc2s7CisJc3RydWN0IGlycWFjdGlvbglhY3Rpb25bTUFYX0lSUV9ERVNDX0FDVElPTl07Cit9OworCiAvKiBZb3Ugc2hvdWxkIG5vdCBtZXNzIHdpdGggdGhpcyBkaXJlY3RseS4gVGhhdCdzIHRoZSBqb2Igb2YgaXJxLmMuCiAgKgogICogSWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLCBwbGVhc2UgdXBkYXRlIGhhbmQgY29kZWQgYXNzZW1ibGVyIG9mCkBAIC00MiwyNCArNTQsMTEgQEAKIAkvKiBNaXNjZWxsYW5lb3VzIGZsYWdzLiAqLwogLyoweDA2Ki91bnNpZ25lZCBjaGFyIGZsYWdzOwogCi0JLyogVGhpcyBpcyB1c2VkIHRvIGRlYWwgd2l0aCBJQkZfRE1BX1NZTkMgb24KLQkgKiBTYWJyZSBzeXN0ZW1zLgotCSAqLwotLyoweDA3Ki91bnNpZ25lZCBjaGFyIHN5bmN0YWJfZW50OworCS8qIEN1cnJlbnRseSB1bnVzZWQuICAqLworLyoweDA3Ki91bnNpZ25lZCBjaGFyIF9fcGFkOwogCi0JLyogUmVmZXJlbmNlIHRvIGhhbmRsZXIgZm9yIHRoaXMgSVJRLiAgSWYgdGhpcyBpcwotCSAqIG5vbi1OVUxMIHRoaXMgbWVhbnMgaXQgaXMgYWN0aXZlIGFuZCBzaG91bGQgYmUKLQkgKiBzZXJ2aWNlZC4gIEVsc2UgdGhlIHBlbmRpbmcgbWVtYmVyIGlzIHNldCB0byBvbmUKLQkgKiBhbmQgbGF0ZXIgcmVnaXN0cnkgb2YgdGhlIGludGVycnVwdCBjaGVja3MgZm9yCi0JICogdGhpcyBjb25kaXRpb24uCi0JICoKLQkgKiBOb3JtYWxseSB0aGlzIGlzIGp1c3QgYW4gaXJxX2FjdGlvbiBzdHJ1Y3R1cmUuCi0JICogQnV0LCBvbiBQQ0ksIGlmIG11bHRpcGxlIGludGVycnVwdCBzb3VyY2VzIGJlaGluZAotCSAqIGEgYnJpZGdlIGhhdmUgbXVsdGlwbGUgaW50ZXJydXB0IHNvdXJjZXMgdGhhdCBzaGFyZQotCSAqIHRoZSBzYW1lIElOTyBidWNrZXQsIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mCi0JICogcG9pbnRlcnMgdG8gZm91ciBJUlEgYWN0aW9uIHN0cnVjdHVyZXMuCi0JICovCi0vKjB4MDgqL3ZvaWQgKmlycV9pbmZvOworCS8qIFJlZmVyZW5jZSB0byBJUlEgZGVzY3JpcHRvciBmb3IgdGhpcyBidWNrZXQuICovCisvKjB4MDgqL3N0cnVjdCBpcnFfZGVzYyAqaXJxX2luZm87CiAKIAkvKiBTdW41IEludGVycnVwdCBDbGVhciBSZWdpc3Rlci4gKi8KIC8qMHgxMCovdW5zaWduZWQgbG9uZyBpY2xyOwpAQCAtNjksMTIgKzY4LDYgQEAKIAogfTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9kbWFfd3N5bmM7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkbWFfc3luY19yZWdfdGFibGVbMjU2XTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGRtYV9zeW5jX3JlZ190YWJsZV9lbnRyeTsKLSNlbmRpZgotCiAvKiBJTUFQL0lDTFIgcmVnaXN0ZXIgZGVmaW5lcyAqLwogI2RlZmluZSBJTUFQX1ZBTElECQkweDgwMDAwMDAwCS8qIElSUSBFbmFibGVkCQkqLwogI2RlZmluZSBJTUFQX1RJRF9VUEEJCTB4N2MwMDAwMDAJLyogVVBBIFRhcmdldElECQkqLwpAQCAtOTAsMTEgKzgzLDkgQEAKICNkZWZpbmUgSUNMUl9QRU5ESU5HCQkweDAwMDAwMDAzCS8qIFBlbmRpbmcgc3RhdGUJKi8KIAogLyogT25seSA4LWJpdHMgYXJlIGF2YWlsYWJsZSwgYmUgY2FyZWZ1bC4gIC1EYXZlTSAqLwotI2RlZmluZSBJQkZfRE1BX1NZTkMJMHgwMQkvKiBETUEgc3luY2hyb25pemF0aW9uIGJlaGluZCBQQ0kgYnJpZGdlIG5lZWRlZC4gKi8KLSNkZWZpbmUgSUJGX1BDSQkJMHgwMgkvKiBJbmRpY2F0ZXMgUFNZQ0hPL1NBQlJFL1NDSElaTyBQQ0kgaW50ZXJydXB0LgkgKi8KLSNkZWZpbmUgSUJGX0FDVElWRQkweDA0CS8qIFRoaXMgaW50ZXJydXB0IGlzIGFjdGl2ZSBhbmQgaGFzIGEgaGFuZGxlci4JICovCi0jZGVmaW5lIElCRl9NVUxUSQkweDA4CS8qIE9uIFBDSSwgaW5kaWNhdGVzIHNoYXJlZCBidWNrZXQuCQkgKi8KLSNkZWZpbmUgSUJGX0lOUFJPR1JFU1MJMHgxMAkvKiBJUlEgaXMgYmVpbmcgc2VydmljZWQuCQkJICovCisjZGVmaW5lIElCRl9QQ0kJCTB4MDIJLyogUFNZQ0hPL1NBQlJFL1NDSElaTyBQQ0kgaW50ZXJydXB0LgkgKi8KKyNkZWZpbmUgSUJGX0FDVElWRQkweDA0CS8qIEludGVycnVwdCBpcyBhY3RpdmUgYW5kIGhhcyBhIGhhbmRsZXIuKi8KKyNkZWZpbmUgSUJGX0lOUFJPR1JFU1MJMHgxMAkvKiBJUlEgaXMgYmVpbmcgc2VydmljZWQuCQkgKi8KIAogI2RlZmluZSBOVU1fSVZFQ1MJKElNQVBfSU5SICsgMSkKIGV4dGVybiBzdHJ1Y3QgaW5vX2J1Y2tldCBpdmVjdG9yX3RhYmxlW05VTV9JVkVDU107CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcmFtLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcmFtLmgKaW5kZXggNmExMmYzYS4uYTFjZDQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJhbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFyYW0uaApAQCAtMSw5ICsxLDEwIEBACi0vKiAkSWQ6IHBhcmFtLmgsdiAxLjIgMjAwMC8xMC8zMCAyMTowMTo0MSBkYXZlbSBFeHAgJCAqLwogI2lmbmRlZiBfQVNNU1BBUkM2NF9QQVJBTV9ICiAjZGVmaW5lIF9BU01TUEFSQzY0X1BBUkFNX0gKIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCiAjaWZkZWYgX19LRVJORUxfXwotIyBkZWZpbmUgSFoJCTEwMDAJLyogSW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLworIyBkZWZpbmUgSFoJCUNPTkZJR19IWgkvKiBJbnRlcm5hbCBrZXJuZWwgdGltZXIgZnJlcXVlbmN5ICovCiAjIGRlZmluZSBVU0VSX0haCTEwMAkvKiAuLiBzb21lIHVzZXIgaW50ZXJmYWNlcyBhcmUgaW4gInRpY2tzIiAqLwogIyBkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMgKFVTRVJfSFopCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFycG9ydC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJwb3J0LmgKaW5kZXggYjdlNjM1NS4uNTZiNTE5N2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFycG9ydC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFycG9ydC5oCkBAIC0yNywxMiArMjcsMTIgQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBlbmFibGVfZG1hKHVuc2lnbmVkIGludCBkbWFucikKIHsKKwllYnVzX2RtYV9lbmFibGUoJnNwYXJjX2VidXNfZG1hc1tkbWFucl0uaW5mbywgMSk7CisKIAlpZiAoZWJ1c19kbWFfcmVxdWVzdCgmc3BhcmNfZWJ1c19kbWFzW2RtYW5yXS5pbmZvLAogCQkJICAgICBzcGFyY19lYnVzX2RtYXNbZG1hbnJdLmFkZHIsCiAJCQkgICAgIHNwYXJjX2VidXNfZG1hc1tkbWFucl0uY291bnQpKQogCQlCVUcoKTsKLQotCWVidXNfZG1hX2VuYWJsZSgmc3BhcmNfZWJ1c19kbWFzW2RtYW5yXS5pbmZvLCAxKTsKIH0KIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBkaXNhYmxlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BibS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYm0uaAppbmRleCA0YzE1NjEwLi4zOGJiYmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BibS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGJtLmgKQEAgLTE0NSw2ICsxNDUsOSBAQAogCS8qIFBoeXNpY2FsIGFkZHJlc3MgYmFzZSBvZiBQQk0gcmVnaXN0ZXJzLiAqLwogCXVuc2lnbmVkIGxvbmcJCQlwYm1fcmVnczsKIAorCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgRE1BIHN5bmMgcmVnaXN0ZXIsIGlmIGFueS4gICovCisJdW5zaWduZWQgbG9uZwkJCXN5bmNfcmVnOworCiAJLyogT3BhcXVlIDMyLWJpdCBzeXN0ZW0gYnVzIFBvcnQgSUQuICovCiAJdTMyCQkJCXBvcnRpZDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKaW5kZXggODRlNDFjMS4uYTRhYjBlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCkBAIC0yMyw3ICsyMyw3IEBACiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zZWNjb21wLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NlY2NvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNkOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zZWNjb21wLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfQVNNX1NFQ0NPTVBfSAorCisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4gLyogYWxyZWFkeSBkZWZpbmVzIFRJRl8zMkJJVCAqLworCisjaWZuZGVmIFRJRl8zMkJJVAorI2Vycm9yICJ1bmV4cGVjdGVkIFRJRl8zMkJJVCBvbiBzcGFyYzY0IgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKworI2RlZmluZSBfX05SX3NlY2NvbXBfcmVhZCBfX05SX3JlYWQKKyNkZWZpbmUgX19OUl9zZWNjb21wX3dyaXRlIF9fTlJfd3JpdGUKKyNkZWZpbmUgX19OUl9zZWNjb21wX2V4aXQgX19OUl9leGl0CisjZGVmaW5lIF9fTlJfc2VjY29tcF9zaWdyZXR1cm4gX19OUl9ydF9zaWdyZXR1cm4KKworI2RlZmluZSBfX05SX3NlY2NvbXBfcmVhZF8zMiBfX05SX3JlYWQKKyNkZWZpbmUgX19OUl9zZWNjb21wX3dyaXRlXzMyIF9fTlJfd3JpdGUKKyNkZWZpbmUgX19OUl9zZWNjb21wX2V4aXRfMzIgX19OUl9leGl0CisjZGVmaW5lIF9fTlJfc2VjY29tcF9zaWdyZXR1cm5fMzIgX19OUl9zaWdyZXR1cm4KKworI2VuZGlmIC8qIF9BU01fU0VDQ09NUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NpZ25hbC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zaWduYWwuaAppbmRleCBiZWNkZjFiLi5lMzA1OWJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NpZ25hbC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2lnbmFsLmgKQEAgLTE2MiwyMSArMTYyLDYgQEAKICNkZWZpbmUgTUlOU0lHU1RLU1oJNDA5NgogI2RlZmluZSBTSUdTVEtTWgkxNjM4NAogCi0jaWZkZWYgX19LRVJORUxfXwotLyoKLSAqIERKSFIKLSAqIFNBX1NUQVRJQ19BTExPQyBpcyB1c2VkIGZvciB0aGUgU1BBUkMgc3lzdGVtIHRvIGluZGljYXRlIHRoYXQgdGhpcwotICogaW50ZXJydXB0IGhhbmRsZXIncyBpcnEgc3RydWN0dXJlIHNob3VsZCBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZAotICogYnkgdGhlIHJlcXVlc3RfaXJxIHJvdXRpbmUuCi0gKiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCBhcmNoL3NwYXJjL2tlcm5lbC9pcnEuYyBoYXMgY2FybmFsIGtub3dsZWRnZQotICogb2YgaW50ZXJydXB0IHVzYWdlIGFuZCB0aGF0IHN1Y2tzLiBBbHNvIHdpdGhvdXQgYSBmbGFnIGxpa2UgdGhpcwotICogaXQgbWF5IGJlIHBvc3NpYmxlIGZvciB0aGUgZnJlZV9pcnEgcm91dGluZSB0byBhdHRlbXB0IHRvIGZyZWUKLSAqIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGRhdGEuLiB3aGljaCBpcyBOT1QgR09PRC4KLSAqCi0gKi8KLSNkZWZpbmUgU0FfU1RBVElDX0FMTE9DCQkweDgwCi0jZW5kaWYKLQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ25hbC5oPgogCiBzdHJ1Y3QgX19uZXdfc2lnYWN0aW9uIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGhyZWFkX2luZm8uaAppbmRleCAwY2Q2NTI5Li5hMWQyNWMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90aHJlYWRfaW5mby5oCkBAIC0yMjAsOCArMjIwLDggQEAKICNkZWZpbmUgVElGX05FV1NJR05BTFMJCTYJLyogd2FudHMgbmV3LXN0eWxlIHNpZ25hbHMgKi8KICNkZWZpbmUgVElGXzMyQklUCQk3CS8qIDMyLWJpdCBiaW5hcnkgKi8KICNkZWZpbmUgVElGX05FV0NISUxECQk4CS8qIGp1c3Qtc3Bhd25lZCBjaGlsZCBwcm9jZXNzICovCi0vKiBUSUZfKiB2YWx1ZSA5IGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJMTAKKyNkZWZpbmUgVElGX1NFQ0NPTVAJCTkJLyogc2VjdXJlIGNvbXB1dGluZyAqLworI2RlZmluZSBUSUZfU1lTQ0FMTF9BVURJVAkxMAkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9TVUNDRVNTCTExCiAvKiBOT1RFOiBUaHJlYWQgZmxhZ3MgPj0gMTIgc2hvdWxkIGJlIG9uZXMgd2UgaGF2ZSBubyBpbnRlcmVzdAogICogICAgICAgaW4gdXNpbmcgaW4gYXNzZW1ibHksIGVsc2Ugd2UgY2FuJ3QgdXNlIHRoZSBtYXNrIGFzCkBAIC0yMjksNiArMjI5LDcgQEAKICAqLwogI2RlZmluZSBUSUZfQUJJX1BFTkRJTkcJCTEyCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTEzCisjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNAogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCkBAIC0yMzksOSArMjQwLDExIEBACiAjZGVmaW5lIF9USUZfTkVXU0lHTkFMUwkJKDE8PFRJRl9ORVdTSUdOQUxTKQogI2RlZmluZSBfVElGXzMyQklUCQkoMTw8VElGXzMyQklUKQogI2RlZmluZSBfVElGX05FV0NISUxECQkoMTw8VElGX05FV0NISUxEKQotI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCi0jZGVmaW5lIF9USUZfQUJJX1BFTkRJTkcJKDE8PFRJRl9BQklfUEVORElORykKKyNkZWZpbmUgX1RJRl9TRUNDT01QCQkoMTw8VElGX1NFQ0NPTVApCisjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMTw8VElGX1NZU0NBTExfQVVESVQpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9TVUNDRVNTCSgxPDxUSUZfU1lTQ0FMTF9TVUNDRVNTKQorI2RlZmluZSBfVElGX0FCSV9QRU5ESU5HCSgxPDxUSUZfQUJJX1BFTkRJTkcpCisjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDE8PFRJRl9QT0xMSU5HX05SRkxBRykKIAogI2RlZmluZSBfVElGX1VTRVJfV09SS19NQVNLCSgoMHhmZiA8PCBUSV9GTEFHX1dTQVZFRF9TSElGVCkgfCBcCiAJCQkJIChfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX1NJR1BFTkRJTkcgfCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaAppbmRleCA1YjhkY2Y1Li5mNTkxNDRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmgKQEAgLTIxMiw3ICsyMTIsNyBAQAogI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZSAgICAgICAxOTMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2Vwb2xsX2N0bCAgICAgICAgICAxOTQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQgICAgICAgICAxOTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBfX05SX3VsaW1pdCAgICAgICAgICAxOTYgICAgTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2lvcHJpb19zZXQgICAgICAgICAxOTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2dldHBwaWQgICAgICAgICAgICAxOTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NpZ2FjdGlvbiAgICAgICAgICAxOTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NnZXRtYXNrICAgICAgICAgICAxOTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjM0LDcgKzIzNCw3IEBACiAjZGVmaW5lIF9fTlJfaXBjICAgICAgICAgICAgICAgIDIxNSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfc2lncmV0dXJuICAgICAgICAgIDIxNiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfY2xvbmUgICAgICAgICAgICAgIDIxNyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfbW9kaWZ5X2xkdCAgICAgIDIxOCAgICBMaW51eCBTcGVjaWZpYyAtIGkzODYgc3BlY2lmaWMsIHVudXNlZCAgICAgICovCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldCAgICAgICAgIDIxOCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfYWRqdGltZXggICAgICAgICAgIDIxOSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfc2lncHJvY21hc2sgICAgICAgIDIyMCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZSAgICAgIDIyMSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tdW0vbW11X2NvbnRleHQuaAppbmRleCA4OWJmZjMxLi4wOTViYjYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL21tdV9jb250ZXh0LmgKQEAgLTcsMTkgKzcsMjMgQEAKICNkZWZpbmUgX19VTV9NTVVfQ09OVEVYVF9ICiAKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgorI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgogI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCisjaW5jbHVkZSAidW1fbW11LmgiCiAKICNkZWZpbmUgZ2V0X21tdV9jb250ZXh0KHRhc2spIGRvIDsgd2hpbGUoMCkKICNkZWZpbmUgYWN0aXZhdGVfY29udGV4dCh0c2spIGRvIDsgd2hpbGUoMCkKIAogI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzayxtbSkJZG8geyB9IHdoaWxlICgwKQogCitleHRlcm4gdm9pZCBmb3JjZV9mbHVzaF9hbGwodm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICpvbGQsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5ldykKIHsKKwlpZiAob2xkICE9IG5ldykKKwkJZm9yY2VfZmx1c2hfYWxsKCk7CiB9CiAKLWV4dGVybiB2b2lkIHN3aXRjaF9tbV9za2FzKGludCBtbV9mZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwgCiAJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewpAQCAtMzAsNyArMzQsNyBAQAogCQljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOwogCQlpZihuZXh0ICE9ICZpbml0X21tKQogCQkJQ0hPT1NFX01PREUoKHZvaWQpIDAsIAotCQkJCSAgICBzd2l0Y2hfbW1fc2thcyhuZXh0LT5jb250ZXh0LnNrYXMubW1fZmQpKTsKKwkJCQkgICAgc3dpdGNoX21tX3NrYXMoJm5leHQtPmNvbnRleHQuc2thcy5pZCkpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tdjg1MC9jaGVja3N1bS5oCmluZGV4IGQzYWVkYjcuLjRkZjVlNzEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9jaGVja3N1bS5oCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIGluY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaCAtLSBDaGVja3N1bSBvcHMKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxICBORUMgQ29ycG9yYXRpb24KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMSwyMDA1ICBORUMgQ29ycG9yYXRpb24KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwNSAgTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5vcmc+CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAogICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwpAQCAtMzYsOCArMzYsOCBAQAogICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgY3N1bV9wYXJ0aWFsX2NvcHkgKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJCSAgIHVuc2lnbmVkIHN1bSk7CitleHRlcm4gdW5zaWduZWQgY3N1bV9wYXJ0aWFsX2NvcHkgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKKwkJCQkgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sIHVuc2lnbmVkIHN1bSk7CiAKIAogLyoKQEAgLTQ2LDcgKzQ2LDggQEAKICAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlciAoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsCitleHRlcm4gdW5zaWduZWQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCisJCQkJCSAgICAgdW5zaWduZWQgY2hhciAqZHN0LAogCQkJCQkgICAgIGludCBsZW4sIHVuc2lnbmVkIHN1bSwKIAkJCQkJICAgICBpbnQgKmNzdW1fZXJyKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9tbXUuaCBiL2luY2x1ZGUvYXNtLXY4NTAvbW11LmgKaW5kZXggZTMwYTUyYi4uMjY3NzY4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL21tdS5oCkBAIC0xLDIyICsxLDExIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDIsIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+ICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUsIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+ICovCiAKICNpZm5kZWYgX19WODUwX01NVV9IX18KICNkZWZpbmUgX19WODUwX01NVV9IX18KIAotc3RydWN0IG1tX3JibG9ja19zdHJ1Y3QgewotCWludAkJc2l6ZTsKLQlpbnQJCXJlZmNvdW50OwotCXZvaWQJKmtibG9jazsKLX07Ci0KLXN0cnVjdCBtbV90YmxvY2tfc3RydWN0IHsKLQlzdHJ1Y3QgbW1fcmJsb2NrX3N0cnVjdAkqcmJsb2NrOwotCXN0cnVjdCBtbV90YmxvY2tfc3RydWN0CSpuZXh0OwotfTsKLQogdHlwZWRlZiBzdHJ1Y3QgewotCXN0cnVjdCBtbV90YmxvY2tfc3RydWN0CXRibG9jazsKLQl1bnNpZ25lZCBsb25nCQkJZW5kX2JyazsKKwlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QJKnZtbGlzdDsKKwl1bnNpZ25lZCBsb25nCQllbmRfYnJrOwogfSBtbV9jb250ZXh0X3Q7CiAKICNlbmRpZiAvKiBfX1Y4NTBfTU1VX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKaW5kZXggYTZiNDFiOC4uZGM4Yzk4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCkBAIC0yOCw2ICsyOCw4IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxhY3BpL3BkY19pbnRlbC5oPgorCiAjZGVmaW5lIENPTVBJTEVSX0RFUEVOREVOVF9JTlQ2NCAgIGxvbmcgbG9uZwogI2RlZmluZSBDT01QSUxFUl9ERVBFTkRFTlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcKIApAQCAtOTksMTIgKzEwMSw2IEBACiAgICAgICAgIDoiPXIiKG5faGkpLCAiPXIiKG5fbG8pICAgICBcCiAgICAgICAgIDoiMCIobl9oaSksICIxIihuX2xvKSkKIAotLyoKLSAqIFJlZmVyIEludGVsIEFDUEkgX1BEQyBzdXBwb3J0IGRvY3VtZW50IGZvciBiaXQgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVAgCTB4YQotI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9NU1IJMHgxCi0KICNpZmRlZiBDT05GSUdfQUNQSV9CT09UCiBleHRlcm4gaW50IGFjcGlfbGFwaWM7CiBleHRlcm4gaW50IGFjcGlfaW9hcGljOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oCmluZGV4IGMxOTYxZGIuLmVlYjMwODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGNpLmgKQEAgLTMzLDcgKzMzLDcgQEAKIGV4dGVybiBpbnQgKCpwY2lfY29uZmlnX3dyaXRlKShpbnQgc2VnLCBpbnQgYnVzLCBpbnQgZGV2LCBpbnQgZm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSk7CiAKIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSk7Cit2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKTsKIHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcGNpYmlvc19nZXRfaXJxX3JvdXRpbmdfdGFibGUodm9pZCk7CiBpbnQgcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpbiwgaW50IGlycSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKaW5kZXggZjJmMDczNi4uNmM4MTNlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKQEAgLTE1LDYgKzE1LDEzIEBACiBleHRlcm4gdm9pZCBlYXJseV9pZHRfaGFuZGxlcih2b2lkKTsKIAogZXh0ZXJuIHZvaWQgbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKKyNpZmRlZiBDT05GSUdfTVRSUgorZXh0ZXJuIHZvaWQgbXRycl9hcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgbXRycl9icF9pbml0KHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgbXRycl9hcF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG10cnJfYnBfaW5pdCgpIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCiBleHRlcm4gdm9pZCBpbml0X21lbW9yeV9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIAogZXh0ZXJuIHZvaWQgc3lzdGVtX2NhbGwodm9pZCk7IApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lwYy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2lwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVlZDRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvaXBjLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCi0gKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCi0gKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0lQQ19ICi0jZGVmaW5lIF9YVEVOU0FfSVBDX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lwYy5oPgotCi0jZW5kaWYJLyogX1hURU5TQV9JUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oCmluZGV4IDY0YzY0ZGQuLjZiMzlkNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdW5pc3RkLmgKQEAgLTEzLDQyICsxMywzMSBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogCi0vLyNkZWZpbmUgX19OUl9zZXR1cAkJICAwIC8qIHVzZWQgb25seSBieSBpbml0LCB0byBnZXQgc3lzdGVtIGdvaW5nICovCiAjZGVmaW5lIF9fTlJfc3BpbGwJCSAgMAogI2RlZmluZSBfX05SX2V4aXQJCSAgMQotI2RlZmluZSBfX05SX2ZvcmsJCSAgMgogI2RlZmluZSBfX05SX3JlYWQJCSAgMwogI2RlZmluZSBfX05SX3dyaXRlCQkgIDQKICNkZWZpbmUgX19OUl9vcGVuCQkgIDUKICNkZWZpbmUgX19OUl9jbG9zZQkJICA2Ci0jZGVmaW5lIF9fTlJfd2FpdHBpZAkJICA3CiAjZGVmaW5lIF9fTlJfY3JlYXQJCSAgOAogI2RlZmluZSBfX05SX2xpbmsJCSAgOQogI2RlZmluZSBfX05SX3VubGluawkJIDEwCiAjZGVmaW5lIF9fTlJfZXhlY3ZlCQkgMTEKICNkZWZpbmUgX19OUl9jaGRpcgkJIDEyCi0jZGVmaW5lIF9fTlJfdGltZQkJIDEzCiAjZGVmaW5lIF9fTlJfbWtub2QJCSAxNAogI2RlZmluZSBfX05SX2NobW9kCQkgMTUKICNkZWZpbmUgX19OUl9sY2hvd24JCSAxNgogI2RlZmluZSBfX05SX2JyZWFrCQkgMTcKLSNkZWZpbmUgX19OUl9vbGRzdGF0CQkgMTgKICNkZWZpbmUgX19OUl9sc2VlawkJIDE5CiAjZGVmaW5lIF9fTlJfZ2V0cGlkCQkgMjAKICNkZWZpbmUgX19OUl9tb3VudAkJIDIxCi0jZGVmaW5lIF9fTlJfb2xkdW1vdW50CQkgMjIKICNkZWZpbmUgX19OUl9zZXR1aWQJCSAyMwogI2RlZmluZSBfX05SX2dldHVpZAkJIDI0Ci0jZGVmaW5lIF9fTlJfc3RpbWUJCSAyNQogI2RlZmluZSBfX05SX3B0cmFjZQkJIDI2Ci0jZGVmaW5lIF9fTlJfYWxhcm0JCSAyNwotI2RlZmluZSBfX05SX29sZGZzdGF0CQkgMjgKLSNkZWZpbmUgX19OUl9wYXVzZQkJIDI5CiAjZGVmaW5lIF9fTlJfdXRpbWUJCSAzMAogI2RlZmluZSBfX05SX3N0dHkJCSAzMQogI2RlZmluZSBfX05SX2d0dHkJCSAzMgogI2RlZmluZSBfX05SX2FjY2VzcwkJIDMzCi0jZGVmaW5lIF9fTlJfbmljZQkJIDM0CiAjZGVmaW5lIF9fTlJfZnRpbWUJCSAzNQogI2RlZmluZSBfX05SX3N5bmMJCSAzNgogI2RlZmluZSBfX05SX2tpbGwJCSAzNwpAQCAtNjYsMjQgKzU1LDE4IEBACiAjZGVmaW5lIF9fTlJfZ2V0ZXVpZAkJIDQ5CiAjZGVmaW5lIF9fTlJfZ2V0ZWdpZAkJIDUwCiAjZGVmaW5lIF9fTlJfYWNjdAkJIDUxCi0jZGVmaW5lIF9fTlJfdW1vdW50CQkgNTIKICNkZWZpbmUgX19OUl9sb2NrCQkgNTMKICNkZWZpbmUgX19OUl9pb2N0bAkJIDU0CiAjZGVmaW5lIF9fTlJfZmNudGwJCSA1NQotI2RlZmluZSBfX05SX21weAkJIDU2CiAjZGVmaW5lIF9fTlJfc2V0cGdpZAkJIDU3CiAjZGVmaW5lIF9fTlJfdWxpbWl0CQkgNTgKLSNkZWZpbmUgX19OUl9vbGRvbGR1bmFtZQkgNTkKICNkZWZpbmUgX19OUl91bWFzawkJIDYwCiAjZGVmaW5lIF9fTlJfY2hyb290CQkgNjEKICNkZWZpbmUgX19OUl91c3RhdAkJIDYyCiAjZGVmaW5lIF9fTlJfZHVwMgkJIDYzCiAjZGVmaW5lIF9fTlJfZ2V0cHBpZAkJIDY0Ci0jZGVmaW5lIF9fTlJfZ2V0cGdycAkJIDY1CiAjZGVmaW5lIF9fTlJfc2V0c2lkCQkgNjYKICNkZWZpbmUgX19OUl9zaWdhY3Rpb24JCSA2NwotI2RlZmluZSBfX05SX3NnZXRtYXNrCQkgNjgKLSNkZWZpbmUgX19OUl9zc2V0bWFzawkJIDY5CiAjZGVmaW5lIF9fTlJfc2V0cmV1aWQJCSA3MAogI2RlZmluZSBfX05SX3NldHJlZ2lkCQkgNzEKICNkZWZpbmUgX19OUl9zaWdzdXNwZW5kCQkgNzIKQEAgLTk4LDEzICs4MSwxMCBAQAogI2RlZmluZSBfX05SX3NldGdyb3VwcwkJIDgxCiAjZGVmaW5lIF9fTlJfc2VsZWN0CQkgODIKICNkZWZpbmUgX19OUl9zeW1saW5rCQkgODMKLSNkZWZpbmUgX19OUl9vbGRsc3RhdAkJIDg0CiAjZGVmaW5lIF9fTlJfcmVhZGxpbmsJCSA4NQogI2RlZmluZSBfX05SX3VzZWxpYgkJIDg2CiAjZGVmaW5lIF9fTlJfc3dhcG9uCQkgODcKICNkZWZpbmUgX19OUl9yZWJvb3QJCSA4OAotI2RlZmluZSBfX05SX3JlYWRkaXIJCSA4OQotI2RlZmluZSBfX05SX21tYXAJCSA5MAogI2RlZmluZSBfX05SX211bm1hcAkJIDkxCiAjZGVmaW5lIF9fTlJfdHJ1bmNhdGUJCSA5MgogI2RlZmluZSBfX05SX2Z0cnVuY2F0ZQkJIDkzCkBAIC0xMTYsMjIgKzk2LDE4IEBACiAjZGVmaW5lIF9fTlJfc3RhdGZzCQkgOTkKICNkZWZpbmUgX19OUl9mc3RhdGZzCQkxMDAKICNkZWZpbmUgX19OUl9pb3Blcm0JCTEwMQotI2RlZmluZSBfX05SX3NvY2tldGNhbGwJCTEwMgogI2RlZmluZSBfX05SX3N5c2xvZwkJMTAzCiAjZGVmaW5lIF9fTlJfc2V0aXRpbWVyCQkxMDQKICNkZWZpbmUgX19OUl9nZXRpdGltZXIJCTEwNQogI2RlZmluZSBfX05SX3N0YXQJCTEwNgogI2RlZmluZSBfX05SX2xzdGF0CQkxMDcKICNkZWZpbmUgX19OUl9mc3RhdAkJMTA4Ci0jZGVmaW5lIF9fTlJfb2xkdW5hbWUJCTEwOQogI2RlZmluZSBfX05SX2lvcGwJCTExMAogI2RlZmluZSBfX05SX3ZoYW5ndXAJCTExMQogI2RlZmluZSBfX05SX2lkbGUJCTExMgotI2RlZmluZSBfX05SX3ZtODYJCTExMwogI2RlZmluZSBfX05SX3dhaXQ0CQkxMTQKICNkZWZpbmUgX19OUl9zd2Fwb2ZmCQkxMTUKICNkZWZpbmUgX19OUl9zeXNpbmZvCQkxMTYKLSNkZWZpbmUgX19OUl9pcGMJCTExNwogI2RlZmluZSBfX05SX2ZzeW5jCQkxMTgKICNkZWZpbmUgX19OUl9zaWdyZXR1cm4JCTExOQogI2RlZmluZSBfX05SX2Nsb25lCQkxMjAKQEAgLTE0MCwxOCArMTE2LDE1IEBACiAjZGVmaW5lIF9fTlJfbW9kaWZ5X2xkdAkJMTIzCiAjZGVmaW5lIF9fTlJfYWRqdGltZXgJCTEyNAogI2RlZmluZSBfX05SX21wcm90ZWN0CQkxMjUKLSNkZWZpbmUgX19OUl9zaWdwcm9jbWFzawkxMjYKICNkZWZpbmUgX19OUl9jcmVhdGVfbW9kdWxlCTEyNwogI2RlZmluZSBfX05SX2luaXRfbW9kdWxlCTEyOAogI2RlZmluZSBfX05SX2RlbGV0ZV9tb2R1bGUJMTI5Ci0jZGVmaW5lIF9fTlJfZ2V0X2tlcm5lbF9zeW1zCTEzMAogI2RlZmluZSBfX05SX3F1b3RhY3RsCQkxMzEKICNkZWZpbmUgX19OUl9nZXRwZ2lkCQkxMzIKICNkZWZpbmUgX19OUl9mY2hkaXIJCTEzMwogI2RlZmluZSBfX05SX2JkZmx1c2gJCTEzNAogI2RlZmluZSBfX05SX3N5c2ZzCQkxMzUKICNkZWZpbmUgX19OUl9wZXJzb25hbGl0eQkxMzYKLSNkZWZpbmUgX19OUl9hZnNfc3lzY2FsbAkxMzcgLyogU3lzY2FsbCBmb3IgQW5kcmV3IEZpbGUgU3lzdGVtICovCiAjZGVmaW5lIF9fTlJfc2V0ZnN1aWQJCTEzOAogI2RlZmluZSBfX05SX3NldGZzZ2lkCQkxMzkKICNkZWZpbmUgX19OUl9fbGxzZWVrCQkxNDAKQEAgLTIyMiw4ICsxOTUsNiBAQAogI2RlZmluZSBfX05SX2NhcHNldAkJMjA1CiAjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sJMjA2CiAjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCTIwNwotI2RlZmluZSBfX05SX3N0cmVhbXMxCQkyMDgJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBpdCAqLwotI2RlZmluZSBfX05SX3N0cmVhbXMyCQkyMDkJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBpdCAqLwogI2RlZmluZSBfX05SX21tYXAyCQkyMTAKICNkZWZpbmUgX19OUl90cnVuY2F0ZTY0CQkyMTEKICNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NAkyMTIKQEAgLTIzNCw3ICsyMDUsNiBAQAogI2RlZmluZSBfX05SX21pbmNvcmUJCTIxNwogI2RlZmluZSBfX05SX21hZHZpc2UJCTIxOAogI2RlZmluZSBfX05SX2dldGRlbnRzNjQJCTIxOQotI2RlZmluZSBfX05SX3Zmb3JrCQkyMjAKIAogLyogS2VlcCB0aGlzIGxhc3Q7IHNob3VsZCBhbHdheXMgZXF1YWwgdGhlIGxhc3QgdmFsaWQgY2FsbCBudW1iZXIuICovCiAjZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMgICAgIDIyMApAQCAtNDQ4LDU1ICs0MTgsNyBAQAogCiAKICNpZmRlZiBfX0tFUk5FTF9TWVNDQUxMU19fCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLQotLyoKLSAqIHdlIG5lZWQgdGhpcyBpbmxpbmUgLSBmb3JraW5nIGZyb20ga2VybmVsIHNwYWNlIHdpbGwgcmVzdWx0Ci0gKiBpbiBOTyBDT1BZIE9OIFdSSVRFICghISEpLCB1bnRpbCBhbiBleGVjdmUgaXMgZXhlY3V0ZWQuIFRoaXMKLSAqIGlzIG5vIHByb2JsZW0sIGJ1dCBmb3IgdGhlIHN0YWNrLiBUaGlzIGlzIGhhbmRsZWQgYnkgbm90IGxldHRpbmcKLSAqIG1haW4oKSB1c2UgdGhlIHN0YWNrIGF0IGFsbCBhZnRlciBmb3JrKCkuIFRodXMsIG5vIGZ1bmN0aW9uCi0gKiBjYWxscyAtIHdoaWNoIG1lYW5zIGlubGluZSBjb2RlIGZvciBmb3JrIHRvbywgYXMgb3RoZXJ3aXNlIHdlCi0gKiB3b3VsZCB1c2UgdGhlIHN0YWNrIHVwb24gZXhpdCBmcm9tICdmb3JrKCknLgotICoKLSAqIEFjdHVhbGx5IG9ubHkgcGF1c2UgYW5kIGZvcmsgYXJlIG5lZWRlZCBpbmxpbmUsIHNvIHRoYXQgdGhlcmUKLSAqIHdvbid0IGJlIGFueSBtZXNzaW5nIHdpdGggdGhlIHN0YWNrIGZyb20gbWFpbigpLCBidXQgd2UgZGVmaW5lCi0gKiBzb21lIG90aGVycyB0b28uCi0gKi8KLQotI2RlZmluZSBfX05SX19leGl0IF9fTlJfZXhpdAotCi1zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDAoaW50LHBhdXNlKQotLy9zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDEoaW50LHNldHVwLGludCxtYWdpYykgRklYTUUKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMChpbnQsc3luYykKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMChwaWRfdCxzZXRzaWQpCi1zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDMoaW50LHdyaXRlLGludCxmZCxjb25zdCBjaGFyICosYnVmLG9mZl90LGNvdW50KQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwzKGludCxyZWFkLGludCxmZCxjaGFyICosYnVmLG9mZl90LGNvdW50KQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwzKG9mZl90LGxzZWVrLGludCxmZCxvZmZfdCxvZmZzZXQsaW50LGNvdW50KQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwxKGludCxkdXAsaW50LGZkKQogc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwzKGludCxleGVjdmUsY29uc3QgY2hhciosZmlsZSxjaGFyKiosYXJndixjaGFyKiosZW52cCkKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMyhpbnQsb3Blbixjb25zdCBjaGFyICosZmlsZSxpbnQsZmxhZyxpbnQsbW9kZSkKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMShpbnQsY2xvc2UsaW50LGZkKQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwxKGludCxfZXhpdCxpbnQsZXhpdGNvZGUpCi1zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDMocGlkX3Qsd2FpdHBpZCxwaWRfdCxwaWQsaW50ICosd2FpdF9zdGF0LGludCxvcHRpb25zKQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwxKGludCxkZWxldGVfbW9kdWxlLGNvbnN0IGNoYXIgKixuYW1lKQotCi1zdHJ1Y3Qgc3RhdDsKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMihpbnQsZnN0YXQsaW50LGZkLHN0cnVjdCBzdGF0ICosYnVmKQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwwKHBpZF90LGdldHBpZCkKLXN0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMihpbnQsa2lsbCxpbnQscGlkLGludCxzaWcpCi1zdGF0aWMgX19pbmxpbmVfXyBfc3lzY2FsbDIoaW50LHN0YXQsY29uc3QgY2hhciAqLCBwYXRoLHN0cnVjdCBzdGF0ICosYnVmKQotc3RhdGljIF9faW5saW5lX18gX3N5c2NhbGwxKGludCx1bmxpbmssY2hhciAqLHBhdGhuYW1lKQotCi0KLQotZXh0ZXJuIHBpZF90IHdhaXRwaWQoaW50LCBpbnQqLCBpbnQgKTsKLXN0YXRpYyBfX2lubGluZV9fIHBpZF90IHdhaXQoaW50ICogd2FpdF9zdGF0KQotewotCXJldHVybiB3YWl0cGlkKC0xLHdhaXRfc3RhdCwwKTsKLX0KICNlbmRpZgogCiAvKgpAQCAtNTA4LDMwICs0MzAsMTAgQEAKICNkZWZpbmUgY29uZF9zeXNjYWxsKHgpIGFzbSgiLndlYWtcdCIgI3ggIlxuXHQuc2V0XHQiICN4ICIsc3lzX25pX3N5c2NhbGwiKTsKIAogI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KLSNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKLSNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1NUQVQKICNkZWZpbmUgX19BUkNIX1dBTlRfU1RBVDY0Ci0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1BBVVNFCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TR0VUTUFTSwotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHTkFMCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfV0FJVFBJRAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU09DS0VUQ0FMTAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfRkFEVklTRTY0Ci0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRQR1JQCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19MTFNFRUsKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX05JQ0UKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRF9HRVRSTElNSVQKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRFVNT1VOVAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORwotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgogI2VuZGlmCiAKLQotCiAjZW5kaWYJLyogX1hURU5TQV9VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCBlZjg0ODM2Li5mODVjYmU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGkuaApAQCAtMjA2LDcgKzIwNiwxMCBAQAogCXU4CQkJZWlkOwogCXU4CQkJaW9zYXBpY192ZWN0b3I7CiAJdTMyCQkJZ2xvYmFsX2lycTsKLQl1MzIJCQlyZXNlcnZlZDsKKwlzdHJ1Y3QgeworCQl1MzIJCQljcGVpX292ZXJyaWRlX2ZsYWc6MTsKKwkJdTMyCQkJcmVzZXJ2ZWQ6MzE7CisJfQkJCXBsaW50X2ZsYWdzOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIGVudW0gYWNwaV9pbnRlcnJ1cHRfaWQgewpAQCAtNDc1LDcgKzQ3OCw3IEBACiBzdHJ1Y3QgcGNpX2RldjsKIAogaW50IGFjcGlfcGNpX2lycV9lbmFibGUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBhY3BpX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSk7Cit2b2lkIGFjcGlfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKTsKIAogI2lmZGVmIENPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRCiB2b2lkIGFjcGlfcGNpX2lycV9kaXNhYmxlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXVkaXQuaCBiL2luY2x1ZGUvbGludXgvYXVkaXQuaAppbmRleCBiZjJhZDNiLi42OGFiYTBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCkBAIC0xNjUsNyArMTY1LDcgQEAKICNkZWZpbmUgQVVESVRfQVJDSF9TSDY0CQkoRU1fU0h8X19BVURJVF9BUkNIXzY0QklUKQogI2RlZmluZSBBVURJVF9BUkNIX1NIRUw2NAkoRU1fU0h8X19BVURJVF9BUkNIXzY0QklUfF9fQVVESVRfQVJDSF9MRSkKICNkZWZpbmUgQVVESVRfQVJDSF9TUEFSQwkoRU1fU1BBUkMpCi0jZGVmaW5lIEFVRElUX0FSQ0hfU1BBUkM2NAkoRU1fU1BBUkM2NHxfX0FVRElUX0FSQ0hfNjRCSVQpCisjZGVmaW5lIEFVRElUX0FSQ0hfU1BBUkM2NAkoRU1fU1BBUkNWOXxfX0FVRElUX0FSQ0hfNjRCSVQpCiAjZGVmaW5lIEFVRElUX0FSQ0hfVjg1MAkJKEVNX1Y4NTB8X19BVURJVF9BUkNIX0xFKQogI2RlZmluZSBBVURJVF9BUkNIX1g4Nl82NAkoRU1fWDg2XzY0fF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaCBiL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaAppbmRleCA4MDJjOTFlLi45MDgyODQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgKKysrIGIvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oCkBAIC0xOSw2ICsxOSw5IEBACiAJQkhfRGlydHksCS8qIElzIGRpcnR5ICovCiAJQkhfTG9jaywJLyogSXMgbG9ja2VkICovCiAJQkhfUmVxLAkJLyogSGFzIGJlZW4gc3VibWl0dGVkIGZvciBJL08gKi8KKwlCSF9VcHRvZGF0ZV9Mb2NrLC8qIFVzZWQgYnkgdGhlIGZpcnN0IGJoIGluIGEgcGFnZSwgdG8gc2VyaWFsaXNlCisJCQkgICogSU8gY29tcGxldGlvbiBvZiBvdGhlciBidWZmZXJzIGluIHRoZSBwYWdlCisJCQkgICovCiAKIAlCSF9NYXBwZWQsCS8qIEhhcyBhIGRpc2sgbWFwcGluZyAqLwogCUJIX05ldywJCS8qIERpc2sgbWFwcGluZyB3YXMgbmV3bHkgY3JlYXRlZCBieSBnZXRfYmxvY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvY2FjaGUuaAppbmRleCA0ZDc2N2I5Li5mNmI1YTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jYWNoZS5oCkBAIC0xMyw2ICsxMywxMiBAQAogI2RlZmluZSBTTVBfQ0FDSEVfQllURVMgTDFfQ0FDSEVfQllURVMKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfWDg2KSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQzY0KQorI2RlZmluZSBfX3JlYWRfbW9zdGx5IF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5yZWFkX21vc3RseSIpKSkKKyNlbHNlCisjZGVmaW5lIF9fcmVhZF9tb3N0bHkKKyNlbmRpZgorCiAjaWZuZGVmIF9fX19jYWNoZWxpbmVfYWxpZ25lZAogI2RlZmluZSBfX19fY2FjaGVsaW5lX2FsaWduZWQgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oU01QX0NBQ0hFX0JZVEVTKSkpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oCmluZGV4IDcwYTRlYmIuLmVjYjBkMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaApAQCAtMzQ2LDEwICszNDYsMjcgQEAKIC8qIExQICovCiBDT01QQVRJQkxFX0lPQ1RMKExQR0VUU1RBVFVTKQogLyogcHBkZXYgKi8KK0NPTVBBVElCTEVfSU9DVEwoUFBTRVRNT0RFKQorQ09NUEFUSUJMRV9JT0NUTChQUFJTVEFUVVMpCitDT01QQVRJQkxFX0lPQ1RMKFBQUkNPTlRST0wpCitDT01QQVRJQkxFX0lPQ1RMKFBQV0NPTlRST0wpCitDT01QQVRJQkxFX0lPQ1RMKFBQRkNPTlRST0wpCitDT01QQVRJQkxFX0lPQ1RMKFBQUkRBVEEpCitDT01QQVRJQkxFX0lPQ1RMKFBQV0RBVEEpCiBDT01QQVRJQkxFX0lPQ1RMKFBQQ0xBSU0pCiBDT01QQVRJQkxFX0lPQ1RMKFBQUkVMRUFTRSkKLUNPTVBBVElCTEVfSU9DVEwoUFBFWENMKQogQ09NUEFUSUJMRV9JT0NUTChQUFlJRUxEKQorQ09NUEFUSUJMRV9JT0NUTChQUEVYQ0wpCitDT01QQVRJQkxFX0lPQ1RMKFBQREFUQURJUikKK0NPTVBBVElCTEVfSU9DVEwoUFBORUdPVCkKK0NPTVBBVElCTEVfSU9DVEwoUFBXQ1RMT05JUlEpCitDT01QQVRJQkxFX0lPQ1RMKFBQQ0xSSVJRKQorQ09NUEFUSUJMRV9JT0NUTChQUFNFVFBIQVNFKQorQ09NUEFUSUJMRV9JT0NUTChQUEdFVE1PREVTKQorQ09NUEFUSUJMRV9JT0NUTChQUEdFVE1PREUpCitDT01QQVRJQkxFX0lPQ1RMKFBQR0VUUEhBU0UpCitDT01QQVRJQkxFX0lPQ1RMKFBQR0VURkxBR1MpCitDT01QQVRJQkxFX0lPQ1RMKFBQU0VURkxBR1MpCiAvKiBDRFJPTSBzdHVmZiAqLwogQ09NUEFUSUJMRV9JT0NUTChDRFJPTVBBVVNFKQogQ09NUEFUSUJMRV9JT0NUTChDRFJPTVJFU1VNRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKaW5kZXggOTI3ZGFhOC4uZmY3ZjgwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiAJLyogb3B0aW9uYWwgKi8KIAlpbnQJKCpleGl0KQkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKLQlpbnQJKCpzdXNwZW5kKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHUzMiBzdGF0ZSk7CisJaW50CSgqc3VzcGVuZCkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBwbV9tZXNzYWdlX3QgcG1zZyk7CiAJaW50CSgqcmVzdW1lKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCXN0cnVjdCBmcmVxX2F0dHIJKiphdHRyOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmggYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCmluZGV4IDM4N2RhNmEuLjVlMmJjYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaApAQCAtNjEsNiArNjEsMTUgQEAKICNkZWZpbmUgQ1JZUFRPX0RJUl9ERUNSWVBUCQkwCiAKIHN0cnVjdCBzY2F0dGVybGlzdDsKK3N0cnVjdCBjcnlwdG9fdGZtOworCitzdHJ1Y3QgY2lwaGVyX2Rlc2MgeworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisJdm9pZCAoKmNyZm4pKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7CisJdW5zaWduZWQgaW50ICgqcHJmbikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqZHN0LAorCQkJICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKKwl2b2lkICppbmZvOworfTsKIAogLyoKICAqIEFsZ29yaXRobXM6IG1vZHVsYXIgY3J5cHRvIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMsIG1hbmFnZWQKQEAgLTczLDYgKzgyLDE5IEBACiAJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7CiAJdm9pZCAoKmNpYV9lbmNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwogCXZvaWQgKCpjaWFfZGVjcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKKworCXVuc2lnbmVkIGludCAoKmNpYV9lbmNyeXB0X2VjYikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKKwl1bnNpZ25lZCBpbnQgKCpjaWFfZGVjcnlwdF9lY2IpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKKwkJCQkJdW5zaWduZWQgaW50IG5ieXRlcyk7CisJdW5zaWduZWQgaW50ICgqY2lhX2VuY3J5cHRfY2JjKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpOworCXVuc2lnbmVkIGludCAoKmNpYV9kZWNyeXB0X2NiYykoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKIH07CiAKIHN0cnVjdCBkaWdlc3RfYWxnIHsKQEAgLTEwMiw2ICsxMjQsNyBAQAogCXUzMiBjcmFfZmxhZ3M7CiAJdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7CiAJdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOworCXVuc2lnbmVkIGludCBjcmFfYWxpZ25tYXNrOwogCWNvbnN0IGNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CiAKIAl1bmlvbiB7CkBAIC0xMzYsNyArMTU5LDYgQEAKICAqIGFuZCBjb3JlIHByb2Nlc3NpbmcgbG9naWMuICBNYW5hZ2VkIHZpYSBjcnlwdG9fYWxsb2NfdGZtKCkgYW5kCiAgKiBjcnlwdG9fZnJlZV90Zm0oKSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyBoZWxwZXJzIGJlbG93LgogICovCi1zdHJ1Y3QgY3J5cHRvX3RmbTsKIAogc3RydWN0IGNpcGhlcl90Zm0gewogCXZvaWQgKmNpdF9pdjsKQEAgLTI2Niw2ICsyODgsMTYgQEAKIAlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2FsaWdubWFzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fdGZtX2N0eChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiAodm9pZCAqKSZ0Zm1bMV07Cit9CisKIC8qCiAgKiBBUEkgd3JhcHBlcnMuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IGYzNzhjODQuLjA2ZTVkNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMjg0LDggKzI4NCwxMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXI7CS8qIHdoaWNoIGRyaXZlciBoYXMgYWxsb2NhdGVkIHRoaXMKIAkJCQkJICAgZGV2aWNlICovCiAJdm9pZAkJKmRyaXZlcl9kYXRhOwkvKiBkYXRhIHByaXZhdGUgdG8gdGhlIGRyaXZlciAqLwotCXZvaWQJCSpwbGF0Zm9ybV9kYXRhOwkvKiBQbGF0Zm9ybSBzcGVjaWZpYyBkYXRhIChlLmcuIEFDUEksCi0JCQkJCSAgIEJJT1MgZGF0YSByZWxldmFudCB0byBkZXZpY2UpICovCisJdm9pZAkJKnBsYXRmb3JtX2RhdGE7CS8qIFBsYXRmb3JtIHNwZWNpZmljIGRhdGEsIGRldmljZQorCQkJCQkgICBjb3JlIGRvZXNuJ3QgdG91Y2ggaXQgKi8KKwl2b2lkCQkqZmlybXdhcmVfZGF0YTsgLyogRmlybXdhcmUgc3BlY2lmaWMgZGF0YSAoZS5nLiBBQ1BJLAorCQkJCQkgICBCSU9TIGRhdGEpLHJlc2VydmVkIGZvciBkZXZpY2UgY29yZSovCiAJc3RydWN0IGRldl9wbV9pbmZvCXBvd2VyOwogCiAJdTY0CQkqZG1hX21hc2s7CS8qIGRtYSBtYXNrIChpZiBkbWEnYWJsZSBkZXZpY2UpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKaW5kZXggY2YzODQ3ZS4uY2U4NTE4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaApAQCAtMzMsNyArMzMsNyBAQAogCQkJCSAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLAogCQkJCSAgIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pOwogZXh0ZXJuIGludAkJZXRoX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0CWV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIF9fYmUxNgkJZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZAkJZXRoX2hlYWRlcl9jYWNoZV91cGRhdGUoc3RydWN0IGhoX2NhY2hlICpoaCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCXVuc2lnbmVkIGNoYXIgKiBoYWRkcik7CiBleHRlcm4gaW50CQlldGhfaGVhZGVyX2NhY2hlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAppbmRleCA0YjZlMWFiLi5jMTY2NjI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaApAQCAtMjM5LDYgKzIzOSwyMCBAQAogI2RlZmluZSBFWFQzX0lPQ19TRVRSU1ZTWgkJX0lPVygnZicsIDYsIGxvbmcpCiAKIC8qCisgKiAgTW91bnQgb3B0aW9ucworICovCitzdHJ1Y3QgZXh0M19tb3VudF9vcHRpb25zIHsKKwl1bnNpZ25lZCBsb25nIHNfbW91bnRfb3B0OworCXVpZF90IHNfcmVzdWlkOworCWdpZF90IHNfcmVzZ2lkOworCXVuc2lnbmVkIGxvbmcgc19jb21taXRfaW50ZXJ2YWw7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJaW50IHNfanF1b3RhX2ZtdDsKKwljaGFyICpzX3FmX25hbWVzW01BWFFVT1RBU107CisjZW5kaWYKK307CisKKy8qCiAgKiBTdHJ1Y3R1cmUgb2YgYW4gaW5vZGUgb24gdGhlIGRpc2sKICAqLwogc3RydWN0IGV4dDNfaW5vZGUgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYWR2aXNlLmggYi9pbmNsdWRlL2xpbnV4L2ZhZHZpc2UuaAppbmRleCA2ZmM2NTZkLi5lOGU3NDcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZhZHZpc2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZhZHZpc2UuaApAQCAtNSw3ICs1LDE3IEBACiAjZGVmaW5lIFBPU0lYX0ZBRFZfUkFORE9NCTEgLyogRXhwZWN0IHJhbmRvbSBwYWdlIHJlZmVyZW5jZXMuICAqLwogI2RlZmluZSBQT1NJWF9GQURWX1NFUVVFTlRJQUwJMiAvKiBFeHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMuICAqLwogI2RlZmluZSBQT1NJWF9GQURWX1dJTExORUVECTMgLyogV2lsbCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKworLyoKKyAqIFRoZSBhZHZpc2UgdmFsdWVzIGZvciBQT1NJWF9GQURWX0RPTlRORUVEIGFuZCBQT1NJWF9BRFZfTk9SRVVTRQorICogZm9yIHMzOTAtNjQgZGlmZmVyIGZyb20gdGhlIHZhbHVlcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHdvcmxkLgorICovCisjaWYgZGVmaW5lZChfX3MzOTB4X18pCisjZGVmaW5lIFBPU0lYX0ZBRFZfRE9OVE5FRUQJNiAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyNkZWZpbmUgUE9TSVhfRkFEVl9OT1JFVVNFCTcgLyogRGF0YSB3aWxsIGJlIGFjY2Vzc2VkIG9uY2UuICAqLworI2Vsc2UKICNkZWZpbmUgUE9TSVhfRkFEVl9ET05UTkVFRAk0IC8qIERvbid0IG5lZWQgdGhlc2UgcGFnZXMuICAqLwogI2RlZmluZSBQT1NJWF9GQURWX05PUkVVU0UJNSAvKiBEYXRhIHdpbGwgYmUgYWNjZXNzZWQgb25jZS4gICovCisjZW5kaWYKIAogI2VuZGlmCS8qIEZBRFZJU0VfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZGRpZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2ZkZGlkZXZpY2UuaAppbmRleCAwMDJmNjM2Li5lNjFlNDJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZkZGlkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZkZGlkZXZpY2UuaApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2ZkZGkuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KLWV4dGVybiB1bnNpZ25lZCBzaG9ydAlmZGRpX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2V4dGVybiBfX2JlMTYJZmRkaV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2ZkZGlkZXYoaW50IHNpemVvZl9wcml2KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDA0N2JkZTMuLjBmNTNlMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTQ3NCw2ICs0NzQsMTEgQEAKIAlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QJKmlfZG5vdGlmeTsgLyogZm9yIGRpcmVjdG9yeSBub3RpZmljYXRpb25zICovCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19JTk9USUZZCisJc3RydWN0IGxpc3RfaGVhZAlpbm90aWZ5X3dhdGNoZXM7IC8qIHdhdGNoZXMgb24gdGhpcyBpbm9kZSAqLworCXN0cnVjdCBzZW1hcGhvcmUJaW5vdGlmeV9zZW07CS8qIHByb3RlY3RzIHRoZSB3YXRjaGVzIGxpc3QgKi8KKyNlbmRpZgorCiAJdW5zaWduZWQgbG9uZwkJaV9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nCQlkaXJ0aWVkX3doZW47CS8qIGppZmZpZXMgb2YgZmlyc3QgZGlydHlpbmcgKi8KIApAQCAtMTM5Myw3ICsxMzk4LDYgQEAKIGV4dGVybiBpbnQgZG9fcmVtb3VudF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmxhZ3MsCiAJCQkgdm9pZCAqZGF0YSwgaW50IGZvcmNlKTsKIGV4dGVybiBzZWN0b3JfdCBibWFwKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCk7Ci1leHRlcm4gaW50IHNldGF0dHJfbWFzayh1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCBub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwogZXh0ZXJuIGludCBwZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CiBleHRlcm4gaW50IGdlbmVyaWNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LApAQCAtMTQzNSw3ICsxNDM5LDExIEBACiBleHRlcm4gaW5vX3QgaXVuaXF1ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QpOwogZXh0ZXJuIGludCBpbm9kZV9uZWVkc19zeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIHZvaWQgZ2VuZXJpY19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZCBnZW5lcmljX2Ryb3BfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmlsb29rdXA1X25vd2FpdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQl1bnNpZ25lZCBsb25nIGhhc2h2YWwsIGludCAoKnRlc3QpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopLAorCQl2b2lkICpkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmlsb29rdXA1KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCwKIAkJaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpOwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqaWxvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmggYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3YTkyYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZnNub3RpZnkuaApAQCAtMCwwICsxLDI0OCBAQAorI2lmbmRlZiBfTElOVVhfRlNfTk9USUZZX0gKKyNkZWZpbmUgX0xJTlVYX0ZTX05PVElGWV9ICisKKy8qCisgKiBpbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmggLSBnZW5lcmljIGhvb2tzIGZvciBmaWxlc3lzdGVtIG5vdGlmaWNhdGlvbiwgdG8KKyAqIHJlZHVjZSBpbi1zb3VyY2UgZHVwbGljYXRpb24gZnJvbSBib3RoIGRub3RpZnkgYW5kIGlub3RpZnkuCisgKgorICogV2UgZG9uJ3QgY29tcGlsZSBhbnkgb2YgdGhpcyBhd2F5IGluIHNvbWUgY29tcGxpY2F0ZWQgbWVuYWdlcmllIG9mIGlmZGVmcy4KKyAqIEluc3RlYWQsIHdlIHJlbHkgb24gdGhlIGNvZGUgaW5zaWRlIHRvIG9wdGltaXplIGF3YXkgYXMgbmVlZGVkLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNSBSb2JlcnQgTG92ZQorICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgorCisvKgorICogZnNub3RpZnlfbW92ZSAtIGZpbGUgb2xkX25hbWUgYXQgb2xkX2RpciB3YXMgbW92ZWQgdG8gbmV3X25hbWUgYXQgbmV3X2RpcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfbW92ZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBpbm9kZSAqbmV3X2RpciwKKwkJCQkgY29uc3QgY2hhciAqb2xkX25hbWUsIGNvbnN0IGNoYXIgKm5ld19uYW1lLAorCQkJCSBpbnQgaXNkaXIpCit7CisJdTMyIGNvb2tpZSA9IGlub3RpZnlfZ2V0X2Nvb2tpZSgpOworCisJaWYgKG9sZF9kaXIgPT0gbmV3X2RpcikKKwkJaW5vZGVfZGlyX25vdGlmeShvbGRfZGlyLCBETl9SRU5BTUUpOworCWVsc2UgeworCQlpbm9kZV9kaXJfbm90aWZ5KG9sZF9kaXIsIEROX0RFTEVURSk7CisJCWlub2RlX2Rpcl9ub3RpZnkobmV3X2RpciwgRE5fQ1JFQVRFKTsKKwl9CisKKwlpZiAoaXNkaXIpCisJCWlzZGlyID0gSU5fSVNESVI7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChvbGRfZGlyLCBJTl9NT1ZFRF9GUk9NfGlzZGlyLGNvb2tpZSxvbGRfbmFtZSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChuZXdfZGlyLCBJTl9NT1ZFRF9UT3xpc2RpciwgY29va2llLCBuZXdfbmFtZSk7Cit9CisKKy8qCisgKiBmc25vdGlmeV91bmxpbmsgLSBmaWxlIHdhcyB1bmxpbmtlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfdW5saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoZGlyLCBJTl9ERUxFVEUsIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIElOX0RFTEVURV9TRUxGLCAwLCBOVUxMKTsKKworCWlub3RpZnlfaW5vZGVfaXNfZGVhZChpbm9kZSk7Cit9CisKKy8qCisgKiBmc25vdGlmeV9ybWRpciAtIGRpcmVjdG9yeSB3YXMgcmVtb3ZlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfcm1kaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGlub2RlICpkaXIpCit7CisJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0RFTEVURSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChkaXIsSU5fREVMRVRFfElOX0lTRElSLDAsZGVudHJ5LT5kX25hbWUubmFtZSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgSU5fREVMRVRFX1NFTEYgfCBJTl9JU0RJUiwgMCwgTlVMTCk7CisJaW5vdGlmeV9pbm9kZV9pc19kZWFkKGlub2RlKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X2NyZWF0ZSAtICduYW1lJyB3YXMgbGlua2VkIGluCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9jcmVhdGUoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbm9kZV9kaXJfbm90aWZ5KGlub2RlLCBETl9DUkVBVEUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIElOX0NSRUFURSwgMCwgbmFtZSk7Cit9CisKKy8qCisgKiBmc25vdGlmeV9ta2RpciAtIGRpcmVjdG9yeSAnbmFtZScgd2FzIGNyZWF0ZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X21rZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW5vZGVfZGlyX25vdGlmeShpbm9kZSwgRE5fQ1JFQVRFKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBJTl9DUkVBVEUgfCBJTl9JU0RJUiwgMCwgbmFtZSk7Cit9CisKKy8qCisgKiBmc25vdGlmeV9hY2Nlc3MgLSBmaWxlIHdhcyByZWFkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9hY2Nlc3Moc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdTMyIG1hc2sgPSBJTl9BQ0NFU1M7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbWFzayB8PSBJTl9JU0RJUjsKKworCWRub3RpZnlfcGFyZW50KGRlbnRyeSwgRE5fQUNDRVNTKTsKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X21vZGlmeSAtIGZpbGUgd2FzIG1vZGlmaWVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9tb2RpZnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdTMyIG1hc2sgPSBJTl9NT0RJRlk7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbWFzayB8PSBJTl9JU0RJUjsKKworCWRub3RpZnlfcGFyZW50KGRlbnRyeSwgRE5fTU9ESUZZKTsKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X29wZW4gLSBmaWxlIHdhcyBvcGVuZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X29wZW4oc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdTMyIG1hc2sgPSBJTl9PUEVOOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCW1hc2sgfD0gSU5fSVNESVI7CisKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsJCit9CisKKy8qCisgKiBmc25vdGlmeV9jbG9zZSAtIGZpbGUgd2FzIGNsb3NlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwltb2RlX3QgbW9kZSA9IGZpbGUtPmZfbW9kZTsKKwl1MzIgbWFzayA9IChtb2RlICYgRk1PREVfV1JJVEUpID8gSU5fQ0xPU0VfV1JJVEUgOiBJTl9DTE9TRV9OT1dSSVRFOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCW1hc2sgfD0gSU5fSVNESVI7CisKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBuYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X3hhdHRyIC0gZXh0ZW5kZWQgYXR0cmlidXRlcyB3ZXJlIGNoYW5nZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X3hhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXUzMiBtYXNrID0gSU5fQVRUUklCOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCW1hc2sgfD0gSU5fSVNESVI7CisKKwlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X2NoYW5nZSAtIG5vdGlmeV9jaGFuZ2UgZXZlbnQuICBmaWxlIHdhcyBtb2RpZmllZCBhbmQvb3IgbWV0YWRhdGEKKyAqIHdhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdW5zaWduZWQgaW50IGlhX3ZhbGlkKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGRuX21hc2sgPSAwOworCXUzMiBpbl9tYXNrID0gMDsKKworCWlmIChpYV92YWxpZCAmIEFUVFJfVUlEKSB7CisJCWluX21hc2sgfD0gSU5fQVRUUklCOworCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9HSUQpIHsKKwkJaW5fbWFzayB8PSBJTl9BVFRSSUI7CisJCWRuX21hc2sgfD0gRE5fQVRUUklCOworCX0KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaW5fbWFzayB8PSBJTl9NT0RJRlk7CisJCWRuX21hc2sgfD0gRE5fTU9ESUZZOworCX0KKwkvKiBib3RoIHRpbWVzIGltcGxpZXMgYSB1dGltZShzKSBjYWxsICovCisJaWYgKChpYV92YWxpZCAmIChBVFRSX0FUSU1FIHwgQVRUUl9NVElNRSkpID09IChBVFRSX0FUSU1FIHwgQVRUUl9NVElNRSkpCisJeworCQlpbl9tYXNrIHw9IElOX0FUVFJJQjsKKwkJZG5fbWFzayB8PSBETl9BVFRSSUI7CisJfSBlbHNlIGlmIChpYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJaW5fbWFzayB8PSBJTl9BQ0NFU1M7CisJCWRuX21hc2sgfD0gRE5fQUNDRVNTOworCX0gZWxzZSBpZiAoaWFfdmFsaWQgJiBBVFRSX01USU1FKSB7CisJCWluX21hc2sgfD0gSU5fTU9ESUZZOworCQlkbl9tYXNrIHw9IEROX01PRElGWTsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCWluX21hc2sgfD0gSU5fQVRUUklCOworCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwl9CisKKwlpZiAoZG5fbWFzaykKKwkJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBkbl9tYXNrKTsKKwlpZiAoaW5fbWFzaykgeworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCWluX21hc2sgfD0gSU5fSVNESVI7CisJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIGluX21hc2ssIDAsIE5VTEwpOworCQlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBpbl9tYXNrLCAwLAorCQkJCQkJICBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfSU5PVElGWQkvKiBpbm90aWZ5IGhlbHBlcnMgKi8KKworLyoKKyAqIGZzbm90aWZ5X29sZG5hbWVfaW5pdCAtIHNhdmUgb2ZmIHRoZSBvbGQgZmlsZW5hbWUgYmVmb3JlIHdlIGNoYW5nZSBpdAorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZzbm90aWZ5X29sZG5hbWVfaW5pdChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworfQorCisvKgorICogZnNub3RpZnlfb2xkbmFtZV9mcmVlIC0gZnJlZSB0aGUgbmFtZSB3ZSBnb3QgZnJvbSBmc25vdGlmeV9vbGRuYW1lX2luaXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X29sZG5hbWVfZnJlZShjb25zdCBjaGFyICpvbGRfbmFtZSkKK3sKKwlrZnJlZShvbGRfbmFtZSk7Cit9CisKKyNlbHNlCS8qIENPTkZJR19JTk9USUZZICovCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZnNub3RpZnlfb2xkbmFtZV9pbml0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9vbGRuYW1lX2ZyZWUoY29uc3QgY2hhciAqb2xkX25hbWUpCit7Cit9CisKKyNlbmRpZgkvKiAhIENPTkZJR19JTk9USUZZICovCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfTElOVVhfRlNfTk9USUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oCmluZGV4IDhkNmJmNjAuLjdjNzQwMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtMTIsOCArMTIsOCBAQAogICogR0ZQIGJpdG1hc2tzLi4KICAqLwogLyogWm9uZSBtb2RpZmllcnMgaW4gR0ZQX1pPTkVNQVNLIChzZWUgbGludXgvbW16b25lLmggLSBsb3cgdHdvIGJpdHMpICovCi0jZGVmaW5lIF9fR0ZQX0RNQQkweDAxCi0jZGVmaW5lIF9fR0ZQX0hJR0hNRU0JMHgwMgorI2RlZmluZSBfX0dGUF9ETUEJMHgwMXUKKyNkZWZpbmUgX19HRlBfSElHSE1FTQkweDAydQogCiAvKgogICogQWN0aW9uIG1vZGlmaWVycyAtIGRvZXNuJ3QgY2hhbmdlIHRoZSB6b25pbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oIGIvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKaW5kZXggODMzNmRiYS4uNTkxMjg3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIExJTlVYX0hBUkRJUlFfSAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hkbGMuaCBiL2luY2x1ZGUvbGludXgvaGRsYy5oCmluZGV4IGVkMjkyN2UuLmRmNjk1ZTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hkbGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hkbGMuaApAQCAtMjQyLDggKzI0Miw4IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaGRsY190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBfX2lubGluZV9fIF9fYmUxNiBoZGxjX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3NoYXBlci5oIGIvaW5jbHVkZS9saW51eC9pZl9zaGFwZXIuaAppbmRleCAwMDRlNmYwLi42OGM4OTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3NoYXBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfc2hhcGVyLmgKQEAgLTIzLDcgKzIzLDcgQEAKIAlfX3UzMiBzaGFwZWNsb2NrOwogCXVuc2lnbmVkIGxvbmcgcmVjb3Zlcnk7CS8qIFRpbWUgd2UgY2FuIG5leHQgY2xvY2sgYSBwYWNrZXQgb3V0IG9uCiAJCQkJICAgYW4gZW1wdHkgcXVldWUgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKwlzcGlubG9ja190IGxvY2s7CiAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50ICAoKmhhcmRfc3RhcnRfeG1pdCkgKHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL2luY2x1ZGUvbGludXgvaWdtcC5oCmluZGV4IDM5MGU3NjAuLjBjMzFlZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWdtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWdtcC5oCkBAIC0xNDgsNyArMTQ4LDYgQEAKIHN0cnVjdCBpcF9tY19zb2NrbGlzdAogewogCXN0cnVjdCBpcF9tY19zb2NrbGlzdAkqbmV4dDsKLQlpbnQJCQljb3VudDsKIAlzdHJ1Y3QgaXBfbXJlcW4JCW11bHRpOwogCXVuc2lnbmVkIGludAkJc2Ztb2RlOwkJLyogTUNBU1Rfe0lOQ0xVREUsRVhDTFVERX0gKi8KIAlzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QJKnNmbGlzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oIGIvaW5jbHVkZS9saW51eC9pbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwYzJiZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogSW5vZGUgYmFzZWQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSm9obiBNY0N1dGNoYW4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JTk9USUZZX0gKKyNkZWZpbmUgX0xJTlVYX0lOT1RJRllfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIHN0cnVjdCBpbm90aWZ5X2V2ZW50IC0gc3RydWN0dXJlIHJlYWQgZnJvbSB0aGUgaW5vdGlmeSBkZXZpY2UgZm9yIGVhY2ggZXZlbnQKKyAqCisgKiBXaGVuIHlvdSBhcmUgd2F0Y2hpbmcgYSBkaXJlY3RvcnksIHlvdSB3aWxsIHJlY2VpdmUgdGhlIGZpbGVuYW1lIGZvciBldmVudHMKKyAqIHN1Y2ggYXMgSU5fQ1JFQVRFLCBJTl9ERUxFVEUsIElOX09QRU4sIElOX0NMT1NFLCAuLi4sIHJlbGF0aXZlIHRvIHRoZSB3ZC4KKyAqLworc3RydWN0IGlub3RpZnlfZXZlbnQgeworCV9fczMyCQl3ZDsJCS8qIHdhdGNoIGRlc2NyaXB0b3IgKi8KKwlfX3UzMgkJbWFzazsJCS8qIHdhdGNoIG1hc2sgKi8KKwlfX3UzMgkJY29va2llOwkJLyogY29va2llIHRvIHN5bmNocm9uaXplIHR3byBldmVudHMgKi8KKwlfX3UzMgkJbGVuOwkJLyogbGVuZ3RoIChpbmNsdWRpbmcgbnVsbHMpIG9mIG5hbWUgKi8KKwljaGFyCQluYW1lWzBdOwkvKiBzdHViIGZvciBwb3NzaWJsZSBuYW1lICovCit9OworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCwgaW1wbGVtZW50ZWQgZXZlbnRzIHRoYXQgdXNlci1zcGFjZSBjYW4gd2F0Y2ggZm9yICovCisjZGVmaW5lIElOX0FDQ0VTUwkJMHgwMDAwMDAwMQkvKiBGaWxlIHdhcyBhY2Nlc3NlZCAqLworI2RlZmluZSBJTl9NT0RJRlkJCTB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQgKi8KKyNkZWZpbmUgSU5fQVRUUklCCQkweDAwMDAwMDA0CS8qIE1ldGFkYXRhIGNoYW5nZWQgKi8KKyNkZWZpbmUgSU5fQ0xPU0VfV1JJVEUJCTB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZCAqLworI2RlZmluZSBJTl9DTE9TRV9OT1dSSVRFCTB4MDAwMDAwMTAJLyogVW53cml0dGFibGUgZmlsZSBjbG9zZWQgKi8KKyNkZWZpbmUgSU5fT1BFTgkJCTB4MDAwMDAwMjAJLyogRmlsZSB3YXMgb3BlbmVkICovCisjZGVmaW5lIElOX01PVkVEX0ZST00JCTB4MDAwMDAwNDAJLyogRmlsZSB3YXMgbW92ZWQgZnJvbSBYICovCisjZGVmaW5lIElOX01PVkVEX1RPCQkweDAwMDAwMDgwCS8qIEZpbGUgd2FzIG1vdmVkIHRvIFkgKi8KKyNkZWZpbmUgSU5fQ1JFQVRFCQkweDAwMDAwMTAwCS8qIFN1YmZpbGUgd2FzIGNyZWF0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFCQkweDAwMDAwMjAwCS8qIFN1YmZpbGUgd2FzIGRlbGV0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFX1NFTEYJCTB4MDAwMDA0MDAJLyogU2VsZiB3YXMgZGVsZXRlZCAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCBldmVudHMuICB0aGV5IGFyZSBzZW50IGFzIG5lZWRlZCB0byBhbnkgd2F0Y2ggKi8KKyNkZWZpbmUgSU5fVU5NT1VOVAkJMHgwMDAwMjAwMAkvKiBCYWNraW5nIGZzIHdhcyB1bm1vdW50ZWQgKi8KKyNkZWZpbmUgSU5fUV9PVkVSRkxPVwkJMHgwMDAwNDAwMAkvKiBFdmVudCBxdWV1ZWQgb3ZlcmZsb3dlZCAqLworI2RlZmluZSBJTl9JR05PUkVECQkweDAwMDA4MDAwCS8qIEZpbGUgd2FzIGlnbm9yZWQgKi8KKworLyogaGVscGVyIGV2ZW50cyAqLworI2RlZmluZSBJTl9DTE9TRQkJKElOX0NMT1NFX1dSSVRFIHwgSU5fQ0xPU0VfTk9XUklURSkgLyogY2xvc2UgKi8KKyNkZWZpbmUgSU5fTU9WRQkJCShJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pIC8qIG1vdmVzICovCisKKy8qIHNwZWNpYWwgZmxhZ3MgKi8KKyNkZWZpbmUgSU5fSVNESVIJCTB4NDAwMDAwMDAJLyogZXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIgKi8KKyNkZWZpbmUgSU5fT05FU0hPVAkJMHg4MDAwMDAwMAkvKiBvbmx5IHNlbmQgZXZlbnQgb25jZSAqLworCisvKgorICogQWxsIG9mIHRoZSBldmVudHMgLSB3ZSBidWlsZCB0aGUgbGlzdCBieSBoYW5kIHNvIHRoYXQgd2UgY2FuIGFkZCBmbGFncyBpbgorICogdGhlIGZ1dHVyZSBhbmQgbm90IGJyZWFrIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBBcHBzIHdpbGwgZ2V0IG9ubHkgdGhlCisgKiBldmVudHMgdGhhdCB0aGV5IG9yaWdpbmFsbHkgd2FudGVkLiAgQmUgc3VyZSB0byBhZGQgbmV3IGV2ZW50cyBoZXJlIQorICovCisjZGVmaW5lIElOX0FMTF9FVkVOVFMJKElOX0FDQ0VTUyB8IElOX01PRElGWSB8IElOX0FUVFJJQiB8IElOX0NMT1NFX1dSSVRFIHwgXAorCQkJIElOX0NMT1NFX05PV1JJVEUgfCBJTl9PUEVOIHwgSU5fTU9WRURfRlJPTSB8IFwKKwkJCSBJTl9NT1ZFRF9UTyB8IElOX0RFTEVURSB8IElOX0NSRUFURSB8IElOX0RFTEVURV9TRUxGKQorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19JTk9USUZZCisKK2V4dGVybiB2b2lkIGlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoc3RydWN0IGlub2RlICosIF9fdTMyLCBfX3UzMiwKKwkJCQkgICAgICBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KHN0cnVjdCBkZW50cnkgKiwgX191MzIsIF9fdTMyLAorCQkJCQkgICAgICBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV91bm1vdW50X2lub2RlcyhzdHJ1Y3QgbGlzdF9oZWFkICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV9pbm9kZV9pc19kZWFkKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB1MzIgaW5vdGlmeV9nZXRfY29va2llKHZvaWQpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIF9fdTMyIG1hc2ssIF9fdTMyIGNvb2tpZSwKKwkJCQkJICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCQkgICAgIF9fdTMyIG1hc2ssIF9fdTMyIGNvb2tpZSwKKwkJCQkJCSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm90aWZ5X3VubW91bnRfaW5vZGVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm90aWZ5X2lub2RlX2lzX2RlYWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKK30KKworc3RhdGljIGlubGluZSB1MzIgaW5vdGlmeV9nZXRfY29va2llKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSU5PVElGWSAqLworCisjZW5kaWYJLyogX19LRVJORUwgX18gKi8KKworI2VuZGlmCS8qIF9MSU5VWF9JTk9USUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wcmlvLmggYi9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCmluZGV4IDhhNDUzYTAuLjg4ZDU5NjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9wcmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3ByaW8uaApAQCAtMzQsOSArMzQsNiBAQAogICovCiAjZGVmaW5lIElPUFJJT19CRV9OUgkoOCkKIAotYXNtbGlua2FnZSBpbnQgc3lzX2lvcHJpb19zZXQoaW50LCBpbnQsIGludCk7Ci1hc21saW5rYWdlIGludCBzeXNfaW9wcmlvX2dldChpbnQsIGludCk7Ci0KIGVudW0gewogCUlPUFJJT19XSE9fUFJPQ0VTUyA9IDEsCiAJSU9QUklPX1dIT19QR1JQLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qZmZzMl9mc19zYi5oIGIvaW5jbHVkZS9saW51eC9qZmZzMl9mc19zYi5oCmluZGV4IDRhZmM4ZDguLjFlMjE1NDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamZmczJfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2pmZnMyX2ZzX3NiLmgKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IGpmZnMyX2ZzX3NiLmgsdiAxLjQ4IDIwMDQvMTEvMjAgMTA6NDE6MTIgZHdtdzIgRXhwICQgKi8KKy8qICRJZDogamZmczJfZnNfc2IuaCx2IDEuNTIgMjAwNS8wNS8xOSAxNjoxMjoxNyBnbGVpeG5lciBFeHAgJCAqLwogCiAjaWZuZGVmIF9KRkZTMl9GU19TQgogI2RlZmluZSBfSkZGUzJfRlNfU0IKQEAgLTE0LDcgKzE0LDggQEAKICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogCiAjZGVmaW5lIEpGRlMyX1NCX0ZMQUdfUk8gMQotI2RlZmluZSBKRkZTMl9TQl9GTEFHX01PVU5USU5HIDIKKyNkZWZpbmUgSkZGUzJfU0JfRkxBR19TQ0FOTklORyAyIC8qIEZsYXNoIHNjYW5uaW5nIGlzIGluIHByb2dyZXNzICovCisjZGVmaW5lIEpGRlMyX1NCX0ZMQUdfQlVJTERJTkcgNCAvKiBGaWxlIHN5c3RlbSBidWlsZGluZyBpcyBpbiBwcm9ncmVzcyAqLwogCiBzdHJ1Y3QgamZmczJfaW5vZGlydHk7CiAKQEAgLTMxLDcgKzMyLDcgQEAKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmdjX3Rhc2s7CS8qIEdDIHRhc2sgc3RydWN0ICovCi0Jc3RydWN0IHNlbWFwaG9yZSBnY190aHJlYWRfc3RhcnQ7IC8qIEdDIHRocmVhZCBzdGFydCBtdXRleCAqLworCXN0cnVjdCBjb21wbGV0aW9uIGdjX3RocmVhZF9zdGFydDsgLyogR0MgdGhyZWFkIHN0YXJ0IGNvbXBsZXRpb24gKi8KIAlzdHJ1Y3QgY29tcGxldGlvbiBnY190aHJlYWRfZXhpdDsgLyogR0MgdGhyZWFkIGV4aXQgY29tcGxldGlvbiBwb3J0ICovCiAKIAlzdHJ1Y3Qgc2VtYXBob3JlIGFsbG9jX3NlbTsJLyogVXNlZCB0byBwcm90ZWN0IGFsbCB0aGUgZm9sbG93aW5nIApAQCAtOTQsNyArOTUsNyBAQAogCSAgIHRvIGFuIG9ic29sZXRlZCBub2RlLiBJIGRvbid0IGxpa2UgdGhpcy4gQWx0ZXJuYXRpdmVzIHdlbGNvbWVkLiAqLwogCXN0cnVjdCBzZW1hcGhvcmUgZXJhc2VfZnJlZV9zZW07CiAKLSNpZiBkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OQU5EIHx8IGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAkvKiBXcml0ZS1iZWhpbmQgYnVmZmVyIGZvciBOQU5EIGZsYXNoICovCiAJdW5zaWduZWQgY2hhciAqd2J1ZjsKIAl1aW50MzJfdCB3YnVmX29mczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKaW5kZXggYjdhMTk0Yy4uZTA1MGZjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKQEAgLTE1NSw3ICsxNTUsNyBAQAogZXh0ZXJuIHZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogZXh0ZXJuIHZvaWQgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogZXh0ZXJuIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwotZXh0ZXJuIGludCBhcmNoX2luaXQodm9pZCk7CitleHRlcm4gaW50IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGtwcm9iZV9vcGNvZGVfdCAqZ2V0X2luc25fc2xvdCh2b2lkKTsKIGV4dGVybiB2b2lkIGZyZWVfaW5zbl9zbG90KGtwcm9iZV9vcGNvZGVfdCAqc2xvdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaAppbmRleCA5YjZkMDUxLi5kY2U1M2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKQEAgLTE3NCw2ICsxNzQsMTcgQEAKIAlfX3U4IHByb3RvOwogfTsKIAorLyoKKyAqIFN0cnVjdCB1c2VkIGZvciBtYXRjaGluZyBhIGRldmljZQorICovCitzdHJ1Y3Qgb2ZfZGV2aWNlX2lkCit7CisJY2hhcgluYW1lWzMyXTsKKwljaGFyCXR5cGVbMzJdOworCWNoYXIJY29tcGF0aWJsZVsxMjhdOworCXZvaWQJKmRhdGE7Cit9OworCiAKIC8qIFBDTUNJQSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vdW50LmggYi9pbmNsdWRlL2xpbnV4L21vdW50LmgKaW5kZXggOGI4ZDNiOS4uZjhmMzk5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb3VudC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW91bnQuaApAQCAtMTIsNiArMTIsNyBAQAogI2RlZmluZSBfTElOVVhfTU9VTlRfSAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtMzQsNyArMzUsNyBAQAogCWludCBtbnRfZXhwaXJ5X21hcms7CQkvKiB0cnVlIGlmIG1hcmtlZCBmb3IgZXhwaXJ5ICovCiAJY2hhciAqbW50X2Rldm5hbWU7CQkvKiBOYW1lIG9mIGRldmljZSBlLmcuIC9kZXYvZHNrL2hkYTEgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1udF9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgbW50X2ZzbGluazsJLyogbGluayBpbiBmcy1zcGVjaWZpYyBleHBpcnkgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbW50X2V4cGlyZTsJLyogbGluayBpbiBmcy1zcGVjaWZpYyBleHBpcnkgbGlzdCAqLwogCXN0cnVjdCBuYW1lc3BhY2UgKm1udF9uYW1lc3BhY2U7IC8qIGNvbnRhaW5pbmcgbmFtZXNwYWNlICovCiB9OwogCkBAIC00Nyw3ICs0OCw3IEBACiAKIGV4dGVybiB2b2lkIF9fbW50cHV0KHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9tbnRwdXQoc3RydWN0IHZmc21vdW50ICptbnQpCitzdGF0aWMgaW5saW5lIHZvaWQgbW50cHV0X25vX2V4cGlyZShzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKIAlpZiAobW50KSB7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtbnQtPm1udF9jb3VudCkpCkBAIC01OSw3ICs2MCw3IEBACiB7CiAJaWYgKG1udCkgewogCQltbnQtPm1udF9leHBpcnlfbWFyayA9IDA7Ci0JCV9tbnRwdXQobW50KTsKKwkJbW50cHV0X25vX2V4cGlyZShtbnQpOwogCX0KIH0KIApAQCAtNzYsNiArNzcsNyBAQAogZXh0ZXJuIHZvaWQgbWFya19tb3VudHNfZm9yX2V4cGlyeShzdHJ1Y3QgbGlzdF9oZWFkICptb3VudHMpOwogCiBleHRlcm4gc3BpbmxvY2tfdCB2ZnNtb3VudF9sb2NrOworZXh0ZXJuIGRldl90IG5hbWVfdG9fZGV2X3QoY2hhciAqbmFtZSk7CiAKICNlbmRpZgogI2VuZGlmIC8qIF9MSU5VWF9NT1VOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9jZmkuaCBiL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCmluZGV4IDJlZDhjNTguLmU2YjZhMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCkBAIC0xLDcgKzEsNyBAQAogCiAvKiBDb21tb24gRmxhc2ggSW50ZXJmYWNlIHN0cnVjdHVyZXMgCiAgKiBTZWUgaHR0cDovL3N1cHBvcnQuaW50ZWwuY29tL2Rlc2lnbi9mbGFzaC90ZWNobm90ZS9pbmRleC5odG0KLSAqICRJZDogY2ZpLmgsdiAxLjUwIDIwMDQvMTEvMjAgMTI6NDY6NTEgZHdtdzIgRXhwICQKKyAqICRJZDogY2ZpLmgsdiAxLjU0IDIwMDUvMDYvMDYgMjM6MDQ6MzYgdHBveW5vciBFeHAgJAogICovCiAKICNpZm5kZWYgX19NVERfQ0ZJX0hfXwpAQCAtMTQ4LDYgKzE0OCwxNCBAQAogCXVpbnQ4X3QgIGV4dHJhWzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAorc3RydWN0IGNmaV9pbnRlbGV4dF9vdHBpbmZvIHsKKwl1aW50MzJfdCBQcm90UmVnQWRkcjsKKwl1aW50MTZfdCBGYWN0R3JvdXBzOworCXVpbnQ4X3QgIEZhY3RQcm90UmVnU2l6ZTsKKwl1aW50MTZfdCBVc2VyR3JvdXBzOworCXVpbnQ4X3QgIFVzZXJQcm90UmVnU2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKIHN0cnVjdCBjZmlfaW50ZWxleHRfYmxvY2tpbmZvIHsKIAl1aW50MTZfdCBOdW1JZGVudEJsb2NrczsKIAl1aW50MTZfdCBCbG9ja1NpemU7CkBAIC0yNDQsNyArMjUyLDcgQEAKICAqIEl0IGxvb2tzIHRvbyBsb25nIHRvIGJlIGlubGluZSwgYnV0IGluIHRoZSBjb21tb24gY2FzZSBpdCBzaG91bGQgYWxtb3N0IGFsbAogICogZ2V0IG9wdGltaXNlZCBhd2F5LiAKICAqLwotc3RhdGljIGlubGluZSBtYXBfd29yZCBjZmlfYnVpbGRfY21kKHVfY2hhciBjbWQsIHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSkKK3N0YXRpYyBpbmxpbmUgbWFwX3dvcmQgY2ZpX2J1aWxkX2NtZCh1X2xvbmcgY21kLCBzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGNmaV9wcml2YXRlICpjZmkpCiB7CiAJbWFwX3dvcmQgdmFsID0geyB7MH0gfTsKIAlpbnQgd29yZHdpZHRoLCB3b3Jkc19wZXJfYnVzLCBjaGlwX21vZGUsIGNoaXBzX3Blcl93b3JkOwpAQCAtMzA3LDYgKzMxNSw2OSBAQAogfQogI2RlZmluZSBDTUQoeCkgIGNmaV9idWlsZF9jbWQoKHgpLCBtYXAsIGNmaSkKIAorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgY2ZpX21lcmdlX3N0YXR1cyhtYXBfd29yZCB2YWwsIHN0cnVjdCBtYXBfaW5mbyAqbWFwLCAKKwkJCQkJICAgc3RydWN0IGNmaV9wcml2YXRlICpjZmkpCit7CisJaW50IHdvcmR3aWR0aCwgd29yZHNfcGVyX2J1cywgY2hpcF9tb2RlLCBjaGlwc19wZXJfd29yZDsKKwl1bnNpZ25lZCBsb25nIG9uZXN0YXQsIHJlcyA9IDA7CisJaW50IGk7CisKKwkvKiBXZSBkbyBpdCB0aGlzIHdheSB0byBnaXZlIHRoZSBjb21waWxlciBhIGZpZ2h0aW5nIGNoYW5jZSAKKwkgICBvZiBvcHRpbWlzaW5nIGF3YXkgYWxsIHRoZSBjcmFwIGZvciAnYmFua3dpZHRoJyBsYXJnZXIgdGhhbgorCSAgIGFuIHVuc2lnbmVkIGxvbmcsIGluIHRoZSBjb21tb24gY2FzZSB3aGVyZSB0aGF0IHN1cHBvcnQgaXMKKwkgICBkaXNhYmxlZCAqLworCWlmIChtYXBfYmFua3dpZHRoX2lzX2xhcmdlKG1hcCkpIHsKKwkJd29yZHdpZHRoID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQl3b3Jkc19wZXJfYnVzID0gKG1hcF9iYW5rd2lkdGgobWFwKSkgLyB3b3Jkd2lkdGg7IC8vIGkuZS4gbm9ybWFsbHkgMQorCX0gZWxzZSB7CisJCXdvcmR3aWR0aCA9IG1hcF9iYW5rd2lkdGgobWFwKTsKKwkJd29yZHNfcGVyX2J1cyA9IDE7CisJfQorCQorCWNoaXBfbW9kZSA9IG1hcF9iYW5rd2lkdGgobWFwKSAvIGNmaV9pbnRlcmxlYXZlKGNmaSk7CisJY2hpcHNfcGVyX3dvcmQgPSB3b3Jkd2lkdGggKiBjZmlfaW50ZXJsZWF2ZShjZmkpIC8gbWFwX2Jhbmt3aWR0aChtYXApOworCisJb25lc3RhdCA9IHZhbC54WzBdOworCS8qIE9yIGFsbCBzdGF0dXMgd29yZHMgdG9nZXRoZXIgKi8KKwlmb3IgKGk9MTsgaSA8IHdvcmRzX3Blcl9idXM7IGkrKykgeworCQlvbmVzdGF0IHw9IHZhbC54W2ldOworCX0KKworCXJlcyA9IG9uZXN0YXQ7CisJc3dpdGNoKGNoaXBzX3Blcl93b3JkKSB7CisJZGVmYXVsdDogQlVHKCk7CisjaWYgQklUU19QRVJfTE9ORyA+PSA2NAorCWNhc2UgODoKKwkJcmVzIHw9IChvbmVzdGF0ID4+IChjaGlwX21vZGUgKiAzMikpOworI2VuZGlmCisJY2FzZSA0OgorCQlyZXMgfD0gKG9uZXN0YXQgPj4gKGNoaXBfbW9kZSAqIDE2KSk7CisJY2FzZSAyOgorCQlyZXMgfD0gKG9uZXN0YXQgPj4gKGNoaXBfbW9kZSAqIDgpKTsKKwljYXNlIDE6CisJCTsKKwl9CisKKwkvKiBMYXN0LCBkZXRlcm1pbmUgd2hhdCB0aGUgYml0LXBhdHRlcm4gc2hvdWxkIGJlIGZvciBhIHNpbmdsZQorCSAgIGRldmljZSwgYWNjb3JkaW5nIHRvIGNoaXAgbW9kZSBhbmQgZW5kaWFubmVzcy4uLiAqLworCXN3aXRjaCAoY2hpcF9tb2RlKSB7CisJY2FzZSAxOgorCQlicmVhazsKKwljYXNlIDI6CisJCXJlcyA9IGNmaTE2X3RvX2NwdShyZXMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXJlcyA9IGNmaTMyX3RvX2NwdShyZXMpOworCQlicmVhazsKKwlkZWZhdWx0OiBCVUcoKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworI2RlZmluZSBNRVJHRVNUQVRVUyh4KSBjZmlfbWVyZ2Vfc3RhdHVzKCh4KSwgbWFwLCBjZmkpCisKKwogLyoKICAqIFNlbmRzIGEgQ0ZJIGNvbW1hbmQgdG8gYSBiYW5rIG9mIGZsYXNoIGZvciB0aGUgZ2l2ZW4gZ2VvbWV0cnkuCiAgKgpAQCAtMzU3LDE2ICs0MjgsNiBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNmaV9zcGluX2xvY2soc3BpbmxvY2tfdCAqbXV0ZXgpCi17Ci0Jc3Bpbl9sb2NrX2JoKG11dGV4KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNmaV9zcGluX3VubG9jayhzcGlubG9ja190ICptdXRleCkKLXsKLQlzcGluX3VubG9ja19iaChtdXRleCk7Ci19Ci0KIHN0cnVjdCBjZmlfZXh0cXVlcnkgKmNmaV9yZWFkX3ByaShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdWludDE2X3QgYWRyLCB1aW50MTZfdCBzaXplLAogCQkJICAgICBjb25zdCBjaGFyKiBuYW1lKTsKIHN0cnVjdCBjZmlfZml4dXAgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvZmxhc2hjaGlwLmggYi9pbmNsdWRlL2xpbnV4L210ZC9mbGFzaGNoaXAuaAppbmRleCBjNjZiYTgxLi42NzU3NzZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9mbGFzaGNoaXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9mbGFzaGNoaXAuaApAQCAtNiw3ICs2LDcgQEAKICAqCiAgKiAoQykgMjAwMCBSZWQgSGF0LiBHUExkLgogICoKLSAqICRJZDogZmxhc2hjaGlwLmgsdiAxLjE1IDIwMDQvMTEvMDUgMjI6NDE6MDYgbmljbyBFeHAgJAorICogJElkOiBmbGFzaGNoaXAuaCx2IDEuMTcgMjAwNS8wMy8xNCAxODoyNzoxNSBiamQgRXhwICQKICAqCiAgKi8KIApAQCAtMjksNiArMjksNyBAQAogCUZMX0VSQVNFX1NVU1BFTkRFRCwKIAlGTF9XUklUSU5HLAogCUZMX1dSSVRJTkdfVE9fQlVGRkVSLAorCUZMX09UUF9XUklURSwKIAlGTF9XUklURV9TVVNQRU5ESU5HLAogCUZMX1dSSVRFX1NVU1BFTkRFRCwKIAlGTF9QTV9TVVNQRU5ERUQsCkBAIC02Miw4ICs2Myw4IEBACiAJZmxzdGF0ZV90IHN0YXRlOwogCWZsc3RhdGVfdCBvbGRzdGF0ZTsKIAotCWludCB3cml0ZV9zdXNwZW5kZWQ6MTsKLQlpbnQgZXJhc2Vfc3VzcGVuZGVkOjE7CisJdW5zaWduZWQgaW50IHdyaXRlX3N1c3BlbmRlZDoxOworCXVuc2lnbmVkIGludCBlcmFzZV9zdXNwZW5kZWQ6MTsKIAl1bnNpZ25lZCBsb25nIGluX3Byb2dyZXNzX2Jsb2NrX2FkZHI7CiAKIAlzcGlubG9ja190ICptdXRleDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2luZnRsLmggYi9pbmNsdWRlL2xpbnV4L210ZC9pbmZ0bC5oCmluZGV4IGI1MmM4Y2IuLjAyNjgxMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2luZnRsLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvaW5mdGwuaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKgkoQykgQ29weXJpZ2h0IDIwMDIsIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCiAgKgotICoJJElkOiBpbmZ0bC5oLHYgMS42IDIwMDQvMDYvMzAgMTQ6NDk6MDAgZGJyb3duIEV4cCAkCisgKgkkSWQ6IGluZnRsLmgsdiAxLjcgMjAwNS8wNi8xMyAxMzowODo0NSBzZWFuIEV4cCAkCiAgKi8KIAogI2lmbmRlZiBfX01URF9JTkZUTF9IX18KQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxtdGQvaW5mdGwtdXNlci5oPgogCiAjaWZuZGVmIElORlRMX01BSk9SCi0jZGVmaW5lIElORlRMX01BSk9SIDk0CisjZGVmaW5lIElORlRMX01BSk9SIDk2CiAjZW5kaWYKICNkZWZpbmUgSU5GVExfUEFSVE5fQklUUyA0CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL21hcC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbWFwLmgKaW5kZXggZjAyNjhiOS4uMTQyOTYzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbWFwLmgKQEAgLTEsNiArMSw2IEBACiAKIC8qIE92ZXJoYXVsZWQgcm91dGluZXMgZm9yIGRlYWxpbmcgd2l0aCBkaWZmZXJlbnQgbW1hcCByZWdpb25zIG9mIGZsYXNoICovCi0vKiAkSWQ6IG1hcC5oLHYgMS40NiAyMDA1LzAxLzA1IDE3OjA5OjQ0IGR3bXcyIEV4cCAkICovCisvKiAkSWQ6IG1hcC5oLHYgMS41MiAyMDA1LzA1LzI1IDEwOjI5OjQxIGdsZWl4bmVyIEV4cCAkICovCiAKICNpZm5kZWYgX19MSU5VWF9NVERfTUFQX0hfXwogI2RlZmluZSBfX0xJTlVYX01URF9NQVBfSF9fCkBAIC0yNjMsNiArMjYzLDE3IEBACiAJcmV0dXJuIHI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgbWFwX3dvcmQgbWFwX3dvcmRfY2xyKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBtYXBfd29yZCB2YWwxLCBtYXBfd29yZCB2YWwyKQoreworCW1hcF93b3JkIHI7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxtYXBfd29yZHMobWFwKTsgaSsrKSB7CisJCXIueFtpXSA9IHZhbDEueFtpXSAmIH52YWwyLnhbaV07CisJfQorCXJldHVybiByOworfQorCiBzdGF0aWMgaW5saW5lIG1hcF93b3JkIG1hcF93b3JkX29yKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBtYXBfd29yZCB2YWwxLCBtYXBfd29yZCB2YWwyKQogewogCW1hcF93b3JkIHI7CkBAIC0yNzMsNiArMjg0LDcgQEAKIAl9CiAJcmV0dXJuIHI7CiB9CisKICNkZWZpbmUgbWFwX3dvcmRfYW5kZXF1YWwobSwgYSwgYiwgeikgbWFwX3dvcmRfZXF1YWwobSwgeiwgbWFwX3dvcmRfYW5kKG0sIGEsIGIpKQogCiBzdGF0aWMgaW5saW5lIGludCBtYXBfd29yZF9iaXRzc2V0KHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBtYXBfd29yZCB2YWwxLCBtYXBfd29yZCB2YWwyKQpAQCAtMzI4LDE2ICszNDAsMjcgQEAKIAlyZXR1cm4gb3JpZzsKIH0KIAorI2lmIEJJVFNfUEVSX0xPTkcgPCA2NAorI2RlZmluZSBNQVBfRkZfTElNSVQgNAorI2Vsc2UKKyNkZWZpbmUgTUFQX0ZGX0xJTUlUIDgKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIG1hcF93b3JkIG1hcF93b3JkX2ZmKHN0cnVjdCBtYXBfaW5mbyAqbWFwKQogewogCW1hcF93b3JkIHI7CiAJaW50IGk7Ci0KLQlmb3IgKGk9MDsgaTxtYXBfd29yZHMobWFwKTsgaSsrKSB7Ci0JCXIueFtpXSA9IH4wVUw7CisJCisJaWYgKG1hcF9iYW5rd2lkdGgobWFwKSA8IE1BUF9GRl9MSU1JVCkgeworCQlpbnQgYncgPSA4ICogbWFwX2Jhbmt3aWR0aChtYXApOworCQlyLnhbMF0gPSAoMSA8PCBidykgLSAxOworCX0gZWxzZSB7CisJCWZvciAoaT0wOyBpPG1hcF93b3JkcyhtYXApOyBpKyspCisJCQlyLnhbaV0gPSB+MFVMOwogCX0KIAlyZXR1cm4gcjsKIH0KKwogc3RhdGljIGlubGluZSBtYXBfd29yZCBpbmxpbmVfbWFwX3JlYWQoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgb2ZzKQogewogCW1hcF93b3JkIHI7CkBAIC00MDUsNyArNDI4LDcgQEAKIAogCiAjZGVmaW5lIHNpbXBsZV9tYXBfaW5pdChtYXApIEJVR19PTighbWFwX2Jhbmt3aWR0aF9zdXBwb3J0ZWQoKG1hcCktPmJhbmt3aWR0aCkpCi0jZGVmaW5lIG1hcF9pc19saW5lYXIobWFwKSAoMSkKKyNkZWZpbmUgbWFwX2lzX2xpbmVhcihtYXApICh7ICh2b2lkKShtYXApOyAxOyB9KQogCiAjZW5kaWYgLyogIUNPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaCBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCmluZGV4IGIzZDEzNDMuLmM1MGMzZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCkBAIC0xLDUgKzEsNSBAQAogLyogCi0gKiAkSWQ6IG10ZC5oLHYgMS41NiAyMDA0LzA4LzA5IDE4OjQ2OjA0IGRtYXJsaW4gRXhwICQKKyAqICRJZDogbXRkLmgsdiAxLjU5IDIwMDUvMDQvMTEgMTA6MTk6MDIgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+IGV0IGFsLgogICoKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tdGQvY29tcGF0bWFjLmg+CiAjaW5jbHVkZSA8bXRkL210ZC1hYmkuaD4KQEAgLTY5LDcgKzcwLDYgQEAKIAogCXVfaW50MzJfdCBvb2JibG9jazsgIC8vIFNpemUgb2YgT09CIGJsb2NrcyAoZS5nLiA1MTIpCiAJdV9pbnQzMl90IG9vYnNpemU7ICAgLy8gQW1vdW50IG9mIE9PQiBkYXRhIHBlciBibG9jayAoZS5nLiAxNikKLQl1X2ludDMyX3Qgb29iYXZhaWw7ICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gT09CIGFyZWEgYXZhaWxhYmxlIGZvciBmcyAKIAl1X2ludDMyX3QgZWNjdHlwZTsKIAl1X2ludDMyX3QgZWNjc2l6ZTsKIAkKQEAgLTgwLDYgKzgwLDcgQEAKIAogCS8vIG9vYmluZm8gaXMgYSBuYW5kX29vYmluZm8gc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgc2V0IGJ5IGlvdGNsIChNRU1TRVRPT0JJTkZPKQogCXN0cnVjdCBuYW5kX29vYmluZm8gb29iaW5mbzsKKwl1X2ludDMyX3Qgb29iYXZhaWw7ICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gT09CIGFyZWEgYXZhaWxhYmxlIGZvciBmcyAKIAogCS8qIERhdGEgZm9yIHZhcmlhYmxlIGVyYXNlIHJlZ2lvbnMuIElmIG51bWVyYXNlcmVnaW9ucyBpcyB6ZXJvLAogCSAqIGl0IG1lYW5zIHRoYXQgdGhlIHdob2xlIGRldmljZSBoYXMgZXJhc2VzaXplIGFzIGdpdmVuIGFib3ZlLiAKQEAgLTExMywxMiArMTE0LDEyIEBACiAJICogZmxhc2ggZGV2aWNlcy4gVGhlIHVzZXIgZGF0YSBpcyBvbmUgdGltZSBwcm9ncmFtbWFibGUgYnV0IHRoZQogCSAqIGZhY3RvcnkgZGF0YSBpcyByZWFkIG9ubHkuIAogCSAqLwotCWludCAoKnJlYWRfdXNlcl9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKLQorCWludCAoKmdldF9mYWN0X3Byb3RfaW5mbykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3Qgb3RwX2luZm8gKmJ1Ziwgc2l6ZV90IGxlbik7CiAJaW50ICgqcmVhZF9mYWN0X3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwotCi0JLyogVGhpcyBmdW5jdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkICovCisJaW50ICgqZ2V0X3VzZXJfcHJvdF9pbmZvKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKTsKKwlpbnQgKCpyZWFkX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CiAJaW50ICgqd3JpdGVfdXNlcl9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKKwlpbnQgKCpsb2NrX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pOwogCiAJLyoga3ZlYy1iYXNlZCByZWFkL3dyaXRlIG1ldGhvZHMuIFdlIG5lZWQgdGhlc2UgZXNwZWNpYWxseSBmb3IgTkFORCBmbGFzaCwKIAkgICB3aXRoIGl0cyBsaW1pdGVkIG51bWJlciBvZiB3cml0ZSBjeWNsZXMgcGVyIGVyYXNlLgpAQCAtMTQ3LDYgKzE0OCw4IEBACiAJaW50ICgqYmxvY2tfaXNiYWQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcyk7CiAJaW50ICgqYmxvY2tfbWFya2JhZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKTsKIAorCXN0cnVjdCBub3RpZmllcl9ibG9jayByZWJvb3Rfbm90aWZpZXI7ICAvKiBkZWZhdWx0IG1vZGUgYmVmb3JlIHJlYm9vdCAqLworCiAJdm9pZCAqcHJpdjsKIAogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCmluZGV4IDlhMTljNjUuLjliNWI3NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgIFN0ZXZlbiBKLiBIaWxsIDxzamhpbGxAcmVhbGl0eWRpbHV0ZWQuY29tPgogICoJCSAgICAgICBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KICAqCi0gKiAkSWQ6IG5hbmQuaCx2IDEuNjggMjAwNC8xMS8xMiAxMDo0MDozNyBnbGVpeG5lciBFeHAgJAorICogJElkOiBuYW5kLmgsdiAxLjczIDIwMDUvMDUvMzEgMTk6Mzk6MTcgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTQ4LDYgKzQ4LDEwIEBACiAgKiAgMDItMDgtMjAwNCB0Z2x4IAlhZGRlZCBvcHRpb24gZmllbGQgdG8gbmFuZCBzdHJ1Y3R1cmUgZm9yIGNoaXAgYW5vbWFsaXRpZXMKICAqICAwNS0yNS0yMDA0IHRnbHggCWFkZGVkIGJhZCBibG9jayB0YWJsZSBzdXBwb3J0LCBTVC1NSUNSTyBtYW51ZmFjdHVyZXIgaWQKICAqCQkJdXBkYXRlIG9mIG5hbmRfY2hpcCBzdHJ1Y3R1cmUgZGVzY3JpcHRpb24KKyAqICAwMS0xNy0yMDA1IGRtYXJsaW4JYWRkZWQgZXh0ZW5kZWQgY29tbWFuZHMgZm9yIEFHLUFORCBkZXZpY2UgYW5kIGFkZGVkIG9wdGlvbiAKKyAqIAkJCWZvciBCQlRfQVVUT19SRUZSRVNILgorICogIDAxLTIwLTIwMDUgZG1hcmxpbglhZGRlZCBvcHRpb25hbCBwb2ludGVyIHRvIGhhcmR3YXJlIHNwZWNpZmljIGNhbGxiYWNrIGZvciAKKyAqCQkJZXh0cmEgZXJyb3Igc3RhdHVzIGNoZWNrcy4KICAqLwogI2lmbmRlZiBfX0xJTlVYX01URF9OQU5EX0gKICNkZWZpbmUgX19MSU5VWF9NVERfTkFORF9ICkBAIC0xMTUsNiArMTE5LDI1IEBACiAjZGVmaW5lIE5BTkRfQ01EX1JFQURTVEFSVAkweDMwCiAjZGVmaW5lIE5BTkRfQ01EX0NBQ0hFRFBST0cJMHgxNQogCisvKiBFeHRlbmRlZCBjb21tYW5kcyBmb3IgQUctQU5EIGRldmljZSAqLworLyogCisgKiBOb3RlOiB0aGUgY29tbWFuZCBmb3IgTkFORF9DTURfREVQTEVURTEgaXMgcmVhbGx5IDB4MDAgYnV0IAorICogICAgICAgdGhlcmUgaXMgbm8gd2F5IHRvIGRpc3Rpbmd1aXNoIHRoYXQgZnJvbSBOQU5EX0NNRF9SRUFEMAorICogICAgICAgdW50aWwgdGhlIHJlbWFpbmluZyBzZXF1ZW5jZSBvZiBjb21tYW5kcyBoYXMgYmVlbiBjb21wbGV0ZWQKKyAqICAgICAgIHNvIGFkZCBhIGhpZ2ggb3JkZXIgYml0IGFuZCBtYXNrIGl0IG9mZiBpbiB0aGUgY29tbWFuZC4KKyAqLworI2RlZmluZSBOQU5EX0NNRF9ERVBMRVRFMQkweDEwMAorI2RlZmluZSBOQU5EX0NNRF9ERVBMRVRFMgkweDM4CisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVU19NVUxUSQkweDcxCisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVU19FUlJPUgkweDcyCisvKiBtdWx0aS1iYW5rIGVycm9yIHN0YXR1cyAoYmFua3MgMC0zKSAqLworI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IwCTB4NzMKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX0VSUk9SMQkweDc0CisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVU19FUlJPUjIJMHg3NQorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IzCTB4NzYKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX1JFU0VUCTB4N2YKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX0NMRUFSCTB4ZmYKKwogLyogU3RhdHVzIGJpdHMgKi8KICNkZWZpbmUgTkFORF9TVEFUVVNfRkFJTAkweDAxCiAjZGVmaW5lIE5BTkRfU1RBVFVTX0ZBSUxfTjEJMHgwMgpAQCAtMTQzLDcgKzE2Niw3IEBACiAKIC8qCiAgKiBDb25zdGFudHMgZm9yIEhhcmR3YXJlIEVDQwotKi8KKyAqLwogLyogUmVzZXQgSGFyZHdhcmUgRUNDIGZvciByZWFkICovCiAjZGVmaW5lIE5BTkRfRUNDX1JFQUQJCTAKIC8qIFJlc2V0IEhhcmR3YXJlIEVDQyBmb3Igd3JpdGUgKi8KQEAgLTE1MSw2ICsxNzQsMTAgQEAKIC8qIEVuYWJsZSBIYXJkd2FyZSBFQ0MgYmVmb3JlIHN5bmRyb20gaXMgcmVhZCBiYWNrIGZyb20gZmxhc2ggKi8KICNkZWZpbmUgTkFORF9FQ0NfUkVBRFNZTgkyCiAKKy8qIEJpdCBtYXNrIGZvciBmbGFncyBwYXNzZWQgdG8gZG9fbmFuZF9yZWFkX2VjYyAqLworI2RlZmluZSBOQU5EX0dFVF9ERVZJQ0UJCTB4ODAKKworCiAvKiBPcHRpb24gY29uc3RhbnRzIGZvciBiaXphcnJlIGRpc2Z1bmN0aW9uYWxpdHkgYW5kIHJlYWwKICogIGZlYXR1cmVzCiAqLwpAQCAtMTcwLDYgKzE5NywxMCBAQAogLyogQ2hpcCBoYXMgYSBhcnJheSBvZiA0IHBhZ2VzIHdoaWNoIGNhbiBiZSByZWFkIHdpdGhvdXQKICAqIGFkZGl0aW9uYWwgcmVhZHkgL2J1c3kgd2FpdHMgKi8KICNkZWZpbmUgTkFORF80UEFHRV9BUlJBWQkweDAwMDAwMDQwIAorLyogQ2hpcCByZXF1aXJlcyB0aGF0IEJCVCBpcyBwZXJpb2RpY2FsbHkgcmV3cml0dGVuIHRvIHByZXZlbnQKKyAqIGJpdHMgZnJvbSBhZGphY2VudCBibG9ja3MgZnJvbSAnbGVha2luZycgaW4gYWx0ZXJpbmcgZGF0YS4KKyAqIFRoaXMgaGFwcGVucyB3aXRoIHRoZSBSZW5lc2FzIEFHLUFORCBjaGlwcywgcG9zc2libHkgb3RoZXJzLiAgKi8KKyNkZWZpbmUgQkJUX0FVVE9fUkVGUkVTSAkweDAwMDAwMDgwCiAKIC8qIE9wdGlvbnMgdmFsaWQgZm9yIFNhbXN1bmcgbGFyZ2UgcGFnZSBkZXZpY2VzICovCiAjZGVmaW5lIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIFwKQEAgLTE5Miw3ICsyMjMsOCBAQAogICogVGhpcyBjYW4gb25seSB3b3JrIGlmIHdlIGhhdmUgdGhlIGVjYyBieXRlcyBkaXJlY3RseSBiZWhpbmQgdGhlIAogICogZGF0YSBieXRlcy4gQXBwbGllcyBmb3IgRE9DIGFuZCBBRy1BTkQgUmVuZXNhcyBIVyBSZWVkIFNvbG9tb24gZ2VuZXJhdG9ycyAqLwogI2RlZmluZSBOQU5EX0hXRUNDX1NZTkRST01FCTB4MDAwMjAwMDAKLQorLyogVGhpcyBvcHRpb24gc2tpcHMgdGhlIGJidCBzY2FuIGR1cmluZyBpbml0aWFsaXphdGlvbi4gKi8KKyNkZWZpbmUgTkFORF9TS0lQX0JCVFNDQU4JMHgwMDA0MDAwMAogCiAvKiBPcHRpb25zIHNldCBieSBuYW5kIHNjYW4gKi8KIC8qIE5hbmQgc2NhbiBoYXMgYWxsb2NhdGVkIG9vYl9idWYgKi8KQEAgLTIyMSwxMCArMjUzLDEzIEBACiAgKiBzdHJ1Y3QgbmFuZF9od19jb250cm9sIC0gQ29udHJvbCBzdHJ1Y3R1cmUgZm9yIGhhcmR3YXJlIGNvbnRyb2xsZXIgKGUuZyBFQ0MgZ2VuZXJhdG9yKSBzaGFyZWQgYW1vbmcgaW5kZXBlbmRlbmQgZGV2aWNlcwogICogQGxvY2s6ICAgICAgICAgICAgICAgcHJvdGVjdGlvbiBsb2NrICAKICAqIEBhY3RpdmU6CQl0aGUgbXRkIGRldmljZSB3aGljaCBob2xkcyB0aGUgY29udHJvbGxlciBjdXJyZW50bHkKKyAqIEB3cToJCQl3YWl0IHF1ZXVlIHRvIHNsZWVwIG9uIGlmIGEgTkFORCBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MKKyAqICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW5zdGVhZCBvZiB0aGUgcGVyIGNoaXAgd2FpdCBxdWV1ZSB3aGVuIGEgaHcgY29udHJvbGxlciBpcyBhdmFpbGFibGUKICAqLwogc3RydWN0IG5hbmRfaHdfY29udHJvbCB7CiAJc3BpbmxvY2tfdAkgbG9jazsKIAlzdHJ1Y3QgbmFuZF9jaGlwICphY3RpdmU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CiB9OwogCiAvKioKQEAgLTI4Myw2ICszMTgsOCBAQAogICogQGJhZGJsb2NrX3BhdHRlcm46CVtSRVBMQUNFQUJMRV0gYmFkIGJsb2NrIHNjYW4gcGF0dGVybiB1c2VkIGZvciBpbml0aWFsIGJhZCBibG9jayBzY2FuIAogICogQGNvbnRyb2xsZXI6CQlbT1BUSU9OQUxdIGEgcG9pbnRlciB0byBhIGhhcmR3YXJlIGNvbnRyb2xsZXIgc3RydWN0dXJlIHdoaWNoIGlzIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbmRlcGVuZGVuZCBkZXZpY2VzCiAgKiBAcHJpdjoJCVtPUFRJT05BTF0gcG9pbnRlciB0byBwcml2YXRlIGNoaXAgZGF0ZQorICogQGVycnN0YXQ6CQlbT1BUSU9OQUxdIGhhcmR3YXJlIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBlcnJvciBzdGF0dXMgY2hlY2tzIAorICoJCQkoZGV0ZXJtaW5lIGlmIGVycm9ycyBhcmUgY29ycmVjdGFibGUpCiAgKi8KICAKIHN0cnVjdCBuYW5kX2NoaXAgewpAQCAtMzM4LDYgKzM3NSw3IEBACiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyCSpiYWRibG9ja19wYXR0ZXJuOwogCXN0cnVjdCBuYW5kX2h3X2NvbnRyb2wgICpjb250cm9sbGVyOwogCXZvaWQJCSpwcml2OworCWludAkJKCplcnJzdGF0KShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgaW50IHN0YXRlLCBpbnQgc3RhdHVzLCBpbnQgcGFnZSk7CiB9OwogCiAvKgpAQCAtMzQ5LDYgKzM4Nyw3IEBACiAjZGVmaW5lIE5BTkRfTUZSX05BVElPTkFMCTB4OGYKICNkZWZpbmUgTkFORF9NRlJfUkVORVNBUwkweDA3CiAjZGVmaW5lIE5BTkRfTUZSX1NUTUlDUk8JMHgyMAorI2RlZmluZSBOQU5EX01GUl9IWU5JWCAgICAgICAgICAweGFkCiAKIC8qKgogICogc3RydWN0IG5hbmRfZmxhc2hfZGV2IC0gTkFORCBGbGFzaCBEZXZpY2UgSUQgU3RydWN0dXJlCkBAIC00NTksNiArNDk4LDkgQEAKIGV4dGVybiBpbnQgbmFuZF9kZWZhdWx0X2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQpOwogZXh0ZXJuIGludCBuYW5kX2lzYmFkX2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzLCBpbnQgYWxsb3diYnQpOwogZXh0ZXJuIGludCBuYW5kX2VyYXNlX25hbmQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIsIGludCBhbGxvd2JidCk7CitleHRlcm4gaW50IG5hbmRfZG9fcmVhZF9lY2MgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYsIHVfY2hhciAqIG9vYl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCwgaW50IGZsYWdzKTsKIAogLyoKICogQ29uc3RhbnRzIGZvciBvb2IgY29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvcGxhdC1yYW0uaCBiL2luY2x1ZGUvbGludXgvbXRkL3BsYXQtcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzMmVkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL3BsYXQtcmFtLmgKQEAgLTAsMCArMSwzNSBAQAorLyogbGludXgvaW5jbHVkZS9tdGQvcGxhdC1yYW0uaAorICoKKyAqIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvU1dMSU5VWC8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBHZW5lcmljIHBsYXRmb3JtIGRldmljZSBiYXNlZCBSQU0gbWFwCisgKgorICogJElkOiBwbGF0LXJhbS5oLHYgMS4yIDIwMDUvMDEvMjQgMDA6Mzc6NDAgYmpkIEV4cCAkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01URF9QTEFUUkFNX0gKKyNkZWZpbmUgX19MSU5VWF9NVERfUExBVFJBTV9IIF9fRklMRV9fCisKKyNkZWZpbmUgUExBVFJBTV9STyAoMCkKKyNkZWZpbmUgUExBVFJBTV9SVyAoMSkKKworc3RydWN0IHBsYXRkYXRhX210ZF9yYW0geworCWNoYXIJCQkqbWFwbmFtZTsKKwljaGFyCQkgICAgICAgKipwcm9iZXM7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRpdGlvbnM7CisJaW50CQkJIG5yX3BhcnRpdGlvbnM7CisJaW50CQkJIGJhbmt3aWR0aDsKKworCS8qIGNvbnRyb2wgY2FsbGJhY2tzICovCisKKwl2b2lkCSgqc2V0X3J3KShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCB0byk7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9NVERfUExBVFJBTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC94aXAuaCBiL2luY2x1ZGUvbGludXgvbXRkL3hpcC5oCmluZGV4IGZjMDcxMTIuLjdiN2RlZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL3hpcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL3hpcC5oCkBAIC01OCwyMiArNTgsMTYgQEAKICAqIAkJcmV0dXJuZWQgdmFsdWUgaXMgPD0gdGhlIHJlYWwgZWxhcHNlZCB0aW1lLgogICogCW5vdGUgMjogdGhpcyBzaG91bGQgYmUgYWJsZSB0byBjb3BlIHdpdGggYSBmZXcgc2Vjb25kcyB3aXRob3V0CiAgKiAJCW92ZXJmbG93aW5nLgorICoKKyAqIHhpcF9pcHJlZmV0Y2goKQorICogIAorICogICAgICBNYWNybyB0byBmaWxsIGluc3RydWN0aW9uIHByZWZldGNoCisgKgllLmcuIGEgc2VyaWVzIG9mIG5vcHM6ICBhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsgCiAgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfU0ExMTAwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX1BYQSkKKyNpbmNsdWRlIDxhc20vbXRkLXhpcC5oPgogCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+Ci0jaWZkZWYgQ09ORklHX0FSQ0hfUFhBCi0jaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KLSNlbmRpZgotCi0jZGVmaW5lIHhpcF9pcnFwZW5kaW5nKCkJKElDSVAgJiBJQ01SKQotCi0vKiB3ZSBzYW1wbGUgT1NDUiBhbmQgY29udmVydCBkZXNpcmVkIGRlbHRhIHRvIHVzZWMgKDEvNCB+PSAxMDAwMDAwLzM2ODY0MDApICovCi0jZGVmaW5lIHhpcF9jdXJydGltZSgpCQkoT1NDUikKLSNkZWZpbmUgeGlwX2VsYXBzZWRfc2luY2UoeCkJKHNpZ25lZCkoKE9TQ1IgLSAoeCkpIC8gNCkKLQotI2Vsc2UKKyNpZm5kZWYgeGlwX2lycXBlbmRpbmcKIAogI3dhcm5pbmcgIm1pc3NpbmcgSVJRIGFuZCB0aW1lciBwcmltaXRpdmVzIGZvciBYSVAgTVREIHN1cHBvcnQiCiAjd2FybmluZyAic29tZSBvZiB0aGUgWElQIE1URCBzdXBwb3J0IGNvZGUgd2lsbCBiZSBkaXNhYmxlZCIKQEAgLTg1LDE2ICs3OSwxNyBAQAogCiAjZW5kaWYKIAorI2lmbmRlZiB4aXBfaXByZWZldGNoCisjZGVmaW5lIHhpcF9pcHJlZmV0Y2goKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKIC8qCiAgKiB4aXBfY3B1X2lkbGUoKSBpcyB1c2VkIHdoZW4gd2FpdGluZyBmb3IgYSBkZWxheSBlcXVhbCBvciBsYXJnZXIgdGhhbgogICogdGhlIHN5c3RlbSB0aW1lciB0aWNrIHBlcmlvZC4gIFRoaXMgc2hvdWxkIHB1dCB0aGUgQ1BVIGludG8gaWRsZSBtb2RlCiAgKiB0byBzYXZlIHBvd2VyIGFuZCB0byBiZSB3b2tlbiB1cCBvbmx5IHdoZW4gc29tZSBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nLgotICogQXMgYWJvdmUsIHRoaXMgc2hvdWxkIG5vdCByZWx5IHVwb24gc3RhbmRhcmQga2VybmVsIGNvZGUuCisgKiBUaGlzIHNob3VsZCBub3QgcmVseSB1cG9uIHN0YW5kYXJkIGtlcm5lbCBjb2RlLgogICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfWFNDQUxFKQotI2RlZmluZSB4aXBfY3B1X2lkbGUoKSAgYXNtIHZvbGF0aWxlICgibWNyIHAxNCwgMCwgJTAsIGM3LCBjMCwgMCIgOjogInIiICgxKSkKLSNlbHNlCisjaWZuZGVmIHhpcF9jcHVfaWRsZQogI2RlZmluZSB4aXBfY3B1X2lkbGUoKSAgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L25hbWVzcGFjZS5oCmluZGV4IDY5Nzk5MWIuLjBlNWE4NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uYW1lc3BhY2UuaApAQCAtMTcsNyArMTcsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X25hbWVzcGFjZShzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2UpCiB7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm5hbWVzcGFjZS0+Y291bnQpKQorCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZuYW1lc3BhY2UtPmNvdW50LCAmdmZzbW91bnRfbG9jaykpCisJCS8qIHJlbGVhc2VzIHZmc21vdW50X2xvY2sgKi8KIAkJX19wdXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKaW5kZXggMjdlNGQxNi4uMmYwYzA4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNkZWZpbmUgTkVUTElOS19BVURJVAkJOQkvKiBhdWRpdGluZyAqLwogI2RlZmluZSBORVRMSU5LX0ZJQl9MT09LVVAJMTAJCiAjZGVmaW5lIE5FVExJTktfUk9VVEU2CQkxMQkvKiBhZl9pbmV0NiByb3V0ZSBjb21tIGNoYW5uZWwgKi8KKyNkZWZpbmUgTkVUTElOS19ORVRGSUxURVIJMTIJLyogbmV0ZmlsdGVyIHN1YnN5c3RlbSAqLwogI2RlZmluZSBORVRMSU5LX0lQNl9GVwkJMTMKICNkZWZpbmUgTkVUTElOS19ETlJUTVNHCQkxNAkvKiBERUNuZXQgcm91dGluZyBtZXNzYWdlcyAqLwogI2RlZmluZSBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UCTE1CS8qIEtlcm5lbCBtZXNzYWdlcyB0byB1c2Vyc3BhY2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCmluZGV4IDU3OTFkZmQuLjZkNWEyNGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaApAQCAtMTI0LDYgKzEyNCw3IEBACiAKIGludAkJbmZzZF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBpbnQJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7Cit2b2lkCQluZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRwKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjJfQUNMKSB8fCBkZWZpbmVkKENPTkZJR19ORlNEX1YzX0FDTCkKICNpZmRlZiBDT05GSUdfTkZTRF9WMl9BQ0wKQEAgLTIzMCw2ICsyMzEsNyBAQAogI2RlZmluZQluZnNlcnJfcmVjbGFpbV9iYWQJX19jb25zdGFudF9odG9ubChORlNFUlJfUkVDTEFJTV9CQUQpCiAjZGVmaW5lCW5mc2Vycl9iYWRuYW1lCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9CQUROQU1FKQogI2RlZmluZQluZnNlcnJfY2JfcGF0aF9kb3duCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0NCX1BBVEhfRE9XTikKKyNkZWZpbmUJbmZzZXJyX2xvY2tlZAkJX19jb25zdGFudF9odG9ubChORlNFUlJfTE9DS0VEKQogCiAvKiBlcnJvciBjb2RlcyBmb3IgaW50ZXJuYWwgdXNlICovCiAvKiBpZiBhIHJlcXVlc3QgZmFpbHMgZHVlIHRvIGttYWxsb2MgZmFpbHVyZSwgaXQgZ2V0cyBkcm9wcGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmggYi9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaAppbmRleCBhODRhM2ZhLi44YmYyM2NmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaApAQCAtMjAzLDcgKzIwMyw5IEBACiAJaW50CQkJc29faXNfb3Blbl9vd25lcjsgLyogMT1vcGVub3duZXIsMD1sb2Nrb3duZXIgKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICBzb19pZDsKIAlzdHJ1Y3QgbmZzNF9jbGllbnQgKiAgICBzb19jbGllbnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgc29fc2VxaWQ7ICAgIAorCS8qIGFmdGVyIGluY3JlbWVudCBpbiBFTkNPREVfU0VRSURfT1BfVEFJTCwgcmVwcmVzZW50cyB0aGUgbmV4dAorCSAqIHNlcXVlbmNlIGlkIGV4cGVjdGVkIGZyb20gdGhlIGNsaWVudDogKi8KKwl1MzIgICAgICAgICAgICAgICAgICAgICBzb19zZXFpZDsKIAlzdHJ1Y3QgeGRyX25ldG9iaiAgICAgICBzb19vd25lcjsgICAgIC8qIG9wZW4gb3duZXIgbmFtZSAqLwogCWludCAgICAgICAgICAgICAgICAgICAgIHNvX2NvbmZpcm1lZDsgLyogc3VjY2Vzc2Z1bCBPUEVOX0NPTkZJUk0/ICovCiAJc3RydWN0IG5mczRfcmVwbGF5CXNvX3JlcGxheTsKQEAgLTIzNSw2ICsyMzcsMTAgQEAKICogICAgICAgc3RfcGVybG9ja293bmVyOiAob3BlbiBzdGF0ZWlkKSBsaXN0IG9mIGxvY2sgbmZzNF9zdGF0ZW93bmVycwogKiAJc3RfYWNjZXNzX2JtYXA6IHVzZWQgb25seSBmb3Igb3BlbiBzdGF0ZWlkCiAqIAlzdF9kZW55X2JtYXA6IHVzZWQgb25seSBmb3Igb3BlbiBzdGF0ZWlkCisqCXN0X29wZW5zdHA6IG9wZW4gc3RhdGVpZCBsb2NrIHN0YXRlaWQgd2FzIGRlcml2ZWQgZnJvbQorKgorKiBYWFg6IG9wZW4gc3RhdGVpZHMgYW5kIGxvY2sgc3RhdGVpZHMgaGF2ZSBkaXZlcmdlZCBzdWZmaWNpZW50bHkgdGhhdAorKiB3ZSBzaG91bGQgY29uc2lkZXIgZGVmaW5pbmcgc2VwYXJhdGUgc3RydWN0cyBmb3IgdGhlIHR3byBjYXNlcy4KICovCiAKIHN0cnVjdCBuZnM0X3N0YXRlaWQgewpAQCAtMjQ4LDYgKzI1NCw3IEBACiAJc3RydWN0IGZpbGUgICAgICAgICAgICAgICAgICogc3RfdmZzX2ZpbGU7CiAJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgc3RfYWNjZXNzX2JtYXA7CiAJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgc3RfZGVueV9ibWFwOworCXN0cnVjdCBuZnM0X3N0YXRlaWQgICAgICAgICAqIHN0X29wZW5zdHA7CiB9OwogCiAvKiBmbGFncyBmb3IgcHJlcHJvY2Vzc19zZXFpZF9vcCgpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS1keW5pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpLWR5bmlkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNiNmIwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcGNpLWR5bmlkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqCVBDSSBkZWZpbmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gKglDb3B5cmlnaHQgMjAwMyBEZWxsIEluYy4KLSAqICAgICAgICBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+Ci0gKi8KLQotI2lmbmRlZiBMSU5VWF9QQ0lfRFlOSURTX0gKLSNkZWZpbmUgTElOVVhfUENJX0RZTklEU19ICi0KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+Ci0KLXN0cnVjdCBkeW5pZCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbm9kZTsKLQlzdHJ1Y3QgcGNpX2RldmljZV9pZCAgICBpZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggNjY3OThiNC4uN2FjMTQ5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC01ODYsNyArNTg2LDcgQEAKICNkZWZpbmUgUENJX05VTV9SRVNPVVJDRVMgMTEKIAogI2lmbmRlZiBQQ0lfQlVTX05VTV9SRVNPVVJDRVMKLSNkZWZpbmUgUENJX0JVU19OVU1fUkVTT1VSQ0VTIDQKKyNkZWZpbmUgUENJX0JVU19OVU1fUkVTT1VSQ0VTIDgKICNlbmRpZgogICAKICNkZWZpbmUgUENJX1JFR0lPTl9GTEFHX01BU0sgMHgwZlUJLyogVGhlc2UgYml0cyBvZiByZXNvdXJjZSBmbGFncyB0ZWxsIHVzIHRoZSBQQ0kgcmVnaW9uIGZsYWdzICovCkBAIC04NjAsNyArODYwLDggQEAKIHZvaWQgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY2lfZHJpdmVyICopOwogdm9pZCBwY2lfcmVtb3ZlX2JlaGluZF9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKik7CiBzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2Rldl9kcml2ZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKik7Ci1jb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRzLCBjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2NvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfbWF0Y2hfZGV2aWNlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpkZXYpOworY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9tYXRjaF9pZChjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBwY2lfc2Nhbl9icmlkZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHBjaV9kZXYgKiBkZXYsIGludCBtYXgsIGludCBwYXNzKTsKIAogLyoga21lbV9jYWNoZSBzdHlsZSB3cmFwcGVyIGFyb3VuZCBwY2lfYWxsb2NfY29uc2lzdGVudCgpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggMTQ0NzkzMi4uN2FlYjIwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtMTc2LDcgKzE3Niw3IEBACiB9OwogCiBleHRlcm4gdm9pZCBwbV9zZXRfb3BzKHN0cnVjdCBwbV9vcHMgKik7Ci0KK2V4dGVybiBzdHJ1Y3QgcG1fb3BzICpwbV9vcHM7CiBleHRlcm4gaW50IHBtX3N1c3BlbmQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2FjbC5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19hY2wuaAppbmRleCAwNzYwNTA3Li4wYTM2MDUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2FjbC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfYWNsLmgKQEAgLTQsMjkgKzQsMjkgQEAKICNkZWZpbmUgUkVJU0VSRlNfQUNMX1ZFUlNJT04JMHgwMDAxCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfX2xlMTYJCWVfdGFnOwotCV9fbGUxNgkJZV9wZXJtOwotCV9fbGUzMgkJZV9pZDsKKwlfX2xlMTYgZV90YWc7CisJX19sZTE2IGVfcGVybTsKKwlfX2xlMzIgZV9pZDsKIH0gcmVpc2VyZnNfYWNsX2VudHJ5OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JX19sZTE2CQllX3RhZzsKLQlfX2xlMTYJCWVfcGVybTsKKwlfX2xlMTYgZV90YWc7CisJX19sZTE2IGVfcGVybTsKIH0gcmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JX19sZTMyCQlhX3ZlcnNpb247CisJX19sZTMyIGFfdmVyc2lvbjsKIH0gcmVpc2VyZnNfYWNsX2hlYWRlcjsKIAogc3RhdGljIGlubGluZSBzaXplX3QgcmVpc2VyZnNfYWNsX3NpemUoaW50IGNvdW50KQogewogCWlmIChjb3VudCA8PSA0KSB7CiAJCXJldHVybiBzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikgKwotCQkgICAgICAgY291bnQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KTsKKwkJICAgIGNvdW50ICogc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKSArCi0JCSAgICAgICA0ICogc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCkgKwotCQkgICAgICAgKGNvdW50IC0gNCkgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KTsKKwkJICAgIDQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KSArCisJCSAgICAoY291bnQgLSA0KSAqIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOwogCX0KIH0KIApAQCAtNDYsMTQgKzQ2LDE0IEBACiAJfQogfQogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMCi1zdHJ1Y3QgcG9zaXhfYWNsICogcmVpc2VyZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7Ci1pbnQgcmVpc2VyZnNfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLWludCByZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLWludCByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbCAoc3RydWN0IGlub2RlICpkaXIpOwotZXh0ZXJuIGludCByZWlzZXJmc194YXR0cl9wb3NpeF9hY2xfaW5pdCAodm9pZCkgX19pbml0OwotZXh0ZXJuIGludCByZWlzZXJmc194YXR0cl9wb3NpeF9hY2xfZXhpdCAodm9pZCk7CitzdHJ1Y3QgcG9zaXhfYWNsICpyZWlzZXJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKK2ludCByZWlzZXJmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpcik7CitleHRlcm4gaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9pbml0KHZvaWQpIF9faW5pdDsKK2V4dGVybiBpbnQgcmVpc2VyZnNfeGF0dHJfcG9zaXhfYWNsX2V4aXQodm9pZCk7CiBleHRlcm4gc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgcG9zaXhfYWNsX2RlZmF1bHRfaGFuZGxlcjsKIGV4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfYWNjZXNzX2hhbmRsZXI7CiAjZWxzZQpAQCAtNjEsMjggKzYxLDI2IEBACiAjZGVmaW5lIHJlaXNlcmZzX2dldF9hY2wgTlVMTAogI2RlZmluZSByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbChpbm9kZSkgMAogCi1zdGF0aWMgaW5saW5lIGludAotcmVpc2VyZnNfeGF0dHJfcG9zaXhfYWNsX2luaXQgKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc194YXR0cl9wb3NpeF9hY2xfaW5pdCh2b2lkKQogewotICAgIHJldHVybiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc194YXR0cl9wb3NpeF9hY2xfZXhpdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLXJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9leGl0ICh2b2lkKQorcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbChjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotcmVpc2VyZnNfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbCAoY29uc3Qgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKaW5kZXggNGM3YzU2OC4uMTdlNDU4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaApAQCAtMywxMSArMywxMCBAQAogICovCiAKIAkJCQkvKiB0aGlzIGZpbGUgaGFzIGFuIGFtYXppbmdseSBzdHVwaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgeXVyYSBwbGVhc2UgZml4IGl0IHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzLmgsIGFuZCBtZXJnZSBhbGwgdGhlIHJlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygb3VyIC5oIGZpbGVzIHRoYXQgYXJlIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGludG8gaXQuICAqLwotCisJCQkJICAgbmFtZSwgeXVyYSBwbGVhc2UgZml4IGl0IHRvIGJlCisJCQkJICAgcmVpc2VyZnMuaCwgYW5kIG1lcmdlIGFsbCB0aGUgcmVzdAorCQkJCSAgIG9mIG91ciAuaCBmaWxlcyB0aGF0IGFyZSBpbiB0aGlzCisJCQkJICAgZGlyZWN0b3J5IGludG8gaXQuICAqLwogCiAjaWZuZGVmIF9MSU5VWF9SRUlTRVJfRlNfSAogI2RlZmluZSBfTElOVVhfUkVJU0VSX0ZTX0gKQEAgLTc0LDkgKzczLDkgQEAKIC8qIGRlYnVnIGxldmVscy4gIFJpZ2h0IG5vdywgQ09ORklHX1JFSVNFUkZTX0NIRUNLIG1lYW5zIHByaW50IGFsbCBkZWJ1ZwogKiogbWVzc2FnZXMuCiAqLwotI2RlZmluZSBSRUlTRVJGU19ERUJVR19DT0RFIDUgLyogZXh0cmEgbWVzc2FnZXMgdG8gaGVscCBmaW5kL2RlYnVnIGVycm9ycyAqLyAKKyNkZWZpbmUgUkVJU0VSRlNfREVCVUdfQ09ERSA1CS8qIGV4dHJhIG1lc3NhZ2VzIHRvIGhlbHAgZmluZC9kZWJ1ZyBlcnJvcnMgKi8KIAotdm9pZCByZWlzZXJmc193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLik7Cit2b2lkIHJlaXNlcmZzX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAvKiBhc3NlcnRpb25zIGhhbmRsaW5nICovCiAKIC8qKiBhbHdheXMgY2hlY2sgYSBjb25kaXRpb24gYW5kIHBhbmljIGlmIGl0J3MgZmFsc2UuICovCkBAIC0xMDUsODIgKzEwNCw3OCBAQAogICogU3RydWN0dXJlIG9mIHN1cGVyIGJsb2NrIG9uIGRpc2ssIGEgdmVyc2lvbiBvZiB3aGljaCBpbiBSQU0gaXMgb2Z0ZW4gYWNjZXNzZWQgYXMgUkVJU0VSRlNfU0IocyktPnNfcnMKICAqIHRoZSB2ZXJzaW9uIGluIFJBTSBpcyBwYXJ0IG9mIGEgbGFyZ2VyIHN0cnVjdHVyZSBjb250YWluaW5nIGZpZWxkcyBuZXZlciB3cml0dGVuIHRvIGRpc2suCiAgKi8KLSNkZWZpbmUgVU5TRVRfSEFTSCAwIC8vIHJlYWRfc3VwZXIgd2lsbCBndWVzcyBhYm91dCwgd2hhdCBoYXNoIG5hbWVzCi0gICAgICAgICAgICAgICAgICAgICAvLyBpbiBkaXJlY3RvcmllcyB3ZXJlIHNvcnRlZCB3aXRoCisjZGVmaW5lIFVOU0VUX0hBU0ggMAkJLy8gcmVhZF9zdXBlciB3aWxsIGd1ZXNzIGFib3V0LCB3aGF0IGhhc2ggbmFtZXMKKwkJICAgICAvLyBpbiBkaXJlY3RvcmllcyB3ZXJlIHNvcnRlZCB3aXRoCiAjZGVmaW5lIFRFQV9IQVNIICAxCiAjZGVmaW5lIFlVUkFfSEFTSCAyCiAjZGVmaW5lIFI1X0hBU0ggICAzCiAjZGVmaW5lIERFRkFVTFRfSEFTSCBSNV9IQVNICiAKLQogc3RydWN0IGpvdXJuYWxfcGFyYW1zIHsKLSAgICBfX2xlMzIganBfam91cm5hbF8xc3RfYmxvY2s7CSAgICAgIC8qIHdoZXJlIGRvZXMgam91cm5hbCBzdGFydCBmcm9tIG9uIGl0cwotCQkJCSAgICAgICAqIGRldmljZSAqLwotICAgIF9fbGUzMiBqcF9qb3VybmFsX2RldjsJICAgICAgLyogam91cm5hbCBkZXZpY2Ugc3RfcmRldiAqLwotICAgIF9fbGUzMiBqcF9qb3VybmFsX3NpemU7CSAgICAgIC8qIHNpemUgb2YgdGhlIGpvdXJuYWwgKi8KLSAgICBfX2xlMzIganBfam91cm5hbF90cmFuc19tYXg7CSAgICAgIC8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICovCi0gICAgX19sZTMyIGpwX2pvdXJuYWxfbWFnaWM7IAkgICAgICAvKiByYW5kb20gdmFsdWUgbWFkZSBvbiBmcyBjcmVhdGlvbiAodGhpcwotCQkJCSAgICAgICAqIHdhcyBzYl9qb3VybmFsX2Jsb2NrX2NvdW50KSAqLwotICAgIF9fbGUzMiBqcF9qb3VybmFsX21heF9iYXRjaDsJICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhCi0JCQkJICAgICAgICogdHJhbnMgKi8KLSAgICBfX2xlMzIganBfam91cm5hbF9tYXhfY29tbWl0X2FnZTsgIC8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGFuIGFzeW5jCi0JCQkJICAgICAgICogY29tbWl0IGJlICovCi0gICAgX19sZTMyIGpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTsgICAvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhIHRyYW5zYWN0aW9uCi0JCQkJICAgICAgICogYmUgKi8KKwlfX2xlMzIganBfam91cm5hbF8xc3RfYmxvY2s7CS8qIHdoZXJlIGRvZXMgam91cm5hbCBzdGFydCBmcm9tIG9uIGl0cworCQkJCQkgKiBkZXZpY2UgKi8KKwlfX2xlMzIganBfam91cm5hbF9kZXY7CS8qIGpvdXJuYWwgZGV2aWNlIHN0X3JkZXYgKi8KKwlfX2xlMzIganBfam91cm5hbF9zaXplOwkvKiBzaXplIG9mIHRoZSBqb3VybmFsICovCisJX19sZTMyIGpwX2pvdXJuYWxfdHJhbnNfbWF4OwkvKiBtYXggbnVtYmVyIG9mIGJsb2NrcyBpbiBhIHRyYW5zYWN0aW9uLiAqLworCV9fbGUzMiBqcF9qb3VybmFsX21hZ2ljOwkvKiByYW5kb20gdmFsdWUgbWFkZSBvbiBmcyBjcmVhdGlvbiAodGhpcworCQkJCQkgKiB3YXMgc2Jfam91cm5hbF9ibG9ja19jb3VudCkgKi8KKwlfX2xlMzIganBfam91cm5hbF9tYXhfYmF0Y2g7CS8qIG1heCBudW1iZXIgb2YgYmxvY2tzIHRvIGJhdGNoIGludG8gYQorCQkJCQkgKiB0cmFucyAqLworCV9fbGUzMiBqcF9qb3VybmFsX21heF9jb21taXRfYWdlOwkvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhbiBhc3luYworCQkJCQkJICogY29tbWl0IGJlICovCisJX19sZTMyIGpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTsJLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYSB0cmFuc2FjdGlvbgorCQkJCQkJICogYmUgKi8KIH07CiAKIC8qIHRoaXMgaXMgdGhlIHN1cGVyIGZyb20gMy41LlgsIHdoZXJlIFggPj0gMTAgKi8KLXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MQotewotICAgIF9fbGUzMiBzX2Jsb2NrX2NvdW50OwkgICAvKiBibG9ja3MgY291bnQgICAgICAgICAqLwotICAgIF9fbGUzMiBzX2ZyZWVfYmxvY2tzOyAgICAgICAgICAgLyogZnJlZSBibG9ja3MgY291bnQgICAgKi8KLSAgICBfX2xlMzIgc19yb290X2Jsb2NrOyAgICAgICAgICAgIC8qIHJvb3QgYmxvY2sgbnVtYmVyICAgICovCi0gICAgc3RydWN0IGpvdXJuYWxfcGFyYW1zIHNfam91cm5hbDsKLSAgICBfX2xlMTYgc19ibG9ja3NpemU7ICAgICAgICAgICAgIC8qIGJsb2NrIHNpemUgKi8KLSAgICBfX2xlMTYgc19vaWRfbWF4c2l6ZTsJICAgLyogbWF4IHNpemUgb2Ygb2JqZWN0IGlkIGFycmF5LCBzZWUKLQkJCQkgICAgKiBnZXRfb2JqZWN0aWQoKSBjb21tZW50YXJ5ICAqLwotICAgIF9fbGUxNiBzX29pZF9jdXJzaXplOwkgICAvKiBjdXJyZW50IHNpemUgb2Ygb2JqZWN0IGlkIGFycmF5ICovCi0gICAgX19sZTE2IHNfdW1vdW50X3N0YXRlOyAgICAgICAgICAvKiB0aGlzIGlzIHNldCB0byAxIHdoZW4gZmlsZXN5c3RlbSB3YXMKLQkJCQkgICAgKiB1bW91bnRlZCwgdG8gMiAtIHdoZW4gbm90ICovICAgIAotICAgIGNoYXIgc19tYWdpY1sxMF07ICAgICAgICAgICAgICAvKiByZWlzZXJmcyBtYWdpYyBzdHJpbmcgaW5kaWNhdGVzIHRoYXQKLQkJCQkgICAgKiBmaWxlIHN5c3RlbSBpcyByZWlzZXJmczoKLQkJCQkgICAgKiAiUmVJc0VyRnMiIG9yICJSZUlzRXIyRnMiIG9yICJSZUlzRXIzRnMiICovCi0gICAgX19sZTE2IHNfZnNfc3RhdGU7CSAgICAgICAgICAgLyogaXQgaXMgc2V0IHRvIHVzZWQgYnkgZnNjayB0byBtYXJrIHdoaWNoCi0JCQkJICAgICogcGhhc2Ugb2YgcmVidWlsZGluZyBpcyBkb25lICovCi0gICAgX19sZTMyIHNfaGFzaF9mdW5jdGlvbl9jb2RlOyAgICAvKiBpbmRpY2F0ZSwgd2hhdCBoYXNoIGZ1bmN0aW9uIGlzIGJlaW5nIHVzZQotCQkJCSAgICAqIHRvIHNvcnQgbmFtZXMgaW4gYSBkaXJlY3RvcnkqLwotICAgIF9fbGUxNiBzX3RyZWVfaGVpZ2h0OyAgICAgICAgICAgLyogaGVpZ2h0IG9mIGRpc2sgdHJlZSAqLwotICAgIF9fbGUxNiBzX2JtYXBfbnI7ICAgICAgICAgICAgICAgLyogYW1vdW50IG9mIGJpdG1hcCBibG9ja3MgbmVlZGVkIHRvIGFkZHJlc3MKLQkJCQkgICAgKiBlYWNoIGJsb2NrIG9mIGZpbGUgc3lzdGVtICovCi0gICAgX19sZTE2IHNfdmVyc2lvbjsgICAgICAgICAgICAgICAvKiB0aGlzIGZpZWxkIGlzIG9ubHkgcmVsaWFibGUgb24gZmlsZXN5c3RlbQotCQkJCSAgICAqIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwgKi8KLSAgICBfX2xlMTYgc19yZXNlcnZlZF9mb3Jfam91cm5hbDsgIC8qIHNpemUgaW4gYmxvY2tzIG9mIGpvdXJuYWwgYXJlYSBvbiBtYWluCi0JCQkJICAgICogZGV2aWNlLCB3ZSBuZWVkIHRvIGtlZXAgYWZ0ZXIKLQkJCQkgICAgKiBtYWtpbmcgZnMgd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLwkKK3N0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSB7CisJX19sZTMyIHNfYmxvY2tfY291bnQ7CS8qIGJsb2NrcyBjb3VudCAgICAgICAgICovCisJX19sZTMyIHNfZnJlZV9ibG9ja3M7CS8qIGZyZWUgYmxvY2tzIGNvdW50ICAgICovCisJX19sZTMyIHNfcm9vdF9ibG9jazsJLyogcm9vdCBibG9jayBudW1iZXIgICAgKi8KKwlzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgc19qb3VybmFsOworCV9fbGUxNiBzX2Jsb2Nrc2l6ZTsJLyogYmxvY2sgc2l6ZSAqLworCV9fbGUxNiBzX29pZF9tYXhzaXplOwkvKiBtYXggc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXksIHNlZQorCQkJCSAqIGdldF9vYmplY3RpZCgpIGNvbW1lbnRhcnkgICovCisJX19sZTE2IHNfb2lkX2N1cnNpemU7CS8qIGN1cnJlbnQgc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXkgKi8KKwlfX2xlMTYgc191bW91bnRfc3RhdGU7CS8qIHRoaXMgaXMgc2V0IHRvIDEgd2hlbiBmaWxlc3lzdGVtIHdhcworCQkJCSAqIHVtb3VudGVkLCB0byAyIC0gd2hlbiBub3QgKi8KKwljaGFyIHNfbWFnaWNbMTBdOwkvKiByZWlzZXJmcyBtYWdpYyBzdHJpbmcgaW5kaWNhdGVzIHRoYXQKKwkJCQkgKiBmaWxlIHN5c3RlbSBpcyByZWlzZXJmczoKKwkJCQkgKiAiUmVJc0VyRnMiIG9yICJSZUlzRXIyRnMiIG9yICJSZUlzRXIzRnMiICovCisJX19sZTE2IHNfZnNfc3RhdGU7CS8qIGl0IGlzIHNldCB0byB1c2VkIGJ5IGZzY2sgdG8gbWFyayB3aGljaAorCQkJCSAqIHBoYXNlIG9mIHJlYnVpbGRpbmcgaXMgZG9uZSAqLworCV9fbGUzMiBzX2hhc2hfZnVuY3Rpb25fY29kZTsJLyogaW5kaWNhdGUsIHdoYXQgaGFzaCBmdW5jdGlvbiBpcyBiZWluZyB1c2UKKwkJCQkJICogdG8gc29ydCBuYW1lcyBpbiBhIGRpcmVjdG9yeSovCisJX19sZTE2IHNfdHJlZV9oZWlnaHQ7CS8qIGhlaWdodCBvZiBkaXNrIHRyZWUgKi8KKwlfX2xlMTYgc19ibWFwX25yOwkvKiBhbW91bnQgb2YgYml0bWFwIGJsb2NrcyBuZWVkZWQgdG8gYWRkcmVzcworCQkJCSAqIGVhY2ggYmxvY2sgb2YgZmlsZSBzeXN0ZW0gKi8KKwlfX2xlMTYgc192ZXJzaW9uOwkvKiB0aGlzIGZpZWxkIGlzIG9ubHkgcmVsaWFibGUgb24gZmlsZXN5c3RlbQorCQkJCSAqIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwgKi8KKwlfX2xlMTYgc19yZXNlcnZlZF9mb3Jfam91cm5hbDsJLyogc2l6ZSBpbiBibG9ja3Mgb2Ygam91cm5hbCBhcmVhIG9uIG1haW4KKwkJCQkJICogZGV2aWNlLCB3ZSBuZWVkIHRvIGtlZXAgYWZ0ZXIKKwkJCQkJICogbWFraW5nIGZzIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogI2RlZmluZSBTQl9TSVpFX1YxIChzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxKSkKIAogLyogdGhpcyBpcyB0aGUgb24gZGlzayBzdXBlciBibG9jayAqLwotc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrCi17Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxIHNfdjE7Ci0gICAgX19sZTMyIHNfaW5vZGVfZ2VuZXJhdGlvbjsKLSAgICBfX2xlMzIgc19mbGFnczsgICAgICAgICAgICAgICAgICAvKiBSaWdodCBub3cgdXNlZCBvbmx5IGJ5IGlub2RlLWF0dHJpYnV0ZXMsIGlmIGVuYWJsZWQgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHNfdXVpZFsxNl07ICAgICAgIC8qIGZpbGVzeXN0ZW0gdW5pcXVlIGlkZW50aWZpZXIgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHNfbGFiZWxbMTZdOyAgICAgIC8qIGZpbGVzeXN0ZW0gdm9sdW1lIGxhYmVsICovCi0gICAgY2hhciBzX3VudXNlZFs4OF0gOyAgICAgICAgICAgICAvKiB6ZXJvIGZpbGxlZCBieSBta3JlaXNlcmZzIGFuZAotCQkJCSAgICAgKiByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MSgpCi0JCQkJICAgICAqIHNvIGFueSBhZGRpdGlvbnMgbXVzdCBiZSB1cGRhdGVkCi0JCQkJICAgICAqIHRoZXJlIGFzIHdlbGwuICovCi19ICBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrIHsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgc192MTsKKwlfX2xlMzIgc19pbm9kZV9nZW5lcmF0aW9uOworCV9fbGUzMiBzX2ZsYWdzOwkJLyogUmlnaHQgbm93IHVzZWQgb25seSBieSBpbm9kZS1hdHRyaWJ1dGVzLCBpZiBlbmFibGVkICovCisJdW5zaWduZWQgY2hhciBzX3V1aWRbMTZdOwkvKiBmaWxlc3lzdGVtIHVuaXF1ZSBpZGVudGlmaWVyICovCisJdW5zaWduZWQgY2hhciBzX2xhYmVsWzE2XTsJLyogZmlsZXN5c3RlbSB2b2x1bWUgbGFiZWwgKi8KKwljaGFyIHNfdW51c2VkWzg4XTsJLyogemVybyBmaWxsZWQgYnkgbWtyZWlzZXJmcyBhbmQKKwkJCQkgKiByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MSgpCisJCQkJICogc28gYW55IGFkZGl0aW9ucyBtdXN0IGJlIHVwZGF0ZWQKKwkJCQkgKiB0aGVyZSBhcyB3ZWxsLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiAjZGVmaW5lIFNCX1NJWkUgKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2spKQogCiAjZGVmaW5lIFJFSVNFUkZTX1ZFUlNJT05fMSAwCiAjZGVmaW5lIFJFSVNFUkZTX1ZFUlNJT05fMiAyCiAKLQogLy8gb24tZGlzayBzdXBlciBibG9jayBmaWVsZHMgY29udmVydGVkIHRvIGNwdSBmb3JtCiAjZGVmaW5lIFNCX0RJU0tfU1VQRVJfQkxPQ0socykgKFJFSVNFUkZTX1NCKHMpLT5zX3JzKQogI2RlZmluZSBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpICgmKFNCX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdjEpKQpAQCAtMjEwLDEzICsyMDUsMTIgQEAKICNkZWZpbmUgUFVUX1NCX1RSRUVfSEVJR0hUKHMsIHZhbCkgXAogICAgZG8geyBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX3RyZWVfaGVpZ2h0ID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgUFVUX1NCX1JFSVNFUkZTX1NUQVRFKHMsIHZhbCkgXAotICAgZG8geyBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX3Vtb3VudF9zdGF0ZSA9IGNwdV90b19sZTE2KHZhbCk7IH0gd2hpbGUgKDApIAorICAgZG8geyBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX3Vtb3VudF9zdGF0ZSA9IGNwdV90b19sZTE2KHZhbCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFBVVF9TQl9WRVJTSU9OKHMsIHZhbCkgXAogICAgZG8geyBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX3ZlcnNpb24gPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQogI2RlZmluZSBQVVRfU0JfQk1BUF9OUihzLCB2YWwpIFwKICAgIGRvIHsgU0JfVjFfRElTS19TVVBFUl9CTE9DSyhzKS0+c19ibWFwX25yID0gY3B1X3RvX2xlMTYgKHZhbCk7IH0gd2hpbGUgKDApCiAKLQogI2RlZmluZSBTQl9PTkRJU0tfSlAocykgKCZTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX2pvdXJuYWwpCiAjZGVmaW5lIFNCX09ORElTS19KT1VSTkFMX1NJWkUocykgXAogICAgICAgICAgbGUzMl90b19jcHUgKChTQl9PTkRJU0tfSlAocyktPmpwX2pvdXJuYWxfc2l6ZSkpCkBAIC0yMzEsMjEgKzIyNSwxOSBAQAogICAgICAgICAgYmxvY2sgPj0gU0JfSk9VUk5BTF8xc3RfUkVTRVJWRURfQkxPQ0socykgXAogICAgICAgICAgJiYgYmxvY2sgPCBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhzKSArICBcCiAgICAgICAgICAoKCFpc19yZWlzZXJmc19qcihTQl9ESVNLX1NVUEVSX0JMT0NLKHMpKSA/IFwKLSAgICAgICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocykgKyAxIDogU0JfT05ESVNLX1JFU0VSVkVEX0ZPUl9KT1VSTkFMKHMpKSkgCi0KLQorICAgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSArIDEgOiBTQl9PTkRJU0tfUkVTRVJWRURfRk9SX0pPVVJOQUwocykpKQogCiAJCQkJLyogdXNlZCBieSBnY2MgKi8KICNkZWZpbmUgUkVJU0VSRlNfU1VQRVJfTUFHSUMgMHg1MjY1NDk3MwogCQkJCS8qIHVzZWQgYnkgZmlsZSBzeXN0ZW0gdXRpbGl0aWVzIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vayBhdCB0aGUgc3VwZXJibG9jaywgZXRjLiAqLworCQkJCSAgIGxvb2sgYXQgdGhlIHN1cGVyYmxvY2ssIGV0Yy4gKi8KICNkZWZpbmUgUkVJU0VSRlNfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXJGcyIKICNkZWZpbmUgUkVJU0VSMkZTX1NVUEVSX01BR0lDX1NUUklORyAiUmVJc0VyMkZzIgogI2RlZmluZSBSRUlTRVIyRlNfSlJfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXIzRnMiCiAKLWludCBpc19yZWlzZXJmc18zXzUgKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzKTsKLWludCBpc19yZWlzZXJmc18zXzYgKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzKTsKLWludCBpc19yZWlzZXJmc19qciAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpOworaW50IGlzX3JlaXNlcmZzXzNfNShzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzKTsKK2ludCBpc19yZWlzZXJmc18zXzYoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyk7CitpbnQgaXNfcmVpc2VyZnNfanIoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyk7CiAKIC8qIFJlaXNlckZTIGxlYXZlcyB0aGUgZmlyc3QgNjRrIHVudXNlZCwgc28gdGhhdCBwYXJ0aXRpb24gbGFiZWxzIGhhdmUKICAgIGVub3VnaCBzcGFjZS4gIElmIHNvbWVvbmUgd2FudHMgdG8gd3JpdGUgYSBmYW5jeSBib290bG9hZGVyIHRoYXQKQEAgLTI3Miw4ICsyNjQsOCBAQAogdHlwZWRlZiBfX2xlMzIgdW5wX3Q7CiAKIHN0cnVjdCB1bmZtX25vZGVpbmZvIHsKLSAgICB1bnBfdCB1bmZtX25vZGVudW07Ci0gICAgdW5zaWduZWQgc2hvcnQgdW5mbV9mcmVlc3BhY2U7CisJdW5wX3QgdW5mbV9ub2RlbnVtOworCXVuc2lnbmVkIHNob3J0IHVuZm1fZnJlZXNwYWNlOwogfTsKIAogLyogdGhlcmUgYXJlIHR3byBmb3JtYXRzIG9mIGtleXM6IDMuNSBhbmQgMy42CkBAIC0yODUsNyArMjc3LDYgQEAKICNkZWZpbmUgU1RBVF9EQVRBX1YxIDAKICNkZWZpbmUgU1RBVF9EQVRBX1YyIDEKIAotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICpSRUlTRVJGU19JKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7CkBAIC0zNDMsMTUgKzMzNCwxMyBAQAogICAgZmlsZSB3b3VsZCBmaXQgaW50byBvbmUgRElSRUNUIGl0ZW0uCiAgICBQcmltYXJ5IGludGVudGlvbiBmb3IgdGhpcyBvbmUgaXMgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UgYnkgZGVjcmVhc2luZwogICAgc2Vla2luZy4KLSovICAgCisqLwogI2RlZmluZSBTVE9SRV9UQUlMX0lOX1VORk1fUzIobl9maWxlX3NpemUsbl90YWlsX3NpemUsbl9ibG9ja19zaXplKSBcCiAoXAogICAoIShuX3RhaWxfc2l6ZSkpIHx8IFwKICAgKCgobl9maWxlX3NpemUpID4gTUFYX0RJUkVDVF9JVEVNX0xFTihuX2Jsb2NrX3NpemUpKSApIFwKICkKIAotCi0KIC8qCiAgKiB2YWx1ZXMgZm9yIHNfdW1vdW50X3N0YXRlIGZpZWxkCiAgKi8KQEAgLTM2NCw5ICszNTMsOSBAQAogI2RlZmluZSBUWVBFX1NUQVRfREFUQSAwCiAjZGVmaW5lIFRZUEVfSU5ESVJFQ1QgMQogI2RlZmluZSBUWVBFX0RJUkVDVCAyCi0jZGVmaW5lIFRZUEVfRElSRU5UUlkgMyAKLSNkZWZpbmUgVFlQRV9NQVhUWVBFIDMgCi0jZGVmaW5lIFRZUEVfQU5ZIDE1IC8vIEZJWE1FOiBjb21tZW50IGlzIHJlcXVpcmVkCisjZGVmaW5lIFRZUEVfRElSRU5UUlkgMworI2RlZmluZSBUWVBFX01BWFRZUEUgMworI2RlZmluZSBUWVBFX0FOWSAxNQkJLy8gRklYTUU6IGNvbW1lbnQgaXMgcmVxdWlyZWQKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICBLRVkgJiBJVEVNIEhFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNzYsNjAgKzM2NSw2MiBAQAogLy8gZGlyZWN0b3JpZXMgdXNlIHRoaXMga2V5IGFzIHdlbGwgYXMgb2xkIGZpbGVzCiAvLwogc3RydWN0IG9mZnNldF92MSB7Ci0gICAgX19sZTMyIGtfb2Zmc2V0OwotICAgIF9fbGUzMiBrX3VuaXF1ZW5lc3M7CisJX19sZTMyIGtfb2Zmc2V0OworCV9fbGUzMiBrX3VuaXF1ZW5lc3M7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCBvZmZzZXRfdjIgewogCV9fbGU2NCB2OwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCi1zdGF0aWMgaW5saW5lIF9fdTE2IG9mZnNldF92Ml9rX3R5cGUoIGNvbnN0IHN0cnVjdCBvZmZzZXRfdjIgKnYyICkKK3N0YXRpYyBpbmxpbmUgX191MTYgb2Zmc2V0X3YyX2tfdHlwZShjb25zdCBzdHJ1Y3Qgb2Zmc2V0X3YyICp2MikKIHsKIAlfX3U4IHR5cGUgPSBsZTY0X3RvX2NwdSh2Mi0+dikgPj4gNjA7Ci0JcmV0dXJuICh0eXBlIDw9IFRZUEVfTUFYVFlQRSk/dHlwZTpUWVBFX0FOWTsKLX0KLSAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfb2Zmc2V0X3YyX2tfdHlwZSggc3RydWN0IG9mZnNldF92MiAqdjIsIGludCB0eXBlICkKLXsKLQl2Mi0+diA9ICh2Mi0+diAmIGNwdV90b19sZTY0KH4wVUxMPj40KSkgfCBjcHVfdG9fbGU2NCgoX191NjQpdHlwZTw8NjApOwotfQotIAotc3RhdGljIGlubGluZSBsb2ZmX3Qgb2Zmc2V0X3YyX2tfb2Zmc2V0KCBjb25zdCBzdHJ1Y3Qgb2Zmc2V0X3YyICp2MiApCi17Ci0JcmV0dXJuIGxlNjRfdG9fY3B1KHYyLT52KSAmICh+MFVMTD4+NCk7CisJcmV0dXJuICh0eXBlIDw9IFRZUEVfTUFYVFlQRSkgPyB0eXBlIDogVFlQRV9BTlk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfb2Zmc2V0X3YyX2tfb2Zmc2V0KCBzdHJ1Y3Qgb2Zmc2V0X3YyICp2MiwgbG9mZl90IG9mZnNldCApewotCW9mZnNldCAmPSAofjBVTEw+PjQpOwotCXYyLT52ID0gKHYyLT52ICYgY3B1X3RvX2xlNjQoMTVVTEw8PDYwKSkgfCBjcHVfdG9fbGU2NChvZmZzZXQpOworc3RhdGljIGlubGluZSB2b2lkIHNldF9vZmZzZXRfdjJfa190eXBlKHN0cnVjdCBvZmZzZXRfdjIgKnYyLCBpbnQgdHlwZSkKK3sKKwl2Mi0+diA9CisJICAgICh2Mi0+diAmIGNwdV90b19sZTY0KH4wVUxMID4+IDQpKSB8IGNwdV90b19sZTY0KChfX3U2NCkgdHlwZSA8PCA2MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9mZl90IG9mZnNldF92Ml9rX29mZnNldChjb25zdCBzdHJ1Y3Qgb2Zmc2V0X3YyICp2MikKK3sKKwlyZXR1cm4gbGU2NF90b19jcHUodjItPnYpICYgKH4wVUxMID4+IDQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X29mZnNldF92Ml9rX29mZnNldChzdHJ1Y3Qgb2Zmc2V0X3YyICp2MiwgbG9mZl90IG9mZnNldCkKK3sKKwlvZmZzZXQgJj0gKH4wVUxMID4+IDQpOworCXYyLT52ID0gKHYyLT52ICYgY3B1X3RvX2xlNjQoMTVVTEwgPDwgNjApKSB8IGNwdV90b19sZTY0KG9mZnNldCk7CiB9CiAKIC8qIEtleSBvZiBhbiBpdGVtIGRldGVybWluZXMgaXRzIGxvY2F0aW9uIGluIHRoZSBTK3RyZWUsIGFuZAogICAgaXMgY29tcG9zZWQgb2YgNCBjb21wb25lbnRzICovCiBzdHJ1Y3QgcmVpc2VyZnNfa2V5IHsKLSAgICBfX2xlMzIga19kaXJfaWQ7ICAgIC8qIHBhY2tpbmcgbG9jYWxpdHk6IGJ5IGRlZmF1bHQgcGFyZW50Ci0JCQkgIGRpcmVjdG9yeSBvYmplY3QgaWQgKi8KLSAgICBfX2xlMzIga19vYmplY3RpZDsgIC8qIG9iamVjdCBpZGVudGlmaWVyICovCi0gICAgdW5pb24gewotCXN0cnVjdCBvZmZzZXRfdjEga19vZmZzZXRfdjE7Ci0Jc3RydWN0IG9mZnNldF92MiBrX29mZnNldF92MjsKLSAgICB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdTsKKwlfX2xlMzIga19kaXJfaWQ7CS8qIHBhY2tpbmcgbG9jYWxpdHk6IGJ5IGRlZmF1bHQgcGFyZW50CisJCQkJICAgZGlyZWN0b3J5IG9iamVjdCBpZCAqLworCV9fbGUzMiBrX29iamVjdGlkOwkvKiBvYmplY3QgaWRlbnRpZmllciAqLworCXVuaW9uIHsKKwkJc3RydWN0IG9mZnNldF92MSBrX29mZnNldF92MTsKKwkJc3RydWN0IG9mZnNldF92MiBrX29mZnNldF92MjsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IGluX2NvcmVfa2V5IHsKLSAgICBfX3UzMiBrX2Rpcl9pZDsgICAgLyogcGFja2luZyBsb2NhbGl0eTogYnkgZGVmYXVsdCBwYXJlbnQKLQkJCSAgZGlyZWN0b3J5IG9iamVjdCBpZCAqLwotICAgIF9fdTMyIGtfb2JqZWN0aWQ7ICAvKiBvYmplY3QgaWRlbnRpZmllciAqLwotICAgIF9fdTY0IGtfb2Zmc2V0OwotICAgIF9fdTgga190eXBlOworCV9fdTMyIGtfZGlyX2lkOwkJLyogcGFja2luZyBsb2NhbGl0eTogYnkgZGVmYXVsdCBwYXJlbnQKKwkJCQkgICBkaXJlY3Rvcnkgb2JqZWN0IGlkICovCisJX191MzIga19vYmplY3RpZDsJLyogb2JqZWN0IGlkZW50aWZpZXIgKi8KKwlfX3U2NCBrX29mZnNldDsKKwlfX3U4IGtfdHlwZTsKIH07CiAKIHN0cnVjdCBjcHVfa2V5IHsKLSAgICBzdHJ1Y3QgaW5fY29yZV9rZXkgb25fZGlza19rZXk7Ci0gICAgaW50IHZlcnNpb247Ci0gICAgaW50IGtleV9sZW5ndGg7IC8qIDMgaW4gYWxsIGNhc2VzIGJ1dCBkaXJlY3QyaW5kaXJlY3QgYW5kCi0JCSAgICAgICBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbiAqLworCXN0cnVjdCBpbl9jb3JlX2tleSBvbl9kaXNrX2tleTsKKwlpbnQgdmVyc2lvbjsKKwlpbnQga2V5X2xlbmd0aDsJCS8qIDMgaW4gYWxsIGNhc2VzIGJ1dCBkaXJlY3QyaW5kaXJlY3QgYW5kCisJCQkJICAgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24gKi8KIH07CiAKIC8qIE91ciBmdW5jdGlvbiBmb3IgY29tcGFyaW5nIGtleXMgY2FuIGNvbXBhcmUga2V5cyBvZiBkaWZmZXJlbnQKQEAgLTQ3NSw4ICs0NjYsNyBAQAogICAgIGluZGlyZWN0IGl0ZW1zKSBhbmQgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgaXRlbSBpdHNlbGYKICAgICB3aXRoaW4gdGhlIGJsb2NrLiAgKi8KIAotc3RydWN0IGl0ZW1faGVhZAoteworc3RydWN0IGl0ZW1faGVhZCB7CiAJLyogRXZlcnl0aGluZyBpbiB0aGUgdHJlZSBpcyBmb3VuZCBieSBzZWFyY2hpbmcgZm9yIGl0IGJhc2VkIG9uCiAJICogaXRzIGtleS4qLwogCXN0cnVjdCByZWlzZXJmc19rZXkgaWhfa2V5OwpAQCAtNDkyLDEzICs0ODIsMTMgQEAKIAkJICAgbnVtYmVyIG9mIGRpcmVjdG9yeSBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkgaXRlbS4gKi8KIAkJX19sZTE2IGloX2VudHJ5X2NvdW50OwogCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OwotCV9fbGUxNiBpaF9pdGVtX2xlbjsgICAgICAgICAgIC8qIHRvdGFsIHNpemUgb2YgdGhlIGl0ZW0gYm9keSAqLwotCV9fbGUxNiBpaF9pdGVtX2xvY2F0aW9uOyAgICAgIC8qIGFuIG9mZnNldCB0byB0aGUgaXRlbSBib2R5Ci0JCQkJICAgICAgKiB3aXRoaW4gdGhlIGJsb2NrICovCi0JX19sZTE2IGloX3ZlcnNpb247CSAgICAgLyogMCBmb3IgYWxsIG9sZCBpdGVtcywgMiBmb3IgbmV3Ci0JCQkJCW9uZXMuIEhpZ2hlc3QgYml0IGlzIHNldCBieSBmc2NrCi0JCQkJCXRlbXBvcmFyeSwgY2xlYW5lZCBhZnRlciBhbGwKLQkJCQkJZG9uZSAqLworCV9fbGUxNiBpaF9pdGVtX2xlbjsJLyogdG90YWwgc2l6ZSBvZiB0aGUgaXRlbSBib2R5ICovCisJX19sZTE2IGloX2l0ZW1fbG9jYXRpb247CS8qIGFuIG9mZnNldCB0byB0aGUgaXRlbSBib2R5CisJCQkJCSAqIHdpdGhpbiB0aGUgYmxvY2sgKi8KKwlfX2xlMTYgaWhfdmVyc2lvbjsJLyogMCBmb3IgYWxsIG9sZCBpdGVtcywgMiBmb3IgbmV3CisJCQkJICAgb25lcy4gSGlnaGVzdCBiaXQgaXMgc2V0IGJ5IGZzY2sKKwkJCQkgICB0ZW1wb3JhcnksIGNsZWFuZWQgYWZ0ZXIgYWxsCisJCQkJICAgZG9uZSAqLwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogLyogc2l6ZSBvZiBpdGVtIGhlYWRlciAgICAgKi8KICNkZWZpbmUgSUhfU0laRSAoc2l6ZW9mKHN0cnVjdCBpdGVtX2hlYWQpKQpAQCAtNTE1LDcgKzUwNSw2IEBACiAjZGVmaW5lIHB1dF9paF9sb2NhdGlvbihpaCwgdmFsKSAgICAgZG8geyAoaWgpLT5paF9pdGVtX2xvY2F0aW9uID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgcHV0X2loX2l0ZW1fbGVuKGloLCB2YWwpICAgICBkbyB7IChpaCktPmloX2l0ZW1fbGVuID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkKIAotCiAjZGVmaW5lIHVucmVhY2hhYmxlX2l0ZW0oaWgpIChpaF92ZXJzaW9uKGloKSAmICgxIDw8IDE1KSkKIAogI2RlZmluZSBnZXRfaWhfZnJlZV9zcGFjZShpaCkgKGloX3ZlcnNpb24gKGloKSA9PSBLRVlfRk9STUFUXzNfNiA/IDAgOiBpaF9mcmVlX3NwYWNlIChpaCkpCkBAIC01MzcsNDAgKzUyNiw0OCBAQAogI2RlZmluZSBWMV9JTkRJUkVDVF9VTklRVUVORVNTIDB4ZmZmZmZmZmUKICNkZWZpbmUgVjFfRElSRUNUX1VOSVFVRU5FU1MgMHhmZmZmZmZmZgogI2RlZmluZSBWMV9ESVJFTlRSWV9VTklRVUVORVNTIDUwMAotI2RlZmluZSBWMV9BTllfVU5JUVVFTkVTUyA1NTUgLy8gRklYTUU6IGNvbW1lbnQgaXMgcmVxdWlyZWQKKyNkZWZpbmUgVjFfQU5ZX1VOSVFVRU5FU1MgNTU1CS8vIEZJWE1FOiBjb21tZW50IGlzIHJlcXVpcmVkCiAKIC8vCiAvLyBoZXJlIGFyZSBjb252ZXJzaW9uIHJvdXRpbmVzCiAvLwotc3RhdGljIGlubGluZSBpbnQgdW5pcXVlbmVzczJ0eXBlIChfX3UzMiB1bmlxdWVuZXNzKSBDT05TVEY7Ci1zdGF0aWMgaW5saW5lIGludCB1bmlxdWVuZXNzMnR5cGUgKF9fdTMyIHVuaXF1ZW5lc3MpCitzdGF0aWMgaW5saW5lIGludCB1bmlxdWVuZXNzMnR5cGUoX191MzIgdW5pcXVlbmVzcykgQ09OU1RGOworc3RhdGljIGlubGluZSBpbnQgdW5pcXVlbmVzczJ0eXBlKF9fdTMyIHVuaXF1ZW5lc3MpCiB7Ci0gICAgc3dpdGNoICgoaW50KXVuaXF1ZW5lc3MpIHsKLSAgICBjYXNlIFYxX1NEX1VOSVFVRU5FU1M6IHJldHVybiBUWVBFX1NUQVRfREFUQTsKLSAgICBjYXNlIFYxX0lORElSRUNUX1VOSVFVRU5FU1M6IHJldHVybiBUWVBFX0lORElSRUNUOwotICAgIGNhc2UgVjFfRElSRUNUX1VOSVFVRU5FU1M6IHJldHVybiBUWVBFX0RJUkVDVDsKLSAgICBjYXNlIFYxX0RJUkVOVFJZX1VOSVFVRU5FU1M6IHJldHVybiBUWVBFX0RJUkVOVFJZOwotICAgIGRlZmF1bHQ6Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy01MDA6IHVua25vd24gdW5pcXVlbmVzcyAlZCIsCi0JCQkgICAgICB1bmlxdWVuZXNzKTsKKwlzd2l0Y2ggKChpbnQpdW5pcXVlbmVzcykgeworCWNhc2UgVjFfU0RfVU5JUVVFTkVTUzoKKwkJcmV0dXJuIFRZUEVfU1RBVF9EQVRBOworCWNhc2UgVjFfSU5ESVJFQ1RfVU5JUVVFTkVTUzoKKwkJcmV0dXJuIFRZUEVfSU5ESVJFQ1Q7CisJY2FzZSBWMV9ESVJFQ1RfVU5JUVVFTkVTUzoKKwkJcmV0dXJuIFRZUEVfRElSRUNUOworCWNhc2UgVjFfRElSRU5UUllfVU5JUVVFTkVTUzoKKwkJcmV0dXJuIFRZUEVfRElSRU5UUlk7CisJZGVmYXVsdDoKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAidnMtNTAwOiB1bmtub3duIHVuaXF1ZW5lc3MgJWQiLAorCQkJCSB1bmlxdWVuZXNzKTsKIAljYXNlIFYxX0FOWV9VTklRVUVORVNTOgotCSAgICByZXR1cm4gVFlQRV9BTlk7Ci0gICAgfQorCQlyZXR1cm4gVFlQRV9BTlk7CisJfQogfQogCi1zdGF0aWMgaW5saW5lIF9fdTMyIHR5cGUydW5pcXVlbmVzcyAoaW50IHR5cGUpIENPTlNURjsKLXN0YXRpYyBpbmxpbmUgX191MzIgdHlwZTJ1bmlxdWVuZXNzIChpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgX191MzIgdHlwZTJ1bmlxdWVuZXNzKGludCB0eXBlKSBDT05TVEY7CitzdGF0aWMgaW5saW5lIF9fdTMyIHR5cGUydW5pcXVlbmVzcyhpbnQgdHlwZSkKIHsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRZUEVfU1RBVF9EQVRBOiByZXR1cm4gVjFfU0RfVU5JUVVFTkVTUzsKLSAgICBjYXNlIFRZUEVfSU5ESVJFQ1Q6IHJldHVybiBWMV9JTkRJUkVDVF9VTklRVUVORVNTOwotICAgIGNhc2UgVFlQRV9ESVJFQ1Q6IHJldHVybiBWMV9ESVJFQ1RfVU5JUVVFTkVTUzsKLSAgICBjYXNlIFRZUEVfRElSRU5UUlk6IHJldHVybiBWMV9ESVJFTlRSWV9VTklRVUVORVNTOwotICAgIGRlZmF1bHQ6Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy01MDE6IHVua25vd24gdHlwZSAlZCIsIHR5cGUpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVFlQRV9TVEFUX0RBVEE6CisJCXJldHVybiBWMV9TRF9VTklRVUVORVNTOworCWNhc2UgVFlQRV9JTkRJUkVDVDoKKwkJcmV0dXJuIFYxX0lORElSRUNUX1VOSVFVRU5FU1M7CisJY2FzZSBUWVBFX0RJUkVDVDoKKwkJcmV0dXJuIFYxX0RJUkVDVF9VTklRVUVORVNTOworCWNhc2UgVFlQRV9ESVJFTlRSWToKKwkJcmV0dXJuIFYxX0RJUkVOVFJZX1VOSVFVRU5FU1M7CisJZGVmYXVsdDoKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAidnMtNTAxOiB1bmtub3duIHR5cGUgJWQiLCB0eXBlKTsKIAljYXNlIFRZUEVfQU5ZOgotCSAgICByZXR1cm4gVjFfQU5ZX1VOSVFVRU5FU1M7Ci0gICAgfQorCQlyZXR1cm4gVjFfQU5ZX1VOSVFVRU5FU1M7CisJfQogfQogCiAvLwpAQCAtNTc4LDU3ICs1NzUsNTYgQEAKIC8vIHRoZXJlIGlzIG5vIHdheSB0byBnZXQgdmVyc2lvbiBvZiBvYmplY3QgZnJvbSBrZXksIHNvLCBwcm92aWRlCiAvLyB2ZXJzaW9uIHRvIHRoZXNlIGRlZmluZXMKIC8vCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBsZV9rZXlfa19vZmZzZXQgKGludCB2ZXJzaW9uLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQorc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfa2V5X2tfb2Zmc2V0KGludCB2ZXJzaW9uLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KQogewotICAgIHJldHVybiAodmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgPwotICAgICAgICBsZTMyX3RvX2NwdSgga2V5LT51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0ICkgOgotCW9mZnNldF92Ml9rX29mZnNldCggJihrZXktPnUua19vZmZzZXRfdjIpICk7CisJcmV0dXJuICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/CisJICAgIGxlMzJfdG9fY3B1KGtleS0+dS5rX29mZnNldF92MS5rX29mZnNldCkgOgorCSAgICBvZmZzZXRfdjJfa19vZmZzZXQoJihrZXktPnUua19vZmZzZXRfdjIpKTsKIH0KIAotc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfaWhfa19vZmZzZXQgKGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKiBpaCkKK3N0YXRpYyBpbmxpbmUgbG9mZl90IGxlX2loX2tfb2Zmc2V0KGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKmloKQogewotICAgIHJldHVybiBsZV9rZXlfa19vZmZzZXQgKGloX3ZlcnNpb24gKGloKSwgJihpaC0+aWhfa2V5KSk7CisJcmV0dXJuIGxlX2tleV9rX29mZnNldChpaF92ZXJzaW9uKGloKSwgJihpaC0+aWhfa2V5KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbG9mZl90IGxlX2tleV9rX3R5cGUgKGludCB2ZXJzaW9uLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQorc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfa2V5X2tfdHlwZShpbnQgdmVyc2lvbiwgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KQogewotICAgIHJldHVybiAodmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgPwotICAgICAgICB1bmlxdWVuZXNzMnR5cGUoIGxlMzJfdG9fY3B1KCBrZXktPnUua19vZmZzZXRfdjEua191bmlxdWVuZXNzKSkgOgotCW9mZnNldF92Ml9rX3R5cGUoICYoa2V5LT51Lmtfb2Zmc2V0X3YyKSApOworCXJldHVybiAodmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgPworCSAgICB1bmlxdWVuZXNzMnR5cGUobGUzMl90b19jcHUoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfdW5pcXVlbmVzcykpIDoKKwkgICAgb2Zmc2V0X3YyX2tfdHlwZSgmKGtleS0+dS5rX29mZnNldF92MikpOwogfQogCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBsZV9paF9rX3R5cGUgKGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKiBpaCkKK3N0YXRpYyBpbmxpbmUgbG9mZl90IGxlX2loX2tfdHlwZShjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICppaCkKIHsKLSAgICByZXR1cm4gbGVfa2V5X2tfdHlwZSAoaWhfdmVyc2lvbiAoaWgpLCAmKGloLT5paF9rZXkpKTsKKwlyZXR1cm4gbGVfa2V5X2tfdHlwZShpaF92ZXJzaW9uKGloKSwgJihpaC0+aWhfa2V5KSk7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9rZXlfa19vZmZzZXQgKGludCB2ZXJzaW9uLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCBsb2ZmX3Qgb2Zmc2V0KQorc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9rZXlfa19vZmZzZXQoaW50IHZlcnNpb24sIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwKKwkJCQkgICAgICAgbG9mZl90IG9mZnNldCkKIHsKLSAgICAodmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgPwotICAgICAgICAodm9pZCkoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0ID0gY3B1X3RvX2xlMzIgKG9mZnNldCkpIDogLyogamRtIGNoZWNrICovCi0JKHZvaWQpKHNldF9vZmZzZXRfdjJfa19vZmZzZXQoICYoa2V5LT51Lmtfb2Zmc2V0X3YyKSwgb2Zmc2V0ICkpOworCSh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/ICh2b2lkKShrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpKSA6CS8qIGpkbSBjaGVjayAqLworCSAgICAodm9pZCkoc2V0X29mZnNldF92Ml9rX29mZnNldCgmKGtleS0+dS5rX29mZnNldF92MiksIG9mZnNldCkpOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVfaWhfa19vZmZzZXQgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgbG9mZl90IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVfaWhfa19vZmZzZXQoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGxvZmZfdCBvZmZzZXQpCiB7Ci0gICAgc2V0X2xlX2tleV9rX29mZnNldCAoaWhfdmVyc2lvbiAoaWgpLCAmKGloLT5paF9rZXkpLCBvZmZzZXQpOworCXNldF9sZV9rZXlfa19vZmZzZXQoaWhfdmVyc2lvbihpaCksICYoaWgtPmloX2tleSksIG9mZnNldCk7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9rZXlfa190eXBlIChpbnQgdmVyc2lvbiwgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgaW50IHR5cGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2tleV9rX3R5cGUoaW50IHZlcnNpb24sIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwKKwkJCQkgICAgIGludCB0eXBlKQogewotICAgICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/Ci0gICAgICAgICh2b2lkKShrZXktPnUua19vZmZzZXRfdjEua191bmlxdWVuZXNzID0gY3B1X3RvX2xlMzIodHlwZTJ1bmlxdWVuZXNzKHR5cGUpKSk6Ci0JKHZvaWQpKHNldF9vZmZzZXRfdjJfa190eXBlKCAmKGtleS0+dS5rX29mZnNldF92MiksIHR5cGUgKSk7CisJKHZlcnNpb24gPT0gS0VZX0ZPUk1BVF8zXzUpID8KKwkgICAgKHZvaWQpKGtleS0+dS5rX29mZnNldF92MS5rX3VuaXF1ZW5lc3MgPQorCQkgICBjcHVfdG9fbGUzMih0eXBlMnVuaXF1ZW5lc3ModHlwZSkpKQorCSAgICA6ICh2b2lkKShzZXRfb2Zmc2V0X3YyX2tfdHlwZSgmKGtleS0+dS5rX29mZnNldF92MiksIHR5cGUpKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVfaWhfa190eXBlIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCB0eXBlKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9paF9rX3R5cGUoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCB0eXBlKQogewotICAgIHNldF9sZV9rZXlfa190eXBlIChpaF92ZXJzaW9uIChpaCksICYoaWgtPmloX2tleSksIHR5cGUpOworCXNldF9sZV9rZXlfa190eXBlKGloX3ZlcnNpb24oaWgpLCAmKGloLT5paF9rZXkpLCB0eXBlKTsKIH0KIAotCiAjZGVmaW5lIGlzX2RpcmVudHJ5X2xlX2tleSh2ZXJzaW9uLGtleSkgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKICNkZWZpbmUgaXNfZGlyZWN0X2xlX2tleSh2ZXJzaW9uLGtleSkgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFQ1QpCiAjZGVmaW5lIGlzX2luZGlyZWN0X2xlX2tleSh2ZXJzaW9uLGtleSkgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9JTkRJUkVDVCkKQEAgLTY0MiwzNCArNjM4LDMyIEBACiAjZGVmaW5lIGlzX2luZGlyZWN0X2xlX2loKGloKSBpc19pbmRpcmVjdF9sZV9rZXkgKGloX3ZlcnNpb24oaWgpLCAmKChpaCktPmloX2tleSkpCiAjZGVmaW5lIGlzX3N0YXRkYXRhX2xlX2loKGloKSBpc19zdGF0ZGF0YV9sZV9rZXkgKGloX3ZlcnNpb24gKGloKSwgJigoaWgpLT5paF9rZXkpKQogCi0KLQogLy8KIC8vIGtleSBpcyBwb2ludGVyIHRvIGNwdSBrZXksIHJlc3VsdCBpcyBjcHUKIC8vCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBjcHVfa2V5X2tfb2Zmc2V0IChjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3N0YXRpYyBpbmxpbmUgbG9mZl90IGNwdV9rZXlfa19vZmZzZXQoY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSkKIHsKLSAgICByZXR1cm4ga2V5LT5vbl9kaXNrX2tleS5rX29mZnNldDsKKwlyZXR1cm4ga2V5LT5vbl9kaXNrX2tleS5rX29mZnNldDsKIH0KIAotc3RhdGljIGlubGluZSBsb2ZmX3QgY3B1X2tleV9rX3R5cGUgKGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIGlubGluZSBsb2ZmX3QgY3B1X2tleV9rX3R5cGUoY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSkKIHsKLSAgICByZXR1cm4ga2V5LT5vbl9kaXNrX2tleS5rX3R5cGU7CisJcmV0dXJuIGtleS0+b25fZGlza19rZXkua190eXBlOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9rZXlfa19vZmZzZXQgKHN0cnVjdCBjcHVfa2V5ICoga2V5LCBsb2ZmX3Qgb2Zmc2V0KQorc3RhdGljIGlubGluZSB2b2lkIHNldF9jcHVfa2V5X2tfb2Zmc2V0KHN0cnVjdCBjcHVfa2V5ICprZXksIGxvZmZfdCBvZmZzZXQpCiB7CiAJa2V5LT5vbl9kaXNrX2tleS5rX29mZnNldCA9IG9mZnNldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9jcHVfa2V5X2tfdHlwZSAoc3RydWN0IGNwdV9rZXkgKiBrZXksIGludCB0eXBlKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9jcHVfa2V5X2tfdHlwZShzdHJ1Y3QgY3B1X2tleSAqa2V5LCBpbnQgdHlwZSkKIHsKIAlrZXktPm9uX2Rpc2tfa2V5LmtfdHlwZSA9IHR5cGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVfa2V5X2tfb2Zmc2V0X2RlYyAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2tleV9rX29mZnNldF9kZWMoc3RydWN0IGNwdV9rZXkgKmtleSkKIHsKLQlrZXktPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0IC0tOworCWtleS0+b25fZGlza19rZXkua19vZmZzZXQtLTsKIH0KIAogI2RlZmluZSBpc19kaXJlbnRyeV9jcHVfa2V5KGtleSkgKGNwdV9rZXlfa190eXBlIChrZXkpID09IFRZUEVfRElSRU5UUlkpCkBAIC02NzcsMzQgKzY3MSwyNSBAQAogI2RlZmluZSBpc19pbmRpcmVjdF9jcHVfa2V5KGtleSkgKGNwdV9rZXlfa190eXBlIChrZXkpID09IFRZUEVfSU5ESVJFQ1QpCiAjZGVmaW5lIGlzX3N0YXRkYXRhX2NwdV9rZXkoa2V5KSAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9TVEFUX0RBVEEpCiAKLQogLyogYXJlIHRoZXNlIHVzZWQgPyAqLwogI2RlZmluZSBpc19kaXJlbnRyeV9jcHVfaWgoaWgpIChpc19kaXJlbnRyeV9jcHVfa2V5ICgmKChpaCktPmloX2tleSkpKQogI2RlZmluZSBpc19kaXJlY3RfY3B1X2loKGloKSAoaXNfZGlyZWN0X2NwdV9rZXkgKCYoKGloKS0+aWhfa2V5KSkpCiAjZGVmaW5lIGlzX2luZGlyZWN0X2NwdV9paChpaCkgKGlzX2luZGlyZWN0X2NwdV9rZXkgKCYoKGloKS0+aWhfa2V5KSkpCiAjZGVmaW5lIGlzX3N0YXRkYXRhX2NwdV9paChpaCkgKGlzX3N0YXRkYXRhX2NwdV9rZXkgKCYoKGloKS0+aWhfa2V5KSkpCiAKLQotCi0KLQogI2RlZmluZSBJX0tfS0VZX0lOX0lURU0ocF9zX2loLCBwX3Nfa2V5LCBuX2Jsb2Nrc2l6ZSkgXAogICAgICggISBDT01QX1NIT1JUX0tFWVMocF9zX2loLCBwX3Nfa2V5KSAmJiBcCiAgICAgICAgICAgSV9PRkZfQllURV9JTl9JVEVNKHBfc19paCwga19vZmZzZXQgKHBfc19rZXkpLCBuX2Jsb2Nrc2l6ZSkgKQogCi0vKiBtYXhpbWFsIGxlbmd0aCBvZiBpdGVtICovIAorLyogbWF4aW1hbCBsZW5ndGggb2YgaXRlbSAqLwogI2RlZmluZSBNQVhfSVRFTV9MRU4oYmxvY2tfc2l6ZSkgKGJsb2NrX3NpemUgLSBCTEtIX1NJWkUgLSBJSF9TSVpFKQogI2RlZmluZSBNSU5fSVRFTV9MRU4gMQogCi0KIC8qIG9iamVjdCBpZGVudGlmaWVyIGZvciByb290IGRpciAqLwogI2RlZmluZSBSRUlTRVJGU19ST09UX09CSkVDVElEIDIKICNkZWZpbmUgUkVJU0VSRlNfUk9PVF9QQVJFTlRfT0JKRUNUSUQgMQogZXh0ZXJuIHN0cnVjdCByZWlzZXJmc19rZXkgcm9vdF9rZXk7CiAKLQotCi0KIC8qIAogICogUGljdHVyZSByZXByZXNlbnRzIGEgbGVhZiBvZiB0aGUgUyt0cmVlCiAgKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkBAIC03MTYsMTMgKzcwMSwxMyBAQAogCiAvKiBIZWFkZXIgb2YgYSBkaXNrIGJsb2NrLiAgTW9yZSBwcmVjaXNlbHksIGhlYWRlciBvZiBhIGZvcm1hdHRlZCBsZWFmCiAgICBvciBpbnRlcm5hbCBub2RlLCBhbmQgbm90IHRoZSBoZWFkZXIgb2YgYW4gdW5mb3JtYXR0ZWQgbm9kZS4gKi8KLXN0cnVjdCBibG9ja19oZWFkIHsgICAgICAgCi0gIF9fbGUxNiBibGtfbGV2ZWw7ICAgICAgICAvKiBMZXZlbCBvZiBhIGJsb2NrIGluIHRoZSB0cmVlLiAqLwotICBfX2xlMTYgYmxrX25yX2l0ZW07ICAgICAgLyogTnVtYmVyIG9mIGtleXMvaXRlbXMgaW4gYSBibG9jay4gKi8KLSAgX19sZTE2IGJsa19mcmVlX3NwYWNlOyAgIC8qIEJsb2NrIGZyZWUgc3BhY2UgaW4gYnl0ZXMuICovCi0gIF9fbGUxNiBibGtfcmVzZXJ2ZWQ7Ci0JCQkJLyogZHVtcCB0aGlzIGluIHY0L3BsYW5BICovCi0gIHN0cnVjdCByZWlzZXJmc19rZXkgIGJsa19yaWdodF9kZWxpbV9rZXk7IC8qIGtlcHQgb25seSBmb3IgY29tcGF0aWJpbGl0eSAqLworc3RydWN0IGJsb2NrX2hlYWQgeworCV9fbGUxNiBibGtfbGV2ZWw7CS8qIExldmVsIG9mIGEgYmxvY2sgaW4gdGhlIHRyZWUuICovCisJX19sZTE2IGJsa19ucl9pdGVtOwkvKiBOdW1iZXIgb2Yga2V5cy9pdGVtcyBpbiBhIGJsb2NrLiAqLworCV9fbGUxNiBibGtfZnJlZV9zcGFjZTsJLyogQmxvY2sgZnJlZSBzcGFjZSBpbiBieXRlcy4gKi8KKwlfX2xlMTYgYmxrX3Jlc2VydmVkOworCS8qIGR1bXAgdGhpcyBpbiB2NC9wbGFuQSAqLworCXN0cnVjdCByZWlzZXJmc19rZXkgYmxrX3JpZ2h0X2RlbGltX2tleTsJLyoga2VwdCBvbmx5IGZvciBjb21wYXRpYmlsaXR5ICovCiB9OwogCiAjZGVmaW5lIEJMS0hfU0laRSAgICAgICAgICAgICAgICAgICAgIChzaXplb2Yoc3RydWN0IGJsb2NrX2hlYWQpKQpAQCAtNzQxLDEyICs3MjYsMTIgQEAKICAqIHZhbHVlcyBmb3IgYmxrX2xldmVsIGZpZWxkIG9mIHRoZSBzdHJ1Y3QgYmxvY2tfaGVhZAogICovCiAKLSNkZWZpbmUgRlJFRV9MRVZFTCAwIC8qIHdoZW4gbm9kZSBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSBpdHMKLQkJCWJsa19sZXZlbCBpcyBzZXQgdG8gRlJFRV9MRVZFTC4gSXQgaXMgdGhlbgotCQkJdXNlZCB0byBzZWUgd2hldGhlciB0aGUgbm9kZSBpcyBzdGlsbCBpbiB0aGUKLQkJCXRyZWUgKi8KKyNkZWZpbmUgRlJFRV9MRVZFTCAwCQkvKiB3aGVuIG5vZGUgZ2V0cyByZW1vdmVkIGZyb20gdGhlIHRyZWUgaXRzCisJCQkJICAgYmxrX2xldmVsIGlzIHNldCB0byBGUkVFX0xFVkVMLiBJdCBpcyB0aGVuCisJCQkJICAgdXNlZCB0byBzZWUgd2hldGhlciB0aGUgbm9kZSBpcyBzdGlsbCBpbiB0aGUKKwkJCQkgICB0cmVlICovCiAKLSNkZWZpbmUgRElTS19MRUFGX05PREVfTEVWRUwgIDEgLyogTGVhZiBub2RlIGxldmVsLiovCisjZGVmaW5lIERJU0tfTEVBRl9OT0RFX0xFVkVMICAxCS8qIExlYWYgbm9kZSBsZXZlbC4gKi8KIAogLyogR2l2ZW4gdGhlIGJ1ZmZlciBoZWFkIG9mIGEgZm9ybWF0dGVkIG5vZGUsIHJlc29sdmUgdG8gdGhlIGJsb2NrIGhlYWQgb2YgdGhhdCBub2RlLiAqLwogI2RlZmluZSBCX0JMS19IRUFEKHBfc19iaCkgICAgICAgICAgICAoKHN0cnVjdCBibG9ja19oZWFkICopKChwX3NfYmgpLT5iX2RhdGEpKQpAQCAtNzU5LDcgKzc0NCw2IEBACiAjZGVmaW5lIFBVVF9CX0xFVkVMKHBfc19iaCx2YWwpICAgICAgIGRvIHsgc2V0X2Jsa2hfbGV2ZWwoQl9CTEtfSEVBRChwX3NfYmgpLHZhbCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFBVVF9CX0ZSRUVfU1BBQ0UocF9zX2JoLHZhbCkgIGRvIHsgc2V0X2Jsa2hfZnJlZV9zcGFjZShCX0JMS19IRUFEKHBfc19iaCksdmFsKTsgfSB3aGlsZSAoMCkKIAotCiAvKiBHZXQgcmlnaHQgZGVsaW1pdGluZyBrZXkuIC0tIGxpdHRsZSBlbmRpYW4gKi8KICNkZWZpbmUgQl9QUklHSFRfREVMSU1fS0VZKHBfc19iaCkgICAoJihibGtfcmlnaHRfZGVsaW1fa2V5KEJfQkxLX0hFQUQocF9zX2JoKSkKIApAQCAtNzcwLDQxICs3NTQsMzYgQEAKICNkZWZpbmUgQl9JU19LRVlTX0xFVkVMKHBfc19iaCkgICAgICAoQl9MRVZFTChwX3NfYmgpID4gRElTS19MRUFGX05PREVfTEVWRUwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBCX0xFVkVMKHBfc19iaCkgPD0gTUFYX0hFSUdIVCkKIAotCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUIERBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8vCiAvLyBvbGQgc3RhdCBkYXRhIGlzIDMyIGJ5dGVzIGxvbmcuIFdlIGFyZSBnb2luZyB0byBkaXN0aW5ndWlzaCBuZXcgb25lIGJ5CiAvLyBkaWZmZXJlbnQgc2l6ZQogLy8KLXN0cnVjdCBzdGF0X2RhdGFfdjEKLXsKLSAgICBfX2xlMTYgc2RfbW9kZTsJLyogZmlsZSB0eXBlLCBwZXJtaXNzaW9ucyAqLwotICAgIF9fbGUxNiBzZF9ubGluazsJLyogbnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KLSAgICBfX2xlMTYgc2RfdWlkOwkJLyogb3duZXIgKi8KLSAgICBfX2xlMTYgc2RfZ2lkOwkJLyogZ3JvdXAgKi8KLSAgICBfX2xlMzIgc2Rfc2l6ZTsJLyogZmlsZSBzaXplICovCi0gICAgX19sZTMyIHNkX2F0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCi0gICAgX19sZTMyIHNkX210aW1lOwkvKiB0aW1lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgICovCi0gICAgX19sZTMyIHNkX2N0aW1lOwkvKiB0aW1lIGlub2RlIChzdGF0IGRhdGEpIHdhcyBsYXN0IGNoYW5nZWQgKGV4Y2VwdCBjaGFuZ2VzIHRvIHNkX2F0aW1lIGFuZCBzZF9tdGltZSkgKi8KLSAgICB1bmlvbiB7Ci0JX19sZTMyIHNkX3JkZXY7Ci0JX19sZTMyIHNkX2Jsb2NrczsJLyogbnVtYmVyIG9mIGJsb2NrcyBmaWxlIHVzZXMgKi8KLSAgICB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdTsKLSAgICBfX2xlMzIgc2RfZmlyc3RfZGlyZWN0X2J5dGU7IC8qIGZpcnN0IGJ5dGUgb2YgZmlsZSB3aGljaCBpcyBzdG9yZWQKLQkJCQkgICBpbiBhIGRpcmVjdCBpdGVtOiBleGNlcHQgdGhhdCBpZiBpdAotCQkJCSAgIGVxdWFscyAxIGl0IGlzIGEgc3ltbGluayBhbmQgaWYgaXQKLQkJCQkgICBlcXVhbHMgfihfX3UzMikwIHRoZXJlIGlzIG5vCi0JCQkJICAgZGlyZWN0IGl0ZW0uICBUaGUgZXhpc3RlbmNlIG9mIHRoaXMKLQkJCQkgICBmaWVsZCByZWFsbHkgZ3JhdGVzIG9uIG1lLiBMZXQncwotCQkJCSAgIHJlcGxhY2UgaXQgd2l0aCBhIG1hY3JvIGJhc2VkIG9uCi0JCQkJICAgc2Rfc2l6ZSBhbmQgb3VyIHRhaWwgc3VwcHJlc3Npb24KLQkJCQkgICBwb2xpY3kuICBTb21lZGF5LiAgLUhhbnMgKi8KK3N0cnVjdCBzdGF0X2RhdGFfdjEgeworCV9fbGUxNiBzZF9tb2RlOwkJLyogZmlsZSB0eXBlLCBwZXJtaXNzaW9ucyAqLworCV9fbGUxNiBzZF9ubGluazsJLyogbnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KKwlfX2xlMTYgc2RfdWlkOwkJLyogb3duZXIgKi8KKwlfX2xlMTYgc2RfZ2lkOwkJLyogZ3JvdXAgKi8KKwlfX2xlMzIgc2Rfc2l6ZTsJCS8qIGZpbGUgc2l6ZSAqLworCV9fbGUzMiBzZF9hdGltZTsJLyogdGltZSBvZiBsYXN0IGFjY2VzcyAqLworCV9fbGUzMiBzZF9tdGltZTsJLyogdGltZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkICAqLworCV9fbGUzMiBzZF9jdGltZTsJLyogdGltZSBpbm9kZSAoc3RhdCBkYXRhKSB3YXMgbGFzdCBjaGFuZ2VkIChleGNlcHQgY2hhbmdlcyB0byBzZF9hdGltZSBhbmQgc2RfbXRpbWUpICovCisJdW5pb24geworCQlfX2xlMzIgc2RfcmRldjsKKwkJX19sZTMyIHNkX2Jsb2NrczsJLyogbnVtYmVyIG9mIGJsb2NrcyBmaWxlIHVzZXMgKi8KKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdTsKKwlfX2xlMzIgc2RfZmlyc3RfZGlyZWN0X2J5dGU7CS8qIGZpcnN0IGJ5dGUgb2YgZmlsZSB3aGljaCBpcyBzdG9yZWQKKwkJCQkJICAgaW4gYSBkaXJlY3QgaXRlbTogZXhjZXB0IHRoYXQgaWYgaXQKKwkJCQkJICAgZXF1YWxzIDEgaXQgaXMgYSBzeW1saW5rIGFuZCBpZiBpdAorCQkJCQkgICBlcXVhbHMgfihfX3UzMikwIHRoZXJlIGlzIG5vCisJCQkJCSAgIGRpcmVjdCBpdGVtLiAgVGhlIGV4aXN0ZW5jZSBvZiB0aGlzCisJCQkJCSAgIGZpZWxkIHJlYWxseSBncmF0ZXMgb24gbWUuIExldCdzCisJCQkJCSAgIHJlcGxhY2UgaXQgd2l0aCBhIG1hY3JvIGJhc2VkIG9uCisJCQkJCSAgIHNkX3NpemUgYW5kIG91ciB0YWlsIHN1cHByZXNzaW9uCisJCQkJCSAgIHBvbGljeS4gIFNvbWVkYXkuICAtSGFucyAqLwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiAjZGVmaW5lIFNEX1YxX1NJWkUgICAgICAgICAgICAgIChzaXplb2Yoc3RydWN0IHN0YXRfZGF0YV92MSkpCkBAIC04NjIsMjkgKzg0MSwyOSBAQAogLyogU3RhdCBEYXRhIG9uIGRpc2sgKHJlaXNlcmZzIHZlcnNpb24gb2YgVUZTIGRpc2sgaW5vZGUgbWludXMgdGhlCiAgICBhZGRyZXNzIGJsb2NrcykgKi8KIHN0cnVjdCBzdGF0X2RhdGEgewotICAgIF9fbGUxNiBzZF9tb2RlOwkvKiBmaWxlIHR5cGUsIHBlcm1pc3Npb25zICovCi0gICAgX19sZTE2IHNkX2F0dHJzOyAgICAgLyogcGVyc2lzdGVudCBpbm9kZSBmbGFncyAqLwotICAgIF9fbGUzMiBzZF9ubGluazsJLyogbnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KLSAgICBfX2xlNjQgc2Rfc2l6ZTsJLyogZmlsZSBzaXplICovCi0gICAgX19sZTMyIHNkX3VpZDsJCS8qIG93bmVyICovCi0gICAgX19sZTMyIHNkX2dpZDsJCS8qIGdyb3VwICovCi0gICAgX19sZTMyIHNkX2F0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCi0gICAgX19sZTMyIHNkX210aW1lOwkvKiB0aW1lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgICovCi0gICAgX19sZTMyIHNkX2N0aW1lOwkvKiB0aW1lIGlub2RlIChzdGF0IGRhdGEpIHdhcyBsYXN0IGNoYW5nZWQgKGV4Y2VwdCBjaGFuZ2VzIHRvIHNkX2F0aW1lIGFuZCBzZF9tdGltZSkgKi8KLSAgICBfX2xlMzIgc2RfYmxvY2tzOwotICAgIHVuaW9uIHsKLQlfX2xlMzIgc2RfcmRldjsKLQlfX2xlMzIgc2RfZ2VuZXJhdGlvbjsKLSAgICAgIC8vX19sZTMyIHNkX2ZpcnN0X2RpcmVjdF9ieXRlOwotICAgICAgLyogZmlyc3QgYnl0ZSBvZiBmaWxlIHdoaWNoIGlzIHN0b3JlZCBpbiBhCi0JCQkJICAgICAgIGRpcmVjdCBpdGVtOiBleGNlcHQgdGhhdCBpZiBpdCBlcXVhbHMgMQotCQkJCSAgICAgICBpdCBpcyBhIHN5bWxpbmsgYW5kIGlmIGl0IGVxdWFscwotCQkJCSAgICAgICB+KF9fdTMyKTAgdGhlcmUgaXMgbm8gZGlyZWN0IGl0ZW0uICBUaGUKLQkJCQkgICAgICAgZXhpc3RlbmNlIG9mIHRoaXMgZmllbGQgcmVhbGx5IGdyYXRlcwotCQkJCSAgICAgICBvbiBtZS4gTGV0J3MgcmVwbGFjZSBpdCB3aXRoIGEgbWFjcm8KLQkJCQkgICAgICAgYmFzZWQgb24gc2Rfc2l6ZSBhbmQgb3VyIHRhaWwKLQkJCQkgICAgICAgc3VwcHJlc3Npb24gcG9saWN5PyAqLwotICB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdTsKKwlfX2xlMTYgc2RfbW9kZTsJCS8qIGZpbGUgdHlwZSwgcGVybWlzc2lvbnMgKi8KKwlfX2xlMTYgc2RfYXR0cnM7CS8qIHBlcnNpc3RlbnQgaW5vZGUgZmxhZ3MgKi8KKwlfX2xlMzIgc2Rfbmxpbms7CS8qIG51bWJlciBvZiBoYXJkIGxpbmtzICovCisJX19sZTY0IHNkX3NpemU7CQkvKiBmaWxlIHNpemUgKi8KKwlfX2xlMzIgc2RfdWlkOwkJLyogb3duZXIgKi8KKwlfX2xlMzIgc2RfZ2lkOwkJLyogZ3JvdXAgKi8KKwlfX2xlMzIgc2RfYXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KKwlfX2xlMzIgc2RfbXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCAgKi8KKwlfX2xlMzIgc2RfY3RpbWU7CS8qIHRpbWUgaW5vZGUgKHN0YXQgZGF0YSkgd2FzIGxhc3QgY2hhbmdlZCAoZXhjZXB0IGNoYW5nZXMgdG8gc2RfYXRpbWUgYW5kIHNkX210aW1lKSAqLworCV9fbGUzMiBzZF9ibG9ja3M7CisJdW5pb24geworCQlfX2xlMzIgc2RfcmRldjsKKwkJX19sZTMyIHNkX2dlbmVyYXRpb247CisJCS8vX19sZTMyIHNkX2ZpcnN0X2RpcmVjdF9ieXRlOworCQkvKiBmaXJzdCBieXRlIG9mIGZpbGUgd2hpY2ggaXMgc3RvcmVkIGluIGEKKwkJICAgZGlyZWN0IGl0ZW06IGV4Y2VwdCB0aGF0IGlmIGl0IGVxdWFscyAxCisJCSAgIGl0IGlzIGEgc3ltbGluayBhbmQgaWYgaXQgZXF1YWxzCisJCSAgIH4oX191MzIpMCB0aGVyZSBpcyBubyBkaXJlY3QgaXRlbS4gIFRoZQorCQkgICBleGlzdGVuY2Ugb2YgdGhpcyBmaWVsZCByZWFsbHkgZ3JhdGVzCisJCSAgIG9uIG1lLiBMZXQncyByZXBsYWNlIGl0IHdpdGggYSBtYWNybworCQkgICBiYXNlZCBvbiBzZF9zaXplIGFuZCBvdXIgdGFpbAorCQkgICBzdXBwcmVzc2lvbiBwb2xpY3k/ICovCisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHU7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAvLwogLy8gdGhpcyBpcyA0NCBieXRlcyBsb25nCkBAIC05MTksNyArODk4LDYgQEAKICNkZWZpbmUgc2RfdjJfYXR0cnMoc2RwKSAgICAgICAgIChsZTE2X3RvX2NwdSgoc2RwKS0+c2RfYXR0cnMpKQogI2RlZmluZSBzZXRfc2RfdjJfYXR0cnMoc2RwLHYpICAgKChzZHApLT5zZF9hdHRycyA9IGNwdV90b19sZTE2KHYpKQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUlkgU1RSVUNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk1NCwxNyArOTMyLDE0IEBACiAvKiBOT1QgSU1QTEVNRU5URUQ6ICAgCiAgICBEaXJlY3Rvcnkgd2lsbCBzb21lZGF5IGNvbnRhaW4gc3RhdCBkYXRhIG9mIG9iamVjdCAqLwogCi0KLQotc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQKLXsKLSAgX19sZTMyIGRlaF9vZmZzZXQ7CQkvKiB0aGlyZCBjb21wb25lbnQgb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSBrZXkgKi8KLSAgX19sZTMyIGRlaF9kaXJfaWQ7CQkvKiBvYmplY3RpZCBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgb2JqZWN0LCB0aGF0IGlzIHJlZmVyZW5jZWQKLQkJCQkJICAgYnkgZGlyZWN0b3J5IGVudHJ5ICovCi0gIF9fbGUzMiBkZWhfb2JqZWN0aWQ7CQkvKiBvYmplY3RpZCBvZiB0aGUgb2JqZWN0LCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgZGlyZWN0b3J5IGVudHJ5ICovCi0gIF9fbGUxNiBkZWhfbG9jYXRpb247CQkvKiBvZmZzZXQgb2YgbmFtZSBpbiB0aGUgd2hvbGUgaXRlbSAqLwotICBfX2xlMTYgZGVoX3N0YXRlOwkJLyogd2hldGhlciAxKSBlbnRyeSBjb250YWlucyBzdGF0IGRhdGEgKGZvciBmdXR1cmUpLCBhbmQgMikgd2hldGhlcgotCQkJCQkgICBlbnRyeSBpcyBoaWRkZW4gKHVubGlua2VkKSAqLworc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgeworCV9fbGUzMiBkZWhfb2Zmc2V0OwkvKiB0aGlyZCBjb21wb25lbnQgb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSBrZXkgKi8KKwlfX2xlMzIgZGVoX2Rpcl9pZDsJLyogb2JqZWN0aWQgb2YgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIG9iamVjdCwgdGhhdCBpcyByZWZlcmVuY2VkCisJCQkJICAgYnkgZGlyZWN0b3J5IGVudHJ5ICovCisJX19sZTMyIGRlaF9vYmplY3RpZDsJLyogb2JqZWN0aWQgb2YgdGhlIG9iamVjdCwgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGRpcmVjdG9yeSBlbnRyeSAqLworCV9fbGUxNiBkZWhfbG9jYXRpb247CS8qIG9mZnNldCBvZiBuYW1lIGluIHRoZSB3aG9sZSBpdGVtICovCisJX19sZTE2IGRlaF9zdGF0ZTsJLyogd2hldGhlciAxKSBlbnRyeSBjb250YWlucyBzdGF0IGRhdGEgKGZvciBmdXR1cmUpLCBhbmQgMikgd2hldGhlcgorCQkJCSAgIGVudHJ5IGlzIGhpZGRlbiAodW5saW5rZWQpICovCiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAjZGVmaW5lIERFSF9TSVpFICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkKQogI2RlZmluZSBkZWhfb2Zmc2V0KHBfZGVoKSAgICAgICAgIChsZTMyX3RvX2NwdSgocF9kZWgpLT5kZWhfb2Zmc2V0KSkKQEAgLTk4Niw3ICs5NjEsNyBAQAogLyogb2xkIGZvcm1hdCBkaXJlY3RvcmllcyBoYXZlIHRoaXMgc2l6ZSB3aGVuIGVtcHR5ICovCiAjZGVmaW5lIEVNUFRZX0RJUl9TSVpFX1YxIChERUhfU0laRSAqIDIgKyAzKQogCi0jZGVmaW5lIERFSF9TdGF0ZGF0YSAwCQkJLyogbm90IHVzZWQgbm93ICovCisjZGVmaW5lIERFSF9TdGF0ZGF0YSAwCQkvKiBub3QgdXNlZCBub3cgKi8KICNkZWZpbmUgREVIX1Zpc2libGUgMgogCiAvKiA2NCBiaXQgc3lzdGVtcyAoYW5kIHRoZSBTLzM5MCkgbmVlZCB0byBiZSBhbGlnbmVkIGV4cGxpY2l0bHkgLWpkbSAqLwpAQCAtMTAyMywxMCArOTk4LDEwIEBACiAjZGVmaW5lIGRlX3Zpc2libGUoZGVoKQkgICAgCSAgICB0ZXN0X2JpdF91bmFsaWduZWQgKERFSF9WaXNpYmxlLCAmKChkZWgpLT5kZWhfc3RhdGUpKQogI2RlZmluZSBkZV9oaWRkZW4oZGVoKQkgICAgCSAgICAhdGVzdF9iaXRfdW5hbGlnbmVkIChERUhfVmlzaWJsZSwgJigoZGVoKS0+ZGVoX3N0YXRlKSkKIAotZXh0ZXJuIHZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbV92MSAoY2hhciAqIGJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAotCQkJCSAgICBfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKTsKLWV4dGVybiB2b2lkIG1ha2VfZW1wdHlfZGlyX2l0ZW0gKGNoYXIgKiBib2R5LCBfX2xlMzIgZGlyaWQsIF9fbGUzMiBvYmppZCwKLQkJCQkgX19sZTMyIHBhcl9kaXJpZCwgX19sZTMyIHBhcl9vYmppZCk7CitleHRlcm4gdm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtX3YxKGNoYXIgKmJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAorCQkJCSAgIF9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpOworZXh0ZXJuIHZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbShjaGFyICpib2R5LCBfX2xlMzIgZGlyaWQsIF9fbGUzMiBvYmppZCwKKwkJCQlfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKTsKIAogLyogYXJyYXkgb2YgdGhlIGVudHJ5IGhlYWRlcnMgKi8KICAvKiBnZXQgaXRlbSBib2R5ICovCkBAIC0xMDQzLDUzICsxMDE4LDQ4IEBACiAjZGVmaW5lIElfREVIX05fRU5UUllfTEVOR1RIKGloLGRlaCxpKSBcCiAoKGkpID8gKGRlaF9sb2NhdGlvbigoZGVoKS0xKSAtIGRlaF9sb2NhdGlvbigoZGVoKSkpIDogKGloX2l0ZW1fbGVuKChpaCkpIC0gZGVoX2xvY2F0aW9uKChkZWgpKSkpCiAqLwotc3RhdGljIGlubGluZSBpbnQgZW50cnlfbGVuZ3RoIChjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgCi0JCQkJCQkJCWNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IHBvc19pbl9pdGVtKQorc3RhdGljIGlubGluZSBpbnQgZW50cnlfbGVuZ3RoKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBwb3NfaW5faXRlbSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwogCi0gICAgZGVoID0gQl9JX0RFSCAoYmgsIGloKSArIHBvc19pbl9pdGVtOwotICAgIGlmIChwb3NfaW5faXRlbSkKLQlyZXR1cm4gZGVoX2xvY2F0aW9uKGRlaC0xKSAtIGRlaF9sb2NhdGlvbihkZWgpOworCWRlaCA9IEJfSV9ERUgoYmgsIGloKSArIHBvc19pbl9pdGVtOworCWlmIChwb3NfaW5faXRlbSkKKwkJcmV0dXJuIGRlaF9sb2NhdGlvbihkZWggLSAxKSAtIGRlaF9sb2NhdGlvbihkZWgpOwogCi0gICAgcmV0dXJuIGloX2l0ZW1fbGVuKGloKSAtIGRlaF9sb2NhdGlvbihkZWgpOworCXJldHVybiBpaF9pdGVtX2xlbihpaCkgLSBkZWhfbG9jYXRpb24oZGVoKTsKIH0KIAotCi0KIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkgaXRlbSwgZGVwZW5kcyBvbiBFTlRSWV9DT1VOVCBiZWluZyBhdCB0aGUgc3RhcnQgb2YgZGlyZWN0b3J5IGR5bmFtaWMgZGF0YS4gKi8KICNkZWZpbmUgSV9FTlRSWV9DT1VOVChpaCkgKGloX2VudHJ5X2NvdW50KChpaCkpKQogCi0KIC8qIG5hbWUgYnkgYmgsIGloIGFuZCBlbnRyeV9udW0gKi8KICNkZWZpbmUgQl9JX0VfTkFNRShiaCxpaCxlbnRyeV9udW0pICgoY2hhciAqKShiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsgZGVoX2xvY2F0aW9uKEJfSV9ERUgoYmgsaWgpKyhlbnRyeV9udW0pKSkpCiAKIC8vIHR3byBlbnRyaWVzIHBlciBibG9jayAoYXQgbGVhc3QpCiAjZGVmaW5lIFJFSVNFUkZTX01BWF9OQU1FKGJsb2NrX3NpemUpIDI1NQogCi0KIC8qIHRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIG9wZXJhdGlvbnMgb24gZGlyZWN0b3J5IGVudHJpZXMuIEl0IGlzCiAgICBub3QgYSBkaXNrIHN0cnVjdHVyZS4gKi8KIC8qIFdoZW4gcmVpc2VyZnNfZmluZF9lbnRyeSBvciBzZWFyY2hfYnlfZW50cnlfa2V5IGZpbmQgZGlyZWN0b3J5CiAgICBlbnRyeSwgdGhleSByZXR1cm4gZmlsbGVkIHJlaXNlcmZzX2Rpcl9lbnRyeSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkKLXsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVfYmg7Ci0gIGludCBkZV9pdGVtX251bTsKLSAgc3RydWN0IGl0ZW1faGVhZCAqIGRlX2loOwotICBpbnQgZGVfZW50cnlfbnVtOwotICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlX2RlaDsKLSAgaW50IGRlX2VudHJ5bGVuOwotICBpbnQgZGVfbmFtZWxlbjsKLSAgY2hhciAqIGRlX25hbWU7Ci0gIGNoYXIgKiBkZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmc7CitzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlX2JoOworCWludCBkZV9pdGVtX251bTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpkZV9paDsKKwlpbnQgZGVfZW50cnlfbnVtOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZV9kZWg7CisJaW50IGRlX2VudHJ5bGVuOworCWludCBkZV9uYW1lbGVuOworCWNoYXIgKmRlX25hbWU7CisJY2hhciAqZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nOwogCi0gIF9fdTMyIGRlX2Rpcl9pZDsKLSAgX191MzIgZGVfb2JqZWN0aWQ7CisJX191MzIgZGVfZGlyX2lkOworCV9fdTMyIGRlX29iamVjdGlkOwogCi0gIHN0cnVjdCBjcHVfa2V5IGRlX2VudHJ5X2tleTsKKwlzdHJ1Y3QgY3B1X2tleSBkZV9lbnRyeV9rZXk7CiB9OwotICAgCisKIC8qIHRoZXNlIGRlZmluZXMgYXJlIHVzZWZ1bCB3aGVuIGEgcGFydGljdWxhciBtZW1iZXIgb2YgYSByZWlzZXJmc19kaXJfZW50cnkgaXMgbmVlZGVkICovCiAKIC8qIHBvaW50ZXIgdG8gZmlsZSBuYW1lLCBzdG9yZWQgaW4gZW50cnkgKi8KQEAgLTEwOTksOCArMTA2OSw2IEBACiAjZGVmaW5lIElfREVIX05fRU5UUllfRklMRV9OQU1FX0xFTkdUSChpaCxkZWgsZW50cnlfbnVtKSBcCiAoSV9ERUhfTl9FTlRSWV9MRU5HVEggKGloLCBkZWgsIGVudHJ5X251bSkgLSAoZGVfd2l0aF9zZCAoZGVoKSA/IFNEX1NJWkUgOiAwKSkKIAotCi0KIC8qIGhhc2ggdmFsdWUgb2NjdXBpZXMgYml0cyBmcm9tIDcgdXAgdG8gMzAgKi8KICNkZWZpbmUgR0VUX0hBU0hfVkFMVUUob2Zmc2V0KSAoKG9mZnNldCkgJiAweDdmZmZmZjgwTEwpCiAvKiBnZW5lcmF0aW9uIG51bWJlciBvY2N1cGllcyA3IGJpdHMgc3RhcnRpbmcgZnJvbSAwIHVwIHRvIDYgKi8KQEAgLTExMDksNyArMTA3Nyw2IEBACiAKICNkZWZpbmUgU0VUX0dFTkVSQVRJT05fTlVNQkVSKG9mZnNldCxnZW5fbnVtYmVyKSAoR0VUX0hBU0hfVkFMVUUob2Zmc2V0KXwoZ2VuX251bWJlcikpCiAKLQogLyoKICAqIFBpY3R1cmUgcmVwcmVzZW50cyBhbiBpbnRlcm5hbCBub2RlIG9mIHRoZSByZWlzZXJmcyB0cmVlCiAgKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkBAIC0xMTI1LDkgKzEwOTIsOSBAQAogLyogRGlzayBjaGlsZCBwb2ludGVyOiBUaGUgcG9pbnRlciBmcm9tIGFuIGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUKICAgIHRvIGEgbm9kZSB0aGF0IGlzIG9uIGRpc2suICovCiBzdHJ1Y3QgZGlza19jaGlsZCB7Ci0gIF9fbGUzMiAgICAgICBkY19ibG9ja19udW1iZXI7ICAgICAgICAgICAgICAvKiBEaXNrIGNoaWxkJ3MgYmxvY2sgbnVtYmVyLiAqLwotICBfX2xlMTYgICAgICAgZGNfc2l6ZTsJCSAgICAgICAgICAgIC8qIERpc2sgY2hpbGQncyB1c2VkIHNwYWNlLiAgICovCi0gIF9fbGUxNiAgICAgICBkY19yZXNlcnZlZDsKKwlfX2xlMzIgZGNfYmxvY2tfbnVtYmVyOwkvKiBEaXNrIGNoaWxkJ3MgYmxvY2sgbnVtYmVyLiAqLworCV9fbGUxNiBkY19zaXplOwkJLyogRGlzayBjaGlsZCdzIHVzZWQgc3BhY2UuICAgKi8KKwlfX2xlMTYgZGNfcmVzZXJ2ZWQ7CiB9OwogCiAjZGVmaW5lIERDX1NJWkUgKHNpemVvZihzdHJ1Y3QgZGlza19jaGlsZCkpCkBAIC0xMTQ0LDcgKzExMTEsNyBAQAogI2RlZmluZSBCX05fQ0hJTERfTlVNKHBfc19iaCxuX3BvcykgKGRjX2Jsb2NrX251bWJlcihCX05fQ0hJTEQocF9zX2JoLG5fcG9zKSkpCiAjZGVmaW5lIFBVVF9CX05fQ0hJTERfTlVNKHBfc19iaCxuX3BvcywgdmFsKSAocHV0X2RjX2Jsb2NrX251bWJlcihCX05fQ0hJTEQocF9zX2JoLG5fcG9zKSwgdmFsICkpCiAKLSAvKiBtYXhpbWFsIHZhbHVlIG9mIGZpZWxkIGNoaWxkX3NpemUgaW4gc3RydWN0dXJlIGRpc2tfY2hpbGQgKi8gCisgLyogbWF4aW1hbCB2YWx1ZSBvZiBmaWVsZCBjaGlsZF9zaXplIGluIHN0cnVjdHVyZSBkaXNrX2NoaWxkICovCiAgLyogY2hpbGQgc2l6ZSBpcyB0aGUgY29tYmluZWQgc2l6ZSBvZiBhbGwgaXRlbXMgYW5kIHRoZWlyIGhlYWRlcnMgKi8KICNkZWZpbmUgTUFYX0NISUxEX1NJWkUoYmgpICgoaW50KSggKGJoKS0+Yl9zaXplIC0gQkxLSF9TSVpFICkpCiAKQEAgLTExNTksNyArMTEyNiw2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICBQQVRIIFNUUlVDVFVSRVMgQU5EIERFRklORVMgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAvKiBTZWFyY2hfYnlfa2V5IGZpbGxzIHVwIHRoZSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIGxlYWYgYXMgaXQgZGVzY2VuZHMgdGhlIHRyZWUgbG9va2luZyBmb3IgdGhlCiAgICBrZXkuICBJdCB1c2VzIHJlaXNlcmZzX2JyZWFkIHRvIHRyeSB0byBmaW5kIGJ1ZmZlcnMgaW4gdGhlIGNhY2hlIGdpdmVuIHRoZWlyIGJsb2NrIG51bWJlci4gIElmIGl0CiAgICBkb2VzIG5vdCBmaW5kIHRoZW0gaW4gdGhlIGNhY2hlIGl0IHJlYWRzIHRoZW0gZnJvbSBkaXNrLiAgRm9yIGVhY2ggbm9kZSBzZWFyY2hfYnlfa2V5IGZpbmRzIHVzaW5nCkBAIC0xMTY4LDIwICsxMTM0LDE4IEBACiAgICBpcyBsb29raW5nIHRocm91Z2ggYSBsZWFmIG5vZGUgYmluX3NlYXJjaCB3aWxsIGZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHdoaWNoIGhhcyBrZXkgZWl0aGVyCiAgICBlcXVhbCB0byBnaXZlbiBrZXksIG9yIHdoaWNoIGlzIHRoZSBtYXhpbWFsIGtleSBsZXNzIHRoYW4gdGhlIGdpdmVuIGtleS4gKi8KIAotc3RydWN0ICBwYXRoX2VsZW1lbnQgIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoJcGVfYnVmZmVyOyAgICAvKiBQb2ludGVyIHRvIHRoZSBidWZmZXIgYXQgdGhlIHBhdGggaW4gdGhlIHRyZWUuICovCi0gIGludCAgICAgICAgIAkJcGVfcG9zaXRpb247ICAvKiBQb3NpdGlvbiBpbiB0aGUgdHJlZSBub2RlIHdoaWNoIGlzIHBsYWNlZCBpbiB0aGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVmZmVyIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IHBhdGhfZWxlbWVudCB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwZV9idWZmZXI7CS8qIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aCBpbiB0aGUgdHJlZS4gKi8KKwlpbnQgcGVfcG9zaXRpb247CS8qIFBvc2l0aW9uIGluIHRoZSB0cmVlIG5vZGUgd2hpY2ggaXMgcGxhY2VkIGluIHRoZSAqLworCS8qIGJ1ZmZlciBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIH07CiAKLSNkZWZpbmUgTUFYX0hFSUdIVCA1IC8qIG1heGltYWwgaGVpZ2h0IG9mIGEgdHJlZS4gZG9uJ3QgY2hhbmdlIHRoaXMgd2l0aG91dCBjaGFuZ2luZyBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqLwotI2RlZmluZSBFWFRFTkRFRF9NQVhfSEVJR0hUICAgICAgICAgNyAvKiBNdXN0IGJlIGVxdWFscyBNQVhfSEVJR0hUICsgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAqLwotI2RlZmluZSBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICAgMiAvKiBNdXN0IGJlIGVxdWFsIHRvIGF0IGxlYXN0IDIuICovCisjZGVmaW5lIE1BWF9IRUlHSFQgNQkJLyogbWF4aW1hbCBoZWlnaHQgb2YgYSB0cmVlLiBkb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IGNoYW5naW5nIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICovCisjZGVmaW5lIEVYVEVOREVEX01BWF9IRUlHSFQgICAgICAgICA3CS8qIE11c3QgYmUgZXF1YWxzIE1BWF9IRUlHSFQgKyBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICovCisjZGVmaW5lIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgICAyCS8qIE11c3QgYmUgZXF1YWwgdG8gYXQgbGVhc3QgMi4gKi8KIAotI2RlZmluZSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgMSAvKiBNdXN0IGJlIGVxdWFsIHRvIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgLSAxICovCi0jZGVmaW5lIE1BWF9GRUJfU0laRSA2ICAgLyogdGhpcyBNVVNUIGJlIE1BWF9IRUlHSFQgKyAxLiBTZWUgYWJvdXQgRkVCIGJlbG93ICovCi0KLQorI2RlZmluZSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgMQkvKiBNdXN0IGJlIGVxdWFsIHRvIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgLSAxICovCisjZGVmaW5lIE1BWF9GRUJfU0laRSA2CQkvKiB0aGlzIE1VU1QgYmUgTUFYX0hFSUdIVCArIDEuIFNlZSBhYm91dCBGRUIgYmVsb3cgKi8KIAogLyogV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdobyB0aGUgYW5jZXN0b3JzIG9mIG5vZGVzIGFyZS4gIFdoZW4gd2UKICAgIHBlcmZvcm0gYSBzZWFyY2ggd2UgcmVjb3JkIHdoaWNoIG5vZGVzIHdlcmUgdmlzaXRlZCB3aGlsZQpAQCAtMTIwMCwxNCArMTE2NCwxNCBAQAogZ29kcyBvbmx5IGtub3cgaG93IHdlIGFyZSBnb2luZyB0byBTTVAgdGhlIGNvZGUgdGhhdCB1c2VzIHRoZW0uCiB6bm9kZXMgYXJlIHRoZSB3YXkhICovCiAKLSNkZWZpbmUgUEFUSF9SRUFEQQkweDEgLyogZG8gcmVhZCBhaGVhZCAqLwotI2RlZmluZSBQQVRIX1JFQURBX0JBQ0sgMHgyIC8qIHJlYWQgYmFja3dhcmRzICovCisjZGVmaW5lIFBBVEhfUkVBREEJMHgxCS8qIGRvIHJlYWQgYWhlYWQgKi8KKyNkZWZpbmUgUEFUSF9SRUFEQV9CQUNLIDB4MgkvKiByZWFkIGJhY2t3YXJkcyAqLwogCi1zdHJ1Y3QgIHBhdGggewotICBpbnQgICAgICAgICAgICAgICAgICAgcGF0aF9sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgIAkvKiBMZW5ndGggb2YgdGhlIGFycmF5IGFib3ZlLiAgICovCi0gIGludAkJCXJlYWRhOwotICBzdHJ1Y3QgIHBhdGhfZWxlbWVudCAgcGF0aF9lbGVtZW50c1tFWFRFTkRFRF9NQVhfSEVJR0hUXTsJLyogQXJyYXkgb2YgdGhlIHBhdGggZWxlbWVudHMuICAqLwotICBpbnQJCQlwb3NfaW5faXRlbTsKK3N0cnVjdCBwYXRoIHsKKwlpbnQgcGF0aF9sZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgYXJyYXkgYWJvdmUuICAgKi8KKwlpbnQgcmVhZGE7CisJc3RydWN0IHBhdGhfZWxlbWVudCBwYXRoX2VsZW1lbnRzW0VYVEVOREVEX01BWF9IRUlHSFRdOwkvKiBBcnJheSBvZiB0aGUgcGF0aCBlbGVtZW50cy4gICovCisJaW50IHBvc19pbl9pdGVtOwogfTsKIAogI2RlZmluZSBwb3NfaW5faXRlbShwYXRoKSAoKHBhdGgpLT5wb3NfaW5faXRlbSkKQEAgLTEyMjQsMjUgKzExODgsMjMgQEAKIC8qIEdldCBwb3NpdGlvbiBpbiB0aGUgZWxlbWVudCBhdCB0aGUgcGF0aCBieSBwYXRoIGFuZCBwYXRoIHBvc2l0aW9uLiAqLwogI2RlZmluZSBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCxuX29mZnNldCkgKFBBVEhfT0ZGU0VUX1BFTEVNRU5UKHBfc19wYXRoLG5fb2Zmc2V0KS0+cGVfcG9zaXRpb24pCiAKLQogI2RlZmluZSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCkgKFBBVEhfT0ZGU0VUX1BCVUZGRVIoKHBfc19wYXRoKSwgKHBfc19wYXRoKS0+cGF0aF9sZW5ndGgpKQogCQkJCS8qIHlvdSBrbm93LCB0byB0aGUgcGVyc29uIHdobyBkaWRuJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgdGhpcyB0aGUgbWFjcm8gbmFtZSBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBmaXJzdCBzdWdnZXN0IHdoYXQgaXQgZG9lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF5YmUgUE9TSVRJT05fRlJPTV9QQVRIX0VORD8gT3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmUgd2Ugc2hvdWxkIGp1c3QgZm9jdXMgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcGluZyBwYXRocy4uLiAtSGFucyAqLworCQkJCSAgIHdyaXRlIHRoaXMgdGhlIG1hY3JvIG5hbWUgZG9lcyBub3QKKwkJCQkgICBhdCBmaXJzdCBzdWdnZXN0IHdoYXQgaXQgZG9lcy4KKwkJCQkgICBNYXliZSBQT1NJVElPTl9GUk9NX1BBVEhfRU5EPyBPcgorCQkJCSAgIG1heWJlIHdlIHNob3VsZCBqdXN0IGZvY3VzIG9uCisJCQkJICAgZHVtcGluZyBwYXRocy4uLiAtSGFucyAqLwogI2RlZmluZSBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpIChQQVRIX09GRlNFVF9QT1NJVElPTigocF9zX3BhdGgpLCAocF9zX3BhdGgpLT5wYXRoX2xlbmd0aCkpCiAKLQogI2RlZmluZSBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpICAgIEJfTl9QSVRFTV9IRUFEKFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKSxQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpKQogCiAvKiBpbiBkb19iYWxhbmNlIGxlYWYgaGFzIGggPT0gMCBpbiBjb250cmFzdCB3aXRoIHBhdGggc3RydWN0dXJlLAogICAgd2hlcmUgcm9vdCBoYXMgbGV2ZWwgPT0gMC4gVGhhdCBpcyB3aHkgd2UgbmVlZCB0aGVzZSBkZWZpbmVzICovCiAjZGVmaW5lIFBBVEhfSF9QQlVGRkVSKHBfc19wYXRoLCBoKSBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfcGF0aCwgcF9zX3BhdGgtPnBhdGhfbGVuZ3RoIC0gKGgpKQkvKiB0Yi0+U1toXSAqLwotI2RlZmluZSBQQVRIX0hfUFBBUkVOVChwYXRoLCBoKSBQQVRIX0hfUEJVRkZFUiAocGF0aCwgKGgpICsgMSkJCQkvKiB0Yi0+RltoXSBvciB0Yi0+U1swXS0+Yl9wYXJlbnQgKi8KLSNkZWZpbmUgUEFUSF9IX1BPU0lUSU9OKHBhdGgsIGgpIFBBVEhfT0ZGU0VUX1BPU0lUSU9OIChwYXRoLCBwYXRoLT5wYXRoX2xlbmd0aCAtIChoKSkJCi0jZGVmaW5lIFBBVEhfSF9CX0lURU1fT1JERVIocGF0aCwgaCkgUEFUSF9IX1BPU0lUSU9OKHBhdGgsIGggKyAxKQkJLyogdGItPlNbaF0tPmJfaXRlbV9vcmRlciAqLworI2RlZmluZSBQQVRIX0hfUFBBUkVOVChwYXRoLCBoKSBQQVRIX0hfUEJVRkZFUiAocGF0aCwgKGgpICsgMSkJLyogdGItPkZbaF0gb3IgdGItPlNbMF0tPmJfcGFyZW50ICovCisjZGVmaW5lIFBBVEhfSF9QT1NJVElPTihwYXRoLCBoKSBQQVRIX09GRlNFVF9QT1NJVElPTiAocGF0aCwgcGF0aC0+cGF0aF9sZW5ndGggLSAoaCkpCisjZGVmaW5lIFBBVEhfSF9CX0lURU1fT1JERVIocGF0aCwgaCkgUEFUSF9IX1BPU0lUSU9OKHBhdGgsIGggKyAxKQkvKiB0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovCiAKICNkZWZpbmUgUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc19wYXRoLCBuX2gpICgocF9zX3BhdGgpLT5wYXRoX2xlbmd0aCAtIChuX2gpKQogCkBAIC0xMjUzLDcgKzEyMTUsNiBAQAogI2RlZmluZSBpdGVtX21vdmVkKGloLHBhdGgpIGNvbXBfaXRlbXMoaWgsIHBhdGgpCiAjZGVmaW5lIHBhdGhfY2hhbmdlZChpaCxwYXRoKSBjb21wX2l0ZW1zIChpaCwgcGF0aCkKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgIE1JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjcyLDMwICsxMjMzLDI2IEBACiAvLyByZWlzZXJmcyB2ZXJzaW9uIDIgaGFzIG1heCBvZmZzZXQgNjAgYml0cy4gVmVyc2lvbiAxIC0gMzIgYml0IG9mZnNldAogI2RlZmluZSBVMzJfTUFYICh+KF9fdTMyKTApCiAKLXN0YXRpYyBpbmxpbmUgbG9mZl90IG1heF9yZWlzZXJmc19vZmZzZXQgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RhdGljIGlubGluZSBsb2ZmX3QgbWF4X3JlaXNlcmZzX29mZnNldChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIGlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUpCi0JcmV0dXJuIChsb2ZmX3QpVTMyX01BWDsKKwlpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpID09IEtFWV9GT1JNQVRfM181KQorCQlyZXR1cm4gKGxvZmZfdCkgVTMyX01BWDsKIAotICAgIHJldHVybiAobG9mZl90KSgofihfX3U2NCkwKSA+PiA0KTsKKwlyZXR1cm4gKGxvZmZfdCkgKCh+KF9fdTY0KSAwKSA+PiA0KTsKIH0KIAotCiAvKiNkZWZpbmUgTUFYX0tFWV9VTklRVUVORVNTCU1BWF9VTF9JTlQqLwogI2RlZmluZSBNQVhfS0VZX09CSkVDVElECU1BWF9VTF9JTlQKIAotCiAjZGVmaW5lIE1BWF9CX05VTSAgTUFYX1VMX0lOVAogI2RlZmluZSBNQVhfRkNfTlVNIE1BWF9VU19JTlQKIAotCiAvKiB0aGUgcHVycG9zZSBpcyB0byBkZXRlY3Qgb3ZlcmZsb3cgb2YgYW4gdW5zaWduZWQgc2hvcnQgKi8KICNkZWZpbmUgUkVJU0VSRlNfTElOS19NQVggKE1BWF9VU19JTlQgLSAxMDAwKQogCi0KIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgdXNlZCBpbiByZWlzZXJmc19pbnNlcnRfaXRlbSBhbmQgcmVpc2VyZnNfYXBwZW5kX2l0ZW0gICovCi0jZGVmaW5lIFJFSVNFUkZTX0tFUk5FTF9NRU0JCTAJLyogcmVpc2VyZnMga2VybmVsIG1lbW9yeSBtb2RlCSovCi0jZGVmaW5lIFJFSVNFUkZTX1VTRVJfTUVNCQkxCS8qIHJlaXNlcmZzIHVzZXIgbWVtb3J5IG1vZGUJCSovCisjZGVmaW5lIFJFSVNFUkZTX0tFUk5FTF9NRU0JCTAJLyogcmVpc2VyZnMga2VybmVsIG1lbW9yeSBtb2RlICAqLworI2RlZmluZSBSRUlTRVJGU19VU0VSX01FTQkJMQkvKiByZWlzZXJmcyB1c2VyIG1lbW9yeSBtb2RlICAgICAgICAgICAgKi8KIAogI2RlZmluZSBmc19nZW5lcmF0aW9uKHMpIChSRUlTRVJGU19TQihzKS0+c19nZW5lcmF0aW9uX2NvdW50ZXIpCiAjZGVmaW5lIGdldF9nZW5lcmF0aW9uKHMpIGF0b21pY19yZWFkICgmZnNfZ2VuZXJhdGlvbihzKSkKQEAgLTEzMDMsNyArMTI2MCw2IEBACiAjZGVmaW5lIF9fZnNfY2hhbmdlZChnZW4scykgKGdlbiAhPSBnZXRfZ2VuZXJhdGlvbiAocykpCiAjZGVmaW5lIGZzX2NoYW5nZWQoZ2VuLHMpICh7Y29uZF9yZXNjaGVkKCk7IF9fZnNfY2hhbmdlZChnZW4sIHMpO30pCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgRklYQVRFIE5PREVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTMyNCwzOCArMTI4MCwzNCBAQAogICAgY2FsY3VsYXRpbmcgd2hhdCB3ZSBjYW4gc2hpZnQgdG8gbmVpZ2hib3JzIGFuZCBob3cgbWFueSBub2RlcyB3ZQogICAgaGF2ZSB0byBoYXZlIGlmIHdlIGRvIG5vdCBhbnkgc2hpZnRpbmdzLCBpZiB3ZSBzaGlmdCB0byBsZWZ0L3JpZ2h0CiAgICBuZWlnaGJvciBvciB0byBib3RoLiAqLwotc3RydWN0IHZpcnR1YWxfaXRlbQotewotICAgIGludCB2aV9pbmRleDsgLy8gaW5kZXggaW4gdGhlIGFycmF5IG9mIGl0ZW0gb3BlcmF0aW9ucwotICAgIHVuc2lnbmVkIHNob3J0IHZpX3R5cGU7CS8vIGxlZnQvcmlnaHQgbWVyZ2VhYmlsaXR5Ci0gICAgdW5zaWduZWQgc2hvcnQgdmlfaXRlbV9sZW47ICAgICAgICAgICAvKiBsZW5ndGggb2YgaXRlbSB0aGF0IGl0IHdpbGwgaGF2ZSBhZnRlciBiYWxhbmNpbmcgKi8KLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogdmlfaWg7Ci0gICAgY29uc3QgY2hhciAqIHZpX2l0ZW07ICAgICAvLyBib2R5IG9mIGl0ZW0gKG9sZCBvciBuZXcpCi0gICAgY29uc3Qgdm9pZCAqIHZpX25ld19kYXRhOyAvLyAwIGFsd2F5cyBidXQgcGFzdGUgbW9kZQotICAgIHZvaWQgKiB2aV91YXJlYTsgICAgLy8gaXRlbSBzcGVjaWZpYyBhcmVhCitzdHJ1Y3QgdmlydHVhbF9pdGVtIHsKKwlpbnQgdmlfaW5kZXg7CQkvLyBpbmRleCBpbiB0aGUgYXJyYXkgb2YgaXRlbSBvcGVyYXRpb25zCisJdW5zaWduZWQgc2hvcnQgdmlfdHlwZTsJLy8gbGVmdC9yaWdodCBtZXJnZWFiaWxpdHkKKwl1bnNpZ25lZCBzaG9ydCB2aV9pdGVtX2xlbjsJLyogbGVuZ3RoIG9mIGl0ZW0gdGhhdCBpdCB3aWxsIGhhdmUgYWZ0ZXIgYmFsYW5jaW5nICovCisJc3RydWN0IGl0ZW1faGVhZCAqdmlfaWg7CisJY29uc3QgY2hhciAqdmlfaXRlbTsJLy8gYm9keSBvZiBpdGVtIChvbGQgb3IgbmV3KQorCWNvbnN0IHZvaWQgKnZpX25ld19kYXRhOwkvLyAwIGFsd2F5cyBidXQgcGFzdGUgbW9kZQorCXZvaWQgKnZpX3VhcmVhOwkJLy8gaXRlbSBzcGVjaWZpYyBhcmVhCiB9OwogCi0KLXN0cnVjdCB2aXJ0dWFsX25vZGUKLXsKLSAgY2hhciAqIHZuX2ZyZWVfcHRyOwkJLyogdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLwotICB1bnNpZ25lZCBzaG9ydCB2bl9ucl9pdGVtOwkvKiBudW1iZXIgb2YgaXRlbXMgaW4gdmlydHVhbCBub2RlICovCi0gIHNob3J0IHZuX3NpemU7ICAgICAgICAJLyogc2l6ZSBvZiBub2RlICwgdGhhdCBub2RlIHdvdWxkIGhhdmUgaWYgaXQgaGFzIHVubGltaXRlZCBzaXplIGFuZCBubyBiYWxhbmNpbmcgaXMgcGVyZm9ybWVkICovCi0gIHNob3J0IHZuX21vZGU7CQkvKiBtb2RlIG9mIGJhbGFuY2luZyAocGFzdGUsIGluc2VydCwgZGVsZXRlLCBjdXQpICovCi0gIHNob3J0IHZuX2FmZmVjdGVkX2l0ZW1fbnVtOyAKLSAgc2hvcnQgdm5fcG9zX2luX2l0ZW07Ci0gIHN0cnVjdCBpdGVtX2hlYWQgKiB2bl9pbnNfaWg7CS8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0sIDAgZm9yIG90aGVyIG1vZGVzICovCi0gIGNvbnN0IHZvaWQgKiB2bl9kYXRhOwotICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdm5fdmk7CS8qIGFycmF5IG9mIGl0ZW1zIChpbmNsdWRpbmcgYSBuZXcgb25lLCBleGNsdWRpbmcgaXRlbSB0byBiZSBkZWxldGVkKSAqLworc3RydWN0IHZpcnR1YWxfbm9kZSB7CisJY2hhciAqdm5fZnJlZV9wdHI7CS8qIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSBmcmVlIHNwYWNlIGluIHRoZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCB2bl9ucl9pdGVtOwkvKiBudW1iZXIgb2YgaXRlbXMgaW4gdmlydHVhbCBub2RlICovCisJc2hvcnQgdm5fc2l6ZTsJCS8qIHNpemUgb2Ygbm9kZSAsIHRoYXQgbm9kZSB3b3VsZCBoYXZlIGlmIGl0IGhhcyB1bmxpbWl0ZWQgc2l6ZSBhbmQgbm8gYmFsYW5jaW5nIGlzIHBlcmZvcm1lZCAqLworCXNob3J0IHZuX21vZGU7CQkvKiBtb2RlIG9mIGJhbGFuY2luZyAocGFzdGUsIGluc2VydCwgZGVsZXRlLCBjdXQpICovCisJc2hvcnQgdm5fYWZmZWN0ZWRfaXRlbV9udW07CisJc2hvcnQgdm5fcG9zX2luX2l0ZW07CisJc3RydWN0IGl0ZW1faGVhZCAqdm5faW5zX2loOwkvKiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtLCAwIGZvciBvdGhlciBtb2RlcyAqLworCWNvbnN0IHZvaWQgKnZuX2RhdGE7CisJc3RydWN0IHZpcnR1YWxfaXRlbSAqdm5fdmk7CS8qIGFycmF5IG9mIGl0ZW1zIChpbmNsdWRpbmcgYSBuZXcgb25lLCBleGNsdWRpbmcgaXRlbSB0byBiZSBkZWxldGVkKSAqLwogfTsKIAogLyogdXNlZCBieSBkaXJlY3RvcnkgaXRlbXMgd2hlbiBjcmVhdGluZyB2aXJ0dWFsIG5vZGVzICovCiBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgewotICAgIGludCBmbGFnczsKLSAgICBfX3UxNiBlbnRyeV9jb3VudDsKLSAgICBfX3UxNiBlbnRyeV9zaXplc1sxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSA7Ci0KKwlpbnQgZmxhZ3M7CisJX191MTYgZW50cnlfY291bnQ7CisJX191MTYgZW50cnlfc2l6ZXNbMV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgIFRSRUUgQkFMQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTM3OCw3MyArMTMzMCw3MiBAQAogI2RlZmluZSBNQVhfQU1PVU5UX05FRURFRCAyCiAKIC8qIHNvbWVkYXkgc29tZWJvZHkgd2lsbCBwcmVmaXggZXZlcnkgZmllbGQgaW4gdGhpcyBzdHJ1Y3Qgd2l0aCB0Yl8gKi8KLXN0cnVjdCB0cmVlX2JhbGFuY2UKLXsKLSAgaW50IHRiX21vZGU7Ci0gIGludCBuZWVkX2JhbGFuY2VfZGlydHk7Ci0gIHN0cnVjdCBzdXBlcl9ibG9jayAqIHRiX3NiOwotICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0cmFuc2FjdGlvbl9oYW5kbGUgOwotICBzdHJ1Y3QgcGF0aCAqIHRiX3BhdGg7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIExbTUFYX0hFSUdIVF07ICAgICAgICAvKiBhcnJheSBvZiBsZWZ0IG5laWdoYm9ycyBvZiBub2RlcyBpbiB0aGUgcGF0aCAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBSW01BWF9IRUlHSFRdOyAgICAgICAgLyogYXJyYXkgb2YgcmlnaHQgbmVpZ2hib3JzIG9mIG5vZGVzIGluIHRoZSBwYXRoKi8KLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogRkxbTUFYX0hFSUdIVF07ICAgICAgIC8qIGFycmF5IG9mIGZhdGhlcnMgb2YgdGhlIGxlZnQgIG5laWdoYm9ycyAgICAgICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIEZSW01BWF9IRUlHSFRdOyAgICAgICAvKiBhcnJheSBvZiBmYXRoZXJzIG9mIHRoZSByaWdodCBuZWlnaGJvcnMgICAgICAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBDRkxbTUFYX0hFSUdIVF07ICAgICAgLyogYXJyYXkgb2YgY29tbW9uIHBhcmVudHMgb2YgY2VudGVyIG5vZGUgYW5kIGl0cyBsZWZ0IG5laWdoYm9yICAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBDRlJbTUFYX0hFSUdIVF07ICAgICAgLyogYXJyYXkgb2YgY29tbW9uIHBhcmVudHMgb2YgY2VudGVyIG5vZGUgYW5kIGl0cyByaWdodCBuZWlnaGJvciAqLworc3RydWN0IHRyZWVfYmFsYW5jZSB7CisJaW50IHRiX21vZGU7CisJaW50IG5lZWRfYmFsYW5jZV9kaXJ0eTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnRiX3NiOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRyYW5zYWN0aW9uX2hhbmRsZTsKKwlzdHJ1Y3QgcGF0aCAqdGJfcGF0aDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKkxbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIGxlZnQgbmVpZ2hib3JzIG9mIG5vZGVzIGluIHRoZSBwYXRoICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpSW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiByaWdodCBuZWlnaGJvcnMgb2Ygbm9kZXMgaW4gdGhlIHBhdGggKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKkZMW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBmYXRoZXJzIG9mIHRoZSBsZWZ0ICBuZWlnaGJvcnMgICAgICAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqRlJbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIGZhdGhlcnMgb2YgdGhlIHJpZ2h0IG5laWdoYm9ycyAgICAgICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpDRkxbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIGNvbW1vbiBwYXJlbnRzIG9mIGNlbnRlciBub2RlIGFuZCBpdHMgbGVmdCBuZWlnaGJvciAgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKkNGUltNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgY29tbW9uIHBhcmVudHMgb2YgY2VudGVyIG5vZGUgYW5kIGl0cyByaWdodCBuZWlnaGJvciAqLwogCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIEZFQltNQVhfRkVCX1NJWkVdOyAvKiBhcnJheSBvZiBlbXB0eSBidWZmZXJzLiBOdW1iZXIgb2YgYnVmZmVycyBpbiBhcnJheSBlcXVhbHMKLQkJCQkJICAgICBjdXJfYmxrbnVtLiAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1c2VkW01BWF9GRUJfU0laRV07Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIHRocm93bltNQVhfRkVCX1NJWkVdOwotICBpbnQgbG51bVtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgbnVtYmVyIG9mIGl0ZW1zIHdoaWNoIG11c3QgYmUKLQkJCSAgIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgaW4gb3JkZXIgdG8gYmFsYW5jZSB0aGUKLQkJCSAgIGN1cnJlbnQgbm9kZTsgZm9yIGxlYXZlcyBpbmNsdWRlcyBpdGVtIHRoYXQKLQkJCSAgIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQ7IGZvciBpbnRlcm5hbAotCQkJICAgbm9kZXMsIGl0IGlzIHRoZSBudW1iZXIgb2YgY2hpbGQgcG9pbnRlcnMKLQkJCSAgIHJhdGhlciB0aGFuIGl0ZW1zLiBJdCBpbmNsdWRlcyB0aGUgbmV3IGl0ZW0KLQkJCSAgIGJlaW5nIGNyZWF0ZWQuIFRoZSBjb2RlIHNvbWV0aW1lcyBzdWJ0cmFjdHMKLQkJCSAgIG9uZSB0byBnZXQgdGhlIG51bWJlciBvZiB3aG9sbHkgc2hpZnRlZAotCQkJICAgaXRlbXMgZm9yIG90aGVyIHB1cnBvc2VzLiAqLwotICBpbnQgcm51bVtNQVhfSEVJR0hUXTsJLyogc3Vic3RpdHV0ZSByaWdodCBmb3IgbGVmdCBpbiBjb21tZW50IGFib3ZlICovCi0gIGludCBsa2V5W01BWF9IRUlHSFRdOyAgICAgICAgICAgICAgIC8qIGFycmF5IGluZGV4ZWQgYnkgaGVpZ2h0IGggbWFwcGluZyB0aGUga2V5IGRlbGltaXRpbmcgTFtoXSBhbmQKLQkJCQkJICAgICAgIFNbaF0gdG8gaXRzIGl0ZW0gbnVtYmVyIHdpdGhpbiB0aGUgbm9kZSBDRkxbaF0gKi8KLSAgaW50IHJrZXlbTUFYX0hFSUdIVF07ICAgICAgICAgICAgICAgLyogc3Vic3RpdHV0ZSByIGZvciBsIGluIGNvbW1lbnQgYWJvdmUgKi8KLSAgaW50IGluc2VydF9zaXplW01BWF9IRUlHSFRdOyAgICAgICAgLyogdGhlIG51bWJlciBvZiBieXRlcyBieSB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZnJvbQotCQkJCQkgICAgICAgU1toXS4gQSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyByZW1vdmluZy4gICovCi0gIGludCBibGtudW1bTUFYX0hFSUdIVF07ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBub2RlcyB0aGF0IHdpbGwgcmVwbGFjZSBub2RlIFNbaF0gYWZ0ZXIKLQkJCQkJICAgICAgIGJhbGFuY2luZyBvbiB0aGUgbGV2ZWwgaCBvZiB0aGUgdHJlZS4gIElmIDAgdGhlbiBTIGlzCi0JCQkJCSAgICAgICBiZWluZyBkZWxldGVkLCBpZiAxIHRoZW4gUyBpcyByZW1haW5pbmcgYW5kIG5vIG5ldyBub2RlcwotCQkJCQkgICAgICAgYXJlIGJlaW5nIGNyZWF0ZWQsIGlmIDIgb3IgMyB0aGVuIDEgb3IgMiBuZXcgbm9kZXMgaXMKLQkJCQkJICAgICAgIGJlaW5nIGNyZWF0ZWQgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKkZFQltNQVhfRkVCX1NJWkVdOwkvKiBhcnJheSBvZiBlbXB0eSBidWZmZXJzLiBOdW1iZXIgb2YgYnVmZmVycyBpbiBhcnJheSBlcXVhbHMKKwkJCQkJCSAgIGN1cl9ibGtudW0uICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICp1c2VkW01BWF9GRUJfU0laRV07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0aHJvd25bTUFYX0ZFQl9TSVpFXTsKKwlpbnQgbG51bVtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgbnVtYmVyIG9mIGl0ZW1zIHdoaWNoIG11c3QgYmUKKwkJCQkgICBzaGlmdGVkIHRvIHRoZSBsZWZ0IGluIG9yZGVyIHRvIGJhbGFuY2UgdGhlCisJCQkJICAgY3VycmVudCBub2RlOyBmb3IgbGVhdmVzIGluY2x1ZGVzIGl0ZW0gdGhhdAorCQkJCSAgIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQ7IGZvciBpbnRlcm5hbAorCQkJCSAgIG5vZGVzLCBpdCBpcyB0aGUgbnVtYmVyIG9mIGNoaWxkIHBvaW50ZXJzCisJCQkJICAgcmF0aGVyIHRoYW4gaXRlbXMuIEl0IGluY2x1ZGVzIHRoZSBuZXcgaXRlbQorCQkJCSAgIGJlaW5nIGNyZWF0ZWQuIFRoZSBjb2RlIHNvbWV0aW1lcyBzdWJ0cmFjdHMKKwkJCQkgICBvbmUgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygd2hvbGx5IHNoaWZ0ZWQKKwkJCQkgICBpdGVtcyBmb3Igb3RoZXIgcHVycG9zZXMuICovCisJaW50IHJudW1bTUFYX0hFSUdIVF07CS8qIHN1YnN0aXR1dGUgcmlnaHQgZm9yIGxlZnQgaW4gY29tbWVudCBhYm92ZSAqLworCWludCBsa2V5W01BWF9IRUlHSFRdOwkvKiBhcnJheSBpbmRleGVkIGJ5IGhlaWdodCBoIG1hcHBpbmcgdGhlIGtleSBkZWxpbWl0aW5nIExbaF0gYW5kCisJCQkJICAgU1toXSB0byBpdHMgaXRlbSBudW1iZXIgd2l0aGluIHRoZSBub2RlIENGTFtoXSAqLworCWludCBya2V5W01BWF9IRUlHSFRdOwkvKiBzdWJzdGl0dXRlIHIgZm9yIGwgaW4gY29tbWVudCBhYm92ZSAqLworCWludCBpbnNlcnRfc2l6ZVtNQVhfSEVJR0hUXTsJLyogdGhlIG51bWJlciBvZiBieXRlcyBieSB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZnJvbQorCQkJCQkgICBTW2hdLiBBIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIHJlbW92aW5nLiAgKi8KKwlpbnQgYmxrbnVtW01BWF9IRUlHSFRdOwkvKiBudW1iZXIgb2Ygbm9kZXMgdGhhdCB3aWxsIHJlcGxhY2Ugbm9kZSBTW2hdIGFmdGVyCisJCQkJICAgYmFsYW5jaW5nIG9uIHRoZSBsZXZlbCBoIG9mIHRoZSB0cmVlLiAgSWYgMCB0aGVuIFMgaXMKKwkJCQkgICBiZWluZyBkZWxldGVkLCBpZiAxIHRoZW4gUyBpcyByZW1haW5pbmcgYW5kIG5vIG5ldyBub2RlcworCQkJCSAgIGFyZSBiZWluZyBjcmVhdGVkLCBpZiAyIG9yIDMgdGhlbiAxIG9yIDIgbmV3IG5vZGVzIGlzCisJCQkJICAgYmVpbmcgY3JlYXRlZCAqLwogCi0gIC8qIGZpZWxkcyB0aGF0IGFyZSB1c2VkIG9ubHkgZm9yIGJhbGFuY2luZyBsZWF2ZXMgb2YgdGhlIHRyZWUgKi8KLSAgaW50IGN1cl9ibGtudW07CS8qIG51bWJlciBvZiBlbXB0eSBibG9ja3MgaGF2aW5nIGJlZW4gYWxyZWFkeSBhbGxvY2F0ZWQJCQkqLwotICBpbnQgczBudW07ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpdGVtcyB0aGF0IGZhbGwgaW50byBsZWZ0IG1vc3QgIG5vZGUgd2hlbiBTWzBdIHNwbGl0cwkqLwotICBpbnQgczFudW07ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpdGVtcyB0aGF0IGZhbGwgaW50byBmaXJzdCAgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cwkqLwotICBpbnQgczJudW07ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpdGVtcyB0aGF0IGZhbGwgaW50byBzZWNvbmQgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cwkqLwotICBpbnQgbGJ5dGVzOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyB3aGljaCBjYW4gZmxvdyB0byB0aGUgbGVmdCBuZWlnaGJvciBmcm9tIHRoZQlsZWZ0CSovCi0gIC8qIG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkJCSovCi0gIC8qIGlmIC0xIHRoZW4gbm90aGluZyB3aWxsIGJlIHBhcnRpYWxseSBzaGlmdGVkICovCi0gIGludCByYnl0ZXM7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdpbGwgZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IgZnJvbSB0aGUgcmlnaHQJKi8KLSAgLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseQkJKi8KLSAgLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBpbnQgczFieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyB3aGljaCBmbG93IHRvIHRoZSBmaXJzdCAgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cwkqLwotICAgICAgICAgICAgCQkJLyogbm90ZTogaWYgU1swXSBzcGxpdHMgaW50byAzIG5vZGVzLCB0aGVuIGl0ZW1zIGRvIG5vdCBuZWVkIHRvIGJlIGN1dAkqLwotICBpbnQgczJieXRlczsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYnVmX3RvX2ZyZWVbTUFYX0ZSRUVfQkxPQ0tdOyAvKiBidWZmZXJzIHdoaWNoIGFyZSB0byBiZSBmcmVlZCBhZnRlciBkb19iYWxhbmNlIGZpbmlzaGVzIGJ5IHVuZml4X25vZGVzICovCi0gIGNoYXIgKiB2bl9idWY7CQkvKiBrbWFsbG9jZWQgbWVtb3J5LiBVc2VkIHRvIGNyZWF0ZQorCS8qIGZpZWxkcyB0aGF0IGFyZSB1c2VkIG9ubHkgZm9yIGJhbGFuY2luZyBsZWF2ZXMgb2YgdGhlIHRyZWUgKi8KKwlpbnQgY3VyX2Jsa251bTsJCS8qIG51bWJlciBvZiBlbXB0eSBibG9ja3MgaGF2aW5nIGJlZW4gYWxyZWFkeSBhbGxvY2F0ZWQgICAgICAgICAgICAgICAgICovCisJaW50IHMwbnVtOwkJLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIGxlZnQgbW9zdCAgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICAgICAqLworCWludCBzMW51bTsJCS8qIG51bWJlciBvZiBpdGVtcyB0aGF0IGZhbGwgaW50byBmaXJzdCAgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cyAgICAgKi8KKwlpbnQgczJudW07CQkvKiBudW1iZXIgb2YgaXRlbXMgdGhhdCBmYWxsIGludG8gc2Vjb25kIG5ldyBub2RlIHdoZW4gU1swXSBzcGxpdHMgICAgICovCisJaW50IGxieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyB3aGljaCBjYW4gZmxvdyB0byB0aGUgbGVmdCBuZWlnaGJvciBmcm9tIHRoZSAgICAgICAgbGVmdCAgICAqLworCS8qIG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkgICAgICAgICAqLworCS8qIGlmIC0xIHRoZW4gbm90aGluZyB3aWxsIGJlIHBhcnRpYWxseSBzaGlmdGVkICovCisJaW50IHJieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGZsb3cgdG8gdGhlIHJpZ2h0IG5laWdoYm9yIGZyb20gdGhlIHJpZ2h0ICAgICAgICAqLworCS8qIG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkgICAgICAgICAqLworCS8qIGlmIC0xIHRoZW4gbm90aGluZyB3aWxsIGJlIHBhcnRpYWxseSBzaGlmdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgczFieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyB3aGljaCBmbG93IHRvIHRoZSBmaXJzdCAgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cyAgICovCisJLyogbm90ZTogaWYgU1swXSBzcGxpdHMgaW50byAzIG5vZGVzLCB0aGVuIGl0ZW1zIGRvIG5vdCBuZWVkIHRvIGJlIGN1dCAgKi8KKwlpbnQgczJieXRlczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJ1Zl90b19mcmVlW01BWF9GUkVFX0JMT0NLXTsJLyogYnVmZmVycyB3aGljaCBhcmUgdG8gYmUgZnJlZWQgYWZ0ZXIgZG9fYmFsYW5jZSBmaW5pc2hlcyBieSB1bmZpeF9ub2RlcyAqLworCWNoYXIgKnZuX2J1ZjsJCS8qIGttYWxsb2NlZCBtZW1vcnkuIFVzZWQgdG8gY3JlYXRlCiAJCQkJICAgdmlydHVhbCBub2RlIGFuZCBrZWVwIG1hcCBvZgogCQkJCSAgIGRpcnRpZWQgYml0bWFwIGJsb2NrcyAqLwotICBpbnQgdm5fYnVmX3NpemU7CQkvKiBzaXplIG9mIHRoZSB2bl9idWYgKi8KLSAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHRiX3ZuOwkvKiBWTiBzdGFydHMgYWZ0ZXIgYml0bWFwIG9mIGJpdG1hcCBibG9ja3MgKi8KKwlpbnQgdm5fYnVmX3NpemU7CS8qIHNpemUgb2YgdGhlIHZuX2J1ZiAqLworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnRiX3ZuOwkvKiBWTiBzdGFydHMgYWZ0ZXIgYml0bWFwIG9mIGJpdG1hcCBibG9ja3MgKi8KIAotICBpbnQgZnNfZ2VuOyAgICAgICAgICAgICAgICAgIC8qIHNhdmVkIHZhbHVlIG9mIGByZWlzZXJmc19nZW5lcmF0aW9uJyBjb3VudGVyCi0JCQkgICAgICAgICAgc2VlIEZJTEVTWVNURU1fQ0hBTkdFRCgpIG1hY3JvIGluIHJlaXNlcmZzX2ZzLmggKi8KKwlpbnQgZnNfZ2VuOwkJLyogc2F2ZWQgdmFsdWUgb2YgYHJlaXNlcmZzX2dlbmVyYXRpb24nIGNvdW50ZXIKKwkJCQkgICBzZWUgRklMRVNZU1RFTV9DSEFOR0VEKCkgbWFjcm8gaW4gcmVpc2VyZnNfZnMuaCAqLwogI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgc3RydWN0IGluX2NvcmVfa2V5ICBrZXk7CSAgICAgIC8qIGtleSBwb2ludGVyLCB0byBwYXNzIHRvIGJsb2NrIGFsbG9jYXRvciBvcgotCQkJCSBhbm90aGVyIGxvdy1sZXZlbCBzdWJzeXN0ZW0gKi8KKwlzdHJ1Y3QgaW5fY29yZV9rZXkga2V5OwkvKiBrZXkgcG9pbnRlciwgdG8gcGFzcyB0byBibG9jayBhbGxvY2F0b3Igb3IKKwkJCQkgICBhbm90aGVyIGxvdy1sZXZlbCBzdWJzeXN0ZW0gKi8KICNlbmRpZgotfSA7Cit9OwogCiAvKiBUaGVzZSBhcmUgbW9kZXMgb2YgYmFsYW5jaW5nICovCiAKQEAgLTE0NzksMTMgKzE0MzAsMTIgQEAKIC8qIHVzZWQgaW4gZG9fYmFsYW5jZSBmb3IgcGFzc2luZyBwYXJlbnQgb2Ygbm9kZSBpbmZvcm1hdGlvbiB0aGF0IGhhcwogICAgYmVlbiBnb3R0ZW4gZnJvbSB0YiBzdHJ1Y3QgKi8KIHN0cnVjdCBidWZmZXJfaW5mbyB7Ci0gICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJpX2JoOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJpX3BhcmVudDsKLSAgICBpbnQgYmlfcG9zaXRpb247CisJc3RydWN0IHRyZWVfYmFsYW5jZSAqdGI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaV9iaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpX3BhcmVudDsKKwlpbnQgYmlfcG9zaXRpb247CiB9OwogCi0KIC8qIHRoZXJlIGFyZSA0IHR5cGVzIG9mIGl0ZW1zOiBzdGF0IGRhdGEsIGRpcmVjdG9yeSBpdGVtLCBpbmRpcmVjdCwgZGlyZWN0LgogKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKIHwJICAgICAgICAgICAgfCAga19vZmZzZXQgIHwga191bmlxdWVuZXNzIHwgbWVyZ2VhYmxlPyB8CkBAIC0xNTAzLDI0ICsxNDUzLDI0IEBACiAqLwogCiBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIHsKLSAgICBpbnQgKCpieXRlc19udW1iZXIpIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKTsKLSAgICB2b2lkICgqZGVjcmVtZW50X2tleSkgKHN0cnVjdCBjcHVfa2V5ICopOwotICAgIGludCAoKmlzX2xlZnRfbWVyZ2VhYmxlKSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGloLCB1bnNpZ25lZCBsb25nIGJzaXplKTsKLSAgICB2b2lkICgqcHJpbnRfaXRlbSkgKHN0cnVjdCBpdGVtX2hlYWQgKiwgY2hhciAqIGl0ZW0pOwotICAgIHZvaWQgKCpjaGVja19pdGVtKSAoc3RydWN0IGl0ZW1faGVhZCAqLCBjaGFyICogaXRlbSk7CisJaW50ICgqYnl0ZXNfbnVtYmVyKSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSk7CisJdm9pZCAoKmRlY3JlbWVudF9rZXkpIChzdHJ1Y3QgY3B1X2tleSAqKTsKKwlpbnQgKCppc19sZWZ0X21lcmdlYWJsZSkgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBpaCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYnNpemUpOworCXZvaWQgKCpwcmludF9pdGVtKSAoc3RydWN0IGl0ZW1faGVhZCAqLCBjaGFyICppdGVtKTsKKwl2b2lkICgqY2hlY2tfaXRlbSkgKHN0cnVjdCBpdGVtX2hlYWQgKiwgY2hhciAqaXRlbSk7CiAKLSAgICBpbnQgKCpjcmVhdGVfdmkpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgCi0JCSAgICAgIGludCBpc19hZmZlY3RlZCwgaW50IGluc2VydF9zaXplKTsKLSAgICBpbnQgKCpjaGVja19sZWZ0KSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwgCi0JCQkgICAgaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCk7Ci0gICAgaW50ICgqY2hlY2tfcmlnaHQpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKTsKLSAgICBpbnQgKCpwYXJ0X3NpemUpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcm9tLCBpbnQgdG8pOwotICAgIGludCAoKnVuaXRfbnVtKSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKTsKLSAgICB2b2lkICgqcHJpbnRfdmkpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpOworCWludCAoKmNyZWF0ZV92aSkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLAorCQkJICBpbnQgaXNfYWZmZWN0ZWQsIGludCBpbnNlcnRfc2l6ZSk7CisJaW50ICgqY2hlY2tfbGVmdCkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsCisJCQkgICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKTsKKwlpbnQgKCpjaGVja19yaWdodCkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUpOworCWludCAoKnBhcnRfc2l6ZSkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyb20sIGludCB0byk7CisJaW50ICgqdW5pdF9udW0pIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpOworCXZvaWQgKCpwcmludF92aSkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSk7CiB9OwogCi0KLWV4dGVybiBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zICogaXRlbV9vcHMgW1RZUEVfQU5ZICsgMV07CitleHRlcm4gc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyAqaXRlbV9vcHNbVFlQRV9BTlkgKyAxXTsKIAogI2RlZmluZSBvcF9ieXRlc19udW1iZXIoaWgsYnNpemUpICAgICAgICAgICAgICAgICAgICBpdGVtX29wc1tsZV9paF9rX3R5cGUgKGloKV0tPmJ5dGVzX251bWJlciAoaWgsIGJzaXplKQogI2RlZmluZSBvcF9pc19sZWZ0X21lcmdlYWJsZShrZXksYnNpemUpICAgICAgICAgICAgICBpdGVtX29wc1tsZV9rZXlfa190eXBlIChsZV9rZXlfdmVyc2lvbiAoa2V5KSwga2V5KV0tPmlzX2xlZnRfbWVyZ2VhYmxlIChrZXksIGJzaXplKQpAQCAtMTUzMyw4ICsxNDgzLDYgQEAKICNkZWZpbmUgb3BfdW5pdF9udW0odmkpCQkJCSAgICAgaXRlbV9vcHNbKHZpKS0+dmlfaW5kZXhdLT51bml0X251bSAodmkpCiAjZGVmaW5lIG9wX3ByaW50X3ZpKHZpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fb3BzWyh2aSktPnZpX2luZGV4XS0+cHJpbnRfdmkgKHZpKQogCi0KLQogI2RlZmluZSBDT01QX1NIT1JUX0tFWVMgY29tcF9zaG9ydF9rZXlzCiAKIC8qIG51bWJlciBvZiBibG9ja3MgcG9pbnRlZCB0byBieSB0aGUgaW5kaXJlY3QgaXRlbSAqLwpAQCAtMTU0NSw4ICsxNDkzLDcgQEAKIAogLyogbnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5lZCBieSB0aGUgZGlyZWN0IGl0ZW0gb3IgdGhlIHVuZm9ybWF0dGVkIG5vZGVzIHRoZSBpbmRpcmVjdCBpdGVtIHBvaW50cyB0byAqLwogCi0KLS8qIGdldCB0aGUgaXRlbSBoZWFkZXIgKi8gCisvKiBnZXQgdGhlIGl0ZW0gaGVhZGVyICovCiAjZGVmaW5lIEJfTl9QSVRFTV9IRUFEKGJoLGl0ZW1fbnVtKSAoIChzdHJ1Y3QgaXRlbV9oZWFkICogKSgoYmgpLT5iX2RhdGEgKyBCTEtIX1NJWkUpICsgKGl0ZW1fbnVtKSApCiAKIC8qIGdldCBrZXkgKi8KQEAgLTE1NzcsOSArMTUyNCw5IEBACiAjZGVmaW5lIFBVVF9CX0lfUE9TX1VORk1fUE9JTlRFUihiaCxpaCxwb3MsIHZhbCkgZG8geyooKCh1bnBfdCAqKUJfSV9QSVRFTShiaCxpaCkpICsgKHBvcykpID0gY3B1X3RvX2xlMzIodmFsKTsgfSB3aGlsZSAoMCkKIAogc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyB7Ci0gICAgX191MzIgb2JqZWN0aWQgOwotICAgIF9fdTMyIGRpcmlkIDsKLX0gOworCV9fdTMyIG9iamVjdGlkOworCV9fdTMyIGRpcmlkOworfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICBGVU5DVElPTiBERUNMQVJBVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNTk1LDExICsxNTQyLDExIEBACiAKIC8qIGZpcnN0IGJsb2NrIHdyaXR0ZW4gaW4gYSBjb21taXQuICAqLwogc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyB7Ci0gIF9fbGUzMiBqX3RyYW5zX2lkIDsJCQkvKiBpZCBvZiBjb21taXQgKi8KLSAgX19sZTMyIGpfbGVuIDsJCQkvKiBsZW5ndGggb2YgY29tbWl0LiBsZW4gKzEgaXMgdGhlIGNvbW1pdCBibG9jayAqLwotICBfX2xlMzIgal9tb3VudF9pZCA7CQkJCS8qIG1vdW50IGlkIG9mIHRoaXMgdHJhbnMqLwotICBfX2xlMzIgal9yZWFsYmxvY2tbMV0gOyAvKiByZWFsIGxvY2F0aW9ucyBmb3IgZWFjaCBibG9jayAqLwotfSA7CisJX19sZTMyIGpfdHJhbnNfaWQ7CS8qIGlkIG9mIGNvbW1pdCAqLworCV9fbGUzMiBqX2xlbjsJCS8qIGxlbmd0aCBvZiBjb21taXQuIGxlbiArMSBpcyB0aGUgY29tbWl0IGJsb2NrICovCisJX19sZTMyIGpfbW91bnRfaWQ7CS8qIG1vdW50IGlkIG9mIHRoaXMgdHJhbnMgKi8KKwlfX2xlMzIgal9yZWFsYmxvY2tbMV07CS8qIHJlYWwgbG9jYXRpb25zIGZvciBlYWNoIGJsb2NrICovCit9OwogCiAjZGVmaW5lIGdldF9kZXNjX3RyYW5zX2lkKGQpICAgbGUzMl90b19jcHUoKGQpLT5qX3RyYW5zX2lkKQogI2RlZmluZSBnZXRfZGVzY190cmFuc19sZW4oZCkgIGxlMzJfdG9fY3B1KChkKS0+al9sZW4pCkBAIC0xNjExLDEwICsxNTU4LDEwIEBACiAKIC8qIGxhc3QgYmxvY2sgd3JpdHRlbiBpbiBhIGNvbW1pdCAqLwogc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0IHsKLSAgX19sZTMyIGpfdHJhbnNfaWQgOwkJCS8qIG11c3QgbWF0Y2ggal90cmFuc19pZCBmcm9tIHRoZSBkZXNjIGJsb2NrICovCi0gIF9fbGUzMiBqX2xlbiA7CQkJLyogZGl0dG8gKi8KLSAgX19sZTMyIGpfcmVhbGJsb2NrWzFdIDsgLyogcmVhbCBsb2NhdGlvbnMgZm9yIGVhY2ggYmxvY2sgKi8KLX0gOworCV9fbGUzMiBqX3RyYW5zX2lkOwkvKiBtdXN0IG1hdGNoIGpfdHJhbnNfaWQgZnJvbSB0aGUgZGVzYyBibG9jayAqLworCV9fbGUzMiBqX2xlbjsJCS8qIGRpdHRvICovCisJX19sZTMyIGpfcmVhbGJsb2NrWzFdOwkvKiByZWFsIGxvY2F0aW9ucyBmb3IgZWFjaCBibG9jayAqLworfTsKIAogI2RlZmluZSBnZXRfY29tbWl0X3RyYW5zX2lkKGMpIGxlMzJfdG9fY3B1KChjKS0+al90cmFuc19pZCkKICNkZWZpbmUgZ2V0X2NvbW1pdF90cmFuc19sZW4oYykgICAgICAgIGxlMzJfdG9fY3B1KChjKS0+al9sZW4pCkBAIC0xNjI4LDE5ICsxNTc1LDE5IEBACiAqKiBhbmQgdGhpcyB0cmFuc2FjdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlcGxheWVkLgogKi8KIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciB7Ci0gIF9fbGUzMiBqX2xhc3RfZmx1c2hfdHJhbnNfaWQgOwkJLyogaWQgb2YgbGFzdCBmdWxseSBmbHVzaGVkIHRyYW5zYWN0aW9uICovCi0gIF9fbGUzMiBqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgOyAgICAgIC8qIG9mZnNldCBpbiB0aGUgbG9nIG9mIHdoZXJlIHRvIHN0YXJ0IHJlcGxheSBhZnRlciBhIGNyYXNoICovCi0gIF9fbGUzMiBqX21vdW50X2lkIDsKLSAgLyogMTIgKi8gc3RydWN0IGpvdXJuYWxfcGFyYW1zIGpoX2pvdXJuYWw7Ci19IDsKKwlfX2xlMzIgal9sYXN0X2ZsdXNoX3RyYW5zX2lkOwkvKiBpZCBvZiBsYXN0IGZ1bGx5IGZsdXNoZWQgdHJhbnNhY3Rpb24gKi8KKwlfX2xlMzIgal9maXJzdF91bmZsdXNoZWRfb2Zmc2V0OwkvKiBvZmZzZXQgaW4gdGhlIGxvZyBvZiB3aGVyZSB0byBzdGFydCByZXBsYXkgYWZ0ZXIgYSBjcmFzaCAqLworCV9fbGUzMiBqX21vdW50X2lkOworCS8qIDEyICovIHN0cnVjdCBqb3VybmFsX3BhcmFtcyBqaF9qb3VybmFsOworfTsKIAogLyogYmlnZ2VzdCB0dW5hYmxlIGRlZmluZXMgYXJlIHJpZ2h0IGhlcmUgKi8KLSNkZWZpbmUgSk9VUk5BTF9CTE9DS19DT1VOVCA4MTkyIC8qIG51bWJlciBvZiBibG9ja3MgaW4gdGhlIGpvdXJuYWwgKi8KLSNkZWZpbmUgSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAxMDI0ICAgLyogYmlnZ2VzdCBwb3NzaWJsZSBzaW5nbGUgdHJhbnNhY3Rpb24sIGRvbid0IGNoYW5nZSBmb3Igbm93ICg4LzMvOTkpICovCisjZGVmaW5lIEpPVVJOQUxfQkxPQ0tfQ09VTlQgODE5MgkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBqb3VybmFsICovCisjZGVmaW5lIEpPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQgMTAyNAkvKiBiaWdnZXN0IHBvc3NpYmxlIHNpbmdsZSB0cmFuc2FjdGlvbiwgZG9uJ3QgY2hhbmdlIGZvciBub3cgKDgvMy85OSkgKi8KICNkZWZpbmUgSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAyNTYKLSNkZWZpbmUgSk9VUk5BTF9NQVhfQkFUQ0hfREVGQVVMVCAgIDkwMCAvKiBtYXggYmxvY2tzIHRvIGJhdGNoIGludG8gb25lIHRyYW5zYWN0aW9uLCBkb24ndCBtYWtlIHRoaXMgYW55IGJpZ2dlciB0aGFuIDkwMCAqLworI2RlZmluZSBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUICAgOTAwCS8qIG1heCBibG9ja3MgdG8gYmF0Y2ggaW50byBvbmUgdHJhbnNhY3Rpb24sIGRvbid0IG1ha2UgdGhpcyBhbnkgYmlnZ2VyIHRoYW4gOTAwICovCiAjZGVmaW5lIEpPVVJOQUxfTUlOX1JBVElPIDIKLSNkZWZpbmUgSk9VUk5BTF9NQVhfQ09NTUlUX0FHRSAzMCAKKyNkZWZpbmUgSk9VUk5BTF9NQVhfQ09NTUlUX0FHRSAzMAogI2RlZmluZSBKT1VSTkFMX01BWF9UUkFOU19BR0UgMzAKICNkZWZpbmUgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKDMgKiAoTUFYX0hFSUdIVC0yKSArIDkpCiAjaWZkZWYgQ09ORklHX1FVT1RBCkBAIC0xNjY0LDEwICsxNjExLDEwIEBACiAqKiB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9kZXMgaXMgPiBtYXgsIHRoZSBub2RlIGlzIGZyZWVkLCBvdGhlcndpc2UsIAogKiogaXQgaXMgcHV0IG9uIGEgZnJlZSBsaXN0IGZvciBmYXN0ZXIgdXNlIGxhdGVyLgogKi8KLSNkZWZpbmUgUkVJU0VSRlNfTUlOX0JJVE1BUF9OT0RFUyAxMCAKLSNkZWZpbmUgUkVJU0VSRlNfTUFYX0JJVE1BUF9OT0RFUyAxMDAgCisjZGVmaW5lIFJFSVNFUkZTX01JTl9CSVRNQVBfTk9ERVMgMTAKKyNkZWZpbmUgUkVJU0VSRlNfTUFYX0JJVE1BUF9OT0RFUyAxMDAKIAotI2RlZmluZSBKQkhfSEFTSF9TSElGVCAxMyAvKiB0aGVzZSBhcmUgYmFzZWQgb24gam91cm5hbCBoYXNoIHNpemUgb2YgODE5MiAqLworI2RlZmluZSBKQkhfSEFTSF9TSElGVCAxMwkvKiB0aGVzZSBhcmUgYmFzZWQgb24gam91cm5hbCBoYXNoIHNpemUgb2YgODE5MiAqLwogI2RlZmluZSBKQkhfSEFTSF9NQVNLIDgxOTEKIAogI2RlZmluZSBfamhhc2hmbihzYixibG9jaykJXApAQCAtMTY4MSwxNCArMTYyOCwxNCBAQAogI2RlZmluZSBqb3VybmFsX2JyZWFkKHMsIGJsb2NrKSBfX2JyZWFkKFNCX0pPVVJOQUwocyktPmpfZGV2X2JkLCBibG9jaywgcy0+c19ibG9ja3NpemUpCiAKIGVudW0gcmVpc2VyZnNfYmhfc3RhdGVfYml0cyB7Ci0gICAgQkhfSkRpcnR5ID0gQkhfUHJpdmF0ZVN0YXJ0LCAvKiBidWZmZXIgaXMgaW4gY3VycmVudCB0cmFuc2FjdGlvbiAqLwotICAgIEJIX0pEaXJ0eV93YWl0LAotICAgIEJIX0pOZXcsICAgICAgICAgICAgICAgICAgICAgLyogZGlzayBibG9jayB3YXMgdGFrZW4gb2ZmIGZyZWUgbGlzdCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlaW5nIGluIGEgZmluaXNoZWQgdHJhbnNhY3Rpb24sIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cml0dGVuIHRvIGRpc2suIENhbiBiZSByZXVzZWQgaW1tZWQuICovCi0gICAgQkhfSlByZXBhcmVkLAotICAgIEJIX0pSZXN0b3JlX2RpcnR5LAotICAgIEJIX0pUZXN0LCAvLyBkZWJ1Z2dpbmcgb25seSB3aWxsIGdvIGF3YXkKKwlCSF9KRGlydHkgPSBCSF9Qcml2YXRlU3RhcnQsCS8qIGJ1ZmZlciBpcyBpbiBjdXJyZW50IHRyYW5zYWN0aW9uICovCisJQkhfSkRpcnR5X3dhaXQsCisJQkhfSk5ldywJCS8qIGRpc2sgYmxvY2sgd2FzIHRha2VuIG9mZiBmcmVlIGxpc3QgYmVmb3JlCisJCQkJICogYmVpbmcgaW4gYSBmaW5pc2hlZCB0cmFuc2FjdGlvbiwgb3IKKwkJCQkgKiB3cml0dGVuIHRvIGRpc2suIENhbiBiZSByZXVzZWQgaW1tZWQuICovCisJQkhfSlByZXBhcmVkLAorCUJIX0pSZXN0b3JlX2RpcnR5LAorCUJIX0pUZXN0LAkJLy8gZGVidWdnaW5nIG9ubHkgd2lsbCBnbyBhd2F5CiB9OwogCiBCVUZGRVJfRk5TKEpEaXJ0eSwgam91cm5hbGVkKTsKQEAgLTE3MDgsMTc1ICsxNjU1LDE5MiBAQAogKiogdHJhbnNhY3Rpb24gaGFuZGxlIHdoaWNoIGlzIHBhc3NlZCBhcm91bmQgZm9yIGFsbCBqb3VybmFsIGNhbGxzCiAqLwogc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB7Ci0gIHN0cnVjdCBzdXBlcl9ibG9jayAqdF9zdXBlciA7IC8qIHN1cGVyIGZvciB0aGlzIEZTIHdoZW4gam91cm5hbF9iZWdpbiB3YXMKLQkJCQkgICBjYWxsZWQuIHNhdmVzIGNhbGxzIHRvIHJlaXNlcmZzX2dldF9zdXBlcgotCQkJCSAgIGFsc28gdXNlZCBieSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHRvIG1ha2UKLQkJCQkgICBzdXJlIHRoZXkgYXJlIG5lc3Rpbmcgb24gdGhlIHJpZ2h0IEZTCi0JCQkJICAgX211c3RfIGJlIGZpcnN0IGluIHRoZSBoYW5kbGUKLQkJCQkqLwotICBpbnQgdF9yZWZjb3VudDsKLSAgaW50IHRfYmxvY2tzX2xvZ2dlZCA7ICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyB0aGlzIHdyaXRlciBoYXMgbG9nZ2VkICovCi0gIGludCB0X2Jsb2Nrc19hbGxvY2F0ZWQgOyAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgdGhpcyB3cml0ZXIgYWxsb2NhdGVkICovCi0gIHVuc2lnbmVkIGxvbmcgdF90cmFuc19pZCA7ICAgIC8qIHNhbml0eSBjaGVjaywgZXF1YWxzIHRoZSBjdXJyZW50IHRyYW5zIGlkICovCi0gIHZvaWQgKnRfaGFuZGxlX3NhdmUgOwkJLyogc2F2ZSBleGlzdGluZyBjdXJyZW50LT5qb3VybmFsX2luZm8gKi8KLSAgdW5zaWduZWQgZGlzcGxhY2VfbmV3X2Jsb2NrczoxOyAvKiBpZiBuZXcgYmxvY2sgYWxsb2NhdGlvbiBvY2N1cnJlcywgdGhhdCBibG9jawotCQkJCSAgIHNob3VsZCBiZSBkaXNwbGFjZWQgZnJvbSBvdGhlcnMgKi8KLSAgc3RydWN0IGxpc3RfaGVhZCB0X2xpc3Q7Ci19IDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnRfc3VwZXI7CS8qIHN1cGVyIGZvciB0aGlzIEZTIHdoZW4gam91cm5hbF9iZWdpbiB3YXMKKwkJCQkJICAgY2FsbGVkLiBzYXZlcyBjYWxscyB0byByZWlzZXJmc19nZXRfc3VwZXIKKwkJCQkJICAgYWxzbyB1c2VkIGJ5IG5lc3RlZCB0cmFuc2FjdGlvbnMgdG8gbWFrZQorCQkJCQkgICBzdXJlIHRoZXkgYXJlIG5lc3Rpbmcgb24gdGhlIHJpZ2h0IEZTCisJCQkJCSAgIF9tdXN0XyBiZSBmaXJzdCBpbiB0aGUgaGFuZGxlCisJCQkJCSAqLworCWludCB0X3JlZmNvdW50OworCWludCB0X2Jsb2Nrc19sb2dnZWQ7CS8qIG51bWJlciBvZiBibG9ja3MgdGhpcyB3cml0ZXIgaGFzIGxvZ2dlZCAqLworCWludCB0X2Jsb2Nrc19hbGxvY2F0ZWQ7CS8qIG51bWJlciBvZiBibG9ja3MgdGhpcyB3cml0ZXIgYWxsb2NhdGVkICovCisJdW5zaWduZWQgbG9uZyB0X3RyYW5zX2lkOwkvKiBzYW5pdHkgY2hlY2ssIGVxdWFscyB0aGUgY3VycmVudCB0cmFucyBpZCAqLworCXZvaWQgKnRfaGFuZGxlX3NhdmU7CS8qIHNhdmUgZXhpc3RpbmcgY3VycmVudC0+am91cm5hbF9pbmZvICovCisJdW5zaWduZWQgZGlzcGxhY2VfbmV3X2Jsb2NrczoxOwkvKiBpZiBuZXcgYmxvY2sgYWxsb2NhdGlvbiBvY2N1cnJlcywgdGhhdCBibG9jaworCQkJCQkgICBzaG91bGQgYmUgZGlzcGxhY2VkIGZyb20gb3RoZXJzICovCisJc3RydWN0IGxpc3RfaGVhZCB0X2xpc3Q7Cit9OwogCiAvKiB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygb3JkZXJlZCBhbmQgdGFpbCB3cml0ZXMsIGF0dGFjaGVkIHRvIHRoZSBidWZmZXIKICAqIGhlYWQgdGhyb3VnaCBiX2pvdXJuYWxfaGVhZC4KICAqLwogc3RydWN0IHJlaXNlcmZzX2poIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKIHZvaWQgcmVpc2VyZnNfZnJlZV9qaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIGludCByZWlzZXJmc19hZGRfdGFpbF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogaW50IHJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7Ci1pbnQgam91cm5hbF9tYXJrX2RpcnR5KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIDsKK2ludCBqb3VybmFsX21hcmtfZGlydHkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLAorCQkgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCi1zdGF0aWMgaW5saW5lIGludAotcmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7Ci0gICAgaWYgKHJlaXNlcmZzX2RhdGFfbG9nKGlub2RlLT5pX3NiKSB8fAotICAgICAgIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfZGF0YV9sb2cpKQotICAgICAgICByZXR1cm4gMSA7Ci0gICAgcmV0dXJuIDAgOworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChyZWlzZXJmc19kYXRhX2xvZyhpbm9kZS0+aV9zYikgfHwKKwkgICAgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9kYXRhX2xvZykpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKLSAgICBpZiAodGggJiYgdGgtPnRfc3VwZXIgPT0gcykKLSAgICAgICAgcmV0dXJuIDEgOwotICAgIGlmICh0aCAmJiB0aC0+dF9zdXBlciA9PSBOVUxMKQotICAgICAgICBCVUcoKTsKLSAgICByZXR1cm4gMCA7CitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwlpZiAodGggJiYgdGgtPnRfc3VwZXIgPT0gcykKKwkJcmV0dXJuIDE7CisJaWYgKHRoICYmIHRoLT50X3N1cGVyID09IE5VTEwpCisJCUJVRygpOworCXJldHVybiAwOwogfQogCiBpbnQgcmVpc2VyZnNfYXN5bmNfcHJvZ3Jlc3Nfd2FpdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwogCi1zdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICoKLXJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCBjb3VudCk7CitzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpyZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHN0cnVjdAorCQkJCQkJCQkgICAgc3VwZXJfYmxvY2sKKwkJCQkJCQkJICAgICosCisJCQkJCQkJCSAgICBpbnQgY291bnQpOwogaW50IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKik7CiBpbnQgcmVpc2VyZnNfY29tbWl0X3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKTsKKwkJCSB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CiBpbnQgcmVpc2VyZnNfZmx1c2hfb2xkX2NvbW1pdHMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotaW50IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoc3RydWN0IGlub2RlICopIDsKLWludCAgcmVpc2VyZnNfaW5vZGVfbmVlZHNfY29tbWl0KHN0cnVjdCBpbm9kZSAqKSA7Ci12b2lkIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKikgOwotdm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgOwotdm9pZCByZWlzZXJmc19ibG9ja193cml0ZXMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpIDsKLXZvaWQgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgOwotdm9pZCByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY2hhciAqY2FsbGVyKSA7Ci1pbnQgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHdhaXQpIDsKLXZvaWQgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIDsKLWludCBqb3VybmFsX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiBqX2Rldl9uYW1lLCBpbnQgb2xkX2Zvcm1hdCwgdW5zaWduZWQgaW50KSA7Ci1pbnQgam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikgOwotaW50IGpvdXJuYWxfcmVsZWFzZV9lcnJvcihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopIDsKLWludCBqb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKSA7Ci1pbnQgam91cm5hbF9lbmRfc3luYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKSA7Ci1pbnQgam91cm5hbF9tYXJrX2ZyZWVkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosIGJfYmxvY2tucl90IGJsb2NrbnIpIDsKLWludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBpbnQpIDsKLWludCByZWlzZXJmc19pbl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBpbnQgYm1hcF9uciwgaW50IGJpdF9uciwgaW50IHNlYXJjaGFsbCwgYl9ibG9ja25yX3QgKm5leHQpIDsKLWludCBqb3VybmFsX2JlZ2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcpIDsKLWludCBqb3VybmFsX2pvaW5fYWJvcnQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZykgOwotdm9pZCByZWlzZXJmc19qb3VybmFsX2Fib3J0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pOwotdm9pZCByZWlzZXJmc19hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1pbnQgcmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICosIGludCkgOworaW50IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoc3RydWN0IGlub2RlICopOworaW50IHJlaXNlcmZzX2lub2RlX25lZWRzX2NvbW1pdChzdHJ1Y3QgaW5vZGUgKik7Cit2b2lkIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKik7Cit2b2lkIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK3ZvaWQgcmVpc2VyZnNfYmxvY2tfd3JpdGVzKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKTsKK3ZvaWQgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7Cit2b2lkIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjaGFyICpjYWxsZXIpOworaW50IHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJIGludCB3YWl0KTsKK3ZvaWQgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CitpbnQgam91cm5hbF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICpqX2Rldl9uYW1lLCBpbnQgb2xkX2Zvcm1hdCwKKwkJIHVuc2lnbmVkIGludCk7CitpbnQgam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopOworaW50IGpvdXJuYWxfcmVsZWFzZV9lcnJvcihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosCisJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2ludCBqb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLAorCQl1bnNpZ25lZCBsb25nKTsKK2ludCBqb3VybmFsX2VuZF9zeW5jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosCisJCSAgICAgdW5zaWduZWQgbG9uZyk7CitpbnQgam91cm5hbF9tYXJrX2ZyZWVkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqLCBiX2Jsb2NrbnJfdCBibG9ja25yKTsKK2ludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBpbnQpOworaW50IHJlaXNlcmZzX2luX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGludCBibWFwX25yLCBpbnQgYml0X25yLAorCQkJaW50IHNlYXJjaGFsbCwgYl9ibG9ja25yX3QgKiBuZXh0KTsKK2ludCBqb3VybmFsX2JlZ2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyk7CitpbnQgam91cm5hbF9qb2luX2Fib3J0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgcmVpc2VyZnNfam91cm5hbF9hYm9ydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pOwordm9pZCByZWlzZXJmc19hYm9ydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCByZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJCSAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqLCBpbnQpOwogCi12b2lkIGFkZF9zYXZlX2xpbmsgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiB0aCwKLQkJCQkJc3RydWN0IGlub2RlICogaW5vZGUsIGludCB0cnVuY2F0ZSk7Ci1pbnQgcmVtb3ZlX3NhdmVfbGluayAoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB0cnVuY2F0ZSk7Cit2b2lkIGFkZF9zYXZlX2xpbmsoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0cnVuY2F0ZSk7CitpbnQgcmVtb3ZlX3NhdmVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHJ1bmNhdGUpOwogCiAvKiBvYmplY3RpZC5jICovCi1fX3UzMiByZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCk7Ci12b2lkIHJlaXNlcmZzX3JlbGVhc2Vfb2JqZWN0aWQgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBfX3UzMiBvYmplY3RpZF90b19yZWxlYXNlKTsKLWludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikgOworX191MzIgcmVpc2VyZnNfZ2V0X3VudXNlZF9vYmplY3RpZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCk7Cit2b2lkIHJlaXNlcmZzX3JlbGVhc2Vfb2JqZWN0aWQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICAgX191MzIgb2JqZWN0aWRfdG9fcmVsZWFzZSk7CitpbnQgcmVpc2VyZnNfY29udmVydF9vYmplY3RpZF9tYXBfdjEoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCiAvKiBzdHJlZS5jICovCiBpbnQgQl9JU19JTl9UUkVFKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKLWV4dGVybiB2b2lkIGNvcHlfaXRlbV9oZWFkKHN0cnVjdCBpdGVtX2hlYWQgKiBwX3ZfdG8sCi0JCQkJCQkJCSAgY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIHBfdl9mcm9tKTsKK2V4dGVybiB2b2lkIGNvcHlfaXRlbV9oZWFkKHN0cnVjdCBpdGVtX2hlYWQgKnBfdl90bywKKwkJCSAgIGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKnBfdl9mcm9tKTsKIAogLy8gZmlyc3Qga2V5IGlzIGluIGNwdSBmb3JtLCBzZWNvbmQgLSBsZQotZXh0ZXJuIGludCAgY29tcF9zaG9ydF9rZXlzIChjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogbGVfa2V5LAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGNwdV9rZXkpOwotZXh0ZXJuIHZvaWQgbGVfa2V5MmNwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICogdG8sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBmcm9tKTsKK2V4dGVybiBpbnQgY29tcF9zaG9ydF9rZXlzKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmxlX2tleSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpjcHVfa2V5KTsKK2V4dGVybiB2b2lkIGxlX2tleTJjcHVfa2V5KHN0cnVjdCBjcHVfa2V5ICp0bywgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZnJvbSk7CiAKIC8vIGJvdGggYXJlIGluIGxlIGZvcm0KLWV4dGVybiBpbnQgY29tcF9sZV9rZXlzIChjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICosIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKik7Ci1leHRlcm4gaW50IGNvbXBfc2hvcnRfbGVfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICopOworZXh0ZXJuIGludCBjb21wX2xlX2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqLAorCQkJY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqKTsKK2V4dGVybiBpbnQgY29tcF9zaG9ydF9sZV9rZXlzKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKik7CiAKIC8vCiAvLyBnZXQga2V5IHZlcnNpb24gZnJvbSBvbiBkaXNrIGtleSAtIGtsdWRnZQogLy8KLXN0YXRpYyBpbmxpbmUgaW50IGxlX2tleV92ZXJzaW9uIChjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQorc3RhdGljIGlubGluZSBpbnQgbGVfa2V5X3ZlcnNpb24oY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KQogewotICAgIGludCB0eXBlOwotICAgIAotICAgIHR5cGUgPSBvZmZzZXRfdjJfa190eXBlKCAmKGtleS0+dS5rX29mZnNldF92MikpOwotICAgIGlmICh0eXBlICE9IFRZUEVfRElSRUNUICYmIHR5cGUgIT0gVFlQRV9JTkRJUkVDVCAmJiB0eXBlICE9IFRZUEVfRElSRU5UUlkpCi0JcmV0dXJuIEtFWV9GT1JNQVRfM181OworCWludCB0eXBlOwogCi0gICAgcmV0dXJuIEtFWV9GT1JNQVRfM182OwotCQorCXR5cGUgPSBvZmZzZXRfdjJfa190eXBlKCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSk7CisJaWYgKHR5cGUgIT0gVFlQRV9ESVJFQ1QgJiYgdHlwZSAhPSBUWVBFX0lORElSRUNUCisJICAgICYmIHR5cGUgIT0gVFlQRV9ESVJFTlRSWSkKKwkJcmV0dXJuIEtFWV9GT1JNQVRfM181OworCisJcmV0dXJuIEtFWV9GT1JNQVRfM182OworCiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHlfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICp0bywgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZnJvbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2tleShzdHJ1Y3QgcmVpc2VyZnNfa2V5ICp0bywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpmcm9tKQogewotICAgIG1lbWNweSAodG8sIGZyb20sIEtFWV9TSVpFKTsKKwltZW1jcHkodG8sIGZyb20sIEtFWV9TSVpFKTsKIH0KIAotCi1pbnQgY29tcF9pdGVtcyAoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIHN0b3JlZF9paCwgY29uc3Qgc3RydWN0IHBhdGggKiBwX3NfcGF0aCk7Ci1jb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogZ2V0X3JrZXkgKGNvbnN0IHN0cnVjdCBwYXRoICogcF9zX2Noa19wYXRoLAotCQkJCQkJCSBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiKTsKLWludCBzZWFyY2hfYnlfa2V5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiwgCi0JCQkJICAgc3RydWN0IHBhdGggKiwgaW50KTsKK2ludCBjb21wX2l0ZW1zKGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKnN0b3JlZF9paCwgY29uc3Qgc3RydWN0IHBhdGggKnBfc19wYXRoKTsKK2NvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9ya2V5KGNvbnN0IHN0cnVjdCBwYXRoICpwX3NfY2hrX3BhdGgsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKTsKK2ludCBzZWFyY2hfYnlfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqLAorCQkgIHN0cnVjdCBwYXRoICosIGludCk7CiAjZGVmaW5lIHNlYXJjaF9pdGVtKHMsa2V5LHBhdGgpIHNlYXJjaF9ieV9rZXkgKHMsIGtleSwgcGF0aCwgRElTS19MRUFGX05PREVfTEVWRUwpCi1pbnQgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiwgCi0JCQkJCQkJCWNvbnN0IHN0cnVjdCBjcHVfa2V5ICogcF9zX2NwdV9rZXksIAotCQkJCQkJCQlzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aCk7Ci1leHRlcm4gdm9pZCBkZWNyZW1lbnRfYmNvdW50IChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBwX3NfYmgpOwotdm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCAoc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgpOwotdm9pZCBwYXRocmVsc2UgKHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoKTsKLWludCByZWlzZXJmc19jaGVja19wYXRoKHN0cnVjdCBwYXRoICpwKSA7Ci12b2lkIHBhdGhyZWxzZV9hbmRfcmVzdG9yZSAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aCk7CitpbnQgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19jcHVfa2V5LAorCQkJICAgICAgIHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgpOworZXh0ZXJuIHZvaWQgZGVjcmVtZW50X2Jjb3VudChzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaCk7Cit2b2lkIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgpOwordm9pZCBwYXRocmVsc2Uoc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCk7CitpbnQgcmVpc2VyZnNfY2hlY2tfcGF0aChzdHJ1Y3QgcGF0aCAqcCk7Cit2b2lkIHBhdGhyZWxzZV9hbmRfcmVzdG9yZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgpOwogCi1pbnQgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCSAgc3RydWN0IHBhdGggKiBwYXRoLCAKLQkJCSAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXksCi0JCQkgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwKLQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqIGJvZHkpOworaW50IHJlaXNlcmZzX2luc2VydF9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJIHN0cnVjdCBwYXRoICpwYXRoLAorCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkgc3RydWN0IGl0ZW1faGVhZCAqaWgsCisJCQkgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqYm9keSk7CiAKLWludCByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgICAgc3RydWN0IHBhdGggKiBwYXRoLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXksCi0JCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgY29uc3QgY2hhciAqIGJvZHksIGludCBwYXN0ZV9zaXplKTsKK2ludCByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgIHN0cnVjdCBwYXRoICpwYXRoLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBjb25zdCBjaGFyICpib2R5LCBpbnQgcGFzdGVfc2l6ZSk7CiAKLWludCByZWlzZXJmc19jdXRfZnJvbV9pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCSAgICBzdHJ1Y3QgcGF0aCAqIHBhdGgsCi0JCQkgICAgc3RydWN0IGNwdV9rZXkgKiBrZXksCi0JCQkgICAgc3RydWN0IGlub2RlICogaW5vZGUsCi0JCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkgICAgbG9mZl90IG5ld19maWxlX3NpemUpOworaW50IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCSAgIHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UsIGxvZmZfdCBuZXdfZmlsZV9zaXplKTsKIAotaW50IHJlaXNlcmZzX2RlbGV0ZV9pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCSAgc3RydWN0IHBhdGggKiBwYXRoLCAKLQkJCSAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXksCi0JCQkgIHN0cnVjdCBpbm9kZSAqIGlub2RlLCAKLQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc191bl9iaCk7CitpbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgc3RydWN0IHBhdGggKnBhdGgsCisJCQkgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc191bl9iaCk7CiAKLXZvaWQgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSk7Ci1pbnQgcmVpc2VyZnNfZGVsZXRlX29iamVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSk7Ci1pbnQgcmVpc2VyZnNfZG9fdHJ1bmNhdGUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgc3RydWN0ICBpbm9kZSAqIHBfc19pbm9kZSwgc3RydWN0IHBhZ2UgKiwgCi0JCQkgICBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpOwordm9pZCByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpOworaW50IHJlaXNlcmZzX2RlbGV0ZV9vYmplY3Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSk7CitpbnQgcmVpc2VyZnNfZG9fdHJ1bmNhdGUoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgc3RydWN0IGlub2RlICpwX3NfaW5vZGUsIHN0cnVjdCBwYWdlICosCisJCQkgaW50IHVwZGF0ZV90aW1lc3RhbXBzKTsKIAogI2RlZmluZSBpX2Jsb2NrX3NpemUoaW5vZGUpICgoaW5vZGUpLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKICNkZWZpbmUgZmlsZV9zaXplKGlub2RlKSAoKGlub2RlKS0+aV9zaXplKQpAQCAtMTg4NSw2NiArMTg0OSw2NyBAQAogI2RlZmluZSB0YWlsX2hhc190b19iZV9wYWNrZWQoaW5vZGUpIChoYXZlX2xhcmdlX3RhaWxzICgoaW5vZGUpLT5pX3NiKT9cCiAhU1RPUkVfVEFJTF9JTl9VTkZNX1MxKGZpbGVfc2l6ZSAoaW5vZGUpLCB0YWlsX3NpemUoaW5vZGUpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOmhhdmVfc21hbGxfdGFpbHMgKChpbm9kZSktPmlfc2IpPyFTVE9SRV9UQUlMX0lOX1VORk1fUzIoZmlsZV9zaXplIChpbm9kZSksIHRhaWxfc2l6ZShpbm9kZSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk6MCApCiAKLXZvaWQgcGFkZF9pdGVtIChjaGFyICogaXRlbSwgaW50IHRvdGFsX2xlbmd0aCwgaW50IGxlbmd0aCk7Cit2b2lkIHBhZGRfaXRlbShjaGFyICppdGVtLCBpbnQgdG90YWxfbGVuZ3RoLCBpbnQgbGVuZ3RoKTsKIAogLyogaW5vZGUuYyAqLwogLyogYXJncyBmb3IgdGhlIGNyZWF0ZSBwYXJhbWV0ZXIgb2YgcmVpc2VyZnNfZ2V0X2Jsb2NrICovCi0jZGVmaW5lIEdFVF9CTE9DS19OT19DUkVBVEUgMCAvKiBkb24ndCBjcmVhdGUgbmV3IGJsb2NrcyBvciBjb252ZXJ0IHRhaWxzICovCi0jZGVmaW5lIEdFVF9CTE9DS19DUkVBVEUgMSAgICAvKiBhZGQgYW55dGhpbmcgeW91IG5lZWQgdG8gZmluZCBibG9jayAqLwotI2RlZmluZSBHRVRfQkxPQ0tfTk9fSE9MRSAyICAgLyogcmV0dXJuIC1FTk9FTlQgZm9yIGZpbGUgaG9sZXMgKi8KLSNkZWZpbmUgR0VUX0JMT0NLX1JFQURfRElSRUNUIDQgIC8qIHJlYWQgdGhlIHRhaWwgaWYgaW5kaXJlY3QgaXRlbSBub3QgZm91bmQgKi8KLSNkZWZpbmUgR0VUX0JMT0NLX05PX0lTRU0gICAgIDggLyogaV9zZW0gaXMgbm90IGhlbGQsIGRvbid0IHByZWFsbG9jYXRlICovCi0jZGVmaW5lIEdFVF9CTE9DS19OT19EQU5HTEUgICAxNiAvKiBkb24ndCBsZWF2ZSBhbnkgdHJhbnNhY3Rpb25zIHJ1bm5pbmcgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX05PX0NSRUFURSAwCS8qIGRvbid0IGNyZWF0ZSBuZXcgYmxvY2tzIG9yIGNvbnZlcnQgdGFpbHMgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX0NSRUFURSAxCS8qIGFkZCBhbnl0aGluZyB5b3UgbmVlZCB0byBmaW5kIGJsb2NrICovCisjZGVmaW5lIEdFVF9CTE9DS19OT19IT0xFIDIJLyogcmV0dXJuIC1FTk9FTlQgZm9yIGZpbGUgaG9sZXMgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX1JFQURfRElSRUNUIDQJLyogcmVhZCB0aGUgdGFpbCBpZiBpbmRpcmVjdCBpdGVtIG5vdCBmb3VuZCAqLworI2RlZmluZSBHRVRfQkxPQ0tfTk9fSVNFTSAgICAgOAkvKiBpX3NlbSBpcyBub3QgaGVsZCwgZG9uJ3QgcHJlYWxsb2NhdGUgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX05PX0RBTkdMRSAgIDE2CS8qIGRvbid0IGxlYXZlIGFueSB0cmFuc2FjdGlvbnMgcnVubmluZyAqLwogCi1pbnQgcmVzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpOwotdm9pZCByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJncykgOwotaW50IHJlaXNlcmZzX2ZpbmRfYWN0b3Ioc3RydWN0IGlub2RlICogaW5vZGUsIHZvaWQgKnApIDsKLWludCByZWlzZXJmc19pbml0X2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdm9pZCAqcCkgOwotdm9pZCByZWlzZXJmc19kZWxldGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKTsKLWludCByZWlzZXJmc193cml0ZV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUsIGludCkgOwotaW50IHJlaXNlcmZzX2dldF9ibG9jayAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsIGludCBjcmVhdGUpOwotc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqKSA7Ci1zdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGZodHlwZSwKLQkJCQkgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRlY3QsIHN0cnVjdCBkZW50cnkgKmRlKSwKLQkJCQkgIHZvaWQgKmNvbnRleHQpIDsKLWludCByZWlzZXJmc19lbmNvZGVfZmgoIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKmRhdGEsIGludCAqbGVucCwgCi0JCQkJCQlpbnQgY29ubmVjdGFibGUgKTsKK2ludCByZXN0YXJ0X3RyYW5zYWN0aW9uKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpOwordm9pZCByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3MpOworaW50IHJlaXNlcmZzX2ZpbmRfYWN0b3Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqcCk7CitpbnQgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqcCk7Cit2b2lkIHJlaXNlcmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCByZWlzZXJmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQpOworaW50IHJlaXNlcmZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKTsKK3N0cnVjdCBkZW50cnkgKnJlaXNlcmZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKik7CitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKiBkYXRhLAorCQkJCSAgaW50IGxlbiwgaW50IGZodHlwZSwKKwkJCQkgIGludCAoKmFjY2VwdGFibGUpICh2b2lkICpjb250ZWN0LAorCQkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICogZGUpLAorCQkJCSAgdm9pZCAqY29udGV4dCk7CitpbnQgcmVpc2VyZnNfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKiBkYXRhLCBpbnQgKmxlbnAsCisJCSAgICAgICBpbnQgY29ubmVjdGFibGUpOwogCi1pbnQgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShzdHJ1Y3QgaW5vZGUgKiwgaW50IHVwZGF0ZV90aW1lc3RhbXBzKSA7Ci12b2lkIG1ha2VfY3B1X2tleSAoc3RydWN0IGNwdV9rZXkgKiBjcHVfa2V5LCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IG9mZnNldCwKLQkJICAgaW50IHR5cGUsIGludCBrZXlfbGVuZ3RoKTsKLXZvaWQgbWFrZV9sZV9pdGVtX2hlYWQgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXksIAotCQkJaW50IHZlcnNpb24sCi0JCQlsb2ZmX3Qgb2Zmc2V0LCBpbnQgdHlwZSwgaW50IGxlbmd0aCwgaW50IGVudHJ5X2NvdW50KTsKLXN0cnVjdCBpbm9kZSAqIHJlaXNlcmZzX2lnZXQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXkpOworaW50IHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoc3RydWN0IGlub2RlICosIGludCB1cGRhdGVfdGltZXN0YW1wcyk7Cit2b2lkIG1ha2VfY3B1X2tleShzdHJ1Y3QgY3B1X2tleSAqY3B1X2tleSwgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwKKwkJICBpbnQgdHlwZSwgaW50IGtleV9sZW5ndGgpOwordm9pZCBtYWtlX2xlX2l0ZW1faGVhZChzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJICAgICAgIGludCB2ZXJzaW9uLAorCQkgICAgICAgbG9mZl90IG9mZnNldCwgaW50IHR5cGUsIGludCBsZW5ndGgsIGludCBlbnRyeV9jb3VudCk7CitzdHJ1Y3QgaW5vZGUgKnJlaXNlcmZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5KTsKIAoraW50IHJlaXNlcmZzX25ld19pbm9kZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWUsIGxvZmZfdCBpX3NpemUsCisJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCi1pbnQgcmVpc2VyZnNfbmV3X2lub2RlIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJICAgc3RydWN0IGlub2RlICogZGlyLCBpbnQgbW9kZSwgCi0JCQkJICAgY29uc3QgY2hhciAqIHN5bW5hbWUsIGxvZmZfdCBpX3NpemUsCi0JCQkJICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLQotdm9pZCByZWlzZXJmc191cGRhdGVfc2Rfc2l6ZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IHNpemUpOwordm9pZCByZWlzZXJmc191cGRhdGVfc2Rfc2l6ZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfdXBkYXRlX3NkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQorCQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkX3NpemUodGgsIGlub2RlLCBpbm9kZS0+aV9zaXplKSA7CisJcmVpc2VyZnNfdXBkYXRlX3NkX3NpemUodGgsIGlub2RlLCBpbm9kZS0+aV9zaXplKTsKIH0KIAotdm9pZCBzZF9hdHRyc190b19pX2F0dHJzKCBfX3UxNiBzZF9hdHRycywgc3RydWN0IGlub2RlICppbm9kZSApOwotdm9pZCBpX2F0dHJzX3RvX3NkX2F0dHJzKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3UxNiAqc2RfYXR0cnMgKTsKK3ZvaWQgc2RfYXR0cnNfdG9faV9hdHRycyhfX3UxNiBzZF9hdHRycywgc3RydWN0IGlub2RlICppbm9kZSk7Cit2b2lkIGlfYXR0cnNfdG9fc2RfYXR0cnMoc3RydWN0IGlub2RlICppbm9kZSwgX191MTYgKiBzZF9hdHRycyk7CiBpbnQgcmVpc2VyZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CiAKIC8qIG5hbWVpLmMgKi8KLXZvaWQgc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSk7Ci1pbnQgc2VhcmNoX2J5X2VudHJ5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LCAKLQkJCSBzdHJ1Y3QgcGF0aCAqIHBhdGgsIAotCQkJIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSk7Ci1zdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKikgOwordm9pZCBzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbihzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSk7CitpbnQgc2VhcmNoX2J5X2VudHJ5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkJc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKTsKK3N0cnVjdCBkZW50cnkgKnJlaXNlcmZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqKTsKIC8qIHByb2Nmcy5jICovCiAKICNpZiBkZWZpbmVkKCBDT05GSUdfUFJPQ19GUyApICYmIGRlZmluZWQoIENPTkZJR19SRUlTRVJGU19QUk9DX0lORk8gKQpAQCAtMTk1MywxNSArMTkxOCwxNSBAQAogI3VuZGVmIFJFSVNFUkZTX1BST0NfSU5GTwogI2VuZGlmCiAKLWludCByZWlzZXJmc19wcm9jX2luZm9faW5pdCggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApOwotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICk7Ci1zdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlaXNlcmZzX3Byb2NfcmVnaXN0ZXJfZ2xvYmFsKCBjaGFyICpuYW1lLCAKLQkJCQkJCQkJCQkJCQkgIHJlYWRfcHJvY190ICpmdW5jICk7Ci12b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoIGNvbnN0IGNoYXIgKm5hbWUgKTsKLWludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKTsKLWludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUoIHZvaWQgKTsKLWludCByZWlzZXJmc19nbG9iYWxfdmVyc2lvbl9pbl9wcm9jKCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAotCQkJCQkJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEgKTsKK2ludCByZWlzZXJmc19wcm9jX2luZm9faW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2ludCByZWlzZXJmc19wcm9jX2luZm9fZG9uZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoY2hhciAqbmFtZSwKKwkJCQkJCSAgICAgcmVhZF9wcm9jX3QgKiBmdW5jKTsKK3ZvaWQgcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbChjb25zdCBjaGFyICpuYW1lKTsKK2ludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQodm9pZCk7CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKHZvaWQpOworaW50IHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCQkgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CiAKICNpZiBkZWZpbmVkKCBSRUlTRVJGU19QUk9DX0lORk8gKQogCkBAIC0xOTkzLDEyMyArMTk1OCwxMzIgQEAKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOwogCiAvKiB0YWlsX2NvbnZlcnNpb24uYyAqLwotaW50IGRpcmVjdDJpbmRpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhdGggKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGxvZmZfdCk7Ci1pbnQgaW5kaXJlY3QyZGlyZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGF0aCAqLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqLCBsb2ZmX3QsIGNoYXIgKik7Ci12b2lkIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgOwotCitpbnQgZGlyZWN0MmluZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IGlub2RlICosCisJCSAgICBzdHJ1Y3QgcGF0aCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgbG9mZl90KTsKK2ludCBpbmRpcmVjdDJkaXJlY3Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJICAgIHN0cnVjdCBwYWdlICosIHN0cnVjdCBwYXRoICosIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICosCisJCSAgICBsb2ZmX3QsIGNoYXIgKik7Cit2b2lkIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CiAKIC8qIGZpbGUuYyAqLwogZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJlaXNlcmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9uczsKLWV4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyA7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyByZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnM7CiAKIC8qIGZpeF9ub2Rlcy5jICovCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi12b2lkICogcmVpc2VyZnNfa21hbGxvYyAoc2l6ZV90IHNpemUsIGludCBmbGFncywgc3RydWN0IHN1cGVyX2Jsb2NrICogcyk7Ci12b2lkIHJlaXNlcmZzX2tmcmVlIChjb25zdCB2b2lkICogdnAsIHNpemVfdCBzaXplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKTsKK3ZvaWQgKnJlaXNlcmZzX2ttYWxsb2Moc2l6ZV90IHNpemUsIGludCBmbGFncywgc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK3ZvaWQgcmVpc2VyZnNfa2ZyZWUoY29uc3Qgdm9pZCAqdnAsIHNpemVfdCBzaXplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCAqcmVpc2VyZnNfa21hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLAotCQkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCisJCQkJICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7CiAJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfa2ZyZWUoY29uc3Qgdm9pZCAqdnAsIHNpemVfdCBzaXplLAotCQkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCisJCQkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7CiAJa2ZyZWUodnApOwogfQogI2VuZGlmCiAKLWludCBmaXhfbm9kZXMgKGludCBuX29wX21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsIAotCSAgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcF9zX2luc19paCwgY29uc3Qgdm9pZCAqKTsKLXZvaWQgdW5maXhfbm9kZXMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKik7Ci0KK2ludCBmaXhfbm9kZXMoaW50IG5fb3BfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLAorCSAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKnBfc19pbnNfaWgsIGNvbnN0IHZvaWQgKik7Cit2b2lkIHVuZml4X25vZGVzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKik7CiAKIC8qIHByaW50cy5jICovCi12b2lkIHJlaXNlcmZzX3BhbmljIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjb25zdCBjaGFyICogZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKCAoIG5vcmV0dXJuICkgKTsKLXZvaWQgcmVpc2VyZnNfaW5mbyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjb25zdCBjaGFyICogZm10LCAuLi4pOwotdm9pZCByZWlzZXJmc19kZWJ1ZyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLik7Ci12b2lkIHByaW50X2luZGlyZWN0X2l0ZW0gKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgaXRlbV9udW0pOwotdm9pZCBzdG9yZV9wcmludF90YiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKTsKLXZvaWQgcHJpbnRfY3VyX3RiIChjaGFyICogbWVzKTsKLXZvaWQgcHJpbnRfZGUgKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSk7Ci12b2lkIHByaW50X2JpIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgY2hhciAqIG1lcyk7Ci0jZGVmaW5lIFBSSU5UX0xFQUZfSVRFTVMgMSAgIC8qIHByaW50IGFsbCBpdGVtcyAqLwotI2RlZmluZSBQUklOVF9ESVJFQ1RPUllfSVRFTVMgMiAvKiBwcmludCBkaXJlY3RvcnkgaXRlbXMgKi8KLSNkZWZpbmUgUFJJTlRfRElSRUNUX0lURU1TIDQgLyogcHJpbnQgY29udGVudHMgb2YgZGlyZWN0IGl0ZW1zICovCi12b2lkIHByaW50X2Jsb2NrIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgLi4uKTsKLXZvaWQgcHJpbnRfYm1hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgaW50IHNpbGVudCk7Ci12b2lkIHByaW50X2JtYXBfYmxvY2sgKGludCBpLCBjaGFyICogZGF0YSwgaW50IHNpemUsIGludCBzaWxlbnQpOwordm9pZCByZWlzZXJmc19wYW5pYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOwordm9pZCByZWlzZXJmc19pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCByZWlzZXJmc19kZWJ1ZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBwcmludF9pbmRpcmVjdF9pdGVtKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBpdGVtX251bSk7Cit2b2lkIHN0b3JlX3ByaW50X3RiKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKTsKK3ZvaWQgcHJpbnRfY3VyX3RiKGNoYXIgKm1lcyk7Cit2b2lkIHByaW50X2RlKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKTsKK3ZvaWQgcHJpbnRfYmkoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgY2hhciAqbWVzKTsKKyNkZWZpbmUgUFJJTlRfTEVBRl9JVEVNUyAxCS8qIHByaW50IGFsbCBpdGVtcyAqLworI2RlZmluZSBQUklOVF9ESVJFQ1RPUllfSVRFTVMgMgkvKiBwcmludCBkaXJlY3RvcnkgaXRlbXMgKi8KKyNkZWZpbmUgUFJJTlRfRElSRUNUX0lURU1TIDQJLyogcHJpbnQgY29udGVudHMgb2YgZGlyZWN0IGl0ZW1zICovCit2b2lkIHByaW50X2Jsb2NrKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIC4uLik7Cit2b2lkIHByaW50X2JtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgc2lsZW50KTsKK3ZvaWQgcHJpbnRfYm1hcF9ibG9jayhpbnQgaSwgY2hhciAqZGF0YSwgaW50IHNpemUsIGludCBzaWxlbnQpOwogLyp2b2lkIHByaW50X3N1cGVyX2Jsb2NrIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjaGFyICogbWVzKTsqLwotdm9pZCBwcmludF9vYmplY3RpZF9tYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpOwotdm9pZCBwcmludF9ibG9ja19oZWFkIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgY2hhciAqIG1lcyk7Ci12b2lkIGNoZWNrX2xlYWYgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKTsKLXZvaWQgY2hlY2tfaW50ZXJuYWwgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKTsKLXZvaWQgcHJpbnRfc3RhdGlzdGljcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcyk7Ci1jaGFyICogcmVpc2VyZnNfaGFzaG5hbWUoaW50IGNvZGUpOwordm9pZCBwcmludF9vYmplY3RpZF9tYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK3ZvaWQgcHJpbnRfYmxvY2tfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBjaGFyICptZXMpOwordm9pZCBjaGVja19sZWFmKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwordm9pZCBjaGVja19pbnRlcm5hbChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK3ZvaWQgcHJpbnRfc3RhdGlzdGljcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOworY2hhciAqcmVpc2VyZnNfaGFzaG5hbWUoaW50IGNvZGUpOwogCiAvKiBsYmFsYW5jZS5jICovCi1pbnQgbGVhZl9tb3ZlX2l0ZW1zIChpbnQgc2hpZnRfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgbW92X251bSwgaW50IG1vdl9ieXRlcywgc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldyk7Ci1pbnQgbGVhZl9zaGlmdF9sZWZ0IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBzaGlmdF9udW0sIGludCBzaGlmdF9ieXRlcyk7Ci1pbnQgbGVhZl9zaGlmdF9yaWdodCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgc2hpZnRfbnVtLCBpbnQgc2hpZnRfYnl0ZXMpOwotdm9pZCBsZWFmX2RlbGV0ZV9pdGVtcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogY3VyX2JpLCBpbnQgbGFzdF9maXJzdCwgaW50IGZpcnN0LCBpbnQgZGVsX251bSwgaW50IGRlbF9ieXRlcyk7Ci12b2lkIGxlYWZfaW5zZXJ0X2ludG9fYnVmIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgaW50IGJlZm9yZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaW5zZXJ0ZWRfaXRlbV9paCwgY29uc3QgY2hhciAqIGluc2VydGVkX2l0ZW1fYm9keSwgaW50IHplcm9zX251bWJlcik7Ci12b2lkIGxlYWZfcGFzdGVfaW5fYnVmZmVyIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgaW50IHBhc3RlZF9pdGVtX251bSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zX2luX2l0ZW0sIGludCBwYXN0ZV9zaXplLCBjb25zdCBjaGFyICogYm9keSwgaW50IHplcm9zX251bWJlcik7Ci12b2lkIGxlYWZfY3V0X2Zyb21fYnVmZmVyIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgaW50IGN1dF9pdGVtX251bSwgaW50IHBvc19pbl9pdGVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXRfc2l6ZSk7Ci12b2lkIGxlYWZfcGFzdGVfZW50cmllcyAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCBpdGVtX251bSwgaW50IGJlZm9yZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld19lbnRyeV9jb3VudCwgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBuZXdfZGVocywgY29uc3QgY2hhciAqIHJlY29yZHMsIGludCBwYXN0ZV9zaXplKTsKK2ludCBsZWFmX21vdmVfaXRlbXMoaW50IHNoaWZ0X21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgbW92X251bSwKKwkJICAgIGludCBtb3ZfYnl0ZXMsIHN0cnVjdCBidWZmZXJfaGVhZCAqU25ldyk7CitpbnQgbGVhZl9zaGlmdF9sZWZ0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgc2hpZnRfbnVtLCBpbnQgc2hpZnRfYnl0ZXMpOworaW50IGxlYWZfc2hpZnRfcmlnaHQoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBzaGlmdF9udW0sIGludCBzaGlmdF9ieXRlcyk7Cit2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zKHN0cnVjdCBidWZmZXJfaW5mbyAqY3VyX2JpLCBpbnQgbGFzdF9maXJzdCwgaW50IGZpcnN0LAorCQkgICAgICAgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpOwordm9pZCBsZWFmX2luc2VydF9pbnRvX2J1ZihzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLCBpbnQgYmVmb3JlLAorCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICppbnNlcnRlZF9pdGVtX2loLAorCQkJICBjb25zdCBjaGFyICppbnNlcnRlZF9pdGVtX2JvZHksIGludCB6ZXJvc19udW1iZXIpOwordm9pZCBsZWFmX3Bhc3RlX2luX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLCBpbnQgcGFzdGVkX2l0ZW1fbnVtLAorCQkJICBpbnQgcG9zX2luX2l0ZW0sIGludCBwYXN0ZV9zaXplLCBjb25zdCBjaGFyICpib2R5LAorCQkJICBpbnQgemVyb3NfbnVtYmVyKTsKK3ZvaWQgbGVhZl9jdXRfZnJvbV9idWZmZXIoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGN1dF9pdGVtX251bSwKKwkJCSAgaW50IHBvc19pbl9pdGVtLCBpbnQgY3V0X3NpemUpOwordm9pZCBsZWFmX3Bhc3RlX2VudHJpZXMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGl0ZW1fbnVtLCBpbnQgYmVmb3JlLAorCQkJaW50IG5ld19lbnRyeV9jb3VudCwgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKm5ld19kZWhzLAorCQkJY29uc3QgY2hhciAqcmVjb3JkcywgaW50IHBhc3RlX3NpemUpOwogLyogaWJhbGFuY2UuYyAqLwotaW50IGJhbGFuY2VfaW50ZXJuYWwgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiAsIGludCwgaW50LCBzdHJ1Y3QgaXRlbV9oZWFkICogLCAKLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOworaW50IGJhbGFuY2VfaW50ZXJuYWwoc3RydWN0IHRyZWVfYmFsYW5jZSAqLCBpbnQsIGludCwgc3RydWN0IGl0ZW1faGVhZCAqLAorCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CiAKIC8qIGRvX2JhbGFuY2UuYyAqLwotdm9pZCBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGZsYWcpOwordm9pZCBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgZmxhZyk7CiAjZGVmaW5lIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eQogI2RlZmluZSBkb19iYWxhbmNlX21hcmtfc2JfZGlydHkgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkKIAotdm9pZCBkb19iYWxhbmNlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBib2R5LCBpbnQgZmxhZyk7Ci12b2lkIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKTsKK3ZvaWQgZG9fYmFsYW5jZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yiwgc3RydWN0IGl0ZW1faGVhZCAqaWgsCisJCWNvbnN0IGNoYXIgKmJvZHksIGludCBmbGFnKTsKK3ZvaWQgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKLWludCBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCk7Ci1pbnQgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKTsKLXZvaWQgcmVwbGFjZV9rZXkgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7Ci12b2lkIG1ha2VfZW1wdHlfbm9kZSAoc3RydWN0IGJ1ZmZlcl9pbmZvICopOwotc3RydWN0IGJ1ZmZlcl9oZWFkICogZ2V0X0ZFQiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqKTsKK2ludCBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpOworaW50IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpOwordm9pZCByZXBsYWNlX2tleShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCwKKwkJIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwordm9pZCBtYWtlX2VtcHR5X25vZGUoc3RydWN0IGJ1ZmZlcl9pbmZvICopOworc3RydWN0IGJ1ZmZlcl9oZWFkICpnZXRfRkVCKHN0cnVjdCB0cmVlX2JhbGFuY2UgKik7CiAKIC8qIGJpdG1hcC5jICovCiAKIC8qIHN0cnVjdHVyZSBjb250YWlucyBoaW50cyBmb3IgYmxvY2sgYWxsb2NhdG9yLCBhbmQgaXQgaXMgYSBjb250YWluZXIgZm9yCiAgKiBhcmd1bWVudHMsIHN1Y2ggYXMgbm9kZSwgc2VhcmNoIHBhdGgsIHRyYW5zYWN0aW9uX2hhbmRsZSwgZXRjLiAqLwotIHN0cnVjdCBfX3JlaXNlcmZzX2Jsb2NrbnJfaGludCB7Ci0gICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwkJLyogaW5vZGUgcGFzc2VkIHRvIGFsbG9jYXRvciwgaWYgd2UgYWxsb2NhdGUgdW5mLiBub2RlcyAqLwotICAgICBsb25nIGJsb2NrOwkJCS8qIGZpbGUgb2Zmc2V0LCBpbiBibG9ja3MgKi8KLSAgICAgc3RydWN0IGluX2NvcmVfa2V5IGtleTsKLSAgICAgc3RydWN0IHBhdGggKiBwYXRoOwkJLyogc2VhcmNoIHBhdGgsIHVzZWQgYnkgYWxsb2NhdG9yIHRvIGRldGVybmluZSBzZWFyY2hfc3RhcnQgYnkKLQkJCQkJICogdmFyaW91cyB3YXlzICovCi0gICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiB0aDsgLyogdHJhbnNhY3Rpb24gaGFuZGxlIGlzIG5lZWRlZCB0byBsb2cgc3VwZXIgYmxvY2tzIGFuZAotCQkJCQkgICAgICAgKiBiaXRtYXAgYmxvY2tzIGNoYW5nZXMgICovCi0gICAgIGJfYmxvY2tucl90IGJlZywgZW5kOwotICAgICBiX2Jsb2NrbnJfdCBzZWFyY2hfc3RhcnQ7CQkvKiBhIGZpZWxkIHVzZWQgdG8gdHJhbnNmZXIgc2VhcmNoIHN0YXJ0IHZhbHVlIChibG9jayBudW1iZXIpCitzdHJ1Y3QgX19yZWlzZXJmc19ibG9ja25yX2hpbnQgeworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CS8qIGlub2RlIHBhc3NlZCB0byBhbGxvY2F0b3IsIGlmIHdlIGFsbG9jYXRlIHVuZi4gbm9kZXMgKi8KKwlsb25nIGJsb2NrOwkJLyogZmlsZSBvZmZzZXQsIGluIGJsb2NrcyAqLworCXN0cnVjdCBpbl9jb3JlX2tleSBrZXk7CisJc3RydWN0IHBhdGggKnBhdGg7CS8qIHNlYXJjaCBwYXRoLCB1c2VkIGJ5IGFsbG9jYXRvciB0byBkZXRlcm5pbmUgc2VhcmNoX3N0YXJ0IGJ5CisJCQkJICogdmFyaW91cyB3YXlzICovCisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGg7CS8qIHRyYW5zYWN0aW9uIGhhbmRsZSBpcyBuZWVkZWQgdG8gbG9nIHN1cGVyIGJsb2NrcyBhbmQKKwkJCQkJCSAqIGJpdG1hcCBibG9ja3MgY2hhbmdlcyAgKi8KKwliX2Jsb2NrbnJfdCBiZWcsIGVuZDsKKwliX2Jsb2NrbnJfdCBzZWFyY2hfc3RhcnQ7CS8qIGEgZmllbGQgdXNlZCB0byB0cmFuc2ZlciBzZWFyY2ggc3RhcnQgdmFsdWUgKGJsb2NrIG51bWJlcikKIAkJCQkJICogYmV0d2VlbiBkaWZmZXJlbnQgYmxvY2sgYWxsb2NhdG9yIHByb2NlZHVyZXMKIAkJCQkJICogKGRldGVybWluZV9zZWFyY2hfc3RhcnQoKSBhbmQgb3RoZXJzKSAqLwotICAgIGludCBwcmVhbGxvY19zaXplOwkJCS8qIGlzIHNldCBpbiBkZXRlcm1pbmVfcHJlYWxsb2Nfc2l6ZSgpIGZ1bmN0aW9uLCB1c2VkIGJ5IHVuZGVybGF5ZWQKLQkJCQkJICogZnVuY3Rpb24gdGhhdCBkbyBhY3R1YWwgYWxsb2NhdGlvbiAqLworCWludCBwcmVhbGxvY19zaXplOwkvKiBpcyBzZXQgaW4gZGV0ZXJtaW5lX3ByZWFsbG9jX3NpemUoKSBmdW5jdGlvbiwgdXNlZCBieSB1bmRlcmxheWVkCisJCQkJICogZnVuY3Rpb24gdGhhdCBkbyBhY3R1YWwgYWxsb2NhdGlvbiAqLwogCi0gICAgdW5zaWduZWQgZm9ybWF0dGVkX25vZGU6MTsJCS8qIHRoZSBhbGxvY2F0b3IgdXNlcyBkaWZmZXJlbnQgcG9saWNlcyBmb3IgZ2V0dGluZyBkaXNrIHNwYWNlIGZvcgorCXVuc2lnbmVkIGZvcm1hdHRlZF9ub2RlOjE7CS8qIHRoZSBhbGxvY2F0b3IgdXNlcyBkaWZmZXJlbnQgcG9saWNlcyBmb3IgZ2V0dGluZyBkaXNrIHNwYWNlIGZvcgogCQkJCQkgKiBmb3JtYXR0ZWQvdW5mb3JtYXR0ZWQgYmxvY2tzIHdpdGgvd2l0aG91dCBwcmVhbGxvY2F0aW9uICovCi0gICAgdW5zaWduZWQgcHJlYWxsb2NhdGU6MTsKKwl1bnNpZ25lZCBwcmVhbGxvY2F0ZToxOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX19yZWlzZXJmc19ibG9ja25yX2hpbnQgcmVpc2VyZnNfYmxvY2tucl9oaW50X3Q7CiAKLWludCByZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY2hhciAqKTsKLXZvaWQgcmVpc2VyZnNfaW5pdF9hbGxvY19vcHRpb25zIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOworaW50IHJlaXNlcmZzX3BhcnNlX2FsbG9jX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNoYXIgKik7Cit2b2lkIHJlaXNlcmZzX2luaXRfYWxsb2Nfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwogCiAvKgogICogZ2l2ZW4gYSBkaXJlY3RvcnksIHRoaXMgd2lsbCB0ZWxsIHlvdSB3aGF0IHBhY2tpbmcgbG9jYWxpdHkKQEAgLTIxMTgsNjggKzIwOTIsNzIgQEAKICAqLwogX19sZTMyIHJlaXNlcmZzX2Nob29zZV9wYWNraW5nKHN0cnVjdCBpbm9kZSAqZGlyKTsKIAotaW50IGlzX3JldXNhYmxlIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSk7Ci12b2lkIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiwgYl9ibG9ja25yX3QsIGludCBmb3JfdW5mb3JtYXR0ZWQpOwotaW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICosIGJfYmxvY2tucl90ICogLCBpbnQsIGludCk7Ci1leHRlcm4gaW5saW5lIGludCByZWlzZXJmc19uZXdfZm9ybV9ibG9ja25ycyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJCQkgICAgICBiX2Jsb2NrbnJfdCAqbmV3X2Jsb2NrbnJzLCBpbnQgYW1vdW50X25lZWRlZCkKK2ludCBpc19yZXVzYWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgYml0X3ZhbHVlKTsKK3ZvaWQgcmVpc2VyZnNfZnJlZV9ibG9jayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICosCisJCQkgYl9ibG9ja25yX3QsIGludCBmb3JfdW5mb3JtYXR0ZWQpOworaW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICosIGJfYmxvY2tucl90ICosIGludCwKKwkJCSAgICAgICBpbnQpOworZXh0ZXJuIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X2Zvcm1fYmxvY2tucnMoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJCSAgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisJCQkJCSAgICAgaW50IGFtb3VudF9uZWVkZWQpCiB7Ci0gICAgcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludCA9IHsKLQkudGggPSB0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLAotCS5wYXRoID0gdGItPnRiX3BhdGgsCi0JLmlub2RlID0gTlVMTCwKLQkua2V5ID0gdGItPmtleSwKLQkuYmxvY2sgPSAwLAotCS5mb3JtYXR0ZWRfbm9kZSA9IDEKLSAgICB9OwotICAgIHJldHVybiByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgbmV3X2Jsb2NrbnJzLCBhbW91bnRfbmVlZGVkLCAwKTsKKwlyZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0geworCQkudGggPSB0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLAorCQkucGF0aCA9IHRiLT50Yl9wYXRoLAorCQkuaW5vZGUgPSBOVUxMLAorCQkua2V5ID0gdGItPmtleSwKKwkJLmJsb2NrID0gMCwKKwkJLmZvcm1hdHRlZF9ub2RlID0gMQorCX07CisJcmV0dXJuIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBuZXdfYmxvY2tucnMsIGFtb3VudF9uZWVkZWQsCisJCQkJCSAgMCk7CiB9CiAKLWV4dGVybiBpbmxpbmUgaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSAgICAgYl9ibG9ja25yX3QgKm5ld19ibG9ja25ycywKLQkJCQkJICAgICBzdHJ1Y3QgcGF0aCAqIHBhdGgsIGxvbmcgYmxvY2spCitleHRlcm4gaW5saW5lIGludCByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUKKwkJCQkJICAgICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorCQkJCQkgICAgc3RydWN0IHBhdGggKnBhdGgsIGxvbmcgYmxvY2spCiB7Ci0gICAgcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludCA9IHsKLQkudGggPSB0aCwKLQkucGF0aCA9IHBhdGgsCi0JLmlub2RlID0gaW5vZGUsCi0JLmJsb2NrID0gYmxvY2ssCi0JLmZvcm1hdHRlZF9ub2RlID0gMCwKLQkucHJlYWxsb2NhdGUgPSAwCi0gICAgfTsKLSAgICByZXR1cm4gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIG5ld19ibG9ja25ycywgMSwgMCk7CisJcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludCA9IHsKKwkJLnRoID0gdGgsCisJCS5wYXRoID0gcGF0aCwKKwkJLmlub2RlID0gaW5vZGUsCisJCS5ibG9jayA9IGJsb2NrLAorCQkuZm9ybWF0dGVkX25vZGUgPSAwLAorCQkucHJlYWxsb2NhdGUgPSAwCisJfTsKKwlyZXR1cm4gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIG5ld19ibG9ja25ycywgMSwgMCk7CiB9CiAKICNpZmRlZiBSRUlTRVJGU19QUkVBTExPQ0FURQotZXh0ZXJuIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25yczIoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJCSAgICAgc3RydWN0IGlub2RlICogaW5vZGUsCi0JCQkJCSAgICAgYl9ibG9ja25yX3QgKm5ld19ibG9ja25ycywKLQkJCQkJICAgICBzdHJ1Y3QgcGF0aCAqIHBhdGgsIGxvbmcgYmxvY2spCitleHRlcm4gaW5saW5lIGludCByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzMihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlCisJCQkJCSAgICAgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorCQkJCQkgICAgIHN0cnVjdCBwYXRoICpwYXRoLCBsb25nIGJsb2NrKQogewotICAgIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQgPSB7Ci0JLnRoID0gdGgsCi0JLnBhdGggPSBwYXRoLAotCS5pbm9kZSA9IGlub2RlLAotCS5ibG9jayA9IGJsb2NrLAotCS5mb3JtYXR0ZWRfbm9kZSA9IDAsCi0JLnByZWFsbG9jYXRlID0gMQotICAgIH07Ci0gICAgcmV0dXJuIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBuZXdfYmxvY2tucnMsIDEsIDApOworCXJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQgPSB7CisJCS50aCA9IHRoLAorCQkucGF0aCA9IHBhdGgsCisJCS5pbm9kZSA9IGlub2RlLAorCQkuYmxvY2sgPSBibG9jaywKKwkJLmZvcm1hdHRlZF9ub2RlID0gMCwKKwkJLnByZWFsbG9jYXRlID0gMQorCX07CisJcmV0dXJuIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBuZXdfYmxvY2tucnMsIDEsIDApOwogfQogCi12b2lkIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2MgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSk7Ci12b2lkIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCk7Cit2b2lkIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2Moc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSk7Cit2b2lkIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKTsKICNlbmRpZgotdm9pZCByZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2tzKTsKLXZvaWQgcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2Nrcyk7Cit2b2lkIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2Nrcyk7Cit2b2lkIHJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2Nrcyk7CiBpbnQgcmVpc2VyZnNfY2FuX2ZpdF9wYWdlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIAogLyogaGFzaGVzLmMgKi8KLV9fdTMyIGtleWVkX2hhc2ggKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pOwotX191MzIgeXVyYV9oYXNoIChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKTsKLV9fdTMyIHI1X2hhc2ggKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pOworX191MzIga2V5ZWRfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKTsKK19fdTMyIHl1cmFfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKTsKK19fdTMyIHI1X2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbik7CiAKIC8qIHRoZSBleHQyIGJpdCByb3V0aW5lcyBhZGp1c3QgZm9yIGJpZyBvciBsaXR0bGUgZW5kaWFuIGFzCiAqKiBhcHByb3ByaWF0ZSBmb3IgdGhlIGFyY2gsIHNvIGluIG91ciBsYXppbmVzcyB3ZSB1c2UgdGhlbSByYXRoZXIKQEAgLTIxOTksMTEgKzIxNzcsMTAgQEAKICAgIGFic29sdXRlbHkgc2FmZSAqLwogI2RlZmluZSBTUEFSRV9TUEFDRSA1MDAKIAotCiAvKiBwcm90b3R5cGVzIGZyb20gaW9jdGwuYyAqLwotaW50IHJlaXNlcmZzX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwLCAKLSAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci0gCitpbnQgcmVpc2VyZnNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwogLyogaW9jdGwncyBjb21tYW5kICovCiAjZGVmaW5lIFJFSVNFUkZTX0lPQ19VTlBBQ0sJCV9JT1coMHhDRCwxLGxvbmcpCiAvKiBkZWZpbmUgZm9sbG93aW5nIGZsYWdzIHRvIGJlIHRoZSBzYW1lIGFzIGluIGV4dDIsIHNvIHRoYXQgY2hhdHRyKDEpLApAQCAtMjIxOCwxMCArMjE5NSw4IEBACiAgICB3b3VsZCBldm9sdmUgaW50byByZWFsIHBlci1mcyBsb2NrcyAqLwogI2RlZmluZSByZWlzZXJmc193cml0ZV9sb2NrKCBzYiApIGxvY2tfa2VybmVsKCkKICNkZWZpbmUgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKCBzYiApIHVubG9ja19rZXJuZWwoKQotIAkJCSAgICAgICAgIAorCiAvKiB4YXR0ciBzdHVmZiAqLwogI2RlZmluZSBSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHMpIChSRUlTRVJGU19TQihzKS0+eGF0dHJfZGlyX3NlbSkKIAotI2VuZGlmIC8qIF9MSU5VWF9SRUlTRVJfRlNfSCAqLwotCi0KKyNlbmRpZgkJCQkvKiBfTElOVVhfUkVJU0VSX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfaS5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19pLmgKaW5kZXggZTMyMWViMC4uMTQ5YmU4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19pLmgKQEAgLTEwLDU0ICsxMCw1MyBAQAogICAgIC8qKiB0aGlzIHNheXMgd2hhdCBmb3JtYXQgb2Yga2V5IGRvIGFsbCBpdGVtcyAoYnV0IHN0YXQgZGF0YSkgb2YKICAgICAgIGFuIG9iamVjdCBoYXZlLiAgSWYgdGhpcyBpcyBzZXQsIHRoYXQgZm9ybWF0IGlzIDMuNiBvdGhlcndpc2UKICAgICAgIC0gMy41ICovCi0gICAgaV9pdGVtX2tleV92ZXJzaW9uX21hc2sgICAgPSAgMHgwMDAxLAorCWlfaXRlbV9rZXlfdmVyc2lvbl9tYXNrID0gMHgwMDAxLAogICAgIC8qKiBJZiB0aGlzIGlzIHVuc2V0LCBvYmplY3QgaGFzIDMuNSBzdGF0IGRhdGEsIG90aGVyd2lzZSwgaXQgaGFzCiAgICAgICAzLjYgc3RhdCBkYXRhIHdpdGggNjRiaXQgc2l6ZSwgMzJiaXQgbmxpbmsgZXRjLiAqLwotICAgIGlfc3RhdF9kYXRhX3ZlcnNpb25fbWFzayAgID0gIDB4MDAwMiwKKwlpX3N0YXRfZGF0YV92ZXJzaW9uX21hc2sgPSAweDAwMDIsCiAgICAgLyoqIGZpbGUgbWlnaHQgbmVlZCB0YWlsIHBhY2tpbmcgb24gY2xvc2UgKi8KLSAgICBpX3BhY2tfb25fY2xvc2VfbWFzayAgICAgICA9ICAweDAwMDQsCisJaV9wYWNrX29uX2Nsb3NlX21hc2sgPSAweDAwMDQsCiAgICAgLyoqIGRvbid0IHBhY2sgdGFpbCBvZiBmaWxlICovCi0gICAgaV9ub3BhY2tfbWFzayAgICAgICAgICAgICAgPSAgMHgwMDA4LAorCWlfbm9wYWNrX21hc2sgPSAweDAwMDgsCiAgICAgLyoqIElmIHRob3NlIGlzIHNldCwgInNhZmUgbGluayIgd2FzIGNyZWF0ZWQgZm9yIHRoaXMgZmlsZSBkdXJpbmcKICAgICAgIHRydW5jYXRlIG9yIHVubGluay4gU2FmZSBsaW5rIGlzIHVzZWQgdG8gYXZvaWQgbGVha2FnZSBvZiBkaXNrCiAgICAgICBzcGFjZSBvbiBjcmFzaCB3aXRoIHNvbWUgZmlsZXMgb3BlbiwgYnV0IHVubGlua2VkLiAqLwotICAgIGlfbGlua19zYXZlZF91bmxpbmtfbWFzayAgID0gIDB4MDAxMCwKLSAgICBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzayA9ICAweDAwMjAsCi0gICAgaV9oYXNfeGF0dHJfZGlyICAgICAgICAgICAgPSAgMHgwMDQwLAotICAgIGlfZGF0YV9sb2cJICAgICAgICAgICAgICAgPSAgMHgwMDgwLAorCWlfbGlua19zYXZlZF91bmxpbmtfbWFzayA9IDB4MDAxMCwKKwlpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzayA9IDB4MDAyMCwKKwlpX2hhc194YXR0cl9kaXIgPSAweDAwNDAsCisJaV9kYXRhX2xvZyA9IDB4MDA4MCwKIH0gcmVpc2VyZnNfaW5vZGVfZmxhZ3M7CiAKLQogc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gewotICAgIF9fdTMyIGlfa2V5IFs0XTsvKiBrZXkgaXMgc3RpbGwgNCAzMiBiaXQgaW50ZWdlcnMgKi8KKwlfX3UzMiBpX2tleVs0XTsJCS8qIGtleSBpcyBzdGlsbCA0IDMyIGJpdCBpbnRlZ2VycyAqLwogICAgIC8qKiB0cmFuc2llbnQgaW5vZGUgZmxhZ3MgdGhhdCBhcmUgbmV2ZXIgc3RvcmVkIG9uIGRpc2suIEJpdG1hc2tzCiAgICAgICBmb3IgdGhpcyBmaWVsZCBhcmUgZGVmaW5lZCBhYm92ZS4gKi8KLSAgICBfX3UzMiBpX2ZsYWdzOworCV9fdTMyIGlfZmxhZ3M7CiAKLSAgICBfX3UzMiBpX2ZpcnN0X2RpcmVjdF9ieXRlOyAvLyBvZmZzZXQgb2YgZmlyc3QgYnl0ZSBzdG9yZWQgaW4gZGlyZWN0IGl0ZW0uCisJX191MzIgaV9maXJzdF9kaXJlY3RfYnl0ZTsJLy8gb2Zmc2V0IG9mIGZpcnN0IGJ5dGUgc3RvcmVkIGluIGRpcmVjdCBpdGVtLgogCi0gICAgLyogY29weSBvZiBwZXJzaXN0ZW50IGlub2RlIGZsYWdzIHJlYWQgZnJvbSBzZF9hdHRycy4gKi8KLSAgICBfX3UzMiBpX2F0dHJzOworCS8qIGNvcHkgb2YgcGVyc2lzdGVudCBpbm9kZSBmbGFncyByZWFkIGZyb20gc2RfYXR0cnMuICovCisJX191MzIgaV9hdHRyczsKIAotICAgIGludCBpX3ByZWFsbG9jX2Jsb2NrOyAvKiBmaXJzdCB1bnVzZWQgYmxvY2sgb2YgYSBzZXF1ZW5jZSBvZiB1bnVzZWQgYmxvY2tzICovCi0gICAgaW50IGlfcHJlYWxsb2NfY291bnQ7IC8qIGxlbmd0aCBvZiB0aGF0IHNlcXVlbmNlICovCi0gICAgc3RydWN0IGxpc3RfaGVhZCBpX3ByZWFsbG9jX2xpc3Q7IC8qIHBlci10cmFuc2FjdGlvbiBsaXN0IG9mIGlub2RlcyB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXZlIHByZWFsbG9jYXRlZCBibG9ja3MgKi8KKwlpbnQgaV9wcmVhbGxvY19ibG9jazsJLyogZmlyc3QgdW51c2VkIGJsb2NrIG9mIGEgc2VxdWVuY2Ugb2YgdW51c2VkIGJsb2NrcyAqLworCWludCBpX3ByZWFsbG9jX2NvdW50OwkvKiBsZW5ndGggb2YgdGhhdCBzZXF1ZW5jZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgaV9wcmVhbGxvY19saXN0OwkvKiBwZXItdHJhbnNhY3Rpb24gbGlzdCBvZiBpbm9kZXMgd2hpY2gKKwkJCQkJCSAqIGhhdmUgcHJlYWxsb2NhdGVkIGJsb2NrcyAqLwogCi0gICAgdW5zaWduZWQgbmV3X3BhY2tpbmdfbG9jYWxpdHk6MTsgIC8qIG5ld19wYWNraWdfbG9jYWxpdHkgaXMgY3JlYXRlZDsgbmV3IGJsb2NrcwotCQkJCSAgICAgICAqIGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlCi0JCQkJICAgICAgICogZGlzcGxhY2VkICovCisJdW5zaWduZWQgbmV3X3BhY2tpbmdfbG9jYWxpdHk6MTsJLyogbmV3X3BhY2tpZ19sb2NhbGl0eSBpcyBjcmVhdGVkOyBuZXcgYmxvY2tzCisJCQkJCQkgKiBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZQorCQkJCQkJICogZGlzcGxhY2VkICovCiAKLSAgICAvKiB3ZSB1c2UgdGhlc2UgZm9yIGZzeW5jIG9yIE9fU1lOQyB0byBkZWNpZGUgd2hpY2ggdHJhbnNhY3Rpb24KLSAgICAqKiBuZWVkcyB0byBiZSBjb21taXR0ZWQgaW4gb3JkZXIgZm9yIHRoaXMgaW5vZGUgdG8gYmUgcHJvcGVybHkKLSAgICAqKiBmbHVzaGVkICovCi0gICAgdW5zaWduZWQgbG9uZyBpX3RyYW5zX2lkIDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICppX2psOworCS8qIHdlIHVzZSB0aGVzZSBmb3IgZnN5bmMgb3IgT19TWU5DIHRvIGRlY2lkZSB3aGljaCB0cmFuc2FjdGlvbgorCSAqKiBuZWVkcyB0byBiZSBjb21taXR0ZWQgaW4gb3JkZXIgZm9yIHRoaXMgaW5vZGUgdG8gYmUgcHJvcGVybHkKKwkgKiogZmx1c2hlZCAqLworCXVuc2lnbmVkIGxvbmcgaV90cmFuc19pZDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICppX2psOwogCi0gICAgc3RydWN0IHBvc2l4X2FjbCAqaV9hY2xfYWNjZXNzOwotICAgIHN0cnVjdCBwb3NpeF9hY2wgKmlfYWNsX2RlZmF1bHQ7Ci0gICAgc3RydWN0IHJ3X3NlbWFwaG9yZSB4YXR0cl9zZW07Ci0gICAgc3RydWN0IGlub2RlIHZmc19pbm9kZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICppX2FjbF9hY2Nlc3M7CisJc3RydWN0IHBvc2l4X2FjbCAqaV9hY2xfZGVmYXVsdDsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX3NlbTsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX3NiLmgKaW5kZXggMzFjNzA5ZC4uM2U2ODU5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaApAQCAtMTAsNyArMTAsNyBAQAogI2VuZGlmCiAKIHR5cGVkZWYgZW51bSB7Ci0gIHJlaXNlcmZzX2F0dHJzX2NsZWFyZWQJPSAweDAwMDAwMDAxLAorCXJlaXNlcmZzX2F0dHJzX2NsZWFyZWQgPSAweDAwMDAwMDAxLAogfSByZWlzZXJmc19zdXBlcl9ibG9ja19mbGFnczsKIAogLyogc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrIGFjY2Vzc29ycy9tdXRhdG9ycwpAQCAtNjEsNyArNjEsNyBAQAogI2RlZmluZSBzYl91bW91bnRfc3RhdGUoc2JwKSAgICAgICAobGUxNl90b19jcHUoKHNicCktPnNfdjEuc191bW91bnRfc3RhdGUpKQogI2RlZmluZSBzZXRfc2JfdW1vdW50X3N0YXRlKHNicCx2KSAoKHNicCktPnNfdjEuc191bW91bnRfc3RhdGUgPSBjcHVfdG9fbGUxNih2KSkKICNkZWZpbmUgc2JfZnNfc3RhdGUoc2JwKSAgICAgICAgICAgKGxlMTZfdG9fY3B1KChzYnApLT5zX3YxLnNfZnNfc3RhdGUpKQotI2RlZmluZSBzZXRfc2JfZnNfc3RhdGUoc2JwLHYpICAgICAoKHNicCktPnNfdjEuc19mc19zdGF0ZSA9IGNwdV90b19sZTE2KHYpKSAKKyNkZWZpbmUgc2V0X3NiX2ZzX3N0YXRlKHNicCx2KSAgICAgKChzYnApLT5zX3YxLnNfZnNfc3RhdGUgPSBjcHVfdG9fbGUxNih2KSkKICNkZWZpbmUgc2JfaGFzaF9mdW5jdGlvbl9jb2RlKHNicCkgXAogICAgICAgICAgICAgICAobGUzMl90b19jcHUoKHNicCktPnNfdjEuc19oYXNoX2Z1bmN0aW9uX2NvZGUpKQogI2RlZmluZSBzZXRfc2JfaGFzaF9mdW5jdGlvbl9jb2RlKHNicCx2KSBcCkBAIC0xMDMsMTAgKzEwMywxMCBAQAogCiAvKiBkb24ndCBtZXNzIHdpdGggdGhlc2UgZm9yIGEgd2hpbGUgKi8KIAkJCQkvKiB3ZSBoYXZlIGEgbm9kZSBzaXplIGRlZmluZSBzb21ld2hlcmUgaW4gcmVpc2VyZnNfZnMuaC4gLUhhbnMgKi8KLSNkZWZpbmUgSk9VUk5BTF9CTE9DS19TSVpFICA0MDk2IC8qIEJVRyBnb3R0YSBnZXQgcmlkIG9mIHRoaXMgKi8KLSNkZWZpbmUgSk9VUk5BTF9NQVhfQ05PREUgICAxNTAwIC8qIG1heCBjbm9kZXMgdG8gYWxsb2NhdGUuICovCi0jZGVmaW5lIEpPVVJOQUxfSEFTSF9TSVpFIDgxOTIgICAKLSNkZWZpbmUgSk9VUk5BTF9OVU1fQklUTUFQUyA1IC8qIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIGJpdG1hcHMgdG8gaGF2ZSBmbG9hdGluZy4gIE11c3QgYmUgPj0gMiAqLworI2RlZmluZSBKT1VSTkFMX0JMT0NLX1NJWkUgIDQwOTYJLyogQlVHIGdvdHRhIGdldCByaWQgb2YgdGhpcyAqLworI2RlZmluZSBKT1VSTkFMX01BWF9DTk9ERSAgIDE1MDAJLyogbWF4IGNub2RlcyB0byBhbGxvY2F0ZS4gKi8KKyNkZWZpbmUgSk9VUk5BTF9IQVNIX1NJWkUgODE5MgorI2RlZmluZSBKT1VSTkFMX05VTV9CSVRNQVBTIDUJLyogbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUgYml0bWFwcyB0byBoYXZlIGZsb2F0aW5nLiAgTXVzdCBiZSA+PSAyICovCiAKIC8qIE9uZSBvZiB0aGVzZSBmb3IgZXZlcnkgYmxvY2sgaW4gZXZlcnkgdHJhbnNhY3Rpb24KICoqIEVhY2ggb25lIGlzIGluIHR3byBoYXNoIHRhYmxlcy4gIEZpcnN0LCBhIGhhc2ggb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIGFuZCBhZnRlciBqb3VybmFsX2VuZCwgYQpAQCAtMTE3LDI3ICsxMTcsMjcgQEAKICoqIHRvIGEgZ2l2ZW4gdHJhbnNhY3Rpb24uCiAqLwogc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsJCSAvKiByZWFsIGJ1ZmZlciBoZWFkICovCi0gIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgOwkJIC8qIGRldiBvZiByZWFsIGJ1ZmZlciBoZWFkICovCi0gIF9fdTMyIGJsb2NrbnIgOwkJIC8qIGJsb2NrIG51bWJlciBvZiByZWFsIGJ1ZmZlciBoZWFkLCA9PSAwIHdoZW4gYnVmZmVyIG9uIGRpc2sgKi8KLSAgbG9uZyBzdGF0ZSA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsaXN0IDsgIC8qIGpvdXJuYWwgbGlzdCB0aGlzIGNub2RlIGxpdmVzIGluICovCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpuZXh0IDsgIC8qIG5leHQgaW4gdHJhbnNhY3Rpb24gbGlzdCAqLwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqcHJldiA7ICAvKiBwcmV2IGluIHRyYW5zYWN0aW9uIGxpc3QgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmhwcmV2IDsgLyogcHJldiBpbiBoYXNoIGxpc3QgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmhuZXh0IDsgLyogbmV4dCBpbiBoYXNoIGxpc3QgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwkvKiByZWFsIGJ1ZmZlciBoZWFkICovCisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsJLyogZGV2IG9mIHJlYWwgYnVmZmVyIGhlYWQgKi8KKwlfX3UzMiBibG9ja25yOwkJLyogYmxvY2sgbnVtYmVyIG9mIHJlYWwgYnVmZmVyIGhlYWQsID09IDAgd2hlbiBidWZmZXIgb24gZGlzayAqLworCWxvbmcgc3RhdGU7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamxpc3Q7CS8qIGpvdXJuYWwgbGlzdCB0aGlzIGNub2RlIGxpdmVzIGluICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKm5leHQ7CS8qIG5leHQgaW4gdHJhbnNhY3Rpb24gbGlzdCAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpwcmV2OwkvKiBwcmV2IGluIHRyYW5zYWN0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqaHByZXY7CS8qIHByZXYgaW4gaGFzaCBsaXN0ICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmhuZXh0OwkvKiBuZXh0IGluIGhhc2ggbGlzdCAqLwogfTsKIAogc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlIHsKLSAgaW50IGlkIDsKLSAgY2hhciAqZGF0YSA7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgbGlzdCA7Ci19IDsKKwlpbnQgaWQ7CisJY2hhciAqZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OwogCiBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqb3VybmFsX2xpc3QgOwotICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKipiaXRtYXBzIDsKLX0gOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpvdXJuYWxfbGlzdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKipiaXRtYXBzOworfTsKIAogLyoKICoqIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCB0cmFuc2FjdGlvbi4gIFRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IGhlcmUgaXMgdGhlIGpfcmVhbGJsb2NrLgpAQCAtMTQ2LDI3MyArMTQ2LDI2OSBAQAogKiogYW5kIHRvIG1ha2Ugc3VyZSBldmVyeSByZWFsIGJsb2NrIGluIGEgdHJhbnNhY3Rpb24gaXMgb24gZGlzayBiZWZvcmUgYWxsb3dpbmcgdGhlIGxvZyBhcmVhCiAqKiB0byBiZSBvdmVyd3JpdHRlbiAqLwogc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCB7Ci0gIHVuc2lnbmVkIGxvbmcgal9zdGFydCA7Ci0gIHVuc2lnbmVkIGxvbmcgal9zdGF0ZTsKLSAgdW5zaWduZWQgbG9uZyBqX2xlbiA7Ci0gIGF0b21pY190IGpfbm9uemVyb2xlbiA7Ci0gIGF0b21pY190IGpfY29tbWl0X2xlZnQgOwotICBhdG9taWNfdCBqX29sZGVyX2NvbW1pdHNfZG9uZSA7ICAgICAgLyogYWxsIGNvbW1pdHMgb2xkZXIgdGhhbiB0aGlzIG9uIGRpc2sqLwotICBzdHJ1Y3Qgc2VtYXBob3JlIGpfY29tbWl0X2xvY2s7Ci0gIHVuc2lnbmVkIGxvbmcgal90cmFuc19pZCA7Ci0gIHRpbWVfdCBqX3RpbWVzdGFtcCA7Ci0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqal9saXN0X2JpdG1hcCA7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqal9jb21taXRfYmggOyAvKiBjb21taXQgYnVmZmVyIGhlYWQgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfcmVhbGJsb2NrICA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2ZyZWVkbGlzdCA7IC8qIGxpc3Qgb2YgYnVmZmVycyB0aGF0IHdlcmUgZnJlZWQgZHVyaW5nIHRoaXMgdHJhbnMuICBmcmVlIGVhY2ggb2YgdGhlc2Ugb24gZmx1c2ggKi8KLSAgLyogdGltZSBvcmRlcmVkIGxpc3Qgb2YgYWxsIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi8KLSAgc3RydWN0IGxpc3RfaGVhZCBqX2xpc3Q7CisJdW5zaWduZWQgbG9uZyBqX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgal9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGpfbGVuOworCWF0b21pY190IGpfbm9uemVyb2xlbjsKKwlhdG9taWNfdCBqX2NvbW1pdF9sZWZ0OworCWF0b21pY190IGpfb2xkZXJfY29tbWl0c19kb25lOwkvKiBhbGwgY29tbWl0cyBvbGRlciB0aGFuIHRoaXMgb24gZGlzayAqLworCXN0cnVjdCBzZW1hcGhvcmUgal9jb21taXRfbG9jazsKKwl1bnNpZ25lZCBsb25nIGpfdHJhbnNfaWQ7CisJdGltZV90IGpfdGltZXN0YW1wOworCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqal9saXN0X2JpdG1hcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmpfY29tbWl0X2JoOwkvKiBjb21taXQgYnVmZmVyIGhlYWQgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9yZWFsYmxvY2s7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfZnJlZWRsaXN0OwkvKiBsaXN0IG9mIGJ1ZmZlcnMgdGhhdCB3ZXJlIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zLiAgZnJlZSBlYWNoIG9mIHRoZXNlIG9uIGZsdXNoICovCisJLyogdGltZSBvcmRlcmVkIGxpc3Qgb2YgYWxsIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfbGlzdDsKIAotICAvKiB0aW1lIG9yZGVyZWQgbGlzdCBvZiBhbGwgdHJhbnNhY3Rpb25zIHdlIGhhdmVuJ3QgdHJpZWQgdG8gZmx1c2ggeWV0ICovCi0gIHN0cnVjdCBsaXN0X2hlYWQgal93b3JraW5nX2xpc3Q7CisJLyogdGltZSBvcmRlcmVkIGxpc3Qgb2YgYWxsIHRyYW5zYWN0aW9ucyB3ZSBoYXZlbid0IHRyaWVkIHRvIGZsdXNoIHlldCAqLworCXN0cnVjdCBsaXN0X2hlYWQgal93b3JraW5nX2xpc3Q7CiAKLSAgLyogbGlzdCBvZiB0YWlsIGNvbnZlcnNpb24gdGFyZ2V0cyBpbiBuZWVkIG9mIGZsdXNoIGJlZm9yZSBjb21taXQgKi8KLSAgc3RydWN0IGxpc3RfaGVhZCBqX3RhaWxfYmhfbGlzdDsKLSAgLyogbGlzdCBvZiBkYXRhPW9yZGVyZWQgYnVmZmVycyBpbiBuZWVkIG9mIGZsdXNoIGJlZm9yZSBjb21taXQgKi8KLSAgc3RydWN0IGxpc3RfaGVhZCBqX2JoX2xpc3Q7Ci0gIGludCBqX3JlZmNvdW50OwotfSA7CisJLyogbGlzdCBvZiB0YWlsIGNvbnZlcnNpb24gdGFyZ2V0cyBpbiBuZWVkIG9mIGZsdXNoIGJlZm9yZSBjb21taXQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfdGFpbF9iaF9saXN0OworCS8qIGxpc3Qgb2YgZGF0YT1vcmRlcmVkIGJ1ZmZlcnMgaW4gbmVlZCBvZiBmbHVzaCBiZWZvcmUgY29tbWl0ICovCisJc3RydWN0IGxpc3RfaGVhZCBqX2JoX2xpc3Q7CisJaW50IGpfcmVmY291bnQ7Cit9OwogCiBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqKiBqX2FwX2Jsb2NrcyA7IC8qIGpvdXJuYWwgYmxvY2tzIG9uIGRpc2sgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfbGFzdCA7IC8qIG5ld2VzdCBqb3VybmFsIGJsb2NrICovCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2ZpcnN0IDsgLyogIG9sZGVzdCBqb3VybmFsIGJsb2NrLiAgc3RhcnQgaGVyZSBmb3IgdHJhdmVyc2UgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipqX2FwX2Jsb2NrczsJLyogam91cm5hbCBibG9ja3Mgb24gZGlzayAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2xhc3Q7CS8qIG5ld2VzdCBqb3VybmFsIGJsb2NrICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfZmlyc3Q7CS8qICBvbGRlc3Qgam91cm5hbCBibG9jay4gIHN0YXJ0IGhlcmUgZm9yIHRyYXZlcnNlICovCiAKLSAgc3RydWN0IGZpbGUgICAgICAgICAqal9kZXZfZmlsZTsKLSAgc3RydWN0IGJsb2NrX2RldmljZSAqal9kZXZfYmQ7ICAKLSAgaW50IGpfMXN0X3Jlc2VydmVkX2Jsb2NrOyAgICAgLyogZmlyc3QgYmxvY2sgb24gc19kZXYgb2YgcmVzZXJ2ZWQgYXJlYSBqb3VybmFsICovICAgICAgICAKLQkKLSAgbG9uZyBqX3N0YXRlIDsJCQkKLSAgdW5zaWduZWQgbG9uZyBqX3RyYW5zX2lkIDsKLSAgdW5zaWduZWQgbG9uZyBqX21vdW50X2lkIDsKLSAgdW5zaWduZWQgbG9uZyBqX3N0YXJ0IDsgICAgICAgICAgICAgLyogc3RhcnQgb2YgY3VycmVudCB3YWl0aW5nIGNvbW1pdCAoaW5kZXggaW50byBqX2FwX2Jsb2NrcykgKi8KLSAgdW5zaWduZWQgbG9uZyBqX2xlbiA7ICAgICAgICAgICAgICAgLyogbGVuZ2h0IG9mIGN1cnJlbnQgd2FpdGluZyBjb21taXQgKi8KLSAgdW5zaWduZWQgbG9uZyBqX2xlbl9hbGxvYyA7ICAgICAgICAgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkIGJ5IGpvdXJuYWxfYmVnaW4oKSAqLwotICBhdG9taWNfdCBqX3djb3VudCA7ICAgICAgICAgICAgLyogY291bnQgb2Ygd3JpdGVycyBmb3IgY3VycmVudCBjb21taXQgKi8KLSAgdW5zaWduZWQgbG9uZyBqX2Jjb3VudCA7ICAgICAgICAgICAgLyogYmF0Y2ggY291bnQuIGFsbG93cyB0dXJuaW5nIFggdHJhbnNhY3Rpb25zIGludG8gMSAqLwotICB1bnNpZ25lZCBsb25nIGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCA7ICAvKiBmaXJzdCB1bmZsdXNoZWQgdHJhbnNhY3Rpb25zIG9mZnNldCAqLwotICB1bnNpZ25lZCBsb25nIGpfbGFzdF9mbHVzaF90cmFuc19pZCA7ICAgIC8qIGxhc3QgZnVsbHkgZmx1c2hlZCBqb3VybmFsIHRpbWVzdGFtcCAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmpfaGVhZGVyX2JoIDsgICAKKwlzdHJ1Y3QgZmlsZSAqal9kZXZfZmlsZTsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpqX2Rldl9iZDsKKwlpbnQgal8xc3RfcmVzZXJ2ZWRfYmxvY2s7CS8qIGZpcnN0IGJsb2NrIG9uIHNfZGV2IG9mIHJlc2VydmVkIGFyZWEgam91cm5hbCAqLwogCi0gIHRpbWVfdCBqX3RyYW5zX3N0YXJ0X3RpbWUgOyAgICAgICAgIC8qIHRpbWUgdGhpcyB0cmFuc2FjdGlvbiBzdGFydGVkICovCi0gIHN0cnVjdCBzZW1hcGhvcmUgal9sb2NrOwotICBzdHJ1Y3Qgc2VtYXBob3JlIGpfZmx1c2hfc2VtOwotICB3YWl0X3F1ZXVlX2hlYWRfdCBqX2pvaW5fd2FpdCA7ICAgIC8qIHdhaXQgZm9yIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gZmluaXNoIGJlZm9yZSBzdGFydGluZyBuZXcgb25lICovCi0gIGF0b21pY190IGpfamxvY2sgOyAgICAgICAgICAgICAgICAgICAgICAgLyogbG9jayBmb3Igal9qb2luX3dhaXQgKi8KLSAgaW50IGpfbGlzdF9iaXRtYXBfaW5kZXggOwkgICAgICAvKiBudW1iZXIgb2YgbmV4dCBsaXN0IGJpdG1hcCB0byB1c2UgKi8KLSAgaW50IGpfbXVzdF93YWl0IDsJCSAgICAgICAvKiBubyBtb3JlIGpvdXJuYWwgYmVnaW5zIGFsbG93ZWQuIE1VU1Qgc2xlZXAgb24gal9qb2luX3dhaXQgKi8KLSAgaW50IGpfbmV4dF9mdWxsX2ZsdXNoIDsgICAgICAgICAgICAgLyogbmV4dCBqb3VybmFsX2VuZCB3aWxsIGZsdXNoIGFsbCBqb3VybmFsIGxpc3QgKi8KLSAgaW50IGpfbmV4dF9hc3luY19mbHVzaCA7ICAgICAgICAgICAgIC8qIG5leHQgam91cm5hbF9lbmQgd2lsbCBmbHVzaCBhbGwgYXN5bmMgY29tbWl0cyAqLworCWxvbmcgal9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGpfdHJhbnNfaWQ7CisJdW5zaWduZWQgbG9uZyBqX21vdW50X2lkOworCXVuc2lnbmVkIGxvbmcgal9zdGFydDsJLyogc3RhcnQgb2YgY3VycmVudCB3YWl0aW5nIGNvbW1pdCAoaW5kZXggaW50byBqX2FwX2Jsb2NrcykgKi8KKwl1bnNpZ25lZCBsb25nIGpfbGVuOwkvKiBsZW5naHQgb2YgY3VycmVudCB3YWl0aW5nIGNvbW1pdCAqLworCXVuc2lnbmVkIGxvbmcgal9sZW5fYWxsb2M7CS8qIG51bWJlciBvZiBidWZmZXJzIHJlcXVlc3RlZCBieSBqb3VybmFsX2JlZ2luKCkgKi8KKwlhdG9taWNfdCBqX3djb3VudDsJLyogY291bnQgb2Ygd3JpdGVycyBmb3IgY3VycmVudCBjb21taXQgKi8KKwl1bnNpZ25lZCBsb25nIGpfYmNvdW50OwkvKiBiYXRjaCBjb3VudC4gYWxsb3dzIHR1cm5pbmcgWCB0cmFuc2FjdGlvbnMgaW50byAxICovCisJdW5zaWduZWQgbG9uZyBqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQ7CS8qIGZpcnN0IHVuZmx1c2hlZCB0cmFuc2FjdGlvbnMgb2Zmc2V0ICovCisJdW5zaWduZWQgbG9uZyBqX2xhc3RfZmx1c2hfdHJhbnNfaWQ7CS8qIGxhc3QgZnVsbHkgZmx1c2hlZCBqb3VybmFsIHRpbWVzdGFtcCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqal9oZWFkZXJfYmg7CiAKLSAgaW50IGpfY25vZGVfdXNlZCA7CSAgICAgIC8qIG51bWJlciBvZiBjbm9kZXMgb24gdGhlIHVzZWQgbGlzdCAqLwotICBpbnQgal9jbm9kZV9mcmVlIDsgICAgICAgICAgLyogbnVtYmVyIG9mIGNub2RlcyBvbiB0aGUgZnJlZSBsaXN0ICovCisJdGltZV90IGpfdHJhbnNfc3RhcnRfdGltZTsJLyogdGltZSB0aGlzIHRyYW5zYWN0aW9uIHN0YXJ0ZWQgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGpfbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGpfZmx1c2hfc2VtOworCXdhaXRfcXVldWVfaGVhZF90IGpfam9pbl93YWl0OwkvKiB3YWl0IGZvciBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIGZpbmlzaCBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZSAqLworCWF0b21pY190IGpfamxvY2s7CS8qIGxvY2sgZm9yIGpfam9pbl93YWl0ICovCisJaW50IGpfbGlzdF9iaXRtYXBfaW5kZXg7CS8qIG51bWJlciBvZiBuZXh0IGxpc3QgYml0bWFwIHRvIHVzZSAqLworCWludCBqX211c3Rfd2FpdDsJLyogbm8gbW9yZSBqb3VybmFsIGJlZ2lucyBhbGxvd2VkLiBNVVNUIHNsZWVwIG9uIGpfam9pbl93YWl0ICovCisJaW50IGpfbmV4dF9mdWxsX2ZsdXNoOwkvKiBuZXh0IGpvdXJuYWxfZW5kIHdpbGwgZmx1c2ggYWxsIGpvdXJuYWwgbGlzdCAqLworCWludCBqX25leHRfYXN5bmNfZmx1c2g7CS8qIG5leHQgam91cm5hbF9lbmQgd2lsbCBmbHVzaCBhbGwgYXN5bmMgY29tbWl0cyAqLwogCi0gIHVuc2lnbmVkIGludCBqX3RyYW5zX21heCA7ICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGJsb2NrcyBpbiBhIHRyYW5zYWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IGpfbWF4X2JhdGNoIDsgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgYmxvY2tzIHRvIGJhdGNoIGludG8gYSB0cmFucyAqLwotICB1bnNpZ25lZCBpbnQgal9tYXhfY29tbWl0X2FnZSA7ICAgICAgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYW4gYXN5bmMgY29tbWl0IGJlICovCi0gIHVuc2lnbmVkIGludCBqX21heF90cmFuc19hZ2UgOyAgICAgICAvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhIHRyYW5zYWN0aW9uIGJlICovCi0gIHVuc2lnbmVkIGludCBqX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2UgOyAvKiB0aGUgZGVmYXVsdCBmb3IgdGhlIG1heCBjb21taXQgYWdlICovCisJaW50IGpfY25vZGVfdXNlZDsJLyogbnVtYmVyIG9mIGNub2RlcyBvbiB0aGUgdXNlZCBsaXN0ICovCisJaW50IGpfY25vZGVfZnJlZTsJLyogbnVtYmVyIG9mIGNub2RlcyBvbiB0aGUgZnJlZSBsaXN0ICovCiAKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfY25vZGVfZnJlZV9saXN0IDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfY25vZGVfZnJlZV9vcmlnIDsgLyogb3JpZyBwb2ludGVyIHJldHVybmVkIGZyb20gdm1hbGxvYyAqLworCXVuc2lnbmVkIGludCBqX3RyYW5zX21heDsJLyogbWF4IG51bWJlciBvZiBibG9ja3MgaW4gYSB0cmFuc2FjdGlvbi4gICovCisJdW5zaWduZWQgaW50IGpfbWF4X2JhdGNoOwkvKiBtYXggbnVtYmVyIG9mIGJsb2NrcyB0byBiYXRjaCBpbnRvIGEgdHJhbnMgKi8KKwl1bnNpZ25lZCBpbnQgal9tYXhfY29tbWl0X2FnZTsJLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYW4gYXN5bmMgY29tbWl0IGJlICovCisJdW5zaWduZWQgaW50IGpfbWF4X3RyYW5zX2FnZTsJLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYSB0cmFuc2FjdGlvbiBiZSAqLworCXVuc2lnbmVkIGludCBqX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2U7CS8qIHRoZSBkZWZhdWx0IGZvciB0aGUgbWF4IGNvbW1pdCBhZ2UgKi8KIAotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqX2N1cnJlbnRfamw7Ci0gIGludCBqX2ZyZWVfYml0bWFwX25vZGVzIDsKLSAgaW50IGpfdXNlZF9iaXRtYXBfbm9kZXMgOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2Nub2RlX2ZyZWVfbGlzdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9jbm9kZV9mcmVlX29yaWc7CS8qIG9yaWcgcG9pbnRlciByZXR1cm5lZCBmcm9tIHZtYWxsb2MgKi8KIAotICBpbnQgal9udW1fbGlzdHM7ICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi8KLSAgaW50IGpfbnVtX3dvcmtfbGlzdHM7IC8qIG51bWJlciB0aGF0IG5lZWQgYXR0ZW50aW9uIGZyb20ga3JlaXNlcmZzZCAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpfY3VycmVudF9qbDsKKwlpbnQgal9mcmVlX2JpdG1hcF9ub2RlczsKKwlpbnQgal91c2VkX2JpdG1hcF9ub2RlczsKIAotICAvKiBkZWJ1Z2dpbmcgdG8gbWFrZSBzdXJlIHRoaW5ncyBhcmUgZmx1c2hlZCBpbiBvcmRlciAqLwotICBpbnQgal9sYXN0X2ZsdXNoX2lkOworCWludCBqX251bV9saXN0czsJLyogdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi8KKwlpbnQgal9udW1fd29ya19saXN0czsJLyogbnVtYmVyIHRoYXQgbmVlZCBhdHRlbnRpb24gZnJvbSBrcmVpc2VyZnNkICovCiAKLSAgLyogZGVidWdnaW5nIHRvIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIGNvbW1pdHRlZCBpbiBvcmRlciAqLwotICBpbnQgal9sYXN0X2NvbW1pdF9pZDsKKwkvKiBkZWJ1Z2dpbmcgdG8gbWFrZSBzdXJlIHRoaW5ncyBhcmUgZmx1c2hlZCBpbiBvcmRlciAqLworCWludCBqX2xhc3RfZmx1c2hfaWQ7CiAKLSAgc3RydWN0IGxpc3RfaGVhZCBqX2JpdG1hcF9ub2RlcyA7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgal9kaXJ0eV9idWZmZXJzIDsKLSAgc3BpbmxvY2tfdCBqX2RpcnR5X2J1ZmZlcnNfbG9jayA7IC8qIHByb3RlY3RzIGpfZGlydHlfYnVmZmVycyAqLworCS8qIGRlYnVnZ2luZyB0byBtYWtlIHN1cmUgdGhpbmdzIGFyZSBjb21taXR0ZWQgaW4gb3JkZXIgKi8KKwlpbnQgal9sYXN0X2NvbW1pdF9pZDsKIAotICAvKiBsaXN0IG9mIGFsbCBhY3RpdmUgdHJhbnNhY3Rpb25zICovCi0gIHN0cnVjdCBsaXN0X2hlYWQgal9qb3VybmFsX2xpc3Q7Ci0gIC8qIGxpc3RzIHRoYXQgaGF2ZW4ndCBiZWVuIHRvdWNoZWQgYnkgd3JpdGViYWNrIGF0dGVtcHRzICovCi0gIHN0cnVjdCBsaXN0X2hlYWQgal93b3JraW5nX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBqX2JpdG1hcF9ub2RlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfZGlydHlfYnVmZmVyczsKKwlzcGlubG9ja190IGpfZGlydHlfYnVmZmVyc19sb2NrOwkvKiBwcm90ZWN0cyBqX2RpcnR5X2J1ZmZlcnMgKi8KIAotICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgal9saXN0X2JpdG1hcFtKT1VSTkFMX05VTV9CSVRNQVBTXSA7CS8qIGFycmF5IG9mIGJpdG1hcHMgdG8gcmVjb3JkIHRoZSBkZWxldGVkIGJsb2NrcyAqLwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9oYXNoX3RhYmxlW0pPVVJOQUxfSEFTSF9TSVpFXSA7IAkgICAgLyogaGFzaCB0YWJsZSBmb3IgcmVhbCBidWZmZXIgaGVhZHMgaW4gY3VycmVudCB0cmFucyAqLyAKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfbGlzdF9oYXNoX3RhYmxlW0pPVVJOQUxfSEFTSF9TSVpFXSA7IC8qIGhhc2ggdGFibGUgZm9yIGFsbCB0aGUgcmVhbCBidWZmZXIgaGVhZHMgaW4gYWxsIAotICAJCQkJCQkJCQkJdGhlIHRyYW5zYWN0aW9ucyAqLwotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfcHJlYWxsb2NfbGlzdDsgICAgIC8qIGxpc3Qgb2YgaW5vZGVzIHdoaWNoIGhhdmUgcHJlYWxsb2NhdGVkIGJsb2NrcyAqLwotICBpbnQgal9wZXJzaXN0ZW50X3RyYW5zOwotICB1bnNpZ25lZCBsb25nIGpfbWF4X3RyYW5zX3NpemUgOwotICB1bnNpZ25lZCBsb25nIGpfbWF4X2JhdGNoX3NpemUgOworCS8qIGxpc3Qgb2YgYWxsIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfam91cm5hbF9saXN0OworCS8qIGxpc3RzIHRoYXQgaGF2ZW4ndCBiZWVuIHRvdWNoZWQgYnkgd3JpdGViYWNrIGF0dGVtcHRzICovCisJc3RydWN0IGxpc3RfaGVhZCBqX3dvcmtpbmdfbGlzdDsKIAotICBpbnQgal9lcnJubzsKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgal9saXN0X2JpdG1hcFtKT1VSTkFMX05VTV9CSVRNQVBTXTsJLyogYXJyYXkgb2YgYml0bWFwcyB0byByZWNvcmQgdGhlIGRlbGV0ZWQgYmxvY2tzICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfaGFzaF90YWJsZVtKT1VSTkFMX0hBU0hfU0laRV07CS8qIGhhc2ggdGFibGUgZm9yIHJlYWwgYnVmZmVyIGhlYWRzIGluIGN1cnJlbnQgdHJhbnMgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9saXN0X2hhc2hfdGFibGVbSk9VUk5BTF9IQVNIX1NJWkVdOwkvKiBoYXNoIHRhYmxlIGZvciBhbGwgdGhlIHJlYWwgYnVmZmVyIGhlYWRzIGluIGFsbCAKKwkJCQkJCQkJCQkgICB0aGUgdHJhbnNhY3Rpb25zICovCisJc3RydWN0IGxpc3RfaGVhZCBqX3ByZWFsbG9jX2xpc3Q7CS8qIGxpc3Qgb2YgaW5vZGVzIHdoaWNoIGhhdmUgcHJlYWxsb2NhdGVkIGJsb2NrcyAqLworCWludCBqX3BlcnNpc3RlbnRfdHJhbnM7CisJdW5zaWduZWQgbG9uZyBqX21heF90cmFuc19zaXplOworCXVuc2lnbmVkIGxvbmcgal9tYXhfYmF0Y2hfc2l6ZTsKIAotICAvKiB3aGVuIGZsdXNoaW5nIG9yZGVyZWQgYnVmZmVycywgdGhyb3R0bGUgbmV3IG9yZGVyZWQgd3JpdGVycyAqLwotICBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgal93b3JrOwotICBhdG9taWNfdCBqX2FzeW5jX3Rocm90dGxlOworCWludCBqX2Vycm5vOworCisJLyogd2hlbiBmbHVzaGluZyBvcmRlcmVkIGJ1ZmZlcnMsIHRocm90dGxlIG5ldyBvcmRlcmVkIHdyaXRlcnMgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgal93b3JrOworCWF0b21pY190IGpfYXN5bmNfdGhyb3R0bGU7CiB9OwogCiBlbnVtIGpvdXJuYWxfc3RhdGVfYml0cyB7Ci0gICAgSl9XUklURVJTX0JMT0NLRUQgPSAxLCAgIC8qIHNldCB3aGVuIG5ldyB3cml0ZXJzIG5vdCBhbGxvd2VkICovCi0gICAgSl9XUklURVJTX1FVRVVFRCwgICAgICAgIC8qIHNldCB3aGVuIGxvZyBpcyBmdWxsIGR1ZSB0byB0b28gbWFueSB3cml0ZXJzICovCi0gICAgSl9BQk9SVEVELCAgICAgICAgICAgICAgIC8qIHNldCB3aGVuIGxvZyBpcyBhYm9ydGVkICovCisJSl9XUklURVJTX0JMT0NLRUQgPSAxLAkvKiBzZXQgd2hlbiBuZXcgd3JpdGVycyBub3QgYWxsb3dlZCAqLworCUpfV1JJVEVSU19RVUVVRUQsCS8qIHNldCB3aGVuIGxvZyBpcyBmdWxsIGR1ZSB0byB0b28gbWFueSB3cml0ZXJzICovCisJSl9BQk9SVEVELAkJLyogc2V0IHdoZW4gbG9nIGlzIGFib3J0ZWQgKi8KIH07CiAKKyNkZWZpbmUgSk9VUk5BTF9ERVNDX01BR0lDICJSZUlzRXJMQiIJLyogaWNrLiAgbWFnaWMgc3RyaW5nIHRvIGZpbmQgZGVzYyBibG9ja3MgaW4gdGhlIGpvdXJuYWwgKi8KIAotI2RlZmluZSBKT1VSTkFMX0RFU0NfTUFHSUMgIlJlSXNFckxCIiAvKiBpY2suICBtYWdpYyBzdHJpbmcgdG8gZmluZCBkZXNjIGJsb2NrcyBpbiB0aGUgam91cm5hbCAqLwordHlwZWRlZiBfX3UzMigqaGFzaGZfdCkgKGNvbnN0IHNpZ25lZCBjaGFyICosIGludCk7CiAKLXR5cGVkZWYgX191MzIgKCpoYXNoZl90KSAoY29uc3Qgc2lnbmVkIGNoYXIgKiwgaW50KTsKLQotc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvCi17Ci0gICAgLy8gRklYTUU6IFdvbid0IHdvcmsgd2l0aCBibG9jayBzaXplcyA+IDhLCi0gICAgX191MTYgIGZpcnN0X3plcm9faGludDsKLSAgICBfX3UxNiAgZnJlZV9jb3VudDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOyAvKiB0aGUgYWN0dWFsIGJpdG1hcCAqLworc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvIHsKKwkvLyBGSVhNRTogV29uJ3Qgd29yayB3aXRoIGJsb2NrIHNpemVzID4gOEsKKwlfX3UxNiBmaXJzdF96ZXJvX2hpbnQ7CisJX191MTYgZnJlZV9jb3VudDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwkvKiB0aGUgYWN0dWFsIGJpdG1hcCAqLwogfTsKIAogc3RydWN0IHByb2NfZGlyX2VudHJ5OwogCiAjaWYgZGVmaW5lZCggQ09ORklHX1BST0NfRlMgKSAmJiBkZWZpbmVkKCBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPICkKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc3RhdF9jbnRfdDsKLXR5cGVkZWYgc3RydWN0IHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhCi17Ci0gIHNwaW5sb2NrX3QgbG9jazsKLSAgaW50IGV4aXRpbmc7Ci0gIGludCBtYXhfaGFzaF9jb2xsaXNpb25zOwordHlwZWRlZiBzdHJ1Y3QgcmVpc2VyZnNfcHJvY19pbmZvX2RhdGEgeworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgZXhpdGluZzsKKwlpbnQgbWF4X2hhc2hfY29sbGlzaW9uczsKIAotICBzdGF0X2NudF90IGJyZWFkczsKLSAgc3RhdF9jbnRfdCBicmVhZF9taXNzOwotICBzdGF0X2NudF90IHNlYXJjaF9ieV9rZXk7Ci0gIHN0YXRfY250X3Qgc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkOwotICBzdGF0X2NudF90IHNlYXJjaF9ieV9rZXlfcmVzdGFydGVkOworCXN0YXRfY250X3QgYnJlYWRzOworCXN0YXRfY250X3QgYnJlYWRfbWlzczsKKwlzdGF0X2NudF90IHNlYXJjaF9ieV9rZXk7CisJc3RhdF9jbnRfdCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ7CisJc3RhdF9jbnRfdCBzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZDsKIAotICBzdGF0X2NudF90IGluc2VydF9pdGVtX3Jlc3RhcnRlZDsKLSAgc3RhdF9jbnRfdCBwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkOwotICBzdGF0X2NudF90IGN1dF9mcm9tX2l0ZW1fcmVzdGFydGVkOwotICBzdGF0X2NudF90IGRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZDsKLSAgc3RhdF9jbnRfdCBkZWxldGVfaXRlbV9yZXN0YXJ0ZWQ7CisJc3RhdF9jbnRfdCBpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQ7CisJc3RhdF9jbnRfdCBwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkOworCXN0YXRfY250X3QgY3V0X2Zyb21faXRlbV9yZXN0YXJ0ZWQ7CisJc3RhdF9jbnRfdCBkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQ7CisJc3RhdF9jbnRfdCBkZWxldGVfaXRlbV9yZXN0YXJ0ZWQ7CiAKLSAgc3RhdF9jbnRfdCBsZWFrZWRfb2lkOwotICBzdGF0X2NudF90IGxlYXZlc19yZW1vdmFibGU7CisJc3RhdF9jbnRfdCBsZWFrZWRfb2lkOworCXN0YXRfY250X3QgbGVhdmVzX3JlbW92YWJsZTsKIAotICAvKiBiYWxhbmNlcyBwZXIgbGV2ZWwuIFVzZSBleHBsaWNpdCA1IGFzIE1BWF9IRUlHSFQgaXMgbm90IHZpc2libGUgeWV0LiAqLwotICBzdGF0X2NudF90IGJhbGFuY2VfYXRbIDUgXTsgLyogWFhYICovCi0gIC8qIHNiayA9PSBzZWFyY2hfYnlfa2V5ICovCi0gIHN0YXRfY250X3Qgc2JrX3JlYWRfYXRbIDUgXTsgLyogWFhYICovCi0gIHN0YXRfY250X3Qgc2JrX2ZzX2NoYW5nZWRbIDUgXTsKLSAgc3RhdF9jbnRfdCBzYmtfcmVzdGFydGVkWyA1IF07Ci0gIHN0YXRfY250X3QgaXRlbXNfYXRbIDUgXTsgLyogWFhYICovCi0gIHN0YXRfY250X3QgZnJlZV9hdFsgNSBdOyAvKiBYWFggKi8KLSAgc3RhdF9jbnRfdCBjYW5fbm9kZV9iZV9yZW1vdmVkWyA1IF07IC8qIFhYWCAqLwotICBsb25nIGludCBsbnVtWyA1IF07IC8qIFhYWCAqLwotICBsb25nIGludCBybnVtWyA1IF07IC8qIFhYWCAqLwotICBsb25nIGludCBsYnl0ZXNbIDUgXTsgLyogWFhYICovCi0gIGxvbmcgaW50IHJieXRlc1sgNSBdOyAvKiBYWFggKi8KLSAgc3RhdF9jbnRfdCBnZXRfbmVpZ2hib3JzWyA1IF07Ci0gIHN0YXRfY250X3QgZ2V0X25laWdoYm9yc19yZXN0YXJ0WyA1IF07Ci0gIHN0YXRfY250X3QgbmVlZF9sX25laWdoYm9yWyA1IF07Ci0gIHN0YXRfY250X3QgbmVlZF9yX25laWdoYm9yWyA1IF07CisJLyogYmFsYW5jZXMgcGVyIGxldmVsLiBVc2UgZXhwbGljaXQgNSBhcyBNQVhfSEVJR0hUIGlzIG5vdCB2aXNpYmxlIHlldC4gKi8KKwlzdGF0X2NudF90IGJhbGFuY2VfYXRbNV07CS8qIFhYWCAqLworCS8qIHNiayA9PSBzZWFyY2hfYnlfa2V5ICovCisJc3RhdF9jbnRfdCBzYmtfcmVhZF9hdFs1XTsJLyogWFhYICovCisJc3RhdF9jbnRfdCBzYmtfZnNfY2hhbmdlZFs1XTsKKwlzdGF0X2NudF90IHNia19yZXN0YXJ0ZWRbNV07CisJc3RhdF9jbnRfdCBpdGVtc19hdFs1XTsJLyogWFhYICovCisJc3RhdF9jbnRfdCBmcmVlX2F0WzVdOwkvKiBYWFggKi8KKwlzdGF0X2NudF90IGNhbl9ub2RlX2JlX3JlbW92ZWRbNV07CS8qIFhYWCAqLworCWxvbmcgaW50IGxudW1bNV07CS8qIFhYWCAqLworCWxvbmcgaW50IHJudW1bNV07CS8qIFhYWCAqLworCWxvbmcgaW50IGxieXRlc1s1XTsJLyogWFhYICovCisJbG9uZyBpbnQgcmJ5dGVzWzVdOwkvKiBYWFggKi8KKwlzdGF0X2NudF90IGdldF9uZWlnaGJvcnNbNV07CisJc3RhdF9jbnRfdCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbNV07CisJc3RhdF9jbnRfdCBuZWVkX2xfbmVpZ2hib3JbNV07CisJc3RhdF9jbnRfdCBuZWVkX3JfbmVpZ2hib3JbNV07CiAKLSAgc3RhdF9jbnRfdCBmcmVlX2Jsb2NrOwotICBzdHJ1Y3QgX19zY2FuX2JpdG1hcF9zdGF0cyB7Ci0Jc3RhdF9jbnRfdCBjYWxsOwotCXN0YXRfY250X3Qgd2FpdDsKLQlzdGF0X2NudF90IGJtYXA7Ci0Jc3RhdF9jbnRfdCByZXRyeTsKLQlzdGF0X2NudF90IGluX2pvdXJuYWxfaGludDsKLQlzdGF0X2NudF90IGluX2pvdXJuYWxfbm9oaW50OwotCXN0YXRfY250X3Qgc3RvbGVuOwotICB9IHNjYW5fYml0bWFwOwotICBzdHJ1Y3QgX19qb3VybmFsX3N0YXRzIHsKLQlzdGF0X2NudF90IGluX2pvdXJuYWw7Ci0Jc3RhdF9jbnRfdCBpbl9qb3VybmFsX2JpdG1hcDsKLQlzdGF0X2NudF90IGluX2pvdXJuYWxfcmV1c2FibGU7Ci0Jc3RhdF9jbnRfdCBsb2NrX2pvdXJuYWw7Ci0Jc3RhdF9jbnRfdCBsb2NrX2pvdXJuYWxfd2FpdDsKLQlzdGF0X2NudF90IGpvdXJuYWxfYmVpbmc7Ci0Jc3RhdF9jbnRfdCBqb3VybmFsX3JlbG9ja193cml0ZXJzOwotCXN0YXRfY250X3Qgam91cm5hbF9yZWxvY2tfd2NvdW50OwotCXN0YXRfY250X3QgbWFya19kaXJ0eTsKLQlzdGF0X2NudF90IG1hcmtfZGlydHlfYWxyZWFkeTsKLQlzdGF0X2NudF90IG1hcmtfZGlydHlfbm90am91cm5hbDsKLQlzdGF0X2NudF90IHJlc3RvcmVfcHJlcGFyZWQ7Ci0Jc3RhdF9jbnRfdCBwcmVwYXJlOwotCXN0YXRfY250X3QgcHJlcGFyZV9yZXRyeTsKLSAgfSBqb3VybmFsOworCXN0YXRfY250X3QgZnJlZV9ibG9jazsKKwlzdHJ1Y3QgX19zY2FuX2JpdG1hcF9zdGF0cyB7CisJCXN0YXRfY250X3QgY2FsbDsKKwkJc3RhdF9jbnRfdCB3YWl0OworCQlzdGF0X2NudF90IGJtYXA7CisJCXN0YXRfY250X3QgcmV0cnk7CisJCXN0YXRfY250X3QgaW5fam91cm5hbF9oaW50OworCQlzdGF0X2NudF90IGluX2pvdXJuYWxfbm9oaW50OworCQlzdGF0X2NudF90IHN0b2xlbjsKKwl9IHNjYW5fYml0bWFwOworCXN0cnVjdCBfX2pvdXJuYWxfc3RhdHMgeworCQlzdGF0X2NudF90IGluX2pvdXJuYWw7CisJCXN0YXRfY250X3QgaW5fam91cm5hbF9iaXRtYXA7CisJCXN0YXRfY250X3QgaW5fam91cm5hbF9yZXVzYWJsZTsKKwkJc3RhdF9jbnRfdCBsb2NrX2pvdXJuYWw7CisJCXN0YXRfY250X3QgbG9ja19qb3VybmFsX3dhaXQ7CisJCXN0YXRfY250X3Qgam91cm5hbF9iZWluZzsKKwkJc3RhdF9jbnRfdCBqb3VybmFsX3JlbG9ja193cml0ZXJzOworCQlzdGF0X2NudF90IGpvdXJuYWxfcmVsb2NrX3djb3VudDsKKwkJc3RhdF9jbnRfdCBtYXJrX2RpcnR5OworCQlzdGF0X2NudF90IG1hcmtfZGlydHlfYWxyZWFkeTsKKwkJc3RhdF9jbnRfdCBtYXJrX2RpcnR5X25vdGpvdXJuYWw7CisJCXN0YXRfY250X3QgcmVzdG9yZV9wcmVwYXJlZDsKKwkJc3RhdF9jbnRfdCBwcmVwYXJlOworCQlzdGF0X2NudF90IHByZXBhcmVfcmV0cnk7CisJfSBqb3VybmFsOwogfSByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90OwogI2Vsc2UKLXR5cGVkZWYgc3RydWN0IHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhCi17fSByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90OwordHlwZWRlZiBzdHJ1Y3QgcmVpc2VyZnNfcHJvY19pbmZvX2RhdGEgeworfSByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90OwogI2VuZGlmCiAKIC8qIHJlaXNlcmZzIHVuaW9uIG9mIGluLWNvcmUgc3VwZXIgYmxvY2sgZGF0YSAqLwotc3RydWN0IHJlaXNlcmZzX3NiX2luZm8KLXsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCi0JCQkJLyogYm90aCB0aGUgY29tbWVudCBhbmQgdGhlIGNob2ljZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIGFyZSB1bmNsZWFyIGZvciBzX3JzIC1IYW5zICovCi0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogc19yczsgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrIGluIHRoZSBidWZmZXIgKi8KLSAgICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKiBzX2FwX2JpdG1hcDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqc19qb3VybmFsIDsJCS8qIHBvaW50ZXIgdG8gam91cm5hbCBpbmZvcm1hdGlvbiAqLwotICAgIHVuc2lnbmVkIHNob3J0IHNfbW91bnRfc3RhdGU7ICAgICAgICAgICAgICAgICAvKiByZWlzZXJmcyBzdGF0ZSAodmFsaWQsIGludmFsaWQpICovCi0gIAotCQkJCS8qIENvbW1lbnQ/IC1IYW5zICovCi0gICAgdm9pZCAoKmVuZF9pb19oYW5kbGVyKShzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKLSAgICBoYXNoZl90IHNfaGFzaF9mdW5jdGlvbjsJLyogcG9pbnRlciB0byBmdW5jdGlvbiB3aGljaCBpcyB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNvcnQgbmFtZXMgaW4gZGlyZWN0b3J5LiBTZXQgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnQgKi8KLSAgICB1bnNpZ25lZCBsb25nIHNfbW91bnRfb3B0OwkvKiByZWlzZXJmcydzIG1vdW50IG9wdGlvbnMgYXJlIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIChjdXJyZW50bHkgLSBOT1RBSUwsIE5PTE9HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBMQVlPTkxZKSAqLworc3RydWN0IHJlaXNlcmZzX3NiX2luZm8geworCXN0cnVjdCBidWZmZXJfaGVhZCAqc19zYmg7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLworCS8qIGJvdGggdGhlIGNvbW1lbnQgYW5kIHRoZSBjaG9pY2Ugb2YKKwkgICBuYW1lIGFyZSB1bmNsZWFyIGZvciBzX3JzIC1IYW5zICovCisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpzX3JzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCisJc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpzX2FwX2JpdG1hcDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqc19qb3VybmFsOwkvKiBwb2ludGVyIHRvIGpvdXJuYWwgaW5mb3JtYXRpb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBzX21vdW50X3N0YXRlOwkvKiByZWlzZXJmcyBzdGF0ZSAodmFsaWQsIGludmFsaWQpICovCiAKLSAgICBzdHJ1Y3QgewkJCS8qIFRoaXMgaXMgYSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgYmxvY2sgYWxsb2NhdG9yIG9wdGlvbnMgKi8KLQl1bnNpZ25lZCBsb25nIGJpdHM7CS8qIEJpdGZpZWxkIGZvciBlbmFibGUvZGlzYWJsZSBraW5kIG9mIG9wdGlvbnMgKi8KLQl1bnNpZ25lZCBsb25nIGxhcmdlX2ZpbGVfc2l6ZTsgLyogc2l6ZSBzdGFydGVkIGZyb20gd2hpY2ggd2UgY29uc2lkZXIgZmlsZSB0byBiZSBhIGxhcmdlIG9uZShpbiBibG9ja3MpICovCi0JaW50IGJvcmRlcjsJCS8qIHBlcmNlbnRhZ2Ugb2YgZGlzaywgYm9yZGVyIHRha2VzICovCi0JaW50IHByZWFsbG9jbWluOwkvKiBNaW5pbWFsIGZpbGUgc2l6ZSAoaW4gYmxvY2tzKSBzdGFydGluZyBmcm9tIHdoaWNoIHdlIGRvIHByZWFsbG9jYXRpb25zICovCi0JaW50IHByZWFsbG9jc2l6ZTsJLyogTnVtYmVyIG9mIGJsb2NrcyB3ZSB0cnkgdG8gcHJlYWxsb2Mgd2hlbiBmaWxlCi0JCQkJICAgcmVhY2hlcyBwcmVhbGxvY21pbiBzaXplIChpbiBibG9ja3MpIG9yCi0JCQkJICAgcHJlYWxsb2NfbGlzdCBpcyBlbXB0eS4gKi8KLSAgICB9IHNfYWxsb2Nfb3B0aW9uczsKKwkvKiBDb21tZW50PyAtSGFucyAqLworCXZvaWQgKCplbmRfaW9faGFuZGxlcikgKHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworCWhhc2hmX3Qgc19oYXNoX2Z1bmN0aW9uOwkvKiBwb2ludGVyIHRvIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQKKwkJCQkJICAgdG8gc29ydCBuYW1lcyBpbiBkaXJlY3RvcnkuIFNldCBvbgorCQkJCQkgICBtb3VudCAqLworCXVuc2lnbmVkIGxvbmcgc19tb3VudF9vcHQ7CS8qIHJlaXNlcmZzJ3MgbW91bnQgb3B0aW9ucyBhcmUgc2V0CisJCQkJCSAgIGhlcmUgKGN1cnJlbnRseSAtIE5PVEFJTCwgTk9MT0csCisJCQkJCSAgIFJFUExBWU9OTFkpICovCiAKLQkJCQkvKiBDb21tZW50PyAtSGFucyAqLwotICAgIHdhaXRfcXVldWVfaGVhZF90IHNfd2FpdDsKLQkJCQkvKiBUbyBiZSBvYnNvbGV0ZWQgc29vbiBieSBwZXIgYnVmZmVyIHNlYWxzLi4gLUhhbnMgKi8KLSAgICBhdG9taWNfdCBzX2dlbmVyYXRpb25fY291bnRlcjsgLy8gaW5jcmVhc2VkIGJ5IG9uZSBldmVyeSB0aW1lIHRoZQotICAgIC8vIHRyZWUgZ2V0cyByZS1iYWxhbmNlZAotICAgIHVuc2lnbmVkIGxvbmcgc19wcm9wZXJ0aWVzOyAgICAvKiBGaWxlIHN5c3RlbSBwcm9wZXJ0aWVzLiBDdXJyZW50bHkgaG9sZHMKLQkJCQkgICAgIG9uLWRpc2sgRlMgZm9ybWF0ICovCi0gICAgCi0gICAgLyogc2Vzc2lvbiBzdGF0aXN0aWNzICovCi0gICAgaW50IHNfa21hbGxvY3M7Ci0gICAgaW50IHNfZGlza19yZWFkczsKLSAgICBpbnQgc19kaXNrX3dyaXRlczsKLSAgICBpbnQgc19maXhfbm9kZXM7Ci0gICAgaW50IHNfZG9fYmFsYW5jZTsKLSAgICBpbnQgc191bm5lZWRlZF9sZWZ0X25laWdoYm9yOwotICAgIGludCBzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYTsKLSAgICBpbnQgc19ibWFwczsKLSAgICBpbnQgc19ibWFwc193aXRob3V0X3NlYXJjaDsKLSAgICBpbnQgc19kaXJlY3QyaW5kaXJlY3Q7Ci0gICAgaW50IHNfaW5kaXJlY3QyZGlyZWN0OworCXN0cnVjdCB7CQkvKiBUaGlzIGlzIGEgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGJsb2NrIGFsbG9jYXRvciBvcHRpb25zICovCisJCXVuc2lnbmVkIGxvbmcgYml0czsJLyogQml0ZmllbGQgZm9yIGVuYWJsZS9kaXNhYmxlIGtpbmQgb2Ygb3B0aW9ucyAqLworCQl1bnNpZ25lZCBsb25nIGxhcmdlX2ZpbGVfc2l6ZTsJLyogc2l6ZSBzdGFydGVkIGZyb20gd2hpY2ggd2UgY29uc2lkZXIgZmlsZSB0byBiZSBhIGxhcmdlIG9uZShpbiBibG9ja3MpICovCisJCWludCBib3JkZXI7CS8qIHBlcmNlbnRhZ2Ugb2YgZGlzaywgYm9yZGVyIHRha2VzICovCisJCWludCBwcmVhbGxvY21pbjsJLyogTWluaW1hbCBmaWxlIHNpemUgKGluIGJsb2Nrcykgc3RhcnRpbmcgZnJvbSB3aGljaCB3ZSBkbyBwcmVhbGxvY2F0aW9ucyAqLworCQlpbnQgcHJlYWxsb2NzaXplOwkvKiBOdW1iZXIgb2YgYmxvY2tzIHdlIHRyeSB0byBwcmVhbGxvYyB3aGVuIGZpbGUKKwkJCQkJICAgcmVhY2hlcyBwcmVhbGxvY21pbiBzaXplIChpbiBibG9ja3MpIG9yCisJCQkJCSAgIHByZWFsbG9jX2xpc3QgaXMgZW1wdHkuICovCisJfSBzX2FsbG9jX29wdGlvbnM7CisKKwkvKiBDb21tZW50PyAtSGFucyAqLworCXdhaXRfcXVldWVfaGVhZF90IHNfd2FpdDsKKwkvKiBUbyBiZSBvYnNvbGV0ZWQgc29vbiBieSBwZXIgYnVmZmVyIHNlYWxzLi4gLUhhbnMgKi8KKwlhdG9taWNfdCBzX2dlbmVyYXRpb25fY291bnRlcjsJLy8gaW5jcmVhc2VkIGJ5IG9uZSBldmVyeSB0aW1lIHRoZQorCS8vIHRyZWUgZ2V0cyByZS1iYWxhbmNlZAorCXVuc2lnbmVkIGxvbmcgc19wcm9wZXJ0aWVzOwkvKiBGaWxlIHN5c3RlbSBwcm9wZXJ0aWVzLiBDdXJyZW50bHkgaG9sZHMKKwkJCQkJICAgb24tZGlzayBGUyBmb3JtYXQgKi8KKworCS8qIHNlc3Npb24gc3RhdGlzdGljcyAqLworCWludCBzX2ttYWxsb2NzOworCWludCBzX2Rpc2tfcmVhZHM7CisJaW50IHNfZGlza193cml0ZXM7CisJaW50IHNfZml4X25vZGVzOworCWludCBzX2RvX2JhbGFuY2U7CisJaW50IHNfdW5uZWVkZWRfbGVmdF9uZWlnaGJvcjsKKwlpbnQgc19nb29kX3NlYXJjaF9ieV9rZXlfcmVhZGE7CisJaW50IHNfYm1hcHM7CisJaW50IHNfYm1hcHNfd2l0aG91dF9zZWFyY2g7CisJaW50IHNfZGlyZWN0MmluZGlyZWN0OworCWludCBzX2luZGlyZWN0MmRpcmVjdDsKIAkvKiBzZXQgdXAgd2hlbiBpdCdzIG9rIGZvciByZWlzZXJmc19yZWFkX2lub2RlMigpIHRvIHJlYWQgZnJvbQogCSAgIGRpc2sgaW5vZGUgd2l0aCBubGluaz09MC4gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIGR1cmluZwogCSAgIGZpbmlzaF91bmZpbmlzaGVkKCkgcHJvY2Vzc2luZyBhdCBtb3VudCB0aW1lICovCi0gICAgaW50IHNfaXNfdW5saW5rZWRfb2s7Ci0gICAgcmVpc2VyZnNfcHJvY19pbmZvX2RhdGFfdCBzX3Byb2NfaW5mb19kYXRhOwotICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY2RpcjsKLSAgICBpbnQgcmVzZXJ2ZWRfYmxvY2tzOyAvKiBhbW91bnQgb2YgYmxvY2tzIHJlc2VydmVkIGZvciBmdXJ0aGVyIGFsbG9jYXRpb25zICovCi0gICAgc3BpbmxvY2tfdCBiaXRtYXBfbG9jazsgLyogdGhpcyBsb2NrIG9uIG5vdyBvbmx5IHVzZWQgdG8gcHJvdGVjdCByZXNlcnZlZF9ibG9ja3MgdmFyaWFibGUgKi8KLSAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2X3Jvb3Q7IC8qIHJvb3Qgb2YgLy5yZWlzZXJmc19wcml2ICovCi0gICAgc3RydWN0IGRlbnRyeSAqeGF0dHJfcm9vdDsgLyogcm9vdCBvZiAvLnJlaXNlcmZzX3ByaXYvLnhhICovCi0gICAgc3RydWN0IHJ3X3NlbWFwaG9yZSB4YXR0cl9kaXJfc2VtOworCWludCBzX2lzX3VubGlua2VkX29rOworCXJlaXNlcmZzX3Byb2NfaW5mb19kYXRhX3Qgc19wcm9jX2luZm9fZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NkaXI7CisJaW50IHJlc2VydmVkX2Jsb2NrczsJLyogYW1vdW50IG9mIGJsb2NrcyByZXNlcnZlZCBmb3IgZnVydGhlciBhbGxvY2F0aW9ucyAqLworCXNwaW5sb2NrX3QgYml0bWFwX2xvY2s7CS8qIHRoaXMgbG9jayBvbiBub3cgb25seSB1c2VkIHRvIHByb3RlY3QgcmVzZXJ2ZWRfYmxvY2tzIHZhcmlhYmxlICovCisJc3RydWN0IGRlbnRyeSAqcHJpdl9yb290OwkvKiByb290IG9mIC8ucmVpc2VyZnNfcHJpdiAqLworCXN0cnVjdCBkZW50cnkgKnhhdHRyX3Jvb3Q7CS8qIHJvb3Qgb2YgLy5yZWlzZXJmc19wcml2Ly54YSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgeGF0dHJfZGlyX3NlbTsKIAotICAgIGludCBqX2Vycm5vOworCWludCBqX2Vycm5vOwogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIGNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsKLSAgICBpbnQgc19qcXVvdGFfZm10OworCWNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsKKwlpbnQgc19qcXVvdGFfZm10OwogI2VuZGlmCiB9OwogCkBAIC00MjIsMTQgKzQxOCwxNCBAQAogCiBlbnVtIHJlaXNlcmZzX21vdW50X29wdGlvbnMgewogLyogTW91bnQgb3B0aW9ucyAqLwotICAgIFJFSVNFUkZTX0xBUkdFVEFJTCwgIC8qIGxhcmdlIHRhaWxzIHdpbGwgYmUgY3JlYXRlZCBpbiBhIHNlc3Npb24gKi8KLSAgICBSRUlTRVJGU19TTUFMTFRBSUwsICAvKiBzbWFsbCAoZm9yIGZpbGVzIGxlc3MgdGhhbiBibG9jayBzaXplKSB0YWlscyB3aWxsIGJlIGNyZWF0ZWQgaW4gYSBzZXNzaW9uICovCi0gICAgUkVQTEFZT05MWSwgLyogcmVwbGF5IGpvdXJuYWwgYW5kIHJldHVybiAwLiBVc2UgYnkgZnNjayAqLwotICAgIFJFSVNFUkZTX0NPTlZFUlQsICAgIC8qIC1vIGNvbnY6IGNhdXNlcyBjb252ZXJzaW9uIG9mIG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IHN1cGVyIGJsb2NrIHRvIHRoZSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC4gSWYgbm90IHNwZWNpZmllZCAtIG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uIHdpbGwgYmUgZGVhbHQgd2l0aCBpbiBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5uZXIgb2YgMy41LnggKi8KKwlSRUlTRVJGU19MQVJHRVRBSUwsCS8qIGxhcmdlIHRhaWxzIHdpbGwgYmUgY3JlYXRlZCBpbiBhIHNlc3Npb24gKi8KKwlSRUlTRVJGU19TTUFMTFRBSUwsCS8qIHNtYWxsIChmb3IgZmlsZXMgbGVzcyB0aGFuIGJsb2NrIHNpemUpIHRhaWxzIHdpbGwgYmUgY3JlYXRlZCBpbiBhIHNlc3Npb24gKi8KKwlSRVBMQVlPTkxZLAkJLyogcmVwbGF5IGpvdXJuYWwgYW5kIHJldHVybiAwLiBVc2UgYnkgZnNjayAqLworCVJFSVNFUkZTX0NPTlZFUlQsCS8qIC1vIGNvbnY6IGNhdXNlcyBjb252ZXJzaW9uIG9mIG9sZAorCQkJCSAgIGZvcm1hdCBzdXBlciBibG9jayB0byB0aGUgbmV3CisJCQkJICAgZm9ybWF0LiBJZiBub3Qgc3BlY2lmaWVkIC0gb2xkCisJCQkJICAgcGFydGl0aW9uIHdpbGwgYmUgZGVhbHQgd2l0aCBpbiBhCisJCQkJICAgbWFubmVyIG9mIDMuNS54ICovCiAKIC8qIC1vIGhhc2g9e3RlYSwgcnVwYXNvdiwgcjUsIGRldGVjdH0gaXMgbWVhbnQgZm9yIHByb3Blcmx5IG1vdW50aW5nIAogKiogcmVpc2VyZnMgZGlza3MgZnJvbSAzLjUuMTkgb3IgZWFybGllci4gIDk5JSBvZiB0aGUgdGltZSwgdGhpcyBvcHRpb24KQEAgLTQzOSw0MSArNDM1LDQxIEBACiAqKiB0aGUgZXhpc3RpbmcgaGFzaCBvbiB0aGUgRlMsIHNvIGlmIHlvdSBoYXZlIGEgdGVhIGhhc2ggZGlzaywgYW5kIG1vdW50CiAqKiB3aXRoIC1vIGhhc2g9cnVwYXNvdiwgdGhlIG1vdW50IHdpbGwgZmFpbC4KICovCi0gICAgRk9SQ0VfVEVBX0hBU0gsICAgICAgLyogdHJ5IHRvIGZvcmNlIHRlYSBoYXNoIG9uIG1vdW50ICovCi0gICAgRk9SQ0VfUlVQQVNPVl9IQVNILCAgLyogdHJ5IHRvIGZvcmNlIHJ1cGFzb3YgaGFzaCBvbiBtb3VudCAqLwotICAgIEZPUkNFX1I1X0hBU0gsICAgICAgIC8qIHRyeSB0byBmb3JjZSBydXBhc292IGhhc2ggb24gbW91bnQgKi8KLSAgICBGT1JDRV9IQVNIX0RFVEVDVCwgICAvKiB0cnkgdG8gZGV0ZWN0IGhhc2ggZnVuY3Rpb24gb24gbW91bnQgKi8KKwlGT1JDRV9URUFfSEFTSCwJCS8qIHRyeSB0byBmb3JjZSB0ZWEgaGFzaCBvbiBtb3VudCAqLworCUZPUkNFX1JVUEFTT1ZfSEFTSCwJLyogdHJ5IHRvIGZvcmNlIHJ1cGFzb3YgaGFzaCBvbiBtb3VudCAqLworCUZPUkNFX1I1X0hBU0gsCQkvKiB0cnkgdG8gZm9yY2UgcnVwYXNvdiBoYXNoIG9uIG1vdW50ICovCisJRk9SQ0VfSEFTSF9ERVRFQ1QsCS8qIHRyeSB0byBkZXRlY3QgaGFzaCBmdW5jdGlvbiBvbiBtb3VudCAqLwogCi0gICAgUkVJU0VSRlNfREFUQV9MT0csCi0gICAgUkVJU0VSRlNfREFUQV9PUkRFUkVELAotICAgIFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLLAorCVJFSVNFUkZTX0RBVEFfTE9HLAorCVJFSVNFUkZTX0RBVEFfT1JERVJFRCwKKwlSRUlTRVJGU19EQVRBX1dSSVRFQkFDSywKIAogLyogdXNlZCBmb3IgdGVzdGluZyBleHBlcmltZW50YWwgZmVhdHVyZXMsIG1ha2VzIGJlbmNobWFya2luZyBuZXcKICAgIGZlYXR1cmVzIHdpdGggYW5kIHdpdGhvdXQgbW9yZSBjb252ZW5pZW50LCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBieQogICAgdXNlcnMgaW4gYW55IGNvZGUgc2hpcHBlZCB0byB1c2VycyAoaWRlYWxseSkgKi8KIAotICAgIFJFSVNFUkZTX05PX0JPUkRFUiwKLSAgICBSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OLAotICAgIFJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OLAotICAgIFJFSVNFUkZTX0FUVFJTLAotICAgIFJFSVNFUkZTX1hBVFRSUywKLSAgICBSRUlTRVJGU19YQVRUUlNfVVNFUiwKLSAgICBSRUlTRVJGU19QT1NJWEFDTCwKLSAgICBSRUlTRVJGU19CQVJSSUVSX05PTkUsCi0gICAgUkVJU0VSRlNfQkFSUklFUl9GTFVTSCwKKwlSRUlTRVJGU19OT19CT1JERVIsCisJUkVJU0VSRlNfTk9fVU5IQVNIRURfUkVMT0NBVElPTiwKKwlSRUlTRVJGU19IQVNIRURfUkVMT0NBVElPTiwKKwlSRUlTRVJGU19BVFRSUywKKwlSRUlTRVJGU19YQVRUUlMsCisJUkVJU0VSRlNfWEFUVFJTX1VTRVIsCisJUkVJU0VSRlNfUE9TSVhBQ0wsCisJUkVJU0VSRlNfQkFSUklFUl9OT05FLAorCVJFSVNFUkZTX0JBUlJJRVJfRkxVU0gsCiAKLSAgICAvKiBBY3Rpb25zIG9uIGVycm9yICovCi0gICAgUkVJU0VSRlNfRVJST1JfUEFOSUMsCi0gICAgUkVJU0VSRlNfRVJST1JfUk8sCi0gICAgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUsCisJLyogQWN0aW9ucyBvbiBlcnJvciAqLworCVJFSVNFUkZTX0VSUk9SX1BBTklDLAorCVJFSVNFUkZTX0VSUk9SX1JPLAorCVJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFLAogCi0gICAgUkVJU0VSRlNfUVVPVEEsCQkvKiBTb21lIHF1b3RhIG9wdGlvbiBzcGVjaWZpZWQgKi8KKwlSRUlTRVJGU19RVU9UQSwJCS8qIFNvbWUgcXVvdGEgb3B0aW9uIHNwZWNpZmllZCAqLwogCi0gICAgUkVJU0VSRlNfVEVTVDEsCi0gICAgUkVJU0VSRlNfVEVTVDIsCi0gICAgUkVJU0VSRlNfVEVTVDMsCi0gICAgUkVJU0VSRlNfVEVTVDQsCi0gICAgUkVJU0VSRlNfVU5TVVBQT1JURURfT1BULAorCVJFSVNFUkZTX1RFU1QxLAorCVJFSVNFUkZTX1RFU1QyLAorCVJFSVNFUkZTX1RFU1QzLAorCVJFSVNFUkZTX1RFU1Q0LAorCVJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVCwKIH07CiAKICNkZWZpbmUgcmVpc2VyZnNfcjVfaGFzaChzKSAoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICYgKDEgPDwgRk9SQ0VfUjVfSEFTSCkpCkBAIC01MDQsMTggKzUwMCwxNyBAQAogI2RlZmluZSByZWlzZXJmc19lcnJvcl9wYW5pYyhzKSAoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICYgKDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMpKQogI2RlZmluZSByZWlzZXJmc19lcnJvcl9ybyhzKSAoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICYgKDEgPDwgUkVJU0VSRlNfRVJST1JfUk8pKQogCi12b2lkIHJlaXNlcmZzX2ZpbGVfYnVmZmVyIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGxpc3QpOwordm9pZCByZWlzZXJmc19maWxlX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgbGlzdCk7CiBleHRlcm4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcmVpc2VyZnNfZnNfdHlwZTsKLWludCByZWlzZXJmc19yZXNpemUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpIDsKK2ludCByZWlzZXJmc19yZXNpemUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogCiAjZGVmaW5lIENBUlJZX09OICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgU0NIRURVTEVfT0NDVVJSRUQgICAgICAgMQogCi0KICNkZWZpbmUgU0JfQlVGRkVSX1dJVEhfU0IocykgKFJFSVNFUkZTX1NCKHMpLT5zX3NiaCkKICNkZWZpbmUgU0JfSk9VUk5BTChzKSAoUkVJU0VSRlNfU0IocyktPnNfam91cm5hbCkKICNkZWZpbmUgU0JfSk9VUk5BTF8xc3RfUkVTRVJWRURfQkxPQ0socykgKFNCX0pPVVJOQUwocyktPmpfMXN0X3Jlc2VydmVkX2Jsb2NrKQotI2RlZmluZSBTQl9KT1VSTkFMX0xFTl9GUkVFKHMpIChTQl9KT1VSTkFMKHMpLT5qX2pvdXJuYWxfbGVuX2ZyZWUpIAorI2RlZmluZSBTQl9KT1VSTkFMX0xFTl9GUkVFKHMpIChTQl9KT1VSTkFMKHMpLT5qX2pvdXJuYWxfbGVuX2ZyZWUpCiAjZGVmaW5lIFNCX0FQX0JJVE1BUChzKSAoUkVJU0VSRlNfU0IocyktPnNfYXBfYml0bWFwKQogCiAjZGVmaW5lIFNCX0RJU0tfSk9VUk5BTF9IRUFEKHMpIChTQl9KT1VSTkFMKHMpLT5qX2hlYWRlcl9iaC0+KQpAQCAtNTI1LDEzICs1MjAsMTQgQEAKICAqLwogc3RhdGljIGlubGluZSBjaGFyICpyZWlzZXJmc19iZGV2bmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgICAgIHJldHVybiAocyA9PSBOVUxMKSA/ICJOdWxsIHN1cGVyYmxvY2siIDogcyAtPiBzX2lkOworCXJldHVybiAocyA9PSBOVUxMKSA/ICJOdWxsIHN1cGVyYmxvY2siIDogcy0+c19pZDsKIH0KIAogI2RlZmluZSByZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkgKHVubGlrZWx5IChfX3JlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpKQotc3RhdGljIGlubGluZSBpbnQgX19yZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQgKHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsKQorc3RhdGljIGlubGluZSBpbnQgX19yZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwKKwkJCQkJCSpqb3VybmFsKQogewotICAgIHJldHVybiB0ZXN0X2JpdCAoSl9BQk9SVEVELCAmam91cm5hbC0+al9zdGF0ZSk7CisJcmV0dXJuIHRlc3RfYml0KEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOwogfQogCi0jZW5kaWYJLyogX0xJTlVYX1JFSVNFUl9GU19TQiAqLworI2VuZGlmCQkJCS8qIF9MSU5VWF9SRUlTRVJfRlNfU0IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaAppbmRleCA5MjQ0YzU3Li5jODQzNTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX3hhdHRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oCkBAIC03LDQ4ICs3LDQ4IEBACiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KIAogLyogTWFnaWMgdmFsdWUgaW4gaGVhZGVyICovCi0jZGVmaW5lIFJFSVNFUkZTX1hBVFRSX01BR0lDIDB4NTI0NjU4NDEgLyogIlJGWEEiICovCisjZGVmaW5lIFJFSVNFUkZTX1hBVFRSX01BR0lDIDB4NTI0NjU4NDEJLyogIlJGWEEiICovCiAKIHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgewotICAgIF9fbGUzMiBoX21hZ2ljOyAgICAgICAgICAgICAgLyogbWFnaWMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqLwotICAgIF9fbGUzMiBoX2hhc2g7ICAgICAgICAgICAgICAgLyogaGFzaCBvZiB0aGUgdmFsdWUgKi8KKwlfX2xlMzIgaF9tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KKwlfX2xlMzIgaF9oYXNoOwkJLyogaGFzaCBvZiB0aGUgdmFsdWUgKi8KIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHsKIAljaGFyICpwcmVmaXg7Ci0gICAgICAgIGludCAoKmluaXQpKHZvaWQpOwotICAgICAgICB2b2lkICgqZXhpdCkodm9pZCk7Ci0JaW50ICgqZ2V0KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsCi0JCSAgIHNpemVfdCBzaXplKTsKLQlpbnQgKCpzZXQpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLQkJICAgc2l6ZV90IHNpemUsIGludCBmbGFncyk7Ci0JaW50ICgqZGVsKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKTsKLSAgICAgICAgaW50ICgqbGlzdCkoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCk7Ci0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgaGFuZGxlcnM7CisJaW50ICgqaW5pdCkgKHZvaWQpOworCXZvaWQgKCpleGl0KSAodm9pZCk7CisJaW50ICgqZ2V0KSAoc3RydWN0IGlub2RlICogaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgIHNpemVfdCBzaXplKTsKKwlpbnQgKCpzZXQpIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorCQkgICAgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CisJaW50ICgqZGVsKSAoc3RydWN0IGlub2RlICogaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpOworCWludCAoKmxpc3QpIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCSAgICAgY2hhciAqb3V0KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhhbmRsZXJzOwogfTsKIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSCiAjZGVmaW5lIGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSBJU19QUklWQVRFKGlub2RlKQogI2RlZmluZSBoYXNfeGF0dHJfZGlyKGlub2RlKSAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2hhc194YXR0cl9kaXIpCi1zc2l6ZV90IHJlaXNlcmZzX2dldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWludCByZWlzZXJmc19zZXR4YXR0ciAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7Ci1zc2l6ZV90IHJlaXNlcmZzX2xpc3R4YXR0ciAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWludCByZWlzZXJmc19yZW1vdmV4YXR0ciAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKTsKLWludCByZWlzZXJmc19kZWxldGVfeGF0dHJzIChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLWludCByZWlzZXJmc19jaG93bl94YXR0cnMgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cnMpOwotaW50IHJlaXNlcmZzX3hhdHRyX2luaXQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb3VudF9mbGFncyk7Ci1pbnQgcmVpc2VyZnNfcGVybWlzc2lvbiAoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKLWludCByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZCAoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3NzaXplX3QgcmVpc2VyZnNfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKK2ludCByZWlzZXJmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKK3NzaXplX3QgcmVpc2VyZnNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CitpbnQgcmVpc2VyZnNfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCByZWlzZXJmc19kZWxldGVfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IHJlaXNlcmZzX2Nob3duX3hhdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaWF0dHIgKmF0dHJzKTsKK2ludCByZWlzZXJmc194YXR0cl9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb3VudF9mbGFncyk7CitpbnQgcmVpc2VyZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworaW50IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLAorCQkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKIAotaW50IHJlaXNlcmZzX3hhdHRyX2RlbCAoc3RydWN0IGlub2RlICosIGNvbnN0IGNoYXIgKik7Ci1pbnQgcmVpc2VyZnNfeGF0dHJfZ2V0IChjb25zdCBzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7Ci1pbnQgcmVpc2VyZnNfeGF0dHJfc2V0IChzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90LCBpbnQpOworaW50IHJlaXNlcmZzX3hhdHRyX2RlbChzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqKTsKK2ludCByZWlzZXJmc194YXR0cl9nZXQoY29uc3Qgc3RydWN0IGlub2RlICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworaW50IHJlaXNlcmZzX3hhdHRyX3NldChzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKIAogZXh0ZXJuIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHVzZXJfaGFuZGxlcjsKIGV4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciB0cnVzdGVkX2hhbmRsZXI7CkBAIC01Niw1NyArNTYsNDggQEAKIGV4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBzZWN1cml0eV9oYW5kbGVyOwogI2VuZGlmCiAKLWludCByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycyAodm9pZCkgX19pbml0Owotdm9pZCByZWlzZXJmc194YXR0cl91bnJlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKTsKK2ludCByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKSBfX2luaXQ7Cit2b2lkIHJlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnModm9pZCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotICAgIGRvd25fd3JpdGUgKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CisJZG93bl93cml0ZSgmUkVJU0VSRlNfWEFUVFJfRElSX1NFTShzYikpOwogfQotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotICAgIHVwX3dyaXRlICgmUkVJU0VSRlNfWEFUVFJfRElSX1NFTShzYikpOworCXVwX3dyaXRlKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0gICAgZG93bl9yZWFkICgmUkVJU0VSRlNfWEFUVFJfRElSX1NFTShzYikpOworCWRvd25fcmVhZCgmUkVJU0VSRlNfWEFUVFJfRElSX1NFTShzYikpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotICAgIHVwX3JlYWQgKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CisJdXBfcmVhZCgmUkVJU0VSRlNfWEFUVFJfRElSX1NFTShzYikpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIGRvd25fd3JpdGUgKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlkb3duX3dyaXRlKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2koc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHVwX3dyaXRlICgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7CisJdXBfd3JpdGUoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOwogfQotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgZG93bl9yZWFkICgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7CisJZG93bl9yZWFkKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHVwX3JlYWQgKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwl1cF9yZWFkKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBpbm9kZS0+aV9mbGFncyB8PSBTX1BSSVZBVEU7CisJaW5vZGUtPmlfZmxhZ3MgfD0gU19QUklWQVRFOwogfQogCiAjZWxzZQpAQCAtMTI3LDEzICsxMTgsMjAgQEAKICNkZWZpbmUgcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnMoKSAwCiAjZGVmaW5lIHJlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnMoKQogCi1zdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19kZWxldGVfeGF0dHJzIChzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7IHJldHVybiAwOyB9Owotc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfY2hvd25feGF0dHJzIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaWF0dHIgKmF0dHJzKSB7IHJldHVybiAwOyB9Owotc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfeGF0dHJfaW5pdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vdW50X2ZsYWdzKQorc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfZGVsZXRlX3hhdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKTsgLyogdG8gYmUgc3VyZSAqLwotICAgIHJldHVybiAwOworCXJldHVybiAwOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX2Nob3duX3hhdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3QgaWF0dHIgKmF0dHJzKQoreworCXJldHVybiAwOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX3hhdHRyX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vdW50X2ZsYWdzKQoreworCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKTsJLyogdG8gYmUgc3VyZSAqLworCXJldHVybiAwOwogfTsKICNlbmRpZgogCi0jZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggZmY0ODgxNS4uZGVjNTgyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtNDEwLDYgKzQxMCwxMCBAQAogCWF0b21pY190IHByb2Nlc3NlczsJLyogSG93IG1hbnkgcHJvY2Vzc2VzIGRvZXMgdGhpcyB1c2VyIGhhdmU/ICovCiAJYXRvbWljX3QgZmlsZXM7CQkvKiBIb3cgbWFueSBvcGVuIGZpbGVzIGRvZXMgdGhpcyB1c2VyIGhhdmU/ICovCiAJYXRvbWljX3Qgc2lncGVuZGluZzsJLyogSG93IG1hbnkgcGVuZGluZyBzaWduYWxzIGRvZXMgdGhpcyB1c2VyIGhhdmU/ICovCisjaWZkZWYgQ09ORklHX0lOT1RJRlkKKwlhdG9taWNfdCBpbm90aWZ5X3dhdGNoZXM7IC8qIEhvdyBtYW55IGlub3RpZnkgd2F0Y2hlcyBkb2VzIHRoaXMgdXNlciBoYXZlPyAqLworCWF0b21pY190IGlub3RpZnlfZGV2czsJLyogSG93IG1hbnkgaW5vdGlmeSBkZXZzIGRvZXMgdGhpcyB1c2VyIGhhdmUgb3BlbmVkPyAqLworI2VuZGlmCiAJLyogcHJvdGVjdGVkIGJ5IG1xX2xvY2sJKi8KIAl1bnNpZ25lZCBsb25nIG1xX2J5dGVzOwkvKiBIb3cgbWFueSBieXRlcyBjYW4gYmUgYWxsb2NhdGVkIHRvIG1xdWV1ZT8gKi8KIAl1bnNpZ25lZCBsb25nIGxvY2tlZF9zaG07IC8qIEhvdyBtYW55IHBhZ2VzIG9mIG1sb2NrZWQgc2htID8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2tidWZmLmggYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCmluZGV4IDQxNmEyZTQuLjVkNGE5OTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmgKKysrIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaApAQCAtMTgzLDcgKzE4Myw2IEBACiAgKglAcHJpb3JpdHk6IFBhY2tldCBxdWV1ZWluZyBwcmlvcml0eQogICoJQHVzZXJzOiBVc2VyIGNvdW50IC0gc2VlIHtkYXRhZ3JhbSx0Y3B9LmMKICAqCUBwcm90b2NvbDogUGFja2V0IHByb3RvY29sIGZyb20gZHJpdmVyCi0gKglAc2VjdXJpdHk6IFNlY3VyaXR5IGxldmVsIG9mIHBhY2tldAogICoJQHRydWVzaXplOiBCdWZmZXIgc2l6ZSAKICAqCUBoZWFkOiBIZWFkIG9mIGJ1ZmZlcgogICoJQGRhdGE6IERhdGEgaGVhZCBwb2ludGVyCkBAIC0yNDksMTggKzI0OCwxOCBAQAogCQkJCWRhdGFfbGVuLAogCQkJCW1hY19sZW4sCiAJCQkJY3N1bTsKLQl1bnNpZ25lZCBjaGFyCQlsb2NhbF9kZiwKLQkJCQljbG9uZWQ6MSwKLQkJCQlub2hkcjoxLAotCQkJCXBrdF90eXBlLAotCQkJCWlwX3N1bW1lZDsKIAlfX3UzMgkJCXByaW9yaXR5OwotCXVuc2lnbmVkIHNob3J0CQlwcm90b2NvbCwKLQkJCQlzZWN1cml0eTsKKwlfX3U4CQkJbG9jYWxfZGY6MSwKKwkJCQljbG9uZWQ6MSwKKwkJCQlpcF9zdW1tZWQ6MiwKKwkJCQlub2hkcjoxOworCQkJCS8qIDMgYml0cyBzcGFyZSAqLworCV9fdTgJCQlwa3RfdHlwZTsKKwlfX3UxNgkJCXByb3RvY29sOwogCiAJdm9pZAkJCSgqZGVzdHJ1Y3Rvcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUgotICAgICAgICB1bnNpZ25lZCBsb25nCQluZm1hcms7CisJdW5zaWduZWQgbG9uZwkJbmZtYXJrOwogCV9fdTMyCQkJbmZjYWNoZTsKIAlfX3UzMgkJCW5mY3RpbmZvOwogCXN0cnVjdCBuZl9jb25udHJhY2sJKm5mY3Q7CkBAIC0zMDEsMjAgKzMwMCwyNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogZXh0ZXJuIHZvaWQJICAgICAgIF9fa2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICphbGxvY19za2IodW5zaWduZWQgaW50IHNpemUsIGludCBwcmlvcml0eSk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmFsbG9jX3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiX2Zyb21fY2FjaGUoa21lbV9jYWNoZV90ICpjcCwKLQkJCQkJICAgIHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHJpb3JpdHkpOworCQkJCQkgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOwogZXh0ZXJuIHZvaWQJICAgICAgIGtmcmVlX3NrYm1lbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2Nsb25lKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcmlvcml0eSk7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBwcmlvcml0eSk7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBza2JfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwX21hc2spOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfY2xvbmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpwc2tiX2NvcHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKTsKIGV4dGVybiBpbnQJICAgICAgIHBza2JfZXhwYW5kX2hlYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJaW50IG5oZWFkLCBpbnQgbnRhaWwsIGludCBnZnBfbWFzayk7CisJCQkJCWludCBuaGVhZCwgaW50IG50YWlsLAorCQkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spOwogZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfcmVhbGxvY19oZWFkcm9vbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICAgdW5zaWduZWQgaW50IGhlYWRyb29tKTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHlfZXhwYW5kKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgIGludCBuZXdoZWFkcm9vbSwgaW50IG5ld3RhaWxyb29tLAotCQkJCSAgICAgICBpbnQgcHJpb3JpdHkpOworCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOwogZXh0ZXJuIHN0cnVjdCBza19idWZmICoJCXNrYl9wYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBhZCk7CiAjZGVmaW5lIGRldl9rZnJlZV9za2IoYSkJa2ZyZWVfc2tiKGEpCiBleHRlcm4gdm9pZAkgICAgICBza2Jfb3Zlcl9wYW5pYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuLApAQCAtNDY1LDcgKzQ3MCw4IEBACiAgKgogICoJTlVMTCBpcyByZXR1cm5lZCBvbiBhIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnNrYl9zaGFyZV9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcHJpKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3NoYXJlX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmkpCiB7CiAJbWlnaHRfc2xlZXBfaWYocHJpICYgX19HRlBfV0FJVCk7CiAJaWYgKHNrYl9zaGFyZWQoc2tiKSkgewpAQCAtMTAwMiw3ICsxMDA4LDcgQEAKICAqCSVOVUxMIGlzIHJldHVybmVkIGluIHRoZXJlIGlzIG5vIGZyZWUgbWVtb3J5LgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpfX2Rldl9hbGxvY19za2IodW5zaWduZWQgaW50IGxlbmd0aCwKLQkJCQkJICAgICAgaW50IGdmcF9tYXNrKQorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihsZW5ndGggKyAxNiwgZ2ZwX21hc2spOwogCWlmIChsaWtlbHkoc2tiKSkKQEAgLTExMTUsOCArMTEyMSw4IEBACiAgKglJZiB0aGVyZSBpcyBubyBmcmVlIG1lbW9yeSAtRU5PTUVNIGlzIHJldHVybmVkLCBvdGhlcndpc2UgemVybwogICoJaXMgcmV0dXJuZWQgYW5kIHRoZSBvbGQgc2tiIGRhdGEgcmVsZWFzZWQuCiAgKi8KLWV4dGVybiBpbnQgX19za2JfbGluZWFyaXplKHN0cnVjdCBza19idWZmICpza2IsIGludCBnZnApOwotc3RhdGljIGlubGluZSBpbnQgc2tiX2xpbmVhcml6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwKQorZXh0ZXJuIGludCBfX3NrYl9saW5lYXJpemUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CitzdGF0aWMgaW5saW5lIGludCBza2JfbGluZWFyaXplKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJcmV0dXJuIF9fc2tiX2xpbmVhcml6ZShza2IsIGdmcCk7CiB9CkBAIC0xMjExLDcgKzEyMTcsNyBAQAogewogCWludCBobGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKIAotCWlmIChvZmZzZXQgKyBsZW4gPD0gaGxlbikKKwlpZiAoaGxlbiAtIG9mZnNldCA+PSBsZW4pCiAJCXJldHVybiBza2ItPmRhdGEgKyBvZmZzZXQ7CiAKIAlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgYnVmZmVyLCBsZW4pIDwgMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggNzZjZjdlNi4uNGM4ZTU1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTY1LDcgKzY1LDcgQEAKIGV4dGVybiB2b2lkIGttZW1fY2FjaGVfZnJlZShrbWVtX2NhY2hlX3QgKiwgdm9pZCAqKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQga21lbV9jYWNoZV9zaXplKGttZW1fY2FjaGVfdCAqKTsKIGV4dGVybiBjb25zdCBjaGFyICprbWVtX2NhY2hlX25hbWUoa21lbV9jYWNoZV90ICopOwotZXh0ZXJuIGttZW1fY2FjaGVfdCAqa21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLCBpbnQgZ2ZwZmxhZ3MpOworZXh0ZXJuIGttZW1fY2FjaGVfdCAqa21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwZmxhZ3MpOwogCiAvKiBTaXplIGRlc2NyaXB0aW9uIHN0cnVjdCBmb3IgZ2VuZXJhbCBjYWNoZXMuICovCiBzdHJ1Y3QgY2FjaGVfc2l6ZXMgewpAQCAtMTA1LDcgKzEwNSw3IEBACiAKICNpZmRlZiBDT05GSUdfTlVNQQogZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShrbWVtX2NhY2hlX3QgKiwgaW50IGZsYWdzLCBpbnQgbm9kZSk7Ci1leHRlcm4gdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsIGludCBub2RlKTsKK2V4dGVybiB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncywgaW50IG5vZGUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBpbnQgZmxhZ3MsIGludCBub2RlKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdHJpbmcuaCBiL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKaW5kZXggOTM5OTRjNi4uZGFiMjY1MmFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKQEAgLTg4LDcgKzg4LDcgQEAKIGV4dGVybiB2b2lkICogbWVtY2hyKGNvbnN0IHZvaWQgKixpbnQsX19rZXJuZWxfc2l6ZV90KTsKICNlbmRpZgogCi1leHRlcm4gY2hhciAqa3N0cmR1cChjb25zdCBjaGFyICpzLCBpbnQgZ2ZwKTsKK2V4dGVybiBjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggMjM0M2Y5OS4uMjM5ZjUyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTcsNiArNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKQEAgLTE0OCw3ICsxNTAsNyBAQAogI2RlZmluZSB2bV9zd2FwX2Z1bGwoKSAobnJfc3dhcF9wYWdlcyoyIDwgdG90YWxfc3dhcF9wYWdlcykKIAogLyogbGludXgvbW0vb29tX2tpbGwuYyAqLwotZXh0ZXJuIHZvaWQgb3V0X29mX21lbW9yeSh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spOworZXh0ZXJuIHZvaWQgb3V0X29mX21lbW9yeSh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2ssIGludCBvcmRlcik7CiAKIC8qIGxpbnV4L21tL21lbW9yeS5jICovCiBleHRlcm4gdm9pZCBzd2FwaW5fcmVhZGFoZWFkKHN3cF9lbnRyeV90LCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKaW5kZXggNTI4MzBiNi4uNDI1ZjU4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaApAQCAtNTA2LDQgKzUwNiw3IEBACiBhc21saW5rYWdlIGxvbmcgc3lzX2tleWN0bChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMywKIAkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnNCwgdW5zaWduZWQgbG9uZyBhcmc1KTsKIAorYXNtbGlua2FnZSBsb25nIHN5c19pb3ByaW9fc2V0KGludCB3aGljaCwgaW50IHdobywgaW50IGlvcHJpbyk7Cithc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19nZXQoaW50IHdoaWNoLCBpbnQgd2hvKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCA1YjVmNDM0Li5iZmJiZTk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTcwLDYgKzcwLDE0IEBACiAJQ1RMX0JVU19JU0E9MQkJLyogSVNBICovCiB9OwogCisvKiAvcHJvYy9zeXMvZnMvaW5vdGlmeS8gKi8KK2VudW0KK3sKKwlJTk9USUZZX01BWF9VU0VSX0lOU1RBTkNFUz0xLAkvKiBtYXggaW5zdGFuY2VzIHBlciB1c2VyICovCisJSU5PVElGWV9NQVhfVVNFUl9XQVRDSEVTPTIsCS8qIG1heCB3YXRjaGVzIHBlciB1c2VyICovCisJSU5PVElGWV9NQVhfUVVFVUVEX0VWRU5UUz0zCS8qIG1heCBxdWV1ZWQgZXZlbnRzIHBlciBpbnN0YW5jZSAqLworfTsKKwogLyogQ1RMX0tFUk4gbmFtZXM6ICovCiBlbnVtCiB7CkBAIC02NzYsNiArNjg0LDcgQEAKIAlGU19YRlM9MTcsCS8qIHN0cnVjdDogY29udHJvbCB4ZnMgcGFyYW1ldGVycyAqLwogCUZTX0FJT19OUj0xOCwJLyogY3VycmVudCBzeXN0ZW0td2lkZSBudW1iZXIgb2YgYWlvIHJlcXVlc3RzICovCiAJRlNfQUlPX01BWF9OUj0xOSwJLyogc3lzdGVtLXdpZGUgbWF4aW11bSBudW1iZXIgb2YgYWlvIHJlcXVlc3RzICovCisJRlNfSU5PVElGWT0yMCwJLyogaW5vdGlmeSBzdWJtZW51ICovCiB9OwogCiAvKiAvcHJvYy9zeXMvZnMvcXVvdGEvICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmggYi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmgKaW5kZXggYTZiMmNjNS4uYmNiNzYyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaApAQCAtNDUsNyArNDUsNyBAQAogCVRDRl9NRVRBX0lEX1JFQUxERVYsCiAJVENGX01FVEFfSURfUFJJT1JJVFksCiAJVENGX01FVEFfSURfUFJPVE9DT0wsCi0JVENGX01FVEFfSURfU0VDVVJJVFksCisJVENGX01FVEFfSURfU0VDVVJJVFksIC8qIG9ic29sZXRlICovCiAJVENGX01FVEFfSURfUEtUVFlQRSwKIAlUQ0ZfTUVUQV9JRF9QS1RMRU4sCiAJVENGX01FVEFfSURfREFUQUxFTiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGNwLmggYi9pbmNsdWRlL2xpbnV4L3RjcC5oCmluZGV4IGRmZDkzZDAuLmU0ZmQ4MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC90Y3AuaApAQCAtMjg2LDcgKzI4Niw3IEBACiAJX191MzIJbWF4X3dpbmRvdzsJLyogTWF4aW1hbCB3aW5kb3cgZXZlciBzZWVuIGZyb20gcGVlcgkqLwogCV9fdTMyCXBtdHVfY29va2llOwkvKiBMYXN0IHBtdHUgc2VlbiBieSBzb2NrZXQJCSovCiAJX191MzIJbXNzX2NhY2hlOwkvKiBDYWNoZWQgZWZmZWN0aXZlIG1zcywgbm90IGluY2x1ZGluZyBTQUNLUyAqLwotCV9fdTE2CW1zc19jYWNoZV9zdGQ7CS8qIExpa2UgbXNzX2NhY2hlLCBidXQgd2l0aG91dCBUU08gKi8KKwlfX3UxNgl4bWl0X3NpemVfZ29hbDsJLyogR29hbCBmb3Igc2VnbWVudGluZyBvdXRwdXQgcGFja2V0cwkqLwogCV9fdTE2CWV4dF9oZWFkZXJfbGVuOwkvKiBOZXR3b3JrIHByb3RvY29sIG92ZXJoZWFkIChJUC9JUHY2IG9wdGlvbnMpICovCiAJX191OAljYV9zdGF0ZTsJLyogU3RhdGUgb2YgZmFzdC1yZXRyYW5zbWl0IG1hY2hpbmUgCSovCiAJX191OAlyZXRyYW5zbWl0czsJLyogTnVtYmVyIG9mIHVucmVjb3ZlcmVkIFJUTyB0aW1lb3V0cy4JKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi5oCmluZGV4IGViMjgyYjUuLjcyNDYzNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IuaApAQCAtOTM4LDE3ICs5MzgsMTcgQEAKIH0KIAogZXh0ZXJuIHZvaWQgdXNiX2luaXRfdXJiKHN0cnVjdCB1cmIgKnVyYik7Ci1leHRlcm4gc3RydWN0IHVyYiAqdXNiX2FsbG9jX3VyYihpbnQgaXNvX3BhY2tldHMsIGludCBtZW1fZmxhZ3MpOworZXh0ZXJuIHN0cnVjdCB1cmIgKnVzYl9hbGxvY191cmIoaW50IGlzb19wYWNrZXRzLCB1bnNpZ25lZCBtZW1fZmxhZ3MpOwogZXh0ZXJuIHZvaWQgdXNiX2ZyZWVfdXJiKHN0cnVjdCB1cmIgKnVyYik7CiAjZGVmaW5lIHVzYl9wdXRfdXJiIHVzYl9mcmVlX3VyYgogZXh0ZXJuIHN0cnVjdCB1cmIgKnVzYl9nZXRfdXJiKHN0cnVjdCB1cmIgKnVyYik7Ci1leHRlcm4gaW50IHVzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncyk7CitleHRlcm4gaW50IHVzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgdW5zaWduZWQgbWVtX2ZsYWdzKTsKIGV4dGVybiBpbnQgdXNiX3VubGlua191cmIoc3RydWN0IHVyYiAqdXJiKTsKIGV4dGVybiB2b2lkIHVzYl9raWxsX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogCiAjZGVmaW5lIEhBVkVfVVNCX0JVRkZFUlMKIHZvaWQgKnVzYl9idWZmZXJfYWxsb2MgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCWludCBtZW1fZmxhZ3MsIGRtYV9hZGRyX3QgKmRtYSk7CisJdW5zaWduZWQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpOwogdm9pZCB1c2JfYnVmZmVyX2ZyZWUgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAogCXZvaWQgKmFkZHIsIGRtYV9hZGRyX3QgZG1hKTsKIApAQCAtMTA1NSw3ICsxMDU1LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnLAogCWludAkJCW5lbnRzLAogCXNpemVfdAkJCWxlbmd0aCwKLQlpbnQJCQltZW1fZmxhZ3MKKwl1bnNpZ25lZAkJbWVtX2ZsYWdzCiApOwogdm9pZCB1c2Jfc2dfY2FuY2VsIChzdHJ1Y3QgdXNiX3NnX3JlcXVlc3QgKmlvKTsKIHZvaWQgdXNiX3NnX3dhaXQgKHN0cnVjdCB1c2Jfc2dfcmVxdWVzdCAqaW8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfY2RjLmggYi9pbmNsdWRlL2xpbnV4L3VzYl9jZGMuaAppbmRleCBmMjJkNmJlLi5iYTYxN2MzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl9jZGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl9jZGMuaApAQCAtMzQsNiArMzQsNyBAQAogI2RlZmluZSBVU0JfQ0RDX0FDTV9UWVBFCQkweDAyCQkvKiBhY21fZGVzY3JpcHRvciAqLwogI2RlZmluZSBVU0JfQ0RDX1VOSU9OX1RZUEUJCTB4MDYJCS8qIHVuaW9uX2Rlc2MgKi8KICNkZWZpbmUgVVNCX0NEQ19DT1VOVFJZX1RZUEUJCTB4MDcKKyNkZWZpbmUgVVNCX0NEQ19ORVRXT1JLX1RFUk1JTkFMX1RZUEUJMHgwYQkJLyogbmV0d29ya190ZXJtaW5hbF9kZXNjICovCiAjZGVmaW5lIFVTQl9DRENfRVRIRVJORVRfVFlQRQkJMHgwZgkJLyogZXRoZXJfZGVzYyAqLwogI2RlZmluZSBVU0JfQ0RDX1dIQ01fVFlQRQkJMHgxMQogI2RlZmluZSBVU0JfQ0RDX01ETE1fVFlQRQkJMHgxMgkJLyogbWRsbV9kZXNjICovCkBAIC04Myw2ICs4NCwxOCBAQAogCS8qIC4uLiBhbmQgdGhlcmUgY291bGQgYmUgb3RoZXIgc2xhdmUgaW50ZXJmYWNlcyAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKy8qICJOZXR3b3JrIENoYW5uZWwgVGVybWluYWwgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjIDUuMi4zLjExICovCitzdHJ1Y3QgdXNiX2NkY19uZXR3b3JrX3Rlcm1pbmFsX2Rlc2MgeworCV9fdTgJYkxlbmd0aDsKKwlfX3U4CWJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXNjcmlwdG9yU3ViVHlwZTsKKworCV9fdTgJYkVudGl0eUlkOworCV9fdTgJaU5hbWU7CisJX191OAliQ2hhbm5lbEluZGV4OworCV9fdTgJYlBoeXNpY2FsSW50ZXJmYWNlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKIC8qICJFdGhlcm5ldCBOZXR3b3JraW5nIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgc3BlYyA1LjIuMy4xNiAqLwogc3RydWN0IHVzYl9jZGNfZXRoZXJfZGVzYyB7CiAJX191OAliTGVuZ3RoOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfZ2FkZ2V0LmggYi9pbmNsdWRlL2xpbnV4L3VzYl9nYWRnZXQuaAppbmRleCBiMDBmMTI3Li43MWU2MDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl9nYWRnZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl9nYWRnZXQuaApAQCAtMTA3LDE4ICsxMDcsMTggQEAKIAlpbnQgKCpkaXNhYmxlKSAoc3RydWN0IHVzYl9lcCAqZXApOwogCiAJc3RydWN0IHVzYl9yZXF1ZXN0ICooKmFsbG9jX3JlcXVlc3QpIChzdHJ1Y3QgdXNiX2VwICplcCwKLQkJaW50IGdmcF9mbGFncyk7CisJCXVuc2lnbmVkIGdmcF9mbGFncyk7CiAJdm9pZCAoKmZyZWVfcmVxdWVzdCkgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSk7CiAKIAl2b2lkICooKmFsbG9jX2J1ZmZlcikgKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBieXRlcywKLQkJZG1hX2FkZHJfdCAqZG1hLCBpbnQgZ2ZwX2ZsYWdzKTsKKwkJZG1hX2FkZHJfdCAqZG1hLCB1bnNpZ25lZCBnZnBfZmxhZ3MpOwogCXZvaWQgKCpmcmVlX2J1ZmZlcikgKHN0cnVjdCB1c2JfZXAgKmVwLCB2b2lkICpidWYsIGRtYV9hZGRyX3QgZG1hLAogCQl1bnNpZ25lZCBieXRlcyk7CiAJLy8gTk9URTogIG9uIDIuNiwgZHJpdmVycyBtYXkgYWxzbyB1c2UgZG1hX21hcCgpIGFuZAogCS8vIGRtYV9zeW5jX3NpbmdsZV8qKCkgdG8gZGlyZWN0bHkgbWFuYWdlIGRtYSBvdmVyaGVhZC4gCiAKIAlpbnQgKCpxdWV1ZSkgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwKLQkJaW50IGdmcF9mbGFncyk7CisJCXVuc2lnbmVkIGdmcF9mbGFncyk7CiAJaW50ICgqZGVxdWV1ZSkgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSk7CiAKIAlpbnQgKCpzZXRfaGFsdCkgKHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgdmFsdWUpOwpAQCAtMjE0LDcgKzIxNCw3IEBACiAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0LCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfcmVxdWVzdCAqCi11c2JfZXBfYWxsb2NfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqZXAsIGludCBnZnBfZmxhZ3MpCit1c2JfZXBfYWxsb2NfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlyZXR1cm4gZXAtPm9wcy0+YWxsb2NfcmVxdWVzdCAoZXAsIGdmcF9mbGFncyk7CiB9CkBAIC0yNTQsNyArMjU0LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkICoKIHVzYl9lcF9hbGxvY19idWZmZXIgKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBsZW4sIGRtYV9hZGRyX3QgKmRtYSwKLQlpbnQgZ2ZwX2ZsYWdzKQorCXVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlyZXR1cm4gZXAtPm9wcy0+YWxsb2NfYnVmZmVyIChlcCwgbGVuLCBkbWEsIGdmcF9mbGFncyk7CiB9CkBAIC0zMzAsNyArMzMwLDcgQEAKICAqIHJlcG9ydGVkIHdoZW4gdGhlIHVzYiBwZXJpcGhlcmFsIGlzIGRpc2Nvbm5lY3RlZC4KICAqLwogc3RhdGljIGlubGluZSBpbnQKLXVzYl9lcF9xdWV1ZSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCBpbnQgZ2ZwX2ZsYWdzKQordXNiX2VwX3F1ZXVlIChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlyZXR1cm4gZXAtPm9wcy0+cXVldWUgKGVwLCByZXEsIGdmcF9mbGFncyk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oIGIvaW5jbHVkZS9saW51eC93YW5yb3V0ZXIuaAppbmRleCAzZTg5ZjBmLi4xYjZiNzZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvd2Fucm91dGVyLmgKQEAgLTUxNiw4ICs1MTYsNyBAQAogLyogUHVibGljIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIGRldmljZSBkcml2ZXJzICovCiBleHRlcm4gaW50IHJlZ2lzdGVyX3dhbl9kZXZpY2Uoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfd2FuX2RldmljZShjaGFyICpuYW1lKTsKLXVuc2lnbmVkIHNob3J0IHdhbnJvdXRlcl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworX19iZTE2IHdhbnJvdXRlcl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IHdhbnJvdXRlcl9lbmNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICB1bnNpZ25lZCBzaG9ydCB0eXBlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaCBiL2luY2x1ZGUvbWVkaWEvYXVkaW9jaGlwLmgKaW5kZXggZjM0NWE2MS4uY2Q4MzExNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaAorKysgYi9pbmNsdWRlL21lZGlhL2F1ZGlvY2hpcC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogYXVkaW9jaGlwLmgsdiAxLjMgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgKiAkSWQ6IGF1ZGlvY2hpcC5oLHYgMS41IDIwMDUvMDYvMTYgMjI6NTk6MTYgaGhhY2ttYW5uIEV4cCAkCiAgKi8KIAogI2lmbmRlZiBBVURJT0NISVBfSApAQCAtMzUsNSArMzUsNCBAQAogCiAvKiBtaXNjIHN0dWZmIHRvIHBhc3MgYXJvdW5kIGNvbmZpZyBpbmZvIHRvIGkyYyBjaGlwcyAqLwogI2RlZmluZSBBVURDX0NPTkZJR19QSU5OQUNMRSAgX0lPVygnbScsMzIsaW50KQotCiAjZW5kaWYgLyogQVVESU9DSElQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2FhNjc1MmhzLmggYi9pbmNsdWRlL21lZGlhL3NhYTY3NTJocy5oCmluZGV4IDc5MWJhZDIuLjNiODY4NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2FhNjc1MmhzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zYWE2NzUyaHMuaApAQCAtMTgsNTUgKzE4LDYgQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKLSNpZiAwIC8qIG5kZWYgX1NBQTY3NTJIU19IICovCi0jZGVmaW5lIF9TQUE2NzUySFNfSAotCi1lbnVtIG1wZWdfdmlkZW9fYml0cmF0ZV9tb2RlIHsKLQlNUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIgPSAwLCAvKiBWYXJpYWJsZSBiaXRyYXRlICovCi0JTVBFR19WSURFT19CSVRSQVRFX01PREVfQ0JSID0gMSwgLyogQ29uc3RhbnQgYml0cmF0ZSAqLwotCi0JTVBFR19WSURFT19CSVRSQVRFX01PREVfTUFYCi19OwotCi1lbnVtIG1wZWdfYXVkaW9fYml0cmF0ZSB7Ci0JTVBFR19BVURJT19CSVRSQVRFXzI1NiA9IDAsIC8qIDI1NiBrQml0L3NlYyAqLwotCU1QRUdfQVVESU9fQklUUkFURV8zODQgPSAxLCAvKiAzODQga0JpdC9zZWMgKi8KLQotCU1QRUdfQVVESU9fQklUUkFURV9NQVgKLX07Ci0KLWVudW0gbXBlZ192aWRlb19mb3JtYXQgewotCU1QRUdfVklERU9fRk9STUFUX0QxID0gMCwKLQlNUEVHX1ZJREVPX0ZPUk1BVF8yXzNfRDEgPSAxLAotCU1QRUdfVklERU9fRk9STUFUXzFfMl9EMSA9IDIsCi0JTVBFR19WSURFT19GT1JNQVRfU0lGID0gMywKLQotCU1QRUdfVklERU9fRk9STUFUX01BWAotfTsKLQotI2RlZmluZSBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCAyNzAwMAotI2RlZmluZSBNUEVHX1ZJREVPX01BWF9CSVRSQVRFX01BWCAyNzAwMAotI2RlZmluZSBNUEVHX1RPVEFMX0JJVFJBVEVfTUFYIDI3MDAwCi0jZGVmaW5lIE1QRUdfUElEX01BWCAoKDEgPDwgMTQpIC0gMSkKLQotc3RydWN0IG1wZWdfcGFyYW1zIHsKLQllbnVtIG1wZWdfdmlkZW9fYml0cmF0ZV9tb2RlIHZpZGVvX2JpdHJhdGVfbW9kZTsKLQl1bnNpZ25lZCBpbnQgdmlkZW9fdGFyZ2V0X2JpdHJhdGU7Ci0JdW5zaWduZWQgaW50IHZpZGVvX21heF9iaXRyYXRlOyAvLyBvbmx5IHVzZWQgZm9yIFZCUgotCWVudW0gbXBlZ19hdWRpb19iaXRyYXRlIGF1ZGlvX2JpdHJhdGU7Ci0JdW5zaWduZWQgaW50IHRvdGFsX2JpdHJhdGU7Ci0KLSAgIAl1bnNpZ25lZCBpbnQgcG10X3BpZDsKLQl1bnNpZ25lZCBpbnQgdmlkZW9fcGlkOwotCXVuc2lnbmVkIGludCBhdWRpb19waWQ7Ci0JdW5zaWduZWQgaW50IHBjcl9waWQ7Ci0KLQllbnVtIG1wZWdfdmlkZW9fZm9ybWF0IHZpZGVvX2Zvcm1hdDsKLX07Ci0KLSNkZWZpbmUgTVBFR19TRVRQQVJBTVMgICAgICAgICAgICAgX0lPVygnNicsMTAwLHN0cnVjdCBtcGVnX3BhcmFtcykKLQotI2VuZGlmIC8vIF9TQUE2NzUySFNfSAogCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS90dW5lci5oIGIvaW5jbHVkZS9tZWRpYS90dW5lci5oCmluZGV4IDQ3OTRjNTYuLmQ4YzBhNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKQEAgLTEsNSArMSw1IEBACiAKLS8qICRJZDogdHVuZXIuaCx2IDEuMzMgMjAwNS8wNi8yMSAxNDo1ODowOCBta3J1Zmt5IEV4cCAkCisvKiAkSWQ6IHR1bmVyLmgsdiAxLjQyIDIwMDUvMDcvMDYgMDk6NDI6MTkgbWNoZWhhYiBFeHAgJAogICoKICAgICB0dW5lci5oIC0gZGVmaW5pdGlvbiBmb3IgZGlmZmVyZW50IHR1bmVycwogCkBAIC0yNiw4ICsyNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KIAotI2luY2x1ZGUgImlkLmgiCi0KICNkZWZpbmUgQUREUl9VTlNFVCAoMjU1KQogCiAjZGVmaW5lIFRVTkVSX1RFTUlDX1BBTCAgICAgMCAgICAgICAgLyogNDAwMiBGSDUgKDNYIDc3NTYsIDk0ODMpICovCkBAIC0xMTEsOCArMTA5LDYgQEAKICNkZWZpbmUgVFVORVJfVEVBNTc2NyAgICAgICAgIDYyCS8qIE9ubHkgRk0gUmFkaW8gVHVuZXIgKi8KICNkZWZpbmUgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszIDYzCiAKLSNkZWZpbmUgVEVBNTc2N19UVU5FUl9OQU1FICJQaGlsaXBzIFRFQTU3NjdITiBGTSBSYWRpbyIKLQogI2RlZmluZSBOT1RVTkVSIDAKICNkZWZpbmUgUEFMICAgICAxCS8qIFBBTF9CRyAqLwogI2RlZmluZSBQQUxfSSAgIDIKQEAgLTEzNSwxOSArMTMxLDggQEAKICNkZWZpbmUgVENMICAgICAxMQogI2RlZmluZSBUSE9NU09OIDEyCiAKLWVudW0gdjRsX3JhZGlvX3R1bmVyIHsKLSAgICAgICAgVEVBNTc2N19MT1dfTE9fMzI3NjggICAgPSAwLAotICAgICAgICBURUE1NzY3X0hJR0hfTE9fMzI3NjggICA9IDEsCi0gICAgICAgIFRFQTU3NjdfTE9XX0xPXzEzTUh6ICAgID0gMiwKLSAgICAgICAgVEVBNTc2N19ISUdIX0xPXzEzTUh6ICAgPSAzLAotfTsKLQotCi0jZGVmaW5lIFRVTkVSX1NFVF9UWVBFICAgICAgICAgICAgICAgX0lPVygndCcsMSxpbnQpICAgIC8qIHNldCB0dW5lciB0eXBlICovCi0jZGVmaW5lIFRVTkVSX1NFVF9UVkZSRVEgICAgICAgICAgICAgX0lPVygndCcsMixpbnQpICAgIC8qIHNldCB0diBmcmVxICovCi0jZGVmaW5lIFRVTkVSX1NFVF9UWVBFX0FERFIgICAgICAgICAgX0lPVygnVCcsMyxpbnQpCS8qIHNldCB0dW5lciB0eXBlIGFuZCBJMkMgYWRkciAqLwotCi0jZGVmaW5lICBUREE5ODg3X1NFVF9DT05GSUcgICAgICAgICAgX0lPVygndCcsNSxpbnQpCisjZGVmaW5lIFRVTkVSX1NFVF9UWVBFX0FERFIgICAgICAgICAgX0lPVygnVCcsMyxpbnQpCisjZGVmaW5lIFREQTk4ODdfU0VUX0NPTkZJRyAgICAgICAgICAgX0lPVygndCcsNSxpbnQpCiAKIC8qIHR2IGNhcmQgc3BlY2lmaWMgKi8KICMgZGVmaW5lIFREQTk4ODdfUFJFU0VOVCAgICAgICAgICAgICAoMTw8MCkKQEAgLTE2OSwyNSArMTU0LDM0IEBACiAjZGVmaW5lIEkyQ19BRERSX1REQTgyOTAgICAgICAgIDB4NGIKICNkZWZpbmUgSTJDX0FERFJfVERBODI3NSAgICAgICAgMHg2MQogCi1zdHJ1Y3QgdHVuZXJfYWRkciB7Ci0JZW51bSB2NGwyX3R1bmVyX3R5cGUJdjRsMl90dW5lcjsKLQl1bnNpZ25lZCBpbnQJCXR5cGU7CitlbnVtIHR1bmVyX21vZGUgeworCVRfVU5JTklUSUFMSVpFRCA9IDAsCisJVF9SQURJTwkJPSAxIDw8IFY0TDJfVFVORVJfUkFESU8sCisJVF9BTkFMT0dfVFYgICAgID0gMSA8PCBWNEwyX1RVTkVSX0FOQUxPR19UViwKKwlUX0RJR0lUQUxfVFYgICAgPSAxIDw8IFY0TDJfVFVORVJfRElHSVRBTF9UViwKKwlUX1NUQU5EQlkJPSAxIDw8IDMxCit9OworCitzdHJ1Y3QgdHVuZXJfc2V0dXAgewogCXVuc2lnbmVkIHNob3J0CQlhZGRyOworCXVuc2lnbmVkIGludAkJdHlwZTsKKwl1bnNpZ25lZCBpbnQJCW1vZGVfbWFzazsKIH07CiAKIHN0cnVjdCB0dW5lciB7CiAJLyogZGV2aWNlICovCiAJc3RydWN0IGkyY19jbGllbnQgaTJjOwogCi0JLyogc3RhdGUgKyBjb25maWcgKi8KLQl1bnNpZ25lZCBpbnQgaW5pdGlhbGl6ZWQ7CiAJdW5zaWduZWQgaW50IHR5cGU7ICAgICAgICAgICAgLyogY2hpcCB0eXBlICovCi0JdW5zaWduZWQgaW50IGZyZXE7ICAgICAgICAgICAgLyoga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotCXY0bDJfc3RkX2lkICBzdGQ7Ci0JaW50ICAgICAgICAgIHVzaW5nX3Y0bDI7CiAKLQllbnVtIHY0bDJfdHVuZXJfdHlwZSBtb2RlOwotCXVuc2lnbmVkIGludCBpbnB1dDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgbW9kZTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgbW9kZV9tYXNrOyAvKiBDb21iaW5hdGlvbiBvZiBhbGxvd2FibGUgbW9kZXMgKi8KKworCXVuc2lnbmVkIGludCBmcmVxOyAgICAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBpbnQgYXVkbW9kZTsKKwl2NGwyX3N0ZF9pZCAgc3RkOworCisJaW50ICAgICAgICAgIHVzaW5nX3Y0bDI7CiAKIAkvKiB1c2VkIGJ5IE1UMjAzMiAqLwogCXVuc2lnbmVkIGludCB4b2djOwpAQCAtMTk3LDE1ICsxOTEsMTEgQEAKIAl1bnNpZ25lZCBjaGFyIGkyY19lYXN5X21vZGVbMl07CiAJdW5zaWduZWQgY2hhciBpMmNfc2V0X2ZyZXFbOF07CiAKLQkvKiB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYXVkbW9kZSAqLwotCXVuc2lnbmVkIGludCBhdWRtb2RlOwotCiAJLyogZnVuY3Rpb24gcHRycyAqLwogCXZvaWQgKCp0dl9mcmVxKShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpOwogCXZvaWQgKCpyYWRpb19mcmVxKShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpOwogCWludCAgKCpoYXNfc2lnbmFsKShzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiAJaW50ICAoKmlzX3N0ZXJlbykoc3RydWN0IGkyY19jbGllbnQgKmMpOwotCWludCAgKCpzZXRfdHVuZXIpKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdjRsMl90dW5lciAqdik7CiB9OwogCiBleHRlcm4gdW5zaWduZWQgaW50IHR1bmVyX2RlYnVnOwpAQCAtMjE1LDYgKzIwNSw3IEBACiBleHRlcm4gaW50IHRkYTgyOTBfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiBleHRlcm4gaW50IHRlYTU3NjdfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiBleHRlcm4gaW50IGRlZmF1bHRfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CitleHRlcm4gaW50IHRlYTU3NjdfYXV0b2RldGVjdGlvbihzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiAKICNkZWZpbmUgdHVuZXJfd2FybihmbXQsIGFyZy4uLikgXAogCWRldl9wcmludGsoS0VSTl9XQVJOSU5HICwgJnQtPmkyYy5kZXYgLCBmbXQgLCAjIyBhcmcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL210ZC9tdGQtYWJpLmggYi9pbmNsdWRlL210ZC9tdGQtYWJpLmgKaW5kZXggYTc2YWI4OS4uNDI4ZDkxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tdGQvbXRkLWFiaS5oCisrKyBiL2luY2x1ZGUvbXRkL210ZC1hYmkuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IG10ZC1hYmkuaCx2IDEuNyAyMDA0LzExLzIzIDE1OjM3OjMyIGdsZWl4bmVyIEV4cCAkCisgKiAkSWQ6IG10ZC1hYmkuaCx2IDEuMTEgMjAwNS8wNS8xOSAxNjowODo1OCBnbGVpeG5lciBFeHAgJAogICoKICAqIFBvcnRpb25zIG9mIE1URCBBQkkgZGVmaW5pdGlvbiB3aGljaCBhcmUgc2hhcmVkIGJ5IGtlcm5lbCBhbmQgdXNlciBzcGFjZSAKICAqLwpAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBNVERfTk9SRkxBU0gJCTMKICNkZWZpbmUgTVREX05BTkRGTEFTSAkJNAogI2RlZmluZSBNVERfUEVST00JCTUKKyNkZWZpbmUgTVREX0RBVEFGTEFTSAkJNgogI2RlZmluZSBNVERfT1RIRVIJCTE0CiAjZGVmaW5lIE1URF9VTktOT1dOCQkxNQogCkBAIC02MCw2ICs2MSwxMiBAQAogI2RlZmluZSBNVERfTkFOREVDQ19QTEFDRQkxCS8vIFVzZSB0aGUgZ2l2ZW4gcGxhY2VtZW50IGluIHRoZSBzdHJ1Y3R1cmUgKFlBRkZTMSBsZWdhY3kgbW9kZSkKICNkZWZpbmUgTVREX05BTkRFQ0NfQVVUT1BMQUNFCTIJLy8gVXNlIHRoZSBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUKICNkZWZpbmUgTVREX05BTkRFQ0NfUExBQ0VPTkxZCTMJLy8gVXNlIHRoZSBnaXZlbiBwbGFjZW1lbnQgaW4gdGhlIHN0cnVjdHVyZSAoRG8gbm90IHN0b3JlIGVjYyByZXN1bHQgb24gcmVhZCkKKyNkZWZpbmUgTVREX05BTkRFQ0NfQVVUT1BMX1VTUiAJNAkvLyBVc2UgdGhlIGdpdmVuIGF1dG9wbGFjZW1lbnQgc2NoZW1lIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBkZWZhdWx0CisKKy8qIE9UUCBtb2RlIHNlbGVjdGlvbiAqLworI2RlZmluZSBNVERfT1RQX09GRgkJMAorI2RlZmluZSBNVERfT1RQX0ZBQ1RPUlkJCTEKKyNkZWZpbmUgTVREX09UUF9VU0VSCQkyCiAKIHN0cnVjdCBtdGRfaW5mb191c2VyIHsKIAl1aW50OF90IHR5cGU7CkBAIC04MCw2ICs4NywxMiBAQAogCXVpbnQzMl90IHJlZ2lvbmluZGV4OwogfTsKIAorc3RydWN0IG90cF9pbmZvIHsKKwl1aW50MzJfdCBzdGFydDsKKwl1aW50MzJfdCBsZW5ndGg7CisJdWludDMyX3QgbG9ja2VkOworfTsKKwogI2RlZmluZSBNRU1HRVRJTkZPICAgICAgICAgICAgICBfSU9SKCdNJywgMSwgc3RydWN0IG10ZF9pbmZvX3VzZXIpCiAjZGVmaW5lIE1FTUVSQVNFICAgICAgICAgICAgICAgIF9JT1coJ00nLCAyLCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQogI2RlZmluZSBNRU1XUklURU9PQiAgICAgICAgICAgICBfSU9XUignTScsIDMsIHN0cnVjdCBtdGRfb29iX2J1ZikKQEAgLTkyLDYgKzEwNSwxMCBAQAogI2RlZmluZSBNRU1HRVRPT0JTRUwJCV9JT1IoJ00nLCAxMCwgc3RydWN0IG5hbmRfb29iaW5mbykKICNkZWZpbmUgTUVNR0VUQkFEQkxPQ0sJCV9JT1coJ00nLCAxMSwgbG9mZl90KQogI2RlZmluZSBNRU1TRVRCQURCTE9DSwkJX0lPVygnTScsIDEyLCBsb2ZmX3QpCisjZGVmaW5lIE9UUFNFTEVDVAkJX0lPUignTScsIDEzLCBpbnQpCisjZGVmaW5lIE9UUEdFVFJFR0lPTkNPVU5UCV9JT1coJ00nLCAxNCwgaW50KQorI2RlZmluZSBPVFBHRVRSRUdJT05JTkZPCV9JT1coJ00nLCAxNSwgc3RydWN0IG90cF9pbmZvKQorI2RlZmluZSBPVFBMT0NLCQlfSU9SKCdNJywgMTYsIHN0cnVjdCBvdHBfaW5mbykKIAogc3RydWN0IG5hbmRfb29iaW5mbyB7CiAJdWludDMyX3QgdXNlZWNjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXJkYS9pcmRhX2RldmljZS5oIGIvaW5jbHVkZS9uZXQvaXJkYS9pcmRhX2RldmljZS5oCmluZGV4IDcxZDZhZjguLjkyYzgyODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lyZGEvaXJkYV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL25ldC9pcmRhL2lyZGFfZGV2aWNlLmgKQEAgLTIyNCw3ICsyMjQsNyBAQAogLyogSW50ZXJmYWNlIGZvciBpbnRlcm5hbCB1c2UgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGlyZGFfZGV2aWNlX3R4cXVldWVfZW1wdHkoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKHNrYl9xdWV1ZV9sZW4oJmRldi0+cWRpc2MtPnEpID09IDApOworCXJldHVybiBza2JfcXVldWVfZW1wdHkoJmRldi0+cWRpc2MtPnEpOwogfQogaW50ICBpcmRhX2RldmljZV9zZXRfcmF3X21vZGUoc3RydWN0IG5ldF9kZXZpY2UqIHNlbGYsIGludCBzdGF0dXMpOwogc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2lyZGFkZXYoaW50IHNpemVvZl9wcml2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKaW5kZXggZmNiMDVhMy4uNjQ5MmU3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKKysrIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKQEAgLTEzLDEzICsxMywxMiBAQAogCiBleHRlcm4gcndsb2NrX3QgcWRpc2NfdHJlZV9sb2NrOwogCi0jZGVmaW5lCVFESVNDX0FMSUdOCQkzMgotI2RlZmluZQlRRElTQ19BTElHTl9DT05TVAkoUURJU0NfQUxJR04gLSAxKQorI2RlZmluZSBRRElTQ19BTElHTlRPCQkzMgorI2RlZmluZSBRRElTQ19BTElHTihsZW4pCSgoKGxlbikgKyBRRElTQ19BTElHTlRPLTEpICYgfihRRElTQ19BTElHTlRPLTEpKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKnFkaXNjX3ByaXYoc3RydWN0IFFkaXNjICpxKQogewotCXJldHVybiAoY2hhciAqKXEgKyAoKHNpemVvZihzdHJ1Y3QgUWRpc2MpICsgUURJU0NfQUxJR05fQ09OU1QpCi0JCQkgICAgICAmIH5RRElTQ19BTElHTl9DT05TVCk7CisJcmV0dXJuIChjaGFyICopIHEgKyBRRElTQ19BTElHTihzaXplb2Yoc3RydWN0IFFkaXNjKSk7CiB9CiAKIC8qIApAQCAtMjA3LDggKzIwNiw2IEBACiAKICNlbmRpZiAvKiAhQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWSAqLwogCi1leHRlcm4gc3RydWN0IFFkaXNjIG5vb3BfcWRpc2M7Ci1leHRlcm4gc3RydWN0IFFkaXNjX29wcyBub29wX3FkaXNjX29wczsKIGV4dGVybiBzdHJ1Y3QgUWRpc2Nfb3BzIHBmaWZvX3FkaXNjX29wczsKIGV4dGVybiBzdHJ1Y3QgUWRpc2Nfb3BzIGJmaWZvX3FkaXNjX29wczsKIApAQCAtMjE2LDE0ICsyMTMsNiBAQAogZXh0ZXJuIGludCB1bnJlZ2lzdGVyX3FkaXNjKHN0cnVjdCBRZGlzY19vcHMgKnFvcHMpOwogZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpOwogZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfbG9va3VwX2NsYXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpOwotZXh0ZXJuIHZvaWQgZGV2X2luaXRfc2NoZWR1bGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgZGV2X3NodXRkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgZGV2X2FjdGl2YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgZGV2X2RlYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBxZGlzY19yZXNldChzdHJ1Y3QgUWRpc2MgKnFkaXNjKTsKLWV4dGVybiB2b2lkIHFkaXNjX2Rlc3Ryb3koc3RydWN0IFFkaXNjICpxZGlzYyk7Ci1leHRlcm4gc3RydWN0IFFkaXNjICogcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQlzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpOwogZXh0ZXJuIHN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICpxZGlzY19nZXRfcnRhYihzdHJ1Y3QgdGNfcmF0ZXNwZWMgKnIsCiAJCXN0cnVjdCBydGF0dHIgKnRhYik7CiBleHRlcm4gdm9pZCBxZGlzY19wdXRfcnRhYihzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqdGFiKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmggYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCmluZGV4IDdiOTc0MDUuLjdiNmVjOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaApAQCAtMTY0LDYgKzE2NCwxOSBAQAogI2RlZmluZSB0Y2ZfdHJlZV9sb2NrKHRwKQlxZGlzY19sb2NrX3RyZWUoKHRwKS0+cS0+ZGV2KQogI2RlZmluZSB0Y2ZfdHJlZV91bmxvY2sodHApCXFkaXNjX3VubG9ja190cmVlKCh0cCktPnEtPmRldikKIAorZXh0ZXJuIHN0cnVjdCBRZGlzYyBub29wX3FkaXNjOworZXh0ZXJuIHN0cnVjdCBRZGlzY19vcHMgbm9vcF9xZGlzY19vcHM7CisKK2V4dGVybiB2b2lkIGRldl9pbml0X3NjaGVkdWxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRldl9zaHV0ZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRldl9hY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRldl9kZWFjdGl2YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgcWRpc2NfcmVzZXQoc3RydWN0IFFkaXNjICpxZGlzYyk7CitleHRlcm4gdm9pZCBxZGlzY19kZXN0cm95KHN0cnVjdCBRZGlzYyAqcWRpc2MpOworZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzKTsKK2V4dGVybiBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2NyZWF0ZV9kZmx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBRZGlzY19vcHMgKm9wcyk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogdGNmX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCmluZGV4IGVmMjczODEuLjRhMjZhZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCkBAIC0xMjUsNyArMTI1LDggQEAKICAqLwogZXh0ZXJuIHN0cnVjdCBzb2NrICpzY3RwX2dldF9jdGxfc29jayh2b2lkKTsKIGV4dGVybiBpbnQgc2N0cF9jb3B5X2xvY2FsX2FkZHJfbGlzdChzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKiwKLQkJCQkgICAgIHNjdHBfc2NvcGVfdCwgaW50IGdmcCwgaW50IGZsYWdzKTsKKwkJCQkgICAgIHNjdHBfc2NvcGVfdCwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKKwkJCQkgICAgIGludCBmbGFncyk7CiBleHRlcm4gc3RydWN0IHNjdHBfcGYgKnNjdHBfZ2V0X3BmX3NwZWNpZmljKHNhX2ZhbWlseV90IGZhbWlseSk7CiBleHRlcm4gaW50IHNjdHBfcmVnaXN0ZXJfcGYoc3RydWN0IHNjdHBfcGYgKiwgc2FfZmFtaWx5X3QpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3NtLmggYi9pbmNsdWRlL25ldC9zY3RwL3NtLmgKaW5kZXggODhkOWZlNS4uNTg0NjIxNjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc20uaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NtLmgKQEAgLTE4MSwxNyArMTgxLDE3IEBACiBpbnQgc2N0cF9jaHVua19paWYoY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKik7CiBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqc2N0cF9tYWtlX3RlbXBfYXNvYyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqLAogCQkJCQkgICAgIHN0cnVjdCBzY3RwX2NodW5rICosCi0JCQkJCSAgICAgaW50IGdmcCk7CisJCQkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiBfX3UzMiBzY3RwX2dlbmVyYXRlX3ZlcmlmaWNhdGlvbl90YWcodm9pZCk7CiB2b2lkIHNjdHBfcG9wdWxhdGVfdGllX3RhZ3MoX191OCAqY29va2llLCBfX3UzMiBjdXJUYWcsIF9fdTMyIGhpc1RhZyk7CiAKIC8qIFByb3RvdHlwZXMgZm9yIGNodW5rLWJ1aWxkaW5nIGZ1bmN0aW9ucy4gICovCiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2luaXQoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICosCi0JCQkgICAgIGludCBnZnAsIGludCB2cGFyYW1fbGVuKTsKKwkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwgaW50IHZwYXJhbV9sZW4pOwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9pbml0X2Fjayhjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAogCQkJCSBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqLAotCQkJCSBjb25zdCBpbnQgZ2ZwLAorCQkJCSBjb25zdCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAogCQkJCSBjb25zdCBpbnQgdW5rcGFyYW1fbGVuKTsKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfY29va2llX2VjaG8oY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCQkgICAgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKik7CkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICAgICAgICAgICAgIHN0cnVjdCBzY3RwX2VuZHBvaW50ICosCiAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKICAgICAgICAgICAgICAgIHZvaWQgKmV2ZW50X2FyZywKLSAgICAgICAgICAgICAgIGludCBnZnApOworCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogLyogMm5kIGxldmVsIHByb3RvdHlwZXMgKi8KIHZvaWQgc2N0cF9nZW5lcmF0ZV90M19ydHhfZXZlbnQodW5zaWduZWQgbG9uZyBwZWVyKTsKQEAgLTI3NSw3ICsyNzUsOCBAQAogCiBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqc2N0cF91bnBhY2tfY29va2llKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICosCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCi0JCQkJICAgICAgIHN0cnVjdCBzY3RwX2NodW5rICosIGludCBnZnAsIGludCAqZXJyLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLCBpbnQgKmVyciwKIAkJCQkgICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKiplcnJfY2hrX3ApOwogaW50IHNjdHBfYWRkaXBfYWRkcl9jb25maWcoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgc2N0cF9wYXJhbV90LAogCQkJICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmggYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAppbmRleCA0NzcyN2M3Li45OTQwMDliIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaApAQCAtNDQ1LDcgKzQ0NSw4IEBACiAJaW50IG1hbGxvY2VkOwogfTsKIAotc3RydWN0IHNjdHBfc3NubWFwICpzY3RwX3Nzbm1hcF9uZXcoX191MTYgaW4sIF9fdTE2IG91dCwgaW50IGdmcCk7CitzdHJ1Y3Qgc2N0cF9zc25tYXAgKnNjdHBfc3NubWFwX25ldyhfX3UxNiBpbiwgX191MTYgb3V0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIHZvaWQgc2N0cF9zc25tYXBfZnJlZShzdHJ1Y3Qgc2N0cF9zc25tYXAgKm1hcCk7CiB2b2lkIHNjdHBfc3NubWFwX2NsZWFyKHN0cnVjdCBzY3RwX3Nzbm1hcCAqbWFwKTsKIApAQCAtNTgyLDcgKzU4Myw2IEBACiB2b2lkIHNjdHBfY2h1bmtfZmFpbChzdHJ1Y3Qgc2N0cF9jaHVuayAqLCBpbnQgZXJyb3IpOwogaW50IHNjdHBfY2h1bmtfYWJhbmRvbmVkKHN0cnVjdCBzY3RwX2NodW5rICopOwogCi0KIC8qIFJGQzI5NjAgMS40IEtleSBUZXJtcwogICoKICAqIG8gQ2h1bms6IEEgdW5pdCBvZiBpbmZvcm1hdGlvbiB3aXRoaW4gYW4gU0NUUCBwYWNrZXQsIGNvbnNpc3Rpbmcgb2YKQEAgLTU5MiwxMyArNTkyLDggQEAKICAqIGVhY2ggY2h1bmsgYXMgd2VsbCBhcyBhIGZldyBvdGhlciBoZWFkZXIgcG9pbnRlcnMuLi4KICAqLwogc3RydWN0IHNjdHBfY2h1bmsgewotCS8qIFRoZXNlIGZpcnN0IHRocmVlIGVsZW1lbnRzIE1VU1QgUFJFQ0lTRUxZIG1hdGNoIHRoZSBmaXJzdAotCSAqIHRocmVlIGVsZW1lbnRzIG9mIHN0cnVjdCBza19idWZmLiAgVGhpcyBhbGxvd3MgdXMgdG8gcmV1c2UKLQkgKiBhbGwgdGhlIHNrYl8qIHF1ZXVlIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgotCSAqLwotCXN0cnVjdCBzY3RwX2NodW5rICpuZXh0OwotCXN0cnVjdCBzY3RwX2NodW5rICpwcmV2OwotCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCiAJYXRvbWljX3QgcmVmY250OwogCiAJLyogVGhpcyBpcyBvdXIgbGluayB0byB0aGUgcGVyLXRyYW5zcG9ydCB0cmFuc21pdHRlZCBsaXN0LiAgKi8KQEAgLTcxNyw3ICs3MTIsNyBAQAogCV9fdTMyIHZ0YWc7CiAKIAkvKiBUaGlzIGNvbnRhaW5zIHRoZSBwYXlsb2FkIGNodW5rcy4gICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBjaHVua3M7CisJc3RydWN0IGxpc3RfaGVhZCBjaHVua19saXN0OwogCiAJLyogVGhpcyBpcyB0aGUgb3ZlcmhlYWQgb2YgdGhlIHNjdHAgYW5kIGlwIGhlYWRlcnMuICovCiAJc2l6ZV90IG92ZXJoZWFkOwpAQCAtOTUxLDcgKzk0Niw4IEBACiAJfSBjYWNjOwogfTsKIAotc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX3RyYW5zcG9ydF9uZXcoY29uc3QgdW5pb24gc2N0cF9hZGRyICosIGludCk7CitzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfdHJhbnNwb3J0X25ldyhjb25zdCB1bmlvbiBzY3RwX2FkZHIgKiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwogdm9pZCBzY3RwX3RyYW5zcG9ydF9zZXRfb3duZXIoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICosCiAJCQkgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqKTsKIHZvaWQgc2N0cF90cmFuc3BvcnRfcm91dGUoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICosIHVuaW9uIHNjdHBfYWRkciAqLApAQCAtOTc0LDcgKzk3MCw3IEBACiAJLyogVGhpcyBpcyBhY3R1YWxseSBhIHF1ZXVlIG9mIHNjdHBfY2h1bmsgZWFjaAogCSAqIGNvbnRhaW5pbmcgYSBwYXJ0aWFsbHkgZGVjb2RlZCBwYWNrZXQuCiAJICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBpbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGluX2NodW5rX2xpc3Q7CiAJLyogVGhpcyBpcyB0aGUgcGFja2V0IHdoaWNoIGlzIGN1cnJlbnRseSBvZmYgdGhlIGluIHF1ZXVlIGFuZCBpcwogCSAqIGJlaW5nIHdvcmtlZCBvbiB0aHJvdWdoIHRoZSBpbmJvdW5kIGNodW5rIHByb2Nlc3NpbmcuCiAJICovCkBAIC0xMDE3LDcgKzEwMTMsNyBAQAogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCiAJLyogRGF0YSBwZW5kaW5nIHRoYXQgaGFzIG5ldmVyIGJlZW4gdHJhbnNtaXR0ZWQuICAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgb3V0OworCXN0cnVjdCBsaXN0X2hlYWQgb3V0X2NodW5rX2xpc3Q7CiAKIAl1bnNpZ25lZCBvdXRfcWxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIHF1ZXVlZCBkYXRhIGNodW5rcy4gKi8KIApAQCAtMTAyNSw3ICsxMDIxLDcgQEAKIAl1bnNpZ25lZCBlcnJvcjsKIAogCS8qIFRoZXNlIGFyZSBjb250cm9sIGNodW5rcyB3ZSB3YW50IHRvIHNlbmQuICAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgY29udHJvbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbnRyb2xfY2h1bmtfbGlzdDsKIAogCS8qIFRoZXNlIGFyZSBjaHVua3MgdGhhdCBoYXZlIGJlZW4gc2Fja2VkIGJ1dCBhcmUgYWJvdmUgdGhlCiAJICogQ1RTTiwgb3IgY3VtdWxhdGl2ZSB0c24gYWNrIHBvaW50LgpAQCAtMTA5OSw5ICsxMDk1LDEwIEBACiB2b2lkIHNjdHBfYmluZF9hZGRyX2ZyZWUoc3RydWN0IHNjdHBfYmluZF9hZGRyICopOwogaW50IHNjdHBfYmluZF9hZGRyX2NvcHkoc3RydWN0IHNjdHBfYmluZF9hZGRyICpkZXN0LAogCQkJY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICpzcmMsCi0JCQlzY3RwX3Njb3BlX3Qgc2NvcGUsIGludCBnZnAsaW50IGZsYWdzKTsKKwkJCXNjdHBfc2NvcGVfdCBzY29wZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKKwkJCWludCBmbGFncyk7CiBpbnQgc2N0cF9hZGRfYmluZF9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLCB1bmlvbiBzY3RwX2FkZHIgKiwKLQkJICAgICAgIGludCBnZnApOworCQkgICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiBpbnQgc2N0cF9kZWxfYmluZF9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLCB1bmlvbiBzY3RwX2FkZHIgKik7CiBpbnQgc2N0cF9iaW5kX2FkZHJfbWF0Y2goc3RydWN0IHNjdHBfYmluZF9hZGRyICosIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqLAogCQkJIHN0cnVjdCBzY3RwX3NvY2sgKik7CkBAIC0xMTEwLDkgKzExMDcsMTAgQEAKIAkJCQkJaW50CQkJYWRkcmNudCwKIAkJCQkJc3RydWN0IHNjdHBfc29jawkqb3B0KTsKIHVuaW9uIHNjdHBfcGFyYW1zIHNjdHBfYmluZF9hZGRyc190b19yYXcoY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwKLQkJCQkJIGludCAqYWRkcnNfbGVuLCBpbnQgZ2ZwKTsKKwkJCQkJIGludCAqYWRkcnNfbGVuLAorCQkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiBpbnQgc2N0cF9yYXdfdG9fYmluZF9hZGRycyhzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBfX3U4ICpyYXcsIGludCBsZW4sCi0JCQkgICBfX3UxNiBwb3J0LCBpbnQgZ2ZwKTsKKwkJCSAgIF9fdTE2IHBvcnQsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzY3RwX3Njb3BlX3Qgc2N0cF9zY29wZShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKik7CiBpbnQgc2N0cF9pbl9zY29wZShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIGNvbnN0IHNjdHBfc2NvcGVfdCBzY29wZSk7CkBAIC0xMjQxLDcgKzEyMzksNyBAQAogfQogCiAvKiBUaGVzZSBhcmUgZnVuY3Rpb24gc2lnbmF0dXJlcyBmb3IgbWFuaXB1bGF0aW5nIGVuZHBvaW50cy4gICovCi1zdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqc2N0cF9lbmRwb2ludF9uZXcoc3RydWN0IHNvY2sgKiwgaW50KTsKK3N0cnVjdCBzY3RwX2VuZHBvaW50ICpzY3RwX2VuZHBvaW50X25ldyhzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwogdm9pZCBzY3RwX2VuZHBvaW50X2ZyZWUoc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CiB2b2lkIHNjdHBfZW5kcG9pbnRfcHV0KHN0cnVjdCBzY3RwX2VuZHBvaW50ICopOwogdm9pZCBzY3RwX2VuZHBvaW50X2hvbGQoc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CkBAIC0xMjYyLDcgKzEyNjAsNyBAQAogCQkgICAgIHN0cnVjdCBzY3RwX2NodW5rICoqZXJyX2NodW5rKTsKIGludCBzY3RwX3Byb2Nlc3NfaW5pdChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLCBzY3RwX2NpZF90IGNpZCwKIAkJICAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwZWVyLAotCQkgICAgICBzY3RwX2luaXRfY2h1bmtfdCAqaW5pdCwgaW50IGdmcCk7CisJCSAgICAgIHNjdHBfaW5pdF9jaHVua190ICppbml0LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIF9fdTMyIHNjdHBfZ2VuZXJhdGVfdGFnKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICopOwogX191MzIgc2N0cF9nZW5lcmF0ZV90c24oY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CiAKQEAgLTE2NzIsNyArMTY3MCw3IEBACiAJICogIHdoaWNoIGFscmVhZHkgcmVzaWRlcyBpbiBzY3RwX291dHEuCSBQbGVhc2UgbW92ZSB0aGlzCiAJICogIHF1ZXVlIGFuZCBpdHMgc3VwcG9ydGluZyBsb2dpYyBkb3duIHRoZXJlLgktLXBpZ2d5XQogCSAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgYWRkaXBfY2h1bmtzOworCXN0cnVjdCBsaXN0X2hlYWQgYWRkaXBfY2h1bmtfbGlzdDsKIAogCS8qIEFERElQIFNlY3Rpb24gNC4xIEFTQ09ORiBDaHVuayBQcm9jZWR1cmVzCiAJICoKQEAgLTE3MjUsNyArMTcyMyw3IEBACiAKIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICoKIHNjdHBfYXNzb2NpYXRpb25fbmV3KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICosIGNvbnN0IHN0cnVjdCBzb2NrICosCi0JCSAgICAgc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwKTsKKwkJICAgICBzY3RwX3Njb3BlX3Qgc2NvcGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogdm9pZCBzY3RwX2Fzc29jaWF0aW9uX2ZyZWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKik7CiB2b2lkIHNjdHBfYXNzb2NpYXRpb25fcHV0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICopOwogdm9pZCBzY3RwX2Fzc29jaWF0aW9uX2hvbGQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKik7CkBAIC0xNzQxLDcgKzE3MzksNyBAQAogCQkJICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqbGFkZHIpOwogc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX2Fzc29jX2FkZF9wZWVyKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkJICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHJlc3MsCi0JCQkJICAgICBjb25zdCBpbnQgZ2ZwLAorCQkJCSAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKIAkJCQkgICAgIGNvbnN0IGludCBwZWVyX3N0YXRlKTsKIHZvaWQgc2N0cF9hc3NvY19kZWxfcGVlcihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCSBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpOwpAQCAtMTc2NSw5ICsxNzYzLDExIEBACiB2b2lkIHNjdHBfYXNzb2NfcnduZF9kZWNyZWFzZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLCB1bnNpZ25lZCk7CiB2b2lkIHNjdHBfYXNzb2Nfc2V0X3ByaW1hcnkoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCSAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKik7Ci1pbnQgc2N0cF9hc3NvY19zZXRfYmluZF9hZGRyX2Zyb21fZXAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgaW50KTsKK2ludCBzY3RwX2Fzc29jX3NldF9iaW5kX2FkZHJfZnJvbV9lcChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAorCQkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIGludCBzY3RwX2Fzc29jX3NldF9iaW5kX2FkZHJfZnJvbV9jb29raWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKLQkJCQkJIHN0cnVjdCBzY3RwX2Nvb2tpZSosIGludCBnZnApOworCQkJCQkgc3RydWN0IHNjdHBfY29va2llKiwKKwkJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBpbnQgc2N0cF9jbXBfYWRkcl9leGFjdChjb25zdCB1bmlvbiBzY3RwX2FkZHIgKnNzMSwKIAkJCWNvbnN0IHVuaW9uIHNjdHBfYWRkciAqc3MyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaCBiL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaAppbmRleCAxMDE5ZDgzLi45MGZlNGJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCkBAIC04OCw3ICs4OCw3IEBACiAJX191MTYgZXJyb3IsCiAJX191MTYgb3V0Ym91bmQsCiAJX191MTYgaW5ib3VuZCwKLQlpbnQgZ2ZwKTsKKwl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9wZWVyX2FkZHJfY2hhbmdlKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLApAQCAtOTYsMzUgKzk2LDM1IEBACiAJaW50IGZsYWdzLAogCWludCBzdGF0ZSwKIAlpbnQgZXJyb3IsCi0JaW50IGdmcCk7CisJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcmVtb3RlX2Vycm9yKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKIAlfX3UxNiBmbGFncywKLQlpbnQgZ2ZwKTsKKwl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2Vfc2VuZF9mYWlsZWQoCiAJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAogCV9fdTE2IGZsYWdzLAogCV9fdTMyIGVycm9yLAotCWludCBnZnApOworCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3NodXRkb3duX2V2ZW50KAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCV9fdTE2IGZsYWdzLAotCWludCBnZnApOworCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3BkYXBpKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAotCV9fdTMyIGluZGljYXRpb24sIGludCBnZnApOworCV9fdTMyIGluZGljYXRpb24sIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX2FkYXB0aW9uX2luZGljYXRpb24oCi0JY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIGludCBnZnApOworCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9yY3Ztc2coc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCWludCBnZnApOworCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiB2b2lkIHNjdHBfdWxwZXZlbnRfcmVhZF9zbmRyY3ZpbmZvKGNvbnN0IHN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCwKIAlzdHJ1Y3QgbXNnaGRyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC91bHBxdWV1ZS5oIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBxdWV1ZS5oCmluZGV4IDk2MTczNmQuLjFhNjBjNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwcXVldWUuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3VscHF1ZXVlLmgKQEAgLTYyLDE5ICs2MiwyMiBAQAogdm9pZCBzY3RwX3VscHFfZnJlZShzdHJ1Y3Qgc2N0cF91bHBxICopOwogCiAvKiBBZGQgYSBuZXcgREFUQSBjaHVuayBmb3IgcHJvY2Vzc2luZy4gKi8KLWludCBzY3RwX3VscHFfdGFpbF9kYXRhKHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwgaW50KTsKK2ludCBzY3RwX3VscHFfdGFpbF9kYXRhKHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwKKwkJCXVuc2lnbmVkIGludCBfX25vY2FzdCk7CiAKIC8qIEFkZCBhIG5ldyBldmVudCBmb3IgcHJvcGFnYXRpb24gdG8gdGhlIFVMUC4gKi8KIGludCBzY3RwX3VscHFfdGFpbF9ldmVudChzdHJ1Y3Qgc2N0cF91bHBxICosIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpldik7CiAKIC8qIFJlbmVnZSBwcmV2aW91c2x5IHJlY2VpdmVkIGNodW5rcy4gICovCi12b2lkIHNjdHBfdWxwcV9yZW5lZ2Uoc3RydWN0IHNjdHBfdWxwcSAqLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqLCBpbnQpOwordm9pZCBzY3RwX3VscHFfcmVuZWdlKHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwKKwkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIAogLyogUGVyZm9ybSBwYXJ0aWFsIGRlbGl2ZXJ5LiAqLwotdm9pZCBzY3RwX3VscHFfcGFydGlhbF9kZWxpdmVyeShzdHJ1Y3Qgc2N0cF91bHBxICosIHN0cnVjdCBzY3RwX2NodW5rICosIGludCk7Cit2b2lkIHNjdHBfdWxwcV9wYXJ0aWFsX2RlbGl2ZXJ5KHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwogCiAvKiBBYm9ydCB0aGUgcGFydGlhbCBkZWxpdmVyeS4gKi8KLXZvaWQgc2N0cF91bHBxX2Fib3J0X3BkKHN0cnVjdCBzY3RwX3VscHEgKiwgaW50KTsKK3ZvaWQgc2N0cF91bHBxX2Fib3J0X3BkKHN0cnVjdCBzY3RwX3VscHEgKiwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIAogLyogQ2xlYXIgdGhlIHBhcnRpYWwgZGF0YSBkZWxpdmVyeSBjb25kaXRpb24gb24gdGhpcyBzb2NrZXQuICovCiBpbnQgc2N0cF9jbGVhcl9wZChzdHJ1Y3Qgc29jayAqc2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2xoY192ai5oIGIvaW5jbHVkZS9uZXQvc2xoY192ai5oCmluZGV4IDBiMmMyNzguLjg3MTZkNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NsaGNfdmouaAorKysgYi9pbmNsdWRlL25ldC9zbGhjX3ZqLmgKQEAgLTE3MCwxOSArMTcwLDE0IEBACiB9OwogI2RlZmluZSBOVUxMU0xDT01QUgkoc3RydWN0IHNsY29tcHJlc3MgKikwCiAKLSNkZWZpbmUgX19BUkdTKHgpIHgKLQogLyogSW4gc2xoYy5jOiAqLwotc3RydWN0IHNsY29tcHJlc3MgKnNsaGNfaW5pdCBfX0FSR1MoKGludCByc2xvdHMsIGludCB0c2xvdHMpKTsKLXZvaWQgc2xoY19mcmVlIF9fQVJHUygoc3RydWN0IHNsY29tcHJlc3MgKmNvbXApKTsKK3N0cnVjdCBzbGNvbXByZXNzICpzbGhjX2luaXQoaW50IHJzbG90cywgaW50IHRzbG90cyk7Cit2b2lkIHNsaGNfZnJlZShzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCk7CiAKLWludCBzbGhjX2NvbXByZXNzIF9fQVJHUygoc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwKLQkJCSAgaW50IGlzaXplLCB1bnNpZ25lZCBjaGFyICpvY3AsIHVuc2lnbmVkIGNoYXIgKipjcHAsCi0JCQkgIGludCBjb21wcmVzc19jaWQpKTsKLWludCBzbGhjX3VuY29tcHJlc3MgX19BUkdTKChzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCwgdW5zaWduZWQgY2hhciAqaWNwLAotCQkJICAgIGludCBpc2l6ZSkpOwotaW50IHNsaGNfcmVtZW1iZXIgX19BUkdTKChzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCwgdW5zaWduZWQgY2hhciAqaWNwLAotCQkJICBpbnQgaXNpemUpKTsKLWludCBzbGhjX3Rvc3MgX19BUkdTKChzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCkpOworaW50IHNsaGNfY29tcHJlc3Moc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplLAorCQkgIHVuc2lnbmVkIGNoYXIgKm9jcCwgdW5zaWduZWQgY2hhciAqKmNwcCwgaW50IGNvbXByZXNzX2NpZCk7CitpbnQgc2xoY191bmNvbXByZXNzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSk7CitpbnQgc2xoY19yZW1lbWJlcihzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCwgdW5zaWduZWQgY2hhciAqaWNwLCBpbnQgaXNpemUpOworaW50IHNsaGNfdG9zcyhzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCk7CiAKICNlbmRpZgkvKiBfU0xIQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmgKaW5kZXggZTU5M2FmNS4uYTEwNDJkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3NvY2suaApAQCAtNjg0LDE2ICs2ODQsMTcgQEAKICNkZWZpbmUgYmhfbG9ja19zb2NrKF9fc2spCXNwaW5fbG9jaygmKChfX3NrKS0+c2tfbG9jay5zbG9jaykpCiAjZGVmaW5lIGJoX3VubG9ja19zb2NrKF9fc2spCXNwaW5fdW5sb2NrKCYoKF9fc2spLT5za19sb2NrLnNsb2NrKSkKIAotZXh0ZXJuIHN0cnVjdCBzb2NrCQkqc2tfYWxsb2MoaW50IGZhbWlseSwgaW50IHByaW9yaXR5LAorZXh0ZXJuIHN0cnVjdCBzb2NrCQkqc2tfYWxsb2MoaW50IGZhbWlseSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHksCiAJCQkJCSAgc3RydWN0IHByb3RvICpwcm90LCBpbnQgemVyb19pdCk7CiBleHRlcm4gdm9pZAkJCXNrX2ZyZWUoc3RydWN0IHNvY2sgKnNrKTsKIAogZXh0ZXJuIHN0cnVjdCBza19idWZmCQkqc29ja193bWFsbG9jKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsCi0JCQkJCSAgICAgIGludCBwcmlvcml0eSk7CisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYJCSpzb2NrX3JtYWxsb2Moc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGludCBmb3JjZSwKLQkJCQkJICAgICAgaW50IHByaW9yaXR5KTsKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiB2b2lkCQkJc29ja193ZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiB2b2lkCQkJc29ja19yZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApAQCAtNzA4LDcgKzcwOSw4IEBACiAJCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkJCSAgICAgaW50IG5vYmxvY2ssCiAJCQkJCQkgICAgIGludCAqZXJyY29kZSk7Ci1leHRlcm4gdm9pZCAqc29ja19rbWFsbG9jKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIGludCBwcmlvcml0eSk7CitleHRlcm4gdm9pZCAqc29ja19rbWFsbG9jKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsCisJCQkgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSk7CiBleHRlcm4gdm9pZCBzb2NrX2tmcmVlX3Moc3RydWN0IHNvY2sgKnNrLCB2b2lkICptZW0sIGludCBzaXplKTsKIGV4dGVybiB2b2lkIHNrX3NlbmRfc2lndXJnKHN0cnVjdCBzb2NrICpzayk7CiAKQEAgLTExMzIsMTUgKzExMzQsMTkgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tfc3RyZWFtX2FsbG9jX3Bza2Ioc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJICAgaW50IHNpemUsIGludCBtZW0sIGludCBnZnApCisJCQkJCQkgICBpbnQgc2l6ZSwgaW50IG1lbSwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplICsgc2stPnNrX3Byb3QtPm1heF9oZWFkZXIsIGdmcCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaGRyX2xlbjsKIAorCWhkcl9sZW4gPSBTS0JfREFUQV9BTElHTihzay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7CisJc2tiID0gYWxsb2Nfc2tiKHNpemUgKyBoZHJfbGVuLCBnZnApOwogCWlmIChza2IpIHsKIAkJc2tiLT50cnVlc2l6ZSArPSBtZW07CiAJCWlmIChzay0+c2tfZm9yd2FyZF9hbGxvYyA+PSAoaW50KXNrYi0+dHJ1ZXNpemUgfHwKIAkJICAgIHNrX3N0cmVhbV9tZW1fc2NoZWR1bGUoc2ssIHNrYi0+dHJ1ZXNpemUsIDApKSB7Ci0JCQlza2JfcmVzZXJ2ZShza2IsIHNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgaGRyX2xlbik7CiAJCQlyZXR1cm4gc2tiOwogCQl9CiAJCV9fa2ZyZWVfc2tiKHNrYik7CkBAIC0xMTUyLDcgKzExNTgsOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpza19zdHJlYW1fYWxsb2Nfc2tiKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgaW50IHNpemUsIGludCBnZnApCisJCQkJCQkgIGludCBzaXplLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXJldHVybiBza19zdHJlYW1fYWxsb2NfcHNrYihzaywgc2l6ZSwgMCwgZ2ZwKTsKIH0KQEAgLTExODUsNyArMTE5Miw3IEBACiAJcmV0dXJuIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPCAoc2stPnNrX3NuZGJ1ZiAvIDIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBnZnBfYW55KHZvaWQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfYW55KHZvaWQpCiB7CiAJcmV0dXJuIGluX3NvZnRpcnEoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCBlYzllMjBjLi5mNGY5YWJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtNzIxLDExICs3MjEsMTYgQEAKIAlyZXR1cm4gdHAtPmFjay5wZW5kaW5nJlRDUF9BQ0tfU0NIRUQ7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2RlY19xdWlja2Fja19tb2RlKHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9kZWNfcXVpY2thY2tfbW9kZShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1bnNpZ25lZCBpbnQgcGt0cykKIHsKLQlpZiAodHAtPmFjay5xdWljayAmJiAtLXRwLT5hY2sucXVpY2sgPT0gMCkgewotCQkvKiBMZWF2aW5nIHF1aWNrYWNrIG1vZGUgd2UgZGVmbGF0ZSBBVE8uICovCi0JCXRwLT5hY2suYXRvID0gVENQX0FUT19NSU47CisJaWYgKHRwLT5hY2sucXVpY2spIHsKKwkJaWYgKHBrdHMgPj0gdHAtPmFjay5xdWljaykgeworCQkJdHAtPmFjay5xdWljayA9IDA7CisKKwkJCS8qIExlYXZpbmcgcXVpY2thY2sgbW9kZSB3ZSBkZWZsYXRlIEFUTy4gKi8KKwkJCXRwLT5hY2suYXRvID0gVENQX0FUT19NSU47CisJCX0gZWxzZQorCQkJdHAtPmFjay5xdWljayAtPSBwa3RzOwogCX0KIH0KIApAQCAtODQzLDcgKzg0OCw5IEBACiAKIC8qIHRjcF9vdXRwdXQuYyAqLwogCi1leHRlcm4gaW50IHRjcF93cml0ZV94bWl0KHN0cnVjdCBzb2NrICosIGludCBub25hZ2xlKTsKK2V4dGVybiB2b2lkIF9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjdXJfbXNzLCBpbnQgbm9uYWdsZSk7CitleHRlcm4gaW50IHRjcF9tYXlfc2VuZF9ub3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKTsKIGV4dGVybiBpbnQgdGNwX3JldHJhbnNtaXRfc2tiKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIHZvaWQgdGNwX3htaXRfcmV0cmFuc21pdF9xdWV1ZShzdHJ1Y3Qgc29jayAqKTsKIGV4dGVybiB2b2lkIHRjcF9zaW1wbGVfcmV0cmFuc21pdChzdHJ1Y3Qgc29jayAqKTsKQEAgLTg1MywxMiArODYwLDE2IEBACiBleHRlcm4gdm9pZCB0Y3Bfc2VuZF9wYXJ0aWFsKHN0cnVjdCBzb2NrICopOwogZXh0ZXJuIGludCAgdGNwX3dyaXRlX3dha2V1cChzdHJ1Y3Qgc29jayAqKTsKIGV4dGVybiB2b2lkIHRjcF9zZW5kX2ZpbihzdHJ1Y3Qgc29jayAqc2spOwotZXh0ZXJuIHZvaWQgdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgaW50IHByaW9yaXR5KTsKK2V4dGVybiB2b2lkIHRjcF9zZW5kX2FjdGl2ZV9yZXNldChzdHJ1Y3Qgc29jayAqc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiBpbnQgIHRjcF9zZW5kX3N5bmFjayhzdHJ1Y3Qgc29jayAqKTsKLWV4dGVybiB2b2lkIHRjcF9wdXNoX29uZShzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBtc3Nfbm93KTsKK2V4dGVybiB2b2lkIHRjcF9wdXNoX29uZShzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBpbnQgbXNzX25vdyk7CiBleHRlcm4gdm9pZCB0Y3Bfc2VuZF9hY2soc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiB2b2lkIHRjcF9zZW5kX2RlbGF5ZWRfYWNrKHN0cnVjdCBzb2NrICpzayk7CiAKKy8qIHRjcF9pbnB1dC5jICovCitleHRlcm4gdm9pZCB0Y3BfY3duZF9hcHBsaWNhdGlvbl9saW1pdGVkKHN0cnVjdCBzb2NrICpzayk7CisKIC8qIHRjcF90aW1lci5jICovCiBleHRlcm4gdm9pZCB0Y3BfaW5pdF94bWl0X3RpbWVycyhzdHJ1Y3Qgc29jayAqKTsKIGV4dGVybiB2b2lkIHRjcF9jbGVhcl94bWl0X3RpbWVycyhzdHJ1Y3Qgc29jayAqKTsKQEAgLTk1OCw3ICs5NjksNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9pbml0aWFsaXplX3Jjdl9tc3Moc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXVuc2lnbmVkIGludCBoaW50ID0gbWluKHRwLT5hZHZtc3MsIHRwLT5tc3NfY2FjaGVfc3RkKTsKKwl1bnNpZ25lZCBpbnQgaGludCA9IG1pbl90KHVuc2lnbmVkIGludCwgdHAtPmFkdm1zcywgdHAtPm1zc19jYWNoZSk7CiAKIAloaW50ID0gbWluKGhpbnQsIHRwLT5yY3Zfd25kLzIpOwogCWhpbnQgPSBtaW4oaGludCwgVENQX01JTl9SQ1ZNU1MpOwpAQCAtOTgxLDcgKzk5Miw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZmFzdF9wYXRoX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkgPT0gMCAmJgorCWlmIChza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpICYmCiAJICAgIHRwLT5yY3Zfd25kICYmCiAJICAgIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPCBzay0+c2tfcmN2YnVmICYmCiAJICAgICF0cC0+dXJnX2RhdGEpCkBAIC0xMjI1LDI4ICsxMjM2LDYgQEAKIAl0cC0+bGVmdF9vdXQgPSB0cC0+c2Fja2VkX291dCArIHRwLT5sb3N0X291dDsKIH0KIAotZXh0ZXJuIHZvaWQgdGNwX2N3bmRfYXBwbGljYXRpb25fbGltaXRlZChzdHJ1Y3Qgc29jayAqc2spOwotCi0vKiBDb25nZXN0aW9uIHdpbmRvdyB2YWxpZGF0aW9uLiAoUkZDMjg2MSkgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIHRjcF9jd25kX3ZhbGlkYXRlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKLXsKLQlfX3UzMiBwYWNrZXRzX291dCA9IHRwLT5wYWNrZXRzX291dDsKLQotCWlmIChwYWNrZXRzX291dCA+PSB0cC0+c25kX2N3bmQpIHsKLQkJLyogTmV0d29yayBpcyBmZWVkIGZ1bGx5LiAqLwotCQl0cC0+c25kX2N3bmRfdXNlZCA9IDA7Ci0JCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOwotCX0gZWxzZSB7Ci0JCS8qIE5ldHdvcmsgc3RhcnZlcy4gKi8KLQkJaWYgKHRwLT5wYWNrZXRzX291dCA+IHRwLT5zbmRfY3duZF91c2VkKQotCQkJdHAtPnNuZF9jd25kX3VzZWQgPSB0cC0+cGFja2V0c19vdXQ7Ci0KLQkJaWYgKChzMzIpKHRjcF90aW1lX3N0YW1wIC0gdHAtPnNuZF9jd25kX3N0YW1wKSA+PSB0cC0+cnRvKQotCQkJdGNwX2N3bmRfYXBwbGljYXRpb25fbGltaXRlZChzayk7Ci0JfQotfQotCiAvKiBTZXQgc2xvdyBzdGFydCB0aHJlc2hvdWxkIGFuZCBjd25kIG5vdCBmYWxsaW5nIHRvIHNsb3cgc3RhcnQgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3RjcF9lbnRlcl9jd3Ioc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKQEAgLTEyNzksMTIgKzEyNjgsNiBAQAogCXJldHVybiAzOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNwX21pbnNoYWxsX2NoZWNrKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHApCi17Ci0JcmV0dXJuIGFmdGVyKHRwLT5zbmRfc21sLHRwLT5zbmRfdW5hKSAmJgotCQkhYWZ0ZXIodHAtPnNuZF9zbWwsIHRwLT5zbmRfbnh0KTsKLX0KLQogc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfbWluc2hhbGxfdXBkYXRlKHN0cnVjdCB0Y3Bfc29jayAqdHAsIGludCBtc3MsIAogCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTI5MiwxMjIgKzEyNzUsMTggQEAKIAkJdHAtPnNuZF9zbWwgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiB9CiAKLS8qIFJldHVybiAwLCBpZiBwYWNrZXQgY2FuIGJlIHNlbnQgbm93IHdpdGhvdXQgdmlvbGF0aW9uIE5hZ2xlJ3MgcnVsZXM6Ci0gICAxLiBJdCBpcyBmdWxsIHNpemVkLgotICAgMi4gT3IgaXQgY29udGFpbnMgRklOLgotICAgMy4gT3IgVENQX05PREVMQVkgd2FzIHNldC4KLSAgIDQuIE9yIFRDUF9DT1JLIGlzIG5vdCBzZXQsIGFuZCBhbGwgc2VudCBwYWNrZXRzIGFyZSBBQ0tlZC4KLSAgICAgIFdpdGggTWluc2hhbGwncyBtb2RpZmljYXRpb246IGFsbCBzZW50IHNtYWxsIHBhY2tldHMgYXJlIEFDS2VkLgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIGludAotdGNwX25hZ2xlX2NoZWNrKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIAotCQl1bnNpZ25lZCBtc3Nfbm93LCBpbnQgbm9uYWdsZSkKLXsKLQlyZXR1cm4gKHNrYi0+bGVuIDwgbXNzX25vdyAmJgotCQkhKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikgJiYKLQkJKChub25hZ2xlJlRDUF9OQUdMRV9DT1JLKSB8fAotCQkgKCFub25hZ2xlICYmCi0JCSAgdHAtPnBhY2tldHNfb3V0ICYmCi0JCSAgdGNwX21pbnNoYWxsX2NoZWNrKHRwKSkpKTsKLX0KLQotZXh0ZXJuIHZvaWQgdGNwX3NldF9za2JfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci0KLS8qIFRoaXMgY2hlY2tzIGlmIHRoZSBkYXRhIGJlYXJpbmcgcGFja2V0IFNLQiAodXN1YWxseSBzay0+c2tfc2VuZF9oZWFkKQotICogc2hvdWxkIGJlIHB1dCBvbiB0aGUgd2lyZSByaWdodCBub3cuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCB0Y3Bfc25kX3Rlc3Qoc3RydWN0IHNvY2sgKnNrLAotCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgdW5zaWduZWQgY3VyX21zcywgaW50IG5vbmFnbGUpCi17Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JaW50IHBrdHMgPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwotCi0JaWYgKCFwa3RzKSB7Ci0JCXRjcF9zZXRfc2tiX3Rzb19zZWdzKHNrLCBza2IpOwotCQlwa3RzID0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQl9Ci0KLQkvKglSRkMgMTEyMiAtIHNlY3Rpb24gNC4yLjMuNAotCSAqCi0JICoJV2UgbXVzdCBxdWV1ZSBpZgotCSAqCi0JICoJYSkgVGhlIHJpZ2h0IGVkZ2Ugb2YgdGhpcyBmcmFtZSBleGNlZWRzIHRoZSB3aW5kb3cKLQkgKgliKSBUaGVyZSBhcmUgcGFja2V0cyBpbiBmbGlnaHQgYW5kIHdlIGhhdmUgYSBzbWFsbCBzZWdtZW50Ci0JICoJICAgW1NXUyBhdm9pZGFuY2UgYW5kIE5hZ2xlIGFsZ29yaXRobV0KLQkgKgkgICAocGFydCBvZiBTV1MgaXMgZG9uZSBvbiBwYWNrZXRpemF0aW9uKQotCSAqCSAgIE1pbnNoYWxsIHZlcnNpb24gc291bmRzOiB0aGVyZSBhcmUgbm8gX3NtYWxsXwotCSAqCSAgIHNlZ21lbnRzIGluIGZsaWdodC4gKHRjcF9uYWdsZV9jaGVjaykKLQkgKgljKSBXZSBoYXZlIHRvbyBtYW55IHBhY2tldHMgJ2luIGZsaWdodCcKLQkgKgotCSAqIAlEb24ndCB1c2UgdGhlIG5hZ2xlIHJ1bGUgZm9yIHVyZ2VudCBkYXRhIChvcgotCSAqCWZvciB0aGUgZmluYWwgRklOIC1EYXZlTSkuCi0JICoKLQkgKglBbHNvLCBOYWdsZSBydWxlIGRvZXMgbm90IGFwcGx5IHRvIGZyYW1lcywgd2hpY2gKLQkgKglzaXQgaW4gdGhlIG1pZGRsZSBvZiBxdWV1ZSAodGhleSBoYXZlIG5vIGNoYW5jZXMKLQkgKgl0byBnZXQgbmV3IGRhdGEpIGFuZCBpZiByb29tIGF0IHRhaWwgb2Ygc2tiIGlzCi0JICoJbm90IGVub3VnaCB0byBzYXZlIHNvbWV0aGluZyBzZXJpb3VzbHkgKDwzMiBmb3Igbm93KS4KLQkgKi8KLQotCS8qIERvbid0IGJlIHN0cmljdCBhYm91dCB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgZm9yIHRoZQotCSAqIGZpbmFsIEZJTiBmcmFtZS4gIC1EYXZlTQotCSAqLwotCXJldHVybiAoKChub25hZ2xlJlRDUF9OQUdMRV9QVVNIKSB8fCB0cC0+dXJnX21vZGUKLQkJIHx8ICF0Y3BfbmFnbGVfY2hlY2sodHAsIHNrYiwgY3VyX21zcywgbm9uYWdsZSkpICYmCi0JCSgoKHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgKyAocGt0cy0xKSkgPCB0cC0+c25kX2N3bmQpIHx8Ci0JCSAoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfRklOKSkgJiYKLQkJIWFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCkpOwotfQotCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9jaGVja19wcm9iZV90aW1lcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7CiAJaWYgKCF0cC0+cGFja2V0c19vdXQgJiYgIXRwLT5wZW5kaW5nKQogCQl0Y3BfcmVzZXRfeG1pdF90aW1lcihzaywgVENQX1RJTUVfUFJPQkUwLCB0cC0+cnRvKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHRjcF9za2JfaXNfbGFzdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIHNrYi0+bmV4dCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmc2stPnNrX3dyaXRlX3F1ZXVlOwotfQotCi0vKiBQdXNoIG91dCBhbnkgcGVuZGluZyBmcmFtZXMgd2hpY2ggd2VyZSBoZWxkIGJhY2sgZHVlIHRvCi0gKiBUQ1BfQ09SSyBvciBhdHRlbXB0IGF0IGNvYWxlc2NpbmcgdGlueSBwYWNrZXRzLgotICogVGhlIHNvY2tldCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJIHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkJCQkgdW5zaWduZWQgY3VyX21zcywKLQkJCQkJCSBpbnQgbm9uYWdsZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQotCWlmIChza2IpIHsKLQkJaWYgKCF0Y3Bfc2tiX2lzX2xhc3Qoc2ssIHNrYikpCi0JCQlub25hZ2xlID0gVENQX05BR0xFX1BVU0g7Ci0JCWlmICghdGNwX3NuZF90ZXN0KHNrLCBza2IsIGN1cl9tc3MsIG5vbmFnbGUpIHx8Ci0JCSAgICB0Y3Bfd3JpdGVfeG1pdChzaywgbm9uYWdsZSkpCi0JCQl0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc2ssIHRwKTsKLQl9Ci0JdGNwX2N3bmRfdmFsaWRhdGUoc2ssIHRwKTsKLX0KLQogc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSAgICAgICBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewogCV9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHRwLCB0Y3BfY3VycmVudF9tc3Moc2ssIDEpLCB0cC0+bm9uYWdsZSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB0Y3BfbWF5X3NlbmRfbm93KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQotCXJldHVybiAoc2tiICYmCi0JCXRjcF9zbmRfdGVzdChzaywgc2tiLCB0Y3BfY3VycmVudF9tc3Moc2ssIDEpLAotCQkJICAgICB0Y3Bfc2tiX2lzX2xhc3Qoc2ssIHNrYikgPyBUQ1BfTkFHTEVfUFVTSCA6IHRwLT5ub25hZ2xlKSk7Ci19Ci0KIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2luaXRfd2woc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHNlcSkKIHsKIAl0cC0+c25kX3dsMSA9IHNlcTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3gyNWRldmljZS5oIGIvaW5jbHVkZS9uZXQveDI1ZGV2aWNlLmgKaW5kZXggY2YzNmEyMC4uZDQ1YWU4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQveDI1ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9uZXQveDI1ZGV2aWNlLmgKQEAgLTUsOCArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgeDI1X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIF9fYmUxNiB4MjVfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKIAlza2ItPmlucHV0X2RldiA9IHNrYi0+ZGV2ID0gZGV2OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvY3MuaCBiL2luY2x1ZGUvcGNtY2lhL2NzLmgKaW5kZXggYjQyZGRjMC4uMmNhYjM5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvY3MuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9jcy5oCkBAIC02OCwyMSArNjgsOSBAQAogI2RlZmluZSBSRVNfQUxMT0NBVEVECQkJMHgyMAogI2RlZmluZSBSRVNfUkVNT1ZFRAkJCTB4NDAKIAotdHlwZWRlZiBzdHJ1Y3Qgc2VydmluZm9fdCB7Ci0gICAgY2hhcglTaWduYXR1cmVbMl07Ci0gICAgdV9pbnQJQ291bnQ7Ci0gICAgdV9pbnQJUmV2aXNpb247Ci0gICAgdV9pbnQJQ1NMZXZlbDsKLSAgICBjaGFyCSpWZW5kb3JTdHJpbmc7Ci19IHNlcnZpbmZvX3Q7Ci0KIHR5cGVkZWYgc3RydWN0IGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCB7Ci0gICAgY2xpZW50X2hhbmRsZV90IGNsaWVudF9oYW5kbGU7Ci0gICAgdm9pZAkqaW5mbzsKLSAgICB2b2lkCSptdGRyZXF1ZXN0OwotICAgIHZvaWQJKmJ1ZmZlcjsKLSAgICB2b2lkCSptaXNjOwotICAgIHZvaWQJKmNsaWVudF9kYXRhOworCXN0cnVjdCBwY21jaWFfZGV2aWNlCSpjbGllbnRfaGFuZGxlOworCXZvaWQJCQkqY2xpZW50X2RhdGE7CiB9IGV2ZW50X2NhbGxiYWNrX2FyZ3NfdDsKIAogLyogZm9yIEdldENvbmZpZ3VyYXRpb25JbmZvICovCkBAIC0zOTMsMjUgKzM4MSwyNSBAQAogCiBzdHJ1Y3QgcGNtY2lhX3NvY2tldDsKIAotaW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBjb25mX3JlZ190ICpyZWcpOwotaW50IHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChjbGllbnRfaGFuZGxlX3QgaGFuZGxlKTsKLWludCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBjb25maWdfaW5mb190ICpjb25maWcpOworaW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNvbmZfcmVnX3QgKnJlZyk7CitpbnQgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CitpbnQgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjb25maWdfaW5mb190ICpjb25maWcpOwogaW50IHBjbWNpYV9nZXRfZmlyc3Rfd2luZG93KHdpbmRvd19oYW5kbGVfdCAqd2luLCB3aW5fcmVxX3QgKnJlcSk7CiBpbnQgcGNtY2lhX2dldF9uZXh0X3dpbmRvdyh3aW5kb3dfaGFuZGxlX3QgKndpbiwgd2luX3JlcV90ICpyZXEpOwotaW50IHBjbWNpYV9nZXRfc3RhdHVzKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNzX3N0YXR1c190ICpzdGF0dXMpOworaW50IHBjbWNpYV9nZXRfc3RhdHVzKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgY3Nfc3RhdHVzX3QgKnN0YXR1cyk7CiBpbnQgcGNtY2lhX2dldF9tZW1fcGFnZSh3aW5kb3dfaGFuZGxlX3Qgd2luLCBtZW1yZXFfdCAqcmVxKTsKIGludCBwY21jaWFfbWFwX21lbV9wYWdlKHdpbmRvd19oYW5kbGVfdCB3aW4sIG1lbXJlcV90ICpyZXEpOwotaW50IHBjbWNpYV9tb2RpZnlfY29uZmlndXJhdGlvbihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBtb2Rjb25mX3QgKm1vZCk7CitpbnQgcGNtY2lhX21vZGlmeV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgbW9kY29uZl90ICptb2QpOwogaW50IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoY2xpZW50X2hhbmRsZV90ICpoYW5kbGUsIGNsaWVudF9yZWdfdCAqcmVxKTsKLWludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUpOwotaW50IHBjbWNpYV9yZWxlYXNlX2lvKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlvX3JlcV90ICpyZXEpOwotaW50IHBjbWNpYV9yZWxlYXNlX2lycShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpcnFfcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOworaW50IHBjbWNpYV9yZWxlYXNlX2lvKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaW9fcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlbGVhc2VfaXJxKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaXJxX3JlcV90ICpyZXEpOwogaW50IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyh3aW5kb3dfaGFuZGxlX3Qgd2luKTsKLWludCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNvbmZpZ19yZXFfdCAqcmVxKTsKLWludCBwY21jaWFfcmVxdWVzdF9pbyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpb19yZXFfdCAqcmVxKTsKLWludCBwY21jaWFfcmVxdWVzdF9pcnEoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaXJxX3JlcV90ICpyZXEpOwotaW50IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhjbGllbnRfaGFuZGxlX3QgKmhhbmRsZSwgd2luX3JlcV90ICpyZXEsIHdpbmRvd19oYW5kbGVfdCAqd2gpOwotaW50IHBjbWNpYV9yZXNldF9jYXJkKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNsaWVudF9yZXFfdCAqcmVxKTsKK2ludCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgY29uZmlnX3JlcV90ICpyZXEpOworaW50IHBjbWNpYV9yZXF1ZXN0X2lvKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaW9fcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlcXVlc3RfaXJxKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaXJxX3JlcV90ICpyZXEpOworaW50IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqKnBfZGV2LCB3aW5fcmVxX3QgKnJlcSwgd2luZG93X2hhbmRsZV90ICp3aCk7CitpbnQgcGNtY2lhX3Jlc2V0X2NhcmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjbGllbnRfcmVxX3QgKnJlcSk7CiBpbnQgcGNtY2lhX3N1c3BlbmRfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKIGludCBwY21jaWFfcmVzdW1lX2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7CiBpbnQgcGNtY2lhX2VqZWN0X2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9jc190eXBlcy5oIGIvaW5jbHVkZS9wY21jaWEvY3NfdHlwZXMuaAppbmRleCA3ODgxZDQwLi5jMWQxNjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9jc190eXBlcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2NzX3R5cGVzLmgKQEAgLTM0LDggKzM0LDggQEAKIHR5cGVkZWYgdV9jaGFyCWNpc2RhdGFfdDsKIHR5cGVkZWYgdV9zaG9ydAlwYWdlX3Q7CiAKLXN0cnVjdCBjbGllbnRfdDsKLXR5cGVkZWYgc3RydWN0IGNsaWVudF90ICpjbGllbnRfaGFuZGxlX3Q7CitzdHJ1Y3QgcGNtY2lhX2RldmljZTsKK3R5cGVkZWYgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmNsaWVudF9oYW5kbGVfdDsKIAogc3RydWN0IHdpbmRvd190OwogdHlwZWRlZiBzdHJ1Y3Qgd2luZG93X3QgKndpbmRvd19oYW5kbGVfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL2RzLmggYi9pbmNsdWRlL3BjbWNpYS9kcy5oCmluZGV4IDJiNTI1NTMuLmI3MDdhNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL2RzLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvZHMuaApAQCAtMTYsMTAgKzE2LDEzIEBACiAjaWZuZGVmIF9MSU5VWF9EU19ICiAjZGVmaW5lIF9MSU5VWF9EU19ICiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHBjbWNpYS9idWxrbWVtLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RldmljZV9pZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogCiB0eXBlZGVmIHN0cnVjdCB0dXBsZV9wYXJzZV90IHsKICAgICB0dXBsZV90CQl0dXBsZTsKQEAgLTQ5LDcgKzUyLDYgQEAKIH0gbXRkX2luZm9fdDsKIAogdHlwZWRlZiB1bmlvbiBkc19pb2N0bF9hcmdfdCB7Ci0gICAgc2VydmluZm9fdAkJc2VydmluZm87CiAgICAgYWRqdXN0X3QJCWFkanVzdDsKICAgICBjb25maWdfaW5mb190CWNvbmZpZzsKICAgICB0dXBsZV90CQl0dXBsZTsKQEAgLTY1LDcgKzY3LDYgQEAKICAgICBjaXNkdW1wX3QJCWNpc2R1bXA7CiB9IGRzX2lvY3RsX2FyZ190OwogCi0jZGVmaW5lIERTX0dFVF9DQVJEX1NFUlZJQ0VTX0lORk8JX0lPUiAoJ2QnLCAxLCBzZXJ2aW5mb190KQogI2RlZmluZSBEU19BREpVU1RfUkVTT1VSQ0VfSU5GTwkJX0lPV1IoJ2QnLCAyLCBhZGp1c3RfdCkKICNkZWZpbmUgRFNfR0VUX0NPTkZJR1VSQVRJT05fSU5GTwlfSU9XUignZCcsIDMsIGNvbmZpZ19pbmZvX3QpCiAjZGVmaW5lIERTX0dFVF9GSVJTVF9UVVBMRQkJX0lPV1IoJ2QnLCA0LCB0dXBsZV90KQpAQCAtMTMzLDYgKzEzNCw4IEBACiAKIHN0cnVjdCBwY21jaWFfZHJpdmVyIHsKIAlkZXZfbGlua190CQkqKCphdHRhY2gpKHZvaWQpOworCWludCAoKmV2ZW50KQkJKGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCQkgZXZlbnRfY2FsbGJhY2tfYXJnc190ICopOwogCXZvaWQJCQkoKmRldGFjaCkoZGV2X2xpbmtfdCAqKTsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQJKmlkX3RhYmxlOwpAQCAtMTU5LDE2ICsxNjIsOCBAQAogCS8qIGRlcHJlY2F0ZWQsIGEgY2xlYW5lZCB1cCB2ZXJzaW9uIHdpbGwgYmUgbW92ZWQgaW50byB0aGlzCiAJICAgc3RydWN0IHNvb24gKi8KIAlkZXZfbGlua190CQkqaW5zdGFuY2U7Ci0Jc3RydWN0IGNsaWVudF90IHsKLQkJdV9zaG9ydAkJCWNsaWVudF9tYWdpYzsKLQkJc3RydWN0IHBjbWNpYV9zb2NrZXQJKlNvY2tldDsKLQkJdV9jaGFyCQkJRnVuY3Rpb247Ci0JCXVfaW50CQkJc3RhdGU7Ci0JCWV2ZW50X3QJCQlFdmVudE1hc2s7Ci0JCWludCAoKmV2ZW50X2hhbmRsZXIpCShldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCi0JCQkJCSBldmVudF9jYWxsYmFja19hcmdzX3QgKik7Ci0JCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAJZXZlbnRfY2FsbGJhY2tfYXJnczsKLQl9CQkJY2xpZW50OworCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAJZXZlbnRfY2FsbGJhY2tfYXJnczsKKwl1X2ludAkJCXN0YXRlOwogCiAJLyogaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXZpY2UgKi8KIAl1OAkJCWhhc19tYW5mX2lkOjE7CkBAIC0xOTMsOCArMTg4LDggQEAKICNkZWZpbmUgdG9fcGNtY2lhX2RldihuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IHBjbWNpYV9kZXZpY2UsIGRldikKICNkZWZpbmUgdG9fcGNtY2lhX2RydihuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IHBjbWNpYV9kcml2ZXIsIGRydikKIAotI2RlZmluZSBoYW5kbGVfdG9fcGRldihoYW5kbGUpIGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCBwY21jaWFfZGV2aWNlLCBjbGllbnQpOwotI2RlZmluZSBoYW5kbGVfdG9fZGV2KGhhbmRsZSkgKChjb250YWluZXJfb2YoaGFuZGxlLCBzdHJ1Y3QgcGNtY2lhX2RldmljZSwgY2xpZW50KSktPmRldikKKyNkZWZpbmUgaGFuZGxlX3RvX3BkZXYoaGFuZGxlKSAoaGFuZGxlKQorI2RlZmluZSBoYW5kbGVfdG9fZGV2KGhhbmRsZSkgKGhhbmRsZS0+ZGV2KQogCiAvKiBlcnJvciByZXBvcnRpbmcgKi8KIHZvaWQgY3NfZXJyb3IoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW50IGZ1bmMsIGludCByZXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvdmVyc2lvbi5oIGIvaW5jbHVkZS9wY21jaWEvdmVyc2lvbi5oCmluZGV4IGViODgyNjMuLjVhZDljNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL3BjbWNpYS92ZXJzaW9uLmgKQEAgLTEsNCArMSwzIEBACiAvKiB2ZXJzaW9uLmggMS45NCAyMDAwLzEwLzAzIDE3OjU1OjQ4IChEYXZpZCBIaW5kcykgKi8KIAotI2RlZmluZSBDU19SRUxFQVNFICIzLjEuMjIiCi0jZGVmaW5lIENTX1JFTEVBU0VfQ09ERSAweDMxMTYKKy8qIFRoaXMgZmlsZSB3aWxsIGJlIHJlbW92ZWQsIHBsZWFzZSBkb24ndCBpbmNsdWRlIGl0ICovCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggYjEwOTFkNy4uNzU3NTVlZiAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMTc0LDcgKzE3NCw3IEBACiAKIGNvbmZpZyBBVURJVFNZU0NBTEwKIAlib29sICJFbmFibGUgc3lzdGVtLWNhbGwgYXVkaXRpbmcgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFVRElUICYmIChYODYgfHwgUFBDIHx8IFBQQzY0IHx8IEFSQ0hfUzM5MCB8fCBJQTY0IHx8IFVNTCkKKwlkZXBlbmRzIG9uIEFVRElUICYmIChYODYgfHwgUFBDIHx8IFBQQzY0IHx8IEFSQ0hfUzM5MCB8fCBJQTY0IHx8IFVNTCB8fCBTUEFSQzY0KQogCWRlZmF1bHQgeSBpZiBTRUNVUklUWV9TRUxJTlVYCiAJaGVscAogCSAgRW5hYmxlIGxvdy1vdmVyaGVhZCBzeXN0ZW0tY2FsbCBhdWRpdGluZyBpbmZyYXN0cnVjdHVyZSB0aGF0CmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50cy5jIGIvaW5pdC9kb19tb3VudHMuYwppbmRleCBiNzU3MGMwLi4xYjAyYmU3IDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50cy5jCisrKyBiL2luaXQvZG9fbW91bnRzLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mc19zYi5oPgpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuaCBiL2luaXQvZG9fbW91bnRzLmgKaW5kZXggZGU5MmJlZS4uZTBhN2FjOSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuaAorKysgYi9pbml0L2RvX21vdW50cy5oCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KIAotZGV2X3QgbmFtZV90b19kZXZfdChjaGFyICpuYW1lKTsKIHZvaWQgIGNoYW5nZV9mbG9wcHkoY2hhciAqZm10LCAuLi4pOwogdm9pZCAgbW91bnRfYmxvY2tfcm9vdChjaGFyICpuYW1lLCBpbnQgZmxhZ3MpOwogdm9pZCAgbW91bnRfcm9vdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2lwYy9jb21wYXQuYyBiL2lwYy9jb21wYXQuYwppbmRleCA3MGU0ZTRlLi4zODgxZDU2IDEwMDY0NAotLS0gYS9pcGMvY29tcGF0LmMKKysrIGIvaXBjL2NvbXBhdC5jCkBAIC01NzIsNiArNTcyLDcgQEAKIAllcnIgfD0gX19wdXRfdXNlcihzbWktPnNobW1uaSwgJnVwLT5zaG1tbmkpOwogCWVyciB8PSBfX3B1dF91c2VyKHNtaS0+c2htc2VnLCAmdXAtPnNobXNlZyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoc21pLT5zaG1hbGwsICZ1cC0+c2htYWxsKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwdXRfY29tcGF0X3NobV9pbmZvKHN0cnVjdCBzaG1faW5mbyBfX3VzZXIgKmlwLApkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuaCBiL2lwYy91dGlsLmgKaW5kZXggMDdkNjg5NC4uNDQzNDhjYSAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuaAorKysgYi9pcGMvdXRpbC5oCkBAIC02Nyw3ICs2Nyw3IEBACiB2b2lkIGtlcm5lbF90b19pcGM2NF9wZXJtKHN0cnVjdCBrZXJuX2lwY19wZXJtICppbiwgc3RydWN0IGlwYzY0X3Blcm0gKm91dCk7CiB2b2lkIGlwYzY0X3Blcm1fdG9faXBjX3Blcm0oc3RydWN0IGlwYzY0X3Blcm0gKmluLCBzdHJ1Y3QgaXBjX3Blcm0gKm91dCk7CiAKLSNpZiBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19ocHBhX18pCisjaWYgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSB8fCBkZWZpbmVkKF9fWFRFTlNBX18pCiAgIC8qIE9uIElBLTY0LCB3ZSBhbHdheXMgdXNlIHRoZSAiNjQtYml0IHZlcnNpb24iIG9mIHRoZSBJUEMgc3RydWN0dXJlcy4gICovIAogIyBkZWZpbmUgaXBjX3BhcnNlX3ZlcnNpb24oY21kKQlJUENfNjQKICNlbHNlCmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCBjZGVmNmNlLi5iNjUxODdmIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTIwOCw4ICsyMDgsMTAgQEAKIAkJc3RydWN0IGZpbGUgKmZpbGU7CiAKIAkJaWYgKG1wbnQtPnZtX2ZsYWdzICYgVk1fRE9OVENPUFkpIHsKKwkJCWxvbmcgcGFnZXMgPSB2bWFfcGFnZXMobXBudCk7CisJCQltbS0+dG90YWxfdm0gLT0gcGFnZXM7CiAJCQlfX3ZtX3N0YXRfYWNjb3VudChtbSwgbXBudC0+dm1fZmxhZ3MsIG1wbnQtPnZtX2ZpbGUsCi0JCQkJCQkJLXZtYV9wYWdlcyhtcG50KSk7CisJCQkJCQkJCS1wYWdlcyk7CiAJCQljb250aW51ZTsKIAkJfQogCQljaGFyZ2UgPSAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggOTBjMGU4Mi4uYjAyMzcxMiAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC01NzQsNyArNTc0LDcgQEAKIAkJSU5JVF9ITElTVF9IRUFEKCZrcmV0cHJvYmVfaW5zdF90YWJsZVtpXSk7CiAJfQogCi0JZXJyID0gYXJjaF9pbml0KCk7CisJZXJyID0gYXJjaF9pbml0X2twcm9iZXMoKTsKIAlpZiAoIWVycikKIAkJZXJyID0gcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZrcHJvYmVfZXhjZXB0aW9uc19uYik7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9kaXNrLmMgYi9rZXJuZWwvcG93ZXIvZGlzay5jCmluZGV4IGZiOGRlNjMuLjNlYzc4OWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9kaXNrLmMKKysrIGIva2VybmVsL3Bvd2VyL2Rpc2suYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorCiAjaW5jbHVkZSAicG93ZXIuaCIKIAogCkBAIC0yMzQsNiArMjM2LDE2IEBACiB7CiAJaW50IGVycm9yOwogCisJaWYgKCFzd3N1c3BfcmVzdW1lX2RldmljZSkgeworCQlpZiAoIXN0cmxlbihyZXN1bWVfZmlsZSkpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJc3dzdXNwX3Jlc3VtZV9kZXZpY2UgPSBuYW1lX3RvX2Rldl90KHJlc3VtZV9maWxlKTsKKwkJcHJfZGVidWcoInN3c3VzcDogUmVzdW1lIEZyb20gUGFydGl0aW9uICVzXG4iLCByZXN1bWVfZmlsZSk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoInN3c3VzcDogUmVzdW1lIEZyb20gUGFydGl0aW9uICVkOiVkXG4iLAorCQkJIE1BSk9SKHN3c3VzcF9yZXN1bWVfZGV2aWNlKSwgTUlOT1Ioc3dzdXNwX3Jlc3VtZV9kZXZpY2UpKTsKKwl9CisKIAlpZiAobm9yZXN1bWUpIHsKIAkJLyoqCiAJCSAqIEZJWE1FOiBJZiBub3Jlc3VtZSBpcyBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gZmluZCB0aGUgcGFydGl0aW9uCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvbWFpbi5jIGIva2VybmVsL3Bvd2VyL21haW4uYwppbmRleCBjOTRjYjllLi43MWFhMGZkIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvbWFpbi5jCisrKyBiL2tlcm5lbC9wb3dlci9tYWluLmMKQEAgLTE5LDYgKzE5LDkgQEAKIAogI2luY2x1ZGUgInBvd2VyLmgiCiAKKy8qVGhpcyBpcyBqdXN0IGFuIGFyYml0cmFyeSBudW1iZXIgKi8KKyNkZWZpbmUgRlJFRV9QQUdFX05VTUJFUiAoMTAwKQorCiBERUNMQVJFX01VVEVYKHBtX3NlbSk7CiAKIHN0cnVjdCBwbV9vcHMgKiBwbV9vcHMgPSBOVUxMOwpAQCAtNDksNiArNTIsNyBAQAogc3RhdGljIGludCBzdXNwZW5kX3ByZXBhcmUoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQogewogCWludCBlcnJvciA9IDA7CisJdW5zaWduZWQgaW50IGZyZWVfcGFnZXM7CiAKIAlpZiAoIXBtX29wcyB8fCAhcG1fb3BzLT5lbnRlcikKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTY3LDYgKzcxLDE2IEBACiAJCWdvdG8gVGhhdzsKIAl9CiAKKwlpZiAoKGZyZWVfcGFnZXMgPSBucl9mcmVlX3BhZ2VzKCkpIDwgRlJFRV9QQUdFX05VTUJFUikgeworCQlwcl9kZWJ1ZygiUE06IGZyZWUgc29tZSBtZW1vcnlcbiIpOworCQlzaHJpbmtfYWxsX21lbW9yeShGUkVFX1BBR0VfTlVNQkVSIC0gZnJlZV9wYWdlcyk7CisJCWlmIChucl9mcmVlX3BhZ2VzKCkgPCBGUkVFX1BBR0VfTlVNQkVSKSB7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlwcmludGsoS0VSTl9FUlIgIlBNOiBObyBlbm91Z2ggbWVtb3J5XG4iKTsKKwkJCWdvdG8gVGhhdzsKKwkJfQorCX0KKwogCWlmIChwbV9vcHMtPnByZXBhcmUpIHsKIAkJaWYgKChlcnJvciA9IHBtX29wcy0+cHJlcGFyZShzdGF0ZSkpKQogCQkJZ290byBUaGF3OwpAQCAtMTk0LDcgKzIwOCw3IEBACiAKIGludCBwbV9zdXNwZW5kKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKLQlpZiAoc3RhdGUgPiBQTV9TVVNQRU5EX09OICYmIHN0YXRlIDwgUE1fU1VTUEVORF9NQVgpCisJaWYgKHN0YXRlID4gUE1fU1VTUEVORF9PTiAmJiBzdGF0ZSA8PSBQTV9TVVNQRU5EX01BWCkKIAkJcmV0dXJuIGVudGVyX3N0YXRlKHN0YXRlKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMgYi9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jCmluZGV4IDBhMDg2NjQuLjNiZDBkMjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKKysrIGIva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYwpAQCAtNTksNiArNTksNyBAQAogCWludCB0b2RvOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcmludGsoICJTdG9wcGluZyB0YXNrczogIiApOwogCXN0YXJ0X3RpbWUgPSBqaWZmaWVzOwpAQCAtNjYsMTIgKzY3LDkgQEAKIAkJdG9kbyA9IDA7CiAJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCQlpZiAoIWZyZWV6ZWFibGUocCkpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoKGZyb3plbihwKSkgfHwKLQkJCSAgICAocC0+c3RhdGUgPT0gVEFTS19UUkFDRUQpIHx8Ci0JCQkgICAgKHAtPnN0YXRlID09IFRBU0tfU1RPUFBFRCkpCisJCQlpZiAoZnJvemVuKHApKQogCQkJCWNvbnRpbnVlOwogCiAJCQlmcmVlemUocCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3dzdXNwLmMgYi9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKaW5kZXggYzI4NWZjNS4uZjJiYzcxYiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N3c3VzcC5jCisrKyBiL2tlcm5lbC9wb3dlci9zd3N1c3AuYwpAQCAtNjMsNiArNjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC04NjksMTMgKzg3MCw2IEBACiAKIGFzbWxpbmthZ2UgaW50IHN3c3VzcF9zYXZlKHZvaWQpCiB7Ci0JaW50IGVycm9yID0gMDsKLQotCWlmICgoZXJyb3IgPSBzd3N1c3Bfc3dhcF9jaGVjaygpKSkgewotCQlwcmludGsoS0VSTl9FUlIgInN3c3VzcDogRkFUQUw6IGNhbm5vdCBmaW5kIHN3YXAgZGV2aWNlLCB0cnkgIgotCQkJCSJzd2Fwb24gLWEhXG4iKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KIAlyZXR1cm4gc3VzcGVuZF9wcmVwYXJlX2ltYWdlKCk7CiB9CiAKQEAgLTg5MiwxNCArODg2LDIwIEBACiAJICogYXQgcmVzdW1lIHRpbWUsIGFuZCBldmlsIHdlaXJkbmVzcyBlbnN1ZXMuCiAJICovCiAJaWYgKChlcnJvciA9IGRldmljZV9wb3dlcl9kb3duKFBNU0dfRlJFRVpFKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTb21lIGRldmljZXMgZmFpbGVkIHRvIHBvd2VyIGRvd24sIGFib3J0aW5nIHN1c3BlbmRcbiIpOwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCXN3c3VzcF9mcmVlKCk7CiAJCXJldHVybiBlcnJvcjsKIAl9CisKKwlpZiAoKGVycm9yID0gc3dzdXNwX3N3YXBfY2hlY2soKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IEZBVEFMOiBjYW5ub3QgZmluZCBzd2FwIGRldmljZSwgdHJ5ICIKKwkJCQkic3dhcG9uIC1hIVxuIik7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwogCXNhdmVfcHJvY2Vzc29yX3N0YXRlKCk7CiAJaWYgKChlcnJvciA9IHN3c3VzcF9hcmNoX3N1c3BlbmQoKSkpCi0JCXN3c3VzcF9mcmVlKCk7CisJCXByaW50aygiRXJyb3IgJWQgc3VzcGVuZGluZ1xuIiwgZXJyb3IpOwogCS8qIFJlc3RvcmUgY29udHJvbCBmbG93IG1hZ2ljYWxseSBhcHBlYXJzIGhlcmUgKi8KIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwogCUJVR19PTiAobnJfY29weV9wYWdlc19jaGVjayAhPSBucl9jb3B5X3BhZ2VzKTsKQEAgLTExNjYsOSArMTE2Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIHNhbml0eV9jaGVjayh2b2lkKQogewogCWR1bXBfaW5mbygpOwotCWlmKHN3c3VzcF9pbmZvLnZlcnNpb25fY29kZSAhPSBMSU5VWF9WRVJTSU9OX0NPREUpCisJaWYgKHN3c3VzcF9pbmZvLnZlcnNpb25fY29kZSAhPSBMSU5VWF9WRVJTSU9OX0NPREUpCiAJCXJldHVybiAia2VybmVsIHZlcnNpb24iOwotCWlmKHN3c3VzcF9pbmZvLm51bV9waHlzcGFnZXMgIT0gbnVtX3BoeXNwYWdlcykKKwlpZiAoc3dzdXNwX2luZm8ubnVtX3BoeXNwYWdlcyAhPSBudW1fcGh5c3BhZ2VzKQogCQlyZXR1cm4gIm1lbW9yeSBzaXplIjsKIAlpZiAoc3RyY21wKHN3c3VzcF9pbmZvLnV0cy5zeXNuYW1lLHN5c3RlbV91dHNuYW1lLnN5c25hbWUpKQogCQlyZXR1cm4gInN5c3RlbSB0eXBlIjsKQEAgLTEyNjEsOCArMTI2MSw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1leHRlcm4gZGV2X3QgbmFtZV90b19kZXZfdChjb25zdCBjaGFyICpsaW5lKTsKLQogLyoqCiAgKglyZWFkX3BhZ2VkaXIgLSBSZWFkIHBhZ2UgYmFja3VwIGxpc3QgcGFnZXMgZnJvbSBzd2FwCiAgKi8KQEAgLTEzNTYsMTYgKzEzNTQsNiBAQAogewogCWludCBlcnJvcjsKIAotCWlmICghc3dzdXNwX3Jlc3VtZV9kZXZpY2UpIHsKLQkJaWYgKCFzdHJsZW4ocmVzdW1lX2ZpbGUpKQotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCXN3c3VzcF9yZXN1bWVfZGV2aWNlID0gbmFtZV90b19kZXZfdChyZXN1bWVfZmlsZSk7Ci0JCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlc1xuIiwgcmVzdW1lX2ZpbGUpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlZDolZFxuIiwKLQkJCSBNQUpPUihzd3N1c3BfcmVzdW1lX2RldmljZSksIE1JTk9SKHN3c3VzcF9yZXN1bWVfZGV2aWNlKSk7Ci0JfQotCiAJcmVzdW1lX2JkZXYgPSBvcGVuX2J5X2Rldm51bShzd3N1c3BfcmVzdW1lX2RldmljZSwgRk1PREVfUkVBRCk7CiAJaWYgKCFJU19FUlIocmVzdW1lX2JkZXYpKSB7CiAJCXNldF9ibG9ja3NpemUocmVzdW1lX2JkZXYsIFBBR0VfU0laRSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCBhZDhjYmI3Li5mODkyNDhlIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTM1LDExICszNSwxMSBAQAogI2RlZmluZSBOUl9QUk9GSUxFX0dSUAkJKE5SX1BST0ZJTEVfSElUL1BST0ZJTEVfR1JQU1opCiAKIC8qIE9wcm9maWxlIHRpbWVyIHRpY2sgaG9vayAqLwotaW50ICgqdGltZXJfaG9vaykoc3RydWN0IHB0X3JlZ3MgKik7CitpbnQgKCp0aW1lcl9ob29rKShzdHJ1Y3QgcHRfcmVncyAqKSBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgYXRvbWljX3QgKnByb2ZfYnVmZmVyOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJvZl9sZW4sIHByb2Zfc2hpZnQ7Ci1zdGF0aWMgaW50IHByb2Zfb247CitzdGF0aWMgaW50IHByb2Zfb24gX19yZWFkX21vc3RseTsKIHN0YXRpYyBjcHVtYXNrX3QgcHJvZl9jcHVfbWFzayA9IENQVV9NQVNLX0FMTDsKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHByb2ZpbGVfaGl0ICpbMl0sIGNwdV9wcm9maWxlX2hpdHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCA1ZjIxODJkLi40MTA3ZGIwIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtMzg3Nyw2ICszODc3LDEzIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2NvbmRfcmVzY2hlZCh2b2lkKQogeworCS8qCisJICogVGhlIEJLUyBtaWdodCBiZSByZWFjcXVpcmVkIGJlZm9yZSB3ZSBoYXZlIGRyb3BwZWQKKwkgKiBQUkVFTVBUX0FDVElWRSwgd2hpY2ggY291bGQgdHJpZ2dlciBhIHNlY29uZAorCSAqIGNvbmRfcmVzY2hlZCgpIGNhbGwuCisJICovCisJaWYgKHVubGlrZWx5KHByZWVtcHRfY291bnQoKSkpCisJCXJldHVybjsKIAlkbyB7CiAJCWFkZF9wcmVlbXB0X2NvdW50KFBSRUVNUFRfQUNUSVZFKTsKIAkJc2NoZWR1bGUoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNfbmkuYyBiL2tlcm5lbC9zeXNfbmkuYwppbmRleCAyOTE5NmNlLi40MmI0MGFlIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzX25pLmMKKysrIGIva2VybmVsL3N5c19uaS5jCkBAIC04MCw2ICs4MCw5IEBACiBjb25kX3N5c2NhbGwoY29tcGF0X3N5c19rZXljdGwpOwogY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfc29ja2V0Y2FsbCk7CiBjb25kX3N5c2NhbGwoc3lzX3NldF96b25lX3JlY2xhaW0pOworY29uZF9zeXNjYWxsKHN5c19pbm90aWZ5X2luaXQpOworY29uZF9zeXNjYWxsKHN5c19pbm90aWZ5X2FkZF93YXRjaCk7Citjb25kX3N5c2NhbGwoc3lzX2lub3RpZnlfcm1fd2F0Y2gpOwogCiAvKiBhcmNoLXNwZWNpZmljIHdlYWsgc3lzY2FsbCBlbnRyaWVzICovCiBjb25kX3N5c2NhbGwoc3lzX3BjaWNvbmZpZ19yZWFkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCAyNzBlZTdmLi5lNjBiOWMzIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC0xNDYsNiArMTQ2LDkgQEAKICNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKIGV4dGVybiBjdGxfdGFibGUgcHR5X3RhYmxlW107CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfSU5PVElGWQorZXh0ZXJuIGN0bF90YWJsZSBpbm90aWZ5X3RhYmxlW107CisjZW5kaWYKIAogI2lmZGVmIEhBVkVfQVJDSF9QSUNLX01NQVBfTEFZT1VUCiBpbnQgc3lzY3RsX2xlZ2FjeV92YV9sYXlvdXQ7CkBAIC0yMTgsNiArMjIxLDcgQEAKIAkJLm1vZGUJCT0gMDU1NSwKIAkJLmNoaWxkCQk9IGRldl90YWJsZSwKIAl9LAorCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTk1MCw2ICs5NTQsMTQgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCX0sCisjaWZkZWYgQ09ORklHX0lOT1RJRlkKKwl7CisJCS5jdGxfbmFtZQk9IEZTX0lOT1RJRlksCisJCS5wcm9jbmFtZQk9ICJpbm90aWZ5IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGlub3RpZnlfdGFibGUsCisJfSwKKyNlbmRpZgkKICNlbmRpZgogCXsKIAkJLmN0bF9uYW1lCT0gS0VSTl9TRVRVSURfRFVNUEFCTEUsCkBAIC05NjgsNyArOTgwLDcgQEAKIAogc3RhdGljIGN0bF90YWJsZSBkZXZfdGFibGVbXSA9IHsKIAl7IC5jdGxfbmFtZSA9IDAgfQotfTsgIAorfTsKIAogZXh0ZXJuIHZvaWQgaW5pdF9pcnFfcHJvYyAodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jCmluZGV4IDczNDU3NWQuLjg5ZTU2MmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyLmMKKysrIGIva2VybmVsL3VzZXIuYwpAQCAtMTIwLDYgKzEyMCwxMCBAQAogCQlhdG9taWNfc2V0KCZuZXctPnByb2Nlc3NlcywgMCk7CiAJCWF0b21pY19zZXQoJm5ldy0+ZmlsZXMsIDApOwogCQlhdG9taWNfc2V0KCZuZXctPnNpZ3BlbmRpbmcsIDApOworI2lmZGVmIENPTkZJR19JTk9USUZZCisJCWF0b21pY19zZXQoJm5ldy0+aW5vdGlmeV93YXRjaGVzLCAwKTsKKwkJYXRvbWljX3NldCgmbmV3LT5pbm90aWZ5X2RldnMsIDApOworI2VuZGlmCiAKIAkJbmV3LT5tcV9ieXRlcyA9IDA7CiAJCW5ldy0+bG9ja2VkX3NobSA9IDA7CmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCAwNGQ2NjQzLi4xMGJlZDFjIDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTU4LDcgKzU4LDcgQEAKICNkZWZpbmUgUkFESVhfVFJFRV9JTkRFWF9CSVRTICAoOCAvKiBDSEFSX0JJVCAqLyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKICNkZWZpbmUgUkFESVhfVFJFRV9NQVhfUEFUSCAoUkFESVhfVFJFRV9JTkRFWF9CSVRTL1JBRElYX1RSRUVfTUFQX1NISUZUICsgMikKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVpZ2h0X3RvX21heGluZGV4W1JBRElYX1RSRUVfTUFYX1BBVEhdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVpZ2h0X3RvX21heGluZGV4W1JBRElYX1RSRUVfTUFYX1BBVEhdIF9fcmVhZF9tb3N0bHk7CiAKIC8qCiAgKiBSYWRpeCB0cmVlIG5vZGUgY2FjaGUuCmRpZmYgLS1naXQgYS9tbS9maWxlbWFwX3hpcC5jIGIvbW0vZmlsZW1hcF94aXAuYwppbmRleCAzYjZlMzg0Li40NTUzYjJjIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwX3hpcC5jCisrKyBiL21tL2ZpbGVtYXBfeGlwLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCQkJCQkgYWRkcmVzcyk7CiAJCWlmICghSVNfRVJSKHB0ZSkpIHsKIAkJCS8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovCi0JCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbihwdGUpKTsKKwkJCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyZXNzLCBwdGVfcGZuKCpwdGUpKTsKIAkJCXB0ZXZhbCA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRyZXNzLCBwdGUpOwogCQkJQlVHX09OKHB0ZV9kaXJ0eShwdGV2YWwpKTsKIAkJCXB0ZV91bm1hcChwdGUpOwpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9vbC5jIGIvbW0vbWVtcG9vbC5jCmluZGV4IDlhNzJmN2QuLjY1ZjI5NTcgMTAwNjQ0Ci0tLSBhL21tL21lbXBvb2wuYworKysgYi9tbS9tZW1wb29sLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogCXZvaWQgKmVsZW1lbnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKLQlpbnQgZ2ZwX3RlbXA7CisJdW5zaWduZWQgaW50IGdmcF90ZW1wOwogCiAJbWlnaHRfc2xlZXBfaWYoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKTsKIApkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggNTk2NjZkOS4uMWU1NjA3NiAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0yNTMsMTQgKzI1MywxNiBAQAogICogT1IgdHJ5IHRvIGJlIHNtYXJ0IGFib3V0IHdoaWNoIHByb2Nlc3MgdG8ga2lsbC4gTm90ZSB0aGF0IHdlCiAgKiBkb24ndCBoYXZlIHRvIGJlIHBlcmZlY3QgaGVyZSwgd2UganVzdCBoYXZlIHRvIGJlIGdvb2QuCiAgKi8KLXZvaWQgb3V0X29mX21lbW9yeSh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCit2b2lkIG91dF9vZl9tZW1vcnkodW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrLCBpbnQgb3JkZXIpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOwogCXRhc2tfdCAqIHA7CiAKLQlwcmludGsoIm9vbS1raWxsZXI6IGdmcF9tYXNrPTB4JXhcbiIsIGdmcF9tYXNrKTsKLQkvKiBwcmludCBtZW1vcnkgc3RhdHMgKi8KLQlzaG93X21lbSgpOworCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJcHJpbnRrKCJvb20ta2lsbGVyOiBnZnBfbWFzaz0weCV4LCBvcmRlcj0lZFxuIiwKKwkJCWdmcF9tYXNrLCBvcmRlcik7CisJCXNob3dfbWVtKCk7CisJfQogCiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIHJldHJ5OgpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDNjOWY3ZjguLjFkNmJhNmEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTg5NywxMiArODk3LDYgQEAKIAljb25kX3Jlc2NoZWQoKTsKIAogCWlmIChsaWtlbHkoZGlkX3NvbWVfcHJvZ3Jlc3MpKSB7Ci0JCS8qCi0JCSAqIEdvIHRocm91Z2ggdGhlIHpvbmVsaXN0IHlldCBvbmUgbW9yZSB0aW1lLCBrZWVwCi0JCSAqIHZlcnkgaGlnaCB3YXRlcm1hcmsgaGVyZSwgdGhpcyBpcyBvbmx5IHRvIGNhdGNoCi0JCSAqIGEgcGFyYWxsZWwgb29tIGtpbGxpbmcsIHdlIG11c3QgZmFpbCBpZiB3ZSdyZSBzdGlsbAotCQkgKiB1bmRlciBoZWF2eSBwcmVzc3VyZS4KLQkJICovCiAJCWZvciAoaSA9IDA7ICh6ID0gem9uZXNbaV0pICE9IE5VTEw7IGkrKykgewogCQkJaWYgKCF6b25lX3dhdGVybWFya19vayh6LCBvcmRlciwgei0+cGFnZXNfbWluLAogCQkJCQkgICAgICAgY2xhc3N6b25lX2lkeCwgY2FuX3RyeV9oYXJkZXIsCkBAIC05MzYsNyArOTMwLDcgQEAKIAkJCQlnb3RvIGdvdF9wZzsKIAkJfQogCi0JCW91dF9vZl9tZW1vcnkoZ2ZwX21hc2spOworCQlvdXRfb2ZfbWVtb3J5KGdmcF9tYXNrLCBvcmRlcik7CiAJCWdvdG8gcmVzdGFydDsKIAl9CiAKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCAxMjJkMDMxLi5jOWU3MDZkIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC01ODQsNyArNTg0LDggQEAKIAlyZXR1cm4gY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldOwogfQogCi1zdGF0aWMgaW5saW5lIGttZW1fY2FjaGVfdCAqX19maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLCBpbnQgZ2ZwZmxhZ3MpCitzdGF0aWMgaW5saW5lIGttZW1fY2FjaGVfdCAqX19maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLAorCQkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcGZsYWdzKQogewogCXN0cnVjdCBjYWNoZV9zaXplcyAqY3NpemVwID0gbWFsbG9jX3NpemVzOwogCkBAIC02MDgsNyArNjA5LDggQEAKIAlyZXR1cm4gY3NpemVwLT5jc19jYWNoZXA7CiB9CiAKLWttZW1fY2FjaGVfdCAqa21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLCBpbnQgZ2ZwZmxhZ3MpCitrbWVtX2NhY2hlX3QgKmttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzaXplX3Qgc2l6ZSwKKwkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcGZsYWdzKQogewogCXJldHVybiBfX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2l6ZSwgZ2ZwZmxhZ3MpOwogfQpAQCAtMjEwMCw3ICsyMTAyLDcgQEAKICNpZiBERUJVRwogc3RhdGljIHZvaWQgKgogY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihrbWVtX2NhY2hlX3QgKmNhY2hlcCwKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKm9ianAsIHZvaWQgKmNhbGxlcikKKwkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncywgdm9pZCAqb2JqcCwgdm9pZCAqY2FsbGVyKQogewogCWlmICghb2JqcCkJCiAJCXJldHVybiBvYmpwOwpAQCAtMjM3Miw2ICsyMzc0LDkgQEAKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CiAJa21lbV9idWZjdGxfdCBuZXh0OwogCisJaWYgKG5vZGVpZCA9PSAtMSkKKwkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CisKIAlmb3IgKGxvb3AgPSAwOztsb29wKyspIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcTsKIApAQCAtMjQzOSw3ICsyNDQ0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKIAotdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsIGludCBub2RlKQordm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MsIGludCBub2RlKQogewogCWttZW1fY2FjaGVfdCAqY2FjaGVwOwogCkBAIC0zMDkxLDcgKzMwOTYsNyBAQAogICogQHM6IHRoZSBzdHJpbmcgdG8gZHVwbGljYXRlCiAgKiBAZ2ZwOiB0aGUgR0ZQIG1hc2sgdXNlZCBpbiB0aGUga21hbGxvYygpIGNhbGwgd2hlbiBhbGxvY2F0aW5nIG1lbW9yeQogICovCi1jaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIGludCBnZnApCitjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc2l6ZV90IGxlbjsKIAljaGFyICpidWY7CmRpZmYgLS1naXQgYS9uZXQvODAyL2ZkZGkuYyBiL25ldC84MDIvZmRkaS5jCmluZGV4IGViY2Y0ODMuLjVjZTI0YzQgMTAwNjQ0Ci0tLSBhL25ldC84MDIvZmRkaS5jCisrKyBiL25ldC84MDIvZmRkaS5jCkBAIC0xMjIsMTAgKzEyMiwxMCBAQAogICogdGhlIHByb3BlciBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBwYWNrZXQgZGF0YSAoc2tiLT5kYXRhKS4KICAqLwogIAotdW5zaWduZWQgc2hvcnQgZmRkaV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitfX2JlMTYgZmRkaV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZkZGloZHIgKmZkZGkgPSAoc3RydWN0IGZkZGloZHIgKilza2ItPmRhdGE7Ci0JdW5zaWduZWQgc2hvcnQgdHlwZTsKKwlfX2JlMTYgdHlwZTsKIAkKIAkvKgogCSAqIFNldCBtYWMucmF3IGZpZWxkIHRvIHBvaW50IHRvIEZDIGJ5dGUsIHNldCBkYXRhIGZpZWxkIHRvIHBvaW50CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvS2NvbmZpZyBiL25ldC84MDIxcS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTM4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvODAyMXEvS2NvbmZpZwpAQCAtMCwwICsxLDE5IEBACisjCisjIENvbmZpZ3VyYXRpb24gZm9yIDgwMi4xUSBWTEFOIHN1cHBvcnQKKyMKKworY29uZmlnIFZMQU5fODAyMVEKKwl0cmlzdGF0ZSAiODAyLjFRIFZMQU4gU3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBhbmQgeW91IHdpbGwgYmUgYWJsZSB0byBjcmVhdGUgODAyLjFRIFZMQU4gaW50ZXJmYWNlcworCSAgb24geW91ciBldGhlcm5ldCBpbnRlcmZhY2VzLiAgODAyLjFRIFZMQU4gc3VwcG9ydHMgYWxtb3N0CisJICBldmVyeXRoaW5nIGEgcmVndWxhciBldGhlcm5ldCBpbnRlcmZhY2UgZG9lcywgaW5jbHVkaW5nCisJICBmaXJld2FsbGluZywgYnJpZGdpbmcsIGFuZCBvZiBjb3Vyc2UgSVAgdHJhZmZpYy4gIFlvdSB3aWxsIG5lZWQKKwkgIHRoZSAndmNvbmZpZycgdG9vbCBmcm9tIHRoZSBWTEFOIHByb2plY3QgaW4gb3JkZXIgdG8gZWZmZWN0aXZlbHkKKwkgIHVzZSBWTEFOcy4gIFNlZSB0aGUgVkxBTiB3ZWIgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKKwkgIDxodHRwOi8vd3d3LmNhbmRlbGF0ZWNoLmNvbS9+Z3JlZWFyL3ZsYW4uaHRtbD4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgwMjFxLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uYyBiL25ldC84MDIxcS92bGFuLmMKaW5kZXggMWY2ZDMxNi4uOTFlNDEyYiAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW4uYworKysgYi9uZXQvODAyMXEvdmxhbi5jCkBAIC01NzgsNiArNTc4LDE0IEBACiAJCQlpZiAoIXZsYW5kZXYpCiAJCQkJY29udGludWU7CiAKKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sodmxhbmRldikpCisJCQkJCW5ldGlmX2NhcnJpZXJfb24odmxhbmRldik7CisJCQl9IGVsc2UgeworCQkJCWlmIChuZXRpZl9jYXJyaWVyX29rKHZsYW5kZXYpKQorCQkJCQluZXRpZl9jYXJyaWVyX29mZih2bGFuZGV2KTsKKwkJCX0KKwogCQkJaWYgKCh2bGFuZGV2LT5zdGF0ZSAmIFZMQU5fTElOS19TVEFURV9NQVNLKSAhPSBmbGdzKSB7CiAJCQkJdmxhbmRldi0+c3RhdGUgPSAodmxhbmRldi0+c3RhdGUgJn4gVkxBTl9MSU5LX1NUQVRFX01BU0spIAogCQkJCQl8IGZsZ3M7CmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IDkyNTFiMjguLjI2ODRlODAgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0yLDcgKzIsNyBAQAogIyBOZXR3b3JrIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiTmV0d29ya2luZyBzdXBwb3J0IgorbWVudSAiTmV0d29ya2luZyIKIAogY29uZmlnIE5FVAogCWJvb2wgIk5ldHdvcmtpbmcgc3VwcG9ydCIKQEAgLTEwLDcgKzEwLDkgQEAKIAkgIFVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUuCiAJICBUaGUgcmVhc29uIGlzIHRoYXQgc29tZSBwcm9ncmFtcyBuZWVkIGtlcm5lbCBuZXR3b3JraW5nIHN1cHBvcnQgZXZlbgogCSAgd2hlbiBydW5uaW5nIG9uIGEgc3RhbmQtYWxvbmUgbWFjaGluZSB0aGF0IGlzbid0IGNvbm5lY3RlZCB0byBhbnkKLQkgIG90aGVyIGNvbXB1dGVyLiBJZiB5b3UgYXJlIHVwZ3JhZGluZyBmcm9tIGFuIG9sZGVyIGtlcm5lbCwgeW91CisJICBvdGhlciBjb21wdXRlci4KKwkgIAorCSAgSWYgeW91IGFyZSB1cGdyYWRpbmcgZnJvbSBhbiBvbGRlciBrZXJuZWwsIHlvdQogCSAgc2hvdWxkIGNvbnNpZGVyIHVwZGF0aW5nIHlvdXIgbmV0d29ya2luZyB0b29scyB0b28gYmVjYXVzZSBjaGFuZ2VzCiAJICBpbiB0aGUga2VybmVsIGFuZCB0aGUgdG9vbHMgb2Z0ZW4gZ28gaGFuZCBpbiBoYW5kLiBUaGUgdG9vbHMgYXJlCiAJICBjb250YWluZWQgaW4gdGhlIHBhY2thZ2UgbmV0LXRvb2xzLCB0aGUgbG9jYXRpb24gYW5kIHZlcnNpb24gbnVtYmVyCkBAIC0yMCw1NyArMjIsMTQgQEAKIAkgIHJlY29tbWVuZGVkIHRvIHJlYWQgdGhlIE5FVC1IT1dUTywgYXZhaWxhYmxlIGZyb20KIAkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCiAKKyMgTWFrZSBzdXJlIHRoYXQgYWxsIGNvbmZpZyBzeW1ib2xzIGFyZSBkZXBlbmRlbnQgb24gTkVUCitpZiBORVQKKwogbWVudSAiTmV0d29ya2luZyBvcHRpb25zIgotCWRlcGVuZHMgb24gTkVUCiAKLWNvbmZpZyBQQUNLRVQKLQl0cmlzdGF0ZSAiUGFja2V0IHNvY2tldCIKLQktLS1oZWxwLS0tCi0JICBUaGUgUGFja2V0IHByb3RvY29sIGlzIHVzZWQgYnkgYXBwbGljYXRpb25zIHdoaWNoIGNvbW11bmljYXRlCi0JICBkaXJlY3RseSB3aXRoIG5ldHdvcmsgZGV2aWNlcyB3aXRob3V0IGFuIGludGVybWVkaWF0ZSBuZXR3b3JrCi0JICBwcm90b2NvbCBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLCBlLmcuIHRjcGR1bXAuICBJZiB5b3Ugd2FudCB0aGVtCi0JICB0byB3b3JrLCBjaG9vc2UgWS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgYWZfcGFja2V0LgotCi0JICBJZiB1bnN1cmUsIHNheSBZLgotCi1jb25maWcgUEFDS0VUX01NQVAKLQlib29sICJQYWNrZXQgc29ja2V0OiBtbWFwcGVkIElPIgotCWRlcGVuZHMgb24gUEFDS0VUCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBQYWNrZXQgcHJvdG9jb2wgZHJpdmVyIHdpbGwgdXNlIGFuIElPCi0JICBtZWNoYW5pc20gdGhhdCByZXN1bHRzIGluIGZhc3RlciBjb21tdW5pY2F0aW9uLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgVU5JWAotCXRyaXN0YXRlICJVbml4IGRvbWFpbiBzb2NrZXRzIgotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBpbmNsdWRlIHN1cHBvcnQgZm9yIFVuaXggZG9tYWluIHNvY2tldHM7Ci0JICBzb2NrZXRzIGFyZSB0aGUgc3RhbmRhcmQgVW5peCBtZWNoYW5pc20gZm9yIGVzdGFibGlzaGluZyBhbmQKLQkgIGFjY2Vzc2luZyBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgTWFueSBjb21tb25seSB1c2VkIHByb2dyYW1zIHN1Y2ggYXMKLQkgIHRoZSBYIFdpbmRvdyBzeXN0ZW0gYW5kIHN5c2xvZyB1c2UgdGhlc2Ugc29ja2V0cyBldmVuIGlmIHlvdXIKLQkgIG1hY2hpbmUgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgbmV0d29yay4gIFVubGVzcyB5b3UgYXJlIHdvcmtpbmcgb24KLQkgIGFuIGVtYmVkZGVkIHN5c3RlbSBvciBzb21ldGhpbmcgc2ltaWxhciwgeW91IHRoZXJlZm9yZSBkZWZpbml0ZWx5Ci0JICB3YW50IHRvIHNheSBZIGhlcmUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIHVuaXguICBOb3RlIHRoYXQgc2V2ZXJhbCBpbXBvcnRhbnQgc2VydmljZXMgd29uJ3Qgd29yawotCSAgY29ycmVjdGx5IGlmIHlvdSBzYXkgTSBoZXJlIGFuZCB0aGVuIG5lZ2xlY3QgdG8gbG9hZCB0aGUgbW9kdWxlLgotCi0JICBTYXkgWSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgotCi1jb25maWcgTkVUX0tFWQotCXRyaXN0YXRlICJQRl9LRVkgc29ja2V0cyIKLQlzZWxlY3QgWEZSTQotCS0tLWhlbHAtLS0KLQkgIFBGX0tFWXYyIHNvY2tldCBmYW1pbHksIGNvbXBhdGlibGUgdG8gS0FNRSBvbmVzLgotCSAgVGhleSBhcmUgcmVxdWlyZWQgaWYgeW91IGFyZSBnb2luZyB0byB1c2UgSVBzZWMgdG9vbHMgcG9ydGVkCi0JICBmcm9tIEtBTUUuCi0KLQkgIFNheSBZIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCitzb3VyY2UgIm5ldC9wYWNrZXQvS2NvbmZpZyIKK3NvdXJjZSAibmV0L3VuaXgvS2NvbmZpZyIKK3NvdXJjZSAibmV0L3hmcm0vS2NvbmZpZyIKIAogY29uZmlnIElORVQKIAlib29sICJUQ1AvSVAgbmV0d29ya2luZyIKQEAgLTk0LDMwICs1MywxMiBAQAogCiAJICBTaG9ydCBhbnN3ZXI6IHNheSBZLgogCitpZiBJTkVUCiBzb3VyY2UgIm5ldC9pcHY0L0tjb25maWciCi0KLSMgICBJUHY2IGFzIG1vZHVsZSB3aWxsIGNhdXNlIGEgQ1JBU0ggaWYgeW91IHRyeSB0byB1bmxvYWQgaXQKLWNvbmZpZyBJUFY2Ci0JdHJpc3RhdGUgIlRoZSBJUHY2IHByb3RvY29sIgotCWRlcGVuZHMgb24gSU5FVAotCWRlZmF1bHQgbQotCXNlbGVjdCBDUllQVE8gaWYgSVBWNl9QUklWQUNZCi0Jc2VsZWN0IENSWVBUT19NRDUgaWYgSVBWNl9QUklWQUNZCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBjb21wbGVtZW50YWwgc3VwcG9ydCBmb3IgdGhlIElQIHZlcnNpb24gNi4KLQkgIFlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gZG8gdHJhZGl0aW9uYWwgSVB2NCBuZXR3b3JraW5nIGFzIHdlbGwuCi0KLQkgIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IElQdjYsIHNlZQotCSAgPGh0dHA6Ly9wbGF5Z3JvdW5kLnN1bi5jb20vcHViL2lwbmcvaHRtbC9pcG5nLW1haW4uaHRtbD4uCi0JICBGb3IgTGludXggSVB2NiBkZXZlbG9wbWVudCBpbmZvcm1hdGlvbiwgc2VlIDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPi4KLQkgIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBJUHY2IHVuZGVyIExpbnV4LCByZWFkIHRoZSBIT1dUTyBhdAotCSAgPGh0dHA6Ly93d3cuYmllcmluZ2VyLmRlL2xpbnV4L0lQdjYvPi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIHByb3RvY29sIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSAKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHY2LgotCiBzb3VyY2UgIm5ldC9pcHY2L0tjb25maWciCiAKK2VuZGlmICMgaWYgSU5FVAorCiBtZW51Y29uZmlnIE5FVEZJTFRFUgogCWJvb2wgIk5ldHdvcmsgcGFja2V0IGZpbHRlcmluZyAocmVwbGFjZXMgaXBjaGFpbnMpIgogCS0tLWhlbHAtLS0KQEAgLTIwNiwyNjkgKzE0NywxNiBAQAogCiBlbmRpZgogCi1jb25maWcgWEZSTQotICAgICAgIGJvb2wKLSAgICAgICBkZXBlbmRzIG9uIE5FVAotCi1zb3VyY2UgIm5ldC94ZnJtL0tjb25maWciCi0KIHNvdXJjZSAibmV0L3NjdHAvS2NvbmZpZyIKLQotY29uZmlnIEFUTQotCXRyaXN0YXRlICJBc3luY2hyb25vdXMgVHJhbnNmZXIgTW9kZSAoQVRNKSAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCS0tLWhlbHAtLS0KLQkgIEFUTSBpcyBhIGhpZ2gtc3BlZWQgbmV0d29ya2luZyB0ZWNobm9sb2d5IGZvciBMb2NhbCBBcmVhIE5ldHdvcmtzCi0JICBhbmQgV2lkZSBBcmVhIE5ldHdvcmtzLiAgSXQgdXNlcyBhIGZpeGVkIHBhY2tldCBzaXplIGFuZCBpcwotCSAgY29ubmVjdGlvbiBvcmllbnRlZCwgYWxsb3dpbmcgZm9yIHRoZSBuZWdvdGlhdGlvbiBvZiBtaW5pbXVtCi0JICBiYW5kd2lkdGggcmVxdWlyZW1lbnRzLgotCi0JICBJbiBvcmRlciB0byBwYXJ0aWNpcGF0ZSBpbiBhbiBBVE0gbmV0d29yaywgeW91ciBMaW51eCBib3ggbmVlZHMgYW4KLQkgIEFUTSBuZXR3b3JraW5nIGNhcmQuIElmIHlvdSBoYXZlIHRoYXQsIHNheSBZIGhlcmUgYW5kIHRvIHRoZSBkcml2ZXIKLQkgIG9mIHlvdXIgQVRNIGNhcmQgYmVsb3cuCi0KLQkgIE5vdGUgdGhhdCB5b3UgbmVlZCBhIHNldCBvZiB1c2VyLXNwYWNlIHByb2dyYW1zIHRvIGFjdHVhbGx5IG1ha2UgdXNlCi0JICBvZiBBVE0uICBTZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2F0bS50eHQ+IGZvcgotCSAgZnVydGhlciBkZXRhaWxzLgotCi1jb25maWcgQVRNX0NMSVAKLQl0cmlzdGF0ZSAiQ2xhc3NpY2FsIElQIG92ZXIgQVRNIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gQVRNICYmIElORVQKLQloZWxwCi0JICBDbGFzc2ljYWwgSVAgb3ZlciBBVE0gZm9yIFBWQ3MgYW5kIFNWQ3MsIHN1cHBvcnRpbmcgSW5BUlAgYW5kCi0JICBBVE1BUlAuIElmIHlvdSB3YW50IHRvIGNvbW11bmljYXRpb24gd2l0aCBvdGhlciBJUCBob3N0cyBvbiB5b3VyIEFUTQotCSAgbmV0d29yaywgeW91IHdpbGwgdHlwaWNhbGx5IGVpdGhlciBzYXkgWSBoZXJlIG9yIHRvICJMQU4gRW11bGF0aW9uCi0JICAoTEFORSkiIGJlbG93LgotCi1jb25maWcgQVRNX0NMSVBfTk9fSUNNUAotCWJvb2wgIkRvIE5PVCBzZW5kIElDTVAgaWYgbm8gbmVpZ2hib3VyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gQVRNX0NMSVAKLQloZWxwCi0JICBOb3JtYWxseSwgYW4gIklDTVAgaG9zdCB1bnJlYWNoYWJsZSIgbWVzc2FnZSBpcyBzZW50IGlmIGEgbmVpZ2hib3VyCi0JICBjYW5ub3QgYmUgcmVhY2hlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIFZDIHRvIGl0IGluIHRoZSBrZXJuZWwncwotCSAgQVRNQVJQIHRhYmxlLiBUaGlzIG1heSBjYXVzZSBwcm9ibGVtcyB3aGVuIEFUTUFSUCB0YWJsZSBlbnRyaWVzIGFyZQotCSAgYnJpZWZseSByZW1vdmVkIGR1cmluZyByZXZhbGlkYXRpb24uIElmIHlvdSBzYXkgWSBoZXJlLCBwYWNrZXRzIHRvCi0JICBzdWNoIG5laWdoYm91cnMgYXJlIHNpbGVudGx5IGRpc2NhcmRlZCBpbnN0ZWFkLgotCi1jb25maWcgQVRNX0xBTkUKLQl0cmlzdGF0ZSAiTEFOIEVtdWxhdGlvbiAoTEFORSkgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEFUTQotCWhlbHAKLQkgIExBTiBFbXVsYXRpb24gZW11bGF0ZXMgc2VydmljZXMgb2YgZXhpc3RpbmcgTEFOcyBhY3Jvc3MgYW4gQVRNCi0JICBuZXR3b3JrLiBCZXNpZGVzIG9wZXJhdGluZyBhcyBhIG5vcm1hbCBBVE0gZW5kIHN0YXRpb24gY2xpZW50LCBMaW51eAotCSAgTEFORSBjbGllbnQgY2FuIGFsc28gYWN0IGFzIGFuIHByb3h5IGNsaWVudCBicmlkZ2luZyBwYWNrZXRzIGJldHdlZW4KLQkgIEVMQU4gYW5kIEV0aGVybmV0IHNlZ21lbnRzLiBZb3UgbmVlZCBMQU5FIGlmIHlvdSB3YW50IHRvIHRyeSBNUE9BLgotCi1jb25maWcgQVRNX01QT0EKLQl0cmlzdGF0ZSAiTXVsdGktUHJvdG9jb2wgT3ZlciBBVE0gKE1QT0EpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBBVE0gJiYgSU5FVCAmJiBBVE1fTEFORSE9bgotCWhlbHAKLQkgIE11bHRpLVByb3RvY29sIE92ZXIgQVRNIGFsbG93cyBBVE0gZWRnZSBkZXZpY2VzIHN1Y2ggYXMgcm91dGVycywKLQkgIGJyaWRnZXMgYW5kIEFUTSBhdHRhY2hlZCBob3N0cyBlc3RhYmxpc2ggZGlyZWN0IEFUTSBWQ3MgYWNyb3NzCi0JICBzdWJuZXR3b3JrIGJvdW5kYXJpZXMuIFRoZXNlIHNob3J0Y3V0IGNvbm5lY3Rpb25zIGJ5cGFzcyByb3V0ZXJzCi0JICBlbmhhbmNpbmcgb3ZlcmFsbCBuZXR3b3JrIHBlcmZvcm1hbmNlLgotCi1jb25maWcgQVRNX0JSMjY4NAotCXRyaXN0YXRlICJSRkMxNDgzLzI2ODQgQnJpZGdlZCBwcm90b2NvbHMiCi0JZGVwZW5kcyBvbiBBVE0gJiYgSU5FVAotCWhlbHAKLQkgIEFUTSBQVkNzIGNhbiBjYXJyeSBldGhlcm5ldCBQRFVzIGFjY29yZGluZyB0byByZmMyNjg0IChmb3JtZXJseSAxNDgzKQotCSAgVGhpcyBkZXZpY2Ugd2lsbCBhY3QgbGlrZSBhbiBldGhlcm5ldCBmcm9tIHRoZSBrZXJuZWxzIHBvaW50IG9mIHZpZXcsCi0JICB3aXRoIHRoZSB0cmFmZmljIGJlaW5nIGNhcnJpZWQgYnkgQVRNIFBWQ3MgKGN1cnJlbnRseSAxIFBWQy9kZXZpY2UpLgotCSAgVGhpcyBpcyBzb21ldGltZXMgdXNlZCBvdmVyIERTTCBsaW5lcy4gIElmIGluIGRvdWJ0LCBzYXkgTi4KLQotY29uZmlnIEFUTV9CUjI2ODRfSVBGSUxURVIKLQlib29sICJQZXItVkMgSVAgZmlsdGVyIGtsdWRnZSIKLQlkZXBlbmRzIG9uIEFUTV9CUjI2ODQKLQloZWxwCi0JICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBtZWNoYW5pc20gZm9yIHVzZXJzIHdobyBuZWVkIHRvIHRlcm1pbmF0aW5nIGEKLQkgIGxhcmdlIG51bWJlciBvZiBJUC1vbmx5IHZjYydzLiAgRG8gbm90IGVuYWJsZSB0aGlzIHVubGVzcyB5b3UgYXJlIHN1cmUKLQkgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KLQotY29uZmlnIEJSSURHRQotCXRyaXN0YXRlICI4MDIuMWQgRXRoZXJuZXQgQnJpZGdpbmciCi0JLS0taGVscC0tLQotCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZW4geW91ciBMaW51eCBib3ggd2lsbCBiZSBhYmxlIHRvIGFjdCBhcyBhbgotCSAgRXRoZXJuZXQgYnJpZGdlLCB3aGljaCBtZWFucyB0aGF0IHRoZSBkaWZmZXJlbnQgRXRoZXJuZXQgc2VnbWVudHMgaXQKLQkgIGlzIGNvbm5lY3RlZCB0byB3aWxsIGFwcGVhciBhcyBvbmUgRXRoZXJuZXQgdG8gdGhlIHBhcnRpY2lwYW50cy4KLQkgIFNldmVyYWwgc3VjaCBicmlkZ2VzIGNhbiB3b3JrIHRvZ2V0aGVyIHRvIGNyZWF0ZSBldmVuIGxhcmdlcgotCSAgbmV0d29ya3Mgb2YgRXRoZXJuZXRzIHVzaW5nIHRoZSBJRUVFIDgwMi4xIHNwYW5uaW5nIHRyZWUgYWxnb3JpdGhtLgotCSAgQXMgdGhpcyBpcyBhIHN0YW5kYXJkLCBMaW51eCBicmlkZ2VzIHdpbGwgY29vcGVyYXRlIHByb3Blcmx5IHdpdGgKLQkgIG90aGVyIHRoaXJkIHBhcnR5IGJyaWRnZSBwcm9kdWN0cy4KLQotCSAgSW4gb3JkZXIgdG8gdXNlIHRoZSBFdGhlcm5ldCBicmlkZ2UsIHlvdSdsbCBuZWVkIHRoZSBicmlkZ2UKLQkgIGNvbmZpZ3VyYXRpb24gdG9vbHM7IHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYnJpZGdlLnR4dD4KLQkgIGZvciBsb2NhdGlvbi4gUGxlYXNlIHJlYWQgdGhlIEJyaWRnZSBtaW5pLUhPV1RPIGZvciBtb3JlCi0JICBpbmZvcm1hdGlvbi4KLQotCSAgSWYgeW91IGVuYWJsZSBpcHRhYmxlcyBzdXBwb3J0IGFsb25nIHdpdGggdGhlIGJyaWRnZSBzdXBwb3J0IHRoZW4geW91Ci0JICB0dXJuIHlvdXIgYnJpZGdlIGludG8gYSBicmlkZ2luZyBJUCBmaXJld2FsbC4KLQkgIGlwdGFibGVzIHdpbGwgdGhlbiBzZWUgdGhlIElQIHBhY2tldHMgYmVpbmcgYnJpZGdlZCwgc28geW91IG5lZWQgdG8KLQkgIHRha2UgdGhpcyBpbnRvIGFjY291bnQgd2hlbiBzZXR0aW5nIHVwIHlvdXIgZmlyZXdhbGwgcnVsZXMuCi0JICBFbmFibGluZyBhcnB0YWJsZXMgc3VwcG9ydCB3aGVuIGJyaWRnaW5nIHdpbGwgbGV0IGFycHRhYmxlcyBzZWUKLQkgIGJyaWRnZWQgQVJQIHRyYWZmaWMgaW4gdGhlIGFycHRhYmxlcyBGT1JXQVJEIGNoYWluLgotCi0JICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYnJpZGdlLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgVkxBTl84MDIxUQotCXRyaXN0YXRlICI4MDIuMVEgVkxBTiBTdXBwb3J0IgotCS0tLWhlbHAtLS0KLQkgIFNlbGVjdCB0aGlzIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNyZWF0ZSA4MDIuMVEgVkxBTiBpbnRlcmZhY2VzCi0JICBvbiB5b3VyIGV0aGVybmV0IGludGVyZmFjZXMuICA4MDIuMVEgVkxBTiBzdXBwb3J0cyBhbG1vc3QKLQkgIGV2ZXJ5dGhpbmcgYSByZWd1bGFyIGV0aGVybmV0IGludGVyZmFjZSBkb2VzLCBpbmNsdWRpbmcKLQkgIGZpcmV3YWxsaW5nLCBicmlkZ2luZywgYW5kIG9mIGNvdXJzZSBJUCB0cmFmZmljLiAgWW91IHdpbGwgbmVlZAotCSAgdGhlICd2Y29uZmlnJyB0b29sIGZyb20gdGhlIFZMQU4gcHJvamVjdCBpbiBvcmRlciB0byBlZmZlY3RpdmVseQotCSAgdXNlIFZMQU5zLiAgU2VlIHRoZSBWTEFOIHdlYiBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uOgotCSAgPGh0dHA6Ly93d3cuY2FuZGVsYXRlY2guY29tL35ncmVlYXIvdmxhbi5odG1sPgotCi0JICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgODAyMXEuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBERUNORVQKLQl0cmlzdGF0ZSAiREVDbmV0IFN1cHBvcnQiCi0JLS0taGVscC0tLQotCSAgVGhlIERFQ25ldCBuZXR3b3JraW5nIHByb3RvY29sIHdhcyB1c2VkIGluIG1hbnkgcHJvZHVjdHMgbWFkZSBieQotCSAgRGlnaXRhbCAobm93IENvbXBhcSkuICBJdCBwcm92aWRlcyByZWxpYWJsZSBzdHJlYW0gYW5kIHNlcXVlbmNlZAotCSAgcGFja2V0IGNvbW11bmljYXRpb25zIG92ZXIgd2hpY2ggcnVuIGEgdmFyaWV0eSBvZiBzZXJ2aWNlcyBzaW1pbGFyCi0JICB0byB0aG9zZSB3aGljaCBydW4gb3ZlciBUQ1AvSVAuCi0KLQkgIFRvIGZpbmQgc29tZSB0b29scyB0byB1c2Ugd2l0aCB0aGUga2VybmVsIGxheWVyIHN1cHBvcnQsIHBsZWFzZQotCSAgbG9vayBhdCBQYXRyaWNrIENhdWxmaWVsZCdzIHdlYiBzaXRlOgotCSAgPGh0dHA6Ly9saW51eC1kZWNuZXQuc291cmNlZm9yZ2UubmV0Lz4uCi0KLQkgIE1vcmUgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgaW4KLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZWNuZXQudHh0Pi4KLQotCSAgQmUgc3VyZSB0byBzYXkgWSB0byAiL3Byb2MgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgYW5kICJTeXNjdGwgc3VwcG9ydCIKLQkgIGJlbG93IHdoZW4gdXNpbmcgREVDbmV0LCBzaW5jZSB5b3Ugd2lsbCBuZWVkIHN5c2N0bCBzdXBwb3J0IHRvIGFpZAotCSAgaW4gY29uZmlndXJhdGlvbiBhdCBydW4gdGltZS4KLQotCSAgVGhlIERFQ25ldCBjb2RlIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQotCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgotCSAgVGhlIG1vZHVsZSBpcyBjYWxsZWQgZGVjbmV0LgotCitzb3VyY2UgIm5ldC9hdG0vS2NvbmZpZyIKK3NvdXJjZSAibmV0L2JyaWRnZS9LY29uZmlnIgorc291cmNlICJuZXQvODAyMXEvS2NvbmZpZyIKIHNvdXJjZSAibmV0L2RlY25ldC9LY29uZmlnIgotCiBzb3VyY2UgIm5ldC9sbGMvS2NvbmZpZyIKLQotY29uZmlnIElQWAotCXRyaXN0YXRlICJUaGUgSVBYIHByb3RvY29sIgotCXNlbGVjdCBMTEMKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBOb3ZlbGwgbmV0d29ya2luZyBwcm90b2NvbCwgSVBYLCBjb21tb25seQotCSAgdXNlZCBmb3IgbG9jYWwgbmV0d29ya3Mgb2YgV2luZG93cyBtYWNoaW5lcy4gIFlvdSBuZWVkIGl0IGlmIHlvdQotCSAgd2FudCB0byBhY2Nlc3MgTm92ZWxsIE5ldFdhcmUgZmlsZSBvciBwcmludCBzZXJ2ZXJzIHVzaW5nIHRoZSBMaW51eAotCSAgTm92ZWxsIGNsaWVudCBuY3BmcyAoYXZhaWxhYmxlIGZyb20KLQkgIDxmdHA6Ly9wbGF0YW4udmMuY3Z1dC5jei9wdWIvbGludXgvbmNwZnMvPikgb3IgZnJvbQotCSAgd2l0aGluIHRoZSBMaW51eCBET1MgZW11bGF0b3IgRE9TRU1VIChyZWFkIHRoZSBET1NFTVUtSE9XVE8sCi0JICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+KS4gIEluIG9yZGVyCi0JICB0byBkbyB0aGUgZm9ybWVyLCB5b3UnbGwgYWxzbyBoYXZlIHRvIHNheSBZIHRvICJOQ1AgZmlsZSBzeXN0ZW0KLQkgIHN1cHBvcnQiLCBiZWxvdy4KLQotCSAgSVBYIGlzIHNpbWlsYXIgaW4gc2NvcGUgdG8gSVAsIHdoaWxlIFNQWCwgd2hpY2ggcnVucyBvbiB0b3Agb2YgSVBYLAotCSAgaXMgc2ltaWxhciB0byBUQ1AuIFRoZXJlIGlzIGFsc28gZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIFNQWCBpbgotCSAgTGludXggKHNlZSAiU1BYIG5ldHdvcmtpbmciLCBiZWxvdykuCi0KLQkgIFRvIHR1cm4geW91ciBMaW51eCBib3ggaW50byBhIGZ1bGx5IGZlYXR1cmVkIE5ldFdhcmUgZmlsZSBzZXJ2ZXIgYW5kCi0JICBJUFggcm91dGVyLCBzYXkgWSBoZXJlIGFuZCBmZXRjaCBlaXRoZXIgbHdhcmVkIGZyb20KLQkgIDxmdHA6Ly9pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL25ldHdvcmsvZGFlbW9ucy8+IG9yCi0JICBtYXJzX253ZSBmcm9tIDxmdHA6Ly93d3cuY29tcHUtYXJ0LmRlL21hcnNfbndlLz4uIEZvciBtb3JlCi0JICBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgSVBYLUhPV1RPIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjb25uZWN0IExpbnV4LCBXaW5kb3dzIG1hY2hpbmVzIGFuZAotCSAgTWFjcyBpcyBvbiB0aGUgV1dXIGF0IDxodHRwOi8vd3d3LmVhdHMuY29tL2xpbnV4X21hY193aW4uaHRtbD4uCi0KLQkgIFRoZSBJUFggZHJpdmVyIHdvdWxkIGVubGFyZ2UgeW91ciBrZXJuZWwgYnkgYWJvdXQgMTYgS0IuIFRvIGNvbXBpbGUKLQkgIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlweC4KLQkgIFVubGVzcyB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgeW91ciBMaW51eCBib3ggd2l0aCBhIGxvY2FsIE5vdmVsbAotCSAgbmV0d29yaywgc2F5IE4uCi0KIHNvdXJjZSAibmV0L2lweC9LY29uZmlnIgotCi1jb25maWcgQVRBTEsKLQl0cmlzdGF0ZSAiQXBwbGV0YWxrIHByb3RvY29sIHN1cHBvcnQiCi0Jc2VsZWN0IExMQwotCS0tLWhlbHAtLS0KLQkgIEFwcGxlVGFsayBpcyB0aGUgcHJvdG9jb2wgdGhhdCBBcHBsZSBjb21wdXRlcnMgY2FuIHVzZSB0byBjb21tdW5pY2F0ZQotCSAgb24gYSBuZXR3b3JrLiAgSWYgeW91ciBMaW51eCBib3ggaXMgY29ubmVjdGVkIHRvIHN1Y2ggYSBuZXR3b3JrIGFuZCB5b3UKLQkgIHdpc2ggdG8gY29ubmVjdCB0byBpdCwgc2F5IFkuICBZb3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgbmV0YXRhbGsgcGFja2FnZQotCSAgc28gdGhhdCB5b3VyIExpbnV4IGJveCBjYW4gYWN0IGFzIGEgcHJpbnQgYW5kIGZpbGUgc2VydmVyIGZvciBNYWNzIGFzCi0JICB3ZWxsIGFzIGFjY2VzcyBBcHBsZVRhbGsgcHJpbnRlcnMuICBDaGVjayBvdXQKLQkgIDxodHRwOi8vd3d3LnpldHRhYnl0ZS5uZXQvbmV0YXRhbGsvPiBvbiB0aGUgV1dXIGZvciBkZXRhaWxzLgotCSAgRXRoZXJUYWxrIGlzIHRoZSBuYW1lIHVzZWQgZm9yIEFwcGxlVGFsayBvdmVyIEV0aGVybmV0IGFuZCB0aGUKLQkgIGNoZWFwZXIgYW5kIHNsb3dlciBMb2NhbFRhbGsgaXMgQXBwbGVUYWxrIG92ZXIgYSBwcm9wcmlldGFyeSBBcHBsZQotCSAgbmV0d29yayB1c2luZyBzZXJpYWwgbGlua3MuICBFdGhlclRhbGsgYW5kIExvY2FsVGFsayBhcmUgZnVsbHkKLQkgIHN1cHBvcnRlZCBieSBMaW51eC4KLQotCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKLQkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LiAgVGhlCi0JICBORVQtMy1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4sIGNvbnRhaW5zIHZhbHVhYmxlCi0JICBpbmZvcm1hdGlvbiBhcyB3ZWxsLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCBhcHBsZXRhbGsuIFlvdSBhbG1vc3QgY2VydGFpbmx5IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhCi0JICBtb2R1bGUgc28geW91IGNhbiByZXN0YXJ0IHlvdXIgQXBwbGVUYWxrIHN0YWNrIHdpdGhvdXQgcmVib290aW5nCi0JICB5b3VyIG1hY2hpbmUuIEkgaGVhciB0aGF0IHRoZSBHTlUgYm95Y290dCBvZiBBcHBsZSBpcyBvdmVyLCBzbwotCSAgZXZlbiBwb2xpdGljYWxseSBjb3JyZWN0IHBlb3BsZSBhcmUgYWxsb3dlZCB0byBzYXkgWSBoZXJlLgotCiBzb3VyY2UgImRyaXZlcnMvbmV0L2FwcGxldGFsay9LY29uZmlnIgotCi1jb25maWcgWDI1Ci0JdHJpc3RhdGUgIkNDSVRUIFguMjUgUGFja2V0IExheWVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JLS0taGVscC0tLQotCSAgWC4yNSBpcyBhIHNldCBvZiBzdGFuZGFyZGl6ZWQgbmV0d29yayBwcm90b2NvbHMsIHNpbWlsYXIgaW4gc2NvcGUgdG8KLQkgIGZyYW1lIHJlbGF5OyB0aGUgb25lIHBoeXNpY2FsIGxpbmUgZnJvbSB5b3VyIGJveCB0byB0aGUgWC4yNSBuZXR3b3JrCi0JICBlbnRyeSBwb2ludCBjYW4gY2Fycnkgc2V2ZXJhbCBsb2dpY2FsIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zCi0JICAoY2FsbGVkICJ2aXJ0dWFsIGNpcmN1aXRzIikgdG8gb3RoZXIgY29tcHV0ZXJzIGNvbm5lY3RlZCB0byB0aGUgWC4yNQotCSAgbmV0d29yay4gR292ZXJubWVudHMsIGJhbmtzLCBhbmQgb3RoZXIgb3JnYW5pemF0aW9ucyB0ZW5kIHRvIHVzZSBpdAotCSAgdG8gY29ubmVjdCB0byBlYWNoIG90aGVyIG9yIHRvIGZvcm0gV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKS4gTWFueQotCSAgY291bnRyaWVzIGhhdmUgcHVibGljIFguMjUgbmV0d29ya3MuIFguMjUgY29uc2lzdHMgb2YgdHdvCi0JICBwcm90b2NvbHM6IHRoZSBoaWdoZXIgbGV2ZWwgUGFja2V0IExheWVyIFByb3RvY29sIChQTFApIChzYXkgWSBoZXJlCi0JICBpZiB5b3Ugd2FudCB0aGF0KSBhbmQgdGhlIGxvd2VyIGxldmVsIGRhdGEgbGluayBsYXllciBwcm90b2NvbCBMQVBCCi0JICAoc2F5IFkgdG8gIkxBUEIgRGF0YSBMaW5rIERyaXZlciIgYmVsb3cgaWYgeW91IHdhbnQgdGhhdCkuCi0KLQkgIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IFguMjUgYXQgPGh0dHA6Ly93d3cuc2FuZ29tYS5jb20veDI1Lmh0bT4gYW5kCi0JICA8aHR0cDovL3d3dy5jaXNjby5jb20vdW5pdmVyY2QvY2MvdGQvZG9jL3Byb2R1Y3Qvc29mdHdhcmUvaW9zMTEvY2Jvb2svY3gyNS5odG0+LgotCSAgSW5mb3JtYXRpb24gYWJvdXQgWC4yNSBmb3IgTGludXggaXMgY29udGFpbmVkIGluIHRoZSBmaWxlcwotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS50eHQ+IGFuZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS1pZmFjZS50eHQ+LgotCi0JICBPbmUgY29ubmVjdHMgdG8gYW4gWC4yNSBuZXR3b3JrIGVpdGhlciB3aXRoIGEgZGVkaWNhdGVkIG5ldHdvcmsgY2FyZAotCSAgdXNpbmcgdGhlIFguMjEgcHJvdG9jb2wgKG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IExpbnV4KSBvciBvbmUgY2FuIGRvCi0JICBYLjI1IG92ZXIgYSBzdGFuZGFyZCB0ZWxlcGhvbmUgbGluZSB1c2luZyBhbiBvcmRpbmFyeSBtb2RlbSAoc2F5IFkKLQkgIHRvICJYLjI1IGFzeW5jIGRyaXZlciIgYmVsb3cpIG9yIG92ZXIgRXRoZXJuZXQgdXNpbmcgYW4gb3JkaW5hcnkKLQkgIEV0aGVybmV0IGNhcmQgYW5kIHRoZSBMQVBCIG92ZXIgRXRoZXJuZXQgKHNheSBZIHRvICJMQVBCIERhdGEgTGluawotCSAgRHJpdmVyIiBhbmQgIkxBUEIgb3ZlciBFdGhlcm5ldCBkcml2ZXIiIGJlbG93KS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgeDI1LiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgTEFQQgotCXRyaXN0YXRlICJMQVBCIERhdGEgTGluayBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQktLS1oZWxwLS0tCi0JICBMaW5rIEFjY2VzcyBQcm9jZWR1cmUsIEJhbGFuY2VkIChMQVBCKSBpcyB0aGUgZGF0YSBsaW5rIGxheWVyIChpLmUuCi0JICB0aGUgbG93ZXIpIHBhcnQgb2YgdGhlIFguMjUgcHJvdG9jb2wuIEl0IG9mZmVycyBhIHJlbGlhYmxlCi0JICBjb25uZWN0aW9uIHNlcnZpY2UgdG8gZXhjaGFuZ2UgZGF0YSBmcmFtZXMgd2l0aCBvbmUgb3RoZXIgaG9zdCwgYW5kCi0JICBpdCBpcyB1c2VkIHRvIHRyYW5zcG9ydCBoaWdoZXIgbGV2ZWwgcHJvdG9jb2xzIChtb3N0bHkgWC4yNSBQYWNrZXQKLQkgIExheWVyLCB0aGUgaGlnaGVyIHBhcnQgb2YgWC4yNSwgYnV0IG90aGVycyBhcmUgcG9zc2libGUgYXMgd2VsbCkuCi0JICBVc3VhbGx5LCBMQVBCIGlzIHVzZWQgd2l0aCBzcGVjaWFsaXplZCBYLjIxIG5ldHdvcmsgY2FyZHMsIGJ1dCBMaW51eAotCSAgY3VycmVudGx5IHN1cHBvcnRzIExBUEIgb25seSBvdmVyIEV0aGVybmV0IGNvbm5lY3Rpb25zLiBJZiB5b3Ugd2FudAotCSAgdG8gdXNlIExBUEIgY29ubmVjdGlvbnMgb3ZlciBFdGhlcm5ldCwgc2F5IFkgaGVyZSBhbmQgdG8gIkxBUEIgb3ZlcgotCSAgRXRoZXJuZXQgZHJpdmVyIiBiZWxvdy4gUmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2xhcGItbW9kdWxlLnR4dD4gZm9yIHRlY2huaWNhbAotCSAgZGV0YWlscy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbGFwYi4gIElmIHVuc3VyZSwgc2F5IE4uCitzb3VyY2UgIm5ldC94MjUvS2NvbmZpZyIKK3NvdXJjZSAibmV0L2xhcGIvS2NvbmZpZyIKIAogY29uZmlnIE5FVF9ESVZFUlQKIAlib29sICJGcmFtZSBEaXZlcnRlciAoRVhQRVJJTUVOVEFMKSIKQEAgLTQ5NiwxMDcgKzE4NCwxMCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgRUNPTkVUCi0JdHJpc3RhdGUgIkFjb3JuIEVjb25ldC9BVU4gcHJvdG9jb2xzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElORVQKLQktLS1oZWxwLS0tCi0JICBFY29uZXQgaXMgYSBmYWlybHkgb2xkIGFuZCBzbG93IG5ldHdvcmtpbmcgcHJvdG9jb2wgbWFpbmx5IHVzZWQgYnkKLQkgIEFjb3JuIGNvbXB1dGVycyB0byBhY2Nlc3MgZmlsZSBhbmQgcHJpbnQgc2VydmVycy4gSXQgdXNlcyBuYXRpdmUKLQkgIEVjb25ldCBuZXR3b3JrIGNhcmRzLiBBVU4gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGhpZ2hlciBsZXZlbAotCSAgcGFydHMgb2YgRWNvbmV0IHRoYXQgcnVucyBvdmVyIG9yZGluYXJ5IEV0aGVybmV0IGNvbm5lY3Rpb25zLCBvbgotCSAgdG9wIG9mIHRoZSBVRFAgcGFja2V0IHByb3RvY29sLCB3aGljaCBpbiB0dXJuIHJ1bnMgb24gdG9wIG9mIHRoZQotCSAgSW50ZXJuZXQgcHJvdG9jb2wgSVAuCi0KLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgY2FuIGNob29zZSB3aXRoIHRoZSBuZXh0IHR3byBvcHRpb25zIHdoZXRoZXIKLQkgIHRvIHNlbmQgRWNvbmV0L0FVTiB0cmFmZmljIG92ZXIgYSBVRFAgRXRoZXJuZXQgY29ubmVjdGlvbiBvciBvdmVyCi0JICBhIG5hdGl2ZSBFY29uZXQgbmV0d29yayBjYXJkLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBlY29uZXQuCi0KLWNvbmZpZyBFQ09ORVRfQVVOVURQCi0JYm9vbCAiQVVOIG92ZXIgVURQIgotCWRlcGVuZHMgb24gRUNPTkVUCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzZW5kIEVjb25ldC9BVU4gdHJhZmZpYyBvdmVyIGEgVURQCi0JICBjb25uZWN0aW9uIChVRFAgaXMgYSBwYWNrZXQgYmFzZWQgcHJvdG9jb2wgdGhhdCBydW5zIG9uIHRvcCBvZiB0aGUKLQkgIEludGVybmV0IHByb3RvY29sIElQKSB1c2luZyBhbiBvcmRpbmFyeSBFdGhlcm5ldCBuZXR3b3JrIGNhcmQuCi0KLWNvbmZpZyBFQ09ORVRfTkFUSVZFCi0JYm9vbCAiTmF0aXZlIEVjb25ldCIKLQlkZXBlbmRzIG9uIEVDT05FVAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBuYXRpdmUgRWNvbmV0IG5ldHdvcmsgY2FyZCBpbnN0YWxsZWQgaW4KLQkgIHlvdXIgY29tcHV0ZXIuCi0KLWNvbmZpZyBXQU5fUk9VVEVSCi0JdHJpc3RhdGUgIldBTiByb3V0ZXIiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQktLS1oZWxwLS0tCi0JICBXaWRlIEFyZWEgTmV0d29ya3MgKFdBTnMpLCBzdWNoIGFzIFguMjUsIGZyYW1lIHJlbGF5IGFuZCBsZWFzZWQKLQkgIGxpbmVzLCBhcmUgdXNlZCB0byBpbnRlcmNvbm5lY3QgTG9jYWwgQXJlYSBOZXR3b3JrcyAoTEFOcykgb3ZlciB2YXN0Ci0JICBkaXN0YW5jZXMgd2l0aCBkYXRhIHRyYW5zZmVyIHJhdGVzIHNpZ25pZmljYW50bHkgaGlnaGVyIHRoYW4gdGhvc2UKLQkgIGFjaGlldmFibGUgd2l0aCBjb21tb25seSB1c2VkIGFzeW5jaHJvbm91cyBtb2RlbSBjb25uZWN0aW9ucy4KLQkgIFVzdWFsbHksIGEgcXVpdGUgZXhwZW5zaXZlIGV4dGVybmFsIGRldmljZSBjYWxsZWQgYSBgV0FOIHJvdXRlcicgaXMKLQkgIG5lZWRlZCB0byBjb25uZWN0IHRvIGEgV0FOLgotCi0JICBBcyBhbiBhbHRlcm5hdGl2ZSwgV0FOIHJvdXRpbmcgY2FuIGJlIGJ1aWx0IGludG8gdGhlIExpbnV4IGtlcm5lbC4KLQkgIFdpdGggcmVsYXRpdmVseSBpbmV4cGVuc2l2ZSBXQU4gaW50ZXJmYWNlIGNhcmRzIGF2YWlsYWJsZSBvbiB0aGUKLQkgIG1hcmtldCwgYSBwZXJmZWN0bHkgdXNhYmxlIHJvdXRlciBjYW4gYmUgYnVpbHQgZm9yIGxlc3MgdGhhbiBoYWxmCi0JICB0aGUgcHJpY2Ugb2YgYW4gZXh0ZXJuYWwgcm91dGVyLiAgSWYgeW91IGhhdmUgb25lIG9mIHRob3NlIGNhcmRzIGFuZAotCSAgd2lzaCB0byB1c2UgeW91ciBMaW51eCBib3ggYXMgYSBXQU4gcm91dGVyLCBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvCi0JICB0aGUgV0FOIGRyaXZlciBmb3IgeW91ciBjYXJkLCBiZWxvdy4gIFlvdSB3aWxsIHRoZW4gbmVlZCB0aGUKLQkgIHdhbi10b29scyBwYWNrYWdlIHdoaWNoIGlzIGF2YWlsYWJsZSBmcm9tIDxmdHA6Ly9mdHAuc2FuZ29tYS5jb20vPi4KLQkgIFJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0PiBmb3IgbW9yZQotCSAgaW5mb3JtYXRpb24uCi0KLQkgIFRvIGNvbXBpbGUgV0FOIHJvdXRpbmcgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2Fucm91dGVyLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1tZW51ICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciCi0KLWNvbmZpZyBORVRfU0NIRUQKLQlib29sICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciCi0JLS0taGVscC0tLQotCSAgV2hlbiB0aGUga2VybmVsIGhhcyBzZXZlcmFsIHBhY2tldHMgdG8gc2VuZCBvdXQgb3ZlciBhIG5ldHdvcmsKLQkgIGRldmljZSwgaXQgaGFzIHRvIGRlY2lkZSB3aGljaCBvbmVzIHRvIHNlbmQgZmlyc3QsIHdoaWNoIG9uZXMgdG8KLQkgIGRlbGF5LCBhbmQgd2hpY2ggb25lcyB0byBkcm9wLiBUaGlzIGlzIHRoZSBqb2Igb2YgdGhlIHBhY2tldAotCSAgc2NoZWR1bGVyLCBhbmQgc2V2ZXJhbCBkaWZmZXJlbnQgYWxnb3JpdGhtcyBmb3IgaG93IHRvIGRvIHRoaXMKLQkgICJmYWlybHkiIGhhdmUgYmVlbiBwcm9wb3NlZC4KLQotCSAgSWYgeW91IHNheSBOIGhlcmUsIHlvdSB3aWxsIGdldCB0aGUgc3RhbmRhcmQgcGFja2V0IHNjaGVkdWxlciwgd2hpY2gKLQkgIGlzIGEgRklGTyAoZmlyc3QgY29tZSwgZmlyc3Qgc2VydmVkKS4gSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlCi0JICBhYmxlIHRvIGNob29zZSBmcm9tIGFtb25nIHNldmVyYWwgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtcyB3aGljaCBjYW4KLQkgIHRoZW4gYmUgYXR0YWNoZWQgdG8gZGlmZmVyZW50IG5ldHdvcmsgZGV2aWNlcy4gVGhpcyBpcyB1c2VmdWwgZm9yCi0JICBleGFtcGxlIGlmIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgYXJlIHJlYWwgdGltZSBkZXZpY2VzIHRoYXQKLQkgIG5lZWQgYSBjZXJ0YWluIG1pbmltdW0gZGF0YSBmbG93IHJhdGUsIG9yIGlmIHlvdSBuZWVkIHRvIGxpbWl0IHRoZQotCSAgbWF4aW11bSBkYXRhIGZsb3cgcmF0ZSBmb3IgdHJhZmZpYyB3aGljaCBtYXRjaGVzIHNwZWNpZmllZCBjcml0ZXJpYS4KLQkgIFRoaXMgY29kZSBpcyBjb25zaWRlcmVkIHRvIGJlIGV4cGVyaW1lbnRhbC4KLQotCSAgVG8gYWRtaW5pc3RlciB0aGVzZSBzY2hlZHVsZXJzLCB5b3UnbGwgbmVlZCB0aGUgdXNlci1sZXZlbCB1dGlsaXRpZXMKLQkgIGZyb20gdGhlIHBhY2thZ2UgaXByb3V0ZTIrdGMgYXQgPGZ0cDovL2Z0cC50dXgub3JnL3B1Yi9uZXQvaXAtcm91dGluZy8+LgotCSAgVGhhdCBwYWNrYWdlIGFsc28gY29udGFpbnMgc29tZSBkb2N1bWVudGF0aW9uOyBmb3IgbW9yZSwgY2hlY2sgb3V0Ci0JICA8aHR0cDovL3NuYWZ1LmZyZWVkb20ub3JnL2xpbnV4Mi4yL2lwcm91dGUtbm90ZXMuaHRtbD4uCi0KLQkgIFRoaXMgUXVhbGl0eSBvZiBTZXJ2aWNlIChRb1MpIHN1cHBvcnQgd2lsbCBlbmFibGUgeW91IHRvIHVzZQotCSAgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgKGRpZmZzZXJ2KSBhbmQgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wKLQkgIChSU1ZQKSBvbiB5b3VyIExpbnV4IHJvdXRlciBpZiB5b3UgYWxzbyBzYXkgWSB0byAiUW9TIHN1cHBvcnQiLAotCSAgIlBhY2tldCBjbGFzc2lmaWVyIEFQSSIgYW5kIHRvIHNvbWUgY2xhc3NpZmllcnMgYmVsb3cuIERvY3VtZW50YXRpb24KLQkgIGFuZCBzb2Z0d2FyZSBpcyBhdCA8aHR0cDovL2RpZmZzZXJ2LnNvdXJjZWZvcmdlLm5ldC8+LgotCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIiBiZWxvdywgeW91IHdpbGwgYmUgYWJsZQotCSAgdG8gcmVhZCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgcGFja2V0IHNjaGVkdWxlcnMgZnJvbSB0aGUgZmlsZQotCSAgL3Byb2MvbmV0L3BzY2hlZC4KLQotCSAgVGhlIGF2YWlsYWJsZSBzY2hlZHVsZXJzIGFyZSBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnM7IHlvdQotCSAgY2FuIHNheSBZIHRvIGFzIG1hbnkgYXMgeW91IGxpa2UuIElmIHVuc3VyZSwgc2F5IE4gbm93LgotCitzb3VyY2UgIm5ldC9lY29uZXQvS2NvbmZpZyIKK3NvdXJjZSAibmV0L3dhbnJvdXRlci9LY29uZmlnIgogc291cmNlICJuZXQvc2NoZWQvS2NvbmZpZyIKIAotZW5kbWVudQotCiBtZW51ICJOZXR3b3JrIHRlc3RpbmciCiAKIGNvbmZpZyBORVRfUEtUR0VOCkBAIC02MzUsMTIgKzIyNiw5IEBACiAJZGVmX2Jvb2wgTkVUUE9MTAogCiBzb3VyY2UgIm5ldC9heDI1L0tjb25maWciCi0KIHNvdXJjZSAibmV0L2lyZGEvS2NvbmZpZyIKLQogc291cmNlICJuZXQvYmx1ZXRvb3RoL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKLQotZW5kbWVudQorZW5kaWYgICAjIGlmIE5FVAorZW5kbWVudSAjIE5ldHdvcmtpbmcKIApkaWZmIC0tZ2l0IGEvbmV0L2F0bS9LY29uZmlnIGIvbmV0L2F0bS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYTI0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL0tjb25maWcKQEAgLTAsMCArMSw3NCBAQAorIworIyBBc3luY2hyb25vdXMgVHJhbnNmZXIgTW9kZSAoQVRNKSAoRVhQRVJJTUVOVEFMKQorIworCitjb25maWcgQVRNCisJdHJpc3RhdGUgIkFzeW5jaHJvbm91cyBUcmFuc2ZlciBNb2RlIChBVE0pIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgQVRNIGlzIGEgaGlnaC1zcGVlZCBuZXR3b3JraW5nIHRlY2hub2xvZ3kgZm9yIExvY2FsIEFyZWEgTmV0d29ya3MKKwkgIGFuZCBXaWRlIEFyZWEgTmV0d29ya3MuICBJdCB1c2VzIGEgZml4ZWQgcGFja2V0IHNpemUgYW5kIGlzCisJICBjb25uZWN0aW9uIG9yaWVudGVkLCBhbGxvd2luZyBmb3IgdGhlIG5lZ290aWF0aW9uIG9mIG1pbmltdW0KKwkgIGJhbmR3aWR0aCByZXF1aXJlbWVudHMuCisKKwkgIEluIG9yZGVyIHRvIHBhcnRpY2lwYXRlIGluIGFuIEFUTSBuZXR3b3JrLCB5b3VyIExpbnV4IGJveCBuZWVkcyBhbgorCSAgQVRNIG5ldHdvcmtpbmcgY2FyZC4gSWYgeW91IGhhdmUgdGhhdCwgc2F5IFkgaGVyZSBhbmQgdG8gdGhlIGRyaXZlcgorCSAgb2YgeW91ciBBVE0gY2FyZCBiZWxvdy4KKworCSAgTm90ZSB0aGF0IHlvdSBuZWVkIGEgc2V0IG9mIHVzZXItc3BhY2UgcHJvZ3JhbXMgdG8gYWN0dWFsbHkgbWFrZSB1c2UKKwkgIG9mIEFUTS4gIFNlZSB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYXRtLnR4dD4gZm9yCisJICBmdXJ0aGVyIGRldGFpbHMuCisKK2NvbmZpZyBBVE1fQ0xJUAorCXRyaXN0YXRlICJDbGFzc2ljYWwgSVAgb3ZlciBBVE0gKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBVE0gJiYgSU5FVAorCWhlbHAKKwkgIENsYXNzaWNhbCBJUCBvdmVyIEFUTSBmb3IgUFZDcyBhbmQgU1ZDcywgc3VwcG9ydGluZyBJbkFSUCBhbmQKKwkgIEFUTUFSUC4gSWYgeW91IHdhbnQgdG8gY29tbXVuaWNhdGlvbiB3aXRoIG90aGVyIElQIGhvc3RzIG9uIHlvdXIgQVRNCisJICBuZXR3b3JrLCB5b3Ugd2lsbCB0eXBpY2FsbHkgZWl0aGVyIHNheSBZIGhlcmUgb3IgdG8gIkxBTiBFbXVsYXRpb24KKwkgIChMQU5FKSIgYmVsb3cuCisKK2NvbmZpZyBBVE1fQ0xJUF9OT19JQ01QCisJYm9vbCAiRG8gTk9UIHNlbmQgSUNNUCBpZiBubyBuZWlnaGJvdXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBVE1fQ0xJUAorCWhlbHAKKwkgIE5vcm1hbGx5LCBhbiAiSUNNUCBob3N0IHVucmVhY2hhYmxlIiBtZXNzYWdlIGlzIHNlbnQgaWYgYSBuZWlnaGJvdXIKKwkgIGNhbm5vdCBiZSByZWFjaGVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gVkMgdG8gaXQgaW4gdGhlIGtlcm5lbCdzCisJICBBVE1BUlAgdGFibGUuIFRoaXMgbWF5IGNhdXNlIHByb2JsZW1zIHdoZW4gQVRNQVJQIHRhYmxlIGVudHJpZXMgYXJlCisJICBicmllZmx5IHJlbW92ZWQgZHVyaW5nIHJldmFsaWRhdGlvbi4gSWYgeW91IHNheSBZIGhlcmUsIHBhY2tldHMgdG8KKwkgIHN1Y2ggbmVpZ2hib3VycyBhcmUgc2lsZW50bHkgZGlzY2FyZGVkIGluc3RlYWQuCisKK2NvbmZpZyBBVE1fTEFORQorCXRyaXN0YXRlICJMQU4gRW11bGF0aW9uIChMQU5FKSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQVRNCisJaGVscAorCSAgTEFOIEVtdWxhdGlvbiBlbXVsYXRlcyBzZXJ2aWNlcyBvZiBleGlzdGluZyBMQU5zIGFjcm9zcyBhbiBBVE0KKwkgIG5ldHdvcmsuIEJlc2lkZXMgb3BlcmF0aW5nIGFzIGEgbm9ybWFsIEFUTSBlbmQgc3RhdGlvbiBjbGllbnQsIExpbnV4CisJICBMQU5FIGNsaWVudCBjYW4gYWxzbyBhY3QgYXMgYW4gcHJveHkgY2xpZW50IGJyaWRnaW5nIHBhY2tldHMgYmV0d2VlbgorCSAgRUxBTiBhbmQgRXRoZXJuZXQgc2VnbWVudHMuIFlvdSBuZWVkIExBTkUgaWYgeW91IHdhbnQgdG8gdHJ5IE1QT0EuCisKK2NvbmZpZyBBVE1fTVBPQQorCXRyaXN0YXRlICJNdWx0aS1Qcm90b2NvbCBPdmVyIEFUTSAoTVBPQSkgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFUTSAmJiBJTkVUICYmIEFUTV9MQU5FIT1uCisJaGVscAorCSAgTXVsdGktUHJvdG9jb2wgT3ZlciBBVE0gYWxsb3dzIEFUTSBlZGdlIGRldmljZXMgc3VjaCBhcyByb3V0ZXJzLAorCSAgYnJpZGdlcyBhbmQgQVRNIGF0dGFjaGVkIGhvc3RzIGVzdGFibGlzaCBkaXJlY3QgQVRNIFZDcyBhY3Jvc3MKKwkgIHN1Ym5ldHdvcmsgYm91bmRhcmllcy4gVGhlc2Ugc2hvcnRjdXQgY29ubmVjdGlvbnMgYnlwYXNzIHJvdXRlcnMKKwkgIGVuaGFuY2luZyBvdmVyYWxsIG5ldHdvcmsgcGVyZm9ybWFuY2UuCisKK2NvbmZpZyBBVE1fQlIyNjg0CisJdHJpc3RhdGUgIlJGQzE0ODMvMjY4NCBCcmlkZ2VkIHByb3RvY29scyIKKwlkZXBlbmRzIG9uIEFUTSAmJiBJTkVUCisJaGVscAorCSAgQVRNIFBWQ3MgY2FuIGNhcnJ5IGV0aGVybmV0IFBEVXMgYWNjb3JkaW5nIHRvIHJmYzI2ODQgKGZvcm1lcmx5IDE0ODMpCisJICBUaGlzIGRldmljZSB3aWxsIGFjdCBsaWtlIGFuIGV0aGVybmV0IGZyb20gdGhlIGtlcm5lbHMgcG9pbnQgb2YgdmlldywKKwkgIHdpdGggdGhlIHRyYWZmaWMgYmVpbmcgY2FycmllZCBieSBBVE0gUFZDcyAoY3VycmVudGx5IDEgUFZDL2RldmljZSkuCisJICBUaGlzIGlzIHNvbWV0aW1lcyB1c2VkIG92ZXIgRFNMIGxpbmVzLiAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgQVRNX0JSMjY4NF9JUEZJTFRFUgorCWJvb2wgIlBlci1WQyBJUCBmaWx0ZXIga2x1ZGdlIgorCWRlcGVuZHMgb24gQVRNX0JSMjY4NAorCWhlbHAKKwkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIG1lY2hhbmlzbSBmb3IgdXNlcnMgd2hvIG5lZWQgdG8gdGVybWluYXRpbmcgYQorCSAgbGFyZ2UgbnVtYmVyIG9mIElQLW9ubHkgdmNjJ3MuICBEbyBub3QgZW5hYmxlIHRoaXMgdW5sZXNzIHlvdSBhcmUgc3VyZQorCSAgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9icjI2ODQuYyBiL25ldC9hdG0vYnIyNjg0LmMKaW5kZXggZTY5NTRjZi4uMjg5OTU2YyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9icjI2ODQuYworKysgYi9uZXQvYXRtL2JyMjY4NC5jCkBAIC0yODksOCArMjg5LDcgQEAKICAqIFRoaXMgaXMgc2ltaWxhciB0byBldGhfdHlwZV90cmFucywgd2hpY2ggY2Fubm90IGJlIHVzZWQgYmVjYXVzZSBvZgogICogb3VyIGRldi0+aGFyZF9oZWFkZXJfbGVuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgYnJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgX19iZTE2IGJyX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRoaGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCmluZGV4IDJlMzQxZGUuLjkwMWVmZjcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpdiwgMSwgbGVuKTsKIH0KIAotc3RhdGljIGludCBjbXRwX3Byb2Nlc3NfdHJhbnNtaXQoc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3N0YXRpYyB2b2lkIGNtdHBfcHJvY2Vzc190cmFuc21pdChzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uKQogewogCXN0cnVjdCBza19idWZmICpza2IsICpuc2tiOwogCXVuc2lnbmVkIGNoYXIgKmhkcjsKQEAgLTIyMyw3ICsyMjMsNyBAQAogCiAJaWYgKCEobnNrYiA9IGFsbG9jX3NrYihzZXNzaW9uLT5tdHUsIEdGUF9BVE9NSUMpKSkgewogCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGZyYW1lIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm47CiAJfQogCiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2Vzc2lvbi0+dHJhbnNtaXQpKSkgewpAQCAtMjc1LDggKzI3NSw2IEBACiAJY210cF9zZW5kX2ZyYW1lKHNlc3Npb24sIG5za2ItPmRhdGEsIG5za2ItPmxlbik7CiAKIAlrZnJlZV9za2IobnNrYik7Ci0KLQlyZXR1cm4gc2tiX3F1ZXVlX2xlbigmc2Vzc2lvbi0+dHJhbnNtaXQpOwogfQogCiBzdGF0aWMgaW50IGNtdHBfc2Vzc2lvbih2b2lkICphcmcpCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwppbmRleCBhZmZiYzU1Li5kZThhZjVmIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKQEAgLTQyOCw3ICs0MjgsNyBAQAogCXJldHVybiBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaXYsIDEsIGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCitzdGF0aWMgdm9pZCBoaWRwX3Byb2Nlc3NfdHJhbnNtaXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC00NTMsOSArNDUzLDYgQEAKIAkJaGlkcF9zZXRfdGltZXIoc2Vzc2lvbik7CiAJCWtmcmVlX3NrYihza2IpOwogCX0KLQotCXJldHVybiBza2JfcXVldWVfbGVuKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KSArCi0JCQkJc2tiX3F1ZXVlX2xlbigmc2Vzc2lvbi0+aW50cl90cmFuc21pdCk7CiB9CiAKIHN0YXRpYyBpbnQgaGlkcF9zZXNzaW9uKHZvaWQgKmFyZykKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwppbmRleCBmM2Y2MzU1Li42M2ExMjNjIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCkBAIC01OTAsOCArNTkwLDExIEBACiAJZm9yICg7OykgewogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCi0JCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkgfHwgc2stPnNrX2VyciB8fCAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSB8fAotCQkJCXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8ICF0aW1lbykKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fAorCQkgICAgc2stPnNrX2VyciB8fAorCQkgICAgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgfHwKKwkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8CisJCSAgICAhdGltZW8pCiAJCQlicmVhazsKIAogCQlzZXRfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jCmluZGV4IDZkNjg5MjAuLjYzMDQ1OTAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jCkBAIC03ODEsNyArNzgxLDcgQEAKIAogCUJUX0RCRygidHR5ICVwIGRldiAlcCIsIHR0eSwgZGV2KTsKIAotCWlmIChza2JfcXVldWVfbGVuKCZkbGMtPnR4X3F1ZXVlKSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmZGxjLT50eF9xdWV1ZSkpCiAJCXJldHVybiBkbGMtPm10dTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9LY29uZmlnIGIvbmV0L2JyaWRnZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjNkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL0tjb25maWcKQEAgLTAsMCArMSwzMSBAQAorIworIyA4MDIuMWQgRXRoZXJuZXQgQnJpZGdpbmcKKyMKKworY29uZmlnIEJSSURHRQorCXRyaXN0YXRlICI4MDIuMWQgRXRoZXJuZXQgQnJpZGdpbmciCisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZW4geW91ciBMaW51eCBib3ggd2lsbCBiZSBhYmxlIHRvIGFjdCBhcyBhbgorCSAgRXRoZXJuZXQgYnJpZGdlLCB3aGljaCBtZWFucyB0aGF0IHRoZSBkaWZmZXJlbnQgRXRoZXJuZXQgc2VnbWVudHMgaXQKKwkgIGlzIGNvbm5lY3RlZCB0byB3aWxsIGFwcGVhciBhcyBvbmUgRXRoZXJuZXQgdG8gdGhlIHBhcnRpY2lwYW50cy4KKwkgIFNldmVyYWwgc3VjaCBicmlkZ2VzIGNhbiB3b3JrIHRvZ2V0aGVyIHRvIGNyZWF0ZSBldmVuIGxhcmdlcgorCSAgbmV0d29ya3Mgb2YgRXRoZXJuZXRzIHVzaW5nIHRoZSBJRUVFIDgwMi4xIHNwYW5uaW5nIHRyZWUgYWxnb3JpdGhtLgorCSAgQXMgdGhpcyBpcyBhIHN0YW5kYXJkLCBMaW51eCBicmlkZ2VzIHdpbGwgY29vcGVyYXRlIHByb3Blcmx5IHdpdGgKKwkgIG90aGVyIHRoaXJkIHBhcnR5IGJyaWRnZSBwcm9kdWN0cy4KKworCSAgSW4gb3JkZXIgdG8gdXNlIHRoZSBFdGhlcm5ldCBicmlkZ2UsIHlvdSdsbCBuZWVkIHRoZSBicmlkZ2UKKwkgIGNvbmZpZ3VyYXRpb24gdG9vbHM7IHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYnJpZGdlLnR4dD4KKwkgIGZvciBsb2NhdGlvbi4gUGxlYXNlIHJlYWQgdGhlIEJyaWRnZSBtaW5pLUhPV1RPIGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgSWYgeW91IGVuYWJsZSBpcHRhYmxlcyBzdXBwb3J0IGFsb25nIHdpdGggdGhlIGJyaWRnZSBzdXBwb3J0IHRoZW4geW91CisJICB0dXJuIHlvdXIgYnJpZGdlIGludG8gYSBicmlkZ2luZyBJUCBmaXJld2FsbC4KKwkgIGlwdGFibGVzIHdpbGwgdGhlbiBzZWUgdGhlIElQIHBhY2tldHMgYmVpbmcgYnJpZGdlZCwgc28geW91IG5lZWQgdG8KKwkgIHRha2UgdGhpcyBpbnRvIGFjY291bnQgd2hlbiBzZXR0aW5nIHVwIHlvdXIgZmlyZXdhbGwgcnVsZXMuCisJICBFbmFibGluZyBhcnB0YWJsZXMgc3VwcG9ydCB3aGVuIGJyaWRnaW5nIHdpbGwgbGV0IGFycHRhYmxlcyBzZWUKKwkgIGJyaWRnZWQgQVJQIHRyYWZmaWMgaW4gdGhlIGFycHRhYmxlcyBGT1JXQVJEIGNoYWluLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYnJpZGdlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCA3MDE2ZTBjLi5mZjlkYzAyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKIGV4dGVybiB2b2lkIHNrYl9yZWxlYXNlX2RhdGEoc3RydWN0IHNrX2J1ZmYgKik7CiAKIC8qIEtlZXAgaGVhZCB0aGUgc2FtZTogcmVwbGFjZSBkYXRhICovCi1pbnQgX19za2JfbGluZWFyaXplKHN0cnVjdCBza19idWZmICpza2IsIGludCBnZnBfbWFzaykKK2ludCBfX3NrYl9saW5lYXJpemUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQogewogCXVuc2lnbmVkIGludCBzaXplOwogCXU4ICpkYXRhOwpAQCAtMjA4OSwxMCArMjA4OSwxMSBAQAogewogCXVuc2lnbmVkIHNob3J0IG9sZF9mbGFncyA9IGRldi0+ZmxhZ3M7CiAKLQlkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOwogCWlmICgoZGV2LT5wcm9taXNjdWl0eSArPSBpbmMpID09IDApCiAJCWRldi0+ZmxhZ3MgJj0gfklGRl9QUk9NSVNDOwotCWlmIChkZXYtPmZsYWdzIF4gb2xkX2ZsYWdzKSB7CisJZWxzZQorCQlkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOworCWlmIChkZXYtPmZsYWdzICE9IG9sZF9mbGFncykgewogCQlkZXZfbWNfdXBsb2FkKGRldik7CiAJCXByaW50ayhLRVJOX0lORk8gImRldmljZSAlcyAlcyBwcm9taXNjdW91cyBtb2RlXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/ICJlbnRlcmVkIiA6CmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jCmluZGV4IGYzYjg4MjAuLmNkOTFhMjQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2ZpbHRlci5jCisrKyBiL25ldC9jb3JlL2ZpbHRlci5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAKIC8qIE5vIGh1cnJ5IGluIHRoaXMgYnJhbmNoICovCi1zdGF0aWMgdTggKmxvYWRfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaykKK3N0YXRpYyB2b2lkICpfX2xvYWRfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaykKIHsKIAl1OCAqcHRyID0gTlVMTDsKIApAQCAtNTAsNiArNTAsMTggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkICpsb2FkX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqYnVmZmVyKQoreworCWlmIChrID49IDApCisJCXJldHVybiBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBrLCBzaXplLCBidWZmZXIpOworCWVsc2UgeworCQlpZiAoayA+PSBTS0ZfQURfT0ZGKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBfX2xvYWRfcG9pbnRlcihza2IsIGspOworCX0KK30KKwogLyoqCiAgKglza19ydW5fZmlsdGVyCS0gCXJ1biBhIGZpbHRlciBvbiBhIHNvY2tldAogICoJQHNrYjogYnVmZmVyIHRvIHJ1biB0aGUgZmlsdGVyIG9uCkBAIC02NCwxNSArNzYsMTIgQEAKICAKIGludCBza19ydW5fZmlsdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrX2ZpbHRlciAqZmlsdGVyLCBpbnQgZmxlbikKIHsKLQl1bnNpZ25lZCBjaGFyICpkYXRhID0gc2tiLT5kYXRhOwotCS8qIGxlbiBpcyBVTlNJR05FRC4gQnl0ZSB3aWRlIGluc25zIHJlbGllcyBvbmx5IG9uIGltcGxpY2l0Ci0JICAgdHlwZSBjYXN0cyB0byBwcmV2ZW50IHJlYWRpbmcgYXJiaXRyYXJ5IG1lbW9yeSBsb2NhdGlvbnMuCi0JICovCi0JdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuLXNrYi0+ZGF0YV9sZW47CiAJc3RydWN0IHNvY2tfZmlsdGVyICpmZW50cnk7CS8qIFdlIHdhbGsgZG93biB0aGVzZSAqLworCXZvaWQgKnB0cjsKIAl1MzIgQSA9IDA7CSAgIAkJLyogQWNjdW11bGF0b3IgKi8KIAl1MzIgWCA9IDA7ICAgCQkJLyogSW5kZXggUmVnaXN0ZXIgKi8KIAl1MzIgbWVtW0JQRl9NRU1XT1JEU107CQkvKiBTY3JhdGNoIE1lbW9yeSBTdG9yZSAqLworCXUzMiB0bXA7CiAJaW50IGs7CiAJaW50IHBjOwogCkBAIC0xNjgsODYgKzE3NywzNSBAQAogCQljYXNlIEJQRl9MRHxCUEZfV3xCUEZfQUJTOgogCQkJayA9IGZlbnRyeS0+azsKICBsb2FkX3c6Ci0JCQlpZiAoayA+PSAwICYmICh1bnNpZ25lZCBpbnQpKGsrc2l6ZW9mKHUzMikpIDw9IGxlbikgewotCQkJCUEgPSBudG9obCgqKHUzMiopJmRhdGFba10pOworCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgaywgNCwgJnRtcCk7CisJCQlpZiAocHRyICE9IE5VTEwpIHsKKwkJCQlBID0gbnRvaGwoKih1MzIgKilwdHIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKGsgPCAwKSB7Ci0JCQkJdTggKnB0cjsKLQotCQkJCWlmIChrID49IFNLRl9BRF9PRkYpCi0JCQkJCWJyZWFrOwotCQkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGspOwotCQkJCWlmIChwdHIpIHsKLQkJCQkJQSA9IG50b2hsKCoodTMyKilwdHIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXUzMiBfdG1wLCAqcDsKLQkJCQlwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaywgNCwgJl90bXApOwotCQkJCWlmIChwICE9IE5VTEwpIHsKLQkJCQkJQSA9IG50b2hsKCpwKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQogCQkJcmV0dXJuIDA7CiAJCWNhc2UgQlBGX0xEfEJQRl9IfEJQRl9BQlM6CiAJCQlrID0gZmVudHJ5LT5rOwogIGxvYWRfaDoKLQkJCWlmIChrID49IDAgJiYgKHVuc2lnbmVkIGludCkoayArIHNpemVvZih1MTYpKSA8PSBsZW4pIHsKLQkJCQlBID0gbnRvaHMoKih1MTYqKSZkYXRhW2tdKTsKKwkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGssIDIsICZ0bXApOworCQkJaWYgKHB0ciAhPSBOVUxMKSB7CisJCQkJQSA9IG50b2hzKCoodTE2ICopcHRyKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmIChrIDwgMCkgewotCQkJCXU4ICpwdHI7Ci0KLQkJCQlpZiAoayA+PSBTS0ZfQURfT0ZGKQotCQkJCQlicmVhazsKLQkJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrKTsKLQkJCQlpZiAocHRyKSB7Ci0JCQkJCUEgPSBudG9ocygqKHUxNiopcHRyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl1MTYgX3RtcCwgKnA7Ci0JCQkJcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGssIDIsICZfdG1wKTsKLQkJCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkJCUEgPSBudG9ocygqcCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KIAkJCXJldHVybiAwOwogCQljYXNlIEJQRl9MRHxCUEZfQnxCUEZfQUJTOgogCQkJayA9IGZlbnRyeS0+azsKIGxvYWRfYjoKLQkJCWlmIChrID49IDAgJiYgKHVuc2lnbmVkIGludClrIDwgbGVuKSB7Ci0JCQkJQSA9IGRhdGFba107CisJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrLCAxLCAmdG1wKTsKKwkJCWlmIChwdHIgIT0gTlVMTCkgeworCQkJCUEgPSAqKHU4ICopcHRyOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKGsgPCAwKSB7Ci0JCQkJdTggKnB0cjsKLQotCQkJCWlmIChrID49IFNLRl9BRF9PRkYpCi0JCQkJCWJyZWFrOwotCQkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGspOwotCQkJCWlmIChwdHIpIHsKLQkJCQkJQSA9ICpwdHI7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdTggX3RtcCwgKnA7Ci0JCQkJcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGssIDEsICZfdG1wKTsKLQkJCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkJCUEgPSAqcDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQogCQkJcmV0dXJuIDA7CiAJCWNhc2UgQlBGX0xEfEJQRl9XfEJQRl9MRU46Ci0JCQlBID0gbGVuOworCQkJQSA9IHNrYi0+bGVuOwogCQkJY29udGludWU7CiAJCWNhc2UgQlBGX0xEWHxCUEZfV3xCUEZfTEVOOgotCQkJWCA9IGxlbjsKKwkJCVggPSBza2ItPmxlbjsKIAkJCWNvbnRpbnVlOwogCQljYXNlIEJQRl9MRHxCUEZfV3xCUEZfSU5EOgogCQkJayA9IFggKyBmZW50cnktPms7CkBAIC0yNTksMTAgKzIxNywxMiBAQAogCQkJayA9IFggKyBmZW50cnktPms7CiAJCQlnb3RvIGxvYWRfYjsKIAkJY2FzZSBCUEZfTERYfEJQRl9CfEJQRl9NU0g6Ci0JCQlpZiAoZmVudHJ5LT5rID49IGxlbikKLQkJCQlyZXR1cm4gMDsKLQkJCVggPSAoZGF0YVtmZW50cnktPmtdICYgMHhmKSA8PCAyOwotCQkJY29udGludWU7CisJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBmZW50cnktPmssIDEsICZ0bXApOworCQkJaWYgKHB0ciAhPSBOVUxMKSB7CisJCQkJWCA9ICgqKHU4ICopcHRyICYgMHhmKSA8PCAyOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dXJuIDA7CiAJCWNhc2UgQlBGX0xEfEJQRl9JTU06CiAJCQlBID0gZmVudHJ5LT5rOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IGJiNzNiMjEuLmQ5ZjdiMDYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC0xMjksNyArMTI5LDcgQEAKICAqCUJ1ZmZlcnMgbWF5IG9ubHkgYmUgYWxsb2NhdGVkIGZyb20gaW50ZXJydXB0cyB1c2luZyBhIEBnZnBfbWFzayBvZgogICoJJUdGUF9BVE9NSUMuCiAgKi8KLXN0cnVjdCBza19idWZmICphbGxvY19za2IodW5zaWduZWQgaW50IHNpemUsIGludCBnZnBfbWFzaykKK3N0cnVjdCBza19idWZmICphbGxvY19za2IodW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXU4ICpkYXRhOwpAQCAtMTgyLDcgKzE4Miw4IEBACiAgKgklR0ZQX0FUT01JQy4KICAqLwogc3RydWN0IHNrX2J1ZmYgKmFsbG9jX3NrYl9mcm9tX2NhY2hlKGttZW1fY2FjaGVfdCAqY3AsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGdmcF9tYXNrKQorCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1OCAqZGF0YTsKQEAgLTMyMiw3ICszMjMsNyBAQAogICoJJUdGUF9BVE9NSUMuCiAgKi8KIAotc3RydWN0IHNrX2J1ZmYgKnNrYl9jbG9uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwX21hc2spCitzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2Nsb25lKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbiA9IGttZW1fY2FjaGVfYWxsb2Moc2tidWZmX2hlYWRfY2FjaGUsIGdmcF9tYXNrKTsKIApAQCAtMzU3LDcgKzM1OCw2IEBACiAJQyhpcF9zdW1tZWQpOwogCUMocHJpb3JpdHkpOwogCUMocHJvdG9jb2wpOwotCUMoc2VjdXJpdHkpOwogCW4tPmRlc3RydWN0b3IgPSBOVUxMOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKIAlDKG5mbWFyayk7CkBAIC00MjIsNyArNDIyLDYgQEAKIAluZXctPnBrdF90eXBlCT0gb2xkLT5wa3RfdHlwZTsKIAluZXctPnN0YW1wCT0gb2xkLT5zdGFtcDsKIAluZXctPmRlc3RydWN0b3IgPSBOVUxMOwotCW5ldy0+c2VjdXJpdHkJPSBvbGQtPnNlY3VyaXR5OwogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKIAluZXctPm5mbWFyawk9IG9sZC0+bmZtYXJrOwogCW5ldy0+bmZjYWNoZQk9IG9sZC0+bmZjYWNoZTsKQEAgLTQ2Miw3ICs0NjEsNyBAQAogICoJaGVhZGVyIGlzIGdvaW5nIHRvIGJlIG1vZGlmaWVkLiBVc2UgcHNrYl9jb3B5KCkgaW5zdGVhZC4KICAqLwogCi1zdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcF9tYXNrKQorc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlpbnQgaGVhZGVybGVuID0gc2tiLT5kYXRhIC0gc2tiLT5oZWFkOwogCS8qCkBAIC01MDEsNyArNTAwLDcgQEAKICAqCVRoZSByZXR1cm5lZCBidWZmZXIgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCiAgKi8KIAotc3RydWN0IHNrX2J1ZmYgKnBza2JfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwX21hc2spCitzdHJ1Y3Qgc2tfYnVmZiAqcHNrYl9jb3B5KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAkvKgogCSAqCUFsbG9jYXRlIHRoZSBjb3B5IGJ1ZmZlcgpAQCAtNTU5LDcgKzU1OCw4IEBACiAgKglyZWxvYWRlZCBhZnRlciBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCiAgKi8KIAotaW50IHBza2JfZXhwYW5kX2hlYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5oZWFkLCBpbnQgbnRhaWwsIGludCBnZnBfbWFzaykKK2ludCBwc2tiX2V4cGFuZF9oZWFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBuaGVhZCwgaW50IG50YWlsLAorCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlpbnQgaTsKIAl1OCAqZGF0YTsKQEAgLTY0OSw3ICs2NDksOCBAQAogICoJb25seSBieSBuZXRmaWx0ZXIgaW4gdGhlIGNhc2VzIHdoZW4gY2hlY2tzdW0gaXMgcmVjYWxjdWxhdGVkPyAtLUFOSwogICovCiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHlfZXhwYW5kKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJaW50IG5ld2hlYWRyb29tLCBpbnQgbmV3dGFpbHJvb20sIGludCBnZnBfbWFzaykKKwkJCQlpbnQgbmV3aGVhZHJvb20sIGludCBuZXd0YWlscm9vbSwKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJLyoKIAkgKglBbGxvY2F0ZSB0aGUgY29weSBidWZmZXIKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCBhNmVjM2FkLi44YjM1Y2NkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC02MjIsNyArNjIyLDggQEAKICAqCUBwcm90OiBzdHJ1Y3QgcHJvdG8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IHNvY2sgaW5zdGFuY2UKICAqCUB6ZXJvX2l0OiBpZiB3ZSBzaG91bGQgemVybyB0aGUgbmV3bHkgYWxsb2NhdGVkIHNvY2sKICAqLwotc3RydWN0IHNvY2sgKnNrX2FsbG9jKGludCBmYW1pbHksIGludCBwcmlvcml0eSwgc3RydWN0IHByb3RvICpwcm90LCBpbnQgemVyb19pdCkKK3N0cnVjdCBzb2NrICpza19hbGxvYyhpbnQgZmFtaWx5LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHksCisJCSAgICAgIHN0cnVjdCBwcm90byAqcHJvdCwgaW50IHplcm9faXQpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKIAlrbWVtX2NhY2hlX3QgKnNsYWIgPSBwcm90LT5zbGFiOwpAQCAtNzUwLDcgKzc1MSw4IEBACiAvKgogICogQWxsb2NhdGUgYSBza2IgZnJvbSB0aGUgc29ja2V0J3Mgc2VuZCBidWZmZXIuCiAgKi8KLXN0cnVjdCBza19idWZmICpzb2NrX3dtYWxsb2Moc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBmb3JjZSwgaW50IHByaW9yaXR5KQorc3RydWN0IHNrX2J1ZmYgKnNvY2tfd21hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGZvcmNlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpCiB7CiAJaWYgKGZvcmNlIHx8IGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPCBzay0+c2tfc25kYnVmKSB7CiAJCXN0cnVjdCBza19idWZmICogc2tiID0gYWxsb2Nfc2tiKHNpemUsIHByaW9yaXR5KTsKQEAgLTc2NSw3ICs3NjcsOCBAQAogLyoKICAqIEFsbG9jYXRlIGEgc2tiIGZyb20gdGhlIHNvY2tldCdzIHJlY2VpdmUgYnVmZmVyLgogICovIAotc3RydWN0IHNrX2J1ZmYgKnNvY2tfcm1hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGZvcmNlLCBpbnQgcHJpb3JpdHkpCitzdHJ1Y3Qgc2tfYnVmZiAqc29ja19ybWFsbG9jKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsCisJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSkKIHsKIAlpZiAoZm9yY2UgfHwgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8IHNrLT5za19yY3ZidWYpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplLCBwcmlvcml0eSk7CkBAIC03ODAsNyArNzgzLDcgQEAKIC8qIAogICogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSB0aGUgc29ja2V0J3Mgb3B0aW9uIG1lbW9yeSBidWZmZXIuCiAgKi8gCi12b2lkICpzb2NrX2ttYWxsb2Moc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSwgaW50IHByaW9yaXR5KQordm9pZCAqc29ja19rbWFsbG9jKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSkKIHsKIAlpZiAoKHVuc2lnbmVkKXNpemUgPD0gc3lzY3RsX29wdG1lbV9tYXggJiYKIAkgICAgYXRvbWljX3JlYWQoJnNrLT5za19vbWVtX2FsbG9jKSArIHNpemUgPCBzeXNjdGxfb3B0bWVtX21heCkgewpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9LY29uZmlnIGIvbmV0L2RlY25ldC9LY29uZmlnCmluZGV4IDIxMDFkYTUuLjkyZjJlYzQgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvS2NvbmZpZworKysgYi9uZXQvZGVjbmV0L0tjb25maWcKQEAgLTEsNiArMSwyOSBAQAogIwogIyBERUNuZXQgY29uZmlndXJhdGlvbgogIworY29uZmlnIERFQ05FVAorCXRyaXN0YXRlICJERUNuZXQgU3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBUaGUgREVDbmV0IG5ldHdvcmtpbmcgcHJvdG9jb2wgd2FzIHVzZWQgaW4gbWFueSBwcm9kdWN0cyBtYWRlIGJ5CisJICBEaWdpdGFsIChub3cgQ29tcGFxKS4gIEl0IHByb3ZpZGVzIHJlbGlhYmxlIHN0cmVhbSBhbmQgc2VxdWVuY2VkCisJICBwYWNrZXQgY29tbXVuaWNhdGlvbnMgb3ZlciB3aGljaCBydW4gYSB2YXJpZXR5IG9mIHNlcnZpY2VzIHNpbWlsYXIKKwkgIHRvIHRob3NlIHdoaWNoIHJ1biBvdmVyIFRDUC9JUC4KKworCSAgVG8gZmluZCBzb21lIHRvb2xzIHRvIHVzZSB3aXRoIHRoZSBrZXJuZWwgbGF5ZXIgc3VwcG9ydCwgcGxlYXNlCisJICBsb29rIGF0IFBhdHJpY2sgQ2F1bGZpZWxkJ3Mgd2ViIHNpdGU6CisJICA8aHR0cDovL2xpbnV4LWRlY25ldC5zb3VyY2Vmb3JnZS5uZXQvPi4KKworCSAgTW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RlY25ldC50eHQ+LgorCisJICBCZSBzdXJlIHRvIHNheSBZIHRvICIvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0IiBhbmQgIlN5c2N0bCBzdXBwb3J0IgorCSAgYmVsb3cgd2hlbiB1c2luZyBERUNuZXQsIHNpbmNlIHlvdSB3aWxsIG5lZWQgc3lzY3RsIHN1cHBvcnQgdG8gYWlkCisJICBpbiBjb25maWd1cmF0aW9uIGF0IHJ1biB0aW1lLgorCisJICBUaGUgREVDbmV0IGNvZGUgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuCisJICBUaGUgbW9kdWxlIGlzIGNhbGxlZCBkZWNuZXQuCisKIGNvbmZpZyBERUNORVRfUk9VVEVSCiAJYm9vbCAiREVDbmV0OiByb3V0ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIERFQ05FVCAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCmluZGV4IDI5YmIzY2QuLjk2YTAyODAgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKKysrIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJICogd2UgYXJlIGRvdWJsZSBjaGVja2luZyB0aGF0IHdlIGFyZSBub3Qgc2VuZGluZyB0b28KIAkgKiBtYW55IG9mIHRoZXNlIGtlZXBhbGl2ZSBmcmFtZXMuCiAJICovCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZSkgPT0gMCkKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3htaXRfcXVldWUpKQogCQlkbl9uc3Bfc2VuZF9saW5rKHNrLCBETl9OT0NIQU5HRSwgMCk7CiB9CiAKQEAgLTExOTEsNyArMTE5MSw3IEBACiAJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOwogCWludCBtYXNrID0gZGF0YWdyYW1fcG9sbChmaWxlLCBzb2NrLCB3YWl0KTsKIAotCWlmIChza2JfcXVldWVfbGVuKCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpKQogCQltYXNrIHw9IFBPTExSREJBTkQ7CiAKIAlyZXR1cm4gbWFzazsKQEAgLTEyMTQsNyArMTIxNCw3IEBACiAKIAljYXNlIFNJT0NBVE1BUks6CiAJCWxvY2tfc29jayhzayk7Ci0JCXZhbCA9IChza2JfcXVldWVfbGVuKCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpICE9IDApOworCQl2YWwgPSAhc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpOwogCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9SVU4pCiAJCQl2YWwgPSAtRU5PVENPTk47CiAJCXJlbGVhc2Vfc29jayhzayk7CkBAIC0xNjMwLDcgKzE2MzAsNyBAQAogCWludCBsZW4gPSAwOwogCiAJaWYgKGZsYWdzICYgTVNHX09PQikKLQkJcmV0dXJuIHNrYl9xdWV1ZV9sZW4ocSkgPyAxIDogMDsKKwkJcmV0dXJuICFza2JfcXVldWVfZW1wdHkocSkgPyAxIDogMDsKIAogCXdoaWxlKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKilxKSB7CiAJCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CkBAIC0xNzA3LDcgKzE3MDcsNyBAQAogCQlpZiAoc2stPnNrX2VycikKIAkJCWdvdG8gb3V0OwogCi0JCWlmIChza2JfcXVldWVfbGVuKCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpKSB7CisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3JlY2VpdmVfcXVldWUpKSB7CiAJCQlpZiAoIShmbGFncyAmIE1TR19PT0IpKSB7CiAJCQkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX09PQjsKIAkJCQlpZiAoIXNjcC0+b3RoZXJfcmVwb3J0KSB7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX2ZpYi5jIGIvbmV0L2RlY25ldC9kbl9maWIuYwppbmRleCA5OTM0YjI1Li45OWJjMDYxIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX2ZpYi5jCisrKyBiL25ldC9kZWNuZXQvZG5fZmliLmMKQEAgLTU1MSw3ICs1NTEsOCBAQAogCQlpZiAodCA8IHNfdCkKIAkJCWNvbnRpbnVlOwogCQlpZiAodCA+IHNfdCkKLQkJCW1lbXNldCgmY2ItPmFyZ3NbMV0sIDAsIHNpemVvZihjYi0+YXJncyktc2l6ZW9mKGludCkpOworCQkJbWVtc2V0KCZjYi0+YXJnc1sxXSwgMCwKKwkJCSAgICAgICBzaXplb2YoY2ItPmFyZ3MpIC0gc2l6ZW9mKGNiLT5hcmdzWzBdKSk7CiAJCXRiID0gZG5fZmliX2dldF90YWJsZSh0LCAwKTsKIAkJaWYgKHRiID09IE5VTEwpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fbnNwX291dC5jIGIvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKaW5kZXggNDJhYmJmMy4uOGNjZTFmZCAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKKysrIGIvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKQEAgLTM0Miw3ICszNDIsOCBAQAogCiAJZG5fbnNwX291dHB1dChzayk7CiAKLQlpZiAoc2tiX3F1ZXVlX2xlbigmc2NwLT5kYXRhX3htaXRfcXVldWUpIHx8IHNrYl9xdWV1ZV9sZW4oJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNjcC0+ZGF0YV94bWl0X3F1ZXVlKSB8fAorCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPm90aGVyX3htaXRfcXVldWUpKQogCQlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9lY29uZXQvS2NvbmZpZyBiL25ldC9lY29uZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWEyZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2Vjb25ldC9LY29uZmlnCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgQWNvcm4gRWNvbmV0L0FVTiBwcm90b2NvbHMgCisjCisKK2NvbmZpZyBFQ09ORVQKKwl0cmlzdGF0ZSAiQWNvcm4gRWNvbmV0L0FVTiBwcm90b2NvbHMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgSU5FVAorCS0tLWhlbHAtLS0KKwkgIEVjb25ldCBpcyBhIGZhaXJseSBvbGQgYW5kIHNsb3cgbmV0d29ya2luZyBwcm90b2NvbCBtYWlubHkgdXNlZCBieQorCSAgQWNvcm4gY29tcHV0ZXJzIHRvIGFjY2VzcyBmaWxlIGFuZCBwcmludCBzZXJ2ZXJzLiBJdCB1c2VzIG5hdGl2ZQorCSAgRWNvbmV0IG5ldHdvcmsgY2FyZHMuIEFVTiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGlnaGVyIGxldmVsCisJICBwYXJ0cyBvZiBFY29uZXQgdGhhdCBydW5zIG92ZXIgb3JkaW5hcnkgRXRoZXJuZXQgY29ubmVjdGlvbnMsIG9uCisJICB0b3Agb2YgdGhlIFVEUCBwYWNrZXQgcHJvdG9jb2wsIHdoaWNoIGluIHR1cm4gcnVucyBvbiB0b3Agb2YgdGhlCisJICBJbnRlcm5ldCBwcm90b2NvbCBJUC4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSBjYW4gY2hvb3NlIHdpdGggdGhlIG5leHQgdHdvIG9wdGlvbnMgd2hldGhlcgorCSAgdG8gc2VuZCBFY29uZXQvQVVOIHRyYWZmaWMgb3ZlciBhIFVEUCBFdGhlcm5ldCBjb25uZWN0aW9uIG9yIG92ZXIKKwkgIGEgbmF0aXZlIEVjb25ldCBuZXR3b3JrIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGVjb25ldC4KKworY29uZmlnIEVDT05FVF9BVU5VRFAKKwlib29sICJBVU4gb3ZlciBVRFAiCisJZGVwZW5kcyBvbiBFQ09ORVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHNlbmQgRWNvbmV0L0FVTiB0cmFmZmljIG92ZXIgYSBVRFAKKwkgIGNvbm5lY3Rpb24gKFVEUCBpcyBhIHBhY2tldCBiYXNlZCBwcm90b2NvbCB0aGF0IHJ1bnMgb24gdG9wIG9mIHRoZQorCSAgSW50ZXJuZXQgcHJvdG9jb2wgSVApIHVzaW5nIGFuIG9yZGluYXJ5IEV0aGVybmV0IG5ldHdvcmsgY2FyZC4KKworY29uZmlnIEVDT05FVF9OQVRJVkUKKwlib29sICJOYXRpdmUgRWNvbmV0IgorCWRlcGVuZHMgb24gRUNPTkVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIG5hdGl2ZSBFY29uZXQgbmV0d29yayBjYXJkIGluc3RhbGxlZCBpbgorCSAgeW91ciBjb21wdXRlci4KZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguYwppbmRleCBhYjYwZWE2Li5mNmRiZmI5IDEwMDY0NAotLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmMKKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jCkBAIC0xNTUsNyArMTU1LDcgQEAKICAqCVRoaXMgaXMgbm9ybWFsIHByYWN0aWNlIGFuZCB3b3JrcyBmb3IgYW55ICdub3cgaW4gdXNlJyBwcm90b2NvbC4KICAqLwogIAotdW5zaWduZWQgc2hvcnQgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK19fYmUxNiBldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBldGhoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvS2NvbmZpZyBiL25ldC9pcHY0L0tjb25maWcKaW5kZXggM2U2MzEyMy4uZGY1Mzg2ODggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L0tjb25maWcKKysrIGIvbmV0L2lwdjQvS2NvbmZpZwpAQCAtMyw3ICszLDYgQEAKICMKIGNvbmZpZyBJUF9NVUxUSUNBU1QKIAlib29sICJJUDogbXVsdGljYXN0aW5nIgotCWRlcGVuZHMgb24gSU5FVAogCWhlbHAKIAkgIFRoaXMgaXMgY29kZSBmb3IgYWRkcmVzc2luZyBzZXZlcmFsIG5ldHdvcmtlZCBjb21wdXRlcnMgYXQgb25jZSwKIAkgIGVubGFyZ2luZyB5b3VyIGtlcm5lbCBieSBhYm91dCAyIEtCLiBZb3UgbmVlZCBtdWx0aWNhc3RpbmcgaWYgeW91CkBAIC0xNyw3ICsxNiw2IEBACiAKIGNvbmZpZyBJUF9BRFZBTkNFRF9ST1VURVIKIAlib29sICJJUDogYWR2YW5jZWQgcm91dGVyIgotCWRlcGVuZHMgb24gSU5FVAogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBpbnRlbmQgdG8gcnVuIHlvdXIgTGludXggYm94IG1vc3RseSBhcyBhIHJvdXRlciwgaS5lLiBhcyBhCiAJICBjb21wdXRlciB0aGF0IGZvcndhcmRzIGFuZCByZWRpc3RyaWJ1dGVzIG5ldHdvcmsgcGFja2V0cywgc2F5IFk7IHlvdQpAQCAtMTgzLDcgKzE4MSw2IEBACiAKIGNvbmZpZyBJUF9QTlAKIAlib29sICJJUDoga2VybmVsIGxldmVsIGF1dG9jb25maWd1cmF0aW9uIgotCWRlcGVuZHMgb24gSU5FVAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBhdXRvbWF0aWMgY29uZmlndXJhdGlvbiBvZiBJUCBhZGRyZXNzZXMgb2YgZGV2aWNlcyBhbmQKIAkgIG9mIHRoZSByb3V0aW5nIHRhYmxlIGR1cmluZyBrZXJuZWwgYm9vdCwgYmFzZWQgb24gZWl0aGVyIGluZm9ybWF0aW9uCkBAIC0yNDIsNyArMjM5LDYgQEAKICMgICBib29sICcgICAgSVA6IEFSUCBzdXBwb3J0JyBDT05GSUdfSVBfUE5QX0FSUAkJCiBjb25maWcgTkVUX0lQSVAKIAl0cmlzdGF0ZSAiSVA6IHR1bm5lbGluZyIKLQlkZXBlbmRzIG9uIElORVQKIAlzZWxlY3QgSU5FVF9UVU5ORUwKIAktLS1oZWxwLS0tCiAJICBUdW5uZWxpbmcgbWVhbnMgZW5jYXBzdWxhdGluZyBkYXRhIG9mIG9uZSBwcm90b2NvbCB0eXBlIHdpdGhpbgpAQCAtMjYwLDcgKzI1Niw2IEBACiAKIGNvbmZpZyBORVRfSVBHUkUKIAl0cmlzdGF0ZSAiSVA6IEdSRSB0dW5uZWxzIG92ZXIgSVAiCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAloZWxwCiAJICBUdW5uZWxpbmcgbWVhbnMgZW5jYXBzdWxhdGluZyBkYXRhIG9mIG9uZSBwcm90b2NvbCB0eXBlIHdpdGhpbgpAQCAtMzE5LDcgKzMxNCw3IEBACiAKIGNvbmZpZyBBUlBECiAJYm9vbCAiSVA6IEFSUCBkYWVtb24gc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAktLS1oZWxwLS0tCiAJICBOb3JtYWxseSwgdGhlIGtlcm5lbCBtYWludGFpbnMgYW4gaW50ZXJuYWwgY2FjaGUgd2hpY2ggbWFwcyBJUAogCSAgYWRkcmVzc2VzIHRvIGhhcmR3YXJlIGFkZHJlc3NlcyBvbiB0aGUgbG9jYWwgbmV0d29yaywgc28gdGhhdApAQCAtMzQ0LDcgKzMzOSw2IEBACiAKIGNvbmZpZyBTWU5fQ09PS0lFUwogCWJvb2wgIklQOiBUQ1Agc3luY29va2llIHN1cHBvcnQgKGRpc2FibGVkIHBlciBkZWZhdWx0KSIKLQlkZXBlbmRzIG9uIElORVQKIAktLS1oZWxwLS0tCiAJICBOb3JtYWwgVENQL0lQIG5ldHdvcmtpbmcgaXMgb3BlbiB0byBhbiBhdHRhY2sga25vd24gYXMgIlNZTgogCSAgZmxvb2RpbmciLiBUaGlzIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFjayBwcmV2ZW50cyBsZWdpdGltYXRlIHJlbW90ZQpAQCAtMzgxLDcgKzM3NSw2IEBACiAKIGNvbmZpZyBJTkVUX0FICiAJdHJpc3RhdGUgIklQOiBBSCB0cmFuc2Zvcm1hdGlvbiIKLQlkZXBlbmRzIG9uIElORVQKIAlzZWxlY3QgWEZSTQogCXNlbGVjdCBDUllQVE8KIAlzZWxlY3QgQ1JZUFRPX0hNQUMKQEAgLTM5NCw3ICszODcsNiBAQAogCiBjb25maWcgSU5FVF9FU1AKIAl0cmlzdGF0ZSAiSVA6IEVTUCB0cmFuc2Zvcm1hdGlvbiIKLQlkZXBlbmRzIG9uIElORVQKIAlzZWxlY3QgWEZSTQogCXNlbGVjdCBDUllQVE8KIAlzZWxlY3QgQ1JZUFRPX0hNQUMKQEAgLTQwOCw3ICs0MDAsNiBAQAogCiBjb25maWcgSU5FVF9JUENPTVAKIAl0cmlzdGF0ZSAiSVA6IElQQ29tcCB0cmFuc2Zvcm1hdGlvbiIKLQlkZXBlbmRzIG9uIElORVQKIAlzZWxlY3QgWEZSTQogCXNlbGVjdCBJTkVUX1RVTk5FTAogCXNlbGVjdCBDUllQVE8KQEAgLTQyMSw3ICs0MTIsNiBAQAogCiBjb25maWcgSU5FVF9UVU5ORUwKIAl0cmlzdGF0ZSAiSVA6IHR1bm5lbCB0cmFuc2Zvcm1hdGlvbiIKLQlkZXBlbmRzIG9uIElORVQKIAlzZWxlY3QgWEZSTQogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIGdlbmVyaWMgSVAgdHVubmVsIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBpcyByZXF1aXJlZCBieQpAQCAtNDMxLDcgKzQyMSw2IEBACiAKIGNvbmZpZyBJUF9UQ1BESUFHCiAJdHJpc3RhdGUgIklQOiBUQ1Agc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIgotCWRlcGVuZHMgb24gSU5FVAogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIFRDUCBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2UgdXNlZCBieSBuYXRpdmUgTGludXgKQEAgLTQ0Nyw3ICs0MzYsNiBAQAogCiBjb25maWcgVENQX0NPTkdfQURWQU5DRUQKIAlib29sICJUQ1A6IGFkdmFuY2VkIGNvbmdlc3Rpb24gY29udHJvbCIKLQlkZXBlbmRzIG9uIElORVQKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciBzZWxlY3Rpb24gb2YgdmFyaW91cyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCiAJICBtb2R1bGVzLgpAQCAtNDYzLDcgKzQ1MSw2IEBACiAKIGNvbmZpZyBUQ1BfQ09OR19CSUMKIAl0cmlzdGF0ZSAiQmluYXJ5IEluY3JlYXNlIENvbmdlc3Rpb24gKEJJQykgY29udHJvbCIKLQlkZXBlbmRzIG9uIElORVQKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJQklDLVRDUCBpcyBhIHNlbmRlci1zaWRlIG9ubHkgY2hhbmdlIHRoYXQgZW5zdXJlcyBhIGxpbmVhciBSVFQKQEAgLTQ3OCw3ICs0NjUsNiBAQAogCiBjb25maWcgVENQX0NPTkdfV0VTVFdPT0QKIAl0cmlzdGF0ZSAiVENQIFdlc3R3b29kKyIKLQlkZXBlbmRzIG9uIElORVQKIAlkZWZhdWx0IG0KIAktLS1oZWxwLS0tCiAJVENQIFdlc3R3b29kKyBpcyBhIHNlbmRlci1zaWRlIG9ubHkgbW9kaWZpY2F0aW9uIG9mIHRoZSBUQ1AgUmVubwpAQCAtNDkzLDcgKzQ3OSw2IEBACiAKIGNvbmZpZyBUQ1BfQ09OR19IVENQCiAgICAgICAgIHRyaXN0YXRlICJILVRDUCIKLQlkZXBlbmRzIG9uIElORVQKICAgICAgICAgZGVmYXVsdCBtCiAJLS0taGVscC0tLQogCUgtVENQIGlzIGEgc2VuZC1zaWRlIG9ubHkgbW9kaWZpY2F0aW9ucyBvZiB0aGUgVENQIFJlbm8KQEAgLTUwNSw3ICs0OTAsNyBAQAogCiBjb25maWcgVENQX0NPTkdfSFNUQ1AKIAl0cmlzdGF0ZSAiSGlnaCBTcGVlZCBUQ1AiCi0JZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCVNhbGx5IEZsb3lkJ3MgSGlnaCBTcGVlZCBUQ1AgKFJGQyAzNjQ5KSBjb25nZXN0aW9uIGNvbnRyb2wuCkBAIC01MTYsNyArNTAxLDcgQEAKIAogY29uZmlnIFRDUF9DT05HX0hZQkxBCiAJdHJpc3RhdGUgIlRDUC1IeWJsYSBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtIgotCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIAlUQ1AtSHlibGEgaXMgYSBzZW5kZXItc2lkZSBvbmx5IGNoYW5nZSB0aGF0IGVsaW1pbmF0ZXMgcGVuYWxpemF0aW9uIG9mCkBAIC01MjYsNyArNTExLDcgQEAKIAogY29uZmlnIFRDUF9DT05HX1ZFR0FTCiAJdHJpc3RhdGUgIlRDUCBWZWdhcyIKLQlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJVENQIFZlZ2FzIGlzIGEgc2VuZGVyLXNpZGUgb25seSBjaGFuZ2UgdG8gVENQIHRoYXQgYW50aWNpcGF0ZXMKQEAgLTUzNyw3ICs1MjIsNyBAQAogCiBjb25maWcgVENQX0NPTkdfU0NBTEFCTEUKIAl0cmlzdGF0ZSAiU2NhbGFibGUgVENQIgotCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIAlTY2FsYWJsZSBUQ1AgaXMgYSBzZW5kZXItc2lkZSBvbmx5IGNoYW5nZSB0byBUQ1Agd2hpY2ggdXNlcyBhCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggNjU4ZTc5Ny4uZWY3NDY4MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtMTAwOSw2ICsxMDA5LDE1IEBACiBzdGF0aWMgaW50IGlwdjRfcHJvY19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaXBmcmFnX2luaXQodm9pZCk7CiAKKy8qCisgKglJUCBwcm90b2NvbCBsYXllciBpbml0aWFsaXNlcgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgaXBfcGFja2V0X3R5cGUgPSB7CisJLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSwKKwkuZnVuYyA9IGlwX3JjdiwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGluZXRfaW5pdCh2b2lkKQogewogCXN0cnVjdCBza19idWZmICpkdW1teV9za2I7CkBAIC0xMTAyLDYgKzExMTEsOCBAQAogCiAJaXBmcmFnX2luaXQoKTsKIAorCWRldl9hZGRfcGFjaygmaXBfcGFja2V0X3R5cGUpOworCiAJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl90cmllLmMgYi9uZXQvaXB2NC9maWJfdHJpZS5jCmluZGV4IGI1NmU4OGUuLjRiZTIzNGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl90cmllLmMKKysrIGIvbmV0L2lwdjQvZmliX3RyaWUuYwpAQCAtNDMsNyArNDMsNyBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2RlZmluZSBWRVJTSU9OICIwLjMyNCIKKyNkZWZpbmUgVkVSU0lPTiAiMC4zMjUiCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMTM2LDYgKzEzNiw3IEBACiAJdW5zaWduZWQgaW50IHNlbWFudGljX21hdGNoX3Bhc3NlZDsKIAl1bnNpZ25lZCBpbnQgc2VtYW50aWNfbWF0Y2hfbWlzczsKIAl1bnNpZ25lZCBpbnQgbnVsbF9ub2RlX2hpdDsKKwl1bnNpZ25lZCBpbnQgcmVzaXplX25vZGVfc2tpcHBlZDsKIH07CiAjZW5kaWYKIApAQCAtMTY0LDggKzE2NSw4IEBACiBzdGF0aWMgdm9pZCB0bm9kZV9wdXRfY2hpbGRfcmVvcmcoc3RydWN0IHRub2RlICp0biwgaW50IGksIHN0cnVjdCBub2RlICpuLCBpbnQgd2FzZnVsbCk7CiBzdGF0aWMgaW50IHRub2RlX2NoaWxkX2xlbmd0aChzdHJ1Y3QgdG5vZGUgKnRuKTsKIHN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcmVzaXplKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKTsKLXN0YXRpYyBzdHJ1Y3QgdG5vZGUgKmluZmxhdGUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4pOwotc3RhdGljIHN0cnVjdCB0bm9kZSAqaGFsdmUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4pOworc3RhdGljIHN0cnVjdCB0bm9kZSAqaW5mbGF0ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0biwgaW50ICplcnIpOworc3RhdGljIHN0cnVjdCB0bm9kZSAqaGFsdmUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4sIGludCAqZXJyKTsKIHN0YXRpYyB2b2lkIHRub2RlX2ZyZWUoc3RydWN0IHRub2RlICp0bik7CiBzdGF0aWMgdm9pZCB0cmllX2R1bXBfc2VxKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdHJpZSAqdCk7CiBleHRlcm4gc3RydWN0IGZpYl9hbGlhcyAqZmliX2ZpbmRfYWxpYXMoc3RydWN0IGxpc3RfaGVhZCAqZmFoLCB1OCB0b3MsIHUzMiBwcmlvKTsKQEAgLTM1OCwxMSArMzU5LDMyIEBACiAJa2ZyZWUobGkpOwogfQogCitzdGF0aWMgc3RydWN0IHRub2RlICp0bm9kZV9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpIHsKKwkJcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChzdHJ1Y3QgdG5vZGUgKikKKwkJICAgICAgIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHNpemUpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fdG5vZGVfZnJlZShzdHJ1Y3QgdG5vZGUgKnRuKQoreworCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKworCSAgICAgICAgICAgICAgICAgICAgKDE8PHRuLT5iaXRzKSAqIHNpemVvZihzdHJ1Y3Qgbm9kZSAqKTsKKworCWlmIChzaXplIDw9IFBBR0VfU0laRSkKKwkJa2ZyZWUodG4pOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl0biwgZ2V0X29yZGVyKHNpemUpKTsKK30KKwogc3RhdGljIHN0cnVjdCB0bm9kZSogdG5vZGVfbmV3KHRfa2V5IGtleSwgaW50IHBvcywgaW50IGJpdHMpCiB7CiAJaW50IG5jaGlsZHJlbiA9IDE8PGJpdHM7CiAJaW50IHN6ID0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKyBuY2hpbGRyZW4gKiBzaXplb2Yoc3RydWN0IG5vZGUgKik7Ci0Jc3RydWN0IHRub2RlICp0biA9IGttYWxsb2Moc3osICBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgdG5vZGUgKnRuID0gdG5vZGVfYWxsb2Moc3opOwogCiAJaWYodG4pICB7CiAJCW1lbXNldCh0biwgMCwgc3opOwpAQCAtMzkwLDcgKzQxMiw3IEBACiAJCQlwcmludGsoIkZMICVwIFxuIiwgdG4pOwogCX0KIAllbHNlIGlmKElTX1ROT0RFKHRuKSkgeyAKLQkJa2ZyZWUodG4pOworCQlfX3Rub2RlX2ZyZWUodG4pOwogCQlpZih0cmllX2RlYnVnID4gMCApIAogCQkJcHJpbnRrKCJGVCAlcCBcbiIsIHRuKTsKIAl9CkBAIC00NjAsNiArNDgyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcmVzaXplKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKSAKIHsKIAlpbnQgaTsKKwlpbnQgZXJyID0gMDsKIAogIAlpZiAoIXRuKQogCQlyZXR1cm4gTlVMTDsKQEAgLTU1NiwxMiArNTc5LDIwIEBACiAJICovCiAKIAljaGVja190bm9kZSh0bik7Ci0KKwkKKwllcnIgPSAwOwogCXdoaWxlICgodG4tPmZ1bGxfY2hpbGRyZW4gPiAwICYmCiAJICAgICAgIDUwICogKHRuLT5mdWxsX2NoaWxkcmVuICsgdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAtIHRuLT5lbXB0eV9jaGlsZHJlbikgPj0KIAkJCQlpbmZsYXRlX3RocmVzaG9sZCAqIHRub2RlX2NoaWxkX2xlbmd0aCh0bikpKSB7CiAKLQkJdG4gPSBpbmZsYXRlKHQsIHRuKTsKKwkJdG4gPSBpbmZsYXRlKHQsIHRuLCAmZXJyKTsKKworCQlpZihlcnIpIHsKKyNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKKwkJCXQtPnN0YXRzLnJlc2l6ZV9ub2RlX3NraXBwZWQrKzsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KIAl9CiAKIAljaGVja190bm9kZSh0bik7CkBAIC01NzAsMTEgKzYwMSwyMiBAQAogCSAqIEhhbHZlIGFzIGxvbmcgYXMgdGhlIG51bWJlciBvZiBlbXB0eSBjaGlsZHJlbiBpbiB0aGlzCiAJICogbm9kZSBpcyBhYm92ZSB0aHJlc2hvbGQuCiAJICovCisKKwllcnIgPSAwOwogCXdoaWxlICh0bi0+Yml0cyA+IDEgJiYKIAkgICAgICAgMTAwICogKHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4pIDwKLQkgICAgICAgaGFsdmVfdGhyZXNob2xkICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkKKwkgICAgICAgaGFsdmVfdGhyZXNob2xkICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkgewogCi0JCXRuID0gaGFsdmUodCwgdG4pOworCQl0biA9IGhhbHZlKHQsIHRuLCAmZXJyKTsKKworCQlpZihlcnIpIHsKKyNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKKwkJCXQtPnN0YXRzLnJlc2l6ZV9ub2RlX3NraXBwZWQrKzsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwl9CisKICAgCiAJLyogT25seSBvbmUgY2hpbGQgcmVtYWlucyAqLwogCkBAIC01OTksNyArNjQxLDcgQEAKIAlyZXR1cm4gKHN0cnVjdCBub2RlICopIHRuOwogfQogCi1zdGF0aWMgc3RydWN0IHRub2RlICppbmZsYXRlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKQorc3RhdGljIHN0cnVjdCB0bm9kZSAqaW5mbGF0ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0biwgaW50ICplcnIpCiB7CiAJc3RydWN0IHRub2RlICppbm9kZTsKIAlzdHJ1Y3QgdG5vZGUgKm9sZHRub2RlID0gdG47CkBAIC02MTEsOCArNjUzLDYzIEBACiAKIAl0biA9IHRub2RlX25ldyhvbGR0bm9kZS0+a2V5LCBvbGR0bm9kZS0+cG9zLCBvbGR0bm9kZS0+Yml0cyArIDEpOwogCi0JaWYgKCF0bikKLQkJdHJpZV9idWcoInRub2RlX25ldyBmYWlsZWQiKTsKKwlpZiAoIXRuKSB7CisJCSplcnIgPSAtRU5PTUVNOworCQlyZXR1cm4gb2xkdG5vZGU7CisJfQorCisJLyoKKwkgKiBQcmVhbGxvY2F0ZSBhbmQgc3RvcmUgdG5vZGVzIGJlZm9yZSB0aGUgYWN0dWFsIHdvcmsgc28gd2UgCisJICogZG9uJ3QgZ2V0IGludG8gYW4gaW5jb25zaXN0ZW50IHN0YXRlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIAorCSAqIGZhaWxzLiBJbiBjYXNlIG9mIGZhaWx1cmUgd2UgcmV0dXJuIHRoZSBvbGRub2RlIGFuZCAgaW5mbGF0ZSAKKwkgKiBvZiB0bm9kZSBpcyBpZ25vcmVkLgorCSAqLworCQkJCisJZm9yKGkgPSAwOyBpIDwgb2xlbjsgaSsrKSB7CisJCXN0cnVjdCB0bm9kZSAqaW5vZGUgPSAoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZChvbGR0bm9kZSwgaSk7CisKKwkJaWYgKGlub2RlICYmCisJCSAgICBJU19UTk9ERShpbm9kZSkgJiYKKwkJICAgIGlub2RlLT5wb3MgPT0gb2xkdG5vZGUtPnBvcyArIG9sZHRub2RlLT5iaXRzICYmCisJCSAgICBpbm9kZS0+Yml0cyA+IDEpIHsKKwkJCXN0cnVjdCB0bm9kZSAqbGVmdCwgKnJpZ2h0OworCisJCQl0X2tleSBtID0gVEtFWV9HRVRfTUFTSyhpbm9kZS0+cG9zLCAxKTsKKyAKKwkJCWxlZnQgPSB0bm9kZV9uZXcoaW5vZGUtPmtleSYofm0pLCBpbm9kZS0+cG9zICsgMSwKKwkJCQkJIGlub2RlLT5iaXRzIC0gMSk7CisKKwkJCWlmKCFsZWZ0KSB7CisJCQkJKmVyciA9IC1FTk9NRU07IAorCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlyaWdodCA9IHRub2RlX25ldyhpbm9kZS0+a2V5fG0sIGlub2RlLT5wb3MgKyAxLAorCQkJCQkgIGlub2RlLT5iaXRzIC0gMSk7CisKKwkJCWlmKCFyaWdodCkgeworCQkJCSplcnIgPSAtRU5PTUVNOyAKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHV0X2NoaWxkKHQsIHRuLCAyKmksIChzdHJ1Y3Qgbm9kZSAqKSBsZWZ0KTsKKwkJCXB1dF9jaGlsZCh0LCB0biwgMippKzEsIChzdHJ1Y3Qgbm9kZSAqKSByaWdodCk7CisJCX0KKwl9CisKKwlpZigqZXJyKSB7CisJCWludCBzaXplID0gdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKTsKKwkJaW50IGo7CisKKwkJZm9yKGogPSAwOyBqIDwgc2l6ZTsgaisrKSAKKwkJCWlmKCB0bi0+Y2hpbGRbal0pCisJCQkJdG5vZGVfZnJlZSgoc3RydWN0IHRub2RlICopdG4tPmNoaWxkW2pdKTsKKworCQl0bm9kZV9mcmVlKHRuKTsKKwkJCisJCSplcnIgPSAtRU5PTUVNOworCQlyZXR1cm4gb2xkdG5vZGU7CisJfQogCiAJZm9yKGkgPSAwOyBpIDwgb2xlbjsgaSsrKSB7CiAJCXN0cnVjdCBub2RlICpub2RlID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCBpKTsKQEAgLTYyNSw3ICs3MjIsNyBAQAogCiAJCWlmKElTX0xFQUYobm9kZSkgfHwgKChzdHJ1Y3QgdG5vZGUgKikgbm9kZSktPnBvcyA+CiAJCSAgIHRuLT5wb3MgKyB0bi0+Yml0cyAtIDEpIHsKLQkJCWlmKHRrZXlfZXh0cmFjdF9iaXRzKG5vZGUtPmtleSwgdG4tPnBvcyArIHRuLT5iaXRzIC0gMSwKKwkJCWlmKHRrZXlfZXh0cmFjdF9iaXRzKG5vZGUtPmtleSwgb2xkdG5vZGUtPnBvcyArIG9sZHRub2RlLT5iaXRzLAogCQkJCQkgICAgIDEpID09IDApCiAJCQkJcHV0X2NoaWxkKHQsIHRuLCAyKmksIG5vZGUpOwogCQkJZWxzZQpAQCAtNjY1LDI3ICs3NjIsMjIgQEAKIAkJCSAqIHRoZSBwb3NpdGlvbiAoaW5vZGUtPnBvcykKIAkJCSAqLwogCi0JCQl0X2tleSBtID0gVEtFWV9HRVRfTUFTSyhpbm9kZS0+cG9zLCAxKTsKLSAKIAkJCS8qIFVzZSB0aGUgb2xkIGtleSwgYnV0IHNldCB0aGUgbmV3IHNpZ25pZmljYW50IAogCQkJICogICBiaXQgdG8gemVyby4gCiAJCQkgKi8KLQkJCWxlZnQgPSB0bm9kZV9uZXcoaW5vZGUtPmtleSYofm0pLCBpbm9kZS0+cG9zICsgMSwKLQkJCQkJIGlub2RlLT5iaXRzIC0gMSk7CiAKLQkJCWlmKCFsZWZ0KSAKLQkJCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOwotCQkJCi0JCQkKLQkJCS8qIFVzZSB0aGUgb2xkIGtleSwgYnV0IHNldCB0aGUgbmV3IHNpZ25pZmljYW50IAotCQkJICogYml0IHRvIG9uZS4gCi0JCQkgKi8KLQkJCXJpZ2h0ID0gdG5vZGVfbmV3KGlub2RlLT5rZXl8bSwgaW5vZGUtPnBvcyArIDEsCi0JCQkJCSAgaW5vZGUtPmJpdHMgLSAxKTsKKwkJCWxlZnQgPSAoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZCh0biwgMippKTsKKwkJCXB1dF9jaGlsZCh0LCB0biwgMippLCBOVUxMKTsKIAotCQkJaWYoIXJpZ2h0KSAKLQkJCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOwotCQkJCisJCQlpZighbGVmdCkKKwkJCQlCVUcoKTsKKworCQkJcmlnaHQgPSAoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZCh0biwgMippKzEpOworCQkJcHV0X2NoaWxkKHQsIHRuLCAyKmkrMSwgTlVMTCk7CisKKwkJCWlmKCFyaWdodCkKKwkJCQlCVUcoKTsKKwogCQkJc2l6ZSA9IHRub2RlX2NoaWxkX2xlbmd0aChsZWZ0KTsKIAkJCWZvcihqID0gMDsgaiA8IHNpemU7IGorKykgewogCQkJCXB1dF9jaGlsZCh0LCBsZWZ0LCBqLCBpbm9kZS0+Y2hpbGRbal0pOwpAQCAtNzAxLDcgKzc5Myw3IEBACiAJcmV0dXJuIHRuOwogfQogCi1zdGF0aWMgc3RydWN0IHRub2RlICpoYWx2ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bikKK3N0YXRpYyBzdHJ1Y3QgdG5vZGUgKmhhbHZlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuLCBpbnQgKmVycikKIHsKIAlzdHJ1Y3QgdG5vZGUgKm9sZHRub2RlID0gdG47CiAJc3RydWN0IG5vZGUgKmxlZnQsICpyaWdodDsKQEAgLTcxMiw4ICs4MDQsNDggQEAKICAgCiAJdG49dG5vZGVfbmV3KG9sZHRub2RlLT5rZXksIG9sZHRub2RlLT5wb3MsIG9sZHRub2RlLT5iaXRzIC0gMSk7CiAKLQlpZighdG4pIAotCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOworCWlmICghdG4pIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCXJldHVybiBvbGR0bm9kZTsKKwl9CisKKwkvKgorCSAqIFByZWFsbG9jYXRlIGFuZCBzdG9yZSB0bm9kZXMgYmVmb3JlIHRoZSBhY3R1YWwgd29yayBzbyB3ZSAKKwkgKiBkb24ndCBnZXQgaW50byBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgaWYgbWVtb3J5IGFsbG9jYXRpb24gCisJICogZmFpbHMuIEluIGNhc2Ugb2YgZmFpbHVyZSB3ZSByZXR1cm4gdGhlIG9sZG5vZGUgYW5kIGhhbHZlIAorCSAqIG9mIHRub2RlIGlzIGlnbm9yZWQuCisJICovCisKKwlmb3IoaSA9IDA7IGkgPCBvbGVuOyBpICs9IDIpIHsKKwkJbGVmdCA9IHRub2RlX2dldF9jaGlsZChvbGR0bm9kZSwgaSk7CisJCXJpZ2h0ID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCBpKzEpOworICAgIAorCQkvKiBUd28gbm9uZW1wdHkgY2hpbGRyZW4gKi8KKwkJaWYoIGxlZnQgJiYgcmlnaHQpICB7CisJCQlzdHJ1Y3QgdG5vZGUgKm5ld0Jpbk5vZGUgPQorCQkJCXRub2RlX25ldyhsZWZ0LT5rZXksIHRuLT5wb3MgKyB0bi0+Yml0cywgMSk7CisKKwkJCWlmKCFuZXdCaW5Ob2RlKSB7CisJCQkJKmVyciA9IC1FTk9NRU07IAorCQkJCWJyZWFrOworCQkJfQorCQkJcHV0X2NoaWxkKHQsIHRuLCBpLzIsIChzdHJ1Y3Qgbm9kZSAqKW5ld0Jpbk5vZGUpOworCQl9CisJfQorCisJaWYoKmVycikgeworCQlpbnQgc2l6ZSA9IHRub2RlX2NoaWxkX2xlbmd0aCh0bik7CisJCWludCBqOworCisJCWZvcihqID0gMDsgaiA8IHNpemU7IGorKykgCisJCQlpZiggdG4tPmNoaWxkW2pdKQorCQkJCXRub2RlX2ZyZWUoKHN0cnVjdCB0bm9kZSAqKXRuLT5jaGlsZFtqXSk7CisKKwkJdG5vZGVfZnJlZSh0bik7CisJCQorCQkqZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIG9sZHRub2RlOworCX0KIAogCWZvcihpID0gMDsgaSA8IG9sZW47IGkgKz0gMikgewogCQlsZWZ0ID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCBpKTsKQEAgLTczMCwxMCArODYyLDExIEBACiAJCS8qIFR3byBub25lbXB0eSBjaGlsZHJlbiAqLwogCQllbHNlIHsKIAkJCXN0cnVjdCB0bm9kZSAqbmV3QmluTm9kZSA9Ci0JCQkJdG5vZGVfbmV3KGxlZnQtPmtleSwgdG4tPnBvcyArIHRuLT5iaXRzLCAxKTsKKwkJCQkoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZCh0biwgaS8yKTsKKwkJCXB1dF9jaGlsZCh0LCB0biwgaS8yLCBOVUxMKTsKIAogCQkJaWYoIW5ld0Jpbk5vZGUpIAotCQkJCXRyaWVfYnVnKCJ0bm9kZV9uZXcgZmFpbGVkIik7CisJCQkJQlVHKCk7CiAKIAkJCXB1dF9jaGlsZCh0LCBuZXdCaW5Ob2RlLCAwLCBsZWZ0KTsKIAkJCXB1dF9jaGlsZCh0LCBuZXdCaW5Ob2RlLCAxLCByaWdodCk7CkBAIC0yMzAxLDYgKzI0MzQsNyBAQAogCXNlcV9wcmludGYoc2VxLCJzZW1hbnRpYyBtYXRjaCBwYXNzZWQgPSAlZFxuIiwgdC0+c3RhdHMuc2VtYW50aWNfbWF0Y2hfcGFzc2VkKTsKIAlzZXFfcHJpbnRmKHNlcSwic2VtYW50aWMgbWF0Y2ggbWlzcyA9ICVkXG4iLCB0LT5zdGF0cy5zZW1hbnRpY19tYXRjaF9taXNzKTsKIAlzZXFfcHJpbnRmKHNlcSwibnVsbCBub2RlIGhpdD0gJWRcbiIsIHQtPnN0YXRzLm51bGxfbm9kZV9oaXQpOworCXNlcV9wcmludGYoc2VxLCJza2lwcGVkIG5vZGUgcmVzaXplID0gJWRcbiIsIHQtPnN0YXRzLnJlc2l6ZV9ub2RlX3NraXBwZWQpOwogI2lmZGVmIENMRUFSX1NUQVRTCiAJbWVtc2V0KCYodC0+c3RhdHMpLCAwLCBzaXplb2YodC0+c3RhdHMpKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWNtcC5jIGIvbmV0L2lwdjQvaWNtcC5jCmluZGV4IGNiNzU5NDguLjI3OWY1N2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ljbXAuYworKysgYi9uZXQvaXB2NC9pY21wLmMKQEAgLTk3MCw3ICs5NzAsOCBAQAogCQkgKglSRkMgMTEyMjogMy4yLjIuOCBBbiBJQ01QX1RJTUVTVEFNUCBNQVkgYmUgc2lsZW50bHkKIAkJICoJICBkaXNjYXJkZWQgaWYgdG8gYnJvYWRjYXN0L211bHRpY2FzdC4KIAkJICovCi0JCWlmIChpY21waC0+dHlwZSA9PSBJQ01QX0VDSE8gJiYKKwkJaWYgKChpY21waC0+dHlwZSA9PSBJQ01QX0VDSE8gfHwKKwkJICAgICBpY21waC0+dHlwZSA9PSBJQ01QX1RJTUVTVEFNUCkgJiYKIAkJICAgIHN5c2N0bF9pY21wX2VjaG9faWdub3JlX2Jyb2FkY2FzdHMpIHsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCAxZjMxODMxLi41MDg4ZjkwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC0xNjE1LDkgKzE2MTUsMTAgQEAKIHsKIAlpbnQgZXJyOwogCXUzMiBhZGRyID0gaW1yLT5pbXJfbXVsdGlhZGRyLnNfYWRkcjsKLQlzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKmltbCwgKmk7CisJc3RydWN0IGlwX21jX3NvY2tsaXN0ICppbWw9TlVMTCwgKmk7CiAJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlpbnQgaWZpbmRleDsKIAlpbnQgY291bnQgPSAwOwogCiAJaWYgKCFNVUxUSUNBU1QoYWRkcikpCkBAIC0xNjMzLDM3ICsxNjM0LDMwIEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpbWwgPSAoc3RydWN0IGlwX21jX3NvY2tsaXN0ICopc29ja19rbWFsbG9jKHNrLCBzaXplb2YoKmltbCksIEdGUF9LRVJORUwpOwotCiAJZXJyID0gLUVBRERSSU5VU0U7CisJaWZpbmRleCA9IGltci0+aW1yX2lmaW5kZXg7CiAJZm9yIChpID0gaW5ldC0+bWNfbGlzdDsgaTsgaSA9IGktPm5leHQpIHsKLQkJaWYgKG1lbWNtcCgmaS0+bXVsdGksIGltciwgc2l6ZW9mKCppbXIpKSA9PSAwKSB7Ci0JCQkvKiBOZXcgc3R5bGUgYWRkaXRpb25zIGFyZSByZWZlcmVuY2UgY291bnRlZCAqLwotCQkJaWYgKGltci0+aW1yX2FkZHJlc3Muc19hZGRyID09IDApIHsKLQkJCQlpLT5jb3VudCsrOwotCQkJCWVyciA9IDA7Ci0JCQl9CisJCWlmIChpLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9PSBhZGRyICYmCisJCSAgICBpLT5tdWx0aS5pbXJfaWZpbmRleCA9PSBpZmluZGV4KQogCQkJZ290byBkb25lOwotCQl9CiAJCWNvdW50Kys7CiAJfQogCWVyciA9IC1FTk9CVUZTOwotCWlmIChpbWwgPT0gTlVMTCB8fCBjb3VudCA+PSBzeXNjdGxfaWdtcF9tYXhfbWVtYmVyc2hpcHMpCisJaWYgKGNvdW50ID49IHN5c2N0bF9pZ21wX21heF9tZW1iZXJzaGlwcykKIAkJZ290byBkb25lOworCWltbCA9IChzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssc2l6ZW9mKCppbWwpLEdGUF9LRVJORUwpOworCWlmIChpbWwgPT0gTlVMTCkKKwkJZ290byBkb25lOworCiAJbWVtY3B5KCZpbWwtPm11bHRpLCBpbXIsIHNpemVvZigqaW1yKSk7CiAJaW1sLT5uZXh0ID0gaW5ldC0+bWNfbGlzdDsKLQlpbWwtPmNvdW50ID0gMTsKIAlpbWwtPnNmbGlzdCA9IE5VTEw7CiAJaW1sLT5zZm1vZGUgPSBNQ0FTVF9FWENMVURFOwogCWluZXQtPm1jX2xpc3QgPSBpbWw7CiAJaXBfbWNfaW5jX2dyb3VwKGluX2RldiwgYWRkcik7Ci0JaW1sID0gTlVMTDsKIAllcnIgPSAwOwotCiBkb25lOgogCXJ0bmxfc2h1bmxvY2soKTsKLQlpZiAoaW1sKQotCQlzb2NrX2tmcmVlX3Moc2ssIGltbCwgc2l6ZW9mKCppbWwpKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNjkzLDMwICsxNjg3LDI1IEBACiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqaW1sLCAqKmltbHA7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCXUzMiBncm91cCA9IGltci0+aW1yX211bHRpYWRkci5zX2FkZHI7CisJdTMyIGlmaW5kZXg7CiAKIAlydG5sX2xvY2soKTsKKwlpbl9kZXYgPSBpcF9tY19maW5kX2RldihpbXIpOworCWlmICghaW5fZGV2KSB7CisJCXJ0bmxfdW5sb2NrKCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZmluZGV4ID0gaW1yLT5pbXJfaWZpbmRleDsKIAlmb3IgKGltbHAgPSAmaW5ldC0+bWNfbGlzdDsgKGltbCA9ICppbWxwKSAhPSBOVUxMOyBpbWxwID0gJmltbC0+bmV4dCkgewotCQlpZiAoaW1sLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkcj09aW1yLT5pbXJfbXVsdGlhZGRyLnNfYWRkciAmJgotCQkgICAgaW1sLT5tdWx0aS5pbXJfYWRkcmVzcy5zX2FkZHI9PWltci0+aW1yX2FkZHJlc3Muc19hZGRyICYmCi0JCSAgICAoIWltci0+aW1yX2lmaW5kZXggfHwgaW1sLT5tdWx0aS5pbXJfaWZpbmRleD09aW1yLT5pbXJfaWZpbmRleCkpIHsKLQkJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKLQotCQkJaW5fZGV2ID0gaW5ldGRldl9ieV9pbmRleChpbWwtPm11bHRpLmltcl9pZmluZGV4KTsKLQkJCWlmIChpbl9kZXYpCi0JCQkJKHZvaWQpIGlwX21jX2xlYXZlX3NyYyhzaywgaW1sLCBpbl9kZXYpOwotCQkJaWYgKC0taW1sLT5jb3VudCkgewotCQkJCXJ0bmxfdW5sb2NrKCk7Ci0JCQkJaWYgKGluX2RldikKLQkJCQkJaW5fZGV2X3B1dChpbl9kZXYpOwotCQkJCXJldHVybiAwOwotCQkJfQorCQlpZiAoaW1sLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9PSBncm91cCAmJgorCQkgICAgaW1sLT5tdWx0aS5pbXJfaWZpbmRleCA9PSBpZmluZGV4KSB7CisJCQkodm9pZCkgaXBfbWNfbGVhdmVfc3JjKHNrLCBpbWwsIGluX2Rldik7CiAKIAkJCSppbWxwID0gaW1sLT5uZXh0OwogCi0JCQlpZiAoaW5fZGV2KSB7Ci0JCQkJaXBfbWNfZGVjX2dyb3VwKGluX2RldiwgaW1yLT5pbXJfbXVsdGlhZGRyLnNfYWRkcik7Ci0JCQkJaW5fZGV2X3B1dChpbl9kZXYpOwotCQkJfQorCQkJaXBfbWNfZGVjX2dyb3VwKGluX2RldiwgZ3JvdXApOwogCQkJcnRubF91bmxvY2soKTsKIAkJCXNvY2tfa2ZyZWVfcyhzaywgaW1sLCBzaXplb2YoKmltbCkpOwogCQkJcmV0dXJuIDA7CkBAIC0xNzM2LDYgKzE3MjUsNyBAQAogCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IE5VTEw7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcF9zZl9zb2NrbGlzdCAqcHNsOworCWludCBsZWF2ZWdyb3VwID0gMDsKIAlpbnQgaSwgaiwgcnY7CiAKIAlpZiAoIU1VTFRJQ0FTVChhZGRyKSkKQEAgLTE3NTUsMTUgKzE3NDUsMjAgQEAKIAllcnIgPSAtRUFERFJOT1RBVkFJTDsKIAogCWZvciAocG1jPWluZXQtPm1jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgewotCQlpZiAobWVtY21wKCZwbWMtPm11bHRpLCBtcmVxcywgMipzaXplb2YoX191MzIpKSA9PSAwKQorCQlpZiAocG1jLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9PSBpbXIuaW1yX211bHRpYWRkci5zX2FkZHIKKwkJICAgICYmIHBtYy0+bXVsdGkuaW1yX2lmaW5kZXggPT0gaW1yLmltcl9pZmluZGV4KQogCQkJYnJlYWs7CiAJfQotCWlmICghcG1jKQkJLyogbXVzdCBoYXZlIGEgcHJpb3Igam9pbiAqLworCWlmICghcG1jKSB7CQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKKwl9CiAJLyogaWYgYSBzb3VyY2UgZmlsdGVyIHdhcyBzZXQsIG11c3QgYmUgdGhlIHNhbWUgbW9kZSBhcyBiZWZvcmUgKi8KIAlpZiAocG1jLT5zZmxpc3QpIHsKLQkJaWYgKHBtYy0+c2Ztb2RlICE9IG9tb2RlKQorCQlpZiAocG1jLT5zZm1vZGUgIT0gb21vZGUpIHsKKwkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGRvbmU7CisJCX0KIAl9IGVsc2UgaWYgKHBtYy0+c2Ztb2RlICE9IG9tb2RlKSB7CiAJCS8qIGFsbG93IG1vZGUgc3dpdGNoZXMgZm9yIGVtcHR5LXNldCBmaWx0ZXJzICovCiAJCWlwX21jX2FkZF9zcmMoaW5fZGV2LCAmbXJlcXMtPmltcl9tdWx0aWFkZHIsIG9tb2RlLCAwLCBOVUxMLCAwKTsKQEAgLTE3NzUsNyArMTc3MCw3IEBACiAJcHNsID0gcG1jLT5zZmxpc3Q7CiAJaWYgKCFhZGQpIHsKIAkJaWYgKCFwc2wpCi0JCQlnb3RvIGRvbmU7CisJCQlnb3RvIGRvbmU7CS8qIGVyciA9IC1FQUREUk5PVEFWQUlMICovCiAJCXJ2ID0gITA7CiAJCWZvciAoaT0wOyBpPHBzbC0+c2xfY291bnQ7IGkrKykgewogCQkJcnYgPSBtZW1jbXAoJnBzbC0+c2xfYWRkcltpXSwgJm1yZXFzLT5pbXJfc291cmNlYWRkciwKQEAgLTE3ODQsNyArMTc3OSwxMyBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChydikJCS8qIHNvdXJjZSBub3QgZm91bmQgKi8KKwkJCWdvdG8gZG9uZTsJLyogZXJyID0gLUVBRERSTk9UQVZBSUwgKi8KKworCQkvKiBzcGVjaWFsIGNhc2UgLSAoSU5DTFVERSwgZW1wdHkpID09IExFQVZFX0dST1VQICovCisJCWlmIChwc2wtPnNsX2NvdW50ID09IDEgJiYgb21vZGUgPT0gTUNBU1RfSU5DTFVERSkgeworCQkJbGVhdmVncm91cCA9IDE7CiAJCQlnb3RvIGRvbmU7CisJCX0KIAogCQkvKiB1cGRhdGUgdGhlIGludGVyZmFjZSBmaWx0ZXIgKi8KIAkJaXBfbWNfZGVsX3NyYyhpbl9kZXYsICZtcmVxcy0+aW1yX211bHRpYWRkciwgb21vZGUsIDEsIApAQCAtMTg0MiwxOCArMTg0MywyMSBAQAogCQkmbXJlcXMtPmltcl9zb3VyY2VhZGRyLCAxKTsKIGRvbmU6CiAJcnRubF9zaHVubG9jaygpOworCWlmIChsZWF2ZWdyb3VwKQorCQlyZXR1cm4gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZpbXIpOwogCXJldHVybiBlcnI7CiB9CiAKIGludCBpcF9tY19tc2ZpbHRlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpcF9tc2ZpbHRlciAqbXNmLCBpbnQgaWZpbmRleCkKIHsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCXN0cnVjdCBpcF9tcmVxbglpbXI7CiAJdTMyIGFkZHIgPSBtc2YtPmltc2ZfbXVsdGlhZGRyOwogCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqcG1jOwogCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwX3NmX3NvY2tsaXN0ICpuZXdwc2wsICpwc2w7CisJaW50IGxlYXZlZ3JvdXAgPSAwOwogCiAJaWYgKCFNVUxUSUNBU1QoYWRkcikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTg3MiwxNSArMTg3NiwyMiBAQAogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGRvbmU7CiAJfQotCWVyciA9IC1FQUREUk5PVEFWQUlMOworCisJLyogc3BlY2lhbCBjYXNlIC0gKElOQ0xVREUsIGVtcHR5KSA9PSBMRUFWRV9HUk9VUCAqLworCWlmIChtc2YtPmltc2ZfZm1vZGUgPT0gTUNBU1RfSU5DTFVERSAmJiBtc2YtPmltc2ZfbnVtc3JjID09IDApIHsKKwkJbGVhdmVncm91cCA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CiAKIAlmb3IgKHBtYz1pbmV0LT5tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKIAkJaWYgKHBtYy0+bXVsdGkuaW1yX211bHRpYWRkci5zX2FkZHIgPT0gbXNmLT5pbXNmX211bHRpYWRkciAmJgogCQkgICAgcG1jLT5tdWx0aS5pbXJfaWZpbmRleCA9PSBpbXIuaW1yX2lmaW5kZXgpCiAJCQlicmVhazsKIAl9Ci0JaWYgKCFwbWMpCQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJaWYgKCFwbWMpIHsJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBkb25lOworCX0KIAlpZiAobXNmLT5pbXNmX251bXNyYykgewogCQluZXdwc2wgPSAoc3RydWN0IGlwX3NmX3NvY2tsaXN0ICopc29ja19rbWFsbG9jKHNrLAogCQkJCUlQX1NGTFNJWkUobXNmLT5pbXNmX251bXNyYyksIEdGUF9LRVJORUwpOwpAQCAtMTkwOSw4ICsxOTIwLDExIEBACiAJCQkwLCBOVUxMLCAwKTsKIAlwbWMtPnNmbGlzdCA9IG5ld3BzbDsKIAlwbWMtPnNmbW9kZSA9IG1zZi0+aW1zZl9mbW9kZTsKKwllcnIgPSAwOwogZG9uZToKIAlydG5sX3NodW5sb2NrKCk7CisJaWYgKGxlYXZlZ3JvdXApCisJCWVyciA9IGlwX21jX2xlYXZlX2dyb3VwKHNrLCAmaW1yKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9vdXRwdXQuYyBiL25ldC9pcHY0L2lwX291dHB1dC5jCmluZGV4IDZjZTVjMzIuLjgwZDEzMTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L2lwX291dHB1dC5jCkBAIC0xMDcsNyArMTA3LDYgQEAKIAluZXdza2ItPnBrdF90eXBlID0gUEFDS0VUX0xPT1BCQUNLOwogCW5ld3NrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJQlVHX1RSQVAobmV3c2tiLT5kc3QpOwotCW5mX3Jlc2V0KG5ld3NrYik7CiAJbmV0aWZfcngobmV3c2tiKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE4OCwxNCArMTg3LDYgQEAKIAkJc2tiID0gc2tiMjsKIAl9CiAKLSNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgotCS8qIGJyaWRnZS1uZXRmaWx0ZXIgZGVmZXJzIGNhbGxpbmcgc29tZSBJUCBob29rcyB0byB0aGUgYnJpZGdlIGxheWVyCi0JICogYW5kIHN0aWxsIG5lZWRzIHRoZSBjb25udHJhY2sgcmVmZXJlbmNlLgotCSAqLwotCWlmIChza2ItPm5mX2JyaWRnZSA9PSBOVUxMKQotI2VuZGlmCi0JCW5mX3Jlc2V0KHNrYik7Ci0KIAlpZiAoaGgpIHsKIAkJaW50IGhoX2FsZW47CiAKQEAgLTM4OSw3ICszODAsNiBAQAogCXRvLT5wa3RfdHlwZSA9IGZyb20tPnBrdF90eXBlOwogCXRvLT5wcmlvcml0eSA9IGZyb20tPnByaW9yaXR5OwogCXRvLT5wcm90b2NvbCA9IGZyb20tPnByb3RvY29sOwotCXRvLT5zZWN1cml0eSA9IGZyb20tPnNlY3VyaXR5OwogCWRzdF9yZWxlYXNlKHRvLT5kc3QpOwogCXRvLT5kc3QgPSBkc3RfY2xvbmUoZnJvbS0+ZHN0KTsKIAl0by0+ZGV2ID0gZnJvbS0+ZGV2OwpAQCAtMTMyOSwyMyArMTMxOSw4IEBACiAJaXBfcnRfcHV0KHJ0KTsKIH0KIAotLyoKLSAqCUlQIHByb3RvY29sIGxheWVyIGluaXRpYWxpc2VyCi0gKi8KLQotc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBpcF9wYWNrZXRfdHlwZSA9IHsKLQkudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApLAotCS5mdW5jID0gaXBfcmN2LAotfTsKLQotLyoKLSAqCUlQIHJlZ2lzdGVycyB0aGUgcGFja2V0IHR5cGUgYW5kIHRoZW4gY2FsbHMgdGhlIHN1YnByb3RvY29sIGluaXRpYWxpc2VycwotICovCi0KIHZvaWQgX19pbml0IGlwX2luaXQodm9pZCkKIHsKLQlkZXZfYWRkX3BhY2soJmlwX3BhY2tldF90eXBlKTsKLQogCWlwX3J0X2luaXQoKTsKIAlpbmV0X2luaXRwZWVycygpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwppbmRleCBmOGIxNzJmLi5mYzdjNDgxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKQEAgLTY3NywxMSArNjc3LDExIEBACiAJCQkJbXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIgPSBtcmVxcy5pbXJfaW50ZXJmYWNlOwogCQkJCW1yZXEuaW1yX2lmaW5kZXggPSAwOwogCQkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKLQkJCQlpZiAoZXJyKQorCQkJCWlmIChlcnIgJiYgZXJyICE9IC1FQUREUklOVVNFKQogCQkJCQlicmVhazsKIAkJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7CiAJCQkJYWRkID0gMTsKLQkJCX0gZWxzZSAvKklQX0RST1BfU09VUkNFX01FTUJFUlNISVAgKi8geworCQkJfSBlbHNlIC8qIElQX0RST1BfU09VUkNFX01FTUJFUlNISVAgKi8gewogCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKIAkJCQlhZGQgPSAwOwogCQkJfQpAQCAtNzU0LDcgKzc1NCw3IEBACiAJCQkJbXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIgPSAwOwogCQkJCW1yZXEuaW1yX2lmaW5kZXggPSBncmVxcy5nc3JfaW50ZXJmYWNlOwogCQkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKLQkJCQlpZiAoZXJyKQorCQkJCWlmIChlcnIgJiYgZXJyICE9IC1FQUREUklOVVNFKQogCQkJCQlicmVhazsKIAkJCQlncmVxcy5nc3JfaW50ZXJmYWNlID0gbXJlcS5pbXJfaWZpbmRleDsKIAkJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL0tjb25maWcgYi9uZXQvaXB2NC9pcHZzL0tjb25maWcKaW5kZXggNjNhODJiNC4uYzk4MjBiZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9LY29uZmlnCisrKyBiL25ldC9pcHY0L2lwdnMvS2NvbmZpZwpAQCAtMiwxMSArMiwxMSBAQAogIyBJUCBWaXJ0dWFsIFNlcnZlciBjb25maWd1cmF0aW9uCiAjCiBtZW51CSJJUDogVmlydHVhbCBTZXJ2ZXIgQ29uZmlndXJhdGlvbiIKLQlkZXBlbmRzIG9uIElORVQgJiYgTkVURklMVEVSCisJZGVwZW5kcyBvbiBORVRGSUxURVIKIAogY29uZmlnCUlQX1ZTCiAJdHJpc3RhdGUgIklQIHZpcnR1YWwgc2VydmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJTkVUICYmIE5FVEZJTFRFUgorCWRlcGVuZHMgb24gTkVURklMVEVSCiAJLS0taGVscC0tLQogCSAgSVAgVmlydHVhbCBTZXJ2ZXIgc3VwcG9ydCB3aWxsIGxldCB5b3UgYnVpbGQgYSBoaWdoLXBlcmZvcm1hbmNlCiAJICB2aXJ0dWFsIHNlcnZlciBiYXNlZCBvbiBjbHVzdGVyIG9mIHR3byBvciBtb3JlIHJlYWwgc2VydmVycy4gVGhpcwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jb25uLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYwppbmRleCA5ZjE2YWIzLi5kMDE0NWE4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYwpAQCAtNzU4LDcgKzc1OCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLQorLyogQ2FsbGVkIGZyb20ga2V2ZW50ZCBhbmQgbXVzdCBwcm90ZWN0IGl0c2VsZiBmcm9tIHNvZnRpcnFzICovCiB2b2lkIGlwX3ZzX3JhbmRvbV9kcm9wZW50cnkodm9pZCkKIHsKIAlpbnQgaWR4OwpAQCAtNzczLDcgKzc3Myw3IEBACiAJCS8qCiAJCSAqICBMb2NrIGlzIGFjdHVhbGx5IG5lZWRlZCBpbiB0aGlzIGxvb3AuCiAJCSAqLwotCQljdF93cml0ZV9sb2NrKGhhc2gpOworCQljdF93cml0ZV9sb2NrX2JoKGhhc2gpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpcF92c19jb25uX3RhYltoYXNoXSwgY19saXN0KSB7CiAJCQlpZiAoIWNwLT5jcG9ydCAmJiAhKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkpCkBAIC04MDYsNyArODA2LDcgQEAKIAkJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3AtPmNvbnRyb2wpOwogCQkJfQogCQl9Ci0JCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKKwkJY3Rfd3JpdGVfdW5sb2NrX2JoKGhhc2gpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMKaW5kZXggMTJhODJlOS4uN2Q5OWVkZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jCkBAIC05MCw3ICs5MCw4IEBACiAjZW5kaWYKIAogLyoKLSAqCXVwZGF0ZV9kZWZlbnNlX2xldmVsIGlzIGNhbGxlZCBmcm9tIGtldmVudGQgYW5kIGZyb20gc3lzY3RsLgorICoJdXBkYXRlX2RlZmVuc2VfbGV2ZWwgaXMgY2FsbGVkIGZyb20ga2V2ZW50ZCBhbmQgZnJvbSBzeXNjdGwsCisgKglzbyBpdCBuZWVkcyB0byBwcm90ZWN0IGl0c2VsZiBmcm9tIHNvZnRpcnFzCiAgKi8KIHN0YXRpYyB2b2lkIHVwZGF0ZV9kZWZlbnNlX2xldmVsKHZvaWQpCiB7CkBAIC0xMTAsNiArMTExLDggQEAKIAogCW5vbWVtID0gKGF2YWlsbWVtIDwgc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2gpOwogCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCiAJLyogZHJvcF9lbnRyeSAqLwogCXNwaW5fbG9jaygmX19pcF92c19kcm9wZW50cnlfbG9jayk7CiAJc3dpdGNoIChzeXNjdGxfaXBfdnNfZHJvcF9lbnRyeSkgewpAQCAtMjA2LDYgKzIwOSw4IEBACiAJaWYgKHRvX2NoYW5nZSA+PSAwKQogCQlpcF92c19wcm90b2NvbF90aW1lb3V0X2NoYW5nZShzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcD4xKTsKIAl3cml0ZV91bmxvY2soJl9faXBfdnNfc2VjdXJldGNwX2xvY2spOworCisJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiAKIApAQCAtMTM2MCw5ICsxMzY1LDcgQEAKIAkJCS8qIFJlc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKi8KIAkJCSp2YWxwID0gdmFsOwogCQl9IGVsc2UgewotCQkJbG9jYWxfYmhfZGlzYWJsZSgpOwogCQkJdXBkYXRlX2RlZmVuc2VfbGV2ZWwoKTsKLQkJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQl9CiAJfQogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKaW5kZXggNDJkYzk1MS4uMWRkODI0ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTQzMiw2ICs0MzIsMTMgQEAKIAkJCQkgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCQkJICAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKKyNpZiAhZGVmaW5lZChDT05GSUdfSVBfTkZfTkFUKSAmJiAhZGVmaW5lZChDT05GSUdfSVBfTkZfTkFUX01PRFVMRSkKKwkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gIElnbm9yZS4gIERvIHRoaXMgYmVmb3JlCisgICAgICAgICAgIGZyYWdtZW50IGNoZWNrLiAqLworCWlmICgoKnBza2IpLT5uZmN0KQorCQlyZXR1cm4gTkZfQUNDRVBUOworI2VuZGlmCisKIAkvKiBHYXRoZXIgZnJhZ21lbnRzLiAqLwogCWlmICgoKnBza2IpLT5uaC5pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgewogCQkqcHNrYiA9IGlwX2N0X2dhdGhlcl9mcmFncygqcHNrYiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDEyYTFjZjMuLmQ2NzVmZjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtNTQsNiArNTQsNyBAQAogICoJCU1hcmMgQm91Y2hlcgk6CXJvdXRpbmcgYnkgZndtYXJrCiAgKglSb2JlcnQgT2xzc29uCQk6CUFkZGVkIHJ0X2NhY2hlIHN0YXRpc3RpY3MKICAqCUFybmFsZG8gQy4gTWVsbwkJOglDb252ZXJ0IHByb2Mgc3R1ZmYgdG8gc2VxX2ZpbGUKKyAqCUVyaWMgRHVtYXpldAkJOgloYXNoZWQgc3BpbmxvY2tzIGFuZCBydF9jaGVja19leHBpcmUoKSBmaXhlcy4KICAqCiAgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC03MCw2ICs3MSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CkBAIC0yMDEsOCArMjAzLDM3IEBACiAKIHN0cnVjdCBydF9oYXNoX2J1Y2tldCB7CiAJc3RydWN0IHJ0YWJsZQkqY2hhaW47Ci0Jc3BpbmxvY2tfdAlsb2NrOwotfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpOworfTsKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKQorLyoKKyAqIEluc3RlYWQgb2YgdXNpbmcgb25lIHNwaW5sb2NrIGZvciBlYWNoIHJ0X2hhc2hfYnVja2V0LCB3ZSB1c2UgYSB0YWJsZSBvZiBzcGlubG9ja3MKKyAqIFRoZSBzaXplIG9mIHRoaXMgdGFibGUgaXMgYSBwb3dlciBvZiB0d28gYW5kIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBDUFVTLgorICovCisjaWYgTlJfQ1BVUyA+PSAzMgorI2RlZmluZSBSVF9IQVNIX0xPQ0tfU1oJNDA5NgorI2VsaWYgTlJfQ1BVUyA+PSAxNgorI2RlZmluZSBSVF9IQVNIX0xPQ0tfU1oJMjA0OAorI2VsaWYgTlJfQ1BVUyA+PSA4CisjZGVmaW5lIFJUX0hBU0hfTE9DS19TWgkxMDI0CisjZWxpZiBOUl9DUFVTID49IDQKKyNkZWZpbmUgUlRfSEFTSF9MT0NLX1NaCTUxMgorI2Vsc2UKKyNkZWZpbmUgUlRfSEFTSF9MT0NLX1NaCTI1NgorI2VuZGlmCisKK3N0YXRpYyBzcGlubG9ja190CSpydF9oYXNoX2xvY2tzOworIyBkZWZpbmUgcnRfaGFzaF9sb2NrX2FkZHIoc2xvdCkgJnJ0X2hhc2hfbG9ja3NbKHNsb3QpICYgKFJUX0hBU0hfTE9DS19TWiAtIDEpXQorIyBkZWZpbmUgcnRfaGFzaF9sb2NrX2luaXQoKQl7IFwKKwkJaW50IGk7IFwKKwkJcnRfaGFzaF9sb2NrcyA9IGttYWxsb2Moc2l6ZW9mKHNwaW5sb2NrX3QpICogUlRfSEFTSF9MT0NLX1NaLCBHRlBfS0VSTkVMKTsgXAorCQlpZiAoIXJ0X2hhc2hfbG9ja3MpIHBhbmljKCJJUDogZmFpbGVkIHRvIGFsbG9jYXRlIHJ0X2hhc2hfbG9ja3NcbiIpOyBcCisJCWZvciAoaSA9IDA7IGkgPCBSVF9IQVNIX0xPQ0tfU1o7IGkrKykgXAorCQkJc3Bpbl9sb2NrX2luaXQoJnJ0X2hhc2hfbG9ja3NbaV0pOyBcCisJCX0KKyNlbHNlCisjIGRlZmluZSBydF9oYXNoX2xvY2tfYWRkcihzbG90KSBOVUxMCisjIGRlZmluZSBydF9oYXNoX2xvY2tfaW5pdCgpCisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBydF9oYXNoX2J1Y2tldCAJKnJ0X2hhc2hfdGFibGU7CiBzdGF0aWMgdW5zaWduZWQJCQlydF9oYXNoX21hc2s7CkBAIC01NzUsMTkgKzYwNiwyNiBAQAogLyogVGhpcyBydW5zIHZpYSBhIHRpbWVyIGFuZCB0aHVzIGlzIGFsd2F5cyBpbiBCSCBjb250ZXh0LiAqLwogc3RhdGljIHZvaWQgcnRfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZHVtbXkpCiB7Ci0Jc3RhdGljIGludCByb3ZlcjsKLQlpbnQgaSA9IHJvdmVyLCB0OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcm92ZXI7CisJdW5zaWduZWQgaW50IGkgPSByb3ZlciwgZ29hbDsKIAlzdHJ1Y3QgcnRhYmxlICpydGgsICoqcnRocDsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJdTY0IG11bHQ7CiAKLQlmb3IgKHQgPSBpcF9ydF9nY19pbnRlcnZhbCA8PCBydF9oYXNoX2xvZzsgdCA+PSAwOwotCSAgICAgdCAtPSBpcF9ydF9nY190aW1lb3V0KSB7CisJbXVsdCA9ICgodTY0KWlwX3J0X2djX2ludGVydmFsKSA8PCBydF9oYXNoX2xvZzsKKwlpZiAoaXBfcnRfZ2NfdGltZW91dCA+IDEpCisJCWRvX2RpdihtdWx0LCBpcF9ydF9nY190aW1lb3V0KTsKKwlnb2FsID0gKHVuc2lnbmVkIGludCltdWx0OworCWlmIChnb2FsID4gcnRfaGFzaF9tYXNrKSBnb2FsID0gcnRfaGFzaF9tYXNrICsgMTsKKwlmb3IgKDsgZ29hbCA+IDA7IGdvYWwtLSkgewogCQl1bnNpZ25lZCBsb25nIHRtbyA9IGlwX3J0X2djX3RpbWVvdXQ7CiAKIAkJaSA9IChpICsgMSkgJiBydF9oYXNoX21hc2s7CiAJCXJ0aHAgPSAmcnRfaGFzaF90YWJsZVtpXS5jaGFpbjsKIAotCQlzcGluX2xvY2soJnJ0X2hhc2hfdGFibGVbaV0ubG9jayk7CisJCWlmICgqcnRocCA9PSAwKQorCQkJY29udGludWU7CisJCXNwaW5fbG9jayhydF9oYXNoX2xvY2tfYWRkcihpKSk7CiAJCXdoaWxlICgocnRoID0gKnJ0aHApICE9IE5VTEwpIHsKIAkJCWlmIChydGgtPnUuZHN0LmV4cGlyZXMpIHsKIAkJCQkvKiBFbnRyeSBpcyBleHBpcmVkIGV2ZW4gaWYgaXQgaXMgaW4gdXNlICovCkBAIC02MjAsMTQgKzY1OCwxNCBAQAogIAkJCXJ0X2ZyZWUocnRoKTsKICNlbmRpZiAvKiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRCAqLwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCQlzcGluX3VubG9jayhydF9oYXNoX2xvY2tfYWRkcihpKSk7CiAKIAkJLyogRmFsbGJhY2sgbG9vcCBicmVha2VyLiAqLwogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBub3cpKQogCQkJYnJlYWs7CiAJfQogCXJvdmVyID0gaTsKLQltb2RfdGltZXIoJnJ0X3BlcmlvZGljX3RpbWVyLCBub3cgKyBpcF9ydF9nY19pbnRlcnZhbCk7CisJbW9kX3RpbWVyKCZydF9wZXJpb2RpY190aW1lciwgamlmZmllcyArIGlwX3J0X2djX2ludGVydmFsKTsKIH0KIAogLyogVGhpcyBjYW4gcnVuIGZyb20gYm90aCBCSCBhbmQgbm9uLUJIIGNvbnRleHRzLCB0aGUgbGF0dGVyCkBAIC02NDMsMTEgKzY4MSwxMSBAQAogCWdldF9yYW5kb21fYnl0ZXMoJnJ0X2hhc2hfcm5kLCA0KTsKIAogCWZvciAoaSA9IHJ0X2hhc2hfbWFzazsgaSA+PSAwOyBpLS0pIHsKLQkJc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCQlzcGluX2xvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaSkpOwogCQlydGggPSBydF9oYXNoX3RhYmxlW2ldLmNoYWluOwogCQlpZiAocnRoKQogCQkJcnRfaGFzaF90YWJsZVtpXS5jaGFpbiA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCQlzcGluX3VubG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihpKSk7CiAKIAkJZm9yICg7IHJ0aDsgcnRoID0gbmV4dCkgewogCQkJbmV4dCA9IHJ0aC0+dS5ydF9uZXh0OwpAQCAtNzgwLDcgKzgxOCw3IEBACiAKIAkJCWsgPSAoayArIDEpICYgcnRfaGFzaF9tYXNrOwogCQkJcnRocCA9ICZydF9oYXNoX3RhYmxlW2tdLmNoYWluOwotCQkJc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2tdLmxvY2spOworCQkJc3Bpbl9sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGspKTsKIAkJCXdoaWxlICgocnRoID0gKnJ0aHApICE9IE5VTEwpIHsKIAkJCQlpZiAoIXJ0X21heV9leHBpcmUocnRoLCB0bW8sIGV4cGlyZSkpIHsKIAkJCQkJdG1vID4+PSAxOwpAQCAtODEyLDcgKzg1MCw3IEBACiAJCQkJZ29hbC0tOwogI2VuZGlmIC8qIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVEICovCiAJCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmcnRfaGFzaF90YWJsZVtrXS5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGspKTsKIAkJCWlmIChnb2FsIDw9IDApCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTg4Miw3ICs5MjAsNyBAQAogCiAJcnRocCA9ICZydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluOwogCi0Jc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCXNwaW5fbG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihoYXNoKSk7CiAJd2hpbGUgKChydGggPSAqcnRocCkgIT0gTlVMTCkgewogI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECiAJCWlmICghKHJ0aC0+dS5kc3QuZmxhZ3MgJiBEU1RfQkFMQU5DRUQpICYmCkBAIC05MDgsNyArOTQ2LDcgQEAKIAkJCXJ0aC0+dS5kc3QuX191c2UrKzsKIAkJCWRzdF9ob2xkKCZydGgtPnUuZHN0KTsKIAkJCXJ0aC0+dS5kc3QubGFzdHVzZSA9IG5vdzsKLQkJCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCQkJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogCiAJCQlydF9kcm9wKHJ0KTsKIAkJCSpycCA9IHJ0aDsKQEAgLTk0OSw3ICs5ODcsNyBAQAogCWlmIChydC0+cnRfdHlwZSA9PSBSVE5fVU5JQ0FTVCB8fCBydC0+ZmwuaWlmID09IDApIHsKIAkJaW50IGVyciA9IGFycF9iaW5kX25laWdoYm91cigmcnQtPnUuZHN0KTsKIAkJaWYgKGVycikgewotCQkJc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisJCQlzcGluX3VubG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihoYXNoKSk7CiAKIAkJCWlmIChlcnIgIT0gLUVOT0JVRlMpIHsKIAkJCQlydF9kcm9wKHJ0KTsKQEAgLTk5MCw3ICsxMDI4LDcgQEAKIAl9CiAjZW5kaWYKIAlydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluID0gcnQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogCSpycCA9IHJ0OwogCXJldHVybiAwOwogfQpAQCAtMTA1OCw3ICsxMDk2LDcgQEAKIHsKIAlzdHJ1Y3QgcnRhYmxlICoqcnRocDsKIAotCXNwaW5fbG9ja19iaCgmcnRfaGFzaF90YWJsZVtoYXNoXS5sb2NrKTsKKwlzcGluX2xvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogCWlwX3J0X3B1dChydCk7CiAJZm9yIChydGhwID0gJnJ0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW47ICpydGhwOwogCSAgICAgcnRocCA9ICYoKnJ0aHApLT51LnJ0X25leHQpCkBAIC0xMDY3LDcgKzExMDUsNyBAQAogCQkJcnRfZnJlZShydCk7CiAJCQlicmVhazsKIAkJfQotCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGhhc2gpKTsKIH0KIAogdm9pZCBpcF9ydF9yZWRpcmVjdCh1MzIgb2xkX2d3LCB1MzIgZGFkZHIsIHUzMiBuZXdfZ3csCkBAIC0xNjQ3LDcgKzE2ODUsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYXJ0aWFuIHNvdXJjZSAldS4ldS4ldS4ldSBmcm9tICIKIAkJCSIldS4ldS4ldS4ldSwgb24gZGV2ICVzXG4iLAogCQkJTklQUVVBRChkYWRkciksIE5JUFFVQUQoc2FkZHIpLCBkZXYtPm5hbWUpOwotCQlpZiAoZGV2LT5oYXJkX2hlYWRlcl9sZW4pIHsKKwkJaWYgKGRldi0+aGFyZF9oZWFkZXJfbGVuICYmIHNrYi0+bWFjLnJhdykgewogCQkJaW50IGk7CiAJCQl1bnNpZ25lZCBjaGFyICpwID0gc2tiLT5tYWMucmF3OwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibGwgaGVhZGVyOiAiKTsKQEAgLTMwNzMsMTIgKzMxMTEsMTQgQEAKIAogaW50IF9faW5pdCBpcF9ydF9pbml0KHZvaWQpCiB7Ci0JaW50IGksIG9yZGVyLCBnb2FsLCByYyA9IDA7CisJaW50IHJjID0gMDsKIAogCXJ0X2hhc2hfcm5kID0gKGludCkgKChudW1fcGh5c3BhZ2VzIF4gKG51bV9waHlzcGFnZXM+PjgpKSBeCiAJCQkgICAgIChqaWZmaWVzIF4gKGppZmZpZXMgPj4gNykpKTsKIAogI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCisJeworCWludCBvcmRlcjsKIAlmb3IgKG9yZGVyID0gMDsKIAkgICAgIChQQUdFX1NJWkUgPDwgb3JkZXIpIDwgMjU2ICogc2l6ZW9mKHN0cnVjdCBpcF9ydF9hY2N0KSAqIE5SX0NQVVM7IG9yZGVyKyspCiAJCS8qIE5PVEhJTkcgKi87CkBAIC0zMDg2LDYgKzMxMjYsNyBAQAogCWlmICghaXBfcnRfYWNjdCkKIAkJcGFuaWMoIklQOiBmYWlsZWQgdG8gYWxsb2NhdGUgaXBfcnRfYWNjdFxuIik7CiAJbWVtc2V0KGlwX3J0X2FjY3QsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisJfQogI2VuZGlmCiAKIAlpcHY0X2RzdF9vcHMua21lbV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfZHN0X2NhY2hlIiwKQEAgLTMwOTYsMzYgKzMxMzcsMTkgQEAKIAlpZiAoIWlwdjRfZHN0X29wcy5rbWVtX2NhY2hlcCkKIAkJcGFuaWMoIklQOiBmYWlsZWQgdG8gYWxsb2NhdGUgaXBfZHN0X2NhY2hlXG4iKTsKIAotCWdvYWwgPSBudW1fcGh5c3BhZ2VzID4+ICgyNiAtIFBBR0VfU0hJRlQpOwotCWlmIChyaGFzaF9lbnRyaWVzKQotCQlnb2FsID0gKHJoYXNoX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IHJ0X2hhc2hfYnVja2V0KSkgPj4gUEFHRV9TSElGVDsKLQlmb3IgKG9yZGVyID0gMDsgKDFVTCA8PCBvcmRlcikgPCBnb2FsOyBvcmRlcisrKQotCQkvKiBOT1RISU5HICovOwotCi0JZG8gewotCQlydF9oYXNoX21hc2sgPSAoMVVMIDw8IG9yZGVyKSAqIFBBR0VfU0laRSAvCi0JCQlzaXplb2Yoc3RydWN0IHJ0X2hhc2hfYnVja2V0KTsKLQkJd2hpbGUgKHJ0X2hhc2hfbWFzayAmIChydF9oYXNoX21hc2sgLSAxKSkKLQkJCXJ0X2hhc2hfbWFzay0tOwotCQlydF9oYXNoX3RhYmxlID0gKHN0cnVjdCBydF9oYXNoX2J1Y2tldCAqKQotCQkJX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBvcmRlcik7Ci0JfSB3aGlsZSAocnRfaGFzaF90YWJsZSA9PSBOVUxMICYmIC0tb3JkZXIgPiAwKTsKLQotCWlmICghcnRfaGFzaF90YWJsZSkKLQkJcGFuaWMoIkZhaWxlZCB0byBhbGxvY2F0ZSBJUCByb3V0ZSBjYWNoZSBoYXNoIHRhYmxlXG4iKTsKLQotCXByaW50ayhLRVJOX0lORk8gIklQOiByb3V0aW5nIGNhY2hlIGhhc2ggdGFibGUgb2YgJXUgYnVja2V0cywgJWxkS2J5dGVzXG4iLAotCSAgICAgICBydF9oYXNoX21hc2ssCi0JICAgICAgIChsb25nKSAocnRfaGFzaF9tYXNrICogc2l6ZW9mKHN0cnVjdCBydF9oYXNoX2J1Y2tldCkpIC8gMTAyNCk7Ci0KLQlmb3IgKHJ0X2hhc2hfbG9nID0gMDsgKDEgPDwgcnRfaGFzaF9sb2cpICE9IHJ0X2hhc2hfbWFzazsgcnRfaGFzaF9sb2crKykKLQkJLyogTk9USElORyAqLzsKLQotCXJ0X2hhc2hfbWFzay0tOwotCWZvciAoaSA9IDA7IGkgPD0gcnRfaGFzaF9tYXNrOyBpKyspIHsKLQkJc3Bpbl9sb2NrX2luaXQoJnJ0X2hhc2hfdGFibGVbaV0ubG9jayk7Ci0JCXJ0X2hhc2hfdGFibGVbaV0uY2hhaW4gPSBOVUxMOwotCX0KKwlydF9oYXNoX3RhYmxlID0gKHN0cnVjdCBydF9oYXNoX2J1Y2tldCAqKQorCQlhbGxvY19sYXJnZV9zeXN0ZW1faGFzaCgiSVAgcm91dGUgY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IHJ0X2hhc2hfYnVja2V0KSwKKwkJCQkJcmhhc2hfZW50cmllcywKKwkJCQkJKG51bV9waHlzcGFnZXMgPj0gMTI4ICogMTAyNCkgPworCQkJCQkJKDI3IC0gUEFHRV9TSElGVCkgOgorCQkJCQkJKDI5IC0gUEFHRV9TSElGVCksCisJCQkJCUhBU0hfSElHSE1FTSwKKwkJCQkJJnJ0X2hhc2hfbG9nLAorCQkJCQkmcnRfaGFzaF9tYXNrLAorCQkJCQkwKTsKKwltZW1zZXQocnRfaGFzaF90YWJsZSwgMCwgKHJ0X2hhc2hfbWFzayArIDEpICogc2l6ZW9mKHN0cnVjdCBydF9oYXNoX2J1Y2tldCkpOworCXJ0X2hhc2hfbG9ja19pbml0KCk7CiAKIAlpcHY0X2RzdF9vcHMuZ2NfdGhyZXNoID0gKHJ0X2hhc2hfbWFzayArIDEpOwogCWlwX3J0X21heF9zaXplID0gKHJ0X2hhc2hfbWFzayArIDEpICogMTY7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IDg4MjQzNmQuLmRkYjZjZTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC02MTUsNyArNjE1LDcgQEAKIAkJCSBzaXplX3QgcHNpemUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQlpbnQgbXNzX25vdzsKKwlpbnQgbXNzX25vdywgc2l6ZV9nb2FsOwogCWludCBlcnI7CiAJc3NpemVfdCBjb3BpZWQ7CiAJbG9uZyB0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKQEAgLTYyOCw2ICs2MjgsNyBAQAogCWNsZWFyX2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CiAKIAltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAhKGZsYWdzJk1TR19PT0IpKTsKKwlzaXplX2dvYWwgPSB0cC0+eG1pdF9zaXplX2dvYWw7CiAJY29waWVkID0gMDsKIAogCWVyciA9IC1FUElQRTsKQEAgLTY0MSw3ICs2NDIsNyBAQAogCQlpbnQgb2Zmc2V0ID0gcG9mZnNldCAlIFBBR0VfU0laRTsKIAkJaW50IHNpemUgPSBtaW5fdChzaXplX3QsIHBzaXplLCBQQUdFX1NJWkUgLSBvZmZzZXQpOwogCi0JCWlmICghc2stPnNrX3NlbmRfaGVhZCB8fCAoY29weSA9IG1zc19ub3cgLSBza2ItPmxlbikgPD0gMCkgeworCQlpZiAoIXNrLT5za19zZW5kX2hlYWQgfHwgKGNvcHkgPSBzaXplX2dvYWwgLSBza2ItPmxlbikgPD0gMCkgewogbmV3X3NlZ21lbnQ6CiAJCQlpZiAoIXNrX3N0cmVhbV9tZW1vcnlfZnJlZShzaykpCiAJCQkJZ290byB3YWl0X2Zvcl9zbmRidWY7CkBAIC02NTIsNyArNjUzLDcgQEAKIAkJCQlnb3RvIHdhaXRfZm9yX21lbW9yeTsKIAogCQkJc2tiX2VudGFpbChzaywgdHAsIHNrYik7Ci0JCQljb3B5ID0gbXNzX25vdzsKKwkJCWNvcHkgPSBzaXplX2dvYWw7CiAJCX0KIAogCQlpZiAoY29weSA+IHNpemUpCkBAIC02OTMsNyArNjk0LDcgQEAKIAkJaWYgKCEocHNpemUgLT0gY29weSkpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAoc2tiLT5sZW4gIT0gbXNzX25vdyB8fCAoZmxhZ3MgJiBNU0dfT09CKSkKKwkJaWYgKHNrYi0+bGVuIDwgbXNzX25vdyB8fCAoZmxhZ3MgJiBNU0dfT09CKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChmb3JjZWRfcHVzaCh0cCkpIHsKQEAgLTcxMyw2ICs3MTQsNyBAQAogCQkJZ290byBkb19lcnJvcjsKIAogCQltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAhKGZsYWdzJk1TR19PT0IpKTsKKwkJc2l6ZV9nb2FsID0gdHAtPnhtaXRfc2l6ZV9nb2FsOwogCX0KIAogb3V0OgpAQCAtNzU0LDE1ICs3NTYsMjAgQEAKIAogc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X3NpemUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewotCWludCB0bXAgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwlpbnQgdG1wID0gdHAtPm1zc19jYWNoZTsKIAogCWlmIChzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfU0cpIHsKLQkJaW50IHBnYnJlYWsgPSBTS0JfTUFYX0hFQUQoTUFYX1RDUF9IRUFERVIpOworCQlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1RTTykKKwkJCXRtcCA9IDA7CisJCWVsc2UgeworCQkJaW50IHBnYnJlYWsgPSBTS0JfTUFYX0hFQUQoTUFYX1RDUF9IRUFERVIpOwogCi0JCWlmICh0bXAgPj0gcGdicmVhayAmJgotCQkgICAgdG1wIDw9IHBnYnJlYWsgKyAoTUFYX1NLQl9GUkFHUyAtIDEpICogUEFHRV9TSVpFKQotCQkJdG1wID0gcGdicmVhazsKKwkJCWlmICh0bXAgPj0gcGdicmVhayAmJgorCQkJICAgIHRtcCA8PSBwZ2JyZWFrICsgKE1BWF9TS0JfRlJBR1MgLSAxKSAqIFBBR0VfU0laRSkKKwkJCQl0bXAgPSBwZ2JyZWFrOworCQl9CiAJfQorCiAJcmV0dXJuIHRtcDsKIH0KIApAQCAtNzczLDcgKzc4MCw3IEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgaW92bGVuLCBmbGFnczsKLQlpbnQgbXNzX25vdzsKKwlpbnQgbXNzX25vdywgc2l6ZV9nb2FsOwogCWludCBlcnIsIGNvcGllZDsKIAlsb25nIHRpbWVvOwogCkBAIC03OTIsNiArNzk5LDcgQEAKIAljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOwogCiAJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgIShmbGFncyZNU0dfT09CKSk7CisJc2l6ZV9nb2FsID0gdHAtPnhtaXRfc2l6ZV9nb2FsOwogCiAJLyogT2sgY29tbWVuY2Ugc2VuZGluZy4gKi8KIAlpb3ZsZW4gPSBtc2ctPm1zZ19pb3ZsZW47CkBAIC04MTQsNyArODIyLDcgQEAKIAkJCXNrYiA9IHNrLT5za193cml0ZV9xdWV1ZS5wcmV2OwogCiAJCQlpZiAoIXNrLT5za19zZW5kX2hlYWQgfHwKLQkJCSAgICAoY29weSA9IG1zc19ub3cgLSBza2ItPmxlbikgPD0gMCkgeworCQkJICAgIChjb3B5ID0gc2l6ZV9nb2FsIC0gc2tiLT5sZW4pIDw9IDApIHsKIAogbmV3X3NlZ21lbnQ6CiAJCQkJLyogQWxsb2NhdGUgbmV3IHNlZ21lbnQuIElmIHRoZSBpbnRlcmZhY2UgaXMgU0csCkBAIC04MzcsNyArODQ1LDcgQEAKIAkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKIAogCQkJCXNrYl9lbnRhaWwoc2ssIHRwLCBza2IpOwotCQkJCWNvcHkgPSBtc3Nfbm93OworCQkJCWNvcHkgPSBzaXplX2dvYWw7CiAJCQl9CiAKIAkJCS8qIFRyeSB0byBhcHBlbmQgZGF0YSB0byB0aGUgZW5kIG9mIHNrYi4gKi8KQEAgLTg3MiwxMSArODgwLDYgQEAKIAkJCQkJdGNwX21hcmtfcHVzaCh0cCwgc2tiKTsKIAkJCQkJZ290byBuZXdfc2VnbWVudDsKIAkJCQl9IGVsc2UgaWYgKHBhZ2UpIHsKLQkJCQkJLyogSWYgcGFnZSBpcyBjYWNoZWQsIGFsaWduCi0JCQkJCSAqIG9mZnNldCB0byBMMSBjYWNoZSBib3VuZGFyeQotCQkJCQkgKi8KLQkJCQkJb2ZmID0gKG9mZiArIEwxX0NBQ0hFX0JZVEVTIC0gMSkgJgotCQkJCQkgICAgICB+KEwxX0NBQ0hFX0JZVEVTIC0gMSk7CiAJCQkJCWlmIChvZmYgPT0gUEFHRV9TSVpFKSB7CiAJCQkJCQlwdXRfcGFnZShwYWdlKTsKIAkJCQkJCVRDUF9QQUdFKHNrKSA9IHBhZ2UgPSBOVUxMOwpAQCAtOTM3LDcgKzk0MCw3IEBACiAJCQlpZiAoKHNlZ2xlbiAtPSBjb3B5KSA9PSAwICYmIGlvdmxlbiA9PSAwKQogCQkJCWdvdG8gb3V0OwogCi0JCQlpZiAoc2tiLT5sZW4gIT0gbXNzX25vdyB8fCAoZmxhZ3MgJiBNU0dfT09CKSkKKwkJCWlmIChza2ItPmxlbiA8IG1zc19ub3cgfHwgKGZsYWdzICYgTVNHX09PQikpCiAJCQkJY29udGludWU7CiAKIAkJCWlmIChmb3JjZWRfcHVzaCh0cCkpIHsKQEAgLTk1Nyw2ICs5NjAsNyBAQAogCQkJCWdvdG8gZG9fZXJyb3I7CiAKIAkJCW1zc19ub3cgPSB0Y3BfY3VycmVudF9tc3Moc2ssICEoZmxhZ3MmTVNHX09PQikpOworCQkJc2l6ZV9nb2FsID0gdHAtPnhtaXRfc2l6ZV9nb2FsOwogCQl9CiAJfQogCkBAIC0xMTAxLDcgKzExMDUsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlORVRfQUREX1NUQVRTX1VTRVIoTElOVVhfTUlCX1RDUFBSRVFVRVVFRCwgc2tiX3F1ZXVlX2xlbigmdHAtPnVjb3B5LnByZXF1ZXVlKSk7CisJTkVUX0lOQ19TVEFUU19VU0VSKExJTlVYX01JQl9UQ1BQUkVRVUVVRUQpOwogCiAJLyogUlggcHJvY2VzcyB3YW50cyB0byBydW4gd2l0aCBkaXNhYmxlZCBCSHMsIHRob3VnaCBpdCBpcyBub3QKIAkgKiBuZWNlc3NhcnkgKi8KQEAgLTEzNjUsNyArMTM2OSw3IEBACiAJCQkgKiBpcyBub3QgZW1wdHkuIEl0IGlzIG1vcmUgZWxlZ2FudCwgYnV0IGVhdHMgY3ljbGVzLAogCQkJICogdW5mb3J0dW5hdGVseS4KIAkJCSAqLwotCQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpCisJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHAtPnVjb3B5LnByZXF1ZXVlKSkKIAkJCQlnb3RvIGRvX3ByZXF1ZXVlOwogCiAJCQkvKiBfXyBTZXQgcmVhbHRpbWUgcG9saWN5IGluIHNjaGVkdWxlciBfXyAqLwpAQCAtMTM5MCw3ICsxMzk0LDcgQEAKIAkJCX0KIAogCQkJaWYgKHRwLT5yY3Zfbnh0ID09IHRwLT5jb3BpZWRfc2VxICYmCi0JCQkgICAgc2tiX3F1ZXVlX2xlbigmdHAtPnVjb3B5LnByZXF1ZXVlKSkgeworCQkJICAgICFza2JfcXVldWVfZW1wdHkoJnRwLT51Y29weS5wcmVxdWV1ZSkpIHsKIGRvX3ByZXF1ZXVlOgogCQkJCXRjcF9wcmVxdWV1ZV9wcm9jZXNzKHNrKTsKIApAQCAtMTQ3Miw3ICsxNDc2LDcgQEAKIAl9IHdoaWxlIChsZW4gPiAwKTsKIAogCWlmICh1c2VyX3JlY3YpIHsKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpIHsKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnRwLT51Y29weS5wcmVxdWV1ZSkpIHsKIAkJCWludCBjaHVuazsKIAogCQkJdHAtPnVjb3B5LmxlbiA9IGNvcGllZCA+IDAgPyBsZW4gOiAwOwpAQCAtMjEyOCw3ICsyMTMyLDcgQEAKIAogCWluZm8tPnRjcGlfcnRvID0gamlmZmllc190b191c2Vjcyh0cC0+cnRvKTsKIAlpbmZvLT50Y3BpX2F0byA9IGppZmZpZXNfdG9fdXNlY3ModHAtPmFjay5hdG8pOwotCWluZm8tPnRjcGlfc25kX21zcyA9IHRwLT5tc3NfY2FjaGVfc3RkOworCWluZm8tPnRjcGlfc25kX21zcyA9IHRwLT5tc3NfY2FjaGU7CiAJaW5mby0+dGNwaV9yY3ZfbXNzID0gdHAtPmFjay5yY3ZfbXNzOwogCiAJaW5mby0+dGNwaV91bmFja2VkID0gdHAtPnBhY2tldHNfb3V0OwpAQCAtMjE3OCw3ICsyMTgyLDcgQEAKIAogCXN3aXRjaCAob3B0bmFtZSkgewogCWNhc2UgVENQX01BWFNFRzoKLQkJdmFsID0gdHAtPm1zc19jYWNoZV9zdGQ7CisJCXZhbCA9IHRwLT5tc3NfY2FjaGU7CiAJCWlmICghdmFsICYmICgoMSA8PCBzay0+c2tfc3RhdGUpICYgKFRDUEZfQ0xPU0UgfCBUQ1BGX0xJU1RFTikpKQogCQkJdmFsID0gdHAtPnJ4X29wdC51c2VyX21zczsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCmluZGV4IDdiYmJiYzMuLjUzYThhNTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCkBAIC03NDAsMTAgKzc0MCwxMCBAQAogCV9fdTMyIGN3bmQgPSAoZHN0ID8gZHN0X21ldHJpYyhkc3QsIFJUQVhfSU5JVENXTkQpIDogMCk7CiAKIAlpZiAoIWN3bmQpIHsKLQkJaWYgKHRwLT5tc3NfY2FjaGVfc3RkID4gMTQ2MCkKKwkJaWYgKHRwLT5tc3NfY2FjaGUgPiAxNDYwKQogCQkJY3duZCA9IDI7CiAJCWVsc2UKLQkJCWN3bmQgPSAodHAtPm1zc19jYWNoZV9zdGQgPiAxMDk1KSA/IDMgOiA0OworCQkJY3duZCA9ICh0cC0+bXNzX2NhY2hlID4gMTA5NSkgPyAzIDogNDsKIAl9CiAJcmV0dXJuIG1pbl90KF9fdTMyLCBjd25kLCB0cC0+c25kX2N3bmRfY2xhbXApOwogfQpAQCAtOTE0LDcgKzkxNCw3IEBACiAJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pIHsKIAkJc2stPnNrX3JvdXRlX2NhcHMgJj0gfk5FVElGX0ZfVFNPOwogCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX05PX0xBUkdFU0VORCk7Ci0JCXRwLT5tc3NfY2FjaGUgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwkJdHAtPm1zc19jYWNoZSA9IHRwLT5tc3NfY2FjaGU7CiAJfQogCiAJaWYgKCF0cC0+c2Fja2VkX291dCkKQEAgLTEwNzcsNyArMTA3Nyw3IEBACiAJCQkgICAgKElzRmFjayh0cCkgfHwKIAkJCSAgICAgIWJlZm9yZShsb3N0X3JldHJhbnMsCiAJCQkJICAgICBUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgKyB0cC0+cmVvcmRlcmluZyAqCi0JCQkJICAgICB0cC0+bXNzX2NhY2hlX3N0ZCkpKSB7CisJCQkJICAgICB0cC0+bXNzX2NhY2hlKSkpIHsKIAkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfU0FDS0VEX1JFVFJBTlM7CiAJCQkJdHAtPnJldHJhbnNfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CiAKQEAgLTE5NTcsMTUgKzE5NTcsNiBAQAogCX0KIH0KIAotLyogVGhlcmUgaXMgb25lIGRvd25zaWRlIHRvIHRoaXMgc2NoZW1lLiAgQWx0aG91Z2ggd2Uga2VlcCB0aGUKLSAqIEFDSyBjbG9jayB0aWNraW5nLCBhZGp1c3RpbmcgcGFja2V0IGNvdW50ZXJzIGFuZCBhZHZhbmNpbmcKLSAqIGNvbmdlc3Rpb24gd2luZG93LCB3ZSBkbyBub3QgbGliZXJhdGUgc29ja2V0IHNlbmQgYnVmZmVyCi0gKiBzcGFjZS4KLSAqCi0gKiBNdWNraW5nIHdpdGggc2tiLT50cnVlc2l6ZSBhbmQgc2stPnNrX3dtZW1fYWxsb2MgZXQgYWwuCi0gKiB0aGVuIG1ha2luZyBhIHdyaXRlIHNwYWNlIHdha2V1cCBjYWxsYmFjayBpcyBhIHBvc3NpYmxlCi0gKiBmdXR1cmUgZW5oYW5jZW1lbnQuICBXQVJOSU5HOiBpdCBpcyBub3QgdHJpdmlhbCB0byBtYWtlLgotICovCiBzdGF0aWMgaW50IHRjcF90c29fYWNrZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJIF9fdTMyIG5vdywgX19zMzIgKnNlcV9ydHQpCiB7CkBAIC0yMDQ3LDcgKzIwMzgsOCBAQAogCQkgKiB0aGUgb3RoZXIgZW5kLgogCQkgKi8KIAkJaWYgKGFmdGVyKHNjYi0+ZW5kX3NlcSwgdHAtPnNuZF91bmEpKSB7Ci0JCQlpZiAodGNwX3NrYl9wY291bnQoc2tiKSA+IDEpCisJCQlpZiAodGNwX3NrYl9wY291bnQoc2tiKSA+IDEgJiYKKwkJCSAgICBhZnRlcih0cC0+c25kX3VuYSwgc2NiLT5zZXEpKQogCQkJCWFja2VkIHw9IHRjcF90c29fYWNrZWQoc2ssIHNrYiwKIAkJCQkJCSAgICAgICBub3csICZzZXFfcnR0KTsKIAkJCWJyZWFrOwpAQCAtMjgxMCw3ICsyODAyLDcgQEAKIAlpbnQgdGhpc19zYWNrOwogCiAJLyogRW1wdHkgb2ZvIHF1ZXVlLCBoZW5jZSwgYWxsIHRoZSBTQUNLcyBhcmUgZWF0ZW4uIENsZWFyLiAqLwotCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSA9PSAwKSB7CisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKIAkJdHAtPnJ4X29wdC5udW1fc2Fja3MgPSAwOwogCQl0cC0+cnhfb3B0LmVmZl9zYWNrcyA9IHRwLT5yeF9vcHQuZHNhY2s7CiAJCXJldHVybjsKQEAgLTI5NDMsMTMgKzI5MzUsMTMgQEAKIAkJaWYodGgtPmZpbikKIAkJCXRjcF9maW4oc2tiLCBzaywgdGgpOwogCi0JCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKIAkJCXRjcF9vZm9fcXVldWUoc2spOwogCiAJCQkvKiBSRkMyNTgxLiA0LjIuIFNIT1VMRCBzZW5kIGltbWVkaWF0ZSBBQ0ssIHdoZW4KIAkJCSAqIGdhcCBpbiBxdWV1ZSBpcyBmaWxsZWQuCiAJCQkgKi8KLQkJCWlmICghc2tiX3F1ZXVlX2xlbigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpCisJCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkKIAkJCQl0cC0+YWNrLnBpbmdwb25nID0gMDsKIAkJfQogCkBAIC0zMjU3LDkgKzMyNDksOCBAQAogCSAqIFRoaXMgbXVzdCBub3QgZXZlciBvY2N1ci4gKi8KIAogCS8qIEZpcnN0LCBwdXJnZSB0aGUgb3V0X29mX29yZGVyIHF1ZXVlLiAqLwotCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewotCQlORVRfQUREX1NUQVRTX0JIKExJTlVYX01JQl9PRk9QUlVORUQsIAotCQkJCSBza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSk7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX09GT1BSVU5FRCk7CiAJCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAogCQkvKiBSZXNldCBTQUNLIHN0YXRlLiAgQSBjb25mb3JtaW5nIFNBQ0sgaW1wbGVtZW50YXRpb24gd2lsbApAQCAtMzMwOCw2ICszMjk5LDI4IEBACiAJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9zaG91bGRfZXhwYW5kX3NuZGJ1ZihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJLyogSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGEgc3BlY2lmaWMgc2VuZCBidWZmZXIgc2V0dGluZywgZG8KKwkgKiBub3QgbW9kaWZ5IGl0LgorCSAqLworCWlmIChzay0+c2tfdXNlcmxvY2tzICYgU09DS19TTkRCVUZfTE9DSykKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSBhcmUgdW5kZXIgZ2xvYmFsIFRDUCBtZW1vcnkgcHJlc3N1cmUsIGRvIG5vdCBleHBhbmQuICAqLworCWlmICh0Y3BfbWVtb3J5X3ByZXNzdXJlKQorCQlyZXR1cm4gMDsKKworCS8qIElmIHdlIGFyZSB1bmRlciBzb2Z0IGdsb2JhbCBUQ1AgbWVtb3J5IHByZXNzdXJlLCBkbyBub3QgZXhwYW5kLiAgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSA+PSBzeXNjdGxfdGNwX21lbVswXSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSBmaWxsZWQgdGhlIGNvbmdlc3Rpb24gd2luZG93LCBkbyBub3QgZXhwYW5kLiAgKi8KKwlpZiAodHAtPnBhY2tldHNfb3V0ID49IHRwLT5zbmRfY3duZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KIAogLyogV2hlbiBpbmNvbWluZyBBQ0sgYWxsb3dlZCB0byBmcmVlIHNvbWUgc2tiIGZyb20gd3JpdGVfcXVldWUsCiAgKiB3ZSByZW1lbWJlciB0aGlzIGV2ZW50IGluIGZsYWcgU09DS19RVUVVRV9TSFJVTksgYW5kIHdha2UgdXAgc29ja2V0CkBAIC0zMzE5LDExICszMzMyLDggQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAotCWlmICh0cC0+cGFja2V0c19vdXQgPCB0cC0+c25kX2N3bmQgJiYKLQkgICAgIShzay0+c2tfdXNlcmxvY2tzICYgU09DS19TTkRCVUZfTE9DSykgJiYKLQkgICAgIXRjcF9tZW1vcnlfcHJlc3N1cmUgJiYKLQkgICAgYXRvbWljX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSA8IHN5c2N0bF90Y3BfbWVtWzBdKSB7Ci0gCQlpbnQgc25kbWVtID0gbWF4X3QodTMyLCB0cC0+cnhfb3B0Lm1zc19jbGFtcCwgdHAtPm1zc19jYWNoZV9zdGQpICsKKwlpZiAodGNwX3Nob3VsZF9leHBhbmRfc25kYnVmKHNrLCB0cCkpIHsKKyAJCWludCBzbmRtZW0gPSBtYXhfdCh1MzIsIHRwLT5yeF9vcHQubXNzX2NsYW1wLCB0cC0+bXNzX2NhY2hlKSArCiAJCQlNQVhfVENQX0hFQURFUiArIDE2ICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKSwKIAkJICAgIGRlbWFuZGVkID0gbWF4X3QodW5zaWduZWQgaW50LCB0cC0+c25kX2N3bmQsCiAJCQkJCQkgICB0cC0+cmVvcmRlcmluZyArIDEpOwpAQCAtMzM0NiwyMiArMzM1Niw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX3RjcF9kYXRhX3NuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9kYXRhX3NuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0KLQlpZiAoYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCB0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKSB8fAotCSAgICB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApID49IHRwLT5zbmRfY3duZCB8fAotCSAgICB0Y3Bfd3JpdGVfeG1pdChzaywgdHAtPm5vbmFnbGUpKQotCQl0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc2ssIHRwKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfZGF0YV9zbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfc2VuZF9oZWFkOwotCi0JaWYgKHNrYiAhPSBOVUxMKQotCQlfX3RjcF9kYXRhX3NuZF9jaGVjayhzaywgc2tiKTsKKwl0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHApOwogCXRjcF9jaGVja19zcGFjZShzayk7CiB9CiAKQEAgLTM2NTUsNyArMzY1Miw3IEBACiAJCQkJICovCiAJCQkJdGNwX2Fjayhzaywgc2tiLCAwKTsKIAkJCQlfX2tmcmVlX3NrYihza2IpOyAKLQkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOworCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOwogCQkJCXJldHVybiAwOwogCQkJfSBlbHNlIHsgLyogSGVhZGVyIHRvbyBzbWFsbCAqLwogCQkJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9JTkVSUlMpOwpAQCAtMzcyMSw3ICszNzE4LDcgQEAKIAkJCWlmIChUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgIT0gdHAtPnNuZF91bmEpIHsKIAkJCQkvKiBXZWxsLCBvbmx5IG9uZSBzbWFsbCBqdW1wbGV0IGluIGZhc3QgcGF0aC4uLiAqLwogCQkJCXRjcF9hY2soc2ssIHNrYiwgRkxBR19EQVRBKTsKLQkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOworCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOwogCQkJCWlmICghdGNwX2Fja19zY2hlZHVsZWQodHApKQogCQkJCQlnb3RvIG5vX2FjazsKIAkJCX0KQEAgLTM3OTksNyArMzc5Niw3IEBACiAJLyogc3RlcCA3OiBwcm9jZXNzIHRoZSBzZWdtZW50IHRleHQgKi8KIAl0Y3BfZGF0YV9xdWV1ZShzaywgc2tiKTsKIAotCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJdGNwX2RhdGFfc25kX2NoZWNrKHNrLCB0cCk7CiAJdGNwX2Fja19zbmRfY2hlY2soc2spOwogCXJldHVybiAwOwogCkBAIC00MTA5LDcgKzQxMDYsNyBAQAogCQkvKiBEbyBzdGVwNiBvbndhcmQgYnkgaGFuZC4gKi8KIAkJdGNwX3VyZyhzaywgc2tiLCB0aCk7CiAJCV9fa2ZyZWVfc2tiKHNrYik7Ci0JCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQzMDAsNyArNDI5Nyw3IEBACiAKIAkvKiB0Y3BfZGF0YSBjb3VsZCBtb3ZlIHNvY2tldCB0byBUSU1FLVdBSVQgKi8KIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkgewotCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOworCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKIAkJdGNwX2Fja19zbmRfY2hlY2soc2spOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggZWJmMTEyMy4uNjJmNjJiYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0yMDQ1LDcgKzIwNDUsNyBAQAogCSAqLwogCXRwLT5zbmRfc3N0aHJlc2ggPSAweDdmZmZmZmZmOwkvKiBJbmZpbml0eSAqLwogCXRwLT5zbmRfY3duZF9jbGFtcCA9IH4wOwotCXRwLT5tc3NfY2FjaGVfc3RkID0gdHAtPm1zc19jYWNoZSA9IDUzNjsKKwl0cC0+bXNzX2NhY2hlID0gNTM2OwogCiAJdHAtPnJlb3JkZXJpbmcgPSBzeXNjdGxfdGNwX3Jlb3JkZXJpbmc7CiAJdHAtPmNhX29wcyA9ICZ0Y3BfaW5pdF9jb25nZXN0aW9uX29wczsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCAwZTE3YzI0Li5lM2Y4ZWExIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC00OSw3ICs0OSw3IEBACiAgKiB3aWxsIGFsbG93IGEgc2luZ2xlIFRTTyBmcmFtZSB0byBjb25zdW1lLiAgQnVpbGRpbmcgVFNPIGZyYW1lcwogICogd2hpY2ggYXJlIHRvbyBsYXJnZSBjYW4gY2F1c2UgVENQIHN0cmVhbXMgdG8gYmUgYnVyc3R5LgogICovCi1pbnQgc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IgPSA4OworaW50IHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yID0gMzsKIAogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9zZW5kX2hlYWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAogCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTQwLDExICsxNDAsMTEgQEAKIAkJdHAtPmFjay5waW5ncG9uZyA9IDE7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2V2ZW50X2Fja19zZW50KHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2V2ZW50X2Fja19zZW50KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHBrdHMpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQl0Y3BfZGVjX3F1aWNrYWNrX21vZGUodHApOworCXRjcF9kZWNfcXVpY2thY2tfbW9kZSh0cCwgcGt0cyk7CiAJdGNwX2NsZWFyX3htaXRfdGltZXIoc2ssIFRDUF9USU1FX0RBQ0spOwogfQogCkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJdHAtPmFmX3NwZWNpZmljLT5zZW5kX2NoZWNrKHNrLCB0aCwgc2tiLT5sZW4sIHNrYik7CiAKIAkJaWYgKHRjYi0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0FDSykKLQkJCXRjcF9ldmVudF9hY2tfc2VudChzayk7CisJCQl0Y3BfZXZlbnRfYWNrX3NlbnQoc2ssIHRjcF9za2JfcGNvdW50KHNrYikpOwogCiAJCWlmIChza2ItPmxlbiAhPSB0Y3BfaGVhZGVyX3NpemUpCiAJCQl0Y3BfZXZlbnRfZGF0YV9zZW50KHRwLCBza2IsIHNrKTsKQEAgLTQwMyw0MiArNDAzLDExIEBACiAJCXNrLT5za19zZW5kX2hlYWQgPSBza2I7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfdHNvX3NldF9wdXNoKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JLyogRm9yY2UgcHVzaCB0byBiZSBvbiBmb3IgYW55IFRTTyBmcmFtZXMgdG8gd29ya2Fyb3VuZAotCSAqIHByb2JsZW1zIHdpdGggYnVzdGVkIGltcGxlbWVudGF0aW9ucyBsaWtlIE1hYyBPUy1YIHRoYXQKLQkgKiBob2xkIG9mZiBzb2NrZXQgcmVjZWl2ZSB3YWtldXBzIHVudGlsIHB1c2ggaXMgc2Vlbi4KLQkgKi8KLQlpZiAodGNwX3NrYl9wY291bnQoc2tiKSA+IDEpCi0JCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQQ0JfRkxBR19QU0g7Ci19Ci0KLS8qIFNlbmQgX3NpbmdsZV8gc2tiIHNpdHRpbmcgYXQgdGhlIHNlbmQgaGVhZC4gVGhpcyBmdW5jdGlvbiByZXF1aXJlcwotICogdHJ1ZSBwdXNoIHBlbmRpbmcgZnJhbWVzIHRvIHNldHVwIHByb2JlIHRpbWVyIGV0Yy4KLSAqLwotdm9pZCB0Y3BfcHVzaF9vbmUoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBjdXJfbXNzKQotewotCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfc2VuZF9oZWFkOwotCi0JaWYgKHRjcF9zbmRfdGVzdChzaywgc2tiLCBjdXJfbXNzLCBUQ1BfTkFHTEVfUFVTSCkpIHsKLQkJLyogU2VuZCBpdCBvdXQgbm93LiAqLwotCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKLQkJdGNwX3Rzb19zZXRfcHVzaChza2IpOwotCQlpZiAoIXRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIHNrLT5za19hbGxvY2F0aW9uKSkpIHsKLQkJCXNrLT5za19zZW5kX2hlYWQgPSBOVUxMOwotCQkJdHAtPnNuZF9ueHQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Ci0JCQl0Y3BfcGFja2V0c19vdXRfaW5jKHNrLCB0cCwgc2tiKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLX0KLQotdm9pZCB0Y3Bfc2V0X3NrYl90c29fc2VncyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCB0Y3Bfc2V0X3NrYl90c29fc2VncyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlpZiAoc2tiLT5sZW4gPD0gdHAtPm1zc19jYWNoZV9zdGQgfHwKKwlpZiAoc2tiLT5sZW4gPD0gdHAtPm1zc19jYWNoZSB8fAogCSAgICAhKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pKSB7CiAJCS8qIEF2b2lkIHRoZSBjb3N0bHkgZGl2aWRlIGluIHRoZSBub3JtYWwKIAkJICogbm9uLVRTTyBjYXNlLgpAQCAtNDQ4LDEwICs0MTcsMTAgQEAKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBpbnQgZmFjdG9yOwogCi0JCWZhY3RvciA9IHNrYi0+bGVuICsgKHRwLT5tc3NfY2FjaGVfc3RkIC0gMSk7Ci0JCWZhY3RvciAvPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwkJZmFjdG9yID0gc2tiLT5sZW4gKyAodHAtPm1zc19jYWNoZSAtIDEpOworCQlmYWN0b3IgLz0gdHAtPm1zc19jYWNoZTsKIAkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IGZhY3RvcjsKLQkJc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA9IHRwLT5tc3NfY2FjaGVfc3RkOworCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplID0gdHAtPm1zc19jYWNoZTsKIAl9CiB9CiAKQEAgLTUzNyw2ICs1MDYsNyBAQAogCX0KIAogCS8qIExpbmsgQlVGRiBpbnRvIHRoZSBzZW5kIHF1ZXVlLiAqLworCXNrYl9oZWFkZXJfcmVsZWFzZShidWZmKTsKIAlfX3NrYl9hcHBlbmQoc2tiLCBidWZmKTsKIAogCXJldHVybiAwOwpAQCAtNjU3LDcgKzYyNyw3IEBACiAKIAkvKiBBbmQgc3RvcmUgY2FjaGVkIHJlc3VsdHMgKi8KIAl0cC0+cG10dV9jb29raWUgPSBwbXR1OwotCXRwLT5tc3NfY2FjaGUgPSB0cC0+bXNzX2NhY2hlX3N0ZCA9IG1zc19ub3c7CisJdHAtPm1zc19jYWNoZSA9IG1zc19ub3c7CiAKIAlyZXR1cm4gbXNzX25vdzsKIH0KQEAgLTY2OSw1OSArNjM5LDMxOCBAQAogICogY2Fubm90IGJlIGxhcmdlLiBIb3dldmVyLCB0YWtpbmcgaW50byBhY2NvdW50IHJhcmUgdXNlIG9mIFVSRywgdGhpcwogICogaXMgbm90IGEgYmlnIGZsYXcuCiAgKi8KLQotdW5zaWduZWQgaW50IHRjcF9jdXJyZW50X21zcyhzdHJ1Y3Qgc29jayAqc2ssIGludCBsYXJnZSkKK3Vuc2lnbmVkIGludCB0Y3BfY3VycmVudF9tc3Moc3RydWN0IHNvY2sgKnNrLCBpbnQgbGFyZ2VfYWxsb3dlZCkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBfX3NrX2RzdF9nZXQoc2spOwotCXVuc2lnbmVkIGludCBkb19sYXJnZSwgbXNzX25vdzsKKwl1MzIgbXNzX25vdzsKKwl1MTYgeG1pdF9zaXplX2dvYWw7CisJaW50IGRvaW5nX3RzbyA9IDA7CiAKLQltc3Nfbm93ID0gdHAtPm1zc19jYWNoZV9zdGQ7CisJbXNzX25vdyA9IHRwLT5tc3NfY2FjaGU7CisKKwlpZiAobGFyZ2VfYWxsb3dlZCAmJgorCSAgICAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1RTTykgJiYKKwkgICAgIXRwLT51cmdfbW9kZSkKKwkJZG9pbmdfdHNvID0gMTsKKwogCWlmIChkc3QpIHsKIAkJdTMyIG10dSA9IGRzdF9tdHUoZHN0KTsKIAkJaWYgKG10dSAhPSB0cC0+cG10dV9jb29raWUpCiAJCQltc3Nfbm93ID0gdGNwX3N5bmNfbXNzKHNrLCBtdHUpOwogCX0KIAotCWRvX2xhcmdlID0gKGxhcmdlICYmCi0JCSAgICAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1RTTykgJiYKLQkJICAgICF0cC0+dXJnX21vZGUpOwotCi0JaWYgKGRvX2xhcmdlKSB7Ci0JCXVuc2lnbmVkIGludCBsYXJnZV9tc3MsIGZhY3RvciwgbGltaXQ7Ci0KLQkJbGFyZ2VfbXNzID0gNjU1MzUgLSB0cC0+YWZfc3BlY2lmaWMtPm5ldF9oZWFkZXJfbGVuIC0KLQkJCXRwLT5leHRfaGVhZGVyX2xlbiAtIHRwLT50Y3BfaGVhZGVyX2xlbjsKLQotCQlpZiAodHAtPm1heF93aW5kb3cgJiYgbGFyZ2VfbXNzID4gKHRwLT5tYXhfd2luZG93Pj4xKSkKLQkJCWxhcmdlX21zcyA9IG1heCgodHAtPm1heF93aW5kb3c+PjEpLAotCQkJCQk2OFUgLSB0cC0+dGNwX2hlYWRlcl9sZW4pOwotCi0JCWZhY3RvciA9IGxhcmdlX21zcyAvIG1zc19ub3c7Ci0KLQkJLyogQWx3YXlzIGtlZXAgbGFyZ2UgbXNzIG11bHRpcGxlIG9mIHJlYWwgbXNzLCBidXQKLQkJICogZG8gbm90IGV4Y2VlZCAxL3Rzb193aW5fZGl2aXNvciBvZiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cKLQkJICogc28gd2UgY2FuIGtlZXAgdGhlIEFDSyBjbG9jayB0aWNraW5nIGFuZCBtaW5pbWl6ZQotCQkgKiBidXJzdGluZy4KLQkJICovCi0JCWxpbWl0ID0gdHAtPnNuZF9jd25kOwotCQlpZiAoc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IpCi0JCQlsaW1pdCAvPSBzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvcjsKLQkJbGltaXQgPSBtYXgoMVUsIGxpbWl0KTsKLQkJaWYgKGZhY3RvciA+IGxpbWl0KQotCQkJZmFjdG9yID0gbGltaXQ7Ci0KLQkJdHAtPm1zc19jYWNoZSA9IG1zc19ub3cgKiBmYWN0b3I7Ci0KLQkJbXNzX25vdyA9IHRwLT5tc3NfY2FjaGU7Ci0JfQotCiAJaWYgKHRwLT5yeF9vcHQuZWZmX3NhY2tzKQogCQltc3Nfbm93IC09IChUQ1BPTEVOX1NBQ0tfQkFTRV9BTElHTkVEICsKIAkJCSAgICAodHAtPnJ4X29wdC5lZmZfc2Fja3MgKiBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spKTsKKworCXhtaXRfc2l6ZV9nb2FsID0gbXNzX25vdzsKKworCWlmIChkb2luZ190c28pIHsKKwkJeG1pdF9zaXplX2dvYWwgPSA2NTUzNSAtCisJCQl0cC0+YWZfc3BlY2lmaWMtPm5ldF9oZWFkZXJfbGVuIC0KKwkJCXRwLT5leHRfaGVhZGVyX2xlbiAtIHRwLT50Y3BfaGVhZGVyX2xlbjsKKworCQlpZiAodHAtPm1heF93aW5kb3cgJiYKKwkJICAgICh4bWl0X3NpemVfZ29hbCA+ICh0cC0+bWF4X3dpbmRvdyA+PiAxKSkpCisJCQl4bWl0X3NpemVfZ29hbCA9IG1heCgodHAtPm1heF93aW5kb3cgPj4gMSksCisJCQkJCSAgICAgNjhVIC0gdHAtPnRjcF9oZWFkZXJfbGVuKTsKKworCQl4bWl0X3NpemVfZ29hbCAtPSAoeG1pdF9zaXplX2dvYWwgJSBtc3Nfbm93KTsKKwl9CisJdHAtPnhtaXRfc2l6ZV9nb2FsID0geG1pdF9zaXplX2dvYWw7CisKIAlyZXR1cm4gbXNzX25vdzsKIH0KIAorLyogQ29uZ2VzdGlvbiB3aW5kb3cgdmFsaWRhdGlvbi4gKFJGQzI4NjEpICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfY3duZF92YWxpZGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJX191MzIgcGFja2V0c19vdXQgPSB0cC0+cGFja2V0c19vdXQ7CisKKwlpZiAocGFja2V0c19vdXQgPj0gdHAtPnNuZF9jd25kKSB7CisJCS8qIE5ldHdvcmsgaXMgZmVlZCBmdWxseS4gKi8KKwkJdHAtPnNuZF9jd25kX3VzZWQgPSAwOworCQl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKwl9IGVsc2UgeworCQkvKiBOZXR3b3JrIHN0YXJ2ZXMuICovCisJCWlmICh0cC0+cGFja2V0c19vdXQgPiB0cC0+c25kX2N3bmRfdXNlZCkKKwkJCXRwLT5zbmRfY3duZF91c2VkID0gdHAtPnBhY2tldHNfb3V0OworCisJCWlmICgoczMyKSh0Y3BfdGltZV9zdGFtcCAtIHRwLT5zbmRfY3duZF9zdGFtcCkgPj0gdHAtPnJ0bykKKwkJCXRjcF9jd25kX2FwcGxpY2F0aW9uX2xpbWl0ZWQoc2spOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0Y3Bfd2luZG93X2FsbG93cyhzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbXNzX25vdywgdW5zaWduZWQgaW50IGN3bmQpCit7CisJdTMyIHdpbmRvdywgY3duZF9sZW47CisKKwl3aW5kb3cgPSAodHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxKTsKKwljd25kX2xlbiA9IG1zc19ub3cgKiBjd25kOworCXJldHVybiBtaW4od2luZG93LCBjd25kX2xlbik7Cit9CisKKy8qIENhbiBhdCBsZWFzdCBvbmUgc2VnbWVudCBvZiBTS0IgYmUgc2VudCByaWdodCBub3csIGFjY29yZGluZyB0byB0aGUKKyAqIGNvbmdlc3Rpb24gd2luZG93IHJ1bGVzPyAgSWYgc28sIHJldHVybiBob3cgbWFueSBzZWdtZW50cyBhcmUgYWxsb3dlZC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGNwX2N3bmRfdGVzdChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUzMiBpbl9mbGlnaHQsIGN3bmQ7CisKKwkvKiBEb24ndCBiZSBzdHJpY3QgYWJvdXQgdGhlIGNvbmdlc3Rpb24gd2luZG93IGZvciB0aGUgZmluYWwgRklOLiAgKi8KKwlpZiAoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfRklOKQorCQlyZXR1cm4gMTsKKworCWluX2ZsaWdodCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CisJY3duZCA9IHRwLT5zbmRfY3duZDsKKwlpZiAoaW5fZmxpZ2h0IDwgY3duZCkKKwkJcmV0dXJuIChjd25kIC0gaW5fZmxpZ2h0KTsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIG11c3QgYmUgaW52b2tlZCB0aGUgZmlyc3QgdGltZSB3ZSBjb25zaWRlciB0cmFuc21pdHRpbmcKKyAqIFNLQiBvbnRvIHRoZSB3aXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCB0Y3BfaW5pdF90c29fc2VncyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHRzb19zZWdzID0gdGNwX3NrYl9wY291bnQoc2tiKTsKKworCWlmICghdHNvX3NlZ3MpIHsKKwkJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2ssIHNrYik7CisJCXRzb19zZWdzID0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwl9CisJcmV0dXJuIHRzb19zZWdzOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y3BfbWluc2hhbGxfY2hlY2soY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlyZXR1cm4gYWZ0ZXIodHAtPnNuZF9zbWwsdHAtPnNuZF91bmEpICYmCisJCSFhZnRlcih0cC0+c25kX3NtbCwgdHAtPnNuZF9ueHQpOworfQorCisvKiBSZXR1cm4gMCwgaWYgcGFja2V0IGNhbiBiZSBzZW50IG5vdyB3aXRob3V0IHZpb2xhdGlvbiBOYWdsZSdzIHJ1bGVzOgorICogMS4gSXQgaXMgZnVsbCBzaXplZC4KKyAqIDIuIE9yIGl0IGNvbnRhaW5zIEZJTi4gKGFscmVhZHkgY2hlY2tlZCBieSBjYWxsZXIpCisgKiAzLiBPciBUQ1BfTk9ERUxBWSB3YXMgc2V0LgorICogNC4gT3IgVENQX0NPUksgaXMgbm90IHNldCwgYW5kIGFsbCBzZW50IHBhY2tldHMgYXJlIEFDS2VkLgorICogICAgV2l0aCBNaW5zaGFsbCdzIG1vZGlmaWNhdGlvbjogYWxsIHNlbnQgc21hbGwgcGFja2V0cyBhcmUgQUNLZWQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdGNwX25hZ2xlX2NoZWNrKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgIHVuc2lnbmVkIG1zc19ub3csIGludCBub25hZ2xlKQoreworCXJldHVybiAoc2tiLT5sZW4gPCBtc3Nfbm93ICYmCisJCSgobm9uYWdsZSZUQ1BfTkFHTEVfQ09SSykgfHwKKwkJICghbm9uYWdsZSAmJgorCQkgIHRwLT5wYWNrZXRzX291dCAmJgorCQkgIHRjcF9taW5zaGFsbF9jaGVjayh0cCkpKSk7Cit9CisKKy8qIFJldHVybiBub24temVybyBpZiB0aGUgTmFnbGUgdGVzdCBhbGxvd3MgdGhpcyBwYWNrZXQgdG8gYmUKKyAqIHNlbnQgbm93LgorICovCitzdGF0aWMgaW5saW5lIGludCB0Y3BfbmFnbGVfdGVzdChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSB1bnNpZ25lZCBpbnQgY3VyX21zcywgaW50IG5vbmFnbGUpCit7CisJLyogTmFnbGUgcnVsZSBkb2VzIG5vdCBhcHBseSB0byBmcmFtZXMsIHdoaWNoIHNpdCBpbiB0aGUgbWlkZGxlIG9mIHRoZQorCSAqIHdyaXRlX3F1ZXVlICh0aGV5IGhhdmUgbm8gY2hhbmNlcyB0byBnZXQgbmV3IGRhdGEpLgorCSAqCisJICogVGhpcyBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgY2FsbGVycywgd2hlcmUgdGhleSBtb2RpZnkgdGhlICdub25hZ2xlJworCSAqIGFyZ3VtZW50IGJhc2VkIHVwb24gdGhlIGxvY2F0aW9uIG9mIFNLQiBpbiB0aGUgc2VuZCBxdWV1ZS4KKwkgKi8KKwlpZiAobm9uYWdsZSAmIFRDUF9OQUdMRV9QVVNIKQorCQlyZXR1cm4gMTsKKworCS8qIERvbid0IHVzZSB0aGUgbmFnbGUgcnVsZSBmb3IgdXJnZW50IGRhdGEgKG9yIGZvciB0aGUgZmluYWwgRklOKS4gICovCisJaWYgKHRwLT51cmdfbW9kZSB8fAorCSAgICAoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfRklOKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXRjcF9uYWdsZV9jaGVjayh0cCwgc2tiLCBjdXJfbXNzLCBub25hZ2xlKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogRG9lcyBhdCBsZWFzdCB0aGUgZmlyc3Qgc2VnbWVudCBvZiBTS0IgZml0IGludG8gdGhlIHNlbmQgd2luZG93PyAqLworc3RhdGljIGlubGluZSBpbnQgdGNwX3NuZF93bmRfdGVzdChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgY3VyX21zcykKK3sKKwl1MzIgZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKworCWlmIChza2ItPmxlbiA+IGN1cl9tc3MpCisJCWVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcSArIGN1cl9tc3M7CisKKwlyZXR1cm4gIWFmdGVyKGVuZF9zZXEsIHRwLT5zbmRfdW5hICsgdHAtPnNuZF93bmQpOworfQorCisvKiBUaGlzIGNoZWNrcyBpZiB0aGUgZGF0YSBiZWFyaW5nIHBhY2tldCBTS0IgKHVzdWFsbHkgc2stPnNrX3NlbmRfaGVhZCkKKyAqIHNob3VsZCBiZSBwdXQgb24gdGhlIHdpcmUgcmlnaHQgbm93LiAgSWYgc28sIGl0IHJldHVybnMgdGhlIG51bWJlciBvZgorICogcGFja2V0cyBhbGxvd2VkIGJ5IHRoZSBjb25nZXN0aW9uIHdpbmRvdy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB0Y3Bfc25kX3Rlc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSB1bnNpZ25lZCBpbnQgY3VyX21zcywgaW50IG5vbmFnbGUpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJdW5zaWduZWQgaW50IGN3bmRfcXVvdGE7CisKKwl0Y3BfaW5pdF90c29fc2Vncyhzaywgc2tiKTsKKworCWlmICghdGNwX25hZ2xlX3Rlc3QodHAsIHNrYiwgY3VyX21zcywgbm9uYWdsZSkpCisJCXJldHVybiAwOworCisJY3duZF9xdW90YSA9IHRjcF9jd25kX3Rlc3QodHAsIHNrYik7CisJaWYgKGN3bmRfcXVvdGEgJiYKKwkgICAgIXRjcF9zbmRfd25kX3Rlc3QodHAsIHNrYiwgY3VyX21zcykpCisJCWN3bmRfcXVvdGEgPSAwOworCisJcmV0dXJuIGN3bmRfcXVvdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9za2JfaXNfbGFzdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIAorCQkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5uZXh0ID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSZzay0+c2tfd3JpdGVfcXVldWU7Cit9CisKK2ludCB0Y3BfbWF5X3NlbmRfbm93KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKKworCXJldHVybiAoc2tiICYmCisJCXRjcF9zbmRfdGVzdChzaywgc2tiLCB0Y3BfY3VycmVudF9tc3Moc2ssIDEpLAorCQkJICAgICAodGNwX3NrYl9pc19sYXN0KHNrLCBza2IpID8KKwkJCSAgICAgIFRDUF9OQUdMRV9QVVNIIDoKKwkJCSAgICAgIHRwLT5ub25hZ2xlKSkpOworfQorCisvKiBUcmltIFRTTyBTS0IgdG8gTEVOIGJ5dGVzLCBwdXQgdGhlIHJlbWFpbmluZyBkYXRhIGludG8gYSBuZXcgcGFja2V0CisgKiB3aGljaCBpcyBwdXQgYWZ0ZXIgU0tCIG9uIHRoZSBsaXN0LiAgSXQgaXMgdmVyeSBtdWNoIGxpa2UKKyAqIHRjcF9mcmFnbWVudCgpIGV4Y2VwdCB0aGF0IGl0IG1heSBtYWtlIHNldmVyYWwga2luZHMgb2YgYXNzdW1wdGlvbnMKKyAqIGluIG9yZGVyIHRvIHNwZWVkIHVwIHRoZSBzcGxpdHRpbmcgb3BlcmF0aW9uLiAgSW4gcGFydGljdWxhciwgd2UKKyAqIGtub3cgdGhhdCBhbGwgdGhlIGRhdGEgaXMgaW4gc2NhdHRlci1nYXRoZXIgcGFnZXMsIGFuZCB0aGF0IHRoZQorICogcGFja2V0IGhhcyBuZXZlciBiZWVuIHNlbnQgb3V0IGJlZm9yZSAoYW5kIHRodXMgaXMgbm90IGNsb25lZCkuCisgKi8KK3N0YXRpYyBpbnQgdHNvX2ZyYWdtZW50KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmZjsKKwlpbnQgbmxlbiA9IHNrYi0+bGVuIC0gbGVuOworCXUxNiBmbGFnczsKKworCS8qIEFsbCBvZiBhIFRTTyBmcmFtZSBtdXN0IGJlIGNvbXBvc2VkIG9mIHBhZ2VkIGRhdGEuICAqLworCUJVR19PTihza2ItPmxlbiAhPSBza2ItPmRhdGFfbGVuKTsKKworCWJ1ZmYgPSBza19zdHJlYW1fYWxsb2NfcHNrYihzaywgMCwgMCwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KGJ1ZmYgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJYnVmZi0+dHJ1ZXNpemUgPSBubGVuOworCXNrYi0+dHJ1ZXNpemUgLT0gbmxlbjsKKworCS8qIENvcnJlY3QgdGhlIHNlcXVlbmNlIG51bWJlcnMuICovCisJVENQX1NLQl9DQihidWZmKS0+c2VxID0gVENQX1NLQl9DQihza2IpLT5zZXEgKyBsZW47CisJVENQX1NLQl9DQihidWZmKS0+ZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgPSBUQ1BfU0tCX0NCKGJ1ZmYpLT5zZXE7CisKKwkvKiBQU0ggYW5kIEZJTiBzaG91bGQgb25seSBiZSBzZXQgaW4gdGhlIHNlY29uZCBwYWNrZXQuICovCisJZmxhZ3MgPSBUQ1BfU0tCX0NCKHNrYiktPmZsYWdzOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBmbGFncyAmIH4oVENQQ0JfRkxBR19GSU58VENQQ0JfRkxBR19QU0gpOworCVRDUF9TS0JfQ0IoYnVmZiktPmZsYWdzID0gZmxhZ3M7CisKKwkvKiBUaGlzIHBhY2tldCB3YXMgbmV2ZXIgc2VudCBvdXQgeWV0LCBzbyBubyBTQUNLIGJpdHMuICovCisJVENQX1NLQl9DQihidWZmKS0+c2Fja2VkID0gMDsKKworCWJ1ZmYtPmlwX3N1bW1lZCA9IHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisJc2tiX3NwbGl0KHNrYiwgYnVmZiwgbGVuKTsKKworCS8qIEZpeCB1cCB0c29fZmFjdG9yIGZvciBib3RoIG9yaWdpbmFsIGFuZCBuZXcgU0tCLiAgKi8KKwl0Y3Bfc2V0X3NrYl90c29fc2Vncyhzaywgc2tiKTsKKwl0Y3Bfc2V0X3NrYl90c29fc2VncyhzaywgYnVmZik7CisKKwkvKiBMaW5rIEJVRkYgaW50byB0aGUgc2VuZCBxdWV1ZS4gKi8KKwlza2JfaGVhZGVyX3JlbGVhc2UoYnVmZik7CisJX19za2JfYXBwZW5kKHNrYiwgYnVmZik7CisKKwlyZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIGRlZmVyIHNlbmRpbmcsIGlmIHBvc3NpYmxlLCBpbiBvcmRlciB0byBtaW5pbWl6ZSB0aGUgYW1vdW50CisgKiBvZiBUU08gc3BsaXR0aW5nIHdlIGRvLiAgVmlldyBpdCBhcyBhIGtpbmQgb2YgVFNPIE5hZ2xlIHRlc3QuCisgKgorICogVGhpcyBhbGdvcml0aG0gaXMgZnJvbSBKb2huIEhlZmZuZXIuCisgKi8KK3N0YXRpYyBpbnQgdGNwX3Rzb19zaG91bGRfZGVmZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUzMiBzZW5kX3dpbiwgY29uZ193aW4sIGxpbWl0LCBpbl9mbGlnaHQ7CisKKwlpZiAoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfRklOKQorCQlyZXR1cm4gMDsKKworCWlmICh0cC0+Y2Ffc3RhdGUgIT0gVENQX0NBX09wZW4pCisJCXJldHVybiAwOworCisJaW5fZmxpZ2h0ID0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKTsKKworCUJVR19PTih0Y3Bfc2tiX3Bjb3VudChza2IpIDw9IDEgfHwKKwkgICAgICAgKHRwLT5zbmRfY3duZCA8PSBpbl9mbGlnaHQpKTsKKworCXNlbmRfd2luID0gKHRwLT5zbmRfdW5hICsgdHAtPnNuZF93bmQpIC0gVENQX1NLQl9DQihza2IpLT5zZXE7CisKKwkvKiBGcm9tIGluX2ZsaWdodCB0ZXN0IGFib3ZlLCB3ZSBrbm93IHRoYXQgY3duZCA+IGluX2ZsaWdodC4gICovCisJY29uZ193aW4gPSAodHAtPnNuZF9jd25kIC0gaW5fZmxpZ2h0KSAqIHRwLT5tc3NfY2FjaGU7CisKKwlsaW1pdCA9IG1pbihzZW5kX3dpbiwgY29uZ193aW4pOworCisJLyogSWYgc2tfc2VuZF9oZWFkIGNhbiBiZSBzZW50IGZ1bGx5IG5vdywganVzdCBkbyBpdC4gICovCisJaWYgKHNrYi0+bGVuIDw9IGxpbWl0KQorCQlyZXR1cm4gMDsKKworCWlmIChzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvcikgeworCQl1MzIgY2h1bmsgPSBtaW4odHAtPnNuZF93bmQsIHRwLT5zbmRfY3duZCAqIHRwLT5tc3NfY2FjaGUpOworCisJCS8qIElmIGF0IGxlYXN0IHNvbWUgZnJhY3Rpb24gb2YgYSB3aW5kb3cgaXMgYXZhaWxhYmxlLAorCQkgKiBqdXN0IHVzZSBpdC4KKwkJICovCisJCWNodW5rIC89IHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yOworCQlpZiAobGltaXQgPj0gY2h1bmspCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBEaWZmZXJlbnQgYXBwcm9hY2gsIHRyeSBub3QgdG8gZGVmZXIgcGFzdCBhIHNpbmdsZQorCQkgKiBBQ0suICBSZWNlaXZlciBzaG91bGQgQUNLIGV2ZXJ5IG90aGVyIGZ1bGwgc2l6ZWQKKwkJICogZnJhbWUsIHNvIGlmIHdlIGhhdmUgc3BhY2UgZm9yIG1vcmUgdGhhbiAzIGZyYW1lcworCQkgKiB0aGVuIHNlbmQgbm93LgorCQkgKi8KKwkJaWYgKGxpbWl0ID4gdGNwX21heF9idXJzdCh0cCkgKiB0cC0+bXNzX2NhY2hlKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogT2ssIGl0IGxvb2tzIGxpa2UgaXQgaXMgYWR2aXNhYmxlIHRvIGRlZmVyLiAgKi8KKwlyZXR1cm4gMTsKK30KKwogLyogVGhpcyByb3V0aW5lIHdyaXRlcyBwYWNrZXRzIHRvIHRoZSBuZXR3b3JrLiAgSXQgYWR2YW5jZXMgdGhlCiAgKiBzZW5kX2hlYWQuICBUaGlzIGhhcHBlbnMgYXMgaW5jb21pbmcgYWNrcyBvcGVuIHVwIHRoZSByZW1vdGUKICAqIHdpbmRvdyBmb3IgdXMuCkBAIC03MjksNTcgKzk1OCwxNTggQEAKICAqIFJldHVybnMgMSwgaWYgbm8gc2VnbWVudHMgYXJlIGluIGZsaWdodCBhbmQgd2UgaGF2ZSBxdWV1ZWQgc2VnbWVudHMsIGJ1dAogICogY2Fubm90IHNlbmQgYW55dGhpbmcgbm93IGJlY2F1c2Ugb2YgU1dTIG9yIGFub3RoZXIgcHJvYmxlbS4KICAqLwotaW50IHRjcF93cml0ZV94bWl0KHN0cnVjdCBzb2NrICpzaywgaW50IG5vbmFnbGUpCitzdGF0aWMgaW50IHRjcF93cml0ZV94bWl0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3csIGludCBub25hZ2xlKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXVuc2lnbmVkIGludCBtc3Nfbm93OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IHRzb19zZWdzLCBzZW50X3BrdHM7CisJaW50IGN3bmRfcXVvdGE7CiAKIAkvKiBJZiB3ZSBhcmUgY2xvc2VkLCB0aGUgYnl0ZXMgd2lsbCBoYXZlIHRvIHJlbWFpbiBoZXJlLgogCSAqIEluIHRpbWUgY2xvc2Vkb3duIHdpbGwgZmluaXNoLCB3ZSBlbXB0eSB0aGUgd3JpdGUgcXVldWUgYW5kIGFsbAogCSAqIHdpbGwgYmUgaGFwcHkuCiAJICovCi0JaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJaW50IHNlbnRfcGt0cyA9IDA7CisJaWYgKHVubGlrZWx5KHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpKQorCQlyZXR1cm4gMDsKIAotCQkvKiBBY2NvdW50IGZvciBTQUNLUywgd2UgbWF5IG5lZWQgdG8gZnJhZ21lbnQgZHVlIHRvIHRoaXMuCi0JCSAqIEl0IGlzIGp1c3QgbGlrZSB0aGUgcmVhbCBNU1MgY2hhbmdpbmcgb24gdXMgbWlkc3RyZWFtLgotCQkgKiBXZSBhbHNvIGhhbmRsZSB0aGluZ3MgY29ycmVjdGx5IHdoZW4gdGhlIHVzZXIgYWRkcyBzb21lCi0JCSAqIElQIG9wdGlvbnMgbWlkLXN0cmVhbS4gIFNpbGx5IHRvIGRvLCBidXQgY292ZXIgaXQuCi0JCSAqLwotCQltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAxKTsKKwlza2IgPSBzay0+c2tfc2VuZF9oZWFkOworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIDA7CiAKLQkJd2hpbGUgKChza2IgPSBzay0+c2tfc2VuZF9oZWFkKSAmJgotCQkgICAgICAgdGNwX3NuZF90ZXN0KHNrLCBza2IsIG1zc19ub3csCi0JCQkgICAgICAgCSAgICB0Y3Bfc2tiX2lzX2xhc3Qoc2ssIHNrYikgPyBub25hZ2xlIDoKLQkJCQkgICAgCQkJICAgICAgIFRDUF9OQUdMRV9QVVNIKSkgewotCQkJaWYgKHNrYi0+bGVuID4gbXNzX25vdykgewotCQkJCWlmICh0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgbXNzX25vdykpCisJdHNvX3NlZ3MgPSB0Y3BfaW5pdF90c29fc2Vncyhzaywgc2tiKTsKKwljd25kX3F1b3RhID0gdGNwX2N3bmRfdGVzdCh0cCwgc2tiKTsKKwlpZiAodW5saWtlbHkoIWN3bmRfcXVvdGEpKQorCQlnb3RvIG91dDsKKworCXNlbnRfcGt0cyA9IDA7CisJd2hpbGUgKGxpa2VseSh0Y3Bfc25kX3duZF90ZXN0KHRwLCBza2IsIG1zc19ub3cpKSkgeworCQlCVUdfT04oIXRzb19zZWdzKTsKKworCQlpZiAodHNvX3NlZ3MgPT0gMSkgeworCQkJaWYgKHVubGlrZWx5KCF0Y3BfbmFnbGVfdGVzdCh0cCwgc2tiLCBtc3Nfbm93LAorCQkJCQkJICAgICAodGNwX3NrYl9pc19sYXN0KHNrLCBza2IpID8KKwkJCQkJCSAgICAgIG5vbmFnbGUgOiBUQ1BfTkFHTEVfUFVTSCkpKSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmICh0Y3BfdHNvX3Nob3VsZF9kZWZlcihzaywgdHAsIHNrYikpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAodHNvX3NlZ3MgPiAxKSB7CisJCQl1MzIgbGltaXQgPSB0Y3Bfd2luZG93X2FsbG93cyh0cCwgc2tiLAorCQkJCQkJICAgICAgbXNzX25vdywgY3duZF9xdW90YSk7CisKKwkJCWlmIChza2ItPmxlbiA8IGxpbWl0KSB7CisJCQkJdW5zaWduZWQgaW50IHRyaW0gPSBza2ItPmxlbiAlIG1zc19ub3c7CisKKwkJCQlpZiAodHJpbSkKKwkJCQkJbGltaXQgPSBza2ItPmxlbiAtIHRyaW07CisJCQl9CisJCQlpZiAoc2tiLT5sZW4gPiBsaW1pdCkgeworCQkJCWlmICh0c29fZnJhZ21lbnQoc2ssIHNrYiwgbGltaXQpKQogCQkJCQlicmVhazsKIAkJCX0KLQotCQkJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7Ci0JCQl0Y3BfdHNvX3NldF9wdXNoKHNrYik7Ci0JCQlpZiAodGNwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpKQorCQl9IGVsc2UgaWYgKHVubGlrZWx5KHNrYi0+bGVuID4gbXNzX25vdykpIHsKKwkJCWlmICh1bmxpa2VseSh0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgIG1zc19ub3cpKSkKIAkJCQlicmVhazsKLQotCQkJLyogQWR2YW5jZSB0aGUgc2VuZF9oZWFkLiAgVGhpcyBvbmUgaXMgc2VudCBvdXQuCi0JCQkgKiBUaGlzIGNhbGwgd2lsbCBpbmNyZW1lbnQgcGFja2V0c19vdXQuCi0JCQkgKi8KLQkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHRwLCBza2IpOwotCi0JCQl0Y3BfbWluc2hhbGxfdXBkYXRlKHRwLCBtc3Nfbm93LCBza2IpOwotCQkJc2VudF9wa3RzID0gMTsKIAkJfQogCi0JCWlmIChzZW50X3BrdHMpIHsKLQkJCXRjcF9jd25kX3ZhbGlkYXRlKHNrLCB0cCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQorCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKIAotCQlyZXR1cm4gIXRwLT5wYWNrZXRzX291dCAmJiBzay0+c2tfc2VuZF9oZWFkOworCQlpZiAodW5saWtlbHkodGNwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpKSkKKwkJCWJyZWFrOworCisJCS8qIEFkdmFuY2UgdGhlIHNlbmRfaGVhZC4gIFRoaXMgb25lIGlzIHNlbnQgb3V0LgorCQkgKiBUaGlzIGNhbGwgd2lsbCBpbmNyZW1lbnQgcGFja2V0c19vdXQuCisJCSAqLworCQl1cGRhdGVfc2VuZF9oZWFkKHNrLCB0cCwgc2tiKTsKKworCQl0Y3BfbWluc2hhbGxfdXBkYXRlKHRwLCBtc3Nfbm93LCBza2IpOworCQlzZW50X3BrdHMrKzsKKworCQkvKiBEbyBub3Qgb3B0aW1pemUgdGhpcyB0byB1c2UgdHNvX3NlZ3MuIElmIHdlIGNob3BwZWQgdXAKKwkJICogdGhlIHBhY2tldCBhYm92ZSwgdHNvX3NlZ3Mgd2lsbCBubyBsb25nZXIgYmUgdmFsaWQuCisJCSAqLworCQljd25kX3F1b3RhIC09IHRjcF9za2JfcGNvdW50KHNrYik7CisKKwkJQlVHX09OKGN3bmRfcXVvdGEgPCAwKTsKKwkJaWYgKCFjd25kX3F1b3RhKQorCQkJYnJlYWs7CisKKwkJc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKwkJdHNvX3NlZ3MgPSB0Y3BfaW5pdF90c29fc2Vncyhzaywgc2tiKTsKIAl9Ci0JcmV0dXJuIDA7CisKKwlpZiAobGlrZWx5KHNlbnRfcGt0cykpIHsKKwkJdGNwX2N3bmRfdmFsaWRhdGUoc2ssIHRwKTsKKwkJcmV0dXJuIDA7CisJfQorb3V0OgorCXJldHVybiAhdHAtPnBhY2tldHNfb3V0ICYmIHNrLT5za19zZW5kX2hlYWQ7Cit9CisKKy8qIFB1c2ggb3V0IGFueSBwZW5kaW5nIGZyYW1lcyB3aGljaCB3ZXJlIGhlbGQgYmFjayBkdWUgdG8KKyAqIFRDUF9DT1JLIG9yIGF0dGVtcHQgYXQgY29hbGVzY2luZyB0aW55IHBhY2tldHMuCisgKiBUaGUgc29ja2V0IG11c3QgYmUgbG9ja2VkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3ZvaWQgX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGN1cl9tc3MsIGludCBub25hZ2xlKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfc2VuZF9oZWFkOworCisJaWYgKHNrYikgeworCQlpZiAodGNwX3dyaXRlX3htaXQoc2ssIGN1cl9tc3MsIG5vbmFnbGUpKQorCQkJdGNwX2NoZWNrX3Byb2JlX3RpbWVyKHNrLCB0cCk7CisJfQorfQorCisvKiBTZW5kIF9zaW5nbGVfIHNrYiBzaXR0aW5nIGF0IHRoZSBzZW5kIGhlYWQuIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMKKyAqIHRydWUgcHVzaCBwZW5kaW5nIGZyYW1lcyB0byBzZXR1cCBwcm9iZSB0aW1lciBldGMuCisgKi8KK3ZvaWQgdGNwX3B1c2hfb25lKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3cpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisJdW5zaWduZWQgaW50IHRzb19zZWdzLCBjd25kX3F1b3RhOworCisJQlVHX09OKCFza2IgfHwgc2tiLT5sZW4gPCBtc3Nfbm93KTsKKworCXRzb19zZWdzID0gdGNwX2luaXRfdHNvX3NlZ3Moc2ssIHNrYik7CisJY3duZF9xdW90YSA9IHRjcF9zbmRfdGVzdChzaywgc2tiLCBtc3Nfbm93LCBUQ1BfTkFHTEVfUFVTSCk7CisKKwlpZiAobGlrZWx5KGN3bmRfcXVvdGEpKSB7CisJCUJVR19PTighdHNvX3NlZ3MpOworCisJCWlmICh0c29fc2VncyA+IDEpIHsKKwkJCXUzMiBsaW1pdCA9IHRjcF93aW5kb3dfYWxsb3dzKHRwLCBza2IsCisJCQkJCQkgICAgICBtc3Nfbm93LCBjd25kX3F1b3RhKTsKKworCQkJaWYgKHNrYi0+bGVuIDwgbGltaXQpIHsKKwkJCQl1bnNpZ25lZCBpbnQgdHJpbSA9IHNrYi0+bGVuICUgbXNzX25vdzsKKworCQkJCWlmICh0cmltKQorCQkJCQlsaW1pdCA9IHNrYi0+bGVuIC0gdHJpbTsKKwkJCX0KKwkJCWlmIChza2ItPmxlbiA+IGxpbWl0KSB7CisJCQkJaWYgKHVubGlrZWx5KHRzb19mcmFnbWVudChzaywgc2tiLCBsaW1pdCkpKQorCQkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSBpZiAodW5saWtlbHkoc2tiLT5sZW4gPiBtc3Nfbm93KSkgeworCQkJaWYgKHVubGlrZWx5KHRjcF9mcmFnbWVudChzaywgc2tiLCBtc3Nfbm93KSkpCisJCQkJcmV0dXJuOworCQl9CisKKwkJLyogU2VuZCBpdCBvdXQgbm93LiAqLworCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKKworCQlpZiAobGlrZWx5KCF0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2JfY2xvbmUoc2tiLCBzay0+c2tfYWxsb2NhdGlvbikpKSkgeworCQkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIHNrYik7CisJCQl0Y3BfY3duZF92YWxpZGF0ZShzaywgdHApOworCQkJcmV0dXJuOworCQl9CisJfQogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFtb3VudCB0aGF0IHdlIGNhbiByYWlzZSB0aGUKQEAgLTEwMzksNyArMTM2OSw2IEBACiAJCWlmIChzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfVFNPKSB7CiAJCQlzay0+c2tfcm91dGVfY2FwcyAmPSB+TkVUSUZfRl9UU087CiAJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX05PX0xBUkdFU0VORCk7Ci0JCQl0cC0+bXNzX2NhY2hlID0gdHAtPm1zc19jYWNoZV9zdGQ7CiAJCX0KIAogCQlpZiAodGNwX3RyaW1faGVhZChzaywgc2tiLCB0cC0+c25kX3VuYSAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxKSkKQEAgLTExMDEsNyArMTQzMCw2IEBACiAJICogaXMgc3RpbGwgaW4gc29tZWJvZHkncyBoYW5kcywgZWxzZSBtYWtlIGEgY2xvbmUuCiAJICovCiAJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7Ci0JdGNwX3Rzb19zZXRfcHVzaChza2IpOwogCiAJZXJyID0gdGNwX3RyYW5zbWl0X3NrYihzaywgKHNrYl9jbG9uZWQoc2tiKSA/CiAJCQkJICAgIHBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOgpAQCAtMTI4NSw3ICsxNjEzLDcgQEAKICAqIHdhcyB1bnJlYWQgZGF0YSBpbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gIFRoaXMgYmVoYXZpb3IgaXMgcmVjb21tZW5kZWQKICAqIGJ5IGRyYWZ0LWlldGYtdGNwaW1wbC1wcm9iLTAzLnR4dCBzZWN0aW9uIDMuMTAuICAtRGF2ZU0KICAqLwotdm9pZCB0Y3Bfc2VuZF9hY3RpdmVfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBpbnQgcHJpb3JpdHkpCit2b2lkIHRjcF9zZW5kX2FjdGl2ZV9yZXNldChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTY3MCwxNCArMTk5OCwxMiBAQAogCQkJCWlmIChzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfVFNPKSB7CiAJCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfTk9fTEFSR0VTRU5EKTsKIAkJCQkJc2stPnNrX3JvdXRlX2NhcHMgJj0gfk5FVElGX0ZfVFNPOwotCQkJCQl0cC0+bXNzX2NhY2hlID0gdHAtPm1zc19jYWNoZV9zdGQ7CiAJCQkJfQogCQkJfSBlbHNlIGlmICghdGNwX3NrYl9wY291bnQoc2tiKSkKIAkJCQl0Y3Bfc2V0X3NrYl90c29fc2Vncyhzaywgc2tiKTsKIAogCQkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX1BTSDsKIAkJCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwotCQkJdGNwX3Rzb19zZXRfcHVzaChza2IpOwogCQkJZXJyID0gdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpOwogCQkJaWYgKCFlcnIpIHsKIAkJCQl1cGRhdGVfc2VuZF9oZWFkKHNrLCB0cCwgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF90aW1lci5jIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKaW5kZXggYjEyN2I0NC4uMDA4NDIyNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMKKysrIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKQEAgLTIzMSwxMSArMjMxLDEwIEBACiAJfQogCXRwLT5hY2sucGVuZGluZyAmPSB+VENQX0FDS19USU1FUjsKIAotCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnRwLT51Y29weS5wcmVxdWV1ZSkpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCQlORVRfQUREX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BTQ0hFRFVMRVJGQUlMRUQsIAotCQkJCSBza2JfcXVldWVfbGVuKCZ0cC0+dWNvcHkucHJlcXVldWUpKTsKKwkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQU0NIRURVTEVSRkFJTEVEKTsKIAogCQl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnRwLT51Y29weS5wcmVxdWV1ZSkpICE9IE5VTEwpCiAJCQlzay0+c2tfYmFja2xvZ19yY3Yoc2ssIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9LY29uZmlnIGIvbmV0L2lwdjYvS2NvbmZpZwppbmRleCBlNjZjYTkzLi45NTE2M2NkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9LY29uZmlnCisrKyBiL25ldC9pcHY2L0tjb25maWcKQEAgLTEsNiArMSwyNiBAQAogIwogIyBJUHY2IGNvbmZpZ3VyYXRpb24KLSMgCisjCisKKyMgICBJUHY2IGFzIG1vZHVsZSB3aWxsIGNhdXNlIGEgQ1JBU0ggaWYgeW91IHRyeSB0byB1bmxvYWQgaXQKK2NvbmZpZyBJUFY2CisJdHJpc3RhdGUgIlRoZSBJUHY2IHByb3RvY29sIgorCWRlZmF1bHQgbQorCXNlbGVjdCBDUllQVE8gaWYgSVBWNl9QUklWQUNZCisJc2VsZWN0IENSWVBUT19NRDUgaWYgSVBWNl9QUklWQUNZCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBjb21wbGVtZW50YWwgc3VwcG9ydCBmb3IgdGhlIElQIHZlcnNpb24gNi4KKwkgIFlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gZG8gdHJhZGl0aW9uYWwgSVB2NCBuZXR3b3JraW5nIGFzIHdlbGwuCisKKwkgIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IElQdjYsIHNlZQorCSAgPGh0dHA6Ly9wbGF5Z3JvdW5kLnN1bi5jb20vcHViL2lwbmcvaHRtbC9pcG5nLW1haW4uaHRtbD4uCisJICBGb3IgTGludXggSVB2NiBkZXZlbG9wbWVudCBpbmZvcm1hdGlvbiwgc2VlIDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPi4KKwkgIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBJUHY2IHVuZGVyIExpbnV4LCByZWFkIHRoZSBIT1dUTyBhdAorCSAgPGh0dHA6Ly93d3cuYmllcmluZ2VyLmRlL2xpbnV4L0lQdjYvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIHByb3RvY29sIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSAKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHY2LgorCiBjb25maWcgSVBWNl9QUklWQUNZCiAJYm9vbCAiSVB2NjogUHJpdmFjeSBFeHRlbnNpb25zIChSRkMgMzA0MSkgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElQVjYKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FmX2luZXQ2LmMgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCmluZGV4IDJiMTkzZTMuLjI4ZDliY2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FmX2luZXQ2LmMKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtNzc0LDcgKzc3NCw2IEBACiAJaWYgKGlmNl9wcm9jX2luaXQoKSkKIAkJZ290byBwcm9jX2lmNl9mYWlsOwogI2VuZGlmCi0JaXB2Nl9wYWNrZXRfaW5pdCgpOwogCWlwNl9yb3V0ZV9pbml0KCk7CiAJaXA2X2Zsb3dsYWJlbF9pbml0KCk7CiAJZXJyID0gYWRkcmNvbmZfaW5pdCgpOwpAQCAtNzkxLDYgKzc5MCw4IEBACiAJLyogSW5pdCB2NiB0cmFuc3BvcnQgcHJvdG9jb2xzLiAqLwogCXVkcHY2X2luaXQoKTsKIAl0Y3B2Nl9pbml0KCk7CisKKwlpcHY2X3BhY2tldF9pbml0KCk7CiAJZXJyID0gMDsKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtNzk4LDcgKzc5OSw2IEBACiBhZGRyY29uZl9mYWlsOgogCWlwNl9mbG93bGFiZWxfY2xlYW51cCgpOwogCWlwNl9yb3V0ZV9jbGVhbnVwKCk7Ci0JaXB2Nl9wYWNrZXRfY2xlYW51cCgpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJaWY2X3Byb2NfZXhpdCgpOwogcHJvY19pZjZfZmFpbDoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCAwNmU3Y2RhZS4uMWYyYzJmOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtNDY1LDcgKzQ2NSw2IEBACiAJdG8tPnBrdF90eXBlID0gZnJvbS0+cGt0X3R5cGU7CiAJdG8tPnByaW9yaXR5ID0gZnJvbS0+cHJpb3JpdHk7CiAJdG8tPnByb3RvY29sID0gZnJvbS0+cHJvdG9jb2w7Ci0JdG8tPnNlY3VyaXR5ID0gZnJvbS0+c2VjdXJpdHk7CiAJZHN0X3JlbGVhc2UodG8tPmRzdCk7CiAJdG8tPmRzdCA9IGRzdF9jbG9uZShmcm9tLT5kc3QpOwogCXRvLT5kZXYgPSBmcm9tLT5kZXY7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9tY2FzdC5jIGIvbmV0L2lwdjYvbWNhc3QuYwppbmRleCA1NjJmY2QxLi4yOWZlZDZlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9tY2FzdC5jCisrKyBiL25ldC9pcHY2L21jYXN0LmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCX0KIAl3cml0ZV91bmxvY2tfYmgoJmlwdjZfc2tfbWNfbG9jayk7CiAKLQlyZXR1cm4gLUVOT0VOVDsKKwlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW5ldDZfZGV2ICppcDZfbWNfZmluZF9kZXYoc3RydWN0IGluNl9hZGRyICpncm91cCwgaW50IGlmaW5kZXgpCkBAIC0zODYsMTIgKzM4NiwxNiBAQAogCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZwbWMtPmFkZHIsIGdyb3VwKSkKIAkJCWJyZWFrOwogCX0KLQlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwlpZiAoIXBtYykgewkJLyogbXVzdCBoYXZlIGEgcHJpb3Igam9pbiAqLworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CisJfQogCS8qIGlmIGEgc291cmNlIGZpbHRlciB3YXMgc2V0LCBtdXN0IGJlIHRoZSBzYW1lIG1vZGUgYXMgYmVmb3JlICovCiAJaWYgKHBtYy0+c2ZsaXN0KSB7Ci0JCWlmIChwbWMtPnNmbW9kZSAhPSBvbW9kZSkKKwkJaWYgKHBtYy0+c2Ztb2RlICE9IG9tb2RlKSB7CisJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBkb25lOworCQl9CiAJfSBlbHNlIGlmIChwbWMtPnNmbW9kZSAhPSBvbW9kZSkgewogCQkvKiBhbGxvdyBtb2RlIHN3aXRjaGVzIGZvciBlbXB0eS1zZXQgZmlsdGVycyAqLwogCQlpcDZfbWNfYWRkX3NyYyhpZGV2LCBncm91cCwgb21vZGUsIDAsIE5VTEwsIDApOwpAQCAtNDAyLDcgKzQwNiw3IEBACiAJcHNsID0gcG1jLT5zZmxpc3Q7CiAJaWYgKCFhZGQpIHsKIAkJaWYgKCFwc2wpCi0JCQlnb3RvIGRvbmU7CisJCQlnb3RvIGRvbmU7CS8qIGVyciA9IC1FQUREUk5PVEFWQUlMICovCiAJCXJ2ID0gITA7CiAJCWZvciAoaT0wOyBpPHBzbC0+c2xfY291bnQ7IGkrKykgewogCQkJcnYgPSBtZW1jbXAoJnBzbC0+c2xfYWRkcltpXSwgc291cmNlLApAQCAtNDExLDcgKzQxNSw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHJ2KQkJLyogc291cmNlIG5vdCBmb3VuZCAqLwotCQkJZ290byBkb25lOworCQkJZ290byBkb25lOwkvKiBlcnIgPSAtRUFERFJOT1RBVkFJTCAqLwogCiAJCS8qIHNwZWNpYWwgY2FzZSAtIChJTkNMVURFLCBlbXB0eSkgPT0gTEVBVkVfR1JPVVAgKi8KIAkJaWYgKHBzbC0+c2xfY291bnQgPT0gMSAmJiBvbW9kZSA9PSBNQ0FTVF9JTkNMVURFKSB7CkBAIC00ODgsNiArNDkyLDcgQEAKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwogCXN0cnVjdCBpcHY2X3BpbmZvICppbmV0NiA9IGluZXQ2X3NrKHNrKTsKIAlzdHJ1Y3QgaXA2X3NmX3NvY2tsaXN0ICpuZXdwc2wsICpwc2w7CisJaW50IGxlYXZlZ3JvdXAgPSAwOwogCWludCBpLCBlcnI7CiAKIAlncm91cCA9ICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmZ3NmLT5nZl9ncm91cCktPnNpbjZfYWRkcjsKQEAgLTUwMyw3ICs1MDgsMTIgQEAKIAlpZiAoIWlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCWRldiA9IGlkZXYtPmRldjsKLQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKworCWVyciA9IDA7CisJaWYgKGdzZi0+Z2ZfZm1vZGUgPT0gTUNBU1RfSU5DTFVERSAmJiBnc2YtPmdmX251bXNyYyA9PSAwKSB7CisJCWxlYXZlZ3JvdXAgPSAxOworCQlnb3RvIGRvbmU7CisJfQogCiAJZm9yIChwbWM9aW5ldDYtPmlwdjZfbWNfbGlzdDsgcG1jOyBwbWM9cG1jLT5uZXh0KSB7CiAJCWlmIChwbWMtPmlmaW5kZXggIT0gZ3NmLT5nZl9pbnRlcmZhY2UpCkBAIC01MTEsOCArNTIxLDEwIEBACiAJCWlmIChpcHY2X2FkZHJfZXF1YWwoJnBtYy0+YWRkciwgZ3JvdXApKQogCQkJYnJlYWs7CiAJfQotCWlmICghcG1jKQkJLyogbXVzdCBoYXZlIGEgcHJpb3Igam9pbiAqLworCWlmICghcG1jKSB7CQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKKwl9CiAJaWYgKGdzZi0+Z2ZfbnVtc3JjKSB7CiAJCW5ld3BzbCA9IChzdHJ1Y3QgaXA2X3NmX3NvY2tsaXN0ICopc29ja19rbWFsbG9jKHNrLAogCQkJCUlQNl9TRkxTSVpFKGdzZi0+Z2ZfbnVtc3JjKSwgR0ZQX0FUT01JQyk7CkBAIC01NDQsMTAgKzU1NiwxMyBAQAogCQkodm9pZCkgaXA2X21jX2RlbF9zcmMoaWRldiwgZ3JvdXAsIHBtYy0+c2Ztb2RlLCAwLCBOVUxMLCAwKTsKIAlwbWMtPnNmbGlzdCA9IG5ld3BzbDsKIAlwbWMtPnNmbW9kZSA9IGdzZi0+Z2ZfZm1vZGU7CisJZXJyID0gMDsKIGRvbmU6CiAJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwogCWluNl9kZXZfcHV0KGlkZXYpOwogCWRldl9wdXQoZGV2KTsKKwlpZiAobGVhdmVncm91cCkKKwkJZXJyID0gaXB2Nl9zb2NrX21jX2Ryb3Aoc2ssIGdzZi0+Z2ZfaW50ZXJmYWNlLCBncm91cCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggOWRhYzdmZC4uZjZlMjg4ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC0yMDE4LDcgKzIwMTgsNyBAQAogCSAqLwogCXRwLT5zbmRfc3N0aHJlc2ggPSAweDdmZmZmZmZmOwogCXRwLT5zbmRfY3duZF9jbGFtcCA9IH4wOwotCXRwLT5tc3NfY2FjaGVfc3RkID0gdHAtPm1zc19jYWNoZSA9IDUzNjsKKwl0cC0+bXNzX2NhY2hlID0gNTM2OwogCiAJdHAtPnJlb3JkZXJpbmcgPSBzeXNjdGxfdGNwX3Jlb3JkZXJpbmc7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHgvS2NvbmZpZyBiL25ldC9pcHgvS2NvbmZpZwppbmRleCBhMTYyMzdjLi45ODBhODI2IDEwMDY0NAotLS0gYS9uZXQvaXB4L0tjb25maWcKKysrIGIvbmV0L2lweC9LY29uZmlnCkBAIC0xLDYgKzEsMzkgQEAKICMKICMgSVBYIGNvbmZpZ3VyYXRpb24KICMKK2NvbmZpZyBJUFgKKwl0cmlzdGF0ZSAiVGhlIElQWCBwcm90b2NvbCIKKwlzZWxlY3QgTExDCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgTm92ZWxsIG5ldHdvcmtpbmcgcHJvdG9jb2wsIElQWCwgY29tbW9ubHkKKwkgIHVzZWQgZm9yIGxvY2FsIG5ldHdvcmtzIG9mIFdpbmRvd3MgbWFjaGluZXMuICBZb3UgbmVlZCBpdCBpZiB5b3UKKwkgIHdhbnQgdG8gYWNjZXNzIE5vdmVsbCBOZXRXYXJlIGZpbGUgb3IgcHJpbnQgc2VydmVycyB1c2luZyB0aGUgTGludXgKKwkgIE5vdmVsbCBjbGllbnQgbmNwZnMgKGF2YWlsYWJsZSBmcm9tCisJICA8ZnRwOi8vcGxhdGFuLnZjLmN2dXQuY3ovcHViL2xpbnV4L25jcGZzLz4pIG9yIGZyb20KKwkgIHdpdGhpbiB0aGUgTGludXggRE9TIGVtdWxhdG9yIERPU0VNVSAocmVhZCB0aGUgRE9TRU1VLUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPikuICBJbiBvcmRlcgorCSAgdG8gZG8gdGhlIGZvcm1lciwgeW91J2xsIGFsc28gaGF2ZSB0byBzYXkgWSB0byAiTkNQIGZpbGUgc3lzdGVtCisJICBzdXBwb3J0IiwgYmVsb3cuCisKKwkgIElQWCBpcyBzaW1pbGFyIGluIHNjb3BlIHRvIElQLCB3aGlsZSBTUFgsIHdoaWNoIHJ1bnMgb24gdG9wIG9mIElQWCwKKwkgIGlzIHNpbWlsYXIgdG8gVENQLiBUaGVyZSBpcyBhbHNvIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBTUFggaW4KKwkgIExpbnV4IChzZWUgIlNQWCBuZXR3b3JraW5nIiwgYmVsb3cpLgorCisJICBUbyB0dXJuIHlvdXIgTGludXggYm94IGludG8gYSBmdWxseSBmZWF0dXJlZCBOZXRXYXJlIGZpbGUgc2VydmVyIGFuZAorCSAgSVBYIHJvdXRlciwgc2F5IFkgaGVyZSBhbmQgZmV0Y2ggZWl0aGVyIGx3YXJlZCBmcm9tCisJICA8ZnRwOi8vaWJpYmxpby5vcmcvcHViL0xpbnV4L3N5c3RlbS9uZXR3b3JrL2RhZW1vbnMvPiBvcgorCSAgbWFyc19ud2UgZnJvbSA8ZnRwOi8vd3d3LmNvbXB1LWFydC5kZS9tYXJzX253ZS8+LiBGb3IgbW9yZQorCSAgaW5mb3JtYXRpb24sIHJlYWQgdGhlIElQWC1IT1dUTyBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKKwkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LgorCisJICBUaGUgSVBYIGRyaXZlciB3b3VsZCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDE2IEtCLiBUbyBjb21waWxlCisJICB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHguCisJICBVbmxlc3MgeW91IHdhbnQgdG8gaW50ZWdyYXRlIHlvdXIgTGludXggYm94IHdpdGggYSBsb2NhbCBOb3ZlbGwKKwkgIG5ldHdvcmssIHNheSBOLgorCiBjb25maWcgSVBYX0lOVEVSTgogCWJvb2wgIklQWDogRnVsbCBpbnRlcm5hbCBJUFggbmV0d29yayIKIAlkZXBlbmRzIG9uIElQWApkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYXAuYyBiL25ldC9pcmRhL2lybGFwLmMKaW5kZXggMDQ2YWQwNy4uNzAyOTYxOCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsYXAuYworKysgYi9uZXQvaXJkYS9pcmxhcC5jCkBAIC00NDUsOSArNDQ1LDggQEAKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwogCiAJLyogRG9uJ3QgZGlzY29ubmVjdCB1bnRpbCBhbGwgZGF0YSBmcmFtZXMgYXJlIHN1Y2Nlc3NmdWxseSBzZW50ICovCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKSB7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkpIHsKIAkJc2VsZi0+ZGlzY29ubmVjdF9wZW5kaW5nID0gVFJVRTsKLQogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcF9ldmVudC5jIGIvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYwppbmRleCAxY2Q4OWY1Li5hNTA1YjU0IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhcF9ldmVudC5jCisrKyBiL25ldC9pcmRhL2lybGFwX2V2ZW50LmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCSAqIFNlbmQgb3V0IHRoZSBSUiBmcmFtZXMgZmFzdGVyIGlmIG91ciBvd24gdHJhbnNtaXQgcXVldWUgaXMgZW1wdHksIG9yCiAJICogaWYgdGhlIHBlZXIgaXMgYnVzeS4gVGhlIGVmZmVjdCBpcyBhIG11Y2ggZmFzdGVyIGNvbnZlcnNhdGlvbgogCSAqLwotCWlmICgoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA9PSAwKSB8fCAoc2VsZi0+cmVtb3RlX2J1c3kpKSB7CisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSB8fCBzZWxmLT5yZW1vdGVfYnVzeSkgewogCQlpZiAoc2VsZi0+ZmFzdF9SUiA9PSBUUlVFKSB7CiAJCQkvKgogCQkJICogIEFzc2VydCB0aGF0IHRoZSBmYXN0IHBvbGwgdGltZXIgaGFzIG5vdCByZWFjaGVkIHRoZQpAQCAtMjYzLDcgKzI2Myw3IEBACiAJCUlSREFfREVCVUcoMiwgIiVzKCkgOiBxdWV1ZSBsZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLAogCQkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSk7CiAKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkpIHsKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkpIHsKIAkJCS8qIFByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggaXJsYXBfZGF0YV9yZXF1ZXN0KCkgKi8KIAkJCXNlbGYtPmxvY2FsX2J1c3kgPSBUUlVFOwogCkBAIC0xMDc0LDcgKzEwNzQsNyBAQAogI2Vsc2UJLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KIAkJCS8qIFdpbmRvdyBoYXMgYmVlbiBhZGp1c3RlZCBmb3IgdGhlIG1heCBwYWNrZXQKIAkJCSAqIHNpemUsIHNvIG11Y2ggc2ltcGxlci4uLiAtIEplYW4gSUkgKi8KLQkJCW5leHRmaXQgPSAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApOworCQkJbmV4dGZpdCA9ICFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSk7CiAjZW5kaWYJLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KIAkJCS8qCiAJCQkgKiAgU2VuZCBkYXRhIHdpdGggcG9sbCBiaXQgY2xlYXJlZCBvbmx5IGlmIHdpbmRvdyA+IDEKQEAgLTE4MTQsNyArMTgxNCw3IEBACiAjZWxzZQkvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLwogCQkJLyogV2luZG93IGhhcyBiZWVuIGFkanVzdGVkIGZvciB0aGUgbWF4IHBhY2tldAogCQkJICogc2l6ZSwgc28gbXVjaCBzaW1wbGVyLi4uIC0gSmVhbiBJSSAqLwotCQkJbmV4dGZpdCA9IChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCk7CisJCQluZXh0Zml0ID0gIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKTsKICNlbmRpZiAvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLwogCQkJLyoKIAkJCSAqICBTZW5kIGRhdGEgd2l0aCBmaW5hbCBiaXQgY2xlYXJlZCBvbmx5IGlmIHdpbmRvdyA+IDEKQEAgLTE5MzcsNyArMTkzNyw3IEBACiAJCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgRkFMU0UpOwogCiAJCQkJLyogQW55IHBlbmRpbmcgZGF0YSByZXF1ZXN0cz8gICovCi0JCQkJaWYgKChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCkgJiYKKwkJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSAmJgogCQkJCSAgICAoc2VsZi0+d2luZG93ID4gMCkpCiAJCQkJewogCQkJCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBUUlVFOwpAQCAtMjAzOCw3ICsyMDM4LDcgQEAKIAkJCS8qCiAJCQkgKiAgQW55IHBlbmRpbmcgZGF0YSByZXF1ZXN0cz8KIAkJCSAqLwotCQkJaWYgKChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCkgJiYKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eHEpICYmCiAJCQkgICAgKHNlbGYtPndpbmRvdyA+IDApICYmICFzZWxmLT5yZW1vdGVfYnVzeSkKIAkJCXsKIAkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBUUlVFKTsKQEAgLTIwNjksNyArMjA2OSw3IEBACiAJCSAqLwogCQlucl9zdGF0dXMgPSBpcmxhcF92YWxpZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CiAJCWlmIChucl9zdGF0dXMgPT0gTlJfRVhQRUNURUQpIHsKLQkJCWlmICgoc2tiX3F1ZXVlX2xlbiggJnNlbGYtPnR4cSkgPiAwKSAmJgorCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkgJiYKIAkJCSAgICAoc2VsZi0+d2luZG93ID4gMCkpIHsKIAkJCQlzZWxmLT5yZW1vdGVfYnVzeSA9IEZBTFNFOwogCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5jIGIvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYwppbmRleCAwNDBhYmU3Li42ZGFmYmI0IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5jCisrKyBiL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMKQEAgLTEwMTgsMTEgKzEwMTgsMTAgQEAKIAkvKgogCSAqICBXZSBjYW4gbm93IGZpbGwgdGhlIHdpbmRvdyB3aXRoIGFkZGl0aW9uYWwgZGF0YSBmcmFtZXMKIAkgKi8KLQl3aGlsZSAoc2tiX3F1ZXVlX2xlbiggJnNlbGYtPnR4cSkgPiAwKSB7CisJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkpIHsKIAogCQlJUkRBX0RFQlVHKDAsICIlcygpLCBzZW5kaW5nIGFkZGl0aW9uYWwgZnJhbWVzIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJaWYgKChza2JfcXVldWVfbGVuKCAmc2VsZi0+dHhxKSA+IDApICYmCi0JCSAgICAoc2VsZi0+d2luZG93ID4gMCkpIHsKKwkJaWYgKHNlbGYtPndpbmRvdyA+IDApIHsKIAkJCXNrYiA9IHNrYl9kZXF1ZXVlKCAmc2VsZi0+dHhxKTsKIAkJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKIApAQCAtMTAzMSw4ICsxMDMwLDcgQEAKIAkJCSAqICBiaXQgY2xlYXJlZAogCQkJICovCiAJCQlpZiAoKHNlbGYtPndpbmRvdyA+IDEpICYmCi0JCQkgICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApCi0JCQl7CisJCQkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSkgewogCQkJCWlybGFwX3NlbmRfZGF0YV9wcmltYXJ5KHNlbGYsIHNrYik7CiAJCQl9IGVsc2UgewogCQkJCWlybGFwX3NlbmRfZGF0YV9wcmltYXJ5X3BvbGwoc2VsZiwgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lydHRwLmMgYi9uZXQvaXJkYS9pcnR0cC5jCmluZGV4IGQwOTFjY2YuLjY2MDJkOTAgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lydHRwLmMKKysrIGIvbmV0L2lyZGEvaXJ0dHAuYwpAQCAtMTUxMyw3ICsxNTEzLDcgQEAKIAkvKgogCSAqICBDaGVjayBpZiB0aGVyZSBpcyBzdGlsbCBkYXRhIHNlZ21lbnRzIGluIHRoZSB0cmFuc21pdCBxdWV1ZQogCSAqLwotCWlmIChza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkgPiAwKSB7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4X3F1ZXVlKSkgewogCQlpZiAocHJpb3JpdHkgPT0gUF9ISUdIKSB7CiAJCQkvKgogCQkJICogIE5vIG5lZWQgdG8gc2VuZCB0aGUgcXVldWVkIGRhdGEsIGlmIHdlIGFyZQpkaWZmIC0tZ2l0IGEvbmV0L2xhcGIvS2NvbmZpZyBiL25ldC9sYXBiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiNWVmYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sYXBiL0tjb25maWcKQEAgLTAsMCArMSwyMiBAQAorIworIyBMQVBCIERhdGEgTGluayBEcml2ZQorIworCitjb25maWcgTEFQQgorCXRyaXN0YXRlICJMQVBCIERhdGEgTGluayBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBMaW5rIEFjY2VzcyBQcm9jZWR1cmUsIEJhbGFuY2VkIChMQVBCKSBpcyB0aGUgZGF0YSBsaW5rIGxheWVyIChpLmUuCisJICB0aGUgbG93ZXIpIHBhcnQgb2YgdGhlIFguMjUgcHJvdG9jb2wuIEl0IG9mZmVycyBhIHJlbGlhYmxlCisJICBjb25uZWN0aW9uIHNlcnZpY2UgdG8gZXhjaGFuZ2UgZGF0YSBmcmFtZXMgd2l0aCBvbmUgb3RoZXIgaG9zdCwgYW5kCisJICBpdCBpcyB1c2VkIHRvIHRyYW5zcG9ydCBoaWdoZXIgbGV2ZWwgcHJvdG9jb2xzIChtb3N0bHkgWC4yNSBQYWNrZXQKKwkgIExheWVyLCB0aGUgaGlnaGVyIHBhcnQgb2YgWC4yNSwgYnV0IG90aGVycyBhcmUgcG9zc2libGUgYXMgd2VsbCkuCisJICBVc3VhbGx5LCBMQVBCIGlzIHVzZWQgd2l0aCBzcGVjaWFsaXplZCBYLjIxIG5ldHdvcmsgY2FyZHMsIGJ1dCBMaW51eAorCSAgY3VycmVudGx5IHN1cHBvcnRzIExBUEIgb25seSBvdmVyIEV0aGVybmV0IGNvbm5lY3Rpb25zLiBJZiB5b3Ugd2FudAorCSAgdG8gdXNlIExBUEIgY29ubmVjdGlvbnMgb3ZlciBFdGhlcm5ldCwgc2F5IFkgaGVyZSBhbmQgdG8gIkxBUEIgb3ZlcgorCSAgRXRoZXJuZXQgZHJpdmVyIiBiZWxvdy4gUmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2xhcGItbW9kdWxlLnR4dD4gZm9yIHRlY2huaWNhbAorCSAgZGV0YWlscy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbGFwYi4gIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19jX2V2LmMgYi9uZXQvbGxjL2xsY19jX2V2LmMKaW5kZXggY2QxMzBjMy4uZDViZGI1MyAxMDA2NDQKLS0tIGEvbmV0L2xsYy9sbGNfY19ldi5jCisrKyBiL25ldC9sbGMvbGxjX2NfZXYuYwpAQCAtODQsNyArODQsNyBAQAogCWlmIChsbGMtPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCiAJCWdvdG8gb3V0OwogCXJjID0gMTsKLQlpZiAoIXNrYl9xdWV1ZV9sZW4oJmxsYy0+cGR1X3VuYWNrX3EpKQorCWlmIChza2JfcXVldWVfZW1wdHkoJmxsYy0+cGR1X3VuYWNrX3EpKQogCQlnb3RvIG91dDsKIAlza2IgPSBza2JfcGVlaygmbGxjLT5wZHVfdW5hY2tfcSk7CiAJcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwppbmRleCBmYzQ1NmE3Li4zNDA1ZmRmIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC04NTgsNyArODU4LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOwogCi0JaWYgKCFza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQogCQljbGVhcl9iaXQoMCwgJm5say0+c3RhdGUpOwogCWlmICghdGVzdF9iaXQoMCwgJm5say0+c3RhdGUpKQogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm5say0+d2FpdCk7CmRpZmYgLS1naXQgYS9uZXQvcGFja2V0L0tjb25maWcgYi9uZXQvcGFja2V0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmZjkzZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9wYWNrZXQvS2NvbmZpZwpAQCAtMCwwICsxLDI2IEBACisjCisjIFBhY2tldCBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBQQUNLRVQKKwl0cmlzdGF0ZSAiUGFja2V0IHNvY2tldCIKKwktLS1oZWxwLS0tCisJICBUaGUgUGFja2V0IHByb3RvY29sIGlzIHVzZWQgYnkgYXBwbGljYXRpb25zIHdoaWNoIGNvbW11bmljYXRlCisJICBkaXJlY3RseSB3aXRoIG5ldHdvcmsgZGV2aWNlcyB3aXRob3V0IGFuIGludGVybWVkaWF0ZSBuZXR3b3JrCisJICBwcm90b2NvbCBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLCBlLmcuIHRjcGR1bXAuICBJZiB5b3Ugd2FudCB0aGVtCisJICB0byB3b3JrLCBjaG9vc2UgWS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYWZfcGFja2V0LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgUEFDS0VUX01NQVAKKwlib29sICJQYWNrZXQgc29ja2V0OiBtbWFwcGVkIElPIgorCWRlcGVuZHMgb24gUEFDS0VUCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBQYWNrZXQgcHJvdG9jb2wgZHJpdmVyIHdpbGwgdXNlIGFuIElPCisJICBtZWNoYW5pc20gdGhhdCByZXN1bHRzIGluIGZhc3RlciBjb21tdW5pY2F0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCmRpZmYgLS1naXQgYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwppbmRleCAwMjY5NjE2Li5jOWQ1OTgwIDEwMDY0NAotLS0gYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jCisrKyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKQEAgLTI3NCw2ICsyNzQsOSBAQAogCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKIAlza2ItPmRzdCA9IE5VTEw7CiAKKwkvKiBkcm9wIGNvbm50cmFjayByZWZlcmVuY2UgKi8KKwluZl9yZXNldChza2IpOworCiAJc3BrdCA9IChzdHJ1Y3Qgc29ja2FkZHJfcGt0Kilza2ItPmNiOwogCiAJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEtc2tiLT5tYWMucmF3KTsKQEAgLTUxNyw2ICs1MjAsOSBAQAogCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKIAlza2ItPmRzdCA9IE5VTEw7CiAKKwkvKiBkcm9wIGNvbm50cmFjayByZWZlcmVuY2UgKi8KKwluZl9yZXNldChza2IpOworCiAJc3Bpbl9sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKIAlwby0+c3RhdHMudHBfcGFja2V0cysrOwogCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL0tjb25maWcgYi9uZXQvc2NoZWQvS2NvbmZpZwppbmRleCA3YmFjMjQ5Li41OWQzZTcxIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvS2NvbmZpZworKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtMSw2ICsxLDQzIEBACiAjCiAjIFRyYWZmaWMgY29udHJvbCBjb25maWd1cmF0aW9uLgogIyAKKworbWVudWNvbmZpZyBORVRfU0NIRUQKKwlib29sICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciCisJLS0taGVscC0tLQorCSAgV2hlbiB0aGUga2VybmVsIGhhcyBzZXZlcmFsIHBhY2tldHMgdG8gc2VuZCBvdXQgb3ZlciBhIG5ldHdvcmsKKwkgIGRldmljZSwgaXQgaGFzIHRvIGRlY2lkZSB3aGljaCBvbmVzIHRvIHNlbmQgZmlyc3QsIHdoaWNoIG9uZXMgdG8KKwkgIGRlbGF5LCBhbmQgd2hpY2ggb25lcyB0byBkcm9wLiBUaGlzIGlzIHRoZSBqb2Igb2YgdGhlIHBhY2tldAorCSAgc2NoZWR1bGVyLCBhbmQgc2V2ZXJhbCBkaWZmZXJlbnQgYWxnb3JpdGhtcyBmb3IgaG93IHRvIGRvIHRoaXMKKwkgICJmYWlybHkiIGhhdmUgYmVlbiBwcm9wb3NlZC4KKworCSAgSWYgeW91IHNheSBOIGhlcmUsIHlvdSB3aWxsIGdldCB0aGUgc3RhbmRhcmQgcGFja2V0IHNjaGVkdWxlciwgd2hpY2gKKwkgIGlzIGEgRklGTyAoZmlyc3QgY29tZSwgZmlyc3Qgc2VydmVkKS4gSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlCisJICBhYmxlIHRvIGNob29zZSBmcm9tIGFtb25nIHNldmVyYWwgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtcyB3aGljaCBjYW4KKwkgIHRoZW4gYmUgYXR0YWNoZWQgdG8gZGlmZmVyZW50IG5ldHdvcmsgZGV2aWNlcy4gVGhpcyBpcyB1c2VmdWwgZm9yCisJICBleGFtcGxlIGlmIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgYXJlIHJlYWwgdGltZSBkZXZpY2VzIHRoYXQKKwkgIG5lZWQgYSBjZXJ0YWluIG1pbmltdW0gZGF0YSBmbG93IHJhdGUsIG9yIGlmIHlvdSBuZWVkIHRvIGxpbWl0IHRoZQorCSAgbWF4aW11bSBkYXRhIGZsb3cgcmF0ZSBmb3IgdHJhZmZpYyB3aGljaCBtYXRjaGVzIHNwZWNpZmllZCBjcml0ZXJpYS4KKwkgIFRoaXMgY29kZSBpcyBjb25zaWRlcmVkIHRvIGJlIGV4cGVyaW1lbnRhbC4KKworCSAgVG8gYWRtaW5pc3RlciB0aGVzZSBzY2hlZHVsZXJzLCB5b3UnbGwgbmVlZCB0aGUgdXNlci1sZXZlbCB1dGlsaXRpZXMKKwkgIGZyb20gdGhlIHBhY2thZ2UgaXByb3V0ZTIrdGMgYXQgPGZ0cDovL2Z0cC50dXgub3JnL3B1Yi9uZXQvaXAtcm91dGluZy8+LgorCSAgVGhhdCBwYWNrYWdlIGFsc28gY29udGFpbnMgc29tZSBkb2N1bWVudGF0aW9uOyBmb3IgbW9yZSwgY2hlY2sgb3V0CisJICA8aHR0cDovL3NuYWZ1LmZyZWVkb20ub3JnL2xpbnV4Mi4yL2lwcm91dGUtbm90ZXMuaHRtbD4uCisKKwkgIFRoaXMgUXVhbGl0eSBvZiBTZXJ2aWNlIChRb1MpIHN1cHBvcnQgd2lsbCBlbmFibGUgeW91IHRvIHVzZQorCSAgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgKGRpZmZzZXJ2KSBhbmQgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wKKwkgIChSU1ZQKSBvbiB5b3VyIExpbnV4IHJvdXRlciBpZiB5b3UgYWxzbyBzYXkgWSB0byAiUW9TIHN1cHBvcnQiLAorCSAgIlBhY2tldCBjbGFzc2lmaWVyIEFQSSIgYW5kIHRvIHNvbWUgY2xhc3NpZmllcnMgYmVsb3cuIERvY3VtZW50YXRpb24KKwkgIGFuZCBzb2Z0d2FyZSBpcyBhdCA8aHR0cDovL2RpZmZzZXJ2LnNvdXJjZWZvcmdlLm5ldC8+LgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIiBiZWxvdywgeW91IHdpbGwgYmUgYWJsZQorCSAgdG8gcmVhZCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgcGFja2V0IHNjaGVkdWxlcnMgZnJvbSB0aGUgZmlsZQorCSAgL3Byb2MvbmV0L3BzY2hlZC4KKworCSAgVGhlIGF2YWlsYWJsZSBzY2hlZHVsZXJzIGFyZSBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnM7IHlvdQorCSAgY2FuIHNheSBZIHRvIGFzIG1hbnkgYXMgeW91IGxpa2UuIElmIHVuc3VyZSwgc2F5IE4gbm93LgorCiBjaG9pY2UKIAlwcm9tcHQgIlBhY2tldCBzY2hlZHVsZXIgY2xvY2sgc291cmNlIgogCWRlcGVuZHMgb24gTkVUX1NDSEVECmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvTWFrZWZpbGUgYi9uZXQvc2NoZWQvTWFrZWZpbGUKaW5kZXggOGY1OGNlYy4uZTQ4ZDBkNCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL01ha2VmaWxlCisrKyBiL25ldC9zY2hlZC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogb2JqLXkJOj0gc2NoX2dlbmVyaWMubwogCi1vYmotJChDT05GSUdfTkVUX1NDSEVEKQkJKz0gc2NoX2FwaS5vIHNjaF9maWZvLm8KK29iai0kKENPTkZJR19ORVRfU0NIRUQpCQkrPSBzY2hfYXBpLm8gc2NoX2ZpZm8ubyBzY2hfYmxhY2tob2xlLm8KIG9iai0kKENPTkZJR19ORVRfQ0xTKQkJKz0gY2xzX2FwaS5vCiBvYmotJChDT05GSUdfTkVUX0NMU19BQ1QpCSs9IGFjdF9hcGkubwogb2JqLSQoQ09ORklHX05FVF9BQ1RfUE9MSUNFKQkrPSBwb2xpY2UubwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX21ldGEuYyBiL25ldC9zY2hlZC9lbV9tZXRhLmMKaW5kZXggNDhiYjIzYy4uNTNkOThmOCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2VtX21ldGEuYworKysgYi9uZXQvc2NoZWQvZW1fbWV0YS5jCkBAIC0yMDUsMTEgKzIwNSw2IEBACiAJZHN0LT52YWx1ZSA9IHNrYi0+cHJvdG9jb2w7CiB9CiAKLU1FVEFfQ09MTEVDVE9SKGludF9zZWN1cml0eSkKLXsKLQlkc3QtPnZhbHVlID0gc2tiLT5zZWN1cml0eTsKLX0KLQogTUVUQV9DT0xMRUNUT1IoaW50X3BrdHR5cGUpCiB7CiAJZHN0LT52YWx1ZSA9IHNrYi0+cGt0X3R5cGU7CkBAIC01MjQsNyArNTE5LDYgQEAKIAkJW01FVEFfSUQoUkVBTERFVildCQk9IE1FVEFfRlVOQyhpbnRfcmVhbGRldiksCiAJCVtNRVRBX0lEKFBSSU9SSVRZKV0JCT0gTUVUQV9GVU5DKGludF9wcmlvcml0eSksCiAJCVtNRVRBX0lEKFBST1RPQ09MKV0JCT0gTUVUQV9GVU5DKGludF9wcm90b2NvbCksCi0JCVtNRVRBX0lEKFNFQ1VSSVRZKV0JCT0gTUVUQV9GVU5DKGludF9zZWN1cml0eSksCiAJCVtNRVRBX0lEKFBLVFRZUEUpXQkJPSBNRVRBX0ZVTkMoaW50X3BrdHR5cGUpLAogCQlbTUVUQV9JRChQS1RMRU4pXQkJPSBNRVRBX0ZVTkMoaW50X3BrdGxlbiksCiAJCVtNRVRBX0lEKERBVEFMRU4pXQkJPSBNRVRBX0ZVTkMoaW50X2RhdGFsZW4pLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hcGkuYyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKaW5kZXggMDVlNmUwYS4uYjlhMDY5YSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9hcGkuYworKysgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCkBAIC0zOTksMTAgKzM5OSw4IEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgcnRhdHRyICpraW5kID0gdGNhW1RDQV9LSU5ELTFdOwotCXZvaWQgKnAgPSBOVUxMOwogCXN0cnVjdCBRZGlzYyAqc2NoOwogCXN0cnVjdCBRZGlzY19vcHMgKm9wczsKLQlpbnQgc2l6ZTsKIAogCW9wcyA9IHFkaXNjX2xvb2t1cF9vcHMoa2luZCk7CiAjaWZkZWYgQ09ORklHX0tNT0QKQEAgLTQzNyw2NCArNDM1LDU1IEBACiAJaWYgKG9wcyA9PSBOVUxMKQogCQlnb3RvIGVycl9vdXQ7CiAKLQkvKiBlbnN1cmUgdGhhdCB0aGUgUWRpc2MgYW5kIHRoZSBwcml2YXRlIGRhdGEgYXJlIDMyLWJ5dGUgYWxpZ25lZCAqLwotCXNpemUgPSAoKHNpemVvZigqc2NoKSArIFFESVNDX0FMSUdOX0NPTlNUKSAmIH5RRElTQ19BTElHTl9DT05TVCk7Ci0Jc2l6ZSArPSBvcHMtPnByaXZfc2l6ZSArIFFESVNDX0FMSUdOX0NPTlNUOwotCi0JcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JZXJyID0gLUVOT0JVRlM7Ci0JaWYgKCFwKQorCXNjaCA9IHFkaXNjX2FsbG9jKGRldiwgb3BzKTsKKwlpZiAoSVNfRVJSKHNjaCkpIHsKKwkJZXJyID0gUFRSX0VSUihzY2gpOwogCQlnb3RvIGVycl9vdXQyOwotCW1lbXNldChwLCAwLCBzaXplKTsKLQlzY2ggPSAoc3RydWN0IFFkaXNjICopKCgodW5zaWduZWQgbG9uZylwICsgUURJU0NfQUxJR05fQ09OU1QpCi0JICAgICAgICAgICAgICAgICAgICAgICAmIH5RRElTQ19BTElHTl9DT05TVCk7Ci0Jc2NoLT5wYWRkZWQgPSAoY2hhciAqKXNjaCAtIChjaGFyICopcDsKKwl9CiAKLQlJTklUX0xJU1RfSEVBRCgmc2NoLT5saXN0KTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZzY2gtPnEpOwotCi0JaWYgKGhhbmRsZSA9PSBUQ19IX0lOR1JFU1MpCisJaWYgKGhhbmRsZSA9PSBUQ19IX0lOR1JFU1MpIHsKIAkJc2NoLT5mbGFncyB8PSBUQ1FfRl9JTkdSRVNTOwotCi0Jc2NoLT5vcHMgPSBvcHM7Ci0Jc2NoLT5lbnF1ZXVlID0gb3BzLT5lbnF1ZXVlOwotCXNjaC0+ZGVxdWV1ZSA9IG9wcy0+ZGVxdWV1ZTsKLQlzY2gtPmRldiA9IGRldjsKLQlkZXZfaG9sZChkZXYpOwotCWF0b21pY19zZXQoJnNjaC0+cmVmY250LCAxKTsKLQlzY2gtPnN0YXRzX2xvY2sgPSAmZGV2LT5xdWV1ZV9sb2NrOwotCWlmIChoYW5kbGUgPT0gMCkgeworCQloYW5kbGUgPSBUQ19IX01BS0UoVENfSF9JTkdSRVNTLCAwKTsKKwl9IGVsc2UgaWYgKGhhbmRsZSA9PSAwKSB7CiAJCWhhbmRsZSA9IHFkaXNjX2FsbG9jX2hhbmRsZShkZXYpOwogCQllcnIgPSAtRU5PTUVNOwogCQlpZiAoaGFuZGxlID09IDApCiAJCQlnb3RvIGVycl9vdXQzOwogCX0KIAotCWlmIChoYW5kbGUgPT0gVENfSF9JTkdSRVNTKQotICAgICAgICAgICAgICAgIHNjaC0+aGFuZGxlID1UQ19IX01BS0UoVENfSF9JTkdSRVNTLCAwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNjaC0+aGFuZGxlID0gaGFuZGxlOworCXNjaC0+aGFuZGxlID0gaGFuZGxlOwogCiAJaWYgKCFvcHMtPmluaXQgfHwgKGVyciA9IG9wcy0+aW5pdChzY2gsIHRjYVtUQ0FfT1BUSU9OUy0xXSkpID09IDApIHsKKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCQlpZiAodGNhW1RDQV9SQVRFLTFdKSB7CisJCQllcnIgPSBnZW5fbmV3X2VzdGltYXRvcigmc2NoLT5ic3RhdHMsICZzY2gtPnJhdGVfZXN0LAorCQkJCQkJc2NoLT5zdGF0c19sb2NrLAorCQkJCQkJdGNhW1RDQV9SQVRFLTFdKTsKKwkJCWlmIChlcnIpIHsKKwkJCQkvKgorCQkJCSAqIEFueSBicm9rZW4gcWRpc2NzIHRoYXQgd291bGQgcmVxdWlyZQorCQkJCSAqIGEgb3BzLT5yZXNldCgpIGhlcmU/IFRoZSBxZGlzYyB3YXMgbmV2ZXIKKwkJCQkgKiBpbiBhY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4KKwkJCQkgKi8KKwkJCQlpZiAob3BzLT5kZXN0cm95KQorCQkJCQlvcHMtPmRlc3Ryb3koc2NoKTsKKwkJCQlnb3RvIGVycl9vdXQzOworCQkJfQorCQl9CisjZW5kaWYKIAkJcWRpc2NfbG9ja190cmVlKGRldik7CiAJCWxpc3RfYWRkX3RhaWwoJnNjaC0+bGlzdCwgJmRldi0+cWRpc2NfbGlzdCk7CiAJCXFkaXNjX3VubG9ja190cmVlKGRldik7CiAKLSNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgotCQlpZiAodGNhW1RDQV9SQVRFLTFdKQotCQkJZ2VuX25ld19lc3RpbWF0b3IoJnNjaC0+YnN0YXRzLCAmc2NoLT5yYXRlX2VzdCwKLQkJCQlzY2gtPnN0YXRzX2xvY2ssIHRjYVtUQ0FfUkFURS0xXSk7Ci0jZW5kaWYKIAkJcmV0dXJuIHNjaDsKIAl9CiBlcnJfb3V0MzoKIAlkZXZfcHV0KGRldik7CisJa2ZyZWUoKGNoYXIgKikgc2NoIC0gc2NoLT5wYWRkZWQpOwogZXJyX291dDI6CiAJbW9kdWxlX3B1dChvcHMtPm93bmVyKTsKIGVycl9vdXQ6CiAJKmVycnAgPSBlcnI7Ci0JaWYgKHApCi0JCWtmcmVlKHApOwogCXJldHVybiBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2JsYWNraG9sZS5jIGIvbmV0L3NjaGVkL3NjaF9ibGFja2hvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWYwYjgzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL3NjaF9ibGFja2hvbGUuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogbmV0L3NjaGVkL3NjaF9ibGFja2hvbGUuYwlCbGFjayBob2xlIHF1ZXVlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKgorICogTm90ZTogUXVhbnR1bSB0dW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisKK3N0YXRpYyBpbnQgYmxhY2tob2xlX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gpCit7CisJcWRpc2NfZHJvcChza2IsIHNjaCk7CisJcmV0dXJuIE5FVF9YTUlUX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYmxhY2tob2xlX2RlcXVldWUoc3RydWN0IFFkaXNjICpzY2gpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2Nfb3BzIGJsYWNraG9sZV9xZGlzY19vcHMgPSB7CisJLmlkCQk9ICJibGFja2hvbGUiLAorCS5wcml2X3NpemUJPSAwLAorCS5lbnF1ZXVlCT0gYmxhY2tob2xlX2VucXVldWUsCisJLmRlcXVldWUJPSBibGFja2hvbGVfZGVxdWV1ZSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBibGFja2hvbGVfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfcWRpc2MoJmJsYWNraG9sZV9xZGlzY19vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYmxhY2tob2xlX21vZHVsZV9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9xZGlzYygmYmxhY2tob2xlX3FkaXNjX29wcyk7Cit9CisKK21vZHVsZV9pbml0KGJsYWNraG9sZV9tb2R1bGVfaW5pdCkKK21vZHVsZV9leGl0KGJsYWNraG9sZV9tb2R1bGVfZXhpdCkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCA3NjgzYjM0Li43M2UyMThlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtMzk1LDI0ICszOTUsMjMgQEAKIAkub3duZXIJCT0JVEhJU19NT0RVTEUsCiB9OwogCi1zdHJ1Y3QgUWRpc2MgKiBxZGlzY19jcmVhdGVfZGZsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpCitzdHJ1Y3QgUWRpc2MgKnFkaXNjX2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBRZGlzY19vcHMgKm9wcykKIHsKIAl2b2lkICpwOwogCXN0cnVjdCBRZGlzYyAqc2NoOwotCWludCBzaXplOworCXVuc2lnbmVkIGludCBzaXplOworCWludCBlcnIgPSAtRU5PQlVGUzsKIAogCS8qIGVuc3VyZSB0aGF0IHRoZSBRZGlzYyBhbmQgdGhlIHByaXZhdGUgZGF0YSBhcmUgMzItYnl0ZSBhbGlnbmVkICovCi0Jc2l6ZSA9ICgoc2l6ZW9mKCpzY2gpICsgUURJU0NfQUxJR05fQ09OU1QpICYgflFESVNDX0FMSUdOX0NPTlNUKTsKLQlzaXplICs9IG9wcy0+cHJpdl9zaXplICsgUURJU0NfQUxJR05fQ09OU1Q7CisJc2l6ZSA9IFFESVNDX0FMSUdOKHNpemVvZigqc2NoKSk7CisJc2l6ZSArPSBvcHMtPnByaXZfc2l6ZSArIChRRElTQ19BTElHTlRPIC0gMSk7CiAKIAlwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXApCi0JCXJldHVybiBOVUxMOworCQlnb3RvIGVycm91dDsKIAltZW1zZXQocCwgMCwgc2l6ZSk7Ci0KLQlzY2ggPSAoc3RydWN0IFFkaXNjICopKCgodW5zaWduZWQgbG9uZylwICsgUURJU0NfQUxJR05fQ09OU1QpIAotCQkJICAgICAgICYgflFESVNDX0FMSUdOX0NPTlNUKTsKLQlzY2gtPnBhZGRlZCA9IChjaGFyICopc2NoIC0gKGNoYXIgKilwOworCXNjaCA9IChzdHJ1Y3QgUWRpc2MgKikgUURJU0NfQUxJR04oKHVuc2lnbmVkIGxvbmcpIHApOworCXNjaC0+cGFkZGVkID0gKGNoYXIgKikgc2NoIC0gKGNoYXIgKikgcDsKIAogCUlOSVRfTElTVF9IRUFEKCZzY2gtPmxpc3QpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNjaC0+cSk7CkBAIC00MjMsMTEgKzQyMiwyNCBAQAogCWRldl9ob2xkKGRldik7CiAJc2NoLT5zdGF0c19sb2NrID0gJmRldi0+cXVldWVfbG9jazsKIAlhdG9taWNfc2V0KCZzY2gtPnJlZmNudCwgMSk7CisKKwlyZXR1cm4gc2NoOworZXJyb3V0OgorCXJldHVybiBFUlJfUFRSKC1lcnIpOworfQorCitzdHJ1Y3QgUWRpc2MgKiBxZGlzY19jcmVhdGVfZGZsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpCit7CisJc3RydWN0IFFkaXNjICpzY2g7CisJCisJc2NoID0gcWRpc2NfYWxsb2MoZGV2LCBvcHMpOworCWlmIChJU19FUlIoc2NoKSkKKwkJZ290byBlcnJvdXQ7CisKIAlpZiAoIW9wcy0+aW5pdCB8fCBvcHMtPmluaXQoc2NoLCBOVUxMKSA9PSAwKQogCQlyZXR1cm4gc2NoOwogCi0JZGV2X3B1dChkZXYpOwotCWtmcmVlKHApOworZXJyb3V0OgogCXJldHVybiBOVUxMOwogfQogCkBAIC01OTEsNiArNjAzLDcgQEAKIEVYUE9SVF9TWU1CT0wobm9vcF9xZGlzYyk7CiBFWFBPUlRfU1lNQk9MKG5vb3BfcWRpc2Nfb3BzKTsKIEVYUE9SVF9TWU1CT0wocWRpc2NfY3JlYXRlX2RmbHQpOworRVhQT1JUX1NZTUJPTChxZGlzY19hbGxvYyk7CiBFWFBPUlRfU1lNQk9MKHFkaXNjX2Rlc3Ryb3kpOwogRVhQT1JUX1NZTUJPTChxZGlzY19yZXNldCk7CiBFWFBPUlRfU1lNQk9MKHFkaXNjX3Jlc3RhcnQpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9yZWQuYyBiL25ldC9zY2hlZC9zY2hfcmVkLmMKaW5kZXggNjY0ZDBlNC4uNzg0NWQwNCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9yZWQuYworKysgYi9uZXQvc2NoZWQvc2NoX3JlZC5jCkBAIC0zODUsNyArMzg1LDcgQEAKIAltZW1jcHkocS0+U3RhYiwgUlRBX0RBVEEodGJbVENBX1JFRF9TVEFCLTFdKSwgMjU2KTsKIAogCXEtPnFjb3VudCA9IC0xOwotCWlmIChza2JfcXVldWVfbGVuKCZzY2gtPnEpID09IDApCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2NoLT5xKSkKIAkJUFNDSEVEX1NFVF9QQVNUUEVSRkVDVChxLT5xaWRsZXN0YXJ0KTsKIAlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2Fzc29jaW9sYS5jIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKaW5kZXggN2FlNmFhNy4uNWIyNGFlMCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMKKysrIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJCQkJICBjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCiAJCQkJCSAgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgIHNjdHBfc2NvcGVfdCBzY29wZSwKLQkJCQkJICBpbnQgZ2ZwKQorCQkJCQkgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfc29jayAqc3A7CiAJaW50IGk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAkgKi8KIAlhc29jLT5hZGRpcF9zZXJpYWwgPSBhc29jLT5jLmluaXRpYWxfdHNuOwogCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXNvYy0+YWRkaXBfY2h1bmtzKTsKKwlJTklUX0xJU1RfSEVBRCgmYXNvYy0+YWRkaXBfY2h1bmtfbGlzdCk7CiAKIAkvKiBNYWtlIGFuIGVtcHR5IGxpc3Qgb2YgcmVtb3RlIHRyYW5zcG9ydCBhZGRyZXNzZXMuICAqLwogCUlOSVRfTElTVF9IRUFEKCZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpOwpAQCAtMjcyLDcgKzI3Miw4IEBACiAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBhc3NvY2lhdGlvbiAqLwogc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnNjdHBfYXNzb2NpYXRpb25fbmV3KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKIAkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJIHNjdHBfc2NvcGVfdCBzY29wZSwgaW50IGdmcCkKKwkJCQkJIHNjdHBfc2NvcGVfdCBzY29wZSwKKwkJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAKQEAgLTQ3OCw3ICs0NzksNyBAQAogLyogQWRkIGEgdHJhbnNwb3J0IGFkZHJlc3MgdG8gYW4gYXNzb2NpYXRpb24uICAqLwogc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX2Fzc29jX2FkZF9wZWVyKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCQkgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCi0JCQkJCSAgIGNvbnN0IGludCBnZnAsCisJCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsCiAJCQkJCSAgIGNvbnN0IGludCBwZWVyX3N0YXRlKQogewogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqcGVlcjsKQEAgLTEyMjksNyArMTIzMCw4IEBACiAvKiBCdWlsZCB0aGUgYmluZCBhZGRyZXNzIGxpc3QgZm9yIHRoZSBhc3NvY2lhdGlvbiBiYXNlZCBvbiBpbmZvIGZyb20gdGhlCiAgKiBsb2NhbCBlbmRwb2ludCBhbmQgdGhlIHJlbW90ZSBwZWVyLgogICovCi1pbnQgc2N0cF9hc3NvY19zZXRfYmluZF9hZGRyX2Zyb21fZXAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIGludCBnZnApCitpbnQgc2N0cF9hc3NvY19zZXRfYmluZF9hZGRyX2Zyb21fZXAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXNjdHBfc2NvcGVfdCBzY29wZTsKIAlpbnQgZmxhZ3M7CkBAIC0xMjUxLDcgKzEyNTMsOCBAQAogCiAvKiBCdWlsZCB0aGUgYXNzb2NpYXRpb24ncyBiaW5kIGFkZHJlc3MgbGlzdCBmcm9tIHRoZSBjb29raWUuICAqLwogaW50IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2Nvb2tpZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKLQkJCQkJIHN0cnVjdCBzY3RwX2Nvb2tpZSAqY29va2llLCBpbnQgZ2ZwKQorCQkJCQkgc3RydWN0IHNjdHBfY29va2llICpjb29raWUsCisJCQkJCSB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCWludCB2YXJfc2l6ZTIgPSBudG9ocyhjb29raWUtPnBlZXJfaW5pdC0+Y2h1bmtfaGRyLmxlbmd0aCk7CiAJaW50IHZhcl9zaXplMyA9IGNvb2tpZS0+cmF3X2FkZHJfbGlzdF9sZW47CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9iaW5kX2FkZHIuYyBiL25ldC9zY3RwL2JpbmRfYWRkci5jCmluZGV4IGY5MGVhZGYuLmY3MTU0OTcgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2JpbmRfYWRkci5jCisrKyBiL25ldC9zY3RwL2JpbmRfYWRkci5jCkBAIC01Myw3ICs1Myw4IEBACiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBpbnRlcm5hbCBoZWxwZXJzLiAqLwogc3RhdGljIGludCBzY3RwX2NvcHlfb25lX2FkZHIoc3RydWN0IHNjdHBfYmluZF9hZGRyICosIHVuaW9uIHNjdHBfYWRkciAqLAotCQkJICAgICAgc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwLCBpbnQgZmxhZ3MpOworCQkJICAgICAgc2N0cF9zY29wZV90IHNjb3BlLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAorCQkJICAgICAgaW50IGZsYWdzKTsKIHN0YXRpYyB2b2lkIHNjdHBfYmluZF9hZGRyX2NsZWFuKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqKTsKIAogLyogRmlyc3QgTGV2ZWwgQWJzdHJhY3Rpb25zLiAqLwpAQCAtNjMsNyArNjQsOCBAQAogICovCiBpbnQgc2N0cF9iaW5kX2FkZHJfY29weShzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmRlc3QsIAogCQkJY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICpzcmMsCi0JCQlzY3RwX3Njb3BlX3Qgc2NvcGUsIGludCBnZnAsIGludCBmbGFncykKKwkJCXNjdHBfc2NvcGVfdCBzY29wZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKKwkJCWludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CkBAIC0xNDQsNyArMTQ2LDcgQEAKIAogLyogQWRkIGFuIGFkZHJlc3MgdG8gdGhlIGJpbmQgYWRkcmVzcyBsaXN0IGluIHRoZSBTQ1RQX2JpbmRfYWRkciBzdHJ1Y3R1cmUuICovCiBpbnQgc2N0cF9hZGRfYmluZF9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnAsIHVuaW9uIHNjdHBfYWRkciAqbmV3LAotCQkgICAgICAgaW50IGdmcCkKKwkJICAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CiAKQEAgLTE5Nyw3ICsxOTksOCBAQAogICogVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgbGVuZ3RoLgogICovCiB1bmlvbiBzY3RwX3BhcmFtcyBzY3RwX2JpbmRfYWRkcnNfdG9fcmF3KGNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnAsCi0JCQkJCSBpbnQgKmFkZHJzX2xlbiwgaW50IGdmcCkKKwkJCQkJIGludCAqYWRkcnNfbGVuLAorCQkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAl1bmlvbiBzY3RwX3BhcmFtcyBhZGRycGFybXM7CiAJdW5pb24gc2N0cF9wYXJhbXMgcmV0dmFsOwpAQCAtMjQ5LDcgKzI1Miw3IEBACiAgKiBhZGRyZXNzIHBhcmFtZXRlcnMpLgogICovCiBpbnQgc2N0cF9yYXdfdG9fYmluZF9hZGRycyhzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBfX3U4ICpyYXdfYWRkcl9saXN0LAotCQkJICAgaW50IGFkZHJzX2xlbiwgX191MTYgcG9ydCwgaW50IGdmcCkKKwkJCSAgIGludCBhZGRyc19sZW4sIF9fdTE2IHBvcnQsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJdW5pb24gc2N0cF9hZGRyX3BhcmFtICpyYXdhZGRyOwogCXN0cnVjdCBzY3RwX3BhcmFtaGRyICpwYXJhbTsKQEAgLTM0Nyw3ICszNTAsOCBAQAogLyogQ29weSBvdXQgYWRkcmVzc2VzIGZyb20gdGhlIGdsb2JhbCBsb2NhbCBhZGRyZXNzIGxpc3QuICovCiBzdGF0aWMgaW50IHNjdHBfY29weV9vbmVfYWRkcihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmRlc3QsIAogCQkJICAgICAgdW5pb24gc2N0cF9hZGRyICphZGRyLAotCQkJICAgICAgc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwLCBpbnQgZmxhZ3MpCisJCQkgICAgICBzY3RwX3Njb3BlX3Qgc2NvcGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsCisJCQkgICAgICBpbnQgZmxhZ3MpCiB7CiAJaW50IGVycm9yID0gMDsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvY2h1bmsuYyBiL25ldC9zY3RwL2NodW5rLmMKaW5kZXggMGMyYWI3OC4uNjFkYTI5MyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvY2h1bmsuYworKysgYi9uZXQvc2N0cC9jaHVuay5jCkBAIC02Miw3ICs2Miw3IEBACiB9CiAKIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGRhdGFtc2cuICovCi1TQ1RQX1NUQVRJQyBzdHJ1Y3Qgc2N0cF9kYXRhbXNnICpzY3RwX2RhdGFtc2dfbmV3KGludCBnZnApCitTQ1RQX1NUQVRJQyBzdHJ1Y3Qgc2N0cF9kYXRhbXNnICpzY3RwX2RhdGFtc2dfbmV3KHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnOwogCW1zZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY3RwX2RhdGFtc2cpLCBnZnApOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYyBiL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKaW5kZXggYzQ0YmY0MS4uZTQ3YWMwZCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYworKysgYi9uZXQvc2N0cC9lbmRwb2ludG9sYS5jCkBAIC02Nyw3ICs2Nyw4IEBACiAgKiBJbml0aWFsaXplIHRoZSBiYXNlIGZpZWxkcyBvZiB0aGUgZW5kcG9pbnQgc3RydWN0dXJlLgogICovCiBzdGF0aWMgc3RydWN0IHNjdHBfZW5kcG9pbnQgKnNjdHBfZW5kcG9pbnRfaW5pdChzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCi0JCQkJCQlzdHJ1Y3Qgc29jayAqc2ssIGludCBnZnApCisJCQkJCQlzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CiAJbWVtc2V0KGVwLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfZW5kcG9pbnQpKTsKQEAgLTEzNyw3ICsxMzgsOCBAQAogLyogQ3JlYXRlIGEgc2N0cF9lbmRwb2ludCB3aXRoIGFsbCB0aGF0IGJvcmluZyBzdHVmZiBpbml0aWFsaXplZC4KICAqIFJldHVybnMgTlVMTCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggbWVtb3J5LgogICovCi1zdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqc2N0cF9lbmRwb2ludF9uZXcoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2ZwKQorc3RydWN0IHNjdHBfZW5kcG9pbnQgKnNjdHBfZW5kcG9pbnRfbmV3KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucHV0LmMgYi9uZXQvc2N0cC9pbnB1dC5jCmluZGV4IDMzOWY3YWMuLjVlMDg1ZTAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucHV0LmMKKysrIGIvbmV0L3NjdHAvaW5wdXQuYwpAQCAtMTE1LDYgKzExNSwxNyBAQAogCWF0b21pY19hZGQoc2l6ZW9mKHN0cnVjdCBzY3RwX2NodW5rKSwmc2stPnNrX3JtZW1fYWxsb2MpOwogfQogCitzdHJ1Y3Qgc2N0cF9pbnB1dF9jYiB7CisJdW5pb24geworCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisJCXN0cnVjdCBpbmV0Nl9za2JfcGFybQloNjsKKyNlbmRpZgorCX0gaGVhZGVyOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKK307CisjZGVmaW5lIFNDVFBfSU5QVVRfQ0IoX19za2IpCSgoc3RydWN0IHNjdHBfaW5wdXRfY2IgKikmKChfX3NrYiktPmNiWzBdKSkKKwogLyoKICAqIFRoaXMgaXMgdGhlIHJvdXRpbmUgd2hpY2ggSVAgY2FsbHMgd2hlbiByZWNlaXZpbmcgYW4gU0NUUCBwYWNrZXQuCiAgKi8KQEAgLTI0Myw2ICsyNTQsNyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGRpc2NhcmRfcmVsZWFzZTsKIAl9CisJU0NUUF9JTlBVVF9DQihza2IpLT5jaHVuayA9IGNodW5rOwogCiAJc2N0cF9yY3Zfc2V0X293bmVyX3Ioc2tiLHNrKTsKIApAQCAtMjY1LDkgKzI3Nyw5IEBACiAJc2N0cF9iaF9sb2NrX3NvY2soc2spOwogCiAJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCi0JCXNrX2FkZF9iYWNrbG9nKHNrLCAoc3RydWN0IHNrX2J1ZmYgKikgY2h1bmspOworCQlza19hZGRfYmFja2xvZyhzaywgc2tiKTsKIAllbHNlCi0JCXNjdHBfYmFja2xvZ19yY3Yoc2ssIChzdHJ1Y3Qgc2tfYnVmZiAqKSBjaHVuayk7CisJCXNjdHBfYmFja2xvZ19yY3Yoc2ssIHNrYik7CiAKIAkvKiBSZWxlYXNlIHRoZSBzb2NrIGFuZCBhbnkgcmVmZXJlbmNlIGNvdW50cyB3ZSB0b29rIGluIHRoZQogCSAqIGxvb2t1cCBjYWxscy4KQEAgLTMwMiwxNCArMzE0LDggQEAKICAqLwogaW50IHNjdHBfYmFja2xvZ19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKLQlzdHJ1Y3Qgc2N0cF9pbnEgKmlucXVldWU7Ci0KLQkvKiBPbmUgZGF5IGNodW5rIHdpbGwgbGl2ZSBpbnNpZGUgdGhlIHNrYiwgYnV0IGZvcgotCSAqIG5vdyB0aGlzIHdvcmtzLgotCSAqLwotCWNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopIHNrYjsKLQlpbnF1ZXVlID0gJmNodW5rLT5yY3ZyLT5pbnF1ZXVlOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IFNDVFBfSU5QVVRfQ0Ioc2tiKS0+Y2h1bms7CisJc3RydWN0IHNjdHBfaW5xICppbnF1ZXVlID0gJmNodW5rLT5yY3ZyLT5pbnF1ZXVlOwogCiAJc2N0cF9pbnFfcHVzaChpbnF1ZXVlLCBjaHVuayk7CiAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaW5xdWV1ZS5jIGIvbmV0L3NjdHAvaW5xdWV1ZS5jCmluZGV4IGNlZGY0MzUuLjJkMzM5MjIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucXVldWUuYworKysgYi9uZXQvc2N0cC9pbnF1ZXVlLmMKQEAgLTUwLDcgKzUwLDcgQEAKIC8qIEluaXRpYWxpemUgYW4gU0NUUCBpbnF1ZXVlLiAgKi8KIHZvaWQgc2N0cF9pbnFfaW5pdChzdHJ1Y3Qgc2N0cF9pbnEgKnF1ZXVlKQogewotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlLT5pbik7CisJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlLT5pbl9jaHVua19saXN0KTsKIAlxdWV1ZS0+aW5fcHJvZ3Jlc3MgPSBOVUxMOwogCiAJLyogQ3JlYXRlIGEgdGFzayBmb3IgZGVsaXZlcmluZyBkYXRhLiAgKi8KQEAgLTYyLDExICs2MiwxMyBAQAogLyogUmVsZWFzZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhbiBTQ1RQIGlucXVldWUuICAqLwogdm9pZCBzY3RwX2lucV9mcmVlKHN0cnVjdCBzY3RwX2lucSAqcXVldWUpCiB7Ci0Jc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgKnRtcDsKIAogCS8qIEVtcHR5IHRoZSBxdWV1ZS4gICovCi0Jd2hpbGUgKChjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKSBza2JfZGVxdWV1ZSgmcXVldWUtPmluKSkgIT0gTlVMTCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2h1bmssIHRtcCwgJnF1ZXVlLT5pbl9jaHVua19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKIAkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwl9CiAKIAkvKiBJZiB0aGVyZSBpcyBhIHBhY2tldCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgd29ya2VkIG9uLAogCSAqIGZyZWUgaXQgYXMgd2VsbC4KQEAgLTkyLDcgKzk0LDcgQEAKIAkgKiBFdmVudHVhbGx5LCB3ZSBzaG91bGQgY2xlYW4gdXAgaW5xdWV1ZSB0byBub3QgcmVseQogCSAqIG9uIHRoZSBCSCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcy4KIAkgKi8KLQlza2JfcXVldWVfdGFpbCgmKHEtPmluKSwgKHN0cnVjdCBza19idWZmICopIHBhY2tldCk7CisJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCAmcS0+aW5fY2h1bmtfbGlzdCk7CiAJcS0+aW1tZWRpYXRlLmZ1bmMocS0+aW1tZWRpYXRlLmRhdGEpOwogfQogCkBAIC0xMzEsMTIgKzEzMywxNiBAQAogCiAJLyogRG8gd2UgbmVlZCB0byB0YWtlIHRoZSBuZXh0IHBhY2tldCBvdXQgb2YgdGhlIHF1ZXVlIHRvIHByb2Nlc3M/ICovCiAJaWYgKCFjaHVuaykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwogCQkvKiBJcyB0aGUgcXVldWUgZW1wdHk/ICAqLwotICAgICAgICAJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcXVldWUtPmluKSkKKwkJaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5pbl9jaHVua19saXN0KSkKIAkJCXJldHVybiBOVUxMOwogCisJCWVudHJ5ID0gcXVldWUtPmluX2NodW5rX2xpc3QubmV4dDsKIAkJY2h1bmsgPSBxdWV1ZS0+aW5fcHJvZ3Jlc3MgPQotCQkJKHN0cnVjdCBzY3RwX2NodW5rICopIHNrYl9kZXF1ZXVlKCZxdWV1ZS0+aW4pOworCQkJbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNjdHBfY2h1bmssIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KGVudHJ5KTsKIAogCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBjaHVuayBpbiB0aGUgcGFja2V0LiAgKi8KIAkJY2h1bmstPnNpbmdsZXRvbiA9IDE7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRwdXQuYyBiL25ldC9zY3RwL291dHB1dC5jCmluZGV4IDg0YjViMzcuLjkzMTM3MTYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL291dHB1dC5jCisrKyBiL25ldC9zY3RwL291dHB1dC5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAlwYWNrZXQtPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKIAlwYWNrZXQtPnNvdXJjZV9wb3J0ID0gc3BvcnQ7CiAJcGFja2V0LT5kZXN0aW5hdGlvbl9wb3J0ID0gZHBvcnQ7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcGFja2V0LT5jaHVua3MpOworCUlOSVRfTElTVF9IRUFEKCZwYWNrZXQtPmNodW5rX2xpc3QpOwogCWlmIChhc29jKSB7CiAJCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhhc29jLT5iYXNlLnNrKTsJCiAJCW92ZXJoZWFkID0gc3AtPnBmLT5hZi0+bmV0X2hlYWRlcl9sZW47IApAQCAtMTI5LDEyICsxMjksMTQgQEAKIC8qIEZyZWUgYSBwYWNrZXQuICAqLwogdm9pZCBzY3RwX3BhY2tldF9mcmVlKHN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0KQogewotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssICp0bXA7CiAKIAlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IHBhY2tldDolcFxuIiwgX19GVU5DVElPTl9fLCBwYWNrZXQpOwogCi0gICAgICAgIHdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKilfX3NrYl9kZXF1ZXVlKCZwYWNrZXQtPmNodW5rcykpICE9IE5VTEwpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZwYWNrZXQtPmNodW5rX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY2h1bmstPmxpc3QpOwogCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCX0KIAogCWlmIChwYWNrZXQtPm1hbGxvY2VkKQogCQlrZnJlZShwYWNrZXQpOwpAQCAtMjc2LDcgKzI3OCw3IEBACiAJCXBhY2tldC0+aGFzX3NhY2sgPSAxOwogCiAJLyogSXQgaXMgT0sgdG8gc2VuZCB0aGlzIGNodW5rLiAgKi8KLQlfX3NrYl9xdWV1ZV90YWlsKCZwYWNrZXQtPmNodW5rcywgKHN0cnVjdCBza19idWZmICopY2h1bmspOworCWxpc3RfYWRkX3RhaWwoJmNodW5rLT5saXN0LCAmcGFja2V0LT5jaHVua19saXN0KTsKIAlwYWNrZXQtPnNpemUgKz0gY2h1bmtfbGVuOwogCWNodW5rLT50cmFuc3BvcnQgPSBwYWNrZXQtPnRyYW5zcG9ydDsKIGZpbmlzaDoKQEAgLTI5NSw3ICsyOTcsNyBAQAogCXN0cnVjdCBzY3RwaGRyICpzaDsKIAlfX3UzMiBjcmMzMjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCAqdG1wOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgZXJyID0gMDsKIAlpbnQgcGFkZGluZzsJCS8qIEhvdyBtdWNoIHBhZGRpbmcgZG8gd2UgbmVlZD8gICovCkBAIC0zMDUsMTEgKzMwNywxMSBAQAogCVNDVFBfREVCVUdfUFJJTlRLKCIlczogcGFja2V0OiVwXG4iLCBfX0ZVTkNUSU9OX18sIHBhY2tldCk7CiAKIAkvKiBEbyBOT1QgZ2VuZXJhdGUgYSBjaHVua2xlc3MgcGFja2V0LiAqLwotCWNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopc2tiX3BlZWsoJnBhY2tldC0+Y2h1bmtzKTsKLQlpZiAodW5saWtlbHkoIWNodW5rKSkKKwlpZiAobGlzdF9lbXB0eSgmcGFja2V0LT5jaHVua19saXN0KSkKIAkJcmV0dXJuIGVycjsKIAogCS8qIFNldCB1cCBjb252ZW5pZW5jZSB2YXJpYWJsZXMuLi4gKi8KKwljaHVuayA9IGxpc3RfZW50cnkocGFja2V0LT5jaHVua19saXN0Lm5leHQsIHN0cnVjdCBzY3RwX2NodW5rLCBsaXN0KTsKIAlzayA9IGNodW5rLT5za2ItPnNrOwogCiAJLyogQWxsb2NhdGUgdGhlIG5ldyBza2IuICAqLwpAQCAtMzcwLDcgKzM3Miw4IEBACiAJICogW1RoaXMgd2hvbGUgY29tbWVudCBleHBsYWlucyBXT1JEX1JPVU5EKCkgYmVsb3cuXQogCSAqLwogCVNDVFBfREVCVUdfUFJJTlRLKCIqKipzY3RwX3RyYW5zbWl0X3BhY2tldCoqKlxuIik7Ci0Jd2hpbGUgKChjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKV9fc2tiX2RlcXVldWUoJnBhY2tldC0+Y2h1bmtzKSkgIT0gTlVMTCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmcGFja2V0LT5jaHVua19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKIAkJaWYgKHNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykpIHsKIAogCQkJaWYgKCFjaHVuay0+aGFzX3RzbikgewpAQCAtNTExLDcgKzUxNCw4IEBACiAJICogd2lsbCBnZXQgcmVzZW50IG9yIGRyb3BwZWQgbGF0ZXIuCiAJICovCiAKLQl3aGlsZSAoKGNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopX19za2JfZGVxdWV1ZSgmcGFja2V0LT5jaHVua3MpKSAhPSBOVUxMKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZwYWNrZXQtPmNodW5rX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY2h1bmstPmxpc3QpOwogCQlpZiAoIXNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykpCiAgICAgCQkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCA0ZWI4MWExLi5lZmI3MmZhIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTc1LDcgKzc1LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX291dHFfaGVhZF9kYXRhKHN0cnVjdCBzY3RwX291dHEgKnEsCiAJCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaCkKIHsKLQlfX3NrYl9xdWV1ZV9oZWFkKCZxLT5vdXQsIChzdHJ1Y3Qgc2tfYnVmZiAqKWNoKTsKKwlsaXN0X2FkZCgmY2gtPmxpc3QsICZxLT5vdXRfY2h1bmtfbGlzdCk7CiAJcS0+b3V0X3FsZW4gKz0gY2gtPnNrYi0+bGVuOwogCXJldHVybjsKIH0KQEAgLTgzLDE3ICs4MywyMiBAQAogLyogVGFrZSBkYXRhIGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfb3V0cV9kZXF1ZXVlX2RhdGEoc3RydWN0IHNjdHBfb3V0cSAqcSkKIHsKLQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2g7Ci0JY2ggPSAoc3RydWN0IHNjdHBfY2h1bmsgKilfX3NrYl9kZXF1ZXVlKCZxLT5vdXQpOwotCWlmIChjaCkKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2ggPSBOVUxMOworCisJaWYgKCFsaXN0X2VtcHR5KCZxLT5vdXRfY2h1bmtfbGlzdCkpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSBxLT5vdXRfY2h1bmtfbGlzdC5uZXh0OworCisJCWNoID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNjdHBfY2h1bmssIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KGVudHJ5KTsKIAkJcS0+b3V0X3FsZW4gLT0gY2gtPnNrYi0+bGVuOworCX0KIAlyZXR1cm4gY2g7CiB9CiAvKiBBZGQgZGF0YSBjaHVuayB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZS4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX291dHFfdGFpbF9kYXRhKHN0cnVjdCBzY3RwX291dHEgKnEsCiAJCQkJICAgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaCkKIHsKLQlfX3NrYl9xdWV1ZV90YWlsKCZxLT5vdXQsIChzdHJ1Y3Qgc2tfYnVmZiAqKWNoKTsKKwlsaXN0X2FkZF90YWlsKCZjaC0+bGlzdCwgJnEtPm91dF9jaHVua19saXN0KTsKIAlxLT5vdXRfcWxlbiArPSBjaC0+c2tiLT5sZW47CiAJcmV0dXJuOwogfQpAQCAtMTk3LDggKzIwMiw4IEBACiB2b2lkIHNjdHBfb3V0cV9pbml0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBzdHJ1Y3Qgc2N0cF9vdXRxICpxKQogewogCXEtPmFzb2MgPSBhc29jOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnEtPm91dCk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcS0+Y29udHJvbCk7CisJSU5JVF9MSVNUX0hFQUQoJnEtPm91dF9jaHVua19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcS0+Y29udHJvbF9jaHVua19saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcS0+cmV0cmFuc21pdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnEtPnNhY2tlZCk7CiAJSU5JVF9MSVNUX0hFQUQoJnEtPmFiYW5kb25lZCk7CkBAIC0yMTcsNyArMjIyLDcgQEAKIHsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsY2h1bmssICpwb3MsICp0ZW1wOwotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssICp0bXA7CiAKIAkvKiBUaHJvdyBhd2F5IHVuYWNrbm93bGVkZ2VkIGNodW5rcy4gKi8KIAlsaXN0X2Zvcl9lYWNoKHBvcywgJnEtPmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgewpAQCAtMjY5LDggKzI3NCwxMCBAQAogCXEtPmVycm9yID0gMDsKIAogCS8qIFRocm93IGF3YXkgYW55IGxlZnRvdmVyIGNvbnRyb2wgY2h1bmtzLiAqLwotCXdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKikgc2tiX2RlcXVldWUoJnEtPmNvbnRyb2wpKSAhPSBOVUxMKQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmcS0+Y29udHJvbF9jaHVua19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKIAkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwl9CiB9CiAKIC8qIEZyZWUgdGhlIG91dHF1ZXVlIHN0cnVjdHVyZSBhbmQgYW55IHJlbGF0ZWQgcGVuZGluZyBjaHVua3MuICAqLwpAQCAtMzMzLDcgKzM0MCw3IEBACiAJCQlicmVhazsKIAkJfTsKIAl9IGVsc2UgewotCQlfX3NrYl9xdWV1ZV90YWlsKCZxLT5jb250cm9sLCAoc3RydWN0IHNrX2J1ZmYgKikgY2h1bmspOworCQlsaXN0X2FkZF90YWlsKCZjaHVuay0+bGlzdCwgJnEtPmNvbnRyb2xfY2h1bmtfbGlzdCk7CiAJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVENUUkxDSFVOS1MpOwogCX0KIApAQCAtNjUwLDEwICs2NTcsOSBAQAogCV9fdTE2IHNwb3J0ID0gYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydDsKIAlfX3UxNiBkcG9ydCA9IGFzb2MtPnBlZXIucG9ydDsKIAlfX3UzMiB2dGFnID0gYXNvYy0+cGVlci5pLmluaXRfdGFnOwotCXN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKm5ld190cmFuc3BvcnQ7Ci0Jc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgKnRtcDsKIAlzY3RwX3htaXRfdCBzdGF0dXM7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgc3RhcnRfdGltZXIgPSAwOwpAQCAtNjc1LDggKzY4MSw5IEBACiAJICogICAuLi4KIAkgKi8KIAotCXF1ZXVlID0gJnEtPmNvbnRyb2w7Ci0Jd2hpbGUgKChjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKXNrYl9kZXF1ZXVlKHF1ZXVlKSkgIT0gTlVMTCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmcS0+Y29udHJvbF9jaHVua19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKKwogCQkvKiBQaWNrIHRoZSByaWdodCB0cmFuc3BvcnQgdG8gdXNlLiAqLwogCQluZXdfdHJhbnNwb3J0ID0gY2h1bmstPnRyYW5zcG9ydDsKIApAQCAtODE0LDggKzgyMSw2IEBACiAKIAkJLyogRmluYWxseSwgdHJhbnNtaXQgbmV3IHBhY2tldHMuICAqLwogCQlzdGFydF90aW1lciA9IDA7Ci0JCXF1ZXVlID0gJnEtPm91dDsKLQogCQl3aGlsZSAoKGNodW5rID0gc2N0cF9vdXRxX2RlcXVldWVfZGF0YShxKSkgIT0gTlVMTCkgewogCQkJLyogUkZDIDI5NjAgNi41IEV2ZXJ5IERBVEEgY2h1bmsgTVVTVCBjYXJyeSBhIHZhbGlkCiAJCQkgKiBzdHJlYW0gaWRlbnRpZmllci4KQEAgLTExNDksOCArMTE1NCw5IEBACiAJLyogU2VlIGlmIGFsbCBjaHVua3MgYXJlIGFja2VkLgogCSAqIE1ha2Ugc3VyZSB0aGUgZW1wdHkgcXVldWUgaGFuZGxlciB3aWxsIGdldCBydW4gbGF0ZXIuCiAJICovCi0JcS0+ZW1wdHkgPSBza2JfcXVldWVfZW1wdHkoJnEtPm91dCkgJiYgc2tiX3F1ZXVlX2VtcHR5KCZxLT5jb250cm9sKSAmJgotCQkJbGlzdF9lbXB0eSgmcS0+cmV0cmFuc21pdCk7CisJcS0+ZW1wdHkgPSAobGlzdF9lbXB0eSgmcS0+b3V0X2NodW5rX2xpc3QpICYmCisJCSAgICBsaXN0X2VtcHR5KCZxLT5jb250cm9sX2NodW5rX2xpc3QpICYmCisJCSAgICBsaXN0X2VtcHR5KCZxLT5yZXRyYW5zbWl0KSk7CiAJaWYgKCFxLT5lbXB0eSkKIAkJZ290byBmaW5pc2g7CiAKQEAgLTE2NzksOSArMTY4NSw5IEBACiAJCWlmIChUU05fbHRlKHRzbiwgY3RzbikpIHsKIAkJCWxpc3RfZGVsX2luaXQobGNodW5rKTsKIAkJCWlmICghY2h1bmstPnRzbl9nYXBfYWNrZWQpIHsKLQkJCWNodW5rLT50cmFuc3BvcnQtPmZsaWdodF9zaXplIC09Ci0JCQkJCQkgc2N0cF9kYXRhX3NpemUoY2h1bmspOwotCQkJcS0+b3V0c3RhbmRpbmdfYnl0ZXMgLT0gc2N0cF9kYXRhX3NpemUoY2h1bmspOworCQkJCWNodW5rLT50cmFuc3BvcnQtPmZsaWdodF9zaXplIC09CisJCQkJCXNjdHBfZGF0YV9zaXplKGNodW5rKTsKKwkJCQlxLT5vdXRzdGFuZGluZ19ieXRlcyAtPSBzY3RwX2RhdGFfc2l6ZShjaHVuayk7CiAJCQl9CiAJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOwogCQl9IGVsc2UgewpAQCAtMTcyOSw3ICsxNzM1LDcgQEAKIAkJCQkJICAgICAgbnNraXBzLCAmZnRzbl9za2lwX2FyclswXSk7IAogCiAJaWYgKGZ0c25fY2h1bmspIHsKLQkJX19za2JfcXVldWVfdGFpbCgmcS0+Y29udHJvbCwgKHN0cnVjdCBza19idWZmICopZnRzbl9jaHVuayk7CisJCWxpc3RfYWRkX3RhaWwoJmZ0c25fY2h1bmstPmxpc3QsICZxLT5jb250cm9sX2NodW5rX2xpc3QpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm90b2NvbC5jIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwppbmRleCBlN2YzN2ZhLi5jZTkyNDVlIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9wcm90b2NvbC5jCisrKyBiL25ldC9zY3RwL3Byb3RvY29sLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCiAvKiBDb3B5IHRoZSBsb2NhbCBhZGRyZXNzZXMgd2hpY2ggYXJlIHZhbGlkIGZvciAnc2NvcGUnIGludG8gJ2JwJy4gICovCiBpbnQgc2N0cF9jb3B5X2xvY2FsX2FkZHJfbGlzdChzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBzY3RwX3Njb3BlX3Qgc2NvcGUsCi0JCQkgICAgICBpbnQgZ2ZwLCBpbnQgY29weV9mbGFncykKKwkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsIGludCBjb3B5X2ZsYWdzKQogewogCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyOwogCWludCBlcnJvciA9IDA7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKaW5kZXggNWJhZWQ5Yi4uMDBkMzJiNyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCisrKyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwpAQCAtNzgsNyArNzgsNyBAQAogc3RhdGljIGludCBzY3RwX3Byb2Nlc3NfcGFyYW0oc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkgICAgICB1bmlvbiBzY3RwX3BhcmFtcyBwYXJhbSwKIAkJCSAgICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGVlcl9hZGRyLAotCQkJICAgICAgaW50IGdmcCk7CisJCQkgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogLyogV2hhdCB3YXMgdGhlIGluYm91bmQgaW50ZXJmYWNlIGZvciB0aGlzIGNodW5rPyAqLwogaW50IHNjdHBfY2h1bmtfaWlmKGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKQEAgLTE3NCw3ICsxNzQsNyBAQAogICovCiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2luaXQoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnAsCi0JCQkgICAgIGludCBnZnAsIGludCB2cGFyYW1fbGVuKQorCQkJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLCBpbnQgdnBhcmFtX2xlbikKIHsKIAlzY3RwX2luaXRoZHJfdCBpbml0OwogCXVuaW9uIHNjdHBfcGFyYW1zIGFkZHJzOwpAQCAtMjYxLDcgKzI2MSw3IEBACiAKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfaW5pdF9hY2soY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQkJCQkgaW50IGdmcCwgaW50IHVua3BhcmFtX2xlbikKKwkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwgaW50IHVua3BhcmFtX2xlbikKIHsKIAlzY3RwX2luaXRoZHJfdCBpbml0YWNrOwogCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CkBAIC0xMDAzLDYgKzEwMDMsNyBAQAogCQlTQ1RQX0RFQlVHX1BSSU5USygiY2h1bmtpZnlpbmcgc2tiICVwIHcvbyBhbiBza1xuIiwgc2tiKTsKIAl9CiAKKwlJTklUX0xJU1RfSEVBRCgmcmV0dmFsLT5saXN0KTsKIAlyZXR2YWwtPnNrYgkJPSBza2I7CiAJcmV0dmFsLT5hc29jCQk9IChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqKWFzb2M7CiAJcmV0dmFsLT5yZXNlbnQgIAk9IDA7CkBAIC0xMTE2LDggKzExMTcsNyBAQAogLyogUG9zc2libHksIGZyZWUgdGhlIGNodW5rLiAgKi8KIHZvaWQgc2N0cF9jaHVua19mcmVlKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKIHsKLQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IG9uIGFueSBsaXN0LiAgKi8KLQlza2JfdW5saW5rKChzdHJ1Y3Qgc2tfYnVmZiAqKSBjaHVuayk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZjaHVuay0+bGlzdCkpOwogCWxpc3RfZGVsX2luaXQoJmNodW5rLT50cmFuc21pdHRlZF9saXN0KTsKIAogCS8qIFJlbGVhc2Ugb3VyIHJlZmVyZW5jZSBvbiB0aGUgbWVzc2FnZSB0cmFja2VyLiAqLwpAQCAtMTIzMyw3ICsxMjMzLDggQEAKIAogLyogQ3JlYXRlIGEgQ0xPU0VEIGFzc29jaWF0aW9uIHRvIHVzZSB3aXRoIGFuIGluY29taW5nIHBhY2tldC4gICovCiBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqc2N0cF9tYWtlX3RlbXBfYXNvYyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCi0JCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgaW50IGdmcCkKKwkJCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMzQ4LDcgKzEzNDksNyBAQAogc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnNjdHBfdW5wYWNrX2Nvb2tpZSgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCiAJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCi0Jc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBpbnQgZ2ZwLAorCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKIAlpbnQgKmVycm9yLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqKmVycnApCiB7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnJldHZhbCA9IE5VTEw7CkBAIC0xODEyLDcgKzE4MTMsNyBAQAogICovCiBpbnQgc2N0cF9wcm9jZXNzX2luaXQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIHNjdHBfY2lkX3QgY2lkLAogCQkgICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKnBlZXJfYWRkciwKLQkJICAgICAgc2N0cF9pbml0X2NodW5rX3QgKnBlZXJfaW5pdCwgaW50IGdmcCkKKwkJICAgICAgc2N0cF9pbml0X2NodW5rX3QgKnBlZXJfaW5pdCwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAl1bmlvbiBzY3RwX3BhcmFtcyBwYXJhbTsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKQEAgLTE5ODMsNyArMTk4NCw3IEBACiBzdGF0aWMgaW50IHNjdHBfcHJvY2Vzc19wYXJhbShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCSAgICAgIHVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtLAogCQkJICAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwZWVyX2FkZHIsCi0JCQkgICAgICBpbnQgZ2ZwKQorCQkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAl1bmlvbiBzY3RwX2FkZHIgYWRkcjsKIAlpbnQgaTsKQEAgLTI3MzksOCArMjc0MCwxMiBAQAogCWFzb2MtPmFkZGlwX2xhc3RfYXNjb25mID0gTlVMTDsKIAogCS8qIFNlbmQgdGhlIG5leHQgYXNjb25mIGNodW5rIGZyb20gdGhlIGFkZGlwIGNodW5rIHF1ZXVlLiAqLwotCWFzY29uZiA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKV9fc2tiX2RlcXVldWUoJmFzb2MtPmFkZGlwX2NodW5rcyk7Ci0JaWYgKGFzY29uZikgeworCWlmICghbGlzdF9lbXB0eSgmYXNvYy0+YWRkaXBfY2h1bmtfbGlzdCkpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSBhc29jLT5hZGRpcF9jaHVua19saXN0Lm5leHQ7CisJCWFzY29uZiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBzY3RwX2NodW5rLCBsaXN0KTsKKworCQlsaXN0X2RlbF9pbml0KGVudHJ5KTsKKwogCQkvKiBIb2xkIHRoZSBjaHVuayB1bnRpbCBhbiBBU0NPTkZfQUNLIGlzIHJlY2VpdmVkLiAqLwogCQlzY3RwX2NodW5rX2hvbGQoYXNjb25mKTsKIAkJaWYgKHNjdHBfcHJpbWl0aXZlX0FTQ09ORihhc29jLCBhc2NvbmYpKQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCmluZGV4IDc3ODYzOWQuLjM5Yzk3MGIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYworKysgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKQEAgLTYzLDcgKzYzLDcgQEAKIAkJCQl2b2lkICpldmVudF9hcmcsCiAJCQkgCXNjdHBfZGlzcG9zaXRpb25fdCBzdGF0dXMsCiAJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAotCQkJCWludCBnZnApOworCQkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogc3RhdGljIGludCBzY3RwX3NpZGVfZWZmZWN0cyhzY3RwX2V2ZW50X3QgZXZlbnRfdHlwZSwgc2N0cF9zdWJ0eXBlX3Qgc3VidHlwZSwKIAkJCSAgICAgc2N0cF9zdGF0ZV90IHN0YXRlLAogCQkJICAgICBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCkBAIC03MSw3ICs3MSw3IEBACiAJCQkgICAgIHZvaWQgKmV2ZW50X2FyZywKIAkJCSAgICAgc2N0cF9kaXNwb3NpdGlvbl90IHN0YXR1cywKIAkJCSAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAotCQkJICAgICBpbnQgZ2ZwKTsKKwkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSGVscGVyIGZ1bmN0aW9ucwpAQCAtNDk3LDcgKzQ5Nyw4IEBACiBzdGF0aWMgaW50IHNjdHBfY21kX3Byb2Nlc3NfaW5pdChzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMsCiAJCQkJIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCSBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCQkJIHNjdHBfaW5pdF9jaHVua190ICpwZWVyX2luaXQsIGludCBnZnApCisJCQkJIHNjdHBfaW5pdF9jaHVua190ICpwZWVyX2luaXQsCisJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJaW50IGVycm9yOwogCkBAIC04NTIsNyArODUzLDcgQEAKIAkgICAgICAgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAogCSAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkgICAgICAgdm9pZCAqZXZlbnRfYXJnLAotCSAgICAgICBpbnQgZ2ZwKQorCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXNjdHBfY21kX3NlcV90IGNvbW1hbmRzOwogCWNvbnN0IHNjdHBfc21fdGFibGVfZW50cnlfdCAqc3RhdGVfZm47CkBAIC04OTcsNyArODk4LDcgQEAKIAkJCSAgICAgdm9pZCAqZXZlbnRfYXJnLAogCQkJICAgICBzY3RwX2Rpc3Bvc2l0aW9uX3Qgc3RhdHVzLAogCQkJICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMsCi0JCQkgICAgIGludCBnZnApCisJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJaW50IGVycm9yOwogCkBAIC05ODUsNyArOTg2LDcgQEAKIAkJCQl2b2lkICpldmVudF9hcmcsCiAJCQkgCXNjdHBfZGlzcG9zaXRpb25fdCBzdGF0dXMsCiAJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAotCQkJCWludCBnZnApCisJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCWludCBmb3JjZTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggYWFkNTVkYy4uMDkxYTY2ZiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTQwNiw3ICs0MDYsNyBAQAogCSAqIHRyYW5zbWlzc2lvbi4KIAkgKi8JCiAJaWYgKGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mKSB7Ci0JCV9fc2tiX3F1ZXVlX3RhaWwoJmFzb2MtPmFkZGlwX2NodW5rcywgKHN0cnVjdCBza19idWZmICopY2h1bmspOworCQlsaXN0X2FkZF90YWlsKCZjaHVuay0+bGlzdCwgJmFzb2MtPmFkZGlwX2NodW5rX2xpc3QpOwogCQlnb3RvIG91dDsJCiAJfQogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zc25tYXAuYyBiL25ldC9zY3RwL3Nzbm1hcC5jCmluZGV4IGU2MjdkMmIuLjI1MDM3ZGEgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Nzbm1hcC5jCisrKyBiL25ldC9zY3RwL3Nzbm1hcC5jCkBAIC01Nyw3ICs1Nyw4IEBACiAvKiBDcmVhdGUgYSBuZXcgc2N0cF9zc25tYXAuCiAgKiBBbGxvY2F0ZSByb29tIHRvIHN0b3JlIGF0IGxlYXN0ICdsZW4nIGNvbnRpZ3VvdXMgVFNOcy4KICAqLwotc3RydWN0IHNjdHBfc3NubWFwICpzY3RwX3Nzbm1hcF9uZXcoX191MTYgaW4sIF9fdTE2IG91dCwgaW50IGdmcCkKK3N0cnVjdCBzY3RwX3Nzbm1hcCAqc2N0cF9zc25tYXBfbmV3KF9fdTE2IGluLCBfX3UxNiBvdXQsCisJCQkJICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfc3NubWFwICpyZXR2YWw7CiAJaW50IHNpemU7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC90cmFuc3BvcnQuYyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCmluZGV4IGE2M2I2OTEuLmQyZjA0ZWIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3RyYW5zcG9ydC5jCisrKyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCkBAIC01Nyw3ICs1Nyw3IEBACiAvKiBJbml0aWFsaXplIGEgbmV3IHRyYW5zcG9ydCBmcm9tIHByb3ZpZGVkIG1lbW9yeS4gICovCiBzdGF0aWMgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX3RyYW5zcG9ydF9pbml0KHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqcGVlciwKIAkJCQkJCSAgY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyLAotCQkJCQkJICBpbnQgZ2ZwKQorCQkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCS8qIENvcHkgaW4gdGhlIGFkZHJlc3MuICAqLwogCXBlZXItPmlwYWRkciA9ICphZGRyOwpAQCAtMTIxLDcgKzEyMSw4IEBACiB9CiAKIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHRyYW5zcG9ydC4gICovCi1zdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfdHJhbnNwb3J0X25ldyhjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIGludCBnZnApCitzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfdHJhbnNwb3J0X25ldyhjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCisJCQkJCSAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKICAgICAgICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscGV2ZW50LmMgYi9uZXQvc2N0cC91bHBldmVudC5jCmluZGV4IDE3ZDBmZjUuLjBhYmQ1MTAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscGV2ZW50LmMKKysrIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpAQCAtNzQsNyArNzQsNyBAQAogCiAvKiBDcmVhdGUgYSBuZXcgc2N0cF91bHBldmVudC4gICovCiBTQ1RQX1NUQVRJQyBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9uZXcoaW50IHNpemUsIGludCBtc2dfZmxhZ3MsCi0JCQkJCQkgICAgaW50IGdmcCkKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTM2LDcgKzEzNiw3IEBACiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAgKnNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoCiAJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJX191MTYgZmxhZ3MsIF9fdTE2IHN0YXRlLCBfX3UxNiBlcnJvciwgX191MTYgb3V0Ym91bmQsCi0JX191MTYgaW5ib3VuZCwgaW50IGdmcCkKKwlfX3UxNiBpbmJvdW5kLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKnNhYzsKQEAgLTIzNyw3ICsyMzcsNyBAQAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9wZWVyX2FkZHJfY2hhbmdlKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphYWRkciwKLQlpbnQgZmxhZ3MsIGludCBzdGF0ZSwgaW50IGVycm9yLCBpbnQgZ2ZwKQorCWludCBmbGFncywgaW50IHN0YXRlLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX3BhZGRyX2NoYW5nZSAgKnNwYzsKQEAgLTM1MCw3ICszNTAsNyBAQAogICovCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3JlbW90ZV9lcnJvcigKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCV9fdTE2IGZsYWdzLCBpbnQgZ2ZwKQorCV9fdTE2IGZsYWdzLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2N0cF9yZW1vdGVfZXJyb3IgKnNyZTsKQEAgLTQ0OCw3ICs0NDgsNyBAQAogICovCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3NlbmRfZmFpbGVkKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JX191MTYgZmxhZ3MsIF9fdTMyIGVycm9yLCBpbnQgZ2ZwKQorCV9fdTE2IGZsYWdzLCBfX3UzMiBlcnJvciwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQgKnNzZjsKQEAgLTU1Nyw3ICs1NTcsNyBAQAogICovCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3NodXRkb3duX2V2ZW50KAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAotCV9fdTE2IGZsYWdzLCBpbnQgZ2ZwKQorCV9fdTE2IGZsYWdzLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2N0cF9zaHV0ZG93bl9ldmVudCAqc3NlOwpAQCAtNjIwLDcgKzYyMCw3IEBACiAgKiA1LjMuMS42IFNDVFBfQURBUFRJT05fSU5ESUNBVElPTgogICovCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX2FkYXB0aW9uX2luZGljYXRpb24oCi0JY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIGludCBnZnApCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX2FkYXB0aW9uX2V2ZW50ICpzYWk7CkBAIC02NTcsNyArNjU3LDcgQEAKICAqLwogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9yY3Ztc2coc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCQkJCQlpbnQgZ2ZwKQorCQkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQgPSBOVUxMOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC03MTgsNyArNzE4LDggQEAKICAqICAgdmFyaW91cyBldmVudHMuCiAgKi8KIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcGRhcGkoCi0JY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIF9fdTMyIGluZGljYXRpb24sIGludCBnZnApCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIF9fdTMyIGluZGljYXRpb24sCisJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfcGRhcGlfZXZlbnQgKnBkOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdWxwcXVldWUuYyBiL25ldC9zY3RwL3VscHF1ZXVlLmMKaW5kZXggZDVkZDJjZi4uOGJiYzI3OSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdWxwcXVldWUuYworKysgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogLyogUHJvY2VzcyBhbiBpbmNvbWluZyBEQVRBIGNodW5rLiAgKi8KIGludCBzY3RwX3VscHFfdGFpbF9kYXRhKHN0cnVjdCBzY3RwX3VscHEgKnVscHEsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQkJCWludCBnZnApCisJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBza19idWZmX2hlYWQgdGVtcDsKIAlzY3RwX2RhdGFfY2h1bmtfdCAqaGRyOwpAQCAtNzc4LDcgKzc3OCw4IEBACiAKIC8qIFBhcnRpYWwgZGVsaXZlciB0aGUgZmlyc3QgbWVzc2FnZSBhcyB0aGVyZSBpcyBwcmVzc3VyZSBvbiByd25kLiAqLwogdm9pZCBzY3RwX3VscHFfcGFydGlhbF9kZWxpdmVyeShzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLAotCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgaW50IGdmcCkKKwkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CkBAIC04MDIsNyArODAzLDcgQEAKIAogLyogUmVuZWdlIHNvbWUgcGFja2V0cyB0byBtYWtlIHJvb20gZm9yIGFuIGluY29taW5nIGNodW5rLiAgKi8KIHZvaWQgc2N0cF91bHBxX3JlbmVnZShzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCSAgICAgIGludCBnZnApCisJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAJX191MTYgbmVlZGVkLCBmcmVlZDsKQEAgLTg0MSw3ICs4NDIsNyBAQAogLyogTm90aWZ5IHRoZSBhcHBsaWNhdGlvbiBpZiBhbiBhc3NvY2lhdGlvbiBpcyBhYm9ydGVkIGFuZCBpbgogICogcGFydGlhbCBkZWxpdmVyeSBtb2RlLiAgU2VuZCB1cCBhbnkgcGVuZGluZyByZWNlaXZlZCBtZXNzYWdlcy4KICAqLwotdm9pZCBzY3RwX3VscHFfYWJvcnRfcGQoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwgaW50IGdmcCkKK3ZvaWQgc2N0cF91bHBxX2Fib3J0X3BkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ID0gTlVMTDsKIAlzdHJ1Y3Qgc29jayAqc2s7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnQuYyBiL25ldC9zdW5ycGMveHBydC5jCmluZGV4IDI2OWYyMTcuLjNjNjU0ZTAgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydC5jCisrKyBiL25ldC9zdW5ycGMveHBydC5jCkBAIC0xNDUsOCArMTQ1LDYgQEAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChYUFJUX0xPQ0tFRCwgJnhwcnQtPnNvY2tzdGF0ZSkpIHsKIAkJaWYgKHRhc2sgPT0geHBydC0+c25kX3Rhc2spCiAJCQlyZXR1cm4gMTsKLQkJaWYgKHRhc2sgPT0gTlVMTCkKLQkJCXJldHVybiAwOwogCQlnb3RvIG91dF9zbGVlcDsKIAl9CiAJaWYgKHhwcnQtPm5vY29uZyB8fCBfX3hwcnRfZ2V0X2NvbmcoeHBydCwgdGFzaykpIHsKZGlmZiAtLWdpdCBhL25ldC91bml4L0tjb25maWcgYi9uZXQvdW5peC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjk3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdW5peC9LY29uZmlnCkBAIC0wLDAgKzEsMjEgQEAKKyMKKyMgVW5peCBEb21haW4gU29ja2V0cworIworCitjb25maWcgVU5JWAorCXRyaXN0YXRlICJVbml4IGRvbWFpbiBzb2NrZXRzIgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBpbmNsdWRlIHN1cHBvcnQgZm9yIFVuaXggZG9tYWluIHNvY2tldHM7CisJICBzb2NrZXRzIGFyZSB0aGUgc3RhbmRhcmQgVW5peCBtZWNoYW5pc20gZm9yIGVzdGFibGlzaGluZyBhbmQKKwkgIGFjY2Vzc2luZyBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgTWFueSBjb21tb25seSB1c2VkIHByb2dyYW1zIHN1Y2ggYXMKKwkgIHRoZSBYIFdpbmRvdyBzeXN0ZW0gYW5kIHN5c2xvZyB1c2UgdGhlc2Ugc29ja2V0cyBldmVuIGlmIHlvdXIKKwkgIG1hY2hpbmUgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgbmV0d29yay4gIFVubGVzcyB5b3UgYXJlIHdvcmtpbmcgb24KKwkgIGFuIGVtYmVkZGVkIHN5c3RlbSBvciBzb21ldGhpbmcgc2ltaWxhciwgeW91IHRoZXJlZm9yZSBkZWZpbml0ZWx5CisJICB3YW50IHRvIHNheSBZIGhlcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHVuaXguICBOb3RlIHRoYXQgc2V2ZXJhbCBpbXBvcnRhbnQgc2VydmljZXMgd29uJ3Qgd29yaworCSAgY29ycmVjdGx5IGlmIHlvdSBzYXkgTSBoZXJlIGFuZCB0aGVuIG5lZ2xlY3QgdG8gbG9hZCB0aGUgbW9kdWxlLgorCisJICBTYXkgWSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmMgYi9uZXQvdW5peC9hZl91bml4LmMKaW5kZXggYzQyMGViYS4uZDQwM2UzNCAxMDA2NDQKLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5jCisrKyBiL25ldC91bml4L2FmX3VuaXguYwpAQCAtMzAyLDcgKzMwMiw3IEBACiAgKiBtYXkgcmVjZWl2ZSBtZXNzYWdlcyBvbmx5IGZyb20gdGhhdCBwZWVyLiAqLwogc3RhdGljIHZvaWQgdW5peF9kZ3JhbV9kaXNjb25uZWN0ZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqb3RoZXIpCiB7Ci0JaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgeworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpIHsKIAkJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJnVuaXhfc2soc2spLT5wZWVyX3dhaXQpOwogCkBAIC0xNjE5LDcgKzE2MTksNyBAQAogCWZvciAoOzspIHsKIAkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fAorCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpIHx8CiAJCSAgICBzay0+c2tfZXJyIHx8CiAJCSAgICAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSB8fAogCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwKZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvS2NvbmZpZyBiL25ldC93YW5yb3V0ZXIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGViZTFjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dhbnJvdXRlci9LY29uZmlnCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgQ29uZmlndXJhdGlvbiBmb3IgV0FOIHJvdXRlcgorIworCitjb25maWcgV0FOX1JPVVRFUgorCXRyaXN0YXRlICJXQU4gcm91dGVyIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKSwgc3VjaCBhcyBYLjI1LCBmcmFtZSByZWxheSBhbmQgbGVhc2VkCisJICBsaW5lcywgYXJlIHVzZWQgdG8gaW50ZXJjb25uZWN0IExvY2FsIEFyZWEgTmV0d29ya3MgKExBTnMpIG92ZXIgdmFzdAorCSAgZGlzdGFuY2VzIHdpdGggZGF0YSB0cmFuc2ZlciByYXRlcyBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuIHRob3NlCisJICBhY2hpZXZhYmxlIHdpdGggY29tbW9ubHkgdXNlZCBhc3luY2hyb25vdXMgbW9kZW0gY29ubmVjdGlvbnMuCisJICBVc3VhbGx5LCBhIHF1aXRlIGV4cGVuc2l2ZSBleHRlcm5hbCBkZXZpY2UgY2FsbGVkIGEgYFdBTiByb3V0ZXInIGlzCisJICBuZWVkZWQgdG8gY29ubmVjdCB0byBhIFdBTi4KKworCSAgQXMgYW4gYWx0ZXJuYXRpdmUsIFdBTiByb3V0aW5nIGNhbiBiZSBidWlsdCBpbnRvIHRoZSBMaW51eCBrZXJuZWwuCisJICBXaXRoIHJlbGF0aXZlbHkgaW5leHBlbnNpdmUgV0FOIGludGVyZmFjZSBjYXJkcyBhdmFpbGFibGUgb24gdGhlCisJICBtYXJrZXQsIGEgcGVyZmVjdGx5IHVzYWJsZSByb3V0ZXIgY2FuIGJlIGJ1aWx0IGZvciBsZXNzIHRoYW4gaGFsZgorCSAgdGhlIHByaWNlIG9mIGFuIGV4dGVybmFsIHJvdXRlci4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSBjYXJkcyBhbmQKKwkgIHdpc2ggdG8gdXNlIHlvdXIgTGludXggYm94IGFzIGEgV0FOIHJvdXRlciwgc2F5IFkgaGVyZSBhbmQgYWxzbyB0bworCSAgdGhlIFdBTiBkcml2ZXIgZm9yIHlvdXIgY2FyZCwgYmVsb3cuICBZb3Ugd2lsbCB0aGVuIG5lZWQgdGhlCisJICB3YW4tdG9vbHMgcGFja2FnZSB3aGljaCBpcyBhdmFpbGFibGUgZnJvbSA8ZnRwOi8vZnRwLnNhbmdvbWEuY29tLz4uCisJICBSZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dD4gZm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uLgorCisJICBUbyBjb21waWxlIFdBTiByb3V0aW5nIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdhbnJvdXRlci4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKaW5kZXggZDY4NDRhYy4uMTNiNjUwYSAxMDA2NDQKLS0tIGEvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKKysrIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKQEAgLTM1OCwxMCArMzU4LDEwIEBACiAgKi8KIAogCi11bnNpZ25lZCBzaG9ydCB3YW5yb3V0ZXJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorX19iZTE2IHdhbnJvdXRlcl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50IGNudCA9IHNrYi0+ZGF0YVswXSA/IDAgOiAxOwkvKiB0aGVyZSBtYXkgYmUgYSBwYWQgcHJlc2VudCAqLwotCXVuc2lnbmVkIHNob3J0IGV0aGVydHlwZTsKKwlfX2JlMTYgZXRoZXJ0eXBlOwogCiAJc3dpdGNoIChza2ItPmRhdGFbY250XSkgewogCWNhc2UgTkxQSURfSVA6CQkvKiBJUCBkYXRhZ3JhbW0gKi8KQEAgLTM3OSw3ICszNzksNyBAQAogCQkJCXNrYi0+ZGF0YVtjbnQrM10sIGRldi0+bmFtZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlldGhlcnR5cGUgPSAqKCh1bnNpZ25lZCBzaG9ydCopJnNrYi0+ZGF0YVtjbnQrNF0pOworCQlldGhlcnR5cGUgPSAqKChfX2JlMTYqKSZza2ItPmRhdGFbY250KzRdKTsKIAkJY250ICs9IDY7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9uZXQveDI1L0tjb25maWcgYi9uZXQveDI1L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3NTljOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC94MjUvS2NvbmZpZwpAQCAtMCwwICsxLDM2IEBACisjCisjIENDSVRUIFguMjUgUGFja2V0IExheWVyCisjCisKK2NvbmZpZyBYMjUKKwl0cmlzdGF0ZSAiQ0NJVFQgWC4yNSBQYWNrZXQgTGF5ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBYLjI1IGlzIGEgc2V0IG9mIHN0YW5kYXJkaXplZCBuZXR3b3JrIHByb3RvY29scywgc2ltaWxhciBpbiBzY29wZSB0bworCSAgZnJhbWUgcmVsYXk7IHRoZSBvbmUgcGh5c2ljYWwgbGluZSBmcm9tIHlvdXIgYm94IHRvIHRoZSBYLjI1IG5ldHdvcmsKKwkgIGVudHJ5IHBvaW50IGNhbiBjYXJyeSBzZXZlcmFsIGxvZ2ljYWwgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbnMKKwkgIChjYWxsZWQgInZpcnR1YWwgY2lyY3VpdHMiKSB0byBvdGhlciBjb21wdXRlcnMgY29ubmVjdGVkIHRvIHRoZSBYLjI1CisJICBuZXR3b3JrLiBHb3Zlcm5tZW50cywgYmFua3MsIGFuZCBvdGhlciBvcmdhbml6YXRpb25zIHRlbmQgdG8gdXNlIGl0CisJICB0byBjb25uZWN0IHRvIGVhY2ggb3RoZXIgb3IgdG8gZm9ybSBXaWRlIEFyZWEgTmV0d29ya3MgKFdBTnMpLiBNYW55CisJICBjb3VudHJpZXMgaGF2ZSBwdWJsaWMgWC4yNSBuZXR3b3Jrcy4gWC4yNSBjb25zaXN0cyBvZiB0d28KKwkgIHByb3RvY29sczogdGhlIGhpZ2hlciBsZXZlbCBQYWNrZXQgTGF5ZXIgUHJvdG9jb2wgKFBMUCkgKHNheSBZIGhlcmUKKwkgIGlmIHlvdSB3YW50IHRoYXQpIGFuZCB0aGUgbG93ZXIgbGV2ZWwgZGF0YSBsaW5rIGxheWVyIHByb3RvY29sIExBUEIKKwkgIChzYXkgWSB0byAiTEFQQiBEYXRhIExpbmsgRHJpdmVyIiBiZWxvdyBpZiB5b3Ugd2FudCB0aGF0KS4KKworCSAgWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgWC4yNSBhdCA8aHR0cDovL3d3dy5zYW5nb21hLmNvbS94MjUuaHRtPiBhbmQKKwkgIDxodHRwOi8vd3d3LmNpc2NvLmNvbS91bml2ZXJjZC9jYy90ZC9kb2MvcHJvZHVjdC9zb2Z0d2FyZS9pb3MxMS9jYm9vay9jeDI1Lmh0bT4uCisJICBJbmZvcm1hdGlvbiBhYm91dCBYLjI1IGZvciBMaW51eCBpcyBjb250YWluZWQgaW4gdGhlIGZpbGVzCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveDI1LnR4dD4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveDI1LWlmYWNlLnR4dD4uCisKKwkgIE9uZSBjb25uZWN0cyB0byBhbiBYLjI1IG5ldHdvcmsgZWl0aGVyIHdpdGggYSBkZWRpY2F0ZWQgbmV0d29yayBjYXJkCisJICB1c2luZyB0aGUgWC4yMSBwcm90b2NvbCAobm90IHlldCBzdXBwb3J0ZWQgYnkgTGludXgpIG9yIG9uZSBjYW4gZG8KKwkgIFguMjUgb3ZlciBhIHN0YW5kYXJkIHRlbGVwaG9uZSBsaW5lIHVzaW5nIGFuIG9yZGluYXJ5IG1vZGVtIChzYXkgWQorCSAgdG8gIlguMjUgYXN5bmMgZHJpdmVyIiBiZWxvdykgb3Igb3ZlciBFdGhlcm5ldCB1c2luZyBhbiBvcmRpbmFyeQorCSAgRXRoZXJuZXQgY2FyZCBhbmQgdGhlIExBUEIgb3ZlciBFdGhlcm5ldCAoc2F5IFkgdG8gIkxBUEIgRGF0YSBMaW5rCisJICBEcml2ZXIiIGFuZCAiTEFQQiBvdmVyIEV0aGVybmV0IGRyaXZlciIgYmVsb3cpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB4MjUuIElmIHVuc3VyZSwgc2F5IE4uCisKKwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0vS2NvbmZpZyBiL25ldC94ZnJtL0tjb25maWcKaW5kZXggNThjYTZhOS4uMGMxYzA0MyAxMDA2NDQKLS0tIGEvbmV0L3hmcm0vS2NvbmZpZworKysgYi9uZXQveGZybS9LY29uZmlnCkBAIC0xLDYgKzEsMTAgQEAKICMKICMgWEZSTSBjb25maWd1cmF0aW9uCiAjCitjb25maWcgWEZSTQorICAgICAgIGJvb2wKKyAgICAgICBkZXBlbmRzIG9uIE5FVAorCiBjb25maWcgWEZSTV9VU0VSCiAJdHJpc3RhdGUgIklQc2VjIHVzZXIgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UiCiAJZGVwZW5kcyBvbiBJTkVUICYmIFhGUk0KQEAgLTEwLDMgKzE0LDE0IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKK2NvbmZpZyBORVRfS0VZCisJdHJpc3RhdGUgIlBGX0tFWSBzb2NrZXRzIgorCXNlbGVjdCBYRlJNCisJLS0taGVscC0tLQorCSAgUEZfS0VZdjIgc29ja2V0IGZhbWlseSwgY29tcGF0aWJsZSB0byBLQU1FIG9uZXMuCisJICBUaGV5IGFyZSByZXF1aXJlZCBpZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSBJUHNlYyB0b29scyBwb3J0ZWQKKwkgIGZyb20gS0FNRS4KKworCSAgU2F5IFkgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKworCmRpZmYgLS1naXQgYS9zY3JpcHRzL0xpbmRlbnQgYi9zY3JpcHRzL0xpbmRlbnQKaW5kZXggMzRlZDc4NS4uN2Q4ZDg4OSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9MaW5kZW50CisrKyBiL3NjcmlwdHMvTGluZGVudApAQCAtMSwyICsxLDIgQEAKICMhL2Jpbi9zaAotaW5kZW50IC1rciAtaTggLXRzOCAtc29iIC1sODAgLXNzIC1uY3MgIiRAIgoraW5kZW50IC1ucHJvIC1rciAtaTggLXRzOCAtc29iIC1sODAgLXNzIC1uY3MgIiRAIgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCmluZGV4IDkwOGJmZjYuLjUxODA0MDUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYworKysgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNlbmRpZgogCisjaW5jbHVkZSA8Y3R5cGUuaD4KKwogdHlwZWRlZiB1aW50MzJfdAlfX3UzMjsKIHR5cGVkZWYgdWludDE2X3QJX191MTY7CiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIJX191ODsKQEAgLTMyMyw2ICszMjUsMjIgQEAKIAogCiAKK3N0YXRpYyBpbnQgZG9fb2ZfZW50cnkgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZiwgY2hhciAqYWxpYXMpCit7CisgICAgY2hhciAqdG1wOworICAgIHNwcmludGYgKGFsaWFzLCAib2Y6TiVzVCVzQyVzIiwKKyAgICAgICAgICAgICAgICAgICAgb2YtPm5hbWVbMF0gPyBvZi0+bmFtZSA6ICIqIiwKKyAgICAgICAgICAgICAgICAgICAgb2YtPnR5cGVbMF0gPyBvZi0+dHlwZSA6ICIqIiwKKyAgICAgICAgICAgICAgICAgICAgb2YtPmNvbXBhdGlibGVbMF0gPyBvZi0+Y29tcGF0aWJsZSA6ICIqIik7CisKKyAgICAvKiBSZXBsYWNlIGFsbCB3aGl0ZXNwYWNlIHdpdGggdW5kZXJzY29yZXMgKi8KKyAgICBmb3IgKHRtcCA9IGFsaWFzOyB0bXAgJiYgKnRtcDsgdG1wKyspCisgICAgICAgIGlmIChpc3NwYWNlICgqdG1wKSkKKyAgICAgICAgICAgICp0bXAgPSAnXyc7CisKKyAgICByZXR1cm4gMTsKK30KKwogLyogSWdub3JlIGFueSBwcmVmaXgsIGVnLiB2ODUwIHByZXBlbmRzIF8gKi8KIHN0YXRpYyBpbmxpbmUgaW50IHN5bV9pcyhjb25zdCBjaGFyICpzeW1ib2wsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC00MDEsNiArNDE5LDEwIEBACiAJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF9wY21jaWFfZGV2aWNlX3RhYmxlIikpCiAJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLCBzaXplb2Yoc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQpLAogCQkJIGRvX3BjbWNpYV9lbnRyeSwgbW9kKTsKKyAgICAgICAgZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF9vZl9kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIHNpemVvZihzdHJ1Y3Qgb2ZfZGV2aWNlX2lkKSwKKwkJCSBkb19vZl9lbnRyeSwgbW9kKTsKKwogfQogCiAvKiBOb3cgYWRkIG91dCBidWZmZXJlZCBpbmZvcm1hdGlvbiB0byB0aGUgZ2VuZXJhdGVkIEMgc291cmNlICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleXJpbmcuYyBiL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCmluZGV4IDkwYTU1MWUuLmExZjZiYWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAlpbnQgbG9vcCwgcmV0OwogCiAJY29uc3QgdW5zaWduZWQgbGltaXQgPQotCQkoUEFHRV9TSVpFIC0gc2l6ZW9mKCprbGlzdCkpIC8gc2l6ZW9mKHN0cnVjdCBrZXkpOworCQkoUEFHRV9TSVpFIC0gc2l6ZW9mKCprbGlzdCkpIC8gc2l6ZW9mKHN0cnVjdCBrZXkgKik7CiAKIAlyZXQgPSAwOwogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJCW1heCA9IGxpbWl0OwogCiAJCXJldCA9IC1FTk9NRU07Ci0JCXNpemUgPSBzaXplb2YoKmtsaXN0KSArIHNpemVvZihzdHJ1Y3Qga2V5KSAqIG1heDsKKwkJc2l6ZSA9IHNpemVvZigqa2xpc3QpICsgc2l6ZW9mKHN0cnVjdCBrZXkgKikgKiBtYXg7CiAJCWtsaXN0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFrbGlzdCkKIAkJCWdvdG8gZXJyb3I7CkBAIC0xNjMsNyArMTYzLDcgQEAKIAkJa2xpc3QtPm5rZXlzID0gc2tsaXN0LT5ua2V5czsKIAkJbWVtY3B5KGtsaXN0LT5rZXlzLAogCQkgICAgICAgc2tsaXN0LT5rZXlzLAotCQkgICAgICAgc2tsaXN0LT5ua2V5cyAqIHNpemVvZihzdHJ1Y3Qga2V5KSk7CisJCSAgICAgICBza2xpc3QtPm5rZXlzICogc2l6ZW9mKHN0cnVjdCBrZXkgKikpOwogCiAJCWZvciAobG9vcCA9IGtsaXN0LT5ua2V5cyAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQogCQkJYXRvbWljX2luYygma2xpc3QtPmtleXNbbG9vcF0tPnVzYWdlKTsKQEAgLTc4Myw3ICs3ODMsNyBAQAogCQlyZXQgPSAtRU5GSUxFOwogCQlpZiAobWF4ID4gNjU1MzUpCiAJCQlnb3RvIGVycm9yMzsKLQkJc2l6ZSA9IHNpemVvZigqa2xpc3QpICsgc2l6ZW9mKCprZXkpICogbWF4OworCQlzaXplID0gc2l6ZW9mKCprbGlzdCkgKyBzaXplb2Yoc3RydWN0IGtleSAqKSAqIG1heDsKIAkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCiAJCQlnb3RvIGVycm9yMzsKIApAQCAtODk1LDcgKzg5NSw4IEBACiAKIGtleV9pc19wcmVzZW50OgogCS8qIHdlIG5lZWQgdG8gY29weSB0aGUga2V5IGxpc3QgZm9yIFJDVSBwdXJwb3NlcyAqLwotCW5rbGlzdCA9IGttYWxsb2Moc2l6ZW9mKCprbGlzdCkgKyBzaXplb2YoKmtleSkgKiBrbGlzdC0+bWF4a2V5cywKKwlua2xpc3QgPSBrbWFsbG9jKHNpemVvZigqa2xpc3QpICsKKwkJCSBzaXplb2Yoc3RydWN0IGtleSAqKSAqIGtsaXN0LT5tYXhrZXlzLAogCQkJIEdGUF9LRVJORUwpOwogCWlmICghbmtsaXN0KQogCQlnb3RvIG5vbWVtOwpAQCAtOTA1LDEyICs5MDYsMTIgQEAKIAlpZiAobG9vcCA+IDApCiAJCW1lbWNweSgmbmtsaXN0LT5rZXlzWzBdLAogCQkgICAgICAgJmtsaXN0LT5rZXlzWzBdLAotCQkgICAgICAgbG9vcCAqIHNpemVvZihrbGlzdC0+a2V5c1swXSkpOworCQkgICAgICAgbG9vcCAqIHNpemVvZihzdHJ1Y3Qga2V5ICopKTsKIAogCWlmIChsb29wIDwgbmtsaXN0LT5ua2V5cykKIAkJbWVtY3B5KCZua2xpc3QtPmtleXNbbG9vcF0sCiAJCSAgICAgICAma2xpc3QtPmtleXNbbG9vcCArIDFdLAotCQkgICAgICAgKG5rbGlzdC0+bmtleXMgLSBsb29wKSAqIHNpemVvZihrbGlzdC0+a2V5c1swXSkpOworCQkgICAgICAgKG5rbGlzdC0+bmtleXMgLSBsb29wKSAqIHNpemVvZihzdHJ1Y3Qga2V5ICopKTsKIAogCS8qIGFkanVzdCB0aGUgdXNlcidzIHF1b3RhICovCiAJa2V5X3BheWxvYWRfcmVzZXJ2ZShrZXlyaW5nLApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eC5jIGIvc291bmQvb3NzL2NzNDZ4eC5jCmluZGV4IDllNDJhMWEuLmNiOTk4ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9jczQ2eHguYworKysgYi9zb3VuZC9vc3MvY3M0Nnh4LmMKQEAgLTQxNzQsNyArNDE3NCw3IEBACiAJCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQogCQkJCXsKIAkJCQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJCQkJY3M0Nnh4X3N1c3BlbmQoY2FyZCwgMCk7CisJCQkJCWNzNDZ4eF9zdXNwZW5kKGNhcmQsIFBNU0dfT04pOwogCQkJCX0KIAogCQkJfQpAQCAtNTc0OSw3ICs1NzQ5LDcgQEAKIAkJCWNhc2UgUE1fU1VTUEVORDoKIAkJCQlDU19EQkdPVVQoQ1NfUE0sIDIsIHByaW50ayhLRVJOX0lORk8KIAkJCQkJImNzNDZ4eDogUE0gc3VzcGVuZCByZXF1ZXN0XG4iKSk7Ci0JCQkJaWYoY3M0Nnh4X3N1c3BlbmQoY2FyZCwgMCkpCisJCQkJaWYoY3M0Nnh4X3N1c3BlbmQoY2FyZCwgUE1TR19TVVNQRU5EKSkKIAkJCQl7CiAJCQkJICAgIENTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTwogCQkJCQkiY3M0Nnh4OiBQTSBzdXNwZW5kIHJlcXVlc3QgcmVmdXNlZFxuIikpOwpAQCAtNTc3OSw3ICs1Nzc5LDcgQEAKIAlzdHJ1Y3QgY3NfY2FyZCAqcyA9IFBDSV9HRVRfRFJJVkVSX0RBVEEocGNpZGV2KTsKIAlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgMiwgCiAJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmRfdGJsIHJlcXVlc3RcbiIpKTsKLQljczQ2eHhfc3VzcGVuZChzLCAwKTsKKwljczQ2eHhfc3VzcGVuZChzLCBzdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9idDg3eC5jIGIvc291bmQvcGNpL2J0ODd4LmMKaW5kZXggZGVmZGM1YS4uYzU1NTdlYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2J0ODd4LmMKKysrIGIvc291bmQvcGNpL2J0ODd4LmMKQEAgLTc5OCwxMyArNzk4LDE1IEBACiAJezB4MjcwZiwgMHhmYzAwfSwgLyogQ2hhaW50ZWNoIERpZ2l0b3AgRFNULTEwMDAgRFZCLVMgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXI7CisKIC8qIHJldHVybiB0aGUgcmF0ZSBvZiB0aGUgY2FyZCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBpdCdzIGJsYWNrbGlzdGVkICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYnQ4N3hfZGV0ZWN0X2NhcmQoc3RydWN0IHBjaV9kZXYgKnBjaSkKIHsKIAlpbnQgaTsKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqc3VwcG9ydGVkOwogCi0Jc3VwcG9ydGVkID0gcGNpX21hdGNoX2RldmljZShzbmRfYnQ4N3hfaWRzLCBwY2kpOworCXN1cHBvcnRlZCA9IHBjaV9tYXRjaF9kZXZpY2UoJmRyaXZlciwgcGNpKTsKIAlpZiAoc3VwcG9ydGVkKQogCQlyZXR1cm4gc3VwcG9ydGVkLT5kcml2ZXJfZGF0YTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggMmQ0ZjhlMi4uZDY5MThiNCAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CiAjaW5jbHVkZSAicGRhdWRpb2NmLmgiCkBAIC0xNzEsMTQgKzE3MCw2IEBACiAKIAkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0gCi0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMCi0jaWZkZWYgQ09ORklHX1BNCi0JCXwgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUCi0JCXwgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRQotI2VuZGlmCi0JCTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcGRhY2ZfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTM4NywxMiArMzc4LDEzIEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgc25kX3BkYWNmX2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBwZGFjZl9jc19kcml2ZXIgPSB7Ci0JLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLmRydiAgICAgICAgICAgID0gewotCQkubmFtZSAgID0gInNuZC1wZGF1ZGlvY2YiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAic25kLXBkYXVkaW9jZiIsCiAJfSwKLQkuYXR0YWNoICAgICAgICAgPSBzbmRfcGRhY2ZfYXR0YWNoLAotCS5kZXRhY2ggICAgICAgICA9IHNuZF9wZGFjZl9kZXRhY2gsCisJLmF0dGFjaAkJPSBzbmRfcGRhY2ZfYXR0YWNoLAorCS5ldmVudAkJPSBwZGFjZl9ldmVudCwKKwkuZGV0YWNoCQk9IHNuZF9wZGFjZl9kZXRhY2gsCiAJLmlkX3RhYmxlCT0gc25kX3BkYWNmX2lkcywKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjbWNpYS92eC92eF9lbnRyeS5jIGIvc291bmQvcGNtY2lhL3Z4L3Z4X2VudHJ5LmMKaW5kZXggMzMyYmJjYS4uZGY3YTM5YiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3Z4L3Z4X2VudHJ5LmMKKysrIGIvc291bmQvcGNtY2lhL3Z4L3Z4X2VudHJ5LmMKQEAgLTM1LDcgKzM1LDYgQEAKICAqIHByb3RvdHlwZXMKICAqLwogc3RhdGljIHZvaWQgdnhwb2NrZXRfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOwotc3RhdGljIGludCB2eHBvY2tldF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CiAKIAogc3RhdGljIHZvaWQgdnhwb2NrZXRfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQpAQCAtMTY5LDE0ICsxNjgsNiBAQAogCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLwogCW1lbXNldCgmY2xpZW50X3JlZywgMCwgc2l6ZW9mKGNsaWVudF9yZWcpKTsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gaHctPmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0gCi0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMCi0jaWZkZWYgQ09ORklHX1BNCi0JCXwgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUCi0JCXwgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRQotI2VuZGlmCi0JCTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmdnhwb2NrZXRfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTMyMSw3ICszMTIsNyBAQAogLyoKICAqIGV2ZW50IGNhbGxiYWNrCiAgKi8KLXN0YXRpYyBpbnQgdnhwb2NrZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCitpbnQgdnhwb2NrZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCiB7CiAJZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOwogCXZ4X2NvcmVfdCAqY2hpcCA9IGxpbmstPnByaXY7CkBAIC0zODAsNCArMzcxLDUgQEAKICAqLwogRVhQT1JUX1NZTUJPTChzbmRfdnhwb2NrZXRfb3BzKTsKIEVYUE9SVF9TWU1CT0woc25kX3Z4cG9ja2V0X2F0dGFjaCk7CitFWFBPUlRfU1lNQk9MKHZ4cG9ja2V0X2V2ZW50KTsKIEVYUE9SVF9TWU1CT0woc25kX3Z4cG9ja2V0X2RldGFjaCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCmluZGV4IDVmNGMxMzIuLjYyZDZmYTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSAidnhwb2NrZXQuaCIKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAK